我有一个句子"计算机科学"作为我的输入,我想单独打印计算机和科学。我在C 上写了一个程序,但仅打印"计算机"。谁能帮我找出为什么它不是单独打印两个单词?
int main()
{
char string[]="Computer Science";
int l;
l=strlen(string);
char begin[l];
int i=0,ind=0;
while(string[i]!=' ')
{
begin[ind]=string[i];
if(string[i]==' ')
{
begin[ind]=NULL;
cout<<begin<<"n";
ind=0;
//ind++;
i++;
}
else
{
ind++;
i++;
}
}
return 0;
}
现代C 为处理字符串提供了许多功能。这些功能旨在以更有效的方式简化处理字符串。除非必须使用,否则不要使用C风格的字符串。在您的情况下,您可以做
#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 ,您可以进行更多的减少,但我会保持原样。
您仅在寻找打印输出的空间。科学在没有空间之后无效。更改为
while(i <= l)
将您的条件更改为
if(string[i]==' ' || string[i] == ' ')
变量长度阵列(VLA(不是C 的标准功能。此外,无需声明一个数组来输出由空格分开的单词。
您的程序在字符串之后没有空格的情况下永远不会在字符串中输出第二个(或最后一个单词(。
和该程序在单词中包含领先空间,因为当单词之间有多个空间时,它不会跳过空格。
该程序可以在说明性程序中显示以下方式。
#include <iostream>
int main()
{
char s[] = "Computer Science";
for ( const char *p = s; *p != ' '; )
{
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 ) )
或者您可以使用标准C函数isspace
在标题<cstring>
中声明来检查条件。
可以使用标准算法和迭代器完成任务。例如
#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