【问题标题】:cstring trouble for a beginner初学者的 cstring 麻烦
【发布时间】:2010-09-17 11:48:44
【问题描述】:

我正在尝试制作一个程序,逐行读取文件,然后将读取的行放入链接列表中,我的问题是将字符串添加到列表中。看代码,在else测试中可以看到我的问题。

#include<stdlib.h>
#include<stdio.h>

struct list_el {
    char *ord;
       struct list_el * next;
};

typedef struct list_el item;

int main(int argc, char *argv[]) {
    int c;
    item *curr, *head;
    head = NULL;
    FILE *fileHandle = fopen("tresmaa.txt", "r");

    while((c = fgetc(fileHandle)) != '\n' || c != EOF)
        if(c == EOF) {
            printf("\n");
            break;
        } else {
            curr = (item*)malloc(sizeof(item));
            curr->ord = "I cant point curr -< ord = c, how can i point the readed sentences to the value Ord?";
            curr->next = head;
            head = curr;
            putchar(c);
        }
    curr = head;

   while(curr) {
      printf("%s\n", curr->ord);
      curr = curr->next ;
   }
}

【问题讨论】:

  • 除了你的问题,这段代码是内存泄漏!您需要free 使用malloc 分配的所有内存。
  • 谢谢。我将 free(curr) 添加到我的代码中:D

标签: c linked-list cstring


【解决方案1】:
curr->ord = "some string" is wrong

相反,您需要分配一个缓冲区并将字符串放入其中

例如

curr->ord = malloc( strlen(yourstring) + 1 );
strcpy(curr->ord, yourstring);

因为

curr = (item*)malloc(sizeof(item));

只分配包含'ord'指针的结构体,但不分配它所指向的结构。

另一件看起来有点可疑的事情是

        curr->next = head;
        head = curr;

看起来更像是名称应该是“上一个”而不是“下一个”你这样做的方式(LIFO)

否则,如果你想要一个“正常”的 FIFO 链表,只有一个头 ptr 和一个尾 ptr,然后使用尾 ptr 来追加元素,同时保持头指向第一个列表元素。

【讨论】:

  • 谢谢。但是这个字符串对于 Java 程序员来说是非常混乱的。 int c 包含已读取的行,可用于 printf("%S", c) 打印该行。但我不能用 c 替换 yourstring = malloc(strlen(yourstring) +1);还没有退出理解cstring的意义
  • int c 仅包含您读取的一个字符,而不是字符串。在 C 中,字符串是一个字符数组 char[] + 一个用于保存结尾 \0 字符的位置。因此,如果您想从文件中读取一行,您通常会使用缓冲区: char buffer[maxlength] 然后使用 fgets(buffer,maxlength-1,filehandle) 将文件中的一行读入缓冲区,那么您将执行 curr->ord= malloc( maxlength ) 并将缓冲区复制到分配的位置 strcpy(curr->ord, buffer)。
  • 好的。我想在打印带有更改的字母的 cstring 之前更改节点 cstring 中的一些字母,因此我想使用 for 循环将 cstring 复制到另一个我将执行更改的 cstring。但我不能写 char tmp[300] = curr->ord;在 for 循环中。 Isent curr-> or 一个 char 数组?和 strcpy(new cstring, curr->ord) 不起作用。如何将 curr->ord 复制到 char [] ?
  • 不,你应该使用fgets(buffer,maxlength,filehandle) 而不是maxlength-1
  • @user102008 你当然是正确的,谢谢你的发现。
【解决方案2】:

我在 else 中看到了您的问题。 :)

你的结构体 malloc 不够用。这个 malloc 只创建结构内存(两个指针)的内存,而不是内部的内存。您还必须使用适当大小的字符串来分配您的字符内存 (ord)。使用strlen 并为 null 添加一个来确定此字符串的大小。

【讨论】:

  • 是的,因为 char *ord 是一个指向字符串的指针,现在我明白了。你能告诉我如何 malloc char 吗?
【解决方案3】:
curr->ord = "some string"

是对的!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 2015-03-09
    • 1970-01-01
    • 1970-01-01
    • 2012-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多