有些代码似乎可以正常工作,但是每次运行代码时,突然我开始遇到分段错误。
希望新鲜的眼睛可以帮助我找到问题所在。
它运行这一行(printf("There are %d arguments excluding (%s)\n", count-1, *(input));
),然后崩溃。
我尝试使用gdb并遍历我的代码,但似乎找不到问题。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int getDiff(char **list[], int n);
int getSum(char *list[], int n);
int main( int count, char *input[] )
{
int total;
printf("There are %d arguments excluding (%s)\n", count-1, *(input));
if(strcmp(*(input+1),"sum") == 0){
int i;
for(i = 2; i<=count;){
printf("%d ", atoi(*(input + 2)));
i++;
if(i < count){
printf("+ ");
}
}
total = getSum(input, count);
}
if(strcmp(*(input+1),"diff") == 0){
total = getDiff(&input, count);
}
printf(" === %d ====", total);
}
int getDiff(char **list[], int n){
int i;
int total = atoi(**(list + 2));
for (i=3; i<= n;) {
int convert;
convert = atoi(**(list + i));
total = total - convert;
i++;
}
return total;
}
int getSum(char *list[], int n){
int i;
int total = atoi(*(list + 2));
for (i=3; i<= n;) {
int convert;
convert = atoi(*(list + i));
total = total + convert;
i++;
}
return total;
}
应运行并返回从数字转换而来的整数之和。
这是gdb告诉我的
程序收到信号SIGSEGV,分段错误。 /lib64/libc.so.6中__strcmp_sse42()中的0x00007ffff7b4c196
答案 0 :(得分:3)
getSum
中的索引需要一些修正。输入list
是[0-程序,1-“和”,2-“ 3”和3-“ 4”]。并且n = 4。但是,总和从3变为4(包括4)。列表中没有任何元素#4触发了SEGV。
请考虑将循环限制为i<n
,而不是i<=n
。
明智地使用样式,将i ++移至“ for”语句,声明变量并将其设置在同一行,然后考虑使用索引而不是指针样式引用(list [i]而不是*(list + i) 。它将使代码更易于阅读,并有望提高评分!
int getSum(char *list[], int n){
int total = atoi(*(list + 2));
for (int i=3; i< n; i++) {
int convert = atoi(*(list + i));
total = total + convert;
}
return total;
}
最后,请考虑修复变量printf("%d ", atoi(*(input + 2)));
的打印输出。它复制了第二个参数,这不是您想要的。