【问题标题】:In C, how can I check if the content of a string is not a number (where negative numbers are allowed)? [closed]在 C 中,如何检查字符串的内容是否不是数字(允许负数)? [关闭]
【发布时间】:2014-11-09 06:33:09
【问题描述】:

假设我的字符串是“g9”。我希望我的检查表明该字符串不包含数字。然而 如果我的字符串是“123”或“-123”,它应该表明它是一个数字,它应该返回那个字符串。

【问题讨论】:

  • "g9" 确实包含数字 9
  • 我认为他的意思是没有数字。使用 std::none_of 和 std::isdigit。
  • char *endptr; strtol(test_string, 10, &endptr); if (test_string == endptr || *endptr) Bad_Input();
  • 到目前为止你尝试过什么代码?
  • 如果字符串是0xA9e1,你想要什么作为判断?它们是十六进制和浮点数。 98765432109876543210呢?它是一个有效的十进制整数,但大于适合 64 位整数。您可能想调查strtol()strtod(),看看他们在成功将字符串转换为数字时是否使用了字符串中的所有内容。

标签: c string numerical


【解决方案1】:

这至少可以通过两种方式完成:

  1. 使用atoi 函数解析字符串直到遇到第一个无效字符并返回到目前为止评估的整数。不幸的是,它几乎没有提供诊断方法。

  2. 更好的选择是strtol,它基本上做同样的事情,但返回指向第一个无效字符的指针,并在遇到任何错误时设置errno。典型用法:

    #include <stdlib.h>
    ...
    const char* const numStr = "123";
    char* end;
    const long i = strtol(numStr, &end, 10);
    

    end 参数允许您检查整个字符串是否被识别为有效数字(在这种情况下对应的字符是'\0'):

    const int ok = (*end == '\0' && end != numStr);
    

按照提供的链接获取示例和更多信息。另外,您可以在另见部分考虑相关功能。

【讨论】:

  • 注意标签:这个问题是关于 C 的,你已经发布了 C++。
  • 看来您正在将 c++ 命名空间语法与 c 混合。不需要std::bool。否则你的答案是正确的。 (更好 - 现在修复 long i = ...1 2 中的文本)就可以了。
  • @David 你是对的。更新了我的答案。
  • strtol(numStr, &amp;end, 10); ok = (*end == '\0') 未能检测到"" 的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-10-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
相关资源
最近更新 更多