我想列印出一個包含 mips 暫存器的二維字符陣列。我想分別列印每個暫存器。但是我當前的代碼將所有暫存器一起列印出來。有沒有更好的方法來解決這個問題,比如使用字符的雙指標陣列?
My code so far:
char reg[][3] = {
{'$', 's', '0'},
{'$', 's', '1'},
{'$', 's', '2'},
{'$', 's', '3'},
{'$', 's', '4'},
{'$', 's', '5'},
{'$', 's', '6'},
};
int main(void){
for(int i = 0; i < sizeof(reg); i )
{
printf("%s\n", reg[i]);
}
return 0;
}
My output:
$s0$s1$s2$s3$s4$s5$s6
$s1$s2$s3$s4$s5$s6
$s2$s3$s4$s5$s6
$s3$s4$s5$s6
$s4$s5$s6
$s5$s6
$s6
But I want my output to be like this:
$s0
$s1
$s2
$s3
$s4
$s5
$s6
uj5u.com熱心網友回復:
首先,將暫存器名稱視為字串可能更容易(即,以 a 結尾的字符陣列\0),特別是因為您使用的%s是列印出字串(說明%s符需要以 NUL 結尾的字符陣列)。因此,您希望二維reg陣列的第二維為4,以保持\0:
char reg[][4] = {
{'$', 's', '0', '\0'},
{'$', 's', '1', '\0'},
{'$', 's', '2', '\0'},
{'$', 's', '3', '\0'},
{'$', 's', '4', '\0'},
{'$', 's', '5', '\0'},
{'$', 's', '6', '\0'}
};
或者,您可以直接將這些寫為字串:
char reg[][4] = {
"$s0",
"$s1",
"$s2",
"$s3",
"$s4",
"$s5",
"$s6"
};
現在進入回圈。的sizeof(reg)在回圈條件為您提供了2D陣列的大小(以位元組為單位)reg,其是7×4 = 28。
您真正想要回圈的是二維陣列中的行數。在您的情況下,由于每個暫存器名稱的大小為 4(請記住包含 NUL 終止符!),您可以執行以下操作:
for(int i = 0; i < sizeof(reg)/4; i )
{
printf("%s\n", reg[i]);
}
uj5u.com熱心網友回復:
發生這種情況是因為在 C 中,字串按照慣例以空字符結尾。這意味著使用 %s 說明符呼叫的 printf 在到達空字符之前不會停止。
為了在不更改大部分代碼的情況下獲得所需的輸出,您可以像這樣在每個暫存器的末尾添加一個空字符
char reg[][4] = {
{'$', 's', '0', 0},
{'$', 's', '1', 0},
{'$', 's', '2', 0},
{'$', 's', '3', 0},
{'$', 's', '4', 0},
{'$', 's', '5', 0},
{'$', 's', '6', 0}
};
但這不是很漂亮。你可以這樣寫:
char reg[][4] = {"$s0", "$s1", "$s2", "$s3", "$s4", "$s5", "$s6"};
默認情況下,這些字串將以空字符結尾。
在不更改陣列的情況下執行此操作的另一種方法是指定每次列印呼叫要列印的字符數,如下所示:
printf("%.3s\n", reg[i]);
編輯:正如 ice05 的回答所指出的,您的回圈條件也是錯誤的。此代碼可能會生成分段錯誤。在 C 中處理這種情況的常用方法是使用前處理器宏,例如:
#define REGISTER_STRING_SIZE 3
char reg[][REGISTER_STRING_SIZE] = {
{'$', 's', '0'},
{'$', 's', '1'},
{'$', 's', '2'},
{'$', 's', '3'},
{'$', 's', '4'},
{'$', 's', '5'},
{'$', 's', '6'},
};
然后在你的回圈中,
for(int i = 0; i < sizeof(reg)/REGISTER_STRING_SIZE; i )
{
printf("%.3s\n", reg[i]);
}
這不是很優雅,我建議將暫存器視為字串(添加空終止符)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/356305.html
上一篇:對比Rust和C的性能,這是編譯程序的問題嗎?[復制]
下一篇:使用緩沖區洗掉字串中的重復項
