C 试图将唯一的字读入文件,但内存分配有问题
在下面的代码中出现了一个奇怪的问题,出于某种原因,buff is在while循环的每次迭代中都会覆盖arr。 代码意味着逐行读取文本文件,每行读取两个单词,并在“arr”数组中搜索每个单词。如果找到,将返回其索引,如果没有,则将其存储在下一个可用位置并返回索引C 试图将唯一的字读入文件,但内存分配有问题,c,arrays,string,pointers,memory-management,C,Arrays,String,Pointers,Memory Management,在下面的代码中出现了一个奇怪的问题,出于某种原因,buff is在while循环的每次迭代中都会覆盖arr。 代码意味着逐行读取文本文件,每行读取两个单词,并在“arr”数组中搜索每个单词。如果找到,将返回其索引,如果没有,则将其存储在下一个可用位置并返回索引 #include <stdio.h> #include <stdlib.h> #include <string.h> /*given a new word t, it searches in arr f
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*given a new word t, it searches in arr for it, if found returns the index
if not found returns first availble index and stores it */
int searchIndex(char * t,char **arr, int n){
int i;
for(i=0;i<=n;i++){
if(arr[i]==NULL){
arr[i]=t;
return i;
}
if(strcmp(arr[i],t)==0)
return i;
}
}
int main(int argc, char* argv[])
{
char *token =(char *)malloc(sizeof(char)) ;
const char s[2] = " ";
FILE *fp;
char buff[255];
int index;
int V=3; // Number of vertices in graph
char ** arr = (char **)malloc(sizeof(char*)*V) ;
fp = fopen(argv[1], "r");
//loop reads words from file and assigns each word a uniqe index in arr
while(fgets(buff, 255, (FILE*)fp))
{
printf("arr in begining of iteration: \n");
printf("%s \t",arr[0]);
printf("%s \t",arr[1]);
printf("%s \t",arr[2]);
printf("\n");
token = strtok(buff, s);
printf("first token read: %s \t",token);
index = searchIndex(token,arr,V);
printf("first tokens index: %d \t",index);
printf("\n");
token = strtok(NULL, s);
printf("second token read: %s \t",token);
index = searchIndex(token,arr,V);
printf("second tokens index: %d \t",index);
printf("\n");
printf("arr at end of iteration: \n");
printf("%s \t",arr[0]);
printf("%s \t",arr[1]);
printf("%s \n",arr[2]);
printf("\n");
}
fclose(fp);
return 0;
}
#包括
#包括
#包括
/*给定一个新词t,它在arr中搜索它,如果找到,则返回索引
如果未找到,则返回第一个可用索引并存储它*/
整数搜索索引(字符*t,字符**arr,整数n){
int i;
对于(i=0;i此处
您分配V
指针
在这里,您将传递已分配的内容以及指向的元素数量arr
index = searchIndex(token,arr,V);
在searchIndex()
中,您在分配时迭代一个多个元素:
int searchIndex(char * t,char **arr, int n){
int i;
for(i=0;i<=n;i++){
int searchIndex(char*t,char**arr,int n){
int i;
对于(i=0;i在每次迭代时,从文件中读入buff
,在空格上进行标记化buff
拆分,然后将指向标记化字符串的指针存储在arr
中。注意:由于您正在存储指向buff
中位置的指针,下次读入buf
可能会覆盖arr
中的数据
在searchIndex()
中,您需要将令牌的副本存储在arr
中。您可以使用strdup()
对于这一点。另外,您在搜索循环中重复了太多的1次,这是另一个问题,但不是直接导致覆盖arr
的问题。另外,一旦arr
已满,函数不会返回显式值(可能是任何值!)-您可以返回-1以指示完整数组:
int searchIndex(char * t,char **arr, int n) {
int i;
for(i=0; i<n; i++) {
if (arr[i] == NULL) {
arr[i] = strdup(t);
return i;
}
if (strcmp(arr[i], t) == 0)
return i;
}
return -1;
}
int searchIndex(char*t,char**arr,int n){
int i;
对于(i=0;这是for(i=0;我也是如此),在向世界展示代码之前,您可能希望更精确地缩进您的代码。char*token=(char*)malloc(sizeof(char));
这行代码错误至少有三个原因,您能识别它们吗?应该是:char*token=(char*)malloc(sizeof(char*);?它应该是:char-token=(char)malloc(sizeof(char*));仅仅是char*token;
感谢大家,仍然有一个问题,不管我做什么,arr大小保持在2,如果我尝试访问索引超过1,我会出错,有什么想法吗?arr
大小实际上是3,根据变量V
。最大索引是2。增加V
以增加arr
的大小。您需要解释在“不工作”中。这是编译错误还是运行时错误?您看到了什么输出?请注意,malloc不会初始化分配的内存,即char**arr=(char**)malloc(sizeof(char*)*V);
可能不会导致V char*指针全部初始化为NULL。要么在调用malloc后初始化这些指针,要么像这样使用calloc:arr=(char**)calloc(V,sizeof(char*));
谢谢大家!我不经常使用c,你们帮了我很大的忙!
int searchIndex(char * t, char ** arr, int n) {
int i;
for (i=0; i<n; i++) {
int searchIndex(char * t,char **arr, int n) {
int i;
for(i=0; i<n; i++) {
if (arr[i] == NULL) {
arr[i] = strdup(t);
return i;
}
if (strcmp(arr[i], t) == 0)
return i;
}
return -1;
}