OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 4806|回复: 8

如何使用sprintf追加字符串?

[复制链接]

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2017-11-16
在线时间
159 小时
发表于 2019-4-4 16:34:23 | 显示全部楼层 |阅读模式
20金钱
本帖最后由 vegetablebird 于 2019-4-4 16:43 编辑

想在循环中使用sprintf追加字符串,但是每次只显示最后一次的结果。网上查了一下,sprintf每次都会在结尾加上'\0',导致覆盖前一次的内容。现在需要遍历SD卡一个文件夹内所以文件名,并追加到一个字符串,而不是每查一个文件名就发送一次,请问应该怎么做?
[mw_shl_code=c,true]u8 mf_scan_files(u8 * path)
{        
        FRESULT res;
                char *p;
    char *fn;   /* This function is assuming non-Unicode cfg. */
                char *fnn;
#if _USE_LFN
         fileinfo.lfsize = _MAX_LFN * 2 + 1;
        fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
#endif                  

    res = f_opendir(&dir,(const TCHAR*)path); //′ò¿aò»¸öĿ¼
    if (res == FR_OK)
        {        
                while(1)
                {
                res = f_readdir(&dir, &fileinfo);                   //¶áè¡Ä¿Â¼ÏÂμÄò»¸öÎļt
                if (res != FR_OK || fileinfo.fname[0] == 0) break;  //′íÎóáË/μ½Ä©Î2áË,íË3ö
                //if (fileinfo.fname[0] == '.') continue;             //oöÂÔéϼ¶Ä¿Â¼
#if _USE_LFN
                fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
#else                                                           
                fn = fileinfo.fname;
#endif                                                      /* It is a file. */
                        printf("%s/", path);//′òó¡Â·¾¶        
                        printf("%s\r\n",fn);//′òó¡ÎļtÃû                 
                        p=mymalloc(SRAMIN,32);                                                        //éêÇë32×Ö½úÄú′æ
                        sprintf((char*)p,"%s",fn);
                        u3_printf(fn);
                }
               
  }         
        
        myfree(SRAMIN,fileinfo.lfname);
        myfree(SRAMIN,p);
    return res;         
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

sprintf 里面的buf每次偏移自身长度不就可以了,最好每个文件名加个非\0分割 ,后期不然处理也麻烦 sprintf((char*)(p+strlen(p)),"%s\r\n",fn); 记得申请p后,*p=0;防止第一次strlen(p)有问题
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-4 16:34:24 | 显示全部楼层
本帖最后由 nashui_sx 于 2019-4-4 20:43 编辑

sprintf 里面的buf每次偏移自身长度不就可以了,最好每个文件名加个非\0分割 ,后期不然处理也麻烦

sprintf((char*)(p+strlen(p)),"%s\r\n",fn);
记得申请p后,*p=0;防止第一次strlen(p)有问题

回复

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2017-11-16
在线时间
159 小时
 楼主| 发表于 2019-4-4 21:19:29 | 显示全部楼层
nashui_sx 发表于 2019-4-4 20:41
sprintf 里面的buf每次偏移自身长度不就可以了,最好每个文件名加个非\0分割 ,后期不然处理也麻烦

spri ...

1111.jpg 改完之后还是不行,只显示最后一首歌的名字。
11.jpg



回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-4 21:20:54 | 显示全部楼层
vegetablebird 发表于 2019-4-4 21:19
改完之后还是不行,只显示最后一首歌的名字。

申请p不放在循环外面?还只申请32?
回复

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2017-11-16
在线时间
159 小时
 楼主| 发表于 2019-4-4 21:28:06 | 显示全部楼层
nashui_sx 发表于 2019-4-4 21:20
申请p不放在循环外面?还只申请32?

可以了,非常感谢!太粗心了,只忙着拷贝过来没有注意好
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-4 21:36:27 | 显示全部楼层
vegetablebird 发表于 2019-4-4 21:28
可以了,非常感谢!太粗心了,只忙着拷贝过来没有注意好

记得申请p后,*p=0;防止第一次strlen(p)有问题
还有这也只是应你的需求的办法,要用还是数组存吧,这样拼接的处理也麻烦,还不如数组呢
回复

使用道具 举报

4

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
381
金钱
381
注册时间
2017-11-16
在线时间
159 小时
 楼主| 发表于 2019-4-4 21:52:00 | 显示全部楼层
nashui_sx 发表于 2019-4-4 21:36
记得申请p后,*p=0;防止第一次strlen(p)有问题
还有这也只是应你的需求的办法,要用还是数组存吧,这样 ...

第一个p我赋了一个标志位,方便我同学在服务器那边接收。然后每个文件都是MP3文件所以到mp3后缀作为分隔就行。那请问数组该如何存
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2019-4-5 09:27:28 | 显示全部楼层
vegetablebird 发表于 2019-4-4 21:52
第一个p我赋了一个标志位,方便我同学在服务器那边接收。然后每个文件都是MP3文件所以到mp3后缀作为分隔 ...

既然发服务器这样就可以 了
回复

使用道具 举报

0

主题

9

帖子

0

精华

初级会员

Rank: 2

积分
89
金钱
89
注册时间
2019-7-6
在线时间
24 小时
发表于 2020-4-13 23:10:12 | 显示全部楼层
nashui_sx 发表于 2019-4-4 21:36
记得申请p后,*p=0;防止第一次strlen(p)有问题
还有这也只是应你的需求的办法,要用还是数组存吧,这样 ...

请问一下,*p=0; 是什么意思?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 05:34

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表