试图在c中使用strtol(),但它只用于第一个参数

时间:2015-03-30 13:44:58

标签: c strtol

我只是试图将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

2 个答案:

答案 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包含-5pEnd包含"",一个空字符串。以下语句失败并返回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 "" / ''括起数字来实现。