【问题标题】:How this code is Working in C这段代码如何在 C 中工作
【发布时间】:2012-07-08 05:37:04
【问题描述】:
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 数组时如何存储字符串??

【问题讨论】:

  • 它只是偶然地工作。你正在写入你不拥有的记忆。更不用说您通过不匹配格式说明符和实际传递的数据来调用未定义的行为。
  • 如果你的名字足够长,你会遇到段违规错误
  • @DCoder:亲爱的朋友,我也是一名程序员,我也知道这是一个错误的程序,并且结果与我展示的方式不同。但我想知道为什么这段代码每次都给出上述输出。我也在不同的系统上尝试过这段代码。

标签: c string char scanf


【解决方案1】:

确实没有。

您将c(不是c 的地址)传递给scanf,所以它被提升为int,然后用作指针的值(因为“%s”期望写入指向某个内存的指针)。这给出了未定义的行为。显然,您在c 中的值恰好在提升为int 时出现在一个您可以写信而不会立即引起明显问题的地址。

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

【讨论】:

  • 我相信只是拼写错误。如果您更正代码并使用 &c 而不是 c,它的行为就像他说的那样,但如果名称太长,则会产生段冲突(在 ubuntu 10.04 中使用 gcc 测试)
  • 反对者愿意发表评论吗?如果是您@Pablo,您是否真的认为答案有资格“没有帮助”,因为它讨论了问题中的内容,而不是您认为可能存在的内容?在认为答案有帮助之前,是否需要先读心?
  • 我认为您的回答很有用,但是我努力尝试了这段代码,并找到了一种让它像提问者所说的那样工作的方法。我投了反对票,因为我认为投票最多的答案不应该是回答我坚信不是他真正想要的问题的答案。这是我在stackoverflow中看到的一个问题;一旦有人回答了问题并获得了几票,这个问题就不再受到关注,真正的问题永远不会得到解决。
  • 我只想说我尊重你,我看到你为这个社区做出了很多贡献,我同意应该回答的问题。我什至考虑用另一个代码打开一个我自己的新问题,并且还尝试编辑该问题,但未成功。但是他提供的代码无效。它甚至缺少一个分号!您有两个选择:1)假设提问者很愚蠢,无法区分工作代码和非工作代码,或者 2)他打错了字,而真正的问题被他们隐藏了。
  • @Pablo:是的,我错过了在这里输入分号,但在实际代码中 printf() 语句后有分号。但是每次我在不同的机器上运行这段代码,比如在我的电脑和笔记本电脑上,它的工作......
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 2010-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 2014-05-10
        相关资源
        最近更新 更多