Как читать с ввода, пока новая строка не будет найдена с помощью 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), и это не то, что я хочу.
Во втором он не будет компилироваться. Согласно компилятору:
предупреждение: нет закрытия '] для'% [формат
Любой хороший способ решить это?
Ответы
Ответ 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().
Примечание. Я целенаправленно не решу проблему, так как это кажется домашней работой, вместо этого просто указывая на вас в правильном направлении.