使用scanf读取字符串作为输入

Haf*_*uri 7 c scanf

我是C语言的新手,我正在尝试从用户那里读取一个字符和一个字符串(一个句子;最大长度为25).

不知道我在下面的代码行中做错了什么,它给了我一个错误"Segment Fault".

#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;
}
Run Code Online (Sandbox Code Playgroud)

谢谢!

Spi*_*rix 10

您必须进行四项更改:

  1. 更改

    char * str[25];
    
    Run Code Online (Sandbox Code Playgroud)

    char str[25];
    
    Run Code Online (Sandbox Code Playgroud)

    因为你想要一个25 char秒的数组,而不是25个指针的数组char.

  2. 更改

    char car;
    
    Run Code Online (Sandbox Code Playgroud)

    int car;
    
    Run Code Online (Sandbox Code Playgroud)

    作为getchar()返回int,而不是char.

  3. 更改

    scanf("%[^\n]s", &str);
    
    Run Code Online (Sandbox Code Playgroud)

    scanf( "%24[^\n]", str);
    
    Run Code Online (Sandbox Code Playgroud)

    告诉scanf我们

    1. 忽略所有空白字符(如果有).
    2. 扫描最多24个字符(Nul-terminator为+1 '\0')或直到a \n并存储它str.
  4. 更改

    printf("\nThe sentence is %s, and the character is %s\n", str, car);
    
    Run Code Online (Sandbox Code Playgroud)

    printf("\nThe sentence is %s, and the character is %c\n", str, car);
    
    Run Code Online (Sandbox Code Playgroud)

    为正确的格式说明的char就是%c,没有%s.


Edw*_*rak 7

str是一个包含25个指针char的数组,而不是数组char.所以将其声明改为

char str[25];
Run Code Online (Sandbox Code Playgroud)

并且你不能scanf用来读句子 - 它在第一个空格处停止阅读,所以fgets用来读取句子.

在你的最后printf,你需要说明%c符来打印字符,而不是%s.您还需要刷新标准输入,因为还有'\n'剩余的stdin,所以您需要抛出这些字符.

修订后的计划现在

#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)
        ;
}
Run Code Online (Sandbox Code Playgroud)