1

我正在尝试使用“C 编程语言 - Brian Kernighan 和 Dennis Ritchie”来学习 C 的基础知识

我创建了这个基本程序来尝试函数和存储字符串,但由于某种原因 getline 不断返回错误。我正在使用 Visual Express 2010,但我不断收到“getline”:并非所有控制路径都返回一个值

我一遍又一遍地选择它,但就是看不到问题,

#include<stdio.h>
#define MAXLINE 1000
#define LINEWIDTH 80

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

main(){

int length;
int max;
char line[MAXLINE];

max = 0;
while((length = getline(line, MAXLINE)) >0)
if (length>max){
    max=length;
}
if(max>0)
    printf("%s",line);
return 0;
 }


int getline(char line[], int maxline){

int c, i;

for(i = 0; i<maxline-1 && (c=getchar())!=EOF && c!='\n'; i++){

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

    line[i] ='\0';
    return i;

    }
}
4

3 回答 3

4

一个问题是您没有准确复制 K&R Second Edition 的 p29 中的代码。

那里的getline()功能是:

int getline(char s[], int lim)
{
    int c, i;

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

    if (c=='\n') {
        s[i] = c;
        ++i;
    }
    s[i] ='\0';
    return i;
    // Brace not needed    }
}

我已经恢复了原始参数名称 ( sand lim) 来代替你的lineand maxline

getline()on p32 有一个没有参数的专用版本。p69 上面的代码有一个稍微压缩的版本。在 p165 上还有另一个实现fgets()

于 2013-05-24T06:33:45.107 回答
1
int getline(char line[], int maxline)
{
    int i = 0, c;

    for(; i < maxline-1 && (c=getchar())!=EOF && c!='\n'; i++)
        line[i] = c;

    if (c == '\n') 
        s[i++] = c;

    line[i] = '\0';
    return i;
}

这应该足够了。该代码有不需要的大括号,因此如果它已经执行,它将在第一次迭代中返回该值。

于 2013-05-24T06:38:00.083 回答
1

因为您的函数在未进入 for 循环时不会返回任何内容。

将其更新为:

int getline(char line[], int maxline){

  int c, i;

  for(i = 0; i<maxline-1 && (c=getchar())!=EOF && c!='\n'; i++){

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

      line[i] ='\0';
      return i;

    }

    return 0; #return some appropriate value when doesn't enter in for loop.
}
于 2013-05-24T06:16:34.790 回答