为什么我的条件不起作用?使用 fgets 输出

Why is my conditional not working?using fgets output

提问人:gettingAway 提问时间:8/2/2023 最后编辑:chqrliegettingAway 更新时间:8/2/2023 访问量:64

问:

我需要一种方法来获取每个输入字符并将它们放入 2D 数组(在本例中为数组)中。char

但是由于我需要从具有几行末尾 () 的文件输入中获取此内容,因此我不希望将它们插入数组中,因此我试图制作一个条件,即如果字符是换行符,则不应将其放置在数组中,但它似乎不起作用。\n

为了清楚起见,我正在尝试自己制作这种方法,因为我没有在网上找到,而且是我找到的最好的方法。fgets

我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {

    char words[4][4][2];
    char verif[2];
  
    int i, j, l = 0, lin = 4, col = lin;

    printf("Insert numbers: ");
    for (i = 0; i < lin; i++)
    {
        for (j = 0; j < col; j++)
        {
            fgets(verif, 2, stdin);
            //since I was using the IDE to write I also put a condition not to add the enter for the input but it doesn't work too lol

            if (strcmp(verif, "\n\0") != 0 || strcmp(verif, "\r\0") != 0)
            {
                printf("copying...\n");
                printf("%s\n", verif);
                strcpy(words[i][j], verif);
                l++;
            }
            else
                j--;
        }
    }

    printf("\n");
        
    for (i = 0; i < lin; i++)
    {
        for (j = 0; j < col; j++)
        {
            printf("-%s\t", words[i][j]);
        }
        printf("\n");
    }

    return 0;
}

我将用于放置在矩阵中的输入:

1234
1234
1234
1234

使用正常输入,如输出(printf 矩阵)是可以的:1234123412341234

-1  -2  -3  -4  
-1  -2  -3  -4  
-1  -2  -3  -4  
-1  -2  -3  -4
C 输入 文件-IO 换行符 fgets

评论

1赞 Aconcagua 8/2/2023
strcmp 比较整个字符串 - 您可能只想搜索换行符,因此 - 并且您不需要检查任何一个,该字符无论如何都不会通过 API( 减少到仅,除非您在二进制模式下打开文件)。strchr(verif, '\n')\r\r\n\n
3赞 Fe2O3 8/2/2023
使用和丢弃 or 字符会简单得多。fgetc()'\n''\r'
2赞 Aconcagua 8/2/2023
回到@Armali:这里是错误的!您将输入与两个不相等的值进行比较——因此,无论您的输入看起来如何,它最多只能等于其中一个值——这意味着它与另一个值仍然不相等——因此,如果不是两个值,其中一个总是正确的......您需要检查字符串是否不等于两者中的任何一个,因此不等于它们中的任何一个,因此您需要(而第二个无论如何都已过时)||&&
1赞 Aconcagua 8/2/2023
仅仅检查第一个字符是一种优化——真正的错误是使用 而不是 ,@Armali一开始就暗示了这一点,我也试图在前面解释过。给定任何任意的 and with then 是一个重言式,因为可以只等于一个 or 并且必须与另一个不相等(如果它无论如何都不是两者 - 这就是你实际追求的,并通过使用得到!||&&aba != bc != a || c != bcab&&
1赞 gettingAway 8/2/2023
@Armali是的,我没有注意那个哈哈,我现在也看到了他们的答案

答:

0赞 0___________ 8/2/2023 #1
  1. 我建议使用函数。
  2. strcmp比较整个字符串 - 您需要阅读一些关于它们的信息。
  3. 要比较 1,您不需要使用字符串函数。char
  4. 您可以通过终止数组的 null 字符“手动”构造字符串
int readWords(size_t size, char (*array)[size][2], FILE *fi)
{
    int result = 0;
    char buff[80] = "";
    size_t index = 0;
    
    for(size_t row =0; row < size; row++)
    {
        for(size_t col = 0; col < size; col++)
        {
            if(buff[index] == 0 || buff[index] == '\r' || buff[index] == '\n')
            {
                if(!fgets(buff, sizeof(buff), fi)) 
                {
                    result = -1;
                    goto cleanup_exit;
                }
                index = 0;
            }
            array[row][col][0] = buff[index++];
            array[row][col][1] = 0;
        }
    }
    cleanup_exit:
    return result;
}


int main(int argc, char *argv[]){

    char words[4][4][2];
    char verif[2];
  
    int i, j, l=0, lin=4, col=lin;

    printf("Insert numbers: ");
    if(!readWords(4, words, stdin))
    {
        printf("\n");
        for(i=0;i<lin;i++)
        {
            for(j=0;j<col;j++)
            {
                printf("-%s\t", words[i][j]);
            }
            printf("\n");
        }
    }
    else
    {
        printf("Error reading the array\n");
    }


    return 0;
}

https://godbolt.org/z/WsMqdedra

1赞 chqrlie 8/2/2023 #2

fgets(verif, 2, stdin)是从标准输入读取单个字节的扭曲方式。您可以直接编写和处理字节值,而不是使用字符串比较。int ch = getchar();

然而,主要问题出在测试中:你应该使用而不是你想处理的输入,它不是换行符也不是回车符,它转换为(不是换行符)不是回车符)。if (strcmp(verif, "\n\0") != 0 || strcmp(verif, "\r\0") != 0)&&||

这是一个更简单的版本:

#include <stdio.h>

int main(int argc, char *argv[]) {
    char matrix[4][4];
    int lin = 4, col = lin;

    printf("Enter the digits: ");
    for (int i = 0; i < lin; i++) {
        for (int j = 0; j < col;) {
            int c = getchar();
            if (c == EOF) {
                fprintf(stderr, "premature end of file, aborting.\n");
                return 1;
            }
            if (c != '\n' && c != '\r') {
                printf("inserting %c\n", c);
                matrix[i][j] = c;
                j++;
            }
        }
    }

    printf("\n");
        
    for (int i = 0; i < lin; i++) {
        for (int j = 0; j < col; j++) {
            printf("-%c\t", matrix[i][j]);
        }
        printf("\n");
    }

    return 0;
}