【问题标题】:Read a string as an input using scanf使用 scanf 读取字符串作为输入
【发布时间】:2016-01-30 15:51:38
【问题描述】:

我是 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;
}

谢谢!

【问题讨论】:

    标签: c scanf


    【解决方案1】:

    您必须进行四项更改:

    1. 改变

      char * str[25];
      

      char str[25];
      

      因为你想要一个包含 25 个 chars 的数组,而不是一个包含 25 个指向 char 的指针的数组。

    2. 改变

      char car;
      

      int car;
      

      getchar() 返回 int,而不是 char

    3. 改变

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

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

      告诉scanf

      1. 忽略所有空白字符(如果有)。
      2. 最多扫描 24 个字符(+1 表示 Nul 终止符 '\0')或直到 \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

    【讨论】:

      【解决方案2】:

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

      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)
              ;
      }
      

      【讨论】:

      • 感谢您的回答。我复制并粘贴了您的代码,但它终止了程序而没有让我输入一个句子。所以,在我输入一个字符并按下回车之后,在要求输入一个句子之前它就被终止了。
      • 你需要刷新标准输入(不要使用fflush(stdin))。
      • "您不能使用scanf 来阅读句子——它会在第一个空格处停止阅读" -- 实际上,这是可能的(通过使用%[ 格式说明符)。 %s in scanf 停止读取第一个空格。顺便说一句,fgets 将读取程序中 getchar() 遗漏的 \n
      • 我没有使用 fflush(stdin),事实上我什至不知道那是什么,因为我是 c 语言的新手。我认为这是我用 c 编写的第三或第四个程序。
      【解决方案3】:

      // 这是对代码工作的最小更改

      #include <stdio.h>
      
      int main(){
      
          char car,str[25];
      
          printf("Enter a character: ");
          car = getchar();
      
          printf("Enter a sentence: ");
          scanf("%s", str);
      
          printf("\nThe sentence is %s, and the character is %c\n", str, car);
      
          return 0;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-04
        相关资源
        最近更新 更多