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