我对C很新;在课堂上看了3个星期。我在使用指针时遇到了一些麻烦,我确信可能有一个简单的修复方法。所以基本上,这个程序应该从输入文件读取一个单词,将它存储在一个带有内存分配的指针数组中,打印单词和单词的规范化形式(无关过程),然后重新分配空间,以便指针数组将随着输入更多单词而增长。但是,我在打印单词和重新分配数组时遇到了一些麻烦(我目前将其设置为固定大小,只是为了解决整个打印方面的问题)。让我知道我的变量声明是否有问题,或者如果我只是犯了一个愚蠢的错误(我相信它可能是两者的组合)。再说一遍,我对C很新,所以如果这是一个简单的问题我会道歉。
char * word_regular[100];
char * word_norm[100];
int main (int argc, char * argv[])
{
if (argc != 2){
printf("You have not entered a valid number of files.\n");
exit(1);
}
FILE * f_in = fopen(argv[1],"r");
int i = 0;
char word[512];
char norm_word[512];
while(fscanf(f_in, "%s", word) != EOF) {
if (is_valid_entry(word)) {
word_regular[i] = malloc(sizeof(char) * strlen(word) + 1);
strcpy(word_regular[i],word);
printf("%s\n",*word_regular[i]);
word_norm[i] = malloc(sizeof(char) * strlen(norm_word) + 1);
normalize(word, norm_word);
strcpy(word_norm[i],norm_word);
printf("%s\n", *word_norm[i]);
i++;
答案 0 :(得分:1)
当前代码存在的一些问题(忽略动态大小需要而不是修复,因为你已经说过要用它来调试),
printf("%s\n",*word_regular[i]);
%s需要char *进行打印,因此它应该是
printf("%s\n",word_regular[i]);
对于第二个printf,因为norm_word本身是一个char数组,
你应该只使用
printf("%s\n", &norm_word[i]);
如果要从第i个索引开始打印字符串。
<强>更新强>: 快速提示是要注意是否使用字符串复制\ 0。因为你的api调用,比如strlen会超出字符串崩溃(或者是最默默的),除非它被null终止。
答案 1 :(得分:0)
printf
来电的问题在于您传递char
(*word_regular[i]
,*norm_word[i]
)而不是char *
({{1}尝试打印字符串时,},word_regular[i]
。
如果你想动态增长数组,你需要首先动态分配它,所以不要声明指针数组:
word_norm[i]
你需要声明指针指针:
char * word_regular[100];
char * word_norm[100];
为它们分配一个初始缓冲区(在一个函数中,例如main):
char ** word_regular;
char ** word_norm;
然后根据需要重新分配它们。
word_regular = malloc(sizeof(char *) * INITIAL_AMOUNT);
你需要跟踪数组中的指针数量,当然要正确释放它们......