【问题标题】:Can't figure out why I am getting strange output无法弄清楚为什么我得到奇怪的输出
【发布时间】:2014-12-30 14:54:13
【问题描述】:

我是个新手。我一直在阅读 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

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

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

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

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

【问题讨论】:

  • 遇到'\0'后继续排行打印字符
  • 没有。您只需跳过'\0' 的打印,for 将继续进行
  • i &lt; MAXLINE --> i &lt; c , if (line[i] != '\0')
  • 否,因为在调用 getaline() 之前没有用 0 填充该行。您从终端读取了一些字符,然后在该行的其余部分有很多垃圾,除非它是 0,否则您很乐意打印它们。
  • @HansKlünder Read getaline() - 读取后该行始终以 0 结尾。这不是问题。

标签: c function


【解决方案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】:

当它是行长计数时,您正在检查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。
【解决方案3】:

替换

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

通过

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

【讨论】:

    猜你喜欢
    • 2018-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多