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

时间:2011-07-23 09:20:35

标签: c arrays string pointers printf

我想的是:

#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;
}

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

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

4 个答案:

答案 0 :(得分:33)

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

假设:

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

看起来就像你传递第一个%s的数组和第二个的指针一样,但事实上你(正确地)传递两个指针。

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

  • 这是对一元“&amp;”的争论(地址)运营商
  • 这是一元“sizeof”运算符的参数
  • 它是用于初始化数组对象的初始值设定项中的字符串文字。

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

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

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

答案 1 :(得分:7)

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

这是你想要的吗?

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

  

如果不存在l修饰符:预期 const char * 参数   是指向字符类型数组(指向字符串的指针)的指针。   数组中的字符被写入(但不包括)a   终止空字节('\ 0');如果指定了精度,则不再   比指定的数字写的。如果给出精度,则不   需要存在空字节;如果没有指定精度,或者是   大于数组的大小,数组必须包含一个   终止空字节。

答案 2 :(得分:1)

你应该做“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);

答案 3 :(得分:0)

根据我的经验,当您尝试将%s指令与* p。

一起使用时,应该会出现分段错误