Question: 稳定排序acm

改成这样 还是错 改怎么改 #include<stdio.h> void swap(int *point1,int *point2) {     int t;     t=*point1;     *point1=*point2;     *point2=t; } void sort(int a[],int t,int c[]) {     int i,j,n,m;     for(i=0;i<t-1;i++)         for(j=0;j<t-i-1;j++)         {             n=c[j],m=c[j+1];             if(a[n]<a[m])             swap(&c[j],&c[j+1]);         } } int main() {     int t,i,j,k,n,flag,flag2;     int a[305],b[305],c[305];     char str[305][55];     char str1[305][55];     while(scanf("%d",&t)!=EOF)     {         flag=0,flag2=0;         for(i=0;i<t;i++)         c[i]=i;         for(i=0;i<t;i++)         {             getchar();             for(j=0;scanf("%c",&str[i][j]),str[i][j]!=' ';j++);             scanf("%d",&a[i]);         }         sort(a,t,c);         for(i=0;i<t;i++)         {             getchar();             for(j=0;scanf("%c",&str1[i][j]),str1[i][j]!=' ';j++);             scanf("%d",&b[i]);             n=c[i];             if(a[n]!=b[i])             {                 flag=1;             }             else ;         }         for(i=0;i<t&&!flag;i++)         {             n=c[i];             for(k=0;str[n][k]==str1[i][k]&&str[i][k]!=' ';k++);             if(str[n][k]!=str1[i][k])             {                 flag2=1,flag=1;                 for(j=i+1;a[n]==b[j]&&j<t-1;j++)                 {                     for(k=0;str[n][k]==str1[j][k]&&str[n][k]!=' ';k++);                     if(str[n][k]==str1[j][k])                     {                         flag=0;                         break;                     }                 }                 if(a[n]==b[j]&&flag)                 {                     for(k=0;str[n][k]==str1[j][k]&&str[n][k]!=' ';k++);                     if(str[n][k]==str1[j][k])                     {                         flag=0;                     }                 }                 if(flag==1)                 {                     for(j=i-1;a[n]==b[j]&&j>0;j--)                     {                         for(k=0;str[n][k]==str1[j][k]&&str[n][k]!=' ';k++);                         if(str[n][k]==str1[j][k])                         {                             flag=0;                             break;                         }                     }                     if(a[n]==b[j]&&flag)                     {                         for(k=0;str[n][k]==str1[j][k]&&str[n][k]!=' ';k++);                         if(str[n][k]==str1[j][k])                         {                             flag=0;                         }                     }                 }             }         }         if(flag)         printf("Error\n");         else if(flag2)         printf("Not Stable\n");         else         printf("Right\n");         if(flag||flag2)             for(i=0;i<t;i++)             {                 n=c[i];                 for(k=0;str[n][k]!=' ';k++)                 printf("%c",str[n][k]);                 printf(" ");                 printf("%d\n",a[n]);             }     }     return 0; }

for(j=i-1;a[n]==b[j]&&j>0;j--)             {                 for(k=0;str[n][k]==str1[j][k]&&str[n][k]!=' ';k++);                 if(str[n][k]==str1[j][k])                 {                     flag=0;                     break;                 }             }             if(a[n]==b[j])              for(k=0;str[n][k]==str1[j][k]&&str[n][k]!=' ';k++);                 if(str[n][k]==str1[j][k])                 {                     flag=0;                                     } 这样我还是错

for(j=i-1;a[n]==b[j]&&j<t;j--) 				{ 					for(k=0;str[n][k]==str1[j][k]&&str[n][k]!=' ';k++); 					if(str[n][k]==str1[j][k]) 					{ 						flag=0; 						break; 					} 				}  当 i 为0的时候，j-1等于-1，此时str1[j][k] 越界了


Question: 关于把一个文件复制到另外一个文件夹下

使用 CopyFile() 能满足你的需求吗？

引用 5 楼 shihengzhen101 的回复:直接调用系统命令copy也是可以的，使用system函数配合copy命令，可以实现直接拷贝文件  谢谢，已经写好了。获取到第一个文件的最后一个文件名称，拼接到第二个路径的后面就好了。

引用 4 楼 l357630798 的回复:使用 CopyFile() 能满足你的需求吗？ 谢谢，不过已经解决了。是linux下的C

引用 2 楼 zw1103053925 的回复:[quote=引用 1 楼 paschen 的回复:] 从字符串未尾倒着遍历字符串，直到找到'/'或者到达开头，然后后面的就是文件名  谢谢版主，找到了是strrchr函数。请问把一个带路径或者不带路径的文件复制到另外一个文件夹还有更好的思路吗？[/quote]  直接使用操作系统的API函数

引用 1 楼 paschen 的回复:从字符串未尾倒着遍历字符串，直到找到'/'或者到达开头，然后后面的就是文件名  谢谢版主，找到了是strrchr函数。请问把一个带路径或者不带路径的文件复制到另外一个文件夹还有更好的思路吗？

从字符串未尾倒着遍历字符串，直到找到'/'或者到达开头，然后后面的就是文件名


Question: 那位大大看看这个程序哪里出问题了？

enter_reader函数中，  fscanf(reader,"%d%20s%d\n",&READER.number,temp,num);   num应该是&num吧

有点长，分开两次发

int enter_reader(void) { //录入读者信息 	FILE *reader; 	char agree,temp[MAX]; 	int num; 	reader = fopen("reader.txt","r+"); 	printf("请输入新增的读者信息（姓名 所借图书编号）\n"); 	scanf("%s %d",&READER.name,&READER.bookborrowed); 	while(!feof(reader)) 		fscanf(reader,"%d%20s%d\n",&READER.number,temp,num); 	fprintf(reader,"%d%20s%10d\n",READER.number+1,READER.name,READER.bookborrowed); 	printf("回到选择操作面板请输入“Y”\n"); 	getchar(); 	agree = getchar(); 	if(agree == 89) 		swit(); 	fclose(reader); 	return 0; }  int enter_book(void) { //录入书籍信息 	FILE *book; 	char agree,temp[MAX]; 	int num; 	book = fopen("book.txt","r+"); 	printf("请输入新增的书籍信息（书名 数目）\n"); 	scanf("%s %d",&BOOK.name,&BOOK.amount); 	while(!feof(book)) 		fscanf(book,"%d%20s%d\n",&BOOK.num,temp,&num); 	fprintf(book,"%d%20s%10d\n",BOOK.num+1,BOOK.name,BOOK.amount); 	printf("回到选择操作面板请输入“Y”\n"); 	getchar(); 	agree = getchar(); 	if(agree == 89) 		swit(); 	fclose(book); 	return 0; }  int conrrect_reader(void) { //修改读者信息 	int readernum,bookborrowed; 	char readername[MAX]; 	FILE *reader = fopen("reader.txt","r"); 	FILE *rereader = fopen("rereader.txt","w"); 	printf("请输入要修改的读者的编号\n"); 	scanf("%d",&readernum); 	printf("请输入该读者新的信息（姓名 所借图书的编号）\n"); 	scanf("%s %d",&readername,&bookborrowed); 	while(!feof(reader)) { 		fscanf(reader,"%d%20s%10d\n",&READER.number,&READER.name,&READER.bookborrowed); 		if(readernum != READER.number) 			fprintf(rereader,"%d%20s%10d\n",READER.number,READER.name,READER.bookborrowed); 		else 			fprintf(rereader,"%d%20s%10d\n",READER.number,readername,bookborrowed); 	} 	printf("操作成功！\n"); 	fclose(reader); 	fclose(rereader); 	remove("reader.txt"); 	rename("rereader.txt","reader.txt"); 	return 0; }  int conrrect_book(void) { //修改书籍信息 	int booknum,bookamount; 	char bookname[MAX]; 	FILE *book = fopen("book.txt","r"); 	FILE *rebook = fopen("rebook.txt","w"); 	printf("请输入要修改的书籍的编号\n"); 	scanf("%d",&booknum); 	printf("请输入该书籍新的信息（书名 数量）\n"); 	scanf("%s %d",&bookname,&bookamount); 	while(!feof(book)) { 		fscanf(book,"%d%20s%10d\n",&BOOK.num,&BOOK.name,&BOOK.amount); 		if(booknum != READER.number) 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 		else 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,bookname,bookamount); 	} 	printf("操作成功！\n"); 	fclose(book); 	fclose(rebook); 	remove("book.txt"); 	rename("rebook.txt","book.txt"); 	return 0; }  int delet_reader(void) { //删除读者信息 	int readernum; 	FILE *reader = fopen("reader.txt","r"); 	FILE *rereader = fopen("rereader.txt","w"); 	printf("请输入要删除的读者的编号\n"); 	scanf("%d",&readernum); 	while(!feof(reader)) { 		fscanf(reader,"%d%20s%10d\n",&READER.number,&READER.name,&READER.bookborrowed); 		if(readernum != READER.number) 			fprintf(rereader,"%d%20s%10d\n",READER.number,READER.name,READER.bookborrowed); 		else 			; 	} 	printf("操作成功！\n"); 	fclose(reader); 	fclose(rereader); 	remove("reader.txt"); 	rename("rereader.txt","reader.txt"); 	return 0; }  int delet_book(void) { //删除书籍信息 	int booknum; 	FILE *book = fopen("book.txt","r"); 	FILE *rebook = fopen("rebook.txt","w"); 	printf("请输入要删除的书籍的编号\n"); 	scanf("%d",&booknum); 	while(!feof(book)) { 		fscanf(book,"%d%20s%10d\n",&BOOK.num,&BOOK.name,&BOOK.amount); 		if(booknum != BOOK.num) 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 		else 			; 	} 	printf("操作成功！\n"); 	fclose(book); 	fclose(rebook); 	remove("book.txt"); 	rename("rebook.txt","book.txt"); 	return 0; }  int swit(void) { 	int handle = 0; 	printf("请输入您要进行的操作的编号：\n1.查询书籍信息\n2.录入读者信息\n3.录入书籍信息\n4.修改读者信息\n5.修改书籍信息\n6.删除读者信息\n7.删除书籍信息\n8.退出\n"); 	scanf("%d",&handle); 	getchar(); 	switch(handle) { 		case 1: 			admin_search(); 			break; 		case 2: 			enter_reader(); 			break; 		case 3: 			enter_book(); 			break; 		case 4: 			conrrect_reader(); 			break; 		case 5: 			conrrect_book(); 			break; 		case 6: 			delet_reader(); 			break; 		case 7: 			delet_book(); 			break; 		case 8: 			return 0; 		default: 			printf("输入错误，请重新输入：\n"); 			swit(); 			break; 	}; 	return 0; }  int borrow(int readernum,int booknum) { 	int flag = 1; 	FILE *reader = fopen("reader.txt","r"); 	FILE *rereader = fopen("rereader.txt","w"); 	FILE *book = fopen("book.txt","r"); 	FILE *rebook = fopen("rebook.txt","w"); 	while(!feof(book)) { 		fscanf(book,"%d%20s%10d\n",&BOOK.num,&BOOK.name,&BOOK.amount); 		if(booknum != BOOK.num) 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 		else if(BOOK.amount == 0) { 			printf("书已被借光\n"); 			flag = 0; 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 		} else 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount-1); 	} 	while(!feof(reader)) { 		fscanf(reader,"%d%20s%10d\n",&READER.number,&READER.name,&READER.bookborrowed); 		if(readernum != READER.number) 			fprintf(rereader,"%d%20s%10d\n",READER.number,READER.name,READER.bookborrowed); 		else if(!flag) 			fprintf(rereader,"%d%20s%10d\n",READER.number,READER.name,READER.bookborrowed); 		else 			fprintf(rereader,"%d%20s%10d\n",READER.number,READER.name,booknum);  	} 	if(flag) 		printf("借阅成功！\n"); 	fclose(reader); 	fclose(rereader); 	remove("reader.txt"); 	rename("rereader.txt","reader.txt"); 	fclose(book); 	fclose(rebook); 	remove("book.txt"); 	rename("rebook.txt","book.txt"); }  int bring(void) { 	int readernum,booknum,flag = 1; 	printf("请输入你的读者编号\n"); 	scanf("%d",&readernum); 	FILE *reader = fopen("reader.txt","r"); 	FILE *rereader = fopen("rereader.txt","w"); 	FILE *book = fopen("book.txt","r"); 	FILE *rebook = fopen("rebook.txt","w"); 	while(!feof(reader)) { 		fscanf(reader,"%d%20s%10d\n",&READER.number,&READER.name,&READER.bookborrowed); 		if(readernum != READER.number) 			fprintf(rereader,"%d%20s%10d\n",READER.number,READER.name,READER.bookborrowed); 		else if(READER.bookborrowed == 0) { 			printf("您不需要还书\n"); 			fprintf(rereader,"%d%20s%10d\n",READER.number,READER.name,READER.bookborrowed); 			flag = 0; 		} else { 			fprintf(rereader,"%d%20s%10d\n",READER.number,READER.name,0); 			booknum = READER.bookborrowed; 		} 	} 	while(!feof(book)) { 		fscanf(book,"%d%20s%10d\n",&BOOK.num,&BOOK.name,&BOOK.amount); 		if(booknum != BOOK.num) 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 		else if(!flag) 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 		else 			fprintf(rebook,"%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount+1); 	} 	if(flag) 		printf("还书成功！\n"); 	fclose(reader); 	fclose(rereader); 	remove("reader.txt"); 	rename("rereader.txt","reader.txt"); 	fclose(book); 	fclose(rebook); 	remove("book.txt"); 	rename("rebook.txt","book.txt"); }

#include<stdio.h> #include<string.h>  #define MAX 100  struct reader { 	int number; 	char name[MAX]; 	int bookborrowed; } READER; struct book { 	int num; 	char name[MAX]; 	int amount; } BOOK;  int contents(void);//查询书目 int reader_search(void);//读者的查询 int admin_search(void);//管理员的查询 int enter_reader(void);//录入读者信息 int enter_book(void);//录入书籍信息 int conrrect_reader(void);//修改读者信息 int conrrect_book(void);//修改书籍信息 int delet_reader(void);//删除读者信息 int delet_book(void);//删除书籍信息 int swit(void);//管理员的选择 int borrow(int readernum,int booknum);//借书的函数 int bring(void);//还书的函数  int main() { 	char readerenter; 	char pass[8],c; 	printf("管理员请输入password，读者请回车\n"); 	gets(pass); 	if(strcmp(pass,"password") == 0) { //管理员的诸项操作 		swit(); 	} else { //读者的诸项操作 		printf("回车查询书目，输入“B”还书，其他输入查询详细信息\n"); 		readerenter = getchar(); 		if(readerenter == '\n') { 			contents(); 		} else if(readerenter == 'B') { 			bring(); 		} else { 			reader_search(); 		} 	} 	return 0; }  int contents(void) { //查询书目 	char agree; 	char line[MAX]; 	FILE *book; 	if((book = fopen("book.txt","r")) == NULL) 		printf("无书籍信息\n"); 	else 		printf("编号 书名 数量\n"); 	while(1) { 		fgets(line,MAX,book); 		if(feof(book)) 			break; 		printf("%s",line); 	} 	fclose(book); 	printf("借阅请输入“Y”\n"); 	agree = getchar(); 	if(agree == 'Y') 		reader_search(); 	return 0; }  int reader_search(void) { //读者的查询 //输入编号或书名，查询书籍信息 	FILE *book; 	FILE *reader; 	int choose = 0,booknum,readernum,key = 0; 	char booknam[MAX],line[MAX],c; 	printf("请输入：\n1.编号\n2.书名\n"); 	while(choose != 1 && choose != 2) 		scanf("%d",&choose); 	book = fopen("book.txt","r"); 	reader = fopen("reader.txt","r"); 	if(choose == 1) { 		printf("请输入书籍编号\n"); 		scanf("%d",&booknum); 		while(!feof(book)) { 			fscanf(book,"%d%20s%10d\n",&BOOK.num,&BOOK.name,&BOOK.amount); 			if(booknum == BOOK.num ) { 				printf("编号 书名 数量\n"); 				printf("%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 				key = 1; 				break; 			} 		} 	} 	if(choose == 2) { 		printf("请输入书名\n"); 		scanf("%s",booknam); 		while(!feof(book)) { 			fscanf(book,"%d%20s%10d\n",&BOOK.num,&BOOK.name,&BOOK.amount); 			if(strcmp(booknam,BOOK.name) == 0) { 				printf("编号 书名 数量\n"); 				printf("%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 				booknum = BOOK.num; 				key = 1; 				break; 			} 		} 	} 	if(key == 0) { 		printf("查无此书，请重新查询\n"); 		reader_search(); 	} else { 		printf("查询完毕，输入“Y”重新查询，回车借阅\n"); 		getchar(); 		scanf("%c",&c); 		if(c == 'Y') 			reader_search(); 		else { 			printf("请输入你的读者编号\n"); 			scanf("%d",&readernum); 			while(READER.number == readernum) { 				fscanf(reader,"%d%20s%d\n",&READER.number,&READER.name,&READER.bookborrowed); 			} 			if(READER.bookborrowed != 0) { 				printf("请先还书\n"); 				return 1; 			} else { 				printf("编号 姓名 借阅\n"); 				printf("%d%20s%10d\n",READER.number,READER.name,BOOK.num); 			} 		} 		fclose(reader); 		fclose(book); 		borrow(readernum,booknum); 	} 	return 0; }  int admin_search(void) { //管理员的查询 //输入编号，查询书籍信息和借阅情况 	FILE *book; 	FILE *reader; 	int choose = 0,booknum,readernum,key = 0; 	char booknam[MAX],line[MAX],c; 	printf("请输入：\n1.编号\n2.书名\n"); 	while(choose != 1 && choose != 2) 		scanf("%d",&choose); 	book = fopen("book.txt","r"); 	reader = fopen("reader.txt","r"); 	if(choose == 1) { 		printf("请输入书籍编号\n"); 		scanf("%d",&booknum); 		while(!feof(book)) { 			fscanf(book,"%d%20s%10d\n",&BOOK.num,&BOOK.name,&BOOK.amount); 			if(booknum == BOOK.num ) { 				printf("编号 书名 数量\n"); 				printf("%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 				key = 1; 				break; 			} 		} 	} 	if(choose == 2) { 		printf("请输入书名\n"); 		scanf("%s",booknam); 		while(!feof(book)) { 			fscanf(book,"%d%20s%10d\n",&BOOK.num,&BOOK.name,&BOOK.amount); 			if(strcmp(booknam,BOOK.name) == 0) { 				printf("编号 书名 数量\n"); 				printf("%d%20s%10d\n",BOOK.num,BOOK.name,BOOK.amount); 				booknum = BOOK.num; 				key = 1; 				break; 			} 		} 	} 	if(key == 0) { 		printf("查无此书，请重新查询\n"); 		admin_search(); 	} else { 		printf("这些人借了这本书\n"); 		while(!feof(reader)) { 			fscanf(reader,"%d%20s%d\n",&READER.number,&READER.name,&READER.bookborrowed); 			if(READER.bookborrowed == booknum) { 				printf("%d%20s%10d\n",READER.number,READER.name,BOOK.num); 			} 		} 	} 	swit(); 	return 0; }


Question: socket编程UDP广播程序会收到自己的广播包

udp发送和接收都是同一个端口 理论上应该是可以收到自己发送的udp信息的

引用 3 楼 user-2 的回复:[quote=引用 2 楼 ally_yu 的回复:] [quote=引用 1 楼 user-2 的回复:] 这有什么问题？收到自己的广播，不处理直接扔掉就好了！ 所以这是正常的是吗？我觉得是因为我广播的端口和监听的端口是同一个，所以会收到广播包，对吗？[/quote] 我认为是这样的。[/quote] 谢谢你了！

引用 1 楼 user-2 的回复:这有什么问题？收到自己的广播，不处理直接扔掉就好了！ 所以这是正常的是吗？我觉得是因为我广播的端口和监听的端口是同一个，所以会收到广播包，对吗？

这有什么问题？收到自己的广播，不处理直接扔掉就好了！

引用 2 楼 ally_yu 的回复:[quote=引用 1 楼 user-2 的回复:] 这有什么问题？收到自己的广播，不处理直接扔掉就好了！ 所以这是正常的是吗？我觉得是因为我广播的端口和监听的端口是同一个，所以会收到广播包，对吗？[/quote] 我认为是这样的。


Question: 二叉树

引用 1 楼 user-1 的回复:creatree函数中：  if(c='#')  改成：  if(c=='#') 谢谢，解决了。手误手误

creatree函数中：  if(c='#')  改成：  if(c=='#')


Question: 能帮我看看这个文件流吗

w      Truncate file to zero length or create text file for writing.  The stream is positioned at the beginning of the file.  w+     Open for reading and writing.  The file is created if it does not exist, otherwise it is truncated.  The stream is positioned at the beginning of the file. 你的然后后面的东西看不到! w和w+方式打开文件,都会将文件的长度截断为0,若文件已存在时；所以,如果该文件已存在,若只想读文件里的内容,建议使用"r"方式打开,如果是是读写,可以使用"r+"方式打开；

fp = fopen ( " DUMMY.FIL"," w " );  //这里是新建个文件写的，后面又从文件里读了冲突 // 如果打开读写。应该 改成 w+ 就可以了


Question: 我的符号三角形暴力搜索不知道哪里出错了，有大神帮忙看看哪错了吗？

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

for(i=0;i<n;i++) 	p[i]=new int[n];  这个循环执行完时，i 的值已经变成了n  下面的p[0][i]=temp%2;已经越界了


Question: 跪求大神解决问题

右键 打开 stdbool.h 文件，就可以查到 相关的 boo 值定义  和自己使用下面三行代码其实差不多的意思 typedef int bool;   #define false 0   #define true  1

从C99标准开始，类型名字为“_Bool”，如果你的编译器支持C99，就可以直接使用布尔类型。另外，C99为了让C和C++兼容，增加了一个头文件stdbool.h。里面定义了bool、true、false，让我们可以像C++一样的定义布尔类型。        _Bool类型不需要引用其他库函数，直接就可以使用，       bool类型，则需要 #include <stdbool.h>，使用如上文

改扩展名为 cpp 使用 g++ 编译就好  C 语言  以前没有 bool ，不知道现在新标准是否支持了

因为gcc暂时不支持bool，所以用不了  把bool 改成 int  false改成0  true改成1


Question: 递归次数的统计

i  很明显就是一个全局变量啊. 这个程序就是用 全局变量i来统计递归的次数.  多个return并不是返回多个值, 而是在不同的条件下, 这个函数会返回不同的值.  实际上你这个程序中的 那句  return i;  是永远不会执行的.

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

两个return不是返回两个值，而是在不同情况下返回不同的值

我不太会结贴。。。新手

引用 6 楼 小灸舞的回复:VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 厉害了，新生，对编译器还不熟。。。我用的是devc++


Question: 我自己写了一个字符串类型, 请问我想实现Char* one = “\0”; 这样直接初始化可以吗?

引用 15 楼 u010165006 的回复:可以参考下这个： 字符串函数和String类的实现 http://blog.163.com/tab_98/blog/static/1192409720159211243525/  不好意思，博客系统有点问题，有些博客未登录情况访问不了。

引用 17 楼 u010165006 的回复:C++笔试题 String类的实现 三大复制控制函数   这个在面试或笔试的时候常问到或考到。  已知类String的原型为： class String { public:      String(const char *str = NULL);// 普通构造函数      String(const String &other);    // 拷贝构造函数      ~ String(void);    // 析构函数      String & operate =(const String &other);// 赋值函数 private:      char *m_data;// 用于保存字符串 };  请编写String的上述4个函数。 //普通构造函数 String::String(const char *str) {         if(str==NULL)         {                 m_data = new char[1]; // 得分点：对空字符串自动申请存放结束标志'\0'的//加分点：对m_data加NULL 判断                 *m_data = '\0';         }             else         {          int length = strlen(str);          m_data = new char[length+1]; // 若能加 NULL 判断则更好          strcpy(m_data, str);         } }  // String的析构函数 String::~String(void) {         delete [] m_data; // 或delete m_data; } //拷贝构造函数 String::String(const String &other) 　　　// 得分点：输入参数为const型 {              int length = strlen(other.m_data);         m_data = new char[length+1]; 　　　　//加分点：对m_data加NULL 判断         strcpy(m_data, other.m_data);     }  //赋值函数 String & String::operate =(const String &other) // 得分点：输入参数为const  型 {              if(this == &other)                  　　//得分点：检查自赋值                 return *this;            delete [] m_data;            　　　　//得分点：释放原有的内存资源         int length = strlen( other.m_data );               m_data = new char[length+1]; 　//加分点：对m_data加NULL 判断         strcpy( m_data, other.m_data );            return *this;     　　　　　　　　//得分点：返回本对象的引用    }  剖析：  能够准确无误地编写出String类的构造函数、拷贝构造函数、赋值函数和析构函数的面试者至少已经具备了C++基本功的60%以上！ 在这个类中包括了指针类成员变量m_data，当类中包括指针类成员变量时，一定要重载其拷贝构造函数、赋值函数和析构函数， 这既是对C++程序员的基本要求，也是《Effective　C++》中特别强调的条款。 仔细学习这个类，特别注意加注释的得分点和加分点的意义，这样就具备了60%以上的C++基本功！    感谢!

别拿include目录里没扩展名的文件不当源代码。

引用 12 楼 paschen的回复:[quote=引用 11 楼 yyxgs 的回复:] [quote=引用 9 楼 user-4 的回复:] /*  * This file contains code from "C++ Primer, Fifth Edition", by Stanley B.  * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the  * copyright and warranty notices given in that book:  *   * "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo."  *   *   * "The authors and publisher have taken care in the preparation of this book,  * but make no expressed or implied warranty of any kind and assume no  * responsibility for errors or omissions. No liability is assumed for  * incidental or consequential damages in connection with or arising out of the  * use of the information or programs contained herein."  *   * Permission is granted for this code to be used for educational purposes in  * association with the book, given proper citation if and when posted or  * reproduced.Any commercial use of this code requires the explicit written  * permission of the publisher, Addison-Wesley Professional, a division of  * Pearson Education, Inc. Send your request for permission, stating clearly  * what code you would like to use, and in what specific way, to the following  * address:   *   * 	Pearson Education, Inc.  * 	Rights and Permissions Department  * 	One Lake Street  * 	Upper Saddle River, NJ  07458  * 	Fax: (201) 236-3290 */   #ifndef STRING_H #define STRING_H  #include <cstring> #include <algorithm> #include <cstddef> #include <iostream> #include <initializer_list> #include <iostream> #include <memory>  class String { friend String operator+(const String&, const String&); friend String add(const String&, const String&); friend std::ostream &operator<<(std::ostream&, const String&); friend std::ostream &print(std::ostream&, const String&);  public: 	String() = default;  	// cp points to a null terminated array,  	// allocate new memory & copy the array 	String(const char *cp) :  	          sz(std::strlen(cp)), p(a.allocate(sz)) 	          { std::uninitialized_copy(cp, cp + sz, p); }  	// copy constructor: allocate a new copy of the characters in s 	String(const String &s):sz(s.sz), p(a.allocate(s.sz)) 	          { std::uninitialized_copy(s.p, s.p + sz , p); }  	// move constructor: copy the pointer, not the characters,  	// no memory allocation or deallocation 	String(String &&s) noexcept : sz(s.size()), p(s.p)  	          { s.p = 0; s.sz = 0; }  	String(size_t n, char c) : sz(n), p(a.allocate(n)) 	          { std::uninitialized_fill_n(p, sz, c); }  	// allocates a new copy of the data in the right-hand operand;  	// deletes the memory used by the left-hand operand 	String &operator=(const String &); 	// moves pointers from right- to left-hand operand 	String &operator=(String &&) noexcept;  	// unconditionally delete the memory because each String has its own memory 	~String() noexcept { if (p) a.deallocate(p, sz); }  	// additional assignment operators 	String &operator=(const char*);         // car = "Studebaker" 	String &operator=(char);                // model = 'T' 	String & 	operator=(std::initializer_list<char>); // car = {'a', '4'} 	 	const char *begin()                         { return p; } 	const char *begin() const                   { return p; } 	const char *end()                      { return p + sz; } 	const char *end() const                { return p + sz; }  	size_t size() const                        { return sz; } 	void swap(String &s) 	                { auto tmp = p; p = s.p; s.p = tmp;  	                  auto cnt = sz; sz = s.sz; s.sz = cnt; } private: 	std::size_t sz = 0; 	char *p = nullptr; 	static std::allocator<char> a; }; String make_plural(size_t ctr, const String &, const String &); inline void swap(String &s1, String &s2) { 	s1.swap(s2); }  #endif  头文件也放上来吧  请大神来解释一下    。。。我用的是C[/quote]  typedef char Char;  Char* one = "Any string";[/quote] 呃呃呃，Char这个类型我已经实现了，里面有数据和方法，我想让这个类型可以赋值初始化。。

引用 11 楼 yyxgs 的回复:[quote=引用 9 楼 user-4 的回复:] /*  * This file contains code from "C++ Primer, Fifth Edition", by Stanley B.  * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the  * copyright and warranty notices given in that book:  *   * "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo."  *   *   * "The authors and publisher have taken care in the preparation of this book,  * but make no expressed or implied warranty of any kind and assume no  * responsibility for errors or omissions. No liability is assumed for  * incidental or consequential damages in connection with or arising out of the  * use of the information or programs contained herein."  *   * Permission is granted for this code to be used for educational purposes in  * association with the book, given proper citation if and when posted or  * reproduced.Any commercial use of this code requires the explicit written  * permission of the publisher, Addison-Wesley Professional, a division of  * Pearson Education, Inc. Send your request for permission, stating clearly  * what code you would like to use, and in what specific way, to the following  * address:   *   * 	Pearson Education, Inc.  * 	Rights and Permissions Department  * 	One Lake Street  * 	Upper Saddle River, NJ  07458  * 	Fax: (201) 236-3290 */   #ifndef STRING_H #define STRING_H  #include <cstring> #include <algorithm> #include <cstddef> #include <iostream> #include <initializer_list> #include <iostream> #include <memory>  class String { friend String operator+(const String&, const String&); friend String add(const String&, const String&); friend std::ostream &operator<<(std::ostream&, const String&); friend std::ostream &print(std::ostream&, const String&);  public: 	String() = default;  	// cp points to a null terminated array,  	// allocate new memory & copy the array 	String(const char *cp) :  	          sz(std::strlen(cp)), p(a.allocate(sz)) 	          { std::uninitialized_copy(cp, cp + sz, p); }  	// copy constructor: allocate a new copy of the characters in s 	String(const String &s):sz(s.sz), p(a.allocate(s.sz)) 	          { std::uninitialized_copy(s.p, s.p + sz , p); }  	// move constructor: copy the pointer, not the characters,  	// no memory allocation or deallocation 	String(String &&s) noexcept : sz(s.size()), p(s.p)  	          { s.p = 0; s.sz = 0; }  	String(size_t n, char c) : sz(n), p(a.allocate(n)) 	          { std::uninitialized_fill_n(p, sz, c); }  	// allocates a new copy of the data in the right-hand operand;  	// deletes the memory used by the left-hand operand 	String &operator=(const String &); 	// moves pointers from right- to left-hand operand 	String &operator=(String &&) noexcept;  	// unconditionally delete the memory because each String has its own memory 	~String() noexcept { if (p) a.deallocate(p, sz); }  	// additional assignment operators 	String &operator=(const char*);         // car = "Studebaker" 	String &operator=(char);                // model = 'T' 	String & 	operator=(std::initializer_list<char>); // car = {'a', '4'} 	 	const char *begin()                         { return p; } 	const char *begin() const                   { return p; } 	const char *end()                      { return p + sz; } 	const char *end() const                { return p + sz; }  	size_t size() const                        { return sz; } 	void swap(String &s) 	                { auto tmp = p; p = s.p; s.p = tmp;  	                  auto cnt = sz; sz = s.sz; s.sz = cnt; } private: 	std::size_t sz = 0; 	char *p = nullptr; 	static std::allocator<char> a; }; String make_plural(size_t ctr, const String &, const String &); inline void swap(String &s1, String &s2) { 	s1.swap(s2); }  #endif  头文件也放上来吧  请大神来解释一下    。。。我用的是C[/quote]  typedef char Char;  Char* one = "Any string";

引用 9 楼 user-4 的回复:/*  * This file contains code from "C++ Primer, Fifth Edition", by Stanley B.  * Lippman, Josee Lajoie, and Barbara E. Moo, and is covered under the  * copyright and warranty notices given in that book:  *   * "Copyright (c) 2013 by Objectwrite, Inc., Josee Lajoie, and Barbara E. Moo."  *   *   * "The authors and publisher have taken care in the preparation of this book,  * but make no expressed or implied warranty of any kind and assume no  * responsibility for errors or omissions. No liability is assumed for  * incidental or consequential damages in connection with or arising out of the  * use of the information or programs contained herein."  *   * Permission is granted for this code to be used for educational purposes in  * association with the book, given proper citation if and when posted or  * reproduced.Any commercial use of this code requires the explicit written  * permission of the publisher, Addison-Wesley Professional, a division of  * Pearson Education, Inc. Send your request for permission, stating clearly  * what code you would like to use, and in what specific way, to the following  * address:   *   * 	Pearson Education, Inc.  * 	Rights and Permissions Department  * 	One Lake Street  * 	Upper Saddle River, NJ  07458  * 	Fax: (201) 236-3290 */   #ifndef STRING_H #define STRING_H  #include <cstring> #include <algorithm> #include <cstddef> #include <iostream> #include <initializer_list> #include <iostream> #include <memory>  class String { friend String operator+(const String&, const String&); friend String add(const String&, const String&); friend std::ostream &operator<<(std::ostream&, const String&); friend std::ostream &print(std::ostream&, const String&);  public: 	String() = default;  	// cp points to a null terminated array,  	// allocate new memory & copy the array 	String(const char *cp) :  	          sz(std::strlen(cp)), p(a.allocate(sz)) 	          { std::uninitialized_copy(cp, cp + sz, p); }  	// copy constructor: allocate a new copy of the characters in s 	String(const String &s):sz(s.sz), p(a.allocate(s.sz)) 	          { std::uninitialized_copy(s.p, s.p + sz , p); }  	// move constructor: copy the pointer, not the characters,  	// no memory allocation or deallocation 	String(String &&s) noexcept : sz(s.size()), p(s.p)  	          { s.p = 0; s.sz = 0; }  	String(size_t n, char c) : sz(n), p(a.allocate(n)) 	          { std::uninitialized_fill_n(p, sz, c); }  	// allocates a new copy of the data in the right-hand operand;  	// deletes the memory used by the left-hand operand 	String &operator=(const String &); 	// moves pointers from right- to left-hand operand 	String &operator=(String &&) noexcept;  	// unconditionally delete the memory because each String has its own memory 	~String() noexcept { if (p) a.deallocate(p, sz); }  	// additional assignment operators 	String &operator=(const char*);         // car = "Studebaker" 	String &operator=(char);                // model = 'T' 	String & 	operator=(std::initializer_list<char>); // car = {'a', '4'} 	 	const char *begin()                         { return p; } 	const char *begin() const                   { return p; } 	const char *end()                      { return p + sz; } 	const char *end() const                { return p + sz; }  	size_t size() const                        { return sz; } 	void swap(String &s) 	                { auto tmp = p; p = s.p; s.p = tmp;  	                  auto cnt = sz; sz = s.sz; s.sz = cnt; } private: 	std::size_t sz = 0; 	char *p = nullptr; 	static std::allocator<char> a; }; String make_plural(size_t ctr, const String &, const String &); inline void swap(String &s1, String &s2) { 	s1.swap(s2); }  #endif  头文件也放上来吧  请大神来解释一下    。。。我用的是C

引用 7 楼 paschen 的回复:可以，你创建的这个类增加一个参数为const char*的构造函数就可以了   说错了。。赋值初始化，用 = 运算符的方式。

#include <cstring> using std::strlen;  #include <algorithm> using std::copy;   #include <cstddef> using std::size_t;   #include <iostream> using std::ostream;   #include <utility> using std::swap;  #include <initializer_list> using std::initializer_list;  #include <memory> using std::uninitialized_copy;  #include "String.h"  // define the static allocator member std::allocator<char> String::a;  // copy-assignment operator String & String::operator=(const String &rhs) { 	// copying the right-hand operand before deleting the left handles self-assignment     auto newp = a.allocate(rhs.sz); // copy the underlying string from rhs 	uninitialized_copy(rhs.p, rhs.p + rhs.sz, newp);  	if (p) 		a.deallocate(p, sz); // free the memory used by the left-hand operand 	p = newp;    // p now points to the newly allocated string 	sz = rhs.sz; // update the size      return *this;      }  // move assignment operator String & String::operator=(String &&rhs) noexcept { 	// explicit check for self-assignment 	if (this != &rhs) { 		if (p) 			a.deallocate(p, sz);  // do the work of the destructor 		p = rhs.p;    // take over the old memory 		sz = rhs.sz; 		rhs.p = 0;    // deleting rhs.p is safe 		rhs.sz = 0; 	}     return *this;  }  String& String::operator=(const char *cp) { 	if (p) a.deallocate(p, sz); 	p = a.allocate(sz = strlen(cp)); 	uninitialized_copy(cp, cp + sz, p); 	return *this; }  String& String::operator=(char c) { 	if(p) a.deallocate(p, sz); 	p = a.allocate(sz = 1); 	*p = c; 	return *this; }  String& String::operator=(initializer_list<char> il) { 	// no need to check for self-assignment 	if (p) 		a.deallocate(p, sz);        // do the work of the destructor 	p = a.allocate(sz = il.size()); // do the work of the copy constructor 	uninitialized_copy(il.begin(), il.end(), p); 	return *this; } // named functions for operators ostream &print(ostream &os, const String &s) { 	auto p = s.begin(); 	while (p != s.end()) 		os << *p++ ; 	return os; }  String add(const String &lhs, const String &rhs)  { 	String ret; 	ret.sz = rhs.size() + lhs.size();   // size of the combined String 	ret.p = String::a.allocate(ret.sz); // allocate new space 	uninitialized_copy(lhs.begin(), lhs.end(), ret.p); // copy the operands 	uninitialized_copy(rhs.begin(), rhs.end(), ret.p + lhs.sz); 	return ret;  // return a copy of the newly created String } 	 // return plural version of word if ctr isn't 1 String make_plural(size_t ctr, const String &word,                                const String &ending) {         return (ctr != 1) ?  add(word, ending) : word; }  // chapter 14 will explain overloaded operators ostream &operator<<(ostream &os, const String &s) { 	return print(os, s); }  String operator+(const String &lhs, const String &rhs)  { 	return add(lhs, rhs); }   http://srgb.vicp.net/cppprimer/13/String.cc  C++ PRIMER 5版里的源码，这本书我没看过

可以，你创建的这个类增加一个参数为const char*的构造函数就可以了

引用 5 楼 user-4 的回复:std::string::operator= string& operator= (const string& str); string& operator= (const char* s); string& operator= (char c); 那就参考 string 自己写三个函数，参考下网上别人怎么写的string类  好吧好吧，源码难懂。。

引用 3 楼 user-4 的回复:Char  是什么定义，好像不是标准库里的  Char*是我自己写的类型，因为源码里用了我自己头文件里的函数，所以没贴出来。 就是我觉得one->str_to_Char("我喜欢C语言!", &one);这种方式太麻烦, 想像char* str = "我喜欢C语言!"; 这样直接初始化，可以实现吗？

Char  是什么定义，好像不是标准库里的

总是用one->str_to_Char("Any string", &one);这种方式特别麻烦 我想可以像char* str = "Any string"; 这样直接初始化该怎么实现？


Question: C语言求解

for(k=0; k<strlen(s)-3; k++)

无法通过的字符串有吗

引用 2 楼 qq_36973349的回复:但是参考答案也是输一个字符串就判断有没有，下面是正确的代码 #include <stdio.h>   02.#include <stdlib.h>   03.#include <string.h>   04.#define N 100   05.int main()   06.{   07.    int T;   08.    char s[N+5];   09.    scanf("%d",&T);   10.    while (T--)   11.    {   12.        int k,m=0;   13.        scanf("%s",s);   14.        int len=strlen(s);   15.        for(k=0; k<len-2; k++)   16.        {   17.            if(s[k]=='G'&&s[k+1]=='L'&&s[k+2]=='B')   18.            {   19.                m=1;   20.                break;   21.            }   22.        }   23.        if(m)   24.            printf("YES\n");   25.        else   26.            printf("NO\n");   27.    }   28.    return 0;   29.} 没必要纠结这些东西。。有些题目的答案还是错的呢！自己把东西弄懂就可以了。。

会写了以后，用strstr函数比较简单。

测试不能通过的原因估计是你没审题，我估计题目的意思是让你先输入一个T，然后底下跟T组字符串，最后再输出结果。（代码没问题）


前面二位已经回答了，应该追加  #include <linux/kernel.h >  试试看结果


CREAT Section: POSIX Programmer's Manual (P) Updated: 2003  --------------------------------------------------------------------------------    NAME creat - create a new file or rewrite an existing one    SYNOPSIS #include <sys/stat.h>  #include <fcntl.h>    int creat(const char *path, mode_t mode);      DESCRIPTION The function call:     creat(path, mode)   shall be equivalent to:     open(path, O_WRONLY|O_CREAT|O_TRUNC, mode)      RETURN VALUE Refer to open() .     ERRORS Refer to open() .   The following sections are informative.     EXAMPLES    Creating a File The following example creates the file /tmp/file with read and write permissions for the file owner and read permission for group and others. The resulting file descriptor is assigned to the fd variable.     #include <fcntl.h> ... int fd; mode_t mode = S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH; char *filename = "/tmp/file"; ... fd = creat(filename, mode); ...      APPLICATION USAGE None.     RATIONALE The creat() function is redundant. Its services are also provided by the open() function. It has been included primarily for historical purposes since many existing applications depend on it. It is best considered a part of the C binding rather than a function that should be provided in other languages.     FUTURE DIRECTIONS None.     SEE ALSO open() , the Base Definitions volume of IEEE Std 1003.1-2001, <fcntl.h>, <sys/stat.h>, <sys/types.h>     COPYRIGHT Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. In the event of any discrepancy between this version and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.opengroup.org/unix/online.html .  --------------------------------------------------------------------------------

引用 6 楼 zw1103053925 的回复:[quote=引用 5 楼 user-2 的回复:] [quote=引用 4 楼 zw1103053925 的回复:] [quote=引用 3 楼 user-2 的回复:] [quote=引用 2 楼 zw1103053925 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] char oct[20]; int v=100; sprintf(oct,"0%o",v); printf("%s\n",oct);   请问赵四老师。我要用open函数或者creat，传入的第三个参数是mode_t类型的，和上面的char型数组应该怎么转换呢？？[/quote]  mode_t是用你需要的标志组合来的，不是用一个数转换成8进制  参看：http://www.xuebuyuan.com/2061960.html[/quote]  谢谢版主，我看到这个链接。argv里传来的是char类型的参数，现在要作为open里的mode参数。该如何转换才能成功呢？初学者，求版主给个解决办法，有点晕。谢谢版主[/quote]  字符串参数的应该是作为路径的参数吧，而不是标志参数[/quote]  是这样的，有一个main.c文件和一个creat.c文件。在main.c里通过get_opt函数获取到用户输入的选项后的值类似这样: demo -c filename mode  。两个值保存在argv[2],argv[3]里，get_opt函数种argv参数的类型是char型。然后通过creat(argv[2],argv[3])的方式使用creat.c里的creat函数，argv[2]中是filename，argv[3]中是mode（是用户输入用于创建文件的时候给予的文件属性）。 我有想到一个方式，在main.c拿到用户输入的mode的值转换为十进制，然后传入creat函数中，然后在creat中写三个switch嵌套。依次取三位数整型的第一位第二位第三位。依次掉入case中，定义一个mode_t类型的变量，最后赋值给这个变量。比较傻的方法。肯定有更好的办法。但是现在还没找到。= =太笨了自己[/quote]  那你只需要把字符串转成整数就可以了，不用管十进制还是八进制，因为他们在内存里都是一样的

引用 5 楼 user-2 的回复:[quote=引用 4 楼 zw1103053925 的回复:] [quote=引用 3 楼 user-2 的回复:] [quote=引用 2 楼 zw1103053925 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] char oct[20]; int v=100; sprintf(oct,"0%o",v); printf("%s\n",oct);   请问赵四老师。我要用open函数或者creat，传入的第三个参数是mode_t类型的，和上面的char型数组应该怎么转换呢？？[/quote]  mode_t是用你需要的标志组合来的，不是用一个数转换成8进制  参看：http://www.xuebuyuan.com/2061960.html[/quote]  谢谢版主，我看到这个链接。argv里传来的是char类型的参数，现在要作为open里的mode参数。该如何转换才能成功呢？初学者，求版主给个解决办法，有点晕。谢谢版主[/quote]  字符串参数的应该是作为路径的参数吧，而不是标志参数[/quote]  是这样的，有一个main.c文件和一个creat.c文件。在main.c里通过get_opt函数获取到用户输入的选项后的值类似这样: demo -c filename mode  。两个值保存在argv[2],argv[3]里，get_opt函数种argv参数的类型是char型。然后通过creat(argv[2],argv[3])的方式使用creat.c里的creat函数，argv[2]中是filename，argv[3]中是mode（是用户输入用于创建文件的时候给予的文件属性）。 我有想到一个方式，在main.c拿到用户输入的mode的值转换为十进制，然后传入creat函数中，然后在creat中写三个switch嵌套。依次取三位数整型的第一位第二位第三位。依次掉入case中，定义一个mode_t类型的变量，最后赋值给这个变量。比较傻的方法。肯定有更好的办法。但是现在还没找到。= =太笨了自己

引用 4 楼 zw1103053925 的回复:[quote=引用 3 楼 user-2 的回复:] [quote=引用 2 楼 zw1103053925 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] char oct[20]; int v=100; sprintf(oct,"0%o",v); printf("%s\n",oct);   请问赵四老师。我要用open函数或者creat，传入的第三个参数是mode_t类型的，和上面的char型数组应该怎么转换呢？？[/quote]  mode_t是用你需要的标志组合来的，不是用一个数转换成8进制  参看：http://www.xuebuyuan.com/2061960.html[/quote]  谢谢版主，我看到这个链接。argv里传来的是char类型的参数，现在要作为open里的mode参数。该如何转换才能成功呢？初学者，求版主给个解决办法，有点晕。谢谢版主[/quote]  字符串参数的应该是作为路径的参数吧，而不是标志参数

引用 3 楼 user-2 的回复:[quote=引用 2 楼 zw1103053925 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] char oct[20]; int v=100; sprintf(oct,"0%o",v); printf("%s\n",oct);   请问赵四老师。我要用open函数或者creat，传入的第三个参数是mode_t类型的，和上面的char型数组应该怎么转换呢？？[/quote]  mode_t是用你需要的标志组合来的，不是用一个数转换成8进制  参看：http://www.xuebuyuan.com/2061960.html[/quote]  谢谢版主，我看到这个链接。argv里传来的是char类型的参数，现在要作为open里的mode参数。该如何转换才能成功呢？初学者，求版主给个解决办法，有点晕。谢谢版主

引用 2 楼 zw1103053925 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] char oct[20]; int v=100; sprintf(oct,"0%o",v); printf("%s\n",oct);   请问赵四老师。我要用open函数或者creat，传入的第三个参数是mode_t类型的，和上面的char型数组应该怎么转换呢？？[/quote]  mode_t是用你需要的标志组合来的，不是用一个数转换成8进制  参看：http://www.xuebuyuan.com/2061960.html

引用 1 楼 zhao4zhong1 的回复:char oct[20]; int v=100; sprintf(oct,"0%o",v); printf("%s\n",oct);   请问赵四老师。我要用open函数或者creat，传入的第三个参数是mode_t类型的，和上面的char型数组应该怎么转换呢？？


Question: windows编程中创建TabControl的问题

引用 8 楼 ZiSheng 的回复:c+ +builder不也是调用windows–api吗？他怎么会简单！  它做了很多包装，代码量很少，而且界面可以用鼠标拖拉控件来设计，不写一行代码。

Coordinate Space and Transformation Functions The following functions are used with coordinate spaces and transformations.        ClientToScreen   CombineTransform   DPtoLP   GetCurrentPositionEx   GetGraphicsMode   GetMapMode   GetViewportExtEx   GetViewportOrgEx   GetWindowExtEx   GetWindowOrgEx   GetWorldTransform   LPtoDP   MapWindowPoints   ModifyWorldTransform   OffsetViewportOrgEx   OffsetWindowOrgEx   ScaleViewportExtEx   ScaleWindowExtEx   ScreenToClient   SetGraphicsMode   SetMapMode   SetViewportExtEx   SetViewportOrgEx   SetWindowExtEx   SetWindowOrgEx   SetWorldTransform

c+ +builder不也是调用windows–api吗？他怎么会简单！

解释不对，我的三个对话框宽度和高度各不一样，请看rc文件，获取的结果却是一样的！！！

1、用的单位是不同的，运行时获取的默认是像素  2、https://msdn.microsoft.com/en-us/library/ms645502(v=vs.85).aspx Converts the specified dialog box units to screen units (pixels). The function replaces the coordinates in the specified RECT structure with the converted coordinates, which allows the structure to be used to create a dialog box or position a control within a dialog box.   3、TabCtrl_AdjustRect是个宏，相当于发送TCM_ADJUSTRECT消息，调整控件大小  https://msdn.microsoft.com/zh-cn/library/bb760645

SDK编程挺繁琐的，不知道楼主对C++ Builder有没有兴趣呢？可以了解一下。 图形用户界面学习C++ Builder，入门比较容易。 仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ C++ Builder绘图示例（模拟时钟） http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/   书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社） 《C++Builder6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

赵老师，第二个问题和第三个问题似乎明白了，第一个问题呢？怎么解释呢？

引用 2 楼 zhao4zhong1 的回复:MapDialogRect The MapDialogRect function converts (maps) the specified dialog box units to screen units (pixels). The function replaces the coordinates in the specifiedRECT structure with the converted coordinates, which allows the structure to be used to create a dialog box or position a control within a dialog box.   BOOL MapDialogRect(   HWND hDlg,      // handle of dialog box   LPRECT lpRect   // address of structure with rectangle );   Parameters hDlg  Identifies a dialog box. This function accepts only handles for dialog boxes created by one of the dialog box creation functions; handles for other windows are not valid.  lpRect  Pointer to a RECT structure that contains the dialog box coordinates to be converted.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, callGetLastError.  Remarks The MapDialogRect function assumes that the initial coordinates in theRECT structure represent dialog box units. To convert these coordinates from dialog box units to pixels, the function retrieves the current horizontal and vertical base units for the dialog box, then applies the following formulas:   left   = (left   * baseunitX) / 4  right  = (right  * baseunitX) / 4  top    = (top    * baseunitY) / 8  bottom = (bottom * baseunitY) / 8    In most cases, the base units for the dialog box are the same as those retrieved by using the GetDialogBaseUnits function. If the dialog box template has the DS_SETFONT style, however, the base units are the average width and height, in pixels, of the characters in the font given by the template.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winuser.h.   Import Library: Use user32.lib.  See Also Dialog Boxes Overview, Dialog Box Functions, CreateDialog, CreateDialogIndirect, CreateDialogIndirectParam, CreateDialogParam, DialogBox, DialogBoxIndirect, DialogBoxIndirectParam, DialogBoxParam, GetDialogBaseUnits,RECT           TabCtrl_AdjustRect   VOID TabCtrl_AdjustRect(     HWND hwnd, 		     BOOL fLarger, 		     RECT FAR *prc		 );		  Calculates a tab control's display area given a window rectangle, or calculates the window rectangle that would correspond to a specified display area. You can use this macro or send the TCM_ADJUSTRECT message explicitly.   No return value.  hwnd  Handle to the tab control.  fLarger  Operation to perform. If this parameter is TRUE, prc specifies a display rectangle and receives the corresponding window rectangle. If this parameter is FALSE, prc specifies a window rectangle and receives the corresponding display area.  prc  Address of aRECT structure that specifies the given rectangle and receives the calculated rectangle.   --------------------------------------------------------------------------------   Top of Page  © 1997 Microsoft Corporation. All rights reserved. Terms of Use. 赵老师，第二个问题和第三个问题似乎明白了，第一个问题呢？怎么解释呢？

rc资源文件如下：  //Microsoft Developer Studio generated resource script. // #include "resource.h"  #define APSTUDIO_READONLY_SYMBOLS ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 2 resource. // #include "afxres.h"  ///////////////////////////////////////////////////////////////////////////// #undef APSTUDIO_READONLY_SYMBOLS  ///////////////////////////////////////////////////////////////////////////// // Chinese (P.R.C.) resources  #if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_CHS) #ifdef _WIN32 LANGUAGE LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED #pragma code_page(936) #endif //_WIN32  ///////////////////////////////////////////////////////////////////////////// // // Dialog //  IDD_MAIN DIALOG DISCARDABLE  0, 0, 288, 96 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 10, "System" BEGIN     DEFPUSHBUTTON   "OK",IDB_CLOSE,33,49,65,14     PUSHBUTTON      "Cancel",IDB_TEST,108,46,50,14 END  IDD_FIRSTDLG DIALOG DISCARDABLE  0, 0, 367, 154 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 10, "System" BEGIN     DEFPUSHBUTTON   "OK",IDOK,310,7,50,14     PUSHBUTTON      "Cancel",IDCANCEL,310,24,50,14 END  IDD_SECONDDLG DIALOG DISCARDABLE  0, 0, 187, 96 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 10, "System" BEGIN     DEFPUSHBUTTON   "OK",IDOK,130,7,50,14     PUSHBUTTON      "Cancel",IDCANCEL,130,24,50,14 END  IDD_THIRDDLG DIALOG DISCARDABLE  0, 0, 187, 216 STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU CAPTION "Dialog" FONT 10, "System" BEGIN     DEFPUSHBUTTON   "OK",IDOK,130,7,50,14     PUSHBUTTON      "Cancel",IDCANCEL,130,24,50,14 END   ///////////////////////////////////////////////////////////////////////////// // // DESIGNINFO //  #ifdef APSTUDIO_INVOKED GUIDELINES DESIGNINFO DISCARDABLE  BEGIN     IDD_MAIN, DIALOG     BEGIN         LEFTMARGIN, 7         RIGHTMARGIN, 281         TOPMARGIN, 7         BOTTOMMARGIN, 89     END      IDD_FIRSTDLG, DIALOG     BEGIN         LEFTMARGIN, 7         RIGHTMARGIN, 360         TOPMARGIN, 7         BOTTOMMARGIN, 147     END      IDD_SECONDDLG, DIALOG     BEGIN         LEFTMARGIN, 7         RIGHTMARGIN, 180         TOPMARGIN, 7         BOTTOMMARGIN, 89     END      IDD_THIRDDLG, DIALOG     BEGIN         LEFTMARGIN, 7         RIGHTMARGIN, 180         TOPMARGIN, 7         BOTTOMMARGIN, 209     END END #endif    // APSTUDIO_INVOKED   #ifdef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // TEXTINCLUDE //  1 TEXTINCLUDE DISCARDABLE  BEGIN     "resource.h\0" END  2 TEXTINCLUDE DISCARDABLE  BEGIN     "#include ""afxres.h""\r\n"     "\0" END  3 TEXTINCLUDE DISCARDABLE  BEGIN     "\r\n"     "\0" END  #endif    // APSTUDIO_INVOKED  #endif    // Chinese (P.R.C.) resources /////////////////////////////////////////////////////////////////////////////    #ifndef APSTUDIO_INVOKED ///////////////////////////////////////////////////////////////////////////// // // Generated from the TEXTINCLUDE 3 resource. //   ///////////////////////////////////////////////////////////////////////////// #endif    // not APSTUDIO_INVOKED    [/code]


Question: 【小白求助】vs2015输出字符的时候显示问号

scanf_s 在%c %s格式式，还要加上大小，你要写成：  scanf_s("%c", &a, 1);   或者  scanf("%c", &a);   或者  a = getchar();

scanf_s输入%c或者%s时，必须多传入一个参数用来指定输入的字符串的大小，否则会出错。 https://msdn.microsoft.com/en-us/library/w40768et.aspx?query=

用_s版，你还得加上变量大小 scanf_s("%c", &c, 1);


Question: hdu2005 实在不知道怎么错了 求指导

引用 1 楼 user-3 的回复:    a[1] = a[1] + 1;  这句修改是永久的。第一个闰年日期修正以后，后序的闰年日期再继续修正就全部是错的了。 程序中的 a 如果声明为 const，此类错误就很好抓了。 偶对 终于知道了 想了好久！！ 谢谢指教！！

#include<stdio.h>  int main(int argc, const char *argv[]) {     int y, m, d;     int a[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };    /* the length is 12 not 11 */     while (scanf(" %d/%d/%d", &y, &m, &d) != EOF)     {         int x = 0, i;         if ((y % 100 != 0 && y % 4 == 0) || (y % 400 == 0))         {             a[1] = a[1] + 1;         }         for (i = 0; i < m - 1; i++)         {             x = x + a[i];         }         x = x + d;         printf("%d\n", x);     }     return 0; }

引用 2 楼 paschen 的回复:一年有12个月吧，你的数组a里只有11个元素  计算的时候是用不到第12月的天数，没必要定义了，12月几号是前十一个月天数再加上最后的“几号”

一年有12个月吧，你的数组a里只有11个元素


Question: C语言程序编程代码疑问

搜“析构函数”

另外这个是C++语法，不是C语言

~CDB_Control_Dlg 表示析构函数  ::表示作用范围，即CDB_Control_Dlg::类中的~CDB_Control_Dlg函数

::是一个域的表示方法，表示CDB_Control_Dlg类有一个~CDB_Control_Dlg()函数，而~表示这是一个析构函数，析构函数和类名相同，没有返回值，只是前面加一个~ 符号

这是C++的概念，推荐：C++ Primer Plus，如果嫌太厚，清华的郑莉版的、钱能版的也不错。 如果想快速入门，买本200多页的书可以达到，然后还需要一本详细全面的。

CDB_Control_Dlg::~CDB_Control_Dlg()   //析构函数定义 类名             析构函数同类名前面加~，无返回值类型无参数


Question: TXT文档的输出问题

最好把你的out.txt测试文件也一并发出来；Linux和Windows下对文件回车符是不一样的Linux是\n, 但是windows下就是\r\n

使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。  下表将列出可用的句柄。  句柄      句柄的数字代号 描述 STDIN     0              键盘输入 STDOUT    1              输出到命令提示符窗口 STDERR    2              错误输出到命令提示符窗口 UNDEFINED 3-9            这些句柄由应用程序单独定义，并且是各个工具特定的。  数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个 句柄中的任何一个重定向。要指定想使用的句柄，可在重定向操作符前面键入该句柄的 数字。如果未定义句柄，则默认的 < 重定向输入操作符是 0，而默认的 > 重定向输出 操作符是 1。键入 > 或 < 操作符之后，必须指定要读取或写入数据的位置。可以指定 文件名或另一个现有的句柄。  要指定重定向到现有句柄，请使用与 (&) 字符，后面接要重定向的句柄号 （例如 &句柄#）。例如，下面的命令可以将句柄 2（即 STDERR）重定向到 句柄 1（即 STDOUT）：  2>&1  下表列出了可用于将输入和输出数据流进行重定向的操作符。  重定向操作符 描述 > 将命令输出写入到文件或设备（例如打印机）中，而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。  默认情况下，可以从键盘将命令输入（即 STDIN 句柄）发送到 Cmd.exe，然后由 Cmd.exe 将命令输出（即 STDOUT 句柄）发送到命令提示符窗口。  重定向输入 (<) 要将键盘输入重定向到文件或设备，请使用 < 操作符。例如，要从 File.txt 获取 sort 命令的输入，请键入：  sort<file.txt  File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。  < 操作符可以打开具有只读访问的指定文件名。所以，不能使用该操作符向文件中写入 信息。例如，如果以 <&2 启动程序，则所有试图读取句柄 0 的操作都将失败，因为句 柄 2 最初是以只写访问打开的。   注意  0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的 命令也会在命令提示符窗口显示消息和提示。  要将输出从命令提示符窗口重定向到文件或设备，请使用 > 操作符。可以在许多命令中 使用该操作符。例如，要将 dir 输出重定向到 Dirlist.txt，请键入：  dir>dirlist.txt  如果 Dirlist.txt 不存在，Cmd.exe 将创建该文件。如果 Dirlist.txt 存在，Cmd.exe 将使用 dir 命令的输出替换文件中的信息。  要运行 netsh routing dump 命令，然后将输出发送到 Route.cfg，请键入：  netsh routing dump>c:\route.cfg  > 操作符可以打开具有只写访问属性的指定文件。所以，不能使用该操作符读取文件。 例如，如果使用重定向 >&0 启动程序，则所有试图写入句柄 1 的操作都将失败，因为 句柄 0 最初是以只读访问打开的。   注意  1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如， 要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt，请键入：  dir>c:\file.txt 2>&1  复制句柄时，可以复制该句柄原状态的所有特性。例如，如果一个句柄具有只写访问的 属性，则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄 复制到另一个具有只写访问属性的句柄。  使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用，指定的文件必须已经存在。 如果输入文件存在，Cmd.exe 将以只读方式打开该文件，然后将文件中包含的字符作为 输入发送到此命令（如同从键盘输入一样）。如果指定了句柄，Cmd.exe 将指定的句柄 复制到系统现有的句柄中。  例如，要以句柄 0 输入读取（即 STDIN）的方式打开 File.txt，请键入：  <file.txt  要打开 File.txt，并在内容排序后将输出发送到命令提示符窗口（即 STDOUT），请键入：  sort<file.txt  要查找 File.txt，然后将句柄 1（即 STDOUT）和句柄 2（即 STDERR）重定向到 Search.txt，请键入：  findfile file.txt>search.txt 2<&1  要以句柄 0 输入读取（即 STDIN）的方式复制用户定义句柄 3，请键入：  <&3  使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名，Cmd.exe 将以只写方式打开文件并覆 盖该文件内容。如果指定了句柄，Cmd.exe 将文件复制到现有句柄中。  要将用户定义句柄 3 复制到句柄 1，请键入：  >&3  要将包括句柄 2（即 STDERR）的所有输出从 ipconfig 命令重定向到 句柄 1（即 STDOUT），然后将输出重定向到 Output.log，请键入：  ipconfig.exe>>output.log 2>&1  使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息，请使用两个连续 的大于号（即 >>）。例如，下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件：  dir>>dirlist.txt  要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾，请键入：  netstat>>tcpinfo.txt  使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出（默认情况下是 STDOUT），然后将其导入另 一个命令的输入中（默认情况下是 STDIN）。例如，下面的命令将对目录分类：  dir | sort  在本例中，将同时启动两个命令，但随后 sort 命令会暂停，直到它接收到 dir 命令 的输出为止。sort 命令使用 dir 命令的输出作为输入，然后将输出发送到 句柄 1（即 STDOUT）。  合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如，可以使用以 下命令存储包含“LOG”字符串的文件名:  dir /b | find "LOG" > loglist.txt  dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名 列表（例如，NetshConfig.log、Logdat.svd 和 Mylog.bat）存储在文件 Loglist.txt 中。  要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令将 搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名，并且在命令提示符窗口中 每次显示一屏：  dir c:\ /s /b | find "LOG" | more  利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。 find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择 的文件名（在命令提示符窗口中每次显示一屏）。有关筛选器命令的详细信息，请参阅 使用筛选器。

我试过了，用了\r\n也没用啊

txt中，换行符要用 \r\n  而不是 \n


Question: printf("%x")输出负数会输出很奇怪的一串东西，网上说是补码，不懂，求详解，谢谢！

public static member constant  <string> std::string::nposstatic const size_t npos = -1;Maximum value for size_t npos is a static member constant value with the greatest possible value for an element of type size_t.  This value, when used as the value for a len (or sublen) parameter in string's member functions, means "until the end of the string".  As a return value, it is usually used to indicate no matches.  This constant is defined with a value of -1, which because size_t is an unsigned integral type, it is the largest possible representable value for this type.   公共静态成员常量 <string> std :: string :: nposstatic const size_t npos = -1; size_t的最大值 npos是一个静态成员常数值，对于size_t类型的元素，它的值最大。  此值在用作字符串成员函数中len（或sublen）参数的值时，意味着“直到字符串结尾”。  作为返回值，它通常用于指示无匹配。  此常量定义为值-1，这是因为size_t是无符号整数类型，它是此类型的最大可能的可表示值。

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

自己搜 原码 反码 补码

哪奇怪了  -1的补码二进制就是32个1，十六进制就全是F

用 %x 输出有符号数是一个未定义行为

1的内存是:0000 00010000 0001//原1111 1110//取反1111 1111//+1,有符号就是-1而-1就是1的取反+1,即1111 1111 而%x是输出无符号的,所以就输出FF了 (PS:到底会输出几个FF就看你的编译器了,就是用多少位保存该数据或默认的类型) 1 编译器为16位。 int 占16位，-1的16进制值为0xFFFF。所以会输出 ffff 2 编译器为32位或者64位。 int占32位，-1的16进制为0xFFFFFFFF。所以会输出 ffffffff


Question: strcmp

4楼正解，不需要再用取地址符

引用 3 楼 bringtree 的回复:[quote=引用 1 楼 paschen 的回复:] 提示说的很明白嘛，类型不匹配嘛  你试下：strcmp(p->word,temp)!=0 这样呢 引用 2 楼 qq423399099 的回复:你的p->word有问题。 贴一下你的结构体类型，你的p->word应该是个指针类型吧？不需要取地址了  但是 平时赋值的时候为什么直接是这样子p->word = "aaaa";  如果 p->word 是个指针类型 不是应该*(p->word)="aaaa"[/quote]  如果p->word的类型是(const) char*的话，那么p->word = "aaaa"; 是对的，因为"aaaa"是字符数组，会退化为指针  但*(p->word)则是char类型，只是一个字符，而不是字符串

引用 1 楼 paschen 的回复:提示说的很明白嘛，类型不匹配嘛  你试下：strcmp(p->word,temp)!=0 这样呢 引用 2 楼 qq423399099 的回复:你的p->word有问题。 贴一下你的结构体类型，你的p->word应该是个指针类型吧？不需要取地址了  但是 平时赋值的时候为什么直接是这样子p->word = "aaaa";  如果 p->word 是个指针类型 不是应该*(p->word)="aaaa"


Question: 求助，一道招新的题目，看了很久都没搞懂，求大神帮忙

嗯，5#虽然与题目不符，但还是写的好。 楼上两位写的都好，我也跟着重新学习了一把。

va_arg, va_end, va_start Access variable-argument lists.  type va_arg( va_list arg_ptr, type );  void va_end( va_list arg_ptr );  void va_start( va_list arg_ptr );   (UNIX version)  void va_start( va_list arg_ptr, prev_param );   (ANSI version)  Routine Required Header Optional Headers Compatibility  va_arg <stdio.h> and <stdarg.h> <varargs.h>1 ANSI, Win 95, Win NT  va_end <stdio.h> and <stdarg.h> <varargs.h>1 ANSI, Win 95, Win NT  va_start <stdio.h> and <stdarg.h> <varargs.h>1 ANSI, Win 95, Win NT    1 Required for UNIX V compatibility.  For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  va_arg returns the current argument; va_start and va_end do not return values.  Parameters  type  Type of argument to be retrieved  arg_ptr  Pointer to list of arguments  prev_param  Parameter preceding first optional argument (ANSI only)  Remarks  The va_arg, va_end, and va_start macros provide a portable way to access the arguments to a function when the function takes a variable number of arguments. Two versions of the macros are available: The macros defined in STDARG.H conform to the ANSI C standard, and the macros defined in VARARGS.H are compatible with the UNIX System V definition. The macros are:  va_alist  Name of parameter to called function (UNIX version only)  va_arg  Macro to retrieve current argument  va_dcl  Declaration of va_alist (UNIX version only)  va_end  Macro to reset arg_ptr  va_list  typedef for pointer to list of arguments defined in STDIO.H  va_start  Macro to set arg_ptr to beginning of list of optional arguments (UNIX version only)  Both versions of the macros assume that the function takes a fixed number of required arguments, followed by a variable number of optional arguments. The required arguments are declared as ordinary parameters to the function and can be accessed through the parameter names. The optional arguments are accessed through the macros in STDARG.H or VARARGS.H, which set a pointer to the first optional argument in the argument list, retrieve arguments from the list, and reset the pointer when argument processing is completed.  The ANSI C standard macros, defined in STDARG.H, are used as follows:   All required arguments to the function are declared as parameters in the usual way. va_dcl is not used with the STDARG.H macros.   va_start sets arg_ptr to the first optional argument in the list of arguments passed to the function. The argument arg_ptr must have va_list type. The argument prev_param is the name of the required parameter immediately preceding the first optional argument in the argument list. If prev_param is declared with the register storage class, the macro’s behavior is undefined. va_start must be used before va_arg is used for the first time.   va_arg retrieves a value of type from the location given by arg_ptr and increments arg_ptr to point to the next argument in the list, using the size of type to determine where the next argument starts. va_arg can be used any number of times within the function to retrieve arguments from the list.   After all arguments have been retrieved, va_end resets the pointer to NULL.  The UNIX System V macros, defined in VARARGS.H, operate somewhat differently:   Any required arguments to the function can be declared as parameters in the usual way.   The last (or only) parameter to the function represents the list of optional arguments. This parameter must be named va_alist (not to be confused with va_list, which is defined as the type of va_alist).   va_dcl appears after the function definition and before the opening left brace of the function. This macro is defined as a complete declaration of the va_alist parameter, including the terminating semicolon; therefore, no semicolon should follow va_dcl.   Within the function, va_start sets arg_ptr to the beginning of the list of optional arguments passed to the function. va_start must be used before va_arg is used for the first time. The argument arg_ptr must have va_list type.   va_arg retrieves a value of type from the location given by arg_ptr and increments arg_ptr to point to the next argument in the list, using the size of type to determine where the next argument starts. va_arg can be used any number of times within the function to retrieve the arguments from the list.   After all arguments have been retrieved, va_end resets the pointer to NULL.  Example  /* VA.C: The program below illustrates passing a variable  * number of arguments using the following macros:  *      va_start            va_arg              va_end  *      va_list             va_dcl (UNIX only)  */  #include <stdio.h> #define ANSI            /* Comment out for UNIX version     */ #ifdef ANSI             /* ANSI compatible version          */ #include <stdarg.h> int average( int first, ... ); #else                   /* UNIX compatible version          */ #include <varargs.h> int average( va_list ); #endif  void main( void ) {    /* Call with 3 integers (-1 is used as terminator). */    printf( "Average is: %d\n", average( 2, 3, 4, -1 ) );     /* Call with 4 integers. */    printf( "Average is: %d\n", average( 5, 7, 9, 11, -1 ) );     /* Call with just -1 terminator. */    printf( "Average is: %d\n", average( -1 ) ); }  /* Returns the average of a variable list of integers. */ #ifdef ANSI             /* ANSI compatible version    */ int average( int first, ... ) {    int count = 0, sum = 0, i = first;    va_list marker;     va_start( marker, first );     /* Initialize variable arguments. */    while( i != -1 )    {       sum += i;       count++;       i = va_arg( marker, int);    }    va_end( marker );              /* Reset variable arguments.      */    return( sum ? (sum / count) : 0 ); } #else       /* UNIX compatible version must use old-style definition.  */ int average( va_alist ) va_dcl {    int i, count, sum;    va_list marker;     va_start( marker );            /* Initialize variable arguments. */    for( sum = count = 0; (i = va_arg( marker, int)) != -1; count++ )       sum += i;    va_end( marker );              /* Reset variable arguments.      */    return( sum ? (sum / count) : 0 ); } #endif   Output  Average is: 3 Average is: 8 Average is: 0   Argument Access Routines  See Also   vfprintf

我们都知道一般编译器往栈里塞数据是从右往左的，可变参数的函数自己本身是没有办法去知道自己往栈塞进去多少个数据，所以只能外部函数知道，所以要使用关键字__cdecll  简单的一个例子  int __cdecll Sum(int nCount, ...) {     int nSum = 0;     int* p = &nCount;     for(int i=0; i<nCount; ++i)     {         cout << *(++p) << endl;         nSum += *p;     }     return nSum; }

不要意思，少了个 va_end(marker);

int sum(int last, ...) { 	int x = 0, result = 0; 	va_list marker; 	va_start( marker, last);      	while( x != last) 	{ 		result += x; 		x = va_arg( marker, int); 	} 	result += x; 	return result; }  感觉这种可变参数有缺陷，不够通用。

参考 printf代码  int __cdecl printf (         const char *format,         ...         ) /*  * stdout 'PRINT', 'F'ormatted  */ {     va_list arglist;     int buffing;     int retval;      _VALIDATE_RETURN( (format != NULL), EINVAL, -1);      va_start(arglist, format);      _lock_str2(1, stdout);     __try {         buffing = _stbuf(stdout);          retval = _output_l(stdout,format,NULL,arglist);          _ftbuf(buffing, stdout);      }     __finally {         _unlock_str2(1, stdout);     }      return(retval); }


Question: 虚拟机下运行C程序，出现了segmentation fault(core dumped)，求大神帮解

1、既然你提到了出现 coredump了，所以请以后这样发贴的时候，可以将coredump信息发出来 2、如果你申请共享内存时，shmid_f不等于-1呢？ 3、加入程序可以正常执行，在程序结束的时候，是否应该执行IPC_RMID？ 4、错误处理也不够严谨  还需要多加练习

这个程序是为了开两个缓冲区，在这两个缓冲区上弄四个信号量@lilachue

没看明白你的代码。给你说一些方法来确定报错的代码范围：屏蔽部分代码/增加printf打印一些信息。另外，建议个体set_sembuf_struct里增加一个对空指针的判断。


Question: 萌新遇到一难题希望大神解答

引用 5 楼 DAWAMASTER 的回复:好吧谢谢TAT  题主你有没有认真看我的回复啊，真心着急。比如您这段代码： {case 1:for(n=0;n<5;n++)                     {                     if(a[n].chinese>a[n+1].chinese) 当n是4时，依然会执行这句比较chinese的分数的步骤，但您告诉我：a[4].chinese > a[4+1].chinese，这里的a[5]是什么鬼？？

“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

引用 5 楼 DAWAMASTER 的回复:好吧谢谢TAT  代码一段一段的调试, 不要着急. swtich里面 一个case一个case的调试

好吧谢谢TAT

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

这是题目QAQ，我已经要疯了，谁能帮帮我，改了下数组大小还是不对

题主您实在是太疏忽了，case中的for循环怎么能是【a < 5】呢？？应该是小于4啊，比如最后的a[4]你让它跟a[4+1]比较，不出错才怪

你的结构体数组a只有5个元素，也就是说有效索引只是0~4  你代码中多处下面这样的语句都已经越界了：  printf("%s\t%f",a[5].name,a[5].chinese);break;


Question: 来各位大神 看看这是什么意思咩 萌新有点慌张

引用 14 楼 paschen 的回复:[quote=引用 13 楼 xsklld 的回复:] [quote=引用 5 楼 paschen 的回复:] 只要输入的不是\n，就递归调用main函数  理解三目运算符  ? :  ( c=getchar())!= '\n' ? main(c,v),putchar() : 0  main函数不能被递归调用，见楼上。[/quote]  在C语言中，main函数可被递归调用，而在C++标准中，main函数不可以被递归调用  C++标准不允许，但大多数编译器都支持递归调用[/quote] 好吧，没注意提问版块。

引用 13 楼 xsklld 的回复:[quote=引用 5 楼 paschen 的回复:] 只要输入的不是\n，就递归调用main函数  理解三目运算符  ? :  ( c=getchar())!= '\n' ? main(c,v),putchar() : 0  main函数不能被递归调用，见楼上。[/quote]  在C语言中，main函数可被递归调用，而在C++标准中，main函数不可以被递归调用  C++标准不允许，但大多数编译器都支持递归调用

引用 5 楼 paschen 的回复:只要输入的不是\n，就递归调用main函数  理解三目运算符  ? :  ( c=getchar())!= '\n' ? main(c,v),putchar() : 0  main函数不能被递归调用，见楼上。

这个程序是错的，标准有明确规定main函数不能在程序里被调用。见  [basic.start.main] 引用The function main shall not be used within a program. ... [expr.call] 引用Recursive calls are permitted, except to the main function ([basic.start.main]).

各位大神  第一次用这个 给分好像给的有点问题 不是很会用 。请多多包涵 。感谢感谢

感谢各位大神的解惑 。我已经明白 。

引用 9 楼 qq_36891635 的回复:[quote=引用 7 楼 ri_aje 的回复:] [quote=引用 6 楼 Alexlord01 的回复:] 各位大神 能详细解释下么 ，不是很懂 。这个程序输出结果又是什么 。感激不尽！！！！！ 并且标准要求 c 应该是 v 数组中元素的个数，并且程序中不能调用 main，所以主楼是未定义行为。 一般情况下的行为是： main 里面每次从命令行上读取一个字符，如果是回车的话，就退出。否则，第归调用 main 自己，并且在第归结束后打印刚刚读取的字符。 程序实际运行过程中，每敲击一个字符，都会导致 main 函数第归一次，打回车后就把刚刚输入的字符全部再打印出来，只不过是原来的逆序，因为是先第归再 put 当前的。 严格来说用 putchar(c) 才对。[/quote]  两个问题： 1、为什么这里递归输出之后就是逆序，能更具体一点吗？ 因为我没有发现这里有 类似于 n*main（n-1）的程序？  2、将程序改成如下的，为什么不能输出逆序的结果，只能输出顺序的结果？求解？ #include <stdio.h>  int main(int c) { 	if ( c = getchar() !='\n'){ 		return (main(c)); 		putchar(c); 	} 	else  return 0; }[/quote] 1. 解释的已经很详细了，还不明白的话，只能把自己当计算机，一步一步的执行一遍程序试图理解了。 2. 因为先 return 了，豆面的 putchar 没有机会执行。实际上这个程序应该什么输出都没有才对，既不逆序也不顺序。

引用 4 楼 u010165006 的回复:putchar(c) 可以运行，逆序输出。  顺序输入一个字符串，以回车结束，结果是字符串逆序输出。 注意：putchar() 改成 putchar(c)

引用 6 楼 Alexlord01 的回复:各位大神 能详细解释下么 ，不是很懂 。这个程序输出结果又是什么 。感激不尽！！！！！ 并且标准要求 c 应该是 v 数组中元素的个数，并且程序中不能调用 main，所以主楼是未定义行为。 一般情况下的行为是： main 里面每次从命令行上读取一个字符，如果是回车的话，就退出。否则，第归调用 main 自己，并且在第归结束后打印刚刚读取的字符。 程序实际运行过程中，每敲击一个字符，都会导致 main 函数第归一次，打回车后就把刚刚输入的字符全部再打印出来，只不过是原来的逆序，因为是先第归再 put 当前的。 严格来说用 putchar(c) 才对。

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

引用 7 楼 ri_aje 的回复:[quote=引用 6 楼 Alexlord01 的回复:] 各位大神 能详细解释下么 ，不是很懂 。这个程序输出结果又是什么 。感激不尽！！！！！ 并且标准要求 c 应该是 v 数组中元素的个数，并且程序中不能调用 main，所以主楼是未定义行为。 一般情况下的行为是： main 里面每次从命令行上读取一个字符，如果是回车的话，就退出。否则，第归调用 main 自己，并且在第归结束后打印刚刚读取的字符。 程序实际运行过程中，每敲击一个字符，都会导致 main 函数第归一次，打回车后就把刚刚输入的字符全部再打印出来，只不过是原来的逆序，因为是先第归再 put 当前的。 严格来说用 putchar(c) 才对。[/quote]  两个问题： 1、为什么这里递归输出之后就是逆序，能更具体一点吗？ 因为我没有发现这里有 类似于 n*main（n-1）的程序？  2、将程序改成如下的，为什么不能输出逆序的结果，只能输出顺序的结果？求解？ #include <stdio.h>  int main(int c) { 	if ( c = getchar() !='\n'){ 		return (main(c)); 		putchar(c); 	} 	else  return 0; }

putchar(c) 可以运行，逆序输出。

引用 1 楼 jianwen0529 的回复:就是输入一行字符，然后打印出来  指正下，是逆序输出！

如果抛开main函数，你就会觉得一点都不神奇，简单的递归函数  用到 ? : 表达式 以及 逗号表达式！

就是输入一行字符，然后打印出来


Question: C语言程序

引用 2 楼 hzhgagaga 的回复:[quote=引用 1楼paschen 的回复:]printf("%d\n",i+1,sum/(m-1)); 你只有一个%d，但后面有两个要输出的   printf("%f\n",sum/n);    %f输出的是浮点型，sum/n 是整数除法，最后得到的是int类型 如果要浮点型，改成(float)sum / n我到了这一步，输入1或者2或者3或者4都会闪一下，但是最后没有任何结果显示[/quote]  因为你输入1或者2或者3或者4之后有了结果，程序立马又运行了main函数中的while里的system("cls"); 把所有内容全清空了

引用 3楼小灸舞 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。说的有道理，只是刚刚开始学，有些地方的错误我还是看不明白

引用 1楼paschen 的回复:printf("%d\n",i+1,sum/(m-1)); 你只有一个%d，但后面有两个要输出的   printf("%f\n",sum/n);    %f输出的是浮点型，sum/n 是整数除法，最后得到的是int类型 如果要浮点型，改成(float)sum / n我到了这一步，输入1或者2或者3或者4都会闪一下，但是最后没有任何结果显示


Question: 怎么查看函数的默认参数是什么

windows下学会使用dumpbin.exe linux下学会使用objdump

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

引用 5 楼 zhao4zhong1 的回复:C语言默认函数返回int，无参数。我猜。  自己定义的函数，调用时不加参数gcc会报错的，不知道wait为什么不报错，搞混了c应该是不支持默认参数的，更加不知道wait是怎么做到的

C语言默认函数返回int，无参数。我猜。

引用 2 楼 qq423399099 的回复:有的IDE支持直接右键函数名--转到定义 也可以查看MSDN：https://msdn.microsoft.com/en-us/library/w40768et.aspx http://www.cplusplus.com/reference/  sys/wait.h没看到有定义默认的值，不知道gcc为什么不报错

引用 1 楼 paschen 的回复:如果有默认参数，那么你可以不提供这个参数  VS上直接在函数名上右键——转到定义，即可跳转到函数定义位置  gcc也是奇葩的，没定义默认参数怎么不报错，或者gcc应该加哪个参数啊，linux下调试不熟，不知道直接wait()是不是随便找了个堆栈的值传进去


Question: 求助！问题出在哪里？

首先呢你的定义int 放在main函数里面，而且你要定义数组后再调用，数组不能是b［n］，数组大小一定要是申明数组这个变量时就确定的。如果要根据输入的值来确定数组的维数的话，这就要用到动态内存分配了。建议你好好看看相关数组的教学视频，补一下基础吧

定义数组不能使用变量，比如用new开辟空间

#include<stdio.h> #include <string.h>  #define ROW     8 #define COL     4   void calculate_matrix(int (*arr)[COL]); static void output_matrix(int *arr, int max, int col);  int main(int argc, const char *argv[]) {     int i, j, cnt = 1;      //printf("请输入矩阵的行数n与列数m:");     //scanf("%d%d",&n,&m);     int array[ROW][COL];      //printf("请输入整数矩阵");     for(i = 0; i <= ROW-1; i++) {         for(j = 0; j <= COL-1; j++) {             //scanf("%d",&array[i][j]);             array[i][j] = cnt++;   /* initize the matrix. */         }     }     printf("Initize the matrix: \n");     output_matrix(&array[0][0], COL * ROW, COL);     calculate_matrix(array);      return 0; }  /* Show the array data. */ static void output_matrix(int *arr, int max, int col) {     int i;      for (i = 0; i < max; i++) {         printf("%-8d", arr[i]);         if ((i + 1) % col == 0)             putchar(10);     }     putchar(10); } void calculate_matrix(int (*array)[COL]) {     int i, j, k;     int result[ROW][ROW];     int matrix_trans[COL][ROW];       /* matrix transpose */     for (i = 0; i < ROW; i++) {         for (j = 0; j < COL; j++) {             matrix_trans[j][i] = array[i][j];         }     }     printf("After matrix transpose: \n");     output_matrix(&matrix_trans[0][0], COL * ROW, ROW);      /* matrix multip */     int res = 0;     for (i = 0; i < ROW; i++) {         for (j = 0; j < ROW; j++) {             res = 0;             for (k = 0; k < COL; k++) {                 res += array[i][k] * matrix_trans[k][j];             }             result[i][j] = res;             //printf("result = %d\n", res);         }     }      printf("Show the result: \n");     output_matrix(&result[0][0], ROW * ROW, ROW); }  这是我改你的代码,改动比较大些,你可以试一下；一下是我的一些小建议: 1) 对于数组长度建议多用宏,C语言里是不支持变长数组的, 所以建议你使用宏(当然也可以动态申请空间,可以规避变长数组)； 2) 建议你的代码写简单一些, 对于矩阵转置和乘法,可以先做转置,再做乘法,并且分在两个函数里实现(我在一个函数里做的, 你可以再分一下)这样让读你代码的人更清晰你的每个步骤,也便于理解和查找你的问题； 3) 对于变量和函数名,最好能做到见名知义,对阅读你的代码会提高效率,同时对自己将来阅读自己的代码也是有好处的；代码写出来还是要让别人和将来的自己看的,不是只为了实现功能； 4) 若有多个功能,比如你需要做初始化矩阵,矩阵转置,最后矩阵相乘,输出结果；你可以分步输出验证每步是否有问题,这样对你验证最后结果是否正确有指导意义；建议你做一个输出查看函数； 最后,加油吧,在前进的道路上总有一些做的不好的地方,不过不要灰心,一点一点努力吧~

没有这种形式的语法：void y(int x[n][m])，不能两个维数都是不确定的值  建议动态申请内存吧（代码我直接复制楼上大神的）   int **z;         z = (int **)malloc(sizeof(int *)* n);     for (i = 0; i < n; i++)         z[i] = (int *)malloc(sizeof(int)* m);

y函数里int z[n][n];这种写法都是不对的。 可以写成用malloc来分配空间。(包含头文件stdlib.h)  int **z; 	for (i = 0; i < n; i++) 		z = (int **)malloc(sizeof(int *)* n); 	for (i = 0; i < n; i++) 		z[i] = (int *)malloc(sizeof(int)* n);


Question: 我用邻接表的写的DFS.输入有异常。求大佬帮我调试是一下。scanf("\n%c",&(G->verters[i]->data));

你的G->verters[i]指针还没指向有效对象，你就去访问他的data值自然出错了：G->verters[i]->data


Question: 关于二叉树的一个小问题

void creatree(BtNode tree) 这个函数你是按值传递的，所以你在函数中将申请到的内存只是赋值给了一个复制的对象，并不是你主函数中的root  解决问题你应该传递的是root的地址

引用 1 楼 user-2 的回复:我能帮你的是那个位置为什么会出问题，帮不了你哪个位置出了什么样的问题 也行。。都一样的。。

我能帮你的是那个位置为什么会出问题，帮不了你哪个位置出了什么样的问题


Question: 错误：不能发现libcrypto library

"-LC:\\msys\\1.0\\local\\ssl\\lib" 改为 -L"C:\\msys\\1.0\\local\\ssl\\lib" 再试试？


Question: 进制转换问题求解

就是在不用数组和递归的情况下考虑怎么做啊！

用大数的时候可以考虑用数组来存储

1024的时候，变量 z 已经溢出了  可以声明为long long ：  #include <stdio.h> #include <math.h> int main() { 	long int x,y,i,j,a; 	long long z; 	z=0; j=0; 	while(scanf("%ld",&x)) 	{ 		for(i=0;x!=1;i++) 		{ 			y=x%2; 			if(y==0) 			{ 				j++; 				x=x/2; 			} 			else 				break; 		} 		for(i=0;x!=1;i++) 		{ 			y=x%2; 			x=x/2; 			z=z+y; 			z=z*10; 		} 		z++; 		for(;z!=0;) 		{ 			a=z%10; 			z=z/10; 			printf("%ld",a); 		} 		for(;j>0;j--) 		{ 			printf("%d",0); 		} 	} 	getch(); 	return 0;   }  不过如果数字更大一样会溢出，更好的办法是改变你的算法

问题出在这里：for(i=0;x!=1;i++) {y=x%2; x=x/2; z=z+y; z=z*10;} 如果是1025或其他大于1024的奇数，那么到了循环的最后关头，z会溢出！因为int表示的最大值是有限的。。。


Question: #define中如何包含#if

你要针对不同的 #if 来定义不同的 #define 。

不能 换其他方法吧

参考gcc源代码中处理#define和#if相关片断。

引用 1 楼 sunyongliang118 的回复:#ifndef _DEBUG #define _DEBUG #else #define _DEBUG 999999 #endif 我需要的那个效果，这个debug的很常用的

我就是需要这样的效果，这个debug是知道的


Question: 关于BSS段的一些问题，求各位帮忙解惑

这么考虑是减小可执行文件的大小

bss段里面只是一些占位符并不分配真正的存储空间。

引用 5 楼 zyt5166096 的回复:[quote=引用 2 楼 q3733353520 的回复:] 把i=0改成i=10，再看看。 可能编译器默认把0值当作未初始化。 有些编译器把全局的未初始化变量存放在目标文件.bss段，有些则不存放，只是预留一个未定义的全局变量符号，等到最终链接成可执行文件的时候再在.bss段分配空间。  谢谢你！！ 好像是初始化为0的全局变量在生成obj文件后会保存在.bss段（当然并不占用obj的空间，只是一个大小的标识），没有初始化的全局变量则是先保存在common段，等到将obj链接的时候才放入bss段，应该是这个原因吧，但是我发现如果编译cpp文件的话没有初始化的全局变量也会存在obj的bss段[/quote] 编译器不一样，而且要确定不能是链接后的文件

引用 2 楼 q3733353520 的回复:把i=0改成i=10，再看看。 可能编译器默认把0值当作未初始化。 有些编译器把全局的未初始化变量存放在目标文件.bss段，有些则不存放，只是预留一个未定义的全局变量符号，等到最终链接成可执行文件的时候再在.bss段分配空间。  谢谢你！！ 好像是初始化为0的全局变量在生成obj文件后会保存在.bss段（当然并不占用obj的空间，只是一个大小的标识），没有初始化的全局变量则是先保存在common段，等到将obj链接的时候才放入bss段，应该是这个原因吧，但是我发现如果编译cpp文件的话没有初始化的全局变量也会存在obj的bss段

Unix FAQ section 1.3（http://www.faqs.org/faqs/unix-faq/faq/part1/section-3.html）里面有Unix和C语言之父Dennis Rithcie对BSS这个词由来的解释。 一般C语言的编译后执行语句都编译成机器代码，保存在.text段；已初始化的全局变量和局部静态变量都保存在. data段；未初始化的全局变量和局部静态变量一般放在一个叫.“bss”的段里。我们知道未初始化的全局变量和局部静态变量默认值都为0，本来它们也可以被放在.data段的，但是因为它们都是0，所以为它们在.data段分配空间并且存放数据0是没有必要的。程序运行的时候它们的确是要占内存空间的，并且可执行文件必须记录所有未初始化的全局变量和局部静态变量的大小总和，记为.bss段。所以.bss段只是为未初始化的全局变量和局部静态变量预留位置而已，它并没有内容，所以它在文件中也不占据空间。

为什么不参考gcc源代码相关片断呢？

求各位帮忙解答一下啊！！谢谢


Question: 如何将30个浮点数存入80个字节的空间中？

float  4个字节, 有3个字节保存的是精度, 可以删掉一个字节,这样精度下降了些 损失的精度 1/65536, 这个很小, 大多情况都可以的  如 1.33333     内存 ABAAAA3F 你可以去掉AB, 变成  ABAA3F  使用的时候自己补上 00ABAA3F, 也就是  1.33334

我觉得楼主真正需要的可能是一个合适大小的IO缓冲

1、转化为整数 2、保存为增量 3、使用压缩库

如果你是任意的 30 个浮点，那么是不可能的。不要尝试。 如果你的浮点数是特定的，自己处理一下，比如说大小，精度等等。  我们早年的时候，曾经使用的浮点数是实际的电力参数。 比如，电压，电流，相位 等等。 那么这些数的精度很小，大小也很小。比如相位 [0.0000-360.0000) 等等。

为什么要存入80个字节的空间中，什么命题？

即使有方法也不是１００%的情况适用吧。120个字节的信息量在那里，现在你要用80来存储肯定是有丢失的，毋庸置疑。 折中的办法就是将数值的范围压缩到一定的范围内例如本题可以压缩到120/80=1.5 也就是4/1.5= 2.6666个字节算下来就是 2.66*8=21位。没啥好办法。到时候还原的时候再扩展回去。

调用zlib

引用 3 楼 calen_ 的回复:楼主啊，你这个要求看着有些超乎常规，所以我有一毒计：把这30个浮点数排一排120个字节，6个数一组分5组算5个MD5散列值，正好80字节；然后要用这些浮点数的时候暴力搜索.........  直到宇宙的终结也搜索不出来。

压缩到2/3大小，这不是必然能保证的，但是可能性还是比较大的， 可以把30个float作为120个字节序列压缩，最简单的就是游程码压缩。

有如下方法可以一试 1.数据压缩。     如果数据有规律，那么压缩比就很大。 2.保存相对数据。     保存基准数据，其他数据保存与基准值的差值， 这样就不是每个浮点数都需要4 字节。


Question: des加密算法

仅供参考：#pragma comment(lib, "crypt32.lib") #pragma comment(lib, "advapi32.lib") #define _WIN32_WINNT 0x0400 #include <stdio.h> #include <windows.h> #include <wincrypt.h> #define KEYLENGTH  0x00800000 void HandleError(char *s); //-------------------------------------------------------------------- //  These additional #define statements are required. #define ENCRYPT_ALGORITHM CALG_RC4 #define ENCRYPT_BLOCK_SIZE 8 //   Declare the function EncryptFile. The function definition //   follows main. BOOL EncryptFile(     PCHAR szSource,     PCHAR szDestination,     PCHAR szPassword); //-------------------------------------------------------------------- //   Begin main. void main(void) {     CHAR szSource[100];     CHAR szDestination[100];     CHAR szPassword[100];     printf("Encrypt a file. \n\n");     printf("Enter the name of the file to be encrypted: ");     scanf("%s",szSource);     printf("Enter the name of the output file: ");     scanf("%s",szDestination);     printf("Enter the password:");     scanf("%s",szPassword);     //--------------------------------------------------------------------     // Call EncryptFile to do the actual encryption.     if(EncryptFile(szSource, szDestination, szPassword)) {         printf("Encryption of the file %s was a success. \n", szSource);         printf("The encrypted data is in file %s.\n",szDestination);     } else {         HandleError("Error encrypting file!");     } } // End of main //-------------------------------------------------------------------- //   Code for the function EncryptFile called by main. static BOOL EncryptFile(     PCHAR szSource,     PCHAR szDestination,     PCHAR szPassword) //-------------------------------------------------------------------- //   Parameters passed are: //     szSource, the name of the input, a plaintext file. //     szDestination, the name of the output, an encrypted file to be //         created. //     szPassword, the password. {     //--------------------------------------------------------------------     //   Declare and initialize local variables.     FILE *hSource;     FILE *hDestination;     HCRYPTPROV hCryptProv;     HCRYPTKEY hKey;     HCRYPTHASH hHash;     PBYTE pbBuffer;     DWORD dwBlockLen;     DWORD dwBufferLen;     DWORD dwCount;     //--------------------------------------------------------------------     // Open source file.     if(hSource = fopen(szSource,"rb")) {         printf("The source plaintext file, %s, is open. \n", szSource);     } else {         HandleError("Error opening source plaintext file!");     }     //--------------------------------------------------------------------     // Open destination file.     if(hDestination = fopen(szDestination,"wb")) {         printf("Destination file %s is open. \n", szDestination);     } else {         HandleError("Error opening destination ciphertext file!");     }     //以下获得一个CSP句柄     if(CryptAcquireContext(                 &hCryptProv,                 NULL,               //NULL表示使用默认密钥容器，默认密钥容器名                 //为用户登陆名                 NULL,                 PROV_RSA_FULL,                 0)) {         printf("A cryptographic provider has been acquired. \n");     } else {         if(CryptAcquireContext(                     &hCryptProv,                     NULL,                     NULL,                     PROV_RSA_FULL,                     CRYPT_NEWKEYSET))//创建密钥容器         {             //创建密钥容器成功，并得到CSP句柄             printf("A new key container has been created.\n");         } else {             HandleError("Could not create a new key container.\n");         }     }     //--------------------------------------------------------------------     // 创建一个会话密钥（session key）     // 会话密钥也叫对称密钥，用于对称加密算法。     // （注: 一个Session是指从调用函数CryptAcquireContext到调用函数     //   CryptReleaseContext 期间的阶段。会话密钥只能存在于一个会话过程）     //--------------------------------------------------------------------     // Create a hash object.     if(CryptCreateHash(                 hCryptProv,                 CALG_MD5,                 0,                 0,                 &hHash)) {         printf("A hash object has been created. \n");     } else {         HandleError("Error during CryptCreateHash!\n");     }     //--------------------------------------------------------------------     // 用输入的密码产生一个散列     if(CryptHashData(                 hHash,                 (BYTE *)szPassword,                 strlen(szPassword),                 0)) {         printf("The password has been added to the hash. \n");     } else {         HandleError("Error during CryptHashData. \n");     }     //--------------------------------------------------------------------     // 通过散列生成会话密钥     if(CryptDeriveKey(                 hCryptProv,                 ENCRYPT_ALGORITHM,                 hHash,                 KEYLENGTH,                 &hKey)) {         printf("An encryption key is derived from the password hash. \n");     } else {         HandleError("Error during CryptDeriveKey!\n");     }     //--------------------------------------------------------------------     // Destroy the hash object.     CryptDestroyHash(hHash);     hHash = NULL;     //--------------------------------------------------------------------     //  The session key is now ready.     //--------------------------------------------------------------------     // 因为加密算法是按ENCRYPT_BLOCK_SIZE 大小的块加密的，所以被加密的     // 数据长度必须是ENCRYPT_BLOCK_SIZE 的整数倍。下面计算一次加密的     // 数据长度。     dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;     //--------------------------------------------------------------------     // Determine the block size. If a block cipher is used,     // it must have room for an extra block.     if(ENCRYPT_BLOCK_SIZE > 1)         dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;     else         dwBufferLen = dwBlockLen;     //--------------------------------------------------------------------     // Allocate memory.     if(pbBuffer = (BYTE *)malloc(dwBufferLen)) {         printf("Memory has been allocated for the buffer. \n");     } else {         HandleError("Out of memory. \n");     }     //--------------------------------------------------------------------     // In a do loop, encrypt the source file and write to the destination file.     do {         //--------------------------------------------------------------------         // Read up to dwBlockLen bytes from the source file.         dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);         if(ferror(hSource)) {             HandleError("Error reading plaintext!\n");         }         //--------------------------------------------------------------------         // 加密数据         if(!CryptEncrypt(                     hKey,           //密钥                     0,              //如果数据同时进行散列和加密，这里传入一个                     //散列对象                     feof(hSource),  //如果是最后一个被加密的块，输入TRUE.如果不是输.                     //入FALSE这里通过判断是否到文件尾来决定是否为                     //最后一块。                     0,              //保留                     pbBuffer,       //输入被加密数据，输出加密后的数据                     &dwCount,       //输入被加密数据实际长度，输出加密后数据长度                     dwBufferLen))   //pbBuffer的大小。         {             HandleError("Error during CryptEncrypt. \n");         }         //--------------------------------------------------------------------         // Write data to the destination file.         fwrite(pbBuffer, 1, dwCount, hDestination);         if(ferror(hDestination)) {             HandleError("Error writing ciphertext.");         }     } while(!feof(hSource));     //--------------------------------------------------------------------     //  End the do loop when the last block of the source file has been     //  read, encrypted, and written to the destination file.     //--------------------------------------------------------------------     // Close files.     if(hSource)         fclose(hSource);     if(hDestination)         fclose(hDestination);     //--------------------------------------------------------------------     // Free memory.     if(pbBuffer)         free(pbBuffer);     //--------------------------------------------------------------------     // Destroy session key.     if(hKey)         CryptDestroyKey(hKey);     //--------------------------------------------------------------------     // Destroy hash object.     if(hHash)         CryptDestroyHash(hHash);     //--------------------------------------------------------------------     // Release provider handle.     if(hCryptProv)         CryptReleaseContext(hCryptProv, 0);     return(TRUE); } // End of Encryptfile //-------------------------------------------------------------------- //  This example uses the function HandleError, a simple error //  handling function, to print an error message to the standard error //  (stderr) file and exit the program. //  For most applications, replace this function with one //  that does more extensive error reporting. void HandleError(char *s) {     fprintf(stderr,"An error occurred in running the program. \n");     fprintf(stderr,"%s\n",s);     fprintf(stderr, "Error number %x.\n", GetLastError());     fprintf(stderr, "Program terminating. \n");     exit(1); } // End of HandleError

ok的啦啊啊


Question: 小白又来求助了。。。。调用函数的简单问题

请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

引用 4 楼 sixto47 的回复:[quote=引用 2 楼 jianwen0529 的回复:] sum=0; for(i=0;i<5;i++) sum+=s[i][j]; s[5][j]=sum/4; // 五个数据，但是你却只除以 4主要不是这个原因……每个答案都是-107374176.00[/quote]  首先你没有调用函数求平均值，所以你打印的值是没有经过初始化和赋值，就表现为未定义的一个值 第二你求5个学生4门成绩的平均值那个算法也是错的

引用 2 楼 jianwen0529 的回复:sum=0; for(i=0;i<5;i++) sum+=s[i][j]; s[5][j]=sum/4; // 五个数据，但是你却只除以 4  首先你没有调用函数求平均值，第二你求5个学生4门成绩的平均值那个算法也是错的

引用 5 楼 sixto47 的回复:引用 3 楼 paschen 的回复:你要问什么，我没有见到你函数中有调用average函数的语句啊，你希望的正确答案是什么想求5个学生四门课成绩 每一门课的平均成绩…………在主函数一开始就调用了啊……  void average(float a[6][4]);  这个只是函数声明，不是在调用函数，调用函数要写成 average(a);

引用 2 楼 jianwen0529 的回复:sum=0; for(i=0;i<5;i++) sum+=s[i][j]; s[5][j]=sum/4; // 五个数据，但是你却只除以 4主要不是这个原因……每个答案都是-107374176.00

代码出问题，如果没报错，有两种解决方案，一种是调试，一种是在每一截语句后面加输出，看看你语句中的变量值是否和你所想要的结果一样，不一样就说明你这截代码有问题，否则就继续往下，直到你找出问题来为止。

不明白你到底是要求列的平均值还是行的平均值？ 注意你开的数组的行数和列数


Question: 小白求助，关于指向指针的指针的使用的问题，求大神帮助，谢谢

引用 3 楼 paschen 的回复:主函数中：  while(tem[i]!='\0'&&i<100){  这里的 i 没有初始化就使用了  至于你标红的地方语法上没问题，代码的逻辑就没帮你看  不过这种代码的风格是不好的  谢谢，我会注意风格的

引用 1 楼 playinend 的回复:#include<stdio.h> #include<stdlib.h> #include<string.h> char ** found(char *,int); int main() { int i,num,count=0; char tem[100],* prt=tem,**p=NULL; printf("请输入你将要输入的单词的数量：\n"); scanf("%d",&num);							 printf("请输入你要输入的%d个单词：\n",num); getchar(); gets(tem); while(tem[i]!='\0'&&i<100){ 	int k=0; 	while(tem[i]!='\0'&&tem[i++]!=' '&&i<100) { 		k++; 	} 	count++; } if(count!=num){ 	printf("输入的单词的数量不正确！\n"); 	exit(0); }  //从下面开始 p=found(prt,num);          //把函数返回值赋给p printf("这里是你所输入的单词：\n"); for(i=0;i<num;i++){ printf("%s\n",p[i]); } return 0; } char ** found(char *prt,int num) { char ** p=NULL; p=(char **)malloc(sizeof(char *)*num); int i,j=0,len=0; char tem[20]; for(i=0;*(prt+i)!='\0';i++){ 	while(*(prt+i)!=' '&&*(prt+i)!='\0'){ 	tem[len++]=*(prt+i); 	i++; 	} 	tem[len]='\0'; 	p[j]=(char*)malloc(sizeof(char)*(len+1)); 	strncpy(p[j],tem,len+1); 	len=0; 	j++; } 	return p; }  我根据你的源程序改的 调试运行了两遍 没啥问题了应该   谢谢，根据你的代码我发现了我的问题所在。

引用 2 楼 qq423399099 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。   谢谢，下次我会先调试的


Question: C语言链表的问题.插入一个结点QAQ求大神解决

仅供参考：//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*q1,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将整个链表逆序     if (head->next!=NULL && head->next->next!=NULL) {         p=head->next;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head->next=p;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //84->28->20->23->96->19->59->97->29->41-> //84->28->05->20->23->96->19->59->97->29->41-> //84->28->05->20->96->19->59->97->29->41-> //05->19->20->28->29->41->59->84->96->97-> //97->96->84->59->41->29->28->20->19->05-> //41->29->28->20->19->05->97->96->84->59-> //

#include<stdio.h> //#include<malloc.h> #include<stdlib.h>   struct Student {     long num;     char name[10];     struct Student *next; };  #define LEN sizeof(struct Student)  struct Student *creat(void) {     struct Student*head;     struct Student*p1,*p2;     int cnt = 0;     p1 = (struct Student*)malloc(LEN);     head = NULL;     printf("Create a link: \n");     printf("Please input student's id and name(id = 0 exit cycle): ");     scanf("%ld%s", &(p1->num), p1->name);     while(p1->num != 0) {         cnt++;         if(cnt == 1)             head = p1;         else             p2->next = p1;         p2 = p1;         p1 = (struct Student*)malloc(LEN);         printf("Please input student's id and name(id = 0 exit cycle): ");         scanf("%ld%s", &(p1->num), p1->name);     }     free(p1);    /* Should free the node if you don't use it.*/     p2->next = NULL;      return(head); }  struct Student * insert(struct Student *head,int t) {     int i = 1;     struct Student *pcur, *prev, *pnew;      pcur = head;     pnew = (struct Student*)malloc(LEN);     printf("\n输入新结点的结构体num name\n");     scanf("%ld%s", &(pnew->num), pnew->name);     pnew->next = NULL;  /* point null*/     if (t == 0) {    /* Insert at head. */         pnew->next = head;         head = pnew;         return head;     }      while(i != t && pcur->next != NULL) {    /* check condition. */         prev = pcur;         pcur = pcur->next;         i++;     }     if (i == t) {         prev->next = pnew;         pnew->next = pcur;     } else {         pcur->next = pnew;     }      return(head); } int main(int argc, const char *argv[]) {     struct Student *pt, *pk, *pp;     int k;      pt = creat();     pp = creat();     while(pt != NULL) {         printf("\nnum:%ld\tname:%s\n", pt->num, pt->name);         pt = pt->next;     }     printf("\n输入插入结构体结点位置：");     scanf("%d", &k);     pk = insert(pp, k);     printf("\n输出新表：\n");     while(pk != NULL) {   /* pk not pt. This is a bug. */         printf("\nnum:%ld\tname:%s\n", pk->num, pk->name);         pk = pk->next;     }     return 0; }  添加将新节点插在头节点之前的情况.

#include<stdio.h> //#include<malloc.h> #include<stdlib.h>   struct Student {     long num;     char name[10];     struct Student *next; };  #define LEN sizeof(struct Student)  struct Student *creat(void) {     struct Student*head;     struct Student*p1,*p2;     int cnt = 0;     p1 = (struct Student*)malloc(LEN);     head = NULL;     printf("Create a link: \n");     printf("Please input student's id and name(id = 0 exit cycle): ");     scanf("%ld%s", &(p1->num), p1->name);     while(p1->num != 0) {         cnt++;         if(cnt == 1)             head = p1;         else             p2->next = p1;         p2 = p1;         p1 = (struct Student*)malloc(LEN);         printf("Please input student's id and name(id = 0 exit cycle): ");         scanf("%ld%s", &(p1->num), p1->name);     }     free(p1);    /* Should free the node if you don't use it.*/     p2->next = NULL;      return(head); }  struct Student * insert(struct Student *head,int t) {     int i = 0;     struct Student *pcur, *prev, *pnew;      pcur = head;     pnew = (struct Student*)malloc(LEN);     printf("\n输入新结点的结构体num name\n");     scanf("%ld%s", &(pnew->num), pnew->name);     pnew->next = NULL;  /* point null*/      while(i != t && pcur->next != NULL) {    /* check condition. */         prev = pcur;         pcur = pcur->next;         i++;     }     if (i == t) {         prev->next = pnew;         pnew->next = pcur;     } else {         pcur->next = pnew;     }      return(head); } int main(int argc, const char *argv[]) {     struct Student *pt, *pk, *pp;     int k;      pt = creat();     pp = creat();     while(pt != NULL) {         printf("\nnum:%ld\tname:%s\n", pt->num, pt->name);         pt = pt->next;     }     printf("\n输入插入结构体结点位置：");     scanf("%d", &k);     pk = insert(pp, k);     printf("\n输出新表：\n");     while(pk != NULL) {   /* pk not pt. This is a bug. */         printf("\nnum:%ld\tname:%s\n", pk->num, pk->name);         pk = pk->next;     }     return 0; }  根据你的代码修改了一些bug,测试没问题了； 对你有一些建议: 1) 代码排版尽量美观一些,代码该有的空格尽量流出来,这样别人看你的代码会舒服一些； 2) 变量命名尽量做到见名知义, 不能随便对变量和函数名命名,这样别人看你的代码会比较累； 3) 对返回值多做判断,因为不能保证每次都能保证不出错,比如在堆上申请空间等等； 代码写好不是一天两天的功夫就能做到的；只要坚持不懈,你离大牛就不远了, 加油吧~

引用要输两次0才能输出链表是为什么？  那你就在必要地方设置断点，然后单步跟踪程序运行，看每次输入是在哪里被接收，接收到的值是多少


Question: 数据结构课设作业，但是不会修改。求助。想要在一元多次计算器程序中加入赋值计算功能

令x=1.23 求3*x^3+2*x^2-x+1

一元多次。。。你得将这个问题讲出来吧，和你想解决的问题直接以来就一段自己写的代码，我自己的代码我看起来都头大，还看别人的完整代码。

case 4:下面  printf(f);  改成  print(f);


Question: opencv新手求助！运行hog-svm代码的时候错误显示“ml”不是“cv”的成员

你好楼主，你的问题解决了么？我也遇到了这个问题。

谢谢 我换成了opencv3.0版本能够运行成功了！

是不是opencv版本的问题，建议看看官方文档说明

将这行注释掉再试试。

您好 还是没有解决我的问题 一直显示 namespace“cv”没有成员“ml”


Question: 使用单链表来弄约瑟夫环问题运行不了啊 求教

变量建议尽量使用单词或单词的缩写形式；这样别人看你的代码能够明白你的思想,我们写的代码还是主要让别人看得嘛

#include<stdio.h> #include<stdlib.h> #include<string.h> //#include<malloc.h>  struct chil {     int num;     char name[20];     struct chil *next; };  struct chil *cir(int num) {     struct chil*head, *prev, *cur;     int i;      head = NULL;     for(i = 0; i < num; i++) {         cur = (struct chil*)malloc(sizeof(struct chil));         if (!cur) {             printf("Malloc error!");             return NULL;         }         cur->next = NULL;         cur->num = i+1;         //scanf("%s",cur->name);         snprintf(cur->name, 20-1, "%c", 'A'+i);         if (!head) {             head = cur;             prev = cur;         } else {             prev->next = cur;             prev = prev->next;         }     }     prev->next = head;     return head; }  static void test_out(struct chil *phead) {     struct chil *pcur = phead->next;      printf("num = %d\t name = %s\n", phead->num, phead->name);     while (pcur != phead) {         printf("num = %d\t name = %s\n", pcur->num, pcur->name);         pcur = pcur->next;     } }  int output( struct chil *head, int start, int step, int total) {     struct chil *p, *q;     int count = 0;     int num = 1, i;      q = head;     /*     while(q->next != head)         q = q->next;     */     for(i = 0; i < start-1; i++)         q = q->next;      while(count < total-1) {         p = q->next;         num++;         if(!(num % step)) {             q->next = p->next;             printf("%s\n", p->name);             free(p);             count++;         } else {             q = p;         }     }     printf("num = %d\t, name = %s\n", q->num, q->name);      return 0; } int main(int argc, const char *argv[]) {     int total, step, start;     struct chil*head;     printf("Please input total test number: ");     scanf("%d", &total);     head = cir(total);     test_out(head);     scanf("%d%d", &start, &step);     output(head, start, step, total);      return 0; }  LZ对比一下吧,建议, 1)代码写的不要太挤,该加空格的还是要加空格；2)指针的使用上还带加强；

在oj上运行就是Time Limit Exceeded 我也不懂0.0.

int i,int n;  改成  int i, n;

引用 2 楼 user-3 的回复:int i,int n;  改成  int i, n; 我试了 还是不行啊 还是会异常终止