Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 类型问题

回复:
user: user-1
content: int shu = (*p)[i]-'0';这样才行

user: user-0

user: user-0
content: 我用了这个方法然而报错了是什么原因？

user: user-1
content: *(p+i)对于的应该是个数字型的字符，楼主可以通过*(p+i) - ‘0’得到int型的数字

user: user-2
content: 直接强制转换么好了。  本来char型的 就是int型的
user-0 提问: 杭电acm2020

回复:
user: user-0
content: #include<stdio.h> #include<stdlib.h> #include<math.h> int cmp(void *a, void *b){ 	return abs(*(int *)b) - abs(*(int *)a); } int main(int argc, char const *argv[]) { 	int i,j,n; 	while(~scanf("%d",&n)&&n){ 		int s[100]={0}; 		for(i=0;i<n;i++) 			scanf("%d",s+i); 			 		qsort(s,n,sizeof(s[0]),cmp); 		for(i=0;i<n-1;i++) 			printf("%d ", s[i]); 		printf("%d\n", s[i] ); 	} 	return 0; } 已经解决，return里要这样写
user-0 提问: c语言二维数组分配

回复:
user: user-1
content: 其实指针传参时，没必要传指针的地址，直接   fun（ p ）;  void  fun( int**  p ) {          p = ( int **)malloc ( ..........) }

user: user-2
content: 看2楼，优先级问题

user: user-1
content: 引用 9 楼 lin5161678的回复:[quote=引用 6 楼 wjhyxr 的回复:] 其实指针传参时，没必要传指针的地址，直接   fun（ p ）;  void  fun( int**  p ) {          p = ( int **)malloc ( ..........) }醒醒[/quote] 啥意思................

user: user-3
content: 引用 6 楼 wjhyxr 的回复:其实指针传参时，没必要传指针的地址，直接   fun（ p ）;  void  fun( int**  p ) {          p = ( int **)malloc ( ..........) }醒醒

user: user-3
content: sizeof(sizeof(int)* 3) ??

user: user-4
content: 啥叫“二维数组”？

user: user-5
content: 你创建的并不是二维数组。毕竟，这些malloc是分开调用的。

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

user: user-7
content: 注意*和[]的优先级，另外，多了一套sizeof，括号如果改一下能侥幸过关，但最好还是去掉吧 void fun(int ***p) {     *p= (int**)malloc(sizeof(int*)*2);     for (int i = 0; i < 2; i++)     {         (*p)[i] = (int *)malloc(sizeof(int)* 3);         for (int j = 0; j < 3; j++)         {             (*p)[i][j] = i+j;         }     } }

user: user-8
content: 不要用这么多级指针解决问题，用一维模拟多维就行了，简单，节约内存并且效率高，满满的优点。
user-0 提问: 两种Unicode码之间如何转换？ 

回复:
user: user-0
content: 又错了，改为： (高字-d800)<<10+低字+2400

user: user-0
content: 错了，改为： (高字-dc00)<<10+低字+2400

user: user-0
content: 简化一下： (高字-dc00)<<10+低字+e800

user: user-1
content: U+2C62F这是原生编码UCS-4，d871de2f这是UTF-16编码。 转换方法： d871 - d800 = 0071 de2f - dc00 = 022f (0071 << 16 + 022f << 6) >> 6 = 2c62f

user: user-2
content: 你要自己转换吗? 自己转换的话自己看标准. 库转的话,libiconv
user-0 提问: 解释程序方式的过程

回复:
user: user-1
content: 参考解释和编译执行C的开源项目。

user: user-2
content: 其实，java 是编译后，解释执行的 .net 上的语言（VB,C#,C++CLI）有两种执行方式 一种是编译成 中间语言，解释执行 一种是编译成中间语言，执行时编译为本地代码，然后执行 此前的语言 Basic 早期是解释执行的，微软后来QBasic,Qick Basic 变为也给他编译执行了， 他有两种执行方式，IDE内调试时，可以解释执行， 也可以脱离环境 编译为 exe 执行 Pacal 是编译执行的，但是也有人研制出解释执行的pascal  怎么执行，其实是和编译系统，或者解释器的实现相关的。 和语言的关系，只是方便不方便处理成 编译，或者解释执行而已。 方便的难度小，否则难度大， 但是都是可以，编译或者解释执行的 很多系统，是编译和解释都有的  例如，MS 的VB6 虽然是编译执行为主， 但是 可能会编译成p-code 解释执行一部分代码。  MS VB 不是完全的编译执行的。

user: user-2
content: 引用 6 楼 user-3 的回复:解释程序也要翻译成中间码 可能需要，也可能不要 看如何实现这个解释器 加括号，表示可能不会有这一步

user: user-2
content: 语义分析会有的 代码生成，可能会有，也可能不会有 不生成代码的，（虚拟机）直接解释执行了， 大概就是调用内置函数（过程）执行， 简单的也可以直接处理，比如加减乘除这种数学计算。 生成代码的。虚拟机解释 生成的中间代码执行。 简单的语义分析 和解释执行可能就一步到位了  例如VB6 就可以将 程序生成 p-code 然后解释执行 但不是完全都是生成 p-code 执行的

user: user-0
content: 引用 1 楼 lm_whales 的回复:语法分析，不可能没有词法分析 但是语法分析和词法分析可以结合到一起，不加区分（如果词法很简单的话）  谢谢，那解释程序情况下有咩有语义分析？语义分析也是不是语法分析前必要的环节？

user: user-2
content: 语法分析，不可能没有词法分析 但是语法分析和词法分析可以结合到一起，不加区分（如果词法很简单的话）

user: user-3
content: 解释程序也要翻译成中间码

user: user-2
content: 解释器一次处理，大约是这个样子： 读取程序代码----> 出错处理      |      v 词法分析----> 出错处理      |       v 语法分析  ---> 出错处理     |    v 语义分析  --->出错处理       |    V （代码生成）-->出错处理    |    V   执行------>出错处理    |   V   得出结果

user: user-2
content: 语义分析 是词法，语法分析之后做的事情。 解释器，如果不做代码生成的话。 语义分析以后， 就开始执行 了。  象 a + b  这是个表达式，结果是二者之和  这是语义分析部分要做的 如果是生成 p 代码 a,b + 这两个操作数，一个运算符，都要用 p 代码表示出来 那就成了代码生成了 如果不做代码生成，那么就会调用内部函数，处理这个表达式求出结果来 语义分析，这一步得出 这个表达式是合法的，这个+ 号如何处理 a,b如何处理 复杂表达式如何处理 这就是语义分析了 如果是词法分析 就可以分解出 a,+ ,b 三个符号，判断他们是否是合法的标识符（以及符号） 语法分析 判断出表达式 a+b 是否合法的表达式 运算符是+,a ,b 是操作数 语义分析 a+b 这个表达式各个元素，对应的p代码的那些元素。 或者对应内部那些 函数，过程 如何处理操作数 对于不带 代码生成的，下一步就是执行 对于带代码生成，下一步生成代码（p代码），执行代码（p代码）
user-0 提问: 怎么用C语言实现多个文件进行汇总到一个文件功能

回复:
user: user-1
content: import os smailfilels=[] fw=open("result.txt","w") for root, dirs, files in os.walk(os.getcwd()):     for i in files:         if i[-5:]=="smail":             smailfilels.append(root+"/"+i)              for i in smailfilels:     fr=open(i)     for line in fr:         fw.write(line)     fr.close() fw.close()

user: user-2
content: 纠正上帖第4行：sprintf(cmdstr,"%s xxxx.txt",cmdstr);

user: user-2
content: static char cmdstr[32768]; sprintf(cmdstr,"copy /b 0001.txt"); for (i=1;i<100;i++) sprintf(cmdstr,"%s+%04d.txt",cmdstr,i); sprintf(cmdstr,"%s xxxx.txt",cndstr); system(cmdstr); //以上实现将0001～0099.txt合并到文件xxxx.txt

user: user-1
content: import os  filenames=os.listdir(os.getcwd()) fw=open("result.txt","w") for name in filenames:     if name!="result.txt" and name[-3:]=="txt":         fr=open(name,"r")         for line in fr:             fw.write(line)         fr.close() fw.close()  python简单写了下，怎么运行就不用说了吧

user: user-0
content: 引用 10 楼 Ysniper 的回复:明天有空帮你写写   谢谢大神！！！！

user: user-3
content: windows平台下有copy命令  copy source*.file  dest.file (用通配符或 file1+file2+file3 格式)  linux平台下有concat

user: user-0
content: 引用 6 楼 lm_whales 的回复:如果没有冲突。 系统的copy命令，就可以把若干文件合成为一个文件 恩？我明白你的意思 可是要人工的输入命令啊 我的意思是写个程序出来让它自己合并 大神你知道该怎么做么？

user: user-4
content: 如果没有冲突。 系统的copy命令，就可以把若干文件合成为一个文件

user: user-0
content: 引用 3 楼 lm_whales 的回复:好多方法，不用代码的话，用rar 之类的压缩工具，一下子就行了  如果需要按照某些信息，加以筛选，那就要编点代码了  是这样的 大神 你说的 我不太懂  我向你介绍一下啊 就是我分析一个东西得到多个文件，我想做的就是把多个文件汇总在一起。然后在用另一个程序把这个总文件里我想要的东西提取出来

user: user-0
content: 引用 1 楼 Ysniper 的回复:用Python 求大神指导~~~大神能帮写下么？可以拿下载积分换 求大神帮忙~

user: user-5
content: 把文件1.txt,2.txt,3.txt,4.txt放到linux系统下，执行 cat 1.txt 2.txt 3.txt 4.txt >> all.txt

user: user-4
content: 好多方法，不用代码的话，用rar 之类的压缩工具，一下子就行了  如果需要按照某些信息，加以筛选，那就要编点代码了

user: user-1
content: 估计20行代码就够了

user: user-1
content: 用Python

user: user-1
content: 明天有空帮你写写

user: user-4
content: system ("copy ....);
user-0 提问: c基础小程序——统计单词频率 出错求解答

回复:
user: user-0
content: 196，212行手残...结帖。

user: user-1
content: linux gdb 足以

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

user: user-0
content: 48行 puts(word);  用来验证get word函数正确用的

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

回复:
user: user-1
content: 直接声明就可以吧

user: user-2
content: 小心别大于1MB

user: user-3
content: 在栈上开辟一个二维数组，即在函数内申请一个局部变量（如：type array[2][4]）即可；

user: user-4
content: 类型说明符 数组名[常量表达式1][常量表达式2]，如int a[3][4]; GCC编译器还支持动态数组定义，即常量表达式1和常量表达式2可以是个变量

user: user-5
content: vs可以int a[10][10]; gcc可以int a[n][n];
user-0 提问: int fputc ( int character, FILE * stream );为什么第一个参数为int型

回复:
user: user-1
content: 因为char的默认范围是-128..127，而ASCII的范围可以是0..255

user: user-2
content: 这应该是类型隐式提升，char类型提升为int类型；

user: user-3
content: 因为这是C函数 int 可以表示比 char 更多的信息 例如写入文件结束标志

user: user-4
content: 以前的cpu处理int比char快，刚好等于cpu的字长。  另外还很多函数都是这样，如getchar返回值

user: user-5
content: char类型的话最多只能表示256个字符，是不是太少了点呢

user: user-6
content: 中文字符因为编码gb2312,gbk,ucs-2不一样，可不是一个字节啊，考虑扩展

user: user-7
content: fputc() writes the character c, cast to an unsigned char, to stream.
user-0 提问: 打印三个数字(0 - 9)的组合可能(组合成三位数)

回复:
user: user-1
content: package test;  import java.util.*;  public class test1 {     private static List<String> resultList = new ArrayList<>();     private static int total = 3;//一共要取三个数      public static void main(String[] args) {         Integer[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};         List<Integer> numList = Arrays.asList(arr);         getAll(numList, total, "");         System.out.println(resultList);     }      /**      * @param refList      源数组：用于取数的      * @param count        用于取几个数      * @param resultString 结果字符串：比如“103”      * @return      */     public static List<String> getAll(List<Integer> refList, int count, String resultString) {         for (int i = 0; i < refList.size(); i++) {             /*                       每一次循环要初始化 数组 和 结果字符串              */             String tempString = resultString;             List<Integer> tempList = new ArrayList<>(refList);             String resultNum = tempList.remove(i).toString();             tempString += resultNum;             if (count == total && resultNum.equals("0")) {//代表第一次取数为0的情况                 continue;             }             if (count != 1) {                 getAll(tempList, count - 1, tempString);             } else {                 resultList.add(tempString);             }         }         return resultList;     } }

user: user-2
content: for(int i=1;i<=9;i++) for(int j=0;j<=9;j++) if(i==j) continue; else for(int k=0;k<=9;k++) if(i==k||j==k) continue; else printf("%d%d%d\n",i,j,k);

user: user-3
content: for(int i=1;i<=9;i++) {       for(int j=0;j<=9;j++)      {              if(i==j)              continue;                     for(int k=0;k<=9;k++)                     {                               if(i==k||j==k)                               continue;                               printf("%d%d%d\n",i,j,k);

user: user-4
content: for (int i = 100; i < 1000; i++) {        std::cout << i << std::endl; }

user: user-4
content: 100,101,102,.........999

user: user-5
content: 1~3位，带前导0 的十进制数ASCII表示中， 扣掉，三个字符中出现重复数字的组合就是他了

user: user-5
content: 一个简单粗暴，效率不高的算法 就是0~999 转换为带前导0 的3位字符串 然后过滤掉 有重复数字的数 优点是，天生就是升序或者降序排列的 不需要其他技巧

user: user-0
content: 可以写出来吗

user: user-6
content: 先用子集生成算法生成三个数字然后枚举排列每个子集，用到两个比较简单的算法你可以百度
user-0 提问: 二级指针分配在不同的IDE中有不同的用法吗？

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

user: user-2
content: 引用 4 楼 under_tackle 的回复:[quote=引用 3 楼 paschen 的回复:] 怀疑是你其他代码导致堆破坏而产生的不确定行为，建议先注释掉无关代码，判断出错原因   是的，发现了是其他的原因，已经解决了，我在这个分配语句前进行了对另一块区域的读写操作，然后越界了。不过我很奇怪为什么调试的时候会调试到在这一句出现错误……这也会延迟吗？还有，我把错误的程序写在WIN10上却可以运行，是不是说WIN10运行越界写数据？[/quote]  所以我上面说了，叫不确定行为，包括你预想的和未想到的

user: user-3
content: malloc 呼叫 HeapAlloc 操作。 该操作在分配内存之前需要检测堆是否正确。 看看函数 _heapchk 。 所以如果分配内存函数错误，那么表示在此之前，堆操作曾经有过错误。

user: user-0
content: 引用 2 楼 qq423399099 的回复:我试了下VS2012是可以的，楼主代码贴全看看  谢谢回复，已经解决了

user: user-0
content: 引用 3 楼 paschen 的回复:怀疑是你其他代码导致堆破坏而产生的不确定行为，建议先注释掉无关代码，判断出错原因   是的，发现了是其他的原因，已经解决了，我在这个分配语句前进行了对另一块区域的读写操作，然后越界了。不过我很奇怪为什么调试的时候会调试到在这一句出现错误……这也会延迟吗？还有，我把错误的程序写在WIN10上却可以运行，是不是说WIN10运行越界写数据？

user: user-2
content: 怀疑是你其他代码导致堆破坏而产生的不确定行为，建议先注释掉无关代码，判断出错原因

user: user-4
content: 我试了下VS2012是可以的，楼主代码贴全看看

user: user-0
content: 自己下了个VC试了试，发现居然不行……………………好吧，我也不清楚为什么程序是一模一样的，在同学电脑上就是可以执行的，在自己电脑上不论换了什么IDE都没有办法执行
user-0 提问: 一道程序设计的高中数学问题

回复:
user: user-1
content: 如果是任意4个点组成的四边形，可将问题转换成计算三角形面积  1、AB与CD相交，非四边形 2、ABC组成的三角形面积，与ABD、ACD、BCD三个三角形面积之和比较，如果相等，为凸四边形，面积为ABC和ADC之和，如果大于，为两者之差 3、比较ABP、BCP、CDP、DAP四个三角形面积之和与四边形面积，若大于P在四边形ABCD之外，否则之内

user: user-1

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

user: user-3
content: 2D的转变需要3x3矩阵，最右一列没有影响。 矩阵 A B 0 C D 0 E F 1 然后用坐标(x, y, 1)相乘能得到新的坐标，把矩形转换为2D转变然后转换那个点就行了。
user-0 提问: 字符串求解

回复:
user: user-1
content: 用strtok分割成数组，然后分别用atoi/atof转换成数值。

user: user-2
content: 楼主意思，输入没有格式可言 你就char* p = start，p++碰到连续数字（0-9），记录下来，atoi转换成整数

user: user-3
content: #include <iostream>  using namespace std;  int main() {       char buf[10] = "12,234";       char *p = buf;       int i = 0;       int len = sizeof(buf) / sizeof(*buf);        for (i = 0; i < len; i++)       {             if (p[i] == ',')             {                  p[i] == '\0';                  break;             }       }        cout << "str1 =  " << p << " ";       cout << "str2 = " << p + i + 1;         cin.get();   }

user: user-0
content: 如果是输入  strname=（1,2）（4,5）（1,1） 这个样子呢  我要取出它的名字 strname 和1，2，4，5，1，1这一些数据，能大概讲讲算法吗？

user: user-4
content: 假设char*str="12,234",将字符串遍历，找到‘，’将‘，‘赋值成’\0',则str=“12”，str+3=“234”。

user: user-5
content: 如果格式比较固定，不妨考虑sscanf
user-0 提问: typedef 的用法求解

回复:
user: user-1
content: int  是整个类型定义的一个局部 int (*PFI)(char *,char *); 为一个完整的函数指针定义， 指针为 PFI， 类型为 int (*)(char *,char *); 所以 typedef  int (*PFI)(char *,char *); 定义PFI为 函数指针类 int (*)(char *,char *); 指向    返回值为 int，两个参数都是 char * 类型 的函数指针。  去掉 typedef 后，定义类型就变成定义对象，这里是函数指针 加回  typedef  这就变成定义类型了，对象名就变成类型名了（别名），  typedef类型。就是 去掉typedef 后，所定义的对象的类型。

user: user-2
content: 一般一个带返回值的函数肯定是这样写的：  int  func(char*, char*)    那么我们要定义这个函数的指针，下面的内容就好理解了。  typedef  int  (*PFI)(char *, char *);  PFI  fun; fun = func;

user: user-3
content: typedef  int  (*PFI)(char *, char *)

user: user-4
content: typedef  int  (*PFI)(char *, char *);这是一个指针函数的声明，这个指针函数有两个形参，类型为char型指针，指针函数的返回值是int型 可以将任意符合上述行参和返回值的函数赋值给这个PFI。

user: user-0
content: 引用 2 楼 qq423399099 的回复:那楼主把PFI前面的int理解成什么？就是后面的会把 int 替换掉 不会再用到  int 了

user: user-0
content: 就是后面的会把 int 替换掉 不会再用到  int 了

user: user-5
content: 那楼主把PFI前面的int理解成什么？
user-0 提问: 求大神帮帮忙啊！！！关于N维数组排序的

回复:
user: user-0
content: 唉，我用结构体写的。通过了。

user: user-1
content: 如果n已知，"China"放最后，排序前n-1个国家可以了 否则，要用链表排序的

user: user-2
content: 哎呀，失误了，楼主在else if分支里加下别的成员变量也交换的几行代码

user: user-0
content: 引用 3 楼 小灸舞的回复: #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct infomation { 	int no; 	char country[16]; 	int people; 	char continents[16]; }Info;  int main() { 	int n, i, j; 	scanf("%d", &n); 	Info *info = (Info *)malloc(n * sizeof(Info)); 	//循环输入数据 	for(i = 0; i < n; i++) 		scanf("%d %s %d %s", &info[i].no, info[i].country, &info[i].people, info[i].continents);  	//冒泡排序 	for(i = 0; i < n; i++) 	{ 		for(j = 0; j < n - i - 1; j++) 		{ 			if(strcmp(info[j + 1].country, "China") == 0)//如果第二个字符串是China则跳过 				continue; 			else if(strcmp(info[j].country, info[j + 1].country) > 0 || strcmp(info[j].country, "China") == 0)             {  //前面的字符串比后面的小或者前面的字符串是China 				char temp[16] = {0}; 				strcpy(temp, info[j].country); 				strcpy(info[j].country, info[j + 1].country); 				strcpy(info[j + 1].country, temp);             }  		} 	}  	//打印结果 	printf("\n"); 	for(i = 0; i < n; i++) 		printf("%d %s %d %s\n", info[i].no, info[i].country, info[i].people, info[i].continents); }  不对啊，你这样只是把国家的顺序排了一下。序号跟国家是匹配的，还有后面的信息跟国家也是匹配的。

user: user-0
content: 引用 1 楼 初奋斗的回复:如果强调N维数组的话，那么也就是加点循环罢了。一维排序总会吧。 如果就题而论，不如你输完我就比，一个strcmp函数搞定。然后直接选择插前面还是插后面。 #include<stdio.h> #include<string.h> int main() { 	int n,i,j,t; 	char a[100][20],b[20]; 	while(scanf("%d",&n)!=EOF) 	{ 		t=0; 		for(i=0;i<n;i++) 		scanf("%s",&a[i]); 		for(i=0;i<n;i++) 		if(strcmp(a[i],"China")==0) 		for(j=i;j<n;j++) 		strcpy(a[j],a[j+1]); 		strcpy(a[n-1],"China"); 		for(i=0;i<n-1;i++) 		for(j=i+1;j<n-1;j++) 		{ 		if(strcmp(a[i],a[j])>0) 		{ 			strcpy(b,a[i]); 			strcpy(a[i],a[j]); 			strcpy(a[j],b); 		} 	} 		for(i=0;i<n;i++) 		printf("%s\n",a[i]); 	} 	return 0; }

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct infomation { 	int no; 	char country[16]; 	int people; 	char continents[16]; }Info;  int main() { 	int n, i, j; 	scanf("%d", &n); 	Info *info = (Info *)malloc(n * sizeof(Info)); 	//循环输入数据 	for(i = 0; i < n; i++) 		scanf("%d %s %d %s", &info[i].no, info[i].country, &info[i].people, info[i].continents);  	//冒泡排序 	for(i = 0; i < n; i++) 	{ 		for(j = 0; j < n - i - 1; j++) 		{ 			if(strcmp(info[j + 1].country, "China") == 0)//如果第二个字符串是China则跳过 				continue; 			else if(strcmp(info[j].country, info[j + 1].country) > 0 || strcmp(info[j].country, "China") == 0)             {  //前面的字符串比后面的小或者前面的字符串是China 				char temp[16] = {0}; 				strcpy(temp, info[j].country); 				strcpy(info[j].country, info[j + 1].country); 				strcpy(info[j + 1].country, temp);             }  		} 	}  	//打印结果 	printf("\n"); 	for(i = 0; i < n; i++) 		printf("%d %s %d %s\n", info[i].no, info[i].country, info[i].people, info[i].continents); }

user: user-3
content: 如果强调N维数组的话，那么也就是加点循环罢了。一维排序总会吧。 如果就题而论，不如你输完我就比，一个strcmp函数搞定。然后直接选择插前面还是插后面。
user-0 提问: C语言中的参数默认值

回复:
user: user-1
content: #name  ---->"name" #是字符串化运算符 可以把一个符号，转换为对应的字符串（两端加上引号）  #define DEFARG(name, defval) ((#name[0]) ? (name + 0) : defval) 如果 name 不是空格 ,例如  name 是1 那么么 #name[0] 也就是 “1”[0] 是字符‘1’为真 这个问号表达式的值就是 name + 0 也就是 name 本身 ，这里就是1 如果是 x 那么值就是 x 这样不论是变量，还是常量 都得到他本身  如果 name 是空格，则#name 是 "" 空串，“”[0] 就是'\0' 是值为 0 的字符，为假 此时问好表达式的值为  defval  所以这个宏的意思就是 name 为空，取缺省值defval，不为空取 name的值 这对于指针，整型数据，浮点数据等等都有效  #define f1(arg0) _f1(DEFARG(arg0, 0)) 相当于，给无缺省值的函数（C式样的函数），针对某一个参数增加一个缺省值， 相当于 inline int f1 (int a=0){ return _f1(a); } 但是比C++缺省值，更加好用些，可以给任何一个参数加上缺省值。  #define f2(arg0, arg1) _f2(DEFARG(arg0, 0), DEFARG(arg1, 1)) 给 _f2的每个参数，都加个缺省值，分别为0，1  函数调用方式没有参数的地方，就是有缺省值的

user: user-1
content: name + 0 如果 name 为空 变成 +0 正0 也就是 0 如果没有+0 如果为空 就成  “”[0]?:defval  ?表达式，缺少了一个表达式，当然就错了 这是一种技巧  #name[0]的意思是将name转换为字符串，然后再取出它的第一个元素？对的 注意空字符串，也有一个元素'\0'  字符串化运算符 # 用于宏定义语句，它的作用如下： #abc --->"abc" #1--->"1" #x--->"x"   字符串 可以当作数组用 “abc”[0] --->‘a’ “abc”[1] --->‘b’ "abc"[2]---->'c' "abc"[3]---->'\0' 一个只有三个字符，两边加上引号的字符串（其中不包含转义字符，转义字符另有计算法）， 一共有四个字符，最后一个是字符串结束符 ‘\0’ ，也就是值为0的字符

user: user-0
content: 引用 2 楼 lm_whales 的回复:#name  ---->"name" #是字符串化运算符 可以把一个符号，转换为对应的字符串（两端加上引号）  #define DEFARG(name, defval) ((#name[0]) ? (name + 0) : defval) 如果 name 不是空格 ,例如  name 是1 那么么 #name[0] 也就是 “1”[0] 是字符‘1’为真 这个问号表达式的值就是 name + 0 也就是 name 本身 ，这里就是1 如果是 x 那么值就是 x 这样不论是变量，还是常量 都得到他本身  如果 name 是空格，则#name 是 "" 空串，“”[0] 就是'\0' 是值为 0 的字符，为假 此时问好表达式的值为  defval  所以这个宏的意思就是 name 为空，取缺省值defval，不为空取 name的值 这对于指针，整型数据，浮点数据等等都有效  #define f1(arg0) _f1(DEFARG(arg0, 0)) 相当于，给无缺省值的函数（C式样的函数），针对某一个参数增加一个缺省值， 相当于 inline int f1 (int a=0){ return _f1(a); } 但是比C++缺省值，更加好用些，可以给任何一个参数加上缺省值。  #define f2(arg0, arg1) _f2(DEFARG(arg0, 0), DEFARG(arg1, 1)) 给 _f2的每个参数，都加个缺省值，分别为0，1  函数调用方式没有参数的地方，就是有缺省值的 为什么要name + 0呢？不加0就出错，还有#name[0]的意思是将name转换为字符串，然后再取出它的第一个元素？这个理解正确吗

user: user-2
content: #，预编译时会作为连接字符，将#name当成字符串

user: user-3
content: 其实这个宏定义是带参数的宏定义： #define DEFARG(name, defval) ((#name[0]) ? (name + 0) : defval) /*这里，DEFARG是宏名，(name,defval)是他的两个参数名。后面的括号内容是参数的定义方式。这里可以把这个宏看作一个函数，不过他是与处理的： 当#name[0]为真时（无参数），返回name+0； 当#name[0]为假时（有参数），返回defval（默认值） */ 比如： #define f1(arg0) _f1(DEFARG(arg0, 0)) /*对于f1()的调用，因为#name[0]为真（没有传递参数），所以返回name+0=0； 对于f1(1)的调用，因为#name[0]为假（有参数传递），所以返回defval=1； */ 又比如： #define f2(arg0, arg1) _f2(DEFARG(arg0, 0), DEFARG(arg1, 1)) /*对于f2(，)的调用，因为#name[0]为真（没有传递arg0参数），所以返回arg0+0=0； 因为#name[1]为假（有传递arg1参数），所以返回arg1=1； 所以输出为1；  对于f2(2,0)的调用，参考上面分析：结果为2+1=3； */   下面这篇文章有很详细的介绍，可以了解一下 blog.163.com/xuwenqiang_1989/blog/static/49074935201132433318770/
user-0 提问: C语言  linux  如何构造满足execv()的以NULL结尾的字符串数组参数表？

回复:
user: user-1
content: malloc、realloc、free

user: user-2
content: char argv_1[args][MAX_SIZE];                //其中args是前面参数分割后的个数，已知。 int i=0; while(i<args) {         strcpy(argv_1[i],argv[1]);         i++; } argv_1[args]=NULL;      //此处改成argv_1[i] = NULL;

user: user-0
content: 引用 3 楼 user-3 的回复:与上面第2点的区别在于在于什么。。。

user: user-3
content: 与上面第2点的区别在于

user: user-0
content: 再补充以下，如果循环使用，第一次有m个参数，第二次有n个参数，m>n时，就会因为没有初始化字符串数组而出现内容字符串多出并重复（因为第二次NULL实际上是在第m+1个位置上，大于n+1） 不知道有没有描述清楚 char *argv_1[BUF_SIZE]; int k=0; while(k<args) {     argv_1[k]=argv[k];     k++; } argv[k]=NULL;//这句不可以少，否则会有被前面覆盖的可能（初始化的问题）

user: user-0
content: 好吧，我想了半天就在刚发帖后发现下面做法可以： char *argv_1[BUF_SIZE]; int k=0; while(k<args) { 	argv_1[k]=argv[k]; 	k++; }  与上面第2点的区别在于新声明的字符串数组的声明方式不同。 具体原因我其实也不理解，可以明确是我对字符串数组理解不够深入，如果大家看到这里有想法说说自己的想法吧～谢谢～
user-0 提问: Dev C++多文件编译问题

回复:
user: user-1
content: Bll.h 可以包含任何你想包含的东西，包括 stdio.h 然后由于项目不大，所有文件都包含 Bll.h 就可以了

user: user-2
content: 为什么main.c包含了stdio.h头文件,iMainMenu.c就不能包含stdio.h? 头文件本来就是用来包含的，头文件只是一些函数的声明，宏定义什么的，并没有函数的实现 楼主既然那么不想重复包含头文件那就都写在一个文件里好了，没必要分多个文件
user-0 提问: 用数组输出菱形之莫名其妙问题

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

user: user-2
content: 与编译器有关吧，vs2015运行结果如下：

user: user-3
content: 在屏幕上打印 '\0' 的效果是由实现定义的。与编译环境、运行环境有关。如果非要打印它不可，那就认命。要不就改成     for(i=0; i<5; i++)     {         for(j=0; j<5; j++)         {             if (c = diamond[i][j])                 printf("%c", c);         }         printf("\n");     }

user: user-4
content: 全部25个字符都初始化一下试试？
user-0 提问: 数据写入文本 出现乱码  大神求教

回复:
user: user-0
content: 引用 1 楼 qq423399099 的回复:main函数里if("x==1")改为if(x==1) writetoFile函数里for(i=0;i<=n;i++)改为for(i=0;i<n;i++)这里多循环了一次 上面两处改掉以后我运行出来的结果是对的我重新试了下 这次好了 ，可能上次弄错了。但是如果输入的数字过长的话，还是有点问题；

user: user-1
content: 引用 6 楼 小灸舞的回复:fprintf不是存的二进制，存的是ASCII，即文本文件 fwrite才是存的二进制 受教了，我当时就是用fwrite写的，打开也是乱码，实际上没问题的

user: user-2
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 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-3
content: 乱码一般都是编码格式的问题  试试GB2312

user: user-4
content: fprintf不是存的二进制，存的是ASCII，即文本文件 fwrite才是存的二进制

user: user-1
content: 没问题，采取的二进制记录，所以文本打开有问题，实际上是保存成功的。 建议:写完查询记录模块，和显示模块。最后写读取文本数据模块。

user: user-5
content: int    x    ,      i       ,    n  ,j     ;　　把这一行　定义全局变量　　， 比如 ｉｎｔ　ＩｎＮｕｍ，ＰｅＮｕｍ； 试一试

user: user-4
content: 楼主输入截个图 并且楼主是用什么方式打开文件的，换一下编码方式看看

user: user-0
content: 引用 1 楼 小灸舞的回复:main函数里if("x==1")改为if(x==1) writetoFile函数里for(i=0;i<=n;i++)改为for(i=0;i<n;i++)这里多循环了一次 上面两处改掉以后我运行出来的结果是对的 这个改了，还是乱码啊。。。。

user: user-4
content: main函数里if("x==1")改为if(x==1) writetoFile函数里for(i=0;i<=n;i++)改为for(i=0;i<n;i++)这里多循环了一次 上面两处改掉以后我运行出来的结果是对的
user-0 提问: 新手提问，char msg[]和 char *msg  使用区别？

回复:
user: user-1
content: 可以这样理解

user: user-0
content: 多谢！～～～

user: user-0
content: 多谢！ 是说char mesg[]这种数组声明方式，数组在栈上开辟空间，重新复制了一份字符串？

user: user-1
content: char mesg[] = "Hold on to your hats,hackers. "; 这样写，数组是在栈上开辟的空间，是可以进行读写操作的 char *mesg = "Hold on to your hats,hackers. "; 这样写，mesg指向的是常量区的一个常量字符串“Hold on to your hats,hackers. ” 该内存区域是禁止进行写操作的，所以执行到fit函数的 *(string + size) = '\0';会报错
user-0 提问: 新手求教

回复:
user: user-1
content: 这是一个未定义行为，无论你怎么写都是错的，即使答案对了，那过程也是错的，因为你会发现换个编译器答案又不一样了。

user: user-2
content: 另外，这样的代码可读性比较差，不建议使用；

user: user-2
content: 对于模棱两可的问题，能避免就避免；不能避免那就不要这样传参嘛

user: user-3
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-4
content: ff 函数的参数中，各个参数表达式运算顺序没有不确定，不要写这样的代码

user: user-5
content: 答案当然是8. ff(c+1,c++,c)函数运行完之后对主函数无变化，需要有变化的话，需要将ff函数改为int ff(int a,int b,int c)，然后在分函数的最后加一个return c;然后再在主函数中改为d=ff(c+1,c++,c)。  #include<stdio.h> #include<stdlib.h>  int ff(int a,int b,int c){  printf("%d%d%d\n",a,b,c); //得出的答案是 9 7 8 c=a+b; printf("%d\n",c);  return c; }   void main(){   int d=7;    d=ff(d+1,++d,d); printf("%d",d);  system("pause"); }

user: user-6
content: 压栈顺序从右往左，这点可以确定 大多数环境栈都是从高地址往低地址用的，如果从左压，不定参数往后取在内存里就成往前走了。 而栈从高往低用是很久很久以前为了尽量不和别的内存使用打架，而复杂指令集CPU压栈出栈逻辑是写死的，所以虽然现在没这个必要了，但是为了兼容还保留了这个逻辑。 从右向左压栈可以保证生成汇编语言时这些参数相对于BP指向的栈位置的偏移量是固定的，因为程序员有时为函数传递的参数会或多或或少，如果从左向右压栈，则从BP指向的位置到参数的偏移量就会根据用户传入的参数数量而发生改变，这时编译器的识别难度就会大大增加，因此才会从右向左压栈。  至于输出的结果，因为有++的存在，会依赖编译器，不同的编译器结果很可能不同

user: user-7
content: 我运行了一下你的代码，答案是8 7 7 是同时传递值的。

user: user-0
content: 还有为什么最后的答案是8
user-0 提问: 为什么新的领域都不用c了

回复:
user: user-1
content: 一般我们写算法的时候也会先用matlab测试，测试成功后再转成c艹代码。

user: user-2
content: 引用 6 楼 CharlesSimonyi 的回复:搞算法用什么语言都可以，别人觉得python方便就用python了 当python遇到缩进乱了的时候……

user: user-3
content: 搞算法用什么语言都可以，别人觉得python方便就用python了

user: user-0
content: 引用 4 楼 akirya 的回复:其他语言效率也上来了，可选余地比较大了，机器性能也上来了。 绝大多数时候不那么苛求运行效率了，反而开发成本维护成本是主要考虑的因素。  相对来说C 和 C++ 性价比都不高，所以就越来越少了。  看了看那些领域的相关书，都是些算法，和编程有什么关系，有库c不是一样编，看来背后水很深啊

user: user-4
content: 其他语言效率也上来了，可选余地比较大了，机器性能也上来了。 绝大多数时候不那么苛求运行效率了，反而开发成本维护成本是主要考虑的因素。  相对来说C 和 C++ 性价比都不高，所以就越来越少了。

user: user-2
content: 引用 1 楼 CharlesSimonyi 的回复: Orz

user: user-0
content: 引用 1 楼 CharlesSimonyi 的回复:  什么意思，用python来学算法啊，那些算法之类的库为什么不直接提供c版本的

user: user-3
user-0 提问: c语言没见过的一种写法，求解释

回复:
user: user-1
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-2
content: #ifdef 标识符  程序段1  #else  程序段2  #endif 它的作用是：当标识符已经被定义过(一般是用#define命令定义)，则对程序段1进行编译，否则编译程序段2。

user: user-3
content: 一般在接口处，我们都会用这几个宏，没有实际用途，但是方便阅读  #ifndef IN #	define IN #endif  #ifndef OUT #	define OUT #endif  #ifndef INOUT #	define INOUT #endif  #ifndef OPTIONAL #	define OPTIONAL #endif

user: user-1
content: 引用 7 楼 lm_whales 的回复:C51 可以有一下标志，表示数据定义在不同区域 code data xdata idata 学到了

user: user-4
content: C51 可以有一下标志，表示数据定义在不同区域 code data xdata idata

user: user-5
content: 这不是宏定义吗

user: user-6
content: http://blog.csdn.net/mad1989/article/details/7920173

user: user-7
content: #define _xxx _xxx int* _name; 等同于 int* _name;  这里的_xxx没有实际作用，是给人看的或者是给特殊编译器做一些特殊处理的

user: user-8
content: 引用 2楼user-9 的回复:一般这种都是用在预编译的  防止重复定义的确，我看ucos就是这种写法。

user: user-1
content: #define _xxx short  //或unsigned或long或long long或signed…… #ifndef _xxx #define _xxx #endif _xxx int* _name;

user: user-0
content: _xxx int* _name; 主要是这个　 与int* _name; 有什么区别

user: user-9
content: 一般这种都是用在预编译的  防止重复定义

user: user-4
content: 这样一般都是编译器需要特殊处理的， 特定性质的标识符 也可能是某个库定义的 定义一个符号作为识别标志 这样有几个好处  1)可读性 有了这个 _xxx 我们知道 这是个特别的标识符 2）符合标准，对于处理不了这个 _xxx 标志的编译器，也能正常编译程序，不至于出错
user-0 提问: 关于正规式

回复:
user: user-1
content: 本人计算机专业，这是我编译原理中学的，来考古，顺便考前练练手

user: user-0
content: 引用 11 楼 calen_ 的回复:您有没有好好想想.... 你看看 00011101 这个字符串 '_>`  非常感谢谢，明白了，也就是说C答案其实跟A答案不是等价，因为C答案规定了10结尾的前面是连续的1再接连续的0，但是这个自动机可能会出现连续的0再接连续的1，所以C答案不正确， 谢谢

user: user-2
content: 这好像是编译原理吧，记得之前有学过

user: user-3
content: 您有没有好好想想.... 你看看 00011101 这个字符串 '_>`

user: user-0
content: hello，有人帮忙看一下吗

user: user-0
content: hello，有人能帮忙看看吗，谢谢

user: user-0
content: 引用 7 楼 qnmdcsdn 的回复:看标题我还以为是正则式，进来就懵逼了。看着眼熟，我只能说我应该是学过的  应该就是正规式吧，从有限自动机推算正规式

user: user-4
content: 看标题我还以为是正则式，进来就懵逼了。看着眼熟，我只能说我应该是学过的

user: user-0
content: HI，请问有人帮忙解答一下吗

user: user-0
content: 引用 1 楼 qq_28224387 的回复:郁闷，看了好大一会儿看不懂，多年前教材上见过这玩意儿 我想你发错地方了， 我的本来专业是电子信息工程，看到这图有点眼熟，我想你应该把这贴发到，硬件/嵌入式版块里有个，单片机/工控子版块。   哦，这个是软件设计师考试的题目，所以我想应该放在这里也可以吧

user: user-0
content: 支持一个，支持支持

user: user-5
content: 郁闷，看了好大一会儿看不懂，多年前教材上见过这玩意儿 我想你发错地方了， 我的本来专业是电子信息工程，看到这图有点眼熟，我想你应该把这贴发到，硬件/嵌入式版块里有个，单片机/工控子版块。

user: user-0
content: HI，请问有人帮忙解答一下吗
user-0 提问: fwrite函数失败，代码已给出，求帮助。

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

user: user-2
content: 帮结贴

user: user-3
content: rb+

user: user-0
content: 已自行解决：http://ask.csdn.net/questions/252446 希望能帮到后来人。
user-0 提问: VC6.0，Dev-c++

回复:
user: user-1
content: 应该是没有带编译器

user: user-2
content: WIN10可以装VC6.0，但你要改一个文件名，然后在兼容模式下运行，具体可百度

user: user-3
content: 可以使用安装cygwin，用gcc来玩

user: user-4
content: Dev挺适合新手学习的

user: user-5
content: vs2010~vs2015随便装一个咯

user: user-0
content: 引用 6 楼 赵4老师的回复:Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt 谢谢，，我去试试，，，，

user: user-6
content: VC应该可以使用。你尝试改下兼容性。 找到安装目录。如： D:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin 有个 MSDEV.exe  右击－〉属性－〉兼容性 可以选 Windows XP(WIN 8 之前应该都行，你可以多试试) 最后，在以管理员身份运行 前 打勾。 确认 后，再次打开就应该能用了。

user: user-7
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-8
content: 使用新版VS吧，新手可以用VS2010

user: user-9
content: 源文件没找到吧，看看路径对不

user: user-10
content: 建工程,在功能里编译, 不能建一个文件就编译

user: user-11
content: Dev C++是完全安装吗，建议重新安装。
user-0 提问: 求解C一个关于scanf拿不拿到值得问题

回复:
user: user-1
content: 我刷新输入缓冲区

user: user-2
content: 引用 8 楼 louis_green 的回复:[quote=引用 5 楼 cyfcsd 的回复:] [quote=引用 2 楼 louis_green 的回复:] [quote=引用 1 楼 cyfcsd 的回复:]  scanf( "%c", &end ) ;把回车接收了， 把这句话写两次就可以了  第一次节回车，第二次接你的输入 按你这么做，先给1，num拿1，第一个scanf拿回车，再输9，是第二个scanf拿9，还是，头一个scanf（num语句下面的）拿9？[/quote] 中间都要有两回车，如果只想要一个 scanf( "%c", &end ) ;，输入之间用空格隔开[/quote] 不行唉，中间都要俩回车，程序运行直接是一直输入的状态，输入啥也结束不了，包括q，也不行。[/quote] 不会吧，要退出的话第一个是回车第二是q

user: user-0
content: 引用 5 楼 cyfcsd 的回复:[quote=引用 2 楼 louis_green 的回复:] [quote=引用 1 楼 cyfcsd 的回复:]  scanf( "%c", &end ) ;把回车接收了， 把这句话写两次就可以了  第一次节回车，第二次接你的输入 按你这么做，先给1，num拿1，第一个scanf拿回车，再输9，是第二个scanf拿9，还是，头一个scanf（num语句下面的）拿9？[/quote] 中间都要有两回车，如果只想要一个 scanf( "%c", &end ) ;，输入之间用空格隔开[/quote] 不行唉，中间都要俩回车，程序运行直接是一直输入的状态，输入啥也结束不了，包括q，也不行。

user: user-3
content: 当楼主某次输入q的时候，是 scanf( "%d", &num ) ;先读取的，但由于类型无法匹配，所以读取失败，楼主可以通过scanf返回值得知此次读取失败了，输入缓冲区还是q\n 然后就执行到了scanf( "%c", &end ) ;end成功读取了q字符，之后while  ( end != 'q' ) 跳出循环

user: user-0
content: 引用 4 楼 qq423399099 的回复:你输入9，输入缓冲区是9\n,然后scanf( "%d", &num ) ;读走9,输入缓冲区还遗留下\n 然后scanf( "%c", &end ) ;会直接读取掉回车而不需要等待用户输入（此时输入缓冲区为空了） 然后又跳到while  ( end != 'q' )判断，之后是 scanf( "%d", &num ) 谢谢，你讲的很清楚，那如果接下来我希望程序结束，输入q，那这个q是转化为对应的ascii码整型数113给了num，还是跳过第一个scanf，直接给了字符型的end？

user: user-2
content: 引用 2 楼 louis_green 的回复:[quote=引用 1 楼 cyfcsd 的回复:]  scanf( "%c", &end ) ;把回车接收了， 把这句话写两次就可以了  第一次节回车，第二次接你的输入 按你这么做，先给1，num拿1，第一个scanf拿回车，再输9，是第二个scanf拿9，还是，头一个scanf（num语句下面的）拿9？[/quote] 中间都要有两回车，如果只想要一个 scanf( "%c", &end ) ;，输入之间用空格隔开

user: user-0
content: 引用 1 楼 cyfcsd 的回复:scanf( "%c", &end ) ;把回车接收了， 把这句话写两次就可以了  第一次节回车，第二次接你的输入 按你这么做，先给1，num拿1，第一个scanf拿回车，再输9，是第二个scanf拿9，还是，头一个scanf（num语句下面的）拿9？

user: user-3
content: 你输入9，输入缓冲区是9\n,然后scanf( "%d", &num ) ;读走9,输入缓冲区还遗留下\n 然后scanf( "%c", &end ) ;会直接读取掉回车而不需要等待用户输入（此时输入缓冲区为空了） 然后又跳到while  ( end != 'q' )判断，之后是 scanf( "%d", &num )

user: user-4
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-2
content: scanf( "%c", &end ) ;把回车接收了， 把这句话写两次就可以了  第一次节回车，第二次接你的输入

user: user-0
content: 引用 7 楼 qq423399099 的回复:当楼主某次输入q的时候，是 scanf( "%d", &num ) ;先读取的，但由于类型无法匹配，所以读取失败，楼主可以通过scanf返回值得知此次读取失败了，输入缓冲区还是q\n 然后就执行到了scanf( "%c", &end ) ;end成功读取了q字符，之后while  ( end != 'q' ) 跳出循环  谢谢舞哥，用scanf的返回值一检查，果然了然，果断关注！

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  大神这一席话，我将受用终身！
user-0 提问: atoi函数的一点疑惑，新手求助

回复:
user: user-1
content: 因为字符不是字符串，不会有结束符的 你的两个字符，被当成一个字符串处理了 这只是在特定情况才会出现的 不是总是这样的 这种错误，很麻烦，千万别这样做

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: 使用函数前，得清楚函数参数

user: user-4
content: http://en.cppreference.com/w/c/string/byte/atoi

user: user-4
content: atoi需要的参数是以\0结尾的字符串，而不是一个字符

user: user-5
content: atoi的传入参数应该是以空白符结尾的字符串，你传入的是字符指针，但atoi仍把其当作字符串指针对待，直到遇NULL为止。至于打印出来是43，这跟栈的变量存放顺序有关。

user: user-6
content: 这个跟编译环境和内存环境有关了，栈分配是从高地址向低地址分配的，如果ch1和ch2的地址相邻，因ch1在高地址，ch2在低地址，如果ch1后面又刚好是一个终止符，那么num2就可能是34. atoi的参数是一个c风格的字符串，即以终止符结束的字符串。 我在VS上得不到你这样的结果，这样的将一个单字符的地址传给atoi是未定义行为

user: user-7
content: 应为你写错了

user: user-2
content: 引用 12 楼 kuaileguyue 的回复:cheshi.exe  　　　ｆａｙｉｎ　　不准 扯屎 发音哪儿不准了？

user: user-8
content: cheshi.exe  　　　ｆａｙｉｎ　　不准

user: user-8
content: 二楼应该说的对

user: user-9
content: atio的参数是字符串，如果第一个非空格字符存在，是数字或者正负号则开始做类型转换，之后检测到非数字(包括结束符 \0) 字符时停止转换，返回整型数。否则，返回零。  &ch2的字符串在你的电脑中被认为成 "43"了。

user: user-0
content: 为什么num2变成了43而不是3？？？
user-0 提问: 有没有哪一款IDE有联想功能？

回复:
user: user-1
content: 你可以用VisualStudio+ visual assist x插件来写C代码，写完后再用CCS编译

user: user-2
content: 很多时候，使用的工具越先进，人越笨；得到得越轻松，人越懒。

user: user-3
content: 下载 visual assist x 插件，非常强大！

user: user-4
content: 带代码补全的很多  atom什么都可以

user: user-5
content: vi + 一个控件 控件名忘了，搜索一下吧

user: user-6
content: source insight 3.5，包含进去，内核都可以提示啊。

user: user-7
content: 如果只是变量的话notepad++都支持的，你可以用vs编辑代码啊，然后再用嵌入式的c编译器编译代码
user-0 提问: 作业求助！

回复:
user: user-1
content: #include <stdio.h>  static const char* g_mon_str[] = { 	NULL, "January", "February",  	"March","April", "May", "June",  	"July", "August", "September",  	"October","November", "December" };  static const char* g_daysuffix_str[] = { 	"th", "st", "nd", "rd", "th" };  int main(void) { 	int year, month, day; 	const char* mon_str, *day_sfx; 	 	//get input 	printf("please input the date: "); 	if (scanf("%d,%d,%d", &year, &month, &day) != 3) { 		printf("invalid input, example:2003,12,31\n"); 		return -1; 	} 	 	//check date 	if ((month > 12) || (month < 1) || (day > 31) || (day < 1)) { 		printf("%d-%d-%d is not a valid date.\n", year, month, day); 		return -1; 	} 	 	//print result 	mon_str = g_mon_str[month]; 	day_sfx = g_daysuffix_str[(((day % 10) > 3) ? 4 : (day % 10))]; 	printf("%d %s %d%s\n", year, mon_str, day, day_sfx); 	 	return 0;	 }

user: user-0
content: char month[12][10]={" january ",........} char day[4][3]={"st","nd","rd","th"} 这两段用的是字符串吧?能给我简单的解释一下吗?谢谢!我只用过单个字符申明,这个好像没有学到.

user: user-2
content: char month[12][10]={" january ",........} char day[4][3]={"st","nd","rd","th"} if(ri%10==1)   printf(\n 日期为：%d %s %d \n",nian,month[yue-1],dat[0]) if(ri%10==2)   printf(\n 日期为：%d %s %d \n",nian,month[yue-1],dat[1]) if(ri%10==3)   printf(\n 日期为：%d %s %d \n",nian,month[yue-1],dat[2]) else   printf(\n 日期为：%d %s %d \n",nian,month[yue-1],dat[3])

user: user-2
content: 大概思路，请参考
user-0 提问: 关于C语言分支结构规范性的问题

回复:
user: user-1
content: 比用什么风格更重要的是在任何地方，任何时候都坚持用一种风格。 比爱哪种美眉更重要的是在任何地方，任何时候都坚持爱一个美眉。

user: user-2
content: 第一种如果嵌套层次过多会比较乱，Linux内核编码规范建议缩进不要超过三级，当然这只是一个建议，不同公司应该有自己的规范，如果没有，那就随你喜欢了

user: user-3
content: 两种方式差不多的，也都比较易读，易维护,从效率上来考虑： 如果用第二种方式，假设有8个分支，如果全部用if...else if来写，那么每次调用平均是要判断4次的 如果用第一种方式，嵌套在里面，只要判断3次  PS:也可以考虑用switch case多的时候switch用跳转表，性能好些 建议能用switch就用，编译器会选用较优的方式

user: user-4
content: 只要逻辑表达清楚就行了
user-0 提问: 变量值莫名改变

回复:
user: user-0
content: 引用 1 楼 Rewen 的回复:文件里面的内容是什么呢？  读出来的是文件的内容啊。  另外: fread如果写成  fread(&counter, sizeof(int), 1, fp); 扩展性和可读性都会好些。 文件第一位嘛是里面数据项的个数，紧接着是数据。二进制的文件结束不好判断所以直接记数据项数来读。 我是懒省事，int就4位嘛，不想写辣么多。。。不过你说得对。

user: user-1
content: 请学会使用数据断点。参考下面： #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-2
content: 文件里面的内容是什么呢？  读出来的是文件的内容啊。  另外: fread如果写成  fread(&counter, sizeof(int), 1, fp); 扩展性和可读性都会好些。
user-0 提问: I 心形 U

回复:
user: user-1
content: #include <stdlib.h> #include <stdio.h> int main() {     system("chcp 437 >NUL");     printf("I\x3U");     getchar();     system("chcp 936 >NUL");     return 0; }

user: user-2
content: 心脏用心形线 绘制

user: user-2
content: 1）用数组 表示，显示数组的内容 2)数据放在文件中 从文件中读出来，显示  不然的话，用 Window  GDI 画出来 读取路径，显示之

user: user-3
content: 引用 3 楼 baidu_34815154 的回复:不要printf输出的，用for语句来写的 用三个for循环？一个控制行，一个控制空格，另一个控制符号？

user: user-4
content: 这个行数太少了，直接printf最方便 不过三个图形都是各自对称的，也是能写的。。。

user: user-0
content: 不要printf输出的，用for语句来写的

user: user-5
content: 直接用printf()输出啊

user: user-0
content: *******                      **           **                       *                *                                                *                       *           *           *                  *               *                    *                         *                   *                     *               *                *                            *             *                        *               *                                                *******                               *                               * * * * * * *
user-0 提问: 图像灰度差直方图输出不完整，代码运行正确，求助！！！

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

user: user-2
content: BackGround这个为啥是200不是256呢

user: user-0
content: 顶顶顶顶顶顶顶顶顶
user-0 提问: curl_easy_perform阻塞

回复:
user: user-1
content: 引用 2 楼 u012408019 的回复:跟手机操作系统有关吗 有关。我瞎猜的。

user: user-0
content: 跟手机操作系统有关吗

user: user-1
content: 手机上是抢占式多任务操作系统吗？
user-0 提问: 关于c语言编译器问题求助！！

回复:
user: user-1
content: 编译器不同对于未初始化的变量的处理不同，有的编译器会初始化成0，所以对于这种不确定的行为，我们一定要记得初始化变量

user: user-2
content: 编译器的实现不同

user: user-0
content: 引用 1 楼 user-2 的回复:sum[]没初始化 引用 2 楼 qq423399099 的回复:你的sum数组需要初始化 for(i=0;i<3;i++)     { 		sum[i] = 0.0;//这里要初始化一下         for(j=0;j<5;j++)         {             sum[i]+=score[j][i];         }         subjectavg[i]=sum[i]/5.0;     }    感谢热心帮助！！！  那为什么在devcpp环境中正常输出结果。。。还是说devcpp不需要初始化....

user: user-1
content: 你的sum数组需要初始化 for(i=0;i<3;i++)     { 		sum[i] = 0.0;//这里要初始化一下         for(j=0;j<5;j++)         {             sum[i]+=score[j][i];         }         subjectavg[i]=sum[i]/5.0;     }

user: user-2
content: sum[]没初始化
user-0 提问: c实现二分查找问题

回复:
user: user-0
content: 引用 楼主 u012197585 的回复: 不是太明白您提到的写法为什么要这样写呢

user: user-1
content: scanf ("%c ") ;试试看

user: user-1
content: scanf ("%c "，&c) ;试试看

user: user-2
content: 因为%c会读取掉遗留的回车符. 举个例子：比如你输入5按下回车，此时输入缓冲区是5\n scanf("%d",&num);仅仅是读取掉了5(此时输入缓冲区为\n) 等到执行到scanf("%c",&c);由于输入缓冲区不为空，所以scanf会直接读取遗留的回车符从而看起来像跳过了这句 解决方法： scanf("%c",&c);前面加一句getchar();或者fflush(stdin);都行

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];
user-0 提问: 声明*C某类::Getdocument();（已声明，不兼容）

回复:
user: user-1
content: 加个前置声明 class CMy2015Doc; 然后在 实现文件中  #include "My2015Doc.h"

user: user-2
content: 只有返回值类型不同不能构成重载

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:使用强制类型转换？ 怎么强制转换呢？

user: user-3
content: 使用强制类型转换？
user-0 提问: 如何编程实现客户端某程序运行的结果自动上传到服务器

回复:
user: user-1
content: 命令行调用tftp？

user: user-2
content: 结束前先生成，然后生成以后上传，感觉直接调你手动上传的那个函数就行了，然后再结束呗

user: user-3
content: 你这个客户端都运行结束了，怎么上传啊，再写一个客户端，专门用来上传文件。
user-0 提问: WIN服务会莫名消失的问题 坐等

回复:
user: user-0
content: 我顶  求关注 求解答

user: user-0
content: 引用 4 楼 azsx5201 的回复:是不是你的程序在重启电脑之前没有完全退出，然后重启了程序文件被损坏。  我出现过这种情况。  没有 程序文件正常 可手动正常启动

user: user-0
content: 引用 2 楼 lwcvod 的回复:各种杀软，各种卫士，卸载掉，或者是添加信任  网上很多mysql服务消失的问题 都是给的解决方案 就是重新注册服务 但是我想知道为什么会消失 我想从根本上解决问题

user: user-1
content: 是不是你的程序在重启电脑之前没有完全退出，然后重启了程序文件被损坏。  我出现过这种情况。

user: user-0
content: 系统没有安装杀软和其他安全软件的 软件安装路径下文件完整 服务路径正常

user: user-2
content: 各种杀软，各种卫士，卸载掉，或者是添加信任
user-0 提问: 有一个关于C语言的小问题，感谢帮助

回复:
user: user-1
content: 楼主代码贴全吧

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

user: user-2
content: int count = 0; 	do 	{ 		count = 0;                 count = deal();//你在deal的处理 只有对count++ 所以只要进到了条件 你这种程序必然死循环 没有退出条件  	} while (count != 0);  消环算法 自己写很容易出问题的  如果用C++ 可以用boost库

user: user-3
content: F5运行， 等死循环了. 点vs的DEBUG菜单，再点Break ALL菜单。 然后单步执行看看
user-0 提问: 动态数组读取数据，求大神解答

回复:
user: user-1
content: 乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream！ 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。  对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 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-0
content: 最后还有个end啊，显示乱码

user: user-2
content: 两个问题： 1.lithinfo *lthdemo = new lithinfo[i];这句应该放在while(!feof(fp))循环之后，不然i是0啊 2.fseek以后，指针是指向文件开头的，而开头三行的数据是要跳过的，不能直接fscanf,所以要加三行fgets  #include <iostream> #include <stdio.h> #include <fstream> #include <string.h>  using namespace std;  struct lithinfo { 	int num; 	float stdep; 	float enddep; 	char sand[256]; };  void main() { 	FILE* fp; 	char buf[1000]; 	int i=0; 	if ((fp=fopen("F:\\lith.txt","r"))==NULL) 	{ 		cout << "File open error!\n" <<endl; 		return; 	}  	char str;      // read 逗号 	char str1; 	char str2;  	  	fgets(buf,1000,fp); 	fgets(buf,1000,fp); 	fgets(buf,1000,fp);  	while(!feof(fp))    // 计算行数 	{ 		fgets(buf, 1000, fp); 		i++; 	} 	cout<<i<<endl; 	 	lithinfo *lthdemo = new lithinfo[i]; 	fseek(fp,0,SEEK_SET); // 把指针移到起始位置 	fgets(buf,1000,fp); 	fgets(buf,1000,fp); 	fgets(buf,1000,fp); 	for(int n=0;n<i - 1;n++) 	{ 		fscanf(fp,"%d %c %f %c %f %c %s",<hdemo[n].num,&str,<hdemo[n].stdep,&str1,<hdemo[n].enddep,&str2,lthdemo[n].sand); 		cout<<lthdemo[n].num <<endl; 	} 	fclose(fp); }
user-0 提问: 蓝桥杯 区间k大数问题求各位解答啊。排序方面的错误，另外还有个小问题，都在注释里

回复:
user: user-1
content: 引用 2 楼 lm_whales 的回复:不定长数组，看着好用，其实陷阱也不少 尽量不用为妙 不定长数组和vector都是语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。

user: user-1
content: 在现实世界中，除时间和空间可能是无限的以外，其它任何事物都是有限的。

user: user-2
content: 上面写错了 bool isswap = true; for(i = r -1; isswap && i >= l; --i)//冒泡排序算法  {      isswap = false;     for(j = l; j < i; ++j)      {          if(b[j]<b[j+1])         {             isswap = true;             t=b[j+1];            b[j+1]=b[j];            b[j]=t;         }     }  }

user: user-3
content: Select 可以用排序做，任何一种都可以 但是修改版 快排 是更好的选择

user: user-2
content: bool isswap = true; for(i = l; isswap && i < r-1; ++i)//冒泡排序算法  {      for(j = l; j < r - i; ++j)      {          isswap = false;         if(b[j]<b[j+1])         {             isswap = true;             t=b[j+1];            b[j+1]=b[j];            b[j]=t;         }     }  }

user: user-0
content: 没人了吗

user: user-0
content: 我把数组大小 改为n+1 也不行啊。不用不定长数组，宏定义一个MAX,排序那块还是有错，，，是怎么回事？

user: user-3
content: 不定长数组，看着好用，其实陷阱也不少 尽量不用为妙

user: user-4
content: DEV是用的GCC做编译器，所以允许这样定义int a[n]; 楼主你的下标都是从1开始的，那就必然会造成越界，结果也就不好说了 假设你输入的n是5，你复制是从a[1]到a[5]的，越界了。。 楼主改掉以后再试试
user-0 提问: windows核心编程有些不懂

回复:
user: user-1
content: Windows驱动开发 http://www.osronline.com/  搜“毛德操”

user: user-2
content: windows技术内幕 这本书不错的。 还是要理解windows的操作和运行方式。

user: user-3
content: 引用 2 楼 qq423399099 的回复:我觉得核心编程的主题思想不在编程而在核心……我身边绝大多数搞内核的基本都不是从写驱动开始，而是从windbg调试内核开始的。你不调试光想靠读书背函数名根本就没完，导出函数列表几页a4纸都写不下……而调试内核熟悉了调用关系之后也就明白了该去找什么，写驱动也就比较得心应手。技术上的话基本的算法得会一点，但是c和x86汇编必须精通（c++可以不会，因为内核里基本没有c++代码）。另外建议从内存管理模块看起（目录名mm），那块比较容易理解。书的话除了有网友提到的《Windows核心编程》外，如果真的不是闹着玩而是想学好的话建议先啃了潘爱民先生的《Windows内核原理与实现》（配合着Windows Research Kernel源码看）。 p.s. Windows内核在Windows 8和Windows 10都有较大改动，但是NT部分变动基本为零，所以你啃下来一个内核基本就通吃了。  误导人了， 先学驱动，  再结合书籍，  windbg只是一部分

user: user-4
content: 我觉得核心编程的主题思想不在编程而在核心……我身边绝大多数搞内核的基本都不是从写驱动开始，而是从windbg调试内核开始的。你不调试光想靠读书背函数名根本就没完，导出函数列表几页a4纸都写不下……而调试内核熟悉了调用关系之后也就明白了该去找什么，写驱动也就比较得心应手。技术上的话基本的算法得会一点，但是c和x86汇编必须精通（c++可以不会，因为内核里基本没有c++代码）。另外建议从内存管理模块看起（目录名mm），那块比较容易理解。书的话除了有网友提到的《Windows核心编程》外，如果真的不是闹着玩而是想学好的话建议先啃了潘爱民先生的《Windows内核原理与实现》（配合着Windows Research Kernel源码看）。 p.s. Windows内核在Windows 8和Windows 10都有较大改动，但是NT部分变动基本为零，所以你啃下来一个内核基本就通吃了。

user: user-5
content: 边敲边学，再就是多看几遍
user-0 提问: 勇闯黄金十二宫——双鱼宫 求用c做

回复:
user: user-0
content: #include<stdio.h> int main() { 	int n,Si[40000],Fi[40000],i,j; 	while(scanf("%d",&n)!=EOF) 	{ 		int max=1; 		for(i=1;i<=n;i++) scanf("%d%d",&Si[i],&Fi[i]); 		for(i=1;i<n;i++) 		{ 			int count=1; 			for(j=i+1;j<=n;j++) 			{ 				if(Fi[j-1]>Si[j]) break; 				else {count++;if(count>max) max=count;}  			} 		} 		printf("%d\n",max); 	} 	return 0; }

user: user-1
content: //  /* Sample Input 3 0 2 0 1 1 3 Sample Output 2 */ //假设每次都是从初始时间连续进行攻击 否则需要进行排序 #include <stdio.h> #define FALSE 0 #define TRUE 1 struct attack { 	int start; 	int end; 	int time; };  int get_next_attack(struct attack att, int start , struct attack *first) { 	if (att.start == start) 	{ 		if(att.time <= first->time) 		{ 			first = &att; 		} 		return FALSE; 	}  	return TRUE;	 } int main() { 	int n; 	scanf("%d", &n); 	int i = 0; 	int start = 0; 	int attack_time = 1; 	struct attack first_att; 	for (; i < n; i++) 	{ 		struct attack att; 		scanf("%d", &att.start); 		scanf("%d", &att.end); 		att.time = att.end - att.start; 		if (i == 0) 		{ 			first_att.start = att.start; 			first_att.end = att.end; 			first_att.time = att.end - att.start; 		} 		if(TRUE == get_next_attack(att, start, &first_att)) 		{ 			start = first_att.end; 			attack_time++; 		} 	} 	printf("%d\n", attack_time); }
user-0 提问: gcc和vs编译结果不同

回复:
user: user-1
content: 楼主可以用%p打印两个字符的地址，楼主这样的用法会越界写入(也算是未定义行为) 用VS得出的结果是，两个字符地址相差12，因为是DEBUG版，所以会安插一些调试用的数据，所以相差12,（RELEASE就不是） 而在LINUX下用GCC编译得出两个字符地址相差1（而且打印的结果是1,5不是楼主的6,5） 我猜楼主的WINDOWS用GCC应该是两个字符地址相差1，而且c2分配到的地址在c1前面，所以第二次的5678 (5赋值给了c2,6覆盖到了c1) PS:这种打印结果和编译器关系很大，属于未定义行为！！！  void main() { 	char c1,c2; 	printf("%p %p\n",&c1,&c2);     scanf("%4c%4c",&c1,&c2); 	     printf("%c\n",c1);     printf("%c\n",c2); }

user: user-2
content: 引用 2 楼 akirya 的回复:%4c ?这个用的不对吧 %c是读取一个字符的，写4明显不对啊。      c      Matches a sequence of characters whose length is specified by the maximum field width (default               1);  the  next  pointer  must  be a pointer to char, and there must be enough room for all the               characters (no terminating null byte is added).  The usual skip of leading white space is sup-               pressed.  To skip white space first, use an explicit space in the format.

user: user-3
content: %4c ?这个用的不对吧 %c是读取一个字符的，写4明显不对啊。

user: user-2
content: 因为你用vc编译时候选择的是debug版，debug版为了便于调试等原因分配的空间是不连续的。 你可以试试用Release版。  首先你要知道你的程序 栈溢出了。栈空间的分配通常是由大到小， 所以C1地址比C2的地址大1， scanf C1的时候，C1存储的是1，之后的234就溢出了， scanf C2的时候，C2存储的是5，之后的6存储到C1中，之后的78同样溢出了。

user: user-0
content: 引用 3 楼 qq423399099 的回复:楼主可以用%p打印两个字符的地址，楼主这样的用法会越界写入(也算是未定义行为) 用VS得出的结果是，两个字符地址相差12，因为是DEBUG版，所以会安插一些调试用的数据，所以相差12,（RELEASE就不是） 而在LINUX下用GCC编译得出两个字符地址相差1（而且打印的结果是1,5不是楼主的6,5） 我猜楼主的WINDOWS用GCC应该是两个字符地址相差1，而且c2分配到的地址在c1前面，所以第二次的5678 (5赋值给了c2,6覆盖到了c1) PS:这种打印结果和编译器关系很大，属于未定义行为！！！  void main() { 	char c1,c2; 	printf("%p %p\n",&c1,&c2);     scanf("%4c%4c",&c1,&c2); 	     printf("%c\n",c1);     printf("%c\n",c2); }  明白了 我的vc6.0相差为4个字节。用windows下的gcc 是相差一个字节

user: user-3
content: 引用 4 楼 lgbxyz 的回复:[quote=引用 2 楼 akirya 的回复:] %4c ?这个用的不对吧 %c是读取一个字符的，写4明显不对啊。      c      Matches a sequence of characters whose length is specified by the maximum field width (default               1);  the  next  pointer  must  be a pointer to char, and there must be enough room for all the               characters (no terminating null byte is added).  The usual skip of leading white space is sup-               pressed.  To skip white space first, use an explicit space in the format. [/quote]  那lz的代码就是越界了