Question: 大佬求解，1—9分成一组三个三位数，且每组中数字不得重复，输出所有可能

所有可能有点多啊. 如果考虑顺序, 有 9! 大约36万种.

递归理解起来也很简单，就是你自己跟着代码去看，然后自己画一个栈，每执行一次递归就入栈一次，每一次递归的完成就相当于出栈一次，这样结合起来看就比较容易了，系统也是用递归工作栈去完成递归的运算的

可以参考我的一篇讲解全排列的帖子

#include<stdio.h> #include<string.h> #include<stdlib.h>  void swap(char *a,char *b) { 	char temp; 	temp = *a; 	*a = *b; 	*b = temp;	 }  void  Allarrange(char *str,int k,int len) { 	int i; 	if(k==len) 	{ 		static int s_i=1; 		//printf("第%d种排列为:\t%s\n",s_i++,str);     //全排列输出 		printf("第%d种排列为:\t",s_i++);                     //针对本题目进行的修改输出 		printf("%c%c%c	",str[0],str[1],str[2]); 		printf("%c%c%c	",str[3],str[4],str[5]); 		printf("%c%c%c\n",str[6],str[7],str[8]); 	} 	else 	{ 		for(i=k;i<=len;i++) 		{ 			swap(str+i,str+k); 			Allarrange(str,k+1,len); 			swap(str+i,str+k); 		} 	} } int main() { 	char str[10]={'1','2','3','4','5','6','7','8','9'}; 	Allarrange(str,0,strlen(str)-1); 	return 0; } 下图是运行结果，一共是9！次，也就是362 880组，每组里面有三个3位数。

看不懂啊啊啊啊啊啊啊啊啊啊啊啊啊

远离高数很多年

引用 4 楼 褐雨燕的回复:这其实就是个全排列的程序。（注意一下，全排列这东西，在小规模数据枚举法的圈圈儿里，还是有一定的出镜率的。） 它的作用就是输出一组数据（比如123456789）的所有排列可能。我最喜欢的写法是这样的，兄弟理解下： //****************************************************************************** // 全排列程序 //******************************************************************************  #define N 3  #include <stdio.h>  int d[N];  // 输出一下 void write() { 	int i; 	for(i=0; i<N; i++) 		printf("%d ", d[i]); 	printf("\n"); }  // 交换d[i]和d[j] void swap(int i, int j) { 	int t; 	t=d[i]; 	d[i]=d[j]; 	d[j]=t; }  // 它的作用是“得到d[k]~d[N-1]范围内的所有排列形式” int f(int k) { 	int i; 	if(k==N-1) // 只剩一个数了，没啥好排列的，输出即可 		write(); 	else 		for(i=k; i<N; i++) // d[k]~d[N-1]范围内，每个数都能当第一个 		{ 			swap(k, i); // 换到第一个 			f(k+1); // 剩下的递归运行 			swap(k, i); // 换回来 		} }  //****************************************************************************** // 主函数 //****************************************************************************** int main(int argc, char *argv[]) { 	int i; 	for(i=0; i<N; i++) 		d[i]=i+1; 	f(0); 	return 0; } 这个递归理解需要什么基础吗，这两天一直在看 像这种两个函数中间夹个递归函数的怎么运行的都没搞明白，汉诺塔那个也是，不过简单像fib数列倒是明白

STL里面不是有一个全排列函数吗

引用 2 楼 m0_46218308 的回复:算，那个全排列能解释下吗 学过数学的排列组合吗？没学过可以在网上搜索资料先学习理解 9个数子的全排列如下，就是每个位置放不同的数字就是一种排列 123456789 123456798 123456879 ... 132456789 132456798 132456879 ... ... 912345678 912345687 912345768 ... ... 987654321  找出9个数组的所有排列后，3个3个分段即可

引用 1 楼 user-9的回复:比如123和321算不算一组的相同情况？ 如果不算，可以1-9九个数字做全排列，然后前三个一组，中间三个一组，后三个一组，即可 如果算，那就在上面的基础上去掉重复的数据 算，那个全排列能解释下吗


Question: 麻烦各位大佬帮我看下这两段代码有啥不同吗

不科学!没人

我来拿分了！

引用 楼主 浮沉! 的回复:1、   /*输入一行字符，分别统计出其中英文字母、空格、数字和其它字符的个数。*/ #include<stdio.h> int main() {     int a,b,c,d;     a=b=c=d=0;     int arr;     while((arr=getchar())!='\n')     {         if((arr>='A'&&arr<='Z')||(arr>='a'&&arr<='z'))         {             a++;         }else if(arr==' ')         {             b++;         }else if(arr>'0'&&arr<'9')         {             c++;         }else          {             d++;         }     }     printf("%d %d %d %d ",a,b,c,d);     return 0; }   2、  #include<stdio.h> int main() {    int c, space ,number ,character , other;     space = number = character = other =0;     while( (c = getchar())!='\n')     {         if( c == ' ')         {             space++;         }         else if( c >='0'&& c <='9')         {             number++;         }         else if ( (c >='a' && c <= 'z') || ( c >= 'A' && c <= 'Z') )         {             character++;         }         else         {             other++;         }               }     printf("%d %d %d %d",character,space,number,other);     return 0; }    真的是恶心到我了 第二段在ACM上可以成功 第一段就答案错误  整的我快自闭了   第一段里面 else if( c >'0'&& c <'9')    //数字0h和9不会计算到数字，而是计算到其他字符哦 第二段里面 else if( c >='0'&& c <='9')

送分了  来个人回复下 我结贴

找到错误了


Question: 这段代码中如果没有exit（EXIT_FAILURE）和return 0会发生什么？

引用 3 楼 自信男孩 的回复：fclose(fp);会执行失败，没有其他问题。stderr和stdout有什么不同吗？

fclose(fp);会执行失败，没有其他问题。

引用 1 楼 user-2 的回复：第一个地方，就是错误在stdout中输出了 第二个地方如果去掉，代码会往后执行，执行到fclose的地方会出错，由于文件对象为空。 去掉第三个地方，编译会出错，没有返回值值1错误在stdout输出，那岂不是stderr和stdout都一样吗？ 2我删去之后再编译，为什么没有问题？ 3这个我懂了


Question: c语言问题求解

scanf("%s %s %s",webs[i].abbr,webs[i].name,webs[i].URL); getchar(); //这里加一句清空输入缓存的回车换行符 scanf("%s",abbr);

哦哦,忘记说了,不过我刚刚已经找到错误了,谢谢哦!

引用 1 楼 user-2 的回复:我也不知道你哪儿错了  你的错误是什么 你的代码想干什么  让我猜的好难  你期待输出什么 实际输出什么？你提问题的时候好歹说一下啊

我也不知道你哪儿错了  你的错误是什么 你的代码想干什么  让我猜的好难


Question: 大佬帮忙看看

第二个%s是字符串，不是format标记

prinnf里面第一个%s是输出格式，输出的内容就是后面的一句话呀"%s ！C is cool"


Question: 有向无环图最长路径，自己运行可以，提交OJ为Wrong Anwser，向各位大佬求教！

（同题问答指路 谢谢大家！https://ask.csdn.net/questions/1068522）


Question: 中缀表达式转后缀表达式 不知道代码哪里出现问题 请大佬指出

谢谢您的提醒。

这种提问方式很难得到回答，没有说明什么错误，也没有提供其他信息


Question: c语言请教大佬

*p=a[j];  p是个野指针

#include <stdio.h>  int main(void) {     int a[10],b[10],i,j,  *p;      tmp = a[0];     for(i=0;i<10;i++)         scanf("%d",&a[i]);      for(i=0;i<10;i++)     {         for(j=0;j<10-i-1;j++)         {             if(a[j]>a[j+1])                 //*p = a[j];                 p = &a[j];             else                 //*p = a[j+1];                 p = &a[j+1];         }         b[i] = *p;     }     for(i=0;i<10;i++)         printf("%d",b[i]);     return 0; } 供参考～ 代码还有问题，最小的值没有放到b中。

这种思路有问题，每次选中的值应该在下一次循环前删除。所以还是用冒牌排序吧

你可以用冒泡排序或者选择排序

你这思路也有些问题，如果第一个数值就是最大的，但你总是从第一个开始找，选中后，你也没有排除

int p;变量就够了，不用指针，用指针的话你初始化为谁呢，不管是ａ还是ｂ都会改变数组的值


Question: 大佬帮帮我吧

一楼说的是对的，你可能没理解。 关键是：输入字符后，按下“Enter”键，这个“Enter”键字符可被 getchar() 获取         在初始选择时，输入“1”，并按下“Enter”键，这时字符‘1’被scanf()获取，而缓冲区内存在“Enter”字符，它可以被getchar()获取，所以在输入完1后，进入 void createBitree() 创建二叉树，函数开头调用getchar()获取字符，这时“Enter”字符被获取到，则二叉树的根为“Enter”字符；        接着执行下面 else 中的第一个 void createBitree() 创建左二叉树分支，输入‘A’，按下“Enter”，该左分支的值为‘A’，“Enter”字符，仍被 getchar() 获取继续创建该分支下的左二叉树分支；        按下的“Enter”字符，作为该左分支的值，下面继续递归执行 else 中的第一个 void createBitree() 创建左二叉树分支，这时输入‘#’，按下“Enter”，则该左分支结束，执行下面的 void createBitree() 创建右二叉树分支；        按下的“Enter”字符，作为该右分支的值，下面继续递归执行 else 中的第一个 void createBitree() 创建左二叉树分支，这时输入‘#’，按下“Enter”，则该左分支结束，执行下面的 void createBitree() 创建右二叉树分支； ...... 如此反复递归，不会结束，这也是为什么会连续输出两次“please enter”，你可以在 void createBitree() 中加入一个参数，表示当前创建的是左分支还是右分支，并把它输出来看一下就清楚了                                        Enter                                      /                                    A                                   /                               Enter                               /    \                             #     Enter                                    /    \                                   #    Enter                                         /   \                                       #     Enter                                               ......  解决方法： 在 void createBitree() 中的 ch = getchar(); 前再调用一次 getchar(); 过滤掉“Enter”字符。

你第一步给s赋值，你输入1程序的运行权就交给了创建二叉树函数，你会敲回车结束给s赋值，转过来创建二叉树，getchar会把你的回车也当做一个字符赋给ch，空格就变成了二叉树的根了

我现在加了printf，但是输出后退不出来，好像不是你说的那个问题


Question: 我想比较日期跟时间，我的这个冒泡排序法红色勾的地方怎么改，写的是结构体。

引用 楼主 芒果干。。的回复:具体看图吧，电脑的思维太难搞了。 图忘记发了，后面我又写了一条一样的帖子。


Question: mcisendstring用法

打上:#include<mmsystem.h>#pragma comment(lib,"winmm.lib")

包含头文件啊


Question: 求大佬帮忙

scanf("%d",num);这里错了，会crash 改成scanf("%d",&num);


Question: 哈夫曼树编码函数出现“已触发一个端点”的错误

你的问题解决了吗？我的问题和你的一模一样

引用 1 楼 user-2 的回复:hc[p]越界了，p越界 越界了吗，我检查了没有呀？？？？

hc[p]越界了，p越界


Question: 我想在主函数里调用下面的子函数，应该怎么改？

不明白要问什么问题 fun(A4,13);这不是调用子函数吗


Question: C语言结构体题目

已解决，多谢

scanf("%s\t%s\t%lf\t%lf\t%lf",stu[i].xh,stu[i].xm,&stu[i].yw,&stu[i].sx,&stu[i].yy); 把里面的\t全去掉，屏幕输入时用空格分开就行了，%lf直接%f  scanf("%s%s%f%f%f",stu[i].xh,stu[i].xm,&stu[i].yw,&stu[i].sx,&stu[i].yy);


Question: vs2017 printf_s函数出问题了。。。。

scanf_s用%c，%s时要指定长度，也就是要多一个长度参数 即改成 scanf_s("%c", &G->v[i], 1); //多一个长度参数，1表示1个字符

使用scanf_s输入%c会有问题，好像是要加个什么参数 可以把编译器的SDL检查关了，直接用scanf 项目属性——C/C++——SDL检查——否


Question: 求大佬帮忙呀

指针没标明指向时是不是都指向NULL，他的base和sq也是指向NULL

s->sq是不是每次往后移4个字节

s->base=(int*)malloc(sizeof(int)*n); 这一句可以解读为：分配n个int大小的空间，且把空间的首地址赋值给s->base，的确s->base之前是NULL，但这里是赋值。 s->sp - s->base==s->size s->sp是栈顶指针，指向的其实是栈顶的下一个位置，栈顶指针-栈首指针如果==你分配的空间大小，说明栈已满，不能再添加元素了  *s->sp++=val;可以拆分为 *s->sp=val;     将值赋值到栈顶 s->sp++;        栈顶指针往后移


Question: 我的这个是有编译错误吗？

这是什么语言的语法，不是C语言吧～


Question: 关于快速排序的鬼畜问题

你用的是递归来实现快排。试试非递归实现

楼上说的递归是其中一个原因，调用函数需要的代价比较大。 但是，关键原因是，排40个数字你看不出快排的价值，要看速度，你得至少排40万个数据啊……去排40万个数据，再对比一下耗时，感受一下差距……

这。。。就触及到我的知识盲区了。。


Question: 二维数组

ｓｃａｎｆ的本质是将数据写入变量的地址，二位数组分行和列，这里地址是可以分开的，str[0][0]是０行０列的地址的值，[]的作用可以理解为*取值，ｓｔｒ[ｉ]就是取第ｉ行，又因为还有列，而列为空，就没有继续取值，str[ｉ]就是ｉ行首地址。数组取值是先找行，找到对应行的首地址，再从那个地址范围去找列，行列结合定位一个值

既然是二维数组，那么就是存在行和列。每行即str[i]，每行都有20个字节，那不相当于有多个char str[20]？ 可以对比一维数组来理解这个问题～

字符串二维数组你可以这样理解，这个数组保存了5个字符串。

二维数组是一维数组的数组。就是二维数组也就是一个数组，也可以按正常数组来操作，区别在于它的每一个元素又是一个一维数组。  char str[5][20] c风格字符串数组。 str表示字符串数组；str[i] 表示第i个字符串，实际为字符串指针； str[i][j] 表示第i个字符串第j个字符。

二维数组有分行和列，可以这样表示


Question: C程序调试中断处理方法

引用 5 楼 自信男孩的回复:scanf_s是VS需要的函数，相比scanf是安全性高，但是需要注意对于%c， %s需要指定长度，这也是scanf_s和scanf的其中一些区别之处 我明白了，三克油

引用 3 楼 5250的回复:用scanf不好吗 VS会报错的

用scanf不好吗

引用 1 楼 前行者001的回复:scanf_s()用于读取字符串时，必须提供一个数字以表明最多读取多少位字符，以防止溢出。 scanf_s("%s",buf,5)；//表示最多读取4个字符，因为buf[4]要放'\0' 我这样改过显示错误


Question: 这个程序为何半天不出结果啊，哪位大神能帮忙看一下

这个程序，如果我只是简单的以初始状态为基础移动若干步作为最终状态的话还是能出结果的，但现在这个最终状态就不行，为什么啊


Question: 小白求救！！为什么用数组求极值以及他们人名的时候，人名是一样的

//#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <string.h> #include "StdAfx.h" // #define N 45 typedef struct _STU{  //结构体头，前面两个是关键字，后面的是结构体名     int iNum;          //学号, 8位数字，如果学号中有字母，则需要定义成什么类型？ 要定义成字符串，长度要适合     char szName[20];      //姓名，最长19个字符，9个汉字，原因是一个汉字占两位相当于两个英文字符     unsigned char sex;      //性别，0代表女生，1代表男生     unsigned char ucAge;      //年龄，范围0-255，一般年龄不设置变量，而是设置成出生年月，     float  fScore[20];        //20门课的成绩     float  fScoreTotal;      //总分     int    iCnt;          //课程数 }ST_STU;              //这个是一个结构体变量名，通常在声明中，结构体名和结构体变量名都使用大写  int _tmain(int argc, _TCHAR* argv[]) //int main(int argc, char* argv[]) {     ST_STU stLd;     ST_STU stRg[N];     int n, iCnt;     int i,j,m,k;     float fMax, fMin, fAvg, fTotal;     while(1){         printf("请输入软件1901班的人数(1-%d之间)和课程表(1-20之间)，用空格隔开:",N);         scanf("%d%d",&n,&iCnt);         if(n < 1 || n> N ||iCnt < 1|| iCnt> 20 ){             printf("输入值有误，请重新输入！！！\n");         }else break;     }     for(i = 0; i < n;i++){         printf("请输入%d号学生的学号、姓名、性别(0:女生，1:男生）、年龄，并使用空格分开", i+1);         //scanf("%d %s %d %d", &stRg[i].iNum, stRg[i].szName, &stRg[i].sex, &stRg[i].ucAge );         scanf("%d %s %d %d", &stRg[i].iNum, stRg[i].szName, &stRg[i].sex, &stRg[i].ucAge );         stRg[i].iCnt = iCnt;    //结构体内部的成员变量名，可以和外部的变量名相同，因为他们处于不同的级别         for( j = 0, stRg[i].fScoreTotal = 0; j < iCnt; j++){             printf("请输入%s同学的第%d门课的成绩", stRg[i].szName, j+1);             scanf("%f",&stRg[i].fScore[j]);             stRg[i].fScoreTotal +=stRg[i].fScore[j];         }     }     //m=k=1;     //for( fMax =stRg[0].fScoreTotal,fMin = stRg[0].fScoreTotal,fTotal = stRg[0].fScoreTotal, i = 1;i < n;i++){      fMax =stRg[0].fScoreTotal,fMin = stRg[0].fScoreTotal,fTotal = stRg[0].fScoreTotal;      m = k = 0;    //初始化应该为0,因为用的是stRg[0]      for( i = 1;i < n;i++){         if( fMax < stRg[i].fScoreTotal){             fMax = stRg[i].fScoreTotal;             k = i;         }          if( fMin > stRg[i].fScoreTotal){             fMin = stRg[i].fScoreTotal;             m = i;         }          fTotal += stRg[i].fScoreTotal;     }     fAvg = fTotal/n;     printf("软工班的最高分是：%s %.1f分\n", stRg[k].szName, fMax );     printf("软工班的最低分是：%s %.1f分\n", stRg[m].szName, fMin );     printf("软工班的平均分是：%.1f分\n", fAvg);     getchar();getchar();getchar();getchar();getchar(); } 供参考～ 注意k和m的初始化需要注意下。

发代码格式多好，这样直接粘贴来的看的头痛。fmax和fmin写在循环外面吧，为啥要写在for()里呢。


Question: 关于树的程序，这个程序显示没有错误，怎么输入各个值跑出结果

这个程序写的有问题，不过你要想运行查看结果的话，可以输入这样的字符串然后按回车 12####### 要有时间的话，可以帮你改改


Question: 请问这里我知道错误原因，因为输入工作时间的回车被读入了，但是为什么第二次的b在按下回车以后读入不进去，还是回复sorry呢,按照字符流不是应该读到b么

#include <stdio.h> #include <ctype.h> #define TIME 40 #define M 1.5          //翻1.5倍 #define MONEY_1 300 #define MONEY_2 450 #define TAX_1 0.15 #define TAX_2 0.20 #define TAX_3 0.25 #define B1 8.75 #define B2 9.33 #define B3 10.00 #define B4 11.20  char get_first(void); char get_option(void); void money(double B);  int main(void) {     char option;      printf("请选择您的工资等级:\n");     printf("a)$8.75/hr\tb)$9.33/hr\nc)$10.00/hr\td)$11.20/hr\nq)quit\n");     while((option=get_option())!='q')     {         switch(option)         {             case 'a':                 money(B1);                 break;             case 'b':                 money(B2);                 break;             case 'c':                 money(B3);                 break;             case 'd':                 money(B4);                 break;         }         getchar();    //for '\n'     } }  char get_first(void) {     char ch;      ch=getchar();     while(isblank(ch))     {         ch=getchar();                       //如果是空白就继续读取，遇到第一个非空白字符不进入循环     }     while(getchar()!='\n')     {         continue;     }      return ch; }  char get_option(void) {     char ch;      ch=get_first();      while((ch<'a'||ch>'d')&&ch!='q')     {         //printf("Srooy, I can not understand it, please respond with a, b, c, d, or q\n");         printf("Sorry, I can not understand it, please respond with a, b, c, d, or q\n");         ch=get_first();     }      return ch; }  void money(double B) {     float hour;     float income;     float r_income;     float tax;     float BASE;      BASE=B;     printf("请输入一周工作时间:");     scanf("%f",&hour);     // fflush(stdin);                          //这里要清除缓存，不然输入工作小时的回车会被放入缓存，在下次循环中，enter已经读取，由于只有一个字符，ch的值就是enter，因此,在get_option中，反复出现sorry     if(hour<=TIME)     {         income=hour*BASE;         if(income<=MONEY_1)         {             tax=income*TAX_1;         }         else if(income<=MONEY_2)         {             tax=MONEY_1*TAX_1+(income-MONEY_1)*TAX_2;         }         else         {             tax=MONEY_1*TAX_1+(MONEY_2-MONEY_1)*TAX_2+(income-MONEY_2)*TAX_3;         }     }     else     {         income=M*hour*BASE;         if(income<=MONEY_1)         {             tax=income*TAX_1;         }         else if(income<=MONEY_2)         {             tax=MONEY_1*TAX_1+(income-MONEY_1)*TAX_2;         }         else         {             tax=MONEY_1*TAX_1+(MONEY_2-MONEY_1)*TAX_2+(income-MONEY_2)*TAX_3;         }     }     r_income=income-tax;     printf("总工资为%f,税收为%f,净收入为%f\n",income,tax,r_income);     printf("\n");     printf("请选择您的工资等级:\n");     printf("a)$8.75/hr\tb)$9.33/hr\nc)$10.00/hr\td)$11.20/hr\nq)quit\n"); }  供参考～  加一句getchar();

按照字符流，先输入了a Enter,然后因为get_first，回车也就没问题了，但是在输入工作时间的时候，如果不清除缓存，回车会被送入get_option的ch,所以输出sorry，但是后面输入的b，按照道理应该在排队，然后就应该到b了，就不该还是出现sorry了，为什么这里还是出现sorry呢？


Question: 求助大佬，用C语言写，十分感谢

引用 1 楼 user-5 的回复:虽然我不是大佬，但是估计你心目中的大佬就是免费的劳力，不知道管理员看见这种贴子为什么不直接删除，看的我没心情来CSDN转了，没看新闻当个网络作家都要签卖身合约了，还不醒醒 无力吐槽！！！  所以我一般回帖最多讲思路，还是不懂给伪代码。 csdn上太多那种注册一个号，就上来要源码要方案甚至要项目工程的。鸟都不想鸟。感觉csdn还是应该管管了

谢谢各位，我已经写完了

楼上脾气是真的好！

int get_hash_code(char arr[],int n) {     int v_ret = 0;     while(*arr)     {      } }

写了一点，剩下的自己完成。  struct node{    char name[16]; // 姓名    int hash_code; // hash值    int index; // 数组上的位置 用hash值对数组长度求余数    struct node* next; // 相同hash值的下一个节点 };


Question: 关于C语言中一个项目中有多个源文件怎么运行

没有函数原型声明

用extern声明将max函数的作用域扩展到main()中去，比如 extern int max(int a, int b);

没有写头文件.h呀

你要确保有 max.h 文件。 然后把max函数声明  放进这个头文件里。或者不用头文件， 在主函数上面加 extern int max(int a, int b);

追加一个max.h文件，文件的内容为 int max(int, int);  或者把main.c的#include "max.h"去掉，改成 extern int main(int, int);

有两种改法，  第一种，将#include"max.h"改成#include"max.c" 第二种，重新创建一个max.h的头文件，然后把max函数放到头文件中  你出现无法识别的原因是在于你没有max.h的头文件。只有max.c文件。


Question: 请教如何将TC2汉字库中不存在的汉字存储到汉字库里

TC2是DOS下的16位编译器，hzk16类似UCDOS、CCDOS 2.13汉字系统里的点阵字库，都是写死了的。可以参考UCDOS的自造字系统，是矢量字库，很棒。  这个文物级别的环境，太怀旧了，1997年TC2写过UCDOS的模拟显示+超大字体，早就忘记了，代码也没有留下来。如果是为了学习，还是换现代工具链吧。如果是为了兼容控制台，可以参考银行系统的Unix环境。现在的TC2估计不靠虚拟机都跑不起来吧

过时了吧，两半半个汉字。

引用 楼主 qq_45869858 的回复:请教如何将TC2汉字库中不存在的汉字存储到汉字库里 换个字库就解决了，要添加字库，了解一下字库的格式定义，和编码，以及点阵数据，添加进去就可以了。

那个库没有开发API和开发 文档吗？


Question: 生产者和消费者问题

我用vsc++写的，我的程序运行结果是这样的


Question: c语言请教大佬

应该是while((*s1++=*s2++)!='\0'); 少了一个 '!'。 用于字符复制，s1,s2分别表示两个字符串的指针，*s1++ = *s2++ 表示将*s2的值复制到*s1中，然后将s2,s1各自向后移动一个字节单位，当*s2中的值不为 '\0'字符串结束符时，一直执行循环进行赋值运算。否侧循环结束，赋值结束。

运行一下就知道了， 那里写错了， 应该是 ！=‘\0’

字符串最后默认以\0结尾，它的意思就是复制到\0才结束


Question: 全部用动态内存来完成冒泡排序，求助大佬这是哪出了问题

引用 1 楼 user-1 的回复:数组才用动态内存分配， int *number=(int *)malloc(4);   int *change=(int *)malloc(4);   这个两个直接用 int number; int change就行了，简单的int变量没必要，把自己都搞晕了 当数组无法定长的时候，用动态内存分配。  int number, change; printf("请输入数字的个数  "); scanf("%d",&number); data=(int *)malloc(sizeof(int)*number); 这样不是很清晰吗我只是想多用下这方面知识，好巩固下


Question: vs编码问题+c和mysql连接乱码问题【网上方法基本全部试过】

引用 6 楼 smwhotjay 的回复:[quote=引用 5 楼 胡二多 Hodor 的回复:] [quote=引用 3 楼 smwhotjay 的回复:] .. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8能不能把mysql转换成gbk的，这样就不要转码了额[/quote] 要么mysql统一gbk.万事大吉。vs不必转码。[/quote] 刚刚按您说的全都改成了gbk试了一试，发现汉字最后一个是乱码额，而且插入数据库如果插入的是汉字插不进去这怎么办呃呃

引用 5 楼 胡二多 Hodor 的回复:[quote=引用 3 楼 smwhotjay 的回复:] .. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8能不能把mysql转换成gbk的，这样就不要转码了额[/quote] 要么mysql统一gbk.万事大吉。vs不必转码。

引用 3 楼 smwhotjay 的回复:.. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8能不能把mysql转换成gbk的，这样就不要转码了额

引用 3 楼 smwhotjay 的回复:.. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8好的好的，我大体明白了额，但是我在mysql给c的官网api上没看到相关的转码函数额，这个具体操作能简单说一下吗

引用 1 楼 user-2 的回复:不用搞这么复杂，你在把上传的字符串转为utf8就可以了， 下载之后转为gbk,你要改控制台的编码和你的vs文档是什么格式的一点关系没有，右键控制台属性，可以看到你的代码页设定是不是成功设为utf8了能具体举个例子吗，还是没太理解呃呃


Question: 请问各位大佬，关于树的程序，这两个错误怎么改

你的栈底指针和栈顶指针存放的是二叉树结点类型的指针不是char型的而是BiTree类型的

你的树 T也没有定义。C语言中先定义后使用。

你的栈 S没有定义，就是说你在使用S之前需要先定义它。


Question: 关于C语言读取文件时编码的问题

引用 4 楼 smwhotjay 的回复: txt 有个两字节头的标记的是unicode. ansi/ utf8没有。 utf8的BOM 可选的，0xEF,0xBB,0xBF

txt 有个两字节头的标记的是unicode. ansi/ utf8没有。

我试过了，还是一样的

楼主fread是二进制读取，你在开文件的时候将"r"改成"rb" 和"w"改成"wb"试试


Question: PAT 1075 PAT Judge最后一个测试点死活都不过去

感谢提醒，这里确实没有注意到。但是更改了之后最后一个测试点还是未通过  else if ( record[id] == 2 ) {			//若该用户状态为提交过编译但均失败  			if ( score == -1 )					//如果这次提交也编译失败  			{ 				stu[id].score[no-1] = -2;		//则本次提交打上编译失败的标记  			} 			else {								//如果这次提交成功了(编译通过)  				for ( k=0; k<p_num; ++k )		//将之前所有被打上编译失败的题目均置为0分  					if ( stu[id].score[k] == -2 ) 						stu[id].score[k] == 0; 				table[++cnt] = id;				//在table表上记录该用户  				record[id] = 1;					//该用户状态置为需要显示的  				if ( full_score[no-1] == score )//若满分则满分数加一  					++stu[id].full; 				stu[id].total = score;			//总分置为此次提交的分数  				stu[id].score[no-1] = score;	//该题分数更新  			} 		}

引用 3 楼 Xavier_97 的回复：感谢回答！但是我的代码中确实加入了这个判断， 如果重复提交满分的话，那么这次分数不会大于上次的分数，也就不会做stu.full自增的操作，所以我感觉不是这里出了问题。  if ( score > stu[id].score[no-1] )  //如果这次分数大于上次的分数              {                 if ( stu[id].score[no-1] == -1 )//若该题从未编译过，直接将分数改为0                      stu[id].score[no-1] = 0;                 stu[id].total += (score-stu[id].score[no-1]);//总分加等于这次提交分数减掉原来分数                  stu[id].score[no-1] = score;    //该题成绩更改                  if ( full_score[no-1] == score )//若满分则满分数加一                      ++stu[id].full;if（....==2）的分支里没有满分的判断，stu.full没有增加。

提示已经很清楚“最大化随机测试，重复提交满分题目”。 因为你代码以stu.full作为排序比较，由于满分则增加stu.full，看提示后半句去输入数据，则导致排序不正确。


Question: 求助！这段程序哪里错了！！写一个函数，用“起泡法”对输入的10个整数按从小到大顺序排列。

sort(a);  即可

sort(a[10]);这句有问题，函数调用，参数传递是值传递，a[10]是一个元素的值，不过10是下表，（根据数组a的长度是10，下表只能是[0, 9]，所以a[10]数组越界），数组名是数组的首地址，因此应该是传a而不是a[10]

需要传的是指针，而你传了一个值进去

谢谢大佬们！懂了

调用的地方如LS所说，sort(a)即可 另外，sort函数最好加个参数指定数组的长度，当然本例中固定长度是10没问题，只是传数组的时候数组会退化为指针，在函数内你就取不到数组长度了，所以最好还是加个指定数组长度的参数

调用的时候，传入  a  就行  sort(a);


Question: 表达式必须是指向完整对象类型的指针

把 struct stdent *ps;     struct student s[3]={   //数组赋初值         {101,"张山",'男',18},         {102,"李四",'男',19},         {103,"孙俪",'女',17}     }; 改成 struct student s[3]={   //数组赋初值         {101,"张山",'男',18},         {102,"李四",'男',19},         {103,"孙俪",'女',17}     }; struct stdent *ps = s; //指针要初始化，让它指向一片内存地址才能使用

你好，请问这是什么意思 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(147,5): error MSB6006: “CL.exe”已退出，代码为 2。

代码呢?

#include<stdio.h> #include<stdlib.h>  struct student{     int id;//学号     char name[20];//姓名     char sex[3];//性别     int age;//年龄 };  int main() {     int i;     //struct stdent *ps;     struct student s[3]={   //数组赋初值         {101,"张山","男",18},         {102,"李四","男",19},         {103,"孙俪","女",17}     };     for(i-0;i<3;i++)    //采用数组访问形式     printf("%d\t %s\t %s\t %d\n",s[i].id,s[i].name,s[i].sex,s[i].age);      system("pause");     return 0; }

单词拼写错误 struct stdent *ps; 改成 struct student *ps;

C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(147,5): error MSB6006: “CL.exe”已退出，代码为 2。 只有这一个错误

在下面赋值，和在定义时赋值都是出现这个问题 表达式必须是指向完整对象类型的指针

不好意思，打错了

for(i-0;i<3;i++) ==>>这里是打错了吗 i=0


Question: VS2012在c语言代码里怎么使用音乐相对路径

你使用的是相对路径

引用 5 楼 陈仲甫 的回复:试试在虚拟机上模拟他的环境，看是否不同的外部环境引起的。好的谢谢！

试试在虚拟机上模拟他的环境，看是否不同的外部环境引起的。

引用 2 楼 user-2 的回复:你现在使用的就是相对路径，但要保证在程序文件夹内有这个怪兽.wav是的我在文件夹里放了的！我在自己的电脑上打开是可以正常播放的，但我把整个文件夹发送到别的电脑上，打开来却只有电脑系统提示音一直在循环

引用 1 楼 陈仲甫 的回复:你使用的是相对路径这样的吗！可是好奇怪我把整个文件夹（包含音频文件）发到另一台电脑上，打开exe文件播放的一直是系统的提示音TAT

你现在使用的就是相对路径，但要保证在程序文件夹内有这个怪兽.wav


Question: 求助   数据结构  单链表

引用 5 楼 慕小北的回复:[quote=引用 2 楼 qybao的回复:]函数怎么调用的？L在哪赋值？IniLinkList(L)的代码没问题吗？ 另外提一下，如果想让r=L; 那么这句代码的前一条代码 r=(DogNode*)malloc(sizeof(DogNode))就是多余，还造成内存泄漏 其他都没题应该，我都测试过，我把代码放评论区了[/quote] 哦哦，我知道问题了，应该吧这个初始化删掉，因为前面初始化过了，谢谢哦！

引用 2 楼 qybao的回复:函数怎么调用的？L在哪赋值？IniLinkList(L)的代码没问题吗？ 另外提一下，如果想让r=L; 那么这句代码的前一条代码 r=(DogNode*)malloc(sizeof(DogNode))就是多余，还造成内存泄漏 其他都没题应该，我都测试过，我把代码放评论区了

引用 1 楼 自信男孩的回复:建议直接贴代码，然后提供更多的代码，包括调用的。  看函数开头，给r申请空间，然后马上r = L;这样会导致内存泄露，因为r刚才申请的空间没办法释放了，找不到地址了。 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Dog { 	char name[10]; 	int id; }Dog;  typedef struct DogNode { 	Dog dog;  	struct DogNode *next;	 }DogNode,*DogLinkList; /* 注意: 1.结点指针和结点两个不同的概念  2.DogLinkList是结构体指针  DogLinkList p<=> DogNode *p; */  void IniLinkList(DogLinkList &L) /* 生成一个头结点   */  { 	L=(DogLinkList)malloc(sizeof(DogNode)); 	strcpy(L->dog.name,"这是头结点"); 	L->next=NULL; }  void CreateList_H(DogLinkList &L,int n)  //从前面插入结点 n个元素的值  { 	IniLinkList(L); 	DogNode *p; 	for(int i=0;i<n;i++) 	{ 		p=(DogNode*)malloc(sizeof(DogNode)); 		printf("输入狗的信息:");  		scanf("%s %d",p->dog.name,&(p->dog.id)); 		//头插入：让 p指向第一个结点后再让头结点指向 p 		//p变为第一个结点，原第一个结点变为第二个结点  		p->next=L->next; 		L->next=p; 	} }  void CreateList_R(DogLinkList &L,int n)  //后插法  //从后面插入n个结点 { 	DogNode *r; 	r=L; 	while(r->next!=NULL) 	{ 		r=r->next; 	} 	DogNode *p; 	for(int i=0;i<n;i++) 	{ 		p=(DogNode*)malloc(sizeof(DogNode)); 		printf("输入狗的信息:");  		scanf("%s %d",p->dog.name,&(p->dog.id)); 		p->next=NULL; 		r->next=p; 		r=p; 	} }  void GetElem(DogLinkList L,int i,Dog &dog) { //获取第i个结点的值放在dog里  	DogNode *p; 	p=L->next; 	int j=1; 	while(p&&j<i) 	{ 		p=p->next; 		++j; 	} 	if(!p||j>i) 		printf("error"); 	else 	{ 		dog.id=p->dog.id; 		strcpy(dog.name,p->dog.name); 	} }  DogNode *LocateElem(DogLinkList &L,Dog dog) { //定位dog  	DogNode *p; 	p=L->next; 	while(p&&(p->dog.id!=dog.id)&&(!strcmp(p->dog.name,dog.name))) 		p=p->next; 	return p; }  void ListInsert(DogLinkList &L,int i,Dog &dog) { //在第i个位置插入dog  	DogNode *p,*s; 	s=(DogNode*)malloc(sizeof(DogNode)); 	p=L; 	int j=0; 	while(p&&(j<i)) 	{ 		p=p->next; 		j++; 	} 	if(p!=NULL) 	{ 		s->dog.id=dog.id; 		strcpy(s->dog.name,dog.name); 		s->next=p->next; 		p->next=s; 	} }  //删除的结点要free（）  void DelElem(DogLinkList &L,int i) { 	DogNode *p,*q; 	p=L;int j=0; 	while((p->next)&&(j<i-1)) 	{ 		p=p->next;j++; 	} 	if(p->next!=NULL&&(j==i-1)) 	{ 		q=p->next;p->next=q->next; 		free(q); 	} }  void PrintList(DogLinkList &L) { 	DogNode *p;//p临时变量名，不用再 malloc  	p=L->next; 	while(p!=NULL) 	{ 		printf("%s %

IniLinkList(L)初步判断这个函数是初始化L，里面应该会有malloc语句，那么r=(DogNode*)malloc(sizeof(DogNode))这一句的确多余。


Question: 数据结构C语言迷宫问题求助

引用 3 楼 天翔龙闪的回复:这跟你算法有关，我也是输出这个结果，有的地方应该写错了，你再跟书上的核对一下，或者把书代码的清晰部分发过来，不然我一时半会也看不出来原因。我断点的时候，发现 			if (g == x2 && h == y2 && maze[g][h] == 0) 			{ 				printf("The revers path is:\n"); 				while (isEmptyStack_seq(st)) 				{ 					element = top_seq(st); 					pop_seq(st); 					printf("the node is:%d%d\n", element.x, element.y); 				} 				return; 			}这段代码没走过一次，所以你好好跟书上的确认上 大神 这里不能发图 我私信发给你了😁

引用 1 楼 天翔龙闪的回复:问题关键是在于你函数要求传的是一个二级指针，但是你传进去的是一个数组指针。 最简单的修改方法如下： 将 void mazePath(int(* maze)[11], int(* direction)[2], int x1, int y1, int x2, int y2, int M, int N)这个函数的形参改成数组指针  然后在main里面，传入的参数形式写成mazePath(maze, direction, x1, y1, x2, y2, M, N);这样参数的类型才能匹配。  当然，这样的适用性不好，每当你创建一个新的maze二维数组或者direction二维数组的时候，都需要手动去调对应mazePath函数里面的形参的写法。  但假如你不在意的话，这么改就行。  但如果不想改变mazePath函数的形参类型，也就是说你要传一个二级指针进来的话，那么对应的你在main函数里面，定义maze 和directin的时候，就要设定成二级指针的形式 如下int **maze;和int **direction  然后在调用函数的时候，还是写成 mazePath(maze, direction, x1, y1, x2, y2, M, N);  接下来是二级指针的赋值问题，一般来说都要去堆区赋值。 我现在写下在堆区赋值的方法，如下。 int** maze = (int**)malloc(m * sizeof(int*)); int i, j; for (i = 0; i < m; ++i) { 	maze[i] = (int*)malloc(n * sizeof(int*)); } for (i = 0; i < m; ++i) { 	for (j = 0; j < n; ++j) { 		maze[i][j] = 1;//你要改成你要的数 	} }  //在return 0之前再写这些 for (i = 0; i < m; ++i) { 	free(maze[i]);  	maze[i] = NULL;  } free(maze); array = NULL; 不过我建议此题还是不要搞这么麻烦。你如果想深入二级指针，建议用这种方式试试。 如果你学了c++，用vector<vector<int>>嵌套的方式更好。 大神 用第一种方法能成功运行了 为什么结果会是the path has not been found😭


Question: c语言基础知识

引用 6 楼 ?Victor.??的回复:看看这个~   https://blog.csdn.net/lord12580/article/details/82109850 谢谢你😊哈哈哈

引用 4 楼 ?Victor.??的回复:空格会切断字符串 啥意思啊，不太明白

空格会切断字符串

找到原因了，输入的时候把逗号，换成空格就好使了，但是不知道为什么会这样

引用 1 楼 自信男孩的回复:输入的时候逗号后加一个空格试试～ 还是不行啊

输入的时候逗号后加一个空格试试～


Question: 求助

你这也是懒到家了 妹子，你是要问哪道题呀


Question: 求大佬

看着很正常呀，有什么问题吗？

#include<stdio.h> int main() {    int i,n,s=0;    scanf("%d",&n);    for(i=1;i<=100;i++)    {      if(i%n!=0)      s++;      printf("不能被n整除的数%d\n",i);     }      printf("总共有%d不能被n整除",s); }就是不知道哪里有问题

改了，可是后面结论正确前面又不能了

引用 3 楼 自信男孩的回复:[quote=引用 2 楼 zzl9617 的回复:] [quote=引用 1 楼 user-3的回复:]要求很准确了，试一试自己写写嘛 第2个不会。。。[/quote] 第二个加一个统计变量就好了 [/quote] 帅哥我会我就不会来这里操作了

引用 2 楼 zzl9617 的回复:[quote=引用 1 楼 user-3的回复:]要求很准确了，试一试自己写写嘛 第2个不会。。。[/quote] 第二个加一个统计变量就好了

引用 1 楼 user-3的回复:要求很准确了，试一试自己写写嘛 第2个不会。。。

要求很准确了，试一试自己写写嘛


Question: 哪位大神能帮忙改改，跪求，我只是个菜鸟

#include<stdio.h> int main() { int a[20], i, num, j, n = 0; for (i = 0;; i++) { scanf_s("%d", &a[i]); if (a[i] =='\n') { num = i - 1; break; } } for (i = 0; i < num - 1; i++) for (j = i + 1; j < num - i; j++) { if (a[i] != a[j]) n++; } printf("%d\n", n); return 0; }  帮你先用代码块贴一下，方便大家看。输入\n的ASCII码就好了。13

你输入10就结束了

是的  主要是输入这地方 我的死循环了 我想按回车结束

是有什么问题吗？


Question: C语言建立串，计算出字符的出现次数

#include <string.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h>  #define MaxSize 32 //定义串 typedef struct {     char data[MaxSize];     int length;        //存放串长 }SqString;  //存放输出结果 typedef struct {     char ch;//单字母     int count;//计数器 }Cch;  SqString s; char cstr[MaxSize];  //创建串 //void CreateStr(SqString &str,char cstr[]) void CreateStr(SqString *str,char cstr[]) {     int i;     for(i=0;cstr[i]!='\0';i++)     {         str->data[i]=cstr[i];     }     str->length=i;     //printf("%d \n",i); } /* //输出串 void OutputStr(SqString s) { int i; if(s.length>0) { for (i=0;i<s.length;i++) { printf(" %c",s.data[i]); } printf("\n"); } } */  //存放到Cch中 void SaveCch() {     //Cch c[MaxSize];     Cch c[52];     int idx;     memset(c, 0, sizeof(c));     //OutputStr(s);     CreateStr(&s,cstr);     //if(s.data>0)     if(s.length > 0)    //应该用长度吧     {         for(int i=0;i<s.length;i++)         {             if (isupper(s.data[i])) {                 idx = s.data[i] - 'A';                 c[idx].count++;             }             if (islower(s.data[i])) {                 idx = s.data[i] - 'a';                 c[idx+26].count++;             } #if 0             c[i].ch = s.data[i];             c[i].count=0;             for(int j=0;j<s.length;j++)             {                 if(c[i].ch==s.data[j])                 {                     c[i].count++;                 }             }             printf("%c: %d\n",c[i].ch,c[i].count); #endif         }         for (int i = 0; i < 52; i++) {             if (i < 26 && c[i].count > 0)                 printf("%c: %d\n", 'A'+i, c[i].count);             if (i >= 26 && c[i].count > 0)                 printf("%c: %d\n", 'a'+i-26, c[i].count);          }      } }  int main() {      printf("建立串s: ");     fgets(cstr, MaxSize, stdin);     //CreateStr(s,cstr);     //OutputStr(s);     SaveCch();     return 0; } 用这个版本测试一下编译，是否还会有error~

引用 2 楼 自信男孩 的回复：#include <string.h> #include <stdio.h> #include <stdlib.h> #include <ctype.h>  #define MaxSize 32 //定义串 typedef struct {     char data[MaxSize];     int length;        //存放串长 }SqString;  //存放输出结果 typedef struct {     char ch;//单字母     int count;//计数器 }Cch;  SqString s; char cstr[MaxSize];  //创建串 void CreateStr(SqString &str,char cstr[]) {     int i;     for(i=0;cstr[i]!='\0';i++)     {         str.data[i]=cstr[i];     }     str.length=i;     //printf("%d \n",i); } /* //输出串 void OutputStr(SqString s) { int i; if(s.length>0) { for (i=0;i<s.length;i++) { printf(" %c",s.data[i]); } printf("\n"); } } */  //存放到Cch中 void SaveCch() {     //Cch c[MaxSize];     Cch c[52];     int idx;     memset(c, 0, sizeof(c));     //OutputStr(s);     CreateStr(s,cstr);     //if(s.data>0)     if(s.length > 0)    //应该用长度吧     {         for(int i=0;i<s.length;i++)         {             if (isupper(s.data[i])) {                 idx = s.data[i] - 'A';                 c[idx].count++;             }             if (islower(s.data[i])) {                 idx = s.data[i] - 'a';                 c[idx+26].count++;             } #if 0             c[i].ch = s.data[i];             c[i].count=0;             for(int j=0;j<s.length;j++)             {                 if(c[i].ch==s.data[j])                 {                     c[i].count++;                 }             }             printf("%c: %d\n",c[i].ch,c[i].count); #endif         }         for (int i = 0; i < 52; i++) {             if (i < 26 && c[i].count > 0)                 printf("%c: %d\n", 'A'+i, c[i].count);             if (i >= 26 && c[i].count > 0)                 printf("%c: %d\n", 'a'+i-26, c[i].count);          }      } }  int main() {      printf("建立串s: ");     fgets(cstr, MaxSize, stdin);     //CreateStr(s,cstr);     //OutputStr(s);     SaveCch();     return 0; } 供参考～ 楼主的问题主要是C++支持参数带&，而C 不支持参数&谢谢   你这么一处理我得好好琢磨一下了

虽然不是很懂为啥这样写，不过好像没啥问题，除了void CreateStr(SqString &str,char cstr[])跟你的传参


Question: 请大佬们答疑解惑，一维扩散方程有限差分不会编。。。

////全隐式差分格式调用    //double a[Nx - 2] = { 0 };    //double b[Nx - 2] = { 0 };    //double c[Nx - 2] = { 0 };    //b[0] = 1 + 2 * r;    //c[0] = -r;    //a[Nx - 3] = -r;    //b[Nx - 3] = 1 + 2 * r;    //for (int i = 1; i <= Nx - 4; i++)    //{    //    a[i] = -r;    //    b[i] = 1 + 2 * r;    //    c[i] = -r;    //} //double d[Nx - 2];    //赋予首末值 //d[0] = T[1] + r*T[0];     //d[Nx - 3] = T[Nx - 2] + r*T[Nx-1];     //for (int i = 1; i <= Nx - 4; i++) //{ //    d[i] = 0.0; //}  //int n = 0; //while (n <= Nt - 1) //{  //    Tridiagnol_Solution(a, b, c, T, d);  //    for (int i = 0; i <= Nx - 3; i++)    //补丁作用 //    { //        T[Nx - 2 - i] = T[Nx - 3 - i]; //    }   //    T[0] = left;    //追赶法从后往前计算，因此左端的值会被改变   //    for (int i = 0; i <= Nx - 1; i++) //    { //        fprintf(f, "%.4f\t", T[i]); //    } //    n++; //    fprintf(f, "\n");  //    //新一轮计算（隐式） //    d[0] = T[1] + r*T[0]; //    d[Nx - 3] = T[Nx - 2] + r*T[Nx - 1]; //    for (int i = 1; i <= Nx - 4; i++) //    { //        d[i] = T[i];    //将计算后的新值T赋给d迭代计算 //    }    //}  ////全显示差分格式调用（不需要追赶法计算） //double a = r; //double b = 1 - 2 * r; //double c = r;   //int n = 0; //double T1[Nx] = {0};    //创建临时存储数组 //while (n <= Nt - 1) //{ //    for (int i = 1; i <= Nx - 2; i++) //    { //        T1[i]=a*T[i-1]+b*T[i]+c*T[i+1];    //显式格式非常注意扩散系数和空间节点的选择！ //        T[i] = T1[i]; //    }  //    T[0] = left; //    T[Nx - 1] = right; //    for (int i = 0; i <= Nx - 1; i++) //    { //        fprintf(f, "%.4f\t", T[i]); //    } //    n++; //    fprintf(f, "\n");   //}   ////两层算术平均格式（恒稳定）（使用追赶法求解） ////C-N差分格式（交替分段显隐方法） //double a[Nx - 2] = { 0 }; //double b[Nx - 2] = { 0 }; //double c[Nx - 2] = { 0 }; //b[0] = 1 + 2 * r; //c[0] = -r; //a[Nx - 3] = -r;     //b[Nx - 3] = 1 + 2 * r; //for (int i = 1; i <= Nx - 4; i++) //{ //    a[i] = -r; //    b[i] = 1 + 2 * r; //    c[i] = -r; //}  //double a1 = r; //double b1 = 1 - 2 * r; //double c1 = r;  ////等号右边初始化：d,d1 //double d[Nx - 2];    //赋予首末值 //d[0] = a1*T[1] + b1*T[0];    //等号右边均为常量值 //d[Nx - 3] = c1*T[Nx - 2] + b1*T[Nx-1];     //for (int i = 1; i <= Nx - 4; i++) //{ //    d[i] = a1*T[i + 1] + b1*T[i] + c1*T[i - 1]; //}  //double d1[Nx - 2];    //将d1作为新的变化量 //d1[0] = d[0]+r*T[0]; //d1[Nx - 3] = d[Nx - 3] + r*T[Nx - 1]; //for (int i = 1; i <= Nx - 4; i++) //{ //    d1[i] = d[i]; //}  ////double T1[Nx] = { 0 };    //临时迭代数组 //int n = 0;  //while (n <= Nt - 1) //{ //    Tridiagnol_Solution(a, b, c, T, d1);  //    for (int i = 0; i <= Nx - 3; i++)    //补丁作用 //    { //        T[Nx - 2 - i] = T[Nx - 3 - i]; //    }  //     //    T[0] = left; //    //T[Nx - 1] = right; //    for (int i = 0; i <= Nx - 1; i++) //    { //        fprintf(f, "%.4lf\t", T[i]); //    } //    n++; //    fprintf(f, "\n");  //    //对d1重新赋予首末值  //    d[0] = a1*T[1] + b1*T[0];    //等号右边均为常量值 //    d[Nx - 3] = c1*T[Nx - 2] + b1*T[Nx - 1]; //    for (int i = 1; i <= Nx - 4; i++) //    { //        d[i] = a1*T[i + 1] + b1*T[i] + c1*T[i - 1]; //    }  //    d1[0] = d[0] + r*T[0]; //    d1[Nx - 3] = d[Nx - 3] + r*T[Nx - 1]; //    for (int i = 1; i <= Nx - 4; i++) //    { //        //d1[i] = a1*T[i + 1] + b1*T[i] + c1*T[i - 1]; //        d1[i] = d[i]; //    } //}


Question: scanf("%d:%d",&a,&b); 怎么让%d和%d之间有冒号

同时按下shift和;

楼上的办法应该可以实现你的需求

引用 3 楼 lyhlw007 的回复:如果是%s,有办法在后面输入冒号么       printf("please enter client inf:\n");     for (i = 0; i < m; i++)     {         int ch;         char *p = client[i].name;         while((ch = getchar()) != ':'){             *p = ch;             p++;         }         scanf("%d", &client[i].num);         printf("%s, %d\n", client[i].name, client[i].num);     }  可以这样

如果是%s,有办法在后面输入冒号么

%d和%d之间可以 用 ： %s不行


Question: C语言数组 sizeof用法在传递到函数内部时获取数组长度

引用 2 楼 chxchxkkk 的回复:数组作为函数参数传进去的是地址，只有4个字节，只能把数组长度当作一个参数传进去 void reverse(int*input, int n)  确实只有这样，谢谢。

引用 5 楼 棉猴 的回复: 所以sizeof(a)实际上是一个地址类型的大小，即4个字节 sizeof(&input)，是input指向的内容的大小，即17*4=68个字节  我想搞定的是传入内部的，最后还是只有从定义的位置传，还是用的2楼的办法。

数组传入函数，得到的是指针

reverse里的input是指针，而main函数里的a是数组。

将元素数目做为参数传入 函数内部，它只知道入参是个指针，不知道是个数组


Question: 大佬帮忙看看

#include <stdio.h>  int isPrime(int x){     if(x<2) return 0;     for(int i=2;i<x;i++){         if(x%i==0)return 0;     }     return 1; }  int main() {     float sum=0.0;     int count = 0;     for(int i=100;i<=200;i++){         if(isPrime(i)){             sum += i;             count++;         }     }     printf("100~200之间素数平均值为：%.2f",sum/count);     return 0; }  供参考


Question: C语言简单计数求助

引用 1 楼 Seth423 的回复： #include <stdio.h>  int main()	//缩进太乱 { 	int n;				//变量声明要放到开头 	int i, p, j = 0, t = 0, k = 0; 	int b[10];		//用不了1000的空间,另外a数组没什么用，接收的值用t就可以 	 	scanf("%d", &n);		 	for(i = 0; i < n; i++) 	{ 		for (j = 0; j < 10; j++)//初始化要用循环,否则只是给b[0]赋了初值 			b[j] = 0; 			 		scanf("%d", &p); 		for(j = 0; j < p; j++) 		{ 			scanf("%d", &t);	//此外数组就是指针，不需要‘&’ 			if (t < 10 && t >= 0)	//判断完大小后，数量数组直接加一就好 				++b[t++]; 			 		} 		 		for(k = 0; k < 10; k++)		//输出功能是在输入结束后进行的，所以至少要跳出输入的循环 		{ 			if(b[k] != 0) 				printf("%d %d\n", k, b[k]); 		} 	} 	return 0; } 好的好的我懂啦！太感谢您了 原来这问题还不少呢，还要多多学习

引用 5 楼 自信男孩 的回复:是否考虑n的值需要做一下限制，否者b数组有越界的风险。代码需要更严谨一些～  感謝提醒~ 麻煩您看一下這個會不會好一點：  #include <stdio.h> #define MAXLEN 100   int main() {     int n;     int i, j, p, t, flag;     int b[MAXLEN];      	i = 0; 	while (flag == 0 && i <= 10) 	{ 		scanf("%d", &n) 		if (n > MAXLEN / 10 || n <= 0) 		{ 			printf("error: n is invalid, try again...\n"); 			++i; 		} 		else 			break; 	} 	if (i == 10) 	{ 		printf("error: maximum input-time reaches\n"); 		return 1; 	} 		     for(i = 0; i < n; i++)     {         for (j = i*10; j < i*10+10; j++)             b[j] = 0;                       scanf("%d", &p);         for(j = 0; j < p; j++)         {             scanf("%d", &t);             if (t < 10 && t >= 0)                 ++b[i * 10 + t++];         }     }           for(i = 0; i < n*10; i++)         {             if (b[i] != 0)                 printf("%d %d\n", i%10, b[i]);             if (i % 10 == 0)                 printf("------------\n");         }               return 0; }

引用 2 楼 Seth423 的回复:这个版本更符合题意  #include <stdio.h>  int main() { 	int n; 	int i, j, p, t; 	int b[100]; 	 	scanf("%d", &n);		 	for(i = 0; i < n; i++) 	{ 		for (j = i*10; j < i*10+10; j++) 			b[j] = 0; 			 		scanf("%d", &p); 		for(j = 0; j < p; j++) 		{ 			scanf("%d", &t); 			if (t < 10 && t >= 0) 				++b[i * 10 + t++]; 		} 	} 	 	for(i = 0; i < n*10; i++) 		{ 			if (b[i] != 0) 				printf("%d %d\n", i%10, b[i]); 			if (i % 10 == 0) 				printf("------------\n"); 		} 		 	return 0; }   是否考虑n的值需要做一下限制，否者b数组有越界的风险。代码需要更严谨一些～

希望尽快采纳哦


Question: 利用8位数码管实现可以移动的动态显示数字的电路及软件设计。

但是请尽量不要太难，呃，我可能看不懂

或者有其他思路解决这个问题之类的，请告知


Question: 求个树的高手帮我看下我这个线索二叉树递归的问题

求救求救


Question: C语言多文件编译时报错“Redefination of ‘xxx’”

另外，mylibrary是一个空文件，还没有编辑，可以忽略掉。

引用 6 楼 自信男孩 的回复:#ifndef mydate_h #define mydate_h  #include <stdio.h> struct my_time{     int year;     int month;     int day; }; int leap[13]={0,31,29,31,30,31,30,31,31,30,31,30,31}; int nleap[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; typedef struct my_time date; date create_date(int,int,int); date pass_date(date,int); int is_overdue(date,date); int is_leap(date); int diff_date(date,date); #endif /* mydate_h */ //#include "mydate.h" #include <string.h> #include <stdio.h> #include <stdlib.h>  #include "mytime.h"  date create_date(int y,int m,int d){     date New;     New.year = y;     New.month = m;     New.day = d;     return New; } int is_leap(date x){     return (x.year % 400 == 0) || (x.year % 100 && x.year % 4 == 0); } date pass_date(date ori,int diff){     if(is_leap(ori)){         ori.day += diff;         if(ori.day > leap[ori.month]){             ori.day %= leap[ori.month];             ori.month += 1;             if(ori.month > 12){                 ori.month %= 12;                 ori.year += 1;             }         }     }else{         ori.day += diff;         if(ori.day > nleap[ori.month]){             ori.day %= nleap[ori.month];             ori.month += 1;             if(ori.month > 12){                 ori.month %= 12;                 ori.year += 1;             }         }     }     return ori; }  int is_overdue(date deadline,date nowdate){     if(deadline.year < nowdate.year){         return 1;     }else if(deadline.year > nowdate.year){         return 0;     }else{         if(deadline.month < nowdate.month){             return 1;         }else if(deadline.month > nowdate.month){             return 0;         }else{             return deadline.day < nowdate.day;         }     } }  int diff_date(date ori,date now){     int ans = 0;     if(ori.year != now.year){         ans += (12 - ori.month + now.month) + (now.year - ori.year - 1) * 12;     }else{         ans += now.month - ori.month;     }     return ans; }  int main(void) {     return 0; } 供参考  您好，按照您的代码，出现这个错误信息 这个错误信息我一开始也碰见过，不知道是我的编译器（MacOS下的Xcode）的问题,还是别的问题.

引用 4 楼 weixin_45750394 的回复:[quote=引用 1 楼 蜗牛千泷 的回复:] typedef struct time time;  typedef类型重定义的新类型名和原来结构体的名一样  PS：培养个好的编程规范，定义类型时，尽量用大写，避免和普通的变量名重名  而且，不仅仅是time这个结构体报错重复定义， 我的那些函数也报错重复定义呀。[/quote] 不好意思，报错信息没仔细看，干扰了你！  这两文件暂时看不出来出错的原因，提供不了帮助了。

引用 1 楼 蜗牛千泷 的回复:typedef struct time time;  typedef类型重定义的新类型名和原来结构体的名一样  PS：培养个好的编程规范，定义类型时，尽量用大写，避免和普通的变量名重名  而且，不仅仅是time这个结构体报错重复定义， 我的那些函数也报错重复定义呀。

引用 1 楼 蜗牛千泷 的回复:typedef struct time time;  typedef类型重定义的新类型名和原来结构体的名一样  PS：培养个好的编程规范，定义类型时，尽量用大写，避免和普通的变量名重名  您好,这是因为C语言不支持struct A定义之后直接用A来表示结构体.   在C++中  struct node｛     int x； ｝； node  m;  这样的写法是允许的. 但如果在C语言中必须要这么写  struct node｛     int x； ｝； struct node  m;  语句    typedef struct time time；    的作用仅仅是让我以后可以像C++那样方便地直接使用time来表示这个结构体。

引用 9 楼 贾可 的回复:结构体可以放在 .h 中，没必要放在 .c 里面。另外数组，最好也放在 .c 里面，免得多个文件引用时出错。 // 头文件里可以放这些： extern int leap[]; extern int nleap[]; // 不用分三处，啰里啰唆写一堆，一行就够了。 typedef struct time { 	int year; 	int month; 	int day; } time;  // 源文件里放数组的定义就行了 int leap[] = { 0,31,29,31,30,31,30,31,31,30,31,30,31 }; int nleap[] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };  谢谢，解决了问题。 应该把数组写在.c文件里，否则就会出错。


Question: while里面语句能用if if if吗

当然可以，为什么不用if else 呢？

每个if都写对了就不会出错 贴代码吧

你可以用一万个

一个if不够你玩的？


Question: 返回值类型与函数值类型不匹配怎么改

修改下函数定义呀 如果未找到节点就别返回-1了，返回NULL

int InsElem(LinkList* L, ElemType x, int i)  ====》》》返回值是int类型 { int j = 0; LinkList* p = L, * s; if (i <= 0) return 0; while (p != NULL && j < i - 1)	//查找第i-1个节点*p { j++; p = p->next; } if (p == NULL) return -1;	//未找到节点返回-1 else { s = (LinkList*)malloc(sizeof(LinkList));//创建新节点 s->data = x;	//存放元素x s->next = p->next; p->next = s; return L;        ====》返回的是链表指针  与 int不匹配 }

要么改定义，要么改返回啊。。。看你自己需要什么，你要是需要ｉｎｔ判断，那就改返回呗，你要是要返回指针去赋值使用，那就改定义，改成指针类型。错误返回ＮＵＬＬ


Question: fopen（）打不开文件

引用 8 楼 lmh589 的回复:[quote=引用 5 楼 smwhotjay 的回复:]  调试和运行，工作路径是不同的。能具体解释一下吗 比如说这个是和上面那个有相同问题的程序这样不对吗？[/quote] 你打开的是test还是test.txt？文件名不全？

估计是哪里的搜索路径设置问题。 我的环境上一直就是在工程文件同目录下。 我也不知道在哪去设置这个路径

引用 9 楼 arfi 的回复:把文件放到上一级目录看看，也就是说和工程文件放一起 收到你的启发我写了一个文件程序放在了哪里，问题果然解决了， 能帮忙解释一下为什么吗？是要和.c 文件放在一起吗？

把文件放到上一级目录看看，也就是说和工程文件放一起

引用 5 楼 smwhotjay 的回复: 调试和运行，工作路径是不同的。能具体解释一下吗 比如说这个是和上面那个有相同问题的程序这样不对吗？

引用 6 楼 自信男孩 的回复:不是路径的问题，而是括号扩的位置不对。根据赋值号=和==的优先级是==高，所以先判断fopen(xx, xx) == NULL,然后把判断结果赋值给fp。所以fp是NULL哦，对的，你说得对，但是改完之后还是无法打开文件，而且我电脑上所有含有fopen函数的程序都无法打开文件。

调试和运行，工作路径是不同的。

引用 2 楼 真相重于对错 的回复:输入绝对路径，或者文件所在目录是可执行文件的当前目录下，或者是path环境变量包含的目录。 文件就是在可执行文件的当前目录下的

估计文件路径问题或者文件不存在

要说最近干了什么蠢事就是删了系统变量Path，然后复制了一个其他人的，和这个有关系吗？


Question: DEV C++出现program received signal sigsegv,segmentation fault

引用 7 楼 zsbrittany 的回复:[quote=引用 6 楼 自信男孩 的回复:] #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct QNode{     int  data;     struct QNode  *next; } QNode,*QueuePtr;  typedef struct {     QNode *front;     QNode *rear;     int   len; } LinkQ;   //void InitQueue(LinkQ Q){ void InitQueue(LinkQ *Q) {      Q->front=(QNode*)malloc(sizeof(QNode));     if(!Q->front)         printf("error\n");     //Q->rear = Q->front=0;    //这句是把front重置NULL了，所以会段错误     Q->rear = Q->front;     Q->rear->next=NULL;  }  int QueueEmpty(LinkQ Q){     if(Q.front==Q.rear)  return 1;     else return 0; }  //void EnQueue(LinkQ Q,int e){ void EnQueue(LinkQ *Q,int e){      QNode *p;     p=(QNode*)malloc(sizeof(QNode));     if(!p) printf("error");     p->data=e; p->next=NULL;     Q->rear->next=p;     Q->rear=p;  }  void DeQueue (LinkQ &Q,int e){     QNode *p;     if(Q.front==Q.rear)  printf("error");     p=Q.front->next;     e=p->data;     Q.front->next=p->next;     if(Q.rear==p) Q.rear=Q.front;     free(p);  }   void GetHead (LinkQ Q,int *e){     if(Q.front==Q.rear) printf("error");     *e=Q.front->next->data;  }   int main(){      LinkQ Q;     //int n,i,x,temp;     int x,temp;     //InitQueue(Q);     InitQueue(&Q);      scanf("%d",&temp);     EnQueue(&Q,temp);      GetHead(Q, &x);     printf("%d",x);      return 0;  } 供参考 ～  感谢感谢   但有点不理解为什么要把一部分 定义的 Q  改成  *Q  [/quote]  可以了解一下swap为什么传参数为指针而不是普通变量～

引用 6 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct QNode{     int  data;     struct QNode  *next; } QNode,*QueuePtr;  typedef struct {     QNode *front;     QNode *rear;     int   len; } LinkQ;   //void InitQueue(LinkQ Q){ void InitQueue(LinkQ *Q) {      Q->front=(QNode*)malloc(sizeof(QNode));     if(!Q->front)         printf("error\n");     //Q->rear = Q->front=0;    //这句是把front重置NULL了，所以会段错误     Q->rear = Q->front;     Q->rear->next=NULL;  }  int QueueEmpty(LinkQ Q){     if(Q.front==Q.rear)  return 1;     else return 0; }  //void EnQueue(LinkQ Q,int e){ void EnQueue(LinkQ *Q,int e){      QNode *p;     p=(QNode*)malloc(sizeof(QNode));     if(!p) printf("error");     p->data=e; p->next=NULL;     Q->rear->next=p;     Q->rear=p;  }  void DeQueue (LinkQ &Q,int e){     QNode *p;     if(Q.front==Q.rear)  printf("error");     p=Q.front->next;     e=p->data;     Q.front->next=p->next;     if(Q.rear==p) Q.rear=Q.front;     free(p);  }   void GetHead (LinkQ Q,int *e){     if(Q.front==Q.rear) printf("error");     *e=Q.front->next->data;  }   int main(){      LinkQ Q;     //int n,i,x,temp;     int x,temp;     //InitQueue(Q);     InitQueue(&Q);      scanf("%d",&temp);     EnQueue(&Q,temp);      GetHead(Q, &x);     printf("%d",x);      return 0;  } 供参考 ～  感谢感谢   但有点不理解为什么要把一部分 定义的 Q  改成  *Q

1. next可能为空 2. GetHead的入参e应该用引用 int &

引用 3 楼 gouyanfen 的回复:Q.rear=Q.front=0;   肯定有问题了，Q.front 记录了分配的指针，然后你置为0了？ Q.rear=Q.front;就可以了。 你可以在那打印下看你的指针的指向。 你改变了分配的内存指向，在删除时必然会出错了 [quote=引用 2 楼 zsbrittany 的回复:] [quote=引用 1 楼 gouyanfen 的回复:] void InitQueue(LinkQ Q){       Q.front=(QNode*)malloc(sizeof(QNode)); if(!Q.front) printf("error\n");  Q.rear=Q.front=0;  这里是要做什么？       Q.rear->next=NULL;      } 我是想把开始时头指针和尾指针指向同一个节点 这一步有问题么？ [/quote][/quote]  噢噢噢噢 这里是有问题  void GetHead (LinkQ Q,int e){     if(Q.front==Q.rear) printf("error");     e=Q.front->next->data; 刚刚调试说这里也有这个问题，又是为什么？      }

Q.rear=Q.front=0;   肯定有问题了，Q.front 记录了分配的指针，然后你置为0了？ Q.rear=Q.front;就可以了。 你可以在那打印下看你的指针的指向。 你改变了分配的内存指向，在删除时必然会出错了 引用 2 楼 zsbrittany 的回复:[quote=引用 1 楼 gouyanfen 的回复:] void InitQueue(LinkQ Q){       Q.front=(QNode*)malloc(sizeof(QNode)); if(!Q.front) printf("error\n");  Q.rear=Q.front=0;  这里是要做什么？       Q.rear->next=NULL;      } 我是想把开始时头指针和尾指针指向同一个节点 这一步有问题么？ [/quote]

引用 1 楼 gouyanfen 的回复:void InitQueue(LinkQ Q){       Q.front=(QNode*)malloc(sizeof(QNode)); if(!Q.front) printf("error\n");  Q.rear=Q.front=0;  这里是要做什么？       Q.rear->next=NULL;      } 我是想把开始时头指针和尾指针指向同一个节点 这一步有问题么？


Question: 为什么%n无法输出正确的值？？？

代码和输出不匹配 目测你没有重新编译 或者没保存

我这个是C，我试了一下你那个方法直接报错了

当printf()使用%n时，会有不安全的隐患，因此，默认情况下，%n是不能使用的。如果需要使用，则要打开%n的开关。 int num; 	int c = 12345; 	int e = _get_printf_count_output(); 	if (e == 0) 	{ 		_set_printf_count_output(1); 	} 	printf("%d%n\n", c, &num); 	printf("%d\n", num); VS2015 C++环境调试  请参考《C++中printf()函数的用法10-5》 希望能够帮到你！

这个倒是没有，昨天还出现过nun%2直接改了num的值的情况，不知道是不是我dev -c软件出问题了


Question: 求助大佬

你这不是求素数，是求偶数啊 素数是不能被1和自身以外的其他数字整除的 你可以看看这个代码 #include<stdio.h> int main() {     int t,count=0,i,j;     float sum=0;     for(i=100;i<=200;i++) 	{ 		//判断素数  		for(j=2;j<i;j++) 		{ 			if(i%j==0) 				break; 			else 			{ 				sum=sum+i; 				count++; 			} 		} 	}  	printf("%f",sum/count); 	return 0; }


Question: 既然计算机内部使用的是补码，为什么我们还需要学习原码和反码？

谢谢大佬们

既然我们吃第三个面包就能饱 为什么要吃前两个面包??  我一直以为这是笑话来着

如果只学补码，你知道补码怎么算吗？给你一个补码，你能知道它应该等于多少吗？ 就好比加密一样，我只告诉你加密后的结果，不告诉你我是怎么加密的，你能知道我加密前的数据是什么吗？

我想是的，要不咋理解补码=反码+1


Question: 程序出错求解答

#include<stdio.h> #include<stdlib.h> int main() {     FILE *fp;     fp=fopen("p1.txt","r");     if(fp==NULL)     {         printf("文件打开失败，程序退出! ");         exit( 0);     }     char ch;     int i=0,j=0;      while(!feof(fp))     {         fscanf(fp,"%c",&ch);         if(ch=='[')             i++;         if(ch==']')             j++;         ch = 0;   //重置，防止fscanf读取失败后ch保留上一次的值。     }     if(i==j)     printf("0K!\n");     if(i!=j)     printf("ERROR!\n"); } 供参考～

你只使用feof判断结束是不行的  下面是正确的代码 #include<stdio.h> #include<stdlib.h> int main() { 	FILE *fp; 	fp=fopen("p1.txt","r"); 	if(fp==NULL) 	{ 		printf("文件打开失败，程序退出! "); 		exit( 0); 	} 	char ch; int i=0,j=0; 	while(!feof(fp)) 	{  		int end=fscanf(fp,"%c",&ch); 		if(end==-1) break; 		if(ch=='[')i++; 		if(ch==']')j++; 	} 	if(i==j) 	printf("0K!\n"); 	if(i!=j) 	printf("ERROR!\n"); }   具体错误原因你可以看看这篇文章 https://blog.csdn.net/qq_45721778/article/details/105818272


Question: 数据结构表达式求值

这只是当中一段代码吧？


Question: printf函数中的转换说明和我们平时用的强制转换说明一样吗？

任何有赋值号的语句都会改变变量i的值，其他的都是表达式，仅此而已

引用 楼主 weixin_45906870 的回复:举个例子： int i=336； 理解一：printf（“%d %c”， i ,i）; 这里的%d和%c其实只是个翻译说明，整型数i在计算机内存里面并没有因此而改变；  理解二：接着上面 printf("%d", (char)i);  //此时i在转换成char类型时，打印出来的是i等于80，但是i的内存仍然不变，因为printf函数中不管是双引号中的还是双引号外面的转换说明都只是翻译说明。 printf("%d", (int)i);   //此时打印出来的i等于336，上面操作并没有改变i的内存  理解三：接着上面，如果 i = (char)i;           //此时的强制转换说明在内存中发生“截断” printf（“%d”，i ）;   //这里的i真的就是发生的内存改变，打印出来的是80； i = （int）i；      //即使这里再强制转换回去 printf（“%d”，i）;   //这里打印出来的仍然是80，不会再变成336了 结论：所以，printf函数中的转换说明和平时用的强制转换说明是不一样的，我这样理解对吗？ 你的理解是错的. (char)i;会在内存中生成一个临时char，存储这个char,然后i=(char)i这个改变了原来i的值，所以你不可以转换回去，表达式结果存储并不会利用原来的变量空间。

%c是从内存里取一个字节，%d是从内存取4个字节（32位系统里）。而不是类型转换。


Question: c语言请教大佬

你这代码错误有点多呀  char是单字节变量，只能存储一个字符。如果是比较字符，你最多用’#’，如果想用两个结尾，你得用字符串（字符数组）存储，比较时用strcmp函数。

引用 1 楼 5250的回复:能贴代码就别贴图片 就是直接把代码复制到下头吗？

引用 2 楼 arfi的回复:printf("按成绩排名")前面少了个｝ 是了，解决了一些，不过那个warning还在

printf("按成绩排名")前面少了个｝

能贴代码就别贴图片

上面写错了,将 || 改为 |

11行处改为 if (*(short*)&x[i] == ('#' << 8) || '#') 原因"##"(不计算'\0')占两个字节,无法使用char进行比较,使用short进行比较可以

引用 4 楼 qq_47279096 的回复:[quote=引用 1 楼 5250的回复:]能贴代码就别贴图片 就是直接把代码复制到下头吗？[/quote]  引用 4 楼 qq_47279096 的回复:[quote=引用 1 楼 5250的回复:]能贴代码就别贴图片 就是直接把代码复制到下头吗？[/quote]  是呀 下次问问题把代码贴出来  别人可以直接拷过去运行或者调试 你这贴图片 除非是平写错误  要是其他错误 很难看出来


Question: C程序问题

引用 1 楼 user-1 的回复:你的puts后面是两个换行吗？ 看来是将换行作为一个字符读入了。 用scanf替换下好的


Question: error C2109: subscript requires array or pointer type报错 怎么办 求大佬解决

#include <stdio.h> #include <string.h> //void main(void) int main(void) {     char A1[100]={0};     char A2[100]={0};     int i;     printf("请输入任意字符串 \n\r");     //scanf("%s",&A1);     scanf("%s", A1);     memcpy(A2,A1,sizeof(A1)/sizeof(char));     for(i=0;i<100;i++)         //printf("A[%d]=%s\n\r",i,A[i]);         printf("A[%d]=%c\n\r",i,A2[i]);   } 供参考～


Question: 多进程管道通信

可能是因为stdin和stdout的缓存机制导致的。。。。个人猜测


Question: 求大佬帮写个c语言程序

#include <stdio.h>  int main() {     int stu[109][4]={0};     FILE *fp1, *fp2;     fp1 = fopen("test4","r+");     if (fp1==NULL)     {         printf("test4 cannot open\n");         return -1;     }     fp2 = fopen("test5","r+");     if(fp2==NULL){         printf("test5 cannot open\n");         return -1;     }     printf("***********************************************\n");     printf("学生信息和成绩如下\n");     printf("***********************************************\n");      for(int i=0;i<109;i++)     {         fscanf(fp1, "\n{%d,%d},", &stu[i][0], &stu[i][1]);           fscanf(fp2, "\n{%d,%d},", &stu[i][0], &stu[i][2]);           stu[i][3] = (stu[i][1]+stu[i][2])/2;         printf("学生:%d test成绩为:%d test5成绩为:%d 平均成绩为:%d\n", stu[i][0], stu[i][1],stu[i][2],stu[i][3]);     }      for(int i=0;i<109;i++){         for(int j=i+1;j<109;j++){             if(stu[i][3]<stu[j][3]){                 int no,t4,t5,ave;                 no = stu[i][0];                 t4 = stu[i][1];                 t5 = stu[i][2];                 ave = stu[i][3];                 stu[i][0] = stu[j][0];                 stu[i][1] = stu[j][1];                 stu[i][2] = stu[j][2];                 stu[i][3] = stu[j][3];                 stu[j][0] = no;                 stu[j][1] = t4;                 stu[j][2] = t5;                 stu[j][3] = ave;             }         }     }     printf("***********************************************\n");     printf("排序后学生平均成绩如下\n");     printf("***********************************************\n");     for(int i=0;i<109;i++){         printf("学生:%d  平均成绩为:%d\n", stu[i][0],stu[i][3]);     }     printf("***********************************************\n");     printf("不及格学生如下\n");     printf("***********************************************\n");     for(int i=0;i<109;i++){         if(stu[i][3]<50){             printf("学生:%d test成绩为:%d test5成绩为:%d 平均成绩为:%d\n", stu[i][0], stu[i][1],stu[i][2],stu[i][3]);         }     }     return 0; }

有大佬无？可以私信我联系

这是test4 {50218233  ,   70 }, {50219101  ,   90 }, {50219102  ,   60 }, {50219103  ,   75 }, {50219104  ,   80 }, {50219105  ,  100 }, {50219106  ,   95 }, {50219107  ,  100 }, {50219108  ,   75 }, {50219109  ,   80 }, {50219110  ,   80 }, {50219112  ,   65 }, {50219113  ,  100 }, {50219114  ,   55 }, {50219115  ,   75 }, {50219116  ,   95 }, {50219117  ,   90 }, {50219118  ,   55 }, {50219120  ,  100 }, {50219121  ,   75 }, {50219122  ,   75 }, {50219123  ,   80 }, {50219124  ,  100 }, {50219125  ,   80 }, {50219126  ,   65 }, {50219127  ,   70 }, {50219128  ,   90 }, {50219129  ,   90 }, {50219131  ,   30 }, {50219132  ,  100 }, {50219133  ,  100 }, {50219134  ,  100 }, {50219135  ,  100 }, {50219136  ,   90 }, {50219137  ,   60 }, {50219138  ,  100 }, {50219140  ,  100 }, {50219141  ,  100 }, {50219201  ,   90 }, {50219202  ,   95 }, {50219203  ,   75 }, {50219204  ,   95 }, {50219205  ,   95 }, {50219206  ,  100 }, {50219207  ,   80 }, {50219208  ,  100 }, {50219210  ,   85 }, {50219211  ,  100 }, {50219212  ,   85 }, {50219213  ,   95 }, {50219214  ,  100 }, {50219215  ,   85 }, {50219216  ,   50 }, {50219217  ,   90 }, {50219218  ,   80 }, {50219219  ,  100 }, {50219220  ,   90 }, {50219221  ,  100 }, {50219222  ,   90 }, {50219223  ,   95 }, {50219224  ,   95 }, {50219225  ,   90 }, {50219226  ,  100 }, {50219227  ,   95 }, {50219228  ,   90 }, {50219229  ,  100 }, {50219230  ,   50 }, {50219231  ,   80 }, {50219233  ,  100 }, {50219234  ,  100 }, {50219235  ,  100 }, {50219236  ,  100 }, {50219237  ,   75 }, {50219238  ,  100 }, {50219239  ,   65 }, {50219240  ,  100 }, {50519139  ,  100 }, {56119101  ,   90 }, {56119102  ,   90 }, {56119103  ,   80 }, {56119104  ,  100 }, {56119105  ,   90 }, {56119106  ,   70 }, {56119107  ,   90 }, {56119108  ,   90 }, {56119109  ,   90 }, {56119110  ,   25 }, {56119111  ,   95 }, {56119112  ,   30 }, {56119113  ,   90 }, {56119114  ,   95 }, {56119115  ,   40 }, {56119116  ,   80 }, {56119117  ,   70 }, {56119118  ,   65 }, {56119119  ,   95 }, {56119120  ,   80 }, {56119121  ,   50 }, {56119122  ,   85 }, {56119123  ,  100 }, {56119124  ,   90 }, {56119125  ,   90 }, {56119126  ,   95 }, {56119127  ,  100 }, {56119128  ,   95 }, {56119129  ,   50 }, {56119130  ,   95 }, {56119131  ,   80 }, {72419224  ,   45 },


Question: C语言队列题目

求救啊

没有人在吗？·

我更改了，但还是有问题，调试显示在执行panduan这个函数时，initqueue(q1)这一步的q->front = q->rear = (PNODE)malloc(sizeof(NODE))显示program received signal SIGSEGV，不是很明白啊，求教。

要插入n个数字，就要malloc调用n次， 每次申请一个新的节点，把它插入进去才对

Linkqueue insertqueue1(Linkqueue *q, int n) {  int i; PNODE p; p = (PNODE)malloc(sizeof(NODE)); if(p==NULL) exit(0); for(i=0;i<n;i++) {  //你这里是要插入n个数字，但是你每个給每一要插入队列的节点分配内存    // 要把前面对p对malloc，拉到这个循环里面来 scanf("%d",&p->data); p->next = NULL; q->rear->next = p; q->rear = p; } }  先改了这个再看吧


Question: x*y++为什么表示的是（x）*（y++）呢，是不是p=x*y++就是先做乘法呢

a = b; //这既是一个赋值运算，也是一个表达式，只要表达式就有一个返回值。两个操作 c++； //这既是一个自增运算，也是一个表达式，只要表达式就有一个返回值。两个操作

++运算符优先级较高

引用 9 楼 千梦一生 的回复:p = x*y++; 前两个相邻运算符  A=B*C;  *优先级大于=，因此优先计算B*C表达式的返回值，即计算【x*y++】表达式的返回值X。 return 【A=X】表达式的返回值;//这注意，比如结果A = 88这里并不是该表达式的返回值，只不过在这里碰巧遇上相同了而已 ----------------------------------------------------------------------------------------- x*y++; 前两个相邻运算符  M*N++  ++优先级大于*，因此优先计算N++表达式的返回值，即计算【N++】的返回值X。 return 【M*X】表达式的返回值; ------------------------------------------------------------------------------------------ N++； 一个运算符  step1:N=N+1; step2:return 自增之前的N ------------------------------------------------------------------------------------------  这个式子总结下来就是 p = x*y++; 根据优先级进行运算：设x = 3，y = 2,p = null 1.y++表达式【y自增y = 2，返回y，返回1】 2.x*(1的返回值)【返回3*2 = 6】 3.p=(2的返回值)【p被赋值为2的返回值，返回p的值（这个值在该式子中未被使用）】  一个从左到右的递归求值

啊，已经遗忘这种很6的写法了。 本咸鱼基本就一直都是： ...... i++； ......

（x）*（y++）和 x*y++的运行结果是一样的 你加多少个括号都不能改变这种规则。 p=x*y++，是先用x,y现在的值计算得出p，然后再给y加1，等同于p=（x*y,y++);

引用 2 楼 lin5161678 的回复：你的问题和运算顺序 无关 y++ 结果就是 y  所以 x*y++ 的值 和 x*y 的值一样   另外 优先级和运算顺序无关就是说x=1，y=1， x*y++结果也是1吗

引用 5 楼 刚学c的超级超级超级菜鸟 的回复:[quote=引用 2 楼 lin5161678 的回复：]你的问题和运算顺序 无关 y++ 结果就是 y  所以 x*y++ 的值 和 x*y 的值一样   另外 优先级和运算顺序无关就是说x=1，y=1， x*y++结果也是1吗[/quote] 运算结束后ｙ的值会加一，前＋＋操作是运算时就执行，后＋＋操作是当这一句执行过后再执行＋＋操作

y++这个++在y被使用后才会生效  所以题目你可以这样理解 p=x*y y++

我没听明白你的问题，可否拿代码说明你的问题

因为++的这个运算符优先级比*的高。谁优先谁就算运算。可以自行百度C语言运算符优先级表


Question: 输入与输出对应

引用 5 楼 ?Victor.?? 的回复:int main() { 	char c; 	while((c=getchar())!='\n') 	{ 		switch (c) 		{ 			case 'a':printf("1");break; 			case 'b':printf("2");break; 			case 'c':printf("3");break; 		} 	} 	return 0; } 这样应该就可以 如果不考虑变量类型和扩展性的话，5楼基本满足

引用 5 楼 ?Victor.??的回复:int main() { 	char c; 	while((c=getchar())!='\n') 	{ 		switch (c) 		{ 			case 'a':printf("1");break; 			case 'b':printf("2");break; 			case 'c':printf("3");break; 		} 	} 	return 0; } 这样应该就可以 OK，，，，，

引用 3 楼 scribbler的回复:int a = 1; int b = 2; int c = 3;  "abc"->123; "cab"->312;  是这样的题意？ 如果输入acb就要输出132 就是输入abc三个的顺序不同其对应的数输出顺序也不同

引用 1 楼 ?Victor.??的回复:有点不明题意  可以给出部分代码吗 就是改变输入abc的顺序，输出结果也要改变

有点不明题意  可以给出部分代码吗


Question: C实验：复读机

建议贴出你的代码～


Question: C语言中char类型和int类型仅仅是取值范围不同吗？

1 可以这么理解，char比int占用字节数少，所以从省内存的角度来说没问题。 2 计算机的世界里只有0和1，所以它们本质是一样的，都是二进制，所以理解也没问题。 3 这点理解不对，byte（字节，c里char和byte等价）是处理的最小单位，因为一个byte表示的数据大小有限，不足以满足需求，当然用byte数组也可以解决问题，但是不方便，不能把byte数组当作一个整体类型表现，于是就扩展类型，就增加了shor（占2字节），int（占4字节）等等。

int i = 1; 	char ch = 1;


Question: C语言数组

#include <stdio.h>  int main(int argc,char *argv[]){      char s[50],a,b,*p=NULL;     gets(s);     scanf("%c %c",&a,&b);     for(p=s;*p!='\0';p++){         if(*p==a){             *p=b;         }     }     puts(s);     return 0; }  这样吧 稳妥点

#include <stdio.h>  int main(int argc,char *argv[]){      char s[50],a,b,*p=NULL;     gets(s);     scanf("%c %c",&a,&b);     for(int i=0;s[i]!='\0';i++){         if(s[i]==a){             s[i]=b;         }     }     puts(s);     return 0; }  似乎那个p没用到....


Question: 利用指针编写程序，统计字符串的长度。(不要使用求字符串长度函数）

Len = 0; while(*str++)     len++;

引用 1 楼 真相重于对错 的回复:size_t MyStrLen(char* str) { 	if (str == NULL) 		return 0; 	char* p = str; 	while (*p!= '\0') { 		p++;  	} 	return p-str; }  如下供参考～ size_t my_strlen(const char *str) {     if (str == NULL)         return 0;      const char *p = str;      while (*p)         p++;      return p-str; }


Question: c语言请教大佬

函数声明 int ave(int (*arr)[2], int n);  因此，传递的参数应该是ave(x, 10);  参数o,m都是不确定的值，至少m需要在编译的时候就要确定值。

要不就主函数前面 加上一句 #define o 10 #defube m 2 二维数组作为参数，第二个[]里必须是个常量值，第一个[]可不填


Question: 为啥我函数的返回值一直是0

你的x输入的都不是素数？要看你输入的是什么数据？  另外，建议去掉for循环中i < a判断，因为这个判断是多余，因为i = a-1; i--，i < a是恒成立的

贴出你的运行图。你的代码我这里无事。。。。

int shushu(int a)的实现部分已经写在main函数前面了，主函数里的声明可以不要


Question: 这代码哪里有错，求解啊

#include "stdio.h" #include "stdlib.h"  typedef char ListItem;  struct alist {     //int n; /* 表长，当表为空时，n=0 */     int maxsize; /* 表示线性表的最大长度 */     int  length;     ListItem * data; /* 表元素数组 */ };  typedef struct alist *List;  List ListInit (int size); /* 初始化函数 */ int ListEmpty(List L); /* 判断线性表L是否为空 */ int ListLength(List L); /* 求表长 */ void ListInsert(int k, ListItem x, List L); /* 第k 个元素之后插入一个新元素x */ int ListLocate(ListItem x, List L); /* 返回元素x在表中的位置 */ ListItem ListRetrieve(int k, List L); /* 获取线性表中的第k个数据元素内容 */ void PrintList(List  L); /* 输出整个线性表 */ ListItem ListDelete(int k, List L); /* 将第k个元素删除 */  int main(int argc, char* argv[]) {     List  L = ListInit(10);      ListInsert(0, 'a', L);     ListInsert(1, 'b', L);     ListInsert(2, 'c', L);     ListInsert(3, 'd', L);     ListInsert(4, 'e', L);      PrintList(L);      ListDelete(4, L);      PrintList(L);      int loc = ListLocate(3, L);     printf("元素 3 的位置: %c\n\n", loc);      if(ListEmpty(L))     {         printf("线性表L为空!\n\n");     }     else     {         printf("线性表L不空!\n\n");     }      int length = ListLength(L);     printf("线性表L表长：%d\n\n", length);      /* ======================================== */     /* 可以在下面进一步测试您编写的函数的功能 */     /* ======================================== */       return 0; }  /* 初始化函数 */ List ListInit (int size) {     List  L;     L = (List) malloc(sizeof(struct alist));      /* 请使用malloc函数或者new操作，为线性表分配初始空间*/      L->maxsize=size;     //L->n=0;                         /*将当前线性表长度置0*/     L->length = 0;      //为data申请空间     L->data = (ListItem *)malloc(sizeof(ListItem) * size);     if (!L->data)         exit(0);      return L;                       /*成功，返回L*/ }  /* 判断线性表L是否为空 */ int ListEmpty(List L) {     /* 请编写代码，实现函数功能 */      if (L->length == 0) { return 1; }     return 0;  }  /* 求表长 */ int ListLength(List L) {     if (L == NULL) { return 0; }  return L->length;     /* 请编写代码，实现函数功能 */  }  /* 第k 个元素之后插入一个新元素x */ void ListInsert(int k, ListItem x, List L) {     printf("在位置 %d 插入元素 %c\n\n", k, x);     int i;     //if (k < 0 || k > L->n)     if (k < 0 || k > L->length)     {         printf("out of bounds");         exit(0);     }      if (L->length == L->maxsize)     {         printf("out of memory");         //exit(0);         return;     }     else     {         //for (k = i; k <= L->length; k--)         for (i = L->length; i > k; i--)         {             L->data[i + 1] = L->data[i];         }         //L->data[i - 1] = x;         L->data[k] = x;         L->length++;   //数据表的长度加1     }                      /* 请在此添加代码，实现在第k个元素后插入值为x的新元素的功能 */  }  /* 返回元素x在表中的位置 */ int ListLocate(ListItem x, List L) {     /* 请在此添加代码，实现函数功能 */     int k;     for (k = 0; k < L->length; k++)     {         if (L->data[k] == x)         {             //k为e对应的数组下标，在表中对应序号应为k+1             return k + 1;         }     }     return 0; }  /* 获取线性表中的第k个数据元素内容 */ ListItem ListRetrieve(int k, List L) {     /*判断k值是否合理，若不合理，ERROR*/     //if (k<1 || k>L->n)     if (k<1 || k>L->length)     {         printf("ERROR: out of bounds");         exit(0);     }      /* 请在此添加代码，实现函数功能 */     if (L->length < 1 || (L->length > ListLength(L)))     {         return 0;     }     //数据元素的序号从1开始，数组下表从0开始，第k个元素对应的数组下标为k-1;     return L->data[k - 1]; }  /* 输出整个线性表 */ void PrintList(List  L) {     /* 请编写代码，实现函数功能 */     int k;     if (ListEmpty(L))     {         printf("表为空！\n");         return;     }     //for (k = 0; k < L->length; k++)     //for (k = 0; k < L->n; k++)     for (k = 0; k < L->length; k++)     {         printf("%-3d", L->data[k]);     }     printf("\n"); }  /* 将第k个元素删除 */ ListItem ListDelete(int k, List L) {     int  i; ListItem x;     //if (k<1||k>L->n)     if (k<1||k>L->length)     {         printf("ERROR: out of bounds");         exit(0);     }      printf("删除第 %d 个元素\n\n", k);     x=L->data[k-1];      x = L->data[i - 1];     for (k = i; k < L->length; k++)     {         L->data[k - 1] = L->data[k];     }     L->length--;       return x; }  供参考～

老兄　你出问题都不带ｄｅｂｕｇ的吗？  oid ListInsert(int k, ListItem x, List L) {     printf("在位置 %d 插入元素 %c\n\n", k, x);   int i;　　　　／／没有初始化     if (k < 0 || k > L->n)     {         printf("out of bounds");         exit(0);     }      if (L->n == L->maxsize)     {         printf("out of memory");         exit(0);     }     else     { for (k = i; k <= L->length; k--)　　　　／／ｆｏｒ循环不会执行         {　　             L->data[k + 1] = L->data[k];         } L->data[i - 1] = x;　　　　　　／／数组越界，ｃｏｒｅ　ｄｕｍｐ

你应该告诉我们你说的“错”的现象是什么，是编译错误还是运行达不到预期？不然我们很难帮你定位啊


Question:
【问题描述】
输入一个自然数Ｎ

k=1你是不是得放for循环外面？


Question: 大佬求教，刚学。

根据程序运行顺序，先运行t=w/(h*h);后运行scanf

你的 t=w/(h*h)应放在scanf之后，那会儿还没值呢


Question: C语言中，为什么字符串中的字符可以是汉字？而char类型的字符却不可以？

汉字是多字节或者unicode编码，一个字符不能完整的表达汉字。

汉字是字符串，不是字符。汉字编码不是一个字符能够表示的。

因为汉字是由2个char组成的


Question: 我编的一个小程序怎么没输出？程序功能：要求写三个函数，一个用来输入10个整数，一个理这组数，一个输出处理后的数。将最小的数和第一个数换，最大的和最后一个调换

我用了你的程序。很感谢，但是我还是想问哈我的程序错在哪。

你的处理函数太混乱，在你的代码基础上修改，供参考  #include<stdio.h>  void input(int a[]); void f(int a[]); void output(int a[]);  int main() {     int a[10];     input(a);     f(a);     output(a);     return 0; }  void input(int a[]) {     int i = 0;     printf("please input 10 numbers:\n");     for (i=0;i<10;i++)     {         printf("第%d个数字为:",i+1);         scanf("%d", &a[i]);     } }  void f(int a[]) {     int t=0, minindex=0, maxindex=0;     int min=a[0],max=a[0];     int i = 0;     for (i = 0; i < 10; i++)     {         if (a[i] < min)         {             min = a[i];             minindex = i;         }         if (a[i] > max)         {             max = a[i];             maxindex = i;         }     }     if (minindex != 0)     {         t = a[0];         a[0] = a[minindex];         a[minindex] = t;     }     if (maxindex != 9)     {         t = a[9];         a[9] = a[maxindex];         a[maxindex] = t;     } }  void output(int a[]) {     int i = 0;     for (i = 0; i < 10; i++)     {         printf("%3d", a[i]);     }     printf("\n");     printf("最小的数字为:%3d,最大的数字为:%3d\n",a[0],a[9]); }

我的程序如下 #include<stdio.h> int main() { 	void input(int a[]); 	int a[10]; 	void f(int a[]); 	void output(int a[]); 	input(a); 	f(a); 	output(a); 	return 0; }  void input(int a[]) { 	int i = 0; 	printf("please input 10 numbers:\n"); 	for (i=0;i<10;i++) 	{ 		printf("第%d个数字为:",i+1); 		scanf("%d", &a[i]); 	} }  void f(int a[]) { 	int t; 	int min=a[0],max=a[0]; 	int *p1,*p2; 	int i = 0; 	for (i = 0; i < 10; i++) 	{ 		if (a[i] < min)  		{ 			min = a[i]; 			p1=&a[i]; 		} 		if (a[i] > max)  		{ 			max = a[i]; 			p2=&a[i]; 		} 	} 	t=a[0]; 	a[0]=*p1; 	*p1=t; 	t=a[9]; 	a[9]=*p2; 	*p2=t; }  void output(int a[]) { 	int i = 0; 	for (i = 0; i < 10; i++) 	{ 		printf("%3d", a[i]); 	} 	printf("\n"); 	printf("最小的数字为:%3d,最大的数字为:%3d\n",a[0],a[9]); }


Question: 哪位大神可以帮我看一下

while循环

建议楼主通过调试分别分段来定位问题，先看程序运行到哪里卡顿了。一下子看这么多代码不好定位。

真相只有一个  你的6个while陷入了死循环，大概看了一下，好家伙 没几个正常循环的，哈哈


Question: 求大佬们帮着看看这个怎么做，搞了半天实在不会。

int main() {     int score[24][2]={ 			{50107101, 80}, 			{50107102, 85}, 			{50107104, 89}, 			{50107105, 80}, 			{50107106, 56}, 			{50107107, 89}, 			{50107108, 89}, 			{50107109, 82}, 			{50107110, 81}, 			{50107111, 90}, 			{50107112, 80}, 			{50107113, 89}, 			{50107114, 43}, 			{50107115, 82}, 			{50107116, 82}, 			{50107117, 96}, 			{50107118, 92}, 			{50107119, 90}, 			{50107120, 82}, 			{50107121, 9}, 			{50107122, 89}, 			{50107123, 82}, 			{50107124, 88}, 			{50107125, 90} 			};   	int Max_Score,Min_Score; 	double Average_Score; 	double Pass_Rate; 	int Count_score[5]={0};  	Max_Score = GetMax(score,24);//求最大 	Min_Score = GetMin(score,24);//求最小 	Average_Score = GetAverage(score,24);//求均值  	GetCount(score,24,Count_score);//小于60  61-70  71-80  81-90  大于90 	Pass_Rate = Get_Pass_Rate(score,24);//及格率  	sort_decline(score,24);//降序排列 	Print_Score(score,24);//显示成绩 	return 0; }

int GetMax(int score[][2],int len) {     int max,i;     max=score[0][1];     for(i=1;i<len;i++)     {         if(max<score[i][1])         {             max=score[i][1];         }     }     return(max); }  int GetMin(int score[][2],int len) {     int min,i;     min=score[0][1];     for(i=1;i<len;i++)     {         if(min>score[i][1])         {             min=score[i][1];         }     }     return(min); }  double GetAverage(int score[][2],int len) {     int average=0,i;     for(i=0;i<len;i++)     {         average+=score[i][1];     }     return (double)average/len; }  void GetCount(int score[][2],int len,int Count_score[5]) { 	int i; 	for(i=0;i<len;i++) 	{ 		if(score[i][1] < 60) 			Count_score[0]++; 		else if(score[i][1] < 70) 			Count_score[1]++; 		else if(score[i][1] < 80) 			Count_score[2]++; 		else if(score[i][1] < 90) 			Count_score[3]++; 		else 			Count_score[4]++; 	} }  double Get_Pass_Rate(int score[][2],int len) { 	int i,count=0; 	for(i=0;i<len;i++) 	{ 		if(score[i][1] < 60) 			count++; 	}  	return 1-(double)count/len; }  void sort_decline(int score[][2],int len) { 	int temp[2]; 	int i=0,k=0;  	for(i;i<len;i++) 	{ 		for(k=len-2;k>=i;k--) 		{ 			if(score[k][1]<score[k+1][1]) 			{ 				temp[0] = score[k][0];temp[1]=score[k][1]; 				score[k][0] = score[k+1][0];score[k][1]=score[k+1][1]; 				score[k+1][0]=temp[0];score[k+1][1]=temp[1]; 			} 		} 	} }  void Print_Score(int score[][2],int len) { 	int i=0; 	for(i;i<len;i++) 	{ 		printf("%d\t%d\r\n",score[i][0],score[i][1]); 	} }

第一题我已经写完了，求大佬们教一个后面三题#include "stdio.h" int Array2Max(int x[][2],int n) {     int max,i;     max=x[0][1];     for(i=1;i<n;i++)     {         if(max<x[i][1])         {             max=x[i][1];         }     }     return(max); } int Array2Min(int x[][2],int n) {     int min,i;     min=x[0][1];     for(i=1;i<n;i++)     {         if(min>x[i][1])         {            min=x[i][1];         }     }     return(min); } int Average(int x[][2],int n) {     int i,sum;     float average;     sum=0;     for(i=0;i<n;i++)     {        sum+=x[i][1];        average=sum*1.0/n;      }      printf("average=%f\n",average);  }   int main(void) {     int score[24][2]={ 				{50107101,	80}, 				{50107102,	85}, 				{50107104,	89}, 				{50107105,	80}, 				{50107106,	56}, 				{50107107,	89}, 				{50107108,	89}, 				{50107109,	82}, 				{50107110,	81}, 				{50107111,	90}, 				{50107112,	80}, 				{50107113,	89}, 				{50107114,	43}, 				{50107115,	82}, 				{50107116,	82}, 				{50107117,	96}, 				{50107118,	92}, 				{50107119,	90}, 				{50107120,	82}, 				{50107121,	9}, 				{50107122,	89}, 				{50107123,	82}, 				{50107124,	88}, 				{50107125,	90} 			};     int max,min,grade[5]={0};     max=Array2Max(score,24);     printf("max=%d\n",max);     min=Array2Min(score,24);     printf("min=%d\n",min);     float average;     average=Average(score,24）；

这是那个数组int main(void) {     int score[24][2]={ 				{50107101,	80}, 				{50107102,	85}, 				{50107104,	89}, 				{50107105,	80}, 				{50107106,	56}, 				{50107107,	89}, 				{50107108,	89}, 				{50107109,	82}, 				{50107110,	81}, 				{50107111,	90}, 				{50107112,	80}, 				{50107113,	89}, 				{50107114,	43}, 				{50107115,	82}, 				{50107116,	82}, 				{50107117,	96}, 				{50107118,	92}, 				{50107119,	90}, 				{50107120,	82}, 				{50107121,	9}, 				{50107122,	89}, 				{50107123,	82}, 				{50107124,	88}, 				{50107125,	90} 			};


Question: 求助

for example int main() {     int a[10]={1,2,3,4,5,6,7,8,9,0};     int max=0, min=0, i;     for (i=0; i<10; i++) {         //scanf("%d", &a[i]);         if (a[i] > a[max])             max = i; //保存最大数的位置         if (a[i] < a[min])             min = i; //保存最小数的位置     }     printf("交换前的数组：");     for (i=0; i<10; i++)         printf("%d ", a[i]); ;     if (max != min) { //交换最大最小         i = a[max];         a[max] = a[min];         a[min] = i;     }       printf("\n交换后的数组：");     for (i=0; i<10; i++)         printf("%d ", a[i]);          return 0; }


Question: 一个插入数据的问题

引用 2 楼 chxchxkkk的回复:scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]); scanf("%d",&a[i]);  这几句看着很难受 for (i=0; i<10; i++) {     scanf("%d", &a[i]); } 这样赋值吧 这样赋值是为了输入数据用逗号隔开

引用 1 楼 寻开心的回复:int i; //这里的i没有初始化， 是个随机数了 scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]); scanf("%d",&a[i]);// 这里不知道把数据读到哪儿去了。这里应该是  &a[9]  实际是只是输入了9个有效数字； 第十个输入结果是未知的 后面排序的结果也就未知了 谢谢！问题解决了


Question: 能帮忙看一下嘛 编译编译通过 但是没有运行结果

引用 6 楼 5250的回复:#include<stdio.h> #include<stdlib.h> struct Student { int num; char name[20]; float score[3]; }stu[5]; int main() { FILE *fp1,*fp2; struct Student temp; int i,j,t; float aver_score[5]; if((fp1=fopen("D:\\CC\\stud.txt","r"))==NULL)//打开文件"stud.txt"  { printf("can't open file\n"); exit(0); } for(i=0;i<5;i++); //啥时候的for循环要加分号了？ {  fscanf(fp1,"%d %s %6.2f %6.2f %6.2f",stu[i].num,stu[i].name,// 从fp1指向的文件读入一组数据      加&        stu[i].score[0],stu[i].score[1],stu[i].score[2]);       printf("%d %s %6.2f %6.2f %6.2f\n",stu[i].num,stu[i].name,// 在屏幕上输出数据     stu[i].score[0],stu[i].score[1],stu[i].score[2]); } for(i=0;i<5;i++) {   aver_score[i]=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;}//求每个学生三科成绩的平均分  for(i=0;i<4;i++) {   t=i;    for(j=i+1;j<5;j++)    if(aver_score[t]<aver_score[j]) t=j;//按平均分排序   temp=stu[i];  stu[i]=stu[t];  stu[t]=temp; } if((fp2=fopen("D:\\CC\\stu_sort.txt","w"))==NULL)//打开文件”stu_sort.txt"  { printf("can't open file\n"); exit(0); } for(i=0;i<5;i++); /////////****************** 分号分号 {  fprintf(fp2,"%d %s %6.2f %6.2f %6.2f %c",stu[i].num,stu[i].name,//将排序后的数据写入        stu[i].score[0],stu[i].score[1],stu[i].score[2],'\n');    printf("%d %s %6.2f %6.2f %6.2f\n",stu[i].num,stu[i].name,    stu[i].score[0],stu[i].score[1],stu[i].score[2]); } fclose(fp1); fclose(fp2); return 0; } 谢谢啊 已经改对了 读数据的时候不需要限制格式 不然读入数据不对

引用 4 楼 chxchxkkk的回复:fscanf读取数据要用 &，char[]不用，比如 &stu.num, stu.name 忽略了 谢谢 不过还是得不到想要的结果

引用 1 楼 user-3的回复:你是不是用文字先描述下想干啥？是求每个人的平均分还是求每科的平均分？ 5个学生 3课成绩 求学生的平均分 谢谢

引用 1 楼 user-3的回复:你是不是用文字先描述下想干啥？是求每个人的平均分还是求每科的平均分？ #include<stdio.h> #include<stdlib.h> struct Student { 	int	num; 	char name[20]; 	float score[3]; }stu[5]; int main() { 	FILE *fp1,*fp2; 	struct Student temp; 	int i,j,t; 	float aver_score[5]; 	if((fp1=fopen("D:\\CC\\stud.txt","r"))==NULL)//打开文件"stud.txt"  	{ printf("can't open file\n"); 	exit(0); 	} 	for(i=0;i<5;i++); 	{  fscanf(fp1,"%d %s %6.2f %6.2f %6.2f",stu[i].num,stu[i].name,// 从fp1指向的文件读入一组数据  		      stu[i].score[0],stu[i].score[1],stu[i].score[2]); 	   printf("%d %s %6.2f %6.2f %6.2f\n",stu[i].num,stu[i].name,// 在屏幕上输出数据  		   stu[i].score[0],stu[i].score[1],stu[i].score[2]); 	} 	for(i=0;i<5;i++) 	{   aver_score[i]=(stu[i].score[0]+stu[i].score[1]+stu[i].score[2])/3.0;}//求每个学生三科成绩的平均分  	for(i=0;i<4;i++) 	{   t=i; 	   for(j=i+1;j<5;j++) 		   if(aver_score[t]<aver_score[j]) t=j;//按平均分排序  		 temp=stu[i]; 		 stu[i]=stu[t]; 		 stu[t]=temp; 	} 	if((fp2=fopen("D:\\CC\\stu_sort.txt","w"))==NULL)//打开文件”stu_sort.txt"  	{ printf("can't open file\n"); 	exit(0); 	} 	for(i=0;i<5;i++); 	{  fprintf(fp2,"%d %s %6.2f %6.2f %6.2f %c",stu[i].num,stu[i].name,//将排序后的数据写入  		      stu[i].score[0],stu[i].score[1],stu[i].score[2],'\n'); 	   printf("%d %s %6.2f %6.2f %6.2f\n",stu[i].num,stu[i].name, 		   stu[i].score[0],stu[i].score[1],stu[i].score[2]); 	} 	fclose(fp1); 	fclose(fp2); 	return 0; }

你是不是用文字先描述下想干啥？是求每个人的平均分还是求每科的平均分？


Question: 写入位置时发生冲突，如图，该冲突如何解决，求解

引用 1 楼 user-1的回复:从头到尾你就只在开始的时候用malloc申请了一个结点，后面空指针肯定报错 已解决，3Q

从头到尾你就只在开始的时候用malloc申请了一个结点，后面空指针肯定报错


Question: 求大佬帮忙解释这个二进制的问题

打印过程中发生了从char到unsigned int的转换，这种转换默认是按照符号扩展的，也就是11111111会变成1111111.......1111 和下面代码等价  unsigned u = c; printf("u = %u\n", u);

printf("c = %u\n", (unsigned char)c);即可  但是这个用法是不安全的。  #include <stdio.h>  int main(void) {         char c = -1;         int i = -1;         char bytes[4] = {0};         bytes[0] = c;         printf("c = %u\n", *(unsinged int*)bytes);         printf("i = %u", i);          return 0; }

别的不说，你是真的sm,gcs,嘻嘻[大哭

类型提升，-1（char)提升到int是-1，再提升到unsigned int

%u的作用就是把要输出的数按照无符号整型的方式输出，所以char类型会转换为unsigned int，如果还想以char类型输出，则可以考虑使用如下方法 printf("%hhx", c); 此时的输出是ff 请参考《C++中printf()函数的用法3》 希望能够帮到你！

打印修改为 printf("c = %u\n", (unsigned char)c); 就好。  printf为可变参函数，打印的类型，数目就是靠格式串判定的，所以碰到%u,就会取4字节数据出来。

%u是无符号int类型，c是被转成无符号int类型输出。 要想得到unsigned char就应该把c先转成正数（这步很关键），否则负数会自动保持符号位，再按类型所占字节扩展，就得不到你想要的结果。 即 printf(“c=%u\n”, 0x00FF & c); //清除符号位再扩展

我感觉是不是我问的问题太难了，都没多少人回答...


Question: 队列的一道题，求用c语言

#include <stdio.h> #include <stdio.h> #define MAXSIZE 100  typedef struct {     int score;     struct LinkList *next; } * LinkList;  //创建节点 LinkList CreateList() {     LinkList head = (LinkList)malloc(sizeof(LinkList));     head->score = -1;     head->next = NULL;     return head; }  //插入节点 LinkList insertNode(LinkList head, int num) {     LinkList node = head;     printf("begin head:%d node:%d ",head,node);     while (node->next != NULL)     {         node = node->next;     }     LinkList pnode = (LinkList)malloc(sizeof(LinkList));     pnode->score = num;     pnode->next = NULL;     node->next = pnode;     printf("end head:%d node:%d\n",head,node);     return head; }  int main() {     int num;     int arr[MAXSIZE];     LinkList head1 = CreateList(); //保存奇数     LinkList head2 = CreateList(); //保存偶数     printf("input number of link:");     scanf("%d", &num);     for (int i = 0; i < num; i++)     {         scanf("%d", &arr[i]);         if (arr[i] % 2 == 0)         {             head2 = insertNode(head2, arr[i]);         }         else         {             head1 = insertNode(head1, arr[i]);         }     }     LinkList pNode1 = head1->next;     LinkList pNode2 = head2->next;     while (pNode1!=NULL && pNode2!=NULL)     {         printf("%d %d\n", pNode1->score,pNode2->score);         pNode1 = pNode1->next;         pNode2 = pNode2->next;     }     return 0; }

引用 4 楼 Robinhood169的回复:就是可不可以用rear,front类型的队来做啊 啥意思  用双向链表？

引用 3 楼 Robinhood169的回复:有一点不对啊 哪儿不对，有啥问题？

就是可不可以用rear,front类型的队来做啊

这题看起来很难，估计没几个人能做出来！

有一点不对啊


Question: 求教一个C语言问题，给定一个字符串，怎么按单词的长度排序

代码的问题是 局部变量在函数调用完后自动释放了，数据不能返回，改成全局变量可以解决，小白的我是靠单步调试发现的问题。

这不是很简单吗，先按空格分割（最后一个以结束符‘\0’为标识分割），然后strlen()按照大小排列一下就行。

先得到每一个单词，然后再按照字符串长度排序～

哪位大神 帮我看看 当执行3的时候 报乱码，是怎么回事？谢谢了。  //cpp11.13.11 void menu() { 	printf("=================================================\n"); 	printf("1.打印源字符列表	2.ASCII顺序打印\n"); 	printf("3.按长度递增打印	4.按第一个单词长度打印\n"); 	printf("5.退出\n"); 	printf("=================================================\n"); 	printf("请输入选项："); } void remove_blank_char_only_save_one(char* s, char* ret) { 	int m = 0; 	int i;  	for (i = 0; s[i] != '\0';) { 		//注意判断字符的空格要使用单引号' ',不能使用双引号 		if (s[i] == '\t') { 			s[i] = ' '; 		} 		if (isblank(s[i])) { 			ret[m] = s[i]; 			m++; 			i++; 			while (isblank(s[i])) { 				i++; 			} 		} 		else { 			ret[m] = s[i]; 			m++; 			i++; 		}  	} 	ret[m] = '\0'; } void remove_blank_on_start(char* s) { 	if (s == NULL || *s == '\0') 	{ 		return s; 	}  	int len = 0; 	char* p = s; 	while (*p != '\0' && isspace(*p)) 	{ 		++p; 		++len; 	}  	memmove(s, p, strlen(s) - len + 1);  } void remove_blank_on_end(char* s) { 	if (s == NULL || *s == '\0') 	{ 		return s; 	}  	int len = strlen(s); 	char* p = s + len - 1; 	while (p >= s && isspace(*p)) 	{ 		*p = '\0'; 		--p; 	} } int get_str_words_num(char* s, int n) {  	for (int i = 0; i < strlen(s); i++) { 		if (s[i] == ' ') { 			n++; 		} 	} 	return n + 1; } void sort_str_by_word_len(char* s, char(*des)[10], int num) { 	int j = 0, i, k = 0; 	char t[50];//临时数组，用于交换 	for (int i = 0; i <= strlen(s); i++) { 		if (s[i] != ' ') { 			//以空格分割每个单词，当遇到空格之前，把空格之前的字符存到一个二维数组中 			des[j][k++] = s[i]; 		} 		else { 			//当遇到空格时，添加第一个一维级数组的结束标志，并将J加1开始第二一维数组的赋值，并让K的值归0，从头开始计算。 			des[j][k] = '\0'; 			j++; 			k = 0; 		} 	} 	//使用冒泡法，根据二维数组中各个一维数组的长度进行排序 	for (int m = 0; m < num; m++) { 		for (int n = 0; n < num - m - 1; n++) { 			if (strlen(des[n]) > strlen(des[n + 1])) { 				strcpy(t, des[n]); 				strcpy(des[n], des[n + 1]); 				strcpy(des[n + 1], t); 			} 		} 	} }  void case2(char* s) { 	//冒泡排序法 	char temp; 	char res[50]; 	strcpy(res, s); 	for (int i = 0; i < strlen(res); i++) { 		for (int j = 0; j < strlen(res) - i - 1; j++) { 			if (res[j] > res[j + 1]) { 				temp = res[j]; 				res[j] = res[j + 1]; 				res[j + 1] = temp; 			} 		} 	} 	printf("%s\n", res); } void case3(char *s) { 	char dst[10][50]; 	char res[50]; 	int n_words = 0; 	strcpy(res, s); 	char* temp = res; 	remove_blank_char_only_save_one(s, temp); 	remove_blank_on_start(temp); 	remove_blank_on_end(temp); 	n_words = get_str_words_num(temp, n_words); 	sort_str_by_word_len(temp, dst, n_words); 	for (int i = 0; i < n_words; i++) { 		printf("%s ", dst[i]); 	} 	printf("\n"); }   void myprint(char* s) { 	int num; 	 	menu();  	while (scanf("%d", &num) == 1) { 		switch (num) { 		case 1: 			printf("%s\n", s); 			break; 		case 2: 			case2(s); 			break; 		case 3: 			case3(s);  			 			break;  		case 4:  			break; 		case 5: 			printf("bye!"); 			return; 		default: 			printf("请输入正确的选项！\n"); 			break; 		} 		menu(); 	} 	 } void cpp11_13_11() { 	char ch; 	char str[50]; 	int i = 0;  	printf("please input 10 char:\n"); 	while (i < 49) { 		ch = getchar(); 		str[i] = ch; 		if ((str[i] == '\n') && (str[i - 1] == '\n')) { 			break; 		} 		i++; 	} 	str[i] = '\0'; 	setbuf(stdin, NULL); 	myprint(str); }

先分割成字符串数组，然后按长度排序，最后再按排序后的顺序连接字符串


Question: 语言中使用全局变量int**a，能否在一个void类型的函数中完成动态内存分配？以及，相应地在其它void类型的函数中完成赋值，释放内存的操作

谢邀， 不要把内存想得那么复杂，你申请一块内存，那就是一个连续的空间 【至少从进程或者程序员的视角，他是连续的，（可能在物理上并不一定连续，但是没关系，这种转换，操作系统会帮你完成）】。 没错，一长串连续的东西。 只是你怎么操作他是你的事，这是编程中一个绕人的东西。 想象一个4 X 5 = 20cm的绳子，你把它折起来，之字形回折，【每到5cm处折一次】  假设不够直观，你在折角处把他剪断，然后摆平整【但是你要记住，他们再内存中还是连续的】 现在他是一个4 X 5的矩阵了 本来嘛,这样就搞定了 int *p = (int *)malloc(sizeof (int ) * 20); for(int i = 0; i < 4; i++){     for(int j = 0; j < 5; j++){         *p++ = i*5 +j;     } }  但是你非有强迫症，想用二维数组， 告诉你，没有这样的操作，除非你手动像编译器一样去构造这样的东西 二维数组  int a[4][5]; 实际上是什么样的东西呢？ 你不要以为他是简单的二重指针 int **p = a; 这样你就大错特错了，二重指针不是这样设计来操作二维数组的，相信我从今天开始放弃这个想法。 二维数组，用指针来表达是什么样的东西呢，是数组指针。 int (*p)[5];  这不是新手能看懂的东西。 他是一个指针，，指向一个数组类型， ===注意 在C89标准下：      而且这个数组类型的大小必须指定， 比如int (*p)[5]; 这个5必须指定     你不能定义这样的指针  int (*p)[];  又或者是int (*p)[n]; //n是运行时指定的       因为对编译器来说，你代码这样写 p++, 他必须知道地址得往后跳多少个字节，      对于int (*p)[5] 来说，p++ ， 就是p往后跳5个整数， === ~~~ 【平时看到的指针是指向int， char 这些基本类型】，不是像你所想像的一维数组里面放N个指针。 ，如果你对a[i][j]这种风味的东西总是念念不忘， 很抱歉C89标准不支持动态的二维数组，办不到。 C99可以支持动态数组，编译的时候加上--std=c99， 如果你的编译器不支持c99，又或者你用vc之类的，而你又不知道怎么开启c99编译选项，请忘了他吧。不要做这种尝试。 事情没你想的那么复杂，不要过度想象。。。要理解本质。 以下代码在C99编译器下可以运行，【大部分代码直接拷贝你的，然后做修改，按你的意图去实现，你可以体会一下】 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <stdio.h> #include <stdlib.h> void creat(void **a, int m, int n); void fre(void *a); void show(int m, int n, int (*a)[n]);  int main() {     int m, n;     scanf("%d%d", &m, &n);     /*你能想象为什么malloc出来的指针都是void类型的，     都是程序员人为的给他强制转换， 随意揉捏     你认为他是圆的他就是圆的，你认为他是扁的他就是扁的     但是，实质上，他是一条线，就是一段连续的内存，------------------------这样*/      int (*a)[n];      creat((void**)&a, m, n);     show(m, n, a);     fre((void*)a);     return 0; }  /**/ void creat(void **p, int m, int n) // {     *p = malloc(sizeof(int) * m * n);// }  void fre(void *a) {     free(a);//想清楚，为什么这里free的时候不用二重指针，         //回忆一下刚才怎么申请内存的，一次free对应一次malloc } void show(int m, int n, int (*a)[n]) {     int i, j;     for (i = 0; i < m; i++)         for (j = 0; j < n; j++)             scanf("%d", a[i] + j);      for (i = 0; i < m; i++)         for (j = 0; j < n; j++)         {             printf("%d", a[i][j]);             if (j < n - 1)                 printf(" ");             else                 printf("\n");         } }  程序执行结果

没搞清形参，实参  要使实参生效，再加一重指针，调用时传入a的地址


Question: 求大佬帮忙看一下把c++改成c语言中的错误！

C新标中可以用变量定义数组长度，而C++没有这个标准。 要改成动态分配，或者直接使用容器比如std::vector。

引用 5 楼 m0_46108109的回复:free（sM）； 明白了，多谢啦～

free（sM）；

引用 1 楼 user-3的回复:char *sM = (char *)malloc(L+1); 嗯嗯感谢 请问下面还有一句delete sM； 该怎么修改呢？

char *sM = (char *)malloc(L+1);


Question: 文件系函数求解

引用 1 楼 user-1 的回复:https://blog.csdn.net/COCO56/article/details/80725091?utm_source=blogxgwz3谢谢


Question: 相邻的素数

简单代码自己写 弄个判断是否素数的函数， 然后从已知的这个3或者11， 分别向大小两个方向，循环去找素数就好了  或则如果知道范围，比如100以内的，那就提前把所有的素数都算出来放到一个数组里面，然后从中找一样  不难，自己写代码吧


Question: 来个大佬看看,使用vs2010 c编程后运行输入参数后，按回车直接退出

看起来是一定会走到printf的呀，你确认保存编译了？

引用 6 楼 ek11one 的回复:加这个system("pause")好像可以了 但是其他的不行  你这是编译运行的吧，不是在ide里运行的吧，所以程序结束后就自动关闭cmd窗口了 本来用getchar也可以让程序暂停的（IO阻塞），只是你前面的输入里有回车符残留在输入缓存，所以getchar直接拿到回车符继续往下运行而结束程序了，所以在程序的最后用system("pause")可以让程序暂停不结束 你说的其他不行是指什么？是指getchar不行？那你在getchar之前加上fflush(stdin)试试，清空输入缓存

加这个system("pause")好像可以了 但是其他的不行

引用 1 楼 arfi 的回复:看起来是一定会走到printf的呀，你确认保存编译了？确定 感觉不是代码问题 是其他问题 我换其他的代码上去,也是只编译输入不编译输出

#include<stdio.h> //void main() int main() {     int year;     int month,maxmonth=12;     int day,maxday;     printf("请输入年份：(1000~3000)");     scanf("%d",&year);     //if(year<1000 || year>3000)     while (year<1000 || year>3000)     {         printf("输入错误！请从新输入！\n");         printf("请输入年份：(1000~3000)");         scanf("%d",&year);     }     printf("请输入月份：(1~12)");     scanf("%d",&month);     //if(month<1 || month>12)     while (month<1 || month>12)     {         printf("输入错误！请从新输入！\n");         printf("请输入月份：(1~12)");         scanf("%d",&month);     }     if(month==4||month==6||month==9||month==11)         maxday=30;     else if(month==2)     {         //if(year%400==0 || year%4==0)         if(year%400==0 || (year%4==0 && year % 100 != 0))             maxday=28;         else             maxday=29;     }     else         maxday=31;     printf("请输入日份：(1~31)");     scanf("%d",&day);     //if(day<1 || day>maxday)     while (day<1 || day>maxday)     {         printf("输入错误！请从新输入！\n");         printf("请输入日份：(1~31)");         scanf("%d",&day);     }     if(month==maxmonth && day==maxday)     {         year=year+1;         month=1;         day=1;     }     else if(day==maxday)     {         month=month+1;         day=1;     }     else         day=day+1;     printf("下一天是%d年%d月%d日",year,month,day);     getchar();  } 供参考～

按下“Enter”键，缓冲区内会有“换行”字符，这也会被getchar()取走，你可以试试调用两次getchar()，或者调用system("pause");（需要包含头文件#include <Windows.h>）


Question: 输入两个不相等的正整数，求两个正整数区间（包含这两个正整数在内）的所有素数。

C++环境，输出时只输出结果

#include <stdio.h>  int IsPrime(int x) {     if (x < 2)return 0;     for (int i = 2; i < x; i++)     {         if (x % i == 0)             return 0;     }     return 1; }  void PrintPrime(int m, int n) {     int count = 0;     int k = 0;     for (int i = m; i <= n; i++)     {         if (IsPrime(i))         {             printf("%d ", i);             k++;             count++;         }         if (k == 5)         {             printf("\n");             k = 0;         }     }     if(!count)printf("no prime in the area"); }  int main() {     int m, n;     printf("input two number:");     scanf("%d %d", &m, &n);     if (m < n)     {         PrintPrime(m, n);     }     else     {         PrintPrime(n, m);     }     return 0; }

顶顶顶顶顶顶顶

顶顶顶顶顶顶顶

有没有大神  求解

不是我的意思是   输出结果中间用逗号隔开


Question: C语言数据结构多项式相加运算

/*AddList 函数未做修改 楼主自行解决*/ 1.创建节点时 内存分配有问题 2.输入时对弈系数的接收格式有问题 3.输出函数判断条件有问题 4.排序函数  结点比较条件有问题，结点之间交换有问题 /*以下程序已对上述问题作出更正 剩余 ADDList 请参照程序自行解决*/   #include <stdio.h> #include <stdlib.h> #include <math.h> #include <malloc.h>  typedef struct polynode {     int exp;     float coef;     struct polynode *next; }polynode,*polypointer;  polypointer CreateList(polypointer Head,int n){     polypointer NewNode;     polypointer pre;      pre = Head;     for(int i=1;i<=n;i++)     {         NewNode=(polypointer)malloc(sizeof(polynode));     	NewNode->next=NULL;//创建一个结点 输入一个数据结点          printf("请输入<第 %d 位>指数\n",i);         scanf("%d",&NewNode->exp);         printf("请输入系数:例如 2.5\n");         scanf("%f",&NewNode->coef);         pre->next=NewNode;         pre=NewNode; 	}     return Head; } void PrintList(polypointer h){ 	polypointer p; 	p=h->next;     while(p!=NULL)//if语句只会执行一次      { 		printf("%.2f*X^%d ",p->coef,p->exp); 		p=p->next; 		printf("\n");     } }  void bubble_sort(polypointer head,int o){ 	polypointer prepre,pre,p,temp; 	//开始位置 prepre,pre,p   表示 Head,1,2 	/*冒泡排序*/ 	for(int i=1;i<=o-1;i++) 	{ 		prepre = head;  		pre=head->next;//每比较一次，指针指向最链表第一个，第二个结点位置  		p=pre->next;  		for(int j=2;j<=o;j++) 		{	//利用幂函数计算结点值     			if(pow(pre->coef,pre->exp)>pow(p->coef,p->exp))//比较的应该是结点内部存储的结点值 而不是结点本身  			{ 				/*如果前驱结点 大于 后继结点 交换位置*/ 				prepre->next = p; 				temp = p->next; 				p->next = pre; 				pre->next = temp; 			} 			prepre = pre;//指针后移  			pre=p; 			p=p->next;	   		}	 	}  }  polypointer AddList(polypointer head1,polypointer head2){ 	polypointer p,q,c,head3; 	int x; 	p=head1->next; 	q=head2->next; 	c=(polypointer)malloc(sizeof(struct polynode)); 	head3=c; 	c=head3->next; 	while(p!=NULL&&q!=NULL) 	{ 		if(p->exp==q->exp)  		{ 			 x=p->coef+q->coef; 			 c->coef=x; 			 c->exp=p->exp; 			 c=c->next; 			 p=p->next; 			 q=q->next; 		} 		else if((p->exp)>(q->exp)) 		{ 			c->coef=q->coef; 			c->exp=q->exp; 			q=q->next; 			c=c->next; 		} 		else if((p->exp)<(q->exp)) 		{ 			c->coef=p->coef; 			c->exp=p->exp; 			p=p->next; 			c=c->next; 		} 	} 	c=head3; 	return c; }  int main(){   int m,n;   polypointer a=(polypointer)malloc(sizeof(polynode));   a->next = NULL;   polypointer b=(polypointer)malloc(sizeof(polynode));   b->next = NULL;   polypointer c=(polypointer)malloc(sizeof(polynode));   c->next = NULL;    printf("请输入多项式 A 的项数 : \n");   scanf("%d",&m);   a=CreateList(a,m);    printf("请输入多项式 B 的项数 : \n") ;   scanf("%d",&n);   b=CreateList(b,n);    /*功能函数测试输出*/   printf("输出A-------\n");   PrintList(a);    printf("输出B*******\n") ;   PrintList(b);    /*功能函数测试输出*/   bubble_sort(a,m);   printf("输出A排序后**\n") ;   PrintList(a);    bubble_sort(b,n);   printf("输出B排序后**\n") ;   PrintList(b);    /*AddList 函数未做修改 楼主自行解决*/   c=AddList(a,b);   printf("输出B******* \n") ;   PrintList(c);   return 0; }


Question: 编译通过但是无运行结果 谢谢！

引用 3 楼 菜鸡要会飞的回复:没打印怎么运行。。 打印啦 有错误结果  找到错误点了 谢谢

没打印怎么运行。。

想打开文件读入并打印出来 将排序后的结果写进文件

想打开文件读入并打印出来 再排序写进文件


Question: 逻辑表达式

等价于!bool(x)

说错了，!x 等价于 x==0

布尔类型是0为false，非0为true 所以 !x 等价于 x!=0


Question: while(1)段出现问题如何解决？

#include <stdio.h> #include <stdlib.h>  struct student_info {     char snum[20];     char sname[30];     char sclass[30]; };  typedef struct student_info   stu;   int main(void) {     stu    p1[10];     FILE   *fp=NULL;     int    i,x;     fp=fopen("students.txt","r");     if(fp==NULL)     {   printf("\n文件打开失败。");         return 0;     }     i=0;     //fscanf(fp,"%s%s%s",&p1[i].snum,&p1[i].sname,&p1[i].sclass);     fscanf(fp,"%s%s%s", p1[i].snum, p1[i].sname, p1[i].sclass);     while(feof(fp)==0)     {         printf("%s\t%s\t%s\n",p1[i].snum,p1[i].sname,p1[i].sclass);         i++;         //fscanf(fp,"%s%s%s",&p1[i].snum,&p1[i].sname,&p1[i].sclass);         fscanf(fp,"%s%s%s",p1[i].snum,p1[i].sname,p1[i].sclass);     }     printf("\n\n------------------------\n");      while(1)     {         printf("被点到的学生是：");         x=rand()%10;         //print("%s\t%s\t%s\n",p1[x].snum,p1[x].sname,p1[x].sclass);         printf("%s\t%s\t%s\n",p1[x].snum,p1[x].sname,p1[x].sclass);         system("pause");     }     fclose(fp);     return 0; } 供参考～

print改为printf


Question: 求助

16进制和10进制等一样，只是数字的表现形式，和数据类型无关吧

引用 1 楼 user-3 的回复：0x03吗？ 还是字母O是数字0，不是字母O，我才知道555

引用 1 楼 user-3 的回复：0x03吗？ 还是字母O就是16进制的3呀

这问题问的。。。

0x03吗？ 还是字母O


Question: 在C语言程序中主函数main()在程序中的位置问题

有且只有一个main(),不管它在哪个位置，都会先运行它

楼主是想写个博客吗？

描述的基本是没问题的。给予肯定～编译的时候编译器会自动去找main，比如你不定义main，看看编译器提示错误不。main函数是对应程序运行的入口

so the question is ？


Question: 奇怪的数组题

引用 6 楼 bo_self_effacing的回复:#include <iostream> #include <math.h>  double cal_fun(double); double make_double_int(double);  static const int RATE_NUMS = 3; static const double amounts[RATE_NUMS] = {0,5000,10000}; static const float rate[RATE_NUMS] = {0.08,0.10,0.12}; static const double limit[RATE_NUMS] = {0,5000*0.08,5000*0.08+(10000-5000)*0.10}; static const double SLARY = 5000;  using std::cout; using std::endl;  int main() {  	unsigned int nums = 0; 	while(!nums) 		scanf("%d",&nums); 	double results[nums]; 	double param = 0; 	int i; 	for(i = 0;i < nums;i++) 	{ 		scanf("%lf",¶m); 		results[i] = cal_fun(param); 	} 	for(i = 0;i < nums;i++) 	{ 		cout<<results[i]<<endl; 	} 	return 0; }  double cal_fun(double n) { 	if(n <= SLARY) 		return 0; 	double real_n = n - SLARY; 	double ret(0); 	for(int i = RATE_NUMS - 1; i >= 0; i--) 	{ 		if(real_n > limit[i]) 		{ 			ret += (real_n - limit[i])/rate[i]; 			/*printf("real_n: %f, i: %d, amounts[i]: %f, rate[i]: %f, limit[i]: %f, ret: %f\n", 					real_n,i,amounts[i],rate[i],limit[i],ret);*/ 			real_n = limit[i]; 		} 	} 	return make_double_int(ret + 0.5); }  double make_double_int(double src) { 	double bitnum = fmod(src,10); 	//int int_bitnum = bitnum + 0.5; //四舍五入 	int int_bitnum = bitnum; //去尾 	return src - bitnum + int_bitnum; }  不错c++很漂亮但我其实没怎么看懂。。

引用 5 楼 前行者001的回复:/*多谢楼主提醒      程序已更正*/  #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 /* run this program using the console pauser or add your own getch, system("pause") or input loop */  float Fun(float price) { 	float sum = 0.0;  	price = price - 5000;  	if(price < 5000*0.08) 		sum += price/0.08; 	else if(price >= 5000*0.08 && price <= 5000*0.08 + 5000*0.10) 	{ 		sum += 5000; 		sum += (price-5000*0.08)/0.10; 	} 	else 	{ 		sum = sum + 5000; 		sum = sum + 5000; 		sum = sum + (price - 5000*0.08 - 5000*0.10)/0.12;  	} 	return sum; }    int main() {  	printf("请输入想要获得的佣金金额\n"); 	int n = 0; 	float price[MAXSIZE] = {0.0};   	scanf("%d",&n);  	for(int i = 0;i < n;i++)  	scanf("%f",&price[i]);  	for(int i = 0;i < n;i++)  	price[i] = Fun(price[i]);  	for(int i = 0;i < n;i++)  	printf("%.d ",(int)price[i]); 	return 0; }  运行结果  嗯对了float改为double更妙而且最后不用进行类型转换吧改成%.0lf就可以了

引用 3 楼 前行者001的回复:你好，题中给出的测试数据好像有点小问题。  (460833-10000)*0.12 +5000*0.10 + 5000*0.08 = 55000 != 60000; （210833 - 10000）*0.12 + 5000*0.10+5000*0.08 = 25000 ！=30000 不知道是不是我的理解有问题  #include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 /* run this program using the console pauser or add your own getch, system("pause") or input loop */  float Fun(float price) { 	float sum = 0.0;  	if(price < 5000*0.08) 		sum += price/0.08; 	else if(price >= 5000*0.08 && price <= 5000*0.08 + 5000*0.10) 	{ 		sum += 5000; 		sum += (price-5000*0.08)/0.10; 	} 	else 	{ 		sum = sum + 5000; 		sum = sum + 5000; 		sum = sum + (price - 400 - 500)/0.12;  	} 	return sum; }    int main() {  	printf("请输入想要获得的佣金金额\n"); 	int n = 0; 	float price[MAXSIZE] = {0.0};   	scanf("%d",&n);  	for(int i = 0;i < n;i++)  	scanf("%f",&price[i]);  	for(int i = 0;i < n;i++)  	price[i] = Fun(price[i]);  	for(int i = 0;i < n;i++)  	printf("%.d ",(int)price[i]); 	return 0; }   还有个基本工资5000啊

引用 1 楼 user-3的回复:一种是用静态数组 #define N 300 double res[N]; int main () {     int n;     scanf(“%d”, &n); //这里只要输入n不大于300即可     for (int k=0; k<n; n++) {         //res[k]=xxx     }     return 0; }  一种是用动态数组 int main () {     int n;     scanf(“%d”, &n); //这里只要输入n不大于300即可     double *res = (double *)malloc(sizeof(double)*n); //动态申请内存     for (int k=0; k<n; n++) {         //res[k]=xxx     }     free res; //释放内存     return 0; } 大佬你看题目了么。


Question: 求解！为什么打开文件是这样的？

引用 1 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h>  struct Student {     int num;     char name[20];     float score[3]; }stu[5];  int main() {     FILE *fp;     int i,j;float aver_score[3],temp=0;      printf("please enter data of students:\n");     for(i=0;i<5;i++)         scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);     for(j=0;j<3;j++)     {         for(i=0;i<6;i++)             temp += stu[i].score[j];         aver_score[j]=temp/6.0;         temp = 0;    //重新初始化     }     if((fp=fopen("D:\\CC\\stud.txt","w"))==NULL)     {         printf("can't open the file!\n");         exit(0);     }     for(i=0;i<5;i++)         fwrite(&stu[i],sizeof(struct Student),1,fp);     printf("\n");     for(i=0;i<3;i++)         fwrite(&aver_score[i],4,1,fp);     fclose(fp);     return 0; } 供参考～  打开文件是不是有乱码？因为你是用fwrite写入的，即二进制形式写入 知道了 谢谢！

知道了，谢谢！