提问人:gettingAway 提问时间:8/2/2023 最后编辑:chqrliegettingAway 更新时间:8/2/2023 访问量:64
为什么我的条件不起作用?使用 fgets 输出
Why is my conditional not working?using fgets output
问:
我需要一种方法来获取每个输入字符并将它们放入 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
答:
0赞
0___________
8/2/2023
#1
- 我建议使用函数。
strcmp
比较整个字符串 - 您需要阅读一些关于它们的信息。- 要比较 1,您不需要使用字符串函数。
char
- 您可以通过终止数组的 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;
}
评论
strcmp
比较整个字符串 - 您可能只想搜索换行符,因此 - 并且您不需要检查任何一个,该字符无论如何都不会通过 API( 减少到仅,除非您在二进制模式下打开文件)。strchr(verif, '\n')
\r
\r\n
\n
fgetc()
'\n'
'\r'
||
&&
||
&&
a
b
a != b
c != a || c != b
c
a
b
&&