我有这个小程序,我需要用字母表中的地方替换我输入的任何字符串,所以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");
}
答案 0 :(得分:5)
你做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') ;
}
<强> EDIT3 强>
总结:
将char *s2 ;
替换为char s2[200];
并将scanf("%c") ;
替换为scanf("%c", &c) ;
答案 1 :(得分:1)
它是最终的&#34; scanf&#34;。如果格式字符串中有条目,则必须将其与要放置输入的变量配对。
这是因为任何具有可变数量参数的函数(如scanf)无法知道实际传递了多少参数。 &#34; scanf的&#34;简单地假设格式中的任何条目都对应于参数。
在您的情况下,它会检测单个字符的条目。它使用&#34;下一个参数&#34;函数获取下一个参数的地址。但由于没有检查,它收到的地址是垃圾。因此,该字符被写入随机地址。
根据内存的监控程度(例如32位处理器与64位处理器),这可能会也可能不会立即导致崩溃。但我不认为我需要提醒您,随机地址写入不好。
替换&#34; scanf&#34;使用其他东西或将值转储到虚拟(但真实!)变量中。 不要使用NULL,这不会起作用。