注册 登录
编程论坛 C# 论坛

主字符串中统计子字符串,看似简单之问题,却让我三天两熬夜?为什么不完全对?

lxsxd 发布于 2014-05-30 18:26, 600 次点击
一、题目
编一个程序,定义一个字符串变量,输入字符串,然后再输入一个字符(或一个字符串),在字符串中查找该字符(或这个字符串)出现的次数。
要求:1、在字符串中统计一个字符出现的次数(已经完成);
      2、在主字符串中统计子字符串出现的次数。——看似简单之问题,却让我三天两熬夜【焦急求助】
二、代码
static void Main()
        {
              Console.WriteLine ("请输入字符串");
              string str1 = Console.ReadLine();

              Console.WriteLine ("请输入子字符串");
              string str2 = Console.ReadLine ();

              int str2len = str2.Length;
              int str1len = str1.Length;

              int x = 0, y = 0;

             for (int k = 0; k < str1len-1; k++)
             {
                 for (int j = 0; j < str2len-1; j++)
                 {
                     if (str1[k + j] == str2[j])
                     {
                         x++;
                         if (x % str2len == 0)
                         {
                             y++;
                             x = 0;
                         }
                     }
                 }
             }
             Console.WriteLine("{0}出现{1}次", str2, y);
            Console.ReadLine ();
            
        }

三、困惑
1、输入主字符串 hotmahotmahot  输入子字符串 hot  ,正确的次数应该是3次,运行结果却是2次。错在哪里?
2、输入主字符串 I am a teacher I am a student  输入子字符串 am  ,正确的次数应该是2次,运行结果也是2次。又是为什么?

另:不用substring()编写。

【焦急求助大侠们!!!!】
3 回复
#2
yhlvht2014-05-30 20:51
从hotmahotmahot字符串就能看出楼主的算法是有问题的,第二个字符串输出正确只是恰好碰上而已
      static void Main(string[] args)
        {
            Console.WriteLine("请输入字符串");
            string str1 = Console.ReadLine();

            Console.WriteLine("请输入子字符串");
            string str2 = Console.ReadLine();

            int str2len = str2.Length;
            int str1len = str1.Length;
            int x = 0, y = 0;
            for (int k = 0; k < str1len - 1; k++)
            {
                for (int j = 0; j < str2len; j++)
                {
                    if (str1[k + j] == str2[j])
                    {
                        x++;
                        if (x % str2len == 0)
                        {
                            y++;
                            x = 0;
                            k += str2len;
                        }
                    }
                }
            }
            Console.WriteLine("{0}出现{1}次", str2, y);
            Console.ReadLine();
        }
#3
yhlvht2014-05-30 20:53
不用算法可以这样做
static void Main(string[] args)
        {
            Console.WriteLine("请输入字符串");
            string str1 = Console.ReadLine();

            Console.WriteLine("请输入子字符串");
            string str2 = Console.ReadLine();
            int x = 0, y = 0;
            int n = str1.LastIndexOf(str2);
            while (n >= 0 && x <= n)
            {
                x = str1.IndexOf(str2, x);
                x += str2.Length;
                y++;
            }
            Console.WriteLine("{0}出现{1}次", str2, y);
            Console.ReadLine();
        }
    }
#4
邓士林2014-05-30 22:52
for (int k = 0; k < str1len-1; k++)
             {
                 for (int j = 0; j < str2len-1; j++)
                 {
循环出错了,对于外层循环只需要遍历到母字符串减去子字符串的长度,子字符串你的也没有遍历完整str2len-1


[ 本帖最后由 邓士林 于 2014-5-30 22:54 编辑 ]
1