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

时间:2014-12-30 14:54:14

标签: 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个字符的行传送给已编译的程序。这是输出:

cat input.txt | ./a.out

1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111 ?? I F ???4瓦特??&gt;有&安培;?ý_ ??? XF 7U H +? ??我?? 7U·V ??我?? ?? 7U 7U?(?7U?@? H 18我?8?7U ?? 7U?

它会打印该行,但它会提供所有这些异常输出。我试图找出原因,但我似乎无法找到原因。

但是,我很确定问题在于getaline功能。

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

3 个答案:

答案 0 :(得分:1)

当它是一个字符时,你正在检查c,当它是行长计数时;它永远不会等于\0,所以你一直保持着兴趣。

if ((c = getaline(line, MAXLINE)) > 80){

   // c now equals, let's say, 81

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

                // c is still 81, we never fail

                if (c != '\0')
                        printf("%c", line[i]);
        printf("\n");
}

请考虑一下:

if (getaline(line, MAXLINE) > 80) {
  for (i =0; i < MAXLINE; ++i)
  {
    c = line[i];

    if (c != '\0')
      printf("%c", c;
    else
      break;
  }

  printf("\n");
}

答案 1 :(得分:1)

您将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;
}

答案 2 :(得分:0)

替换

        for (i =0; i < MAXLINE; ++i)
                if (c != '\0')
                        printf("%c", line[i]);

通过

        for (i =0; i < c; ++i)
                        printf("%c", line[i]);
相关问题