字符串问题

时间:2016-09-09 15:07:11

标签: c++ string algorithm replace c-strings

我有一段代码,它接受另一个函数的输出(该函数获取用户输入)并用破折号替换所有空格。或者说,那是它应该做的事情。相反,它接受字符串的第一个单词而忽略其余的单词(例如' Hello World' - >' Hello')。这是片段:

void info::name(string* name, string title){
    char arr[title.size() + 1];
    strcpy(arr, title.c_str());
    int o = 0;
    while(arr[o] != 0){
        if(arr[o] == ' '){
            arr[o] = '-';
        };
        o++;
    };
    *name = arr;

这有什么理由不起作用吗?

编辑:组合C风格的数组和std::string是什么意思?

EDIT2:我尝试使用std :: replace,但同样的事情发生了。

EDIT3:我无法让getline()工作。以下是我使用它的方式:

getline(cin, *title, "/n");

为什么不起作用?

FINAL_EDIT:我终于开始工作了!这对我有用:

void info::title(string* title){
    cout << "Enter the name of your mod: ";
    getline(cin, *title); cout << endl;}
void info::name(string* name, string title){
    replace(title.begin(), title.end(), ' ', '-');
    *name = title;}

再一次,谢谢,所有!

2 个答案:

答案 0 :(得分:3)

这是一个演示程序,展示了如何实现您想要的效果。

#include <iostream>
#include <string>
#include <algorithm>
#include <iterator>

struct A
{
    static std::string name( const std::string &title )
    {
        std::string result;
        result.reserve( title.size() );

        std::replace_copy_if( title.begin(), title.end(),
                              std::back_inserter( result ),
                              []( char c ) { return c == ' '; }, '-' );

        return result;                            
    }
};

int main() 
{
    std::string title;
    std::string name;

    std::cout << "Enter a title: ";

    if ( std::getline( std::cin, title ) ) name = A::name( title );

    std::cout << name << std::endl;

    return 0;
}

如果要输入字符串"Hello World"

然后输出看起来像

Enter a title: Hello World
Hello-World

我只使用标准算法std::replace_copy_if来展示如何使用lambda表达式。例如,您也可以替换短划线的制表符。

std::replace_copy_if( title.begin(), title.end(),
                      std::back_inserter( result ),
                      []( char c ) { return c == ' ' || c == '\t'; }, '-' );

否则,您可以按照以下方式使用标准算法std::replace_copy

std::replace_copy( title.begin(), title.end(),
                   std::back_inserter( result ),
                   ' ', '-' );

如您所见,可以在不使用中间数组的情况下完成任务。此外,这个数组的声明

char arr[title.size() + 1];

不是符合C ++的声明,尽管某些编译器可以拥有自己的扩展,允许这样的声明..

你的功能也有拼写错误。我想你的意思是

*name = arr;

而不是

*name = title;

答案 1 :(得分:0)

  

有什么理由不行吗?

是的,您创建临时数组,修改它,然后将未修改的原始字符串分配给第一个参数指向的字符串。

根本不需要临时数组,传递指针不是C ++的方法:

std::string info::name( std::string title )
{
    std::replace( title.begin(), title.end(), ' ', '-' );
    return title;
}

如果你想使用循环(作业等所需),只需在字符串本身上执行:

std::string info::name( std::string title )
{
    for( size_t i = 0; i < title.length(); ++i ) {
        if( title[i] == ' ' )
            title[i] = '-';
    }
    return title;
}