Читайте целые числа из стандартного ввода - PullRequest
0 голосов
/ 05 марта 2019

Простая проблема C, я хочу читать целые числа из стандартного ввода (пользовательский ввод), каждая строка стандартного ввода содержит целое число, а пустая строка обозначает конец ввода.Я пытался использовать gets () и scanf (), но это не работает.

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

когда я использую scanf (), он завершается каждый раз, когда я нажимаю ввод;

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

и когда я использую get (), '\ r' или '\ n'не может быть прочитано в буфер, поэтому он никогда не сломается.

Может ли кто-нибудь помочь мне с этим, спасибо заранее!

Ответы [ 3 ]

0 голосов
/ 05 марта 2019

Я думаю, что использование getline может быть более общим решением, вот пример кода, который вы можете изменить для своих целей, "buf" будет содержать ввод.

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

int main(int argc, char *argv[])
{
    char *buf = NULL;
    int size;
    unsigned int length;
    size = getline(&buf, &length, stdin);
    if (size != -1)
        /* do anything you want with the stuff that was entered here */
        /* for the example I just write it back to stdout! */
        puts(buf);
    else
        /* this would be your "end" condition */
        printf("Nothing read!\n");

    printf("Size: %d\n Length: %d\n", size, length);
    free(buf);
    return 0;
}
0 голосов
/ 05 марта 2019

Это проблема XY? Вы можете использовать fgets и sscanf для выполнения работы.

#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; 
}
0 голосов
/ 05 марта 2019

Я хочу читать целые числа из стандартного ввода

Выполнение

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'

Дополнительные замечания:

  • никогда использование получает , использование 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...