所以我试图通过创建一个基本函数strend
来掌握指针/数组,如果子字符串出现在给定字符串的末尾并且{{1},则返回1
}} 如果不。我意识到我可以通过测量char数组的长度,从该长度减去子字符串的长度,然后在那里开始我的程序来实现这一点,但我有点想要按照我的函数的方式来实现它以获得更强的掌握指针算术。所以这是程序:
0
对于第一个测试字符串,字符串和子字符串,我得到正确的结果,返回1,因为“Coltrane”位于字符串的末尾。类似地,如果我从string2中取出“Coltrane”,我得到正确的结果,返回0,因为该字符串不以Coltrane结尾。
但是,对于上面看到的string2版本,我也得到零,问题在于#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;
}
在我迭代它并在增加它之后不重置strend
的事实它匹配主要字符串的一部分。当substring的第一个实例位于字符串的末尾时,这很好,但是当有两个实例时,就像在string2中一样。我认为substring
会将指针递减回子串数组的开头,但它似乎并没有这样做。
如果我用substring - count
更改该表达式,它确实显示了子字符串的最后一个字符,但是像substring--
这样的表达式真的是唯一的方法吗?
编辑:用for(int i = 0; i < count; i++, substring--)
替换substring - count
似乎是一个非常优雅的单线,它对我有用,但我仍然有一种直觉,有更好的方法。
答案 0 :(得分:1)
这是一个不改变任何变量值的表达式:
substring - count;
这是您更改变量值的方法:
substring -= count;
代码中的另一个错误是只在count为0时递增字符串。如果有像#34; Cole Slaw&#34;
这样的部分匹配怎么办?