#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..上述表述的三点是遇到的问题,对于底层的数据表示还是不是很透彻。转换就更是问题。