Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我的C程序不断崩溃_C_Crash - Fatal编程技术网

我的C程序不断崩溃

我的C程序不断崩溃,c,crash,C,Crash,我有一个小程序,我需要用它在字母表中的位置替换我输入的任何字符串,所以a=01,b=02,n=14,7=07。。。例如,如果我输入ab36c作为输出,我应该得到01 02 03 当我在另一台计算机上编译时,一切正常,现在当我在pc上运行时,程序崩溃,我仍然可以输入字符串,但当我按enter键获取结果(输出)时,它显示program.exe已停止工作。这里怎么了 #include <stdio.h> #include <conio.h> #include <strin

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

当我在另一台计算机上编译时,一切正常,现在当我在pc上运行时,程序崩溃,我仍然可以输入字符串,但当我按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");
}
#包括
#包括
#包括
#包括
#包括
#包括
//#定义SIMBOLU_SKAITS 100
int main(){
字符文本[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;
获取(文本);
garums=strlen(文本);
对于(i=0;i您确实
strcat(s2,morze[j]);
但是
s2
从未初始化过,因此它最有可能指向无效内存,从而导致崩溃

编辑:

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

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

这是不使用
simboli
morze
数组的版本:

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') ;
}
char*outp=s2;
对于(i=0;i='a'&&c='0'&&c而言,它是最后一个“scanf”。如果格式字符串中有一个条目,则必须将其与用于输入的变量配对

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

在您的例子中,它检测单个字符的条目。它使用“next parameter”函数获取下一个参数的地址。但由于没有检查,它接收的地址是垃圾。因此,该字符被写入随机地址

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


将“scanf”替换为其他内容,或将值转储到虚拟对象中(但为真实!)变量。不要使用NULL,这样不行。

你真的要这样格式化你的代码吗?别忘了删除指针。这是一种很好的做法,也是推荐的。不确定这是否是问题的解决方案,但你应该修复它。@AlexBarac:他应该删除哪个指针?他在这个程序中不分配任何东西(顺便说一句,这是他问题的根源之一。@MichaelWalz我没有注意到他没有做任何分配。谢谢你的评论,我下次会更仔细地阅读代码。我完全不知道这一点,我不知道你在说什么。你能详细解释一下,或者告诉我需要修复什么吗声明后的ur指针:在
char*s2;
之后插入,
s2=new char[/*在此处插入常量值*/]
。在屏幕上输出最后一个字符串后,请始终删除指针:
delete s2;
@user3446665:顺便说一句,您的程序效率很低且过于复杂。完全可以不用
simboli
morze
数组来完成。