【问题标题】:Runtime Error -SIGABRT运行时错误 -SIGABRT
【发布时间】:2017-11-12 09:26:18
【问题描述】:
#toggle the string 

#include <stdio.h>
int main()
{
   char S[100],ch;
   int i=0;
   gets(S);
   while((S[i]!='\0')&&(i<100))
   {
       ch=S[i];
       if((ch>='A')&&(ch<='Z'))
           S[i]+=32;
       else if((ch>='a')&&(ch<='z'))
           S[i]-=32;
       i++;
   }
   printf("%s\n",S);
   return 0;
}

请让我知道代码有什么问题(代码是将字符串,即大写转换为小写,反之亦然。我收到 SIGABRT 运行时错误...

【问题讨论】:

  • 不要使用gets();它不能安全使用。
  • gets 假设 S 的长度是无限的。如果您的输入无法存储在 S 中(即大于 100 个字符),您将被中止。
  • 什么输入触发 SIGABRT?
  • gets(S); ==> fgets(S, sizeof S, stdin);
  • 旁白:你真的应该检查i&lt;100 之前使用它来索引S[100]。切换它们你会得到while((i&lt;100)&amp;&amp;(S[i]!='\0')),短路规则会阻止你索引S越界。

标签: c runtime-error


【解决方案1】:

以下建议代码:

  1. 干净编译
  2. 记录包含每个头文件的原因
  3. 即使在非 ASCII 字符集(如 EBCDIC)上也能正常工作
  4. 消除不需要的变量
  5. 使用有效的函数调用:fgets() 从标准输入读取
  6. 要退出此程序,请输入:Ctrl+c 或(取决于操作系统)Ctrl+dCtrl+z

现在是代码:

#include <stdio.h>  // fgets(), printf()
#include <ctype.h>  // toupper(), tolower(), isupper(), islower()

int main( void )
{
   char S[100];

   //gets(S);
   if( fgets( S, sizeof( S ), stdin ) )
   {
       for( size_t i=0; S[i]; i++ )
       {
           if( isupper( S[i]) )
               S[i] = (char)tolower( S[i] );

           else if( islower( S[i] ) )
               S[i] = (char)toupper( S[i] );
       }

       printf("%s\n",S);
   }

   return 0;
} // end function: main

【讨论】:

  • 在你的回答中,我不想知道你的代码是做什么的。相反,在回答时,为什么不花一点力气解释他提出问题的 OP 代码中出了什么问题。只有当 OP 已经了解他的逻辑缺陷在哪里时,“在这里,看我的代码”的答案才有用。否则,很多时候,你只会得到一个“好的,我会按照你的方式做”,并且没有任何学习发生。为什么您的代码适用于非 ASCII?为什么要继续大写S?为什么fgets 有效而gets 无效? (它什么时候被删除的?)多一点努力会有帮助。
  • @DavidC.Rankin,实际上,我很难说明“为什么”某些发布的代码不起作用。特别是如果我不确定我能否清楚地解释原因。因此,我经常发现提供一个(一种方式)对问题进行编码的示例更直接。我通常说我的代码是“提议的”,因为它只是一种可以完成的方式,而不是唯一的方式。此外,如果我讨论 OP 代码“错误”的每一个细节,我觉得 OP 可能会气馁。 (其中一些“错误”项目实际上可能只是我对糟糕的编码实践等的看法)
猜你喜欢
  • 2015-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2016-12-05
  • 1970-01-01
  • 2013-06-05
相关资源
最近更新 更多