在C语言中strchr之后,前进指针并再获取2个字符

时间:2016-05-30 03:08:36

标签: c string pointer-arithmetic strchr

我在使用strchr找到第一个出现在char指针上的字符后,尝试再获取2个字符。字符串可能如下所示:

foo;bar;2012 -> should output foo;b
foo;caz;     -> should output foo;c
foo;         -> should output foo (there are no +2 chars)
foo          -> null

对于第一种情况,我认为我可以做类似的事情,

#include <stdio.h>
#include <string.h>

int main ()
{
  char str[] = "foo;bar;2012";
  char *pch = NULL;

  if ((pch=strchr(str,';')) != NULL) {
    *pch++;
    *pch++;
    *pch = '\0';
  }
  puts(str);
  return 0;
}

但是检查我是否可以在不超过字符串的情况下推进字符串指针的正确方法是什么?

1 个答案:

答案 0 :(得分:3)

*pch++行应该生成编译器警告(如果他们没有,你没有启用足够的警告编译)。我编译时将警告视为错误,因此我得到:

xw31.c:10:5: error: value computed is not used [-Werror=unused-value]
     *pch++;

您应该使用pch++; - 但不会读取但忽略该值。

在访问strstr()指向您之外的位置时,您应检查您是否未到达字符串末尾,因此可以使用:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[] = "foo;bar;2012";
    char *pch;

    if ((pch = strchr(str, ';')) != NULL)
    {
        if (pch[1] != '\0' && pch[2] != '\0')
            pch[3] = '\0';
        puts(str);
    }
    return 0;
}

如果内部测试失败,则字符串已经足够短。当然,pch[0]是分号。这会生成foo;ba作为输出。如果你只想要foo;b,那么你只需要测试一个不太重要的角色:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char str[] = "foo;bar;2012";
    char *pch;

    if ((pch = strchr(str, ';')) != NULL)
    {
        if (pch[1] != '\0')
            pch[2] = '\0';
        puts(str);
    }
    return 0;
}