此程序的目的是打印尽可能多的输入文本(直到数组限制),但它应显式返回输入文本的确切长度(数值)。
以下是我的代码:
#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”将开始一个新行。
答案 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;
}
另请注意,limit
,i
,index
的类型和返回值应为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')
正文中的增量来决定是否要保留换行符的增量。