Task

将数字转换为中文拼音.负符号等于"福".

key-value

#num:

0: ling
1: yi
2: er
3: san
4: si
5: wu
6: liu
7: qi
8: ba
9: jiu

Code

#include <stdio.h>

int main() {
    char ipt[100];
    char py[10][6] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};

    fgets(ipt, 100, stdin);

    int i = 0;
    if (ipt[0] == '-') {
        printf("%s ", "fu");
        i++;
    }

    for (i; i < strlen(ipt); i++) {
        if (i < strlen(ipt) - 1)
            printf("%s ", py[ipt[i] - '0']);
        else
            printf("%s", py[ipt[i] - '0']);
    }
    return 0;
}

Tested case

我输入了600,输出是"刘铃铃".我还测试过其他一些数字,看起来都不错,但判断网站说我错了.

推荐答案

您忽略了返回值fgets():

fgets(ipt, 100, stdin);

fgets()返回空指针以指示失败.此外,fgets()在输入中包括白线(如果有足够的空间).剥离它的最简单解决方案是:

ipt[strcspn(ipt, "\n")] = 0;

现在,您可以像原来一样重写strlen()个字节. 除了您不需要在每次迭代时调用strlen()两次.只需缓存值:

size_t ipt_len = strlen(ipt);

现在,代码变成:

for (i; i < ipt_len; i++) {
    if (i < ipt_len - 1)

但由于您已经在使用strlen(),因此您可以避免拨打strcspn()并执行以下操作:

size_t ipt_len = strlen(ipt); 

if (ipt_len > 0 && name[ipt_len - 1] == '\n') {
    name[--ipt_len] = '\0';
}

您还可以将呼叫简化为printf():

#if 0
if (i < ipt_len - 1) 
    printf("%s ", py[ipt[i] - '0']);
else
    printf("%s", py[ipt[i] - '0']);
#else
printf("%s%s", py[ipt[i] - '0'], i < ipt_len - 1 ? " " : "");
#endif

或者完全跳过空白.

然而,您未能验证输入是否实际上完全由数字和负号组成.至少必须进行一些基本的判断.

另请注意py的内部维度:

char py[10][6] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu"};

最多应该是5,而不是6,因为最长的字符串是"ling",大小为5.

或者您可以使用char *的数组:

static const char *const py[] = {"ling", "yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };

此外,最外面的维度是可选的并且可以省略,因为它可以由编译器自动确定.

C++相关问答推荐

使用sd-设备列举设备导致seg错误

如何启用ss(另一个调查套接字的实用程序)来查看Linux主机上加入的多播组IP地址?

ATTiny1606定时器TCA 0中断未触发

C++中矢量类型定义和数据保护的高效解决方案

文件权限为0666,但即使以超级用户身份也无法打开

使用错误的命令执行程序

为什么函数是按照定义的顺序执行的,而不是按照从avr-c中的int main()调用的顺序执行的?

在libwget中启用Cookie会导致分段故障

Caesar密码调试:输出文本末尾的问号和随机字符

为什么电路板被循环删除?

生成一个半RNG,结果用C表示(无随机/随机)

程序对大输入给出错误答案

try 判断长整数是否为素数

在Ubuntu上使用库部署C程序的最佳实践

如何编写postgresql支持函数

当读取可能会阻塞管道中的父进程时,为什么要等待子进程?

在我的第一个C语言中观察到的错误';你好世界';程序

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

'printf("%s", user_input)' 危险吗?

比 * 更快的乘法