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

zaqlnxep  于 2023-08-03  发布在  其他
关注(0)|答案(2)|浏览(86)

我需要一个方法来获取每个输入字符并将它们放入一个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


对于像1234123412341234这样的普通输入,输出(printf矩阵)是可以的:

-1  -2  -3  -4  
-1  -2  -3  -4  
-1  -2  -3  -4  
-1  -2  -3  -4

0h4hbjxa

0h4hbjxa1#

1.我建议使用函数。

  1. strcmp比较整个字符串-你需要阅读一些关于它们的内容。
    1.要比较1 char,您不需要使用字符串函数。
    1.您可以通过空字符终止数组来“手动”构造字符串
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

tv6aics1

tv6aics12#

fgets(verif, 2, stdin)是从标准输入读取单个字节的扭曲方式。您可以只写int ch = getchar();并直接处理字节值,而不是使用字符串比较。
然而,主要问题在于测试if (strcmp(verif, "\n\0") != 0 || strcmp(verif, "\r\0") != 0):你应该使用&&而不是||,因为你想处理既不是换行符也不是回车符的输入,这将转换为(nota newline)nota carriage return)。
下面是一个简单的版本:

#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;
}

字符串

相关问题