2014-11-24 103 views
1

我有這個計劃,旨在測試兩件事情:如何打印出由char指針指向的字符串?

  1. 一旦分配,一個字符串不能被分配到另一個字符串。
  2. 但是,兩個char指針可以指向同一個字符串。

//計劃 -

#include <stdio.h> 
#include <string.h> 
int main(int argc, char const *argv[]) 
{ 
    char str[]="hello"; 
    char str2[10]; 
    int i=0; 
    char *s="Good"; 
    char *p; 

    //error 
    //str=str2; 
    printf("String str2: %s\n", str); 
    //no error 
    p=s; 
    //printf("String pointed to by p: %s\n", *p); 
    while(*s!='\0') 
    { 
     printf("%c", s[i]); 
     s++; 
     i++; 

    } 
    printf("\n"); 
    return 0; 
} 

我得到一個垃圾值,當我打印出來的內容 「好」。任何其他詞都一樣。 while循環出錯了嗎?字符串Good在在第一次迭代,i == 0sG

+4

's ++;我++;'移動是重複的。刪除'i ++;' – BLUEPIXY 2014-11-24 12:42:03

+0

你爲什麼需要'char * p'? – Gopi 2014-11-24 12:49:45

+0

無關,但您有一些未使用的變量 – 2014-11-24 14:30:47

回答

2

你增加兩個數組的索引和指針s。在第二次迭代中,s指向第一個oi == 1,因此s[i]是第二個o,這可能不是您想要的。

如果您註釋掉i++,一切都將工作打算:http://ideone.com/7zUOfM

+0

感謝您的解釋。儘管代碼適用於刪除i ++,但我不確定自己完全理解。就像你說的,在第一次迭代中,我是零,並且s指向字符「G」。在第二次迭代中,i是1,所以s [1]應該指向字符「O」 - 意味着第一個O,因爲它是字符串中的第二個元素。那麼,它爲什麼指向第三個元素,即:第二個「O」?它看起來不同於使用整數/浮點的指針運算! – 2014-11-25 05:54:26

+0

因爲通過's ++'增加's',你將指針's'移動一個字符到右邊。實際上,對於任何指針,'*(s + i)'和's [i]'是等價的。 – Phillip 2014-11-25 07:11:02

2

在這個循環中

while(*s!='\0') 
{ 
    printf("%c", s[i]); 
    s++; 
    i++; 

} 

你同時遞增指數i

i++; 

和指針字符串文字

s++; 

因此,這會導致一些垃圾,因爲s[i]某些is增加後會訪問超出字符串文字的內存。

您應該只增加索引i或相應的指針。例如,你可以簡單地寫

while (*p) printf("%c", *p++); 
+0

謝謝!你的最後一行代碼很容易理解! – 2014-11-25 05:55:01

+0

@管理我雖然簡單的代碼很容易理解它:) – 2014-11-25 05:58:48