繁体   English   中英

小C程序不起作用

[英]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)) {

其他小错误/提示:

  • 内置函数strcpystrncpy执行copy功能,而无需重新设计轮子。
  • 在您的getline函数中,使用MAXLINE防止缓冲区溢出。

假设这是一项家庭作业,这是一个提示:这段代码看起来非常可疑:

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;

如果currentNULL ,则getline()将分配用于存储行的缓冲区,该缓冲区应由用户程序free getline()还使用一个指向size_t的指针,该指针包含存储行所需的字节数。

    while (len = (getline(current)) > 0) {

应该由以下内容代替...

    while ((len = getline(&current, &allocated, stdin)) > 0) {

...更新并比较len0

现在,而不是...

        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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM