Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/132.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用strstr时计数不正确_C++_String_Pointers_Strstr - Fatal编程技术网

C++ 使用strstr时计数不正确

C++ 使用strstr时计数不正确,c++,string,pointers,strstr,C++,String,Pointers,Strstr,我正在尝试编写一个函数,返回字符串中第一次出现的子字符串的索引 就像在摩天大楼中搜索“ysc”会返回2 看起来strstr正在做它的工作,因为在while循环之后,它输出子字符串的正确的第一个字符,但是它没有正确计数并返回正确的int 我可能设置错误,因为我正在向函数传递一个数组,并且在尝试使用嵌套循环时遇到了很多错误,因此我尝试了一个while循环,它可以编译,但输出不正确 我对指针还是相当陌生,并将它们作为论据传递,因此可能存在问题 什么都行 int findSubstring(char *

我正在尝试编写一个函数,返回字符串中第一次出现的子字符串的索引

就像在摩天大楼中搜索“ysc”会返回2

看起来strstr正在做它的工作,因为在while循环之后,它输出子字符串的正确的第一个字符,但是它没有正确计数并返回正确的int

我可能设置错误,因为我正在向函数传递一个数组,并且在尝试使用嵌套循环时遇到了很多错误,因此我尝试了一个while循环,它可以编译,但输出不正确

我对指针还是相当陌生,并将它们作为论据传递,因此可能存在问题

什么都行

int findSubstring(char *s, char substring[])
{   
    int j = 1;
    char* strPtr = NULL;

    while (strPtr == NULL)
    {
        strPtr = strstr(s, substring);
        if (strPtr != NULL)
            break;
        j++;
    }

    cout << *strPtr << endl;
    cout << "The substring begins at element: " << j << endl;
    return j;
}
int findSubstring(char*s,char substring[])
{   
int j=1;
char*strprtr=NULL;
while(strprtr==NULL)
{
strprtr=strstrstr(s,子串);
如果(strprtr!=NULL)
打破
j++;
}

你似乎过于复杂的任务,因为你正在使用C++,你应该使用.<
std::string s=“摩天大楼”;
std::size_t pos=s.find(“ysc”);
if(pos!=std::string::npos)

std::cout使用指针算法怎么样

int findSubstring(char *s, char substring[])
{   
    char* strPtr = strstr(s, substring);
    if (strPtr != NULL)
    {
        return (int)(strPtr - s);
    }
    else
    {
        return -1;  //no match
    }
}
将您的修复为,请参阅:

你使用C++,所以为什么不<代码> STD::String < /C> >?

 int findSubstring(const std::string& s, const std::string& substring)
{   

std::size_t j =s.find(substring);
return ( j!=std::string::npos) ? j :-1;
}

返回(int)(strPtr-s);你能给我解释一下这一行吗?这段代码也正是我想要的,但我想知道我为什么要用它!字符指针包含字符的地址。取两个字符指针的差值可以告诉你从一个移动到另一个的字符数。因为
strPtr
指向其中一个字符在
s
中,它将告诉您所使用的字符串中的字符数。将差值转换为整数可确保您的返回类型正确。谢谢,转换部分看起来很明显,但我没有得到指针减法。现在这就有意义了。返回(int)(pos-s);你能解释一下这行代码是如何工作的吗?另外,我对std::(任何东西)的使用完全不熟悉,但我经常看到它,觉得我应该研究一下使用这种语法。
 int findSubstring(char *s, char substring[]) 
{
    char* pos = strstr(s, substring);
    if(pos) 
     return (int)(pos - s);
    else -1;
}
 int findSubstring(const std::string& s, const std::string& substring)
{   

std::size_t j =s.find(substring);
return ( j!=std::string::npos) ? j :-1;
}