【问题标题】: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::stringstd::istringstream 来做到这一点?
  • 您可以将您的条件更改为if(string[i] == ' ' || i == l)。我认为这与 std::string s 配合得很好
  • 我不明白为什么,如果你在最后的if 语句的两侧增加i,为什么不只放一个i++; 语句after i> 完整的if 语句代替?

标签: c++ string split


【解决方案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 ) )
    

    或者您可以使用标头&lt;cstring&gt; 中声明的标准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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多