我得到一個字串和一個從輸入讀取的scanf,直到找到一個*,這是我為文本結尾選擇的字符。在 * 之后,所有剩余的單元格都被隨機字符填充。我知道 \0 字符之后的字串如果沒有完全填充,直到最后一個單元格將用 \0 填充所有剩余的空字符,為什么不是這種情況,我怎樣才能使它在輸入中給出的最后一個字母之后所有剩余的單元格的值都相同嗎?
char string1 [100];
scanf("%[^*]s", string1);
for (int i = 0; i < 100; i) {
printf("\n %d=%d",i,string1[i]);
}
如果我嘗試輸入 hello* 之類的內容,輸出如下:
0=104
1=101
2=108
3=108
4=111
5=0
6=0
7=0
8=92
9=0
10=68
uj5u.com熱心網友回復:
你有一個未初始化的陣列:
char string1 [100];
具有不確定的值。您可以像這樣初始化陣列
char string1 [100] = { 0 };
或者
char string1 [100] = "";
在這次通話中
scanf("%[^*]s", string1);
您需要洗掉尾隨字符s,因為%[]和%s是不同的格式說明符。沒有%[]s格式說明符。它應該如下所示:
scanf("%[^*]", string1);
該陣列包含一個以零字符結尾的字串'\0'。
所以要輸出你應該寫的字串,例如
for ( int i = 0; string1[i] != '\0'; i) {
printf( "%c", string1[i] ); // or putchar( string1[i] );
putchar( '\n' );
或喜歡
for ( int i = 0; string1[i] != '\0'; i) {
printf("\n %d=%c",i,string1[i]);
putchar( '\n' );
要不就
puts( string1 );
至于你的說法
printf("\n %d=%d",i,string1[i]);
然后由于使用轉換說明符d而不是c. 那就是函式輸出字符的內部 ASCII 表示。
uj5u.com熱心網友回復:
我知道 \0 字符之后的字串如果沒有完全填充,直到最后一個單元格將用 \0 填充所有剩余的空字符
不,那不是真的。這不可能是真的:字串沒有長度。編譯器和任何函式都無法知道字串的大小。只有你這樣做。所以,不,字串不要自動填充 '\0'
請記住,C 中沒有任何字串型別。只是指向字符的指標(有時這些指標是指向陣列的常量指標,但它們仍然只是指標。我們知道它們從哪里開始,但沒有辦法(其他而不是決定它并在編碼時保持一致)知道它們在哪里停止。
當然,大多數時候,有一個顯而易見的答案,對于代碼的任何讀者來說,分配記憶體的大小是顯而易見的。
例如,當您撰寫代碼時
char string1[20];
sprintf(string1, "hello");
對于該代碼的讀者來說,很明顯分配的記憶體是 20 位元組。因此,您可能認為編譯器應該知道,在 sscaning 沖刺到它時,它應該用 0 填充 20 個位元組中未使用的部分。但是,首先,當您將 sscanf 或沖刺。這發生在運行時,編譯器在編譯時。在運行時,沒有那個20.
另外,它可能比這更復雜
void fillString(char *p){
sprintf(p, "hello");
}
int main(){
char string1[20];
string1[0]='O';
string1[1]='t';
fillString(&(string1[2]));
}
在這種情況下,sprintf應該如何知道它必須用字串填充 18 個位元組,然后是 '\0'?
那是為了正常使用。我還沒有開始使用復雜但合法的用法。例如用作50 個長度為 20 的字串 ( , , , ...)char buffer[1000];的陣列或類似的東西bufferbuffer 20buffer 40
union {
char str[40];
struct {
char substr1[20];
char substr2[20];
} s;
}
所以,不,字串不是用 '\0' 填充的。事實并非如此。在 C 語言中不習慣在幕后發生隱含的事情。即使我們愿意,情況也并非如此。
您的“以星號結尾的字串”的行為與“以空結尾的字串”完全相同。有時分配的記憶體的其余部分是 0,有時不是。scanf不會觸及任何其他嚴格需要的東西。其余分配的記憶體保持不變。如果在呼叫 之前,該記憶體恰好充滿了 '\0' scanf,那么它仍然如此。否則不行。這引出了我的最后一句話:你似乎相信它是scanf用非空字符填充記憶體。它不是。那些字符之前就已經存在了。如果你覺得其他一些方法用 '\0' 填充剩余的記憶體,那只是一種印象(很自然,因為大多數時候,新分配的記憶體是 0。不是因為規則這么說。但是因為這是在記憶體的隨機區域中最常見的位元組。這就是未初始化變數錯誤如此痛苦的原因:它們只是偶爾發生,因為很多時候未初始化的變數是 0,只是偶然的,但它們仍然是)
uj5u.com熱心網友回復:
創建歸零陣列的最簡單方法是使用 calloc。嘗試替換 char string1 [100]; with char *string1=calloc(1,100);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/531006.html
標籤:数组C初始化打印c字符串
上一篇:Javscript/TypeScript:查找鍵并將值附加為陣列
下一篇:我無法向動態陣列添加新元素
