Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: c语言编程

回复:
user: user-1
content: 2.利用指针和函数完成对任意长度的数组A进行升序排序，  要求：随机生成n（n<10）个小于100的整数存放到数组中；      排序过程采用函数，函数声明参照void paixu(int *p,int  n);       排序算法自选；   程序设计中采用指针进行处理。  提示：头文件 #include <stdlib.h>           #include<time.h>        随机数时间种子函数srand(),调用方法为srand(time(0))。保证每一次执行都产生不相同的随机数。        随机数函数rand();产生0-65535间的随机整数

user: user-0
content: 此贴等删，以为这个app和百度知道一样是用来求助的，没想学什么编程，就是帮人问个题，没想到各位大神都高攀不起，算了吧

user: user-2
content: 不麻烦。见到这种伸手贴，当然是举报啦！

user: user-0
content: 引用 3 楼 weixin_45007129的回复:[quote=引用 2 楼 伊卿_的回复:][quote=引用 1 楼 weixin_45007129的回复:]已经举报纯伸手帖了。建议管理员及早删除，谢谢！ 刚来不太懂  怎么样不是纯伸手？给钱吗？[/quote] 自己应该先尝试写写，测试或者调试啊。遇到了什么具体问题再把代码摆出来，把问题提出来，大家再帮你看看，出主意啊！ 谁也不是闲得跑技术论坛里花时间白白帮别人做题啊！[/quote] ok  麻烦您了  非常感谢  我不会删帖  要不自己删了  麻烦您举报了

user: user-0
content: ok  麻烦您了  非常感谢  我不会删帖  要不自己删了  麻烦您举报了

user: user-2
content: 引用 2 楼 伊卿_的回复:[quote=引用 1 楼 weixin_45007129的回复:]已经举报纯伸手帖了。建议管理员及早删除，谢谢！ 刚来不太懂  怎么样不是纯伸手？给钱吗？[/quote] 自己应该先尝试写写，测试或者调试啊。遇到了什么具体问题再把代码摆出来，把问题提出来，大家再帮你看看，出主意啊！ 谁也不是闲得跑技术论坛里花时间白白帮别人做题啊！

user: user-0
content: 引用 1 楼 weixin_45007129的回复:已经举报纯伸手帖了。建议管理员及早删除，谢谢！ 刚来不太懂  怎么样不是纯伸手？给钱吗？

user: user-2
content: 已经举报纯伸手帖了。建议管理员及早删除，谢谢！
user-0 提问: c语言编程

回复:
user: user-1
content: 引用 2 楼 伊卿_ 的回复:此贴等删，以为这个app和百度知道一样是用来求助的，没想学什么编程，就是帮人问个题，没想到各位大神都高攀不起，算了吧 问问题不是你这样问的，你这直接是抛个题目出来，让别人帮你做，敢情这个论坛上的人都是帮人代写作业的？你要是没思路可以问，代码错了也可以问，我敢说有很多人有耐心帮你，但你要当个甩手掌柜，不好意思，出门右拐（话糙理不糙）

user: user-0
content: 此贴等删，以为这个app和百度知道一样是用来求助的，没想学什么编程，就是帮人问个题，没想到各位大神都高攀不起，算了吧

user: user-2
content: 已经举报纯伸手帖了。建议管理员及早删除，谢谢！
user-0 提问: 写一个圣诞树瞧一瞧！！

回复:
user: user-0
content: 引用 2 楼 挚久。 的回复：有点可爱呐谢谢啦

user: user-0
content: 引用 1 楼 636f6c696e 的回复：但现在是五月份哎嘻嘻，可以再写一个花给你呀

user: user-1
content: 有点可爱呐

user: user-2
content: 但现在是五月份哎

user: user-3
user-0 提问: C语言程序中

回复:
user: user-1
content: 建议你看看程序是否在执行中：  #incude <stdio.h> #include <math.h> void main() { int i=1,b=1; float x,a,c,s=0.0; scanf("Pls input x & c:%f,%f",&x,&c); a=x; printf("x=%f,c=%f\n",x,c); while(fabs(a/b)>=c) { s+=(a/b); a*=-1*x*x; b*=2*i*(2*i+1); printf("The %d cycle. \n",i ); i++; } }

user: user-1
content: 你这个while的条件很可能是一直满足的。如果一直满足，循环是不会终止，也就不会走到printf中去。

user: user-2
content: 你输入的x和c分别是什么值？这个要根据你的输入来决定是否执行while的

user: user-3
content: 有可能是在死循环中了。
user-0 提问: 求助fopen

回复:
user: user-1
content: 优先级的问题，因为赋值优先级比==要低，所以先fopen() == NULL,然后把比较结果赋值给fp，这就是为什么fp得到的不是文件指针了。 解决方法是加括号：  if ((fp = fopen()) == NULL)

user: user-2
content: 圆括号的位置括错了！应该是  if ((fp = fopen("1.txt", "r")) == NULL)   图片里的代码， if ((fp = fopen("1.txt", "r") == NULL))   等于是（1）先做 比较运算，（2）再做赋值运算。而第（1）步比较运算后的结果是 bool 类型， 不能被 转换成 FILE * 类型 赋值给 fp 。所以，出错。 ～ 如有帮助，欢迎 及时结帖、给分！ ：） ～

user: user-3
content: 这叫编译错误。 if((fp = if((fp = fopen(filename, “r”)==NULL)) 编译错误在于把一个bool类型赋值给FILE *类型的fp

user: user-4
content: 先来看看你写的代码是：if((fp = if((fp = fopen(filename, “r”)==NULL)) 首先你这个括号都不匹配，代码累赘了；修改为 if((fp = fopen(filename, “r”)==NULL)) 其次，你没有考虑到运算符的优先级问题；关系运算符的优先级高于赋值运算符，所以上面的写法，会先算 fopen(filename, “r”)==NULL，得到的是一个bool型的值，然后再把这个值赋给文件类型的fp，肯定就报错了！ 所以应该修改为： if((fp = fopen(filename, “r”)）==NULL)就可以了，先赋值再判断是否到文件的结尾！
user-0 提问: 这个程序na里出错了？？？

回复:
user: user-1
content: 首先，看你这个程序就是死循环，因为*buf永远不会为NULL，有以下几点原因： 1、*buf是指的是该地址里存储的数据的值，这里它指向的是字符串的字符； 2、字符串是以'\0'为结束符，而不是以NULL为结束符，这点不要弄混淆了！ 你出现这个错误，是对某些概念没有真正的掌握，希望多看一些基础知识的文章，多学一学，我也写过。欢迎交流学习 修改后的代码如下：   #include <stdio.h> int main() {     char *buf = "hello linux";     while(*buf != '\0'){         printf("%c",*buf++);     }     return 0; }

user: user-2
content: 死循环了  while(*buf){         printf("%c",*buf++);     } 改成这样  buf是指向字符串常量，是一直不会指向NULL的。

user: user-3
content: 指针 buf 被使用的值是它存储的 地址值，而 *buf 才是它存储的地址值上的数据的值。不要混淆概念！ 欢迎结帖、给分！：） ～

user: user-0
content: 引用 5 楼 赵4老师 的回复：不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。感谢

user: user-4
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-5
content: buf++永远不可能是空  #include <stdio.h> int main() {     char *buf = "hello linux";     while(*buf != '\0'){         printf("%c",*buf++);     }     return 0; }

user: user-0
content: 引用 2 楼 user-6 的回复：while(buf != NULL){  你判断一个指针是不是NULL 做什么?我想遍历一下这个字符串，\0 为结束标志，觉得等于NULL挺对的啊

user: user-6
content: while(buf != NULL){  你判断一个指针是不是NULL 做什么?

user: user-0
content: 各位大佬帮帮我
user-0 提问: 江湖救急

回复:
user: user-1
content: 题意要求统计名字出现的次数，而且还不能改变姓名的输出顺序，从中可以看出姓名和次数有一个对应关系，所以这里用了一个map<string,int>mp的对应关系；然后要考虑如何存放姓名，这里用了一个vector数组，注意vector存放的姓名不能重复，因此可以根据当前姓名对应的次数来控制，当次数为1的时，说明是第一次出现，此时才把该姓名放入vector数组中。 接下来就是简单的查找姓名的最多票数，然后在vector中找到票数最多的姓名，这里就是简单的vetor的一些操作！  整个题很注重思维逻辑，一定要清晰，道友可以看看这篇文章，https://blog.csdn.net/weixin_43956598/article/details/90049508，或许对你有帮助 弄清楚整个过程后，可以用代码实现了，代码如下（包括注释）：如果有什么不懂，可以问我哦！  #include<iostream> #include<vector> #include<map> using namespace std; int main() { 	int m,i; 	string str;//姓名字符串 	map<string,int>mp;//姓名和出现的次数的对应关系 	vector<string>v;//定义一个存放姓名的数组 	cin>>m;//输入投票数  	mp.clear();//map初始化 	v.clear();//vector初始化 	vector<string>::iterator iter;//定义vector的迭代器 	getchar();//因为后面是行读入，会接收输入m后的回车符，所以需要用getchar()吸收掉！ 	for(i=0; i<m; i++) { 		getline(cin,str);//输入票上的名字，由于有空格，采用gets的输入 		mp[str]++;//姓名对应的次数加1 		if(mp[str]==1)//表明是第一次出现，就存放入vector数组 			v.push_back(str); 	} 	int max=0;//初始化次数 	//找到最多的次数 	for(iter=v.begin(); iter!=v.end(); iter++) { 		if(mp[*iter]>max) 			max=mp[*iter]; 	} 	cout<<max<<endl;//输出最多的次数 	//输出出现最多次数的名字 	for(iter=v.begin(); iter!=v.end(); iter++) { 		if(mp[*iter]==max) 			cout<<*iter<<endl; 	} 	return 0; } /* 输入样例 8 Li ming Fang fang Lim ing Zhang ling Li ming Li na Zhang ling Wang liang 输出样例： 2 Li ming Zhang ling */

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  struct person{     char name[20];     int num; };  int main() {     struct person people[100];     int n,m=0,i,j,num=0;     char name[20];     scanf("%d",&n);     for(i=0;i<n;i++)     {         gets(name);         for(j=0;j<num;j++)         {             if(strcmp(name,people[j].name)==0)             {                 people[j].num++;                 if(people[j].num==2)                     m++;                 break;             }         }         if(j==num)         {             num++;             strcpy(people[num].name,name);             people[num].num=1;         }     }     printf("%d",m);     for(i=0;i<num;i++)     {         if(people[i].num>=2)             printf("%s\n",people[i].name);     }     return 0; }
user-0 提问: linux多线程问题

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

user: user-1
content: 结构体数组不就好了，每个线程对应一个不同的arg。 struct argument arg1[count];  引用 5 楼 qq_37287599 的回复:那应该怎么改呢

user: user-0
content: 申请空间再释放嘛

user: user-0
content: 那应该怎么改呢

user: user-1
content: 还有你的问题在于pthread_create创建传入的是地址，因此外部修改后，里面的值也是会更新的 引用 2 楼 qq_37287599 的回复:int k=0; 2695     for(int i=0;i<thread_count&&k<ctb_row;i++){ 2696         struct argument arg1; 2697         arg1.avctx=avctxt; 2698         arg1.input_row=k; 2699         arg1.thread_id=i; 2700         av_log(s->avctx, AV_LOG_WARNING, "Thread %d perpare to create.\n",i     ); 2701  2702         if((pthread_create(&thread[i],NULL, hls_decode_1,&(arg1)))!=0){ 2703             av_log(s->avctx, AV_LOG_WARNING, "Thread %d error created.\n",i     ); 2704             return AVERROR_INVALIDDATA; 2705  2706         } 2707         k++; 2708     }  想问下这样创建线程有问题吗为什么第一个线程的input_row值变成1了

user: user-1
content: b xxx thread xxx 如果断点函数被多个线程调用，请用线程断点

user: user-0
content: int k=0; 2695     for(int i=0;i<thread_count&&k<ctb_row;i++){ 2696         struct argument arg1; 2697         arg1.avctx=avctxt; 2698         arg1.input_row=k; 2699         arg1.thread_id=i; 2700         av_log(s->avctx, AV_LOG_WARNING, "Thread %d perpare to create.\n",i     ); 2701  2702         if((pthread_create(&thread[i],NULL, hls_decode_1,&(arg1)))!=0){ 2703             av_log(s->avctx, AV_LOG_WARNING, "Thread %d error created.\n",i     ); 2704             return AVERROR_INVALIDDATA; 2705  2706         } 2707         k++; 2708     }  想问下这样创建线程有问题吗为什么第一个线程的input_row值变成1了

user: user-2
content: 出什么错？贴代码。
user-0 提问: 菜鸟问题 输入二个整数，输出二个整数的按位与、按位或、按位异或以及各自按位取反的值。

回复:
user: user-1
content: 其实这个就是关系运算符的基础知识，可以看看这方面的知识

user: user-0
content: 引用 楼主 weixin_45058578的回复:C语言  输入二个整数，输出二个整数的按位与、按位或、按位异或以及各自按位取反的值。 谢谢大家 还有一题  输入一个整数，分别输出该数向左、右移位1,2,4,8位的值，输出该数乘、除2,4,16,256的值。并进行比较

user: user-2
content: a&b a|b a^b ~a ~b
user-0 提问: 求帮忙解决二维数组的段错误

回复:
user: user-1
content: 正如 1 楼所言，确实是下面这段代码   				for (i = 0; i < N; i++) { 					sum += A[i][k] * B[k][j]; 				} 				C[i][j] += sum;  的 C[i][j] += sum;导致了内存访问段错误。 前面的 for 循环结束后， 变量 i 的值是 1000 ， j 的值 是 0 ， C[1000][0] 是一个未定义 / 不确定 的内存位置。 具体来说，从调试情况看到，每次运行代码，C[1000][0] 所指向的地址值都是 0x0 ，所以才导致了 段错误。 ~

user: user-2
content: 根据gdb信息可以看到  (gdb) bt full #0  0x000000000040098b in jki () at arr.c:51         i = 1000         j = 0         k = 0         t = 0         A = 0xe02420         B = 0xe04370         C = 0xe062c0         sum = 1000         time = {0, 0, 0, 0, 0, 0, 0, 0, 4.9406564584124654e-324, 2.0737778020816105e-317}         c1 = 11168         c2 = 0         sum1 = 6.9533558074899489e-310 #1  0x0000000000400ba7 in main () at arr.c:76   ，代码51行   C[i][j] += sum;    这里的下表 i 是跳出循环后的值，i = 1000.  这样产生了溢出访问，产生段错误。
user-0 提问: 新人一枚，刚学c，大家看看这是怎么回事

回复:
user: user-1
content: 程序代码中%d的位置没有写入输出的变量，可以修改为：int a=3; printf("%d\r\n",a);

user: user-2
content: 楼主你写的是printf（“d%，12+113”）； 换成printf（“d%”，12+113）；试试

user: user-3
content: 我会用12种语言写这个程序，有需要请联系我，友情价。

user: user-4
content: printf函数用错了。 可以用别的函数试下

user: user-5
content: printf（）是输出，后面的“％d”是转换说明，转换成整形，然后输出后面的变量。假如是%f是输出浮点数等等……… 你可以试一下int a=2；printf（“a=%d”，a）；多输出不同东西就知道了

user: user-6
content: 先有输入，才有输出。 printf("请输入:\n"); scanf("%d\n",&s); printf("%d\n",s);

user: user-7
content: #include<stdio.h> int main() { 	int m=12,n=113,c; 	c=m+n; 	printf("%d",c);  }

user: user-8
content: 看不懂你要作什么

user: user-9
content: 你程序写错了吧

user: user-0
content: 好的！十分谢谢大家!我知道了是语法出问题，deudlonci

user: user-10
content: 引用 楼主 weixin_45060937的回复:编程不显示内容，请指教 为什么不能放大图片？在手机上看的很难受。

user: user-11
content: 你这个是输出语句的语法格式有问题，应该是printf(“%d\n”,12+13);可以看看我的输入输出函数的使用博文

user: user-11
content: 你的程序里面只有一条输出语句，并没有输入语句，当然什么都写不进去呀，可以看看这方面的文章

user: user-12
content: printf("%d",12+113);

user: user-13
content: 同萌新 进来看一眼~~~~

user: user-14
content: #include <stdio.h> void main () {     int a;     a=12+113;     printf("%d",a); }

user: user-0
content: 引用 3 楼 拥抱Linux的回复:上网随便搜一个在线编译器网页，把代码 粘贴进去运行试试看。如果有输出的话，很大可能是本地电脑上的编译器相关设置有问题，或者是什么权限方面的问题吧。如果没有输出的话，那就是代码有问题了。：- ） 好的！好的好的！谢谢

user: user-15
content: 上网随便搜一个在线编译器网页，把代码 粘贴进去运行试试看。如果有输出的话，很大可能是本地电脑上的编译器相关设置有问题，或者是什么权限方面的问题吧。如果没有输出的话，那就是代码有问题了。：- ）

user: user-0
content: 引用 1 楼 user-16的回复:你是想写 printf("%d",12+113); 吧 可是写什么都不显示

user: user-16
content: 你是想写 printf("%d",12+113); 吧
user-0 提问: 求解一道C语言题目，很着急，马上要交

回复:
user: user-1
content: 引用 楼主 Hero 的回复:用指向指针的指针的方法在主函数中输入五个字符串，查找指定的字符串，若找到返回1，找不到返回0，要求将查找指定字符串的过程单独写成一个函数，在主函数中将返回值打印输出，如果可以，前两题也可以帮看一下

user: user-0
content: 引用 2 楼 coningg的回复:看样子你是余沐霖大人的小弟吧 何以见得？难道你也是？

user: user-2
content: 看样子你是余沐霖大人的小弟吧

user: user-3
content: 这里是可以帮你定位和解决问题，而不是帮写作业的。
user-0 提问: 大佬们求助下

回复:
user: user-1
content: 引用 楼主 weixin_44948555的回复:编写一个C#程序，计算n的阶乘。这个该怎么弄 我是个新手，也在这里学习并尝试着回答问题，当我看到你这个问题，我感觉我会，但是C#是真的吗？这不是C社区吗？

user: user-2
content: 应该去c#的专区问吧

user: user-3
content: 这是c/c++版面
user-0 提问: “不允许指针指向不完整的类类型”问题出在哪？

回复:
user: user-1
content: // orgraph.c 中只包含了 type_orgraph.h 其中没有结构体实体定义  #include "type_orgraph.h" #include "orgraph.h"  // orgraph.c 中 type_orgraph.h 改成 struct_orgraph.h  #include "struct_orgraph.h" #include "orgraph.h"

user: user-2
content: //orgraph.h  #include type_orgraph.h  //orgraph.c  #include type_orgraph.h #include orgraph.h 相当于  #include type_orgraph.h #include type_orgraph.h 相当于 typedef struct edgelink EDGELINK;      typedef struct edgelink EDGELINK;       没找到结构体定义 所以提示不完整类型

user: user-2
content: 引用 4 楼 user-6 的回复:先定义结构体 再typedef ,也就是说你应该在type_orgraph.h中 include  struct_orgraph.h 这个没影响

user: user-3
content: 严重怀疑 头文件 「 orgraph.h 」的内容 不是 「 #include type_orgraph.h 」，而是   #inclulde "struct_orgraph.h"

user: user-4
content: 一般是包含的其他头文件里包含了struct_XX.h 你自己好好想想，如果你没有指定包含，编译器怎么知道从哪里找？ 引用 5 楼 codemonkey112 的回复:[quote=引用 4 楼 user-6 的回复:] 先定义结构体 再typedef ,也就是说你应该在type_orgraph.h中 include  struct_orgraph.h  以前我也是这么认为的，可是看之前的项目代码中并没有在type_XX.h中去 包含struct_XX.h文件啊，依然可以运行，可能 是什么原因呢？都写的是在struct_XX.h中 #include "type_XX.h"文件，很奇怪啊[/quote]

user: user-5
content: 是否包含了声明结构体类型的头文件，建议检查一下。或者直接把你的代码分别贴出来。

user: user-3
content: 没有包含 "struct_orgraph.h" 文件

user: user-0
content: 引用 4 楼 user-6 的回复:先定义结构体 再typedef ,也就是说你应该在type_orgraph.h中 include  struct_orgraph.h  以前我也是这么认为的，可是看之前的项目代码中并没有在type_XX.h中去 包含struct_XX.h文件啊，依然可以运行，可能 是什么原因呢？都写的是在struct_XX.h中 #include "type_XX.h"文件，很奇怪啊

user: user-6
content: 先定义结构体 再typedef ,也就是说你应该在type_orgraph.h中 include  struct_orgraph.h

user: user-3
content: （1）从上面的代码，看不到 EDGELINK 的定义，不知道它是什么。 （2）把#include的头文件用双引号或者尖括号括起来吧。

user: user-0
content: 不好意思写错了：）  //type_orgraph.h  	typedef struct edgelink EDGELINK;       //struct_orgraph.h  #include "type_orgraph.h" 	 struct edgelink 	 { 		 int head;				 		 int tail;							 		 EDGELINK* hlink_next;		 		 EDGELINK* tlink_next;		 	 };  //orgraph.h  #include type_orgraph.h  //orgraph.c  #include type_orgraph.h #include orgraph.h static SCIP_RETCODE Test(EDGELINK* edge) { int head = edge->head;//这里提示 “不允许指针指向不完整的类类型” }

user: user-5
content: EDGELINK和EDGEINFO的区别，建议一一比对。  另外，struct edge里也没有head成员。  两处矛盾，不知道那个地方是有问题，你自己看一下
user-0 提问: C语言怎么从开头截取一段字符串然后与文本一行做比较

回复:
user: user-1
content: 引用 6 楼 qq_36722988 的回复:原来还有strncmp函数可以这么用...  感谢。 不客气。前面的代码，你使用了函数 strncpy ， 还以为你知道 strncmp 函数呢。 不过现在知道了也不晚的。 ～

user: user-0
content: 原来还有strncmp函数可以这么用...  感谢。

user: user-1
content: 你好，昨天俺回复了你上一个帖子，今天看你上面的代码和昨天的不是大同小异吗？为什么还有疑问呢？依葫芦画瓢就可以了呀。 在你今天的代码的基础上修改的参考代码如下：  #include <stdio.h> #include <stdlib.h> #include <string.h>  void Three(char str[]); void Five(char str[]); void Eleven(char str[]);  int main(int argc, char const *argv[]) { 	//char str[50]; 	char str[50]; 	//char a[20]; 	printf("Please input search word:\n"); 	fgets(str, 50, stdin); 	int n = strlen(str) - 1; // 减去倒数第二个字符换行符占用的一个长度 	switch (n) { 	case 3: 		//Three(str); 		break; 	case 5: 		//Five(str); 		break; 	case 11: 		Eleven(str); 		break; 	default: 		printf("no keyword with length of %d \n", n); 	}  	return 0; }  void Eleven(char str[]) { 	printf("%s\n", str); 	char a[50];         //复制前3个字符给字符数组a 	strncpy(a, str, 3); 	printf("%s\n", a);  	FILE *fp = fopen("123.txt", "r"); 	if (fp == NULL) { 		printf("Error! No such file.\n"); 		exit(EXIT_FAILURE); 	}  	char in_str[50]; 	int flag = 0;  	while (!feof(fp)) { 		fgets(in_str, 49, fp);                 // 比较前3个字符 		if (strncmp(a, in_str, 3) == 0) { 			fgets(in_str, 49, fp); 			printf("服务号为：%s\n", in_str); 			flag = 1; 			break; 		} 	} 	if (flag != 1) { 		printf("不符合\n"); 	} 	fclose(fp); }  测试运行截图：  看起来你是想查询长度为 11位 数字的 固定 电话号码的 区号信息吧。 如有帮助，烦请及时结帖、给分！ ：） ～

user: user-2
content: strncpy是根据第三个参数来决定要复制多少个字符的，这么多个字节里如果没有'\0'，那么是不会把'\0'拷贝到目标串的。  The strncpy() function is similar, except that at most n bytes of src are copied.  Warning: If there is no null byte among the first n bytes of src, the string placed in dest will not be null-        terminated.  所以会出现乱码，就是因为没有'\0'；

user: user-3
content: 引用 2 楼 KarivV 的回复:  int main() {     char str[50] = "";\\这里 给错了还要读 7位11位 应该给大点 给个50吧     fgets(str, 50, stdin);\\输入010回车 str("010\n\0")     Three(str);     return 0; }

user: user-3
content: 乱码的原因是因为a没有初始化..如果你写a[50] = " ";那么a就被初始化成了32(' ') 0 0 0... fgets获取的字符串内都会包含\n因此你不需要去控制从流输入的和从文件读取的字符串的格式 直接拿来判断就好了  void Three(char *str) { 	char str_read[50]; 	FILE *fp = fopen("F:\\三位区号.txt", "r"); 	if (!fp) 	{ 		printf(""); 		exit(0); 	}  	while (!feof(fp)) 	{ 		memset(str_read, 0, 50); 		fgets(str_read, 5, fp);\\ "xxx\n\0" 		if (!strcmp(str, str_read)) 		{ 			memset(str_read, 0, 50); 			printf("服务号为:%s\n", fgets(str_read, 50, fp)); 			break; 		} 		else 		{ 			printf(""); 			break; 		} 	} 	fclose(fp); }  int main() { 	char str[5] = ""; 	fgets(str, 5, stdin);\\输入010回车 str("010\n\0") 	Three(str); 	return 0; }

user: user-4
content: 出现乱码就说明终止符\0有问题，看到中文，会不会漏了中文字符占两个字节？
user-0 提问: 加载图片之前，定义这个函数名，不知道该怎么定？

回复:
user: user-1
content: 引用 3 楼 轻箬笠 的回复:啥叫“丝祙的背后有一腿”，把图片放出来看看 我觉得你在开车、但是我没有证据

user: user-2
content: 这图片有点开车啊

user: user-3
content: 啥叫“丝祙的背后有一腿”，把图片放出来看看

user: user-0
content: 就是定义一个IMAGE类型的变量，后面的img也不知道是哪里来的，loadimage( )后面的参数&img，是哪里的地址

user: user-1
content: 请重新组织一下中文
user-0 提问: 求哥哥们帮忙解释一下

回复:
user: user-1
content: 能及时结帖、给分么？ 光提问，不结帖，不好吧？

user: user-2
content: i++是运算前取值，＋＋i才是运算后取值，所以都是每次先将i输出，再运算i+1赋给本身
user-0 提问: 3144霍尔传感器实现计数功能。

回复:
user: user-0
content: 引用 1 楼 user-1的回复:没那么复杂吧，每个物体有个独立的标识，获取下A传感器和B传感器的通过时间，速度、方向都有了 我需要在计数的基础上完成测速和方向的功能，主要功能还是计数器

user: user-0
content: 我需要在计数的基础上完成测速和方向的功能，主要功能还是计数器

user: user-1
content: 没那么复杂吧，每个物体有个独立的标识，获取下A传感器和B传感器的通过时间，速度、方向都有了
user-0 提问: 大神们推荐几本自学数据结构的书呗(C语言版)

回复:
user: user-1
content: 引用 8 楼 qq_44722467 的回复:[quote=引用 7 楼 dalcon的回复:]主要还是看数学基础，如果数学基础好，有很多经典书籍可看，个人推荐算法导论、数据结构和算法。还有一本叫算法的大部头，大约5部吧也可以一看。至于楼上的数据结构C语言描述，我个人并不太推荐。  回头说来，数据结构其实什么语言无所谓，关键是理解各种基本数据结构本身的意义和价值，实现数据结构是另外一回事。毕竟很多事情是一通百通的。  要不是发现兑换下载积分还需要专家分上300，我也不会把这僵尸号翻出来。 数学基础得什么样叫好呢[/quote]  窃以为本科理科的高数,离散,概率,线代算起步吧.自学有难度的话,MOOC似乎有相关课程,都是一流大学老师,关键还免费.

user: user-0
content: 引用 7 楼 dalcon的回复:主要还是看数学基础，如果数学基础好，有很多经典书籍可看，个人推荐算法导论、数据结构和算法。还有一本叫算法的大部头，大约5部吧也可以一看。至于楼上的数据结构C语言描述，我个人并不太推荐。  回头说来，数据结构其实什么语言无所谓，关键是理解各种基本数据结构本身的意义和价值，实现数据结构是另外一回事。毕竟很多事情是一通百通的。  要不是发现兑换下载积分还需要专家分上300，我也不会把这僵尸号翻出来。 数学基础得什么样叫好呢

user: user-1
content: 主要还是看数学基础，如果数学基础好，有很多经典书籍可看，个人推荐算法导论、数据结构和算法。还有一本叫算法的大部头，大约5部吧也可以一看。至于楼上的数据结构C语言描述，我个人并不太推荐。  回头说来，数据结构其实什么语言无所谓，关键是理解各种基本数据结构本身的意义和价值，实现数据结构是另外一回事。毕竟很多事情是一通百通的。  要不是发现兑换下载积分还需要专家分上300，我也不会把这僵尸号翻出来。

user: user-2
content: 《大话数据结构》  比大学教材更简单通俗易懂。。由浅入深，再深入浅出，非常适合初学者。

user: user-3
content: 《数据结构（C语言描述）》

user: user-4
content: 不是视频， 是 PDF

user: user-0
content: 引用 2 楼 focuslight的回复:百度搜       数据结构：C语言描述（第3版）_超高清 超高清？视频吗？有书啥的不

user: user-4
content: 百度搜       数据结构：C语言描述（第3版）_超高清

user: user-0
content: 引用 楼主 qq_44722467的回复:我想自学数据结构但不知道用那本书比较好，大家给个思路呗，谢谢 算法还不了解呢，也一样推荐推荐吧，谢谢了
user-0 提问: 统计输出素数个数及素数之和

回复:
user: user-1
content: 楼主的判断素数的函数里，上来就把a赋值为0，还判断素数干啥？建议把传进来的参数可以保存在另外一个局部变量里。  另外，调用判断素数的函数时，拿来的a呢？是不是实参应该用m呢

user: user-2
content: 你这个一进来就把a给改了，还怎么判断是不是素数 [code=c][/  int isPrim(int a) { 	if (a <= 1) 		return 0; 	int len = sqrt(a); 	for (int i = 2; i <= len; i++) 		if (a % i == 0) 			return 0; 	return 1; } code]
user-0 提问: 用C语言怎么给文件里的数据排序

回复:
user: user-1
content: 文件里不能直接排序，需要load到内存，即先把数据读取到内存，然后再用排序算法进行排序，最后再写到文件里，这样才能实现你的功能。

user: user-2
content: 我是来打某些人脸的。 https://bbs.csdn.net/topics/392294537

user: user-3
content: 你先要把文件里的数据读入内存，比如，如果文件里全是数字的话，你可以用fscanf以数字方式读入一个整型数组，然后怎么排序就看你自己了，计数排序、基数排序、选择排序、插入排序、冒泡排序、希尔排序、快速排序、归并排序、桶排序、堆排序等等，你排序结束后，再把数组用fprintf写入文件。
user-0 提问: 求助C语言猴子选大王问题

回复:
user: user-0
content: 程序无编译错误   但 没输出东西

user: user-1
content: 求教请把问题描述清楚，编译错误？运行结果不对？程序崩溃？

user: user-2
content: #include<stdio.h> int main(){ 	int n = 5, q = 1, m = 3; 	int vis[100] = { 0 };		//排除标记 	int count = 0;		//计数器 	int rev = n;		//剩余猴子 	while (rev != 1) { 		count++; 		if (count == m) { 			vis[q] = 1; 			rev--; 			count = 0; 		} 		do { 			q = q % n + 1; 		} while (vis[q] == 1);	//寻找下一个未被排除的猴子 	} 	printf("大王：%d", q); 	return 0; }
user-0 提问: 跪求 在创建链表的子函数里开辟空间不成功，该怎么办

回复:
user: user-1
content: 引用 4 楼 aprogramming 的回复:这是我第一次注册这个，哈哈还不太会使，没想到十分钟就有人回我了，谢谢辽！1  今天正好下午吃过晚饭在论坛里逛，看到你的帖子就点进来看了一下。 只要发的帖子不是太水、不是纯伸手帖之类的，一般都会有热心的网友愿意提供力所能及的帮助的。 祝C语言学习顺利！ ～

user: user-0
content: 引用 1 楼 拥抱Linux 的回复:其它的还没看，单单说一个已经看到了的问题：函数 「STATUS LinkedListCreatT(LINK_LIST L, int NodeNum)」里，下面的代码部分，if（）的后面  多了一个 分号。 先把多余的 这个 分号 删了 再 调试吧。   /*初始化一个带头结点的空链表*/ 	L = (LINK_LIST)malloc(sizeof(NODE)); /*申请头结点空间*/  	if (L == NULL) 		; 	{ 		return ERROR; 	}  ～[/quote  [quote=引用 3 楼 拥抱Linux 的回复:] [quote=引用 2 楼 aprogramming 的回复:] 嗷嗷嗷！！！！！！太感谢了！这一个封号卡了我快1小时  喵喵喵～ 如有帮助，烦请及时结帖、给分哟！ ：）  （比心～）[/quote] 这是我第一次注册这个，哈哈还不太会使，没想到十分钟就有人回我了，谢谢辽！1

user: user-1
content: 引用 2 楼 aprogramming 的回复:嗷嗷嗷！！！！！！太感谢了！这一个封号卡了我快1小时  喵喵喵～ 如有帮助，烦请及时结帖、给分哟！ ：）  （比心～）

user: user-0
content: 嗷嗷嗷！！！！！！太感谢了！这一个封号卡了我快1小时

user: user-1
content: 其它的还没看，单单说一个已经看到了的问题：函数 「STATUS LinkedListCreatT(LINK_LIST L, int NodeNum)」里，下面的代码部分，if（）的后面  多了一个 分号。 先把多余的 这个 分号 删了 再 调试吧。   /*初始化一个带头结点的空链表*/ 	L = (LINK_LIST)malloc(sizeof(NODE)); /*申请头结点空间*/  	if (L == NULL) 		; 	{ 		return ERROR; 	}  ～
user-0 提问: 这个程序哪里有问题呢？

回复:
user: user-1
content: 下面那个函数的return应该放在if里面，顺便把if里面的输出给删除了，多余了。

user: user-2
content: ～ 别把 「return t;」 这句语句 放到 for  循环 里面去啊！  你这样的话，第一次执行 for 循环 就 return  了 ， 还怎么 穷举 、 怎么 循环 呢？  而且， main 函数里 已经 有了 打印 最大公约数的 语句了， 在 函数 Gcd 的 for 循环里面 又 打印 循环的 t 的值 是何用意呢？ ～ 要么，把 「return t;」放到 函数 Gcd 的最后去， 也就是 放到 for 循环的 花括号 的 外面 、后面，同时在 if()后面增加一句「 break; 」。  for(省略) {    if(m % t == 0  && n % t ==0)          break; } return t;  要么，把 for 循环 里的 if （） 后面的 printf 语句删除， 那么  if() 后面的语句就是 「return t;」如果找到了 最大公约数的话， 就返回了。  for(省略) {    if(m % t == 0  && n % t ==0)          return t; }  强烈建议使用 第一种写法。 同时，强烈建议在 if()的后面使用 花括号，即使 if() 后面的语句只有一句，也用 花括号 括起来！ 参考代码如下：  #include <stdio.h>  int Gcd(int m, int n);  int main(int argc, char const *argv[]) { 	int a, b, t; 	printf("Input a,b:"); 	scanf("%d%d", &a, &b); 	t = Gcd(a, b); 	printf("t = %d\n", t); 	return 0; }  int Gcd(int m, int n) { 	int t; 	int min; 	min = m < n ? m : n; 	for (t = min; t >= 1; t--) { 		if (m % t == 0 && n % t == 0) { 			break; 		} 	} 	return t; }  上面的代码，对于正确的输入是可以得到正确的结果的，但是如果遇到不合理的输入的话，是得不到正确结果的。 刚好昨天在下面这个链接的帖子里写了两小段针对求最大公约数时检测输入值是否合理的代码，你可以看看： 被C语言折磨 第8楼。 ～ 如有帮助，烦请及时 结帖、给分！ ：） ～
user-0 提问: 求助大神！C语言怎么写swapcase

回复:
user: user-1
content: 引用 2 楼 weixin_45050635 的回复:～请问怎么结帖啊 我有点不会用[/quote]

user: user-2
content: 引用 2 楼 weixin_45050635 的回复:请问怎么结帖啊 我有点不会用[/quote]  在 网页版 里 ，一般就是说 在 电脑上用 网页浏览器 登录 论坛， 打开 自己的 帖子， 就有 结帖、给分 的相关按钮了。 在 手机 APP 里不行。 ～

user: user-0
content: 引用 1 楼 拥抱Linux 的回复：（1）来自灵魂的拷问：朋友，如有帮助，能及时 结帖、给分 么？  （2）本来想用 switch-case 写一段 鬼畜代码的，写着写着 自己都 嫌麻烦，遂放弃，还是 用 加减法 轻松。 （3）参考代码如下，  #include <stdio.h>  #define MAX_STR_LEN 1000  void swapcase(const char *src, char *dst);  int main(int argc, char const *argv[]) { 	const char *src_1 = "AbCdE"; 	char dst[MAX_STR_LEN]; 	swapcase(src_1, dst); 	printf("%s\n", dst); // aBcDe 	// ----------------------------- 	const char *src_2 = "2AbCdE"; 	swapcase(src_2, dst); 	printf("%s\n", dst); // 2aBcDe 	return 0; }  void swapcase(const char *src, char *dst) { 	while (*src != '\0') { 		if (*src >= 'a' && *src <= 'z') { 			*dst = *src - 32; 			dst++; 		} else if (*src >= 'A' && *src <= 'Z') { 			*dst = *src + 32; 			dst++; 		} else { 			*dst = *src; 			dst++; 		} 		src++; 	} 	*dst = '\0'; }  （4）如有帮助，烦请及时结帖、给分，共建美好和谐社区！ ：） ～请问怎么结帖啊 我有点不会用

user: user-2
content: （1）来自灵魂的拷问：朋友，如有帮助，能及时 结帖、给分 么？  （2）本来想用 switch-case 写一段 鬼畜代码的，写着写着 自己都 嫌麻烦，遂放弃，还是 用 加减法 轻松。 （3）参考代码如下，  #include <stdio.h>  #define MAX_STR_LEN 1000  void swapcase(const char *src, char *dst);  int main(int argc, char const *argv[]) { 	const char *src_1 = "AbCdE"; 	char dst[MAX_STR_LEN]; 	swapcase(src_1, dst); 	printf("%s\n", dst); // aBcDe 	// ----------------------------- 	const char *src_2 = "2AbCdE"; 	swapcase(src_2, dst); 	printf("%s\n", dst); // 2aBcDe 	return 0; }  void swapcase(const char *src, char *dst) { 	while (*src != '\0') { 		if (*src >= 'a' && *src <= 'z') { 			*dst = *src - 32; 			dst++; 		} else if (*src >= 'A' && *src <= 'Z') { 			*dst = *src + 32; 			dst++; 		} else { 			*dst = *src; 			dst++; 		} 		src++; 	} 	*dst = '\0'; }  （4）如有帮助，烦请及时结帖、给分，共建美好和谐社区！ ：） ～
user-0 提问: 【求助】【链表插入函数】

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: 引用 2 楼 weixin_43200999 的回复:[quote=引用 1 楼 拥抱Linux的回复:]先把 if 括号里的 等于号（赋值运算符） 改成 等于等于号（相等的比较运算符）再测试。  if (newp == NULL)  谢谢大佬，找到问题了[/quote]  不用客气，祝C语言学习顺利！ 嗯，可以的话，烦请及时 结帖、给分 吧！ ：） ～

user: user-0
content: 引用 1 楼 拥抱Linux的回复:先把 if 括号里的 等于号（赋值运算符） 改成 等于等于号（相等的比较运算符）再测试。  if (newp == NULL)  谢谢大佬，找到问题了

user: user-2
content: 先把 if 括号里的 等于号（赋值运算符） 改成 等于等于号（相等的比较运算符）再测试。  if (newp == NULL)
user-0 提问: C语言怎么实现读取一行文本文件判断成功后再读取下一行就终止

回复:
user: user-0
content: 感觉你的代码和我差不多  就在while前查询了一次  能不能说大概有什么区别吗

user: user-0
content: 好的感谢@！！

user: user-1
content: 引用 5 楼 qq_36722988 的回复:感觉你的代码和我差不多  就在while前查询了一次  能不能说大概有什么区别吗  俺上面的代码，从 逻辑和算法 上来说，和你原先的代码一模一样啊， 只是 在你原先的代码的基础上， 把 「从键盘（默认的标准输入文件 stdin）得到数据的 函数」 从 scanf 改成了 fgets 而已。  fgets 函数 是从 文件 读入 数据， 但是 对于 程序而言， 键盘（默认的标准输入设备/文件） 也是一个文件（指针）呀， 所以 fgets 也可以从 键盘 获取 数据 并交给变量。 感兴趣的话，可以通过搜索引擎查询一下 fgets 函数、 标准输入设备/流 等相关概念哦！  祝C语言学习顺利！：） ～

user: user-1
content: 上面说的是 主要问题， 刚刚着急吃晚饭，没来得及说 次要问题。   次要问题就是 1 楼的朋友说的 关于 数组越界的情况，有可能会发生。 不过呢，俺的建议是 干脆把 字符数组的 长度 定义大一点，内存不在乎的。 而且你读取的字符串、要输出的字符串有好些汉字，占用的字节数肯定不会少，何必抠抠巴巴的定一个个 50 个 字节 的数组呢？ 先给它定义个 100、1000的长度都没关系， 等把代码的 逻辑 、 运行 搞定了之后， 再来慢慢 优化 存储空间也没关系嘛。  总结一下次要问题就是， fgets 里 设定的 读取的字符个数 不要超过 目标字符数组 的长度 ，—— 严格地说 是 不要超过 数组的 长度 减 1 。

user: user-1
content: （1）你的代码从逻辑和算法上来说是正确的，只不过呢可能没注意调试，也没注意到两个不同的输入函数 「scanf」和 「fgets」对输入的字符串的处理。 （2）具体来说， 「scanf」对输入的字符串按 空格 或 回车符 来作为字符串末尾的标志，并且 交给 字符串/数组变量 的字符串的末尾是 「不包含」最后的 换行符的 。 （3）而 「fgets」函数则不同，它会把读取到的一行字符串的最后一个 换行符 「'\n'」也交给 字符串/数组变量 保存起来。 （4）比如， 当 前面的 scanf 输入的 字符串是 "106" 时，数组 in_str 中的内容是 '1'、'0'、'6'、'\0'， 而 后面 用 fgets 得到的文本文件中的 第一行 并 交给 str 之后， str 中的内容是 '1'、'0'、'6'、'\n'、、'0'， 所以  strcmp(str, in_str) 的结果肯定不会是 0 。  在 Linux 系统下，修改了一下代码，如下，供参考：  #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(int argc, char const *argv[]) { 	FILE *fp = fopen("123.txt", "r"); 	if (fp == NULL) { 		printf("Error! No such file.\n"); 		exit(EXIT_FAILURE); 	} 	char str[50]; 	char in_str[50]; 	//char a[20]; 	printf("Please input search word:\n"); 	fgets(in_str, 50, stdin);  	while (!feof(fp)) { 		fgets(str, 100, fp); 		if (strcmp(str, in_str) == 0) { 			fgets(str, 100, fp); 			printf("%s\n", str); 			break; 		} 	} 	fclose(fp);  	return 0; }  在 Linux 环境下的测试运行截图：  （5）在 windows 系统里面， 文本文件的 换行符 有时候会被文本编辑器自动修改为  两个字符 '\r'和'\n'，而 linux 系统里 是 一个字符 '\n' 。 （6）所以，如果上面的参考代码在 windows 里还是不行的话，可以尝试想办法自己给 in_str 的末尾添加一个字符 '\r'，让末尾的两个字符是 '\r'和'\n'。这样应该就可以了。 ～ 如有帮助，烦请及时结帖、给分！ ：） ～

user: user-0
content: 为什么第一行读取没问题 第二行开始就读取不了

user: user-2
content: fgets函数使用时，第二个参数不对，应该是50才可以。而不是100，否则会数组越界 另外，建议加上对文件指针的判断，还有feof函数使用，建议先读取一行，然后再判断feof
user-0 提问: 求助大神！c语言怎么写startswith endswith

回复:
user: user-1
content: #include<iostream> #include <string.h> using namespace std;  int startswith(const char *str, const char *p); int endswith(const char *str, const char *p);  int main(void) { 	const char *str = "Hello, world!";  	printf("%d\n",	startswith(str, "hello")); 	printf("%d\n",	startswith(str, "Hello")); 	printf("%d\n",	endswith(str, "ld!")); 	printf("%d\n",	endswith(str, "ld")); 	return 0; }   int startswith(const char *str, const char *p) { 	int len = strlen(p); 	if (len <= 0) 		return 0; 	if (strncmp(str, p, len) == 0) 		return 1;  	return 0; }   int endswith(const char *str, const char *p) { 	int len1, len2; 	len1 = strlen(str); 	len2 = strlen(p);  	if (len2 <= 0) 		return 0;  	if (strncmp(str + len1 - len2, p, len2) == 0) 		return 1;  	return 0; }  供参考！

user: user-2
content: 从头循环比较呗，相当就继续，不等就返回0，到达子串的长度就返回1 注意输入参数判断 是否为NULL,和第二个子串长度是否大于第一个
user-0 提问: strlen(s)与sizeof(s)有什么区别？

回复:
user: user-1
content: strlen是求字符串的长度，有多少个字符，sizeof是计算变量所占的字节数，可以看看我的博文，里面有更多基础知识

user: user-2
content: strlen是计算字符串长度的，\0为截止符 sizeof是计算变量空间的，声明多大返回多大

user: user-3
content: strlen是求字符串的长度，计算长度时遇到'\0'停止计算； sizeof是求某个变量占内存的大小，即数组的长度

user: user-4
content: strlen()是<string.h>里的函数，原理是从字符串的第一个char字符开始计算直至遇到'\0'，楼主可以查一下这个函数的源代码就会理解答案是5 而sizeof()是指实际占用的字节数，char s[20]="Hello\0Hi";定义了s是一个有20个存储单元的数组，而char类型占用1个字节，所以答案是20 综上，就选C了~

user: user-5
content: strlen()得到的是字符串的实际长度，sizeof()得到的是所占的字节数。

user: user-6
content: 百度百科之strlen（C/C++语言函数）  百度百科之sizeof  欢迎及时结帖、给分。：） ～
user-0 提问: 哪一行出错了？

回复:
user: user-1
content: ptr没有指向呀，a没有定义，当然错误了

user: user-2
content: Person *ptr=&p的含义是定义一个名为ptr的结构体类型为Person的指针变量，它指向结构体p的地址，也就是说ptr的值就是结构体p的值，而ptr－>a表示访问结构体ptr的成员a的值，但是我们的结构体类型中没有成员a，所以，运行结果是error，也就是错误的意思，再有什么不懂的可以问我😯，多交流学习

user: user-3
content: 看你发的帖子挺多的，结帖率也很高，相比其它很多发帖的用户而言是很良心、很自觉了，所以给你一个小小的建议：远离这类无厘头的题目吧。 说得挺好的，这类题目质量真心太低了，都看不出考点在哪里，你说这题目难道就是告诉你结构体成员没有a，他写个a从而是个编译错误么？

user: user-4
content: ptr->age，表示ptr所指的结构体变量里的成员age，而代码中是ptr->a，显然没有成员a，所以错误。

user: user-5
content: 结构体成员里哪来的a成员呢

user: user-6
content: （1）定义一个指针，并初始化。 （2）结构体中没有名为 「a」 的成员，编译通不过，结果就是「 错误 == Error 」。 ～ 看你发的帖子挺多的，结帖率也很高，相比其它很多发帖的用户而言是很良心、很自觉了，所以给你一个小小的建议：远离这类无厘头的题目吧。 其实，之前你发过的一个帖子里，有一些大佬已经建议过你，不要再执迷于上面这样的钻牛角尖、无意义的题目了，但是好像你还是一如既往地钻研这些题目。正如上面一句说的，也是觉得你的学习态度、发帖态度很好，所以小小地建议一下。 至于说，不做这些题目那该怎么学习和研究呢？俺不敢说大话，但是至少有一点是认同的，那就是「务必要实践！」。 也就是说，有功夫把题目敲出来、发帖，事先干脆把代码敲到编译器里，自己试一试、跑一跑，调试调试，再遇到搞不懂的时候才提出有针对性的问题。这样，既有 实践，又有 思考，还有 总结， 学习效果应该会好得多。 ～

user: user-7
content: 结构体里面没有a变量，ptr指不上
user-0 提问: 求助一道题，想不通！

回复:
user: user-1
content: a=a+（a_）（这边的（a_）是指a执行完a=a_a*a之后的值，假设该值为G），a_=144，→a=-132（这时候a等于-132了，也就是得到了刚才那个值G）→a=a+(a_)=-132+（-132），，，，大致就这样吧，我尽力了…

user: user-2
content: 对于这样的问题，建议跳过。这样的代码也不建议写，因为可读性差。

user: user-3
content: 这种题目是真的蛋疼，就像是问你4*1/5*2+3等于一样？写的花里胡哨的，加个括号不行吗？像上面那条语句，分成几条写不行吗？即方便阅读，又不容易出错

user: user-4
content: 等号是从右向左结合 a=a+(a=a-a*a)
user-0 提问: 老哥们，这个怎么用递归函数解出来啊

回复:
user: user-1
content: 引用 11 楼 轻箬笠 的回复:我就好奇一件事情，如果一半的鱼、三分之一的鱼、四分之一的鱼，出现不能整除的情况咋办？难道分割出售？！ 写函数的时候应该也要考虑这种情况吧  鱼已经卖出去了，现在是根据剩余几条鱼，还有卖鱼时的规律求原来的鱼有多少，不过真的有好多题目都有点脱离实际

user: user-2
content: 我就好奇一件事情，如果一半的鱼、三分之一的鱼、四分之一的鱼，出现不能整除的情况咋办？难道分割出售？！ 写函数的时候应该也要考虑这种情况吧

user: user-3
content: 引用 5 楼 qq_45048242 的回复:[quote=引用 3 楼 Italink的回复:]编译器不支持C++？  #include<stdio.h> int find(int fish, int n) { 	return n ? find((n + 1) * (fish + n) / n, n - 1) : fish; } int main() { 	printf("%d", find(27, 3)); 	return 0; }   那个问号那里是啥意思的? 又是那里出了问题 小白一个 真的不太懂这些 [/quote]    ？：是C语言中唯一的三目运算

user: user-0
content: 谢谢老师解析，本来是不太熟悉递归函数的含义

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

user: user-0
content: 引用 1 楼 Italink的回复: #include<iostream> using namespace std; int find(int fish, int n) { 	return n ? find((n + 1) * (fish + n)/n, n - 1) : fish; } int main(){ 	cout << find(27, 3) << endl; 	return 0; }  试过好几次了，编译不出来，源代码有错。。

user: user-1
content: #include<iostream> using namespace std; int find(int fish, int n) { 	return n ? find((n + 1) * (fish + n)/n, n - 1) : fish; } int main(){ 	cout << find(27, 3) << endl; 	return 0; }

user: user-1
content: #include<stdio.h> int find(int fish, int n) { 	if (n == 0) 		return fish; 	else 		return find((n + 1) * (fish + n) / n, n - 1); 	//return n!=0 ? find((n + 1) * (fish + n) / n, n - 1) : fish;		//？：三目运算符 } int main() { 	printf("%d", find(27, 3)); 	return 0; }

user: user-0
content: 终于弄好了 感谢这位仁兄！

user: user-0
content: 引用 3 楼 Italink的回复:编译器不支持C++？  #include<stdio.h> int find(int fish, int n) { 	return n ? find((n + 1) * (fish + n) / n, n - 1) : fish; } int main() { 	printf("%d", find(27, 3)); 	return 0; }   那个问号那里是啥意思的? 又是那里出了问题 小白一个 真的不太懂这些

user: user-0
content: 那个问号那里是啥意思的? 又是那里出了问题 小白一个 真的不太懂这些

user: user-1
content: 编译器不支持C++？  #include<stdio.h> int find(int fish, int n) { 	return n ? find((n + 1) * (fish + n) / n, n - 1) : fish; } int main() { 	printf("%d", find(27, 3)); 	return 0; }
user-0 提问: C一个宏定义问题

回复:
user: user-0
content: 引用 8 楼 自信男孩的回复:[quote=引用 7 楼 ~梦醒了*…… 的回复:] [quote=引用 4 楼 早打大打打核战争的回复:]应该是typedef unsigned long ulong; 那当我要用的时候呢？直接输unsigned long就可以吗？[/quote] 不可以，但是你可以直接用ulong。[/quote] 那个什么，我是刚用这个，怎么结贴啊，我真的不会，还请教教我。。

user: user-0
content: 好的，谢谢。😁😁😁😁😁😁

user: user-1
content: 引用 7 楼 ~梦醒了*…… 的回复:[quote=引用 4 楼 早打大打打核战争的回复:]应该是typedef unsigned long ulong; 那当我要用的时候呢？直接输unsigned long就可以吗？[/quote] 不可以，但是你可以直接用ulong。

user: user-0
content: 引用 4 楼 早打大打打核战争的回复:应该是typedef unsigned long ulong; 那当我要用的时候呢？直接输unsigned long就可以吗？

user: user-0
content: 引用 4 楼 早打大打打核战争的回复:应该是typedef unsigned long ulong; 那当我要用的时候呢？直接输unsigned long就可以吗？

user: user-2
content: 楼上几位都是正解！

user: user-3
content: 应该是typedef unsigned long ulong;

user: user-4
content: typedef ulong unsigned long； 定义成一个单词的，然后使用

user: user-3
content: type中带空格都不行

user: user-1
content: type就是类型，没有指定什么类型，你用一个unsigned long去接收就可以
user-0 提问: 关于调用结构体函数，急求大佬指点

回复:
user: user-1
content: 在函数内返回局部变量本身就是错误的写法 因为buf的数据在函数返回后就不可预料了  Linux下没问题只是说运气好，这部分地址空间还没被其它东西占用

user: user-2
content: 首先说， 在 Linux 下执行上面的代码，并没有成功输出结果哦！解析如下： （1）嗯，返回局部变量是可以的，也是相当常见的，因为返回的是值嘛。 （2）上面的代码出问题的原因在于，函数 getTran 返回的变量的数据类型 Tran 的成语是一个 指针， 而指针存储的值 是什么呢？ 指针 存储的值 是一个地址。那么 具体到上面的代码，result.flag 这个指针存储的地址是 函数 getTran 内部的局部变量 buff 这个字符串的首地址。 （3）问题的关键来了， 当 函数 getTran 被调用结束之后， 也就是 程序运行的过程 从 getTran 函数中 退出来之后 ， 其 内部的局部变量 buff 已经被 系统给 释放了 ， 也就是说 buff 所在的内存空间 被系统释放了，现在 这段内存空间上的 数据 是不可知的了， 所以 在 main 函数里， 通过 test.flag 这个指针存储的地址， 也就是 刚刚返回来的 getTran 里的 result.flag 存储的地址 按图索骥 去 这个内存地址 读取数据的话， 读取到的数据就是 不可知的了。—— 关于这一点，涉及到变量的 「生存期 」 概念，也就是常说的 「全局变量」、「局部变量」等。 （4）可以试试，在 结构体内部 定义一个 字符数组， 在 getTran 里 给这个数组 写入字符（串），然后在 main 函数中打印出来。 （5）也可以试试，把 buff 变量 定义在 main 函数中、调用getTran的语句之前， 或者 定义成全局变量 ， 传递进 getTran 函数， 然后看看原代码的结果。  如有帮助，烦请及时结帖、给分。 ：） ～
user-0 提问: C语言说是没有定义入口点。。。。

回复:
user: user-1
content: VC++6.0 我是不会用这个编译器取写C语言程序的

user: user-2
content: 用VC++6.0选择“一个简单的程序”  然后把代码拷贝到.cpp文件中，以下是运行效果，代码应该没问题

user: user-3
content: 设置入口为main函数

user: user-4
content: 没有新建控制台项目。我猜。

user: user-0
content: 用的vc6.0

user: user-5
content: 不知道你用的什么编译器和方式 如果是vs的话 你可以手动在工程属性里把入口点改成main
user-0 提问: 可以帮忙编一下这个程序嘛

回复:
user: user-1
content: 来学学··学一下

user: user-2
content: 引用 2 楼 weixin_44796076 的回复:[quote=引用 1 楼 拥抱Linux的回复:]上一个帖子已经给你回答了，怎么不看呢？   被C语言折磨  记得及时 结帖、给分啊！  ～ 我看了，但是有些地方还没有学到～[/quote]  慢慢理解吧。 不过，当务之急 还是先把 帖子 给结了，把 分 给了 比较好哦！ （比心）～

user: user-0
content: 引用 1 楼 拥抱Linux的回复:上一个帖子已经给你回答了，怎么不看呢？   被C语言折磨  记得及时 结帖、给分啊！  ～ 我看了，但是有些地方还没有学到～

user: user-2
content: 上一个帖子已经给你回答了，怎么不看呢？   被C语言折磨  记得及时 结帖、给分啊！  ～
user-0 提问: 求解答

回复:
user: user-1
content: int main(int argc, char**argv) {     char buf[100] = {0};     fgets(buf, sizeof(buf), stdin);      int count[10] = {0};     unsigned int i;     for(i = 0; i < sizeof(buf); i++) {         switch(buf[i])         {             case '0':                 count[0]++;                 break;             case '1':                 count[1]++;                 break;             case '2':                 count[2]++;                 break;             case '3':                 count[3]++;                 break;             case '4':                 count[4]++;                 break;             case '5':                 count[5]++;                 break;             case '6':                 count[6]++;                 break;             case '7':                 count[7]++;                 break;             case '8':                 count[8]++;                 break;             case '9':                 count[9]++;                 break;             case '\0':                 i = sizeof(buf);                 break;             default:                 break;         }     }      for(i = 0; i < sizeof(count)/sizeof(int); i++) {         printf("%d ", count[i]);     }     printf("\n"); }
user-0 提问: c语言tcp通信程序

回复:
user: user-1
content: MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLES.C MSDN98\SAMPLES\VC98\SDK\NETDS\WINSOCK\SIMPLE\SIMPLEC.C
user-0 提问: 被C语言折磨

回复:
user: user-1
content: 引用 7 楼 weixin_44796076 的回复:改了还是不可以运行出对的结果啊  你在 for 循环里，画蛇添足地使用了 「break; 」语句。而且，使用 for 循环，那就不是题目要求的 递归方法了呀！orz!!! （1）先按你的代码的思路，把 多余 的 「break;」 语句去掉了，是下面这样的：  #include <stdio.h>  int gcd(int a, int b);  int main(int argc, char const *argv[]) { 	int a, b, i; 	printf("Enter two integer: "); 	scanf("%d%d", &a, &b); 	i = gcd(a, b); 	printf("GCD of a and b = %d\n", i); 	return 0; }  int gcd(int a, int b) { 	for (; a != b;) { 		if (a > b) { 			a = a - b; 		} else if (a < b) { 			b = b - a; 		} 	} 	return a; }  （2）按照题目的要求，使用递归方法，重新改写了代码——实际上题目的文字已经说得够直白了，跟着敲出来就可以了，具体如下：  #include <stdio.h> #include <stdlib.h>  int gcd(int a, int b);  int main(int argc, char const *argv[]) { 	int a, b, i; 	printf("Input two integer: ");          // 顺便增加了两段判断输入值是否合法的语句  	int count = scanf("%d%d", &a, &b); 	if (count != 2) { 		printf(" >_<||| Error: only %d integer received, but 2 integers needed.\n", 		       count); 		exit(EXIT_FAILURE); 	} 	if (a < 1 || b < 1) { 		printf(" >_<||| Error: integer must be positive number!\n"); 		exit(EXIT_FAILURE); 	} 	i = gcd(a, b); 	printf(" O(∩_∩)O~ gcd of a==>%d and b==>%d is %d <==\n", a, b, i); 	return 0; }  int gcd(int a, int b) {         // 函数的递归调用，就是在本函数中，再次调用本函数 	if (a > b) { 		a = gcd(a - b, b); 	} else if (a < b) { 		a = gcd(a, b - a); 	} 	return a; }  Linux平台下，第（2）份代码的编译、测试运行结果如下图：   如有帮助，欢迎及时结帖、给分！ ：） ～

user: user-0
content: 引用 3 楼 weixin_43956598的回复:for (; a = b; )改成：for (; a != b;) 给点小建议：以后写完程序之后，先完整读一遍程序，模拟一下程序的运行过程，这样就可以避免这种小错误，养成这种习惯，对于以后你编写复杂的程序非常有帮助的，关于这些，可以看看我的博文 改了还是不可以运行出对的结果啊

user: user-0
content: 引用 2 楼 勤奋的执着的回复:[quote=引用 1 楼 自信男孩 的回复:] for (; a = b; )改成：for (; a != b;) [/quote] 改了还是不可以运行出对的结果啊

user: user-0
content: 引用 1 楼 自信男孩的回复:for (; a = b; )改成：for (; a != b;) 改了还是不可以运行出对的结果啊

user: user-2
content: C/C++中一定要注意= 和 == 的区别  在判断中出现=号是赋值 百分99.9的情况是true 而且非常不好排查

user: user-3
content: for (; a = b; )改成：for (; a != b;) 给点小建议：以后写完程序之后，先完整读一遍程序，模拟一下程序的运行过程，这样就可以避免这种小错误，养成这种习惯，对于以后你编写复杂的程序非常有帮助的，关于这些，可以看看我的博文

user: user-4
content: 引用 1 楼 自信男孩 的回复:for (; a = b; )改成：for (; a != b;)

user: user-5
content: for (; a = b; )改成：for (; a != b;)
user-0 提问: C语言程序运行超时

回复:
user: user-1
content: for (int n = 1, s = 0; n > 0; n < 1 ? printf("%d\n", s) : 0)  // C99     scanf("%d", &n) > 0 ? n > 0 && n & 1 ? s += n : 0 : n = 0;

user: user-2
content: while(a != 0 && a != -1); 改成： while(a > 0);

user: user-3
content: 因为你读到负整数还做了一次运算  #include<stdio.h> int main() { 	int a; 	int sum = 0; 	while(true) 	{ 		scanf("%d", &a); 		if (a <= 0)		//读到0或者负整数，结束 			break; 		if (a % 2 == 1) 		{ 			sum = sum + a; 		} 	}  	printf("%d\n", sum); 	return 0; }

user: user-4
content: 它题目的要求是负整数，当它输入的是-2你就算超时了，判断条件要改，并且他可能第一个输入就是负整数，那他后面就不输入了，但你还在等他输入就超时了，我的建议是改成这样  #include<stdio.h> int main() {     int a;     int sum=0;     scanf("%d",&a);     while(a>0)     {             if(a%2 == 1)         {             sum = sum + a;         }        scanf("%d",&a);     }     printf("%d\n",sum);     return 0; }
user-0 提问: 1+3-5+7-9......101这个题目有些问题，请教

回复:
user: user-1
content: 手机app好像没法结帖，只有网页版才可以结帖 引用 11 楼 qq_45039232 的回复:嗯嗯，感谢，我已经知道了，谢谢（咋给分，我第一次用CSDN不知道咋弄）谢谢你！

user: user-0
content: 嗯嗯，感谢，我已经知道了，谢谢（咋给分，我第一次用CSDN不知道咋弄）谢谢你！

user: user-0
content: 不好意思，题目是1-3+5-7.....101我打错了

user: user-1
content: 我估计是老师或者你把题目搞错了，1-3+5-7+9……+101 结果才是51

user: user-2
content: 引用 7 楼 拥抱Linux 的回复:[quote=引用 5 楼 tongshou 的回复:] ...  本来想的算法也是根本不去考虑算式中的省略号（...）后面的数字到底是正还是负的，交给程序去验证就行了。  也是为了确认它的代码，俺才去算了一下101到底是正还是负：因为 101 =  2 × 50 + 1 ， 50 是偶数，和 5 = 2 × 2 + 1 、 9 = 2 × 4 + 1 是同一个特点的，所以确定它是负的。（第一个数字 1 = 1 × 0 + 1 是这个特点的例外。）结果也是如此。[/quote] 你的这些想法挺好。编程过程既要考虑规律性的东西，更要考虑特殊的地方。

user: user-3
content: 引用 5 楼 tongshou 的回复:...  本来想的算法也是根本不去考虑算式中的省略号（...）后面的数字到底是正还是负的，交给程序去验证就行了。  也是为了确认它的代码，俺才去算了一下101到底是正还是负：因为 101 =  2 × 50 + 1 ， 50 是偶数，和 5 = 2 × 2 + 1 、 9 = 2 × 4 + 1 是同一个特点的，所以确定它是负的。（第一个数字 1 = 1 × 0 + 1 是这个特点的例外。）结果也是如此。

user: user-2
content: 不好意思，上面程序中 这个句子是多余的 (是我 仅仅用于 测试）  prinn("x=" + x);

user: user-2
content: 引用 3 楼 拥抱Linux 的回复:首先说，俺的结果是 -49 。 你的代码和算式有一些出入： （1）根据算式，数字 1 是正的，而数字5、9、...、101是负的，所以 sum0的初始值不应该是1 ， sum1 的初始值也不应该是3 。 （2）同样的原因，最后 sum 也不应该是 sum0 -  sum1 ，而应该是 sum1 - sum0 。 （3）当 x 等于 101 的时候，还进入了循环，所以 sum0 最后加的一个数是 105 。 （4）同样的原因，sum1 最后加的一个数是 103 。  附上俺的代码，供参考。同时，欢迎讨论，以及及时结帖、给分。：）  #include <stdio.h>  int main(void) { 	// 1+3-5+7-9......101  	int flag = 1; 	int sum = 1; 	int n; 	for (n = 3; n <= 101; n += 2) { 		sum += n * flag; 		flag = -flag; 	} 	printf("%d\n", sum);  	return 0; }   你的程序结果(-49) 应该正确。我也测试一下，也得到-49的结果。题目中的101具有误导性，事实上 它是 -101    int myFunc() {     //1 + 3 - 5 + 7....      int res = 1;     int k = 1, x;      while(1) {         x = k*2 +1;         if (x > 101) break;          if (k %2 == 0) {             x = -x;         }         prinn("x=" + x);         res += x;         ++k;     }     return res; }

user: user-4
content: 你的程序算的好像是： sum0=1+5+9+13.... sum1=3+7+11+15...  sum0-sum1=1-3+5-7+9....

user: user-3
content: 首先说，俺的结果是 -49 。 你的代码和算式有一些出入： （1）根据算式，数字 1 是正的，而数字5、9、...、101是负的，所以 sum0的初始值不应该是1 ， sum1 的初始值也不应该是3 。 （2）同样的原因，最后 sum 也不应该是 sum0 -  sum1 ，而应该是 sum1 - sum0 。 （3）当 x 等于 101 的时候，还进入了循环，所以 sum0 最后加的一个数是 105 。 （4）同样的原因，sum1 最后加的一个数是 103 。  附上俺的代码，供参考。同时，欢迎讨论，以及及时结帖、给分。：）  #include <stdio.h>  int main(void) { 	// 1+3-5+7-9......101  	int flag = 1; 	int sum = 1; 	int n; 	for (n = 3; n <= 101; n += 2) { 		sum += n * flag; 		flag = -flag; 	} 	printf("%d\n", sum);  	return 0; }

user: user-5
content: 你和你的同学算的都有问题吧？

user: user-6
content: 3是加的，不是减的，你这个程序是1-3+5-.....+101
user-0 提问: 请问这段程序为什么不能将文件一中的内容复制到文件二中？

回复:
user: user-1
content: #include <stdio.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <string.h> #include <unistd.h>    int main(int argc,char ** argv) {     int fd1,fd2;     char buf[100];     int ret = 1;     //long filelen = 0;      if(argc != 3)     {         printf("输入错误\n");         return -1;     }     else     {         fd1 = open(argv[1],O_RDONLY);          if(-1 == fd1)         {             printf("打开%s失败\n",argv[1]);             return -1;         }         else         {              //fd2 = open(argv[2], O_RDWR | O_CREAT);             fd2 = open(argv[2], O_RDWR | O_CREAT, 0644);             if(-1 == fd2)             {                 printf("打开%s失败\n",argv[2]);                 return -1;             }             else             {                 //while (ret = read(fd1, buf,strlen(buf)) > 0)                 while ((ret = read(fd1, buf, sizeof(buf))) > 0)                 {                     //read(fd1,buf,strlen(buf));                     write(fd2,buf,ret);                 }             }         }          close(fd1);         close(fd2);     }      return 0; }  供参考！  buf， strlen(buf)计算的是缓存里有多少有效字符，而不是用来计算缓存长度的，如果要用，建议用sizeof
user-0 提问: 9从哪里来？

回复:
user: user-1
content: 好像又说错了。。。。。还是参考6楼的哥们吧，我再查查

user: user-1
content: 希望楼主勘误，我那里说错了，哈哈当时也不知咋的脑子一热就直接顺手写了。你的p和s都是char*型，相减结果是char*。对于char*的指针相减，结果就是地址值相减，而对于其他诸如int*、double*的指针就要注意了，这里就不另展开了，你有疑问的再问吧。

user: user-1
content: 引用 6 楼 拥抱Linux 的回复:指针相减的结果，不是 指针的定义语句中的类型，而是 指针本身的数据类型， 一般是 int 型 或者 long 型， 跟 机器平台 的 位数 有关。具体的数据类型 是 ptrdiff_t ，此数据类型 定义在C99标准中。 抱歉抱歉，我说顺口了，都忘了楼主的代码了

user: user-2
content: 引用 5 楼 六道佩恩 的回复:*p++等效于*p, ++p。在while的判断中，为0就退出循环，所以当*p的值为0时就结束循环。 然后"a string"，这是个字符串，也是个字符数组，它是每个数组元素都是由字符组成，字符嘛，就是个char型的整数，而这个字符串以0号字符结尾，也就是说，这个字符实际上是"a string\0"，一共9个字符，只是最后一个\0你看不到而已。 再看*p++，每循环一次，p就在自增，说白了，p所指的位置在逐渐后移，最开始它是指向a的，下一次指向空格，再下一次指向s，当最后指向0的时候，*p就是\0了，while发现判断为0后就退出循环，但此时别忘了，p在*p后还要自增1，也就是说，p指向了\0的后一个位置。 然后呢，s指向的a，相当于指向[0]，p指向的是\0的下一个位置，相当于指向[9]的位置，所以p-s就是两个位置相减，就得9。 然后，p和s都是int*型，相减的结果也是int*型，我们想要的是int型的整数结果，所以就把它强制转换为了int。  指针相减的结果，不是 指针的定义语句中的类型，而是 指针本身的数据类型， 一般是 int 型 或者 long 型， 跟 机器平台 的 位数 有关。具体的数据类型 是 ptrdiff_t ，此数据类型 定义在C99标准中。

user: user-1
content: *p++等效于*p, ++p。在while的判断中，为0就退出循环，所以当*p的值为0时就结束循环。 然后"a string"，这是个字符串，也是个字符数组，它是每个数组元素都是由字符组成，字符嘛，就是个char型的整数，而这个字符串以0号字符结尾，也就是说，这个字符实际上是"a string\0"，一共9个字符，只是最后一个\0你看不到而已。 再看*p++，每循环一次，p就在自增，说白了，p所指的位置在逐渐后移，最开始它是指向a的，下一次指向空格，再下一次指向s，当最后指向0的时候，*p就是\0了，while发现判断为0后就退出循环，但此时别忘了，p在*p后还要自增1，也就是说，p指向了\0的后一个位置。 然后呢，s指向的a，相当于指向[0]，p指向的是\0的下一个位置，相当于指向[9]的位置，所以p-s就是两个位置相减，就得9。 然后，p和s都是int*型，相减的结果也是int*型，我们想要的是int型的整数结果，所以就把它强制转换为了int。

user: user-2
content: 详细解释，如下图：  顺便建议自己试试改改代码，把 char 改成 int 或者其它数据类型，把相关的代码也调整号，然后看看单个数据占据不同内存空间的结果是什么样子的。 欢迎及时结帖、给分。：）

user: user-3
content: 8个有效字符，那么9就是'\0'

user: user-4
content: while这部分*p++，先调用先运算后++，对+之前的指针*取内容，也就是说*p，依次是'a',' ','s'....,'\0',0(null). 当*p++==0时，还执行了一次++，而p-s，是p相对于s的位置，有点像下标

user: user-5
content: 这个其实就是计算字符串的长度 while(*p++);就是循环直到p指向的字符为0，最后p++ p-s就是计算p和s之间的距离 由于都是字符指针，相减后就是字符串长度（包括\0）
user-0 提问: 初学者求救！！

回复:
user: user-1
content: 引用 6 楼 qq_16035059 的回复:[quote=引用 3 楼 拥抱Linux的回复:]无他，唯手熟尔。 练习，大量的练习；错误，大量的错误；纠误，大量的纠错。 另外，要认识到，有BUG是正常的，没有BUG才不正常。 老师讲太快了，半个学期讲完了c，我现在开始c++了，更难[/quote]  网上有很多轻量级的、优秀的C语言相关教学视频，相比于书本上的文字而言，视频更加直观，可以挑其中的与指针直接相关的内容看看，借此了解指针的本质——指针也不过是一种数据类型而已，了解数组的本质——同类型数据的并排而已，再敲代码练习练习、调试调试，一般的情况就差不多能对付了。稍微深入一点，还可以顺便了解数据在内存中的存储形式，也就七七八八了。 不用着急一下子把所有的东西都搞得很透彻，那样的要求也太高了！

user: user-2
content: 可以自己参照网上的例子写一些代码，解决了很多的BUG，你的能力就增强喽

user: user-0
content: 引用 3 楼 拥抱Linux的回复:无他，唯手熟尔。 练习，大量的练习；错误，大量的错误；纠误，大量的纠错。 另外，要认识到，有BUG是正常的，没有BUG才不正常。 老师讲太快了，半个学期讲完了c，我现在开始c++了，更难

user: user-0
content: 引用 2 楼 赵4老师的回复:http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 炒鸡感谢啊啊啊啊啊！

user: user-0
content: 引用 1 楼 自信男孩的回复:看别人写的代码，根据定义理解程序 背太多了容易忘还弄混了！

user: user-1
content: 无他，唯手熟尔。 练习，大量的练习；错误，大量的错误；纠误，大量的纠错。 另外，要认识到，有BUG是正常的，没有BUG才不正常。

user: user-3
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-4
content: 看别人写的代码，根据定义理解程序
user-0 提问: 为什么我在创造一个二叉排序树的时候，无法调用insert函数，导致t根函数和二叉树无法创建成功？

回复:
user: user-1
content: 由于你insert函数中要修改t的值，你做的只是修改形参的值，并不能影响实参，出了这个函数就什么都没了，t还是原来的NULL，所以如果你要修改t(bstnode* t)的值,形参要用(bstnode** t)，用它的地址进行修改 可以看一下我刚写的一篇关于指针的文章https://blog.csdn.net/qq_40946921/article/details/90047918  #include<iostream> using namespace std; typedef char datatype; typedef int keytype; typedef struct node { 	keytype key; 	datatype other; 	struct node* lchild, * rchild; }bstnode; bstnode* t;  void insert(bstnode** t, bstnode* s)  //t为二叉排序树的根指针，s为插入的结点指针 { 	if (*t == NULL) *t = s;   //原树为空，返回s作为根指针 	else 	{ 		if (s->key < (*t)->key) insert(&(*t)->lchild, s);    //在左子树中查找插入位置 		else insert(&(*t)->rchild, s);  //在右子树中查找插入位置 	} }     //INSERTBST1   bstnode* CREATBST()  //生成二叉排序树 { 	bstnode* t, * s; 	keytype key, endflag = 0;   //endflag为结点结束标志 	int data; 	t = NULL;   //设置二叉排序树的初态为空树 	printf("\n请输入学生的学号：\n"); 	scanf("%d", &key);     //读入一个结点的关键字 	while (key != endflag)   //当输入非结束标志时，执行以下操作 	{ 		s = (bstnode*)malloc(sizeof(bstnode));   //申请新结点 		s->lchild = s->rchild = NULL;  //将新结点的指针域置空 		s->key = key; 		printf("\n请输入该学生的成绩：\n"); 		scanf("%d", &data);   //读入结点的其他数据项 		s->other = data; 		insert(&t, s);    //将新结点插入树t中，通过调用insert 		printf("\n请输入学生的学号：\n"); 		scanf("%d", &key);  //读入下一个结点的关键字 	}  	return t; }   //CREATEBST int main() { 	bstnode* k=CREATBST(); 	return 0; }
user-0 提问: 怎么回事？

回复:
user: user-1
content: 写到文件里面，再对比，如何？

user: user-2
content: 把printf放到花括号外面

user: user-3
content: 你可以在循环里sleep了慢慢跑了看，太快了前面的数据刷没了啊

user: user-4
content: 打印太快刷掉了

user: user-5
content: 也可以把printf放到循环外，这样只输出一句了。

user: user-5
content: 程序没问题，把999改成9试试

user: user-6
content: 输出结果的行数太多了，屏幕上显示的是最后的若干行的结果而已。  要查看所有的输出结果的话，就用鼠标向上拖动控制台窗口右边的滚动条，就可以看到前面的了。  或者，把 循环 的次数减少， 比如 把 (i < 999) 改成 (i < 9) 就可以看到值很小的时候的输出结果了。  建议，及时结帖、给分啊！：）  ```

user: user-7
content: 程序没有问题，只是因为你每个得到的sum占一行，dos界面就显示不出之前的结果了，你可以试着改为printf("%d  ",sum);就可以看到所有的结果！

user: user-8
content: 你的245350 是 第701次求和

user: user-8
content: 因为你打印了999次， 第一次的结果早就看不见了。 你试试把鼠标网上拖，能看见前面的。 或者你打印语句 变成 printf("【第%d次求和】= %d\n", i, sum);
user-0 提问: C语言的循环语句

回复:
user: user-1
content: usleep

user: user-2
content: 引用 2 楼 weixin_43956598 的回复:程序框架没有问题，但sleep函数有点点问题。 不知道你是用的什么编译器，有的编译器sleep中的s是大写，有的是小写。一般情况下我们写成Sleep(1); 还有就是不要忘记头文件#include<windows.h> Linux下就是sleep

user: user-3
content: 引用 3 楼 自信男孩 的回复：[quote=引用 2 楼 weixin_43956598 的回复:] 程序框架没有问题，但sleep函数有点点问题。 不知道你是用的什么编译器，有的编译器sleep中的s是大写，有的是小写。一般情况下我们写成Sleep(1); 还有就是不要忘记头文件#include<windows.h> Linux下就是sleep[/quote]是，回答中说了看编译器，有大写有小写，根据编译需要和环境

user: user-3
content: 程序框架没有问题，但sleep函数有点点问题。 不知道你是用的什么编译器，有的编译器sleep中的s是大写，有的是小写。一般情况下我们写成Sleep(1); 还有就是不要忘记头文件#include<windows.h>

user: user-2
content: while (1) {     if (xx)         sleep(1); } 这样吗？