【问题标题】:Reversing tokens from strtok results in empty string从 strtok 反转标记会导致空字符串
【发布时间】:2021-01-08 02:23:08
【问题描述】:

我正在尝试反转从 strtok 返回的单词/标记,我正在以相反的顺序迭代每个标记并将每个第 i 个值分配给一个名为 new 的缓冲区。我可以打印令牌指针p 的每个第 i 个值/字符,但由于某种原因,我无法分配字符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;
}

标准输出:


预期/预期输出:

sihT si na !elpmaxe

【问题讨论】:

  • 试试:i=strlen(p) -> i=strlen(p)-1。因为p[strlen(p)]NUL 字符(由strtok 放在那里)。一定要检查空字符串。
  • 不幸的是它似乎没有修复。
  • 但是你明白这是个问题吗?因此,即使它不能解决所有问题,您是否同意/理解它需要改变?
  • 是的,非常感谢您指出!

标签: c parsing pointers c-strings strtok


【解决方案1】:
  • 终止空字符将被添加到缓冲区new,因为循环的初始值为strlen(p)。应该是strlen(p)-1
  • i 的类型应该是ssize_t(有符号类型)而不是size_t(无符号类型),才能使i&gt;-1 正常工作。
  • 应为new 再分配一个字节,并应在字符串末尾添加终止空字符。

试试这个:

#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] = '\0'; /* add terminating null-character */
    printf("%s\n", new);
    return 0;
}

【讨论】:

  • 这项工作感谢您的解释!我是 c 字符串的新手,这对我帮助很大!
  • 我尝试了所有方法,除了 ssize_t 更改。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-26
  • 1970-01-01
  • 2019-02-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多