Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请教大佬们：#ifndef 和 #program once的区别

回复:
user: user-1
content: 因为新的不一定能完全淘汰旧的，所以只好新旧并存了。

user: user-2
content: #program once 不是平台相关，而是编译器相关。老的编译器不支持，至少八几年到九几年年初的都不支持，甚至零几年都有不支持的的编译器。该指令保证一个物理文件在一个源代码中只被绝对包含一次。比如 A.c 引用了 B.h 也引用了 C.h，而 C.h 里面也引用了 B.h。那么编译器保证 B.h 只被引用一次。而宏定义的方式， 仍以 B.h 为例。假定它的内容如下：#ifndef _B_H // 或 _XXX_INCLUDED 等，习惯命名，没有固定规则。 #define _B_H // 头文件体 #endif这样对于编译器而言的处理方式就是：如果没有定义常量 _B_H，就定义常量 _B_H，并引用整个头文件体。如果因为上述所说的嵌套引用导致了单个源文件中二次引用 B.h，由于第一次已经定义过 _B_H 常量，所以 #ifndef _B_H 这个判断就不成立，“定义常量 _B_H，并引用整个头文件体”这段就被跳过了。两种其实没有什么了不同，但是相对来说第一种更好的，第二种的弊端就是：一、预处理器要对要代码内容进行分析；二、保证同一个源代码引用的所有头文件中，该常量的名称不能有任何重复。因为这样的编译不是针对单个物理文件的，而是根据 _B_H 这个名字来的，如果和其他头文件的宏名字冲突了，则第二个引用的头文件可能不是物理上的同一个文件，但是仍然被排除，因此有可能导致莫名的编译错误。一般的，_B_H 的这个名字有两种规则：一是根据头文件文件名本身，加上前置一到多个下划线，全大写的文件名，以 _H 或 _INCLUDED 后缀结尾，如：_STDIO_H 或 __C_STDIO_H——当然，实际的头文件不一定如此，我只是举例。二是 IDE 自动生成，比如 VS 现在喜欢用一串随机生成的超长的名称做前缀，尽可能减少用户定义宏名称与系统的重复的可能性。如今的编译器几乎都支持 #pragma once，但也兼容老的指令，因此可能会在头文件顶部看到类似这样的内容：#pragma once #ifndef _XXX_H #define _XXX_H  // ... #endif上面这种通常出现在内置头文件，说明当前特定的编译器已支持这种语法。或者：#if _MSC_VER > 1000 #pragma once #endif #ifndef _XXX_H #define _XXX_H  // ... #endif上面这种通常出现在第三方的头文件，是因为编写头文件的人要适配任何编译器版本。这个简单例子比较常见，是判断微软 C 编译器版本不低于某个版本才使用这个功能，实际上可能有更复杂的，比如判断 Borland C++ Compiler、GCC 等，具体就不列举了。

user: user-3
content: 编写几个小程序试一下，理论联系实际嘛；

user: user-1
content: 以前没有#program once只有#ifndef

user: user-4
content: 我感觉博客解释的不错 多自己编一些程序实践一下吧  光说说不清的

user: user-5
content: #program once 平台相关 有的平台用来方式重复包含  有的平台用不了   #ifndef 用于防止重复包含是标准内存 在标准编译器里面都可以使用   另外 #ifndef 防止重复包含 只是一个常见用法 这个预编译指令用途不只是防止重复包含  他只是检查 后面的宏有没有定义 如果对应的宏有定义  就把对应的内容删除
user-0 提问: 关于读写文件

回复:
user: user-1
content: VS IDE中，在不明白的符号FILE上点鼠标右键，选转到定义。

user: user-2
content: 看看 FILE 结构体在哪里定义的。

user: user-3
content: void writePts(const CvMat* mat, struct FILE* f) 第二个参数，应该是去掉struct，直接是FILE *f吧

user: user-4
content: 你的struct FILE 并不是 标准库中的 FILE，去掉你struct FILE的定义

user: user-5
content: FILE本来就是一个结构：typedef struct XXX FILE; 前面再加struct有问题。 VS2015报错：“error C2371: “FILE”: 重定义；不同的基类型” 再看看函数writePts的声明和调用时传递的参数是否也有struct，一并去掉试试。

user: user-6
content: 去掉 struct

user: user-0
content: 引用第二个参数，应该是去掉struct，直接是FILE *f吧跟那个没有关系，去掉struct还是报同样的错， error C2664: “fprintf”: 不能将参数 1 从“FILE *”转换为“FILE *”
user-0 提问: 敲代码的方法

回复:
user: user-1
content: 学编程，要多思考，多实践，书上看懂了尽量不看书按自己的逻辑去写，到于速度方面你可以使用一些插件，比如VS下你可以使用VAX，通常输几个字母就可以自动补全，括号缩进等都自动的

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

user: user-3
content: 我觉得不要用带向导的软件，也不要经常复制粘贴代码节省时间，打代码就是要时间的积累，只有不断地练习，总结才能让个人成长-【个人见解】

user: user-4
content: 另外、初学的话、尽量50行以下的代码就行了， 要么是你前面基础没打好，要么是书的难度设置不太好。

user: user-4
content: 200多行代码、要是对你来说比较难的话。一个星期不算慢

user: user-5
content: 引用 3 楼 cfjtaishan 的回复:个人建议是先1后2，即先抄别人的，调试别人的，改动别人的，让自己有别人的思想，思路；然后做练习时就可以运用自己了解的思路去编写；  个人也是从抄别人到熟悉别人的思路，养成编程的思维。然后再根据自己的总结，独立写出实现新需求的代码； 表述错了，个人建议先2后1；

user: user-5
content: 个人建议是先1后2，即先抄别人的，调试别人的，改动别人的，让自己有别人的思想，思路；然后做练习时就可以运用自己了解的思路去编写；  个人也是从抄别人到熟悉别人的思路，养成编程的思维。然后再根据自己的总结，独立写出实现新需求的代码；

user: user-6
content: 第一遍，可以先按方法二，请注意：书上的程序不一定是对的！所以验证一遍，一来可以更好理解，二来甚至还可以知道书上的错误。但是方法一才是帮你真正学到东西的，慢也要坚持，最终你要利用学到的知识解决问题的，实际中的问题可跟书上不一样，属于方法一的提升。

user: user-7
content: 刚开始从简单代码入手，我记得我的第一个代码就是输出“hello world！”，那时候并没有特别关注敲代码的方法，但只要你坚持每天撸，等你代码量上一万行时你就会发现自己的水平有了一个质的提升。
user-0 提问: 关于序列点以及副作用的问题。

回复:
user: user-1
content: 另参看：关于C,C++表达式求值顺序 http://bbs.csdn.net/topics/370153775

user: user-1
content: 后置的++表示：先与65比较，比较完age自加1，比较完之后，age变为了21，此时不满足后面的if，故不进行输出，又进行下一次循环....

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

user: user-3
content: %20 值在0 - 19

user: user-4
content: 因为while循环比较条件时，age++是一个整体，因为其优先级高，所以先跟age结合，这样age++与65比较，即20 <= 65; 循环条件判断之后，然后age++，自然是21，所以循环体里的age是21

user: user-5
content: age++<=65 等价于 age <= 65; age += 1; age % 20 中age已经为21了
user-0 提问: 求帮助

回复:
user: user-1
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h>  int main() {     int num;     double sum = 0;      while(scanf("%d",&num)!= EOF)     {         if(num <= 70)             sum += 0.1;         else if(num > 70)         {             if(num % 70 == 0)                 sum += 0.1 * num / 70;             else                 sum += 0.1 * (num / 70 + 1);         }     }     printf("%.1lf\n", sum);      return 0; } 去掉一个头文件，逻辑可以微调一下，其他没问题； 另外，去掉一个变量，个人认为这个变量是多余的

user: user-1
content: #include <stdio.h>  int main() {     int num;     double sum = 0;      while(scanf("%d",&num)!= EOF)     {         if(num <= 70)             sum += 0.1;         else if(num > 70)         {             if(num % 70 == 0)                 sum += 0.1 * num / 70;             else                 sum += 0.1 * (num / 70 + 1);         }     }     printf("%.1lf\n", sum);      return 0; } 去掉一个头文件，逻辑可以微调一下，其他没问题；

user: user-2
content: #include <stdio.h> #include <stdlib.h> int main() {     int num;     double sum=0,sum3=0;     while(scanf("%d",&num)!= EOF)     {         if(num<=70)               sum=0.1;         else              (num%70) ? (sum=0.1*(num/70+1)) :  (sum=0.1*num/70);        sum3 += sum;     }     printf("%.1lf",sum3);     return 0; }
user-0 提问: C语言 数组问题

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

user: user-2
content: #define MAX_STACK_SIZE 100; #define FALSE 1; #define TRUE 0; #define ERROR -1; 第一个问题，宏定义需要都去掉分号；  int InitStack(Stack *sta) {     sta->base = (Node*)malloc(sizeof(Node) * MAX_STACK_SIZE);     if (sta->base == NULL) {         return FALSE;     }     sta->top = sta->base;     sta->stacksize = MAX_STACK_SIZE;     return TRUE; } 第二个问题，应该传地址到InitStack函数，这样才能获取申请的空间； 并且申请的大小应该乘以MAX_STACK_SIZE;

user: user-3
content: ElemType Point[][3]= {0}; 等价于 Point[1][3] = {0}; InitPoint 会出现越界访问数组Point  可能原本的想法是  ElemType Point[12][3] = {0};

user: user-0
user-0 提问: 求助，求助C语言结构体

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

user: user-2
content: 还有其他的问题： 1.create_list函数中，第一次分配内存是给了L，而循环中是输入到p中，注意第一次循环时p是个野指针。应该改为第一次分配内存就给p。 2.函数M做什么用的？看起来好像有排序，但La和Lb都不是有序链表，M做排序有什么意义？搞清楚目标，才知道这个函数该怎么改。

user: user-3
content: LinkList是struct LNODE **的别名，因此，LinkList *L就是struct LNODE **L;所以，L无法直接使用next结构体成员，需要(*L)->next; M 函数里一样； pa = (*La)->next; pb = (*Lb)->next;  程序存在内存泄露，比如La和Lb链表插入到Lc链表里，没有用到的La或Lb节点应该free掉；

user: user-2
content: 请注意，你已经把LinkList定义为struct LNODE *了，因此所有的LinkList *都是struct LNODE **。比如create_list中的这一句：  L->next = NULL;  应该改为  (*L)->next = NULL;   其他各处也按此修改。
user-0 提问: 初学者求帮助

回复:
user: user-1
content: 看来已经解决。

user: user-2
content: 引用 6 楼 zhao4zhong1 的回复:scanf函数的内部实现源代码就是crt\src\input.c，你调用scanf，变量前忘加&，导致input.c中的对应语句写非法内存，故弹出input.c，显示写非法内存的那句话。  其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。 正解！

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-3
content: scanf中%d对应的输入变量，需要加& 出现截图二的原因是程序调试遇到问题，到编译的底层，或者汇编

user: user-2
content: scanf函数的内部实现源代码就是crt\src\input.c，你调用scanf，变量前忘加&，导致input.c中的对应语句写非法内存，故弹出input.c，显示写非法内存的那句话。  其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

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

user: user-0
content: 我知道错在哪里，我意思是当我调试的时候弹出来了 我想问问这个是什么东西，为什么会弹出来这个，

user: user-4
content: scanf("%d", year); 改成 scanf("%d", &year);

user: user-5
content: scanf第二个参数应该是地址，即输入的数据写到该地址开始的4个字节里，因为year是int，占4个字节； 但是现在是year，首先定义时，year没有初始化，所以是随机值。那么，若不加&，即想year所在的内存里写数据，year是随机值，这个地址就是year所开始的位置； 建议先把year这个随机值打印出来，建议用%u打印或%x，因为地址是无符号数。看看这个随机值是不是编译器提示的地址值。
user-0 提问: 递归中的参数是如何变化的？

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

user: user-2
content: 这里len是值传递，所以len在每次调用HuffManCoding返回时保持调用前的值，永远记住这一点。

user: user-3
content: 建议在函数里static int a[10];后添加一句   printf("len = %d\n", len);  这样每次递归都能看到传进来的len的值，也就可以看到其变化了。
user-0 提问: 用c编了一个温度对照表，运行正常，但是没有任何显示

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

user: user-2
content: while 后面是不是多了个分号？

user: user-0
content: 噢，这样啊。谢谢。

user: user-3
content: 去掉while();后面的分号即可； 若在while后面加分号，那么while就没有循环体了。
user-0 提问: C语言类型定义导致指针为NULL

回复:
user: user-1
content: 引用 4 楼 destory27 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 lin5161678 的回复:] unsigned char 1个字节 假设 int 4个字节 scanf %d 会向参数指定的内存写入4个字节的数据 但chosse只有1个字节 所以有3个字节是越界写入 这里刚刚好写到了 P_page的内存里面了 修改了P_page的数据  所以 scanf 格式控制字符 要和参数的类型 对应 所以 不要出现数组越界的操作 有可能是这种情况导致的。 建议将choose定义成unsigned int或int类型。对应的scanf输入格式%u和%d 主要是%d是4个字节，unsigned char是一个字节；[/quote]  我用unsigned char 主要是 我要存的值很小，1个字节够了[/quote] 如果内存不紧张，即使是用一个字节，那么定义成int类型又何妨？

user: user-2
content: unsigned char 1个字节 假设 int 4个字节 scanf %d 会向参数指定的内存写入4个字节的数据 但chosse只有1个字节 所以有3个字节是越界写入 这里刚刚好写到了 P_page的内存里面了 修改了P_page的数据  所以 scanf 格式控制字符 要和参数的类型 对应 所以 不要出现数组越界的操作

user: user-3
content: unsigned类型不能用%d去接收输入

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 lin5161678 的回复:] unsigned char 1个字节 假设 int 4个字节 scanf %d 会向参数指定的内存写入4个字节的数据 但chosse只有1个字节 所以有3个字节是越界写入 这里刚刚好写到了 P_page的内存里面了 修改了P_page的数据  所以 scanf 格式控制字符 要和参数的类型 对应 所以 不要出现数组越界的操作 有可能是这种情况导致的。 建议将choose定义成unsigned int或int类型。对应的scanf输入格式%u和%d 主要是%d是4个字节，unsigned char是一个字节；[/quote]  我用unsigned char 主要是 我要存的值很小，1个字节够了

user: user-1
content: 引用 2 楼 lin5161678 的回复:unsigned char 1个字节 假设 int 4个字节 scanf %d 会向参数指定的内存写入4个字节的数据 但chosse只有1个字节 所以有3个字节是越界写入 这里刚刚好写到了 P_page的内存里面了 修改了P_page的数据  所以 scanf 格式控制字符 要和参数的类型 对应 所以 不要出现数组越界的操作 有可能是这种情况导致的。 建议将choose定义成unsigned int或int类型。对应的scanf输入格式%u和%d 主要是%d是4个字节，unsigned char是一个字节；
user-0 提问: C语言3个数求最大数的问题

回复:
user: user-1
content: #include <stdio.h> int main() { 	int a , b, c , t; 	int *p1, *p2, *p3 ; 	scanf("%d%d%d",&a,&b,&c); 	 p1=&a; 	 p2=&b; 	 p3=&c; 	 if(*p1>*p2) 	 { 		 t=*p1; 		*p1=*p2; 		 *p2=t; 	 } 	 if(*p1>*p3) 	 { 		 t=*p1; 		 *p1=*p3; 		 *p3=t; 	 } 	 if(*p2>*p3) 	 { 		 t=*p2; 		 *p2=*p3; 		 *p3=t; 	 } 	 printf("%d,%d,%d\n",*p1,*p2,*p3); 	 return 0; }

user: user-2
content: #include<stdio.h>      int max(int x,int y,int z);  int main() {     int a,b,c,d;     scanf("%d,%d,%d",&a,&b,&c);      d = max(a,b,c);     printf("max=%d\n",d);     return 0; } int max(int x,int y,int z) {     int e,f;     if(x>y)         e=x;     else         e=y;     if(e>z)         f=e;     else         f=z;     return(f); } 函数声明建议放在main函数外，man函数之上。其他逻辑没问题； 输入的时候注意加,比如输入:5,8,2；否则无法和a,b,c一一匹配。这是因为scanf中格式%d,%d,%d要求的。

user: user-3
content: 楼主你输入的时候要这样打:a,b,c 不然b,c都传不进去，代码本身没问题，如果你想这样打a b c，那么请改为这样输入:scanf("%d %d %d",&a,&b,&c);

user: user-4
content: #include<stdio.h> int max(int*p1,int*p2,int*p3) { 	int max; 	max=*p1; 	if(max>*p2&&max>*p3) 	{ 	return max; 	} 	else if(max<*p2&&*p2>*p3) 	{ 		max=*p2; 		return max; 	} 	else 	{ 		max=*p3; 		return max; 	} } int main() { 	int a,b,c,d; 	int*p1=&a;int*p2=&b;int*p3=&c; 	scanf("%d,%d,%d",&a,&b,&c); 	d=max(p1,p2,p3); 	printf("%d\n",d); 	return 0; }

user: user-5
content: 有什么问题？

user: user-6
content: 代码没问题啊
user-0 提问: 文件读取练习题的问题

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  int main(void) {     char str[10] = {0};     FILE *fp,*fp2;     if((fp=fopen("test.txt","r"))==NULL)     {         printf("cannot open this file.\n");         exit(0);     }     if((fp2=fopen("test2.txt","w"))==NULL)     {         printf("cannot open this file.\n");         exit(0);     }     while(!feof(fp))//设置断点的行         fputc(fgetc(fp),fp2);     rewind(fp);    /* or fseek(fp, 0l, SEEK_SET);*/     fgets(str,3,fp);//出问题的地方     printf("%s",str);     fclose(fp);     fclose(fp2);     return 0; } 改一下fp的位置，使用rewind或fseek

user: user-2
content: fp这个指针的值不会变，但文件位置指针会变化（不是fp），你读一个字节就往后移动一个，你可以用fseek设置文件指针位置，可以用ftell得到文件指针离开头的偏移距离
user-0 提问: 哪里出现问题

回复:
user: user-1
content: i 没初值     scanf() 执行一次

user: user-2
content: 使用循环输入,只输入一个是不行的。  for (i = 0; i < 10; i++)     scanf("%d", &a[i]);   导致程序挂到的原因是内存越界； 开始i是随机值，可能很大。然后scanf("%d", &a[i]); a[i]就已经越界了（下表不能超过9，<=9)；所以会导致多错误； 若现将i = 0;就不会出现程序无法继续运行，只不过数组除了第一个元素是固定的，其他都是随机值。

user: user-3
content: 1数组要进行初始化 2赋值循环进行。

user: user-4
content: for(i = 0; i < 10; ++i) {     scanf("%d", &a[i]); }

user: user-5
content: 错误太明显了，你的i未初始化就用scanf来输入数据，看你的意思，最起码也得用个for循环输入吧
user-0 提问: 未使用的变量会被编译器优化掉么？会分配内存么？

回复:
user: user-1
content: 不同编译器，就VS来说的话，debug模式下一般是不会优化掉未使用的局部变量的，release模式下就比较凶残了，就连使用的空函数体都会被优化掉，for循环都帮你展开

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执行停在该断点处的时候。

user: user-3
content: subq $4194336,%rsp这才是分配局部变量空间，不是你指的那行。

user: user-4
content: 编译优化也会分级别，gcc -O1(或2），每个优化级别分别做不同的优化；建议查询一下优化级别；  若不用的变量，编译器一般会提示，若能优化则最好，若不会优化会占用内存空间。建议不适用的变量直接删掉；  另外，不建议在函数内定义较大的数组，比如1024 * 1024；因为栈上的空间是有限的，在栈上使用较大的空间会影响程序的运行效率

user: user-5
content: 优不优化没有明确规定，不同编译器有不同处理。 即使是同一编译器，比如gcc， 不加优化选项时：https://godbolt.org/g/JSquKz 加-O1时：https://godbolt.org/g/ZexJfN

user: user-6
content: Debug下不会被优化，Release通常是会被优化掉的
user-0 提问: C中的一道和大数有关的题目，不会做，各位大佬提个意见呗

回复:
user: user-0
content: C中现有的数据类型满足不了这个大数的，想着用数组做，不知道如何实现，数据太大了。

user: user-1
content: 直接求数太多了，，，可以先找出每个数的因子，，在因子中找满足条件的   感觉也比较复杂 意见而已

user: user-2
content: 运行的时间非常久，算法比较普通  仅供参考 #include <stdio.h>    #define N 10000000000  int main(int argc, char *argv[]) {         unsigned long long j,k,sum = 0;         for(k=2;k<=N;k++)         {                 sum=0;                 for(j=1;j<=k/2;j++)                         if(k%j==0)                                 sum=sum+j;                 if(sum==k)                         printf("%lld\n",k);         }          return 0; }
user-0 提问: 二维数组的输入

回复:
user: user-1
content: 引用 2 楼 m0_37243410 的回复:int a[n][m];  for(int i=0;i<n;i++)      for(int j=0;j<m;j++)      scanf("%d",&a[i][j]);  scanf()不需要回收垃圾字符，遇到空格或者Enter回车结束数据在读入 引用 2 楼 m0_37243410 的回复:int a[n][m];  for(int i=0;i<n;i++)      for(int j=0;j<m;j++)      scanf("%d",&a[i][j]);  scanf()不需要回收垃圾字符，遇到空格或者Enter回车结束数据在读入    scanf 需要回收垃圾   int main(void) { 	int a; 	 	while((scanf("%d", &a)) == 0) 	{ 		//fflush(stdin);  或  getchar();    若没有  死循环 		printf("secew"); 	} 	printf("%d", a); 	 	return 0; }

user: user-2
content: int a[n][m];  for(int i=0;i<n;i++)      for(int j=0;j<m;j++)      scanf("%d",&a[i][j]);  scanf()不需要回收垃圾字符，遇到空格或者Enter回车结束数据在读入

user: user-3
content: 两层for循环呗，注意用getchar()回收垃圾字符
user-0 提问: PTA B1057.c 数零壹

回复:
user: user-1
content: char str[100001];

user: user-2
content: #include<stdio.h> int main(void) {     int s,l=0,y=0;     char c;     do     {         scanf("%c",&c);         if ((c>='a')&&(c<='z')) s+=c-96;         if ((c>='A')&&(c<='Z')) s+=c-64;     }while(c!='\n');     while(s!=0)     {         if(s%2==0) l++;         else y++;         s=s/2;     }     printf("%d %d\n",l,y);     return 0; }  这是我的程序，都过了，希望能帮到你

user: user-3
content: fgets代替gets要注意去掉最末尾的'\n'

user: user-4
content: #include<stdio.h> #include<string.h> #include <ctype.h>  #define     MAX_STR_LEN     128  int get_char_value(const char *str, int len); void count_bits(unsigned int num, int *arr);  int main() {     char str[MAX_STR_LEN];     int bits[2] = {0};     int val;      fgets(str, MAX_STR_LEN, stdin);      val = get_char_value(str, strlen(str));     printf("val = %d\n", val);     count_bits(val, bits);      printf("0: %d, 1: %d\n", bits[0], bits[1]);     return 0; }  int get_char_value(const char *str, int len) {     int i = 0, sum = 0;      while (i < len) {         if (islower(str[i]))             sum += str[i] - 'a' + 1;         else if (isupper(str[i]))             sum += str[i] - 'A' + 1;         i++;     }     return sum; }  void count_bits(unsigned int num, int *arr) {     int i = 31;     while (i > 0 && (num & (1<<i)) == 0)         i--;     arr[1]++;      for (; i > 0; i--)         if ((num & (1 << i)))             arr[1]++;         else             arr[0]++; } 参考一下吧

user: user-0
content: 给定一串长度不超过105的字符串，本题要求你将其中所有英文字母的序号（字母a-z对应序号1-26，不分大小写）相加，得到整数N，然后再分析一下N的二进制表示中有多少0、多少1。例如给定字符串“PAT (Basic)”，其字母序号之和为：16+1+20+2+1+19+9+3=71，而71的二进制是1000111，即有3个0、4个1。  输入格式：  输入在一行中给出长度不超过105、以回车结束的字符串。  输出格式：  在一行中先后输出0的个数和1的个数，其间以空格分隔。  输入样例： PAT (Basic) 输出样例： 3 4   这是题目要求，谢谢你提的建议哦

user: user-4
content: 建议楼主贴出程序需求和测试用例。 程序可以优化的地方是太大的数组建议定义成全局变量；
user-0 提问: 写一个函数，用起泡法对输入的10个字符按由小到大顺序排列

回复:
user: user-0
content: 不要意思呀 我都弄傻了 没看到交换语句那里是怎么搞出来的错误 但是我改成int类型 出来的结果是五个空格12345

user: user-1
content: #include <stdio.h> int main() { 	int a[10]; 	int i,j,k; 	printf("input 10 numbers :\n"); 	for(i=0;i<10;i++) 		scanf("%d",&a[i]); 	printf("\n"); 		for(j=0;j<9;j++) 			for(i=0;i<9-j;i++) 				if(a[i]>a[i+1]) 				{ 					k=a[i];a[i]=a[i+1];a[i+1]=k; 				} 				printf("the sorted number :\n"); 				for(i=0;i<10;i++) 					printf("%d\n",a[i]); 				printf("\n"); 				return 0; }

user: user-2
content: #include <stdio.h>   void q(char a[10]) {     char t;     int i,j,k;     for(i=0;i<9;i++)      {           k=i;         for(j=i+1;j<10;j++)             if(a[i] > a[j])               {                k=j;             }             if(i!=k)               {t=a[i];a[i]=a[k];a[k]=t;}      } } int main() {     int i;     char a[10];       printf("请输入10个字符");     for(i=0;i<10;i++)         scanf("%c",&a[i]);     q(a); 	for(i=0;i<10;i++) 	printf("%c\n",a[i]);     return 0;   } 也可以这样写

user: user-3
content: #include <stdio.h>  char q(char a[10]) {     char t;     int i,j;     for(i=0;i<9;i++)         for(j= 0;j<10-1 - i;j++)             if(a[j] > a[j+1])    /*这儿应该是判断，而不是赋值*/             {                 t      = a[j];                 a[j]   = a[j+1];                 a[j+1] = t;             }     for(i=0;i<10;i++)         printf("%c",a[i]);      return 0; } int main() {     int i;     char a[10];      printf("请输入10个字符");     for(i=0;i<10;i++)         scanf("%c",&a[i]);     q(a);     printf("\n");      return 0;  } 参考一下吧；注意if后的括号里是判断表达式，不应该是赋值表达式；

user: user-4
content: 算法有一小部分问题，重点是数据类型不太对。如果定义为char类型 你那样就算是输入19个数据了    输入的10就算是两个char类型的数据

user: user-5
content: if(a[i]>a[j]){t=a[i];a[i]=a[j];a[j]=t;} 由小到大排序应该这样吧

user: user-6
content: if(a[i]<a[j]){t=a[i];a[i]=a[j];a[j]=t;}交换要这么写啊。其他有没有问题不知道了，没调试。
user-0 提问: 誠心求助，一点小疑问，关于梯形法与辛普森法积分的

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

回复:
user: user-1
content: 不说别的，就这个缩进本身就有问题：while (num) { 	tmp = num%10; 	// 这不是 python。if 之后没有花括号，作用范围只有一行“num += 1;”。 	if (tmp % 2 != 0) 		num += 1; 		result = (num % 10) * pow(10,i) + result; 	i++; 	num /= 10; }

user: user-2
content: 全局变量默认初始值是0,局部变量没有初始值，给数组某个元素赋值，其它元素并没有被赋值。

user: user-3
content: 不对，其他值仍然是垃圾值。

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

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

user: user-6
content: 测试一下，我记得是定义的时候赋值例如:int a[10]={0};那么a的全部都为0，如果是int a[10]; a[0]=0;那么只赋值了a[0] 其他都未知值(随机整数) 一些数组初始化也可用memset(a,0,sizeof(a));去给数组全赋值0，或者full(a,0)

user: user-7
content: 做编程，还是要多动手，敲敲代码，这样印象深刻

user: user-8
content: 不对，对任意元素赋值，并不会改变其余元素的值

user: user-9
content: 引用 8 楼 qq_37347705 的回复:咦，不对吧。  :!./a.out 0 0 0 0 4195712 10 4195392 0 1948630112 32767     楼上的代码，这是结果。 所以，若定义时不对数组初始化，然后对任意元素赋值，不会导致其他元素都位0；

user: user-10
content: 咦，不对吧。  :!./a.out 0 0 0 0 4195712 10 4195392 0 1948630112 32767     楼上的代码，这是结果。

user: user-9
content: 引用 6 楼 darker0019527 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 建议楼主试一下，结果是否定的。对某个下表对应的数组元素赋值，只能改变对应的元素值，而不能对其他元素有影响； int a[5] = {0};  这句话是对a[0]赋值还是对数组 [/quote] 这个是对数组初始化；即所有元素都初始化位0；  如果对数组任意元素赋值，那么数组的其它元素就会被赋值为 0 这句话，怎么理解呢？ 我的理解是这样的，比如： #include <stdio.h>   int main(void) {     int arr[10];       arr[5] = 10;       for (int i = 0; i < 10; i++)         printf("%d\n", arr[i]);     return 0; }

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:建议楼主试一下，结果是否定的。对某个下表对应的数组元素赋值，只能改变对应的元素值，而不能对其他元素有影响； int a[5] = {0};  这句话是对a[0]赋值还是对数组

user: user-0
content: int a[5] = {0};  这句话是对a[0]赋值还是对数组

user: user-9
content: 建议楼主试一下，结果是否定的。对某个下表对应的数组元素赋值，只能改变对应的元素值，而不能对其他元素有影响；

user: user-9
content: 引用 1 楼 user-11 的回复:对  你尝试一下不就可以了吗= = 引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 user-11 的回复:] 对  你尝试一下不就可以了吗= = 对吗？ 尝试一下对不对； #include <stdio.h> #include <math.h>  int change_to_pmh_number(int num) {     int i = 0;     int tmp, result = 0;      while (num) {         tmp = num%10;         if(tmp % 2 != 0)             num += 1;             result = (num % 10) * pow(10,i) + result;         i++;         num /= 10;     }      return result; }  int main( void ) {     int num;      while (scanf("%d", &num) != EOF)         printf("%d\n", change_to_pmh_number(num));      return 0; }[/quote] 发错了 #include <stdio.h>  int main(void) {     int arr[10];      arr[5] = 10;      for (int i = 0; i < 10; i++)         printf("%d\n", arr[i]);     return 0; }

user: user-9
content: 引用 1 楼 user-11 的回复:对  你尝试一下不就可以了吗= = 对吗？ 尝试一下对不对； #include <stdio.h> #include <math.h>  int change_to_pmh_number(int num) {     int i = 0;     int tmp, result = 0;      while (num) {         tmp = num%10;         if(tmp % 2 != 0)             num += 1;             result = (num % 10) * pow(10,i) + result;         i++;         num /= 10;     }      return result; }  int main( void ) {     int num;      while (scanf("%d", &num) != EOF)         printf("%d\n", change_to_pmh_number(num));      return 0; }

user: user-11
content: 对  你尝试一下不就可以了吗= =
user-0 提问: 请问如何把txt中的字符用c转为二维向量

回复:
user: user-1
content: ..文件读取 用fstream 或者FILE fscanf

user: user-0
content: 引用 1 楼 user-1 的回复:int arr[height][wide]; char ch; for(int i=0;i<height;++i) 	for (int j = 0; j < wide; ++j) { 		scanf("%c", &ch); 		arr[i][j] = ch == '1' ? 1 : 0; 	}  这样？ 请问那ch要怎么从txt中间读取呢。。。

user: user-1
content: int arr[height][wide]; char ch; for(int i=0;i<height;++i) 	for (int j = 0; j < wide; ++j) { 		scanf("%c", &ch); 		arr[i][j] = ch == '1' ? 1 : 0; 	}  这样？
user-0 提问: 关于c语言动态规划0-1背包问题

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

user: user-2
content: 给你认为可能发生错误的地方插入断点，进行调试

user: user-0
content: 上面程序是从底层到顶层打表，但是运行时输入完数据显示exe.已停止工作？？哪里错了

user: user-0
content: #include <stdio.h> int v[1000]; int w[1000]; int m[1000][1000]; int x[1000];  int main() {     int i,j,n,c;     scanf("%d%d",&n,&c);     getchar();     for(i=1; i<=n; i++)     {         scanf("%d",&w[i]);     }     getchar();     for(i=1; i<=n; i++)     {         scanf("%d",&v[i]);     }     for(j=0;i<=c;j++)     {         if(j>=w[n])             m[n][j]=v[n];         else             m[n][j]=0;     }     for(i=n-1;i>=1;i--)     {         for(j=0;j<=c;j++)         {             if(j>=w[i])                 m[i][j]=m[i+1][j]>(m[i+1][j-w[i]]+v[i])?m[i+1][j]:m[i+1][j-w[i]]+v[i];             else                 m[i][j]=m[i+1][j];          }     }     printf("最大值是： %d\n",m[1][c]);     for(i=1;i<n;i++)     {         if(m[i][c]==m[i+1][c])             x[i]=0;         else         {             x[i]=1;             c=c-w[i];         }     }     if(m[n][c]!=0)         x[n]=1;     else         x[n]=0;     printf("最优解是： ");     for(i=1;i<=n;i++)     {         printf("%d ",x[i]);     }     return 0;   }
user-0 提问: 请问如何把一个数变成所有位数均是偶数的数？

回复:
user: user-0
content: 感谢各位的帮助

user: user-1
content: #include <stdio.h> #include <math.h>  int change_to_pmh_number(int num) {     int i = 0;     int tmp, result = 0;      while (num) {         tmp = num%10;         if(tmp % 2 != 0)             num += 1;             result = (num % 10) * pow(10,i) + result;         i++;         num /= 10;     }      return result; }  int main( void ) {     int num;      while (scanf("%d", &num) != EOF)         printf("%d\n", change_to_pmh_number(num));      return 0; } 参考一下吧

user: user-1
content: 引用 1 楼 wyyy2088511 的回复:#include <stdio.h> int Pow(int x, int y) { 	int result =1;      for(int i=0; i<y; i++) 	 { 	    result  = result*x; 	 } 	 return result; } int ChangeNum(int num) { 	int tmp; 	int result; 	int i=0;     while(num) 	{ 		tmp = num%10; 	    if(tmp%2!=0) 		{ 		    num+=1; 		} 		if(i!=0) 		{ 			result = (num%10)*Pow(10,i)+result;		 		} 		else 		{ 		    result = num%10; 		} 		i++; 		num/=10; 	} 	return result; } void main( void ) { 	int N[]={3,88,298,909,9999,99998};  	for(int i=0; i<sizeof(N)/4; i++) 	{ 	    printf("%d\n",ChangeNum(N[i])); 	}    getchar(); } #include <stdio.h> #include <math.h>  int ChangeNum(int num) {     int i = 0;     int tmp, result = 0;      while (num) {         tmp = num%10;         if(tmp % 2 != 0)             num += 1;             result = (num % 10) * pow(10,i) + result;         i++;         num /= 10;     }      return result; }  int main( void ) {     int N[]={3,88,298,909,9999,99998};     int i;      for(i=0; i<sizeof(N)/4; i++)     {         printf("%d\n",ChangeNum(N[i]));     }     getchar();      return 0; } 这样是不是更好一些，减少对i的判断；  if(i!=0) { result = (num%10)*Pow(10,i)+result; } else {     result = num%10; } 把result赋值为0；

user: user-2
content: #include <stdio.h> int Pow(int x, int y) { 	int result =1;      for(int i=0; i<y; i++) 	 { 	    result  = result*x; 	 } 	 return result; } int ChangeNum(int num) { 	int tmp; 	int result; 	int i=0;     while(num) 	{ 		tmp = num%10; 	    if(tmp%2!=0) 		{ 		    num+=1; 		} 		if(i!=0) 		{ 			result = (num%10)*Pow(10,i)+result;		 		} 		else 		{ 		    result = num%10; 		} 		i++; 		num/=10; 	} 	return result; } void main( void ) { 	int N[]={3,88,298,909,9999,99998};  	for(int i=0; i<sizeof(N)/4; i++) 	{ 	    printf("%d\n",ChangeNum(N[i])); 	}    getchar(); }
user-0 提问: 大神们求教

回复:
user: user-1
content: 引用 8 楼 hdt 的回复:你是要11进制数？？ int a = (55-44)%11???

user: user-2
content: 直接在printf里写。。。囧！

user: user-3

user: user-4
content: ???? 能否说明白一点

user: user-5
content: 你是要11进制数？？ int a = (55-44)%11???

user: user-1

user: user-6
content: 我的语文需要去补习了

user: user-7
content: 问题描述不清，55-44怎么会等于-11和0

user: user-8
content: 先弄明白55-44怎么能得-11（注意前面有-）； 建议楼主把需求详细描述一下，不然颠覆计算机计算规律恐怕不行呢

user: user-9
content: 感觉楼主好厉害的样子
user-0 提问: C语言实现从大到小的数据排序问题

回复:
user: user-1
content: #include <stdio.h> int main() { 	int a[10]; 	int i,j,k; 	printf("input 10 numbers :\n"); 	for(i=0;i<10;i++) 		scanf("%d",&a[i]); 	printf("\n"); 		for(j=0;j<9;j++) 			for(i=0;i<9-j;i++) 				if(a[i]>a[i+1]) 				{ 					k=a[i];a[i]=a[i+1];a[i+1]=k; 				} 				printf("the sorted number :\n"); 				for(i=0;i<10;i++) 					printf("%d\n",a[i]); 				printf("\n"); 				return 0; }

user: user-2
content: #include <stdio.h> #include <stdlib.h>  void sort(int x[],int n); /*函数要先声明后使用*/ int main() {     int i,a[10];     printf("please enter 10 interger numbers:");     for (i = 0; i < 10; i++)         scanf("%d",&a[i]);     sort(a,10);   /* 函数调用去掉void*/     for(i=0;i<10;i++)     {         printf("%d\n",a[i]);     }     return 0; } void sort(int x[],int n) {     int i,j,k;     for(i=0;i<n;i++)     {         for(j=i+1;j<n;j++)         {             if(x[i] < x[j])             {                 k = x[i];                 x[i] = x[j];                 x[j] = k;             }         }     } }  参考一下吧；问题详见注释； 排序算法没问题，主要是在函数调用和声明上～

user: user-3
content: for(j=i+1;j<n;j++)这里j应该从0开始，否则排序不完整
user-0 提问: C语言数组和指针的变换，求大神解决

回复:
user: user-1
content: 建议提供一下str的定义。因为改表达式应该怎么赋值，是&str[i]，还是str[i]跟str的类型有很大关系； 若str是字符类型的指针数组，那么这样赋值char *tmp = str[i];是没问题的。 若str是字符数组，那么需要char *tmp = &str[i]; 或char *tmp = str + i;

user: user-2
content: 引用 4 楼 qq_41093250 的回复:[quote=引用 2 楼 Intel0011 的回复:] 如果定义char *str[10]; 则char *tmp = str[i]; OK 如果定义char str[10]; 则char *tmp = &str[i]; OK 能不能详细说一下为啥啊[/quote] 如果定义char *str[10]; 则str数组有10个元素，每个元素的类型是char *，所以str[i]的类型也是char * 因此char *tmp = str[i];可以通过编译，类型相同  如果定义char str[10]; 则str数组有10个元素，每个元素的类型是char，所以str[i]的类型也是char 因此char tmp = str[i];可以通过编译，类型相同  教程的基本概念而已，加油

user: user-0
content: 引用 2 楼 Intel0011 的回复:如果定义char *str[10]; 则char *tmp = str[i]; OK 如果定义char str[10]; 则char *tmp = &str[i]; OK 能不能详细说一下为啥啊

user: user-3
content: char *tmp = str[i];是相当于直接指针的初始化值 如果是:char *tmp;            //声明变量是指针变量 tmp=&str[i]                           //初始化指针的，指针的内容为地址，所以赋值为地址

user: user-2
content: 如果定义char *str[10]; 则char *tmp = str[i]; OK 如果定义char str[10]; 则char *tmp = &str[i]; OK

user: user-4
content: str[i]的类型是char*指针,不然编译不通过的
user-0 提问: 关于动态分配内存的结构体数组 数据输入时内存错误的问题

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

user: user-2
content: printf("请输入新学员姓名\n"); scanf("%s,a[count].name"); 这个地方需要改一下，注意双引号的位置； printf("请输入新学员姓名\n");     scanf("%s", a[count].name);  同理这条语句的双引号注意位置： printf("%d\n",a[i].score);  另外程序有越界的问题，malloc申请了2个学生信息的空间，但是循环后又加了1个，所以第三是越界；

user: user-3
content: 编译了一下,错误是double free,很明显是free出错了,addAStudent函数无法改变实参a,导致free两次
user-0 提问: 有一个关于栈的问题，还有就是Tc2.0怎么使用单步跟踪，求大佬教教

回复:
user: user-1
content: 引用 7 楼 Rewen 的回复:一个是step in , 一个是 step over. 遇到函数调用时，step in 进入函数内部；step over不进入函数内部。

user: user-2
content: 一个是step in , 一个是 step over.

user: user-0
content: 老师，按F7或F8键单步跟踪，F7，F8我试过了，感觉二者没有什么区别呢，求指教。

user: user-1
content: 在DosBox下使用TC2 按F7或F8键单步跟踪。

user: user-3
content: 因为是指针，定义的e.seat是野指针，所以必须给其分配有效的空间。 如果不想每次都分配，那么直接定义成结构体变量。这样定义e的时候也会对seat分配sizeof(Postype)的空间；

user: user-4
content: 我是看到tc2.0来的，这个软件比csdn上多数人的年龄都要大了吧 菜单上有单步执行的快捷键可以查看吧

user: user-5
content: 为什么要用TC2.0？

user: user-6
content: 我这个结构的堆栈，堆栈元素里面有一个一级指针，主函数里面只声明了一个SElemType类型的e，所以每次Push时，都需要先对e.seat分配空间，不然Pop的e的seat就会出错，请问除了每次分配，还有其他的办法吗？    因为 seat   是  Postype*类型  存放结构体的指针， 不分配内存，结构体中的数据指针存放溢出 若不分配内存   定义为Postype seat;
user-0 提问: 小数转指数的问题

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

user: user-2
content: 这个100.1=1.001*2^2 不就是小数点向左移动吗，它不代表乘以4，1.001*2^2=100.1 小数点向右移动变成100.1，为什么？二进制相乘啊，1.001*2^2=1.001*100.0,你试试算算是不是100.1，二进制相乘而已！

user: user-3
content: 楼主的1.001 * 2^2这儿的1.001是十进制还是二进制，这个要确定好了。 另外，C语言里是不能用10^2，表示10 * 10;在C语言里^是异或运算符；所以 100.1=1.001*10^2 这句只是数学上的可行；在C语言里^不是幂； 100.1=1.001*2^2  这句是否成立，建议注意一下相等的环境（是10进制还是二进制）

user: user-4
content: 所谓语言，并不是直接就是物体的本身。只不过是对物体一个描述，如果深究的话，他的文字确实有欠严禁。 就拿你的例子来说,尾数我就不在这里考虑了 100（二进制）=1(二进制)×（100（二进制））=1(二进制)X2（十进制）X2（十进制）

user: user-0
content: 引用 1 楼 hdt 的回复:二进制100.1转成十进制是多少？？？ 二进制100不就是4吗？ 后面的尾数，请自己考虑 帮我看下这个吧，图片里说任何一个数都可以表示成1.xxxxxx*2^n 这样的形式，55.234也能表示成1.几的指数形式吗

user: user-4
content: 引用 2 楼 fafagb 的回复:[quote=引用 1 楼 hdt 的回复:] 二进制100.1转成十进制是多少？？？ 二进制100不就是4吗？ 后面的尾数，请自己考虑  100.1=1.001*100=1.001*10^2  100.1=1.001*100=1.001*2^2  你的意思是4的2进制是100*2^2的结果是1.001*100，为什么要用100*2^2这种写法？[/quote]

user: user-0
content: 引用 1 楼 hdt 的回复:二进制100.1转成十进制是多少？？？ 二进制100不就是4吗？ 后面的尾数，请自己考虑  100.1=1.001*100=1.001*10^2  100.1=1.001*100=1.001*2^2  你的意思是4的2进制是100*2^2的结果是1.001*100，为什么要用100*2^2这种写法？

user: user-4
content: 二进制100.1转成十进制是多少？？？ 二进制100不就是4吗？ 后面的尾数，请自己考虑
user-0 提问: max=(a>b)?a:b;用法困惑

回复:
user: user-1
content: 简单点，写代码的方式简单点……#include <stdio.h> #include <stdlib.h>  #define LOOP_UPPER_LIMIT 500  int print(int n) { 	return printf("%d\n", n); }  int main(int argc, char *argv[]) { 	int count = 0; 	do { 		print(count); 	} while (count++ < LOOP_UPPER_LIMIT); 	while (count-- > 0) { 		print(count); 	} 	return 0; }

user: user-1
content: count = ((count++) > (count)) ? count++ : count;展开成 if...else... 句式： if (count++ > count) { 	count = count++; } else { 	count = count; }不觉得写法很奇葩吗？count++ > count 这个该如何比较？

user: user-2
content: #include<stdio.h> main() {     int count=0;     while(count<=500)     {         count=((count++)>(count))?count++:count;         printf("%d\n", count);         while(count==500)         {             while(count>=0)             {                 count=((count--)<(count))?count--:count;                 printf("%d\n", count);             }         }     } } 去掉取地址符&  注意count=((count++)>(count))?count++:count; 不建议这么写，可以考虑分开写；

user: user-3
content: count=((count++)>(count))?count++:count; 你是多不信任编译器啊,自加完事还要检验下,就不怕检验结果也是错的? 看来只有赵四老师能救这孩子了

user: user-4
content: print为什么要取地址呢 把取地址去掉先

user: user-5
content: http://blog.miskcoo.com/2014/07/cxx11-sequenced-before-and-evaluation-order 不过看代码，不只求值顺序，楼主似乎连i++的语义（是自加之前的值）都没搞懂。

user: user-6
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。
user-0 提问: 浮点数在内存中的显示问题

回复:
user: user-1
content: 小数点不占位置的。

user: user-2
content: 小数点不占内存，浮点数的表示格式已经决定了小数点的位置

user: user-3
content: 引用 3 楼 fafagb 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 浮点数格式 http://bbs.csdn.net/topics/390676437 老是帮我看下这个吧，图片里说任何一个数都可以表示成1.xxxxxx*2^n 这样的形式，55.234也能表示成1.几的指数形式吗，如果不能，那最高位是不是就不能省略[/quote]使用1楼链接中的代码观察55.234用float和double表示时分别对应二进制的1.×××乘2的×××次方。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437 老是帮我看下这个吧，图片里说任何一个数都可以表示成1.xxxxxx*2^n 这样的形式，55.234也能表示成1.几的指数形式吗，如果不能，那最高位是不是就不能省略

user: user-4
content: https://en.wikipedia.org/wiki/IEEE_754

user: user-3
content: 浮点数格式 http://bbs.csdn.net/topics/390676437
user-0 提问: 迷宫问题（栈）

回复:
user: user-0
content: 请问我用的TC2.0，我只会断点发，单步跟踪怎么使用呢？

user: user-1
content: 单步跟踪程序运行，很容易分析得到原因，其次出错是因为(SElemType*)realloc(S->base, (S->stacksize + STACKINCREMENT) * sizeof(SElemType));这里使用了未初始化的S->base

user: user-2
content: 仅供参考：/**  * @Title  老鼠走迷宫的拓展探究  * @Author 孙琨  * @Date   2013-11-16  * @At     XUST  * @All Copyright by 孙琨  *  */  #include <iostream> using namespace std;  int maze[9][9] = { // 初始化迷宫，英文maze为“迷宫”     {2,2,2,2,2,2,2,2,2},     {2,0,0,0,0,0,0,0,2},     {2,0,2,2,0,2,2,0,2},     {2,0,2,0,0,2,0,0,2},     {2,0,2,0,2,0,2,0,2},     {2,0,0,0,0,0,2,0,2},     {2,2,0,2,2,0,2,2,2},     {2,0,0,0,0,0,0,0,2},     {2,2,2,2,2,2,2,2,2} };  int startI = 1,startJ = 1; // 入口行列坐标 int endI = 7,endJ = 7;     // 出口行列坐标  void visit(int i,int j)  // 自动搜寻路径 {     int m,n;      maze[i][j] = 1;      if((i == endI) && (j == endJ))     {         cout << endl << "显示路径:" << endl;         for(m=0; m<9; m++)         {             for(n=0; n<9; n++)             {                 if(maze[m][n] == 2)                     cout << "■";                 else if(maze[m][n] == 1)                     cout << "♀";                 else                     cout << "  ";             }             cout << endl;         }     }      if(maze[i][j+1] == 0)         visit(i,j+1);     if(maze[i+1][j] == 0)         visit(i+1,j);     if(maze[i][j-1] == 0)         visit(i,j-1);     if(maze[i-1][j] == 0)         visit(i-1,j);      maze[i][j] = 0;  }  int main(void) {     int i,j;      cout << "显示迷宫: " << endl;     for(i=0; i<9; i++)     {         for(j=0; j<9; j++)         {             if(maze[i][j] == 2)                 cout << "■" ;             else                 cout << "  " ;         }         cout << endl;     }      visit(startI,startJ);      return 0; }
user-0 提问: 小型图书馆管理系统中插入操作，如何做到重复输入用户？

回复:
user: user-1
content: 引用 3 楼 wyxxxx_ 的回复:whlie(flag=='Y'||flag=='y'){            s=(struct books_list*)malloc(sizeof(struct books_list));	            printf("\n  请输入图书登入号；");  		   getchar();  		   scanf("%s",s->loginnum);             printf("\n  请输入图书书名；");  		   getchar(); 		   scanf("%s",s->bookname);  		   printf("\n  请输入图书作者名；");  		   getchar(); 		   scanf("%s",s->author);  		   printf("\n  请输入图书出版社；");  		   getchar(); 		   scanf("%s",s->publisher);  		   printf("\n  请输入图书出版时间；");  		   getchar(); 		   scanf("%s",s->pbtime);  		   printf("\n  请输入图书分类号；");  		   getchar(); 		   scanf("%s",s->classfy);  		   printf("\n  请输入图书价格；");  		   getchar(); 		   scanf("%f",&s->price);  		   printf("\n"); 		   p->next=s;/*将新加的字节添加进链表*/ 		   p=s;/*p指向尾结点，向后移*/ 		   s->next=NULL; 		   printf("一一一一添加成功!一一一一");  		   printf("\n  继续添加？(Y/N):"); 		   fflush(stdin);  		   scanf(" %c",&flag); 		   printf("\n"); 		   if(flag=='N'||flag=='n'){ 		   break; 		   }            save(head);/*保存数据至文件*/ 		   return;     }    去掉；后，显示下面的错误，请问怎么改？ [Error] 'whlie' was not declared in this scope [Error] expected ';' before '{' token 单词拼写错误； while 不是whlie，所以注意下～

user: user-2
content: whlie是什么语言的关键词？？ c，c++，java等等 只有while，没有whlie

user: user-0
content: whlie(flag=='Y'||flag=='y'){            s=(struct books_list*)malloc(sizeof(struct books_list));	            printf("\n  请输入图书登入号；");  		   getchar();  		   scanf("%s",s->loginnum);             printf("\n  请输入图书书名；");  		   getchar(); 		   scanf("%s",s->bookname);  		   printf("\n  请输入图书作者名；");  		   getchar(); 		   scanf("%s",s->author);  		   printf("\n  请输入图书出版社；");  		   getchar(); 		   scanf("%s",s->publisher);  		   printf("\n  请输入图书出版时间；");  		   getchar(); 		   scanf("%s",s->pbtime);  		   printf("\n  请输入图书分类号；");  		   getchar(); 		   scanf("%s",s->classfy);  		   printf("\n  请输入图书价格；");  		   getchar(); 		   scanf("%f",&s->price);  		   printf("\n"); 		   p->next=s;/*将新加的字节添加进链表*/ 		   p=s;/*p指向尾结点，向后移*/ 		   s->next=NULL; 		   printf("一一一一添加成功!一一一一");  		   printf("\n  继续添加？(Y/N):"); 		   fflush(stdin);  		   scanf(" %c",&flag); 		   printf("\n"); 		   if(flag=='N'||flag=='n'){ 		   break; 		   }            save(head);/*保存数据至文件*/ 		   return;     }    去掉；后，显示下面的错误，请问怎么改？ [Error] 'whlie' was not declared in this scope [Error] expected ';' before '{' token

user: user-1
content: 代码中有些冗余code，比如：  if(flag=='N'||flag=='n')         {             break;         } else if (flag=='Y'||flag=='y')         {             continue;         } 这个else if是不需要的，因为这个判断已经在while循环条件中做判断了。所以，可以去掉else if  代码无效语句，fflush(stdin);不应定在有些系统上有效，所以用getchar();替换fflush //fflush(stdin);         getchar();

user: user-1
content: while后面多一个分号；如果加了分号，后面的大括号就不是循环体了哦；  whlie(flag=='Y'||flag=='y'); 这三条错误信息都是因为这个分号导致的；
user-0 提问: c语言中的数组初始化

回复:
user: user-0
content: 谢谢，学习了！

user: user-1
content: 运算需要在栈操作，即需要在函数内； 可以在函数外定义变量，定义的变量是全局的，定义的全局变量，默认会给初始化0；即如果不是显示的初始化，那么系统也会给全局的变量初始化位0； 不过，仅仅是初始化；但是初始化后的赋值就不行，需要在函数里才行；

user: user-2
user-0 提问: makefile能否实现自动去编译需要的lib

回复:
user: user-0
content: 引用 2 楼 cfjtaishan 的回复:makefile是可以，既然a.cpp要用到B.so，倒不如每次都去编译一次。 这样可以做到，感谢！！！

user: user-1
content: 引用 2 楼 cfjtaishan 的回复:makefile是可以，既然a.cpp要用到B.so，倒不如每次都去编译一次。 编译之后注意要将B.so放到a.cpp能够找到的位置。

user: user-1
content: makefile是可以，既然a.cpp要用到B.so，倒不如每次都去编译一次。

user: user-2
content: 应该可以，Makefile不是有个依赖关系吗：   B.so: ... 	make -C /usr/B all: a.c,b.c,B.so 	...   我猜测的，没试过，你试试看。
user-0 提问: 小白请教。。运行错误  run error  看不出来

回复:
user: user-0
content: 引用 4 楼 cfjtaishan 的回复:scanf("%d", &evenNum); scanf的参数不对；  #include<stdio.h> int main(void) {     int evenNum,i,j,k,m;     //define even number and two numbers from it     printf("please input a even number from 2~2000000000:");     scanf("%d", &evenNum);        for(i=2;i<evenNum;i++)     {         for(j=2;j<i;j++)         {             if(i%j==0) break;             if(i%j!=0)                 printf(" ");         }         break;     }     printf("%d\n",i);     k=evenNum-i;     for(m=2;m<k;m++)     {         if(k%m==0) break;         if(k%m!=0)             printf(" ");     }     printf("%d\n",k);     evenNum=i+k;     if(i<=k)         printf("%d=%d+%d\n",evenNum,i,k);     else         printf("%d=%d+%d\n",evenNum,k,i);     return 0; }  printf中记着加'\n'，不然输出的内容容易混淆；                嗯知道了  谢谢  但程序若k不为质数应该怎样开始重新循环  这个是错的 好像

user: user-1
content: scanf("%d", &evenNum); scanf的参数不对；  #include<stdio.h> int main(void) {     int evenNum,i,j,k,m;     //define even number and two numbers from it     printf("please input a even number from 2~2000000000:");     scanf("%d", &evenNum);        for(i=2;i<evenNum;i++)     {         for(j=2;j<i;j++)         {             if(i%j==0) break;             if(i%j!=0)                 printf(" ");         }         break;     }     printf("%d\n",i);     k=evenNum-i;     for(m=2;m<k;m++)     {         if(k%m==0) break;         if(k%m!=0)             printf(" ");     }     printf("%d\n",k);     evenNum=i+k;     if(i<=k)         printf("%d=%d+%d\n",evenNum,i,k);     else         printf("%d=%d+%d\n",evenNum,k,i);     return 0; }  printf中记着加'\n'，不然输出的内容容易混淆；

user: user-2
content: 输入取地址。

user: user-3
content: scanf("%d",&evenNum);  for循环的break看一下位置。m,k变量的使用，在查看一下。

user: user-4
content: scanf("%d",&evenNum);

user: user-5
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
user-0 提问: 用while就死循环，用if就没问题，为什么？while和if功能不是一样的吗？各大牛指教一下，新手

回复:
user: user-1
content: 因为while里面没有修改x本身的值，在第一个while里面就永远无法退出循环了。。何况你还有递归！

user: user-2
content: while是循环 执行一次后会再次判断是否符合条件 符合条件继续执行while内 if不是循环只是条件判断 判断一次后符合条件只运行一次 不符合条件直接跳过

user: user-3
content: #include <stdio.h> #include <unistd.h>  void deczoct(int x) {     if (x > 8) {         deczoct(x/8);     }     printf("%d", x%8); }  int main(void) {     int num;      scanf("%d", &num);      printf("After cout: \n");     deczoct(num);     putchar(10);     return 0; } 参考一下吧  楼主的主要是while循环里没有修改x的值，导致无法停止第二次调用本身。

user: user-4
content: 递归没有结束条件。

user: user-5
content: 哪里一样了啊，一个是循环一个是判断 你记错了吧，while和for还差不多

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

user: user-7
content: while是一只判断-if只判断一次

user: user-8
content: 你没有改变x的值  if执行一次就往下执行了 while执行完 条件还满足 继续执行呗
user-0 提问: 为什么在字符数组中遇到空格就停止了呢

回复:
user: user-1
content: 如果一个字符数组中包含一个以上‘\0’，则遇到第一个\0就输出结束。

user: user-2
content: http://en.cppreference.com/w/c/io/fscanf

user: user-2
content: 用scanf %s遇到空格确实就停了，标准是这样描述的：matches a sequence of non-whitespace characters (a string)，If width specifier is used, matches up to width or until the first whitespace character, whichever appears first. Always stores a null character in addition to the characters matched (so the argument array must have room for at least width+1 characters)，如果你需要读取空格就需要使用其他函数

user: user-3
content: 引用 1 楼 A_short 的回复:把那个空格换成其他的就可以输出   但是空格为什么不行 因为scanf是格式化输入，以空格作为分割多个变量输入；即输入空格表示上一个变量输入的结束；  如果想输入一行然后结束，中间还要可以加若干空格字符；可以考虑使用fgets函数，该函数是遇到换行符（即回车符）结束输入；

user: user-3
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 2 楼 qq_38204686 的回复:] 空格相当于字符串的结尾 这个结论似乎没有依据 scanf是格式化输入，那么空格是结束上一个变量的输入；[/quote] 字符串的结尾应该是'\0'吧

user: user-3
content: 引用 2 楼 qq_38204686 的回复:空格相当于字符串的结尾 这个结论似乎没有依据 scanf是格式化输入，那么空格是结束上一个变量的输入；

user: user-4
content: scanf("%s",a);→scanf("%24[^\n]",a);

user: user-5
content: 解释：scanf + %s 从标准输入读取一串字符，遇回车或空格结束。这个由scanf库函数的定义决定的。 解决：1.使用gets(str);            2.用while循环getchar(),赋值给数组。ASCII码判断回车结束。

user: user-6
content: 建议使用可以读取空格的函数  详情百度 很多

user: user-6
content: 空格相当于字符串的结尾

user: user-0
content: 把那个空格换成其他的就可以输出   但是空格为什么不行
user-0 提问: 关于C语言中getchar()的使用困惑？

回复:
user: user-0
content: 原来是自己的逻辑错误了，非常感谢

user: user-1
content: 见注释 #include <stdio.h>  #define IN  1 #define OUT 0  int main() { 	int c, nc, nl, nw, state;  	state = OUT; 	nc = nl = nw = 0; 	while ((c = getchar()) != EOF) 	{ 		++nc; 		if (c == '\n') 			++nl; 		if (c == ' ' || c == '\n' || c == '\t') 			state = OUT;         /* 这里为什么要else呢，应该直接判断state吧 */ 		else if (state == OUT) 		{ 			state = IN; 			++nw; 		} 	}  	printf("nl = %d, nw = %d, nc = %d\n", nl, nw, nc); 	return 0; }

user: user-2
content: 因为从一开始到遇到'\n'||’\t'||' '只有一次；输入完回车符'\n'就输入EOF了。所以只有一个单词；
user-0 提问: 字符串中的字符无效问题

回复:
user: user-1
content: s1和s2先进行初始化。  char s1[21] = { '\0' }; char s2[21] = { '\0' };

user: user-2
content: 结贴了吗？似乎上面几个人回答的驴唇不对马嘴啊。。。

user: user-3
content: 字符串没有找到'\0'，这个是字符串的结束标记；字符'0'和'\0'还是有区别的。他们对应的ASCII值分别是0和48  解决办法是  for (index = 0; index <= len1 + len2; index++)     result[index] = '\0';    /*也可以赋值0*/

user: user-4
content: 因为给字符串赋值的是'0',‘0’的ASC码值是48，不是字符串的结束符,字符数组没有结束符当然不能是字符串了。

user: user-5
content: 定义时初始化为{}相当于没有初始化啊

user: user-6
content: char s1[21] = { '\0' }; char s2[21] = { '\0' };  for （index = 0; index <= len1 + lne2; index++)   result[index] = '0'; //显示字符‘0’，与下面的结束符不同  result[len1 + lne2 + 1] = '\0'; //加上字符串结束符  不加则为分配内存时的垃圾值，系统显示字符串时直到有结束符为止，即使是越界非法访问也必须到结束符为止
user-0 提问: 求大神指导下为什么在输入之后二叉树不能输出结果

回复:
user: user-1
content: 你的程序里要求输入空格终止递归，你输入#，那怎么停止递归呢？！ 要么输入空格，要么改一下程序里的判断：  if (c == '#')     t = NULL;

user: user-0
content: 就是进行不了遍历操作
user-0 提问: 新人求助，最简单的printf与scanf

回复:
user: user-1
content: scanf("%s", &ch);应该用z%c输入，第二个scanf时候，会把换行键输入到第二个scanf中

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-3
content: #include <stdio.h>   int main(void) {   int N;   char ch;    printf("&N = %p\n", &N);   printf("&ch = %p\n", &ch);   printf("&ch +1 = %p\n", &ch+1);   puts("Please scanf your character and your character numbers.");   scanf("%d",&N);   getchar();   scanf("%s", &ch);   printf("%d", N);   //challeng(N,'*');   return 0; } 通过地址查看为什么是0； 还有一点，如果你输入的数值较大，比如输入大于255，那么输出的N也不是你输入的，但是也不会是0；

user: user-4
content: 接收ch的时候越界了，覆盖了N的值，如果你只输入一个字符，这个字符串加上结尾的\0一共有两字节，就要写成：char ch[2];  如果你要输入更多的，那还要更大

user: user-3
content: 引用 1 楼 weixin_40926388 的回复:第一个输入后面加个   fflush(stdin);  试试   scanf("%d",&N);  fflush(stdin);  scanf("%s", &ch);  printf("%d", N); fflush(stdin);对于某些系统是无效的，即fflush不能清除stdin里数据； 另外，以%s输入，也无需清除stdin里的数据。  %s输入，即字符串；ch只有一个字节，怎么能存放字符串呢？

user: user-3
content: #include <stdio.h>   int main(void) {   int N;   char ch;   puts("Please scanf your character and your character numbers.");   scanf("%d",&N);   getchar();   scanf("%c", &ch);   printf("%d", N);   //challeng(N,'*');   return 0; } 应该用%c格式输入； 若以%s，那么会越界；因为字符串要求以'\0'结束，那么输入一个字符后，ch就没有空间存放'\0'了。

user: user-5
content: 第一个输入后面加个   fflush(stdin);  试试   scanf("%d",&N);  fflush(stdin);  scanf("%s", &ch);  printf("%d", N);
user-0 提问: C语言问题

回复:
user: user-1
content: 数组中括弧里的值

user: user-1
content: 你就想成数组里的值好了

user: user-2
content: 可以这样理解*(p+0)=st[0]，*(p+1)=st[1]

user: user-3
content: p+i表示p偏移i个单位地址，这个单位跟p的类型有关，这里p是char *，所以即p指针偏移多少个字节，相当于数组下标的作用。

user: user-0
content: 谢谢各位   懂了

user: user-4
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-5
content: i是偏移量，比如(p+i)是指偏移i个sizeof(char)字节，也就是相对于数组首地址偏移i个字节；
user-0 提问: 在头文件定义引起重复定义的问题。

回复:
user: user-1
content: const char const * pchar = "aaa";

user: user-2
content: VS下是没问题的，当然建议你把这些全局变量放到一个CPP文件，其他文件使用再用extern进行声明

user: user-3
content: 用vs编译的时候构造函数有问题，demo();函数改成demo(){};

user: user-4
content: 不科学啊，看起来没问题的。

user: user-5
content: 引用 2 楼 cfjtaishan 的回复:如果只是两个文件，以头文件，一个main.cpp源文件，不会出现这样的错误； 如果还出，建议加上extern 嗯嗯嗯嗯嗯

user: user-6
content: 如果只是两个文件，以头文件，一个main.cpp源文件，不会出现这样的错误； 如果还出，建议加上extern

user: user-5
content: 。。。如果你的代码真是这样，应该是没有错误，至少我这是编译通过了。。。  multiple definition of 问题一般是多个文件包含同一个头文件。。。.
user-0 提问: 想问一下EOF在控制输入的时候到底怎么才对，能否举个例子详细讲解一下 

回复:
user: user-1
content: http://en.cppreference.com/w/c/io

user: user-2
content: int ch;  while ((ch = getchar()) != EOF)     putchar(ch);  这个例子可以吗？ EOF文件描述符； 标准输入的EOF是通过键盘组合键输入的。 ctrl+d(Linux) or ctrl+z（Windows）