1

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

4

2 回答 2

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 建议的操作,即将参数用双引号括起来,这样整个 thing( -5 5 3 9) 就变成了一个单独的参数并argv[1]保持不变"-5 5 3 9"。当您这样做时,您的代码将按预期工作。

于 2015-03-30T14:02:07.193 回答
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以确保输入值的有效性,而不是忘记程序可能被错误的输入值调用并且您不会知道它为什么不起作用,一个简单的

if (*pEnd != '\0')
 {
    fprintf(stderr, "error: invalid input ... \n");
 }

从长远来看,可以防止很多问题。

忽略错误检查是 c 程序员最常见的错误之一;你会这样做,也许是因为在 c 中这样做很乏味,但这并不意味着它没有必要

如果您希望您的代码正常工作,那么您需要将 4 个数字作为单个参数,这可以通过用双/单 qoutes ""/括起来来实现''

于 2015-03-30T14:00:24.280 回答