【问题标题】:Iterating over a string input迭代字符串输入
【发布时间】:2013-02-20 06:35:30
【问题描述】:

我正在尝试遍历一个字符串以查看输入是否为整数。

这是代码:

 for (int i = 1; i < strlen(buffer); i++) //Checking that each character of the string is numeric
    {
        if (!isdigit(buffer[i]))
        {
            valid = false;
            break;
        }
    }

    if(valid == false)
    {
        printf("Invalid input!");
    }

    else
    {
        num = atoi(buffer);
        printf("The number entered is %d", num);
    }

问题是即使输入正确,比如说2,输出消息仍然是“无效输入!”。

我现在很沮丧。我尝试过使用 atoi 函数、strtol 函数和其他方法,以便我可以验证一个数字并确保:

1) 这不是一个字母 2) 它是一个整数

请帮助我。我已经尝试解决这个问题超过 2 小时。

【问题讨论】:

  • 您需要发布您的 isdigit 代码
  • isdigit 是 ctype.h 库提供的方法。我不是自己创建的
  • 这显然是不是 过于本地化。代码 sn-p 很明显,但输出却出乎意料。
  • 阅读 man 页面会有所帮助。以及学习如何使用调试器。
  • 而且还是int main(void)

标签: c validation input integer fgets


【解决方案1】:

由于fgets 读取一行,'\n'(不是数字)可能会保留在字符串的末尾。你可以删除它:

#include <string.h>

char *pend = strrchr (buffer, '\n');

if (pend != NULL) *pend = '\0';

【讨论】:

  • 非常感谢Kirilenko :))) 它完全解决了这个问题。代码到底在做什么。是用 \0 代替 \n 吗?
  • 非常感谢。所以 pend 是一个指向空终止字符的数据指针,如果 pend 不为空(找到空终止字符),它会将其替换为 \0?
  • 它将字符串的最后一个换行符替换为\0。如果没有找到换行符,取消引用pend 会导致未定义的行为,所以我们避免这种情况。
  • 再次感谢 :) 抱歉,如果我问这样的问题,但我对 C 有点陌生。
  • @Matthew:无需抱歉。如果问题问得好,很高兴回答。 ;-)
猜你喜欢
  • 1970-01-01
  • 2017-12-15
  • 2014-04-21
  • 2012-10-23
  • 2011-06-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多