【发布时间】:2014-03-09 15:54:08
【问题描述】:
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int individualAverage(int data[][20],int j)
{
int k,average=0;
for(k=0;k<10;k++)
{
average += data[k][j];
}
return average;
}
int main()
{
int var,indAvg=0;
int i=0,j,k;
char *experiments[20];
int data[10][20];
char str[100],str2[100];
char *ptr, *token;
int no_line=1;
while(fgets(str,100,stdin) != NULL && (strcmp(str,"*** END ***") && strcmp(str,"*** END ***\n")))
{
if(no_line % 2 == 0)
{
k=0;
token = strtok (str," ");
while (token != NULL)
{
sscanf (token, "%d", &var);
data[k++][i] = var;
token = strtok (NULL," ");
}
i++;
}
else
{
ptr = strdup(str);
experiments[i] = ptr;
}
no_line++;
}
fgets(str,100,stdin);
token = strtok(str," ");
while(token != NULL && (strcmp(token,"4") && strcmp(token,"4")))
{
sscanf (token, "%d", &var);
printf("DATA SET ANALYSIS\n1.\tShow all the data\n2.\tCalculate the average for an experiment\n3.\tCalculate the average across all experiments\n4.\tQuit\nSelection: %d\n\n",var);
switch(var)
{
case 1 :
for(j=0;j<i;j++)
{
printf("%s",experiments[j]);
for(k=0;k<10;k++)
{
printf("%d ",data[k][j]);
}
printf("\n");
}
printf("\n");
break;
case 2 :
printf("What experiment would you like to use?\n");
token = strtok (NULL," ");
sscanf (token, "%s", &str);
for(j=0;j<i;j++)
{
if(strcmp(experiments[j],str) == 0)
{
indAvg = individualAverage(data,j);
printf("Experiment: %s",experiments[j]);
printf("The individual average of the experiment is %d\n",indAvg);
break;
}
}
}
token = strtok(NULL," ");
}
}
好的,所以我有一个接受重定向输入行的方法。这些线成对出现。第一行是实验的名称,第二行包含该实验的 10 个值,用空格分隔。在这些对之后,有一个结束行"*** END ***"
在这一行之后,最后一行包含如何处理数据的说明。
我目前遇到一个问题,我使用fgets() 将第一对行的字符串存储到我声明为char *experiments[20]; 的变量中
由于fgets(),该数组指向的每个字符串的末尾都有'\n'
回到最后一行指令。您的值是 1-4。现在我在看指令2。它告诉了一个实验的平均值。所以在最后一行的 2 之后,必须有一个实验的名称。我用过:
char str[100];
int var;
char *token;
token = strtok(str, " ");
sscanf (token, "%d", &var);
将行上的第一个值放入var(假设它是2)。所以在那之后将是一个字符串。说是Test 1,我会用
token = strtok (NULL," ");
sscanf (token, "%s", &str);
将值放入str,然后我会将其与experiments 进行比较以获得所有可能的索引。
但是,因为fgets() 在行尾给出'\n',所以所有实验字符串的末尾都会有'\n',而str 只会有实验的名称而没有'\n',因此它们永远不会即使'\n' 是字符串之间的唯一区别,也要相等。
有什么解决办法吗?
【问题讨论】:
-
您能否提供您的工作代码,并用评论标记您遇到问题的地方?你是说你使用
fgets(),但我没有看到fgets()在任何地方使用...... -
我已经用我的代码更新了它。正如你所看到的,实验基本上是从
str直接输入的,它来自fgets(); -
为什么不喜欢删除
'\n'解决方案? -
我并不讨厌它,只是我在 getline 的手册页中读到了这个,并认为它会更简单:从
is提取字符并将它们存储到str直到找到分隔符 delim (或换行符,'\n',用于 (2))。 -
根据this page,
getline确实包含\n,而getdelim将包含您指定的分隔符...并不是我个人了解这些功能。跨度>