字符串 不能memset

#include<stdio.h>
char *str1={"Report_A0001.txt"};
char *str2={"Report_A0002.txt"};
int main()
{
if(str2>str1) printf("%s\n","str1>str2" );

if(str2-str1) printf("%s\n","str1-str2" );
}

都可输出,说明str是可以比较,可以相减的。

上面是抽象的一个逻辑,下面看看具体情况的问题,有点儿意思哦

u8 mf_scan_files_ext(u8 * path,u8 func,char *name,char *Targetname)
{
  FRESULT res;
  u8 ack;	
  char * location=0; 
  char * target=0; 	
 	
  FILINFO fileinfo;		
  char *fn;   
  fileinfo.lfsize = _MAX_LFN * 2 + 1;
  fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
  res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
  if (res == FR_OK) 
	{	
		printf("%s dir opened \r\n",(char*)path); //打开成功
		while(ack!=100)
		{
			res = f_readdir(&dir, &fileinfo);  //关键函数 他会依次扫描文件夹下面的文件//读取目录下的一个文件
			if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
			if (fileinfo.fname[0] == '.') continue;             //忽略上级目录
			fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
	                switch(func)                                          
			{
				case 0://扫描以后输出 (原始功能)
					printf("%s/", path);//打印路径	
					printf("%s\r\n", fn);//打印文件名	
					  break;
				case 1://查找有没有(精确匹配 一旦找到立即返回)
					if(memcmp(fn,name,strlen(name))==0)
					ack=100;//存在的!找到了
					  break;
				case 2://查找没有系列的(有 继续找 找一个名字最长的)
					location= strstr(fn,name);
					printf("1%s===%s===%s\n",target,location,fn);
					if(location>target)
					{
						ack=200;
						target=location;
						strcpy(Targetname,target);
						printf("2%s===%s===%s\n",target,location,fn);
					}
					break;
				default:
					break;				
					}	  
	myfree(SRAMIN,fileinfo.lfname);
        return ack;	  
	}
}

我对文件夹扫描函数做了升级,我希望去逐个扫描文件获得其名称,主要是2找到文件名最大的

第一轮:

1===Report_A0001.txt===Report_A0001.txt

2Report_A0001.txt===Report_A0001.txt===Report_A0001.txt

看到目标是空的 而名字已经读到了,我就是希望临时保存一下,下次有更大的就更新名字。

但是第二轮就出事了。

1Report_A0002.txt===Report_A0002.txt===Report_A0002.txt

你看到那个临时的target也变化了!所以if(location>target)进不去了!!这就类似C++的深拷贝浅拷贝了!!

char  target[10]={0}; 

strcpy(target,location);

修改如上两处可以解决问题。


两种优化技术

其一 参考二级指针来操作数组赋值,为什么我们是strcpy(target,location);而不是= 因为我们没有用二级指针

太复杂放弃 因为递增的逻辑


其二,可以不要这个变量了,本来就是数组来的

//1--查找有没有跟name完全一样的文件 有立即跳出返回100 
//2--查找有没有name系列的文件,有的话扫描完毕,返回200,结果Targetname赋成
u8 mf_scan_files_ext(u8 * path,u8 func,char *name,char *Targetname)
{
	FRESULT res;
  u8 ack;	
  char * location=0; 	
  //FILINFO fileinfo;	//文件信息	
  char *fn;   
 	fileinfo.lfsize = _MAX_LFN * 2 + 1;
	fileinfo.lfname = mymalloc(SRAMIN,fileinfo.lfsize);
//	memset(Targetname,0,strlen(Targetname));
  res = f_opendir(&dir,(const TCHAR*)path); //打开一个目录
  if (res == FR_OK) 
	{	
		printf("%s dir opened \r\n",(char*)path); //打开成功
		while(ack!=100)
		{
			res = f_readdir(&dir, &fileinfo);  //关键函数 他会依次扫描文件夹下面的文件//读取目录下的一个文件
			if (res != FR_OK || fileinfo.fname[0] == 0) break;  //错误了/到末尾了,退出
			if (fileinfo.fname[0] == '.') continue;             //忽略上级目录
			fn = *fileinfo.lfname ? fileinfo.lfname : fileinfo.fname;
	    switch(func)                                          /* It is a file. */
			{
				case 0://扫描以后输出 (原始功能)
					printf("%s/", path);//打印路径	
					printf("%s\r\n", fn);//打印文件名	
						break;
				case 1://查找有没有(精确匹配 一旦找到立即返回)
					if(memcmp(fn,name,strlen(name))==0)
						ack=100;//存在的!找到了
					  break;
				case 2://查找没有系列的(有 继续找 找一个名字最长的)
					location= strstr(fn,name);
					printf("1%s===%s===%s\n",Targetname,location,fn);
					if(location>Targetname)
					{
						ack=200;
						strcpy(Targetname,location);
						printf("2%s===%s===%s\n",Targetname,location,fn);
					}
					break;
				default:
					break;				
			} 
		}	  
	myfree(SRAMIN,fileinfo.lfname);
  return ack;	  
	}
}

猜你喜欢

转载自blog.csdn.net/weixin_42381351/article/details/80999945