我只是试图将4个命令行参数放入4个int中。它适用于第一个参数,但在其余部分返回0,我似乎无法看到我做错了什么。
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char** argv) {
char* pEnd;
long li1, li2, li3, li4;
li1 = strtol(argv[1],&pEnd,10);
li2 = strtol(pEnd,&pEnd,10);
li3 = strtol(pEnd,&pEnd,10);
li4 = strtol(pEnd,NULL,10);
例如,如果我将程序作为./a.out -5 5 3 9
运行,则解析后的值为-5 0 0 0
。
答案 0 :(得分:2)
您提供参数-5 5 3 9
。这意味着
argv[1]
包含"-5"
argv[2]
包含"5"
argv[3]
包含"3"
argv[4]
包含"9"
您使用
li1 = strtol(argv[1],&pEnd,10);
现在,li1
包含-5
,pEnd
包含""
,一个空字符串。以下语句失败并返回0,因为strtol
无法从空字符串pEnd
中提取数字
li2 = strtol(pEnd,&pEnd,10);
li3 = strtol(pEnd,&pEnd,10);
li4 = strtol(pEnd,NULL,10);
要解决此问题,您可以使用
li1 = strtol(argv[1], NULL, 10);
li2 = strtol(argv[2], NULL, 10);
li3 = strtol(argv[3], NULL, 10);
li4 = strtol(argv[4], NULL, 10);
并删除pEnd
,因为它是不必要的。
另一种方法是执行@BLUEPIXY suggested,即用双引号包装参数,以便整个事物(-5 5 3 9
)成为单个参数,argv[1]
保持{{ 1}}。执行此操作时,您的代码将按预期工作。
答案 1 :(得分:1)
问题是每个数字都作为单个参数传递,所以实际上这可以做你想做的事情
long li1, li2, li3, li4;
li1 = strtol(argv[1], &pEnd, 10);
li2 = strtol(argv[2], &pEnd, 10);
li3 = strtol(argv[3], &pEnd, 10);
li4 = strtol(argv[4], &pEnd, 10);
在这里你可以检查pEnd
以确保输入值的有效性,而不是忘记用错误的输入值调用程序,你不知道为什么它不起作用,一个简单的< / p>
if (*pEnd != '\0')
{
fprintf(stderr, "error: invalid input ... \n");
}
从长远来看,可以防止很多问题。
省略错误检查是程序员明显犯下的最常见的错误之一;也许是因为在c中这是一件单调乏味的事情,但这并不意味着它不是必要。 / p>
如果您希望您的代码有效,那么您需要将4个数字作为一个参数,这可以通过用双/单qoutes ""
/ ''
括起数字来实现。