user-0 提问: 急急急，各位大神，麻烦问一下，在windows c里面怎么实现创建目录，而且目录名是变化的

回复:
user: user-0
content: 引用 13 楼 zilaishuichina 的回复:[quote=引用 11 楼 sinat_16612001 的回复:]  这不是 已经说明问题了么   cut里面打印是对的，因为你赋值了'\0'，但是实际上你的cut里面的那个数组a长度是不够的，'\0'被赋值到了a数组的后面的内存中 而在main函数当中，zh，yy，mm是连续的内存，也就是说cut(str,27,31,zh)的时候，zh不是传给a了么，cut里面的a[j]='\0'，实际上就是zh[5]='\0'，而这个zh[5]实际上就是yy[0]，因为yy[0]被填上了'\0'，同理cut(str,33,36,yy)也是一样，‘\0’被填到了mm[0]上，所以你printf("%s\n",a)打印出来的都是对的。  那么为什么你main函数中打印的不对了呢，因为cut(str,27,31,zh)执行完，zh[5]，也就是yy[0]被填上了'\0'，然后你紧接着执行了cut(str,33,36,yy)，这里面将yy[0]填上了str[33]，yy[1]填上了str[34]，yy[2]填上了str[35]，yy[3]填上了str[36] yy[0]里面本来被赋值的'\0'被改成了str[33]，于是zh的'\0'没有了。这时候你再打印，答应出来的就是zh跟yy连在一起的一个字符串  再同理如果你连续执行 cut(str,27,31,zh); cut(str,33,36,yy); cut(str,37,38,mm) 然后再打印，打印出来的就是zh跟yy跟mm连在一起的一个字符串。  所以你应该定义 char zh[6]; char yy[5]; char mm[3]; 这样每个字符串就是有‘\0’的，就不会连在一起了[/quote] 是的，我前面搞错了，呵呵，谢谢

user: user-1
content: int year = 2014; int month = 6; int day = 17; char command[100]; sprintf(command, "md %4d-%02d-%02d", year, month, day); system(command);

user: user-2
content: 引用 11 楼 sinat_16612001 的回复: 这不是 已经说明问题了么   cut里面打印是对的，因为你赋值了'\0'，但是实际上你的cut里面的那个数组a长度是不够的，'\0'被赋值到了a数组的后面的内存中 而在main函数当中，zh，yy，mm是连续的内存，也就是说cut(str,27,31,zh)的时候，zh不是传给a了么，cut里面的a[j]='\0'，实际上就是zh[5]='\0'，而这个zh[5]实际上就是yy[0]，因为yy[0]被填上了'\0'，同理cut(str,33,36,yy)也是一样，‘\0’被填到了mm[0]上，所以你printf("%s\n",a)打印出来的都是对的。  那么为什么你main函数中打印的不对了呢，因为cut(str,27,31,zh)执行完，zh[5]，也就是yy[0]被填上了'\0'，然后你紧接着执行了cut(str,33,36,yy)，这里面将yy[0]填上了str[33]，yy[1]填上了str[34]，yy[2]填上了str[35]，yy[3]填上了str[36] yy[0]里面本来被赋值的'\0'被改成了str[33]，于是zh的'\0'没有了。这时候你再打印，答应出来的就是zh跟yy连在一起的一个字符串  再同理如果你连续执行 cut(str,27,31,zh); cut(str,33,36,yy); cut(str,37,38,mm) 然后再打印，打印出来的就是zh跟yy跟mm连在一起的一个字符串。  所以你应该定义 char zh[6]; char yy[5]; char mm[3]; 这样每个字符串就是有‘\0’的，就不会连在一起了

user: user-0

user: user-0

user: user-2
content: 引用 8 楼 sinat_16612001 的回复:不对啊，那输出yy,mm的值都是对的，没问题，只有zh不行，而且设成zh[6]也没用，还是空的  那么你  void cut(char *x, int y,int z, char *a)   {     int i,j=0;     for(i=y;i<=z;i++)     {         a[j]=x[i];           j++;     }     a[j]='\0';     printf("%s\n",a); //你看这地方是什么，这地方的zh，yy，mm值分别是什么 }

user: user-0
content: 那个所读取的name.txt是这样的

user: user-0
content: 不对啊，那输出yy,mm的值都是对的，没问题，只有zh不行，而且设成zh[6]也没用，还是空的

user: user-2
content: yy， mm同理，   记得当用char数组存放字符串的时候，需要多分配1个字符存放你看不见的结束符'\0'

user: user-3
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-2
content: 引用 4 楼 sinat_16612001 的回复:谢谢各位大神，但是我用的过程中还遇到个问题，  void cut(char *x, int y,int z, char *a)   {     int i,j=0;     for(i=y;i<=z;i++)     {         a[j]=x[i];           j++;     }     a[j]='\0'; } void main() {     FILE *fp;         char str[66];      	char zh[5];     char yy[4];     char mm[2];      fp=fopen("D:\\name.txt","r+");     if(fp==NULL)         printf("Can't open name");       while(fgets(str,66-1,fp))     {		 		cut(str,27,31,zh); 		cut(str,33,36,yy); 		cut(str,37,38,mm);                 printf("%s\n",yy);} } 不知道为什么这样输出的zh值是空的，但如果把cut(str,27,31,zh)放到cut(str,33,36,yy)后面，zh的值就有了，但这时yy的值就变成yyzz在一起的值了[/code] [/quote]  cut(str,27,31,zh);总共复制了5个字符，你的zh总长只有5，也就是说最后一个结束符没地方放了。应该定义为char zh[6];

user: user-0
content: 谢谢各位大神，但是我用的过程中还遇到个问题，  void cut(char *x, int y,int z, char *a)   {     int i,j=0;     for(i=y;i<=z;i++)     {         a[j]=x[i];           j++;     }     a[j]='\0'; } void main() {     FILE *fp;         char str[66];      	char zh[5];     char yy[4];     char mm[2];      fp=fopen("D:\\name.txt","r+");     if(fp==NULL)         printf("Can't open name");       while(fgets(str,66-1,fp))     {		 		cut(str,27,31,zh); 		cut(str,33,36,yy); 		cut(str,37,38,mm);                 printf("%s\n",yy);} } 不知道为什么这样输出的zh值是空的，但如果把cut(str,27,31,zh)放到cut(str,33,36,yy)后面，zh的值就有了，但这时yy的值就变成yyzz在一起的值了[/quote][/code]

user: user-4
content: void main() {    FILE *fp;        char str[66] = { '\0' };                            char yy[6] = { '\0' };    char mm[6] = { '\0' };     char cmd[120] = { '\0' };         fp=fopen("D:\\name.txt","r+");    if(fp==NULL)       printf("Can't open name");         while(fgets(str,50-1,fp))          /*逐行读取文件name,由于每行的文件格式均为D:\data\yymm\yymm-FTM.txt，从中读取年月的值*/    {           strncpy(yy, cut(str,13,15), 2);        strncpy(mm, cut(str,15,16), 2);        sprintf(cmd, "md D:\\%s\\%s\\test3.txt", yy, mm);        system(cmd); /*创建文件夹，文件夹目录为所读取的年和月*/      }    fclose(fp); }

user: user-2
content: void cut(char *x, int y,int z, char *a)  /*a改为参数*/ { 	int i,j=0; 	for(i=y;i<=z;i++) 	{ 		a[j]=x[i];   		j++; 	} 	a[j] = '\0';//记得赋值结束符 }  void main() { 	FILE *fp;     	char str[66];                         	char yy[10]; 	char mm[10];  	fp=fopen("D:\\name.txt","r+"); 	if(fp==NULL) 		printf("Can't open name");  	while(fgets(str,50-1,fp)) 	{ 		cut(str,15,18, yy); 		cut(str,19,20, mm);   		char dir[255] = {0};  		sprintf_s(dir, "md D:\\%s\\%s\\test3.txt", yy, mm);//也可以用strcat，具体可以自己百度 		system(dir); 	} 	fclose(fp); }

user: user-5
content: 1） 创建文件夹目录时，不能带入我所读取的年、月的变量； ：可以用sprintf函数解决这个问题 2）每次调用cut函数，由于定义的是static，用完返回值后，它不会释放空间，而一直保存前一个值，使得重新调用的时候就不能准确调出我需要的值。 ：把static删了不就行了吗？