Как читать с ввода до тех пор, пока не будет найдена новая строка с помощью scanf()?
Меня попросили выполнить работу на C, когда я должен читать с ввода, пока не будет пробела, а затем, пока пользователь не нажмет ввод. Если я сделаю это:
scanf("%2000s %2000s", a, b);
Это будет следовать 1-му правилу, но не 2-му.
Если я напишу:
я умный
То, что я получаю, эквивалентно:
а = "я";
b = "я";
Но это должно быть:
а = "я";
b = "я умный";
Я уже попробовал:
scanf("%2000s %2000[^\n]\n", a, b);
а также
scanf("%2000s %2000[^\0]\0", a, b);
В первом из них пользователь ждет нажатия Ctrl+D (чтобы отправить EOF), а это не то, что я хочу. Во втором он не скомпилируется. По словам компилятора:
предупреждение: не закрывать ']' для формата '%['
Есть хороший способ решить это?
7 ответов
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's potentially more after that as well.
Используйте getchar и какое-то время это выглядит так
while(x = getchar())
{
if(x == '\n'||x == '\0')
do what you need when space or return is detected
else
mystring.append(x)
}
Извините, если я написал псевдокод, но некоторое время не работаю с языком Си.
#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;
}
Я опоздал, но вы можете попробовать и этот подход.
#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;
}
#include <stdio.h>
int main()
{
char a[5],b[10];
scanf("%2000s %2000[^\n]s",a,b);
printf("a=%s b=%s",a,b);
}
Просто напишите s вместо \n:)
Звучит как домашнее задание. scanf() - неправильная функция для решения проблемы. Я бы порекомендовал getchar() или getch().
Примечание: я намеренно не решаю проблему, так как это похоже на домашнюю работу, вместо этого я просто указываю вам в правильном направлении.
// увеличиваем размер массива символов, если не хотите брать больше. персонажей.
#include <stdio.h>
int main()
{
char s[10],s1[10];
scanf("\n");//imp for below statement to work
scanf("%[^\n]%c",s);//to take input till the you click enter
scanf("%s",s1);//to take input till a space
printf("%s",s);
printf("%s",s1);
return 0;
}