Program.exe has stopped working error: fgets function

Program.exe has stopped working error: fgets function

我下面用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();

}

几个问题,主要是由于将 C 视为具有 Java 之类的字符串和数组。它没有,它只有字节块和一些函数来用它们做类似字符串和类似数组的事情。

所以首先,malloc(500 * sizeof(char)) 分配 500 个字节(根据定义,sizeof char 为 1)。稍后你 fgets(input, 1000...) 上那 500 个字节。不好。

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

您没有检查 fgets() 的 return 值。即使您没有将 1000 字节读入 500 字节的缓冲区并且 fgets 运行良好,您的 strcmp() 也将始终失败,因为 fgets() 在字符串中包含换行符。

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