【发布时间】:2014-09-20 21:27:41
【问题描述】:
所以我一直在尝试用 c 编写这段代码,其基本思想是用户输入一个正整数,程序打印该数字中的数字,我已经递归地完成了,但事情是,当我编译它时,我没有收到任何错误,但输出只是一些垃圾,另一方面,我尝试过调试,所以我设置了一些断点,我一直得到很好的结果,调试时输出正确,与尝试编译完全相同的代码时不同 如果有人知道为什么会这样,将不胜感激
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *numToWord (int number){
char *newDigit = NULL;
switch(number){
case 0:
newDigit = malloc (5*sizeof(char));
sprintf(newDigit,"zero");
break;
case 1:
newDigit = malloc (4*sizeof(char));
sprintf(newDigit,"one");
break;
case 2:
newDigit = malloc (4*sizeof(char));
sprintf(newDigit,"two");
break;
case 3:
newDigit = malloc (6*sizeof(char));
sprintf(newDigit,"three");
break;
case 4:
newDigit = malloc (5*sizeof(char));
sprintf(newDigit,"four");
break;
case 5:
newDigit = malloc (5*sizeof(char));
sprintf(newDigit,"five");
break;
case 6:
newDigit = malloc (4*sizeof(char));
sprintf(newDigit,"six");
break;
case 7:
newDigit = malloc (6*sizeof(char));
sprintf(newDigit,"seven");
break;
case 8:
newDigit = malloc (6*sizeof(char));
sprintf(newDigit,"eight");
break;
case 9:
newDigit = malloc (5*sizeof(char));
sprintf(newDigit,"nine");
break;
}
return newDigit;
}
char * writeAbsolute (int number) {
char * word = NULL; // variable where the return value will be stored, must clean in main part
int digit;
digit = number % 10;
if (number){
number /= 10;
word = writeAbsolute (number);
char *newDigit = NULL;
char *newWord = NULL;
newDigit = numToWord(digit);
if (word){
int numOfLetters = (int)( strlen(newDigit)+strlen(word) );
newWord = (char*) malloc(numOfLetters * sizeof(char));
sprintf(newWord,"%s %s",word,newDigit);
word = newWord;
}
else{
word = newDigit;
}
free (newWord);
free (newDigit);
}
return word;
}
int main() {
int number;
char * word;
printf("Enter an integer:\n");
scanf("%d",&number);
word = writeAbsolute(number);
printf("%s",word);
return 0;
}
【问题讨论】:
-
首先,字符串以 NULL 结尾(与尾随空格不同)[检查您的大小]。
-
另外,必须链接到Do I cast the result of malloc
-
谢谢,我删除了那些不必要的 malloc 铸件并将这些“一”、“二”、“三”...更改为“一”、“二”、“三”...并修复了它们的大小分别(除了字符串的长度之外,我仍然必须分配额外的 sizeof(char) 内存,用于每个字符串末尾的 '\0',对吗?),但是作为那些无论如何,尾随空格只是为了打印格式,我没有改变,仍然得到一些垃圾输出
-
我正在写一个答案,但这与
strlen()的返回有关,它返回字符串中最多但不包括NULL 终止符的字符数。如果你愿意,你仍然可以用空格填充字符串,只要确保为 NULL 终止符留出足够的空间。 -
注意:我因为分心(饥饿的猫)而放弃了我的答案,并且抽签速度很慢。接受的答案还考虑到
sizeof(char)==1和您在word上对free()的调用。
标签: c debugging recursion compiler-errors