函数C中的指针

时间:2017-02-03 09:53:41

标签: c pointers

这段代码很好用。但我想知道它是否可以以更有效的方式完成?

更具体地说,这部分*(s1 + i)是否可以强制它通过指针(例如*s1++)按字符逐个整个数组。 我的任务是执行这个函数compareStrings而没有索引数组[]。

 int  compareStrings(const char  *s1, const char  *s2)
{
    int i = 0, answer;
    //  i - to sequence through array of characters
    // pointer to character string1 and character string2
    while (*(s1 + i) == *s2 + i && *(s1 + i) != '\0'&& *(s2 + i) != '\0')
    {
        i++;
    }

    if ( *(s1 + i) < *(s2 + i) )
        answer = -1;               /* s1 < s2  */
    else if ( *(s1 + i) == *(s2 + i) )
            answer = 0;                 /* s1 == s2 */
        else
            answer = 1;                 /* s1 > s2  */

        return answer;

但我想将其更改为s1++s2++ *(s1 + i)*(s2 + i)。我已经尝试实现这个想法,并将一个额外的指针指向开头,但我失败了。这里是代码 - &gt;

int  compareStrings(const char  *s1, const char  *s2)
{
    int answer;
    char **i = s1, **j = s2;
    // i and j - to sequence through array of characters
    while (*(i++) == *(j++) && *(i++) != '\0'&& *(j++) != '\0');

    if (*i < *j)
        answer = -1;               /* s1 < s2  */
    else if (*i == *j)
        answer = 0;                 /* s1 == s2 */
    else
        answer = 1;                 /* s1 > s2  */

    return answer;
} 

2 个答案:

答案 0 :(得分:2)

为了比较C字符串,您只需要

int str_cmp(const char* s1, const char* s2)
{
    while (*s1 != 0 && *s2 != 0 && *s1 == *s2)
    {
        ++s1;
        ++s2;
    }

    if (*s1 == *s2)
    {
        return 0;
    }

    return *s1 < *s2 ? -1 : 1;
}

答案 1 :(得分:1)

后一个代码不起作用,因为你增加s1两次:

*s1++ == *s1++

这将:

  1. 获取s1
  2. 的值
  3. Dereferene it
  4. 增加1
  5. 然后在右侧,再次执行相同的操作
  6. 然后再进行比较。
  7. 你基本上是这样做的:

    *(s1) == *(s1+1)
    

    我认为那应该是:

    *s1++ == *s2++