Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求助Win32 API的串口的数据读取，代码如下

回复:
user: user-1
content: 特供调试时使用：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-0
content: 恩这是个问题，还有我发现在打印buffread时只有前两个字节是能显示的，后面的就打印不出来，估计是buffread本身被写入时就有问题。也不是很清楚这个写入的机制？

user: user-2
content: ReadFile的第三个参数,你用的变量nwrite得赋个初值吧,貌似全局变量会自动赋初值为0,大概?
user-0 提问: 简易的printf函数

回复:
user: user-1
content: 先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  再参考 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: 引用 2 楼 guicaisa 的回复:[quote=引用 1 楼 user-3 的回复:] f = (float)va_arg(ap, double);  我擦，，神了，，求告知原理，，，是我初始化的值选的不好吗。。。[/quote] 自动类型提升，float会提升成double，就像char和short也会提升成int一样

user: user-3
content: 引用 2 楼 guicaisa 的回复:[quote=引用 1 楼 user-3 的回复:] f = (float)va_arg(ap, double);  我擦，，神了，，求告知原理，，，是我初始化的值选的不好吗。。。[/quote]  好象是va_arg 不支持float, 需要用double代替

user: user-0
content: 引用 1 楼 user-3 的回复:f = (float)va_arg(ap, double);  我擦，，神了，，求告知原理，，，是我初始化的值选的不好吗。。。

user: user-3
content: f = (float)va_arg(ap, double);
user-0 提问: 杭电1005，runtime error,提示stack overflow,帮忙看下。。。

回复:
user: user-1
content: 这种题使用递归不光是栈溢出，还很可能超时。这是道数字题，看看下面的AC代码吧~#include<iostream> using namespace std; int main() { 	int A,B; 	unsigned int n; 	cin>>A>>B>>n; 	while(A&&B&&n) 	{ 		int *p=new int[50];    //存在循环，在这里判断，来减少运行时间 		if(n>50) 			n=(n-2)%48+2; 		*p=*(p+1)=1; 		for(int i=2;i<n;i++) 			*(p+i)=(A**(p+i-1)+B**(p+i-2))%7;  //公式 		cout<<*(p+n-1)<<endl; 		cin>>A>>B>>n; 	} 	return 0; }

user: user-2
content: 引用 6 楼 Falleyes 的回复:这种题使用递归不光是栈溢出，还很可能超时。这是道数字题，看看下面的AC代码吧~#include<iostream> using namespace std; int main() { 	int A,B; 	unsigned int n; 	cin>>A>>B>>n; 	while(A&&B&&n) 	{ 		int *p=new int[50];    //存在循环，在这里判断，来减少运行时间 		if(n>50) 			n=(n-2)%48+2; 		*p=*(p+1)=1; 		for(int i=2;i<n;i++) 			*(p+i)=(A**(p+i-1)+B**(p+i-2))%7;  //公式 		cout<<*(p+n-1)<<endl; 		cin>>A>>B>>n; 	} 	return 0; } 6楼正解，直接循环n次的即使不stack overflow，也会超时，因为析好像是最只有50个结果就会出现循环，具体怎么分析的我就不清楚。另外一种比较容易理解的就是构造一个矩阵，使用矩阵快速幂。

user: user-3
content: 这题不需要递归，已经知道f(n-1),f(n-2) 得到f(n) 既然从f(1),f(2) 就得到f(3) ,同时f(1)就没有用了，用int f[2] 来计算一下就可以了    int f[2];     f[0] =f[1] =1;     int cur=1,last=0;     for(int i=0;i<n;i++)     {         cur ^=1,last ^=1;         f[cur]  =(A*f[last] + B *f[cur]) %7;     }

user: user-0
content: 引用 4 楼 user-4 的回复:引用 3 楼 Miss_Play 的回复:[quote=引用 2 楼 user-4 的回复:] 递归深度太深了.不是用递归做吗QAQ太深会怎样，devC运行正确啊。。。 栈会用光的  你试过 999 999 999999999吗  我其实没看题.....反正递归太深是不行的. [/quote]我先去查查stack是什么。。。

user: user-4
content: 引用 3 楼 Miss_Play 的回复:引用 2 楼 user-4 的回复:递归深度太深了.不是用递归做吗QAQ太深会怎样，devC运行正确啊。。。 栈会用光的  你试过 999 999 999999999吗  我其实没看题.....反正递归太深是不行的.

user: user-0
content: 引用 2 楼 user-4 的回复:递归深度太深了.不是用递归做吗QAQ太深会怎样，devC运行正确啊。。。

user: user-4
content: 递归深度太深了.

user: user-0
content: 【附题】  Problem Description A number sequence is defined as follows:  f(1) = 1, f(2) = 1, f(n) = (A * f(n - 1) + B * f(n - 2)) mod 7.  Given A, B, and n, you are to calculate the value of f(n).    Input The input consists of multiple test cases. Each test case contains 3 integers A, B and n on a single line (1 <= A, B <= 1000, 1 <= n <= 100,000,000). Three zeros signal the end of input and this test case is not to be processed.    Output For each test case, print the value of f(n) on a single line.    Sample Input 1 1 3 1 2 10 0 0 0    Sample Output 2 5
user-0 提问: 请大神运行一下，然后解释下哪里出错了？我要详细回答，谢谢，详细告诉我原因

回复:
user: user-1
content: 这个代码根本不能编译通过。  move方法的少了一个 右大括号 }  其它问题：   {int *q,t,i,j; int *min,*max; min=max=p; for(i=0;i<5;i++)   // for语句的循环体应该使用 {} 明确的表示出了。 for(j=0;j<5;j++) if(*min>*(p+5*i+j))min=(p+5*i+j);  // if 语句的从句，不要与if写在一行上，应该换行。 else if(*max<*(p+5*i+j))max=(p+5*i+j);

user: user-2
content: 要学着自己单步一个. 还有,上代码时格式化下,...要不然难看死啦,还有.说明一下代码的意图...   void move(int *p)  {    ///////.............     min=p+1;     for(i=0;i<5;i++)         for(j=0;i<5;j++)    /// 这里死循环了:这个 i<5 ,.... 应该是  j<5 吧 .         {             if((i==0&&j==0)||(i==0&&j==4)||(i==4&&j==0))continue;             if(*min>*(p+5*i+j))min=(p+5*i+j);         }        t=*min;    //// .......
user-0 提问: 请问在vs2013中，这句代码显示不是很清楚，这表示什么意思？

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

user: user-2
content: 引用 4 楼 bo2256321 的回复:其中_WIN32和_stdcall表示什么？谢谢 这种名词解释问题直接google，MSDN

user: user-0
content: 引用 2 楼 60 的回复: 这叫“非活动代码”，由于没有定义宏“CUFFTAPI”，ifndef的结果为真，#else中的这些代码不会被编译。 谢谢，能否顺便解释下#ifdef _WIN32 #define CUFFTAPI _stdcall 其中_WIN32和_stdcall表示什么？谢谢

user: user-3
content: 导出函数的宏定义，在windows下使用__stdcall，在linux下使用默认的cdecl

user: user-4
content: 这叫“非活动代码”，由于没有定义宏“CUFFTAPI”，ifndef的结果为真，#else中的这些代码不会被编译。

user: user-2
content: 条件宏中不满足条件的代码
user-0 提问: 想到一个问题：如何用逻辑或数学运算取代IF判断。

回复:
user: user-1
content: if(A%B==0) return 1 else return 0  ===========  float C = A%B; return 1^(   (int)( C/(C+0.01f) + 0.5f )  )  ;

user: user-1
content: if(A%B==0) return 1 else return 0  ===========  float C = A%B; return 1^(   (int)( C/(C+0.01f) + 0.5f )  )  ;

user: user-2
content: 嘿嘿，楼主能把CMP指令从cpu里扒掉吗

user: user-3
content: IF不能取代吧，试想如果汇编不能用IF，相当于只能使用JMP和CALL指令来跳转，并且所有的比较指令都不能用，你说程序怎么写？

user: user-4
content: 引用 2 楼 u012677852 的回复:[quote=引用 1 楼 user-4 的回复:] 条件判断是不可替代的  数学上证明过  求最大值不就可以么？？[/quote]  假如，你用很巧妙的方法用异或实现了if（我个人目前认为可行） 但异或本身就是在判断啊  所以我觉得没什么意义

user: user-0
content: 引用 1 楼 user-4 的回复:条件判断是不可替代的  数学上证明过  求最大值不就可以么？？

user: user-4
content: 条件判断是不可替代的  数学上证明过
user-0 提问: 读取串口数据请教

回复:
user: user-1
content: 串口的数据比较易丢帧粘帧, 读写的频率最好不要快过 帧/15ms.,(即收发数据的轮询次数).

user: user-2
content: 不台了解详情，猜的：感觉是读了一次后，才真正触发，把数据读到缓冲区，第一次只是中断到，并没有把数据放到缓冲区。
user-0 提问: 如何建立参数初始化

回复:
user: user-0
content: 五个变量为g_wSYZJ，g_wSYAA，g_wSYAB，g_wSYAC，g_wSYAD  变量cwPASSIVE_CNT=5

user: user-1
content: 这个估计没人能帮你。  1）首先不知道要初始化哪5个变量 2）其次没人知道你的EEPROM是怎么连接的，只有硬件文档或者硬件设计者知道，你要查文档或者问硬件开发者。 3）没人知道你需要的5个变量是干什么的，只有把内部实现全理解了或者接口说明理解了，才知道怎么填这些变量。

user: user-0
content: 是建立5个变量

user: user-0
content: 建立5个函数，如何初始化
user-0 提问: vs2013生成可执行程序的问题

回复:
user: user-1
content: 如果你使用VS创建了项目，可以修改项目的“生成配置”，直接在工具栏上修改，修改为Win32 或者 修改“生成”-“配置管理器”，新建一个配置，使用Win32 。

user: user-2
content: 引用 2 楼 liguanpei 的回复:[quote=引用 1 楼 user-2 的回复:] ""C:\Program Files\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"" x86 直接修改为goto x86 么？还有保存的时候说在别的程序中打开，不能修改[/quote]  在控制台输入上面的命令就好了，你的开始菜单应该已经有这个链接了。

user: user-0
content: 引用 1 楼 user-2 的回复:""C:\Program Files\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"" x86 直接修改为goto x86 么？还有保存的时候说在别的程序中打开，不能修改

user: user-2
content: ""C:\Program Files\Microsoft Visual Studio 11.0\VC\vcvarsall.bat"" x86
user-0 提问: 为什么x的值老是被干掉啊~~~~(>_<)~~~~ 

回复:
user: user-0
content: 谢谢谢谢谢谢1

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

user: user-2
content: 你看下你的for循环怎么写的。  能这样么？ for() {        for()        {         } }

user: user-3
content: %d能把double正确打印出来吗？ 看你这段代码，去掉最高最低分求平均吧，写的好啰嗦，一次循环就够了啊
user-0 提问: 求助关于强制类型转换的问题

回复:
user: user-1
content: 引用 2 楼 Afdadfssff 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E 如何进VC编译选项呢？最好能给个图[/quote] 离不开看图识字的人是在卖萌！ VC6：   VS20XX：

user: user-2
content: 先转WORD就是扔掉 超过16位的部分,转成DWORD之后就可以转成LPSTR了

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E 如何进VC编译选项呢？最好能给个图

user: user-1
content: VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E
user-0 提问: C语言编程题，谁会？

回复:
user: user-1
content: http://www.cnblogs.com/emituofo/archive/2012/11/14/2770193.html 这里有答案

user: user-0
content: 例如：15=1+2+3+4+5       15=4+5+6       15=7+8       所以结果有3组值分别是1->5, 4->6, 7->8
user-0 提问: 新手写的堆排序，求教下maxheapcreat那里为什么老报错

回复:
user: user-0
content: 谢谢ls

user: user-1
content: int temp=a[i],j=2*i+1;

user: user-1
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-0
content: E:\Sort\MaxHeapSort\MaxHeapSort.cpp(12) : error C2059: syntax error : 'bad suffix on number' E:\Sort\MaxHeapSort\MaxHeapSort.cpp(12) : error C2146: syntax error : missing ';' before identifier 'i' E:\Sort\MaxHeapSort\MaxHeapSort.cpp(12) : warning C4552: '+' : operator has no effect; expected operator with side-effect E:\Sort\MaxHeapSort\MaxHeapSort.cpp(21) : error C2059: syntax error : 'bad suffix on number' E:\Sort\MaxHeapSort\MaxHeapSort.cpp(21) : error C2146: syntax error : missing ';' before identifier 'i' E:\Sort\MaxHeapSort\MaxHeapSort.cpp(21) : warning C4552: '+' : operator has no effect; expected operator with side-effect 执行 cl.exe 时出错.
user-0 提问: C语言如何获取文本文档内想要的数据

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

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

user: user-3
content: 假设你文件每行都是有规律的，如下代码可参考

user: user-4
content: 试试  int x,y; fscanf(file_pointer,"%d;%d",&x,&y);

user: user-5
content: 123456;1 32431242;3 假设格式固定为 x;y 每次读取一行 分隔字符串 用strtok 分别把分隔的俩个数 存入变量 读文件每次读一行用fgets()   只是为了读取第一个数字 也可以用fscanf 格式化读取   如果你用python处理就是 一次把文件全部加载进来，文本处理用脚本会更方便 用split('\n'),s = '\n'.join(a) 来处理 会很简单,但是你从另一个角度去想 如果你用c实现 python的 split 与join  那么也就解决了以从设计角度来讲 解决大多数文本处理的公共基本方法，
user-0 提问: C程序越界问题

回复:
user: user-1
content: 下面是该好了的代码： #include <iostream> using namespace std;  int main()  {  //1 定义两个变量  int a = 0;   int x = 0;  //2 输出提示语 printf("请给出x = （4a+8）*5中a的值：");  //3 输入a的值 scanf_s("%d",&a);  //4 计算结果 x = (4*a+8)*5;  printf("%d",x);  return 0;  }

user: user-2
content: 在不改变原有变量类型的情况下，建议将“scanf_s("%d",&a);”这句话改成“scanf_s("%hd", &a);”，这样就会将a当成short int进行处理而不是当成int，就不会有“stack corrupted”错误了。 原因是scanf_s是通过va_arg进行参数分析，没有严格的类型检查，所以参数出栈时是根据%里定义的type size，所以把short类型的a当成了int类型去处理了。

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

user: user-4
content: 变量 a  是一个 short 型 scanf("%d", &a);   // 这里会发生溢出,(这里最少需求一个 int 类型的空间)  把变量 a  b 改成 int a, b; 就OK了
user-0 提问: poj 1008 老是WA

回复:
user: user-0
content: 感谢赵老师，确实，现在有点急功近利，老是静不下来，我会好好调试的，谢谢

user: user-1
content: tot%13有问题，这样取值为0-12了 应该是%13+1， 前面那个tot不要加1

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

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

回复:
user: user-1
content: 搜“连连看 C源代码”

user: user-2
content: 二维数组。。

user: user-3
content: 这~~~~~只有这些代码,只能猜啦.... 按着一般性实现的逻辑也不难猜,  build_map b[i][j] 二维表: ------------------ 1  |  2  |  1  |  5  | ... ------------------ 5  |  3  |  2  |  5  |... ----------------- 6  |  7  |  5  |  3 |.... ------------------ 里面的数字是资源号,如:   1:青瓜,   2:菊花....等等 (画面自行脑补一下) 数组 a[], 用于统计生成了多少 青瓜,, 菊花..等等 然后由...renderer 把 b[i][j] 渲染到窗口上..按 b[][] 二维格子.把物件画到相应的位置上

user: user-0
content: 请问各位大神
user-0 提问: [SWU]大家帮忙检测下是否完成了要求

回复:
user: user-1
content: flen    = get_file_size(fp); printf("%d\n", flen);

user: user-2
content: 要求是输出长度，不应该有0324.txt file size:等字符，测试程序是不会明白的。 应该考虑一下怎样写一个程序来测试就知道为何了。

user: user-1
content: 仅供参考

user: user-1
content: lly@Debian:~$ vi 0324.txt (输入1234567890) 后切换到命令模式下输入“:wq”保存 lly@Debian:~$ vi 0324.c  #include <stdio.h> #include <string.h>  #define FILE_NAME       "0324.txt" #define BUF_SIZE        50 #define FILE_NOT_FOUND  -1 #define SUB_STR_FOUND   1 #define SUB_STR         "ac"   int get_file_size(FILE *fp); void get_file_content(FILE *fp, char *buf); int find_substr(const char *buf, const char *substr); void sort_inverted_sequence(char *buf, int size);   int main(void) {         int rev;         FILE *fp;         char buf[BUF_SIZE];         unsigned long int flen;          rev     = 0;          fp      = fopen(FILE_NAME, "r");         if (NULL == fp) {                 rev     = FILE_NOT_FOUND;                 return rev;         }          flen    = get_file_size(fp);         printf("%s file size: %d\n", FILE_NAME, flen);          if (0 < flen <= BUF_SIZE + 1) { //EOF byte                 get_file_content(fp, buf);                  rev     = find_substr(buf, SUB_STR);                  sort_inverted_sequence(buf, flen - 1);                 printf("%s", buf);         }         return rev; }   //Get file's size //fp is the pointer which point the file opened int get_file_size(FILE *fp) {         unsigned long filesize = -1;          fseek(fp, 0L, SEEK_END);        //Small file         filesize        = ftell(fp);          fseek(fp, 0L, SEEK_SET);        //fp point the first char again         return filesize; //Contain EOF byte }   //Read file in buf //fp is pointer of file //buf used save string in file //Use if after get_file_size() void get_file_content(FILE *fp, char *buf) {         int i;         for (i = 0; !feof(fp); ++i) {                 buf[i]  = fgetc(fp);         }         buf[i - 1]      = '\0'; //buf[i - 1] is EOF, End by 0 }   //Find the substring //substr is the substring which find in buf int find_substr(const char *buf, const char *substr) {         char *p;         p       = strstr(buf, substr);         if (NULL != p) return SUB_STR_FOUND;         return 0; }   //Sort the buf by big to small //buf is the sequence will be sorted //size if the size of buf void sort_inverted_sequence(char *buf, int size) {         int i, j, k;         char temp;          for (i = 0; i < size - 1; i++) {        //Small sequence                 k       = i;                 for(j = i + 1; j < size; j++) {                        if (buf[i] < buf[j]) {                                k        = j;                        }                 }                  if (i != k) {                         temp    = buf[i];                         buf[i]  = buf[k];                         buf[k]  = temp;                 }         } }    lly@Debian:~$ gcc 0324.c lly@Debian:~$ ./a.out 0324.txt file size: 11 9876543210 lly@Debian:~$ echo $? 0 lly@Debian:~$

user: user-0
content: 师兄帅气~！！

user: user-0
content: 0319.txt  中存放  的是  1234567890
user-0 提问: error: ‘BQ24196_charger_pdata’ undeclared (first use in this function) 

回复:
user: user-0
content: 谢谢。。。。

user: user-1
content: data = devm_kzalloc(&client->dev,sizeof(*(BQ24196_charger_pdata)), GFP_KERNEL); 改为 data = devm_kzalloc(&client->dev,sizeof(struct BQ24196_charger_pdata), GFP_KERNEL); 或者 data = devm_kzalloc(&client->dev,sizeof(*(data)), GFP_KERNEL);
user-0 提问: C语言问题

回复:
user: user-1
content: 不知道算法是怎么的，这样很难猜 这样子赋值有什么深意 啊？

user: user-2
content: 单独一个语句拿出来，估计就是神仙也不知道这个有什么用。

user: user-0
content: switch(rand()%10)//随机产生图形  			{ 	        case 0:printf("★");b[i][j]=0;++a[0];continue; 			case 1:printf("◆");b[i][j]=1;++a[1];continue; 			case 2:printf("■");b[i][j]=2;++a[2];continue; 			case 3:printf("▲");b[i][j]=3;++a[3];continue; 			case 4:printf("〓");b[i][j]=4;++a[4];continue; 			case 5:printf("卍");b[i][j]=5;++a[5];continue; 			case 6:printf("☆");b[i][j]=6;++a[6];continue; 			case 7:printf("◎");b[i][j]=7;++a[7];continue; 			case 8:printf("♀");b[i][j]=8;++a[8];continue; 			case 9:printf("※");b[i][j]=9;++a[9];continue; 这是个连连看程序的一部分，就是不懂b[i][j]是什么意思

user: user-3
content: 相信switch的外面有个循环。

user: user-1
content: switch 中能用 continue; 吗

user: user-4
content: 单独一个语句拿出来，估计就是神仙也不知道这个有什么用。
user-0 提问: 结构体的小问题

回复:
user: user-1
content: 引用 2 楼 ilinfe 的回复:[quote=引用 1 楼 u010005508 的回复:] 这里肯定有个主要的参考字段，假设你将班级号当主要参考，那么只有当两组数据的班级号相同时，你才需要去比较他们的序号(按升序排)，否侧就是根据班级号来升序排的！ 反过来假如你将序号当主要参考，那么也是类似的！ ps:假如这里没有啥主次之分，那就需要你自己定义一个根据班级号和序号排序的算法  班级号是主要参考，排好班级以后要排班级里面同学的序号，我不知道该怎么排[/quote] 给个简单示例，你参考下吧，主要就是compare_student()函数 #include <iostream> using namespace std; struct Student { 	int ClassNumber; 	int Number; 	char Name[20]; };  int compare_student(Student a,Student b)//定义比较大小的函数，a>b返回1，a=b返回0，a<b返回-1 { 	if(a.ClassNumber==b.ClassNumber) 	{ 		return a.Number>b.Number?1:(a.Number==b.Number?0:-1); 	} 	else 	{ 		return a.ClassNumber>b.ClassNumber?1:-1; 	} }  void sort_student(Student* pStudent,int num) { 	Student temp; 	for(int i=0;i<num;i++) 	{ 		for(int j=i;j<num-1;++j) 		{ 			if(compare_student(pStudent[j],pStudent[j+1])==1) 			{ 				temp=pStudent[j]; 				pStudent[j]=pStudent[j+1]; 				pStudent[j+1]=temp; 			} 		} 	} }  void print_student(Student* pStudent,int num) { 	for(int i=0;i<num;++i) 	{ 		cout<<pStudent[i].ClassNumber<<ends<<pStudent[i].Number<<ends<<pStudent[i].Name<<endl;; 	} } void main() { 	Student students[4]; 	for(int i=0;i<4;++i) 	{ 		sprintf(students[i].Name,"%s%d","name",i+1); 	} 	students[0].ClassNumber=1; 	students[0].Number=4; 	students[1].ClassNumber=1; 	students[1].Number=3; 	students[2].ClassNumber=2; 	students[2].Number=3; 	students[3].ClassNumber=3; 	students[3].Number=2; 	sort_student(students,4); 	print_student(students,4); }

user: user-2
content: 这位朋友，不知道你的数据结构是如何实现，就我对你描述的需求的理解，你貌似要求输出的样子是首先班级号是有序的，其次在同一个班级号中，序号是有序的。 那么小弟拙见，我觉得没必要排两次，你可以这样，把班级号和序号组合成一个数，假如班级号和序号最多都到99，那么班级号11，序号23可以组合为1123，同理，班级号3，序号17可以组合为0317(即317)，然后你再对这个组合数进行排序，不是很简单而且只需要排一次。等排完了，你再把组合数拆开再去打印即可。 不过，只是基于我对于此需求的理解，如果理解错了，这个方法就没用了。

user: user-3
content: if (a.class_number> b.class_number || (a.class_number==b.class_number && a.number>b.number)) {    //TODO:交换a，b   // }

user: user-0
content: 引用 1 楼 u010005508 的回复:这里肯定有个主要的参考字段，假设你将班级号当主要参考，那么只有当两组数据的班级号相同时，你才需要去比较他们的序号(按升序排)，否侧就是根据班级号来升序排的！ 反过来假如你将序号当主要参考，那么也是类似的！ ps:假如这里没有啥主次之分，那就需要你自己定义一个根据班级号和序号排序的算法  班级号是主要参考，排好班级以后要排班级里面同学的序号，我不知道该怎么排

user: user-1
content: 这里肯定有个主要的参考字段，假设你将班级号当主要参考，那么只有当两组数据的班级号相同时，你才需要去比较他们的序号(按升序排)，否侧就是根据班级号来升序排的！ 反过来假如你将序号当主要参考，那么也是类似的！ ps:假如这里没有啥主次之分，那就需要你自己定义一个根据班级号和序号排序的算法
user-0 提问: 1>main.obj : error LNK2005: "class Student * stu" (?stu@@3PAVStudent@@A) 已经在 inp

回复:
user: user-1
content: 从编译的错误提供看,是重定义问题. 在定义Sutdent.h文件的第一行加上  #pragma once

user: user-2
content: 编译错误自己检查
user-0 提问: 虐心的问题，关于软件安全的，都快哭了

回复:
user: user-0
content: 引用 6 楼 user-1 的回复:[quote=引用 5 楼 sinat_26815921 的回复:] [quote=引用 3 楼 user-1 的回复:] 2 A吧，3 B吧，不过这题目跟这个阅读有点搭不上的感觉啊。。有些东西阅读都没讲 第三题 a和d 好像也访问了非法内存了吧[/quote] 第三题感觉就没说清楚。。canary有很多种，AB可能都是对的，也可能都是错的对于不同的canary，比如如果只是在Buffer尾部存一个固定值，那么AB都是错的，D应该是错的，因为说了perhaps one outside the buffer's bounds，如果都超过Buffer了，那肯定没用。[/quote] 懂了 ，谢谢

user: user-1
content: 引用 5 楼 sinat_26815921 的回复:[quote=引用 3 楼 user-1 的回复:] 2 A吧，3 B吧，不过这题目跟这个阅读有点搭不上的感觉啊。。有些东西阅读都没讲 第三题 a和d 好像也访问了非法内存了吧[/quote] 第三题感觉就没说清楚。。canary有很多种，AB可能都是对的，也可能都是错的对于不同的canary，比如如果只是在Buffer尾部存一个固定值，那么AB都是错的，D应该是错的，因为说了perhaps one outside the buffer's bounds，如果都超过Buffer了，那肯定没用。

user: user-0
content: 引用 3 楼 user-1 的回复:2 A吧，3 B吧，不过这题目跟这个阅读有点搭不上的感觉啊。。有些东西阅读都没讲 第三题 a和d 好像也访问了非法内存了吧

user: user-0
content: 能具体说一下吗？第一题是怎么回事呢？我也觉得给的材料很装B,希望能具体讲讲呗，谢谢了

user: user-1
content: 2 A吧，3 B吧，不过这题目跟这个阅读有点搭不上的感觉啊。。有些东西阅读都没讲

user: user-0
content: 楼主再顶

user: user-0
content: 楼主自顶
user-0 提问: C语言习作：计算Mod型函数值源程序。感觉写得不简洁，高手看能不能改进下。

回复:
user: user-0
content: 引用 3 楼 pathletboy 的回复:我都怀疑我用的是不是真的C语言了 怎么说？有什么不对的么

user: user-0
content: 引用 1 楼 a1193561652 的回复:变量c未初始化就n=(a-c)/b;没问题吗？ 要得到余数可以 return   a-(a/b)*b; 另外汇编中的整除指令就是高位放余数，低位放商的。所以是可以用%直接得出余数，为什么要写这样一个函数？ 就是为了基础，所以要特别定义一下。

user: user-0
content: 怎么说？有什么不对的么？

user: user-1
content: 我都怀疑我用的是不是真的C语言了

user: user-2
content: 被楼主惊出一身冷汗。

user: user-3
content: 变量c未初始化就n=(a-c)/b;没问题吗？ 要得到余数可以 return   a-(a/b)*b; 另外汇编中的整除指令就是高位放余数，低位放商的。所以是可以用%直接得出余数，为什么要写这样一个函数？
user-0 提问: VS控制台算除法出错

回复:
user: user-1
content: VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-0
content: 引用 2 楼 zxh707wk 的回复:不要把宏定义当成有括号的  好吧，谢谢

user: user-0
content: 引用 1 楼 user-3 的回复:(SAMPLE/BEAT)* FID = (250 / 250 / 2) * 200 = (1 / 2) * 200 = 0 * 200 =0  啊，这样，！！！啊，好吧，，，谢谢！！！！

user: user-2
content: 引用 1 楼 user-3 的回复:(SAMPLE/BEAT)* FID = (250 / 250 / 2) * 200 = (1 / 2) * 200 = 0 * 200 =0+1，不要把宏定义当成有括号的

user: user-3
content: (SAMPLE/BEAT)* FID = (250 / 250 / 2) * 200 = (1 / 2) * 200 = 0 * 200 =0
user-0 提问: 文件指针问题

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

user: user-2
content: p->data.stuNam是地址，不需要再取地址，你是不是想输入一个字符串进去？

user: user-3
content: for(p=h;!(feof(fp));)  {         p -> next = (ListPtr) malloc (sizeof (ListNode));         //p=p->next;         fscanf(fp,"%ld %s",&(p->next->data.age),&(p->next->data.stuName));         h->data.age++;  }

user: user-4
content: lz想问啥

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

user: user-3
content: 快来看哪，楼主提了一个和文件指针有关的问题！
user-0 提问: 测试的时候数字总是错误

回复:
user: user-1
content: 试试将代码中的所有float替换为double 再将 if(s1=s2) 替换为 if (fabs(s1-s2)<1E6)

user: user-2
content: void compare(float x[],float y[],float r[],int a,int b) 两个圆的关系计算 是不是有点问题： 两个圆可能相交，外离，内含，相切，或者重合

user: user-3
content: 看不出其它问题了，楼主可以开始调试了....

user: user-0
content: 引用 5 楼 zhouxiaofeng1021 的回复:void compare(float x[],float y[],float r[],int a,int b) 两个圆的关系计算 是不是有点问题： 两个圆可能相交，外离，内含，相切，或者重合 昨天已经修改了~thank you

user: user-0
content: 引用 1 楼 hnwyllmm 的回复:if(s1=s2) { 比较相等不能这样比呀 还有，double类型的相等也不是这样做的，楼主搜索一下吧，拓展一下知识面  好的！还有其他的吗

user: user-4
content: 引用 1 楼 hnwyllmm 的回复:if(s1=s2) { 比较相等不能这样比呀 还有，double类型的相等也不是这样做的，楼主搜索一下吧，拓展一下知识面

user: user-3
content: if(s1=s2) { 比较相等不能这样比呀 还有，double类型的相等也不是这样做的，楼主搜索一下吧，拓展一下知识面
user-0 提问: C语言自建目录的权限问题

回复:
user: user-0
content: 对于umask的用法我自己查过的，但有两件事很奇怪： 1.为什么会有粘滞位T，umask只能设三位，对特殊位没法设 1.系统默认的umask是0002，这和输出的结果是一致的。可是，生成文件夹的权限是不一样的。奇数次和偶数次还不一样，如果我算的没错的话分别是426和567

user: user-1
content: http://baike.baidu.com/view/1867757.htm#3_2

user: user-2
content: The umask function sets the file mode creation mask for the process and returns the previous value. (This is one of the few functions that doesn’t have an error return.) #include <sys/stat.h> mode_t umask(mode_t cmask); Returns: previous file mode creation mask

user: user-2
content: umask返回旧的值。 第一次输出，说明是shell的位码，后面3个输出都是都是上次设置的值。

user: user-3
content: 这事和C语言没有半点关系。
user-0 提问: C语言数组在内存的里是怎样布局的？

回复:
user: user-0
content: 解释的很好啊，不错。Thank for sholber. :)

user: user-1
content: 更正一下： “ 标准又说，除非做为运算符sizeof和一元&的操作数，数组类型的标识符将被转换为指向其首元素的指针。 ” 其中，数组类型的标识符改为“数组类型的表达式”。考虑如下声明： struct t {int a [22]; float f;} t [3]; 则表达式 t [0].a 是数组类型的表达式。它会被转换为指向其首元素的指针： int * p = t [0].a;

user: user-1
content: 比如，现在有一维数组定义如下： int arr[5]={1,2,3,4,5};  我们都知道 数组名arr是代表数组首元素的地址即arr[0]的地址。 我很想知道，为什么成千上万的初学者，非得要纠结数组名，以及数组地址的问题。另：数组名代表数组首元素的地址，这个荒唐啊。   那在数组名前面加上取地址符&，即&arr，打印出的地址同样也是arr[0]的地址。   比如      printf("arr=%x\n&arr=%x\n&arr[0]=%x\n", arr, &arr, &arr[0]);    假设 现在有一个数组指针定义如下：  int (*p)[5]=NULL;   p=&arr;// 这样赋值就不会报错。  p=arr; // 但是这样赋值就会报错。&arr与arr的指向的地址相等的，那么为什么还会报错呢？ 这正是我恶心数组名和数组地址之类措辞的原因。因为，只用类型即可解释一切与数组有关的问题。标准说，对于表达式&E，若E的类型是T，则表达式&E的结果是指向T的指针。因为arr是数组，故&arr的结果是指向数组的指针。 标准又说，除非做为运算符sizeof和一元&的操作数，数组类型的标识符将被转换为指向其首元素的指针。因此，p=arr中，arr会被转换为指向其首元素的指针。因为元素的类型是int，故表达式arr转换后的类型是int *，与运算符=的左操作数p的类型不兼容。    假设，现在再定义一个二维数组如下：  int arr2[4][5]={...};   p=arr2;  // 而这样就不会报错。  p=&arr2; // 报错。 arr2是一个数组，其元素类型也是数组。从前面说的，arr2被转换为指向其首元素的指针，也就是指向数组的指针（元素类型也是数组嘛），即int (*) [5]与p的类型兼容。相应地，&arr2的结果是指向数组的指针int (*) [4][5]，尽管也是指向数组的指针，但与p的类型不兼容。   麻烦解释下 “数组名”与“&数组名”分别在一维、二维或更多维数组里的区别和作用？ 最好能给出它们在内存，组织的原理或示意图。  以C中，不存在二维数组和多维数组。所谓的二维数据，就是元素类型是数组的数组（这个过程可以递归进行）。如果用多维数组来理解和解释，反而更迷糊。 谢谢大家。  不用谢，分数全给我就行了。嘎嘎~~

user: user-0
content: ？

user: user-2
content: 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）
user-0 提问: Error: 2006: MySQL server has gone away

回复:
user: user-0
content: 嗯，把 MYSQL_OPT_RECONNECT打开后会自动重连，，问题解决了。。感谢！

user: user-1
content: 原因是长时间没有操作数据库，数据库连接自动断了。我去年也遇到过这个问题，方法是在连接数据库的时候启用MYSQL_OPT_RECONNECT，然后每次执行出错的时候ping一下server，我这里有部分代码：  int Mysql::insertRecord(std::string const &ip,     std::string const &path,     std::string const &operation,     char const *before,     char const *after) {   /**/   if (!connected_)     return -2;   /**/    std::string path2 = _convertText(path.c_str());   std::string before2 = _convertText(before);   std::string after2 = _convertText(after);    std::string sql =     "INSERT INTO ZooOp(ip,path,operation,`before`,`after`) VALUES(";   /* 1) ip */   sql += "'"; sql += ip; sql += "'";   /* 2) path */   sql += ",'"; sql += path2; sql += "'";   /* 3) operation */   sql += ",'"; sql += operation; sql += "'";   /* 4) before */   sql += ",'"; sql += before2; sql += "'";   /* 5) after */   sql += ",'"; sql += after2; sql += "')";    return _apply(sql);   /*   printf("[%s]\n", sql.c_str());   return 0;   */ }  int Mysql::_error_handler(std::string const &sql) {   do {     /* 1) ping */     int ping_ret = mysql_ping(&mysql_);     if (0 == ping_ret)       break;     /* 2) reconnect */     connect();     if (connected_)       break;     return -1;   } while (0);    mysql_query(&mysql_, "set names utf8");   if (0 != mysql_query(&mysql_, sql.c_str())) {     printf("mysql: %s\n", mysql_error(&mysql_));     return -2;   }   return 0; }  int Mysql::_apply(std::string const &sql) {   if (0 != mysql_query(&mysql_, sql.c_str()))     return _error_handler(sql);   return 0; }  int Mysql::connect() {   if (connected_) {     mysql_close(&mysql_);     connected_ = false;   }    int retval;   MYSQL *conn;    conn = mysql_init(&mysql_);   if (NULL == conn)     return -1;    do {     conn = mysql_real_connect(&mysql_,         host_.c_str(), username_.c_str(), password_.c_str(),         database_.c_str(), port_, NULL, 0);     if (NULL == conn)       break;     char value = 1;     retval = mysql_options(&mysql_, MYSQL_OPT_RECONNECT, &value);   } while (0);    if (NULL == conn || 0 != retval)     mysql_close(&mysql_);   else     connected_ = true;    mysql_query(&mysql_, "set names utf8");    return connected_ ? 0 : -2; }  int Mysql::disconn() {   if (connected_) {     mysql_close(&mysql_);     connected_ = false;   }   return 0; }
user-0 提问: 偶数求和（C）

回复:
user: user-1
content: 自己写代码，有问题贴出来问问题.....

user: user-0
content: 引用 1 楼 hnwyllmm 的回复:楼主，你有什么问题，倒是说啊求完整的C程序啊……

user: user-0
content: 求完整的C程序啊……不是要求都写了么

user: user-1
content: 楼主，你有什么问题，倒是说啊
user-0 提问: [SWU]用 echo $?只能看到最后的一个返回值，怎么看之前的函数中得返回值

回复:
user: user-0
content: 但是我突然想到， 如果我没有搜索到模式字符串，我应该不再执行，但是我这个搜索是在函数里做的，我该怎么办，才能实现如果未找到模式字符串，就中断执行呢？

user: user-0
content: 我把修改后的代码发上来。   1 #include<stdio.h>   2 #include<string.h>   3    4 #define FILE_NAME               "t0319.txt"   5 #define BUFFER_MAX              50   6    7 #define ERROR_FAIL_OPEN_FILE    -1   8    9 int judge();  10   11 char buffer[BUFFER_MAX];  12   13 int main()  14 {  15         FILE *fp;  16         int i, j;  17         char buffer[BUFFER_MAX];  18         int m, n;  19         char temp;  20   21         fp = fopen(FILE_NAME, "r+");  22   23         //Check for failing to open fiel  24         if(fp == NULL){  25   26                 printf("Fail to open file: %s\n", FILE_NAME);  27   28                 return ERROR_FAIL_OPEN_FILE;  29         }  30   31         //Get each char  32         for(i = 0; i < BUFFER_MAX; i++){  33   34                 buffer[i] = fgetc(fp);  35                 if(feof(fp))  36                         break;  37         }  38   39         printf("The length of the string: %d\n", i-1);  40   41         //judge string or not  42         int judge();  43   44         //Exchange  45         for(m = 0, n = i-2; m < n; m++, n--){  46   47                 temp = buffer[m];  48                 buffer[m] = buffer[n];  49                 buffer[n] =temp;  50         }  51   52         //Print out after exchange  53         printf("After exchange: \n");  54         for(j = 0; j < i-1; j++)  55                 printf("%c", buffer[j]);  56   57         printf("\n");  58   59         fclose(fp);  60   61         return 0;  62 }  63   64 //judge string or not  65 int judge(){  66   67         char *p;  68         p = strstr(buffer, "12");  69         if(p == NULL)  70                 return 0;  71         else  72                 return 1;  73   74 }

user: user-1
content: 函数一旦返回就结束了。 echo $?就是函数的返回值。 可以适当用用gdb

user: user-2
content: 39-47行：不应该在函数中定义函数。虽然编译器可以忍受，但现在的写法judge这个函数是不会执行的。应该在main函数外部定义此函数，并在main函数中调用此函数，就像调用printf那样。 要想看到judge的返回值，可以在main中调用并打印： printf("judge() return %d\n", judge());

user: user-0
content: 引用 1 楼 arthuryangsh 的回复:39-47行：不应该在函数中定义函数。虽然编译器可以忍受，但现在的写法judge这个函数是不会执行的。应该在main函数外部定义此函数，并在main函数中调用此函数，就像调用printf那样。 要想看到judge的返回值，可以在main中调用并打印： printf("judge() return %d\n", judge());  我知道只能嵌套使用，但是不可以定义。 但是我好像没弄清嵌套和定义有啥区别。  就是 把函数的定义 移在main外面就叫嵌套使用了么？  不懂诶。 其实本来我查半天找到strstr这个函数。想重新定义个类似的让返回值直接满足要求。 但是那个strstr的函数实现中间的有点儿看不懂。
user-0 提问: 两个升序排列的数组，用一个for循环找出两个数组中相同元素的个数

回复:
user: user-1
content: for遍历第一个数组，每次遍历时又遍历第二个数组，看是否有相等  为了提高效率，遍历第二个数组时，如果发现当前遍历的数字已经大于第一个数组当前的数，则可退出循环

user: user-2
content: for循环遍历第一个数组，然后每个元素和第二个数组的元素比较，比如指向A数组的指针pa，和指向B数组的指针pb。for(pa=A.begin();pa!=A.end();){    if(pb==B.end())       break;    if(*pa==*pb){       ++count;       ++pa;       ++pb;    }    else if(*pa<pb){       ++pa;    }    else       ++pb;    } }

user: user-0
content: #include <stdio.h>  #define ARRARY_SIZE (5)  int main(void) { 	int count = 0; 	int a[ARRARY_SIZE] = {0, 1, 2, 3, 4}; 	int b[ARRARY_SIZE] = {0, 1, 3, 5, 6}; 	int* pa = a; 	int* pb = b;  	for(;pa != (a + ARRARY_SIZE);) 	{ 		if (pb == (b + ARRARY_SIZE)) 		{ 			break; 		}  		if (*pa == *pb) 		{ 		  count++; 		  pa++; 		  pb++; 		} 		else if(*pa < *pb) 		{ 			pa++; 		} 		else 		{ 			pb++; 	   } 	}  	printf("count = %d\n", count);  	return 0; }
user-0 提问: 字符串的排序问题

回复:
user: user-0
content: 我搞错了一个 {  }， 	for(i=0;i<n-1;i++)        	{ 		k=i; 		for(j=i+1;j<n;j++) 			if(strcmp(str[k],str[j])>0) 				k=j; 		if(k!=i) 		{ 			strcpy(temp,str[i]); 			strcpy(str[i],str[k]); 			strcpy(str[k],temp); 		} 		}

user: user-1
content: 把for(i=0;i<n;i++) { fputs(str[i],fp); fputs("\n",fp); printf("%s\n",str[i]); }  放在最后一个}之前
user-0 提问: 求大神看一下我的蛮干求凸包问题。过程哪里错了。

回复:
user: user-1
content: int n,i;     scanf("%d",&n);     point p[n]; C语言 数组的定义支持 可变变量吗？

user: user-2
content: 《算法精解（C语言描述）》
user-0 提问: 能不能写出红色字体的每一行的意思！

回复:
user: user-1
content: int split(char *str,  char **pStr) {     int t = 0;     char *p = str;     int s = 0;      while (*p) // *p != NULL     {         if (*p == ' ') // *p == 空格         { 			if(1 == s) //判断意义不大,用来判断 只把第一个空格变成结尾 			{ 				*p = 0; //将空格符 变成 字符串结尾符'\0' 				s = 0;	//置标志位,表示需要记录下个字符串的首地址 			}         }         else if (0 == s) //只有标志位有效时才记录空格后的位置 		{ 			s = 1;			//清空标志位 			pStr[t++] = p; //记录空格后的位置,即下一个字符串的首地址 		} 		else {}          p++;     }      return t; //返回记录的个数 }

user: user-2
content: 扫描字符串str，遇到空格，就将空格后面的字符位置填入pStr，同时在空格位置填0（作为上一个子字符串的结束）
user-0 提问: 关于整型提升的问题！请教

回复:
user: user-1
content: 引用 9 楼 Czui1990 的回复:[quote=引用 8 楼 my_live_123 的回复:] 1-short int = short。32位机器是按照32位算，算的结果截断赋值给short 2-都可能溢出 3-同类型计算，不提升类型。int和long类型一块算，int提升到long  my_live_123你好，总算遇到一个明白我的意思的人了。  关于第3个问题，是否可理解为int类型乘法运算，若不设定操作数的大小，可能溢出？ 关于第2个问题，是否改变了符号位也算溢出？并不是超过表示范围才算溢出？[/quote]  3.如果数据类型不超过计算机位数，那么不论类型是多少位的都是按照固定位算，意思就是32位机器，它总是按32位算，不管你是8位数据还是16位数据。算完后再截断给你，不能保证截断后结果是正确的，意思就是可能溢出  如果等于计算机位数，那么只要结果值超过了它自己能表示的范围就算溢出。换言之：你平时吃一碗饭就吃饱了，但再让你吃一碗就吃不完！两碗饭超过了你的饭量。剩下的饭就是溢出 因此，从这一点而论，计算机上能表示的数值范围是有限的。（注意，这里不要喷我大整数相乘问题，大整数相乘，包括求素数问题都是用有限模拟无限完成的）  2-如果占用了符号位，那么看它本身的数据类型，如果是无符号类型，当然符号位扩展成了存储位。不算溢出；如果是有符号类型，当然溢出。比如4位，0111 + 0011 = 1010，如果是无符号，最高位1是有效数据位，因此解释成7+3=10，是正确的，4位的无符号能表达的最大数是15，没有溢出。如果是有符号数，那么最高位1是符号，表示负数。有效位是010，因此取反加一得原码110，即-6。很显然结果不对，7+3 = -6；

user: user-0
content: 引用 10 楼 sholber 的回复:[quote=引用 8 楼 my_live_123 的回复:] 1-short int = short。32位机器是按照32位算，算的结果截断赋值给short 2-都可能溢出 3-同类型计算，不提升类型。int和long类型一块算，int提升到long  这是常规算术转换，不是整型提升。[/quote]  你好，他说的哪里有问题吗？

user: user-2
content: 引用 8 楼 my_live_123 的回复:1-short int = short。32位机器是按照32位算，算的结果截断赋值给short 2-都可能溢出 3-同类型计算，不提升类型。int和long类型一块算，int提升到long  这是常规算术转换，不是整型提升。

user: user-0
content: 引用 8 楼 my_live_123 的回复:1-short int = short。32位机器是按照32位算，算的结果截断赋值给short 2-都可能溢出 3-同类型计算，不提升类型。int和long类型一块算，int提升到long  my_live_123你好，总算遇到一个明白我的意思的人了。  关于第3个问题，是否可理解为int类型乘法运算，若不设定操作数的大小，可能溢出？ 关于第2个问题，是否改变了符号位也算溢出？并不是超过表示范围才算溢出？

user: user-1
content: 1-short int = short。32位机器是按照32位算，算的结果截断赋值给short 2-都可能溢出 3-同类型计算，不提升类型。int和long类型一块算，int提升到long

user: user-0
content: 引用 6 楼 u012421456 的回复:楼主的提升的意思是？  small integer做运算操作，不都是先自动提升至int类型，再做运算吗？ 如果small integer是16bit，int类型是32bit，就提升为32bit做运算。难道我理解错了？

user: user-3
content: 楼主的提升的意思是？

user: user-3
content: 引用么short类型做运算，提升至32bit的时

user: user-0
content: 引用 2 楼 u012421456 的回复:溢不溢出看你什么数据了 这问题问的？  我说的是可能发出溢出的可能性。。若int类型是32bit，short类型是16bit，那么short类型做运算，提升至32bit的时，无论加法还是乘法，任何数据都不会溢出。但int类型和short类型都是16bit，那么short类型乘法运算可能会溢出。

user: user-0
content: 引用 1 楼 sholber 的回复:先看下整型提升的定义再问。 溢出是你自己的事，和integer promotion无关。 嘎嘎~~~  我了解，可能没表示明白，分开的2个问题，我想确认下int类型乘法会提升至long类型吗？有明确的定义吗？

user: user-3
content: 溢不溢出看你什么数据了 这问题问的？

user: user-2
content: 先看下整型提升的定义再问。 溢出是你自己的事，和integer promotion无关。 嘎嘎~~~
user-0 提问: 请大神告诉我子函数那里哪里有问题了？？？？？？？？？？？？？？谢谢

回复:
user: user-1
content: p<p+25是必然的呀，你的循环会一直下去

user: user-2

user: user-3
content: 楼主的目的是想排序嘛？

user: user-3
content: #include <stdio.h> #include <stdlib.h>  void move(int *p) { 	int *q, t;  	q = p + 12; 	for (; p < p + 25; p++) { //中间条件变量是叠加增长的,你会死循环的 		if (*q < *p) { 			t = *q; 			*q = *p; 			*p = t; 		} 	} }  void main() { 	int a[5][5], *p, i;  	for (i = 0; i < 5; i++) 		scanf("%d %d %d %d %d", &a[i][0], &a[i][1], &a[i][2], &a[i][3], &a[i][4]);  	p = &a[0][0]; 	putchar('\n'); 	move(p); 	for (i = 0; i < 5; i++) 		printf("%d %d %d %d %d\n", a[i][0], a[i][1], a[i][2], a[i][3], a[i][4]); }

user: user-4
content: 楼上正解

user: user-5
content: for(;p < (q - 12 + 25); p++)

user: user-6
content: for(; p<p+25; p++) ？？？
user-0 提问: 用C编程

回复:
user: user-1
content: #include "stdlib.h"  #include "stdio.h" #include<windows.h>  #define N  20  void fun1(int * a,int n) {	 	int i,j,min,max,k; 	min=0;max=N; 	for(i=0;i<N;i++) 	{ 		for(j=i+1;j<N;j++) 		{ 			if(a[j]<a[i]) 			{ 				k=a[j]; 				a[j]=a[i]; 				a[i]=k; 			} 		} 	} 	for(i=0;i<N;i++) 	{ 		printf("%d ",a[i]); 	} 	printf("\n");   	do{ 	if((a[min]+a[max])>n) 		max--; 	if((a[min]+a[max])==n) 	{ 		printf("%d+%d",a[min],a[max]); 		min++,max--; 	} 	if((a[min]+a[max])<n) 		min++; 	}while(max>=min); 	printf("\n");  }  int main() { //	int h[]={0}; //	int m,i; //	scanf("%d",&m); //	printf("\n-----------------------------\n"); //	for(i=0;i<N;i++) //	{ //		scanf("%d ",h[i]); //	} 	int m=31; 	int h[]={1,45,29,68,23,65,32,87,16,95,31,46,48,14,54,78,20,21,22,30}; 	fun1(h,m); 	return 0; }

user: user-2
content: IdxMin<=IdxMax则结束 ===> IdxMin>=IdxMax则结束

user: user-2
content: 排序, Idxmin=0，IdxMax=N again: A[IdxMin]+A[IdxMax] >a则IdxMax--; ==a,(IdxMin,IdxMax)为符合数序号，IdxMin++，IdxMax-- <a则IdxMin++;  IdxMin<=IdxMax则结束 goto again

user: user-3
content: 用高效的算法排序，最快O(nlogn) 假设给定数S，排序后的数组为a,共n个元素 以a1-S/2为搜索区间， 在此区间每个元素ai做如下操作 在区间[S/2，an]中用折半查找S - ai，如果找到aj，那么满足条件输出，继续 因此时间复杂度依旧是O(nlogn) 如此整个算法的时间复杂度还是O(nlogn)

user: user-4
content: 觉得最好排一下序，要不，不好处理。

user: user-5
content: 1. hash，然后线性搜索。 2. 排序，然后线性搜索。
user-0 提问: C语言  字符串中，怎样提取重复字符中之间的字符串

回复:
user: user-1
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-0
content: 引用 1 楼 user-2 的回复:时间复杂度要求是多少？ 什么意思？是问要很复杂吗？最好不要

user: user-2
content: 时间复杂度要求是多少？
user-0 提问: fgets函数只读取EOF是什么结果？

回复:
user: user-1
content: 都没有读到东西，你希望line是啥呢？

user: user-2
content: 这个函数遇到EOF自动返回NULL，不会把它读进去

user: user-3
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-4
content: 试一试不就知道了吗。

user: user-5
content: 引用 1 楼 zhao4zhong1 的回复:不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？+1，实践是检验真理的唯一标准

user: user-0
content: 额，受教了。
user-0 提问: 新入手c/c++.求解a,b,c的值，并解释一下为什么？

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-1
content: 8楼比较靠谱。  #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-2
content: 这里a打印出的是字符串的内容，其实a的真实值是字符串的首地址，之所以打印出字符串的内容，是因为istream和ostream类对<<做了运算符重载，对char和char*有特殊处理。至于b和c的值，1楼的朋友解释的很清楚，需要说明的是使用间接引用运算符，系统会根据指针指向的类型确定读取字节的数量，比如例子中的*(char*)读一个字节，*(short*)读取两个字节。 至于三楼的朋友说的，稍微有一点问题，“0123456789”确实是在文字常量区，这块区域的内存是只读的，不能修改，但是不代表不能用栈区的指针指向该区域指向该指针。从严谨的角度而言，应该定义为“const char* a = “0123456789””(注意const的位置)。

user: user-3
content: #include <iostream>  using namespace std;  int main()   {        char *a = "0123456789";   //这里声明了字符串类型        short b = *(a + 3);    //把字符串首地址加3个字节，指向字符3，对应ascii为33h，符号扩展为short，于是b=0033h，转化为十进制打印所以b = 51        short c = *((short *)(a + 4)); 把字符串首地址加4个字节，指向字符4，但此处指针强转为short*，所以指向4和5两个字符，             对应ascii为34h和35h，注意转化是在寄存器中进行的，所以高字节在前为3534h，再转化为十进制打印所以c=13620        cout << "a=" << a << endl << "b=" << b << endl;       cout << "c=" << c << endl;       return 0;   }

user: user-0
content: 回复一楼：注意转化是在寄存器中进行的，所以高字节在前为3534h。可以解释的更加详细一点吗？是指的大小端问题？

user: user-4
content: 不能让字符指针指向常量。 http://bbs.csdn.net/topics/391002016

user: user-5
content: 哪里有问题啊。。。

user: user-3
content: 引用 4 楼 woai_tudou 的回复:回复一楼：注意转化是在寄存器中进行的，所以高字节在前为3534h。可以解释的更加详细一点吗？是指的大小端问题？ 1，这里确实是跟大端小端相关的，intel处理器是小端，所以高地址字节为高8位，低地址字节在低8位；如果是小端处理器，那么转化结果为3435h。 2，跟转化是否在寄存器中进行无关，即使因为寄存器不够（寄存器溢出），转化在内存中进行，对于小端处理器来说，也是高字节在高位，低字节在低位，即3534h。

user: user-6
content: 引用 3 楼 baidu_26722537 的回复:不能让字符指针指向常量。 http://bbs.csdn.net/topics/391002016  为什么？？ 证据呢？？
user-0 提问: 求个校验值计算器...

回复:
user: user-1
content: 的确是奇偶校验,,有人做出来了...

user: user-2
content: 引用 4 楼 daols 的回复:[quote=引用 1 楼 worldy 的回复:] 不会是奇偶校验，那是用于校验字节的； 11c9这样的值不是4位，是32位，应该是某个模式的CRC32！ 我试了crc32,,算出来是8位的...crc16算出来倒是4位...但是也对不上...= =b[/quote] CRC32有好多计算模式，还有初始值也可以不同

user: user-0
content: 引用 1 楼 worldy 的回复:不会是奇偶校验，那是用于校验字节的； 11c9这样的值不是4位，是32位，应该是某个模式的CRC32！ 我试了crc32,,算出来是8位的...crc16算出来倒是4位...但是也对不上...= =b

user: user-0
content: 引用 2 楼 zxhuser-3 的回复:C#?目测lz来错板块了 好的...C/C++/C#...只要是gcc能编译的就好= =b

user: user-3
content: C#?目测lz来错板块了

user: user-2
content: 不会是奇偶校验，那是用于校验字节的； 11c9这样的值不是4位，是32位，应该是某个模式的CRC32！
user-0 提问: c语言中定义变量

回复:
user: user-1
content: 域的问题，你定义对象和指针的时候，stu这个自定义类型以及存在了。

user: user-2
content: 你确定不是这样？ struct stu { 	int num; 	int age; }s = {1, 2}, *a = &s;

user: user-3
content: 你在定义指针的时候，没有指明类型吧？

user: user-4
content: 具体警告什么？
user-0 提问: 大学生为进BAT当软件开发工程师，数据结构进阶学习要看什么书？？？谢谢啦。

回复:
user: user-1
content: “为了进BAT”而学..而不是为兴趣而学..不是很好。  想进bat，有作品成果出来的话，发链接我，合适的话给你内推

user: user-0
content: 非常感谢您的指点

user: user-2
content: 虽然我进不了bat，还是想说，把学校教的都学好，打好基础

user: user-3
content: 引用 13 楼 Raffin 的回复:[quote=引用 5 楼 Falleyes 的回复:] 算法导论，我也准备这个秋天去BAT，正在研究学习。 还有包括基础的计算机核心课程，操作系统、数据库、编译原理、计算机网络（计网非必须）都要好好学的。  我觉得BAT对技术要求应该没那么高的，做个QQ什么的还需要深入研究操作系统，数据结构吗？ 国内的软件应用不到很复杂的理论基础和算法架构，如果说国内有什么优势的话，那也就是人多，对服务器的并发处理这块要求很高。[/quote]数据结构算法肯定是需要的，操作系统是C\C++开发需要的，因为C\C++偏向于底层嘛

user: user-4
content: 引用 5 楼 Falleyes 的回复:算法导论，我也准备这个秋天去BAT，正在研究学习。 还有包括基础的计算机核心课程，操作系统、数据库、编译原理、计算机网络（计网非必须）都要好好学的。  我觉得BAT对技术要求应该没那么高的，做个QQ什么的还需要深入研究操作系统，数据结构吗？ 国内的软件应用不到很复杂的理论基础和算法架构，如果说国内有什么优势的话，那也就是人多，对服务器的并发处理这块要求很高。

user: user-4
content: 比如数据结构里那些排序算法，在高级开发语言里都有内置的排序方法，调用一下就行了（我的开发语言用的是快速排序实现的），没人会去深究排序的算法。 像涉及到空间复杂度的，现在计算机内存超大，除了嵌入式开发可能还需要计算着省内存，一般应用开发程序员基本不用关注内存是否够用。

user: user-5
content: 至少研究生？不然你得acm得个奖吧。。。

user: user-4
content: 看英语版的图灵系列教材。 其实实际工作中大部分开发都不需要用到算法和数据结构的知识的，只要会写代码逻辑会调用类库就行了。 要到比较高阶地方的开发才会需要很专业的知识。

user: user-6
content: 数据结构关键在运用，多看看开源项目中如何用数据结构

user: user-7
content: 数据结构的话，看完严就差不多了。 关键是熟练掌握，可以去oj上面做些题，比如从leetcode oj开始。 说句题外话，LZ看样子像本科生，其实本科生想进BAT比较难的，要比其他人付出更多努力。

user: user-0
content: 非常感谢您的指教。

user: user-3
content: 算法导论，我也准备这个秋天去BAT，正在研究学习。 还有包括基础的计算机核心课程，操作系统、数据库、编译原理、计算机网络（计网非必须）都要好好学的。

user: user-8
content: 写个操作系统

user: user-0
content: 非常感谢您的指教。

user: user-9
content: 同意楼上，算法导论不错，你也可以看看MIT公开课推荐的书籍，不过建议看英文版的。此外，数据结构和算法这个东西，如果你现在无法体会数据结构在程序中的作用以及程序=数据结构+算法这两个理念，其实光看书的作用是不大的，我建议你看看云风的《游戏之旅--我的编程感悟这本书》，里面对于数据结构的描述讲的不错，关键是立足于实践。若想真的提高自己，书是一定要看的，看书之余，建议去开源社区下一些开源项目看看，提升会很大。

user: user-10
content: 算法导论吧。。。
user-0 提问: 递归反向输出字符串

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

user: user-2
content: 一般是建议通过名字来理解这个函数的，不过显然这个名字过于简朴，那就直接用递归树来理解了，假设输入“123#” '1' ->print()        '2'      -> print()                       '3'       -> print()                                      '#'         从此返回 每个返回都要执行 if(a != '#') printf("%c",a);  从而完成逆序输出

user: user-3
content: 递归调用与一般调用的区别就在于此。 函数在调用另一个函数时，会开辟空间生成调用函数栈帧和被调用函数栈帧，调用函数会push保存寄存器如eax，edx，ecx，被调用函数也会push保存寄存器到栈中，比如edi，ebx，esi，ebp，esp，所有的中间值都保存在每一个调用所对应的栈帧中。在调用结束时pop恢复这些寄存器，同时返回到之前保存的调用函数地址，这样一步步逆着原来的顺序返回。 如果是一般的函数调用，就只需恢复寄存器然后执行ret指令返回；但是在递归调用时，除了要恢复寄存器，还要执行一些含有递归意义的指令，否则只是把中间的值保存，而没有利用， 这里 if(a != '#') printf("%c",a); 的作用就是把每个值打印出来。这一句就是你利用递归需要达成的目的。 举个栗子，如果是阶乘，比如5！，5，4，3，2，1这些值都保存在每次调用对应的栈帧中，在调用结束时每次返回除了恢复寄存器，还要计算i*(i-1)!，i =  2,3,4,5。

user: user-4
content: 比如输入“abcd#”， 输入‘a’后先if(a != '#') print();继续递归接收下一个字符； 输入‘b’后继续if(a != '#') print();递归接收下一个； 输入‘c’继续递归 输入‘d’继续递归 输入‘#’后if(a != '#') print();if(a != '#') printf("%c",a); 均不被执行，函数结束，返回上一层递归 返回到输入‘d’的那一层，执行if(a != '#') printf("%c",a);输出‘d’，函数结束，返回上一层 返回到输入‘c’的那一层，执行if(a != '#') printf("%c",a);输出‘c’，返回上一层 ...

user: user-0
content: 这个递归输入懂，到那时在输出的时候就不懂了，
user-0 提问: C语言面试题

回复:
user: user-0
content: 引用 5 楼 dooX8086 的回复:[quote=引用 4 楼 u010024618 的回复:] [quote=引用 2 楼 luckyaslan 的回复:] 这道题目的问题是什么？ 不可能什么都没写吧。就是这段代码有什么错误？可以理解这段代码在什么特殊情况下会产生无法确定的结果？[/quote] 不是什么特殊情况下. 不同编译器就会产生不同结果.(只要压栈方式不一样) vc  不管是  _cdecl  stdcall  fastcall ...等等都是从右到左. 而 c++ builder   clang gcc 等....有些是从左到右有些是从右到左... 为以程序结果跟编译器有关...即行为不确定[/quote]多谢，我测试下您说的。另外编译器默认的入栈方式不是可以改变吗

user: user-1
content: 引用 4 楼 u010024618 的回复:[quote=引用 2 楼 luckyaslan 的回复:] 这道题目的问题是什么？ 不可能什么都没写吧。就是这段代码有什么错误？可以理解这段代码在什么特殊情况下会产生无法确定的结果？[/quote] 不是什么特殊情况下. 不同编译器就会产生不同结果.(只要压栈方式不一样) vc  不管是  _cdecl  stdcall  fastcall ...等等都是从右到左. 而 c++ builder   clang gcc 等....有些是从左到右有些是从右到左... 为以程序结果跟编译器有关...即行为不确定

user: user-0
content: 引用 2 楼 luckyaslan 的回复:这道题目的问题是什么？ 不可能什么都没写吧。就是这段代码有什么错误？可以理解这段代码在什么特殊情况下会产生无法确定的结果？

user: user-0
content: 引用 1 楼 user-3 的回复:是不是read(&val),read(&ch)的执行顺序问题我写Demo测试暂时没啥问题。 你说的执行顺序也能是考虑的一个点。如果按照你的建议面试官期待的应该是代码吗： int read(int* p) {     scanf("%d",p);     return *p; } ...  i = read(&val);  j = read(&ch); insert(&graph[vert],i,j);  这个代码和上面的代码在什么情况下会产生区别呢？

user: user-2
content: 这道题目的问题是什么？ 不可能什么都没写吧。

user: user-3
content: 是不是read(&val),read(&ch)的执行顺序问题
user-0 提问: 如何从混杂着数字、字母或者汉字的txt文本文件中读取数字

回复:
user: user-0
content: 问题已经解决了。多谢楼上两位回帖。

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

user: user-2
content: 使用正则表达式

user: user-0
content: 最好是能给出简单的C语言代码，多谢。
user-0 提问: 关于isdigit函数和数组初始化

回复:
user: user-1
content: 引用 6 楼 u014178386 的回复:[quote=引用 3 楼 Revivedsun 的回复:] Checks whether c is a decimal digit character. Decimal digits are any of: 0 1 2 3 4 5 6 7 8 9   [quote=引用 2 楼 u014178386 的回复:] [quote=引用 1 楼 luckyaslan 的回复:] int isdigit(char c); 传入参数是char，你传入的是int ，传参出错了。 你把 int a[10];改成char a[10]就可以了。  isdigit还是返回0。。[/quote]  char[10] = {"0"}; [/quote]  其实我想问的是在不初始化数组的情况下，数组元素默认为0，那么isdigit应该返回1才对呀![/quote]  int的48对应的才是char的0, 去看ascii码表

user: user-0
content: 引用 3 楼 Revivedsun 的回复:Checks whether c is a decimal digit character. Decimal digits are any of: 0 1 2 3 4 5 6 7 8 9   [quote=引用 2 楼 u014178386 的回复:] [quote=引用 1 楼 luckyaslan 的回复:] int isdigit(char c); 传入参数是char，你传入的是int ，传参出错了。 你把 int a[10];改成char a[10]就可以了。  isdigit还是返回0。。[/quote]  char[10] = {"0"}; [/quote]  其实我想问的是在不初始化数组的情况下，数组元素默认为0，那么isdigit应该返回1才对呀!

user: user-2
content: 引用 2 楼 u014178386 的回复:[quote=引用 1 楼 luckyaslan 的回复:] int isdigit(char c); 传入参数是char，你传入的是int ，传参出错了。 你把 int a[10];改成char a[10]就可以了。  isdigit还是返回0。。[/quote]  嗯，，，， 我刚看了下，默认的情况，数组a被初始化为0x00,而字符'0'的16进制是0x30。 0x00代表的是NULL空值，不是字符‘0’。所以在判断的时候，isdigit返回的是0。

user: user-1
content: 去看一下ascii码表 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9

user: user-3
content: Checks whether c is a decimal digit character. Decimal digits are any of: 0 1 2 3 4 5 6 7 8 9   引用 2 楼 u014178386 的回复:[quote=引用 1 楼 luckyaslan 的回复:] int isdigit(char c); 传入参数是char，你传入的是int ，传参出错了。 你把 int a[10];改成char a[10]就可以了。  isdigit还是返回0。。[/quote]  char[10] = {"0"};

user: user-0
content: 引用 1 楼 luckyaslan 的回复:int isdigit(char c); 传入参数是char，你传入的是int ，传参出错了。 你把 int a[10];改成char a[10]就可以了。  isdigit还是返回0。。

user: user-2
content: int isdigit(char c); 传入参数是char，你传入的是int ，传参出错了。 你把 int a[10];改成char a[10]就可以了。