gpt4 book ai didi

c - 字符串和指针

转载 作者:塔克拉玛干 更新时间:2023-11-03 05:40:07 26 4
gpt4 key购买 nike

我有一个关于字符串和指针的问题。请仅用 C/C++ 程序解释....

有一个文件,每行包含一个单词。我知道没有。文件中的单词。请在小代码的帮助下解释我如何有效地将这些单词存储在 RAM 中。

fscanf(fp,"%s",word) & strcpy 是将单词存储在 RAM 中的唯一方法...没有其他有效的算法或逻辑可用..

谢谢。

最佳答案

可能最有效的方法是将整个文件以一个 block 的形式读入内存(使用fread)。然后分配一个指针数组,每个单词一个。然后遍历内存中的文件,将 \n 字符更改为 \0 并将指针存储在每个 \0 之后的字符中数组。

它是高效的,因为它只执行一次 I/O 操作,两次内存分配,并循环遍历文件中的字符两次(一次将它们复制到缓冲区,然后再次将它们分解成单独的字符串)。您描述的算法(fscanfstrcpy)将执行许多 I/O 操作,为每个单词分配内存,并至少循环遍历字符 3 次(一次读取进入缓冲区,一次找到要为其分配内存的长度,一次从缓冲区复制到分配的内存中)。

这是一个没有错误检查的简单版本:

char* buffer; // pointer to memory that will store the file
char** words; // pointer to memory that will store the word pointers

// pass in FILE, length of file, and number of words
void readfile(FILE *file, int len, int wordcnt)
{
// allocate memory for the whole file
buffer = (char*) malloc(sizeof(char) * len);
// read in the file as a single block
fread(buffer, 1, size, file);

// allocate memory for the word list
words = (char**) malloc(sizeof(char*) * wordcnt);
int found = 1, // flag indicating if we found a word
// (starts at 1 because the file begins with a word)
curword = 0; // index of current word in the word list

// create a pointer to the beginning of the buffer
// and advance it until we hit the end of the buffer
for (char* ptr = buffer; ptr < buffer + len; ptr++)
{
// if ptr points to the beginning of a word, add it to our list
if (found)
words[curword++] = ptr;
// see if the current char in the buffer is a newline
found = *ptr == '\n';
// if we just found a newline, convert it to a NUL
if (found)
*ptr = '\0';
}
}

这是一个使用 strtok 的稍微简单的版本:

char* buffer;
char** words;

void readfile(FILE *file, int len, int wordcnt)
{
buffer = (char*) malloc(sizeof(char) * len);
fread(buffer, 1, size, file);
buffer[len] = '\0';

words = (char**) malloc(sizeof(char*) * wordcnt);
int curword = 0;
char* ptr = strtok(buffer, "\n");
while (ptr != NULL)
{
words[curword++] = ptr;
ptr = strtok(NULL, "\n");
}
}

请注意,以上两个示例均假定文件中的最后一个单词以换行符结尾!

关于c - 字符串和指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5321075/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com