Question: C语言中关于getchar()的问题

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

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

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.

因为printf("哈哈哈");改成 printf("哈哈哈\n"); scanf("%d",&y); getchar();//用于接收键盘输入数字y之后的从键盘输入的回车符

只需一个就可以把，getchar()是为了吃掉scanf()留下的换行符啊........

scanf("%d",&y);   后边不跟    //getchar();就会发生段错误.


Question: 求大佬看看，

看来我没读懂题  谢了

第一行输出1组成部分数据 第二行输出2组成部分数据 ... 第九行输出9组成的数据 第十行输出0组成的数据 第十一行输出1组成部分数据 第十二行输出2组成的数据 等等，依次类推，这才是i%10的意思 然后就是按金字塔倒着打印  int main() {     int i, j, n;     scanf(“%d”, &n);     for(int i=n; i>0; i--) {         for(j=0; j<n-i; j++) printf(“ “); //打印空格         for(j=0; j<2*i-1; j++) printf(“%d”, (n-i+1)%10); //打印数据         printf(“\n”); //换行     }     return 0; }


Question: 如何按以下规则批量导出文件名到xls

引用 3 楼 赵4老师 的回复:在Excel中数据、自文本、…… 能不能做到只把这些提取到txt？万分感谢

在Excel中数据、自文本、……

开始、运行、cmd cd /d 你这些文件所在文件夹的全路径比如"d:\dwffiles" dir /b N??_*.dwf >d:\tmp.txt 然后在Excel中导入d:\tmp.txt，指定_.作为列间隔字符

readdir查一下这个函数，可以拿到这些文件所在的目录，然后得到这个目录下的所有文件，得到文件名之后，然后写到xls中即可～

引用 4 楼 稻壳粥的小迷弟 的回复:[quote=引用 3 楼 赵4老师 的回复:]在Excel中数据、自文本、…… 能不能做到只把这些提取到txt？万分感谢 [/quote] 提取到哪里都没问题，都需要打开文件，然后写文件，关闭文件的操作～


Question: ccf显示运行出错

引用 1 楼 自信男孩 的回复:#include<stdio.h> #include <stdlib.h>  int main() {     //int n,i,data=0,j,*a,*p,*q;     //a = (int*) malloc (n * sizeof(int));     //scanf("%d/n",&n);     int *arr, n, cnt = 0;     int i, j;     scanf("%d", &n);     arr = (int*) malloc (n * sizeof(int));     if (!arr)         return -1;      for(i=0; i<n; i++) {         scanf("%d",&arr[i]);     }      for (i = 0; i < n; i++) {         for (j = i+1; j < n; j++) {             if (abs(arr[i] - arr[j]) == 1) {                 //printf("abs(%d - %d) = 1\n", arr[i], arr[j]);                 cnt++;             }         }     }      printf("%d\n", cnt);  #if 0     p = a;     q = p+1;     for(i=0; i<n; i++) {         scanf("%d",&a[i]);     }      for(i=0; i<n; i++) {         for(j=1; j<n-i; j++) {             if(*p-*q==1||*p-*q==-1) {                 data++;                 break;             }             q++;         }         p++;         q=p+1;     }     printf("%d",data); #endif     return 0; } 供参考～  需要注意的是先scanf还是先malloc？scanf中不要有\n 嗯嗯，如果只是把scanf放在malloc后面的话，评测结果是错误，不是运行错误，只有把指针操作去掉后才是满分，这是为什么呢


Question: 求斐波那契数列N项，求助！

感谢！！！！！！！

N<=2时，A没有赋值，所以A是不确定的，要么就在print(“1”)以后return，要么就把print(“1”)改成A=1

#include<stdio.h>  int main(void) {     int N,f1,f2,i,A;     f1=1;     f2=1;     scanf("%d",&N);     if(N<=2) {         printf("1");         return 0;     }     //if(N>2)     //{         for(i=3;i<=N;i++)         {             A=f1+f2;             f1=f2;             f2=A;         }     //}     printf("%d\n",A%2000000003);      return 0; } 供参考～  因为A没有初始化，输入1或2，会执行最后一个printf语句，由于A 是随机值，所以可能出现133；


Question: 丑数判断，输入后没输出，求助！

感谢！感谢！感谢！

为什么我看不到你们的回复？

#include<stdio.h>  const int arr[] = {2, 3, 5, 7};  int ppp(int a) {     //while(k=1)     //     unsigned int i;     while (1) {         for (i = 0; a && i < sizeof(arr)/sizeof(arr[0]);)             if (a % arr[i] == 0) {                 a /= arr[i];                 i = 0;                 continue;             } else {                 i++;             }         break;     }     if (a != 1)         return 0;     else         return 1;  #if 0     int q=0;     int k=1;     while(k==1)     {         if(a%2==0)         {             a=a/2;             continue;         }         if(a%3==0)         {             a=a/3;             continue;         }         if(a%5==0)         {             a=a/5;             continue;         }         if(a%7==0)         {             a=a/7;             continue;         }         k=0;     }     if(a==1)         q=1;      return q; #endif } int main (void) {     int N,i,a,b,s=0;     scanf("%d",&N);     for(i=1;i<=N;i++)     {         scanf("%d",&a);         b=ppp(a);         if(b==1)             s+=1;     }     printf("%d",s);     return 0; } 供参考～

有人吗有人吗

while(k=1) 这是赋值 你应该写 ==

while(k==1) 供参考～  建议楼主对比一下这行代码～


Question: C语言怎么读取串口数据

用uart的库


Question: 学习C语言用什么IDE？

geany不错

linux + vim+gcc/g++

dev-c++这样的，比较小巧


Question: 关于C语言的算法，简单

第一个程序里/a(y);这个a和()之间需要符号，应该是用*.即乘。其他地方也注意下～

引用 3 楼 自信男孩的回复:scanf("%lf%d", &x, &n); 楼主的scanf缺少& 哦哦哦，最后一个忘了没有加，那个还有别的问题

scanf("%lf%d", &x, &n); 楼主的scanf缺少&

我把所有变量都改成double了，我怕什么整除错误


Question: 有没有大神会yuv视频播放

参考： https://blog.csdn.net/leixiaohua1020/article/details/40266503  如果看不懂，可以继续看雷神其他的文章


Question: 求助c语言数据结构代码问题

谢谢哇终于搞明白了这个代码了！ 感谢！！！

#include<stdio.h> #include<stdlib.h>  typedef struct Node{     int data;     struct Node *pNext; }NODE,*PNODE;  PNODE create_list(int n) {     int i;     int val;       PNODE pHead = (PNODE)malloc(sizeof(NODE));     if (NULL == pHead)     {         printf("分配失败, 程序终止!\n");         exit(-1);     }     PNODE pTail = pHead;     pTail->pNext = NULL;       for (i=0; i<n; ++i)     {         scanf("%d", &val);          PNODE pNew = (PNODE)malloc(sizeof(NODE));         if (NULL == pNew)         {             printf("分配失败, 程序终止!\n");             exit(-1);         }          pNew->data = val;         pNew->pNext = NULL;         pTail->pNext = pNew;         pTail = pNew;     }      return pHead; }  void traverse_list(PNODE pHead) {     PNODE p = pHead->pNext;      while(p!=NULL)     {         printf("%d ",p->data);         p = p->pNext;      }     printf("\n");     return; }  void sort(PNODE pHead,int *x) {     int i=1;     //PNODE p = (PNODE)malloc(sizeof(NODE));     PNODE p;     PNODE r = (PNODE)malloc(sizeof(NODE));     if (!r)         exit(0);     r->data = *x;     //r->pNext = NULL;      //p = pHead->pNext;     p = pHead;     //while(p!=NULL&&p->data>=x)     while(p->pNext && p->pNext->data <= *x)     {         i++;         p = p->pNext;     }      r->pNext = p->pNext;     p->pNext = r;     *x = i;  #if 0      r->data = x;     r->pNext = p->pNext;     p->pNext = r;     if(i==1)     {         r->data = x;         r->pNext = p;         pHead->pNext = r;     }     printf("%d",i); #endif }  int main() {     int n,x;     PNODE pHead = NULL;     while(scanf("%d", &n)!=EOF)     {         pHead =create_list(n);         scanf("%d",&x);         if(n==0)         {             //printf("%d", &x);             printf("%d", x);         }         else         {             sort(pHead, &x);             printf("%d\n", x);             traverse_list(pHead);          }     }      return 0; } 供参考～  楼主判断有问题，  //while(p!=NULL&&p->data>=x)     while(p->pNext && p->pNext->data <= *x) 是>=x还是<=x的问题。  其他问题建议对比代码找一下自己的问题～ 这里的x我用指针，目的是获取位置信息～


Question: 这个表达式是啥子意思嘞

引用 3 楼 qybao的回复:因为 满足这个 a<0==b<0 就证明 a 和 b 是符号相同的 之后的如果满足 t<0 != a<0 就证明 t 和 a 是符号不相同的 t=a+b，a 和 b 符号相同，但相加结果的 t 的符号不相同，那说明什么？说明 t 溢出了 明白了，明白了，感谢，

引用 1 楼 自信男孩的回复:代码呢？讨论这个问题总要有前提或者问题本身的代码吧～ 表达式是t=a-b；然后这个OF是一个条件码，如果t=a-b发生了有符号的溢出，OF等于1，没有发生有符号的溢出，OF=0；然后它就给出了这么一个逻辑运算来判断究竟有没有溢出，但是这个判断的逻辑运算我实在是搞不懂它的含义

代码呢？讨论这个问题总要有前提或者问题本身的代码吧～


Question: 不知道那里错了，各位大神指点一下，鹅鹅鹅

引用 1 楼 自信男孩的回复:2x是数学里的表达式，在编程语言里不能这么写，改成2 * x; ，太粗心了呀

2x是数学里的表达式，在编程语言里不能这么写，改成2 * x;


Question: 按字典顺序对多个字符串排序

#include <stdio.h> #include <string.h>  main () {     char *t;     int i,j,n;//,p;     unsigned int arr_len;     //char *s[]={"pescal","basic","fortran","turbo C"};     const char *s[]={"pescal","basic","fortran","turbo C"};     printf("Enter n:");     scanf ("%d",&n); /*输入待排序字符串的个数n*/     arr_len = sizeof(s) / sizeof(s[0]);     if (n > arr_len)         n =  arr_len;     for (i=0;i<n-1;i++) /*用冒泡排序法*/     {         for (j=0;j<n-1-i;j++)         {             if (strcmp (s[j],s[j+1])>0)             {                 t = (char *)s[j];                 s[j] = s[j+1];                 s[j+1] = t;                 //strcpy (t,s[j]);                 //strcpy (s[j],s[j+1]);                 //strcpy (s[j+1],t);             }         }     }     //printf ("%d",p);     for (i=0;i<n;i++)     {         printf ("%s\n",s[i]);     }      return 0; } 供参考～  楼主的问题主要是对s指针的理解，楼主定义的是指针数组，即每个元素都是指针，而每个指针都指向了只读数据段上的字符串，而楼主在排序时对只读数据进行了写操作，所以应该会出现多错误～  直接交换指针指向的位置即可～  其他问题详见代码～


Question: 利用循环队列模拟缓存，每缓存5组数据一次性读出

感谢

//2019213020 #include <stdio.h> #include <stdlib.h>  #define MAX_SIZE 6   //每次缓存最大为五组数据  typedef struct {     int queue[MAX_SIZE];     int rear;     int front; }QUEUE,*pQUEUE;  void InitQueue(pQUEUE p); int InQueue(pQUEUE p); void OutQueue(pQUEUE p);  int main() {     QUEUE myQueue;     int ret;     //char choose;      InitQueue(&myQueue);     do{          ret = InQueue(&myQueue);         //getchar();         //printf("是否继续（Y/N）\n");         //scanf(" %c",&choose);                   //感觉这样每次输入判断很麻烦，想可以连续输入数据直到想停止程序在输入     }while(ret >= 0);      return 0; }  //函数功能：初始化队列 void InitQueue(pQUEUE p) {     p->front = 0;     p->rear = 0; }  //函数功能：实现缓存读写功能 int InQueue(pQUEUE p) {     if((p->rear+1)%MAX_SIZE == p->front)     {         printf("overflow\n");         OutQueue(p);     }     printf("Input x:\n");     if (scanf("%d",&p->queue[p->rear]) == EOF)         return -1;     p->rear = p->rear%MAX_SIZE+1;      if((p->rear+1)%MAX_SIZE == p->front)   //队满则一次性输出数据，并清空队列     {         printf("overflow\n");         OutQueue(p);     }     return 0; }  //函数功能：实现缓存输出功能 void OutQueue(pQUEUE p) {     if(p->front == p->rear)                //队空则退出程序     {         printf("underflow!\n");         exit(-1);     }     while(p->front != p->rear)     {         printf("%d\n",p->queue[p->front]);         p->front = p->front%MAX_SIZE+1;     }     return ; }  供参考～  楼主可通过输入ctrl+d（linux下）或ctrl+z（windows下）终止输入，结束输入


Question: 为什么创建二叉树要用到二级指针？

swap函数，这个自定义函数在C语言的数据里比较经典了，如果了解和明白了这个，可以很好理解这个为什么用二重指针～

1 区别就是A不用返回值，也能修改函数外的root指针，而B是在函数设置指针指向并返回函数内的指针  2 因为A要直接修改函数外的root指针，而B不是修改函数外的指针，而是返回一个新指针。这个问题回答过很多次了。 形参只是实参的拷贝，形参本身的内存地址和实参的内存地址不同（在不同的函数栈里），所以在函数内修改形参的内存，不能影响函数外的实参。 什么叫修改形参的内存？直接对形参（变量）赋值就是修改形参（变量）的内存，比如 int a=5；//a的内存信息为5，  a=10；//赋值语句修改了a的内存信息为10 所以B的 root = malloc(sizeof(struct TreeNode)); 就是修改形参的内存，这个root和函数外的实参的内存空间不同，所以修改它并不会对实参的内存造成影响，所以必须把它做为返回值返回去，否则函数外就没法获得这个变化的值。（也就是通过返回值来把变化返回去，让函数外也能获得这个变化） A为什么可以影响函数外的实参？因为A传进来的是实参的地址，而不是实参的值，且函数内没有修改形参的内存（也就是没用直接对形参用赋值语句），而是对形参解引用（也就是找到实参的地址）去赋值。什么叫解引用赋值？*xx=yy就是解引用赋值，即A是用*root = malloc(sizeof(struct TreeNode));来赋值的，*root就是函数外的实参（因为root是实参的地址，*root就是实参），所以A能改变函数外的指针指向新的地址。 要记住，要想在函数内修改函数外的变量，必须满足三个条件 一，形参必须用指针 二，必须是把实参的地址传给形参 三，函数内必须是对形参解引用赋值而不能直接对形参赋值 举个例子  int global_a = 5; void fun1(int a) {a=10;} //不影响函数外的实参 void fun2(int *a) {a=&global_a;} //修改形参的内存，不影响函数外的实参 void fun3(int *a) {*a=10;} //修改形参的解引用的内存，也就是修改实参的内存，影响函数外的实参 int main() {     int a = global_a;     fun1(a);      printf("%d\n", a); //a不变，为什么？不符合上面三个条件     fun2(&a);     printf("%d\n", a); //a不变，为什么？不符合上面的条件三     fun3(&a);     printf("%d\n", a); //a变了，为什么？因为fun2传的是a的地址，且fun2是解引用赋值，如果是fun2 } 对于A来说，函数外的实参root是个指针，根据上面的条件二，要传实参的地址，也就是要传root指针的地址，指针的地址就是二级指针，所以A的形参就是二级指针。  3 理解了2，就知道为什么C是错的了，C就像上面举例的fun2，修改了形参的内存，对实参的内存不造成影响。除非像B一样，把变化返回去，否则函数外无法获得变化。

醍醐灌顶


Question: 泰勒公式求正弦：请问哪里错了？

理解不对吧，不是标准函数和公式计算的误差，是最后一项的误差要小于e 所以  int main() {     double x, e, t, m, p, s=0, f=1;     int n=1, i=2;     scanf("%lf%lf", &x, &e);     m = x;     p = 1;     while ((t=m/p)>=e) { //如果最后一项的精度不小于e则一直循环         s += f*t; //累加总和         n++; //项数增加         m *= (x*x); //分子乘x平方         for(; i<=2*n-1; ++i) p *= i; //分母阶乘         f *= -1; //正负符号变化     }     printf("sin(%f)=%f\n", x, sin(x)); //标准函数库的结果     printf("%d, sin(%f)=%f\n", n, x, s); //自己计算的结果     return 0; }

#include <stdio.h> #include <math.h> float mypow(float a,int b) {     float result=1;     for (int i=1;i<=b;i++)     {         result*=a;     }    return result; } int fun(int a) {     int result=1;     for (int i=1;i<=a;i++)     {         result*=i;     }     return result; } int main() {      double x,eps,a1=-1;     printf("Enter x & eps:");     scanf("%lf%lf",&x,&eps);     float t=sin(x);     double sum=0;     int n;       for (n=0;fabs(t-sum)<eps;n++)     {         sum+=(mypow(a1,n)*mypow(x,2*n+1))/fun(2*n+1);     }      printf("sin(%f)=%f\n",x,t);     printf("%d,sin(%f)=%f\n",n-1,x,sum);  }


Question: 如果一个类中 有常数据成员也有静态数据成员 那么他的构造函数怎么写

A(A& p):a(p.a) {         b++;     }

还是说包含常数据对象的类的对象不能赋值给另一个该类的对象，编写复制构造函数是违规的


Question: C语言给小学生乘法测试

不需要了，自己写


Question: 我的代码错在哪里？

引用 4 楼 zdzazcy 的回复:我在这里写一个例子你看一下,读懂就可以了. int main() {     int i;     int n;     double sum = 0;     printf("请输入累加的次数:");     scanf("%d",&n);     for(i = 0;i < n;i++)     {         if(sum == 0)         {             sum = 1;         }         else             sum = sum + 1.0/(2*i+1);     }     printf("累加后的数字为:sum = %.6lf",sum);      return 0; }  浮点数与0比较，需要特殊处理，不能直接和和0比较～

我明白了 前N项我没理解好

#include <stdio.h>  int main(void) { 	int n, i; 	double sum=0; 	scanf("%d",&n);  	for (i = 0; i < n; i++) { 		sum += 1.0 /(2 * i + 1); 	} /* 	for(n;n>0;n=n-2){ 		sum=sum+1.0/n; 	} 	*/ 	//printf("sum = %.6f",sum); 	printf("sum = %.6lf",sum);  }  供参考～

double要用lf%输出 #include<stdio.h> int main() { 	int N; 	double sum=0; 	scanf("%d",&N); 	for(int i=1;i<=N;i++) 	{ 		sum+=1.0/(2*i-1); 	} 	printf("%.6lf\n",sum); }

我刚学到这，等大佬们来说，我也看看有什么问题，学习一下，嘿嘿

前n项你没理解是什么意思。 比如n是2，也就是前2项，就是1+1/3 n是3，也就是前3项，就是1+1/3+1/5 看到了吗，n是3，最后一项就是1/5，也就是1/(2*n-1)，而你的代码就是，n是3，最后一项却是1/3，所以当然结果不对了，所以改成 for(n; n>0; n--) {     sum=sum+1/(2*n-1); }


Question: C语言处理多组数据问题

供参考 int year,month,day; scanf("%d%d%d",&year,&month,&day); while((year+month+day)!=0) {     ...     scanf("%d%d%d",&year,&month,&day); } 或者 int year,month,day; do {     ...     scanf("%d%d%d",&year,&month,&day); } while((year+month+day)!=0);


Question: 数据结构––线性表插入问题

#include<stdio.h>  #define maxsize 100  typedef struct {     int data[maxsize];     int length; } Sqlist;  //Sqlist L = { {1,2,3,4,6,7,8},8 }; Sqlist L = { {1,2,3,4,6,7,8}, 7 };  int findelem(Sqlist L, int x); void insertelem(Sqlist &L, int x);   int main(void) {     insertelem(L, 5);     int j=0;     //while (j <L.length-1) {     while (j <L.length) {         //printf("%d", L.data[maxsize]);         printf("%d ", L.data[j]);         j++;     }     putchar(10);     return 0; }   int findelem(Sqlist L, int x)     //找位置 {     int i;     for (i = 0; i < L.length; ++i)     {         if (x < L.data[i])         {             return i;         }     }      return i; }  void insertelem(Sqlist &L, int x)    //插入 {     int i, p;     p = findelem(L, x);     for (i = L.length - 1; i >= p; --i)         L.data[i + 1] = L.data[i];     L.data[p] = x;     ++L.length; } 供参考～ 初始化长度有问题， 对比代码找一下自己的问题吧

修改如下 while(j<L.length) {     printf(“%d”, L.data[j]); //不要打印L.data[maxsize]，因为首先L.data[maxsize]会数组越界，就算要打印最后一个元素也是L.data[maxsize-1]，其次，应该是打印L.data[j]，否则j循环没意义，L.data[maxsize]打印的都是同一个元素。     j++; }


Question: 小学生测试之C语言

不需要了，自己写了


Question: C语言小学生乘法测试

额，好像忘了放图

代码在哪儿呢？


Question: c语言中，链栈怎么进行任意节点的交换，不是数据域的值交换，而是整个节点的交换

这不是挺简单的吗。就是把m前后的节点改为n前后的节点，把n前后的节点改为m前后的节点。 n_pre->next=m; //n的前一个节点的下一个节点指向m tmp=m->next; //临时保存m的下一个节点 m->next=n->next; //m的下一个节点指向n的下一个节点 n->next=tmp; //n的下一个节点指向原来m的下一个节点 m_pre->next=n; //m的前一个节点的下一个节点指向n


Question: C语言循环语句

可以，但是循环里b不变就会一直满足循环条件，造成死循环


Question: 为什么这个位域输出不对

usigned占4个，枚举占4个，bool占1个， 所以4+4+4+1=13，按第一个成员unsigned类型对齐（也就是按4个字节对齐），所以13被补齐为16个字节

引用 2 楼 user-1 的回复:毕竟不是联合体，每个成员都有自己独立的内存空间，位域只是让它们使用部分空间而已，而且位域也会按字节对齐分配空间的，所以hz占2个字节（超过8位不满16位），wordsize占1个字节（不满8位），he占1个字节，ht占1个字节，所以占用2+1+1+1=5字节，由于内存自动对齐（第一个成员为unsigned类型占4个字节，按它对齐），5大于4个字节，不满8个字节，所以补齐为8个字节。 你可以试试打印sizeof(a.hz),sizeof(a.he)等等看看 如果不使用位域 它是16个字节 这16个字节怎么算的啊？ unsign占4个，bool和两个枚举都各占一个 输出是16个

不应该是13+1+2+1等于17位 三个字节吗


Question: 小白 求助~！

引用 2 楼 自信男孩 的回复:因为楼主没有将b值输入到b的内存里。 注意楼主的scanf中带有,逗号，输入的时候要保持和scanf的格式一致，即该逗号是中文，则输入的时候要输入中文逗号，否则输入英文逗号. 感谢老师指点，你的解答很有帮助~！

输入两个数字的时候中间加个英文的逗号试试？

仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

总体逻辑没有问题，不过一般需要一个return 0；返回值，因为你用的是int作为main函数的返回值。 源码：  #include<stdio.h> int main() {     int a, b, max;     scanf("%d,%d",&a, &b);     if(a>b)         max = a;     else         max = b;     printf("max=%d\n", max);     return 0； }   不过注意输入的时候是a,b，不是a b，a与b之间是逗号，不是空格。


Question: 机考题

输出每行的行是啥意思？总行数？还是每行原来的内容？ int a, b, c, ln=0; char buf[64]; memset(buf, 0, sizeof(buf); while(fgets(stdin, buf, 64)!=null) {//如果行数据存在     if(sscanf(buf, “%d%d%d”, &a, &b, &c)==2) {//如果行数据是两个整数         ln++; //就统计符合条件的行     }     printf(“%s”, buf);//打印行数据     memset(buf, 0, sizeof(buf); } printf(“%d”, ln);//符合条件的行总数


Question: 想通过链表从文件中读取，之后复制到新文件中，但是程序一闪就退，也无法新建文件

if(!feof(fl)) {//进入这个if时     pNew=(users*)malloc(); //首先要做这一步     ... } 为什么？ 你好好想想，进入if(list_number_count==1)是就已经把pNew用了，进入else是不是应该重新给pNew分配内存？什么时候分配，那就是在你的if(!feof(fl))判断文件没有eof的时候分配。 另外，return pHead也最好放在最外面，否则文件不能正常读入时没有返回值，函数没有返回值是危险行为。

谢谢了，我找到这个问题了


Question: 小白提问：如何使getchar（）函数返回下一个非空白字符？

请参考《scanf()、gets()和getline()读取输入》 希望能够帮到您！

if(ch !='\n'  && ch != '\t' && ch != ' ') 试试这样 或者  if (!isspace(ch))   //注意加头文件<ctype.h>

if(ch！='\n' && ch!=' ' && ch!='\t')


Question: 错误又来了。。。

引用 5 楼 user-1 的回复:[quote=引用 4 楼 我当时害怕极了QAQ 的回复:][quote=引用 3 楼 user-1 的回复:]主要是你判断栈顶元素的时候没有判断栈是否为空，所以就会造成st[top]的top为-1 修改方法一是判断栈顶元素之前判断栈是否为空，比如 if(!s1.empty() && s1.top1()==‘(‘) 修改方法二是top1方法追加一个判断，比如 if(top==-1) return -1; return st[top]; [/quot]  按照方法1和方法2修改了，还是一样的错误。。。  按理说不应该呀，我push的时候已经++top了？  只有匹配的时候才会自减  怎么会变成-1 你debug跟踪一下吧，我这边用你的代码没法再现你的错误 另外，跑你的代码时还发现一个问题，就是以下打印 cout << c[1] << "  匹配错误" << endl; 这里应该是c[i] [/quote]  嗯嗯，大佬  问题解决了，不是程序的问题  不知道是编译器的问题还是内存出了什么问题。。。  谢谢帮助

引用 4 楼 我当时害怕极了QAQ 的回复:[quote=引用 3 楼 user-1 的回复:]主要是你判断栈顶元素的时候没有判断栈是否为空，所以就会造成st[top]的top为-1 修改方法一是判断栈顶元素之前判断栈是否为空，比如 if(!s1.empty() && s1.top1()==‘(‘) 修改方法二是top1方法追加一个判断，比如 if(top==-1) return -1; return st[top]; [/quot]  按照方法1和方法2修改了，还是一样的错误。。。  按理说不应该呀，我push的时候已经++top了？  只有匹配的时候才会自减  怎么会变成-1 你debug跟踪一下吧，我这边用你的代码没法再现你的错误 另外，跑你的代码时还发现一个问题，就是以下打印 cout << c[1] << "  匹配错误" << endl; 这里应该是c[i]

引用 1 楼 user-1 的回复:看你的用例，应该是只打印第一次不匹配的错误，所以遇到不匹配，打印后就退出循环就好了  void Bracketmatch(const char* c) //括号匹配 {     bool bj=true;     char t;     stack s1(strlen(c)+1);     for (unsigned int i = 0; i < strlen(c); i++)     {         t = c[i];         switch (t)         {         case '(':             s1.push(t);             break;         case '[':             s1.push(t);             break;         case '{':             s1.push(t);             break;         case ')':                           if (s1.top1() == '(')             {                 s1.pop();                 break;             }             else             {                 cout << c[i] << "  匹配错误" << endl;                 bj = false;                 break;             }         case ']':             if (s1.top1() == '[')             {                 s1.pop();                 break;             }             else             {                 cout << c[1] << "  匹配错误" << endl;                 bj = false;                 break;             }         case '}':             if (s1.top1() == '{')             {                 s1.pop();                 break;             }             else             {                 cout << c[i] << "  匹配错误" << endl;                 bj = false;                 break;             }         default:             break;         }         if (!bj) break; //加这一句就好了，只要有错，就不再继续往下查找匹配了     }     if (bj)     {         if (s1.empty())         {             cout << "匹配正确！" << endl;         }         else             cout << s1.top1() << "  匹配错误" << endl;     } }   还是不对  是不是stack类有问题


Question: 关于二级指针的问题

请参考《指向指针的指针》 希望能够帮到您！

这个问题类似swap()为什么用指针，而不用变量来实现两个数据交换，道理是一样的～

簡單說，一級指針用來改變值，二級指針用來改變鏈表。  比如定義了一個指針，把他傳給函數，之前必須分配好内存，函數可以改變該内存區的值； 把他的指針傳給函數，則可以在函數内部分配内存，或指向另一個地方，對於構建鏈表靈活得多。

因为写代码的人对定义接口毫无规划 胡乱操作


Question: 小白做了个学生信息管理系统，但是不知道为什么就是运行的界面不对

引用 8 楼 学码就是爱好 的回复:十多年前学过C，最新重新看了一部分，文件和结构体还没系统看，但是我个人理解，这个程序伪代码这样： 首先读取文件，然后根据文件内数据结构的多少（具体实现还没想过是通过历遍还是在文件开头存储结构体数量）申请结构体内存； 将文件内的数据与申请的结构体关联； 然后所有的增加、删除、修改、查询都在结构体链表中进行； 退出程序时，检查是否进行过增加、删除、修改的，如果是 将新的结构体链表存入文件，如果不是直接退出。  另外程序中应该是文件的打开与关闭 ，内存的申请与释放 一一对应。 可能说的不对，请包涵。谢谢大佬！很久没上csdn，今天才看到您的回复，真的很感谢您的指正！

测试，除了新增与查询的功能正确，修改与删除都不能保存到文件

修改代码如下： #include <stdio.h> #include <string.h> #include <malloc.h>  struct stud {     int num;     char name[30];     char classnum[30];     int score[4];     struct stud *next; };  struct stud *head=NULL;  void InsertStud() {     char s[10];     do      {          int tmp;          printf("请输入学号：");          scanf("%d",&tmp);          struct stud *q,*p;          p=head;           while(p!=NULL)            {             if(p->num==tmp)               {                 printf("该学生已存在！\n");                 return;                }               p=p->next;             }            q=(struct stud*)malloc(sizeof(struct stud));            if(q==NULL)              {                printf("申请内存失败\n");                return;              }              q->num=tmp;             printf("请输入姓名：");             scanf("%s",q->name);             printf("请输入班级：");             scanf("%s",&q->classnum);             printf("请输入四门课的成绩：");             scanf("%d %d %d %d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);             q->next=NULL;              p=head;             if(p==NULL)                 {                     head=q;                 }             else                 {                     while(p->next!=NULL)                         {                             p=p->next;                         }                     p->next=q;                 }             printf("学生增加成功！\n");              printf("你还需要继续输入学生信息吗？(no退出)：");             scanf("%s",s);           }         while(strcmp(s,"no")!=0);  }   void DelStud() { int flag=1; int num; printf("请输入要删除的学生学号：\n"); scanf("%d",&num); struct stud *p,*q; q=p=head; while(p!=NULL&&flag==1) { if(p->num==num) { if(p==head)//删除首节点 { head=p->next; free(p); } else { q->next=p->next; free(p); } flag=0; printf("删除学生信息成功！\n"); return; } else { q=p; p=p->next; }  } if(flag==1) { printf("没有找到可以删除的学生学号！\n"); } }   void UpdateStud() { int flag=1; int num; printf("请输入要修改的学生的学号：\n"); scanf("%d",&num);  struct stud *p; p=head; while(p!=NULL&&flag==1) { if(p->num==num) { printf("请输入新学号：\n"); scanf("%d",&p->num); printf("请输入新姓名：\n"); scanf("%s",p->name); printf("请输入新班级：\n"); scanf("%s",p->classnum); printf("请输入新成绩：\n"); scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]); flag=0; printf("学生信息修改操作成功\n"); } else { p=p->next; }  } if(flag==1) { printf("没有找到要修改的记录\n"); }  } void QueryStud() { int flag=1; int num; printf("请输入要查询的学号：\n"); scanf("%d",&num);  struct stud *p; p=head; while(p!=NULL&&flag==1) { if(p->num==num) { printf("姓名：%s\n",p->name); printf("学号：%d\n",p->num); printf("班级：%s\n",p->classnum); printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d\n",p->score[0],p->score[1],p->score[2],p->score[3]); flag=0; } else { p=p->next; } } if(flag==1) { printf("没有查询到要查询的信息！"); } }  /*void StaticStud() { } */ void SaveStud() { FILE *fp;  fp=fopen("stud.dat","ab+");//打开文件stud.dat //{ //printf("文件打开失败\n"); //return;//打开失败退出 //} struct stud *p; p=head; while(p!=NULL) { fwrite(p,sizeof(struct stud),1,fp); p=p->next; }  fclose(fp);//关闭文件 printf("学生信息保存成功！\n"); }  int fileexist(const char *filename) { FILE *fp; if((fp=fopen(filename,"rb"))==NULL) return 0; else { fclose(fp); return 1; } } void load() { if(fileexist("stud.dat")==0) return;  FILE *fp; if((fp=fopen("stud.dat","rb"))==NULL) { printf("文件打开失败!\n"); return; }  struct stud *p,*q; p=head;  while(!feof(fp)) { q=(struct stud *)malloc(sizeof(struct stud)); if(q==NULL) { printf("申请内存失败!\n"); return; } fread(q,sizeof(struct  stud),1,fp); q->next=NULL; if(head==NULL) // if(P==NULL) { //head=p; head=q; p=q; } else { while(p->next!=NULL) { p=p->next; } p->next=q; }  } fclose(fp);  }  int main() {     int i;     load();     do     {         printf("\n\n\n");         printf("\t\t*****************************************\n");         printf("\t\t**                                     **\n");         printf("\t\t**       欢迎来到学生信息管理系统      **\n");         printf("\t\t*****************************************\n");         printf("\t\t** 1、增加学生信息      2、删除学生信息**\n");         printf("\t\t** 3、修改学生信息      4、查询学生信息**\n");         printf("\t\t** 5、基本信息统计      6、保存学生信息**\n");         printf("\t\t** 7、退出                             **\n");         printf("\t\t**                                     **\n");         printf("\t\t*****************************************\n");         printf("请选择操作：");         scanf("%d",&i);         switch(i)         {             case 1 : InsertStud();break;             case 2 : DelStud();break;             case 3 : UpdateStud();break;             case 4 : QueryStud();break;                      // case 5 : StaticStud();break;             case 6 : SaveStud();break;             case 7 : break;             default : printf("选择错误，请重选");break;         }     }while(i!=7);     return 0; }   做更新 删除 增加的操作 如果不进行6 保存操作 所做的操作实际上都没有保存，再次打开程序读文件 数据没有变化，因此要么在做以上三个动作要么直接接保存动作，要么提示用户保存。

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <string.h> #include <malloc.h>  struct stud {     int num;     char name[30];     int classnum;     int score[4];     struct stud *next; };  struct stud *head=NULL;  void InsertStud() {      char s[10];     do     {         int tmp;         printf("请输入学号：\n");         scanf("%d",&tmp);          struct stud *q,*p;         p=head;          while(p!=NULL)         {             if(p->classnum==tmp)             {                 printf("该学生已存在！\n");                 return;             }             p=p->next;         }         q=(struct stud*)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败\n");             return;         }          q->classnum=tmp;         printf("请输入姓名：");         scanf("%s",q->name);         printf("请输入学号：");         scanf("%d",&q->num);         //printf("请输入班级："); //还要输入班级吗？上面不是已经赋值了吗？         //scanf("%s",&q->classnum);         printf("请输入四门课的成绩：");         scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);         q->next=NULL;          p=head;         if(p==NULL)         {             head=q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }         printf("学生增加成功！\n");          printf("你还需要继续输入学生信息吗？(no退出)：");         scanf("%s",s);     }     while(strcmp(strupr(s),"NO")!=0);  }   void DelStud() {     int flag=1;     int num;     printf("请输入要删除的学生学号：\n");     scanf("%d",&num);     struct stud *p,*q;     p=q=head;     while(p!=NULL&&flag==1)     {         if(p->classnum==num)         {             if(p==head)//删除首节点             {                 head = p->next;                 free(p);             }             else             {                 q->next=p->next;                 free(p);             }             flag=0;             printf("删除学生信息成功！\n");             return;         }         else         {             q=p;             p=p->next;         }      }     if(flag==1)     {         printf("没有找到可以删除的学生学号！\n");     } }   void UpdateStud() {     int flag=1;     int num;     printf("请输入要修改的学生的学号：\n");     scanf("%d",&num);      struct stud *p;     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("请输入新学号：\n");             scanf("%d",&p->num);             printf("请输入新姓名：\n");             scanf("%s",p->name);             printf("请输入新班级：\n");             //scanf("%s",p->classnum);             scanf("%d", &p->classnum);             printf("请输入新成绩：\n");             scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             flag=0;             printf("学生信息修改操作成功\n");         }         else         {             p=p->next;         }      }     if(flag==1)     {         printf("没有找到要修改的记录\n");     }  } void QueryStud() {     int flag=1;     int num;     struct stud *p;     printf("请输入要查询的学号：\n");     scanf("%d",&num);     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("姓名：%s",p->name);             //printf("学号：%d",&p->num);    //为什么要加&?             printf("学号：%d", p->num);             //printf("班级：%s",p->classnum);             printf("班级：%d",p->classnum);             //printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d", p->score[0], p->score[1], p->score[2], p->score[3]);             flag=0;         }         else         {             p=p->next;         }     }     if(flag==1)     {         printf("没有查询到要查询的信息！");     } }  /*void StaticStud()   {   }   */ void SaveStud() {     FILE *fp;      if((fp=fopen("stud.dat","wb"))==NULL);//打开文件stud.dat     {         printf("文件打开失败\n");         return;//打开失败退出     }     struct stud *p;     p=head;     while(p!=NULL)     {         fwrite(p,sizeof(struct stud),1,fp);         p=p->next;     }      fclose(fp);//关闭文件     printf("学生信息保存成功！\n"); }  //int fileexist(char *filename) int fileexist(const char *filename) {     FILE *fp;     if((fp=fopen(filename,"rb"))==NULL)         return 0;     else     {         fclose(fp);         return 1;     } } void load() {     if(fileexist("stud.dat")==0)         return;      FILE *fp;     if((fp=fopen("stud.dat","rb"))==NULL)     {         printf("文件打开失败!\n");         return;     }      struct stud *p,*q;     p=head;      while(!feof(fp))     {         q=(struct stud *)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败!\n");             return;         }         fread(q,sizeof(struct  stud),1,fp);         q->next=NULL;          //if(p==NULL)         if(head==NULL)         {             //head=p;             head = q;   //如果把p赋值给head，那么这里是有问题的;             p = q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }      }     fclose(fp); }  int main() {     int i;     load();     do     {         printf("\n\n\n");         printf("\t\t*****************************************\n");         printf("\t\t**                                     **\n");         printf("\t\t**       欢迎来到学生信息管理系统      **\n");         printf("\t\t*****************************************\n");         printf("\t\t** 1、增加学生信息      2、删除学生信息**\n");         printf("\t\t** 3、修改学生信息      4、查询学生信息**\n");         printf("\t\t** 5、基本信息统计      6、保存学生信息**\n");         printf("\t\t** 7、退出                             **\n");         printf("\t\t**                                     **\n");         printf("\t\t*****************************************\n");         printf("请选择操作：");         scanf("%d",&i);         switch(i)         {             case 1 : InsertStud();break;             case 2 : DelStud();break;             case 3 : UpdateStud();break;             case 4 : QueryStud();break;                      // case 5 : StaticStud();break;             case 6 : SaveStud();break;             case 7 : break;             default : printf("选择错误，请重选");break;         }     }while(i!=7);     return 0; } 供参考～ 感谢大牛！经过修改以后我的代码如下，但是每当我按6想要保存文件的时候，总是提示文件打开失败，由于我对文件的操作非常的不熟悉，所以不知道到底是什么问题导致这种情况，求解答  #include <stdio.h> #include <string.h> #include <malloc.h> struct stud { 	int num; 	char name[30]; 	char classnum[30]; 	int score[4]; 	struct stud *next; };  struct stud *head=NULL;  void InsertStud() {  	char s[10]; 	do 	{	 		int tmp; 		printf("请输入学号：\n"); 	    scanf("%d",&tmp);  	    struct stud *q,*p; 		p=head;  		while(p!=NULL) 		{ 			if(p->num==tmp) 			{ 				printf("该学生已存在！\n"); 				return; 			} 			p=p->next; 		} 		q=(struct stud*)malloc(sizeof(struct stud)); 		if(q==NULL) 		{ 			printf("申请内存失败\n"); 			return; 		}  		q->num=tmp; 		printf("请输入姓名："); 		scanf("%s",q->name); 		printf("请输入学号："); 		scanf("%d",&q->num); 		printf("请输入班级："); 		scanf("%s",&q->classnum); 		printf("请输入四门课的成绩："); 		scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]); 		q->next=NULL;  		p=head; 		if(p==NULL) 		{ 			head=q; 		} 		else 		{ 			while(p->next!=NULL) 			{ 				p=p->next; 			} 			p->next=q; 		} 		printf("学生增加成功！\n");  		printf("你还需要继续输入学生信息吗？(no退出)："); 		scanf("%s",s); 	} 		while(strcmp(strupr(s),"NO")!=0);  }   void DelStud() { 	int flag=1; 	int num; 	printf("请输入要删除的学生学号：\n"); 	scanf("%d",&num); 	struct stud *p,*q; 	q=p=head; 	while(p!=NULL&&flag==1) 	{ 		if(p->num==num) 		{ 			if(p==head)//删除首节点 			{ 				head=p->next; 				free(p); 			} 			else 			{ 				q->next=p->next; 				free(p); 			} 			flag=0; 			printf("删除学生信息成功！\n"); 			return; 		} 		else 		{ 			q=p; 			p=p->next; 		}  	} 	if(flag==1) 	{ 		printf("没有找到可以删除的学生学号！\n"); 	} }   void UpdateStud() { 	int flag=1; 	int num; 	printf("请输入要修改的学生的学号：\n"); 	scanf("%d",&num);  	struct stud *p; 	p=head; 	while(p!=NULL&&flag==1) 	{ 		if(p->num==num) 		{ 			printf("请输入新学号：\n"); 			scanf("%d",&p->num); 			printf("请输入新姓名：\n"); 			scanf("%s",p->name); 			printf("请输入新班级：\n"); 			scanf("%s",p->classnum); 			printf("请输入新成绩：\n"); 			scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]); 			flag=0; 			printf("学生信息修改操作成功\n"); 		} 		else 		{ 			p=p->next; 		}  	} 	if(flag==1) 	{ 		printf("没有找到要修改的记录\n"); 	}  } void QueryStud() { 	int flag=1; 	int num; 	printf("请输入要查询的学号：\n"); 	scanf("%d",&num);  	struct stud *p; 	p=head; 	while(p!=NULL&&flag==1) 	{ 		if(p->num==num) 		{ 			printf("姓名：%s\n",p->name); 			printf("学号：%d\n",p->num); 			printf("班级：%s\n",p->classnum); 			printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d\n",p->score[0],p->score[1],p->score[2],p->score[3]); 			flag=0; 		} 		else 		{ 			p=p->next; 		} 	} 	if(flag==1) 	{ 		printf("没有查询到要查询的信息！"); 	} }  /*void StaticStud() { } */ void SaveStud() { 	FILE *fp;  	if((fp=fopen("stud.dat","wb"))==NULL);//打开文件stud.dat 	{ 		printf("文件打开失败\n"); 		return;//打开失败退出 	} 	struct stud *p; 	p=head; 	while(p!=NULL) 	{ 		fwrite(p,sizeof(struct stud),1,fp); 		p=p->next; 	}  	fclose(fp);//关闭文件 	printf("学生信息保存成功！\n"); }  int fileexist(const char *filename) { 	FILE *fp; 	if((fp=fopen(filename,"rb"))==NULL) 	return 0; 	else 	{ 		fclose(fp); 		return 1; 	} } void load() { 	if(fileexist("stud.dat")==0) 	return;  	FILE *fp; 	if((fp=fopen("stud.dat","rb"))==NULL) 	{ 		printf("文件打开失败!\n"); 		return; 	}  	struct stud *p,*q; 	p=head;  	while(!feof(fp)) 	{ 		q=(struct stud *)malloc(sizeof(struct stud)); 		if(q==NULL) 		{ 			printf("申请内存失败!\n"); 			return; 		} 		fread(q,sizeof(struct  stud),1,fp); 		q->next=NULL; 		if(head==NULL) 	//	if(P==NULL) 		{ 			//head=p; 			head=q; 			p=q; 		} 		else 		{ 			while(p->next!=NULL) 			{ 				p=p->next; 			} 			p->next=q; 		}  	} 	fclose(fp);  } 感谢大牛！经过修改以后我的代码如下，但是每当我按6想要保存文件的时候，总是提示文件打开失败，由于我对文件的操作非常的不熟悉，所以不知道到底是什么问题导致这种情况，求解答

好厉害哦。。

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <string.h> #include <malloc.h>  struct stud {     int num;     char name[30];     int classnum;     int score[4];     struct stud *next; };  struct stud *head=NULL;  void InsertStud() {      char s[10];     do     {         int tmp;         printf("请输入学号：\n");         scanf("%d",&tmp);          struct stud *q,*p;         p=head;          while(p!=NULL)         {             if(p->classnum==tmp)             {                 printf("该学生已存在！\n");                 return;             }             p=p->next;         }         q=(struct stud*)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败\n");             return;         }          q->classnum=tmp;         printf("请输入姓名：");         scanf("%s",q->name);         printf("请输入学号：");         scanf("%d",&q->num);         //printf("请输入班级："); //还要输入班级吗？上面不是已经赋值了吗？         //scanf("%s",&q->classnum);         printf("请输入四门课的成绩：");         scanf("%d%d%d%d",&q->score[0],&q->score[1],&q->score[2],&q->score[3]);         q->next=NULL;          p=head;         if(p==NULL)         {             head=q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }         printf("学生增加成功！\n");          printf("你还需要继续输入学生信息吗？(no退出)：");         scanf("%s",s);     }     while(strcmp(strupr(s),"NO")!=0);  }   void DelStud() {     int flag=1;     int num;     printf("请输入要删除的学生学号：\n");     scanf("%d",&num);     struct stud *p,*q;     p=q=head;     while(p!=NULL&&flag==1)     {         if(p->classnum==num)         {             if(p==head)//删除首节点             {                 head = p->next;                 free(p);             }             else             {                 q->next=p->next;                 free(p);             }             flag=0;             printf("删除学生信息成功！\n");             return;         }         else         {             q=p;             p=p->next;         }      }     if(flag==1)     {         printf("没有找到可以删除的学生学号！\n");     } }   void UpdateStud() {     int flag=1;     int num;     printf("请输入要修改的学生的学号：\n");     scanf("%d",&num);      struct stud *p;     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("请输入新学号：\n");             scanf("%d",&p->num);             printf("请输入新姓名：\n");             scanf("%s",p->name);             printf("请输入新班级：\n");             //scanf("%s",p->classnum);             scanf("%d", &p->classnum);             printf("请输入新成绩：\n");             scanf("%d%d%d%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             flag=0;             printf("学生信息修改操作成功\n");         }         else         {             p=p->next;         }      }     if(flag==1)     {         printf("没有找到要修改的记录\n");     }  } void QueryStud() {     int flag=1;     int num;     struct stud *p;     printf("请输入要查询的学号：\n");     scanf("%d",&num);     p=head;     while(p!=NULL&&flag==1)     {         if(p->num==num)         {             printf("姓名：%s",p->name);             //printf("学号：%d",&p->num);    //为什么要加&?             printf("学号：%d", p->num);             //printf("班级：%s",p->classnum);             printf("班级：%d",p->classnum);             //printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d",&p->score[0],&p->score[1],&p->score[2],&p->score[3]);             printf("语文成绩：%d 数学成绩：%d 英语成绩：%d 物理成绩：%d", p->score[0], p->score[1], p->score[2], p->score[3]);             flag=0;         }         else         {             p=p->next;         }     }     if(flag==1)     {         printf("没有查询到要查询的信息！");     } }  /*void StaticStud()   {   }   */ void SaveStud() {     FILE *fp;      if((fp=fopen("stud.dat","wb"))==NULL);//打开文件stud.dat     {         printf("文件打开失败\n");         return;//打开失败退出     }     struct stud *p;     p=head;     while(p!=NULL)     {         fwrite(p,sizeof(struct stud),1,fp);         p=p->next;     }      fclose(fp);//关闭文件     printf("学生信息保存成功！\n"); }  //int fileexist(char *filename) int fileexist(const char *filename) {     FILE *fp;     if((fp=fopen(filename,"rb"))==NULL)         return 0;     else     {         fclose(fp);         return 1;     } } void load() {     if(fileexist("stud.dat")==0)         return;      FILE *fp;     if((fp=fopen("stud.dat","rb"))==NULL)     {         printf("文件打开失败!\n");         return;     }      struct stud *p,*q;     p=head;      while(!feof(fp))     {         q=(struct stud *)malloc(sizeof(struct stud));         if(q==NULL)         {             printf("申请内存失败!\n");             return;         }         fread(q,sizeof(struct  stud),1,fp);         q->next=NULL;          //if(p==NULL)         if(head==NULL)         {             //head=p;             head = q;   //如果把p赋值给head，那么这里是有问题的;             p = q;         }         else         {             while(p->next!=NULL)             {                 p=p->next;             }             p->next=q;         }      }     fclose(fp); }  int main() {     int i;     load();     do     {         printf("\n\n\n");         printf("\t\t*****************************************\n");         printf("\t\t**                                     **\n");         printf("\t\t**       欢迎来到学生信息管理系统      **\n");         printf("\t\t*****************************************\n");         printf("\t\t** 1、增加学生信息      2、删除学生信息**\n");         printf("\t\t** 3、修改学生信息      4、查询学生信息**\n");         printf("\t\t** 5、基本信息统计      6、保存学生信息**\n");         printf("\t\t** 7、退出                             **\n");         printf("\t\t**                                     **\n");         printf("\t\t*****************************************\n");         printf("请选择操作：");         scanf("%d",&i);         switch(i)         {             case 1 : InsertStud();break;             case 2 : DelStud();break;             case 3 : UpdateStud();break;             case 4 : QueryStud();break;                      // case 5 : StaticStud();break;             case 6 : SaveStud();break;             case 7 : break;             default : printf("选择错误，请重选");break;         }     }while(i!=7);     return 0; } 供参考～大佬多谢！！！

楼上很厉害啊


Question: C语言数据结构小问题

这是C++的操作符，可以搜一下C++的引用～和指针功能类似～

这是c++,&还可以代表引用


Question: 关于链表的使用问题

#include<stdio.h> #include<stdlib.h> #include<string.h> //#include <stdio.h> //#include <stdlib.h>  typedef int ElementType; typedef struct Node *PtrToNode; struct Node {     ElementType Data;     PtrToNode   Next; }; typedef PtrToNode List; List CreatList(int x[],int n); //int* ReArry(int* x,int len); void ReArry(int* x,int len); //int a[1000005],b[1000005];  #define MAX_SIZE        8  int main() {     List l1,l2;     int *a, *b;     int k1=0,k2=0,n;//,k=0;      a = (int *)malloc(sizeof(int) * MAX_SIZE);     if (!a)         exit(0);      while(1)     {         scanf("%d",&n);         if(n==-1)             break;         a[k1++]=n;         if (k1 % MAX_SIZE == 0) {             a = (int *)realloc(a, sizeof(int) * (k1+MAX_SIZE));             if (!a)                 exit(0);         }      }      b = (int *)malloc(sizeof(int) * MAX_SIZE);     if (!b)         exit(0);      while(1)     {         scanf("%d",&n);         if(n==-1)             break;         b[k2++]=n;          if (k2 % MAX_SIZE == 0) {             b = (int *)realloc(b, sizeof(int) * (k2+MAX_SIZE));             if (!b)                 exit(0);         }     }      ReArry(a,k1);     ReArry(b,k2);     l1 = CreatList(a,k1);     printf("=====\n");     l2 = CreatList(b,k2);      free(a);     free(b);     return 0; }  List CreatList(int x[],int n) {     List L,p,q;      L = (List)malloc(sizeof(struct Node));     p = L;     for(int i = 0 ; i < n; i ++){         printf("ok");         q = (List)malloc(sizeof(struct Node));         if (!q)             exit(0);         q -> Data = x[i];         p->Next = q;         p = q;     }     p -> Next = NULL;     return L; }  //int* ReArry(int *x,int n) void ReArry(int *x,int n) {     int i,j,t;     for(i=0;i<n-1;i++)     {         for(j=i+1;j<n;j++)         {             if(x[i]>x[j])             {                 t = x[i];                 x[i] = x[j];                 x[j] = t;             }         }     }     //return x; } 供参考～   创建链表的部分有问题； 其他个人不很好的地方一并修改了，可以参考一下；

引用 1 楼 真相重于对错 的回复:你使用了没有初始化的对象 List CreatList(int x[],int n){ List L,p,q; L = (List)malloc(sizeof(struct Node));//你只在这里malloc p = L;  for(int i = 0 ; i < n; i ++){ printf("ok"); L -> Data = x[i]; q = L; L = L -> Next;//然而在这里的next并没有malloc } L -> Next = NULL; return p; }  这里应该用循环来给L的每个结点分配内存


Question: 单链表的合并

//合并两个有序的单链表 linklist mergelinklist(linklist LA,linklist LB)     //将递增有序的单链表LA和LB合并成一个递增有序的单链表LC {     node *pa,*pb, *t;     linklist LC,r;     //r=(linklist)malloc(sizeof(node));//多余       //将LC初始值空表，pa和pb分别指向两个单链表LA,LB中的第一个节点，r初值为LC且r永远指向LC的表尾     pa=LA->next;     pb=LB->next;     LC=LA;     LC->next=NULL;     r=LC;       while (pa && pb) {         if (pa->data == pb->data) {             r->next = pa;             r = pa;             pa = pa->next;              t = pb;             pb = pb->next;             free(t);         }         else if (pa->data < pb->data) {             r->next = pa;             r = pa;             pa = pa->next;         } else {             r->next = pb;             r = pb;             pb = pb->next;         }     }     r->next = NULL;      if (pa)         r->next = pa;     if (pb)         r->next = pb;      //当两个标中均未处理完是，比较选择较小的节点插入到新表LC中     /*     while(pa!=NULL&&pb!=NULL)     {         if(pa->data<=pb->data)         {r->next=pa; r=pa; pa=pa->next;}         else         {r->next=pb; r=pb;pb=pb->next;}     }     if(pa)       //若表L未完，将表LA的后续元素链到新表LC的表尾         r->next=pa;     else         //否则将LB中的后续元素链到新表LC表尾         r->next=pb;         */     free(LB);     return LC; } 修改一下r变量不需要申请空间哦。

#include<stdio.h> #include<stdlib.h> #include<malloc.h>  //单链表的定义 typedef int elemtype; typedef struct node {     elemtype data;     struct node *next; }node,*linklist;  //单链表的初始化 void initlist(linklist *l) {     //l=(linklist)malloc(sizeof(node));     //(l)->next=NULL;     (*l)->next=NULL; } //头插法建立单链表 void createfromhead(linklist l) {     node *s;     char c;     //int flag=1;     //while(flag)     while(1)     {         if ((c = getchar()) == '0')             break;         s=(node*)malloc(sizeof(node));         s->data=c;         s->next=l->next;         l->next=s;         /*         c=getchar();         if(c!='0')         {             s=(node*)malloc(sizeof(node));             s->data=c;             s->next=l->next;             l->next=s;         }         else             flag=0;             */         //getchar(); //接收换行符     } } //合并两个有序的单链表 linklist mergelinklist(linklist LA,linklist LB)     //将递增有序的单链表LA和LB合并成一个递增有序的单链表LC {     node *pa,*pb, *t;     linklist LC,r;     r=(linklist)malloc(sizeof(node));       //将LC初始值空表，pa和pb分别指向两个单链表LA,LB中的第一个节点，r初值为LC且r永远指向LC的表尾     pa=LA->next;     pb=LB->next;     LC=LA;     LC->next=NULL;     r=LC;       while (pa && pb) {         if (pa->data == pb->data) {             r->next = pa;             r = pa;             pa = pa->next;              t = pb;             pb = pb->next;             free(t);         }         else if (pa->data < pb->data) {             r->next = pa;             r = pa;             pa = pa->next;         } else {             r->next = pb;             r = pb;             pb = pb->next;         }     }     r->next = NULL;      if (pa)         r->next = pa;     if (pb)         r->next = pb;      //当两个标中均未处理完是，比较选择较小的节点插入到新表LC中     /*     while(pa!=NULL&&pb!=NULL)     {         if(pa->data<=pb->data)         {r->next=pa; r=pa; pa=pa->next;}         else         {r->next=pb; r=pb;pb=pb->next;}     }     if(pa)       //若表L未完，将表LA的后续元素链到新表LC的表尾         r->next=pa;     else         //否则将LB中的后续元素链到新表LC表尾         r->next=pb;         */     free(LB);     return LC; } void PrintList(linklist l) {     linklist p=l->next;     while(p)     {         printf("%c\n",p->data);         p=p->next;     } } //void main() int main(void) {     linklist LA,LB,LC;     LA= (linklist)malloc(sizeof(node));     LB= (linklist)malloc(sizeof(node));     //LC= (linklist)malloc(sizeof(node));     initlist(&LA);     initlist(&LB);     initlist(&LC);     createfromhead(LA);     PrintList(LA);     createfromhead(LB);     PrintList(LB);     //mergelinklist(LA,LB);     LC = mergelinklist(LA,LB);     PrintList(LC); }  供参考～  链表操作还需要再多下功夫，对比代码找一下自己的问题吧～

错误不少，LA已经通过malloc初始化了，再在initlist里面malloc有何用？而且initlist参数是node* ,在initlist里面的malloc根本无法影响外边的LA 而且，你的合并是把两个有序的链表合并，但是createfromhead获得的并不是有序链表，合并必然不对

@自信男孩 你的那个代码好像不对这，执行结果的时候输不进去数字


Question: c语言求多个数组的共同元素，并返回共同元素数组

真心求教，谢谢

引用 4 楼 Clutch_K 的回复:引用 2 楼 自信男孩 的回复:比较笨的方法就是依次比较，就是拿第一行的元素和第二行的比较，找到第一个相同的元素，然后拿第一个相同的和第三行的元素比较，如果在第三行找到相同的，就在和第四行比较，否则从第一行拿一个新元素和第二行比较，也是找到相同（第二个相同的）和第三行的元素比较，找到相同的和第四行比较，依次操作～这样差不多就是取交集的意思吧，两两比较，最后得到所有行的交集？ 恩，对～


Question: 小白求助

for example int main(){     int x1,y1,x2,y2,x,y;     scanf(“%d%d”, &x1,&y1);     scanf(“%d%d”, &x2,&y2);     scanf(“%d%d”, &x,&y);     if(x<x1 ll x>x2 || y<y1 || y>y2)          printf(“OUT”);     else         printf(“IN”);     return 0; }

顶一下Monash


Question: 麻烦大佬帮我看一下哪里错了，十分感谢！(数据结构中的循环链表)

😂😂，马虎了

函数调用不能再加返回值类型了。去掉main函数里CreateListF前的void，开始我还以为是函数声明呢，仔细一看是函数调用～


Question: 想做一个链表操作的实验报告，求教

先自己试着写写，遇到问题再提出来～

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

自已先写一个最简单的头插和头删吧，这样对链表有一个基本的理解。


Question: C语言编译错误

应该是在一个工程里出现了多个源文件，且这些源文件里有多个main函数定义，错误提示已经很明确了，multiple definition main

引用 1 楼 user-3的回复:你的工程怎么管理的？提示main函数重复定义了。 栈的十进制转换其他进制.c 和 你贴出来的c文件 是什么关系？在同一个工程？ 还有，Stack.h都有啥了？是不是栈的十进制转换其他进制.c引入了该头文件？  把你的工程管理（或文件夹结构）的图贴出来 新建一个项目就可以了

重新新建一个工程试试，感觉是你新建工程的问题。 https://jingyan.baidu.com/article/b7001fe1a894c10e7282ddbe.html


Question: c语言shu'zu

引用 5 楼 m0_46244162 的回复:[quote=引用 1 楼 qybao的回复:]你理解的最后一个元素是指哪个？ 比如数组a[5]，最后一个元素是a[4]没问题，可以赋值，但是a[5]就有问题了，数组越界。数组下标是从0-4一共5个元素 大佬请问这个会有例外的情况吗 比如字符串数组不可以 但是整型数组就可以 例如楼下这个回答说的 [/quote] 没有例外，字符串最后的结束符也是自己保证的，你不设，它就没有结束符。

只要是在数组内，都可以赋值的。建议楼主贴出代码吧，如果出现错误，很可能是越界导致的。在栈上不建议定义大数组～

引用 1 楼 qybao的回复:你理解的最后一个元素是指哪个？ 比如数组a[5]，最后一个元素是a[4]没问题，可以赋值，但是a[5]就有问题了，数组越界。数组下标是从0-4一共5个元素 大佬请问这个会有例外的情况吗 比如字符串数组不可以 但是整型数组就可以 例如楼下这个回答说的

引用 1 楼 qybao的回复:你理解的最后一个元素是指哪个？ 比如数组a[5]，最后一个元素是a[4]没问题，可以赋值，但是a[5]就有问题了，数组越界。数组下标是从0-4一共5个元素 大佬 这个会有例外的情况吗 比如字符串数组不可以 整型数组就可以 会有这种情况？？

引用 2 楼 user-3的回复:[quote=引用 楼主 m0_46244162 的回复:]请问c语言数组的最后一个元素不能赋值吗  看情况把 整型数组你可以随便赋值  对于字符数组，你也可以将它当成字符串来看，一般字符串结尾都有一个\0代表结束 通常字符串或者字符数组 都习惯用指针去操作它  用指针操作字符串有一个重要条件：根据末尾是否为\0来判断指针是否到达字符串结尾 如果你把字符数组的最后一个元素赋值 那你用指针操作这个字符串的时候 很容易出现数组越界的话题  因为你不知道字符串到底结尾了没有[/quote] 可以随便赋值吗？怎么会报错说破坏了栈堆

引用 楼主 m0_46244162 的回复:请问c语言数组的最后一个元素不能赋值吗  看情况把 整型数组你可以随便赋值  对于字符数组，你也可以将它当成字符串来看，一般字符串结尾都有一个\0代表结束 通常字符串或者字符数组 都习惯用指针去操作它  用指针操作字符串有一个重要条件：根据末尾是否为\0来判断指针是否到达字符串结尾 如果你把字符数组的最后一个元素赋值 那你用指针操作这个字符串的时候 很容易出现数组越界的话题  因为你不知道字符串到底结尾了没有


Question: CCF模拟题用C答题不能用for循环吗？

引用 5 楼 m0_51355118的回复:应该是楼上说的，有些比较老的编译器不支持c99，换个编译器就好了，或者把声明放在前面也可以 但那是CCF的模拟题，只提交代码

那就在int 一行加个i int i,r.... for(i=1;…

楼主的C编译器吧，C++支持for (int i=0;...这样的定义变量方式，C编译器应该是不支持的。（也可能是编译器支持的C标准比较低，不支持C99导致的）  把int i定义在for循环外应该就可以了～

for (int i = 1; 这样的局部循环变量需要c99支持，不支持的话需要把int i声明提出去

报的什么错？

引用 1 楼 m0_51355118的回复:报的什么错？ 编译错误……


Question: 大佬看看我，第一次写数据结构，有输入，没输出，不知道哪里错了

#include<stdio.h> #include<stdlib.h> typedef struct list {     int data;     struct list *next; }link;  void initlist(link *&l,int a[],int n) {     link *p, *tail;//=l;     l = (link*)malloc(sizeof(link));     tail = p = l;     for(int i=0;i<n;i++)     {         p = (link *)malloc(sizeof(link));         if (!p)             exit(0);         p->data = a[i];         tail->next = p;         tail = p;     }     tail->next = NULL; }  int listempty(link *l) {     //return (l->next==NULL);     return (l->next==NULL); }//判断是否是空表 int listlength(link *l) {     int n=0;     link *p=l;     while(p->next!=NULL)     {         n++;         p=p->next;     }     return (n); }//求线性表的长度 void displist(link *l) {     link *p=l->next;     while(p!=NULL)     {         printf("%d",p->data);         p=p->next;     }     printf("\n"); }//输出线性表 int main() {     int n;     scanf("%d",&n);     link *l;     //int a[n];     int *a = (int *)malloc(sizeof(int) * n);     for(int i=0;i<n;i++)     {         scanf("%d",&a[i]);     }     initlist(l,a,n);     listempty(l);     printf("%d\n",listlength(l));     displist(l);     return 0; } 供参考～ 链表创建有问题，建议对比代码找一下自己的问题～

学会单步调试。


Question: 请问为static 指针ar的分配内存是否被释放？

static没什么必要性，这里有没有不影响正确性。

刚才查c primer plus 里面讲的比较明确，free 释放可以不是malloc 申请内存是的指针变量，只要free的参数指针是申请时的地址即可。然后做了猜想系统记录了malloc申请的地址及大小信息，刚刚又在网上找到一段话也验证了自己的猜想，“为什么可以正确的释放正确大小的地址，有的编译器会这样操作，malloc会在首地址前8个字节的高4存放page id,低4存放size，free可以从这里取到dao存的大小，依赖编译器的不同实现方法不同，仅供你参考。 ” 另外上面的程序 可以不用static 修饰，也可以正确执行。如果在test中用数组，必须使用static，但是static又不支持变长数组。这时候必须使用指针来分配内存的方式实现。

程序运行期间不会释放，也就是它指代的地址不会再变了，内容可能会变，但指代的地址不会变

已经被释放了，你可以输出其内容看一下 #include <stdio.h> #include <malloc.h> int *test(int); int main() {    int *p = NULL;    int *d = NULL;    int b = 5;    printf("\n%d %d\n",d,p);    scanf("%d", &b);    d = p = test(b);    for (int i = 0; i < b; i++){       printf("%d ", *(p));    }    printf("\n%d %d %d %d\n",d,p,*d,*p);    free(d);    printf("\n%d %d %d %d\n",d,p,*d,*p);    return 0; }  int *test(int b) {    static int *ar;    ar = (int *)malloc(sizeof(int) * b);    for (int i = 0; i < b; i++)       ar[i] = i;    printf("%d %d\n",ar,*ar);    return ar; }   结果如下： 0 0 3 42604304 0 0 0 0 42604304 42604304 0 0  42604304 42604304 42603968 42603968

引用 楼主 学码就是爱好 的回复:请问为static 指针ar的分配内存是否被释放？ #include <stdio.h> #include <malloc.h> int *test(int); int main() {     int *p=NULL;     int *d=NULL;     int b=5;     scanf("%d",&b);     d=p=test(b);     for(int i=0;i<b;i++)     printf("%d ",*p++);     free(d);     return 0; }  int *test(int b) {    static int *ar;    ar=(int *)malloc(sizeof(int)*b);     for(int i=0;i<b;i++)         ar[i]=i;     return ar; }  你在main中的free就是释放，虽然是在test函数中malloc，没毛病

调试一下, 我觉得是被释放了..因为三个指针都是指向的都是同一个区域.

会 main的d和test的ar指向同一块内存，释放d就等于释放ar

引用 7 楼 自信男孩 的回复:楼主用static定义的是arr指针变量，这只是说明指针变量不会随着函数调用结束而释放，应arr变量是在数据段申请的，它的生命周期是从定义开始知道程序退出。但是这和malloc没关系哦。这个指针指向的内容是可以变化的。 提问时没主意static的必要性，后面我自己跟的帖子已经对相关问题进行了说明，另外关于释放也做了解释，c primer plus 的内容提问时还没看到，后来发现书上描写的很明确。不过还是感谢答疑


Question: VS2017显示触发一个断点，但并没有任何其他提示

引用 3 楼 自信男孩的回复:conver *node = (conver *)malloc(sizeof(node)); 这儿的node指向的内容申请的空间长度是sizeof(conver *);改成这样：  conver *node = (conver *)malloc(sizeof(*node)); 但是不建议这样写，因为不很容易理解，不能一眼看出，可以改成这样  conver *node = (conver *)malloc(sizeof(conver)); 谢谢大佬

引用 2 楼 user-2的回复:改成 covert *node = (covert*)malloc(sizeof(conver));  node是个指针，sizeof(node)只有4个字节（64位系统是8个字节），convert是个结构体，sizeof(convert)有8+4（或8）=12（或16）个字节。 显然，申请内存空间不足，就可能造成内存非法访问。 那为什么前面的那个main函数里的malloc没有出错呢

引用 6 楼 user-2的回复:[quote=引用 4 楼 MancoCL 的回复:][quote=引用 2 楼 user-2的回复:]改成 covert *node = (covert*)malloc(sizeof(conver));  node是个指针，sizeof(node)只有4个字节（64位系统是8个字节），convert是个结构体，sizeof(convert)有8+4（或8）=12（或16）个字节。 显然，申请内存空间不足，就可能造成内存非法访问。 那为什么前面的那个main函数里的malloc没有出错呢[/quote] 我之所以用了可能这个词，就是说它未必就会运行出错，但一定是危险行为。指针指向的内存空间不够，就好比 数组越界 一样，越界出去的内存操作，会带来什么影响是不确定的，如果越界出去的内存是不允许读写的，就会造成非法访问；即使是可读写的，也会造成该内存的数据破话（不是你自己的东西你却修改了），这样是非常危险的。所以要按照正确的使用大小来分配内存。 [/quote] 明白了，谢谢大佬啊

引用 4 楼 MancoCL 的回复:[quote=引用 2 楼 user-2的回复:]改成 covert *node = (covert*)malloc(sizeof(conver));  node是个指针，sizeof(node)只有4个字节（64位系统是8个字节），convert是个结构体，sizeof(convert)有8+4（或8）=12（或16）个字节。 显然，申请内存空间不足，就可能造成内存非法访问。 那为什么前面的那个main函数里的malloc没有出错呢[/quote] 我之所以用了可能这个词，就是说它未必就会运行出错，但一定是危险行为。指针指向的内存空间不够，就好比 数组越界 一样，越界出去的内存操作，会带来什么影响是不确定的，如果越界出去的内存是不允许读写的，就会造成非法访问；即使是可读写的，也会造成该内存的数据破话（不是你自己的东西你却修改了），这样是非常危险的。所以要按照正确的使用大小来分配内存。

补充：在点击继续后显示——0x76FAFA1D (ntdll.dll) (数据结构实验二.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x76FEB960)。


Question: scanf格式字符为%f，但输入为符号时变死循环

感谢各位的帮助，我现在对scanf又多了一些理解，现更正代码如下，再也不怕故意输错了 #include <stdio.h>  int main() { 	double d1,d2,d3; 	unsigned char op,noError=1;  	while(1) 	{ 		printf("请输入算式，如3+2等：");  		while(scanf("%lf%c%lf",&d1,&op,&d2)!=3) //scanf的返回值为正确获取的数据的个数量 		{ 			printf("输入错误，请输入包含两个数的算式，如3+2等："); 			rewind(stdin);	//当输错式子时，清空输入缓存，以免死循环 		}  		rewind(stdin);		//当故意输入超过两个数的算式时，不清空缓存会导致下一次计算出错  		switch(op) 		{ 			case '+':d3=d1+d2;break; 			case '-':d3=d1-d2;break; 			case '*':d3=d1*d2;break; 			case '/':	if(d2!=0) 									d3=d1/d2; 								else 								{ 									printf("除数不能为0！\n"); 									noError = 0; 								} 								break; 			default :printf("输入错误，请重新输入！");noError = 0; 		} 		if(noError) 			printf("%-5.2f%c%-5.2f=%-5.2f\n",d1,op,d2,d3);  		noError = 1; 	}   return 0; }

输入格式校验的水很深！ 我预测AI在10年内都搞不定。 程序员都因此而不会失业。

再供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

简单点说意思大概是这样的：scanf 想要一个固定格式的输入， 但是你输入错误了，所以第一次循环的时候，scanf 并没有消耗掉你输入的字符串，那么你输入的错误字符串仍然存在，并且等待被消耗，这个时候你的 while 又开始循环了，也就是你每一次循环，scanf 都在你输入的错误字符串中寻找答案，但是都没有找到， 于是错误的字符串还在输入缓存里，rewind 大概的意思，把输入缓存（实际上是输入流，输入缓存是为了方便你理解，两者差别很大）清空，这样scanf 发现输入缓存中没有东西，它就会等待你的再次输入

引用 2 楼 赵4老师的回复:#include <stdio.h>  int main() {     double d1,d2,d3;     unsigned char op,noError;      while(1) {         printf("请输入算式，如3+2等(Ctrl-C退出)：");         rewind(stdin);         if (3==scanf_s("%lf%c%lf",&d1,&op,&d2)) {             noError=1;             switch (op) {             case '+':d3=d1+d2;break;             case '-':d3=d1-d2;break;             case '*':d3=d1*d2;break;             case '/':                 if (d2!=0) {                     d3=d1/d2;                 } else {                     printf("除数不能为0！\n");                     noError=0;                 }             break;             default:                 printf("输入错误，请重新输入！\n");                 noError=0;             }             if (noError) printf("%-5.2lf%c%-5.2lf=%-5.2lf\n",d1,op,d2,d3);         } else {             printf("输入错误，请重新输入！\n");         }     }      return 0; }  看不懂（＃－.－）我是初学者一个我先去百度一下rewind是干啥的

引用 1 楼 自信男孩的回复:scanf_s("%lf%c%lf",&d1,&op, 1, &d2); 缺少一个参数。因为%c需要指定内存大小；  输入的格式需要注意下，因为中间是%c，因此d1和d2之间只能有一个字符，多余一个字符这个结果就不一样了，建议在scanf_s下面打印一天语句把d1, op, d2打出来和你的输入对比一下 我不明白为什么输错后，进入下一次循环时，似乎没有执行scanf语句——输错了也只是这一次错了，在下一次循环时应该是重新等待输入啊


Question: 找不到错误

引用 1 楼 user-2 的回复:while (a > 0)     {         a = n;         b = a % m;         a = a / m;         s.push(b);     } n不变  则a不变  则a/m不变  则死循环  则无限push  则越界  则引发异常 引用 3 楼 自信男孩 的回复: while (a > 0)     {         a = n;   //这条语句为什么要在这里赋值，在while外已经赋值了。因为n没有做修改，因此每次a都会被赋值初始值，这样就会导致死循环。         b = a % m;         a = a / m;         s.push(b);     }  糊涂了，谢谢大佬

哦 漏了m不变


Question: 本人初学者，两个问题求解答，谢谢。

#include <stdio.h> int main(int argc,char*argv[]) { 	float a,b,c; 	scanf("%f %f",&a,&b); 	b=b*10; 	b=(int)b/50; 	if(a<=3) 		c=10+b*1.8;     else 	{ 		a=(a-3)*10; 		a=(int)a/5; 		c=10+b*1.8+a*0.9; 	} 	    printf("%.2f\n",c); 	return 0; }

引用 7 楼 自信男孩 的回复:[quote=引用 4 楼 千梦一生 的回复:] 要能解答就解答，不能说那么多无用的做啥？不明白的地方，可以做一下引导，不用把自己放在高高在上的位置上，总是俯视别人，先正视一下自己的位置吧[/quote]  引用 5 楼 gezi2333 的回复:看清楚再说好吗？初学者是才开始学习的人的意思，我是希望有人帮我解决问题的，不是要你来骂人的。 实际上我没有骂人，我就是这么想的这么说的。 论坛上这样的人太多了，仍一道题出来就走。布置作业呢？  我说这么多是仍楼主好好想想这个问题。 我没必要俯视谁。  楼主说的初学者意思我也认识到了仅仅是初学的意思。 我只是借学者这个个名词与楼主说说（我个人认为的）他的问题。  授人以渔不如授人以渔。这是一个普遍认可的观点。 ------------------------------------------------------------------ 不过说的话从结果上你确实是引起了两位的不适，那说明我的言论中确实是存在问题。以后应当在言辞说法上多计较、考量一番。 ------------------------------------------------------------------ 楼主回一句。1.我无意侮辱或骂你。2.像你这种帖子不少我过去都不愿回复的。但这次回复了你，其中有无道理你可选择自行参考。 回这楼上一句。我并无高高在上之意。我回头看了一下。那一楼回复中不扣否认参杂了两点：1.是经久以来对这种布置作业的贴的气郁。2.回复的字面意思就是让楼主说说学习上遇到了什么困难，而不是过来布置老师给他布置的作业的。

帮你解决问题是因为你代码出现了bug,不知道如何解决，然后我们才可以帮你，直接给个题目，这是出题老师？

引用 4 楼 千梦一生 的回复:既然是学者，那学到了什么？ 如果学习时有困难学不到。 学习上遇到的困难是什么？ 你这是出题老师，不是学者 不要侮辱学者这两个字。 要能解答就解答，不能说那么多无用的做啥？不明白的地方，可以做一下引导，不用把自己放在高高在上的位置上，总是俯视别人，先正视一下自己的位置吧

代码呢？一行代码都没有呢～

问题就是将这个题目的要求用c语言写出来，能够满足题目要求

然后呢，问题是啥，你这是题目啊


Question: 结构体定义

请参考《C++中typedef与const、指针》 希望能够帮到您！

引用 楼主 肥牛肉^*^ 的回复:typedef struct｛ int a； int b； ｝stu；这样为什么可以定义，struct后面没有结构体名呀，这个和struct｛int a；                                    int b；                                  ｝stu；有什么区别吗 struct后面的是结构体标号，是可以省略的 typedef struct｛ int a； int b； ｝stu；---> stu是结构体类型 stu abc; ---> abc是结构体变量名  struct｛int a；              int b； ｝stu；---> stu是结构体变量名 其类型为 struct｛int a；              int b； ｝;

typedef struct｛ int a； int b； ｝stu; //是自定义类型，红色部分是原来的类型（是一个匿名结构体），蓝色部分是新类型（是个类型名字），新类型（名字）等价于原来的（结构体）类型  struct｛ int a； int b； ｝stu; // 是变量声明，红色变量是类型（匿名结构体，也就是没名字的结构），蓝色部分是变量

不建议这么定义，结构体不宜阅读～


Question: 关于二叉树中序线索化的函数

仅供参考：#include <locale.h> #include <stdio.h> #include <stdlib.h> #include <malloc.h> typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int nn=0; int CreateBiTree(BiTree *T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         *T = NULL;     } else {         *T = (BiTree)malloc(sizeof(BiTNode)); nn++;         (*T)->data = data;         //生成根结点         CreateBiTree(&(*T)->lchild);//构造左子树         CreateBiTree(&(*T)->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             p = p->rchild;          //访问右子树         }     }     free(stack); } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     BiTree *stack=(BiTree *)malloc(nn*sizeof(BiTree));     int sp=0;     BiTree p = T;//p是遍历指针     while (p || sp) {   //栈不空或者p不空时循环         if (p != NULL) {             stack[sp]=p;sp++;       //存入栈中             p = p->lchild;          //遍历左子树         } else {             sp--;p=stack[sp];       //退栈             printf("%c ",p->data);             p = p->rchild;          //访问右子树         }     }     free(stack); }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     BiTreePost *stack=(BiTreePost *)malloc(nn*sizeof(BiTreePost));     int sp=0;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || sp) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack[sp]=BT;sp++;       //存入栈中             p = p->lchild;         }         while (sp && (stack[sp-1])->tag == 'R') {//左右子树访问完毕访问根节点             sp--;BT=stack[sp];        //退栈             printf("%c ",BT->biTree->data);             free(BT);         }         if (sp) {//遍历右子树             BT=stack[sp-1];             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     }     free(stack); } void LevelOrder(BiTree T) {//层次遍历     BiTree p;     BiTree *queue;     int h=0,t=0,n=0;      if (T == NULL) return;     p=T;     queue=(BiTree *)malloc(nn*sizeof(BiTree));     queue[t]=p;t=(t+1)%10;n++;//根节点入队     while (n) {    //队列不空循环         p=queue[h];             //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         h=(h+1)%10;n--;         //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue[t]=p->lchild;t=(t+1)%10;n++;         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue[t]=p->rchild;t=(t+1)%10;n++;         }     }     free(queue); } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(&T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G

要判定，我猜。

引用 楼主 weixin_45906870 的回复:typedef enum{Link, Thread} PointerTag; //Link==0 表示指向左右孩子指针 //Thread==1 表示指向前驱或后继的线索  struct TreeNode{     int data;     struct TreeNode *left, *right;     PointerTag LTag, RTag; };  struct TreeNode *pre; //全局变量  void InThreading(struct TreeNode *p){     if (p){         InThreading(p->left);    //递归左子树线索化         if (!p->left){             p->LTag = Thread;             p->left = pre;         }         if (pre && !pre->right){             pre->RTag = Thread;             pre->right = p;         } //我对这个函数的理解应该是没有问题的，但是我在《大话数据结构》上看到作者把这个函数中的一部分改成下面红色字体的那样，没有加上pre为真这个判定条件，结果搞得我一头雾水。我想问的是，改下下面红色字体那样子的话是对的吗？为什么？在判定pre->right为假之前是否要先判定pre为真？  /*         if (!pre->right){             pre->RTag = Thread;             pre->right = p;         }         */         pre = p;         InThreading(p->right);  //递归右子树线索化     } } 那就看pre是否赋过初始值，如果赋过就没问题 因为后面的 pre = p; 是在 if(p)的前提下（也就是p不为NULL的前提下）赋值的，所以后面的递归不会导致 pre 为NULL


Question: 求助，请问我这个为什么没达到想要的目的？（自行输入两个多项式并求和并输出）

#include <stdio.h> //#include "List.h" #include <stdlib.h> #include <math.h> #include <unistd.h>  struct Node; struct PN; typedef struct Node Node; typedef struct PN ElemType; typedef struct Node* Polynomial; typedef struct Node *List;//List L == Node *p; typedef Node* Position; int Is( ElemType a, ElemType b ); int IsEmpty( List L ); int IsLast( Position p, List L ); Position Find( ElemType X, List L ); void Delete( ElemType X, List L); void Insert( ElemType X, List L, Position P ); List InitList(); ElemType InitPN(); Polynomial CreatePolynomial( int n ); Polynomial AddPolynomial( Polynomial Pa, Polynomial Pb); void PrintPN( Polynomial PN );  //程序： //#include <stdio.h> //#include "List.h" // struct PN {     double coef;     int expn; };   struct Node {     ElemType data;     //struct LNode *next;     struct Node *next; };  int main() {     Polynomial Pa,Pb,Pc;      Pa = CreatePolynomial( 2 );     PrintPN( Pa );      Pb = CreatePolynomial( 3 );     PrintPN( Pb );      Pc = AddPolynomial( Pa, Pb );     PrintPN(Pc);      return 0; }     int IsEmpty( List L )//测试链表L是否为空表 {     return L -> next == NULL; }  int IsLast( Position p, List L )//此元素是否为表中最后一个元素 {     return p -> next == NULL; }  Position Find( ElemType X, List L ) {     Position P;      for( P = L; P; P = P->next)     {         if(Is( P -> data, X))         {             printf("Find it!");             break;         }     }     //if( P = NULL ) printf("Can't Find!");     if( P == NULL ) printf("Can't Find!");      return P; }  int Is( ElemType a, ElemType b ) {     int bool_val = 0;     if( a.coef == b.coef && a.expn == b.expn )         bool_val = 1;     else         bool_val = 0;      return bool_val; }  void Delete( ElemType X, List L) {     Position P, TmpCell;      P = Find( X, L );      if( P != NULL )     {         TmpCell = P;          P = P->next;          free(TmpCell);     } }  void Insert( ElemType X, List L, Position P ) {     Position TmpCell;      TmpCell = (Position)malloc( sizeof( struct Node ) );      if( TmpCell == NULL )     {         printf( "Out of Space" );     }      TmpCell -> next = P -> next;     P -> next = TmpCell; }//要保证TmpCell非NULL  List InitList() {     List L;      L = (List)malloc( sizeof( struct Node ) );      L->data = InitPN();      L->next = NULL;      return L; }  ElemType InitPN() {     ElemType PN;     PN.coef = 0;     PN.expn = 0;      return PN; }  struct PN CreatPN() {     ElemType PN;      printf( "请输入系数、项数：");     scanf( "%lf %d", &PN.coef, &PN.expn);      return PN; }  Polynomial CreatePolynomial( int n ) {     List L = InitList();     Position P = L;       for( int i = 1; i <= n; i++)     {         Position s = (Position)malloc( sizeof( struct Node ) );          printf( "请输入系数、项数: ");         scanf("%lf %d", &s -> data.coef, &s -> data.expn);         Position pre = L, q = L -> next;           while( q && q -> data.expn < s -> data.expn)         {             pre = q;             q = q -> next;         }         s -> next = q;         pre -> next = s;      }      return L; }  Polynomial AddPolynomial( Polynomial Pa, Polynomial Pb) { #if 0     Polynomial p1, p2, p3, r;      p1 = Pa->next;     p2 = Pb->next;     p3 = Pa;       while (p1 && p2) {         if (p1->data.expn == p2->data.expn) {             p1->data.coef += p2->data.coef;              if (fabs(p1->data.coef) < 1e-6) { //equal 0                 r = p1;                 p1 = p1->next;                 free(r);                 r = p2;                 p2 = p2->next;                 free(r);             } else {                 r = p1;                 p3->next = r;                 p3 = r;         printf("%.1lf\n", p3->data.coef);                 p1 = p1->next;                 r = p2;                 p2 = p2->next;                 free(r);             }         } else if (p1->data.expn < p2->data.expn) {             p3->next = p1;             p3 = p1;         printf("%.1lf\n", p3->data.coef);             p1 = p1->next;         } else {             p3->next = p2;             p3 = p2;         printf("%.1lf\n", p3->data.coef);             p2 = p2->next;         }          //printf("p1: %p, p2: %p, p3: %p\n", p1, p2, p3);     }     p3->next = NULL;      if (p1)         p3->next = p1;     if (p2)         p3->next = p2; #else     Position p1 = Pa -> next, p2  = Pb -> next;     Position p3 = Pa;      while( p1 && p2 )     {         if ( p1 -> data.expn == p2 -> data.expn)         {             double sum = p1 -> data.coef + p2 -> data.expn;              //if( sum != 0 )             if( fabs(sum) > 1e-6)             {                 printf("sum = %.1lf\n", sum);                 p1 -> data.coef = sum;                 p3 -> next = p1;   //加上这句                 p3 = p1;                 p1 = p1->next;                 Position r = p2;                 p2 = p2 -> next;                 free( r );             }             else             {                 Position r1 = p1, r2 = p2;                 p1 = p1 -> next;                 p2 = p2 -> next;                 free( r1 );                 free( r2 );             }          }         else if (p1 -> data.expn < p2 -> data.expn)         {             Position r = p1;             p3->next = r;             p3 = r;             p1 = p1->next;         }         else         {             p3 -> next = p2;             p3 = p2;             p2 = p2 ->next;         }     }     p3->next = NULL;      if (p1)         p3->next = p1;     if (p2)         p3->next = p2;     /*     if( p1 == NULL )     {         p3 -> next = p2;     }     else     {         p3 -> next = p1;     }     */      free( Pb ); #endif     return( Pa ); }  void PrintPN( Polynomial PN ) {     int cnt = 1;     for( Position p = PN->next; p; p = p -> next )     {         //printf("%fX^%d + ", PN -> data.coef, PN -> data.expn );         //printf("%lfX^%d + ", PN -> data.coef, PN -> data.expn);         printf("%.1lfX^%d + ", p-> data.coef, p-> data.expn);         if( cnt % 5 == 0)         {             printf( "\n" );         }         cnt++;     }     putchar(10); } 供参考～  建议找一下自己的问题～


Question: 构造线性表过程  有错误改不处  求指教

楼主的编译器应该是C，而不是C++，因为&是C++的语法符号，C语言编译器不识别和支持。  可以考虑用指针代替&

你这是c语言，还是c++呢？ 如果是c，他没有引用，因此Sqlist& 这句是错误的

最好把你的代码贴出来 图片无法判断某些具体内容 比如L.length = 0 我瞅着分号像是中文的


Question: 数字可能出现重复了，但我没发现逻辑错误

换个思路，先按元素循环，再查找该元素是否与另外两个不同元素的和相等，就可以避免重复了  int main() {     char testdata[]={"5 0 5 1 4 2 3"}, *p=testdata; //用于测试     int n, i, j, k, cnt=0, *a;     //scanf("%d", &n);     n = 7; //用于测试     a = (int*)malloc(sizeof(int)*n);     for(i=0; i<n; i++) { //输入数据         //scanf("%d", &a[i]);         sscanf(p, "%d", &a[i]); p=strstr(p, " ")+1;     }     for(i=0; i<n; i++) { //换一下处理位置，先按元素循环         for (j=0; j<n-1; j++) { //再判断该元素是否与另外两个不同元素的和相等             if(j==i) continue;             for (k=j+1; k<n; k++) {                  if (k==i) continue;                 if (a[j]+a[k]==a[i]) {                     printf("%d=%d+%d\n", a[i], a[j], a[k]);                     cnt++;                     break;                 }             }             if (k<n) break;         }     }     printf("total: %d\n", cnt);     free(a);     return 0; }

有重复是因为上面程序， 在查找数字时， 比如，一个数， 可以有多种满足的数字， 例如： 5 = 2 + 3  也可以时 5 = 1+4 这样 count 会加两次， 但题目只要求计算5是否可以表示， 相当于只要求count+1

#include<stdio.h> #include <stdlib.h> #include<math.h>  int main() {     int n, sum, count=0;//,j,b,i;     int i, j, k;     int *arr;     scanf("%d",&n);      arr = (int *)malloc(sizeof(int) * n);     if (!arr)         return -1;      for(i=0;i < n; i++)         scanf("%d", &arr[i]);       for (i = 0; i < n; i++)         for (j = i+1; j < n; j++) {             sum = arr[i] + arr[j];              for (k = 0; k < n; k++) {                 if (sum == arr[k] && k != i && k != j) {                     printf("%d + %d = %d\n", arr[i], arr[j], arr[k]);                     count++;                 }             }         }  #if 0     for(i=0;i<n;i++)         for(j=0;j<n;j++)         {             if(j==i)                 continue;              for(b=j+1;b<n;b++)             {                 if(b==i)                     continue;                 if(a[i]==a[j]+a[b])                      count++;                }         } #endif     printf("%d\n",count);     free(arr);      return 0; } 供参考～


Question: 大佬帮忙看一下这个c数据结构单链表

问题太多了 main函数中Init_List(t, k); k是int型的 void Init_List(Node &L, Elemtype &n)为什么变成了地址  这个函数中 L->next = NULL; L->next = s;   给空指针赋值？？  void input(Node L) {     Node s, j;     printf("单表输入cur值：\n");     int x;     L->next = s;     j = s;     while (s != NULL)     {         scanf("%d", &x);         s->cur = x;         j = s->next;          s = j;     }   s未初始化 怎么拿来做判断？  其他的懒得检查了  你再看看自己到底想干什么 搞清楚每个函数你的目的

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

#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h>  typedef int Elemtype;  typedef struct List {     Elemtype cur;     struct List *next; }sqlist, *Node;  void Init_List(Node &L,Elemtype &n) {     Node s,k;     int i;      L = (Node)malloc(sizeof(sqlist));     L->next=NULL;     printf("请创表的长度:\n");     scanf("%d", &n);      /*     s=(Node)malloc(sizeof(sqlist));     s->next=L->next;     */      k = L;     for(i=0;i<n;i++)     {          s=(Node)malloc(sizeof(sqlist));         k->next=s;         k=s;     }     k->next=NULL; } //Node Insert(Node &L,Node k,Node j) Node merge(Node &L,Node a, Node b) {     Node p, q, s, t;     L=(Node)malloc(sizeof(sqlist));     L->next=NULL;     printf("开始进行合并\n");      p = a->next;     q = b->next;     s = L;     while (p && q) {         if (p->cur < q->cur) {             s->next = p;             s = p;             p = p->next;         } else if (p->cur > q->cur) {             s->next = q;             s = q;             q = q->next;         } else {             s->next = p;             s = p;             t = q;             q = q->next;             p = p->next;             free(t);         }     }     s->next = NULL;     if (p) {         s->next = p;     }     if (q) {         s->next = q;     }     a->next = NULL;     b->next = NULL;      return L;     /*     L=(Node)malloc(sizeof(sqlist));     L->next=NULL;     printf("开始进行合并\n");     Node p,q,a,c,h;     k->next=p;     q=p;     j->next=a;     c=a;     if(p->cur>a->cur){L->next=p;p=q->next;q=p;}     else{L->next=a;a=c->next;c=a;}     h=L->next;        while(p!=NULL&&a!=NULL)     {         q=p->next;         c=a->next;         if(p->cur>a->cur){h->next=p;h=p;p=q;q=p->next;}         else{h->next=a;h=a;a=c;c=a->next;}     }     return(L);     */ } void order(Node &L) {     Node p,q,r;     Elemtype tmp;       p = L->next;      printf("进行排序：\n");     while (p) {         q = p->next;          while (q) {             if (p->cur > q->cur) {                 tmp = p->cur;                 p->cur = q->cur;                 q->cur = tmp;             }             q = q->next;         }         p = p->next;     }  #if 0     printf("进行排序：\n");     p=L->next;     int t=0;     while(p!=NULL)     {         q=p->next;         r=q->next;         while(q!=NULL)         {             if(p->cur<=q->cur){t=q->cur;q->cur=p->cur;p->cur=t ;}             q=r;             r=q->next;         }          q=p->next;         p=q;     }     printf("结束\n"); #endif } void distory(Node L) {     Node s;     while(s!=NULL)     { s=L->next;         free(L);         L=s;} } void output(Node L) {     Node s,j;     s=L->next;     j=s;     printf("将得到结果：\n");      while(s!=NULL){printf(" %d\n",s->cur);s=j->next;j=s;} } void input(Node L) {     Node s;//,j;     int x;      //L->next=s;     s = L->next;     //j=s;     printf("单表输入cur值：\n");     while(s != NULL)     {         scanf("%d", &x);         s->cur = x;         s = s->next;         //j=s->next;         //s=j;     }     printf("输入结束\n"); }  //void main() int main() {     Node t,r,h;     printf("创建两个表\n");     int k;     Init_List(t,k);     Init_List(r,k);     input(t);     input(r);       order(t);     output(t);     order(r);     output(r);      //h=Insert(h,t,r);     h= merge(h,t,r);     printf("最后得到\n");     output(h);     getchar();     getchar(); }  供参考～


Question: C语言，为什么总是出现40

引用 2 楼 user-1的回复:一般这种问题基本都是输入时用了中文逗号，而scanf格式却是英文逗号 谢谢你啊

一般这种问题基本都是输入时用了中文逗号，而scanf格式却是英文逗号

不好意思，已经解决了，谢谢


Question: 分椰子

不是猴子分桃吗~~~

引用 1 楼 早打大打打核战争 的回复:不是猴子分桃吗~~~??


Question: 分别给两个数组输入值，然后打印，但是打印的值有一个不正确，哪位大佬帮忙看下，小弟感激不尽

如下： int m, n,  i, j, count=0; //输入 scanf("%d", &m); int c[m]; for (i=0;i<m;i++){ scanf("%d", &c[i]); }  scanf("%d", &n); int d[n]; for (j=0;j<n;j++){ scanf("%d", &d[j]); } 原文中的定义实际上并没有给两个数组指定长度。有些IDE 执行的时候会报错告诉你哪的问题。

把int c[m]和int d[n]放在两个scanf和for之间


Question: C++如何用指针从被调函数向主调函数返回多个值

void func(int *a,int *b){    *a=10;    *b=20; } int main(){    int d;   int e;   func(&d,&e);   cout<<d<<e<<endl; }


Question: c语言数据结构：josephus环问题求助。

#include<stdio.h> #include<stdlib.h>  typedef  struct  Lnode {     int data;     struct  Lnode *next; }joseph;  void  Create_List(joseph *L,int n) {     int i;     joseph *p,*s;      p =s = L;      for(i=2;i<=n;i++){         s=(joseph*)malloc(sizeof(joseph));         s->data =i;         p->next=s;         p=s;     }     p->next = L;  }   void show_list(joseph *phead) {     joseph *p;     if (!phead)         return;     p = phead->next;     printf("%d\t", phead->data);     while (p != phead) {         printf("%d\t", p->data);         p = p->next;     }     putchar(10); }  void  Delete_List(joseph *p, joseph *q) {     q-> next = p-> next;     free(p); }   void josephus (joseph *L, const int total, const int s, const int m) {     joseph *p = L, *prev, *del_node;     int cnt = 0, del_val, pos;      while (p && ++cnt != s) {         p = p->next;     }     printf("***%d\\\n", p->data);      //printf("helloworld!\n");     pos = cnt = 0;     prev = p;     while (1) {         pos++;         if (pos == m) {             del_val = p->next->data;             pos = 1;             del_node = p->next;             printf("del: %d\n", del_node->data);             p->next = p->next->next;             free(del_node);             cnt++;             if (cnt == total-1) {                 break;             }         }         p = p->next;         printf("pos = %d\n", pos);         //prev = prev->next;     }      printf("%d\n", p->data);  #if 0     int length;     length= sizeof(L)-1;      int i,j;     static joseph *p,*q,*Y;      p = L;      for(i=1;i<length;i++){         if(i==1){             for(j=1;j<s-1;j++){                 p=p->next;             }             q=p->next;             p-> next= q-> next;             Y->data = q->data;             Y=Y->next;             free(q);         }else{             for(j=1;j<m;j++){                 p=p->next;             }             q=p->next;             p-> next= q-> next;             Y->data = q->data;             Y=Y->next;             free(q);         }      }      printf("\n");       printf("%4d\n",Y->data);     //return L; #endif }   //void main() int main() {     joseph *L=NULL;     int m,n,s;     L = (joseph*)malloc(sizeof(joseph));     L->data=1;     printf ("请输入人数、约定编号数，出列值：\n");     scanf ("%d%d%d", &n, &s, &m);     if ((m> 1000) || (n> 1000))         printf ("输入的人数m，n不合法\n");     else if (s>n)         printf ("输入数据不合法！\n");     else     {         n = 5;         Create_List(L, n);         show_list(L);         printf ("\n");         josephus(L, n, s, m);     } } 供参考～


Question: 为什么C语言做的通讯录无法保存信息在文本里？

#include<stdio.h> #include<stdlib.h> #include<string.h> #include <errno.h>  typedef struct person  //定义一个结构体 {     char name[10]; //姓名     char addr[30]; //地址     char offphnum[15]; //办公电话     char hmphnum[15]; //家庭电话     char mbphum[15]; //移动电话     struct person * next; }listnode,*listlink; //结构体的别名  struct add_person {     char name[10]; //姓名     char addr[30]; //地址     char offphnum[15]; //办公电话     char hmphnum[15]; //家庭电话     char mbphum[15]; //移动电话 };  listlink readfp() //将文件的信息读出并转存入链表中 {     FILE * fp ; //定义文件指针     struct add_person persons;     listnode * s ;     listlink head = NULL , end = NULL ;     fp = fopen("people.txt" , "rb");     if(fp == NULL)     {         printf("cannot open file \n");         return head;     }     fread(&persons , sizeof(struct add_person) , 1 , fp);     while(!feof(fp)) //判断文件是否结束（文件位置指示器是否到达了文件结尾）     {         s=(listnode*)malloc(sizeof(listnode)); //存入链表中         strcpy(s->name , persons.name) ; //提取数据并复制         strcpy(s->addr , persons.addr) ;         strcpy(s->offphnum , persons.offphnum) ;         strcpy(s->hmphnum , persons.hmphnum) ;         strcpy(s->mbphum , persons.mbphum) ;         s->next = NULL;         if(head==NULL)             head=end=s ;         else         {             end->next=s ;             end=s;         }         fread(&persons , sizeof(struct add_person) , 1 , fp) ;     }     return head; }  void Save(listlink head) //保存信息 {     FILE * fp;     static struct add_person persons;     listlink p1;     fp=fopen("people.txt" , "wb");     if (!fp) {         fprintf(stderr, "%s\n", strerror(errno));         return;     }     //for(p1=head ; p1!=NULL ; p1=p1->next);    //多一个分号     for(p1=head ; p1!=NULL ; p1=p1->next)     {         strcpy(persons.name , p1->name);         strcpy(persons.addr , p1->addr);         strcpy(persons.hmphnum , p1->hmphnum);         strcpy(persons.mbphum , p1->mbphum);         strcpy(persons.offphnum , p1->offphnum);         fwrite(&persons , sizeof(struct add_person ) , 1 ,fp);     }     fclose(fp); }  listlink create() //建立通讯录函数 {     listlink s;     listlink head=NULL , end=NULL;     while(1)     {         s=(listlink)malloc(sizeof(listnode));         printf("\n\n\tcreate add_book's file \n");         printf("\n\n\t\tname:('#' is end)\n\t name:");         scanf("%s" , s->name);         if(strcmp(s->name , "#")==0)             break;         printf("\n\nAddr:\toffphnum: \thmphnum: \tmbphnum:\n");         scanf("%s %s %s %s", s->addr , s->offphnum , s->hmphnum , s->mbphum);         s->next=NULL;         if(head==NULL)             head=end=s;         else         {             end->next=s;             end=s;         }     }     free(s);    //last node not be inserted into link     return(head); }  void Show(listlink head) //显示所有信息 {     listnode *p1;     p1=head;     while(p1!=NULL)     {         printf("%s\t", p1->name);         printf("%s\t", p1->addr);         printf("%s\t", p1->offphnum);         printf("%s\t", p1->hmphnum);         printf("%s\t\n", p1->mbphum);         p1=p1->next;     } }  void Delete(listlink *head) //定义一个删除的函数 {     listlink p1 , p2;     char name1[10];     p1=p2=*head;     if(p1==NULL)     {         printf("no record\n");         return;     }     printf("\n\n\tDelete----please input the name");     scanf("%s" , name1); //输入要删除人的姓名     while(strcmp(p1->name , name1)!=0 && p1->next!=NULL)     {         p2=p1;         p1=p1->next;     }     if(strcmp(p1->name , name1)==0) //根据判断情况做相应处理     {         if(p1==*head) {             //p1=p1->next;             *head = (*head)->next;         }         else             p2->next = p1->next;         free(p1);         return;     }     //else         printf("It is not exist in the addr-book!\n"); //要删除的记录不存在 }  void Find(listlink head) //查找指定记录信息 {     listlink p1;     char name1[10];     while(1)     {         p1=head;         printf("\n\n\tFind----please input the name: ('#' is end)\n\t name:");         scanf("%s", name1); //查找人的姓名         if(strcmp(name1,"#")==0)return;         while(strcmp(name1,p1->name)!=0 && p1->next!=NULL)             p1=p1->next;         if(strcmp(name1,p1->name)!=0)             printf("\n\n\tIt is not exist in the addr-book!");         else         {             printf("\tname:%s",p1->name);             printf("\taddr:%s",p1->addr);             printf("\tphnum:%s",p1->offphnum);             printf("\tphnum:%s",p1->hmphnum);             printf("\tphnum:%s",p1->mbphum);         }     } }  void Input(listlink head) //向通讯录追加一个人的信息 {     listlink s , end;     s=(listlink)malloc(sizeof(listnode));     do     {         printf("\n\n\tInput----please input the sb's meg: \n\tname:('#' is end)\n\t name:");         scanf("%s",s->name);         if(strcmp(s->name,"#")==0)             return;         end=head;         if(end==NULL)break;         while((strcmp(end->name, s->name)!=0) && end->next!=NULL)             end=end->next;     }while(strcmp(end->name , s->name)==0);     printf("\n\nAddr:\toffphnum: \thmphnum: \tmbphnum:\n");     scanf("%s %s %s %s", s->addr , s->offphnum , s->hmphnum , s->mbphum);     s->next=NULL;     end->next=s; }  void Alter(listlink head) //改变一个人的信息 {     listlink p1;     char name1[10] , phnum1[15] , phnum2[15] , phnum3[15] , add1[30];     printf("\n\n\tAlter----Please input the sname:");     scanf("%s",name1); //输入要修改人的姓名     p1=head;     while(strcmp(name1, p1->name)!=0 && p1->next!=NULL)         p1=p1->next;     if(strcmp(name1, p1->name)!=0)     {         printf("\n\n\tIt is not exist in the addr-book!");         return;     }     else     {         printf("\n\n\tPlease input the Alter meg!"); //输入要修改人的新信息         printf("\n\n addr: offphnum: hmphnum: mbphnum\n");         scanf("%s %s %s %s", add1 , phnum1 , phnum2 , phnum3);         strcpy(p1->name , name1);         strcpy(p1->addr, add1);         strcpy(p1->offphnum , phnum1);         strcpy(p1->hmphnum , phnum2);         strcpy(p1->mbphum , phnum3);     } }  int main() {     listlink head=NULL;     int sel;     head=readfp();     if(head==NULL)         head = create();     do     {         printf("\n WELCOME TO USE Address book"); //显示提示的信息         printf("\n 1.Show all the meg  2.Delete a piece of meg");         printf("\n 3.Find a piece of meg 4.Insert a piece of meg");         printf("\n 5.Alter a piece of meg");         printf("\n 0.Save and Exit");         printf("\n Input Your Choice(0-5):");         scanf("%d",&sel);         switch(sel)         {             case 1: Show(head);                     printf("press anykey to return \n");                     getchar();                     break;             case 2: Delete(&head);   //用二重指针解决无法删除第一个的问题，内部修改详见函数内部实现                     break;             case 3: Find(head);                     printf("press anykey to return \n");                     getchar();                     break;             case 4: Input(head);                     break;             case 5: Alter(head);                     break;             case 0: Save(head);                     break;         }     }while(1); }  供参考～  for循环后面不能有分号，除非特殊用途  删除第一个节点，需要传二重指针，建议对比找一下自己的问题～


Question: 小白紧急求助

char str[] = "hello a123456"; int i; for(i = 0;i < strlen(str);i++){   if(str[i] >('a' - 1) && str[i] < ('z' +1) || str[i] >('A' - 1) && str[i] < ('Z' +1)){        str[i] + 'a' - 'A' + 1;   } } //z和Z自己再设置一下，输出就一个for循环，记得加头文件string.h

根据字符串bai存储的变量的不同，方法不同，  参考代码： 存储在char数组中（支持C/C++) char str[]="hello" ; int i;for( i=0;str[i];i++ )     printf("%c\n", str[i] ); //以数组方式引用一个字符str[i]   for( i=0;*(str+i);i++ )     printf("%c\n", *(str+i) ); //以指针方式引用一个字符


Question: C语言

void printf_chr_exercise(void) { 	char c = 'a';//get a character 	char upper_c = toupper(c); 	{ 		printf("%c\n"\ 			"%c %c %c %c %c %c %c %c\n"\ 			" %c %c %c %c %c %c %c %c\n"\ 			"%c %c %c %c %c %c %c %c\n"\ 			" %c %c %c %c %c %c %c %c\n"\ 			"%c %c %c %c %c %c %c %c\n"\ 			" %c %c %c %c %c %c %c %c\n"\ 			"%c %c %c %c %c %c %c %c\n"\ 			" %c %c %c %c %c %c %c %c\n",\ 			c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c); 	} }

小写字母转换为大写字母不会？ 还是 输出不会？

更倾向于３ｌ循环打印的，如果我的话会用循环打，看着好看一点

#include<stdio.h> int main(){     char c;     scanf("%c", &c);     c += 26;    //将小写转换为大写     //循环输出     for(int i = 0; i < 8; i ++){         for(int j = 0; j < 8; j ++){             if(i % 2 == 1)                 printf("%c ", c);             else                 printf(" %c", c);         }         print("\n");     }     return  0; }  一个思路，可以参考


Question: glut.h头文件的调用

下载并解压freeglut，把头文件放入VC98\Include\GL\下，lib文件放入VC98\Lib\下

我按照这个，编译还是说那个文件打不开


Question: c语言——转义字符问题

我这边跑过都是正常对齐的，实在不行可以贴代码上来debug下。

https://blog.csdn.net/CSRAWD/article/details/104860862  这个博客讲的很详细，参考一下吧～

char s[200]; sprintf(s,"a[%2d]=%2d",i,a[i]);//输出到临时字符串变量s中 printf("%-20s",s);//将s左对齐占用20个字符宽度输出

对终端来说，\t仅仅表示将光标向右移到下一个列位置为8*n+1的地方而已。n为非负整数


Question: 单链表的插入

引用 3 楼 weixin_50718000 的回复:@自信男孩，那个你写的第90行为什么要写getchar（）呀，为什么不写那个就执行不出结果来呀 这个用于接收上面输入i之后输入的回车。如果楼主再输入这两个scanf对应的变量时中间不加回车就可以不加那句～

嗯，好的，我知道了，谢谢

#include<stdio.h> #include<stdlib.h> #include<malloc.h>  #define  ERROR 0 #define  OK    1  //单链表的定义 typedef int elemtype; typedef struct Node { 	elemtype data; 	struct Node *next; }Node,*linklist;  //单链表的初始化 void init_linklist(linklist *l) { 	*l = (linklist)malloc(sizeof(Node)); 	(*l)->next=NULL; } //头插法建立单链表 void createfromhead(linklist l) { 	Node *s; 	char c; 	int flag=1; 	while(flag) 	{ 		c = getchar(); 		//fflush(stdin); 		getchar(); 		if(c!='0') 		{ 			s=(Node*)malloc(sizeof(Node)); 			s->data=c; 			s->next=l->next; 			l->next=s; 		} 		else  			flag=0; 	} } //单链表的插入 int inslist(linklist l,int i,elemtype e) 	//在带头结点的单链表l中第i个位置插入值为e的节点 {     	Node *pre,*s; 	int k; 	if(i<=0) 		return ERROR; 	pre=l;   k=0;//从头开始查找，查找第i-1个节点 	while(pre!=NULL&&k<i-1)    //标为查完且未查到第i-1个是重复，找到pre只想第i-1个 	{   		pre=pre->next; 		k=k+1; 	}//查找第i-1个节点 	if(pre==NULL)//如当前位置pre为空表表示一找完，但还为到第i个，说明插入位置不合理 	{   		printf("插入位置不合理"); 		return ERROR; 	} 	s=(Node*)malloc(sizeof(Node));  //申请一个新的节点 	s->data=e;  //值e放入s的数据与 	s->next=pre->next;  //修改指针，完成插入 	pre->next=s; 	return OK; } //void main() int main() {     	linklist l; 	Node *p; 	int i,r,j; 	//建立单链表 	init_linklist(&l); 	printf("用头插法建立单链表，请输入链表数据\n"); 	createfromhead(l); 	p = l->next; 	while(p!=NULL) 	{     		//printf("%c\n", *p ); 		printf("%c\n", p->data ); 		p=p->next; 	}  	//单链表的插入 	printf("请输入你要插入的位置:\n"); 	scanf("%d",&i); 	getchar(); 	printf("请输入你要插入的数字：\n"); 	//scanf("%d",&r); 	scanf("%c",&r); 	if (inslist(l,i,r) == ERROR) { 		printf("Insert error!\n"); 		return -1; 	} 	printf("结果为:\n"); 	p=l->next; 	while(p!=NULL) 	{     		//printf("%c\n", *p ); 		printf("%c\n", p->data ); 		p=p->next; 	} } 供参考～  插入算法没什么问题，问题在于main函数里用的r是%d格式的，注意'1'和1是不相等的。 如果按照楼主的写法，可以考虑输入51，这样插入的是'3'，


Question: 有关while循环的小问题

引用 3 楼 Intel0011的回复:[quote=引用 楼主 若水ovo 的回复:]为什么输入数字不退出循环呀 另外，至少执行一次的时候，用do...while更好[/quote] 这个我自己还没看到

引用 3 楼 Intel0011的回复:[quote=引用 楼主 若水ovo 的回复:]为什么输入数字不退出循环呀 另外，至少执行一次的时候，用do...while更好[/quote] 谢谢(*°∀°)=3

2也是字符，是输入的'2'。  建议用ctrl+d（LINUX）或ctrl+z（windows）试试

引用 楼主 若水ovo 的回复:为什么输入数字不退出循环呀 另外，至少执行一次的时候，用do...while更好

数字也是字符啊，alp接收‘2’字符，有什么错？

cir = scanf("%c", &alp); 当你输入2时，alp为'2'，cir为1，当然继续循环啦


Question: 我这编译出来运行不来，出现d returned 1 exit status

谢谢哈。不过我这个i 就是想要设定变的，为了单独输出 i的每一个数，进入选择。

#include<stdio.h> #include<math.h> #include<bits/stdc++.h>  int main() {     unsigned int m, n, i, boundary = 2 * (unsigned int)pow(10, 9);     int digits[10] = {0}, tmp;       scanf("%u%u", &m, &n);      if (m > n)         return -1;     if ((m <= 0 || m > boundary)         || (n <= 0 || n > boundary)) {             return -1;     }      for (i = m; i <= n; i++) {         tmp = i;          while (tmp) {             digits[tmp % 10]++;             tmp /= 10;         }     }     for(i=0;i<10;i++)         printf("%d ", digits[i]) ;      putchar(10);     return 0;    #if 0      int m,n,i,j,d,c;     int tmp;     scanf("%d %d",&m,&n);     int b[10]={0};      for(i=m;i<=n;i++) {                 tmp = i;                 while (tmp)                 {                     d = tmp%10;                     tmp = tmp/10;                     switch(d)                     {                         case 0:b[0]++;break;                         case 1:b[1]++;break;                         case 2:b[2]++;break;                         case 3:b[3]++;break;                         case 4:b[4]++;break;                         case 5:b[5]++;break;                         case 6:b[6]++;break;                         case 7:b[7]++;break;                         case 8:b[8]++;break;                         case 9:b[9]++;break;                     }                 }     }     for(i=0;i<10;i++)         printf("%d: %d\n", i, b[i]) ; #if 0         for(j=1;j<=10;j++)         {             if(i<pow(10,j))              {                 tmp = i;                  //for(c=j-1;c>0;c--)                 while (tmp)                 {                     d = tmp%10;                     tmp = tmp/10;                     switch(d)                     {                         case 0:b[0]++;break;                         case 1:b[1]++;break;                         case 2:b[2]++;break;                         case 3:b[3]++;break;                         case 4:b[4]++;break;                         case 5:b[5]++;break;                         case 6:b[6]++;break;                         case 7:b[7]++;break;                         case 8:b[8]++;break;                         case 9:b[9]++;break;                     }                 }             }         }     for(i=0;i<10;i++)         printf("%d: %d\n", i, b[i]) ;     return 0;  #endif  #endif  }  供参考～

楼主的i在循环体里被修改了，修改的地方在这里：   d=i%10;    i=i/10; 主要是这句：i = i/10;修改了i，别忘了在最外层循环里i循环标量；


Question: c语言，可以麻烦你告诉我怎么去完成么？

按图的方式，百度图最短路径算法

这玩意好点绕啊，计价还是简单的，关键是线路站点的增删，用链表？结构体保存不同的信息，而且涉及到多条线交叉，应该是外部链表存了信息，然后有节点指向内部链表，分开存储，这样的话可能要好几个，一时半会我理不出来，还有怎么得到可行路径也是个问题


Question: 如何编写模块来实现将eht0端口上收到的包发送到eth1端口上？

写一个内核模块，实现eth0和eth1之间相互转发？到eth0上的包直接扔给eth1，eth1上的包直接扔给eth0.

假如应用层的数据到了eth0接口，我希望写一个内核模块，将这个报文交由eth1处理，然后转发出去

折腾啥，把网线调换一下接口不就行了

互相转发的意义不大吧？如果是单独拿得话可以用桥接，桥接之前看得是把几个口的包通过桥放到一个口，然后监听那一个口抓包，就可以抓到所有的，应该是一个道理

两张网卡（两个ip）？两个端口？ 你所谓的转发是指程序转发还是让系统自动转发？系统自动转发好像两张网卡可以“桥接”（类似和虚拟机的桥接）；程序转发那实现方式很多，比如在路由转发到不同ip

楼主的意思是不是指端口之间通信？ 那不就是进程之间通信吗？ 如果是两个网卡之间通信，使用脚本就可以了啊。 端口、eth0和eth1，先了解清楚。


Question: vs的C程序malloc分配的内存为什么会访问不了？

top->data=NULL;下面的波浪线提示是什么？看上去data像是int型，初始化最好用top->data=0;这样

问题已经解决了，实际上是因为这个文件中头文件没有定义initList函数，vs编译也不报错运行出问题！

但从这些信息看不出什么问题来，（对于top在malloc之后应该判断一下是否申请成功）建议提供更多代码吧～

到上面这一步的时候内存已经分配并赋值了，  但就是错了，怎么回事，怎么解决？