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