C编程,为什么我不能使用带索引的strcpy()?

时间:2017-12-09 23:29:59

标签: c

以下是一个例子:

int main()
{
    char string1[8];
    char string2[7];
    strcpy(string1, "Heloooo");
    strcpy(string2, "Helloo");
    printf("%d", strcmp(string1[2], string2[5]));
    return(0);
}

不会返回任何内容,即使它应该返回&gt; 0,0或<0。如果我删除索引,但是:

    printf("%d", strcmp(string1, string2));

它会正常工作。有人能告诉我我在这里做错了吗?

3 个答案:

答案 0 :(得分:1)

strcmp需要一对字符指针,而string1[x]不是指针,而是一个字符:

printf("%d", strcmp(&string1[2], &string2[5]));

printf("%d", strcmp(string1+2, string2+5));

请注意,虽然string1string2是数组,但C编译器会将它们转换为字符指针,而无需其他运算符。

答案 1 :(得分:0)

函数strcmp期望指针作为参数。查看原型:int strcmp(const char * s1, const char * s2);

string1[2]string2[5]只是字符'l''o'

printf("%d", strcmp(string1[2], string2[5])); // will not compile 

printf("%d", strcmp(&string1[2], &string2[5])); // will return -3 with my compiler GCC 5.3.0

&string1[2]是指向string1[2]字符

的指针

&string2[5]是指向string2[5]字符

的指针

注意:

  

strcmp()和strncmp()函数返回一个小于的整数,   如果s1(或其前n个字节)是等于或大于零   发现分别小于,匹配或大于s2。

但是,确切的返回值取决于实现。

对于此实施:

int strcmp_fast (const char * s1, const char * s2)
{
    for(; *s1 == *s2; ++s1, ++s2)
        if(*s1 == 0)
            return 0;
    return *(const unsigned char *)s1 - *(const unsigned char *)s2;
}

printf("%d", strcmp_fast(&string1[2], &string2[5])); 

打印值为-3

答案 2 :(得分:0)

str [ndx]求值为char但函数需要char *,[]产生l值,这样你就可以得到它的地址&amp; str [ndx]并获得你想要的东西。