我正在使用atoi(argv[1])
以下是我的代码片段
void main(int argc, char* argv[])
{
int evenOrOdd = 0;
int inputtedNum = 0;
pid_t pid;
int i;
char buf[BUF_SIZE];
if (argc != 2)//make sure user has input correctly entered
{
printf("Please use input: ./a.out #\n");
}
else
{
inputtedNum = atoi(argv[1]);
if(inputtedNum < 0) //make sure number is positive
{
printf("Please use a positive number.\n");
return;
}
}
// ...
}
代码还在继续,但是当输入一些数字时,它有时会认为它们是负面的。如果我输入123456789它将没有问题并正确运行程序。如果我输入12345678910它会认为该数字是负数。我在这里遇到一些缓冲区错误到负标志触发器的位置?我不太确定如何解决它。
感谢任何和所有帮助!
答案 0 :(得分:0)
int
是一个相对较窄的整数类型,也是一个带符号的类型。使用unsigned long
inputtedNum
和strtoul(argv[1], 0, 0)
来解析数字。
答案 1 :(得分:0)
在大多数编译器中,C中支持的最大非负整数类型是64位无符号整数。
12345678910无法存储在您使用的int
类型中,即使它是unsigned long
。
您可以通过将argv[1]
中的输入字符串“划分”为两个字符串来解决此问题,当它超过8位时,在每个字符串上使用atoi
,并将结果合并到{ {1}}变量。
这会将您的正范围从大约40亿扩展到最大的16位小数。
从unsigned long long
,致电main
:
readNum(argv[1])
请注意,为了打印unsigned long long readNum(const char* input)
{
int length = strlen(input);
if (length <= 8)
{
return atoi(input);
}
else if (length <= 16)
{
char str1[8+1] = {0};
char str2[8+1] = {0};
memcpy(str1,input,8);
memcpy(str2,input+8,length-8);
return 100000000ULL*atoi(str1)+atoi(str2);
}
return 10000000000000000ULL; // Invalid input
}
,您需要将unsigned long long
与printf
一起使用。