c++ substr(C++字符串substr在母字符串str中出现的次数)

本文目录
C++字符串substr在母字符串str中出现的次数
(1)
int func(char *str, char *substr)
{
int count = 0;
char *cur = substr;
while (*str != ’\0’)
{
if (*str == *cur)
{
while (*cur != ’\0’)
{
if (*cur++ == *str++)
continue;
else
break;
}
if (*cur == ’\0’)
count++;
cur = substr;
}
else
{
str++;
}
}
return count;
}
c++ substr问题
第9行: str=’0’; 这句话不应该这样写,string 是一个对象,应该使用push_back方法追加字符,直接用数组的方式,有可能造成内存越界导致崩溃,然而即使不越界,也会为你后面使用substr埋下祸根。
之所以用substr函数不能得到正确输出,正是因为你是用了直接操纵数组的方式追加字符0,导致字符串string这个对象的长度参数等没有正确更新,使用substr的时候,这个对象的字符内容实际上没有追加正常,取子串的时候仍然没有追加0. 你用循环的方式能取得正确的结果,是因为完全脱离了string的对象合法操作,直接操纵了数据。所以恰好得到了正确的结果,我可以说这是“侥幸”,因为直接操纵数组是不安全的,也背离了原来使用string对象的初衷。
我建议正确的程序应该这样修改:
第9行,追加字符0的操作应该写为 str.push_back(’0’);
第11-17行,输出处理后的字符串,写为
for(int i=0;i《=x;i++)
{
string sub=str.substr(i*8,8);
if (!sub.empty()) cout《《sub《《endl; //控制不要输出空字符串
}
完整的程序清单:
#include 《iostream》
#include 《string》
using namespace std;
void chuli (string str,int x,int y,int len)
{
if(y!=0)
{
for(int i=0;i《8-y;i++)
str.push_back(’0’);
}
for(int i=0;i《=x;i++)
{
string sub=str.substr(i*8,8);
if(!sub.empty()) cout《《sub《《endl;
}
}
int main()
{
string s1,s2;
while(cin》》s1)
{
cin》》s2;
int a1,a2,b1,b2,n1,n2;
n1=s1.size();n2=s2.size();
a1=n1/8;a2=n1%8;
b1=n2/8;b2=n2%8;
chuli(s1,a1,a2,n1);
chuli(s2,b1,b2,n2);
}
return 0;
}
运行通过
c++ substr的用法问题
下面给出解释:
substr 方法
返回一个从指定位置开始,并具有指定长度的子字符串。
参数
start
必选。所需的子字符串的起始位置。字符串中第一个字符的索引为 0。
length
可选项。返回的子字符串中包含的字符数。
备注
如果 length 为 0 或负数,将返回一个空字符串。如果没有指定该参数,则子字符串将延续到字符串的结尾。
看了上面这些应该就会明白了!!

更多文章:
sqlite格式的视频怎么打开(.sqlite是什么文件,用什么工具打开)
2026年11月7日 05:30
element ui面试题(用element-ui ELDialog和ELTable遇见的坑)
2026年11月7日 04:40
中文自动翻译成英语的输入法(有没有一种输入法能将打出来的中文自动变成英文)
2026年11月7日 02:10
equals to(为什么有些英文句子要用的是“equals to that of” 这个that和of之间还可以加名词吗)
2026年11月7日 01:50
default values(电脑开机后出现all settings was reset to default values.)
2026年11月7日 01:20
structured reviewing翻译(软件测试的英文翻译)
2026年11月7日 00:50




