如何从输入读取,直到使用scanf()找到换行符?

时间:2011-11-11 17:21:08

标签: c format scanf

我被要求在C中完成工作,我应该从输入读取,直到有空格,然后直到用户按下回车键。 如果我这样做:

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

它将遵循第一条规则而不是第二条规则 如果我写:

I am smart

我得到的相当于:
a =“我”;
b =“am”;
但它应该是:
a =“我”;
b =“很聪明”;

我已经尝试过:

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

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

在第一个中,它等待用户按 Ctrl + D (发送EOF),这不是我想要的。 在第二个,它不会编译。根据编译器:

  

警告:'%['格式

没有关闭']'

有什么好方法可以解决这个问题吗?

8 个答案:

答案 0 :(得分:36)

scanf(和表兄弟)有一个稍微奇怪的特征:格式字符串中的任何空格(扫描集之外)与输入中任意数量的空白区域相匹配。碰巧,至少在默认情况下" C" locale,new-line被归类为white space。

这意味着尾随'\n'不仅会尝试匹配 a 换行符,还会尝试匹配任何后续的空白行。在您发出输入结束信号之前,它不会被视为匹配,或者输入一些非空格字符。

要解决这个问题,您通常需要执行以下操作:

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.

答案 1 :(得分:7)

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

答案 2 :(得分:4)

使用getchar和看起来像这样的一段时间

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

很抱歉,如果我写了一段伪代码,但我暂时不使用C语言。

答案 3 :(得分:2)

#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;
}

答案 4 :(得分:2)

我来不及,但你也可以尝试这种方法。

#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;
}

答案 5 :(得分:0)

听起来像是一个家庭作业问题。 scanf()是用于解决问题的错误函数。我推荐使用getchar()或getch()。

注意:我故意不解决问题,因为这看起来像是家庭作业,而只是指向正确的方向。

答案 6 :(得分:-1)

#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:)

答案 7 :(得分:-2)

//如果需要,请增加char数组的大小。字符。

#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;
}