字符串问题

Issues with 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;}

再次感谢大家!

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

#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;

Is there any reason why this wouldn't work?

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

您根本不需要临时数组,传递指针不是 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;
}