Question: 请问有人知道为什么利用freetype生成的贝塞尔曲线来形成的汉字是倒置的吗

const FT_Fixed multiplier = 65536L; FT_Matrix matrix; matrix.xx = 1L * multiplier; matrix.xy = 0L * multiplier; matrix.yx = 0L * multiplier; matrix.yy = -1L * multiplier; FT_GlyphSlot slot = face->glyph; FT_Outline &outline = slot->outline; FT_Outline_Transform(&outline, &matrix); 复制代码 将matrix.yy的值变成负的就好了

引用 3 楼 赵4老师 的回复:int moveto(const FT_Vector* to, void* user){      printf("M %d %d\n", to->x, 100-to->y);     return 0; }  int lineto(const FT_Vector* to, void* user){      printf("L %d %d\n", to->x, 100-to->y);     return 0 ; }  int  conicto(const FT_Vector* control, const FT_Vector* to,void* user){      printf("Q %d %d %d %d\n", control->x, 100-control->y, to->x, 100-to->y);     return 0; }  int  cubicto(const FT_Vector* control1,const FT_Vector* control2, const FT_Vector* to,void* user){      printf("C %d %d %d %d %d %d\n", control1->x, 100-control1->y, control2->x, 100-control2->y ,to->x, 100-to->y);     return 0; }   该方法无效，不过我已解决了


Question: 字符文件处理系统

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


Question: 请教一个OJ题，大佬请看看

引用 1 楼 qzjhjxj 的回复：供参考：#include <stdio.h> int main() {     int n;     scanf("%d",&n);     //int a[n+10]; //数组的定义非法，会报错。     //int o[n];     //int ji[n];     int i;     int j;     int k,l=2;     if(n%2==0)l=0;     //k=l=0;      int *a = new int[n];//动态数组     memset(a,0,sizeof(int)*n);//数组初始化      for (i=0;i<n;i++){     //输入数据          scanf("%d",&a[i]);     }      for (i=0;i<n;i+=2){   //下标奇数位排序，升序          for (j=0;j<n-i-2;j+=2){               if (a[j]>a[j+2]){                        k = a[j];                     a[j] = a[j+2];                    a[j+2]= k;               }          }     }     for (i=1;i<n;i+=2){     //下标偶数位排序，降序          for (j=1;j<n-i-l;j+=2){                 if (a[j]<a[j+2]){                        k = a[j];                     a[j] = a[j+2];                    a[j+2]= k;               }          }     }     for (i=0;i<n;i++){        //输出          printf("%d%c",a[i],i<n-1?' ':'\n');     }      delete []a;          return 0;      /*while(scanf("%d",&a[i])!=EOF)          {            if(a[i]==0)              {                 break;              }            if((i+1)%2==0)              {                o[k]=a[i];                k++;              }            if((i+1)%2!=0)              {                ji[l]=a[i];                l++;              }            i++;          }     int g;     for(i=0;i<k;i++)        {         for(j=i;j<k;j++)            {              g=o[i];              if(g<o[j])                {                  o[i]=o[j];                  o[j]=g;                }            }        }     int g1;     for(i=0;i<l;i++)        {          for(j=i;j<l;j++)             {               g1=ji[i];               if(g1>ji[i])                 {                   ji[i]=ji[j];                   ji[j]=g1;                 }             }        }     int u=l;     int p=0;     while(j>0&&k>0)        {           printf("%d %d ",ji[p],o[p]);           p++;           j--;           k--;        }     if(n%2!=0)        {           printf("%d",ji[u-1]);        } */ }  //8 //2 6 7 1 3 8 9 4 //2 8 3 6 7 4 9 1 //请按任意键继续. . .  //7 //1 2 3 4 5 6 7 //1 6 3 4 5 2 7 //请按任意键继续. . .  //6 //1 2 3 4 5 6 //1 6 3 4 5 2 //请按任意键继续. . .谢谢指教

我的VS2017 Community前些天明明允许像楼主那样定义数组的，可是今天不知道为啥就说不行了，必须得用常量云云。

#include <stdio.h> #include <stdlib.h>   void bubble_sort(int *arr, int len); int main() {  #if 1     int n, *arr, i;      scanf("%d", &n);      arr = (int *)malloc(sizeof(int) * (n + 1));     if (!arr)         return -1;      for (i = 1; i < n+1; i++)         scanf("%d", &arr[i]);      bubble_sort(arr+1, n);      for (i = 1; i < n+1; i += 1)         printf("%d ", arr[i]);     putchar(10);      for (i = 1; i < n+1; i += 2)         printf("%d ", arr[i]);     putchar(10);     for (i = 2; i < n+1; i += 2)         printf("%d ", arr[i]);     putchar(10);   #else     int n;     scanf("%d",&n);     int a[n+10];     int i=0;     int j;     int o[n];     int ji[n];     int k,l;     k=l=0;     while(scanf("%d",&a[i])!=EOF)     {         if(a[i]==0)         {             break;         }         if((i+1)%2==0)         {             o[k]=a[i];             k++;         }         if((i+1)%2!=0)         {             ji[l]=a[i];             l++;         }         i++;     }     int g;     for(i=0;i<k;i++)     {         for(j=i;j<k;j++)         {             g=o[i];             if(g<o[j])             {                 o[i]=o[j];                 o[j]=g;             }         }     }     int g1;     for(i=0;i<l;i++)     {         for(j=i;j<l;j++)         {             g1=ji[i];             if(g1>ji[i])             {                 ji[i]=ji[j];                 ji[j]=g1;             }         }     }     int u=l;     int p=0;     while(j>0&&k>0)     {         printf("%d %d ",ji[p],o[p]);         p++;         j--;         k--;     }     if(n%2!=0)     {         printf("%d",ji[u-1]);     } #endif     return 0; }  void bubble_sort(int *arr, int len) {     int i, j;     int even_flag, odd_flag ,tmp;      for (i = 0; i < len; i++) {         for (j = 0; j < len; j++) {             if (j + 2 < len) {                 if (j % 2 == 0 && arr[j] > arr[j+2])                     odd_flag = 1;                 if (j % 2 == 1 && arr[j] < arr[j+2])                     even_flag = 1;                  if (odd_flag || even_flag) {                     tmp = arr[j];                     arr[j] = arr[j+2];                     arr[j+2] = tmp;                     odd_flag = even_flag = 0;                 }             }         }     } } 供参考～

#include <assert.h> #include <stdio.h> #include <stdlib.h>  static int cmp1(const void *p1, const void *p2) {     int *v1;     int *v2;      v1 = (int *)p1;     v2 = (int *)p2;     return (*v1) - (*v2); }  int cmp2(const void *p1, const void *p2) {     int *v1;     int *v2;      v1 = (int *)p1;     v2 = (int *)p2;     return (*v2) - (*v1); }  int main(void) {     int   i;     int   n;     int   a;     int   n1;     int   n2;     int   a1[500];     int   a2[500];      for (;;) {         assert(1 == scanf("%d", &n));         if (0 == n)             break;          n1 = 0;         n2 = 0;         for (i = 1; i <= n; i++) {             assert(1 == scanf("%d", &a));             if (i % 2 == 1) {                 /* 下标为奇数 */                 a1[n1++] = a;             } else {                 /* 下标为偶数 */                 a2[n2++] = a;             }         }          qsort(a1, n1, sizeof(int), cmp1);         qsort(a2, n2, sizeof(int), cmp2);          printf("%d", a1[0]);         n1 = 1;         n2 = 0;         for (i = 2; i <= n; i++) {             if (i % 2 == 1) {                 printf(" %d", a1[n1++]);             } else {                 printf(" %d", a2[n2++]);             }         }         printf("\n");     }      return 0; }


Question: 求助

供参考：#include <stdio.h> #include <conio.h> //getch()函数头文件 void main() {     float A,B,C,S;      printf("输入A和B：");      scanf("%f %f",&A,&B);//scanf("%f,%f",&A,&B); 输入格式还是取消','号更方便      C = A + A + B + B;      S = A * B;      printf("周长为:%f,面积为:%f",C,S);      getch();  }  //输入A和B：1.2 2.3 //周长为:7.000000,面积为:2.760000

引用 3 楼 qzjhjxj的回复:这两句前后不搭的，scanf("%f,%f",&A,&B); 修改之后显示:	LNK2005	_main 已经在ConsoleApplication1.obj中定义（第一行） 	LNK1169	找到一个或多个多重定义的符号（第一行）

这两句前后不搭的，scanf("%f,%f",&A,&B);

引用 1 楼 一颗白面馒头的回复:提醒你不安全了嘛，所以把scanf函数改为scnaf_s函数 可是我加了以后依然不可以


Question: 请问大佬在哪输入

虽然它叫输出，但是你要看输出，还是切到终端去吧


CMscomm1.put_Output  引用 4 楼 it_xiangqiang 的回复:希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html感谢  这是让我从头开始学习呀

还有人知道些其他的吗

校验是为了发现数据传输错误，为什么用CRC16，因为简单、快速、易于硬件实现，以太网、PCIe底层都使用CRC16用于检验数据传输的正确性


Question: Linux VSCode调试c语言出现“无法加载源”问题

可能需要在launch.json中加入            "sourceFileMap": {                "src": "${workspaceFolder}/src"            },

我也出现了相同的问题，现在解决了吗

这帖子都快一年了哈哈哈哈哈哈，解决了解决了

怎么解决的，大佬求教。

怎么解决的啊 这问题

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

眼不见为净。


Question: 用指针判断大小，为什出不来结果？

这个代码的精神内核相当于： 宿舍老二（乙）身高没有老大（甲）的高。 后来发现老二的年龄弄错了，实际上他年龄更大，所以他才是老大，原来的老大应该是老二。 这和身高没啥关系呀。

if(*p1<*p2) {      p3=p1;    p1=p2;       p2=p3; }  这个swap（交换）只是交换了局部变量p1, p2里面的值（地址值），并没有把交换调用函数里的p1, p2指向的内存内容；

深入学学指针和引用，以及函数作用域和返回值

供参考：#include<stdio.h> void adjust1(int *p1,int *p2)//指针p1 p2作用域在本函数内，所以改变他们的值，                             //并不能传回给math1 math2,所以是无效的。 {     int *p3;     if( *p1 < *p2)     {         p3 = p1;         p1 = p2;         p2 = p3;     } }  void adjust2(int *p1,int *p2)//对指针所指向的值操作是有效的 {     int p3;     if(*p1<*p2)     {          p3 = *p1;         *p1 = *p2;         *p2 = p3;     } }  int main() {    int a1,a2,*math1,*math2;    math1=&a1;    math2=&a2;    scanf("%d %d",&a1,&a2);//scanf("%d%d\n",&a1,&a2);这里多了'\n'        adjust1(math1,math2);    printf("adjust1:%d %d\n",*math1,*math2);     adjust2(math1,math2);    printf("adjust2:%d %d\n",*math1,*math2);        return 0; }


Question: 找出二维数组中的最大值

引用 1 楼 自信男孩的回复:#include <stdio.h>  #define N 100  int main() {     int a[N][N],n1,n2,i,j,max,t;     scanf("%d%d",&n1,&n2);            //输入数组的行和列     if (n1 > N)         n1 = N;     if (n2 > N)         n2 = N;     for(i=0;i<n1;i++)                 //输入数组         for(j=0;j<n2;j++)             scanf("%d",&a[i][j]);      max=a[0][0];     for(i=0;i<n1;i++)                 //找出数组中最大的数         for(j=0;j<n2;j++)             if(max<a[i][j])             {                 max = a[i][j];                 /*                 t=a[i][j];                 a[i][j]=max;                 max=t;                 */             }     printf("%d\n",max);               //输出数组中最大的数 } 供参考～ 多谢，这位大佬助我改正！


Question: 求大神解决一道C语言问题

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

#include <assert.h> #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(void) {     int i, n;     int j, m;     char s[100 + 1];     /*      *         ---      .  ---   ---  .   .  ---    ---   ---   ---   ---      *        |   |     |     |     | |   | |      |         | |   | |   |      *        |   |     |  ---   ---   ---   ---    ---      .  ---   ---      *        |   |     | |         |     |     |  |   |     | |   |     |      *         ---      '  ---   ---      '  ---    ---      '  ---   ---      *      *        ----- ----- ----- ----- -----  ----- ----- ----- ----- -----      */     int h[] = { 2,    0,    3,    3,    1,     3,    3,    1,    3,    3};     int v[] = { 4,    2,    2,    2,    3,     2,    3,    2,    4,    4};     int hs, vs;      assert(1 == scanf("%d", &n));     assert(n > 0);      for (i = 0; i < n; i++) {         assert(1 == scanf("%s", s));         m = strlen(s);         if (0 == m)             continue;         hs = 0;         vs = 0;         for (j = 0; j < m; j++) {             hs += h[s[j] - '0'];             vs += v[s[j] - '0'];         }         printf("%d %d\n", hs, vs);     }      return 0; }

样例不给7，7的数码管字体有争议啊。


Question: 怎么用C程序读取文本文件，并把原始文件打印在屏幕上？

open -> read -> 处理 -> write

fopen(); fread()


Question: 求问这个结果是怎么得出的？能讲解一下吗？

出题者的意图是考察小端字节序。 然而相差1字节的两个指针要强制转换类型，我怀疑至少有一个要产生总线对齐错误啊。


Question: 为什么结果是这样？？？求教！！！

#include "stdio.h" void main() {     printf("******************************\n");     printf("       1---------ADD(+)       \n");     printf("       2---------SUB(-)       \n");     printf("       3---------MUL(*)       \n");     printf("       4---------DIV(/)       \n");     printf("******************************\n");      }  //****************************** //       1---------ADD(+) //       2---------SUB(-) //       3---------MUL(*) //       4---------DIV(/) //****************************** //请按任意键继续. .

你都\n回车了，又加空格不是有毒吗

printf("******************************\n"            "       1---------ADD(+)       \n"            "       2---------SUB(-)       \n"            "       3---------MUL(*)       \n"            "       4---------DIV(/)       \n"            "******************************\n");

前一个\n后面那些空格理所当然地被挤到下一行开头了。


Question: HELP

最好还是自己写，迟早的事

引用 2 楼 qzjhjxj 的回复:供参考：#include<stdio.h> #include <math.h>  int is_prime(int n);  int main() {     int i,cnt =0,sum=0;     for (i=1000;i<=9999;i++){         if (is_prime(i)) {             cnt++;             sum += i;             printf("%-6d%c", i,cnt%10 ? ' ':'\n');         }     }     printf("\ncount=%d,sum=%d",cnt,sum);          return 0; }  int is_prime(int n) {     int i;     if (n <= 1)         return 0;     for (i = 2; i <= sqrt(n); i++) {         if (n % i == 0)             return 0;     }     return 1; }我一点都不赞成给这样的贴子回帖。发这种贴子的多半时学生，这么轻易的告诉他们答案岂不是害了他们。

网上很多例子，自己下载下来试试，改一改。总得自己动动手吧


Question: help

不建议当伸手党呢～


Question: C语言求解

娃，好好学习，论坛里面时答疑解惑的，没人帮你做题。


Question: VS2019 debug assertion failed 问题怎么解决？

fputs("Done displaying.",stdout);

阿 太粗心了，多谢大佬!


Question: vc 问题，为什么输出这样的结果？

如果你是要用冒泡排序，可以写成 for (l = 0; l < 5; l++)     {         for (n = 0; n < 5 - l - 1; n++)         {             if (a[n] > a[n + 1])             {                 k = a[n];                 a[n] = a[n + 1];                 a[n + 1] = k;             }         }     }

这是冒泡排序吗？看的我一愣一愣的


Question: 纯小白，请问大佬在VScode上配置c语言环境时出现这种情况怎么解决

把F5扣下来

引用 4 楼 weideha 的回复:我摁F5运行就会自动跳到调试控制台，有什么办法点F5时不会跳到调试控制台吗 你把左边的调试控制台，鼠标左键按住“调试控制台”几个字，然后拖动它到屏幕下面，然后就能看到一排好几个tap，切到“输出”窗口

我摁F5运行就会自动跳到调试控制台，有什么办法点F5时不会跳到调试控制台吗

没什么问题，你没有断点，程序执行完毕，退出状态为0表示程序正常退出。你要是想看输出，应该把调试控制台那儿切到终端窗口

遇到啥问题了？看起来是好的呀

大佬们帮个忙吧


Question: 想走嵌入式方向，大佬有建议吗

嵌入式前景好，因为和硬件结合紧密，所以你嵌入式学到的技术都是实打实的，包括程序和电路方面

听你们这样说前景不好呀

对学生来说，如何学一门知识往往都是简单的问题，真正的问题在于大方向的把握。 所以，建议你看看来自己学校招聘的单位，然后考虑要不要考研，再考虑要不要报辅导班

嵌入式方向可以进一步分硬件方向和软件方向。 硬件方向：看数据手册，设计电路等等。 软件方向：和PC没本质区别。 如果是小项目，纯裸机程序。硬件电路和裸机驱动，也可能一个人搞定。。

嵌入式内地发展缓慢，建议去深圳，嵌入式门槛高，得有过硬水平

浏览一下本网页下面CSDN自动生成的博文。


Question: C语言：二进制数转换为十进制数

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

多谢，楼客们！！！

如果不调用现成函数要自己写的话就要写函数式的，本示例适用任意进制。    十六进制的话：fa += x * 乘方(16, c++)；

仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

当输入超过5位时，计算出错，修改如下，供参考：#include <stdio.h> void main() {     int n,twn,ten=0,v=1;//权值     int a,b,c,d,e;     scanf("%d%d",&n,&twn);     b=twn;     while(n--){           a = b % 10;           ten += a*v;           v *= 2;           b /= 10;     }    /*if(n>4)     {         a=twn/10000;         b=twn%10000/1000;            c=twn%1000/100;         d=twn%100/10;         e=twn%10;         ten=a*16+b*8+c*4+d*2+e;        }     else if(n>3)     {         a=twn/1000;         b=twn%1000/100;         c=twn%100/10;         d=twn%10;         ten=a*8+b*4+c*2+d;           }     else if(n>2)     {         a=twn/100;         b=twn%100/10;         c=twn%10;         ten=a*4+b*2+c;     }     else if(n>1)     {         a=twn/10;         b=twn%10;         ten=a*2+b;     }     else if(n>0)     {         ten=twn;     }*/     printf("二进制序列(%d)的值为:%d\n",twn,ten);      }


Question: C语言系统问题

这是没有打开项目，打开项目就可以了

啊这，因为这是写c++的IDE，所以不能打开c语言系统

鼠标点击左边SHIXUN，展开项目，找到源代码，双击。


Question: 【C语言求助】嵌套循环问题

引用 8 楼 forever74的回复:我瞎猜的：  楼主之前的考虑是数学的思维， 令 变量temp为另外三个变量的立方和 然后下文每次提到temp的时候它都根据依赖的自变量的当前值自动重新计算temp的最新结果  是这样的考虑催生了0楼的代码。 确实。我很多时候都是手比脑子动的快，对于这种执行顺序的问题就很少动脑子。

嗯，还是得说，初学者学习程序设计的门槛之一  你首先得抛弃学习程序设计之前的“自动”观念 temp=pow......; 这样的赋值语句只会在轮到它执行的时候执行一次，刷新变量temp的值 它不会因为你写了上述语句，就在上述语句右侧变量有变化的时候“自动”更新左边变量的值  各位大佬，上述几行怎样表达才能更简洁更明确？望不吝赐教。

引用 5 楼 qzjhjxj的回复:修改楼主的，供参考：#include <stdio.h> #include <math.h> void main() {             printf("hw 5.8\n");             //temp=pow(bai,3)+pow(shi,3)+pow(ge,3); //这里temp bai shi ge 变量都还没定义             for(double bai=1,shi=0,ge=0;(100*bai+10*shi+ge)<=999;bai++)//这里虽然定义了，数据类型不对呢，int型就可以了             {                                                        //百位数的循环                 //int temp=pow(bai,3)+pow(shi,3)+pow(ge,3);//这句放在这里，shi ge 位数变化捕捉不到                  for(shi=0,ge=0;shi<=9;shi++)//十位数的循环                 {                     for(ge=0;ge<=9;ge++) //个位数的循环                     {                         int temp=pow(bai,3)+pow(shi,3)+pow(ge,3);                         if((100*bai+10*shi+ge)==temp)                         {                             //printf("%d%d%d\n",bai,shi,ge); 既然前面定义的是double型，输出不能用%d                             printf("%.0f%.0f%.0f\n",bai,shi,ge);                         }                        //else printf("条件不满足  %d%d%d%d",bai,shi,ge,temp);                        //这句是只要不满足就输出一条，题目没要求呢,而且输出用 %d 也不对                     }                     ge=0;                 }                 shi=0,ge=0;            }             } 谢谢！前几天事情比较多，没来得及回复

引用 1 楼 qzjhjxj的回复:楼主想复杂了，这个例子，供参考：#include <stdio.h>  int main(void) {     int sum,temp,i,n;     for (i = 100;i < 1000; ++i){          temp= i;          sum = 0;          while(temp){    //temp到0时跳出循环               n = temp%10;//每次取得一位数值，如153，分别取3 5 1               sum += n*n*n;//每位数值的立方和               temp/= 10;          }          if (i == sum){  //如立方和sum 与原数 i相同，即为水仙花数              printf("%d\n",i);          }     }          return 0; } 嗷，原来还能这样啊。 但我还是想知道我原来那个错在哪。。。

其他问题，对比代码找一下原因～

#include <stdio.h> #include <math.h>  //void main() int main(void) {     printf("hw 5.8\n");     int temp;     //temp = pow(bai,3)+pow(shi,3)+pow(ge,3);     //for(double bai=1,shi=0,ge=0; (100*bai + 10 * shi+ge)<=999;bai++)   //百位数的循环     for(int bai=1,shi=0,ge=0; (100*bai + 10 * shi + ge) <= 999; bai++)   //百位数的循环     {          //int temp=pow(bai,3)+pow(shi,3)+pow(ge,3);         for(shi=0,ge=0;shi<=9;shi++)  //十位数的循环         {             for(ge = 0; ge<=9;ge++)           //个位数的循环             {                 temp=pow(bai,3)+pow(shi,3)+pow(ge,3);                 if((100*bai+10*shi+ge)==temp)                     printf("%d%d%d\n",bai,shi,ge);                 //else                   //  printf("条件不满足  %d %d%d%d",bai,shi,ge,temp);              }             ge=0;          }         shi=0,ge=0;     }      return 0; } 供参考～  注意temp计算的位置要做调整，放在最内层循环；另外，去掉else的打印，因为100~999之内只有几个是水仙花，因此大部分不是水仙花，因此无用的打印会影响到你想要的打印～


Question: VC   error C2660: 'ge' : function does not take 3 parameters

引用 4 楼 自信男孩的回复:#include <stdio.h> #include <math.h>  //void main() int main(void) {     double ge(double, double, double);     double a,b,c,d;     a=2;     b=5;     c=2;     ge(a,b,c); }  double ge(double a,double b,double c) {     double m;     m=(-b+sqrt(b*b-4*a*c))/2*a;     return(m); } 供参考～  函数声明有问题，楼主的声明更像调用，但是又加上了返回值，又不是函数调用。函数声明要确定参数，即使没有参数，建议用void。如果有参数，至少填上参数类型，参数名可以不用～ 好的👌了解了

引用 2 楼 qzjhjxj的回复:问题见注释，供参考:#include"stdio.h" #include"math.h" void main() {     double ge(double a,double b,double c);//函数声明必须函数实现写法一致     double a,b,c,d;     a=2;     b=5;     c=2;     d=ge(a,b,c);     //函数返回赋值给d     printf("%f\n",d);//输出看结果      }  double ge(double a,double b,double c)//函数实现 {     double m;     m=(-b+sqrt(b*b-4*a*c))/2*a;     return(m); } okok谢谢大佬

引用 1 楼 墨梅无痕的回复:void main() { double ge(); double a,b,c,d; …………  红色的这句是啥用意？ 我的声明有问题，get it

double get（）。声明是没有参数的，后面调用的时候给了三个参数。


Question: 求解：第一句话的含义并且如何实现，怎么判断数据类型

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

引用 7 楼 mymtom的回复: /* 输出 */ /*           20 : 00010100           40 : 0000000000101000          100 : 00000000000000000000000001100100         -100 : 11111111111111111111111110011100 */  不是直接输出答案啊用程序算出答案

#include <stdio.h>  char * bits(char type, int value, char *buf) {     unsigned int bit;     unsigned int u;     int len;     int i;      if ('c' == type) {         bit = 0x80;         len = 8;     } else if ('s' == type) {         bit = 0x8000;         len = 16;     } else if ('i' == type) {         bit = 0x80000000;         len = 32;     }      u = (unsigned int)value;     for (i = 0; i < len; i++) {         if (u & bit) {             buf[i] = '1';         } else {             buf[i] = '0';         }         bit >>= 1;     }      buf[len] = '\0';      return buf; }  int main(int argc, char *argv[]) {     char buf[32 + 1];      char  c =  20;     short s =  40;     int   i = 100;     printf("%12d : %s\n", c, bits('c', c, buf));     printf("%12d : %s\n", s, bits('s', s, buf));     printf("%12d : %s\n", i, bits('i', i, buf));     i = -100;     printf("%12d : %s\n", i, bits('i', i, buf));      return 0; }

仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

不过题目说了“编写C程序……”，那就用if或switch判断具体数据类型吧。

引用 2 楼 赵4老师的回复:C++模板了解一下。 c++刚上了一节课😅我去了解一下

C++模板了解一下。

分别写三个函数各做各的就行，不用你自己写代码判断类型，都由人脑判断，然后去调用各自的处理函数。 库里还有abs和fabs这种呢，没啥丢人的。

引用 8 楼 m0_52291497 的回复:[quote=引用 7 楼 mymtom的回复:] /* 输出 */ /*           20 : 00010100           40 : 0000000000101000          100 : 00000000000000000000000001100100         -100 : 11111111111111111111111110011100 */  不是直接输出答案啊用程序算出答案[/quote] 6楼是程序，这里是6楼的程序的输出

审题！审题！审题！

都是比我厉害的大佬，有些代码还没学过，有的学了

引用 12 楼 user-6 的回复:感觉这题出的有问题，明明加了内存中存储的字样，却只给出了大端示例，但一般平时用的机器，小端居多。2种都给你吧。 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef unsigned char UChar; int main() { 	int a; 	scanf("%d",&a); 	//按照实际内存序  	UChar* pa=(UChar*)&a; 	for(int i=0;i<sizeof(a);i++) 	{ 		UChar s = *pa; 		for(int i=7;i>=0;i--) 			printf("%d",(s>>i)&1); 		pa++; 	} 	printf("\n"); 	//按照题目示例的意思  	char binS[33]; 	ltoa(a,binS,2); 	for(int i=0;i<32-strlen(binS);i++) 		printf("%c",'0'); 	printf("%s",binS);	 	return 0; } 大小端就扯远了！重点是2进制数，所以能显示从高位低位就可以了

#include <stdio.h> #include <stdlib.h> int main() {     int i;     char b[33];     char ln[80];     char c;      while (1) {         rewind(stdin);         fgets(ln,80,stdin);         if (ln[0]=='\n') break;         if (2==sscanf(ln,"c=%d%c",&i,&c) && c=='\n' && -128<=c && c<=127) {             ltoa(i,b,2);             printf("%0*s\n", 8,b);         } else         if (2==sscanf(ln,"s=%d%c",&i,&c) && c=='\n' && -32768 && c<=32767) {             ltoa(i,b,2);             printf("%0*s\n",16,b);         } else         if (2==sscanf(ln,"i=%d%c",&i,&c) && c=='\n'                      ) {             ltoa(i,b,2);             printf("%0*s\n",32,b);         } else         if (2==sscanf(ln,"j=%d%c",&i,&c) && c=='\n'                      ) {             ltoa(i,b,2);             printf("%0*s\n",32,b);         } else {             printf("Format Error!\n");         }     }      return 0; } //输入c=20 //输出00010100 //输入s=40 //输出0000000000101000 //输入i=100 //输出00000000000000000000000001100100 //输入j=-100 //输出11111111111111111111111110011100 //输入回车 //退出程序


Question: C语言中指针

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

m=1; n=2; r = &m; p=r; q=&n; 初始态是这样的，我帮你翻译下吧： p=p+1=r+1；到此结束，由于指针前没加解引用，因此这里是地址加1，此时p的值已经不是m的地址了。相当&m的地址基值，再加4个字节 再继续下去，其实p是个局部变量，对他再怎么改，也不会影响main函数的值，除非加上解引用，就是*  再看*q=*q+1，分2部分，一个看前面左值，一个看后面右值 *q=*(&n)=n ，于是得到*q为n   //*和&互为逆运算 *q+1=*(&n)+1=n+1 ，于是得到*q+1 为n+1 于是：*q=*q+1就相当于：n=n+1

因为p = p +1是地址值加1，不是地址值指向的内容加1. 与此不同的*q = *q + 1;就是q指向的内容加1.


Question: 请问一下这个指针数组为什么一定要有大小才能运行出来啊？

引用 8 楼 lin5161678 的回复:引用 2 楼 paena 的回复:这样写：int** p = &test2;不行 好吧，前面我随手打了，sorry。 #include<stdio.h> int main() { 	int test2[9]={1,2,3,4,5,6,7,8,9}; 	int* p = test2; 	int** p1 = &p;  	for(int i=0;i<9;i++) 		printf("%d\n",*(*p1+i)); 	return 0; }

&test2就基本上看成是二维数组了。因为test2是一维数组。  所以int (*p)[9] = &test2；后面的9是指该指针指向的是长度是9的数组。

引用 1 楼 forever74 的回复:因为它就不是个指针数组 它是个指针，要正确赋值，必须类型兼容。 这是一个数组指针；数组指针和指针数组还是有区别的，要看谁修饰谁，数组指针，是数组修饰指针，最终的名字是指针，指针数组，是指针修饰数组，最终是数组，数组元素都是指针。

事实上面对负责一些的编译器，这个程序如果改为int **p是会引出warning的，而程序员不应该只满足于消灭编译error。 那样的写法在后续操作中会出乱子的。

这是数组指针，指向数组的指针。

引用 楼主 qq_53317242的回复:这里（*p）【】里面必须要填上9才能运行出来，不填或者填更大都不可以，请问这是为什么啊？ 参见《C++程序设计精要教程》类型等价性证明。取test2的地址，相当于用一个指针指向test2, 而test2的定义int test2[9]=int (test2)[9]，故取test2的地址对应的类型为int(&test2)[9]=int(*)[9]，该类型应和被赋值的变量p的类型相同，即p应该定义为int (*)[9]类型，定义形式应为int (*p)[9]。设Q的类型为(*)，则p的类型int(*)[9]=int Q[9]，且因一维数组[9]可视为单重指针*，则int Q[9]=int *Q=int *(*)。鉴于两个*的优先级相同，且结合性为自右至左，故去掉( )并不影响运算顺序，即int *(*)=int **, 因此p的类型int (*)[9]=int**类型，故p也可以定义为int **p。

这样写：int** p = &test2;

因为它就不是个指针数组 它是个指针，要正确赋值，必须类型兼容。


Question: 洛谷新手村程序练习题

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

楼主的代码，第一图和第二图差了输出的语句printf("%d", m); ，第二图当然没输出了，逻辑上没有错， for (j = 0; j < n-1; j++) 这里，应该是 for (j = 0; j < n; j++) 。

#include<stdio.h> #define MAX_SIZE 100 int main() { 	int n,num; 	int array[MAX_SIZE]; 	char isused[MAX_SIZE]; 	scanf("%d",&n); 	for(int i=0;i<n;i++) 		scanf("%d",&array[i]),isused[i]=0; 	num=0; 	for(int i=0;i<n-1;i++) 		for(int j=i+1;j<n;j++) 			for(int k=0;k<n;k++) 				if(isused[k]== 0 && array[k] == array[i]+array[j]) 					num++, isused[k] = 1; 	printf("%d",num); 	return 0;	 }

#include <stdio.h> #include <stdlib.h>  int main() {     int i, j, k, n;     int *arr, m = 0;      scanf("%d", &n);       arr = (int *)malloc(sizeof(int) * n);     if (!arr)         return -1;      for (i = 0; i < n; i++)         scanf("%d", &arr[i]);      for (i = 0; i < n; i++) {         for (j = 0; j < n; j++) {             if (i == j)                 continue;             for (k = j+1; k < n; k++) {                 if (k == i || k == j)                     continue;                 if (arr[i] == arr[j] + arr[k]) {                     printf("%d = %d + %d\n", arr[i], arr[k], arr[j]);                     m++;                 }             }         }     }     printf("%d\n", m);     free(arr);      return 0; } 供参考～  试试这个版本～


Question: 请问哪里出错了,字符都是英文状态，实在找不到了，求教！！！！

这么简单个程序，找不到就重新打一遍

printf("字符个数为：%d"，d);

对啊，就是我早先说的那个逗号是中文的。

最后一个printf中，d前面那个，改为,就行了

多次验证没有字符大小写错误 求解！！！

引用 1 楼 forever74 的回复:来，把文本复制过来。  #include"stdio.h" int nu()//求统计输入字符的个数 { int a; for(a=0;getchar()!='@';a++); return a; } main() { int d; d=nu(); printf("字符个数为：%d"，d); }

貌似：你printf函数左括号是不是大一点。是不是有一边括号用中午输入法输入了。重新输入一遍试试。

另外，把出错信息那个扁窗口向上滚动一下看看还藏着什么。

供参考：#include <stdio.h> int nu() {    int a;    for(a=0;(getchar())!='@';a++);//注意这里的变化getchar()!='@'    return a; }  int main() {    int d;    d = nu();    printf("字符个数为:%d",d);//注意这行的符号及' )'       return 0; }

来，把文本复制过来。


Question: C语言 结构

引用 2 楼 自信男孩的回复:加在str是没问题，p->str++确实是str加1，指向了向后偏移一个字节的空间，但是p是野指针呢，野指针操作str是未定义的。但是编译器是不会检查到这里的。 这个题目感觉有一定的问题。强说是语法错误还是有点牵强。但是野指针问题确实在前。 好的，谢谢！

//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

答案错了呗，我是选A的。


Question: 数据储存到文件为什么乱码？求大佬解答。

修正楼上第51行fscanf(fp,"%s %s %s %s %s %s",p1->number,p1->name,p1->sex,p1->age,p1->speciaity,p1->Class);

楼主说的乱码，主要是最后的保存链表信息到文件并释放内存空间void Saveandfree()函数和文件信打开void Open()函数写入和读出的格式不同，对这两函数修改如下，问题见注释，供参考：//保存链表信息到文件并释放内存空间 void Saveandfree() {      TEL  *p=NULL;      FILE *fp;      char *Book="books.txt";      if (head==NULL){          printf("\n记录为空！\n");          return;      }      else p=head->next;      if ((fp=fopen(Book,"wb+"))==NULL){          printf("\n打不开文件!\n");          return;      }      while (p!=NULL){                     //保存信息            //fwrite(p,1,sizeof(TEL),fp); //这个写法是把结构体第7项 p->Telephone *next;也写入文件了                                          //所谓的乱码就是这部分的内容。            fprintf(fp,"%s %s %s %s %s %s ",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);            p=p->next;      }      printf("保存完毕!");      fclose(fp);      //*****释放链表空间*****      for(;head->next!=NULL;){          p=head->next;          head->next=head->next->next;          free(p);      }      free(head); }  //文件信息输出到链表 void Open() {      FILE *fp;      TEL  *p1=NULL,*p2=NULL,*temp=NULL;      if ((fp=fopen("books.txt","rb+"))==NULL){         printf("\n****************这是一个新的学生信息管理系统******************\n");         return;      }      head=(TEL *)malloc(sizeof(TEL));      head->next=NULL;      temp=p2=head;      while (! feof(fp)){         //循环读取            p1=(TEL *)malloc(sizeof(TEL));            temp=p2;            p2->next=p1;            p2=p1;            //fread(p1,sizeof(TEL),1,fp); //对应的读出文件信息的方法也不一样            fscanf(fp,"%s %s %s %s %s %s",&p1->number,&p1->name,&p1->sex,&p1->age,&p1->speciaity,&p1->Class);      }      temp->next=NULL;      fclose(fp);               //关闭文件 }

因为保存文件选的是wb也就是二进制文件，所以看上去是乱码


Question: C语言指针部分

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

引用 1 楼 user-5的回复:n的地址固然不会变，但是n的值变了呀。 谢谢，明白了。。

引用 2 楼 gouyanfen的回复:这个代码怎么看都是8吧 n=m; (*p)++; n不是改变了吗？ A00000:n的地址(值为A0000C) . . . A0000C:m起始地址 值1 A00010:                  值8  函数传入了n的址址 A00000 *p值类型为int 读取内容为A0000C 然后++ 结果为 A00010 存入到A00000 n的存放在址没变，指向变了 最后结果  地址:A00000: 存放内容 A00010 指向结果为8 谢谢我明白了

因为n的地址向后偏移的一个元素的长度，因此n指向了m[1]的位置，因此是8；  注意(*p) ++即n++;因为*p和n指向的位置是相同的，且类型一样；

n=m           //指针指向数组m的首地址（m[0]的地址） testf(&n)    //指针移动到m[1]的地址

n的地址固然不会变，但是n的值变了呀。


Question: gcc搜索路径的字符串是记录在哪里的？

印象里应该是父进程修改自己的环境或新建环境变量加入自己的环境，然后调用子进程并把自己的环境遗传给它。

我个人对环境变量并无深入学习。对于如何查看特定进程的环境变量我一无所知。 但是我知道环境变量并不都是全局的，另开一个进程查看环境变量应该不能看到特定进程的全部环境变量。 例如 早期动态网页的接口CGI就是靠环境变量工作的，如果环境变量都是全局的，那CGI就乱套了。

环境变量C_INCLUDE_PATH、CPLUS_INCLUDE_PATH是指linux内的环境变量吗？Windows MINGW环境应该是没有的吧？--->这个可以自己添加设置Windows的环境变量，我在用MinGW-w64配置C++ Boost库时使用过，是有效的

引用 11 楼 Intel0011 的回复:一、双引号和尖括号引用头文件的区别 对于双引号和尖括号包含的头文件的搜索方式有细微差别， 前者的搜索路径选择先后为：使用#include的文件所在的当前路径，-I指定的路径，环境变量C_INCLUDE_PATH或CPLUS_INCLUDE_PATH包含的路径，内定路径； 而后者就只有三种，依次是-I指定的路径，环境变量C_INCLUDE_PATH或CPLUS_INCLUDE_PATH包含的路径，内定路径。  着重介绍后者的那三种选择： ●-I参数指定的路径； ●环境变量C_INCLUDE_PATH或CPLUS_INCLUDE_PATH包含的路径； ●内定路径。 前两种可由我们自己指定哪些路径，第三种是gcc内置的，用户改变不了。  二、-I参数指定的路径 -I参数的用法为gcc <filename> -I <pathname_1> -I <pathname_2>，-I后边只能紧跟一个路径名，想要手动指定几个头文件搜索路径，就得写几个-I。 gcc hello.c -I ~/mydir1 -I ~/mydir2  三、环境变量C_INCLUDE_PATH或CPLUS_INCLUDE_PATH包含的路径 gcc在搜索完-I参数指定路径后，便会查看环境变量C_INCLUDE_PATH或CPLUS_INCLUDE_PATH包含的路径， 这两个环境变量都是路径的集合，我们可以手动往这两个环境变量里添加路径。  以C_INCLUDE_PATH为例，添加路径有两种方法，如果该新增路径只是临时需要，则可以在命令行输入 echo C_INCLUDE_PATH=$C_INCLUDE_PATH:<pathname> 如果是长期需要，则应在~/.bashrc或/etc/profile添加export C_INCLUDE_PATH=$C_INCLUDE_PATH:<pathname> 然后保存并退出文件，在命令行中执行命令source ~/.bashrc或source /etc/profile。  四、内定路径 第三种的内定路径无法更改，但可以查看，如何查看呢？ 可先随便写一个C文件，然后在命令行执行命令gcc <filename> -v 以显示整个编译过程。显示内容有一行是#include <...> search starts here:， mingw64(gcc-10.2.0)\bin\../lib/gcc/x86_64-w64-mingw32/10.2.0/include mingw64(gcc-10.2.0)\bin\../lib/gcc/x86_64-w64-mingw32/10.2.0/include-fixed mingw64(gcc-10.2.0)\bin\../lib/gcc/x86_64-w64-mingw32/10.2.0/../../../../x86_64-w64-mingw32/include   还是老哥你给力  环境变量C_INCLUDE_PATH、CPLUS_INCLUDE_PATH是指linux内的环境变量吗？Windows MINGW环境应该是没有的吧？

应该是命令行吧

搜索的头文件和库路径是由配置决定的。windows下也有配置的地方。  Linux下也是有配置系统的路径，比如/usr/include/   #头文件 /lib/   #库  建议搜一下头文件和库配置路径的地方～

引用 3 楼 forever74 的回复:当然了，环境变量也是有来源的，脚本或注册表都有可能。 但是修改过来源以后往往需要重启系统才好看到环境变量的改变。 你确定是在Windows环境吗？

引用 1 楼 user-7 的回复:环境变量 C_INCLIDE_PATH MINGW，Windows环境，我没找到该环境变量

下载mingw的源码看一下就知道了

供参考：https://blog.csdn.net/qinglinsan/article/details/11478091 http://www.360doc.com/content/16/0928/00/7991404_594388737.shtml

环境变量了解一下？

环境变量 C_INCLIDE_PATH


Question: 请问错误在哪里，求教！！！

出现中文的右括号了吧  建议注意下括号的中英文。  另外， main的返回值类型加一下，根据你的编译器来定，可以用void，也可以用int，根据你的编译器来定吧～

看编译窗口的错误提示，error 那行告诉你错哪了

你那行的 ) 是否是中文字符？ 猜的

你的printf后面括号里中间部位的逗号太胖了，大概率是中文的。

引用 2 楼 focuslight 的回复:你那行的 ) 是否是中文字符？ 猜的  如果括号是中文的，那么VC6这么老的编译器就不会认识它，只会用十六进制内码来表示它。


Question: 求助

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

引用 4 楼 user-3 的回复:[quote=引用 3 楼 自信男孩 的回复:][quote=引用 2 楼 user-3 的回复:]输入输出更可靠点，修改楼上的：#include <stdio.h>  int main() {     int  a, b, c;     char ch[2]={'Y'};      while(ch[0]=='Y'|| ch[0]=='y'){           while (1){                       //输入                 printf("输入三角形的三条边(正整数)：");                 fflush(stdout);                 rewind(stdin);                 if (scanf("%d%d%d", &a,&b,&c) != 3 || a < 0 || b < 0 || c < 0){                     printf("\n输入错误!\n");                     continue;                 }else                 if (a+b<=c || a+c<=b || b+c<=a){ //判断是否可构成三角形,任意两边之和大于第三边                     printf("\n输入的边长无法构成三角形!\n");                     continue;                 }else                     break;           }           if (a == b || a == c || b == c){//判断三角形类型              if (a==b && b==c && a==c){                 printf("\n输入的边长为等边三角形\n");              }else{                 printf("\n输入的边长为等腰三角形\n");              }           }           else              if (a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a){                 printf("\n输入的边长为直角三角形\n");              }else{                 printf("\n输入的边长为任意三角形\n");              }           printf("\n是否继续判断其它三角形的类型[Y/N]?");           fflush(stdout);           rewind(stdin);           scanf("%s",ch);     }          return 0; } 输入0之后，只要有一个0是不是就应该不满足条件。没考虑到输入0的case吧[/quote] 0还是排除在外的，这里if (a+b<=c || a+c<=b || b+c<=a){ //判断是否可构成三角形,任意两边之和大于第三边[/quote]   if (scanf("%d%d%d", &a,&b,&c) != 3 || a < 0 || b < 0 || c < 0){ 放在这里判断会更好些～   if (scanf("%d%d%d", &a,&b,&c) != 3 || a <= 0 || b <= 0 || c <= 0){

引用 3 楼 自信男孩 的回复:[quote=引用 2 楼 user-3 的回复:]输入输出更可靠点，修改楼上的：#include <stdio.h>  int main() {     int  a, b, c;     char ch[2]={'Y'};      while(ch[0]=='Y'|| ch[0]=='y'){           while (1){                       //输入                 printf("输入三角形的三条边(正整数)：");                 fflush(stdout);                 rewind(stdin);                 if (scanf("%d%d%d", &a,&b,&c) != 3 || a < 0 || b < 0 || c < 0){                     printf("\n输入错误!\n");                     continue;                 }else                 if (a+b<=c || a+c<=b || b+c<=a){ //判断是否可构成三角形,任意两边之和大于第三边                     printf("\n输入的边长无法构成三角形!\n");                     continue;                 }else                     break;           }           if (a == b || a == c || b == c){//判断三角形类型              if (a==b && b==c && a==c){                 printf("\n输入的边长为等边三角形\n");              }else{                 printf("\n输入的边长为等腰三角形\n");              }           }           else              if (a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a){                 printf("\n输入的边长为直角三角形\n");              }else{                 printf("\n输入的边长为任意三角形\n");              }           printf("\n是否继续判断其它三角形的类型[Y/N]?");           fflush(stdout);           rewind(stdin);           scanf("%s",ch);     }          return 0; } 输入0之后，只要有一个0是不是就应该不满足条件。没考虑到输入0的case吧[/quote] 0还是排除在外的，这里if (a+b<=c || a+c<=b || b+c<=a){ //判断是否可构成三角形,任意两边之和大于第三边

引用 2 楼 user-3 的回复:输入输出更可靠点，修改楼上的：#include <stdio.h>  int main() {     int  a, b, c;     char ch[2]={'Y'};      while(ch[0]=='Y'|| ch[0]=='y'){           while (1){                       //输入                 printf("输入三角形的三条边(正整数)：");                 fflush(stdout);                 rewind(stdin);                 if (scanf("%d%d%d", &a,&b,&c) != 3 || a < 0 || b < 0 || c < 0){                     printf("\n输入错误!\n");                     continue;                 }else                 if (a+b<=c || a+c<=b || b+c<=a){ //判断是否可构成三角形,任意两边之和大于第三边                     printf("\n输入的边长无法构成三角形!\n");                     continue;                 }else                     break;           }           if (a == b || a == c || b == c){//判断三角形类型              if (a==b && b==c && a==c){                 printf("\n输入的边长为等边三角形\n");              }else{                 printf("\n输入的边长为等腰三角形\n");              }           }           else              if (a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a){                 printf("\n输入的边长为直角三角形\n");              }else{                 printf("\n输入的边长为任意三角形\n");              }           printf("\n是否继续判断其它三角形的类型[Y/N]?");           fflush(stdout);           rewind(stdin);           scanf("%s",ch);     }          return 0; } 输入0之后，只要有一个0是不是就应该不满足条件。没考虑到输入0的case吧

供参考：#include <stdio.h>  int main() {     int  a, b, c;     char s='Y';      while(s=='Y'|| s=='y'){           while (1){                       //输入                 printf("输入三角形的三条边(正整数)：");                 if (scanf("%d%d%d", &a,&b,&c) != 3 || a < 0 || b < 0 || c < 0){                     while ((getchar())!='\n');                     printf("\n输入错误!\n");                     continue;                 }else                 if (a+b<=c || a+c<=b || b+c<=a){ //判断是否可构成三角形,任意两边之和大于第三边                     printf("\n输入的边长无法构成三角形!\n");                     continue;                 }else                     break;           }           if (a == b || a == c || b == c){//判断三角形类型              if (a==b && b==c && a==c){                 printf("\n输入的边长为等边三角形\n");              }else{                 printf("\n输入的边长为等腰三角形\n");              }           }           else              if (a*a+b*b==c*c || a*a+c*c==b*b || b*b+c*c==a*a){                 printf("\n输入的边长为直角三角形\n");              }else{                 printf("\n输入的边长为任意三角形\n");              }           printf("\n是否继续判断其它三角形的类型[Y/N]?");           getchar();           scanf("%c",&s);     }          return 0; }


Question: 【C语言求助】

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

再读密码循环前，再加个getchar()，把前面的回车读掉，用getchar()都要注意这个问题。  引用 楼主 飞禽走兽卍一2b 的回复:（本代码目的是将输入的字符换成后面第四个字母，China——>Glmre，前面那段代码是并列执行的，便于让各位看到结果的差异，即口Glmre）  问题描述： 当独立执行第二段代码时输出：Glmre 当和第一段代码并列执行时输出：口Glmr   #include <math.h> #include <stdio.h> int main(void) {     //以下为并列的代码，不是主要问题    {                   printf("hw 3.2\n");            float way,temp;             printf("请输入金额：\n");             scanf("%f",&temp);            printf("请输入存款方式(1-5)：\n");                         scanf("%f",&way);              if(way==1)                  {                   temp*=(1+5*0.03);                  printf("result= %f \n\n",temp);            }            else if(way==2)          {                 temp*=(1+2*0.021);                                                 temp*=(1+3*0.0275);                printf("result= %f \n\n",temp);          }           else if(way==3)           {                   temp*=(1+3*0.0275);                                       temp*=(1+2*0.021);                printf("result= %f \n\n",temp);          }           else if(way==4)         {                  temp*=pow(1.015,5);                printf("result= %f \n\n",temp);         }          else         {                temp*=pow(1+0.0035/4,20);                               printf("result=%f \n\n",temp);          }       }    //以下为提问的代码     {          printf("hw 3.6\n");                 printf("请输入五位数密码：\n");                 char c[5];          int i;    getchar(); //这里要加个getchar()把前面的回车读掉，才是你这个问题的根本原因          for(i=0;i<5;i++)      //for循环输入多个字符        {                   c[i]=getchar();   //将输入的字符赋给变量        }               for(i=0;i<5;i++)         {                     c[i]=c[i]+4;         //将输入的字符换成后面第四个                              //c[5]='\0';           这里越界了，但不是根本问题             putchar(c[i]);         }                 putchar('\n');      }  } 请大家帮忙看看是哪的问题，谢谢！

引用 5 楼 飞禽走兽卍一2b 的回复:[quote=引用 3 楼 自信男孩的回复:]#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h>   #define FILE_NAME_LEN    32 #define MAX_KEY_NUM     26 enum { 	ENCRYPT_DATA = 1, 	DECRYPT_DATA, 	FORCE_DECRYPT_DATA,     EXIT_PROCESS };   /*加密函数，把字符向右循环移位n*/ char encrypt(char ch, int n) {     while(ch >= 'A' && ch <= 'Z') {         return ('A'+(ch-'A'+n)%26);     }     while(ch >= 'a' && ch <= 'z') {         return ('a'+(ch-'a'+n)%26);     }     return ch; }  /*菜单，1.加密，2.解密，3.暴力破解，密码只能是数字*/ static void menu(void) {     printf("\n=========================================================");     printf("\n1.Encrypt the file");     printf("\n2.Decrypt the file");     printf("\n3.Force decrypt file");     printf("\n4.Quit\n");     printf("=========================================================\n");      return; }  static int get_opt(void) {     int option, ret;      printf("Please input your choice: ");     ret = scanf("%d", &option);     while (ret != 1) {         printf("Please input your choice: ");         ret = scanf("%d", &option);     }      return option; }  /* Open a file, then return file decription. */ static FILE *open_file(const char *filename, const char *openmode) { 	FILE *fp = NULL;  	fp = fopen(filename, openmode); 	if(!fp) {        	printf("Can not open the outfile: %s, %s!\n", filename, strerror(errno)); 		exit(0);     }  	return fp; }  /* Copy data from source file to destination file. */ int copy_data(FILE *src_fp, FILE *dst_fp, int key) { 	int data, cnt = 0;  	while(!feof(src_fp)) {	/* 加密 */         data = encrypt(fgetc(src_fp), key);         if (data != EOF) {             putchar(data);             fputc(data, dst_fp); 		    cnt++;         } 	}   	return cnt; }  int main(int argc, const char *argv[]) {     char src_file[FILE_NAME_LEN];     char dst_file[FILE_NAME_LEN];     FILE *src_fp, *dst_fp;     int option, key, ret;     int total_num, i;      while (1) {         menu();         option = get_opt();         if (option == EXIT_PROCESS) {             printf("Goodbye!\n");             break;         }         printf("Please input src file: ");         scanf("%s", src_file);         src_fp = open_file(src_file, "r");         if (!src_fp)             return 1;         printf("Please input dst file: ");         scanf("%s", dst_file);         dst_fp = open_file(dst_file, "w");         if (!dst_fp) {             fclose(src_fp);             return 1;         }         if (option != FORCE_DECRYPT_DATA) {             printf("Please input the key: ");             ret = scanf("%d", &key);             while (ret != 1) {                 printf("Please input the key: ");                 ret = scanf("%d", &key);             }         }         switch (option) {         case ENCRYPT_DATA:             total_num = copy_data(src_fp, dst_fp, key);             printf("Encrypt %d character(s)\n", total_num); 	        fclose(src_fp); 	        fclose(dst_fp);             break;          case DECRYPT_DATA:             key = 26 - key;             total_num = copy_data(src_fp, dst_fp, key);             printf("Encrypt %d character(s)\n", total_num); 	        fclose(src_fp); 	        fclose(dst_fp);             break;          case FORCE_DECRYPT_DATA:             for (i = 1; i < MAX_KEY_NUM; i++) {                 fseek(src_fp, 0l, SEEK_SET);                 fseek(dst_fp, 0l, SEEK_SET);                 total_num = copy_data(src_fp, dst_fp, 26-i);                 printf("Current encrypt's key is %d\n", i);                 printf("Encrypt %d character(s)\n", total_num);                 printf("Press 'Q' to quit and other key to continue......\n");                 option = getchar();                 if (option == 'Q' || option == 'q') {                     break;                 }             } 	        fclose(src_fp); 	        fclose(dst_fp);             break;         }         printf("\nEncrypt is over!\n");      }     return 0; }  供参考～ 看不懂不过还是谢谢啦！[/quote]  只看加密和解密部分吧，其他的不用考虑～

引用 3 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> #include <errno.h>   #define FILE_NAME_LEN    32 #define MAX_KEY_NUM     26 enum { 	ENCRYPT_DATA = 1, 	DECRYPT_DATA, 	FORCE_DECRYPT_DATA,     EXIT_PROCESS };   /*加密函数，把字符向右循环移位n*/ char encrypt(char ch, int n) {     while(ch >= 'A' && ch <= 'Z') {         return ('A'+(ch-'A'+n)%26);     }     while(ch >= 'a' && ch <= 'z') {         return ('a'+(ch-'a'+n)%26);     }     return ch; }  /*菜单，1.加密，2.解密，3.暴力破解，密码只能是数字*/ static void menu(void) {     printf("\n=========================================================");     printf("\n1.Encrypt the file");     printf("\n2.Decrypt the file");     printf("\n3.Force decrypt file");     printf("\n4.Quit\n");     printf("=========================================================\n");      return; }  static int get_opt(void) {     int option, ret;      printf("Please input your choice: ");     ret = scanf("%d", &option);     while (ret != 1) {         printf("Please input your choice: ");         ret = scanf("%d", &option);     }      return option; }  /* Open a file, then return file decription. */ static FILE *open_file(const char *filename, const char *openmode) { 	FILE *fp = NULL;  	fp = fopen(filename, openmode); 	if(!fp) {        	printf("Can not open the outfile: %s, %s!\n", filename, strerror(errno)); 		exit(0);     }  	return fp; }  /* Copy data from source file to destination file. */ int copy_data(FILE *src_fp, FILE *dst_fp, int key) { 	int data, cnt = 0;  	while(!feof(src_fp)) {	/* 加密 */         data = encrypt(fgetc(src_fp), key);         if (data != EOF) {             putchar(data);             fputc(data, dst_fp); 		    cnt++;         } 	}   	return cnt; }  int main(int argc, const char *argv[]) {     char src_file[FILE_NAME_LEN];     char dst_file[FILE_NAME_LEN];     FILE *src_fp, *dst_fp;     int option, key, ret;     int total_num, i;      while (1) {         menu();         option = get_opt();         if (option == EXIT_PROCESS) {             printf("Goodbye!\n");             break;         }         printf("Please input src file: ");         scanf("%s", src_file);         src_fp = open_file(src_file, "r");         if (!src_fp)             return 1;         printf("Please input dst file: ");         scanf("%s", dst_file);         dst_fp = open_file(dst_file, "w");         if (!dst_fp) {             fclose(src_fp);             return 1;         }         if (option != FORCE_DECRYPT_DATA) {             printf("Please input the key: ");             ret = scanf("%d", &key);             while (ret != 1) {                 printf("Please input the key: ");                 ret = scanf("%d", &key);             }         }         switch (option) {         case ENCRYPT_DATA:             total_num = copy_data(src_fp, dst_fp, key);             printf("Encrypt %d character(s)\n", total_num); 	        fclose(src_fp); 	        fclose(dst_fp);             break;          case DECRYPT_DATA:             key = 26 - key;             total_num = copy_data(src_fp, dst_fp, key);             printf("Encrypt %d character(s)\n", total_num); 	        fclose(src_fp); 	        fclose(dst_fp);             break;          case FORCE_DECRYPT_DATA:             for (i = 1; i < MAX_KEY_NUM; i++) {                 fseek(src_fp, 0l, SEEK_SET);                 fseek(dst_fp, 0l, SEEK_SET);                 total_num = copy_data(src_fp, dst_fp, 26-i);                 printf("Current encrypt's key is %d\n", i);                 printf("Encrypt %d character(s)\n", total_num);                 printf("Press 'Q' to quit and other key to continue......\n");                 option = getchar();                 if (option == 'Q' || option == 'q') {                     break;                 }             } 	        fclose(src_fp); 	        fclose(dst_fp);             break;         }         printf("\nEncrypt is over!\n");      }     return 0; }  供参考～ 看不懂不过还是谢谢啦！

引用 2 楼 paena的回复:再读密码循环前，再加个getchar()，把前面的回车读掉，用getchar()都要注意这个问题。  [quote=引用 楼主 飞禽走兽卍一2b 的回复:]（本代码目的是将输入的字符换成后面第四个字母，China——>Glmre，前面那段代码是并列执行的，便于让各位看到结果的差异，即口Glmre）  问题描述： 当独立执行第二段代码时输出：Glmre 当和第一段代码并列执行时输出：口Glmr   #include <math.h> #include <stdio.h> int main(void) {     //以下为并列的代码，不是主要问题    {                   printf("hw 3.2\n");            float way,temp;             printf("请输入金额：\n");             scanf("%f",&temp);            printf("请输入存款方式(1-5)：\n");                         scanf("%f",&way);              if(way==1)                  {                   temp*=(1+5*0.03);                  printf("result= %f \n\n",temp);            }            else if(way==2)          {                 temp*=(1+2*0.021);                                                 temp*=(1+3*0.0275);                printf("result= %f \n\n",temp);          }           else if(way==3)           {                   temp*=(1+3*0.0275);                                       temp*=(1+2*0.021);                printf("result= %f \n\n",temp);          }           else if(way==4)         {                  temp*=pow(1.015,5);                printf("result= %f \n\n",temp);         }          else         {                temp*=pow(1+0.0035/4,20);                               printf("result=%f \n\n",temp);          }       }    //以下为提问的代码     {          printf("hw 3.6\n");                 printf("请输入五位数密码：\n");                 char c[5];          int i;    getchar(); //这里要加个getchar()把前面的回车读掉，才是你这个问题的根本原因          for(i=0;i<5;i++)      //for循环输入多个字符        {                   c[i]=getchar();   //将输入的字符赋给变量        }               for(i=0;i<5;i++)         {                     c[i]=c[i]+4;         //将输入的字符换成后面第四个                              //c[5]='\0';           这里越界了，但不是根本问题             putchar(c[i]);         }                 putchar('\n');      }  } 请大家帮忙看看是哪的问题，谢谢！   [/quote] 谢谢！现在知道了

引用 楼主 飞禽走兽卍一2b 的回复:（本代码目的是将输入的字符换成后面第四个字母，China——>Glmre，前面那段代码是并列执行的，便于让各位看到结果的差异，即口Glmre）  问题描述： 当独立执行第二段代码时输出：Glmre 当和第一段代码并列执行时输出：口Glmr   #include <math.h> #include <stdio.h> int main(void) {     //以下为并列的代码，不是主要问题    {                   printf("hw 3.2\n");            float way,temp;             printf("请输入金额：\n");             scanf("%f",&temp);            printf("请输入存款方式(1-5)：\n");                         scanf("%f",&way);              if(way==1)                  {                   temp*=(1+5*0.03);                  printf("result= %f \n\n",temp);            }            else if(way==2)          {                 temp*=(1+2*0.021);                                                 temp*=(1+3*0.0275);                printf("result= %f \n\n",temp);          }           else if(way==3)           {                   temp*=(1+3*0.0275);                                       temp*=(1+2*0.021);                printf("result= %f \n\n",temp);          }           else if(way==4)         {                  temp*=pow(1.015,5);                printf("result= %f \n\n",temp);         }          else         {                temp*=pow(1+0.0035/4,20);                               printf("result=%f \n\n",temp);          }       }    //以下为提问的代码     {          printf("hw 3.6\n");                 printf("请输入五位数密码：\n");                 char c[5];          int i;                 for(i=0;i<5;i++)      //for循环输入多个字符        {                   c[i]=getchar();   //将输入的字符赋给变量        }               for(i=0;i<5;i++)         {                     c[i]=c[i]+4;         //将输入的字符换成后面第四个                              c[5]='\0'; 这里对数组越界操作，这句也是多余的，删除就好了                     putchar(c[i]);         }                 putchar('\n');      }  } 请大家帮忙看看是哪的问题，谢谢！


Question: 队列操作问题

大佬们都好厉害，小弟前来学习学习，大家共同一起进步！！！！

引用 9 楼 Zhi Zhao 的回复:但是这个是循环队列，数组的容量并没有增加   #include<stdio.h> #include<stdlib.h>  typedef int ElementType; typedef struct {     ElementType *array;     int front;     int rear;     int capacity;   // 队列总容量 }SeqQueue;  // 循环队列的创建 SeqQueue *createQueue(int capacity) {     SeqQueue *q;     q=(SeqQueue *)malloc(sizeof(SeqQueue));      q->front=q->rear=0;     q->capacity=capacity;     q->array=(ElementType *)malloc(sizeof(ElementType)*capacity);      return q; }  // 入队 int push(SeqQueue *q,ElementType x) {     if( (q->rear+1) % q->capacity == q->front){         q->array[q->rear]=x;         q->rear=(q->rear+1) % q->capacity;         return 0;     }       // 队列已满     printf("+++%d\n", x);     q->array[q->rear]=x;     q->rear=(q->rear+1) % q->capacity;      return 1; }  // 出队 int pop(SeqQueue *q,ElementType *x) {     if(q->rear == (q->front + 1) % q->capacity)     // 队列为空     {         *x = q->array[q->front];         q->front=(q->front+1) % q->capacity;         return 0;     }     *x = q->array[q->front];     q->front=(q->front+1) % q->capacity;      return 1; }  int main() {     int b,i,N;     SeqQueue *p;      printf("请输入数组的大小：\n");     scanf("%d",&N);     printf("\n");     p=createQueue(N);      printf("请输入数字：\n");     for(i=0;i<N;i++)     {         scanf("%d",&b);         push(p,b);     }     printf("front = %d,rear= %d\n", p->front, p->rear);     while(pop(p,&b))     {         printf("%d ",b);     }     printf("%d\n", b);     return 0; }  供参考～

假设数组的容量为4(下标0-3)，因为队列下标的问题，所以这句    if( (q->rear+1) % q->capacity == q->front) // 队列已满         return 0;的判断必须是+1的，所以当队列下标到3的时候，正确的判断是队列未满的，但这里的判断是队列已满的条件了。

但是这个是循环队列，数组的容量并没有增加

见注释，供参考：#include<stdio.h> #include<stdlib.h>  typedef int ElementType;  typedef struct {     ElementType *array;     int         front;     int         rear;     int         capacity;   // 队列总容量 }SeqQueue;  // 循环队列的创建 SeqQueue *createQueue(int capacity) {     SeqQueue *q;     q=(SeqQueue *)malloc(sizeof(SeqQueue));      q->front=q->rear=0;     q->capacity=capacity+1; //这里要和入队，出队时的+1同步     q->array=(ElementType *)malloc(sizeof(ElementType)*capacity);     return q; }  // 入队 int push(SeqQueue *q,ElementType x) {     if( (q->rear+1) % q->capacity == q->front) // 队列已满         return 0;     q->array[q->rear]=x;     q->rear=(q->rear+1) % q->capacity;     return 1; }  // 出队 int pop(SeqQueue *q,ElementType *x) {     if (q->rear==q->front)     // 队列为空        return 0;     *x=q->array[q->front];     q->front=(q->front+1) % q->capacity;     return 1; }  int main() {     int b,i,N;     SeqQueue *p;      printf("请输入数组的大小：\n");     scanf("%d",&N);     printf("\n");     p=createQueue(N);      printf("请输入数字：\n");     for (i=0;i<N;i++)         {            scanf("%d",&b);            push(p,b);         }     while(pop(p,&b))        {           printf("%d ",b);        }     printf("\n");          return 0; }

#include<stdio.h> #include<stdlib.h>  typedef int ElementType; typedef struct { 	ElementType *array; 	int front; 	int rear; 	int capacity;   // 队列总容量 }SeqQueue;  // 循环队列的创建 SeqQueue *createQueue(int capacity) { 	SeqQueue *q; 	q=(SeqQueue *)malloc(sizeof(SeqQueue));  	q->front=q->rear=0; 	q->capacity=capacity; 	q->array=(ElementType *)malloc(sizeof(ElementType)*capacity);  	return q; }  // 入队 int push(SeqQueue *q,ElementType x) { 	if( (q->rear+1) % q->capacity == q->front)       // 队列已满 		return 0; 	q->array[q->rear]=x; 	q->rear=(q->rear+1) % q->capacity;  	return 1; }  // 出队 int pop(SeqQueue *q,ElementType *x) { 	if(q->rear==q->front)     // 队列为空 		return 0; 	*x=q->array[q->front]; 	q->front=(q->front+1) % q->capacity;  	return 1; }  int main() { 	int b,i,N; 	SeqQueue *p;  	printf("请输入数组的大小：\n"); 	scanf("%d",&N); 	printf("\n"); 	p=createQueue(N);  	printf("请输入数字：\n"); 	for(i=0;i<N;i++) 	{ 		scanf("%d",&b); 		push(p,b); 	} 	while(pop(p,&b)) 	{ 		printf("%d ",b); 	} 	printf("\n"); 	return 0; }

到pop(SeqQueue* Q, int* e)这个函数里面找问题，估计边界判断错了。

代码不全不能准确定位到问题所在～

阅，再接再厉，再创辉煌。


Question: C语言求助

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

#include<algorithm> #include<cstdio> #include <math.h>  using namespace std;  int is_prime(int n); static void swap(int *a, int *b);  int main() {     int i = 2, j = 0;     int left, right, cnt = 0;      scanf("%d%d", &left, &right);      if (left > right)         swap(&left, &right);     while (1) {         if (is_prime(i)) {             cnt++;             if (left <= cnt && cnt <= right) {                 j++;                 printf("%d%c", i, j% 10 ? ' ':'\n');             }             if (cnt > right)                 break;         }         i++;     }     putchar(10);      /*        int left,right,t=0,order=1,j=0;        bool re=false;        int ss[10001];        ss[0]=2;        scanf("%d%d",&left,&right);        if(!left){        left=1;        }        for(int i=2;order<right;i++)        {        for( j=2;j<=sqrt(i);j++){        if(i%j==0)        {        re=false;        break;        }        }        if(re){        ss[order++]=i;        }        re=true;        }        left-=1;        right-=1;        while(left<=right){        t++;        if(t%10==0||left==right){        t=0;        }         printf("%d%c",ss[left++],t?'*':'\0');         if(t==0)printf("\n");     }     */     return 0; }  int is_prime(int n) {     int i;      if (n <= 1)         return 0;      for (i = 2; i <= sqrt(n); i++) {         if (n % i == 0)             return 0;     }      return 1; }  static void swap(int *a, int *b) {     int tmp = *a;     *a = *b;     *b = tmp; }  供参考～  没用数组，只用了循环～

引用 1 楼 赵4老师 的回复:#include <algorithm> #include <cstdio> #include <math.h> using namespace std; int main(){     int left,right,t=0,order=1,j=0;     bool re=false;     int ss[10001];     ss[0]=2;     scanf("%d%d",&left,&right);     if (!left) {         left=1;     }     for (int i=2;order<right;i++) {         for (j=2;j<=sqrt(i);j++) {             if (i%j==0) {                 re=false;                 break;             }         }         if (re) {             ss[order++]=i;         }         re=true;     }     left-=1;     right-=1;     while (left<=right) {         t++;         if (t%10==0 || left==right ) {             t=0;         }         if (t==0) {             printf("%d\n",ss[left++]);         } else {             printf("%d ",ss[left++]);         }     }     return 0; } 你好我试了你的通过了，我能问问我的代码和你的有什么区别吗，感觉没有区别最后面

引用 2 楼 棉猴 的回复:代码没问题啊

引用 2 楼 棉猴 的回复:代码没问题啊 但是会有2个测试点过不了

代码没问题啊


Question: 【C语言求助】和其他代码并列执行此代码时输出空心方框

引用 9 楼 user-2的回复:供参考：#include <math.h> #include <stdio.h> int main(void) {  //以下为并列的代码，不是主要问题    {           printf("hw 3.2\n");           float way,temp;           printf("请输入金额：\n");           scanf("%f",&temp);           printf("请输入存款方式(1-5)：\n");           scanf("%f",&way);           if(way==1)           {                 temp*=(1+5*0.03);                 printf("result= %f \n\n",temp);           }           else if(way==2)          {               temp*=(1+2*0.021);               temp*=(1+3*0.0275);               printf("result= %f \n\n",temp);          }          else if(way==3)         {               temp*=(1+3*0.0275);               temp*=(1+2*0.021);               printf("result= %f \n\n",temp);         }           else if(way==4)         {                  temp*=pow(1.015,5);                printf("result= %f \n\n",temp);         }          else         {               temp*=pow(1+0.0035/4,20);                               printf("result=%f \n\n",temp);          }       }      getchar();//这里加一句，吸收前面输入过程中留在缓冲区多余的字符。  //以下为提问的代码     {          printf("hw 3.6\n");                 printf("请输入五位数密码：\n");                 char c[5];          int i;                 for(i=0;i<5;i++)      //for循环输入多个字符        {                   c[i]=getchar();      //将输入的字符赋给变量     }               for(i=0;i<5;i++)         {                     c[i]=c[i]+4;         //将输入的字符换成后面第四个                                                   //c[5]='\0';          putchar(c[i]);     }                 putchar('\n');     }     system("pause");     return 0; }    //hw 3.2 //请输入金额： //3.4 //请输入存款方式(1-5)： //5 //result=3.459997  //hw 3.6 //请输入五位数密码： //China //Glmre //请按任意键继续. . . 哇⊙∀⊙！太棒了！ 请问这里“留在前面缓冲区的字符”是什么？从哪里来的？ 谢谢！

引用 7 楼 user-2的回复:错误用红字标出：引用飞禽走兽卍一2b 等级 	 #include <math.h> #include <stdio.h> int main(void) {     //以下为并列的代码，不是主要问题    {                   printf("hw 3.2\n");            float way,temp;             printf("请输入金额：\n");             scanf("%f",&temp);            printf("请输入存款方式(1-5)：\n");                         scanf("%f",&way);              if(way==1)                  {                   temp*=(1+5*0.03);                  printf("result= %f \n\n",temp);            }            else if(way==2)          {                 temp*=(1+2*0.021);                                                 temp*=(1+3*0.0275);                printf("result= %f \n\n",temp);          }           else if(way==3)           {                   temp*=(1+3*0.0275);                                       temp*=(1+2*0.021);                printf("result= %f \n\n",temp);          }           else if(way==4)         {                  temp*=pow(1.015,5);                printf("result= %f \n\n",temp);         }          else         {                temp*=pow(1+0.0035/4,20);                               printf("result=%f \n\n",temp);          }       }    //以下为提问的代码     {          printf("hw 3.6\n");                 printf("请输入五位数密码：\n");                 char c[5];          int i;                 for(i=0;i<5;i++)      //for循环输入多个字符        {                   c[i]=getchar();   //将输入的字符赋给变量        }               for(i=0;i<5;i++)         {                     c[i]=c[i]+4;         //将输入的字符换成后面第四个                              c[5]='\0'; //这里多了对c[5]数组的操作，而且下标为5，下标越界。                      putchar(c[i]);         }                 putchar('\n');      }  } 还是不行。。。X﹏X 输出结果是 口Glmr

引用 4 楼 user-2的回复:当和其他代码并列执行？把代码补全贴上来看看。这里对c[5]数组的操作，下标0-4，或者你不能按字符串的形式输出。 放在评论区里了

#include <math.h> #include <stdio.h> int main(void) {     //以下为并列的代码，不是主要问题    {                   printf("hw 3.2\n");            float way,temp;             printf("请输入金额：\n");             scanf("%f",&temp);            printf("请输入存款方式(1-5)：\n");                         scanf("%f",&way);              if(way==1)                  {                   temp*=(1+5*0.03);                  printf("result= %f \n\n",temp);            }            else if(way==2)          {                 temp*=(1+2*0.021);                                                 temp*=(1+3*0.0275);                printf("result= %f \n\n",temp);          }           else if(way==3)           {                   temp*=(1+3*0.0275);                                       temp*=(1+2*0.021);                printf("result= %f \n\n",temp);          }           else if(way==4)         {                  temp*=pow(1.015,5);                printf("result= %f \n\n",temp);         }          else         {                temp*=pow(1+0.0035/4,20);                               printf("result=%f \n\n",temp);          }       }    //以下为提问的代码     {          printf("hw 3.6\n");                 printf("请输入五位数密码：\n");                 char c[5];          int i;                 for(i=0;i<5;i++)      //for循环输入多个字符        {                   c[i]=getchar();   //将输入的字符赋给变量        }               for(i=0;i<5;i++)         {                     c[i]=c[i]+4;         //将输入的字符换成后面第四个                              c[5]='\0';                       putchar(c[i]);         }                 putchar('\n');      }  }

引用 1 楼 user-2的回复:供参考：//问题描述： //当独立执行此段代码时输出：Glmre //当和其他代码并列执行时输出：口Glmr  #include <math.h> #include <stdio.h> int main(void) {      printf("hw 3.6\n");      printf("请输入五位数密码：\n");      char c[5];       //这里c[5],下标为c[0]---c[4]      int i;      for(i=0;i<5;i++)       //for(i=0;i<6;i++)          {         c[i]=getchar();           }      for(i=0;i<5;i++)     //for(i=0;i<6;i++)       {         c[i]=c[i]+4;                                //c[5]='\0'; //结束 总共5位的数组，c[5]下标越界了，没有放'\0'结束符的位置了,这是字符数组，                                       //没必要有结束标志。         putchar(c[i]);       }      putchar('\n');            return 0; }  //hw 3.6 //请输入五位数密码： //China                  （5位） //Glmre                   (5位） //请按任意键继续. . . 还是输出了口Glmre

引用 1 楼 user-2的回复:供参考：//问题描述： //当独立执行此段代码时输出：Glmre //当和其他代码并列执行时输出：口Glmr  #include <math.h> #include <stdio.h> int main(void) {      printf("hw 3.6\n");      printf("请输入五位数密码：\n");      char c[5];       //这里c[5],下标为c[0]---c[4]      int i;      for(i=0;i<5;i++)       //for(i=0;i<6;i++)          {         c[i]=getchar();           }      for(i=0;i<5;i++)     //for(i=0;i<6;i++)       {         c[i]=c[i]+4;                                //c[5]='\0'; //结束 总共5位的数组，c[5]下标越界了，没有放'\0'结束符的位置了,这是字符数组，                                       //没必要有结束标志。         putchar(c[i]);       }      putchar('\n');            return 0; }  //hw 3.6 //请输入五位数密码： //China                  （5位） //Glmre                   (5位） //请按任意键继续. . . 还是不行啊。。。

引用 11 楼 user-2的回复:代码里有输入金额、存款方式等，象我们敲完3.4，接下去就敲一个回车，这个回车其实也被读入的，这就是多余的字符。你可以百度下scanf()和getchar()等几个函数的详细用法，了解下输入输出时的一些细节的东西。 好的，谢谢！ (晚上早点睡哦)


Question: 软考的一道直接插入排序题有答案和解析但是看不懂

引用 1 楼 user-2 的回复：#include <stdio.h>  typedef struct node { 	char data; 	struct node* next; } NODE;  void print_list(char c, NODE* list) { 	printf("%c: ", c); 	while (list) { 		printf("[%d]->", list->data); 		list = list->next; 	} 	printf("NULL\n"); }  NODE* insert_sort(NODE* h) { 	NODE *t, *s, *u = NULL, *v; 	s = h->next; 	h->next = NULL; 	print_list('s', s); 	print_list('h', h); 	printf("\n"); 	while (s != NULL) { 		for (t = s, v = h; v != NULL && v->data < t->data; u = v, v = v->next) { 			; 		} 		s = s->next; 		if (v == h) { 			h = t; 		} else { 			u->next = t; 		} 		t->next = v; 		print_list('s', s); 		print_list('h', h); 		print_list('t', t); 		print_list('v', v); 		print_list('u', u); 		printf("\n"); 	} 	return h; }  NODE* insert(NODE* LIST, int n) { 	NODE* node = (NODE*)malloc(sizeof(NODE)); 	node->data = n; 	node->next = NULL; 	if (LIST) { 		node->next = LIST; 	} 	LIST = node; 	return LIST; }  int main() { 	NODE* list; 	list = NULL; 	list = insert(list, 1); 	list = insert(list, 5); 	list = insert(list, 4); 	list = insert(list, 2); 	list = insert(list, 3); 		 	printf("LIST"); 	print_list(' ', list); 	printf("\n\n");  	list = insert_sort(list);  	printf("LIST"); 	print_list(' ', list); 	printf("\n\n");  	return 0; }  输出结果为： LIST : [3]->[2]->[4]->[5]->[1]->NULL   s: [2]->[4]->[5]->[1]->NULL h: [3]->NULL  s: [4]->[5]->[1]->NULL h: [2]->[3]->NULL t: [2]->[3]->NULL v: [3]->NULL u: NULL  s: [5]->[1]->NULL h: [2]->[3]->[4]->NULL t: [4]->NULL v: NULL u: [3]->[4]->NULL  s: [1]->NULL h: [2]->[3]->[4]->[5]->NULL t: [5]->NULL v: NULL u: [4]->[5]->NULL  s: NULL h: [1]->[2]->[3]->[4]->[5]->NULL t: [1]->[2]->[3]->[4]->[5]->NULL v: [2]->[3]->[4]->[5]->NULL u: [4]->[5]->NULL  LIST : [1]->[2]->[3]->[4]->[5]->NULL  这题因为印刷排版和变量短名极不友好，我这里给你详细解析insert_sort函数里的逻辑。  首先传入一个NODE* h，加上临时指针 t s u v，这些指针既是链表的首元素，也可以是整个链表。  程序的19 20行 	s = h->next; 	h->next = NULL; 这两句，实际上把传入的h链表一分为二成为两个链表。 h作为一个有序链表，保留原来的第一个元素。s为无序链表。从第二个元素到最后，此时输出为： s: [2]->[4]->[5]->[1]->NULL h: [3]->NULL  往下走，24行 while (s != NULL) 这个循环的逻辑是遍历s里每一个NODE，比对h找到相应的位置插入。  25行 for (t = s, v = h; v != NULL && v->data < t->data; u = v, v = v->next) 书上有个分号，其实是空的，只执行for里的循环。 t指向s的第一个元素，这个指针不会移动。v指向h，会在比较大小的时候后移。 u在v移动时，会指向移动前的位置。换言之，u和v之间，要插入的位置。 至于插入哪一个，当然是t指向的那一个。  往下走，29行 if (v == h) 如果v指针没移动过，在h的头部插入t。 否则，在u和v之间插入t。  循环处理完s链表，s置空，h完成排序，返回。我靠大神！我慢慢来看


Question: 使用fprintf函数录入文件无法空格和换行是怎么回事

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

好了，不要再猜了，可能性太多。 例如，如果他写入的是个.html文件，双击打开后本来就应该是这样子的。

写文件时，与你打开文件时的方式相关，FILE *fp = fopen("filename","a")： r 打开只读文件，该文件必须存在。 r+ 打开可读写的文件，该文件必须存在。 w 打开只写文件，若文件存在则文件长度清为0，即该文件内容会消失。若文件不存在则建立该文件。 w+ 打开可读写文件，若文件存在则文件长度清为零，即该文件内容会消失。若文件不存在则建立该文件。 a 以附加的方式打开只写文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾，即文件原先的内容会被保留。 a+ 以附加方式打开可读写的文件。若文件不存在，则会建立该文件，如果文件存在，写入的数据会被加到文件尾后，即文件原先的内容会被保留。

引用 5 楼 ㌀㍿936 的回复:[quote=引用 1 楼 user-3 的回复:]供参考：{     fprintf(fp,"%s  %d\n",pMove->data.name,pMove->data.price);     pMove = pMove->next; } 我用的是dev c++ 与开发环境有没有关系？ [/quote]这段代码去试过了吗?和你用的dev c++与开发环境无关的。  参考：https://blog.csdn.net/shiroidea/article/details/113697496?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_utm_term-0&spm=1001.2101.3001.4242

引用 1 楼 user-3 的回复:供参考：{     fprintf(fp,"%s  %d\n",pMove->data.name,pMove->data.price);     pMove = pMove->next; } 我用的是dev c++ 与开发环境有没有关系？

引用 1 楼 user-3 的回复:供参考：{     fprintf(fp,"%s  %d\n",pMove->data.name,pMove->data.price);     pMove = pMove->next; } 没用啊。。。

fopen在哪？


Question: 指针指地址时，比如int型指针，但内存单元是1个字节，那这个int指针指的地址是4个字节中的第一个嘛？

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

如果你所谓“第一个”是指地址值最小的那个字节。那么你说对了。

可以这么理解，但是要注意大小端吧

始终要用4个字节，如果指向的类型是一个字节，则指向连续的四个字节，因此，可能导致程序运行不正确或者崩溃


Question: 求解答

int i=0x12345678； //假定 &i的值为0x006FFC1C 在内存中按地址从小到大排列： 大端存储 0x006FFC1C：12 0x006FFC1D：34 0x006FFC1E：56 0x006FFC1F：78 小端存储 0x006FFC1C：78 0x006FFC1D：56 0x006FFC1E：34 0x006FFC1F：12

int类型指针指向的是4字节（32位系统）的首地址，你的第一个是指第一个字节吧，可以这么理解。但是注意考虑大小端问题，第一个自己的位置可能不一样～

int i = 1; 	int* pi = &i;   从上图可以看到，int的指针pi的值是0x6FFC1C，而这个地址中保存的是一个字节，即0x01

啥叫第一个？ 如果意思是地址值最小的那个，那么这个int指针指的地址是4个字节中的第一个。


Question: 储存文件后为什么会乱码？求大佬解答

供参考：#include<stdio.h> #include<string.h> #include<stdlib.h>  struct Telephone{       char   number[20];       char   name[20];       char   sex[20];       char   age[20];       char   speciaity[20];       char   Class[20];       struct Telephone *next; };  typedef struct Telephone TEL; TEL *head=NULL;  void showmenu(); //菜单 void Appenditem();//添加学生信息 void print();  //浏览所有学生信息 void Finditem1(); //查找学生信息 （按学号） void Finditem2(); //查找学生信息 （按姓名） void Removeitem();//删除学生信息 void Saveandfree();//保存到文件 void Open();//打开文件   int main(int argc, char* argv[]) {      char ch;      Open();   //打开文件      while(1){            showmenu(); //显示菜单            scanf(" %c",&ch);            switch(ch){                  case '1':Appenditem(); //添加学生信息                           break;                  case '2':print();      //浏览所有学生信息                           break;                  case '3':Finditem1();  //查找学生信息1.按学号                           break;                  case '4':Finditem2();  //查找学生信息2.按姓名                           break;                  case '5':Removeitem(); //删除学生信息信息                           print();      //输出删除后的结果                           break;                  case '0':Saveandfree();//保存并释放内存                           exit(0);      //退出系统                           break;                  default:                           printf("选择错误!");                           break;            }      } }  //菜单 void showmenu() {      printf("\n*****************欢迎使用学生信息管理系统*****************\n");      printf("\n*****************根据主菜单提示选择所想要的操作*****************\n");      printf("\t1.添加学生信息\n");      printf("\t2.浏览所有学生信息\n");      printf("\t3.按学号查询学生信息\n");      printf("\t4.按姓名查询学生信息\n");      printf("\t5.删除学生信息\n");      printf("\t0.保存并退出系统！\n");      printf("*************************************************\n");      printf("\t请选择：\n"); }  //添加学生信息 void Appenditem() {      TEL *p1=NULL,*p2=NULL;      p1=(TEL *)malloc(sizeof(TEL));//申请结点      printf("输入学号:\n");        //添加信息      scanf("%s",p1->number);      printf("输入姓名：\n");      scanf("%s",p1->name);      printf("输入性别：\n");      scanf("%s",p1->sex);      printf("输入年龄：\n");      scanf("%s",p1->age);      printf("输入专业：\n");      scanf("%s",p1->speciaity);      printf("输入班级：\n");      scanf("%s",p1->Class);      p1->next=NULL;               //保存到链表      if (head==NULL) {         head=(TEL *)malloc(sizeof(TEL));//申请空间         head->next=p1;      } else {         for (p2=head;p2->next!=NULL;p2=p2->next); //找到结点尾         p2->next=p1;      }      printf("此信息已添加！"); }  //浏览所有学生信息 void print() {      TEL *p=NULL;      if (head==NULL){         printf("此学生信息管理系统中无记录，请输入记录后在使用本功能！\n");         return;      }      printf("**************学生信息管理系统*********************\n");      //输出信息  printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for(p=head->next;p!=NULL;p=p->next)          printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class); }  //查找学生信息1.按学号 void Finditem1() {      TEL *p;      char findname[20];      printf("请输入要查找的学号：\n");      scanf("%s",findname);      printf("**************学生信息管理系统*********************\n");      printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for (p=head->next;p!=NULL;p=p->next) {          if(strcmp(p->number,findname)==0)             printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);      } }  //查找学生信息2.按姓名 void Finditem2() {      TEL *p;      char name[20];      printf("请输入要查找的姓名：\n");      scanf("%s",name);      printf("**************学生信息管理系统*********************\n");      printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for(p=head->next;p!=NULL;p=p->next) {         if(strcmp(p->name,name)==0)            printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);      } }  //删除学生的信息 void Removeitem() {      char findname[20];            //先查找 后删除      TEL *p = head->next, *pr = head->next;      printf("请输入要删除的学号：\n");      scanf(" %s",&findname);      if (head->next == NULL){          printf("无此节点!\n");          return;      }      while ((strcmp(p->name,findname)!=0 )&& p->next != NULL){          pr =p;          p =p->next;      }      if (strcmp(findname, p->name)==0){ //输出删除信息          printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->next->number,p->next->name,p->next->sex,                                            p->next->age,p->speciaity,p->Class);          if (p == head->next)              head->next = p->next;          else              pr->next = p->next;          free(p);      }      printf("此信息已删除！"); }  //保存链表信息到文件并释放内存空间 void Saveandfree() {      TEL  *p=NULL;      FILE *fp;      char *Book="books.txt";      if (head==NULL){          printf("\n记录为空！\n");          return;      }      else p=head->next;      if ((fp=fopen(Book,"wb+"))==NULL){          printf("\n打不开文件!\n");          return;      }      while (p!=NULL){                     //保存信息            //fwrite(p,sizeof(TEL),1,fp); //这个写法是把结构体第7项 p->Telephone *next;也写入文件了，                                          //所谓的乱码就是这部分的内容。            fprintf(fp,"%s %s %s %s %s %s ",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);            p=p->next;      }      printf("保存完毕!");      fclose(fp);      //*****释放链表空间*****      for(;head->next!=NULL;){          p=head->next;          head->next=head->next->next;          free(p);      }      free(head); }  //文件信息输出到链表 void Open() {      FILE *fp;      TEL  *p1=NULL,*p2=NULL,*temp=NULL;      if ((fp=fopen("books.txt","rb+"))==NULL){         printf("\n****************这是一个新的学生信息管理系统******************\n");         return;      }      head=(TEL *)malloc(sizeof(TEL));      head->next=NULL;      temp=p2=head;      while (! feof(fp)){         //循环读取            p1=(TEL *)malloc(sizeof(TEL));            temp=p2;            p2->next=p1;            p2=p1;            //fread(p1,sizeof(TEL),1,fp); //对应的读入文件的方法也不一样            fscanf(fp,"%s %s %s %s %s %s",p1->number,p1->name,p1->sex,p1->age,p1->speciaity,p1->Class);      }      temp->next=NULL;      fclose(fp);               //关闭文件 }

是不是因为保存的字符串没有使用 null-terminated string 的原因，试试在每个要保存的字符串后加个'\n'。

#include<stdio.h> #include<string.h> #include<stdlib.h>  struct Telephone{      char number[20];      char name[20];      char sex[20];      char age[20];      char speciaity[20];      char Class[20];           struct Telephone *next; };  typedef struct Telephone TEL;  TEL *head=NULL;  void showmenu();                  //菜单 void Appenditem();                //添加学生信息 void print();                     //浏览所有学生信息 void Finditem1();                 //查找学生信息 （按学号） void Finditem2();                 //查找学生信息 （按姓名） void Removeitem();                //删除学生信息     void Saveandfree();               //保存到文件 void Open();                      //打开文件 void main() {      char ch;      Open();                       //打开文件      while(1) {           showmenu();               //显示菜单           scanf(" %c",&ch);           switch(ch)  {               case '1':                 Appenditem();    //添加学生信息                    break;               case '2':                 print();         //浏览所有学生信息                    break;               case '3':                 Finditem1();     //查找学生信息1.按学号                    break;               case '4':                 Finditem2();     //查找学生信息2.按姓名                    break;               case '5':                 Removeitem();    //删除学生信息信息                    print();         //输出删除后的结果                    break;               case '0':                 Saveandfree();   //保存并释放内存                    exit(0);         //退出系统                    break;               default:                    printf("选择错误!");                    break;           }      } }  //菜单 void showmenu() {      printf("\n*****************欢迎使用学生信息管理系统*****************\n");      printf("\n*****************根据主菜单提示选择所想要的操作*****************\n");       printf("\t1.添加学生信息\n");       printf("\t2.浏览所有学生信息\n");       printf("\t3.按学号查询学生信息\n");       printf("\t4.按姓名查询学生信息\n");       printf("\t5.删除学生信息\n");       printf("\t0.保存并退出系统！\n"); printf("*************************************************\n");      printf("\t请选择：\n"); }      //添加学生信息 void Appenditem() {      TEL *p1=NULL,*p2=NULL;           p1=(TEL *)malloc(sizeof(TEL));                     //申请结点      printf("输入学号:\n");                             //添加信息      scanf("%s",p1->number);      printf("输入姓名：\n");      scanf("%s",p1->name);      printf("输入性别：\n");      canf("%s",p1->sex);      printf("输入年龄：\n");      scanf("%s",p1->age);      printf("输入专业：\n");      scanf("%s",p1->speciaity);      printf("输入班级：\n");      scanf("%s",p1->Class);      p1->next=NULL;                                     //保存到链表           if(head==NULL) {           head=(TEL *)malloc(sizeof(TEL));               //申请空间           head->next=p1;      } else {           for(p2=head;p2->next!=NULL;p2=p2->next);       //找到结点尾           p2->next=p1;      }      printf("此信息已添加！"); }  //浏览所有学生信息 void print() {      TEL *p=NULL;      if(head==NULL) {           printf("此学生信息管理系统中无记录，请输入记录后在使用本功能！\n");           return;      }      printf("**************学生信息管理系统*********************\n"); //输出信息       printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for(p=head->next;p!=NULL;p=p->next)           printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);   }       //查找学生信息1.按学号 void Finditem1() {      TEL *p;      char findname[20];           printf("请输入要查找的学号：\n");      scanf("%s",findname);      printf("**************学生信息管理系统*********************\n");        printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");             for(p=head->next;p!=NULL;p=p->next) {            if(strcmp(p->number,findname)==0)                printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);        } }  //查找学生信息2.按姓名 void Finditem2() {      TEL *p;      char name[20];      printf("请输入要查找的姓名：\n");      scanf("%s",name);      printf("**************学生信息管理系统*********************\n");        printf("学号\t姓名\t性别\t年龄\t专业\t班级\n");      for(p=head->next;p!=NULL;p=p->next) {           if(strcmp(p->name,name)==0)               printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->number,p->name,p->sex,p->age,p->speciaity,p->Class);       } }       //删除学生的信息 void Removeitem() {      char findname[20];                                     //先查找 后删除      TEL *p = head->next, *pr = head->next;           printf("请输入要删除的学号：\n");      scanf(" %s",&findname);       if (head->next == NULL) {            printf("无此节点!\n");            return;       }            while ((strcmp(p->name,findname)!=0 )&& p->next != NULL)   {             pr =p;             p =p->next;        }       if (strcmp(findname, p->name)==0)                    //输出删除信息        {              printf("%s\t%s\t%s\t%s\t%s\t%s\n",p->next->number,p->next->name,\                   p->next->sex,p->next->age,p->speciaity,p->Class);               if (p == head->next)                         head->next = p->next;               else                   pr->next = p->next;                            free(p);              }        printf("此信息已删除！");   }  //保存链表信息到文件并释放内存空间 void Saveandfree() {      TEL *p=NULL;      FILE *fp;      char *Book="books.txt";      if(head==NULL) {           printf("\n记录为空！\n");           return;      }      else           p=head->next;                if((fp=fopen(Book,"wb+"))==NULL)   {             printf("\n打不开文件!\n");             return;        }            while(p!=NULL)                              //保存信息        {             fwrite(p,sizeof(TEL),1,fp);             p=p->next;        }            printf("保存完毕!");       fclose(fp);     //*****释放链表空间*****       for(;head->next!=NULL;)  {            p=head->next;            head->next=head->next->next;             free(p);       }       free(head); }  //文件信息输出到链表 void Open() {      FILE *fp;      TEL *p1=NULL,*p2=NULL,*temp=NULL;           if((fp=fopen("books.txt","rb+"))==NULL)  {            printf("\n****************这是一个新的学生信息管理系统******************\n");            return;       }           head=(TEL *)malloc(sizeof(TEL));      head->next=NULL;      temp=p2=head;           while(! feof(fp))                            //循环读取       {            p1=(TEL *)malloc(sizeof(TEL));            temp=p2;            p2->next=p1;            p2=p1;            fread(p1,sizeof(TEL),1,fp);       }           temp->next=NULL;      fclose(fp);                                   //关闭文件 }

为什么都喜欢这么发代码呢？自己看着代码好看懂逻辑吗？～


Question: 用51单片机来显示555计时器组成的多谐振荡器的频率。

查查计时器频率设置

标准做法，用T0计时，时间到了就去数一下T1的脉冲计数嘛。

引用 14 楼 user-6 的回复:NE555 的输出3Q 接的是 P3.5 T1（计时器1外部输入），可是程序貌似怎么操作T0呢？这个没错，T1对555的方波计数，然后利用T0中断将计数值输出，然后置位重新开始。问题应该12#所说为正解。

引用 10 楼 qzjhjxj的回复:protues仿真软件里，单片机、晶振的工作频率都和代码里写的一样不，要设置一致才准确。 初始值和中断那里都改了，proteus里单片机的晶振频率是12mhz,可还是不行。

这里的初始值和中断函数里的都一起改了吗？

还是不行，没有变化

引用 6 楼 qzjhjxj的回复:中断函数修改，供参考：void timer0 () interrupt 1 {      TR0 = 0;      TR1 = 0;      TH0 = (65535-45872)/256;      TL0 = (65535-45872)%256;      bb  = TH1;      cc  = TL1;      TL1 = 0;      TH1 = 0;      TR0 = 1;      TR1 = 1; } 好的，我试试，谢谢。

换上pF级电容才能这么玩。

一不留神就忽略了数量级。 你的电阻电容搞辣么大，频率搞得太低了。 不要忘了你只数了50毫秒脉冲然后乘了20来的。 一个9Hz的信号源你指望它在50毫秒内数到什么？ 数到什么都算误差。

引用 3 楼 qzjhjxj的回复:定时器计算机器周期晶振如是:11.0592MHz，那么机器周期为12*(1/11059200)=1.09μm。若T=50ms那么N=50000/1.09=45872.代码里中断初值TH0和TL0的值是否准确？第43行TR1=0;//中断使能 ，这行是否要移到第41行前面。 移到41行前还是不行。

TMOD=0x51;定时器T0工作在定时50ms模式，50ms中断一次，执行中断函数里的语句。T1工作在计数模式,TH1存放由555产生的方波数高8位，TL1存放方波数的低8位，然后到中断里将值传给bb 和cc 。TR1=1，启动计数器T1工作，TR1=0，计数器T1停止工作。

引用 1 楼 forever74的回复:39行应该是interrupt 0吧？ 改成interrupt 0就都显示F000了

39行应该是interrupt 0吧？


Question: 大佬赶紧进来

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

这是伪代码，什么编译器也编译不过去

编译器不能看出来吧，C语言的编译器可以用C的，也可以用C++的。 具体是那种软件更看不出来了。

我就说大学学编程应该先教 编译器/IDE以及开发环境搭建 吧，就应该去社会找在职工程师来讲课 你这个代码，一看就是C代码...


Question: 如何用for循环删除字符串后面星星

贴出你的代码～找到星星，直接用'\0'覆盖，如果后面的非星星继续要，则后面的往前覆盖～

#include <stdio.h> #include <string.h> int main() {     char s[]="abc*d**";     int i,L;     L=strlen(s);     for (i=L-1;i>=0;i--) {         if (s[i]=='*') s[i]=0;         else break;     }     printf("s:[%s]\n",s);//s:[abc*d]     return 0; }