这是我的代码:
#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];
由于以下原因,此数组指向的每个字符串都将'\n'
在字符串的末尾fgets()
返回说明的最后一行。您的值是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'
这两个字符串之间只有唯一的区别,它们也将永远不会相等。
有什么办法吗?
由于您知道\n
字符串的末尾可能会有一个,因此您可以检查一下,如果存在则将其删除:
size_t len = strlen(str);
if (len != 0 && str[len-1] == '\n') {
str[len-1] = '\0';
}
这将在处终止行\n
,因此您strcmp
将成功。一种替代方法是使用strncmp
,并传递目标字符串的长度。但是,如果后缀更长,则存在误报的风险\n
。
您还可以像这样读取数据:
fscanf(f, "%99[^\n]", str);
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句