循环读取文件夹中文件个数

#include <stdio.h>
  2 #include <string.h>
  3 #include <sys/types.h>
  4 #include <dirent.h>
  5 
  6 int getdirnum(char* name)
  7 {
  8     int i = 0;
  9     DIR* fp;
 10     struct dirent *mydir;
 11     char temp[1024] = {0};
 12     fp = opendir(name);
 13     if(fp == NULL)
 14     {
 15         perror("open error!");
 16     }
 17     while((mydir=readdir(fp)) != NULL){
 18         if(strcmp(mydir->d_name,".")==0 || strcmp(mydir->d_name,"..")==0){
 19             printf("1.%s\n",mydir->d_name);
 20             continue;
 21         }
 22         else if(mydir->d_type == DT_DIR)
 23         {
 24             printf("2.%s\n",mydir->d_name);
 25             sprintf(temp,"%s/%s",name,mydir->d_name);
 26             printf("%s\n",temp);
 27             i += getdirnum(temp);
 28         }
 29         else
 30         {
 31             i++;
 32         }
 33     }
 34     closedir(fp);
 35     return i;
 36 }
 37 
 38 int main()
 39 {
 40     char *name = "/home/k/work/c";
 41     int i = getdirnum(name);
 42     printf("%d\n",i);
 43     return 0;
 44 }
  遇见的问题:

1.关于c中比较字符串需要用strcmp()函数,不能使用==。

2.关于strcmp()函数要判断结果==0,否则if语句一定成立。然后printf语句全部输出的是1.开头的mydir->d_name。

3.  1 #include <stdio.h>
  2 
  3 int main()
  4 {
  5     char *aa = "hello";
  6     char *bb = "world";
  7     char temp[1024] = {0};
  8 
  9     sprintf(temp,"%s %s",aa,bb);
 10     if(aa == "hello")
 11         printf("same\n");
 12     printf("%s\n",temp);
 13 
 14 
 15     return 0;
 16 }
上面属于用sprintf()拼接字符串的代码。重点在于char temp[1024]这里的,如果设置char *temp就会报错,段错误。因此sprintf的用法在c中很重要。

总结,以上三点是写这段代码遇到的错误。

//-------------------------------------------

1..sprintf((char *)temp,"\\x04\\x%02X\\x%02X\\x%02X\\x%02X",num/0x100,num%0x100,num1/0x100,num1%0x100);

需要转化十六进制的数字为字符串的时候加的是\\才行,实测。

 

2..memcpy(reqbuffer,"\x04\x14\xFF\xFF\xFF",5*sizeof(BYTE));    04 14 ff ff ff

sprintf((char *)temp,"04%02X%02X%02X%02X",num/0x100,num%0x100,num1/0x100,num1%0x100);     30 34 45 41 30 30 45 42 30 30

上面两句的屏幕输出可以说是相同,但是在底层的数据存储形式不一样。如上是相应地址处的存储形式。

3..sum = num/0x100;
        memcpy(&temp[1],&sum,sizeof(BYTE));
        temp[1] = toupper(temp[1]);

sum是个int类型的,temp是BYTE,即char类型的,当sum等于ea时候,memcpy在temp[1]里面的数据也是ea,并不是大写的EA,然后用toupper来转换的时候,由于ea是属于一个char即一个位,8个字节,整体超出了a-z的字符范围,在VS里面是由?号替代的,所以toupper是无法转化大小写的。

4..上述表述的三点是遇到的问题,对于底层的数据表示还是不是很透彻。转换就更是问题。

转载于:https://my.oschina.net/u/3845807/blog/2978822

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值