Program.exe已停止工作错误:fgets功能

时间:2015-08-25 22:40:13

标签: c exe

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

}

1 个答案:

答案 0 :(得分:1)

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

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

char *rs[1]分配一个包含1个字符指针的数组。它不为任何字符串分配任何内存。 rs[0] = "print"可以,因为&#34; print&#34;分配6个字节,赋值使rs [0]指向它们。但是你将rs传递给函数getInput并在其上调用sizeof,它给你一个指针的大小(可能是4或8个字节),因为C不保持数组维度 - 它只是传递一个指向数组开头的指针。你需要自己通过这个长度。

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

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