从 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;
}
我试图反转从 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;
}