【问题标题】:Failed to use strcpy() in stack在堆栈中使用 strcpy() 失败
【发布时间】:2021-03-12 12:20:56
【问题描述】:

这是一个关于从堆栈中推送字符串和弹出字符串的代码,字符串名称必须是固定的(不是用户输入的)。但是代码无法运行(它无法显示任何内容)。关键是因为strcpy(temp->id,val);,如果我去掉strcpy(temp->id,val);,那么代码可以正常运行(但是printf 不可读的字符)。我可以知道我的strcpy 有什么问题吗?

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

struct LLNode
{
    char id[4];
    struct LLNode *next;
};

struct LLNode * createNode(char val[])
{
    struct LLNode *temp;
    temp=(struct LLNode *)malloc(sizeof(struct LLNode));
    strcpy(temp->id,val);
    temp-> id[4] = val;
    temp-> next = NULL;
    return (temp);
};

char push(char val[], struct LLNode *head)
{
    struct LLNode *temp;
    temp = createNode(val);
    temp->next = head->next;
    head->next = temp;
};

char pop(struct LLNode *head)
{
    struct LLNode *temp;
    char val;
    val = head->next->id;
    temp = head->next;
    head->next = head->next->next;
    free(temp);
    return(val);
};

int main()
{
    char value;
    struct LLNode *head = NULL;
    struct LLNode *tail = NULL;
    struct LLNode *curr;

    head = createNode('\0');
    tail = createNode('\0');

    char id[6][4] = {"A123","B234","C345","D456","E567","F678"};
    int n;

    for (int i=0;i<6;i++)
    {
        push(id[i],&head->id);
        printf("%s\n",&head->id);
    }


};

【问题讨论】:

  • 您的 id 字段和数组没有足够的空间容纳空终止符。
  • head = createNode('\0'); - 无效,编译器应该警告你。此函数需要一个字符串,但您传递单个 char。替换为head = createNode("");
  • @EugeneSh。是的,我已替换,但代码仍显示空结果(带有strcpy(temp-&gt;id,val);)或不可读的字符(不带strcpy(temp-&gt;id,val);)只是为了确保我的strcpy(temp-&gt;id,val); 正确吗?

标签: c string stack push strcpy


【解决方案1】:
char id[4];

char id[6][4] = {"A123","B234","C345","D456","E567","F678"};

字符串是一个以 nul 结尾的非 nul 元素序列包括终止符

你总是忘记那个小而重要的终结者。

虽然在使用字符串文字初始化具有显式长度的数组时效果很好,因为您可能会以这种方式删除隐式终止符,但请记住此后您没有字符串

无论如何,您的节点数组没有利用该规则,而且太短了。


struct LLNode * createNode(char val[]);

head = createNode('\0');

不应为期望字符串的函数提供单个字符。更糟糕的是,'\0' 是一个合法的空指针文字。即使那不是你想要的。


temp-> id[4] = val;

分配一个指向字符数组末尾的指针是不可能的。您是否要求编译器发出警告并遵守特定标准?对于 gcc / clang,我建议至少 -Wextra -std=c99 -pedantic.

【讨论】:

  • 嗯...我已经修改过了,但似乎不是导致无法读取字符或无法显示整个功能的主要问题(strcpy(temp-&gt;id,val);)。
  • @Scarlet 你在structids 的数组中都修复了吗?
  • @Eugene Sh.是的...我已将所有 4 个更改为更大的数字,但仍然不能
  • 查看我在问题下的第二条评论。
  • 你要求警告吗? temp-&gt;id[4] = val; 至少应该发出警告。
猜你喜欢
  • 2017-11-22
  • 2016-03-18
  • 1970-01-01
  • 2017-01-18
  • 2017-10-18
  • 1970-01-01
  • 2020-04-09
  • 1970-01-01
  • 2015-02-05
相关资源
最近更新 更多