从句子中逐字打印

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::stringstd::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 ) )

或者您可以使用标头&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

【讨论】:

以上是关于从句子中逐字打印的主要内容,如果未能解决你的问题,请参考以下文章

HTML 类型字段的输出逐字打印标签 (BOLT-CMS / Twig)

打造自己的ChatGPT:逐字打印的流式处理

在 JLabel 中打印句子

如何在VC++ Win32应用程序中鼠标光标位置打印句子?

LaTeX、波浪线和逐字模式

返回/打印句子中的位数或错误消息