我想将第一个命令行参数分成两个不同的数字。这样运行程序时出现分段错误错误:
gcc -ansi main.c -o main
./main 6000V7000
这是源代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
char *token;
char arr[200];
strcpy(arr, argv[1]);
token = strtok(arr, "v,V");
int firstNumber = atoi(token);
token = strtok(NULL, "v,V");
int secondNumber = atoi(token);
return 0;
}
如何解决此问题?
答案 0 :(得分:3)
您不会测试是否至少有一个命令行参数,或者该参数的长度小于200个字符,也不会测试strtok
的返回值:如果使用该命令,您将有未定义的行为不会给出任何自变量,或者自变量不包含任何字符v
,V
或,
。
如果您使用gcc -ansi main.c -o main
有效地编译了程序,并使用发布的参数./main 6000V7000
运行了该程序,则不会出现分段错误……您没有告诉我们什么;)>
总是最好避免大胆的假设:测试意外情况,以在所有情况下为程序定义行为。
这是使用sscanf()
解决问题的一种简单方法:
#include <stdio.h>
int main(int argc, char *argv[]) {
int a, b;
if (argc > 1 && sscanf(argv[1], "%d%*1[vV,]%d", &a, &b) == 2)
printf("a=%d, b=%d\n", a, b);
return 0;
}
答案 1 :(得分:1)
给出的代码和命令行参数不存在段错误。但是,如果命令行参数忽略定界符,在第二个数字之前包含空格或完全忽略任何参数,则它将失败。
以下内容将防止输入错误导致运行时错误:
if( argc > 1 )
{
strcpy( arr, argv[1]);
int firstNumber = 0 ;
int secondNumber = 0 ;
token = strtok(arr, "v,V");
if( token != NULL )
{
firstNumber = atoi(token) ;
token = strtok(NULL, "v,V") ;
if( token != NULL )
{
secondNumber= atoi(token);
}
}
}
答案 2 :(得分:-1)
您的输入中只有一个"V"
。对strtok()
的第二次调用未找到V,并返回NULL
。
答案 3 :(得分:-1)
您必须在函数的开头定义var:
关注code
可能会起作用:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]){
char *token;
char arr[200];
int firstNumber;
int secondNumber;
strcpy( arr, argv[1]);
token = strtok(arr, "v,V");
firstNumber = atoi(token);
token = strtok(NULL, "v,V");
secondNumber= atoi(token);
return 0;
}