注册 登录
编程论坛 C语言论坛

数字转字符串

seahdiao 发布于 2020-11-12 18:26, 1948 次点击
为什么会一直出现乱码?还有如何让numStr直接指向funcVar,感谢大大。
只有本站会员才能查看附件,请 登录



程序代码:

#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)

char* numToStr(int num) {
    char* funcVar;
    int count = 1;
    int number = num;

    while (number / 10 != 0) {
        count++;
        number /= 10;
    }

    printf("count=%d\n", count);
    funcVar = malloc(sizeof(char)*count);
   
    for (int i = count-1; i >=0; i--) {
        funcVar[i] = (num % 10) + 48;
        num /= 10;
    }

    printf("funcVar  =%s\n", funcVar);
    printf("&funcVar =%x\n\n", &funcVar);
    return funcVar;
}


int main() {
    char* numStr=numToStr(12345678);
    printf("numStr   =%s\n", numStr);
    printf("&numStr  =%x\n",&numStr);
}
6 回复
#2
zbjzbj2020-11-12 20:33
malloc分配内存只有8个字节,而输出的时候printf("funcVar  =%s\n", funcVar);是按字符串格式输出的,在这8个字节中并没有读到字符串结束符\0,所以就一直往后读,直到读到\0为止,当然就附加了很多不必要的数据。其实内存已经越界了。
#include<stdio.h>
#include<stdlib.h>
#pragma warning (disable:4996)

char* numToStr(int num) {
    char* funcVar;
    int count = 1;
    int number = num;

    while (number / 10 != 0) {
        count++;
        number /= 10;
    }

    printf("count=%d\n", count);
    funcVar = malloc(sizeof(char)*+1);
   
    for (int i = count-1; i >=0; i--) {
        funcVar[i] = (num % 10) + 48;
        num /= 10;
    }
    funcVar[count]=0;
    printf("funcVar  =%s\n", funcVar);
    printf("&funcVar =%x\n\n", &funcVar);
    return funcVar;
}


int main() {
    char* numStr=numToStr(12345678);
    printf("numStr   =%s\n", numStr);
    printf("&numStr  =%x\n",&numStr);
}
#3
seahdiao2020-11-12 21:04
我也想过这个可能性,但是我用function[count]="\0"来解决lol,但是依旧乱码,原来是要用=0,感谢大大。顺便问下,能不能直接让numStr直接指向funcVar,而不是再分配新的空间给他。
#4
zbjzbj2020-11-12 22:11
funcVar[count]='\0';一样,注意不是 function[count]="\0"
你那另一问我没弄明白。
#5
rjsp2020-11-13 10:03
以下是引用seahdiao在2020-11-12 21:04:05的发言:

能不能直接让numStr直接指向funcVar,而不是再分配新的空间给他。


一般这么做:char* numToStr( int num, char out[static 22] ) 也就是通过 传入一个参数来接受数据。

以前也有人用 char* numToStr( int num ) { static char out[22]; …… ); 利用 static 的生存期

对于第二种情况,现在一般还得用 _Thread_local 修饰一下,也就是 _Thread_local static char out[22],避免多线程时互相搞乱。
#6
seahdiao2020-11-13 10:32
回复 5楼 rjsp
了解,感谢大大。
#7
PopToPush2020-11-14 18:44
itoa的实现:
char *fxcg_itoa(int num,char *str,int radix)
{  
    char index[]="0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    unsigned unum;
    int i=0,j,k;
    if(radix==10&&num<0)  
    {
        unum=(unsigned)-num;
        str[i++]='-';
    }
    else unum=(unsigned)num;
    do  
    {
        str[i++]=index[unum%(unsigned)radix];
        unum/=radix;
    }while(unum);
    str[i]='\0';
    if(str[0]=='-') k=1;
    else k=0;
    char temp;
    for(j=k;j<=(i-k-1)/2.0;j++)
    {
        temp=str[j];
        str[j]=str[i-j-1];
        str[i-j-1]=temp;
    }
    return str;
}
1