如何为C中的字符**动态分配内存
在这个函数中,我将如何为char**list动态分配内存 这个程序的基本思想是我必须从一个文件中读入一个单词列表。我不能假设最大字符串或最大字符串长度 我必须用C字串做其他的东西,但我应该可以用这些东西 谢谢如何为C中的字符**动态分配内存,c,arrays,c-strings,dynamic-allocation,C,Arrays,C Strings,Dynamic Allocation,在这个函数中,我将如何为char**list动态分配内存 这个程序的基本思想是我必须从一个文件中读入一个单词列表。我不能假设最大字符串或最大字符串长度 我必须用C字串做其他的东西,但我应该可以用这些东西 谢谢 void readFileAndReplace(int argc, char** argv) { FILE *myFile; char** list; char c; int wordLine = 0, counter = 0, i; int max
void readFileAndReplace(int argc, char** argv)
{
FILE *myFile;
char** list;
char c;
int wordLine = 0, counter = 0, i;
int maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
myFile = fopen(argv[1], "r");
if(!myFile)
{
printf("No such file or directory\n");
exit(EXIT_FAILURE);
}
while((c = fgetc(myFile)) !=EOF)
{
numberOfChars++;
if(c == '\n')
{
if(maxNumberOfChars < numberOfChars)
maxNumberOfChars += numberOfChars + 1;
numberOfLines++;
}
}
list = malloc(sizeof(char*)*numberOfLines);
for(i = 0; i < wordLine ; i++)
list[i] = malloc(sizeof(char)*maxNumberOfChars);
while((c = fgetc(myFile)) != EOF)
{
if(c == '\n' && counter > 0)
{
list[wordLine][counter] = '\0';
wordLine++;
counter = 0;
}
else if(c != '\n')
{
list[wordLine][counter] = c;
counter++;
}
}
}
void readFileAndReplace(int-argc,char**argv)
{
文件*myFile;
字符**列表;
字符c;
int字线=0,计数器=0,i;
int maxNumberOfChars=0,numberOfLines=0,numberOfChars=0;
myFile=fopen(argv[1],“r”);
如果(!myFile)
{
printf(“无此类文件或目录”);
退出(退出失败);
}
而((c=fgetc(myFile))!=EOF)
{
numberOfChars++;
如果(c=='\n')
{
if(maxNumberOfChars0)
{
列表[字行][计数器]='\0';
wordLine++;
计数器=0;
}
如果(c!='\n'),则为else
{
列表[wordLine][counter]=c;
计数器++;
}
}
}
这样做:
char** list;
list = malloc(sizeof(char*)*number_of_row);
for(i=0;i<number_of_row; i++)
list[i] = malloc(sizeof(char)*number_of_col);
maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
while((c = fgetc(myFile)) !=EOF){
if(c == '\n'){
numberOfLines++;
if(maxNumberOfChars < numberOfChars)
maxNumberOfChars = numberOfChars;
numberOfChars=0
}
numberOfChars++;
}
wordLine
和counter
是0
在此代码之前:
list = malloc(sizeof(char*)*wordLine+1);
for(i = 0;i < wordLine ; i++)
list[i] = malloc(sizeof(char)*counter);
编辑:
你的第三个问题的新版本。您正在读取文件两次。所以,在第二个循环开始之前,您需要先创建第一个字符
尝试:
fseek(fp, 0, SEEK_SET); // same as rewind()
rewind(fp); // same as fseek(fp, 0, SEEK_SET)
另外,我对您计算numberOfLines
和maxNumberOfChars
的逻辑有疑问。请检查一下
编辑
我认为您对maxNumberOfChars=0,numberOfLines=0的计算是错误的尝试如下:
char** list;
list = malloc(sizeof(char*)*number_of_row);
for(i=0;i<number_of_row; i++)
list[i] = malloc(sizeof(char)*number_of_col);
maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
while((c = fgetc(myFile)) !=EOF){
if(c == '\n'){
numberOfLines++;
if(maxNumberOfChars < numberOfChars)
maxNumberOfChars = numberOfChars;
numberOfChars=0
}
numberOfChars++;
}
如果我是你,我会使用mmap
将文件映射到私有内存,然后在文件上迭代,将单词的开头存储在char**
数组中,可以随着realloc
的使用而增加,并用0替换换行符
这样,您就可以将单词作为一个连续块存储在内存中,而不必关心文件I/O,因为您可以将整个文本文件作为char*
存储在内存中,并且不必对数组进行malloc
有关函数的信息,请参阅相应的手册页,或给我留言:)
编辑:如果您还不知道mmap,请查看以下内容:
如今,大多数C程序员仍然尝试使用fopen
和friends将文件读入内存,但这是完全不必要的,而且会带来额外的复杂性。(缓冲,不断增长的阵列,…)和mmap
是一个很好的替代方案,它将所有讨厌的工作转移到操作系统上尝试了它,我遇到了seg故障。我将编辑我的代码以显示我是如何实现它的。感谢您的快速回复。我指定了wordLine和counter的值,但仍然不起作用。@CarlosCarrillo现在有什么问题吗。在malloc()
之前打印出您的字线和计数器以检查值。如果我事先不知道字线?我是否必须切换到使用链表,链表中的每个节点代表一个单词?@viki.omega9如果您无法计算需要的大小,那么您有两种方法(1)(2)链表
maxNumberOfChars = 0, numberOfLines = 0, numberOfChars = 0;
while((c = fgetc(myFile)) !=EOF){
if(c == '\n'){
numberOfLines++;
if(maxNumberOfChars < numberOfChars)
maxNumberOfChars = numberOfChars;
numberOfChars=0
}
numberOfChars++;
}
malloc(sizeof(char)*(maxNumberOfChars + 1));