#include<stdio.h>
int main()
{
char main[]="Structured Programming";
char copy[30];
for (int i = 0; main[i] !='\0' ; i )
{
copy[i]=main[i];
}
printf("%s",copy);
}
在上述問題中,這應該列印Structured Programming,但我得到了Structured Programming a,這發生在所有 ide 上,但不是在在線編譯器上,在線編譯器作業正常,誰能告訴我原因?
uj5u.com熱心網友回復:
有時“未定義的行為”意味著它似乎有效。您可以初始化copy,或簡單地復制 NUL:
i = 0;
do {
copy[i] = main[i];
} while (main[i ]);
uj5u.com熱心網友回復:
這個for回圈
for (int i = 0; main[i] !='\0' ; i )
{
copy[i]=main[i];
}
不復制陣列中'\0'存盤的源字串的終止零字符。maincopy
所以陣列copy不包含字串。但是轉換規范%s需要一個對應的引數,它是一個指向字串的指標。因此這個呼吁printf
printf("%s",copy);
呼叫未定義的行為。
有幾種方法可以解決問題。
例如,您最初可以將陣列初始化為零,copy例如
`char copy[30] = ""`;
另一種方法是復制'\0'目標陣列中的終止零字符,例如
for ( int i = 0; ( cooy[i] = main[i] ) !='\0' ; i );
或者您可以在呼叫中輸出指定精度欄位的陣列printf,例如
int i = 0;
for ( ; main[i] !='\0' ; i )
{
copy[i] = main[i];
}
printf( "%.*s\n", i, copy );
請注意,您可以使用在標頭中宣告的標準函式,而不是手動撰寫的forstrcpy回圈<string.h>
#include <string.h>
//...
puts( strcpy( copy, main ) );
uj5u.com熱心網友回復:
printf函式需要列印以 NULL 結尾的字串。否則,您的程式可能會訪問您不想訪問的額外位元組字串。這取決于環境和編譯器如何對這種情況做出反應,但通常它是未定義的行為。您應該使字串的最后一個符號等于'\0'修復它。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/532065.html
上一篇:我將此forEach代碼轉換為for回圈,但代碼不起作用
下一篇:Python中的“繼續”功能
