读取带空格的字符串

时间:2015-01-10 17:53:35

标签: c string scanf

#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

任何人都可以帮我处理我的代码......请

5 个答案:

答案 0 :(得分:0)

使用fgets(3)阅读该行:

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

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

答案 1 :(得分:0)

使用

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

读到行尾。

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

将标记转换为整数

答案 2 :(得分:0)

如果你真的想在开始获取输入之前使用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

答案 3 :(得分:0)

为什么OP代码失败:用户输入如 5 输入 a 空格 b 输入

第一个scanf()消费"5""\na b\n"留下scanf()。由于第一个scanf()strchar不会扫描任何内容并且不会将任何内容保存到'\n'

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

阅读第scanf("%[^\n]s",str);行有很多问题。

  1. s

  2. "%[^\n]s"没有理由 如果输入为"%[^\n]",则
  3. str不会将任何内容保存到"\n"

  4. 无法防止阅读太多数据。

  5. 代码应检查scanf()的返回值。

  6. 根据许多人的建议,请使用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;
    }
    

答案 4 :(得分:0)

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

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