2011-05-07 221 views
0
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 
+2

結果= UB =未定義行爲(u)r – 2011-05-07 14:03:22

+0

將'char * x'更改爲'char x []'以避免未定義的行爲。 – hugomg 2011-05-07 14:04:33

+0

@missingno:代碼中存在更多的UB問題;修改字符串文字並不是孤立的 – pmg 2011-05-07 14:10:01

回答

1

正如其他人指出的那樣,編寫的程序具有未定義的行爲。

如果你做一個小的改動:

char x[] = "girl"; 

那麼我相信它是合法的,並可能解釋。 (編輯:其實還是有它的問題這是int main(),你應該return 0;在年底也因爲你使用strlen需要#include <string.h>,並#include <stdio.h>因爲您正在使用printf。)

​​

x[0](即*x)至x[4](這恰好是一個字符串結束'\0')。因此,要打印的第一個字符串是空字符串,因爲第一個字符是字符串終止符。

然後我們通過串循環,一次一個字符,打印字符串:

irl 
rl 
l 
+0

非常感謝... – Adi 2011-05-07 14:18:59

4

的輸出是不確定的行爲。你修改了一個字符串文字。

+0

:).....好的char * x =「hello」; – Adi 2011-05-07 14:05:03

+0

...並且在範圍內沒有原型調用可變參數函數;並沒有從'main'返回一個值(因爲C99禁止隱式的'int',所以代碼不是C99(它會接受一個沒有返回的main)。 – pmg 2011-05-07 14:07:06

+1

@Adi:你只改變了字符串中的單詞。這不會改變UB。 – 2011-05-07 14:18:48

1

雖然結果是不確定的行爲,如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 
0

該代碼是令人懷疑的懷疑。 *x=x[n]試圖覆蓋文字「女孩」,並且效果會因平臺和編譯器而異。更準確地說,它應該被聲明爲:

const char *x = "girl"; 

然後它不會(不應該)編譯。

+0

更準確地說,他應該讓它安全地修改字符串,而不是通過使字符串編譯器的原始非可變性被檢查來強制他的整個程序中斷。 – 2011-05-07 14:20:24

+0

咦?如何編寫無法編譯的代碼更爲正確? – 2011-05-07 14:21:03

+0

@Simon:它是「更正確的」,它不會允許他修改字符串; IOW,編譯器會爲他捕捉這些錯誤。 – 2011-05-07 15:48:28