【问题标题】:sscanf() not working properly when testing for integersscanf() 在测试整数时无法正常工作
【发布时间】:2013-04-04 03:43:09
【问题描述】:

嗨,我正在尝试使用 sscanf 来测试一个字符串是否为整数,但它总是给出零作为返回值(j),当它给出 1(有时没有任何更改)时,它没有在应收账款中填充正确的值变量(i)!这是我的代码:

#include <stdio.h>                               

int main ()                                      
{                                                

  char sentence []="123456";                     
  int i=0;                                       

   j = sscanf(sentence,"%[0-9]",&i);              
   return 0;                                      
}   

请让我知道我哪里出错了!我知道还有其他方法可以测试字符串的整数,但我想知道我哪里出错了! 帮助将不胜感激!在此先感谢

【问题讨论】:

  • 您将数组sentence 声明为类型char,因此它将包含字符。尝试int sentence2[5] = {1,2,3,4}; 并检查输出。
  • 测试一个前导整数很容易。 %d。还是您需要比这更钝的东西? set-notation 仅适用于 char 类型(包括字符串),而不适用于整数。所以无论这需要改变什么。
  • 我在这里有些困惑..根据我的理解,它将检查变量句子中的值,如果它在 0-9 之间,它将成功转换,如果不是,则不会并返回 0 。如果我是对的,那么它应该返回 1 。如果我错了,请纠正我,因为我无法完全理解你们提出的建议! :(
  • 你很困惑。正如我在上面和下面所说的,基于集合的格式说明符(即格式字符串中的 [0-9])只能提取 character 数据。 IE。它需要进入一个 character 缓冲区。如果能够提取字段,sscanf() 将返回 1。这是正确的。查看documentation for sscanf() 了解更多信息。但最重要的是,实现使用基于集合的格式说明符进行扫描时不会发生字符到整数的转换

标签: c


【解决方案1】:

如果您想将sscanf() 用于仅验证数字(我不建议您这样做),则您的格式已关闭。您必须仅使用 char 类型来收集提取的数据:

试试这个:

char message[] = "123456";
char buffer[128];

if (sscanf(message, "%127[0-9]",buffer) == 1)
    printf("Success : %s\n", buffer);

并调整范围(例如,将其更改为 [2-9])以帮助理解基于集合的提取是如何工作的。但同样,您只能将它们放入 char 类型的缓冲区中。

也就是说,如果您需要该值,或者如果您只是想验证数字内容,请使用 strtol()atoi()(但仅在必须时),isdigit() 可能更合适。由你决定。

【讨论】:

  • 基本上我想一次性捕获整数和浮点值!所以如果我必须使用 isdigit() 函数,那么我必须一个一个地选择每个字符,然后检查转义小数点的数字。我正确吗?
  • @abhinavsingh 是的,这将是一种皇家痛苦。如果这是针对真正的词法分析器,则无论如何您都可能必须这样做。您最好验证您的浮点数不需要支持 E 指数格式,顺便说一句。 (也是一种皇家痛苦)
【解决方案2】:

也可以尝试strtol() 来满足您的需求。见:atol() v/s. strtol()

【讨论】:

  • @WhozCraig 感谢您的关注。不知道我在想什么(脑子放屁)。编辑答案。
猜你喜欢
  • 2017-01-24
  • 1970-01-01
  • 2017-08-03
  • 1970-01-01
  • 1970-01-01
  • 2019-09-06
  • 2014-07-12
  • 1970-01-01
相关资源
最近更新 更多