如何将空格放入数组

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 直到到达字符串的末尾。