gpt4 book ai didi

c - 如何修复使用strtok后打印的乱码

转载 作者:行者123 更新时间:2023-11-30 20:08:18 27 4
gpt4 key购买 nike

我有uni项目,我需要检查语法是否正确。我得到指向字符串的指针,并检查第一个标记是否可接受。如果没问题的话,我就继续前进。但如果不正常,我需要打印出错误的内容。

我所做的是创建一个缓冲区,因为我无法更改原始字符串。之后我使用 strtok 来剪切缓冲区,并查看我得到的 token 是否可以接受。

char *str = "sz = 12345";
printf("The check of MACRO: %d\n", isMacro(str));

int isMacro(char *str)
{
char buf = NULL;
char *token;
strcpy(&buf,str);
token = strtok(&buf," ");
printf("You here, value token is %s\n",token);
}

我期望 printf 会打印“sz”,但它打印:

You here, value str is sz<▒R

最佳答案

    char buf = NULL;

这是一个类型错误。 buf 是单个字符,但 NULL 是指针值。您无法将指针存储在 char 中。

    strcpy(&buf,str);

此代码具有未定义的行为(除非 str 恰好是空字符串)。 buf 不是缓冲区,它是单个 char,因此它没有空间存储整个字符串。

如果你想复制一个字符串,你需要为其所有字符分配足够的内存:

  1. 您可以使用strdup(这是 POSIX 中的,但不是标准 C 语言):

    char *buf = strdup(str);
    if (!buf) {
    ... handle error ...
    }
    ...
    free(buf);
  2. 您可以手动复制 strdup:

    char *buf = malloc(strlen(str) + 1);
    if (!buf) {
    ... handle error ...
    }
    strcpy(buf, str);
    ...
    free(buf);
  3. 您可以使用可变长度数组(但您受到堆栈大小的限制,并且无法检查错误):

    char buf[strlen(str) + 1];
    strcpy(buf, str);
    ...

关于c - 如何修复使用strtok后打印的乱码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57336490/

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