这段代码是如何在C中工作的

时间:2012-07-08 05:37:04

标签: c string char scanf

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数组的情况下如何存储字符串?

4 个答案:

答案 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的原型具有“...”作为第二个参数。这意味着没有类型检查。是否出现运行时错误取决于您的运气。