【问题标题】:How to detect carriage return in C?如何检测C中的回车?
【发布时间】:2014-11-11 21:58:51
【问题描述】:

对于我的作业,我们应该编写一个校验和,它会继续显示校验和,直到检测到回车(按下 Enter 键)。我的校验和工作正常,并继续提示我输入一个字符串以将其转换为校验和,但我的程序应该在我按下回车键后结束。在我的代码中,我设置了一个持续计算校验和的 while 循环。我特别提出:

while(gets(s) != "\r\n")

用户必须输入的字符串中的位置。我也用 scanf 试过这个,我的循环看起来像:

while(scanf("%s",s) != '\n')

这也没有奏效。谁能给我一些关于如何让它工作的见解?谢谢

【问题讨论】:

  • 您不能将 C 字符串与赋值运算符 '=' 进行比较。
  • 答案是正确的,您需要类似 strcmp 的东西,但是 gets 和 scanf %s 不返回换行符,因此比较仍然会失败。改为检查空字符串
  • 永远不要使用gets。将其替换为fgetsgets 是一个非常危险的功能,已被弃用。此外,fgets 将返回换行符,而 gets 会剥离它。

标签: c return checksum


【解决方案1】:

gets(s) 返回 s。您的条件将此指针与常量字符串字面量的地址进行比较。它永远不会平等。您必须使用strcmp() 来比较两个字符串。

您还应该注意特殊情况,例如通过检查 !feof(stdin) 和其他读取错误来结束文件,在这种情况下 gets() 返回 NULL。

请注意gets() 将读取整行,直到遇到'\n'。 '\n' 不是返回的字符串的一部分。所以strcmp(s,"\r\n")!=0 永远是真的。

试试:

while (!feof(stdin) && gets(s) && strcmp(s,"")) 

【讨论】:

    【解决方案2】:

    在大多数情况下,stdin 流在按下 Enter 时插入“\n”(换行符或换行符)而不是回车或 LF+CR。

    char ch ;
    while( (ch = getchar()) != '\n` )
    {
         // update checksum using ch here
    }
    

    但也请注意,通常在 stdin 上运行的函数在将换行符插入流中之前不会返回,因此在输入字符时无法显示更新校验和。在上面的循环中,在getchar()第一次返回之前,会缓冲一整行,然后所有缓冲的字符都会一次更新。

    【讨论】:

      【解决方案3】:

      在C中比较一个字符串,实际上是一个指向字符数组的指针,需要单独比较字符串中每个字符的值。

      【讨论】:

      • 或使用strcmp()/strncmp()
      猜你喜欢
      • 2012-08-12
      • 1970-01-01
      • 1970-01-01
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      相关资源
      最近更新 更多