C printf中可以使用字符串指针吗?

C printf中可以使用字符串指针吗?,c,arrays,string,pointers,printf,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:

我在想这样的事情:

#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;
}
#包括
#包括
#包括
内部主(空){
//字符串的测试指针
chars[50];
char*ptr=s;
printf(“\n输入字符串):”;
fgets(s,50,stdin);
printf(“S:%S\nPTR:%S\n”,S,*ptr);
系统(“暂停”);
返回0;
}
或者我应该使用带有*(s+I)和格式说明符%c的for循环吗? 这是通过指针和简单printf打印字符串的唯一可能方法吗

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

printf("%s\n", ptr);
这是你想要的吗

顺便说一句,这里是
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);
printf
“%s”
格式说明符总是需要一个
char*
参数

鉴于:

char s[] = "hello";
char *p = "world";
printf("%s, %s\n", s, p);
看起来您为第一个
%s
传递了一个数组,为第二个传递了一个指针,但实际上您(正确地)为这两个传递了指针

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

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

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

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


的第6节对此进行了极好的讨论。

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

请不要使用
get
。“永远不要使用gets()。因为在不事先知道gets()将读取多少个字符的情况下无法判断,而且由于gets()将继续存储超过缓冲区末尾的字符,所以使用gets()是非常危险的。它被用来破坏计算机安全。请改用fgets()。”()。如果您不介意的话,我对代码进行了调整,以最大限度地减少对问题不重要的内容发表评论的机会。即使用
gets()
main()
的返回类型。您应该不惜一切代价避免使用
gets()
,并使用其他方法,如
fgets()
(如@Bertrand解释的)。另外,
main()
应始终返回
int
@AndrewGH:Betrand Marron是正确的
*ptr
具有类型
char
,但
%s
需要类型
char*
so
printf(“%s\n”,ptr)是正确的。@Andrew G.H.,No.
ptr
是指向char的指针
*ptr
是一个字符。@Andrew G.H.,Yes
printf(“%s\n”,ptr)
。如果您不明白,我强烈建议您阅读一本关于指针的书,并学习如何使用它们。既然知道了这一点,为什么我不能通过*ptr访问字符串?因为*ptr相当于数组[0]…所以我不明白为什么只使用
ptr
?@Andrew:
*ptr
只是字符串的第一个字符,而不是整个字符串。大多数作用于字符串的操作都是通过指向字符串第一个字符的指针间接执行的。如果将
*ptr
传递给函数,函数接收的唯一信息是第一个字符的值;它使函数无法访问字符串的其余部分。传递
*ptr
让函数通过取消引用指针来访问第一个字符,通过增加指针然后取消引用来访问第二个字符,依此类推。是的,当然,但是,当使用
printf(“%s”,array\u name)
时,基本上可以访问&array\u name[0],不是吗?。。。哦,没关系,我明白了。printf使用数组的第一个元素的地址进行操作,所以当我使用*ptr时,我实际上使用的是第一个元素,而不是它的地址。谢谢。@Andrew G.H:printf(“%s”,array\u name)不允许您访问&array\u name[0],而是&array\u name。&array_name是特定类型变量的地址。处理每个变量的方式因类型而异。对于字符串(char*),如您所说的%array_name,但由于“%s”,printf必须读取array_name,直到找到“\0”。数组的标识符等于数组的第一个元素的地址:
array_identifier==&array_identifier[0]
是的,但似乎您认为printf(“%s”,数组_name)将访问第一个元素。。。我只是想告诉你,由于“%s”,printf将打印指针变量的所有内容,直到它在指针变量中找到“\0”……它不是使用第一个元素的地址来完成这项工作吗?我的意思是,我听说的每个函数都使用第一个地址来确定