【问题标题】:Trimming spaces C++ POINTERS修剪空格 C++ 指针
【发布时间】:2016-02-15 10:45:38
【问题描述】:

我在函数trim 中编写了简单的函数来修剪文本中的空格。 它几乎可以工作。我有一个问题,因为它也应该更改原始字符串,但它没有。问题是什么?请描述。我很感激任何帮助。谢谢:) 代码:

#include <iostream>
#include <string.h>
using namespace std;

char* trim(char *str) {

    while(*str==' '){
        *str++;
    }

    char *newstr = str;

    return newstr; 
}


int main(){
    char str[] = "   Witaj cpp", *newstr;

    cout << "start" << str << "end" << endl;    // start   Witaj cppend

    newstr = trim(str);

    cout << "start" << str << "end" << endl;    // startWitaj cppend

    cout << "start" << newstr << "end" << endl;    // startWitaj cppend

    return 0;
}

【问题讨论】:

  • 我有一个问题,因为它也应该更改原始字符串,但它没有。 -- 您的函数不会更改任何内容,甚至不会尝试更改任何内容。它所做的只是返回一个指针。
  • 那么我如何修改字符串而不返回它,只处理指针?
  • 我认为你的意思是 'str++' 而不是 '*str++';那里没有deref!
  • @jawjaw 请重新考虑这件事。如果我将一个指向用new [] 分配的char 的指针传递给你怎么办?你的函数(如果你让它工作),然后将指针移到我身上,现在当我调用delete [ ] 时,指针已经改变,导致未定义的行为。无论如何,当您拥有std::string 以及各种算法和字符串函数来执行此操作时,为什么要执行所有这些操作?
  • char *newstr = str; 和 return newstr; 的作用与 return str; 相同。你写的方式向我表明你正在积极尝试复制字符串,这不是这样做的方法。 (你需要strcpy)。

标签: c++ string pointers append


【解决方案1】:

它不应该更改原始字符串 - 即使像 *str=something; 这样的代码也不会出现。 修改原字符串,可以这样写

char* trim(char *str) {
    char* oldstr = str;

    while(*str==' '){
        str++;//*str++; // What's the point of that *
    }


    char *str2 = oldstr;

    while(*str!='\0'){
        *(str2++) = *(str++);
    }
    *str2 = '\0';

    return oldstr;


}

【讨论】:

  • 如果允许,应该使用strcpy()
  • @AMomchilov 你是对的。我只是想回应我所说的,使“*str=something;”出现
【解决方案2】:

您当前的代码仅搜索空格。

您需要将空格字符替换为非空格字符。这通常通过将非空格字符复制到第一个重复空格来完成。

给定:

+---+---+---+---+---+---+---+---+---+---+---+---+---+------+  
| P | e | a | r |   |   |   |   | f | r | u | i | t | '\0' |   
+---+---+---+---+---+---+---+---+---+---+---+---+---+------+  

您希望结果字符串看起来像:

+---+---+---+---+---+---+---+---+---+---+---+---+---+------+  
| P | e | a | r |   |   |   |   | f | r | u | i | t | '\0' |   
+---+---+---+---+---+---+---+---+---+---+---+---+---+------+  
                                  |  
                      +-----------+  
                      |  
                      V   
+---+---+---+---+---+---+---+---+---+---+------+  
| P | e | a | r |   | f | r | u | i | t | '\0' |   
+---+---+---+---+---+---+---+---+---+---+------+  

您将通过取消引用您的指针来分配值。

在你的while 循环之后,你有:

+---+---+---+---+---+---+---+---+---+---+---+---+---+------+  
| P | e | a | r |   |   |   |   | f | r | u | i | t | '\0' |   
+---+---+---+---+---+---+---+---+---+---+---+---+---+------+  
                  ^  
                  |  
str --------------+

所以你需要另一个跳过连续空格的指针:

+---+---+---+---+---+---+---+---+---+---+---+---+---+------+  
| P | e | a | r |   |   |   |   | f | r | u | i | t | '\0' |   
+---+---+---+---+---+---+---+---+---+---+---+---+---+------+  
                      ^           ^  
                      |           |   
++str ----------------+           |  
                                  |  
non_space ------------------------+

增加目标指针src,然后复制直到字符串结尾或找到空格字符:

   ++str; // Skip past the first space.
   *str++ = *non_space;

如果您使用 C++ std::string 类型,则可以使用 find_first_not_of 方法跳过过去的空格。

std::string 也有从字符串中删除字符的方法; std::string 会根据需要移动字符。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 2011-05-07
    • 2011-09-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-25
    相关资源
    最近更新 更多