我有一段代码,它接受另一个函数的输出(该函数获取用户输入)并用破折号替换所有空格。或者说,那是它应该做的事情。相反,它接受字符串的第一个单词而忽略其余的单词(例如' 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;}
再一次,谢谢,所有!
答案 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;
}