void main()
{
char c;
clrscr();
printf("Enter your name:\n");
scanf("%s", c);
printf("You entered your name as : \n")
printf("%s",c);
getch();
}
output//
Enter Your name:
sandeep
You entered your name as :
sandeep
我不知道这个单个char变量'c'在不是char数组的情况下如何存储字符串?
答案 0 :(得分:4)
事实并非如此。
您将c
(不是c
的地址)传递给scanf
,因此它被提升为int
,然后将该值用作指针(因为“%s”希望通过指向某个内存的指针进行写入。这给出了未定义的行为。显然,您在c
中遇到的价值,当提升为int
时,恰好出现了一个您可以写信的地址而不会立即引起明显的问题。
当你将它传递给printf
时也发生了同样的事情,并且由于地址匹配,你的输出与输入相匹配 - 但是如果你运行的话,不能保证它会继续这样做再次使用相同的可执行文件,或者如果使用其他编译器进行编译,则在其他系统上运行等等。
答案 1 :(得分:1)
这是错的。如果它工作,它会意外地工作,随机值恰好在'c'和接下来的4或7个字节(取决于你的地址大小),指向一个相对无害的内存区域。也许如果运行得足够多,当c和c周围的垃圾指向不太良好的内存区域时,你会产生内存错误。
它应该是char * c,用缓冲区或字符数组初始化。 C是一种非常非常简单的语言。它应该在编译期间发出警告。
答案 2 :(得分:0)
即使它似乎有效,scanf也会将字符串写入未分配的内存位置。你应该使用数组,否则你的程序有一天可能会崩溃。
答案 3 :(得分:0)
您没有编译时错误,因为scanf的原型具有“...”作为第二个参数。这意味着没有类型检查。是否出现运行时错误取决于您的运气。