无法在程序中找到错误,打印超过80个字符的输入行

时间:2015-04-15 14:54:56

标签: c string

#include <stdio.h>
#include <stdlib.h>

#define PRINT 80

int get_line(char k[], int lim);

int main(){

    int len;
    char line[PRINT];

    while((len = get_line(line, PRINT)) > 0){
        if(len > PRINT){
            printf("%s", line);
        }
    }    
}


int get_line(char k[], int lim){

    int i, c;

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

    if(c == '\n'){
        k[i] = c;
        ++i;
     } 

    k[i] = '\0';

    return i;

}

上述代码用于打印长度大于80个字符的所有输入行,但不打印任何内容。代码编译没有任何错误。我无法弄清楚自己哪里出错了。

2 个答案:

答案 0 :(得分:4)

    if(c=='\n'){
        k[i] = c;
        ++i;
  } 

通过递增i,你有数组越界访问,你的问题本身会导致未定义的行为,在一个可容纳80个字符的数组中存储超过80个字符。

char line[80];

使数组大小超过80个字符,如

char line[200];

然后尝试做你正在做的事情并在写入数组line

之前添加一个检查
if(i > 200)
{
   printf("Array can't hold this character\n");
   // break or return
} 

您的lim应为200

答案 1 :(得分:2)

您将数组初始化为80,但是您尝试打印超过80个字符的字符串,因此您将始终打印空白,因为您将永远不会拥有该方案(也不能存储超过80个字符)。将k[]line[]的初始化更改为大于80的值,或使用向量进行自动重新调整大小。