读取无限量的行,直到用户在C中输入(两次)

时间:2012-09-24 14:32:51

标签: c scanf readline

我无法解决这个问题。我需要用户输入一个字符串,然后按Enter键,然后输入另一个字符串。当他/她完成后再次输入(这最后一个字符串只有\ n字符所以我知道何时停止)。

char * buff = malloc (100);

 printf("Type in strings, to finish hit enter\n");

 do{
       scanf (" %[^\n]",buff);
       //do some other stuff with the string
  } while(*buff);            

  printf("You have finished typing strings\n");

我提出的这种方法对我没有用,因为[^ \ n]命令告诉函数读取除了\ n之外的所有内容,这意味着\ n保存在控制台缓冲区中。如果我只是做

while(*buff)
  {
      scanf ("%s",buff);
  }

如果我点击输入它什么都不做。 还有其他方法吗?

2 个答案:

答案 0 :(得分:3)

是的,scanf实际上在寻找角色。你想要的是gets(获得一条线)。

[编辑]正如Daniel Fischer所指出的那样:

  

gets已经(最后)从语言中删除了。甚至以前,   man page已经很长时间了从不使用gets()

看起来我的建议不是最好的。我想这意味着使用fgets,因为它可以防止缓冲区溢出。与gets不同,换行符也将存储在字符串中,程序员有责任检查它们。

const size_t bufsize = 100;
char buf[bufsize];

while( fgets(buf, bufsize, stdin) != NULL )
{
    if( buf[0] == '\n' ) break;

    /* Do something with your string... */
}

答案 1 :(得分:-1)

除了paddy指出的(使用得到整行),条件

while(*buff);   
除非用户输入为空字符(如ASCII值0),否则

将永远不会为false。换行符(\ n)的ASCII值为10,在条件语句中的计算结果为true

试试这个:

while(strlen(*buff) > 0);