2016-11-05 73 views
0

我有一個tolower函數的問題。試圖與argv一起使用它,但輸出爲$ 0 @。我的代碼有什麼問題?tolower函數的錯誤輸出

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

void makeLower(char *s) { 
    int i; 
    for(i = 0; s[i] != '\0'; i++){ 
     s[i] = tolower(s[i]); 
     } 
     printf("%s", s); 
} 

int main(int argc, char *argv[]) { 
    argv[0]="A"; 

    makeLower(argv); 
    return 0; 
} 
+2

你不能可靠地寫入字符串文字;當你這樣做的時候你會調用未定義的行爲。改變'main()'爲'int main(void){char str [] =「A」; makeLower(STR);返回0; ''例如。你應該在'printf()'中添加一個換行符;你可能應該在'main()'函數中打印,而不是(不再是通用的)實用函數。從技術上講,你應該傳遞一個'int',它包含一個'unsigned char'或者EOF到'tolower()'(通常通過'tolower((unsigned char)s [i])'來實現)。但是,你不會遇到'A'的問題。 –

+1

也許你的誤解已經是你嘗試給'argv [0]'分配一些東西。這些應該包含來自你的環境的信息,特別是'argv [0]'應該是你的編譯程序的名字。如果你只是運行它而沒有賦值給「A」,那麼所有的工作都可以正常工作,argv指向的字符串是可以修改的。 –

回答

0

argv是一個指向指針,這是一個char**。但該功能需要char*。所以,你需要通過這樣的:

makeLower(argv[0]); 

但是,這是行不通的,因爲argv[0]現在指向一個字符串。修改字符串文字是undefined

而是傳遞一個修改的陣列,如:

int main(int argc, char *argv[]) { 
    char arr[] = "A"; 

    makeLower(arr); 
    return 0; 
} 

其他選項是使傳遞的字符串字面的副本(通過argv[0]),然後你就可以對其進行修改。基本上,這個想法是,你不能在法律上修改C中的字符串文字。