我想的是:
#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时,我实际上使用的是第一个元素,而不是它的地址。感谢。
答案 0 :(得分:33)
"%s"
的printf
格式说明符始终需要char*
参数。
假设:
char s[] = "hello";
char *p = "world";
printf("%s, %s\n", s, p);
它看起来就像你传递第一个%s
的数组和第二个的指针一样,但事实上你(正确地)传递两个指针。
在C中,任何数组类型的表达式都会隐式转换为指向数组第一个元素的指针,除非它位于以下三个上下文之一:
(我认为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。
一起使用时,应该会出现分段错误