#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
。
但是,在此示例中,只需致电ret
,printf()
就会打印出.tutorialspoint.com
。为什么我们不使用*ret
来获取.tutorialspoint.com
,因为字符串是ret
中的值,*ret
可以访问它?
答案 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循环表示,因此上面提到的循环没有牢固设置。