#include <stdio.h>
int any(char s1[], char s2[]) {
//converts to lower case
int c = 'a';
int i1 = 0;
while (s1[i1] != '\0') {
if (s1[i1] >= 'A' && s1[i1] <= 'Z')
s1[i1] += 32;
++i1;
}
int i2 = 0;
while (s2[i2] != '\0') {
if (s2[i2] >= 'A' && s2[i2] <= 'Z')
s2[i2] += 32;
++i2;
}
i1 = 0;
while (s1[i1] != '\0') {
i2 = 0;
while (s2[i2] != '\0') {
if (s1[i1] == s2[i2])
return i1;
++i2;
}
++i1;
}
return -1;
}
main() {
//printf("test");
printf("%d", any("This is fun", "fin"));
}
此代码导致分段错误,我很确定当我尝试将数组中的一个字符设置为等于int时,会发生这种情况。我怎么没有得到段错?
答案 0 :(得分:0)
您正在使用指向字符串常量的指针调用any
。尝试修改这些字符串会调用未定义的行为。
另请注意,main
的原型应为int main(void)
或int main(int argc, char *argv[])
,main
应返回0
以便成功操作。
您正在实现具有多个字符的strchr
的通用版本的不区分大小写的版本,但您不应修改参数字符串,并且您应该依赖<ctype.h>
中的函数而不是假设ASCII
这是一个更好的版本:
#include <ctype.h>
#include <stdio.h>
int any(const char s1[], const char s2[]) {
int i1 = 0;
while (s1[i1] != '\0') {
int i2 = 0;
while (s2[i2] != '\0') {
if (tolower((unsigned char)s1[i1]) == tolower((unsigned char)s2[i2]))
return i1;
++i2;
}
++i1;
}
return -1;
}
int main(void) {
//printf("test");
printf("%d", any("This is fun", "fin"));
return 0;
}