从 C++ 中的两个字符串中找到唯一的共同词

Posted

技术标签:

【中文标题】从 C++ 中的两个字符串中找到唯一的共同词【英文标题】:Find the only common word from two strings in c++ 【发布时间】:2019-03-12 18:43:44 【问题描述】:

我需要从包含两个字符串的常用词的函数中返回一个字符串(假设只有一个常用词)。 我可以使用函数strcmpstrlenstrcatstrcpy。 当字符串中的第一个单词相同时,我进行了管理,但如果在此之后,它就不起作用了。

不起作用的示例:

str1[] = "Hello world"; //string 1

str2[] = "Thanks you world"; // string 2

Example that work:

char str1[] = "Hello world"; //string 1

char str2[] = "Hello Danny"; // string 2

这是我的代码:

#include <iostream>
using namespace std;
# include <string.h>
char * Strcom(char str1[], char str2[]); //declare function
int main()

    char str1[] =  "Hello world" ; //string 1
    char str2[] =  "Thanks you world" ; // string 2
    Strcom(str1, str2);

char * Strcom(char str1[], char str2[])

    char temp[10];
    int i = 0, z = 0;
    while (i <= strlen(str1))//run over str1, copying word in the next while loop
    
        int k = 0;
        bool check = 0;
        while ((z < strlen(str2)) && (k < strlen(temp)))//check that I withing the lenght...
        
            char temp[10] =  0 ;
            while ((str1[i] != ' ')&&(i<10))//copy one word to temp from str1
            
                temp[i] = str1[i];
                i++;
            
            if (i != strlen(temp))
            
                temp[i] = '\0';
            
            else
                temp[i-1] = '\0';
            i++;//to jump over ' '
            while (str2[z] != ' ') //check if its the same world (temp and str2)
            
                if (temp[k] == str2[z])
                
                    k++, z++;
                    check = 1;
                
                else
                
                    check = 0;
                    break;
                
            
            if (((str2[z] == ' ') || (str2[z] == '\0')) && (check == 1))//its the same word
            
                temp[k] = '\0';//to be able to print it
                cout <<"my word is: " <<temp<< endl;
                return temp;
            
            z += 1;
            k = 10;//to go to the outer while loop
        
        i++;
    

【问题讨论】:

如果只有一个常用词而且你已经找到了,你为什么会觉得卡住了? 对你的导师任意的功能限制太糟糕了。 std::istringstreamstd::unordered_set&lt;std:string&gt; 带有一个迭代器范围构造和一个单遍循环将使它变成大约六行代码。具有讽刺意味的是,他们让您使用大多数 C++ 工程师在日常使用中避免使用的一组函数。忍住告诉他们你是否想要一门 C 语言课程的冲动,你会报名参加的。 @Begginer 无意冒犯,但这对他们来说是愚蠢的。这两种语言共享一个子集语法这一事实并不是这样做的理由。每一个本身就足够难了,并且为每个使用标准库的通用系统会迅速分散任何语法共性。 C 程序员会做他们想做的事; C++ 程序员会按照我的描述去做。显然,它们是非常、非常不同的东西。并不意味着你不能在 C++ 中做前者(语言和库毕竟支持它),但如果你有 C++ 标准库供你使用,你真的不会。 很好,您添加了示例,但究竟是什么“不起作用”?非工作示例的输出是什么? @Caleth 我无意冒犯 OP。另一方面,课程的设计者应该受到鞭笞。 【参考方案1】:

如果您需要 C 风格的 C++ 代码来学习而不是生产,可以通过以下方式解决所需的功能:

bool CommonWord( const char* words_a, const char* words_b, char* result )

    // Iterate throught the words of words_a
    while( IsolateWord( words_a, result ) )
    
        // Start from the beginning of words_b
        const char* word_list = words_b;
        while( *word_list != '\0' )
        
            // See if words match
            int eaten = 0;
            if( CompareWord( result, words_b, &eaten ) )
            
                // Success, the matching word was copied to result before
                return true;
            
            else
            
                // Go to the beginning of the next word or the end of the string
                for( word_list += eaten; ( *word_list != ' ' ) && ( *word_list != '\0' ); word_list++ )
                
                    ;
                
            
        
    

    // No matching words found, empty result
    result[ 0 ] = '\0';
    return false;


bool IsolateWord( const char* words, char* result )

    // Skip leading spaces
    const char* start = words;
    while( *start == ' ' )
    
        start++;
    

    // Find end of word
    const char* end = start;
    while( ( end != ' ' ) && ( end != '\0' ) )
    
        end++;
    

    // No more word
    if( end == start )
    
        return false;
    

    // Copy word to buffer
    while( *start != '\0' )
    
        *result++ = *start++;
    
    *result = '\0';
    return true;


bool CompareWord( const char* word_one, const char* word_list, int* eaten )

    // Go until characters differ or strings end
    for( *eaten = 0; ( word_one[ *eaten ] == word_list[ *eaten ] ) && ( word_one[ *eaten ] != '\0' ); ( *eaten )++ )
    
        ;
    

    // If reached end of word_one, and word_list contains the same characters plus a space or '\0', then the word matches
    if( ( word_one[ *eaten ] == '\0' ) && ( ( word_list[ *eaten ] == ' ' ) ||  ( word_list[ *eaten ] == '\0' ) ))
    
        return true;
    
    else
    
        return false;
    

警告:我手头没有 C 或 C++ 编译器,所以我什至没有编译上面的。

【讨论】:

说实话,我几乎同时学习了两个学位,所以答案对我来说太晚了,我没有也没有时间检查建议代码其工作。

以上是关于从 C++ 中的两个字符串中找到唯一的共同词的主要内容,如果未能解决你的问题,请参考以下文章

C++ -- 字符串中的第一个唯一字符

LintCode日记——两个字符串是变位词(C++,Python)

找到字符串中所有字母异位词

C++有效的字母异位词

2021-12-18:找到字符串中所有字母异位词。 给定两个字符串 s 和 p,找到 s 中所有 p 的 异位词 的子串,返回这些子串的起始索引。不考虑答案输出的顺序。 异位词 指由相同字母重排列形成

获得两个字符串之间的共同点## [关闭]