main()
{
char *x="girl";
int n,i;
n=strlen(x);
*x=x[n];
for(i=0;i<n;i++)
{
printf("%s \n",x);
x++;
}
}
什麼是輸出?
請解釋輸出.......................
O/P是:C,指針,字符串
irl
rl
l
main()
{
char *x="girl";
int n,i;
n=strlen(x);
*x=x[n];
for(i=0;i<n;i++)
{
printf("%s \n",x);
x++;
}
}
什麼是輸出?
請解釋輸出.......................
O/P是:C,指針,字符串
irl
rl
l
正如其他人指出的那樣,編寫的程序具有未定義的行爲。
如果你做一個小的改動:
char x[] = "girl";
那麼我相信它是合法的,並可能解釋。 (編輯:其實還是有它的問題這是int main()
,你應該return 0;
在年底也因爲你使用strlen
需要#include <string.h>
,並#include <stdio.h>
因爲您正在使用printf
。)
線
套x[0]
(即*x
)至x[4]
(這恰好是一個字符串結束'\0'
)。因此,要打印的第一個字符串是空字符串,因爲第一個字符是字符串終止符。
然後我們通過串循環,一次一個字符,打印字符串:
irl
rl
l
非常感謝... – Adi 2011-05-07 14:18:59
雖然結果是不確定的行爲,如DeadMG說,讓我們假設你聲明x作爲char x[] = "girl"
。
分配4 n
(因爲單詞「女孩」的長度4),你在x[4]
分配值*x
(這是x[0]
),但這個值是「\ 0」(空終結符)
現在,您循環並打印x到下一個空終止符的單詞,但第一次,第一個字符是空終止符,因此您什麼都得不到。之後,您將從遞增索引打印單詞。
g i r l \0
*x = x[4]:
\0 i r l \0
^ ^^^
it1 it2 it3 it4 // << Where does x points to in each iteration of the for loop
該代碼是令人懷疑的懷疑。 *x=x[n]
試圖覆蓋文字「女孩」,並且效果會因平臺和編譯器而異。更準確地說,它應該被聲明爲:
const char *x = "girl";
然後它不會(不應該)編譯。
更準確地說,他應該讓它安全地修改字符串,而不是通過使字符串編譯器的原始非可變性被檢查來強制他的整個程序中斷。 – 2011-05-07 14:20:24
咦?如何編寫無法編譯的代碼更爲正確? – 2011-05-07 14:21:03
@Simon:它是「更正確的」,它不會允許他修改字符串; IOW,編譯器會爲他捕捉這些錯誤。 – 2011-05-07 15:48:28
結果= UB =未定義行爲(u)r – 2011-05-07 14:03:22
將'char * x'更改爲'char x []'以避免未定義的行爲。 – hugomg 2011-05-07 14:04:33
@missingno:代碼中存在更多的UB問題;修改字符串文字並不是孤立的 – pmg 2011-05-07 14:10:01