Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取不确定数量的行,直到用户在C中按enter键(两次)_C_Scanf_Readline - Fatal编程技术网

读取不确定数量的行,直到用户在C中按enter键(两次)

读取不确定数量的行,直到用户在C中按enter键(两次),c,scanf,readline,C,Scanf,Readline,我无法回避这个问题。我需要用户键入一个字符串,然后按enter键,然后再按另一个字符串。完成后,再次按enter键(最后一个字符串只有\n个字符,因此我知道何时停止) 我提出的这种方法对我没有任何用处,因为[^\n]命令告诉函数读取所有内容,\n但并不意味着将\n保存在控制台缓冲区中。如果我这么做的话 while(*buff) { scanf ("%s",buff); } 如果我按回车键,它什么也不做。 还有其他方法吗?是的,scanf实际上是在寻找字符。您需要的是获取(获

我无法回避这个问题。我需要用户键入一个字符串,然后按enter键,然后再按另一个字符串。完成后,再次按enter键(最后一个字符串只有\n个字符,因此我知道何时停止)

我提出的这种方法对我没有任何用处,因为[^\n]命令告诉函数读取所有内容,\n但并不意味着将\n保存在控制台缓冲区中。如果我这么做的话

while(*buff)
  {
      scanf ("%s",buff);
  }
如果我按回车键,它什么也不做。
还有其他方法吗?

是的,
scanf
实际上是在寻找字符。您需要的是
获取
(获取一行)

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

get
已(最后)从该语言中删除。甚至在这之前 手册页很长一段时间以来一直说,永远不要使用
get()

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

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

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

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

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

while(*buff);   
不会为false,除非用户输入为空字符(如ASCII值0)。换行符(\n)的ASCII值为10,在条件语句中计算结果为
true

试试这个:

while(strlen(*buff) > 0);

使用
\uuu getch
检查是否有一个
\n
Dunno在没有提供评论的情况下否决了你,但我会提供一个<代码>获取不返回换行符。尽管如此,检查还是值得的(尤其是那些CRLF及其变种在荒地上肆虐)。一个简单的函数来检查是否所有的字符串都是空白就足够了。顺便说一下,如果不是很明显。。。使用
get
得到的字符串可能与使用
scanf
得到的字符串不同。如果您想从该行中提取单个单词(如
scanf
将为您提供的),则需要将它们解析出来(使用
sscanf
strtok
get
已(最终)从该语言中删除。甚至在此之前,手册页上就一直说永远不要使用
get()
@danielfisher感谢您指出这一点。它看起来总是有点懒,但对于一次性应用来说已经足够好了。我会更新我的答案,使之更有用。谢谢。是的,如果你是唯一一个使用这个程序的人,你可以冒这个风险,但是如果其他人使用它,那太危险了。谢谢你们的帮助!因为这只是为了拼贴,更具体地说是为了学习指针,所以如果我使用gets就不会有问题。但无论如何,我将使用另一个函数,只是为了练习这两种方法。再次感谢:-)
while(strlen(*buff) > 0);