[英]small C program doesnt work
我试图制作一个程序来获取用户输入(行),并打印出超过80个字符的最长行。 我编写了程序,但是运行它时,它输出了一些非常奇怪的符号。 您能告诉我我的代码可能出什么问题吗?
#include <stdio.h>
#define MINLINE 80
#define MAXLINE 1000
int getline(char current[]);
void copy(char from[], char to[]);
int main(void)
{
int len; // current input line lenght
int max; // the lenght of a longest line that's over 80 characters
char current[MAXLINE]; // current input line
char over80[MAXLINE]; // input line that's over 80 characters long
while (len = (getline(current)) > 0) {
if (len > MINLINE) {
max = len;
copy(current, over80);
}
}
if (max > 0) {
printf("%s", over80);
}
else {
printf("No input line was over 80 characters long");
}
return 0;
}
int getline(char current[]) {
int i = 0, c;
while (((c = getchar()) != EOF) && c != '\n') {
current[i] = c;
++i;
}
if (i == '\n') {
current[i] = c;
++i;
}
current[i] = '\0';
return i;
}
void copy(char from[], char to[]) {
int i = 0;
while ((to[i] = from[i]) != '\0') {
++i;
}
}
非常感谢您的帮助 !
如果找不到长行,则无法初始化max
。 然后在if (max > 0)
使用它是未定义的行为。
这行:
while (len = (getline(current)) > 0) {
将(getline(current)) > 0)
的值分配给len
,这不是您想要的(之后len将为0或1。
编辑:刚看到AusCBloke的评论,您还应该同时检查len > max
和 len > MINLINE
否则您将得到的最新len > MINLINE
于80个字符,而不是最长的len > MINLINE
。
您还应该将max
初始化为0,因此应为
max = 0;
while ((len = getline(current)) > 0) {
if ((len > MINLINE) && (len > max)) {
其他小错误/提示:
假设这是一项家庭作业,这是一个提示:这段代码看起来非常可疑:
if (i == '\n') {
current[i] = c;
++i;
}
由于i
代表一个位置并且从未分配过字符,因此您可以有效地检查该位置是否等于ASCII代码'\\n'
。
您的复制方法不能为null终止字符串:
void copy(char from[], char to[]) {
int i = 0;
while ((to[i] = from[i]) != '\0') {
++i;
}
to[i] = '\0'
}
这可能解释了正在打印的怪异字符。
您可以使用内置的strcpy()使生活更轻松。
如果您提供的输入数据行数超过1000个字符,则固定大小的缓冲区将溢出。 通过输入这样的输入,我可以实现以下输出:
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
我目前无法测试您的代码,但这可能是由于未清除字符数组引起的。 尝试将char数组设置为0。
您的代码有很多问题。 大多数情况下,这是由于车轮的重新发明。
int getline(char current[]);
您不需要定义自己的getline()
, stdio.h
已经有一个。
void copy(char from[], char to[]);
还有许多用于在string.h
复制字符串的函数。
初始化所有0f变量也是一个好主意,如下所示:
int len = 0; // current input line length
...这可以防止以后出现问题,例如在未初始化时与max
进行比较。
如果您这样初始化max
...
int max = MINLINE; // the length of a longest line that's over 80 characters
...然后,以后进行长度比较会更容易。
char* current = NULL;
size_t allocated = 0;
如果current
为NULL
,则getline()
将分配用于存储行的缓冲区,该缓冲区应由用户程序free
。 getline()
还使用一个指向size_t
的指针,该指针包含存储行所需的字节数。
while (len = (getline(current)) > 0) {
应该由以下内容代替...
while ((len = getline(¤t, &allocated, stdin)) > 0) {
...更新并比较len
与0
。
现在,而不是...
if (len > MINLINE) {
...您需要与我们早先初始化的最后最长线进行比较...
if (len > max) {
...然后您就可以像以前那样更新max
...
max = len;
在调用copy()
使用strncpy()
,这将防止您在分配的缓冲区中写入超过1,000个字符:
strncpy(over80, current, MAXLINE);
由于我们初始化了max
,因此您需要在末尾将检查从if (max > 0)
更改为if (max > MINLINE)
。
另一个提示,更改以下行...
printf("No input line was over 80 characters long");
...至...
printf("No input line was over %d characters long", MINLINE);
...将意味着您只需要更改文件顶部的#define
即可增加或减少最小长度。
别忘了...
free(current);
...以防止内存泄漏!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.