Question: 代码优化

要那样输出的话可以参考这个：  #include <stdio.h> #include <math.h> int factorsum(int n, int* fac)  //除了计算因子和，还在数组fac里给出因子列表，以-1表示结束 { 	int i, sum = 1, k, *p = fac + 1, half[40], j = 0; 	if (n == 1)return 0; 	for (i = 2; i <= (int)(sqrt(n) + 0.001); i++)  //从2到根号n测试 	{ 		if (n%i == 0)  //每次整除产生两个因子 		{ 			sum += (*p++ = i); //小的那个直接升序记入数组 			if (i < (k=n/i))  //除非 i==k 这次只产生1个因子 				sum += (half[j++] = k);  //大的那个降序另存 		} 	} 	while (--j >= 0) //把较大的一半因子逆序抄过去 	{ 		*p++ = half[j]; 	} 	*p = -1;  //表示结束 	return sum; } void PrintPN(int m, int n) { 	int i, fac[70] = { 1 }; 	for (i = m; i <= n; i++) 	{ 		if (i == factorsum(i, fac)) 		{ 			int *p = fac + 1; 			printf("%d=1", i); 			while (*p > 0) 			{ 				printf("+%d", *p++); 			} 			printf("\n"); 		} 	} } int main() { 	int m, n; 	scanf("%d%d", &m, &n); 	PrintPN(m, n); 	return 0; }

判断是否为完数的函数再优化一点点：int factorsum( int n)//判断是否为完数 {     int k=2,s=1;     while(k <= n/2){          if(n%k==0)s+=k;          k++;     }     if(s==n && n!=1) return 1;     return 0; }

#include <stdio.h>  int factorsum( int number ); void PrintPN( int m, int n );  static void swap(int *a, int *b); static void print_perfect(int m, int n);  int main() {     int m, n;      scanf("%d %d", &m, &n);      if (m > n) {         swap(&m, &n);     }      print_perfect(m, n);     /*     if ( factorsum(m) == m ) printf("%d is a perfect number\n", m);     if ( factorsum(n) == n ) printf("%d is a perfect number\n", n);     PrintPN(m, n);     */     return 0; }  static void swap(int *a, int *b) {     int tmp;      tmp = *a;     *a = *b;     *b = tmp; }  static void print_perfect(int m, int n) {     int i;      for (i = m; i < n; i++) {         if (i == 1)             continue;         if (factorsum(i)) {             printf("%d is a perfect number!\n", i);         }     } }   int factorsum( int number )  //判断是否为完数 {     int i;     int sum = 1;       for (i = 2; i < number / 2 + 1; i++) {         if (number % i == 0)             sum += i;     }     if (sum == number)         return 1;      return 0;     /*     int i,j;     int m = 1;     int n,num = 0;     int a[100] = {0};     a[0] = 1;     if(number == 0)         return -1;     if(number == 1)         return 1;     for(i = 2; i < number; i ++ )     {         for(j = i + 1; j < number; j ++)         {             if(i * j == number)             {                 a[m] = i;                 m ++;                 a[m] = j;                 m ++;             }          }     }     for(n = 0; n < 100; n ++)     {         if(a[n] == 0)             break;         num = num + a[n];     }     if(num == number)         return num;     else         return 0;     */ }  void PrintPN( int m, int n )   //找出m到n之间的完数 {     int q;     int i,j;     int num = 0;      for(int k = m; k <= n; k++)     {         if(factorsum(k) == k)         {             num = 1;             int p = 1;             int a[100] = {0};             a[0] = 1;             for(i = 2; i < k; i ++ )             {                 for(j = i + 1; j < k; j ++)                 {                     if(i * j == k)                     {                         a[p] = i;                         p ++;                         a[p] = j;                         p ++;                      }                 }             }             //排序             int b;             for(b = 0; a[b] != 0; b++)             {                 for(int c = b + 1; a[c] != 0; c ++)                 {                     if(a[b] > a[c])                     {                         int key;                         key = a[b];                         a[b] = a[c];                         a[c] = key;                     }                  }              }             printf("%d = ",k);             for( q = 0; q < 100; q ++)             {                 if(a[q] == 0)                 {                     printf("\n");                     break;                 }                 if(q == 0)                     printf("%d",a[q]);                 else                     printf(" + %d",a[q]);              }         }     }     if(num == 0)         printf("No perfect number\n");  } 供参考～

修正楼上第10行：for(int i=m;i<=n;i++){

楼主考虑的太复杂了，供参考：#include <stdio.h> int factorsum( int n );//判断是否为完数  int main() {     int m, n;     scanf("%d %d", &m, &n);     if(m<=0 || n>10000) return -1;      for(int i=m;i<n;i++){        if(factorsum(i))printf("%d is a perfect number\n", i);     }          return 0; }   int factorsum( int n) {     int k=1,s=0;     while(k <= n/2){          if(n%k==0) s+=k;          k++;     }     if(s==n) return 1;     return 0; }

随便搜个对正整数分解因数的代码


Question: 同样一份.c文件，我在Linux上编译成.a文件执行正常，在windows编译成.exe文件，执行前面正常，后面无结果输出

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

是不是程序处理的数据文件有格式上的问题？明显左侧的Windows端有个 WARNING ： END OF DATA IN FILE。

调试，看看到具体哪一部，结果不一致。

嗯，收到，确实挺奇怪。

左侧为windows端，后面的文件无数据写入，右侧为ubuntu，程序执行正常

windows打开文件默认文本模式，linux打开文件默认二进制模式。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fputc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fscanf,fprintf,fgets,fgetc,fputc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了


Question: 求大佬帮忙看一下错在哪里了

心急吃不了热豆腐，写代码，你得一步一步来，先实现主要的功能并验证，然后再加入进一步的功能，调试也是一样的。你把提供的代码编译运行下，看看能不能实现把文件中的内容搬到结构体数组中，如果能再往里加你想要的功能，如不能你得找出错误并修正它直到让它听你的：#include<stdio.h> #include<string.h>  struct record       //结构体 {     char method[255];     char ip[255];     char protocol[255];     char time[255];     char add[255];     char port[255];     char page[255];     char status[255];     char exploer_info[255]; };  int main(void) {     FILE *fp;     fp=fopen("access.log","r+");//打开文件     if(!fp)       {         printf("false\n");         return -1;//直接返回       }     else{         printf("true\n");     }//判断文件是否成功打开      char line[2048];     int  i=0,x,j,j_pos,j_pos1;//int  lines=0; //这个变量没用到     int  pos[9],pos1[9];     char s='[', s1=']';      struct record rec[4096];//预设文件有4096行      while((fgets(line,2048,fp))!=NULL)       {          x=strlen(line);          j_pos=0,j_pos1=0;          for(j=0;j<x;j++)           {             if(line[j]==s)//'['  开始位置               {                 pos[j_pos]=j;                 j_pos++;               }             if(line[j]==s1)//']' 结束位置               {                 pos1[j_pos1]=j;                 j_pos1++;               }           }          //strncpy_s(char * str2, int size2, char * str1, int size1);//这里char * str1, int size1 两个值楼主自己调试          strncpy_s(rec[i].method,      sizeof(rec[i].method),      line+pos[0]+1,pos1[0]-pos[0]-1);          strncpy_s(rec[i].ip,          sizeof(rec[i].ip),          line+pos[1]+1,pos1[1]-pos[1]-1);          strncpy_s(rec[i].protocol,    sizeof(rec[i].protocol),    line+pos[2]+1,pos1[2]-pos[2]-1);          strncpy_s(rec[i].time,        sizeof(rec[i].time),        line+pos[3]+1,pos1[3]-pos[3]-1);          strncpy_s(rec[i].add,         sizeof(rec[i].add),         line+pos[4]+1,pos1[4]-pos[4]-1);          strncpy_s(rec[i].page,        sizeof(rec[i].page),        line+pos[5]+1,pos1[5]-pos[5]-1);          strncpy_s(rec[i].port,        sizeof(rec[i].port),        line+pos[6]+1,pos1[6]-pos[6]-1);          strncpy_s(rec[i].status,      sizeof(rec[i].status),      line+pos[7]+1,pos1[7]-pos[7]-1);          strncpy_s(rec[i].exploer_info,sizeof(rec[i].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);          i++;       }     fclose(fp);//关闭文件      //全部读入rec[i]数组中，接下去处理的代码加入。     //举个例子：下面这段输出看看读入到rec[i]中的内容：     for(j=0;j<i;j++)      {        printf("%s %s %s %s %s %s %s %s %s\n",        rec[j].method,rec[j].ip,    rec[j].protocol,        rec[j].time,  rec[j].add,   rec[j].page,        rec[j].port,  rec[j].status,rec[j].exploer_info);      }      return 0; }

引用 5 楼 qzjhjxj的回复:引用while(fgets(line,2048,fp)!=NULL)  {   puts(line);   n++;   if(strncmp(line,"[GET]",5)==0)   {    m++;   }//比较两字符串，相等时strncmp函数值返回0,计数   }  while((fgets(line,2048,fp))!=NULL)  {   x=strlen(line); 这里连着两个while{}循环体，第一个while循环结束，文件指针已经指向文件结束了，第二个while不会进入了。 嗷嗷，谢谢谢谢，我知道了

引用int fclose(FILE *fp);//关闭文件 这也不是正确的关闭文件语句。

引用 3 楼 qzjhjxj的回复:因为IDE不支持strncpy_s（）函数，所以我没法看运行结果，文字说明见注释，供参考：#include<stdio.h> #include<string.h>  struct record       //结构体 {     char method[255];     char ip[255];     char protocol[255];     char time[255];     char add[255];     char port[255];     char page[255];     char status[255];     char exploer_info[255]; };  int main(void) {     FILE *fp;     fp=fopen("access.log","r+");//打开文件     if(!fp)       {         printf("false\n");         return -1;//直接返回       }     else{         printf("true\n");     }//判断文件是否成功打开      char line[2048];     int  i=0,x,j,j_pos,j_pos1;//int  lines=0; //这个变量没用到     int  pos[9],pos1[9];     char s='[', s1=']';      struct record rec[4096];//预设文件有4096行      while((fgets(line,2048,fp))!=NULL)       {          x=strlen(line);          j_pos=0,j_pos1=0;          for(j=0;j<x;j++)           {             if(line[j]==s)//'['  开始位置               {                 pos[j_pos]=j;                 j_pos++;               }             if(line[j]==s1)//']' 结束位置               {                 pos1[j_pos1]=j;                 j_pos1++;               }           }          //strncpy_s(char * str2, int size2, char * str1, int size1);//这里char * str1, int size1 两个值楼主自己调试          strncpy_s(rec[i].method,sizeof(rec[i].method),line+pos[0]+1,pos1[0]-pos[0]-1);          strncpy_s(rec[i].ip,sizeof(rec[i].ip),line+pos[1]+1,pos1[1]-pos[1]-1);          strncpy_s(rec[i].protocol,sizeof(rec[i].protocol),line+pos[2]+1,pos1[2]-pos[2]-1);          strncpy_s(rec[i].time,sizeof(rec[i].time),line+pos[3]+1,pos1[3]-pos[3]-1);          strncpy_s(rec[i].add,sizeof(rec[i].add),line+pos[4]+1,pos1[4]-pos[4]-1);          strncpy_s(rec[i].page,sizeof(rec[i].page),line+pos[5]+1,pos1[5]-pos[5]-1);          strncpy_s(rec[i].port,sizeof(rec[i].port),line+pos[6]+1,pos1[6]-pos[6]-1);          strncpy_s(rec[i].status,sizeof(rec[i].status),line+pos[7]+1,pos1[7]-pos[7]-1);          strncpy_s(rec[i].exploer_info,sizeof(rec[i].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);          i++;          //if(line[strlen(line)-1]=='\n')          //{          //lines++;          //}       }     fclose(fp);//关闭文件      //全部读入rec[i]数组中，接下去处理的代码加入           return 0; } 我改了一下，但是运行结果是空白，而且不允许调试，将struct record rec[4096]一句和strncpy函数注释掉之后能运行，但是这样子是不是结构体就没用上，这是为什么啊？ #include<stdio.h> #include<string.h> struct record//record为结构体名   {   char method[255];   char ip[255];   char protocol[255];   char time[255];   char add[255];   char port[255];   char page[255];   int status;   char exploer_info[255];   struct prams   {    char key[255];    char value[255];   };   int prams_cnt;  };//定义结构体  int main(void) {    //struct record rec;  FILE *fp;  fp=fopen("access.log","r+");//打开文件   if(!fp)  {   printf("false\n");   return -1;//直接返回   }   else{   printf("true\n");  }//判断文件是否成功打开  char line[2048];   int i=0,x,j,j_pos,j_pos1;  int lines=0;  int pos[9],pos1[9];  char s='[';  char s1=']';  struct record rec[4096];//定义结构体变量   printf("日志分析：\n");  int n=0,m=0;  while(fgets(line,2048,fp)!=NULL)  {   puts(line);   n++;   if(strncmp(line,"[GET]",5)==0)   {    m++;   }//比较两字符串，相等时strncmp函数值返回0,计数   }  while((fgets(line,2048,fp))!=NULL)  {   x=strlen(line);   j_pos=0,j_pos1=0;   for(j=0;j<x;j++)   {    if(line[j]==s)//此处为'['开始的位置     {     pos[j_pos]=j;     j_pos++;    }    if(line[j]==s1)//']'结束的位置     {     pos1[j_pos1]=j;     j_pos1++;    }   }  }   //strncpy_s函数的使用strncpy_s(char *str2,int size2,char *str1,int size1);   strncpy_s(rec[i].method,sizeof(rec[i].method),line+pos[0]+1,pos1[0]-pos[0]-1);   strncpy_s(rec[i].ip,sizeof(rec[i].ip),line+pos[1]+1,pos1[1]-pos[1]-1);  strncpy_s(rec[i].protocol,sizeof(rec[i].protocol),line+pos[2]+1,pos1[2]-pos[2]-1);  strncpy_s(rec[i].time,sizeof(rec[i].time),line+pos[3]+1,pos1[3]-pos[3]-1);  strncpy_s(rec[i].add,sizeof(rec[i].add),line+pos[4]+1,pos1[4]-pos[4]-1);  strncpy_s(rec[i].page,sizeof(rec[i].page),line+pos[5]+1,pos1[5]-pos[5]-1);  strncpy_s(rec[i].port,sizeof(rec[i].port),line+pos[6]+1,pos1[6]-pos[6]-1);  strncpy_s(rec[i].status,sizeof(rec[i].status),line+pos[7]+1,pos1[7]-pos[7]-1);  strncpy_s(rec[i].exploer_info,sizeof(rec[i].exploer_info),line+pos[8]+1,pos1[8]-pos[8]-1);  printf("输出GET请求所占比例：%f\n",1.0*m/n); int fclose(FILE *fp);//关闭文件  	return 0; }

引用 1 楼 自信男孩的回复:struct record 这个结构体声明在哪里？没有看到呢。 生命后也是报错，并且会新增错误，原错误还存在

struct record 这个结构体声明在哪里？没有看到呢。


Question: C语言

C语言能自定义变量的地址？

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

把需求再描述清晰一些，更详细一些。

？？？？？ 楼上厉害了，远程遥视？？？？

在书上楷体字那部分。


Question: 一个汉字占2字节，最多65535个，但汉字有9万多了，怎么办？

目前，双字节字符表正在向四字节字符表过渡，这有点像从IPv4到IPv6的过渡。

引用 7 楼 早打大打打核战争的回复:[quote=引用 6 楼 qq_16774199 的回复:][quote=引用 3 楼 早打大打打核战争 的回复:]最新的unicode 13.0已经包括143859个字符，unicode的雄心是囊括人类创造的所有文字和·符号，包括甲骨文、金文、楔形文字、玛雅文字等等，我估计最后连原始人创作的岩画也得搞进去~ 143859个字符也不够啊，简体+繁体就可能已经不够了，其它语言的文字全加上绝对不够用。[/quote]  这只是目前收录的字符数量，编码空间足够用，UTF-16支持一百多万个编码（0~10FFFF），而UCS-4使用31位编码（最高位固定为0），能支持超过21亿个字符，用到人类灭亡也填不满 [/quote] 错，如果允许私人或公司字符，一下就用完了。

引用 楼主 qq_16774199 的回复:最近开始学汇编，知道2个字节可以产生65535种变化，虽然常用汉字几千个，但全部汉字有9万多个。 每个年代的设计都与其现状相适应。 所以咱没道理用20世纪80年代的观念来分析如今的问题。 每个汉字占2字节的观念早就过时了。

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

目前windows字库仍然停留在unicode 3.x的水平，大约38000多个字符，据微软的人说，他们增加一个字的成本是200多美元，所以没兴趣搞

引用 6 楼 qq_16774199 的回复:[quote=引用 3 楼 早打大打打核战争 的回复:]最新的unicode 13.0已经包括143859个字符，unicode的雄心是囊括人类创造的所有文字和·符号，包括甲骨文、金文、楔形文字、玛雅文字等等，我估计最后连原始人创作的岩画也得搞进去~ 143859个字符也不够啊，简体+繁体就可能已经不够了，其它语言的文字全加上绝对不够用。[/quote]  这只是目前收录的字符数量，编码空间足够用，UTF-16支持一百多万个编码（0~10FFFF），而UCS-4使用31位编码（最高位固定为0），能支持超过21亿个字符，用到人类灭亡也填不满

引用 3 楼 早打大打打核战争 的回复:最新的unicode 13.0已经包括143859个字符，unicode的雄心是囊括人类创造的所有文字和·符号，包括甲骨文、金文、楔形文字、玛雅文字等等，我估计最后连原始人创作的岩画也得搞进去~ 143859个字符也不够啊，简体+繁体就可能已经不够了，其它语言的文字全加上绝对不够用。

引用 3 楼 早打大打打核战争 的回复:最新的unicode 13.0已经包括143859个字符，unicode的雄心是囊括人类创造的所有文字和·符号，包括甲骨文、金文、楔形文字、玛雅文字等等，我估计最后连原始人创作的岩画也得搞进去~ 查了一下，这里面已经有93000多的汉字了！涨知识了

引用 3 楼 早打大打打核战争 的回复:最新的unicode 13.0已经包括143859个字符，unicode的雄心是囊括人类创造的所有文字和·符号，包括甲骨文、金文、楔形文字、玛雅文字等等，我估计最后连原始人创作的岩画也得搞进去~NB！

1、你不能指望哪个字符集能把所有的字收全了，就算收全了，也会有新的字产生！实际上和英语不一样，新的字和词的产生，往往就会有新的字符产生。实际上早期有所谓的造字程序（当然是因为当时主要用途是字处理，用于交换的时候很少），但是现在信息交换成为主要用途了，所以就不能自己造字了，必须让标准、权威的部门来做这种事情！ 2、Unicode支持的字符上限是65536个或者2字节，这种说法也是有问题的，实际上也有3、4字节的版本，所以9万本身不是问题

所以就出现多字节字符，并出现了字符集和编码（字符集规定收录多少字符，编码规定每个字符的编码值），比如GBK，BIG5，UTF8等等


Question: 格式符

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

引用 2 楼 赵4老师的回复:#include <stdio.h> int main() {     char cs1[4],cs2[4];     int i;      for (i=0;i<4;i++) {         cs1[i]=0;         cs2[i]=0;     }      scanf("%4c%4c",&cs1[0],&cs2[0]);      for (i=0;i<4;i++) {         printf("%02X ",cs1[i]);     }     printf("\n");      for (i=0;i<4;i++) {         printf("%02X ",cs2[i]);     }     printf("\n");      return 0; } //输入：A三个空格B三个空格回车 //输出 //41 20 20 20 //42 20 20 20 //  可见题3.51中的代码会导致c1和c2变量对应字节后面的三个字节被空格的ascii码即0x20覆盖，属于危险代码。 现在的书都这么奇怪了吗？前提错了还出题？

scanf Width Specification width is a positive decimal integer controlling the maximum number of characters to be read from stdin. No more than width characters are converted and stored at the corresponding argument. Fewer than width characters may be read if a white-space character (space, tab, or newline) or a character that cannot be converted according to the given format occurs before width is reached.  The optional prefixes h, l, I64, and L indicate the “size” of the argument (long or short, single-byte character or wide character, depending upon the type character that they modify). These format-specification characters are used with type characters in scanf or wscanf functions to specify interpretation of arguments as shown in the Table R.7. The type prefixes h, l, I64, and L are Microsoft extensions and are not ANSI-compatible. The type characters and their meanings are described in Table R.8.  Table R.7   Size Prefixes for scanf and wscanf Format-Type Specifiers  To Specify Use Prefix With Type Specifier  double l e, E, f, g, or G  long int l d, i, o, x, or X  long unsigned int l u  short int h d, i, o, x, or X  short unsigned int h u  __int64 I64 d, i, o, u, x, or X  Single-byte character with scanf h c or C  Single-byte character with wscanf h c or C  Wide character with scanf l c or C  Wide character with wscanf l c, or C  Single-byte – character string with scanf h s or S  Single-byte – character string with wscanf h s or S  Wide-character string with scanf l s or S  Wide-character string with wscanf l s or S    Following are examples of the use of h and l with scanffunctions and wscanf functions:  scanf( "%ls", &x );    // Read a wide-character string wscanf( "%lC", &x );    // Read a single-byte character  To read strings not delimited by space characters, a set of characters in brackets ([ ]) can be substituted for the s (string) type character. The corresponding input field is read up to the first character that does not appear in the bracketed character set. If the first character in the set is a caret (^), the effect is reversed: The input field is read up to the first character that does appear in the rest of the character set.  Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]. This is a common scanf function extension, but note that the ANSI standard does not require it.  To store a string without storing a terminating null character ('\0'), use the specification %nc where n is a decimal integer. In this case, the c type character indicates that the argument is a pointer to a character array. The next n characters are read from the input stream into the specified location, and no null character ('\0') is appended. If n is not specified, its default value is 1.  The scanf function scans each input field, character by character. It may stop reading a particular input field before it reaches a space character for a variety of reasons:   The specified width has been reached.   The next character cannot be converted as specified.   The next character conflicts with a character in the control string that it is supposed to match.    The next character fails to appear in a given character set.  For whatever reason, when the scanf function stops reading an input field, the next input field is considered to begin at the first unread character. The conflicting character, if there is one, is considered unread and is the first character of the next input field or the first character in subsequent read operations on stdin.

因为%4c中的4表示占4个字符，楼主可以输入到编译器，然后执行一下，如果不这样输入那么输出是c1, c2是什么，可以试试～


Question: 程序报错，改不对了，能帮我看看怎么改吗

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

引用 5 楼 user-3的回复:我觉得楼主的思维似乎受魔法流影响较大。 是否以为你定义了一堆数组，日志文件里的信息就会“自动”进入那些数组？  数组/变量名都是给人类看的，机器并不理解那些名字的含义，也不会“自动”填充那些数组。 咱还是回到现实科技侧，先落实一下语义，学习一下字符串拆分吧？  BTW: 其实学习一下Python，在引入适当的库的前提下，能够更好地兼容楼主的需求。 嗯嗯，谢谢，我知道了，我确实基础不好，谢谢指点

引用 2 楼 SSyeah 的回复:[quote=引用 1 楼 自信男孩的回复:]        for(i=0;i<line;i++)         {                 arr[line[i],status]++;                 vis[line[i],status]=1;         }         in 这个如何理解？ line是数组名，i < line是做什么， line[i]，status这个作为下标还有逗号，那么status是数组名呢，  这样的代码不符合语法规则，自然会提示编译错误。 我把line改正为line[i]后，程序的warning没有了，但是后面的status不知道该怎么改了[/quote] 怎么改，要看你要实现什么，status是用于做什么的，再说上面也没对status赋值呢

引用 1 楼 自信男孩的回复:        for(i=0;i<line;i++)         {                 arr[line[i],status]++;                 vis[line[i],status]=1;         }         in 这个如何理解？ line是数组名，i < line是做什么， line[i]，status这个作为下标还有逗号，那么status是数组名呢，  这样的代码不符合语法规则，自然会提示编译错误。 我把line改正为line[i]后，程序的warning没有了，但是后面的status不知道该怎么改了

引用 3 楼 自信男孩的回复:[quote=引用 2 楼 SSyeah 的回复:][quote=引用 1 楼 自信男孩的回复:]        for(i=0;i<line;i++)         {                 arr[line[i],status]++;                 vis[line[i],status]=1;         }         in 这个如何理解？ line是数组名，i < line是做什么， line[i]，status这个作为下标还有逗号，那么status是数组名呢，  这样的代码不符合语法规则，自然会提示编译错误。 我把line改正为line[i]后，程序的warning没有了，但是后面的status不知道该怎么改了[/quote] 怎么改，要看你要实现什么，status是用于做什么的，再说上面也没对status赋值呢[/quote] #include<stdio.h> #include<string.h> int main(void) { 	FILE *fp; 	fp=fopen("access.log","r+");//打开文件  	if(!fp) 	{ 		printf("false\n"); 		return -1;//直接返回  	} 	else{ 		printf("true\n"); 	}//判断文件是否成功打开  	char line[2048];//定义和初始化字符串  	int n=0,m=0; 	char method[255]={}; 	char ip[255]={}; 	char protocol[255]={}; 	char time[255]={}; 	char add[255]={}; 	char port[255]={}; 	char page[255]={}; 	int status; 	char exploer_info[255]={}; 	char key[255]={}; 	char value[255]={}; 	char prams_cnt[255]={};//对字符串进行定义和初始化  	struct record 	{ 		char method[255]; 		char ip[255]; 		char protocol[255]; 		char time[255]; 		char add[255]; 		char port[255]; 		char page[255]; 		int status; 		char exploer_info[255]; 		struct prams 		{ 			char key[255]; 			char value[255]; 		}; 		char prams_cnt[255]; 	};//将字符串存入结构体中  	  	while(fgets(line,2048,fp)!=NULL) 	{ 		puts(line); 		n++; 		if(strncmp(line,"[GET]",5)==0) 		{ 			m++; 		}//比较两字符串，相等时strncmp函数值返回0,计数  	}//输出日志文件内容并统计计数  	printf("%f\n",1.0*m/n);//输出所占百分比 	char arr[1000]={0}; 	char vis[1000]={0}; 	int i; 	for(i=0;i<line[i];i++) 	{ 		arr[line[i],status]++; 		vis[line[i],status]=1; 	}  	 	printf("%d",1.0*arr[i]++/i); 	int fclose(FILE *fp);//关闭文件  	return 0; } 改后的程序是这样的，更改status类型为整数后就没有报错了，但是运行结果还是不对，调试发现没有进入for循环，i一直是0， 想要实现的功能是计算日志文件中的所有访问状态码的比率，所以这里用的status，但是可能不对，找不到问题出在哪了


Question: 请问一下 这个程序是输出学生不及格的人数，但是为什么得不到正确的答案

for(i=0;i<n && i < N;i++)    //加上i < N，防止数组越界～     {        scanf("%d",&a[i]);//scanf("%d",a[i]);输入成绩                          //break;//这句多余     } 供参考～

参考对照： #include <stdio.h> #define N 40 int Func(int a[],int n); int main() {     int n,i,a[N],ret;      scanf("%d",&n);       //输入学生人数      for(i=0;i<n;i++)     {        scanf("%d",&a[i]);//scanf("%d",a[i]);输入成绩                          //break;//这句多余     }     ret = Func(a,n);     printf("%d",ret);     return 0; }  int Func(int a[],int n) {     int i,count=0; //m     for(i=0;i<n;i++)     {                   //m = a[i];//这句可以不用        if(a[i]<60)//if(m<60)        {           count++;        }     }     return count; }   //8 //75 87 54 36 92 64 52 53 //4请按任意键继续. . .


说错了 是为什么给了小于p的正整数的范围也行啊


Question: c如何输出中文

https://blog.csdn.net/yoursly/article/details/95588323  按这里方式修改一下吧

改一下编码方式就好了

引用 2 楼 虚延 的回复:引用 1 楼 自信男孩 的回复：编码问题，建议看一下字符编码。字符编码怎么设置啊，我之前在mac上都可以直接输出中文的 看一下配置部分，找到设置编码的地方。

供参考：#include <stdio.h> #include <locale.h> int main() {     wchar_t name[100];     setlocale(LC_ALL,"chs");     wscanf(L"%s",name);     wprintf(L"\"%s\"\n",name);     return 0;  }

编码问题，建议看一下字符编码。


Question: 请教各位大神，C语言到底怎么才能学好

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

去网上找找翁恺老师的课，还有就是多练习叭

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

引用 4 楼 拾年_ 的回复:[quote=引用 3 楼 早打大打打核战争的回复:]学好C语言比玩转F1赛车容易多了，但是“C语言到底怎么才能学好”这个问题的难度和“到底怎么才能当上F1车手”的难度一样，简单说就是问题太大，无法回答，回答也只能是概念性的，没有可操作性~ 唉，说白了只要肯下功夫，我就是想走捷径，看来还得靠自己[/quote]  我感觉你很有悟性，应该很容易学好，C语言是很简单的语言，复杂之处在于灵活运用

引用 3 楼 早打大打打核战争的回复:学好C语言比玩转F1赛车容易多了，但是“C语言到底怎么才能学好”这个问题的难度和“到底怎么才能当上F1车手”的难度一样，简单说就是问题太大，无法回答，回答也只能是概念性的，没有可操作性~ 唉，说白了只要肯下功夫，我就是想走捷径，看来还得靠自己😓


Question: 请问大神 这第一列前面的空格多了怎么办，同是还要保证后面每列之间有两空格

不知道楼主的杨辉三角形n的数据规模与约定，暂定n<10 的. 每行最后一列之后允许跟空格吗，如果可以，第25行改为下面这样就行了 printf("%-2d  ",a[i][j]); 如果每行最后一列之后不能有空格，那第25行改printf("%-2d%s",a[i][j],(j<i)?"  ":"");

不想改很多，就用判断一下每一行是不是第一个元素，如果是，就不用%2d而改成%d，否则就用%2d

printf的格式控制很灵活的：printf("%*d", !!(j - 1) + 1, a[i][j]);

特事特办嘛 printf(j==1?"%1d":"%2d",a[i][j]);


Question: 在C中使用中文，本地化全攻略

引用 5 楼 赵4老师 的回复:刚好打酱油路过  酱油呢，也丢了

刚好打酱油路过

引用 1 楼 赵4老师 的回复:  你这是回娘家？一只鸡、一只鸭，还有胖娃娃都丢了？

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


Question: c语言数组问题求教！！！

学习学习使我快乐

引用 2 楼 自信男孩 的回复:[code=c]#include<stdio.h> #include<string.h>  int main() {   #if 1     char buf[100];     int num, cnt;     int i, j;       scanf("%d", &num);      while (getchar() != '\n')         ;      for (i = 0; i < num; i++) {         fgets(buf, sizeof(buf), stdin);          cnt = 0;         for (j = 0; buf[j] != '\n' && buf[j]; j++) {             if (buf[j] == 'P' && cnt == 0)                 cnt++;             if (buf[j] == 'A' && cnt == 1)                 cnt++;             if (buf[j] == 'T' && cnt == 2)                 break;         }         if (cnt >= 2)             printf("YES\n");         else             printf("NO\n");     }  #else     char c;     int num;     scanf("%d", &num);     while(getchar() != '\n')         ;  //来清除scanf缓存中的垃圾数据     int i=0;//count表示A分别在几个位置 的数量     char pri[num][3];     for(i=0;i<num;i++)     {         int pos=0,count[3]={0,0,0};//,count[3]={0,0,0}不能放上面         while((c=getchar())!='\n'){             if(c=='A') count[pos]++;             else if(c=='P'&&pos==0) pos=1;             else if(c=='T'&&pos==1) pos=2;             else break;         }         if(c=='\n'&&pos==2&&count[1]&&count[2]==count[1]*count[0]){             strcpy(pri[i],"YES");         }         else  {             strcpy(pri[i],"NO");         }         if(c!='\n')             while(getchar()!='\n');   //来清除getchar缓存中的垃圾数据     }     for(int j=0;j<num;j++){         printf("%s\n",pri[j]);     } #endif     return 0; }  [quote=引用 6 楼 weixin_45544561 的回复:][quote=引用 楼主 想学精编程的人的回复:]//1003 我要通过！ (20分)  pta上的一道题   #include<stdio.h> #include<string.h> int main() {     char c;     int num;     scanf("%d", &num);     while(getchar() != '\n');  //来清除scanf缓存中的垃圾数据     int i=0;//count表示A分别在几个位置 的数量     char pri[num][3];     for(i=0;i<num;i++)     {         int pos=0,count[3]={0,0,0};//,count[3]={0,0,0}不能放上面         while((c=getchar())!='\n'){             if(c=='A') count[pos]++;             else if(c=='P'&&pos==0) pos=1;             else if(c=='T'&&pos==1) pos=2;             else break;         }                 if(c=='\n'&&pos==2&&count[1]&&count[2]==count[1]*count[0]){         strcpy(pri[i],"YES");             }         else  {         strcpy(pri[i],"NO");         }           if(c!='\n')             while(getchar()!='\n');   //来清除getchar缓存中的垃圾数据     }         for(int j=0;j<num;j++){     printf("%s\n",pri[j]);     }     return 0; }  我在输出是出現问题    前4ge输出应该只有一个YES,不知道为什么会这么多 你好，楼主。我也爱好c语言。不过是初学者。我想问下，你提到的PTA是什么？是一个能做题的学习网站吗？还是什么呀？能告诉我吗？[/quote]你直接搜就行，可以做题的

小白路过，学习了

引用 楼主 想学精编程的人的回复://1003 我要通过！ (20分)  pta上的一道题   #include<stdio.h> #include<string.h> int main() {     char c;     int num;     scanf("%d", &num);     while(getchar() != '\n');  //来清除scanf缓存中的垃圾数据     int i=0;//count表示A分别在几个位置 的数量     char pri[num][3];     for(i=0;i<num;i++)     {         int pos=0,count[3]={0,0,0};//,count[3]={0,0,0}不能放上面         while((c=getchar())!='\n'){             if(c=='A') count[pos]++;             else if(c=='P'&&pos==0) pos=1;             else if(c=='T'&&pos==1) pos=2;             else break;         }                 if(c=='\n'&&pos==2&&count[1]&&count[2]==count[1]*count[0]){         strcpy(pri[i],"YES");             }         else  {         strcpy(pri[i],"NO");         }           if(c!='\n')             while(getchar()!='\n');   //来清除getchar缓存中的垃圾数据     }         for(int j=0;j<num;j++){     printf("%s\n",pri[j]);     }     return 0; }  我在输出是出現问题    前4ge输出应该只有一个YES,不知道为什么会这么多 你好，楼主。我也爱好c语言。不过是初学者。我想问下，你提到的PTA是什么？是一个能做题的学习网站吗？还是什么呀？能告诉我吗？

引用 4 楼 qzjhjxj的回复:[quote=引用 3 楼 想学精编程的人 的回复:][quote=引用 1 楼 qzjhjxj 的回复:]修改如下，供参考：#include<stdio.h> #include<string.h>  int main() {     char c;     int num;     scanf("%d", &num);     while(getchar() != '\n');     int i=0;     char pri[11][4];//char pri[num][3];这个数组设置错误导致     for(i=0;i<num;i++)     {         int pos=0,count[3]={0};//count[3]={0,0,0};//,count[3]={0,0,0}不能放上面         while((c=getchar())!='\n'){             if(c=='A') count[pos]++;             else if(c=='P'&&pos==0) pos=1;             else if(c=='T'&&pos==1) pos=2;             else break;         }         if(c=='\n'&&pos==2&&count[1]&&count[2]==count[1]*count[0]){         strcpy(pri[i],"YES");             }         else  {         strcpy(pri[i],"NO");         }           if(c!='\n')             while(getchar()!='\n');     }     for(int j=0;j<num;j++){     printf("%s\n",pri[j]);     }          return 0; }  //8 //PAT //PAAT //AAPATAA //AAPAATAAAA //xPATx //PT //Whatever //APAAATAA //YES //YES //YES //YES //NO //NO //NO //NO //请按任意键继续. . .我发现把这里//char pri[num][3];这个数组设置错误导致//里面的3改成4就能成功了，请问能解答一下原因吗[/quote] "YES" "NO"都是字符串，系统在保存时，自动会在串尾加上结束标志'\0',所以字符串"YES\0"的长度是4，"NO\0"  的长度为3。当把字符串数组char pri[num][3]长度设置为3时，保存时串尾结束标志就丢了，字符数组就是这样的：  pri[num][3]={"YES","YES","YES","YES","NO\0","NO\0","NO\0","NO\0"},当执行 printf("%s\n",pri[j]);的时候，  输出字符串时以'\0'作为结束标志，所以pri[0][3]= "YESYESYESYESNO"，pri[1][3]="YESYESYESNO"，...。正确的  pri[num][4]={"YES\0","YES\0","YES\0","YES\0","NO\0","NO\0","NO\0","NO\0"},输出时自然就对了。[/quote] 牛逼懂了谢谢

引用 3 楼 想学精编程的人 的回复:[quote=引用 1 楼 qzjhjxj 的回复:]修改如下，供参考：#include<stdio.h> #include<string.h>  int main() {     char c;     int num;     scanf("%d", &num);     while(getchar() != '\n');     int i=0;     char pri[11][4];//char pri[num][3];这个数组设置错误导致     for(i=0;i<num;i++)     {         int pos=0,count[3]={0};//count[3]={0,0,0};//,count[3]={0,0,0}不能放上面         while((c=getchar())!='\n'){             if(c=='A') count[pos]++;             else if(c=='P'&&pos==0) pos=1;             else if(c=='T'&&pos==1) pos=2;             else break;         }         if(c=='\n'&&pos==2&&count[1]&&count[2]==count[1]*count[0]){         strcpy(pri[i],"YES");             }         else  {         strcpy(pri[i],"NO");         }           if(c!='\n')             while(getchar()!='\n');     }     for(int j=0;j<num;j++){     printf("%s\n",pri[j]);     }          return 0; }  //8 //PAT //PAAT //AAPATAA //AAPAATAAAA //xPATx //PT //Whatever //APAAATAA //YES //YES //YES //YES //NO //NO //NO //NO //请按任意键继续. . .我发现把这里//char pri[num][3];这个数组设置错误导致//里面的3改成4就能成功了，请问能解答一下原因吗[/quote] "YES" "NO"都是字符串，系统在保存时，自动会在串尾加上结束标志'\0',所以字符串"YES\0"的长度是4，"NO\0"  的长度为3。当把字符串数组char pri[num][3]长度设置为3时，保存时串尾结束标志就丢了，字符数组就是这样的：  pri[num][3]={"YES","YES","YES","YES","NO\0","NO\0","NO\0","NO\0"},当执行 printf("%s\n",pri[j]);的时候，  输出字符串时以'\0'作为结束标志，所以pri[0][3]= "YESYESYESYESNO"，pri[1][3]="YESYESYESNO"，...。正确的  pri[num][4]={"YES\0","YES\0","YES\0","YES\0","NO\0","NO\0","NO\0","NO\0"},输出时自然就对了。

引用 1 楼 qzjhjxj 的回复:修改如下，供参考：#include<stdio.h> #include<string.h>  int main() {     char c;     int num;     scanf("%d", &num);     while(getchar() != '\n');     int i=0;     char pri[11][4];//char pri[num][3];这个数组设置错误导致     for(i=0;i<num;i++)     {         int pos=0,count[3]={0};//count[3]={0,0,0};//,count[3]={0,0,0}不能放上面         while((c=getchar())!='\n'){             if(c=='A') count[pos]++;             else if(c=='P'&&pos==0) pos=1;             else if(c=='T'&&pos==1) pos=2;             else break;         }         if(c=='\n'&&pos==2&&count[1]&&count[2]==count[1]*count[0]){         strcpy(pri[i],"YES");             }         else  {         strcpy(pri[i],"NO");         }           if(c!='\n')             while(getchar()!='\n');     }     for(int j=0;j<num;j++){     printf("%s\n",pri[j]);     }          return 0; }  //8 //PAT //PAAT //AAPATAA //AAPAATAAAA //xPATx //PT //Whatever //APAAATAA //YES //YES //YES //YES //NO //NO //NO //NO //请按任意键继续. . .我发现把这里//char pri[num][3];这个数组设置错误导致//里面的3改成4就能成功了，请问能解答一下原因吗

#include<stdio.h> #include<string.h>  int main() {   #if 1     char buf[100];     int num, cnt;     int i, j;       scanf("%d", &num);      while (getchar() != '\n')         ;      for (i = 0; i < num; i++) {         fgets(buf, sizeof(buf), stdin);          cnt = 0;         for (j = 0; buf[j] != '\n' && buf[j]; j++) {             if (buf[j] == 'P' && cnt == 0)                 cnt++;             if (buf[j] == 'A' && cnt == 1)                 cnt++;             if (buf[j] == 'T' && cnt == 2)                 break;         }         if (cnt >= 2)             printf("YES\n");         else             printf("NO\n");     }  #else     char c;     int num;     scanf("%d", &num);     while(getchar() != '\n')         ;  //来清除scanf缓存中的垃圾数据     int i=0;//count表示A分别在几个位置 的数量     char pri[num][3];     for(i=0;i<num;i++)     {         int pos=0,count[3]={0,0,0};//,count[3]={0,0,0}不能放上面         while((c=getchar())!='\n'){             if(c=='A') count[pos]++;             else if(c=='P'&&pos==0) pos=1;             else if(c=='T'&&pos==1) pos=2;             else break;         }         if(c=='\n'&&pos==2&&count[1]&&count[2]==count[1]*count[0]){             strcpy(pri[i],"YES");         }         else  {             strcpy(pri[i],"NO");         }         if(c!='\n')             while(getchar()!='\n');   //来清除getchar缓存中的垃圾数据     }     for(int j=0;j<num;j++){         printf("%s\n",pri[j]);     } #endif     return 0; } 供参考～


Question: 兄弟们，求解·

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

for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

当k=4，i = 1时，注释掉的代码是k < 5-i；即这条语句判断是假，不会执行，后面的i = 2, i = 3 ...都不会执行，这样，这个循环就成冗余代码，不会被执行了。

供参考：#include <stdio.h> int main() {     int i,j,k;     for(i=1;i<=4;i++)      {       for(j=0;j<i-1;j++)        {         printf(" ");        }       //for(k=0;k<5-i;k++)//这句是k=0开始，执行k<5-i次 printf(" *")，k++;                           //i=1时，k=0 < 5-i=5-1=4,条件满足，执行 printf(" *")，k++；                           //i=2时，k=0 < 5-i=5-2=3,条件满足，执行 printf(" *")，k++；                           //i=3时，。。。。。。        for(k=5-i;k>0;k--) //倒过来应该是这样写才对，k=5-i开始，执行5-i>0次printf(" *"),k--;        //for(k=4;k<5-i;k--)//为什么将上面的for(k=0;k<5-i;k++)换成我注释的就不对啊，求解？        {                  //当i=1时，条件是k=4开始，k=4 < 5-i=5-1=4,条件不满足，直接就跳出循环了         printf(" *");     //当i=2时，k=4 < 5-i=5-2,仍然条件不满足，跳出循环        }                  //i=3时，。。。。。。       printf("\n");      }     system("pause");     return 0; }


Question: 为啥我这个代码输入数字点回车就还是没有输出

好的好的，谢谢

输入结束的条件是-1，所以你得输入-1才会退出循环。

你的第一个循环赋值不如直接初始化的时候赋值，第二个循环仔细看的话可以发现只有输入scanf，而你输出的printf函数则是在第三个循环里，第二个循环没有跳出来就无法进入第三个循环，自然没有输出

...你的那个循环本来就没有输出呀

无语中 你自己写的输入-1才结束嘛。


Question: 带指针的函数，怎么传参数，刚学c语言，很迷

要求用指针就去掉方括号嘛。

引用 4 楼 user-3的回复:楼主，这个chen()函数具体功能不清楚，按图修改，供参考：#include <stdio.h>  int chen(int b[],int n,int m);//函数声明 //或：int chen(int *b,int n,int m);  int main() {     int c,b;     while(~scanf("%d",&c))     {        scanf("%d",&b);        //int a[c];        int *a = new int[c];//动态数组        printf("%d\n",chen(a,c,b));     }          return 0;  }  int chen(int b[],int n,int m)//函数实现 //或：int chen(int *b,int n,int m); {     int sum=0;     for(int i=0;i<m;i++)     {        b[i] = i+1;     } } 我明天会试试的

要求要用指针

说的就是去掉星啊，原型比函数头就是多余一个星，画蛇为啥要添足呢？

加分加了，还是报错了，去掉星号，不用指针也对，字符串指针我会用，这个数组型指针有毒感觉

参考这页往下拉：

原型写的不对，复制函数头加个分号就好。 b需要个int类型的数组名，所以你红的那行调用是正确的，错的是上面。


Question: C语言函数

哈哈，我也曾中招过

输出，%3.0f 瞎了。。。

哦哦 我晓得了


Question: 把文件中的特定数据传入至数组中以待后续使用

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

原始文件是手机上的传感器的数据，然后由于每次测量时间不等，行数是未知的，没有空行，但是每行并没有完全填满，预期期望是把原始数据文件中ACCE、Gyro、Magn以及GNSS开头的后续的一些数据分别读取到对应的数组中去，其中acce、gyro、magn都是n行（因为样本数未知）6列的数组；gnss是n行10列的数组，以便后续调取使用。

记得你问过这个问题，看来你还是不会提问题。 你不能去看医生只说不舒服。 你得充分说清你的情况和需求，包括但不限于： 你的数据文件预计有多少行/行数未知？ 有没有/为什么有空行？ 为什么有些行看起来该分行却没分？实际文件会不会这样？ 预期的合理的行是什么格式？ 合理的行应有几个字段？ 字段是否由分号分隔？ 你预期读完以后放进什么数组？类型？维度？大小？


Question: 找大佬


Question: 程序不能输出，还显示warning，求大佬帮忙看一下

引用 2 楼 自信男孩的回复:#include<stdio.h> #include<string.h>  int main(void) {     FILE *fp;     fp=fopen("access.log","r+");     if(!fp){         printf("false\n");         return -1;//直接返回     }     else{         printf("true\n");     }      char method[255]={};     char ip[255]={};     char protocol[255]={};     char time[255]={};     char add[255]={};     char port[255]={};     char page[255]={};     char status[255]={};     char exploer_info[255]={};     char key[255]={};     char value[255]={};     char prams_cnt[255]={};//对字符串进行定义和初始化      struct record     {         char method[255];         char ip[255];         char protocol[255];         char time[255];         char add[255];         char port[255];         char page[255];         char status[255];         char exploer_info[255];         struct prams         {             char key[255];             char value[255];         };         char prams_cnt[255];     };//将字符串存入结构体中     while(getc(fp)!=EOF)     {         /*   //可能出现内存溢出         fgets(method,1000,fp);         fgets(ip,1000,fp);         fgets(protocol,1000,fp);         fgets(time,1000,fp);         fgets(add,1000,fp);         fgets(port,1000,fp);         fgets(page,1000,fp);         fgets(status,1000,fp);         fgets(exploer_info,1000,fp);         fgets(key,1000,fp);         fgets(value,1000,fp);         fgets(prams_cnt,1000,fp);         */         fgets(method, sizeof(method),fp);         fgets(ip, sizeof(ip),fp);         fgets(protocol,sizeof(protocol),fp);         fgets(time, sizeof(time),fp);         fgets(add, sizeof(add),fp);         fgets(port, sizeof(port),fp);         fgets(page, sizeof(page),fp);         fgets(status, sizeof(status), fp);         fgets(exploer_info, sizeof(exploer_info), fp);         fgets(key, sizeof(key), fp);         fgets(value, sizeof(value), fp);         fgets(prams_cnt, sizeof(prams_cnt), fp);         printf("%s",method);         printf("%s",ip);         printf("%s",protocol);         printf("%s",time);         printf("%s",add);         printf("%s",port);         printf("%s",page);         printf("%s",status);         printf("%s",exploer_info);         printf("%s",key);         printf("%s",value);//将日志文件输出     }//;     int i=0,n=0;     /*     for(i=0;i<1000;i++)     {         //if (method[i]="[GET]")         if (strcmp(method, "[GET]") == 0)         {             n++;         }     };     */     if (strcmp(method, "[GET]") == 0)     {         n++;     }     double pro=0.0;     pro=1.0*i/n;     printf("%f",pro);      int fclose(FILE *fp);     return 0; }  供参考～ 我明白啦，谢谢谢谢！

引用 3 楼 forever74的回复:要做这点事定义那么多乱七八糟的东西干啥，抓一行，比较前5个字符，循环。  #include<stdio.h> #include<string.h>  int main(void) { 	char line[2048]; 	FILE *fp; 	int n=0, m=0; 	fp = fopen("access.log", "r"); 	if (!fp) { 		printf("false\n"); 		return -1;//直接返回 	} 	while (fgets(line,2048,fp) != NULL) 	{ 		//puts(line); //需要的话去掉行首的双斜线输出 		n++; 		if (strncmp(line, "[GET]", 5) == 0)m++; 	} 	printf("%.4lf", 1.0*m/n);  	fclose(fp); 	return 0; }  谢谢谢谢，非常感谢

引用 1 楼 qzjhjxj的回复:if (method[i]="[GET]")这句是要判断method[i]=="[GET]"吗？字符串应该这样判断：#include<string.h> //头文件 if(strcmp(method[i],"[GET]")==0) 好哒，明白啦，谢谢谢谢

事实上楼主的代码里每个fgets都抓进来一整行，而不是你自己设想的一个字段，因此该代码缺少正确的前提。


Question: C语言整数浮点数转换小问题

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

这个恐怕和printf的%f 格式有关，好像默认小数6位， 我看就是 1.5

这里涉及到浮点型与整数型何时进行转换的问题。 式子a= a_10/10;   a为浮点型，a_10为整数型      为了方便讲，把式子变成   a = a_10/10 + 3;  这时就出现问题了   是该把a_10直接转为浮点型然后进行 除10 加 3 的运算，(整数除法运算不保留余数，这是与浮点型运算的区别，这个会影响到最后结果) 还是a_10/10 运算完后 转为浮点型然后加3， 或者说a_10/10 + 3   全部运算完后在转呢。  实际上编译器是根据给的数字 10  或 10.0   ， 3  或3.0进行运算区分 整数与整数运算 a_10/10 ，a_10/10 + 3 还是按照整数运算方式进行 整数与浮点运算a_10/10.0   就会先把 a_10 转为浮点型在 与10.0运算。

#include <stdio.h> int main() {     float a=1.5;     printf("first  a=%f\n",a);//原来的     int   a_10;     a_10 = (int)(a*10);     printf("a_10=%d\n",a_10);     a    = a_10/10.0;     printf("second a=%f\n",a);//现在的      return 0; }  //first  a=1.500000 //a_10=15 //second a=1.500000 //请按任意键继续. . .

所以你得表达清楚，你关心的到底是值还是格式？

人家系统输出了5个0，你自己在正文敲了8个0，可见你自己也认为末尾多几个少几个0没关系。


Question: 我是新手，哪位大神能告诉我这啥意思，谢谢啦。

引用 2 楼 qq_52473673 的回复:[quote=引用 1 楼 forever74的回复:]scanf_s("%s",name,39); 为啥后面要带个39呀。[/quote] 40，或者用sizeof(name)。不建议用39，用39是考虑最后的'\0'，其实不需要关心scanf_s会考虑把'\0'加到缓存的末尾或者是有效字符的后面一个字节。

引用 10 楼 qq_52473673的回复:[quote=引用 8 楼 qq_52473673的回复:][quote=引用 6 楼 qzjhjxj的回复:]供参考：#include<stdio.h> #define PARISE "you are a extraordinary being." int main() {     char name[40];     printf("what is your name?");     scanf_s("%s",name,40);     printf("Hello,%s. %s\n",name,PARISE);          return 0; } 参考百度：https://www.zhihu.com/question/64044016 不行呀，报错说40是未声明的标识符。[/quote] 不好意思，刚才我弄错了。已经可以了，谢谢。[/quote] 再次劳烦您一下，为什么要在后面加个40呢？

引用 8 楼 qq_52473673的回复:[quote=引用 6 楼 qzjhjxj的回复:]供参考：#include<stdio.h> #define PARISE "you are a extraordinary being." int main() {     char name[40];     printf("what is your name?");     scanf_s("%s",name,40);     printf("Hello,%s. %s\n",name,PARISE);          return 0; } 参考百度：https://www.zhihu.com/question/64044016 不行呀，报错说40是未声明的标识符。[/quote] 不好意思，刚才我弄错了。已经可以了，谢谢。

引用 6 楼 qzjhjxj的回复:供参考：#include<stdio.h> #define PARISE "you are a extraordinary being." int main() {     char name[40];     printf("what is your name?");     scanf_s("%s",name,40);     printf("Hello,%s. %s\n",name,PARISE);          return 0; } 参考百度：https://www.zhihu.com/question/64044016 不行呀，报错说40是未声明的标识符。

scanf_s("%s",[color=#0000FF]&name[/color],39); //必须是变量地址，

引用 4 楼 forever74的回复:scanf_s的其他用法和scanf一致，但是， 每个%s或%c格式符需要对应后面2个参数，第二个是长度限制。 但我按你上面那样打还是不行呀。

引用 1 楼 forever74的回复:scanf_s("%s",name,39); 好像也不行哟

引用 1 楼 forever74的回复:scanf_s("%s",name,39); 为啥后面要带个39呀。

引用 14 楼 qq_34124780的回复:scanf()不是要用&符号来取地址接收吗？scanf_s应该也需要吧。。。 这个是name数组，不需要那个


Question: 请问大神 为什么是这个结果，错哪了（答案是5）

修改如下，供参考：#include <stdio.h>  int Gcd(int x,int y);//函数声明  int main() {         int a,b;         int ret;         scanf("%d %d",&a,&b);          ret = Gcd(a,b); //函数调用          printf("%d",ret);                  return 0; }  int Gcd(int x,int y)//函数实现 {        int r;        r=x%y;        while(r!=0)        {           x=y;           y=r;           r=x%y;        }        return y; }   //50 15 //5请按任意键继续. . .

ret没有初始化。 编写的函数也没有用呀。，看不出这段程序的作用

你写了个函数却没有调用它


Question: 求数据结构算法演示系统DSDemo

发你邮箱：yueduchu@yeah.net


Question: c语言作业，大神求解

引用 5 楼 weixin_45544561的回复:[quote=引用 4 楼 自信男孩的回复:][quote=引用 3 楼 weixin_45544561 的回复:][quote=引用 1 楼 自信男孩的回复:]scanf的返回值不等1（注意scanf中只有一个%d，因此等于1是正常的输入），说明输入的不匹配%d，那么scanf("%*s");就是用于接收输入缓存里的不匹配%d的内容，这样保证输入缓存里没有内容，下次的scanf就会接收新输入的，如果没有这句，那么输入缓存的内容还是会和%d匹配，不匹配，继续返回0，这样就成了无限循环～ 额，好像跟那个getchar()接收回车一样。 但while那里还是不明白，如果我输入days为5，那么5！=1为真（逻辑值即非零），为什么不进入循环？[/quote] 是返回值，返回值要么是0或EOF，要么是输入的匹配的个数[/quote] 懂了懂了，厉害[/quote] 怎么发不出消息

引用 4 楼 自信男孩的回复:[quote=引用 3 楼 weixin_45544561 的回复:][quote=引用 1 楼 自信男孩的回复:]scanf的返回值不等1（注意scanf中只有一个%d，因此等于1是正常的输入），说明输入的不匹配%d，那么scanf("%*s");就是用于接收输入缓存里的不匹配%d的内容，这样保证输入缓存里没有内容，下次的scanf就会接收新输入的，如果没有这句，那么输入缓存的内容还是会和%d匹配，不匹配，继续返回0，这样就成了无限循环～ 额，好像跟那个getchar()接收回车一样。 但while那里还是不明白，如果我输入days为5，那么5！=1为真（逻辑值即非零），为什么不进入循环？[/quote] 是返回值，返回值要么是0或EOF，要么是输入的匹配的个数[/quote] 懂了懂了，厉害

引用 3 楼 weixin_45544561 的回复:[quote=引用 1 楼 自信男孩的回复:]scanf的返回值不等1（注意scanf中只有一个%d，因此等于1是正常的输入），说明输入的不匹配%d，那么scanf("%*s");就是用于接收输入缓存里的不匹配%d的内容，这样保证输入缓存里没有内容，下次的scanf就会接收新输入的，如果没有这句，那么输入缓存的内容还是会和%d匹配，不匹配，继续返回0，这样就成了无限循环～ 额，好像跟那个getchar()接收回车一样。 但while那里还是不明白，如果我输入days为5，那么5！=1为真（逻辑值即非零），为什么不进入循环？[/quote] 是返回值，返回值要么是0或EOF，要么是输入的匹配的个数

引用 1 楼 自信男孩的回复:scanf的返回值不等1（注意scanf中只有一个%d，因此等于1是正常的输入），说明输入的不匹配%d，那么scanf("%*s");就是用于接收输入缓存里的不匹配%d的内容，这样保证输入缓存里没有内容，下次的scanf就会接收新输入的，如果没有这句，那么输入缓存的内容还是会和%d匹配，不匹配，继续返回0，这样就成了无限循环～ 额，好像跟那个getchar()接收回车一样。 但while那里还是不明白，如果我输入days为5，那么5！=1为真（逻辑值即非零），为什么不进入循环？

引用 1 楼 自信男孩的回复:scanf的返回值不等1（注意scanf中只有一个%d，因此等于1是正常的输入），说明输入的不匹配%d，那么scanf("%*s");就是用于接收输入缓存里的不匹配%d的内容，这样保证输入缓存里没有内容，下次的scanf就会接收新输入的，如果没有这句，那么输入缓存的内容还是会和%d匹配，不匹配，继续返回0，这样就成了无限循环～ 好像跟那个getchar()接收回车键一样。懂了一些。但while里面的条件，如果开始我输入为5，即days为5，5!=1为真(即非零。)为什么不进入循环？


Question: c语言不定参数出错

其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

引用 10 楼 yyang0514 的回复:[quote=引用 5 楼 自信男孩 的回复:][quote=引用 3 楼 yyang0514 的回复:][quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h>  int print(const char *format, ...) {     va_list args;     const char *args1;     va_start(args, format);      //printf("%s.....", format);     while(1)     {         args1 = va_arg(args,const char *);         if (args1 == NULL)             break;         printf("%s.....",args1);         /*            if(strlen(args1))            printf("%s.....",args1);            else            break;            */     }     va_end(args);     printf("\n");     return 0; } int main() {     print("aaaaa", "22222", "333333", NULL);     //print("bbbbb", "44444", "5555555", "666666");     return 0; } 供参考～  缺少结束标识 有没有办法在有调用时，不用输入结束符呢。[/quote] 那可以试试用参数个数，即输入一个确定参数用于标识参数的个数[/quote] 非常感谢你的帮助。 请问为什么调用有4个参数，又不要加结束符的时候，输出又是正确的。 print("bbbbb", "44444", "5555555", "666666");[/quote] 这种情况应该是随机的吧，当遇到第5个（越界了）正好是strlen(第5个）长度小于等于0.  越界访问操作是未定义的，结果不确定的。

引用 5 楼 自信男孩 的回复:[quote=引用 3 楼 yyang0514 的回复:][quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h>  int print(const char *format, ...) {     va_list args;     const char *args1;     va_start(args, format);      //printf("%s.....", format);     while(1)     {         args1 = va_arg(args,const char *);         if (args1 == NULL)             break;         printf("%s.....",args1);         /*            if(strlen(args1))            printf("%s.....",args1);            else            break;            */     }     va_end(args);     printf("\n");     return 0; } int main() {     print("aaaaa", "22222", "333333", NULL);     //print("bbbbb", "44444", "5555555", "666666");     return 0; } 供参考～  缺少结束标识 有没有办法在有调用时，不用输入结束符呢。[/quote] 那可以试试用参数个数，即输入一个确定参数用于标识参数的个数[/quote] 非常感谢你的帮助。 请问为什么调用有4个参数，又不要加结束符的时候，输出又是正确的。 print("bbbbb", "44444", "5555555", "666666");

引用 7 楼 赵4老师 的回复:无论在编译期还是运行时，我既不事先告诉你总数，也不告诉你用于标记结束参数计数的结束符，实际到底有几个参数，你猜猜看？  请问什么调用有4个参数，又不要加结束符的时候，输出又是正确的。 print("bbbbb", "44444", "5555555", "666666");

要实现智能的可变参数函数，必须依赖编译器支持，否则做不到。即便printf、scanf之类的函数也不是真正智能，实际传入的参数数量和类型完全可以和格式化串中的不一样，它也不知道，还在傻干呢~

供参考： 可变参数在编程中要注意的问题：因 为va_start, va_arg, va_end等定义成宏,所以它显得很愚蠢, 可变参数的类型和个数完全在该函数中由程序代码控制,它并不能智能地识别不同参数的个数和类型. 有人会问:那么printf中不是实现了智能识别参数吗?那是因为函数 printf是从固定参数format字符串来分析出参数的类型,再调用va_arg 的来获取可变参数的.也就是说,你想实现智能识别可变参数的话是要通过在自己的程序里作判断来实现的. 例如，在C的经典教材《the c programming language》的7.3节中就给出了一个printf的可能实现方式. 在实际应用的代码中，程序员必须自己考虑确定参数数目的办法，如： ⑴在固定参数中设标志-- printf函数就是用这个办法。 ⑵在预先设定一个特殊的结束标记，就是说多输入一个可变参数，调用时要将最后一个可变参数的值设置成这个特殊的值，在函数体中根据这个值判断是否达到参数的结尾。 无论采用哪种办法，程序员都应该在文档中告诉调用者自己的约定。 例子，供参考：//下面是一个简单的printf函数的实现，参考了<The C programming language>7.3节中的例子，从固定 //参数format字符串来分析出参数的个数,再调用va_arg 的来获取可变参数.  //如果参数的类型不同呢？因为不同的数据类型占用的字节数可能是不一样的（如double型为8个字符， //short int型为2个），所以很难事先确定应该移动多少个字节！ //但是办法还是有的，这就是使用指针了，无论什么类型的指针，都是占用4个字节，所以，可以把所有 //的传入参数都设置为指针，这样一来，就可以通过移动固定的4个字节来实现遍历可变参数的目的了。  #include <stdio.h> #include <stdlib.h>  void myprintf(char* fmt, ...)//一个简单的类似于printf的实现，参数必须都是int 类型 {     char* pArg=NULL;      //等价于va_list     char c;     pArg = (char *)&fmt;  //对参数取地址     pArg += sizeof(fmt);  //等价于va_start,取得第一个参数地址     do{         c =*fmt;         if (c != '%'){             putchar(c);   //照原样输出字符         }         else{             switch(*++fmt){ //按格式字符输出数据                 case 'd':                         printf("%d",*((int*)pArg));                         break;                 case 'x':                         printf("%#x",*((int*)pArg));                         break;                 default:                         break;             }             pArg += sizeof(int);//等价于va_arg，下一个参数地址         }         ++fmt;     }while(*fmt != '\0');     pArg = NULL;               //等价于va_end     return; } int main(int argc, char* argv[]) {     int i = 13000;     int j = 13500;     myprintf("test1:i=%d\n",i,j);     myprintf("test2:i=%d;%x;j=%d;\n",i,0x57cd,j);      system("pause");     return 0; }  //test1:i=13000 //test2:i=13000;0x57cd;j=13500; //请按任意键继续. . .

引用 3 楼 yyang0514 的回复:[quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h>  int print(const char *format, ...) {     va_list args;     const char *args1;     va_start(args, format);      //printf("%s.....", format);     while(1)     {         args1 = va_arg(args,const char *);         if (args1 == NULL)             break;         printf("%s.....",args1);         /*            if(strlen(args1))            printf("%s.....",args1);            else            break;            */     }     va_end(args);     printf("\n");     return 0; } int main() {     print("aaaaa", "22222", "333333", NULL);     //print("bbbbb", "44444", "5555555", "666666");     return 0; } 供参考～  缺少结束标识 有没有办法在有调用时，不用输入结束符呢。[/quote] 那可以试试用参数个数，即输入一个确定参数用于标识参数的个数

https://blog.csdn.net/fishe_r/article/details/894559 https://docs.microsoft.com/zh-cn/cpp/cpp/calling-conventions?view=vs-2017

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <string.h>  int print(const char *format, ...) {     va_list args;     const char *args1;     va_start(args, format);      //printf("%s.....", format);     while(1)     {         args1 = va_arg(args,const char *);         if (args1 == NULL)             break;         printf("%s.....",args1);         /*            if(strlen(args1))            printf("%s.....",args1);            else            break;            */     }     va_end(args);     printf("\n");     return 0; } int main() {     print("aaaaa", "22222", "333333", NULL);     //print("bbbbb", "44444", "5555555", "666666");     return 0; } 供参考～  缺少结束标识 有没有办法在有调用时，不用输入结束符呢。

主函数：int main() { 	 print("aaaaa", "22222", "333333","");//长度为0的字符串 	 print("bbbbb", "44444", "5555555", "666666",""); 	 return 0; }


Question: 蓝桥杯c++练习系统提交总是显示运行错误

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

用一维数组就可以，要点在于杨辉三角形是左右对称的，可以用第n层的前半部分计算出第n+1层的后半部分，再逆序复制到前半部分就完成了:  #include <stdio.h>  int main() {   for (int n; ~scanf("%d", &n) && n > 0 && n < 35;)     for (int i = 1, j, m[35] = {0, 1}; i <= n; i++)     {       for (j = i; j > i / 2; j--) m[j] = m[i - j] + m[i - j + 1];       for (j = 2; j <= i / 2; j++) m[j] = m[i - j + 1];       for (j = 1; j <= i; j++) printf("%d ", m[j]);       puts("");     }    return 0; }

//杨辉三角 #include <iostream> using namespace std;   int main() {     int n, **p;     cin >> n;     if(n<1) return 0;     if(n>34) n = 34;     p = new int* [n];     for(int i=0; i<n; i++){         p[i] = new int[2*n];    //二维数组申请完毕     }     for(int i=0; i<n; i++){         p[i][0] = 1;         p[i][i] = 1;     }     for(int i=2; i<n; i++){         for(int j=1; j<i; j++){             p[i][j] = p[i-1][j-1] + p[i-1][j];         }     }     //for(int i=0; i<=n; i++){  //越界 i < n     for(int i=0; i<n; i++){         for(int j=0; j<=i; j++){             cout << p[i][j]<<" ";         }         cout << endl;     }      for (int i = 0; i < n; i++)         delete p[i];     delete p;     return 0; } 供参考～  问题是越界访问了。详见上面的代码；另外，建议加上释放delete空间的操作～

修改如下，供参考：//杨辉三角 #include <iostream> using namespace std;  int main() { 	int n, **p; 	cin >> n; 	if(n<1) return 0; 	if(n>34) n = 34; 	p = new int* [n]; 	for(int i=0; i<n; i++){ 		p[i] = new int[2*n];    //二维数组申请完毕 	} 	for(int i=0; i<n; i++){ 		p[i][0] = 1; 		p[i][i] = 1; 	} 	for(int i=2; i<n; i++){ 		for(int j=1; j<i; j++){ 			p[i][j] = p[i-1][j-1] + p[i-1][j]; 		} 	} 	for(int i=0; i<n; i++){   //for(int i=0; i<=n; i++){ 这句错误，数组越界 		for(int j=0; j<=i; j++){ 			cout << p[i][j]<<" "; 		} 		cout << endl; 	} 	return 0; }  //10 //1 //1 1 //1 2 1 //1 3 3 1 //1 4 6 4 1 //1 5 10 10 5 1 //1 6 15 20 15 6 1 //1 7 21 35 35 21 7 1 //1 8 28 56 70 56 28 8 1 //1 9 36 84 126 126 84 36 9 1 //请按任意键继续. . .


Question: 关于gets()函数的返回值

供参考： //百度百科对fgets函数的解释 //fgtes函数原型是:char *fgets(char *buf, int bufsize, FILE *stream); //从文件结构体指针stream中读取数据，每次读取一行。读取的数据保存在buf指向的字符数组中， //每次最多读取bufsize-1个字符（第bufsize个字符赋'\0'），如果文件中的该行，不足bufsize个字符， //则读完该行就结束。如若该行（包括最后一个换行符）的字符数超过bufsize-1，则fgets只返回一个 //不完整的行，但是，缓冲区总是以NULL字符结尾，对fgets的下一次调用会继续读该行。函数成功将返回buf， //失败或读到文件结尾返回NULL。因此我们不能直接通过fgets的返回值来判断函数是否是出错而终止的，应该 //借助feof函数或者ferror函数来判断。  //参考：https://my.oschina.net/u/3979769/blog/2208662 //下面这种用法，是安全的判断文件读取结束或者出错的好方式，切忌不能使用while(!feof(fp))， //还有对于fgets的第二个参数是最大能读取文件字符的个数，一般最大的长度是1024字节。 //while(fgets(..., stream)){          /* ... */ //}  //if(ferror(stream)){          /* ... */ //}  //stream：文件指针，如果读键盘输入的字符串，固定写为stdin //（1）如果键盘输入的字符个数少于bufsize-1个，函数会将回车录走，输出是将回车打印出来； //（2）如果键盘输入的字符大于bufsize-1个，函数录走bufsize-1个字符后，剩下的字符留在数据缓冲区，下次 //直接读取缓冲区内容，不会等键盘输入而跳过输入，导致输入失败。  //返回值 //1.成功，则返回第一个参数buf； //2.在读字符时遇到eof，则eof指示器被设置，如果还没读入任何字符就遇到这种情况，则buf保持原来的内容，返回NULL； //3.如果发生读入错误，error指示器被设置，返回NULL，buf的值可能被改变。  //如何处理掉换行符？ //遍历字符串，遇到换行符，并将其替换成空字符。遇到空字符，就丢弃输入行剩余的字符。  //为什么要丢弃过长输入行中的余下字符？ //输入行中多出来的字符会被留在缓冲区中，成为下一次读取语句的输入。  //读取整行输入并用空字符代替换行符，或者读取部分输入，并丢弃其余部分 char * s_gets(char *st,int n) { 	char *ret_val; 	int i=0; 	ret_val = fgets(st,n,stdin); 	if(ret_val!=NULL) 	{ 		while(st[i]!='\n' && st[i]!='\0') 			i++;  		if(st[i]=='\n') 			st[i]='\0'; 		else 			while(getchar()!='\n') 				continue; 	} 	return ret_val; }

fgets() returns s on success, and NULL on error or when end of file occurs while no characters have been read.  输入EOF就可以返回NULL，输入EOF的方式请详见楼上的回复！

windows <enter> <ctrl+z> <enter>  linux <ctrl+d>


Question: 大一学生，学c语言，这个题我。。。

#include<stdio.h>void pai(int a[],int n);int main(){	int a[1000],b[1000],yin;	int c[500];	int m;	scanf("%d",&m);	for(int j=0;j<m;j++)	{		int n,i;		scanf("%d",&n);		for(i=0;i<n;i++)		{			scanf("%d",&a[i]);		}		for(i=0;i<n;i++)		{			scanf("%d",&b[i]);		}		pai(a,n);  		pai(b,n);		int fast1=0,slow1=n-1,fast2=0,slow2=n-1;		int win=0,lose=0;		for(i=0;i<n;i++)      		{			if(a[fast1]>b[fast2])    			{				win++;				fast1++;				fast2++;			}			else if(a[slow1]>b[slow2])  			{				win++;				slow1--;				slow2--;			}			else			{				if(a[slow1]<b[fast2])				{					lose++;					slow1--;					fast2++;				}			}		yin=(win-lose)*200;	}	c[j]=yin;}    for(int k=0;k<m;k++)    {    	printf("%d\n",c[k]);	}	return 0;}void pai(int a[],int n){	int i,j,temp;	for(i=0;i<n-1;i++)	{		for(j=i+1;j<n;j++)		{			if(a[j]>a[i])			{				temp=a[j];				a[j]=a[i];				a[i]=temp;			}		}	}}嗯 写对了

这题可以用贪心算法来，首先我们只要尽可能多让田忌的马比齐王的马快， 同时要保证刚刚好田忌的马比齐王的马快，同时要保证这匹马是田忌所有比齐王快的马中的速度最小的那匹马， 所以我们可以先给齐王和田忌的马都由小到大排好序，将田忌的马的速度遍历，如果田忌马比齐王马快，记好这匹马，然后 双方的马同时后移就好。

对比2个数据都大于即可


Question: 请问显示insert为找不到标识符是什么情况

#include<stdio.h> #include<malloc.h> #define MAX_SIZE 10 typedef struct {     int* data;     int length;     int Maxsize; }SqeList;  void Insert(SqeList& L);  int main() {     SqeList L;     Insert(L);     return 0; } void Insert(SqeList& L) {     L.data = (int*)malloc(MAX_SIZE * sizeof(int));     L.length = 0;     //L.Maxsize = 10;     L.Maxsize = MAX_SIZE; } 供参考～

调用的函数在main函数之后的话需要声明，之前则不用

函数声明要在前，修改如下，供参考：#include<stdio.h> #include<malloc.h> #define a 10 typedef struct {    int* data;    int length;    int Maxsize; }SqeList;  void Insert(SqeList& L);//函数声明在前  int main() {    SqeList L;    Insert(L);//调用在后    return 0; }  void Insert(SqeList& L) {    L.data = (int*)malloc(a * sizeof(int));    L.length = 0;    L.Maxsize = 10; }

函数写在主函数之后，都必须先生命函数原型。


Question: 主函数中的代码问题：字符输入超过4个就处于无限输入状态

谢谢大家，从一个简单的问题把以前学的C语言捡起来一些了

题主的问题给的条件不是很完整，下面我会假设题主的问题在进行解答: 1.这个程序的目的应该是输入一个数字N作为字符长度。 2.之后通过for循环让数组A接受字符。  先讲程序出现的第一个问题 char A[]={'\0'}; 这样定义的数组会根据字符的长度来分配数组长度 所以该段代码相当于 char A[0] = '\0';    (因为'\0' 长度为1) 要实现上面的代码应该给数组分配足够的空间   设置char A[255] = {0}  或者 使用new(这个可以分配任意空间)   就不会出现上面问题。  最后讲讲程序为什么会出现 ’ 输入超过4个就处于无限输入状态 ‘    的问题   编译器会根据变量的顺序来分配空间 所以变量在内存中的形式大概是 A     00 00 00 00   (char类型  4字节    这里虽然为char类型但编译器还是会分配4个字节  ，这个不做深究)  N    00 00 00 00    (int 类型  4字节) i      00 00 00 00    (int 类型  4字节)  讲这个的目的是让你知道，&A[4]  取第5个字节时 实际上是对应N的空间  会改变N的大小 (可以调试或者printf  打印N看看) 所以会导致无限循环，。。。

楼主，数组A只有1个字符的长度，当你输入N>1的时候，数组就越界了，那个>1空间的内容就不可控了，碰运气了。修改如下，供参考：#include<stdio.h> int main() {    int i,N;    char *A;    //char A[]={'\0'}; //这句定义的只是一个字符长度    printf("请输入字符的数量：\n");    scanf("%d",&N);    getchar();    A = new char[N];//动态字符数组    printf("请输入:\n");    for(i=0;i<N;i++)     {       scanf("%c",&A[i]);       printf("A[%d]=%c\n",i,A[i]);//输出 看看是否正确     }    printf("输入完成\n");    delete []A;    return 0; }  //请输入字符的数量： //15 //请输入: //Happy New Year! //A[0]=H //A[1]=a //A[2]=p //A[3]=p //A[4]=y //A[5]= //A[6]=N //A[7]=e //A[8]=w //A[9]= //A[10]=Y //A[11]=e //A[12]=a //A[13]=r //A[14]=! //输入完成 //请按任意键继续. . .

一个简单道理：没被发现错误不等于没有错误。

打一个稍有冒犯但是恰当的比方： 你要是偷了3次东西还没被抓住，你是否认为那是因为3小于等于4呢？

引用 1 楼 user-3的回复:从错误出发得到正确的概率无穷小，得到错误就很正常了。 数组A只有1个字符的长度，所以错了。 但是输入的字符数小于等于4个就可以


Question: 求指导

引用 1 楼 user-3的回复:你这个照片上的干涉条纹看得我脑壳疼，就不能复制文本发上来吗？  问题大概出在i++上面，因为#define是直接替换的，所以第二张图里的SQ(i++)会被替换成(i++)*(i++), 就多加了一次。 对不起  下次就直接复制粘贴

//调用函数时： //1   i=1 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 1*1 =`1,i(i++) = 2; //4   i=2 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 2*2 = 4,i(i++) = 3; //9   i=3 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 3*3 = 9,i(i++) = 4; //16  i=4 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 4*4 =16,i(i++) = 5; //25  i=5 -> while(i<=5) -> printf("SQ=%d\n",SQ(i++)); 5*5 =25,i(i++) = 6; //请按任意键继续. . .

供参考：//带参数的宏定义和函数之间有一定类似之处，但本质上有区别: //1.函数调用时，先求出实参表达式的值，然后代入形参，而使用带参数的宏只是进行字符替换。 //2.函数调用是在程序运行时处理的，为形参分配临时的内存单元。而宏置换则是在预处理阶段进行的，在置换时并不分配内存单元， //不进行值的传递处理，也没有“返回值”的概念。 //3.对函数中的实参和形参都要定义类型，二者的类型要求一致，如不一致，应进行类型转换。而宏不存在类型问题，宏名无类型， //它的参数也无类型，只是一个符号代表，置换时，代入指定的字符串即可。定义宏时，字符串可以是任何类型的数据。 //4.调用函数只可得到一个返回值，而用宏可以设法得到几个结果。 //5.使用宏次数多时，宏展开后源程序变长，因为每展开一次都使程序增长，而函数调用不会使源程序变长。 //6.宏替换不占运行时间，只占预处理时间。而函数调用则占运行时间(分配单元、保留现场、值传递、返回)。  #include<stdio.h> #define SQ(y) ((y)*(y))  //带参数的宏定义:带参数的宏定义不是进行简单的字符串替换，还要进行参数替换 //#define  S(r)  PI*r*r //area=S(a+b);  → area=PI * a+b * a+b; //#define  S(r)  PI*(r)*(r) //area=S(a+b);  → area=PI*(a+b)*(a+b);  int main() {     int i=1;     while(i<=5){         printf("%d\n",SQ(i++));         //这句替换为:         //printf("%d\n",((i++)*(i++)));     }     return 0; }  //2      i=1 -> while(i<=5) -> printf("%d\n",((i++)*(i++))); 1 * (i++)2 =2,  i(i++)=3; //12     i=3 -> while(i<=5) -> printf("%d\n",((i++)*(i++))); 3 * (i++)4 =12, i(i++)=5; //30     i=5 -> while(i<=5) -> printf("%d\n",((i++)*(i++))); 5 * (i++)6 =30, i(i++)=6; //请按任意键继续. . .


Question: C语言中的match函数在哪个头文件里？

新手路过学习。

Match函数是Excel中使用较为广泛的一个函数。其主要作用是：在“范围”单元格中搜索特定的项，然后返回该项在此区域中的相对位置。 通俗的将：MATCH函数返回指定值在数组中的位置，如果在数组中没有找到该值则返回…

baidu c++ 正则表达式

这个需要自己

引用 1 楼 智者知已应修善业的回复:math.h一般见于C、C++程序设计，#include <math.h> 是包含math头文件的意思， .h是头文件的扩展名（header file），这一句声明了本程序要用到标准库中的 math.h文件。math.h头文件中声明了常用的一些数学运算，比如乘方，开方运算等等。 我要的是match

C语言没有这个函数 好了 下一题


Question: 求助，C中怎么把字符串用其ASCII hex形式打印出来

引用 4 楼 qzjhjxj 的回复：综合上面1# 2# 3# 楼的，供参考：//C中怎么把字符串用其ASCII hex形式打印出来  //比如char string[]=“{Temeprature=25.61,Humidity=15.62}”，用printf("%02X",string)输出出来是407A40， //其一，输出不完全，其二并不是{Temeprature=25.61,Humidity=15.62}的ASCII hex形式，{Temeprature=25.61,Humidity=15.62} //全部按ASCII hex转换应该是0x7b 0x54 0x65 0x6d 0x65 0x70 0x72 0x61 0x74 0x75 0x72 0x65 0x3d 0x32 0x35 0x2e 0x36 0x31 // 0x2c 0x48 0x75 0x6d 0x69 0x64 0x69 0x74 0x79 0x31 0x35 0x2e 0x36 0x32 0x7d， //目前在网上找到的历例程，对于{}、，，.这样的符号都没法转换，请问各位有能将字符串以其hex形式打印出来的例程吗？谢谢  #include <stdio.h> #include <string.h>  int main() {    char  string[]="{Temeprature=25.61,Humidity=15.62}";    char *p=string;    while(*p)printf("0x%02x ",*p++);//指针    printf("\n");    for(int len=0;len <sizeof(string); len++)//string 是数组，要传值使用string[下标]。      {        printf("0x%02X ",string[len]);      }    return 0; }  //输出： //0x7b 0x54 0x65 0x6d 0x65 0x70 0x72 0x61 0x74 0x75 0x72 0x65 0x3d 0x32 0x35 0x2e 0x36 0x31 0x2c 0x48 0x75 0x6d 0x69 0x64 0x69 0x74 0x79 0x3d 0x31 0x35 0x2e 0x36 0x32 0x7d //0x7B 0x54 0x65 0x6D 0x65 0x70 0x72 0x61 0x74 0x75 0x72 0x65 0x3D 0x32 0x35 0x2E 0x36 0x31 0x2C 0x48 0x75 0x6D 0x69 0x64 0x69 0x74 0x79 0x3D 0x31 0x35 0x2E 0x36 0x32 0x7D 0x00 请按任意键继续. . .非常感谢您。

引用 3 楼 突触 的回复：你基础不是很牢。。  string 是数组，如果不带下标作为参数时，类似于指针    传递的是元素的首地址。 要传值使用string[下标]。  在讲讲printf     里面的 "%02X"       "%s"         "%d"     分别会把参数以不同的形式读取(作为指针，或直接是数据)    其中"%02X" ，"%d" 是数据形式读取， "%s" 是作为指针形式。   要实现的话可能就需要循环。 改正:  	char string[]= "{Temeprature=25.61,Humidity=15.62}"; 		 	for(int len=0;len <sizeof(string); len++) 	{ 		printf("0x%02X ",string[len]); 	}非常感谢。在下确实刚刚接触编程

循环一个一个字符地打印


Question: 为什么我这代码还是超时

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

学习学习，C没碰过、、

如此说来这就是水题，卡I/O时间而已，C用getline/gets应该也可以过：  #include <stdio.h>  char buf[1048576]; int i, j, n[4] = {0};  int main() {   gets(buf);   for (i = 0; buf[i];) n[buf[i++] & 3]++;   for (i = 1, j = 0; i <= 4; i++) while(n[i & 3]--) buf[j++] = i + 96;   puts(buf);    return 0; }

也就是说像我在17，18楼说的那样， 17 开大缓冲区，整行一次输入即可。 18 系统不会鉴定什么O，都是逗你玩的。

学习一下，问题应该出现在排序算法上

试试这个能不能过#include <stdio.h> #include <stdlib.h>  int cmp(const void *a, const void *b) {     return *(char *)a - *(char *)b; }  int main() {    char ch[1024];    gets(ch);    qsort(ch,strlen(ch),sizeof(char),cmp);    puts(ch);       return 0; }  //abaaccbdbdbdabbabcbcabdcabdcbadbcabdcbadbcbadbcabdcabaaccbdbdbdabbabcbcabdcabdcbadbcabdcbadbcbadbcabdc //aaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccdddddddddddddddddddd //请按任意键继续. .

引用 26 楼 m0_55067373 的回复:[quote=引用 22 楼 Chivas_/Regal 的回复:]#include<bits/stdc++.h> using namespace std; int main () {     string s;     cin>>s;     sort(s.begin(),s.end());     cout<<s; }  过了，我看到学校其他成功通过的都是用的c++,c语言提交的都失败了[/quote] 其实如果用一下快排流程的话也可以用C过，我这个sort就是为了方便也懒得打快排了。。。。。

引用 22 楼 Chivas_/Regal 的回复:#include<bits/stdc++.h> using namespace std; int main () {     string s;     cin>>s;     sort(s.begin(),s.end());     cout<<s; }  过了，我看到学校其他成功通过的都是用的c++,c语言提交的都失败了

unistd.h time(nullptr)现在时间，结束时-开始时，算下时间有帮助

两下时间。。

sort的时间复杂度是O(n*logn)

test: 'abaaccbdbdbdabbabcbcabdcabdcbadbcabdcbadbcbadbcabdc'.split('').sort((a, b) => a.charCodeAt(0)-b.charCodeAt(0)).join('') res: "aaaaaaaaaaaabbbbbbbbbbbbbbbbbbcccccccccccdddddddddd"

算法的问题了

至于O(n)还是O(1)的，我不认为一个OJ真的能识别得出来，何况大O本来就是个模糊概念。

还有两种可能。 一是行长度确有上限，可以一次一行弄进来在内存里分析，比一次又一次输入快得多。 二是系统输入不止一行却不肯明说，我们处理一行就歇了，当然会超时。

那就是算法的问题了，必须找到更高效的算法

引用 14 楼 早打大打打核战争 的回复:再简化一些：  #include <stdio.h>  int main() {   int n[4] = {0};    for (char c; (c = getchar()) != 10;) n[c & 3]++;   for (int i = 1; i <= 4; i++) while(n[i & 3]--) putchar(i + 96);   puts("");    return 0; }   还是超时。。。


Question: 求助，结构体写入出现了错误

还有，不能那样初始化FileData，还是老老实实strcpy吧。 说到这里，应该通不过编译才对，谈何运行啊，费解。

补充： 形参里引用字符串都不规范，字符串形参char*类型就可以了，后面的方括号都去掉。 另外对形参字符串sizeof没啥用，还是strlen+1吧。  读文件的函数里居然先读一个字符，然后再读结构体。啃过一口的苹果还拿来卖，你是乔布斯啊？ 读字符和读结构体之间需要rewind或者fseek回去才行。  主函数里的 scanf_s("%s",FileName,29);

代码太长，大概溜了一眼。 首先，MagicNumber[4]的长度为4，FDW1={“SOT\n” 这样的方式赋值造成数组越界（字符串多个\0字符）； 其次，二进制写入文件，文件内容都是二进制，本来就看不到“嘿嘿嘿，测试运行”这样的字符串 第三，FDR1.MagicNumber != “SOT\n” 这样的比较是错的（这是地址比较），字符串比较要用strcmp。

"嘿嘿嘿，测试运行'，这句话不知道为什么没有被写入


Question: 链栈问题

p = S; free(p); 不就是free(S)了么

#include <stdio.h> #include <stdlib.h> #include <stdbool.h>  //#define Stack_ElemType int typedef  int Stack_ElemType;// int typedef struct StackNode {     struct StackNode* next;     Stack_ElemType data; }StackNode,*LinkStack;  //链栈初始化 // 返回的是链栈的首地址 //StackNode* initStack(LinkStack S) { StackNode* initStack(LinkStack *S) {     *S = (LinkStack)malloc(sizeof(StackNode));     if (*S == NULL) {         printf("内存分配不成功！\n");         return 0;     }//;     (*S)->next = NULL;     return *S; } //; //创建链栈 StackNode* CreatStack(LinkStack S) {     StackNode* p;     int j = 1;     Stack_ElemType t = 0;     while (j) {         printf("请输入栈顶元素,输入-1时结束创建\n ");         //scanf_s("%d", &t);         scanf("%d", &t);         if (t == -1) {             break;         }         p = (LinkStack)malloc(sizeof(StackNode));         if (p == NULL) {  // 动态分配空间后要进行判断否则会有警告             printf("内存分配不成功！\n");             //return 0;             return S;         }//;         p->data = t;         p->next = S;         S = p;     }//;      return S; } // 链栈的压栈 void pushStack(LinkStack &S, Stack_ElemType e) {     StackNode* p;     p = (LinkStack)malloc(sizeof(StackNode));     if (p == NULL) {  // 动态分配空间后要进行判断否则会有警告         printf("内存分配不成功！\n");         return;     }     p->data = e;     p->next = S;     printf("%d\n", p->data);     S = p;// 现在栈顶为刚压栈的p的结点  }; StackNode* popStack(LinkStack S, Stack_ElemType* e) {     StackNode *p;     if (S == NULL) {         //return 0;         return NULL;     }     *e = S->data;     p = S;     S = S->next;     free(p);     return S; }//;  Stack_ElemType StackLenth(StackNode S) {     int i = 1;     StackNode* p;     p = S.next;     while (p) {         p = p->next;         i++;     }//;     return i; }  int main(void) {     StackNode* S;     S = NULL;     Stack_ElemType j = 0;     S = initStack(&S);     S = CreatStack(S);      //for (int i = 0; i < 5; i++) {     for (int i = 0; S; i++) {         S = popStack(S, &j);         if (S)             printf("%d\n", j);     }//;     S = popStack(S, &j);     if (S)         printf("%d\n", j);     return 0; }   供参考～  多处出现了多余的分号;其他问题，供参考～


Question: 结构体里的动态数组输入问题

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

引用 8 楼 真相重于对错的回复:initlist里面的 num是main里面的副本，在那个函数里的任何操作对于main 里面的num无效 嗯嗯，我把这个给忘记了。谢谢谢谢谢谢~

引用 7 楼 qzjhjxj的回复:[quote=引用 4 楼 weixin_53443263 的回复:][quote=引用 3 楼 qzjhjxj的回复:]修改如下，供参考：#include <stdio.h> #include <stdlib.h> #define max_size 100 typedef struct {     int length;     int *arr; }sqlist;  int initlist_sq(sqlist &num) //int initlist_sq(sqlist num) {     num.arr=(int*)malloc(sizeof(int)*(max_size));     if(!num.arr)        exit(EXIT_FAILURE);     num.length=0;     return 0; }  int main() {     sqlist num;     int i,n,flag;     flag=initlist_sq(num);     if(flag) printf("allocation failed\n");     else     printf("successful\n");      scanf("%d",&num.length);     for(i=0;i<num.length;i++)         scanf("%d",&num.arr[i]);          return 0;  } 你就只是加了个&吧。加了之后连编译都不通过了，而且我们定义的num也不是指向结构体的指针变量吧。[/quote] 我这里是运行通过的，没出现你说的编译问题： 这个初始化int initlist_sq(sqlist num)函数里的num和main()函数里的num是两个不同内存空间，不通过地址让他们产生联系，光值没用啊。[/quote] 我刚刚查了一下，发现你这个参数列表中加的取地址运算符是C++语法的，我这个是C语言的，所以没法直接，我刚刚换成指针就成功了。真心感谢你！

引用 4 楼 weixin_53443263 的回复:[quote=引用 3 楼 qzjhjxj的回复:]修改如下，供参考：#include <stdio.h> #include <stdlib.h> #define max_size 100 typedef struct {     int length;     int *arr; }sqlist;  int initlist_sq(sqlist &num) //int initlist_sq(sqlist num) {     num.arr=(int*)malloc(sizeof(int)*(max_size));     if(!num.arr)        exit(EXIT_FAILURE);     num.length=0;     return 0; }  int main() {     sqlist num;     int i,n,flag;     flag=initlist_sq(num);     if(flag) printf("allocation failed\n");     else     printf("successful\n");      scanf("%d",&num.length);     for(i=0;i<num.length;i++)         scanf("%d",&num.arr[i]);          return 0;  } 你就只是加了个&吧。加了之后连编译都不通过了，而且我们定义的num也不是指向结构体的指针变量吧。[/quote] 我这里是运行通过的，没出现你说的编译问题： 这个初始化int initlist_sq(sqlist num)函数里的num和main()函数里的num是两个不同内存空间，不通过地址让他们产生联系，光值没用啊。

引用 1 楼 真相重于对错的回复:你的这个内存泄露了 我去网上查了一下内存泄露是指我没用free，不过现在这个不是输入不了的原因吧

引用 2 楼 user-4的回复:没问题，就等着你输入 ，多按几次回车 不行的，到那里就直接跳出了

引用 3 楼 qzjhjxj的回复:修改如下，供参考：#include <stdio.h> #include <stdlib.h> #define max_size 100 typedef struct {     int length;     int *arr; }sqlist;  int initlist_sq(sqlist &num) //int initlist_sq(sqlist num) {     num.arr=(int*)malloc(sizeof(int)*(max_size));     if(!num.arr)        exit(EXIT_FAILURE);     num.length=0;     return 0; }  int main() {     sqlist num;     int i,n,flag;     flag=initlist_sq(num);     if(flag) printf("allocation failed\n");     else     printf("successful\n");      scanf("%d",&num.length);     for(i=0;i<num.length;i++)         scanf("%d",&num.arr[i]);          return 0;  } 你就只是加了个&吧。加了之后连编译都不通过了，而且我们定义的num也不是指向结构体的指针变量吧。

没问题，就等着你输入 ，多按几次回车

你的这个内存泄露了


Question: 求一元二次方程的根

引用 楼主 是疗伤烧肉粽~的回复:本题目要求一元二次方程ax^2＋bx＋c＝0的根，结果保留2位小数。 输入格式: 输入在一行中给出3个浮点系数a、b、c，中间用空格分开。 输出格式: 根据系数情况，输出不同结果： 1)如果方程有两个不相等的实数根，则每行输出一个根，先大后小； 2)如果方程有两个不相等复数根，则每行按照格式“实部+虚部i”输出一个根，先输出虚部为正的，后输出虚部为负的； 3)如果方程只有一个根，则直接输出此根； 4)如果系数都为0，则输出"Zero Equation"； 5)如果a和b为0，c不为0，则输出"Not An Equation"。 #include<stdio.h> #include<math.h> int main(){     double a,b,c,da,s,t;     scanf("%lf%lf%lf",&a,&b,&c);     da=b*b-4*a*c;     if(a==0&&b==0&&c==0)     	printf("Zero Equation");	     else if(a==0&&b==0&&c!=0)     	printf("Not An Equation");     else if(da==0)     	printf("%.2lf",-b/2/a);	     else if(a==0)     	printf("%.2lf",-c/b); 	else if(da>0)     	printf("%.2lf\n%.2lf",(-b+sqrt(da))/2/a,(-b-sqrt(da))/2/a);	     else if(da<0){             	s=-b/(2*a);      	    t=sqrt(-da)/(2*a);       	printf("%.2lf+%.2lfi\n%.2lf-%.2lfi",s,t,s,t); 	} } 在PTA上有一个测试点(方程有纯虚根)没过，帮忙看看要怎么改 你好，我是一名c语言初学者。我想问一下，你提到的PTA是什么？是一个学习网站吗？还是什么？上面能做题？

新手飘过学习，读代码，脑袋都大了。

system (“pause “)暂停的意思，方便我们看清结果，这句前面加//可以屏蔽了。 0.0前面的格式是.2lf ，是浮点型啊，0是整型。

详细解析请参考公众号推文  #include <stdio.h> #include <stdlib.h> #include <math.h>    int main() { double a,b,c,d; printf("输入方程的系数a,b,c："); scanf("%lf%lf%lf",&a,&b,&c);  if(0==a) {  if(0==b) {   if(0!=c) {         printf("不能构成等式\n");   } else {          printf("这是恒等式0=0\n");   }  } else {       printf("这是一元一次方程，根为：%lf\n",-c/b);  } } else {         d=b*b-4*a*c;//判别式  if(0==d) {       printf("两个相等的根，x1=x2=%lf\n",-b/(2*a));  } else if(d>0) {   printf("两个不相等的根，x1=%lf, x2=%lf\n",(-b+sqrt(d))/(2*a),(-b-sqrt(d))/(2*a));  } else {   printf("两个虚根,x1=%lf+%lfi,x2=%lf-%lfi\n",-b/(2*a),sqrt(-d)/(2*a),-b/(2*a),sqrt(-d)/(2*a));  } }   system("pause"); return 0; }

引用 1 楼 user-5 的回复:当da小于0时，如果b = 0，方程实部为零，所有只用显式虚部就行了。  else if(da<0){                 if (b != 0) 		{ 			s=-b/(2*a);              	t=sqrt(-da)/(2*a);           	printf("%.2lf+%.2lfi\n%.2lf-%.2lfi",s,t,s,t);     	}     	else     	{     		t = sqrt(c/a);     		printf("%.2lfi\n-%.2lfi",t,t); 		}     } 不对啊，还是过不了

引用 3 楼 qzjhjxj 的回复:供参考：#include<stdio.h> #include<math.h> int main() {         double a,b,c,da;         scanf("%lf %lf %lf",&a,&b,&c);         da = b*b-4*a*c;         if(a!=0){            if(da>0){              printf("%.2lf\n",(-b+sqrt(da))/(a*2));              printf("%.2lf\n",(-b-sqrt(da))/(a*2));            }            else if(da < 0){                    if(b!=0){                       printf("%.2lf%+.2lfi\n",(-b)*1.0/(2*a),sqrt(-da)/(2*a));                       printf("%.2lf%+.2lfi\n",(-b)*1.0/(2*a),-sqrt(-da)/(2*a));                    }else{                       printf("%.2lf%+.2lfi\n",0.0,sqrt(-da)*1.0/(2*a));                       printf("%.2lf%+.2lfi\n",0.0,-sqrt(-da)*1.0/(2*a));                    }            }            else{                    printf("%.2lf\n",-b*1.0/(2*a));            }         }         else if(a==0&&b==0&&c==0){                 printf("Zero Equation\n");         }         else if(a==0&&b==0&&c!=0){                 printf("Not An Equation\n");         }         else if(a==0&&b!=0&&c!=0)                 printf("%.2lf\n",(-c*1.0)/b);         system("pause");         return 0; } printf("%.2lf%+.2lfi\n",0.0,sqrt(-da)*1.0/(2*a)); printf("%.2lf%+.2lfi\n",0.0,-sqrt(-da)*1.0/(2*a)); 为什么这里是0.0才可以，而0不行？？

引用 3 楼 qzjhjxj 的回复:供参考：#include<stdio.h> #include<math.h> int main() {         double a,b,c,da;         scanf("%lf %lf %lf",&a,&b,&c);         da = b*b-4*a*c;         if(a!=0){            if(da>0){              printf("%.2lf\n",(-b+sqrt(da))/(a*2));              printf("%.2lf\n",(-b-sqrt(da))/(a*2));            }            else if(da < 0){                    if(b!=0){                       printf("%.2lf%+.2lfi\n",(-b)*1.0/(2*a),sqrt(-da)/(2*a));                       printf("%.2lf%+.2lfi\n",(-b)*1.0/(2*a),-sqrt(-da)/(2*a));                    }else{                       printf("%.2lf%+.2lfi\n",0.0,sqrt(-da)*1.0/(2*a));                       printf("%.2lf%+.2lfi\n",0.0,-sqrt(-da)*1.0/(2*a));                    }            }            else{                    printf("%.2lf\n",-b*1.0/(2*a));            }         }         else if(a==0&&b==0&&c==0){                 printf("Zero Equation\n");         }         else if(a==0&&b==0&&c!=0){                 printf("Not An Equation\n");         }         else if(a==0&&b!=0&&c!=0)                 printf("%.2lf\n",(-c*1.0)/b);         system("pause");         return 0; } system("pause");这句啥意思？？


Question: 小白请教！！关于二叉树的建立问题（Run-Time Check Failure #2 - Stack around the variable 'tre）

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

懂了是我在对树结点的线索进行初始化的时候，传的是一个一级指针的地址，而函数的接收同样是一个一级指针导致出错！


Question: 单片机89c52  C语言编写秒表遇到K2暂停键时不时失效，求大佬看下代码有什么问题

如果概率比较高，在前后加个打印调试下看看

按代码的逻辑看，按键受影响的有2处，主函数和中断，所以有可能在极短时间内调用了2次，所以会产生是不是地现象，因此，需要处理好这2处的逻辑关系。

当然也可能短了，对于主函数中调用来说，同时中断可以影响主函数调用，因此，现象就是时不时地受到影响的结果。

难道不需要消抖么？


Question: VS Code debug模式无法找到 对应的exe，但是 路径下面是有已编出来的二进制文件。具体配置如下。


Question: fgets函数使用

感谢😀😀😀😀

引用 1 楼 user-4的回复:fgets不会返回EOF，因为这个函数是char *类型。 当出错或遇到文件结束，它返回NULL。 感谢感谢😀😀😀😀

引用 2 楼 qybao的回复:fgets的返回值是char* 所以 != EOF 改为 != NULL 谢谢啦😀😀😀😀

fgets的返回值是char* 所以 != EOF 改为 != NULL


Question: oj题目，为什么ac不过

供参考：#include<stdio.h> #define MAX 1000//最大输入个数  int bubbleSort(int *A,int len)//排序 {    int i,j,t;    for(i = 0;i < len-1;i++)    {       for(j = 0;j < len-i-1;j++)       {          if(A[j] > A[j+1])          {             t = A[j+1];             A[j+1] = A[j];             A[j] = t;          }       }    } }  int bingji(int *A,int *B,int lenA,int lenB)//并集 {    int i,j;    int flag,index = lenB;    int *buffer = (int *)malloc(sizeof(int) * (lenA+lenB));    for(i = 0;i< lenA+lenB;i++)//初始化buffer空间。    {       buffer[i] = -1;    }    for(i = 0;i < lenB;i++)    {       buffer[i] = B[i];    }    for(i = 0;i < lenA;i++)    {       flag = 1;       for(j = 0;j < lenB;j++)       {          if(A[i] == B[j])          {             flag = 0;          }       }       if(flag)       {          buffer[index] = A[i];          index++;       }    }    bubbleSort(buffer,lenA+lenB);//排序    for(i = 0;i < lenA+lenB;i++)    {       if(buffer[i] != -1)       printf("%d ",buffer[i]);    }    printf("\n");    free(buffer); }  int jiaoji(int *A,int *B,int lenA,int lenB)//交集 {    int i,j;    int flag,index = 0,len = lenA > lenB ? lenA:lenB;    int *buffer = (int *)malloc(sizeof(int) * len);    for(i = 0;i < lenA;i++)    {       flag = 0;       for(j = 0;j < lenB;j++)       {          if(A[i] == B[j])             flag = 1;       }       for(j = 0;j < index;j++)       {          if(A[i] == buffer[j])             flag = 0;       }       if(flag)       {          buffer[index] = A[i];          index++;       }    }    bubbleSort(buffer,index);//排序    for(i = 0;i< index;i++)       printf("%d ",buffer[i]);    printf("\n");    free(buffer); }  int yuji(int *A,int *B,int lenA,int lenB)//余集 {    int i,j;    int flag,index = 0;    int *buffer = (int *)malloc(sizeof(int) * lenA);    for(i = 0;i < lenA;i++)    {       flag = 1;       for(j = 0;j < lenB;j++)       {          if(A[i] == B[j])             flag = 0;       }       if(flag)       {          buffer[index] = A[i];          index++;       }    }    bubbleSort(buffer,index);//排序    for(i = 0;i < index;i++)       printf("%d ",buffer[i]);    printf("\n");    free(buffer); }  int main() {    int a[MAX],b[MAX];//集合    int i = 0,m = 0,n = 0;    scanf("%d",&n);    for(i = 0;i < n;i++)       scanf("%d",&a[i]);     scanf("%d",&m);    for(i = 0;i < m;i++)       scanf("%d",&b[i]);    printf("\n");     jiaoji(a,b,n,m);//交集    bingji(a,b,n,m);//并集    yuji(a,b,n,m);//余集        return 0; }

我是说题目本身自相矛盾，你怎么写代码有可能是白费力气。

引用 1 楼 user-3 的回复:样例输出与题目要求不符，pass 输出一致啊，不信你自己运行一下看看

样例输出与题目要求不符，pass


Question: 我想把文件里的内容读取出来并且存到结构体中，在写完第一个程序的时候，运行结果如第一个所示，第二个程序运行结果如第二个图所示，看起来是文件中的内容没能读取出来。

引用 4 楼 自信男孩的回复:程序2具有相同的问题，建议改一下～ 谢谢谢谢，已经改好了，非常感谢

程序2具有相同的问题，建议改一下～

#include<stdio.h> #include<string.h> #include<stdlib.h>  int main(void) {     FILE *fp;     fp=fopen("access.log","r+");     if(!fp){         printf("false");         return -1;    //直接返回     }     else{         printf("true");     }     char method[255];     char ip[255];     char protocol[255];     char time[255];     char add[255];     int port;     char page[255];     int status;     char exploer_info[255];     char key;     char value;      //while(port=getc(fp)!=EOF)     while((port=getc(fp))!=EOF)     {         putchar(port);         struct record         {             char method[255];             char ip[255];             char protocol[255];             char time[255];             char add[255];             char port;             char page[255];             char status;             char exploer_info[255];             struct prams             {                 char key[255];                 char value[255];             };             char prams_cnt;         };         fgets(method,100,fp);     }     printf("%s",method);     int fclose(FILE *fp);     return 0; } 程序1有问题；详见注释掉的那句；

引用 1 楼 user-2的回复:你的代码很难受。。。首先所有变量没有初始化（尤其是数组），然后函数内部定义结构体很诡异。首先把基本的初始化搞好之后，才有必要检查逻辑。 好的，谢谢指点


Question: OJ上时间超限，请大佬帮看看

简化路灯状态反转操作，其他没看出毛病： while(q--)         {             scanf("%d %d %d %d",&x1,&y1,&x2,&y2);             for(i=x1;i<=x2;i++)             {                 for(j=y1;j<=y2;j++)                 {                     //if(a[i][j]==1)                     //    a[i][j]=0;                     //else if(a[i][j]==0)                     //    a[i][j]=1;                     a[i][j] = !a[i][j];  //取反                 }             }         }


Question: 正学C语言，想找一个编程软件，有好的推荐吗

vs2010，体积很小，，不错的选择

在用Dev-C++

Dev C++ 简洁好用

用了这么多，Vs2019社区版还是很棒的。如果是linux下，geany也很好

建议vs和dev都装上  vs有关键字补全，报错也比较高级  dev适合写一些短点的小程序，比较方便

我觉得vs不错。其他的没试过。

用vc2019吧，免费版，功能强大，调试方便

作为入门，我觉得CodeBlocks挺好用的。

Dev-C++ 是最容易上手的，而且是免费的

dev c++ vs2019这些都可以


Question: 学校的这道oj题为什么通过不了

#include <stdio.h> #include <math.h>  unsigned int get_odd_bit(unsigned int n, int bit_len); int main() { #if 0     unsigned int x,n;     int i,y;     char s[50];     scanf("%u",&x);     i=0;     while(x>0)     {         s[i++] = x%2 +'0';         x=x/2;     }     s[i]='\0';     puts(s);     y = i-1;     for(i=y;i>=0;i--) if((i+1)%2==0) s[i]='0';     puts(s);     for(i=y,n=0;i>=0;i--) n+=pow(2.0,y-i)*(s[i]-'0');     printf("%u\n",n); #else     unsigned int x;      scanf("%u", &x);      x = get_odd_bit(x, 32);      printf("%u\n", x); #endif     return 0; }   unsigned int get_odd_bit(unsigned int n, int bit_len) {     unsigned int s = 0;     int i;      for (i = 0; i < bit_len; i++) {         if (i % 2)             s += ((n >> i) & 1u) ? (1u << i) : 0;     }      return s; }  供参考 楼主的代码是没问题的，但是不符合题目要求。因为题目要求自定义函数实现，楼主把逻辑都写在main函数里。 建议楼主把自己的逻辑用一个自定义函数来实现试试。以上是自己用自定义函数来实现的，参考一下

需要这么复杂吗？ 用&运算就好了呀？二进制1010就是16进制a 所以 y = x & 0xaaaaaaaa 就可以了


Question: 初学C语言的小白求助各位大佬

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

代码楼上有，传送两个及以上的值就要用到指针

代码我就不发了，楼上的就可以了 我就只说说错误的地方吧 第一点：就是while上面那个scanf语句是多余的。 第二点：你调用的函数类型是void型，主函数的t,s,k不会随之发生改变，可以改为有返回型的函数或者用指针

这个问题的详细分析，请参考公众号推文 #include<stdio.h> void Temperature(double t,double *s, double *k); int main(void) { 	double t,s,k;  	printf("请输入华氏温度："); 	//scanf("%lf",&t); 	while(scanf("%lf",&t)==1) 	{ 		Temperature(t,&s,&k); 		printf("华氏温度:%.2f\n摄氏温度:%.2f\n开氏温度:%.2f",t,s,k); 	 }  	   printf("结束");    	return 0; } void Temperature(double t,double *s, double *k) { 	*s=5.0/9.0*(t-32.0); 	*k=*s+273.16; }

供参考：#include<stdio.h> float Temperature(float t);//void Temperature(float t); 空函数当然什么都不返回了 int main(void) {     float t;     printf("请输入华氏温度（小数为零不可省略）：");//scanf("%f",&t);     while(scanf("%f",&t)!=EOF){ //用 Ctrl + z 结束输入        printf("华氏温度:%.2f\n摄氏温度:%.2f\n开氏温度:%.2f",t,Temperature(t),Temperature(t)+273.16);     }     printf("结束");      return 0; }  float Temperature(float t)//void Temperature(float t) {    float s;//k;    s=5.0/9.0*(t-32.0);    //k=s+273.16; //函数只能返回一个值，所以返回摄氏温度值。    return s; }

#include<stdio.h> void Temperature(float t, float *s, float *k); int main(void) {     float t,s,k;      printf("请输入华氏温度（小数为零不可省略）：");     //scanf("%f",&t);   //去掉这次的输入，否则需要输入两次～     while(scanf("%f",&t)==1)   //这里还有一个scanf呢，用一个吧，建议保留这个～     {         Temperature(t, &s, &k);         printf("华氏温度:%.2f\n摄氏温度:%.2f\n开氏温度:%.2f",t,s,k);     }     printf("结束");      return 0; } void Temperature(float t, float *s, float *k) {     //float s,k;      *s=5.0/9.0*(t-32.0);     *k=*s+273.16; }  供参考～

while(scanf("%f",&t)==1)，你认为while（）中仅仅是一个判断吗，就像通常的判断一样if（xxx函数==0） return-1；xxx函数依然执行啊


Question: [求助！]关于coverity工具

if  （a>b）这样比较的是两个地址值，即那个地址大，那个地址小的问题。


Question: 萌新想问一下各位，这个C语言实现比较大小为什么不能实现呢

谢谢各位，解决问题了

if (a>b>c || a > c > a) 改成：  if ((a > b && b > c) || (a > c && c > a)) 另外一个if也这么改，试试～

a>b>c 编译器会按顺序进行表达式运算，a>b  成立就返回1  ，不成立就返回0。  之后返回的结果(1或0) 会与c比较   。所以这里跟我们的逻辑不一样。

由于运算法则的原因，关系运算不能连着写。 可以写成 a>b && a>c 这种形式。


Question: 为什么会出现写入访问权限冲突。 tail 是 nullptr？

引用 1 楼 user-2的回复:if (heado = NULL)             heado = ptr2;         else             tail->next = ptr2; 这里错了，应该为if (heado == NULL) 自己看了半个小时没看出来竟然犯了这么低级的错误，谢谢哈

struct ListNode* reverse(struct ListNode* head) {     struct ListNode* ptr1, * ptr2, * heado = NULL, * tail = NULL;     int a[100], index = 0;     for (ptr1 = head; ptr1 != NULL; ptr1 = ptr1->next)         a[index++] = ptr1->data;     for (int i = index - 1; i >= 0; i--)     {         ptr2 = (struct ListNode*)malloc(sizeof(struct ListNode));         ptr2->data = a[i];         ptr2->next = NULL;         //if (heado = NULL)         if (heado == NULL)             heado = ptr2;         else             tail->next = ptr2;         tail = ptr2;     }     return heado; } 供参考～  =不是比较==是比较


Question: #pragma 和interrupt

#pragma interrupt( )表示中断服务子程序

你需要看对应编译器的说明


Question: 求助，DEVC++运行不了这个程序

你是不是写成for(int i=0;i<10;i++)了，这是C99的，所有编译不了。 要在外面定义变量才可以

不要写 for(int i=0;i<10;i++) 写成 int i; ... for(i=0;i<10;i++) 就好

linux下使用gcc/g++编译器另外加上vim编辑器；


Question: 【求助】 java 改写成 c

for example int main() {     char s[256], *p;     int n;     fgets(s, 256, stdin);     scanf(“%d”, &n);     p = strtok(s, “ “);     while(p != NULL) {         n--;         if(n==0) break;         p = strtok(p, “ “);     }     print(“%s\n”, s);     printf(“extracword: “);     if(p!=NULL) printf(“%s\n”, p);     else printf(“nothing\n”);     return 0; }

例如输入 my name is jack 2 提出第二个单词在这里是name 输出应该是 my name is jack  extracWord: name

如不用strtok呢 使用fgets（）改写java code能否实现呢？

比如 char *s; int n; while((s=gets()) != NULL) { //这里相当于hasNextLine     sscanf(s, “%d”, &n);//这里相当于nextInt     printf(“%d”, n); }

建议楼主描述一下需求，根据需求去用C实现～


Question: C语言题目

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

int a[Y]={2}的意思是数组里面每个元素都是2吗

一个数有很多位，它要乘以2 积的个位=原数的个位×2的结果取个位 积的十位=（原数的十位×2的结果+原数的个位×2的结果的十位）的结果取个位 积的百位=（原数的百位×2的结果+原数的十位×2的结果的十位）的结果取个位 循环吧  以上描述中提到的位是十进制下的单独一个数位，提到的×2的结果可能是1位数也可能是2位数，结果的十位就是进位的意思 你自己随便写个竖式计算，然后记住每个数字都是单独的变量（数组元素），然后描述计算过程，就是这样了

引用 7 楼 forever74 的回复:超大数计算超高精度计算基本就都是这么写的，网上一搜一大堆，就是硬模拟竖式计算嘛。不光是乘2，更重要的是四则和各种其他运算。当然这个代码不够精致，还有一些无用功在里面。请问，我还是有些搞不懂硬模拟竖式计算是怎么模拟计算的？

#include <stdio.h> #define X 1000 #define Y 400 int Fun() { 	int a[Y] = { 2 }, b[Y]; //原本有个2 	int sum = 0; 	int i, j, m, n; 	for (i = 1; i < X; ++i) { //这个循环999次，每次乘2 		for (j = 0; j < Y; ++j) //把上次结果保存起来作为下次的运算数 			b[j] = a[j]; 		for (n = 0; n < Y; ++n) //这个就是a=b*2 			if (n == 0) 				a[n] = 2 * b[n] % 10;  //最低位也就是个位不用考虑进位，因为没人给它进 			else  				a[n]=(2*b[n]+2*b[n-1]/10)%10; //其他位就得考虑进位了，a[1]是十位，a[2]是百位，依次类推 	} 	for (m = 0; m < Y; m++) //按要求累加各数位 		sum += a[m]; 	return sum; } int main(void) { 	printf("%d\n", Fun()); 	return 0; }  输出 1366

老哥要不可以从第一个循环开始到结束详细注释一下吗 就把我当成一个新手解释一下 这个确实是看不懂

按照10进制从低到高一位一位算，考虑到低位进上来的进位就行。如果你说的是填空的这句话的话。

你好 可以解释一下思路吗 就是怎么想出来要这么写的

就是计算2的1000次方的值，因为它太大，所以需要用数组元素表示它的各位数字。计算的时候参考手写竖式的计算过程。

可以的话顺便解释一下这个代码 不带清楚这个想要干嘛

要求： 2^15 = 32768 ，其各位之和为 3 + 2 + 7 + 6 + 8 = 26。  求2^1000各位数字之和。其中^表示次方，如：2^5表示2的5次方。  下面程序计算并输出结果，请完成缺少的语句。要求参赛选手在弄清给定代码的基础上填写缺失的部分，使得程序逻辑正确、完整。所填写的代码不多于一条语句（即不能出现分号）。

说清楚要求，不要让人猜。


就是调用函数返回的值赋值给了start和differ


Question: c，c#，c++，等等的听说了很多，但只学了c，有没有来科普一下的

建议先学C语言，后续一通百通。以后专业不管是走I T编程还是电子技术编程，都可发展。

直接C#、、、

建议学golang，被称为互联网的c语言

先学的c++,然后看了看c，c++虽然包括c，但是他们的思想不一样，c++是面向对象的，然后运行的话c好像更快一点

学会了c,再学其它的，就很简单了

学到了，看来我还有很长路要走

建议学习C++Primer Plus

不，是： |-------- |您在这| |-------- | C -> C++ \                   > java! C# --------/

C -> C++   ->  C++++(C#)  看出来了吗

建议直接学c++

C先学，会带给你写代码的逻辑性，严谨性，然后直接学习c#。

小白路过，学习了。

一般讲，早初的时候，C语言常常与Unix系统有关。也有人说，C语言是为了开发Unix系统而研发的。但是，C语言是完全独立的设计，其系统设计甚至比Unix更加庞大复杂。C语言的经典教材，我国比较公认的是早初清华大学谭浩强教授的版本。最经典的C语言例程就是传说中的HelloWorld。一般来说，C语言的特点是精巧缜密，这是大多数懂得C语言的人都会承认的。 C++是诞生于C语言论坛的：在人们热衷于讨论和赞美C语言的时代，一些非常深刻的人在C语言论坛提出了对象和流的概念，之后讨论了有十年，最后终于有人为这两个概念做出了代码实现，于是C++诞生了。至于命名，是源于类似后来命名大熊猫的方法——服从民意。关于面向对象技术和流技术，在早初就有许多争议，大多数人知道的结论是：没有函数精妙。主要问题是：效率低下，适应力较低。但是C++还是诞生了，源于一些人的坚持。最早的C++定义，就是在C语言基础上加入对象技术和流技术。通常认为，整个1980's是属于C++语言的，虽然当时Basic语言更加流行。C++语言的经典版本：Borland公司的TurboC2.0，BorlandC++3.1，BorlandC++Builder4.5，Microsoft公司的VisualC++6.0。 C#是微软.net战略的产物，诞生于Sun公司强大的Java攻势之下，基本上是与Java、Javascript同时代的理论争吵（思考）的产物。

首先，c++之父认为应该是++c，而不是c++ 其次，c++的确包括c。更多的是面向对象，泛型编程，模板元编程等

简单地科普一下：先从取名来说吧，++在C语言中表示增加1的意思，所以，C++在功能上比C语言有所增加。在C++功能的基础上，C#又比C++的功能有所增加，因为#是由两个++构成的。具体参见《C++程序设计精要教程》。

没学过听别人描述很难有深刻理解的，就跟没见过大象的人描述大象一样，另外只学C找到工作，尤其好工作是比较困难的，需要学历加持

c++可以看作c的超集（c相当于c++的子集） c#不属于c/c++系列，和java类似，编译后是虚拟机指令，需要虚拟机来运行

个人理解：c++是基于c，但是面向对象，两者可以说是同源，C#新一些，特性不同，使用的地方也不同，c#优化了内存，但是是否是真的“优化”当然仁者见仁。c++几乎完全兼容c，他对指针的特殊操作可以说是非常独特的，优点缺点都在他，也给了他对底层操作的独特优势。而感觉c#更像java

C是面向过程的编程，而c#和c++更多的是面向对象的编程；