我试图以“ADAM”,“MARK”,“JESSIE”格式读取一些随机名称的文件......
我有一些约束,文件应该在函数中读取,但是应该可以从主函数访问而没有全局变量。 文件大小和文件中的名称不知道。 这是我到目前为止所做的。我对动态二维数组有些困难,因为我没有太多使用它们。
/* Function to read from the file */
int read_names(FILE *input, char ***names, int *name_count)
{
int f1,size,count,i,j=0;
char **name_array,*text,pos=0;
/* get the file size */
f1=open("names.txt",O_RDONLY);
size=lseek(f1,0,SEEK_END);
close(f1);
/* Reading all the characters of the file into memory */
//Since file size is known we can use block transfer
text=(char *) malloc(size * sizeof(char) );
fscanf(input,"%s",text);
/* Finding the no of names in the file */
for(i=0;i<size;i++)
{
if(text[i]==',')
count++;
}
printf("No. of names determined\n");
/* Assigning the Name count to the pointer */
name_count=(int*)malloc(sizeof(int));
*name_count=count;
name_array=(char **) malloc(count * sizeof(char *));
for(i=0;i<count;i++)
{
name_array[i]=(char*) malloc(10 *sizeof(char ));
}
for(i=0;i<size;i++)
{
if(text[i]!='"')
if(text[i]==',')
{
**name_array[pos][j]='\0'; //error here
pos++;
j=0;
}
else
name_array[pos][j++]=text[i];
}
printf("Names Counted\n");
printf("Total no of names: %d\n",*name_count);
names=(char ***) malloc(sizeof(char **);
names=&name_array;
return 1;
}
/* Main Function */
int main(int argc, char *argv[])
{
FILE *fp;
char ***names;
int *name_count;
int status;
// Opening the file
fp = fopen("names.txt","r");
// Now read from file
status = read_names(fp,names,name_count);
printf("From Main\n");
fclose(fp);
system("PAUSE");
return 0;
}
我使用WxDev并在尝试分配空字符时收到错误“`unary *'的无效类型参数。
有关如何执行此操作的任何指示?
答案 0 :(得分:1)
从生成错误的行中仔细查看此表达式,并考虑它正在做什么:
**name_array[pos][j]
记住方括号的precedence高于一元*,这相当于*(*((name_array[pos])[j]))
,即2个下标,后跟2个解引用。这是总共4个解除引用,因为foo[i]
相当于*(foo+i)
。声明的name_array
类型为char **
,这意味着您只能取消引用它两次。将类型声明char **name_array
视为**name_array
具有类型char
的含义,因为这是类型声明语法的基础(请参阅History of C,“胚胎C”)。 / p>
另一个问题就出现了:
name_array[i]=(char*) malloc(sizeof(char ));
在这里,您只为name_array
的每个元素中的单个字符分配足够的空间。
答案 1 :(得分:0)
**name_array[pos][j]='\0'; \\error here
我看到name_array
被声明为
char **name_array
问题在于
**name_array[pos][j]
尝试取消引用(两次!!)一个角色
** (name_array[pos]) [j]; /* name_array[pos] is of type (char*) */
** ( (name_array[pos]) [j] ); /* name_array[pos][j] is of type (char) */
你不能取消引用一个角色。
建议:简化您的代码。
当代码没有“行为”时,通常不是因为它太简单了;)
答案 2 :(得分:-1)
这可能看起来很迂腐,但这很重要。您没有使用2D阵列。实际上,您不会在代码中创建 ANY 数组。
要理解的一个重要事项是数组“衰减”成指针。
C中关于数组和指针的大部分混淆可以追溯到对这个语句的误解。假设数组和指针是
equivalent'' means neither that they are identical nor even interchangeable. What it means is that array and pointer arithmetic is defined such that a pointer can be conveniently used to access an array or to simulate an array. In other words, as Wayne Throop has put it, it's
指针算术和数组索引[那]在C中是等价的,指针和数组是不同的。'')