0
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

当它不是一个字符数组时,我没有得到这个单个字符变量'c'如何存储一个字符串?

4

4 回答 4

4

它没有,真的。

您将c(不是 的地址c)传递给scanf,因此将其提升为int,然后将值用作指针(因为 "%s" 期望通过指向某些内存的指针进行写入)。这给出了未定义的行为。显然,您碰巧在 中拥有的值c,当提升到时int碰巧出现在您可以写入而不会立即引起明显问题的地址。

当你将它传递给它时,几乎发生了同样的事情printf,并且由于地址匹配,你的输出与输入匹配——但如果你再次运行相同的可执行文件,或者如果你编译,不能保证它会继续这样做使用不同的编译器,在不同的系统上运行等。

于 2012-07-08T05:43:23.317 回答
1

这是错误的。如果它起作用,它会偶然起作用,随机值恰好在“c”和接下来的 4 或 7 个字节(取决于您的地址大小)中,指向一个相对无害的内存区域。也许如果你运行得足够多,当 c 和 c 周围的垃圾指向不太良性的内存区域时,你会产生内存错误。

它应该是 char* c,用缓冲区或字符数组初始化。C 是一种非常非常简单的语言。它应该在编译期间发出警告。

于 2012-07-08T05:45:23.163 回答
0

您没有编译时错误,因为 scanf 的原型将“...”作为第二个参数。这意味着没有类型检查。是否出现运行时错误取决于您的运气。

于 2012-07-08T06:11:11.077 回答
0

即使它看起来有效,scanf 也会将字符串写入未分配的内存位置。你应该使用一个数组,否则你的程序有一天可能会崩溃。

于 2012-07-08T05:41:40.087 回答