我用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 :(得分: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)
?