问题描述
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下
0: ling 1: yi 2: er 3: san 4: si 5: wu 6: liu 7: qi 8: ba 9: jiu
输入格式:
输入在一行中给出一个整数,如:1234。
提示:整数包括负数、零和正数。
输出格式:
在一行中输出这个整数对应的拼音,每个数字的拼音之间用空格分开,行末没有最后的空格。如
yi er san si。
输入样例:
-600
输出样例:
fu liu ling ling
错误代码:
//#include <iostream>
#include <stdio.h>
//using namespace std;
#define Max 10000
int main()
{
char input[Max];
gets(input);
for(int i=0;input[i]!='\0';i++)
{
if(input[0]=='-')
{
printf("fu");
continue;
}
switch(input[i])
{
case '0':printf("ling");
break;
case '1':printf("yi");
break;
case '2':printf("er");
break;
case '3':printf("san");
break;
case '4':printf("si");
break;
case '5':printf("wu");
break;
case '6':printf("liu");
break;
case '7':printf("qi");
break;
case '8':printf("ba");
break;
case '9':printf("jiu");
break;
default:
break;
}
}
}
问题分析
- 这是还未完成的代码,代码中还未写空格问题。
- 在循环的判断条件中,判断条件是永真的,所以应该把0改为i
- 这条代码刚刚执行第一条语句就会报错:
Program received signal SIGSEGV, Segmentation fault
PTA上也提示段错误
查阅了网上资料说是数组内存分配过大导致的段错误,但不知道为什么用malloc就可以…
再次查阅了资料,malloc根据系统能够分配的内存不同,大多是分配2G内存,那么我声明的Max大小在它这里根本不算什么
根据以上问题修正了代码
正确代码如下
//#include <iostream>
#include <stdio.h>
//using namespace std;
#define Max 100000000
int main()
{
char* input = (char*)malloc(sizeof(char)*Max);
gets(input);
for(int i=0;input[i]!='\0';i++)
{
if(input[i]=='-')
{
printf("fu ");
continue;
}
switch(input[i])
{
case '0':printf("ling");
break;
case '1':printf("yi");
break;
case '2':printf("er");
break;
case '3':printf("san");
break;
case '4':printf("si");
break;
case '5':printf("wu");
break;
case '6':printf("liu");
break;
case '7':printf("qi");
break;
case '8':printf("ba");
break;
case '9':printf("jiu");
break;
default:
break;
}
if(input[i+1]=='\0')
{
continue;
}
else{
printf(" ");
}
}
}
总结:
- 声明数组如果需要很大内存空间最好用malloc函数
- 循环判断中不要用常量判断
参考资料: