0

私はCプログラミングが初めてなので、これはばかげた質問かもしれません...しかし、次のエラーが表示されます:

45: error: invalid operands to binary % (have .char*. and .int.)
45: error: expected .). before string constant

45 行目は 2 番目の printf 関数です。

いくつかの情報: charsInWord と indexOf は両方とも int 値を返します

int main() 
{ 
    char word [20]; 
    char c;

    printf("Enter a word and a character separated by a blank ");
    scanf("%s %c", word, &c);

    printf("\nInput word is "%c". contains %d input character. Index of %c in it is %d\n", word, charsInWord(word), c, indexOf(word, c));

    return 0;
}
4

5 に答える 5

4

埋め込まれた引用符を「エスケープ」する必要があります。変化する:

printf("\nInput word is "%c". contains %d input character. Index of %c in it is %d\n", word, charsInWord(word), c, indexOf(word, c));

に:

printf("\nInput word is \"%c\". contains %d input character. Index of %c in it is %d\n", word, charsInWord(word), c, indexOf(word, c));

または、単一引用符を使用してください。

于 2013-05-17T03:07:55.217 に答える
1

変化する

"Input word is "%c". contains %d input character."

"Input word is \"%s\". contains %d input character."

引用符のエスケープは、エラーを取り除くことです。%cからへの変更は、文字列を出力%sする必要があるためです。%s

于 2013-05-17T03:10:29.177 に答える
0

最新の GCC ライブラリを使用すると、%s がバッファをオーバーランし、プログラムの精神を混乱させるリスクを取り除くことができます。関連する理由から、scanf() の戻り値をチェックすることも不可欠です。長い行を少し分割することもできます。この例では、例で定義されていない関数に対していくつかの標準ライブラリ呼び出しを使用しています。

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

int main() 
{ 
    char *word = 0;
    char c;

    printf("Enter a word and a character separated by a blank ");
    /* %ms is in GCC and the upcoming POSIX.1 standard */
    if(2 != scanf("%ms %c", &word, &c)) {
        fputs("oops, something went wrong in that input.\n", stderr);
        return -1;
    } 
    char *first = strchr(word, c);  /* NULL if not found */
    printf("\nInput word is \"%s\". contains %u input character. "
           "Index of %c in it is %ld\n",
           word, (unsigned int)strlen(word), c,
           first - word);  /* probably negative if it wasn't found */

    free(word);
    return 0;
}

見つからない文字を処理することは、演習として残されています... :-)

于 2013-05-17T08:01:03.967 に答える
0

フォーマット文字列の引用符をエスケープする必要があります。

printf("\nInput word is "%c". contains %d input character. Index of %c in it is %d\n", word, charsInWord(word), c, indexOf(word, c));

する必要があります

printf("\nInput word is \"%c\". contains %d input character. Index of %c in it is %d\n", word, charsInWord(word), c, indexOf(word, c));
于 2013-05-17T03:08:03.023 に答える
0
printf("\nInput word is "%c". contains %d input

まず、次のように引用符をエスケープする必要があります。

printf("\nInput word is \"%c\". contains %d input

次に、フォーマット文字列の後のパラメーターのタイプが、フォーマット指定子によって期待されるタイプと一致することを確認します。つまり、 を指定する場合は%c、対応するパラメーターが であることを確認してくださいchar。を指定する場合%fは、対応するパラメーターが浮動小数点型であることを確認してください。

wordこの場合、文字 ( ) として指定した最初のパラメーターに文字列 ( ) を渡そうとしているように見えます%c。or%sを渡す場合は、代わりに書式指定子を使用してください(文字列が null で終了していることを確認してください)。char[]char*

于 2013-05-17T03:09:34.613 に答える