C ++程序取2个句子并找到常用字母?

Posted

技术标签:

【中文标题】C ++程序取2个句子并找到常用字母?【英文标题】:C++ program to take 2 sentences and find common letters? 【发布时间】:2014-04-27 08:59:08 【问题描述】:

我正在尝试用 c++ 编写一个程序来查找用户输入的 2 个句子中的共享字母,我输入的代码如下,但由于某种原因它不起作用,该函数必须返回所有共享字母之间的两句话。提前致谢!

        #include<iostream>
#include<cstring>
using namespace std;
int  findSharedLetters(const char line1[], const char line2[]);
void main()

    char line1[100] , line2[100];
    cout<<"Enter line 1 : ";
    cin.getline(line1 , 100);
    cout<<"Enter line 2 : ";
    cin.getline(line2 , 100);
    char result = findSharedLetters(line1,line2);
    cout<<"shared letters : "<<result<<endl;
    system("pause");

int  findSharedLetters(const char line1[], const char line2[])

for(int i = 0;i<line1[100];i++)
    
    for(int x = 0;x<line2[100];x++)
        
        if(line1[i] == line2[x])
        
        return line1[i];
        
        
    

【问题讨论】:

std::set_intersection 嗨,欢迎来到 ***。这不是它的工作方式,当你执行程序时会发生什么,你期待什么,为什么?你想得到多少个常用字母?你总是提供相同长度的句子吗? 句子最多可以有 100 个字符,用户可以对每个句子有不同的长度,我试图找到两个句子之间的所有常见字母。 @KareemYoussef 您的程序只能处理 99 个字符的句子。用排序语句测试你的程序:“a”和“a”,或“a”/“b”,然后稍长一些:“ab”/“ab”,“ab”/“ba”,“aaabccc”/“dddaeee " ... 【参考方案1】:

一种可能的解决方案是基于使用类std::stringstd::set 以及标准算法std::set_intersection

这是一个示例程序

#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>

std::set<char> FindSharedLetters( const std::string &s1, const std::string &s2 )

    std::set<char> st1( s1.begin(), s1.end() );
    std::set<char> st2( s2.begin(), s2.end() );

    std::set<char> st0;

    std::set_intersection( st1.begin(), st1.end(), 
                           st2.begin(), st2.end(),
                           std::inserter( st0, st0.end() ) );

    return ( st0 );


int main() 

    std::string s1( "DCAB" );
    std::string s2( "FRDC" );

    for ( char c : FindSharedLetters( s1, s2 ) ) std::cout << c << ' ';
    std::cout << std::endl;

    return 0;

输出是

C D

解决方案对字母区分大小写。

如果您需要根据大小写仅查找常见的字母字符,则任务会更加复杂。

这是如何使用与上述相同的容器和算法来完成的

#include <iostream>
#include <string>
#include <set>
#include <algorithm>
#include <iterator>
#include <cctype>

std::set<char> FindSharedLetters( const std::string &s1, const std::string &s2 )

    std::set<char> st1;
    std::set<char> st2;

    for ( char c : s1 )
    
        if ( std::isalpha( c ) ) st1.emplace( std::toupper( c ) );
    

    for ( char c : s2 )
    
        if ( std::isalpha( c ) ) st2.emplace( std::toupper( c ) );
    

    std::set<char> st0;

    std::set_intersection( st1.begin(), st1.end(), 
                           st2.begin(), st2.end(),
                           std::inserter( st0, st0.end() ) );

    return ( st0 );


int main() 

    std::string s1( "12dCAB$" );
    std::string s2( "#FRDc12" );

    for ( char c : FindSharedLetters( s1, s2 ) ) std::cout << c << ' ';
    std::cout << std::endl;

    return 0;

再次输出

C D

【讨论】:

【参考方案2】:

一旦你找到一个字母对,你就会从函数中返回。 将字母存储在字符串中并返回。

#include <iostream>
#include<cstring>
using namespace std;
std::string findSharedLetters(const char line1[], const char line2[]);

int main(int argc, const char * argv[])


  char line1[100] , line2[100];
  line1[0] = '\0'; // make sure it's empty
  line2[0] = '\0'; // make sure it's empty

  cout<<"Enter line 1 : ";
  cin.getline(line1 , 100);
  cout<<"Enter line 2 : ";
  cin.getline(line2 , 100);
  std::string result = findSharedLetters(line1,line2); // function returns string now
  cout<<"shared letters : "<<result<<endl;
// removed system("pause"); as my compiler cried...
    return 0;

std::string findSharedLetters(const char line1[], const char line2[])
  std::string returnLine = ("");
  for(int i = 0;i<(sizeof(line1)/sizeof(*line1));i++) // iterate through size of array
  
    for(int x = 0;x<(sizeof(line2)/sizeof(*line2));x++) // iterate through size of array
    
      if(line1[i] == line2[x])
        if (!(line1[i]=='\0'))  // if empty space detected, it skips
        returnLine += line1[i]; // add matching char to string
        
    
  
  return returnLine; //return the string

【讨论】:

感谢您的回复! ,你能解释一下你在函数中做了什么,因为我似乎无法理解它是如何工作的,还有没有办法在不使用 sizeof 函数的情况下完成它? 您可以将 sizeOf 函数替换为值。像 for(int i = 0;i

以上是关于C ++程序取2个句子并找到常用字母?的主要内容,如果未能解决你的问题,请参考以下文章

C语言中宏名是不是必须用大写字母表示?举个例子~

C语言加密练习:第一个字母变成第26个字母,第i个字母变成第(26-i+1)个字母。非字母字符不变。要求编程序将密码译回原文,并输出密码和原文。

单片机c语言中interrupt4表示啥意思

不确定为啥 toupper() 会切断 C 中的最后一个字母

c语言设计密码检测程序?

c语言怎么出表格