【问题标题】:parse integer without appending char in C解析整数而不在 C 中附加 char
【发布时间】:2017-04-30 20:56:54
【问题描述】:

我想解析一个整数,但我的以下代码也接受像“3b”这样的字符串,它以数字开头但附加了字符。如何拒绝这样的字符串?

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int n;
    if(argc==2 && sscanf(argv[1], "%d", &n)==1 && n>0){
        f(n);
        return 0;
    }
    else{
        exit(EXIT_FAILURE);
    }
}

【问题讨论】:

  • 你不要使用sscanf();您使用strtol() 或类似名称,并检查结束指针指向的位置。或者,如果您必须使用sscanf(),则使用int pos; … if (… &amp;&amp; sscanf(argv[1], "%d%n", &amp;n, &amp;pos) == 1) — 请注意,%n 不计为转换,因此比较仍然针对1,而不是2。然后检查argv[1][pos] 是否为空字节,如果不是则抱怨。

标签: c scanf


【解决方案1】:

对于您的问题,您可以使用 #include &lt;stdlib.h&gt; 库中的 strtol() 函数。

如何使用strtol(Sample code from tutorial points)

#include <stdio.h>
#include <stdlib.h>

int main(){
   char str[30] = "2030300 This is test";
   char *ptr;
   long ret;

   ret = strtol(str, &ptr, 10);
   printf("The number(unsigned long integer) is %ld\n", ret);
   printf("String part is |%s|", ptr);

   return(0);
}

strtol 内部,它扫描str,将单词存储在指针中,然后是要转换的数字的基数。如果底数在 2 到 36 之间,则用作数字的基数。但我建议将 0 放在 10 的位置,这样它会自动选择正确的数字。其余的存储在ret

【讨论】:

  • 你应该解释如何拒绝字符串,如"3b"
【解决方案2】:

ctype.h 库为您提供函数 isdigit(char) 函数,该函数返回作为参数提供的 char 是否为数字。
您可以遍历 argv[1] 并以这种方式进行检查。

【讨论】:

  • 如果只接受一位整数,则使用isdigit() 是合理的。如果允许多位整数,那么isdigit() 不是一个很好的解决方案。最好使用字符串到整数的转换函数来转换和检查(所以strtol() et al 而不是atoi())。
猜你喜欢
  • 2012-07-05
  • 2011-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
相关资源
最近更新 更多