检查char *类型的字符串是否包含另一个字符串

时间:2014-11-23 14:35:06

标签: c++ string pointers parameters

我有一个更大的任务,其中包含此功能。以下是说明;

  

定义名为isPartOf的C ++函数,其中包含两个指向C字符串的参数指针   (即char *类型,而不是尚未详细声明的C ++数据   输入字符串)并返回一个布尔值。

     

本质上,该函数应该检查字符串是否指向它   由第一个参数指针,是由它指向它的字符串的一部分   第二个参数指针。

     

例子:isPartOf(" heart","高血压   心脏疾病")返回true,返回isPartOf(" screw","案例涉及   轮椅")返回错误。

我已经学习了一年C并且刚开始学习C ++而且我发现很难理解使用' char *'和参数一般。我花了一些时间来理解指针,现在参数让我失望了。我已经尝试过这段代码,可能是*和&的所有可能的迭代。只是为了看它是否会起作用,但事实并非如此。

#include <iostream>

using namespace std;

void isPartOf(char *, char *);

int main()
{
    char * Word;
    char * Sentence;

    cout << "Please enter a word: ";
    cin >> Word;
    cout << endl << "Please enter a sentence: ";
    cin >> Sentence;
    cout << endl;

    isPartOf(Word, Sentence);

    if (isPartOf(Word, Sentence))
    {
        cout << "It is part of it";
    }
    else
    {
       cout << "It is not part of it";
    }
}

void isPartOf(char a, char b)
{

}

我的两个主要问题是:

  1. 在这种情况下参数如何工作?
  2. 是否有一个函数可以检查字符串中是否存在字符串?如果没有,我该如何开始编写排序函数?

4 个答案:

答案 0 :(得分:3)

由于这是C ++,最简单的解决方案是使用string。你不能按照你想要的方式cin实际std::string Word, Sentence; cout << "Please enter a word: "; std::getline(std::cin, Word); cout << endl << "Please enter a sentence: "; std::getline(std::cin, Sentence); cout << endl; if (isPartOf(Word, Sentence)) { // ... } 一个字符数组(那个代码不能做你认为它做的事情),这样也解决了你输入的问题:

string

关于isPartOf()的另一个好处是它使bool isPartOf(const std::string& word, const std::string& sentence) { return sentence.find(word) // this returns the index of the first instance // word != std::string::npos; // which will take this value if it's not found } 非常简单:

    return strstr(sentence.c_str(), word.c_str());

或者,可以使用strstr

来实现
{{1}}

答案 1 :(得分:1)

基于alex.b代码,我写了以下几行。我还考虑过禁止使用任何库函数的事实

bool isPartOf(char* w1, char* w2)
{
int i=0;
int j=0;


while(w1[i]!='\0'){
    if(w1[i] == w2[j])
    {
        int init = i;
        while (w1[i] == w2[j] && w2[j]!='\0')
        {
            j++;
            i++;
        }
        if(w2[j]=='\0'){
            return true;
        }
        j=0;
    }
    i++;
}
return false;
}

答案 2 :(得分:0)

试试这个:

#include <iostream>
#include <string.h>

using namespace std;

bool isPartOf(char* w1, char* w2)
{
    int i=0;
    int j=0;

    for(i;i < strlen(w1); i++)
    {
        if(w1[i] == w2[j])
        {
            j++;
        }
    }

    if(strlen(w2) == j)
        return true;
    else
        return false;
}

int main()
{

    char wrd1[] = "As I know there is a function in C++ string which performs substring search: string1.find(string2)";
    char* W1 = wrd1;
    char wrd2[] = "search";
    char* W2 = wrd2;


    if(isPartOf(W1,W2))
        cout << "true";
    else
        cout << "false";

    return 0;
}

答案 3 :(得分:0)

char *是指向字符串中第一个字符的第一个内存地址的指针。当您第一次声明char *时,它未设置为内存地址,因此您将无法在其中存储任何数据。因此,您需要为该char *分配内存,以便您可以开始在其中存储数据。例如:

word = (char*) malloc(number_of_bits * sizeof(char));

请记住malloc要求您包含stdlib.h

#include <stdlib.h>

一旦有空间开始在该char *中存储数据,您就可以使用cin读取数据。

此外,当您将指针传递给另一个函数时,您需要确保传递char *的参数也是char *的类型

void isPartOf(char *a, char *b){
    ...
}

最后,为了确定另一个字符串是否包含子字符串,我将使用strstr函数

bool isPartOf(char *a, char *b){
   if(std::strstr(b,a) != NULL){    //Strstr says does b contain a
      return true;
   } 
   return false;
}