我的程序无法正确输出行 代码

问题描述

我是C语言的新手,目前正在阅读Kernighan的书。 本书中的问题之一是创建一种算法,该算法可以从输入行输出长度超过10个字符的行。

问题是我很沮丧,因为我找不到我的代码有什么问题。我调试并重新创建了很多遍,但是仍然无法找出正在发生的事情!

函数getl()中的转义字符为'。 (点),有时有效,而其他时候则无效。如果编译并测试,您将看到:

gcc -Wall -o out 'script.c'

这本书的问题标题是:

“练习1-17。编写程序以打印所有超过10个字符的输入行。”

我确信这相对容易,但是我真的很想知道为什么该算法无法按预期工作,我认为它与'\ n'有关。

如果有人可以帮助我找出代码的问题,我将不胜感激。

代码

#include <stdio.h>

#define MAX 10000

int getl(char line[],int lim) {
    char c;
    int count;

    for (count = 0 ; count < lim-1 && (c = getchar()) != '.' ; count++) {
        if (c == '\n') {
            line[count] = '\n';
            count++;
            break;
        }
        line[count] = c;
    }
    line[count] = '\0';
    return count;
}
    
int main() {
    char line[MAX];
    int len = 1;

    for (; len > 0 ;) {
        getl(line,MAX);
        len = getl(line,MAX);
        if (len >= 10)
            printf("%s",line);
    }
    return 0;
}

解决方法

您的代码几乎可以正常工作。您似乎在这里和那里有些重复的行使事情变得混乱。

具体地说,您连续两次调用getl(line,MAX);。第一个获取输入,但不保存计数,第二个仅具有空的stdin缓冲区,因此无法从中保存任何有意义的计数。删除不保存计数的第一个电话可以解决您的问题。

#include <stdio.h>

#define MAX 10000

int getl(char line[],int lim) {
    char c = getchar();
    int count;
    
    for (count = 0 ; c != '.' ; count++) {
        line[count] = c;
        c = getchar();
    }
    line[count++] = '\n';
    return count;
}
    
int main() {
    char line[MAX];
    int len = 1;
    for (; len > 0 ;) {
        len = getl(line,MAX);
        if (len >= 10)
            printf("%s",line);
    }
    return 0;
}
,

首先,您要两次调用getl函数,而不是一次(您只想一行一行地读取代码)。解决该问题。 然后,我认为您不应该在行末添加“ \ n”,仅当行长超过10个字符时才打印它,在代码中,“ \ n”将被视为一个字符。

这是修改后的代码:

#include <stdlib.h>
#include <stdio.h>
#define MAX 10000

int getl(char line[])
{
    char    c;
    int     count;

    for (count = 0; count < MAX - 1 && (c = getchar()) != '.' ; count++)
    {
        if (c == '\n')
            break;
        line[count] = c;
    }
    line[count] = '\0';
    return (count);
}

int main()
{
    char    line[MAX];
    int     len = 1;

    while (len > 0)
    {
        len = getl(line);
        if (len >= 10)
            printf("%s,c = %i\n",line,len);
    }
    return (0);
}
,

这应该有效。 https://ideone.com/cXXRUH

#include <stdio.h>

#define MAX 10000

int getline_length(char line[]) {
  char ch;
  int count = 0;

  printf("\nWaiting for INPUT...");
  // Using clear while loop to get input,removing redundent complexity 
  // Either `.` or `\n` consider End Of Line 
  while(count < MAX-1 && ((ch = getchar()) != '.' || (ch = getchar()) != '\n')) {
      line[count++]=ch;
  }
  line[count] = '\0';
  return count;
}

int main() {
   char line[MAX];

   while(1) {
       // reset array before each input 
       memset(line,sizeof(line));
       int len = getline_length(line); //No need to pass limit 
       if (len >= 10) {
           printf("%s",line);
        } else {
            printf("len < 10");
        }
   }
   return 0;
}

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...