Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: ftell函数返回的是字节个数，为什么返回值类型不是char而是long int？

回复:
user: user-1
content: 。。。。你咋不懂呢。返回的是个数不是字符，你字符咋返回，返回ａｂｃｄ嘛？这个返回的是1234，就相当于让你数数多少个苹果，你返回的结果是多少个而不是其中一个苹果，ｃｈａｒ还是ｉｎｔ字节大小只是他的类型，跟返回的数字没有关系，ｃｈａｒ可以显示字符型的１难道ｉｎｔ就只能从４开始吗？同样的我double float 都是数据类型，我返回多少个，既然是整数那我就用整数类型ｉｎｔ保存数据，因为怕超出。用长整型，ｃｈａｒ是字符型，你返回一个整型数据难道用字符型接收

user: user-2
content: char能够表示多少个字节，一个大文件的大小都会超过char的标识范围。

user: user-3
content: 引用 4 楼 weixin_45906870 的回复:可是一个longint是4个字节，char是一个字节，如果返回值只有一个字节，那岂不是只有四分之一个longint？那返回值是一还是四分之一呢？ 楼主这思维得回到当年的机器码编程的时代了，那个时候每个字节都是珍贵的。现如今这个时代大部分程序员不在乎那点内存。也就是我要保存1，也可能用long long来声明，也就是用8个字节保存一个1。 回到这个问题。ftell的声明是 long ftell(FILE *stream); 也就是不管返回值多少个字节，都用4个字节来保存。至于浪费啥的，上面说了，当今的电脑不在乎这些。

user: user-4
content: 引用 4 楼 weixin_45906870的回复:引用 3 楼 user-4 的回复：[quote=引用 2 楼 weixin_45906870的回复:][quote=引用 1 楼 user-4 的回复：]个数，char表示字符，如果用char来表示数字的话，最多只能表示256，long int可以表示64位数字不懂... ftell得到文件当前指针位置，比如这个文件有1024字节长，假设文件当前指针在1000的位置，那么ftell返回就是1000，跟char没有什么关系[/quote]可是一个longint是4个字节，char是一个字节，如果返回值只有一个字节，那岂不是只有四分之一个longint？那返回值是一还是四分之一呢？[/quote] 当然是1，long int表示是数据类型，返回是几就是几，这个太基础了，你先学习一下基础知识

user: user-0
content: 引用 6 楼 轻箬笠 的回复：[quote=引用 4 楼 weixin_45906870 的回复:] 可是一个longint是4个字节，char是一个字节，如果返回值只有一个字节，那岂不是只有四分之一个longint？那返回值是一还是四分之一呢？ 楼主这思维得回到当年的机器码编程的时代了，那个时候每个字节都是珍贵的。现如今这个时代大部分程序员不在乎那点内存。也就是我要保存1，也可能用long long来声明，也就是用8个字节保存一个1。 回到这个问题。ftell的声明是 long ftell(FILE *stream); 也就是不管返回值多少个字节，都用4个字节来保存。至于浪费啥的，上面说了，当今的电脑不在乎这些。[/quote]一言惊醒梦中人！

user: user-0
content: 引用 3 楼 user-4 的回复：引用 2 楼 weixin_45906870的回复:[quote=引用 1 楼 user-4 的回复：]个数，char表示字符，如果用char来表示数字的话，最多只能表示256，long int可以表示64位数字不懂... ftell得到文件当前指针位置，比如这个文件有1024字节长，假设文件当前指针在1000的位置，那么ftell返回就是1000，跟char没有什么关系[/quote]可是一个longint是4个字节，char是一个字节，如果返回值只有一个字节，那岂不是只有四分之一个longint？那返回值是一还是四分之一呢？

user: user-4
content: 引用 2 楼 weixin_45906870的回复:引用 1 楼 user-4 的回复：个数，char表示字符，如果用char来表示数字的话，最多只能表示256，long int可以表示64位数字不懂... ftell得到文件当前指针位置，比如这个文件有1024字节长，假设文件当前指针在1000的位置，那么ftell返回就是1000，跟char没有什么关系

user: user-0
content: 引用 1 楼 user-4 的回复：个数，char表示字符，如果用char来表示数字的话，最多只能表示256，long int可以表示64位数字不懂...

user: user-4
content: 个数，char表示字符，如果用char来表示数字的话，最多只能表示256，long int可以表示64位数字
user-0 提问: 求大佬帮忙

回复:
user: user-1
content: 后序序列是 左子树，右子树，根 中序是 左子树，根，右子树 你看到这两个排列应该知道根肯定是后续的最后一个，通过这个根可以把中序分割为左子树后序，右子树后序。对左右子树迭代按上述操做，就可以把二叉树画出来。

user: user-2
content: 我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《图解—由两种遍历方式建立二叉树》, 一起来围观吧 https://blog.csdn.net/qq_40946921/article/details/88867838?utm_source=app
user-0 提问: 用户需要录入每名同学的三门成绩和该同学姓名存储在数组中，最终按照平均成绩从高到底排列，并将包括姓名，每门成绩和平均成绩等情况，按照排列顺序输出。

回复:
user: user-0
content: 引用 7 楼 chxchxkkk 的回复：这样的题一般用结构体数组能帮我写一下完整代码么

user: user-1
content: 这样的题一般用结构体数组

user: user-0
content: 引用 5 楼 弦之弈 的回复：用一个结构体数组吧 struct{ char name[]; int score[3]; }student[];完整的代码能帮忙写一下嘛  谢谢了

user: user-2
content: 用一个结构体数组吧 struct{ char name[]; int score[3]; }student[];

user: user-0
content: 引用 1 楼 user-3 的回复：你可以再定义一个二维数组比如name[100][30]来存储姓名求帮帮忙 写一下

user: user-0
content: 我知道定义一个数组 但是 之后就不会了= =

user: user-3
content: 你可以再定义一个二维数组比如name[100][30]来存储姓名
user-0 提问: 求助cannot convert file to const char的bug怎么解决

回复:
user: user-1
content: 请参考《C++中printf()函数的用法10-1》 希望能够帮到你！

user: user-2
content: #include <stdio.h>  //int mian(void) int main(void) {     FILE *fp;      char b[100];     int c;     char a[100];      if((fp=fopen("gifts.dat","r"))==NULL)         printf("ファイルをオープンできません。\n");     else{         while(fscanf(fp,"%s%s%d",a,b,&c)==3){             //printf(fp, "%-10s %-10s %d\n",a,b,c);             printf( "%-10s %-10s %d\n",a,b,c);             //fclose(fp);         }         fclose(fp);     }     getchar ();      return 0; } 供参考～  三个错误，建议对比代码找出自己的问题。

user: user-3
content: printf(fp, "%-10s %-10s %d\n",a,b,c);应该是fprintf吧

user: user-4
content: printf使用错了，第一个参数fp是FILE*类型，第一个必须是char类型
user-0 提问: 求助C语言循环结构实训题

回复:
user: user-1
content: 引用 1 楼 ?Victor.?? 的回复:#include<stdio.h> #include<math.h> int main() {  double e,d,i,l=1.0,x;  scanf("%lf",&x);  for(i=1;i<100;i++)  {   l*=i;   d=pow(x,i);   e+=d/l;  }  printf("%lf",e+1);  return 0; } 供参考~  i<=100这个要改一下

user: user-1
content: #include<stdio.h> #include<math.h> int main() {  double e,d,i,l=1.0,x;  scanf("%lf",&x);  for(i=1;i<100;i++)  {   l*=i;   d=pow(x,i);   e+=d/l;  }  printf("%lf",e+1);  return 0; } 供参考~
user-0 提问: 关于父子进程问题

回复:
user: user-1
content: 那你是怎么执行程序的？是不是打开一个终端，终端默认启动了bash（否则的.bash_profile定义的环境变量被什么读入的）？ 如果是这样，那你的父进程是bash没问题啊
user-0 提问: 问个问题

回复:
user: user-1
content: 加个ｖｏｉｄ就是说明没有参数，不给输参数，函数功能没区别，ｉｎｔ　main()   int main(void)都一样执行ｍａｉｎ一样，只不过加了ｖｏｉｄ如果调用是传参了会报错

user: user-2
content: #include <stdio.h>  void test1() {     printf("test1\n"); }  void test2(void) {     printf("test2\n"); } int main() {     test1(1, 2);   //不会有错误     test2(1, 2);   //报错 参数个数不匹配     return 0; }
user-0 提问: 在线急求C语言编程题 

回复:
user: user-1
content: ｗｈｉｌｅ循环用于不知道具体多少的比较好 定义ｓ＝０，ｆｌｏｇ＝１；ｘ＝３；ｙ＝２； 循环体 ｓ+=(x*flog)/(y*y); flog=-flog; x+=2; y+=2; 这种题不难，主要去找规律，把规律找到，基本都是一个式子求值，然后再改变变量值

user: user-2
content: 用一个for循环，结束条件就是题目中给出的条件
user-0 提问: 求助大佬们  , 有关  ' ++ i '  在调试过程中和在编译运行时结果不同的问题

回复:
user: user-1
content: int i = 0，n=10,x=2; int a[10] = {0}; a[i++] = 1; printf("%d\n\n",i); ----------------------------------------- int i = 0，n=10,x=2; int a[10] = {0}; a[i] = 1; i++; printf("%d\n\n",i); ----------------------------------------- 轮流测试，观察i

user: user-2
content: 把编译结果清楚掉，重新编译一边试试。。。。

user: user-1
content: 你还可以看内存。打开memery。运行一步看一下数组的内存变化。 因为你的数组内的值看上去也不大正常。 --------------------------------------------------------------- 以及，把++单独分离开后，是否还有问题。 找到问题处在哪个地方

user: user-1
content: 【···· ····】一个点代表一个字节。  rax长度为8字节。  在rax中低4个字节为eax。  如果【···· ····】作为rax 其中的····为eax  eax作为rax的一部分

user: user-1
content: 14、15、16行需要跟踪一下 这三行就干一个事情，吧i+1。关键行是15行。 需要调试看一下寄存器，看一下关键值。  第14行执行完后，到第15行时。edx中的值应当为i的值【还未增加时】的结果才正常。 执完第15行，到第16行时。eax中的值应当为i++后的结果才正常。  你可能要在汇编界面运行下这三行。看看右边寄存器展示的值是多少。15行断点看edx【增前的i】，16行断点看eax【增后的i】

user: user-0
content: 我死了，我还没学汇编

user: user-1
content: -0x4(%rbp就是i的值。)

user: user-1
content: 64位的调试运行环境，int是32位的。直觉上以为问题兴许是出在这里了。 这64位程序的汇编没有经验。看的头晕眼花，边查边看，还需要点时间。

user: user-0
content: 引用 7 楼 千梦一生 的回复:[quote=引用 6 楼 好了么 的回复:] [quote=引用 5 楼 千梦一生 的回复:] 确实有点日怪。 那这玩意儿我也不知道，要是能能看汇编还成。 要不你发过来看看汇编指令呢？ 我汇编不是特别熟，但这些个比较简单的指令理论上应该有机会看懂。  断下来之后，应该也能打开汇编调试界面的。 下面是我执行了三步的截图，你在自己电脑上也会出现这种情况吗？ [/quote] 图片已被删除...[/quote] 不好意思哈，我没注意到

user: user-1
content: 引用 6 楼 好了么 的回复:[quote=引用 5 楼 千梦一生 的回复:] 确实有点日怪。 那这玩意儿我也不知道，要是能能看汇编还成。 要不你发过来看看汇编指令呢？ 我汇编不是特别熟，但这些个比较简单的指令理论上应该有机会看懂。  断下来之后，应该也能打开汇编调试界面的。 下面是我执行了三步的截图，你在自己电脑上也会出现这种情况吗？ [/quote] 图片已被删除...

user: user-0
content: 引用 5 楼 千梦一生 的回复:确实有点日怪。 那这玩意儿我也不知道，要是能能看汇编还成。 要不你发过来看看汇编指令呢？ 我汇编不是特别熟，但这些个比较简单的指令理论上应该有机会看懂。  断下来之后，应该也能打开汇编调试界面的。 下面是我执行了三步的截图，你在自己电脑上也会出现这种情况吗？

user: user-1
content: 确实有点日怪。 那这玩意儿我也不知道，要是能能看汇编还成。 要不你发过来看看汇编指令呢？ 我汇编不是特别熟，但这些个比较简单的指令理论上应该有机会看懂。  断下来之后，应该也能打开汇编调试界面的。

user: user-0
content: 引用 2 楼 千梦一生 的回复:[quote=引用 1 楼 千梦一生 的回复:] 啊！这... 你单步跟踪调试，看看啊[/quote] 单步跟踪，每运行一步，那个 i 的值都加1，根本没有按照  a[i ++]那个条件来

user: user-1
content: 这个问题，确实有趣，值得学习。楼主调试后发现什么端倪，请分享一下。

user: user-1
content: 引用 1 楼 千梦一生 的回复:啊！这... 你单步跟踪调试，看看啊

user: user-1
content: 啊！这...
user-0 提问: 请教大佬c语言

回复:
user: user-1
content: printf("%s %s %d",s[i].sub,s[i].name,s[i].time);

user: user-2
content: scanf("%s",&a); ==》》这里a是字符数组，不用取地址符号 if(a==s[i].sub) ==》》字符串不能这样直接比较，要用 if (strcmp(a, s[i].sub) == 0)这样比较
user-0 提问: 求大神看看哪里出错了TAT

回复:
user: user-1
content: 楼主解决了吗

user: user-2
content: if(w[l]=w[k]) 这个应该是你手误了，应该是==

user: user-2
content: 跟踪调试一下，看死在哪里
user-0 提问: 简单的用函数判断是否为素数的程序，运行出来并不能正确判断，求指教

回复:
user: user-0
content: 引用 4 楼 user-1的回复:break后面的代码都不用了，直接返回1，break那里返回0 非常感谢😁😁

user: user-0
content: 引用 4 楼 user-1的回复:break后面的代码都不用了，直接返回1，break那里返回0 嗯嗯嗯   好的

user: user-1
content: break后面的代码都不用了，直接返回1，break那里返回0

user: user-0
content: 引用 1 楼 user-1的回复:break那里直接返回0，表示已经不是素数了 大佬  那直接在我这个上改应该怎么改呢，函数部分不改的情况下

user: user-1
content: bool is_prime(int number) { 	if(number <=2) 		return true; 	for(int i=2;i<number;i++) 	{ 		if(number % i==0) 			return false; 	} 	return true; }

user: user-1
content: break那里直接返回0，表示已经不是素数了
user-0 提问: 求助C语言循环结构实训题

回复:
user: user-1
content: 引用 3 楼 斥包乐氶的 的回复:请教前辈，为什么我没有权限编辑自己的回复 这个论坛好像没提供修改回复的功能吧？所以如果回复错了就再回复一次吧

user: user-2
content: 引用 2 楼 qybao 的回复://问题1 int main() {     double s=0, k=1.0;     int n=1;     while((k=1.0/(n*n))>=0.000001) {         s += k;         n++;     }     printf("%f\n", s);     return 0; }  //问题2 int main() {     double s=0, k=1.0;     int m=1,n=0;     while((k=1.0/m)>=0.000001) {        s += k;        n++;        m += n;     }     printf("%f\n", s);     return 0; }     请教前辈，为什么我没有权限编辑自己的回复

user: user-1
content: //问题1 int main() {     double s=0, k=1.0;     int n=1;     while((k=1.0/(n*n))>=0.000001) {         s += k;         n++;     }     printf("%f\n", s);     return 0; }  //问题2 int main() {     double s=0, k=1.0;     int m=1,n=0;     while((k=1.0/m)>=0.000001) {        s += k;        n++;        m += n;     }     printf("%f\n", s);     return 0; }

user: user-3
content: 题目还是很简单的，给你个思路自己尝试去写写一下 首先，你这不知道ｎ是多少，所以最好就是死循环，循环中判断退出条件 １。可以看到分子固定不变，又是连加，可以知道肯定是sum=sum+1/x;这样的，那么ｘ是多少呢，找规律，是逐个加一的平方，那么是不是可以定义一个变量，每次循环变量加一，而ｘ为变量*变量 ２。同理，此时分母可以看到分别差1.2.3.4.5...也就是原本变量加差值，同样的，而此时ｘ初值为１，同样定义一个变量，每次循环将该变量加一，也就是获得了每次需要加的差值，而需要加的ｘ也在变，所以变量加一后将ｘ也更新，ｘ＝ｘ＋变量，具体包括ｘ的变量名随你自己取 这是关键的累加程序代码思路，累加完成后就要判断什么时候退出，这里放前面还是放后面你自己根据题目考虑，退出就是ｉｆ判断１／ｘ是不是小于10的负６次方，如果是ｂｒｅａｋ；就好了
user-0 提问: 关于结构体的疑问！

回复:
user: user-1
content: 你这个数组就定义了3个长度，没办法添加进去了。建议把中括号[]里面填一个大于3个数字，比如10.这样可以添加新的成员进去的

user: user-2
content: 你定义nowbook[]数组大小就是3了。怎么加？  1、直接开始定义nowbook[100]=...，后面就 nowbook[0]={}   、nowbook[1]={} .。。加到100即可 2、直接用vector，有新书就push_back就好了

user: user-3
content: 我可以哦，下载什么，积分不能购买吗？

user: user-0
content: 另外，想利用函数来实现，可以吗

user: user-4
content: 没有积分太痛苦了，VIP太贵，有没有哪个大神帮忙下两个文件，只需要4积分，给他发个红包
user-0 提问: 如下代码，基础地方不太明白

回复:
user: user-0
content: 感谢终于明白了

user: user-1
content: 补充一下，上面第二个for循环中i的起始值是1，因为括号里面赋值为1了

user: user-1
content: #define  N  10   //你上面的这里忘了加 # 了  #include <stdio.h>   int main()   {   float f[N],x=0.0;   int i;      for(i=0;i<N;i++)  //  我相信这行代码你看得懂。这个循环结束后i等于10。为什么是10？这是因为N等于10，当i等于9时循环还会继续；当i等于10时循环才会结束。     scanf("%f", &f[i]);   //我觉得你应该知道scanf函数怎么用。这里是给数组f[N]输入10个浮点数。为什么偏偏是10个？因为上面预处理定义了N的值是10。如果看不懂那个预处理，当我这段话没说。   for(i=1;i<=N;i++) //这里i=1循环这个i值为多少   {          x = x + f[i-1]        ;     //这个填空你应该看得懂吧？为什么要填f[i-1]呢？因为数组f[N]的元素是从f[0]到f[9]。     printf("sum of NO -%d  %f\n", i, x);       //上面这里是不是忘了加%d了？我给你补上了   }    return 0;  }   我把数组中的元素分别赋值从1到10（当然你也可以赋其他值），编译结果如下： 1 2 3 4 5 6 7 8 9 10 sum of NO -1  1.000000 sum of NO -2  3.000000 sum of NO -3  6.000000 sum of NO -4  10.000000 sum of NO -5  15.000000 sum of NO -6  21.000000 sum of NO -7  28.000000 sum of NO -8  36.000000 sum of NO -9  45.000000 sum of NO -10  55.000000  如果还是不懂，你可以把我完善后的代码复制，自己编译后想想

user: user-2
content: for(i=0;i<N;i++)  //  i值和下面i值相比区别是?i最后值是多少（１）     scanf("%f", &f[i]);   //这里i=0，输入值有啥用　　　　　（２）   for(i=1;i<=N;i++) //这里i=1循环这个i值为多少　　　　　（３）   {                 ;     //填空     printf("sum of NO -  %f\n", i, x);     }  （１）for循环中这一句代表的循环次数，本质上与下面的无关，只是他们之间刚好都是每次循环加一的状态，刚好一致，所以就直接使用了for循环变量的值 (２)ｓｃａｎｆ函数是将数据写入变量的地址，ｉ等于０时f[０]是这个数组的首地址，你所定义的ｆ[10]实际使用是ｆ[0]到[9]这样的十个，数组指针，下标首地址都是０开始而不是１开始，这里你可以去看下指针方便理解，或者仔细了解下数组，推荐数组，因为指针可能更“底层”一点，相对数组比较难理解 （３）这里ｉ值不解释，给你讲下for for循环中分号隔开的分别是，变量，条件，更改变量值语句，当然都可以为空，那是另一种用法，先不说。变量，用于跟后面的条件一起控制循环次数，条件不说，你能理解，就是比较是不是满足，满足就执行循环，不满足退出循环。后面的ｉ＋＋，＋＋是双目运算符，分前后位置。这里后＋＋你可以理解为i=i+1;就是每执行一次循环就将ｉ的值加一，ｆｏｒ循环是通过变量看是否满足条件，满足执行循环体也就是｛｝中的内容，执行完毕后执行改变变量值的语句，再进行判断是否满足条件，构成循环，你按照这个把ｉ的值列出来你就懂了 第一次循环　循环前i=0,循环后ｉ＋＋　，ｉ＝１ 第二次循环　循环前i=1，循环后ｉ++，ｉ＝２ 就这样
user-0 提问: 一道C语言编程题

回复:
user: user-0
content: 我刚刚试着编了一下，但是还是有错误但是我不知道咋改啊 #include<stdio.h> void main() { 	int max,min; int i,n,sum=0,t=0; int a[i]; float avge; printf("请输入学生的个数:"); scanf("%d",&n); printf("请输入%d个学生的成绩:"); {for(i=0;i<n;i++) scanf("%d",&a[i]); max=a[n-1]; min=a[0]; for(i=0;i<n;i++) {if(min>a[i]) min=a[i]; if(max<a[i])    max=a[i]; if(a[i]<60) t++; sum+=a[i]; } avge=sum*1.0/n; printf("最大值%d\n,最小值%d\n,不及格人数%d\n,平均分%lf",max,min,t,avge); }}

user: user-1
content: 引用 2 楼 qq_47712720 的回复:[quote=引用 1 楼 chxchxkkk的回复:]这样的数组题不难吧，就是个排序和判断 刚学C语言，我做了一早上了[/quote] 给你个思路 定义变量： int max, min; //最大值、最小值 int i, sum = 0, t = 0; float avge; //平均值 int arr[10]; //假定10个学生 //数组输入应该会吧 max = arr[9]; min = arr[0]; for (i=0; i<10; i++) {     if (min > a[i])        min = a[i]      //比最小值小则赋值给最小值     if (max < a[i])       max = a[i]     //比最大值大则赋值给最大值     if (a[i] < 60)       t++;              //不及格人数     sum += a[i]; } avge = sum * 1.0 / 10; //平均值  输出 max min avge t

user: user-0
content: 引用 1 楼 chxchxkkk的回复:这样的数组题不难吧，就是个排序和判断 刚学C语言，我做了一早上了

user: user-1
content: 这样的数组题不难吧，就是个排序和判断

user: user-0
content: 引用 5 楼 弦之弈的回复:int main() { 	int max, min, ave, unq; 	int i; 	int n;  // number of students 	scanf("%d",&n); 	char c; 	scanf("%c",&c); 	int str[n];	 //   	for(i=0 ; i<n ; i++) 	{ 		scanf("%d",&str[i]); 	} 	max = str[0]; 	min = str[0]; 	for(i=0 ; i<n-1 ; i++) 	{ 		if(str[i]>str[i+1]) 		{ 			max = str[i]; 			min = str[i+1]; 		} 		else 		{ 			min = str[i]; 			max = str[i+1]; 		} 	} 	unq = 0; 	for(i=0 ; i<n ; i++) 	{ 		if(str[i] < 60) 		{ 			unq++; 		} 	} 	ave = 0; 	for(i=0 ; i<n ; i++) 	{ 		ave = ave+str[i]; 	} 	ave = ave/n; 	// print  }  大概就是这样，题主加上输出和.h应该就行了 我知道了谢谢

user: user-0
content: 引用 5 楼 弦之弈的回复:int main() { 	int max, min, ave, unq; 	int i; 	int n;  // number of students 	scanf("%d",&n); 	char c; 	scanf("%c",&c); 	int str[n];	 //   	for(i=0 ; i<n ; i++) 	{ 		scanf("%d",&str[i]); 	} 	max = str[0]; 	min = str[0]; 	for(i=0 ; i<n-1 ; i++) 	{ 		if(str[i]>str[i+1]) 		{ 			max = str[i]; 			min = str[i+1]; 		} 		else 		{ 			min = str[i]; 			max = str[i+1]; 		} 	} 	unq = 0; 	for(i=0 ; i<n ; i++) 	{ 		if(str[i] < 60) 		{ 			unq++; 		} 	} 	ave = 0; 	for(i=0 ; i<n ; i++) 	{ 		ave = ave+str[i]; 	} 	ave = ave/n; 	// print  }  大概就是这样，题主加上输出和.h应该就行了 谢谢！！！ 我会了谢谢谢谢

user: user-2
content: int main() { 	int max, min, ave, unq; 	int i; 	int n;  // number of students 	scanf("%d",&n); 	char c; 	scanf("%c",&c); 	int str[n];	 //   	for(i=0 ; i<n ; i++) 	{ 		scanf("%d",&str[i]); 	} 	max = str[0]; 	min = str[0]; 	for(i=0 ; i<n-1 ; i++) 	{ 		if(str[i]>str[i+1]) 		{ 			max = str[i]; 			min = str[i+1]; 		} 		else 		{ 			min = str[i]; 			max = str[i+1]; 		} 	} 	unq = 0; 	for(i=0 ; i<n ; i++) 	{ 		if(str[i] < 60) 		{ 			unq++; 		} 	} 	ave = 0; 	for(i=0 ; i<n ; i++) 	{ 		ave = ave+str[i]; 	} 	ave = ave/n; 	// print  }  大概就是这样，题主加上输出和.h应该就行了
user-0 提问: 这段问题出在哪？

回复:
user: user-1
content: p是一个野指针，不能直接*p = n;因为可能会导致段错误。 建议可以p = &n;

user: user-2
content: 指针p没有指向，应该先给指针p赋值

user: user-3
content: 应该这样  #include<stdio.h> int main(){     int *p,n;     scanf("%d",&n);      p=&n;     printf("%d\n",*p); }

user: user-4
content: p是个野指针

user: user-5
content: 是p没有分配空间，就直接赋值了

user: user-0
content: 引用 1 楼 user-5 的回复:这有什么问题？运行赋值手显示存储空间未定义

user: user-5
content: 这有什么问题？
user-0 提问: C语言memcpy拷贝结果出错

回复:
user: user-0
content: 问题找到了  中途修改过WIFISaveInfor2[x][y]定义的y的值，但在extern中忘记修改了。谢谢各位了

user: user-1
content: 建议在memcpy之前打印一下WIFISaveInfor2[i]，确保该数组的长度和内容是否是你想到的

user: user-2
content: 1.首先 写代码要有删繁就简的能力  提问的时候 如果提出的问题让别人看着无法理解 说明你没有梳理问题的能力 未知会有很多 重要的是思路要清晰，至少可以把问题最小子模块化，然后你就知道问题在哪了。  2.问题可能出在buf太小了 40够不够 考虑好  其次当顺序定义 buf buf2 buf3的时候在内存布局会是连续的 也就是说 当你附近的被拷贝过界了 就有可能对其他数据的值产生影响。 memcpy这个函数除了在不能使用同一缓冲区进行拷贝下 未定义之外 系统函数问题不大、大的是你可能存在数组越界的操作。
user-0 提问: 不懂就问:在学数据结构，照着书上的写前序遍历创建二叉树

回复:
user: user-0
content: 引用 5 楼 user-1的回复:所以不能用&引用 好的，谢谢您嘞

user: user-1
content: 所以不能用&引用

user: user-0
content: 引用 3 楼 user-1的回复:你这是c还是c++，纯c是不支持引用的，你改成*T 纯cccccc

user: user-1
content: 你这是c还是c++，纯c是不支持引用的，你改成*T

user: user-0
content: 引用 1 楼 user-1的回复:没有包含头文件?可以贴下完整代码就知道了 #include<stdio.h> #include<malloc.h>  typedef struct BiTNode { 	char data; 	struct BiTNode* lchild, * rchild; }BiTNode,*BiTree;  void CreateBiTree(BiTree &T) {  //先序遍历创建二叉链表 	char ch; 	printf("请输入结点值(# 结束)："); 	scanf("%c",&ch); 	if (ch == '#')  T = NULL; 	else 	{ 		T = (BiTree)malloc(sizeof(BiTNode)); 		T->data = ch; 		CreateBiTree(T->lchild); 		CreateBiTree(T->rchild); 	} }  void PreOrderTraverse(BiTree T) { //前序遍历二叉树T的递归算法 	if (T) { 		printf("%c", T->data); 		PreOrderTraverse(T->lchild); 		PreOrderTraverse(T->rchild); 	} }  void InOrderTraverse(BiTree T) { //中序遍历二叉树T的递归算法 	if (T) { 		InOrderTraverse(T->lchild); 		printf("%c", T->data); 		InOrderTraverse(T->rchild); 	} }  void PostOrderTraverse(BiTree T) { //中序遍历二叉树T的递归算法 	if (T) { 		PostOrderTraverse(T->lchild); 		PostOrderTraverse(T->rchild); 		printf("%c", T->data); 	} }  void main() { 	BiTree T; 	CreateBiTree(&T); 	printf("前序遍历："); 	PreOrderTraverse(T); 	printf("中序遍历："); 	InOrderTraverse(T); 	printf("后序遍历："); 	PostOrderTraverse(T); }

user: user-1
content: 没有包含头文件?可以贴下完整代码就知道了
user-0 提问: 如何用C语言设计程序？

回复:
user: user-1
content: 用不着数据库这么复杂的，用个结构体数组就行了

user: user-2
content: 这个不是表格形式么？第一时间应该能想到数据库啊

user: user-3
content: 就是一些简单计算，先让用户输入学生人数，然后再输入每个学生的成绩等等
user-0 提问: 求助C语言循环结构

回复:
user: user-0
content: 其他已解决  还剩这两个

user: user-0
content: 引用 1 楼 朕守山河 的回复:你这个问题是啥？就是  这是 五个图片嘛   每个的流程图和程序   单纯 只有程序或  流程图  也行

user: user-1
content: 你这个问题是啥？
user-0 提问: 求大佬们帮忙看看这段代码

回复:
user: user-0
content: 十分感谢，我还以为是其他的意思

user: user-1
content: 这段英文的意思就是“请输入写入到文件中的单词，在每行的起始位置处按下#按键来结束输入。” 从下面的输入可以看到，当输入结束时，按下#键即可
user-0 提问: VS链接libffi静态库

回复:
user: user-0
content: 我在https://github.com/winlibs/libffi/issues/3找到了相似的问题,已经解决了,谢谢帮忙。

user: user-0
content: 引用 1 楼 棉猴 的回复:请参考《VS2015动态库编程基础篇资源汇总》 希望能够帮到你！ 你好,感谢你的回答 我看了一下你写的文章,但是这不是我问题的关键,从我的编译结果来看,库编译是正确的,而且链接也没有错误,函数应该是可以调用的,可是并没有如期的实现,而是未找到函数符号

user: user-1
content: 请参考《VS2015动态库编程基础篇资源汇总》 希望能够帮到你！
user-0 提问: 消息队列问题，求大佬解惑

回复:
user: user-0
content: 问题已解决，卡住原因是 scanf("%[^\n]",buf); 不知为何只能输入一次，改为fgets输入后问题解决。 丢包原因是msgsnd输入参数有误，改正后解决。

user: user-1
content: 父进程部分的break前面打印一句话，看下有可能break跳出来了
user-0 提问: 求大佬帮写个c语言 我写了一部分

回复:
user: user-0
content: 求大哥们指点一下贴个代码

user: user-0
content: 引用 6 楼 ?Victor.?? 的回复:就是用原函数吧  x*x*x/3+x*x+x第三个没有原函数吧

user: user-1
content: 就是用原函数吧  x*x*x/3+x*x+x

user: user-0
content: 引用 4 楼 斥包乐氶的 的回复:你的问题太太太复杂了！ 我只是第三个不知到怎么写，前两个大概会了

user: user-2
content: 你的问题太太太复杂了！

user: user-0
content: 有大佬吗别沉了呀

user: user-0
content: 有大神帮着完善一下吗

user: user-0
content: #include<stdio.h> #include<math.h> int main() {double integral(double(*)(double),double,double,int n); double fsin(double); double fcos(double); double a1,b1,a2,b2,c,(*p)(double); int n=20; printf("input a1,b1:"); scanf("%lf,%lf",&a1,&b1); printf("input a2,b2:"); scanf("%lf,%lf",&a2,&b2); p=fsin; c=integral(p,a1,b1,c); printf("The integral of sin(x)is:%lf\n",c); p=fcos; c=integral(p,a2,b2,c); printf("The integral of cos(x)is:%lf\n",c); return 0; } double integral(double(*p)(double),double a,double b,int n) {     int i;     double x,h,s;     h=(b-a)/n;     x=a;     s=0;     for(i=1;i<=n;i++)         {x=x+h;         s=s+(*p)(x)*h;         }     return(s); }     double fsin(double x)     {         return sin(x);     }     double fcos(double x)     {         return cos(x);     }
user-0 提问: 求字符串最大的一个

回复:
user: user-0
content: 引用 2 楼 面包牛奶天生一对的回复:问题都没说清，怎么帮？是求若干个字符中，长度最大的还是单纯比较字符串大小？都不说清 比较字符串的大小

user: user-1
content: 问题都没说清，怎么帮？是求若干个字符中，长度最大的还是单纯比较字符串大小？都不说清

user: user-2
content: so,楼主的问题是什么？
user-0 提问: 用C语言的循环语句输出如下图案

回复:
user: user-1
content: 在循环里： 1.输出空格数（每行+2） 2.输出图形

user: user-2
content: 你这都是列输出，判断列⭐起始位置就行，结束位置都是上一列+1用for和if嵌套可以了

user: user-3
content: 嵌套循环就可以了 for(n=0; n<5; n++) 	{ 		for(i=0; i<=n; i++) 		{ 			printf("  "); 		} 		printf("*****\n"); 	}

user: user-0
content: 有具体代码吗
user-0 提问: C语言个人所得税计算器，求助大佬帮忙开头和主体部分

回复:
user: user-1
content: 没有细写，你自己参考着修改吧  #include <stdio.h>  int refer[10][2] =     {         { 1600, 0},         { 500, 5},         { 2000, 10},         { 5000, 15},         { 20000, 20},         { 40000, 25},         { 60000, 30},         { 80000, 35},         { 100000, 40},         { 100000, 45},     };   float getSalary() {     float n = -1;     while (1)     {         printf("输入员工工资：\n");         scanf("%f", &n);         if (n >= 0 && n < 1000000)             return n;         else         {             printf("输入0-1000000之间的数：\n");             scanf("%f", &n);         }     } }  float prvtaxcal(float m, int arr[][2], int n) {     float temp = 0.0;     int i;     if (m <= arr[0][0])         return 0;     else     {         temp = m - arr[0][0];         if ( temp < arr[1][0])             return temp * arr[1][1] / 100.0;         else if (temp > arr[1][0] && temp <= arr[2][0])             return temp * arr[2][1] / 100.0;         else if (temp > arr[2][0] && temp <= arr[3][0])             return temp * arr[3][1] / 100.0;         else if (temp > arr[3][0] && temp <= arr[4][0])             return temp * arr[4][1] / 100.0;         else if (temp > arr[4][0] && temp <= arr[5][0])             return temp * arr[5][1] / 100.0;         else if (temp > arr[5][0] && temp <= arr[6][0])             return temp * arr[6][1] / 100.0;         else if (temp > arr[6][0] && temp <= arr[7][0])             return temp * arr[7][1] / 100.0;         else if (temp > arr[7][0] && temp <= arr[8][0])             return temp * arr[8][1] / 100.0;         else if (temp > arr[9][0])             return temp * arr[9][1] / 100.0;     } }  int main(void) {     float salary = 1.0, tax = 0.0;     do     {         salary = getSalary();         tax = prvtaxcal(salary, refer, 9);         printf("工资：%-10.2f, 纳税：%-10.2f\n", salary, tax);     } while (salary > 0);       return 0; }

user: user-0
content: 谢谢大佬大大的帮助

user: user-1
content: 题目具体要求是什么呢？

user: user-0
content: 俩题目要求 是个截图，谢谢大佬

user: user-0
user-0 提问: 求大佬帮写

回复:
user: user-1
content: 比如： int a[10], b[10], *p, *q, i; p = a; q = b; for (i=0; i<10; i++) {     *(q+i) = *(p+i); }  for (i=0; i<10; i++) {     printf("%d ", *(q+i)); }
user-0 提问: c语言结构体

回复:
user: user-1
content: 供参考  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct Student {     char name[20];     int age;     int math;     int english;     int chinese;     float avge; } Stu;  int main() {     Stu s[3];     int i;      for (i=0; i<3; i++)     {         printf("输入第%d个学生的姓名 年龄 数学成绩 英语成绩 语文成绩：\n", i+1);         scanf("%s%d%d%d%d", s[i].name, &s[i].age, &s[i].math, &s[i].english, &s[i].chinese);         s[i].avge = (s[i].math + s[i].english+s[i].chinese) * 1.0 / 3;         getchar();     }      for (i=0; i<3; i++)     {         printf("%s学生的平均分为：%.2f\n", s[i].name, s[i].avge);     }      getchar();     return 0; }
user-0 提问: 哪位大神帮帮忙

回复:
user: user-1
content: 1.改控制台颜色很简单 在C里 有一些头 然后百度即可 2.校车管理系统 (1)顺序表 或者 链表操作使用其中之一  结构体定义 (2)scanf getc sprintf sscanf 等一些文件读写的操作 注意一些fflush的操作 (3)排序 查询 函数指针的排序  (4)动态规划算法 还可以根据深度遍历和广度遍历对路线规范 这个一般写出来 就是优秀毕业设计了 本科生大多写不出来 (5)业务逻辑调查 把他整合进你的代码

user: user-0
content: 引用 6 楼 做或不做的回复:1.改控制台颜色很简单 在C里 有一些头 然后百度即可 2.校车管理系统 (1)顺序表 或者 链表操作使用其中之一  结构体定义 (2)scanf getc sprintf sscanf 等一些文件读写的操作 注意一些fflush的操作 (3)排序 查询 函数指针的排序  (4)动态规划算法 还可以根据深度遍历和广度遍历对路线规范 这个一般写出来 就是优秀毕业设计了 本科生大多写不出来 (5)业务逻辑调查 把他整合进你的代码 好的，谢谢你了

user: user-2
content: 教你，网上随便找一个页面模板，套下来，你这主要还是一个数据库的增删查改，功能现成的写进去

user: user-0
content: 引用 3 楼 user-3的回复:先学习，复习一周，再做 可是5天后就要交

user: user-3
content: 先学习，复习一周，再做

user: user-0
content: 引用 1 楼 user-3的回复:不是很难的啊 可我不会啊，这是期末的作业

user: user-3
content: 不是很难的啊
user-0 提问: 请问一个数组下标效率的问题

回复:
user: user-1
content: 我拿Linux来解释，不完全准确，可以近似这样理解。  当你malloc了200W字节的时候，系统实际上给你开了个空头支票。你虽然拿到了分配的内存的地址，但底层的物理内存压根就没有分配，只是做了个备案。当你开始往内存中写东西的时候，系统才开始给你分配真正的物理内存，而且容易想象，你写的地址的offset越大，系统需要真正准备的物理内存越多，花的时间越长。  想要准确的解释，可以去看虚拟内存这块。

user: user-2
content: 引用 7 楼 alldying 的回复: 我觉得你可以把cc转为unsigned int 然后再运算+偏移，不要用他本身的类型 *(cc+150000)='a' 这个运算是 cc+sizeof(char)*150000 *(char*)((int)cc+150000)='a'; 这样看会不会快些

user: user-0
content: 修改成 *(char*)((int*)cc+150000)='a'; 后，运行2次，第一次有大幅改善，第二次结果跟之前差不多，结果如下  2.1.   1589128544,452039,1589128544,452045 2.2.   1589128544,452047,1589128544,453108   2.1.   1589128846,724661,1589128846,724667 2.2.   1589128846,724669,1589128846,724929  后来再多次运行，结果类似第二次。  猜测，第一次刚好如你上面所说，cc分配在同一物理页了，所以快了很多，因为单从数组来说，操作各个位置的复杂度应该是O(1)，但是到寻址这一步，如果跨了分页，那么离起点越远就步骤越多，越耗时。

user: user-0
content: 谢谢gouyanfen的回复。   1、改成偏移10，结果差不多，这个测试是想知道对一个大数组的不同位置，由其是距离起点不同距离的位置赋值是否耗时一致；  	char  **cc; 	cc = malloc(sizeof(char  *)*2000000); 	gettimeofday(&tv1, 0); 	*(cc + 10) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.1.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  	gettimeofday(&tv1, 0); 	*(cc + 1500000) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.2.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  测试结果  2.1.   1589123428,159323,1589123428,159328 2.2.   1589123428,159329,1589123428,159613  2、变量是char类型是因为实际项目中这里是个自定义的结构，结构大小没法保持和总线位数一样；  3、虽然这个测试的目的不是内存分配效率，不过，怎样才能分配在一个物理内存页呢，那样的话赋值效率应该也会高些；

user: user-2
content: 引用 5 楼 alldying 的回复:不好意思，刚刚描述有点错，是200W时对不同位置赋值，耗时不一样，下面是代码和结果  	char  **cc; 	cc = malloc(sizeof(char  *)*2000000); 	gettimeofday(&tv1, 0); 	*(cc + 0) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  	gettimeofday(&tv1, 0); 	*(cc + 1500000) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  测试结果  2.1589117027,554010,1589117027,554014 2.1589117027,554016,1589117027,554282 你这个测试不是很合理，*(cc+0)='a';编译器没有那么笨的，会优化的，所以你应该改一下位置不要用偏移为0, 其次你的变量为char类型，那么在偏移寻址，地址操作时就多了几个寻址取数的汇编码的寻址最快的是和总线相同位数的 再有一个你测试分配内存测试效率，应该尽量分配在一个物理内存页中。

user: user-0
content: 不好意思，刚刚描述有点错，是200W时对不同位置赋值，耗时不一样，下面是代码和结果  	char  **cc; 	cc = malloc(sizeof(char  *)*2000000); 	gettimeofday(&tv1, 0); 	*(cc + 0) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  	gettimeofday(&tv1, 0); 	*(cc + 1500000) = 'a'; 	gettimeofday(&tv2, 0); 	fprintf(stdout, "2.%lu,%lu,%lu,%lu\n", tv1.tv_sec, tv1.tv_usec, tv2.tv_sec, tv2.tv_usec);  测试结果  2.1589117027,554010,1589117027,554014 2.1589117027,554016,1589117027,554282

user: user-3
content: 不会有差别的，你把测试结果贴出来

user: user-0
content: 赋值是一样，关键是这个数组大小不一样，一个20W，一个2W，是否大小不一样导致寻址过程不一样呢

user: user-3
content: 这里赋值不都一样吗？

user: user-0
content: 补充，耗时集中在赋值，不在malloc，malloc的差距可以忽略。
user-0 提问: 错误	LNK2019	无法解析的外部符号

回复:
user: user-0
content: 引用 1 楼 user-1的回复:printf("%\n");  这一句里把%去掉，当然不去掉也不影响运行，但是会有个警告 不知道你的vs是什么版本的，我是vs2019,在第一行加上一句 #define _CRT_SECURE_NO_WARNINGS  //这一句是为了scanf不报错 #include<stdio.h> #define N 10 然后运行正常，并没有你报的错误  我也是2019，按照你的方法试了，还是报错。

user: user-1
content: printf("%\n");  这一句里把%去掉，当然不去掉也不影响运行，但是会有个警告 不知道你的vs是什么版本的，我是vs2019,在第一行加上一句 #define _CRT_SECURE_NO_WARNINGS  //这一句是为了scanf不报错 #include<stdio.h> #define N 10 然后运行正常，并没有你报的错误
user-0 提问: 求大佬解决

回复:
user: user-1
content: 因为 sum 随着循环的叠加，永远不可能等于n for (n = 2; n <=1000; n++)     {       sum=0;//加上这一句         for (i = 1; i < n; i++)         {             if (n % i == 0)             {                 sum = sum + i;              }

user: user-2
content: 没结果表明 n == sum 条件不满足

user: user-0
content: 引用 1 楼 真相重于对错的回复:每次需要把sum赋值为0 好的谢谢，那个运行窗口 没结果是怎么回事 也改了

user: user-1
content: 每次需要把sum赋值为0
user-0 提问: 代码如下，请教一下，输出是什么

回复:
user: user-1
content: 输出：7  1、i++是在第一轮做完以后进行的 2、第一轮时j=2，后面根据i的变化而变化 3、不加花括号肯定有变化，不加的话第一层的循环只循环sum=1

user: user-2
content: 等于7啊，外层循环最后一次起作用

user: user-3
content: { sum=1;//i执行i++了吗?       for( j=i;j<7;j++)//这个地方i赋值给j，j值变为2对吧     ===》》这里i的值还是1，下次才++.          sum=sum+j; }//这里嵌套不加花括号效果变了对吗? ===》》这里for循环体只有 sum = sum+j一条语句，所以可以不用花括号
user-0 提问: 代码如下，请教大家输出是什么，详细说说谢谢各位

回复:
user: user-1
content: continue是不向下循环，而是继续执行循环i++

user: user-2
content: 引用 楼主 C语言没学好 的回复:#include <stdio.h>   int main( )  { int i=10,s=0;    for(i=1;i<=10;i++)//这个不太懂，continue，效果是什么    {  if(i%3!=0) continue;       s=s+i; }//循环10次，带入数值9+6+3是这个吗      printf("%d",s);    return 0;  } 实现了什么效果 实现的效果应该是找到第一个能被三整除的数。 首先循环应该懂然后ｉｆ语句是不能被三整除continue,这个单词的作用是跳过本次循环执行下一次循环，一旦执行了这个关键字语句就不会执行下面的语句而是直接全部跳过。 继续往下，ｓ＝ｓ＋ｉ，这是给ｓ赋值，看似是求和，紧接着打印，但是后面接了return0，代表程序结束返回值为０，直接到此直接结束了，就不会再运行，因此求和只求了一次，而初始值为０　，所以可以看作找到第一个被３整除的数也就是３

user: user-0
content: 自顶

user: user-3
content: 目前是个无限循环

user: user-4
content: if(i%3!=0) continue;  意思是如果不能整除3，则跳过本次循环进入下一次，比如 i=5 5 % 3 ！= 0; 那么进入下一次 i = 6;
user-0 提问: 代码如下，功能是：从键盘输入10个字符，输出其中数字字符

回复:
user: user-1
content: getchar()是输入一个字符，putchar()是输出一个字符

user: user-2
content: getchar和scanf的作用是相似的，输入 putchar是输出  填空为：continue;   意思是输入的数据不是数字就不再执行后面的内容，重新回到for，开始新一轮
user-0 提问: c语言求助！！！删除指定字符

回复:
user: user-1
content: 去掉scanf中的'\n'。然后再试试～

user: user-2
content: 代码细节逻辑没怎么看 至少输入 你可以这么写         scanf别读char 这个C实现本身就容易弄蒙圈人  如果弄清为什么 还不如记得以后别这么用         fflush(stdin); 	c = getchar();
user-0 提问: 代码如下，填空题

回复:
user: user-0
content: 感谢，我懂了

user: user-1
content: 最好调试着看，一看就明白了。跑一下程序。

user: user-1
content: 单条语句是可不用加花括号的 if(condition)  expression_1; 等价于 if(condition) { expression_1; }   这里就是 for(){    for(){     } } 将里面的一整个for循环看做一条语句，就不用加括号。   最底层的if的理解也是一样的  if后面是多条语句，所以加上花括号；但是if语句块是一个整体，没有别的语句，就不用了加花括号。  m是满足if条件的一组(i,j,k)的数量。   #include <stdio.h>  int main( )   {  int i,j,k,m=0;       for(i=0;i<=20;i++) {  //这里为啥不加花括号       for(j=0;      ;j++) {   //j<=50答案明白了          for(k=0;k<=100;k++){//最底层for不懂和if嵌套怎么判定             if(i*5+j*2+k==100)              { m++;printf("i=%d,j=%d,k=%d\n",i,j,k);}}}}      printf("m=%d",m);      return 0;   }

user: user-2
content: 这是一个for嵌套 如果for（）后面没有{}，那么这个for循环只管这它下面的一条代码
user-0 提问: 代码如下，这是填空题，可以详细说说吗

回复:
user: user-0
content: 引用 4 楼 qq_1457346882的回复:上面答案是错的。。。 这种题首先看你的图案，去找你空格的规律，我不知到题目是就这样的，还是你电脑自己打得，反正都会对齐，你数就好了，如果是电脑就鼠标按好移动，看看有几个格子，这里第一行４个，第二行两个，第三行０，所以规律你会发现ｉ是０，１。２而（２－ｉ）*２恰好可以满足。所以应该填j=2*(2-i); ｓ的赋值不是空，是空格，同样下面的例子可以看到。数的就是空格 j<2*i+1这句跟填的一样，是控制循环次数的，也就是打印的数量，*就是×号２*ｉ＋１就是２乘以ｉ的值再加一，然后ｊ小鱼这个值的时候就执行循环体 最后，这是二层嵌套不是三成，嵌套层数是指包含的，你这是一个外循环包含两个内循环，内循环是独立的，不是包含关系，只有两层三个，层代表的是层次，不是个数 谢谢，终于懂了

user: user-1
content: 引用 5 楼 C语言没学好 的回复:[quote=引用 4 楼 qq_1457346882的回复:]上面答案是错的。。。 这种题首先看你的图案，去找你空格的规律，我不知到题目是就这样的，还是你电脑自己打得，反正都会对齐，你数就好了，如果是电脑就鼠标按好移动，看看有几个格子，这里第一行４个，第二行两个，第三行０，所以规律你会发现ｉ是０，１。２而（２－ｉ）*２恰好可以满足。所以应该填j=2*(2-i); ｓ的赋值不是空，是空格，同样下面的例子可以看到。数的就是空格 j<2*i+1这句跟填的一样，是控制循环次数的，也就是打印的数量，*就是×号２*ｉ＋１就是２乘以ｉ的值再加一，然后ｊ小鱼这个值的时候就执行循环体 最后，这是二层嵌套不是三成，嵌套层数是指包含的，你这是一个外循环包含两个内循环，内循环是独立的，不是包含关系，只有两层三个，层代表的是层次，不是个数 谢谢，终于懂了[/quote] 恩，不知道你是不是程序员工作以后，像这种题有多少空格如果能过通过一定方法得到确定的就不要靠眼睛看，那是猜的，当然这是电脑，如果是纸上那只能数，纸上的格式肯定是对其的。尽量能稳则稳，笔试机考很多坑的

user: user-1
content: 上面答案是错的。。。 这种题首先看你的图案，去找你空格的规律，我不知到题目是就这样的，还是你电脑自己打得，反正都会对齐，你数就好了，如果是电脑就鼠标按好移动，看看有几个格子，这里第一行４个，第二行两个，第三行０，所以规律你会发现ｉ是０，１。２而（２－ｉ）*２恰好可以满足。所以应该填j=2*(2-i); ｓ的赋值不是空，是空格，同样下面的例子可以看到。数的就是空格 j<2*i+1这句跟填的一样，是控制循环次数的，也就是打印的数量，*就是×号２*ｉ＋１就是２乘以ｉ的值再加一，然后ｊ小鱼这个值的时候就执行循环体 最后，这是二层嵌套不是三成，嵌套层数是指包含的，你这是一个外循环包含两个内循环，内循环是独立的，不是包含关系，只有两层三个，层代表的是层次，不是个数

user: user-0
content: 自顶

user: user-2
content: #include <stdio.h>  int  main()  {       char c= '*',s=' ';//这里 不是 空， s赋值是个空格， 想打印一个空 格字符       int i,j;      for(i=0;i<3;i++)      {           for(j=   2-i         ;j>0; j--)//打印每行 的空格 ， 不知 是 2 1 0还是 3 2 1             printf("%c",s);          for(j=0;j<2*i+1;j++) //j<2*i+1是得到 1，3，5， 每行 打印的 * 数量              printf("%c",c);          printf("\n");       }//三层for嵌套结束       return 0;  }

user: user-3
content: 填：3-i  需要填空的这一行是用来循环输出*前面空格的，由于每一行的空格数量不同，意味着最外层循环每一轮都将影响j的初始值。所以j需要和i关联，即最大的空格数量减去i。  2*i+1：表示*的数量是以1.3.5.7.9....的顺序递增。数学的等差数列~
user-0 提问: puts(a)的输出结果：

回复:
user: user-0
content: 引用 1 楼 user-1的回复:你这不是下了断点吗，单步执行看呗 谢谢你回复，单步执行的时候，值的变化规律不理解

user: user-1
content: 你这不是下了断点吗，单步执行看呗
user-0 提问: C语言新手一道初学者题不知道哪里出错了，求助

回复:
user: user-0
content: 引用 2 楼 @大愚@的回复:这应该是==号 可是输入正确的也显示no了

user: user-1
content: 这应该是==号

user: user-0
content: 有人能告诉我一下吗？

user: user-1
content: 你的for循环里的退出条件有问题，你是不超过20个就一直循环，如果你就只有3个字符，那剩下的都是没有赋值得所以只需要访问这三个字符即可,字符串结束符是'\0'所以只要不等于'\0',就会一直访问

user: user-1
content: 你的for循环的退出条件有问题 你这是小于20但你不一定输入20个字符，所以你的退出条件是字符串的元素不等于 '\0'
user-0 提问: 关于程序出现乱码

回复:
user: user-1
content: fflush(stdin);加在scanf之后，可以清除输入缓存区。 中文字符是两个char 存储，也就是说[0][1]加起来才表示一个字符。所以你要计算好位置。

user: user-0
content: 引用 7 楼 Simple-Soft 的回复:scanf("%c ", &str); 再做一次，第一次把上面的回车接收 不过没懂他为什么第一次读回车

user: user-0
content: 引用 7 楼 Simple-Soft 的回复:scanf("%c ", &str); 再做一次，第一次把上面的回车接收 可以了，但要输两次这个字符

user: user-2
content: scanf("%c ", &str); 再做一次，第一次把上面的回车接收

user: user-0
content: 引用 5 楼 Simple-Soft 的回复:scanf两次，就把回车去除了，因为你按回车了，所有会接收到两个字符，一个是d，一个是回车 懂你的意思了，但是程序要怎么写？不太会

user: user-2
content: scanf两次，就把回车去除了，因为你按回车了，所有会接收到两个字符，一个是d，一个是回车

user: user-0
content: 引用 3 楼 Simple-Soft 的回复:a[location - 1] = a[str] 这里错了，改成 a[location - 1] = str 我尝试过这么改，改完之后输入的那个字符会变成回车插入

user: user-2
content: a[location - 1] = a[str] 这里错了，改成 a[location - 1] = str

user: user-0
content: 引用 1 楼 user-3 的回复:全输入英文字符会出现这样的问题吗

user: user-3
content: 全输入英文字符会出现这样的问题吗
user-0 提问: 循环嵌套for

回复:
user: user-1
content: 循环比较简单  你只要掌握了循环这些语句的意思和用法你就知道了

user: user-0
content: 引用 1 楼 user-2的回复:下次希望楼主问问题能写得详细点，可以的话把代码全部写上...不要让我们去猜...  因为楼主没说a和b的类型，我假设a和b都是int类型。 for(a=1; a<6; a++)      这段代码的意思是：当a=1时，如果a<6为真，则执行for下面的一段代码（这里楼主没有把代码写上。也可能是真的没有代码），执行完后a=a+1(a++的意思就是a=a+1，a++和++a的意思不同，要注意)（即a=2）。这里是第一次循环。  第二次循环：当a=2时，如果a<6为真，则执行代码（和第一次循环一样），执行完后a=a+1，即a=3。 第三次循环：当a=3时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=4。 第四次循环：当a=4时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=5。 第五次循环：当a=5时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=6。 第六次循环：当a=6时，a<6为假，此时直接跳出循环，for下面的代码不会执行，a也不会继续加一，此时a=6。  然后到for(b=0;b<a;b++)，这里楼主没说有没有在上面那个for的嵌套内....我很为难啊，我就假设没有在嵌套内吧....那么此时a=6代入循环内。 第一次循环：当b=0时，如果b<6为真，则执行代码，执行完后b=b+1，即b=1。（第一次赋值） 第二次循环：当b=1时，如果b<6为真，则执行代码，执行完后b=b+1，即b=2。（第二次赋值） 第三次循环：当b=2时，如果b<6为真，则执行代码，执行完后b=b+1，即b=3。（第三次赋值） 第四次循环：当b=3时，如果b<6为真，则执行代码，执行完后b=b+1，即b=4。（第四次赋值） 第五次循环：当b=4时，如果b<6为真，则执行代码，执行完后b=b+1，即b=5。（第五次赋值） 第六次循环：当b=5时，如果b<6为真，则执行代码，执行完后b=b+1，即b=6。（第六次赋值） 第七次循环：当b=6时，b<6为假，此时直接跳出循环。这里就没有再赋值了。 所以b被赋值了6次  假设b循环在a循环的嵌套内，为了方便楼主理解，我写了代码如下： #include <stdio.h>  int main() {         int a,b;         int cnt=0;                  //cnt是用来计数的。         for (a=1; a<6; a++)         {             for(b=0; b<a; b++)             {                 cnt++;             //每执行一次循环，cnt就加1             }         }         printf("cnt=%d\n", cnt);    //最后输出cnt结果是15          return 0; }  至于三个for嵌套...一样的道理，实在不懂麻烦楼主举个例子。 不要告诉我你没看懂..... 哦，辛苦你了，这个问题我一开始很懵，因为看到csdn有人说是嵌套循环for由内而外(最开始为外，嵌套for为内)，标题已经说明循环嵌套for，我看了你解释完全明白了，由内而外虽说不错、实质上并非是这样。谢谢你了

user: user-2
content: 下次希望楼主问问题能写得详细点，可以的话把代码全部写上...不要让我们去猜...  因为楼主没说a和b的类型，我假设a和b都是int类型。 for(a=1; a<6; a++)      这段代码的意思是：当a=1时，如果a<6为真，则执行for下面的一段代码（这里楼主没有把代码写上。也可能是真的没有代码），执行完后a=a+1(a++的意思就是a=a+1，a++和++a的意思不同，要注意)（即a=2）。这里是第一次循环。  第二次循环：当a=2时，如果a<6为真，则执行代码（和第一次循环一样），执行完后a=a+1，即a=3。 第三次循环：当a=3时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=4。 第四次循环：当a=4时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=5。 第五次循环：当a=5时，如果a<6为真，则执行代码（和上面一样），执行完后a=a+1，即a=6。 第六次循环：当a=6时，a<6为假，此时直接跳出循环，for下面的代码不会执行，a也不会继续加一，此时a=6。  然后到for(b=0;b<a;b++)，这里楼主没说有没有在上面那个for的嵌套内....我很为难啊，我就假设没有在嵌套内吧....那么此时a=6代入循环内。 第一次循环：当b=0时，如果b<6为真，则执行代码，执行完后b=b+1，即b=1。（第一次赋值） 第二次循环：当b=1时，如果b<6为真，则执行代码，执行完后b=b+1，即b=2。（第二次赋值） 第三次循环：当b=2时，如果b<6为真，则执行代码，执行完后b=b+1，即b=3。（第三次赋值） 第四次循环：当b=3时，如果b<6为真，则执行代码，执行完后b=b+1，即b=4。（第四次赋值） 第五次循环：当b=4时，如果b<6为真，则执行代码，执行完后b=b+1，即b=5。（第五次赋值） 第六次循环：当b=5时，如果b<6为真，则执行代码，执行完后b=b+1，即b=6。（第六次赋值） 第七次循环：当b=6时，b<6为假，此时直接跳出循环。这里就没有再赋值了。 所以b被赋值了6次  假设b循环在a循环的嵌套内，为了方便楼主理解，我写了代码如下： #include <stdio.h>  int main() {         int a,b;         int cnt=0;                  //cnt是用来计数的。         for (a=1; a<6; a++)         {             for(b=0; b<a; b++)             {                 cnt++;             //每执行一次循环，cnt就加1             }         }         printf("cnt=%d\n", cnt);    //最后输出cnt结果是15          return 0; }  至于三个for嵌套...一样的道理，实在不懂麻烦楼主举个例子。 不要告诉我你没看懂.....
user-0 提问: 图片是一个练习作业

回复:
user: user-1
content: 解释起来相当麻烦...简单举个例子吧  a                          ————二维数组首元素的地址（每个元素都是内含4个int类型元素的一维数组） a+2                      ————二维数组的第3个元素（即一维数组）的地址 *（a+2）              ————二维数组的第3个元素（即一维数组）的首元素（一个int类型的值）地址 *（a+2）+1         ————二维数组的第3个元素（即一维数组）的第2个元素（也是一个int类型的值）地址 *（（*a+2）+1） ————二维数组的第3个一维数组元素的第2个int类型元素的值，即数组的第3行第2列的值（a[2][1]）  如果不懂的话不要追问，解释起来太费劲。建议看书或者等其他大佬
user-0 提问: 好几个C语言表达式看不懂

回复:
user: user-0
content: 明白了感谢

user: user-1
content: 三目，逻辑非，递增

user: user-2
content: 引用 2 楼 m0_47292308 的回复：[quote=引用 1 楼 weixin_45906870的回复:]第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么... 图二代码 a=1,b=0; if(!a)b++;//这个表示什么为什么判断是假 [/quote]if（a）的意思是如果a不是零，就执行b++ 感叹号表示否定，所以if（！a）意思是如果a是零，所以判断为假

user: user-2
content: 引用 3 楼 m0_47292308 的回复：[quote=引用 2 楼 m0_47292308的回复:][quote=引用 1 楼 weixin_45906870的回复:]第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么... 图二代码 a=1,b=0; if(!a)b++;//这个表示什么为什么判断是假 [/quote] 你再看看，为啥提示答案为三(这是在一本书上看到)[/quote]答案错了吧

user: user-3
content: 编译运行k=5

user: user-0
content: 引用 2 楼 m0_47292308的回复:[quote=引用 1 楼 weixin_45906870的回复:]第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么... 图二代码 a=1,b=0; if(!a)b++;//这个表示什么为什么判断是假 [/quote] 你再看看，为啥提示答案为三(这是在一本书上看到)

user: user-0
content: 引用 1 楼 weixin_45906870的回复:第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么... 图二代码 a=1,b=0; if(!a)b++;//这个表示什么为什么判断是假

user: user-2
content: 第一张图我写了代码如下： #include <stdio.h>  int main() {         int a=1,b=2,c=3,d=4,e=5;         int k;         k = a>b?c:d>e?d:e;         printf("k = %d\n", k);          return 0; } 编译后 k=5 对于条件表达式b ? x : y，先计算条件b，然后进行判断。如果b的值为true，计算x的值，运算结果为x的值；否则，计算y的值，运算结果为y的值。一个条件表达式绝不会既计算x，又计算y。条件运算符是右结合的，也就是说，从右向左分组计算。例如，a ? b : c ? d : e将按a ? b : (c ? d : e)执行。 <表达式1> ? <表达式2> : <表达式3>; "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。  第二张图没看懂你想问什么...
user-0 提问: c 

回复:
user: user-1
content: 先判断(y--)这个整体与-1比较，然后再算--。

user: user-2
content: 后置++或--，是先原数，然后再自增（自减）比如这个 while(y-- !=-1），先判断y != -1,然后y--。下次循环的时候y是--后的值了。

user: user-3
content: 这是y--的设计，先做事，再--
user-0 提问: 程序是用来将用户输入的字母与数字混合的电话号码变为纯数字的，但程序在输出电话号码时确只输出一个空格是怎么回事？？？还有一点，这个CSDN分数怎么给？？

回复:
user: user-1
content: 先把char letter[i]改成letter[15]，再去看别的问题
user-0 提问: 数据结构问题求助

回复:
user: user-1
content: printGraph时不要用 G->verts[i].firstedge=G->verts[i].firstedge->next 的方式来遍历下一个节点，你这样就会覆盖G->verts[i].firstedge的信息，原来的信息就丢失了，只剩下最后邻接点NULL，所以第二次就打印不了了。 用个临时指针变量来遍历，即  for(i=0; i<G->vertNum; i++){ printf(“%d %c    “, i, G->verts[i].vertinfo); edgeNode *p = G->verts[i].firstedge;//用临时变量p来遍历 while(1){ if(p==NULL) { printf(“^”); break; } printf(“%d->”, p->adjvert); p=p->next; //用临时变量，不会覆盖G->verts[i].firstedge原来的信息 } printf(“\n”); }
user-0 提问: fgetc和getc这两个函数有什么区别？？

回复:
user: user-0
content: 引用 3 楼 chxchxkkk 的回复：楼主真勤奋，3点多还没睡觉学的不好，太焦虑了

user: user-1
content: 楼主真勤奋，3点多还没睡觉

user: user-2
content: 函数和宏的区别，建议查查。多自己动手吧，遇到问题不要着急一点一点的去搜索和研究，需要多花时间和经历。

user: user-3
content: 两个的功能是完全一样的  从文件中读取字符，只是两个函数的定义上不同而已。一般来说，getc比fgetc读取速度快吧 没必要深究  int fgetc(FILE*stream) #define getc(_stream)(--(_stream)->_cnt>=0?0xff&*(_stream)->_ptr++:_filbuf(_stream))
user-0 提问: 如何将一个端口上收到的包转发到另外一个端口

回复:
user: user-0
content: 报文太大的话raw socket用sendto发不过去。

user: user-1
content: 如果网络程序简单，可以试试端口转发。无非tcp 连接 tcp监听。来回捣数据。recv数据直接send给另一端。 参考lcx

user: user-1
content: 你要开发虚拟网卡驱动的节奏。
user-0 提问: 数组中数字右移问题

回复:
user: user-1
content: 这样写最简单吧  你的太晕了看的 void rotateArray(int *a, int n, int k) {     int s[10];     for(int i=0;i<n;i++){         if(i+k>9){             s[(i+k)%10] = a[i];         }         else         {             s[i+k] = a[i];         }     }     for(int i=0;i<10;i++){         a[i] = s[i];     } }

user: user-2
content: 按照你的思路也可以  void rotateArray(int *a,int n,int k) { 	for(int i=0;i<k;i++) 	{ 		int temp = a[n-1]; 		for(int j=n-1;j>0;j--) 		{ 			a[j]=a[j-1];		 		} 		a[0]=temp; 	} }

user: user-2
content: 给一个简单的方式 void rotateArray(int *a,int n,int k) { 	int *temp = new int[n]; 	memcpy(temp,a+(n-k),sizeof(int) * k); 	memmove(a+k,a,sizeof(int) * (n-k)); 	memcpy(a,temp,sizeof(int) * k); 	delete []temp; }

user: user-3
content: void rotateArray(int* a, int n, int k) {         int* left = new int[k];     int* right = new int[n - k];     memcpy(left, a + (n - k), sizeof(int) * k);     memcpy(right, a, sizeof(int) * (n - k));     memcpy(a, left, sizeof(int) * k);     memcpy(a + k, right, sizeof(int)*(n - k)); }

user: user-0
content: 引用 2 楼 user-4的回复:pre_temp=*a;  a在这里应该是数组吧，这一句应该不对。 要怎么改呢，不太会指针

user: user-0
content: 引用 1 楼 Simple-Soft的回复:你的目的是要做什么？你的右移函数里面本身并没有改变数组本身 比如说输入1 2 3 4 5 6 7 8 9 0 然后输入4 得到7 8 9 0 1 2 3 4 5 6

user: user-4
content: pre_temp=*a;  a在这里应该是数组吧，这一句应该不对。

user: user-2
content: 你的目的是要做什么？你的右移函数里面本身并没有改变数组本身
user-0 提问: C语言函数 关于素数判断

回复:
user: user-0
content: 引用 10 楼 @大愚@的回复:质数是只能被1和他本身整除。假设是p = 39,在执行for循环的语句块，在执行if语句但if语句不满足，执行else。你的程序就说p是质数但39不是，所以你应该把else里的语句块应该放在for循环的外面. 我懂了谢谢你

user: user-1
content: 质数是只能被1和他本身整除。假设是p = 39,在执行for循环的语句块，在执行if语句但if语句不满足，执行else。你的程序就说p是质数但39不是，所以你应该把else里的语句块应该放在for循环的外面.

user: user-0
content: 引用 6 楼 真相重于对错的回复:if(p%i==0)  reutrn 0； 不要break ,因为break 就跳出循环了，而不会返回。 懂了懂了懂了谢谢谢谢

user: user-0
content: 引用 9 楼 爱流王的回复:for(i=2;i<=p;i++) {     if(p%i==0)     {             break;             return 0;     }     else             return  1; }  你这个for循环不管咋样都只能执行一次呀 了解了了解了谢谢你谢谢你

user: user-2
content: 引用 7 楼 qq_46521413 的回复:[quote=引用 6 楼 真相重于对错的回复:]if(p%i==0)  reutrn 0； 不要break ,因为break 就跳出循环了，而不会返回。 对的啊 如果等于零的话，我们跳出循环就可以了，因为它就一定不是素数了呀[/quote]因为你没有return 所以在现代一点儿编译器会报错。 老的编译将是返回一个不确定的值，那么在外层怎么知道到是，还是不是。

user: user-0
content: 引用 6 楼 真相重于对错的回复:if(p%i==0)  reutrn 0； 不要break ,因为break 就跳出循环了，而不会返回。 对的啊 如果等于零的话，我们跳出循环就可以了，因为它就一定不是素数了呀

user: user-2
content: if(p%i==0)  reutrn 0； 不要break ,因为break 就跳出循环了，而不会返回。

user: user-0
content: 引用 4 楼 Simple-Soft的回复:把源代码文件发给我，我帮你改一下qq 3405187170 不用麻烦您了 您告诉我哪里有漏洞就好了 我自己改 感觉我就是漏掉了某一种情况

user: user-3
content: 把源代码文件发给我，我帮你改一下qq 3405187170

user: user-0
content: 引用 1 楼 Simple-Soft的回复:不能等于p，小于p 对的对的，应该是不能等p，但是还是有问题

user: user-0
content: 引用 1 楼 Simple-Soft的回复:不能等于p，小于p 你这个问题我已经改过了，但是问题那不在这，因为我把等号去掉的话还是不对

user: user-3
content: 不能等于p，小于p

user: user-4
content: for(i=2;i<=p;i++) {     if(p%i==0)     {             break;             return 0;     }     else             return  1; }  你这个for循环不管咋样都只能执行一次呀
user-0 提问: vs2010  C语言键盘录入

回复:
user: user-0
content: 因为要回车，回车符也是一个字符

user: user-1
content: printf("请输入性别m/f:"); scanf("%c",&gender); scanf("%c",&gender); 这里为啥要输入两遍呢

user: user-2
content: 有两个地方有错，第一个地方可以这样改 	scanf("%15lf",&sal); 第二个地方printf的地方错了，gender=%s要改成gender=%c
user-0 提问: 关于写文件的问题

回复:
user: user-0
content: 我好像知道了，a参数我之前以为是打开文件后写入的位置是文件的最后，但是这个位置是固定的；实际上这个位置是会变的，如果打开文件后，有其他程序向该文件加入了内容，那么当写入时，会自动写入到其他程序添加的内容后面，这个好像是a参数自动实现的，这个之前真的没注意过

user: user-0
content: 引用 1 楼 宾灬 的回复:这个你得去了解写入文件时的内部实现原理了，也许在实现上保证了原子性。 关键是这是打开写入两步操作，就算写入是原子的，那打开的时候是各自打开各自的，线程打开文件的位置应该是相同的啊，难道是参数a会在其他线程写入数据时自动后移？？？

user: user-0
content: 引用 2 楼 自信男孩 的回复:你把文件打开和关闭放到父线程里试试，其他线程只操作写操作，我想这样就会复现你说的会有覆盖问题吧 这样应该更不会啊，这样的话缓冲区只有一个，每个线程都是往后面加入数据，所以不会出现覆盖。也许是因为用的a参数的原因

user: user-1
content: 你把文件打开和关闭放到父线程里试试，其他线程只操作写操作，我想这样就会复现你说的会有覆盖问题吧

user: user-2
content: 这个你得去了解写入文件时的内部实现原理了，也许在实现上保证了原子性。
user-0 提问: 函数递归调用的参数问题

回复:
user: user-0
content: 引用 9 楼 真相重于对错的回复:计算机学科，往好里说是一个比较严谨的学科，不好里说它比较死性，差一点都不成。你多一个分号，一个字母，一个括号，它都会认为你是错误的。 所以，不能体会这样的细微差别的人，我的意见是，最好不要入行。你不太适合这个行业。 受教了，感谢批评

user: user-1
content: 计算机学科，往好里说是一个比较严谨的学科，不好里说它比较死性，差一点都不成。你多一个分号，一个字母，一个括号，它都会认为你是错误的。 所以，不能体会这样的细微差别的人，我的意见是，最好不要入行。你不太适合这个行业。

user: user-0
content: 引用 7 楼 真相重于对错 的回复:如果还不明白？ 那拿个具体的数来说： 比如： deep=1; Weight_BN(t->lchild,deep+1); Weight_BN(t->rchild,deep+1); 相当于 Weight_BN(t->lchild,2); Weight_BN(t->rchild,2); ============================ Weight_BN(t->lchild,++deep); Weight_BN(t->rchild,++deep); 相当于 Weight_BN(t->lchild,2); Weight_BN(t->rchild,3); 有一点懂了，那如果下层再嵌套调用，会不会是这样 Weight_BN(t->lchild,++deep); Weight_BN(t->rchild,++deep); Weight_BN(t->lchild,2); { Weight_BN(t->lchild,4); Weight_BN(t->rchild,5) } Weight_BN(t->rchild,3) { Weight_BN(t->lchild,6); Weight_BN(t->rchild,7) }会这样吗

user: user-1
content: 如果还不明白？ 那拿个具体的数来说： 比如： deep=1; Weight_BN(t->lchild,deep+1); Weight_BN(t->rchild,deep+1); 相当于 Weight_BN(t->lchild,2); Weight_BN(t->rchild,2); ============================ Weight_BN(t->lchild,++deep); Weight_BN(t->rchild,++deep); 相当于 Weight_BN(t->lchild,2); Weight_BN(t->rchild,3);

user: user-1
content: 因为只有一个ma。

user: user-1
content: Weight_BN(t->lchild,deep+1);//这里如果是++deep Weight_BN(t->rchild,deep+1);//这里的deep就是会是上一个函数参数加一，也就是没有遍历同一层的数据，因此出错。

user: user-1
content: ++deep，deep本身改变，deep+1，deep本身不改变。

user: user-2
content: 看起来这儿苏湖是没有问题，你可以在函数入口输出一下deep的值看看，看两种情况下有什么差别

user: user-0
content: 引用 1 楼 user-2 的回复:看起来这儿苏湖是没有问题，你可以在函数入口输出一下deep的值看看，看两种情况下有什么差别 引用 3 楼 真相重于对错 的回复:Weight_BN(t->lchild,deep+1);//这里如果是++deep Weight_BN(t->rchild,deep+1);//这里的deep就是会是上一个函数参数加一，也就是没有遍历同一层的数据，因此出错。 像这个++k,就没事，可是到了树里面就不行了

user: user-0
content: 引用 3 楼 真相重于对错 的回复:Weight_BN(t->lchild,deep+1);//这里如果是++deep Weight_BN(t->rchild,deep+1);//这里的deep就是会是上一个函数参数加一，也就是没有遍历同一层的数据，因此出错。 可是，++deep的话并没用到指针，递归不是系统内部堆栈吗，如果没通过指针的话，++deep从下一层返回的话，deep的值不应该会回来吗。遍历同一层的话，比如第一层是A,deep是1，然后递归调用到下一层的B，deep自增1,deep是2，再假设B的下一层是C,++deep不应该到了3吗。然后分别对应CC[deep]的值应该也变化啊，如果在递归回去，deep不是指针的话，B对应的deep不应该还是2吗，可是我测试了一下好像不是。诶，我感觉我知识好匮乏。
user-0 提问: 为什么我这二叉树的创建函数形参传参用指针会始终为空树，用引用就可以？

回复:
user: user-0
content: 引用 12 楼 @大愚@ 的回复:地址的地址???感觉有点问题？？？ 是我表述有问题

user: user-1
content: 地址的地址???感觉有点问题？？？

user: user-0
content: 引用 10 楼 @大愚@ 的回复:因为指针是指向变量的地址，操作指针只能改变地址，而不是变量本身。我也是才学这个数据结构，我感觉数据结构里的能用引用尽量不要用指针我想懂了，这里是改变的地址，相当于这个地址就是一个变量的值，所以要传递地址的地址过去

user: user-1
content: 因为指针是指向变量的地址，操作指针只能改变地址，而不是变量本身。我也是才学这个数据结构，我感觉数据结构里的能用引用尽量不要用指针

user: user-2
content: 地址相当于银行卡，它指向的内存相当于银行账户。传递给函数相当于你把这个银行卡的副卡给了你家人，你家人往副卡里面存钱，钱会到达你的账户。但是副卡是副卡，主卡是主卡。你家人修改副卡的账号是不管用的。  其实就是实参与形参是两个东西，但是指向了同一个内存地址。通过指向才做到参数的双向传递。

user: user-0
content: 引用 7 楼 @大愚@ 的回复:引用就是变量的别名，操作这个别名就是操作这个变量就是这个树，而指针不能直接访问这个树为什么指针不能直接访问？我之前写链表都是用指针没有用过引用，如果是纯C，没有引用该怎么办

user: user-1
content: 引用就是变量的别名，操作这个别名就是操作这个变量就是这个树，而指针不能直接访问这个树

user: user-0
content: 引用 3 楼 九华山小和尚 的回复:引用 2 楼 qq_24683975 的回复:[quote=引用 1 楼 九华山小和尚 的回复:] 我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白 你指的用指针是tree类型的*th还是ptree类型的*t。我用的是编译软件不支持引用类型，所以我都是用指针写的。[/quote]我用的指针是tree*

user: user-0
content: 引用 4 楼 九华山小和尚 的回复:引用 3 楼 九华山小和尚 的回复:[quote=引用 2 楼 qq_24683975 的回复:] [quote=引用 1 楼 九华山小和尚 的回复:] 我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白 你指的用指针是tree类型的*th还是ptree类型的*t。我用的是编译软件不支持引用类型，所以我都是用指针写的。[/quote] 不过你这个创建树的写法我还没试过，我也在复习树，我创建普通的二叉树的话都是用字符串创建的。你这个用来创建整形树挺好的。[/quote]我这个字符型也是可以的，我只是懒得写所以先用整型试试

user: user-3
content: 引用 3 楼 九华山小和尚 的回复:引用 2 楼 qq_24683975 的回复:[quote=引用 1 楼 九华山小和尚 的回复:] 我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白 你指的用指针是tree类型的*th还是ptree类型的*t。我用的是编译软件不支持引用类型，所以我都是用指针写的。[/quote] 不过你这个创建树的写法我还没试过，我也在复习树，我创建普通的二叉树的话都是用字符串创建的。你这个用来创建整形树挺好的。

user: user-3
content: 引用 2 楼 qq_24683975 的回复:引用 1 楼 九华山小和尚 的回复:我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白 你指的用指针是tree类型的*th还是ptree类型的*t。我用的是编译软件不支持引用类型，所以我都是用指针写的。

user: user-0
content: 引用 1 楼 九华山小和尚 的回复:我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗怎么会一直往左边创建呢，输入0的时候就结束了然后转右边递归创建啊，我刚刚学到这里，但是不用引用就会出错搞不明白

user: user-3
content: 我感觉你这颗树会一直往左边创建。你这是创建什么树啊二叉排序树吗
user-0 提问: 结构体指针转为数组的问题

回复:
user: user-0
content: 引用 5 楼 自信男孩 的回复：&master[1]等价(master + 1); 如果master是一个数组，那么&master[i]就是下表为1的地址。  但是前提是master需要申请空间，否则这样操作可能会出现段错误。因为master还是一个野指针。正解

user: user-1
content: &master[1]等价(master + 1); 如果master是一个数组，那么&master[i]就是下表为1的地址。  但是前提是master需要申请空间，否则这样操作可能会出现段错误。因为master还是一个野指针。

user: user-2
content: 引用 3 楼 真相重于对错 的回复:[quote=引用 2 楼 宾灬 的回复:] 所有的数据在内存中都是字节序列。 master和&master[0]是一样的。 &master[1] 表示从master开始的第二个字节的地址 不对哦，master[1]相当于master+1,因为master是spi_master类型，所以每次+1，相当于指针从master向后移动sizeof(spi_master)个字节[/quote] 是的。

user: user-3
content: 引用 2 楼 宾灬 的回复:所有的数据在内存中都是字节序列。 master和&master[0]是一样的。 &master[1] 表示从master开始的第二个字节的地址 不对哦，master[1]相当于master+1,因为master是spi_master类型，所以每次+1，相当于指针从master向后移动sizeof(spi_master)个字节

user: user-2
content: 所有的数据在内存中都是字节序列。 master和&master[0]是一样的。 &master[1] 表示从master开始的第二个字节的地址

user: user-4
content: 取master的下标为1的地址，我是这么理解的