Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请问优先队列使用什么结构来实现的？

回复:
user: user-1
content: 可以直接用数组写一个大根/小根堆。   你说的插入一个元素排一次序的方法效率太低了，是搜索插入位置和移动元素的时间为O(n)的，而堆插入元素的效率应该是O(logN)的。

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:可以参考一下STL中的priority_queue，它就是用堆实现的，插入或删除不需要排序，只是一个调整堆的过程  我就是这么想的，每次push或者pop后，对堆经行一个调整，确保是个最大堆或者是最小堆 另外一个想法就是，每次push或者pop后数组进行一个排序，排序后的数组仍然是个堆。

user: user-2
content: 如果优先级别比较有限，可以用 数组 + 链表 来实现 如我以前因业务需求实现一个  task_queue 要求有优先级，高底水位控制等.   // 大概结构也就这样  #define PRI_NUM 3  // 优先级 #define PRI_LOW 0 #define PRI_NORMAL 1 #define PRI_HIGH 2   struct task_queue { 	int cur_max_pri;                       // 当前队列中存在的最大优先 (其实是为了让整个 push 与 pop 过程尽量达到 O1)        int count;                                    // 队中的task 数量, (只要应用于实现水位控制) 	task_list_t *tls[PRI_NUM];    // 链表数组        // ...       // ... } task_queue_t;  // ... // task_queue * task_queue_create(); // void task_queue_release(task_queue_t *tq);  // @pri    优先权，即 PRI_LOW, PRI_NORMAL, PRI_HIGH void task_queue_push(task_queue_t *tq, task_t *t, int pri) {    // 维护 cur_max_pri;    if (pri > tq->cur_max_pri) tq->int cur_max_pri = pri;      task_list_push_tail(tq->tsl[pri], t);    // ... }  task_t * task_queue_pop(task_queue_t *tq) {   // 获取当前优先级最大的 list    // 从list 中 pop 一个 task    task_list_t * tl = tq->tls[tq->cur_max_pri];   // ...   task_t *res = task_list_pop(tl);    // 维护 cur_max_pri;   // 如果  tq->tls[tq->cur_max_pri] == NULL, 则降级.   //    while (tq->cur_max_pri == NULL && 0 < tq->cur_max_pri)  --tq->cur_max_pri;   // ..     return res; }    总体就是 用优先级来做数组的下标

user: user-3
content: 是不是用堆呢

user: user-4
content: c++ stl的优先队列使用vector作为支撑，再用pop_heap及push_heap两个全局算法对vector的元素“顺序”进行管理。

user: user-5
content: 优先队列 http://blog.csdn.net/zhangxiangdavaid/article/details/30113413

user: user-6
content: 可以参考一下STL中的priority_queue，它就是用堆实现的，插入或删除不需要排序，只是一个调整堆的过程

user: user-7
content: 用数组只是每次插入不是重新排序而是仿照链表形式给数组每个节点添加前后驱
user-0 提问: 求大神看看我的代码为什么会陷入死循环

回复:
user: user-1
content: MATFile……这些都不知道是什么？

user: user-2
content: 楼主关键的错误是 for(i=50;i<1700;i+=400)          for(j=6;j<508;j+=124) {  我楼上代码加了第9行显示进度 但第20行和第30行可能应该都和其下一行的}交换位置。

user: user-2
content: void stretching(float *devpre,float *devpost,float *costs) {     int Xref,Yref;      float mad=0,diff;     int i,j,m,n,p,q,a,s=0;     int dx,dy;     for(i=50;i<1700;i+=400) {         for(j=6;j<508;j+=124) {             printf("i,j=%d,%d\n",i,j);             for(m=-100;m<=100;m++) {                 for(n=-100;n<=100;n++) {                     Xref=i+m;                     Yref=j+n;                     if((Xref>=0)&&(Xref+399<1700)&&(Yref>=0)&&(Yref+123<508)) {                         for(p=0;p<400;p++) {                             for(q=0;q<124;q++) {                                 diff=*(devpost+(j+q)*1700+(i+p))-*(devpre+(Yref+q)*1700+(Xref+p));                                 mad=mad+abs(diff);                             }                             mad=mad/(400*124);                         }                     } else {                         mad=0;                     }                     a=s*201*201+(m+100)*201+(n+100);                     *(costs+a)=mad;                 }             }         }         s++;     } }

user: user-3
content: 你把代码中的值改小点啊。。。2秒钟就出结果了

user: user-0
content: 主要是stretching(pre,post,cost)这个函数的问题，前面的都调试过了，不知道为什么运行很长时间都出不来结果，但是老师说20多分钟就能出来结果，我这个5个小时都没出来
user-0 提问: 求组

回复:
user: user-0
content: #include<stdio.h> double fun(int n) { 	int i; 	double t=0; 	for(i=100;i<n;i*=2) 		t+=1/(i*i); 	return(t); } main() { 	int m; 	scanf("%d",&m); 	printf("%lf",fun(m));  } 为什么不能返回t的值，运行后t的值为0；

user: user-1
content: cl.exe 的错误，我倒是有点熟，好像就是C++ 6.0平台就只能打开一个调试平台。出现这个错误，就把原来打开的调试框关掉就好了。 程序本身是没有错的，也用的vc++ 6.0试了一下。看是不是你的操作问题，以后注意一下，是保存->编译->连接->运行，一般我就直接点运行，但是如果出现了编译类的错误，就要按照顺序来了

user: user-2
content: 把数组a的定义放到j的赋值语句前面，这个是C的限制，C99是没问题的，但是VC不支持，也可以换个编译器，比如gcc

user: user-0
content: 还有一个问题

user: user-0

user: user-3
content: 你看错误提示啊，Int a[10];后面你多了 aa

user: user-0

user: user-0
content: 我运行为什么会显示错误？？

user: user-4
content: 完美运行，木有错误呀，楼主。

user: user-1
content: 我也觉得代码没有错误，看是不是哪里的字符格式错了，有的错误不好找，就将出现错误的前几行重敲一下

user: user-5
content: 没有错误，稍作修改  #include<stdio.h> int main() { 	int i, j, m; 	j = 0;//为什么在此初始化会显示错误   //没有错误 	int a[10]; 	for (i = 0; i<10; i++) 		scanf("%d", &a[i]); 	scanf("%d", &m); 	for (i = 0; i<10; i++) 	{ 		if (a[i] == m) 			j = j + 1; 	} 	printf("%d\n", j); 	return 0; }  代码功能是，统计数组中等于某值的元素个数
user-0 提问: 求助

回复:
user: user-0
content: 谢谢啦，嘿嘿

user: user-1
content: 两个都是返回的地址，第一个地址的存储被释放了，有地址找到地方了，可是没有东西了，第二个的没有释放，后面接着可以用

user: user-2
content: char str[]="123";   //等价于char str[4] = {'1', '2', '3', '\0'};   //位于栈区，函数调用结束，即失效 char *p1 = "123";  //字符串在常量区，常量区的内容直到程序结束才销毁
user-0 提问: 为什么创建链表不成功

回复:
user: user-1
content: 修改如下：  #include<stdio.h> #include<malloc.h> struct stu { 	int num; 	float score; 	struct stu *next; }; display(struct stu *head) { 	while (head != NULL) 	{ 		//printf("%d %f\n",tail->num,tail->score); 		//tail=tail->next; 		printf("%d %g\n", head->num, head->score); 		head = head->next; 	} 	return(0); } struct stu * creatLink() { 	int num; 	float score; 	struct stu *head = NULL, *tail = NULL; 	while (1) 	{ 		printf("intput num and score:"); 		scanf("%d%f", &num, &score); 		if (num>0) 		{ 			struct stu *p; 			p = (struct stu*)malloc(sizeof(struct stu)); 			p->num = num; 			p->score = score; 			p->next = NULL; 			if (head == NULL) 			{ 				head = p; 				tail = p; 			} 			else 			{ 				tail->next = p; 				tail = p; 			} 		} 		else    //这一句不可掉了 			break; 	} 	return(head); } int main() { 	struct stu *head; 	head = creatLink(); 	display(head);  	return 0; }  输入的num若小于0，则结束创建链表
user-0 提问: 菜鸟请教一个C语言的简单问题

回复:
user: user-0
content: 引用 楼主 ma815841356 的回复:请问运行如下代码，为什么结果不是输出1，2，3，4，5，6呢？  #include<stdio.h>  int main() {     int b[6]= {1,2,3,4,5,6},i;     for(i=0; i<t&&b[i]!=0; i++)         printf("%d\n",b[i]);      return 0; }  我太粗心了，庸人自扰啊

user: user-1
content: 修改如下：  #include<stdio.h> int main() { 	int b[6] = { 1,2,3,4,5,6 }, i; 	/* 	for (i = 0; i<t && b[i] != 0; i++)   //t是从哪里来的？ b[i]!=0  //无用 		printf("%d\n", b[i]);*/ 	for (i = 0; i<6; i++)  		printf("%d\n", b[i]); 	return 0; }
user-0 提问: 请教验证歌德巴赫猜想的算法优化问题

回复:
user: user-1
content: 这样可好：  char primes[10000]; int i, j, n; int main(void) { 	//先找出10000以内的所有素数 	memset(primes, '1', 10000); 	for (i = 2; i < 5000; i++) 		for (j = i*2; j < 10000; j+=i) 		primes[j] = '0'; 	while (1 == scanf("%d", &n)) 	{ 		j = n / 2; 		while ('0' == primes[j] || '0' == primes[n - j]) j--; 		printf("%d %d\n", j, n - j); 	} 	return 0; }

user: user-2
content: 事先求好素数表，运算时直接查表，这才是最快的做法。

user: user-0
content: 引用 2 楼 bravery36 的回复:事先求好素数表，运算时直接查表，这才是最快的做法。  恩恩

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:这样可好：  char primes[10000]; int i, j, n; int main(void) { 	//先找出10000以内的所有素数 	memset(primes, '1', 10000); 	for (i = 2; i < 5000; i++) 		for (j = i*2; j < 10000; j+=i) 		primes[j] = '0'; 	while (1 == scanf("%d", &n)) 	{ 		j = n / 2; 		while ('0' == primes[j] || '0' == primes[n - j]) j--; 		printf("%d %d\n", j, n - j); 	} 	return 0; }   谢谢提醒

user: user-3
content: 数据最多有多少组？

user: user-4
content: 这个题目明显歧视Java啊
user-0 提问: 遇见段错误怎么办

回复:
user: user-1
content: Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-2
content: FILE *fp=fopen("a.txt","r"); //没有判断文件打开是否成功 char buffer[4096]; fgets(buffer,sizeof(buffer),fp);  //这里没有给\0留空间, 很可能读取后, 没有\0结束. fprintf(fp,"%s",buffer);  //  前面打开是"r", 表明是只读取的, 写入肯定会失败.  并且可能由于前面没有\0结束导致访问越界.

user: user-3
content: 应该是没有问题，你再试试
user-0 提问: C语言字符数组简单问题错哪？能这样写吗

回复:
user: user-1
content: 不会报错，会输出不确定的值！

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？  其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: 刚进大一。。。定义【10】 确实只到【9】。

user: user-4
content: 越界了，你可以打印c看看

user: user-5
content: 既然是字符数组(不是字符串)，你就应该在for循环里面打印字符。 此外printf ("%c\n",c[10]);已经越界了，最大就c[9]
user-0 提问: 指针的转换问题吗

回复:
user: user-1
content: 一张图帮你明白数组与指针的关系： 一维数组与指针的关系；二维数组与指针的关系

user: user-2
content: int *ptr=(int *)(&a+1); //意思是把地址强制转换成int型吗？这里不太明白  紧紧抓住指针的类型这个问题，  指针的类型决定了指针能看多远。 对数组名取地址， 那么指针指针的类型就是数组指针，+1，表示跳过一个数组的空间。

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-4
content: &a+1 中&a的类型是 int (*)[5], 它带着维数， 跟int *不同，从地址来说就是&a+1相当于地址+1*5*4，而int *加1相当于地址+1*4

user: user-5
content: 引用 2 楼 zy_dream 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 关于&a的含义，请看 指针与数组 http://blog.csdn.net/zhangxiangdavaid/article/details/38085743 明白了&a之后，你就明白了ptr指向的位置， 至此，后面的输出你就清楚了 好像明白了一点 // //分析实验结果：0031FCEC与0031FCE4相差8，而sizeof(array)就是8 自己编程分析后 可以理解是 &a+1是直接指向数组地址最后吗？[/quote] 最后一个元素的下一个位置

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:关于&a的含义，请看 指针与数组 http://blog.csdn.net/zhangxiangdavaid/article/details/38085743 明白了&a之后，你就明白了ptr指向的位置， 至此，后面的输出你就清楚了 好像明白了一点 // //分析实验结果：0031FCEC与0031FCE4相差8，而sizeof(array)就是8 自己编程分析后 可以理解是 &a+1是直接指向数组地址最后吗？

user: user-5
content: 关于&a的含义，请看 指针与数组 http://blog.csdn.net/zhangxiangdavaid/article/details/38085743 明白了&a之后，你就明白了ptr指向的位置， 至此，后面的输出你就清楚了
user-0 提问: 求大侠改下程序，急，在线等

回复:
user: user-1
content: http://bbs.csdn.net/topics/391027497

user: user-2
content: 这么多代码要做什么

user: user-0
content: 词法分析！编译原理的

user: user-0
content: 那个程序不能用
user-0 提问: 【求助帖】用C语言编写：解N元一次方程（1

回复:
user: user-1
content: 这个百度一下啊，多得很

user: user-2
content: https://www.baidu.com/s?wd=N%E5%85%83%E4%B8%80%E6%AC%A1%E6%96%B9%E7%A8%8B%20C%E6%BA%90%E4%BB%A3%E7%A0%81&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_n=2&rsv_sug3=7&rsv_sug1=2&rsv_pq=d70bb57300026011&rsv_t=b842po30K1vFZRvZNPozznVSIakdaICBpikry7M2PgyRSvb59BpOhgDt7MjDjMdusVdd&inputT=16007&rsv_sug4=16007

user: user-3
content: 就是行列式解方程组了，找本线代的数对着敲吧
user-0 提问: 求大神指点程序，并运行检查程序；输入2.6 0.9

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

user: user-2
content: 功能是什么？
user-0 提问: CTRL + C不能终止子进程，这是为什么呢？

回复:
user: user-1
content: 因为你的父进程先于子进程结束， 子进程会转任init进程为父进程， 你打印出来的getppid的值应该是1，或者2.，   这个时候子进程默认和父进程信号屏蔽基本相同， init屏蔽了什么， 子进程也一样。 如果子进程先于父进程结束，就不会有问题。比如把exit 改成死循环。  Ps:  父子进程间的信号屏蔽问题描述不准确，忘记了， 你自己查一下资料看看。
user-0 提问: vc++

回复:
user: user-0
content: 谢谢赵4老师，代码调通了。还想问的就是运行成功，还需编写一个pl/0的代码文件，对这个文件进行运行吗？

user: user-1
content: 引用 5 楼 yjc_520 的回复:谢谢赵4老师，代码调通了。还想问的就是运行成功，还需编写一个pl/0的代码文件，对这个文件进行运行吗？ 不明觉厉

user: user-1
content: 楼主会全盘搜索指定名称的文件在哪个文件夹吗？ 注意： pl0 plO p10 p1O pIO pI0 以上六行各不相同。

user: user-0
content: 那个工程怎么弄，我就是创建的头文件，没有创建工程。那个文件是需要自己定义吗？就是没找到的文件pl0.h

user: user-2
content: 这个是楼主自己的头文件吗？ 我看像第三方的库，楼主把第三方的库头文件安装到VC的头文件目录下或者你的工程文件夹中，链接库放到VC目录下或者工程目录下

user: user-3
content: 没有找到头此文件
user-0 提问: 关于++运算符，哪一种方法是对的？

回复:
user: user-1
content: 引用 24 楼 u012578046 的回复:[quote=引用 23 楼 void998 的回复:] 原来的写法多好的，适合后期的代码维护。 有时候，不一定要追求所谓的“效率高”“代码段“ 比如我曾经看过一份代码中，很有印象的这样写来取数组的内容的（类似，变量名可能不一样）  int nValue = globleValueArray[++User[n++].getValue[++n].m]  当时我就跪了。。。哈哈，强大[/quote] 事实，没办法，有的人就是喜欢卖弄代码技巧，完全不考虑代码要给别人看，别人维护，坑。

user: user-2
content: 分开写

user: user-3
content: p[n] = p1[n]; n ++; 建议就这样写  要不就这样 i = 0; j = 0; p[i++] = p1[j++];

user: user-4
content: 两种都不对，与先前想要的结果不一样吧

user: user-5
content: 建议重载++，来验证一下顺序。

user: user-6
content: 引用 23 楼 void998 的回复:原来的写法多好的，适合后期的代码维护。 有时候，不一定要追求所谓的“效率高”“代码段“ 比如我曾经看过一份代码中，很有印象的这样写来取数组的内容的（类似，变量名可能不一样）  int nValue = globleValueArray[++User[n++].getValue[++n].m]  当时我就跪了。。。哈哈，强大

user: user-1
content: 原来的写法多好的，适合后期的代码维护。 有时候，不一定要追求所谓的“效率高”“代码段“ 比如我曾经看过一份代码中，很有印象的这样写来取数组的内容的（类似，变量名可能不一样）  int nValue = globleValueArray[++User[n++].getValue[++n].m]  当时我就跪了。。。

user: user-7
content: 编译器行为。结果是未定义的。。。不同的编译器结果不同。本来就不能这么写。。

user: user-8
content: 引用 17 楼 lin5161678 的回复:[quote=引用 16 楼 a30037338 的回复:] [quote=引用 15 楼 lin5161678 的回复:] 在线编译器 IDEONE.COM 见识了，   你应该早点把这种强有力的证据拿出来啊[/quote]因为 置顶帖是比这个主线编译器更有力的证据  [/quote]  置顶帖没啥价值，罗里八索，很简单的东西说得无比复杂，不值一喷。

user: user-9
content: 引用 16 楼 a30037338 的回复:[quote=引用 15 楼 lin5161678 的回复:] 在线编译器 IDEONE.COM 见识了，   你应该早点把这种强有力的证据拿出来啊[/quote]因为 置顶帖是比这个主线编译器更有力的证据

user: user-10
content: 引用 15 楼 lin5161678 的回复:在线编译器 IDEONE.COM 见识了，   你应该早点把这种强有力的证据拿出来啊

user: user-9
content: 引用 13 楼 a30037338 的回复:[quote=引用 12 楼 lin5161678 的回复:] 你见识少是你自己的问题  不是你误导别人的理由 在我没见过之前， 别人说的始终是别人说的， 你这是什么编译器， 我要自己试试。[/quote] 在线编译器 IDEONE.COM

user: user-11
content: 引用 楼主 mbctb 的回复:有如下代码： p[n] = p1[n]; n ++;  我想把两行并成一行，这样： p[n++] = p1[n];  或者： p[n] = p1[n++];  哪一种是对的？或者两种都不对？  抛开对错不谈，你为什么要合并？ 仅仅为了少一行代码吗？ 你这样做会给维护带来多大困难，你知道吗？尤其是别人来维护这段代码的时候。  很多时候，代码的可读性远远比代码性能重要。 PS：目前还没有遇到过因为强调可读性而导致性能下降，无法验收的情况！！！！切记切记

user: user-10
content: 引用 12 楼 lin5161678 的回复:你见识少是你自己的问题  不是你误导别人的理由 在我没见过之前， 别人说的始终是别人说的， 你这是什么编译器， 我要自己试试。

user: user-9
content: 引用 10 楼 a30037338 的回复:我看过， 我想说的是谁见过哪个操作系统中或者用什么编译器， 使 p[n++] = p1[n];    不等价于 p[n] = p1[n]; n ++; 反正我没见过 你见识少是你自己的问题  不是你误导别人的理由

user: user-12
content: http://bbs.csdn.net/topics/370153775

user: user-10
content: 引用 7 楼 lin5161678 的回复:你学学楼主去看看置顶帖再说 我看过， 我想说的是谁见过哪个操作系统中或者用什么编译器， 使 p[n++] = p1[n];    不等价于 p[n] = p1[n]; n ++; 反正我没见过

user: user-13
content: 分两行写  p[n] = p1[n]; n ++;

user: user-9
content: 引用 4 楼 Minikinfish 的回复:关于++，-- 标准C++定义为 1、在前，变量首先自增，然后再计算表达式 2、在后，首先计算表达式，然后变量自增  但是，有的编译器有bug，比如vc++6.0，无法计算出连续三个前++  例如 int a = ++n + ++n + ++n； 所以，论坛中有个赵四老师说过，尽量不要写自己都无法确定结果的表达式，该用()的加()不是编译器BUG 别信口雌黄

user: user-9
content: 引用 2 楼 a30037338 的回复:两种都可以实现你想要的结果。别误导楼主  你学学楼主去看看置顶帖再说
user-0 提问: n个不同大小的结构体应该用什么数据结构管理?

回复:
user: user-1
content: 异质链表 http://www.baigoogledu.com/s.php?hl=zh-CN&q=%D2%EC%B9%B9%C1%B4%B1%ED

user: user-0
content: 老师,能否再具体说明一下,谢谢.

user: user-2
content: 链表，存指针。
user-0 提问: 怎样把C语言数组中存放的四个十六进制数合并成一个十六进制数，并转换成十进制？

回复:
user: user-1
content: typdef union {     int addr;     char part[4]; } ip; ip ip1; ip1.part[0] = 0x01; ip1.part[1] = 0x02; ip1.part[2] = 0x03; ip1.part[3] = 0x04; printf("%d\n", ip.addr); 注意大小端。

user: user-2
content: 引用 5 楼 zhangxiangDavaid 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 楼上应转无符号，并乘256  #pragma warning(disable:4305 4309) #include <stdio.h> #include <string.h> char sDec[4] = {0x05,0xc5,0xb3,0xea}; //怎样把 0x05,0xc5,0xb3,0xea 组合成一个十六进制数 0x05c5b3ea ， //并且把 0x05c5b3ea  转换成十进制数。 unsigned int i,v; int main() {     v=0;     for (i=0;i<4;i++) v|=((unsigned int)sDec[3-i]&0xFFu)<<(i*8);     printf("0x%x,%u\n",v,v);     return 0; } //0x5c5b3ea,96842730 //  为什么要转无符号？[/quote] 因为char的取值范围通常为-128～127

user: user-3
content: char sDec[4] = {0x05,0xc5,0xb3,0xea}; unsigned char * s=(unsigned char *)sDec; int y =s[0]<<24 | s[1]<<16 | s[2]<<8 | s[3];

user: user-4
content: 直接强制转换试试啊   char sc[] = {0x05, 0xc5, 0xb3, 0xea}; int *a = (int *)sc; printf("0x%X %d\n", *a, *a);   是不是发现字节序不对？转一下字节序就ok了，可以自己写函数转字节序，也可以用现成的的nothl/htonl

user: user-5
content: char sDec[4] = {0x05,0xc5,0xb3,0xea};  低字节序的情况下.  并且 int  占用 32bit.   char sDec[4] = {0x05,0xc5,0xb3,0xea};  int val = 0; char *pBuf = (char*)&val; pBuf[0] = sDec[3]; pBuf[1] = sDec[2]; pBuf[2] = sDec[1]; pBuf[3] = sDec[0];  这时val==0x05c5b3ea;   如果是高字节序那就更简单了.  char sDec[4] = {0x05,0xc5,0xb3,0xea}; int val = *(int*)sDesc;

user: user-6
content: 引用 3 楼 zhao4zhong1 的回复:楼上应转无符号，并乘256  #pragma warning(disable:4305 4309) #include <stdio.h> #include <string.h> char sDec[4] = {0x05,0xc5,0xb3,0xea}; //怎样把 0x05,0xc5,0xb3,0xea 组合成一个十六进制数 0x05c5b3ea ， //并且把 0x05c5b3ea  转换成十进制数。 unsigned int i,v; int main() {     v=0;     for (i=0;i<4;i++) v|=((unsigned int)sDec[3-i]&0xFFu)<<(i*8);     printf("0x%x,%u\n",v,v);     return 0; } //0x5c5b3ea,96842730 //  为什么要转无符号？

user: user-2
content: 略改： #pragma warning(disable:4305 4309) #include <stdio.h> #include <string.h> char sDec[4] = {0x05,0xc5,0xb3,0xea}; //怎样把 0x05,0xc5,0xb3,0xea 组合成一个十六进制数 0x05c5b3ea ， //并且把 0x05c5b3ea  转换成十进制数。 unsigned int i,v; int main() {     v=0;     for (i=0;i<4;i++) v|=((unsigned int)sDec[3-i]&0xFFu)<<(i*8);     printf("0x%08x,%u\n",v,v);     return 0; } //0x05c5b3ea,96842730 //

user: user-2
content: 楼上应转无符号，并乘256  #pragma warning(disable:4305 4309) #include <stdio.h> #include <string.h> char sDec[4] = {0x05,0xc5,0xb3,0xea}; //怎样把 0x05,0xc5,0xb3,0xea 组合成一个十六进制数 0x05c5b3ea ， //并且把 0x05c5b3ea  转换成十进制数。 unsigned int i,v; int main() {     v=0;     for (i=0;i<4;i++) v|=((unsigned int)sDec[3-i]&0xFFu)<<(i*8);     printf("0x%x,%u\n",v,v);     return 0; } //0x5c5b3ea,96842730 //

user: user-6
content: /* char sDec[4] = {0x05,0xc5,0xb3,0xea}; 怎样把 0x05,0xc5,0xb3,0xea 组合成一个十六进制数 0x05c5b3ea ， 并且把 0x05c5b3ea  转换成十进制数。 */ int main(void) { 	char sDec[4] = { 0x05,0xc5,0xb3,0xea }; 	char *c = malloc(sizeof(int)); 	c[0] = sDec[3]; 	c[1] = sDec[2]; 	c[2] = sDec[1]; 	c[3] = sDec[0]; 	int *i= (int*)c; 	printf("i=%#x\n", *i); 	printf("i=%d\n", *i); 	return 0; } //i=0x5c5b3ea //i=96842730

user: user-7
content: char * psdec = sDec;  sDec[0]+sDec[1]*255+sDec[2]*255*255+sDec[3]*255*255*255
user-0 提问: srand函数应该放在main函数中 还是放在 调用rand()函数的子函数中呢？

回复:
user: user-1
content: 提醒楼主：rand()函数返回值在0～32676之间！ 如果需要扩大该范围，参考下面： #include <stdio.h> #include <stdlib.h> #include <time.h> unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } unsigned __int64 ullrand(void) {     return (      (((unsigned __int64)ulrand())<<32)     | ((unsigned __int64)ulrand())); } int i; unsigned long ul; unsigned __int64 ull; void main() {     srand(time(NULL));     for (i=0;i<10;i++) {         ul=ulrand();         printf("%010lu 0x%08x\n",ul,ul);     }     for (i=0;i<10;i++) {         ull=ullrand();         printf("%020I64u 0x%016I64x\n",ull,ull);     } } //3971076432 0xecb1d150 //2433428051 0x910b2a53 //1415415336 0x545d8628 //1312330759 0x4e389407 //1845758378 0x6e0409aa //0008069933 0x007b232d //4202720757 0xfa806df5 //2669855255 0x9f22c217 //0312068736 0x1299ca80 //2084555989 0x7c3fccd5 //03502077880857307931 0x3099e1472040ab1b //16884702393146816355 0xea52835e19b43763 //01877364819396611730 0x1a0dbd5b45f34e92 //07839440151924835771 0x6ccb4948756a05bb //09471412086917299176 0x8371371c820bfbe8 //04411255971577469925 0x3d37edef2f321be5 //13735846279546091130 0xbe9f876a65b7367a //04512980766520059820 0x3ea15418aa9927ac //15821377118299441610 0xdb90d2a9f1bb49ca //15512417228822200185 0xd7472d480398bf79

user: user-1
content: 引用 3 楼 zhangxiangDavaid 的回复:看到源码，似乎明白了些什么 知道看源码的重要性了吧。

user: user-0
content: 谢谢zhao4zhong1 虽然还是有疑惑 但至少知道怎么用了

user: user-2
content: 看到源码，似乎明白了些什么

user: user-1
content: 楼上胡扯！   放在main函数开始的地方调且只调一次！  C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

user: user-3
content: 里面也用得到，问题你只是在启动的时候srand了啊。如果性能允许，建议每次rand之前都srand一把
user-0 提问: STL 那种容器能够添加不同大小的结构体？

回复:
user: user-1
content: 引用 10 楼 yangyunzhao 的回复:[quote=引用 9 楼 ri_aje 的回复:] 容器里存储指针就行。  存指针不安全  最笨但是肯定可行的办法就是序列化为std::string存放。用的时候反序列化为对象  所以不是不能做，而是他想找个更好的方法[/quote] 变 string 只能更不安全。 万变不离其宗，搞来搞去都是怎么在内存中动态的放置对象，本质还是指针。

user: user-2
content: 引用 9 楼 ri_aje 的回复:容器里存储指针就行。  存指针不安全  最笨但是肯定可行的办法就是序列化为std::string存放。用的时候反序列化为对象  所以不是不能做，而是他想找个更好的方法

user: user-3
content: 将不同大小的结构体内容序列化成string 然后vector<string>

user: user-4
content: 引用 3 楼 guoyunfei1 的回复:vector <string> 是可以.  如果是结构体， 这个结构体里面有变长数组，好像就不行了。 例如： typedef  struct StruInfo StruData {      int count;      int array[]; }  然后给StruData赋值； 再添加到vector里； vector < StruData>  vecStruct: vecStruct.push_back( );  试了好像不行。  直接std::vector<int> array不行吗？  虽然很多人把c和c++混为一谈，但是两者之间还是有很多区别的。。。

user: user-5
content: 只能放指针了

user: user-1
content: 容器里存储指针就行。

user: user-6
content: 引用 3 楼 guoyunfei1 的回复:vector <string> 是可以.  如果是结构体， 这个结构体里面有变长数组，好像就不行了。 例如： typedef  struct StruInfo StruData {      int count;      int array[]; }  然后给StruData赋值； 再添加到vector里； vector < StruData>  vecStruct: vecStruct.push_back( ); 试了好像不行。 这里的int array[];是C程序员的一个技巧

user: user-7
content: 汗，你都stl了，vector了，你还用变长数组来搞毛？

user: user-0
content: vector <string> 是可以.  如果是结构体， 这个结构体里面有变长数组，好像就不行了。 例如： typedef  struct StruInfo StruData {      int count;      int array[]; }  然后给StruData赋值； 再添加到vector里； vector < StruData>  vecStruct: vecStruct.push_back( );  试了好像不行。

user: user-6
content: 引用 1 楼 yangyunzhao 的回复:std::vector<std::string>  你能说vector里面的string全部一样大吗？ 当然一样大！楼主想要的应该是tuple

user: user-2
content: std::vector<std::string>  你能说vector里面的string全部一样大吗？
user-0 提问: 运行结果出现一个提示：出现了一个问题，导致程序停止正常工作，请关闭该程序。

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: LZMA算法

回复:
user: user-1
content: 什么意思呢？  求楼主解答，正在做这块

user: user-2
content: 引用 4 楼 wlcshh 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 2 楼 wlcshh 的回复:] 我怀疑直接是作者故意，其他地方都很详细，就这里不详细， 特别是这里：0     1    lc, lp and pb in encoded form.一个字节怎么就能表示三个参数的编码形式， 而这里说的编码形式其他地方未见说明 比如lc占3位，lp占3位，pb占2位，共8位。[/quote] 问题已解决，但不是你说的这个了，不过还是谢谢[/quote] 无意间暴露了我靠瞎猜骗分的脆弱内心！

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 wlcshh 的回复:] 我怀疑直接是作者故意，其他地方都很详细，就这里不详细， 特别是这里：0     1    lc, lp and pb in encoded form.一个字节怎么就能表示三个参数的编码形式， 而这里说的编码形式其他地方未见说明 比如lc占3位，lp占3位，pb占2位，共8位。[/quote] 问题已解决，但不是你说的这个了，不过还是谢谢

user: user-2
content: 引用 2 楼 wlcshh 的回复:我怀疑直接是作者故意，其他地方都很详细，就这里不详细， 特别是这里：0     1    lc, lp and pb in encoded form.一个字节怎么就能表示三个参数的编码形式， 而这里说的编码形式其他地方未见说明 比如lc占3位，lp占3位，pb占2位，共8位。

user: user-0
content: 我怀疑直接是作者故意，其他地方都很详细，就这里不详细， 特别是这里：0     1    lc, lp and pb in encoded form.一个字节怎么就能表示三个参数的编码形式， 而这里说的编码形式其他地方未见说明

user: user-0
content: outPropsSize -      In:  the pointer to the size of outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5.      Out: the pointer to the size of written properties in outProps buffer; *outPropsSize = LZMA_PROPS_SIZE = 5.    LZMA Encoder will use defult values for any parameter, if it is   -1  for any from: level, loc, lp, pb, fb, numThreads    0  for dictSize
user-0 提问: 各位大牛好，请教5000万并发的服务器配置

回复:
user: user-0
content: 谢谢楼上各大牛的指导！ 目前项目有了些业务需求上的变动，变动后对数据中心的要求降低了不少，在可控范围内。  再次感谢楼上各位大牛的指教，谢谢了！祝好！

user: user-1
content: 看你具体需求

user: user-2
content: 其实吧，一朵云，全搞定。

user: user-2
content: 传输的数据如果要保存的话，硬盘柜是跑不掉了，做成阵列，速度是没问题，不过一定要用数据库。 服务器区的光纤也跑不掉了。 ms我觉得有点悬（PS.牛人能用起来我也没什么好说的），用开源的或者针对业务定制吧，前后台分开，后台SAN分流，前台IP分流。  大伙觉得我这设想怎么样

user: user-0
content: 谢谢“xxyj6450 ”的建议！ 一个人我是没这能力，水都搅不浑。  这些预算我感觉并不算多（没实际接触硬件商），国内几个区域的机房建设、中心机房的建设，关硬件就得花不少，还有网络、软件服务商等等，省着点用，希望够用就好。  网络架构方面，有点思路，但还有些细节不确定，到时候具体问题具体请教，呵呵。 如果实在不行，只能请团队了。  谢谢大家了！下周回来结贴。

user: user-3
content: 别去想你一个人 弄几台服务器就能搞定

user: user-3
content: 有700万预算 花200W请专业的团队来做 其余的建设硬件

user: user-4
content: 总站，一级基站，二级基站，三级基站....  我瞎扯的，别听我的... 楼主最后把自己的做法贴出来哈

user: user-0
content: 引用 7 楼 hutliu 的回复:这个后台不用负载均衡和服务器集群很难实现。即便用固态硬盘，单台服务器一般每秒也处理不了这么多的并发io。  谢谢您的指教！  单台服务器肯定不行，肯定要用多台服务器，我想把全国分为几个区，然后每台服务器负责一个区的数据接入。

user: user-5
content: 我自己在亚马逊的ec2实测写入速度有160MB/s，网络超过1.2Gb/s，所以理论上是有可能的。不过lz的数据比较奇怪，非语音还这么大数据量，感觉太多了。

user: user-6
content: 关键什么样的专线才能保证70MB/s的真实流量7×24小时不中断不超时呢？直接拉光纤？

user: user-7
content: 这个后台不用负载均衡和服务器集群很难实现。即便用固态硬盘，单台服务器一般每秒也处理不了这么多的并发io。

user: user-8
content: 这么大的数据，围观一下，不知道有没有解决方案

user: user-0
content: 谢谢“dooX8086”大牛指导！深感受益！

user: user-9
content: 楼主的服务器需要处理  70M/秒 数据. 但真的是要 70M/秒 的数据落地。。。。。。。。 70M x 60s x 60m x 24h x 365d = ......这个就是真的天文数字   我的大规模并发处理经验一般 实施和接触过的方案大体都是可分为三部份。 数据服   逻辑服   网关服(平衡负载), 这样的分布式可横向扩展的方案 io 压力大就添加 数据服 逻辑cpu 过高，就添加 逻辑服 ....  楼主可到 霸爷 云风 他们的 blog上翻一翻.或是 email 他们问问 ...

user: user-0
content: 引用 12 楼 user-10 的回复:[quote=引用 11 楼 tonforce 的回复:] [quote=引用 8 楼 zhao4zhong1 的回复:] 关键什么样的专线才能保证70MB/s的真实流量7×24小时不中断不超时呢？直接拉光纤？  赵老师，谢谢！ 直接拉光纤，那成本天文数字了。。。[/quote] 你们的成本是多少呢？[/quote]  预算在700万内。

user: user-10
content: 引用 11 楼 tonforce 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 关键什么样的专线才能保证70MB/s的真实流量7×24小时不中断不超时呢？直接拉光纤？  赵老师，谢谢！ 直接拉光纤，那成本天文数字了。。。[/quote] 你们的成本是多少呢？

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:关键什么样的专线才能保证70MB/s的真实流量7×24小时不中断不超时呢？直接拉光纤？  赵老师，谢谢！ 直接拉光纤，那成本天文数字了。。。

user: user-6
content: 引用 2 楼 tonforce 的回复:谢谢赵老师的指导！ 赵老师的意思是这在逻辑上就不通？  [quote=引用 1 楼 zhao4zhong1 的回复:] “5万台终端发送的数据，其中有1000台终端是每秒发送20次数据，剩下的终端每秒发送1次数据，每次发送的数据大小均为1K左右” (1000*20+(50000-1000)*1)*1024字节/秒＝70656000字节/秒≈71MB/秒 参考：机械硬盘的传输速率≈50MB/秒[/quote] 如果你需要将数据保存到机械硬盘上的话。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:楼主帖子标题是5000万 帖子内容是5万  赵老师，这是我的失误，谢谢你的提醒！是5万台设备，不是5000万。 表示歉意！  改不过来了。
user-0 提问: UDP 服务端程序，在ARM和PC上表现结果不一样，咋回事？

回复:
user: user-0
content: 换了块板子  就OK了  估计是内核版本问题导致的，，，，

user: user-1
content: 及tcpdump

user: user-2
content: 建议楼主先学会使用抓包软件比如wireshark
user-0 提问: 帮我看看这代码什么问题，题目是利用KMP算法搜索一个TXT文档里的数据

回复:
user: user-0
content: 在线着急等！！！

user: user-1
content: 什么问题？

user: user-2
content: 测试驱动

user: user-3
content: 你要说明你的算法出了什么问题, 或者报了什么错才行,   其他人才好帮助你.  1. 调试看文件读取完成后, 文件内容是否都读取到. 2. 确认你的KMP算法工作正常, 即写一段代码来验证你的KMP能正常的匹配串.
user-0 提问: 这种情况是什么原因造成的

回复:
user: user-1
content: 看着颜色像是ubuntu， 这里的原因是“宏中遇到#或##时就不会再展开宏中嵌套的宏了”。 就这么一规则，不要想太多，知道即可。

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:宏展开时： 如果宏定义以#开头，不展开参数，直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"； 如果宏定义不以#开头，展开参数，直接替换，由外层向里层，如果碰到的是#开头的宏，不继续往里层展开，往外层展开。 由外层向里层，如果碰到的是以非#开头的宏，继续往里层走，直至最里层，开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。    理解赵老师的意思  从外往里逐一看每个宏，直到当前的是#开头的，开始返回往外展开。 嵌套的宏定义不算#开头 exp：g(a)是#开头，而h(a)不是

user: user-3
content: #与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         return 0; } 宏展开时： 如果宏定义以#开头，不展开参数，直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"； 如果宏定义不以#开头，展开参数，直接替换，由外层向里层，如果碰到的是#开头的宏，不继续往里层展开，往外层展开。 由外层向里层，如果碰到的是以非#开头的宏，继续往里层走，直至最里层，开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS： ##在宏中定义，是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现，是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         char a = 'a';         cout<<g(a)<<endl; // a         cout<<g(g(a))<<endl; // a         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         printf("%s\n", g(h(f(1,2)))); // h(f(1,2))         printf("%s\n", h(g(f(1,2)))); // "f(1,2)"         printf("%s\n", h(h(f(1,2)))); // "12"         system("pause");         return 0; } 预处理后的：（在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E） int main() {         char a = 'a';         cout<<"a"<<endl;         cout<<"g(a)"<<endl;         printf("%s\n", "12");         printf("%s\n", "f(1,2)");         printf("%s\n", "h(f(1,2))");         printf("%s\n", "\"f(1,2)\"");         printf("%s\n", "\"12\"");         system("pause");         return 0; } --------------------------------------------------- 宏解析 1.       ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号，它不能出现于宏替代表的开端和末尾。 例： #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2.       重新扫描和替换 在替换列表中的所有参数替换过之后，预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时，就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换（防止递归）。 例： #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC

user: user-4
content: 我再加两个，好好感受一下：  printf("%s\n", h(g(f(1, 2)))); printf("%s\n", g(f(g(1), g(2))));
user-0 提问: 关于汽车倒车雷达——超声波测距的问题

回复:
user: user-1
content: 这个涉及的面应该在：嵌入式开发，APP开发！

user: user-2
content: https://www.baidu.com/s?wd=%E8%B6%85%E5%A3%B0%E6%B3%A2%E6%B5%8B%E8%B7%9D%20%E9%9A%9C%E7%A2%8D%E7%89%A9%E5%9B%BE%E5%BD%A2%20AT89C52%E5%8D%95%E7%89%87%E6%9C%BA%20%E6%89%8B%E6%9C%BA%E6%98%BE%E7%A4%BA%E5%9B%BE%E5%BD%A2&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_n=2&rsv_sug3=11&rsv_pq=e8c91a180000cedd&rsv_t=2bddWGDif5xa3BWKc7tv%2Fl8njD5k3gOgFvizqljqaiCQuz8LJwtwM0sb%2BgTtT2vAJ7f0&inputT=29847&rsv_sug4=29847
user-0 提问: 自定义函数与系统函数同名不报错，为什么？

回复:
user: user-1
content: 引用 11 楼 a3192048 的回复:double fabs(double x)    //绝对值函数，这个函数与math.h中的fabs函数同名 {     if(x >= 0.0)         return x;     else         return -x; } 修改为： int fabs(double x)    //绝对值函数，这个函数与math.h中的fabs函数同名 {     if(x >= 0.0)         return x;     else         return -x; } 你用C编译器就会编译报错了。 用户可以重新定义标准库函数，若重新定义，该函数将失去原有含义。 但定义必须和math.h中声明保持一致。

user: user-1
content: double fabs(double x)    //绝对值函数，这个函数与math.h中的fabs函数同名 {     if(x >= 0.0)         return x;     else         return -x; } 修改为： int fabs(double x)    //绝对值函数，这个函数与math.h中的fabs函数同名 {     if(x >= 0.0)         return x;     else         return -x; } 你用C编译器就会编译报错了。

user: user-2
content: 函数库的基本原则，用户函数优先。

user: user-3
content: 函数sqrt和fabs跟函数main在同一个模块，在链接阶段，会优先选择同一个模块内的符号，sqrt和fabs会当作是指令段（.text）中的已定义的全局符号，相当于是静态链接这些函数名。#include <math.h>不会起作用。 模块中不定义sqrt和fabs时，sqrt会作为未定义的全局符号，在执行阶段被动态链接到模块中，#include <math.h>就起到了声明作用。

user: user-4
content: 我忘了是在哪儿看到了，只是记得有这么回事，现在用度娘找到下面的网址，你可以看一下答案和解析： http://www.ppkao.com/shiti/38173/

user: user-0
content: 引用系统允许用户重新定义标准库函数，但此时该函数将失去原有含义。  To Turntogo: 讲得有道理，请问有出处吗？

user: user-4
content: 用户调用标准库函数前不必重新定义，而只需使用预编译命令将该函数所在文件包括到用户源文件中即可。而且，系统允许用户重新定义标准库函数，但此时该函数将失去原有含义。

user: user-4
content: 记得C语言有一个规定，就是允许用户自己编写与库函数同名的函数。

user: user-0
content: to Saleayas:  //  test.c #include<stdio.h> #include<math.h>  /* double fabs(double x)	//绝对值函数，这个函数与math.h中的fabs函数同名 { 	if(x >= 0.0) 		return x; 	else 		return -x; } */  double sqrt(double x)	//开平方函数，这个函数与math.h中的sqrt函数同名 { 	double x1, x2; 	x1 = x/2.0; 	x2 = (x1 + x/x1)/2.0; 	while(fabs(x2-x1)>1e-6) 	{ 		x1 = x2; 		x2 = (x1 + x/x1)/2.0; 	} 	return x1; }  int main() { 	double x = 3.0; 	printf("%.6lf\n", sqrt(x)); 	return 0; }   仍然能成功运行。也就是fabs函数来自math库，sqrt来自自定义函数，怎么就不冲突呢？   to mymtom: 有点感觉，但不太理解。   to focuslight: 函数原型是相同的，这一次的程序也修改了参数。 C语言有名字空间吗？

user: user-5
content: 这要看链接是导入那个库。 你试试关掉一个函数试试。

user: user-6
content: math.h 里只是声明了fabs和sqrt函数，函数实现可以是数学库里的代码，也可以自己实现。

user: user-7
content: 参数不同,   或者在不同名字空间下
user-0 提问: 求教~为什么变量重复定义vc报错而有的编译器不报错

回复:
user: user-0
content: 谢谢，谢谢，大概明白了

user: user-1
content: VC6报错是因为， VC6中的语法不支持在for中声明变量，而应该这样  int i;   //先声明，再使用 for(i=1;;);   建议在C中遵守上述语法，而在C++都可以。

user: user-2
content: VC6的错，用VS2013吧

user: user-3
content: 凡是人造的东西都有缺陷，编译器也是人编的。

user: user-4
content: vc++6.0出错-error C2086: 'a' : redefinition  这个重定义，应该可以看出来，将a当成了函数的局部变量。 以前我用过一个编译器，对于c语言，在函数中的所有局部变量，都要在开始出全部声明/定义好，在中间就出错。 这个是编译器问题，推荐用gcc吧，可以对编译选项有个比较透彻的理解和使用。

user: user-5
content: 引用 4 楼 mymtom 的回复:vc++6.0对C++的支持有限  支持  对于表达式int a = ++n + ++n + ++n，vc6.0就计算错误。

user: user-6
content: vc++6.0对C++的支持有限

user: user-7
content: 各个编译器默认的标准不一样，gnu好像不支持这种语法，c99标准就可以

user: user-8
content: 引用 5 楼 Minikinfish 的回复:[quote=引用 4 楼 mymtom 的回复:] vc++6.0对C++的支持有限  支持  对于表达式int a = ++n + ++n + ++n，vc6.0就计算错误。[/quote]  支持一半  int a = ++n + ++n + ++n 这个不应该算编译器的bug，应该算程序员的bug

user: user-9
content: 它报错你就不那样写就行了嘛。。。纠结这个没什么用

user: user-10
content: VC6的bug
user-0 提问: C语言编程

回复:
user: user-1
content: 重心法解模糊 C语言 http://www.baigoogledu.com/s.php?hl=zh-CN&q=%D6%D8%D0%C4%B7%A8%BD%E2%C4%A3%BA%FD+C%D3%EF%D1%D4

user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 重心法解模糊 C语言 http://www.baigoogledu.com/s.php?hl=zh-CN&q=%D6%D8%D0%C4%B7%A8%BD%E2%C4%A3%BA%FD+C%D3%EF%D1%D4 欢迎现学现卖！[/quote] 大牛，可不要嘲笑晚辈啊

user: user-2
content: 引用 1 楼 zhangxiangDavaid 的回复:重心法解模糊 C语言 http://www.baigoogledu.com/s.php?hl=zh-CN&q=%D6%D8%D0%C4%B7%A8%BD%E2%C4%A3%BA%FD+C%D3%EF%D1%D4 欢迎现学现卖！
user-0 提问: C语言库里有数据结构的算法吗

回复:
user: user-1
content: 基本没有，C语言要用比较复杂的数据结构，比如链表什么的一般是自己写的逻辑。 当然可以从网上找一些比较成熟的源代码来用。

user: user-2
content: C++里有STL

user: user-3
content: 标准C中个两个算法:bsearch与qsort

user: user-4
content: 数据结构的算法? 算法是算法，数据结构是数据结构，这两个不一样的。 不过无论你要什么c里面都没有的。  不过c++里的STL库提供的一些数据结构，比如队列，栈，链表，红黑二叉树什么的，你搜搜STL就知道了。

user: user-5
content: 有两个，但是不常用，建议使用C++的STL

user: user-6
content: 引用 2 楼 mewiteor 的回复:标准C中个两个算法:bsearch与qsort 英雄所见略同
user-0 提问: 这段代码运行时为什么出问题？？

回复:
user: user-1
content: 虽然定义了指针，但是这个指针没有指向某个特定的地址，因此赋值是会出错的

user: user-2
content: 指针不分配内存就用，厉害啊

user: user-3
content: 先把指针 malloc 一下，就好了

user: user-4
content: 老总说，给你一个团队，你干吧，...... 你就是那个a,那个团队呢？

user: user-5
content: a指针 是所谓的 野指针，也就是说a指向的地方是没有预告分配的  你可以为a分配一片内存，如 int* a = new int[10]; 也可以让a等于某个分配好的内存地址，如int b[10]; int *a = b;

user: user-6
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-7
content: 打个比方说，你朝着一大堆人扔了一块石头，你还在问，为什么有人受伤了？ 其实，有人受伤了是必然的，没有人受伤的机率是非常小的的。 就像你的这个问题，典型的野指针的问题，出问题是必然的，不出问题的机率是非常小的。

user: user-8
content: 修改如下：  #include <stdio.h> #include <stdlib.h> int main(void) { 	int *a = malloc(sizeof(int)*3);  //为a分配空间(让a指向一片可用的内存) 	int i; 	for (i = 0; i<3; i++) 	{ 		*(a + i) = i; 	} 	for (i = 0; i<3; i++) 	{ 		printf("%d\n", a[i]); 	} 	free(a);   //释放内存 	return 0; } //0 //1 //2

user: user-9
content: 有个野指针啊

user: user-10
content: 指针变量a没有赋值，没有指向一个具体的地址，所以*(a+i)就无法寻址到一个具体储存单元，所以*(a+i)=i错误

user: user-11
content: 我再补充一下，例如这样就可以，我把你的程序改了一点 #include <stdio.h> #include <stdlib.h> int main(void)  { 	int b[3]; 	int *a; 	int i; 	a=b; 	for(i=0;i<3;i++) 	{ 		*(a+i)=i; 	} 	for(i=0;i<3;i++) 	{ 		printf("%d\n",*(a+i)); 	} 	return 0; }

user: user-11
content: 指针变量的赋值错误，*a是a所指向的变量，因为a在定义时并无确定的值，所以*a的值也是不确定的，在运行程序时会出现不可知的错误

user: user-0
content: 我自问后感觉。。。a是一个int型的指针变量呀。

user: user-12
content: 很明显是指针未定义 你自问一下，代码中的 a 是什么？它又代表了什么？
user-0 提问: 简单编程

回复:
user: user-1
content: int main(void) { 	int s, n; 	s = 0; 	n = 0; 	while (s <= 100) 	{ 		n += 1; 		s += n; 	} 	s -= n; 	n--; 	printf("n=%d,s=%d\n", n, s);  //n=13,s=91 	return 0; }
user-0 提问: 如何避免野指针

回复:
user: user-1
content: 判断指针是否有效  http://blog.csdn.net/qq_34453988/article/details/50997112

user: user-2
content: 1、定义的时候就立即赋值 2、不需要的时候，立即置空=NULL 3、尽量压缩生命周期，可以利用do while(0)等屏蔽后面不需要的变量

user: user-3
content: 这是都是简单的编码问题，提高下编码的认真度，可以省掉很多这样的冗余代码。

user: user-4
content: 指针初始化 p = NULL; 用完之后 p = NULL;  指针用之前需测试其有效性，如： if(p != NULL) {   //... }

user: user-5
content: 一般fclose后，此文件已经不再使用。用户有责任维护自己代码的安全性。置空与否，看其他地方是否重复使用，识情况而定！

user: user-6
content: fclose(f);    //之后，f的值仍是原值，没有清零。故， f=NULL; 若再次使用f，编译器就会提示错误。

user: user-7
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-7
content: 如何避免寄信时被“查无此人”退回？

user: user-8
content: 用智能指针。
user-0 提问: Win32，非模态对话框创建问题

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390374955  我看过MSDN，但是我遇到的问题，无法用MSDN上的实例解决，您帮我看看，谢谢。 我现在需要直接加载RC资源中的对话框，因此 custommessage.commonvariables.hMainWnd = CreateDialog(custommessage.commonvariables.hInst, MAKEINTRESOURCE(IDD_DIALOG_WNDPROC), 0, (DLGPROC)WndProc);  在回掉函数WndProc中，点击高级搜索后弹出搜索的对话框， case IDB_WNDPROC_SEARCHALLDLGDOWN:                 {                     custommessage.commonvariables.hSearchWnd = CreateDialog(custommessage.commonvariables.hInst, MAKEINTRESOURCE(IDD_DIALOG_ALLSEARCH), 0, (DLGPROC)AllsearchProc);  // hWnd也不成                     ShowWindow(custommessage.commonvariables.hSearchWnd, SW_SHOW);                 }                 break;  其中AllsearchProc与WndProc所对应的两个对话框不是父子关系，而是同等关系。但是点击AllsearchProc中的关闭按钮、移动、点击搜索按钮 case IDB_SEARCH_ALLSEARCH:                 {                     DestroyWindow(hWnd);                     hWnd = NULL;                 }                 break;  都不响应消息。 而且我也用WM_SYSCOMMAND来实现关闭操作，仍然没反应。  case WM_SYSCOMMAND:         {             if(wParam == SC_CLOSE)             {                 DestroyWindow(hWnd);                 hWnd = NULL;             }         }         break;  不知道为什么.

user: user-0
content: 引用 2 楼 Minikinfish 的回复:Windows程序很简单，就几点内容 1、窗口需要注册， 2、注册需要proc 3、proc需要循环泵的支持 4、大量窗口的api 5、SetWindowLong  WGL_DLGPROC 可以对窗体任意修改  这个我知道，我现在需要直接加载RC资源中的对话框，因此 custommessage.commonvariables.hMainWnd = CreateDialog(custommessage.commonvariables.hInst, MAKEINTRESOURCE(IDD_DIALOG_WNDPROC), 0, (DLGPROC)WndProc);  在回掉函数WndProc中，点击高级搜索后弹出搜索的对话框， case IDB_WNDPROC_SEARCHALLDLGDOWN:                 {                     custommessage.commonvariables.hSearchWnd = CreateDialog(custommessage.commonvariables.hInst, MAKEINTRESOURCE(IDD_DIALOG_ALLSEARCH), 0, (DLGPROC)AllsearchProc);  // hWnd也不成                     ShowWindow(custommessage.commonvariables.hSearchWnd, SW_SHOW);                 }                 break;  其中AllsearchProc与WndProc所对应的两个对话框不是父子关系，而是同等关系。但是点击AllsearchProc中的关闭按钮、移动、点击搜索按钮 case IDB_SEARCH_ALLSEARCH:                 {                     DestroyWindow(hWnd);                     hWnd = NULL;                 }                 break;  都不响应消息。 而且我也用WM_SYSCOMMAND来实现关闭操作，仍然没反应。  case WM_SYSCOMMAND:         {             if(wParam == SC_CLOSE)             {                 DestroyWindow(hWnd);                 hWnd = NULL;             }         }         break;  不知道为什么.

user: user-1
content: Windows程序很简单，就几点内容 1、窗口需要注册， 2、注册需要proc 3、proc需要循环泵的支持 4、大量窗口的api 5、SetWindowLong  WGL_DLGPROC 可以对窗体任意修改

user: user-2
content: http://bbs.csdn.net/topics/390374955
user-0 提问: 第二维已知的二维结构体数组内存问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:sizeof(XX*)明显就不对 我觉得应该是8就行吧，能正确打印结果。 那应该改成什么呢？

user: user-1
content: sizeof(XX*)明显就不对
user-0 提问: C 的(++j)+(++j) 为什么和php的结果不一样，j=1

回复:
user: user-1
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 9 楼 mymtom 的回复:] Undefined behavior 实在没有讨论的必要 闲来无事可以拿来练练嘴皮子。[/quote] 表情贴错了。

user: user-1
content: 引用 9 楼 mymtom 的回复:Undefined behavior 实在没有讨论的必要 闲来无事可以拿来练练嘴皮子。

user: user-2
content: Undefined behavior 实在没有讨论的必要

user: user-3
content: 为什么要和php的一样？php一个脚本语言，能和C++比？

user: user-1
content: http://bbs.csdn.net/topics/370153775

user: user-4
content: 考察表达式的值  	int i; 	int j = 1;  mov         dword ptr [ebp-14h],1   	i = (++j) + (++j);  mov         eax,dword ptr [ebp-14h]    add         eax,1    mov         dword ptr [ebp-14h],eax    mov         ecx,dword ptr [ebp-14h]    add         ecx,1    mov         dword ptr [ebp-14h],ecx    mov         edx,dword ptr [ebp-14h]    add         edx,dword ptr [ebp-14h]    mov         dword ptr [ebp-8],edx    这之后显然 i=6; 这是vs下的汇编，其它编译器，效果很可能不一样

user: user-5
content: 引用 3 楼 zoen210 的回复:[quote=引用 1 楼 user-6 的回复:] 我可以发表一下自己的看法吗！？c中的答案应该是3  而php中应该是4  编译器的默认不同！我也是新手！回答不好的地方请谅解 c 答案是 6， php是5[/quote]C中这个表达式是错误的  具体可以参加置顶帖

user: user-4
content: 这是vs的debug模式下的汇编代码：  	int j = 1;  mov         dword ptr [ebp-8],1   	(++j) + (++j);  mov         eax,dword ptr [ebp-8]    add         eax,1    mov         dword ptr [ebp-8],eax    mov         ecx,dword ptr [ebp-8]    add         ecx,1    mov         dword ptr [ebp-8],ecx    显然，之后j=3;

user: user-0
content: 引用 1 楼 user-6 的回复:我可以发表一下自己的看法吗！？c中的答案应该是3  而php中应该是4  编译器的默认不同！我也是新手！回答不好的地方请谅解 c 答案是 6， php是5

user: user-6
content: 你这最后输出问的是j的值吧

user: user-6
content: 我可以发表一下自己的看法吗！？c中的答案应该是3  而php中应该是4  编译器的默认不同！我也是新手！回答不好的地方请谅解
user-0 提问: 请教C语言一个问题

回复:
user: user-1
content: 引用 2 楼 ma815841356 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 没见题目中说数据肯定是正整数，也没见题目中说数据中没有小数。  你好，这道题目侧重点不是在数据类型上，刚刚受人点拨，原来按题目要求我还应该考虑长方体里面的切面，不能只单单考虑外面的切面，不过仍要感谢你的回复[/quote] 原来如此！

user: user-1
content: 引用 2 楼 ma815841356 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 没见题目中说数据肯定是正整数，也没见题目中说数据中没有小数。  你好，这道题目侧重点不是在数据类型上，刚刚受人点拨，原来按题目要求我还应该考虑长方体里面的切面，不能只单单考虑外面的切面，不过仍要感谢你的回复[/quote] 原来如此！

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:没见题目中说数据肯定是正整数，也没见题目中说数据中没有小数。  你好，这道题目侧重点不是在数据类型上，刚刚受人点拨，原来按题目要求我还应该考虑长方体里面的切面，不能只单单考虑外面的切面，不过仍要感谢你的回复

user: user-1
content: 没见题目中说数据肯定是正整数，也没见题目中说数据中没有小数。
user-0 提问: 请问各位大神如何知道c语言编译器如CodeC:Blocks运行一个程序时所用的时间和内存呢？

回复:
user: user-1
content: 引用 5 楼 ma815841356 的回复:[quote=引用 3 楼 zhangxiangDavaid 的回复:] 运行时间可编写代码获得，内存的使用情况可使用工具，如VMMap  你好，我用的是CodeC:Blocks，每次程序运行完后都有在结尾显示运行时间，大致与你给的代码时间一致，但我提交代码到OJ后它显示的时间却跟我的不一样，而且相差很大，请问有没有办法在本地运行C语言程序时就知道代码提交到OJ后的时间？[/quote] 这个运行时间，跟系统有很大关系，只能用我给的代码大概测算下。

user: user-2
content: 那说明你还有改进的空间

user: user-0
content: 引用 3 楼 zhangxiangDavaid 的回复:运行时间可编写代码获得，内存的使用情况可使用工具，如VMMap  你好，我用的是CodeC:Blocks，每次程序运行完后都有在结尾显示运行时间，大致与你给的代码时间一致，但我提交代码到OJ后它显示的时间却跟我的不一样，而且相差很大，请问有没有办法在本地运行C语言程序时就知道代码提交到OJ后的时间？

user: user-1
content: 可用以下代码获得程序运行的毫秒数：  #include <time.h> #include <windows.h> int main(void) { 	clock_t t1, t2; 	t1 = clock(); 	//do some work 	Sleep(2000); 	t2 = clock(); 	printf("%dms\n", t2 - t1); 	return 0; }

user: user-1
content: 运行时间可编写代码获得，内存的使用情况可使用工具，如VMMap

user: user-3
content: VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-3
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！
user-0 提问: c中格式输出的问题

回复:
user: user-1
content: 这里的#是起到打印前缀0或者0x的作用，这里用的是8进制，所以会打印前缀0

user: user-2
content: 引用 1 楼 zhangxiangDavaid 的回复:你在什么环境下打印的？我的输入和你不一样 输出

user: user-2
content: 你在什么环境下打印的？我的输入和你不一样

user: user-0
content: 在vc++6.0里运行的。3楼正解。谢谢！
user-0 提问: 数字拼接

回复:
user: user-1
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-2
content: 引用 7 楼 qq_20242109 的回复:[quote=引用 6 楼 zhangxiangDavaid 的回复:] 0-1是表达式，还是字符串“0-1”? 拼成一个字符串的[/quote] 这样行吗？  int main(void) { 	int arr[] = { 1,2,3,4 }; 	char str[40]; 	sprintf(str, "%d-%d,%d-%d", arr[0], arr[1], arr[2], arr[3]); 	puts(str);   //1-2,3-4 	return 0; }

user: user-0
content: 引用 6 楼 zhangxiangDavaid 的回复:0-1是表达式，还是字符串“0-1”? 拼成一个字符串的

user: user-2
content: 0-1是表达式，还是字符串“0-1”?

user: user-0
content: 引用 3 楼 user-3 的回复:[quote=引用 2 楼 qq_20242109 的回复:] [quote=引用 1 楼 user-3 的回复:] 用 [s[n]]printf 函数 还有其它实现的方法吗，我要把它放到一个数组里[/quote] 什么数组？   {"0-1", "2-3"} 和{0-1, 2-3} 是完全两样的[/quote]  int arr[] = {0,1,2,3} 转换为   引用 4 楼 zhangxiangDavaid 的回复:这样行吗？ printf("%d-%d,%d-%d\n", 0,1,2,3); 哈哈 这个我清楚，如果不使用printf函数,讨论下算法的实现

user: user-2
content: 这样行吗？ printf("%d-%d,%d-%d\n", 0,1,2,3); 哈哈

user: user-3
content: 引用 2 楼 qq_20242109 的回复:[quote=引用 1 楼 user-3 的回复:] 用 [s[n]]printf 函数 还有其它实现的方法吗，我要把它放到一个数组里[/quote] 什么数组？   {"0-1", "2-3"} 和{0-1, 2-3} 是完全两样的

user: user-0
content: 引用 1 楼 user-3 的回复:用 [s[n]]printf 函数 还有其它实现的方法吗，我要把它放到一个数组里

user: user-3
content: 用 [s[n]]printf 函数
user-0 提问: 结构体初步，我应该是后面算走过的总路程错了

回复:
user: user-1
content: 2个问题  1） scanf("%f %f",&p[i].x,&p[i].y);  要么把xy的定义为float，或者把%f改为%d 2） for(i=1;i<num+1;i++) 应该为i<num， i的值不能取到n

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-3
content: 把代码写得清晰点，哪怕繁琐一点也不要紧，让自己在debug时更方便 #include <stdio.h> #include <stdlib.h> #include <math.h>  typedef struct tagPoint { 	int x; 	int y; } Point;  typedef struct tagPath { 	Point CurrentPoint; 	struct tagPath * Next; } *Path, PathNode;  double DistanceBetween(const Point p1, const Point p2) { 	const int dx = p1.x - p2.x; 	const int dy = p1.y - p2.y; 	return sqrt(dx * dx + dy * dy); }  void ReadNode(PathNode * node) { 	scanf("%d%d", &node->CurrentPoint.x, &node->CurrentPoint.y); 	node->Next = NULL; }  Path MakePath(int num) { 	PathNode fakehead = {{0, 0}, NULL}; 	Path * ret = &fakehead.Next; 	PathNode * cur = &fakehead; 	while (num --> 0) 	{ 		cur->Next = (PathNode*)malloc(sizeof(PathNode)); 		cur = cur->Next; 		ReadNode(cur); 	} 	return *ret; }  void DeletePath(Path path) { 	while (path) 	{ 		Path next = path->Next; 		free(path); 		path = next; 	} }  double PathLength(const Path path) { 	double result = 0; 	Path p = path; 	while (p->Next) 	{ 		result += DistanceBetween(p->CurrentPoint, p->Next->CurrentPoint); 		p = p->Next; 	} 	return result; }  int main(void) { 	int num = 0; 	scanf("%d", &num); 	Path path = MakePath(num); 	printf("%f", PathLength(path)); 	DeletePath(path); 	return 0; }
user-0 提问: 编译原理。求构造C语言的词法分析程序

回复:
user: user-1
content: http://blog.csdn.net/u013298384/article/details/45675019

user: user-2
content: 构造DFA啊..

user: user-3
content: 参考TCC源代码。

user: user-4
content: 分三类即可 1.字符串2.控制字符（包括运算符）3.数值
user-0 提问: C 二级指针释放问题

回复:
user: user-1
content: 这样的释放并没有问题

user: user-2
content: 这种写法没问题....

user: user-3
content: 不是释放的问题，使用过程中存在越界写操作

user: user-4
content: 仅供参考：//在堆中开辟一个4×5的二维int数组 #include <stdio.h> #include <malloc.h> int **p; int i,j; void main() {     p=(int **)malloc(4*sizeof(int *));     if (NULL==p) return;     for (i=0;i<4;i++) {         p[i]=(int *)malloc(5*sizeof(int));         if (NULL==p[i]) return;     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             p[i][j]=i*5+j;         }     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             printf(" %2d",p[i][j]);         }         printf("\n");     }     for (i=0;i<4;i++) {         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19

user: user-5
content: 越界了吧。。

user: user-6
content: 可能字符串在使用过程中拷贝之后越界了，或者指针的值被修改了。这个代码不会有异常，只是少了一次free而已。
user-0 提问: 我采用的是把输入数据转换后放进二维数组，然后用每列和做加法运算，注释写的很清楚，请帮我看看，我debug一天，改了不少错误，但就目前的测试数据是没问题的

回复:
user: user-1
content: 由于最多进1 [code=c v3[i+1]+=v3[i]/10; //改为 v3[i+1]+=1;   //更好，更直接 ][/code]

user: user-2
content: 仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110

user: user-0
content: 这道题允许 100 001 加起来