重定向输入在C:fgets()行“ \ n”的末尾干扰strcmp()

用户名

这是我的代码:

#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'这两个字符串之间只有唯一的区别,它们也将永远不会相等

有什么办法吗?

谢尔盖·卡里尼琴科(Sergey Kalinichenko)

由于您知道\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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

fgets在输入末尾添加\ 0或\ n吗?

来自分类Dev

fgets在输入末尾添加\ 0或\ n吗?

来自分类Dev

中断(n)干扰输入信号

来自分类Dev

使用C中的输入重定向从文件读取行

来自分类Dev

在C中使用fgets和strcmp

来自分类Dev

strcmp无法用于fgets文件读取输入字符串

来自分类Dev

C编程中的输入重定向?

来自分类Dev

UNIX C编程输入重定向命令

来自分类Dev

重定向到末尾带有“ /”的路径

来自分类Dev

从文件重定向输入

来自分类Dev

C将标准输入重定向到键盘

来自分类Dev

将空文件重定向为C中的输入

来自分类Dev

使用C在Linux Shell中实现输入/输出重定向

来自分类Dev

C ++-使用io重定向输入和输出多个整数

来自分类Dev

具有重定向的输入和输出的MadLib C程序

来自分类Dev

C ++-使用io重定向输入和输出多个整数

来自分类Dev

C 重定向导致 scanf 不接受输入

来自分类Dev

在特定行的末尾输入IP

来自分类Dev

在页面之间重定向时,URL末尾有奇怪的#号

来自分类Dev

如何防止在重定向的URL末尾添加jsessionid

来自分类Dev

301从非斜杠重定向到末尾的斜杠

来自分类Dev

htaccess重定向(如果网址末尾使用多斜杠)

来自分类Dev

.htaccess 将 AMP 从 URL 中间重定向到末尾?

来自分类Dev

使用python输入重定向

来自分类Dev

输入和输出重定向

来自分类Dev

使用输入重定向路线

来自分类Dev

输入表单后重定向

来自分类Dev

输入重定向如何工作?

来自分类Dev

输入重定向如何工作?