【问题标题】:C: Search vor endindex of first occurenceC:搜索第一次出现的结束索引
【发布时间】:2017-02-08 19:47:04
【问题描述】:

如何编写以下程序:

• 在第二个字符串中搜索一个字符串并返回第一次出现的结束索引的函数

• 一个函数,它包含第一个字符串在第二个字符串中的所有出现,它将被第三个字符串替换

• 一个主函数,它扫描三个字符串并将字符串放入替换中

不允许使用比 stdio.hstdlib.hstring.h

更多的 headers

我只能从这样的代码开始,如您所见,我无法解决这三个问题中的任何一个。我希望你能帮助我。

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

int endIdx(char *string1, char *string2, char *occu)
{

    for (int i = 0; i < strlen(string1); i++)
    {
        for (int j = 0; j < strlen(string1); j++)
        {
            if (string1[i] == string2[j])
            {
                printf("occurence string1[%d] is in string2[%d]\n", i, j);
                occu[j] = string1[i];
            }
        }
    }
    return 0;
}


int main()
{
    char string1[20];
    char string2[20];
    char occu[20];

    printf("Type in the first string: ");
    scanf("%s", string1);

    printf("Type in the second string: ");
    scanf("%s", string2);

    endIdx(string1, string2, occu);

    printf("%s\n", occu);

}

【问题讨论】:

  • 请提出更具体的问题。您当前的代码有问题吗?它的行为是什么?关于该代码,您无法解决哪些具体问题?
  • 1.我不知道如何打印出第一次出现的 endindex。我可以通过打破 for 循环来解决它,但是我必须将所有出现的事件放入第三个字符串中。所以我无法继续,因为休息时,我无法“收集”所有事件
  • 如果您可以#include &lt;string.h&gt; 并使用strlen(),那么您可以使用strstr(),这将通过添加一些指针算法轻松解决第一个问题。第二点,如果匹配的子串重叠会发生什么?如果第一个匹配优先,如果替换后仍有重叠怎么办?
  • 好的,你能描述一下,我如何解决 strstr() 的问题?我想当我找出如何正确解决第一点时,我可以解决剩下的问题
  • strstr 返回指向子字符串第一次出现的指针。然后一些算术计算出它的结束索引。交给你 ;) .... 但是如果你应该用另一个子字符串 replace ,如果替换的长度不同,那么如果不创建新字符串,你就不能轻易做到这一点..

标签: c string find-occurrences


【解决方案1】:

以下程序使用strstr 来实现您的endIdx 问题。 strstr 返回指向searchTeramstrNULL 中第一次出现的指针,如果它没有出现。

在第一种情况下,我们通过取occurrence - str 得到一个起始索引,即第一次出现的内存地址减去str 开始的内存地址。然后加上searchTerm 的长度给出结束索引。

在第二种情况下,我们只需返回-1

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

long endIdx(const char *str, const char *searchTerm) {
    long result = -1;
    const char* occurrence = strstr(str,searchTerm);
    if (occurrence != NULL) {
        result = (occurrence - str) + strlen(searchTerm);
    }
    return result;
}

int main(void)
{
    // ----------------012345678901234
    const char* str = "Hello world! world is beautiful!";
    const char* searchTerm = "world";

    long endidx = endIdx(str, searchTerm);
    printf("endidx (should be 11): %ld\n", endidx);

    endidx = endIdx(str, "not to be contained");
    printf("endidx (should be -1): %ld\n", endidx);

    return 0;
}

【讨论】:

  • 非常感谢,我有一个问题。你说它应该是 11。但此时有“!”。在 [10] 处有“hello world”的最后一个“d”。那不是str的endindex吗?
  • 我不确定结束索引是否应该指向出现后的第一个字符还是最后一个字符。在后一种情况下写result = (occurrence - str) + strlen(searchTerm) - 1
  • 我也不确定。你会说德语吗?我从德语翻译过来:“schreiben sie ein programm, dass eine Funktion enthält, die einen String in einem zweiten String sucht und den Endindex des ersten Vorkommens zurückgibt。”对不起,如果你不是德国人,但你的名字听起来像一个德国名字:D
  • 是的,我会说德语 :-) 我会投票给最后一个字符,即result = (occurrence - str) + strlen(searchTerm) - 1
  • 好的,我不明白这部分内容:result = (occurrence - str) + strlen(searchTerm) - 1 ;;;我不明白如何减去两个 char* 数据类型。 .......例如这两个字符串: char *string1 = "12345678";字符 *string2 = "123"; int 结果 = (string1 - string2);结果等于-9,我不明白为什么。
猜你喜欢
  • 2010-12-11
  • 1970-01-01
  • 2018-06-20
  • 2011-09-11
  • 1970-01-01
  • 2020-03-12
  • 2014-07-15
  • 2014-07-08
  • 1970-01-01
相关资源
最近更新 更多