2014-02-26 36 views
0

我有這種很簡單的C,僅僅必須回聲值x數組內,令人驚訝的代碼的可變的內部輸出打印值,它也呼應陣列y內的值...C:未呼應

#include <iostream.h> 
#include <conio.h> 
#include <string.h> 

int  i; 
char x[3]={'a','b','c'}, 
     y[3][2]={ 
      {'a','A'}, 
      {'b','B'}, 
      {'c','C'}}; 
void main(){ 
    clrscr(); 
    while(i<strlen(x)) cout << x[i++] << endl; 
    getch(); 
} 

輸出:

a 
b 
c 
a 
A 
b 
B 
c 
C 

很明顯,第3個字符是那些我真的打算呼應......
但如何從陣列y那些以下字符?

+6

'x'和'y'都不以null結尾。使用'strlen'是未定義的行爲。 – 0x499602D2

+0

哦,我看到'strlen'適用於以空字符結尾的數組,這是字符串... – 707

回答

7

變量x不是字符串,調用strlen()就會導致未定義的行爲。

訪問超出數組的範圍x也會導致未定義的行爲。

您需要:

const char *x = "abc"; 

,使之成爲有效的字符串(即由'\0'終止),或:

const char x[] = { 'a', 'b', 'c', '\0' }; 

但這是更詳細的,爲什麼不會做這樣的說法?如果你的意思是一個字符串(和你一樣),把它寫成一個字符串。

你當然也可以走另一條路過了,說:「這是一個字符數組,而不是一個字符串」,但你不能使用strlen()這需要一個字符串:

const char x[] = { 'a', 'b', 'c' }; 

for(size_t i = 0; i < sizeof x/sizeof *x; ++i) 
    printf("%c\n", x[i]); 
+0

另一件事,如果我沒有錯'x [4]'應該是'\ 0'那麼爲什麼它會打印'來自'y [0] [0]'的'a? – 707

+0

@Daniel字符數組不會自動終止。 'x [3]'(不是'x [4]')不存在,忘記等於'\ 0'。 – jerry

+0

是的,對不起,我的意思是'x [3]',順便說一句,你的意思是我的'x'數組在'x [3]'處沒有'\ 0'? – 707

0

的strlen( x)將返回9或更多,它依賴於何時找到字符串'\ 0'的結尾字符,因此cout會將數據從數組x的內存中輸出。你可以檢查內存,並一步步調試它。

0

只需將strlen更改爲sizeof即可。爲什麼?

  • 陣列並不自動與終止空字符\0
  • strlen函數計算的偏移地址,直到\0
  • 使用sizeof WIL從而計數獲分配用於一個特定的陣列大小結束

strlen(x)函數應該計數直到找到\0,並且在此代碼中,它沒有。