设置char数组的单个索引等于整数

时间:2016-03-07 22:59:31

标签: c

#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时,会发生这种情况。我怎么没有得到段错?

1 个答案:

答案 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;
}