【问题标题】:Read a string with whitespace读取带有空格的字符串
【发布时间】:2015-01-10 17:53:35
【问题描述】:
#include<stdio.h>
int main()
{

 int n;

 scanf("%d",&n);

  char str[500];

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

  printf("%d\n",n);

  printf("%s",str);

return 0;
}

输入:

5 7 1 2 3 

输出:

5 5 ->

我希望输出是

5

7 1 2 3

任何人都可以帮助我编写代码...请

【问题讨论】:

标签: c string scanf


【解决方案1】:

使用fgets(3) 读取该行:

 fgets(str, sizeof(str), stdin);

稍后解析行str,可能使用sscanf(3)(可能使用%n)或strtol(3)

【讨论】:

    【解决方案2】:

    使用

    fgets(str, sizeof(str), stdin);
    

    读到行尾。

    然后为了获得整数,您可以使用strtok() 将行分解为标记并使用strtol() 将标记转换为整数

    【讨论】:

      【解决方案3】:

      如果你真的想使用 scanf() 并在开始获取输入之前读取一个数字,你可以这样做:

      #include <stdio.h>
      
      int main(void) {
        int numbers[128];
        int n;
      
        printf("How many numbers to read?\n");
        scanf("%d", &n);
      
        int i;
        for(i = 0; i < n; ++i) {
          scanf("%d", &numbers[i]);
        }
      
        for(i = 0; i < n; ++i)
          printf("%d\n", numbers[i]);
      
        return 0;
      }
      

      输出:

      How many numbers to read?
      5
      1 2 3 4 5
      1
      2
      3
      4
      5
      

      使用fgets()。使用stdin 输入函数。

      这是一个例子:

      #include <stdio.h>
      #include <string.h>
      #include <stdlib.h>
      
      int main(void) {
        char line[256];
        char* pch;
        int numbers[128];
        int N = 0; // actual numbers of numbers read
      
        // to read one line
        fgets(line, 256, stdin);
        line[strlen(line) - 1] = '\0';
        pch = strtok(line, " ");
        while (pch != NULL) {
          numbers[N++] = atoi(pch);
          pch = strtok(NULL, " ");
        }
      
        int i;
        for(i = 0; i < N; ++i)
          printf("%d\n", numbers[i]);
      
        return 0;
      }
      

      输出:

      1 2 3 4 5
      1
      2
      3
      4
      5
      

      【讨论】:

        【解决方案4】:

        scanf("%d",&amp;n);改为scanf("%d%*c", &amp;n);

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

        【讨论】:

        • 尴尬X),是错字。
        【解决方案5】:

        为什么 OP 代码会失败:使用像 5 Enter a space b 这样的用户输入kbd> 回车.

        第一个scanf() 消耗"5",将"\na b\n" 留给下一个scanf()scanf() 不会扫描任何内容,也不会将任何内容保存到str,因为第一个char'\n'

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

        对于读取一行scanf("%[^\n]s",str);有很多问题。

        1. "%[^\n]s" 中的s 没有理由

        2. 如果输入为"\n""%[^\n]" 不会将任何内容保存到str

        3. 没有防止读取过多数据的保护。

        4. 代码应该检查来自scanf()的返回值。

        正如许多人建议的那样,使用fgets()

          char str[500];
          if (fgets(str, sizeof str, stdin) == NULL) HandleEOForIOerror();
        
          // to remove '\n'
          size_t len = strlen(str);
          if (len > 0 && str[len-1] == '\n') str[--len] = 0;
        
          printf("%s",str);
        

        要读取号码,推荐相同,使用fgets()

        #include<stdio.h>
        
        int main(void) {
          int n;
          char str[500];
          if (fgets( str, sizeof str, stdin) return -1;
          if (1 == sscanf(str, "%d",&n)) {
            printf("%d\n",n);
          }
          if (fgets( str, sizeof str, stdin) return -1;
          printf("%s",str);
          return 0;
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-02-20
          • 1970-01-01
          • 2011-04-30
          • 1970-01-01
          • 2011-09-11
          相关资源
          最近更新 更多