0

我正在自己练习 c 编程,并被要求编写一个整数到字符串的函数。我的代码如下。

在我尝试在主函数中打印出函数返回之前,一切都是正确的。正如“自动”在 Visual Studio 中向我展示的那样,我有正确的返回值,但它在 printf 函数中搞砸了。有什么建议吗?谢谢。

#include <stdio.h>

char* itob(int n, char s[100], int b);
char reverse(char s[100],char i);
int main(void)
{
    int n,b,c=0;
    char* str;
    char s[100];
    ...

    str=itob(n,s,b);
    printf("%s",str);   //wrong
    main();
}

char* itob(int n, char s[100], int b)
{
int i=100,c,firstdig,a;
char str[100];
if(b==8)
    printf("0");
else if(b==16)
    printf("0x");

do
{
    c=n%b;
    if(c>9)
            s[i--]=c-10+'A';
        else 
            s[i--]=c+'0';
} while((n/=b)>0);
a=0;
c=i+1;
while(c!=101)
    {
        str[a]=s[c];
        a++;
        c++;
    }
str[a]='\0';    
return str;

}

4

2 回答 2

1

itob如果没有完整的函数,至少是 的定义,很难回答str,因为它可能引用堆栈上的变量,而不是堆,所以当函数itob()返回时,对该内存的引用会丢失。

于 2013-06-24T14:46:24.503 回答
0

在尝试保留您的编码风格的同时,以下是一个候选解决方案。您需要颠倒sstr中的角色itob。'str' 是你的工作缓冲区,'s' 是传入和返回的目标。还要初始化i为 99,而不是 100 以保持在str.

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

char* itob(int n, char s[100], int b);
char reverse(char s[100], char i);

int main(void) {
  int n;
  int b;
  //  int c = 0;
  char* str;
  char s[100];
  //    ...
  b = 8;
  n = 1234;
  str = itob(n, s, b);
  printf("%s\n", str);   //wrong
  b = 16;
  str = itob(n, s, b);
  printf("%s\n", str);   //wrong
  // main();
}


char* itob(int n, char s[100], int b)
{
int i=100-1,c/*,firstdig*/,a;
char str[100];
if(b==8)
    printf("0");
else if(b==16)
    printf("0x");

do
{
    c=n%b;
    if(c>9)
            str[i--]=c-10+'A';
        else
            str[i--]=c+'0';
} while((n/=b)>0);
a=0;
c=i+1;
while(c!=(101-1))
    {
        s[a]=str[c];
        a++;
        c++;
    }
s[a]='\0';
return s;
}
于 2013-06-25T03:16:31.990 回答