Question: 怎么做这个求告知，哭唧唧

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

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

# 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;	}			}	}


Question: c语言编程新手问题，麻烦各位大佬看看

不要使用 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;  //... } 类似的例子还可以举很多。

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

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

你是不是对while有什么误解？还以为是if呢？


Question: 两数之和（C语言）

完全正确，没语法问题。不知道要实现什么功能，谁也帮不了你。

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

测试一下0+0=？


Question: c语言程序新手问题，麻烦各位大佬看看

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

#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的返回值，然后在下面打印该变量～


Question: c语言求助

谢谢了

最后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'字符外没问题的。

楼主想做什么？没看懂代码～


Question: 一个无法理解的free错误

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

#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的时候，如果用结构体变量而不用结构体指针申请空间，申请的空间只会是结构体变量的，而不是原有的。

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


Question: 求解

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

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

电脑判断机制啊。解决上面的问题，我写的代码提交时给我的结果是答案错误。       给你两个数组，从第一个数组中选择一个数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    这就是问题。。。

是啊，为什么呢？ 关键在于，什么叫错了？ 谁说错了？ 怎么说的？ 说的什么？ 没有足够的信息，一个什么也不干的程序也可以说是正确的程序： int main(){}


Question: 我觉得两个都差不多为什么第一个错了1.

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

你把return 0;写在循环里面了。

引用 楼主 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; 	} } 这是我写的，我的不对，第二个对，我不知道为什么

引用 楼主 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; } 题目：  第一个弄错了


Question: 萌新求教

感谢各位指点！成功了

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; }

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

for (i = a + 1; i < b; ++i)

for (i = a; i < b; ++i)


Question: 为什么devc++调试的结果和运行的结果不一致

楼主解决了吗

#include <stdio.h> #include <stdlib.h> #include <assert.h> void sort(int *a, int left, int right); void merge(int *a, int left, int center, int right);  int main() {     int n, i;      scanf("%d", &n);     int *number;      number = (int *)malloc(sizeof(int) * n);     if (!number)         return -1;      for(i=0;i<n;i++)         scanf("%d", &number[i]);     sort(number, 0, n-1);     //printf("%d", number[0]);     //for(i=1;i<n;i++)     for(i=0;i<n;i++)         printf(" %d", number[i]);      free(number);     return 0; }  void sort(int *a, int left, int right) {     if(left>=right)return;     int center;     center=(left+right)/2;     sort(a, left, center);     sort(a, center+1, right);     merge(a, left, center, right); } void merge(int *a, int left, int center, int right) {     int i, j, k, n;     k=0;     i=left;     j=center+1;     n=right-left+1;     //int re[n];     int *re;      re = (int *)malloc(sizeof(int) * n);     if (!re)         exit(0);      while(1){         if(a[i]<a[j]){             assert(k<n);             re[k++]=a[i++];             if(i>=center+1)break;         }else {             assert(k<n);             re[k++]=a[j++];             if(j>=right+1)break;         }     }     if(i>=center+1){         for(;j<right+1 ;j++) {             assert(k<n);             re[k++]=a[j];         }     }else{         for(;i<center+1;i++) {             assert(k<n);             re[k++]=a[i];         }     }     for(i=0,j=left;i<n;){         assert(i<n);         a[j++]=re[i++];     }      free(re); }

感谢回复，我用您的代码测试了下，会出现同样的问题。也就是说，如果我直接运行程序的话没有问题，但如果我在您发的程序的第42行设置了一个断点， 再点击下一步的时候， 这个k的值并不是0， k有时会等于1， 有时等于2， 也有时会正常等于0。当k并没有等于0的时候， 后续的k++也并不会让k每次加一， k会无规律往上增长， 甚至有时我并没有点击下一步（我只是盯着屏幕看， 没有进行任何操作）， k值也会往上增长。。。这种情况就会输出错误的结果， 或者程序崩溃。。您可以再42行设置断点试一下， 不会只有我出现这种情况吧。 重点说明，程序可以正常运行， 只有当某处设置了断点后就会出现奇怪的状况。

#include <stdio.h> #include <stdlib.h>  void sort(int *a, int left, int right); void merge(int *a, int left, int center, int right);  int main() {     int n, i;      scanf("%d", &n);     int *number;      number = (int *)malloc(sizeof(int) * n);     if (!number)         return -1;      for(i=0;i<n;i++)         scanf("%d", &number[i]);     sort(number, 0, n-1);     //printf("%d", number[0]);     //for(i=1;i<n;i++)     for(i=0;i<n;i++)         printf(" %d", number[i]);      free(number);     return 0; }  void sort(int *a, int left, int right) {     if(left==right)return;     int center;     center=(left+right)/2;     sort(a, left, center);     sort(a, center+1, right);     merge(a, left, center, right); } void merge(int *a, int left, int center, int right) {     int i, j, k;     k=0; i=left; j=center+1;     int n=right-left+1;     //int re[n];     int *re;      re = (int *)malloc(sizeof(int) * n);     if (!re)         exit(0);      while(1){         if(a[i]<a[j]){             re[k++]=a[i++];             if(i==center+1)break;         }else {             re[k++]=a[j++];             if(j==right+1)break;         }     }     if(i==center+1){         for(;j<right+1;j++)re[k++]=a[j];     }else{         for(;i<center+1;i++)re[k++]=a[i];     }     for(i=0,j=left;i<n;){         a[j++]=re[i++];     }      free(re); } 供参考～   测试了暂未发现问题～楼主可以多测测试试～


Question: 这是为什么呢

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

我是来接分的

引用 楼主 Infinity G的回复: 我懂了我懂了，但是我删不了帖子


Question: fseek为什么总时只移到末尾而不偏移？

另一个需要注意的是 修改位置之后 写入操作不是插入是覆盖 原先内容  123 # 写入位置在#前面 写入w 结果是 123 w 而不是 123 w#

和文件打开方式有关  如果是 打开模式带a 则只能在结尾添加数据 fseek对写入位置无效  只能修改读取位置  你不能正确定位问题 应该把代码完整的发出来  你的问题在fopen 而你只发了fseek

我的回复被版主屡次误认为是灌水删除了，我再最后一次回复，货卖识家：  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  综上所述，fseek只能在fopen时带b时使用！

每次看见这样没诚意的提问，总是想到看腿识鸟的梗，然后就没兴趣了。

不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了  fopen时不带b 就不要fseek

引用 9 楼 Minikinfish的回复:调用fseek，设置完文件指针，再fwrite写文件 书上说写正负都可以呀，而且可以负确实是向头方向移动字节。如果用fwrite可能不确定字符数比较麻烦

调用fseek，设置完文件指针，再fwrite写文件

引用 7 楼 脚踏实地丨仰望星空 的回复:[quote=引用 4 楼 Minikinfish的回复:]  SEEK_CUR  Current position of file pointer.  SEEK_END  End of file.  SEEK_SET  Beginning of file. 大佬，能否指点一下，看的不是很懂[/quote]   int fseek(     FILE *stream,    long offset,    int origin  );  SEEK_CUR  当前位置，偏移offset个字节 SEEK_END 文件末尾位置，偏移offset个字节（offset<=0） SEEK_SET 文件开始位置，偏移offset个字节（offset>=0）

引用 4 楼 Minikinfish的回复:请看第三个参数  The fseek and _fseeki64 functions moves the file pointer (if any) associated with stream to a new location that is offset bytes from origin . The next operation on the stream takes place at the new location. On a stream open for update, the next operation can be either a read or a write. The argument origin must be one of the following constants, defined in STDIO.H:  SEEK_CUR  Current position of file pointer.  SEEK_END  End of file.  SEEK_SET  Beginning of file.  You can use fseek and _fseeki64 to reposition the pointer anywhere in a file. The pointer can also be positioned beyond the end of the file. fseek and _fseeki64clears the end-of-file indicator and negates the effect of any prior ungetc calls against stream.  When a file is opened for appending data, the current file position is determined by the last I/O operation, not by where the next write would occur. If no I/O operation has yet occurred on a file opened for appending, the file position is the start of the file. 大佬，能否指点一下，看的不是很懂

引用 5 楼 脚踏实地丨仰望星空的回复:[quote=引用 3 楼 forever74的回复:]文件原来啥样 你想弄成啥样 你的代码啥样 文件变成啥样  从仅有的信息上看，一切都很正常，是你的预期或者说对文件操作的理解不对。 原来没有+wanan的部分，然后输入是+wanan那部分[/quote] 你好，我就是只打算插入到末尾#之前的，但插到后面了，就是这个问题

引用 3 楼 forever74的回复:文件原来啥样 你想弄成啥样 你的代码啥样 文件变成啥样  从仅有的信息上看，一切都很正常，是你的预期或者说对文件操作的理解不对。 原来没有+wanan的部分，然后输入是+wanan那部分

这个写只能先修改内存里，然后重新刷写文件（磁盘orflash)。不能在文件里直接插入～


Question: 题目如图，求教：为什么输出答案不对，我自己执行代码可以得出第一行案例答案，后两个有问题

修改如下，供参考：#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; }

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

难道没抱错?至少变量num未初始化就使用会提示 int num,index=0,k=0; i=0; while(num>n)


Question: 教学信息管理系统


Question: 关于清空输入行左边的空白字符的思路是什么呀？

#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] //

scanf就行，天生爱跳过左空白的。

谢谢大神

找到第一个有效字符，然后memcpy即可。


Question: 这怎么搞啊

VS2015 C++环境调试 变量a在内存中数据是

出题人默认的小端模式吧

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

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


Question: 有大佬知道这两个报错怎么解决吗，附上c文件和.h文件

没定义main函数？！这个源文件里没看到你定义的main函数呢


Question: 求助

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

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”

fun函数实现字符串转置


Question: 请大家帮忙看看，这个程序哪里出了问题？

void Update(int count)       {int i,num,flag=1;        printf("请输入要修改的姓名的编号：");        scanf("%d",&num);        for(i=0;i<count&&flag;i++)        if(guest[i].num==num)        {           printf("请输入人数：");           scanf("%d",&guest[i].sum);           printf("请输入用餐时间：");           scanf("%s",guest[i].time);           flag=0;         }         else              printf("\n没有查询到可以修改的数据！\n");       } 把else语句从for循环里删除。因为每循环一次只要没找到，就会else一次

逻辑有点小问题。比如说，当你在查询一个编号时，如果这个编号是后面插入的，那么它和前面插入的不相等，就会输出错误提示；但是随着循环进行下去，找到了相等的编号时，函数功能又能够正常执行。 所以说，判断一个编号是否存在，是需要将已有的编号全部遍历完之后才能得出的结论，而不是每个编号都进行错误提示。

几个函数逻辑判断有误，#include<stdio.h> #include<string.h>  #define MaxSize 20  struct guest_info{    char name[10];     int sum;    char time[10];     int num; }guest[MaxSize];  void Insert(int *count); void Search(int count); void Update(int count); void Delete(int *count); void Show(int count); void Exit(void);   int main() {        int i;        int count=0;        do          {printf("\n");           printf("1----点餐(Insert)\n");           printf("2----查询(Search)\n");           printf("3----修改订餐信息(Update)\n");           printf("4----删除订单(Delete)\n");           printf("5----显示订餐信息(Show)\n");           printf("6----退出(Exit)\n");           scanf("%d",&i);           switch(i)                   {case 1:Insert(&count);                           break;                    case 2:Search(count);                           break;                    case 3:Update(count);                           break;                    case 4:Delete(&count);                           break;                    case 5:Show(count);                           break;                    case 6:Exit( );                           break;                   default:printf("错误选择！请重选");           }         }while (i!=6);// (i!=8)             return 0; }    void Insert(int * count)  {        int i,in_num;        if(* count==MaxSize)           {printf("空间已满！");return ;}        printf("请输入编号：");        scanf("%d",&in_num);        for(i=0;i<* count;i++)           if(guest[i].num==in_num)              {printf("已有相同编号,请重新操作。\n");return ; }        guest[i].num=in_num;        printf("请输入姓名：");        scanf("%s",guest[i].name);        printf("请输入用餐人数：");        scanf("%d",&guest[i].sum);        printf("请输入用餐时间：");        scanf("%s",guest[i].time);        (* count)++;  }   void Search(int count)  {       int i,num,flag=1;       printf("请输入要查询的编号：");       scanf("%d",&num);       for(i=0;i<count&&flag;i++)          if(guest[i].num==num)             {               printf("\n姓名：%s\n",guest[i].name);               printf("用餐人数：%d\n",guest[i].sum);               printf("用餐时间：%s\n",guest[i].time);               flag=0;             }           //else       if(flag) printf("\n没有查询到相关信息\n");  }   void Update(int count)  {       int i,num,flag=1;       printf("请输入要修改的编号：");//printf("请输入要修改的姓名的编号：");       scanf("%d",&num);       for(i=0;i<count&&flag;i++)        if(guest[i].num==num)          {           printf("请输入人数：");           scanf("%d",&guest[i].sum);           printf("请输入用餐时间：");           scanf("%s",guest[i].time);           flag=0;          }        //else       if(flag) printf("\n没有查询到可以修改的数据！\n");  } void Delete(int * count) {        int i,j,num,flag=1;        printf("请输入要删除的编号：");//printf("请输入要删除的姓名的编号：");        scanf("%d",&num);        for(i=0;i<* count&&flag;i++)           //{             if(guest[i].num==num)               {                 for(j=i;j<* count-1;j++)                     guest[j]=guest[j+1];                 flag=0;                 (* count)--;               }         //else         if(flag) printf("\n没有查询到可以删除的数据！\n");        //} }  void Show(int count) {      int i;      printf("\n");      printf("编号    姓名     人数    用餐时间\n");      for(i=0;i<count;i++)        {          printf("%4d",guest[i].num);          printf("%8s",guest[i].name);          printf("%9d",guest[i].sum);          printf("%12s\n",guest[i].time);        } }  void Exit(void)     {       printf("已退出，欢迎下次使用。\n");     }修改如下，供参考：

可参


Question: 求大佬看看 用VC6.0一直没有输出有bug

printfNode 函数中的 printf 里面，是不是少个pMove->data.kind,

调试也不行 会显示acess violence


Question: C语言头文件.h目录下有两句typedef void SeqList 和typedef SeqListNode是什么意思？

给void起了不同的别名。

给void起了个别名，分别是SeqList和SeqListNode.

void == SeqList == SeqListNode


Question: 关于设计俄罗斯方块

版主基本归纳清楚了

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

UI + 算法


Question: 求解

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

引用 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;   嘿嘿，谢谢老师！

引用 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; } 供参考～ 好的，谢谢了～

char *a[] = { ... }; print(a[n-1]);


Question: C语言，为什么选B而不是选D？求解

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

s = &x[3];那么&s[2] == &x[3+2]

s=x+3;就是x[3], s[2]则是x[5] 就是0


Question: c语言

浮点数格式 http://bbs.csdn.net/topics/390676437

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

研究他们是怎么存储的，占多少位，OK。


Question: 哥哥们，帮帮我

引用 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; }

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


Question: c语言初学者并集问题，可能写复杂了。不知道为什么出现图中的问题

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]; }

出错信息很明确，你的源代码的18行引起无效内存引用，也就是数组访问越界。


Question: 求解 急拜托拜托

网上一大堆，仅供参考： #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; }

.....................这种百度一下一大堆啊~

可参


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

粗心了，懂了，谢了

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


Question: 一个值的问题

难道是编译器的问题 。。。

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

修改如下，供参考：#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; } 两种方式结果相同：


Question: 求助

引用 1 楼 user-1的回复:不是A，而是a。 好的，谢谢😜

不是A，而是a。


Question: 求大佬帮忙看看。

使用fread，fwrite,fseek通过块读写和定位实现。


Question: C/C++ 有关二维数组的问题

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

sum+=(*a)[i]改成 sum+=a[i]或sum+=*(a+i)

必须得错啊，谁让你得罪人

仅供参考：#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 * * // //

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

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

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

谢谢各位大佬，我悟了

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

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

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

仅供参考： #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; }

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

&sum是int (*)[4]类型，也就是数组指针（指向长度为4的数组的指针）。和int**不是同一个类型。


Question: 我要吐槽这个大坑！！！关于12864汉字显示问题

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

借楼主帖子，也吐槽一下，keil收费，蛋疼。虽有破解，但不一定安全。 arm公司太小气了，应该学习ibm公司，收购eclipse，直接开源免费用，爽。 注：楼主可以试试gcc，开源免费，放心用，弄个交叉编译看看效果，哈哈~~~~


Question: 结构体数组中字符串的输入输出

如果用指针的话，得分配内存，而且得用strcpy拷贝内容给它

原来这样啊

楼主定义的是一个字符，不是字符串。修改如下：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); }

#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);   } //会有异常，无法输出

可以发一下源码  我试试

应该没问题呀  你的报错是什么


Question: 蓝桥杯练习

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

有点明白了！感谢大佬！

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

自己写循环赋值，或者memset都行啊。

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

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

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

它的编译器不支持C99，或者默认没有启用


Question: 大家帮我看看为什么我这个程序“try again？Y or N”会出现2次？我用的ipad编译器

引用 2 楼 forever74 的回复:你的getchar第一次抓到的是之前留在缓冲区里的换行符，所以循环空转了一次。  另外，不要把getchar 和scanf混淆，它一般不会返回1的。 有道理，说的很对！，谢谢，不过前面已经给了我正确答案了

引用 1 楼 user-2 的回复:楼主的逻辑设计太繁琐了，可以考虑简化下。程序修改如下，供参考：#include <stdio.h> #define STEP1 17850 #define STEP2 23900 #define STEP3 29750 #define STEP4 14875  int main(int argc, char* argv[]) {     float salary;     float tax;       int kind;       int step;      char ch;       int break1;     while(1)          {            printf("Please sected your kind:1，单身；2，户主；3，已婚，共有；4已婚，离异\n");            if(scanf("%d",&kind)!=1)              {                printf("Please enter a correct number!\n");                continue;              }         //};  这里多了‘；’号            if(kind>=5)              {                printf("Please enter a correct number(1-4):\n");                continue;              }            if(kind<0)  break;            else              {                switch(kind)                  {                    case(1):step=STEP1;break;                    case(2):step=STEP2;break;                    case(3):step=STEP3;break;                    case(4):step=STEP4;break;                  }                while(1)                  {                    printf("Please enter your salarys in this year:\n");                    if(scanf("%f",&salary)!=1)  continue;                    else if(salary<=0) tax=0;                         else if(salary<step) tax=salary*0.15;                              else                                 tax=step*0.15+(salary-step)*0.28;                    break;                  }                printf("you tax is $%.2f.\n",tax);              }            while(1)             {               printf("try again ?Y or N\n");               getchar();  //吃掉缓冲区多余字符               ch=getchar();               //if((ch=getchar())==1&&ch!='Y'&&ch!='y'&&ch!='N'&&ch!='n')continue;               if(ch=='Y'||ch=='y')                 {                   break1=1; break;                 }               else if(ch=='N'||ch=='n')                 {                   break1=0; break;                   }             }            if(!break1) break;          }     printf("Done!\n");      return 0; } 太赞了，完全正确，谢谢！


Question: Linux下setlocale( LC_ALL , "zh_CN.GBK" ) 设置失败

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

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

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

是 无法改为GBK 是  以上答案都是我瞎猜的。

好吧，又错了，我之前的回复是今天的，不是昨天。

好吧，抱歉我没说清楚。 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。 --------------------------------------------- 当然，如果一个程序是个服务器程序，它的执行过程中根本不在本机显示字符，那就是另一回事了。

sudo apt-get -y install language-pack-zh-hans

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

好像可以另行安装对中文的支持。搜一下

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

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

引用 6 楼 ctrigger 的回复:TO: forever74 楼上精辟啊，赞一个。 顺便show一下我的Fedora 33：  为什么你的支持gbk等编码，我的zh_CN只有UTF-8？


Question: 请问我加了除法，为什么运行里面没有除法的题目

%3是得不到3的。

有人吗？？？？


Question: C语言中，关于float与double使用造成不同结果的原因？

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

没出任何问题，你发现了一个float和double精度不同的很好的栗子，表扬一哈。


Question: 求助

第一次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


Question: 大佬们有人能讲一下这个啥原理吗，我看不懂。

简单地说， 循环几次，就输出几个空格占位置，然后再干正事儿。

这有啥原理呢，先打印空格，再打印图案呗


Question: 运行超时问题

可以这样试试：  #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; }

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

供参考：#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; }

超时就是太慢了嘛，想办法提高效率。  好好挖掘一下数组的作用，降低循环次数，不要有二重循环。


Question: 请问位大佬,如何开启开启发生生成错误，是否继续并运行上次的成功生成

解决了吗，我也遇到了同样的问题，呜呜┭┮﹏┭┮

用计算机，用浏览器访问本贴 https://bbs.csdn.net/topics/398725415 然后往下边看，更下边。


Question: 萌新求问

多谢了，hxd

修改如下，供参考：#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; }

不对啊，还要输入多组数据啊，就是这里不会了

供参考：#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; }


Question: 救救孩子吧  我是真的不会了

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

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

什么地方出错了呢？


Question: 请问fatal error LNK1104: cannot open file "Debug/作业.exe"怎么回事

不能打开是因为它开着呢，你得先关上它才能有机会打开。

不要用中文。。。。


你要是光说“报错”，那我就只能说“改正呗”。

赞同。楼主正解。。


Question: C语言链表问题

#include<stdio.h> #include<stdlib.h>  typedef struct Node* PtrToNode; typedef int ElementType; //typedef struct Node{  //后面没有别名所以去掉typedef struct Node{     ElementType Data;     PtrToNode Next; };  typedef PtrToNode List;  List createList() {     List head = (PtrToNode)malloc(sizeof(struct Node));     if (!head)         exit(0);     head->Data = 0;     head->Next = NULL;     printf("头节点信息：\n");     //printf("list=%3d\n",head);     printf("list=%p\n",head);     printf("list->Data=%3d\n",head->Data);     //printf("list->Next=%3d\n",head->Next);     printf("list->Next=%p\n",head->Next);      return head; }  PtrToNode createNode(int Data) {     PtrToNode Node = (PtrToNode)malloc(sizeof(struct Node));     if (!Node)         exit(0);     Node->Data = Data;     Node->Next = NULL;      return Node; }  void printList(List head) {     PtrToNode cursor = head->Next;     while(cursor) {         printf("结点信息：\n");         //printf("cursor=%3d\n",cursor);         printf("cursor=%p\n",cursor);         printf("cursor->Data=%3d\n",cursor->Data);         //printf("cursor->Next=%3d\n",cursor->Next);         printf("cursor->Next=%p\n",cursor->Next);         cursor = cursor->Next;         printf("\n");     } }  void insertNode(List head,int data) {     PtrToNode newNode = createNode(data);     newNode->Next = head->Next;     head->Next = newNode;      printf("insert ok!\n"); }  PtrToNode findNode(List head, int x) {     PtrToNode cursor = head->Next;      //while(cursor->Next!=NULL) {    //如果cursor为NULL，那么cursor->Next操作就会出现段错误     while(cursor){         if(x==cursor->Data) {             return cursor;         }else{             cursor = cursor->Next;         }     }      return NULL;    //注意返回NULL }  int delNode(List head,int x) {     PtrToNode cursor = head->Next;     PtrToNode cursorFront = head;       if (!cursor) {         printf("list is empty!\n");         return -1;     }      while (cursor) {         if (cursor->Data == x) {    //删除所有的等于x的节点             cursorFront->Next = cursor->Next;             free(cursor);             cursor = cursorFront->Next;             continue;         }          cursor = cursor->Next;         cursorFront = cursorFront->Next;     }     /*     if(cursor==NULL){         printf("list is empty!\n");     }else{         while(cursor->Data != x){             cursorFront = cursor;             cursor = cursorFront->Next;             if(cursor==NULL){                 printf("not found element,delete failed!\n");                 return 0;             }         }         cursorFront->Next = cursor->Next;         free(cursor);     }     */      return 0; }  int main() {     List list = createList();     PtrToNode node;      if (!list) {         printf("create failed!\n");         return -1;     }      //if(list){         printf("create ok!\n\n");         for(int i=1;i<=5;i++){             insertNode(list, i*10);         }         //int x = (int)findNode(list, 40);         node = findNode(list, 40);         //printf("\nquery ok！\nlocation is:%3d\n\n",x);         printf("\nquery ok！\nlocation is:%p\n\n", node);         delNode(list, 20);         printList(list);     //}else{      //   printf("create failed!\n");     //}      system("pause");     return 0; } 供参考～

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

newNode->Next = head->Next; 一般要先判断一下head是否为NULL，然后 head->Next=newNode; newNode->Next=NULL; head=newNode;

分析代码的基操，要用动态的发展的眼光看问题。 那个NULL是结束标记，后来insert的每个结点都是从那里复制来的结束标记，没有它就没有结束标记，当然不结束了。 至于你看见的输出信息，那是没有后续结点的那个时刻输出的。  很多人大学毕业了回头一看户口本上写着自己的文化程度小学，那就是因为户口本是小学时候办的，很正常。


Question: pta第一个总是过不了

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

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

写的过于啰嗦简单点直接点:

修改如下，供参考：#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; }

#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); } 供参考～


Question: 自动发邮件的脚本

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

Windows下安装vmware，再在vmware中安装Ubuntu，再在Ubuntu中使用mail


Question: 数据结构——算术表达式，程序运行结果有点问题，逻辑上不知道哪里写错了，比较急在线等！！！

调试是程序员必会的技能。


Question: 求指点

楼主说答案错了指的是？

是这样的吗？  #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; }

另外还有13条警告，也一起吧。

图片不清晰，看着也不连贯，为什么不直接贴源码呢？


Question: 求助

'\x64' == 6 × 16 + 4 = 100, 97+3 = 100 等价'a'+3='d'


Question: 不符合规范,各位大佬动动脑

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

其实我判断了的

fpWrite 用之前要有if(fpWrite!=NULL）的判断

问题发生在被你切掉的部分。  我怀疑你混用了高级低级两套IO造成出错。


Question: 有5个学生，每个学生的数据包括学号、姓名、三门课的成在此基础上编写求max函数，求平均成绩最高分的学生的数据，编写函数average求总平均分，并在主函数中调用

#include<stdio.h> #include<string.h>  struct student{     char studid[12];     char name[12];     int sub1;     int sub2;     int sub3; }data[5];  int main() {     void input(struct student data[5]);     void print(struct student data[5]);     void max(struct student data[5]);     void average(struct student data[5]);     input(data);     printf("学号  姓名  科目一  科目二  科目三\n");     print(data);      max(data);     average(data);      return 0; }  void input(struct student data[]) {     int i;     printf("请输入相关的学生信息:\n");     for(i=0;i<5;i++){         scanf("%s",data[i].studid);         scanf("%s",data[i].name);         scanf("%d",&data[i].sub1);         scanf("%d",&data[i].sub2);         scanf("%d",&data[i].sub3);     } } void print(struct student data[]) {     int i;      for(i=0;i<5;i++){         printf("%s %s %d %d %d",data[i].name,data[i].studid,data[i].sub1,data[i].sub2,data[i].sub3);         printf("\n");     }  } void max(struct student data[]) {     int i=0, idx;     int a[5] = {0};     int max = 0;     max = a[0];     for(i=0;i<5;i++){         a[i]=(data[i].sub1+data[i].sub2+data[i].sub3)/3;         //if(strcmp(a[i],a[i+1])<0)         //if(a[i] < a[i+1])         if(max < a[i]) {             max = a[i];             idx = i;         }     }     printf("%d\n",max);     printf("%s %s %d % d %d\n",             data[idx].name, data[idx].studid,             data[idx].sub1, data[idx].sub2,             data[idx].sub3); }  void average(struct student data[]) {     int i=0;     int all=0;     //int a[5];     int average=0;     for(i=0;i<5;i++){         //a[i]=(data[i].sub1+data[i].sub2+data[i].sub3);         //all += a[i];         all +=(data[i].sub1+data[i].sub2+data[i].sub3);         //all += a[i];     }     average = all/5;     printf("%d\n", average); } 供参考～

供参考：#include<stdio.h>  struct student{ char   studid[12]; char   name[12]; int    sub1; int    sub2; int    sub3; }data[5];   int main(int argc, char* argv[]) {       void input(struct student data[5]);      void print(struct student data[5]);      void max(struct student data[5]);      void average(struct student data[5]);      input(data);      //printf("学号 姓名 科目一 科目二 科目三\n");      max(data);      average(data);       print(data);       return 0; }  void input(struct student data[]) {      int i;      printf("\n请输入五个学生信息:\n");      printf("学号 姓名 科一 科二 科三\n");      for(i=0;i<5;i++){         scanf("%s",data[i].studid);         scanf("%s",data[i].name);         scanf("%d",&data[i].sub1);         scanf("%d",&data[i].sub2);         scanf("%d",&data[i].sub3);      } }  void print(struct student data[]) {      int i;      printf("\n学号 姓名 科目一 科目二 科目三\n");      for(i=0;i<5;i++){         printf(" %s   %s   %d    %d    %d",         data[i].studid,data[i].name,data[i].sub1,data[i].sub2,data[i].sub3);         printf("\n");      } }  void max(struct student data[]) {      int i,j;      int a[5]={0};      int max=0;            for(i=0;i<5;i++)          a[i]=(data[i].sub1+data[i].sub2+data[i].sub3)/3;            max=a[0];   //if(strcmp(a[i],a[i+1])<0)      for(i=0;i<5;i++)          if(max < a[i]){                max=a[i];                j=i;          }      printf("\nmax:%s   %s   %d    %d    %d   maxavg=%d\n",      data[j].studid,data[j].name,data[j].sub1,data[j].sub2,data[j].sub3,max); }  void average(struct student data[]) {      int i=0;      int all=0;      int a[5]={0};      int average=0;      for(i=0;i<5;i++){          a[i]=(data[i].sub1+data[i].sub2+data[i].sub3)/3;          all+=a[i];      }      average=all/5;      printf("\naverage=%d\n",average); }


Question: C语言试题

打印函数修改下：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')); }

供参考：#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')); }

可参


Question: 开源社区

https://bbs.csdn.net/topics/394221449  乱查的

百度搜相关关键字。


Question: 求助

学习一哈转义字符么，很简单的。


Question: 谁能告诉我第三题问什么输出的是三，求大佬回答

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

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


Question: 分块查找问题

数据表有一维、二维、三维 分块的方法有二叉树、四叉树、八叉树

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

2^X >= 4000 ?


Question: C语言

匪夷所思的是，叫做del的函数貌似处理链表的居然没有调用free？


Question: 这个代码为什么不能生效啊

楼主的代码修改如下，还是有问题：#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; }

去搜下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; }

for行尾有多余的分号


Question: a+=a-=a*=a;

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

我承认错误并作出检讨。

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

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

C语言中 a+=a-=a*=a 是未定义行为

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

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

它们作为赋值系的运算符，统一是倒数第二优先级，从右向左结合。


Question: C语言课程设计学生管理系统实验报告求

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

有么有人帮帮忙


Question: 为什么

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

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

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


Question: 学生管理系统


Question: sizeof

引用 5 楼 user-5的回复:还不给我分？我擦.... ‘w’是字符常量，' w'是多字符常量，注意你的那个sizeof(' w')单引号里第一个是空格，第二个是w，也就是说你的sizeof里的不是字符常量，而是多字符常量，多字符常量会被转成int类型，详见#2楼我的回复 维基百科:Multi-character constants (e.g. 'xy') are valid, although rarely useful — they let one store several characters in an integer (e.g. 4 ASCII characters can fit in a 32-bit integer, 8 in a 64-bit one). Since the order in which the characters are packed into one int is not specified, portable use of multi-character constants is difficult.  如果我说得能让你明白，请给我分.... 我不知道咋给分啊

IDE中，鼠标右键点不明白的符号 size_of，在弹出的菜单中选转到定义。

多字符常量，和trigraph一样，属于标准里面为了面子而保留，而时至今日已经没啥用，多数编译器默认舍弃（有些额外打开开关可以用）的东西。  历史的车辙尽管有时提供经验教训，但这道辙更多的效果是扭了脚。  让我们逐渐淡忘它（们）吧，阿门。

引用 3 楼 Infinity G 的回复:[quote=引用 1 楼 自信男孩的回复:]'w'是int类型，类型隐式提升了。你可以看一下getchar()函数原型的返回值类型都是int类型。 那么现在的’w’相当于是ASCII码是吗[/quote] 恩，'w'是ASCII

引用 5 楼 user-5 的回复:还不给我分？我擦.... ‘w’是字符常量，' w'是多字符常量，注意你的那个sizeof(' w')单引号里第一个是空格，第二个是w，也就是说你的sizeof里的不是字符常量，而是多字符常量，多字符常量会被转成int类型，详见#2楼我的回复 维基百科:Multi-character constants (e.g. 'xy') are valid, although rarely useful — they let one store several characters in an integer (e.g. 4 ASCII characters can fit in a 32-bit integer, 8 in a 64-bit one). Since the order in which the characters are packed into one int is not specified, portable use of multi-character constants is difficult.  如果我说得能让你明白，请给我分....  楼主的问题是搞了个全角（或者其他，反正有点胖）单引号，他没有探讨多字符常量的意图。

int size = strlen(' w'); 此时编译器报错，报错信息为 无法将参数 1 从“int”转换为“const char *” 说明此时编译器将' w'看成了int。 对于strlen和sizeof的区别，请参考《C++中strlen与sizeof处理字符数组和字符指针》，希望能够帮到您！

引用 13 楼 Infinity G 的回复:[quote=引用 12 楼 user-5的回复:][quote=引用 11 楼 Infinity G 的回复:][quote=引用 5 楼 user-5的回复:]还不给我分？我擦.... ‘w’是字符常量，' w'是多字符常量，注意你的那个sizeof(' w')单引号里第一个是空格，第二个是w，也就是说你的sizeof里的不是字符常量，而是多字符常量，多字符常量会被转成int类型，详见#2楼我的回复 维基百科:Multi-character constants (e.g. 'xy') are valid, although rarely useful — they let one store several characters in an integer (e.g. 4 ASCII characters can fit in a 32-bit integer, 8 in a 64-bit one). Since the order in which the characters are packed into one int is not specified, portable use of multi-character constants is difficult.  如果我说得能让你明白，请给我分.... 我不知道咋给分啊[/quote] 好吧...年轻人你不讲武德...耗子尾汁[/quote] 我最近才在这个软件上发帖的，我不太会。。[/quote] 没事儿...  会的话给大家结一下   不会就算了

引用 12 楼 user-5的回复:[quote=引用 11 楼 Infinity G 的回复:][quote=引用 5 楼 user-5的回复:]还不给我分？我擦.... ‘w’是字符常量，' w'是多字符常量，注意你的那个sizeof(' w')单引号里第一个是空格，第二个是w，也就是说你的sizeof里的不是字符常量，而是多字符常量，多字符常量会被转成int类型，详见#2楼我的回复 维基百科:Multi-character constants (e.g. 'xy') are valid, although rarely useful — they let one store several characters in an integer (e.g. 4 ASCII characters can fit in a 32-bit integer, 8 in a 64-bit one). Since the order in which the characters are packed into one int is not specified, portable use of multi-character constants is difficult.  如果我说得能让你明白，请给我分.... 我不知道咋给分啊[/quote] 好吧...年轻人你不讲武德...耗子尾汁[/quote] 我最近才在这个软件上发帖的，我不太会。。

引用 11 楼 Infinity G 的回复:[quote=引用 5 楼 user-5的回复:]还不给我分？我擦.... ‘w’是字符常量，' w'是多字符常量，注意你的那个sizeof(' w')单引号里第一个是空格，第二个是w，也就是说你的sizeof里的不是字符常量，而是多字符常量，多字符常量会被转成int类型，详见#2楼我的回复 维基百科:Multi-character constants (e.g. 'xy') are valid, although rarely useful — they let one store several characters in an integer (e.g. 4 ASCII characters can fit in a 32-bit integer, 8 in a 64-bit one). Since the order in which the characters are packed into one int is not specified, portable use of multi-character constants is difficult.  如果我说得能让你明白，请给我分.... 我不知道咋给分啊[/quote] 好吧...年轻人你不讲武德...耗子尾汁

你的引号急需减肥，否则误导性太大。  'w'什么时候都相当于ASCII码。郭靖他妈妈一直叫李萍，不分场合。  C语言而不是C++，历史上一直都说字符常量（注意我没有说型）是int型的，有好多理由但是这里空间比较窄，写不下。 让我们记住这一点即可。

引用 1 楼 自信男孩的回复:'w'是int类型，类型隐式提升了。你可以看一下getchar()函数原型的返回值类型都是int类型。 那么现在的’w’相当于是ASCII码是吗

std::cout << typeid(' w').name() << std::endl; std::cout << typeid('w').name() << std::endl; 运行结果：


Question: 帮帮孩子吧

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

1.遍历链表的条件一般是 m!=NULL，下面的p也是一样。 2.删除结点的那个循环语句里写的不对 2.删除结点一般都有个释放删除的结点的内存空间的语句，free()


Question: for循环语句中那个（）里面为什么只有一个；？

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

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.

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

不是有两个吗？怎么是一个呢？ for(;*sp!='\0';sp++){ 你的代码，你再数一下几个;分号


Question: c语言 的函数问题

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

去我博客找素数表


Question: 萌新求教

成功了，感谢指点

r和h没毛病，把v定义成float或者double类型试试？


Question: 问一个 指向函数的指针 问题

谢谢大佬，明白了

你反汇编一下会看到，你的图上f的那个地址是函数f内部开头的地址， 而图上的p实际上也就是你的程序输出，那里是一个函数调用列表的表项，只有一条跳转指令，跳转到上述实际函数地址去。  某种意义上这就是封装这个词的的表现形式之一。


Question: 用c语言编写一门学生信息管理系统

看本网页下面红色字体对应的多个链接。


Question: 【C语言】内部编译器错误

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

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

这种错误不是代码引起的，是硬件、系统、VS安装或项目配置问题。 建议以同样环境写个helloworld来确认环境正确性。


Question: 数据结构——二叉排序树的创建查找插入，程序在创建树过程不运行，求帮忙看看代码哪里有问题！！

#include <stdio.h> #include <stdlib.h>  #pragma warning( disable:4996)  typedef struct BSTNode { 	int data; 	BSTNode *lchild, *rchild; };    void InsertBST(BSTNode **T, int e) //插入  { 	bool x = false; 	if (!(*T)) 	{ 		*T = (BSTNode*)malloc(sizeof(BSTNode)); 		(*T)->data = e; 		(*T)->lchild = NULL; 		(*T)->rchild = NULL; 		x = true; 	} 	if ((*T)->data == e) 	{ 		if (x == true) 			printf("%d插入成功\n",e); 		else 			printf("插入值重复\n"); 	} 	else if ((*T)->data > e) 		InsertBST(&((*T)->lchild), e); 	 	else 		InsertBST(&((*T)->rchild), e);  }  BSTNode* CreatBST(BSTNode *T, int num[], int n) //创建  { 	T= (BSTNode*)malloc(sizeof(BSTNode)); 	T->data = num[0]; 	T->lchild = NULL; 	T->rchild = NULL; 	for (int i = 1; i < n; i++) 	{ 		InsertBST(&T, num[i]);  //创建过程即插入结点过程 	} 	return T; }  void SearchBST(BSTNode *T, int key) //递归查找  { 	BSTNode *p = T; 	if (p) 	{ 		if (key == p->data) 		{ 			printf("查找成功！\n"); 		} 		else if (key < p->data&&p->lchild) 			SearchBST(p->lchild, key); 		else if (key > p->data&&p->rchild) 			SearchBST(p->rchild, key); 		else printf("关键字不存在！\n"); 	} } int main() { 	BSTNode *T = NULL; 	int num[50], a=0, i = 0, j, key; 	printf("下面请按要求输入创建二叉排序树\n"); 	do { 		printf("请输入一个数字（-1退出循环）：\n"); 		scanf("%d", &num[i]); 		a = num[i]; 		i++; 	} while (a != (-1)); 	T = CreatBST(T, num, i-1);  	 	printf("请输入插入数字：\n"); //插入  	scanf("%d", &a); 	InsertBST(&T, a); 	 	 	printf("请输入查找关键数字：\n"); //查找  	scanf("%d", &key); 	SearchBST(T, key); 	return 0; }  做了一些改动，总体上没太大变化

引用 1 楼 我当时害怕极了QAQ的回复:感觉你写的很奇怪，应该是指针的问题  具体代码没看，对指针做了一些改动  仅供参考  #include <stdio.h> #include <stdlib.h>  #pragma warning( disable:4996) #define OK 1 #define False -1 typedef struct BSTNode { 	int data; 	struct BSTNode *lchild, *rchild; };  int InsertBST(BSTNode *T, int e) //插入  { 	if (T == NULL) return False; 	BSTNode *p = NULL, *q = NULL; 	q = T; 	p = (BSTNode*)malloc(sizeof(BSTNode)); 	(p)->data = e; 	(p)->lchild = (p)->rchild = NULL; 	if (e == (q)->data) return 0; 	if (e < (q)->data) InsertBST(q->lchild, e); 	if (e > (q)->data) InsertBST(q->rchild, e); 	return OK; }  int CreatBST(BSTNode *T, int num[], int n) //创建  { 	int i = 1; 	(T) = (BSTNode*)malloc(sizeof(BSTNode)); 	(T)->data = num[i]; 	(T)->lchild = (T)->rchild = NULL; 	for (i = 2; i <= n; i++) 		InsertBST(T, num[i]);  //创建过程即插入结点过程  	return OK; }  int SearchBST(BSTNode *T, int key) //递归查找  { 	BSTNode *p = T; 	if (p) 	{ 		if (key == p->data) 		{ 			printf("查找成功！\n"); 			return OK; 		} 		else if (key < p->data&&p->lchild) 			SearchBST(p->lchild, key); 		else if (key > p->data&&p->rchild) 			SearchBST(p->rchild, key); 		else printf("关键字不存在！\n"); 	} } int main() { 	BSTNode T; 	int num[50], n = 0, a, i = 1, j, key; 	printf("下面请按要求输入创建二叉排序树\n"); 	do { 		printf("请输入一个数字（-1退出循环）：\n"); 		scanf("%d", &num[i]); 		a = num[i]; 		i++; 		n++; 	} while (a != (-1)); 	n--; 	if (CreatBST(&T, num, n)); printf("创建成功！\n"); //创建   	printf("请输入插入数字：\n"); //插入  	scanf("%d", &a); 	j = InsertBST(&T, a); 	if (j == 1) printf("\n插入成功！\n"); 	else if (j == 0) printf("数据已存在！无需插入！\n"); 	else printf("树空！插入失败！\n");  	printf("请输入查找关键数字：\n"); //查找  	scanf("%d", &key); 	SearchBST(&T, key);  } 我用的是二级指针，用了您改的指针，现在创建树成功了，但是查找关键字函数有点bug，存在的关键字查找不出来，你能再帮我看看代码吗？非常感谢！！

InsertBST的时候，p和q没有建立联系。 改成：    if (e < (q)->data) {           q->lchild=p;           InsertBST(p, e);    }     if (e > (q)->data) {        q->rchild=p;         InsertBST(p, e);    }


Question: 大一小白怎么进阶，学c

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

数据结构对单链表进行数据排序 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] //以上三行等价

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

想要从本质上理解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、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！


Question: 求大佬看看这个怎么做

仅供参考： #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; }


Question: 大佬知道这个用c语言怎么写吗

//为什么printf（“”%c“”,a[i].data）输出不了 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_SIZE 1024 typedef struct {     char data;     int weight;     int parent;     int lchild;     int rchild; } Huffnode,*Hufftree; typedef struct stack {     int top;     int elem[MAX_SIZE]; } Stack; void Initstack(Stack *s) {     s->top=-1; } void push(Stack *s,int e) {     s->top++;     s->elem[s->top]=e; } int pop(Stack *s) {     return s->elem[s->top--]; } bool isempty(Stack *s) {     if(s->top==-1)         return true;     else         return false; } void GetHuffmamCode(Hufftree a,int n) {     int i,j,s1,s2,max,c,p;     Stack s;     char ch;     Initstack(&s);     printf("输入字符集：");fflush(stdout);     rewind(stdin);     for(i=1;i<=n;i++) {         scanf("%c",&a[i].data);     }     for(i=1;i<=n;i++) {         printf("a[%d].data:%c\n",i,a[i].data);     }     printf("\n");     printf("输入权值：");fflush(stdout);     rewind(stdin);     for(i=1;i<=n;i++) {         scanf("%d",&a[i].weight);     }     for(i=1;i<=n;i++) {         printf("a[%d].weight:%d\n",i,a[i].weight);     }     printf("\n");     int m=2*n-1;     for(i=1;i<=n;i++) {         a[i].parent=0;         a[i].rchild=0;         a[i].lchild=0;     }     for(i=n+1;i<=m;i++) {         a[i].data=NULL;         a[i].weight=0;         a[i].parent=0;         a[i].lchild=0;         a[i].rchild=0;     }     for(i=n+1;i<=m;i++) {         max=65535;         for(j=1;j<=i-1;j++) {             if(a[j].parent==0&&a[j].weight<=max) {                 s1=j;                 max=a[j].weight;             }         }         a[s1].parent=i;         max=65535;         for(j=1;j<=i-1;j++) {             if(a[j].parent==0&&a[j].weight<=max) {                 s2=j;                 max=a[j].weight;             }         }         a[s2].parent=i;         a[i].weight=a[s1].weight+a[s2].weight;         a[i].lchild=s1;         a[i].rchild=s2;     }     for(i=1;i<=n;i++) {         c=i;         p=a[i].parent;         while(p!=0) {             if(a[p].lchild==c)                 push(&s,0);             else                 push(&s,1);             c=p;             p=a[p].parent;         }         printf("i:%d\n",i);         printf("%c\n",a[i].data);         while(!isempty(&s))             printf("%d",pop(&s));         printf("\n");     } } int main() {     Hufftree a;     int n;     int m;     printf("输入字符个数：");     scanf("%d",&n); //  m=2*n-1;     m=3*n;     a=(Hufftree)malloc(sizeof(Huffnode)*m);     GetHuffmamCode(a,n);     return 0; } //输入字符个数：3 //输入字符集：abc //a[1].data:a //a[2].data:b //a[3].data:c // //输入权值：10 20 30 //a[1].weight:10 //a[2].weight:20 //a[3].weight:30 // //i:1 //a //00 //i:2 //b //01 //i:3 //c //1 //

引用 2 楼 赵4老师的回复:仅供参考：#include <stdio.h> #include <stdlib.h> #include <conio.h> unsigned int iv,i; unsigned char BCD[5];//定长10位BCD码 unsigned char sv[11]; void main() {     iv=123456789;//最大10位无符号正整数     //INT2BCD     sprintf(sv,"%010u",iv);     for (i=0;i<10;i+=2) {         BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);     }     printf("BCD=%02x%02x%02x%02x%02x\n",BCD[0],BCD[1],BCD[2],BCD[3],BCD[4]);     //BCD2INT     for (i=0;i<10;i+=2) {         sv[i]='0'|(BCD[i/2]>>4);         sv[i+1]='0'|(BCD[i/2]&0x0F);     }     sscanf(sv,"%010u",&iv);     printf("iv=%010u\n",iv);     getch(); }  可以请你帮我看看为什么printf（“”%c“”,a[i].data）输出不了吗 #include<stdio.h> #include<stdlib.h> #include<string.h> #define MAX_SIZE 1024 typedef struct{ char data; int weight; int parent; int lchild; int rchild; }Huffnode,*Hufftree; typedef struct stack{ int top; int elem[MAX_SIZE]; }Stack; void Initstack(Stack *s) { s->top=-1; } void push(Stack *s,int e) { s->top++; s->elem[s->top]=e; } int pop(Stack *s) { return s->elem[s->top--]; } bool isempty(Stack *s) { if(s->top==-1) return true; else return false; } void GetHuffmamCode(Hufftree a,int n) { int i,j,s1,s2,max,c,p; Stack s; char ch; Initstack(&s); printf("输入字符集："); for(i=1;i<=n;i++) { scanf("%c",&a[i].data); scanf("%c",&ch); } printf("输入权值："); for(i=1;i<=n;i++) { scanf("%d",&a[i].weight); scanf("%c",&ch); } int m=2*n-1; for(i=1;i<=n;i++) { a[i].parent=0; a[i].rchild=0; a[i].lchild=0; } for(i=n+1;i<=m;i++) { a[i].data=NULL; a[i].weight=0; a[i].parent=0; a[i].lchild=0; a[i].rchild=0; } for(i=n+1;i<=m;i++) { max=65535; for(j=1;j<=i-1;j++) { if(a[j].parent==0&&a[j].weight<=max) { s1=j; max=a[j].weight; } } a[s1].parent=i; max=65535; for(j=1;j<=i-1;j++) { if(a[j].parent==0&&a[j].weight<=max) { s2=j; max=a[j].weight; } } a[s2].parent=i; a[i].weight=a[s1].weight+a[s2].weight; a[i].lchild=s1; a[i].rchild=s2; } for(i=1;i<=n;i++) { c=i; p=a[i].parent; while(p!=0) { if(a[p].lchild==c) push(&s,0); else push(&s,1); c=p; p=a[p].parent; } printf("%c\n",a[i].data); while(!isempty(&s)) printf("%d",pop(&s)); printf("\n"); } } int main() { Hufftree a; int n; int m; printf("输入字符个数："); scanf("%d",&n); m=2*n-1; a=(Hufftree)malloc(sizeof(Huffnode)*m); GetHuffmamCode(a,n); return 0; }

先确定大小端。接下来就是指针操作。。


Question: 菜鸟求教

感谢各位的指教

小数位，是1位还是0位

精度（.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

懂了,受教了!

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

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


Question: 有大佬能逐行解释一下代码吗？完全看不懂呜呜

引用 7 楼 qzjhjxj的回复:a[i]表示二维数组每行首地址 嗯知道了谢谢！

a[i]表示二维数组每行首地址

请问一下，针对这个代码，对于二维数组a[i][j]，输出a[i]的意思就是输出这个二维数组的这一行吗？就是说二维数组可以写成一维数组？？

非常感谢哦！

#include<stdio.h> #include<string.h> int main(int argc, char* argv[]) {     char s[100],a[10][10],b[10];     int i,j,k,len,flag;      gets(s);                //输入一字符串：good morning teacther     len=strlen(s);          //取得字符串的长度值      j=0;k=0;flag=0;         //初始化     for(i=0;i<len+1;i++)   //注意i<len+1        if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z')//判断是否是字母，是就是单词，一个一个字符去判断           {             a[k][j]=s[i];        //把每个单词的每个字符记录到a[0][1]...a[0][10],一个单词一行.             j++;                 //good     a[0][0-10]             flag=1;              //morning  a[1][0-10]           }                      //teacther a[2][0-10]        else if(flag==0) //如果不是字母，判断是否是单词的头部                   continue;             else            //否则就是尾部                 {                    a[k][j]='\0'; //每个单词的结束符                    k++;          //进入下一个单词准备                    j=0;          //a[k][0]                    flag=0;       //标志复位                 }     /*上面这段代码执行完，数组a中的结果：a[10][10]={"good\0",                                                     "morning\0",                                                     "teacther\0"                                                                 }     */      for(i=0;i<k;i++) //输出字符串中的单词，一个单词一行         puts(a[i]);  //a[0][0]..... good                      //a[1][0]      morning                      //a[2][0]      teacther      strcpy(b,a[0]); //把a[0]数组中第一个单词拷贝到数组b中，作为比较单词长度的初始值     for(i=1;i<k;i++)         if(strlen(a[i])>strlen(b))//与数组a中其他单词比较长度            strcpy(b,a[i]); // 找到最长单词，放入b数组中      puts(b); //输出最长的单词   teacther      return 0; }

你知道这是什么语言，你知道啥是头文件，你知道哪个是主函数，你知道哪个是数组，甚至你都知道数组有多大。 瞧，你不是“完全”看不懂，你已经懂好多了。 说谎的不是好孩纸。  所以， 要么你说清楚具体哪里不懂； 要么你回去看那些能看懂的，然后合起书，靠自己把那些看懂了的用自己的方式写出来，调试运行到满意。然后再回来看这个。

不是引文字母， 是英文字母

#include<stdio.h> #include<string.h> void main() { char s[100],a[10][10],b[10]; int i,j,k,len,flag; gets(s);//输入字符串 len=strlen(s); //取字符串长度 j=0;k=0;flag=0; for(i=0;i<len+1;i++)   //逐个字符处理输入字符串 if(s[i]>='a'&&s[i]<='z'||s[i]>='A'&&s[i]<='Z') //凡是引文字母，即认为此字符为单词一部分 { a[k][j]=s[i];   //单词的字符逐个存入二维数组a, 一共10个单词，每单词长不超过10个字符， 所以a[10][10] j++; flag=1;    //不是单词结尾 } else if(flag==0) //继续取下一个单词 continue; else  //一个单词结束保存 { a[k][j]='\0';  k++; j=0; flag=0;   } for(i=0;i<k;i++) puts(a[i]);   //输出得到的每个单词  strcpy(b,a[0]);//求最长单词 for(i=1;i<k;i++) //遍历每个单词 if(strlen(a[i])>strlen(b))  //每个单词和b里保存单词比较长度 strcpy(b,a[i]); //如果比b里单词长， 取代b里单词 puts(b);  //输出最长单词 }


Question: 我怎么把串口接到的数据， 2个字节16位二进制数（有符号）的直接转化成十进制数值显示出来，主要这个部分不会写，不知道怎么写。

像楼主你自己写的那样先调整字节序，然后在调过序的数组上像二楼那样强转即可。

像楼主你自己写的那样先调整字节序，然后在调过序的数组上像二楼那样强转即可。

从你的示例数据看，负数是用补码表示的，所以没问题。

to movsd  ,请问你这个  正负 都是可以的是吧

它这个就是定点小数格式，固定7位小数的浮点数放大128倍转化为16位整数存储

printf("%f\n",*(short *)(buf)/128.0f);

union FIXVALUE { 	struct 	{ 		uint8_t lowPart; 		uint8_t highPart; 	}; 	short value; };  union FIXVALUE fv; fv.lowPart=buf[0]; fv.highPart=buf[1]; printf("%f\n",fv.value/128.0f);


Question: 蓝桥杯

好的好的 十分感谢

没有库，直接去官网下载一个就行。keil5只是IDE，都不带库的。


Question: 这个题目不会做，大家能帮忙吗

供参考：#include <stdio.h> #define N 30  void average(int *p,int n); void max( int *p,int n); void sort(int *p,int n);  int main(int argc, char* argv[]) {     int t[N]={0};      printf("Input %d day temperature:",N);     for(int i=0;i<N;i++)         scanf("%d",&t[i]);      average(t,N);     max(t,N);     sort(t,N);      return 0; }   void average(int *p,int n) {     int sum=0;     for(int i=0;i<n;i++)         sum += p[i];     printf("average=%d\n",sum/n); }  void max(int *p,int n) {     int max = p[0],h=0;     for(int i=0;i<n;i++)        if(max<p[i]){max = p[i];h = i;}     printf("hight temperature:%d, is %d day.\n",max,h+1);  }  void sort(int *p,int n) {     int t,temp;     for(int i=0;i<n;i++){         for(int j=t=i;j<n;j++){             if(p[t]>p[j]){                    t = j;             }         }         if(t != i){            temp = p[t];            p[t] = p[i];            p[i] = temp;         }         printf("%d%c",p[i],(i<n-1?' ':'\n'));     }  }

引用 4 楼 jaj2003的回复:提示一下吧. 第一个算函数平均值就是总数/30  第二个函数就是数组的遍历  第三个函数就是数组排序，方法很多，可以冒泡排序，插入排序，堆排序，随便网上找个复制代码就行 但是要调用就不会

不过你们刚学函数，就让你们排序是不是要求高了点

引用 1 楼 jaj2003的回复:这种最基本的题目都不会，证明还是一个小白啊 对呀，我是小白，你能帮帮我吗，如果这里不适合我，能告诉我那些软件会适合我，就是基础问题，问了会有人帮忙，不会嫌弃我是小白

这种最基本的题目都不会，证明还是一个小白啊


Question: 求数据结构 C语言 舞伴配对问题程序代码

仅供参考：//舞会上，男士们（m人）和女士们（n人, n<m）进入舞厅时，各自排成一队。跳舞开始时，依次从男队和女队的队头上各出一人配成舞伴。 //男队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。在第t首曲子时，第x个女生和第几个男生配对跳舞？ #include <stdio.h> #include <string.h> #define MAX 26 int m,n,t,x,y,i,j,k; char md[MAX]; char nd[MAX]; char c; void main() {     while (1) {         printf("Input n m(1<=n<m<=%d):",MAX);         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1<=n && n<m && m<=MAX) break;         }     }     while (1) {         printf("Input t x(1<=t<=%d 1<=x<=%d):",MAX,n);         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&t,&x)) {             if (1<=t && t<=MAX && 1<=x && x<=n) break;         }     }     for (i=0;i<m;i++) md[i]='A'+i;     for (i=0;i<n;i++) nd[i]='a'+i;     k=0;     for (i=0;i<t;i++) {         printf("%2d: ",i+1);         for (j=0;j<n;j++) {             c=' ';             if (i==t-1 && j==x-1) {c='*';y=k+1;}             printf("%c%c%c",md[k],nd[j],c);             k=(k+1)%m;         }         printf("\n");     }     printf("%d\n",y);  }


Question: 十字路口红绿灯问题

学长能给个答案吗

工大计科的学长？

woc工大人？

位段/位域结构体，了解一下？


Question: 一个关于字库的问题

引用 3 楼 forever74 的回复:或者说操作系统的字体驱动在安装字体的时候就默默地记录了谁家有生僻字，准备好这种时候顶上去用。 也就是说是程序的判断，而不是字库本身有什么映射之类的，是吧？

我猜是这样，毕竟不同的字库之间理论上是平级，各自独立安装的话，互相不了解才对，就像刚入学的同学。 但是操作系统的字库驱动就像导员一样，他看过大家的档案啊。  另外，我的树莓派上没有宋体，于是默认缺字就找楷体。

引用 2 楼 赵4老师 的回复:使用宋体方正超大字库？ #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     wchar_t wc[2];      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48,0,0,0,0,0,0,0,GB2312_CHARSET ,0,0,0,0,"宋体-方正超大字符集");     SelectObject(hdc,hfont);     wc[0]=0xD854u;     wc[1]=0xDC00u;     TextOutW(hdc,10,10,wc,2);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; } #if 0 代理项或代理项对是一对共同表示单个字符的 16 位 Unicode 编码值。需要记住的关键一点是： 代理项对实际上是 32 位单个字符，不能再假定一个 16 位 Unicode 编码值正好映射到一个字符。  使用代理项对 代理项对的第一个值是高代理项，包含介于 U+D800 到 U+DBFF 范围内的 16 位代码值。 该对的第二个值是低代理项，包含介于 U+DC00 到 U+DFFF 范围内的值。通过使用代理项对， 16 位 Unicode 编码系统可以对已由 Unicode 标准定义的一百多万个其他字符 (220) 进行寻址。  在传递给 XmlTextWriter 方法的任何字符串中都可以使用代理项字符。不过，代理项字符在编写的 XML 中应该有效。例如，万维网联合会 (W3C) 建议不允许在元素或属性的名称中使用代理项字符。 如果字符串包含无效的代理项对，则引发异常。  另外，可以使用 WriteSurrogateCharEntity 写出与代理项对相对应的字符实体。字符实体以十六 进制格式写出，并用以下公式生成：  (highChar -0xD800) * 0x400 + (lowChar -0xDC00) + 0x10000  如果字符串包含无效的代理项对，则引发异常。下面的示例显示将代理项对作为输入的 WriteSurrogateCharEntity 方法。  C#复制  // The following line writes 𐀀. WriteSurrogateCharEntity ('\uDC00', '\uD800'); 下面的示例生成一个代理项对文件，将其加载到 XmlReader 中，并用新的文件名保存文件。 然后，原始文件和新文件被加载回应用程序的 XML 文档对象模型 (DOM) 结构中以进行比较。  C#复制  char lowChar, highChar; char [] charArray = new char[10]; FileStream targetFile = new FileStream("SurrogatePair.xml",       FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);  lowChar = Convert.ToChar(0xDC00); highChar = Convert.ToChar(0xD800); XmlTextWriter tw = new XmlTextWriter(targetFile, null); tw.Formatting = Formatting.Indented; tw.WriteStartElement("root"); tw.WriteStartAttribute("test", null); tw.WriteSurrogateCharEntity(lowChar, highChar); lowChar = Convert.ToChar(0xDC01); highChar = Convert.ToChar(0xD801); tw.WriteSurrogateCharEntity(lowChar, highChar); lowChar = Convert.ToChar(0xDFFF); highChar = Convert.ToChar(0xDBFF); tw.WriteSurrogateCharEntity(lowChar, highChar);  // Add 10 random surrogate pairs. // As Unicode, the high bytes are in lower // memory; for example, word 6A21 as 21 6A. // The high or low is in the logical sense. Random random = new Random(); for (int i = 0; i < 10; ++i) {       lowChar = Convert.ToChar(random.Next(0xDC00, 0xE000));       highChar = Convert.ToChar(random.Next(0xD800, 0xDC00));       charArray[i] = highChar;       charArray[++i] = lowChar; } tw.WriteChars(charArray, 0, charArray.Length);  for (int i = 0; i < 10; ++i) {       lowChar = Convert.ToChar(random.Next(0xDC00, 0xE000));       highChar = Convert.ToChar(random.Next(0xD800, 0xDC00));       tw.WriteSurrogateCharEntity(lowChar, highChar); }  tw.WriteEndAttribute(); tw.WriteEndElement(); tw.Flush(); tw.Close();  XmlTextReader r = new XmlTextReader("SurrogatePair.xml");  r.Read(); r.MoveToFirstAttribute(); targetFile = new FileStream("SurrogatePairFromReader.xml",        FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);  tw = new XmlTextWriter(targetFile, null); tw.Formatting = Formatting.Indented; tw.WriteStartElement("root"); tw.WriteStartAttribute("test", null); tw.WriteString(r.Value); tw.WriteEndAttribute(); tw.WriteEndElement(); tw.Flush(); tw.Close();  // Load both result files into the DOM and compare. XmlDocument doc1 = new XmlDocument(); XmlDocument doc2 = new XmlDocument(); doc1.Load("SurrogatePair.xml"); doc2.Load("SurrogatePairFromReader.xml"); if (doc1.InnerXml != doc2.InnerXml) {       Console.WriteLine("Surrogate Pair test case failed"); } 在使用 WriteChars 方法（一次写出一个缓冲区的数据）写出时，输入中的代理项对可能 会在一个缓冲区内被意外拆分。由于代理项值是定义完善的，如果 WriteChars 遇到来自 较低范围或者较高范围的 Unicode 值，它将该值标识为代理项对的一半。当遇到  WriteChars 将导致从拆分代理项对的缓冲区写入的情况时，将引发异常。使用   IsHighSurrogate 方法检查缓冲区是否以高代理项字符结束。如果缓冲区中的最后一个   字符不是高代理项，可以将该缓冲区传递给 WriteChars 方法。  请参见 概念 使用 XmlTextWriter 创建格式正确的 XML XmlTextWriter 的 XML 输出格式设置 XmlTextWriter 的命名空间功能  #endif

使用宋体方正超大字库？

尽管不了解具体代码，但是实践表明在windows上，别的字体的字库缺字的时候，一般都是用宋体补上的。 我猜应该是宋体字库最全，然后操作系统就把它作为兜底选项吧。


Question: 求大佬解答下大一学生的问题

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

或者说你得清楚，p，q，还有next这些东西都是指针，都是地址，结点的地址。 代码中就没有常规的结构体变量，也就是你说的“结点”。

你细看代码，p和q是在同一行声明的，类型一样，都是指针。 链表这种东西，它的结点是动态申请出来的，没有通常意义上的变量名，只能用指针指着它来使用。

引用 1 楼 user-3的回复:q是指向一块新开辟内存空间的指针哦，你对链表的概念还没领会透彻。 在图书馆翻阅书籍已经弄懂了，谢谢回答

q是指向一块新开辟内存空间的指针哦，你对链表的概念还没领会透彻。


Question: c语言基础如梦

供参考：#include "stdio.h" #include "math.h" int main(int argc, char* argv[]) {     int a[100][10],i,j,N,M,sum=0,str=0,l,q;      float b[100]={0},c[10]={0},p=0,f,s=0,k;      scanf("%d%d",&N,&M);      for(i=0;i<N;i++)         for(j=0;j<M;j++)             scanf("%d",&a[i][j]); //输入学生成绩      for(i=0;i<N;i++)     {         sum=0;         for(j=0;j<M;j++)    //for(j=0;j<M;i++)         {             sum += a[i][j];         }         b[i] = float(sum)/float(M);  //平均成绩         printf("%.1f ",b[i]);     }     printf("\n");          for(j=0;j<M;j++)     {         str=0;         for(i=0;i<N;i++)         {                          //scanf("%d",a[i][j]);             str+=a[i][j];         }         c[j] = float(str)/float(N);         printf("%.1f ",c[j]);     }     printf("\n");          k=float(a[0][0]);     for(i=0;i<N;i++)//for(i=1;i<M;i++)     {         for(j=0;j<M;j++)//for(j=0;j<N;j++)         {             if(a[i][j]>k)             {                 k=float(a[i][j]);                 l=i;                 q=j;             }         }     }     printf("%.1f %d %d",k,l+1,q+1);//printf("%.1f %d %d",k,l,q);                                 //break;     printf("\n");      for(i=0;i<N;i++)     {         s=s+b[i]*4;     }     f=s/float(N*M);     for(i=0;i<N;i++)     {         p = p+pow(b[i]-f,2);     }     p=p/float(N);     printf("%.1f\n",p);          return 0; }

引用 4 楼 user-2的回复:调试吧，看看执行到哪行的时候弹出的段错误。 不会调试

调试吧，看看执行到哪行的时候弹出的段错误。

引用 2 楼 user-2的回复:子曾经曰过，要规避段错误，就得从心所欲不逾矩。 你是猴子派来的逗比吗？，大佬别装萌新了，帮我看看具体哪错了？怎么改？

子曾经曰过，要规避段错误，就得从心所欲不逾矩。

段错误就是越界嘛。  或者野指针，哦，不指针啊，那这句不算。


Question: 键入数组值，却显示乱码，为什么？？？

乱码在哪里？

或许是断点断着呢 或许是没敲回车 或许是此m非彼m 或许是显示的一个代码，运行的另一个代码 或许是我没吃早饭造成的

第二张图错了，应该是这张。

图二是我给m数组赋的值，图一是我逐语句调试中的自动窗口监视的内容，我给m数组赋值123456789之后，监视的窗口显示的是“？？”（红色的部分）


Question: C程序。救救孩子。

引用 5 楼 user-2 的回复:嗯，我要是自己写，我也用宽字符，舒服。 但是这是我以前亲自感受过char数组的复杂麻烦的。 不感受一下印象不深啊。 用char数组至少还分gbk和utf8两种编码，麻烦。

抄我的作业。不懂就在百度搜，边搜边理解学习。

抄我的作业。不懂就在百度搜，边搜边理解学习。

引用 6 楼 赵4老师的回复:[quote=引用 5 楼 user-2 的回复:]嗯，我要是自己写，我也用宽字符，舒服。 但是这是我以前亲自感受过char数组的复杂麻烦的。 不感受一下印象不深啊。 用char数组至少还分gbk和utf8两种编码，麻烦。[/quote] 老师我搞定了！谢谢您哦。

你可以不必像四老师写得那么到位，你可以自己测试一下在你自己的平台上每个汉字的编码占用几个字节，然后自己写一个char数组版本的。


Question: 请问我这个代码哪错了，为什么输出的不对?

a[i]=b[i][j]这里a[i]要改成a[j].因为你现在计算的是j行的就低值.另外不知道你的行列是由i还是j表示,如果j是行.那你要改成a[j]=b[j][i]

把代码贴出来让大家参考修改不好吗

引用 1 楼 自信男孩的回复:*下面的第一行的循环后面缺少一个大括号呢，这个大括号要把紧接着第二个循环内也要扩在里面。根据自己的需求，看一下是否需要这么改 我加了但还是不对


Question: 节点的知识

引用 4 楼 赵4老师的回复:数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633 谢谢老师，明白了

先理清指针和链表

楼主的意思就是尾插法创建链表吧；   xxx *create_link() {     xxx *tail, *head;      head = (xxx *)malloc(sizeof(xxx));     if (!head)         exit(0);     tail  = head;      while ()     {         p = (xxx *)malloc(sizeof(xxx));         scanf(xxx);         tail->next = p;         tail = p;     }     tail->next = NULL;      return head; } 供参考～

你得先理清指针和结点的关系， 另外，这些概念来自哪里，哪里的旁边就有你需要的内容，以及其它。


Question: PAT 1025 反转链表 (25分)用C语言实现，请帮忙找找问题在哪里

引用 8 楼 forever74 的回复:毕竟题目只规定了K不大于N，没说K是0咋办。  要不你排除一下？毕竟做过分母的。题目说K和N都是正整数，所以不是这个问题哦，现在发现哪里错了，是没有对多余的数据进行排除，输入数据里有可能有不存在于链表中的杂数据。还是谢谢你啦

引用 7 楼 赵4老师 的回复:[quote=引用 6 楼 isunnyday 的回复:][quote=引用 5 楼 forever74的回复:]你的截图中的两个带圈的i难道没有透露一些信息？ 没有哦，点进去只说与答案不符，没有说哪里有误，也没有告诉我们测试数据具体是什么[/quote] 无非是在一些边界条件下你没满足呗。 比如： 空链表 只有一个节点的链表 99999个节点的链表 100000个节点的链表 …… [/quote]  引用 7 楼 赵4老师 的回复:[quote=引用 6 楼 isunnyday 的回复:][quote=引用 5 楼 forever74的回复:]你的截图中的两个带圈的i难道没有透露一些信息？ 没有哦，点进去只说与答案不符，没有说哪里有误，也没有告诉我们测试数据具体是什么[/quote] 无非是在一些边界条件下你没满足呗。 比如： 空链表 只有一个节点的链表 99999个节点的链表 100000个节点的链表 …… [/quote]现在知道哪里错了，没有对非链表的数据进行排除，输入数据里有可能存在多余的数据

引用 5 楼 forever74的回复:你的截图中的两个带圈的i难道没有透露一些信息？ 没有哦，点进去只说与答案不符，没有说哪里有误，也没有告诉我们测试数据具体是什么

你的截图中的两个带圈的i难道没有透露一些信息？

有人看看么

毕竟题目只规定了K不大于N，没说K是0咋办。  要不你排除一下？毕竟做过分母的。

引用 6 楼 isunnyday 的回复:[quote=引用 5 楼 forever74的回复:]你的截图中的两个带圈的i难道没有透露一些信息？ 没有哦，点进去只说与答案不符，没有说哪里有误，也没有告诉我们测试数据具体是什么[/quote] 无非是在一些边界条件下你没满足呗。 比如： 空链表 只有一个节点的链表 99999个节点的链表 100000个节点的链表 ……

引用 1 楼 赵4老师 的回复:数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633非常感谢教我用单链表排序的方法，我也去看看。另外，这个题目我是用结构体数组做的，能否帮忙检查上面的代码，谢谢呀


Question: 二维数组  c语言解决问题

int a[3][4] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11};     int i, j, sum = 0;     for (i = 0; i < 3; i++)     {         for (j = 0; j < 4; j++)         {             if (a[i][j] % 2 == 0)             {                 sum += a[i][j];                 printf("%d, %d\n", i , j);             }         }     }     printf("%d\n", sum);


Question: 能给解释解释ch2为什么是D吗？

那%c是输出字母吗？

ch2='A'+'6'-'3';      //  = 'A'+ 3个位置     = ABCD

常用字符的ASCII码是要求记忆的。具体来说，大写、小写字母及数字都是连续的，所以这题一看就明白了

格式化输出的原因，ch1是%d输出，是67吧，在字符映射表里面就是C，ch2是%c输出，所以就直接输出D了

把ASCII码取出来，做对应的相加减，再对应回去，就能理解了，注意十进制和十六进制的转换


Question: C语言中关于转换说明的疑惑

引用 5 楼 forever74的回复:[quote=引用 4 楼 西厢赏月 的回复:] 有没有%luo、%lux，%huo、%hux这几种形式？  Try it first, and throw your conclusion.[/quote] Thank you.

引用 4 楼 西厢赏月 的回复:[quote=引用 2 楼 赵4老师的回复:]//八进制、十六进制无符号短整型和长整型转换 #include <stdio.h> int main() {     unsigned short int usi;     unsigned long  int uli;      usi=0xFFFFu;     printf("%ho,%hx,%hu\n",usi,usi,usi);//177777,ffff,65535     uli=0xFFFFFFFFl;     printf("%o,%x,%u\n",uli,uli,uli);//37777777777,ffffffff,4294967295     return 0; }  有没有%luo、%lux，%huo、%hux这几种形式？[/quote] https://docs.microsoft.com/en-us/cpp/c-runtime-library/format-specification-syntax-printf-and-wprintf-functions?redirectedfrom=MSDN&view=msvc-160

引用 4 楼 西厢赏月 的回复:有没有%luo、%lux，%huo、%hux这几种形式？  Try it first, and throw your conclusion.

引用 2 楼 赵4老师的回复://八进制、十六进制无符号短整型和长整型转换 #include <stdio.h> int main() {     unsigned short int usi;     unsigned long  int uli;      usi=0xFFFFu;     printf("%ho,%hx,%hu\n",usi,usi,usi);//177777,ffff,65535     uli=0xFFFFFFFFl;     printf("%o,%x,%u\n",uli,uli,uli);//37777777777,ffffffff,4294967295     return 0; }  有没有%luo、%lux，%huo、%hux这几种形式？

C Integer Constants An “integer constant” is a decimal (base 10), octal (base 8), or hexadecimal (base 16) number that represents an integral value. Use integer constants to represent integer values that cannot be changed.  Syntax  integer-constant :  decimal-constant integer-suffix opt octal-constant integer-suffix opt hexadecimal-constant integer-suffix opt  decimal-constant :  nonzero-digit decimal-constant digit  octal-constant :  0 octal-constant octal-digit  hexadecimal-constant :  0x hexadecimal-digit 0X hexadecimal-digit hexadecimal-constant hexadecimal-digit  nonzero-digit : one of  1 2 3 4 5 6 7 8 9  octal-digit : one of  0 1 2 3 4 5 6 7  hexadecimal-digit : one of  0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F  integer-suffix :  unsigned-suffix long-suffix opt long-suffix unsigned-suffix opt   unsigned-suffix : one of  u U  long-suffix : one of  l L  64-bit integer-suffix :  i64  Integer constants are positive unless they are preceded by a minus sign (–). The minus sign is interpreted as the unary arithmetic negation operator. (See Unary Arithmetic Operators in Chapter 4 for information about this operator.)  If an integer constant begins with the letters 0x or 0X, it is hexadecimal. If it begins with the digit 0, it is octal. Otherwise, it is assumed to be decimal.   The following lines are equivalent:  0x1C   /* = Hexadecimal representation for decimal 28 */ 034    /* = Octal representation for decimal 28 */  No white-space characters can separate the digits of an integer constant. These examples show valid decimal, octal, and hexadecimal constants.   /* Decimal Constants */ 10 132 32179  /* Octal Constants */ 012 0204 076663  /* Hexadecimal Constants */ 0xa or 0xA 0x84 0x7dB3 or 0X7DB3

你这个问题问的本身就有问题（不管什么进制，内存都是二进制） int a=0377; //八进制，但是它到底还是个int int b=0x00ff; //16进制，但是它到底还是个int usigned int c = 255; //10进制，无符号int long long int d = 255; //10进制，有符号长整型 a和b你想怎么转换？都是int，值也一样。除非你转成字符串来表示，否则只是内存高低位截断的问题。


Question: 为什么少了注释的那句输出时就出错

引用 4 楼 Aa_1z 的回复:[quote=引用 2 楼 xws245925587的回复:]假设你的水壶只能倒5杯水，你现在倒完了，你不加点水，怎么继续倒啊 为什么要重复申请啊，每次输入都要申请一次，我又没释放这个p[/quote]  瞧，关键在于提问，你早说了这句话，大家就知道了你不晓得什么是链表，才好针对性地回答。 先了解一下链表，了解了以后就知道，这些都是套路，不走这些套路的就不是链表了。

你申请了一个内存节点,然后把它插入链表,然后把它改改又插入...最后所有节点都是同一个内存,所以数据全部相同.不用想也知道错了.

引用 2 楼 xws245925587的回复:假设你的水壶只能倒5杯水，你现在倒完了，你不加点水，怎么继续倒啊 为什么要重复申请啊，每次输入都要申请一次，我又没释放这个p

引用 2 楼 xws245925587 的回复:假设你的水壶只能倒5杯水，你现在倒完了，你不加点水，怎么继续倒啊 这相当于你要创建一个新的链表出来，你不得给他分配下内存呀

假设你的水壶只能倒5杯水，你现在倒完了，你不加点水，怎么继续倒啊

出什么错误？  创建链表，先申请节点，后插入链表中。


Question: 各位大佬大哥进来瞧瞧，帮小弟看一下作业呗

嗯，书中才有黄金屋，大哥可没有。  左移1位就是乘2，左移n位就是乘2的n次方，左移n-1位就是乘2的n-1次方。 所以分子是2的n次方减1，分母是2的n-1次方。

引用 1 楼 user-1的回复:printf("%d/%d\n",(1<<n)-1,1<<n-1); 我小白白一枚  (1<<n)-1,1<<n-1)这啥高端操作。。是左移吗？麻烦大哥解释一下

(1<<n)-1,1<<n-1  这是啥高端操作，是 我小白白一个


Question: 这个错误应该怎样修改

另外你那两个for根本不是在排序。 排序的话，内层的循环条件一定会引用外层的循环变量。

我是不是还需要写一个#include <memcopy.h>

字符串的赋值，需要借助strcmp/memcpy，不能直接赋值。看一下你的name是不是直接赋值了  没看到你的结构体定义，可能还有其他类型是char []类型，是不是也直接赋值了？！


Question: visual的c++配置

谢谢赵4老师

安装gcc


Question: 三门问题

求大神帮解一下吧


Question: 求助 同一个代码无法运行两次

引用 1 楼 user-2 的回复:就看while后边的分号，它刚才也不应该好使。 瞎了瞎了  谢谢!

#include <stdio.h> #include <stdlib.h>  typedef struct node {     int value;     struct node* next; }node;  int main(void) {      node* head = (node*)malloc(sizeof(node));     node* begin = head;     scanf_s("%d", &begin->value);     //while (begin->value != 0);     while (begin->value != 0)     {         begin->next = (node*)malloc(sizeof(node));         begin = begin->next;         scanf_s("%d", &begin->value);     }     begin->next = NULL;     begin = head;     while (begin != NULL) {         printf("%d", begin->value);         begin = begin->next;     }     return 0; } 供参考～

就看while后边的分号，它刚才也不应该好使。


Question: C语言求助

引用 2 楼 forever74的回复:你的i和输入的字母有啥关系？ for行末尾带分号意欲何为？ getchar竟然放在for上方，是一次就够的意思么？ 我那个i就是为了那个c+=25-2*i，其他两个的确错了啊，谢谢好人，

引用 1 楼 智者知已应修善业的回复:2i是什么？2*i 改过来了，谢谢


Question: 大佬求解   出错了  但我不知道为啥错了

谢谢  我参考你的建议  已经解决我的问题了   谢谢

函数是void类型的返回值，因此不能用L去接收函数的返回值。

#include<stdio.h> #include<stdlib.h>  #define sizemax   50  //void SeqList_creat(SeqList *&L,int array[],int n); //void SeqList_Bulle(SeqList *&L,int n); //void SeqList_output(SeqList *&L,int n); typedef struct {     int date[sizemax];     int length; }SeqList;  void SeqList_creat(SeqList *&L,int array[],int n); void SeqList_Bulle(SeqList *&L,int n); void SeqList_output(SeqList *&L,int n);  int main(){     SeqList *L=NULL;     int a[]={3,7,2,10,1};     //int n=5;     int n=sizeof(a)/sizeof(a[0]);     if (n > sizemax)         n = sizemax;     //L=SeqList_creat(L,a[],n);   //这行错了 但我不知道啥原因   [Error] expected primary-expression before ']'     SeqList_creat(L, a, n);   //这行错了 但我不知道啥原因   [Error] expected primary-expression before ']'     printf("排序前：\n");     SeqList_output(L,n);      return 0; }  void SeqList_creat(SeqList *&L,int array[],int n) {     int i=0;      L=(SeqList*)malloc(sizeof(SeqList));     for(i=0;i<n;i++)     {         L->date[i] = array[i];     }     L->length=n; }  void SeqList_Bulle(SeqList *&L,int n) {     int i,j,temp=0;     for(i=0;i<n-1;i++)         for(j=0;j<n-i-1;j++)         {             if(L->date[j]<L->date[j+1])             {                 temp=L->date[j];                 L->date[j]=L->date[j+1];                 L->date[j+1]=temp;             }         }  }  void SeqList_output(SeqList *&L,int n) {     int i;     printf("this list:\n");     for(i=0;i<n;i++)     {         printf("%d ",L->date[i]);     }     putchar(10); } 供参考～  数组名是数组的首地址；


Question: 求求大神给我解答一下该怎么用回溯实现，脑回路卡死了想不出来！！！

#include <vector> #include <iostream>  void BackTrackSubArrays(std::vector<char> &vecTemp, size_t &nCount, size_t nTotal, size_t nBegin, const std::vector<char> &vecArray) {     if (vecTemp.size() == nTotal)     {         ++nCount;         return;     }      for (size_t i = nBegin; i < vecArray.size(); i++)     {         vecTemp.push_back(vecArray[i]);         BackTrackSubArrays(vecTemp, nCount, nTotal, i + 1, vecArray);         vecTemp.pop_back();     } }  void SubArrays(const std::vector<char> &vecArray) {     std::vector<char> vecTemp;     vecTemp.reserve(vecArray.size());     size_t nCount = 0;     for (size_t i = 0; i <= vecArray.size(); i++)     {         BackTrackSubArrays(vecTemp, nCount, i, 0, vecArray);         std::cout << "长度为" << i << "的子集有：" << nCount << "个" << std::endl;         nCount = 0;     } }  int main() {     SubArrays({ 'A','D','F','Z','K','L','O' }); //此处用到c++11的初始化语法，如果编译器不支持c++11，请自己构造std::vector<char>输入     return 0; } //长度为0的子集有：1个 //长度为1的子集有：7个 //长度为2的子集有：21个 //长度为3的子集有：35个 //长度为4的子集有：35个 //长度为5的子集有：21个 //长度为6的子集有：7个 //长度为7的子集有：1个 //

#include <vector> #include <iostream>  void BackTrackSubArrays(std::vector<char> &vecTemp, size_t &nCount, size_t nTotal, size_t nBegin, const std::vector<char> &vecArray) { 	if (vecTemp.size() == nTotal) 	{ 		++nCount; 		return; 	}  	for (size_t i = nBegin; i < vecArray.size(); i++) 	{ 		vecTemp.push_back(vecArray[i]); 		BackTrackSubArrays(vecTemp, nCount, nTotal, i + 1, vecArray); 		vecTemp.pop_back(); 	} }  void SubArrays(const std::vector<char> &vecArray) { 	std::vector<char> vecTemp; 	vecTemp.reserve(vecArray.size()); 	size_t nCount = 0; 	for (size_t i = 0; i <= vecArray.size(); i++) 	{ 		BackTrackSubArrays(vecTemp, nCount, i, 0, vecArray); 		std::cout << "长度为" << i << "的子集有:" << nCount << "个" << std::endl; 		nCount = 0; 	} }  int main() { 	SubArrays({ 'A','D','F','Z','K','L','O' }); //此处用到c++11的初始化语法，如果编译器不支持c++11，请自己构造std::vector<char>输入 	system("pause"); 	return 0; }


Question: 萌新路过

引用 2 楼 再也不想做leader了！的回复:[quote=引用 1 楼 赵4老师的回复:]https://www.baidu.com/s?wd=DevC%E4%B8%8A%E5%86%99%E7%9A%84%E6%B8%B8%E6%88%8F%E5%8F%AF%E4%BB%A5%E5%9C%A8%E9%87%8C%E9%9D%A2%E6%B7%BB%E5%8A%A0%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90 人有多大胆，地有多大产。 填百度搜索框时，你敢啥都填，百度就敢啥都搜。  试了之后不行啊[/quote] 照搜索结果中一条试不行的话，就照下一条不一样的再试，直到行为止。

引用 1 楼 赵4老师的回复:https://www.baidu.com/s?wd=DevC%E4%B8%8A%E5%86%99%E7%9A%84%E6%B8%B8%E6%88%8F%E5%8F%AF%E4%BB%A5%E5%9C%A8%E9%87%8C%E9%9D%A2%E6%B7%BB%E5%8A%A0%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90 人有多大胆，地有多大产。 填百度搜索框时，你敢啥都填，百度就敢啥都搜。  试了之后不行啊


Question: 选择排序

分享别人的一个程序


Question: 关于指针的循环 小问题

A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

请参考《C++数组地址偏移》 希望能够帮到您！

引用 6 楼 赵4老师 的回复:[quote=引用 5 楼 ctrigger 的回复:][quote=引用 4 楼 赵4老师 的回复:][quote=引用 3 楼 ctrigger 的回复:]两段代码的for循环都没结束标志，都是错的。 你觉得*p1不是结束标志？[/quote] 我说的是题主，不是说你的。你回答是正确的。[/quote] 题主的问题不是出在没结束标志，而是没显式初始化第5个元素后面第6个元素对应的内存中的值，即使不声明第6个元素，程序越界去读第6个元素以及后面各元素时，照样会读第6个元素以及后面各元素对应的内存中的值，至于什么时候能碰到恰巧有0值，那就不一定了。[/quote] 不好意思，给分点错人了 sry

多谢各位解惑，总是忘记指针溢出，谢谢。

引用 3 楼 ctrigger 的回复:两段代码的for循环都没结束标志，都是错的。 你觉得*p1不是结束标志？

两段代码的for循环都没结束标志，都是错的。

#include <stdio.h> int main() {      int a1[6] = {1,2,3,4,5,0};     int* p1 = a1;     for (; *p1; p1++) {         printf("%d, 0x%p\n", *p1, p1);     }       char a2[6] = {'1','2','3','4','5','\0'};     char* p2 = a2;     for (; *p2; p2++) {         printf("%c, 0x%p\n", *p2, p2);     }      return 0; } //1, 0x0135FBE4 //2, 0x0135FBE8 //3, 0x0135FBEC //4, 0x0135FBF0 //5, 0x0135FBF4 //1, 0x0135FBFC //2, 0x0135FBFD //3, 0x0135FBFE //4, 0x0135FBFF //5, 0x0135FC00 //  其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

第一段代码输出只是巧合 你已经越界了 两段代码都是错的 都没有0结尾  循环检查0没意义

这不是小问题，溢出从来就不会是小问题哦。 对于用 *p 作为结束条件的，要让最后一个值为 0，以便结束循环 可以这样做： 第一个 int a[6] = {1,2,3,4,5,0} 第二个 char a[6] = {'1', '2', '3', '4', '5', '\0'}  还有，建议养成好习惯，指针用完后，给它赋值NULL 就是在代码最后加上一行 p = NULL    这样可以在很大程度是避免形成“野指针”

引用 5 楼 ctrigger 的回复:[quote=引用 4 楼 赵4老师 的回复:][quote=引用 3 楼 ctrigger 的回复:]两段代码的for循环都没结束标志，都是错的。 你觉得*p1不是结束标志？[/quote] 我说的是题主，不是说你的。你回答是正确的。[/quote] 题主的问题不是出在没结束标志，而是没显式初始化第5个元素后面第6个元素对应的内存中的值，即使不声明第6个元素，程序越界去读第6个元素以及后面各元素时，照样会读第6个元素以及后面各元素对应的内存中的值，至于什么时候能碰到恰巧有0值，那就不一定了。

引用 4 楼 赵4老师 的回复:[quote=引用 3 楼 ctrigger 的回复:]两段代码的for循环都没结束标志，都是错的。 你觉得*p1不是结束标志？[/quote] 我说的是题主，不是说你的。你回答是正确的。


Question: 用指针修改数组某一列

你没有发现跟书上比起来你的括号有点窄么？ 没有把*括进来，就是事故原因。

楼主的第二个循环用p=&a[0]是做什么？


Question: C语言程序:学生成绩管理系统

引用 1 楼 user-1的回复:主要用到的是结构体、数组、排序这些知识点，你看菜单选项对应调用的函数就知道用到哪些知识点了 谢谢你哟，


Question: 求大神指点

printf("3.成绩查询。\n);这里少了个双引号 printf("3.成绩查询。\n");

界面简单啊  void Menu() {     printf("------ 学生成绩管理系统 ------\n");     printf("1.成绩录入。\n");     printf("2.成绩输出。\n");     printf("3.成绩查询。\n);     printf("4.退出\n");     printf("输入选项："); }  在main函数中加入：  int main() {     int choice;     Menu();     scanf("%d", &choice);     switch(choice)     {         case 1:             //调用相应的函数             break;        case 2:             //调用相应的函数             break;         case 3:              //调用相应的函数             break;         case 4:             exit(0);             break;         default:             printf("输入选项错误，重新输入");             break;        } }  自己参照修改吧

引用 1 楼 user-1的回复:刚好有些闲时间，顺手写了下，供参考  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #define N 100  typedef struct student {     int ID;     char name[20];     double score; }Student;  //录入信息 void InputStudent(Student *stu, int n) {     int i;     for (i = 0; i < n; i++)     {         printf("输入第%d个学生的信息：\n", i + 1);         scanf("%d%s%lf", &stu[i].ID, stu[i].name, &stu[i].score);     } }  //计算总分 double TotalSocre(Student *stu, int n) {     double sum = 0.0;     int i;     for (i = 0; i < n; i++)     {         sum += stu[i].score;     }     return sum; }  //输出 void PrintStudent(Student *stu, int n) {     int i;     printf("学号\t姓名\t成绩\n");     for (i = 0; i < n; i++)     {         printf("%d\t%s\t%.2f\n", stu[i].ID, stu[i].name, stu[i].score);     } }  //排序 void SortStudent(Student *stu, int n) {     int i, j;     Student tmp = { 0 };     for (i = 0; i < n; i++)     {         for (j = 0; j < n - i - 1; j++)         {             if (stu[j].score < stu[j + 1].score)             {                 tmp = stu[j];                 stu[j] = stu[j + 1];                 stu[j + 1] = tmp;             }         }     } }  //按学号查询 void QueryScore(Student *stu, int n) {     int i, tmp;     printf("输入要查询的学号：\n");     scanf("%d", &tmp);     for (i = 0; i < n; i++)     {         if (stu[i].ID == tmp)         {             printf("学号\t姓名\t成绩\n");             printf("%d\t%s\t%.2f\n", stu[i].ID, stu[i].name, stu[i].score);             return;         }     }     printf("学号为%d的学生不存在！\n", tmp); }  int main() {     int n;     double sum, avge;     Student s[N] = { 0 };      printf("输入学生人数：\n");     scanf("%d", &n);     InputStudent(s, n);     sum = TotalSocre(s, n);     avge = sum / n;      printf("\n--------------------\n");     PrintStudent(s, n);     printf("\n--------------------\n");          printf("总分：%.2f  平均分：%.2f\n", sum, avge);      printf("\n--------------------\n");     SortStudent(s, n);     PrintStudent(s, n);     printf("\n--------------------\n");      QueryScore(s, n);  	system("pause"); 	return 0; }  大佬大佬，，要求有用户界面能帮我写写吗求求了


Question: C，求大佬教教！

且不说题干中“再加上”怎么理解； 单说浮点数不能用==进行比较，这是一个常识性的不该犯的错误。  哪怕用 int r=sqrt(n); if(r*r==n)... 之类的也行啊。

我是参考一楼写的小学生代码 #include<stdio.h> #include<math.h> #define N  999999 int main(){ 	int a; 	int i=0; 	for(i=0;i<N;i++) 	{ 			double m=sqrt(i+100); 	        double n=sqrt(i+168);         	if(m==(int)m)              if(n==(int)n) 	            printf("%d\n",i);	  	} 	 	return 0; }

引用 1 楼 user-3 的回复:供参考  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <math.h>  int isSquare(int n) {     double c = sqrt(n);     if (c == (int)c)         return 1;     else         return 0; }  int main() {     int i, n=9999;     for (i = 0; i < n; i++)     {         if (isSquare(i + 100) && isSquare(i + 168))             printf("%d\n", i);     }          	system("pause"); 	return 0; }     太棒了   解决了我思考的问题    if（c==（int）c）


Question: C语言怎么打开、读和写文件

为什么要选择C盘根目录这么敏感的地方呢？ 疑似权限不够。 找个别的盘符写着玩嘛。

引用 2 楼 weixin_52907368 的回复:[quote=引用 1 楼 自信男孩的回复:]把scanf放到fopen和判断fp之后呢，另外scanf也有问题，改成这样： scanf("%s", c); 试试吧，  打开文件失败可能跟scanf有关系，先调换位置，测试一下，再改一下scanf测试一下。 已经把scanf写到fp的判断之后了，但是直接就出来create file failed了，直接结束程序[/quote] 改scanf呢？

把谭浩强的书上的例子抄一遍，全会了。。

引用 1 楼 自信男孩的回复:把scanf放到fopen和判断fp之后呢，另外scanf也有问题，改成这样： scanf("%s", c); 试试吧，  打开文件失败可能跟scanf有关系，先调换位置，测试一下，再改一下scanf测试一下。 已经把scanf写到fp的判断之后了，但是直接就出来create file failed了，直接结束程序


Question: 一道难题，求帮助！

引用 1 楼 user-1的回复:作业还是自己完成好啊 但是是真不会呀，还要用四种方法。头都大了

作业还是自己完成好啊


Question: c语言中不使用全局变量？

传参，或者通过函数返回值得到。比如定义一个接口函数，用于获取模块内部的全局变量或者静态全局变量；

模块内部的全局变量内部定义，内部使用，用来实现该模块功能的中间值吧。

不好意思，忘记说了，用的stm32 单片机，ram有限，使用的lwoop框架，技术负责人说这样用的目的是方便他统一申请内存，不希望有全局变量或静态变量在编译的时候占用内存空间。

static 修饰的全局变量就是被限制在本文件的。


Question: c语言程序设计跪求大佬用c语言写

引用 1 楼 user-1 的回复：仅供参考： #include <stdio.h> #include <stdlib.h> #include <string.h>  int my_cmp(const void *a, const void *b) { 	char str1[10], str2[10]; 	sprintf(str1, "%d", *(int *)a); 	sprintf(str2, "%d", *(int *)b); 	return strcmp(str1, str2); }  int main(void) { 	FILE *fp; 	int a[20], n, i; 	 	/* 输入n的值 */ 	scanf("%d", &n); 	if(n > 20) 	{ 		printf("输入n <= 20\n"); 		return 1; 	} 	/* 输入n个整数 */ 	for(i = 0; i < n; i++) 	{ 		scanf("%d", &a[i]); 	} 	/* 快速排序 */ 	qsort(a, n, sizeof(int), my_cmp); 	/* 打开文件 */ 	fp = fopen("result.txt", "w"); 	if(fp == NULL) 	{ 		printf("打开文件失败\n"); 		return 1; 	} 	/* 输出结果 */ 	for(i = 0; i < n; i++) 	{ 		fprintf(fp, "%d", a[i]); 	} 	/* 关闭文件 */ 	fclose(fp); 	 	return 0; } 大一新生表示看的不是很懂[face]monkey2:019.png[/face][face]monkey2:019.png[/face]


Question: 计算边长是1到20时的正方形的周长，直到周长大于50为止

不会输出的，只会在外面循环

不会输出，写在外面c=80

如果if语句写到for循环外面，for循环执行完，c = 4 * 20 = 80;这时c<=50不成立，当然没有输出了啊

大佬们救救孩子吧


Question: 结构体

Cast direct:  user = *(struct config_type *)buf;