【问题标题】:Check if and where a substring exists检查子字符串是否存在以及在哪里存在
【发布时间】:2017-03-18 19:19:12
【问题描述】:

我看到了this 的问题,但没有一个答案是我想要的。我试过strstr,但它返回一个指针而不是整数索引。

我需要查找字符串a 是否包含字符串b,如果是,它的位置,有点像strcmp 返回的索引。在 C 中是否有函数或简单的方法可以做到这一点?

例如,如果a 是“foobar”而b 是“bar”,那么这个函数/方法将返回 3,因为“bar”在“foobar”的索引 3 处。

感谢任何帮助!

【问题讨论】:

  • strstr 就是这样做的——如果它不能像你期望的那样工作,你应该在这里发布你的代码并解释你在其中strstr 的行为所遇到的问题。
  • "bar" 位于"foobar" 中的索引3,而不是2

标签: c string substring strstr


【解决方案1】:

给你:

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

int main()
{
    char str1[]="foobar";
    char str2[]="bar";
    char *ptr;
    if((ptr = strstr(str1, str2)) != NULL) {
        printf("Start offset: %td\n", ptr - str1);
    }

    return 0;
}

【讨论】:

  • 测试不会把你从 UB 中拯救出来。
  • 我的理解是 ptrdiff_t 是一个有符号的 int,这是 printf 中的 %d 所期望的。这是真的吗?
  • 否:ptrdiff_t 是一个签名类型,可以是 int 或更大。在 linux 64 位上,它是 long,在 Windows 64 位上,它是 long long。使用printf("Start offset: %td\n", ptr - str1);printf("Start offset: %lld\n", (long long)(ptr - str1));
【解决方案2】:

您可以为此使用strstr,以及一些指针算法。

char *result = strstr(a, b);
if (result != NULL) {
    printf("index = %tu\n", result - a);
}

这里,result 指向a 前面特定数量的字节。所以如果你减去这两个,那就是你的索引。

【讨论】:

  • 正确。请注意,Microsoft 的 C 库和其他一些库可能不支持 %lu 转换说明符。在这样的系统上,使用printf("index = %llu\n", (unsigned long long)result - a);
【解决方案3】:

您可以通过减去指向字符串开头的指针a,轻松地将返回的指针转换为索引:

char *p = strstr(a, b);
int i = p ? p - a : -1;

(另外,strcmp 不返回索引。)

【讨论】:

  • @MD XF - 不,它没有。 strcmp() 只能检测差异的性质(按字典顺序是一个小于、等于或大于另一个)。它不返回有关差异在哪里的信息。
  • @melpomene - i 使用ptrdiff_t 会更好。那是减去指针的结果——结果不一定能够存储在int 中。否则,你的方法是可以的——如果strstr(a,b),如果不是NULL,不能给出小于a的结果,所以减法p-a不会给出负值。
  • @melpomene /tmp/test foobar Foobar - 结果:The difference between foobar and Foobar is 32。这是另一个The difference between foobar and bar is 4。声明:printf("The difference between %s and %s is %d\n", argv[1], argv[2], strcmp(argv[1], argv[2]));。那么有什么问题呢?介意解释吗?如有疑问,请测试代码。
  • @alvits:programiz.com 的教程具有误导性:值32 可以是大于0 的任何int 值。对于strcmp(a,b); 的返回值,除了以下事实之外,没有什么可以假设的:如果字符串相同,它可以0,如果a 按字典顺序小于b,则为负值,否则为正值。
  • MSVC源代码中的注释比较清楚:比较pSrt1,pSrt2指向的字符串。如果相同则返回 0,如果 pStr1 小于 pStr2,则返回 0。 向 OP 解释特定库如何计算返回的不同值会适得其反:许多普通读者会认为您在描述它必须做什么而不是它发生了什么。这种误解很难消除。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-15
  • 1970-01-01
  • 2011-07-30
  • 2011-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多