有一些代码似乎可以工作,但突然之间,每次运行代码时,我都会遇到分段错误。
希望有一双新的眼睛能帮我找到问题所在。
它运行这条线路(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_se42((中的0x00007ffff7b4c196
getSum
中的索引需要一些修复。输入list
为[0-程序、1-"总和"、2-"3"和3-"4"]。并且n=4。但是,总和外观从3变为4(包括4(。列表中没有触发SEGV的元素#4。
考虑将循环限制为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)));
的打印输出。它重复了第二个参数,这不是您想要的。