#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语句中,删除将导致字符串的打印,但显示无输出,这使我很困惑 我读到我们也可以在不带&的情况下使用扫描,但在字符串的情况下也不能使用
答案 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,已经分配了内存。
现在,您可以了解其中的区别了。