strcmp 的分段错误(核心转储)错误
Segmentation fault (core dumped) error with strcmp
文件名为 "options"。
每当我在控制台中 运行 这段代码时,这里我有一些可能性:
./options -c
./options -c -E
我收到 消息:"Segmentation fault (core dumped)"
真的不知道该怎么做,我可能需要一些帮助。
#include <stdio.h>
int main(int argc, char *argv[]){
int i;
for(i = 0; i < argc; i++){
if(strcmp((argv[i],"-c") == 0)){
printf("Argumento %d es %s\n", i, "Compilar");
}
else if(strcmp((argv[i],"-E") == 0)){
printf("Argumento %d es %s\n", i, "Preprocesar");
}
else if(strcmp((argv[i],"-i") == 0)){
printf("Argumento %d es %s\n", i, "Incluir " );
}
}
}
您需要对代码进行几处更改:
1. 添加 string.h
header
2. re-write strcmp
行:现在是 - strcmp((argv[i],"-c") == 0)
经过上述更改:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
int i;
for(i = 0; i < argc; i++){
if(strcmp(argv[i],"-c") == 0){
printf("Argumento %d es %s\n", i, "Compilar");
}
else if(strcmp(argv[i],"-E") == 0){
printf("Argumento %d es %s\n", i, "Preprocesar");
}
else if(strcmp(argv[i],"-i") == 0){
printf("Argumento %d es %s\n", i, "Incluir " );
}
}
}
输出:
$ ./a.out -E
Argumento 1 es Preprocesar
这段代码有几个问题。首先,您应该启用编译器警告(并始终检查它们!)。如果这样做,您会看到类似这样的内容:
warning: implicit declaration of function strcmp
这是一个非常重要的警告:这意味着您忘记了正确的 #include
并且编译器只会猜测,在这种情况下是错误的。
如果您查看自己喜欢的 C 文档,您会发现 strcmp
需要 #include <string.h>
。如果你添加它,你会得到一条有用的消息,这次是一个硬错误:
error: too few arguments to function strcmp
还有一些额外的有用警告:
warning: left-hand operand of comma expression has no effect
warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
考虑到这一点,仔细检查您的函数调用:
if(strcmp((argv[i],"-c") == 0))
strcmp()
只有一个参数,就是这个比较(argv[i],"-c") == 0
的结果,你比较一个字符串"-c"
(逗号运算符左边被忽略) 0
是一个 NULL
指针。你可能想写:
if (strcmp(argv[i], "-c") == 0)
文件名为 "options"。 每当我在控制台中 运行 这段代码时,这里我有一些可能性:
./options -c
./options -c -E
我收到 消息:"Segmentation fault (core dumped)"
真的不知道该怎么做,我可能需要一些帮助。
#include <stdio.h>
int main(int argc, char *argv[]){
int i;
for(i = 0; i < argc; i++){
if(strcmp((argv[i],"-c") == 0)){
printf("Argumento %d es %s\n", i, "Compilar");
}
else if(strcmp((argv[i],"-E") == 0)){
printf("Argumento %d es %s\n", i, "Preprocesar");
}
else if(strcmp((argv[i],"-i") == 0)){
printf("Argumento %d es %s\n", i, "Incluir " );
}
}
}
您需要对代码进行几处更改:
1. 添加 string.h
header
2. re-write strcmp
行:现在是 - strcmp((argv[i],"-c") == 0)
经过上述更改:
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]){
int i;
for(i = 0; i < argc; i++){
if(strcmp(argv[i],"-c") == 0){
printf("Argumento %d es %s\n", i, "Compilar");
}
else if(strcmp(argv[i],"-E") == 0){
printf("Argumento %d es %s\n", i, "Preprocesar");
}
else if(strcmp(argv[i],"-i") == 0){
printf("Argumento %d es %s\n", i, "Incluir " );
}
}
}
输出:
$ ./a.out -E
Argumento 1 es Preprocesar
这段代码有几个问题。首先,您应该启用编译器警告(并始终检查它们!)。如果这样做,您会看到类似这样的内容:
warning: implicit declaration of function
strcmp
这是一个非常重要的警告:这意味着您忘记了正确的 #include
并且编译器只会猜测,在这种情况下是错误的。
如果您查看自己喜欢的 C 文档,您会发现 strcmp
需要 #include <string.h>
。如果你添加它,你会得到一条有用的消息,这次是一个硬错误:
error: too few arguments to function
strcmp
还有一些额外的有用警告:
warning: left-hand operand of comma expression has no effect warning: passing argument 1 of ‘strcmp’ makes pointer from integer without a cast
考虑到这一点,仔细检查您的函数调用:
if(strcmp((argv[i],"-c") == 0))
strcmp()
只有一个参数,就是这个比较(argv[i],"-c") == 0
的结果,你比较一个字符串"-c"
(逗号运算符左边被忽略) 0
是一个 NULL
指针。你可能想写:
if (strcmp(argv[i], "-c") == 0)