字符串函数中的子字符串搜索给出了不正确的值

时间:2019-02-12 21:43:32

标签: c arrays string

我创建了一个行为异常的程序-我不确定为什么它给出了不正确的值。例如,当我使用输入:(“聊天框”,“帽子”)时,它可以正常工作:

    The starting position is 3.
String 'hat' occured for 1 time(s).

但是,如果我删除空格(“ achatterbox”,“ hat”),则会显示:

String 'hat' occured for 0 time(s).

运动说明:

/ *编写一个名为findString()的函数,以确定一个字符串是否在另一字符串内。该函数的第一个参数应该是要搜索的字符串,第二个参数是您要查找的字符串。如果函数找到了指定的字符串,则让它返回源字符串在找到该字符串的位置。如果该函数找不到字符串,则返回-1。因此,例如,调用单击此处以查看代码图片索引= findString(“一个chatterbox”,“ hat”);在字符串“ a chatterbox”中搜索字符串“ hat”。由于源字符串中确实存在“帽子”,因此该函数返回3来指示在源字符串中找到“帽子”的起始位置。 * /

我的代码:

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

int findString (char motherArgument[], char childArgument[]);


int main(int argc, char const *argv[])
{

    printf("%s",findString ("a chatterbox", "hat")); //why if I remove space ' ' this does not work, why?
     return 0;
}


int findString (char motherArgument[], char childArgument[]) // is child inside the mother? 
{

    int i, flag = false, freq = 0;

    for (i = 0; i < strlen(motherArgument); i++) // going through mother
  {
    if(motherArgument[i] == childArgument[i]) //  chars equal?
    {
        flag = true;
        printf("The starting position is %d.", i - 1); // i -1 to get 3 as in the example
        freq++; // frequency
    }

  }
    if (flag = true) 
      {
         printf("\nString '%s' occured for %d time(s).\n", childArgument, freq);    
      }

        else
            {
                printf("None\n"); // false = none
                return -1;
            }


}

我在做什么错?我应该以其他方式输入数据吗?

2 个答案:

答案 0 :(得分:1)

company_id==null

这是不正确的。两个字符串都不要使用相同的索引。

搜索motherArgument,直到找到与childArgument的FIRST字符匹配的字符。如果找到,请继续检查两个字符串的后续字符是否相等。

答案 1 :(得分:0)

我看到您的代码有两个问题,您的findString()函数和您的main()函数。编写测试代码,让我们首先整理您的main()函数。它假定findString()返回一个字符串,但不返回-返回int。所以我们需要这样的东西:

int main(int argc, char const *argv[])
{
    char *string = "a chatterbox";

    int index = findString(string, "hat");

    if (index != -1)
    {
        printf("%s\n", string + index);
    }

    return 0;
}

现在转到findString()函数,正如@FredK和@Barmar正确指出的那样,这是不正确的:

if(motherArgument[i] == childArgument[i])

但除此之外,这还意味着什么:

freq++; // frequency

问题说明中没有任何内容提到频率计数。然后有一个flag变量,您可以include <stdbool.h>对其进行声明,并始终int对其进行声明。似乎可以控制某些不在规范中的打印。最后,如果失败,您将返回-1,但是如果成功,您将不会明确返回任何内容!

让我们尝试对findString()进行最小限度的实施:

int findString(const char *string, const char *substring)
{
    for (int i = 0; i < strlen(string); i++)
    {
        if (strncmp(string + i, substring, strlen(substring)) == 0)
        {
            return i;
        }
    }

    return -1;
}

现在您会告诉我们您不允许使用strncmp()。无论如何,您现在都有一个基本模型,说明这些例程应如何交互并可以根据需要填写代码。除了通常的调试和测试外,在编写程序时还会问自己一些问题:

如果一个或两个参数字符串都是空字符串怎么办?还是相同的字符串?如果子字符串比字符串长,会发生什么?我们的循环极限是正确的还是可以做得更好?

首先确定在任何情况下应发生的情况,然后确保您的代码执行正确的事情。