字符串问题
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;
}
我有一段代码获取另一个函数的输出(该函数获取用户输入)并将所有空格替换为破折号。或者,更确切地说,这就是它应该做的。相反,它采用字符串的第一个单词并忽略其余部分(例如 '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;
}