【问题标题】:Linked Lists & Pointer Syntax errors链接列表和指针语法错误
【发布时间】:2013-10-02 07:46:46
【问题描述】:

这个程序简单地获取一个带有 ASCII 行的文件,将它放入一个链表堆栈,然后以相同的 ASCII 格式将反向列表打印到一个新文件中。

我的结构代码:

typedef struct Node{
    char info[15];
    struct Node *ptr;
};

我在 Main 上收到以下错误。大多数人都必须在我声明新节点头的地方做......该语法有什么问题?:

Errors
    strrev.c:28: error: ‘Node’ undeclared (first use in this function)
    strrev.c:28: error: (Each undeclared identifier is reported only once
    strrev.c:28: error: for each function it appears in.)
    strrev.c:28: error: ‘head’ undeclared (first use in this function)
    strrev.c:34: warning: passing argument 1 of ‘strcpy’ from incompatible pointer type
   /usr/include/string.h:128: note: expected ‘char * __restrict__’ but argument is of         type ‘char **’

主代码:

int main(int argc, char *argv[])
{
    if (argc != 3) {
        fprintf(stderr, "usage: intrev <input file> <output file>\n");
        exit(1);
    }

    FILE *fp = fopen(argv[1], "r");
    assert(fp != NULL);


    Node *head = malloc(sizeof(Node));
    head->ptr=NULL;

    char str[15];
    while (fgets(str, 15, fp) != NULL){
        struct Node *currNode = malloc(sizeof(Node));
        strcpy(currNode->info, str);
        currNode->ptr = head;
        head=currNode;
    }

    char *outfile = argv[2];
    FILE *outfilestr = fopen(outfile, "w");
    assert(fp != NULL);

    while (head->ptr != NULL){
        fprintf(outfilestr, "%s\n", head->info);
        head = head->ptr;
    }

    fclose(fp);
    fclose(outfilestr);
    return 0;
}

【问题讨论】:

  • char *info[15] 在你的脑海中应该做什么?您能否先尝试验证您对 C 如何在小程序上工作的假设,然后在您确定 C 如何工作后才转向更复杂的程序?
  • 这是一个字符数组,包含文件中的一行。
  • 但事实并非如此。它是一个指针数组。事实上,你的编译器应该已经给你一个警告。您确定已启用所有警告吗?
  • 或者,当我添加它时。再次,当我声明一个新的头节点时,问题似乎出现了。来自Java,我想我看不出问题出在哪里。
  • gcc -o strrev strrev.c -Wall -m32 -O --> 所以是的

标签: c pointers syntax struct


【解决方案1】:

您对结构的typedef 有错误的语法。您需要将typedef 名称​​放在 结构定义之后:

typedef struct Node  /* <- structure name */
{
    /* ... */
} Node;  /* <- typedef name */

结构和类型可以使用相同的名称,因为它们位于不同的命名空间中。

【讨论】:

  • 省略结构名不是也合法吗?
  • 或者在while循环中使用struct Node。但在这种情况下,根本不需要 typedef。
  • 天哪。我..我会说实话,也许是因为我是新人,但我不完全确定为什么会这样......你知道我可以在 K&R 的哪里阅读更多关于这方面的信息吗?
  • @xmoex 虽然合法,但 OP 使用指向结构本身内部结构的指针,因此需要为结构命名。
  • @katiea 这就是fgets 的工作原理。它读取并在字符串中保留换行符,您需要手动删除它(通常str[strlen(str) - 1] = '\0'; 会起作用,但请确保fgets 调用没有首先失败)。
【解决方案2】:

你需要先有一个Node typedef

typedef struct Node Node;
typedef struct Node{
char *info[15];
Node *ptr;
};

或者一次性完成

typedef struct Node{
    char *info[15];
    struct Node *ptr;
} Node;

【讨论】:

  • struct 的声明不需要typedef。它不是类型定义(第二行代码应该只有struct Node{)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-17
  • 2017-01-19
  • 2013-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多