2014-01-11 85 views
-1

對於很多人來說,這是一個簡單的函數,但作爲一名初學者,我還沒有克服指向特殊字符串的指針。我理解strcmp,strcpy,strlen的一些例子,以及如何使用NULL終止符在內存中分配字符。我想我也明白了內存中的指針變量如何指向int var或char等的地址,並且通過將它們解引用到var/char來分配它們,但是每當我嘗試寫入代碼時,指針ghost都會來回來咬我。 所以,在這裏我試圖運行這個並不起作用。我會很感激,如果你能澄清這對我來說...將字符串作爲指針傳遞給函數

//GETNAME function should return a string that is not NULL and less than 20 characters 

char getname (char *s1) 
{ 
int i, n; 
char s2[i]; 
printf ("Enter your name:"); 
scanf ("%s", "s2"); 

if (s2 == NULL) 
    return 0; 

else if(n<20) 

for (i=0, n =strlen (s2 + 1); i<n; i++) 

*(s1+i) = s2[i]; //copy characters from s2 and point to chars of s1 

return *s1; 
} 

int main (int argc, char *argv[]) 

{  
    char name[20]; 
    char urname; 

    urname = getname(name); 

    printf (" Your name is : %s\n", urname); 

    getch(); 

return NULL; 
} 
+1

定義「不工作」。我們不知道這應該做什麼,我們不能被迫爲您調試代碼。 – 2014-01-11 20:34:32

+0

請給它加上標籤C. – user2672165

+2

看起來你想'scanf(「%s」,s2);'而不是'scanf(「%s」,「s2」);' – Lee

回答

3

這裏有幾個錯誤;可能會有更多:

  1. 未初始化的變量:

    int i, n; 
    char s2[i]; 
    

    i這裏沒有初始化,但你使用它,彷彿它是。 i應該有什麼價值?像這樣,這是未定義的行爲。

  2. 不正確的參數scanf

    scanf ("%s", "s2"); 
    

    第二個參數應該是一個指針到您想要輸入要寫入,而不是一個常量字符串的內存。它應該是:

    scanf ("%s", s2); 
    
  3. 不正確的參數strlen

    for (i=0, n =strlen (s2 + 1); i<n; i++) 
    

    您要添加1字符串長度不字符串本身,所以它應該是

    for (i=0, n = strlen(s2) + 1; i<n; i++) 
    
  4. getname的常見問題,包括退貨類型:

    char getname (char *s1) 
    

    爲什麼這個功能如此複雜?您可以直接將scanf納入參數s1。任何事情你都不需要s2。返回類型也是錯誤的。你返回一個指針,而不是一個char。它應該是:

    char* getname(char *s1) 
    
  5. 不處理返回值從getname正確:

    char urname; 
    urname = getname(name); 
    

    getname返回字符指針,而不是單個字符。它應該是:

    char* urname; 
    urname = getname(name); 
    
+0

感謝您的回覆;我試圖自己學習,我發現我缺乏一些基礎知識......我想我需要學習更多的基礎知識,並在編寫函數之前先解決一些問題。真心感謝! –

0

由於以前的帖子說,i將不會被初始化。

還行

scanf("%s", "s2"); 

應該

scanf("%s", s2); 

線條

if (s2 == NULL) 
    return 0; 

else if(n<20) 

是不正確的s2不會是NULL和n將不會被初始化

...這是對於初學者

我建議你一本書,讀它

+0

Thanx!現在購買一本書... –