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

标签 c carriage-return linefeed

关于 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/

相关文章:

c - 如何将整数值转换为罗马数字字符串?

c - 如何让 CodeChef IDE 从标准输入读取?

java - 如何在将内容粘贴到 Excel 文件时从字符串中删除回车符

powershell - 输出文件和回车

java - 回车换行 Windows 和 Linux java 应用程序

c - 将 char 数组分配给 char*

c - 列出目录并显示每个文件的详细信息。使用 c 的所有者、八进制权限和文件名

c# - 如何将文件读入保留 CR/LF 的字符串?

ios - UIApplication openURL - 摆脱 %0A

php - 如何从 PHP 表单在 MySQL 表中插入\n 字符