【问题标题】:How to put spaces intro array如何将空格放入数组
【发布时间】:2022-01-11 12:37:06
【问题描述】:

我有字符串,以数组形式提供。然后我做这个操作,比如重新排列单词中的字母。应该是“我喜欢狗”->“I 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”。而且由于没有空格,我无法再次获取此文本。 如何在这个字符串中加入空格?

【问题讨论】:

  • 请发帖minimal reproducible example。对输入进行硬编码很有帮助。
  • 使用strtok 来查找空格似乎有点矫枉过正。如果您手动浏览字符串,您将获得有关单词开始/结束位置所需的所有信息,这也意味着长度,这也将允许就地交换每个半字的字符。这使得该操作具有非破坏性和可逆性,而 strtok 会将 NUL 字节写入原始字符串,这可能是您遇到问题的部分原因。
  • 如何排列奇数字母单词示例"about"

标签: arrays c string char strtok


【解决方案1】:

了解strtok 的实际工作原理很重要。

在 C 中,每个字符串都以 NUL 字符 ("\0") 结束,以标记字符串的结尾。所以"Foo"其实是

{ 'F', 'o', 'o', '\0' }

在内存中。现在strtok 所做的是搜索令牌并用 NUL 字节替换令牌。所以如果你叫这个

char str[] = "I like dogs";
strtok(str, " ");

字符串str改为

"I\0like dogs"

并返回一个指向开头的指针。如果您现在阅读该字符串,它只是"I"。下次您调用strtok 时,字符串将如下所示:

"I\0like\0dogs"

你会得到一个指向l的指针,因此将其作为字符串读取会得到"like"。第三次调用只会返回一个指向d 的指针,因为没有更多的空格,因此您会得到"dogs"

注意strtok 如何更改您的初始字符串,因为它用 NUL 字节替换了空格,以及您如何永远不会从您的strtok 调用中取回空格?

我想现在你明白为什么你的代码没有按照你期望的方式工作,不是吗?

一个更简单的方法是根本不使用strtok。毕竟在 C 字符串中查找空格字符非常简单:

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 重置为零,您将从一个空间跳到另一个空间,直到您到达字符串的末尾。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多