Question: 用C语言实现此状态机的代码

引用 2 楼 Ruby0819的回复:没怎么测试，你看看吧，希望有帮助。   #include <stdio.h> #include <stdlib.h>  typedef enum {     KEY_ACT_1L = 0,     KEY_ACT_1R,     KEY_ACT_2L,     KEY_ACT_2R,     KEY_ACT_3L,     KEY_ACT_3R,      KEY_ACT_MAX }eKEY_ACT;  typedef enum {     LOCK_STS_LOCKED = 0,     LOCK_STS_KEY_A_IN,     LOCK_STS_KEY_B_IN,     LOCK_STS_ALARM,     LOCK_STS_UNLOCK,      LOCK_STS_MAX }eLOCK_STATUS;  #define eGET_ACT_STR( idx )     scpKEY_ACT_str[ ( idx ) ]  #define eGET_LOCK_STR( idx )    scpLOCK_STS_str[ ( idx ) ]  #define eGET_NEXT_MODE( currMode, act )   stMODE_TBL[ act ][ currMode ]  #define PTR                     printf_s   static const char *scpLOCK_STS_str [LOCK_STS_MAX] = {     "LOCK_STS_LOCKED",     "LOCK_STS_KEY_A_IN",     "LOCK_STS_KEY_B_IN",     "LOCK_STS_ALARM",     "LOCK_STS_UNLOCK",  };  static const char* scpKEY_ACT_str[KEY_ACT_MAX] = {     "KEY_ACT_1L",     "KEY_ACT_1R",     "KEY_ACT_2L",     "KEY_ACT_2R",     "KEY_ACT_3L",     "KEY_ACT_3R", };  static const eLOCK_STATUS  stMODE_TBL[6][3] = {     { LOCK_STS_KEY_A_IN,        LOCK_STS_ALARM,        LOCK_STS_ALARM      },     { LOCK_STS_ALARM,           LOCK_STS_ALARM,        LOCK_STS_ALARM      },     { LOCK_STS_ALARM,           LOCK_STS_ALARM,        LOCK_STS_UNLOCK     },     { LOCK_STS_ALARM,           LOCK_STS_ALARM,        LOCK_STS_ALARM      },     { LOCK_STS_ALARM,           LOCK_STS_ALARM,        LOCK_STS_ALARM      },     { LOCK_STS_ALARM,           LOCK_STS_KEY_B_IN,     LOCK_STS_ALARM      } };   int main( int argc, char* argv[] ) {     eLOCK_STATUS    curr_mode = LOCK_STS_LOCKED;     eKEY_ACT        e_act;     eLOCK_STATUS    next_mode;     int cnt = 0, input_num;       while ( 1 )     {         do         {             PTR( "\nPlease input No. of the password as the following: " );             for ( cnt = 0; cnt < KEY_ACT_MAX; cnt++ )             {                 PTR( "\n No.%01d %s ", cnt + 1, eGET_ACT_STR( cnt ) );             }             PTR("\n" );             scanf_s("%d", &input_num );             if ( (input_num <= 0) || (input_num > KEY_ACT_MAX) )             {                 e_act = KEY_ACT_MAX;                 PTR( "\n Your input is wrong!" );              }             else             {                 e_act = (eKEY_ACT)(input_num - 1);                 PTR( "\n Your input is right!" );             }         } while ( e_act == KEY_ACT_MAX );          next_mode =  eGET_NEXT_MODE ( curr_mode, e_act );          PTR("\ncurr = [%s] Act = [%s] nextmode= [%s] ",              eGET_LOCK_STR( curr_mode ),             eGET_ACT_STR( e_act ),             eGET_LOCK_STR( next_mode )             );          if ( next_mode == LOCK_STS_ALARM)         {                               PTR("\n Are you a pig?" );             break;         }         else if ( next_mode == LOCK_STS_UNLOCK )         {             PTR( "\n You are very clever." );             break;         }         else if ( next_mode >= LOCK_STS_ALARM )         {             PTR( "\n This is a bug." );             break;         }         else         {             /* Nothing to do */         }         curr_mode = next_mode;      };       return 0; }   感谢感谢，谢谢大佬

状态转换表都有了，用C语言做成表。 然后，初始化初始状态， 主循环查表， 到终态返回，就行了。


Question: 如何获取已封装完的函数内部的值

引用 3 楼 weixin_45985307 的回复:[quote=引用 1 楼 早打大打打核战争的回复:]int multiplication1 () {   // ...   return product; } 需要printf函数先打印然后再得到pro的值，直接return，printf就不执行了[/quote] 把return product放在printf后面就OK了。

引用 1 楼 早打大打打核战争的回复:int multiplication1 () {   // ...   return product; } 需要printf函数先打印然后再得到pro的值，直接return，printf就不执行了

int multiplication1 () { int product; int multiplication1A = rand() % 10;                           int multiplication1B = rand() % 10;                          //建立两个随机数 product = multiplication1A * multiplication1B; printf("%d * %d = ?\n", multiplication1A , multiplication1B);//打印问题 return producet; } 方法1  void multiplication1 (int *output) { int product; int multiplication1A = rand() % 10;                           int multiplication1B = rand() % 10;                          //建立两个随机数 product = multiplication1A * multiplication1B; printf("%d * %d = ?\n", multiplication1A , multiplication1B);//打印问题 *output = product; } 方法2 注意方法2需要传一个int类型的变量地址。


Question: 编写c程序，数组储存5个数，并按照输入的顺序输出

伪代码（不用数组）  int a,b,c,d,e; cin>>a>>b>>c>>d>>e; printf("%d %d %d %d %d\n",a,b,c,d,e);

//参考，自行修改下 #include <stdio.h> #define VALBUFF_LEN	5 double valBuff[VALBUFF_LEN]; int main(int argc, char *argv[]) { 	int i=0; 	int j=0; 	char ret=0; 	double maxVal=0; 	double minVal=0; 	//int valBuff[VALBUFF_LEN]; 	printf("数组最大最小值差值!\n"); 	do{ 		printf("请输入%d个数字!\n",VALBUFF_LEN); 		for(i=0;i<VALBUFF_LEN;i++) 		{ 			scanf("%lf",&valBuff[i]); 			printf("已输入数字:"); 			for(j=0;j<i+1;j++) 			{ 				printf("%lf ",valBuff[j]); 			} 			printf("\n"); 		}  		printf("\n"); 		//清空输入流 		{ 			char c=0; 			while(((c=getchar())!='\n')&&c!=EOF);	 		}  		ret = getchar(); 		putchar(ret);putchar('\n');putchar('\n'); 	}while(ret!='0'); 	return 0; }

基本的操作，看书


Question: 急急急，求速答

出现错误有提示的，看看错误的提示，认真对比代码就好了。你多输入了一个大括号。

#include<iostream> using namespace std; int main() { cout<<".................."<<endl; return 0; }


Question: 汉字姓名如何排序？

汉字有字符编码，是ASCLL的进阶，叫ANSI，你的大脑还在DOS时代

汉字的字符编码是按边旁来排序的

char *不管汉字不汉字，只当作字节序列处理，所以可以用strcmp比较大小，如果按汉字拼音或者姓氏笔画排序，需要一个对照表，网上能找到，搜“汉字拼音排序表”

引用 1 楼 早打大打打核战争 的回复:你需要怎样排序？按字符编码排序可以用strcmp，如果需要按拼音或者姓氏笔画排序则需要自己写比较函数汉字还有字符编码吗？ 似乎这个应该用汉语拼音排序。 自己怎么写，如何把汉字和拼音联系起来？


Question: 如何筛选无重复的一组数据

求解答！！！


Question: 初学者，求帮助

其实C语言好像支持输入八进制，就%o

别拿来主义啊兄弟，至少你自己画一部分，有啥错误我们帮你再看


Question: 一个选择结构的小题目不知道问题出在哪，看了一下午了没看出错误，望指点！！！

如果搞不清if else对应关系，建议把 { }加上。

#include <stdio.h> #include <stdlib.h>  int main() {     float x;     int w,y;      scanf("%f%d",&x,&y);      w = y/5 * 2;     if(x<=3) {         printf("%d",10+w);         return 0;     }     if(x<=10) {         y = 10+(x-3)*2;         printf("%d",(int)(y+0.5)+w);         return 0;     }     y=10+2*(10-3)+(x-10)*3;     printf("%d",(int)(y+0.5)+w);      return 0; }  供参考～

#include <stdio.h>  int main() {     float a,s;     int b,c,t;     scanf("%f%d",&s,&t);         if(s<=3)             a=10;         else if(s>3&&s<=10)              a=2*s+4;         else             a=3*s-6;         if(t<5)             b=0;         else             b=(t/5)*2;          c=(int)(a+b+0.5);         printf("%d",c);     return 0; 试试这个行不行

12行的else后面要加{      }  到下一个else结束


Question: 关于C语言出现答案错误求解     输入3个大整数，位数不超过100位，按从小到大的顺序输出这三个整数。要求定义并使用如下函数比较两个大整数的大小。

就像这个排序结果就错误了

#include<stdio.h> int cmp(char *a,char *b); #include<string.h> #define N 101 int main() {    	char a[N],b[N],c[N];    	gets(a);gets(b);gets(c);    	if(cmp(a,b)==1)    	{    	   if(cmp(a,c)>=0&&cmp(c,b)>=0)//a与c比较     	   {    	   	puts(b);puts(c);puts(a); 		  } 		  else if(cmp(c,b)==-1) 		  {puts(c);puts(b);puts(a); 	      } 	else if (cmp(a,c)==-1)  	{puts(b);puts(a);puts(c); 	 }      } 	if(cmp(a,b)==0) 	{ 		if(cmp(a,c)>=0)    	   {    	   	puts(c);    	   	puts(b);    	   	puts(a); 		  }    	   else if(cmp(a,c)==-1)    	   {    	   	puts(b);puts(a);puts(c); 		  } 	   }   	if(cmp(a,b)==-1) 	{ 		if(cmp(b,c)>=0&&cmp(a,c)>=0)    	   	{  puts(c);puts(a);puts(b);         } 		   else if(cmp(a,c)==-1&&cmp(b,c)>=0) 		   {puts(a);puts(c);puts(b); }  	 	    if(cmp(b,c)==-1)    	   {    	   	puts(a);puts(b);puts(c); 		  } 	}        	return 0;  }   int cmp(char *a,char *b)  {  	int m,n; 	sscanf(a,"%d",&m);  	sscanf(b,"%d",&n);   	if(m>n)  	{ 	 return 1;     }  	else if(m==n)  	{ 	 return 0;     }  	else if(m<n)  	{ 	 return -1;     }  }   运行时输入1 2 3正确，但换成大整数就错误了

引用 3 楼 真相重于对错 的回复:几个问题，第一输入允许负数吗？ 第二、因为你贴的是图，我就没看你的代码， 我这里只把我自己的想法，说一下 3个100位大整数，不能直接用语言自带的整形来处理，所以用字符串， 那么如果第一个问题不允许的化，就是直接比较表示整数的字符串 3个数比大小很简单，主要处理的是比较函数。比较函数肯定是两两相比 先比较两个字符串的长度，长度大的大。 如果一样长，从0到N依次比较，直到分出大小。 如果允许负数。那么把负数的逻辑加进去就可以了。不好意思回复晚了，十分感谢您的回复！！！我用的是sscanf，把字符串直接转成数字，不知道这样会不会造成什么问题，我把代码贴楼下了

直接用strcmp就可以了吧

如果只是单纯的比较输出数，你可以考虑改变变量阿，这样代码会少很多， 比较函数里面改下，如果给定的可以出来if》=0交换值，这样就保证了abc是按照一定顺序排的，你只需要比较好了把对应的数交换到对应的变量里，输出就最后输出一下就行。 你这个有点乱。我眼睛不舒服就不细看了，不过你判断的{} 是不是没有对好?好像有个有6个{5个}

建议直接贴代码，贴图片不好调试～

比较负数的逻辑： 一正，一负，整数大 二负，大小，与我刚才说的整数比较结果相反。

求帮助啊真的找不到原因了大哭

请看此程序上个忘修改了一部分


Question: 从文件读取少个0；

这个最好调试以下，另外里面用到了中文，应该注意一下编码的问题。


Question: c语言：拼题a提交后运行超时

发这么多图片，不如直接把代码贴出来～  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 供参考～


Question: 新人求助

这些直接使用库函数里自带的函数就行，具体函数的用法百度吧

cmath里都有


Question: 求助：向文件写入数据时失败

fopen那里，因为你括号用错了，==优先级高于=，所以先判断fopen==null   此时不等于，所以返回false赋给fp指针也就是fp=0，所以下面写入fp不成功

你的fopen括号用错了吧，还要就是fwrite你写入二进制，你打开文件是不好看里面数据的，会有乱码

#include<stdio.h> #include<stdlib.h>  #define N 2  struct Student_type {     int num;     char name[10];     int age;     char addr[25]; }; struct Student_type stud[N];  int main() {     FILE* fp;     int i;     //if((fp=fopen("C:\\Users\\ASUS\\Documents\\C-Free\\practice\\file1.dat","wb")==NULL))     if((fp=fopen("C:\\Users\\ASUS\\Documents\\C-Free\\practice\\file1.dat","wb"))==NULL)     {         printf("Can not open this file!\n");         exit(0);     }     printf("Please enter the student data.The format is:\nNo.\t|Name\t|Age\t|Address\t\n");     for(i=0;i<N;i++)     {         scanf("%d%s%d%s",&stud[i].num,stud[i].name,&stud[i].age,stud[i].addr);         if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1)         {             printf("File write error!\n");         }     }     fclose(fp);     return 0; } 供参考～

fwrite函数的返回值是写入的字节数

看你写了两个括号，应该是有考虑到优先级问题，但是写错了

我贴一张格式清楚点的图

引用 1 楼 依旧野指针 的回复:write函数中的参数好好看一下 实在不好意思，能再说清楚点吗，fwrite()四个参数，第一个是一个指针，最后一个是FILE*型的指针，中间两个应该没问题，我感觉类型都对上了啊，实在不知道了...

write函数中的参数好好看一下


Question: c語言中如何依次输入一个字符，且连续输入两个回车符结束输入

#include <stdio.h>  #define STR_LEN     128  int main(void) {     char str[STR_LEN];     int ch1, ch2 = 0, i, j;      i = 0, j = 1;     while (1) {         if (j > i)             printf("input NO.%d character!\n", i+1);         ch1 = getchar();         if (ch1 == 10 && ch2 == 10)    //'\n' == 10             break;         if (ch1 != 10 && i < STR_LEN) {             str[i] = ch1;             i++;             j = i+1;         }         if (ch1 == 10)             j = i;         if (i >= STR_LEN)             break;         ch2 = ch1;     }        return 0; }  供参考～  建议参考这个代码，上面的有点问题～

#include <stdio.h>  #define STR_LEN     128  int main(void) {     char str[STR_LEN];     int ch1, ch2 = 0, i;      i = 0;     while (1) {         //printf("Please input NO.%d character!\n", i+1);         ch1 = getchar();         if (ch1 == 10 && ch2 == 10)    //'\n' == 10             break;         if (ch1 != 10 && i < STR_LEN)             str[i] = ch1;         if (i >= STR_LEN)             break;         i++;         ch2 = ch1;     }        return 0; }  供参考～

输入一个字符用getchar(),依次输入用循环就可以了； 想要通过两个回车来结束输入，可以用两个变量来获取，当两个变量同时为回车时跳出循环输入的代码块即可 例如  char ch1 = 'a', ch2 = 'a'; while(ch1 == '\n'&&ch2 == '\n') {     ch1 = getchar();     if(ch1 == '\n' && ch2 != '\n')     {         ch2 = ch1;         ch1 = 'a';     }     if(ch1 == '\n' && ch2 == '\n')         break;     else         ch2 = 'a';  }


Question: c语言 无符号有符号int类型相加

先假设 int 和 unsigned int 的数据位(符号位 + 值位)都占 32 位，那么如果有 int a = -10，意味着 a 存的就是 -10(见附注)。如果是从 unsigned int 转换到 int 的话会比较麻烦，但对于从 int 转换到 unsigned int，C 语言定义了一个很简单的办法：观察 int 的值是否为负数，如果不是，保持值不变；如果是，就给这个 int 加上 UINT_MAX + 1，这里即加上 2^32。那么 a + b 自然就变成了 (2^32 - 10) + (5)。  (附注：-10 用补码来看，就是 1111 1111 1111 1111 1111 1111 1111 0110，但不建议这么看负数，除非你确定你的电脑使用的就是补码，而不是反码等其它编码方式，来存储负数)

引用 1 楼 user-4 的回复:没错，你可以用电脑上的计算器试试。 -10 == 1111 .... 0110二进制 -10 +5 = -5 -5的无符号值就是 4294967291 观点和你的不一样的。  注意，符号数和无符号数相加首先是将两个数据类型统一，根据有符号和无符号相加，首先将有符号类型提升到无符号（因为类型向高提升）类型统一之后再计算加法。  -10提升到无符号之后是：4294967286，然后再加上5，正好是:4294967291  注意一个类型隐式提升，提升的方向是更高的，表示范围更大的提升。

符号不同，实现方式不同，内部存储不同，运算封装不同，怎么能相加！

引用 3 楼 m0_46478585 的回复:为什么提升到无符号 是4……286 不是4……306吗 为什么是2^32-10 而不是加10？ int -->unisgned int这是C语言的规定吧


Question: 求c语言大神帮忙！被一道题目（自己的无知）所困扰！

#include <stdio.h> #include <string.h>  int main(void) {     //char* word[100] = { "0" }; // 每个元素为1个单词（char*）     char* word[100] = { NULL }; // 每个元素为1个单词（char*）     char str[1000] = { 0 }; // 字符串     int str_len = 0, flag = 1;     int index = 0;      fgets(str, 1000, stdin);      str_len = strlen(str) - 1; // 删去换行符     str[str_len] = 0;      word[index] = str;     for (int i = 0; i < str_len; i++)     {         if (str[i] == ' ' || str[i] == '\n') {             if (flag)                 index++;             flag = 0;             str[i] = 0;         } else if (flag == 0) {             word[index] = &str[i];             flag = 1;         } #if 0         if (str[i] != ' ') // 将每个单词单独存储成一个char*         {             //*(word[index]) = str[i];             word[index] = &str[i];             //word[index]++;         }         else         {             index++;         } #endif     }      for (int i = index+1; i > 0; i--) // 倒序输出     {         printf("%s ", word[i - 1]);     }     putchar(10);      //system("pause");      return 0; } 供参考～

char* word[100] = { "0" };// word为char*指针数组，且char*指向的"0"为常量，不可修改。 试试 char[10][100] = {0}; //注意大小是否步够


Question: python

这么多.....谁没事干给你做啊

另外，这儿是c语文板块，建议去python板块


Question: C程序在IDE中运行正常，在Shell下用GCC运行异常

引用 1 楼 user-1 的回复:命令行 * 要转义，不转意的情况下就是当前路径的所有文件，就好你打命令 ls * 一样，查看所有文件 所以要转义输入，或者用双引号括起来，即 输入 2 3 4 + \* 或者 2 3 4 + "*" 谢谢老师火眼金睛，问题解决


Question: switch问题

你下边的是错误的，因为8月要算的是前7个整月+8的，而不是8个整月+8的

他那么写可以。

引用 7 楼 真相重于对错的回复:我没听懂你在问什么？ 第一个程序没有break,那么比如你输入12，依次执行下面所有的语句， 第二个程序，有break,所以你输入12只执行case 12 到 break;之间的代码 那第一个程序是不是错了，问题是要求2008年8月第8天是那一年第几天

引用 3 楼 自信男孩的回复:switch case需要和break配合使用的 switch语句不是符合就可以执行吗。为什么第一个程序不要break啊。月份是8。不是直接执行8那个语句吗。就是date+=31然后date之前定义为0那个算出来不是31吗

引用 1 楼 真相重于对错的回复:没有break，顺序执行 第一张图片不是我的程序。我就是想问一下。那个月份为什么要倒过来。12了再11在往后这么写

引用 2 楼 ?Victor.??的回复:因为你第一个程序没有break， 从上往下 是逐条执行的， 我的是有break的那个

switch case需要和break配合使用的

因为你第一个程序没有break， 从上往下 是逐条执行的，

没有break，顺序执行

引用 6 楼 weixin_46294972 的回复:[quote=引用 3 楼 自信男孩的回复:]switch case需要和break配合使用的 switch语句不是符合就可以执行吗。为什么第一个程序不要break啊。月份是8。不是直接执行8那个语句吗。就是date+=31然后date之前定义为0那个算出来不是31吗[/quote] 执行完8那条语句后没有break,会继续执行7，6，5，4.。。的语句，每月天数加起来

引用 11 楼 真相重于对错 的回复:多说一句，简单代码贴图，无所谓，复杂代码最好贴源码，难道你要问人问题，还要麻烦别人再敲一编代码？ 复制粘贴不是比上传图片更省心吗，非得贴个图片


Question: 输入一系列的数字和字符，但只输出字符，为什么输出的是问号

引用 1 楼 lin5161678 的回复:有中文逗号了哈哈哈，一直找问题找了半天，原来是中文标点输入，谢谢，问题解决

有中文逗号了

多说一句，scanf的时候，最好不要加额外的分隔符，否则在输入的时候很容易出问题


Question: 运行程序时NTL报语法错误

人家那是c++代码，你的是c

这是报错的一部分代码，就是直接在官网下载的NTL

贴代码吧。  可能是在形参里加了&,C 语言不支持形参前加&（引用）的，C++支持这样的语法～


Question: 结构数组

->符号，必须跟在指针类型数据后 p[0] 数组方式不是指针。

VS2015 C++环境  应该没问题啊

#include<stdio.h>  struct date { //定义结构     int year;     int month;     int day; };  struct date* get(struct date*p);  int main() {     struct date dates[]={{2020,03,28},{2020,03,29},{2020,03,30}}; //定义结构数组并初始化     struct date*p=dates; //定义一个类型为struct date类型的指针并将数组的第一个单元的值赋给指针     int i;     for(i=0;i<sizeof(dates)/sizeof(dates[0]);i++){ //遍历输出数组中的结构值         //printf("%d-%d-%d",p[i].year,p[i].month,p[i].day);         printf("%d-%d-%d",(p+i)->year, (p+i)->month, (p+i)->day);     }     return 0; } 这样就可以用-> p[i]等价dates[i];


Question: c语言。  有符号和无符号。补码原码 还有赋值问题 求解

5化成二进制是0101，它的补码是1010，再加1是1011，%u是输出整型，所以是32位，即1111 1111 1111 1111 1111 1111 1111 1011,所以是 4294967291

-5 原码 00000101 ，补码11111011，扩展到32位，就是1111，1111，1111，1111，1111，1111，1111，1011 所以按32位无符号数打印就是你看到的， 如果按有符号的则是-5 也就是说32位的-5，二进制就是1111，1111，1111，1111，1111，1111，1111，1011

%u 按无符号32位数计算 负数按补吗表示，补码的计算就是，按位取反+1，然后最高位置1


Question: 求解答else printf("%d\n", days[m-1]); 是怎么输出正确结果的，我不是很懂

m==2，这说明月份是从1开始，但是数组下表是从0开始的。所以1月份的天数对应的数组是days[0]

数组下标是从0开始  m-1对应m月

显示的是月份而数组下标第一个数是0


Question: 输入1,2,3,4,5,6,7,8,9,10 怎么构造一个平衡二叉树？

输入1,2,3,4,5,6,7,8,9,10 怎么构造一个平衡二叉树？


Question: 三个字符串的排序，我错到哪里了？

引用 2 楼 chxchxkkk 的回复:第三个判断应该是 a c比较吧，你写成和第一个判断一样的了 if(strcmp(a,b)){         strcpy(temp,a);         strcpy(a,b);         strcpy(b,temp); 不是的，必须是对比a和b，因为如果c<b的话b处已经是c的值了。 比如321，对比ab得231，对比bc得213，之后一定是对比ab而不是ac

引用 1 楼 ?Victor.?? 的回复:#include<stdio.h> #include<string.h> int main() { 	char a[128],b[128],c[128],temp[128]; 	scanf("%s",&a); 	scanf("%s",&b); 	scanf("%s",&c); 	if(strcmp(a,b)>0){ 		strcpy(temp,a); 		strcpy(a,b); 		strcpy(b,temp); 	} 	if(strcmp(b,c)>0){ 		strcpy(temp,c); 		strcpy(c,b); 		strcpy(b,temp); 	} 	if(strcmp(a,b)>0){ 		strcpy(temp,a); 		strcpy(a,b); 		strcpy(b,temp); 	} 	puts(a); 	puts(b); 	puts(c); 	return 0; } 试试这个 判断条件应该>0吧，查一下strcmp用法 以为这个表达式会直接返回正数，然后if就成立了。。。


Question: 求解，为什么代码检查没有错误运行出来啥也没有

你要用循环来加，如果不想用for就想用switch的话，把月份从后往前写，然后把break去掉。因为switch case的机制是从上往下判断，知道遇到满足case的开始执行后面，而一旦开始执行case 那么执行完就会继续往后执行，知道遇到break或switch结束，所以你倒过来写，一月放最后可以达到循环加的效果，会先判断几月，然后从那个月开始往下都加，记得去掉break这样写的花，具体逻辑你想想怎么实现加

#include<stdio.h>  void fun(int arr[], int len) { 	arr[0] = 2; 	printf("addr_in_fun:%p\n", &arr); } int main() { 	int year = 2008; 	int month = 8; 	int day = 8; 	int flag;  	int sum = 0; //-----sum赋初值---------- 	if (year % 4 == 0 && year % 100 == 0 || year % 100 == 0 && year % 4 != 0)//---|改为|| 		flag = 1; 	else 		flag = 0; 	for (int i = 0; i < month; ++i)//----添加for循环------------- 	{ 		switch (month) 		{ 		case 1: 			sum = (31); 			break; 		case 2: 			sum = (sum + 28); 			break; 		case 3: 			sum = (sum + 31); 			break; 		case 4: 			sum = (sum + 30); 			break; 		case 5: 			sum = (sum + 31); 			break; 		case 6: 			sum = (sum + 30); 			break; 		case 7: 			sum = (sum + 31); 			break; 		case 8: 			sum = (sum + 31); 			break; //这里没有用8天加，而是用31-23 case 9:sum=(sum+30);break; case 10:sum=(sum+31);break; 		case 11: 			sum = (sum + 30); 			break; 		case 12: 			sum = (sum + 31); 			break; 			  		} 	} //-----------把以下两行代码移至for循环之外--------------------- 	sum -= 23 + flag; //sum-=23的意思是用八月的31-23天就等于8天 	printf("%d年%d月%d日是该年的第%d天", year, month, day, sum); 	return 0; } VS2015 C++环境调试结果

当被测试的变量等于 case 中的常量时，case 后跟的语句将被执行，直到遇到 break 语句为止。 当遇到 break 语句时，switch 终止，控制流将跳转到 switch 语句后的下一行。 不是每一个 case 都需要包含 break。如果 case 语句不包含 break，控制流将会 继续 后续的 case，直到遇到 break 为止。

if(year%4==0&&year%100==0|year%100==0&&year%4!=0) 这一句 判断条件 if(year%4==0&&year%100！=0||year%400==0)

结果肯定是错啊，你这个并没有把8月前面几个月的天数相加。 switch里的case只会执行一个。你把break去掉看看会有什么效果

引用 1 楼 冷风1023的回复:printf("%d年%d月%d日是该年的第%d天",year,month,day,sum); 这个打印要放到switch外面才能用打印 我的运行结果也错了

引用 1 楼 冷风1023的回复:printf("%d年%d月%d日是该年的第%d天",year,month,day,sum); 这个打印要放到switch外面才能用打印 好勒好勒谢谢


Question: 我是新手，请问vs2013 出现这种错误怎么改？

应该是缺少库，建议查一下编译环境，代码没发现什么问题。  唯一的问题应该是浮点数的比较与整型数有区别，需要注意下～  建议搜一下浮点数比较～

没有问题。本身就是这样。 test1.exe的符号文件pdb是能打开的， ntdll.dll等系统文件的pdb是找不到的。除非的你另外去windows中下载的这些符号文件。

这个代码看上去是没有问题的，可以换个编译器试试，比如CFree。


Question: 为什么输出的内容少个0；

引用 5 楼 lin5161678 的回复:输出格式 010ld 就可以了 这是什么意思啊？

输出格式 010ld 就可以了

去掉fscanf格式里的数字试试～

建议去掉fscanf中的12数字，8个数字。输出可以用数字，读取的时候建议去掉试试～

那不更麻烦了，还得循环输出

你那个ID用的是长整型变量，通俗地讲也就是一个数字。建议用含有10个元素的一维数组。


Question: 刚刚学的小白问一下，为什么会出现这个情况

printf（）；中加了& 就变成打印地址了，就不是打印值

printf() 中不要加 &符号

贴代码图的，我只想给一个提示 把c++的基本语法学好，因为人脑不是电脑，面对图片确实不知道怎么回答


Question: 两个不相干的C程序放在一个项目中怎么避免重复调用main函数，求解

刚想到一个办法把不用的main函数注释掉不知道可行吗？

这个是VC6的项目

ms的VS系列吧？可以用它的那个功能：把文件加入项目和移出项目，注意后者不是删除文件

我嫌总是建项目不放便，才问的。

先把基本语法学好，不然这样的问题将会此起彼伏。

刚才一个C语言群中大佬说加static变量不知道是怎么实现的

改名 把不用的改成main1,main2.............. 不知道还有没有什么别的高级的方法


Question: 新人求助：换行输入数字，到0结束

引用 5 楼 ?Victor.?? 的回复:第三个有点奇怪，是要干什么？  a数组值是1，2，3，4，6，9，13，19.。。。。。  输入b数组的值只是想输出对应的a数组位置的值？ https://www.dotcpp.com/oj/problem1004.html 哈哈，母牛问题

引用 3 楼 煮酒老麦 的回复:第三个代码也明白了，因为出现了i++，i的值就已经发生了更改 是的,i++就是控制输入的

第三个代码也明白了，因为出现了i++，i的值就已经发生了更改

第一个 if(a[i]=0){ 改成==，否则是赋值 第二个 int a[5] = {1,1,1,1,1}; 否则{1,0,0,0,0}


Question: 内容很简单，就是从文件中读取然后输出到屏幕上；

在main函数ruturn 0 前面加一句 system("pause"); 或者 getchar(); 让屏幕停下。

ctrl + F5


Question: 出现value 3221225477

谢谢大家帮忙

#include<stdio.h> #include<stdlib.h>  typedef struct node{     int height;     struct node *next; }linklist;  linklist *CreateList() {     linklist *head=(linklist *)malloc(sizeof(linklist));     head->next=NULL;     return head; }  void ini(linklist *head,int num) {     linklist *s,*r;     int i;      r = head;     for (i=0;i<num;i++)     {         s=(linklist*)malloc(sizeof(linklist));         if (!s)             exit(0);         scanf("%d",&s->height);         r->next = s;         r=s;     }     r->next=NULL; }  void insert(linklist *head,int h) {     linklist *p,*q,*z;     q = head;     p = (linklist *)malloc(sizeof(linklist));     if (!p)         exit(0);     p->height = h;     while(q->next && q->next->height < h)     {         q = q->next;     }      p->next = q->next;     q->next = p;  #if 0     if (q->next==NULL)     {         q->next=p;         p->next=NULL;     }     else     {         z=q->next;         q->next=p;         p->next=z;     } #endif }  void Output(linklist *head) {     linklist *p=head->next;     while(p!=NULL)     {         printf("%d ",p->height);         p=p->next;         //printf(" %d",p->height);     } }  int main() {     int num,number;     linklist *L;     L=CreateList();     scanf("%d%d",&num,&number);     ini(L, num);     insert(L,number);     Output(L);     return 0; } 供参考～

void Output(linklist *head) {     linklist *p=head->next;     printf("%d",p->height);     while(p!=NULL)     {         printf(" %d",p->height);         p=p->next;        // printf(" %d",p->height); 这句放到上面就没有问题了	     } }


Question: 问一个C语言基础问题

先把基本的c语言的语法学好吧，多说无益

数组越界 代码错 没讨论价值

第一个这样定义和输入，是数组越界访问了，相当于输入的内容把后面的内存（栈）冲掉了，结果是未定义行为～


Question: 为啥int类型和long int类型占用的字节一样

引用 4 楼 我也不晓得该取个啥名儿 的回复:[quote=引用 3 楼 自信男孩 的回复:] 这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。我就是64位系统，结果两个占用的字节一样[/quote]我的也是这样，long int与int所占的字节数都是4，只是long long不一样，占8字节

跟64位编译器使用的数据模型有关，LP64、LLP64（windows下的64位编译器一般使用这种模型，long long和pointer是64位的，其他数据类型保持不变）、ILP64，甚至还有SILP64

引用 6 楼 自信男孩 的回复:[quote=引用 4 楼 我也不晓得该取个啥名儿 的回复:] [quote=引用 3 楼 自信男孩 的回复:] 这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。我就是64位系统，结果两个占用的字节一样[/quote] 看一下你的编译器位数[/quote]好的，谢谢。

引用 4 楼 我也不晓得该取个啥名儿 的回复:[quote=引用 3 楼 自信男孩 的回复:] 这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。我就是64位系统，结果两个占用的字节一样[/quote] 看一下你的编译器位数

引用 1 楼 user-5 的回复:因为标准没说不能一样明白了，明白了。感谢

引用 3 楼 自信男孩 的回复:这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。我就是64位系统，结果两个占用的字节一样

c规范了没规定long int一定是8个字节，但long long是8个字节，如果long int满足不了要求就该用long long吧

因为标准没说不能一样


Question: 用c怎么编辑出这样啊？求大佬帮我解答一下

谢谢大佬的帮忙，懂了

打空格加换行

我的道行还很浅，这代码都看不懂。。先学习一个

供参考  #include <stdio.h>  int main() {     char ch = 'a';     int i, j, n;     printf("输入要打印几层:\n");     scanf("%d", &n);      for (i=0; i<n; i++)     {         for (j=0; j<n-i-1; j++)             printf (" ");         for (j=0; j<=i; j++)         {             if (j==0)                 printf("%c ", ch);             else                 printf("%c ", ch+j);         }         printf("\n");      }      getchar();     return 0; }


Question: 划分江湖上大侠门派问题----等价类划分问题                                  -----（并查集的应用）

矩阵运算。。。。。。。。


Question: 如何用%s输出字符串。

%s是输出字符串，输出的方式是一个字符一个字符输出，直到遇到'\0'停止输出。如果不对ch[0]赋值，那么要看ch[0]是什么，如果是'\0'那么自然什么都不输出。 如果没有'\0'作为结尾，那么会继续向后寻找直到找到'\0'，这样会出现越界访问，结果是未定义的。


Question: 为什么测试平台不认同我的啊

#include<stdio.h> int main() {     int year,month,flag, day;     scanf("%d  %d",&year,&month);     //if(year%100==0&&year&400==0||year%4==0&&year%10==0)     if(year % 400==0||(year%4==0&&year%100 !=0))     {         flag=1;     }     else     {         flag=0;     }     switch(month)     {         case 1:         case 3:         case 5:         case 7:         case 8:         case 10:         case 12:             day = 31;             break;          case 4:         case 6:         case 9:         case 11:             day = 30;             break;          case 2:             day = 28 + flag;             break;          default:             break;         /*         case 1:month=31;break;         case 2:month=28+flag;break;         case 3:month=31;break;         case 4:month=30;break;         case 5:month=31;break;         case 6:month=30;break;         case 7:month=31;break;         case 8:month=31;break;         case 9:month=30;break;         case 10:month=31;break;         case 11:month=30;break;         case 12:month=31;break;         */     }     printf("%d",month);     return 0; }  供参考～

if (year % 100 == 0 && year & 400 == 0 || year % 4 == 0 && year % 10 == 0) 这是个什么判断？？？ 改成人家那种

printf换成puts

因为测试有数据范围要求，下面这种月份输错并不会有输出，但是你的样例给错误的月份照样会有输出。最好是在输入之后做个判断。


Question: C语言单词加密

scanf("%c", &ch_lower) 中的%c已经决定，按照字符的方式从输入流中读取数据。

输入friday，这是一个字符串，也是一个字符一个字符组成的。


Question: 关于德才论测试点2错误

//scanf("%s %d %d",&stu1[i].num,&stu1[i].D_grade,&stu1[i].C_grade); 		scanf("%s %d %d", stu1[i].num,&stu1[i].D_grade,&stu1[i].C_grade); 供参考～


Question: 刚学C语言，求求各位大佬们帮我看看这几个程序错在哪里吧！

引用 1 楼 qq_45883336的回复:第二个 log(x+1) 第三个 term=a应该写在scanf后面，for里面是分号，i=0或者i<=n. 第四个 sum=0,n=n/10 好的好的谢谢你！！！！

好的好的，谢谢你！！！

//printf("%.2lf\n",y); 		printf("%.2f\n",y); y定义的是float类型，因此输出应该用%f而不是%lf


Question: C语言两层循环嵌套，外层只循环了一次

int gcd(int a0,int b0) {     //int temp;     int temp = 1;     while(temp!=0)     {         temp=a0%b0;         a0=b0;         b0=temp;     }      return a0; } 供参考～  问题可能不在循环上，而是gcd函数内temp的没初始化上。 改成如下： int gcd(int a0,int b0) {     int temp; #if 1     do {         temp = a0 % b0;         a0 = b0;         b0 = temp;     }while (temp);  #else     while(temp!=0)     {         temp=a0%b0;         a0=b0;         b0=temp;     } #endif     return a0; }

引用 1 楼 user-2的回复:int gcd(int a0,int b0) {	int temp;   ===》》 这里temp没有初始化，不知道是什么值 while(temp!=0)  ==》》 导致这里的循环判断出现问题  解决办法是给 temp 赋个不等于0的初值 { temp=a0%b0; a0=b0; b0=temp; } return a0; } 但为什么我加了个输出就特别神奇的可以正常运行了

但是为什么我加上那个输出就可以很神奇的正常执行了


Question: C语言结构体指针

引用 4 楼 千梦一生 的回复:参加过运动会吧。 我指着（站在左上角的）你说 ：看这一排走的真整齐（排 指针） ：这迎面走来的是3年纪4班的同学们。他们...（班 指针） ：下面将要入场的是3年纪的同学们。他们...（年级 指针）  显然，我都是指着左上角的的你 也就是指向的位置都是相同的。  但是类型不一样。  当我需要指向下一排的时候，则，（排 指针 ++） 当我需要指向下一个班级的时候，则，（班级 指针++） ... 写完了才看，有点答非所问了。算我的

这是一个链表。 每个结构体中保存着下一个结构体的地址。 链表需要一个头，这里将头简化为和链表结构相同了。 你发现stu123都被初始化了，但是head没有被初始化。 实际上，程序只使用了head.next作为链表头，结构的其他成员并没有被使用。 一般在链表中要单独设置一个链表头的，这里简化了 这是初学者困扰的第一个地方。  struct student *p p是在遍历链表时不断变化的，所以要单独定义一个指针p p = head.next 实际上p就是第一个结构的地址 也就是说，在这个链表中，遍历就是从链表头开始 这就是困扰楼主的地方。  在以往的遍历中，例如for循环 都有一个控制变量，控制循环。 而链表的遍历，一般没用这样一个整体的链表索引。有索引也不叫链表，叫数组了。 链表是通过自身完成遍历的。 也就是说，每个结构中，都保存了下一个结构的地址。 依次遍历所有结构。

因为你循环前已经定义好指向了。

指针里放的是什么？地址，是吧，p所指元素的next指针里存放的地址赋值给p，就相当于p移动了，打个比方，比如你站着火车的一节车厢上，把下一节车厢移到你脚下，是不是等价于你往后移动了，不过这个比喻有点鬼畜

p->next是指针变量，存放的是下一个节点的地址；p = p->next;就是将下一个节点的地址赋值给p，那么p就指向了下一个节点，因此用p去访问下一个节点的no, name, year是没问题。  year改成age可能代码可读性更好一些～


Question: 小白求解，不懂。。

a是野指针，所谓野指针就是a指向的内存地址不确定，如果a指向了可读可写的，这样的程序运行是没问题的。 但是如果a指向了不可以读写的位置，那么就会出现段错误了。 所以并不能保证每次都能正常运行的。 另外，即使正常运行，a指向的位置也是未被系统分配的，那么其他程序还可能继续使用这块内存，因此赋值可能被修改或者修改别的程序在这块区域的值。因此，很危险。


Question: 求100到999的超级逆向素数，答案为39，我算出来57，实在不知道哪里错了

#include <stdio.h> #include <stdlib.h> #include <math.h>  int sushu(int); int main() { 	int i = 0; 	int nCount = 0; 	int ni = 0, num; 	for (i = 100;i <= 999;i ++) { 		num = i; 		if (sushu(num) && num % 100 > 10 && sushu(num%100) && sushu(num % 10)) { 			nCount++; 			printf("%d\t", num); 		} 			/* 		if (sushu(i)) 		{ 			int a = i / 10 % 10; 			int b = i % 10;  			ni = a * 10 + b; 			if (sushu(ni) && a != 0 && b != 0) 			{ 				int c = i % 10;  				if (sushu(c)) 				{ 					nCount ++; 				}  			} 		} 			*/ 	} 	printf ("++%d", nCount); 	system ("pause"); 	return 0; }   int sushu(int n) { 	int i = 0; 	if (n < 2) 		return 0; 	for (i = 2; i <= sqrt(n); i++) 	{ 		if (n % i == 0) 			return 0; 	} 	return 1; } /* int sushu(int i) { 	int n = 0; 	for (n = 2;n <= sqrt(i);n ++) 	{ 		if (i % n == 0) 			return 0; 	} 	return 1; }  */  供参考～  素数判断的逻辑有点问题，如果i是1，那么也认为是素数了。

引用 1 楼 user-2的回复:16进制39等于十进制57 可我是按照10进制答应的

16进制39等于十进制57


Question: 数据结构C语言关于栈和队列

引用 1 楼 user-1的回复:这个就是最基本的栈和队列操作，LZ自己模仿数据结构的栈和队列操作的例子修改就可以了 停车场和待停区是栈，候车区是队列 停车场进车就是从候车区的队列取前一个元素push进栈 停车场出车就是停车场栈的元素依次pop，然后push到待停区，出车结束后再把待停区的元素依次pop，然后push回停车场即可 老铁我不会写，找了也不知道为什么就是很多指针什么的我都写不出来


Question: c语言两个存了中文字符数组的内容怎么进行交换？

我懂了，就算是中文也是数字编码的，只要有一个一样大的数组可以直接继续交换，一直到遇到'\0',没有必要每2个字符2个字符的换。 int zfcjh(char s[][30],int x) { 	int c[30];  	int j; 	for(j=0;s[x][j]!='\0';j++) 	{ 		c[j]=s[x][j]; 		 		s[x][j]=s[x+1][j]; 		 		s[x+1][j]=c[j];	 		 	}

按照正常的字符交换即可，使用一个中间字符数组；  如果是字符串，按照字符串的交换方式，也是要借助中间字符数组。

memcpy


Question: 求助

引用 2 楼 weixin_46625589 的回复:[quote=引用 1 楼 N-n-N的回复:]就用cout<<"xxx"<<endl; 一行行输出，然后cin流输入，再到if或者switch判断就好了 可不可以有提供一个具体的代码。？初学者有些懵[/quote]像下面那个框架那样，循环就是里面的while(1)就是一个条件循环语句

引用 3 楼 user-2的回复: #include <stdio.h>  int main(void) {     int num;     printf("本机提供如下5种有机蔬菜：\n");     //用printf打印出选项菜单     while (1)     {        printf("请输入你选择的端口序号(按0结束)： ");        scanf("%d", &num);         switch (num)         {                case 1: printf(""); break;                case 2: printf(""); break;                case 3: printf(""); break;                case 4: printf(""); break;                case 5: printf(""); break;                case 0: return;         }            }     return 0; }   基本框架就是这样了，供参考。 那那个循环咋弄

商品打成端口了。

引用 1 楼 N-n-N的回复:就用cout<<"xxx"<<endl; 一行行输出，然后cin流输入，再到if或者switch判断就好了 可不可以有提供一个具体的代码。？初学者有些懵


Question: 新人求解

#include <stdio.h>  int main() {     int i, num = 0, sum = 0;     for (i=1;;i++)     {         if((i+3)%5==0 && (i-3)%6==0)         {             sum += i;             num += 1;             printf("%5d", i);             if (num%5==0)                 printf("\n");         }          if (num == 15)             break;     }     printf("%d\n", sum);     return 0; }

引用 2 楼 N-n-N 的回复:#include <iostream> using namespace std; int main(){ int i=1; int num=0; white(1){ if(i%3==0&i%5==0&(1-3)%6==0){ cout<<i; num++; } if(num==15)return 0; if(num%5==0){ cout<<endl; } i++; } } 打错 是 while

老弟，因为从0开始前面几个数都不满足     if ((i+3)%5==0&&(i-3)%6==0)  这个条件，你的num一直就为0，0%5==0满足，所以一直输出换行，解决方法为把    if (num%5==0)printf("\n");  放到        if ((i+3)%5==0&&(i-3)%6==0)  {  num=num+1;  printf("%6d",i);  } 这个里面就可以解决，还有就是你这个代码可以放到一个循环里面就可以解决，不需要搞两个for循环。


Question: C语言 字符串

a指向的区域是只读的，所以scanf对a指向的区域进行写操作会出现问题（段错误）；解决版本是变成数组。 char a[32] = "xxx";

char *a 指向常量字符串，不能修改。 char a[]字符数组，可以修改

字符串一旦用第一种方式初始化后，指针就不可以被修改了！

指针指向字符串的值不可修改 数组可以


Question: c语言单链表逆置没有错误，一到执行单链表函数就崩溃，求大神

#include<stdio.h> #include<stdlib.h>  typedef struct { 	char no[8];   //8位学号 	char name[20]; //姓名 	int score;     //成绩 }Student;  typedef struct LNode{ 	Student   data;       //数据域 	struct LNode  *next;   //指针域 }LNode,*LinkList;    //int InitList(LinkList l)           // l不用加*，已经是指针 int InitList(LinkList *l)           // l不用加*，已经是指针 {  	*l=(LinkList)malloc(sizeof(LNode)); 	(*l)->next=NULL;               //头结点 	return 1; }  int createlist(LinkList l,int n) { 	for(int i=n;i>=1;i--) 	{ 		LinkList p;        //前插法创建列表    创建指针（不是Student类型） 		p=(LinkList)malloc(sizeof(LNode));            		printf("请输入学生的学号，成绩及姓名："); 		scanf("%s %d %s",p->data.no,&p->data.score,p->data.name);      //注意. 和.>使用    		p->next=l->next; 		l->next=p;           //相当于在l后插入p结点 	} 	return 1; }  int showlist(LinkList l) { 	LinkList p=l->next; 	while(NULL != p) 	{ 		printf("%s %d %s\n",p->data.no,p->data.score,p->data.name); 		p=p->next; 	} 	printf("\n"); 	return 1; }  LNode *Inverse(LinkList L) { 	LinkList p,q; 	p=L->next; 	L->next=NULL; 	while(p!=NULL) 	{ 		q=p; 		p=p->next; 		q->next=L->next; 		L->next=q; 	} 	return L; }  int main() { 	LinkList L; 	int n; 	if(InitList(&L)) 		printf("初始化链表成功。\n"); 	else  		printf("初始化链表失败。\n"); 	printf("请输入学生个数：\n"); 	scanf("%d", &n); 	if(createlist(L,n)) 		printf("创建链表成功。\n"); 	else  		printf("创建链表失败。\n"); 	//showlist(L);  	Inverse(L);  	showlist(L);  	return 0; }  供参考～  改了main函数里的L类型，如果定义成lnode类型，那就不需要初始化链表头节点了。

LNode *Inverse(LinkList L) { LinkList p,q; p=L->next; L->next=NULL; while(p!=NULL) { q=p; p=p->next; q->next=L->next; L->next=q; } return L; } 这个函数应该有问题，把主函数中 Inverse(&L); 注释掉可以正常运行


Question: 求解决 编译错误syntax error : missing ';' before 'type'

应该是中文分号

存在设计错误：输入值超过100，怎么办？

把change声明放到开头去

AlcorMP AU698xAlcorMP AU698x

引用 4 楼 user-11 的回复:估计是中文分号没有  我手打了一遍还是不对

我自己重新手打了一遍还是相同的错误，命令我贴出来了   希望哥哥们们可以帮我看一下

#include <stdio.h>  int main() {     int price = 0;      printf("请输入金额（元）：");     scanf("%d", &price);      int change = 100 - price;      printf("找您%d元。\n", change);      return 0; }       这个就是源代码

引用 1 楼 LeoYang0331 的回复:我的错误是显示在 int change=100-price这一行你这一行或者之前一行，应该有个全角的回车或者其他不可见的字符。

引用 1 楼 LeoYang0331的回复:我的错误是显示在 int change=100-price这一行 c语言应该要先定义名字再使用吧！先int change;再change＝100-price试试

开发环境还是vs好使。 不过vc6.0确实很轻巧，劣势就是不支持新规范。

哪一行有中文分号吧

dev-c++也可以  对新手很友好  百度腾讯软件中心  在里面搜就可以

引用 15 楼 akari10032 的回复:[quote=引用 14 楼 LeoYang0331 的回复:] [quote=引用 13 楼 akari10032 的回复:] vs2019，社区版免费的，直接下载就能用 老哥可以提供个下载地址吗[/quote]https://visualstudio.microsoft.com/zh-hans/vs/ 百度一下不是就有了[/quote] 好的 老哥  非常感谢

引用 14 楼 LeoYang0331 的回复:[quote=引用 13 楼 akari10032 的回复:] vs2019，社区版免费的，直接下载就能用 老哥可以提供个下载地址吗[/quote]https://visualstudio.microsoft.com/zh-hans/vs/ 百度一下不是就有了

引用 13 楼 akari10032 的回复:vs2019，社区版免费的，直接下载就能用 老哥可以提供个下载地址吗

vs2019，社区版免费的，直接下载就能用

引用 2 楼 ?Victor.?? 的回复:贴一下你的源代码  我试一试 我把命令贴在评论区了 谢谢大哥   引用 11 楼 akari10032 的回复:换个编译器，vc6只支持c89，变量定义要写在函数开始的地方，换个编译器吧，这也太古老了好 非常感谢 我自己在网上也找到原因了 但是我一直找不到别的编译器资源  求大佬告知

至少有一个问题：C语言（因为楼主的文件扩展名是：.c）中，变量要在开关一次性地定义，除非是最新标准的C。请考虑一下究竟是C还是C++！

估计是中文分号


Question: C语言读二进制数据装入结构体

可以使用 #pragma pack(1) 在 结构体 声明之前

可以使用 #pragma pack(1) 在截个图声明之前，之后再使用 #pragma pack(4) 或者 #pragma pack(8)

先用一个字符数组把数据读出来（以二进制的方式读取文件），在把字符数组的信息强行转换为结构体或者内存拷贝给结构体 for example char buf[136]; FILE *fp = fopen("your_file", "rb"); while (!foef(fp)) {     memset(buf, 0, sizeof(buf));     int len = fread(buf, 1, 132, fp);     struct your_struct st; //你的结构体变量     memset(st, 0, sizeof(st));     memcpy(st, buf, sizeof(buf)); //内存拷贝的方式     /*     struct your_struct *st = (struct your_struct*)buf; //强行转化的方式     */     。。。 }

解决了。。。是我读入时，用了结构体的长度。。。


Question: 计算a的n次方mod p，a，n，p均为正整数，均可用32位整型变量存储。从屏幕中输入a，n和p。

引用 2 楼 前行者001的回复:程序如下， #include<stdio.h> #include<math.h>  int main() { 	int a,n,p,num,temp = 1;//num表示余数，temp用于中间值计算  	printf("请输入变量a,n,p对应值,输入格式例如：3,5,6 \n"); 	scanf("%d,%d,%d",&a,&n,&p);  	//方法 1 利用 pow幂函数解决问题  	num = (int)pow((double)a,(double)n)%p;   	//方法2 利用for循环解决问题 	/* 	for(int i = 1;i <= n;i++)  	{ 		 temp = temp * a; 	} 	*/ 	num = temp % p;  	printf("\n%d^(%d) mod %d = %d",a,n,p,num); }  运算结果  感谢感谢，非常感谢


Question: 求教大佬们，vs2019，用scanf读取字符常量时显示 读取位置发生冲突 的原因

引用 3 楼 lin5161678的回复:scanf_s 不是 scanf 不能直接套用 scanf的用法 具体用法百度   备注 不用解释为什么不用scanf 去百度scanf_s就行了 啊懂了懂了，谢谢

引用 1 楼 ?Victor.?? 的回复:输入的问题 写两个scanf吧 字符用循环 scanf一次只接收一个字符 还有输入数字时要有空格分隔  嗯嗯用多个scanf可以解决，但是让我很疑惑的是，这串代码在网站上是可以跑的 是因为不同的编译器的原因嘛


Question: 输入数据按回车换行没有输出结果

嗯，，，我看看

您好，请问你是因为我的代码没有包含math.h然后自己修改了我的代码，结果出现bug，跑到我博文下撂一句“回车没反应”的吗? 检查检查你写的第24行。


Question: 为什么define定义全局变量的时候不能用阶码

引用 3 楼 真相重于对错 的回复:2.0E2直接替换A int a[A]就变成了int A[2.0E2] 这样的语句，你觉得会对吗？？？ 看了一下数组下标是整型或整型表达式；但是指数形式是浮点型，所以不行；谢谢。

引用 1 楼 真相重于对错 的回复:宏就是文字替换，要看你如何使用那个宏 #include<stdio.h> #define A 2.0E2 int main(){ 	int a[A]; 	a[A]={'0'}; 	printf("%d",a[A]); 	return 0; }   大概就是想把它用作数组的下标，但是我想偷懒不想一个个打零写成200的形式就发现编译不能通过，我想是不是#define 在定义的时候不能用阶码的形式？（这一段代码是刚才随便写的，可能有错，但是不重要，我想问的是关于define定义的规则之类的问题）

宏就是文字替换，要看你如何使用那个宏


Question: 跪求大佬关于用gcc编译c语言程序的问题，环境已经配置好了gcc也安装了，在桌面创建了一个c语音hello.c文件，用gcc hello.c不能运行，显示No

请问一下如何在桌面创建一个hello.c的程序

引用 6 楼 Behard的回复:看看当前什么路径，下面有什么文件 dir or ls? 嗯嗯，谢谢，解决了，是在创建文本文档系统把后追TXT隐藏了，我重命名微hello.c，其实是hello.c.txt文件，所以显示no such file

看看当前什么路径，下面有什么文件 dir or ls?

引用 4 楼 liups的回复:https://blog.csdn.net/liups/article/details/102512769 严格按照上面的去做，保证没有问题！ 还不行，下载了最新版，结果一样

引用 2 楼 與蘤舊縐的回复:路径都不对  桌面还在下一级的desktop 两个路径下都有

路径都不对  桌面还在下一级的desktop

1，看下你当前目录有没有hello.c这个文件 2. 看下你windows是不是隐藏了后缀名，你这个hello.c可能是hello.c.txt这个文件哦


Question: c语言函数参数为指针

for (i = 0; i < 2; i++) { get(&today); printf("%d-%d-%d",p->year,p->month,p->day); }

直接 struct date *p= get(&today); 就行了 你的 get 函数没有问题，strcat 函数就是这样写的（联合调用）： strcat(strcat(xxx, yyy), zzz);

定义一个结构体数组，返回数组指针


Question: 请问为什么这个程序在vc运行不了啊

引用 5 楼 liups的回复:[quote=引用 4 楼 嘿嘿٩(๑`н´๑)۶ 的回复:] [quote=引用 3 楼 liups的回复:][quote=引用 2 楼 嘿嘿٩(๑`н´๑)۶ 的回复:] 就改了这个就可以了吗 哪抄的代码？楼主不知道cin、cout这些是标准的C++写法吗？[/quote] 呃是复制粘贴的⊙_⊙我不懂[/quote] 如果你是学C的，请修改代码或重新找一个。如果你是学C++的，我不知道该说什么了！[/quote] 噢噢⊙_⊙好滴

引用 4 楼 嘿嘿٩(๑`н´๑)۶ 的回复:[quote=引用 3 楼 liups的回复:][quote=引用 2 楼 嘿嘿٩(๑`н´๑)۶ 的回复:] 就改了这个就可以了吗 哪抄的代码？楼主不知道cin、cout这些是标准的C++写法吗？[/quote] 呃是复制粘贴的⊙_⊙我不懂[/quote] 如果你是学C的，请修改代码或重新找一个。如果你是学C++的，我不知道该说什么了！

引用 3 楼 liups的回复:[quote=引用 2 楼 嘿嘿٩(๑`н´๑)۶ 的回复:] 就改了这个就可以了吗 哪抄的代码？楼主不知道cin、cout这些是标准的C++写法吗？[/quote] 呃是复制粘贴的⊙_⊙我不懂

引用 2 楼 嘿嘿٩(๑`н´๑)۶ 的回复:就改了这个就可以了吗 哪抄的代码？楼主不知道cin、cout这些是标准的C++写法吗？

就改了这个就可以了吗

代码文件用cpp后缀


Question: 请教二插树，函数传参数中间不知道哪错了

gdb里运行，出现段错误时看下各个堆栈，然后慢慢调吧（说了跟没说一样）

引用 5 楼 user-2 的回复:感觉是二叉树算法错了，好像所有函数都很奇怪的样子，还是建议对照一下《数据结构》先吧。 兄弟这是用的递归，左节点和右节点互相调用递归

引用 2 楼 Gnglas 的回复:[quote=引用 1 楼 akari10032的回复:]gdb里运行，出现段错误时看下各个堆栈，然后慢慢调吧（说了跟没说一样） 牛B。。。。。[/quote]61行段错误-->root为NULL--->29行head为NULL--->24行head没赋值--->21行size不为0--->19行root初始化--->42行对size进行了赋值

有没有人，来帮帮忙呀

引用 1 楼 akari10032的回复:gdb里运行，出现段错误时看下各个堆栈，然后慢慢调吧（说了跟没说一样） 牛B。。。。。


Question: 关于C语言的报错

引用 2 楼 狐帝 的回复:第86行，ElementType实际上是int类型，却用作strcmp的实参，这是语法错误。 createTable函数体没写return语句。 HashAdd函数体没写return语句。谢谢您的回复。我去试试看。

可能是你的主函数中 调用HashAdd(const char *key )子函数时传入的参数类型与子函数函数定义的形参变量类型不匹配


Question: 希望提供解决方案。

两个数字比较为什么要用strcmp

typedef int ElementType; 这里是整型， strcmp()函数要求的参数是char指针，你传了整型进去


Question: 谁能给我看看这是什么问题啊

#include<stdio.h> #include<stdlib.h> #include<string.h>  struct student {     char id[10];     char name[10];     char sex[2];     char tel[12]; } stu[50]; //int length=0; int length;    //不用初始化，全局变量默认是初始化0 FILE *fp; void save()//将结构体数据导出到文件 {     //把结构体中的所有信息都保存到文件中     fp=fopen("C:\\Users\\12154\\Desktop\\1.txt","w");     int i;     for(i=0;i<=length;i++)     {         fwrite(&stu[length],sizeof(struct student),1,fp);     }     fclose(fp); } void add() {     //printf("请输入你要添加人的学号\n",length);    //length对应的标识呢？%d前面缺少吧     printf("请输入你要添加人的学号No.%d\n",length);     scanf("%s",stu[length].id);     //printf("请输入你要添加人的姓名\n",length);     printf("请输入你要添加人的姓名\n");     scanf("%s",stu[length].name);     //printf("请输入你要添加人的性别,输入1代表女，输入2代表男\n",length);     printf("请输入你要添加人的性别,输入1代表女，输入2代表男\n");     scanf("%s",stu[length].sex);     //printf("请输入你要添加人的电话\n",length);     printf("请输入你要添加人的电话\n");     scanf("%s",stu[length].tel);     printf("保存该信息请按1，不保存请按2\n");     int i=0;     for(;i<length;i++)     {         if(strcmp(stu[length].id,stu[i].id)==0)         {             printf("你要添加的已存在\n");             system("pause");             break;         }     }        int c;     scanf("%d",&c);     if(c==1)     {         save();         length++;     } } void del() //输入一个学号，删除这条信息 {     char s[10];     printf("请输入你要删除的学号\n");     scanf("%s",s);     int i;     for(i=0;i<length;i++)     {         if(strcmp(s,stu[i].id)==0)         {             //printf("你要删除的记录信息：学号%s,姓名%s,性别%s,手机%s",i+1,stu[i].id,stu[i].name,stu[i].sex,stu[i].tel);             printf("你要删除的记录信息：学号%s,姓名%s,性别%s,手机%s", stu[i].id,stu[i].name,stu[i].sex,stu[i].tel);             break;         }     }     if(i==length)printf("你要删除的学号不存在\n");     int j;     for(j=i;j<=length;) ;    } void update()//s输入一个学号，更新他的信息 {     int i,j;     char s[10];     printf("请输入查询学号：\n");     scanf("%s",s);     for(j=0;j<length;j++)         if(strcmp(s,stu[j].id)==0)         {             //printf("学号:%s 姓名:%s 性别:%s 电话:%s\n,stu[j].id,stu[j].name,stu[j].sex,stu[j].tel");             printf("学号:%s 姓名:%s 性别:%s 电话:%s\n",stu[j].id,stu[j].name,stu[j].sex,stu[j].tel);             printf("请输入此学号的修改姓名\n"); scanf("%s",stu[j].name);             printf("请输入此学号的修改性别\n"); scanf("%s",stu[j].sex);             printf("请输入此学号的修改电话\n"); scanf("%s",stu[j].tel);             printf("保存修改请按1，不保存请按2\n");             int c;             scanf("%d",&c);             if(c==1)             {                 save();                 printf("修改成功");             }             break;         }     if(j==length)printf("查无此人");     system("pause");   }  void search()//输入一个学号，显示他的信息 {     char s[10];     printf("1.按学号精确查找；2.按姓名模糊查找");     int i,j,c;     printf("请输入你的选择\n");     scanf("%d",&c);     if(c==1)     {         printf("请输入查询学号：\n");         //scanf("%s",&s);         scanf("%s",s);         for(j=0;j<length;j++)             if(strcmp(s,stu[j].id)==0)printf ("学号:%s 姓名:%s 性别:%s 电话:%s\n",stu[j].id,stu[j].name,stu[j].sex,stu[j].tel);     }     if(c==2)     {         printf("请输入姓名；\n");         //scanf("%s",&s);         scanf("%s", s);         for(j=0;j<length;j++)         {             if(strstr(stu[j].name,s))printf ("学号:%s 姓名:%s 性别:%s 电话:%s\n",stu[j].id,stu[j].name,stu[j].sex,stu[j].tel);          }     } }  void show()//显示目前所有信息 {     int i;     for(i=0;i<=length;i++)     {         printf("第%d个同学：学号%s,姓名%s,性别%s,手机%s",i+1,stu[i].id,stu[i].name,stu[i].sex,stu[i].tel);     }     system("pause");//系统暂停 } void init()//将信息从文件导入到结构体数组 {     length=0;     fp=fopen("C:\\Users\\12154\\Desktop\\1.txt","r");//读取桌面1.txt     //循环读取     int i=0;     while(fread(&stu[i],sizeof(struct student),1,fp)==1)     {         i++;     }     fclose(fp);     length=i;     printf("目前有%d条记录，",length); } void cover()//菜单界面 {     printf("\n");     printf("***************");     printf("欢迎使用通讯录系统");     printf("***************");     printf("\n");     printf("*                     1:添加信息                     *\n");     printf("**                    2:删除信息                    **\n");     printf("***                   3:修改信息                   ***\n");     printf("****                  4:查询信息                  ****\n");     printf("*****                 5:显示所有信息             *****\n");     printf("******                6:保存信息                ******\n");     printf("*******               0:退出                   *******\n"); }    void excel() {     int i;     fp=fopen("C:\\Users\\86150\\Desktop","w");     for (i=0;i<length;i++)     {         fprintf(fp,"%s,%s,%s,%s\n",stu[i].id,stu[i].name,stu[i].sex,stu[i].tel);      }     fclose(fp);     system("pause"); }   int main() {     int i;//i是功能编号     cover();//显示界面     init(); //目前的信息数,文件信息转到结构体数组     printf("请输入你的选择编号\n");     scanf("%d",&i);     switch(i)     {         case 1:add();break;         case 2:del();break;         case 3:update();break;         case 4:search();break;         case 5:show();break;         case 6:save();break;         case 0:exit(0);break;         default:printf("你的输入有误，请重新输入\n");     } }      供参考～  代码问题不止一个（都是语法问题），建议对比代码找出自己的问题～


Question: 语法报错，查过网站解决不了，望赐教

//哈希表的平方探测法 //#define MAXTABLESIZE 10000; //#define MINITABLESIZE 10; #define MAXTABLESIZE 10000 #define MINITABLESIZE 10 #include<stdio.h> #include<time.h> #include<math.h> #include<stdlib.h>    //定义哈希表结构 typedef int Position;//位置类型 typedef int ElementType;//key的元素类型 typedef enum{Legitimate,Empty,Deleted} EntryType;//定义EntryType的枚举类型 typedef struct HashTbl *HashTable; typedef struct HashEntry Cell;//Cell为哈希表存储信息的数据类型 struct HashEntry{ //散列表单元类型     EntryType Info;//单元状态     ElementType Data;//存放元素 };  typedef struct HashTbl{     int TableSize;//定义哈希表的大小     Cell *TheCells;//定义哈希表中的数组, }H;   //#define MiniTableSize 3;//指定最小的哈希表长度为3 #define MiniTableSize 3//指定最小的哈希表长度为3   //计算散列表的大小,返回大于N不超过MAXTABLESIZE的最小素数 //输入：一个整形实数 //输出：一个素数 int NextPrime(int N){     int i;     int p=(N%2)? N+2:N+1;//从大于N的下一个奇数开始     while(p <MAXTABLESIZE)     {         for(i = (int)sqrt(p); i>2 ; i--) //判断p是否可以被除了1和它本身整除         {             if (!(p%i)) break;//p不是素数         }         if (i==2)             break;//for循环结束，p是素数         else             p+=2;//否则试探下一个奇数     }     return p;  }  //初始化哈希表 HashTable initializeTable(int TableSize) //输入表长 {     HashTable H;     int i;      //1.判断是否散列表太小     if (TableSize < MINITABLESIZE )         printf("散列表太小");      //2.分配散列表     H =(HashTable)malloc(sizeof(struct HashTbl));//分配内存大小为sizeof(struct HashTbl)的字节数，分配成功则有指向内存的指针     if (H==NULL)         printf("内存溢出！");     H->TableSize =NextPrime(TableSize);//根据输入表长，确定散列表的大小      //3.分配散列表Cells     H->TheCells = (Cell *)malloc(sizeof(Cell)*H->TableSize);      //初始化状态单元为空单元     for(i = 0; i<H->TableSize;i++)         H->TheCells[i].Info= Empty;     return H;  }  //哈希函数 //输入：哈希表的大小，要计算的Key //输出：Key在哈希表中的位置 Position Hash(ElementType Key, int TableSize) {     return Key%TableSize; }   //在创建好的哈希表中，用平方探测法查找key的位置 Position Find(ElementType Key, HashTable H) {     Position CurrentPos,NewPos;     int CNum;     NewPos = CurrentPos = Hash(Key,H->TableSize);//经过哈希函数计算出哈希地址      //while(H->TheCells[NewPos].Info !=  NULL && H->TheCells[NewPos].Data != Key)     while(H->TheCells[NewPos].Info !=  Empty && H->TheCells[NewPos].Data != Key)     {          /*判断冲突次数。冲突次数和平方探测d_{i}之间有映射关系。           如果冲突次数为奇数，d_{i}为冲突次数+1的一半           如果冲突次数为偶数，d_{i}为冲突次数的一半 */          //冲突次数为奇数         if(++CNum %2)         {             NewPos = CurrentPos + (CNum+1)/2 * (CNum +1 )/2;             //防止新的探测位置超出散列表             while(NewPos > H->TableSize)                 NewPos=NewPos-H->TableSize;         }           //冲突次数为偶数         else         {             NewPos = CurrentPos + (CNum)/2 * (CNum)/2;             //防止新的探测位置小于散列表             while(NewPos < 0 )             {                 NewPos+=H->TableSize;             }         }          //找到key         return NewPos;     } }  /*    散列表的插入    输入：散列表、Key    输出：void    */  void Insert(ElementType Key, HashTable H) {     //先进行查找     Position Pos = Find(Key,H);     //if (H->TheCells[Pos]== Key)     if (H->TheCells[Pos].Data == Key)         printf("存在该Key:%d",Key);     //查找后判定是否插入     else         if(H->TheCells[Pos].Info!=Legitimate){             H->TheCells[Pos].Info = Legitimate;             H->TheCells[Pos].Data =  Key;         }  } 供参考～  三个问题： 第一个：宏定义后面加分号，去掉分号，注意宏定义和typedef的区别，在形式上。 第二个：Info和NULL比较？Info不是指针，它是枚举类型。 第三个：最后一个和key比较应该是Data数据。  上面的三个问题都一一修改了，供参考～详见代码


Question: RETURN_STRING(str10,1);总是显示Segmentation fault (core dumped)

str10分配后是否写入正确值，并将最后一字节清0?

引用 1 楼 user-1 的回复:str10分配后是否写入正确值，并将最后一字节清0?  有把最后一字节置成\0


Question: 函数入参作为函数内的临时变量数组的长度为啥没问题？

引用 8 楼 adaizhuadaizhu 的回复:[quote=引用 2 楼 自信男孩 的回复:] 第一个是有问题的，因为len不确定长度，因此编译器不知道要给它申请多长的数组。 第二个是没问题的，因为是动态申请的，是在调用函数时才会去调用malloc申请空间。第1段代码没有问题，我编译和运行和第二种结果完全一样 [/quote] 那如果第一种没问题，问一下未调用之前，len是多少呢？

引用 7 楼 adaizhuadaizhu 的回复:[quote=引用 3 楼 真相重于对错 的回复:] 第一个有问题。语法错误 要不 array[len]=10; 要不就是 int array[100]={10};  int array[len]={10}没有这么写的 第1段代码没有问题，我编译和运行和第二种结果完全一样[/quote] 你的编译器不符合标准

引用 6 楼 coo135 的回复:这个到不是保存在栈上的问题。从C99开始引入VLA，所以int array[len] 合法，但是不能用{ }初始化。第一段代码能编译通过，说明编译器用的是c++哈，而且不是上古时期的那种~~~编译和运行正确，我试验过，但是确实不能={}初始化，为啥不能初始化

引用 2 楼 自信男孩 的回复:第一个是有问题的，因为len不确定长度，因此编译器不知道要给它申请多长的数组。 第二个是没问题的，因为是动态申请的，是在调用函数时才会去调用malloc申请空间。第1段代码没有问题，我编译和运行和第二种结果完全一样

引用 3 楼 真相重于对错 的回复:第一个有问题。语法错误 要不 array[len]=10; 要不就是 int array[100]={10};  int array[len]={10}没有这么写的 第1段代码没有问题，我编译和运行和第二种结果完全一样

要想正确，除非他支持vla

引用 10 楼 真相重于对错 的回复:[quote=引用 7 楼 adaizhuadaizhu 的回复:] [quote=引用 3 楼 真相重于对错 的回复:] 第一个有问题。语法错误 要不 array[len]=10; 要不就是 int array[100]={10};  int array[len]={10}没有这么写的 第1段代码没有问题，我编译和运行和第二种结果完全一样[/quote] 你的编译器不符合标准 [/quote] leetcode上也是正常运行的

但是 VLA是不能初始化的  所以你的第一段代码应该还是错的

C99有一个vla特性支持你用变量作为数组大小

数组长度必须是编译期能够确定。 除非是支持变长的数组的编译器。


Question: c语言链表插入问题

所以你又把NULL的ha拿去插入，NULL没有->next，所以在s -next=p-next时会segmentation fault

你这个传递有问题，你初始化一个ha指针，把这个指针传去初始化，这样是无效的。接受参数你那里也是list，类型一样，是传值，你在init里的赋值是给L在操作，和ha没关系的。


Question: 为什么我的写法不可以啊

你当这是数学吗？

没有规矩不成方圆，这就是规定  既然 给你四则运算符号 + - * /，那就是要在相应的情况下使用他们， 注意这里是C语言，不是平时的数学符号语言 如果2 * x 表示成2x, 那 int a； int a2= 0；这里a2表示什么，a乘以2？，不是的 a2是个变量名  因为变量可以由数字 字母下划线组成（不能以数字开头）  条件运算符也是一样，语言上 不存在这一的东西，1 <=x < 10  我觉得这种东西，记住就好，至于为什么，涉及语言和编译器 的东西，一般人解释不清楚 厉害的人 解释清楚了你又听不明白，徒增烦恼


Question: C语言数字金字塔输出

因为10占两个字节


Question: 为什么会出现终止，重试，忽略的弹屏呢？截屏如下，请各位帮忙看看，急急急！谢谢谢谢谢！！！

谢谢

嗯嗯，我试试

main函数里 f1 = fopen(filename, "r")；文件是只读打开的“r”  接着你又用 fprintf(f1,"id:%03d\n",students[i].id )对该文件进行写了，因为 权限不足，退出了  === 你可以从报错信息看出，问题出在 fprintf.c，他在fprintf这个函数里有个断言，str != NULL 就是说你调用的时候，fprintf判断出fp是只读的，那么唯一合法的条件就是你传个空指针NULL去写他 因为不允许写嘛，空也就相当于不写了，，，，题外话了  另外你设计上可以规定好哪个文件是拿来读的， 比如你让用户输入要读的文件，然后去尝试打开它，看下里面有没有内容 如果打开出错（不存在这个文件），或者内容有误（你的作业应该没要求做这个错误判断） 这样出错了 你给用户返回一条信息（printf打印“文件不存在，请重新输入”）， 然后调scanf再请求用户输入，，，，如此循环直到正确  这样的话就不用像你的代码那样，f1，f2切来切去，一大堆重复代码


Question: 求助 PTA中的一道题遇到了问题 求大神帮助

引用 1 楼 自信男孩 的回复:#include<stdio.h> #include<string.h> #include<math.h>  float minute(int p,int q,int x,int y); //定义函数 int main() {     int day;     char t[50][2];//序号     int l[50][2];//时间     float w=0;//读者个数     int o,ok=1;//标记     float k=0;float c;     scanf("%d",&day);     int ii=0;int i=0;     for(ii=0;ii<day;ii++)//输入日期并循环     {         ok=1;//标记重置         memset(t,0,sizeof(t)); memset(l,0,sizeof(l)); //数组清空         while(ok){             scanf(" %c %c %d:%d",&t[i][0],&t[i][1],&l[i][0],&l[i][1]);//输入一组数据             if  (t[i][0]!=48)//判断首位是否等于零             {                 for(o=i;o>=0;o--)                 {                     if (t[i][0]==t[o][0]&&t[i][1]=='E'&&t[o][1]=='S')//寻找历史数据，判断是否符合第一位相等且第二位分别为E或S，若是则进行下一步运算，否则继续寻找历史数据                     {                         k=k+minute(l[i][0],l[i][1],l[o][0],l[o][1]);                         w=w+1;                     }                 };//加和读者个数以及阅读时间  //这儿为啥加;分号                 i=i+1;             }//数组加一             else {                 if (w==0) {//判断读者个数是否为0， 若是则直接输出0，若不是则进行运算                     printf("0 0\n");                 }                 else {                     //c = round(k/w);    //round for double roundf() for float                     c = roundf(k/w);                     printf("%.0f %.0f\n",w,c);                 }                 w=0; k=0;ok=0;             }         }//数据重置，跳出循环     }     return 0; }  float minute(int p,int q,int x,int y) {     float min;     min = (p-x)*60+(q-y);//转化时间     return min; }  供参考～  怀疑是round的问题，但是不确定。  不过楼主的代码风格确实很独特，代码不长但是看着费劲呢。自己没感觉到吗？  引用 1 楼 自信男孩 的回复:#include<stdio.h> #include<string.h> #include<math.h>  float minute(int p,int q,int x,int y); //定义函数 int main() {     int day;     char t[50][2];//序号     int l[50][2];//时间     float w=0;//读者个数     int o,ok=1;//标记     float k=0;float c;     scanf("%d",&day);     int ii=0;int i=0;     for(ii=0;ii<day;ii++)//输入日期并循环     {         ok=1;//标记重置         memset(t,0,sizeof(t)); memset(l,0,sizeof(l)); //数组清空         while(ok){             scanf(" %c %c %d:%d",&t[i][0],&t[i][1],&l[i][0],&l[i][1]);//输入一组数据             if  (t[i][0]!=48)//判断首位是否等于零             {                 for(o=i;o>=0;o--)                 {                     if (t[i][0]==t[o][0]&&t[i][1]=='E'&&t[o][1]=='S')//寻找历史数据，判断是否符合第一位相等且第二位分别为E或S，若是则进行下一步运算，否则继续寻找历史数据                     {                         k=k+minute(l[i][0],l[i][1],l[o][0],l[o][1]);                         w=w+1;                     }                 };//加和读者个数以及阅读时间  //这儿为啥加;分号                 i=i+1;             }//数组加一             else {                 if (w==0) {//判断读者个数是否为0， 若是则直接输出0，若不是则进行运算                     printf("0 0\n");                 }                 else {                     //c = round(k/w);    //round for double roundf() for float                     c = roundf(k/w);                     printf("%.0f %.0f\n",w,c);                 }                 w=0; k=0;ok=0;             }         }//数据重置，跳出循环     }     return 0; }  float minute(int p,int q,int x,int y) {     float min;     min = (p-x)*60+(q-y);//转化时间     return min; }  供参考～  怀疑是round的问题，但是不确定。  不过楼主的代码风格确实很独特，代码不长但是看着费劲呢。自己没感觉到吗？  我是本科生啊 刚学两个月C语言 确实不是很熟练 不过朋友给我改完以后还是不对 仍然有两组答案错误和一组段错误 不知道怎么回事


Question: 求助：C语音写430芯片

记录前半秒数据集，求一下max。 如果大数据的话，可以按时间序列，其值升序排序。即： a = 双端队列。 b = 新输入值。 输入时:       弹出a前端超出时间的，再弹出a后端小于b的，最后压入b.


Question: C++ cout<<的问题，求助！

引用 4 楼 coo135的回复:[quote=引用 3 楼 Italink 的回复:] 一般是从右往左，但最好不要再一个表达式中多次处理一个变量  这是表达式求值顺序的问题，不存在“一般是从右往左”的说法，这在C++规范中有详细的说明，所以第一张图的cout...的行为是未定义的。 楼主，求值顺序规则蛮多的，简单的讲，如要在一个表达式（准确的讲是在同一个求值点）中多次修改同一变量，则需要分开写。[/quote] 嗯嗯，记下了

引用 3 楼 Italink 的回复:一般是从右往左，但最好不要再一个表达式中多次处理一个变量  这是表达式求值顺序的问题，不存在“一般是从右往左”的说法，这在C++规范中有详细的说明，所以第一张图的cout...的行为是未定义的。 楼主，求值顺序规则蛮多的，简单的讲，如要在一个表达式（准确的讲是在同一个求值点）中多次修改同一变量，则需要分开写。

一般是从右往左，但最好不要再一个表达式中多次处理一个变量

执行的时候 右往做，输出的时候就是左→右

右往左 消。。

引用 5 楼 Italink 的回复:[quote=引用 4 楼 coo135的回复:][quote=引用 3 楼 Italink 的回复:] 一般是从右往左，但最好不要再一个表达式中多次处理一个变量  这是表达式求值顺序的问题，不存在“一般是从右往左”的说法，这在C++规范中有详细的说明，所以第一张图的cout...的行为是未定义的。 楼主，求值顺序规则蛮多的，简单的讲，如要在一个表达式（准确的讲是在同一个求值点）中多次修改同一变量，则需要分开写。[/quote] 嗯嗯，记下了[/quote]  补充一下哈，C++标准更新很快啊~~，从C++ 17开始，第一种写法是合法的，两者结果是一样的。 因为C++17中，规定了移位运算符的求值顺序：表达式 E1<<E2 和 E1>>E2 中，E1 的每个值计算和副作用都按顺序早于 E2 的每个值计算和副作用。

放心 很简单的  代码错 未定义行为 结果没意义

引用 6 楼 qq_1457346882 的回复:前面都说了解决就不献丑，不过有个疑问，A那个函数的参数是啥意思，传参再取址嘛？如果是传a的地址应该是int* x      A(&a）吧？  一. 值传递 1. 用值传递方式，实际上是把实参的内容复制到形参中，实参和形参是存放在两个不同的内存空间中。在函数体内对形参的一切修改对实参都没有影响； 2. 如果形参是类的对象，利用值传递的话每次都要调用类的构造函数构造对象，效率比较低。 二. 指针传递（地址传递） 1. 当进行指针传递的时候，形参是指针变量，实参是一个变量的地址或者是指针变量，调用函数的时候，形参指向实参的地址； 2. 指针传递中，函数体内可以通过形参指针改变实参地址空间的内容。 三. 传递引用 1.引用实际上是某一个变量的别名，和这个变量具有相同的内存空间； 2. 实参把变量传递给形参引用，相当于形参是实参变量的别名，对形参的修改都是直接修改实参； 3. 在类的成员函数中经常用到类的引用对象作为形参，大大的提高代码的效率。


Question: 当把某个字符数组赋值给char *的时候会发生什么？

如果想输出单个字符,应该是 printf("%c");

引用 5 楼 冷风1023 的回复:[quote=引用 3 楼 Jags 的回复:] 还有等号左边是不能自增的 自++没有问题，只是打印有问题，就像两位说的，如果用指针就用%s,如果有*就应该是%c printf("%s\n", --p);  或者 printf("%c\n", *--p); [/quote] 看错了，之前碰到一个类似#define p      (unsigned int *)0x08000000UL  的例子

引用 3 楼 Jags 的回复:还有等号左边是不能自增的可以的

引用 6 楼 自信男孩 的回复:*--p 这个是一个数值，即比如是'h'，而%s后面要对应的是一个地址，即字符串的地址。之所以出现段错误，是因为'h'开始的地址不能读写。  可以查一下'h'开始的地址是多少？即'h'的16进制数据值。 %s要求后面的跟的地址，而*--p是一个数值，那么把这个数值作为一个地址，系统认为这个地址是不能访问的，所以段错误了。

引用 3 楼 Jags 的回复:还有等号左边是不能自增的 自++没有问题，只是打印有问题，就像两位说的，如果用指针就用%s,如果有*就应该是%c printf("%s\n", --p);  或者 printf("%c\n", *--p);

p指向buf了，这个应该没有问题，应该是后面的出问题了

还有等号左边是不能自增的

把*--p的*去掉看一下


Question: 小学数学测验（C语言）（只差最后一个要求啦）

#include<iostream>  using namespace std;  //#include<time.h> #include<ctime> #include <cstring>  void Pd(int &sum,int a,int b) {     int x=3;     int y;     int s=0;     while(x--)     {         s++;         cout<<a<<"+"<<b<<"=";         cin>>y;         if(y==a+b)         {             cout<<"计算正确。下一题：";             if(s==1)                 sum+=10;             if(s==2)                 sum+=7;             if(s==3)                 sum+=5;             return;         }         else         {             cout<<"计算错误，请重新输入";             if(s==3)             {                 cout<<"下面的等式才是正确的哦";                 cout<<a<<"+"<<b<<"="<<a+b<<endl;             }         }     } }  void Pdl(int &sum,int a,int b) {     int x=3;     int y;     int s=0;     while(x--)     {         s++;         cout<<a<<"-"<<b<<"=";         cin>>y;         if(y==a-b)         {             cout<<"计算正确。下一题：";             if(s==1)                 sum+=10;             if(s==2)                 sum+=7;             if(s==3)                 sum+=5;             return;         }         else         {             cout<<"计算错误，请重新计算";             if(s==3)             {                 cout<<a<<"-"<<b<<"="<<a-b<<endl;             }         }     } }  int main() {     int n=10;     int sum=0;     int a,b,c;     int s=1;     srand((int)time(0));     char name[32], date[32];     time_t tm;      cout<<"Please input your name: ";     cin>>name;     FILE *fp = fopen("1.txt", "a+");     if (!fp)         return -1;      cout<<"本次测试现在开始，一共十道题目。一题十分，满分为一百分。每个题目有三次机会回答，第一次答对得十分，第二次答对得7分，第三次答对得5分。若三次都不对，则0分。";     while(n--)     {         cout<<"第"<<s++<<"题为：";         a=rand()%10+15;         b=rand()%10+15;         c=rand()%10;         //cout<<c<<endl;         if(c%2==0)         {             Pd(sum,a,b);         }         else             while(1)             {                 if(a>=b){Pdl(sum,a,b);break;}                 else                 {                     a=rand()%10+15;                     b=rand()%10+15;                 }             }         cout<<endl;     }      cout<<"您的总成绩为："<<sum<<endl<<endl;     while(1)     {         if(sum>=90)         {cout<<"SMART";break;}         if(sum>=80&sum<90)         {cout<<"GOOD";break;}         if(sum>=70&sum<80)         {cout<<"OK";break;}         if(sum<60)         {cout<<"TRY AGAIN";break;}         else         {             cout<<"PASS";break;}     }      tm = time(NULL);     ctime_r(&tm, date);     date[strlen(date)-1] = 0;   //rm '\n'     fprintf(fp, "%s %s %d\n", name, date, sum);     fclose(fp);     //fprintf(fp, "%s %s %d\n", name, ctime(time()), sum);     return 0; } 供参考～  详见main函数内

定义变量获取日期时间，有函数的 这里存储因为看题目要存储多个，所以建议你做个结构体来存信息，再创建文件把结构体整个写进去就好了，都是直接调用函数就可以了，因为平台可能不一样，就不给你具体函数了，百度一下就都出来了


Question: 小白

输出结果是这样

#include <stdio.h> #include <math.h> int main() {         double x1,y1;         double x2,y2;         scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);         float d =sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));         printf("%f\n",d);         return 0; } 输出 0 0 3 4 5.000000 如果要5的话 printf("%.f\n",d);

改成%f之后就这样了

但要求是不输出多余的0

输出格式错了，应该用f而不是g，如果要控制位数就.几f

单精度浮点数的格式控制符为%f

引用 6 楼 blurryfaceu 的回复:输出结果是这样 scanf函数写错了。应该是scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); 你的双引号把要赋值的变量都包括进去了，就等于没赋值。

x1, y1, x2, y2都是随机值呀，输出的结果是未定义的。  还有sqrt得到的是double类型，如果用float去接收，势必会截断数据，double是8字节，float是4字节（32位系统下）

1.首先你的x1,y1,x2,y2，没有赋值，按你的程序应该是想用sacnf进行赋值的。测试了一下，在main函数里，首次定义的double x1，x2,x3,x4，若没有经过初始化，值全都是0，所以你的测试结果一直都是0; （很奇怪，每次运行main函数，查看这四个变量的地址都是一样的，但是，如果我初始化并赋值，比如说x1=3,x2=4,x3=5,x4=6，按理说下次创建的时候，如果地址一样，x1,x2,x3,x4的初始值值应该会变成3，4，5，6，但是还是0。（换了另一个工程下的函数测试也全为0）而且如果在后面又定义了double y1,y2,y3,y4。此时y1的值会大概率一直变化，其余都是0，不知道为什么。）  2.其次，float d = sqrt()这一条语句，把double类型强制转换成了float类型，可能会造成精度丢失。如果题目要求是不输出多余的0，用%g输出是应该的。它会以较短的方式输出实数。


Question: c语言小程序用swicth语句输出成绩评语

引用 5 楼 若歌的回复:输入成绩除10求商，再switch一下怎么样？ 我就是这么解决的，哈哈哈

引用 8 楼 lin5161678 的回复:引用 6 楼 chxchxkkk 的回复:除非你能确定 发帖人的编译环境支持这个特性 否则这个特性不能作为通用规则描述 你的意见是正确的

switch (n/10) {     case 10: case 9:     break;     case 8:     break; .... ...  可以考虑这样，减少case的次数

引用 6 楼 chxchxkkk 的回复:引用 4 楼 lin5161678 的回复:[quote=引用 2 楼 chxchxkkk 的回复:] case 90 ... 100:      是大于等于90 小于100的意思,注意中间是三个点没这样的用法 [/quote]这是编译器方言 只在某个特定编译器上面有效

引用 4 楼 lin5161678 的回复:引用 2 楼 chxchxkkk 的回复:case 90 ... 100:      是大于等于90 小于100的意思,注意中间是三个点没这样的用法

输入成绩除10求商，再switch一下怎么样？

第十二行，case没有空格

有大神指导一下吗


Question: virtual judge上一道快速排序，我用c的程序，VS上正常运行，到virtual judge上就显示Segmentation Fault，想问问怎么回事

但是题目要求数组元素个数n<100000

int a[100000]; 这个数组定义是否有点大了，弄小点试试

while(a[--j]>key && i < r); //@1 while(a[++i]<key);    //@2  改成 while(a[--j]>key )｛ if(j == p)break; } while(a[++i]<key) { if(i == r) break; }  ========= 首先@1, 两个地方不对：分析如下 1.因为是对j, 自减，你要防止j 越界，这里不是判断i < r, 应该是i要大于等p，不能超过左边界 2.就算是改成这样while(a[--j] > key && j >= p;这样呢  ？你认为OK了吗？   还是有问题的，假设j==p，这时候while还会继续走一次， 下一次 whlie条件走了前面一半，(a[--j] > key), j又越界了 那么改成 while(a[--j] > key && j >p); 如何？ OK了,


Question: C语言单链表递归输出报错

引用 5 楼 自信男孩 的回复:[quote=引用 3 楼 baidu_38357721 的回复:] [quote=引用 2 楼 自信男孩 的回复:] #include<stdio.h> #include<stdlib.h>  struct  node {     char num[20];     struct node * link; }; //typedef node NODE; typedef struct node NODE;  int create(NODE *head,int n); int output(NODE *head); void show(NODE *phead); //void main() int main() {     NODE *head ;     NODE *p;     p=(NODE*)malloc(sizeof(NODE));     p->link=NULL;     head=p;     printf("please enter 5 numbers separated by new lines:\n");     //int create(NODE *head,int n);     create(head,5);     //show(head);     printf("the numbers output:\n");     //int output(NODE *head);     output(head->link); }  int create(NODE *head,int n) {     NODE *p, *prev;      prev = head;     for(int i=0;i<n;i++)     {         p=(NODE*)malloc(sizeof(NODE)) ;         fgets(p->num, 20, stdin);         prev->link = p;         prev = p;     }     return 0; }  void show(NODE *phead) {     NODE *p = phead->link;      while (p) {         printf("%s\n", p->num);         p = p->link;     } }  int output(NODE *head) { #if 1     if (!head)         return 0;      output(head->link);     puts(head->num); #else     if(p!=NULL && p->link!=NULL)     {         //output(NODE* p->link);         output(p->link);     }     if(p!=NULL)         puts(p->num); #endif     return 0; }  供参考～  有问题的地方都做了修改，供参考～  这个没报错，但是不能输出。还有show函数是干什么用的呀，是输出一遍开始输入的字符的吗？[/quote] 测试没问题才发给你的，你确定输入了5个吗？[/quote]  是五个。我又看了一遍，发现初始出错的其实是输入的部分，已经改好啦，谢谢~~

引用 3 楼 baidu_38357721 的回复:[quote=引用 2 楼 自信男孩 的回复:] #include<stdio.h> #include<stdlib.h>  struct  node {     char num[20];     struct node * link; }; //typedef node NODE; typedef struct node NODE;  int create(NODE *head,int n); int output(NODE *head); void show(NODE *phead); //void main() int main() {     NODE *head ;     NODE *p;     p=(NODE*)malloc(sizeof(NODE));     p->link=NULL;     head=p;     printf("please enter 5 numbers separated by new lines:\n");     //int create(NODE *head,int n);     create(head,5);     //show(head);     printf("the numbers output:\n");     //int output(NODE *head);     output(head->link); }  int create(NODE *head,int n) {     NODE *p, *prev;      prev = head;     for(int i=0;i<n;i++)     {         p=(NODE*)malloc(sizeof(NODE)) ;         fgets(p->num, 20, stdin);         prev->link = p;         prev = p;     }     return 0; }  void show(NODE *phead) {     NODE *p = phead->link;      while (p) {         printf("%s\n", p->num);         p = p->link;     } }  int output(NODE *head) { #if 1     if (!head)         return 0;      output(head->link);     puts(head->num); #else     if(p!=NULL && p->link!=NULL)     {         //output(NODE* p->link);         output(p->link);     }     if(p!=NULL)         puts(p->num); #endif     return 0; }  供参考～  有问题的地方都做了修改，供参考～  这个没报错，但是不能输出。还有show函数是干什么用的呀，是输出一遍开始输入的字符的吗？[/quote] 测试没问题才发给你的，你确定输入了5个吗？

引用 1 楼 地球太平洋 的回复:typedef node NODE;   改成typedef struct node NODE;  谢谢，但是把下面的也改成 output(p->link); 就不报错了，但是不能输出了呢？

引用 2 楼 自信男孩 的回复:#include<stdio.h> #include<stdlib.h>  struct  node {     char num[20];     struct node * link; }; //typedef node NODE; typedef struct node NODE;  int create(NODE *head,int n); int output(NODE *head); void show(NODE *phead); //void main() int main() {     NODE *head ;     NODE *p;     p=(NODE*)malloc(sizeof(NODE));     p->link=NULL;     head=p;     printf("please enter 5 numbers separated by new lines:\n");     //int create(NODE *head,int n);     create(head,5);     //show(head);     printf("the numbers output:\n");     //int output(NODE *head);     output(head->link); }  int create(NODE *head,int n) {     NODE *p, *prev;      prev = head;     for(int i=0;i<n;i++)     {         p=(NODE*)malloc(sizeof(NODE)) ;         fgets(p->num, 20, stdin);         prev->link = p;         prev = p;     }     return 0; }  void show(NODE *phead) {     NODE *p = phead->link;      while (p) {         printf("%s\n", p->num);         p = p->link;     } }  int output(NODE *head) { #if 1     if (!head)         return 0;      output(head->link);     puts(head->num); #else     if(p!=NULL && p->link!=NULL)     {         //output(NODE* p->link);         output(p->link);     }     if(p!=NULL)         puts(p->num); #endif     return 0; }  供参考～  有问题的地方都做了修改，供参考～  这个没报错，但是不能输出。还有show函数是干什么用的呀，是输出一遍开始输入的字符的吗？


Question: c语言程序问题

你的c定义成int了，但是你输入的是字符

引用 14 楼 折腾的小飞 的回复：[quote=引用 13 楼 折腾的小飞 的回复：]建议重新学一下字符输入输出函数，getchar函数一次只能输入一个字符；printf函数输出不能那样写，双引号，分号，格式字符也没有； 你这个是输入\t，getchar取了前面的\，对应下面的c=”\\”，输出\\\\，实际是\\，就是你这个结果看错了switch循环输入，我再看看[/quote]我看了一下确实是输出的第三个if语句的结果\\\\

引用 13 楼 折腾的小飞 的回复：建议重新学一下字符输入输出函数，getchar函数一次只能输入一个字符；printf函数输出不能那样写，双引号，分号，格式字符也没有； 你这个是输入\t，getchar取了前面的\，对应下面的c=”\\”，输出\\\\，实际是\\，就是你这个结果看错了switch循环输入，我再看看

引用 10 楼 GKatHere的回复:[quote=引用 8 楼 weixin_45718499 的回复:] main() { 	int c; 	while((c=getchar())!=EOF){ 		if(c=='\t') 			printf("\\t"); 		if(c=='\b') 			printf("\\b"); 		if(c=='\\') 			printf("\\\\"); 		if(c!='\b') 			if(c!='\t') 				if(c!='\\') 					printf(c); 	}	 	return; } 错了，printf(c);应为printf("%c", c);  你的编译器竟然没有把这个问题检测出来。[/quote] 最近写多java了，有点混乱，不知你是用什么编译器，我也下载一个。

引用 8 楼 weixin_45718499 的回复:main() { 	int c; 	while((c=getchar())!=EOF){ 		if(c=='\t') 			printf("\\t"); 		if(c=='\b') 			printf("\\b"); 		if(c=='\\') 			printf("\\\\"); 		if(c!='\b') 			if(c!='\t') 				if(c!='\\') 					printf(c); 	}	 	return; } 错了，printf(c);应为printf("%c", c);  你的编译器竟然没有把这个问题检测出来。

你输入了\t，那就是输入两个字符了 简单来说你记住，输入没有转义，输出才有转义一说

引用 6 楼 GKatHere 的回复:[quote=引用 4 楼 weixin_45718499 的回复:] [quote=引用 1 楼 GKatHere的回复:]'\t'为输入，那么只输出'\\', 确实不对 那你知道是什么问题吗？[/quote] 我的输出为'\\t',要不你把实际代码传上来看看是不是有细微不同？[/quote] #include<stdio.h> main() { 	int c; 	while((c=getchar())!=EOF){ 		if(c=='\t') 			printf("\\t"); 		if(c=='\b') 			printf("\\b"); 		if(c=='\\') 			printf("\\\\"); 		if(c!='\b') 			if(c!='\t') 				if(c!='\\') 					printf(c); 	}	 	return; }

引用 5 楼 user-5的回复:[quote=引用 3 楼 weixin_45718499 的回复:] [quote=引用 2 楼 user-5的回复:]没什么不对  你输入 \ c == '\\' 这个判断成立 输出 \\ 你输入t 你全部 if 都不满足这个输入  自然什么都没输出 我输入的是\t的，它不是应该输出\\t吗？[/quote]输入\t 不是这样输入的 你得按tab键 键盘左边 6个按键 从上到下依次是  esc `~ tab caps lock shift ctrl 第三个 输入这个才是 \t  [/quote] 我刚才又试了一下它这次输出的是\t还是少了一个反斜杠

引用 4 楼 weixin_45718499 的回复:[quote=引用 1 楼 GKatHere的回复:]'\t'为输入，那么只输出'\\', 确实不对 那你知道是什么问题吗？[/quote] 我的输出为'\\t',要不你把实际代码传上来看看是不是有细微不同？

引用 3 楼 weixin_45718499 的回复:[quote=引用 2 楼 user-5的回复:]没什么不对  你输入 \ c == '\\' 这个判断成立 输出 \\ 你输入t 你全部 if 都不满足这个输入  自然什么都没输出 我输入的是\t的，它不是应该输出\\t吗？[/quote]输入\t 不是这样输入的 你得按tab键 键盘左边 6个按键 从上到下依次是  esc `~ tab caps lock shift ctrl 第三个 输入这个才是 \t

引用 1 楼 GKatHere的回复:'\t'为输入，那么只输出'\\', 确实不对 那你知道是什么问题吗？

引用 2 楼 user-5的回复:没什么不对  你输入 \ c == '\\' 这个判断成立 输出 \\ 你输入t 你全部 if 都不满足这个输入  自然什么都没输出 我输入的是\t的，它不是应该输出\\t吗？

'\t'为输入，那么只输出'\\', 确实不对


Question: 加window头文件就不能运行

我碰到有的自己不会的问题，我就逐渐减少代码量一点一点筛查。 有的时候ide会出问题  这个我也不太懂  反正换了重新跑一次代码就正常了，也不报错啥的😂

引用 17 楼 xiaobaicaiaihe的回复:[quote=引用 13 楼 akari10032的回复:]估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 但为什么不加Windows头文件我直接用Max就可以运行，加了Windows就函数重载，难道头文件会导致函数重载吗[/quote] 函数重载是，两个函数的函数名相同，参数个数或参数类型不同，概括说就是形参列表不同，包含windows.h就相当于把这个头文件里的函数都写在了你的这个文件，windows里面可能有max函数，你也自定义了一定同名函数，所以会出错。

引用 14 楼 akari10032的回复:另外，自己写函数最好不要直接用max，min，swap，sort之类的看起来很简洁的命名，这些很可能系统头文件已经使用了，加一个一眼就能看出来是自定义的标识，比如my_xxx，或者projectname_xxx 谢谢指导 OK

确实不知道，你这也没几个代码，顶多重新写一遍。  新建工程。建好运行一遍。。 再include<windows.h>,再运行一遍。 再写，再运行，直到出错，或者没再出错了。就可以对比一下。 但重写时，不建议复制粘贴

引用 10 楼 千梦一生的回复:留下include <windows.h>把你那个max删了重写。包括声明 先删掉，直接运行main。看有没有错，有错改了。 再重新写一遍你的max 我试试看，谢谢

引用 7 楼 千梦一生的回复:把windows.h扔到最上面去。看看报错有没有什么变化。 有时候遇到一些错误，确实有点莫名其妙，只能尽量干了。尽量排查。缩小范围。  以前自己也遇到过奇奇怪怪的问题。也有没有解决出来的时候，只有全部放弃从头再来。 把他放到最上面也一样，但是把他放到double自定义函数下面 报错地方就变了 变到下面的调用函数那里就double  max（double a，double b）

引用 6 楼 千梦一生的回复:有没有不小心动过windows.h 我就直接打Windows头文件，没有这个头文件就可以运行，有就不行，但我添加其他的头文件就可以

有没有不小心动过windows.h

不知道。这个问题有点难

引用 18 楼 akari10032的回复:[quote=引用 17 楼 xiaobaicaiaihe的回复:][quote=引用 13 楼 akari10032的回复:]估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 但为什么不加Windows头文件我直接用Max就可以运行，加了Windows就函数重载，难道头文件会导致函数重载吗[/quote] 感觉有点误导你了，你暂时把重载这两个字忘掉吧，C里压根没有重载的概念。另外这个头文件里是用宏实现的max，你可以点进去看看。不懂的话去学下关于宏定义的知识[/quote] okay ....

引用 17 楼 xiaobaicaiaihe的回复:[quote=引用 13 楼 akari10032的回复:]估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 但为什么不加Windows头文件我直接用Max就可以运行，加了Windows就函数重载，难道头文件会导致函数重载吗[/quote] 感觉有点误导你了，你暂时把重载这两个字忘掉吧，C里压根没有重载的概念。另外这个头文件里是用宏实现的max，你可以点进去看看。不懂的话去学下关于宏定义的知识

引用 13 楼 akari10032的回复:估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 但为什么不加Windows头文件我直接用Max就可以运行，加了Windows就函数重载，难道头文件会导致函数重载吗

引用 13 楼 akari10032的回复:估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 确实是可以了

引用 3 楼 真相重于对错的回复:看错了 那请问那里有问题？

看错了

引用 1 楼 真相重于对错的回复:c不支持函数重载吧? 什么意思，能说具体点吗，谢谢


Question: 求助大佬！（快速幂转换成快速加）

引用 1 楼 user-1的回复:a, b, c, d; a == b+c; 即：a%d == (b%d + c%d)%d pow(2, n) == pow(2, n-1) +pow(2, n-1) ; pow(2, n)%d == ((pow(2, n-1)%d)  *2)%d; 就这样分解就是 嗷嗷嗷，谢谢您！！！*罒▽罒*


Question: c语言求指教，大神来看看

引用 8 楼 @大愚@的回复:你是不是，输入的时候没有输入对应的逗号我刚才就忘输入了 哈哈哈不是我解决了，都是需要%g这个类型的

你是不是，输入的时候没有输入对应的逗号我刚才就忘输入了

引用 4 楼 ?Victor.??的回复:#include <stdio.h> int main() { 	float x,y,z,a; 	scanf("%f,%f,%f",&x,&y,&z); 	if(x>y) 		a=y; 	else 		a=x; 	if(z>a) 		printf("%g",a); 	else 		printf("%g",z); 	return 0; }  哦，他还考虑了格式，试试这个 没这个错了，跟我的结果一样

引用 4 楼 ?Victor.??的回复:#include <stdio.h> int main() { 	float x,y,z,a; 	scanf("%f,%f,%f",&x,&y,&z); 	if(x>y) 		a=y; 	else 		a=x; 	if(z>a) 		printf("%g",a); 	else 		printf("%g",z); 	return 0; }  哦，他还考虑了格式，试试这个 好👌谢谢啦，我去试试看

测试用例有浮点数，所以x, y，z需要是浮点数。

引用 2 楼 ?Victor.??的回复:把int 改成 float  测试用例不是有小数吗 改了还没用还是全部错误了

把int 改成 float  测试用例不是有小数吗

有人吗大哥们


Question: c语言小程序，求指教

发过来看下吧

引用 2 楼 云销-雨霁的回复:#include <stdio.h>”  int main() { 	float t,weight,high;  	printf("input weight: "); 	scanf("%f",&weight); 	printf("input high: "); 	scanf("%f",&high);  	t = weight/(high*high);  	if(t<18) 	{ 		printf(" 低体重"); 	} 	else if((t >= 18) && (t < 25))  	{ 		printf("正常体重"); 	} 	else if((t > 25) && (t <= 27) ) 	{ 		printf("正常体重"); 	} 	if(t > 27) 	{ 		printf("超重"); 	}  }; 可以帮我看看另外一个吗

小白.求指教


Question: double浮点数0.5可以精确表达吗？乘于2以后有没有可能变成0.99999999999999x取整为0？

引用 3 楼 ooolinux 的回复:[quote=引用 2 楼 user-1 的回复:] 0.5和1都可以精确表示  ok，我记得0.5，0.25，0.125。。以及它们的组合都是可以精确表达的，都有对应的二进制位。[/quote]是的

引用 2 楼 user-1 的回复:0.5和1都可以精确表示  ok，我记得0.5，0.25，0.125。。以及它们的组合都是可以精确表达的，都有对应的二进制位。

0.5和1都可以精确表示

如果无法精确就要加个0.00...01修正了。


Question: c

在结尾值为0时 char*可用strlen判断长度 wchar*,long char*,(unsigned )short*可用wcslen判断长度 unsigned*/int */float *自行写函数判断  unsigned pintlen(int *array){     unsigned len = 0;     while (*array++) len++;     return len; }  (unsigned )long*/double *在32位时如上,在64位时将上述代码int改为long

[b]//利用 strlen函数计算数组内元素个数 若数组类型为float,double类型的数组无法使用strlen函数计算[/b] #include<stdio.h> #include<string.h>   int main() { 	char String[20] = {1,2.1,3,4,5,6,7,8,9}; 	printf("数组逆序输出\n"); 	// strlen()用来计算指定的字符串s 的长度，不包括结束字符"\0"。 	for (int i = strlen(String) - 1; i >= 0; i--)     printf("%d ", String[i]); }  测试结果

for (i = length-1; i >= 0; i--)     printf("xxx", arr[i]);[/color]


Question: 在线程中创建 CreateDialog卡死

引用 4 楼 真相重于对错 的回复:多线程访问UI，需要发送消息。  难住我了， 我刚学，您的介绍太笼统，让我一脑子浆糊， 而且我这是需要在宿主进程内执行的代码，宿主应该不会给我发送的消息的。

多线程访问UI，需要发送消息。

我在网上找到相关的介绍了， 但是我看见有部分的人的程序，没有经过特别的加工 也能在dll创建ui不知道咋做到的 引用 1 楼 真相重于对错 的回复:我记得多线程，不特别修改，除主线程外不能直接使用ui

自己顶一下

我记得多线程，不特别修改，除主线程外不能直接使用ui


Question: 怎样将实验数据替换HHT代码中的示例函数

顶顶 啊，，，

有没有人能帮一下我


Question: 编程题，从文件 data.txt 输入数据，然后输出到文件 result.txt。

引用 1 楼 自信男孩 的回复:版主？你确认是在问问题？  打开文件，读写文件的操作。网上可以搜一下的 你看清下题目，这道题目是先输入数据到data.txt然后在输出结果到result.txt，输出的结果你自己仔细看看，我现在第一步 就是有点没搞懂这个输入多行数据到文件中怎么弄

你仔细看看这个题目

版主？你确认是在问问题？  打开文件，读写文件的操作。网上可以搜一下的


Question: c程序设计问题

引用 2 楼 zedd3337502212 的回复:[quote=引用 1 楼 自信男孩 的回复:] 楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11. 那个确实是我笔误了，但改了后还是不显示  问题应该在循环体里[/quote] 在你的代码基础上作了些修改，供参考  #include <stdio.h> #include <string.h> #define N 3  typedef struct person { 	char name[20]; 	int count; } Leader;  int main() {     Leader leader[N] = {"li", 0, "zhang", 0, "wang", 0}; 	int i; 	char leader_name[20]; 	for (i=0; i<N; i++) 	{ 		printf("请输入候选人的名字：\n"); 		gets(leader_name); 		if (strcmp(leader_name, leader[0].name) == 0) 		   leader[0].count++;         else if (strcmp(leader_name, leader[1].name) == 0) 		   leader[1].count++;         else if (strcmp(leader_name, leader[2].name) == 0) 		   leader[2].count++; 	} 	 	for (i=0; i<N; i++) 	{ 		printf("%5s : %d\n", leader[i].name, leader[i].count); 	}	 	 	getchar(); 	return 0; }

引用 3 楼 自信男孩 的回复:[quote=引用 2 楼 zedd3337502212 的回复:] [quote=引用 1 楼 自信男孩 的回复:] 楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11. 那个确实是我笔误了，但改了后还是不显示  问题应该在循环体里[/quote] 我还怀疑你输入10次了吗？因为上一个循环循环次数是10次。[/quote] 破案了 我忘记输入10次了。。 感谢指点。

引用 2 楼 zedd3337502212 的回复:[quote=引用 1 楼 自信男孩 的回复:] 楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11. 那个确实是我笔误了，但改了后还是不显示  问题应该在循环体里[/quote] 我还怀疑你输入10次了吗？因为上一个循环循环次数是10次。

引用 1 楼 自信男孩 的回复:楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11. 那个确实是我笔误了，但改了后还是不显示  问题应该在循环体里


Question: 求问关于VS run-time check failure #3报错的问题

引用 1 楼 user-1 的回复:你B没有初始化，DEBUG模式下会提示你，因为逻辑原因，导致你有可能使用没有初始化得变量。 哦哦我知道了，那看来是我写的有问题导致b的赋值失败了。 谢谢大佬！


Question: 链表插入之后，发现链表最后一个节点与插入的节点（打印的时候陷入死循环）

#include <stdio.h> #include <stdlib.h> /* typedef struct link { 	int data; 	struct link *next; }*linklist, listnode;  //*/#include "linklist.h" linklist Create_List(int n) {//创建n个长度的链表 	int i=0; 	linklist head,L,prep; 	if(n<=0){ 		puts("invalid element input!"); 		exit(0); 	} 	head=prep=(linklist)malloc(sizeof(listnode)); 	if(head == NULL){ 		puts("malloc failed!"); 		return head; 	} 	for(i=1; i<=n; i++){ 		if((L=(linklist) malloc (sizeof(listnode))) == NULL){ 			puts("failure to apply new space!"); 			return head; 		} 		else{ 			L->data = i; 			prep->next = L; 			prep = L; 		}  	} 	prep->next = NULL; 	//free(L);   //为什么要释放L呢，L已经加入到head链表里了 	return head; } int Insert_List(linklist head, int pos){//插入第pos位置的一个链表 	linklist p; 	p = head; 	linklist L = (linklist)malloc(sizeof(listnode)); 	L ->data = 99; 	L->next = NULL; 	int i=0; 	if (head ==NULL){ 		puts ("this list is null"); 		return -1; 	} 	if(L==NULL){ 		puts("new list is NULL"); 		return -1; 	} 	if(pos<=0){ 		puts("an error occurred in the location of the new list"); 		return -1; 	} 	//else{ 	while(p->next!=NULL){ 		p=p->next; 		i++; 		if(i==pos){ 			printf("yes\n"); 			L->next=p->next; 			p->next = L; 			//free(L);//为啥释放呢？ 			return 0; 		} 	} 	free(L);//为啥不释放呢？ 	puts("cross-border access"); 	return -1; 	//	} } int Is_Empty_List(linklist head){//是否为空 ，我没用这个函数 	if(head->next==NULL){ 		puts("this list is empty"); 		return -1; 	} 	else{ 		return 1; 	} } void Show_list(linklist head){//打印链表 	if(head == NULL){ 		puts("the head is null!"); 		return; 	} 	int i=0; 	linklist L; 	L = head->next; 	//while(L->next != NULL){ 	while(L != NULL){ 		i++; 		printf("the number %d -> data is %d\n",i,L->data); 		L=L->next; 	} 	return; }  /* int main(void) {  	linklist phead;  	phead = Create_List(10);  	Insert_List(phead, 5); 	Show_list(phead); }*/ 供参考～  不该释放的地方释放了，该释放的地方没有释放～


Question: 【求助】函数指针数组总是通不过

int mian() --> int main()

int mian()


Question: 自增运算符问题

这有关编译器的具体实现,如果真想弄清楚,需要查看反汇编代码,不过这样做也没什么具体意义

不用太纠结，很烦的

你只要知道: int i=3; int a=i++;  a=3;i=4； int b=++i; b=5;i=5 这样就好了，主要的知识点是i++和++i在赋值的时候的变化。 实际工作中是不会写你那样的代码的，要挨批评的。

几十年了，老是有人问同一行一个变量多次++--，别这样写，没有C强制标准，编译器自己实现，就是编译器啥结果都可以理解为符合C规范.

未定义行为 结果没意义 不用讨论


Question: C语言链表问题

snode *node = (snode*)malloc(sizeof(snode));改： struct snode *node = (struct  snode*)malloc(sizeof(struct snode));

引用 2 楼 flowkiller 的回复:[quote=引用 1 楼 自信男孩 的回复:] #include <stdio.h> #include <stdlib.h> #include <string.h> struct snode {     char * str;     struct snode *next; };  struct snode *snode_create(char *s) ; void snode_destroy(struct snode * s) ;  ----------------------------------------------- //snode.c #include <stdio.h> #include "snode.h" #include <string.h> #include <stdlib.h> struct snode *snode_create(char *s) {     snode *node = (snode*)malloc(sizeof(snode));     if (!node)         exit(0);     node->str = (char*)malloc(sizeof(char) * strlen(s)+1);    //注意给'\0'留个空间     if (!node->str)         exit(0);     strcpy(node->str, s);     node->next = NULL;     return node; }  void snode_destroy(struct snode * s) {     free(s->str);     free(s); }//; 供参考～  报错啦 [/quote]  #include <stdio.h> #include <stdlib.h> #include <string.h> struct snode {     char * str;     struct snode *next; };  struct snode *snode_create(char *s) ; void snode_destroy(struct snode * s) ;  ----------------------------------------------- //snode.c #include <stdio.h> #include "snode.h" #include <string.h> #include <stdlib.h> struct snode *snode_create(char *s) {     struct snode *node = (struct snode*)malloc(sizeof(struct snode));     if (!node)         exit(0);     node->str = (char*)malloc(sizeof(char) * strlen(s)+1);    //注意给'\0'留个空间     if (!node->str)         exit(0);     strcpy(node->str, s);     node->next = NULL;     return node; }  void snode_destroy(struct snode * s) {     free(s->str);     free(s); }//; 加上struct，C语言不支持只写结构体名。

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> struct snode {     char * str;     struct snode *next; };  struct snode *snode_create(char *s) ; void snode_destroy(struct snode * s) ;  ----------------------------------------------- //snode.c #include <stdio.h> #include "snode.h" #include <string.h> #include <stdlib.h> struct snode *snode_create(char *s) {     snode *node = (snode*)malloc(sizeof(snode));     if (!node)         exit(0);     node->str = (char*)malloc(sizeof(char) * strlen(s)+1);    //注意给'\0'留个空间     if (!node->str)         exit(0);     strcpy(node->str, s);     node->next = NULL;     return node; }  void snode_destroy(struct snode * s) {     free(s->str);     free(s); }//; 供参考～  报错啦


Question: 关于销毁栈的操作疑问

手动申请的（new)，那么需要手动释放(delete)，否则申请的内存会成为碎片，下次这部分内存就不会再次被申请。当然你的程序执行完会被操作系统释放，但是前提是程序退出了。因此开发服务器程序，就需要注意这个情况，因为服务器程序一般不退出

OK内存了解了，那我直接让S . base = S . top = NULL，让两个指针不在指向栈。可以算是销毁栈吗？(空间是否释放先忽视)

base的内存应该是动态申请的吧，这样的话你自己不销毁，操作系统不会给你释放，delete与new 是成对存在的。


Question: 求二维数组所有素数的和

#include <stdio.h>  int main() {       int arr[3][3] = {0};     int i, j, sum = 0;     for (i=0; i<3; i++)     {         for (j=0; j<3; j++)         {             scanf("%d", &a[i][j];         }     }      for(i=0;i <3; i++)     {         for (j=0; j<3; j++)         {             if (不是素数)  //---》 自己写个判断素数的函数                continue;             else                sum += a[i][j];        }     }      printf("%d", sum);      getchar();     return 0; }  大致是这么个流程，写个判断是否是素数的子函数，


Question: 小白想请教一下关于c语言指针数组输入问题

&a[i] == p+i a[i] == *(p+i)

引用 6 楼 自信男孩 的回复:#include<stdio.h> #include<stdlib.h>  typedef int elemtype;  typedef struct lnode{     elemtype data;     struct lnode *next; }lnode,*linklist;  void insert_sortlist(linklist &L,elemtype e) {     linklist p,s;     s=(linklist)malloc(sizeof(lnode));     if (!s)         exit(0);     s->data=e;     p = L;     while(p->next&&p->next->data <= e)         p = p->next;     s->next = p->next;     //s->next = s;     p->next = s; }  void create_sortlist(linklist &L) {     elemtype e;     L=(linklist)malloc(sizeof(lnode));     L->next=NULL;     printf("建立一个有序链表，输入整形数据以0结束\n");     scanf("%d",&e);     while(e)     {         insert_sortlist(L,e);         scanf("%d", &e);     } }  void mergeincrease(linklist &La,linklist &Lb,linklist &Lc) {     linklist p,q,s,rear;     p=La->next;     q=Lb->next;     Lc=rear=La;     free(Lb);     while(p&&q)     {         if(p->data<q->data)         {s=p;             p=p->next;         }         else         {s=q;             q=q->next;         }         rear->next=s;         rear=rear->next;     }     if(p)         rear->next=p;     else         rear->next=q;  }  void visit_link(linklist phead) {     linklist p = phead->next;      while (p) {         printf("%d ", p->data);         p = p->next;     }     putchar(10); }  /*void traverse(linklist Lc)   {   linklist p;   printf("合并后的链表为:");   for(p=Lc->next;p;p=p->next)   printf("%d",p->data);   printf("\n");   }*/  int main() {     linklist La,Lb,Lc;     create_sortlist(La);     visit_link(La);     create_sortlist(Lb);     visit_link(Lb);     mergeincrease(La,Lb,Lc);     linklist p;     printf("合并后的链表为:");     visit_link(Lc);     /*     for(p=Lc->next;p;p=p->next)         printf("%d",p->data);         */  } 供参考～ 抱歉，发错位置了。  &a[i]等价p+i；也等价a+i。

p++与&a[i]等价的条件是：数组a是连续存储的。  就相当于你要去306、307、308拿东西，只要找到三楼第六个房间（306）就可以依次到房间里拿东西（p++)；而&a[i]相当于说：三楼第六个房间、三楼第七个房间、三楼第八个房间……

引用 2 楼 user-5 的回复：没区别 你要问的是&a[i]和p+i吧，这两者等价的 都是指a[i]这个元素的地址书上写的for（略）scanf（”%d”,p++)；我就想问问大佬这个p++是否完全等价于&a[i]之间没有啥子区别吗

引用 4 楼 screen_ok 的回复：指针是间接寻址，就相当于你在一张纸上记录了一个房间地址（比如几楼几室），要找到纸看到房间地址才能去房间里拿东西；取地址符是直接寻址，就是你知道房间在几楼几室，可以直接去房间里拿东西。  不要纠结于概念（为了考试除外），多看例子，多写程序，自然就懂了！谢谢

引用 7 楼 自信男孩 的回复：[quote=引用 6 楼 自信男孩 的回复:] #include<stdio.h> #include<stdlib.h>  typedef int elemtype;  typedef struct lnode{     elemtype data;     struct lnode *next; }lnode,*linklist;  void insert_sortlist(linklist &L,elemtype e) {     linklist p,s;     s=(linklist)malloc(sizeof(lnode));     if (!s)         exit(0);     s->data=e;     p = L;     while(p->next&&p->next->data <= e)         p = p->next;     s->next = p->next;     //s->next = s;     p->next = s; }  void create_sortlist(linklist &L) {     elemtype e;     L=(linklist)malloc(sizeof(lnode));     L->next=NULL;     printf("建立一个有序链表，输入整形数据以0结束\n");     scanf("%d",&e);     while(e)     {         insert_sortlist(L,e);         scanf("%d", &e);     } }  void mergeincrease(linklist &La,linklist &Lb,linklist &Lc) {     linklist p,q,s,rear;     p=La->next;     q=Lb->next;     Lc=rear=La;     free(Lb);     while(p&&q)     {         if(p->data<q->data)         {s=p;             p=p->next;         }         else         {s=q;             q=q->next;         }         rear->next=s;         rear=rear->next;     }     if(p)         rear->next=p;     else         rear->next=q;  }  void visit_link(linklist phead) {     linklist p = phead->next;      while (p) {         printf("%d ", p->data);         p = p->next;     }     putchar(10); }  /*void traverse(linklist Lc)   {   linklist p;   printf("合并后的链表为:");   for(p=Lc->next;p;p=p->next)   printf("%d",p->data);   printf("\n");   }*/  int main() {     linklist La,Lb,Lc;     create_sortlist(La);     visit_link(La);     create_sortlist(Lb);     visit_link(Lb);     mergeincrease(La,Lb,Lc);     linklist p;     printf("合并后的链表为:");     visit_link(Lc);     /*     for(p=Lc->next;p;p=p->next)         printf("%d",p->data);         */  } 供参考～ 抱歉，发错位置了。  &a[i]等价p+i；也等价a+i。[/quote]谢谢

引用 8 楼 棉猴 的回复：请参考《C++中对数组名的运算》 和《C++中指针的数组和数组的指针》 希望能够帮到你！谢谢


Question: 大佬可以帮忙看一下这个C语言程序哪里写错了吗？

引用 3 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h>  typedef int elemtype;  typedef struct lnode{     elemtype data;     struct lnode *next; }lnode,*linklist;  void insert_sortlist(linklist &L,elemtype e) {     linklist p,s;     s=(linklist)malloc(sizeof(lnode));     if (!s)         exit(0);     s->data=e;     p = L;     while(p->next&&p->next->data <= e)         p = p->next;     s->next = p->next;     //s->next = s;     p->next = s; }  void create_sortlist(linklist &L) {     elemtype e;     L=(linklist)malloc(sizeof(lnode));     L->next=NULL;     printf("建立一个有序链表，输入整形数据以0结束\n");     scanf("%d",&e);     while(e)     {         insert_sortlist(L,e);         scanf("%d", &e);     } }  void mergeincrease(linklist &La,linklist &Lb,linklist &Lc) {     linklist p,q,s,rear;     p=La->next;     q=Lb->next;     Lc=rear=La;     free(Lb);     while(p&&q)     {         if(p->data<q->data)         {s=p;             p=p->next;         }         else         {s=q;             q=q->next;         }         rear->next=s;         rear=rear->next;     }     if(p)         rear->next=p;     else         rear->next=q;  }  void visit_link(linklist phead) {     linklist p = phead->next;      while (p) {         printf("%d ", p->data);         p = p->next;     }     putchar(10); }  /*void traverse(linklist Lc)   {   linklist p;   printf("合并后的链表为:");   for(p=Lc->next;p;p=p->next)   printf("%d",p->data);   printf("\n");   }*/  int main() {     linklist La,Lb,Lc;     create_sortlist(La);     visit_link(La);     create_sortlist(Lb);     visit_link(Lb);     mergeincrease(La,Lb,Lc);     linklist p;     printf("合并后的链表为:");     visit_link(Lc);     /*     for(p=Lc->next;p;p=p->next)         printf("%d",p->data);         */  } 供参考～ 非常感谢╰(*´︶`*)╯！

引用 2 楼 coo135的回复:在insert_sortlist中，s->next=s; 手误了吧，改成p->next=s; 是的，谢谢！

知道为什么零回复吗。。。逻辑太复杂。。。


Question: 为什么用fputs（）写入不到txt中呢？

读取这个文件里面的特定数据，但写入的文件里什么也没有。

引用 2 楼 自信男孩的回复:代码这么写有问题，注意逗号是英文的，不是中文的。： //if (ch == '，')                                 if (ch == ',') 中文逗号不是占一个字符 太感谢您了


Question: 求大佬解答下*p和**p的赋值问题

int *p; 表示p是指向整型的指针。 int **p; 表示p是指向整型指针的指针。

第三个写错了  x函数里面应该是m=&i； 是不是说第三个里面p与m等价   m=&i；是不是就等于m中存放的内容不是p了，内容成了x函数中i的地址了 而第二个里面*m=3；是不是就等价于*p等于3，m中还是存放的p的内容？

首先第一个，i是局部变量，当函数x调用完之后，*m或者p指向i的位置就没有意义了。 第二个，传的实参是p，即i的地址，m变量里存的是i的地址，在x函数里*m = 3；等价于i = 3;（此i是main函数里的i）； 第三个，形参是一重指针，由于m是局部变量，并且*m = &i;;但是这样，由于i是局部变量，并且m是和p是等价的。所以，第一和第三基本上是一样的。

为什么第二个的输出是3？


Question: C的exe文件可否脱壳为C源码

好的 大概知道了，谢谢各位大佬！最近在看论文提供的代码 其中一个exe程序的源代码没法看到挺难受的，毕竟算法类太难了

加壳是对exe文件进行处理，压缩、加密，脱壳则相反。 编译对应的反编译，实际上反编译是不能获得C源程序的，只有某些非真正编译的语言才能获得源程序，比如C#

自然不行，  只能看反汇编代码。

那不叫封装，叫编译，不可逆的过程，IDA之类可以反编译为C代码，但是和原来一样是不可能的，只能做为参考。 壳是在编译之后加的一层指令加密操作，在运行时还原指令，两回事


Question: 关于C语言万能头的问题

引用 1 楼 user-1的回复:别用 是不是C语言不能用啊

别用


Question: 为什么c会输出11啊

没毛病  区分 b--跟--b的用法 就行！

注意b--和--b的用法区别。b--是先参与计算，然后b-1; --b是先-1再计算

b-- 是后减减，先是a-b然后再b-1。

b初始值是 1 b-- 计算结果就是 1


Question: 小白求教，有一个c语言的问题困扰我很多天了，求大神帮帮忙

score[][]是一个二维数组  里边的里边的第一个元素的值（60）可以用**score 表示。最后一个是*(*(score+2)+3). *(score+1)是数组score[1][0]的地址 ,其后地址为score[1][0]  score[1][1] score[1][2] score[1][3]；后边还有 score[2][0]  score[2][1]等等   题目中p是一个地址  *（score+n-1）也是一个地址    我感觉你主要还是没有搞懂二维数组的指针表示。反正你知道二维数组中一个 * 是地址 两个* 是数值就好了

二维数组前面加一个星号就代表列了，p=*（score+n-1）代表p指向a[n-1][0]的地址， *(score+1)+2就代表a[1][2]

嗯？二维数组？ 认识这个吗？对没错，这就是传说中的套娃， 不过，用这个来比喻本例中的二重指针**不是很恰当，需要稍微改装一下， 大声唱：大套娃装小套娃，一个小套娃呀，两个小套娃，三个小套娃呀四个小娃，             小套娃里装豆豆，套娃是指针啊，豆豆是数据 嗯嗯，唱完你就会了 假设这套娃只有3层，大套娃（最外层指针）里面并排装了4个小套娃（里层指针）， 至于这4个小套娃，里面装多少粒豆子（数据 int，注意这里用豆子，而不是套娃了，再套下去套路就太深了），你随意，在本例中是3，（3行4列） 这就是参数 （float score[][4]）,表达的意思； score就是那个外层大套娃  指针操作这东西，*，每用一次*，你就可以理解为打开一层套娃， 而目前所学的，指针跟数组的关系，就是那么一条 int arr[4]; int *p = arr; *p；    //也就是 *(p+0)， p[0] *(p+1）；    //p[1] *(p+2)；    //p[2] *(p+3）；    //p[3]; 好了， 来看代码float *search(float score[][4],int n){     float *p;     p=*(score+n-1);     /*     *(score + 0);    score 是什么？大套娃，*呢？ 打开它（一次）； 打开一次之后你看到豆子了吗？--没有，你看到了4个小套娃 *(score+0)呢，4个中的第一个“套娃” *(score+1)呢？   第二个“套娃” ........ *(score+3)呢， 第四个“套娃” 好了，p是什么？豆豆？ 不是的，不是豆豆，是套娃，回想前面的歌谣，，套娃是什么，套娃是指针 从函数返回，丢个小套娃出去，想访问数据（豆豆）， 再开一次套娃，怎么开 用*， *(p+0) *(p+1)....... */      return p;  }   最后，正经点的，来折磨你一下，其实编译器是怎么翻译这个函数的呢  //先来个简单的,热身一下 float *search(float score[4], int n); //实际上转为====> float *search(float *score, int n);  //然后这个呢 float *search(float score[][4],int n) //实际上在编译器里，他是这样的东西==》 float *search(float (*score)[4], int n);   你看懂了吗？如果不懂，，还是想想套娃吧。

#include<stdio.h> float *search(float * score, int n); int main() { 	float score[][4] = { { 60,70,80,90 },{ 56,89,67,88 },{ 34,78,90,66 } }; 	printf("Please input you need to score of student's number:\n"); 	int n; 	float *p; 	scanf("%d", &n); 	p = search((float*)score, n); 	printf("You need to number of %d student 's score:\n", n); 	int i; 	for (i = 0; i<4; i++) { 		printf("%.2f\t", *(p + i)); 		//p++; 	} 	return 0; } float *search(float * score, int n) { 	float *p; 	p = (score + (n - 1)*sizeof(float)); 	return p; } 这样可能更容易理解一下指针，原来的关键在于编译器如何解释这个二唯数组


Question: 创建一个控制台应用程序，在其中定义两个4行3列的矩阵 求帮助

供参考  #include <stdio.h>  void arr_input(int p[4][3]); void arr_print(int p[4][3]);  int main() { 	int a[4][3], b[4][3], c[4][3]; 	printf("输入第一个矩阵的元素：\n"); 	arr_input(a); 	printf("输入第二个矩阵的元素：\n"); 	arr_input(b); 	int i, j;	 	for (i=0; i<4; i++) 	{ 		for (j=0; j<3; j++) 		{ 			c[i][j] = a[i][j] - b[i][j];			 		}		 	} 	printf("新矩阵是：\n"); 	arr_print(c); 	 	getchar(); 	return 0; }  void arr_input(int p[4][3]) {     int i, j;	 	for (i=0; i<4; i++) 	{ 		for (j=0; j<3; j++) 		{ 			scanf("%d", &p[i][j]); 		} 	} 	 }  void arr_print(int p[4][3]) { 	int i, j;	 	for (i=0; i<4; i++) 	{ 		for (j=0; j<3; j++) 		{ 			printf("%5d", p[i][j]); 		} 		printf("\n"); 	} }


Question: 麻烦大神们帮帮

没做太多的字符串的合法性判断。假定输入的字符串是正确按要求输入的。

为啥不自己先写写呢？不是很难的问题～


Question: 求大佬告知我这段代码末尾为什么会重复打印最后一行，请解释地详细点

#include <stdio.h> #include <stdlib.h>  #define MAX 1024  int main(void) {     FILE *fp;     char buffer[MAX];      if ((fp = fopen("lines.txt", "w")) == NULL)     {         printf("打开文件失败！\n");         exit(EXIT_FAILURE);     }     fputs("Line one: Hello World!\n", fp);     fputs("Line two: Hello Fishc!\n", fp);     fputs("Line three: I love Fishc.com!\n", fp);      fclose(fp);      if ((fp = fopen("lines.txt", "r")) == NULL) {         printf("打开文件失败！\n");         exit(EXIT_FAILURE);     }      while (!feof(fp))     {         if (fgets(buffer, MAX, fp)== NULL)             break;         printf("%s", buffer);     }     fclose(fp);      return 0; } 供参考～

int ch;         while (!feof(fp))         {             fgets(buffer, MAX, fp);             printf("%s", buffer);             ch = fgetc(fp);             if (ch == -1)                break;         }  “C”语言的“feof()”函数返回的是最后一次“读操作的内容”。多年来把“位置和内容”相混，从而造成了对这一概念的似是而非。 那么，位置和内容到底有何不同呢？举个简单的例子，比如有人说“你走到火车的最后一节车箱”这就是位置。而如果说“请你一直向后走，摸到铁轨结束”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP)){...}”进行文件复制时，目标文档总会比源文档“多出一些”的原因。 在“C”文件读取操作时不能完全依赖于“while(!feof(FP)){...}”的判断。 更多细节，可以查询百度百科 feof 函数


Question: c语言如何处理不知道行数的字符串输入？

输出： 如果屏蔽词库如下： is good are the ha ha some get has more bad 则输出：  The night falls gently. And you !@#$%^&* not here. I m!@#$%^&*sing you !@#$%^&* and !@#$%^&* and I start !@#$%^&*ting worried as I st!@#$%^&* at !@#$%^&* door just waiting for you to surpr!@#$%^&*e me with your arrival at any moment. Sweet delusion... you !@#$%^&* so far away right now that all I can ask for !@#$%^&* that time moves faster...

The night falls gently. And you are not here. I missing you more and more and I start getting worried as I stare at the door just waiting for you to surprise me with your arrival at any moment. Sweet delusion... you are so far away right now that all I can ask for is that time moves faster...

题目描述： 互联网中存在许多的不和谐词汇，在我们浏览互联网的时候，搜索引擎经常会出现提示信息“根据相关法律法规和政策，部分搜索结果未予显示”。小王同学也想制作一个自己的屏蔽词库，这样他就可以将自己不喜欢的词汇从文件中换成别的字符了。屏蔽词库是一个ASCII码文件，这个文件中只含有单词，每个单词占一行，每个单词中只可能有大小写字母与空格。题目中和谐词库的文件名为dict.dic。（屏蔽词库中每个词汇长度小于10，屏蔽词汇个数不超过10.） 你的任务是将输入中的所有和谐词库中的词语全部替换成“!@#$%^&*”（按住键盘shift和数字1至8），然后输出。这里要注意，如果一个词语中包含屏蔽词汇，那么只将屏蔽词汇替换，例如“hehasAAA”被处理后将得到“he!@#$%^&*AAA”，注意屏蔽词汇区分大小写，即aaa与AAA是两个不同的单词，为了使问题简化，屏蔽词汇中不会出现互相包含的情况，如“xabcx”与“abc”不会同时出现在同一个屏蔽词库中。由于小王同学很不擅长文件操作，所以他希望你能帮他制作这个屏蔽词汇程序。


Question: C语言如何生成n个随机数使得他们合为1

while(1) {         t = rand()%(2*s+1) - s;//生成[-s,s]随机数         if(s-t<=100) break;     } 要保证s-t 结果小于等于100 从前面的 随机数范围都手脚比较方便 还能把循环去掉

for example  先以总和为基数取随机数，每生成一个随机数，再以总和减去该随机数为基数生成下一个随机数，一直取满n-1个，最后一个用剩余的总和即可。 for example int n; scanf(“%d”, &n); double *d = (double*)malloc(sizeof(double)*n); srand(time(NULL)); int s = 100, t=0;  for (int i=0; i<n-1; i++) {     while(1) {         t = rand()%(2*s+1) - s;//生成[-s,s]随机数         if(s-t<=100) break;     }     d[i] = t/100.0; //生成[-1,1]随机数     s -= t; //每次生成随机数后修改总和 } double[n-1]=s/100.0; //最后一个

直接生成不太好弄，可以先生成n-1个相加为0的随机数，然后最后一个数固定为1。

随机数保留2位小数


Question: c语言初学者有哪些练手项目？

很多啊，类似的图书馆管理系统，ftp文件传输系统，五子棋，推箱子

网络编程，数据通信；数据库访问等等都可以试着写写。宾馆管理系统其实都可以包括前面的内容，就看你想写功能强大的还是写功能简单的管理系统

贪吃蛇、俄罗斯方块这些的


Question: 带头节点的单链表的一个问题

创建链表la，然后申请一个Lb链表头，让链表Lb也指向la->next;这样lb也可以访问链表a中的数据了。

enn……题目中“不要访问链表的任何细节”与“顺序读取la”好像矛盾吧

引用 3 楼 gets_s 的回复：#include<iostream> using namespace std; #define N 5 typedef struct Lnode { 	int data; 	struct Lnode *next; }Lnode,*Linklist; //构造单链表La Linklist Createndlist1(int a[N]) { 	Linklist L; 	L = (Lnode*)malloc(sizeof(Lnode)); 	if (L == NULL) 	{ 		cout << "error"; 		exit(0); 	} 	else L->next = NULL; 	Linklist tail, p; 	tail = L; 	int j; 	for (j = 0; j < N; j++) 	{ 		p = (Lnode*)malloc(sizeof(Lnode)); 		if (p == NULL) 		{ 			cout << "error"; 			exit(0); 		} 		else p->next = NULL; 		p->data = a[j]; 		tail->next = p; 		tail = p; 	} 	tail->next = NULL; 	return L; } //构造单链表Lb Linklist CreatLinklist2(Linklist La) { 	Linklist Lb; 	Lb = (Lnode*)malloc(sizeof(Lnode)); 	if (Lb == NULL) 	{ 		cout << "error"; 		exit(0); 	} 	else Lb->next = NULL; 	Linklist p, q, t; 	p = La; 	q = p->next; 	t = Lb; 	while (q) 	{ 		p->next = q->next; 		q->next = NULL; 		t->next = q; 		t = q; 		q = p->next; 	} 	return Lb; } //输出链表 void putlist(Linklist L) { 	int i; 	Linklist p; 	p = L->next; 	while (p != NULL) 	{ 		cout << p->data << " "; 		p = p->next; 	} 	cout << endl; } int main() { 	int i ,a[N]; 	printf("请输入%d个链表元素的值:", N); 	for (i = 0; i < N; i++) 	{ 		cin >> a[i]; 	} 	Linklist La,Lb; 	La = Createndlist1(a); 	cout << "链表La为："; 	putlist(La); 	Lb = CreatLinklist2(La); 	cout << "链表Lb为："; 	putlist(Lb); 	return 0; }匆忙写出的代码，可能有bug😅😅

引用 1 楼 gets_s 的回复：为La申请工作指针p、q，为Lb申请工作指针t，用p、q遍历La时链到Lb上求大佬写一下下代码

为La申请工作指针p、q，为Lb申请工作指针t，用p、q遍历La时链到Lb上


Question: arr只给了p三个整数，为啥能输出全部

强制转换没问题，老式的编译器不会报错。

p = arr;类型不匹配。p指向的是列数3的二维数组。而arr是一维数组。

int *p[3]意思是三个整型的指针变量，而int (*p) [3] 相当于一个二维数组，下面那个输出是二维数组的输出方法。

我说的有点儿问题，应该是每次输出3个，两次就够了

2乘3得6啊 也就是说按一次输出两个，3次不就够了?


Question: 求大佬帮我解释这个C Primer Plus里的例子

在命令行启动程序，如dir /p，这个/p就是命令行参数。 argc,argv是处理“命令行参数”的机制。

你多用用控制台，就能明白命令行参数是什么了。 例如编译一个源文件，实际上要带很多命令行参数的

如果你要问，命令行参数有什么意义。 你可以去搜索一下： ie命令行 参数启动 这些的话百度都能搜索到的。 你了解了这个ie命令行启动的例子后，就知道是什么用了

你的代码是不是一个程序，一个过程（比较复杂的执行过程）。 一个过程是不是应当有输入和输出（输入（一种）状态执行后变为（另一种）输出状态）。  所以程序这个过程、这个广义的函数、方法。也可以给他提供一些输入参数的。  那么普通函数哪里来的参数呢？调用者给的参数。  那么程序哪里来的参数呢？操作系统给的参数。  最直观的是，通过命令行启动某个程序 即可给其main函数传递参数。


Question: c语言二维数组输入后输出为什么数值变了，输出地址是相同的地址，有大神看一下吗?

我竟然没有看出地址相同的，所以我了解下二维数组内存占用就好了，谢谢

二维数组本质是一段连续空间，未初始化尺寸的数组或者越界访问数组方式都是危险行为

q[0][1]和q[1][0]地址相同，对q[1][0]再次赋值就已经更改了q[0][1]空间的数值了

引用 1 楼 user-1 的回复:数组大小要给确定值   除开数组没有定义的条件下 为什么计算机相同地址有数值后，没有其他操作的情况下数值会变化呢？

数组大小要给确定值


Question: 大一初学C语言，有道关于fabs的题想不明白

引用 9 楼 m0_44977681的回复:直接在while里把i改为i－1也不严谨，因为i初始值为1，i－1做分母不严谨，所以要么第一步那个操作自己先做了，要么就考虑用答案那种方法  	double sum = 1, i = 2, sign = -1;	   	while (1 / (i - 1) >= 1e-4)   	{   		sum = sum + sign / i;   		i++; 	  	sign = -sign;   	}

引用 2 楼 ?AraVio的回复:[quote=引用 1 楼 m0_44977681的回复:]题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，不考虑i的初始值为1，i＋＋，i始终为正数[/quote] i分之一是最后一项的绝对值  但是原题意思是最后一项的绝对值小于1e－4 你的里面每一项的绝对值都是大于1e－4的，没有把最后一个绝对值小于1e－4这一项加进去 仔细看题”直到最后一项的绝对值小于1e－4（为止）”，明白不 你把你的while里面的i改为i－1就行  答案是创建了一个tn在i＋＋之前赋值，也就是说这个循环结束之后再去判断的时候都tn是本次循环使用的项的绝对值，如果本次使用的项满足条件，则再做一次循环，相对于你的多运行了一次（即当项的绝对值小于1e－4的这次运算），你传入的是i＋＋之后的1/i也就是下次循环将要使用的项的绝对值，少加了一次  就是你少加了一项，就是绝对值小于1e－4的那一项 ，你的项都是绝对值大于1e－4的，明白了吧

引用 8 楼 m0_44977681的回复:[quote=引用 2 楼 ?AraVio的回复:][quote=引用 1 楼 m0_44977681的回复:]题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，不考虑i的初始值为1，i＋＋，i始终为正数[/quote] i分之一是最后一项的绝对值  但是原题意思是最后一项的绝对值小于1e－4 你的里面每一项的绝对值都是大于1e－4的，没有把最后一个绝对值小于1e－4这一项加进去 仔细看题”直到最后一项的绝对值小于1e－4（为止）”，明白不 你把你的while里面的i改为i－1就行  答案是创建了一个tn在i＋＋之前赋值，也就是说这个循环结束之后再去判断的时候都tn是本次循环使用的项的绝对值，如果本次使用的项满足条件，则再做一次循环，相对于你的多运行了一次（即当项的绝对值小于1e－4的这次运算），你传入的是i＋＋之后的1/i也就是下次循环将要使用的项的绝对值，少加了一次  就是你少加了一项，就是绝对值小于1e－4的那一项 ，你的项都是绝对值大于1e－4的，明白了吧[/quote] 意思和7楼说的有些像，但是是正确答案多加了一项

引用 8 楼 m0_44977681的回复:[quote=引用 2 楼 ?AraVio的回复:][quote=引用 1 楼 m0_44977681的回复:]题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，不考虑i的初始值为1，i＋＋，i始终为正数[/quote] i分之一是最后一项的绝对值  但是原题意思是最后一项的绝对值小于1e－4 你的里面每一项的绝对值都是大于1e－4的，没有把最后一个绝对值小于1e－4这一项加进去 仔细看题”直到最后一项的绝对值小于1e－4（为止）”，明白不 你把你的while里面的i改为i－1就行  答案是创建了一个tn在i＋＋之前赋值，也就是说这个循环结束之后再去判断的时候都tn是本次循环使用的项的绝对值，如果本次使用的项满足条件，则再做一次循环，相对于你的多运行了一次（即当项的绝对值小于1e－4的这次运算），你传入的是i＋＋之后的1/i也就是下次循环将要使用的项的绝对值，少加了一次  就是你少加了一项，就是绝对值小于1e－4的那一项 ，你的项都是绝对值大于1e－4的，明白了吧[/quote] 我感觉7楼说的是对的

你对，答案错  分析如下#include "math.h" void main() { 	double s=0,tn=1,i=1; 	double sign=1;  	while (fabs(tn)>=1e-4)//步骤4  此时tn 还没更新，还是0.0001 	{ 		tn=sign/i; /*步骤5 这时候i等于10001, 终于tn过界限，但是流程还是继续，于是多加了一个1.0/10001*/	 		/*步骤1.假设i已经等于10000， 这时候是分界点了 		此时tn刚好等于1e-4(0.0001), 往下走*/	 		s=s+tn;	/*步骤2： 0.0001已经加过，照说不能再进入循环了，可是。。。。*/  		i++;	/*步骤3：i已经等于10001.0*/ 		sign=-sign; 	}  	printf("s=%f\n",s);  } /* 虽然问题我们已经分析清楚，但是你初一看，这个循环是没毛病啊  其实是有问题的，问题在于循环控制条件tn tn在循环体中的值，已经与while(tn??)循环控制里时的值不一致了：通过(tn = sign/i)变更的 但是他还在继续参与运算，并改变其他变量的值，巴拉巴拉~~~~~~此处略去500字，因此违反了设计初衷  再谈浮点数的精度 你把答案的打印函数，和你自己的打印函数改一下 改成printf("s=%.20f\n", s);， 你会发现什么？两者的值不是差那个0.0001 而是差1.0/10001  再留个问题给你思考看 double f1 = 0.1 float f2 = 0.1 if(f1 == f2)????  */

引用 5 楼 focuslight的回复:要不你把int改为double再试试 还是0.693097

要不你把int改为double再试试

最后一项是符号项乘i分之一，i的初始值为1，i＋＋，i始终为正数，最后一项的绝对值不就是i分之一吗

引用 1 楼 m0_44977681的回复:题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，i的初始值为1，i＋＋，i始终为正数，最后一项的绝对值不就是i分之一吗

引用 1 楼 m0_44977681的回复:题意理解有问题 题目意思是最后一项的绝对值小于1e-4（参与运算，是最后一项） 你没有把最后的这项加上 i分之一就是最后一项，不考虑i的初始值为1，i＋＋，i始终为正数


Question: 单链表的建立与合并A与B链表，求大神找出问题所在

//这是我写的不过只能实现递增的合并 #include <stdio.h> #include <stdlib.h> typedef int ElemType; typedef struct Lnode{ 	ElemType data; 	struct Lnode *next; }Lnode; typedef Lnode *LinkList; //初始化 int InisList(LinkList &L) { 	L = (LinkList)malloc(sizeof(Lnode)); 	if(!L) 	{ 		printf("初始化失败\n"); 		return 0; 	} 	L -> next = NULL; 	return 1; } //插入 int InsertList(LinkList &L,int i,ElemType e) { 	LinkList s,p; 	int j = 0; 	p = L; 	if(i < 1) 	{ 		printf("范围不合法\n"); 		return 0; 	} 	while(p && j < i - 1) 	{ 		p = p -> next; 		j ++; 	} 	if(!p) 	{ 		printf("插入失败\n"); 		return 0; 	} 	s = (LinkList)malloc(sizeof(Lnode)); 	if(!s) 	{ 		printf("插入失败\n"); 		return 0; 	} 	s -> data = e; 	s -> next = p -> next; 	p -> next = s; 	return 1;  }   //删除  int DeleteList(LinkList &L,int i,ElemType e)  {  	LinkList q,p;  	int j = 0;  	p = L;  	if(i < 1)  	{  		printf("系统查无成绩\n");  		return 0; 	} 	while(p && j < i - 1) 	{ 		p = p -> next; 		j ++; 	} 	if(!p || !(p -> next)) 	{ 		return 0; 	} 	q = p -> next; 	p -> next = q -> next; 	e = q -> data; 	free(q); 	return 1;    }    //查询   int GetElem(LinkList L,int i,ElemType &e)   {   	LinkList p;   	int j = 0;   	p = L;   	if(i < 1)   	{   		printf("查询失败，系统无资料\n");   		return 0;     }     while(p && j < i)     {     	p = p -> next;     	j ++; 	} 	if(!p) 	{ 		printf("查询失败，系统无资料\n");   		return 0; 	} 	e = p -> data; 	return 1;    }    //求链表的长度    int ListLength(LinkList L)    {    	int i = 0;    	LinkList p;    	p = L -> next;    	while(p)    	{    		i ++;    		p = p -> next;     }     return i; 	} 	//链表的合并  int MergeList(LinkList &L1,LinkList &L2,LinkList &L3)  {  	LinkList p1,p2,p3;  	p1 = L1 -> next;  	p2 = L2 -> next;  	p3 = L3 = L1;  	while(p1 && p2)  	{  		if(p1 -> data <= p2 -> data)  		{  			p3 -> next = p1;  			p3 = p1;  			p1 = p1 -> next; 		 } 		 else 		 { 		 	p3 -> next = p2; 		 	p3 = p2; 		 	p2 = p2 -> next; 		 } 	 } 	 p3 -> next = p1 ? p1 : p2; 	 free(L2); 	 return 1;  } int main() { 	LinkList L1,L2,L3; 	int num; 	int i; 	int temp; 	ElemType e; 	if(InisList(L1) && InisList(L2) && InisList(L3)) 	{ 		printf("初始化成功\n"); 		printf("请输入要为L1录入学生的人数:"); 		scanf("%d",&num); 		printf("请输入学生成绩(增序)\n"); 		for(i = 1;i <= num;i ++) 		{ 			scanf("%d",&e); 			if(InsertList(L1,i,e)) 			{ 				printf("插入成功\n"); 			} 		} 		printf("当前表长:%d\n",ListLength(L1)); 		printf("请输入要为L2录入学生的人数:"); 		scanf("%d",&num); 		printf("请输入学生成绩(增序)\n"); 		for(i = 1;i <= num;i ++) 		{ 			scanf("%d",&e); 			if(InsertList(L2,i,e)) 			{ 				printf("插入成功\n"); 			} 		} 		printf("当前表长:%d\n",ListLength(L2)); 		printf("两个增序链表合并\n"); 		if(MergeList(L1,L2,L3)) 		{ 			printf("合并成功\n"); 			for(i = 1;i <= ListLength(L3);i ++) 			{ 				if(GetElem(L3,i,e)) 		        { 			     printf("查询成功\n"); 			     printf("结果:"); 			     printf("%d\n",e); 		        }  			} 		} 		/*printf("请输要查询的位置:"); 		scanf("%d",&temp); 		if(GetElem(L,temp,e)) 		{ 			printf("查询成功\n"); 			printf("结果:"); 			printf("%d\n",e); 		 } */ 	 		 	} 	 }

你好像没有初始化这个链表吧，链表没有空间，咋来放数据域和指针域