如何将空格放入数组
How to put spaces intro array
我有字符串,在数组中提供。然后我进行这种操作,比如在 word 中重新排列字母。它应该像“我喜欢狗” - >“我keli gsdo”然后我需要做相反的事情,比如把这个字符串变成“我再次喜欢狗”
这就是我得到句子的方式:
do {
gets_s(sent);
if (strcmp(sent, STEND) == 0)
break;
mp[k] = _strdup(sent);
} while (++k < NMAX);
以及我如何更改字母
for (int rech = 0; rech < k; rech++) {
char *piece;
piece = strtok(mp[rech], " ");
while (piece != NULL) {
char temp[20];
char *piece2 = temp;
strcpy(piece2, piece);
int k = strlen(piece) / 2;
int i =strlen(piece);
for (i - 1; i != 0; i--) {
piece[k - 1] = piece2[i - 1];
k--;
}
k = strlen(piece) / 2;
for (i = 0;k!=strlen(piece);i++) {
piece[k] = piece2[i];
k++;
}
//printf("%s ", piece1);
printf("%s ", piece);
piece = strtok(NULL, " ");
}
printf("\n");
}
但是当我想在数组 mp 中再次获取我的第一句话时,我得到了“likeldogsdo”。由于没有空格,我无法再次收到此文本。
如何在这个字符串中加入空格?
了解 strtok
的实际工作原理很重要。
在 C 语言中,每个字符串都以 NUL 字符 ("[=13=]"
) 结束,以标记字符串的结尾。所以 "Foo"
实际上是
{ 'F', 'o', 'o', '[=15=]' }
记忆中。现在 strtok
所做的是搜索令牌并用 NUL 字节替换令牌。所以如果你调用这个
char str[] = "I like dogs";
strtok(str, " ");
字符串str
改为
"I[=18=]like dogs"
并且指向开头的指针是 returned。如果您现在阅读该字符串,它就是 "I"
。下次调用 strtok
时,字符串将如下所示:
"I[=21=]like[=21=]dogs"
并且你得到一个指向 l
的指针,因此将其作为字符串读取得到 "like"
。第三次调用只是 return 指向 d
的指针,因为没有进一步的 space,因此你得到 "dogs"
.
请注意 strtok
如何更改您的初始字符串,因为它将 spaces 替换为 NUL 字节,以及您如何永远无法从 [=12] 中取回 spaces =] 电话?
我想你现在明白为什么你的代码没有按照你期望的方式工作了,不是吗?
一个更简单的方法是根本不使用 strtok
。毕竟在 C 字符串中找到 space 字符非常简单:
char * str = ...;
size_t nextSep = 0;
while (str[nextSep] && str[nextSep] != ' ') nextSep++;
// When you get here, str[nextSep] is either a space
// or a NUL byte, in which case the end of the string was
// reached before a space was found.
在另一个循环中重复此循环并且不将 nextSep
重置回零,您将从 space 跳到 space 直到到达字符串的末尾。
我有字符串,在数组中提供。然后我进行这种操作,比如在 word 中重新排列字母。它应该像“我喜欢狗” - >“我keli gsdo”然后我需要做相反的事情,比如把这个字符串变成“我再次喜欢狗”
这就是我得到句子的方式:
do {
gets_s(sent);
if (strcmp(sent, STEND) == 0)
break;
mp[k] = _strdup(sent);
} while (++k < NMAX);
以及我如何更改字母
for (int rech = 0; rech < k; rech++) {
char *piece;
piece = strtok(mp[rech], " ");
while (piece != NULL) {
char temp[20];
char *piece2 = temp;
strcpy(piece2, piece);
int k = strlen(piece) / 2;
int i =strlen(piece);
for (i - 1; i != 0; i--) {
piece[k - 1] = piece2[i - 1];
k--;
}
k = strlen(piece) / 2;
for (i = 0;k!=strlen(piece);i++) {
piece[k] = piece2[i];
k++;
}
//printf("%s ", piece1);
printf("%s ", piece);
piece = strtok(NULL, " ");
}
printf("\n");
}
但是当我想在数组 mp 中再次获取我的第一句话时,我得到了“likeldogsdo”。由于没有空格,我无法再次收到此文本。 如何在这个字符串中加入空格?
了解 strtok
的实际工作原理很重要。
在 C 语言中,每个字符串都以 NUL 字符 ("[=13=]"
) 结束,以标记字符串的结尾。所以 "Foo"
实际上是
{ 'F', 'o', 'o', '[=15=]' }
记忆中。现在 strtok
所做的是搜索令牌并用 NUL 字节替换令牌。所以如果你调用这个
char str[] = "I like dogs";
strtok(str, " ");
字符串str
改为
"I[=18=]like dogs"
并且指向开头的指针是 returned。如果您现在阅读该字符串,它就是 "I"
。下次调用 strtok
时,字符串将如下所示:
"I[=21=]like[=21=]dogs"
并且你得到一个指向 l
的指针,因此将其作为字符串读取得到 "like"
。第三次调用只是 return 指向 d
的指针,因为没有进一步的 space,因此你得到 "dogs"
.
请注意 strtok
如何更改您的初始字符串,因为它将 spaces 替换为 NUL 字节,以及您如何永远无法从 [=12] 中取回 spaces =] 电话?
我想你现在明白为什么你的代码没有按照你期望的方式工作了,不是吗?
一个更简单的方法是根本不使用 strtok
。毕竟在 C 字符串中找到 space 字符非常简单:
char * str = ...;
size_t nextSep = 0;
while (str[nextSep] && str[nextSep] != ' ') nextSep++;
// When you get here, str[nextSep] is either a space
// or a NUL byte, in which case the end of the string was
// reached before a space was found.
在另一个循环中重复此循环并且不将 nextSep
重置回零,您将从 space 跳到 space 直到到达字符串的末尾。