gpt4 book ai didi

c - 字符串解析的指针算法

转载 作者:行者123 更新时间:2023-11-30 15:51:36 28 4
gpt4 key购买 nike

所以我试图通过创建一个基本函数 strend 来掌握指针/数组,返回 1如果子字符串出现在给定字符串的末尾且 0如果不。我意识到我可以通过测量 char 数组的长度,从该长度中减去子字符串的长度,然后在那里启动我的程序来完成此操作,但我有点想按照我的函数的方式来完成此操作,以便更好地掌握的指针算术。所以这是程序:

#include <stdio.h>
#define NELEMS(x) (sizeof(x) / sizeof(x[0]))

int strend(char *string, char *substring, int substringLength){
int count; /*keep track of how many number of chars that match in a row*/
while(*string != '\0'){
count = 0;
while(*string == *substring){
if (count + 1 == substringLength) return 1; /*if matches = length of str*/
count++;
string ++;
substring ++;
}
if (count == 0) string++; /*only increment outer loop if inner loop has done no work*/
else {
substring - count; /*reset substring, don't increment string... BUGGY*/
}
}
return 0;
}

int main(){
char string[] = "John Coltrane";
char substring[] = "Coltrane";
int substringLength = NELEMS(substring);
printf("%d \n", strend(string, substring, substringLength));
char string2[] = "John Coltrane is Awesome Coltrane";
char substring2[] = "Coltrane";
int substringLength2 = NELEMS(substring);
printf("%d \n", strend(string2, substring2, substringLength2));
return 1;
}

对于第一个测试字符串、字符串和子字符串,我得到了正确的结果,返回 1,因为“Coltrane”位于字符串的末尾。同样,如果我从 string2 中取出“Coltrane”,我会得到正确的结果,返回 0,因为该字符串不以 Coltrane 结尾。

但是,对于您在上面看到的 string2 的版本,我也得到零,问题在于 strend不重置substring在我迭代它并在它与主字符串的一部分匹配时递增它之后。当 substring 的第一个实例位于字符串末尾时,这很好,但当有两个实例时,如 string2 中,则不行。我以为substring - count会将指针递减回子字符串数组的开头,但它似乎没有这样做。

如果我用 substring-- 更改该表达式,它确实显示子字符串的最后一个字符,但它是一个类似 for(int i = 0; i < count; i++, substring--) 的表达式真的是唯一的方法吗?

编辑:替换 substring - countfor(; count > 0; count--, substring--)看起来是一个非常优雅的单衬,它对我有用,但我仍然有一种直觉,有更好的方法。

最佳答案

这是一个不会更改任何变量值的表达式:

substring - count;

这是更改变量值的方法:

substring -= count;

代码中的另一个错误是仅在计数为 0 时递增字符串。如果存在像“Cole Slaw”这样的部分匹配怎么办?

关于c - 字符串解析的指针算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14990225/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com