gpt4 book ai didi

C语言 : How do I ignore carriage return and line feed when reading from text file?

转载 作者:太空宇宙 更新时间:2023-11-04 01:56:01 27 4
gpt4 key购买 nike

关于 C 语言,我有 2 个问题。假设我有一个包含这些前缀值的文本文件:

apple
orange
pear
grapes
#

我可以逐字符打印出来,这正是我想要的,但打印输出包括回车和换行,但我希望打印输出是 苹果梨橙葡萄#

第二个问题我正在尝试以这样一种方式制作我的程序,一旦它读取#,我就可以停止读取。这是我的代码示例:

#include <stdio.h>
#include <string.h>
#define size 210

int main()
{
int i;
char info[size];

char stop;
stop = '#';

for (i = 0; i<size; i++)
{
scanf ("%c", &info[i]);
while (info[i] != stop);
{
printf ("%c", info[i]);
}
}
return 0;
}

这段代码似乎可以无限运行。如果我尝试通过使用取消引用 info[i]while (* info[i] != stop);我明白了

error: invalid type argument of unary ‘*’ (have ‘int’)
while (*info[i] != stop);

有没有人可以帮我解决这两个问题?

最佳答案

无限问题是你的循环:

while (info[i] != stop);

请注意,分号是循环体。一旦开始循环,每次执行循环都不会发生任何变化以停止它。您应该将 while 更改为 if 并去掉分号。

那么你的问题是你没有从 scanf() 中检测到 EOF;始终检查 scanf() 的返回值。通常,您会使用:

if (scanf("%c", &info[i]) != 1)
break;

但考虑到 %c 将返回 1 除了在 EOF 处,您这次可以将 1 替换为 EOF,但它会最好学习安全(正确)的方法并使用 1

关于不打印CR和LF,打印前测试:

if (info[i] != '\n' && info[i] != '\r')

考虑使用 getchar()putchar() 代替 scanf()printf()。并在末尾输出一个换行符。

#include <stdio.h>
#define size 210

int main(void)
{
int i;
char info[size];
char stop = '#';

for (i = 0; i < size; i++)
{
if (scanf("%c", &info[i]) != 1 || info[i] == stop)
break;
if (info[i] != '\n' && info[i] != '\r')
printf("%c", info[i]);
}
putchar('\n');
return 0;
}

请注意,这不会终止 info 字符串;您必须循环到 size - 1 并在末尾添加 null。即使文件更长,使用该字符串也是安全的。还要注意 info 字符串包含换行符和回车符,即使输出没有。你必须稍微重新编码循环来处理这个问题。读取输入的字符,如果不是换行符或回车符,则只将其添加到 info

如果想在停止前打印停止符,可以使用:

#include <stdio.h>
#define size 210

int main(void)
{
int i;
char info[size];
char stop = '#';

for (i = 0; i < size; i++)
{
if (scanf("%c", &info[i]) != 1)
break;
if (info[i] != '\n' && info[i] != '\r')
printf("%c", info[i]);
if (info[i] == stop)
break;
}
putchar('\n');
return 0;
}

或者,由于您在循环后不使用 info,您可以简化它(从输出中省略停止字符):

#include <stdio.h>

int main(void)
{
int i;
int c;
char stop = '#';

while ((c = getchar()) != EOF && c != stop)
{
if (c != '\n' && c != '\r')
putchar(c);
}
if (c == stop)
putchar(c);
putchar('\n');
return 0;
}

关于C语言 : How do I ignore carriage return and line feed when reading from text file?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34226977/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com