可以在printf中使用指向字符串的指针吗?

我想的是:

#include  #include  #include  int main(void) { //test pointer to string char s[50]; char *ptr=s; printf("\nEnter string (s): "); fgets(s, 50, stdin); printf("S: %s\nPTR: %s\n", s, *ptr); system("PAUSE"); return 0; } 

或者我应该使用带*(s + i)的for循环和格式说明符%c? 这是通过指针和简单的printf打印字符串的唯一可能方法吗?

更新:printf使用数组的第一个元素的地址进行操作,所以当我使用* ptr时,我实际上是使用第一个元素而不是它的地址。 谢谢。

printf"%s"格式说明符总是需要char*参数。

鉴于:

 char s[] = "hello"; char *p = "world"; printf("%s, %s\n", s, p); 

看起来你正在为第一个%s传递一个数组,为第二个传递一个指针,但事实上你(正确地)为两者传递指针。

在C中,任何数组类型的表达式都会隐式转换为指向数组第一个元素的指针, 除非它在以下三个上下文之一中:

  • 它是一元“&”(地址)运算符的参数
  • 这是一元“sizeof”运算符的一个参数
  • 它是初始化程序中用于初始化数组对象的字符串文字。

(我认为C ++有一两个例外。)

printf()的实现看到"%s" ,假设相应的参数是指向char的指针,并使用该指针遍历字符串并打印它。

comp.lang.c FAQ的第6节对此进行了很好的讨论。

 printf("%s\n", ptr); 

这是你想要的吗?

顺便说一句,从printf(3) ,这里是s转换说明符的文档(即%s ):

如果不存在l修饰符: const char *参数应该是指向字符类型数组(指向字符串的指针)的指针。 数组中的字符被写入(但不包括)终止空字节(’\ 0’); 如果指定了精度,则不会写入指定的数量。 如果给出精度,则不需要存在空字节; 如果未指定精度,或者大于数组的大小,则数组必须包含终止空字节。

你应该做“printf(”S:%s \ nPTR:%s \ n“,s,ptr);”​​而不是printf(“S:%s \ nPTR:%s \ n”,s,* ptr);

ptr和* ptr之间的区别是: ptr给出了你指向的变量的内存中的地址 ,* ptr给出了指向变量的 ,在这种情况下是* ptr = ptr [0]

这段代码将显示我的意思:

 printf("\tS: %s\n\tPTR: %s\n\tAddress of the pointed Value: %x\n\tValue of the whole String: %s\n\tValue of the first character of the String: %c\n", s, ptr,ptr,ptr,*ptr); 

根据我的经验,当您尝试将%s指令与* p一起使用时,应该会出现分段错误。