0

我无法解决这个问题。我需要用户输入一个字符串,然后按回车键,然后是另一个字符串。当他/她完成后再次按回车键(最后一个字符串只有 \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);
  }

如果我按 Enter 它什么也不做。还有其他方法吗?

4

2 回答 2

4

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

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

gets已(最终)从语言中删除。甚至之前,man page 早就说过Never usegets()

看来我的建议不是最好的。我想这意味着使用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... */
}
于 2012-09-24T14:35:54.343 回答
-1

除了稻田指出的(使用gets得到一整行)之外,条件

while(*buff);   

永远不会是假的,除非用户输入是空字符(如 ASCII 值 0)。换行符 (\n) 的 ASCII 值为 10,true在条件语句中计算为 。

试试这个:

while(strlen(*buff) > 0);
于 2012-09-24T14:42:11.393 回答