小C程序不起作用

小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

我试着制作一个程序,获取用户输入(行)并打印超过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;
    }
}
#包括
#定义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(&current, &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);