小C程序不起作用
我试着制作一个程序,获取用户输入(行)并打印超过80个字符长的最长行。我制作了这个程序,但当我运行它时,它输出了一些非常奇怪的符号。你能告诉我我的代码有什么问题吗小C程序不起作用,c,C,我试着制作一个程序,获取用户输入(行)并打印超过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; // curr
#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;
}
}
#包括
#定义MINLINE 80
#定义MAXLINE 1000
int getline(字符当前[]);
无效副本(字符从[],字符到[]);
内部主(空)
{
int len;//当前输入行长度
int max;//超过80个字符的最长行的长度
当前字符[MAXLINE];//当前输入行
字符超过80[MAXLINE];//长度超过80个字符的输入行
而(len=(getline(当前))>0){
如果(len>MINLINE){
max=len;
拷贝(当前,超过80);
}
}
如果(最大值>0){
printf(“%s”,超过80);
}
否则{
printf(“没有超过80个字符的输入行”);
}
返回0;
}
int getline(当前字符[]){
int i=0,c;
而(((c=getchar())!=EOF)和&c!='\n'){
电流[i]=c;
++一,;
}
如果(i='\n'){
电流[i]=c;
++一,;
}
当前[i]='\0';
返回i;
}
无效副本(字符从[],字符到[]){
int i=0;
而((到[i]=从[i])!='\0'){
++一,;
}
}
非常感谢你的帮助 假设这是一个家庭作业,这里有一个提示:这段代码看起来非常可疑:
if (i == '\n') {
current[i] = c;
++i;
}
由于
i
表示一个位置,并且从未分配字符,因此您可以有效地检查该位置是否等于\n'
max
的ASCII代码,如果未找到长行,则无法初始化该位置。如果在中使用它(max>0)
则是未定义的行为。如果提供的输入数据的行数超过1000个字符,则会溢出固定大小的缓冲区。通过输入这些输入,我能够实现以下输出:
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠
╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ 这一行:
while (len = (getline(current)) > 0) {
将(getline(current))>0的值指定给len
,这不是您想要的(len之后将为0或1)
编辑:刚刚看到AusCBloke的评论,您还应该同时检查len>max
和len>MINLINE
,否则您只会得到超过80个字符的最新行,而不是最长的整行
您还应该将max
初始化为0,因此它应该是
max = 0;
while ((len = getline(current)) > 0) {
if ((len > MINLINE) && (len > max)) {
其他小错误/提示:
- 内置函数并执行您的
copy
函数所做的操作,无需重新发明轮子
- 在
getline
函数中,使用MAXLINE
防止缓冲区溢出
我现在无法测试您的代码,但这可能是由于未清理字符数组造成的。请尝试将字符数组设置为0。您的复制方法不会为null终止字符串:
void copy(char from[], char to[]) {
int i = 0;
while ((to[i] = from[i]) != '\0') {
++i;
}
to[i] = '\0'
}
这可能解释了印刷的奇怪字符
您可以使用内置代码使生活更轻松。您的代码中存在许多问题。这些问题主要是由于车轮改造造成的
int getline(char current[]);
你不需要定义你自己的,已经有一个了
还有许多函数用于在中复制字符串
初始化所有变量也是一个好主意,如下所示:
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;
如果当前为NULL
,则将分配一个缓冲区来存储该行,该缓冲区应由用户程序释放d。还将获取一个指向大小的指针,该指针包含存储该行所需的字节数
while (len = (getline(current)) > 0) {
应替换为以下内容
while ((len = getline(¤t, &allocated, stdin)) > 0) {
…将len
更新并与0
进行比较
现在,不是
if (len > MINLINE) {
…您需要与我们之前初始化的最后一行最长的行进行比较
if (len > max) {
…然后你就可以像以前一样更新max
max = len;
调用您的copy()
use,这将阻止您在分配的缓冲区中写入超过1000个字符:
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);
…为了防止内存泄漏!您可能应该将此标记为家庭作业。我在下面列出了至少5个错误。做得好!getline()
可能会导致缓冲区溢出(即使您有一个巨大的缓冲区)copy()
应该替换为string.h
中的strcpy
。而while
free(current);