C如何在一个阵列中引用各种内存位置

时间:2013-03-30 11:13:07

标签: c arrays pointers

我正在读取文件并将每个字符添加到数组中。然后我通过删除空格和其他非必要字符将这些字符分解为单词。现在,为了单独处理每个单词,我想将每个单词添加到它自己的数组中。有没有办法做到这一点?我试图添加每个单词开头的内存位置,但它一直给我一个数组开头的内存地址。问题是,在下面的代码中,名为'buffer'的变量用while循环的每次迭代用一个新单词覆盖自己。我需要能够引用每个单词以将其推送到链接列表中。这是我到目前为止所做的:

#include <stdio.h>
#include <ctype.h>

int main(int argc, char **argv) {
char buffer[1024];
int c;
size_t n = 0;

FILE *pFile = stdin;

pFile = fopen(argv[1], "r");
if (pFile == NULL) perror("Error opening file");
    else {
        while(( c = fgetc(pFile)) != EOF ) {

            if (isspace(c) || ispunct(c)) {

                if (n > 0) {
                    buffer[n] = 0;
                    printf("read word %s\n", buffer);
                    n = 0;
                }
            } else {
                buffer[n++] = c;
            }
        }
        if (n > 0) {
            buffer[n] = 0;
            printf("read word %s\n", buffer);
        }
        fclose(pFile);
    }
return 0;
}

如果我提供一个包含字符的文件“这是一个包含本练习单词的测试文档”,则会生成以下内容:

read word This
read word is
read word a
read word test
read word document
read word that
read word holds
read word words
read word for
read word this
read word exercise

3 个答案:

答案 0 :(得分:1)

如果你需要的只是存储你读过的字符串,那么你可以使用strdupman strdup获取更多信息)来制作缓冲区的副本然后将指针存储在一个数组中或者你提到的链表。

请记住,strdup使用malloc为每个字符串分配存储空间,并且必须在不再需要字符串时自行释放此内存。另外,重复使用malloc分配许多小块内存可能会很昂贵,所以请谨慎使用!

答案 1 :(得分:1)

buffer仍然是指针,即指针算术适用。无论何时遇到单词结尾,你都会在0内写buffer - 这很好。现在你需要做的就是让你的下一个单词在一个单独的数组中快速buffer到下一个自由位置:

buffer += n;

为了让它看起来更整洁,你可以完全放弃n,在任何地方都有buffer++并复制单词的下一个字符,如*buffer = c

然后每个单词都位于自己的数组中,并且它们不重叠。您可以使用指向单词开头的指针存储到链接列表中。您可以使用传统的字符串函数(例如strlen),它们的输出不会受到内存中字符串背靠背打包的影响。这是可能的,因为您在每个存储的单词的末尾添加了0

答案 2 :(得分:1)

看起来你有一个良好的开端。你正在做的是成功地将所有单词一次一个地读入一个数组中,并且每次都覆盖它们。

  

问题是,在下面的代码中,变量名为&#39; buffer&#39;用while循环的每次迭代用一个新单词覆盖自己。

当然可以:

     if (n > 0) {
           buffer[n] = 0; // this line terminates each string
           printf("read word %s\n", buffer);
           n = 0;         // this line resets the array so you overwrite with the next
                          // word
     }

所以在这一点上你只需要将这些单词放入链表而不是覆盖它们。您可以将它们全部存储在阵列中(如果它足够长)但是为什么在您不得不将它们取出时需要费心?你真正需要做的就是替换这一行:

printf("read word %s\n", buffer);

使用代码将单词添加到链接列表中。基本上你需要某种节点&#34;结构,在最基本的意义上你需要做一些事情:

struct node{
   char * word;       // place to add the word
   struct node *next; // pointer to the next node
};

您只需要为每个节点和节点中的每个字符串获取一些内存,以下代码假定您有一个指向链接列表中第一个节点的头节点,并且您有一个指向从head开头的当前节点的指针:

cur->next = malloc(sizeof(node));          // assign memory for a new node
cur = cur->next;                           // move current to the next node
cur->word = malloc(sizeof strlen(buffer)); // assign memory for the word
cur->next = NULL;                          // set the next pointer to NULL
strcpy(cur->word, buffer);                 // copy the word from the buffer 
                                           //   to your list