所以我目前正在上这门CS50课程,我似乎无法弄清楚所提到的错误/崩溃与什么有关!
我正在尝试让我的代码检查命令行输入是否为整数。例如,。/ caesar 2有效,但./caesar 2z返回./caesar键。
#include <cs50.h>
#include <stdio.h>
#include <ctype.h>
//string error_key = "./caesar key \n";
int main(int argc, string argv[])
{
if (argc == 2)
{
if (isdigit(argv[1]) == 0)
{
printf("./caesar key \n");
return 1;
}
else
{
int string_to_int = atoi(argv[1]);
printf("%i\n",string_to_int);
}
}
else
{
printf("./caesar key \n");
return 1;
}
}
答案 0 :(得分:1)
这是未定义的行为:
isdigit(argv[1])
argv[1]
不是字符,而是指针。由于指针最有可能具有比unsigned char
中表示的值高的值,因此会导致LLVM的未定义行为清除器出错。
从POSIX报价,该价格符合ISO C标准:
c参数是一个整数,应用程序应确保该整数的值是可表示为无符号字符或等于宏EOF值的字符。如果该参数具有任何其他值,则行为是不确定的。