Question: vs code无法搜索中文的问题

首选项->设置   搜索file.encoding  将语言设置成工作区主要语言即可。类似楼主这样的可以设置成GB 2312 即可。

遇到了，目前还不知道怎么解决，烦。

搜索默认使用的应该是utf-8，你的编辑是gb2312  "files.autoGuessEncoding"应该对应的是后者  前面的可以查下怎么改，改不了的话可以把所有文件改成utf-8编码（点一下右下角的gb2312，保存为utf-8）

能指导一下吗？你这话讲的跟没讲一样唉😔

对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A


Question: 有没有类似memcpy的功能但是是复制数组指定位置开始的n个长度数据到另一个数组的方法

引用 3 楼 MOVELASER 的回复:[quote=引用 1 楼 user-3 的回复:]你说的不就是memcpy吗  那就用memcpy完事了 memcpy只能拷贝起始位置开始吧，我需要非起始位置[/quote]谁说非起始位置，指针移动不就行了，memcpy(a , b+1);//从b+1字节开始拷贝

引用 4 楼 MOVELASER 的回复:引用 2 楼 yiyefangzhou24 的回复:strcpy((char *) , (char *));您好，非字符数组强制转换然后，strncpy

int a[10]; int b[4]; memcpy((void *)&b[0],(void *)&a[3],4*sizeof(int));//将a[3],a[4],a[5],a[6]分别赋值给b[0],b[1],b[2],b[3]

引用 3 楼 MOVELASER 的回复:[quote=引用 1 楼 user-3 的回复:]你说的不就是memcpy吗  那就用memcpy完事了 memcpy只能拷贝起始位置开始吧，我需要非起始位置[/quote]memcpy(desc, src+10, 20);

引用 1 楼 user-3 的回复:你说的不就是memcpy吗  那就用memcpy完事了 memcpy只能拷贝起始位置开始吧，我需要非起始位置

strcpy((char *) , (char *));

你说的不就是memcpy吗  那就用memcpy完事了


Question: c语言输出问题

分了三次scnaf，多半有你输入格式的问题

引用 3 楼 user-2的回复:[quote=引用 2 楼 sytth 的回复:]帮我输入结果一下，我一直输出0.0 想让别人帮你一个字母一个字母敲？？？[/quote] 分了三次scanf，弄好了，

引用 2 楼 sytth 的回复:帮我输入结果一下，我一直输出0.0 想让别人帮你一个字母一个字母敲？？？

帮我输入结果一下，我一直输出0.0

1.sum没有初始化，建议float sum = 0.0; 2.scanf输入的时候，去掉q->name前面的&符号 3.sum/=5;还是建议改成sum/=5.0


Question: 结构体，链表输出不对

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

#include<stdio.h> #include <stdlib.h> #include<malloc.h>  struct Employee {     int num;     float pay;     struct Employee* next; };  struct Employee* creat() {     struct Employee* head, * p1, * p2;     int n=0;     p1 = p2 = (struct Employee*)malloc(sizeof(struct Employee));     if (!p1)         exit(0);     head = NULL;     //scanf("%d%f", &p1->num, &p2->pay);     scanf("%d%f", &p1->num, &p1->pay);     while (p1->num != 0)     {         n = n + 1;         if (n == 1)             head = p1;         else             p2->next = p1;         p2 = p1;         p1 = (struct Employee*)malloc(sizeof(struct Employee));         if (!p1)             exit(0);         //scanf("%d%f", &p1->num, &p2->pay);         scanf("%d%f", &p1->num, &p1->pay);     }     p2->next = NULL;     free(p1);   //最后一个p1没有链入链表里，释放掉;      return(head);              //返回链表中第一个节点得起始地址 } void list(struct Employee* head) {     struct Employee* p;     p = head;     printf("The linked list:\n");     if(head!=NULL)         do         {             printf("%d,%.2f\n", p->num, p->pay);             p = p->next;         } while (p != NULL); }  int main() {     struct Employee* head;     head = creat();     list(head);     return 0; } 供参考～  对比一下，找一下自己的问题～

引用 楼主 AruNi° ഒ 的回复:如图，为什么第一行没有了，却把0 0也输出来了？？？  #include<stdio.h> #include<malloc.h> struct Employee { 	int num; 	float pay; 	struct Employee* next; }; struct Employee* creat() { 	struct Employee* head, * p1, * p2; 	int n=0; 	p1 = p2 = (struct Employee*)malloc(sizeof(struct Employee)); 	head = NULL; 	scanf("%d%f", &p1->num, &p2->pay); 	while (p1->num != 0) 	{ 		n = n + 1; 		if (n == 1) 			head = p1; 		else 			p2->next = p1; 		p2 = p1; 		p1 = (struct Employee*)malloc(sizeof(struct Employee)); 		scanf("%d%f", &p1->num, &p2->pay); 	} 	p2->next = NULL; 	return(head);              //返回链表中第一个节点得起始地址 } void list(struct Employee* head) { 	struct Employee* p; 	p = head; 	printf("The linked list:\n"); 	if(head!=NULL) 		do  		{ 			printf("%d,%.2f\n", p->num, p->pay); 			p = p->next; 		} while (p != NULL); } int main() { 	struct Employee* head; 	head = creat(); 	list(head); 	return 0; }

引用 2 楼 自信男孩的回复:贴源码吧～不建议贴图片～ 好的👌🏻

引用 1 楼 user-3的回复:遍历链表为咐用do...while呢 一般都是这样：  while(p->next != NULL) {     printf("%d, %f", p->num, p->pay);     p=p->next; }  问题出在哪啊？像你这样改了也不对，直接没有第一个职工的工资了。

贴源码吧～不建议贴图片～


Question: c语言编程设计1项目，编程萌新，急求，谢谢

不介意私聊解决项目，萌新求助，急需谢谢


Question: 圈叉棋设计，替换字符出现问题（大佬救命）

引用 4 楼 曲九合的回复:问一下，这个是手机c语言编译器吧，软件叫什么名字啊？在哪里可以下载到？谢谢 C语言编译器IDE，在手机的应用市场里就有

引用 4 楼 曲九合的回复:问一下，这个是手机c语言编译器吧，软件叫什么名字啊？在哪里可以下载到？谢谢 全称为 C语言编译器IDE  ，华为手机应用市场里就有的

问一下，这个是手机c语言编译器吧，软件叫什么名字啊？在哪里可以下载到？谢谢

引用 2 楼 user-2的回复:   a[i][j]='O';//79; 谢谢大佬，我就是缓冲字符这一块出了问题

供参考：#include <stdio.h> int main(int argc, char* argv[]) {     //char a[3][3]={49,50,51,52,53,54,55,56,57},n;     char a[3][3]={'1','2','3','4','5','6','7','8','9'},n;//这样定义是否更清晰     int x,m,i,j;     m=2;     for(x=0;x<10;x++)     {         m++;         printf(" %c  :  %c   : %c\n",a[0][0],a[0][1],a[0][2]);         printf("--- + --- + ---\n");         printf(" %c  :  %c   : %c\n",a[1][0],a[1][1],a[1][2]);         printf("--- + --- + ---\n");         printf(" %c  :  %c   : %c\n",a[2][0],a[2][1],a[2][2]);         printf("--- + --- + ---\n");         printf("1-9代表九宫格中的位置，请输入1-9落子\n");         scanf("%c",&n);         getchar(); //吃掉缓冲区多余字符         for(i=0;i<3;i++)         {             for(j=0;j<3;j++)             {                 if(a[i][j]==n && m%2==0)                 {                     a[i][j]='X'; //88；这样定义是否更清晰                 }                 if(a[i][j]==n && m%2!=0)                 {                     a[i][j]='0';//79;                 }                 else                 {                     continue;                 }             }         }     }     return 0; }


Question:
问题：
s[j++]=a[i];与s[++j]=a[i];的区别

++j 是先加再用j的值 j++ 是先用j的值再加1

楼主理解正确，答案选A。A答案的执行顺序就是s[j]=s[i];j+1; 。如果是s[++j]=a[i]，执行顺序是j+1;s[j]=s[i]; 。规则就这么定的。


Question: 各位大佬，帮忙看看呗

谢谢你，谢谢你

第三题  #include <stdio.h>  int CheckPhoneNum(char *num) {     char *p = num;     int len = 0;     while (*(p++) != '\0')     {         len++;     }     for (int i = len - 1; i > len - 5; i--)     {         if (num[i] >= '0' && num[i] <= '9')         {             continue;         }         else         {             return 1;         }     }     if (num[len - 5] != '-')     {         printf("num[%d] is not -\n",len-5);         return 1;     }     for (int i = len - 6; i > len - 9; i--)     {         if (num[i] >= '0' && num[i] <= '9')         {             continue;         }         else         {             printf("前缀num[%d] %d is not number\n",i,num[i]);             return 1;         }     }     if (num[len - 8] == '0')     {         printf("num[%d] is not -\n",len-5);         return 1;     }     int sum = 0;     for (int i = 0; i < len - 9; i++)     {         sum += num[i] - '0';     }     if (sum == 0)     {         if (num[len - 9] == '-')         {             printf("num[%d] is -\n",len-9);             return 1;         }     }     else     {         if (num[len - 9] != '-')         {             printf("num[%d] is not -\n",len-5);             return 1;         }     }     return 0; }  int main(void) {     char num[15];     scanf("%s", num);     if (CheckPhoneNum(num) == 0)     {         printf("%s符合规定\n", num);     }     else     {         printf("%s不符合规定\n", num);     }      return 0; }

第二题 #include <stdio.h> int judge(int a[], int n, int *cd) {     if (n < 3)         return -1;     int i, j, tmp;     for (i = 0; i < n; i++)     {         for (j = i + 1; j < n; j++)         {             if (a[i] > a[j])             {                 tmp = a[i];                 a[i] = a[j];                 a[j] = tmp;             }         }     }     *cd = a[1] - a[0];     for (i = 0; i < n - 1; i++)     {         if (*cd != (a[i + 1] - a[i]))         {             *cd = 0;             return 1;         }     }     return 0; }  int main(void) {     int a[50] = {0};     int n, cd;     scanf("%d", &n);     for (int i = 0; i < n; i++)     {         scanf("%d", &a[i]);     }     if (judge(a, n, &cd) == 0)     {         printf("%d", cd);     }     return 0; }

第一题  #include <stdio.h> int isprime(int n) {     int i;     if (n < 2)         return 0;     for (i = 2; i < n; i++)     {         if (n % 2 == 0)         {             return 0;         }     }     return 1; }  int resolve(int n) {     int i;     for (i = 2; i < n; i++)     {         if (isprime(i) && isprime(n - i))         {             return i;         }     }     return 0; }  int main(void) {     int n, m;     int res;     scanf("%d %d", &n, &m);     for (int i = n; i <= m; i++)     {         res = resolve(i);         if (res != 0)         {             printf("%d=%d+%d\n", i, res, i - res);         }     }     return 0; }


Question: 怎么搞定字符串变量之间的比较大小，赋值问题

引用 3 楼 weixin_52907368 的回复:[quote=引用 1 楼 user-2的回复:]visit是什么类型？ 从while(visit[j]!=‘\0’)可以判断visit是个char数组，那么visit[j]就是char类型，所以不符合strcmp的参数类型 因为你的代码不全，不知道你想干啥，单纯为了修改代码 strcmp(x,visit[j])可以改成strcmp(x,&visit[j])//visit[j]是char类型&visit[j]就是char*类型，才符号strcmp的参数类型 visit[j]=x可以改成strcpy(&visit[j], x)//要用字符串拷贝的方式 谢谢，明白了，我就是想知道这个strcmp和strcpy怎么用[/quote]  网上有很多这样的例子，建议楼主先看一下这两个函数的原型，以便了解应该传什么参数进去

引用 1 楼 user-2的回复:visit是什么类型？ 从while(visit[j]!=‘\0’)可以判断visit是个char数组，那么visit[j]就是char类型，所以不符合strcmp的参数类型 因为你的代码不全，不知道你想干啥，单纯为了修改代码 strcmp(x,visit[j])可以改成strcmp(x,&visit[j])//visit[j]是char类型&visit[j]就是char*类型，才符号strcmp的参数类型 visit[j]=x可以改成strcpy(&visit[j], x)//要用字符串拷贝的方式 谢谢，明白了，我就是想知道这个strcmp和strcpy怎么用

strcmp(&x, &visit[i]) 这样试试～


Question: 小白求教

引用 12 楼 forever74的回复:其实你编译时的最后一条警告C6279已经指出了这个问题，可是你忽略了。 其实我是有看到的，只不过不知道是括号的形式错了，总之感谢大佬的指正

其实你编译时的最后一条警告C6279已经指出了这个问题，可是你忽略了。

引用 9 楼 forever74的回复:你写的是圆括号啊老大 new char(i+4)是申请1个字节的空间并用 i+4的值进行初始化的意思 对不起，看到了，已经改正了，谢谢大佬，我太傻了，基本格式都打错了

引用 9 楼 forever74的回复:你写的是圆括号啊老大 new char(i+4)是申请1个字节的空间并用 i+4的值进行初始化的意思 那要如何解决呢，大佬，这个难题困扰我很久了

引用 6 楼 forever74的回复:我说的是编译警告， 你说的是运行时弹出的对话框啊。  那不是好像，就是你使用的内存范围超出了new申请的 造成的。 你关注过那个方括号了么？ 我试着申请了更大内存，依然会报错

确实关注了，但仍不知如何解决

引用 1 楼 forever74的回复:str2=new char[i+4];  if(!fp1) {   printf(...);   return; } 好像是动态分配内存出了问题

引用 2 楼 自信男孩的回复:当文件打开失败后，就不要考虑向后继续执行了。 我加了返回值，还是报错，运行不出来，好像是动态分配内存的问题

引用 1 楼 forever74的回复:str2=new char[i+4];  if(!fp1) {   printf(...);   return; } 我加上了返回值，但是还是会报错

当文件打开失败后，就不要考虑向后继续执行了。


Question: 严蔚敏 数据结构 算法4.2 有个地方不明白呀 为什么是S1[0]?

从楼主画红线的位置可以感觉到， 当时楼主忐忑的心情，不安地猜测着，一个字符串为什么会与两个整数相加呢？  下雨天留客天留我不留？

s[0]存放的是他的长度  引用 3 楼 C2S2D2Nshishabi 的回复:引用 1 楼 真相重于对错 的回复:S1[0]是第一个串的长度，T的第1个字符到第S[0]个字符，被赋予了S1的数据，所以T[S1[0]+S[2]] 放置S2的数据还是有点不明白，T的第1个字符到第S[0]个字符，被赋予了S1的数据，所以T[S1[0]+S[2]] 放置S2的数据，如果这么说的话，为什么前面还要加个S1[0]呀，S1[0]不是放在了第一个串长的后面了吗？不应该是先1...S1[0]，再S1[0]吗？

很久没见过这么奇葩的脑洞了。 用C的风格说，这里的..是优先级最低的省略号，两边的加号都比它的优先级高，你得先去理解两边的加号，然后把各自的和作为省略号的上下限，OK？

比如S1 = 3"ABC"  S2=4"1234" 那么红线上一句话执行完后 T=？"ABC" 然后从S1[0]+1 开始 ，也就是4到 S[0]+S2[0] ,也就是7，这4个位置，放置”1234“


Question: 求助

-先考虑--b == d++  因为前置--所以b的值为8（9-1） d的++为后置，所以对比的时候d还是8 所以成立 当比较完后d自增变成9  然后9赋值给a 然后再次自增变成10

后缀++是先使用再变量自增1 --b计算得8，d++先使用d，所以8==8成立，然后d变为9，因为8==8成立，所以执行a=d++，先使用d，所以a=9，然后d变为10，所以最终a是9


Question: 萌新求教

while循环出大问题啦。	int n, i = 1, sum = 0; 	scanf("%d", &n); 	while (i <= n) 	{ 		if (n % i == 0) 		{ 			sum = sum + 1; 		} 		i++; 	} 	printf("%d\n", sum); 仅供参考


Question: 看看为啥不对

大约是你执行输入函数的时候输入的格式不对，所以那些scanf都失败了。

不知道哪里错了

第28行输出中 printf("%d %s %s %d %d\n",          cla[i].num, cla[i].name, cla[i].teacher, cla[i].term, cla[i].person);，老师的名字是字符串输出，所以结构体里应该改为：struct Class{        int   num;        char  name[10];        char  teacher[10];//老师名字是字符串        int   term;        int   person; };

teacher应该定义成字符数组吧，看到input函数里用的是%s，如果还用字符，那么这儿的%s就会导致越界，因为%s要接收字符，至少要2个字符，因为'\0'也占一个字符。  同样的道理print里用%s输出了teacher  所以，建议楼主把teacher定义成字符数组，比如char teacher[32];  定义数组长度建议定义成2的n次幂的大小，这个n根据你的预判数组长度决定。


Question: 大神求解，刚入门就遇到这。。。

只用逆波兰式，表达式求值方便。

百度搜“表达式树 先序 中序  后序”


Question: 大锅们，请问为什总是vs提醒我第一个else应输入一个语句，可是下面不是有吗

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

下面这句多了‘：’号引用if ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z'));

它上方的if行末尾多余分号， 死记硬背之。


Question: 衣食父母们，来了来了！！！

x=m*i+a=n*j+b n*j=m*i+(a-b); j=(m*i+(a-b))/n; 循环i，找到(m*i+(a-b))%n==0即可，如果i超出int范围（变成负数）说明无解

就是想看看你们有没有更简洁的方法

不知道你在说啥


Question: 数据结构--关于用队列实现形如a+b@b+a#字符序列的检验，程序进行要要检验一步就不运行了，求帮忙看看代码哪里有问题！！

引用 1 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h>  #define MAXQSIZE 100 #define ERROR 0 #define OK 1  typedef struct{     char *base;     int front;     int rear; }SqQueue;  void InitQueue(SqQueue *Q) //建立顺序队列 {     Q->base=(char*)malloc(MAXQSIZE*sizeof(char));     if(!Q->base)         exit(1);     Q->front = Q->rear = 0; }  int EnQueue(SqQueue *Q,char e) {     if((Q->rear+1)%MAXQSIZE==Q->front) return ERROR; //队列满条件     Q->base[Q->rear]=e;     Q->rear=(Q->rear+1)%MAXQSIZE;     return OK; }  int DeQueue(SqQueue *Q,char *e)  //从队列头删除一个元素 {     if(Q->front==Q->rear)         return ERROR; //队列空条件     *e=Q->base[Q->front];     Q->front=(Q->front+1)%MAXQSIZE;     return OK; }  int DeQueue_rear(SqQueue *Q,char *e) //从队列尾删除一个元素 {     if(Q->front == Q->rear)         return ERROR; //队列空     //*e=Q->base[Q->rear];     *e=Q->base[Q->rear-1];     Q->rear=(Q->rear-1)%MAXQSIZE;      return OK; }  int GetHead(SqQueue Q,char *e) {     if(Q.front==Q.rear)         return ERROR; //队列空     *e=Q.base[Q.front];     return OK; }  int QueueLength(SqQueue *Q) {     return (Q->rear-Q->front+MAXQSIZE)%MAXQSIZE; }  int CheckSymmetry(SqQueue *Q,char ch[]) {     InitQueue(Q);     int i=0;     //char *e,*c;     char e, c;     while(ch[i]!='@')  //@前字符入队列     {         EnQueue(Q,ch[i]);         i++;     }     i++;     while(ch[i]!='#')  //@后#前字符入队列     {         EnQueue(Q,ch[i]);         i++;     }     while(QueueLength(Q)!=0)     {         if(!DeQueue(Q, &c))             return ERROR;//取队头元素         if(!DeQueue_rear(Q, &e))             return ERROR;//取队尾元素         printf("%c:%c\n", c, e);         if(c != e)             return 0;     }     if(Q->front==Q->rear)         return 1; //队列为空，成功对称      return 0; }  int main(void) {     SqQueue Q;     //Q=(SqQueue*)malloc(sizeof(*Q));     //if(!Q) exit(1);     int i=0;     char ch[100]={'0'}, c;     do{         printf("请输入一个字符(形如a+b@b+a#的序列)：\n");         scanf("%c",&c);         getchar();         ch[i]=c;         i++;     }while(c != '#');     if(CheckSymmetry(&Q,ch))         printf("是中心对称序列\n");     else         printf("不是中心对称序列\n"); } 供参考～ 非常感谢！！但是有个疑问，在检验匹配的函数里，char *e,*c,为什么不可以呢，传指针进入DeQueue 函数，然后把指针的值赋为要弹出的队列值，这样为什么不可以呢？？希望可以解释一下非常感谢！！


Question: 数据结构--关于单链表的一些操作，程序运行一半停止，不知道哪里有问题，求助！！！

引用 3 楼  的回复:[quote=引用 2 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList_L(linklist *L,int n); void ListTraverse(linklist L,int n); void ListInsert(linklist L,int i,int e,int n);  //n为链表中结点个数 ,i为第i个元素前插入，e是新结点的值 void ListDelete(linklist L,int i,int *node,int n);  //n为链表中结点个数 ,i为删除结点的位置，e用来返回删除结点的值 void visit(linklist p);  int main() {     linklist L;     int n,i=5,e=999,*node;      printf("请输入你想建立单链表的结点个数：\n");     scanf("%d",&n);      CreatList_L(&L,n);   //逆序建立单链表,并将单链表的头地址赋给指针s     ListTraverse(L,n);  //遍历单链表     ListInsert(L,i,e,n);  //插入     ListDelete(L,i,node,n);  //删除  }  void CreatList_L(linklist *L,int n)  //逆序建立 {     printf("-----逆序建立------\n");     linklist p;     int i;     *L=(Lnode*)malloc(sizeof(Lnode)); //建立带头结点的单链表     //L->next==NULL;     (*L)->next = NULL;     for(i=n;i>0;i--)     {         p=(Lnode*)malloc(sizeof(Lnode));         printf("please enter a number:\n");         scanf("%d",&p->data);         p->next=(*L)->next;         (*L)->next=p;     }  }  void ListTraverse(linklist L,int n) //遍历单链表 {     printf("\n\n-------遍历--------\n");     int i;     linklist p;     p=L->next;     for(i=0;i<n;i++)     {         visit(p);         p=p->next;     } }  void visit(linklist p) //输出 {     printf("%d  ",p->data); }  void ListInsert(linklist L,int i,int e,int n) //第5个元素前插入元素 {     printf("\n\n-----插入元素------\n");     linklist p,q;     p=L;     //e=999;     //i=5;     int j=0;     while((p->next)&&j<i-1) //寻找第i-1个结点位置     {           p=p->next;         j++;      }     if(p->next==NULL)  //插入位置不合理     {         printf("ERROR!插入位置不合理！");         exit(0);     }     q=(Lnode*)malloc(sizeof(Lnode));  //建立新结点     q->data=e;     q->next=p->next;  //连入链表     p->next=q;     printf("\n插入成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n+1;i++)     {         p=p->next;         visit(p);     } }  void ListDelete(linklist L,int i,int *node,int n)  //删除第i个元素 {     printf("\n\n-----删除元素------\n");     linklist p,q;     p=L;     //i=5;     int j=0;     while(p->next&&j<i-1) //寻找删除结点的上个结点地址     {         p=p->next;         j++;     }     if(p->next==NULL)  //删除位置不合理     {         printf("ERROR!删除位置不合理！");         exit(0);     }     q=p->next;  //删除结点     p->next=q->next;     *node=q->data;     free(q);  //释放结点     printf("\n删除成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n-1;i++)     {         p=p->next;         visit(p);     } }  供参考～  为什么创建单链表时一定要用二级指针呢？？这点一直不太明白，一级指针传入的不也是地址吗？？ 希望可以讲解一下！非常感谢！！！[/quote]  参数传递是值传递，你把main函数的指针传进去，对这个指针做修改了吗？传二重指针，就可以对这个main函数里的指针进行修改。

引用 2 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList_L(linklist *L,int n); void ListTraverse(linklist L,int n); void ListInsert(linklist L,int i,int e,int n);  //n为链表中结点个数 ,i为第i个元素前插入，e是新结点的值 void ListDelete(linklist L,int i,int *node,int n);  //n为链表中结点个数 ,i为删除结点的位置，e用来返回删除结点的值 void visit(linklist p);  int main() {     linklist L;     int n,i=5,e=999,*node;      printf("请输入你想建立单链表的结点个数：\n");     scanf("%d",&n);      CreatList_L(&L,n);   //逆序建立单链表,并将单链表的头地址赋给指针s     ListTraverse(L,n);  //遍历单链表     ListInsert(L,i,e,n);  //插入     ListDelete(L,i,node,n);  //删除  }  void CreatList_L(linklist *L,int n)  //逆序建立 {     printf("-----逆序建立------\n");     linklist p;     int i;     *L=(Lnode*)malloc(sizeof(Lnode)); //建立带头结点的单链表     //L->next==NULL;     (*L)->next = NULL;     for(i=n;i>0;i--)     {         p=(Lnode*)malloc(sizeof(Lnode));         printf("please enter a number:\n");         scanf("%d",&p->data);         p->next=(*L)->next;         (*L)->next=p;     }  }  void ListTraverse(linklist L,int n) //遍历单链表 {     printf("\n\n-------遍历--------\n");     int i;     linklist p;     p=L->next;     for(i=0;i<n;i++)     {         visit(p);         p=p->next;     } }  void visit(linklist p) //输出 {     printf("%d  ",p->data); }  void ListInsert(linklist L,int i,int e,int n) //第5个元素前插入元素 {     printf("\n\n-----插入元素------\n");     linklist p,q;     p=L;     //e=999;     //i=5;     int j=0;     while((p->next)&&j<i-1) //寻找第i-1个结点位置     {           p=p->next;         j++;      }     if(p->next==NULL)  //插入位置不合理     {         printf("ERROR!插入位置不合理！");         exit(0);     }     q=(Lnode*)malloc(sizeof(Lnode));  //建立新结点     q->data=e;     q->next=p->next;  //连入链表     p->next=q;     printf("\n插入成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n+1;i++)     {         p=p->next;         visit(p);     } }  void ListDelete(linklist L,int i,int *node,int n)  //删除第i个元素 {     printf("\n\n-----删除元素------\n");     linklist p,q;     p=L;     //i=5;     int j=0;     while(p->next&&j<i-1) //寻找删除结点的上个结点地址     {         p=p->next;         j++;     }     if(p->next==NULL)  //删除位置不合理     {         printf("ERROR!删除位置不合理！");         exit(0);     }     q=p->next;  //删除结点     p->next=q->next;     *node=q->data;     free(q);  //释放结点     printf("\n删除成功！\n");     printf("\n新链表为:");     p=L;     for(i=0;i<n-1;i++)     {         p=p->next;         visit(p);     } }  供参考～  为什么创建单链表时一定要用二级指针呢？？这点一直不太明白，一级指针传入的不也是地址吗？？ 希望可以讲解一下！非常感谢！！！

可在VS里面下断点，单步调试。


Question: 数据结构-关于删除一递增序列中符合条件的元素，程序运行一半不动了，不知道哪里出了问题，求助！！

引用 5 楼  的回复:[quote=引用 3 楼 自信男孩 的回复:][quote=引用 2 楼  的回复:][quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！[/quote]  不是，而是根据我的理解去写这个逻辑，发现和你的差不多，就差一个break[/quote]  但是break不是结束本次循环的作用吗？？为什么差一个break错这么多啊， 现在想想觉得有没有break，这个循环运行不应该是一样的吗？？有点想不通了又。[/quote]  break是跳出循环，不是“结束本次循环”还有几个循环，不就是一层循环吗？怎么还有本次循环？

引用 3 楼 自信男孩 的回复:[quote=引用 2 楼  的回复:][quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！[/quote]  不是，而是根据我的理解去写这个逻辑，发现和你的差不多，就差一个break[/quote]  但是break不是结束本次循环的作用吗？？为什么差一个break错这么多啊， 现在想想觉得有没有break，这个循环运行不应该是一样的吗？？有点想不通了又。

引用 3 楼 自信男孩 的回复:[quote=引用 2 楼  的回复:][quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！[/quote]  不是，而是根据我的理解去写这个逻辑，发现和你的差不多，就差一个break[/quote] 确实是break的问题哈，删了之后正常了。非常感谢！！！！

引用 2 楼  的回复:[quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！[/quote]  不是，而是根据我的理解去写这个逻辑，发现和你的差不多，就差一个break

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct Lnode  //定义单链表存储结构 {     int data;     struct Lnode *next; }Lnode, *linklist;  void CreatList(linklist *L,int num[])  //创建链表 {     (*L)=(linklist)malloc(sizeof(Lnode)); //建立带头结点的单链表     if(!(*L))         exit(1);     (*L)->next=NULL;      int i=0;     linklist p,q = *L;      while(num[i]!=-1)  //数据时以-1为结束标志     {         p=(Lnode*)malloc(sizeof(Lnode));         p->data=num[i];         q->next=p;         p->next=NULL;         q=p;         i++;     } }  void chushu(linklist L) {     linklist r=L;     r=r->next;     while(r!=NULL)     {         printf("%d  ",r->data);         r=r->next;     } } int ListDelete_L(linklist L,int mink,int maxk) //删除满足条件的结点 {     linklist p,q;     p = L->next;     q = L;     if(!p) {         printf("ERROR!链表为空！");         exit(0);     } #if 1     while (p) {         if (p->data > mink && p->data < maxk) {             q->next = p->next;             free(p);             p = q->next;          } else {             q = p;             p = p->next;         }     } #else     while(p!=NULL)     {         if((p->data)>mink&&p->data<maxk)  //data值大于mink小于maxk，进行删除         {             q->next=p->next;             free(p);             p=q->next;         }         else         {             q=p;             p=p->next;             //break;         }      } #endif      return 1; }  int main() {     int num[12]={0,2,3,6,13,21,33,37,45,66,99,-1};     int i;     printf("原序列：");     for(i=0;i<11;i++)         printf("%d ",num[i]);     int mink=0,maxk=0;     printf("\n请输入删除元素下界mink：\n");     scanf("%d,",&mink);     printf("请输入删除元素上界maxk：\n");     scanf("%d,",&maxk);     linklist L;     CreatList(&L,num);     ListDelete_L(L,mink,maxk);     linklist p=L;     p=p->next;     printf("现序列：");     while(p!=NULL)     {         printf("%d  ",p->data);         p=p->next;     } } 供参考～ 请问加的if else 是什么意思呢？还有把while循环再多加一遍？？ 希望解释一下！谢谢！！


Question: c语言节点插入和删除

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


Question: 小白求解

纯粹因为就那么不超过10行代码，索性给你写了。 建议这种问题LZ还是自己先写一下，有问题再问。 int f(int a, int b) {     return a>b ? 1 : (a<b ? -1 : 0); } int main() {     int a, b;     scanf("%d%d", &a, &b);     printf("%d", f(a, b));     return 0; }

void func(int a, int b) {     if (a > b)         printf("1\n");     else if(a < b)         printf("-1\n");     else         printf("0"); }


Question: C语言余数

引用 5 楼 ctrigger 的回复:[quote=引用 4 楼 mswpp 的回复:]因为你的有错呀，哈哈哈哈 眼睛瞪大一点，都是对的。[/quote]我说的不是你的，哈哈哈哈

引用 4 楼 mswpp 的回复:因为你的有错呀，哈哈哈哈 眼睛瞪大一点，都是对的。

因为你的有错呀，哈哈哈哈

简单粗暴，仅供参考：#include <stdio.h>   int main(void) {     unsigned int a, b, m, n, x;     scanf("%d%d%d%d", &m, &n, &a, &b);          x = 1;     while(x)     {         if ((x % m == a) && (x % n == b))         {             printf("有解：x=%u", x);             return 0;         }         x++;     }          printf("无解");          return 1; }

不是告诉你思路了吗？ x=m*i+a=n*j+b 推出 n*j=m*i+(a-b) 推出 j=(m*i+(a-b))/n 因为 i 和 j 是整数，所以(m*i+(a-b))必须能被n整除才能保证 j 是整数 所以，i从0一直循环到整数的最大值，看看能否有满足条件的 i，找到 i 就是有解，否则就是无解  int mian() {     int a,b,m,n,i;     scanf("%d%d%d%d", &m, &n, &a, &b);     for (i=0; ; i++) {         if (i<0) {             printf("无解");             break; //i越界变成负数说明无解         }         else if ((m*i+a-b)%n == 0) {             printf("有解：x=%d", m*i+a);             break;         }     }     return 0; }


Question: 用*号打印实型心形图案

#include <conio.h> #include <stdlib.h> int main() {     system("chcp 437");     cprintf("\3\3\3\3\3\3\3\3\3");     return 0; }

写的好！ 接下来考虑写短一些吧。


Question: PAT 1020 月饼 (25分) 用C语言实现，请帮忙找找问题在哪里

引用 3 楼 user-1的回复:for(j=i+1;... 确实是这里错了，我之前看了好久都没有看出来，当局者迷呀，改后就全部运行成功了，非常感谢^_^

引用 1 楼 user-1的回复:排序的两个for就写的不对，仔细一下。 检查了几遍，也没有发现哪里错了呢，帮忙看下哦，谢谢

排序的两个for就写的不对，仔细一下。


Question: C语言文件操作代码

引用 2 楼 m0_46788383 的回复:[quote=引用 1 楼 自信男孩的回复:]自己先写写吧，不是很难的需求～ 是真的不会写唉[/quote] 那就找找原因，为什么写不出来。一句都写不出来，还是懒得去写。起码框架之类的，对的写不出来，错误的也能写出来吧  不尝试怎么知道，尝试了写不对这是两码事

引用 1 楼 自信男孩的回复:自己先写写吧，不是很难的需求～ 是真的不会写唉

自己先写写吧，不是很难的需求～


Question: 求大神解决 为什么我的vs2019写的C语言代码打开文件后在屏幕或者记事本显示都是一排方框

引用 1 楼 往事如烟0819 的回复：写代码，给你几点建议 1. 一定要做错误检查，不要怕麻烦。 err,  err1的返回值 都正确么  2. 代码一定要简单易懂。 ( (ch = getc(fp) != '#')   --->>>( ( ch = getc(fp) )  != '#' )  3. 要学会写调试代码，确定故障发生的原因。 例如， 发生错误时， 是文件打开错误， 还是读取字符的错误，还是文件写入的错误  4.感觉想乱码，看看官网的函数使用方法吧。 你输入文件的内容是英文还是中文，估计是中文吧， 先用英文试试，如果好用。在试试中文。 怎么感觉putc 函数的问题。 VC的函数不熟。 ]https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-s-wfopen-s?view=msvc-160我改好了 多谢提点  向你学习大佬 你给的建议很nice

我也是这个问题，你解决了吗？

引用 1 楼 往事如烟0819 的回复：写代码，给你几点建议 1. 一定要做错误检查，不要怕麻烦。 err,  err1的返回值 都正确么  2. 代码一定要简单易懂。 ( (ch = getc(fp) != '#')   --->>>( ( ch = getc(fp) )  != '#' )  3. 要学会写调试代码，确定故障发生的原因。 例如， 发生错误时， 是文件打开错误， 还是读取字符的错误，还是文件写入的错误  4.感觉想乱码，看看官网的函数使用方法吧。 你输入文件的内容是英文还是中文，估计是中文吧， 先用英文试试，如果好用。在试试中文。 怎么感觉putc 函数的问题。 VC的函数不熟。 ]https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-s-wfopen-s?view=msvc-160大佬我这个运行没啥问题 就是生成的txt文件用记事本打开时显示是一串方框 我把输出流转到屏幕显示也是一串方框  这是为啥啊 求解

引用 1 楼 往事如烟0819 的回复：写代码，给你几点建议 1. 一定要做错误检查，不要怕麻烦。 err,  err1的返回值 都正确么  2. 代码一定要简单易懂。 ( (ch = getc(fp) != '#')   --->>>( ( ch = getc(fp) )  != '#' )  3. 要学会写调试代码，确定故障发生的原因。 例如， 发生错误时， 是文件打开错误， 还是读取字符的错误，还是文件写入的错误  4.感觉想乱码，看看官网的函数使用方法吧。 你输入文件的内容是英文还是中文，估计是中文吧， 先用英文试试，如果好用。在试试中文。 怎么感觉putc 函数的问题。 VC的函数不熟。 ]https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/fopen-s-wfopen-s?view=msvc-160大佬 这个运行上都没有问题 最后也直接生成了写入的txt文件 就是文件里的英文语句显示出来是一串方框


Question: 问题（指针基础）：字符串复制函数返回复制后字符串首地址值,无法打印该字符串

谢谢楼上的各位，问题解决了！！！

1. s3 指向的地址空间 h3[100], 没有被初始化。  重点  局部变量，数组， 必须在使用前，进行初始化。 原因 局部变量的初始值不定, 很危险。(从栈空间分配， 其值为上次别人剩下的值)

#include<stdio.h> char *strcopy(char *t,const char *s) {     char *temp = t;     while(*temp++=*s++);//temp s 中记录的地址值是在增加变化     return t; //返回的地址值是字符串首地址不变的  }  int main(int argc, char* argv[]) {      char h1[100],h2[100],h3[100];     char *s1,*s2,*s3;     s1=h1;     s2=h2;     s3=h3; // 这里 s3 -> h3[100]的地址     scanf("%s",s2);     s3=strcopy(s1,s2);//这里 s3 -> s1的地址，即h1[100]的地址。     printf("%s\n",s3);     return 0;  } //程序执行完，h1[100]和h2[100]的内容一致，h3[100]并没有变化。

楼主，程序修改下，是否更容易让你理解，指针只是记录地址的一个变量。#include<stdio.h> char *strcopy(char *t,const char *s) {     char *temp = t;     while(*temp++=*s++);     return t;  }  int main(int argc, char* argv[]) {      char h1[100],h2[100],h3[100];     char *s1,*s2,*s3;     s1=h1;     s2=h2;     s3=h3;     scanf("%s",s2);     s3=strcopy(s1,s2);     printf("%s\n",s3);     return 0;  }

是啊，你return的那个t已经漂移了好远。  很契合 刻舟求剑 哦。

char *strcopy(char *t,const char *s) {     while(*t++=*s++);     return t;//这里的t已经指向了传进来数据的尾部了  }


Question: 请教一下前辈们这里类型转换的问题

感谢各位老师，冬至快乐

为了不引起对齐错误也就是总线错误，要么费心计算需要多少填充字节，要么像这样粗鲁地转换成32位或64位（依系统而定）。

栈这种东西我们喜欢比喻为子弹夹。 照你的想法，弹夹里面可以7.62mm和5mm还有12mm的混合还不出啥问题？  尽管指针尤其是void指针可以以字节为单位移动，但是混压不同尺寸的数据很容易引起总线错误啊。

去掉你认为多余的转换，看编译是否报错，编译如果不报错的话，用-2147483648,2147483647,0,-1,1作为数据，运行测试一下看结果是否如你所愿。


Question: free指针时报错

如果你不想再申请内存空间 那就没有必要malloc和free。 你直接用fvalue的地址空间就好 。 对吧；

感谢！。。。f_value如果是传参怎么办？ int Dll_Start(float *f_value) { 	 	float *fp = NULL; 	//fp = (float *)malloc(30 * sizeof(float)); 	fp = f_value;  	free(fp); 	return 0; }

那不能先free再赋值么?

f_value改成动态数组，也用malloc申请内存就可以 数组内存是固定的，在栈里，函数结束栈退出后会自动被回收，所以你自己不能free栈里的内存。 动态分配内存是在堆上的，跟栈没关系，栈退出也不会自动回收，所以才需要自己去free。

fp=f_value不是不可以，那你就没必要free了。 理由上面已经说过了，f_value是栈内存，栈退出会自动回收，不能自己free。 也就是说你的dll_start函数内部不需要管理free，因为dll_start不知道参数的指针是指向栈内存还是堆内存，所以没必要去强制free。free应该由内存申请的者去自己控制，dll_start不需要越俎代庖。

引用 5 楼 往事如烟0819 的回复:你是想要把f_value的内容赋值给fp(malloc分配的空间吧) int main(int argc, char **argv) { 	float f_value[] = { 1,2,3,4,5 }; 	float *fp=NULL; 	 	fp = (float *)malloc(30 * sizeof(float)); 	if ( fp != NULL ) 	{ 		memcpy(fp, &f_value[0],  sizeof( f_value) ); 	} 	else 	{ 		/* Error process......	*/ 	} 	 	free(fp); 	return 0; 	 }  感谢。。。这里只能用memcpy？？我尝试过，这个有点慢，实际应用中，我的数据量有点大，就没有直接fp = f_value;的办法吗？

引用 6 楼 chxchxkkk 的回复:请时刻牢记free和malloc一定是成对出现的，没有用malloc，就不要用free 谢谢，我知道，我的意思是即使用了malloc，也会报错。这里。


Question: 有没有人能够看一下我这段代码出现了什么问题？

引用 1 楼 user-1 的回复:修改如下，供参考：void account(int a) {     printf("\nname 用户\n");     printf("please input the account:\n");     char ch[] = { 'l','o','g','i','n','_','v','i','s','i','o','n','1','.','0','.','3' };     char b[17];     int i = 0;     int t = 0;     while (i < 17 && t == 0)     {         scanf_s("%c", &b[i]);         if (b[i] == '\n')         {             t = 1;         }         i++;     }     i = 0;     t = -1;     while (i < 17)     {         if (ch[i] == b[i])         {            i++;         }         else         {            t++;            i = 0;            //account(t);            break;         }     }      if (i != 17)         account(t);     else         password(1); } 运行出来是正确的，谢谢啦

我看一下，再编译一次，看有没有问题，谢谢啦。


引用 楼主 weixin_53802790的回复:最近在做计算机大作业。想做一个病床呼叫系统，用proteus7的atmega16。有没有大佬能帮忙支个招。 八个开关分别控制八个数码管为病床，开关闭合会控制相应的数码管显示数字，同时蜂鸣器会发出警报。第九个开关闭合会使所有数码管清零，同时警报声消失。有没有大佬有思路，能不能教教我，求求了，不想挂科


Question: c#汉字转成拼音后如何把声母韵母分开

声母数量又不多，穷举之。


Question: 在窗口运行不显示！！

引用 1 楼 user-1的回复:把 for(i=0; i=n/2; i++) //不能用=，就算用也应该是== 改成 for(i=0; i<=n/2; i++) //要用<= 是的哈，没注意看。。


Question: 求大神帮忙

你这是找打手的节奏呀

引用 楼主 一只鸿鹄的回复:用c语言数据结构做一个哈夫曼编译器，要求输入权值，然后对数字进行编译。 要求功能是初始化建立哈弗曼树，编码，译码，退出系统，功能越多越好，这个是最基本的，求大神们帮忙。谢谢。


Question: 关于结构体数组，交换顺序问题

把struct row *temp; 改成 struct row temp;  把 temp=(p+k); (p+k)=(p+i); (p+i)=temp; 改成 temp=*(p+k); *(p+k)=*(p+i); *(p+i)=temp;  问题原因 (p+k)=(p+i);相当于 &r[k]=&r[i]; r是实参main函数的数组变量， &r[k]是个固定的地址（因为数组的地址是固定的），所以不能改变数组元素的地址，但是可以改变 r[k]，也就是*(p+k)，也就是可以改变数组元素的值。注意其中的区别。


Question: 在编译器中运行的结果是对的，但在noi里显示超时，怎么回事？怎么解决？

不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

引用 3 楼 赵4老师的回复:#include <stdio.h> int main() {     int n,a,x=1;     scanf("%d",&n);     if(n==1)         printf("2\n");     else {         while (1) {             if (n-1<=0) break;             x+=2;             a=x;             while (1) {                 if (n-1<=0) break;                 a--;                 if(x%a==0)                     break;                 else {                     if(a==2) {                         n--;                         break;                     } else                         continue;                 }             }         }         printf("%d\n",x);     }     return 0; }  可以问一下，为什么要这样改吗

引用 1 楼 user-2的回复:无代码没么回答 #include <stdio.h> int main() { int n,a,x=1; scanf("%d",&n); if(n==1) printf("2"); else { while(n-1>0) { x+=2; a=x; while(n-1>0) { a--; if(x%a==0) break; else { if(a==2) { n--; break; } else continue; } } }     printf("%d",x); } return 0; }

无代码没么回答


Question: 请问，怎么将输入的整型值转换为字符串输出呢？ 老师还说，不许用if，只许用一次循环

snprintf试试

int main() {     int i, n;     char s[16];     scanf(“%d”, &n);     s[15]=‘\0’;     for (i=14; n>1; i--, n/=10) {         s[i]=‘0’+(n%10);     }     s[i]=‘0’+n;     printf(“%s”, s+i);     return 0; }

连一次循环都不用： chat b[64]; sprintf(b,"%d",123456); 在b中存放的就是


Question: 二进制算法

类似汇编这玩意： 加法：每次加法，考虑一下进位就行。 减法：转为加法做。 乘法：转为上述方法及移位操作。 除法：转为上述方法。即使除不尽，也可以得到商和余数。


Question: 请教下C语言使用regex库正则筛选连续数字/字母的问题

感谢，C++的是可以了。我自己研究下C有没有办法吧。看看有没有办法解决第二个问题。

再供参考：#include <iostream> #include <string> #include <regex> using namespace std; int main() {     string s("we12312332qwwww  d1246Xdes");     cout << s << endl;     cout << "----" << endl;     regex e("[0-9]{4}");     smatch m;     while (regex_search (s,m,e)) {         cout << m.str() << endl;         s = m.suffix().str();     }     return 0; } //we12312332qwwww  d1246Xdes //---- //1231 //2332 //1246 //  正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549

引用 2 楼 赵4老师 的回复:仅供参考：#include <iostream> #include <string> #include <regex> using namespace std; int main() {     string s("deabc\ndeab\ndefabc");     cout << s << endl;     cout << "----" << endl;     regex e("abc$");     smatch m;     while (regex_search (s,m,e)) {         cout << m.str() << endl;         s = m.suffix().str();     }     return 0; } //deabc //deab //defabc //---- //abc //abc //  引用 2 楼 赵4老师 的回复:仅供参考：#include <iostream> #include <string> #include <regex> using namespace std; int main() {     string s("deabc\ndeab\ndefabc");     cout << s << endl;     cout << "----" << endl;     regex e("abc$");     smatch m;     while (regex_search (s,m,e)) {         cout << m.str() << endl;         s = m.suffix().str();     }     return 0; } //deabc //deab //defabc //---- //abc //abc //   谢谢回复，不过我需要用C语言实现，没法直接用regex库，是额外导入的。还有就是我按照您的代码替换了文本和正则表达式，结果和我之前差不多，第一串数字是一整串出来的。

没人会吗。。。


Question: C指针

棒棒哒哒哒哒

//对于字符串“abcdefghijklmn”，读入两个数字，比如begin、num，假定begin为1，num为5， //则动态申请内存，存放子串“bcdef”，最后输出该子串。 //简化起见，假定begin、num都在有效范围内。设计main函数, 同时要展示出字符串和动态内存的地址 #include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> int main() {     char *s="abcdefghijklmn";     int begin,num;     char *p;      scanf("%d%d",&begin,&num);     p=(char *)malloc(num+1);     if (NULL==p) {         printf("Can not malloc(%d bytes)!\n",num+1);         return 1;     }     strncpy(p,s+begin,num);     p[num]=0;     printf("%s\n",p);     printf("0x%p\n",p);     free(p);      return 0; } //输入 //1 5 //输出 //bcdef //0x012DDC38 //

char* func(char* str,int begin,int num) {    char* result = (char*)malloc(sizeof(char)*(num+1));    memcpy(result,str+begin,sizeof(char)*num);    result[num]='\0'; return result; }


Question: 各位大佬，C语言，帮忙看看呗

类似，只要把输出条件修改为>1即可，再加判断输入是否合法。

供参考：#include<stdio.h>  int main(int argc, char* argv[]) {       int n,i,flag=1;       int a[10]={0};         scanf("%d",&n);        if(n>9999999 || n<=0) {           printf("Invalid input");           return 1;        }         while(n!=0)           {             a[n%10]++;             n /= 10;           }        for(i=0;i<10;i++)            if(a[i]>1){               flag = 0;               printf(" %d",i);            }        if(flag) printf("No repeated number.\n");        return 0; }


Question: 输入若干个字符，统计各英文字母出现的次数。（字母区分大小写字母）

#include <stdio.h> int main(int argc, char* argv[]) {     char c[100];     int a[26]={0},A[26]={0},flag=0,i=0;     gets(c);     while( c[i] != '\0'){                       //while((c = getchar()) != '\n'){           if(c[i] >= 'a' && c[i] <= 'z')               {a[c[i]-'a']++;flag=1;}          //a[0]对应保存小写字母出现的次数           if(c[i] >= 'A' && c[i] <= 'Z')               {A[c[i]-'A']++;flag=1;}          //A[0]对应保存大写字母出现的次数           i++;     }     for(int i=0;i<26;i++)         if(a[i] != 0)          printf("%c->%d\n",'a'+i,a[i]);     for(int i=0;i<26;i++)        if(A[i] != 0)          printf("%c->%d\n",'A'+i,A[i]);     if(!flag) printf("No letter!");       return 0; }

供参考：#include <stdio.h> int main(int argc, char* argv[]) {     char c;     int a[26]={0},A[26]={0};      while((c = getchar()) != '\n'){           if(c >= 'a' && c <= 'z') a[c-'a']++;//a[0]对应保存小写字母出现的次数           if(c >= 'A' && c <= 'Z') A[c-'A']++;//A[0]对应保存大写字母出现的次数     }     for(int i=0;i<26;i++)         if(a[i] != 0)          printf("%c->%d\n",'a'+i,a[i]);     for(int i=0;i<26;i++)        if(A[i] != 0)          printf("%c->%d\n",'A'+i,A[i]); }

引用 4 楼 ctrigger的回复:#include <stdio.h>  int is_alpha(int c) { 	return ((c > 'a' && c < 'z') || (c > 'A' && c < 'Z')); }  int main(void) { 	int c, i, size; 	int result[128] = { 0 }; 	size = 100; 	 	while(size-- && ((c = getchar()) != '\n')) 	{ 		if(is_alpha(c)) result[c]++; 	} 	 	for(i = 0; i < 128; i++) 	{ 		if(is_alpha(i) && result[i]) 		{ 			printf("%c -> %d\n", i, result[i]); 		} 	} 	return 0; }  抱歉，我还是看不懂

类似，全部输出即可，只是数组要创建2倍以区分大小写，对于大小写对应序进行处理即可实现。

引用 2 楼 ctrigger的回复:供参考： #include <stdio.h> #include <ctype.h>  int main(void) { 	char buf[101]; 	int result[128] = { 0 }, i = 0; 	fgets(buf, sizeof(buf), stdin); 	while(buf[i]) 	{ 		if(isalpha(buf[i])) result[buf[i]]++; 		i++; 	} 	for(i = 0; i < 128; i++) 	{ 		if(isalpha(i) && result[i]) 		{ 			printf("%c -> %d\n", i, result[i]); 		} 	} 	return 0; }  我还没学到ctype


Question: 麻烦大佬帮忙看一下这个题我该怎么做

你的是对的！

运行出来不对，是一串数字。printf要是在for循环里边那就是不停地输出数字

引用 楼主 恶魔妈妈买面膜1的回复:#include<stdio.h>  int main() {     int a=1,b=1,c=1,i,j,k;     for(a; a<10; a++)     {         for(b; b<10; b++)         {   for(c; c<10; c++)                 if(100*a+10*b+c+100*c+10*b+a==1333&&a>0)                     i=a;             j=b;             c=k;         }     }       printf("a=%d，b=%d，c=%d",i,j,k); } 你可以试试这个 #include <stdio.h> void main() { 	int a,b,c; 	for(a=1;a<10;a++) 	{ 		for(b=1;b<10;b++) 		{ 			for(c=1;c<10;c++) 			{ 				if(a*100+b*10+c+c*100+b*10+a==1333) 					printf("%d,%d,%d ",a,b,c); 			} 		} 	} }

供参考  void test() {     int a, b, c;     for (a = 0; a < 10; a++)     {         for (b = 0; b < 10; b++)         {             for (c = 0; c < 10; c++)             {                 if (100 * a + 10 * b + c + 100 * c + b * 10 + a == 1333 )                     printf("a=%d, b=%d,c=%d\n", a, b, c);             }         }     } }


Question: 请教一个简单算法。

#include <stdio.h> #include <stdlib.h>  int a,b;  int main() { 	printf("请输入20-120中任意一个值："); 	scanf_s("%d", &a);         b = ((a - 20) / 100.0 + 0.002) * 255;          //b = ((a - 20) + 0.2) * (255 / 100.0); 	printf("%d\n", b); 	system("pause"); 	return 0; } b是整数型，自动就把小数点后面的去掉了，前面加的0.002*255就相当于四舍五入了 { double a=1.6; int b=a+0.5,c=a; } 输出结果是b为2，c为1；

麻烦把b也四舍五入一下，怎么写？

是这个意思吗？   int fun(int n) {     return (int)((n-20)*255.0/(120-20)+0.5); } int main( ) {     int i;     for(i=20; i<=120; i++) {         printf("%d:%d\n", i, fun(i));     }     return 0; }


Question: 已知两个升序数组，将它们合并成一个升序数组并输出。例如：数组array1={3,6,13,35,54}，数组array2={14,19,26,32}， 合并为新

引用 3 楼 ctrigger的回复:标准归并排序，高效，复杂度是0（n）。 唉， 听不懂你说的是什么意思？可以帮我敲一下，让我看看吗？

标准归并排序，高效，复杂度是0（n）。

引用 1 楼 智者知已应修善业的回复:用归并排序或插入排序即可可参 代码怎么敲？不会我

用归并排序或插入排序即可可参


Question: 求助

d++是先得出结果再自增的，++d是先自增再得结果。


Question: c语言求助 求10*10第n对角线的和

引用 1 楼 俺是阿丰的回复:很像今年下半年的蓝桥杯的题 现在有答案了 你可以参考 谢谢一开始我没理解清题目的意思，现在搞明白了

很像今年下半年的蓝桥杯的题 现在有答案了 你可以参考


Question: 输入年份和月份，计算这一年这个月有多少天。（查错）

闰年判断条件有问题，供参考：#include <stdio.h> int main(int argc, char* argv[]) {     int year = 0,month = 0;     int days[]={31,28,31,30,31,30,31,31,30,31,30,31};     int day;     while(scanf("%d %d",&year,&month) != EOF)     {          if((year %4 ==0 && year % 100 !=0) || year % 400 ==0)         //if(year % 4 == 0 || (year % 4 == 0 && year % 100 != 0))    //某年为闰年         {             if(month != 2){                 day = days[month - 1];                 printf("%d",day);             }             else{                 day = 29;                 printf("%d",day);             }         }         else        //某年为平年         {             day = days[month - 1];             printf("%d",day);         }     }    // system("pause");     return 0; }

#include <stdio.h>  int main() {     int year = 0,month = 0;     int days[]={31,28,31,30,31,30,31,31,30,31,30,31};     int day;     while(scanf("%d %d", &year,&month) != EOF)     {         //if(year % 4 == 0 || (year % 4 == 0 && year % 100 != 0))    //某年为闰年         if(year % 400 == 0 || (year % 4 == 0 && year % 100 != 0))    //某年为闰年         {             if (month != 2) {                 day = days[month - 1];                 printf("%d",day);             }             else {                 day = 29;                 printf("%d",day);             }         }         else        //某年为平年         {             day = days[month - 1];             printf("%d",day);         }     }     return 0; } 供参考～


Question: 请大神解救下C言语题目

对不起，是我天真了

结构体存储学生信息，然后用链表链起来  遍历不及格学生写入文件  按行读文件，再组装下输出  最重要的：代码要自己写

引用 1 楼 bluefishLTJ 的回复:有没有大哥帮帮忙 自己先试试，不尝试什么也不知道，什么也学不到。

好好做作业.

有没有大哥帮帮忙


Question: 7-2 房屋分拆 (20分

18=9，9；9=4，5；9=4，5；5=2，3；4=2，2；2=1，1；2=1，1；18，9，9，5，4，2，2=49


Question: \(^o^)/@_@各位哥哥姐姐们，关于指针的类型转换及运算的问题？

函数返回值是个地址，那么你截取了该地址的低8位。

首先，指针的值就是地址，地址就是的无符号int类型 char c=‘a'; //c是字符，可以转成int void* p=(void*)(unsigned int)c; 把c转成无符号int（上面说了，其实就是地址），再把地址转成指针p 那么这样转出来的p怎么还原回c 那自然就是 char cc =(char)(unsigned int)p 把p指针转成地址（无符号int），再把int转成char就可以了


Question: 求助

但语义上制造空的死循环就没啥价值了。

语法肯定是合的，制造死循环嘛，等价于while(1);

合法，表示一个无限空循环

引用 1 楼 user-2的回复:合法，表示一个无限空循环 把括号外面的分号去掉可以吗


Question: 重积分求代码，怎样更简单？？？

为啥是两个分号啊

for example int main( ) {     int i;     for(i=1; ; i++) {         if ((9*i+6)%7==1) {             printf("%d\n", 9*i+6);             break; //找到就退出循环         }         if (9*i+6<0) break; // 防止死循环，越界就证明无解     }     if(9*i+6<0) {         printf("无解\n");     }     return 0; }


Question: 输入n科成绩（浮点数表示），统计其中的最高分，最低分以及平均分。

再精炼点，少用几个for:#include <stdio.h> int main(int argc, char* argv[]) {     int n;     int i;//循环变量     float max;         //max = -1;     float min ;        //min = 101;     float score[5] = {0};//score[5] = {};初始化为0     float avg = 0;                       //scanf("%d",&n);  这句没什么用，放这里输入n，但没用到n     for(i = 0; i < 5; i++)     {          scanf("%f",&score[i]);//scanf("%f",score);     }      min=max=score[0];//max min 初始化放在这里     for(i = 0; i < 5;i++)     {         if(max < score[i])         {             max = score[i];         }                             //}                            //for(i = 0; i < 5 ;i++)                            // {         if(min > score[i])         {             min = score[i];         }                          //}                         // for(i = 0; i < 5; i++)                         //{         avg += score[i];     }     printf("max=%.2f  min=%.2f   avg=%.2f\n",max,min,avg/5);     return 0; }

修改如下，供参考，希望能帮到你：#include <stdio.h> int main(int argc, char* argv[]) {     int n;     int i;//循环变量     float max;         //max = -1;     float min ;        //min = 101;     float score[5] = {0};//score[5] = {};初始化为0     float avg = 0;                       //scanf("%d",&n);  这句没什么用，放这里输入n，但没用到n     for(i = 0; i < 5; i++)     {          scanf("%f",&score[i]);//scanf("%f",score);     }      min=max=score[0];//max min 初始化放在这里     for(i = 0; i < 5;i++)     {         if(max < score[i])         {             max = score[i];         }                             //}                            //for(i = 0; i < 5 ;i++)                            // {         if(min > score[i])         {             min = score[i];         }     }     for(i = 0; i < 5; i++)     {         avg += score[i];     }     printf("max=%.2f  min=%.2f   avg=%.2f\n",max,min,avg/5);     return 0; }

把scanf(“%f”, score)改成 scanf(“%f”, &score[i])


Question: 请教一下大佬这个位置为什么报错呀？？

修改如下，void sort1(int p[], int left, int right)这个函数只排除语法错误，逻辑没调试，供参考：#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> void reverse(int p[],int left,int right)//使数据颠倒顺序 {     int temp;     while (left < right)       {          temp     = p[left];          p[left]  = p[right];          p[right] = temp;          left++;     //right++; left++;       } }  void sort1(int p[], int left, int right)//将一组正...正负...负的数顺序换位 {     int i=0;     reverse(p, left, right);//reverse(*p, left, right);     while (p[i] < 0) { i++;}     reverse(p, left, i - 2);//reverse(*p, left, i - 2);     reverse(p, i - 1, right);//reverse(*p, i - 1, right); }  void CompletelySort(int* p, int left, int right)//将整个数组排为负数在前，正数在后且不改变原来顺序的数组 {     int j;// i=0     while (left < (right-1)/2) //while (left < right)       {         j=0;         while(p[left]<0){left++;}           //while (p[left++] > 0) { ; }                                            //left = left - 1;         j = left;                          //j += left;         while(p[j]>0 && j < right-1){j++;} //(p[j++] < 0) { ; }         reverse(p, left, j);            //reverse(*p, left, j - 2);         left++;       } }  int main(int argc, char* argv[]) {     int a[] = {1,2,-3,4,-6,-7,9,-10,7,22,-78};     int right = sizeof(a)/sizeof(int);      //sizeof(a)/sizeof(int)-1;     for (int i = 0; i < right; i++)        {          printf("%d  ", a[i]);        }     printf("\n");     CompletelySort(a, 0, right);     for (int i = 0; i < right;i++)       {         printf("%d  ",a[i]);//printf("\n%d   ",a[i]);       }     printf("\n");     //system("pause");     return 0; } 运行：

right--; left++;

大概溜一眼代码，感觉问题不少 reverse函数while循环应该是right--，left++，否则就死循环了 reverse函数调用函数地方reverse(*p,left,right)要改成reverse(p,left,right)，注意参数*p和p的区别 剩下一就没细看了


引用 1 楼 user-1的回复:没发现什么问题啊，楼主想实现什么效果呢？#include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) {     int a[39][39]={0},i,j,n,k,c,b;     k=0;     scanf("%d",&n);      for(i=0;i<n;i++)       for(j=0;j<n;j++)       {         k++;         if(k==1)             a[0][(n-1)/2]=k;         else           {             for(i=0;i<n;i++)                for(j=0;j<n;j++)                   if(a[i][j]==k-1)                    {                      c=i;                      b=j;                   }                  if(c==0&&b!=n-1)                     a[n-1][b+1]=k;                  else if(c!=0&&b==n-1)                            a[c-1][0]=k;                      else if(c==0&&b==n-1)                               a[c+1][b]=k;                           else                              {                               if(a[c-1][b+1]==0)                                   a[c-1][b+1]=k;                               else                                   a[c+1][b]=k;                              }           }       }     for(i=0;i<n;i++)         for(j=0;j<n;j++)         {             if(j!=n-1)                 printf("%d ",a[i][j]);             else                 printf("%d\n",a[i][n-1]);         }     return 0; } 那个输出好像是错的

那个输出好像是错误的


Question: 有人接单写个简单的c语言代码吗？

百度这种示例代码一堆

就是读文件呗，到处都是教程

直接把需求发出来不行？

某度不就行了


Question: C语言编译过程出现这种问题是怎么回事啊？

重新编译前务必关掉运行窗口

代码呢？没看到你完整的代码呢？


Question: 大一C语言作业问题

供参考：#include <stdio.h> int main(int argc, char* argv[]) {     char *s = new char[100],*t = new char[10],*str = new char[10],*temp = new char[100];     char *p,*q,*pos;      gets(s);     gets(t);     gets(str);      p=s;     q=temp;     while(*p != '\0')     {          pos = str;          if(*p == *t){             while(*p == *t && *t != '\0'){               p++;               t++;             }             while(*pos != '\0'){                *q++ = *pos++;             }          }          *q = *p;          q++;          p++;     }     *q = '\0';      strcpy(s,temp);     printf("%s\n",s);      system("pause");     return 0; }


Question: 求大佬帮忙

打印的东西最好是返回值  int process (int x, int y, int (*f)(int, int)) {     return f(x, y); }  //main改成 printf("max=%d", process(a,b,max)); printf("\nmin=%d", process(a,b,min)); printf("\nadd=%d", process(a,b,add));

process函数，用一个f就可以了。m = f(x, y); p,q做啥呢？ 根据process传进来不同的函数名，f执行不同的函数体。因此p,q没必要，再说用了p,q这两个函数的返回值做啥用了？    void process (int x, int y, int (*f)(int, int)) {     int w = f(x, y);    printf("%d\n", w); } 这个函数执行几条语句就可以了，试试～


Question: 求助

x<y<z 由于x<y是假的，结果为0，整个表达式变成 0<z 这个是真的，结果为1  另一个类似。


Question: 简易计算器

大道至简计算器：#pragma warning(disable:4996) /*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console) 功能： 目前提供了10多个常用数学函数: ⑴正弦sin ⑵余弦cos ⑶正切tan ⑷开平方sqrt ⑸反正弦arcsin ⑹反余弦arccos ⑺反正切arctan ⑻常用对数lg ⑼自然对数ln ⑽ｅ指数exp ⑾乘幂函数^ ⑿向上取整ceil ⒀向下取整floor ⒁四舍五入取整round ⒂取符号sign ⒃取绝对值abs 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率Pi键入字母时不区分大小写,以方便使用。 16进制整数以0x或0X开头。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab = 0x9; const int  DIGIT = 1; const int MAXLEN = 16384; char s[MAXLEN], *endss; int pcs = 15; double sign(double dVal) {          if (dVal>0.0) return  1.0;     else if (dVal<0.0) return -1.0;     else               return  0.0; } double round(double dVal, short iPlaces) {//iPlaces>=0     char s[30];     double dRetval;      sprintf(s, "%.*lf", iPlaces, dVal);     sscanf(s, "%lf", &dRetval);     return (dRetval); } double fun(double x, char op[], int *iop) {     while (op[*iop - 1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop - 1]) {         case  7: x = sin(x);    (*iop)--; break;         case  8: x = cos(x);    (*iop)--; break;         case  9: x = tan(x);    (*iop)--; break;         case 10: x = sqrt(x);   (*iop)--; break;         case 11: x = asin(x);   (*iop)--; break;         case 12: x = acos(x);   (*iop)--; break;         case 13: x = atan(x);   (*iop)--; break;         case 14: x = log10(x);  (*iop)--; break;         case 15: x = log(x);    (*iop)--; break;         case 16: x = exp(x);    (*iop)--; break;         case 17: x = ceil(x);   (*iop)--; break;         case 18: x = floor(x);  (*iop)--; break;         case 19: x = round(x,0);(*iop)--; break;         case 20: x = sign(x);   (*iop)--; break;         case 21: x = fabs(x);   (*iop)--; break;         }     return x; } double calc(char *expr, char **addr) {     static int deep; //递归深度     static char *fname[] = { "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round","sign","abs",NULL };     double ST[10] = { 0.0 }; //数字栈     char op[10] = { '+' }; //运算符栈     char c, *rexp, *pp, *pf;     int ist = 1, iop = 1, last, i, n;     __int64 i64;      if (!deep) {         pp = pf = expr;         do {             c = *pp++;             if (c != ' '&& c != Tab)                 *pf++ = c;         } while (c != '\0');     }     pp = expr;     if ((c = *pp) == '-' || c == '+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c = *pp) != '\0') {         if (c == '(') {//左圆括弧             deep++;             ST[ist++] = calc(++pp, addr);             deep--;             ST[ist - 1] = fun(ST[ist - 1], op, &iop);             pp = *addr;             last = DIGIT;             if (*pp == '(' || isalpha(*pp) && strnicmp(pp, "Pi", 2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++] = '*';                 last = !DIGIT;                 c = op[--iop];                 goto operate;             }         }         else if (c == ')') {//右圆括弧             pp++;             break;         }         else if (isalpha(c)) {             if (!strnicmp(pp, "Pi", 2)) {                 if (last == DIGIT) {                     wcout <<    L"π左侧遇）" << endl; exit(1);                 }                 ST[ist++] = 3.14159265358979323846264338328;                 ST[ist - 1] = fun(ST[ist - 1], op, &iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp, "Pi", 2)) {                     wcout <<    L"两个π相连" << endl; exit(2);                 }                 if (*pp == '(') {                     wcout <<    L"π右侧遇（" << endl; exit(3);                 }             }             else {                 for (i = 0; (pf = fname[i]) != NULL; i++)                     if (!strnicmp(pp, pf, strlen(pf))) break;                 if (pf != NULL) {                     op[iop++] = 07 + i;                     pp += strlen(pf);                 }                 else {                     wcout <<    L"陌生函数名" << endl; exit(4);                 }             }         }         else if (c == '+' || c == '-' || c == '*' || c == '/' || c == '%' || c == '^') {             char cc;             if (last != DIGIT) {                 wcout <<    L"运算符粘连" << endl; exit(5);             }             pp++;             if (c == '+' || c == '-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist - 1] += ST[ist]; break;                     case '-':  ST[ist - 1] -= ST[ist]; break;                     case '*':  ST[ist - 1] *= ST[ist]; break;                     case '/':  ST[ist - 1] /= ST[ist]; break;                     case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;                     case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;                     }                 } while (iop);                 op[iop++] = c;             }             else if (c == '*' || c == '/' || c == '%') {             operate:        cc = op[iop - 1];                 if (cc == '+' || cc == '-') {                     op[iop++] = c;                 }                 else {                     --ist;                     op[iop - 1] = c;                     switch (cc) {                     case '*':  ST[ist - 1] *= ST[ist]; break;                     case '/':  ST[ist - 1] /= ST[ist]; break;                     case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;                     case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;                     }                 }             }             else {                 cc = op[iop - 1];                 if (cc == '^') {                     wcout <<    L"乘幂符连用" << endl; exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         }         else {             if (last == DIGIT) {                 wcout <<    L"两数字粘连" << endl; exit(7);             }             if (pp[0] == '0' && (pp[1] == 'x' || pp[1] == 'X')) {                 sscanf(pp + 2, "%I64x%n", &i64, &n);                 rexp = pp + 2 + n;                 ST[ist++] = (double)i64;             }             else ST[ist++] = strtod(pp, &rexp);             ST[ist - 1] = fun(ST[ist - 1], op, &iop);             if (pp == rexp) {                 wcout <<    L"非法字符" << endl; exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '(' || isalpha(*pp)) {                 op[iop++] = '*';                 last = !DIGIT;                 c = op[--iop];                 goto operate;             }         }     }     *addr = pp;     if (iop >= ist) {         wcout <<    L"表达式有误" << endl; exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist - 1] += ST[ist]; break;         case '-':  ST[ist - 1] -= ST[ist]; break;         case '*':  ST[ist - 1] *= ST[ist]; break;         case '/':  ST[ist - 1] /= ST[ist]; break;         case '%':  ST[ist - 1] = fmod(ST[ist - 1], ST[ist]); break;         case '^':  ST[ist - 1] = pow(ST[ist - 1], ST[ist]); break;         }     }     return ST[0]; } int main(int argc, char **argv) {     int a;      wcout.imbue(locale("chs"));     if (argc<2) {         //if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代码页         wcout <<    L"计算函数表达式的值。" << endl << L"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs" << endl;         while (1) {             wcout <<    L"请输入表达式：";             fgets(s,16384,stdin);             if ('\n' == s[strlen(s)-1]) s[strlen(s) - 1] = 0;             if (s[0] == 0) break;//             cout << s << "=";             cout << setprecision(15) << calc(s, &endss) << endl;         }     }     else if (argc == 2 && 0 == strcmp(argv[1], "/?")) {         //if (GetConsoleOutputCP() != 936) system("chcp 936>NUL");//中文代码页         wcout <<    L"计算由≥1个命令行参数给出的函数表达式的值。\n"             "最后一个参数是.0～.15表示将计算结果保留小数0～15位\n"             "最后一个参数是x表示将计算结果以16进制正整数格式输出\n"             "支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round,sign,abs\n"             "16进制整数以0x或0X开头\n";     }     else {         strncpy(s, argv[1], MAXLEN - 1); s[MAXLEN - 1] = 0;         if (argc>2) {             for (a = 2; a<argc - 1; a++) strncat(s, argv[a], MAXLEN - 1);//将空格间隔的各参数连接到s             if (1 == sscanf(argv[a], ".%d", &pcs) && 0 <= pcs && pcs <= 15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n", pcs, calc(s, &endss));             }             else if (argv[a][0] == 'x' || argv[a][0] == 'X') {//最后一个参数是x表示将计算结果以16进制正整数格式输出                 printf("0x%016I64x\n", (__int64)calc(s, &endss));             }             else {                 strncat(s, argv[a], MAXLEN - 1);                 printf("%.15lg\n", calc(s, &endss));             }         }         else {             printf("%.15lg\n", calc(s, &endss));         }     }     return 0; }

除法运算注意除数不能为0

挺好的，厉害。。


Question: 求助

for example  int isPrimeNum(int num) { //判断是否是质数，是返回1，不是返回0     int i;     if (num<2) return 0;     else if (num==2) return 1;     else if (num%2==0) return 0;          for(i=3; i<=num/2; i++) {         if (num%i==0) return 0;     }     return 1; }  int main( ) {     int n, i;     scanf("%d", &n);     if (n<2) return 1;     if (isPrimeNum(n)) { //         printf("%d本身是质数，没有质因子。", n);         return 0;     }     while (!isPrimeNum(n)) { //如果不是质数则一直循环         for(i=2;;i++) {             if (n%i==0) {                 printf("%d ", i);                 n /= i;                 break;             }         }     }     printf("%d", n);     return 0; }

这类动手题，最好自己写。有问题再问，效果比较好。 Show一个，仅供参考： #include <stdio.h>  void func(int n) { 	int i, j, flag; 	 	for(i = 2; i <= n; i++) 	{ 		flag = 1; 		 		for(j = 2; j <= i / 2; j++) 		{ 			if(n % j == 0) 			{ 				flag = 0; 				break; 			} 		} 		 		if(flag == 1 && n % i == 0) 		{ 			printf("%d\t", i); 			func(n / i); 			break; 		} 	} }  int main(void) { 	int n; 	scanf("%d", &n); 	 	func(n); 	printf("\n"); 	 	return 0; }


Question: 关于C语言内存的一个问题

strlen计算依据是判断字符串出现第一个0的位置，  i 是整型32位，char 是8位，赋值时会把整型的高24位舍弃，取第八位，负数用补码表示，-1是0xfffffffff.-2是0xfffffffe,依次到了循环第255次时，低8位正好是00，所以strlen为255

strlen是寻找第一个值为0的元素的下标。


Question: 教务管理系统编写

引用 1 楼 自信男孩的回复:先总结一下需要那些功能，然后设计一下整个架构，以及把功能细化成一个个的函数～ 准备从班级信息管理，教师信息管理，学生信息管理，课程信息管理，成绩信息管理这几个方向写，

先总结一下需要那些功能，然后设计一下整个架构，以及把功能细化成一个个的函数～


Question: C语言

两种方法，供参考：#include <stdio.h> #include <math.h>  bool isPerSqr(int num);//方法1 bool isSqr(int n);//方法2  int main(int argc, char* argv[]) {     int n;     scanf("%d",&n);     if(n < 101 || n > 999) return 1;      for(int i=101;i<=n;i++){         if(isPerSqr(i))             printf("[F1].%-4d ",i);         if(isSqr(i))             printf("[F2].%-4d \n",i);     }     system("pause");     return 0; }  //方法一:不使用sqrt bool isPerSqr(int num) {         int n=num;         for(int i=1; n>0; i+=2){             n -= i;         }         if(n == 0){            int a = num%10;            int b = num/10%10;            int c = num/100;            if(a==b || a==c || b==c) return 1;         }       return 0; }  //方法二:使用sqrt。 bool isSqr(int n) {       int d = (int)(sqrt(n) + 0.5);  //四舍五入求整       if(n == d*d){            int a = n%10;            int b = n/10%10;            int c = n/100;            if(a==b || a==c || b==c) return 1;         }       return 0; }

仅供参考：#include <stdio.h>  int func(int n) { 	int i, r, a, b, c; 	 	r = 0; 	a = n / 100; 	b = n % 100 / 10; 	c = n % 10; 	 	if(a == b || b == c || c == a) 	{ 		for(i = 10; i <= n/2; i++) 		{ 			if(i * i == n) 			{ 				r = 1; 				break; 			} 		} 	} 	 	return r; }  int main(void) { 	int n, i; 	 	scanf("%d", &n); 	 	if(n < 101 || n > 999) 	{ 		printf("输出有误\n"); 		return 1; 	} 	 	for(i = 101; i <= n; i++) 	{ 		if(func(i) == 1) printf("%d\t", i); 	}  	return 0; }

建议自己先试试写吧～


Question: 求解

代码是这个： int main(int a,char ** str) { 	int x=2,y=12,z=6; 	while(x!=y) 	{ 	  x++;z++;y--; 	} 	printf("Q1:z=%d\n----------\n",z);  	x=2;y=12;z=6; 	while(x=y) 	{ 	  printf("x=%d y=%d z=%d\n",x,y,z); 	  x++;z++;y--; 	}  	printf("Q2:z=%d\n",z);  }

Q1:z=11 ---------- x=12 y=12 z=6 x=11 y=11 z=7 x=10 y=10 z=8 x=9 y=9 z=9 x=8 y=8 z=10 x=7 y=7 z=11 x=6 y=6 z=12 x=5 y=5 z=13 x=4 y=4 z=14 x=3 y=3 z=15 x=2 y=2 z=16 x=1 y=1 z=17 Q2:z=18

int main(int a,char ** str) { 	int x=2,y=12,z=6; 	while(x!=y) 	{ 	  x++;z++;y--; 	} 	printf("z=%d\n",z);  	x=2;y=12;z=6; 	while(x=y) 	{ 	  x++;z++;y--; 	} 	printf("z=%d\n",z);  }   结果：

一个等号是赋值，执行到得0为止。

因为判断的是x = y;表达式，这个表达式为假时退出循环，而假即为0，就是y=0时就是循环的退出条件。所以是y=12循环12次，即z += 12;即18  注意x = y这里是赋值，最终y决定while循环退出～


引用 7 楼 Intel0011 的回复:1、目前使用4个字节来编码字符足以，Unicode的总量约在110万个字符，现在使用的也就20万左右（不记得在哪看过，不知对否），常用的用两字节存储，不常用的用4字节 2、如你所说，VC10编译器，wchar_t的编码方式是UTF-16LE，GCC下没测试 3、gcc -finput-charset=GBK -fexec-charset=GBK XXX.c  半个月了都，我总算是搞明白了，我把成果跟你说下吧，如果你知道的话，就顺便指个错吧，否则就当查漏补缺吧 关于chs那个，我通过修改系统的设置，然后再查看当前环境名称就得到了，中文简体是Chinese (Simplified)_China.936，语言部分简写可以简写chs、chi等，繁体是Chinese (Traditional)，可简写cht  gcc参数那个，gcc的默认参数（Windows）应该是代码文件-finput-charset=UTF-8，窄字符串-fexec-charset=UTF-8，宽字符串-fwide-exec-charset=UTF16LE，标注的代码文件的编码和窄字符串的编码相同，所以窄字符串没有转码，宽字符串则从UTF-8转到UTF-16LE，但是实际写代码用的GBK（dev），所以汉字的值在UTF-8里就成了错误值，gcc停止编译，-finput-charset=GBK让告诉gcc代码是GBK，于是gcc窄宽字符串分别从GBK->UTF-8、GBK->UTF-16LE。  然后就是printf等函数，会根据控制台的编码来转码，但是需要知道源码和目标编码，它默认的源码是ASCII，超出ASCII的部分应该是无法或没有转码，因此窄字符串的输出是直接给原值 system("chcp 54936"); char str[10]={ 0x81, 0x39, 0xEF, 0x31 }; printf("%s", str ); 这个也没经过转码，该GB18030的编码给了用GB18030的控制台，于是正确显示 而平时控制台的编码是GBK，所以窄字符串从GBK转到UTF-8后，用不会转换的printf输出，然后就乱码了，这时system("chcp 65001")调到一致的UTF-8就可以避免乱码  如果是让printf等函数正常跟随控制台转码，就用setlocale设置，它会设置窄字符串的编码和宽字符串的编码（源），Windows上setlocale一般设不了UTF-8，如果设GBK，就表示printf要将作为源的GBK窄字符串转码到控制台的目标编码，以及UTF-16LE的宽字符串转码到控制台，之前经gcc转码，宽字符串已经是UTF-16LE，但窄字符串是UTF-8，所以用-fexec-charset=GBK让它再转码到GBK，printf函数就能正常转码了，这时修改控制台编码也不会乱码了（除非控制台的编码没有该字符）  之前查好久楞是没怎么明白setlocale的意思，现在想来应该是指示exe中字符串的编码，但表面上设置的是窄编码，实际还隐含设置了宽编码，以及printf输出还有转码功能，没想到这些

引用 7 楼 Intel0011 的回复:1、目前使用4个字节来编码字符足以，Unicode的总量约在110万个字符，现在使用的也就20万左右（不记得在哪看过，不知对否），常用的用两字节存储，不常用的用4字节 2、如你所说，VC10编译器，wchar_t的编码方式是UTF-16LE，GCC下没测试 3、gcc -finput-charset=GBK -fexec-charset=GBK XXX.c  又遇到了一些问题你看看了解吗  一个比较简单的问题是，你知道setlocale的"chs"是哪来的吗？微软官网给的是zh_CN，没看到chs  关于gcc -finput-charset=GBK的这个一直没想通，网上说gcc默认UTF-8的代码，但是我GBK的代码文件依然正常编译输出，我猜测是它没有处理，直接把这些字节值编译了，函数最后把这些字节值给了控制台，控制台根据得到的字节值正确显示。而宽字符串L字面量，需要gcc编译时转换为UTF-16LE（发现是编译到汇编码这一步翻译的），这时我用-finput-charset=GBK 告诉它代码是GBK的，于是他正确转换了，但问题也来了，原本的窄字符串由于这个参数输出变成乱码了，显然gcc处理了这个字符串，查看汇编码，它转成了UTF-8，会什么会这样？？之前明明没处理的。还是说，正因为知道了都是GBK，所以它要转换？ -fexec-charset=GBK这个我应该理解了，它应该是又把UTF-8转成了GBK，然后程序给控制台GBK值，于是控制台正确显示。  如果按照前面的理解，那setlocale是不是就成了设置最终目标转码方案的了（-fexec-charset生成到exe的，setlocale指定exe到控制台的编码）？毕竟窄字符串原样给控制台，而宽字符串字面量先从参数告知的GBK转为UTF-16，后又从UTF-16转为setlocale设置的GBK，发给控制台，于是正确显示，但问题也来了，既然告知了代码的编码，以及目标的编码，为啥普通字符串却乱码了？是我对setlocale的理解有误吗？  我用system("chcp 54936") 设置控制台显示编码为GB18030，setlocale( LC_ALL, "zh_CN.54936" ) 也设置了GB18030，-fexec-charset=GB18030参数也指定转换目标，但是L宽字符串没有显示出来。此时我用指定字节的方式指定一个GB18030的字符输出： char str[10]={ 0x81, 0x39, 0xEF, 0x31 }; printf("%s", str ); 能正确输出该汉字 然后修改setlocale( LC_ALL, "chs" ) ，该汉字乱码了，但是宽字符串却输出了 这又是一个疑惑的地方，"chs" 按理说是Chinese Simplified，不应该等同于"zh_CN.936"吗？可是设置setlocale( LC_ALL, "zh_CN.936" ) ，却依然像之前那样，该汉字正确输出，宽字符串无输出  不知道是哪里理解错了 代码的编码——gcc转换——exe里的字节值——函数根据环境的输出——在控制台上的显示

引用 7 楼 Intel0011 的回复:1、目前使用4个字节来编码字符足以，Unicode的总量约在110万个字符，现在使用的也就20万左右（不记得在哪看过，不知对否），常用的用两字节存储，不常用的用4字节 2、如你所说，VC10编译器，wchar_t的编码方式是UTF-16LE，GCC下没测试 3、gcc -finput-charset=GBK -fexec-charset=GBK XXX.c  感谢！感谢！

引用 6 楼 六道佩恩 的回复:谢谢你回答这么多 不过看了后我反而有些新的问题了  UTF-16这个编码方式是不是只能保存一百万左右的字符量？以后超出是不是还得用6字节？这个编码方式我感觉还是多字节的那一套，前导字在某个范围时，联合第二个字一起作为一个UNICODE字符，它为什么不将第二个字的使用范围扩大？这么做是不是有什么考量？比如容错？  这句话是不是有问题：“VC10编译器，wchar_t的编码方式是UTF-16BE，而在GCC下是UTF-32BE” Windows上不都是小端序LE吗？而且这个GCC是不是也要看平台？比如Windows平台的GCC测出的是2字节。  网上看到这样一句话：UTF-32编码被提出来了，它的编码值与UCS-4相同，只不过其编码空间被限定在了0~0x10FFFF之间 意思是UTF-32也只保存百万左右的字符数？超过百万也要变长？  我GCC编码宽字符串遇到一个问题，-finput-charset=GBK可以让宽字符串被正确编译和输出，但是普通的字符串却乱码了，你知道是什么原因吗？当前的编写环境是GBK（dev下），setlocale是setlocale( LC_ALL, "chs"); 1、目前使用4个字节来编码字符足以，Unicode的总量约在110万个字符，现在使用的也就20万左右（不记得在哪看过，不知对否），常用的用两字节存储，不常用的用4字节 2、如你所说，VC10编译器，wchar_t的编码方式是UTF-16LE，GCC下没测试 3、gcc -finput-charset=GBK -fexec-charset=GBK XXX.c

引用 5 楼 Intel0011 的回复:首先，UTF-16并不是固定2字节，UCS-2是固定2字节 Windows平台下默认的Unicode编码为Little Endian的UTF-16 C语言中的wchar_t类型的宽度取决于C实现，在有的平台上它是16位的，而在另一些平台上它是32位的，所以，C11引入了两种更加明确的类型：char16_t和char32_t。 它们是在头文件<uchar.h>中定义的，它们都是无符号整数类型，前者的宽度保证是16个比特，后者的宽度保证是32个比特。 因此，宽字符既可以用wchar_t类型表示，也可以用char16_t或char32_t类型表示。 如果宽字符是用wchar_t类型表示的，则它的编码方式取决于C实现； 如果宽字符是用char16_t类型表示的，且C实现预定义了值为1的宏__STD_UTF_16__，则宽字符的编码方式是UTF-16，如果未定义这个宏，则宽字符的实际编码方式取决于C实现。 如果宽字符是用char32_t类型表示的，且C实现预定义了值为1的宏__STD_UTF_32__，则宽字符的编码方式是UTF-32，如果未定义这个宏，则宽字符的实际编码方式取决于C实现。 VC10编译器，wchar_t的编码方式是UTF-16BE，而在GCC下是UTF-32BE。 wchar_t的目的是编码并存储所有字符集，编码方式和存储空间大小和语言无关，只和编译器有关，因此说wchar_t的编码方式是Unicode是错的。  1990年就公布了第一套编码方法UCS-2，使用2个字节表示已经有码点的字符。 (那个时候只有一个平面，就是基本平面，所以2个字节就够用了) 但俩个字节并不足以正真地"一统江湖"(a fixed-width 2-byte encoding could not encode enough characters to be truly universal)， 于是UTF-16诞生了，与UCS-2一样，它使用两个字节为全世界最常用的63K字符编码，不同的是，它使用4个字节对不常用的字符进行编码。UTF-16属于变长编码。  UTF-16编码迟至1996年7月才公布，明确宣布是UCS-2的超集，即基本平面字符沿用UCS-2编码，辅助平面字符定义了4个字节的表示方法。 两者的关系简单说，就是UTF-16取代了UCS-2，或者说UCS-2整合进了UTF-16。所以，现在只有UTF-16，没有UCS-2。  UTF-16 UFT-16比较奇葩，它使用2个或者4个字节来存储。 BMP平面(也就是前面说的基本多文种平面)中的每一个码点都直接与一个UTF-16的码元一一映射。 由于BMP几乎包括了所有常见字符，UTF-16一般需要UTF-32大约一半的空间。至于其它平面里很少使用的码点都是用两个16位的码元来编码的。  对于Unicode编号范围在0~FFFF之间的字符，UTF-16使用两个字节存储，并且直接存储Unicode编号，不用进行编码转换，这跟UTF-32非常类似。 对于Unicode编号范围在10000~10FFFF之间的字符，UTF-16使用四个字节存储， 具体来说就是：将字符编号的所有比特位分成两部分，较高的一些比特位用一个值介于D800~DBFF之间的双字节存储， 较低的一些比特位(剩下的比特位)用一个值介于DC00~DFFF之间的双字节存储。 如果你不理解什么意思，请看下面的表格：  Unicode 编号范围(十六进制)      具体的Unicode编号(二进制)    UTF-16编码                                                 编码后的字节数 0000 0000 ~ 0000 FFFF	         xxxxxxxx xxxxxxxx	               xxxxxxxx xxxxxxxx	                                     2 0001 0000 ~ 0010 FFFF	         yyyy yyyy yyxx xxxx xxxx      110110yy yyyyyyyy 110111xx xxxxxxxx 	 4 位于D800~0xDBFF之间的Unicode编码是特别为四字节的UTF-16编码预留的，所以不应该在这个范围内指定任何字符。 如果你真的去查看Unicode字符集，会发现这个区间内确实没有收录任何字符。 UTF-16要求在制定Unicode字符集时必须考虑到编码问题，所以真正的Unicode字符集也不是随意编排字符的。  UTF-16并不是一个完美的选择，它存在几个方面的问题： 1. UTF-16能表示的字符数有6万多，看起来很多，但是实际上目前Unicode5.0收录的字符已经达到99024个字符，早已超过UTF-16的存储范围；     这直接导致UTF-16地位颇为尴尬——如果谁还在想着只要使用UTF-16就可以高枕无忧的话，恐怕要失望了。---> 这里实际上说的是UCS-2 2. UTF-16存在大小端字节序问题，这个问题在进行信息交换时特别突出——如果字节序未协商好，将导致乱码；     如果协商好，但是双方一个采用大端一个采用小端，则必然有一方要进行大小端转换，性能损失不可避免     (大小端问题其实不像看起来那么简单，有时会涉及硬件、操作系统、上层软件多个层次，可能会进行多次转换) 3. 另外，容错性低有时候也是一大问题——局部的字节错误，特别是丢失或增加可能导致所有后续字符全部错乱，     错乱后要想恢复，可能很简单，也可能会非常困难。(这一点在日常生活里大家感觉似乎无关紧要，但是在很多特殊环境下却是巨大的缺陷)  目前支撑我们继续使用UTF-16的理由主要是考虑到它是双字节的，在计算字符串长度、执行索引操作时速度很快。 当然这些优点UTF-32都具有，但很多人毕竟还是觉得UTF-32太占空间了。  谢谢你回答这么多 不过看了后我反而有些新的问题了  UTF-16这个编码方式是不是只能保存一百万左右的字符量？以后超出是不是还得用6字节？这个编码方式我感觉还是多字节的那一套，前导字在某个范围时，联合第二个字一起作为一个UNICODE字符，它为什么不将第二个字的使用范围扩大？这么做是不是有什么考量？比如容错？  这句话是不是有问题：“VC10编译器，wchar_t的编码方式是UTF-16BE，而在GCC下是UTF-32BE” Windows上不都是小端序LE吗？而且这个GCC是不是也要看平台？比如Windows平台的GCC测出的是2字节。  网上看到这样一句话：UTF-32编码被提出来了，它的编码值与UCS-4相同，只不过其编码空间被限定在了0~0x10FFFF之间 意思是UTF-32也只保存百万左右的字符数？超过百万也要变长？  我GCC编码宽字符串遇到一个问题，-finput-charset=GBK可以让宽字符串被正确编译和输出，但是普通的字符串却乱码了，你知道是什么原因吗？当前的编写环境是GBK（dev下），setlocale是setlocale( LC_ALL, "chs");

在目前的windows语境下，是。

引用 楼主 六道佩恩 的回复:UTF-8、多字节编码都是8位编码，UTF-32又是4字节，固定2字节一个字符的只想到了UTF-16和UCS-2，但UCS-2的字符集又不全，是不是说，C和win32的宽字符是否就是UTF-16？ 首先，UTF-16并不是固定2字节，UCS-2是固定2字节 Windows平台下默认的Unicode编码为Little Endian的UTF-16 C语言中的wchar_t类型的宽度取决于C实现，在有的平台上它是16位的，而在另一些平台上它是32位的，所以，C11引入了两种更加明确的类型：char16_t和char32_t。 它们是在头文件<uchar.h>中定义的，它们都是无符号整数类型，前者的宽度保证是16个比特，后者的宽度保证是32个比特。 因此，宽字符既可以用wchar_t类型表示，也可以用char16_t或char32_t类型表示。 如果宽字符是用wchar_t类型表示的，则它的编码方式取决于C实现； 如果宽字符是用char16_t类型表示的，且C实现预定义了值为1的宏__STD_UTF_16__，则宽字符的编码方式是UTF-16，如果未定义这个宏，则宽字符的实际编码方式取决于C实现。 如果宽字符是用char32_t类型表示的，且C实现预定义了值为1的宏__STD_UTF_32__，则宽字符的编码方式是UTF-32，如果未定义这个宏，则宽字符的实际编码方式取决于C实现。 VC10编译器，wchar_t的编码方式是UTF-16BE，而在GCC下是UTF-32BE。 wchar_t的目的是编码并存储所有字符集，编码方式和存储空间大小和语言无关，只和编译器有关，因此说wchar_t的编码方式是Unicode是错的。  1990年就公布了第一套编码方法UCS-2，使用2个字节表示已经有码点的字符。 (那个时候只有一个平面，就是基本平面，所以2个字节就够用了) 但俩个字节并不足以正真地"一统江湖"(a fixed-width 2-byte encoding could not encode enough characters to be truly universal)， 于是UTF-16诞生了，与UCS-2一样，它使用两个字节为全世界最常用的63K字符编码，不同的是，它使用4个字节对不常用的字符进行编码。UTF-16属于变长编码。  UTF-16编码迟至1996年7月才公布，明确宣布是UCS-2的超集，即基本平面字符沿用UCS-2编码，辅助平面字符定义了4个字节的表示方法。 两者的关系简单说，就是UTF-16取代了UCS-2，或者说UCS-2整合进了UTF-16。所以，现在只有UTF-16，没有UCS-2。  UTF-16 UFT-16比较奇葩，它使用2个或者4个字节来存储。 BMP平面(也就是前面说的基本多文种平面)中的每一个码点都直接与一个UTF-16的码元一一映射。 由于BMP几乎包括了所有常见字符，UTF-16一般需要UTF-32大约一半的空间。至于其它平面里很少使用的码点都是用两个16位的码元来编码的。  对于Unicode编号范围在0~FFFF之间的字符，UTF-16使用两个字节存储，并且直接存储Unicode编号，不用进行编码转换，这跟UTF-32非常类似。 对于Unicode编号范围在10000~10FFFF之间的字符，UTF-16使用四个字节存储， 具体来说就是：将字符编号的所有比特位分成两部分，较高的一些比特位用一个值介于D800~DBFF之间的双字节存储， 较低的一些比特位(剩下的比特位)用一个值介于DC00~DFFF之间的双字节存储。 如果你不理解什么意思，请看下面的表格：  Unicode 编号范围(十六进制)      具体的Unicode编号(二进制)    UTF-16编码                                                 编码后的字节数 0000 0000 ~ 0000 FFFF	         xxxxxxxx xxxxxxxx	               xxxxxxxx xxxxxxxx	                                     2 0001 0000 ~ 0010 FFFF	         yyyy yyyy yyxx xxxx xxxx      110110yy yyyyyyyy 110111xx xxxxxxxx 	 4 位于D800~0xDBFF之间的Unicode编码是特别为四字节的UTF-16编码预留的，所以不应该在这个范围内指定任何字符。 如果你真的去查看Unicode字符集，会发现这个区间内确实没有收录任何字符。 UTF-16要求在制定Unicode字符集时必须考虑到编码问题，所以真正的Unicode字符集也不是随意编排字符的。  UTF-16并不是一个完美的选择，它存在几个方面的问题： 1. UTF-16能表示的字符数有6万多，看起来很多，但是实际上目前Unicode5.0收录的字符已经达到99024个字符，早已超过UTF-16的存储范围；     这直接导致UTF-16地位颇为尴尬——如果谁还在想着只要使用UTF-16就可以高枕无忧的话，恐怕要失望了。---> 这里实际上说的是UCS-2 2. UTF-16存在大小端字节序问题，这个问题在进行信息交换时特别突出——如果字节序未协商好，将导致乱码；     如果协商好，但是双方一个采用大端一个采用小端，则必然有一方要进行大小端转换，性能损失不可避免     (大小端问题其实不像看起来那么简单，有时会涉及硬件、操作系统、上层软件多个层次，可能会进行多次转换) 3. 另外，容错性低有时候也是一大问题——局部的字节错误，特别是丢失或增加可能导致所有后续字符全部错乱，     错乱后要想恢复，可能很简单，也可能会非常困难。(这一点在日常生活里大家感觉似乎无关紧要，但是在很多特殊环境下却是巨大的缺陷)  目前支撑我们继续使用UTF-16的理由主要是考虑到它是双字节的，在计算字符串长度、执行索引操作时速度很快。 当然这些优点UTF-32都具有，但很多人毕竟还是觉得UTF-32太占空间了。

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

C标准不太熟悉 对win32来说 可以认为WCHAR就是指utf16  印象中 实际上它定义的是“至少”两字节的字符 但实际用的时候 涉及到API什么的都是用的utf16  utf32 utf16 utf8也已经都有单独的类型 char8_t char16_t char32_t 你如果怕弄混乱可以明确指定这些类型 但使用API的时候免不了经常跟WCHAR也就是实际上存放utf16的字符串转换来转换去 其实还不如直接都用L""好了

宽字符多宽是系统依赖的，在windows上是UTF-16编码，在Linux/Unix上是UTF-32编码，你输出一下sizeof(wchar_t)就知道了


Question: 小白菜求问，这是哪里错了，哭

引用 5 楼 自信男孩的回复:改一下函数名，long是C语言用于定义变量的特殊字符，不能被用于其他 嗯嗯，谢谢。

改一下函数名，long是C语言用于定义变量的特殊字符，不能被用于其他

懂了懂了，谢谢，

引用 2 楼 qq_52114598 的回复:嗷, 不行吗  不行噢  而且你那个len没有申明

嗷, 不行吗

C语言long是关键字，你用做函数名？？？


Question: 猜数游戏

菜单选择怎么写呢

循环每次先进一个选择函数，然后用户输入1或者2或者字符串什么的你自己写这个函数，接着根据用户输入if判断调用电脑猜的函数还是用户猜的函数

写成两个函数，写个菜单选项，用if-else或switch语句实现


Question: 菜鸟求助

if(arr[i]%2!=0) 改成 if(arr[j]%2!=0)


Question: 萌新求教

求助，有大佬帮忙再看下吗？

改了还是不对，能再看看问题在哪里吗？

感谢各位的指点

#include <stdio.h> int main(int argc, char* argv[]) {     float sum=0,m=1;     int n,i;     printf("请输入项数:");     scanf("%d",&n);     if(n<3) return 1;     for(i=2;i<=n;i++)     {       sum += 1.0/m;       m=3*i-2;     }     printf("%f\n",sum);     system("pause");     return 0; }

引用 6 楼 ABBALILY 的回复:大佬能明示下把循环变量i的定义放哪吗？把for去掉直接写int i=1;i<=n;i++吗？ int i; for (i = 1; i <= n; i++) 这样就好，其实有些编译器支持你这种写法的，但是dev好像就不行

把循环变量的i定义放在前面，因为你的编译版本不支持在循环体里定义for (int i=0;这种形式

修改如下，供参考：#include <stdio.h> int main(int argc, char* argv[]) {     float sum=0,m=1;     int n;     printf("请输入项数:");     scanf("%d",&n);     if(n<3) return 1;     for(int i=2;i<=n;i++)     {       sum += 1.0/m;       m=3*i-2;     }     printf("%f\n",sum);     system("pause");     return 0; }

m+=3改成 m=3*i-2


Question: 字符数组输出问题

因为b+1不等于b[1]，*(b+1)等价b[1] b+1是值下表1的元素的地址。

b指向字符数组首地址即&b[0],b+1指向第2个字符的地址，即r,而%s输出r为首地址的一串字符。楼上的回答是正解。

请参考《C++中printf()函数的用法10-2》 希望能够帮到您！

因为你用的%s输出的，改成%c输出就是r了


Question: 菜鸟遇难，寻找大佬！

引用 2 楼 qzjhjxj的回复:供参考：#include <stdio.h> #include <windows.h>  #define map_mode "■" #define width  30 #define height 15  void creatmap (); void Pos(int x,int y);  int main(int argc, char* argv[]) {     system("mode con cols=100 lines=30");//设置控制台屏幕的大小     creatmap ();     system("pause");     return 0; }  void Pos(int x,int y) {     COORD pos = {x,y};     HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleCursorPosition(hOut,pos); }  void creatmap() {     for(int i=0;i<=width;i+=2){         Pos(i,0);         printf(map_mode);         Pos(i,height);         printf(map_mode);     }     for(int i=0;i<height;i++){         Pos(0,i);         printf(map_mode);         Pos(width,i);         printf(map_mode);     } } respect

引用 1 楼 user-2的回复:需要这么复杂吗？二维数组不就可以了吗? 谢谢，你的建议！

需要这么复杂吗？二维数组不就可以了吗?


Question: 大佬们，我没看明白这个函数的递归是咋会事。

“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

顺便说一下，字写得很好

没仔细看，好象是菲波那契数列？ 这种递归是必须这样的写法，不管如何写都达不到你想象的完美语法规定的

就是递归求阶乘 另外，这是显示的手写体，不是真的手写


Question: 无法返回表头

#include <stdio.h> #include <stdlib.h> #include <string.h> struct per    /*定义结构体类型*/ {     long int num;     char name[20];     char tel[12];     char mail[30];     char add[50];      long int mnum;     char id[18];     struct per *next; }; struct per *jianli();                       /*声明建立通信录函数*/ void shuchu(struct per *head);              /*声明输出通信录函数*/ struct per *tianjia(struct per *head);      /*声明添加联系人函数*/ struct per *shanchu(struct per *head);      /*声明删除联系人函数*/ struct per *chazhao(struct per *head);      /*声明查找联系人函数*/ struct per *head=NULL; int main() {   /*主函数*/     int select;     printf("\n\t***************** 欢迎进入个人通信录管理系统 ******************\n");     /*主控菜单*/     printf("\n\t ----------------->>   1: 建 立 通 信 录   <<-----------------");     printf("\n\t ----------------->>   2: 输 出 通 信 录   <<-----------------");     printf("\n\t ----------------->>   3: 添 加 联 系 人   <<-----------------");     printf("\n\t ----------------->>   4: 删 除 联 系 人   <<-----------------");     printf("\n\t ----------------->>   5: 查 找 联 系 人   <<-----------------");     printf("\n\t ----------------->>   0: 退 出 系 统      <<-----------------\n");      printf("\n\t***************************************************************\n");     printf("\n\t请选择（0---5）：");fflush(stdout);     rewind(stdin);scanf("%d",&select);     printf("\n");     switch(select) {         /*对应模块函数*/     case 1:         head=jianli();         break;     case 2:         shuchu(head);         break;     case 3:         head=tianjia(head);         break;     case 4:         head=shanchu(head);         break;     case 5:         head=chazhao(head);         break;     case 0:         break;     default:         printf("您的输入有误，请重新输入（0---5）：\n");      }     while(select!=0); }   /*建立通信录函数*/ struct per *jianli() {      /*创建链表，并返回表头指针*/     struct per *head;       /*表头*/     struct per *p1;         /*新建节点*/     struct per *p2;         /*表尾节点*/     long int num1;     char name1[20];     char tel1[12];     char mail1[30];     char add1[50];     long int mnum1;     char id1[18];     head=NULL;              /*无任何节点，表头指向空*/      while(1) {         printf("请输入联系人编号、姓名、电话、身份证号、邮箱、地址及邮编（用空格分隔，用0结束）\n");         rewind(stdin);scanf("%d",&num1);         if (num1==0) break;/*假设num=0表示输入结束*/         scanf(" %s %s %s %s %s %d",name1,tel1,id1,mail1,add1,&mnum1);     /*读入第一个联系人的信息*/         p1=(struct per *)malloc(sizeof(struct per));      /*新建一个节点*/         p1->num=num1;                                     /*存入联系人的信息*/         strcpy(p1->name,name1);         strcpy(p1->tel,tel1);         strcpy(p1->id,id1);         strcpy(p1->mail,mail1);         strcpy(p1->add,add1);         p1->mnum=mnum1;         p1->next=NULL;                /*将next域置为空，表示尾节点*/         if(head==NULL)             head=p1;                  /*第一个新建节点是表头*/         else             p2->next=p1;              /*原表尾的下一个节点是新节点*/         p2=p1;                        /*新建节点成为表尾*/     }     return head;              /*返回表头指针*/ } /*输出通信录函数*/ void shuchu(struct per *head) {     struct per *p;     int n=0;                           /*统计节点数，即联系人数*/     printf("\n\t*******************通*******信*******录*******************\n");     printf("\n%-5s%-12s%-12s%-19s%-17s%-9s%-7s\n","编号","姓名","电话号码","身份证号","邮箱","地址","邮编");     if(head!=NULL) {         for(p=head; p!=NULL; p=p->next) {     /*如果到达尾节点退出循环，否则继续*/             printf("%-5d%-12s%-12s%-19s%-17s%-9s%-7d\n",p->num,p->name,p->tel,p->id,p->mail,p->add,p->mnum);             n++;         }         printf("联系人总数：%d\n\n",n);     } else         printf("\n对不起，该通信录中没有任何联系人!\n\n"); } /*添加联系人函数*/ struct per*tianjia(struct per*head) {     struct per*p;     struct per*p1;     struct per*p2;     p2=head;     p=(struct per*)malloc(sizeof(struct per));              /*新建节点p*/     printf("请输入要添加的联系人的编号、姓名、电话、身份证号、邮箱、地址、邮编:\n");     rewind(stdin);scanf("%d %s %s %s %s %s %d",&p->num,p->name,p->tel,p->id,p->mail,p->add,&p->mnum);     printf("成功添加联系人%s !\n",p->name);     if(head==NULL)  {         head=p;         p->next=NULL;     }  else {         while((p->num>p2->num)&&(p2->next!=NULL)) {   /*查找添加位置*/             p1=p2;             p2=p2->next;         }         if(p->num<=p2->num) {  /*从小到大排列，添加至表内*/             if(p2==head) {                 head=p;                 p->next=p2;             } else    {                 p1->next=p;                 p->next=p2;             }         } else {               /*添加至表尾*/             p2->next=p;             p->next=NULL;         }     }     return(head); } /*删除联系人函数*/ struct per *shanchu(struct per *head) {     struct per *p2;     struct per *p1;     int num1,n;     printf("请输入要删除的联系人编号：");fflush(stdout);     /*根据输入信息查找联系人*/     rewind(stdin);scanf("%d",&num1);     if(head==NULL)  {         printf("\n通讯录为空\n\n");         return(head);     }     p2=head;     while(num1 != p2-> num && p2->next !=NULL)  {         p1=p2;         p2=p2->next;     }     if(num1==p2->num)  {         printf("\n成功查询到该联系人！\n");         printf("\n%-5s%-12s%-12s%-19s%-17s%-9s%-7s\n","编号","姓名","电话号码","身份证号","邮箱","地址","邮编");         printf("%-5d%-12s%-12s%-19s%-17s%-9s%-7d",p2->num,p2->name,p2->tel,p2->id,p2->mail,p2->add,p2->mnum);         printf("\n确定删除？  1确定   0取消 ");fflush(stdout);         rewind(stdin);scanf("%d",&n);         switch(n)   {         case 1:   {                 if(p2==head)                     head=p2->next;                 else                     p1->next=p2->next;                 free(p2);                 printf("\n成功删除编号为%ld的联系人！\n\n",num1);             }             break;         case 0:             printf("\n您取消了删除任务，联系人未被删除！\n");             break;         }     } else         printf("\n对不起，该通信录中没有任何联系人!\n\n");     return(head); } /*查找函数*/ struct per *chazhao(struct per *head) {     struct per*p2;     char id1[20];     printf(" 请输入要查找的联系人身份证号：\n");     rewind(stdin);scanf("%s",id1);     if(head==NULL)  {         printf("\n通讯录为空\n\n");         return(head);     }     p2=head;     while (p2)  {         if(strcmp(p2->id,id1)==0) {             printf("\n成功查询到该联系人！\n");             printf("\n%-5s%-12s%-12s%-19s%-17s%-9s%-7s\n","编号","姓名","电话号码","身份证号","邮箱","地址","邮编");             printf("%-5d%-12s%-12s%-19s%-17s%-9s%-7d\n",p2->num,p2->name,p2->tel,p2->id,                    p2->mail,p2->add,p2->mnum);             break;         }         p2=p2->next;     }     if(!p2)         printf("\n对不起，该通信录没有该联系人!\n\n");     return (head); }

dddddddddd


Question: C语言解析二进制文件，去掉标签位，读取标签后两位数值，写出文件

引用 6 楼 ctrigger的回复:[quote=引用 5 楼 赵4老师 的回复:]给钱就有。 哈哈，这个没必要吧。 不怕麻烦，自己慢慢折腾解包就行。 实在不行，可以参考TCP/IP解包源码。[/quote] 可以帮忙写下代码吗？有偿

引用 5 楼 赵4老师 的回复:给钱就有。 哈哈，这个没必要吧。 不怕麻烦，自己慢慢折腾解包就行。 实在不行，可以参考TCP/IP解包源码。

给钱就有。

引用 3 楼 我是宁野野 的回复:通讯协议应该是这样的：头+数据长度+数据正文+校验 例如：AA 44 05 01 02 03 04 05 EA 这里我假设的一条数据，协议如下： 数据头：AA 44 数据长度： 05 数据正文： 01 02 03 04 05 校验：EA 现在我有一个这样的txt文件，想把里面的数据正文解析出来，请问有代码 吗？  根据协议格式，定义一个结构体，对号入座，接下来就是memcpy了。

#include <stdio.h> #include <string.h> int main() {     unsigned char s[24]={         0xAA,0xAA,0x04,0x80,0x02,0x12,0x34,0x99,         0xAA,0xAA,0x04,0x80,0x02,0x56,0x78,0x99,         0xAA,0xAA,0x04,0x80,0x02,0x12,0x34,0x99,     };     unsigned char m[5]={0xAA,0xAA,0x04,0x80,0x02};     unsigned char d[6];     unsigned char *ps,*pd;      ps=s;     pd=d;     while (1) {         if (0==memcmp(ps,m,5)) {             pd[0]=ps[5];             pd[1]=ps[6];             ps+=8;             pd+=2;             if (ps-s>=24 || pd-d>=6) break;         } else break;     }     for (int i=0;i<6;i++) printf("0x%02X ",d[i]);     return 0; } //0x12 0x34 0x56 0x78 0x12 0x34

真懒。这都是固定模式，按照协议直接对号入座就行。。


Question: 求助

这问题太难了，什么语言都不好使，当然包括C语言。 目前人类才找到50几个Perfect number。 如果你能找到60个，菲尔兹奖就有希望了。。。


Question: 求助

引用 1 楼 chxchxkkk的回复:供参考  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(void) {     char buff[80];       memset(buff, 0, 80);          while (1)     {         int i = 0;         gets_s(buff, 80);          if (strcmp(buff, "End of file") == 0)             break;          while (buff[i] != '\0')         {             if (buff[i] >= 'a'&&buff[i] <= 'z')             {                 buff[i] = buff[i] - 32;             }             i++;         }         printf("%s\n", buff);               }          system("pause");     return 0; }  如何实现多行输入，有点看不懂

要答案的话哪里都可以搜到吧

网上有很多例子呢，整个不难吧。


Question: 两道作业 我做出来了 但是老师要求用指针解决

指针相当于目录 ，如果说abc三个地点进行遍历，下标是a-b，a-b-c，指针就是a-b，b-c


Question: 计算机大一期末c语言课程设计题目

先定义一个教师的结构体，包括工号、姓名、工资等信息。 然后用结构体数组或链表完成上述各模块。

我用devc＋＋写的

把每个小块都写成一个函数，有意思，我也试着写一下

先定义一个二维数组，查找，输出所有，


Question: 写两个函数，分别求两个整数的最大公约数和最小公倍数，用主函数调用这两个函数，并输出结果。

非常感谢 我试着按这个思路来

我也没完全理解题意，不一定符合要求。仅供参考： #include <stdio.h>  void gcd(int *a, int *b, int *r) { 	if(*b == 0) *r = *a; 	else 	{ 		int t = *a; 		*a = *b; 		*b = t % *b; 		gcd(a, b, r); 	} }  int main(void) { 	/* a，b是输入值，r是最大公约数 */ 	int a, b, m, n, r; 	 	a = 12; 	b = 16; 	 	m = a; 	n = b; 	gcd(&m, &n, &r); 	 	printf("%d\t%d\n", r, a*b/r);  	return 0; }


Question: 求解，不会做

//输入一个字符串，字符串里全是小写字母比如 char  a[20]="bcadfgih" //对其中的小写字母进行从小到大排序（a最小z最大） 以上面为例 a[20]变为"abcdfghi" //（使用排序算法） //再输入一一个字符 比如char b='e'，插入拍完序的a[20]中，插入规则是插入比b小和比b大的字符中， //比如上面的 a[20]="abcdefghi" #include <stdio.h> #include <string.h> int main() {     char a[20],b;     int i,j,N;      fgets(a,19,stdin);     N=strlen(a);     if ('\n'==a[N-1]) {a[N-1]=0;N--;}     printf("%s\n",a);      for (i=0;i<N-1;i++) {         for (j=i+1;j<N;j++) {             if (a[i]>a[j]) {                 b=a[i];a[i]=a[j];a[j]=b;             }         }     }     printf("%s\n",a);      rewind(stdin);     b=getchar();     for (i=0;i<N;i++) {         if (b<a[i]) {             for (j=N;j>=i;j--) a[j+1]=a[j];             a[i]=b;             break;         }     }     printf("%s\n",a);      return 0; }

基本实现功能，没有优化。  #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>  #define N 20  //排序 void cSort(char a[], int n) {     int i, j;     char tmp;     for (i = 0; i < n - 1; i++)     {         for (j = 0; j < n - i - 1; j++)         {             if (a[j] > a[j + 1])             {                 tmp = a[j];                 a[j] = a[j + 1];                 a[j + 1] = tmp;             }         }     }     }  //插入 void cInsert(char a[], int n, char b) {     int i, index = 0;     for (i = 0; i < n; i++)     {         if (a[i] > b)         {             index = i;             break;         }                    }      for (i = n; i >= index; i--)     {         a[i] = a[i-1];     }     a[index] = b;    }  int main(void) {     char a[N] = { 0 }, t;     printf("输入一个字符串(小写字母):\n");     scanf("%s", a);     int n = strlen(a);     if (n <= N - 1)     {         cSort(a, n);             }     else     {         printf("字符串越界！\n");         exit(1);     }     printf("排序后字符串：\n%s\n", a);          getchar();      if (n < N - 1)     {         printf("输入要插入的字符：\n");         scanf("%c", &t);         cInsert(a, n, t);     }     else     {         printf("字符串已达上限，不能插入字符。\n");                    }         printf("%s\n", a);      system("pause");     return 0; }

排序和插入操作。不是很难的问题，建议楼主自己先试试，遇到问题再提出来吧


Question: c语言，求指点

引用 2 楼 forever74的回复:BTW： 要养成写代码用标准格式的习惯。 你这样想，我的代码二十块钱一行，花括号不独立占一行那就损失大了。  嘿嘿 刚开始学，还没养成习惯😂

引用 1 楼 自信男孩的回复: #include<stdio.h> typedef struct{     int year, month,day; }Date;  void sum(Date *p) {     int md[]={31,28,31,30,31,30,31,31,30,31,30};     int i,total=0;     for(i=0;i<p->month-1;i++)         total += md[i];     total+=p->day;     //if((p->year%400==0||p->year%4==0&&p->year%100==0)&&p->month>2)     if((p->year%400==0||(p->year%4==0&&p->year%100!=0))&&p->month>2)         total++;     printf("%d",total); } int main() {     Date d ;     Date *p = &d   ;     scanf("%d-%d-%d",&d.year,&d.month,&d.day);     sum(p);      return 0; } 供参考～  楼主没有调用sum函数，因此没有输出  其他问题详见上面的代码 我还以为用Date  d 的时候就调用了，谢谢大佬了


Question: C语言

PPT下半截估计就是说这个的，都特意切掉了还贴啥呀？

const unsigned char fonts[10][5] = {         { 0x3E, 0x51, 0x49, 0x45, 0x3E },   // 0         { 0x00, 0x42, 0x7F, 0x40, 0x00 },   // 1         { 0x42, 0x61, 0x51, 0x49, 0x46 },   // 2         { 0x21, 0x41, 0x45, 0x4B, 0x31 },   // 3         { 0x18, 0x14, 0x12, 0x7F, 0x10 },   // 4         { 0x27, 0x45, 0x45, 0x45, 0x39 },   // 5         { 0x3C, 0x4A, 0x49, 0x49, 0x30 },   // 6         { 0x01, 0x71, 0x09, 0x05, 0x03 },   // 7         { 0x36, 0x49, 0x49, 0x49, 0x36 },   // 8         { 0x06, 0x49, 0x49, 0x29, 0x1E } }; // 9      /* scanf printf */

需求看不全，多贴几张图～


Question: 求助！！！c语言指针

引用 6 楼 weixin_52705034 的回复:[quote=引用 3 楼 forever74的回复:]另外，你的转置函数转了2次，又转回去了。 没，我第二个循环是等于i，只转了一次[/quote] 抱歉，看错了，光盯着3了。

main函数里，最后的输出有问题，for循环变量用的是j，而循环体却用i，此时的i已经是3，所以输出是越界了。输出自然是随机值

引用 3 楼 forever74的回复:另外，你的转置函数转了2次，又转回去了。 没，我第二个循环是等于i，只转了一次

没，我第二个循环是等于i

引用 2 楼 forever74的回复:你输出的时候循环变量j，引用的下标却是i，脱节了。 感谢感谢，确实原来是这么错的

另外，你的转置函数转了2次，又转回去了。

你输出的时候循环变量j，引用的下标却是i，脱节了。

函数，内部，定义实现函数，应该不可以吧


Question: 数组中字符串长度异常

我一般这样形容这种做法： 相当于你偷了一次东西没有被抓到。

数组越界操作是未定义行为，未定义行为是可能没问题。不建议操作越界的数据。

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

用for语句来吧，可能越界了都给你打出来了


Question: 链表求助

感谢你的帮助

r->Next == NLLL; //要用==？ 在循环里直接对L修改（遍历）是否合适？  可以改成如下：  s = L; while (s->Next) {     s = s->Next; }


Question: linux下建立两条长链

引用 1 楼 user-1的回复:一个epoll就解决了么？同时监控读写即可。 其实PThread线程效率貌似挺高的，和epoll基本差不多。。 epoll只是创建长链和监听，数据会在接收后放入队列


Question: 帮忙分析一下一个简单的问题.

引用b = NULL:最后：号错了，是‘；‘号，修改下。

#include<stdio.h> #include<stdlib.h> int main(int argc, char* argv[]) {    //int a[ ] = { 0 };      int a[10] = { 0 };//固定长度的数组及初始化为 0      int m;     scanf("%d", &m);      int *b = new int[m];   //第一种动态长度数组     int *c = (int *)malloc(sizeof(int) * m);//第二种动态长度数组      memset(b,-1,m*sizeof(b));//初始化数组b为 -1      memset(c,0,m*sizeof(c));//初始化数组c为 0      //for (int i = 0; i < m; i++)//用循环初始化数组     //  {     //    b[i]=c[i]=0;     //  }      for (int i = 0; i < m; i++)//当m>10时，a[10]以后显示的就是不确定值,越界了       {         printf("a[%d]=%-15d\tb[%d]=%-15d\tc[%d]=%-15d\n",i,a[i],i,b[i],i,c[i]);       }     system("pause");     delete [] b;   //动态释放     b = NULL:     free (c);     c = NULL;     return 0; }

注释反了。。把 int a[10] = {0} 注释去掉即可。


Question: 求助

把define 的s展开就好了，展开就知道结果是多少和为什么是这个了。  s(a-b-c) ===== a-b-c*a-b-c 因为a-b-c是x，等价替换就可以了。

宏定义只是简单的替换，所以s(a - b - c)等于10 - 6 - 3 * 10 - 6 - 3 = -35


Question: 求解

网上对于这样的代码和需求还是挺多的，建议自己动手查查，测试试试～

供参考：#include <iostream.h> #include <stdio.h> int gys(int x,int y) //辗转相除法 公约数 {     int a;     if(x<y)  //将大的数排在前面     {         a=x;         x=y;         y=a;     }     while(x%y!=0)      {         a=x%y;         x=y;            y=a;       }     return y;  }  int gbs(int x,int y)  //公倍数 {     int result=(x*y)/(gys(x,y));     return result; }  int main(int argc, char* argv[]) {     int x,y;     cout<<"请输入两个正整数：";     cin>>x>>y;        cout<<"最大公约数为:" <<gys(x,y)<<endl;     cout<<"最小公倍数为:" <<gbs(x,y)<<endl;        system("pause");     return 0; }


Question: 一个学习小组有n（n≤50）学生，每个学生有学号和考试成绩2个信息。编写程序实现以下功能：

你可以看看c++的map

供参考，你抄一遍，加深印象：#include <stdio.h> #define M 50 #define N 2 int main(int argc, char* argv[]) {     int stu[M][N];      for(int i=0 ;i<M;i++){        printf("请输入第%d个学生学号和成绩：",i+1);        for(int j=0;j<N;j++){            scanf("%d",&stu[i][j]);        }     }      for(int i=0 ;i<M;i++){        printf("第%d个学生学号和成绩：",i+1);        for(int j=0;j<N;j++){            printf("%5d%c",stu[i][j],((j==1)? '\n':' '));        }     }      int i,temp;     printf("请输入要查询的学号：");     scanf("%d",&temp);     for(i=0;i<M;i++){        if(*stu[i] == temp) break;        continue;     }     if(i==M) printf("无此学生！\n");     else       printf("学号:%d  成绩:%d\n",stu[i][0],stu[i][1]);      system("pause");     return 0; }