从标准输入中读取整数

时间:2019-03-05 09:31:23

标签: c

一个简单的C问题,我想从标准输入(用户输入)读取整数,标准输入的每一行都包含一个整数,而空行则表示输入的末尾。 我尝试使用gets()和scanf(),但无法正常工作。

while (1){
            char a;
            scanf("%c",&a);
            printf("%c",a);
            if (a=='\r'||a=='\n'){
                break;
            }
        }

当我使用scanf()时,它在每次按Enter键时终止;

while(1){
            char a[10];
            gets(a);
            if (a=='\r'||a=='\n'){
                break;
            }
        }

当我使用gets()时,无法将'\ r'或'\ n'读入缓冲区,因此它永远不会中断。

有人可以帮我吗,谢谢!

3 个答案:

答案 0 :(得分:4)

这是XY problem?吗?您可以使用fgetssscanf来完成这项工作。

#include <stdio.h>

int main(void) {
    char buffer[100];
    int number;
    while(fgets(buffer, sizeof buffer, stdin) != NULL) {
        if(sscanf(buffer, "%d", &number) != 1) {    // or strtol perhaps
            break;
        }
        printf("Number: %d\n", number);
    }
    return 0; 
}

答案 1 :(得分:2)

  

我想从标准输入中读取整数

while (1){
  char a;
  scanf("%c",&a);
  printf("%c",a);
  if (a=='\r'||a=='\n'){
    break;
  }
}

您读了一行包含任何字符的行,不仅是数字表示形式

while(1){
   char a[10];
   gets(a);
   if (a=='\r'||a=='\n'){
      break;
   }
}

a char*,因此在a=='\r'||a=='\n'中错误地将指针与字符进行比较,您想要*a=='\r'||*a=='\n'

其他说明:

  • 从不使用 gets ,使用 fgets 读取一行,因此fgets(a, sizeof(a), stdin)
  • 但是您仍然读到包含任何字符的行,不仅是数字
  

我想从标准输入(用户输入)中读取整数,标准输入的每一行都包含一个整数,空行表示输入的结尾。

提案,在行尾之前仅包含空格和制表符的行被认为是空的,并且绕过该数字之前/之后的空格和制表符而不会被视为无效:

#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <ctype.h>

int main()
{
  while(1) {
    puts("enter number");

    char a[10];

    if (fgets(a, sizeof(a), stdin) == NULL) {
      puts("EOF");
      break;
    }

    errno = 0;

    char * endptr;
    long n = strtol(a, &endptr, 10);

    if (errno != 0) {
      puts("not a valid long");
    }
    else {
      /* check possible unexpected characters */
      char * p = endptr;

      for (;;) {
        if (*p == 0) {
          if (endptr == a) {
            puts("done");
            return 0;
          }
          printf("the number is %ld\n", n);
          break;
        }
        if (!isspace(*p++)) {
          puts("not (only) a valid long");
          break;
        }
      }
    }
  }
}

编译和执行:

pi@raspberrypi:/tmp $ gcc -pedantic -Wextra n.c
pi@raspberrypi:/tmp $ ./a.out
enter number
123
the number is 123
enter number
 123
the number is 123
enter number
12a
not (only) a valid long
enter number
a12
not (only) a valid long
enter number
a
not (only) a valid long
enter number

done

答案 2 :(得分:0)

我认为使用getline可能是一个更通用的解决方案,下面是一些示例代码,您可以根据需要对其进行修改,“ buf”将包含输入内容。

kitkat-release