2017-04-13 126 views
0

我是C新手,想要弄清楚数组和命令行参数。我有:C将字符命令行参数转换为整数数组

int main(int argc, int **argv) { 
    int vals[8]; 
    for(int i = 0;i < 8;i = i + 1) { 
     vals[i] = atoi(argv[i]); 
     printf("%d", vals[i]); 
    } 
} 

./file 1 2 3 4 5 6 7 8调用它,我希望它吐出12345678,而是它吐出这对我说,它只是打印阵列位置。我如何才能实际打印/访问vals[i]的值,和/或确保命令行值实际上已正确分配?

在此先感谢。

+3

使用任何其他示例来测试您的程序。试试'./file 8 7 6 5 4 3 2 1'。 –

+0

'atoi'对您的程序名称问题0,因为它无法转换为整数。 –

+0

这就是为什么一般来说,'atoi()'是一个坏主意,你应该使用'strto ___()'函数之一。 –

回答

2

argv[1]开头为了排除第一个元素argv这是程序名。一个简单的方法是在程序的顶部增加argv

int main(int argc, char **argv) { 
    argv++; /* argv[0] is the program name */ 
    int vals[8]; 
    for(int i = 0;i < 8;i = i + 1) { 
     vals[i] = atoi(argv[i]); 
     printf("%d", vals[i]); 
    } 
} 

在一个侧面说明,你应该在argv

+0

为什么完全忽略'argc'? –

+0

请参阅我的编辑。此外,我认为,针对他的特定问题,告诉他未定义行为的可能性超出了范围。 –

+0

这工作完美,谢谢! – user3066571

0

argv的访问在索引i元件之前检查argc值[0]是程序的名称。

参数从1开始。您还应该养成在循环中使用argc的习惯。

int main(int argc, int *argv[]) 
{ 
    for(int i = 1 ; i < argc ; ++ i) 
    { 
     int val = atoi(argv[i]); 
     printf("%d", val); 
    } 
}