2011-06-12 20 views

回答

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*东西(你所标记的问题作为 ),只需使用std::string即可。

std::string sText; 
std::cin >> sText; 
sText.resize(20, '-'); // NOTE - no need to NULL-terminate anything 

瞧!(:

这种方式是更加清楚你不需要携带delete[]之前使用delete[] text;末(有时是不是小事,特别是在一些例外情况下 - 这会给你100 %的内存泄漏。当然,你总是可以使用智能指针..但智能指针这个?!:))


当然,你可以写19代替20-1,我只是想“亮点” -1,以防你使用一些常量。

+0

如果你想突出'-1',为什么不使用常数而不是'20'? :)神奇数字ftl。 – Xeo 2011-06-12 11:05:54

+0

因为如果这个尺寸不再使用,那么就不需要为2-3行代码添加常量(这是一个接一个的)。或者至少,我不会。请注意,我已经建议@Ata在其他情况下使用常数。 – 2011-06-12 11:10:07

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

+0

-1:这使得一个不必要的动态分配和指针算术依赖于一个有点棘手的习惯用法。将破折号复制到缓冲区然后再读取前几个将会更简单。 – 2011-06-12 10:42:28

+0

@Karl:你说得对不必要的动态分配是正确的,但这是原始代码。刚刚写了如何完成它。指针上的棘手成语?我不认为增加一个指针值是非常棘手的。首先复制缓冲区也不起作用,因为cin在用户输入的末尾放置了最后一个“\ 0”,必须删除(并且*会很棘手)。 – 2011-06-12 11:23:15

2

没有人对空终止符 - '\ 0'表示任何意见。在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; 

有想法,你也应该检查,如果用户没有输入的东西比你分配的内存更长的时间。


编辑:嗯,基里尔·比我更快(更精确)。 :)

+0

你确定,'std :: cin' _将不会碰到其余的字符吗?我在开始时想到了这个选项,但我不确定这个标准是否保证了'std :: cin'在这种情况下的行为。 – 2011-06-12 11:11:49

+0

根据这个[声明](http://stackoverflow.com/questions/805403/what-are-the-rules-of-the-stdcin-object-in-c)它会读直到第一个空白字符,所以我认为它会好的。但你的问题是合理的。 – 2011-06-12 11:18:25

+0

这是有趣的,如果这是由标准保证:?但很好的参考。 +1从我:)顺便说一句,有点偏题 - 你是什么单反相机:D – 2011-06-12 11:23:12

相关问题