不返回字符串。此程序将数字(如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 forn<10
pleasestr1
的数字相等的字符串,它仍然是一个自动/局部变量,当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