C编程strchr返回指针

时间:2016-04-20 21:17:01

标签: c string pointers printf

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

int main ()
{
   const char str[] = "http://www.tutorialspoint.com";
   const char ch = '.';
   char *ret;

   ret = strchr(str, ch);

   printf("String after |%c| is - |%s|\n", ch, ret);

   return(0);
}

此代码从tutorialspoint复制。

根据我的理解,ret是指向角色的指针。要使用值指针指向的值,我会*ret

但是,在此示例中,只需致电retprintf()就会打印出.tutorialspoint.com。为什么我们不使用*ret来获取.tutorialspoint.com,因为字符串是ret中的值,*ret可以访问它?

3 个答案:

答案 0 :(得分:2)

查看%s转换说明符属性。在printf()中使用时,它需要一个char *类型的参数,因此它得到了。一切都很好。

引用C11标准,章节§7.21.6.1

  

s如果不存在l长度修饰符,则参数应为指向初始值的指针   字符数组的元素。 280)数组中的字符是   写入(但不包括)终止空字符。 [...]

换句话说,要使用%s打印字符串,您必须提供指向字符串开头的指针,即res,而不是{{ 1}}。

答案 1 :(得分:1)

  

要使用指针指向的值,我会*ret

是的,如果代码需要使用该值,仅使用单个字符,这将非常有用。但是代码想要打印字符串的内容。 string 是一个字符序列(或数组),包括空字符。

  

为什么我们不使用*ret来获取".tutorialspoint.com",因为字符串是ret中的值,*ret可以访问?

*ret解析为一个角色。 printf("%s", ...期望指向序列或字符数组的指针。使用printf("|%s|\n", ret);printf()知道字符串开头的地址,然后可以打印初始字符'.',然后打印后续字符't''u''t',......直到遇到空字符。

在尝试ret != NULL

之前,更好的代码会检查printf()
ret = strchr(str, ch);
if (ret != NULL) {
  printf("String after |%c| is - |%s|\n", ch, ret);
}

答案 2 :(得分:0)

  

&#34;因为字符串是ret中的值,可以通过* ret&#34;

访问

没有。 C中的字符串是以\0结尾的字符数。所以*ret将指向 many 的第一个字符。字符串没有单一值,例如在Java。

*是解除引用运算符。*ret将提供.,因为您使用*来访问指向的元素。 %s - printf格式使用指向字符的指针(指针仅由名称ret表示)。它会一直持续到遇到终结字符\0

来自Linux man(3)的函数strchr

  

strchr()函数返回指向第一次出现的指针          字符串s中的字符c。

您可以使用while循环手动实现它,只需递增指针即可。但是,您仍然需要%s - 说明符来打印它。或者繁琐的for循环和每个char上的函数调用。 低效。

注意:每个for循环都由while循环表示,因此上面提到的循环没有牢固设置。