Question: 求大神帮帮忙，看一下是哪里的错误！

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

//电费进度条 void dfjdt01() { 	int zx02; 	int i; 	system("cls"); 	gotoxy(28,11); 	printf("正在充值!!"); 	gotoxy(1,12); 	for(i=0;i<=79;i++) 	{ 		Sleep(10); 		printf(">"); 		if(i>=79) 		{ 			gotoxy(28,11); 			printf("充值成功!!"); 		} 	} 	while(1) 	{ 			system("cls"); 			printf("\t\t    --------------------------------------------\n"); 			printf("                    |           是否前往用户中心?              |\n"); 			printf("                    |           1=是的                         |\n"); 			printf("                    |           2=我要回到电费充值中心         |\n"); 			printf("                    |请输入您的选项:                           |\n"); 			printf("\t\t    --------------------------------------------\n"); 			gotoxy(37,5); 			fflush(stdin); 			scanf("%d",&zx02); 			if(zx02==1) 			{ 				jdt(); 				main(); 			} 			else if(zx02==2) 			{ 				jdt(); 				dfye01(); 			} 			else 			{ 				gotoxy(30,8); 				printf("对不起，您的输入有误,请确认后在输入!"); 				system("pause>null&&cls"); 			} 	} }   //网费进度条 //网费进度条  void wfjdt01() { 	int zx02; 	int i; 	system("cls"); 	gotoxy(28,11); 	printf("正在充值!!"); 	gotoxy(1,12); 	for(i=0;i<=79;i++) 	{ 		Sleep(10); 		printf(">"); 		if(i>=79) 		{ 			gotoxy(28,11); 			printf("充值成功!!"); 		} 	} 	while(1) 	{ 			system("cls"); 			printf("\t\t    --------------------------------------------\n"); 			printf("                    |           是否前往用户中心?              |\n"); 			printf("                    |           1=是的                         |\n"); 			printf("                    |           2=我要回到宽带充值中心         |\n"); 			printf("                    |请输入您的选项:                           |\n"); 			printf("\t\t    --------------------------------------------\n"); 			gotoxy(37,5); 			fflush(stdin); 			scanf("%d",&zx02); 			if(zx02==1) 			{ 				jdt(); 				main(); 			} 			else if(zx02==2) 			{ 				jdt(); 				wfye01(); 			} 			else 			{ 				gotoxy(30,8); 				printf("对不起，您的输入有误,请确认后在输入!"); 				system("pause>null&&cls"); 			} 	} }

一个帐号放不上来那么多， 这是下面的函数  //电费函数 void dfye01() { 	int czzx01; 	int yhczdf01; 	char yhczdfzf01; 	int yhye01; 	float dlye01; 	FILE *wj1; 	FILE *wj2; 	wj1=fopen("yhjr01.txt","r"); 	fscanf(wj1,"%d",&yhye01); 	pclose(wj1); 	wj2=fopen("yh01df.txt","r"); 	fscanf(wj2,"%f",&dlye01); 	pclose(wj2); 	while(1) 	{ 		system("cls"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------|龙腾银行|--------------------------------------"); 		printf("-----------------------------|电费查询或充值|-----------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------|当前电费余额:                   元|------------------------"); 		printf("--------------------|当前银行卡上余额:               元|------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("|1.充值|------------|请输入您的选项:         |--------------------------|2.返回|"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		gotoxy(35,5); 		printf("%.2f",dlye01); 		gotoxy(39,6); 		printf("%d",yhye01); 		gotoxy(37,8); 		scanf("%d",&czzx01); 		if(czzx01==1) 		{ 			gotoxy(1,11); 			printf("\n\n"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|请输入充值金额|-------------------------------------"); 			printf("---------------------------|            元|-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|y=确认充值    |-------------------------------------"); 			printf("---------------------------|n=我不想充了  |-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("-------------------|请输入您的选项(y/n):              |-------------------------"); 			printf("--------------------------------------------------------------------------------"); 			gotoxy(29,15); 			fflush(stdin); 			scanf("%d",&yhczdf01); 			gotoxy(41,20); 			fflush(stdin); 			scanf("%c",&yhczdfzf01); 			if(yhczdfzf01=='y') 			{ 				if(yhye01>yhczdf01) 				{ 					yhye01=yhye01-yhczdf01; 					wj1=fopen("yhjr01.txt","w"); 					fprintf(wj1,"%d",yhye01); 					pclose(wj1); 					dlye01=(dlye01+(float)(yhczdf01)); 					wj2=fopen("yh01df.txt","w"); 					fprintf(wj2,"%f",dlye01); 					pclose(wj2); 					dfjdt01(); 				} 				else 				{ 					printf("您没有银行卡里没有这么多钱!"); 					main(); 				} 			} 			else if(yhczdfzf01=='n') 			{ 				jdt(); 				main(); 			} 		} 		else if(czzx01==2) 		{ 			main(); 		} 		else 		{ 			printf("您的输入有误,请确认后在输入!"); 			system("pause>null&&cls"); 		} 	} 	 }     //网费函数 void wfye01()  { 	int czzx02; 	int yhczdf02; 	char yhczdfzf02; 	int yhye02; 	float dlye02; 	FILE *wj1; 	FILE *wj2; 	wj1=fopen("yhjr01.txt","r"); 	fscanf(wj1,"%d",&yhye02); 	pclose(wj1); 	wj2=fopen("yh01wf.txt","r"); 	fscanf(wj2,"%f",&dlye02); 	pclose(wj2); 	while(1) 	{ 		system("cls"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------|龙腾银行|--------------------------------------"); 		printf("---------------------------|宽带余额查询或充值|---------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------|当前宽带余额:                   元|------------------------"); 		printf("--------------------|当前银行卡上余额:               元|------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("|1.充值|------------|请输入您的选项:         |--------------------------|2.返回|"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		gotoxy(37,5); 		printf("%.2f",dlye02); 		gotoxy(39,6); 		printf("%d",yhye02); 		gotoxy(37,8); 		scanf("%d",&czzx02); 		if(czzx02==1) 		{ 			gotoxy(1,11); 			printf("\n\n"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|请输入充值金额|-------------------------------------"); 			printf("---------------------------|            元|-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|y=确认充值    |-------------------------------------"); 			printf("---------------------------|n=我不想充了  |-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("-------------------|请输入您的选项(y/n):              |-------------------------"); 			printf("--------------------------------------------------------------------------------"); 			gotoxy(29,15); 			fflush(stdin); 			scanf("%d",&yhczdf02); 			gotoxy(41,20); 			fflush(stdin); 			scanf("%c",&yhczdfzf02); 			if(yhczdfzf02=='y') 			{ 				if(yhye02>yhczdf02) 				{ 					yhye02=yhye02-yhczdf02; 					wj1=fopen("yhjr01.txt","w"); 					fprintf(wj1,"%d",yhye02); 					pclose(wj1); 					dlye02=(dlye02+(float)(yhczdf02)); 					wj2=fopen("yh01wf.txt","w"); 					fprintf(wj2,"%f",dlye02); 					pclose(wj2); 					wfjdt01(); 				} 				else 				{ 					printf("您没有银行卡里没有这么多钱!"); 					main(); 				} 			} 			else if(yhczdfzf02=='n') 			{ 				jdt(); 				main(); 			} 		} 		else if(czzx02==2) 		{ 			jdt(); 			main(); 		} 		else 		{ 			printf("您的输入有误,请确认后在输入!"); 			system("pause>null&&cls"); 		} 	} }     //进度条函数 void jdt() { 	int i; 	system("cls"); 	gotoxy(28,11); 	printf("预防电信网络诈骗!"); 	gotoxy(1,12); 	for(i=0;i<=79;i++) 	{ 		Sleep(10); 		printf(">"); 	} }   //光标定位函数 //光标定位模块  //gotoxy(43,8);X代表横坐标,y代表纵坐标  void gotoxy(int x,int y) //extern void gotoxy(int x,int y) { 	COORD c; 	c.X=x-1; 	c.Y=y-1; 	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); }   //话费进度条函数 void hfjdt01() { 	int zx01; 	int i; 	system("cls"); 	gotoxy(28,11); 	printf("正在充值!!"); 	gotoxy(1,12); 	for(i=0;i<=79;i++) 	{ 		Sleep(10); 		printf(">"); 		if(i>=79) 		{ 			gotoxy(28,11); 			printf("充值成功!!"); 		} 	} 	while(1) 	{ 			system("cls"); 			printf("\t\t    --------------------------------------------\n"); 			printf("                    |           是否前往用户中心?              |\n"); 			printf("                    |           1=是的                         |\n"); 			printf("                    |           2=我要回到话费充值中心         |\n"); 			printf("                    |请输入您的选项:                           |\n"); 			printf("\t\t    --------------------------------------------\n"); 			gotoxy(37,5); 			fflush(stdin); 			scanf("%d",&zx01); 			if(zx01==1) 			{ 				jdt(); 				main(); 			} 			else if(zx01==2) 			{ 				jdt(); 				hfye01(); 			} 			else 			{ 				gotoxy(30,8); 				printf("对不起，您的输入有误,请确认后在输入!"); 				system("pause>null&&cls"); 			} 	} }   //水费进度条函数 void sfjdt01() { 	int zx02; 	int i; 	system("cls"); 	gotoxy(28,11); 	printf("正在充值!!"); 	gotoxy(1,12); 	for(i=0;i<=79;i++) 	{ 		Sleep(10); 		printf(">"); 		if(i>=79) 		{ 			gotoxy(28,11); 			printf("充值成功!!"); 		} 	} 	while(1) 	{ 			system("cls"); 			printf("\t\t    --------------------------------------------\n"); 			printf("                    |           是否前往用户中心?              |\n"); 			printf("                    |           1=是的                         |\n"); 			printf("                    |           2=我要回到水费充值中心         |\n"); 			printf("                    |请输入您的选项:                           |\n"); 			printf("\t\t    --------------------------------------------\n"); 			gotoxy(37,5); 			fflush(stdin); 			scanf("%d",&zx02); 			if(zx02==1) 			{ 				jdt(); 				main(); 			} 			else if(zx02==2) 			{ 				jdt(); 				sfye01(); 			} 			else 			{ 				gotoxy(30,8); 				printf("对不起，您的输入有误,请确认后在输入!"); 				system("pause>null&&cls"); 			} 	} }  //天然气进度条函数 void trqjdt01() { 	int zx02; 	int i; 	system("cls"); 	gotoxy(28,11); 	printf("正在充值!!"); 	gotoxy(1,12); 	for(i=0;i<=79;i++) 	{ 		Sleep(10); 		printf(">"); 		if(i>=79) 		{ 			gotoxy(28,11); 			printf("充值成功!!"); 		} 	} 	while(1) 	{ 			system("cls"); 			printf("\t\t    --------------------------------------------\n"); 			printf("                    |           是否前往用户中心?              |\n"); 			printf("                    |           1=是的                         |\n"); 			printf("                    |           2=我要回到天然气充值中心       |\n"); 			printf("                    |请输入您的选项:                           |\n"); 			printf("\t\t    --------------------------------------------\n"); 			gotoxy(37,5); 			fflush(stdin); 			scanf("%d",&zx02); 			if(zx02==1) 			{ 				jdt(); 				main(); 			} 			else if(zx02==2) 			{ 				jdt(); 				trqye01(); 			} 			else 			{ 				gotoxy(30,8); 				printf("对不起，您的输入有误,请确认后在输入!"); 				system("pause>null&&cls"); 			} 	} }

//天然气余额函数 void trqye01() { 	int czzx02; 	int yhczdf02; 	char yhczdfzf02; 	int yhye02; 	float dlye02; 	FILE *wj1; 	FILE *wj2; 	wj1=fopen("yhjr01.txt","r"); 	fscanf(wj1,"%d",&yhye02); 	pclose(wj1); 	wj2=fopen("yh01qf.txt","r"); 	fscanf(wj2,"%f",&dlye02); 	pclose(wj2); 	while(1) 	{ 		system("cls"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------|龙腾银行|--------------------------------------"); 		printf("--------------------------|天然气余额查询或充值|--------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------|当前天然气余额:                 元|------------------------"); 		printf("--------------------|当前银行卡上余额:               元|------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("|1.充值|------------|请输入您的选项:         |--------------------------|2.返回|"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		gotoxy(37,5); 		printf("%.2f",dlye02); 		gotoxy(39,6); 		printf("%d",yhye02); 		gotoxy(37,8); 		scanf("%d",&czzx02); 		if(czzx02==1) 		{ 			gotoxy(1,11); 			printf("\n\n"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|请输入充值金额|-------------------------------------"); 			printf("---------------------------|            元|-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|y=确认充值    |-------------------------------------"); 			printf("---------------------------|n=我不想充了  |-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("-------------------|请输入您的选项(y/n):              |-------------------------"); 			printf("--------------------------------------------------------------------------------"); 			gotoxy(29,15); 			fflush(stdin); 			scanf("%d",&yhczdf02); 			gotoxy(41,20); 			fflush(stdin); 			scanf("%c",&yhczdfzf02); 			if(yhczdfzf02=='y') 			{ 				if(yhye02>yhczdf02) 				{ 					yhye02=yhye02-yhczdf02; 					wj1=fopen("yhjr01.txt","w"); 					fprintf(wj1,"%d",yhye02); 					pclose(wj1); 					dlye02=(dlye02+(float)(yhczdf02)); 					wj2=fopen("yh01qf.txt","w"); 					fprintf(wj2,"%f",dlye02); 					pclose(wj2); 					trqjdt01(); 				} 				else 				{ 					printf("您没有银行卡里没有这么多钱!"); 					main(); 				} 			} 			else if(yhczdfzf02=='n') 			{ 				jdt(); 				main(); 			} 		} 		else if(czzx02==2) 		{ 			main(); 		} 		else 		{ 			printf("您的输入有误,请确认后在输入!"); 			system("pause>null&&cls"); 		} 	} }

//水费余额函数 void sfye01() { 	int czzx02; 	int yhczdf02; 	char yhczdfzf02; 	int yhye02; 	float dlye02; 	FILE *wj1; 	FILE *wj2; 	wj1=fopen("yhjr01.txt","r"); 	fscanf(wj1,"%d",&yhye02); 	pclose(wj1); 	wj2=fopen("yh01sf.txt","r"); 	fscanf(wj2,"%f",&dlye02); 	pclose(wj2); 	while(1) 	{ 		system("cls"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------|龙腾银行|--------------------------------------"); 		printf("-----------------------------|水费查询或充值|-----------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------|当前水费余额:                   元|------------------------"); 		printf("--------------------|当前银行卡上余额:               元|------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("|1.充值|------------|请输入您的选项:         |--------------------------|2.返回|"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		gotoxy(35,5); 		printf("%.2f",dlye02); 		gotoxy(39,6); 		printf("%d",yhye02); 		gotoxy(37,8); 		scanf("%d",&czzx02); 		if(czzx02==1) 		{ 			gotoxy(1,11); 			printf("\n\n"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|请输入充值金额|-------------------------------------"); 			printf("---------------------------|            元|-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|y=确认充值    |-------------------------------------"); 			printf("---------------------------|n=我不想充了  |-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("-------------------|请输入您的选项(y/n):              |-------------------------"); 			printf("--------------------------------------------------------------------------------"); 			gotoxy(29,15); 			fflush(stdin); 			scanf("%d",&yhczdf02); 			gotoxy(41,20); 			fflush(stdin); 			scanf("%c",&yhczdfzf02); 			if(yhczdfzf02=='y') 			{ 				if(yhye02>yhczdf02) 				{ 					yhye02=yhye02-yhczdf02; 					wj1=fopen("yhjr01.txt","w"); 					fprintf(wj1,"%d",yhye02); 					pclose(wj1); 					dlye02=(dlye02+(float)(yhczdf02)); 					wj2=fopen("yh01sf.txt","w"); 					fprintf(wj2,"%f",dlye02); 					pclose(wj2); 					sfjdt01(); 				} 				else 				{ 					printf("您没有银行卡里没有这么多钱!"); 					main(); 				} 			} 			else if(yhczdfzf02=='n') 			{ 				jdt(); 				main(); 			} 		} 		else if(czzx02==2) 		{ 			main(); 		} 		else 		{ 			printf("您的输入有误,请确认后在输入!"); 			system("pause>null&&cls"); 		} 	} }

//话费余额函数 void hfye01() { 	int czzx02; 	int yhczdf02; 	char yhczdfzf02; 	int yhye02; 	float dlye02; 	FILE *wj1; 	FILE *wj2; 	wj1=fopen("yhjr01.txt","r"); 	fscanf(wj1,"%d",&yhye02); 	pclose(wj1); 	wj2=fopen("yh01hf.txt","r"); 	fscanf(wj2,"%f",&dlye02); 	pclose(wj2); 	while(1) 	{ 		system("cls"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------|龙腾银行|--------------------------------------"); 		printf("---------------------------|通信余额查询或充值|---------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------|当前通信余额:                   元|------------------------"); 		printf("--------------------|当前银行卡上余额:               元|------------------------"); 		printf("--------------------------------------------------------------------------------"); 		printf("|1.充值|------------|请输入您的选项:         |--------------------------|2.返回|"); 		printf("--------------------------------------------------------------------------------"); 		printf("--------------------------------------------------------------------------------"); 		gotoxy(35,5); 		printf("%.2f",dlye02); 		gotoxy(39,6); 		printf("%d",yhye02); 		gotoxy(37,8); 		scanf("%d",&czzx02); 		if(czzx02==1) 		{ 			gotoxy(1,11); 			printf("\n\n"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|请输入充值金额|-------------------------------------"); 			printf("---------------------------|            元|-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("---------------------------|y=确认充值    |-------------------------------------"); 			printf("---------------------------|n=我不想充了  |-------------------------------------"); 			printf("--------------------------------------------------------------------------------"); 			printf("-------------------|请输入您的选项(y/n):              |-------------------------"); 			printf("--------------------------------------------------------------------------------"); 			gotoxy(29,15); 			fflush(stdin); 			scanf("%d",&yhczdf02); 			gotoxy(41,20); 			fflush(stdin); 			scanf("%c",&yhczdfzf02); 			if(yhczdfzf02=='y') 			{ 				if(yhye02>yhczdf02) 				{ 					yhye02=yhye02-yhczdf02; 					wj1=fopen("yhjr01.txt","w"); 					fprintf(wj1,"%d",yhye02); 					pclose(wj1); 					dlye02=(dlye02+(float)(yhczdf02)); 					wj2=fopen("yh01hf.txt","w"); 					fprintf(wj2,"%f",dlye02); 					pclose(wj2); 					hfjdt01(); 				} 				else 				{ 					printf("您没有银行卡里没有这么多钱!"); 					main(); 				} 			} 			else if(yhczdfzf02=='n') 			{ 				jdt(); 				main(); 			} 		} 		else if(czzx02==2) 		{ 			main(); 		} 		else 		{ 			printf("您的输入有误,请确认后在输入!"); 			system("pause>null&&cls"); 		} 	} }


Question: c语言字符串作为函数输入问题

符号常量，其特点是编译后写在代码区，不可寻址，不可更改，属于指令的一部分。

因为传递"1234"，这个字符串是在只读数据段上，那么它只能只读，不能写。test函数里对其赋值，就是写操作，所以就会出现段错误。 而传递ss，ss是在栈上申请的空间，具有读写操作的权限。所以没问题。 char ss[]="1234";  这句的含义是将”1234“从只读数据段拷贝至数组ss中。

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

因为test("1234") 等于 const char *ss = "1234"; test(ss);  所以

字符串是一个常量！   void test(char *ss){ss[0]='9';}   char ss[]="1234";   这种方式没有问题是因为，定义数组时，将字符串中的数据复制到数组中，而test函数中修改的是数组ss，而不是字符串；  test("1234") 这种方式则是直接把字符串的首地址赋值到形参变量ss中，那么ss所指向的就是一个字符串。  这两个的地址值是不一样的，而且差距很大，可以根据这一点做一个简单的区分。

引用 4 楼 Cy_Chance 的回复:符号常量，其特点是编译后写在代码区，不可寻址，不可更改，属于指令的一部分。 胡扯！


Question: C语言有关strstr（）的问题

引用 3 楼 qq_35922958 的回复:引用 1 楼 wyyy2088511 的回复:strstr返回值是个字符串它的返回值不是子串的地址吗，如果不是就返回空，额我百度的说是这样用的 试试这段代码你就明白了 #include <iostream> #include <cstring> using namespace std;  int main () { 	char a[10],b[10],*p; 	cin >> a >> b; 	p = strstr(a,b); 	cout << p << endl; 	cout << *p << endl; 	return 0; }

被我注释掉的flag部分，当加上它后，可以运行。只是即使buf是line的子串，flag也是0，得不到正确的指针。求教大神可否是我哪里使用错误。

引用 7 楼 cfjtaishan 的回复:引用 4 楼 qq_35922958 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 建议从文件中读取后，就先输出来，看看从文件里读出的数据是否正确。另外， 注意下strstr函数使用读取的没有错误，这段代码我单独拿出来运行是没有问题的，但是与socket结合起来就有问题。 你在确认一下从对端发过来的数据是正确的吗？[/quote] 是的，接收到的buf也是正确的。

引用 4 楼 qq_35922958 的回复:引用 2 楼 cfjtaishan 的回复:建议从文件中读取后，就先输出来，看看从文件里读出的数据是否正确。另外， 注意下strstr函数使用读取的没有错误，这段代码我单独拿出来运行是没有问题的，但是与socket结合起来就有问题。 你在确认一下从对端发过来的数据是正确的吗？

你要将strstr返回值赋值给一个变量，如果为空则停止，不空则下一次第一个参数用该变量继续寻找  strstr用法参看：http://en.cppreference.com/w/c/string/byte/strstr

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

strstr返回值是个字符串


Question: 请大家帮忙解答一个关于数组和指针的问题！

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

引用 楼主 shihenglee 的回复:大家好，我是一个C语言初学者，现在学到指针了，遇到一个问题，请大家帮忙解答一下。问题如下：   #include<stdio.h> #include<stdlib.h> #include<Windows.h> int main() { 	int i; 	int nums[5] = {1,2,3,4,5}; 	int * ptr_nums = nums;  	for(i = 0; i < 5; i++) 	{ 		printf("数组元素 %d 的地址是 %p \n",nums[i],ptr_nums); 		ptr_nums++; 	} 	system("pause"); }             其中，ptr_nums++ 等价于 ptr_nums + sizeof(int)；那么ptr_nums[i]应该是多少？或者说等价于多少？  指针进行++时，具体移动的字节是和指针类型相关的 如果是int32类型的指针，那就是移动sizeof(int)，同理，如果是double类型的指针，那就是移动sizeof(double)

那个说法完全不正确，首先指针本身是int类型的指针，他的偏移量就是int所占的字节。假设int *p;则有p[i]等价于*(p+i)，注意这里i要为正整数，如果是负整数是另一种情况。

引用 5 楼 xy_kok 的回复:ptr_nums++ 等价于 ptr_nums + sizeof(int)；  这句话没有问题吗？  做一个简单的推算： ptr_nums++  等价于  ptr_nums   = ptr_nums  + 1 然而 ptr_nums + sizeof(int)  则是 ptr_nums  + 4 那么 ptr_nums  + 1 和 ptr_nums  + 4 明显不相等  由于ptr_nums是一个整形指针，所以每次+1 的偏移量是sizeof（int）  嗯，可能是我的表述有问题，但是在程序中，我们的确是用ptr_nums++来做指针偏移的。

引用 1 楼 shihenglee 的回复:问了一个朋友，说ptr_nums[i]等价于ptr_nums + sizeof(int) * i；不知道是否正确？  他说的是错的.  ptr_nums[i]  等价于 ptr_nums+i  因为ptr_nums是是int类型指针, 它移动1,  就是按数据类型来的.

http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

[quote=引用 2 楼 cfjtaishan 的回复:] 他说的是对的。 明白了，谢谢

引用 1 楼 shihenglee 的回复:问了一个朋友，说ptr_nums[i]等价于ptr_nums + sizeof(int) * i；不知道是否正确？ 他说的是对的。 其实，自己完全可以去验证这个是否正确，那就是用下面的代码： #include<stdio.h> #include<stdlib.h> #include<Windows.h>  int main() {     int i;     int nums[5] = {1,2,3,4,5};     int *ptr_nums = nums;      for(i = 0; i < 5; i++)     {         printf("数组元素 %d 的地址是 %p \n",nums[i], ptr_nums);         printf("addr %p, %p\n", &nums[i], ptr_nums + sizeof(int) * i);         ptr_nums++;     }     system("pause"); }


Question: vs2010调试中刷新代码的问题

点击Build -------  Rebuild Solution菜单，重新编译，然后再运行。

看一下生成的可执行程序文件的时间，是不是已经更新了？


Question: 问一个关于http协议的问题

服务端程序逻辑有误。

先了解HTTP协议, 请求报文如果没有附加数据(GET/HEAD等)收到双换行才停止recv, 如果有(POST/PUT等)还需要收Content-Length字节, 没有这个字段则请求非法

引用 14 楼 zhao4zhong1 的回复:wireshark 服务端用tcpdump  引用 14 楼 zhao4zhong1 的回复:wireshark 服务端用tcpdump抓包发现，服务端的数据也只发了第一次write数据的值，为什么会出现这种情况，write的返回值对，数据确发不出。

引用 7 楼 cfjtaishan 的回复:引用 6 楼 kang2618 的回复:[quote=引用 4楼自信男孩 的回复:][quote=引用 2 楼 kang2618 的回复:] [quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？[/quote] 是的，但是这是两次发过去的数据，它认为没有收到数据包吧，即数据包认为为空。 还是要通过wireshark或者其他工具抓一下看看 [/quote] 抓包发现只能收到第一次write的值，但是服务器端每次的write都是成功的啊。

引用 13 楼 zhao4zhong1 的回复:在没问题和有问题两种环境下使用抓包软件wirwshark抓包对比。 用wireshark抓包看了下，第一种情况抓的协议是http协议，第二种不知道为什么抓成了tcp协议，然后协议头后面的数据包都没有读  引用 14 楼 zhao4zhong1 的回复:wireshark 抓包发现只能收到第一次write的值，但是服务器端每次的write都是成功的啊。

引用 7楼自信男孩 的回复:引用 6 楼 kang2618 的回复:[quote=引用 4楼自信男孩 的回复:][quote=引用 2 楼 kang2618 的回复:] [quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？[/quote] 是的，但是这是两次发过去的数据，它认为没有收到数据包吧，即数据包认为为空。 还是要通过wireshark或者其他工具抓一下看看 [/quote]好吧，我回去试一下，这个能抓到浏览器的请求跟接受包。

《Http权威指南》

引用 6 楼 kang2618 的回复:引用 4楼自信男孩 的回复:[quote=引用 2 楼 kang2618 的回复:] [quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？[/quote] 是的，但是这是两次发过去的数据，它认为没有收到数据包吧，即数据包认为为空。 还是要通过wireshark或者其他工具抓一下看看

引用 4楼自信男孩 的回复:引用 2 楼 kang2618 的回复:[quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？

引用 3楼www_adintr_com 的回复:检查下 write 的返回值吧  如果 socket 是异步的, 需要检查到 socket 可写状态后再调用 write 比较好返回值是对的，说明确实是发送成功了。

引用 2 楼 kang2618 的回复:引用 1楼ckc 的回复:最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。

引用 1楼ckc 的回复:最后加个回车换行试下试了，不行

最后加个回车换行试下

wireshark

在没问题和有问题两种环境下使用抓包软件wirwshark抓包对比。

http头部加上Connection: Keep-Alive字段试下。

引用 7 楼 cfjtaishan 的回复:引用 6 楼 kang2618 的回复:[quote=引用 4楼自信男孩 的回复:][quote=引用 2 楼 kang2618 的回复:] [quote=引用 1楼ckc 的回复:]最后加个回车换行试下试了，不行 应该是不能分两次发送，因为第二个发送对端就不识别发送的数据了，因为没有协议头。 分两次发送，到达对端的也是两次。 建议，可以通过wireshark抓一下，看看对端是否收到了分开的两个包，第二个但网卡收到了，但是没有解析。[/quote]http协议不应该是先读书协议头，然后根据content-length读取响应的字节吗？[/quote] 是的，但是这是两次发过去的数据，它认为没有收到数据包吧，即数据包认为为空。 还是要通过wireshark或者其他工具抓一下看看 [/quote] 			String str = "HTTP/1.1 404 NOT FOUND\r\n" + 							"Content-Type: text/html\r\n" + 							"Content-Length: 79\r\n" + 							"Server: zhttpd\r\n" + 							"\r\n"; 			String str2 = "" + 					"<title>NOT FOUND</title>" + 					"
NOT FOUND
" + 					""; 			os.write(str.getBytes()); 			os.write(str2.getBytes()); 换成java的就没问题，很尬尴

引用 8 楼 zhao4zhong1 的回复:《Http权威指南》 			String str = "HTTP/1.1 404 NOT FOUND\r\n" + 							"Content-Type: text/html\r\n" + 							"Content-Length: 79\r\n" + 							"Server: zhttpd\r\n" + 							"\r\n"; 			String str2 = "" + 					"<title>NOT FOUND</title>" + 					"
NOT FOUND
" + 					""; 			os.write(str.getBytes()); 			os.write(str2.getBytes()); 换成java的就没问题，很尬尴


Question: C语言txt文件读写，可以输入但不能写到文件中去

打开文件的时候试试用wb+

既然使用fscanf和fprintf，那么写入格式和读取格式应该一样才可以。比较一下，写入和读取的格式一样吗？  fprintf(fp,"%d\t%s\t%s\t%d-%d-%d\t\n",bk[i].num,bk[i].name,bk[i].publish,bk[i].t.year,bk[i].t.month,bk[i].t.day);  fscanf(fp,"%d\t%s\t%s\n%d-%d-%d\n",&bk[i].num,bk[i].name,bk[i].publish,&bk[i].t.year,&bk[i].t.month,&bk[i].t.day) 另外，scanf对于第二个是%s，那么前面还加了一个&,怀疑你的结构体定义这个变量是数组；  逻辑相对比较混乱，先写入，再读取。写入之后建议关闭fp，读取之前再次打开文件。

fflush fclose


Question: 出现0xC00000FD: Stack overflow错误，应该怎么改正，求大神解决！

仅供参考：#include <stdio.h> #include <string.h> #include <stdlib.h> #include <locale.h> #include <conio.h> const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; void show(int ST[10],int ist,char op[10],int iop,int last,char *expr,char *pp,int level) {     int i;      printf("level:%d\n",level);     printf("last:%s\n",last==DIGIT?"DIGIT":"OPREATOR");     printf("expr:%s\n",expr);     printf("pp^ :%*s^\n",pp-expr,"");     printf("ST:");     for (i=0;i<ist;i++) printf(" %d",ST[i]);     printf("\n");     printf("op:");     for (i=0;i<iop;i++) printf(" %c",op[i]);     printf("\n");     printf("\n");     getch(); } int calc(char *expr,char **addr,int level) {     int ST[10]={0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*pp;     int ist=1,iop=1,last;     char cc;      pp=expr;     last = !DIGIT;     printf("calc函数开始...\n");show(ST,ist,op,iop,last,expr,pp,level);      if ((c=*pp)=='!') {         printf("遇!，改栈底为!\n");         op[0] = c;         pp++;         show(ST,ist,op,iop,last,expr,pp,level);     }     while (1) {         c=*pp;         if (c==0) break;         if (c=='(') {             printf("遇(，递归调用calc...\n");             ST[ist++]=calc(++pp,addr,level+1);             pp = *addr;             last = DIGIT;             show(ST,ist,op,iop,last,expr,pp,level);         } else if (c==')') {             pp++;             show(ST,ist,op,iop,last,expr,pp,level);             break;         } else if (c=='+'||c=='*') {             if (last != DIGIT) {                 printf("运算符粘连\n");exit(5);             }             pp++;             if (c=='+') {                 printf("遇+，计算栈中保存的表达式...\n");                 show(ST,ist,op,iop,last,expr,pp,level);                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] |= ST[ist];break;                     case '*':  ST[ist-1] &= ST[ist];break;                     case '!':  ST[ist-1] =1-ST[ist];break;                     }                     show(ST,ist,op,iop,last,expr,pp,level);                 } while (iop);                 op[iop++] = c;                 printf("计算结果...\n");show(ST,ist,op,iop,last,expr,pp,level);             } else if (c=='*') {                 cc = op[iop-1];                 if (cc=='+') {                     printf("遇*，且栈顶是+，将*压栈...\n");                     op[iop++] = c;                     show(ST,ist,op,iop,last,expr,pp,level);                 } else {                     printf("遇*，且栈顶是*或!，将旧栈顶两数*的结果或旧栈顶!的结果作为新栈顶...\n");                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] &= ST[ist];break;                     case '!':  ST[ist-1] =1-ST[ist];break;                     }                     show(ST,ist,op,iop,last,expr,pp,level);                 }             }             last = !DIGIT;         } else if (c=='!') {             printf("遇!，将!和0压栈\n");             op[iop++] = c;             ST[ist++] =0;             pp++;             show(ST,ist,op,iop,last,expr,pp,level);         } else {             if (last == DIGIT) {                 printf("两数字粘连\n");exit(7);             }             if (!(pp[0]=='0'||pp[0]=='1')) {                 printf("非法字符\n");exit(8);             }             printf("遇%c，压栈...\n",pp[0]);             ST[ist++]=pp[0]-'0';             pp++;             last = DIGIT;             show(ST,ist,op,iop,last,expr,pp,level);         }     }     *addr=pp;     if (iop>=ist) {         printf("表达式有误\n");exit(9);     }     printf("calc函数结束前计算栈中保存的表达式...\n");show(ST,ist,op,iop,last,expr,pp,level);     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] |= ST[ist];break;         case '*':  ST[ist-1] &= ST[ist];break;         case '!':  ST[ist-1] =1-ST[ist];break;         }         show(ST,ist,op,iop,last,expr,pp,level);     }     printf("返回计算结果...\n");show(ST,ist,op,iop,last,expr,pp,level);     return ST[0]; } int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入布尔表达式，比如!(1+1)*1：");fflush(stdout);         rewind(stdin);         gets(s);         if (s[0]==0) break;//         printf("%s的最终结果为%d\n",s,calc(s,&endss,1));     }     return 0; }

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

if(' ' != ch) buffer[n++] = ch; 这个判断是什么意思？是不是应该去掉这个判断，直接执行buffer[n++] = ch;n呢


Question: 路径设置问题

引用 2 楼 baishen2484 的回复:具体怎么写呢？ 建议看一下字符串操作里的strcpy, strcat,尤其是strcat函数

具体怎么写呢？

pszSrcFile\文件名 用字符串拼接，把目录名和文件名拼接在一起

#include <stdio.h> #include <string.h> const char* pszSrcFile = "F:\\chengxu\\ImageCut\\Image\\MSS2.tiff"; char s[512]; char t[512]; char *p; int i,n; int main() {     p=strrchr(pszSrcFile,'.');     if (p) {         n=5;         _snprintf(s,p-pszSrcFile,"%s",pszSrcFile);         for (i=1;i<=n;i++) {             sprintf(t,"%s_%d.tiff",s,i);             printf("%s\n",t);         }     }     return 0; } //F:\chengxu\ImageCut\Image\MSS2_1.tiff //F:\chengxu\ImageCut\Image\MSS2_2.tiff //F:\chengxu\ImageCut\Image\MSS2_3.tiff //F:\chengxu\ImageCut\Image\MSS2_4.tiff //F:\chengxu\ImageCut\Image\MSS2_5.tiff //


Question: 调用函数后为什么没有执行？？

排序应该是这样： void sort(struct student *a, int len ) { 	int i, j; 	struct student t;  	for (i=0; i<len-1; i++) 	{ 		for (j=0; j<len-1-i; j++) 		{ if (a[j].score < a[j+1].score) 			{ 				t = a[j]; 				a[j] = a[j+1]; 				a[j+1] = t; 			} 		} 	} }

楼主冒泡排序写的有问题： if (a[j].score < a[j].score) 这句判断永远是不成立的

if (a[j].score < a[j].score) 你这判断条件写的也太马虎了吧，当然都不执行直接跳过啊

应该不是定义了struct student t的问题，t 只是用来做冒泡排序的中间变量。感觉还是指针用的不对吧

sort函数中定义了：  struct student t;  这样写函数里面处理的是这个t， 而不是传进来的pArr，因此没有达到目的。  如果对您有帮助，请采纳答案好吗，谢谢！

程序调用了调用函数，想对把学生信息按照学生成绩多少排序，但是最后执行的时候，发现调用函数没有执行，依然没有排序，各位大神帮忙看看是什么原因？


Question: c语言数组和指针的问题

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

同意一楼和二楼

#include <stdio.h>  void minmax(int *a, int len, int *max, int *min);  int main(void) {     int a[] = {1,2,3,4,5,6,7,8,9,12,13,14,16,17,21,23,5,};     int min, max;     printf("minmax sizeof(a)=%lu\n", sizeof(a));     printf("main a=%p\n",a);     // printf("a[0]=%d\n",a[0]);     minmax(a,sizeof(a)/sizeof(a[0]),&min,&max);     printf("a[0] = %d\n", a[0]);     printf("min = %d, max = %d\n",min,max);     return 0; } void minmax(int *a,int len,int *min,int *max) {     int i;     printf("minmax sizeof(a)=%lu\n", sizeof(a));     printf("main a=%p\n",a);     //a[0]=600;     *min= *max = a[0];     for (i = 1; i < len; i++){         if (a[i] < *min){             *min = a[i];         }         if (a[i]> *max) {             *max = a[i];         }     } } 去掉那句a[0] = 600;就可以了 注意，数组下标是从0开始，而不是从1开始的。比如数组长度是10，那么下标是从0～9  这个问题跟指针和数组似乎没多大关系；

因为a[0]的1已经被600覆盖了。所以，最小值是2；


Question: C语言中,如果使用realloc时,数据移动会造成什么影响?

1，现有堆内存够，原有基础上扩展 2，现有堆内存不够，重新分配并且拷贝值

影响就是realloc后不要指望指针地址没变。

提醒：Linux下，malloc,calloc,realloc,free都是开源的。

首先要大致了解内存分配的方法，多数内存分配是基于MBC块的，即每一个内存块都是有个头，所有的内存块以链表方式链接，多数情况下出于效能原因会维持一个空闲内存链表。所以，一个已用内存之后就可能是一块空闲内存，好了，回到realloc 1）在当前内存块之后存在一个空闲内存块，其空闲内存块的大小+当前内存大小大于realloc要求的内存，此时，直接将之后空闲内存拆分为两个：一块和当前内存合并，另一块即新的空闲内存。修改相应表，此时，Realloc返回地址指针不会改变 2）反之，如果当前内存块紧邻不是空闲内存，或空闲内存块大小不够，此时，会在其他地方重新申请一个realloc申请大小的内存，同时，将之前的数据复制到新内存块，释放旧内存空间。此时，realloc返回地址指针会发生变化（主要问题，原地址指针不可用） 因此，解决方式，通常多数情况下我们假定realloc返回地址指针不是之前的地址指针  内存分配有三个函数：malloc、calloc、realloc。注意：malloc可以认为是基础，很多时候如果不介意效能，realloc和calloc可以用malloc实现，绝没有malloc不够内存会调用realloc一说。

数据移动是系统控制的，判断是否需要移动也是系统控制的。如果你要做内存管理相关的控制，需要考虑这个问题，否则可以不用考虑这个可能的拷贝数据的问题。

内存不够的话，找不到合适空间，就会失败。如果数据量太大，拷贝的时候又会费事。

这段话的意思就是如果这块内存后面的自由内存能满足扩张需求那么就直接扩张 否则就找一块新的内存并把旧数据拷贝过去  有什么问题么？

malloc 分配的内存不够用会用到realloc


Question: 现在想实现一个trace.log文件，文件是定长的，新生成的内容添加到文件的末尾，当超过文件大小时，在文件前面的内容被删除，而文件大小需要保持不变。

if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }  } else {             fclose(flog);  } 感觉逻辑不通啊， if (rename(logfilename1,logfilename2))

if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }  } else {             fclose(flog);  } 效率不是很高吧，当后面每次都超过文件大小时，都要进行上面的一次操作了？

仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #pragma warning(disable:4996)     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef _MSC_VER     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef _MSC_VER     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-79行添加到你带main的.c或.cpp的那个文件的最前面 //81-86行添加到你的main函数开头 //90-94行添加到你的main函数结束前 //在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中

请问一下，有没有方法直接在文件头添加内容的？

文件操作了，每次写文件时，记录写入数据的长度，先判断当前文件的大小即当前写入的位置。若写入的数据超过了文件大小（固定的）则分两部分写入，当写到文件末尾时，将文件rewind一下，让文件指针指向文件开头位置，然后将剩余的数据写入，依次循环写入；若要写入的文件加上当前位置，不超过文件大小，则直接写入； 这样写文件，可以看成写一个环形缓冲区。


Question: c语言从文件读取后如何写排序，急求！！！！！！！江湖救急！！！！！

#include<stdio.h> #include<stdlib.h> #include<conio.h> #include<ctype.h>  #include<windows.h>  struct tel_book{     int num;     char name[20];     char sex[10];     char relationship[20];     char phone[20];     char address[100];     char email[100]; }stu; void add(); void list(); void sort(); void main() {      int choice;     system("cls");     while(1)     {         system("cls");          printf("\t\t\t\t\t\t\t\t      主菜单\n\n\n\n");         printf("\t        1.  录入信息           \n\n");         printf("\t                  2.  信息显示\n\n");         printf("\t        3.  信息排序          \n\n");         printf("\t   4.  退出系统\n\n");          printf("\n请输入序号1~4:");         choice = getch();         switch(choice)         {             case '1':                 add();break;              case '2':                 list();break;             case '3':                 sort();break;              case '4':                 system("cls");                  exit(0);                 break;             default :                 system("cls");                 printf("ERROR!");                 printf("\nAny key to continue");                 getch();                 break;         }     } } void add() {     FILE *f;     char test;     f=fopen("tel.dat","ab+");     if(f==0)     {         f=fopen("tel.dat","wb+");         system("cls");          getch();     }     while(1)     {         system("cls");         printf("\n 编号:");         scanf("%d",&stu.num);         printf("\n 姓名:");         scanf("%s", stu.name);         printf("\n 性别:");         scanf("%s", stu.sex);         printf("\n 关系:");         scanf("%s", stu.relationship);         printf("\n 电话:");         scanf("%s", stu.phone);         printf("\n 地址:");         scanf("%s", stu.address);         printf("\n 邮箱:");         scanf("%s", stu.email);         fwrite(&stu,sizeof(stu),1,f);         fflush(stdin);         system("cls");         printf("成功添加1 条记录");         printf("\n Press esc key to exit, Press Y to add other record:");         test=getche();         test=toupper(test);         if(test!='Y')             break;     }     fclose(f); }  void list() {     FILE *f;     if((f=fopen("tel.dat","rb"))==NULL)         exit(0);     system("cls");     printf("\n");     printf("编号\t姓名\t性别\t关系\t电话\t\t地址\t\t邮箱\n");     while(fread(&stu,sizeof(stu),1,f)==1)     {         printf("\n%d\t%s\t%s\t%s\t%s\t\t%s\t\t%s",stu.num,stu.name,stu.sex,stu.relationship,stu.phone,stu.address,stu.email);     }     printf("\n");     fclose(f);     getch(); } void sort(struct tel_book *book, int num) {     int i, j;  } 排序之前，现将目前的代码编译测试通过。 目前代码存在问题，scanf输入中，对于数组，不需要前面加&，因为数组名本身就是地址。 建议现将目前代码调试通过，能够得到正确的数据，然后再考虑排序或其他功能。因为在有问题的代码上去开发新的功能，只会让问题变的更加复杂～数据从文件中读取后，要在内存里存放，不然排序也没有数据。

你还是先别考虑怎么排序了 你读取的数据都没有存储起来怎么排序？至少你需要个tel_book stus[N]数组存储所有读取到的数据然后再看情况进行排序


Question: 求助！c语言问题，

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

顶一下

可是程序运行的时候有时会出现停止运行的问题，请问怎么解决呢。

#include <stdio.h> #include <ctype.h> #include <time.h> //#include <stdbool.h> #include <stdlib.h>  #include <windows.h>   #define IDNO_LENGTH 6 #define CALC_KIND 4 #define CALC_NUM 10  bool checkNo(char idNo[]); char getSignal(); int getResult(int,int,char); void takeTest();  //main函数 int main() {     printf("Please input your four digit ID no(begin with two letters):");     char idNo[IDNO_LENGTH];     do     {         scanf("%s", idNo);         //fflush(stdin);     } while(checkNo(idNo) == false);      printf("1.Start a test\t2.Check score\t3.Exitb\n");     int choose;     do     {         printf("选择：");         scanf("%d", &choose);         //fflush(stdin);     } while(choose != 1 && choose !=2 && choose!=3);      if(choose==1)     {         takeTest();     }else if(choose==2)     {         FILE *fp;         int ch;         if((fp=fopen("score.txt","r+"))==NULL)         {             printf("\n你还没做过题目测试");             getchar();             exit(1);         }         ch = fgetc(fp);         while(ch!=EOF)         {             putchar(ch);             ch = fgetc(fp);         }         fclose(fp);     }     else     {         exit(0);     }      return 0; }  //获取随机运算符 char getSignal() {     char signal[CALC_KIND]={'+','-','*','/'};     srand((unsigned)time(NULL));     return signal[rand()%4]; }  //获取随机数 int get_random(void) {     int i;     i=rand() % 100;     return (i); }   //运算 int getResult(int num1,int num2,char signal) {     float res;     switch(signal)     {         case '+':             res=num1+num2;break;         case '-':             res=num1-num2;break;         case '*':             res=num1*num2;break;         case '/':             res=num1/num2;break;         default:             res=0;             printf("运算符不符合规则\n");     }     return res; }  //int checkresult(int h) //{ //    float res; //    res=getresult(num1,num2,signal); // if (int(res)!=res|res>=100) h=0; // else h=1; // return h; //}  //列出10道题 void takeTest() {     printf("开始答题，每道题10分，总共100分\n");     clock_t startTime;     startTime=clock();     int index;     int res;     int giveRes;     int l,k,h;     int num1;     int num2;     int score=0;     char signal;     for(index=0;index<CALC_NUM;index++)     {         signal=getSignal();          srand((unsigned)time(NULL));         if(signal=='+'||signal=='-')         {             num1=get_random();             num2=rand()%(100-num1);         }         if(signal=='-')         {             num1=get_random();             num2=rand()%num1;         }         res=getResult(num1,num2,signal);         if(res>100||res<0) k=0;         else k=1;         if(signal=='*')         {             num1=get_random();             num2=rand()%(100/num1);         }         if(signal=='/')         {             do             {                 num1=get_random();                 num2=rand() % num1;                 int c;                 c=num1/num2;                 if(num2*c==num1) h=1;                 else h=0;             }while(h==0);         }          printf("%d%c%d=",num1,signal,num2);         scanf("%d", &giveRes);         //fflush(stdin);         if(getResult(num1,num2,signal)==giveRes)         {             printf("correct\n");             score+=10;         }         else         {             printf("wrong\n");         }     }     FILE *fp=fopen("score.txt","w");     fprintf(fp,"分数为%d",score);     fclose(fp);     printf("解10道题用了%lf秒\n",(double)(clock()- startTime)/CLOCKS_PER_SEC); }  //检测idNo是否合规则，合规则返回true bool checkNo(char idNo[]) {     int index;     bool flag;     flag=true;     for(index=0;index<IDNO_LENGTH;index++)     {         if(index<2)         {             if(!isalpha(idNo[index]))             {                 flag=false;                 printf("ID no 不符合规则，重新输入：");                 break;             }         }         else         {             if(!isdigit(idNo[index]))             {                 flag=false;                 printf("ID no 不符合规则，重新输入：");                 break;             }         }     }     return flag; }  以上是修改你的代码； 问题主要是以下几点： 1. idNo是数组名，因此scanf输入时，要去掉前面的&，数组名本身就是地址呢； 2. fflush(stdin);fflush操作stdin是未定义行为；所以使用fflush对stdin不一定有效，如果需要建议使用其他方式；从你的程序里暂为发现需要fflush，清空输入缓冲区； 3. ch应定义成int类型，因为EOF在系统上定义的是-1,并且这个-1是int类型的-1;  4. 文件打开方式，建议将w+改成r+，因为你的操作主要是读，没有写。 5. random函数名，建议不要和库函数名重名，建议改成get_random，符合函数功能的名字； 6. 注意，fgetc读到的数字1，实际上是'1'，使用时，建议注意下。


Question: 怎么样实行浏览全部学生信息

#include <stdio.h> #include <stdlib.h>  void displayAll() {     struct student *p;     printf("学生总数:%d\n", TOTAL_NUM);      /*     if(head != NULL)     {         do         {             printf("%10d%10s%10d%10s%10s\n",p->num,p->name,p->age,p->sex,p->E_mail);             p=p->next;         } while(p!=NULL); }         */     if (!head) {         printf("无学生信息!\n");     }     p = head;     while (p) {         printf("%10d%10s%10d%10s%10s\n",p->num,p->name,p->age,p->sex,p->E_mail);         p = p->next;     }     printf("\n"); }   void query_by_num() {     int num;     struct student *p1;     printf("请输入学生的学号：");     scanf("%d", &num);     if(head==NULL)     {         printf("无学生记录！\n");         return;     }      /*        head==p1;         while(num!=p1->num && p1->next!=NULL)        p1=p1->next;        if(num == p1->num)        {        printf("\n学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\tE-mail\n");        printf("-------------------------------------------------------------------------------");        display(p1);        }        else        printf("没有该学生记录，请核对！");        */     p1 = head;      while (p1) {         if (p1->num == num)             break;         p1 = p1->next;     }     if (p1) {         printf("\n学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\tE-mail\n");         printf("-------------------------------------------------------------------------------");         display(p1);     } else {         printf("没有该学生记录，请核对！");     } } void freeAll() {     struct student *p1, *p2; p1=p2=head;     while(p1)     {         p2=p1->next;         free(p1);         p1=p2;     } }   建议修改如上！  displayAll函数中，p是野指针，不能直接用。需要先p = head;   注意，query_by_num函数中问题主要是head == p1，即非赋值，判断也没有意义。正确的语句应该是p1 = head;


Question: 为什么输入正确的学号，运行结果显示的是“无学生记录”急需 求大神帮助

void query_by_num() {     int num;     struct student *p1; printf("请输入学生的学号：");     scanf("%ld", &num);     if(head==NULL)     {         printf("无学生记录！\n");         return;     }      /*     head==p1;      while(num!=p1->num && p1->next!=NULL)         p1=p1->next;     if(num == p1->num)     {         printf("\n学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\tE-mail\n");         printf("-------------------------------------------------------------------------------");         display(p1);     }     else         printf("没有该学生记录，请核对！");     */     p1 = head;      while (p1) {         if (p1->num == num)             break;         p1 = p1->next;     }     if (p1) {         printf("\n学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\tE-mail\n");         printf("-------------------------------------------------------------------------------");         display(p1);     } else {         printf("没有该学生记录，请核对！");     } } void freeAll() {     struct student *p1, *p2; p1=p2=head;     while(p1)     {         p2=p1->next;         free(p1);         p1=p2;     } } 建议修改如上！  注意，问题主要是head == p1，即非赋值，判断也没有意义。正确的语句应该是p1 = head;


Question: 邻接链表存储的图用弗洛伊德算法求两点最短路径！！！！

百度搜相关关键字。


Question: 阅读程序题，其中红色的这段代码运行过程是怎么样的，求解

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


Question: 关于从文件读入数据并排序的问题

#include <stdio.h>  #define MAX_SIZE 10 struct node {     char name1[32];     int num1;     char name2[32];     int num2; };  void bubble_sort(struct node *arr, int len);  int  get_data_from_file(struct node *arr, int size); void set_data_into_file(struct node *arr, int len); void print_list(struct node *arr, int len);  int main(void) {     struct node arr[MAX_SIZE];     int num;      num = get_data_from_file(arr, MAX_SIZE);     printf("Before sort!\n");     print_list(arr, num);     bubble_sort(arr, num);     printf("After sort!\n");     print_list(arr, num);     printf("Write file!\n");     set_data_into_file(arr, num);     return 0; }     void print_list(struct node *arr, int len) {     int i;      for (i = 0; i < len; i++)         printf("%s %d, %s %d\n", arr[i].name1, arr[i].num1, arr[i].name2, arr[i].num2); }  int  get_data_from_file(struct node *arr, int size) {     int i, cnt = 0;     int ret;      FILE *fp = fopen("record.txt", "r");     if (!fp) {         fprintf(stderr, "open file error!\n");         return -1;     }      for (i = 0; i < size; i++) {         ret = fscanf(fp, "%s %d, %s %d\n", arr[i].name1, &arr[i].num1,  arr[i].name2, &arr[i].num2);         if (ret == EOF)             break;         cnt++;     }      return cnt; }  void set_data_into_file(struct node *arr, int len) {     int i, cnt = 0;     int ret;      FILE *fp = fopen("record.txt", "w");     if (!fp) {         fprintf(stderr, "open file error!\n");         return;     }     for (i = 0; i < len; i++) {         ret = fprintf(fp, "%s %d, %s %d\n", arr[i].name1, arr[i].num1, arr[i].name2, arr[i].num2);     }  }  void bubble_sort(struct node *arr, int len) {     int i, j;     struct node tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - 1; j++) {             if (arr[j].num1 < arr[j+1].num1) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             }         } }   作为一个参考吧，建议还是自己能动手练练。即使是别人写好的，也建议自己测试，运行一下

文件操作，建议使用fscanf/fprintf读写文件； 然后以第二个数据作为排序的条件；


Question: 如何在主函数里边实现二叉树的销毁，清空树的操作，还有判断是否为空

已经有销毁操作了，为什么还要实现二叉树的销毁，清空呢，在主函数里也已经调用了。判断二叉树是否为空也已经有了，只是没有调用。 可以在遍历的函数里调用一下，判断二叉树是否为空。 void preOrderTraverse(BiTree T) {     if(!BinTreeEmpty(&T))     {         printf("data = %d\n", visit(T));         preOrderTraverse(T->lchild);         preOrderTraverse(T->rchild);     } } printf("there are %d number nodes.\n"); 这句有问题呢，printf缺少一个参数。  手里拿着碗，还到处找碗，

你这代码不都已经写了创建，遍历，销毁二叉树了吗？不过销毁二叉树，最好是在后序遍历里释放内存


Question: 二叉树的初始化，销毁，清空树，判断是否为空

谢谢楼上了~

#include <stdio.h> #include <stdlib.h> #include "math.h"  #define OK 1 #define ERROR 0  typedef int Status;     /* Status是函数的类型,其值是函数结果状态代码，如OK等 */  typedef int TElemType;  typedef struct BiTNode  /* 结点结构 */ {    TElemType data;      /* 结点数据 */    struct BiTNode *lchild,*rchild; /* 左右孩子指针 */ }BiTNode,*BiTree;   /* 构造空二叉树T */ Status InitBiTree(BiTree *T) {     *T = NULL;     return OK; }  /* 检查二叉树是否为空*/ Status BinTreeEmpty(BiTree *T) {     if(*T == NULL)         return 1;     else         return 0; } /* 销毁二叉树T */ void DestroyBiTree(BiTree *T) {     if(*T)     {         if((*T)->lchild) /* 有左孩子 */             DestroyBiTree(&(*T)->lchild); /* 销毁左孩子子树 */         if((*T)->rchild) /* 有右孩子 */             DestroyBiTree(&(*T)->rchild); /* 销毁右孩子子树 */         free(*T); /* 释放根结点 */         *T=NULL; /* 空指针赋0 */     } }  /* 将二叉树清为空树*/ void ClearBiTree(BiTree *T) {     if(*T == NULL)         return;     ClearBiTree(&(*T)->lchild);     ClearBiTree(&(*T)->rchild);     free(*T); }  /* 按前序输入二叉树中结点的值（一个字符） */ /* #表示空树，构造二叉链表表示二叉树T。 */ void CreateBiTree(BiTree *T) {     TElemType ch;      scanf("%d", &ch);      if(ch == -1)      //#代表这个节点没有子树。         *T = NULL;     else     {         *T = (BiTree)malloc(sizeof(BiTNode));          //malloc生成一个内存空间并且强制转化为BiTree类型，类似new的作用。         if(!*T)             exit(OVERFLOW);         (*T)->data = ch; /* 生成根结点 */         CreateBiTree(&((*T)->lchild)); /* 构造左子树 */         CreateBiTree(&((*T)->rchild)); /* 构造右子树 */      //函数参数的传递是单向值传递，当我们是需要改变一个指针的值时，就需要用二重指针做参。     } }  int visit(BiTree T) {     return T->data; }  // 先序遍历 void preOrderTraverse(BiTree T) {     if(T)     {         printf("data = %d\n", visit(T));         preOrderTraverse(T->lchild);         preOrderTraverse(T->rchild);     } }  // 中序遍历 void inOrderTraverse(BiTree T) {     if(T)     {         inOrderTraverse(T->lchild);         printf("data = %d\n", visit(T));         inOrderTraverse(T->rchild);     } }  // 后序遍历 void postOrderTraverse(BiTree T) {     if(T)     {         postOrderTraverse(T->lchild);         postOrderTraverse(T->rchild);         printf("data = %d\n", visit(T));     } }  int main() {     BiTree T;     InitBiTree(&T);     CreateBiTree(&T);     preOrderTraverse(T);     ClearBiTree(&T);     return 0; } 递归方法，主要还是要理解创建的方法～


Question: 使用C语言编写：求解一元二次方程X2+5X+6=0的根。始终有一个错误

什么错误？错误分很多种：逻辑错误，编译错误，链接错误，运行时错误等等。可以从错误的提示确定属于哪一类。你遇到的错误提示是什么？请贴出来，这样大家可能就能快速定位了。正如1楼所说，没加分号等。

这是对的呀，没有错啊，编译如果报错也只是return 0 没有加；啊。

#include  <stdio.h> #include  <math.h>  int main ( void ) {     //将方程的三个系数保存到计算机中     int a = 1;     int b = 5;     int c = 6;     double  delta;   //定义delta     double  x1;     //定义其中一个根为x1     double  x2;     //定义其中另一个根为x2      delta = b*b - 4*a*c;  //定义delta = b*b - 4*a*c     if (delta > 0)     {         x1 = ( - b + sqrt( delta )) / ( 2*a );          x2 =  ( - b - sqrt( delta )) / ( 2*a );         printf ( "该方程有两个根分别为\n" );         printf ( "x1 = %f \n",x1 );         printf ( "x2 = %f \n",x2 );     }     else if ( delta == 0)     {         x1 = ( -b ) / ( 2 * a);         x2 = x1;         printf ( "该方程只有一个根它为\n" );         printf ( "x1 = x2 = %f\n",x1);     }     else     {         printf( "该方程无解\n" );     }      return 0; }  注意coding style.

关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

return 0 没加分号。


Question: uart寄存器编程

宏替换呗  CDNS_UART_CONTROL_RXRES   替换成  BIT(0)


Question: C语言有关txt文件读取的问题，小白求问

引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include<stdlib.h> #include<string.h> #include<time.h>  int student = 0; void Load(); struct StuInfo {     int id;     char name[20];     char sex[12];     char num[20];     float score; }stu[50];  void Load() {     int i;     FILE*fp;     fp = fopen("StuInfo1.txt", "r");     if (fp == NULL) {         printf("The file can't be opened.\n");         return;     }      for (i = 0; !feof(fp); i++) {         fscanf(fp, "%d %s %s %s %f\n", &stu[i].id, stu[i].name, stu[i].sex, stu[i].num, &stu[i].score);         printf("%d %s %s %s %f\n", stu[i].id, stu[i].name, stu[i].sex, stu[i].num, stu[i].score);     }     fclose(fp);     student = i; }  int main() {     Load();      return 0; }  用这个代码试一下； 问题如下： 1. 文件打开一次即可，你的程序里打开了两次。 2. 根据你的文件内容，建议的数据结构修改如下：  struct StuInfo {     int id;     char name[20];     char sex[12];     char num[20];     float score; }stu[50];  这儿已经定义50个学生信息，因此在Load不建议在继续使用局部变量stu[50]了。 3. 返回局部变量数据，没有意义。因为函数Load执行结束，局部变量会随着函数自动被释放，因此返回已经被释放的地址是未定义行为； 4. fscanf/fprintf是格式化读写文件，因此格式应该和文件里的数据格式一致。 5. 注意一下feof，建议从网上找一下feof函数使用时应该注意的事项；你的代码在使用这个函数时，缺乏健壮性，因此还是注意下。十分感谢！！！！！

fscanf时,  %s提取字符串, 肯定会提取出全部了, 只能用正则表达式  %[^ ]  修改为这样 fscanf(fp,"%d%[^ ]%[^ ]%d%f", stu[i].id, stu[i].name, stu[i].sex, stu[i].num, stu[i].score);


Question: C程序中，kill(0,SIGKILL)如何保证父进程不被杀死？

引用 3 楼 weixin_33398032 的回复:[quote=引用 2 楼 user-2的回复:]进程中至少要有一个线程，否则进程也会结束了 你的意思是，父进程中有一个线程的情况下，kill(0,SIGKILL)不会杀死父进程吗？[/quote] 照样会。

引用 2 楼 user-2的回复:进程中至少要有一个线程，否则进程也会结束了 你的意思是，父进程中有一个线程的情况下，kill(0,SIGKILL)不会杀死父进程吗？

进程中至少要有一个线程，否则进程也会结束了

遍历所有子进程并逐一杀死。


Question: 数据结构单链表操作函数 严蔚敏版

引用是C++编程相对C语言独有的语法，相当于C语言里的指针，但是还有一些不同的。 对比如下： 引用： GetElem(LinkList &L ,int i ,ElemType &e)  指针： GetElem(LinkList *L ,int i ,ElemType *e)  注意，在指针里，在GetElem函数里，L， e都是指针。

前者按引用传递，可以在函数中修改  后者按值传递，函数中的形参是实参的复制值

指针即地址 引用即别名

区别就在于，LinkList  &L是引用类型，他可以在函数中修改L的值，能在函数域外也有效，但是LinkList  L却不行，在函数中将L修改后，退出了函数，其值依然是函数修改之前的值，这也是在设计函数时的一种技巧。  如果楼主还不懂，去百度一下引用类型。


Question: 怎么改

引用 3 楼 cfjtaishan 的回复:#include<stdio.h>  int main() {     char ch;      printf("请输入一个字符");     scanf("%c", &ch);      if (ch >= 'a' && ch <= 'z')         printf("属于小写字母%c\n", ch);     else if (ch >= 'A' && ch <= 'Z')         printf("属于大写字母%c\n", ch);     else if (ch >= '0' && ch <= '9')         printf("属于数字%d", ch);     else         printf("属于其他%c", ch);      return 0; } 基本的语法问题，建议自己还是要通过编译器提供的error或warning解决。           你的这个 ，我以前试了  ，编译不了

引用 8 楼 qq_39317811 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] #include<stdio.h>  int main() {     char ch;      printf("请输入一个字符");     scanf("%c", &ch);      if (ch >= 'a' && ch <= 'z')         printf("属于小写字母%c\n", ch);     else if (ch >= 'A' && ch <= 'Z')         printf("属于大写字母%c\n", ch);     else if (ch >= '0' && ch <= '9')         printf("属于数字%d", ch);     else         printf("属于其他%c", ch);      return 0; } 基本的语法问题，建议自己还是要通过编译器提供的error或warning解决。 你的这个 ，我以前试了  ，编译不了 [/quote]   提示什么error或warning?

引用 2 楼 赵4老师的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; 请问老师，这样写的作用是什么？不大懂。

引用 6 楼 赵4老师的回复:[quote=引用 4 楼 qq_35881819 的回复:] [quote=引用 2 楼 赵4老师的回复:]在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; 请问老师，这样写的作用是什么？不大懂。[/quote] 自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。[/quote] 感谢老师，懂了。 学艺不精，我还需要锻炼。

#include<stdio.h> int main() { char ch; printf("请输入一个字符"); scanf("%c", &ch); if (ch >= 'a'&&ch <= 'z') { printf("属于小写字母%c", ch); } else  { if (ch >= 'A'&&ch <= 'Z') { printf("属于大写字母%c", ch); } else { if (ch >= '0'&&ch <= '9') printf("属于数字%d", ch);         }    else         "属于其他"=ch    printf("属于其他%c", ch);        return 0;  } } 加红部分的else没有if跟其配对，所以会报错。 改为 #include "stdafx.h" #include<stdio.h>  int _tmain(int argc, _TCHAR* argv[]) { 	char ch; 	printf("请输入一个字符"); 	scanf("%c", &ch); 	if (ch >= 'a'&&ch <= 'z') 	{ 		printf("属于小写字母%c", ch); 	} 	else  	{ 		if (ch >= 'A'&&ch <= 'Z') 		{ 			printf("属于大写字母%c", ch); 		} 		else 		{ 			if (ch >= '0'&&ch <= '9') 				printf("属于数字%d", ch); 			else  			{ 					printf("属于其他%c", ch); 			} 		}   	   return 0;  	} 	return 0; }

引用 4 楼 qq_35881819 的回复:[quote=引用 2 楼 赵4老师的回复:]在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; 请问老师，这样写的作用是什么？不大懂。[/quote] 自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

修改后的代码如下：  int main(void) { 	char ch; 	printf("请输入一个字符"); 	scanf("%c", &ch); 	if (ch >= 'a'&&ch <= 'z') 	{ 		printf("属于小写字母%c", ch); 	} 	else if (ch >= 'A'&&ch <= 'Z') 	{ 		printf("属于大写字母%c", ch); 	} 	else if (ch >= '0'&&ch <= '9') 	{ 		printf("属于数字%d", ch - '0'); 	} 	else 	{ 		printf("属于其他\n"); 	} 	return 0; } 用心回答每个问题，如果对您有帮助，请采纳答案好吗，谢谢！


Question: 怎么理解这个代码 C++

输出最大值最小值

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

这段C代码的目的是输入5个数字，最后输出5个数字中的最大值和最小值。

楼上的回答很仔细啊。

nt main(void) { 	float in = true; 	int i, a, max, min; 	for (i = 0; i < 5; i++) //循环5次 	{ 		scanf("%d", &a); //输入一个整型数 		if (in)  //in初值为true，条件成立，执行if分支。 		{ 			max = min = a; //max=min=第一次接收到的a值 			in = false; //in赋值为false，下次循环进入时，if条件不满足，不再执行这个if分支。 		} 		if (max < a)  //新接收到的a值如果大于max，max就等于新接收到的a值 			max = a; 		if (min > a)  //新接收到的a值如果小于max，min就等于新接收到的a值 			min = a; 	}  	printf("Max = %d\nMin = %d\n", max, min); //循环结束，打印最终的max,min值。 	return 0; } 用心回答每个问题，如果对您有帮助，请采纳答案好吗，谢谢！

引用 4 楼 wyyy2088511 的回复:循环输入5次数，每次打印最最大和最小数！ 不是每次打印吧，只打印一次

循环输入5次数，每次打印最最大和最小数！


Question: 自学关于整数上浮和浮点数上浮和下浮的代码，求老司机帮看看对不对，谢谢！

你这个 结果只看你%后面的格式字符的格式的

浮点数格式 http://bbs.csdn.net/topics/390676437 一眼include\float.h

c = a * b;c是整型变量，将a * b的值赋值给c，会将乘积的结果截断，保留整数。即使用lf输出也只是保留整数部分。再说c是占4个字节，b是long double 16个字节，c无法将结果存放呢；与其叫溢出，不如叫截断了


Question: 为什么easyx里的鼠标操作不灵么，在有多个鼠标操作的情况下

easyx改编自bc的bgi，指望她支持多鼠标，难度有点大。


Question: 多线程未定义的引用

有蹊跷, 慢慢找

谢啦。。。。。。。。

pthread_mutex_destroy(&mutex);     pthread_cond_destroy(&cond);     pthread_cond_destroy(&cond1); 单词拼写错误；注意下：destroy: ro还是or，


Question: 自学遇到困难，求各位前辈帮帮忙！

另外语法非常乱，先定义了字符x, y z  ，把字符a啊赋值给 x ,....  然后以输入字符串输出x ,y ,z , 然后又输入什么什么  ，代码完全看不明白什么意思 ，代码只能一步一步来表述的，几乎不可以颠倒次序

是单个字符，不是单子字符

你 %c表示输出单字字符 ，%o才表示以八进制表示整数，另外定义字符最好char char1 ,char2  ;   来表示

scanf("%d\n",&x); printf("%c\n",x);

能具体点么?因为我现在在自学，知识面有限，看的云里雾里的。

在运行的时候，显示  Run-Time Check Failure #3 - The variable 'c' is being used without being initialized.       请问下这是因为什么？

我重新改动了下你的  代码如下，我输入66，你的运行结果是6,b,c. #include<stdio.h> int main() {     //int a,b,c;     char x,y,z;       x ='a';     y ='b';     z ='c';       printf("请输入一个ASCII值（如66），ASCII值的取值范围是0-256\n");     scanf("%c,%c,%c", &x, &y, &z);     printf("%c，%c，%c\n", x, y, z);     printf("以上就是你输入的ASCII值所对应的字符\n");       //getchar();     //getchar();     getchar();     return 0; }      而我在我原来打代码上修了，再和你的对了下，感觉一模一样，但是，输入66，我的运行结果一下子是3个问号，再重新运行，又改成别的了，，我好晕，，好急，，  #include<stdio.h> int main() {     int a,b,c;     char x,y,z;      x='a';     y='b';     z='c';       printf("请输入一个ASCII值（如66），ASCII值的取值范围是0-256\n");     scanf("%c,%c,%c",&x, &y, &z);     printf("%c,%c,%c\n",&x, &y, &z);     printf("以上就是你输入的ASCII值所对应的字符\n");      getchar();     getchar();     getchar();     return 0; }   求解惑，我真的晕了。。

#include<stdio.h> int main() {     //int a,b,c;     char x,y,z;      x ='a';     y ='b';     z ='c';      printf("请输入一个ASCII值（如66），ASCII值的取值范围是0-256\n");     scanf("%c,%c,%c", &x, &y, &z);     printf("%c，%c，%c\n", x, y, z);     printf("以上就是你输入的ASCII值所对应的字符\n");      //getchar();     //getchar();     getchar();     return 0; } 代码里有中文字符，比如scanf中存在中文的逗号，去掉scanf中的\n回车符，不然输入无法结束。标准输入是行缓冲，所以不需要在scanf中加'\n' a,b,c没有使用，建议注释掉。


Question: 利用 CreateThread 创建线程的问题

百度搜相关关键字。


Question: c语言 vc6.0 程序改错

err.cpp：#include <stdio.h> #include <stdlib.h> #include <string.h>  #define	PARKING_POSITION_NUM 100 #define	FILE_CAR "car.txt" #define	FILE_IN_PATH "car_in.txt" #define	FILE_OUT_PATH "car_out.txt" #define	FILE_REPORT	"car_report.txt"  int	parking_pos[PARKING_POSITION_NUM] =	{0};  typedef	struct car_list	{ 	char car_num[20]; 	int	month; 	int	day; 	int	hour; 	int	parking_position; 	struct car_list	*next; } Node;  Node *pHead, *p;  int	get_user_operation(); int	x; void car_drive_in(); void car_drive_out(); void search_all(); void search_by_position(); void search_by_number(); void daily_report(); void system_exit(); void press_return(); void write_to_file(); void read_from_file(); void clear_list(); void print_list(); int	is_empty_list(); //int tmp; void record_car_in(Node	*tmp); void record_car_out(int	month, int day,	char* car_num, int price);  int	main() { 	int	x; 	printf("\t\t\t***********************\n"); 	printf("\t\t\t*        主菜单       *\n"); 	printf("\t\t\t***********************\n"); 	printf("\t\t\t*1车辆驶入   2车辆驶出*\n"); 	printf("\t\t\t*3整理查询   4车位查询*\n"); 	printf("\t\t\t*5车牌查询   6日统计*\n"); 	printf("\t\t\t*7退出系统\n"); 	printf("\t\t\t    请选择[1/2/3/4/5/6/7]:"); 	scanf("%d",&x);  	switch (x) { 	case 1: 		read_from_file(); 		car_drive_in(); 		break;  	case 2: 		car_drive_out(); 		break;  	case 3: 		search_all(); 		break;  	case 4: 		search_by_position(); 		break;  	case 5: 		search_by_number(); 		break;  	case 6: 		daily_report(); 		break;  	case 7: 		system_exit(); 		break;  	default: 		printf("Not support!\n"); 		break; 	} 	/* 	if(x ==	1) { read_from_file();car_drive_in();} 	else if(x==2) car_drive_out(); 	else if(x==3) search_all(); 	else if(x==4) search_by_position(); 	else if(x==5) search_by_number(); 	else if(x==6) daily_report(); 	else if(x==7) system_exit(); 	*/ 	return 0; } int	get_user_operation() { 	char ch; 	while(1) { 		printf("请选择："); 		scanf(" %c", &ch); 		//Node *tmp; 		if (ch < '0' || ch > '7') { 			printf("输入有误,请重新输入.\n"); 			printf("\n"); 			//print_main_menu(); 		} else { 			return ch -	'0'; 		} 	} }  void car_drive_in()	{ 	int	pos	= -1; 	int	i; 	Node *tmp; 	tmp	= (Node	*)malloc(sizeof(Node)); 	printf("车辆驶入: \n"); 	print_list(); 	printf("请输入车牌号: \n"); 	printf("例如: s1656\n"); 	scanf(" %s", tmp->car_num); 	printf("请输入驶入时间: \n"); 	printf("4月4号34点输入: 4:4:34\n"); 	scanf(" %d:%d:%d", &tmp->month, &tmp->day, &tmp->hour); 	for(i =	0; i < PARKING_POSITION_NUM; i++ ) { 		if(	parking_pos[i] == 0	) { 			pos	= i	+ 1; 			parking_pos[i] = 1; 			break; 		} 	} 	if (pos	== -1) { 		printf("车位已满，停车失败。 \n"); 		return; 	} 	tmp->parking_position =	pos; 	tmp->next =	NULL; 	p->next	= tmp; 	p =	tmp; 	record_car_in(tmp); 	write_to_file(); 	printf("车辆进入停车场成功,时间已经自动载入!:\n"); 	printf("车牌为%s的汽车驶入时间为:%d月%d日%d时停在%d车位\n", tmp->car_num, tmp->month, tmp->day, tmp->hour, pos); 	press_return(); } void car_drive_out() { 	Node *tmp =	NULL; 	char car_num[20]; 	if (is_empty_list()	== 1) { 		printf("当前停车场没有车.\n"); 		press_return(); 		return; 	} 	print_list(); 	printf("车辆驶出: \n"); 	printf("请输入车牌号：\n"); 	scanf(" %s", car_num); 	if (pHead) 		tmp	= pHead->next; 	else 		tmp	= NULL; 	while(tmp!=NULL) { 		int	m_month; 		int	m_day; 		int	m_hour; 		int	sum=0; 		int	park_hour; 		int	day_hour = park_hour % 24; 		int	park_day = (park_hour -	day_hour) /	24; 		if(day_hour	>= 8) 			if(strcmp(tmp->car_num,	car_num)==0) { 				/* 				struct time; 				{ 					int	month; 					int	day; 					int	hour; 				} 				*/ 				int	park_hour =	(m_month - tmp->month) * 30	* 24 + (m_day -	tmp->day) *	24 + (m_hour - tmp->hour); 				printf("请输入取车时间：\n"); 				printf("4月4号44点输入: 4:4:44\n"); 				scanf(" %d:%d:%d", &m_month, &m_day, &m_hour); 				if (park_hour <	0) { 					{ 						printf("错误的输入时间."); 						press_return(); 						return; 					} 					{ 						sum=(park_day +	1) * 8; 					} 				} else { 					sum	= park_day * 8 + day_hour *	1; 				} 				parking_pos[tmp->parking_position-1] = 0; 				// 清空当前车 				p->next	= tmp->next; 				free(tmp); 				printf("请交纳停车费： %d \n", sum); 				record_car_out(m_month,	m_day, car_num,	sum); 				return; 			} 		tmp	= tmp->next; 		p =	p->next; 		write_to_file(); 	} 	printf("查无此车.\n"); 	press_return(); } void system_exit() { 	printf("程序退出\n"); 	exit(0); } void press_return()	{ 	while(1) { 		printf("按下 r 返回主菜单.\n"); 		char ch; 		scanf(" %c", &ch); 		if (ch == 'r') { 			return; 		} 	} } void write_to_file() { 	FILE *fp; 	remove(FILE_CAR); 	fp = fopen(FILE_CAR, "w"); 	Node *tmp =	pHead->next; 	while(tmp) { 		fprintf(fp,	"%s\t%d\t%d\t%d\t%d\n", tmp->car_num, tmp->month, tmp->day, tmp->hour, tmp->parking_position); 		tmp	= tmp->next; 	} 	fflush(fp); 	fclose(fp); } void record_car_in(Node	*tmp) { 	FILE *fp; 	fp = fopen(FILE_IN_PATH, "a+"); 	fprintf(fp,	"%d\t%d\t%s\n", tmp->month, tmp->day, tmp->car_num); 	fflush(fp); 	fclose(fp); }  void record_car_out(int	month, int day,	char* car_num, int price) { 	FILE *fp; 	fp = fopen(FILE_OUT_PATH, "a+"); 	fprintf(fp,	"%d\t%d\t%s\t%d\n", month, day, car_num, price); 	fflush(fp); 	fclose(fp); } void read_from_file() { 	clear_list(); 	FILE *fp; 	fp = fopen(FILE_CAR, "r"); 	if (fp == NULL)	{ 		return; 	} 	p =	pHead; 	Node *tmp; 	tmp	= (Node	*)malloc(sizeof(Node)); 	while(fscanf(fp,"%s\t%d\t%d\t%d\t%d", tmp->car_num, &tmp->month, &tmp->day, &tmp->hour, &tmp->parking_position) != EOF) { 		tmp->next =	NULL; 		p->next	= tmp; 		p =	tmp; 		parking_pos[tmp->parking_position -1] =	1; 		tmp	= (Node	*)malloc(sizeof(Node)); 	} } void clear_list() { 	Node *tmp; 	tmp	= pHead->next; 	while(tmp!=NULL) { 		pHead->next=tmp->next; 		free(tmp); 		tmp=pHead->next; 	} 	pHead->next	= NULL; 	p =	pHead; } void print_list() { 	printf("当前停车:\n"); 	printf("车牌号 入场时间 停车位置 \n"); 	Node *tmp; 	tmp	= pHead->next; 	while(tmp!=NULL) { 		printf("%s\t%d月%d日%d时\t%d\n", tmp->car_num, tmp->month, tmp->day, tmp->hour, tmp->parking_position); 		tmp	= tmp->next; 	} } int	is_empty_list()	{ 	if(pHead->next==NULL) { 		return 1; 	} 	return 0; } void search_all() { 	int	i; 	int	count =	0; 	for(i=0; i<	PARKING_POSITION_NUM; i++) { 		if (parking_pos[i]==1) { 			count ++; 			printf("车位 %d 已被使用\n", i+1); 		} 	} 	printf("已经使用车位%d, 还剩下 %d\n", count, PARKING_POSITION_NUM-count); } void search_by_position() { 	int	pos; 	printf("请输入查询的车位号: [1-%d]\n", PARKING_POSITION_NUM); 	scanf(" %d", &pos); 	if(parking_pos[pos-1]==1) { 		Node *tmp =	pHead->next; 		while(tmp) { 			if (pos==tmp->parking_position)	{ 				printf("该车位正在被如下车使用\n"); 				printf("车牌%s于%d月%d日%d时停入\n", tmp->car_num, tmp->month, tmp->day, tmp->hour); 				break; 			} 			tmp	= tmp->next; 		} 	} else { 		printf("该车位并没有使用."); 	} 	press_return(); } void search_by_number()	{ 	char car_num[20]; 	printf("请输入需要查询的车牌号\n"); 	scanf(" %s", car_num); 	Node *tmp =	pHead->next; 	while(tmp) { 		if(strcmp(tmp->car_num,	car_num)==0) { 			printf("车牌%s于%d月%d日%d时停入%d车位中\n", tmp->car_num, tmp->month, tmp->day, tmp->hour, tmp->parking_position); 			press_return(); 			return; 		} 		tmp	= tmp->next; 	} 	printf("暂时没有此车信息.\n"); 	press_return(); } void daily_report()	{ 	int	month; 	int	day; 	printf("请输入要查询的日期.\n"); 	printf("如3月4日，则输入 3:4.\n"); 	scanf(" %d:%d", &month, &day); 	FILE *fp_in; 	FILE *fp_out; 	FILE *fp_report; 	remove(FILE_REPORT); 	fp_in =	fopen(FILE_IN_PATH,	"r"); 	fp_out = fopen(FILE_OUT_PATH, "r"); 	fp_report =	fopen(FILE_REPORT, "a+");   	fprintf(fp_report, "%d月%d日报表:\n", month, day); 	fflush(fp_report); 	if(fp_in==NULL)	{ 		fprintf(fp_report, "当日没有车停入\n"); 		fflush(fp_report); 	} else { 		int	f_month; 		int	f_day; 		char car_num[20]; 		int	count=0; 		while(fscanf(fp_in,"%d\t%d\t%s", &f_month, &f_day, car_num ) != EOF) { 			if((month==f_month)	&& (day==f_day)) { 				count++; 			} 		} 		if(count==0) { 			fprintf(fp_report, "当日没有车停入\n"); 			fflush(fp_report); 		} else { 			fprintf(fp_report, "当日驶入车 %d 辆\n", count); 			fflush(fp_report); 		} 	}  	if(fp_out==NULL) { 		fprintf(fp_report, "当日没有车驶出\n"); 		fprintf(fp_report, "当日收费 0 元\n"); 	} else { 		int	f_month; 		int	f_day; 		char car_num[20]; 		int	m_price; 		int	count=0; 		int	price =0; 		while(fscanf(fp_out,"%d\t%d\t%s\t%d", &month, &day, car_num, &price ) != EOF) { 			if((month==f_month)	&& (day==f_day)) { 				count++; 				price+=m_price; 			} 		} 		if(count==0) { 			fprintf(fp_report, "当日没有车驶出\n"); 			fflush(fp_report); 		} else { 			fprintf(fp_report, "当日驶出车 %d 辆\n", count); 			fprintf(fp_report, "当日收费 %d 元\n", price); 			fflush(fp_report); 		} 	} 	fclose(fp_report); 	press_return(); }  Compiling... err.cpp c:\tmp\tmp\err.cpp(173) : warning C4700: local variable 'park_hour' used without having been initialized c:\tmp\tmp\err.cpp(185) : warning C4700: local variable 'm_month' used without having been initialized c:\tmp\tmp\err.cpp(185) : warning C4700: local variable 'm_day' used without having been initialized c:\tmp\tmp\err.cpp(185) : warning C4700: local variable 'm_hour' used without having been initialized c:\tmp\tmp\err.cpp(398) : warning C4700: local variable 'f_month' used without having been initialized c:\tmp\tmp\err.cpp(398) : warning C4700: local variable 'f_day' used without having been initialized c:\tmp\tmp\err.cpp(400) : warning C4700: local variable 'm_price' used without having been initialized Linking...  tmp.exe - 0 error(s), 0 warning(s)

问题如下： 1. 定义的全局变量tmp是int类型，在car_driver_out函数中直接运用成结构体指针。 2. 在car_driver_out函数中park_hour变量定义未初始化，直接运用； 3. print_main_menu函数未找到定义；可能是漏写了？ 总之，变量定义和使用有点乱，哪儿使用哪儿定义，没有事先规划好。程序建议还是先想好，分析好 建议if判断多于2个时，使用swich case

#include <stdio.h> #include <stdlib.h> #include <string.h>  #define PARKING_POSITION_NUM 100 #define FILE_CAR "car.txt" #define FILE_IN_PATH "car_in.txt" #define FILE_OUT_PATH "car_out.txt" #define FILE_REPORT "car_report.txt"  int parking_pos[PARKING_POSITION_NUM] = {0};  typedef struct car_list {     char car_num[20];     int month;     int day;     int hour;     int parking_position;     struct car_list *next; }Node;  Node *pHead, *p;  int get_user_operation(); int x; void car_drive_in(); void car_drive_out(); void search_all(); void search_by_position(); void search_by_number(); void daily_report(); void system_exit(); void press_return(); void write_to_file(); void read_from_file(); void clear_list(); void print_list(); int is_empty_list(); //int tmp; void record_car_in(Node *tmp); void record_car_out(int month, int day, char* car_num, int price);  int main() {     int x;     printf("\t\t\t***********************\n");     printf("\t\t\t*        主菜单       *\n");     printf("\t\t\t***********************\n");     printf("\t\t\t*1车辆驶入   2车辆驶出*\n");     printf("\t\t\t*3整理查询   4车位查询*\n");     printf("\t\t\t*5车牌查询   6日统计*\n");     printf("\t\t\t*7退出系统\n");     printf("\t\t\t    请选择[1/2/3/4/5/6/7]:");     scanf("%d",&x);      switch (x) {         case 1:             read_from_file();             car_drive_in();             break;          case 2:             car_drive_out();             break;          case 3:             search_all();             break;          case 4:             search_by_position();             break;          case 5:             search_by_number();             break;          case 6:             daily_report();             break;          case 7:             system_exit();             break;          default:             printf("Not support!\n");             break;     }     /*     if(x == 1) { read_from_file();car_drive_in();}     else if(x==2) car_drive_out();     else if(x==3) search_all();     else if(x==4) search_by_position();     else if(x==5) search_by_number();     else if(x==6) daily_report();     else if(x==7) system_exit();     */ } int get_user_operation() {     char ch;     while(1)     {         printf("请选择：");         scanf(" %c", &ch);         Node *tmp;         if (ch < '0' || ch > '7')         {             printf("输入有误,请重新输入.\n");             printf("\n");             //print_main_menu();         }         else         {             return ch - '0';         }     } }  void car_drive_in() {     int pos = -1;     int i;     Node *tmp;     tmp = (Node *)malloc(sizeof(Node));     printf("车辆驶入: \n");     print_list();     printf("请输入车牌号: \n");     printf("例如: s1656\n");     scanf(" %s", tmp->car_num);     printf("请输入驶入时间: \n");     printf("4月4号34点输入: 4:4:34\n");     scanf(" %d:%d:%d", &tmp->month, &tmp->day, &tmp->hour);     for(i = 0; i < PARKING_POSITION_NUM; i++ )     {         if( parking_pos[i] == 0 )         {             pos = i + 1;             parking_pos[i] = 1;             break;         }     }     if (pos == -1)     {         printf("车位已满，停车失败。 \n");         return;     }     tmp->parking_position = pos;     tmp->next = NULL;     p->next = tmp;     p = tmp;     record_car_in(tmp);     write_to_file();     printf("车辆进入停车场成功,时间已经自动载入!:\n");     printf("车牌为%s的汽车驶入时间为:%d月%d日%d时停在%d车位\n", tmp->car_num, tmp->month, tmp->day, tmp->hour, pos);     press_return(); }  void car_drive_out() {     Node *tmp = NULL;     char car_num[20];     if (is_empty_list() == 1)     {         printf("当前停车场没有车.\n");         press_return();         return;     }     print_list();     printf("车辆驶出: \n");     printf("请输入车牌号：\n");     scanf(" %s", car_num);     if (pHead)         tmp = pHead->next;     else         tmp = NULL;     while(tmp!=NULL)     {         int m_month;         int m_day;         int m_hour;         int sum=0;         int park_hour;         int day_hour = park_hour % 24;         int park_day = (park_hour - day_hour) / 24;         if(day_hour >= 8)             if(strcmp(tmp->car_num, car_num)==0)             {                 /*                 struct time;                 {                     int month;                     int day;                     int hour;                 }                 */                 int park_hour = (m_month - tmp->month) * 30 * 24 + (m_day - tmp->day) * 24 + (m_hour - tmp->hour);                 printf("请输入取车时间：\n");                 printf("4月4号44点输入: 4:4:44\n");                 scanf(" %d:%d:%d", &m_month, &m_day, &m_hour);                 if (park_hour < 0)                 {                     {                         printf("错误的输入时间.");                         press_return();                         return;                     }                     {                         sum=(park_day + 1) * 8;                     }                 }                 else                 {                     sum = park_day * 8 + day_hour * 1;                 }                 parking_pos[tmp->parking_position-1] = 0;                 // 清空当前车                 p->next = tmp->next;                 free(tmp);                 printf("请交纳停车费： %d \n", sum);                 record_car_out(m_month, m_day, car_num, sum);                 return;             }         tmp = tmp->next;         p = p->next;         write_to_file();     }     printf("查无此车.\n");     press_return(); } void system_exit() {     printf("程序退出\n");     exit(0); } void press_return() {     while(1)     {         printf("按下 r 返回主菜单.\n");         char ch;         scanf(" %c", &ch);         if (ch == 'r')         {             return;         }     } } void write_to_file() {     FILE *fp;     remove(FILE_CAR);     fp = fopen(FILE_CAR, "w");     Node *tmp = pHead->next;     while(tmp)     {         fprintf(fp, "%s\t%d\t%d\t%d\t%d\n", tmp->car_num, tmp->month, tmp->day, tmp->hour, tmp->parking_position);         tmp = tmp->next;     }     fflush(fp);     fclose(fp); } void record_car_in(Node *tmp) {     FILE *fp;     fp = fopen(FILE_IN_PATH, "a+");     fprintf(fp, "%d\t%d\t%s\n", tmp->month, tmp->day, tmp->car_num);     fflush(fp);     fclose(fp); }  void record_car_out(int month, int day, char* car_num, int price) {     FILE *fp;     fp = fopen(FILE_OUT_PATH, "a+");     fprintf(fp, "%d\t%d\t%s\t%d\n", month, day, car_num, price);     fflush(fp);     fclose(fp); } void read_from_file() {     clear_list();     FILE *fp;     fp = fopen(FILE_CAR, "r");     if (fp == NULL)     {         return;     }     p = pHead;     Node *tmp;     tmp = (Node *)malloc(sizeof(Node));     while(fscanf(fp,"%s\t%d\t%d\t%d\t%d", tmp->car_num, &tmp->month, &tmp->day, &tmp->hour, &tmp->parking_position) != EOF)     {         tmp->next = NULL;         p->next = tmp;         p = tmp;         parking_pos[tmp->parking_position -1] = 1;         tmp = (Node *)malloc(sizeof(Node));     } }

用C语言来做这个停车管理系统，有点复杂了吧。

--------------------Configuration: dguvgd - Win32 Debug-------------------- Compiling... scs.c F:\jhu\dguvgd\scs.c(70) : warning C4013: 'print_main_menu' undefined; assuming extern returning int F:\jhu\dguvgd\scs.c(61) : warning C4101: 'tmp' : unreferenced local variable F:\jhu\dguvgd\scs.c(131) : warning C4047: '=' : 'int ' differs in levels of indirection from 'struct car_list *' F:\jhu\dguvgd\scs.c(132) : warning C4047: '!=' : 'int ' differs in levels of indirection from 'void *' F:\jhu\dguvgd\scs.c(142) : error C2223: left of '->car' must point to struct/union F:\jhu\dguvgd\scs.c(142) : error C2198: 'strcmp' : too few actual parameters F:\jhu\dguvgd\scs.c(150) : error C2143: syntax error : missing ';' before 'type' F:\jhu\dguvgd\scs.c(169) : error C2223: left of '->parking_position' must point to struct/union F:\jhu\dguvgd\scs.c(169) : fatal error C1903: unable to recover from previous error(s); stopping compilation Error executing cl.exe.  scs.obj - 5 error(s), 4 warning(s)

我们用的这个编译器。错误gengduol


Question: 我想在这段代码开头加一个欢迎界面和背景音乐

VS2015+Windows10 64位编译通过  #include "stdafx.h" #include <Windows.h> #pragma comment(lib,"winmm.lib")  void creat_ShuZu ( 	int num[], int length)//创建长度是length的数组num { 	int i; 	for (i = 0; i<length; ++i) 	{ 		printf("第 %d 个元素：", i + 1); 		scanf_s("%d", &num[i]);  	} 	printf("数组创建完成！\n"); } void jiangXu(int num[], int length)//降序排列数组num中的元素 { 	int i, j; 	int temp;//临时变量  	for (i = 0; i<length - 1; ++i) 	{ 		for (j = i; j<length - 1; ++j) 		{ 			if (num[i] < num[j + 1])//num[i]与num[j+1]值互换 			{ 				temp = num[i]; 				num[i] = num[j + 1]; 				num[j + 1] = temp;  			} 		} 		printf("%d  ", num[i]); 	} 	printf("%d\n", num[9]); } void zheBan_Search(int need_find_num, int num[], int length)//折半查找算法查询整型数字need_find_num是否在数组num中 { 	int low, mid, high; 	int flag = 0; 	low = 1; 	high = length;  	while (low <= high) 	{ 		mid = (low + high) / 2;  		if (need_find_num < num[mid - 1]) 			low = mid + 1;  		else if (need_find_num > num[mid - 1]) 			high = mid - 1; 		else 		{ 			flag = mid; 			printf("查询结果： 找到了,数%d在数组的第%d位\n", need_find_num, flag); 			break; 		}  	} 	if (flag == 0) 		printf("查询结果：  %d不是该数组中的元素\n", need_find_num); }  int main() { 	PlaySound(_T("C:\\See You Again.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP); 	unsigned timer = 3; 	char op; 	printf("welcome!\n"); 	while (timer != 0) { Sleep(1000); timer--; } 	system("cls"); 	scanf_s("%c", &op); 	if (op == 'q') 		exit(0); 	int num[10]; 	int need_find_num;//需要在数组num中查询的整型数字 	printf("创建一个长度是10的数组: \n"); 	creat_ShuZu(num, 10);  	printf("将数组中的元素降序排列: \n"); 	jiangXu(num, 10);  	char isContinue; 	printf("(y或Y)开始查找，其他退出："); 	fflush(stdin); 	scanf_s("%c", &isContinue); 	while (isContinue == 'y' || isContinue == 'Y') 	{ 		printf("请输入一个要查找的整型数据："); 		scanf_s("%d", &need_find_num); 		printf("折半算法查询%d是否为数组中的一个元素...\n", need_find_num); 		zheBan_Search(need_find_num, num, 10);  		printf("\n\n继续查找？其他退出(Y/y)"); 		fflush(stdin); 		scanf_s("%c", &isContinue);  	} 	printf("已经成功退出！\n");  	return 0; }

#include<stdio.h>  void creat_ShuZu(int num[],int length)//创建长度是length的数组num {     int i;      for(i = 0; i<length; ++i) {         printf("第 %d 个元素：", i+1);         scanf("%d", &num[i]);     }     printf("数组创建完成！\n"); } void jiangXu(int num[],int length)//降序排列数组num中的元素 {     int i,j;     int temp;//临时变量      for(i=0; i<length-1; ++i)     {         for(j=i; j<length-1; ++j)         {             if (num[i] < num[j+1])//num[i]与num[j+1]值互换             {                 temp = num[i];                 num[i] = num[j+1];                 num[j+1] = temp;              }         }         printf("%d  ",num[i]);     }     printf("%d\n",num[9]); } void zheBan_Search(int need_find_num,int num[],int length)//折半查找算法查询整型数字need_find_num是否在数组num中 {     int low,mid,high;     int flag = 0;     low = 1;     high = length;      while (low <= high)     {         mid = (low + high)/2;          if (need_find_num < num[mid-1])             low = mid + 1;          else if (need_find_num > num[mid-1])             high = mid - 1;         else         {             flag = mid;             printf("查询结果： 找到了,数%d在数组的第%d位\n",need_find_num,flag);             break;         }      }     if (flag == 0)         printf("查询结果：  %d不是该数组中的元素\n",need_find_num); }  int main(void)//主函数 {     int num[10] ;     int need_find_num;//需要在数组num中查询的整型数字     printf("创建一个长度是10的数组: \n");     creat_ShuZu(num, 10);      printf("将数组中的元素降序排列: \n");     jiangXu(num,10);      char isContinue ;     printf("(y或Y)开始查找，其他退出：");     //fflush(stdin);     getchar();     scanf ("%c",&isContinue);     while (isContinue == 'y' || isContinue == 'Y')     {         printf("请输入一个要查找的整型数据：");         scanf("%d", &need_find_num);         printf("折半算法查询%d是否为数组中的一个元素...\n",need_find_num);         zheBan_Search(need_find_num,num,10);          printf("\n\n继续查找？其他退出(Y/y)");         getchar();         scanf("%c",&isContinue);      }     printf("已经成功退出！\n");      return 0; } 代码编译没有问题；但是运行时，fflush(stdin);这句是想刷新标准输入，清空标准输入，但是实际上使用fflush(stdin)；操作是未定义的，即可能起不到清空输入缓冲的作用；fflush(stdout);刷新标准输出是可以的，对于stdin是未定义的。 建议看一下这个博客； https://my.oschina.net/deanzhao/blog/79790

一直提示void creat 那一行错误

我想把这一段代码放到开头  但是一直错误 #pragma comment(lib,"winmm.lib")  int main() {PlaySound ("C:\See You Again.wav",NULL,SND_FILENAME | SND_ASYNC | SND_LOOP );     unsigned timer=3;   char op;   printf("welcome!\n");   while(timer != 0) { Sleep(1000);timer--; }   system("cls");   scanf("%c",&op);   if(op == 'q')     exit(0);        /* dosomething... */


Question: QSqlTableModel::removeRows()删除数据库不彻底，代码如下：

最后追踪，发现是语句 sqlmodel.submitAll();出现问题： QSqlError("8180", "QODBC3: Unable to execute statement", "[Microsoft][ODBC SQL Server Driver][SQL Server]The data types nvarchar(max) and ntext are incompatible in the equal to operator. [Microsoft][ODBC SQL Server Driver][SQL Server]Statement(s) could not be prepared.")

try...catch...


Question: 求大神解释一下这段程序

仅供参考：//带表头结点的单向链表 #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-> //

void insert(struct student *stu) {     struct student *p0, *p1, *p2;      p1 = head;     p0 = stu;      if(head == NULL)     {         head = p0;         p0->next = NULL;     }     else     {         while((p0->num > p1->num)&&(p1->next != NULL))         {             p2 = p1;             p1 = p1->next;         }         if(p0->num <= p1->num)         {             if(head == p1)                 head = p0;             else                 p2->next = p0;             p0->next = p1;         }         else         {             p1->next = p0;             p0->next = NULL;         }     }     TOTAL_NUM++; }  这个函数的功能从函数名可以看出来是插入一个节点； 若链表为空，则将新节点作为头节点，然后链接长度加1，退出函数； 若链表非空，则找到比新节点的num值小的节点，若找到，则判断该节点是否为头节点，若为头节点则将新节点作为头节点，找到的节点链接到新节点的next指针位置。若该节点不是头节点，则将新节点插在该节点的前面；                    若未找到比新节点小的节点，则直接将新节点查到链表末尾； 该函数处理之后，保证链表是一个按照num的值递增的链表。

这段代码是在一个单向无头结点不循环的链表中有序的插入一个新的结点。  代码中考虑到了在链表起始，中间，结尾处等不同地方插入的情况，保证了链表的完整性。

好的，谢谢

这个就是在链表中插入一个节点的算法。分为在链表前插入，在链表中间插入，在链表尾部插入三种情况。


Question: 求大神指导我这样求数组的逆置怎么多出来一个元素

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

边界条件

#include <iostream> #include <stdio.h>  int max(int *s) {     int value=*s;     for(int i=1;i<10;i++)     {         if(value<*(s+i))         {             value=*(s+i);         }     }     return value; } int inverse(int *a, int len) {     int *p = a;     int *b = a + len - 1;     while (p < b)     {         int temp=*p;         *p = *b;         *b = temp;         p++;         b--;     }     for(int i = 0; i< len; i++) {         printf("%d\n", *(a+i));     }      return *a; }  int main() {     int buf[10] = {34,21,56,23,13,67,17,48,22,24};     //int i =max(buf);     //printf("%d\n",i);     printf("%d\n",inverse(buf, 10));     return 0; } 自己解决了问题更好呀。建议inverse传递两个参数进去。另外，p和b的自增，去掉前面的*，因为你没有对引用做处理。

指出你的一个问题，*p++, *b--是没有意义的，虽然运行结果没有错。不知你有没有想过，既然只是想将p和b做指针偏移；为什么还要“*”呢？ 直接使用p++, b-- 就OK了。

找到原因就结贴给分吧。另外，再指出你一个问题：*p++; *b--;最好写成p++, b--

把main函数里的printf("%d\n",inverse(buf));改成inverse(buf);

对不起打扰大家了，找到原因了，return *a，它返回了一个24 这样改了一下就没有问题了 void inverse(int *a) { int *p = a; 	int *b = a+9; 	while (p < b) 	{ 		int temp=*p; 		*p = *b; 		*b = temp; 		*p++; 		*b--; 	}   for(int i=0;i<10;i++)    { 	printf("%d\n",*(a+i));    } 		 }  int main() { 	int buf[10]={34,21,56,23,13,67,17,48,22,24}; 	//int i =max(buf);      //printf("%d\n",i); 	inverse(buf); 	return 0; }


Question: 求大神解释一下这个c语言程序

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

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

void query_by_num() {     int num;     struct student *p1;     printf("请输入学生的学号：");     scanf("%ld", &num);     if(head==NULL)     {         printf("无学生记录！\n");         return;     }     p1=head;     while(num!=p1->num && p1->next!=NULL)         p1=p1->next;     if(num == p1->num)     {         printf("\n学号\t姓名\t年龄\t性别\t出生年月\t地址\t电话\tE-mail\n");         printf("-------------------------------------------------------------------------------");         display(p1);     }     else         printf("没有该学生记录，请核对！"); } void freeAll() {     struct student *p1, *p2; p1=p2=head;     while(p1)     {         p2=p1->next;         free(p1);         p1=p2;     } }  query_by_num是通过num寻找某个学生的信息。 通过遍历链表，找到num和输入的相等的学生信息； 若链表为空，则直接返回，提示无此学生信息； 若链表不为空：若找到，则输出该学生的信息；若未找到返回并提示未找到。 freeAll是释放链表。

这就是一个链表的储存、遍历、释放。 其中student是该链表的数据结构，所有数据都存放在该结构体中，通过指针方式可以遍历所有有效数据。 你弄懂了链表就知道这是干嘛的了。


Question: 把程序读取出来，写入到一个新的程序，不能正常运行。

引用 4 楼 lgbxyz 的回复:windows写文件，使用文本模式（w）, 与使用二进制模式（wb）是有区别的。 在文本模式下，\n 会被自动替换成 \r\n，这样写出来的文件长度就跟预料中的不一样了。 而在二进制模式下，会原封不动的写入,不会做改变。linux下没有这种问题.  谢谢指点

引用 2 楼 bravery36 的回复:FILE* new_stream = fopen("C://jsb.exe","w"); 改为 FILE* new_stream = fopen("C://jsb.exe","wb");  谢谢你，可以了。但是为什么 w不可以，要用 wb呢

比较一下新文件和源文件的大小，文件属性


Question: 关于extern的问题

这种问题，搜索下关键字系统的了解下更好。 1,extern可以置于变量或者函数前，以标示变量或者函数的定义在别的文件中，提示编译器遇到此变量和函数时在其他模块中寻找其定义; 2,extern告诉链接器在链接的时候用C函数规范来链接（详细查阅，C/C++链接规范）

extern是引用别处定义的全局变量。这个extern的地方是声明，不是定义。定义应该在工程的某个地方，建议在头文件或者源文件里寻找这个全局变量。

引用 2 楼 hou09tian 的回复:同意楼上所说的。 在C++中，声明使得变量名字为程序所知，一个文件如果想使用别处定义的变量则必须包含对那个变量的声明。而定义负责创建与变量相关的实体。如果想声明一个变量而非定义它，就在变量名前添加关键字extern，而且不要显示地初始化变量。  extern int i;//声明 int j;//声明  extern语句如果包含初始值就不再是声明，而变成定义了  extern double pi = 3.1416;//定义  所以，要看一下源代码中使用extern时有没有对其进行初始化，如果已经初始化，则该变量是定义；如果没有初始化，则说明只是对变量进行声明，那么肯定在程序的其它位置处对该变量进行定义，比如头文件或者库文件。但是如果是在dll库文件中定义该变量，那么应该对该变量声明为 extern _declspec(dllimport)。。。。 所以建议在包含所有程序源代码所在的文件夹下搜索这个变量，看看是不是在程序的其它文件中包含了这个变量的定义 笔误，这里应该是  extern int i;//声明 int j;//声明并定义

如果extern声明变量同时给变量赋初值，认为该变量已经定义。 范例如下：  extern int var = 0;  //使用了var，且var有定义，编译成功 int main(void) {  var = 10;  return 0; }  除了这种情况，extern只是声明变量，如果要使用该变量，一定要在别的地方定义此变量。还是上面的例子：  extern int var ;  //使用了var，但var只声明未定义，编译失败 int main(void) {  var = 10;  return 0; }   对第三方库而言，.h文件暴露接口，真正的定义在.lib或者.dll文件中，这两类文件是二进制文件，所以找不到是正常的。  用心回答每个问题，如果对您有帮助，请采纳答案好吗，谢谢！


Question: C语言写的记事本可以实现另存为功能吗？

调用 GetSaveFileName 让用户选择一个路径，然后写入到这个路径。

如果要另存在其他路径下，怎么做？

可以，另存为即用户提供新的保存文件名，将内存里的数据（记事本内容）写入新的文件即可。会有打开文件，写文件，关闭文件的一些操作。

参考Notepad++源代码？

另存为无非就是在新的目录下新建一个文件，然后把源文件的内容拷贝到新文件。 相关技术：C语言文件操作。fopen, fread, fwrite


Question: C写的基于TCP的聊天程序，输出总是204.204.204.204 烫烫烫烫...

围观

不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

引用 2 楼 canmang9702 的回复:能具体说一下在哪里加么，本人小白,谢谢 在接收之前加memset，初始化缓存

引用 楼主 canmang9702 的回复:#define _CRT_SECURE_NO_DEPRECATE #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WinSock2.h>   #include<stdio.h> //加载静态lib文件或者加载动态dll文件   #pragma comment(lib, "ws2_32.lib") void main() { 	//加载套接字库   	WORD wVersionRequested; 	WSADATA wsaData; 	int err; 	wVersionRequested = MAKEWORD(1, 1); 	err = WSAStartup(wVersionRequested, &wsaData); 	if (err != 0) 	{ 		return; 	} 	if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) 		// 检查这个低字节是不是1，高字节是不是1以确定是否我们所请求的1.1版本    		// 否则的话，调用WSACleanup()清除信息，结束函数     	{ 		WSACleanup(); 		return; 	} 	//创建套接字   	SOCKET sockSrv = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);//AF_INET  ipv4协议  SOCK_DGRAM 使用不连续不可靠的数据包连接。SOCK_SEQPACKET可靠 	SOCKADDR_IN addrSrv; 	addrSrv.sin_addr.S_un.S_addr = htonl(INADDR_ANY); 	addrSrv.sin_family = AF_INET; 	addrSrv.sin_port = htons(6000); 	//绑定套接字   	bind(sockSrv, (SOCKADDR *)&addrSrv, sizeof(SOCKADDR)); 	char recvBuf[100]; 	char sendBuf[100]; 	char tempBuf[200]; 	listen(sockSrv, 5); 	SOCKADDR_IN addrClient; 	int len = sizeof(SOCKADDR); 	while (1) 	{ 		//等待并接收数据   		recvfrom(sockSrv, recvBuf, 100, 0, (SOCKADDR *)&addrClient, &len); 		if ('q' == recvBuf[0]) 		{ 			sendto(sockSrv, "q", strlen("q") + 1, 0, (SOCKADDR*)&addrClient, len); 			printf("Chat end!\n"); 			break; 		} 		sprintf(tempBuf, "%s say %s", inet_ntoa(addrClient.sin_addr), recvBuf); 		printf("%s\n", tempBuf); 		//发送数据   		printf("Please input data:\n"); 		gets_s(sendBuf); 		sendto(sockSrv, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrClient, len); 	} 	//关闭套接字   	closesocket(sockSrv); 	WSACleanup(); }//服务端    #define _CRT_SECURE_NO_DEPRECATE #define _WINSOCK_DEPRECATED_NO_WARNINGS #include<WinSock2.h>   #include<stdio.h> //加载静态lib文件或者加载动态dll文件   #pragma comment(lib, "ws2_32.lib") void main() { 	    //加载套接字库   		WORD wVersionRequested; 	    WSADATA wsaData; 	    int err; 	    wVersionRequested = MAKEWORD(1, 1); 	    err = WSAStartup(wVersionRequested, &wsaData); 	    if (err != 0) 		    { 		        return; 		    } 	    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) 		    { 		        WSACleanup(); 		        return; 		    } 	   //创建套接字   	   SOCKET sockClient = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); 	 	   SOCKADDR_IN addrSrv; 	   addrSrv.sin_addr.S_un.S_addr = inet_addr("127.0.0.1"); 	   addrSrv.sin_family = AF_INET; 	   addrSrv.sin_port = htons(6000); 	   connect(sockClient, (SOCKADDR*)&addrSrv, sizeof(SOCKADDR)); 	   		   char recvBuf[100]; 	       char sendBuf[100]; 	       char tempBuf[200]; 	   recv(sockClient, recvBuf, 100, 0); 	 		   int len = sizeof(SOCKADDR); 	 		   while (1) 		   { 		       //发送数据   			   printf("Please input data:\n"); 		       gets_s(sendBuf); 		       sendto(sockClient, sendBuf, strlen(sendBuf) + 1, 0, (SOCKADDR*)&addrSrv, len); 		       //等待并接收数据   			       recvfrom(sockClient, recvBuf, 100, 0, (SOCKADDR *)&addrSrv, &len); 		       if ('q' == recvBuf[0]) 			       { 			           sendto(sockClient, "q", strlen("q") + 1, 0, (SOCKADDR*)&addrSrv, len); 			           printf("Chat end!\n"); 			           break; 			        } 		       sprintf(tempBuf, "%s say %s", inet_ntoa(addrSrv.sin_addr), recvBuf); 		       printf("%s\n", tempBuf); 		 			   }    //关闭套接字   	   closesocket(sockClient); 	   WSACleanup(); 	   }//客户端  想写一个基于TCP的聊天程序，运行总是烫烫烫  1、TCP和UDP套接字，接收和发送的函数都不同，你这个程序问题挺大的，出现204.204.204.204，是打印了inet_ntoa ()函数的返回值，该函数是将十进制网络字节序转换为点分十进制IP格式，即类似192.168.0.1这种。 2、推荐入门网站： http://c.biancheng.net/cpp/socket/ 3、推荐相关博客 http://blog.csdn.net/wxf2012301351/article/category/6932136 4、希望好好加油，不要太着急

aaaa，这是我用UDP改的，不知道哪里不对了，求大神指教

烫烫烫是没有了，可是服务器端会显示204.204.204.204 ，这是为什么，求大神！

能具体说一下在哪里加么，本人小白,谢谢

出现乱码，这是因为字符串数组缺少字符串的结束标志'\0'，建议接收之前，先将缓存初始化一下，比如 memset(recvBuf, 0, 100);


Question: 求用stm32f103rb开发板写显示其cpu电压的代码

您有代码吗？有的话可以给我发一个吗

我搜了，没找到，所以来找大神帮忙。 您可以帮我找个嘛，谢谢了！

望各路大神伸出援助之手！

百度、必应、搜狐、……搜相关关键字。