【问题标题】:Program.exe has stopped working error: fgets functionProgram.exe 已停止工作错误:fgets 函数
【发布时间】:2015-08-26 07:45:52
【问题描述】:

我下面用 C 编写的程序正在运行到某个点。但是,它停在我认为的无错误代码的中间。来自 Java,我是 C 的新手,所以任何帮助都将不胜感激。

#include <stdio.h>
#include <stdlib.h>

void getInput(char *input, const char *rs[]){// Args are the user input and our reserved words array.

    printf(">>"); fgets(input, 1000, stdin);// Getting our normal command

    int i;
    for(i = 0; i < (int)sizeof(rs); i++){

        if(strcmp(input, rs[i]) != 0){
            printf("You said: %s", input); //PROGRAM BREAKS AFTER THIS LINE
        }

    }

    printf("Size of \"input\" is: %d\n", sizeof(input));// Just checking the size of input

    free(input);// Deallocating input since we won't need it anymore.

}

int main(){

    char *input = malloc(500 * sizeof(char));// Command line input
    const char *rs[1];// Reserved words array.

    rs[0] = "print";

    getInput(input, rs);

    getch();

}

【问题讨论】:

  • 我很抱歉代码格式不正确。我只是简单地复制和粘贴,结果就是这样。
  • 0) 500 1000 大小不匹配。 1) sizeof(rs)sizeof(input) :它们是指针的大小。
  • i &lt; (int)sizeof(rs); 在 C 语言中,您无法仅通过指针知道数组中元素的数量。请注意,main() 也接受 argc 参数以及 *argv[]
  • 循环尝试多次执行,因为 a) 大小错误(如@BLUEPIXY 所说),b) 输入字符串与“print”不匹配,因为fgets() 将追加newline 到输入字符串。
  • 发布的代码编译不干净。编译时始终启用所有编译器警告。然后解决这些问题(不要隐藏它们)。除其他外,代码缺少#include 头文件。当参数是“long unsigned int”时,第 17 行的格式说明符为“%d”。我不知道你在哪里找到 'getch()' 但更好的调用是:'getchar()'

标签: c exe


【解决方案1】:

几个问题,主要源于将 C 视为具有字符串和数组,如 Java。它没有,它只有字节块和一些函数来处理类似字符串和数组的事情。

首先,malloc(500 * sizeof(char)) 分配 500 个字节(char 的 sizeof 定义为 1)。稍后你 fgets(input, 1000...) 在这 500 个字节上。不好。

char *rs[1] 分配一个包含 1 个字符的指针数组。它不为任何字符串分配任何内存。 rs[0] = "print" 可以,因为“print”分配了 6 个字节,并且分配使 rs[0] 指向它们。但是随后您将rs 传递给函数 getInput 并在其上调用sizeof,这会为您提供单个指针的大小(可能是 4 或 8 个字节),因为 C 也不保留数组维度——它只是传递一个指向数组开头的指针。您需要自己传递长度。

您没有检查fgets() 的返回值。即使您没有将 1000 字节读入 500 字节缓冲区并且 fget 工作正常,您的 strcmp() 也将始终失败,因为 fgets() 在字符串中包含换行符。

最后,sizeof(input) 是另一个指针大小,而不是数组维度。你可能是指strlen(input)

【讨论】:

  • 你是对的,指针的大小总是返回 4。谢谢。
猜你喜欢
  • 1970-01-01
  • 2018-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-12
  • 2012-04-22
  • 2012-09-18
相关资源
最近更新 更多