2010-11-01 196 views
0
#include <stdio.h> 
#include <stdlib.h> 

int main(void) 
{ 
    char *abc = "abc"; 
    char *new_str; 
    new_str = getStr(&abc); 
    printf("%s", abc); 
} 

char *getStr(char *str) 
{ 
    printf(str); 
    return str; 
} 

上面的代碼有什麼問題?c傳遞一個字符串到函數然後返回一個字符串

+4

,請注意編譯器警告!如果編譯器沒有給出,要麼找出如何打開它們或獲得更好的編譯器。 – 2010-11-01 01:50:56

回答

2

C字符串是一個指向字符的指針,該字符開始以空字節結尾的字符序列。變量abc完全符合這個定義。

另外,abc是指向字符的類型指針。您正在傳遞abc的地址,即getStr將接收指向某個字符的指針的地址 - 所以getStr的唯一參數應該是指向指向字符的指針的類型指針。類型不匹配。

編輯:另外,getStr被聲明之前被調用。您的編譯器可能會允許這樣做,但由於很多原因,這是不好的做法。您應該在使用它之前聲明它或定義它。如果你正在使用gcc作爲您的編譯器,始終使用

gcc -ansi -Wall -pedantic 

這三個標誌將符合ANSI標準,它要麼罵你了上述問題或無法編譯。

+0

這不是作業,我正在寫一些學習腳本c – friends 2010-11-01 01:53:24

+0

我的歉意。這聽起來就像是一個家庭作業問題。 – Kizaru 2010-11-01 01:55:06

0

你的getStr函數接受一個char *,但這不是你傳遞它的東西 - 你傳遞指針的地址,而不是傳遞實際的指針。

變化:

new_str = getStr(&abc); 

到:

new_str = getStr(abc); 

,我認爲它會工作。

6

一堆的小東西:

  1. 你傳遞給&abcgetStr()&abc是指向變量的指針,它包含您的字符串。它的類型是一個指向指針的指針,並且與getStr()的參數char *str不兼容。

  2. 您的getStr()是在使用後定義的。您可能需要將其定義移至main()之前或在main()之前添加原型。

  3. 像​​這樣的字符串文字的類型是const char *。你正在定義一個類型爲char *的變量,這是可疑的(因爲它允許你修改字符串,這是不允許的)。

+0

點3在C中並不真實,但無論如何它都是很好的風格。 – schot 2010-11-01 07:01:17

3

這裏是一個工作版本:

#include <stdio.h> 
#include <stdlib.h> 

char *getStr(char *str); 

int main(void) 
{ 
    char *abc = "abc"; 
    char *new_str; 
    new_str = getStr(abc); 
//printf("%s", *abc); don't really need this 
} 

char *getStr(char *str) { 
printf("%s", str); 
return str; 
} 

這裏的問題與舊的名單:

  1. 沒有原型的功能getStr。
  2. 你不能做printf(str)你需要一個「%s」作爲附加的參數。
  3. 你需要改變:new_str = getStr(& ABC)以new_str = getStr(ABC)
+0

+1爲printf()診斷 - 我刪除了我剛剛指出的答案。 – 2010-11-01 01:57:28

+0

'char * abc =「abc」;'實際上應該是'const char'。 – 2010-11-01 02:28:20

+0

你可以做'printf(str);'這當然是一個壞主意,但編譯器會讓你這樣做。 – JeremyP 2010-11-01 10:02:18

相關問題