我想阅读用户输入,如下所示:
char *text = new char[20] ;
cin >> text ;
但如果用户输入“hello”,我希望我的其他空字符填充空格或-
,如:
"hello------------------------"
我该怎么做?
答案 0 :(得分:6)
没有标准和快速方法来执行此操作。我可以想到一些选择。
假设我们有:
char *text = new char[20];
cin >> text;
注意 - 我们 需要 才能知道容量是20!我建议你为此使用一些常量,特别是如果它也将用于其他字符串。
好的,第一个选项 - 使用std::stringstream
std::stringstream ss;
ss << setw( 20 - 1 ) << setfill( '-' ) << text;
// ^^^^ we need one byte for the '\0' char at the end
ss >> text;
但这很慢。
手工填写字符:
int length = strlen( text );
for( int i = length; i < 20 - 1; ++i ) // again - "20-1" - '\0'
{
text[ i ] = '-';
}
text[ 20 - 1 ] = '\0'; // don't forget to NULL-terminate the string
最好的方式 ,据我所知 - 摆脱这些char*
件事(你已将问题标记为c++)和只需使用std::string
。
std::string sText;
std::cin >> sText;
sText.resize( 20, '-' ); // NOTE - no need to NULL-terminate anything
Voilà! (:
这种方式更清晰,你不需要在最后使用delete[] text;
(有时候这不是那么微不足道,特别是在delete[]
之前有一些例外的情况下 - 这将是给你100%的内存泄漏。当然,你总是可以使用智能指针..但智能指针呢?!:))
当然,你可以写19
而不是20-1
,我只是想“突出”-1
,以防你使用某个常量。
答案 1 :(得分:2)
你们没有人说过 null终结者角色 - &#39; \ 0&#39;。在C / C ++中使用字符串时非常重要。例如,如果您希望文本长度为20个符号,则应为21个字符分配内存。这仅适用于 Ata 的信息。你的问题的答案是:
char *text = new char[21];
//start initialization
for (int i=0;i<20;i++) {
text[i] = '-';
}
text[20] = '\0';
//end initialization
cout << "Your input: " << endl;
cin >> text;//get the user input
text[strlen(text)]='-';//change the automatically added '\0' with '-'
cout << text << endl;
请注意,您还应该检查用户是否输入了比您已分配的内存更长的内容。
编辑:嗯, Kiril 比我更快(更精确)。 :)
答案 2 :(得分:0)
您可以通过多种方式完成此操作。例如,假设您的字符串满为19“ - ”:(请注意,您使用20定义数组,您只能获得19个真实字符加上最终\0
:
const char* dashes = "--------------------";
然后在你写的时候阅读字符串:
char *text = new char[20] ;
cin >> text ;
然后您可以使用strcat
复制其余字符,使用strlen
来确定读取字符串的长度:
strcat(text, dashes + strlen(text));
这会将休息的19 - length of the text
附加到文本中。请注意,我将该特定数量添加到dashes
指针。
最后,>>
只会读一个字。要阅读完整的输入行,您必须使用getline
。