【问题标题】:How to detect empty string from fgets如何从 fgets 中检测空字符串
【发布时间】:2011-11-08 23:55:24
【问题描述】:

我正在尝试检测来自 stdin 的 fgets 输入为空(当我按 Enter 而不输入任何内容时)。这是我的程序:

int main()
{
    char input[1000];
    printf("Enter :");
    fgets(input, 1000, stdin);
    input[strlen(input) - 1] = '\0';

    if(input != '\0'){
        printf("hi");
    }

    return 0;

}

我想做某种条件让它不打印任何东西,但显然这种方式是不正确的。我也尝试了NULL,但没有用。

谢谢!

【问题讨论】:

  • @JamesMcNellis 事实上,无论input 来自哪里,这条线永远不会做任何事情。 strlen 函数只搜索字符串中的第一个 '\0',因此定义为 input[strlen(input) - 1] == '\0'。唯一可以改变的是如果input 不是以空值终止的,并且在用完程序的地址空间之前不会出现任何'\0's,则引入段错误。

标签: c input fgets


【解决方案1】:

我认为这是最易读的(但不是性能):

if (strlen(input) != 0) {
    printf("hi");
}

但是为了教学这里是你的风格,但后来固定了:

if (input[0] != '\0') {
    printf("hi");
}

为什么是input[0]?因为input 就像一个指向数组第一个元素的指针,如果你像这样比较它,你首先必须取消引用它才能使比较有用。

【讨论】:

  • +1,但input 是一个数组,而不是指向数组的指针。在该比较的上下文中,它确实衰减为一个指针,但做出区分很重要。
  • 是的,但是您编辑了相同的(错误的)语句。数组和指针不是一回事,尽管在这种特定情况下它们碰巧可以互换使用。
  • "数组是指针,如果你把它们当作指针" 不,数组可以用作指针,但这并不意味着它 i> 一个指针。
【解决方案2】:

显而易见的方法是:

if (input[0] != '\0')
   printf("hi");

虽然使用strlen 工作,但它可能相当浪费——它将 O(1) 操作变成 O(N)。

【讨论】:

    【解决方案3】:

    当按下返回键时,fgets 将返回一个 '\n';这使得总字符串“\n\0”。您可以与此值进行字符串比较,但更强大的解决方案是“剥离”或“修剪”字符串以删除所有前导和尾随空格(在任何处理之前您都应该这样做),然后检查空字符串.

    最简单的修改是检查是否(*input!='\n')。我应该注意,这还需要您删除以空值结尾的代码,该代码会去掉这个换行符(大概是设计使然)。

    【讨论】:

      【解决方案4】:

      为了安全起见,最好使用这个:

      if(u_input[0] == '\n' && u_input[1] == '\0'){
          printf("hi");
      }
      

      【讨论】:

        猜你喜欢
        • 2018-11-26
        • 1970-01-01
        • 1970-01-01
        • 2021-10-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多