Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 为什么文件里的内容没有改变？

回复:
user: user-1
content: #include<stdio.h> #include<string.h>  //#include<windows.h> #include<stdlib.h> //#include<conio.h>  struct yonghu//用户信息 {     int zhanghao;//账号     char name[7];//用户名     char id[20];//用户身份证     char password[10];//用户密码 }users[500];  void revise();//修改信息  int main() {      revise();      return 0; }  void revise() {     int i;     int zhanghao2, ret;     char name2[7],password2[10],id2[20];     char name3[7];     printf("请输入要修改的用户名：\n");     scanf("%s",name3);     printf("请输入修改的账号：\n");     scanf("%d",&zhanghao2);     printf("请输入修改的用户名：\n");     scanf("%s",name2);     printf("请输入修改的身份证：\n");     scanf("%s",id2);     printf("请输入修改的密码：\n");     scanf("%s",password2);      FILE *fp;     fp=fopen("用户信息.txt","r+");     if(fp==NULL)     {         printf("error file can't be open!\n");         exit(0);     }       for(i=0;;i++)     {         ret = fscanf(fp,"%d %s %s %s",&users[i].zhanghao,users[i].name,users[i].id,users[i].password);         if (ret < 4)             break;         //if(strcmp(users[i].name,name3[7])==0)         if(strcmp(users[i].name,name3)==0)         {             //         printf("2");             users[i].zhanghao=zhanghao2;             //strcpy(users[i].name,name2[7]);             strcpy(users[i].name,name2);             //strcpy(users[i].id,id2[20]);             strcpy(users[i].id,id2);             //strcpy(users[i].password,password2[10]);             strcpy(users[i].password,password2);              //break;    //跳出循环，否则死循环了（如果不加ret和判断） 这句不用了             //fprintf(fp,"%d %s %s %s",users[i].zhanghao,users[i].name,users[i].id,users[i].password);         }     }      //rewind(fp);    //用这句或者下句都可以     fseek(fp, 0, SEEK_SET);     for (i = i -1; i >= 0; i--)             fprintf(fp,"%d %s %s %s",users[i].zhanghao,users[i].name,users[i].id,users[i].password);      fclose(fp);     printf("修改成功！"); } 供参考～
user-0 提问: 想输出直接排序，选择排序，堆排序，快速排序的前五行排序结果，选择和直接插入可以了，剩下两个有大神帮忙么？

回复:
user: user-1
content: 网上先搜一下吧，代码和说明（算法介绍）都有了。

user: user-2
content: 参考这个？ 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/
user-0 提问: c语言程序设计

回复:
user: user-1
content: struct 里放一个总分和合格的成员，输入的时候一并算出来保存上，统计和排序的时候就参照这2个的值。

user: user-1
content: 出差不方便，大概写了下，你参考参考。  struct stu {     char name[10];     char id[20];     float zhengzhi;     float shuxue;     float zongfen;     int tongguo; };  typedef struct stu Stu;  void input(Stu *stu,size_t n) {          for(size_t i=0;i<n;i++)     {         scanf("%s\n",stu->name);         scanf("%f%f",&stu->zhengzhi,&stu->shuxue);                  stu->zongfen=stu->zhengzhi+stu->shuxue;         stu->tongguo=stu->zongfen > 310 && (stu->zhengzhi >=40 && stu->shuxue>=40);         stu++;     }      }  void print(Stu *stu,size_t n) {     for(size_t i=0;i<n;i++)     {         printf("%s %s %.1f %.1f %.1f %s\n",stu->name,stu->id,stu->zhengzhi,stu->shuxue,stu->zongfen,(stu->tongguo)?"通过":"不通过");         stu++;     }      }  int main() {          Stu stu[3]={0};     input(stu,3);     print(stu,3);  	 	return 0; }

user: user-0
content: 引用 1 楼 一颗白面馒头的回复:看你id是个楚夏党？所以课程设计还是自己做好一点网上这种系统设计的也很多，大体都是差不多的 帮帮我吧

user: user-0
content: 引用 4 楼 浪客的回复:struct 里放一个总分和合格的成员，输入的时候一并算出来保存上，统计和排序的时候就参照这2个的值。 具体怎么弄，搞不来

user: user-0
content: 引用 2 楼 浪客的回复:一个struct数组搞定 那个统计的怎么弄？

user: user-1
content: 一个struct数组搞定

user: user-2
content: 看你id是个楚夏党？所以课程设计还是自己做好一点网上这种系统设计的也很多，大体都是差不多的
user-0 提问: 为什么文件里的内容没有修改

回复:
user: user-1
content: fp=fopen("用户信息.txt","a");这 是读文件，写文件要用fp=fopen("用户信息.txt","w");

user: user-2
content: 既然楼主急于落实文件访问，那其他错误就不提了。 文件打开必须要检测是否失败，另外 文件是不能读了就写的 即使你的打开方式带加号 读操作写操作之间也必须有定位操作，对于文本，就rewind吧 也就是说，如果你不想两次打开 那就得带加号打开 全读完 rewind 全写完 关闭 综上，酱紫。

user: user-0
content: 引用 1 楼 浪客的回复:for只运行1次后break出来了。 fprintf里name2[7]和后面的几个数组不对，应该用数组名。把[7]删了。 谢谢，可是改了之后文件里的内容还是没改

user: user-3
content: for只运行1次后break出来了。 fprintf里name2[7]和后面的几个数组不对，应该用数组名。把[7]删了。
user-0 提问: 求帮助！！利用C语言实现   商店销售管理系统

回复:
user: user-1
content: 引用 楼主 风吹南边来 的回复:求帮助  可私信详聊 感谢大佬们救救孩子 功能： （1）屏幕上出现一个界面，让售货员输入商品编号或者商品名称，可 以进货，进货后商品库存同时增加。顾客买走商品后，售货员输入商品 编号或者商品名称，可以生成销售清单，统计本次销售总的价钱，同时 库存数量相应减少。完成前面的基本功能后，还可以完成增加新的商品 或删除不需要的商品的功能，以及每天销售统计功能等。 （2）保存：将相关数据写入磁盘文件，便于存、取操作。 要求： （1）用 C 语言实现程序设计； （2）利用结构体和链表进行相关信息处理； （3）系统的各个功能模块要求用函数的形式实现； （4）界面友好（良好的人机交互），程序要有注释。 代码呢

user: user-1
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 qq_1457346882 的回复:][quote=引用 楼主 风吹南边来 的回复:]求帮助  可私信详聊 感谢大佬们救救孩子 功能： （1）屏幕上出现一个界面，让售货员输入商品编号或者商品名称，可 以进货，进货后商品库存同时增加。顾客买走商品后，售货员输入商品 编号或者商品名称，可以生成销售清单，统计本次销售总的价钱，同时 库存数量相应减少。完成前面的基本功能后，还可以完成增加新的商品 或删除不需要的商品的功能，以及每天销售统计功能等。 （2）保存：将相关数据写入磁盘文件，便于存、取操作。 要求： （1）用 C 语言实现程序设计； （2）利用结构体和链表进行相关信息处理； （3）系统的各个功能模块要求用函数的形式实现； （4）界面友好（良好的人机交互），程序要有注释。 代码呢[/quote]  代码要你写啊，哈哈哈[/quote] 那怕是疯了

user: user-2
content: 引用 2 楼 qq_1457346882 的回复:[quote=引用 楼主 风吹南边来 的回复:]求帮助  可私信详聊 感谢大佬们救救孩子 功能： （1）屏幕上出现一个界面，让售货员输入商品编号或者商品名称，可 以进货，进货后商品库存同时增加。顾客买走商品后，售货员输入商品 编号或者商品名称，可以生成销售清单，统计本次销售总的价钱，同时 库存数量相应减少。完成前面的基本功能后，还可以完成增加新的商品 或删除不需要的商品的功能，以及每天销售统计功能等。 （2）保存：将相关数据写入磁盘文件，便于存、取操作。 要求： （1）用 C 语言实现程序设计； （2）利用结构体和链表进行相关信息处理； （3）系统的各个功能模块要求用函数的形式实现； （4）界面友好（良好的人机交互），程序要有注释。 代码呢[/quote]  代码要你写啊，哈哈哈
user-0 提问: 这个填空怎么做啊 我老是运行不出来

回复:
user: user-1
content: 引用 10 楼 早打大打打核战争 的回复:老赵的经典台词，老师也不能代替啥啥的那句还不上来~  老师头疼的不是学生不知道，而是他们不知道自己不知道。

user: user-2
content: 老赵的经典台词，老师也不能代替啥啥的那句还不上来~

user: user-3
content: 不急，慢慢来。

user: user-3
content: #include <stdio.h> int PositiveNum(int a[], int n) {     int i,count=0;     for (i=0;i<n;i++)     {         if (a[i]>0) count++;     }     return count; } int main() {     int b[10]={1,0,2,3,4,-1,-2,-3,-4,0};     printf("%d\n",PositiveNum(b,10)); //4     return 0; }  大饼中间挖个洞，套脖子上，还不行；还得帮转，帮嚼，帮咽，帮消化，帮拉，帮活，……

user: user-0
content: 引用 1 楼 赵4老师的回复:①=0 ②count++ ③count 我早就试过了 运行不出来

user: user-4
content: 引用 2 楼 m0_53759618 的回复:[quote=引用 1 楼 赵4老师的回复:]①=0 ②count++ ③count 不是这个 试过了[/quote] 眼睛瞪大一点，就对了。。

user: user-4
content: 楼上正解。。。

user: user-0
content: 引用 1 楼 赵4老师的回复:①=0 ②count++ ③count 不是这个 试过了

user: user-3
content: ①=0 ②count++ ③count

user: user-0
content: 引用 7 楼 立 夏的回复:[quote=引用 6 楼 赵4老师 的回复:]#include <stdio.h> int PositiveNum(int a[], int n) {     int i,count=0;     for (i=0;i<n;i++)     {         if (a[i]>0) count++;     }     return count; } int main() {     int b[10]={1,0,2,3,4,-1,-2,-3,-4,0};     printf("%d\n",PositiveNum(b,10)); //4     return 0; }  大饼中间挖个洞，套脖子上，还不行；还得帮转，帮嚼，帮咽，帮消化，帮拉，帮活，…… 可太C了，赵四老师都把答案说了，可这个提问者，给了答案都不会有用，诶....编程水平不是一般的低[/quote] 我才开始学啊....

user: user-5
content: 引用 6 楼 赵4老师 的回复:#include <stdio.h> int PositiveNum(int a[], int n) {     int i,count=0;     for (i=0;i<n;i++)     {         if (a[i]>0) count++;     }     return count; } int main() {     int b[10]={1,0,2,3,4,-1,-2,-3,-4,0};     printf("%d\n",PositiveNum(b,10)); //4     return 0; }  大饼中间挖个洞，套脖子上，还不行；还得帮转，帮嚼，帮咽，帮消化，帮拉，帮活，…… 可太C了，赵四老师都把答案说了，可这个提问者，给了答案都不会有用，诶....编程水平不是一般的低
user-0 提问: 怎么做这个求告知，哭唧唧

回复:
user: user-1
content: if flag == '学号' 这不是C语言的语法吧  先把代码格式，排版调试好了。

user: user-2
content: 声明一个结构体，成员包括姓名、手机号等，然后用结构体数组来实现上述各模块的功能

user: user-0
content: # include<stdio.h>int a[];		//定义一个二位数组用来存储通讯录void shixian();void shixian(){	# 实现显示通讯录的功能	for (i=1; i<=len(a); ++i)    {        printf(a[i])		}		}void chaxun(){	# 实现查询通讯录的功能	flag = scanf('请选择查询的类型：')	if flag == '学号'：		xuehao = int(input('请输入您要查询的学号：'))		for i in len(a):			if xuehao == a[i][1]:				printf(a[i])}void tianjia(){	name = scanf('请输入姓名')	studenter = scanf('请输入学号')	number = scanf('请输入电话')	a.insert([name,studenter, number])}	void mian(){	printf('程序开始，根据需求输入，例如，显示通讯录，则输入显示。')	while True(){	flag = input('请输入您的需求')	a = false			switch(flag){			case flag == '显示'：				xianshi();				break;			case flag == '添加':				chaxun();				break;			case flag == '退出';				a = true			}	if a{		break;	}			}	}
user-0 提问: c语言编程新手问题，麻烦各位大佬看看

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

user: user-2
content: 其实你把while循环改一下就理解了 while (getchar() != '\n'); 改成以下 while(1) { //无条件循环     if (getchar()=='\n') break; //每次循环接收一个输入，输入如果是回车就退出循环 } 这两个while是等效的

user: user-2
content: 引用 楼主 xyfffz 的回复:这个程序的要求是每24次平方后暂停，录入回车键后继续。我看不懂这个空循环。请问运行到19行时，当输入的不是回车，不就执行空语句吗，执行完空语句不是还得继续for循环吗，照这样说就与要求不符了呀？ 你没理解while循环，如果输入的不是回车，那么getchar() != '\n'就会一直成立，就会一直重复while循环（循环空语句什么都不处理，但循环没有结束，会继续循环），直到你输入回车，getchar() != '\n'不成立才会退出while循环，接着才会重新继续for循环

user: user-3
content: 你是不是对while有什么误解？还以为是if呢？
user-0 提问: 两数之和（C语言）

回复:
user: user-1
content: 完全正确，没语法问题。不知道要实现什么功能，谁也帮不了你。

user: user-2
content: 第一个判断改成 if(nums[i] + nums[j] == target)。 输入的 int nums[] 应该要是排好序的数组。 其他好像没啥问题，楼主你看下还有什么问题。

user: user-3
content: 测试一下0+0=？
user-0 提问: c语言程序新手问题，麻烦各位大佬看看

回复:
user: user-0
content: 引用 1 楼 forever74的回复:这个调用姿势不对。 printf("\n该数组和为%d",sum(a, n)); 然后把其上那行取消即可。 谢谢╰(*´︶`*)╯

user: user-1
content: 这个调用姿势不对。 printf("\n该数组和为%d",sum(a, n)); 然后把其上那行取消即可。

user: user-2
content: #include <stdio.h>   int main() {     int sum(int *p,int n);     int a[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 5};     int n = 10;     //sum(a, n);     printf("\n该数组和为%d",sum(a, n)); }  int sum(int*p, int n) {     int i;     int sum = 0;     for (i = 0; i < n; i++,p++)         sum += *p;     return sum; }  供参考～  或者用一个变量接收sum的返回值，然后在下面打印该变量～
user-0 提问: c语言求助

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

user: user-1
content: 最后2句改一下 a[0][m + 1] = max;后面加上下面这句 a[0][sum2+1]='\0'; //字符串结束符被覆盖，要加上   取a[1]中的最大字符，放到a[0]中最小字符所在m后面，a[0]从m后开始依次往后移一位。 MynameisAmyxzxca MynameisJanesdcx 前是a[0]，后面是a[1]，a[1]最大是y，a[0]最小是A，y插入到A后面了。 程序除了那个'\0'字符外没问题的。

user: user-2
content: 楼主想做什么？没看懂代码～
user-0 提问: 一个无法理解的free错误

回复:
user: user-1
content: 继续，尽管destroy里面的unit也同样不讲究，但用来free却没有额外错误。 然而，凭什么每个结构体四个指针三个malloc，却又四个free呢？多出来的free肯定要出错。

user: user-2
content: #include "stdio.h" #include "stdlib.h" #include "string.h"  /*** 单元格矩阵长宽均有多少个单元**/ int mMatrixLength = 0; /* 每个单元格的长宽 */ float mMapUnitLength = 0.2; /*地图数据结构 */ struct mapUnit {     float *texCoor;    //控制在框内怎么填充图片     float *vertices;   //顶点，x,y,z,x,y,z     char *filePath;    //当前加载的图块的filePath     char *pixels;      //图块像素     char drawFinished; //加载的图块变更后，标记是否已加载对应像素到结点 };  typedef struct mapUnit MapUnit; //图块矩阵(二维指针) MapUnit *mMapUnitMatrix;  void init(){     //创建地图(有问题，偶发性闪退)     mMatrixLength = 4; //原坐标移动到左上角，所以画面长宽变成了2f。加1是为了横向纵向都多一行不可见缓冲边     mMapUnitMatrix = (MapUnit*) malloc(sizeof(MapUnit) * mMatrixLength * mMatrixLength);     int i;     for (i = 0; i < mMatrixLength * mMatrixLength; i++)     { #if 0         //MapUnit unit = mMapUnitMatrix[i];         unit.texCoor = (float *)malloc(sizeof(float) * 12); //赋值统一的TexCoor         unit.vertices = (float *)malloc(sizeof(float) * 18); //赋值每个图块单元一个符合自己位置的坐标         unit.drawFinished = 0; //每个新建的图块都是没完成像素填充的         unit.pixels = (char *)malloc(36); #else         MapUnit *unit = mMapUnitMatrix + i;         unit->texCoor = (float *)malloc(sizeof(float) * 12); //赋值统一的TexCoor         unit->vertices = (float *)malloc(sizeof(float) * 18); //赋值每个图块单元一个符合自己位置的坐标         unit->drawFinished = 0; //每个新建的图块都是没完成像素填充的         unit->pixels = (char *)malloc(36); #endif     }     printf("init\n"); }  void destroy(){     printf("destroy:%llu\n", mMapUnitMatrix);     int i;     for (i = 0; i < mMatrixLength * mMatrixLength; i++)     {         MapUnit unit = mMapUnitMatrix[i];         free(unit.pixels);         unit.pixels = NULL;         free(unit.vertices);         unit.vertices = NULL;         free(unit.texCoor);         unit.texCoor = NULL;         free(unit.filePath);     }     free(mMapUnitMatrix);     mMapUnitMatrix = NULL; }  MapUnit getUnit(int x, int y) {     return mMapUnitMatrix[y * mMatrixLength + x]; }   int main() {     while(1)     {         init();         destroy();         // init();         // destroy();     }     return 0; } 供参考～  给没有malloc的结构体成员释放空间会出现这种问题。  注意unit是结构体，在malloc的时候，如果用结构体变量而不用结构体指针申请空间，申请的空间只会是结构体变量的，而不是原有的。

user: user-1
content: 为啥要搞个unit呢？这东西是蛇足，并引起了大部分的错误。 你的init里面的大量对unit的成员的赋值和你那16个结构体一点关系都没有。 也就是说init结束的时候你那16个结构体里面的64个指针仍然是野指针。
user-0 提问: 求解

回复:
user: user-1
content: OJ啊，那么主要的问题在于你没有阅读必要的说明。甚至题目也不完整，完整的题目是包括输入输出格式和例子的。 大多数OJ要求严格的输出格式，而你没有表达题目对输出格式的要求，大概率是没有关注。 多数OJ要求主函数向操作系统返回0以表达自己是正常结束，而你的主函数没有。

user: user-2
content: 因为你是要求整除，而直接相除结果会不对 例如  计算机中 3/2=1 而不是1.5

user: user-0
content: 电脑判断机制啊。解决上面的问题，我写的代码提交时给我的结果是答案错误。       给你两个数组，从第一个数组中选择一个数x，从第二个数组中选择一个数y，问你有多少种方案使得y/x的值为k 输入第一行一个整数T，接下来有T组测试数据 对于每一组测试数据，第一行输入两个数n和k 接下来输入n个数，代表第一个数组的值 接下来输入n个数，代表第二个数组的值 1<=T<=10,1<=n<=1000,1<=k<=10000,1<=a[i],b[i]<=1000000    这就是问题。。。

user: user-1
content: 是啊，为什么呢？ 关键在于，什么叫错了？ 谁说错了？ 怎么说的？ 说的什么？ 没有足够的信息，一个什么也不干的程序也可以说是正确的程序： int main(){}
user-0 提问: 我觉得两个都差不多为什么第一个错了1.

回复:
user: user-1
content: 好乱，到底哪个是你写的哦。草草看了一下，scanf("%s %s %d %d\n",&stu[i].num,&stu[i].name,&stu[i].s,&stu[i].c);这句话不应该加\n，num和name前面不加&符号

user: user-2
content: 你把return 0;写在循环里面了。

user: user-0
content: 引用 楼主 qq_53415956的回复:#include<stdio.h> int main() { 	int n; 	double a[15]; 	scanf("%d",&n); 	for(int i=0;i<n;i++) 	{ 		scanf("%lf",&a[i]); 	} 	for(int i=0;i<n-1;i++) 	{ 		for(int j=0;j<n-1-i;j++) 		{ 			if(a[j]>a[j+1]){ 				double tmp=a[j]; 				a[j]=a[j+1]; 				a[j+1]=tmp; 			} 		}	 	} 	for(int i=n-1;i>=0;i--) 		{ 			if(i==n-1) 			{ 				printf("%.2lf",a[i]); 			 				} 			else{printf("% .2lf",a[i]); 			} 		} 	return 0; } 2 #include<stdio.h>        struct student     {         char num[13];         char name[20];         int s;         int c;     }stu[11]; int main() {     int n; 	int cnt=0;     scanf("%d",&n);     for(int i=0;i<n;i++)     {         scanf("%s %s %d %d\n",&stu[i].num,&stu[i].name,&stu[i].s,&stu[i].c); 		if (stu[i].c>=60){ 		cnt++; 	}     } 	printf("%d\n",cnt); 	for(int i=0;i<n;i++) 	{ 		if(stu[i].c>=60) 		printf("%s %s\n",stu[i].num,stu[i].name); 	}                return 0; } 题目：  #include<stdio.h> struct student { 	char num[13]; 	char name[20]; 	int g; 	int c; }stu[11]; int main() { 	int n,i,x=0;     scanf("%d",&n); 	for(i=0;i<n;i++) 	{ 		scanf("%s %s %d %d",&stu[i].num,&stu[i].name,&stu[i].g,&stu[i].c); 		if(stu[i].c>=60) 		{ 			x++; 		} 	} 	printf("%d\n",x); 	for(i=0;i<n;i++) 	{ 		if(stu[i].c>=60) 		{ 			printf("%s %s\n",stu[i].num,stu[i].name); 		} 		return 0; 	} } 这是我写的，我的不对，第二个对，我不知道为什么

user: user-0
content: 引用 楼主 qq_53415956的回复:#include<stdio.h> int main() { 	int n; 	double a[15]; 	scanf("%d",&n); 	for(int i=0;i<n;i++) 	{ 		scanf("%lf",&a[i]); 	} 	for(int i=0;i<n-1;i++) 	{ 		for(int j=0;j<n-1-i;j++) 		{ 			if(a[j]>a[j+1]){ 				double tmp=a[j]; 				a[j]=a[j+1]; 				a[j+1]=tmp; 			} 		}	 	} 	for(int i=n-1;i>=0;i--) 		{ 			if(i==n-1) 			{ 				printf("%.2lf",a[i]); 			 				} 			else{printf("% .2lf",a[i]); 			} 		} 	return 0; } 2 #include<stdio.h>        struct student     {         char num[13];         char name[20];         int s;         int c;     }stu[11]; int main() {     int n; 	int cnt=0;     scanf("%d",&n);     for(int i=0;i<n;i++)     {         scanf("%s %s %d %d\n",&stu[i].num,&stu[i].name,&stu[i].s,&stu[i].c); 		if (stu[i].c>=60){ 		cnt++; 	}     } 	printf("%d\n",cnt); 	for(int i=0;i<n;i++) 	{ 		if(stu[i].c>=60) 		printf("%s %s\n",stu[i].num,stu[i].name); 	}                return 0; } 题目：  第一个弄错了
user-0 提问: 萌新求教

回复:
user: user-0
content: 感谢各位指点！成功了

user: user-1
content: int main() {     int a,b,sum=0;     scanf("%d %d",&a,&b);     for(int i=a+1;i<b;i++)        sum += i;     printf("%d\n",sum);      return 0; }

user: user-2
content: for (i = a+1; i < b; i++)     sum+= i;   供参考～  for循环的第一个表达式是初始化，不是比较和判断～

user: user-3
content: for (i = a + 1; i < b; ++i)

user: user-3
content: for (i = a; i < b; ++i)
user-0 提问: 这是为什么呢

回复:
user: user-1

user: user-0
content: 引用 4 楼 自信男孩的回复:参数名字惹的祸吧，fa的地址赋值给了fb函数指针，fb的地址赋值给了形参fa的函数指针。所以形参fa(x) - fb(x) == 27 - 9 对的，眼瞎了我，希望晚上考试我可以眼睛明亮👀

user: user-2
content: 参数名字惹的祸吧，fa的地址赋值给了fb函数指针，fb的地址赋值给了形参fa的函数指针。所以形参fa(x) - fb(x) == 27 - 9

user: user-2
content: 参数名字惹的祸吧，fa的地址赋值给了fb函数指针，fb的地址赋值给了形参fa的函数指针。所以形参fa(x) - fb(x) == 27 - 9

user: user-3
content: 我是来接分的

user: user-0
content: 引用 楼主 Infinity G的回复: 我懂了我懂了，但是我删不了帖子
user-0 提问: 题目如图，求教：为什么输出答案不对，我自己执行代码可以得出第一行案例答案，后两个有问题

回复:
user: user-1
content: 修改如下，供参考：#include <stdio.h>   int main()   {       int flag[50]={0};     int m,n,num,i=0,index=0, k=0;      scanf("%d%d",&m,&n);     if(n>m) n=m-1;      num=m;     while(num>n){         if(flag[i]==0){            index++;            if(index%2==1){                flag[i]=1;                k++;            }         }         i++;         if(i==m){i=0;index=0;}         num=m-k;     }     for(i=0;i<m;i++){        if(flag[i]==0)           printf("%d,",i+1);     }     printf("\n");         return 0; }

user: user-2
content: error C4700: 使用了未初始化的局部变量“num”

user: user-3
content: 难道没抱错?至少变量num未初始化就使用会提示 int num,index=0,k=0; i=0; while(num>n)
user-0 提问: 关于清空输入行左边的空白字符的思路是什么呀？

回复:
user: user-1
content: #include <stdio.h> #define MAXLEN 80 char *get_first_word(char *s) {     static char t[MAXLEN];     char c;     int i,j,st;      i=0;     j=0;     st=0;     while (1) {         if (i>=MAXLEN-1) break;         c=s[i];         if (c==0) break;         if (st==0) {             if (!(c==' ' || c=='\t' || c=='\n')) {                 t[j]=c;                 j++;                 st=1;             }         } else {//st==1             if (!(c==' ' || c=='\t' || c=='\n')) {                 t[j]=c;                 j++;             } else break;         }         i++;     }     t[j]=0;       return (char*)t; } int main() {     char ln[MAXLEN];      fgets(ln,MAXLEN,stdin);     printf("[%s]\n",ln);     printf("[%s]\n",get_first_word(ln));     return 0; } // 输入： //          word abc // 输出： // [        word abc // ] // [word] //

user: user-2
content: scanf就行，天生爱跳过左空白的。

user: user-0
content: 谢谢大神

user: user-3
content: 找到第一个有效字符，然后memcpy即可。
user-0 提问: 这怎么搞啊

回复:
user: user-1
content: VS2015 C++环境调试 变量a在内存中数据是

user: user-2
content: 出题人默认的小端模式吧

user: user-3
content: 这题操蛋。不确定大小端，答案只有上帝知道。。

user: user-4
content: 不说是什么CPU，真是～呀。 假设是x86，属于小端体系，int型的4个字节里按地址从低到高依次存放0x78   0x56   0x34   0x12 所以pc+2里面保存的是0x34 。
user-0 提问: 求助

回复:
user: user-1
content: 初学C吧。 要理解这个代码，首先要弄清楚，指针变量与普通变量的区别：前者是告诉编译器，存储的值是一个地址值；后者则是数值。 所以对于指针变量p,  *p++ 和(*p)++是有区别。 函数里面，搞两个指针，一个指向头，一个指向尾。 按地址比较，然后交互数值大小。

user: user-2
content: s1=w 指针指向字符串的首地址（也就是s1指向‘1’这个字符的地址） s2=w+n-1 指针指向字符串最后一个字符的地址（也就是s2指向‘7’这个字符的地址） while(s1<s2)当s1指向的地址小于s2指向的地址则一直循环 t=*s1;*s1=*s2;*s2=t;就是交换s1和s2地址的字符，也就是‘1’变成了‘7’，‘7’变成了‘1’ s1++就是s1指向的地址递增，也就是s1指向‘2’所在的地址 s2--就是s2指向的地址递减，也就是s2指向‘6’所在的地址 这样，下一轮while循环就会交换‘2’和‘6’，再下一轮就交换‘3’和‘5’，再下一轮，s1指向‘4’，s2也指向‘4’，不满足while，循环结束 所以最终字符串变为“7654321”

user: user-3
content: fun函数实现字符串转置
user-0 提问: C语言头文件.h目录下有两句typedef void SeqList 和typedef SeqListNode是什么意思？

回复:
user: user-1
content: 给void起了不同的别名。

user: user-2
content: 给void起了个别名，分别是SeqList和SeqListNode.

user: user-3
content: void == SeqList == SeqListNode
user-0 提问: 关于设计俄罗斯方块

回复:
user: user-1
content: 版主基本归纳清楚了

user: user-2
content: 先想清楚方块下落的逻辑。比如说： （1）判断能否继续下落；（2）判断是否到底部；（3）下落一行之后判断该行是否填满；。。。 把你需要做的事想清楚后很多功能要怎么实现就很明确了。

user: user-3
content: UI + 算法
user-0 提问: 求解

回复:
user: user-0
content: 引用 1 楼 user-3的回复:char *a[] = { ... }; print(a[n-1]); 嗯嗯，谢谢你了!

user: user-0
content: 引用 3 楼 赵4老师的回复:if (1==scanf("%d", &mon) && 1<=mon && mon<=12) {  printf("%s\n", month[mon-1]); } else {  printf("Input error!\n");  return -1; } return 0;   嘿嘿，谢谢老师！

user: user-0
content: 引用 2 楼 自信男孩的回复:#include <stdio.h>  int main(void) {     int mon;      const char *month[] = {         "January", "February", "March", "April",         "May", "June", "July", "August",         "September", "October", "November", "December"};     scanf("%d", &mon);      if (mon > 12) {         printf("Input error!\n");         return -1;     }      printf("%s\n", month[mon-1]);      return 0; } 供参考～ 好的，谢谢了～

user: user-1
content: if (1==scanf("%d", &mon) && 1<=mon && mon<=12) {  printf("%s\n", month[mon-1]); } else {  printf("Input error!\n");  return -1; } return 0;

user: user-2
content: #include <stdio.h>  int main(void) {     int mon;      const char *month[] = {         "January", "February", "March", "April",         "May", "June", "July", "August",         "September", "October", "November", "December"};     scanf("%d", &mon);      if (mon > 12) {         printf("Input error!\n");         return -1;     }      printf("%s\n", month[mon-1]);      return 0; } 供参考～

user: user-3
content: char *a[] = { ... }; print(a[n-1]);
user-0 提问: C语言，为什么选B而不是选D？求解

回复:
user: user-1
content: 这题需要理解指针的概念。 这里的s，定义时实际上是int *s，也就是说定义了一个int型指针。 而数组本质上也是指针，指向该数组的起始地址。 所以说 s = x + 3 指向的是x[3]的地址。 而s[2] 实际上相当于 *(s+2)，也就相当于 *(x+5)，指向的是x[5]，所以值为 x[5] = 0。

user: user-2
content: s = &x[3];那么&s[2] == &x[3+2]

user: user-3
content: s=x+3;就是x[3], s[2]则是x[5] 就是0
user-0 提问: c语言

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

user: user-2
content: 32号和64号口红涂上去效果不同，这不是很正常吗？

user: user-3
content: 研究他们是怎么存储的，占多少位，OK。
user-0 提问: 哥哥们，帮帮我

回复:
user: user-1
content: 引用 2 楼 qq_53663635 的回复:[quote=引用 1 楼 陈仲甫的回复:]。。这是作业吧 你可以一开始显示一个1、2、3之类的文字菜单 预先把所有成绩数据加载到链表； _getch()可以获得用户的一次选择，并且不回显； 查找可以从链表头扫描到尾，挨个比较； 这是最笨的办法，但能满足作业要求 有没有代码提供的，我们没有学链表，但是有作业了[/quote]  typedef struct _MyNode { 	int iMyNodeDat;			// 这个是你自己节点的数据 	MyNode* lpNextNode;		// 你也同时包括下一个节点的指针，像链条一样，所以叫链表，最后一个元素他的lpNextNode为NULL } MyNode;   MyNode* FindVal(int iLookFor, MyNode* lpHead) { 	for (MyNode* lpNode = lpHead; NULL != lpNode; lpNode = lpNode->lpNextNode) 	{ 		if (iLookFor == lpNode->iMyNodeDat) 		{ 			return lpNode; 		} 	}  	return NULL; }

user: user-0
content: 引用 1 楼 陈仲甫的回复:。。这是作业吧 你可以一开始显示一个1、2、3之类的文字菜单 预先把所有成绩数据加载到链表； _getch()可以获得用户的一次选择，并且不回显； 查找可以从链表头扫描到尾，挨个比较； 这是最笨的办法，但能满足作业要求 有没有代码提供的，我们没有学链表，但是有作业了

user: user-1
content: 。。这是作业吧 你可以一开始显示一个1、2、3之类的文字菜单 预先把所有成绩数据加载到链表； _getch()可以获得用户的一次选择，并且不回显； 查找可以从链表头扫描到尾，挨个比较； 这是最笨的办法，但能满足作业要求
user-0 提问: c语言初学者并集问题，可能写复杂了。不知道为什么出现图中的问题

回复:
user: user-1
content: void delate(int a[]) {     int j,i;     for(i=9;i>0;i--)        if(a[i]==0)          for(j=i;j<10-1;j++)             a[j]=a[j+1]; }

user: user-2
content: 出错信息很明确，你的源代码的18行引起无效内存引用，也就是数组访问越界。
user-0 提问: 求解 急拜托拜托

回复:
user: user-1
content: 网上一大堆，仅供参考： #include <stdio.h>  int fib(int n) { 	if(n < 2) return n; 	else return fib(n-1) + fib(n-2); }  int main(void) { 	int i; 	for(i=0; i<20; i++) 	{ 		printf("%d%c", fib(i), i%4 == 3 ? '\n' : '\t'); 	} 	return 0; }

user: user-2
content: .....................这种百度一下一大堆啊~

user: user-3
content: 可参
user-0 提问: 大家看一下我哪里有问题，谢谢！ 利用函数编程：从键盘输入一个由大小写字母组成的字符串，统计与第一个字母相同的字母有几个。

回复:
user: user-0
content: 粗心了，懂了，谢了

user: user-1
content: 区分大小写的话直接比较即可无需写那么啰嗦，不区分大小写的话也很简单减去一个差值即可。取下标0循环一遍依次与各位比较即可。 如if(s1[0]==s1[i] || s1[0] == s1[i]-32 || s1[0] == s1[i] + 32) 另外for(i=0;i!='\0';i++)i是数字怎么可能与字符比较？
user-0 提问: 一个值的问题

回复:
user: user-0
content: 难道是编译器的问题 。。。

user: user-1
content: 很多初学者老是把截断当成误差，其实它是错误。 浮点数赋值给整型的时候不是四舍五入，是截断的。 赋值前先加上0.5才是对自己负责。

user: user-2
content: 修改如下，供参考：#include<stdio.h> int main() {     int a,n;     scanf("%d %d",&a,&n);     int i,sum=0,t=0;      for(i=0;i<n;i++){         t = t*10 + 1;      //t=t+pow(10,i);         printf("t=%d\n",t);         sum+=a*t;         printf("s = %d\n", sum);     }     printf("s = %d\n", sum);      return 0; } 两种方式结果相同：
user-0 提问: C/C++ 有关二维数组的问题

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: sum+=(*a)[i]改成 sum+=a[i]或sum+=*(a+i)

user: user-3
content: 必须得错啊，谁让你得罪人

user: user-4
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <typeinfo.h> int main() {     int sa[3][4];     int **db;     int j,k;      for (j=0;j<3;j++) {         for (k=0;k<4;k++) {             sa[j][k]=j*10+k;         }     }      for (j=0;j<3;j++) {         for (k=0;k<4;k++) {             printf(" %3d",sa[j][k]);         }         printf("\n");     }      printf("typeid(sa[0]   ).name() is %s\n",typeid(sa[0]   ).name());     printf("typeid(sa      ).name() is %s\n",typeid(sa      ).name());     printf("\n");      db=(int **)malloc(3*sizeof(int *));     if (NULL==db) return 1;     for (j=0;j<3;j++) {         db[j]=(int *)malloc(4*sizeof(int));         if (NULL==db[j]) return 1;     }     for (j=0;j<3;j++) {         for (k=0;k<4;k++) {             db[j][k]=j*10+k;         }     }      for (j=0;j<3;j++) {         for (k=0;k<4;k++) {             printf(" %3d",db[j][k]);         }         printf("\n");     }      printf("typeid(db[0]   ).name() is %s\n",typeid(db[0]   ).name());     printf("typeid(db      ).name() is %s\n",typeid(db      ).name());     printf("\n");      for (j=0;j<3;j++) {         free(db[j]);     }     free(db);      return 0; } //   0   1   2   3 //  10  11  12  13 //  20  21  22  23 //typeid(sa[0]   ).name() is int [4] //typeid(sa      ).name() is int [3][4] // //   0   1   2   3 //  10  11  12  13 //  20  21  22  23 //typeid(db[0]   ).name() is int * //typeid(db      ).name() is int * * // //

user: user-5
content: 以下描述仅作阐述，无意批评。这种误解我当初也干过： 主函数里做实参的部分由于其作用就是求值，就算是语法不严谨什么的都不影响结果，因为实参传递给形参的仅仅是值，没有类型信息。当然，这个值是个地址。  然而函数里面由于形参列表的声明，会把传递过来的内容解读做int **类型，所以循环里面的(*a)会被解读为int*类型，也就是地址。但是*a是1呀（这里才是int**类型和int(*)[4]类型的本质区别），于是去访问地址1了。集 段错误和总线错误 于一体，估计哪个操作系统也忍受不了这个。

user: user-6
content: 此问题的关键在于sizeof(void *)是否等于sizeof(int),若是结果碰巧会对，即编译结果是不是32位即Ⅹ86模式。

user: user-7
content: 形参应该用int *a即一重指针。实参用&sum[0][0]

user: user-0
content: 谢谢各位大佬，我悟了

user: user-8
content: 引用 5 楼 SSY6p 的回复:我想把这个二维数组当成一个一维数组访问，为什么不行嘞 怎么不行？完全可以，可以参考我上面的回复。 数组在内存中只是一块地址连续的空间，怎么解析完全由你自己决定。

user: user-0
content: 我想把这个二维数组当成一个一维数组访问，为什么不行嘞

user: user-5
content: sum才是int(*)[4]类型， &sum是int(*)[3][4]类型了，一旦+1会加出去48字节那种。

user: user-8
content: 仅供参考： #include <stdio.h>  int sun(int *a, int size) { 	int i, sum = 0; 	for(i=0; i<size; i++) sum += a[i]; 	return sum; }  int main(void) { 	int sum[3][4] = {1,1,1,1,1,1,1,1,1,1,1,1}; 	printf("%d\n", sun((int *)sum, 12)); 	return 0; }

user: user-5
content: 因为指针和数组终究是不一样的。 你的*a会被理解为取目标，而实际上它继承的数组地址，因而没有“目标”。  两个双星的地方用单星，然后sum+=a[i];即可。

user: user-9
content: &sum是int (*)[4]类型，也就是数组指针（指向长度为4的数组的指针）。和int**不是同一个类型。
user-0 提问: 我要吐槽这个大坑！！！关于12864汉字显示问题

回复:
user: user-1
content: 引用 楼主 xiao_bai_cai_555的回复:（首先声明，我只是为了吐槽，解决方法从网名“林一捆”的大佬那里看来的）     由于keil本身的固有bug，keil编译器会忽略0xFD值的字符串，导致汉字内码以0xFD结尾的汉字和紧跟着后面的汉字全部显示为乱码，因为它把0xFD丢掉了，导致后面的一大串全是错的。     我也写了一个显示汉字的程序，自己怎么改都是显示乱码，我找了一个对的程序，照着人家的一行行的对，偏偏没注意到定义字符串那，因为神tm会想到是那的问题！可以说是绞尽脑汁了     历时1天，到我写这篇文章前，我终于找到了哪有错（显示不出来后面就加\xfd试试），然后搜到了答案QAQ。 从网上买的qc12864b，使用说明像屎一样，看了一遍又一遍，对于我这个小白来说真的太艰难了！  最后展示一下我的改错吧，没错，就是那个“积”字。    我是不是发错地方了，吐槽也要积分 123456

user: user-2
content: 借楼主帖子，也吐槽一下，keil收费，蛋疼。虽有破解，但不一定安全。 arm公司太小气了，应该学习ibm公司，收购eclipse，直接开源免费用，爽。 注：楼主可以试试gcc，开源免费，放心用，弄个交叉编译看看效果，哈哈~~~~
user-0 提问: 结构体数组中字符串的输入输出

回复:
user: user-1
content: 如果用指针的话，得分配内存，而且得用strcpy拷贝内容给它

user: user-0
content: 原来这样啊

user: user-2
content: 楼主定义的是一个字符，不是字符串。修改如下：struct std_infor {       char std_name[20]; };  struct std_infor student[51];  int main() {    void infor_in();    infor_in();    for(int i=0;i<51;i++)        printf("%s\n",student[i].std_name);        return 0; }  void infor_in() {    printf("请输入学生姓名\n");    for(int i=0;i<51;i++)       scanf("%s",&student[i].std_name); }

user: user-0
content: #include <stdio.h> #include <stdlib.h> struct std_infor {     char *std_name;     }; struct std_infor student[51]; int main() { 	void infor_in(); 	infor_in();  	 } void infor_in() {	    	 printf("请输入学生姓名\n");       scanf("%s", &student[0].std_name);       printf("%s", student[0].std_name);   } //会有异常，无法输出

user: user-3
content: 可以发一下源码  我试试

user: user-3
content: 应该没问题呀  你的报错是什么
user-0 提问: 蓝桥杯练习

回复:
user: user-1
content: 啊，没注意到long b[n]={0}这个地方，确实是C99不允许VLA初始化的问题。不过这只是为了简化编译器复杂度做的语言限制，不是说技术上做不到，既然long b[n];是可以的，显然编译器生成了代码在运行时根据n的大小分配数组空间，那么它也完全可以根据n的大小初始化数组，至于初始化数据超过n怎么办，要么截断（最安全），要么不考虑安全性只管填充（C库的一些函数就是这么二，缓冲区溢出的源头在此）。

user: user-0
content: 有点明白了！感谢大佬！

user: user-2
content: 初始化，又称赋初值，英文initialize，和赋值完全不是一码事。 C语言规定它是编译期动作。 而C99的变长数组要到运行期才能确定它有多大，反过来说就是编译期不知道它有多大，因此编译期无法初始化。  这就是为什么全局数组，static局部数组都不能变长，就因为它们在编译期有默认的初始化动作。 顺理成章的，有初始化动作的普通局部数组也就不能变长了。

user: user-2
content: 自己写循环赋值，或者memset都行啊。

user: user-0
content: 引用 1 楼 forever74的回复:出错信息很明确，只要你不对数组b进行初始化就行。 可变长数组的定义是运行期的事，初始化是编译期的事，这样写代码就好像光棍哥要预定一件婚纱～ 但是我数组b不初始化，我下边还要用它怎么办？

user: user-2
content: 不是这样哦。 如果不支持C99，那么不应该出这样的出错信息。 事实上变长数组不能初始化正是C99说的。

user: user-3
content: 楼上正解。编译时应该添加：-std=c99

user: user-1
content: 它的编译器不支持C99，或者默认没有启用

user: user-2
content: 出错信息很明确，只要你不对数组b进行初始化就行。 可变长数组的定义是运行期的事，初始化是编译期的事，这样写代码就好像光棍哥要预定一件婚纱～
user-0 提问: Linux下setlocale( LC_ALL , "zh_CN.GBK" ) 设置失败

回复:
user: user-1
content: TO: forever74 楼上精辟啊，赞一个。 顺便show一下我的Fedora 33：

user: user-2
content: 喝茶的时候想想，操作系统这个东西，只有在它还是源代码的时候，那些内核程序员有资格对它动手动脚。  一旦它运行起来，尽管如今它还没有智能，但是它有自己的规矩，我等写应用程序的猿只能在它规定的框架下做事，偶尔请求它帮个忙。 在它那一亩三分地儿，它就是天道。  好在我们活在系统外，不爽的时候可以给它断电，格式化，重装。

user: user-1
content: LANG=zh_CN.GB2312

user: user-2
content: BTW,在这个设置成功完成以后，接着都用w系的库函数，就再也不要用printf啦puts啦这些函数了，因为它们会捣乱的。

user: user-2
content: 你似乎对这个函数的作用有些误解，以为你想设置什么就设置什么。 其实不是这样的。 这个函数设置的其实是程序员预期的将来这个程序要运行的环境的本地字符集。 也就是说，如果你预期你这个代码编译以后要运行在windows 7 8 10上，那你才能那样写。 当然，这需要编译器和库系统的支持，配合一大堆交叉编译配置，你才能才linux上编译链接出.exe来。  所以，如果你的代码要在你执行编译的机器上运行，你就看看环境变量LANG是啥，你就只能设成啥，更好的办法是两个双引号中间啥也不敲。

user: user-3
content: 是 无法改为GBK 是  以上答案都是我瞎猜的。

user: user-2
content: 好吧，又错了，我之前的回复是今天的，不是昨天。

user: user-2
content: 好吧，抱歉我没说清楚。 setlocale函数能设置什么取决于你系统上都安装了哪些locale，安装问题去找安装程序解决，安装了哪些用locale -a查询。 但是每个进程都可以调用setlocale设置自身的外在编码属性。 我们用linux的时候，因为我们讨论的是编译和运行，那么这个时候我们的代码编译出来的可执行文件它的环境就是调用执行它的那个进程。这个进程多半（但不是一定）是个bash，我们代码里的setlocale得是安装好的才能执行，同时得是和环境设置相同/兼容的才能显示出正确的文字，这就是昨天我说“只能”的意思。因为我们很多时候不拥有修改环境的权限，所以只能迁就环境。 但是对于bash来说，你可以通过修改环境变量来让它重新setlocale，export LC_ALL=zh_CN.GBK 就可以让bash去搞GBK了，然后在这个bash里你的程序也GBK的话就能正常显示文字了。 --------------------------------------------- 我们的障碍在于源代码文件本身默认需要UTF8编码，这是gcc的需要，要折腾gcc是另外的话题。 这样一个非UTF8的bash可以正常运行和它相同setlocale的可执行程序，但是在cat源代码的时候反而会乱码了。  综上，我们一般的思路是，因为gcc默认需要UTF8的源代码，所以我们得在UTF8的环境下写源码，所以我们运行UTF8的shell，而要在UTF8的shell里运行我们的程序并正常显示字符，我们的程序里需要setlocale成UTF8。 --------------------------------------------- 当然，如果一个程序是个服务器程序，它的执行过程中根本不在本机显示字符，那就是另一回事了。

user: user-3
content: sudo apt-get -y install language-pack-zh-hans

user: user-4
content: Linux内核使用UTF-32，API层使用UTF-8，不支持UTF-16和MBCS（除非程序自己处理编码），Linux中的宽字符wchar_t是UTF-32编码，与windows中的UTF-16不同

user: user-3
content: 好像可以另行安装对中文的支持。搜一下

user: user-0
content: 引用 4 楼 ctrigger 的回复:LANG=zh_CN.GB2312 这个是某个配置文件里的设置还是setlocale的设置？GB2312、GBK、GB18030我都试过了（setlocale），都是失败

user: user-0
content: 引用 1 楼 赵4老师 的回复:是 无法改为GBK 是  以上答案都是我瞎猜的。 编码环境那个，我是指locale命令列出来的结果的那个，有办法让它变为zh_CN.GBK吗？

user: user-0
content: 引用 6 楼 ctrigger 的回复:TO: forever74 楼上精辟啊，赞一个。 顺便show一下我的Fedora 33：  为什么你的支持gbk等编码，我的zh_CN只有UTF-8？
user-0 提问: 请问我加了除法，为什么运行里面没有除法的题目

回复:
user: user-1
content: %3是得不到3的。

user: user-2
content: b=1+rand()%9;//避免0作分母

user: user-2
content: %4

user: user-0
content: 有人吗？？？？
user-0 提问: C语言中，关于float与double使用造成不同结果的原因？

回复:
user: user-1
content: 是说什么少了0.000001吗？我的编译器是多了0.000001，数据其实是以二进制存储的，double有8字节，但float只有4字节，就会造成误差（0.000001）

user: user-2
content: 没出任何问题，你发现了一个float和double精度不同的很好的栗子，表扬一哈。
user-0 提问: 求助

回复:
user: user-1

user: user-2
content: 第一次while循环,(a=1)<(b=2)是true(=1)<(c=2)，循环条件成立，所以交换a和b，且c递减变为1 第二次while循环,(a=2)<(b=1)是false(=0)<(c=1)，循环条件还是成立，所以交换a和b，且c递减变为0
user-0 提问: 大佬们有人能讲一下这个啥原理吗，我看不懂。

回复:
user: user-1
content: 简单地说， 循环几次，就输出几个空格占位置，然后再干正事儿。

user: user-2
content: 这有啥原理呢，先打印空格，再打印图案呗
user-0 提问: 运行超时问题

回复:
user: user-1
content: 可以这样试试：  #include <stdio.h> int a[100000], b[100000]; int main() { 	int n,i; 	scanf("%d", &n); 	for (i = 0; i < n; i++) 	{ 		scanf("%d", a + i); 		b[a[i]]++; 	} 	for (i = 0; i < n; i++) 	{ 		if (b[a[i]] == 1) 		{ 			printf("%d\n", a[i]); 			return 0; 		} 	} 	printf("None\n"); 	return 0; }

user: user-1
content: 尽量不要在C代码里面混入C++语法嘛。 况且这个并不解决超时问题。

user: user-2
content: 供参考：#include <stdio.h> int main(int argc, char* argv[]) {     int n,flag=1;      scanf("%d",&n);      int *a = new int[n];     int *b = new int[n];     memset(a,0,sizeof(int)*n);     memset(b,0,sizeof(int)*n);      for(int i=0;i<n;i++)         scanf("%d",&a[i]);      for(int i=0;i<n;i++){        for(int j=0;j<n;j++)            if(a[i] == a[j])             b[i]++;     }      for(int i=0;i<n;i++)         if(b[i]==1){           printf("%d\n",a[i]);           flag=0;           break;         }      if(flag) printf("None\n");      delete []a;     delete []b;      return 0; }

user: user-1
content: 超时就是太慢了嘛，想办法提高效率。  好好挖掘一下数组的作用，降低循环次数，不要有二重循环。
user-0 提问: 请问位大佬,如何开启开启发生生成错误，是否继续并运行上次的成功生成

回复:
user: user-1
content: 解决了吗，我也遇到了同样的问题，呜呜┭┮﹏┭┮

user: user-2
content: 用计算机，用浏览器访问本贴 https://bbs.csdn.net/topics/398725415 然后往下边看，更下边。
user-0 提问: 萌新求问

回复:
user: user-0
content: 多谢了，hxd

user: user-1
content: 修改如下，供参考：#include<stdio.h> #include<math.h>  int main(int argc, char* argv[]) { 	int x1,y1,x2,y2,k=0; 	double lenght[10];         while( scanf("%d %d %d %d",&x1,&y1,&x2,&y2) != EOF)//Ctrl+Z 结束输入         {            lenght[k] = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));            k++;         }         for(int i=0;i<k;i++)             printf("%.2f\n",lenght[i]);                 return 0; }

user: user-0
content: 不对啊，还要输入多组数据啊，就是这里不会了

user: user-1
content: 供参考：#include<stdio.h> #include<math.h>  int main(int argc, char* argv[]) { 	int x1,y1,x2,y2; 	double lenght;  	scanf("%d %d %d %d",&x1,&y1,&x2,&y2); 	lenght = sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));          printf("%.2f\n",lenght);          return 0; }
user-0 提问: 救救孩子吧  我是真的不会了

回复:
user: user-0
content: 引用 1 楼 user-1的回复:什么地方出错了呢？ 文件为空的话

user: user-0
content: if（n==1）后面的运行不出来但是忘记为空的话后面又可以

user: user-1
content: 什么地方出错了呢？
user-0 提问: pta第一个总是过不了

回复:
user: user-1
content: 楼上说的对，对于后0的处理也很简单判断m是否大于1输出0就是。 不然就是使用数组最简单。 发现帖主未使用数组,可能是考虑节省空间,或练习不使用任何形式的数组包含递归,当然也是可以实现的,为此补充一下,以及使用数组时只要写一个循环语句即可:

user: user-2
content: 楼主你的代码如果遇到非零的但是末尾有零的输入就会很尴尬了。

user: user-1
content: 写的过于啰嗦简单点直接点:

user: user-3
content: 修改如下，供参考：#include<stdio.h> int main(int argc, char* argv[]) {     long n,j,a,b;// i,     scanf("%d",&n);     if(n==0) printf("%d",n);     a=b=n;     j=1;     while(b>9){         b=b/10;         j *= 10;     }     for(;j>0;j/=10){        b = a/j;        a = n%j;        printf("%d ",b);     }      return 0; }

user: user-4
content: #include <stdio.h>  void show_digit(long num);  int main(void) {      long n;      scanf("%ld", &n);      show_digit(n);      return 0; }  void show_digit(long num) {     if (num == 0)         return;      show_digit(num / 10);     printf("%ld ", num % 10); } 供参考～
user-0 提问: 自动发邮件的脚本

回复:
user: user-1
content: Linux系统，直接用mail发即可。 引用mail -s "sendmail demo" admin@csdn.net<file.txt 再弄个shell脚本，自由发挥即可。  windows有没有类似的批处理，不清楚。等楼下补充吧。。

user: user-2
content: Windows下安装vmware，再在vmware中安装Ubuntu，再在Ubuntu中使用mail
user-0 提问: 求指点

回复:
user: user-1
content: 楼主说答案错了指的是？

user: user-1
content: 是这样的吗？  #include <iostream> #include <cmath>   double fsin(double x) { 	return sin(x); }  double fcos(double x) { 	return cos(x); }  double fexp(double x) { 	return exp(x); }  double cum(int n,double a,double b,double ( *fncallback)(double)) { 	int i = 0; 	double dh = 0; 	double dm = 0; 	double ds = 0; 	double dx = 0;  	dh = (fabs(a - b)) / n; 	dx = a;  	for(i = 0;i < n;i++) 	{ 		ds = fncallback(dx) * dh + ds; 		dx += dh; 	}  	return ds; }  int main(int argc,char *argv[],char *envp[]) { 	int inum = 0;  	double da1 = 0; 	double da2 = 0; 	double da3 = 0;  	double db1 = 0; 	double db2 = 0; 	double db3 = 0;  	printf("input [n]: "); 	scanf("%d", &inum);  	printf("\nto sin:\ninput [a b]: "); 	scanf("%lf %lf",&da1,&db1); 	printf("result: %f\n", cum(inum,da1,db1,fsin));  	printf("\nto cos:\ninput [a b]: "); 	scanf("%lf %lf",&da2,&db2); 	printf("result: %f\n", cum(inum,da2,db2,fcos));  	printf("\nto exponentiation:\ninput [a b]: "); 	scanf("%lf %lf",&da3,&db3); 	printf("result: %f\n", cum(inum,da3,db3,fexp));  	flushall(); 	printf("\npress 'enter' key to quit.\n"); 	getchar(); 	return 0; }

user: user-2
content: 另外还有13条警告，也一起吧。

user: user-3
content: 图片不清晰，看着也不连贯，为什么不直接贴源码呢？
user-0 提问: 不符合规范,各位大佬动动脑

回复:
user: user-1
content: 引用 3 楼 mswpp 的回复:其实我判断了的 你判断了，我没看到呢，贴源码吧

user: user-0
content: 其实我判断了的

user: user-2
content: fpWrite 用之前要有if(fpWrite!=NULL）的判断

user: user-3
content: 问题发生在被你切掉的部分。  我怀疑你混用了高级低级两套IO造成出错。
user-0 提问: C语言试题

回复:
user: user-1
content: 打印函数修改下：void print(int *p,int m,int n) {    for(int i=0;i<m;i++)       for(int j=0;j<n;j++)          printf("%d%c",*(p+i*n+j),(j<n-1?' ':'\n')); }

user: user-1
content: 供参考：#include<stdio.h> #define M 2 #define N 4  void sort_mid(int *p,int m,int n);  void print(int *p,int m,int n);  int main(int argc,char* argv[]) {    int a[M][N]={1,3,5,7,2,4,6,8};     //调整前    //print(a[0],M,N);     sort_mid(a[0],M,N);     //调整后    print(a[0],M,N);     return 0; }  void sort_mid(int *p,int m,int n) {    int *a = new int [M*N];    int k=0,mid,t;    for(int i=0;i<m;i++)       for(int j=0;j<n;j++)          a[k++] = p[i*n+j];                                for(int i=0;i<k-1;i++){ //计算数组中位数       for(int j=0;j<k-i-1;j++){ 		if(a[j]>a[j+1]){                      t     = a[j];                      a[j]  = a[j+1];                      a[j+1]= t; 		}         }    }    if(k%2==0)         mid=(a[k/2]+a[k/2-1])/2;    else         mid=a[(k-1)/2];     for(int i=0;i<m;i++)//将数组中位数与数组第一元素交换位置       for(int j=0;j<n;j++)          if(mid == p[i*n+j]){             t        = p[i*n+j];             p[i*n+j] = p[0];             p[0]     = t ;          }    delete []a; }  void print(int *p,int m,int n) {    for(int i=0;i<m;i++)       for(int j=0;j<n;j++)          printf("%d%c",*(p+i*4+j),(j<n-1?' ':'\n')); }

user: user-2
content: 可参
user-0 提问: 谁能告诉我第三题问什么输出的是三，求大佬回答

回复:
user: user-1
content: 因为a > b > c为假，为啥为假，a > b为真，则结果为1 > c为假，1 > 3为假；执行else if。 c-1 >= d为真，则为1,1==1为真，因此打印printf，即d +1=3

user: user-2
content: a>b>c 计算a>b这部分的时候根据真假得到的结果是1或者0 接下来就是1>c或者0>c的计算  其他关系运算符连用的情况以此类推。
user-0 提问: 分块查找问题

回复:
user: user-1
content: 数据表有一维、二维、三维 分块的方法有二叉树、四叉树、八叉树

user: user-0
content: 引用 1 楼 赵4老师 的回复:2^X >= 4000 ?  好像不是，是下面说的这种查找，问题是根号下4000=63.xxxx，不知道是63还是64，之后每块应该多少个数据，63*64=4032  https://blog.csdn.net/drive_/article/details/83182654

user: user-1
content: 2^X >= 4000 ?
user-0 提问: 这个代码为什么不能生效啊

回复:
user: user-1
content: 楼主的代码修改如下，还是有问题：#include <stdio.h> char num[8];   //int num[8]; int main() {     int a;     int b;     int c;     printf("Are you sure?(Any number to continue)");     while (scanf("%d", &c)==1)       {         getchar();         printf("Enter num\n");         for (a = 0; a < 8; a++)//(a = 0; a == 7; a++)             {               num[a] = getchar();             }         for (b = 7; b >= 0; b--) //(b = 7; b == 0; b--)             {               printf("%c", num[b]);             }         getchar();         printf("Are you sure?(Any number to continue)");       }      return 0; } 需要逆序输出，2#楼代码修改如下：#include <stdio.h> char num[8];//int num[8];  int main() {     int a;     int b;     int c;     printf("Are you sure?(Any number to continue)");     while (~scanf("%d",&c))//while (scanf("%d", &c)==1)       {          if(c < 1) break;          getchar();          a=0;          printf("Enter num:\n");           while((num[a] = getchar()) != '\n' && a<8)a++;           num[a] = '\0';           //printf("%s\n", num);          for (b = 7; b >= 0; b--)             {               printf("%c", num[b]);             }          getchar();          printf("Are you sure?(Any number to continue)");                 }      return 0; }

user: user-1
content: 去搜下getchar()函数的用法。修改如下，供参考：#include <stdio.h>  char num[8];//int num[8];  int main() {     int a;     int b;     int c;     printf("Are you sure?(Any number to continue)");     while (~scanf("%d",&c))//while (scanf("%d", &c)==1)       {          if(c < 1) break;          getchar();          a=0;          printf("Enter num:\n");          //for(a = 0; a == 7 ; a++);          //{          while((num[a] = getchar()) != '\n' && a<8)a++;           num[a] = '\0';           //}          //for (b = 7; b == 0; b--);          // {           printf("%s\n", num);//printf("%d", num[b]);          // }          printf("Are you sure?(Any number to continue)");          getchar();       }        return 0; }

user: user-2
content: for行尾有多余的分号
user-0 提问: a+=a-=a*=a;

回复:
user: user-0
content: 引用 4 楼 自信男孩的回复:如果能避免写这样的表达式，建议不写，实际程序开发中不建议写这样的表达式，给自己添加麻烦还为难别人（别人要看你的代码，看着头大） 我也不想，这考试考这题

user: user-1
content: 我承认错误并作出检讨。

user: user-2
content: https://blog.csdn.net/Minikinfish/article/details/107520644

user: user-3
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-2
content: 运算符优先级别 https://blog.csdn.net/Minikinfish/article/details/107520644

user: user-4
content: 如果能避免写这样的表达式，建议不写，实际程序开发中不建议写这样的表达式，给自己添加麻烦还为难别人（别人要看你的代码，看着头大）

user: user-5
content: C语言中 a+=a-=a*=a 是未定义行为

user: user-6
content: 把赋值语句还原回来看看就知道了 a=(a+(a=(a-(a=a*5))))

user: user-7
content: 从结果看，这个编译器的结果既不是固定取5也不是每次都用最新的值。出这种题的老师就是脑残。

user: user-1
content: 它们作为赋值系的运算符，统一是倒数第二优先级，从右向左结合。
user-0 提问: C语言课程设计学生管理系统实验报告求

回复:
user: user-1
content: 引用 1 楼 lserious 的回复:有么有人帮帮忙 这个作业不小呢，需求比较明确。

user: user-2
content: https://blog.csdn.net/user-2/article/details/38044239

user: user-0
content: 有么有人帮帮忙
user-0 提问: 为什么

回复:
user: user-1
content: 引用 2 楼 Infinity G 的回复:[quote=引用 1 楼 自信男孩的回复:]因为h=0不满足执行条件，循环一次也没执行。  h=0即假，假循环不执行，把h=1试试～ 真的诶，那平时用for循环的时候，比如啊 for（i=0；；i++） 这个如果换成int型为什么就可了呢 [/quote] 因为中间的表达式为空，即等价while (1)了。

user: user-2
content: 你撞电线杆子是因为你忘了戴眼镜，不是因为你穿了红衬衫。  循环行为的区别在于循环控制条件不同，不是因为数据类型。

user: user-0
content: 引用 1 楼 自信男孩的回复:因为h=0不满足执行条件，循环一次也没执行。  h=0即假，假循环不执行，把h=1试试～ 真的诶，那平时用for循环的时候，比如啊 for（i=0；；i++） 这个如果换成int型为什么就可了呢

user: user-1
content: 因为h=0不满足执行条件，循环一次也没执行。  h=0即假，假循环不执行，把h=1试试～
user-0 提问: 帮帮孩子吧

回复:
user: user-1
content: 当处理最后一个节点时,m为最后一个节点  p=m也是最后一个节点 但是下面的循环里， p=p->next p此时为Null了 下面去访问p->next就错了

user: user-2
content: 1.遍历链表的条件一般是 m!=NULL，下面的p也是一样。 2.删除结点的那个循环语句里写的不对 2.删除结点一般都有个释放删除的结点的内存空间的语句，free()
user-0 提问: for循环语句中那个（）里面为什么只有一个；？

回复:
user: user-1
content: 楼上赵4老师说的比较经典，for语句中的三个表达式（初始化表达式；条件表达式；循环表达式 ）是可以被省略的，括号里的两个分号是不可以被省略的，否则编译器会认为有语法错误。学习了~(^.^)~

user: user-2
content: The C for Statement The for statement lets you repeat a statement or compound statement a specified number of times. The body of a for statement is executed zero or more times until an optional condition becomes false. You can use optional expressions within the for statement to initialize and change values during the for statement’s execution.    Syntax  iteration-statement :  for ( init-expression opt ; cond-expression opt ; loop-expression opt ) statement   Execution of a for statement proceeds as follows:   The init-expression, if any, is evaluated. This specifies the initialization for the loop. There is no restriction on the type of init-expression.   The cond-expression, if any, is evaluated. This expression must have arithmetic or pointer type. It is evaluated before each iteration. Three results are possible: If cond-expression is true (nonzero), statement is executed; then loop-expression, if any, is evaluated. The loop-expression is evaluated after each iteration. There is no restriction on its type. Side effects will execute in order. The process then begins again with the evaluation of cond-expression.   If cond-expression is omitted, cond-expression is considered true, and execution proceeds exactly as described in the previous paragraph. A for statement without a cond-expression argument terminates only when a break or return statement within the statement body is executed, or when a goto (to a labeled statement outside the for statement body) is executed.   If cond-expression is false (0), execution of the for statement terminates and control passes to the next statement in the program.  A for statement also terminates when a break, goto, or return statement within the statement body is executed. A continue statement in a for loop causes loop-expression to be evaluated. When a break statement is executed inside a for loop, loop-expression is not evaluated or executed. This statement  for( ;; );  is the customary way to produce an infinite loop which can only be exited with a break, goto, or return statement.   This example illustrates the for statement:   for ( i = space = tab = 0; i < MAX; i++ )  {     if ( line[i] == ' ' )         space++;     if ( line[i] == '\t' )      {         tab++;         line[i] = ' ';     } }  This example counts space (' ') and tab ('\t') characters in the array of characters named line and replaces each tab character with a space. First i, space, and tab are initialized to 0. Then i is compared with the constant MAX; if i is less than MAX, the statement body is executed. Depending on the value of line[i], the body of one or neither of the if statements is executed. Then i is incremented and tested against MAX; the statement body is executed repeatedly as long as i is less than MAX.

user: user-3
content: for循环的3个表达式可以写0-3个，也就是说，3个表达式都可以省略，如果全部省略，相当于while(true)的效果

user: user-4
content: 不是有两个吗？怎么是一个呢？ for(;*sp!='\0';sp++){ 你的代码，你再数一下几个;分号
user-0 提问: c语言 的函数问题

回复:
user: user-1
content: http://c.biancheng.net/view/498.html。一起学习？

user: user-2
content: Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-3
content: 去我博客找素数表
user-0 提问: 问一个 指向函数的指针 问题

回复:
user: user-0
content: 谢谢大佬，明白了

user: user-1
content: 你反汇编一下会看到，你的图上f的那个地址是函数f内部开头的地址， 而图上的p实际上也就是你的程序输出，那里是一个函数调用列表的表项，只有一条跳转指令，跳转到上述实际函数地址去。  某种意义上这就是封装这个词的的表现形式之一。
user-0 提问: 【C语言】内部编译器错误

回复:
user: user-1
content: 那我建议把你的代码复制到正常的helloworld的项目的编辑界面覆盖那个短短的代码，再编译试试。

user: user-0
content: hello world倒是可以成功运行......  那这种情况一般是哪里有问题呢？

user: user-1
content: 这种错误不是代码引起的，是硬件、系统、VS安装或项目配置问题。 建议以同样环境写个helloworld来确认环境正确性。
user-0 提问: 大一小白怎么进阶，学c

回复:
user: user-0
content: 引用 1 楼 user-2的回复:1  系统学习各种算法 2  多读题  分析 这种题 是什么类型 3  多写  一种类型 的解题思路多写几次 可以，明白了😊

user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-1
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-1
content: 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-2
content: 1  系统学习各种算法 2  多读题  分析 这种题 是什么类型 3  多写  一种类型 的解题思路多写几次
user-0 提问: 求大佬看看这个怎么做

回复:
user: user-1
content: 仅供参考： #include <stdio.h>  int game(int *p, int n, int m) { 	int i, c, t; 	c = t = 0; 	for(i = 0; i < n; i++) p[i] = i + 1; 	 	i = 0; 	while(t < n-1) 	{ 		if(p[i]) c++; 		if(c == m) 		{ 			p[i] = 0; 			t++; 			c = 0; 		} 		i = (i + 1) % n; 	} 	 	for(i = 0; i < n; i++) 	{ 		if(p[i]) break; 	} 	 	return p[i]; }   int main(void) { 	int n; 	int arr[100];  	for(n = 2; n <= 100; n++) 	{ 		if(game(arr, n, 5) == game(arr, n, 8)) 		{ 			printf("Monkey Count:\t%d\t", n); 			printf("Winner ID:\t%d\n", game(arr, n, 5)); 		} 	} 	return 0; }
user-0 提问: 菜鸟求教

回复:
user: user-0
content: 感谢各位的指教

user: user-1
content: 小数位，是1位还是0位

user: user-2
content: 精度（.precision） 精度格式符以“.”开头，后跟十进制整数。 (1)对于整型（d,i,o,u,x,X）,precision表示输出的最小的数字个数，不足补前导零，超过不截断。 (2)对于浮点型（a, A, e, E, f ），precision表示小数点后数值位数，默认为六位，不足补后置0，超过则截断。 (3)对于类型说明符g或G，表示可输出的最大有效数字。 (4)对于字符串（s），precision表示最大可输出字符数，不足正常输出，超过则截断。 precision不显示指定，则默认为0。  1、printf("%.8d\n",1000);//不足指定宽度补前导0，效果等同于%08d      输出：00001000 2、printf("%.8f\n",1000.123456789);//超过精度，截断      输出：1000.12345679 3、printf("%.8f\n",1000.123456);	//不足精度，补后置0      1000.12345600

user: user-0
content: 懂了,受教了!

user: user-3
content: http://c.biancheng.net/view/1793.html

user: user-0
content: 只看到%lf与%f的区别,%.1f和%.0f的意思还是不清楚,求教!

user: user-3
content: 任何一本教材讲格式输出的章节都会说明这个。