【问题标题】:Using atoi to check string使用atoi检查字符串
【发布时间】:2014-02-04 19:15:30
【问题描述】:

我正在尝试使用 atoi 将字符串转换为 int,然后检查字符串是否确实是整数。

这是我的代码:

printf("Please input the port: ");
scanf("%s",port_number);
int i = atoi(port_number);
if(i != port_number)
{
    errno = ERR_INVALID_PARAM;                  
    printf("Error invalid port number\n");
}

但是,即使我的字符串“port_number”是一个整数,它仍然会出现在 if 语句中吗?有什么帮助吗?

【问题讨论】:

  • 你正在尝试比较一个整数和一个字符串...
  • 不能用这种方式比较整数和字符串。看这里stackoverflow.com/questions/3850558/…
  • 您的示例不完整。我们至少缺少port_number的定义。
  • 你是用 C 语言写的吗?还是 C++?
  • port_number 是如何声明的?如果是int,那么您的电话scanf("%s",port_number) 具有未定义的行为;第二个参数需要是一个char*,指向一个足够大的缓冲区来保存结果(对于一个裸"%s",可以任意长)。如果是char*,那么比较i != port_number 甚至不应该编译。 (实际上 gcc 只是发出警告,但您需要注意警告。)请给我们一个完整的程序。由于您不知道问题是什么,因此您不知道代码的哪些部分是不相关的。 sscce.org

标签: c string atoi


【解决方案1】:

在将传入的字符串转换为 int 之前,您需要对其进行一些错误检查。您可能想尝试 strtol() 函数。它检查字符串是否可以转换为 long int。它返回转换后的值,如果字符串无法转换,则返回零。

strtol() 的第二个参数是一个字符**。函数完成后,它指向字符串中第一个不是合法数字字符的字符。因此,如果它指向字符串末尾之前的任何位置,则转换失败。

http://www.tutorialspoint.com/c_standard_library/c_function_strtol.htm

【讨论】:

    【解决方案2】:

    我假设 port_number 的类型是 char *。

    您那里的 if 语句是将 port_number C 字符串的地址与 i 的值进行比较,我认为这不是您想要做的。

    如果你想使用ctype.h,那么你可以使用函数“isdigit()”来检查port_number的每个元素。否则,下一个最好的方法是循环访问 port_number,并确定每个元素是否在 ascii char '0' 和 '9' 之间,以确保正确输入端口号。

    【讨论】:

    • 如果port_numberchar* 类型,那么比较i != port_number 甚至不应该编译。至少,应该有一个警告。 (默认情况下,gcc 只会对此发出警告。)
    【解决方案3】:

    想想你在那里比较的是什么:

    if(i != port_number)
    {
        //code
    }
    

    i 是 int 类型,port_number 是 char*。

    【讨论】:

    • @fede1024 打败了我 :)
    【解决方案4】:
    char *check = strdup(port_number);
    sprintf(check, "%i", i);
    if(strcmp(check, port_number))
    

    【讨论】:

      猜你喜欢
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多