C程序对子串进行计数
为什么我的程序总是跳过最后一个子串计数 eg1。字符串:C程序对子串进行计数,c,string,substring,C,String,Substring,为什么我的程序总是跳过最后一个子串计数 eg1。字符串:dbdbsnasdb dbdxx 子字符串:db 计数:4(无错误) eg2。字符串:dbdbsnamfdb 子字符串:db 计数:2(应为3) **#仅包括 int countSubstr(char string[], char substring[]) { int i, j; int count = 0; int subcount = 0; for (i = 0; i <= strlen(strin
dbdbsnasdb dbdxx
子字符串:db
计数:4
(无错误)
eg2。字符串:dbdbsnamfdb
子字符串:db
计数:2
(应为3)
**#仅包括
int countSubstr(char string[], char substring[]) {
int i, j;
int count = 0;
int subcount = 0;
for (i = 0; i <= strlen(string);) {
j = 0;
count = 0;
while ((string[i] == substring[j])) {
count++;
i++;
j++;
}
if (count == strlen(substring)) {
subcount++;
count = 0;
} else
i++;
}
return subcount;
}
int countSubstr(字符字符串[],字符子字符串[]){
int i,j;
整数计数=0;
int subcount=0;
对于while循环中的(i=0;ifor(i=0;ifor(i=0;i),您没有检查是否超过字符串长度
编辑:
请记住,在C中,所有字符串的结尾都有一个“\0”,但在while循环中,您不会检查它
在您的特定示例中,我们得到(从最后一个db开始):
i=10,j=0,count=1(检查'd')
i=11,j=1,计数=2(检查“b”)
i=12,j=2,计数=3(检查'\0')
i=13,j=3,计数=3(退出循环)
count=3与strlen(子字符串)==2不同
->在while循环中,子计数没有增加,您没有检查是否超过字符串长度
编辑:
请记住,在C中,所有字符串的结尾都有一个“\0”,但在while循环中,您不会检查它
在您的特定示例中,我们得到(从最后一个db开始):
i=10,j=0,count=1(检查'd')
i=11,j=1,计数=2(检查“b”)
i=12,j=2,计数=3(检查'\0')
i=13,j=3,计数=3(退出循环)
count=3与strlen(子字符串)==2不同
->次计数不增加
您的内部循环(while
)可以继续比较任意字符串中的空终止符。
当其中一个字符串达到其终止的空字符时,您需要立即停止它
您的外部循环条件有一个off by one错误。但无论如何,您不需要调用strlen
。只需迭代,直到返回空字符
您还可以将strlen(子字符串)
移动到循环外部,以避免可能重新计算它
更好的版本可能如下所示:
int countSubstr(char string[], char substring[])
{
int subcount = 0;
size_t sub_len = strlen(substring);
if (!sub_len) return 0;
for (size_t i = 0;string[i];) {
size_t j = 0;
size_t count = 0;
while (string[i] && string[j] && string[i] == substring[j]) {
count++;
i++;
j++;
}
if (count == sub_len) {
subcount++;
count = 0;
}
else {
i = i - j + 1; /* no match, so reset to the next index in 'string' */
}
}
return subcount;
}
您的内部循环(while
)可以继续比较任意字符串中的空终止符。
当其中一个字符串达到其终止的空字符时,您需要立即停止它
您的外部循环条件有一个off by one错误。但无论如何,您不需要调用strlen
。只需迭代,直到返回空字符
您还可以将strlen(子字符串)
移动到循环外部,以避免可能重新计算它
更好的版本可能如下所示:
int countSubstr(char string[], char substring[])
{
int subcount = 0;
size_t sub_len = strlen(substring);
if (!sub_len) return 0;
for (size_t i = 0;string[i];) {
size_t j = 0;
size_t count = 0;
while (string[i] && string[j] && string[i] == substring[j]) {
count++;
i++;
j++;
}
if (count == sub_len) {
subcount++;
count = 0;
}
else {
i = i - j + 1; /* no match, so reset to the next index in 'string' */
}
}
return subcount;
}
您的代码中存在一些问题:
- (i=0;i的循环
,代码中存在一些问题:
- 循环
用于(i=0;i这适用于我测试的所有边缘情况
#include <stdio.h>
int countSubstr(char string[], char substring[])
{
int count = 0;
size_t i = 0;
while(string[i])
{
int match = 1;
size_t j = 0;
while (substring[j])
{
match &= substring[j] == string[i + j];
j++;
}
count += match;
i++;
}
return count;
}
这适用于我测试的所有边缘情况
#include <stdio.h>
int countSubstr(char string[], char substring[])
{
int count = 0;
size_t i = 0;
while(string[i])
{
int match = 1;
size_t j = 0;
while (substring[j])
{
match &= substring[j] == string[i + j];
j++;
}
count += match;
i++;
}
return count;
}
在第二个示例中,尾随的空字符也匹配,使计数比子字符串长度高出一个。但这段代码很糟糕,您走到了尽头-不要这样做。然后将strlen
调用移出循环。可能else i++;
的增量过大。我应该如何更改代码?不是吗在PHP中,在这样的循环中使用strlen()
是可以的,但是理解了这一点,您永远不会这样做。相反,您应该检查'\0'
终止符,如果您知道它,那么while((string[i]==substring[j])
看起来也不对。使用子字符串:dd
的string:ddd
的预期结果是什么?2
或1
?在第二个示例中,尾随的空字符也匹配,使计数比子字符串长度高一个。但此代码不好,您正在走到尽头-不要不要这样做。并将strlen
调用移出循环。可能否则i++;
的增量过大。我应该如何更改代码?请注意使用strlen()
这样的循环在PHP中是可以的,但是理解了这一点,您永远不会这样做。相反,您应该检查'\0'
终止符,如果您知道它,那么while((string[i]==substring[j]))对您来说也可能是错误的。字符串:ddd
与子字符串:dd
的预期结果是什么?2
或1
?此程序的要求不允许我使用string.hAlso(我认为这不清楚)引用评论:string:ddd和substring:dd?2或1?…的预期结果是什么?我猜应该是1?–BEX您的代码返回2
@BLUEPIXY:我修改了答案以澄清这一点。应该是1我猜很难作为规范;-)就我而言,countSubstr(“bbb”,“bb”)=1不正确。我认为这个答案比公认的答案好,但我个人不喜欢循环中断。这个程序的要求不允许我使用string.hAlso(我认为这不清楚)引用评论:string:ddd和substring:dd?2或1?…的预期结果是什么?我猜应该是1?–BEX您的代码返回2
@BLUEPIXY:我修改了答案以澄清这一点。应该是1我猜很难作为规范;-)就我而言,countSubstr(“bbb”,“bb”)=1是不正确的。我认为这个答案比公认的答案好,但我个人不喜欢循环中断1)){
-->){
2)countSubstr(“ddb”,“db”)
的结果是0
,而(string[I]
是多余的,只是测试string[j]
就足够了。空子字符串的大小写处理方式不同:countSubstr(“,”)
可能会返回1,但您的代码有一个无限循环空子字符串的大小写处理方式不同:countSubstr(“,”)
可能会返回1,但您的代码会返回0并有一个