求教。。。一道简单的问题。。

时间:2022-10-06 10:27:38
题目是编写函数统计子字符串在另一个字符串中出现的次数,字符串和子字符串都由键盘输入。例如,假定输入的字符串为“asd asasdfg as zx67 asd mklo”,子字符串为“as”,函数返回值为5.

然后我写的程序如下。。运行以后就是输入了数据但是无返回结果。。。求大神帮助


#include<stdio.h>
#include<stdlib.h>

int main()
{
    char str_1[99],str_2[99];
    int j,i=0,m=0;
    puts("姓名:刘晟玮,学号:104052012013"); 
    puts("请输入字符串:"); 
    gets(str_1);
    puts("请输入要查询的子串:");
    gets(str_2);
    while(str_1[i]!='\0')
    {
        j=0;
        while(str_2[j]!='\0')
        {
                if (str_1[i]==str_2[j])
                {
                                j++;
                                i++;
                }
                else
                                break;
                if (str_2[j]='\0')
                                m++;
                i++;
        }
    }
    printf("%d\n",m);
    system("pause");
}

12 个解决方案

#1


 先澄清一个问题:
aa在aaa中出现一次还是两次?

然后
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#2


引用 1 楼 zhao4zhong1 的回复:
 先澄清一个问题:
aa在aaa中出现一次还是两次?

然后
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

aa在aaa中算出现一次。。然后我找问题也花了好久的时间实在找不出来。对比别人的写的能找出来的错误也都改了,然后就是 不行。。。实在找不出来就想上论坛问问。。。我用的是dev c++

#3


dev c++也能单步调试。

#4


引用 3 楼 zhao4zhong1 的回复:
dev c++也能单步调试。

不知道怎么用。。。我也很少编程。。刚刚找人帮忙找出错误了。。

#5


楼主看下 char *strstr(char *str1, const char *str2);  这个函数。
strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
找到第一次出现的位置后,然后指针后移strlen(str_2)的长度,重新调用strstr函数,如此循环下去。

#6


http://bbs.csdn.net/topics/390908814

#7


用数据结构的串,我今天刚看的 哈哈

#8


引用 3 楼 zhao4zhong1 的回复:
dev c++也能单步调试。


能介绍一下dev c++怎么单步调试吗?我也在用这个工具,可是不会单步调试。

#9


#include<stdio.h>
#include<stdlib.h>
 
int main()
 {
     char str_1[99],str_2[99];
     int j,i=0,m=0;
     puts("姓名:刘晟玮,学号:104052012013"); 
     puts("请输入字符串:"); 
     gets(str_1);
     puts("请输入要查询的子串:");
     gets(str_2);
     while(str_1[i]!='\0')
     {
         j=0;
         while(str_2[j]!='\0')
         {
                 if (str_1[i]==str_2[j])
                 {
                        j++;
                        i++;
                 }
                 else
                        break;
                 
                 
         }
if (str_2[j]=='\0')
                m++;
i++;
     }
     printf("%d\n",m);
     system("pause");
 } 

简单改进后的代码 原代码初步判断有两个问题
1.应该把if (str_2[j]='\0')移动到第一个while循坏中,在第二个循环中永远不会相等,因为相等的话就跳出循环了
2.if (str_2[j]='\0')这个中间是双等号,果然是新手啊,改为if (str_2[j]=='\0')

#10


当然这个程序是不完善的还有几个问题解决不了,但是简单用用还是可以的
问题是
如果输入的字符串是''asfdfaasdfdfas''的,要查找的字符串是as的情况下,返回值为2而不是3,中间的"aas"中的as没有检索,这是你代码的问题,中间你直接调用了i++和j++,如果两个的字符串中第一个是相等的话(如都是a)的话,i,j还是会相加,此时j等于1,下次判断的话,不相等的话,最后if判断不相等的话,第一个while的末尾i还是要进行自加,这样就会把"aas"中的第二个a给跳过,而不能进行判断了,所以有这个问题的存在。

新手回答,有错误的地方欢迎指出。

#11


上面那个问题会是这段代码
if (str_1[i]==str_2[j])
                  {
                         j++;
                         i++;
                  }
的问题
这种检验的话会是在第一个字符串中检索第二个字符串是跳着检查,而不是挨个检查
只要在第二个while循环中用一个变量,如number来代替i进行自加就行了,这样就不会导致检索失败的情况下,i会改变的情况了
改后的代码如下
#include<stdio.h>
#include<stdlib.h>
 
int main()
 {
     char str_1[99],str_2[99];
     int j,i=0,m=0;
 int number;
     puts("姓名:刘晟玮,学号:104052012013"); 
     puts("请输入字符串:"); 
     gets(str_1);/*asfdfaasdfdfas*/
     puts("请输入要查询的子串:");
     gets(str_2);/*as*/
     while(str_1[i]!='\0')
     {
         j=0;
 number=i;
         while(str_2[j]!='\0')
         {
                 if (str_1[number]==str_2[j])
                 {
                        j++;
                        number++;
                 }
                 else
                        break;
                 
                 
         }
if (str_2[j]=='\0')
                m++;
i++;
     }
     printf("%d\n",m);
     system("pause");
 } 


上述代码解决这个问题的话如"aaa"中检查"aa"会算两次
题主如果还有问题的话,欢迎交流

#12


上面全说完了,我来占个坑

#1


 先澄清一个问题:
aa在aaa中出现一次还是两次?

然后
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

#2


引用 1 楼 zhao4zhong1 的回复:
 先澄清一个问题:
aa在aaa中出现一次还是两次?

然后
代码功能归根结底不是别人帮自己看或讲解或注释出来的;而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。
提醒:再牛×的老师也无法代替学生自己领悟和上厕所!
单步调试和设断点调试(VS IDE中编译连接通过以后,按F10或F11键单步执行,按Shift+F11退出当前函数;在某行按F9设断点后按F5执行停在该断点处。)是程序员必须掌握的技能之一。

aa在aaa中算出现一次。。然后我找问题也花了好久的时间实在找不出来。对比别人的写的能找出来的错误也都改了,然后就是 不行。。。实在找不出来就想上论坛问问。。。我用的是dev c++

#3


dev c++也能单步调试。

#4


引用 3 楼 zhao4zhong1 的回复:
dev c++也能单步调试。

不知道怎么用。。。我也很少编程。。刚刚找人帮忙找出错误了。。

#5


楼主看下 char *strstr(char *str1, const char *str2);  这个函数。
strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。
找到第一次出现的位置后,然后指针后移strlen(str_2)的长度,重新调用strstr函数,如此循环下去。

#6


http://bbs.csdn.net/topics/390908814

#7


用数据结构的串,我今天刚看的 哈哈

#8


引用 3 楼 zhao4zhong1 的回复:
dev c++也能单步调试。


能介绍一下dev c++怎么单步调试吗?我也在用这个工具,可是不会单步调试。

#9


#include<stdio.h>
#include<stdlib.h>
 
int main()
 {
     char str_1[99],str_2[99];
     int j,i=0,m=0;
     puts("姓名:刘晟玮,学号:104052012013"); 
     puts("请输入字符串:"); 
     gets(str_1);
     puts("请输入要查询的子串:");
     gets(str_2);
     while(str_1[i]!='\0')
     {
         j=0;
         while(str_2[j]!='\0')
         {
                 if (str_1[i]==str_2[j])
                 {
                        j++;
                        i++;
                 }
                 else
                        break;
                 
                 
         }
if (str_2[j]=='\0')
                m++;
i++;
     }
     printf("%d\n",m);
     system("pause");
 } 

简单改进后的代码 原代码初步判断有两个问题
1.应该把if (str_2[j]='\0')移动到第一个while循坏中,在第二个循环中永远不会相等,因为相等的话就跳出循环了
2.if (str_2[j]='\0')这个中间是双等号,果然是新手啊,改为if (str_2[j]=='\0')

#10


当然这个程序是不完善的还有几个问题解决不了,但是简单用用还是可以的
问题是
如果输入的字符串是''asfdfaasdfdfas''的,要查找的字符串是as的情况下,返回值为2而不是3,中间的"aas"中的as没有检索,这是你代码的问题,中间你直接调用了i++和j++,如果两个的字符串中第一个是相等的话(如都是a)的话,i,j还是会相加,此时j等于1,下次判断的话,不相等的话,最后if判断不相等的话,第一个while的末尾i还是要进行自加,这样就会把"aas"中的第二个a给跳过,而不能进行判断了,所以有这个问题的存在。

新手回答,有错误的地方欢迎指出。

#11


上面那个问题会是这段代码
if (str_1[i]==str_2[j])
                  {
                         j++;
                         i++;
                  }
的问题
这种检验的话会是在第一个字符串中检索第二个字符串是跳着检查,而不是挨个检查
只要在第二个while循环中用一个变量,如number来代替i进行自加就行了,这样就不会导致检索失败的情况下,i会改变的情况了
改后的代码如下
#include<stdio.h>
#include<stdlib.h>
 
int main()
 {
     char str_1[99],str_2[99];
     int j,i=0,m=0;
 int number;
     puts("姓名:刘晟玮,学号:104052012013"); 
     puts("请输入字符串:"); 
     gets(str_1);/*asfdfaasdfdfas*/
     puts("请输入要查询的子串:");
     gets(str_2);/*as*/
     while(str_1[i]!='\0')
     {
         j=0;
 number=i;
         while(str_2[j]!='\0')
         {
                 if (str_1[number]==str_2[j])
                 {
                        j++;
                        number++;
                 }
                 else
                        break;
                 
                 
         }
if (str_2[j]=='\0')
                m++;
i++;
     }
     printf("%d\n",m);
     system("pause");
 } 


上述代码解决这个问题的话如"aaa"中检查"aa"会算两次
题主如果还有问题的话,欢迎交流

#12


上面全说完了,我来占个坑