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

and*_*ari 19 c arrays string printf pointers

我想的是:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>

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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

Kei*_*son 34

"%s"格式说明符printf 总是需要一个char*说法.

鉴于:

char s[] = "hello";
char *p = "world";
printf("%s, %s\n", s, p);
Run Code Online (Sandbox Code Playgroud)

看起来像你传递的第一阵列%s和第二的指针,但实际上你(正确地)传递两个指针.

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

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

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

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

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


Ber*_*ron 7

printf("%s\n", ptr);
Run Code Online (Sandbox Code Playgroud)

这是你想要的吗?

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

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

  • @AndrewGH:Betrand Marron是对的.`*ptr`的类型为`char`,但`%s`需要类型`char*`所以`printf("%s \n",ptr);`是正确的. (3认同)
  • @Andrew GH,不,`ptr`是指向char的指针.`*ptr`是一个char. (2认同)
  • @Andrew GH,是`printf("%s \n",ptr)`.如果你不明白,我强烈建议你阅读一本关于指针的书并学会使用它们. (2认同)
  • @Andrew:`*ptr`只是字符串的第一个字符,*不是整个字符串.大多数作用于字符串的操作通过指向字符串第一个字符的指针间接执行.如果将`*ptr`传递给函数,则函数接收的唯一信息是第一个字符的*value*; 它使函数无法访问字符串的其余部分.传递`*ptr`让函数通过取消引用指针来访问第一个字符,通过递增指针然后解除引用它来访问第二个字符,依此类推. (2认同)