【发布时间】:2014-03-10 22:08:47
【问题描述】:
我正在编写从命令行(重定向的文本文件)获取输入并将数据发送到 c 中的数组的代码。但是,每当我运行它时,都会出现分段错误(核心转储)错误。这是我的代码:
int main(int argc, const char * argv[])
{
char *experiments[20];
int data[10][20];
int b=0;
char *name = NULL;
name=malloc(100);
sendToArray(data, experiments);
while(b==0){
int input=0;
printf("\n");
printf("Data set analysis\n");
printf("1. Show all the data\n");
printf("2. Calculate the average for an experiment\n");
printf("3. Calculate the average across all experiments\n");
printf("4. QUIT\n");
printf("Selection: ");
scanf("%d", &input);
switch (input) {
case 1:
if(argc!=0){
displayAll(data, experiments);
}
else{
printf("Oops, something went wrong!\n");
}
break;
case 2:
if(argc!=0){
printf("\n");
printf("Enter the name of the experiment: ");
scanf("%[^\n]", name);
individualAverage(name, experiments, data);
}
else{
printf("Oops, something went wrong!\n");
}
break;
case 3:
if(argc!=0){
allAverage(experiments, data);
}
else{
printf("Oops, something went wrong!\n");
}
break;
case 4:b=1;;
break;
default:
printf("Oops, something went wrong!\n");
break;
}
}
return 0;
}
这是main的开头,调用了这个函数:
void sendToArray(int data[10][20], char *experiments[20]){
char line[100];
char line2[100];
char *temp1;
int temp;
int i=0, c=0;
while(!strcmp(line, "*** END ***")){
scanf("%[^\n]", line);
scanf("%*c");
scanf("%[^\n]", line2);
scanf("%*c");
for(i=0; i<10; i++){
temp1 = strtok(line2, " ");
temp = atoi(temp1);
data[c][i] = temp;
}
experiments[c] = line;
c++;
}
numExperiments = c+1;
}
我将函数更改为为每行分配 100 位内存,但我仍然得到核心转储。此外,如果我确实重定向了一个文本文件,程序将无限循环通过 main。 谢谢谁能帮我找出我的错误!
这是我的示例输入文件!,在 bash 中由 ./dataset 调用
Experiment One
3 10 8 7 3 2 9 7 5 6
Experiment Two
10 20 30 40 50 60 70 80 90 100
Control Group
5 5 5 5 5 5 5 5 5 5
*** END ***
好的,谢谢大家,我修复了内存转储,但是,每当我通过管道传输文本文件时,程序仍然无限循环。
【问题讨论】:
-
如果您提供了示例输入文件,人们可能会提出解决问题的好方法,而不仅仅是纠正少数错误。
-
现在您需要更正我的回答中指出的其他错误。
-
while(!strcmp(line, "*** END ***")) {可能永远不会运行循环......它会在一行 isn't "*** END ***" 时终止。 -
@dmitri 你确定吗?有没有!不改吗?
-
...不过还有很多其他问题。