Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: warning C4090  不同的“const”限定符

回复:
user: user-0
content: 问题自己解决了，计算机不骗人，函数的参数类型和传入的类型之前写的有区别，查了一点。

user: user-1
content: NTSTATUS s; s=File_GetFIleStandardInfo...

user: user-2
content: 中间变量 中转

user: user-3
content: 添加一个中间变量即可，如一楼所示。

user: user-4
content: FltObjects是PostCreate函數帶進來的，試一下在File_GetFileStandardInfo函數中對該參數用和PostCreate相同的限定符_In_如何？
user-0 提问: while多条件循环问题

回复:
user: user-1
content: 不要用逻辑与&&，而是要用逻辑或||，当这两个条件之一成立时（暴力输入或者输入负数时），就要重新输入。 对于scanf()函数的用法，请参考 《C++中scanf和printf系列函数简介》 希望能够帮到你

user: user-2
content: (scanf("%f",&one.count)!=1&&one.count>0) 能不能先解释下你的目的？

user: user-3
content: 看了好几遍才看懂楼主想表达的意思 按照正常的理解应该用||逻辑才对 两个只要有一个不满足就打印重新输入

user: user-4
content: 上面说错了，应该改成while (scanf("%f",&one.count)!=1 || one.count<=0){..} 这样，因为上面两个条件只要有一个不满足就不通过

user: user-4
content: while (scanf("%f",&one.count)!=1&&one.count>0) 这和用不用别的变量没关系，注意看他的条件，&& one.count>0    &&是and的意思，你的意思是让他输入大于0的时候重新输入吗，应该是小于0的时候重新输入吧。应该改成while (scanf("%f",&one.count)!=1&&one.count<=0)

user: user-5
content: scanf("%f",&one.count)!=1成立的条件是你输入的不是一个float数，比如字符串； 那么你要同时满足上述条件和count>0，那到底什么条件是满足的，你举个例子； 我想你要写的是scanf("%f",&one.count)==1吧

user: user-6
content: 用别一个变量呗 int input; while (scanf("%f",&input)!=1&&input<0)             {                 printf("\n输入不规范，请重新输入");                 fflush(stdin);                 printf("\n请输入购买该种水果的数量：");             } one.count = input
user-0 提问: 编程小白求助。遇到两个小编程算法不会

回复:
user: user-1
content: 堆排序了解下

user: user-2
content: 参考： https://blog.csdn.net/kisslalaa/article/details/74278852

user: user-0
content: 谢谢。可是第二题我在网上只搜到快排最坏情况下时间复杂度为O(n^2)的算法，最坏情况下复杂度为O(nlogn)的我还是没找到

user: user-3
content: 1.  while (n) {   n = n & (n - 1);   count++; }

user: user-4
content: 这两个题都是很常见的测试题，网上一搜就有很多，第一道图题的第二问楼上已给 下面这个搜快速排序算法就行了
user-0 提问: 为什么这个程序输出结果是a=16,b=9,c=7？求大神指点，代码如下

回复:
user: user-1
content: 【变量作用域的问题: 当一个代码段有与全局变量同名的变量时，该代码段以局部变量为生效；反之，则以全局变量为生效】  c=func(&a,b); 执行过程： int func(int *p,int a)  { 	a++; //a=3+1=4 	*p=a+b; //*p=4+0=4 //b是全局的，默认初始化为0 	b++; //b=0+1=1 	return(*p+a); //return (4+4) = 8 } 之后a=4，c=8，全局的b=1，局部的b=3  b=func(&c,a); 执行过程： int func(int *p,int a)  { 	a++; //a=4+1=5 	*p=a+b; //*p=5+1=6 //b是全局的，此时值为1 	b++; //b=1+1=2 	return(*p+a); //return (6+5) = 11 } 之后a=4，c=6，局部的b=8，全局的b=2，  a=func(&b,c); 执行过程： int func(int *p,int a)  { 	a++; //a=6+1=7 	*p=a+b; //*p=7+2=9 //b是全局的，此时值为2 	b++; //b=2+1=3 	return(*p+a); //return (9+7) = 16 } 之后a=16，c=6，局部的b=9，全局的b=3，  打印输出结果：printf("a=%d,b=%d,c=%d",a,b,c); 都是输出局部的a/b/c，所以答案是 16,9,6 ; 而不是 16,9,7

user: user-2
content: 多多养成单步调试和设断点调试的习惯。通过自己调试解决问题，比他人帮你找出原因，受益是完全不一样的

user: user-3
content: 每一步执行完以后就加个打印 printf("a=%d,b=%d,c=%d",a,b,c); 这实际就是指针传递和值传递问题，传指针的时候如果用*p=这样的解应用就改变了原来的值，值传递不改变值。

user: user-4
content: c=func(&a,b); printf("a=%d,b=%d,c=%d",a,b,c); b=func(&c,a); printf("a=%d,b=%d,c=%d",a,b,c); a=func(&b,c); printf("a=%d,b=%d,c=%d",a,b,c);  自己动手，丰衣足食

user: user-5
content: a的值由a = func(&b, c);决定，因为这个是最后修改a的表达式；同样b而是；c由b  = func(&c, a);这个表达式之后就能确定c的值。注意由于main中重新定义了b,所以全局变量b就会被屏蔽，main中输出的是局部变量b。但在func函数里是有效的。  先看第一个: c=func(&a,b);这条语句执行之后，a = 4（*p = 4 + 0); b = 1（全局），b = 3(局部), c = 8;  b = func(&c, a); 这条语句执行之后：a = 4, b = 2（全局）, b = 11(局部), c = 6； a=func(&b,c);这条语句执行之后: a = 16, b = 9, c = 6;

user: user-6
content: 主函数中定义的b不是把全局变量中的b给覆盖了吗？

user: user-6
content: 上边定义int *a int p为什么下边就成int *p int a了？？

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

user: user-8
content: 怎么会有这么乱的代码，完全就是中国式考题，你就按照步骤一步步算下去就行了，主要是这个函数int func(int *p,int a)的定义 p是一个指针，改变p的内容会改变传入的变量的值，而改变a不会改变传入的变量值，然后注意一下返回值就行了

user: user-9
content: 如果把函数中的int *p改成int p 然后在函数内部写*p=a+b;就会是另一个结果

user: user-9
content: 因为你func（&a,b）,对应的函数是(int *p,int b) 所以说*p=&a; 由于是把a的地址赋给了指针，所以返回的return （*p+b）中的*p取得值就是2
user-0 提问: 为什么最大值在0行0列时输出结果不是在零行零列，哪里写错了吗？

回复:
user: user-1
content: 引用 2 楼 user-3 的回复:2楼给的结果也不对吧 我试着从打从1-16的数组 16在第四行四列，但是运行之后显示的结果中是第三行第三列。 数组下表是从0开始的

user: user-2
content: 4*4的数组最大的就是第三行第三列啊

user: user-3
content: 2楼给的结果也不对吧 我试着从打从1-16的数组 16在第四行四列，但是运行之后显示的结果中是第三行第三列。

user: user-1
content: #include<stdio.h>  void input(int *p,int r,int l); void max(int *p,int r,int l);  void print(int (*arr)[4], int row, int col); //void main() int main() {     int a[4][4];     printf("input a[4][4]\n");     input(a[0],4,4);     print(a, 4, 4);     max(*a,4,4); } void input(int *p,int r,int l) {     int *q,*q_end=p+r*l;     for(q=p;q<q_end;q++)         scanf("%d",q); } void max(int *p,int r,int l) {     int i,j,m = 0, n = 0,mx=*p;     for(i=0;i<r;i++)         for(j=0;j<l;j++,p++)             if(mx<*p)             {                 mx=*p;m=i;n=j;             }     printf("max=%d,第%d行第%d列\n",mx,m,n); }  void print(int (*arr)[4], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%d ", arr[i][j]);         putchar(10);     }     putchar(10); } m和n没有初始化，当最零值在第一行第零列时，n和m是随机值
user-0 提问: 请教下老师这

回复:
user: user-1
content: 第五题： 思路：a[i]=a[i-1]+a[i-2] #include<iostream> using namespace std; int a[1001],x; int main(void) { 	cin>>x; 	a[1]=1; 	a[2]=1;//初始化前两项  	for(int i=3;i<=x;i++) 	{ 		a[i]=a[i-1]+a[i-2];//递推求解  	} 	cout<<a[x];//输出  	return 0; } 第六题： 本题可以直接使用字符串模拟int #include<iostream> using namespace std; string s; int siz; int main(void) { 	cin>>s;//Input 	siz=s.size;//size 	cout<<s<<" "; 	for(int i=0;i<siz;i++) 	{ 		cout<<s[i]<<" ";//按位输出  	} 	return 0; }

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

user: user-3
content: 写程序？还是有不懂的地方？
user-0 提问: 求助while循环问题

回复:
user: user-1
content: 8楼正解！清晰易懂

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

user: user-3
content: continue好像用的很少吧，break用的比较多，多用break

user: user-4
content: 没有i++，只在i＝31循环

user: user-5
content: int main（void）{ int i； i=31； while（i <=40）{ i++； if（i %3==0）{ continue； } printf（"%d"，i）； } return 0； }

user: user-6
content: 注意 while 不是 for 没有 增量 语句 ， i++ 要自己写

user: user-7
content: int main（void）{ int i； i=31； while（i <=40）{ if（i %3==0）{ i++； continue； } printf（"%d"，i）； i++； } return 0； }

user: user-8
content: 也就break有用，continue完全可以用代码结构替换掉

user: user-9
content: 尽量不要用continue，没什么用，也没必要

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

user: user-11
content: 压根没必要用continue，影响代码结构。  while（i <=40）{ if（i %3<>0）{ printf（"%d"，i）； } i++； } return 0； }

user: user-12
content: 很6的死循环，，，，

user: user-13
content: [code=c][/codewhile（i <=40）{ if（i %3==0）{ i++; continue； } printf（"%d"，i）； i++； }

user: user-0
content: 引用 4 楼 qq_33462307 的回复：引用 3 楼 weixin_40377939 的回复:[quote=引用 1 楼 qq_33462307 的回复：]continue之后没有执行i++，I恒等于33那是在Continue后面加上i++解决吗？ 前面...[/quote]哦哦懂了谢谢dalao

user: user-14
content: 引用 3 楼 weixin_40377939 的回复:引用 1 楼 qq_33462307 的回复：continue之后没有执行i++，I恒等于33那是在Continue后面加上i++解决吗？ 前面...

user: user-0
content: 引用 1 楼 qq_33462307 的回复：continue之后没有执行i++，I恒等于33那是在Continue后面加上i++解决吗？

user: user-15
content: 引用 1 楼 qq_33462307 的回复:continue之后没有执行i++，I恒等于33 +1

user: user-14
content: continue之后没有执行i++，I恒等于33
user-0 提问: 请问，为什么用C11的泛型测试结果数组名是指针型？

回复:
user: user-0
content: 引用 2 楼 自信男孩 的回复:数组名可以认为是指针常量（不能做左值）。 可数组名是数组类型啊，只有在运算时才转换为常量指针类型

user: user-1
content: 隐式类型转换了 参见 引用6.3.2 Other operands 6.3.2.1 Lvalues, arrays, and function designators  3 Except when it is the operand of the sizeof operator, or the unary & operator, or is a string literal used to initialize an array, an expression that has type "array of type" is converted to an expression with type "pointer to type" that points to the initial element of the array object and is not an lvalue.

user: user-2
content: 数组名可以认为是指针常量（不能做左值）。
user-0 提问: 结构体指针初始化问题

回复:
user: user-1
content: 还是要看下楼主的调用代码， 但是通过5楼这种方式是可取的， 即往里面传递一个二级指针，对这个二级指针的内容，即一级指针进行操作； 由于malloc和free的操作不在同一个代码片段，注意在使用完malloc的空间后，要调用free释放内存，否则就有可能发生内存泄漏。

user: user-2
content: 其实就是作用域的区别，实参和形参的区别

user: user-3
content: 还是基础不扎实，传值 传引用 区分清楚

user: user-4
content: 形参与实参虚实结合，为形参分配空间，随着函数调用结束，为形参分配的内存空间也会被释放掉，然而对实参并没有是什么影响，要改变指针的值，要用二级指针或者指针的引用

user: user-5
content: 应该Memset *A_INFO_

user: user-6
content: typedef struct  {  u8 length;  u8 timeout;  u8 state;  u8 buff[200];  }A_INFO;    void Test(A_INFO **A_INFO_)  {  *A_INFO_ = (A_INFO *)malloc(sizeof(A_INFO));  memset(*A_INFO_,0x0,sizeof(*A_INFO_));  } 给点分吧，下资料没有C贝，呵呵

user: user-7
content: 自定义的函数作用域有限，在函数中申请内存，进行初始化为0。 A_INFO_ = (A_INFO *)malloc(sizeof(A_INFO)); memset(A_INFO_,0x0,sizeof(*A_INFO_)); 这个语句执行后，就会被释放。 而且在自定义函数内进行赋值是不会被传出去的。

user: user-8
content: 你这个明显是有问题的，函数传参是通过值传递的。 void Test(A_INFO *A_INFO_)，形参的值是通过将实参的拷贝一份得来的，给形参分配地址以后，两个指针指向的就不是同一个位置，你给形参分配内存，和实参有个毛线的关系。 在函数里面给形参分配内存以后，函数结束之前还没有进行释放，这又造成了内存泄露。。。  这种问题有两个解决办法：1.把实参的地址穿进去，通过间接操作实参，给实参分配地址。2、函数的返回值返回一个分配好的地址，用指针在外面进行接收。。

user: user-9
content: void Test(A_INFO **A_INFO_) { *A_INFO_ = (A_INFO *)malloc(sizeof(A_INFO)); memset(*A_INFO_,0x0,sizeof(A_INFO)); } 用传入传出参数，就可以把申请后的空间已经初始化之后的内容获取。  如果是malloc/memset，建议用calloc。两个一起做了。

user: user-0
content: 哦，函数没有问题。 应该是声明结构体指针的时候去申请内存空间，不要在这个函数里面申请。

user: user-10
content: 2楼一语中的，是正解

user: user-10
content: 在函数里申请空间是没有问题的，malloc是在堆里分配内存空间，又不是在栈上。看看你执行报什么错误或警告。

user: user-11
content: //存在问题： //主函数中定义变量并将变量的内存首地址赋给了初始化函数void Test(A_INFO *A_INFO_)中的结构体指针，此时结构体指针正指向主函数中结构体变量的内存地址； //初始化函数void Test(A_INFO *A_INFO_)申请新内存并清空，此时，内存地址改变，但函数返回前并没有及时修正主函数中变量的内存地址，造成内存泄露 //所以应该使用二级指针，其实就是传址与传值的区别 #include "stdio.h" #include "string.h" #include "stdlib.h"  typedef struct { 	int length; 	int timeout; 	int state; 	int buff[200]; }A_INFO;  void Test(A_INFO **A_INFO_) { 	*A_INFO_ = (A_INFO *)malloc(sizeof(A_INFO)); 	memset(*A_INFO_,0x0,sizeof(**A_INFO_));  }  int main() { 	int i = 0; 	A_INFO *test;	//主函数定义A_INFO变量  	Test(&test); 	for (i = 0; i<200; i++) 		printf("test->buff[i] = %d\n",test->buff[i]) ; 	 }
user-0 提问: 为什么不能在头文件里定义全局变量以及指针

回复:
user: user-1
content: 引用 5 楼 xiaoqiang521 的回复:[quote=引用 4 楼 lin5161678 的回复:] 了解2个知识点  1. 编译器以文件为单位 对代码进行编译 2. #include的作用是 把文件的全部内容插入#include这个位置  你在文件1里面include了头文件 文件1里面就有一句 int cc = 0； 编译编译文件1 会在符号表里面 记录 文件1有一个变量名字叫做cc  你在文件2里面include了头文件 文件2里面就有一句 int cc = 0； 编译编译文件2 会在符号表里面 记录 文件2有一个变量名字叫做cc  所以就出问题了  顺便单纯按照你的描述是不会出问题的 只是有隐患  目测你在哪里include了头文件 然后忘记了 确实如你所言，但是只要把head.h 文件名改成head.c，然后主文件包含head.c,立即出错[/quote] 编译器不会编译 .h 文件  你把 .h 改成 .c 这个文件会编译一次  include的文件 会再编译一次  所以出错

user: user-1
content: 引用 6 楼 @风轻云淡_ 的回复:#ifndef _MY_HEAD__ #define_MY_HEAD__ int cc = 0; #endif这个做法只能实现在同一个文件不会重复包含 不同文件重复包含没作用的

user: user-2
content: 头文件会被多个文件包含，然后就会重定义了，可以在cpp中定义，然后使用extern关键字引用到头文件中

user: user-3
content: #ifndef _MY_HEAD__ #define_MY_HEAD__ int cc = 0; #endif

user: user-0
content: 引用 4 楼 lin5161678 的回复:了解2个知识点  1. 编译器以文件为单位 对代码进行编译 2. #include的作用是 把文件的全部内容插入#include这个位置  你在文件1里面include了头文件 文件1里面就有一句 int cc = 0； 编译编译文件1 会在符号表里面 记录 文件1有一个变量名字叫做cc  你在文件2里面include了头文件 文件2里面就有一句 int cc = 0； 编译编译文件2 会在符号表里面 记录 文件2有一个变量名字叫做cc  所以就出问题了  顺便单纯按照你的描述是不会出问题的 只是有隐患  目测你在哪里include了头文件 然后忘记了 确实如你所言，但是只要把head.h 文件名改成head.c，然后主文件包含head.c,立即出错

user: user-1
content: 了解2个知识点  1. 编译器以文件为单位 对代码进行编译 2. #include的作用是 把文件的全部内容插入#include这个位置  你在文件1里面include了头文件 文件1里面就有一句 int cc = 0； 编译编译文件1 会在符号表里面 记录 文件1有一个变量名字叫做cc  你在文件2里面include了头文件 文件2里面就有一句 int cc = 0； 编译编译文件2 会在符号表里面 记录 文件2有一个变量名字叫做cc  所以就出问题了  顺便单纯按照你的描述是不会出问题的 只是有隐患  目测你在哪里include了头文件 然后忘记了

user: user-0
content: 引用 1 楼 lin5161678 的回复:所以你的问题是啥  因为会重定义 所以不能在头文件定义全局变量呗  没了 为什么会造成重定义？？

user: user-0
content: 补充一句，如果是main.c 包含同样的head文件就可以通过编译，这是为什么？

user: user-1
content: 所以你的问题是啥  因为会重定义 所以不能在头文件定义全局变量呗  没了
user-0 提问: 抢答器

回复:
user: user-1
content: 得先找到规律，行号和打印的字符，能有公式表示出来，就可以用程序写出来。

user: user-2
content: 求各位大佬各位看看这个用C语言怎么打印 oooooooop oooooooppp ooooooppppp ooooop           p ooooppp       ppp ooopppp     ppppp oop           p            p oppp      ppp        ppp ppppp  ppppp   ppppp

user: user-3
content: 多綫程，變量做互斥訪問。
user-0 提问: 初学C语言，运行提示我未说明标示符，有点不理解，大伙帮我看看

回复:
user: user-1
content: scanf("d%",&x);,格式符

user: user-2
content: getchar给谁了？

user: user-3
content: 写代码，还是要仔细啊

user: user-4
content: %d 而不是d%

user: user-5
content: 看着好深奥啊 进来学习下

user: user-6
content: 多注意细节问题，

user: user-7
content: 厉害厉害

user: user-8
content: 引用 11 楼 @风轻云淡_ 的回复：3个问题： 1是“d%”----“%d” 2是  x>=o ----  x >= 0 3是getchar() 需要在return的前面+1

user: user-9
content: 同意三楼的解答

user: user-10
content: 看见if（）{  }else{  }不加大括号就难受

user: user-11
content: 引用 楼主 piuoooxiu的回复:#include<stdio.h> int main(){ 	int x,y; 	printf("输入一个角度值：\n"); 	scanf("d%",&x); 	if(x>=o&&x<=180) 		y=180-x; 	else if(x>180&&x<360) 		y=360-(x-180); 	printf("y=%d\n",y); 	return 0; 	getchar(); } 第五行应该是scanf("%d",&x)；

user: user-12
content: 3个问题： 1是“d%”----“%d” 2是  x>=o ----  x >= 0 3是getchar() 需要在return的前面

user: user-13
content: 一定要区分开o和0哦

user: user-14
content: 可能是你在码的时候不小心了，反正就是1不要切换输入法2在借鉴别人的代码的时候先理解，否则很难复查

user: user-15
content: #include<stdio.h> int main(){ int x,y; printf("输入一个角度值：\n"); scanf("%d",&x); if(x>=o&&x<=180) y=180-x; else if(x>180&&x<360) y=360-(x-180); printf("y=%d\n",y); return 0; getchar(); }

user: user-16
content: 很好很好，得到了帮助

user: user-17
content: 同意三楼的解答

user: user-18
content: #include<stdio.h> int main(){ int x,y; printf("输入一个角度值：\n"); scanf("%d",&x); if(x>=0&&x<=180) y=180-x; else if(x>180&&x<360) y=360-(x-180); printf("y=%d\n",y); return 0; getchar(); }

user: user-19
content: 两个地方的问题，一个是d%, 一个是0和o的问题。 上面的朋友也指出来了。

user: user-20
content: 第一个if哪儿是0不是o吧
user-0 提问: 运行程序遇到的编译器问题

回复:
user: user-1
content: 楼主真是菜，说的那么清楚了还看不懂

user: user-2
content: else里，先ans[row][col] = '\0', 然后再row++, col=0;  因为这样才能在row行最后一个字符赋值'\0'，否则row++, col = 0;再赋值'\0'，那不是新的一行新的一列赋值'\0'吗？

user: user-1
content: 你的问题在于每一行对应的字符串没有'\0'，printf打印字符串可能出现越界。 还有为啥先row++再赋值'\0'，不应该是每一行结束添加个'\0'么
user-0 提问: 对于一个长度为count的int数组，求按序号取出来k个数有多少种方法  取出来的要求:每次取出来的数，要比已经取出来的任何数都要大

回复:
user: user-1
content: 按序号取出来k个数？这不是没得选了么~~~

user: user-0
content: 能大概说一下算法思路吗？ 能有代码最好

user: user-2
content: 按序号取出N个数还能理解，比如取3个数，那就是取下标未： 1,2,3或者 2,3,4， 或者3，4,5或者 5,6,7 。。。。 :每次取出来的数，要比已经取出来的任何数都要大 后面这个要求就不太明白了，需要排序么？或者已经排序了？
user-0 提问: cin 输入的问题

回复:
user: user-1
content: 使用回车试试

user: user-2
content: 引用 4 楼 自信男孩 的回复:a,b,c的长度都是1，输入"123"等已经导致其越界了。 这个长度是指字符数组的长度，因为初始化时，只赋值了一个'\0'

user: user-2
content: a,b,c的长度都是1，输入"123"等已经导致其越界了。

user: user-3
content: 改成这样就好了： char a[10]=""; char b[10]=""; char c[10]="";  申明不带长度的char数组导致越界，你的代码是c越界覆盖了a、b，因此才打印成这样的。

user: user-4
content: 乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream！ 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。  #include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-0
content: 用回车也一样，出这个错误的结果

user: user-5
content: 你试试字符串用回车来分隔
user-0 提问: C语言指针问题，请教

回复:
user: user-0
content: ok，谢谢大哥们的解答。

user: user-1
content: char* pos = strtok(s, " ");  这个函数调用有问题。因为你的A声明的方式，导致A这个字符串是只读的。但是strtok需要在处理中填充0。所以不行。 可以这样修改；   char A[]= "this apple is sweet";

user: user-2
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-3
content: 第二个程序和第一个程序的愿意你是一样的。改成数组就没问题。

user: user-3
content: char* pos = strtok(s, " "); 需要了解这个strtok的处理逻辑，strtok是遇到第二个参数后，在s的" "出赋值'\0'，然后将s的首地址返给pos。既然是在源串上修改。但是main中，A指向的字符串是只读的，不能写。这就和strtok的处理逻辑相矛盾，如果程序运行应该是提示你段错误。 改成数组就可以了。
user-0 提问: C语言请问char *s:gets(s):puts(s）;

回复:
user: user-1
content: 字符数组能存是因为人家有内存空间，指针变量有吗？当然有，但是这个空间是来存它指向空间地址的，gets(s)函数不是把输入的字符串存到s变量里, 而是存到s指向的空间里，你的代码明显没有让s指向一块有效的空间，所以输入的东西存到哪呢？

user: user-2
content: char *s;这里的s是指针变量，并且是一个野指针，所谓野指针，即指针变量里存放的地址是一个随机数，若这个地址值是指向不可读写的位置，那么gets(s)或fgets(s，xx, xx);就会出现段错误；  而用char s[16], gets(s), fgets(s, 16, xx);就没问题，是因为数组的长度16是有效内存空间，可以读写。  char *s = malloc(sizeof(char) * 16); 这样可以把s看成s[16]了，但是注意malloc是在堆上申请空间，需要手动释放free(s);

user: user-3
content: 最好能贴一下你的代码进一步诊断。  字符指针和字符数组某些情况下可以认为是一样的。 例如:  char sarray[128] = {'1','2','3','4',0}; const char *s  = "1234"； printf("%s",s); printf("%s",sarray);  这种情况下s和sarray可以认为是一样的变量，它们代表的都仅仅是一个指针。 以上两个printf都能打印出“1234”；  你提到的s不可以，而数组可以，我猜测可能是你的s没有开辟内存空间，而数组是系统自动帮你开辟了的。 所以，你最好是这样写： char *s = (char *)malloc(1024); 然后再使用gets等函数。

user: user-4
content: 指针需要分配内存才能使用. char* s = new char[64];

user: user-5
content: str野指针 不能作为gets 和 puts的参数 顺便gets这个函数已经被废弃 别再用了

user: user-6
content: 确定下你的字符指针初始化了没

user: user-7
content: 不管是指针，还是数组，指针必须指向有效的且可写的内存空间。 char *s; // 没初始化，所以地址是随机的，野指针！ gets(s); // 错误！指针指向的随机区域不一定属于你的进程空间，就算是也不一定可写。 puts(s); // 不算错误，也不正确！读取可能不属于自己进程空间的内容数据，大多情况是乱码！// 严格来讲，这样写是不正确的，应该是 const char *s 才对： char *s = "abc"; // 初始化，指向常量区的 "abc" 字符串； gets(s); // 错误！指针指向的的是常量区，属于你的进程空间，但是只读不可写。 puts(s); // 正确！输出字符串！char buffer[128] = { 0 }; // 初始化 128 个字节为空； char *s = buffer; // 初始化，指向 buffer 可以读写。 gets(s); // 正确！也可以直接用 buffer 传参。数组名传递到参数则退化为指针，即和 char *s 相同意义。 puts(s); // 正确！也可以直接用 buffer 传参。数组名传递到参数则退化为指针，即和 char *s 相同意义。char *s = calloc(128, sizeof(char)); // 初始化 s 为新申请的 128 字节内存空间。 gets(s); // 正确！ puts(s); // 正确！ free(s);
user-0 提问: 结构体赋值问题

回复:
user: user-1
content: 查找所有ACT_TABLE_T和ACT_TABLE_T_STRU出现在项目中出现的位置，一个一个点开分析。

user: user-2
content: 我想楼主所描述的框架应该就是类似这样的吧 ： //单个事件定义 typedef struct ACT_TABLE_T_STRU { int event; stateEventFun eventFun;/*函数指针*/ }ACT_TABLE_T;  //全局的所有事件枚举定义 static const ACT_TABLE_T g_act_table[] =  { 	{ 		EVENT_1,			//事件的id编号 		EVEVT_1_FUNC_CB,	//事件的处理回调函数	 	}, 	 	{ 		EVENT_2,			//事件的id编号 		EVEVT_2_FUNC_CB,	//事件的处理回调函数	 	}, 	 	... 	 	{ 		EVENT_n,			//事件的id编号 		EVEVT_n_FUNC_CB,	//事件的处理回调函数	 	}, };  main函数处理 { 	while (1) { 		local_event_id = ... //从环形数组中取到对应的事件id 		 		for (....) //遍历g_act_table 		{ 			if (local_event_id == g_act_table[i].event) { //找到对应的事件，并调用它的回调函数 				g_act_table[i].eventFun();  			} 		} 	 	} }  从上面的框架可以发现， event的事件编号应该是在中断中丢入环形数组的。

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

user: user-4
content: 引用 1 楼 老马何以识途 的回复:不一定要直接賦值，對一個ACT_TABLE_T數組做整體初始化，也可以賦給函數指針的。 像上面的说的一样，需要查找 查找ACT_TABLE_T和ACT_TABLE_T_STRU在项目中出现的位置，逐个分析，

user: user-5
content: 看一下调用的是哪个函数，然后在看看被调用的函数都用到了哪些地方，应该就能找到了

user: user-6
content: 不一定要直接賦值，對一個ACT_TABLE_T數組做整體初始化，也可以賦給函數指針的。

user: user-7
content: event可能在中断里面赋值。 对应的函数列表初始化时候放到某个全局函数数组或者结构里了吧。 代码应该是没搜全，还有可能是没有按定义的名字赋值，比如 EVENT_A = 1, 赋值的时候不是赋值EVENT_A, 而是直接 赋值 1
user-0 提问: c语言按单词逆序输出句子，运行会超时，断点调试运行下来好像没什么问题。。。

回复:
user: user-1
content: 边界条件 输入输出格式 ……

user: user-0
content: sdfds fdss hdf!gdh sdfds fdss hdf! -------------------------------- Process exited after 6.152 seconds with return value 15 请按任意键继续. . .   运行结果是这样，调试单步下来是对的，求解

user: user-2
content: 应该是输入的最后没有加上'!', or '?' or '.'，因为只有遇到这三个其中一个就会退出输入循环 可能你在最后没有数组这三个其中一个，所以会出现没有运行结束，因为正在等待你的输入，直到数组这三个符号，或者输够N个字符。  有几个地方可以修改一下： for(i = 0; i < N-1; i++){         ch = getchar();         if(ch=='.'||ch=='!'||ch=='?') {             fin = ch;             break;         }         sentence[i] = ch;     }     sentence[i] = fin; //把终止字符存入句子最后一位 把i < N；改成i < N - 1

user: user-0
content: 问题解决了，我的软件好像有问题，复制到别的电脑上正确运行了。。

user: user-3
content: 后面那个while(1)里面加几句打印，把i, sta,end 都打印几次，可能结果就对了

user: user-4
content: 感觉没什么问题，但句子不是以.!?结尾会有问题的
user-0 提问: 用C编写一个简单的搜索引擎

回复:
user: user-1
content: 用搜索引擎搜索一下搜索引擎开发不就有了。

user: user-0
content: 引用 1 楼 自信男孩的回复: char *str = "abcd"; char ch;  scanf("%d", &ch); for (i = 0; i < strlen(str); i++)     if (ch == str)         break; if (i >= strlen(str))      return 1; else        return 0;   一个类似的搜索引擎 没想到真的有人回答了，我居然才看到，谢谢啦

user: user-2
content: char *str = "abcd"; char ch;  scanf("%d", &ch); for (i = 0; i < strlen(str); i++)     if (ch == str)         break; if (i >= strlen(str))      return 1; else        return 0;   一个类似的搜索引擎
user-0 提问: 寻求大牛帮助

回复:
user: user-1
content: 指数分布，rang试试

user: user-2
content: 产生随机数，用m和n的差求余，最后加上m（两者小的）就OK了

user: user-3
content: 不能用rand，rand产生的是均匀分布

user: user-4
content: 满足指数分布的 这是什么需求？

user: user-5
content: srand(time(NULL)); rd = M + rand() % (N - M + 1)

user: user-6
content: 建议翻翻常用算法程序集 （C语言版）

user: user-7
content: 参考： https://blog.csdn.net/u012480384/article/details/50838832

user: user-8
content: 起始数+ rand 取余
user-0 提问: C语言实现顺序表的直接插入

回复:
user: user-1
content: 网上应该有很多这样的答案，或者类似的答案。建议自己动手找一下，然后改一改。

user: user-2
content: 实现两个查找函数，一个轮训，一个二分法。 插入移位用一个函数实现，1,2 就都完成了

user: user-3
content: 直接插入排序就是從無序表中依次取出元素，插入到有序表中，關鍵有2：查找在有序表中的位置，有序表移位。 查找位置最簡單的就是從頭到尾了，移位則一般是位置之後的元素後移，其實就是從尾到頭依次複製到后一個位置。以下代碼演示了這種方式：  void insert_sort(int a[], int n) 21 { 22     int i, j, k; 23  24     for (i = 1; i < n; i++) 25     { 26         //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置 27         for (j = i - 1; j >= 0; j--) 28             if (a[j] < a[i]) 29                 break; 30  31         //如找到了一个合适的位置 32         if (j != i - 1) 33         { 34             //将比a[i]大的数据向后移 35             int temp = a[i]; 36             for (k = i - 1; k > j; k--) 37                 a[k + 1] = a[k]; 38             //将a[i]放到正确位置上 39             a[k + 1] = temp; 40         } 41     } 42 }  但是這個查找效率比較低。問題2是折半查找，即每次對比綫性表的中間位置，以確定查找目標是在前一半還是後一半，時間效率比較高。於是這個代碼中的查找部分可以簡化爲調用Search函數，而在該函數中實現折半算法。

user: user-0
content: 引用 1 楼 老马何以识途的回复:直接插入排序就是從無序表中依次取出元素，插入到有序表中，關鍵有2：查找在有序表中的位置，有序表移位。 查找位置最簡單的就是從頭到尾了，移位則一般是位置之後的元素後移，其實就是從尾到頭依次複製到后一個位置。以下代碼演示了這種方式：  void insert_sort(int a[], int n) 21 { 22     int i, j, k; 23  24     for (i = 1; i < n; i++) 25     { 26         //为a[i]在前面的a[0...i-1]有序区间中找一个合适的位置 27         for (j = i - 1; j >= 0; j--) 28             if (a[j] < a[i]) 29                 break; 30  31         //如找到了一个合适的位置 32         if (j != i - 1) 33         { 34             //将比a[i]大的数据向后移 35             int temp = a[i]; 36             for (k = i - 1; k > j; k--) 37                 a[k + 1] = a[k]; 38             //将a[i]放到正确位置上 39             a[k + 1] = temp; 40         } 41     } 42 }  但是這個查找效率比較低。問題2是折半查找，即每次對比綫性表的中間位置，以確定查找目標是在前一半還是後一半，時間效率比較高。於是這個代碼中的查找部分可以簡化爲調用Search函數，而在該函數中實現折半算法。 我说的是针对上述结构的插入排序，数组的代码我懂，我就想看看针对上述代码的格式
user-0 提问:      a[j]为何不能得到倒叙的c[i]

回复:
user: user-1
content: 楼上解释的很清楚

user: user-2
content: memcpy(c,str1,100); 这里有问题， C里存贮的是值为123的一个字符， 你可以看一下中间值。  char c[100];  //memcpy(c,str1,100);  itoa(m_num1, c, 10);     // 用这个， 别用CString了

user: user-3
content: char a[100]={0};          char b[100]={0}；         char m[100]={0}; char n[100]={0};
user-0 提问: C语言连接sql server的方法

回复:
user: user-1
content: C/C++可以通过ADO方式连，网上资料很多，还是挺方便的。

user: user-0
content: 刚刚查了一下资料，又说是C语言通过ODBC连接sql server 数据库，然后再通过嵌入式sql操作数据库。 有点晕乎了
user-0 提问: 为什么if(flag=1)执行了if()语句，if(flag==1)反而没有计算if()里的语句

回复:
user: user-1
content: 优先级，=表赋值，==表关系

user: user-2
content: flag==1才是判断语句，是不是flag不是整数

user: user-3
content: “=”是赋值运算符，“==”是逻辑运算符

user: user-4
content: if(flag=1 && ...) ==== if(1 && ...) 。日常写代码过程中，为避免发生类似错误，一般将常量放至左边 ----> if(1 == flag && ...)

user: user-5
content: 在if判断前你flag 为0，如果是flag = 1, 这个是赋值语句，该语句返回TRUE,并且flag修改为1， 如果 flag == 1, 则进行判断，因为前面flag为0，所以返回FALSE，同事flag不改变。

user: user-6
content: flag=1的表达式值为1，也就是表达式恒为真，没有起到判断的作用

user: user-7
content: if (flag = 1) 这是一条赋值加判断语句，先将flag赋值为1，然后判断flag的真假，既然是1，那肯定是真，因此不论上面的结果flag为0，还是为1，sum = sum+1；是必执行的。

user: user-8
content: =是赋值，==是判断两边内容是否相等不能计算的

user: user-9
content: 这种问题加几个printf就能自己搞懂，你问别人反而印象不深，时间长就忘了

user: user-10
content: flag=1是个赋值语句。。。

user: user-11
content: 引用 13 楼 weixin_43794582的回复:额，看来我们大学老师确实教的好。 非计算机专业只学c，就知道在c里，非零即一

user: user-11
content: 额，看来我们大学老师确实教的好。

user: user-12
content: 一直以为优先级&&和||优先级最低了，没想到=这些赋值操作更低 所以更正一下 if (flag = 1 && month > 2) 等值于 if (flag = (1 && month > 2)) 等值于 flag = (1 && month > 2); if (flag) 还是判断flag是否为0

user: user-12
content: 首先：2018年不是闰年，所以 if(year%400==0 || (year%4==0 && year%100!=0))     {          flag=1;     }     else         flag=0; 明显可以知道flag的值为0 接着: if (flag == 1 && month > 2) flag明显不等于1，所以判断通不过，结果不+1 至于： if (flag = 1 && month > 2) 这样写的话flag = 1是一个赋值操作，可以等价于 flag = 1; if(flag) 只要flag的值不为0，if语句都能通过 还有： 操作符&&或者||之类的必然是最后执行的，所以关优先级屁事 优先级高的操作符是&和|，不是&&和||

user: user-13
content: 优先级，，还有==与=意义不一样，优先级也不一样。多试几遍就理解了。

user: user-14
content: C没有布尔类型，所以一般会使用整数标识，0为假，1为真(实际只要是非0都是真)。 int flag; //判断标识，0为假，1为真 if(flag) 这种写法更简洁，当flag为1时才执行，flag为0时不执行，这样可以避免赋值=和判断符号==混用。 if(flag)等价于if(flag == 1)的情况，这里假定了flag要么是0，要么是1的情况 为了避免=和==混用，可以将if(flag == 1)改写为if(1 == flag) 这样如果将==写成=，编译器会直接报错 另外，if(flag = 1)的执行顺序是，先flag = 1;再if(flag); 关于&&，搞清楚基本用法，1&&1=1,1&&0=0,0&&1=0;0&&0=0。这里的1可以是数字，也可以是表达式，最好用(表达式)；  关于你的疑惑，你可以判断添加printf()语句查看。 if(flag = 1){} printf("%d\n", flag); if(flag == 1){} printf("%d\n", flag);  在此之前，你可以将flag分别赋值为0或1。  我个人比较倾向于if(flag)类型语句。  if(flag1 && flag2)   if((flag1 || flag2) && (flag3 || flag4)) 类似的条件判断

user: user-15
content: 应该就是楼上所说的优先级问题 ！ > 算术运算符 > 关系运算。&符 > && > || > 赋值运算符 如果是flag=1的话，他会先看“1&&month>2”结果是1“真”，然后再把1（真）赋值给flag，所以之前一步的flag是1或0都没有用了，只要二月以后就都会+1，楼主可以输出flag的值看看变化

user: user-16
content: 优先级问题，&&两边加括号

user: user-17
content: flag=1这个表达式的值为1
user-0 提问: 为什么第二次calloc不分配物理内存？

回复:
user: user-1
content: Linux不是开源的吗？

user: user-0
content: 引用 5 楼 amei113 的回复:Linux 下 calloc 分配内存时，并没有分配实际物理内存，只是分配了虚拟内存，这些虚拟内存在页表中对应同一个物理地址，且标记为只读。当读calloc分配的地址时，读到的是同一个物理地址，当写calloc的分配的地址时，发生page fault,然后重新映射一个物理地址，这个时候才真正分了物理地址。这段代码两个calloc分配的地址，都没写操作，按理物理内存是基本没用到，但你说第一次分配占用了1g物理内存，我觉得还要再实验确定一下  从top命令看是这样的~~

user: user-0
content: 引用 4 楼 死国之神 的回复:一次申请1G的连续空间，是一件比较困难的事情，判断一下返回值，为NULL 则是操作系统没有批准你的申请，故而没有给你分配内存。  Windows和Linux分别加了指针判断，两次calloc的内存都不做任何访问，结果如下：  Windows下，根据任务管理器，两次calloc都不会分配物理内存，两次calloc貌似都会根据实际内存是否足够决定返回结果：     我机器内存是12G的，两次calloc分配8G的空间的话，显示都返回非空指针；两次9G，则第一次成功、第二次失败；两次10G，则都失败。。。 Linux下测试，根据top命令结果，第一次calloc如果实际内存足够，则分配物理内存，否则分配失败返回空指针；第二次calloc不分配物理内存，但是会根据实际内存是否足够，返回非空指针或空指针。

user: user-2
content: Linux 下 calloc 分配内存时，并没有分配实际物理内存，只是分配了虚拟内存，这些虚拟内存在页表中对应同一个物理地址，且标记为只读。当读calloc分配的地址时，读到的是同一个物理地址，当写calloc的分配的地址时，发生page fault,然后重新映射一个物理地址，这个时候才真正分了物理地址。这段代码两个calloc分配的地址，都没写操作，按理物理内存是基本没用到，但你说第一次分配占用了1g物理内存，我觉得还要再实验确定一下

user: user-3
content: Linux 不是一个保守的操作系统，你申请了多少内存，并不意味着你会用到多少内存，所以系统也不会立即给你分配多少内存，而且当所有程序申请的内存超过最大物理内存和swap的总和后，Linux还是会允许别的程序申请内存，所以Linux能够用最少的资源干最多的事情，这也是Linux设计的初衷。 Windows是一个保守的操作系统，你申请了多少内存，不管你用不用得到，系统都会立即给你分配，且当所有内存已经到达最大物理内存和虚拟内存总和后，Windows不会再允许别的程序申请内存。

user: user-3
content: 一次申请1G的连续空间，是一件比较困难的事情，判断一下返回值，为NULL 则是操作系统没有批准你的申请，故而没有给你分配内存。

user: user-3
content: 引用 2 楼 zcphoenix 的回复:[quote=引用 1 楼 死国之神 的回复:] Linux 不是一个保守的操作系统，你申请了多少内存，并不意味着你会用到多少内存，所以系统也不会立即给你分配多少内存，而且当所有程序申请的内存超过最大物理内存和swap的总和后，Linux还是会允许别的程序申请内存，所以Linux能够用最少的资源干最多的事情，这也是Linux设计的初衷。 Windows是一个保守的操作系统，你申请了多少内存，不管你用不用得到，系统都会立即给你分配，且当所有内存已经到达最大物理内存和虚拟内存总和后，Windows不会再允许别的程序申请内存。  我在Windows下做了同样的测试，和Linux结果确实不一样，但是Windows不是立即分配物理内存，而是连续两次“calloc”都不分配物理内存~~ 此外，还有一个不同点是，Linux对于“calloc”的内存进行读操作时，依然不分配物理内存；但是Windows在对“calloc”的内存进行读操作时，则分配物理内存了，而且是“按需分配”~~[/quote] 判断一下返回值

user: user-0
content: 引用 1 楼 死国之神 的回复:Linux 不是一个保守的操作系统，你申请了多少内存，并不意味着你会用到多少内存，所以系统也不会立即给你分配多少内存，而且当所有程序申请的内存超过最大物理内存和swap的总和后，Linux还是会允许别的程序申请内存，所以Linux能够用最少的资源干最多的事情，这也是Linux设计的初衷。 Windows是一个保守的操作系统，你申请了多少内存，不管你用不用得到，系统都会立即给你分配，且当所有内存已经到达最大物理内存和虚拟内存总和后，Windows不会再允许别的程序申请内存。  我在Windows下做了同样的测试，和Linux结果确实不一样，但是Windows不是立即分配物理内存，而是连续两次“calloc”都不分配物理内存~~ 此外，还有一个不同点是，Linux对于“calloc”的内存进行读操作时，依然不分配物理内存；但是Windows在对“calloc”的内存进行读操作时，则分配物理内存了，而且是“按需分配”~~
user-0 提问: PAT6-2基础习题

回复:
user: user-1
content: n维数组下标从0至n-1

user: user-2
content: 一般来说，数组越界会引发未知的行为，数组下标从0开始，到n-1结束，这里应该是引发你程序崩溃的原因。

user: user-3
content: 很可能是楼上说的原因，需要确认下你数组的定义，到底多少元素。 pow函数本身应该没啥问题。
user-0 提问: 调用函数改变了地址后为什么还能将改变的地址返回给主函数

回复:
user: user-1
content: swapp只是修改了形参指针的地址值，而没有修改实参的地址值。参数的传递是实参向形参传递，形参是函数内部的局部变量。

user: user-2
content: void SortString(char *ptr[], int n); void swapp(int *pa, int *pb);  两者的区别在于： SortString传入的ptr是一个指针数组，在SortString内部进行ptr[i]/ptr[j] 做赋值操作，相当于对这个数组进行了修改，这跟以下例子： void modify_array_data(int data[5]) { 	a[0] = 0; 	a[1] = 1; 	.... } modify_array_data调用： int a[5] = {0}; modify_array_data(a); 函数返回后a数组的值自然就改变了；这里的道理是一样的。  而swapp内部仅仅是对pa/pb（局部的指针变量）进行操作，并不是对*pa / *pb操作，自然函数内部的运算对外面是没有影响的。  重点理解C语言的【值传递】

user: user-3
content: pa,pb,temp都是局部变量，返回后就被释放，对调用函数没任何影响。这里不管字符串还是其他类型，都不会对调用函数有影响

user: user-4
content: 简单说，这个子函数不是返回而是执行

user: user-5
content: 理解和讨论之前请先学会如何观察！  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。
user-0 提问: 结构体指针输出问题

回复:
user: user-1
content: 你的指针mes没有初始化，运行时一般会出错（如闪退）。使用指针前，应该先初始化。 初始化指针，可以使其指向相应变量的地址，也可以动态申请内存的方式。 下面在手机上用易历知食软件里的微C程序设计来演示修改后的代码，供参考。 手机上修改后的代码如下图所示：  手机上运行该程序的效果如下图所示：

user: user-2
content: 楼上正解！！

user: user-3
content: 问题很多，学好基础吧

user: user-4
content: 如果只支持c语言，第一种方法需要改用2楼的写法。  引用 7 楼 @风轻云淡_ 的回复: MES* mes = new MES; //不要忘了用delete mes释放  mes->fromIP = a; mes->toIP = b; mes->Con = c; mes->En = d; 或者 MES mes;   mes.fromIP = a; mes.toIP = b; mes.Con = c; mes.En = d;  还有一个你的结构体定义应该在main函数上面，不然会报使用未定义类型错误。

user: user-4
content: MES* mes = new MES; //不要忘了用delete mes释放  mes->fromIP = a; mes->toIP = b; mes->Con = c; mes->En = d; 或者 MES mes;   mes.fromIP = a; mes.toIP = b; mes.Con = c; mes.En = d;  还有一个你的结构体定义应该在main函数上面，不然会报使用未定义类型错误。

user: user-5
content: 要么给指针分配内存，要么不用指针： MES mes;   mes.fromIP = a;

user: user-6
content: 兄弟，你这是指向结构体的指针吗

user: user-7
content: 没有定义 应该会出现段错误

user: user-8
content: mes變量都沒分配内存，怎麽可以操作呢。

user: user-9
content: mes是野指针，这样操作很容易出现段错误。 建议使用MES mes; 当然下面的就是->改成. 要么使用 MES *mes = (MES *)malloc(sizeof(MES));

user: user-10
content: mes 野指针  不能->
user-0 提问: 【求解答】关于.c和.cpp的区别

回复:
user: user-0
content: 引用 1 楼 user-1的回复:block(se)  int se; 这样的格式是最老的c的格式，应该比这个论坛上99%的人年纪都大了，实在是没有必要再写这样格式的代码了 不用管什么原因了，就按新格式写就可以了 你应该不会遇上只接受老格式的编译器 也就是说这种是老格式对吧？可为什么编译器不接受呢？就像我说的，.cpp应该能接受所有c特性吧，可.cpp确实是无法编译

user: user-1
content: block(se)  int se; 这样的格式是最老的c的格式，应该比这个论坛上99%的人年纪都大了，实在是没有必要再写这样格式的代码了 不用管什么原因了，就按新格式写就可以了 你应该不会遇上只接受老格式的编译器
user-0 提问: C语言控制台无法打开包括文件问题。

回复:
user: user-1
content: 附加包含目录就行

user: user-2
content: 这种情况就是找不到文件啊，如果确实存在参考2楼做法

user: user-3
content: 看看是否在cspider下存在spider.h这个文件，没有的话建立一个cspider这个文件夹，把spider.h添加进去。然后把文件夹放在.sln的目录

user: user-4
content: 项目->属性->配置属性->C/C++->附加包含目录
user-0 提问: c语言结构体的定义

回复:
user: user-1
content: C 语言需要加上struct，除非加上typedef，也就是第二种写法

user: user-0
content: 引用 4 楼 自信男孩 的回复:C 语言需要加上struct，除非加上typedef，也就是第二种写法 谢谢

user: user-0
content: 引用 2 楼 霸气侧漏de影子 的回复:#define MAXSIZE 100 struct ElementType {     int n;     char a, b, c; };   struct Stack {    struct ElementType data[MAXSIZE];     int top; }; 前面不用typedef就在后面把红字部分加上 谢谢，我懂了 c是这样的

user: user-0
content: 引用 1 楼 focuslight 的回复:ElementType未定义---------应该不会出这个提示， 你用的什么IDE  vs

user: user-2
content: 你前面定义的是struct ElementType，不是ElementType； 第二次你用typedef把某个结构体定义成了ElementType，当然也就没报错。

user: user-3
content: #define MAXSIZE 100 struct ElementType {     int n;     char a, b, c; };  struct Stack { struct ElementType data[MAXSIZE];     int top; }; 前面不用typedef就在后面把红字部分加上

user: user-4
content: ElementType未定义---------应该不会出这个提示， 你用的什么IDE
user-0 提问: warning C4047: '=' : 'char ' differs in levels of indirection from 'void *'

回复:
user: user-1
content: token[m++]=NULL; 将指针赋值给字符了

user: user-2
content: 百度warning 4047就能知道告警的意思 你这个问题就是有个地方char类型的变量赋值为void *了 告警一般不会影响到实际运行，但初学者建议都消除掉

user: user-3
content: token[m++]=NULL; 这个怎么理解呢？ 这个token是一个字符数组，用NULL赋值给字符？  scaner(); 函数的返回值类型是否要加一下？即使没有返回值，那也应该用void的。定义也是。 case '\\': 注意转义符  还需要继续努力呢

user: user-0
content: 这个是个词法分析程序，老师要求实现文件的读入和读出 但是不知道怎么调用后面的读入和读出类 希望大神指点
user-0 提问: 三维数组问题

回复:
user: user-1
content: 3×5 不等于 2×3×5

user: user-0
content: 引用 6 楼 真相重于对错 的回复:[quote=引用 5 楼 flcnrcn 的回复:] [quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 flcnrcn 的回复:] [quote=引用 2 楼 霸气侧漏de影子的回复:]int arr[2][3][5]，定义一个int类型的三维数组，arr即为该三维数组的首地址； int (*q)[2][3][5]，优先级为先（）后[ ]，所以是定义一个指针q，该指针指向一个维度为三维的int数组; q=&arr，则使q指向了arr这个数组，所以最后打印q和arr都是打印同一个三维数组的首地址。 数组名代表的是首元素的地址，很明显首元素是个二维数组（正如二维数组的首元素是个一维数组一样）不是三维，所以arr和&arr应该是不同的地址才对。[/quote] 建议实践一下，猜测是解决不了问题的。  &arr和arr只是类型不一样，即&arr + 1和arr + 1偏移的长度是不一样的，但地址是一样的。[/quote]  您好！ 既然地址一样，那存在如下函数调用： void function（int  a[2][3][5]）； .............................. int arr[2][3][5] ={....}; int (*q)[2][3][5] =&arr; function(*q);----问题：既然地址一样为什么这里的实参不用q而用*q呢，这个*q的值是什么呢？ [/quote] 类型不一样，一个是指向数组的指针，一个是数组。所以不能替换 ×q对这个指针解引用，是数组， [/quote] 您好！数组做函数参数时都被编译器解释为指针了。那定义如下指针：int （*p）[3][5] = arr; function(p);这里的实参为什么有p不用*p呢。

user: user-2
content: 数组和指针在取地址符下操作不一样的。 定义int a[x] ，打印 a, &a是一样的。 定义int *a, 打印a , &a是不一样的。 作为参数传递时就要注意了

user: user-1
content: 引用 5 楼 flcnrcn 的回复:[quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 flcnrcn 的回复:] [quote=引用 2 楼 霸气侧漏de影子的回复:]int arr[2][3][5]，定义一个int类型的三维数组，arr即为该三维数组的首地址； int (*q)[2][3][5]，优先级为先（）后[ ]，所以是定义一个指针q，该指针指向一个维度为三维的int数组; q=&arr，则使q指向了arr这个数组，所以最后打印q和arr都是打印同一个三维数组的首地址。 数组名代表的是首元素的地址，很明显首元素是个二维数组（正如二维数组的首元素是个一维数组一样）不是三维，所以arr和&arr应该是不同的地址才对。[/quote] 建议实践一下，猜测是解决不了问题的。  &arr和arr只是类型不一样，即&arr + 1和arr + 1偏移的长度是不一样的，但地址是一样的。[/quote]  您好！ 既然地址一样，那存在如下函数调用： void function（int  a[2][3][5]）； .............................. int arr[2][3][5] ={....}; int (*q)[2][3][5] =&arr; function(*q);----问题：既然地址一样为什么这里的实参不用q而用*q呢，这个*q的值是什么呢？ [/quote] 类型不一样，一个是指向数组的指针，一个是数组。所以不能替换 ×q对这个指针解引用，是数组，

user: user-0
content: 引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 flcnrcn 的回复:] [quote=引用 2 楼 霸气侧漏de影子的回复:]int arr[2][3][5]，定义一个int类型的三维数组，arr即为该三维数组的首地址； int (*q)[2][3][5]，优先级为先（）后[ ]，所以是定义一个指针q，该指针指向一个维度为三维的int数组; q=&arr，则使q指向了arr这个数组，所以最后打印q和arr都是打印同一个三维数组的首地址。 数组名代表的是首元素的地址，很明显首元素是个二维数组（正如二维数组的首元素是个一维数组一样）不是三维，所以arr和&arr应该是不同的地址才对。[/quote] 建议实践一下，猜测是解决不了问题的。  &arr和arr只是类型不一样，即&arr + 1和arr + 1偏移的长度是不一样的，但地址是一样的。[/quote]  您好！ 既然地址一样，那存在如下函数调用： void function（int  a[2][3][5]）； .............................. int arr[2][3][5] ={....}; int (*q)[2][3][5] =&arr; function(*q);----问题：既然地址一样为什么这里的实参不用q而用*q呢，这个*q的值是什么呢？

user: user-3
content: 引用 3 楼 flcnrcn 的回复:[quote=引用 2 楼 霸气侧漏de影子的回复:]int arr[2][3][5]，定义一个int类型的三维数组，arr即为该三维数组的首地址； int (*q)[2][3][5]，优先级为先（）后[ ]，所以是定义一个指针q，该指针指向一个维度为三维的int数组; q=&arr，则使q指向了arr这个数组，所以最后打印q和arr都是打印同一个三维数组的首地址。 数组名代表的是首元素的地址，很明显首元素是个二维数组（正如二维数组的首元素是个一维数组一样）不是三维，所以arr和&arr应该是不同的地址才对。[/quote] 建议实践一下，猜测是解决不了问题的。  &arr和arr只是类型不一样，即&arr + 1和arr + 1偏移的长度是不一样的，但地址是一样的。

user: user-0
content: 引用 2 楼 霸气侧漏de影子的回复:int arr[2][3][5]，定义一个int类型的三维数组，arr即为该三维数组的首地址； int (*q)[2][3][5]，优先级为先（）后[ ]，所以是定义一个指针q，该指针指向一个维度为三维的int数组; q=&arr，则使q指向了arr这个数组，所以最后打印q和arr都是打印同一个三维数组的首地址。 数组名代表的是首元素的地址，很明显首元素是个二维数组（正如二维数组的首元素是个一维数组一样）不是三维，所以arr和&arr应该是不同的地址才对。

user: user-4
content: int arr[2][3][5]，定义一个int类型的三维数组，arr即为该三维数组的首地址； int (*q)[2][3][5]，优先级为先（）后[ ]，所以是定义一个指针q，该指针指向一个维度为三维的int数组; q=&arr，则使q指向了arr这个数组，所以最后打印q和arr都是打印同一个三维数组的首地址。

user: user-3
content: 建议将arr和&arr的地址打出来，就知道为什么arr和q的地址为什么一样了。&arr是数组的地址，而数组名就是数组的首地址。
user-0 提问: 文本输入

回复:
user: user-1
content: 在我的IDE上运行了你的程序，能写入

user: user-2
content: 引用 6 楼 Slzde_sub 的回复:[quote=引用 5 楼 lin5161678 的回复:] [quote=引用 1 楼 Slzde_sub 的回复:] wt是什么。。第一次见到  wb吧。。  你得判断fp是否被正确赋值了呀。。t 表示文本模式打开 可以省略 写出来也不是问题 wb是二进制模式  你别乱改呀[/quote]   改成wb  换成这句写入看看  fwrite(&n,1,4,fp);[/quote]回复错人了? 另外 你的修改后的代码 和 题主原先的代码 行为是不一样的 题主原先的代码 相当于转换为字符串写入文件 你的代码完全是另一回事

user: user-2
content: 引用 1 楼 Slzde_sub 的回复:wt是什么。。第一次见到  wb吧。。  你得判断fp是否被正确赋值了呀。。t 表示文本模式打开 可以省略 写出来也不是问题 wb是二进制模式  你别乱改呀

user: user-3
content: 我怀疑你这程序执行完了没。。。。 中间搞个pause 是几个意思？

user: user-3
content: 我还是怀疑抄错程序了，把pause放最后return前应该没啥问题的。

user: user-4
content: 试了你的代码，能写入文件。按照你的代码逻辑，程序运行起来需要按一次回车，然后输入内容，再回车。而且要注意，你写的是%d，输入字母是写入不进去的，写入一个数字就能看到效果

user: user-0
content: 引用 2 楼 自信男孩 的回复:建议判断一下fopen的返回值，即fp是否为NULL，即判断文件是否打开成功。  我看过返回值是7426696，

user: user-5
content: 建议判断一下fopen的返回值，即fp是否为NULL，即判断文件是否打开成功。
user-0 提问: C语言值传递问题

回复:
user: user-1
content: 引用 楼主 我不是大神_ 的回复:问题如下： 现有三个函数，  //返回会话句柄   void* connect_();  //handle会话句柄 int disconnect_(void *handle);   //重连会话句柄， //handle  输入/输出 int  reconnect_(void *handle);   在不做任何改变的情况下， reconnect_(void *handle);如何做到将新的会话句柄通过handle回传出来？一直没想通，connect函数返回的就是void *的句柄，为什么reconnect_函数参数不是void **  ，使用void *能够回传新的句柄出来？该咋处理谢谢！ 试一下，把一个NULL 传给reconnect函数不就清楚了

user: user-2
content: 那就用传入传出参数，即定义一个会话句柄变量，注意是普通变量，而不是指针变量。然后传入到reconnect_中，这样这个变量（实参）就是传入传出参数的实参了。

user: user-0
content: 引用 5 楼 真相重于对错 的回复:[quote=引用 4 楼 niiiloc 的回复:] 接口定义是不太合理啊，我理解reconnet应该返回void *比较好一点 reconnect字面意思就是重新连接，为何要返回一个新的，我理解只不过把一个已经关闭的资源，传进去，重新而已。[/quote]  这位兄弟理解是对的，我陷入误区了。void *handle就是入参不存在传出的情况，三个函数在内部维护一个连接的结构，所有的void *handle都是形参，可以看做内部维护的结构体的地址，这样就不存在重新连接时，需要传新的handle出来的情况，只用在内部维护连接的结构即可。感谢各位指导！

user: user-1
content: 引用 4 楼 niiiloc 的回复:接口定义是不太合理啊，我理解reconnet应该返回void *比较好一点 reconnect字面意思就是重新连接，为何要返回一个新的，我理解只不过把一个已经关闭的资源，传进去，重新而已。

user: user-3
content: 接口定义是不太合理啊，我理解reconnet应该返回void *比较好一点

user: user-0
content: 引用 1 楼 自信男孩 的回复:那就用传入传出参数，即定义一个会话句柄变量，注意是普通变量，而不是指针变量。然后传入到reconnect_中，这样这个变量（实参）就是传入传出参数的实参了。  重新定义个输入输出变量放到reconnect中确实可以回传的，但是这个参数无法去接收connect返回的void *呀，除非将connect的返回强转为int；定义个int 变量，将connect的返回强转为int，但是这样很别扭啊。所以这个函数的定义很别扭？？？
user-0 提问: Linux C大神们帮忙 erno 11的问题现象

回复:
user: user-1
content: Linux - 非阻塞socket编程处理EAGAIN错误 在linux进行非阻塞的socket接收数据时经常出现Resource temporarily unavailable，errno代码为11(EAGAIN)，这是什么意思？ 这表明你在非阻塞模式下调用了阻塞操作，在该操作没有完成就返回这个错误，这个错误不会破坏socket的同步，不用管它，下次循环接着recv就可以。 对非阻塞socket而言，EAGAIN不是一种错误。在VxWorks和Windows上，EAGAIN的名字叫做EWOULDBLOCK。 另外，如果出现EINTR即errno为4，错误描述Interrupted system call，操作也应该继续。 最后，如果recv的返回值为0，那表明连接已经断开，我们的接收操作也应该结束。
user-0 提问: 请问VC下FILE结构体中_flag的值里有一个宏定义_IOSTRG有人知道是什么意思吗？

回复:
user: user-1
content: 艺海拾贝

user: user-1
content: VC6EN http://pan.baidu.com/s/1jImOtAe

user: user-0
content: 引用 8 楼 赵4老师 的回复:VC6EN http://pan.baidu.com/s/1jImOtAe 好东西呀！非常感谢赵老师！_IOSTRG的问题已经搞清楚了。请问赵老师是从哪里找到这个的？

user: user-0
content: 引用 7 楼 zjq9931 的回复:http://computer-programming-forum.com/47-c-language/0ca9fef414ff0312.htm 这里有一段，说是用于非文件的，字符串模拟的伪流（大于32K）会用到。例如sprintf,scanf。 和缓冲区默认32K有关。 我看了后不是很懂，我自己做过测试，单独改变这个位后，原本fgetc读到文件尾后就不再读了，即记录剩余字节个数的_cnt一直为0，但_IOSTRG位置1后，读完文件后_cnt开始往负值增加。所以我看了你发的这个帖子不是很明白，光是这个“假流”都不明所以，更别说与我的实验结果似乎毫无关系。不过帖子里说的跟fclose相关的说法比较贴近。

user: user-2
content: http://computer-programming-forum.com/47-c-language/0ca9fef414ff0312.htm 这里有一段，说是用于非文件的，字符串模拟的伪流（大于32K）会用到。例如sprintf,scanf。 和缓冲区默认32K有关。

user: user-1
content: 提醒，FILE处理相关函数都是开源的。

user: user-2
content: 引用 楼主 六道佩恩 的回复:经测试发现，如果此位为0，那么读到文件尾后_cnt一直为0，但如果该位为1，那么读到文件尾后再读cnt会变成-1、 我在MSDN中没有找到这个啊，在fcntl.h中也没有找到这个值，你是在哪个文件里面找到的？

user: user-0
content: 引用 5 楼 赵4老师 的回复:比如： C:\glibc-2.25\stdlib\abs.c C:\Program Files\Borland\CBuilder6\Source\Rtl\Source\math\abs.c C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\ABS.C C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\abs.c C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\abs.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\abs.c 谢谢。不过我下了glibc发现是linux下是实现方式，不是windows下的，FILE的结构不一样。VS我有安装，在VC98目录下没找到CRT目录，通过脚本搜索文本也没找到有标准库的实现代码。求支招

user: user-1
content: 比如： C:\glibc-2.25\stdlib\abs.c C:\Program Files\Borland\CBuilder6\Source\Rtl\Source\math\abs.c C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\ABS.C C:\Program Files\Microsoft Visual Studio 8\VC\crt\src\abs.c C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\abs.c C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\abs.c

user: user-0
content: 引用 2 楼 赵4老师 的回复:提醒，FILE处理相关函数都是开源的。 请问在哪里能看到这些开源代码？

user: user-0
content: 引用 1 楼 zjq9931 的回复:[quote=引用 楼主 六道佩恩 的回复:] 经测试发现，如果此位为0，那么读到文件尾后_cnt一直为0，但如果该位为1，那么读到文件尾后再读cnt会变成-1、 我在MSDN中没有找到这个啊，在fcntl.h中也没有找到这个值，你是在哪个文件里面找到的？[/quote] stdio.h
user-0 提问: 在Microsoft VS中遇到的一个问题

回复:
user: user-1
content: 选中后不能enter要tab

user: user-2
content: 插件有问题吧，我遇到过必选使用上下箭头选中才行，不然就会回车的情况，和楼主差不多，选一下就行了

user: user-3
content: 关于自动补齐插件？

user: user-4
content: 帮结帖＋蹭分

user: user-0
content: 已经解决了！
user-0 提问: C语言中字符串与数组的问题

回复:
user: user-1
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-2
content: 进来看看。。

user: user-3
content: 首先我在输入aaa时，str[0:3]都存这97，在我第二次输入bbb时，str[1:4]都存的是98，同理在第三第四次时输入也存着；只是在第三次输入时，电脑将你的最后一个c直接存入str[5]也就是访问了数组外的第一个地址，如果我访问了不该访问的地方，则这一位会保持不变（保持原有的数据）。在我申请str[5]时我只是申请了5个长度，没说我要用多长。打印时，我打印的是str[0:(我输入并留下的多少)]，若我访问了不可访问的地址则会有一定的乱码

user: user-4
content: C 语言中并不存在字符串这个数据类型，而是使用字符数组来保存字符串。那么，字符数组就一定是字符串吗？  对于这个问题，大多教科书中的回答是“是”。其实不然，字符数组和字符串是完全不相同的两个概念，千万不要混淆。分析如下所示的示例代码。 #include <stdio.h> #include <string.h> int main(void) {     /*字符数组赋初值*/     char cArr[] = {'I','L','O','V','E','C'};     /*字符串赋初值*/     char sArr[] = "ILOVEC";     /*用sizeof（）求长度*/     printf("cArr的长度=%d\n", sizeof(cArr));     printf("sArr的长度=%d\n", sizeof(sArr));     /*用strlen（）求长度*/     printf("cArr的长度=%d\n", strlen(cArr));     printf("sArr的长度=%d\n", strlen(sArr));     /*用printf的%s打印内容*/     printf("cArr的内容=%s\n", cArr);     printf("sArr的内容=%s\n", sArr);     return 0; } 运行结果为： cArr的长度=6 sArr的长度=7 cArr的长度=7 sArr的长度=6 cArr的内容=ILOVEC' sArr的内容=ILOVEC 从代码及其运行结果中可以看出如下几点。 首先，从概念上讲，cArr 是一个字符数组，而 sArr 是一个字符串。因此，对于 sArr，编译时会自动在末尾增加一个 null 字符（也就是'\0'，用十六进制表示为 0x00）；而对于 cArr，则不会自动增加任何东西。 记住，这里的 sArr 必须是“char sArr[7]="ILOVEC"”，而不能够是“char sArr[6]="ILOVEC"”。 其次，“sizeof()”运算符求的是字符数组的长度，而不是字符串长度。因此，对于“sizeof(cArr)”，其运行结果为 6；而对于 sizeof(sArr)，其运行结果为 7（之所以为 7，是因为 sArr 是一个字符串，编译时会自动在末尾增加一个 null 字符）。因此，对于以下代码： /*字符数组赋初值*/ char cArr[] = {'I'，'L'，'O'，'V'，'E'，'C'}; /*字符串赋初值*/ char sArr[] = "ILOVEC"; 也可以写成如下等价形式： /*字符数组赋初值*/ char cArr[6] = {'I'，'L'，'O'，'V'，'E'，'C'}; /*字符串赋初值*/ char sArr[7] = "ILOVEC"; 最后，对于字符串 sArr，可以直接使用 printf 的 %s 打印其内容；而对字符数组，很显然使用 printf 的 %s 打印其内容是不合适的。 通过对以上代码的分析，现在我们可以很简单地得出字符数组和字符串二者之间的区别： • 对于字符数组，其长度是固定的，其中任何一个数组元素都可以为 null 字符。因此，字符数组不一定是字符串。 • 对于字符串，它必须以 null 结尾，其后的字符不属于该字符串。字符串一定是字符数组，它是最后一个字符为 null 字符的字符数组。

user: user-5
content: 单个字符用 c%. 输出时候不用取地址符。 另外你这缩进格式。。。。

user: user-6
content: 应该是越界了.%s和%c的区别，建议查一下。  %s是输入字符串，而%c是字符。字符串需要关注一下'\0'  %s输入已经导致越界了

user: user-7
content: 你是想挨个读取字符吧，那样需要将%s改成%c，%s是读取整个字符串

user: user-8
content: 引用 7 楼 qq_42786437的回复:scanf读取单个字符是%c,输出也用%c因为是一个一个字符输出的 而且不用地址符，否则他会

user: user-8
content: scanf读取单个字符是%c,输出也用%c因为是一个一个字符输出的

user: user-9
content: 输入的是 char 单个字符, 而不是 "%s"
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: 綫性表就是字符串咯，字符數組。
user-0 提问: 请问FILE结构体里的_charbuf是做什么用的？我在网上找到两个版本

回复:
user: user-1
content: 提醒：FILE相关处理函数都是开源的。

user: user-0
content: 有人知道_flag去一个宏定义_IOSTRG是什么意思吗？

user: user-0
content: 另外可以问下_tmpfname吗？多次测试都是NULL，不知道什么情况才使用
user-0 提问: 请教一个算法问题，魔法师排队

回复:
user: user-1
content: 才100万个，Long类型（4字节数据）就够了吧。 100万个Long值，才约4MB空间呢。 不过就算 Long Long类型，也才不到8MB吧。  按楼上说的，“从尾部向前扫描”，100万个数据，恐怕要不到0.3秒吧。

user: user-2
content: 就像我刚刚传的那样 如果你想要自己输入 把rand函数改一下就好了

user: user-2
content: #include<iostream> 	#include<stdio.h> 	#include<stdlib.h> 	#include<time.h> 	using namespace std;  	long long a[1000001];  	int main() 	{     	int n,sum = 0;     	srand((unsigned)time(NULL));      	scanf("%d",&n);     	for(int i = 0; i < n; i++) 		{         	a[i]=rand()%100000000+1;     	}     for(int j=n-1;j>0; j--) 	{         for(int i = j-1;i>=0;i--) 		{             if(a[j]>a[i]&&i!=0) 			{                 sum++;             }             else if(i==0)             {	             	sum++;             	j=0;             	break; 			} 			else             {	             	j=j-(j-i)+1;             	break; 			}         }     }     for(int i=0;i<n;i++)     {     	printf("%d\n",a[i]); 	}      printf("%d",sum);     return 0; }

user: user-3
content: 从队尾扫描一次就可以了 从最后一个开始，向前扫描，如果发现有小的就传送，如果发现有大的，则从这个大的开始继续向前扫描

user: user-4
content: 这不是找队伍中最大数问题吗（就是一段一段找最大数） 从头到尾找最大数(因为最大数会把它之前数全扫掉)，然后再从最大数后一位开始再找最大数，一直重复到这个过程直到结束

user: user-5
content: 从队尾开始判断，如果前面小于后面则传送走
user-0 提问: 关于scanf()函数的问题，小菜鸡求帮助~~~

回复:
user: user-1
content: %c处理一个字符，所以只处理了+，没有把2也处理（2也可以做为字符被%c接收），getchar()不只能接收数字符号，键盘的按键回车，方向键，esc都可以接收的到，其他的可以按你的理解。

user: user-2
content: scanf上面已经解释的很清楚了。 读入一行用readline。

user: user-3
content: 完全可以自己写一个例子来测试就明白了

user: user-4
content: 你按了enter键getchar()就会收到回车符。

user: user-5
content: 引用 5 楼 阿惹一号的回复:#include<stdio.h> #include<math.h> void main() { 	double a,b,c,d; 	printf("输入一元二次方程a= , b= , c=\n"); 	scanf("%lf , %lf , %lf",&a,&b,&c); 	d=b*b-4*a*c; 	if(a==0){ 		if(b==0){ 			if(c==0) 				printf("0==0参数对方程无意义!"); 			else 				printf("c!=0方程不成立"); 		} 		else 			printf("x=%.2lf\n",-c/b); 	} 	else { 			if(d>=0){ 				printf("x1=%.2lf\n",(-b+sqrt(d))/(2*a)); 				printf("x1=%.2lf\n",(-b-sqrt(d))/(2*a)); 			} 				else { 					printf("x1=%.2lf+%.2lfi\n",-b/(2*a),sqrt(-d)/(2*a)); 					printf("x1=%.2lf-%.2lfi\n",-b/(2*a),sqrt(-d)/(2*a)); 				} 				} } 请大家看下哈怎么错了，就是求不出方程的根啊。

user: user-5
content: 请大家看下怎么错了，求不出根啊

user: user-5
content: #include<stdio.h> #include<math.h> void main() { 	double a,b,c,d; 	printf("输入一元二次方程a= , b= , c=\n"); 	scanf("%lf , %lf , %lf",&a,&b,&c); 	d=b*b-4*a*c; 	if(a==0){ 		if(b==0){ 			if(c==0) 				printf("0==0参数对方程无意义!"); 			else 				printf("c!=0方程不成立"); 		} 		else 			printf("x=%.2lf\n",-c/b); 	} 	else { 			if(d>=0){ 				printf("x1=%.2lf\n",(-b+sqrt(d))/(2*a)); 				printf("x1=%.2lf\n",(-b-sqrt(d))/(2*a)); 			} 				else { 					printf("x1=%.2lf+%.2lfi\n",-b/(2*a),sqrt(-d)/(2*a)); 					printf("x1=%.2lf-%.2lfi\n",-b/(2*a),sqrt(-d)/(2*a)); 				} 				} }

user: user-6
content: scanf将1存入b，将+存入x,再将2存入a,输出再从将数据从变量对应的内存中取出送往stdout文件中

user: user-7
content: 请判断scanf函数的返回值。

user: user-5
content: %d就对应了数字，然后%c对应字符，你如果是%d%d,那么两个输入数字中间还得用空格断开，而%d和%c本来就是不同类，所以可以一起输入

user: user-8
content: 多个scanf 都是从stdin获取数据的 你输入 1+2 stdin里面的数据就是 1+2\n %d只处理整型的数据  从stdin里面读取了 1  遇到+的时候停止获取数据 用1完成赋值 stdin里面剩下 +2\n 后面的scanf 就从 +2\n获取数据 依此类推