无法弄清楚为什么我得到奇怪的输出

标签 c function

我是新手。我一直在研究 K&R C 编程书,其中一个练习是编写一个程序来打印任何超过 80 行的输入行。这是我的代码:

include <stdio.h>

#define MAXLINE 1000

int getaline(char line[], int maxline);

int main()
{
    int i, c;
    char line[MAXLINE];

    if ((c = getaline(line, MAXLINE)) > 80){
            for (i =0; i < MAXLINE; ++i)
                    if (c != '\0')
                            printf("%c", line[i]);
            printf("\n");
    }
}
/* reads a line into S, returns the length of that line */
int getaline(char s[], int lim)
{
    int c, i;

    for (i = 0; i < lim-1 && (c = getchar()) != EOF && c != '\n'; ++i)
            s[i] = c;
    if (c == '\n') {
            s[i] = c;
            ++i;
    }
    s[i] = '\0';
    return i;
}

因此,我将通过管道将超过 80 个字符的行传递给已编译的程序。这是输出:

猫输入.txt | ./a.out

111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111E11111111111111111111111111111ME ??i?F???4?w??>&Y?_???xf?7U?h@? ??i??7U?v??i??7U??7U?(?7U?@? H??i?8?7U??7U?

它打印了这一行,但它给出了所有这些异常的输出。我试图找出原因,但我似乎无法找到原因。

但是,我很确定问题出在 getaline 函数上。

任何帮助将不胜感激! :)

最佳答案

您将 c 与当前字符混淆了。

试试这个,改变这个

for (i =0; i < MAXLINE; ++i)

for (i = 0 ; i < c ; ++i)

支票应该是

if (line[i] != '\0')

代替

if (c != '\0')

您的 getaline() 函数返回,i 读取的最后一个字符的位置,您正在将它与空终止字节进行比较。

此外,如果您以 null 终止字符串,为什么不直接

printf("%s\n", line);

这段代码应该可以工作

#include <stdio.h>

#define MAXLINE 1000

int getaline(char line[], int maxline);

int main()
{
    int i, c;
    char line[MAXLINE];

    if ((c = getaline(line, MAXLINE)) > 80)
        printf("%s\n", line);

    return 0; // you must return from main()
}
/* reads a line into S, returns the length of that line */
int getaline(char s[], int lim)
{
    int c, i;

    for (i = 0 ; (i < lim - 1) && ((c = getchar()) != EOF) && (c != '\n') ; ++i)
        s[i] = c;
    if (c == '\n') 
    {
        s[i] = c;
        ++i;
    }
    s[i] = '\0';
    return i;
}

关于无法弄清楚为什么我得到奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27707601/

相关文章:

php类调用外部类

c - scanf ("%c", x) 和 x=getchar 都没有等待输入

C 管道到另一个程序的 STDIN

c - 如何获取调用当前函数的函数名?

python - 无法为 "high"x 计算 e^(-x)

sql - 在 PostgreSQL 中插入后计算平均值

c - 我们如何在 C 中使用递归打印系列 1+ 11 +111+........ 最多 N 项的总和

python - 将 Cython 中的 numpy 数组传递给需要动态分配数组的 C 函数

c - 如何处理结构数组?

function - 无法创建本地函数,因为 "can' t 在 fn 项中捕获动态环境”