从 strtok 中反转标记会导致空字符串

Reversing tokens from strtok results in empty string

我试图反转从 strtok 返回的 words/tokens,我以相反的顺序迭代每个标记并将每个第 i 个值分配给一个名为 new 的缓冲区。我可以打印令牌指针 p 的每个 value/char,但由于某种原因,我无法分配字符 p 指向缓冲区 new。我在这里遗漏了什么或做错了什么?

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

int main(void) {
    char str[] = "This is an example!";
    char *new = malloc(strlen(str));
    char *p = strtok(str, " ");
    size_t j = 0;
    while (1) {
        for (size_t i=strlen(p)-1; i>-1; i--) {
            new[j++] = p[i];
        }
        p = strtok(NULL, " ");
        if (!p)
            break;
        new[j++] = ' ';
    }
    printf("%s\n", new);
    return 0;
}

标准输出:


Intended/expected 输出:

sihT si na !elpmaxe
  • 终止null-character将被添加到缓冲区new,因为循环的初始值为strlen(p)。应该是 strlen(p)-1.
  • i的类型应该是ssize_t(有符号类型)而不是size_t(无符号类型)才能使i>-1正常工作。
  • 应为 new 再分配一个字节,并应在字符串末尾添加终止 null-character。

试试这个:

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

int main(void) {
    char str[] = "This is an example!";
    char *new = malloc(strlen(str)+1); /* allocate one more byte */
    char *p = strtok(str, " ");
    size_t j = 0;
    while (1) {
        for (ssize_t i=strlen(p)-1; i>-1; i--) { /* fix loop */
            new[j++] = p[i];
        }
        p = strtok(NULL, " ");
        if (!p)
            break;
        new[j++] = ' ';
    }
    new[j] = '[=10=]'; /* add terminating null-character */
    printf("%s\n", new);
    return 0;
}