不返回字符串。此程序将数字(如123)转换为单词(如;“一二三”;,为什么最后我什么也得不到? #包括 #包括 字符*整数到字符串(整数n); void main() { int n; printf(“输入数字:”); scanf(“%d”和“&n”); printf(“\n%d字为:%s.\n”,n,int_to_字符串(n)); } 字符*整数到字符串(整数n) { 字符str[100]=“”; 如果(n

不返回字符串。此程序将数字(如123)转换为单词(如;“一二三”;,为什么最后我什么也得不到? #包括 #包括 字符*整数到字符串(整数n); void main() { int n; printf(“输入数字:”); scanf(“%d”和“&n”); printf(“\n%d字为:%s.\n”,n,int_to_字符串(n)); } 字符*整数到字符串(整数n) { 字符str[100]=“”; 如果(n,c,function,recursion,strcat,C,Function,Recursion,Strcat,函数具有未定义的行为 它返回一个指向本地数组str的指针,该数组在退出函数后通常会被销毁 考虑到最好将参数定义为具有类型unsigned int。否则函数需要检查数字是否为负数 您可以通过声明第二个参数来简化任务,该参数将指定一个以零字符结尾的数组,该数组将存储结果字符串 或者您必须动态分配内存 这里展示了这两种方法 #include<stdio.h> #include<string.h> char *int_to_string( int n ); void main

函数具有未定义的行为

它返回一个指向本地数组
str
的指针,该数组在退出函数后通常会被销毁

考虑到最好将参数定义为具有类型
unsigned int
。否则函数需要检查数字是否为负数

您可以通过声明第二个参数来简化任务,该参数将指定一个以零字符结尾的数组,该数组将存储结果字符串

或者您必须动态分配内存

这里展示了这两种方法

#include<stdio.h>
#include<string.h>

char *int_to_string( int n );

void main()
{
    int n;

    printf("Enter the number : ");
    scanf("%d",&n);

    printf("\n%d in words is : %s.\n",n,int_to_string(n));
}

char *int_to_string( int n)
{
    char str[100]="";

    if(n<10)
    {
          switch(n)
        {
            case 0: return "Zero";
            case 1: return "One";
            case 2: return "Two";
            case 3: return "Three";
            case 4: return "Four";
            case 5: return "Five";
            case 6: return "Six";
            case 7: return "Seven";
            case 8: return "Eight";
            case 9: return "Nine";
        }
    }

    else
    {
        strcat(str,int_to_string(n/10));
        strcat(str," ");

        return strcat(str,int_to_string(n%10));
    }
}

请在发送最后一个字符串之前使用字符串副本。在代码中添加最后两行,这样就可以了

One Two Three Four Five Six Seven Eight Nine Zero
One Two Three Four Five Six Seven Eight Nine Zero
(一)

在你的函数中,
str
作为堆栈上的一个自动变量,在
int\u-to-u字符串
返回后被销毁。但是你需要
str
来激活更多的
int\u-to-u字符串
调用!因此你必须在调用之间保留
str

(二)

上面的代码在递归调用中无法正常工作,必须在
str
string中添加单词“Zero”

case 0: return "Zero";
....
但是为什么递归调用会有问题呢?递归可以用一个简单的循环来代替。两种解决方案都显示了出来

     case 0: strcat(str,"Zero"); return str;

仅供参考,您的程序调用未定义的行为。
str[]
一旦
int\u to\u string
返回,就不再存在。或者,您知道,递归的基本情况(n<10)不会返回任何内容,因此如果它到达“底部”它不会返回任何内容。即使修复了局部变量问题,您的递归在逻辑上也是可疑的,不会按预期工作。它返回一个与nVlad for
n<10
please
str1
的数字相等的字符串,它仍然是一个自动/局部变量,当
int\u_string
返回。@user3078414谢谢!我知道。重点是保留
str
。我没有调试函数的逻辑。就我个人而言,我会使用一个简单的循环。我根本不会使用递归,但这不是重点-没有人关心“你知道它”,或者原始代码是否必须“调试逻辑”。如果你能给出一个简单、清晰、通用的答案,尽可能多地保留有意义的原始代码,那就做吧。否则,在发布答案之前,请三思而后行,IMHO。@user3078414抱歉,我无法调试此程序的逻辑。我指出了自动变量的问题。我提出了替代解决方案。这就是我所能做的ATM。我很欣赏你的观点。谢谢你的意见。@user3078414仅供参考。我还介绍了使用工作递归的解决方案。
case 0: return "Zero";
....
     case 0: strcat(str,"Zero"); return str;
#include <stdio.h>
#include <stdlib.h> 
#include <ctype.h>
#include <string.h>
#include <math.h>

void print_digit(int digit)
{
    switch(digit)
    {
        case '0': printf("Zero "); break;
        case '1': printf("One ");  break;
        case '2': printf("Two ");  break;
        case '3': printf("Three ");break;
        case '4': printf("Four "); break;
        case '5': printf("Five "); break;
        case '6': printf("Six ");  break;
        case '7': printf("Seven ");break;
        case '8': printf("Eight ");break;
        case '9': printf("Nine "); break;
   }
}

char * return_digit_word(int digit)
{
    switch(digit)
    {
        case '0': return("Zero "); break;
        case '1': return("One ");  break;
        case '2': return("Two ");  break;
        case '3': return("Three ");break;
        case '4': return("Four "); break;
        case '5': return("Five "); break;
        case '6': return("Six ");  break;
        case '7': return("Seven ");break;
        case '8': return("Eight ");break;
        case '9': return("Nine "); break;
   }
}

char *int_to_string(int n,char str[],char numStr[]) 
{
     if(n<10)
     {
        switch(n)
        {
            case 0: strcat(str,"Zero");break;
            case 1: strcat(str,"One");break;
            case 2: strcat(str,"Two");break;
            case 3: strcat(str,"Three");break;
            case 4: strcat(str,"Four");break;
            case 5: strcat(str,"Five");break;
            case 6: strcat(str,"Six");break;
            case 7: strcat(str,"Seven");break;
            case 8: strcat(str,"Eight");break;
            case 9: strcat(str,"Nine");break;
        }
        return str;
    }
    else{
        int digit = numStr[0]-'0';
        int newNr =  n - digit*pow(10,strlen(numStr)-1);        

        strcat(str, return_digit_word(numStr[0]));
        sprintf(numStr, "%d", newNr); 

        return int_to_string(newNr,str,numStr);
    }
} 


int main(void) {
    int n,i;
    char str[100]="";
    char numStr[100]="";

    n = 1234567890;

    sprintf(numStr, "%d", n);
    printf("\n%d in words is : %s\n",n, int_to_string(n,str,numStr) );

    printf("\n%d in words is : ",n);
    sprintf(numStr, "%d", n);
    for(i=0;i<strlen(numStr);i++)
    {
       print_digit(numStr[i]);
    }

   return 0;
}
1234567890 in words is : One Two Three Four Five Six Seven Eight Nine Zero

1234567890 in words is : One Two Three Four Five Six Seven Eight Nine Zero