7-25 念数字 (15分)

问题描述
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出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;
        }
    }
}

问题分析

  1. 这是还未完成的代码,代码中还未写空格问题。
  2. 在循环的判断条件中,判断条件是永真的,所以应该把0改为i
  3. 这条代码刚刚执行第一条语句就会报错:
    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(" ");
        }
    }
}

总结:

  1. 声明数组如果需要很大内存空间最好用malloc函数
  2. 循环判断中不要用常量判断

参考资料:

  1. malloc
  2. 段错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值