2016-11-05 19 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()'関数で印刷するべきでしょう。技術的には、 'unsigned char'か' tolower() '(通常は' tolower(unsigned char)s [i]) 'によって実現される)を含む' int'を渡すべきです。しかし、あなたは 'A'で問題に遭遇することはありません。 –

+1

あなたの誤解はすでに 'argv [0]'に何かを割り当てようとしていることでしょう。これらはあなたの環境からの情報を含んでいるはずです。特に、 'argv [0]'はコンパイルされたプログラムの名前でなければなりません。 '' A ''に代入せずに実行すれば、すべてうまくいくはずですが、 '' argv''が指す文字列は変更可能です。 –

答えて

0

argvchar**である、ポインタへのポインタです。しかし、関数にはchar*が必要です。だから、あなたは次のように合格する必要があります。

makeLower(argv[0]); 

しかし、これはargv[0]は今文字列リテラルを指すので、仕事に行くのではありません。文字列リテラルの変更はundefinedです。

は、代わりのような変更可能な配列を渡す:

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

    makeLower(arr); 
    return 0; 
} 

その他のオプションは、(argv[0]経由で)渡された文字列リテラルのコピーを作成し、その後、あなたはそれを変更することができるようになりますです。基本的には、Cで文字列リテラルを合法的に変更できないという考えがあります。

関連する問題