C:函数未返回正确的值

时间:2015-12-27 00:32:19

标签: c arrays function return-value return-type

此程序的目的是打印尽可能多的输入文本(直到数组限制),但它应显式返回输入文本的确切长度(数值)。

以下是我的代码:

#include <stdio.h>
#define MAXLINE 1000

int line_input(char array[], int maxlinelimit);
void copy(char toarray[], char fromarray[]);

int line_input(char s[], int limit)
{
    char ch;
    int i = 0;
    for(; ((ch = getchar()) != EOF) && (ch != '\n'); ++i)
    {
        s[i] = ch;
    }
    if(ch == '\n')
    {
        s[i] = ch;
        ++i;
    }
    s[i] = '\0';
    printf("%d\n", i);
    return i;
}

void copy(char to[], char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

int main()
{
    int length;
    length = 0;
    int max;
    max = 0;
    char line[MAXLINE], longest[MAXLINE];
    while((length = line_input(line, MAXLINE) > 0))
    {
        printf("%d\n%s\n", length, line);
        if(length > max)
        {
            max = length;
            copy(longest, line);
        }

    }
    if(max > 0)
    {
        printf("\n\n%d is the size of the longest line\n", max);
        printf("%s\n\n", longest);
    }
    return 0;
}

您会发现名为“line_input()”的用户定义函数由于某些我不知道的原因而未返回它应该返回的值。我不认为有任何警告我没有希望得到解决。

请查看您是否可以修复它。

P.S。 - 输入文字是键盘上的任何字符串。按“Enter”将开始一个新行。

2 个答案:

答案 0 :(得分:1)

  • 您必须使用int,它可以安全地存储所有(非多字节)字符和EOF,以存储getchar()的结果。
  • 您必须限制保存的长度以避免缓冲区溢出。
  • 停止计算换行符以使返回值更准确。

试试这个:

int line_input(char s[], int limit)
{
    int ch;
    int i = 0, index = 0;
    for(; ((ch = getchar()) != EOF) && (ch != '\n'); ++i)
    {
        if (index < limit - 1) s[index++] = ch;
    }
    if(ch == '\n')
    {
        if (index < limit - 1) s[index++] = ch;
    }
    s[index] = '\0';
    printf("%d\n", i);
    return i;
}

另请注意,limitiindex的类型和返回值应为size_t,因为它们正在处理大小。

更新:另一个版本,可以告诉输入结束时的空行并进行一些改进

#include <stdio.h>
#define MAXLINE 1000

int line_input(char s[], int limit);
void copy(char to[], const char from[]);

int line_input(char s[], int limit)
{
    int ch;
    int i = 0, index = 0;
    for(; ((ch = getchar()) != EOF) && (ch != '\n'); ++i)
    {
        if (index < limit - 1) s[index++] = ch;
    }
    if(ch == '\n')
    {
        if (index < limit - 1) s[index++] = ch;
    }
    else if(ch == EOF && index == 0)
    {
        return -1;
    }
    s[index] = '\0';
    printf("%d\n", i);
    return i;
}

void copy(char to[], const char from[])
{
    int i;

    i = 0;
    while ((to[i] = from[i]) != '\0')
        ++i;
}

int main(void)
{
    int length = 0;
    int max = 0;
    char line[MAXLINE], longest[MAXLINE];
    while((length = line_input(line, MAXLINE)) >= 0)
    {
        printf("%d\n%s\n", length, line);
        if(length > max)
        {
            max = length;
            copy(longest, line);
        }

    }
    if(max > 0)
    {
        printf("\n\n%d is the size of the longest line\n", max);
        printf("%s\n\n", longest);
    }
    return 0;
}

答案 1 :(得分:0)

查看你的line_input()函数:

int line_input(char s[], int limit)
{
    char ch;
    int i = 0;
    for(; ((ch = getchar()) != EOF) && (ch != '\n'); ++i)
    {
        s[i] = ch;
    }
    if(ch == '\n')
    {
        s[i] = ch;
        ++i;
    }
    s[i] = '\0';
    printf("%d\n", i);
    return i;
}

当'ch'是换行符时,您只是递增变量'i'。将增量放在for循环中,如下所示:

for(; ((ch = getchar()) != EOF) && (ch != '\n'); ++i){
    s[i] = ch;
    i++;
}

如果您愿意,可以通过保留或删除if(ch == '\n')正文中的增量来决定是否要保留换行符的增量。