从句子中逐字打印
Posted
技术标签:
【中文标题】从句子中逐字打印【英文标题】:Printing word by word from a sentence 【发布时间】:2017-06-04 14:44:25 【问题描述】:我有一个句子“计算机科学”作为我的输入,我想分别打印计算机和科学。我用 C++ 编写了一个程序,但它只打印“计算机”。谁能帮我找出为什么它没有分别打印这两个词?
int main()
char string[]="Computer Science";
int l;
l=strlen(string);
char begin[l];
int i=0,ind=0;
while(string[i]!='\0')
begin[ind]=string[i];
if(string[i]==' ')
begin[ind]=NULL;
cout<<begin<<"\n";
ind=0;
//ind++;
i++;
else
ind++;
i++;
return 0;
【问题讨论】:
只有在输入中遇到空格字符时才会打印。Science
后面没有空格
@user4532954 现在编写一个只打印“Science”的程序。然后将两个程序合并为一个程序。:)
为什么不使用 C++,即 std::string
和 std::istringstream
来做到这一点?
您可以将您的条件更改为if(string[i] == ' ' || i == l)
。我认为这与 std::string s 配合得很好
我不明白为什么,如果你在最后的if
语句的两侧增加i
,为什么不只放一个i++;
语句after i> 完整的if
语句代替?
【参考方案1】:
现代 C++ 提供了许多处理字符串的特性。这些功能旨在以更有效的方式简化处理字符串。除非必须,否则不要使用 C-Style 字符串。在你的情况下,你可以做
#include <iostream>
#include <string>
int main()
std::string str("Computer Science");
for(int i(0); i < str.size(); ++i)
if( str[i] == ' ' )
std::cout << '\n';
else
std::cout << str[i];
std::cout << std::endl;
return 0;
使用 C++,您可以进行更多的简化,但我保持原样。
【讨论】:
【参考方案2】:您只在寻找打印输出的空间。科学在它之后没有空间。 更改为
while(i <= l)
将 if 条件更改为
if(string[i]==' ' || string[i] == '\0')
【讨论】:
哦...是的,当 string[i] 为空时,它不会进入 while 循环。更新 @ShashwatKumar Still doesn't work! @ShashwatKumar 嗯?? @ShashwatKumar R** **重新!更好地改进您的答案。 @ShashwatKumar 我在将您提议的更改完全复制到 OP 的原始代码时遇到了编译错误,是的。【参考方案3】:可变长度数组 (VLA) 不是 C++ 的标准功能。而且不需要再声明一个数组来输出空格分隔的单词。
如果后面没有空格,您的程序永远不会输出字符串中的第二个(或最后一个)单词。
并且该程序在单词中包含前导空格,因为当单词之间有多个空格时它不会跳过空格。
该程序可以如下所示,如演示程序中所示。
#include <iostream>
int main()
char s[] = "Computer Science";
for ( const char *p = s; *p != '\0'; )
while ( *p == ' ' || *p == '\t' ) ++p;
if ( *p )
size_t i = 0;
while ( *p and not ( *p == ' ' || *p == '\t' ) )
++i;
++p;
std::cout.write( p - i, i ) << std::endl;
return 0;
程序输出是
Computer
Science
条件
*p == ' ' || *p == '\t'
您可以使用 lambda 表达式。例如
auto is_blank = []( char c ) return c == ' ' || c == '\t';
然后在循环中你可以写例如
while ( is_blank( *p ) ) ++p;
和
while ( *p and not is_blank( *p ) )
或者您可以使用标头<cstring>
中声明的标准C 函数isspace
来检查条件。
该任务可以使用标准算法和迭代器来完成。例如
#include <iostream>
#include <sstream>
#include <string>
#include <iterator>
int main()
char s[] = "Computer Science";
std::istringstream is( s );
std::copy( std::istream_iterator<std::string>( is ),
std::istream_iterator<std::string>(),
std::ostream_iterator<std::string>( std::cout, "\n") );
return 0;
程序输出和上面一样就是
Computer
Science
【讨论】:
以上是关于从句子中逐字打印的主要内容,如果未能解决你的问题,请参考以下文章