我有以下代码:
#include <stdio.h>
int main ( int argc, char *argv[] )
{
int M, N;
M = 1;
N = 1;
curr = 1;
if ( argv[1][0] == '-' )
{
curr = 2;
char *a = argv[1][1];
char *b = argv[1][3];
M = atoi(a);
N = atoi(b);
}
printf("%d\n%d", M, N);
}
所以,我通过这个程序:
a.out -1,2
而不是获得预期的输出
1
2
我遇到了分段错误。是什么给了什么?
答案 0 :(得分:8)
#include <stdlib.h>
它应该变得明显。
详细说明:您将一个整数传递给需要指针的函数,编译器无法警告您,因为您忘记使用原型声明该函数。这是事故的原因。
此外,你只是在滥用atoi
。 atoi
解析字符串,而不是单个字符。如果您希望将字符的值作为数字,只需减去'0'
:
M = argv[1][1]-'0';
N = argv[1][3]-'0';
在实践中,你还应该检查角色是否真的是一个数字。
编辑:我不记得char *a = argv[1][1];
在原帖中(可能早期编辑没有显示为编辑?),但任何理智的编译器都应该编译 - 该行的时间错误。整数不会隐式转换为C中的指针。如果编译器确实允许这样做,那么包含atoi
的原型将不再有用,因为类型错误发生得更早。
答案 1 :(得分:8)
编译?!
char argv * []是一个char指针数组。
char *a = argv[1][1]
将
char *
。所以现在你要为char指针指定一个char(这应该是一个编译错误)。
我只能假设你想说char *a = &argv[1][1]
。顺便说一句,const-correctness也不错,所以const char *a = &argv[1][1]
。
顺便说一下,你的代码仍然非常不安全 - 你甚至不检查字符串的大小。想象一下,如果你的字符串只有两个字符,&argv[1][3]
会做什么。
答案 2 :(得分:2)
atoi需要一个字符串,而不是一个字符。
此外,atoi一般不好,因为它基本上没有错误报告。你应该在大多数情况下调查strtol。