Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言蚂蚁感冒

回复:
user: user-1
content: /* *且每次最多传染一只，同时同一个地点碰面蚂蚁最多两只，这里的计算方法局限 *很大，楼主可扩展至任意位置任意个数个传染源 *1输入蚂蚁个数 *2输入蚂蚁位置 *3位置各自+1 *4位置为0或100蚂蚁数-1，相邻蚂蚁位置相同各自取反位置, 感冒蚂蚁与下一个蚂蚁位置相 *同感冒蚂蚁数+1 *5蚂蚁数大于1跳至3否则跳至6 *6输出结果 * */ #include<stdio.h> #include<string.h> #include<stdlib.h> #define PMAX 100 #define PMIN 0 int main() {         unsigned int totalantnumber = 0;         unsigned int illant = 0;         signed int pgroupdata[50]; 	signed int *pgroup = pgroupdata; 	unsigned char pcounter = 0; 	unsigned char inputbuf1[5]; 	unsigned char inputbuf2[500]; 	signed int i = 0; 	signed int j = 0; 	signed int tmp = 0; 	unsigned char inputchar = 0; 	memset(inputbuf1, 0, 5); 	memset(inputbuf2, 0, 500); 	//save total ant 	for(i = 0; (i < 1000) && ((inputchar = getchar()) != -1) && ('\n' != inputchar) && ('\r' != inputchar); i++) 	{ 		if((i < 4) && (inputchar <= '9') && (inputchar >= '0')) 			inputbuf1[i] = inputchar; 	} 	inputbuf1[i] = '\0'; 	totalantnumber = atoi(inputbuf1); 	if(totalantnumber > 50) 	{ 		totalantnumber = 50; 	} 	//save ants position 	for(i = 0; (i < 1000) && ((inputchar = getchar()) != -1) && ('\n' != inputchar) && ('\r' != inputchar); i++)         {                 if((i < 500) && (((inputchar <= '9') && (inputchar >= '0')) || '-' == inputchar))                 { 			inputbuf2[i] = inputchar; 		} 		else if((i < 500) && (0x20 == inputchar)) 		{ 			inputbuf2[i] = '\0'; 		} 		         }         inputbuf2[i] = '\0'; 	inputbuf2[i + 1] = '#'; 	i = 0; 	pcounter = 0; 	while('#' != inputbuf2[i]) 	{ 		if( ((inputbuf2[i] <= '9') && (inputbuf2[i] >= '0')) || ('-' == inputbuf2[i])) 		{ 			tmp = atoi(&inputbuf2[i]); 			if(abs(tmp) <= PMAX) 			{ 				pgroup[pcounter] = tmp; 				pcounter++; 				if(pcounter >= 49) 					break; 			} 			while('\0' != inputbuf2[i]) 			{ 				i++; 			} 		} 		else	 		{ 			i++; 		} 	} 	if(pcounter != totalantnumber) 	{ 		return -1; 	} 	//sort to easy 'delete' die ant 	for (j = 0; j < totalantnumber - 1; j++) 	{ 		for (i = 0; i < totalantnumber - 1 - j; i++) 		{ 			if(abs(pgroup[i]) > abs(pgroup[i + 1])) 			{ 				pgroup[i] ^= pgroup[i + 1]; 				pgroup[i + 1] ^= pgroup[i]; 				pgroup[i] ^= pgroup[i + 1]; 			} 		} 	} 	while(totalantnumber) 	{ 		for(i = 0; i < totalantnumber; i++) 		{ 			pgroup[i] += 1; 			if((i > 0) && (i < (totalantnumber - 1)) && ((PMIN == pgroup[i])||(PMAX == pgroup[i]))) 			{ 				return -2; 			} 		} 		tmp = 0; 		if((PMIN == pgroup[0]) || (PMAX == pgroup[0])) 		{ 			pgroup += 1; 			tmp += 1; 		} 		if((PMIN == pgroup[totalantnumber - 1]) || (PMAX == pgroup[totalantnumber - 1])) 		{ 			tmp += 1; 		} 		totalantnumber -= tmp; 		if(totalantnumber <= 1) 			break; 		for(i = 0; i < totalantnumber - 1; i++) 		{ 			if(abs(pgroup[i]) == abs(pgroup[i + 1])) 			{ 				pgroup[i] ^= pgroup[i + 1]; 				pgroup[i+1] ^= pgroup[i]; 				pgroup[i] ^= pgroup[i + 1]; 				if(illant == i) 				{ 					illant++; 				} 			} 		} 	} 	illant++; 	printf("%d\n",illant); 	return 0; }

user: user-2
content: 百度搜相关关键字。  边界条件 输入输出格式 ……
user-0 提问: PAT考试1007. 素数对猜想 (20)

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <math.h>  int main() {     int limit = 0, *prime;     int i = 0, j = 0, k = 0, l = 0, digit = 0;      scanf("%d", &limit);      prime = (int *)malloc(limit * sizeof(int));     if (!prime)         return -1;     if(limit > pow(10, 5))         exit(0);      for(i = 2; i <= limit; i ++)     {         for(j = 2; j < i; j ++)         {             if(i % j == 0)             {                 break;             }         }         if(j == i)             prime[k++] = i;     }     for(l = 0; l < k; l ++) {    /*这个地方是不是应该从0开始？*/         if(prime[l] - prime[l-1] == 2)             digit ++;     }     printf("%d", digit);      return 0; }

user: user-2
content: int limit = 0, prime[1000] = {0}; 改为  int limit = 0,  static int prime[1000] = {0};  在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-2
content: 边界条件 输入输出格式 ……

user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:int limit = 0, prime[1000] = {0}; 改为  int limit = 0,  static int prime[1000] = {0};  在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 堆上是不是可以申请大于1M的空间呢？Linux下malloc是可以的，你说是？
user-0 提问: c语言中scanf函数的转换说明的格式问题

回复:
user: user-0
content: 引用 2 楼 cfjtaishan 的回复:scanf是格式化输入，即你的输入格式要按照scanf的第一个参数的格式来输入 %lf输入double类型数据，不需要在第一个参数里加空格，输入时加上空格用于区分不同的输入即可。这个输入缓冲区会识别。 我知道了，是因为scanf函数读取到最后一个数的时候，要按照%lf_格式来匹配输入，而最后一个数后面只有空白符，而没有输入新的数字字符了，而且%lf_后面的空格可以匹配多个空白字符，所以造成了scanf函数在输入最后一个数据的时候阻塞了，导致最后一个数据输入不了。 谢谢大佬的指点

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 3 楼 xiaowangzi666 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] scanf是格式化输入，即你的输入格式要按照scanf的第一个参数的格式来输入 %lf输入double类型数据，不需要在第一个参数里加空格，输入时加上空格用于区分不同的输入即可。这个输入缓冲区会识别。  就是弄不明白为什么lf%后面有空格的话num数组最后一个输入的数接收不到。 [/quote] 这是因为它要匹配最后一个输入后的空格吧（空格可以匹配tab，回车，不定个的空格）[/quote] 例如我输入 1.0   2.0    3.0  4.0  5.0  6.0  7.0  8.0  这八个数，按lf%_ 后面有个空格这种格式来输出， 每个数中间都隔了两个空格，8.0后面也有2个空格，可是输出的时候8.0 没能赋给数组，数组中只输入到 7.0 这里，如果匹配最后一个空格的话，应该8.0 也输入进去才对啊。。。

user: user-1
content: 引用 3 楼 xiaowangzi666 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] scanf是格式化输入，即你的输入格式要按照scanf的第一个参数的格式来输入 %lf输入double类型数据，不需要在第一个参数里加空格，输入时加上空格用于区分不同的输入即可。这个输入缓冲区会识别。  就是弄不明白为什么lf%后面有空格的话num数组最后一个输入的数接收不到。 [/quote] 这是因为它要匹配最后一个输入后的空格吧（空格可以匹配tab，回车，不定个的空格）

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:scanf是格式化输入，即你的输入格式要按照scanf的第一个参数的格式来输入 %lf输入double类型数据，不需要在第一个参数里加空格，输入时加上空格用于区分不同的输入即可。这个输入缓冲区会识别。  就是弄不明白为什么lf%后面有空格的话num数组最后一个输入的数接收不到。

user: user-1
content: scanf是格式化输入，即你的输入格式要按照scanf的第一个参数的格式来输入 %lf输入double类型数据，不需要在第一个参数里加空格，输入时加上空格用于区分不同的输入即可。这个输入缓冲区会识别。

user: user-0
content: 大神在哪里呀

user: user-2
content: 请判断scanf函数的返回值。 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }
user-0 提问: socket无法接收数据

回复:
user: user-1
content: 接收到数据后，写入一个文档，看看写入的内容是否想要接收的内容。

user: user-2
content: 用抓包工具看下数据包收发是不是正常 如果软件解决不了，得排查硬件是不是有问题

user: user-3
content: 这个要看一下你的socket代码的处理逻辑了
user-0 提问: 请教一个问题，这种写法是什么意思

回复:
user: user-0
content: 谢谢各位不吝赐教

user: user-1
content: 宏定义要写在同一行，一定要分多行写的时候，每一行的最后用'\'表示连接在一起

user: user-2
content: #define ASSERT_HANGUP_FAIL(e) \     if (e != UAPP_OK)\     {\         Util_ErrorBeep(1);\         _Ums_Remove_Card();\         Ums_CommHangUp(UHANGUP_DELAY);\         return UAPP_FAIL;\     }   ///把它想成一个函数就行了 ASSERT_HANGUP_FAIL 是函数名 e 是参数

user: user-3
content: 宏定义，分多行写的形式。\符号是说明宏定义是一个整体
user-0 提问: 下面这个程序为什么执行时按回车没有反应

回复:
user: user-1
content: .不是回车符，\r才是回车，

user: user-2
content: [code=c] #include <stdio.h> #define PERIOD '.'         //定义PERIOD表示. int main(void) {  int ch; int charcount = 0;  while ((ch = getchar()) != PERIOD)   //当输入点（.）这个符号时，循环才会结束，按回车是不会结束循环的 {  if (ch != '"' && ch != '\'')    //当输入既不是双引号(")，也不是斜杠（\）的时候，charcount加1 charcount++;  } printf("There are %d non-quote characters.\n", charcount); return 0; }[/code]

user: user-3
content: #include <stdio.h>  #define PERIOD '.'  int main(void) {      int ch;     int charcount = 0;      while ((ch = getchar()) != PERIOD)     {          if (ch != '\"' && ch != '\\')             charcount++;      }     printf("There are %d non-quote characters.\n", charcount);      return 0; } 程序是遇到'.'退出循环。不过"和\都需要转义一下。

user: user-4
content: if (ch != '"' && ch != '\'') //ch不是"也不是'
user-0 提问: C语言数组多次初始化问题

回复:
user: user-0
content: 引用 3 楼 cfjtaishan 的回复:通过循环或者用memset对其赋值5.2, calloc函数只是在堆上申请空间，并对其初始化为0谢谢， 我也是刚刚查到， 非常感谢

user: user-1
content: 通过循环或者用memset对其赋值5.2, calloc函数只是在堆上申请空间，并对其初始化为0

user: user-2
content: 仅供参考：#include <windows.h> //#include <intrin.h> #include <stdio.h> #define COUNT 8000 __declspec(align(16)) float data[COUNT]; int i; unsigned __int64 nCtr2,nCtr1; int main() { //  for (i=0;i<COUNT;i++) {data[i]=1.0f;printf("%g\n",data[i]);}      QueryPerformanceCounter((LARGE_INTEGER *) &nCtr1);     __asm {         push ecx         push edi         mov ecx,COUNT         mov eax,0xBF800000 //-1.0f         lea edi,data         rep stosd         pop edi         pop ecx     }     QueryPerformanceCounter((LARGE_INTEGER *) &nCtr2);     printf("%I64u\n",nCtr2-nCtr1);      QueryPerformanceCounter((LARGE_INTEGER *) &nCtr1);     __asm {         push ecx         mov eax,0xBF800000 //-1.0f         mov ecx,COUNT/80         movd xmm0,eax         lea eax,data         pshufd xmm0,xmm0,0     __loop:         movdqa [eax+64],xmm0         movdqa [eax+48],xmm0         movdqa [eax+32],xmm0         movdqa [eax+16],xmm0         movdqa [eax],xmm0         add eax,80         sub ecx,1         jnz __loop         pop ecx     }     QueryPerformanceCounter((LARGE_INTEGER *) &nCtr2);     printf("%I64u\n",nCtr2-nCtr1);      QueryPerformanceCounter((LARGE_INTEGER *) &nCtr1); //  data[0]=-1.0f; //  __m128 m128=_mm_load_ps1((float *)&data[0]); //  for (i=0;i<COUNT;i+=4) _mm_store_ps1(&data[i],m128);     __asm {         push ecx         mov eax,0xBF800000 //-1.0f         movd xmm0,eax         shufps xmm0,xmm0,0         lea eax,data         mov ecx,eax         add ecx,COUNT*4 //COUNT*sizeof(float)     loop1:         movaps oword ptr [eax],xmm0         add eax,16         cmp eax,ecx         jb loop1         pop ecx     }     QueryPerformanceCounter((LARGE_INTEGER *) &nCtr2);     printf("%I64u\n",nCtr2-nCtr1);  //  for (i=0;i<COUNT;i++) printf("%g\n",data[i]);      return 0; } //36679 //2228 //4806 //

user: user-0
content: 比如说， fortran 语言中就可以直接  integer :: i, n real, dimension (:,:), allocatable :: a allocate (a(size1, size2)) n = 10000 do i = 1, n   a = 5.2 end do 就会循环一万次，每一次都会直接把二维数组a中的所有元素都赋值为5.2
user-0 提问: 帮忙修改指向指针数组的指针问题，解决我注释的疑问。

回复:
user: user-1
content: 虽然不会报错，但是毫无意义 比如 int *a[3],i,j,k; a[0]=&i;a[1]=&j;a[2]=&k; //区别 a[0]=23;a[1]=54;a[2]=77;

user: user-0
content: /*这儿不要对一堆野指针直接赋值，（N个野指针)*/        arry[i] = (int *)malloc(sizeof(int));         if (!arry[i])             return -1;                                                指针不是指向数组了吗？没赋值给数组的话还算是野指针吗？在这里一定要申请内存吗？

user: user-2
content: #include<stdio.h> #include<stdlib.h>  #define N 5  void _sequence(int *pointer[],int n);  int main() {     int *arry[N];     int **p;     int i;     p = arry;     printf("enter numbers :\n");     for(i=0;i<N;i++) {   /*这儿不要对一堆野指针直接赋值，（N个野指针)*/         arry[i] = (int *)malloc(sizeof(int));         if (!arry[i])             return -1;         scanf("%d", *(p + i));     }     //p = arry;         //冗余代码     _sequence(arry, N);     //p = arry;         //冗余代码     for(i=0;i<N;i++)     {         printf("%d\n",*(*(p+i)));     }     return 0; }  void _sequence(int *pointer[],int n) {     int i,j,k;     int *temp;    /*这个地方可以初始化为NULL，但也可以不初始化，因为下面是先对其赋值 */      for(i=0;i<n-1;i++)               //选择排序法     {         k=i;         for(j=i+1; j<n;j++)             if(*(*(pointer+k)) < *(*(pointer+j)))   /*应该是比较值，而不是指针（地址）*/                 k = j;         if(k!=i)         {             temp = *(pointer+k);             *(pointer + k) = *(pointer+i);             *(pointer+i) = temp;         }     } }  指针是比较晦涩的知识点，建议楼主好好体会。先从一重指针开始，然后是二重指针。 另外，建议弄懂两个概念：指针数组和数组指针。

user: user-3
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-0
content: 一般是不是要初始化z指向为NULL?   那种特意声明一个数组让其指向的又是有什么区别呢

user: user-4
content: int *temp;    //为啥指针不指向变量却可以直接用？  if(k!=i)         {           temp=*(pointer+k);   *(pointer+k)=*(pointer+i);   *(pointer+i)=temp;	 } 根据你的代码，temp指针虽然没有初始化，但是你第一次使用前会先让它指向变量temp=*(pointer+k);就没问题了。如果没有指向变量就去访问指针就不允许。
user-0 提问: 关于C语言数组的问题

回复:
user: user-0
content: 才看到，敲错了

user: user-1
content: 1 数组的初始化 在函数体外定义的内置数组，其元素均初始化为0；在函数体内定义的内置数组，其元素无初始化。 数组arr1是在函数体内部定义的，所以没有初始化。我在VS2015 Windows64位下的输出是  数组arr1的地址是0x0x00effd60，从下图可以看到，arr1数组中所有元素的值都是0xCCCCCCCC，即-858993460  可以在你的程序中观察arr1的地址，之后查看该地址中的值，是否是0x00000004 2 数组下标 你程序的目的应该是输出arr1的所有元素，在调用aranpo()函数后，再次输出arr1的所有元素。需要注意的是，数组元素从0开始计数，对于一个包含5个元素的数组，正确的下标值是0到4，而不是1到5。所以，我觉得你的代码应该都是   for(int i =0;i<5;i++)     printf("%d  ",arr1[i]); 而不是  for(int i =0;i<5;i++)     printf("%d  ",arr1[5]); 此时的输出可以看到，在调用aranpo()函数后，arr1数组中的元素与arr数组中的元素相同了。但是第一次输出arr1的数组时仍然是-858993460，可以考虑在定义arr1数组时对其进行初始化  int arr1[5] = { 0 }; 此时的输出为

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

user: user-2
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-3
content: 打印arr1[5]是一个越界行为，下标只能从0～4，对于越界行为结果是未定义的，也有可能是段错误出现。

user: user-4
content: 引用 5 楼 JILAU_WHO_AM_I_Q234 的回复:传递数组作为参数实际上是指针对吧，也就是说可以在函数中修改原来的数据 是的，传递数组其实传的是地址

user: user-0
content: 传递数组作为参数实际上是指针对吧，也就是说可以在函数中修改原来的数据

user: user-5
content: 输出的都是一个值！

user: user-6
content: int arr[5]，实际上只有 arr1[0],arr1[1],arr1[2],arr1[3],arr1[4]五个元素，你用的arr1[5]已经超出了范围，显示的就不知道是什么了~~~  #include <stdio.h> void aranpo(const int array[],int array1[],int n); int main(void) {     int arr[5] = {4,6,2,3,9};     int arr1[5];     for(int i =0;i<5;i++)     printf("%d  ",arr1[i]);     putchar('\n');     aranpo(arr,arr1,5);      for(int i =0;i<5;i++)     printf("%d  ",arr1[i]);     putchar('\n');     return 0; }  void aranpo(const int array[],int array1[],int n)   {     for(int i = 0;i<n;i++)     {         array1[i] = array[i];      }        }

user: user-7
content: 你打印的一直是 arr1[5]，所以输出的都是同一个值。而且 5 越界了，应该是 0-4，所以输出的值是什么应该是无法预测的。我的编译器结果就是输出 0.

user: user-4
content: 循环变量没有用上呀  void aranpo(const int array[],int array1[],int n) { 	for(int i = 0;i<n;i++) 	{ 		array1[i] = array[i]; 	}  }  int _tmain(int argc, _TCHAR* argv[]) { 	int arr[5] = {4,6,2,3,9}; 	int arr1[5]; 	for(int i =0;i<5;i++) 		printf("%d  ",arr[i]); 	putchar('\n'); 	aranpo(arr,arr1,5); 	for(int i =0;i<5;i++) 		printf("%d  ",arr1[i]); 	putchar('\n'); 	return 0; }
user-0 提问: 怎样实现一个平面任意切割长方体的体积算法？

回复:
user: user-0
content: 谢谢！我得思考一下

user: user-1
content: 至少要分这么多情况分别讨论吧：

user: user-1

user: user-0
content: 能不能稍微讲的细一点！

user: user-1
content: 布尔操作。 编辑对象、物理属性、体积。

user: user-1
content: 参考中文版3DS Max联机帮助。

user: user-2
content: 体积难道会变化 ???
user-0 提问: C语言比较三个数字大小求助

回复:
user: user-0
content: 引用 3 楼 cfjtaishan 的回复:代码是没问题，编辑程序建议切换至英文输入法，并且是半月状态。  谢谢，确实是输入法的原因，新手，见笑了

user: user-1
content: 代码没有问题！

user: user-2
content: 代码是没问题，编辑程序建议切换至英文输入法，并且是半月状态。

user: user-0
content: 引用 1 楼 D1352612146 的回复:你好，代码没有出错，我用你的代码跑了，结果正确，你可能是跑的时候输入过程中没有切换成英文输入法的问题.  之前用的win10，没有默认英文输入法，用的搜狗，运行3个正数没问题，就运行第二个数是负数不行，切换之后结果都正确了，估计是搜狗输入法下负号的原因，谢谢

user: user-3
content: 复制过来的代码运行，没毛病。。。

user: user-3
content: 估计楼主输入了空格，导致了数字识别提前结束。。。

user: user-4
content: 代码跑了一遍，没毛病！

user: user-5
content: 你好，代码没有出错，我用你的代码跑了，结果正确，你可能是跑的时候输入过程中没有切换成英文输入法的问题.
user-0 提问: 关于“流stream”的问题

回复:
user: user-1
content: 个人认为流是最伟大的抽象之一。  在真正理解这个概念之前，建议学学Linux的命令行操作，感受下“流”的实际应用。

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

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

user: user-0
content: 第三行的“世纪”改为“实际”！
user-0 提问: c语言怎么动态调用dll函数

回复:
user: user-1
content: http://blog.csdn.net/zhao4zhong1/article/details/53078924 老司机找bug的十年心路历程

user: user-1
content: 引用 8 楼 ccssddnn218 的回复:支持 zhao4zhong1 的大多数观点，他更多的时候是在告诉新人为什么这样做，以及如何去做，在阐述一种通用方法；而不是一个简单的答案。我为什么支持？因为我就受益于他的很多回复，从新手到菜鸟，再到目前，一个稍微有点经验的菜鸟。 http://my.csdn.net/zhao4zhong1

user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 qq_35824650 的回复:] 2楼正解3楼的有点乱 2楼只是说说；3楼才是干货！[/quote] http://bbs.csdn.net/topics/390374955

user: user-2
content: 支持 zhao4zhong1 的大多数观点，他更多的时候是在告诉新人为什么这样做，以及如何去做，在阐述一种通用方法；而不是一个简单的答案。我为什么支持？因为我就受益于他的很多回复，从新手到菜鸟，再到目前，一个稍微有点经验的菜鸟。 http://my.csdn.net/zhao4zhong1

user: user-3
content: 其实DLL都是动态加载，你想问的是不是 如何显式调用dll

user: user-1
content: 引用 5 楼 qq_35824650 的回复:2楼正解3楼的有点乱 2楼只是说说；3楼才是干货！

user: user-4
content: 不是这样的吧，而是将动态库里的函数加载到内存，根据输入的数据，指定执行内存中函数的地址。

user: user-0
content: 注：就像Python交互编程一样

user: user-0
content: 2楼正解3楼的有点乱

user: user-5
content: LoadLibrary

user: user-1
content: 先下载安装MSDN98 MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl  再参考： MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\TRACERES.H MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\TRACEAPI.H MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\DLLTRACE.DSP MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\DLLTRACE.DSW MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\DLLTRACE.MAK MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\DLLTRACE.RC MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\HELLO.ICO MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\MAKEFILE MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\RESOURCE.H MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\TRACE.CLW MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\TRACE.CPP MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\TRACE.DEF MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\TRACE.MAK MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\TRACE.RC MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\TRACE1.DSP MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\DLLTRACE.CLW MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\DLLTRACE.CPP
user-0 提问: C语言初学者 求助帖

回复:
user: user-1
content: continue不是函数，continue就是从本行开始跳到循环开始（包括修改循环变量和判断循环条件），continue之后的循环体不再执行

user: user-2
content: continue的作用是如果ch大于9或者小于0（即字符ch不是数字字符的话），不执行下一句sum++,直接continue回到for当中，进行下一次for循环

user: user-3
content: continue语句导致最近的循环语句的当次迭代提前结束。对于while和do while语句，继续求解循环条件；对于for循环，程序流程接着求解for语句头中的express表达式。 for (i = 0; i < 30; i++) { ch = getchar(); if (ch < '0' || ch > '9') { continue; } sum++; } 如果ch小于’0’或者ch大于’9’，此时说明输入的不是数字字符，则执行continue语句。此时，程序不会向下执行sum++，而是执行for循环中的i++。即当输入的不是数字字符时，数字字符数量不变，而是继续获取下一个输入的字符。 continue语句只能出现在for、while或者do while循环中，包括嵌套在这些循环内部的块语句中。

user: user-4
content: 学习

user: user-5
content: 如果ch不是数字，if语句满足，就会执行continue，本次for循环体内continue之后的语句就不再执行。进入下一次if判断。

user: user-6
content: 如果CH不是数字，就继续下一次循环了。 Continue语句作用就是直接跳至下一次循环，循环体内continue后面的语句不会执行（Sum++），这样就如果输入的是数字，就不会执行continue,而执行sum++

user: user-7
content: if (ch < '0' || ch > '9') { continue; } 如果小于1 大于9  也就是说如果不是数字 就重新循环 不执行下面的语句   这就是continue
user-0 提问: printf("%f ",3);输出的是0000？

回复:
user: user-1
content: 因为float和int的存储结构在内存中完全不一样。所以会出现这么奇怪的问题。

user: user-2
content: printf("%f",1);打印的也是0，float和int的存储方式不同

user: user-0
content: 谢谢，其实我想了解下，看什么书可以从计算机设计的层面理清这个现象的原因？

user: user-3
content: 并不相同，由于%f适用于输入输出f'loat类型的，而3是整形的无法识别，才显示为0.0000，如你输出的是浮点型的就能正常识别了。 例：把3改为3.0

user: user-4
content: 引用 7 楼 kakabulusi 的回复:[quote=引用 3 楼 lin5161678 的回复:] [quote=引用 2 楼 kakabulusi 的回复:] 楼上正解，使用强制转换操作，将数字转化一下格式就能正常显示了。 写成  3f   3.00   都可以实现转换， 除法运算中，也需要进行相应的处理  整数/整数  equal  整数，如果需要转换，写成  3.00/2 或者 3/2.00 或者强制转换后再进行乘除，系统在运算时候会自动对齐操作后再进行运算操作。 3f是语法错误[/quote] 3f 是高版本C++的隐式转换声明，也可能和编译器本身有关，[/quote]应该是你记错了  就算是 C++14  3f 也是一个语法错误

user: user-5
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-6
content: 一般都是变量在printf里，直接3的话有问题吧。再者3是int型。%f是输出float型，不匹配啊。

user: user-4
content: 引用 7 楼 kakabulusi 的回复:[quote=引用 3 楼 lin5161678 的回复:] [quote=引用 2 楼 kakabulusi 的回复:] 楼上正解，使用强制转换操作，将数字转化一下格式就能正常显示了。 写成  3f   3.00   都可以实现转换， 除法运算中，也需要进行相应的处理  整数/整数  equal  整数，如果需要转换，写成  3.00/2 或者 3/2.00 或者强制转换后再进行乘除，系统在运算时候会自动对齐操作后再进行运算操作。 3f是语法错误[/quote] 3f 是高版本C++的隐式转换声明，也可能和编译器本身有关，[/quote]哪个版本?

user: user-7
content: 引用 3 楼 lin5161678 的回复:[quote=引用 2 楼 kakabulusi 的回复:] 楼上正解，使用强制转换操作，将数字转化一下格式就能正常显示了。 写成  3f   3.00   都可以实现转换， 除法运算中，也需要进行相应的处理  整数/整数  equal  整数，如果需要转换，写成  3.00/2 或者 3/2.00 或者强制转换后再进行乘除，系统在运算时候会自动对齐操作后再进行运算操作。 3f是语法错误[/quote] 3f 是高版本C++的隐式转换声明，也可能和编译器本身有关，

user: user-8
content: 3/2  是int类型运算 3.0/2 是浮点类型运算 printf不存在隐式类型转换

user: user-9
content: 输出前要进行类型转换，printf（）不会帮你转换的，如果格式不对就会这样。 	printf ("%f\n",(float)3);

user: user-5
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-10
content: 建议了解一下float在内存中存储方式 http://blog.csdn.net/yezhubenyue/article/details/7436624 建议参考一下这个博主的博客～

user: user-4
content: 引用 2 楼 kakabulusi 的回复:楼上正解，使用强制转换操作，将数字转化一下格式就能正常显示了。 写成  3f   3.00   都可以实现转换， 除法运算中，也需要进行相应的处理  整数/整数  equal  整数，如果需要转换，写成  3.00/2 或者 3/2.00 或者强制转换后再进行乘除，系统在运算时候会自动对齐操作后再进行运算操作。 3f是语法错误

user: user-7
content: 楼上正解，使用强制转换操作，将数字转化一下格式就能正常显示了。 写成  3f   3.00   都可以实现转换， 除法运算中，也需要进行相应的处理  整数/整数  equal  整数，如果需要转换，写成  3.00/2 或者 3/2.00 或者强制转换后再进行乘除，系统在运算时候会自动对齐操作后再进行运算操作。

user: user-2
content: Float 的存储结构和int 不同
user-0 提问: 如何把从文件读出的内容按以下格式存入的链表中

回复:
user: user-1
content: 解析usr和password，然后创建节点，加入链表； 两个难点：解析出usr和password,然后是创建链表；创建链表可以从网上搜一下方法。

user: user-2
content: 读取配置文件，使用节点方式
user-0 提问: C编译后弹出的命令提示符黑框中无法滚动翻页！也无法右键弹出菜单！

回复:
user: user-1
content: 引用 4 楼 fight_in_dl 的回复:引用布局……  选择回答这道题，为什么不好好回答呢，这么语焉不详，典型的混分行为。 没看到截图中有“布局”二字吗？

user: user-0
content: 谢谢各位的回答，我已经知道原因了，特此分享：  如果源代码中有“完成程序功能后循环输入"的语句时，则会出现这种情况，例如：  请输入：XXX XXX（实现功能） 输入N退出程序，否则继续输入：  有这样的代码，则会出现我所说的问题！如果源代码中没有循环输入语句，则一切正常！

user: user-2
content: 引用布局……  选择回答这道题，为什么不好好回答呢，这么语焉不详，典型的混分行为。

user: user-1
content: 布局……

user: user-0
content: 引用 1 楼 fight_in_dl 的回复:引用不能右键弹出上图所示的菜单栏了  如图1，在cmd窗口标题栏上右键点击，打开属性设置对话框   如图2，不要勾选快速编辑模式   谢谢第一时间回答！我目前恰好就只能用你这个方法实现滚动翻页和复制、粘贴等命令！ 如果没有勾选“快速编辑模式”  反而会出现我现在遇到的问题（即是无法滚动翻页和弹出右键菜单）！

user: user-2
content: 引用不能右键弹出上图所示的菜单栏了  如图1，在cmd窗口标题栏上右键点击，打开属性设置对话框   如图2，不要勾选快速编辑模式
user-0 提问: 关于指针的使用问题

回复:
user: user-1
content: char *test3() {     static char buf[120];     char tempbuf[100];      strncpy(tempbuf, "the be in the", strlen("the be in the") + 1);     //printf(tempbuf);     puts(tempbuf);     strcpy(buf,(char*)"Game's Over");      return buf; }

user: user-2
content: malloc/free     new/delete 是一对在堆上开辟内存区的函数，通常情况下是配对使用的。如果只进行前半部分操作，程序不停的开辟内存区而不释放，最终会导致内存资源耗尽直至死机。  另外，malloc  new开辟的内存区与应用程序本身的生命周期相同，而与函数无关，这一点尤其要注意

user: user-0
content: 万分感谢大神指点

user: user-3
content: #include<stdio.h> #include <stdlib.h> #include<string.h>  void test2() {     int i;   /* 改成有符号类型*/      char *aa[] = {"11","22","33","44","55"};      for(i = 4; i>=0;i--)    /*去掉;*/     {         printf("\n");         printf("%s\n", aa[i]);    /* printf参数有问题 或用puts(aa[i]);*/     }     return; }  char *test3() {     char buf[120];     char *tempbuf;      tempbuf = (char*)malloc(100*sizeof(char));     strncpy(tempbuf, "the be in the", strlen("the be in the") + 1);     //printf(tempbuf);     puts(tempbuf);     strcpy(buf,(char*)"Game's Over");      return buf; } int main() {     char *p;     char buf[15]= "asdsfgdhfhgjk";     const int num2 = 2;      test2();     p = buf;      printf("%s\n",buf);      strcpy(buf,p); }  以上是修改后的代码，参考一下吧; 很疑惑，main函数里printf用对了，为什么test2和test3中的printf就用错了呢？ 另外， test3中return buf局部变量，是未定义行为。

user: user-4
content: 引用 4 楼 XiaRiKuHan 的回复:是因为我返回的是局部变量的地址所以不能拷贝么？ 是的，test3里面的buf是局部变量，出了函数就没有了。 楼主可以像下面这句一样，先用malloc分配内存，就可以了。 tempbuf = (char*)malloc(100*sizeof(char));

user: user-0
content: 是因为我返回的是局部变量的地址所以不能拷贝么？

user: user-0
content: /*我把main函数改成这个样子，如何使最后的buf有数据输出*/ int main() { 	char *p; 	char buf[15]= "asdsfgdhfhgjk"; 	const int num2 = 2;  	test2(); 	p= test3();  	printf("p=%s\n",p);  	memset(buf,0,sizeof(buf)); 	strcpy(buf,p);    //哪里不对 	printf("buf=%s\n",buf);    	return 0; }
user-0 提问: 新手求助！！！

回复:
user: user-1
content: #include <stdio.h>  int main()  {      int n = 4;      float x, y, z, s = 0;      printf( "请输入第1个数：");      scanf("%f", &x);      printf( "请输入第2个数：" );      scanf("%f", &y);      printf( "请输入第3个数：" );      scanf("%f", &z);      s = y+z;      while ( x || y || z)      {          s = s + x;         z=y;         y=x;         printf( "请输入%d个数:", n++ );          scanf("%f", &x);               }      printf( "\ns=%f", s);  }

user: user-2
content: #include <stdio.h> int main() {     int n = 4, cnt = 0;     float x, y, z, s = 0;     printf( "请输入第1个数：");     scanf("%f", &x);     printf( "请输入第2个数：" );     scanf("%f", &y);     printf( "请输入第3个数：" );     scanf("%f", &z);     s = y;     while ( x || y || z)     {         s = s + x;         if (cnt == 1)             y = x;         if (cnt == 2)             z = x;         printf( "请输入%d个数:", n++ );         scanf("%f", &x);         if (x != 0)             cnt = 0;         else             cnt++;     }     printf( "\ns=%f", s); } 试一下这种情况。 这个程序有一个bug,即float类型数据，判断是否为0，不能直接与0比较，而是fabs(x) < 0.000001(1e-6);

user: user-0
content: 引用 2楼kugeniha 的回复:#include <stdio.h>  int main()  {      int n = 4;      float x, y, z, s = 0;      printf( "请输入第1个数：");      scanf("%f", &x);      printf( "请输入第2个数：" );      scanf("%f", &y);      printf( "请输入第3个数：" );      scanf("%f", &z);      s = y+z;      while ( x || y || z)      {          s = s + x;         z=y;         y=x;         printf( "请输入%d个数:", n++ );          scanf("%f", &x);               }      printf( "\ns=%f", s);  }感谢

user: user-0
content: 引用 1楼自信男孩 的回复:#include <stdio.h> int main() {     int n = 4, cnt = 0;     float x, y, z, s = 0;     printf( "请输入第1个数：");     scanf("%f", &x);     printf( "请输入第2个数：" );     scanf("%f", &y);     printf( "请输入第3个数：" );     scanf("%f", &z);     s = y;     while ( x || y || z)     {         s = s + x;         if (cnt == 1)             y = x;         if (cnt == 2)             z = x;         printf( "请输入%d个数:", n++ );         scanf("%f", &x);         if (x != 0)             cnt = 0;         else             cnt++;     }     printf( "\ns=%f", s); } 试一下这种情况。 这个程序有一个bug,即float类型数据，判断是否为0，不能直接与0比较，而是fabs(x) < 0.000001(1e-6);感谢
user-0 提问: 用关键字static声明全局const变量的问题

回复:
user: user-1
content: static 出现在函数内部时才具有让  变量是存储在整个程序的“全局数据区域“  的作用. 出现在全局变量和函数定义前面是只是让链接属性变为内部链接而已, 你可以打印变量的地址出来看, 不同的 .c 里面定义的同名的 static 全局变量地址是不一样的.

user: user-2
content: 引用 3 楼 adlay 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] include是在预编译阶段执行的，即将头文件里的内容放到.c文件里。既然const变量在头文件里，那么就是两个.c文件都有该变量的声明了。 加static就不一样了，static的变量（全局）其作用域只能是所在文件里。若在头文件里定义的static变量，只能在头文件里使用。.c文件不能使用。 加了 static, 头文件的内容一样会被插入到两个 .c 里面去的. static 是让两个 .c 出现相同的名字时链接的时候不会冲突 [/quote] 嗯，你说的很对。我的想法是有问题的～刚才简单写代码试了一下

user: user-1
content: 引用 2 楼 cfjtaishan 的回复:include是在预编译阶段执行的，即将头文件里的内容放到.c文件里。既然const变量在头文件里，那么就是两个.c文件都有该变量的声明了。 加static就不一样了，static的变量（全局）其作用域只能是所在文件里。若在头文件里定义的static变量，只能在头文件里使用。.c文件不能使用。 加了 static, 头文件的内容一样会被插入到两个 .c 里面去的. static 是让两个 .c 出现相同的名字时链接的时候不会冲突

user: user-2
content: include是在预编译阶段执行的，即将头文件里的内容放到.c文件里。既然const变量在头文件里，那么就是两个.c文件都有该变量的声明了。 加static就不一样了，static的变量（全局）其作用域只能是所在文件里。若在头文件里定义的static变量，只能在头文件里使用。.c文件不能使用。

user: user-1
content: include 就是把文件的内容插入到当前位置 两个 .c 里面 include 那个头文件就在两个 .c 里面都插入了这个头文件的内容.

user: user-0
content: 引用 5 楼 user-3的回复:还有一种解释： static变量是存储在整个程序的“全局数据区域“，因此即使这个变量被多次插入到.c文件里，实际上仍然是指向同一个变量。 我的理解是：如果没有static那么就相当于在两个c文件都定义式声明了自动变量，然而这两个文件里虽然名字相同，但是分配的内存不同。这样的？

user: user-3
content: 还有一种解释： static变量是存储在整个程序的“全局数据区域“，因此即使这个变量被多次插入到.c文件里，实际上仍然是指向同一个变量。
user-0 提问: 新手求教哪里错，详细指出

回复:
user: user-1
content: 引用 楼主 qq_39681830 的回复:#include<stdio.h> int main() { int i=0; int pass; printf("请输入密码"); scanf("%d",&pass);        while(i<3)        {             if(123!=pass)             {                   printf("密码输入错误，当前输入第%d次密码.\n",i+1);             }              i++        }         return 0;  //自己对比 }

user: user-2
content: 少了个大括号｝

user: user-3
content: #include<stdio.h>  int main() {     int i=0;     int pass;      printf("请输入密码");     scanf("%d",&pass);     while(i<3)     {         if(123 != pass) {             printf("密码输入错误，当前输入第%d次密码.\n",i+1);         } else {             break;         }         i++;         printf("请输入密码");         scanf("%d",&pass);     }     return 0; } 逻辑应该是这样吧

user: user-0
content: 非常感谢各位

user: user-4
content: 引用 6 楼 zhao4zhong1 的回复:偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。  这个方法是我经常用的。。。。。调试程序，特别是别人的程序，速度很快的。

user: user-5
content: 输入密码的printf和scanf应该放在循环里吧，判断密码是否正确的if应该加else并return密码正确 循环外再用一个return 返回密码错误 好像是这个意思

user: user-6
content: 4楼是对的。另外编辑器应该会提示出错的原因，楼主还是根据报错，去自己找，或者百度下。

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

user: user-8
content: return 0拿到大括号外面去
user-0 提问: 关于scanf_s和strcpy_s

回复:
user: user-0
content: 引用 9 楼 ccssddnn218 的回复:[quote=引用 8 楼 qq_38080117 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] #pragma warning(disable:4996) ...问下这个东西是什么意思？用了它VS就不会报错了吗？[/quote] 出现这样的警告，是因为VC2005之后的版本中认为CRT中的一组函数如果使用不当，可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如：strcpy、strcat等。  对于这些问题，VC2005建议使用这些函数的更高级的安全版本，即在这些函数名后面加了一个_s的函数。这些安全版本函数使用起来更有效，也便于识别，如：strcpy_s,calloc_s等。  当然，如果执意使用老版本、非安全版本函数，可以使用_CRT_SECURE_NO_DEPRECATE标记来忽略这些警告问题。办法是在编译选项 C/C++ | Preprocessor | Preprocessor Definitions中，增加_CRT_SECURE_NO_DEPRECATE标记即可。  另外一种解决方法: #pragma warning(disable:4996) //全部关掉 选自：http://www.cnblogs.com/bpbp/archive/2011/07/12/2104775.html[/quote]谢谢大神指点！

user: user-1
content: 引用 8 楼 qq_38080117 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] #pragma warning(disable:4996) ...问下这个东西是什么意思？用了它VS就不会报错了吗？[/quote] 出现这样的警告，是因为VC2005之后的版本中认为CRT中的一组函数如果使用不当，可能会产生诸如内存泄露、缓冲区溢出、非法访问等安全问题。这些函数如：strcpy、strcat等。  对于这些问题，VC2005建议使用这些函数的更高级的安全版本，即在这些函数名后面加了一个_s的函数。这些安全版本函数使用起来更有效，也便于识别，如：strcpy_s,calloc_s等。  当然，如果执意使用老版本、非安全版本函数，可以使用_CRT_SECURE_NO_DEPRECATE标记来忽略这些警告问题。办法是在编译选项 C/C++ | Preprocessor | Preprocessor Definitions中，增加_CRT_SECURE_NO_DEPRECATE标记即可。  另外一种解决方法: #pragma warning(disable:4996) //全部关掉 选自：http://www.cnblogs.com/bpbp/archive/2011/07/12/2104775.html

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:#pragma warning(disable:4996) ...问下这个东西是什么意思？用了它VS就不会报错了吗？

user: user-0
content: 引用 5 楼 hou09tian 的回复:这是strcpy()函数的格式  char *strcpy(      char *strDestination,      const char *strSource    );    这是strcpy_s()函数的格式  errno_t strcpy_s(      char *strDestination,      size_t numberOfElements,      const char *strSource    );   可以看出strcpy()函数是两个参数，而strcpy_s()函数的参数是三个；所以直接把strcpy()改为strcpy_s()就会提示strcpy_s缺少参数。strcpy()函数的第一个参数表示目的字符串，第二个参数表示源字符串；strcpy_s()的第一个参数表示目的字符串；第二个参数表示目的字符串中元素的个数；第三个参数表示源字符串；如果把strcpy()改为strcpy_s()，只需要再为strcpy_s()添加一个参数，该参数添加到strcpy_s()函数的第二个参数位置上，为目的字符串中元素的个数，如  char dest[100] = {0}; strcpy(dest, "12345");  改为  char dest[100] = {0}; strcpy_s(dest,100, "12345"); 明白了，万分感谢！

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:#pragma warning(disable:4996) ...好的，谢谢

user: user-2
content: 这是strcpy()函数的格式  char *strcpy(      char *strDestination,      const char *strSource    );    这是strcpy_s()函数的格式  errno_t strcpy_s(      char *strDestination,      size_t numberOfElements,      const char *strSource    );   可以看出strcpy()函数是两个参数，而strcpy_s()函数的参数是三个；所以直接把strcpy()改为strcpy_s()就会提示strcpy_s缺少参数。strcpy()函数的第一个参数表示目的字符串，第二个参数表示源字符串；strcpy_s()的第一个参数表示目的字符串；第二个参数表示目的字符串中元素的个数；第三个参数表示源字符串；如果把strcpy()改为strcpy_s()，只需要再为strcpy_s()添加一个参数，该参数添加到strcpy_s()函数的第二个参数位置上，为目的字符串中元素的个数，如  char dest[100] = {0}; strcpy(dest, "12345");  改为  char dest[100] = {0}; strcpy_s(dest,100, "12345");

user: user-0
content: 那就是说其他平台不能用了？

user: user-3
content: #pragma warning(disable:4996) ...

user: user-4
content: 缺少必要的头文件，你查一下这两个函数在哪个头文件里面，然后包含进去就行了

user: user-5
content: scanf_s这两个函数只有微软的平台有，请谨慎使用
user-0 提问: 字符串的操作求助

回复:
user: user-1
content: 仅供参考 #define LEN 64 struct DATA { 	char name[LEN]; 	char password[LEN]; 	DATA *next; };  // 解析字符串，构建链表 void BuildList(const char * src ,DATA **pHead) { 	DATA *pTemp = *pHead; 	const char *pEnd = src + strlen(src); 	const char* pPos1 = src-1; 	const char* pPos2 = pPos1; 	const char* pPos3 = pPos1;  	while (pPos1 < pEnd && pPos2 && pPos3 ) 	{ 		pPos2 = strstr(pPos1, ":"); 		if (pPos2) 		{ 			pPos3 = strstr(pPos2, ";"); 		} 		if (!pPos2 || !pPos3) 		{ 			break; 		} 		DATA *p = (DATA*)malloc(sizeof(DATA)); 		memset(p->name, 0, LEN); 		memset(p->password, 0, LEN); 		p->next = NULL; 		strncpy(p->name, pPos1 + 1, pPos2 - pPos1 - 1); 		strncpy(p->password, pPos2 + 1, pPos3 - pPos2 - 1); 		if (*pHead) 		{ 			(*pHead)->next = p; 			*pHead = p; 		} 		else 		{ 			*pHead = p; 			pTemp = *pHead; 		} 		pPos1 = pPos3; 	} 	*pHead = pTemp; }  // 销毁链表 void DestroyList(DATA *pHead) { 	DATA *p = NULL; 	while (pHead) 	{ 		p = pHead->next; 		free( pHead); 		pHead = p;  	} }  int _tmain(int argc, _TCHAR* argv[]) { 	char str[] = "user1:dsfds;user2:vcfgfe767fd;user3:user3lfjdk87f;";  	// 构建链表 	DATA *pHead = NULL; 	BuildList(str, &pHead);  	// 浏览一下 	DATA *p = pHead; 	while (p) 	{ 		printf("[%s]:[%s]\n", p->name, p->password); 		p = p->next; 	}  	// 释放链表空间 	DestroyList(pHead);  	return 0; }

user: user-2
content: 也可以使用sscanf来实现

user: user-3
content: 自己写一个split ，先按照;分开，再按照：分开

user: user-4
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-5
content: 有相应的C的库函数，先按“；”分隔，然后再按“：”分隔，这样就能取到值了
user-0 提问: c语言修改文本文件的特定行的特定元素

回复:
user: user-1
content: 程序目前不能直接修改文件里指定行或指定行里的某列。只能现将数据加载（读）到内存，在内存里修改，然后再写到文件里。 根据你的文件数据格式，建议使用fscanf/fprintf来操作。自己先写写吧，有问题再提出来。

user: user-2
content: 引用应该怎么办  照这个例子改吧：http://www.sanfoundry.com/c-program-update-employee-details-employee-files/ 说明： 1  重点看update_rec函数 2  题目中记录的关键列是 套餐编号，以它为索引进行查找并修改对应记录，注意 套餐编号 不能重复  能照着例子把题目完成，C语言这门课就可以毕业了^_^

user: user-3
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224
user-0 提问: 指针的指针，可以的话顺便找位老师，有空能帮忙指出我写不好的错误代码就万分感谢啦！

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-0
content: 恩，谢谢两位，我在吸收呢，我现在疑惑，用指针对地址内容进行修改，不是也可以吗？

user: user-2
content: 引用 2 楼 lgbxyz 的回复:字符串是存储在静态区,不是string数组中,不能通过strcpy等等任何方式修改  #include <stdio.h> #include <string.h>  int main(void) { 	char *string[] = {"english", "frans", "vcpuls", "understan", "forced"}; 	char **pointer = string; 	char a[10]; 	char *temp = a; 	int i, j, k; 	 	for(j = 0; j < 4; j++) { 		k = j; 		for(i = j; i < 5; i++) {    			if(strcmp(*(pointer+i), *(pointer+k)) > 0) { 				k=i;    			} 		}    		if(k != j) {  			temp = string[j]; 			string[j] = string[k];          	string[k] = temp; 		} 	} 	 	for(i = 0; i < 5; i++)     	printf("%s\n",*(pointer+i)); 	 	return 0; }     这种办法也不错哦～+++

user: user-0
content: 开辟栈动态区我还没掌握···这道题出在指针数组那章的。为啥平常的数字可以交换更改数据呀，这里的指针数组却不行？指针指向的是*string的地址呀，为啥用temp = string[j];   呀。                                                 string[j] = string[k];                                                 string[k] = temp;

user: user-3
content: 字符串是存储在静态区,不是string数组中,不能通过strcpy等等任何方式修改  #include <stdio.h> #include <string.h>  int main(void) { 	char *string[] = {"english", "frans", "vcpuls", "understan", "forced"}; 	char **pointer = string; 	char a[10]; 	char *temp = a; 	int i, j, k; 	 	for(j = 0; j < 4; j++) { 		k = j; 		for(i = j; i < 5; i++) {    			if(strcmp(*(pointer+i), *(pointer+k)) > 0) { 				k=i;    			} 		}    		if(k != j) {  			temp = string[j]; 			string[j] = string[k];          	string[k] = temp; 		} 	} 	 	for(i = 0; i < 5; i++)     	printf("%s\n",*(pointer+i)); 	 	return 0; }

user: user-2
content: #include<stdio.h> #include<string.h>  int main() {     char string[][10] = {"english","frans","vcpuls","understan","forced"};     char (*pointer)[10];     char *temp;     char a[10];     temp = a;     int i,j,k;      pointer = string;     for(j=0;j<4;j++)     {         k = j;         for(i =j + 1; i < 5; i++)             if(strcmp(*(pointer+i),*(pointer+k)) > 0)                 k = i;         if(k != j)         {             strcpy(temp,*(pointer+k));             strcpy(*(pointer+k), *(pointer+j));             strcpy(*(pointer+j),temp);         }     }      for(i=0;i<5;i++)         printf("%s\n",*(pointer+i));     return 0; }  改一下即可； string是指针数组，里面的字符串都是字符串常量，因此是不可以修改的。但是选择排序里通过strcpy又是对这些字符串修改。因此是矛盾的，修改会导致段错误； 修改的办法是将字符串常量拷贝到栈上，即申请5 × 10的字符空间，每个字符串在栈上申请10个字符空间，将这些只读字符串拷贝到栈上，在栈上操作就没问题。
user-0 提问: 帮忙解决下? unpass调用完全无数据输出，这题是求平均数和第一门成绩均分等的题目，新生一个，如果用(*)[5]作形参，如何写函数呢？求解

回复:
user: user-1
content: u[i*4+j]这样对吗

user: user-0
content: u[i*4+j]，这个不对吧，已经溢出来了

user: user-0
content: 没有耶，想上传个图的，却转圈圈····其它数据是有的，就是unpass那里没有

user: user-2
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 for_grasp 的回复:] 传地址后，还是有问题，可执行，没有数据输出， 我改过你的程序后，测试了，有数据呢；你有没有发现你的代码里，在for循环那行最后有一个分号，这个分号导致你没有数据输出[/quote] 抱歉，没有分号； 我的代码建议你运行一下，看看是否还会出现没有输出的问题。

user: user-2
content: 引用 2 楼 for_grasp 的回复:传地址后，还是有问题，可执行，没有数据输出， 我改过你的程序后，测试了，有数据呢；你有没有发现你的代码里，在for循环那行最后有一个分号，这个分号导致你没有数据输出

user: user-0
content: 传地址后，还是有问题，可执行，没有数据输出，

user: user-2
content: #include<stdio.h>      void all(float up[][5]);     void average(float *av);     void unpass(float *u,int *s);  int main() {     int stu[4];     float course[4][5];     float (*p)[5];     p = course;     int i,j;     printf("enter four student's number\n");     for(i=0;i<4;i++)                           //输入学号     {         scanf("%d", &stu[i]);     }     putchar('\n');     printf("enter for student's score \n");     for(i=0;i<4;i++)                     //输入4X5 成绩     {         for(j=0;j<5;j++)         {             scanf("%f",*(p+i)+j);         }     }     getchar();     all(course);                   //分别调用三个函数     average(course[0]);     unpass(&course[0][0],stu);     return 0; }  void unpass(float *u,int *s) {     putchar('\n');     float un=0;     int i,j;     printf("the student who is did not pass:\n");     for(i=0;i<4;i++,u++)     {         for(j=0;j<5;j++)         {             if((*u+j)<60)                 un++;         }         if(un>=2)         {             printf("%d %f %f %f %f %f \n", *(s+i), *u,*(u+1),*(u+2),*(u+3),*(u+4));             un=0;             continue;         }     } }   void average(float *av) {     float average,sum=0;     int i;     printf("average one is :\n");     for(i=0;i<4;i++)     {         sum=sum+(*av+i);     }     average=sum/4;     printf("%f",average); }  void all(float up[][5]) {     float av,all,sum=0,tip=0;     int i,j;     printf("two course are beyond 90 :\n");     for(i=0;i<4;i++)     {         for(j=0;j<5;j++)         {             sum=sum+up[i][j];         }         av=sum/5;         if(av>=90)printf(" %f %f %f %f %f \n",up[i][0],up[i][1],up[i][2],up[i][3],up[i][4]);         av=0;sum=0;     }     printf("all course are beyong 85:\n");     for(i=0;i<4;i++)     {         for(j=0;j<5;j++)         {             if(up[i][j]>=85)tip++;         }         if(tip==5)printf(" %f %f %f %f %f \n",up[i][0],up[i][1],up[i][2],up[i][3],up[i][4]);         tip=0;     } }
user-0 提问: while结构死循环的问题

回复:
user: user-1
content: 加个fflush(stdin);

user: user-0
content: 嗯嗯。热心大神。

user: user-2
content: 引用缓冲区里的e跳不过去  我之前答案里写错了。你理解的是对的 我看已经结帖了就没再发出来^_^

user: user-0
content: 是e留在缓冲区吧，scanf输入的是数字，回车像空格一样会被忽略

user: user-2
content: 引用死循环 这是因为回车字符'\n'遗留在缓冲区造成的。  可以这样：  #include <stdio.h> #include <cctype>  int main(void) { 	int number; 	char c = '0'; 	if (scanf("%d", &number) == 0) { 		printf("You input a wrong integer,please input again:\n"); 		do { 			c = getchar(); 		} while (!isdigit(c)); 		ungetc(c, stdin); 	} }

user: user-0
content: 啊，我知道了，输入e的话，缓冲区里的e跳不过去，下次读取sacnf时，遇到的还是e，所以无限循环。

user: user-0
content: 能请教下为什么吗，我试了加 getchar（）；也行。
user-0 提问: 求助找游戏变化基址  

回复:
user: user-1
content: 过一遍Cheat Engine联机教程？

user: user-2
content: 这种问题, 你在这里是问错地方的. 应该去看雪这类的更专业点的网站上问, 那上面基本上多是搞逆向的.
user-0 提问: 关于宏定义的问题

回复:
user: user-1
content: 写了篇关于宏定义的小文章 http://blog.csdn.net/hou09tian/article/details/76566000 请多指教

user: user-2
content: 仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-3
content: 加上大括号，说明SWAP是一个语句体，即一起执行；若不加大括号，就是不是一个语句体。  宏定义就是在编译的预处理阶段等价替换，若等价替换，你可以模拟一下预处理，然后看一下结果是不是符合你的逻辑。

user: user-0
content: 2楼的大神。。对不起啊，第一次用给分功能，你的分没给成

user: user-1
content: 同意楼上的看法。 宏展开是在预处理阶段完成的，这个阶段把替换文本只是看作一个字符串，并不会有任何的计算发生，在展开时是在宏出现的地方 只是简单地使用串来代替，并不会增添任何的符号。  如果是自己编程使用宏替换，则在使用简单宏定义时，当字符串中不只一个符号时，加上括号表现出优先级，如果是带参数的宏定义，则要给宏体中的每个参数加上括号，并在整个宏体上再加一个括号。所以更安全的写法是 #define SWAP((a),(b),(t)) { t=a; a=b; b=t; }

user: user-4
content: 引用区别  宏定义在预编译阶段 纯文本替换 以上两种定义是有区别的，举例： 第一种定义 if(true) SWAP(a, b, t) 展开为： if(true)  { t=a; a=b; b=t; }   第二种定义 if(true) SWAP(a, b, t) 展开为： if(true) t=a; a=b; b=t; //if判断条件只对t=a;有影响   这样你应该能看出两者的区别了吧^_^
user-0 提问: C语言函数返回的值与实际不符

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:你得在函数调用之前 做函数声明    谢谢。。原来C语言不能像java那么自由，声明必须要在main函数前面

user: user-0
content: 谢谢。。原来C语言不能像java那么自由，声明必须要在main函数前面

user: user-1
content: 你得在函数调用之前 做函数声明
user-0 提问: 这个题目要求精度在0.0005,但是通过调试，我发现它在大于0.0005时依旧没有退出do 循环

回复:
user: user-1
content: 你的代码没什么问题while循环是可以退出循环的。但是fun函数，传进去的实参没有使用，不知道为什么？！ 建议楼主查看一下你的代码和你发出来的代码是不是同一个。

user: user-1
content: 引用 1 楼 fight_in_dl 的回复:do {    statement(s); } while( condition );  //当conditon为真，继续循环。当condition为假，退出循环  如果想当t大于0.0005时，退出循环，需要改成：        do { 		t = A / B; 		s = s + t; 		A = A*(a + 1); 		a = a + 1; 		B = B*(b + 2); 		b = b + 2; 	} while (t < 0.000500);   这样改确实是退出循环了，但是循环体只执行了一次。

user: user-2
content: do {    statement(s); } while( condition );  //当conditon为真，继续循环。当condition为假，退出循环  如果想当t大于0.0005时，退出循环，需要改成：        do { 		t = A / B; 		s = s + t; 		A = A*(a + 1); 		a = a + 1; 		B = B*(b + 2); 		b = b + 2; 	} while (t < 0.000500);
user-0 提问: C语言while循环中不能用true

回复:
user: user-1
content: 引用为什么会有这个错误呢 和C++不一样，C语言并没有布尔类型，在C语言中认为 0为假，非0为真， 所以条件表达式的写法非常灵活。  例如： char a = 'Y'; if(a) //合法  int i = 3; int *j = &i; if(j) //合法 0为假，非0为真，在各种C语言考试中这几乎也是一个必考的知识点。 另外，如果你查一下文档，会发现C语言并没有true这个关键字，而C++有。 C关键字：https://msdn.microsoft.com/zh-cn/library/befeaky0.aspx C++关键字：https://msdn.microsoft.com/zh-cn/library/2e6a4at9.aspx

user: user-2
content: 严格地说，c标准里没有true和false，需用1和0代替。
user-0 提问: 为什么建立单链表时会出现这种编译错误？

回复:
user: user-1
content: 引用&，这个是C++的语法，如果是C语言不建议使用，因为C语言的编译器不识别这个符号。 建议定义成：LinkList *L,然后函数里使用到L的地方都用*L即可。

user: user-0
content: 引用 4 楼 runningfatty 的回复:[quote=引用 2 楼 hkangj 的回复:] 可以给我看看我这个代码为什么会运行错误么，搞不明白  你在函数里面操作的只是一个拷贝的变量，对主函数里的L是没有影响的 如果你想对L修改的话，有两种方法，一个是用二级指针，也就是传入L的地址，另一个就是不用参数，返回值就是创建的链表[/quote了解了，谢谢大佬

user: user-2
content: 引用 2 楼 hkangj 的回复:可以给我看看我这个代码为什么会运行错误么，搞不明白  你在函数里面操作的只是一个拷贝的变量，对主函数里的L是没有影响的 如果你想对L修改的话，有两种方法，一个是用二级指针，也就是传入L的地址，另一个就是不用参数，返回值就是创建的链表

user: user-0
content: 引用 楼主 hkangj 的回复: 可以给我看看我这个代码有什么错误吗，搞不明白

user: user-0
content: 可以给我看看我这个代码为什么会运行错误么，搞不明白

user: user-3
content: 你这是c，函数的参数LinkList &L，&去掉。 c++可以这么写，引用类型
user-0 提问: vs2015调试显示读取访问权限冲突

回复:
user: user-1
content: f = (void*)5;  //这么写只是让f的值等于0x00000005，但并没有让 f 指向某个变量，                                   //也就是说f属于未初始化的指针,0x00000005这个地址的内存还无法访问  正确的写法如下：  void* f = NULL; 	int i = 5; 	f = (void*)&i; 	int* p = (int*)f; 	printf("%d\n", *p);
user-0 提问: 求大神指引精确度高一点的测试程序运行时间的方法

回复:
user: user-1
content: time_t精确度是秒，建议使用gettimeofday函数，这个可以精确到微妙；执行两次gettimeofday，然后求时间差就是程序的执行时间了。

user: user-2
content: 引用有没有方法可以测试出比较简短的代码的运行时间  可以用 QueryPerformanceCounter 函数原型：https://msdn.microsoft.com/en-us/library/windows/desktop/ms644904%28v=vs.85%29.aspx?f=255&MSPPError=-2147217396  使用时需要包含#include "Windows.h"，一个范例：  LARGE_INTEGER frequency;        // ticks per second LARGE_INTEGER t1, t2;           // ticks double elapsedTime;  // get ticks per second QueryPerformanceFrequency(&frequency);  // start timer QueryPerformanceCounter(&t1);  // do something ...  // stop timer QueryPerformanceCounter(&t2);  // compute and print the elapsed time in millisec elapsedTime = (t2.QuadPart - t1.QuadPart) * 1000.0 / frequency.QuadPart;
user-0 提问: 写了一段代码，运行结果符合题目，但是我不知道是哪里不符合题的要求，希望可以帮我指出来

回复:
user: user-1
content: 百度搜相关关键字。

user: user-2
content: #include<stdio.h> #include <stdlib.h> //#include<malloc.h>  typedef struct node {     int data;     struct node *next;     struct node *prev; } SLNode;   struct node *create_link(int n) {     int i;     struct node *pcur = NULL, *ptmp;     struct node *phead = NULL;       for (i = 0; i < n; i ++) {         pcur = (struct node *)malloc(sizeof(struct node));         if (!pcur) {             fprintf(stderr, "malloc error!\n");             exit(-1);         }         scanf("%d", &pcur->data);         if (!phead) {             phead = pcur;             pcur->prev = pcur;             pcur->next = pcur;             ptmp = pcur;         } else {             pcur->prev = ptmp;             ptmp->next = pcur;             ptmp = pcur;         }     }     ptmp->next = phead;     phead->prev = ptmp;      return phead; }   void print_data_list(struct node *phead) {     struct node *pcur = phead;      while (pcur->next != phead) {         printf("%d\t", pcur->data);         pcur = pcur->next;     }     printf("%d\n", pcur->data); }  /* return 1 is palindrome, or not palindrome*/ int check_palindrome(struct node *phead) {     struct node *pstart, *pend;      pstart = phead;     pend = phead->prev;      while (pend > pstart && pend->data == pstart->data) {         pstart = pstart->next;         pend = pend->prev;     }     if (pend <= pstart)         return 1;      return 0; }   int main(void) {     struct node *phead = NULL;     int n, is_palindrome;      printf("Please input a number: ");     scanf("%d", &n);      phead = create_link(n);     print_data_list(phead);      is_palindrome = check_palindrome(phead);     if (is_palindrome)         printf("Is palindrome!\n");     else         printf("Is not palindrome!\n");     return 0; }    这个问题，建议使用双向循环链表来解决。既然要求用链表，那么就只能用链表来判断回文
user-0 提问: 大哥为什么我的程序时好时坏啊？

回复:
user: user-1
content: 引用不知道那错了  fp1=fopen("employee1.txt","w"); //用w方式打开，会清除之前的内容。应换成a+方式打开  详细可参考： https://msdn.microsoft.com/zh-cn/library/yeby3zcb.aspx

user: user-2
content: 找找是不是文件不存在了

user: user-3
content: 数组长度不够