为什么printf在删除&时不显示字符串,并且在C中不显示地址?

时间:2018-11-05 21:46:11

标签: c printf scanf

#include<stdio.h>

void main(){

char *r;
printf("Enter the string : ");
scanf("%s",&r); 
printf("\nThe string is : %s",&r);

}

我正在使用DEV C ++(tdm-gcc 4.9.2 64位版本)         在printf语句中,删除将导致字符串的打印,但显示无输出,这使我很困惑         我读到我们也可以在不带&的情况下使用扫描,但在字符串的情况下也不能使用

2 个答案:

答案 0 :(得分:1)

%s的{​​{1}}格式说明符期望指向scanf数组第一个元素的指针。换句话说,是char。相反,您传递的是char *。使用错误的格式说明符会调用undefined behavior

char **定义为数组:

r

然后,您可以将char r[100]; 传递到r,它会衰减为指向第一个元素的指针:

scanf

还要注意,我们在此处指定最大长度,这样,如果输入太多字符,就不会有写超出数组末尾的风险。

scanf("%99s", r); 类似,您需要按以下方式调用它:

printf

答案 1 :(得分:0)

char buf [64]和char * buf之间有很大的区别。

我建议您通过打印这两个声明的大小来了解差异。

EX:

    char *r;
    char buf[64];

printf(" Size of array :%d pointer :%d\n", sizeof(buf), sizeof(r));

char * r;是指针的纯声明,该指针保存char类型变量的地址。 char * r是char指针,现在它指向垃圾值。 char buf [64]是64个字节的char缓冲区,buf指向第一个字符。

char * r指向未知/垃圾值。在使用这种方法之前,您应该分配内存。

char *r = (char *) malloc(32);
or
char buf[64];
char *r;

r = buf;  

--->现在'r'指向buf,已经分配了内存。

现在,您可以了解其中的区别了。