【问题标题】:Am I using %c wrong?我使用 %c 错了吗?
【发布时间】:2014-10-07 02:11:50
【问题描述】:

我正在制作一个基于选择的故事,在我要求用户按 Enter 键后,选项出现在他们不希望自己的角色成为哪个职业上。每次都会弹出此窗口并显示“'legends.exe' 已停止工作。”

#include <stdio.h>

int main()
{
    char firstname[15];
    char class;
    char swordch0c1;
    char enter;

    printf("Hello there! Could I have your first name?\n");
    scanf("%s",firstname);
    printf("\n---------------------The Legend of %s---------------------",firstname);
    printf("\nPress Enter to continue.");
    enter=getch();
    if(enter=="\n");

    printf("\n\n\nYou are %s, a: \nA.Swordsman\nB.Assassin\nC.Archer\nD.Mage\n",firstname);
    scanf("%c",class);
    return(0);
}

对不起,如果我很难或不够具体。顺便说一句,我正在使用 Windows。

【问题讨论】:

  • 分享一个导致问题的确切代码。
  • 你应该扫描到变量的地址...例如。 scanf(&amp;class)
  • 每个 C 开发人员都会在某些时候意识到低级输入函数的不足(例如,我的 真实 名称是 Tarquin Fin-tim-lin-bin-whin-bim-lim-bus-stop-F'tang-F'tang-Olé-Biscuitbarrel,而您的代码似乎每次都会崩溃时间),并写出更好、更安全、更快、更聪明、更帅气的作品:-)这是我的:powerfield-software.com/?p=65。随心所欲地使用它,并将更多精力放在游戏逻辑上。
  • @paxdiablo 你的getLine() 只解决了输入比预期缓冲区长的许多问题之一:它将避免长姓溢出到下一个输入提示的不同步。这很少是需要的。相反,很多时候正确的做法是分配一个更大的缓冲区,可以容纳整个输入。
  • 亚当,没有一个函数可以解决每一个问题,你必须在某处画线。例如,如果无法分配内存,你会怎么做?链接中的函数解决了最普遍的问题,即会使您的代码崩溃的问题。它用既可以防止这种情况又可以在您的输入不适合缓冲区时通知您的东西替换它。 如何您处理该通知取决于您。

标签: c format-specifiers


【解决方案1】:

替换

scanf("%c",class);

scanf("%c",&class);

您需要给scanf 一个指向您希望它放置数据的位置的指针。

请注意,class 不是变量的最佳名称。虽然它不是 C 中的关键字,但在许多语言中都有。

【讨论】:

  • 同样适用于scanf(firstname) :p
  • 哇。我现在真的觉得很傻。我知道。我想我只是忘记了。谢谢!
【解决方案2】:

试试这个

scanf("%c", &class);

【讨论】:

  • 伙计们,发布没有附加信息的重复答案是降低投票率的好方法......
  • 哎呀!是的,为此道歉!,回答问题的新手:)。将为进一步的答案提供解释。亚当发布答案的速度比我快 0.2 秒。我比第一个回答晚了 0.2 秒。这不是重复的答案,但我同意需要进一步的解释。谢谢:)
【解决方案3】:

使用如下语法,需要指定&

scanf("%c",&class);

【讨论】:

    【解决方案4】:

    这将 100% 有效。

    scanf("%c",&class);

    【讨论】:

      【解决方案5】:

      最后一个scanf 必须包含&amp;

          scanf("%c",&class);
      

      &amp;是运算符的地址,在scanf中的变量名之前需要它。 scanf 需要指针参数,或者换句话说是指向变量的指针,而不是变量本身。

          if(enter=="\n");
      

      这里没有效果。改成

          if(enter=='\n')
          {...}
      

      【讨论】:

      • 我知道你想说什么,酷哥,但它可能会被误解。当然,scanf()(和朋友)接收数据的参数必须是指针。但这并不意味着您必须始终使用&amp; address of 运算符,因为传递声明为指针作为参数。
      • @PM2Ring ,是的!已编辑。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多