前进指针并在C中的strchr之后再获取2个字符
在一个char指针上找到第一个出现的前进指针并在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>
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++代码>-不读取但忽略该值
您应该检查访问超出wherestrstr()
点时是否未到达字符串末尾,以便可以使用:
#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++谢谢,我现在明白了。我不确定检查下一个charpch[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;
}