| 网站首页 | 业界新闻 | 小组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 344 人关注过本帖
标题:数字转字符串
只看楼主 加入收藏
seahdiao
Rank: 1
来 自:马来西亚
等 级:新手上路
帖 子:18
专家分:0
注 册:2020-3-19
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
数字转字符串
为什么会一直出现乱码?还有如何让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);
}
搜索更多相关主题的帖子: num char count int printf 
2020-11-12 18:26
zbjzbj
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:45
帖 子:579
专家分:2837
注 册:2011-4-22
收藏
得分:20 
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);
}
2020-11-12 20:33
seahdiao
Rank: 1
来 自:马来西亚
等 级:新手上路
帖 子:18
专家分:0
注 册:2020-3-19
收藏
得分:0 
我也想过这个可能性,但是我用function[count]="\0"来解决lol,但是依旧乱码,原来是要用=0,感谢大大。顺便问下,能不能直接让numStr直接指向funcVar,而不是再分配新的空间给他。
2020-11-12 21:04
zbjzbj
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:45
帖 子:579
专家分:2837
注 册:2011-4-22
收藏
得分:0 
funcVar[count]='\0';一样,注意不是 function[count]="\0"
你那另一问我没弄明白。
2020-11-12 22:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:393
帖 子:7804
专家分:45677
注 册:2011-1-18
收藏
得分:0 
以下是引用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],避免多线程时互相搞乱。
2020-11-13 10:03
seahdiao
Rank: 1
来 自:马来西亚
等 级:新手上路
帖 子:18
专家分:0
注 册:2020-3-19
收藏
得分:0 
回复 5楼 rjsp
了解,感谢大大。
2020-11-13 10:32
PopToPush
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2020-11-14
收藏
得分:0 
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;
}
2020-11-14 18:44
快速回复:数字转字符串
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.114332 second(s), 10 queries.
Copyright©2004-2021, BCCN.NET, All Rights Reserved