代码之家  ›  专栏  ›  技术社区  ›  new User

在不复制的情况下开始修剪Cstring

  •  1
  • new User  · 技术社区  · 6 年前

    我设法把作业做完了,但它不应该起作用,因为我还没做完。我不知道为什么会这样。我需要帮助。

    #include<iostream>
    using namespace std;
    
    char* trim(char* str) {
        const int lenStr = strlen(str);
        int characters = 0;
        bool trimmableFront = false;
        int firstChar;
    
        //check if trimmableFront + location of first char
        for (int i = 0; i < lenStr; i++) {
            if (*(str + i) != ' ') {
                if (characters == 0)
                    firstChar = i;
                characters++;
            }
            if (characters == 0) {
                trimmableFront = true;
            }
        }
    
        //trim Front //THIS PART SHOULD BEHAVE DIFFERENTLY
        if (trimmableFront) {
            for (int i = 0; i < lenStr; i++) {
                if((firstChar + i <= lenStr))
                    *(str + i) = *(str + firstChar + i); 
            }
        }
        return str;
    }
    
    
    int main() {
    
        char str[] = "       why does it work?";
        trim(str);
        cout<< str <<endl;
        return 0;
    }
    

    在trim(*char)函数的末尾,修剪后的字符串应该仍然有以前位置的剩余部分。 出于某种原因,它被完美地修剪过,并且可以像预期的那样打印“为什么它可以工作?”但它应该打印一些类似“为什么它不起作用?”

    1 回复  |  直到 6 年前
        1
  •  3
  •   user95asf    6 年前

    它之所以有效,是因为在通过移动每个字符来修剪字符串时,也会移动终止的空字符 '\0' 。正如您可能知道的,c字符串是以 “\0” ,以便打印时 str 具有 cout 打印所有字符,直到达到空值:这就是不打印剩余字符的方式。