Подтвердить что ты не робот

Как читать с ввода, пока новая строка не будет найдена с помощью scanf()?

Меня попросили сделать работу на C, когда я должен был читать с ввода, пока не появится пробел, а затем до тех пор, пока пользователь не нажмет кнопку ввода. Если я это сделаю:

scanf("%2000s %2000s", a, b);

Это будет следовать 1-му правилу, но не второму.
Если я пишу:

I am smart

То, что я получаю, эквивалентно:
a = "I";
b = "am";
Но это должно быть:
a = "I";
b = "умный",

Я уже пробовал:

scanf("%2000s %2000[^\n]\n", a, b);

и

scanf("%2000s %2000[^\0]\0", a, b);

В первом, он ждет, чтобы пользователь нажал Ctrl + D (для отправки EOF), и это не то, что я хочу. Во втором он не будет компилироваться. Согласно компилятору:

предупреждение: нет закрытия '] для'% [формат

Любой хороший способ решить это?

4b9b3361

Ответ 1

scanf (и кузены) имеют одну слегка странную характеристику: любое пустое пространство в строке формата (вне сканирующего файла) соответствует произвольному количеству пробелов на входе. Как это происходит, по крайней мере, в локали "C" по умолчанию новая строка классифицируется как пробел.

Это означает, что конечный '\n' пытается совместить не только новую строку, но и любое последующее белое пространство. Он не будет считаться согласованным до тех пор, пока вы не сообщите о конце ввода, или не введите некоторый небелый пробел.

Чтобы справиться с этим, вы обычно хотите сделать что-то вроде этого:

scanf("%2000s %2000[^\n]%c", a, b, c);

if (c=='\n')
    // we read the whole line
else
    // the rest of the line was more than 2000 characters long. `c` contains a 
    // character from the input, and there potentially more after that as well.

Ответ 2

scanf("%2000s %2000[^\n]", a, b);

Ответ 3

используйте getchar и некоторое время, которые выглядят как

while(x = getchar())
{   
    if(x == '\n'||x == '\0')
       do what you need when space or return is detected
    else
        mystring.append(x)
}

Извините, если я написал псевдокод, но я не работаю с языком C через некоторое время.

Ответ 4

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

int main(void)
{
  int i = 0;
  char *a = (char *) malloc(sizeof(char) * 1024);
  while (1) {
    scanf("%c", &a[i]);
    if (a[i] == '\n') {
      break;
    }
    else {
      i++;
    }
  }
  a[i] = '\0';
  i = 0;
  printf("\n");
  while (a[i] != '\0') {
    printf("%c", a[i]);
    i++;
  }
  free(a);
  getch();
  return 0;
}

Ответ 5

Я слишком поздно, но вы также можете попробовать этот подход.

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

int main() {
    int i=0, j=0, arr[100];
    char temp;
    while(scanf("%d%c", &arr[i], &temp)){
        i++;
        if(temp=='\n'){
            break;
        }
    }
    for(j=0; j<i; j++) {
        printf("%d ", arr[j]);
    }

    return 0;
}

Ответ 6

Звучит как домашняя проблема. scanf() - неправильная функция, используемая для проблемы. Я бы рекомендовал getchar() или getch().

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