Question: 使用链表建立一个后入先出的栈，将输入的一串字符反序输出。

创建链表，头插法即可。仅供参考： #include <list> #include <iostream> using namespace std;  int main(void) { 	char c; 	list<char> lst;  	while (cin >> c) 	{ 		if (c == '#') break; 		lst.push_front(c); 	}  	for (char c : lst) cout << c;  	return 0; }

可以先实现一个链表，链表的创建采用头插法，可以创建一个带有哨兵的链表；每次新的节点都插在哨兵节点的后面。这样遍历从哨兵后的第一个节点开始，这样可以实现后入先出。

链式栈，供参考  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #define Empty 0  //栈空 #define Avail 1  //栈可用  typedef char ElemType;  typedef struct SNode {     ElemType data;     struct SNode *next; }StackNode;  typedef struct LStack {     StackNode *top;  //栈顶指针     StackNode *bot;  //栈底指针     int length;      //栈长度   }LinkStack;  LinkStack InitStack(LinkStack pStack); LinkStack Push(LinkStack pStack, ElemType c); void Pop(LinkStack pStack); int StackEmpty(LinkStack pStack); LinkStack ClearStack(LinkStack pStack); void DisplayStack(LinkStack pStack);  int main(void) {     LinkStack p;     char ch;     p.length = 0;     p = InitStack(p);      printf("输入字符，以#结束\n");     scanf("%c", &ch);      while (ch != '#')     {         p = Push(p, ch);                 scanf("%c", &ch);     }      DisplayStack(p);      ClearStack(p);     system("pause");     return 0; }  //入栈 LinkStack Push(LinkStack pStack, ElemType c) {         StackNode *temp;     temp = (StackNode*)malloc(sizeof(StackNode));     if (temp == NULL)     {         printf("内存分配失败！\n");         return pStack;     }      if (StackEmpty(pStack) == Empty)      //如果栈为空     {         pStack.top = pStack.bot = temp;   //栈顶、栈底指针都指向新建结点         temp->next = NULL;                 pStack.top->data = c;         pStack.length++;         return pStack;     }     else                                  //栈不为空     {         temp->next = pStack.top;          //新建结点指向原来的栈顶          pStack.top = temp;                //栈顶指针指向新建结点                pStack.top->data = c;         pStack.length++;         return pStack;     } }  //出栈 void Pop(LinkStack pStack) {     StackNode *Second;     if (StackEmpty(pStack) == Empty)     {         printf("栈为空！\n");         return pStack;     }      if (pStack.top == pStack.bot)        //如果是最后一个元素     {         printf("%c\n", pStack.top->data);         free(pStack.top);         pStack.top = pStack.bot = NULL;   //栈顶、栈底指针都置为空         pStack.length--;             }      printf("%c", pStack.top->data);     Second = pStack.top->next;     free(pStack.top);     pStack.top = Second;     pStack.length--;     }  //判断栈是否为空 int StackEmpty(LinkStack pStack) {     if (pStack.top == NULL && pStack.bot == NULL)     {         return Empty;     }     else         return Avail; }  //遍历栈 void DisplayStack(LinkStack pStack) {     if (StackEmpty(pStack) == Empty)     {         printf("栈为空！\n");         return;     }      while (pStack.top != NULL)     {         printf("%c", pStack.top->data);         pStack.top = pStack.top->next;     }     printf("\n"); }  //清空栈 LinkStack ClearStack(LinkStack pStack) {     StackNode *del;     while (pStack.top != NULL)     {         del = pStack.top->next;         free(pStack.top);         pStack.top = del;     }     return pStack; }  //初始化 LinkStack InitStack(LinkStack pStack) {     pStack.top = pStack.bot = NULL;     pStack.length = 0;      return pStack; }


Question: 数据结构—顺序表元素的逆置。代码编译没问题，但是程序不运行。请指教！！！

引用 1 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h>  #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10  typedef struct{     char *elem;     int length;     int listsize; }Sqlist;  void InitList_Sq(Sqlist *L)  //构造一个空线性表 {     L->elem = (char*)malloc(LIST_INIT_SIZE*sizeof(char));     if(!L->elem)     {         printf("ERROR!");         exit(1);     }     L->length=0;     L->listsize=LIST_INIT_SIZE; }  void inversion(Sqlist *L) {     char *p,*q,t=0;     p=L->elem;     q=L->elem+L->length-1;     while(p<q)     {         t=*p;         *p=*q;         *q=t;     } } int main() {     Sqlist *L;     int i=0;     char c;      L = (Sqlist *)malloc(sizeof(*L));     if (!L)         exit(0);      InitList_Sq(L);     do{         printf("请输入一个字母（'/'退出循环）：\n");         scanf("%c",&c);         if((L->length+1)>L->listsize) //顺序表已满，重新分配空间         {             L->elem=(char*)realloc(L->elem,(LIST_INIT_SIZE+LISTINCREMENT)*sizeof(char));             if(!L->elem)             {                 printf("ERROR!");                 exit(1);             }             L->length=i;             L->listsize=LIST_INIT_SIZE+LISTINCREMENT;         }         if((c>='a'&&c<='z')||(c>='A'&&c<='Z')||c=='/')         {             *(L->elem+i)=c;             i++;             L->length=i;         }         else printf("输入错误！请输入字母！\n");      }while(c!='/');      if(L->length==0) printf("\n未输入元素，无法逆置");     else if(L->length==1) printf("\n只有一个元素%c，无法逆置",*(L->elem));     else{         inversion(L);         printf("元素逆置为：\n");         for(i=0;i<L->length;i++)             printf("%c ",*(L->elem+i));     } } 供参考～ 感谢！程序可以运行出来了，但是不太理解为什么InitList (L)前要这样先赋地址，而且sizeof (*L)为什么是*L呢？InitList后L的地址是不是又是另外一个新地址呢？？希望可以解答一下！谢谢

引用 3 楼 qzjhjxj的回复:输入字符时，增加一个getchar()函数：    do{         printf("请输入一个字母（'/'退出循环）：\n");         scanf("%c",&c);         getchar();      //吃掉多余字符         if((L->length+1)>L->listsize) //顺序表已满，重新分配空间 这个真是帮了我大忙了！！好几个程序都有相似的错误 ，但是想知道什么情况下需要用getchar（）来吃掉多余的字符啊，之前没这样用的时候没出现过这样的问题，自从写数据结构实验的题，总是出现这个问题。

感谢！程序可以运行出来了，但是不太理解为什么InitList (L)前要这样先赋地址，而且sizeof (*L)为什么是*L呢？InitList后L的地址是不是又是另外一个新地址呢？？希望可以解答一下！谢谢！！

偷鸡 放到数组逆序输出[face]

楼主，逆置函数还是有问题，修改如下，供参考：void inversion(Sqlist *L) {     char *p,*q,t=0;     p=L->elem;     q=L->elem + L->length-1-1;//末尾'/’不逆置     while(p<q)     {         t=*p;         *p=*q;         *q=t;         p++; //指针移动         q--;     } }


Question: 求助

倒序循环字符串a

引用 1 楼 user-5的回复:从字符串a的最后一个字符的下标到第个字符的下标。 超级感谢你昂

这是用于遍历字符串的吧，没看到循环体，不好具体确定。从for循环上看是从字符串的末尾向前循环的。  strlen(a)是字符串的长度，也是'\0'的下标，然后减1，正好是有效字符串的最后一个字符的下标

char a[] = "123456789"; 	int i; 	for (i = strlen(a) - 1; i >= 0; i--) 	{ 		printf("%c", a[i]); 	} 输出的结果为

引用 楼主 qq_52593311的回复:for(i=strlen(a)-1;i>=0;i--) 求大佬解释一下这个循环是什么意思 strlen是一个字符串函数——它用来计算字符串的长度 那么这个循环就是从数组最后一个下标开始到第一个下标，相当于abcd  一>  dcba

从字符串a的最后一个字符的下标到第个字符的下标。


Question: 求助

请将图片用markdown整理成具体代码片段。 你的帖子看着真累。

个人认为是一样的。a[0]和p类型是一样的。  #include <stdio.h>   int main(void) {     int a[3][4], cnt = 0;     int i, j;     int *p;        for (i = 0; i < 3; i++)         for (j = 0; j < 4; j++)             a[i][j] = ++cnt;      p = a[0];     printf("%p, %p\n", p + 5, a[0] + 5);     printf("%d, %d\n", p[5] , *(a[0] + 5));      return 0; } 供参考～  可以看到两个地址和对应的值都是一样的。 内存是线性的，即使是二维数组也是线性存放的。

把二维数组按一维排成一行后第i+1个元素地址 和 你的 第0行第i+1个元素地址是一个意思 但是你有没有想过，i 可以大于一行的个数，当 i 大于一行的个数时，如果还说成是第0行是不是就不合适了（因为已经超出第0行了）。所以说 按一维转成一行后 就更合适一些。

参见《C++程序设计精要教程》的类型解析，p+i中的i不一定代表一个元素。如果a是二维数组int a[10][20],而定义int (*p)[20]; p=a[0];则p+i为第i*20个元素。关键看你的数组a的定义。你的问题不全不清楚，无法回答。


Question: C语言—顺序元素的逆置，循环部分出了点问题，求帮助！！详细在下面说明。

引用 2 楼 qzjhjxj的回复:元素的逆置函数void inversion(char a[],int length)算法有问题，把最后的‘/'符号逆序了，这个楼主自己修改下，其余修改如下,供参考：#include <stdio.h>  void inversion(char a[],int length); //void inversion();函数声明错误  int main(int argc, char* argv[]) {     char a[100]={'0'};     char c;     int i=0,length=0; 	do 	{  	   printf("\nplease enter a letter(if want to exit,enter'/'):");            scanf("%c",&c);            getchar();   //吃掉缓冲区多余字符 	   if(c>='a' && c<='z' || c>='A' && c<='Z' || c=='/') 	   { 		  a[i]=c; 		  i++; 	   } 	   else 	   { 	      printf("\nError! please enter a 'letter'!"); 	   }          }while(c!='/'&&i<100);      if(a[0]=='/')           printf("\n未输入元素，无法逆置");     else if(a[1]=='/')           printf("\n只有一个元素%c，无法逆置",a[0]);          else           { 	   length=i;            inversion(a,length);            printf("元素逆置为：\n");            for(i=0;i<length;i++)                    printf("%c ",a[i]);          }     system("pause");     return 0; }   void inversion(char a[],int length) { 	int p,q; 	char t; 	p=0; q=length-1; 	while(p<q) 	{ 	   t=a[p]; 	   a[p]=a[q]; 	   a[q]=t; 	   p++; 	   q--;     } } 非常感谢您指出了关键的错误！！程序改好啦！

非常感谢您指出了关键的错误！！程序改好啦！

引用 1 楼 自信男孩的回复:注意一下每次输入之后的'\n'换行符，下次的匹配就优先匹配'\n'了，所以提示Error!了。  解决办法是，如果输入是一次一个的输入，可以在scanf后面加一个getchar();用于 接收'\n'  对于%d不会有这种问题，%c比较特殊 知道了！！非常感谢！！


Question: 数据结构—用栈实现括号匹配检验。代码不知道哪里出错了，求助！

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define ERROR -1 typedef struct{       //定义顺序栈的存储结构     char *base;     char *top;     int stacksize; }SqStack;   void InitStack(SqStack *s) //建空栈 {     s->base=(char*)malloc(STACK_INIT_SIZE*sizeof(char));     if(!s->base)         exit(1);     s->top=s->base;     s->stacksize=STACK_INIT_SIZE; }  int GetTop(SqStack *s,char *e) {     if(s->top==s->base) return ERROR;     *e=*(s->top-1);     return 1; }  void push(SqStack *s,char e) {     if((s->top-s->base)>=s->stacksize)  //栈已满，重新分配存储空间     {         s->base=(char*)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(char));         if(!s->base) exit(1);         s->top=s->base+s->stacksize;         s->stacksize+=STACKINCREMENT;     }     *s->top++=e; }  int pop(SqStack *s,char *e) {     if(s->top==s->base) return 0;     *e=*--s->top;     return 1; }  int StackEmpty(SqStack *s) {     if(s->top==s->base) return 1;  //栈空，返回值为1     else return 0; }  int BracketsMatch(SqStack *s,char b[]) {     InitStack(s);     int i=0;     //char *e;     char e;     while(b[i]!='#')     {         switch (b[i])         {             case '(': push(s,b[i]); break;             case '{': push(s,b[i]); break;             case '[': push(s,b[i]); break;             case ')':                       if(StackEmpty(s))  return 0;                       //pop(s, e);                       pop(s, &e);                       if(e != b[i]) return 0;                       break;             case ']':                       if(StackEmpty(s))  return 0;                       //pop(s, e);                       pop(s, &e);                       if(e!=b[i]) return 0;                       break;             case '}':                       if(StackEmpty(s))  return 0;                       //pop(s,e);                       pop(s, &e);                       if(e!=b[i]) return 0;                       break;         }         ++i;     }     if(StackEmpty(s)) return 1; //栈空，则匹配     else return 0;              //否则，不匹配 }  int main() {     SqStack *s;     char b[100],a;     int i=0,j;     do{         printf("请输入一个括号(#为结束字符)：\n");         scanf("%c", &b[i]);         getchar();    //for'\n'         a=b[i];         i++;     }while(a!='#');      s = (SqStack *)malloc(sizeof(*s));     if (!s)         exit(0);     j=BracketsMatch(s,b);     if(j==1) printf("括号匹配！\n");     else printf("括号不匹配！\n");     return 0; } 供参考～  s为没有申请空间，就直接使用结果是未定义的。其他的问题供参考  现在循环语句变成一次输出一遍，一次输出两遍，不知道是为什么 我的其他程序加了getchar()后就好了，但是这个不知道怎么回事？？ 您能帮我再看看吗？？谢谢谢谢！！！   还有就是您最后说的S没有申请空间，直接使用结果是未定义的，是什么意思啊？ 原谅我没太明白。就是GetTop(SqStack S)这类函数因为是读取不进行操作，所以参数一般是定义为S而不是*S， （我的理解），然后程序里SqStack *S，还有InitStack(S）中S都是以指针形式定义的，所以如果在函数中调用 GetTop函数，这个参数我不知道该怎么写，所以我把程序中函数GetTop(SqStack *S）定义为指针了，所以想问一下， 如果GetTop仍定义为GetTop(SqStack S），在函数中应该怎么调用呢，主要是参数怎么写呢？？ 谢谢谢谢！


Question: 求助，为什么数组大小在主函数和子函数里不一样？

形参a不是main函数的a了，这里是一个指针，是一个数组指针。因此对于指针的长度都是固定的。  建议楼主增加一个参数，用于接收列数。

数组作为参数的时候，会退化为指针，所以在子函数中用sizeof得到的是指针的大小

指针变量大小看是多少位系统

测试字符串所占空间大小，值为字符个数加一 测试变量，那就是变量所占空间大小 测试指针变量就是四个字节 测试类型，那就是类型对应空间大小 测试数组名，就是测试数组所占空间大小

在函数access里，sizeof得到的是指针尺寸，数组大小需要另外参数传进来，设数组为全局数组也可以传进来，或把数组封装在结构变量里传进来。


Question: C语言已知两个数组：int x[4] = { 1,1,1,1}; int h[6] = {6,5,4,3,2,1}。对这两个数组做以下运算

供参考：#include <stdio.h> void conv(int *p,int *q,int n);  int main(int argc, char* argv[]) {     int x[4]={1,1,1,1},h[6]={6,5,4,3,2,1};     int n;     printf("Input N:");     scanf("%d",&n);      conv(x,h,n);      system("pause");     return 0; }  void conv(int *p,int *q,int n) {     int y=0,m=3;     for(int i=0;i<=m;i++){        if( n-i<0 || n-i>5){             y += p[i] * 0;             continue;        }        y += p[i]*q[n-i];     }     printf("%d\n",y); }

新手初学C语言，希望大神能够写详细一点


Question: 请问这个怎么办

引用 2 楼 qq_52046937 的回复:[quote=引用 1 楼 赵4老师的回复:]换国内镜像。 MINGW已经下载安装好了，就是过程中一直有报错，不知道有没有影响[/quote] 一直报错的话，用着用着肯定会有问题的。不如安装的时候就解决

引用 1 楼 赵4老师的回复:换国内镜像。 MINGW已经下载安装好了，就是过程中一直有报错，不知道有没有影响

换国内镜像。

引用 7 楼 qq_52046937 的回复:[quote=引用 6 楼 一颗白面馒头的回复:][quote=引用 5 楼 qq_52046937 的回复:][quote=引用 4 楼 赵4老师的回复:]https://www.jianshu.com/p/96031565dafb 谢谢啦，其实我就是想在vs code上写C，想配置下环境，不知道咋整[/quote] 额。。。我前不久才配置了一个[/quote] 请问有没有教程啊，，简单点的，，大一菜鸟[/quote] https://www.zhihu.com/question/30315894。这个可参考，我就是按照这个配置的，有点麻烦，但是步骤挺详细的

引用 6 楼 一颗白面馒头的回复:[quote=引用 5 楼 qq_52046937 的回复:][quote=引用 4 楼 赵4老师的回复:]https://www.jianshu.com/p/96031565dafb 谢谢啦，其实我就是想在vs code上写C，想配置下环境，不知道咋整[/quote] 额。。。我前不久才配置了一个[/quote] 请问有没有教程啊，，简单点的，，大一菜鸟🐤

引用 5 楼 qq_52046937 的回复:[quote=引用 4 楼 赵4老师的回复:]https://www.jianshu.com/p/96031565dafb 谢谢啦，其实我就是想在vs code上写C，想配置下环境，不知道咋整[/quote] 额。。。我前不久才配置了一个

引用 4 楼 赵4老师的回复:https://www.jianshu.com/p/96031565dafb 谢谢啦，其实我就是想在vs code上写C，想配置下环境，不知道咋整


Question: 关于指针的问题想问一下各位大佬

感谢dalao

第58行  for(i=0;i<k;i++)  printf("%3d",goodstudent[i]);//for(i=0;i<4;i++)printf("%3d",goodstudent[i]);

修改如下，供参考：#include<stdio.h>  void aver(int (*p)[5]); void fail(int (*p)[5],int *pn,int x); void good(int (*p)[5],int *pn,int x);  void aver(int (*p)[5])  //求第一门课的平均分 {   int i,j,sum=0;   for(i=0,j=0;i<20;i++)   {     if(i%5==0)sum+=(*(*p+i)+j);   }   sum=sum/4;   printf("第一门课程的平均分为：%d\n",sum); }   void fail(int (*p)[5],int *pn,int x)  //找两门课不及格的学生，并输出学号、成绩 {   int i,j,flag;   for(i=0;i<x;i++,pn++)   {     flag=0;     for(j=0;j<5;j++)     {       if(*(*(p+i)+j)<60)flag+=1;     }     if(flag>=2)     {       printf("No.%d 不及格,他的全部成绩为：\n",*pn);       for(j=0;j<5;j++)printf("%5d",*(*(p+i)+j));       printf("\n");     }   } }   void good(int (*p)[5],int *pn,int x)//找出平均成绩在90以上或全成绩在85以上的学生 {   int i,j,k=0,flag,sum,goodstudent[5];   //增加一个变量k   printf("成绩优秀学生的学号为：");   for(i=0;i<x;i++,pn++)   {     sum=0;     flag=0;     for(j=0;j<5;j++)      {       sum += *(*(p+i)+j);      //sum+=(*(*p+i)+j);这里好像出了问题，循环一次就多加了数字                                          //printf("\nsumA=%d\n",sum);       if(*(*(p+i)+j)>85) flag += 1;      }     if(flag==5 || sum/5>=90)  goodstudent[k++]= *pn;                                       //else                                      //  if(sum/4>90) goodstudent[i]=*pn;                                     // printf("sumB=%d",sum);   }   for(i=0;i<k;i++)  printf("%3d",goodstudent[i]); }   int main() {    int i,j,score[4][5],num[4];    int *pnum,(*pscore)[5];     printf("请输入学号:\n");    for(i=0;i<4;i++)scanf("%d",&num[i]);     pnum=&num[0];    for(i=0;i<4;i++,pnum++)      {        printf("请输入%d号学生的成绩：",*pnum);        for(j=0;j<5;j++)           {             scanf("%d",&score[i][j]);           }        getchar();      }    for(i=0;i<4;i++)     {       for(j=0;j<5;j++)        {          if(score[i][j]>100||score[i][j]<0)printf("第%d行数据有误！\n",i+1);        }     }     pscore=score;    aver(pscore); //第一门课平均分     pnum=&num[0];    pscore=score;    fail(pscore,pnum,4);//两门课不及格的学生     pscore=score;    pnum=&num[0];    good(pscore,pnum,4);//优秀学生     printf("\n");    system("pause");    return 0; }


Question: 看看这道题吧

引用 1 楼 user-3的回复:嗯，C写反了，D是对的 额，谢谢你了。

引用 3 楼 一颗白面馒头的回复:c是反了，第一句a指向c，a的next就是c了，b已经找不回来了，第二句a的next就是c，c再指向自己？ 额额，你说的是对的，互相交流

引用 4 楼 自信男孩的回复:个人的看法和楼主一样的。如果C把这两条语句调换一下，即先执行q->next = p->next;在执行：p->next = &c;这样是没问题的。 所以D选项是正确的。 对的，我也这么认为，谢谢了

谢谢楼主，治好了多年的颈椎问题

嗯，C写反了，D是对的


Question: 校园oj题疑问

引用 3 楼 ctrigger 的回复：while(ch=getchar()!='\n')  改为下面的，试试看：  引用while((ch=getchar())!='\n')谢谢

引用 2 楼 qzjhjxj 的回复：输入的是字符串，不是单个字符，修改如下，供参考：#include <stdio.h> int main(int argc, char* argv[]) {     int vowel(char ch);     int x,sum=0,i=0;     char ch[80];     gets(ch);     while (ch[i]!='\0'){         if(vowel(ch[i]))            sum += 1;         i++;     }     printf("%d",sum);     system("pause");     return 0; }  int vowel(char ch) {    if(ch=='A'||ch=='a'||ch=='E'||ch=='e'||ch=='i'||ch=='I'||ch=='o'||ch=='O')       return 1;    return 0; }谢谢

引用 1 楼 自信男孩 的回复：改成这样： while ((ch = getchar())  != '\n')  如果用 while (ch = getchar()  != '\n') 这样ch是true和false谢谢

这屏幕碳烤的？


Question: 有人知道这要怎么做吗?大一学c语言不太懂

引用 3 楼 weixin_53514129 的回复:[quote=引用 1 楼 user-3的回复:]a^(1<<(k-1)) 为什么是这样打?[/quote] 简单的位操作，没理解么？我show个完整代吧。#include <stdio.h>   int main(void) { 	unsigned int a, k; 	scanf("%x%d", &a, &k); 	a ^= (1<<k-1);	 	printf("%x\n", a); 	return 0; }

引用 1 楼 user-3的回复:a^(1<<(k-1)) 为什么是这样打?

#include <iostream>  using namespace std;   int main(void) {     unsigned int a, k;      cin>>hex>>a>>dec>>k;      //cout<<hex<<a<<endl;     //cout<<dec<<k<<endl;     k -= 1;     cout<<sizeof(a) * 8<<endl;     if (k >= sizeof(a) * 8)         cout<<hex<<a<<endl;      //cout<<hex<<~(1u<<k)<<endl;     a ^= (1u << k);      cout<<hex<<a<<endl;      return 0; }  供参考～

引用 5 楼 weixin_53514129 的回复:[quote=引用 4 楼 ctrigger的回复:][quote=引用 3 楼 weixin_53514129 的回复:][quote=引用 1 楼 user-3的回复:]a^(1<<(k-1)) 为什么是这样打?[/quote] 简单的位操作，没理解么？我show个完整代吧。#include <stdio.h>   int main(void) { 	unsigned int a, k; 	scanf("%x%d", &a, &k); 	a ^= (1<<k-1);	 	printf("%x\n", a); 	return 0; }[/quote] 我是弄不懂1<<(k-1)代表什么[/quote]  C语言位运算，如同汇编语言的左移指令。。

引用 4 楼 ctrigger的回复:[quote=引用 3 楼 weixin_53514129 的回复:][quote=引用 1 楼 user-3的回复:]a^(1<<(k-1)) 为什么是这样打?[/quote] 简单的位操作，没理解么？我show个完整代吧。#include <stdio.h>   int main(void) { 	unsigned int a, k; 	scanf("%x%d", &a, &k); 	a ^= (1<<k-1);	 	printf("%x\n", a); 	return 0; }[/quote] 我是弄不懂1<<(k-1)代表什么


Question: C语言求助！！！！help！！！！！SOS！！！

楼主可以用输入的特殊值来判断是否要继续输入，比如'\n'，'0'等等；

谢谢大家(*°∀°)=3

文件结尾，EOF即可。 while((c=getchar()) != EOF) ...

某些问题如果能描述清楚那就差不多解决了。 解决不了正是因为说不清楚问题是什么。

没太明白你的意思，你两次while循环是要相同的信息还是不同的信息？ 如果要相同的信息，直接复制第一次读入的信息就好了 如果是继续往后读入（也就是不同信息），那你就重新再做一次while不就好了吗？如果你的输入来自于文件，那就fseek偏移一下第一次读入的长度就可以了


Question: C语言指针问题

建议楼主对于p+2的打印用%p，因为%p是专门对指针打印地址用的。  这个程序就是指针和数组的使用，主要是指针的使用，指针偏移和对应的元素值。  建议多加一些打印，结合地址和元素值熟悉指针的了解。另外，如果想更详细的了解，建议int *p和char *q, 交叉使用。

引用 楼主 AruNi° ഒ的回复:刚学到c语言，遇到这道题有点懵，有没有大佬帮我分析分析的？越详细越好，非常感谢！！！ 已经解决了！


Question: 请教一下C中如何模拟按下鼠标按键

Linux系统，鼠标对应的设备文件目录：/dev/input/下。直接open就行，接下来就是读写操作了。 Windows系统，不清楚，等楼下补充吧。

向指定的窗口发送鼠标点击的消息

windows 有 API，查一下，控制鼠标移动点击都可以的


Question: C Primer Plus 第六版_C语言基本数据类型&第45页.

首先，请注意书上说的是“常量”，所以char型变量不会自动变成int型。 32位系统上常量'B'的内存为模式是 00000000 00000000 00000000 01000010 这样32位， 赋值给一个char变量的时候舍弃前24位，把低8位送过去。 为了迁就这种设定，你会发现getchar等字符处理函数是int类型的。 这部分是需要普及的。 ======================================================== 其次， 需要指出的是，K&R时代这样的设计本来是打算用来兼容多字节字符比如汉字的，但后期对非ASCII字符的处理走上了另外的（好几条）路，因此后半部分的描述在现在的编译器上不一定允许，也许是产生warning，所以不必深究。

'FATE' 没见过这样的表示，这是非法的，编译器是编译不过去的。  char是int的子集，用int定义char类型的变量是类型提升，没什么问题。  可以注意下getchar()库函数的返回值：  int getchar(void);  都是int类型，为什么呢，一部分是类型提升，一部分是EOF，这个是int类型，不是char类型。所以为了和EOF比较，会用int类型的变量接收getchar()的返回值。


Question: 有大佬知道这那错了吗

二层循环少一个大括号吧，应该把k = pow(10, j-1);和sn = sn+a*k;扩到二层循环里吧。

另外内层的for缺少花括号

pow是浮点，赋值给整数会产生截断误差。

C++代码，仅供参考：#include <fstream> using namespace std;  int fn(int a, int n) { 	if (n == 1) return a; 	else return a * (10 * fn(1, n - 1) + n); }  int main(void) { 	int a, n; 	ifstream fin("SC3_6C.in"); 	ofstream fout("SC3_6C.out");  	fin >> a >> n; 	fout << fn(a, n);  	return 0; }

靠，看来我眼睛有问题啊。看到这么鲜艳的图片，眼睛特别难受。


Question: 那位大佬知道这个怎么写吗？

#include <stdio.h> #include <math.h>  int is_prime(int n) {     int i, size;      if (n < 2)         return 0;     size = (int)sqrt(n);      for (i = 2; i < size; i++)         if (n % i == 0)             return 0;      return 1; }  static void swap(int *a, int *b) {     int tmp = *a;     *a = *b;     *b = tmp; }  int check_revesible_prime(int n) {     int tmp;      if (n < 10)         return 1;      tmp = 0;     while (n) {         tmp = (n % 10) + tmp * 10;         n /= 10;     }      if (is_prime(tmp))         return 1;      return 0; }  int main(void) {     int m, n;     int i, cnt = 0;      scanf("%d%d", &m, &n);     if (m > n)         swap(&m, &n);      for (i = m; i <= n; i++) {         if (is_prime(i)) {             if (check_revesible_prime(i)) {                 printf("%d ", i);                 cnt++;             }         if (cnt % 8 == 0)             putchar(10);         }      }     putchar(10);      return 0; } 供参考～  伸手要代码不是好习惯和解决问题的办法。还是希望楼主自己试试写写，起码判断素数的逻辑自己能写写或者起码网上找找学习一下，什么都不干你自己想想能学到什么？有时间还是用功学学，不然大学里你自己能学到什么程度？


Question: 大佬们，我没明白，为什么要定义area，不定义这个函数这个程序不也能运行吗？（C语言，求矩形面积）

#include <stdio.h>     /*文件包含，标准输入输出函数*/ int area(int a, int b) /*用户定义的函数*/ {     int s;     /*定义s为整型变量*/     s = a * b; /*求a与b的乘积*/     return s;  /*返回s的值*/ } void main() /*主函数*/ {     int x, y;                                       /*定义x,y为整型变量*/     scanf("%d%d", &x, &y);                          /*获取x,y的值*/     printf("\nx=%d,y%d", x, y);                     /*输出x,y的值*/     int z;                                          /*定义z为整型变量*/     z = area(x, y);                                 /*调用函数*/     printf("\nThe area of the rectangle is:%d", z); /*输出z的值*/ }

引用 1 楼 自信男孩的回复:不用也是可以的，把s = a *b;放在main函数是一样的。  但对于模块化，建议用自定义，这样可能可以提到代码的可读性已经清晰度  建议楼主贴代码前，先把格式调好了，另外注释不是越多越好，而是关键地方加注释即可。注释多了反而其副作用，使代码看着臃肿～ 谢谢大佬解答

单行注释//


Question: C语言动态数组

引用 3 楼 自信男孩 的回复:[quote=引用 2 楼 linuxusr 的回复:] //diff -memcpy(elem, da->root + da->len - 1, da->size); +memcpy(elem, da->root + --da->len, da->size);  建议用第一个吧，不建议用第二个。  首先+ --连着不利于代码阅读，当然可以考虑加括号； 其次，--具有副作用，因为此处虽然有da->len-1的意思，同时，还会修改da->len的值，这里要看要不要有这一步了，个人感觉没有这一步。[/quote]  感谢回复。  这一行是在remove函数里，因为删除一行后，实际的元素个数也要减一。

引用 2 楼 linuxusr 的回复: //diff -memcpy(elem, da->root + da->len - 1, da->size); +memcpy(elem, da->root + --da->len, da->size);  建议用第一个吧，不建议用第二个。  首先+ --连着不利于代码阅读，当然可以考虑加括号； 其次，--具有副作用，因为此处虽然有da->len-1的意思，同时，还会修改da->len的值，这里要看要不要有这一步了，个人感觉没有这一步。

挺好的，点赞。希望楼主继续努力，进一步完善完善。。


Question: 运行窗口没有Press any key to continue!

引用 4 楼 AruNi° ഒ 的回复:[quote=引用 2 楼 自信男孩的回复:]运行时间长的问题，因为楼主用的是递归，递归函数虽然代码很少，但是运行起来比较耗时，尤其这个n越大，越耗时。可以试着比较一下n为一个小值和一个大值时，运行时间的差别 哦哦，这样啊，那怎么才能又用递归又弹出那个呢[/quote] 我的意思，这个n如果很大，那你就耐心等一会看看有没有输出。另外，Fib(i)不要多次使用，直接用其返回值，然后再比较和输出，比较用其返回值，输出用其返回值。这样似乎可以减少递归的次数吧

引用 1 楼 赵4老师的回复:现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 表示有点看不懂你说的，

引用 2 楼 自信男孩的回复:运行时间长的问题，因为楼主用的是递归，递归函数虽然代码很少，但是运行起来比较耗时，尤其这个n越大，越耗时。可以试着比较一下n为一个小值和一个大值时，运行时间的差别 哦哦，这样啊，那怎么才能又用递归又弹出那个呢

引用 1 楼 赵4老师的回复:现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 大一，刚学。。。。


Question: 求助！怎么使用c语言获取excel文件的行和列数后缀为.xls

#include<stdio.h> #include "stdlib.h" #include <Windows.h> #include <math.h> #include <atlstr.h>  int main() {  	FILE *fp; 	int i,j ;     int da[5][4] = {0} ;     fp=fopen("C:/Users/yf/Documents/Visual Studio 2010/Projects/R/R/a.xls","r");     // fp指针指向文件头部     for(i = 0 ;i < 5 ; i++){         for(j = 0 ;j < 4 ; j++)         { 			fscanf(fp,"%d",&da[i][j]); 			fseek(fp, 1, SEEK_CUR);   //fp指针从当前位置向后移动 			 		} 	} 	char FsFileData[1000] = {0};  //存储每行的字符串 	memset(FsFileData, 0, sizeof(char)*1000); 	fseek(fp, 0, SEEK_SET);   //初始化 	int count=0; 	while(!feof(fp)) 	{ 		 		char * ret_val; 		char * find; 		ret_val = fgets(FsFileData, 1000, fp);  		printf( "ret_val: %s  \n", ret_val ); 		count++; 	} 	printf( "count: %d  \n", count ); 	fclose(fp);  	system("PAUSE"); 	return 0; }

.xls是专有协议，可以用Aspose API，或者第三方库，来解析这种文件。  如果能用.csv文本格式代替，会更加方便一些。

仅供参考：// Copyright (C) 1992-1998 Microsoft Corporation // All rights reserved. // // This source code is only intended as a supplement to the // Microsoft Visual C++ Language  Reference and related // electronic documentation provided with Microsoft Visual C++. // See these sources for detailed information regarding the // Microsoft Visual C++ product.  // NOTE: This example will only work with Excel8 in Office97 // Compile with cl /GX comexcel.cpp // TO DO: Edit the #import paths //#pragma message ("Make sure you go to Tools.Options.Directories and add the paths to mso97.dll and vbeext1.olb.  Mso97.dll will usually be in c:\\\"Program Files\"\\\"Microsoft Office\"\\Office, and vbeext1.olb will be in c:\\\"Program Files\"\\\"Common Files\"\\\"Microsoft Shared\"\\VBA") #import "C:\\Program Files\\Common Files\\Microsoft Shared\\Office11\\mso.dll" no_namespace rename("DocumentProperties", "DocumentPropertiesXL") #import "C:\\Program Files\\Common Files\\Microsoft Shared\\VBA\VBA6\\VBE6EXT.OLB" no_namespace #import "C:\\Program Files\\Microsoft Office\\OFFICE11\\excel.exe" rename("DialogBox", "DialogBoxXL") rename("RGB", "RBGXL") rename("DocumentProperties", "DocumentPropertiesXL") no_dual_interfaces  #pragma warning (disable:4192 4146)  #include <stdio.h> #include <tchar.h>  void dump_com_error(_com_error &e) {     _tprintf(_T("Oops - hit an error!\n"));     _tprintf(_T("\a\tCode = %08lx\n"), e.Error());     _tprintf(_T("\a\tCode meaning = %s\n"), e.ErrorMessage());     _bstr_t bstrSource(e.Source());     _bstr_t bstrDescription(e.Description());     _tprintf(_T("\a\tSource = %s\n"), (LPCTSTR) bstrSource);     _tprintf(_T("\a\tDescription = %s\n"), (LPCTSTR) bstrDescription); }  // If this is placed in the scope of the smart pointers, they must be // explicitly Release(d) before CoUninitialize() is called.  If any reference // count is non-zero, a protection fault will occur. struct StartOle {     StartOle() { CoInitialize(NULL); }     ~StartOle() { CoUninitialize(); } } _inst_StartOle;  void main() {     using namespace Excel;      _ApplicationPtr pXL;      try     {       pXL.CreateInstance(L"Excel.Application");        pXL->Visible = VARIANT_TRUE;        WorkbooksPtr pBooks = pXL->Workbooks;       _WorkbookPtr pBook  = pBooks->Add((long)xlWorksheet);       _WorksheetPtr pSheet = pXL->ActiveSheet;        RangePtr pRange;       pRange = pSheet->Range["A21"];       pRange->Value2 = 75L;       //pRange->NumberFormatLocal = "@";        _CommandBarsPtr pCmdbars = pXL->CommandBars;       int iCmdbars = pCmdbars->GetCount();        Sleep(1000);       pRange = pSheet->Range["20:20"];       pRange->Insert( (long)Excel::xlDown );       pRange->Merge();        Sleep(1000);        pBook->Saved = VARIANT_TRUE;       pXL->Quit();     }     catch(_com_error &e)     {       dump_com_error(e);        pXL->Quit();     } }

fgets按行读取，然后根据'\t截取，最后遇到'\n'或'\0'则为结束，这样通过一行就可以知道有几列，然后用fgets直到读到文件末尾，可以知道行数


Question: 一运行就提示停止工作

//这样写，上下对照，就不会%d和变量个数不对应了： scanf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"        &a,&b,&c,&d,&e,&f,&g,&h,&i,&j,&k,&l,&m,&n,&o,&p);  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错（最新的编译器会出错）。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

写这样的代码，不如用循环呢。用循环可以避免太多的%d和对应的参数。参数多是不是容易漏了？

scanf()函数有16个%d，只有15个对应的变量

你瞅，你仔细瞅，起码有俩错误。

这行


Question: 给定唯一变量，重新生成唯一随机数的方法

最简单的方法就是，长数对2的16次方取模即可 这样，长数不变，取模的结果肯定也不变，而且长数确定，模肯定也确定


Question: C语言 利用指针数组排序 要求输出排序结果和排序前的位置

供参考：#include <stdio.h> int main(int argc, char* argv[]) {     int a[10],*pa[10];     int *temp;     printf("Input tan number:");     for(int i=0;i<10;i++){              scanf("%d",&a[i]);              pa[i] = &a[i];     }      for(int i=0;i<10;i++){         for(int j=0;j<10-1;j++){             if(*pa[j]>*pa[j+1]){                temp = pa[j];                pa[j] = pa[j+1];                pa[j+1] = temp;             }         }     }       for(int i=0;i<10;i++){         printf("%4d",*pa[i]);       }     printf("\n");     for(int i=0;i<10;i++){         printf("%4d",pa[i]-a);     }     printf("\n");      system("pause");     return 0; }

仅供参考： #include <stdio.h> #include <stdlib.h>  int my_cmp(const void *a, const void *b) { 	int *p = *(int **)a; 	int *q = *(int **)b; 	return *p - *q; }  int main(void) { 	int *pa[10], i; 	 	// 数组初始化 	for(i=0; i<10; i++) 	{ 		pa[i] = (int *)malloc(sizeof(int)); 		scanf("%d", pa[i]); 	} 	 	// 快速排序 	qsort(pa, 10, sizeof(int *), my_cmp); 	 	// 输出排序结果 	for(i=0; i<10; i++) 	{ 		printf("%d%c", *pa[i], i!=9 ? '\t' : '\n'); 	} 	 	// 善后处理，销毁 	for(i=0; i<10; i++) 	{ 		free(pa[i]); 	} 	 	return 0; }


Question: c语言的问题

fp得到的是true or false，不是fopen的返回值，修改如下： if ((fp = fopen("xxx", "r")) == NULL) {     printf("%s", strerror(errno));     return -1;   //打开失败直接返回，防止后面的继续使用fp }

牛，都还没有分配空间就使用了。

出错信息说，指针user没有目标，所以不能用。


Question: ANSI编码

源码面前，了无秘密。 参考Windows源代码片段。

引用 21 楼 六道佩恩 的回复:[quote=引用 19 楼 早打大打打核战争 的回复:]1. ANSI也可以把其他国家/地区制定的标准定义为自己的标准，如同中国的很多GB实际是ISO或者其他国家标准的翻版，典型如KN95和N95的标准一样。  2. IBM、微软的代码页支持的字符集多于ANSI定义的字符集，如果系统默认的是个OEM代码页，那么就不是ANSI字符集，严格来说也就不算是使用ANSI编码。但是“ANSI字符集”也经常泛指非unicode字符集，尤其是在欧美之外的地区，所以并没有那么严格的划分。  3. "A版函数按理说还是能处理该代码页的字符串吧"，是可以的，A版函数实际是调用了MultiByteToWideChar，把某个代码页的字符串转换为unicode字符串，然后调用对应的W版函数，参考该函数文档中的注释：https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar： Note  The ANSI code pages can be different on different computers, or can be changed for a single computer, leading to data corruption. For the most consistent results, applications should use Unicode, such as UTF-8 or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If using Unicode is not possible, applications should tag the data stream with the appropriate encoding name when protocols allow it. HTML and XML files allow tagging, but text files do not. 微软实际上也是使用ANSI来代表非unicode  非常感谢，这是很明确的答复，总算是知道了！  请容我再问两个额外的相关的问题可以吗？  第一个问题是，ANSI代码页真的是ANSI指定的吗？毕竟没看到微软这样说，但说了“Windows代码页称呼为ANSI代码页”，知乎上也有个人说“Windows把自己的code page称作ANSI”，这些说法感觉像是微软自己指定的。  第二个问题，Windows在内核翻新为UNICODE编码后，应该就是在这个时候创建了A版和W版函数吧？那么对于在这之前的程序，是调用的无后缀版函数吧，那么对于翻新为UNICODE的新的Windows，这些程序当时是不是都乱码了？如果不是，是怎么实现不乱码的？是不是这些程序的函数跳转的地址和A版是一样，这样就实现兼容了？[/quote]  一、是微软自己指定的（早期有一部分是IBM定义的，IBM也参与了DOS和16位windows的开发），ANSI并没有定义“代码页”这种东西 二、A版和W版函数在非unicode内核的win 9x中就有了，与基于NT内核的系统相反，win9x中的W版函数转化为A版函数调用。无后缀版字符串函数只存在于16位windows中，win32中运行win16程序是使用独立的win16子系统，所以不会乱码。

#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> wchar_t a2w[256]={ 0x0020,0x263a,0x263b,0x2665,0x2666,0x2663,0x2660,0x2022, 0x25d8,0x25cb,0x25d9,0x2642,0x2640,0x266a,0x266b,0x263c, 0x25ba,0x25c4,0x2195,0x203c,0x00b6,0x00a7,0x25ac,0x21a8, 0x2191,0x2193,0x2192,0x2190,0x221f,0x2194,0x25b2,0x25bc, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302, 0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7, 0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5, 0x00e9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9, 0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192, 0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba, 0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb, 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510, 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f, 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567, 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b, 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580, 0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4, 0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229, 0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248, 0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00ff, }; 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 ws[256];     unsigned char s[256];     int i;       system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(16,  0, 0, 0, 0, 0, 0, 0, 0           , 0, 0, 0, 0, "Lucida Console");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,L"你好",2);     for (i=0;i<256;i++) s[i]=i;     for (i=0;i<256;i++) ws[i]=a2w[s[i]];     TextOutW(hdc,10, 40,ws    ,32);     TextOutW(hdc,10, 80,ws+ 32,32);     TextOutW(hdc,10,120,ws+ 64,32);     TextOutW(hdc,10,160,ws+ 96,32);     TextOutW(hdc,10,200,ws+128,32);     TextOutW(hdc,10,240,ws+160,32);     TextOutW(hdc,10,280,ws+192,32);     TextOutW(hdc,10,320,ws+224,32);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

#include <conio.h> #include <stdlib.h> int main() {     int i;      system("chcp 437 >NUL");     for (i=0;i<256;i++) {         if (i==0x08 || i==0x09 || i==0x0A || i==0x0D)             cprintf(" ");         else             cprintf("%c",i);         if (i%32==31) cprintf("\r\n");     }     return 0; }  在Win10 cmd窗口中运行以上代码 属性，字体选“点阵字体”和“Courier New”的截图：

全都是历史遗留问题。

引用 19 楼 早打大打打核战争 的回复:1. ANSI也可以把其他国家/地区制定的标准定义为自己的标准，如同中国的很多GB实际是ISO或者其他国家标准的翻版，典型如KN95和N95的标准一样。  2. IBM、微软的代码页支持的字符集多于ANSI定义的字符集，如果系统默认的是个OEM代码页，那么就不是ANSI字符集，严格来说也就不算是使用ANSI编码。但是“ANSI字符集”也经常泛指非unicode字符集，尤其是在欧美之外的地区，所以并没有那么严格的划分。  3. "A版函数按理说还是能处理该代码页的字符串吧"，是可以的，A版函数实际是调用了MultiByteToWideChar，把某个代码页的字符串转换为unicode字符串，然后调用对应的W版函数，参考该函数文档中的注释：https://docs.microsoft.com/en-us/windows/win32/api/stringapiset/nf-stringapiset-multibytetowidechar： Note  The ANSI code pages can be different on different computers, or can be changed for a single computer, leading to data corruption. For the most consistent results, applications should use Unicode, such as UTF-8 or UTF-16, instead of a specific code page, unless legacy standards or data formats prevent the use of Unicode. If using Unicode is not possible, applications should tag the data stream with the appropriate encoding name when protocols allow it. HTML and XML files allow tagging, but text files do not. 微软实际上也是使用ANSI来代表非unicode  非常感谢，这是很明确的答复，总算是知道了！  请容我再问两个额外的相关的问题可以吗？  第一个问题是，ANSI代码页真的是ANSI指定的吗？毕竟没看到微软这样说，但说了“Windows代码页称呼为ANSI代码页”，知乎上也有个人说“Windows把自己的code page称作ANSI”，这些说法感觉像是微软自己指定的。  第二个问题，Windows在内核翻新为UNICODE编码后，应该就是在这个时候创建了A版和W版函数吧？那么对于在这之前的程序，是调用的无后缀版函数吧，那么对于翻新为UNICODE的新的Windows，这些程序当时是不是都乱码了？如果不是，是怎么实现不乱码的？是不是这些程序的函数跳转的地址和A版是一样，这样就实现兼容了？

说是一物即不中。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

引用 5 楼 早打大打打核战争 的回复:ASCII编码是ANSI编码的前身，是ASA（美国标准化协会）制定的，后来ASA改名为ANSI（美国国家标准化委员会）。 严格意义上，ASCII是7位编码，后来才出现所谓扩展ASCII编码，是8位的。但是扩展ASCII并没有得到广泛使用，使用最多的是IBM的OEM字符集编码，只有前128个字符是和ASCII兼容的，后128个符号虽然也经常被称之为扩展ASCII码，但是和ANSI的扩展编码并不一致。 ANSI编码是8位编码，但是每个编码代表的字符可以不固定，在不同字符集下可以代表不同的字符，也可以连续多个编码代表一个字符（称之为DBCS或者MBCS，是对单字节字符编码做的扩展，本质上仍然是单字节字符编码），这样可以在不改变单字节字符编码的基础上支持更大的字符集。但是ANSI并没有对各字符集名称和代号做明确定义，计算机中常用的是IBM和微软定义的代码页，比如936代表GB2312字符集，1252代表拉丁1（这个就是狭义的ANSI编码），65001代表UTF-8。 IBM、OEM代码页是否算是ANSI代码页？看了微软文档后再回过头来看，才发现你提到了这个很关键的细节 微软文档说“Windows代码页”通常称为“ ANSI代码页”，而它又罗列出了IBM、OEM、ANSI代码页，那么IBM、OEM是不是不算是Windows代码页？ 微软文档又说“ A”版本处理基于Windows代码页的文本，那么如果Windows设置代码页为IBM、OEM代码页，那岂不是ANSI版函数处理ANSI编码之外的编码字符串？  您好像没有正面回答ANSI编码是否包括单字节的编码，这个很关键，因为我已经看到很多不同的说法，不知道哪个是对的，有说“双字节”的（百度百科），有说囊括ASCII的（和百度百科矛盾）

引用 8 楼 user-4 的回复:字符集和编码不是一个概念，不能混淆。 SBCS（窄字节字符集），MBCS（多字节字符集），DBCS（宽字节字符集）都是字符集。ANSI是一种本地化编码，根据它的编码规则可以知道它包含SCBS和MBCS字符集（也就是这些字符集在ANSI编码下都有对应的编码值）。 iso-8859-1也是一种编码，原则上它只包含SBCS字符集，但是它的扩展协议也支持MBCS字符集（就是把多字节拆成单字节来保存，需要时再组合还原）。比如‘中’的GB2312编码为0xd6d0，但是在ios-8859-1编码下可拆为0xd6，0xd0两个字节保存。 到这里看出点什么了吗？同一个字符，在不同编码下有不同值。所以应该不存在的SBCS属于ANSI编码吗这样的问题，而是SBCS在ANSI编码下是什么值的问题。  lz可以好好看看以下帖子（尤其是1.2节的ANSI编码字符串的解释和1.3节字符集和编码的解释） https://blog.csdn.net/leonwei/article/details/10431921  再看看各种编码的规定 https://blog.csdn.net/u014157109/article/details/99878548  额，我那个单字节字符集是在描述那个扩展ASCII是单字节编码，也就是单字节字符集的范围，虽然不知道有没有超过1字节的编码被称为扩展ASCII的。 我问的也不是“SBCS属于ANSI编码吗”这个问题呀，我问的是“扩展ASCII属于ANSI编码吗”，SBCS是用来描述扩展ASCII的。  这几天查阅了很多资料，其他的感觉差不多了，唯独ANSI始终有点问题，因为不同的文章，解释总是有点不一样，就连微软的文档，也感觉有点歧义。 这个第一个链接拷贝的百度百科的  “‘中’的GB2312编码为0xd6d0，但是在ios-8859-1编码下可拆为0xd6，0xd0”这句话虽然来自第二个链接，但我感觉有问题吧，前后表示的都不是同一个字符，只是字节值而已，和编码没有关系吧。  第二个链接我看到这样一句话：“Windows在美国ANSI码表示ASCII码”，这就和百度百科的解释矛盾了，百度百科说的是双字节编码，而且和ASCII并列的，现在第一个问题甚至变成了“ASCII和扩展ASCII算不算ANSI编码”  我没找到ios-8859-1的超过1字节的扩展，有的话可以发下吗？其实在看到“Windows在美国ANSI码表示ASCII码”这句话后，ios-8859-1应该不那么重要了，我主要是看ANSI编码是否是指代任何国家的当地编码，包括单字节的编码，因为百度百科说要两字节的  微软文档里也有一些不解的地方（https://docs.microsoft.com/en-us/windows/win32/intl/code-pages），说的是“Windows代码页”通常称为“ ANSI代码页”，可是在代码页标识符页面里https://docs.microsoft.com/en-us/windows/win32/intl/code-page-identifiers，微软标明了ANSI代码页，这只是一部分，还有OEM代码页和IBM代码页，到底是这些所有代码页都是ANSI代码页，还是仅标了ANSI的？如果是后者的话，那么“ANSI编码指当地的编码”这句话是不是就有点问题了？ 如果ANSI编码指Windows的当前代码页（微软文档说的，“ A”版本处理基于Windows代码页的文本），而Windows又设置了OEM代码页或IBM代码页，那么该代码页是否又算是ANSI编码？  ANSI编码这个问题困扰了我好几天了，我始终没有找到我想要的答案——准确的ANSI编码的定义，因为各处找到的定义又总有不全面或矛盾的地方。 真的很感谢你们宝贵的回答，但是和我的问题始终有些小偏差，可能是我描述的问题，所以我尽量再描述详尽点，以及我的疑惑

引用 11 楼 早打大打打核战争 的回复:我说了，“ANSI编码是8位编码”，当然包括单字节的编码，而且严格意义上，ANSI编码就是单字节编码。基于ANSI编码设计出来的双字节字符集（DBCS）、多字节字符集（MBCS）本质上仍然属于单字节编码，只是把单字节编码做了转义处理，允许连续的两个或多个单字节编码表达超出8位编码范围的字符。 ANSI没有定义代码页，它只是定义了若干种字符集，这些字符集都是基于单字节编码设计的。由于单字节编码的限制，不同字符集的字符和编码之间没有一一映射关系，同一个编码在不同字符集中可能代表不同的符号，同一符号在不同字符集中的编码也可能不同（比如GB2312中也有一套中文的A..Z、a..z，但是编码和英文字母是不一样的）。所以IBM、微软之类厂商才搞出了代码页的设计，代码页的目的是让支持多语种的系统知道当前使用的是什么字符集，从而能把字符编码显示为正确的字符。代码页的设计只是在非unicode系统中支持大字符集的一种折中方案，虽然可以支持远多于256个字符，但是不同字符集不能共存，一切换代码页，同一个字符串显示出来可能就变了。  谢谢，ANSI包括单字节的编码这一点我知道了，谢谢  （话说，这些字符集和编码不是各个地方自己设计的吗？）  但是，后面是您还是没正面回答呀  ANSI编码==ANSI代码页吗？ ANSI编码==本地编码（当前代码页）？  这两个显然不是都成立了，因为Windows中还集成了OEM、IBM代码页，如果系统默认的是个OEM代码页，怎么算？ A版函数按理说还是能处理该代码页的字符串吧？只是这种编码是不是就不能称为ANSI编码了？即便这就是当地的编码？  还是说，当地的编码只可能是ANSI的代码页，OEM、IBM代码页都是附加的？

老赵说的是狭义ANSI字符集，ANSI Latin-1（也就是windows 1252、ISO 8859-1），广义的ANSI字符集包括ANSI定义的所有字符集，参考：https://docs.microsoft.com/en-us/host-integration-server/core/ansi-oem-code-page-support-snanls-1

ANSI 是个人计算机使用得最普遍的字符集。由于 ANSI 标准使用单一字节表示每个字符，因此最多只能有 256 个字符和标点符号代码。虽然对英语来说已经足够了，但不能完全支持其它语言。

引用 楼主 六道佩恩 的回复:两个问题： 1. 单字节字符集的扩展ASCII，属于ANSI编码吗？ 2. ANSI编码的定义？百度百科上有说“使用多个字节来代表一个字符的各种汉字延伸编码方式”（https://baike.baidu.com/item/ANSI/10401940#viewPageContent），但在词条“标准编码格式”中（https://baike.baidu.com/item/%E6%A0%87%E5%87%86%E7%BC%96%E7%A0%81%E6%A0%BC%E5%BC%8F/20868617?fr=aladdin），ANSI编码有提到ISO-8859-2，这个标准貌似只有一个字节呀，而且这里也在ASNI一栏中提到“一个 UNICODE 字符可能转化成一个字节或多个字节”，所以，ANSI编码是否包含有1字节的编码？与单字节字符集有什么区别？ 又见字符编码  ANSI编码不是ASCII编码  关于ANSI编码需要知道以下几点： 这玩意只在Windows中存在。 ANSI编码并不是指某一种特定的编码，而是跟地区相关的。比如：中国默认就是GBK；美国默认就是ASCII。  其实ANSI并不是某一种特定的字符编码，而是在不同的系统中，ANSI表示不同的编码。你的美国同事Bob的系统中ANSI编码其实是ASCII编码（ASCII编码不能表示汉字，所以汉字为乱码），而你的系统中（“汉字”正常显示）ANSI编码其实是GBK编码，而韩文系统中（“한국어”正常显示）ANSI编码其实是EUC-KR编码。  https://www.cnblogs.com/malecrab/p/5300486.html

首先，要知道编码和文字字符集是两个概念（这里的文字字符集指的是单纯的文字字符的集合，不是指在某种编码下的字符的编码“值”的集合（前者姑且叫文字字符集，后者姑且叫编码字符集），否则容易混淆不清），它们即有联系又有区别。（我觉得lz主要就是没弄清这些概念和区别，对于相同的文字字符集，不同编码对字符定义的编码“值”不一样，也就是编码字符集不一样） 问题1 ANSI是一种编码（不是文字字符集），这种编码规定，如果是英文拉丁文等单字节字符集的字符，就用1个字节来保存，如果是汉字等双字符集的字符就用2个字节保存。每个双节字符国家的文字不一样，所以每个国家对文字字符定义的ANSI值不一样，这就造成可能对同一个文字字符可能ANSI值不一样。比如“中”，中国（台湾），日本都有这个字，但是GB2112，BIG5，JIS编码（这类称编码字符集）下该“中”字符的ANSI编码“值”不同（换个角度来说，GB2112编码字符集（这里的字符集指编码“值”的集合而不是上面说的文字字符集合）里没有定义BIG5或JIS的“中”，所以BIG5或JIS的“中”在GB2112编码下是乱码）。这里要先捋清楚编码，文字字符集和编码字符集的关系。 所以问题1的回答是，单字节字符集的扩展ASCII是个文字字符集，不能单纯地说它是什么编码，所以它未必属于ANSI编码，也能是Unicode编码  问题2 ANSI编码是否包含1字节的编码？ 包含，因为ANSI编码支持单字节字符和双字节字符。 与单字节字符集有什么区别 区别就是单字节字符集只是个文字字符集，它可以有不同的编码，比如是Unicode或UTF8编码，那么这个单字节字符集就不属于ANSI编码。

引用 5 楼 早打大打打核战争 的回复:ASCII编码是ANSI编码的前身，是ASA（美国标准化协会）制定的，后来ASA改名为ANSI（美国国家标准化委员会）。 严格意义上，ASCII是7位编码，后来才出现所谓扩展ASCII编码，是8位的。但是扩展ASCII并没有得到广泛使用，使用最多的是IBM的OEM字符集编码，只有前128个字符是和ASCII兼容的，后128个符号虽然也经常被称之为扩展ASCII码，但是和ANSI的扩展编码并不一致。 ANSI编码是8位编码，但是每个编码代表的字符可以不固定，在不同字符集下可以代表不同的字符，也可以连续多个编码代表一个字符（称之为DBCS或者MBCS，是对单字节字符编码做的扩展，本质上仍然是单字节字符编码），这样可以在不改变单字节字符编码的基础上支持更大的字符集。但是ANSI并没有对各字符集名称和代号做明确定义，计算机中常用的是IBM和微软定义的代码页，比如936代表GB2312字符集，1252代表拉丁1（这个就是狭义的ANSI编码），65001代表UTF-8。 SBCS是否可以是ANSI编码？百度百科说是两字节，那么MBCS是否可以是ANSI编码？ 对于百度百科上，将ISO-8859-2划分到ANSI编码，该如何理解？

引用 4 楼 user-4 的回复:补充说明一下 单字节字符集的扩展ASCII在不同的编码下的编码“值”相同（也就是编码字符集相同），但是在不同的编码下保存的字节长度不同，比如在ANSI编码下是占一个字节，但是在Unicode编码下占两个字节（高字节为0或低字节为0）。所以不能笼统的说它必然属于哪种编码。 可能是我的表达有误，我的意思是，扩展ASCII编码，就是欧洲使用的那种，字符也不多，在0xFF以内（单字节字符集），这种的编码算ANSI编码吗？我之所以提出这个问题，是因为在词条“标准编码格式”中，它在单字节编码一栏提到了ISO-8859-1标准，这个标准编码范围在0xFF以内，根据它对ANSI编码的描述“这些使用 2 个字节来代表一个字符的各种汉字延伸编码方式，称为ANSI 编码”，以及它和ANSI各划分为一栏，也就是它不属于ANSI编码，可是在ANSI编码一栏，还提到了ISO-8859-2，这个标准貌似也是单字节编码，为什么又属于ANSI编码了？  另外一个问题是，它这里说ANSI编码是两字节的，那么使用4字节的GB10830是否又能划分到ANSI编码？


Question: C语言 bmp文件压缩(5M压缩500K左右，10ms内完成)

如果还是不了解，用霍夫曼编码吧，难度较我的方法更大，但网上示例很多

引用 4 楼 litchee1988 的回复:[quote=引用 2 楼 六道佩恩 的回复:]我以前写过一个简单的压缩算法，试过画面较单一的BMP图片，可以压缩的几百甚至几十KB，和7z、ZIP相差不大，但对于画面复杂的，就恐怕没什么效果了（7z、zip效果也不是很好）。 这个算法很简单，就是检测连续重复的部分压缩为 重复的次数+重复的单份，先检测1字节重复的，然后遍历第二遍检测两字节重复的，如此循环，随便你检测到什么程度。至于时间能否控制在10ms以内，不清楚。如果BMP是24位的，你直接检测3字节重复的话，应该能控制在10ms以内吧（毕竟这已经是非常简单的压缩算法了，，且仅需一次遍历，如果这都达不到10ms，不知道还有什么算法可以）。  有没有相关代码供我参考一下呢？[/quote] 抱歉，代码不提供，而且整体思路我觉得我已经讲得挺明白了，就是不断的多字节的对比。比如一个int数组，每个数都是99，有1万个，那么你只需保存10000和99即可，检查该int重复多少次这没问题吧？一个int占4字节，这不就相当于检测了4字节重复了吗？任意字节的可用memcpy。

引用 2 楼 六道佩恩 的回复:我以前写过一个简单的压缩算法，试过画面较单一的BMP图片，可以压缩的几百甚至几十KB，和7z、ZIP相差不大，但对于画面复杂的，就恐怕没什么效果了（7z、zip效果也不是很好）。 这个算法很简单，就是检测连续重复的部分压缩为 重复的次数+重复的单份，先检测1字节重复的，然后遍历第二遍检测两字节重复的，如此循环，随便你检测到什么程度。至于时间能否控制在10ms以内，不清楚。如果BMP是24位的，你直接检测3字节重复的话，应该能控制在10ms以内吧（毕竟这已经是非常简单的压缩算法了，，且仅需一次遍历，如果这都达不到10ms，不知道还有什么算法可以）。  有没有相关代码供我参考一下呢？

引用 1 楼 user-2 的回复:设置压缩参数，使用速度最快的方式，但，结果是，压缩比很低  请问如何设置压缩参数呢？我早Gzip的deflate方法中没看到可是设置压缩参数的地方呀？LZMA也没有看到过

设置压缩参数，使用速度最快的方式，但，结果是，压缩比很低


Question: 函数实现交换

仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

引用 2 楼 forever74 的回复:你是main，我是swap 你左口袋装200美刀，右口袋装200人民币， 我仿照你的口袋装了我的口袋， 然后我交换了自己的两个口袋， ----这和你有什么关系？ 有关系，如果实参不传给形参，形参怎么知道是200？而不是其他的值，没关系，不调用传值，形参怎么知道交换的是什么值？不调用函数怎么会交换？

不是没有执行，而是执行的是swap函数里的局部变量，交换的是swap里的两个参数值，没有修改main函数里的两个值。所以感觉是没有执行。  解决办法是传要交换的两个变量的地址，在swap函数里交换引用到的值，就是交换main函数里的两个变量的值了。

函数实参和形参的关系问题， 请参考《C++中函数参数类型为指针的指针》 希望能够帮到您！

C语言之传值的，需要传地址才有效果。仅供参考： #include  <stdio.h> void  Swap(int *x, int *y); int main(void) {     int  a, b;     printf("Please enter a,b:");     scanf_s("%d %d", &a, &b);     printf("Before swap: a = %d, b = %d\n", a, b);     Swap(&a, &b);     printf("After swap: a = %d, b = %d\n", a, b);     return 0; } void Swap(int *x, int *y) {     int temp;     temp = *x;     *x = *y;     *y = temp; }


Question: 求助括号配对问题（用stack），main.c有一部分代码不会写，请求高手指导

void Test(void) { 	char buf[512]; 	char stack[512];  	bool run = true; 	while (run) 	{ 		buf[0] = 0;  		while (buf[0] == 0) 		{ 			gets_s(buf, 512); 		}  		int stackLen = 0; 		stack[0] = 0;  		bool result = true; 		char* pch = buf; 		while (*pch != 0) 		{ 			if (*pch == '(' 				|| *pch == '[' 				|| *pch == '{') 			{ 				stack[stackLen++] = *pch; 			} 			else if (*pch == ')') 			{ 				if (stackLen > 0 && stack[stackLen - 1] == '(') 				{ 					stack[--stackLen] = 0; 				} 				else 				{ 					result = false; 					break; 				} 			} 			else if (*pch == ']') 			{ 				if (stackLen > 0 && stack[stackLen - 1] == '[') 				{ 					stack[--stackLen] = 0; 				} 				else 				{ 					result = false; 					break; 				} 			} 			else if (*pch == '}') 			{ 				if (stackLen > 0 && stack[stackLen - 1] == '{') 				{ 					stack[--stackLen] = 0; 				} 				else 				{ 					result = false; 					break; 				} 			} 			else 			{ 				result = false; 				break; 			}  			++pch; 		}  		result &= stackLen == 0;  		printf(result ? "yes\r\n" : "no\r\n");  		printf("继续测试吗？输入y/n：");  		char input = 0; 		scanf_s("%c", &input, sizeof(char)); 		run = input == 'y'; 	} }


Question: 求助如何用C语言编写一个求解定积分的程序

定积分定义分割、取点、近似、求和、取极限。确实比较烦，但是牛顿-莱布尼茨公式用起来很方便的，用不着程序。

根据定积分定义，不要怕麻烦，自己写就行。


Question: 萌新求助

正解。。。。。。。。。。。。。。。

建议用%p输出一下地址，p+1应该是偏移3 * sizeof(int)的字节数 *(p+1)是p[1]，即第二行的首地址

打印第9行修改下：printf("9 *(b+2)+2 = %d, %d\n\n",*(b+2)+2,*(*(b+2)+2));

这段代码上机运行下，你很快就明白了。int main(int argc, char* argv[]) {     int b[3][4] = {{1,3,5,7},                          {9,11,13,15},                          {17,19,21,23}     };      printf("1 b[2][1] =  %d\n\n",b[2][1]);     printf("2 b[1] = %d, %d\n\n",b[1],*b[1]);     printf("3 b = %d, %d\n\n",b,**b);     printf("4 b+1 = %d, %d\n\n",b+1,**(b+1));     printf("5 *b+1 = %d, %d\n\n",*b+1,*(*b+1));     printf("6 *(b+1) = %d, %d\n\n",*(b+1),*(*(b+1)));     printf("7 b[2]+1 = %d, %d\n\n",b[2]+1,*(b[2]+1));     printf("8 *(b+1)+1 = %d, %d\n\n",*(b+1)+1,*(*(b+1)+1));     printf("9 *(*(b+2)+2) = %d, %d\n\n",*(b+2)+2,*(*(b+2)+2));     system("pause");     return 0; }

p+1表示次行（即s[1]行）首地址 ×(p+1)表示s[1][0]元素的地址  这俩货的值一致，含义不同。


Question: C语言 回调函数接口的两个问题？

//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

对于函数指针的相关内容，请参考 《C++中的函数指针1》 《C++中的函数指针2》 希望能够帮到您！

引用 1 楼 user-3的回复:请问 void* (*函数)是什么意思 和 指针函数 void （*函数）有什么区别？  这两个都是函数指针，第一个返回值是void*，第二个返回值是  它丫的没有返回值  函数调用有三种方式 __cdecl 默认方式 __stdcall winAPI函数都是这个方式 __fastcall 至于三者区别，自己网上找找  https://www.cnblogs.com/yenyuloong/p/9626658.html 牛逼 大神 谢了


Question: 哪位大神帮忙简化一下这个代码啊，千恩万谢！！！

啥叫本事？ //想要实现循环语句来实现每天，每月，每年的累积数 if(\\local\$Day==1) {     if(\\local\$Hour==1  &&  \\local\$Minute==1 ) {\\local\hour.H1 =\\local\FT;}     if(\\local\$Hour==2  &&  \\local\$Minute==1 ) {\\local\hour.H2 =\\local\FT;}     if(\\local\$Hour==3  &&  \\local\$Minute==1 ) {\\local\hour.H3 =\\local\FT;}     if(\\local\$Hour==4  &&  \\local\$Minute==1 ) {\\local\hour.H4 =\\local\FT;}     if(\\local\$Hour==5  &&  \\local\$Minute==1 ) {\\local\hour.H5 =\\local\FT;}     if(\\local\$Hour==6  &&  \\local\$Minute==1 ) {\\local\hour.H6 =\\local\FT;}     if(\\local\$Hour==7  &&  \\local\$Minute==1 ) {\\local\hour.H7 =\\local\FT;}     if(\\local\$Hour==8  &&  \\local\$Minute==1 ) {\\local\hour.H8 =\\local\FT;}     if(\\local\$Hour==9  &&  \\local\$Minute==1 ) {\\local\hour.H9 =\\local\FT;}     if(\\local\$Hour==10 &&  \\local\$Minute==1 ) {\\local\hour.H10=\\local\FT;}     if(\\local\$Hour==11 &&  \\local\$Minute==1 ) {\\local\hour.H11=\\local\FT;}     if(\\local\$Hour==12 &&  \\local\$Minute==1 ) {\\local\hour.H12=\\local\FT;}     if(\\local\$Hour==13 &&  \\local\$Minute==1 ) {\\local\hour.H13=\\local\FT;}     if(\\local\$Hour==14 &&  \\local\$Minute==1 ) {\\local\hour.H14=\\local\FT;}     if(\\local\$Hour==15 &&  \\local\$Minute==1 ) {\\local\hour.H15=\\local\FT;}     if(\\local\$Hour==16 &&  \\local\$Minute==1 ) {\\local\hour.H16=\\local\FT;}     if(\\local\$Hour==17 &&  \\local\$Minute==1 ) {\\local\hour.H17=\\local\FT;}     if(\\local\$Hour==18 &&  \\local\$Minute==1 ) {\\local\hour.H18=\\local\FT;}     if(\\local\$Hour==19 &&  \\local\$Minute==1 ) {\\local\hour.H19=\\local\FT;}     if(\\local\$Hour==20 &&  \\local\$Minute==1 ) {\\local\hour.H20=\\local\FT;}     if(\\local\$Hour==21 &&  \\local\$Minute==1 ) {\\local\hour.H21=\\local\FT;}     if(\\local\$Hour==22 &&  \\local\$Minute==1 ) {\\local\hour.H22=\\local\FT;}     if(\\local\$Hour==23 &&  \\local\$Minute==1 ) {\\local\hour.H23=\\local\FT;}     if(\\local\$Hour==23 &&  \\local\$Minute==59) {\\local\hour.H0 =\\local\FT;         \\local\day.D1=(           \\local\hour.H1 +           \\local\hour.H2 +           \\local\hour.H3 +           \\local\hour.H4 +           \\local\hour.H5 +           \\local\hour.H6 +           \\local\hour.H7 +           \\local\hour.H8 +           \\local\hour.H9 +           \\local\hour.H10+           \\local\hour.H11+           \\local\hour.H12+           \\local\hour.H13+           \\local\hour.H14+           \\local\hour.H15+           \\local\hour.H16+           \\local\hour.H17+           \\local\hour.H18+           \\local\hour.H19+           \\local\hour.H20+           \\local\hour.H21+           \\local\hour.H22+           \\local\hour.H23+           \\local\hour.H0         );     } }

用个指针数组,例如 p[23]，元素分别指向 \\local\hour.H0 ~ \\local\hour.H23， if (\\local\$Minute==1)  {  *p[\\local\$Hour ] = \\local\FT;  }

看来你也没啥本事

靠。你这小子没事。。在闭门造语言哇。。。牛。。。。太牛了。。。。。


Question: 用DEV C++和VS 2019 编译同样的代码输出结果不一样！！

你要是坚持用的话，可以把所有中间过程都表达为double，不使用int，避免截断误差循环累积。  仅仅在最后输出前把结果+0.5再取整以四舍五入。

引用 11 楼 forever74的回复:除非必要，这种问题不要使用浮点数，pow库函数是浮点值。不同的编译器引用不同的库。  你以为double的精度足够，但是须知以浮点规范来说0.999999999999999也是整数1的足够精度的近似，但是一旦赋值给整型，它就等同于0了。 但是这个算出来是都整数哇，应该不影响吧

引用 8 楼 ctrigger的回复:[quote=引用 7 楼 AruNi° ഒ 的回复:][quote=引用 1 楼 ctrigger的回复:]结果应该是确定的。 不一样，说明代码有问题，需要修改。。 你也不说要完成什么功能，谁也帮不了你。。。 题目已发，帮忙看看吧[/quote]  第5楼，我写的，仅供参考。[/quote] 大佬，你那个递归函数怎么想到的啊？求思路！

大佬，你那个递归函数怎么想出来的啊？

引用 7 楼 AruNi° ഒ 的回复:[quote=引用 1 楼 ctrigger的回复:]结果应该是确定的。 不一样，说明代码有问题，需要修改。。 你也不说要完成什么功能，谁也帮不了你。。。 题目已发，帮忙看看吧[/quote]  第5楼，我写的，仅供参考。

引用 1 楼 ctrigger的回复:结果应该是确定的。 不一样，说明代码有问题，需要修改。。 你也不说要完成什么功能，谁也帮不了你。。。 题目已发，帮忙看看吧

引用 3 楼 user-3的回复:修改如下，供参考：#include<stdio.h> #include<math.h> int fn(int a,int n);//函数声明 int main(int argc, char* argv[]) {     int a,n,sum;     int i;     sum=0;     scanf("%d %d",&a,&n); //输入a，n      for(i=1;i<=n;i++){         sum+=fn(a,i);//循环 完成累加     }     printf("Sum=%d",sum);     system("pause");     return 0;  }  int fn(int a,int n) {     int result=0;     for(int i=0;i<n;i++){          result += a*pow(10,i);//pow(2,3)表示2的3次     }     return result; } 第四行是什么意思啊？

Show一个，仅供参考： #include <stdio.h>  int fn(int a, int n) { 	if(n == 1) return a; 	else return a * (10 * fn(1, n-1) + n); }  int main(void) { 	int a, n; 	scanf("%d %d",&a, &n); 	printf("Sum=%d", fn(a, n)); 	return 0; }

前面这个是楼主的代码，是正确的。这个是修改的，另一种写法，供参考：#include<stdio.h>  int fn(int a,int n);//函数声明 int main(int argc, char* argv[]) {     int a,n,sum;     int i;     sum=0;     scanf("%d %d",&a,&n); //输入a，n      for(i=1;i<=n;i++){         sum+=fn(a,i);//循环 完成累加     }     printf("Sum=%d\n",sum);      system("pause");     return 0;  }  int fn(int a,int n) {     int result=0;     for(int i=0;i<n;i++){          //result += a*pow(10,i);//pow(2,3)表示2的3次          result = result * 10 + a;     }     return result; }

题目是这个。


Question: 优秀的人们快来看看，超级简单的问题！！！！但是我不会。。。。。

代码？错误提示？

这问题简单啊。既然标识符未定义，直接定义一次吧。。你如果不放心，还可以再定义一次，绝对保险。。。

哪有未定义的标识符？


Question: 新手报道，求关注，每天分享c语言作业

bool IsPrime(int n) {     if (n == 1)         return false;       if (n == 2         || n == 3         || n == 5         || n == 7)     {         return true;     }       if (n % 2 == 0)         return false;       if (n % 3 == 0)         return false;       if (n % 5 == 0)         return false;       if (n % 7 == 0)         return false;       double dn = sqrt(n);     int cnt = (int)dn;     for (int i = 11; i <= cnt; i += 2)  // 继续优化 i += 2     {         if (n % i == 0)             return false;     }       return true; }

引用 1 楼 自信男孩 的回复:题目描述：  一个素数，依次从低位去掉一位，二位，……，若所得的各数仍都是素数，则称超级素数。  例如：7331是个4位超级素数，因为7，73，733，7331均为素数. 试求1000~n之内(1000<n<9999)： (1)超级素数的个数 (2)所有超级素数之和 (3)最大的超级素数。   bool IsPrime(int n) { 	if (n == 1) 		return false;  	if (n == 2 		|| n == 3 		|| n == 5 		|| n == 7) 	{ 		return true; 	}  	if (n % 2 == 0) 		return false;  	if (n % 3 == 0) 		return false;  	if (n % 5 == 0) 		return false;  	if (n % 7 == 0) 		return false;  	double dn = sqrt(n); 	int cnt = (int)dn; 	for (int i = 11; i <= cnt; ++i)  // 优化一下，从11开始 	{ 		if (n % i == 0) 			return false; 	}  	return true; }  void Test(void) { 	int n = 0; 	printf("请输入n(1000<n<9999)："); 	scanf_s("%d", &n); 	if (n <= 1000 || 9999 <= n) 	{ 		printf("输入错误！"); 		return; 	}  	int count = 0; 	int sum = 0; 	int max = 0; 	for (int i = 2001; i <= n; ++i) 	{ 		int test = i; 		if (IsPrime(test)) 		{ 			test /= 10; 			if (IsPrime(test)) 			{ 				test /= 10; 				if (IsPrime(test)) 				{ 					test /= 10; 					if (IsPrime(test)) 					{ 						++count; 						sum += i; 						max = i; 						printf("%d\r\n", i); 					} 				} 			} 		} 	}  	printf("(1)超级素数的个数：%d\r\n(2)所有超级素数之和：%d\r\n(3)最大的超级素数：%d\r\n", count, sum, max); }

bool IsPrime(int n) { 	if (n == 1) 		return false;  	if (n == 2 		|| n == 3 		|| n == 5 		|| n == 7) 	{ 		return true; 	}  	if (n % 2 == 0) 		return false;  	if (n % 3 == 0) 		return false;  	if (n % 5 == 0) 		return false;  	if (n % 7 == 0) 		return false;  	double dn = sqrt(n); 	int cnt = (int)dn; 	for (int i = 2; i <= cnt; ++i) 	{ 		if (n % i == 0) 			return false; 	}  	return true; }  void Test(void) { 	int n = 0; 	printf("请输入n(1000<n<9999)："); 	scanf_s("%d", &n); 	if (n <= 1000 || 9999 <= n) 	{ 		printf("输入错误！"); 		return; 	}  	int count = 0; 	int sum = 0; 	int max = 0; 	for (int i = 2001; i <= n; ++i) 	{ 		int test = i; 		if (IsPrime(test)) 		{ 			test /= 10; 			if (IsPrime(test)) 			{ 				test /= 10; 				if (IsPrime(test)) 				{ 					test /= 10; 					if (IsPrime(test)) 					{ 						++count; 						sum += i; 						max = i; 						printf("%d\r\n", i); 					} 				} 			} 		} 	}  	printf("(1)超级素数的个数：%d\r\n(2)所有超级素数之和：%d\r\n(3)最大的超级素数：%d\r\n", count, sum, max); }   请输入n(1000<n<9999)：8000 2333 2339 2393 2399 2939 3119 3137 3733 3739 3793 3797 5939 7193 7331 7333 7393 (1)超级素数的个数：16 (2)所有超级素数之和：68910 (3)最大的超级素数：7393 请按任意键继续. . .


Question: 使用链表实现 图书管理系统

代码不全，问题不明确～


Question: 送分

我知道了，粘贴在Code之间就可以了，谢谢！！

引用先把源文件截屏成图片再上传吗？但我看别人上传的代码是能在网页上选中复制的。又好象不是图片 2020-12-09 14:35:33#2得分 0 第一张图是怎么上传代码，这个位置选择语言的类型 第二张图是怎么上传图片。


Question: 输入一个数按从大到小的规则插入已排好序的数组中（数组从大到小排序）

#include <stdio.h>  //void main() int main() {     int i, j;     int a[6]={1,3,5,7,9}, n;      printf("请输入插入数组中的数:");     scanf("%d",&n); #if 1     for (i = 0; i < 5; i++)         if (n < a[i])             break;      for (j = 5; j > i ; j--) {         a[j] = a[j-1];     }     a[i] = n; #else      for(i=4;i>=0;i--)                         //从a[4]开始往前和n比叫较     {         if(n<a[i])                            //符合条件将a[i]后移         {             a[i+1]=a[i];             if(i==0)                     //若输入的数小于数组中最小的数，将a[0]赋值为n                 a[0]=n;         }         else         {             a[i+1]=n;                     //此时n介于数组最大最小数之间，a[i]<n,a[i+1]是空出来的，赋值n             break;         }     } #endif     for(i=0;i<6;i++)         printf("%4d",a[i]); } 供参考～

是代码展示还是不啥问题？


Question: 谁可帮我解决这优美的语言问题

引用 1 楼 自信男孩的回复:输出只看printf就好了，看了printf发现不看上面的代码也是可以的。最终的结果跟上面的定义和计算都没关系；  输出是%d输出，后面对应的是一个7.3浮点数（解析成double类型），前三个选项都没意义。B和C肯定不对，因为%d不会输出浮点数； A和D可能有一个对，但是3怎么来，也看不出来。  这个要熟悉一下，对于浮点数和整型数在内存里的表示是不一样的，结果是0。并且7.3默认是double类型 要更详细的分析这个问题，需要把7.3在内存里的表示，然后这个数再按照整型数输出来就知道为啥是0了。 真专业


Question: （C语言）编程实现，将1-1000间的所有超级素数显示出来。超级素数是各个位的数字都是素数，且本身也为素数的数。

简单一点：  #include <stdio.h>  int main() {   int i, j, k, p[168] = {2, 3, 5, 7};    for (i = 11, k = 4; j = 1, i < 1000; i += 2)   {     while (j < k && p[j] < 32) if (!(i % p[j++])) break;     if (j == k || i % p[j - 1]) p[k++] = i;   }    for (i = 0; j = p[i] / 100, k = p[i] % 100 / 10, i < 168; i++)     if (p[i] < 9 || ((p[i] % 10 == 3 || p[i] % 10 == 7) &&                        (!j || j == 2 || j == 3 || j == 5 || j == 7) &&                         (k == 2 || k == 3 || k == 5 || k == 7)))       printf("%d\n", p[i]);    return 0; }

int main() {         int n[]={0,2,3,5,7};         int i,j,k,t;         for(i=0;i<5;i++)                 for(j=(i?1:0);j<5;j++)                         for(k=1;k<5;k++)                                 if(IsPrimeLT1k(t=100*n[i]+10*n[j]+n[k]))                                         printf("%d\n",t);         return 0; }

在限定范围的情况下，要追求快可以离线制表，O(1)： int IsPrimeLT1k(int a) {         static unsigned int x[]={2693408940,673221152,34112136,2147625122,                 547359240,2150113416,2148008098,134382120,169910402,579338272,                 671221760,2283831426,33693728,142770216,2148049410,545785984,                 536873472,168304648,2189559810,8391200,2629770,537397282,                 545292320,35684488,537395234,681576960,2317353088,9052160,                 8423424,34087426,2156005504,673316896 };         return x[a/32]&(1<<(a%32)); }

引用坛子里怎么都跟素数干上了，下面是我上午刚写的函数 #5楼 算法是最节约时间的

引用 4 楼 user-6 的回复:上面代码，漏掉一个质数2。进一步修正如下： #include <stdio.h> #include <math.h>   int is_prime(int num);   int main(void) {     int i, tmp;          for (i = 1; i < 1000; i++) {         tmp = i;         if (is_prime(tmp)) {             while (is_prime(tmp % 10)) tmp /= 10;             if (tmp == 0) printf("%d ", i);         }     }       return 0; }   int is_prime(int num) {     int i, size;       if (num < 2) return 0;       size = (int)sqrt(num);     for (i = 2; i < size + 1; i++)         if (num % i == 0) return 0;       return 1; } 对于小于10的素数是不是也要进入while循环？

坛子里怎么都跟素数干上了，下面是我上午刚写的函数   bool IsPrime(int n) { 	if (n == 1) 		return false;  	if (n == 2 		|| n == 3 		|| n == 5 		|| n == 7) 	{ 		return true; 	}  	if (n % 2 == 0) 		return false;  	if (n % 3 == 0) 		return false;  	if (n % 5 == 0) 		return false;  	if (n % 7 == 0) 		return false;  	double dn = sqrt(n); 	int cnt = (int)dn; 	for (int i = 11; i <= cnt; i += 2) 	{ 		if (n % i == 0) 			return false; 	}  	return true; }

把2楼的main函数简化一下，如下，供参考： #include <stdio.h> #include <math.h>   int is_prime(int num);   int main(void) {     int i, tmp;          for (i = 1; i < 1000; i += 2) {         tmp = i;         if (is_prime(tmp)) {             while (is_prime(tmp % 10)) tmp /= 10;             if (tmp == 0) printf("%d ", i);         }     }       return 0; }   int is_prime(int num) {     int i, size;       if (num < 2) return 0;       size = (int)sqrt(num);     for (i = 2; i < size + 1; i++)         if (num % i == 0) return 0;       return 1; }

#include <stdio.h> #include <math.h>  int is_prime(int num);  int main(void) {      int i;     int tmp;      for (i = 1; i < 1000; i += 2) {         //printf("i = %d\n", i);         tmp = i;         if (is_prime(tmp)) {             if (tmp < 10) {                 printf("%d ", i);                 continue;             }             while (tmp) {                 if (is_prime(tmp % 10)) {                     tmp /= 10;                     continue;                 }                 break;             }             if (tmp == 0)                 printf("%d ", i);         }     }      return 0;  }  int is_prime(int num) {     int i;      if (num < 2)         return 0;      int size = (int)sqrt(num);     for (i = 2; i < size + 1; i++)         if (num % i == 0)             return 0;      return 1; }  供参考～


Question: 结构体排序， 每次按不同元素排列，使用同一个函数，这个语句与参数怎么写？谢谢了

楼主，这个是否符合你的要求，供参考：#include <stdio.h> #include <string.h> #include<algorithm.h> #include <iostream.h> struct student {     char name[20];     char tel [12]; };  int c;//控制排序规则   void outPut(student ss[]);  int compare(const student a, const student b) { 	if (c == 0)//按照姓名升序排序 	{           return strcmp(a.name,b.name)<0;//strcmp是用来比较两个char型字符串的字典序大小  string.h头文件下 	} 	else if (c == 1)//按照电话降序排序 	{           return strcmp(a.tel,b.tel)>0; 	} }   int main(int argc, char* argv[]) {     student contacts[10] = { {"LiLei"    ,"13678941562"},                              {"WangHao"  ,"15046523182"},                              {"WangDi"   ,"13598741863"},                              {"OuyangDan","13875469871"},                              {"HanLi"    ,"13647152364"},                              {"Zhengchao","15098563214"},                              {"Futong"   ,"13213254698"},                              {"FangYang" ,"15978632132"},                              {"BaiHao"   ,"15432145698"},                              {"Cenyu"    ,"15896566532"} };      printf("姓名按增序排列:\n");     c =0;     sort(contacts,contacts+10,compare);     outPut(contacts);                      printf("电话号码按降序排列：\n");     c =1;     sort(contacts, contacts + 10,compare);     outPut(contacts);          system("pause");     return 0;      }  void outPut(struct student ss[]) {     int i;     printf("          ------通讯录-------\n");     printf("          姓名\t\t\电话\t\t\n");     for (i = 0; i < 10; i++)         printf("%20s\t\%12s\t\n",ss[i].name,ss[i].tel);     printf("\n"); }

如百度到别人写的  stu.cpp : Defines the entry point for the console application.   // #include "stdafx.h" //------------------------------------------指针排序-------------------------------------------------------------------------------   #include<stdio.h> #include<stdlib.h> #include<string.h>   #define N 3   //学生结构体 struct student{ 	long stuNum; //学号 	char name[20];//姓名 	char idCard[18];//身份证 	float score[3];//三门成绩 };   //根据学生姓名排序 void name_sort(student *stu,int n) { 	student temp; 	for(int i=0;i<n-1;i++) 	{ 		for(int j=0;j<n-1-i;j++) 		{ 			if(strcmp(stu[j].name,stu[j+1].name)>0) 			{ 				temp =stu[j+1]; 				stu[j+1]=stu[j]; 				stu[j]=temp;   			} 		} 	}   	printf("\n"); 	printf("*根据学生姓名排序后的学生情况:\n\n");   	for(int i=0;i<N;i++) 	{ 		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);   	} } //根据身份证进行排序 void idCard_sort(student *stu,int n) { 	student temp; 	for(int i=0;i<n-1;i++) 	{ 		for(int j=0;j<n-1-i;j++) 		{ 			if(strcmp(stu[j].idCard,stu[j+1].idCard)>0) 			{ 				temp =stu[j+1]; 				stu[j+1]=stu[j]; 				stu[j]=temp;   			} 		} 	}     	printf("\n"); 	printf("*根据学生身份证排序后的学生情况:\n\n");   	for(int i=0;i<N;i++) 	{ 		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]);   	}     }   //根据学号进行排序   void stuNum_sort(student *stu,int n) { 	 	student temp; 	for(int i=0;i<n-1;i++) 	{ 		for(int j=0;j<n-1-i;j++) 		{ 			if(stu[j].stuNum>stu[j+1].stuNum) 			{ 				temp =stu[j+1]; 				stu[j+1]=stu[j]; 				stu[j]=temp;   			} 		} 	}     	printf("\n"); 	printf("*根据学生学号排序后的学生情况:\n\n");   	for(int i=0;i<N;i++) 	{ 		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); 		 	}     }   //main函数   int main() {   	struct student stu[N],*pStu;   	//控制台屏幕变为蓝色背景 	system("color 1f");   	printf("请依次输入学生的学号，姓名，身份证，三门成绩(空格分开)\n"); 	for(int i=0;i<N;i++) 	{ 		printf("输入第 %d 个学生的信息\n",i+1); 		scanf("%ld%s%s%f%f%f",&stu[i].stuNum,stu[i].name,stu[i].idCard,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); 		 	} 	 	pStu=stu;       	//清屏 	system("cls");     	printf("\n*** 输入1 按照学生学号排序 ***\n*** 输入2 按照学生姓名排序 ***\n*** 输入3 按照学生身份证排序 ***\n*** 输入0 退出 ***\n\n");   	printf("请输入:"); 	int t; 	scanf("%d",&t);   	//循环 	do{ 		//根据用户输入的值选择排序的字段 		switch (t) 		{ 		case 1: 			stuNum_sort(pStu,N);//学号排序 			break; 		case 2: 			name_sort(pStu,N);//姓名排序 			break;   		case 3: 			idCard_sort(pStu,N);//身份证排序 			break;   		default: 			name_sort(pStu,N); 		}     		printf("\n请输入:"); 		scanf("%d",&t);   	}while(t!=0);   	return 1; }             //------------------没有指针--------------------------------------------------------------------------------------------------   // //#include<stdio.h> //#include<stdlib.h> //#include<string.h> // //#define N 5 // 学生结构体 //struct student{ //	long stuNum; //学号 //	char name[20];//姓名 //	char idCard[18];//身份证 //	float score[3];//三门成绩 //}; // // 根据学生姓名排序 //void name_sort(student stu[],int n) //{ //	student temp; //	for(int i=0;i<n-1;i++) //	{ //		for(int j=0;j<n-1-i;j++) //		{ //			if(strcmp(stu[j].name,stu[j+1].name)>0) //			{ //				temp =stu[j+1]; //				stu[j+1]=stu[j]; //				stu[j]=temp; // //			} //		} //	} // // //	printf("\n"); //	printf("*根据学生姓名排序后的学生情况:\n\n"); //	 //	for(int i=0;i<N;i++) //	{ //		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); //		 //	} // // //} 根据身份证进行排序 //void idCard_sort(student stu[],int n) //{ //	student temp; //	for(int i=0;i<n-1;i++) //	{ //		for(int j=0;j<n-1-i;j++) //		{ //			if(strcmp(stu[j].idCard,stu[j+1].idCard)>0) //			{ //				temp =stu[j+1]; //				stu[j+1]=stu[j]; //				stu[j]=temp; // //			} //		} //	} // // //	printf("\n"); //	printf("*根据学生身份证排序后的学生情况:\n\n"); // //	for(int i=0;i<N;i++) //	{ //		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); // //	} // // //} // 根据学号进行排序 // //void stuNum_sort(student stu[],int n) //{ //	student temp; // //	for(int i=0;i<n-1;i++) //	{ //		for(int j=0;j<n-1-i;j++) //		{ //			if(stu[j].stuNum>stu[j+1].stuNum) //			{ //				temp =stu[j+1]; //				stu[j+1]=stu[j]; //				stu[j]=temp; // //			} //		} //	} // // //	printf("\n"); //	printf("*根据学生学号排序后的学生情况:\n\n"); // //	for(int i=0;i<N;i++) //	{ //		printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); // //	} // // //} // main函数 // //int main() //{ // //	struct student stu[N]; //	 //	//控制台屏幕变为蓝色背景 //	system("color 1f"); // //	printf("请依次输入学生的学号，姓名，身份证，三门成绩(空格分开)\n"); //	for(int i=0;i<N;i++) //	{ //		printf("输入第 %d 个学生的信息\n",i+1); //		scanf("%ld%s%s%f%f%f",&stu[i].stuNum,stu[i].name,stu[i].idCard,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]); // //	} // //	//清屏 //	system("cls"); //	 //	 //	//printf("*你所输入的学生信息情况:\n"); //	//for(i=0;i<N;i++) //	//{ //	//	printf("第 %d 个学生信息:\n学号：%ld\t姓名：%s\t身份证：%s\t语文：%.2f\t数学:%.2f\t英语：%.2f\n",i+1,stu[i].stuNum,stu[i].name,stu[i].idCard,stu[i].score[0],stu[i].score[1],stu[i].score[2]); //	// //	//} //	 // //	printf("\n*** 输入1 按照学生学号排序 ***\n*** 输入2 按照学生姓名排序 ***\n*** 输入3 按照学生身份证排序 ***\n*** 输入0 退出 ***\n\n"); //	 //	printf("请输入:"); //	int t; //	scanf("%d",&t); //	 //	//循环 //	do{ //		//根据用户输入的值选择排序的字段 //		switch (t) //		{ //		case 1: //				stuNum_sort(stu,N);//学号排序 //				break; //		case 2: //				name_sort(stu,N);//姓名排序 //				break; //				 //		case 3: //				idCard_sort(stu,N);//身份证排序 //				break; //			 //		default: //			name_sort(stu,N); //		} // // //		printf("\n请输入:"); //		scanf("%d",&t); // //	}while(t!=0); // // //	return 1; //}      再次说明下 ，，我不想 	stuNum_sort(pStu,N);//学号排序 			 			name_sort(pStu,N);//姓名排序 			 			idCard_sort(pStu,N);//身份证排序  这三个分开写，意思写成一个函数即可

#include "stdio.h" #include "string.h" struct student {     char name[20];     char tel[12]; }; //void sort(student ss[]); void sort(struct student ss[], int (*cmp)(const student *, const student *)); void outPut(student ss[]);   static int cmp_as_name(const student *a1, const student *b1); static int cmp_as_tel(const student *a1, const student *b1); int main() {     student contacts[10] = { {"LiLei","13678941562"},         {"WangHao","15046523182"},         {"WangDi","13598741863"},         {"OuyangDan","13875469871"},         {"HanLi","13647152364"},         {"Zhengchao","15098563214"},         {"Futong","13213254698"},         {"FangYang","15978632132"},         {"BaiHao","15432145698"},         {"Cenyu","15896566532"} };     sort(contacts, cmp_as_name);     outPut(contacts);     sort(contacts, cmp_as_tel);     outPut(contacts);     return 0; }  static int cmp_as_name(const student *a1, const student *b1) {     return strcmp(a1->name, b1->name); }  static int cmp_as_tel(const student *a1, const student *b1) {     return strcmp(a1->tel, b1->tel); }  //void sort(struct student ss[]) void sort(struct student ss[], int (*cmp)(const student *, const student *)) {     int i,j;     student temp;     for (i = 0; i < 10 - 1; ++i)         for (j = i + 1; j < 10; ++j)         {             //if (ss[i].name[0] >= ss[j].name[0]) {             if (cmp(&ss[i], &ss[j]) > 0) {                 temp = ss[i];                 ss[i] = ss[j];                 ss[j] = temp;             }         } }   void outPut(struct student ss[]) {     int i;     printf("------通讯录-------\n");     printf("姓名\t\t电话\t\n");     for (i = 0; i < 10; i++)         printf("%s\t\t%s\t\n",ss[i].name,ss[i].tel);     printf("\n"); }   供参考~  用函数指针吧


Question: 直接插入排序

scanf("%d ",&r[i]); 这是一个结构体呢？直接对结构体赋值怎么理解？

错误的地方：#include<stdio.h> #define list_size 20  typedef int keytype; typedef int othertype;  typedef struct{         keytype   key;         othertype other_data; }recordtype;  void inssort(recordtype r[],int length) //排序操作算法有问题 //对记录数组r做直接插入排序，length为数组中待排序记录的数目 {     int i,j;     for(i=2;i<=length;i++)       {         r[0]=r[i];         j=i-1;         while(r[0].key<r[j].key)           {             r[j+1]=r[j];             j=j-1;          }       r[j+1]=r[0];     } }  int main(int argc, char* argv[]) {     int length=3,i;         // length的值没有     recordtype r[list_size]; // r应是结构体的数组，不是变量定义                               //输入     for (i = 0; i < length; i++)        {           scanf("%d",&r[i]);//r 是变量的话，这里就错了        }     printf("\n");      inssort(r,length);                             //输出     for (i = 0; i < length; i++) {         printf("%d", r[i]);     }     printf("\n");     system("pause");     return 0; }

引用 1 楼 user-3的回复:r[j+1]=r[j];//这里把r[j+1]的值覆盖了，也就是r[j+1]的值丢失了 而且，r[0]是用来辅助的吗？r[0]=r[i]也会造成r[0]丢失。 看你这个插入排序其实就是选择排序的做法，你可以参考一下选择排序怎么做的 这是直接插入排序啊


Question: 新手求助指点

修改后成功了，谢谢大神指点！

scanf对于F应该用%lf，注意%后面是l（小写字母）不是数字1，另外，是小写的f，不是大写F;  改之后再试试～

好的，我等会试下。请教，26行那里是不是应该是C大于40？

你输入80看看结果


Question: tooptips控件是如何捕获到鼠标消息的？

引用 1 楼 user-1 的回复:CWnd::SetCapture CWnd::GetCapture HWND WINAPI SetCapture(HWND hWnd); HWND WINAPI GetCapture(void); BOOL WINAPI ReleaseCapture(void); 应该不是SetCapture吧 如果tooltip一直SetCapture，那么其他窗口连正常的点击都做不到了。。。 根据TTF_SUBCLASS的描述，应该是子类化。。。


Question: 大一指针 求助大佬帮助

两个函数也可以改的稍简略点：void aver1(int **p,int n1,int m1);//学生平均成绩 void aver2(int **q,int n1,int m1);//课程平均成绩  void aver1(int **p,int n1,int m1) {     int i,j;     int sum;     float aver;     for(i=0;i<n1;i++)       {          aver= 0;          sum = 0;          for(j=0;j<m1;j++)            {              sum += *(*(p+i)+j);            }          aver =((float)sum)/((float)m1);          printf("第%d个学生的平均成绩为%.2f分\n",i+1,aver);      }     printf("\n"); }  void aver2(int **q,int n1,int m1) {     int i,j;     int sum;     float aver;     for(j=0;j<m1;j++)        {           aver= 0;           sum = 0;           for(i=0;i<n1;i++)             {                sum += *(*(q+i)+j);             }           aver =((float)sum)/((float)n1);           printf("第%d个课程的平均成绩为%.2f分\n",j+1,aver);        } }

#include "stdafx.h" #include <stdio.h> #include <stdlib.h> void aver1(int **p, int *n1, int *m1);//学生平均成绩，*p改为**p---------------- void aver2(int **q, int *n1, int *m1);//课程平均成绩 ,*q改为**q------------------ int main() {	 	int n, m, *n1, *m1;//n代表行，m代表列  	printf("请输入学生个数和课程门数："); 	scanf("%d %d", &n, &m); 	n1 = &n; m1 = &m; 	//int a[n][m];        //-----以下代码为动态分配二维数组----------- 	int** a = new int*[n]; 	for (int i = 0; i < n; i++) 	{ 		a[i] = new int[m]; 	}  	int i, j; 	for (i = 0; i<n; i++) 	{ 		printf("请输入第%d个学生的成绩：", i + 1); 		for (j = 0; j<m; j++) 		{ 			scanf("%d", &a[i][j]); 		} 	} 	int **p, **q;//------改为指针的指针------- 	p = a;//----修改----- 	q = a;//-----修改---- 	aver1(p, n1, m1); 	aver2(q, n1, m1);  //-------以下代码为释放二维数组---------- 	for (i = 0; i < n; ++i) 	{ 		delete[] a[i]; 	} 	delete[] a; 	return 0; } void aver1(int **p, int *n1, int *m1) { 	int i, j; 	int sum[50] = { 0 };//------数组初始化------ 	float aver1; 	for (i = 0; i<*n1; i++) 	{ 		for (j = 0; j<*m1; j++) 		{ 			sum[i] += *((*(p + i) + j));//------修改------- 			aver1 = ((float)sum[i]) / ((float)*m1); 		} 		printf("第%d个学生的平均成绩为%.2f分\n", i + 1, aver1); 	} 	printf("\n"); } void aver2(int **q, int *n1, int *m1) { 	int i, j; 	int sum[50] = { 0 };//------数组初始化------ 	float aver2; 	for (j = 0; j<*m1; j++) 	{ 		sum[0] = 0; 		for (i = 0; i<*n1; i++) 		{ 			sum[j] += *((*(q + i) + j));//------------修改------- 			aver2 = ((float)sum[j]) / ((float)*n1); 		} 		printf("第%d个课程的平均成绩为%.2f分\n", j + 1, aver2); 	} }  VS2015 C++环境调试  请参考《C++中动态分配多维数组》 《C++中的指针数组与数组指针》 希望能够帮到您！

#include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */ void aver1(int **p, int *n1, int *m1); //学生平均成绩 void aver2(int **q, int *n1, int *m1); //课程平均成绩 int main(int argc, char *argv[]) {     int n, m, *n1, *m1; //n代表行，m代表列     printf("请输入学生个数和课程门数：");     scanf("%d %d", &n, &m);     n1 = &n;     m1 = &m;     int i, j;     int **a = (int*)malloc(sizeof(int)*n);     for(i=0;i<m;i++){         a[i] = (int*)malloc(sizeof(int)*m);     }     for (i = 0; i < n; i++)     {         printf("请输入第%d个学生的成绩：", i + 1);         for (j = 0; j < m; j++)         {             scanf("%d", &a[i][j]);         }     }     aver1(a, n1, m1);     aver2(a, n1, m1);     return 0; } void aver1(int **p, int *n1, int *m1) {     int i, j;     int sum[50]={0};     float aver1;     for (i = 0; i < *n1; i++)     {         for (j = 0; j < *m1; j++)         {             //sum[i] += *(p + i) + j;             sum[i] += *(*(p + i) + j);         }         aver1 = ((float)sum[i]) / ((float)*m1);         printf("第%d个学生的平均成绩为%.2f分\n", i + 1, aver1);     }     printf("\n"); } void aver2(int **q, int *n1, int *m1) {     int i, j;     int sum[50]={0};     float aver2;     for (j = 0; j < *m1; j++)     {         for (i = 0; i < *n1; i++)         {             //sum[j] += *(q + i) + j;             sum[j] += *(*(q + i) + j);         }         aver2 = ((float)sum[j]) / ((float)*n1);         printf("第%d个课程的平均成绩为%.2f分\n", j + 1, aver2);     } }

#include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */ void aver1(int **p,int *n1,int *m1);//学生平均成绩 void aver2(int **q,int *n1,int *m1);//课程平均成绩  int main(int argc, char *argv[]) {     int n,m,*n1,*m1;//n代表行，m代表列     int i, j;     int **a;     printf("请输入学生个数和课程门数：");     scanf("%d %d",&n,&m);      a = (int **)malloc(sizeof(int *) * n);     if (!a)         return -1;      for (i = 0; i < n; i++) {         a[i] = (int *)malloc(sizeof(int) *m);         if (!a[i])             return -1;     }     n1=&n;m1=&m;     //int a[n][m];     //int i,j;     for(i=0;i<n;i++)     {         printf("请输入第%d个学生的成绩：",i+1);         for(j=0;j<m;j++)         {             scanf("%d",&a[i][j]);         }     }     int *p,*q;     p=&a[0][0];     q=&a[0][0];     aver1(a,n1,m1);     aver2(a,n1,m1);     return 0; } void aver1(int **p,int *n1,int *m1) {     int i,j;     //int sum[50];     int sum;     float aver1;     for(i=0;i<*n1;i++)     {         sum=0;         for(j=0;j<*m1;j++)         {             //sum += *(p+i)+j;             sum += p[i][j];             aver1 = sum * 1.0/(*m1);         }         printf("第%d个学生的平均成绩为%.2f分\n",i+1,aver1);     }     printf("\n"); } void aver2(int **q,int *n1,int *m1) {     int i,j;     //int sum[50];     int sum;     float aver2;     for(j=0;j<*m1;j++)     {         //sum[0]=0;         sum = 0;         for(i=0;i<*n1;i++)         {             //sum[j] += *(q+i)+j;             sum += q[i][j];             //aver2=((float)sum[j])/((float)*n1);             aver2 = sum * 1.0/(*n1);         }         printf("第%d个课程的平均成绩为%.2f分\n",j+1,aver2);     }     for (i = 0; i < n; i++)         free(a[i]);     free(a); } 供参考～  注意n,m不确定大小，a的数组不能确定，因此可以考虑用动态申请空间（定义数组是静态申请空间）

引用 2 楼 丿烟花易冷的回复:编写一个函数，统计n个学生m门课程，每个学生的平均分和每门课程的平均分。在主函数中输入5个学生4门课程的成绩，调用函数，输出每个学生的平均成绩和每门课程的平均成绩。要求，不允许使用全局变量和全局数组。 这是需求。。

#include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */ void aver1(int *p,int *n1,int *m1);//学生平均成绩 void aver2(int *q,int *n1,int *m1);//课程平均成绩  int main(int argc, char *argv[]) { 	int n,m,*n1,*m1;//n代表行，m代表列  	printf("请输入学生个数和课程门数："); 	scanf("%d %d",&n,&m); 	n1=&n;m1=&m; 	int a[n][m]; 	int i,j; 	for(i=0;i<n;i++) 	{ 		printf("请输入第%d个学生的成绩：",i+1); 		for(j=0;j<m;j++) 		{ 			scanf("%d",&a[i][j]); 		} 	} 	int *p,*q; 	p=&a[0][0]; 	q=&a[0][0]; 	aver1(p,n1,m1); 	aver2(q,n1,m1); 	return 0; } void aver1(int *p,int *n1,int *m1) { 	int i,j; 	int sum[50]; 	float aver1;     for(i=0;i<*n1;i++)     {     	sum[0]=0;     	for(j=0;j<*m1;j++)     	{     		sum[i]+=*(p+i)+j;     		aver1=((float)sum[i])/((float)*m1); 		}     	printf("第%d个学生的平均成绩为%.2f分\n",i+1,aver1); 	} 	printf("\n");  }  void aver2(int *q,int *n1,int *m1) { 	int i,j; 	int sum[50]; 	float aver2;     for(j=0;j<*m1;j++)     {     	sum[0]=0;     	for(i=0;i<*n1;i++)     	{     		sum[j]+=*(q+i)+j;     		aver2=((float)sum[j])/((float)*n1); 		}     	printf("第%d个课程的平均成绩为%.2f分\n",j+1,aver2); 	} }


Question: 求蜂考离散数学5小时视频

需要私聊

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

同求同求。。。

同求，，，，


Question: 救救孩子

引用 1 楼 六道佩恩 的回复:在大括号前加一个显示转换——(person)，如果不支持，在工具——编译选项，编译或链接命令中，添加开启C99或C11标准，如-std=c11  对，复合字面值C99开始支持了。        x[0] = (struct person){"Alice", 18};  //or, 指定成员初始化 x[0] = (struct person){.name="Alice", .num=18};

供参考：typedef struct Person{         int  num;         char name[20];         int  sex;         char group;         int  score1;         int  score2;         int  score3; }person;   int main(int argc, char* argv[]) {         person x[3] = {           {1,"Alice",0,'A',90,77,95},           {2,"Tony" ,1,'B',92,78,93},           {3,"Tom"  ,1,'C',87,90,78}         };         int i;         for(i=0;i<3;i++)             printf("%d %s %d %c %d %d %d\n",x[i].num,x[i].name,x[i].sex,x[i].group,x[i].score1,x[i].score2,x[i].score3);         system("pause");         return 0; }

我的映像中赋值不能这样写，初始化的时候才可以这样用吧。 写成  person x[3]={{...},{...},{...}}; ...是x[0],x[1],x[2]的内容。这样试试看

赋值有问题，这样的赋值一般是在初始化的时候，否则需要一个结构体成员一个结构体成员的赋值；  person x[3] = { {}, {}, {}}; 把三个成员的初始化放在一起；  要么就是  x[0].num  = 1; strcpy(x[0].name, "Alice"); ... 下面的一样

person x[3] = { {xx,xx,xx,xx},                          {xx,xx,xx,xx},                          {xx,xx,xx,xx}, }; 可以这样初始化


Question: c语言 bmp文件压缩解压缩

引用 4 楼 ctrigger 的回复:[quote=引用 2 楼 litchee1988 的回复:]关键是我找了几个，压缩效果均不佳，所以我再问的 大牛们的效果都不佳？还是你自己没弄好？？[/quote]  引用 3 楼 赵4老师 的回复:[quote=引用 2 楼 litchee1988 的回复:]关键是我找了几个，压缩效果均不佳，所以我再问的 压缩效果要好，干脆转jpg或png[/quote]  关键就是不让转成别的格式处理呀，就是bmp格式的

我查了几个，说是对bmp压缩效率一般，所以我就想问问有没有人处理过这种的

引用 2 楼 litchee1988 的回复:关键是我找了几个，压缩效果均不佳，所以我再问的 大牛们的效果都不佳？还是你自己没弄好？？

引用 2 楼 litchee1988 的回复:关键是我找了几个，压缩效果均不佳，所以我再问的 压缩效果要好，干脆转jpg或png

关键是我找了几个，压缩效果均不佳，所以我再问的

找个开源的图像处理库，把这部分代码挖出来不就行了么？


Question: 关于条件运算符

@user-3，你对的，应该是这个return( a>b ? (a>c? a:c) ：(b>c? b:c))，我的理解出错了，非常感谢二位！

temp有没初始化没关系，我可以初下的，这里有二个三目运算，是右结合的，所以先从最右的那个开始算，下标越界啥界？不是己注释掉了嘛，怎么没高人啊？？？？？？？？

需要弄明白三目运算符的逻辑关系；这个三目运算符是结果里还有三目运算符；  另外，楼主没发现数组有越界访问的行为吗？  数组最大是3，那么n-4这样的下表不已经是越界了吗？越界行为是未定义的，结果是未定义的。

temp还没初始化就使用了,条件运算符就是if实现,根据左边式子真假来选择执行分支.

引用return( a>b ? (a>c? a:c) ：(b>c? b:c)) 你这个还是有问题，第2个表达式结果一定是a?第3个表达式结果一定是b?我觉得你的式子逻辑有问题，还有我的对，但就不知哪里出错了 你是想偏了，公式里第一步如果a>b条件成立，是不是就进入到 表达式1=(a>c? a:c) 这里去执行了，这里面又是一个条件判断表达式a>c? a:c，如果a>c成立则返回a,如果不成立是不就回c了，怎么会是始终是a呢。

三元表达式多条件判断： 语法： 条件表达式 ？表达式1 ：表达式2 条件表达式是判断的条件，判断结果为bool型，为true时调用表达式1，为false时调用表达式2。 跟后面括不括号没什么关系啊。

简化下，就是这公式：return( a>b ? (a>c? a:c) ：(b>c? b:c))

我只是想知道那个return里的表达式错在哪里，希望高手进来解释一下。谢谢！！！

return(a[n-3]>a[n-2]?a[n-3]:(a[n-2]>a[n-1]?a[n-2]:a[n-1])); 你这条语句有问题，你怎么知道右边的条件运算表达式运算的结果一定是a[n-2]呢？也有可能是a[n-1]，二者都有可能的啊

前面还是有漏洞的，修改如下，供参考：#include<stdio.h> int max(int a[],int n) { int temp; //return(a[n-4]>temp?a[n-4]:(temp=a[n-3]>temp?a[n-3]:(temp=a[n-1]>a[n-2]?a[n-1]:a[n-2])));  //return(a[n-3]>temp?a[n-3]:(temp=a[n-1]>a[n-2]?a[n-1]:a[n-2]));//一开始tmpe没赋值，先执行判断a[n-3]>temp就出错了。 return(a[n-3]>a[n-2]?(a[n-3]>a[n-1]?a[n-3]:a[n-1]):(a[n-2]>a[n-1]?a[n-2]:a[n-1])); //printf("%d,%d\n",temp,temp1); //return temp; }  int main(int argc, char* argv[]) {     int m[3],n=0;     printf("请输入3个整数！\n");     while(n<3){         scanf("%d",&m[n++]);     }    printf("最大数为：%d\n",max(m,3));    system("pause");    return 0; }

问题见标注处,供参考：#include<stdio.h> int max(int a[],int n) { int temp; //return(a[n-4]>temp?a[n-4]:(temp=a[n-3]>temp?a[n-3]:(temp=a[n-1]>a[n-2]?a[n-1]:a[n-2])));  //return(a[n-3]>temp?a[n-3]:(temp=a[n-1]>a[n-2]?a[n-1]:a[n-2]));//一开始tmpe没赋值，先执行判断a[n-3]>temp就出错了。 return(a[n-3]>a[n-2]?a[n-3]:(a[n-2]>a[n-1]?a[n-2]:a[n-1]));  //printf("%d,%d\n",temp,temp1); //return temp; }  int main(int argc, char* argv[]) {     int m[3],n=0;     printf("请输入3个整数！\n");     while(n<3){         scanf("%d",&m[n++]);     }    printf("最大数为：%d\n",max(m,3));    system("pause");    return 0; }


Question: 离散数学实验求解，基础题

int vote(int a, int b, int c, int d, int e) {   return (a && b &&c) || (a && b &&d) ||          (a && b &&e) || (a && c &&d) ||          (a && c &&e) || (a && d &&e) ||          (b && c &&d) || (b && c &&e) ||          (b && d &&e) || (c && d &&e); }


Question: 求助 怎么链表插入不运行和求表长为0 但不报错

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

#include <stdio.h> #include <malloc.h> #include <stdlib.h>  typedef struct Node{     int data;  //数据域     struct Node *next;  //指针域 }node, *PNODE;  //函数声明 PNODE create_list(); void show_list(PNODE); bool empty_list(PNODE); void length_list(PNODE); bool insert_list(PNODE,int,int);  int main() {     PNODE L = NULL;  //     L = create_list();  //创建非循环单链表，把链表头节点地址赋给head  动态内存分配     show_list(L);     empty_list(L);     insert_list(L,3,5);     show_list(L);     length_list(L);     return 0; }  PNODE create_list()  //创建函数 {     int len,val,i;     PNODE phead =(PNODE)malloc(sizeof(node));     if (phead == NULL)     {         printf("内存分配失败");         exit(-1);     }     PNODE p=phead;     p->next = NULL;     printf("请输入链表个数：");     scanf("%d",&len);     for(i=0;i<len;i++)     {         printf("第%d个结点的值为:",i+1);         scanf("%d",&val);         PNODE pnew =(PNODE)malloc(sizeof(node));         if (pnew == NULL)         {             printf("内存分配失败");             exit(-1);         }         pnew->data = val;         p->next = pnew;         pnew->next = NULL;         p = pnew;     }     return phead; }  void show_list(PNODE phead)   //遍历输出 {     PNODE p = phead->next;     while(p != NULL)     {         printf("%d ",p->data);         p = p->next;     }     printf("\n"); }  bool empty_list(PNODE phead)   //判断链表是否为空 {     //if(phead->next=NULL)     if(phead->next==NULL)         return true;     else         return false; }  void length_list(PNODE phead) {     int i=0;     PNODE p = phead->next;     while(p !=NULL)     {         i++;         p=p->next;     }     printf("链表长度为 %d",i); }  bool insert_list(PNODE phead,int n,int m)   //插入第n个元素m {     int i = 0;     PNODE p = phead,s;     if(n < 1)         return false;     while(i < n-1 && p!= 0)     {         i++;         p = p-> next;     }     //if(p = NULL)     if(p == NULL)         return false;     else{         s=(PNODE)malloc(sizeof(node));         s->data=m;         s->next=p->next;         p->next=s;         return true;     } } 供参考～


Question: C程序hungman游戏

这种吗？


Question: C语言UI设计关于声明ID的问题

引用 4 楼 ooolinux的回复:个人觉得SDK纯API方式编写Windows程序已经过时了，效率太低，了解一下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder 6.0几个示例程序项目源代码下载：       C++ Builder第一个程序（模拟聊天室）v1.11 C++ Builder模拟数字双时钟示例（未完成）v0.2.1 C++ Builder纸牌游戏Demo v0.03 C++ Builder不规则图像透明贴图（位图的透明显示）三种方法及简单动画v1.3 C++ Builder写的《ZEC 四则运算练习程序》 海底海星情景v0.9.2 C++ Builder简单电话簿Demo例子v1.11 多谢大佬

那个是打字错误，你的代码里和我从你那复制下来那行都是错的，重新更正就好。

3楼正解  引用 3 楼 forever74 的回复:#include "resource.h"   DialogBox(hinstCurrent,MAKEINRESOURSE(IDD_DIALOG1),NULL,(DLGPROC)WndProc);

引用 3 楼 forever74的回复:#include "resource.h"   DialogBox(hinstCurrent,MAKEINRESOURSE(IDD_DIALOG1),NULL,(DLGPROC)WndProc); 多谢大佬 原来差在没包含resource头文件 不过还有一个错误是 MAKEINRESOURCE标识符无法识别？ 不过它是啥？ 求教

重新建一个MFC项目吧，还来得快些

用记事本打开.rc文件，对照.h和.cpp文件中的各ID修改为一致。


Question: C语言求cos的值

引用 4 楼 棉猴的回复:正像楼上朋友所说的，题目要求是“保持到最后一项的绝对值小于10-6”，也就是说，当小于10-6时，是要加入到算式里的，不能直接break #include <stdlib.h> #include <math.h>  int main() {	 	double x, a, c, b = 1, y = 1; 	int i; 	scanf("%lf", &x); 	for (i = 1; i > 0; i++) 	{ 		a = pow(x, i); 		b *= i; 		if (i % 2 == 0) 		{ 			c = a / b; 		} 		else 		{ 			continue; 		} 		  		if (i % 4 != 0 || i == 2) 		{ 			c = 0 - (a / b); 			y += c; 		} 		else 		{ 			y += (a / b); 		}  		if (fabs(a / b) < pow(10, -6)) 		{ 			break; 		} 	} 	printf("%lf\n", y); 	return 0; } VS2015 C++环境  好的👌🏻，感谢感谢

引用 3 楼 user-2的回复:你还没明白我的意思 最后一项 比如 a/b < 10∧-6，这 a/b 要加还是不加？题目要求是加（保持到最后一项的绝对值小于10∧-6） 但是你的程序 a/b < 10∧-6 就已经 break，后续的加没法处理，所以漏了一项。正确的做法应该把  if(fabs(a/b) < 10∧-6) break 放在for 循环的最后，也就是 y+=执行完后才break 哦哦好的，谢谢哈

引用 1 楼 user-2的回复:少加了最后一项，因为最后一项满足if就break了，所以最后一项没加上 可是题目说小于10∧-6，如果改成＜＝，运行其他值的时候不会有误差吗？？

少加了最后一项，因为最后一项满足if就break了，所以最后一项没加上


Question: 这个链表创建函数哪里错了

思路：C++，创建要给结点类，一个链表类。用结点构造函数创建结点，再插入链表类即可。

感觉不伦不类的，看着眼晕。C++，就要class，用成员函数create即可。

把代码复制粘贴过来不好吗，非得c语句和c++混合用吗？要不单用c要不单用c++，一会cin，一会printf，重新写过吧


Question: 用指针法在一维有序数组中插入数据，要求在其中插入任意一个整数后数列依然有序。

首先要先找到对应的位置，然后将该位置和之后的数据都想后移动一个元素的偏移，最后把要插入的数据放入该位置。

凡事说起来容易，做起来难： 有序？从小到大还是从大到小？ 数组？静态数组还是动态数组？静态数组的话，最多几个元素？动态数组的话，malloc？new？vector？ 空数组？申请空间失败咋办？ 小心使得万年船。 百度搜“树上七只鸟 程序员”

用指针依次访问数组数据，当要插入的数据大于当前的数且小于后一个数，将之后所有的数据后移 插入要插入的值

最原始的办法： 先定义一个同类型的指针，判断原指针当前值不为NULL时，与待插入的数据比较，若比待插入的数据大，则先赋值 待插入的数，然后再依次 将余下的数复制到新的指针里，数据依然有序；


Question: 求助大佬们，我的部分删除模块实在是写不出，要求再代码开头的注释中

#include<stdio.h>//密码，新建，浏览，删除原有数据，删除一条数据，查找，添加 #include<conio.h> #include<stdlib.h> #include<string.h> #define M 20  struct conect//结构体 { 	char name[11]; 	char telnum[12];//电话号码 	char address[100];//地址 	int f;//标签 }; int N=0;//总人数的全局变量 int n; int num;//总人数 struct conect c[10];//结构体数量 struct conect cc;  int main(void) { 	void input(),expl(),meun(), password(), save(),read(),serch(), dele(),dele_all(); 	void dele_menu(),newsave(); 	void dele_save();//部分删除函数  	int choice; 	 	//password(); 	system("pause"); 	system("cls"); 	while (1) 	{ 		meun(); 		printf("\t\t\t\t\t\t"); 		scanf("%d", &choice); 		switch (choice) 		{ 		case 1:input();break; 		case 2:expl();break; 		case 3:save();break; 		case 4:read();break; 		case 5:serch();break; 		case 6:dele_menu();break; 		case 7:newsave();break; 		case 0:exit(0); 		} 		printf("\n"); 		system("pause");//暂停函数  		system("cls");//清屏函数  		 	}  } void input()//输入数据函数 { 	int i; 	printf("\t\t\t\t\t\t输入人数:"); 	scanf("%d", &num); 	n = N; 	for (i = N;i < num+n;i++,N++) 	{ 		printf("\t\t\t\t\t\t姓名："); 		scanf("%s", c[i].name); 		printf("\t\t\t\t\t\t电话："); 		scanf("%s", c[i].telnum); 		printf("\t\t\t\t\t\t地址："); 		rewind(stdin); 		gets(c[i].address); 		printf("\t\t\t\t\t\t标签："); 		scanf("%d", &c[i].f); 		printf("\n"); 		N++; 	} } void expl()//浏览输入为保存信息（时效性） { 	int i; 	printf("%12s%12s%30s%10s\n", "姓名", "电话", "地址", "标签"); 	for (i = 0;i < num+N ;i++) 	{ 		printf("%12s%12s%30s", c[i].name, c[i].telnum, c[i].address); 		switch (c[i].f) 		{ 		case 1:printf("      亲戚\n");break; 		case 2:printf("      同事\n");break; 		case 3:printf("      朋友\n");break; 		} 	} } void meun() { 	printf("\t\t\t\t\t\t1.录入联系人\n"); 	printf("\t\t\t\t\t\t2.浏览通讯录\n"); 	printf("\t\t\t\t\t\t3.保存联系人\n"); 	printf("\t\t\t\t\t\t4.读取文件\n"); 	printf("\t\t\t\t\t\t5.查找联系人\n"); 	printf("\t\t\t\t\t\t6.删除联系人\n"); 	printf("\t\t\t\t\t\t7.新建文件\n"); 	printf("\t\t\t\t\t\t0.退出\n"); 	printf("\t\t\t\t\t\t请输入1-2\n"); 	 } void dele_menu() { 	int a; 	printf("\t\t\t\t\t\t1.删除未保存联系人\n"); 	printf("\t\t\t\t\t\t2.删除已保存联系人\n"); 	printf("\t\t\t\t\t\t3.删除全部联系人\n"); 	scanf("%d",&a); 	switch (a) 	{ 	case 1:dele();break; 	case 2:dele_save();break; 	case 3:dele_all();break; 	default: 		break; 	}  } void password()  { 	char password[10] = "123456";//正确密码 	char ps[10];//定义一个新数组用与正确答案做对比 	int i,j;   	printf("\n\n"); 	printf("\t\t\t\t\t\t================================\n"); 	printf("\t\t\t\t\t\t         用户登录系统\n"); 	printf("\t\t\t\t\t\t================================\n"); 	printf("\n\n"); 	for (j = 0;j < 4;j++) 	{ 		i = 0; 		printf("\t\t\t\t\t\t请输入密码.\n"); 		printf("\t\t\t\t\t\t密码:");     	while ((ps[i] = getch()) != 13)//用于替换*号，且回车结束输入判断 		{ 			if (ps[i] == '\b')//（\b）退格符，在此用于发挥删除功能 			{ 				printf("\b \b");//起删除功能 				i--;//向后减少一位将光标提前 			} 			else 			{ 				printf("*"); 				i++; 			} 			 		} 		ps[i] = '\0'; 		printf("\n"); 		if (strcmp(password, ps) == 0) 		{ 			printf("\n\n"); 			printf("\t\t\t\t\t\t================================\n"); 			printf("\t\t\t\t\t\t           欢迎用户！           \n"); 			printf("\t\t\t\t\t\t================================\n"); 			printf("\n\n"); 			break; 		} 		else 		{ 			printf("\t\t\t\t\t\tNO!\n"); 			if (3 - j == 0) 			{ 				printf("\t\t\t\t\t\t全部错误自动退出！"); 				exit(0); 			} 			printf("\t\t\t\t\t\t还有%d次机会！\n", 3 - j); 		}  	} }  void save()//内容储存函数 { 	FILE* fp; 	int* a; 	int i;  	fp = fopen("conect.dat","wb");//建立一个文件并且打开写入类容 	for (i = 0;i < N;i++) 	{ 		fwrite(&c[i],sizeof(struct conect),1,fp);//写入文件块 	}  	fclose(fp);//关闭文件 	printf("保存成功\n"); } void read()//类容读取函数 { 	FILE *fp;//指针变量的定义 	int i;  	fp = fopen("conect.dat", "ab+");//建立一个文件并且打开写入类容 	printf("%12s%12s%30s%10s\n", "姓名", "电话", "地址", "标签"); 	while(1) 	{ 		fread(&cc, sizeof(struct conect), 1, fp);//读取文件块 		if (feof(fp))//file end of 结束标志 		{ 			break; 		} 		printf("%12s%12s%30s", cc.name, cc.telnum, cc.address); 		switch (cc.f) 		{ 		case 1:printf("      亲戚\n");break; 		case 2:printf("      同事\n");break; 		case 3:printf("      朋友\n");break; 		} 	} 	fclose(fp);//关闭文件   } void serch()//查询函数 { 	int i; 	int flag = 0; 	char t_name[M]; 	FILE* fp;  	fp = fopen("conect.dat", "ab+");//打开原文件 	printf("\n\t\t\t\t\t\t--------------------------------------\n"); 	printf("\t\t\t\t\t\t输入你要查询的姓名="); 	scanf("%s", t_name); 	printf("\n"); 	printf("\n"); 	printf("\n"); 	printf("%12s%12s%30s%10s\n", "姓名", "电话", "地址", "标签"); 	while (1) 	{ 		fread(&cc, sizeof(struct conect), 1, fp);//读取文件块 		if (feof(fp))//file end of 结束标志 		{ 			break; 		} 		printf("%12s%12s%30s", cc.name, cc.telnum, cc.address); 		switch (cc.f) 		{ 		case 1:printf("      亲戚\n");break; 		case 2:printf("      同事\n");break; 		case 3:printf("      朋友\n");break; 		} 	} 	fclose(fp);//关闭文件 } void dele()//删除未保存时效数据函数 { 	int m, j,i; 	int h = 0; 	int flag = 0; 	char t_name[M]; 	printf("\t\t\t\t\t\t输入姓名="); 	scanf("%s", t_name); 	printf("\n"); 	printf("\n"); 	for (i = 0;i < num;i++) 	{  		if (strcmp(t_name, c[i].name) == 0) 		{ 			printf("\t\t\t\t\t\t-----------------------------------\n"); 			printf("\t\t\t\t\t         查找成功,是否删除？\n\n"); 			printf("\t\t\t\t\t\t1.删除                      "); 			printf("2.退出\n"); 			printf("\t\t\t\t\t\t-----------------------------------\n"); 			flag = 1; 			break; 		} 		h++; 	} 	if (flag == 0) 	{ 		printf("\t\t\t\t\t\t无可查找对象"); 		return; 	} 	printf("\t\t\t\t\t\t请输入："); 	scanf("%d", &m); 	if (m == 1) 	{ 		for (j = h;j < num;j++) 		{ 			c[i] = c[i + 1]; 		} 		printf("\n"); 		printf("\t\t\t\t\t\t删除成功!!\n"); 		num--; 	} }  void dele_save()//部分删除函数功能：输入联系人姓名查找相应数据然后删除数据（联系人已保存至文件） { 	 }  void dele_all() { 	FILE* fp; 	int ret, a; 	char filename[] = "conect.dat";//将文件名赋值给一个字符串  	fp = fopen("filename", "rb+");//打开文件以二进制文件读取的方式 	ret = remove(filename);//将删除函数赋值给一个整形，方便if语句判断返回值 	if (ret == 0)//当返回值为-1时报错，当返回值为时执行删除 	{ 		printf("文件删除成功"); 		 	} 	else 	{ 		printf("错误：不能删除该文件");//一般来说可以用perror("remove");打印错误原因，但结果为英文 	}  	 }  void newsave() { 	int i; 	char filename[100];//定义一个字符数组储存文件名 	FILE* fp;  	printf("请输入你要自定义的文件夹"); 	scanf("%s", filename);//输入一个文件名 	fp = fopen(filename, "ab");//创建一个新的二进制文件 	for (i = 0;i <= N;i++) 	{ 		fwrite(&c[i], sizeof(struct conect), 1, fp);//可以用循环写入文件 	} 	fclose(fp);//关闭文件 	printf("保存成功!\n");  }

建议楼主贴全代码吧

引用 3 楼 user-2的回复:不能用链表那就是数组了，数组删除是找到要删除的元素的下标，然后把它之后的元素逐一前移一个位置，再保存到文件中即可。 谢谢你  我解决了  因为要用文件所以不能用数组，我现在用的是把要删除和不删除的分别放到两个空文件里面，然后用remove删除其中要删除数据的那个文件，用rename重命名另一个文件。


Question: C#程序设计基础上的一道程序设计题

搞错了搞错了

可怜的孩子，你迷路了吧？这里是C。

界面➕电脑下棋的AI算法。


Question: vs2012 开始执行不调试 变成这种白色

chcp 936 chcp 65001

其他的是没有问题的


Question: 直接插入排序

#include<stdio.h>  #define list_size 20  typedef int keytype; typedef int othertype;  typedef struct {     keytype key;     othertype other_data; }recordtype;  void display(recordtype r[],int length) {     for (int i = 0; i < length; i++) {         printf("%d ", r[i].key);     }     printf("\n"); }  void inssort(recordtype r[],int length)     //对记录数组r做直接插入排序，length为数组中待排序记录的数目 {     int i,j;     for(i=2;i<=length;i++)     {         r[0]=r[i];         j=i-1;         while(r[0].key<r[j].key)         {             r[j+1]=r[j];             j=j-1;         }         r[j+1]=r[0];     } }   //void main() int main(void) {     recordtype r[list_size];         return 0; } 供参考～


Question: 求助。。

哈哈哈，没图没代码

看哪里呢？


Question: 有5个学生，每个学生包括学号、姓名、三门课的成绩。从键盘输入5个学生数据，1）打印出每门课程的总平均分；2）要求按照总分由高到低的顺序打印出学生的数据（包括学号

定义个结构体 先自己写这试试  不行了再问

先自己尝试写写，动动手。或者从网上搜一搜，总之，自己要先动手动脑试试。


Question: C＋＋ 程序题

有2481215个，仅供参考：#include <stdio.h>  int greatest_common_divisor(int a, int b) { 	if(b == 0) return a; 	else greatest_common_divisor(b, a%b); }  int main(void) { 	int n1, n2, t, count = 0; 	for(n1 = 1; n1 <= 2020; n1++) 	{ 		for(n2 = 1; n2 <= 2020; n2++) 		{ 			t = greatest_common_divisor(n1, n2); 			if(t == 1) 			{ 				printf("%d:\t分子：%d\t分母：%d\n", ++count, n1, n2); 			} 		} 	} 	return 0; }


Question: C语言读取文件操作后影响结构体变量数据

引用 2 楼 Ice丨shine 的回复:[quote=引用 1 楼 user-1的回复:]Huffman编码，严蔚敏老师的数据结构上讲得很很清楚。 我知道是这个，我只是想问为什么读取文件前后两次tree的值会发生变化[/quote]  算法你已经知道了，还有问题，那就是C语言问题了。看看K&R C。

引用 1 楼 user-1的回复:Huffman编码，严蔚敏老师的数据结构上讲得很很清楚。 我知道是这个，我只是想问为什么读取文件前后两次tree的值会发生变化

Huffman编码，严蔚敏老师的数据结构上讲得很很清楚。


Question: 关于数据结构和抽象数据类型的理解问题？

引用 8 楼 百 五 花 大 绑的回复:随便找本 数据结构与算法的书前言 就会讲很多相关的知识   I.e Data Structures Using C, 2nd edition 觉得老师讲的重逻辑上的理解，讲思路，很多东西不自己去查去看就不知道为什么

引用 8 楼 百 五 花 大 绑的回复:随便找本 数据结构与算法的书前言 就会讲很多相关的知识   I.e Data Structures Using C, 2nd edition 目前在学严蔚敏的数据结构。小白级别，请见谅！

最后自己差不多想明白了

不好意思我们还没有学封装这些知识，能否再详细讲解一下呢？还有上面最初提到的三个问题可否解答一下呢？（最近复习感觉总卡在这个点，理解不透彻）感激不尽！！！

需要复杂的结构来配合算法，struct 都是链表之类的基础，可以理解为封装

引用 2 楼 自信男孩的回复:typedef是起别名，建议楼主在网上搜一下typedef以及其用法。  如果对数据结构和结构体有异议，建议自己写代码测试一下，理论联系实际，用实践去指导理论 关于typedef,还有我以上的问题我都搜索过了，但没有我想要的答案，数据结构的具体代码实现我觉得我这些问题搞不清楚，没办法写代码，写出来的也是没有真正理解的。所以您可否针对我所说的三个具体问题来解答一下呢？感激不尽！！

引用 1 楼 百 五 花 大 绑的回复: typedef struct     {         Selemtype *base;         Selemtype *top;         int stacksize;     } SqStack;  SqStack * pSqStack = NULL;   struct     {         Selemtype *base;         Selemtype *top;         int stacksize;     } SqStack;  struct SqStack * pSqStack = NULL;   typedef 是有作用的 其实疑惑点不在是不是使用typedef来简化struct类名，而是为什么有struct这样一个整体的存储结构定义。


Question: 求助

引用 1 楼 百 五 花 大 绑的回复:第一个就是读入用户回车前的输入，存到a[]里面 好的，谢谢😜

第一个就是读入用户回车前的输入，存到a[]里面


Question: VC++6.0编译没有错误，但是无法运行

看一下fscanf.c的第54行，VC++6.0挺好的，我的最爱，没有之一

fscanf.c文件看下54行是什么内容？

好像是想读文件，但是读到的是空     看看要读的文件存在吗？ 内容是不是空

VC++6.0，太老了，早该淘汰了。你还用它，自找麻烦吧。 VC++6.0 IDE，C99就不支持，现在是C11，C18了。你还想古董支持？？？


Question: 机器数采用补码规格化，求机器数字长16位的计算机表示数的范围

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

这个是计算机组成原理的题  那个数 是这个意思  阶符 阶数 数符 尾码

仅供参考：


Question: 为什么结果在自定义函数中正常，返回到主函数输出异常？

楼主返回的其实是anw的地址，虽然返回的是ans，但是ans指向了anw。问题就在这里，anw是什么变量，局部变量，函数f调用结束后anw就被释放了，所以返回anw的地址没有意义。  修改的办法是改变anw的属性，进而改变该变量的生命周期。在anw前加一个static，这样该变量的生命周期就是从定义开始直到程序退出一直有效。

if ( n == 0 )//递归出口     {         *anw = { '1' };         ans = anw;         return ans;     }  典型的指针错误。 ans指向局部变量anw然后返回。 anw在函数结束后不再有效，所以返回后打印结果就不对了。


Question: C语言怎么实现对输入的严谨检查

仅供参考：//输入两个整数 #include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }  #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

请参考《C++控制台程序判断输入的数字》 希望能够帮到您！

使用getchar()，一个一个的分析，发现不合法，就提示， 如果合法，自己拼接数字，字符串，等等。

用正则表达式试试，数字时\d


Question: 关于利用C语言为快递公司设计快递投递路线的优化程序（求帮助感谢）

学习一下OSPF就好，一样一样地。

引用 3 楼 Ricentch·J·Satoware 的回复:引用 2 楼 早打大打打核战争 的回复:每个城市都可能有包裹投递到其他城市？每个中转点可以暂存？可以杂凑？那太复杂了，是NP问题，要取得最优解非常困难，只能穷举。应该没有那么复杂，就很直接的优化路线问题，大佬简单点想就行叭 大佬有思路吗

这么貌似不容易，需要好好研究图论和算法。


Question: C语言中编译时自动赋初值0或空字符'\0'的变量有哪些？

自动赋值不放心，还是自己复制靠谱。

引用 6 楼 ctrigger的回复:[quote=引用 5 楼 AruNi° ഒ 的回复:][quote=引用 3 楼 user-2的回复:]还是自己赋值比较好，没必要去纠结哪些变量是自动赋值的 关键是做选择题或者填空题的时候要知道。[/quote]  编译器不一样，结果可能就不一样。 纠结这个有啥意义呢？？？[/quote] 好的吧！！！

引用 5 楼 AruNi° ഒ 的回复:[quote=引用 3 楼 user-2的回复:]还是自己赋值比较好，没必要去纠结哪些变量是自动赋值的 关键是做选择题或者填空题的时候要知道。[/quote]  编译器不一样，结果可能就不一样。 纠结这个有啥意义呢？？？

引用 3 楼 user-2的回复:还是自己赋值比较好，没必要去纠结哪些变量是自动赋值的 关键是做选择题或者填空题的时候要知道。

引用 3 楼 user-2的回复:还是自己赋值比较好，没必要去纠结哪些变量是自动赋值的 关键是有时候做选择题或者填空题会遇到，

还是自己赋值比较好，没必要去纠结哪些变量是自动赋值的

引用 1 楼 ctrigger的回复:自动赋值不放心，还是自己复制靠谱。 有时候做题会遇到没有赋值的


Question: 求助

引用 3 楼 user-1的回复:把第5行这句改下，不要中间的‘，’号，再输入试下：scanf("%d %d",&a,&b);，输入时两个数字间空格就可以了。 请问为什么加逗号就不可以了

引用 4 楼 m0_52586836的回复:[quote=引用 3 楼 user-1的回复:]把第5行这句改下，不要中间的‘，’号，再输入试下：scanf("%d %d",&a,&b);，输入时两个数字间空格就可以了。 还是和之前一样[/quote] 抱歉，可以了，刚刚看错了

引用 3 楼 user-1的回复:把第5行这句改下，不要中间的‘，’号，再输入试下：scanf("%d %d",&a,&b);，输入时两个数字间空格就可以了。 还是和之前一样

引用 1 楼 user-1的回复:第5行 scanf("%d,%d",&a,&b);，你输入的时候两个数字之间是有‘，’号的，例如：2，3  ，你是不把这个‘，’号漏掉了。 没有漏，而且不管我输什么数字进去自定义函数的值总是取a而不是a+b

引用引用 3 楼 user-1的回复: 把第5行这句改下，不要中间的‘，’号，再输入试下： C/C++ code ? 1 scanf("%d %d",&a,&b); ，输入时两个数字间空格就可以了。  请问为什么加逗号就不可以了不是说加逗号不可以，这里有全角和半角之分，如果你在scanf("%d，%d",&a,&b);加的是全角的逗号，那你在输入时必须也是全角状态的逗号。如果scanf("%d,%d",&a,&b);加入的是半角的逗号，那在输入时必须是半角的逗号。问题在于全角和半角你很难分清的情况下，所以建议你干脆把逗号取消，改变下输入格式试试喽。逗号的全角和半角之分，是因为全角状态是两个字节来存储一个逗号，半角状态是一个字节存储一个逗号，如果在输入的时候对不上，电脑就不认识了。


Question: C语言小白，请求大神指点，为什么运行不了，怎么改一下（用了while，稍有繁琐）

第6行 m=factorize(x);这句调用函数是错的，void factorize(int x)定义为空函数没有返回值。第6行改为：factorize(x);

代码也不贴上了，谁有空给你一个一个字母敲进去。 代码完成什么功能也没说，只有天知道你想干什么。


Question: 下面程序为什么错啊?

可能这个and（）函数名字定义发生了冲突，改名处理下。