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中,任何数组类型的表达式都会隐式转换为指向数组第一个元素的指针,除非它在以下三个上下文之一中:
(我认为C++有一两个例外.)
printf()
看到的实现"%s"
,假设相应的参数是一个指向char的指针,并使用该指针遍历字符串并打印它.
comp.lang.c FAQ的第6节对此进行了很好的讨论.
printf("%s\n", ptr);
Run Code Online (Sandbox Code Playgroud)
这是你想要的吗?
顺便说一下,来自printf(3)
,这里是s
转换说明符的文档(即%s
):
如果不存在l修饰符:const char*参数应该是指向字符类型数组(指向字符串的指针)的指针.数组中的字符被写入(但不包括)终止空字节('\ 0'); 如果指定了精度,则不会写入指定的数量.如果给出精度,则不需要存在空字节; 如果未指定精度,或者大于数组的大小,则数组必须包含终止空字节.