Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 刚开始学就被虐了，小白求助，哪位大佬帮帮忙，指点一下，问题可能有很多

回复:
user: user-0
content: 谢谢大佬

user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h>  typedef  int DaType;  #define MaxStackSize 100  typedef struct {     DataType stack[MaxStackSize];     int top; } SeqStack;  void StackInitiate(SeqStack *S) {     S->top = 0; }  int StackNotEmpty(SeqStack S) {     if (S.top<=0)return 0;     else return 1; }  int StackPush(SeStack *S,DataType x) {     if(S->top >= MaxStackSize)     {         printf("堆栈已满无法插入!\n");         return 0;     }     else     {         S->stack[S->top] = x;         S->top++;         return 1;     } }  int StackPop(SeqStack *S,DataType *d) {     if(S->top<=0)     {         printf("堆栈已空无数据元素出栈!\n");         return 0;     }     else     {         S->top--;         *d = S->Stack[S->top];         return 1;     } }  int StackTop(SeqStack S,DataType*d) {     if(S.top<=0)     {         printf("堆栈已空!\n");         return 0;      }     else     {         *d=S.stack[S.top-1];         return 1;     } }    参考一下吧

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

回复:
user: user-1
content: 《算法导论》第三版中，在引入分治策略的算法思想时，用的就是这个 最大子数组的问题 作为例子讲的，书中是使用的分治法，但在课后习题中，提供了一种新的思路，非递归并且在线性时间内求解的算法，算法非常巧妙。  如果如题中所说，不考虑最大值为负数的情况，并且只用求出最大和，不用给出最大子数组的索引下标，那么问题就变得很简单啦。 下面是代码。  #include <algorithm> int MaxSumOfSubArray(int* a, int n) { 	int maxA = 0; 	int maxR = 0;  	for (int i = 0; i < n; ++i) 	{ 		maxR = std::max(a[i], maxR + a[i]); 		maxA = std::max(maxA, maxR); 	}  	return maxA; }

user: user-2
content: https://www.cnblogs.com/conw/p/5896155.html  参考一下吧

user: user-3
content: 算法就不对，你只考虑了从第一个数据开始的子序列，没有考虑到从第二个、第三个数据...开始的子序列，应该讲所有情况都考虑到

user: user-4
content: 引用 3 楼 qq_30918465 的回复:printf("输入整数组元素个数");没要求输出这个 oj的题要按照要求的输入输出来

user: user-5
content: 你的算法不对

user: user-6
content: printf("输入整数组元素个数");没要求输出这个

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

user: user-0
content: 请问大神们我错在哪里？
user-0 提问: C语言用codeblocks编译出错cannot find -liconv.lib和error: ld returned 1 exit status|

回复:
user: user-1
content: #include <iconv.h> 将这句注释掉再试试。

user: user-2
content: 提示liconv.lib 没有找到

user: user-3
content: 百度搜相关关键字。
user-0 提问: 问一个类型转换的问题

回复:
user: user-1
content: 就是显示转换成TkWorld*类型，即指向TkWorld类型变量的指针，换句话说，就是按TkWorld去解释相应内存上的数据

user: user-2
content: 理解和讨论之前请先学会如何观察！

user: user-2
content: 将一句不懂的复合语句，拆解成多步尽量简单的语句并将每一步的结果的值及其对应的typeid().name显示出来帮助理解。

user: user-2
content: 将一句不懂的复合语句，拆解成多步尽量简单的语句并将每一步的结果对应的typeid().name显示出来帮助理解。 参考下面：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]   代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 就是强制轉換成TkWorld指針類型啊
user-0 提问: 用Dev c++编译这个程序时出错，新手一个，不知道怎么解决

回复:
user: user-1
content: .h文件找不到，编译的时候.h文件的搜索路径检查一下。

user: user-0
content: 代码复制上，编译，结果是这样的

user: user-0
content: 是不是有什么地方操作过程不对，或者有什么遗漏的地方，才导致了编译不成功

user: user-0
content: wiringPi库文件已经放到如图位置了
user-0 提问: 求助关于realloc函数的问题

回复:
user: user-1
content: relloc 后，字符串相当于已经被截断，后面的内存已经不属于你，后面的内存是什么将不确定

user: user-2
content: 百度的 指针名=（数据类型*）realloc（要改变内存大小的指针名，新的大小）。 新的大小可大可小（如果新的大小大于原内存大小，则新分配部分不会被初始化；如果新的大小小于原内存大小，可能会导致数据丢失[1][2]） 可能编译器实现不同。

user: user-3
content: 申请的内存空间缩小，在输出原有的内存的数据是未定义的，内存大小由16变成8，有效的字符是7个。其他的输出或不输出都是未定义，后面输出什么不确定
user-0 提问: 求大牛指教：c语言中div是什么怎么用啊？  

回复:
user: user-1

user: user-2
content: << 是位运算，即2进制向左位移，1 << n  =  1*2^n;你可以改成 _div

user: user-3
content: 引用 11 楼 bughyxqk的回复: 都是这个情况 和stdlib.h标准库中的div函数重复了，标准库函数功能参看：http://en.cppreference.com/w/c/numeric/math/div  解决办法，更改一个函数名，如把声明和实现位置均改成my_div

user: user-4
content: 建议把div换个名字，可能和内部的函数名冲突了。

user: user-0
content: 都是这个情况

user: user-0
content: 都改了 没有一个是对的，还是一样的报错， 难道是我的编译器有毒。。。

user: user-5
content: 引用 9 楼 bughyxqk 的回复:都改了 没有一个是对的，还是一样的报错， 难道是我的编译器有毒。。。 编程是一个细节，不能错过每一个点。 建议将你的编译信息贴出来，另外也将改过之后的代码帖出来。

user: user-6
content: 1.函数在使用前需要已经定义或声明过   所以可以将int div(int n)放到main 函数前定义 2.num = div(n)   需先定义num

user: user-3
content: int div(num);   改成：  int div(int); int num;

user: user-5
content: 引用 5 楼 bughyxqk 的回复:是一模一样的还是错。。。。。 那找一下你的编译器问题。或者提出错误信息～

user: user-0
content: 是一模一样的还是错。。。。。

user: user-5
content: 引用 2 楼 bughyxqk 的回复:还是一样的  这些我都试过了 试过了？对比一下代码，看一下那些地方给你修改了 在我的环境里测试没问题，能正常输出。

user: user-0
content: 还是一样的  这些我都试过了

user: user-5
content: #include<stdio.h> #include<stdlib.h> int div(int num); int main() {     int n;     long num;       printf("请输入一个整数:\n");     scanf("%d",&n);     num = div(n);     printf("输出%d的阶乘为:%ld\n",n,num);       return 0; } int div(int n) {     //这里用到exit(0),所以需要导入stdlib.h库文件     //作用是:直接退出程序     if(n<0)     {         printf("输入数据有误!\n");         exit(0);     }     if(n==0||n==1)         return 1;     //递归调用函数自身     else         return n*div(n-1); } 把代码粘贴到你的环境里试一下

user: user-5
content: #include<stdio.h> #include<stdlib.h>  int main() {     int div(int num);     int n;     long num;      printf("请输入一个整数:\n");     scanf("%d",&n);     num = div(n);     printf("输出%d的阶乘为:%ld\n",n,num);      return 0; } int div(int n) {     //这里用到exit(0),所以需要导入stdlib.h库文件     //作用是:直接退出程序     if(n<0)     {         printf("输入数据有误!\n");         exit(0);     }     if(n==0||n==1)         return 1;     //递归调用函数自身     else         return n*div(n-1); } 参考一下吧  函数声明需要指定参数的类型，另外num未定义，需要提前定义
user-0 提问: 为什么.exe已停止工作，求大神帮忙解决啊

回复:
user: user-1
content: #define U 21628//用户数,数组第一行不使用 #define M 41370//电影数+1，数组第一列不使用 #define F 11//语义维数+1 #define lambda 0.14//正规化参数1,过拟合参数 #define T 409158//训练集个数 #define P 174812//测试集个数  //定义全局变量 float train[T][3]; float test[P][3]; float w[U]; float bu[U]; float bi[M]; float user[U][F];//用户矩阵 float movie[M][F];//项目矩阵 你确定要用这么多空间，建议算一下这个程序使用了多少内存：21628 * 11, 41370 * 11, 409158 * 3, 174812 * 3这些也只是一部分。 申请的空间太多，可能是这个原因导致程序异常。建议根据需要申请适量的内存。

user: user-2
content: 引用 2 楼 pandabone1 的回复:亲测无异常，应该是楼上所说的内存问题

user: user-2
content: 亲测无异常，应该是楼上所说的内存问题
user-0 提问: C语言getchar()问题

回复:
user: user-1
content: getchar读取输入前需要清空输入缓存，fflush(stdin)加在getchar之前就可以了。

user: user-2
content: fflush(stdin);

user: user-3
content: 你之前可能有scanf之类输入代码，在输入完成后缓冲区留下了换行符\n，被之后的getchar接收，你可以在这些输入语句后加上getchar接收掉缓冲区中的\n

user: user-4
content: getchar()是终端得到一个字符，其实这个字符是从输入缓存里得到的。而上次输入之后，会将'\n'留在输入缓存里，因此getchar()得到的是'\n'。如果要想得到想要的，最新输入的字符，建议现将上次输入之后残留在输入缓存里的数据“吃掉”，可以考虑用两个getchar();因为第一个getchar()是用于吃掉'\n'；也可以使用如下方式：   while ((c = getchar()) == '\n')     ;
user-0 提问: 各位大佬们，请问一下有什么数据结构与算法的书好推荐？为何推荐呢？

回复:
user: user-0
content: 感谢大佬的答复不迷路

user: user-1
content: 各种数据结构算法书 其实都大同小异 推荐还是学校教材->网上热门的书 （因为学校更加注重基础 入门比较简单）但是终归终归还是要先看 不要因为纠结哪一本书而浪费时间 哪一本都可以开始 千里之行 始于足下

user: user-2
content: 为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  《数据结构（C语言描述）》 《算法精解（C语言描述）》

user: user-3
content: 基本数据结构与算法的书都可以，想不清楚就画下图理解下，实在不懂先往后看，等积累的多了回头就自己发现好懂了，不要有排斥心理

user: user-0
content: 那练习c编程也可以，但是也还是要提高自己的，所以emmm事先问下这类书有哪些好推荐。起初怕自己不懂如何去优化程序

user: user-4
content: 如果刚学C，不建议去读算法导论等复杂的算法；对于数据结构和算法，如果是初学C语言，还是建议去学习课本知识，多去练习C语言的编程。

user: user-5
content: Algorithms + Data Structures = Programs，图灵奖得主Niklaus Wirth经典著作，ACM推荐教材之一。

user: user-6
content: 先把基础知识吃透，再看数据结构
user-0 提问: 萌新请教，求帮助

回复:
user: user-1
content: 这种无非是使用无效的内存地址，简单的输入打印。2F基本说明了问题，输入地址引用问题。

user: user-2
content: 把代码贴出来

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

user: user-4
content: 截图只能说很“搞笑”，关键的代码一句也没截到，无关紧要的倒是很多。 建议，将代码贴出来；运行的结果可以考虑用截图的形式。

user: user-5
content: scanf("%f", radius); 改成：scanf("%f", &radius);

user: user-6
content: 你把代码发出来，没有代码怎么判断
user-0 提问: 大伙来看看这是不是假书害人啊？

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

user: user-2
content: 别光看，在IDE上敲一下就知道哪儿错了

user: user-3
content: 建议不要觉得，写一个小的demo程序试一下不就知道了吗？ 写一个简单的程序，调用一下这个函数接口，试一下。然后分析一下程序的流程～

user: user-1
content: 百度搜相关关键字。
user-0 提问: 新手小白求问typedef struct问题

回复:
user: user-1
content: TreeNode *nodetemp nodetemp-> TreeNode nodetemp nodetemp.

user: user-2
content: void RoundBegin(int max_i,Graph *g,int *OTDR_vexs) {     int MaxNum_OTDR=100;  //后期可以限制OTDR的数量，先暂时不限制     int OTDR_Pra=150;  //OTDR的最远可测公里数参数     TreeNode nodetemp;      queue <TreeNode> q;      nodetemp.vex=max_i;     nodetemp.father_vex=NULL;     nodetemp.km_rest=150;      return; } 参考一下吧  TreeNode nodetemp;这儿定义的是结构体变量，而不是结构体指针。对于结构体指针可以用->引用结构体元素，否则要用“."。 另外，father_vex是int类型，而NULL是(void *)0。因此，类型不匹配。
user-0 提问: Linux C使用execl函数调用/usr/bin/java，输出：Could not create the Java Virtual Machine

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:if(execl("/usr/bin/java", "Main", (char *)0) == -1) { fprintf(stderr, "execl error:%s\n", strerror(2)); } 建议试一下这种形式   试过了，仍是不可以。我的Main.java只是简单的输出三行字符串。

user: user-1
content: if(execl("/usr/bin/java", “java", "Main", (char *)0) == -1) { fprintf(stderr, "execl error:%s\n", strerror(2)); } 只能多试试了

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

user: user-1
content: if(execl("/usr/bin/java", "Main", (char *)0) == -1) { fprintf(stderr, "execl error:%s\n", strerror(2)); } 建议试一下这种形式
user-0 提问: 求最大公约数和最小公倍数的问题，这样写怎么不对呢

回复:
user: user-1
content: scanf_s("%d %d ", &m, &n);改成：scanf_s("%d %d", &m, &n);  也就是去掉后面的空格

user: user-2
content: 算法就不对，最大公约数和最小公倍数不是这样算的，比如算最小公倍数，一般是用两个值中的大值的倍数去取余小值，看是否为0.
user-0 提问: 如果a&b=c 或者a|b=c ，已知a和c 怎么求b?

回复:
user: user-1
content: 从你给的条件未必是唯一解，很多位运算与数学运算不同，不是已知两个就可以唯一确定剩余的那个

user: user-2
content: 这个解>=一个，所以不能求出唯一解，只能求出其中一组解 比如：1111 | b == 1111，那么b可以是任何解，又1100 & b == 0000，那么所有解：1100,1101,1110,1111
user-0 提问: 求最大公约数可以利用函数指针传地址求吗？为什么啊

回复:
user: user-1
content: 可能你的问题是“函数的非引用参数” 普通的非引用类型的参数通过复制对应的实参实现初始化。当用实参副本初始化形参时，函数并没有访问调用所传递的实参本身，因此不会改变实参值。 但是，当函数参数是指针时，函数的形参得到的是参数的地址，而在函数内部对形参（地址）保存的内容进行操作，相当于操作了实参。  相关内容请参考《 C++中函数的数组形参》 https://blog.csdn.net/hou09tian/article/details/78046909

user: user-2
content: 第二种方法其实不是函数指针，而是函数参数是变量的地址，就这个程序而言两种方法完全一致，并没有用到传地址的优势

user: user-3
content: 首先你这个不叫函数指针，两种方法的区别在于函数的参数类型不同： 函数1：使用Int型参数，调用时直接传int型值 函数2：使用int* 型参数，调用时传int型参数地址，通过*地址使用 不同点在于函数1对输入值不会影响，函数2会改变输入值

user: user-4
content: 第二个是程序使用利用指针变量，传递的是main函数里的num1, num2的地址，在Max函数内，用*num1，*num2即引用main函数里num1, num2的值，即和传num1, num2的值到Max是一样的。 第二个程序使用指针做形参，即使没有返回值，也可以得到最大公约数，建议在main函数里打印一下num1, num2的值（在调用Max函数之后）num2的值就是最大公约数。因为&num1，&num2除了是传入参数之外，还是传出参数。

user: user-5
content: 函数都是值传递 差别是1传递的是变量的数据，2传递的是变量的地址

user: user-6
content: 你这里面没有用到函数指针 int(*pf)(); pf才是一个函数指针  你是想问形参是值类型或者引用类型的差异吧

user: user-7
content: 函数的副本机制可以复习一下

user: user-8
content: 楼主的第二个实现不叫函数指针，只是函数的形参是指针形式的。
user-0 提问: gcc编译错误

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  typedef struct Student {     int num;     char name[20];     float score[3]; }st;  void input(st stu[],int n) {     int i,k;     for(i=0; i<n; i++)     {         scanf("%d", &stu[i].num);         scanf("%s", stu[i].name);         for(k=0; k<3; k++)         {             scanf("%f",&stu[i].score[k]);         }     } }  void print(st stu[],int n) {     int i;     for(i=0; i<n; i++)     {         printf("%d %s %.1f %.1f %.1f",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2]);         if(i<n-1)             printf(" ");     } }  int main() {     int n;     scanf("%d",&n);     st *a = (st *)malloc(sizeof(st));     if (!a)         return -1;     input(a,n);     print(a,n);     free(a);     return 0; } 首先用gcc编译没有警告和错误； 对于不确定数组长度的问题，建议使用malloc/free

user: user-2
content: 我就是用GCC啊，没报错  格式： gcc D:/cc.c -o D:/cc.o
user-0 提问: oj上的肿瘤题，输出结果是对的，但是一直没通过。求指正，先谢过了

回复:
user: user-1
content: 不需要整个位图都读进来，可以边读边分析，只用一个char/int读就可以了。

user: user-2
content: 引用 3 楼 weixin_41301438 的回复:为啥嘞！！！！ int a[n][n];  这种语句写出来，让我得到了的结论。

user: user-0
content: 为啥嘞！！！！

user: user-3
content: 是不是有没有0的情况

user: user-2
content: 还是那句话先把语法学好
user-0 提问: 一个循环出错的问题

回复:
user: user-1
content: 在求个十百每位上的数字时有问题，比如：  /*         a = i / 100;         b = (i - 100) / 10;         c = i - a*100 - b*10;         */         a = i / 100;         b = (i % 100) / 10;         c = i % 10; 按照注释掉的算法：若i = 200;那么a = 200 /100，则a = 2; b = (200 - 100) / 10，即b = 10；c = 200 - 2 * 100 - 10 * 10;则c = -100; 因此，按照你的逻辑，a,b,c的值分别是2,10，-100；其实200的个十百位分别位：0,0,2 可参考未注释部分的代码。

user: user-2
content: 求个 十 百位数的逻辑错了 ，你求出来的a,b,c不是他本来的个十百位数上的数字

user: user-3
content: 建议楼主对自己写的代码单步调试一下，代码较短，会很快能找到问题的。

user: user-0
content: 引用 2 楼 qq_29856789 的回复:output 函数的第二个参数写错了，sizeof(r)和sizeof(int)都是4，所以传递num 的值是1，循环只执行一次 不会啊，sizeof（r）是40，我在那个shuxianshu的函数里用输出检测也是只能得到一个水仙数

user: user-4
content: output 函数的第二个参数写错了，sizeof(r)和sizeof(int)都是4，所以传递num 的值是1，循环只执行一次

user: user-5
content: #include<stdio.h>   int shuxianshu(int *p); void output(const int *input, int num);  int main (int argc, char *argv[]) {     int r[10] = {0};      shuxianshu(r);     output(shuxianshu(r), (sizeof(r) / sizeof(int)));      return 0; }  int shuxianshu(int *p) {     int a, b, c;     int i, j = 0;      for(i = 100; i <= 999; i++)     {     	''''''''''''''''''         a = i / 100;         b = i / 10 % 10;         c = i % 10;         ''''''''''''''''''          if(a * a * a + b * b * b + c * c * c == i)         {             *(p + j) = i;             printf("%d\n", i);             j++;         }     }      return  p; }   void output(const int *input, int num) {     int a, b, c, i;      for(i = 0; i < num; i++)     {         a = * (input + i) % 10;         b = (* (input + i) / 10) % 10;         c = (* (input + i) / 100) % 10;          if(*(input + i) != 0)         {             printf("%d^3+%d^3+%d^3 = %d\n", a, b, c, * (input + i));         }     } }
user-0 提问: 声明变量的位置产生C2143和C2065错误

回复:
user: user-1
content: 比较老的编译器有这个要求：将所有的定义/声明放在前，使用放在后面。建议使用最新的（或较新的）编译器。

user: user-2
content: 你用的编译器比较老吧，比较老的编译器采用旧的标准，规定在任何执行语句之前，在块的开头声明所有局部变量。较新的编译器已经没有这个限制了
user-0 提问: leetcode86.分隔链表

回复:
user: user-0
content: struct ListNode* partition(struct ListNode* head, int x) {        struct ListNode left, right;        struct ListNode *l = &left, *r = &right;          while(head){             struct ListNode*  ref = head->val < x ? l : r;             ref->next = head;             ref = ref->next;                          head = head->next;         }         l->next = right.next;         r->next = NULL;         return left.next; }  同时这个也需要能得到大家的帮助谢谢啦
user-0 提问: 初学C语言编程，，程序运行时停止工作

回复:
user: user-1
content: scanf("%d%d%d",&a,&b,&c);

user: user-2
content: scanf("%d%d%d",&a,&b,&c);

user: user-3
content: scanf("%d%d%d",&a,&b,&c); 取地址，加&

user: user-4
content: 忘记加地址符了

user: user-5
content: scanf("%d%d%d",&a,&b,&c);

user: user-6
content: scanf("%d%d%d",a,b,c);后面是&a,&b,&c

user: user-2
content: scanf 后面的参数要加上&

user: user-7
content: 传地址才能输入

user: user-8
content: scanf函数中的变量要加取地址符&

user: user-9
content: 输入的时候没有打&地址符哦

user: user-10
content: 新手常见错误，将scanf("%d%d%d",a, b, c); 改为scanf("%d%d%d",&a, &b, &c)， 以后写程序要多调试

user: user-11
content: 1.输入三个数时有错误，scanf("%d%d%d",a,b,c);应改为scanf("%d%d%d",&a,&b,&c);,因为在输入数值型的变量时要加上取地址符&，否则会发生错误，但如果要输入一个字符串，只要输入字符数组名即可，因为字符数组名代表数组的首地址。 2.程序最后的retuen 0;不应该放在if...else嵌套结构里面，应把其放在花括号外面。

user: user-12
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-13
content: 输入要有地址符

user: user-14
content: 将scanf("%d%d%d",a, b, c); 改为scanf("%d%d%d",&a, &b, &c);   //记住要输地址符号&

user: user-15
content: scanf("%d%d%d",a,b,c); 输入函数的参数类型问题，改成这样： scanf("%d%d%d", &a, &b, &c);
user-0 提问: 条件编译中用@符号扩起的，表示什么意思？

回复:
user: user-1
content: 引用 5 楼 kingyo 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 和代码生成技术有关，我猜。  确实如赵老师所说，这个源代码还需要有一个配置的过程，我没有配置就拿过来了。配置后没有@@了。[/quote] 一般我猜得还是比较准的。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:和代码生成技术有关，我猜。  确实如赵老师所说，这个源代码还需要有一个配置的过程，我没有配置就拿过来了。配置后没有@@了。

user: user-1
content: 和代码生成技术有关，我猜。

user: user-2
content: 不是C++的语法吧，是不是用来标记什么东西的

user: user-3
content: 还有这样的写法吗

user: user-4
content: 还真没见过使用@呢，但收尾两个@。可能用于区分一个宏名。或者@本身就是属于宏名的一部分。 不过，在Linux编程这么多年，没见过用@的宏
user-0 提问: 关于c语言学习中的问题

回复:
user: user-1
content: 百度搜相关关键字。

user: user-0
content: 自己顶一个！！！

user: user-0
content: 不行啊，每次打开都是提示下载，我想在页面显示！！！

user: user-2
content: 1.检查下cgi-bin的配置，是否添加了cgi的后缀  2.C程序里有没有打印content-type信息 printf("Content-type:text/html\n\n"); 在输出之前打印

user: user-0
content: 自己顶一个！！！

user: user-0
content: 自己顶一个！！！
user-0 提问: vc++6.0上为什么 有些程序没有错却运行不出正确结果呢。。。。

回复:
user: user-1
content: 程序编译没有错误，只能证明你的代码在语法上没有错误，并不能代表你的程序是正确的，算法有错误是可以通过编译，但运行会出错，这道题并不难，仔细的查找其中马虎的地方，下次不要再犯就是一种成长！加油！

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

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

user: user-3
content: #include<stdio.h>  int main() {     int i=0,n=0;     char c[]="coder\0-pig";   //利用循环求字符串的长度      //while(c[i++]!="\0")     while(c[i++] != '\0')         n++;     printf("输出字符串的长度:%d\n",n);      n = sizeof(c)/sizeof(char);     printf("输出字符数组的长度:%d\n",n);      for(i=0;i<11;i++)         printf("%c", c[i]);     putchar(10);      return 0; } 参考一下吧 第一个，字符串结束标记是'\0'而不是"\0"，后面的是字符串，不是字符；  #include<stdio.h>  int main() {     int i;     double sum=0;     //for(i=1; 1 <= 100;i++)     for(i=1; i<=100;i++)     {         sum +=i;     }     printf("输出前100项的和:%lf\n", sum);     return 0; } 编程是一个细活，写错一个字母都会出现完全不一样的结果。

user: user-4
content: 程序有问题，你需要再检查一下。

user: user-5
content: #include<stdio.h> int main() { int i; double sum=0; for(i=1;1<=100;i++) //这里写成死循环了，应该是(i=1;i<=100;i++) { sum +=i; } printf("输出前100项的和:%lf\n",sum); return 0; }

user: user-6
content: 第一个while（）里面\0要用单引号，第二个for循环条件写错了不是1<=100而是i<=100
user-0 提问: 为什么形参地址值一样

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-2
content: void my_point_func(ab，char *pa)  你在函数中再多加个参数ab试试看吧，

user: user-3
content: 1.开始执行my_array_func 函数，进栈假如起始位置0xffff1234，执行过程中可能会定义新的栈变量，因为是函数内的栈地址是递减的，所以会根据定义的变量大小递减。等到函数结束，退栈，此时退到原来位置0xffff1234 2.开始执行my_point_func函数，进栈，又从0xffff1234位置进入，...，退栈 3.ca虽然是数组，但是编译器把它视为指针。pa也是指针。 所以得到这两个指针地址都一样

user: user-4
content: 数组简单的话可以理解为指针的高级版本，那么输出凭什么不一样啊

user: user-5
content: 因为 printf("addr of array param=%x  \n",&ca);   这取的是ca在栈中的地址。

user: user-0
content: 每次编译时值都变化了，但变化后这两个值也都一样。到底是为什么呢？ 我想知道，这两个值为什么一样？

user: user-6
content: 一样也不能说明什么，不代表是同一个变量，最多算一种巧合，因为函数结束后栈顶指针会向栈底移动，销毁了之前栈上的空间，后一个函数调用时，该局部变量刚好也在相同的位置上，你可以试下在其他函数里再调用my_point_func，结果通常就不是一样的了

user: user-7
content: 看看传的是什么，修改形参值，实参是否变化

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

user: user-8
content: 因此ca和pa都是接收的同一个实参。这是第一个原因；第二，ca虽然是定义的是数组，但是编译器也是将其解析成指针(数组不能做左值，既然可以ca++，那么说明编译器对ca没有按照数组处理），因此ca和pa都是指针变量。 ca++, pa++是修改的指向ga空间的下一个数组元素地址，并没有修改ga的地址值。 另外，ga是不会被修改地址值的，因为其是数组名，数组名是数组的首地址，由于数组不能做左值，因此ga不会被修改。

user: user-9
content: 同一个数组，为什么要不一样～

user: user-10
content: 第一个函数调用完，栈指针回到原位，而第二个函数参数结构和第一个又一样，所以使用同样的内存地址。

user: user-11
content: 可以看看汇编
user-0 提问: 新手c 语言问题求助

回复:
user: user-1
content: 17用c语言编译器 先把 拓展名  改成.c

user: user-2
content: 建议看一下报错信息

user: user-3
content: 支持一下赚点分

user: user-4
content: #pragma warning(disable:4996) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS”

user: user-5
content: 是不能运行还是根本就编译不过去呢？ vs2017编译器的库不支持scanf函数，而是支持scanf_s。  #include<stdio.h>  static int n=0;  typedef struct student {     int NNum;     char Cname;     int Nscade; }stu;  void add(stu *p) {     printf("请输入增加学生的姓名，学号，成绩");     scanf_s("%d%c%d",&p[n].NNum, &p[n].Cname, 1, &p[n].Nscade);     n++; } int main() {      stu s[100];     add(s);     return 0; }
user-0 提问: 有一个折磨我很久的int和double数据输出结果不一致问题，，求教

回复:
user: user-0
content: 引用 4 楼 赵4老师的回复:浮点数格式 http://bbs.csdn.net/topics/390676437 哦，我明白了，谢谢你了～

user: user-0
content: 引用 3 楼 自信男孩的回复:因为m1是int类型，(x - h1) * 60计算之后的浮点数会被去掉小数部分简称取整，即不论小数是多少，只取整数部分。 而t是double类型，计算时不会去除小数部分。 哦，我明白了，谢谢你了～

user: user-0
content: 引用 2 楼 user-3的回复:浮点数转换为整型的时候并不是四舍五入的，是截尾的 计算出来的t因为浮点数计算的误差，应该是略小于24，所以截尾后就是23了 你输出一个t-24的结果看看是不是一个极小的负数 使用 m1=(x-h1)*60+0.5 可以解决这个问题 哦，我明白了，谢谢你了～

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

user: user-2
content: 因为m1是int类型，(x - h1) * 60计算之后的浮点数会被去掉小数部分简称取整，即不论小数是多少，只取整数部分。 而t是double类型，计算时不会去除小数部分。

user: user-3
content: 浮点数转换为整型的时候并不是四舍五入的，是截尾的 计算出来的t因为浮点数计算的误差，应该是略小于24，所以截尾后就是23了 你输出一个t-24的结果看看是不是一个极小的负数 使用 m1=(x-h1)*60+0.5 可以解决这个问题

user: user-0
content: 哪位大神能帮我解答一下
user-0 提问: 关于“为什么一个整型数值不能赋给指针变量”的想法求大佬纠正

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

user: user-2
content: 这样是可以的。p = 1000;是将1000赋值到p的变量里。（指针变量也有空间，空间是固定的，sizeof(int)). 指针变量里存放的数都是固定的，二进制，因为我们的内存里存放的都是二进制，因为计算机只认识二进制不认识16进制，8进制。 那为啥要8进制，16进制，十进制，因为我们看二进制费劲，虽然计算机看它没问题，所以会出现10,8,16等等进制

user: user-0
content: 引用 2 楼 自信男孩的回复:这样是可以的。p = 1000;是将1000赋值到p的变量里。（指针变量也有空间，空间是固定的，sizeof(int)). 指针变量里存放的数都是固定的，二进制，因为我们的内存里存放的都是二进制，因为计算机只认识二进制不认识16进制，8进制。 那为啥要8进制，16进制，十进制，因为我们看二进制费劲，虽然计算机看它没问题，所以会出现10,8,16等等进制 感谢大佬的教导，感谢感谢

user: user-0
content: 引用 3 楼 赵4老师的回复:电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 感谢老师的教导。。。

user: user-0
content: 引用 1 楼 考拉一枚的回复:跟进制无关，如果你真想将数值变成指针也是可以的，强制转换即可,与硬件相关的开发经常会用到。 你可以 int *p = (int *)1000 ，你可以 把p打印出来看看是不是1000,  切记不要试图去访问*p的内容，这里只是个例子，*1000不能非法访问 谢谢大佬的教导，我知道了

user: user-3
content: 跟进制无关，如果你真想将数值变成指针也是可以的，强制转换即可,与硬件相关的开发经常会用到。 你可以 int *p = (int *)1000 ，你可以 把p打印出来看看是不是1000,  切记不要试图去访问*p的内容，这里只是个例子，*1000不能非法访问
user-0 提问: 项目中如何使用SQLite比较好？

回复:
user: user-1
content: 引用 2 楼 bandaoyu 的回复:引用 1楼赵4老师 的回复:百度搜相关关键字。老大，我就是百度了之后发现好几种方案，特来请教一下，哪一种最优 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-0
content: 引用 1楼赵4老师 的回复:百度搜相关关键字。老大，我就是百度了之后发现好几种方案，特来请教一下，哪一种最优

user: user-1
content: 百度搜相关关键字。
user-0 提问:  C语言实现数据转换功能问题

回复:
user: user-1
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-2
content: 首先使用c，读取文件，得到的是一个很长的数据字符串；然后把~作为分割符，分割出来得到很多一段一段的字符串，可以把这些字符串存放放到一个vector<string>容器里面，然后定义一个结构体，对其成员一一赋值，然后再写到文件中。 由于你给的信息太少，我只能讲个我的大概思路。
user-0 提问: 【求助帖】新手哭求帮助~~~~这个程序是为了滚动8*8的点阵，但是总是报警告。。。 真的找不到错误的地方了。。。

回复:
user: user-1
content: b,c数组没定义嘛,这不很明显的问题

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

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

回复:
user: user-1
content: 第一个要用int*初始，而不是int   第二个"1"字符串本身就可以退化为const char*的指针，可赋值给char*的数组元素  第一个你要写成：int num[2] = { 1,2 };就可以了

user: user-0
content: 明白了，谢谢你们！ nt *num[2]={1,2}; // 定义过程 int *num[2];   //定义指针，在内存中会给指针num[0]和num[1]分配地址的 num[2]={1,2};//这个相当于 给指针num[0]=1，num[1]=2，指针即是地址，给地址赋值，会改变原来指针地址的值，肯定会出错的。  char *ch[2]={“1”,“2”}; char *ch[2]; //定义指针，在内存中会给指针ch[0]和ch[1]分配地址的 ch[2]={“1”,“2”};// 注意，“1”，“2”是字符，存在文字常量区，指针ch[0]会指向字符“1”的首地址，指针ch[1]会指向字符“2”首地址 。 C语言就这么规定，不要问ch[0]="1" 这几句解释好清楚！

user: user-2
content: 你定义的都是指针数组当然初始化的值只能是指针类型，巧的是C语言中字符常量在内存中存的就是字符的地址

user: user-3
content: int *num[2]={1,2}; // 定义过程 int *num[2];   //定义指针，在内存中会给指针num[0]和num[1]分配地址的 num[2]={1,2};//这个相当于 给指针num[0]=1，num[1]=2，指针即是地址，给地址赋值，会改变原来指针地址的值，肯定会出错的。  char *ch[2]={“1”,“2”}; char *ch[2]; //定义指针，在内存中会给指针ch[0]和ch[1]分配地址的 ch[2]={“1”,“2”};// 注意，“1”，“2”是字符，存在文字常量区，指针ch[0]会指向字符“1”的首地址，指针ch[1]会指向字符“2”首地址 。 C语言就这么规定，不要问ch[0]="1"  不要这样赋值int *num[2]={1,2}; int *num; int a[2]={1,2}; num=a;

user: user-4
content: 定义指针时，除了字符串常量，编译器并不为指针所指向的对象分配空间，只分配指针本身的空间。
user-0 提问: 一道考试题，1到25数字按 5x5 格式输出

回复:
user: user-1
content: zhua  引用 1 楼 cfjtaishan 的回复:#include <stdio.h>  #define ROW     5 #define COL     5  int main() {     int a[ROW][COL],num,count;     int i, j, k, kend, lend;      num = ROW;     kend = num / 2;     lend = num;     count=1;     for( i=0,j=0,k=0; k<kend; k++ )     {         a[i][j]=count++;          for(j++;j<lend;j++)             a[i][j]=count++;          for(i++,j--;i<lend;i++)             a[i][j]=count++;          for(i--,j--;j>=k;j--)             a[i][j]=count++;          for(i--,j++;i>k;i--)             a[i][j]=count++;          i++;j++;lend--;     }     if(num%2 != 0) a[i][j]=count;     for( i=0; i<num; i++ )     {         for( j=0; j<num; j++ )             printf("%4d ",a[i][j]);         printf("\n");     }      return 0; } 参考一下吧  https://blog.csdn.net/qq_27183003/article/details/49699463 更多参考 +1  转圈赋值，然后统一输出就行，貌似是大一时候的题

user: user-2
content: #include <stdio.h>  #define ROW     5 #define COL     5  int main() {     int a[ROW][COL],num,count;     int i, j, k, kend, lend;      num = ROW;     kend = num / 2;     lend = num;     count=1;     for( i=0,j=0,k=0; k<kend; k++ )     {         a[i][j]=count++;          for(j++;j<lend;j++)             a[i][j]=count++;          for(i++,j--;i<lend;i++)             a[i][j]=count++;          for(i--,j--;j>=k;j--)             a[i][j]=count++;          for(i--,j++;i>k;i--)             a[i][j]=count++;          i++;j++;lend--;     }     if(num%2 != 0) a[i][j]=count;     for( i=0; i<num; i++ )     {         for( j=0; j<num; j++ )             printf("%4d ",a[i][j]);         printf("\n");     }      return 0; } 参考一下吧  https://blog.csdn.net/qq_27183003/article/details/49699463 更多参考

user: user-3
content: 经过修改，本程序支持任意的M，N（除了0以外的正整数）。上面的程序缺不支持，比如6*5 #include <stdio.h> #include <math.h> #define M 6 #define N 5 void fun(); int main() { 	fun(); 	return 0; } //m*m void fun() {    int arry[M][N] = {0};        int i,j,k;    int cnt = 1;//1--M*M    //for(i = 0;i < (int)(M*1.0/2 +0.5);i++){ 	for(i = 0;i < ceil(sqrt(M*M+N*N)/2);i++) {   	   for(j=i,k=i;k < N-i;k++){ 		   arry[j][k] = cnt; 		   cnt++; 	   } 	   for(j=i+1,k=N-1-i;j<M-i;j++){ 		   arry[j][k] = cnt; 		   cnt++; 	   } 	   for(j=M-1-i,k=N-2-i;k>=0+i;k--){ 		   arry[j][k] = cnt; 		   cnt++; 	   } 	   for(j=M-2-i,k=0+i;j>=1+i;j--){ 		   arry[j][k] = cnt; 		   cnt++; 	   }    }    for(i=0;i < M;i++){      for(j=0;j < N;j++) 		 printf("%02d ",arry[i][j]);      printf("\n");    } }

user: user-3
content: 看了一下楼上的，确实没有楼上的好，这只是我临时想起来的，有待优化

user: user-3
content: #include <stdio.h> #define M 5 //M可以为别的值 void fun(); int main() { 	fun(); 	return 0; } //m*m void fun() {    int arry[M][M] = {0};        int i,j,k;    int cnt = 1;//1--M*M    for(i = 0;i < (int)(M*1.0/2 +0.5);i++){ 	   for(j=i,k=i;k < M-i;k++){ 		   arry[j][k] = cnt; 		   cnt++; 	   } 	   for(j=i+1,k=M-1-i;j<M-i;j++){ 		   arry[j][k] = cnt; 		   cnt++; 	   } 	   for(j=M-1-i,k=M-2-i;k>=0+i;k--){ 		   arry[j][k] = cnt; 		   cnt++; 	   } 	   for(j=M-2-i,k=0+i;j>=1+i;j--){ 		   arry[j][k] = cnt; 		   cnt++; 	   }    }    for(i=0;i<M;i++){      for(j=0;j<M;j++) 		 printf("%02d ",arry[i][j]);      printf("\n");    } }
user-0 提问: 求C语言螺旋向外遍历的算法代码

回复:
user: user-1
content: 你的这个需求很像建立螺旋数组的逆过程。建议参考： https://blog.csdn.net/qq_27183003/article/details/49699463 可以逆序一下。

user: user-2
content: Do not let me think!#include <stdio.h> #define MAXN 100 int m[MAXN+2][MAXN+2]; char d; int x,y,k,n,w; char str[10]; void main() {     while (1) {         printf("Input n(1..%d):",MAXN);         fflush(stdout);         rewind(stdin);         if (1==scanf("%d",&n)) {             if (1<=n && n<=MAXN) break;         }     }     y=0  ;for (x=0;x<=n+1;x++) m[y][x]=1;     y=n+1;for (x=0;x<=n+1;x++) m[y][x]=1;     x=0  ;for (y=0;y<=n+1;y++) m[y][x]=1;     x=n+1;for (y=0;y<=n+1;y++) m[y][x]=1;     for (y=1;y<=n;y++) {         for (x=1;x<=n;x++) {             m[y][x]=0;         }     }     x=1;     y=1;     k=0;     d='D';     while (1) {         k++;         if (k>n*n) break;         m[y][x]=k;         switch (d) {             case 'D':                 if (0==m[y+1][x])  y++;                 else              {x++;d='R';}             break;             case 'R':                 if (0==m[y][x+1])  x++;                 else              {y--;d='U';}             break;             case 'U':                 if (0==m[y-1][x])  y--;                 else              {x--;d='L';}             break;             case 'L':                 if (0==m[y][x-1])  x--;                 else              {y++;d='D';}             break;         }     } 	w=sprintf(str,"%d",n*n);     for (y=1;y<=n;y++) {         for (x=1;x<=n;x++) {             printf(" %0*d",w,m[y][x]);         }         printf("\n");     } }

user: user-3
content: #include <stdio.h> #include <math.h> #define M 5 #define N 5 void fun(); int main() { 	fun(); 	return 0; } //m*m void fun() {    int arry[M][N] = {0};        int i,j,k;    int cnt = M*N;//1--M*M    //for(i = 0;i < (int)(M*1.0/2 +0.5);i++){ 	for(i = 0;i < ceil(sqrt(M*M+N*N)/2);i++) {   	   for(j=i,k=i;k < N-i;k++){ 		   arry[j][k] = cnt; 		   cnt--; 	   } 	   for(j=i+1,k=N-1-i;j<M-i;j++){ 		   arry[j][k] = cnt; 		   cnt--; 	   } 	   for(j=M-1-i,k=N-2-i;k>=0+i;k--){ 		   arry[j][k] = cnt; 		   cnt--; 	   } 	   for(j=M-2-i,k=0+i;j>=1+i;j--){ 		   arry[j][k] = cnt; 		   cnt--; 	   }    }    for(i=0;i < M;i++){      for(j=0;j < N;j++) 		 printf("%02d ",arry[i][j]);      printf("\n");    } }
user-0 提问: C语言fopen函数问题

回复:
user: user-1
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-2
content: 二进制文件本有时也会有类似文本文件的特性，比如你存的是字符'1'，存入文件的与文本文件是一样的，记事本打开字然也是对应的文本，如果你存数字1，打开就会是乱码，此外，WINDOWS下文本文件换行符为\r\n，如果写入\n，二进制文件写入\n，文本文件写入\r\n  二进制或文本文件都是区分给人的，SDK实现层都是一样的

user: user-3
content: 因为你写入的都是ascii码, 你写几个汉字试试就知道了

user: user-4
content: 若打开的文件，用fwrite写入的就可能是乱码； fopen以ab+只是以二进制（追加）形式打开文件，没说文件就是二进制文件。
user-0 提问: 我想计算五位数的位数，请问这代码哪里有错误，萌新~

回复:
user: user-1
content: 学学 Java 源码中的思想：#include <stdio.h>  int getIntegerLength(int n) { 	int i = 0; 	int arr[] = { 0, 9, 99, 999, 9999, 99999, 999999, 9999999, 99999999 }; 	while (n > arr[i]) { 			i++; 	} 	return i; }  int main() { 	printf("%d\n", getIntegerLength(1)); 	printf("%d\n", getIntegerLength(9)); 	printf("%d\n", getIntegerLength(11)); 	printf("%d\n", getIntegerLength(99)); 	printf("%d\n", getIntegerLength(111)); 	printf("%d\n", getIntegerLength(999)); 	return 0; }

user: user-2
content: #include<stdio.h> int main(){ 	int a,i; 	i =0; 	printf("Plese input \n"); 	scanf("%d",&a);  	for(;a!=0;i++){ 		a=a/10; 	}  	printf("%d",i);  	return 0;  }

user: user-3
content: 编译器问题~~~~

user: user-1
content: k = a / 10; // 这里 a 永远不变

user: user-4
content: 说错了 是去掉for语句中的i=i+1

user: user-4
content: 引用 3 楼 qq_34851925 的回复:嗯嗯好像是这么一回事2L，我是想输入一个五位以下的数字，然后计算出它到底是几位。该怎么改 你只需要去掉if语句中的i=i+1 有什么问题继续问 我会回答你

user: user-4
content: //六位以下数有几位 int main() {     int a,t=0,k;     scanf("%d",&a);     if(a>99999)printf("error!\n");     else{     for(k=a;k>0;k/=10)t++;         printf("%d\n",t);}     return 0; }

user: user-5
content: 现在C/C++中的int变量支持超过 32767以上的数字了？

user: user-6
content: 调用这个函数试试！ int get_num_bits(int num) { 	int i=0; 	if (num>99999) 	{ 		printf("the number >99999, is worng!\n"); 		return 0; 	} 	while(num) 	{ 		num=num/10; 		i++; 	} 	return i; }

user: user-7
content: for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

user: user-8
content: 先搞清楚for循环是怎么用的

user: user-9
content: 引用 3 楼 qq_34851925 的回复:嗯嗯好像是这么一回事2L，我是想输入一个五位以下的数字，然后计算出它到底是几位。该怎么改 #include <stdio.h>  int main(void) {     int a, cnt = 0;      scanf("%d", &a);      while (a) {         a /= 10;         cnt++;     }      printf("cnt = %d\n", cnt);     return 0; } 参考一下吧 你用for循环也是可以的。既然知道是多了i = i + 1;为啥不去掉再试试呢。

user: user-0
content: 嗯嗯好像是这么一回事2L，我是想输入一个五位以下的数字，然后计算出它到底是几位。该怎么改

user: user-9
content: for循环里已经有i = i + 1;为什么在循环体里也有i = i + 1; 楼主的问题是不是计算的位数不对，变大了。应该是i自增了两次。

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

回复:
user: user-1
content: #include <stdio.h> main() { float a,b,c; int i1,i2; a=0.1; c=0.000000; scanf("%f",&b); for(i1=0;i1<7;i1++) { for(i2=0;i2<10;i2++) { if(b>=a)    b-=a;    //你输入b=0.25 经过两次减0.1 还剩b=0.05 ,后面b肯定不为0 } if(b==c)    //这个条件就不成立  printf("****\n"); if(c==0) printf("&&&&\n"); a/=10; printf("--------\n"); printf("b=%f\n",b); printf("\n"); printf("a=%f\n",a); printf("--------\n"); } }

user: user-0
content: 明白了，多谢各位的解答

user: user-2
content: 注意浮点数与0的比较

user: user-3
content: if (fabs(b) <= 1e-6)   //单精度判断是否为0 if (fabs(b) <= 1e-15) //双精度判断是否为0

user: user-3
content: if(b==c) printf("****\n"); 你下面的代码里，是b == c不是b == 0; 这是一个问题。 第二个问题，也是主要问题，浮点数判断是否等于0，不是直接和0比较。而是 if (fabs(b) < 1e-6) //表示b等于0，针对单精度 详细信息请查阅这个博客： https://blog.csdn.net/gogokongyin/article/details/51105745
user-0 提问: uva332 Rational Numbers from Repeating Fractions尝试了十次一直WA，麻烦各位帮我看一下哪里遗漏，谢谢

回复:
user: user-1
content: 引用 2 楼 cfjtaishan 的回复:需求描述的不明确，代码阅读起来不易懂。 有测试用例吗？贴出来

user: user-1
content: 需求描述的不明确，代码阅读起来不易懂。

user: user-2
content: 建议看下 提问的艺术

user: user-3
content: 引用 6楼自信男孩 的回复:[quote=引用 5 楼 pan5690983 的回复:] Line15   scanf("%s", dec);  是不是少了一个取地址符号--->  scanf("%s", &dec); dec好像是数组名，数组名本身就是首地址。还需要加&？[/quote]啊啊 那应该是不用我的锅

user: user-1
content: 引用 5 楼 pan5690983 的回复:Line15   scanf("%s", dec);  是不是少了一个取地址符号--->  scanf("%s", &dec); dec好像是数组名，数组名本身就是首地址。还需要加&？

user: user-3
content: Line15   scanf("%s", dec);  是不是少了一个取地址符号--->  scanf("%s", &dec);

user: user-4
content: 百度搜相关关键字。
user-0 提问: 就几行程序而已，为什么输出不对！！！

回复:
user: user-0
content: 经过最近的搜索，问题的本质还是存储变量的区域不同，p[]是存在栈里的（包括p[]里面的内容），用完就释放，所以打印一定出错，但是如果把p[]换成*P（p存在栈）那么p所指的内容存放在常量区，用完不释放存放在常量区的内容，所以在打印后不会出错，希望对后来者有帮助！！！！

user: user-1
content: 如果定义为 char *p    则 hello wored 是常量字符串 它储存在常量储存区，指针p指向该区域的地址，但是如果定义为 char p[] 则是定义了一个数组变量，这个数组变量是局部变量，函数调用结束就会注销这部分占用内存，  return就出错了

user: user-2
content: char p[] 改为const char []

user: user-3
content: p是栈上的数组，函数结束后，栈释放，对于"hello world"来说. hello在栈顶，world是栈底，然后估计调用printf的时候，因为要传参压栈，把world这块给覆盖掉了，hello因为远而没有受到影响。 至于p如果是char*的话，那么此时p的值是指向数据区的一个指针，虽然说p本身被覆盖掉了，但是p的值是通过GetMemory返回的，因此str仍是指向数据区“hello world”的，所以肯定可以输出完整的 “hello world”

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

user: user-5
content: 可以复习一下函数的副本机制，GetMemory函数最好传递一个地址进去，可以直接char *p=“helloworld”；

user: user-6
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-7
content: 这是返回局部变量地址的问题，p数组是在函数getMemory栈上申请的，它的生命周期是函数调用开始，函数调用结束，则生命周期也随之结束。结束时，p的空间就会被释放，在Test函数里使用已经被释放的内存空间得到的结果是未定义的。  这是一类经典问题了。

user: user-8
content: 一句话，传指针的指针

user: user-9
content: 因为p是数组名，而不是指针

user: user-10

user: user-11
content: p是在栈上申请的内存，是一个局部变量，作用域在函数内。如果需要返回 ，可用malloc申请堆上的内存。堆上的内存需要手动释放。 内存中依然有数据，但是计算机已经认为是无效数据（内存没有被占用），可以随时被重新申请。乱码是最轻的，严重直接崩溃。 还有残留数据是因为C在释放内存时，只释放标志位，没必要把内存所有数据重新赋值。

user: user-12

user: user-13
content: 引用 11 楼 jiht594 的回复:[quote=引用 6 楼 qq_26602805 的回复:] [quote=引用 1 楼 earbao 的回复:] 有的，局部变量返回后会给自动释放，指针不会。 您好，我还是不太明白，这里的释放是不是这个意思：本来是要返回p，但是在没有赋值给str前，由于p被释放了，所以str赋值的是未知的，如果是未知的那为什么还能打印出hell[/quote]  未知的意思就是打出什么都有可能。即便打出的和你想要的一样也不行，狗屎运而已。知道局部变量这样用不对就行了。[/quote]  那里的内存已经不是你的了，至于什么时候被清空或者被覆盖不是你能控制的。

user: user-14
content: printf(str);没有这个用法吧！  改为printf("%s\n",str);可以正常打印 char p[]与char *p没什么区别

user: user-13
content: 引用 6 楼 qq_26602805 的回复:[quote=引用 1 楼 earbao 的回复:] 有的，局部变量返回后会给自动释放，指针不会。 您好，我还是不太明白，这里的释放是不是这个意思：本来是要返回p，但是在没有赋值给str前，由于p被释放了，所以str赋值的是未知的，如果是未知的那为什么还能打印出hell[/quote]  未知的意思就是打出什么都有可能。即便打出的和你想要的一样也不行，狗屎运而已。知道局部变量这样用不对就行了。

user: user-15
content: 有的，局部变量返回后会给自动释放，指针不会。

user: user-0
content: 引用 1 楼 earbao 的回复:有的，局部变量返回后会给自动释放，指针不会。[/quo  [quote=引用 3 楼 paschen 的回复:] 你GetMemory函数里的p是一个局部数组变量，该函数结束后就销毁了，所以出现未定义行为，你可以写成char*p=.....，因为这样p指向的是常量区的字符串，函数结束后，该内存仍然有效 请问，那出现未定义为什么还能打印出hell

user: user-0
content: 引用 1 楼 earbao 的回复:有的，局部变量返回后会给自动释放，指针不会。 您好，我还是不太明白，这里的释放是不是这个意思：本来是要返回p，但是在没有赋值给str前，由于p被释放了，所以str赋值的是未知的，如果是未知的那为什么还能打印出hell

user: user-16
content: char p[] = "hello world";                 return p;   问题处在这两句话上， 第一句话里面的数组名p和“指向数组首元素地址的指针”不等效。 所以你声明并且初始化了一个平凡无奇的数组，只不过恰好数组元素是字符型的，可以用c-string来初始化。  第二句中数组名p和“指向数组首元素地址的指针”等效，可以互换。 于是乎，返回了一个栈变量的地址出去了。
user-0 提问: C语言统计一个英文文本文件中26个英文字母出现次数并按英文字母序输出统计结果

回复:
user: user-1
content: #include "stdio.h" int main( void ) { 	FILE *p = fopen("1.txt","r"); 	int c=0,i=0; 	int ch[256]={0}; 	while( (c=fgetc(p)) != EOF) 		ch[c]++;				//256种字节值都记录下来  	fclose(p); 	 	for( i=0 ; i<256 ; i++ )	//遍历256种字节值的个数  		if( (i>='A'&&i<='Z') || (i>='a'&&i<='z') )	//是字母就输出  			printf("%c:%d\n", i, ch[i] ); 	return 0; }  没有运行验证，不过应该是没问题的

user: user-2
content: letter不知道吧，怎么if的呀

user: user-2
content: 为什么我根本打不开文件

user: user-3
content: 用hash映射就不会出现这个问题了吧

user: user-4
content: str[i+1]=str[i]+1; 这一句会越界吧

user: user-5
content: #include<stdio.h>  void hello(char one, FILE*fp ) {     char letter;     int num=0, ret;     while(!feof(fp)){         if(letter==one)             num++; #if 0         fscanf(fp, "%c", &letter); #else         ret = fscanf(fp, "%c", &letter);         if (ret == EOF)             break; #endif     }     printf("%c:%d  ", one, num);      return ; }  int main() {     FILE *fp;     if((fp=fopen("english.txt", "r"))==NULL){         printf("Cannot open the file!\n");         //exit(0);         return -1;     }      char str[26];     int i=0;     str[0]='a';      for (i=0; i<26; i++){         //str[i+1]=str[i]+1;         str[i] = 'a' + i;         // printf("str[%d]=%c ", i, str[i]);         hello(str[i], fp);         rewind(fp);     }     fclose(fp);      return 0; }  参考一下吧   str[i+1]=str[i]+1; 这条语句str越界，因为当i为25时，str[i+1]下表就是26，因为str[26]的下表是从0~25. 由于feof本身在判断文件末尾时会有一些小问题，建议从网上查一下feof，建议使用： ret = fscanf(fp, "%c", &letter);         if (ret == EOF)             break;

user: user-6
content: 说一下个人使用DEVC++的经历，以前使用DEVC++调试，特别是打断点，走到断点处总是出现各种奇怪的问题，但是去掉断点一次行跑到system("pause")就没问题。DEVC++已经不更新了，建议使用Codeblocks，vc/vs

user: user-0
content: 我用的是DEVC++

user: user-6
content: 你用的什么编译器，我在VC6.0下正常，没有错误。
user-0 提问: 指针数组的请教

回复:
user: user-1
content: 第一次： s[0]字符串"ABCD"的首地址 strlen(s[1])=2 所以是打印："ABCD"向右偏移1位后的整个字符串——BCD  第二次： s[2]字符串"EFGH"的首地址 strlen(s[1])=1（因为第一次里，向右偏移一位了） 所以是打印："EFGH"向右偏移0位后的整个字符串——EFGH

user: user-2
content: s[1]类型为char*，是地址++，而不是数字12+1，是s[1]++后是"2",strlen(s[1]) = 1

user: user-3
content: 错了 因为s[1]++以后 strlen(s[1]) = 1

user: user-0
content: 我的理解是 第一行输出 s[0]+2-1 即 s[0]+1   这得到BCD 然以后 s[1]++ 得到 s[1]=13?  i+=2 得到 i=2. 接着循环s[2]+2-1 即S[2]+1 不是也是FGH吗？ 我哪里理解错了吗

user: user-0
content: #include <stdio.h> #include <string.h> struct stud{    char name[10];    int  score[2];  } *p; main () {    char *s[4] = { "ABCD", "12", "EFGH", "34" };    int i = 0 ;    struct stud t[4]= {{"Lisa",98,97}，{"Tom",89,86}，                       {"John",68,79}，{"Lili",94,90}};     while( *s[1] != '\0' ){ 	        printf("%s\n", s[i]+strlen(s[1])-1); 	        s[1]++; 			i +=2;	 	}     p=t+2; 	printf("%s, %d\n ",t[0].name,t[0].name,t[0].score[0]+t[0].score[1]); 	printf("%s, %d\n ",p->name,p->score[0] + p->score[1]); } 被吞图了，看代码也可以，输出的第一行和第二行为什么是BCD 和 EFGH 啊

user: user-0

user: user-4
content: 百度搜相关关键字。
user-0 提问: oj上的光棍题，不知道怎么处理数据的问题，求指正啊！！

回复:
user: user-0
content: 谢谢啊，ac了···

user: user-1
content: #include<stdio.h> #include <stdlib.h>  int main() {     int n,i;     char *bachelor;     while(scanf("%d", &n)!=EOF)     {         if(n == 0)             break;         bachelor = (char *)malloc(sizeof(char) * (n +1));         if (!bachelor)             exit(0);          for (i = 0; i < n; i++)             bachelor[i] = '1';         bachelor[i] = 0;    /* '\0' */         printf("%s\n", bachelor);         free(bachelor);     }      return 0; }   参考一下吧； 理论上输入n位10000都没问题。
user-0 提问: C程序运行后按Ctrl+z后再按Enter退不出循环是为什么

回复:
user: user-1
content: Linux：Ctrl+D Windows：Enter、Ctrl+Z、Enter

user: user-0
content: 引用 1 楼 自信男孩的回复:Linux下输入ctrl+d，windows输入ctrl+z输入EOF  在Linux下测试，都能正常退出while循环； 第一个程序退出循环后打印100个数值。 我是在windows下输入了ctrl+z，然后按下回车    结果只出现换行，并没有输出任何其他内容啊，这是为什么啊

user: user-2
content: Linux下输入ctrl+d，windows输入ctrl+z输入EOF  在Linux下测试，都能正常退出while循环； 第一个程序退出循环后打印100个数值。
user-0 提问: 在一个固定长度的数组中对字符串进行增删改查

回复:
user: user-1
content: 储存长度为变长，并且lz想要获取数组实际长度的话，首先建议用指针，malloc动态分配内存； 其次，统计每个出现次数，只能想到比较笨的遍历方法

user: user-2
content: 百度搜相关关键字。
user-0 提问: 传递参数类型怎么传递

回复:
user: user-0
content: 就是传递的类型....

user: user-1
content: #define create_buffer(...) _create_buffer(#__VA_ARGS__) void* _create_buffer(const char* s_typename) { 	return NULL; }

user: user-2
content: 参数是值传递的，没听说过可以传类型进去的。你确定是funa可以传类型？还是类型代表的某个值
user-0 提问: c数据结构强制转换,这怎么转

回复:
user: user-1
content: 转成什么？union？

user: user-2
content: 直接就像你写这样就可以：(straa)st_ab    或者return  *(straa*)&st_ab;

user: user-3
content: straa func() {     strbb st_ab;     return (straa)st_ab; } 根据aa，bb的数据结构来看，可以直接强制类型转换。 转换之后就可以按照aa来用。

user: user-4
content: 如果是c++ ，可以自定义转换函数， 纯C话，如果二者内存布局一致，可以用memcpy 或者自己一个一个字段赋值
user-0 提问: 嵌入式C语言程序运行效率？

回复:
user: user-1
content: 贴点代码学习一下。

user: user-2
content: 去看看指令的执行周期就可以了。 IO 的指令周期相对比较长。

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

user: user-4
content: 这种情况，提高循环的执行效率就是不去做无用的工作，既然点评没有改变，则不去设置。 估计不是设置寄存器浪费时间，而是重复（大量的重复）做设置寄存器导致的耗时多。循环次数增加本身就会增加时间复杂度。
user-0 提问: c语言程序错误求大神改错

回复:
user: user-1
content: 怎么没有初始化

user: user-2
content: for (;j>i-1;j--)         L->data[j+1]=L->data[j]; insert函数里，这儿应该是for，而不是if  void find(sequenlist *L,int n) 这儿是定义，但是声明时却是一个参数，定义时是2个参数；  for(;j<L->length;j++)          printf("%d",L->data[j]);  去掉for循环中第一个表达式j，这儿没有意义；
user-0 提问: 折半法查找为什么反回的总是-1,多谢

回复:
user: user-1
content: low=sz[0]; high=sz[n-1]; low和high应该都是下表而不是下表对应的值。因此，应改成：  low = 0; high = n-1;

user: user-2
content: 没找到不就是-1嘛

user: user-3
content: low=sz[0]; high=sz[n-1];   这块代码写错了，low=0;high=n-1;  还有数组大小和查找的值最好作为参数传进来。
user-0 提问: 各位大神，帮我调试一下这段程序，出现错误，帮忙指正并改动一下代码，多谢了

回复:
user: user-1
content: 都是一些基本的语法问题，建议楼主细心一些。 另外，函数名定义，不要用拼音。如果英语能力欠缺建议好好补一补，写这样的代码不但阅读起来会比较有难度，而且别人别人也不应定用，自己平时写代码时尽量克服拼音。  折半查找binary_search， 输出：print, show，输入input， enter等等仅供参考

user: user-1
content: if (mid=n)         {             return mid;         } 改成：  if (mid==n)         {             return mid;         } 注意是判断语句而不是赋值语句；  //sz[i]=term;                 term = sz[i];                 sz[i]=sz[j];                 sz[j]=term; 注意数据交换的顺序：现将sz[i]赋值给term，而不是term赋值给sz[i];再说term是随机值，把随机值赋值给sz[i]没意义。  int main() {     int sz[N];     shuruchengji(sz);     shuchushunxuchengji(sz);     zhebanfachazhao(sz); } 函数调用，参数的传入规则如上。

user: user-2
content: shuruchengji(sz[N]);需改为shuruchengji(sz); sz[N]表示一个int

user: user-0
content: 总是出现这个错误 cannot convert parameter 1 from 'int' to 'int []'

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

回复:
user: user-0
content: 我也知道啊，这个问题困扰好久了。就是我新调用一次函数里面有一个给指针申请空间的语句，然后再给指针结构体的内容赋值，而下一次再执行这个函数的时候这个指针的值就被覆盖了一样。他不应该是从新申请了一个空间吗？

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

回复:
user: user-1
content: void fun(char p1[], char p2[]) {      int i=0, j;     for (i=0;p1[i]!='\0';i++)         ;      for (j=0;p2[j]!='\0';j++)         p1[i++]=p2[j];     p1[i] = 0;   /*'\0'*/ }  参考一下吧

user: user-2
content: *p1=*p?这个怎么看起来不对劲啊

user: user-0
content: #include <stdio.h> void fun(char p1[], char p2[]) {  	int i=0,j; 	char p[120]; for (i=0;p1[i]!='\0';i++)     p[i]=p1[i]; for (j=0;p2[j]!='\0';j++) 	p[i++]=p2[j];  *p1=*p;   }  main() {    char s1[80], s2[40] ;void NONO ();       printf("Enter s1 and s2:\n") ;      scanf("%s%s", s1, s2) ;      printf("s1=%s\n", s1) ;      printf("s2=%s\n", s2) ;      printf("Invoke fun(s1,s2):\n") ;      fun(s1, s2) ;      printf("After invoking:\n") ;      printf("%s\n", s1) ;      NONO() ; } 这个是整个程序，你看看

user: user-1
content: if(p1[i]!='\0') p[i++]=p1[i]; 这儿的if是不是应该用while呢？ 改成这样 (p1[i]!='\0') p[i++]=p1[i]; 这是其一。 第二个问题，p1若是字符数组，那么p1 = p；是无法赋值的；那么即使p1是指向数组的字符指针，那么p1 = p;这儿调用fun之后p会被自动释放，因为p数组是局部变量。除非把p定义成static属性的变量。否则返回局部数组没有意义。  建议将你的函数原型贴出来，没有形参和实参，以及fun的调用规则，不好确定如何去修改。