我试图将文本文件中的单词存储在动态分配的字符数组中 . 我使用指针数组到字符数组,以便动态分配内存但由于某种原因,它只将最后一个输入字存储到我指向的所有字符数组中,即使在某些地方字符串不适合我分配较小字符串的空间 .
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main () {
char input_string[30];
int string_length, text_length;
// Calculating number of words in text file.
text_length=0;
freopen("in.txt", "r", stdin);
while (scanf("%s", &input_string)!=EOF) {
text_length++;
}
freopen("CON", "r", stdin);
// Dynamically assigning array of chars to store words
char **pointer;
int i;
pointer=(char*)calloc(text_length, sizeof(char));
freopen("in.txt", "r", stdin);
for (i=0;i<text_length;++i) {
scanf("%s", &input_string);
string_length = strlen(input_string);
pointer[i]=(char*)calloc(string_length, sizeof(char));
*(pointer+i)=input_string;
}
for (i=0;i<text_length;++i) {
printf("%s ", *(pointer+i));
}
freopen("CON", "r", stdin);
return 0;
}
1 回答
*(指针i)= input_string
这里input_string是数组,它从文件中获取字符串 . 因此在上面的语句中,您将使用输入字符串覆盖指针数组(已分配的内存)的地址 .
pointer [i] =(char *)calloc(string_length,sizeof(char)); // alloacted memory
(指针i)= input_string; //同名的内存覆盖此处指针[i]和(指针i)都通知相同
因此,数组的每个索引都具有相同的input_string基址,而取消引用它将给出数组中存在的字符串(最后一个字符串) . 这就是你的问题的原因 . 你做得更好memcpy或strcpy .
pointer [i] =(char *)calloc(string_length,sizeof(char)); strcpy(pointer [i],input_string)
要么
pointer [i] =(char *)calloc(string_length,sizeof(char)); memcpy(pointer [i],input_string,string_length)); ((指针i)string_length)= '\0'; / 在字符串末尾分配空字符 /