Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 这个程序你们运行有错么

回复:
user: user-1
content: 引用 2 楼 max_min_ 的回复: //%p打印地址！printf格式化输出函数！  printf("%p",p);  +1  不过楼主的代码有其他问题，next数组有溢出，导致栈被破坏无法正常退出程序的问题。

user: user-2
content: //%p打印地址！printf格式化输出函数！  printf("%p",p);  引用 楼主 u011488256 的回复:大家看看你们这个程序运行会出错么#include "stdafx.h"   #include "stdio.h"  void Get_Next(char *T,int *next) { 	int i=1,j=0; 	next[0]=0; 	next[1]=0; 	char *p=T; 	while (*T) 	{ 		//这里的T 在自己加 所以要多一个P  		//因为题目要求不能求子串的长度 		//然后这里的字符串给近来从0开始 但是这里计算的是从1开始 		if(j==0||p[j-1]==p[i-1]) 		{ 			i++; 			j++; 			next[i]=j; 			T++; 		} 		else 			j=next[j]; 		 	} } int main(int argc, char* argv[]) { 	//下面的代码是子串和主串做比较的一部分 	char a[10]="abaabc"; 	char b[40]="abaaabaabcababaabc"; 	char *p=b; 	printf("%c",*p); 	printf("%ld",p); 	//printf("%c",*q); 	int next[7]; 	int i=0; 	int count=0; 	Get_Next(a,next); 	printf("%ld",p);//我的问题出在这里，每次运行到这里P就没有值了，但是前面的根本没改变过，函数传参也没用他 ，纳闷几天了 	printf("%c",*p); 	return 0; }       我用的编译环境是VC 60 控制台     高分求大神赐教！

user: user-3
content: 打印地址用%p  int main(int argc, char* argv[]) {     //下面的代码是子串和主串做比较的一部分     char a[10]="abaabc";     char b[40]="abaaabaabcababaabc";     char *p=b;     printf("%c\n",*p);     printf("%p\n",p);     //printf("%c",*q);     int next[7];     int i=0;     int count=0;     Get_Next(a,next);     printf("%p\n",p);//我的问题出在这里，每次运行到这里P就没有值了，但是前面的根本没改变过，函数传参也没用他 ，纳闷几天了     printf("%c\n",*p);     return 0; }   我这里的输出是：  a 0xbfc4056a 0xbfc4056a a  引用 楼主 u011488256 的回复:大家看看你们这个程序运行会出错么#include "stdafx.h"   #include "stdio.h"  void Get_Next(char *T,int *next) { 	int i=1,j=0; 	next[0]=0; 	next[1]=0; 	char *p=T; 	while (*T) 	{ 		//这里的T 在自己加 所以要多一个P  		//因为题目要求不能求子串的长度 		//然后这里的字符串给近来从0开始 但是这里计算的是从1开始 		if(j==0||p[j-1]==p[i-1]) 		{ 			i++; 			j++; 			next[i]=j; 			T++; 		} 		else 			j=next[j]; 		 	} } int main(int argc, char* argv[]) { 	//下面的代码是子串和主串做比较的一部分 	char a[10]="abaabc"; 	char b[40]="abaaabaabcababaabc"; 	char *p=b; 	printf("%c",*p); 	printf("%ld",p); 	//printf("%c",*q); 	int next[7]; 	int i=0; 	int count=0; 	Get_Next(a,next); 	printf("%ld",p);//我的问题出在这里，每次运行到这里P就没有值了，但是前面的根本没改变过，函数传参也没用他 ，纳闷几天了 	printf("%c",*p); 	return 0; }       我用的编译环境是VC 60 控制台     高分求大神赐教！
user-0 提问: 关于C++的一个获取i键盘按键的疑问

回复:
user: user-1
content: //The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }
user-0 提问: 都看看吧   是超界了吗

回复:
user: user-1
content: #include <stdio.h>  int main(void) {     int   s;     int   m, n;     int   i, j, cnt, sum;          scanf("%d", &s);      while (s--) {         scanf("%d%d", &n, &m);  		// 没必要实际求出n的阶乘，肯定会越界 		// 只需要把 1 * 2 * 3 * ... * m * ... * n 中每个数分解质因数，然后把和加起来          for (i = m, sum = 0; i <= n; i++) {             j = i;             cnt = 0;             while (j >= m) {             	if (j % m == 0) { 	            	cnt++; 	            	j /= m; 	            } else {             		break;             	}             }             sum += cnt;         }         printf("%d\n", sum);     }      return 0; }  输出结果： 3 10 3 4 10 5 2 10 7 1

user: user-1
content: 必须越界，n稍微大一点，n的阶乘就越界了
user-0 提问: c语言疑问

回复:
user: user-1
content: 引用 14 楼 AnYidan 的回复:[quote=引用 12 楼 baijiaheizhiganmao 的回复:] [quote=引用 11 楼 AnYidan 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] F11、F10、Shift+F11 F9、F5  什么东东，给个图片标出好吗？[/quote] 本三大叔说了：反正情况就是这么个情况.2万块钱你要留就留下,不留你就拿走.你要愿意吃,2万大餐你都端走,我一块没动.你看咋样. 请回复：你太有才了！[/quote]  赵老师很有孔圣人的遗风，膜拜！  [/quote] 您就不能配合一下？！

user: user-2
content: 引用 12 楼 baijiaheizhiganmao 的回复:[quote=引用 11 楼 AnYidan 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] F11、F10、Shift+F11 F9、F5  什么东东，给个图片标出好吗？[/quote] 本三大叔说了：反正情况就是这么个情况.2万块钱你要留就留下,不留你就拿走.你要愿意吃,2万大餐你都端走,我一块没动.你看咋样. 请回复：你太有才了！[/quote]  赵老师很有孔圣人的遗风，膜拜！

user: user-1
content: 引用 11 楼 AnYidan 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] F11、F10、Shift+F11 F9、F5  什么东东，给个图片标出好吗？[/quote] 本三大叔说了：反正情况就是这么个情况.2万块钱你要留就留下,不留你就拿走.你要愿意吃,2万大餐你都端走,我一块没动.你看咋样. 请回复：你太有才了！

user: user-3
content: Debug|DebugStepOver                   |F10                   |Steps over the next statement Debug|DebugStepInto                   |F11                   |Steps into the next statement Debug|DebugGo                         |F5                    |Starts or continues the program Debug|DebugToggleBreakpoint           |F9                    |Inserts or removes a breakpoint Debug|DebugStepOut                    |Shift+F11             |Steps out of the current function  Visual Studio 6开发环境下的所有热键一览表 http://download.csdn.net/detail/zhao4zhong1/2196516

user: user-4
content: 能单步执行的话就单步执行咯，不然的话，就多添加一些printf函数看看哪里出了问题

user: user-5
content: 程序别写的很大才去调试。 架子搭起来（不必写太细节的代码），就可以调试了。  每个局部代码写出来，都先调试一下。 这样，程序大了，也好调试。

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:F11、F10、Shift+F11 F9、F5  什么东东，给个图片标出好吗？

user: user-6
content: 引用 4 楼 baichi4141 的回复:单步调试就是按一下执行一行，在程序中下断点可以省的从头开始 我真不明白怎样才能把单步调试说的更复杂一些+1

user: user-7
content: 单步调试就是按一下执行一行，在程序中下断点可以省的从头开始 我真不明白怎样才能把单步调试说的更复杂一些

user: user-8
content: 引用 2 楼 u010165006 的回复:人为插入一些printf语句输出，看能执行到哪里，或者输出变量的值。 ++ 可以采用这种方法，不过，如果会用gdb，那么采用gdb的方法还是挺快的。

user: user-9
content: 引用 2 楼 u010165006 的回复:人为插入一些printf语句输出，看能执行到哪里，或者输出变量的值。 引用 7 楼 xiaoliang1201 的回复:能单步执行的话就单步执行咯，不然的话，就多添加一些printf函数看看哪里出了问题+1

user: user-3
content: F11、F10、Shift+F11 F9、F5

user: user-10
content: 可以编译了！生成的执行文件执行试试呗！断点调试呗

user: user-11
content: 人为插入一些printf语句输出，看能执行到哪里，或者输出变量的值。

user: user-12
content: 语法无错误，那就是逻辑有错误
user-0 提问: 冒泡排序法的改进

回复:
user: user-1
content: 引用 4 楼 baichi4141 的回复:比较之前不知道该不该比较。 比较之后才知道不该比较——有用么？  要真的利用大小的传递关系来优化，那就不是冒泡了，直接快排吧 ++ 快排就是冒泡的一种改进，但是这已经不是冒泡了！ 要维持冒泡,那么可改进的地方，不是很大.

user: user-2
content: 加个布尔量，判断一下需不需要交换，。

user: user-1
content: 冒泡的可改进处，也就是已经有序，就不再排序了，这么一点可以优化之处。  方法是一轮排序下来，看交换几次，如果完全，没有交换； 自然不要继续排序，就可以结束了。  更好的办法，不知有没有。  原理上是，无逆序，不需要排序！

user: user-3
content: 1楼给了个思路，可以简单再改良一下用swapped去记录第一次发生交换的地方。内层循环下轮从swapped前一个位置开始。数据量小，部分有序的情况下可能有点效果，数据量大的话还是用其他算法...

user: user-4
content: 比较之前不知道该不该比较。 比较之后才知道不该比较——有用么？  要真的利用大小的传递关系来优化，那就不是冒泡了，直接快排吧

user: user-0
content: 能给我介绍一下鸡尾酒排序吗？

user: user-5
content: 加个flag。。。 还有改良版的 鸡尾酒排序

user: user-6
content: 冒泡就是这样的。比较后，可能不会执行换位。

user: user-7
content: 能做到比较但不交换，但做不到不比较。

user: user-8
content: #include <stdio.h> #include <time.h> #include <stdlib.h> void better_bubble_sort(int *D, int n) {     int b,i,m,t;      b=n-1;     while (b) {         m=0;         for (i=0;i<b;i++) {             if (D[i]>D[i+1]) {t=D[i];D[i]=D[i+1];D[i+1]=t;m=i;}         }         b=m;     } } int main() {     int d[10],n,i;      srand(time(NULL));     for (n=0;n<10;n++) {         printf("------%d------\n",n);         for (i=0;i<n;i++) {d[i]=rand()%100;printf(" %02d",d[i]);}         printf("\n");         better_bubble_sort(d,n);         printf("sorted:\n",n);         for (i=0;i<n;i++) {               ;printf(" %02d",d[i]);}         printf("\n");     } } //------0------ // //sorted: // //------1------ // 87 //sorted: // 87 //------2------ // 41 40 //sorted: // 40 41 //------3------ // 21 03 02 //sorted: // 02 03 21 //------4------ // 27 03 70 21 //sorted: // 03 21 27 70 //------5------ // 02 50 57 77 34 //sorted: // 02 34 50 57 77 //------6------ // 74 94 80 05 58 10 //sorted: // 05 10 58 74 80 94 //------7------ // 50 43 98 36 90 83 73 //sorted: // 36 43 50 73 83 90 98 //------8------ // 07 20 21 13 56 90 06 51 //sorted: // 06 07 13 20 21 51 56 90 //------9------ // 14 94 94 32 14 24 81 32 00 //sorted: // 00 14 14 24 32 32 81 94 94 //

user: user-9
content: 你不遍历怎么知道不需要比较。  只能说比较了，不需要交换。

user: user-10
content: 怎么看到冒泡有点问题了

user: user-11
content: #include <stdio.h>  int main(void) {     int arr[9];     int temp, i, j;     int swapped = 1;  	// 初始化      for (i = 0; i <= 9; i++)         arr[i] = 9 - i;  	// 排序前      printf("Before Sort: ");     for (i = 0; i <= 9; i++)         printf("%d ", arr[i]);  	// 冒泡排序      for (i = 0; swapped; i++) {         swapped = 0;         for (j = 0; j < 9 - i; j++) {             if (arr[j] > arr[j + 1]) {                 temp = arr[j];                 arr[j] = arr[j + 1];                 arr[j + 1] = temp;                 swapped = 1;             }         }     }  	// 排序后      printf("\n After Sort: ");     for (i = 0; i <= 9; i++)         printf("%d ", arr[i]);     printf("\n");          return 0; }  Before Sort: 9 8 7 6 5 4 3 2 1 0  After Sort: 0 1 2 3 4 5 6 7 8 9
user-0 提问: C语言

回复:
user: user-1
content: 引用 2 楼 missheaven2011 的回复:当你if(x==0)错写为if(x=0)时，编译器不会报错，问题难以发现 当你if(0==x)错写为if(0=x)时，编译器能及时报错，易于发现问题  原因是常量不能作左值

user: user-2
content: ox让人想到牛，觉得你的代码很牛； xo让人想到酒，不喝就醉了

user: user-3
content: 没有区别，不过第一种写法是防止手误写成了if (x = 0)而造成逻辑上的错误。

user: user-4
content: 就是这么回事的 引用 2 楼 missheaven2011 的回复:当你if(x==0)错写为if(x=0)时，编译器不会报错，问题难以发现 当你if(0==x)错写为if(0=x)时，编译器能及时报错，易于发现问题

user: user-5
content: 都可以的！ if(0 == x)只是为了避免出现赋值操作这样编译器会报错而已！一个写法而已！

user: user-6
content: 用惯if(x==0)就好了。养成习惯，这两个没有区别

user: user-7
content: 当你if(x==0)错写为if(x=0)时，编译器不会报错，问题难以发现 当你if(0==x)错写为if(0=x)时，编译器能及时报错，易于发现问题

user: user-8
content: 都可以  用0 == x可以避免将==误写作= 一般大神都用x == 0，原因是习惯了
user-0 提问: 小白一枚，求高手。

回复:
user: user-1
content: 标题改成“忙着打网游的学生一枚，求代写作业”比较好

user: user-2
content: 这些代码，网上很多啊

user: user-3
content: 亲，百度下！转换的原理！然后自己画画！ 网上狠得多源码的！

user: user-4
content: 赞同二楼，

user: user-5
content: 百度一下，一大票的程序
user-0 提问: 课程作业要求写网页爬虫，但是内存分配好像出了问题，谁帮我看看

回复:
user: user-0
content: 诶，自己找到了，正则表达式。。。咳咳 感谢一楼帮顶

user: user-1
content: 看着好高端的问题，请大神解答……
user-0 提问: 求大婶来帮忙，小弟不胜感激~~~~

回复:
user: user-1
content: 上面还加个0

user: user-1
content: 20！=243290200817664000 这么大的数字，还要相加，而且用double......

user: user-1
content: [size=24px]21！=51090942171709440000[/size]

user: user-2
content: 引用 3 楼 AnYidan 的回复:[quote=引用 2 楼 max_min_ 的回复:] 求不了那么大的数据的！ 越界了！ 下面是修改了你的程序，但是越界问题还是用的！  #include<stdio.h> void main() {     int i ;     unsigned long long n=1,sum=0;     for(i=1;i<=10;i++)     {         n=n*i;         sum=sum+n;     }     printf("sum=%llu",sum); }   大婶，大神，傻傻分不清楚！[/quote]

user: user-3
content: 引用 2 楼 max_min_ 的回复:求不了那么大的数据的！ 越界了！ 下面是修改了你的程序，但是越界问题还是用的！  #include<stdio.h> void main() {     int i ;     unsigned long long n=1,sum=0;     for(i=1;i<=10;i++)     {         n=n*i;         sum=sum+n;     }     printf("sum=%llu",sum); }   大婶，大神，傻傻分不清楚！

user: user-2
content: 求不了那么大的数据的！ 越界了！ 下面是修改了你的程序，但是越界问题还是用的！  #include<stdio.h> void main() {     int i ;     unsigned long long n=1,sum=0;     for(i=1;i<=10;i++)     {         n=n*i;         sum=sum+n;     }     printf("sum=%llu",sum); }

user: user-4
content: 自己打断点调试
user-0 提问: 编程，在屏幕上输出2~n间所有的素数，n从键盘上输出，但以下的程序不知错在哪，求解？

回复:
user: user-1
content: #include <stdio.h>  int main() {     int n;     int x, y;     int flag;          printf("请输入一个整数n: ");     scanf("%d", &n);      for (x = 2; x <= n; x++) {         flag = 1;          for (y = 2; y < x; y++) {             if (x % y == 0) {                 flag = 0;                 break;             }         }          if (1 == flag)             printf("%5d\n", x);     } }  请输入一个整数n: 10     2     3     5     7

user: user-2
content: #include<stdio.h>  int main()  {  int n;  int x,y;  int flag; printf("请输入一个整数n:");  scanf("%d",&n);    for(x=2;x<=n;x++)  {  flag=1;  for(y=2;y<x;y++)  {   if(x%y==0)  flag=0;  }  if(1==flag)  printf("%5d\n",x);  }   } 你这这nb啊，这程序写的

user: user-3
content: printf("5%d",x)； //换成这个，程序没发现什么问题 printf("%d  ",x)；

user: user-4
content: bool isPrime(int number)				// 求素数 {  	int i; 	int k;  	k = (int)sqrt((double)number);      // 用平方根，而非用number/2，相对提高速度sqrt(number)/2倍 	for(i = 2; i <= k; i++) 	{ 		if(number%i==0)  			break; 	} 	if (i > k)  return true;	// 没有找到可以整除的除数，被除数是 prime number 	else   return false; }
user-0 提问: 把一个长字符串用空格分割成几个小字符串，哪错了？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:多次new！  #include <stdio.h> #include <stdlib.h> #include <iostream>  using namespace std;  char **func(char *str, char *a[5]);  int main(void) { 	int i = 0; 	char str[] = "today is a beautifly day"; 	char *a[6] = {0};  	func(str, a);  	for(; i < 5; i++) 		printf("%s\n", a[i]);  	return 0; }  char **func(char *str, char *a[5]) { 	int row = 0; 	int col = 0; 	int i = 0; 	bool ifNew = true;  	for(; str[i]; i++) 	{ 		 		if(str[i] != ' ') 		{ 			if(ifNew) 				a[row] = (char *)malloc(20); 			a[row][col] = str[i]; 			col++; 			ifNew = false; 			 		} 		else 		{ 			a[row][col] = '\0'; 			row++; 			col = 0; 			ifNew = true; 		} 	} 	a[row][col] = '\0'; 	 	return a; }  //正解   晕了。。。

user: user-1
content: 多次new！  #include <stdio.h> #include <stdlib.h> #include <iostream>  using namespace std;  char **func(char *str, char *a[5]);  int main(void) { 	int i = 0; 	char str[] = "today is a beautifly day"; 	char *a[6] = {0};  	func(str, a);  	for(; i < 5; i++) 		printf("%s\n", a[i]);  	return 0; }  char **func(char *str, char *a[5]) { 	int row = 0; 	int col = 0; 	int i = 0; 	bool ifNew = true;  	for(; str[i]; i++) 	{ 		 		if(str[i] != ' ') 		{ 			if(ifNew) 				a[row] = (char *)malloc(20); 			a[row][col] = str[i]; 			col++; 			ifNew = false; 			 		} 		else 		{ 			a[row][col] = '\0'; 			row++; 			col = 0; 			ifNew = true; 		} 	} 	a[row][col] = '\0'; 	 	return a; }
user-0 提问: 多出的两个字节是什么啊？

回复:
user: user-1
content: 内存对齐，看下这两篇文章就知道了 http://blog.csdn.net/mbh_1991/article/details/10241785 http://blog.csdn.net/insistGoGo/article/details/8960555

user: user-0
content: 谢谢斑竹大人

user: user-2
content: 引用 2 楼 flowingfirefly 的回复:输出： 10,4,4 20  struct date {     char day[10];     char res[2]; //这里多余了空余2个字节的！内存字节对齐！                 //可以google下，很基础的知识，内存对齐可以提高访问效率        int month;     int year; };

user: user-0
content: 输出： 10,4,4 20

user: user-0
content: #include <stdio.h> #include <string.h> #include <stdlib.h>  struct date {     char day[10];     int month;     int year; };  int main() {     struct date *object = malloc(sizeof(struct date));     strcpy(object->day, "Good day");     object->month = 6;     object->year = 2013;     printf("%d,%d,%d\n", sizeof(object->day), sizeof(object->month), sizeof(object->year));     printf("%d\n", sizeof(struct date));     FILE *file = fopen("output", "wb");     if (file != NULL) {         fwrite(object, sizeof(struct date), 1, file);         fclose(file);     }     return 0; }
user-0 提问: 你敢看不敢看

回复:
user: user-1
content: 标题党。。。

user: user-0
content: 引用 9 楼 Adol1111 的回复:[quote=引用 7 楼 u011488256 的回复:] [quote=引用 1 楼 user-9 的回复:] 哎，当j==0的时候，只是判断前面的语句，p[j-1] == p[i-1]不进行判断了，谢谢  为什么大家都不注意后面的问题··这种语句是不是有危险性？ 是不是不应该这样写？[/quote] 没有危险性，因为||是任意条件为真整个表达式就为真，所以第一个为真时就不会判断第二个。同理&&第一个为假时，就不会判断第二个了。 比如，在链表里经常这样写if(p!=NULL&&p->value==value)类似的语句，但却不会写if(p->value == value && p!=NULL)一样。一旦判断到p为空了，那么整个表达式不可能成立，所以就不会判断后面的一句了。但反过来就不对了，p为空时，不能取p的value值，这是访问非法区域，触发段错误。[/quote] nice

user: user-2
content: 引用 7 楼 u011488256 的回复:[quote=引用 1 楼 user-9 的回复:] 哎，当j==0的时候，只是判断前面的语句，p[j-1] == p[i-1]不进行判断了，谢谢  为什么大家都不注意后面的问题··这种语句是不是有危险性？ 是不是不应该这样写？[/quote] 没有危险性，因为||是任意条件为真整个表达式就为真，所以第一个为真时就不会判断第二个。同理&&第一个为假时，就不会判断第二个了。 比如，在链表里经常这样写if(p!=NULL&&p->value==value)类似的语句，但却不会写if(p->value == value && p!=NULL)一样。一旦判断到p为空了，那么整个表达式不可能成立，所以就不会判断后面的一句了。但反过来就不对了，p为空时，不能取p的value值，这是访问非法区域，触发段错误。

user: user-3
content: 记得短路这种是被规范保证的，跟普通运算不一样，放心用。

user: user-0
content: 引用 1 楼 user-9 的回复:哎，当j==0的时候，只是判断前面的语句，p[j-1] == p[i-1]不进行判断了，谢谢  为什么大家都不注意后面的问题··这种语句是不是有危险性？ 是不是不应该这样写？

user: user-4
content: || 和 && 被称为“短路”运算符

user: user-5
content: 楼主if判断语句括号内用的逻辑运算符为或(||)，其意思是两者之中有一者成立皆可执行if花括号内的函数体~由此，当||前面的条件已经满足，计算机不会理会||后面的内容。若楼主想计算机判断完前面的内容再判断后面的内容应该用逻辑运算符 且（&&）。

user: user-6
content: 看了，shortcut。

user: user-7
content: 引用 1 楼 user-9 的回复:哎，当j==0的时候，只是判断前面的语句，p[j-1] == p[i-1]不进行判断了，谢谢  对的！||的情况，当前面为真的话，后面就不再判断了！       &&的情况，当前面为假的话，后面也不会再判断的！

user: user-8
content: 如果j==0的话，那么||后面就不会再理会了。  引用 楼主 u011488256 的回复:问题如下 	while (*T)    //如果长度为n，只循环n-1次！！！ 	{ 		 		if(j==0||p[j-1]==p[i-1])   //如果这里这里j=0 ， 那么p【-1】就已经溢出了，想请问下当电脑判断前面已经可以进入条件还会算后面的p[-1]么，就算不会这种代码有没有危险性？！ 		{ 			i++; 			j++; 			next[i]=j; 			T++; 		} 		else 			j=next[j]; 		 	} }

user: user-9
content: 哎，当j==0的时候，只是判断前面的语句，p[j-1] == p[i-1]不进行判断了，谢谢
user-0 提问: 怎么在buf中追加字符串

回复:
user: user-1
content: 用 snprintf(buf,sizeof(buf),"%d",i); 安全函数。

user: user-2
content: 引用 1 楼 user-8 的回复:sprintf 指向 buf 中起始地址, 确保 buf 中空间足够 ++ 也可以使用snprintf。

user: user-3
content: sprintf 这个函数会用么？

user: user-4
content: //下面几个函数都可以完成这个功能的！  strcat(); //注意越界 sprintf(); //注意格式 strcpy()/ memcpy(); //注意对应偏移地址

user: user-5
content: char buf[10240]; strcpy(buf,"bula bula bula ..."); sprintf(buf+19,"expected:%d 0x:%x  but  was:%d 0x:%x",expected,expected, actual,actual)； printf("%s\n",buf);

user: user-6
content: fprintf

user: user-7
content: #include <string.h>  strcat 字符串连接函数

user: user-8
content: sprintf 指向 buf 中起始地址, 确保 buf 中空间足够
user-0 提问: 信号量的问题，大神们来帮忙

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:生产者消费者问题是不能用SEM_UNDO的.  为神马？

user: user-1
content: 生产者消费者问题是不能用SEM_UNDO的.

user: user-0
content: 更正一下：  138行到151行的代码为：   if(!set_semvalue(ID[0], 1)){     fprintf(stderr, "Failed to initilize mutex_semaphore\n");     exit(1);   }       if(!set_semvalue(ID[1], N)){     fprintf(stderr, "Failed to initilize empty_semaphore\n");     exit(1);   }       if(!set_semvalue(ID[2], 0)){     fprintf(stderr, "Failed to initilize full_semaphore\n");     exit(1);   }    原本代码里的mutex的值为1，full的值为0。应为多次改动，这里疏忽了。  但改成相应的值以后，代码还是有问题。。。

user: user-0
content: 自己顶一下。 哪位大神给指一下错啊
user-0 提问: 原始套接字如何与流套接字建立连接

回复:
user: user-1
content: google ping源代码

user: user-2
content: 引用 5 楼 mmzhzjia 的回复:网上都说调用connect就可以建立连接，你怎么看？ 抓包吧！然后通过信息自己填充进去，发送！

user: user-0
content: 网上都说调用connect就可以建立连接，你怎么看？

user: user-3
content: 相当于自己实现一部分tcp/udp协议。在IP协议包后加上tcp包头信息。用wireshark抓包，然后模仿编写应该问题不大，估计比较费时间。

user: user-0
content: 完全没有解决

user: user-4
content: 原始套接字与标准套接字（流套接字和数据报套接字）的区别在于：原始套接字可以读写内核没有处理的IP数据包，而流套接字只能读取TCP协议的数据，数据报套接字只能读取UDP协议的数据。  所以要自己封包解包。

user: user-0
content: 自己顶一下  在线等
user-0 提问: 翻译

回复:
user: user-1
content: 由一个整形不需要任何转换“做了”一个指针  我省去了主语

user: user-2
content: 函数send的第一个参数，没有类型转换的情况下，将整型当指针传入

user: user-0
content: 引用 4 楼 derekrose 的回复:[quote=引用 2 楼 u012453424 的回复:] [quote=引用 1 楼 derekrose 的回复:] 无需类型转换 翻译得不好[/quote]  老师请批评指正[/quote] 还有整句话没好好翻译呢

user: user-1
content: 引用 2 楼 u012453424 的回复:[quote=引用 1 楼 derekrose 的回复:] 无需类型转换 翻译得不好[/quote]  老师请批评指正

user: user-3
content: 忘了转换

user: user-0
content: 引用 1 楼 derekrose 的回复:无需类型转换 翻译得不好

user: user-1
content: 无需类型转换
user-0 提问: C语言如何返回字符串

回复:
user: user-1
content: char s[buffer_size]; foo(s, buffer_size); 推荐这种。

user: user-2
content: 没有十全十美的方法，合适的最好

user: user-3
content: 楼主你说的两种方法都是可以的。

user: user-4
content: char s[buffer_size]; foo(s, buffer_size); 推荐这种。

user: user-5
content: 引用 6 楼 max_min_ 的回复:两种方法都可以！都有用到，看具体需求吧！ 如果可以改结构的话，无疑传参数，传地址会比较好好点 动态分配的话，容易产生内存碎片，而且费时！ [quote=引用 楼主 netbooting 的回复:] 我了解两种方法  一、将一个字符指针或数组作为参数传入调用方法。     这种方式有点麻烦，要多声明一个参数，不太符合使用其它语言的习惯，另外不知道这种方式能不能动态扩充字符串大小。  二、在方法中声明一个静态字符数组，动态分配内存，返回这个数组     这种方式导致字符串的生存周期为程序运行期，浪费内存。   不知道我理解的对不对，大神指点，一般都用哪种方法？？[/quote]+1

user: user-6
content: 一般有固定的内存记录字符串，返回const指针来用

user: user-7
content: 两种方法都可以！都有用到，看具体需求吧！ 如果可以改结构的话，无疑传参数，传地址会比较好好点 动态分配的话，容易产生内存碎片，而且费时！ 引用 楼主 netbooting 的回复:我了解两种方法  一、将一个字符指针或数组作为参数传入调用方法。     这种方式有点麻烦，要多声明一个参数，不太符合使用其它语言的习惯，另外不知道这种方式能不能动态扩充字符串大小。  二、在方法中声明一个静态字符数组，动态分配内存，返回这个数组     这种方式导致字符串的生存周期为程序运行期，浪费内存。   不知道我理解的对不对，大神指点，一般都用哪种方法？？

user: user-8
content: 参考C语言库函数所用方法。

user: user-9
content: 第一种方法比较好

user: user-10
content: 函数内划分内存有释放问题 静态数组有调用问题 还是传入参数好  之所以和其他语言不一样，是因为C语言算不得高级语言

user: user-11
content: 类似第一种，传入一个缓冲区，在函数里，对缓冲区填值。这种方式不能动态扩充字符串缓冲区大小，所以传入的缓冲区一定要足够大否则会溢出导致错误，最好将缓冲区的大小也传入函数。  如果需要在函数里分配空间，这样需要将实参的指针的地址传入方法，即二级指针。 int func(char **str) {     *str = malloc(size); }

user: user-12
content: 反正只要注意不返回局部变量都行
user-0 提问: ^符号问题，谢谢、、、新手

回复:
user: user-1
content: 对于如下集合，结果是不正确的。 {1,2,4,7} {1,2,3};

user: user-1
content: 另外  1^2^4^7 =0 1^2^3 =0

user: user-1
content: 引用 5 楼 Adol1111 的回复:^是异或 以二进制来看这2个数，然后对比相同位置上的数，不同取1，相同取0 就是楼上说的0^1=1   0^0=0   1^0=1   1^1=0 以一个4位二进制来举例 3^5 3：0011 5：0101    0110 所以结果是6  如果这个数出现了两次，那么就会互相抵消变成0,0与任何数异或就是这个数本身，所以就是用这个方法找出单独的数字。但是如果有2个以上的数字是单个的就不不能用这方式来求解了。 ++

user: user-2
content: c 就那么几个操作符

user: user-3
content: ^是异或 以二进制来看这2个数，然后对比相同位置上的数，不同取1，相同取0 就是楼上说的0^1=1   0^0=0   1^0=1   1^1=0 以一个4位二进制来举例 3^5 3：0011 5：0101    0110 所以结果是6  如果这个数出现了两次，那么就会互相抵消变成0,0与任何数异或就是这个数本身，所以就是用这个方法找出单独的数字。但是如果有2个以上的数字是单个的就不不能用这方式来求解了。

user: user-4
content: 抑或 0^1=1   0^0=0   1^0=1   1^1=0

user: user-5
content: 引用 2 楼 netbooting 的回复:  single ^= array[i];  single = single ^ array[i];  异或：相同为假，相异为真。1^1或0^0=0  1^0或0^1=1 +1

user: user-6
content: single ^= array[i];  single = single ^ array[i];  异或：相同为假，相异为真。1^1或0^0=0  1^0或0^1=1

user: user-7
content: 异或....................
user-0 提问: 编程1至100相加

回复:
user: user-1
content: 引用 1 楼 user-10 的回复:算的是s，输出的是sum ++

user: user-2
content: 引用 楼主 u012876050 的回复:编程1至100相加，下面是我做的程序，怎么得数是错误的。求解？ #include<stdio.h> int main() {     int sum,n,s;     s=0;     for(n=1;n<=100;n++)     {          s+=n; } 	printf("1+2+3+...+100=%d\n",sum);     return sum; }  写代码的时候不要睡觉啊！注意，注意

user: user-3
content: 果断发现了一个跟我一样的好基友，马大哈早晚会被自己坑死的，计算的是s,输出的是sum

user: user-4
content: 引用 1 楼 user-10 的回复:算的是s，输出的是sum +10086

user: user-5
content: #include<stdio.h> int main() {     int sum,n;     sum = 0;     for(n=1;n<=100;n++)     {              sum += n;     }     printf("1+2+3+...+100=%d\n",sum);     return 0; }

user: user-6
content: 不是有算数法则吗 前1到n个数的和等于 n *（n+1）/2

user: user-7
content: 加了s，然后打印sum，怎么有可能得到正确的结果？

user: user-8
content: 引用 1 楼 user-10 的回复:算的是s，输出的是sum+1

user: user-9
content: #include<stdio.h> int main() {     int n,s;     s=0;     for(n=1;n<=100;n++)     {          s+=n; } printf("1+2+3+...+100=%d\n",s);     return s; }  引用 楼主 u012876050 的回复:编程1至100相加，下面是我做的程序，怎么得数是错误的。求解？ #include<stdio.h> int main() {     int sum,n,s;     s=0;     for(n=1;n<=100;n++)     {          s+=n; } 	printf("1+2+3+...+100=%d\n",sum);     return sum; }

user: user-10
content: 算的是s，输出的是sum
user-0 提问: 初学c语言关于语法问题

回复:
user: user-0
content: 非常感谢你们的解答，对于初次使用CSDN的我好像瞬间交了好多朋友，亲爱的朋友：谢谢你们！！！

user: user-1
content: 语法错误就是机器不能识别的错误，语法错误就是你编写的程序里面使用了不规范的关键字或者变量名之类的错误，笼统得说就是编译都无法通过的程序，编译器无法识别你写的程序。（百度） 另外，for后面加了；是语法错误，语法错误后程序是否可以运行输出结果？ 答：不能！

user: user-2
content: 在for()后面加，就是语法错误！ 语法错误vc6.0是不会给予编译通过的，所以不能执行代码

user: user-3
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  偶有时遇到莫名其妙的编译错误提示时，都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-4
content: for (i = 1; i < 100; i++)  ;和,             printf("%d ", i);  // for后面不能加逗号,但可以加分号; // 因为for后面必须接一个语句，逗号是表达式，不是语句，接分号表示一个空语句

user: user-5
content: 逗号运算符可以连接两个有返回值的表达式，如赋值，比较等，但是不能连接逻辑操作语句

user: user-6
content: 语法错误简单来说就是“鸡同鸭讲”，你所写的语句C语言不认识。语法错误直接导致编译不会成功，所以也无法运行。  引用 楼主 u012505341 的回复:请问在c语言中何为语法错误？在for()之后加“,"是否为语法错误？语法错误后程序是否可以运行输出结果？请求各位大神帮忙~~~~~

user: user-7
content: 楼主把注意力多放在其他的实质性的问题上，比如学习个排序算法，查找算法等等；不要在这种问题上纠结；你在for()后面加个,有什么用

user: user-8
content: 就好比你和别人说话 你的语法和别人都不是一样的 别人听不懂一样！

user: user-8
content: 语法错误就是错误的  编译时通不过不了的 计算机读不懂你的语言因为你没有按照它的语法规则来

user: user-9
content: 语法错误就是 计算机看不懂你写的是什么东西 你写的程序是保存在文本中 通过计算机的词法分析器 和语法分析器 去把它转换成汇编语言 在通过汇编器变成二进制的机器语言  计算机在去执行 因为计算机只认识机器语言 汇编语言是机器语言的助记符 所以呢 你的语言错误正如 你写错字 根本就没这个字 多一笔 少一笔 没人认识所以就是语言错误 写文章 句子是病句也不行 因为计算机毕竟不是智能的 它要遵循一定规则去识别 识别的程序也是人写的

user: user-10
content: 多看书，多敲几个代码，一旦语法错误，编译是不通过的，别说运行了。语法这东西，代码敲多了自然就知道了

user: user-11
content: 语法错误，都没有编译过，还怎么运行程序啊？ 代代码看看那
user-0 提问: c语言的程序的小问题

回复:
user: user-1
content: 先找到数学规律，再写代码实现

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main(void) {     int   i, j;     int   n = 5;      for (i = 1; i < n + 1; i++) {           // 控制层数         for (j = 0; j < (n - i) * 2 ; j++)  // 打印前导空格             printf(" ", j);         for (j = 1; j <= i; j++)            // 打印每一层前半部分的数字             printf("%d ", j);         for (j = j - 2; j >= 1; j--)        // 打印每一层后半部分的数字             printf("%d ", j);         printf("\n");     }     return 0; }  输出结果：         1       1 2 1     1 2 3 2 1   1 2 3 4 3 2 1 1 2 3 4 5 4 3 2 1

user: user-3
content: 前几天好像有人问过一模一样的题……

user: user-4
content: 当输入的数 代表的是俩位数 甚至更多 想要对齐的话 需要进一步处理 判断数的位数 特殊处理

user: user-4
content: #include <stdio.h> #include <stdlib.h>  int main() {     int num;     int i;     int j;     int k;     scanf("%d",&num);//输入几层      for(i = 1 ; i < num+1 ;i++)        for(j = i ; j < num+1 ;j++){              if(j == num ){                 for(k = 1 ;k < i + 1 ;k++)                   printf("%d",k);                 for(k = i -1  ; k >= 1; k--)                   printf("%d",k);                    printf("\n");             }            //输出数字             else                 printf(" ");//判断要输入几层 要输出几个空格在开头        }     return 0; }
user-0 提问: Windows SDK 编程方式的问题

回复:
user: user-1
content: Spy++软件会用吗？

user: user-0
content: 请问, 消息体是从什么地方传入的?

user: user-2
content: 不会的。  不同的消息由不同的winproc解决。这个你不用担心。你要做的是编写一个winproc，来响应消息。  如果你需要其他窗口协调工作，那就向那个窗口发送消息好了。这里唯一需要关心的是，就是如何获得那个窗口的HWND.   只有消息才会唤醒win程序，否则win程序是休眠的。

user: user-3
content: GDI32/USER32 还要存在一阵子

user: user-1
content: 检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！

user: user-4
content: 这个说法不完全正确 每一级窗口(或菜单)都是这样的: 　　　　1. 注册窗口类, 使用到的结构 WNDCLASSEX, 函数 RegisterClassEx.//每个窗口类都需要，但不是每个窗口需要 　　　　2. 创建窗口, 函数 CreateWindowEx.//每个窗口需要 　　　　3. 消息循环, 结构 MSG, 函数 GetMessage, TranslateMessage, DispatchMessage. 　　　　4. 进入无限循环, 消息处理 :-) //3，4:每个线程需要,每个线程的所有窗口共用一个消息循环

user: user-5
content: Windows不是纸糊的，不用担心。  当然，另一方面，软件的设计也要合理。比如说有人看了excel和扫雷，自己模仿，前者他用了几千个文本框，后者用了几百个按钮，这个就是不合理。

user: user-6
content: 程序设计不当消耗了大量了cpu导致死机是有可能的！ 所以理清楚各个消息控制就好，思路清楚！

user: user-7
content: 消息循环并不等于是while(1)这样的循环, 因为你会发现它并不会像while(1)这样的死循环一样, 占用30%以上的CPU.  windows就是基于消息的, 所以你不用担这个问题.

user: user-8
content: 合理的划分模块,消息不怕多,就怕乱

user: user-9
content: 最多程序死掉了。那就用进程管理器杀掉好了。 或者电脑死机了。那也没事，重启就好了
user-0 提问: 缓冲区的问题

回复:
user: user-1
content: 引用 2 楼 lgf2002 的回复:函数fgets、fputs封装了read、write函数，在fgets、fputs函数里有另外一个buf，就是标准I/O缓冲。拿fgets函数来说，它调用read函数，从文件中读出的数据先放到这个buf，当buf里的字节数达到fgets函数传递的n-1字节时，然后才将这个buf里的n-1字节数据加上空字符0共n个字节的字符拷贝到用户定义的buf中。 这样做，为了减少系统级的I/O来提高效率  标准I/O库实现了一个 buffer

user: user-2
content: 函数fgets、fputs封装了read、write函数，在fgets、fputs函数里有另外一个buf，就是标准I/O缓冲。拿fgets函数来说，它调用read函数，从文件中读出的数据先放到这个buf，当buf里的字节数达到fgets函数传递的n-1字节时，然后才将这个buf里的n-1字节数据加上空字符0共n个字节的字符拷贝到用户定义的buf中。 这样做，为了减少系统级的I/O来提高效率

user: user-3
content: 标准I/O缓冲区应该是内核里的缓冲区，用户程序的行缓冲区是用户空间的缓冲区，我是这么觉得的 具体答案还是坐等大牛回答吧
user-0 提问: 请教一下，char * const *p是真么意思呢

回复:
user: user-0
content: 非常感谢，这个是把const类型的指针转换成char*

user: user-1
content: (char * const *) p1 应该是强制类型转换，将p1转换成，指向char*类型的const指针。

user: user-0
content: return里的(char * const *) p1呢

user: user-2
content: const void *p1, const void *p2的写法是为了防止p1和p2所指向的内容被改写，起保护作用。  引用 楼主 cytzrs 的回复:man了一下qsort，它里边的compar函数是这么写的： cmpstringp(const void *p1, const void *p2)        {            /* The actual arguments to this function are "pointers to               pointers to char", but strcmp(3) arguments are "pointers               to char", hence the following cast plus dereference */             return strcmp(* (char * const *) p1, * (char * const *) p2);        }   请问一下大家* (char * const *) p1, * (char * const *) p2)，这种写法是什么意思，和*const(char**p),含义一样吗
user-0 提问: 想看一下VS2010中abs函数的写法

回复:
user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\abs.c /*** *abs.c - find absolute value * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines abs() - find the absolute value of an int. * *******************************************************************************/  #include <cruntime.h> #include <stdlib.h>  #pragma function(abs, _abs64)  int __cdecl abs (         int number         ) {         return( number>=0 ? number : -number ); } __int64 __cdecl _abs64(         __int64 num         ) {         return (num >=0 ? num : -num); }  还是赵老师好人啊 即给源码又给路径。真是明白我的难处啊

user: user-0
content: 引用 6 楼 netbooting 的回复:     return a < 0 ? -a : a;  我最开始也是这样写，然后就想用位运算取反+1会不会更好些。。 因此想看看VS里是怎么写的~~~  谢谢了

user: user-1
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\abs.c /*** *abs.c - find absolute value * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines abs() - find the absolute value of an int. * *******************************************************************************/  #include <cruntime.h> #include <stdlib.h>  #pragma function(abs, _abs64)  /*** *int abs(number) - find absolute value of number * *Purpose: *       Returns the absolute value of number (if number >= 0, returns number, *       else returns -number). * *Entry: *       int number - number to find absolute value of * *Exit: *       returns the aboslute value of number * *Exceptions: * *******************************************************************************/  int __cdecl abs (         int number         ) {         return( number>=0 ? number : -number ); } __int64 __cdecl _abs64(         __int64 num         ) {         return (num >=0 ? num : -num); }

user: user-2
content: 引用 6 楼 netbooting 的回复:     return a < 0 ? -a : a;

user: user-3
content: return a < 0 ? -a : a;

user: user-0
content: 求好人~\(≧▽≦)/~

user: user-0
content: 引用 3 楼 zhaowech 的回复:你对源代码抱有什么样的疑问呢？  木有疑问，就想看看它是怎么写的. 学习一下他的写法。

user: user-4
content: 你对源代码抱有什么样的疑问呢？

user: user-0
content: 引用 1 楼 user-5 的回复:abs上点右键，看有无“跳转到定义”这一命令。  嗯嗯。主要是手头没有安装VS，没办法查看函数的内容。 设个断点，然后调试进入到函数内部也是可以看到的。

user: user-5
content: abs上点右键，看有无“跳转到定义”这一命令。
user-0 提问: c编程问题

回复:
user: user-0
content: 引用 4 楼 AnYidan 的回复:估计 void delay(unsigned char);谢谢

user: user-0
content: 引用 3 楼 makezwl 的回复:你把delay函数贴出来嗯 解决了

user: user-1
content: 估计 void delay(unsigned char);

user: user-2
content: 你把delay函数贴出来

user: user-0
content: 引用 1 楼 focuslight 的回复:看晶振不同, 研时不同 具体说说没明白

user: user-3
content: 看晶振不同, 研时不同
user-0 提问: (a+b)/2 = a&b + (a^b)>>1     求解释

回复:
user: user-1
content: 引用 10 楼 a627088424 的回复:[quote=引用 9 楼 a627088424 的回复:] [quote=引用 8 楼 a627088424 的回复:] [quote=引用 6 楼 baichi4141 的回复:] [quote=引用 4 楼 a627088424 的回复:] (a>>1)+(b>>1)不行吗，有什么缺陷 a=1;b=1;[/quote]（a+b）/2这样ne[/quote]换成这样a&b + (a^b)>>1，有点在哪[/quote]除法一般能比位运算慢多少[/quote] 优点就在于位运算不可能溢出 实际工作中根本不会这么用，这就是用来考察学生是否懂不懂数据溢出的教学用问题

user: user-2
content: 引用 1 楼 baichi4141 的回复:没啥可解释的，二进制基本运算而已，先求相同部分，再把不同部分除2就是中值了 举例来说，111和101求中值，首先分成(101+101)+(10)，然后除以2就是(101)+(10>>1)+1

user: user-0
content: 引用 9 楼 a627088424 的回复:[quote=引用 8 楼 a627088424 的回复:] [quote=引用 6 楼 baichi4141 的回复:] [quote=引用 4 楼 a627088424 的回复:] (a>>1)+(b>>1)不行吗，有什么缺陷 a=1;b=1;[/quote]（a+b）/2这样ne[/quote]换成这样a&b + (a^b)>>1，有点在哪[/quote]除法一般能比位运算慢多少

user: user-0
content: 引用 8 楼 a627088424 的回复:[quote=引用 6 楼 baichi4141 的回复:] [quote=引用 4 楼 a627088424 的回复:] (a>>1)+(b>>1)不行吗，有什么缺陷 a=1;b=1;[/quote]（a+b）/2这样ne[/quote]换成这样a&b + (a^b)>>1，有点在哪

user: user-0
content: 引用 6 楼 baichi4141 的回复:[quote=引用 4 楼 a627088424 的回复:] (a>>1)+(b>>1)不行吗，有什么缺陷 a=1;b=1;[/quote]（a+b）/2这样ne

user: user-3
content: lz 什么项目，如此计较速度？如果两个数是 singned int 呢？

user: user-1
content: 引用 4 楼 a627088424 的回复:(a>>1)+(b>>1)不行吗，有什么缺陷 a=1;b=1;

user: user-0
content: 引用 4 楼 a627088424 的回复:[quote=引用 3 楼 baichi4141 的回复:] [quote=引用 2 楼 a627088424 的回复:] [quote=引用 1 楼 baichi4141 的回复:] 没啥可解释的，二进制基本运算而已，先求相同部分，再把不同部分除2就是中值了 举例来说，111和101求中值，首先分成(101+101)+(10)，然后除以2就是(101)+(10>>1)你一说，以下就明白了。但是开始的时候，怎么我就看着那么不直觉呢，以下看不出来。 [/quote] 二进制运算规则，用穷举法就能总结归纳了，毕竟就1和0两个数字而已[/quote](a>>1)+(b>>1)不行吗，有什么缺陷[/quote] a与b为数组下标

user: user-0
content: 引用 3 楼 baichi4141 的回复:[quote=引用 2 楼 a627088424 的回复:] [quote=引用 1 楼 baichi4141 的回复:] 没啥可解释的，二进制基本运算而已，先求相同部分，再把不同部分除2就是中值了 举例来说，111和101求中值，首先分成(101+101)+(10)，然后除以2就是(101)+(10>>1)你一说，以下就明白了。但是开始的时候，怎么我就看着那么不直觉呢，以下看不出来。 [/quote] 二进制运算规则，用穷举法就能总结归纳了，毕竟就1和0两个数字而已[/quote](a>>1)+(b>>1)不行吗，有什么缺陷

user: user-1
content: 引用 2 楼 a627088424 的回复:[quote=引用 1 楼 baichi4141 的回复:] 没啥可解释的，二进制基本运算而已，先求相同部分，再把不同部分除2就是中值了 举例来说，111和101求中值，首先分成(101+101)+(10)，然后除以2就是(101)+(10>>1)你一说，以下就明白了。但是开始的时候，怎么我就看着那么不直觉呢，以下看不出来。 [/quote] 二进制运算规则，用穷举法就能总结归纳了，毕竟就1和0两个数字而已

user: user-0
content: 引用 1 楼 baichi4141 的回复:没啥可解释的，二进制基本运算而已，先求相同部分，再把不同部分除2就是中值了 举例来说，111和101求中值，首先分成(101+101)+(10)，然后除以2就是(101)+(10>>1)你一说，以下就明白了。但是开始的时候，怎么我就看着那么不直觉呢，以下看不出来。

user: user-1
content: 没啥可解释的，二进制基本运算而已，先求相同部分，再把不同部分除2就是中值了 举例来说，111和101求中值，首先分成(101+101)+(10)，然后除以2就是(101)+(10>>1)
user-0 提问: C的文件读写fread，fwrite问题

回复:
user: user-1
content: 引用 8 楼 InSpirit1 的回复:[quote=引用 1 楼 vrace 的回复:] 其实是读进去了的，但是呢 printf("%s\n", str); 输出到第一个参数里面的结束符\0的时候，就不会输出了。也就是说，你这样写是看不到完整输出的。 哦，我可不可以理解为，每fwrite一个结构体对象，在这个对象的结尾就会有一个\0 ？[/quote]  No， 你错了，fwrite 并不会多写东西。在你的这个例子中，你的结构是两个字符串+2个int, 所以printf显示出来的是第一个字符串。

user: user-2
content: 引用 9 楼 InSpirit1 的回复:[quote=引用 3 楼 max_min_ 的回复:]  fwrite(&task1, sizeof(task1), 1, stream); /* 写的struct文件*/ sleep(1); //可以文件还没写完，就被关闭了！ 试下， 下面的同理     fclose(stream); /*关闭文件*/  //还有你读出来的文件应该按照结构体解析 出来再打印的，不然会有乱码的 struct task *str = (struct task *) malloc(sizeof(task1)); fread(str, fileLen, 1, fp); //这样就可以直接打印各个成员了，不能一下子%s的  //当然也可以用char*读出来，最后强转一下也行！  你好，你的方法我试了试： 	struct task *str = (struct task *)malloc( sizeof(task1)); 	printf("%s", str->TaskNo); 无法编译，报错"不允许指针指向不完整的类类型"，报错位置为str处，这是为什么？[/quote] 把你修改的源码贴出来吧！估计是哪里写错了吧！

user: user-0
content: 引用 3 楼 max_min_ 的回复: fwrite(&task1, sizeof(task1), 1, stream); /* 写的struct文件*/ sleep(1); //可以文件还没写完，就被关闭了！ 试下， 下面的同理     fclose(stream); /*关闭文件*/  //还有你读出来的文件应该按照结构体解析 出来再打印的，不然会有乱码的 struct task *str = (struct task *) malloc(sizeof(task1)); fread(str, fileLen, 1, fp); //这样就可以直接打印各个成员了，不能一下子%s的  //当然也可以用char*读出来，最后强转一下也行！  你好，你的方法我试了试： 	struct task *str = (struct task *)malloc( sizeof(task1)); 	printf("%s", str->TaskNo); 无法编译，报错"不允许指针指向不完整的类类型"，报错位置为str处，这是为什么？

user: user-0
content: 引用 1 楼 vrace 的回复:其实是读进去了的，但是呢 printf("%s\n", str); 输出到第一个参数里面的结束符\0的时候，就不会输出了。也就是说，你这样写是看不到完整输出的。 哦，我可不可以理解为，每fwrite一个结构体对象，在这个对象的结尾就会有一个\0 ？

user: user-3
content: 引用 3 楼 max_min_ 的回复: fwrite(&task1, sizeof(task1), 1, stream); /* 写的struct文件*/ sleep(1); //可以文件还没写完，就被关闭了！ 试下， 下面的同理     fclose(stream); /*关闭文件*/  //还有你读出来的文件应该按照结构体解析 出来再打印的，不然会有乱码的 struct task *str = (struct task *) malloc(sizeof(task1)); fread(str, fileLen, 1, fp); //这样就可以直接打印各个成员了，不能一下子%s的  //当然也可以用char*读出来，最后强转一下也行！ ++

user: user-4
content: lz 最好查看二进制的文件

user: user-5
content: 你可以将str 定义为结构体的指针 然后str动态分配空间 printf("%s %s %d %d\n", str->TaskNo,str->TaskDesc,str->Timeout,str->Priority); 用上面语句输出，

user: user-6
content: 我觉得楼主 看看二进制的方式。查看数据在底层存放的方式 就会明白

user: user-2
content: fwrite(&task1, sizeof(task1), 1, stream); /* 写的struct文件*/ sleep(1); //可以文件还没写完，就被关闭了！ 试下， 下面的同理     fclose(stream); /*关闭文件*/  //还有你读出来的文件应该按照结构体解析 出来再打印的，不然会有乱码的 struct task *str = (struct task *) malloc(sizeof(task1)); fread(str, fileLen, 1, fp); //这样就可以直接打印各个成员了，不能一下子%s的  //当然也可以用char*读出来，最后强转一下也行！

user: user-7
content: 1、用fwrite存入本地文件后，打开文件发现int型的两个数1,2没有写进去，但是task1结构体里面有数 ——“打开文件”？你大概是用windows自带的记事本软件打开a.txt文件的，记事本软件并不是上帝出品，它只负责把文件中的所有二进制数据以ASCII码形式显示在屏幕上，以fwrite直接写到文件中的int型数据它显示不出来。 2、用fread读取文件后，发现只有第一个数据，即NO.0001被读到str中去了，后面的都没读进去 ——printf("%s\n", str);这条语句只打印str指针指向的内存对应的ASCII码，直到遇到第一个0位置，自然不会显示这个0后面的第二个字符串和int型整数等等等等  结论就是，楼主“发现”的方式有问题。文件中有什么，请使用十六进制查看软件查看数据，而不是用记事本打开看ASCII码。结构体中有什么数据，请逐一按格式printf字符串和整型数据，而不是用一个%s代表一切。

user: user-1
content: 其实是读进去了的，但是呢 printf("%s\n", str); 输出到第一个参数里面的结束符\0的时候，就不会输出了。也就是说，你这样写是看不到完整输出的。
user-0 提问: 大一新生求解答~0 0 

回复:
user: user-0
content: 哈哈哈哈哈~~大牛们多谢赐教！！ 我懂了！ 谢谢~~

user: user-1
content: 崩溃啊！再看了看，t等于0了，n=t不也是0了吗

user: user-1
content: while（t!=0)要是m不小于n就没有t赋值，就出错了

user: user-2
content: 引用 5 楼 u011930458 的回复:[quote=引用 4 楼 Adol1111 的回复:] 改成这样吧：#include<stdio.h> int main() {      int m,n,i,t,s,n1;      scanf("%d%d",&m,&n);      if(m<n)      {          t=m;          m=n;          n=t;      }      t=m%n;      while(t!=0)      {          m=n;          n=t;          t=m%n;//把这句放到最后，n记录上一个余数值      }      printf("%d",n); }  是这样的[/quote] +++ 问题就是两个地方，第一个地方是在比较m和n的大小时，如需要交换m和n的值，则需要用大括号括起来，另一个地方是，t需要初始化，在while中判断之前。

user: user-3
content: 引用 4 楼 Adol1111 的回复:改成这样吧：#include<stdio.h> int main() {      int m,n,i,t,s,n1;      scanf("%d%d",&m,&n);      if(m<n)      {          t=m;          m=n;          n=t;      }      t=m%n;      while(t!=0)      {          m=n;          n=t;          t=m%n;//把这句放到最后，n记录上一个余数值      }      printf("%d",n); }  是这样的

user: user-4
content: 改成这样吧：#include<stdio.h> int main() {      int m,n,i,t,s,n1;      scanf("%d%d",&m,&n);      if(m<n)      {          t=m;          m=n;          n=t;      }      t=m%n;      while(t!=0)      {          m=n;          n=t;          t=m%n;//把这句放到最后，n记录上一个余数值      }      printf("%d",n); }

user: user-4
content: 楼上的看错了if(m<n){t=m;m=n;n=t;}//这样才是3句话 你的问题比较多，t没有被指定，if(m<n)成立时，t有确定值，但不成立时t的值是未知的。 还有这里：while(t!=0)     {         t=m%n;//当t=0时，下面的n=t就会变成0，那你打印出来的就是0         m=n;         n=t;     }

user: user-4
content: if(m<n)      {t=m,m=n,n=t;}//交换记得加{}，这是3句话不是1句话

user: user-5
content: 设置断点，逐步调试，分析结果。这是新手必须要学会的技能，这也是寻找BUG必须会的。
user-0 提问: SOCKET 编程  提示找不到send.c

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 hfcenter 的回复:] [quote=引用 1 楼 user-1 的回复:] 提示找不到文件是什么意思？应该不是代码问题吧，是环境问题吧！  但是是在执行send()函数4次之后才提示找不到源文件[/quote] 你不是生成一个可执行文件么？执行文件就好了，已经独立开源文件了，还要找不到提示源文件，什么情况？ [/quote] 我是在eclipse中调试，结果运行了几次就出现这种情况

user: user-1
content: 引用 2 楼 hfcenter 的回复:[quote=引用 1 楼 user-1 的回复:] 提示找不到文件是什么意思？应该不是代码问题吧，是环境问题吧！  但是是在执行send()函数4次之后才提示找不到源文件[/quote] 你不是生成一个可执行文件么？执行文件就好了，已经独立开源文件了，还要找不到提示源文件，什么情况？

user: user-0
content: 引用 1 楼 user-1 的回复:提示找不到文件是什么意思？应该不是代码问题吧，是环境问题吧！  但是是在执行send()函数4次之后才提示找不到源文件

user: user-1
content: 提示找不到文件是什么意思？应该不是代码问题吧，是环境问题吧！
user-0 提问: 有没有时间复杂度为O（n）空间复杂度为1的排序算法？

回复:
user: user-1
content: 你说的对，是我想错了，忽略了使用分离链处理冲突时指针所占用的空间。多谢指正。

user: user-2
content: 引用 14 楼 sbwwkmyd 的回复:有一种桶排序的实现是这样的，先O(n)计算每个桶的大小，然后直接在原数组中定位M个指针交换数据。 有一种桶排序的实现是这样的，先O(n)计算每个桶的数据数量，然后直接在原数组中定位M个指针交换数据。

user: user-2
content: 引用 12 楼 pinghegood 的回复:一般来说对超过基本类型表示的大数或字符串排序，使用基数排序比较好。桶排序适用于基于整形的数值排序（对字符串非要用桶排序的话，需要将字符串使用某种方式转换成整形数值）。对于桶排序，当M = 10，N = 10时我可以排序，N = 100时也可以排序，只是时间复杂度会增加，略大于O(n)，但是空间复杂度还是O(1)。不知道我这样理解是否正确，请指正。这样做的话，时间复杂度难道不是与数据长度成正比吗？引用 13 楼 Adol1111 的回复:桶排序的空间复杂度好像的确不是O(1)，空间复杂度一般算的是辅助空间的大小，如果这个辅助空间的大小不随元素N变化那么就是O(1)。比如冒泡排序，需要的辅助空间是一个作交换用的临时变量，而且无论任何情况下都只要这一个，所以空间复杂度就是O(1)。但桶排序就不同了，他本身需要M个桶，桶的数量是人为决定的，然后需要N个结点，去装原本的N个元素，所以空间复杂度就是O(M+N)，看下图： 有一种桶排序的实现是这样的，先O(n)计算每个桶的大小，然后直接在原数组中定位M个指针交换数据。

user: user-3
content: 桶排序的空间复杂度好像的确不是O(1)，空间复杂度一般算的是辅助空间的大小，如果这个辅助空间的大小不随元素N变化那么就是O(1)。比如冒泡排序，需要的辅助空间是一个作交换用的临时变量，而且无论任何情况下都只要这一个，所以空间复杂度就是O(1)。但桶排序就不同了，他本身需要M个桶，桶的数量是人为决定的，然后需要N个结点，去装原本的N个元素，所以空间复杂度就是O(M+N)，看下图：

user: user-1
content: 一般来说对超过基本类型表示的大数或字符串排序，使用基数排序比较好。桶排序适用于基于整形的数值排序（对字符串非要用桶排序的话，需要将字符串使用某种方式转换成整形数值）。对于桶排序，当M = 10，N = 10时我可以排序，N = 100时也可以排序，只是时间复杂度会增加，略大于O(n)，但是空间复杂度还是O(1)。不知道我这样理解是否正确，请指正。

user: user-2
content: 好吧，来个实例。我现在要对大数或者字符串排序，请为这个桶大小取个任意值。

user: user-1
content: 可以是任意值，只要这个值不随着待排序数目的变化而变化就行。

user: user-2
content: 桶大小会是O(1)的话，请问这个值是多少？

user: user-1
content: 不好意思，上面的开始的“时间复杂度”改成“空间复杂度”，笔误。完整的为“在算法中所谓的空间复杂度为O(1)并不是说只使用一个空间，而是说在待处理的数据量变化的情况下使用的空间量是不变的。所以，桶排序是空间复杂度为O（1），时间复杂度为O(n)的算法。”

user: user-1
content: 在算法中所谓的时间复杂度为O(1)并不是说只使用一个空间，而是说在待处理的数据量变化的情况下使用的空间量是不变的。所以，桶排序是空间复杂度为O（1），时间复杂度为O(n)的算法。

user: user-4
content: 引用 5 楼 czarten 的回复:基于比较的排序算法nlogn是极限 更快的算法通常有额外条件，或者特殊硬件 另外桶排序的空间不是O（1）吧  记得还有个O(1)时间的排序算法，需要依靠重力

user: user-4
content: 基于比较的排序算法nlogn是极限 更快的算法通常有额外条件，或者特殊硬件 另外桶排序的空间不是O（1）吧

user: user-3
content: 引用 3 楼 taodm 的回复:有啊，桶排序。 +1  设排序数量为N，桶的数量为M，那么： 时间复杂度是：O(N+N*logN-N*logM)，当N=M时就是O(N)了。

user: user-5
content: 有啊，桶排序。

user: user-6
content: 要看有什么额外条件。比如值域固定的话那就有。

user: user-7
content: 没有!!!!!
user-0 提问: win7 进程隐藏

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！ 实现困难吗？

user: user-1
content: windows内核编程,hook微软没有公布的API

user: user-2
content: http://www.codeproject.com/Articles/167583/Driver-to-Hide-Processes-and-Files-Second-Edition 仅供参考。不一定支持Win7

user: user-2
content: 奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！

user: user-0
content: 没有大神回答么？
user-0 提问: 来看看指针字符串细节 

回复:
user: user-0
content: 因为不懂我还到灌水的地方去问了，跟着他们的做了，我用了平均给分，有5个人，平均每个人8分，但是我到这里因为技术区好像不能平均给分的，所以结贴是给你填的是40的，但是一直出现给的分数和总分数不符和，后来我填20 不行在填10也不行，后面填了3也不行，所以我猜是不是我的分数没有了，我真的不是非常懂，不要误会。

user: user-0
content: 我的意思是我的分好像为0了，本来想给你的，不知到为啥出现给的分与总分数不符和，所以推测分数为零的，我没用过这里的结贴，真的不懂，不要误会哟，真的很感谢你们的

user: user-1
content: 引用 8 楼 cainiao366 的回复:特别感谢大家，我看了，AzraelLamber推荐的帖子，明白了，这贴子我会经常看看，我想结贴贴给分但是出现总分与给分不符和，我知道已经穷了，  分留着吧，帖子结了就行。要不还不知道多少人来吐槽呢。

user: user-2
content: 大家是来帮助你的，随便给点分，结贴就成了，不够攒点分，结贴就成了。 我这是帮你摆脱困境的，提个建议，不必给分。

user: user-0
content: 特别感谢大家，我看了，AzraelLamber推荐的帖子，明白了，这贴子我会经常看看，我想结贴贴给分但是出现总分与给分不符和，我知道已经穷了，

user: user-3
content: 学而不思则罔，思而不学则殆

user: user-4
content: 不是的！char * str1 = "Made in china";你这杨定义的是在静态区的，数据在静态区的 只能读不可以修改的！当你试图修改它的话，运行起来内存肯定出错了！ 如果char  str1[] = "Made in china"; 后面的拷贝应该是可以的了!  ps:建议楼主看看内存管理这块知识，补补这方面的欠缺！

user: user-5
content: 你的代码大致的意思是  2 =1+1，也就是"Made in china" ="Made in china"+"Where are"  如果你的代码成立的话。那么 n=n+1,就不必存在了。我们应该写成 5=5+1；就行了。  一个玩笑不要介意。

user: user-6
content: char * str1 = "Made in china";   这个的内存的确不能修改

user: user-1
content: 先看看人家总结的吧： http://blog.csdn.net/lollipop_jin/article/details/8314304

user: user-7
content: 个人建议：遇到问题的时候，别忙着在自己脑中空想各种各样的解释，先去查查有没有相关的基础知识

user: user-1
content: 。。。大哥,你这是企图通过char*指针给常量存放区域的内存赋值，那是不可修改的内存，当然运行出错。 不论你循环不循环，长短不长短都不会成功的，你就死了那条心吧！
user-0 提问: 大二数据结构要掌握到什么程度

回复:
user: user-0
content: 引用 4 楼 Adol1111 的回复:[quote=引用 3 楼 u012686437 的回复:] [quote=引用 2 楼 Adol1111 的回复:] 不存在大二要掌握多少的问题，如果你真心想学好就必须都会。顺序表、链表、栈、队列、树、图的相关知识及算法。最好看下《算法导论》。  开始的时候先不要在意实现的部分，应该在意的是理论基础，原理是什么，能不能用手写过程求出相应的结果。如果这步都做不到就不要写后面的代码了。实现的部分是指？我是想学好，只是现在代码实在看不大懂，又要考试呢。你的意思是我先看算法先不管代码？[/quote] 对，我说的是代码实现，这部分先不要去管。比如二叉树的先序后序遍历，能否直接根据算法描述用纸笔写出。如果连这些都做不到，那么代码就更加不用写了。还有些理论基础，比如二叉树的度等等，这些也要了解下。  至于代码的部分还是要看你的语言基础，C、C++、Java等等，如果你有语言基础应该没什么问题。如果你语言不好的话，还是回去多练练，多看看书。[/quote]有的比如遍历，求叶子数没给算法直接给代码看得很头疼。但是如果算法看懂了一句一句翻译成代码还是没有问题的。算法导论我觉得现在有点早。毕竟我在学数据结构，一些基本的算法都还没接触到呢。

user: user-1
content: 引用 3 楼 u012686437 的回复:[quote=引用 2 楼 Adol1111 的回复:] 不存在大二要掌握多少的问题，如果你真心想学好就必须都会。顺序表、链表、栈、队列、树、图的相关知识及算法。最好看下《算法导论》。  开始的时候先不要在意实现的部分，应该在意的是理论基础，原理是什么，能不能用手写过程求出相应的结果。如果这步都做不到就不要写后面的代码了。实现的部分是指？我是想学好，只是现在代码实在看不大懂，又要考试呢。你的意思是我先看算法先不管代码？[/quote] 对，我说的是代码实现，这部分先不要去管。比如二叉树的先序后序遍历，能否直接根据算法描述用纸笔写出。如果连这些都做不到，那么代码就更加不用写了。还有些理论基础，比如二叉树的度等等，这些也要了解下。  至于代码的部分还是要看你的语言基础，C、C++、Java等等，如果你有语言基础应该没什么问题。如果你语言不好的话，还是回去多练练，多看看书。

user: user-0
content: 引用 2 楼 Adol1111 的回复:不存在大二要掌握多少的问题，如果你真心想学好就必须都会。顺序表、链表、栈、队列、树、图的相关知识及算法。最好看下《算法导论》。  开始的时候先不要在意实现的部分，应该在意的是理论基础，原理是什么，能不能用手写过程求出相应的结果。如果这步都做不到就不要写后面的代码了。实现的部分是指？我是想学好，只是现在代码实在看不大懂，又要考试呢。你的意思是我先看算法先不管代码？

user: user-1
content: 不存在大二要掌握多少的问题，如果你真心想学好就必须都会。顺序表、链表、栈、队列、树、图的相关知识及算法。最好看下《算法导论》。  开始的时候先不要在意实现的部分，应该在意的是理论基础，原理是什么，能不能用手写过程求出相应的结果。如果这步都做不到就不要写后面的代码了。

user: user-2
content: 顺序表，堆栈，链表，二叉树，几种排序算法。

user: user-3
content: 我觉得吧，数据结构学习的精髓还是一种思想，一种思考问题的方式，语言知识工具，你学会了这种算法，用什么语言都可以写出来，只不过需要学习一下这种语言的简单语法罢了。所以，数据结构中的递归，调用，将一些数据封装到结构体中，对于一个结构体定义一些基本操作，再利用基本操作去进行编程，这些思考问题的方式才是真正应该掌握的。

user: user-0
content: 引用 9 楼 chenailun1990 的回复:刚开始上数据结构吗上了有一段时间了，不过不太习惯

user: user-0
content: 引用 10 楼 szllong123 的回复:很现实的告诉你，如果仅为了考试一个都不用会写出来。实际应用的话自然是都需要了。但是考试肯定会有程序设计的题目的，不会怎么行呢

user: user-4
content: 读书学习：http://bbs.csdn.net/topics/390090123

user: user-5
content: 很现实的告诉你，如果仅为了考试一个都不用会写出来。实际应用的话自然是都需要了。

user: user-6
content: 刚开始上数据结构吗

user: user-0
content: 引用 7 楼 Adol1111 的回复:你不需要写出算法的代码，只要算法的步骤就可以了。最好学会用伪代码、流程图写出过程。嗯。我会试着自己想算法的。谢谢啦

user: user-1
content: 你不需要写出算法的代码，只要算法的步骤就可以了。最好学会用伪代码、流程图写出过程。

user: user-1
content: 引用 5 楼 u012686437 的回复:有的比如遍历，求叶子数没给算法直接给代码看得很头疼。但是如果算法看懂了一句一句翻译成代码还是没有问题的。算法导论我觉得现在有点早。毕竟我在学数据结构，一些基本的算法都还没接触到呢。 你应该先了解下基础，比如什么是叶子节点等等，然后根据你自己的理解去设计算法，然后和书上的比对（当然书上可能分成了递归版和非递归版），这样学习更有效率些。  至于算法导论的话，里面有数据结构的部分和算法部分，没说让你直接学算法，而且这本书也不一定要按顺序看。你可以去了解下，这本书学算法、数据结构都很不错的。
user-0 提问: 求帮助！一个菜鸟遇到的C语言编程题

回复:
user: user-1
content: 引用 1 楼 max_min_ 的回复: // 是素数返回true，不是返回false， 调用这个函数就好！楼主找本基础书补补基础吧！ bool testfunc( int a) {     int i= 0;     if (a == 2 )          return true;     for(i=2; i<a; i++)     {            if(a%i == 0)             return false;     }        return true; }  这里a可以优化为sqrt(a)+1

user: user-2
content: 参考http://blog.csdn.net/turingo/article/details/8161061  引用 楼主 u012435478 的回复:最近学了调用函数，遇到了问题。问题是：用调用函数的方法判断一个数字是不是素数。请求各位帮助

user: user-3
content: 只要 i<sqr(a) 就够了。

user: user-4
content: // 是素数返回true，不是返回false， 调用这个函数就好！楼主找本基础书补补基础吧！ bool testfunc( int a) {     int i= 0;     if (a == 2 )          return true;     for(i=2; i<a; i++)     {            if(a%i == 0)             return false;     }        return true; }

user: user-5
content: 引用 5 楼 AnYidan 的回复: bool isPrime(int number)				// 求素数 {  	int i; 	int k;  	k = (int)sqrt((double)number);      // 用平方根，而非用number/2，相对提高速度sqrt(number)/2倍 	for(i = 2; i <= k; i++) 	{ 		if(number%i==0)  			break; 	} 	if (i > k)  return true;	// 没有找到可以整除的除数，被除数是 prime number 	else   return false; }  ++ 这种方法的效率还是比较高的。

user: user-6
content: [quote=引用 1 楼 max_min_ 的回复:] [code=c] // 是素数返回true，不是返回false， 调用这个函数就好！楼主找本基础书补补基础吧！ bool testfunc( int a) {     int i= 0

user: user-7

user: user-8
content: bool isPrime(int number)				// 求素数 {  	int i; 	int k;  	k = (int)sqrt((double)number);      // 用平方根，而非用number/2，相对提高速度sqrt(number)/2倍 	for(i = 2; i <= k; i++) 	{ 		if(number%i==0)  			break; 	} 	if (i > k)  return true;	// 没有找到可以整除的除数，被除数是 prime number 	else   return false; }

user: user-9
content: // 是素数返回1，否则返回0 int isSuShu(unsigned x) {     int i = 0;     if (x == 2 )          return 1;     for(i = 2; i < x; i++)     {            if(x % i == 0)             return 0;     }        return 1; }
user-0 提问: typedef 如何理解

回复:
user: user-1
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

user: user-2
content: 引用 7 楼 AnYidan 的回复:const char* ptr: ptr is a pointer, point to a constant character  char* const ptr: ptr is a constant pointer, point to a characterre

user: user-3
content: const Stu_pst stu3; Stu_pst const stu4;  这2个表达了同一个意思，区别就是没有给stu4初始化，而typedef的理解很简单  const Stu_pst stu3; 表示 stu3这个struct的内容是可以修改的，但stu3所在的内存地址不可变。  Stu_pst const stu4; 表示stu4指针本身不能被修改，而stu4指向的数组内容是可以修改的。即stu4只能指向固定地址，不可改变。

user: user-4
content: 看完就明白了 http://www.cnblogs.com/csyisong/archive/2009/01/09/1372363.html

user: user-5
content: const Stu_pst stu3; 指针常量  Stu_pst const stu4; 常量指针 具体的不明白可以google下两者的区别！

user: user-6
content: typedef就是其别名，就比如int类型，我们可以给它另一个名字，不过代表的都是同样的类型。就像一个人有两个名字，大名和小名。

user: user-7
content: const char* ptr: ptr is a pointer, point to a constant character  char* const ptr: ptr is a constant pointer, point to a character

user: user-7
content: bool isPrime(int number)				// 求素数 {  	int i; 	int k;  	k = (int)sqrt((double)number);      // 用平方根，而非用number/2，相对提高速度sqrt(number)/2倍 	for(i = 2; i <= k; i++) 	{ 		if(number%i==0)  			break; 	} 	if (i > k)  return true;	// 没有找到可以整除的除数，被除数是 prime number 	else   return false; }

user: user-8
content: const Stu_pst stu3; Stu_pst const stu4;  其实这两句是一样的，只是两种不同的写法，都表示常量指针，也就是说这两个指针都必须初始化而且不能再被赋值，不信的话你可以试试不初始化stu3和stu4肯定编译报错  另外一种叫指向常量的指针 如:const Stu_st *stu_p; 这种指针可以不初始化

user: user-9
content: const type*是该变量指向的内容不能修改. type* const是指针变量自己不能被修改.
user-0 提问: VC下用C语言控制串口接收数据

回复:
user: user-1
content: 引用 5 楼 singaporeraining 的回复:[quote=引用 2 楼 lt114896 的回复:] 串口的操作和socket操作是差不多的，看你用什么方式打开串口了。用writefile方式打开的话，可以一直读，线程循环去读就可以了  您好，我就是打算用ReadFile这种方式打开（因为我刚开始接触，只知道这一种方法），如果我这么一直循环读下去的话，能否出现读取返回值和判断的时候，错过了下位机发给串口的数据这种现象？ 谢谢您！[/quote] windows串口一般有两种方式，windows API 或者使用控件。 如果是那种主从模式，使用windows API比较好，发了数据之后就等待接收。 否则就使用控件，当收到数据时，触发系统的中断事件，控件已经分装好了，在对应位置填代码就行。 串口有自己的缓冲，不会出现你所说的错过数据的现象。

user: user-0
content: 已经结贴完毕，谢谢各位的指点！~

user: user-0
content: 引用 2 楼 lt114896 的回复:串口的操作和socket操作是差不多的，看你用什么方式打开串口了。用writefile方式打开的话，可以一直读，线程循环去读就可以了  您好，我就是打算用ReadFile这种方式打开（因为我刚开始接触，只知道这一种方法），如果我这么一直循环读下去的话，能否出现读取返回值和判断的时候，错过了下位机发给串口的数据这种现象？ 谢谢您！

user: user-0
content: 引用 3 楼 baichi4141 的回复:PC会一直操作串口接收数据并轮询串口接收的buffer，查看是否有数据收到 那我在程序中应该循环发送ReadFile，发送之后就检查Bool类型的返回值，查到返回值为TRUE时，再读取buffer？类似于： do {     tmp= ReadFlie（...);     if(tmp == TRUE)     {         读取buffer；  break；     } } while（1）； 您是这个意思么？还是这个过程由PC完成，如果PC能完成，我需要怎么写呢？多谢您了！~

user: user-2
content: PC会一直操作串口接收数据并轮询串口接收的buffer，查看是否有数据收到

user: user-3
content: 串口的操作和socket操作是差不多的，看你用什么方式打开串口了。用writefile方式打开的话，可以一直读，线程循环去读就可以了

user: user-4
content: 只能遍历查询, 没有数据则sleep一会, 一般Sleep(10).  串口本身就是低速设备

user: user-3
content: 不会错过的，下位机发送东西上来的时候是在你的缓冲区里，你不读的话他不会消失，你在while循环里检测是可以检测到的

user: user-5
content: 网上有很多 vc++写的串口程序

user: user-6
content: 可以考虑创建线程处理数据