web-dev-qa-db-ja.com

scanfを使用して文字列を入力として読み取る

私はC言語を初めて使用し、ユーザーから文字と文字列(文、最大長25)を読み取ろうとしています。

次のコード行で何が間違っているのかわかりません。エラー「セグメント障害」が発生します。

#include <stdio.h>

int main(){
    char * str[25];
    char car;

    printf("Enter a character: ");
    car = getchar();

    printf("Enter a sentence: ");
    scanf("%[^\n]s", &str);

    printf("\nThe sentence is %s, and the character is %s\n", str, car);

    return 0;
}

ありがとう!

7
Hafiz Temuri

strは、charの配列ではなく、charへの25個のポインターの配列です。そのため、その宣言を

char str[25];

また、scanfを使用して文を読むことはできません。最初の空白で読み上げが停止するため、代わりにfgetsを使用して文を読みます。

最後のprintfでは、%cではなく、%s指定子が必要です。また、stdinには'\n'が残っているため、標準入力をフラッシュする必要があります。したがって、これらの文字をスローする必要があります。

改訂されたプログラムは現在

#include <stdio.h>    
void flush();
int main()
{
    char str[25], car;

    printf("Enter a character\n");
    car = getchar();

    flush();

    printf("Enter a sentence\n");
    fgets(str, 25, stdin);

    printf("\nThe sentence is %s, and the character is %c\n", str, car);

    return 0;
}
void flush()
{
    int c;
    while ((c = getchar()) != '\n' && c != EOF)
        ;
}
7
Edward Karak

4つの変更を行う必要があります。

  1. 変化する

    _char * str[25];
    _

    _char str[25];
    _

    charへの25個のポインターの配列ではなく、25個のcharsの配列が必要です。

  2. 変化する

    _char car;
    _

    _int car;
    _

    as getchar()は、intではなく、charを返します。

  3. 変化する

    _scanf("%[^\n]s", &str);
    _

    _scanf( "%24[^\n]", str);
    _

    scanfに指示します

    1. 空白文字がある場合は、すべて無視します。
    2. 最大24文字(Nul-terminator _'\0'_に対して+1)をスキャンするか、_\n_までスキャンして、strに保存します。
  4. 変化する

    _printf("\nThe sentence is %s, and the character is %s\n", str, car);
    _

    _printf("\nThe sentence is %s, and the character is %c\n", str, car);
    _

    charの正しい書式指定子は_%c_ではなく_%s_であるためです。

10
Spikatrix