You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何存储convertToWords函数返回值并统计数字单词的字母数

问题与解决方案

我有一段能将数字转换为英文单词形式的C语言代码(例如输入100,输出one hundred),现在需要统计该单词形式的字母数量,但尝试把convertToWords函数的返回值存入数组作为后续统计代码的输入时无法成功。请提供可行解决方法,也可建议合并两段代码的方案,要求输入100时输出字母数10。


原数字转单词代码

#include<string.h>
#include<stdio.h>
#define BUF_SIZE 20
// 索引0未使用,方便数组索引对应数字
char* one[] = { "", "one ", "two ", "three ", "four ",
                "five ", "six ", "seven ", "eight ",
                "nine ", "ten ", "eleven ", "twelve ",
                "thirteen ", "fourteen ", "fifteen ",
                "sixteen ", "seventeen ", "eighteen ",
                "nineteen "
              };
// 索引0和1未使用,方便数组索引对应数字
char* ten[] = { "", "", "twenty ", "thirty ", "forty ",
                "fifty ", "sixty ", "seventy ", "eighty ",
                "ninety "
              };
char * numToWords(int n, char* s, char *str, int len)
{
    memset(str,0,len);
    // 数字大于19时拆分处理
    if (n > 19)
    {
        strcat(str,ten[n / 10]);
        strcat(str,one[n % 10]);
    }
    else
    {
        strcat(str,one[n]);
    }
    // 非零数字后添加单位词
    if (n)
    {
        strcat(str,s);
    }
    return str;
}
// 将数字转换为英文单词的函数
char* convertToWords(long n, char *out)
{
    char str[BUF_SIZE] = {0};
    // 处理千万和亿位(如果有)
    strcat(out, numToWords((n / 10000000), "million ",str,BUF_SIZE));
    // 处理十万和百万位(如果有)
    strcat(out, numToWords(((n / 100000) % 100), "hundred thousand ",str,BUF_SIZE));
    // 处理千和万位(如果有)
    strcat(out, numToWords(((n / 1000) % 100), "thousand ",str,BUF_SIZE));
    // 处理百位(如果有)
    strcat(out, numToWords(((n / 100) % 10), "hundred ",str,BUF_SIZE));
    // 处理个位和十位(如果有)
    strcat(out, numToWords((n % 100), "",str,BUF_SIZE));
    return out;
}
int main()
{
    // 获取用户输入的数字
    long num;
    char str[60] = {0};
    char s[10000];
    
    printf("Enter any number: ");
    scanf("%ld", &num);
    printf( "%s",convertToWords(num,str));
    
   
    return 0;
}

原字母统计代码

#include<stdio.h>
int main()
{
    // 变量声明
    char word[100];
    int a;
    int counting=0;
    int wordcountig=0;
    
    // 输入单词
    printf("Enter word to count the number of characters\n");
    // 读取用户输入的单词
    gets(word);
    
    // 统计总字符数
    for(a=0; word[a]!='\0'; a++)
    {
        counting++;
    }
    // 统计空格数量
    for(a=0; a<counting; a++)
    {
        if(word[a]==32)
            wordcountig++;
    }
    
    // 输出字母数量(总字符数减去空格数)
    wordcountig = counting-wordcountig;
    printf("\n\n The number of characters in entered word are : %d", wordcountig);
  
    return 0;
}

合并后的完整解决方案代码

#include<string.h>
#include<stdio.h>
#define BUF_SIZE 20
// 索引0未使用,方便数组索引对应数字
char* one[] = { "", "one ", "two ", "three ", "four ",
                "five ", "six ", "seven ", "eight ",
                "nine ", "ten ", "eleven ", "twelve ",
                "thirteen ", "fourteen ", "fifteen ",
                "sixteen ", "seventeen ", "eighteen ",
                "nineteen "
              };
// 索引0和1未使用,方便数组索引对应数字
char* ten[] = { "", "", "twenty ", "thirty ", "forty ",
                "fifty ", "sixty ", "seventy ", "eighty ",
                "ninety "
              };

char * numToWords(int n, char* s, char *str, int len)
{
    memset(str,0,len);
    if (n > 19)
    {
        strcat(str,ten[n / 10]);
        strcat(str,one[n % 10]);
    }
    else
    {
        strcat(str,one[n]);
    }
    if (n)
    {
        strcat(str,s);
    }
    return str;
}

char* convertToWords(long n, char *out)
{
    char str[BUF_SIZE] = {0};
    strcat(out, numToWords((n / 10000000), "million ",str,BUF_SIZE));
    strcat(out, numToWords(((n / 100000) % 100), "hundred thousand ",str,BUF_SIZE));
    strcat(out, numToWords(((n / 1000) % 100), "thousand ",str,BUF_SIZE));
    strcat(out, numToWords(((n / 100) % 10), "hundred ",str,BUF_SIZE));
    strcat(out, numToWords((n % 100), "",str,BUF_SIZE));
    return out;
}

// 统计字母数量的函数(排除空格)
int countLetters(char *str) {
    int total = 0;
    while (*str != '\0') {
        if (*str != ' ') {
            total++;
        }
        str++;
    }
    return total;
}

int main()
{
    long num;
    char result[60] = {0};
    
    printf("Enter any number: ");
    scanf("%ld", &num);
    
    // 转换为英文单词
    convertToWords(num, result);
    printf("英文单词形式:%s\n", result);
    
    // 统计字母数量
    int letterCount = countLetters(result);
    printf("字母数量:%d\n", letterCount);
    
    return 0;
}

关键修改说明

  1. 合并代码逻辑:把字母统计逻辑封装成countLetters函数,直接复用数字转换后的结果数组result,无需额外传递或存储。
  2. 替换不安全的gets:原统计代码的gets函数存在缓冲区溢出风险,合并后直接使用转换得到的字符串,避免了输入读取问题。
  3. 简化统计逻辑:用单循环遍历字符串,遇到非空格字符就计数,比原代码的两次循环更高效简洁。

验证结果

输入100时,程序输出:

Enter any number: 100
英文单词形式:one hundred 
字母数量:10

完全符合需求(one有3个字母,hundred有7个字母,总计10个)。


内容的提问来源于stack exchange,提问作者edmung vunxh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 20:55:50