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

前进指针并在C中的strchr之后再获取2个字符,c,string,pointer-arithmetic,strchr,C,String,Pointer Arithmetic,Strchr,在一个char指针上找到第一个出现的strchr之后,我试图再获取两个字符。字符串可以如下所示: 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>

在一个char指针上找到第一个出现的
strchr
之后,我试图再获取两个字符。字符串可以如下所示:

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;
}
#包括
#包括
int main()
{
char str[]=“foo;bar;2012”;
char*pch=NULL;
if((pch=strchr(str,,;)!=NULL){
*pch++;
*pch++;
*pch='\0';
}
put(str);
返回0;
}

但是,检查指针是否可以在字符串中前进而不经过检查的正确方法是什么?

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

xw31.c:10:5: error: value computed is not used [-Werror=unused-value]
     *pch++;
您应该使用
pch++-不读取但忽略该值

您应该检查访问超出where
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;
}

如果需要处理2个以上的字符或任意数量的字符,则使用strlen(str)获取长度。之后,您可以创建一个带有str+len的结束指针来与pch进行比较,或者您可以通过pch-str找到索引来与len进行比较。然后减法找出字符串末尾有多少个字符。@ZanLynx谢谢,很高兴知道这一点。尝试更改每个
*pch++
如果(*pch)pch++pch[1]
是否安全。如果以(以null结尾的)字符串开头,那么分号后面必须至少有一个字节可以安全读取。显示的代码用于检查进一步操作是否安全。它有时可能会用另一个字节覆盖空字节。
#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;
}