0

これを行うことにより、任意の条件に基づいて文字列を早期に終了しようとしています。

void end_string_early(char string[], int len) {
    int i;
    char j;

    for (i=0;i<len;i++) {
        j = string[i];                                   
        if (arbitrary_condition(j)) {
            string[i] = "a";
        }
    }
} 

コンパイルエラーが発生します:

警告:代入はキャストなしでポインタから整数になります

私を混乱させるのは、int配列でまったく同じことを行うと(値をaではなく別のintに変更する)、完全に機能することです。おそらくそれは議論がどのように渡されているかということですか?(私はすべての配列がrefによって渡されたという印象を受けましたが)完全にはわかりません。これがCでの最初の試みです(K&Rの本を読んでいます)。

4

6 に答える 6

3

'a'"a"は2つの異なるものです。1つ目は文字aであり、2つ目は文字aのみを含むリテラル文字列です。

リテラル文字列を文字に割り当てようとしています。"a"はリテラル文字列、つまりachar *であり、yourの要素はchar[]char整数型であるため、整数にポインタを割り当てようとしていることに関するメッセージです。charは整数型であるため、メッセージは少し紛らわしいです。

したがって、以下を使用します。

string[i] = 'a';

しかし、これは文字列を終了しません。そのために必要なもの:

string[i] = '\0';
于 2012-09-29T17:16:32.570 に答える
1
string[i] = "a";

でなければなりません

string[i] = 'a';

異なる引用符に注意してください。


stringcharはsからの配列であり、"a"ではなくchar文字列リテラルであり、2つcharのs(foraと1 )を含み\0ます。
したがって、char要素をchar配列に設定するには、一重引用符を使用する必要があります'

于 2012-09-29T17:16:32.983 に答える
1

"a"は、char[2]に減衰しchar*ます。そのため、警告が表示されます。stringchar*そうstring[i]です。これは、をcharに割り当てようとしていることを意味しますが、これは間違っています。char*char

一重引用符を使用する必要があります。

string[i] = 'a';

二重引用符は配列を作成し、一重引用符charは単一引用符のみを作成しますchar。したがって、aをa'a'char割り当てると機能します。charchar

于 2012-09-29T17:17:18.247 に答える
1

あなたのプログラムはstring[i] = 'a';(の代わりに"a")より良く動作します。

のため、リテラル文字列の文字を再割り当てすることはできないことに注意してください。表示するコードにはこの問題はありませんが、を呼び出すと問題が発生しますend_string_early("foo"...)

于 2012-09-29T17:17:36.143 に答える
1

"a"は char ではありません -- char*(文字列) です。が必要'a'です。

于 2012-09-29T17:17:55.467 に答える
1

string[i] = "a"である必要がありstring[i] = 'a'"a"とは異なります'a'。ここで、「a」はリテラル文字列であり、「ポインターを返しますが、'a'は単なる文字です。

于 2012-09-29T17:19:03.597 に答える