Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 链表崩溃的问题 大神来帮帮忙啊！输入字符就崩溃，无语。

回复:
user: user-0
content: 引用 2 楼 zjq9931 的回复:1.输入字符串，会导致scanf返回0你的循环体就结束了，要处理好这种情况。    我这里有个示例代码，供你参考。  #include<stdio.h> int main() { 	int i; 	int iRet = 1; 	while(1) { 		iRet = scanf("%d*s", &i); 		printf("%d, %d", iRet, i); 		if (iRet == 0) { //没有输入数字，输入的是字符串 			//输入字符串后怎么处理，代码卸载这里。 		} 	} 	return 0; }   2.第二个问题printf("%3d", temp->net->name)，从变量名上看name应当是个字符型的变量，用数值的方式输出确实不太好。  我是为了图省事 结点定义的是struct node{ int name；struct node * next} 。。sancf是读入要搜索的链表中的第几个元素。

user: user-1
content: 1.输入字符串，会导致scanf返回0你的循环体就结束了，要处理好这种情况。    我这里有个示例代码，供你参考。  #include<stdio.h> int main() { 	int i; 	int iRet = 1; 	while(1) { 		iRet = scanf("%d*s", &i); 		printf("%d, %d", iRet, i); 		if (iRet == 0) { //没有输入数字，输入的是字符串 			//输入字符串后怎么处理，代码卸载这里。 		} 	} 	return 0; }   2.第二个问题printf("%3d", temp->net->name)，从变量名上看name应当是个字符型的变量，用数值的方式输出确实不太好。

user: user-0
content: 报错信息
user-0 提问: 有没有好的推荐的C语言书籍？

回复:
user: user-1
content: C prime plus，找最新版本的PDF格式的，可以边学习，边看敲代码练习

user: user-2
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-3
content: !(TanHaoqiang)

user: user-4

user: user-5
content: https://chuanke.baidu.com/course/_C%E8%AF%AD%E8%A8%80_____.html?statistics_channel_id=1699&statistics_uid=13

user: user-5
content: http://bbs.csdn.net/topics/391890488 资料不少 百度也有很多
user-0 提问: 接口设计问题

回复:
user: user-1
content: 我觉得接口类不是只是一个规定吗？ 就是接口只是规定有哪些方法，具体的实现交由子类来做。 都说了是接口，肯定是只调用接口规定的方法啊，为什么要调用子类的，如果需要调用子类方法，那就定义子类对象呗 不知道说的对不对

user: user-2
content: 那你需要的是两个接口类，而不是一个。
user-0 提问: 文档

回复:
user: user-0
content: 是的,  我用了 rename , 但那是把  旧文件中的 “换” 字删除之后的新文件改名 ，改成原来的名字 。 所以名字上是相同的，但是内容 应该不能是相同的， 但运行结果确还是相同 ？

user: user-1
content: 第1个问题可能是编码不一致，确保文本文件也用ASCII保存 第2个问题你remove后不是还rename了吗
user-0 提问: 数据库、C语言

回复:
user: user-0
content: 没事，谢谢你，给我提供了思路

user: user-1
content: 引用 2 楼 summer_b 的回复:楼上的大神，第一个问题代码是这样的 void luying::on_pushButton_2_clicked() {           connect(ui->tableView,SIGNAL(clicked(QModelIndex)),this,SLOT(ShowSupplyclick())); } void luying::ShowSupplyclick() {         static QSqlQueryModel model(ui->tableView);         model.setQuery(QString("select * from Supply;"));         int row = ui->tableView->currentIndex().row();         QSqlRecord record = model.record(row);         ui->lineEdit->setText(record.value(0).toString());  } 但是显示QSqlQuery::exec: database not open，为什么呢 看来是QT代码，数据库没有打开，我不知道QT里面怎么用数据库的，抱歉了，这方面没有回答你了。

user: user-0
content: 楼上的大神，第一个问题代码是这样的 void luying::on_pushButton_2_clicked() {           connect(ui->tableView,SIGNAL(clicked(QModelIndex)),this,SLOT(ShowSupplyclick())); } void luying::ShowSupplyclick() {         static QSqlQueryModel model(ui->tableView);         model.setQuery(QString("select * from Supply;"));         int row = ui->tableView->currentIndex().row();         QSqlRecord record = model.record(row);         ui->lineEdit->setText(record.value(0).toString());  } 但是显示QSqlQuery::exec: database not open，为什么呢

user: user-1
content: 1.增加tableview的点击事件处理函数，在函数里面设置lineedit的内容 2.lineedit的文本，用GetWindowText来获取； 3.逆序输出的意思是，先输出的数据放到下面吧？在另一个窗口得到新的数据的时候插入到数据列的最前面。 因为没有具体代码，所以只能这么笼统的说了。
user-0 提问: 求大佬帮看这个程序 casse7这个功能怎么改下能实现

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

user: user-2
content: 这是大学生课程设计?

user: user-3
content: 建议多加些注释，方便观看

user: user-4
content: 另外，把功能不要都写到main函数里，多自定义一些功能函数放到main函数之外，然后在main函数里调用。这样代码会更有条例，代码可读性就更高。

user: user-4
content: 学生的数据结构建议总结一下，不建议分开；可以考虑使用如下的数据结构： struct stu_info {     char no[15];     char name[50];     float math, chinese, english;     float sum; }; struct stu_info stu[student_count];

user: user-5
content: 你单步跑一下你这个程序，里面很多地方都是跳过的，没法运行，全是一些定义数据类型的时候的随机值，怎么比较大小交换。
user-0 提问: C语言单链表逆置

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: 我认为问题并不像你所说的那样，因为你在创建链表的时候每次添加一个节点，节点的next指针就已经指向了NULL。其实是你的逆转函数有问题的，我同意2楼的逆转函数和观点。另外我觉得你创建链表的那个函数中for循环里边那个while(i == n)的循环和判断是没有什么实际意义的（因为进入for循环的条件就是i < n ,在循环里边 i == n 这种情况应该是不会出现的）。

user: user-3
content: http://blog.csdn.net/hackbuteer1/article/details/6591486/

user: user-4
content: #include<stdio.h> #include <malloc.h>  typedef struct Node {     int element;     struct Node *next; }Node;  Node * Create(int n) {     Node *head,*p,*tail,*q;     int i,x;      head = NULL;     tail = NULL;     q = NULL;     for(i=0;i<n;i++)     {         p=(Node *)malloc(sizeof(Node));         printf("输入一个数:  \n");         scanf("%d", &x);         p->element = x;         p->next = NULL;         if(NULL==head)             head = p;         else             tail->next = p;         tail = p;          if (i == n)             p->next = q;     }     return head;  } void print(Node * head) {     Node *p;     p = head;     if(!head) {         printf("链表为空！\n");     } else {         printf("如下所示：\n");         while(p) {             printf("%d ",p->element);             p = p->next;         }     }     putchar(10); }  Node * Inverse(Node * head) {     Node *p, *q, *s;      if(!head)         return NULL;      p = head;     s = head->next;     head->next = NULL;      while (s) {         q = s->next;         s->next = p;         p = s;         s = q; /*  *      Node *r;         r = p;         while (r) {             printf("%d\t", r->element);             r = r->next;         }         putchar(10);         */     }      return p;  /*     q = head->next;     while(q->next!=NULL)     {         p=q->next;         q->next=p->next;         p->next=head->next;         head->next=p;     }     return head; */ } int main() {     Node *head;     int x;     printf("链表内有几个数： \n");     scanf("%d",&x);     head = Create(x);     print(head);     head = Inverse(head);     printf("逆转后的链表为：");     print(head);     return 0; } 参考一下吧。 逆转之后的头结点需要返回，但是你没有使用返回的头结点。另外，你的逆转逻辑有问题。

user: user-0
content: 输入 1 2 3 4 但是输出1 4 3 2  我想问题主要出在初始化的时候最后一个结点的next没有指向一个NULL 但如何加 敢问大佬们
user-0 提问: 为什么会有这样的打印

回复:
user: user-1
content: 第一个问题: i<0这个条件在这里恒为false,所以while里的语句不会执行。  第二个问题: memset是按字节进行初始化的，因此你这个表达式实际上只初始化了前10个字节。然后，每个字节按照1的二进制位初始化，均为00000001，输出的时候，int又是一次取4个字节，即00000001000000010000000100000001，所以第0个和第1个元素均为16843009，第2个元素实际上只初始化了两个字节，所以为257，再后面都没有初始化。

user: user-2
content: 引用 3 楼 user-5 的回复:你只填了10个字节，每个字节为1，而一个int有32字节 一个int有32位，而不是32个字节的。并且是在32为系统里。   while(i < 0)   /*条件不满足，不能进入循环，所以无打印。天剑改成i >= 0*/ {     printf(" %d ", DFBE[i]); i--; }

user: user-3
content: 1 为什么第三种情况 memset(DFBE, 0, sizeof(DFBE) / sizeof(int)); 时输出都是0？ 其原因并不是应为这一行代码将DFBE中的所有元素都设置成0，而是在于 在函数体外定义的内置数组，其元素均初始化为0 也就是说，即使没有这一行代码，因为DFBE是全局变量，所以默认初始化为0，实际上 memset(DFBE, 0, sizeof(DFBE) / sizeof(int)); 只是将DFBE前10个字节设置成了0。 2 sizeof(DFBE) / sizeof(int)的作用是什么？ sizeof(DFBE) / sizeof(int)的作用是获取数组中元素的个数，而不是数组的大小，即 sizeof(DFBE) / sizeof(int)的值是10，数组的大小为sizeof(DFBE) 3 如果想将DFBE的初始值都设置为1，怎么办？ 因为memset操作的内存，以字节位单位，而DFBE是int的数组，以int为单位。所以要想将DFBE的初始值都设置为1，可以在定义DFBE时使用数组初始化，即 int DFBE[10] = {1, 1, 1, 1, 1, 1, 1, 1, 1,1}; 或者在main()函数中 for(int i=0; i<9; ++i) {    DFBE[i] = 1; }

user: user-3
content: 2打印的是DFBE[9]-DFBE[1]，而 sizeof(DFBE) / sizeof(int)的值是10，memset(DFBE, 1, sizeof(DFBE) / sizeof(int));只是将DFBE前10个字节设置成了0x01

user: user-3
content: 1 当条件为真时，while 语句反复执行目标语句。它的语法形式如下： while (condition) statement 只要条件 condition 的值为 true，执行语句 statement（通常是一个块语句）。condition 不能为空。如果第一次求解 condition 就产生 false 值，则不执行 statement。 你的while语句的条件是i<0，因为i的值是9，所以条件是false，不执行statement，所以就不会打印。

user: user-4
content: i==9,不满足while的条件i<0，所以没有执行循环体内内容

user: user-5
content: 此外，就算你32字节全填为1，他的值也不是1

user: user-5
content: 你只填了10个字节，每个字节为1，而一个int有32字节

user: user-5
content: 相当于IDE帮你调用了system("pause")最后暂停下来，方便你查看结果，实际运行这个程序执行完就自动退出了
user-0 提问: 请大神帮我拍看一下错在哪？为什么谭浩强的代码写出来不行

回复:
user: user-1
content: #include<stdio.h> int main() {     int max(int x,int y);     int a,b,c;     scanf("%d%d",&a,&b);     c=max(a,b);     a=5;     b=8;     ptintf("max=%d\n",c);   // 改成 printf("max=%d\n",c); // 拼写错误     return 0; ;}  // 多了个分号，不过不影响 int max(int x,int y) {     int z;     if(x>y)z=x;     else z=y;     return(z); }

user: user-2
content: 引用 1 楼 qq_38204686 的回复:;}  前面多了个; 删掉楼下正解。只有;是空语句，在这里并不会有影响的，话说楼主的IDE都没有提示么？一般都有语法错误提示的。这里printf打错，会提示未定义的函数的；

user: user-3
content: ptintf("max=%d\n",c); 修改为 printf("max=%d\n",c);   打错单词了吧

user: user-4
content: ;}  前面多了个; 删掉

user: user-5
content: #include<stdio.h>     int max(int x,int y); int main() {     int a,b,c;     scanf("%d%d", &a, &b);     c = max(a,b);     a=5;     b=8;     printf("max=%d\n",c);     return 0;  } int max(int x,int y) {     int z;     if(x > y)         z = x;     else         z = y;     return(z); }  printf单词拼写错误。
user-0 提问: 归并排序递归调用

回复:
user: user-1
content: 引用 7 楼 a645328869 的回复:[quote=引用 6 楼 for_grasp 的回复:] @幻夢之葉 @OldHello  我能理解这个意思，但是a[]一开始并没有排好序啊，对它不断分半的在作用和直接用岂不是一样嘛 分半以后再比较 然后排序 然后合并，合并后仍然有序,直到全部合并完。 合并两个有序序列，是比较两个有序序列的第一个元素，谁小把谁放进最终序列的结尾，并把它从原来的队列里面删掉直到有个序列为空。 比如[1 4 3 2 ] ->  [1 4] [3 2] ->比较两次 -> [1 4] [2 3] -> 取出1 和 2 比较 1小 进最后序列 [1] 然后比较4和2 2小 就是[1 2 3 4]  因为[2 3]本来就是有序的 所以1 4 3 2 比较两次 ->[1 2 3 4]，直接用的话，你看比较要多少次。分离和合并是很快的。[/quote]  引用 8 楼 for_grasp 的回复:@OldHello  1. merge_sort(r,t,m,p);           /  /递归调用，将r[m]~r[p]归并成有序的t[m]~t[p]                               2.merge_sort(r,t,p+1,n);       /  /类似上步骤，归并后半部分                        3.merge(t ,s,m,p,n);}      是不是在1中递归分半到不能再分之后，就进入3.进行排序合并吗，还是进入2，又直到2分半完，再一起进入3？

user: user-2
content: 不懂你在说什么，每次递归时分为左、右，然后再让两边合并  http://blog.csdn.net/morewindows/article/details/6678165/

user: user-3
content: 就比如一副扑克牌，你整副牌一起进行排序（方块A~K，然后梅花A~K......）假设除去大小王共52张 你先进行一次对分每部分26，再对分13......一直到每部分只有一张（无需排序）或两张（对其进行一次排序） 之后选两组何在一起，再进行一次排序（因为两组都是有序的，所以排序相对简单些，只需要不断向前比较） 继续上述过程，直到全部的牌合为一组

user: user-3
content: 任务进行分解成小块，最后再合并求解结果！ 不断调用递归函数，任务会不会被划分，直到满足条件，之后原路返回（由深到浅的函数退出）即为合并求解结果

user: user-1
content: 嵌套运行，满足条件出来，执行下一句。 一定是先执行完第一句， merge_sort(r,t,m,p);  不管里面递归了几次，p=(m+n)/2，最后P一定会和m相等。等于是你想把一块柴砍的很细，首先你把S柴砍成了两半A B，然后你把其中一半A又砍了一半A1 A2，你把A1这一半又砍了一半A11 A12，A11可以了，下一步砍A12.A12也可以了,那么A1就砍完了.接下来砍A2，A2也慢慢的砍完了，那么A就砍完了。接下来砍柴火B，一样的一个一个砍完了，那么柴火B就砍完了。也就意味着S柴砍完了。 我是这样理解的^_^

user: user-0
content: @OldHello  1. merge_sort(r,t,m,p);           /  /递归调用，将r[m]~r[p]归并成有序的t[m]~t[p]                               2.merge_sort(r,t,p+1,n);       /  /类似上步骤，归并后半部分                        3.merge(t ,s,m,p,n);}      是不是在1中递归分半到不能再分之后，就进入3.进行排序合并吗，还是进入2，又直到2分半完，再一起进入3？

user: user-1
content: 引用 6 楼 for_grasp 的回复:@幻夢之葉 @OldHello  我能理解这个意思，但是a[]一开始并没有排好序啊，对它不断分半的在作用和直接用岂不是一样嘛 分半以后再比较 然后排序 然后合并，合并后仍然有序,直到全部合并完。 合并两个有序序列，是比较两个有序序列的第一个元素，谁小把谁放进最终序列的结尾，并把它从原来的队列里面删掉直到有个序列为空。 比如[1 4 3 2 ] ->  [1 4] [3 2] ->比较两次 -> [1 4] [2 3] -> 取出1 和 2 比较 1小 进最后序列 [1] 然后比较4和2 2小 就是[1 2 3 4]  因为[2 3]本来就是有序的 所以1 4 3 2 比较两次 ->[1 2 3 4]，直接用的话，你看比较要多少次。分离和合并是很快的。

user: user-0
content: @幻夢之葉 @OldHello  我能理解这个意思，但是a[]一开始并没有排好序啊，对它不断分半的在作用和直接用岂不是一样嘛

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

user: user-3
content: 这是一个顺序执行的过程，递归则会悬置当前的代码。递归的首要就是划分规模或者计算难度的，到达最深的调用完整执行函数代码，退出之后运行上一次调用函数自身（递归函数），再完整执行，一直回退到达第一次的调用，整个过程结束。
user-0 提问: 一个程序用SendMessage和keybd_event模拟按键,两种打开方式结果不同,求教

回复:
user: user-1
content: 又用按键精灵不挂句柄模拟按键 应当是这个原因了。 就是两种打开方式，窗口的句柄是不同的。 用SPY++看看是不是这样。

user: user-2
content: 检查函数返回值，判断失败原因，再作分析
user-0 提问: 求教递归问题

回复:
user: user-1
content: 可以单步跟踪程序运行，观察程序流程及变量变化情况

user: user-2
content: 我也是个萌新，个人平常是 递归就先简化。从最简单的举例开始，比如s="01（或者abc）",，然后跟着调试或者Printf输出，不太会就用记事本记一下，不过一定要学会调试，监控值的变化。发现好像没有变化，那就s="012"，递归关键看如何终结的条件，根据其来举例。

user: user-0
content: 能否简单分析说明一下

user: user-3
content: 新手是不可能快速看出代码的意图的，如果你不是天才，只有靠积累

user: user-4
content: 就是看代码逻辑，熟悉编程技巧； 对于递归的代码，建议你分步调试和打印对应递归变量的值。

user: user-5
content: 判断是否为回文字符串

user: user-6
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
user-0 提问: 在一个程序中计算出给定误差小于0.1,0.01,0.001,0.0001,0.00001 这题这样解算正确吗？来个人帮忙看看！

回复:
user: user-1
content: #include<stdio.h> #include<math.h>  int main() { 	double dx; 	double precision1 = 0.1; 	double precision2 = 0.01; 	double precision3 = 0.001; 	double precision4 = 0.0001; 	double precision5 = 0.00001;  	double denominator = 0; 	double numerator = 0; 	double dRes = 1; 	double dPreRes = 0; 	double precision = 0;  	for(dx = 1; ; dx++) { 		denominator = (2 * dx + 1)*(2 * dx + 1); 		numerator = 2 * dx*(2 * dx + 2); 		dRes *= numerator / denominator; 		precision = dPreRes - dRes;  		printf("%f\n", dRes); 		printf("------\n"); 		if (fabs(precision) < precision1) { 			printf("%3.1f\n", dRes); 		}  		if (fabs(precision) < precision2) { 			printf("%4.2f\n", dRes); 		}  		if (fabs(precision) < precision3) { 			printf("%5.3f\n", dRes); 		}  		if (fabs(precision) < precision4) { 			printf("%6.4f\n", dRes); 		}  		if (fabs(precision) < precision5) { 			printf("%7.5f\n", dRes); 			break; 		} 		dPreRes = dRes; 	}  	return 0; }

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

user: user-3
content: 精度误差，使用double更精确

user: user-4
content: 单精度和双精度的区别。 题目要求应该是让你给出类似这种答案： printf("%.1f, %.2f, .3f%);//逗号后面的数字依次增加

user: user-0
content: 没人帮忙看看吗！
user-0 提问: realloc内存重新分配地址变化问题

回复:
user: user-1
content: realloc若是申请的大小比之前的小，是将原来的内存（可用）减少了。 至于申请过大，而之前所在的块不足，则拷贝数组至更大的块里。这些对我们使用者来讲是透明的，即看不到，也不需要注意。它如果申请成功，则会返回一个更大块的内存首地址。

user: user-2
content: 你要问什么？  http://en.cppreference.com/w/c/memory/realloc  If there is not enough memory, the old memory block is not freed and null pointer is returned. If ptr is NULL, the behavior is the same as calling malloc(new_size). If new_size is zero, the behavior is implementation defined (null pointer may be returned (in which case the old memory block may or may not be freed), or some non-null pointer may be returned that may not be used to access storage).

user: user-3
content: 没看到你想表达什么，是给大家科普？

user: user-0
content: MSDN官方文档里面是这么说的 The size argument gives the new size of the block, in bytes. The contents of the block are unchanged up to the shorter of the new and old sizes, although the new block can be in a different location. Because the new block can be in a new memory location, the pointer returned by realloc is not guaranteed to be the pointer passed through the memblock argument. realloc does not zero newly allocated memory in the case of buffer growth.
user-0 提问: 求指导C Primer Plus上的一道题目

回复:
user: user-0
content: 引用 4楼自信男孩 的回复:printf ("\n"); 这句可以直接用 putchar(10); 代替是哦，谢谢哈！又学到了~

user: user-0
content: 引用 2楼kuangbao9 的回复:你这应该任何个字符最后都会有个10;，这个是\n回车符的ASCII。你的程序是以#结束的，你按回车之后并没有结束，而是把内容刷新到控制台上显示，换行符也在其中。如果你每次以#结束，就没有这个问题了嗯嗯，谢谢，我把回车的asc2码记错了

user: user-0
content: 引用 1楼user-3 的回复:10 就是回车符号的 ASCII 码, 没什么问题呀是诶！谢谢~~

user: user-1
content: printf ("\n"); 这句可以直接用 putchar(10); 代替

user: user-1
content: '\n'就是回车符，对应的ASCII值就是10.

user: user-2
content: 你这应该任何个字符最后都会有个10;，这个是\n回车符的ASCII。你的程序是以#结束的，你按回车之后并没有结束，而是把内容刷新到控制台上显示，换行符也在其中。如果你每次以#结束，就没有这个问题了

user: user-3
content: 10 就是回车符号的 ASCII 码, 没什么问题呀
user-0 提问: 动态分配内存问题

回复:
user: user-1
content: sizeof(jock)的长度是固定的，4. malloc没问题，问题出在sizeof(jock)，因为jock是指针变量，所以sizeof(jock) = 4  #include<stdio.h> #include<string.h> #include<stdlib.h>  int main(void) {     char str1[] = "The jock is:\n\n";     char str2[][80] = {         "Include one or more other config files here.This is useful if you\n",         "have a standard template that goes to all Redis servers but also need\n",         "to customize a few per - server settings.Include files can include\n",         "other files, so use this wisely\n"     };     int strcount = sizeof(str2) / sizeof(str2[0]);     unsigned int length = 0;     for (int i = 0; i < strcount; i++)     {         length += strnlen_s(str2[i], sizeof(str2[i]));      }     unsigned int newsize= length + strnlen_s(str1, sizeof(str1)) + 1;     char *jock=(char *)malloc(newsize);     if (strncpy_s(jock, newsize, str1, sizeof(str1)))     {         printf("ERROR!\n");         return 1;     }     for (int i = 0; i < strcount; i++)     {         if (strncpy_s(jock + strnlen_s(jock, newsize), newsize, str2[i], sizeof(str2[i])))         {             printf("ERROR!\n");             return 2;         }     }     printf("%s", jock);     free(jock);     jock = NULL;     return 0;   }

user: user-2
content: if (strncpy_s(jock, sizeof(jock), str1, sizeof(str1)))  注意 sizeof(jock) 取得的是指针的大小 4, 而不是你分配的内存大小. 把所有的 sizeof(jock) 改成  newsize 吧
user-0 提问: 怎么将unsigned char数组转换成16进制的unsigned char

回复:
user: user-0
content: 引用 8 楼 adlay 的回复:直接追加就行了, 不用做转换 只有显示给人看的时候才有十进制和十六进制的说法, 对一个整数来说, 你把它写成十进制还是十六进制, 这个数还是这个数, 没有变化的. ok ok ，直接追加进去就可以了

user: user-1
content: 直接追加就行了, 不用做转换 只有显示给人看的时候才有十进制和十六进制的说法, 对一个整数来说, 你把它写成十进制还是十六进制, 这个数还是这个数, 没有变化的.

user: user-0

user: user-0
content: 我要转换成16进制追加到unsigned char 的数组中发送到串口

user: user-0
content: 我要转换成16进制追加到unsigned char 的数组中发送到串口

user: user-2
content: 引用 3 楼 user-3 的回复:你是想把  44 77 88 99  这样的16进制数值, 转换字符串吗?  还是要如何.  因为数值本身是没有10进制, 16进制之分的.   除非你要转换成字符串来显示, 才有区别. 同意见解。 十进制和十六进制只是输出的格式不一样，比如0x10和16是相等的。如果用%d输出的就是10进制，用%x或%X输出的就是16进制数。

user: user-3
content: 你是想把  44 77 88 99  这样的16进制数值, 转换字符串吗?  还是要如何.  因为数值本身是没有10进制, 16进制之分的.   除非你要转换成字符串来显示, 才有区别.

user: user-1
content: unsigned char data[4] = { 44,55,66,77 }; 	char ch[32] = { 0 };  	for (int i = 0; i < 4; i++) 	{ 		sprintf(&ch[2 * i], "%02X", data[i]); 	}

user: user-0
content: 请大家帮忙，谢谢
user-0 提问: c版本的正则表达式

回复:
user: user-0
content: 谢谢  引用 1 楼 user-1 的回复:\\d*  表示匹配0个或者多个数字的字符串.  这样就会匹配多次. A前面有0个数字, 这是第一次匹配 然后A后面的数据123456是第二次匹配 然后B后面有0个数字, 这是第三次匹配  至于你说的\\d+为什么不能匹配, 这就不好解释了. 至少在我使用的正则表达式工具中, \\d+是能唯一匹配123456的.  只能说明你用的那个库, 可能存在bug, 或者你输入错误

user: user-1
content: \\d*  表示匹配0个或者多个数字的字符串.  这样就会匹配多次. A前面有0个数字, 这是第一次匹配 然后A后面的数据123456是第二次匹配 然后B后面有0个数字, 这是第三次匹配  至于你说的\\d+为什么不能匹配, 这就不好解释了. 至少在我使用的正则表达式工具中, \\d+是能唯一匹配123456的.  只能说明你用的那个库, 可能存在bug, 或者你输入错误
user-0 提问: 用return返回一个数值

回复:
user: user-1
content: 前面改的差不多了，我再说一个问题，这个程序有点问题吧.count真的能统计字符数吗？ 每一次执行函数count都被赋值0，count的值永远不会大于1啊 把count定义成全局变量吧

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-3
content: scanf("%c",c)   改成  scanf("%c",&c)  其次先把count初始化为0

user: user-4
content: count 没有初始化。

user: user-5
content: #include<stdio.h> int ch(char); int main(void) {   char c;   while(scanf("%c", &c)==1)    //scanf,第二个参数是地址。           printf("that is %d chars\n",ch (c));         return 0; }   int ch(char a)   {     int count = 0;    //初始化。     if (isalpha(a))       count++;     return count;   }

user: user-6
content: int count = 0; //记得初始化
user-0 提问: c语言 怎么将字符串中的地址取出其内存输出

回复:
user: user-0
content: 恩 那么知道了这个unsigned int 型的地址以后，怎么取得这个地址的内存呢  我想到的*(int *)addr会报错

user: user-1
content: 那就是需要将字符串转换成地址值。   unsigned int addr;  sscanf(str, "%x", &addr); printf("%#x\n", addr);   这里addr的值就是0x100000；

user: user-2
content: 请在DosBox下使用TC运行。
user-0 提问: 各变量在内存中的存储空间

回复:
user: user-1
content: 引用 2 楼 a1qwertyuiop1 的回复:引用 1 楼 paschen 的回复:你指针变量本身是在栈中存储，函数返回值通过复制传递而指针指向的内存前者在常量区，后者在栈上，由于后者函数结束后，栈上内容被销毁，所以输出的是乱码既然栈的内容要销毁，为何还能输出00336B30和004DFBF8,不是应该也要被销毁吗  上面不是回答你了，函数返回值通过复制传递，销毁前已经进行了复制

user: user-0
content: 引用 1 楼 paschen 的回复:你指针变量本身是在栈中存储，函数返回值通过复制传递  而指针指向的内存前者在常量区，后者在栈上，由于后者函数结束后，栈上内容被销毁，所以输出的是乱码 既然栈的内容要销毁，为何还能输出00336B30和004DFBF8,不是应该也要被销毁吗

user: user-1
content: 你指针变量本身是在栈中存储，函数返回值通过复制传递  而指针指向的内存前者在常量区，后者在栈上，由于后者函数结束后，栈上内容被销毁，所以输出的是乱码

user: user-2
content: a，b两个变量都是临时变量，因为它们都定义在函数内。对于临时变量是存放在函数栈上的。临时变量的生命周期是从定义开始到函数调用结束；所以'b', 'c'字符无法输出，也有可能可以输出，这个主要是函数返回临时变量是未定义的行为，即有可能能正确输出也可能不能正确输出，取决于释放的空间有没有被再次申请（栈的释放和申请是很频繁的），存放'b', 'c'的内存位置会被会被覆盖。 “psa”是字符串常量，存放在数据段（只读数据段），其生命周期是从定义的开始到整个程序结束； function();函数为什么可以正常输出，就是因为该函数返回的是数据段的字符串的首地址，它的生命周期是整个程序有效；所以，返回该字符串的地址就可以找到该字符串。 堆上的空间，一般是通过malloc， calloc，realloc函数申请的，并且需要手动释放free，C++还有一个new和delete 这类问题主要是分清变量在内存中存放的位置，即它们的生命周期。对于理解变量会有很大帮助。

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

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

user: user-3
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素
user-0 提问: 一个宽字符用wprintf输出正常，putwchar不能正常输出

回复:
user: user-1
content: 统一改成Use Multi-Byte Character Set算了

user: user-2
content: 引用 9 楼 SL091210 的回复:[quote=引用 4 楼 zjq9931 的回复:] [quote=引用 2 楼 lwj7423 的回复:] 还是不行，感觉应该是IDE有所更改；主要问题应该还是在VS2015上面 我用VS2015也是可以的啊。[/quote]  我用2015也是不行啊，气死我了[/quote] 应当是源文件编码的问题，另存成ANSI编码的源文件，然后再编译就可以了。

user: user-3
content: 引用 4 楼 zjq9931 的回复:[quote=引用 2 楼 lwj7423 的回复:] 还是不行，感觉应该是IDE有所更改；主要问题应该还是在VS2015上面 我用VS2015也是可以的啊。[/quote]  我用2015也是不行啊，气死我了

user: user-3
content: 引用 7 楼 zhao4zhong1 的回复:估计是楼主的Win10该升级或重装一个稳定版本了。  老师你好，我也和楼主一样的情况，我粘贴您的代码也是putwchar无法显示，wprintf可以显示，请问原因有可能是什么呢

user: user-4
content: 估计是楼主的Win10该升级或重装一个稳定版本了。

user: user-5
content: vs2015，VC++编译器19.00.24210，用32位和64位编译器编译楼主的代码，结果均正常。

user: user-2
content: 引用 2 楼 lwj7423 的回复:还是不行，感觉应该是IDE有所更改；主要问题应该还是在VS2015上面 如果还是不行，有可能是你的.cpp文件用的是其他编码的。 你可以用记事本打开以下，然后另存成ANSI编码，然后用另存的这个文件编译输出试试。

user: user-2
content: 引用 2 楼 lwj7423 的回复:还是不行，感觉应该是IDE有所更改；主要问题应该还是在VS2015上面 我用VS2015也是可以的啊。

user: user-4
content: 反正我用WinXP＋VC6是行的。

user: user-0
content: 还是不行，感觉应该是IDE有所更改；主要问题应该还是在VS2015上面

user: user-4
content: #include<stdio.h> #include<locale.h> #include<stdlib.h>  void main() { setlocale(LC_ALL, "chs");  wchar_t chs ; chs = L'我'; putwchar(chs); wprintf(L"%c", chs); fflush(stdout);  system("pause"); }
user-0 提问: 内存地址无法释放

回复:
user: user-1
content: 只用free(p)就行。

user: user-2
content: 不能两次free一块内存，clloc时p[0]p[1]的的内存其实就是p所指向的，就是说p其实是p0与p1和一样，所以要么你就只free掉p，要么你就不能free p然后你可以free其他两个

user: user-3
content: p[0]=strtok(a," ");     p[1]=strtok(NULL," "); 这两个操作已经修改了p[0], p[1]的地址了。即上面calloc申请的内存地址的首地址被覆盖了。这样会造成内存泄露。 这样改一下：  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main() {     char a[]="Ti Al V";     char **p, *tmp;     p = (char **)calloc(2,sizeof(char *));     p[0] = (char *)calloc(4,sizeof(char));     p[1] = (char *)calloc(4,sizeof(char));      tmp = strtok(a," ");     strcpy(p[0], tmp);     tmp = strtok(NULL," ");     strcpy(p[1], tmp);     printf("%s\n",p[0]);     printf("%s\n",p[1]);     free(p[0]);     free(p[1]);     free(p);     return 0; }

user: user-4
content: p[0] = strtok(a, " "); p[1] = strtok(NULL, " "); 这两句你重新对p0 p1赋值了
user-0 提问: 求大神，为什么会这样？

回复:
user: user-1
content: 第一个scanf需要按下回车键才能读入，但是读入后，这个回车键还在输入流里，所以，如果下一个还是读入字符，就会把这个回车键读进去。 getchar()在输入缓冲区顺序读入一个字符(包括空格、回车和Tab). 第一次getchar()时，需要人工的输入，但是如果你输了多个字符，以后的getchar()再执行时就会直接从缓冲区中读取。

user: user-2
content: 应该在scanf("%d", &n);后面在加一句getchar();若不加这句getchar();下面的b获得就是回车符；

user: user-3
content: getchar(); b = getchar(); getchar();  上一次读取还遗留了一个换行符
user-0 提问: 关键路径算法，运行以下程序有问题，大神帮忙看看原因？

回复:
user: user-1
content: scanf_s %c %s时还需要一个参数，或者换成scanf

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-3
content: scanf_s(" %c %c %d",&v1,1,&v2,1,&w);
user-0 提问: 假设有N个数，找出第K大的数，K很大（c语言）

回复:
user: user-1
content: 我的第一反应也是排序 取第k-1个数

user: user-2
content: 你需要一个高效的排序算法

user: user-3
content: 百度搜相关关键字。

user: user-4
content: 引用 2 楼 qq_39251122 的回复:排序50万个在编译器上会停止运行 具体把你的代码提出来看看，能让编译器停止运行的电脑性能该多不好呀。 我看是因为你的代码优化的不够好吧，或者排序算法不够优吧。 你用快排试一试

user: user-5
content: 引用 2 楼 qq_39251122的回复:排序50万个在编译器上会停止运行 你可以百度 排序一亿个数据

user: user-0
content: 排序50万个在编译器上会停止运行

user: user-5
content: 排序 相同合并 取出第k个
user-0 提问: 出不来结猴子吃桃问题。猴子第一天摘下若干个桃子，当即吃了一半，好不过瘾，又多吃了一个.  第二天早上又吃了剩下的桃子的一半，又多吃了一个。以后每天都吃了前一天剩

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  int f(int day,int result);  int main(void) {     int result = 1, day = 1;     printf("%d",f(1,1));     system("pause");     return 0; } int f(int day,int result) {     printf("day = %d\n", day);     return day == 9 ? result:f(day++, (result+1)*2);  } 用这个程序看一下原因。你会发现day输出的都是1； 问题就出在后加1上，如果换成前增1就可以，或者直接f(day+1, (result+1) *2)也行。  #include<stdio.h> #include<stdlib.h>  int f(int day,int result);  int main(void) {     int result = 1, day = 1;     printf("%d\n",f(1,1));     system("pause");     return 0; } int f(int day,int result) {     printf("day = %d\n", day);     return day == 9 ? result:f(++day, (result+1)*2);     //return day == 9 ? result:f(day+1, (result+1)*2);  }

user: user-0
content: #include<stdio.h>   int main()   {       int x=1,i;       for (i=1;i<=10;i++)       {           x=(x+1)*2;       }       printf("猴子第一天摘了%d个桃子\n",x);       return 0;   } 这个其实更简单，但是我的为什么出不来呢。小白求解啊
user-0 提问: 【小程序 文件读写】VS2010未经处理的异常 0xc0000005写入位置时发生访问冲突 

回复:
user: user-1
content: 我也遇到了这个问题，好像在x86下运行就不会报错，不知道为什么，但是我有一段x86的代码有一段x64的代码，想把他们合在一起用不知道怎么搞了。

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

user: user-0
content: 引用 10 楼 cfjtaishan 的回复:那就缩小了范围，是文件指针的问题，你能确定fopen函数返回的文件指针不是指向NULL吗？你看我6楼的回复 我增加了判断指针的语句 同时将GMP库里用到fp的语句全注释掉了 用的基本的fputs 结果正常 说明文件指针也是正常的呀

user: user-3
content: 那就缩小了范围，是文件指针的问题，你能确定fopen函数返回的文件指针不是指向NULL吗？

user: user-0
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 7 楼 qq_37401326 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] 建议先检查一下fopen的返回值是否为NULL； 然后看一下gmp_fprintf的参数是否有问题。 int gmp_fprintf (FILE *fp, const char *fmt, ...)这个是函数的定义[/quote] %Zd这个会不会有问题，使用%d试试，或者你查一下mpz_t类型，%Zd会导致越界了吗？！[/quote]应该不存在这个问题，问题还应该在文件指针 我换了几个gmp库里使用文件指针的函数也是同样的错误

user: user-3
content: 引用 7 楼 qq_37401326 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] 建议先检查一下fopen的返回值是否为NULL； 然后看一下gmp_fprintf的参数是否有问题。 int gmp_fprintf (FILE *fp, const char *fmt, ...)这个是函数的定义[/quote] %Zd这个会不会有问题，使用%d试试，或者你查一下mpz_t类型，%Zd会导致越界了吗？！

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:建议先检查一下fopen的返回值是否为NULL； 然后看一下gmp_fprintf的参数是否有问题。 int gmp_fprintf (FILE *fp, const char *fmt, ...)这个是函数的定义

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:建议先检查一下fopen的返回值是否为NULL； 然后看一下gmp_fprintf的参数是否有问题。不用gmp_fprintf的话是没问题的

user: user-3
content: 建议先检查一下fopen的返回值是否为NULL； 然后看一下gmp_fprintf的参数是否有问题。

user: user-0
content: 引用 3 楼 qq_38204686 的回复:fopen返回值为null?并没有...

user: user-4
content: fopen返回值为null?

user: user-0

user: user-0
content: gmp是大数库

user: user-5
content: 查看是否test文件夹是否存在，调用fopen("D:\\test\\RSA111.txt","wb+")，文件不存在会创建,但是文件夹不存在不会创建，试试fprintf();
user-0 提问: 神马鬼，一道算是物理题的编程题

回复:
user: user-0
content: 你是对的，非常感谢回答。

user: user-1
content: 如果有一条支路短路，整条电路都是短路的啊，电阻为0了，不是说整个电路就等于另一支路的电阻了。

user: user-0
content: 那好吧，我现在才知道........... 你这道题会吗？

user: user-2
content: 高考都已经取消物理了
user-0 提问: C语言，如何动态创建线程？

回复:
user: user-1
content: 引用 14 楼 zhanggongjkl 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] 《Windows核心编程》 有没有Linux的推荐的书？。。Windows好多感觉方法不太一样[/quote] 鄙人没看过讲Linux多线程的书。

user: user-2
content: 引用 6 楼 zhanggongjkl 的回复:引用 3 楼 user-5 的回复:频繁创建销毁线程性能差，同意2楼换个思路，使用线程池吧让引用 4 楼 paschen 的回复:1、可以让线程执行完后线程自己释放这片空间这种情况的话这个malloc的空间是不是得把指针传到线程里，结束的时候free？要是这样的话是不是只能传结构体类型的指针？是的 你不是已经把该参数作为参数传递到了线程，传递的是void*类型的

user: user-0
content: 因为线程量不多，就没用线程池，并且创建销毁的频率也不高，所以最后用了指针数组，5个指针存放最大5个线程的信息，线程销毁时指针放空，新线程找空闲指针创建。主要还是线程池略有点复杂……

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:《Windows核心编程》 有没有Linux的推荐的书？。。Windows好多感觉方法不太一样

user: user-3
content: 不清楚，膜拜一下

user: user-1
content: 《Windows核心编程》

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:用线程池，需要的时候创建，不需要的时候回收。 看一下这个楼主的博客： http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html 这个帖子不错，在仔细研究。。

user: user-0
content: 引用 4 楼 paschen 的回复:1、可以让线程执行完后线程自己释放这片空间 这种情况的话这个malloc的空间是不是得把指针传到线程里，结束的时候free？要是这样的话是不是只能传结构体类型的指针？[/quote] 需要，如果定义的指针是全局，那就不需要传进去了。否则是需要的。 如果需要判断或者使用的变量较多，多余2个。那么建议传递结构体指针进去。[/quote] 感谢，基本上解决了

user: user-4
content: 引用 6 楼 zhanggongjkl 的回复:[quote=引用 3 楼 user-5 的回复:] 频繁创建销毁线程性能差，同意2楼 换个思路，使用线程池吧 让  引用 4 楼 paschen 的回复:1、可以让线程执行完后线程自己释放这片空间 这种情况的话这个malloc的空间是不是得把指针传到线程里，结束的时候free？要是这样的话是不是只能传结构体类型的指针？[/quote] 需要，如果定义的指针是全局，那就不需要传进去了。否则是需要的。 如果需要判断或者使用的变量较多，多余2个。那么建议传递结构体指针进去。

user: user-0
content: 引用 3 楼 user-5 的回复:频繁创建销毁线程性能差，同意2楼 换个思路，使用线程池吧 让  引用 4 楼 paschen 的回复:1、可以让线程执行完后线程自己释放这片空间 这种情况的话这个malloc的空间是不是得把指针传到线程里，结束的时候free？要是这样的话是不是只能传结构体类型的指针？

user: user-2
content: 2、这属于线程间通讯问题，你可以设置一个标志变量，线程结束前自动设置标志变量，外部判断该变量

user: user-2
content: 1、可以让线程执行完后线程自己释放这片空间

user: user-5
content: 频繁创建销毁线程性能差，同意2楼 换个思路，使用线程池吧

user: user-4
content: 用线程池，需要的时候创建，不需要的时候回收。 看一下这个楼主的博客： http://www.cnblogs.com/venow/archive/2012/11/22/2779667.html

user: user-0
content: device_IP_info 结构体就是底下赋值的那三个变量
user-0 提问: 为什么VC编译错误的代码也能AC

回复:
user: user-1
content: 引用 10 楼 zihui0459 的回复:引用 9 楼 paschen 的回复:引用 6 楼 zihui0459 的回复:引用 4 楼 paschen 的回复:在C语言中，stdio.h 头文件是主要的。而在后来的C++语言中，C只是C++的一个子集，且C++中，已不推荐再用C的类库，但为了对已有代码的保护，还是对原来的头文件支持。   cstdio是c++从C的stdio.h继承来的，在前面加C同时不要H后缀，在C++环境当然是选用前者，两者内容都一样，只是cstdio头文件中定义的名字被定义在命名空间std中那给链表分配空间的时候include <stdlib.h>还要写吗要不要写不是取决于做什么，而是取决于你需不需要用到里面提供的函数需要用malloc来分配空间呢  malloc需要<stdlib.h>

user: user-0
content: 引用 8 楼 cfjtaishan 的回复:[quote=引用 7 楼 zihui0459 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] using namespace std;  这是C++的语法。用VC编译器是不识别C++的语法的。所以，建议用VC++编译这部分代码； C++编译器是能够识别C语言的语法的，所以用C++可以编译C语言的代码。  Visual C++6.0不可以吗？[/quote] 当然可以呢。它是C++编译器嘛[/quote]可是还是出错std does not exist

user: user-0
content: 引用 9 楼 paschen 的回复:引用 6 楼 zihui0459 的回复:引用 4 楼 paschen 的回复:在C语言中，stdio.h 头文件是主要的。而在后来的C++语言中，C只是C++的一个子集，且C++中，已不推荐再用C的类库，但为了对已有代码的保护，还是对原来的头文件支持。   cstdio是c++从C的stdio.h继承来的，在前面加C同时不要H后缀，在C++环境当然是选用前者，两者内容都一样，只是cstdio头文件中定义的名字被定义在命名空间std中那给链表分配空间的时候include <stdlib.h>还要写吗要不要写不是取决于做什么，而是取决于你需不需要用到里面提供的函数需要用malloc来分配空间呢

user: user-2
content: 引用 1 楼 cfjtaishan 的回复:using namespace std;  这是C++的语法。用VC编译器是不识别C++的语法的。所以，建议用VC++编译这部分代码； C++编译器是能够识别C语言的语法的，所以用C++可以编译C语言的代码。 你是来搞笑的吗？VC不能识别C++代码？你试过吗？

user: user-1
content: 引用 6 楼 zihui0459 的回复:引用 4 楼 paschen 的回复:在C语言中，stdio.h 头文件是主要的。而在后来的C++语言中，C只是C++的一个子集，且C++中，已不推荐再用C的类库，但为了对已有代码的保护，还是对原来的头文件支持。   cstdio是c++从C的stdio.h继承来的，在前面加C同时不要H后缀，在C++环境当然是选用前者，两者内容都一样，只是cstdio头文件中定义的名字被定义在命名空间std中那给链表分配空间的时候include <stdlib.h>还要写吗要不要写不是取决于做什么，而是取决于你需不需要用到里面提供的函数

user: user-3
content: 引用 7 楼 zihui0459 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] using namespace std;  这是C++的语法。用VC编译器是不识别C++的语法的。所以，建议用VC++编译这部分代码； C++编译器是能够识别C语言的语法的，所以用C++可以编译C语言的代码。  Visual C++6.0不可以吗？[/quote] 当然可以呢。它是C++编译器嘛

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:using namespace std;  这是C++的语法。用VC编译器是不识别C++的语法的。所以，建议用VC++编译这部分代码； C++编译器是能够识别C语言的语法的，所以用C++可以编译C语言的代码。  Visual C++6.0不可以吗？

user: user-0
content: 引用 4 楼 paschen 的回复:在C语言中，stdio.h 头文件是主要的。而在后来的C++语言中，C只是C++的一个子集，且C++中，已不推荐再用C的类库，但为了对已有代码的保护，还是对原来的头文件支持。   cstdio是c++从C的stdio.h继承来的，在前面加C同时不要H后缀，在C++环境当然是选用前者，两者内容都一样，只是cstdio头文件中定义的名字被定义在命名空间std中那给链表分配空间的时候include <stdlib.h>还要写吗

user: user-0
content: 那给分配空间的时候include <stdlib.h>还要写吗

user: user-1
content: 在C语言中，stdio.h 头文件是主要的。而在后来的C++语言中，C只是C++的一个子集，且C++中，已不推荐再用C的类库，但为了对已有代码的保护，还是对原来的头文件支持。   cstdio是c++从C的stdio.h继承来的，在前面加C同时不要H后缀，在C++环境当然是选用前者，两者内容都一样，只是cstdio头文件中定义的名字被定义在命名空间std中

user: user-4
content: 感觉像是声明了一个永远不会被使用的变量 编译器优化能力还是可以的

user: user-0
content: Visual C++6.0不可以吗？

user: user-3
content: using namespace std;  这是C++的语法。用VC编译器是不识别C++的语法的。所以，建议用VC++编译这部分代码； C++编译器是能够识别C语言的语法的，所以用C++可以编译C语言的代码。
user-0 提问: 一道练习题不会做，求助大家啦！

回复:
user: user-1
content: http://www.cplusplus.com/reference/cstring/

user: user-1
content: strcmp((s[i], "$$$$$") == 0 判断字符串相等  另外还有strncmp，strcpy，strstr等函数也是对字符串的一些操作，你可以搜索相关的资料来提高对字符串操作的认识

user: user-0
content: 太感谢你们了！！

user: user-2
content: #include <stdio.h> #include <string.h>  #define ROW     10 #define COL     128  int main(void) {     char s[ROW][COL];     int i, j;      for (i = 0; i < ROW; i++) {         scanf("%s", s[i]);         if (strncmp(s[i], "$$$$$", 5) == 0)             break;     }      for (j = 0; j < i; j++)         puts(s[j]);     return 0; } 或者用strncmp

user: user-2
content: #include <stdio.h> #include <string.h>  #define ROW     10 #define COL     128  int main(void) {     char s[ROW][COL];     int i, j;      for (i = 0; i < ROW; i++) {         scanf("%s", s[i]);         if (strcmp(s[i], "$$$$$") == 0)             break;     }      for (j = 0; j < i; j++)         puts(s[j]);     return 0; }
user-0 提问: 关于scanf，sprintf，fread，fwrite函数的疑惑

回复:
user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-1
content: 请判断fscanf函数的返回值！

user: user-2
content: while(fscanf(fp,"%d %d %f %f\n",&number, &last, &points,&extras) ==4)     {         printf("%d,%d,%f,%f\n", number, last, points,extras);     } 改一下这儿，用空格代替逗号；因为fscanf和fprintf是格式化读写，并且这两个函数正好是一对，即怎么写入文件的，就怎么从文件里读取，即格式要一样。所以要根据文件的内容和格式来确定读写的格式。 fscanf的返回值和scanf的返回值一样，根据读取的成功的个数作为返回值，比如这个读取是4个数据，如果能正确读取4个则返回4，正确读取3个则返回3.建议看一下这个函数的定义和返回值。 fread和fwrite则是二进制形式的读写。也是一对，用fwrite写的，可以用fread读。

user: user-3
content: fscanf忽略换行，fread会把换行读到内存中。

user: user-4
content: 你写出时并没有逗号分隔  while(fscanf(fp,"%d,%d,%f,%f\n",&number, &last, &points,&extras) ==1)  改成：  while(fscanf(fp,"%d %d %f %f\n",&number, &last, &points,&extras) ==4)
user-0 提问: 求大神，为什么会这样

回复:
user: user-1
content: 引用 3 楼 qq_40197340 的回复:可是我删了fclose（）；也不行 此时的流的位置是在最末尾，根本就没有数据，理论上是读取失败的 你可以重新打开文件，或者把流的位置重新定位到文件开始处

user: user-2
content: int main() { 	int x,y; 	FILE *file,*file2; 	file = fopen("a.txt","w+"); 	file2 = fopen("b.txt","w+"); 	fprintf(file,"%d",5); 	fseek(file,0,SEEK_SET); 	fscanf_s(file,"%d",&x); 	fclose(file); 	printf("%d\n",x);  	fprintf(file2,"%d",x); 	fclose(file2);    	system("pause"); 	return 0; }   这个代码在vs2012上面运行出来的结果和文件a.txt ，b.txt里面保存的内容都是5，楼上说的对，在用到文件指针的时候需要时刻注意当前的指向和文件是否有关闭。你试试看，应该是没什么问题了。

user: user-3
content: 删除fclose()；之后，用rewind(file);替换，或者fseek(file, 0, SEEK_SET); 这样做的目的就是让文件指针（重新）指向文件的开头。 每次读之后，文件指针都会向文件尾部便宜一定的距离，所以，一旦读取一次，文件指针已经不指向文件开头了，这样就不能把上次读到的位置再次读取了。当然用rewind和fseek可以修改文件指针的位置。

user: user-4
content: 文件流指针偏移

user: user-0
content: 可是我删了fclose（）；也不行

user: user-5
content: close 以后以只读方式打开

user: user-6
content: file已经fclose了，又fscanf_s当然不成了
user-0 提问: 求解最大值最小值min max的条件运算符?:为什么这样写就能选出最大最小值

回复:
user: user-1
content: 引用 3 楼 coding_ing 的回复:大神们 我知道这个运算符的意思 我就是针对这道题不知道为什么那样写就能是min 和max读出最大值 每输入一个成绩，都跟当前的最大最小分值进行对比，如果较大/较小则重新设置最大最小分值

user: user-0
content: 大神们 我知道这个运算符的意思 我就是针对这道题不知道为什么那样写就能是min 和max读出最大值

user: user-2
content: 建议查一下条件运算符。?:这个是基本的语法。 c = a > b ？ a : b;这个是若a > b，则将a赋值给c，否则将b赋值给c；即将a和b中较大的值赋值给c； c = a > b ? b : a;  //或者  c = a < b ? a : b;这个是将较小值赋值给c

user: user-3
content: ?:这个运算符的意思就是如果问号前的表达式成立，则返回问号后的表达式的结果，否则返回冒号后的表达式的结果
user-0 提问: 关于结构体的柔性数组

回复:
user: user-1
content: array[0]    不占空间

user: user-2
content: 是的，编译器不会，因为他根本不知道要申请多大

user: user-3
content: 必需用          。

user: user-4
content: typedef struct my_test { int number; char array[0]; }test,*test_p; 结构体中的char array[0];就是一个指针变量，定义一个这样的结构体变量，array元素就是一个野指针，所以需要给其分配空间。

user: user-5
content: typedef struct my_test { int number; char array[0]; }test,*test_p; //应该是这个地方报错吧？你把typedef删掉就没问题了，但是会出现另一个错误 test test,test1; //就是这里，你需要改成 struct my_test test, test1; 其他地方并没有错误，针对你给出的代码来说。

user: user-6
content: http://blog.csdn.net/yby4769250/article/details/7294696

user: user-7
content: 柔性数组本质就是指针访问
user-0 提问: 用C写彩色图转灰度图时转换后的图像打不开

回复:
user: user-1
content: 引用 3 楼 qq_36763031 的回复:[quote=引用 1 楼 user-1的回复:]BMP 文件格式要求图像中每一行的数据要对齐到 32 位的, 你根本没有做这个处理 可是我在第25行后加上bin.biWidth=（bih.biWidth*8+31）/32*4后还是不对，求助[/quote] 不要直接改图像的宽度, 而是遍历图像数据的时候做处理, 输出的时候也是一样

user: user-0
content: 引用 1 楼 user-1的回复:BMP 文件格式要求图像中每一行的数据要对齐到 32 位的, 你根本没有做这个处理 可是我在第25行后加上bin.biWidth=（bih.biWidth*8+31）/32*4后还是不对，求助

user: user-0
content: 引用 1 楼 user-1的回复:BMP 文件格式要求图像中每一行的数据要对齐到 32 位的, 你根本没有做这个处理 真的谢谢你您，我试试

user: user-1
content: BMP 文件格式要求图像中每一行的数据要对齐到 32 位的, 你根本没有做这个处理
user-0 提问: 为什么第一个函数调用不了

回复:
user: user-1
content: 你这删除输入的字符有个BUG，如果你需要删除的字符在数组里面出现两次或者以上，在删除完之后，在数组后面会有残留的字符，如果无意访问到的话应该会对程序运行结果或者判断有影响。例如str[20]="abcdefgabcd",删除字符a之后bcdefgbcd'\0'd,d还残留在数组里面。

user: user-2
content: 学习了,很想学习

user: user-1
content: 把你delete_string函数里面的for循环条件改下就好了 for(i=j=0;i!='\0';i++)改成for(i=j=0;str[i]!='\0';i++) 改完这个试下应该就OK了，我在vs2012里面试着是没问题的。

user: user-3
content: 错啦，你就没调用啊

user: user-3
content: 你舅没吊用啊

user: user-4
content: 注意函数声明，定义与调用的区别。 #include<stdio.h> #include<string.h> #include<stdlib.h>  /*函数声明*/ void enter_string(char str[20]); void delete_string(char str[20],char a);  int main() {     char a;     char str[20];     /*函数调用*/     enter_string(str);     printf("输入一个要删除的字符：");     scanf("%c", &a);     /*函数调用*/     delete_string(str, a);     puts(str);     printf("\n\n");     return 0; } /*函数定义*/ void enter_string(char str[20]) {     gets(str); } /*函数定义*/ void delete_string(char str[20],char ch) {     int i,j;      for(i = 0; str[i];)         if(str[i] == ch) {             for (j = i; str[j]; j++)                 str[j] = str[j+1];         } else {             i++;         } }  详见上面的代码； 注意删除某个字符的函数逻辑有问题，建议对照一下看看逻辑问题出在哪。

user: user-5
content: 把void删了，加上就是函数声明了。

user: user-0
content: 那个问题已经解决了  再在的问题是怎么输出时那个数组str[[0]始终是'\0'这个是为什么   上面一位说得我不太懂   str[j]='\0';这行代码不是就最后 就执行一次吗    他不是循环里面的啊

user: user-6
content: 楼主说的第一个函数调用不了，具体指的是那个函数呢？ str[j]='\0'; 这个是只执行一次，因为楼主的for循环只作用于 if(str[i]!=a) str[j++]=str[i]; 这个语句。

user: user-0
content: str[j]='\0'; 这个他不是只执行一次吗

user: user-7
content: //你那个绝对不是空格，应该是字符'\0'才对 void delete_string(char str[],char a) { int i,j; for(i=j=0;i!='\0';i++)//你的循环条件有问题 if(str[i]!=a) str[j++]=str[i]; str[j]='\0';//在这里如果你的字符变量a所代表的字符如果不是str的第一个字符，就会被改变成'\0'，而且总是改变str的第一个字符。 }

user: user-0
content: 这个为什么输出不对啊 总是str[0]输出的是空格

user: user-0
content: #include<stdio.h> #include<string.h> #include<stdlib.h> void enter_string(char str[20]); void delete_string(char str[20],char a); void print_string(char str[20]); int main() { 	char a; 	char str[20]; 	enter_string(str); 	printf("输入一个要删除的字符："); 	scanf("%c",&a); 	delete_string(str,a); 	print_string(str); 	scanf("\n\n"); 	return 0; }  	 void enter_string(char str[20]) { 	printf("输入一串字符："); 	gets(str); } void delete_string(char str[],char a) { 	int i,j; 	for(i=j=0;i!='\0';i++) 	if(str[i]!=a) 	str[j++]=str[i]; 	str[j]='\0';	 	 }  void print_string(char str[20]) { 	int k; 	int i; 	printf("删除后的字符数组为：\n"); 	for(i=0;i<20;i++) 	printf("%c\n",str[i]); }

user: user-7
content: void enter_string(char str[20]); 你难道是想说这个是你的函数调用的地方？ 这里只是一个函数声明，并没有调用这个函数。
user-0 提问: 计算输入数字上限与下限的平方和的程序

回复:
user: user-1
content: 如果不加{}的话，只执行x=I*i这句话；但是sum+=x是需要循环的啊！

user: user-0
content: 2#楼的朋友你好，谢谢你的指点，因为我是自学，所以有些地方确实不大明白，能麻烦你帮我指出我的程序循环逻辑问题主要是什么问题吗？以后好避免，谢谢

user: user-2
content: 楼主，我来解释一下你的这一段while循环，首先他是在x值小于y值的条件下，一直保持循环， 进入到for循环后，i=x初始值=5，且i<y初始值=9；一次for循环后，i=6，x=25，sum=25，y不变； 二次for，i=7，x=36，sum=61，y不变；直到四次for循环后，i=9，跳出for循环， 此时i=9，x=64，sum=25+36+49+64=174；然后继续for循环后面的语句，y=81；z=174+81=255； 所以这就是你输出时，x=64，y=81，z=255的原因，然后就是scanf的阻塞啦

user: user-0
content: 引用 4 楼 daijunyiluoshiyong 的回复: for(i=x,sum=0;i<y;i++)   {     x1=i*i; sum+=x1;   }这是计算平方和的。你程序中for后边没有括号，然后只执行了一遍。建议你多看书（谭浩强的C和C++）,看看别人代码，上网搜怎么调试 你说这里呀，因为我在编程过程中发现，for循环后面如果不用{}，紧跟其后的循环声明部分是以分号来结束该循环的，我看循环声明这里的表达式不多，我就没有用{}，而是用的分号。谢谢指点

user: user-1
content: #include<stdio.h> int main() {    int x,y;    int i,z;    int sum;    int x1;    printf("Enter lower and upper integer limits:");   // scanf("%d %d",&x,&y);    x=5;    y=9;    while(x<y)    {       for(i=x,sum=0;i<y;i++) 	  { 	    x1=i*i; 		sum+=x1; 	  }       y=y*y; 	  z=sum+y; 	  printf("The sums of the squares from %d to %d is %d\n",x*x,y,z); 	  printf("Enter next set of limits':"); 	  scanf("%d %d",&x,&y);    }    printf("Done!Bye-Bye!\n");    return 0; } 你主要的问题不会调试，看每个值等于多少，而且循环逻辑有问题，你对比一下我基于你的代码改的部分

user: user-1
content: for(i=x,sum=0;i<y;i++)   {     x1=i*i; sum+=x1;   }这是计算平方和的。你程序中for后边没有括号，然后只执行了一遍。建议你多看书（谭浩强的C和C++）,看看别人代码，上网搜怎么调试

user: user-3
content: # include <stdio.h> long long sum; int main(){    int X,Y,T; do{  sum=0; scanf("%d %d",&X,&Y); T=X;   while(X<=Y){   sum+=X*X; X++; } printf("%d to %d is %lld\n",T,Y,sum); }while(1);     return 0; }
user-0 提问: 求教，求教

回复:
user: user-1
content: 应该是分配内存时候出的问题，但也不能个说是个问题。 在第二次调用这个函数进行链表创建的时候，会顺着第一个链表创建结束的位置处继续分配内存空间。 差不多类似这张图：

user: user-2
content: http://blog.csdn.net/zhagoodwell/article/details/59230474 里面有你想要的

user: user-3
content: 看不出来 建议设置断点调试

user: user-0
content: LIST2* creat_number(LIST2 * head, int number1)        {   	LIST2 *new_=NULL;                       	LIST2 *end=NULL;                      	int i;                                    	srand((int)time(0));  	for (i = 0; i < number1; i++) 	{ 		 		new_ = (LIST2 *)malloc(sizeof(LIST2)); 		if (new_ == NULL) 		{ 			printf("there is no please\n"); 			exit(1); 		}  		new_->number = (rand()%(10*number1));  		 		if (head == NULL) 		{ 		   head = new_; 			end =head;  		} 		else 		{ 			end->next = new_; 			end = new_; 		} 	} 	end->next = NULL;         ｝  我就是调用这个函数 可以生成的第一个链表正常，在调用的话 就出现上面的情况了

user: user-3
content: 我感觉是你代码的问题
user-0 提问: C语言中Scanf函数的问题。新手求教，在线等。

回复:
user: user-1
content: 引用 4 楼 khxu10234 的回复:[quote=引用 2 楼 jianwen0529 的回复:] scanf_s("%s", student[i].name, 20); 劳烦可以解释一下吗，谢谢[/quote] scanf 是标准库的函数，scanf_s是微软vc的函数，你百度scanf_s的用法就清楚了，字符串后面加一个表示缓存的大小，保证读取不会发生越界行为

user: user-0
content: 引用 2 楼 jianwen0529 的回复:scanf_s("%s", student[i].name, 20); 劳烦可以解释一下吗，谢谢

user: user-2
content: 引用 2 楼 jianwen0529 的回复:scanf_s("%s", student[i].name, 20);

user: user-1
content: scanf_s("%s", student[i].name, 20);

user: user-3
content: name 后面再加一个参数试试
user-0 提问: 求助ACM杭电2000

回复:
user: user-0
content: 谢谢回复，不过跟这个无关，重写了一遍，就通过了 #include <stdio.h> #include <stdlib.h>  int main() {     char a[3];     char t,i,j;     while(scanf("%s",a)!=EOF)     {         for(i=0;i<3;i++)             for(j=0;j<2-i;j++)                 if(a[j]>a[j+1])                 {                     t=a[j];                     a[j]=a[j+1];                     a[j+1]=t;                 }         printf("%c %c %c\n",a[0],a[1],a[2]);         }      return 0; }

user: user-1
content: char a[4]; char t, i, j; while (scanf_s("%s", a, 4))
user-0 提问: 关于局部静态变量

回复:
user: user-1
content: 静态变量可以被再次赋值，但是在只能初始化一次！！！

user: user-2
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……  在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

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

user: user-3
content: 这个涉及到进程空间模型。  进程空间的栈空间是变化最多的地方；函数调用都在这里发生，所有非静态局部变量、入参副本都在栈空间。 函数调用结束，栈空间被释放；  静态局部变量之所以是个例外，是因为它存放的位置和普通全局变量一样，都在全局数据区。 与auto局部变量不同，函数退出后它的空间不被释放，因此它具有记忆功能，这是与普通局部变量最大的区别。  此外，它还是局部变量，只在函数内部可见。这是因为它在符号表不可见（或者是符号表里面根本就没有它），因此在所属函数之外无法访问

user: user-4
content: 静态变量具有永久存储区，是变量本身被赋予了永久存储区。赋初值后，这个变量还可以自我循环运算，所以静态变量初值并不是最终值，只是每次调用函数的时候，上次调用产生的结果是固定不变的，比如该例，下次调用的时候a的值就直接是9，a=6这个步骤是不再重复运行的。运用静态变量的函数其实是产生了一个特殊固定函数功能，该功能有一个固定不变的结果提供给用户。

user: user-5
content: 你把静态变量看成普通变量就好理解了，其实静态变量就是普通变量呀，只是静态变量的生命周期是在整个程序运行期间的，而普通产量出了其所在的程序块中就会消亡。所以他们的区别只是谁可以存活的时间更长，其他一样的。

user: user-6
content: 你只不过是在主函数里用的它而已， 你可以在循环里使用它， 也可以在其它函数里声明定义并使用然后在主函数里循环调用函数。 你还可以将局部静态变量的指针传出去，任意访问。

user: user-7
content: 静态变量只是不被销毁 在程序运行期间可以一直用 作用域不会变 但是值可以被改变 其还是一个变量 详情百度 静态变量

user: user-8
content: 静态局部变量是可以再次赋值的，又不是const类型，只是只能被初始化一次，估计你对初始化概念不太清晰

user: user-9
content: const不能再赋值，但是static可以再赋值的。

user: user-10
content: 如果你搞过嵌入式，学过bin程序文件的文件格式，亲自上手写从flash芯片，导入Ram芯片（内存），然后调用main函数的整过流程，你会很明白，全局变量，和静态变量，堆栈，局部变量到底是啥东西。

user: user-10
content: static有两大作用：             1.   声明静态存储             2.   限定作用域      static int a=6; 中这据代码，根本从来就没有翻译成机器码过，根本没有任何一条指令执行了a=6这个表达式，全局变量中的      int  a=6也是一样，根本没有一条指令是用来执行a=6的，很意外吧。。。静态变量和局部赋初值变量是不同的，却和全局付初值变量相同，没有任何代码给他们付初值，赋初值的是程序文件导入器。。。他们的初始值都是通过文件流一口气复制到内存的（此时main函数还没有运行）。。他和全局有初值变量的区别，仅仅是作用域不同，被限定到函数体内使用。        当然这是实际情况，但老师的介绍情况，通常不是这样，老师会告诉你在初次调用时会被赋值一次，其实有点想当然，但这么理解对于编程没有坏处，反而有助于新手理解，否则新手会认每次调用，这个数都是6，其实不是初次调用被赋初值，而是每次调用都没有赋初值，初值在程序没运行就赋值过了。程序就是个死代码，他怎么会区分是不是第一次调用呢，要想区分就要有计标志变量和代码，来统计是不是第一次，这样的运行效率降低，不仅麻烦，而且很傻。当然C#.net就不一样了，他确实是按照这个逻辑做的，初次调用才赋值，这个很容易跟踪到，但C你设断点，是走不到的，因为根本不存在这句代码，C从来不是按照他想表达的逻辑在做。       static 其实最大的作用，除了声明静态存储外，还有一个目的是限定作用域。。如果不是为了这个目的，它写在函数外和函数内根本没分别，编译器最多检测一下语法正确性，编译代码时，写在函数内外机器码是相同的。       全局变量本身就是静态存储，为什么也用 static ，  前面说过，他的第二个作用是限定作用域， 他可以告诉连接器这个变量仅源文件内部有效，类似于C++ 的  private的作用。
user-0 提问: 打印机驱动怎么在word里增加双面长边和双面短边的选项

回复:
user: user-0
content: 和横向纵向是打印方向不一样，这个是装订的位置，类似于说是竖着翻页还是横着翻页

user: user-1
content: 看名称应该是DC_ORIENTATION吧

user: user-2
content: Word是Word； 打印机驱动是打印机驱动。

user: user-0
content: 就是在word2010，打印选项下有个设置，debugview看应该是从devicecapabilities中获取了写的纸张大小等信息，但是在其中dc_duplex设为ture，选项中只有单面和手动双面，从哪能加入双面打印的短边和长边选项呢
user-0 提问: vs 2012 设置/MD 可以编译，设置 /MT,就会有几个无法解析的外部符号 

回复:
user: user-1
content: 把所有依赖的.lib、.dll库加上/MT重新编译一下

user: user-2
content: 链接不到标准库的lib文件，看下库目录等设置有没问题

user: user-0
content: libcmt.lib 有的，如果没有就不只这几个错误了。

user: user-3
content: 这得看你的VS安装目录比如C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib里没有libcmt.lib库
user-0 提问: 指针常量与常量指针问题

回复:
user: user-1
content: 代码内指针p1，p2，p3均未初始化地址，其中p2为指针变量，其地址可以更改，但指向的值不能修改；p3为指针常量，指向地址不能修改，但内部存储值可以修改。由于代码中p3=p1，地址均为初始化，直接指向常量区，所以*p3 = a出错，将两者语序调换即可，即p3 = a；*p3 = 'A'，则允许没有问题。前面的问题根据定义你自己修改下，比修改p3这两行代码容易~~

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

user: user-3
content: 指针常量是指针变量本身的内容不可以修改，比如数组名，不可以做左值； 常量指针，是指向的内容不可以修改。

user: user-4
content: 你可以运行一遍，出来错误原因，然后修改，有利于理解。 常量不能赋值和类型不能转换。

user: user-5
content: 指针常量与常量指针:  顾名思义, const char* p:   const 描述的是char*,char*是字符串嘛，等价于字符串是常量，不能改，就不要妄图通过指针引用去修改字符串咯。一改动编译器在编译代码时就可以检查出来. 但是p可不是哟，可以随时再指向其他字符串。  char* const p:  const 描述的是p,p是指针哟，等价于指针是常量，指针不能指别人咯。指别人编译器在编译代码时就可以检查出来
user-0 提问: PAT甲级    1002. A+B for Polynomials (25)

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  typedef struct Node{     double exp,coef;     struct Node *next; }*LinkList,Node;  LinkList createList(void) {     LinkList L;     L = (Node *)malloc(sizeof(Node));     L->next = NULL;     return L; } void insert(LinkList L,double exp,double coef) {     Node *p,*pre,*s;     p = L->next;     pre = L;     while(p && p->exp > exp){         pre = p;         p = p->next;     }     s = (Node*)malloc(sizeof(Node));     s->coef = coef;     s->exp = exp;     s->next = pre->next;     pre->next = s; } void plus(LinkList LA, LinkList LB) {     Node *p1,*p2,*pre,*temp;     pre = LA;     p1 = LA->next;     p2 = LB->next;     LA->next = NULL;     while(p1 && p2){         if(p1->exp > p2->exp){             pre->next = p1;             pre = p1;             p1 = p1->next;         }         else if(p1->exp < p2->exp){             pre->next = p2;             pre = p2;             p2 = p2->next;         }         else if(p1->exp == p2->exp){             p1->coef = p1->coef + p2->coef;             if(p1->coef != 0){                 pre->next = p1;                 pre = p1;                 p1 = p1->next;                 temp = p2;                 p2 = p2->next;                 free(temp);   /* free temp not p2*/                 //free(p2);             } else if(p1->coef == 0){                 temp = p1;                 p1 = p1->next;                 free(temp);                 temp = p2;                 p2 = p2->next;                 free(temp);             }         }     }     if(p1){         pre->next = p1;     }     else if(p2){         pre->next=p2;     }     free(LB);  } int Listlength(LinkList L) {     int k=0;     Node *p;      p = L->next;     while(p){         k++;         p = p->next;     }      return k; } void output(LinkList L) {     Node *p;     p = L->next;     while(p){         printf(" %.0lf %.1lf ",p->exp,p->coef);         p = p->next;     }     printf("\n"); } int main(void) {     int a,b,sum;     double exp,coef;     LinkList LA;     LinkList LB;      LB = createList();     LA = createList();     scanf("%d", &a);     while(a != 0){         scanf("%lf %lf", &exp, &coef);         insert(LA, exp, coef);         a--;     }     scanf("%d", &b);     while(b != 0){         scanf("%lf %lf",&exp, &coef);         insert(LB,exp,coef);         b--;     }     plus(LA,LB);     sum = Listlength(LA);     printf("%d\n", sum);     output(LA);     return 0; }  代码写的不错，有一个小问题，应该free(temp)，但是你释放的是p2，详见上面的代码；  其他地方也做了修改，但不是逻辑问题，而是个人习惯。比如 while(p1 && p2){ 你的判断是这样的： while(p1!=NULL&&p2!=NULL){ 这个地方需要理解的地方是，当p1 == NULL或p2 == NULL 时，则为假

user: user-0
user-0 提问: 怎么从一个不连通的图中找到连通的子图

回复:
user: user-1
content: 这个是根据路径得到节点关系吧 每拿到一张卡片，就对这两个节点标记连通，用同一个网络号来标记，如果这两个节点有一个已经有了网络号， 则另一个节点也赋予同样的网络号，如果两个都没有网络号，给一个新的网络号，如果两个都有了网络号 把两个网络合并（用一个网络号替换另一个网络号）。 最后按照网络号码累加力量值得到结果

user: user-0
content: 你的思想我也想过，但是用c语言实现起来还是比较困难的。看看还有没有别的方法？？

user: user-2
content: 并查集 为每个根节点额外保存一个值代表该组实力，合并时将根节点的实力值相加即可。