我的 C 程序不断崩溃

Posted

技术标签:

【中文标题】我的 C 程序不断崩溃【英文标题】:my C program keep crashing 【发布时间】:2014-04-28 22:43:03 【问题描述】:

我有这个小程序,我需要用它在字母表中的位置替换我输入的任何字符串,因此 a = 01, b = 02, n = 14, 7 = 07... 例如,如果我输入 ab36c 作为输出我应该得到 01 02 03 06 03

当我在另一台计算机上编译它时一切正常,现在当我在我的电脑上运行它时程序崩溃,我仍然可以输入我的字符串,但是当我按 Enter 获取结果(输出)时,它显示 program.exe 有停止工作。这里有什么问题?

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
#include <stdlib.h>
#include <ctype.h>
//#define SIMBOLU_SKAITS 100

int main()    
    char text[200];
    char *s2;
    char simboli[36]='a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t',
                     'u','v','w','x','y','z','0','1','2','3','4','5','6','7','8','9';
    char morze[36][3]="01","02","03","04","05","06","07","08","09","10","11","12","13",
                 "14","15","16","17","18","19","20","21","22","23","24","25","26",
                 "00","01","02","03","04","05","06","07","08","09";
    int i, j, garums;

    gets(text);

    garums=strlen(text);

    for (i=0;i<=garums;i++) 
        for (j=0; j<=36;j++)
            if( text[i]==simboli[j])
                strcat(s2,morze[j]);
                strcat(s2," ");

            break;
            
    

    puts(s2);

    scanf("%c");

【问题讨论】:

你真的像这样格式化你的代码吗? 别忘了删除你的指针。这是一个很好的做法,也被推荐。不确定这是否可以解决您的问题,但您应该解决它。 @AlexBarac:他应该删除哪个指针??他没有在这个程序中分配任何东西(顺便说一句,这是他问题的根源之一。 @MichaelWalz 我没有注意到他没有进行任何分配。感谢您的评论,下次我会更仔细地阅读代码。 【参考方案1】:

你做了strcat(s2,morze[j]);s2从未被初始化,因此它最有可能指向无效内存,因此崩溃。

编辑:

... 和 scanf("%c") 也会崩溃,因为您没有提供参数。你需要:

char c ;
scanf("%c", &c) ;

EDIT2:

这是没有使用simbolimorze数组的版本:

char *outp = s2 ;
for (i = 0; i <= garums; i++)

  char c = text[i] ;    
  if (c >= 'a' && c <= 'z')
    outp += sprintf(outp, "%02d ", c - 'a' + 1) ;
  else if (c >= '0' && c <= '9')
    outp += sprintf(outp, "%02d ", c - '0') ;

EDIT3

总结一下:

char *s2 ; 替换为char s2[200]; 并将scanf("%c") ; 替换为scanf("%c", &amp;c) ;

【讨论】:

我是一个完全的菜鸟,我不知道你在说什么,你能详细解释一下,或者告诉我我需要准确修复什么 声明后需要初始化指针:在char* s2;s2=new char[/*insert constant value here*/];之后插入。在屏幕上输出最终字符串后,请始终删除指针:delete s2; @user3446665:顺便说一句,您的程序效率非常低且过于复杂。它可以在没有simbolimorze 数组的情况下完全完成。【参考方案2】:

这是最后的“scanf”。如果您在格式字符串中有一个条目,您必须将它与放置输入的变量配对。

这是因为任何具有可变参数数量的函数(如 scanf)都无法知道实际传递了多少参数。 “scanf”只是假设格式中的任何条目都对应一个参数。

在您的情况下,它会检测单个字符的条目。它使用“下一个参数”函数来获取下一个参数的地址。但是因为没有检查,所以它收到的地址是垃圾。因此,该字符被写入一个随机地址。

这可能会也可能不会导致立即崩溃,具体取决于对内存的监控程度(例如 32 位处理器与 64 位处理器)。但我想我不需要提醒你,用随机地址写是不好

用其他东西替换“scanf”或将值转储到虚拟(但真实!)变量中。 不要使用 NULL,那是行不通的

【讨论】:

以上是关于我的 C 程序不断崩溃的主要内容,如果未能解决你的问题,请参考以下文章

当我尝试从单链表中删除节点时,为啥我的 C 程序会崩溃

我的应用程序不断崩溃,但我不知道为啥

我的应用程序不断崩溃(致命异常)

解析facebook登录崩溃目标c

XCUITesting 不断使我的应用程序崩溃

Android:离线时我的应用程序不断崩溃