Question: 这篇中case Y 中的p1->next=NULL报错，找不到原因

else if(choose == 'Y')             {                 p2=(s*)malloc(sizeof(s));                 p1->next=p2->next;                 p1->next=p2;                 p1 = p2;   /*加上这句*/                 printf("Please input No.%2d student's number:\n",++i);                 scanf("%ld",&(p1->student_number));                 printf("Please input his(her) name:\n");                 scanf("%s",p1->name);                 printf("Please input his(her) grades:\n");                 scanf("%f %f %f",&p1->grade[0],&p1->grade[1],&p1->grade[2]);             } 我记得上面加了这句，你什么时候去掉了。  struct stu *find(s *sear_ch,s *head,int i) {     int j;     if(i<1)         printf("Error.\n");     else if(i == 1)         return head;     else     {         sear_ch = head;         for(j=1;j<i && sear_ch;j++)             sear_ch = sear_ch->next;         return sear_ch;     } } 这个地方也有问题

好好理解下赋值操作符= 和数学里的等于号=的区别吧，归根结底，是把数学等号当成赋值操作符用了。

#include <stdio.h> #include <stdlib.h>  typedef struct stu {     long student_number;     char name[40];     float grade[3];     struct stu *next; }s;  struct stu *creat(s *head) {     s *p1,*p2;     int i=1;     char choose;     head=(s*)malloc(sizeof(s));     head->next=NULL;     p1=head;     printf("Please input No.%2d student's number:\n",i);     scanf("%ld",&p1->student_number);     printf("Please input his(her) name:\n");     scanf("%s",p1->name);     printf("Please input his(her) grades:\n");     scanf("%f %f %f",&p1->grade[0],&p1->grade[1],&p1->grade[2]);     printf("Continue?Y(yes),N(no)\n");     getchar();     scanf("%c",&choose);     do{             if(choose != 'Y' && choose != 'N')                 printf("Error.\n");             else if(choose == 'Y')             {                 p2=(s*)malloc(sizeof(s));                 p1->next=p2->next;                 p1->next=p2;                 printf("Please input No.%2d student's number:\n",++i);                 scanf("%ld",&(p1->student_number));                 printf("Please input his(her) name:\n");                 scanf("%s",p1->name);                 printf("Please input his(her) grades:\n");                 scanf("%f %f %f",&p1->grade[0],&p1->grade[1],&p1->grade[2]);             }             if(choose != 'N')             {                 printf("Continue?Y(yes),N(no)\n");                 getchar();                 scanf("%c",&choose);             }     }while(choose == 'Y');     return (head); }  struct stu *output(s *head) {     s *p;     printf("Here are all informations:\nStudent number         Name         grade1   grade2   grade3\n");     p=head;     while(p)     {         printf("%ld %s %.2f %.2f %.2f\n",p->student_number,p->name,p->grade[0],p->grade[1],p->grade[2]);         p=p->next;     }     return 0; }  struct stu *find(s *sear_ch,s *head,int i) {     int j;     if(i<1)         printf("Error.\n");     else if(i == 1)         return head;     else     {         for(j=1;j<i;j++)         {             sear_ch = head;             sear_ch = sear_ch->next;         }         return sear_ch;     } }  //struct stu *insert(s *move;int i)   int main() {     s *head,*sear_ch;     head=creat(head);     output(head);     return 0; }  好消息 能用了，但是输如两条以上的信息时程序就崩溃了

引用 6 楼 cfjtaishan 的回复:scanf("%c",&choose);     getchar(); 换成：  getchar(); scanf("%c",&choose);      都换一下，包括do while里的

struct stu *creat(s *head) {     s *p1,*p2;     int i=1;     char choose;     head=(s*)malloc(sizeof(s));     head->next=NULL;     p1=head;     printf("Please input No.%2d student's number:\n",i);     scanf("%ld",&p1->student_number);     printf("Please input his(her) name:\n");     scanf("%s",p1->name);     printf("Please input his(her) grades:\n");     scanf("%f %f %f",&p1->grade[0],&p1->grade[1],&p1->grade[2]);     printf("Continue?Y(yes),N(no)\n");     scanf("%c",&choose);     getchar();     do{             if(choose != 'Y' && choose != 'N')                 printf("Error.\n");             else if(choose == 'Y')                 p2=(s*)malloc(sizeof(s));                 p1->next=p2->next;                 p1->next=p2;                 printf("Please input No.%2d student's number:\n",++i);                 scanf("%ld",&(p1->student_number));                 printf("Please input his(her) name:\n");                 scanf("%s",p1->name);                 printf("Please input his(her) grades:\n");                 scanf("%f %f %f",&p1->grade[0],&p1->grade[1],&p1->grade[2]);             do{                 printf("Continue?Y(yes),N(no)\n");                 scanf("%c",&choose);                 getchar();             }while(choose != 'Y' || choose != 'N');     }while(choose == 'Y');     return (head); } 用do while 循环 可是还是不行 应该是判断条件有问题 但是找不出来

p2=(s*)malloc(sizeof(s)); p2=p1->next; p1=p2; p1->next=NULL;   你前面把p1->next設爲NULL了，這裏給p2分配地址后隨即又把p2賦值為p1->next，那麽p2就變成NULL了啊！分配的地址從此找不到了。然後p2又賦給p1，p1也變NULL了，對一個NULL取任何成員當然都會出錯！

case 'Y':   p2=(s*)malloc(sizeof(s));                         p1->next=p2;                         p1=p2;                         p1->next=NULL; 你这里第一次p1->next=null,p2=p1->next,这时候p2=null了。 改了一下，看你的意思应该在链表尾部插入。

引用 1 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct stu {     long student_number;     char name[40];     float grade[3];     struct stu *next; }s;  //struct stu *creat(s *head) struct stu *creat(void) {     s *p1,*p2, *head;     int i=1;     char choose;     head = (s*)malloc(sizeof(s));     head->next=NULL;     p1 = head;     printf("Please input No.%2d student's number:\n",i);     scanf("%ld", &p1->student_number);     printf("Please input his(her) name:\n");     scanf("%s", p1->name);     printf("Please input his(her) grades:\n");     scanf("%f %f %f",&p1->grade[0],&p1->grade[1],&p1->grade[2]);     //head = p1;     while(p1)     {         printf("Continue?Y(yes),N(no)\n");         getchar();         scanf("%c", &choose);         if (choose =='Y') {             p2 = (s*)malloc(sizeof(s));             p2->next = p1->next;   /*将NULL赋值给p2->next */             p1->next = p2;   /*加入链表末尾*/             p1 = p2;             //p1->next = NULL;             printf("Please input No.%2d student's number:\n",++i);             scanf("%ld",&(p1->student_number));             printf("Please input his(her) name:\n");             scanf("%s", p1->name);             printf("Please input his(her) grades:\n");             scanf("%f %f %f",&p1->grade[0],&p1->grade[1],&p1->grade[2]);         } else if (choose == 'N') {             break;         } else {             printf("ERROR.\n");         }     }     return (head); }  struct stu *output(s *head) {     s *p1;     printf("Here are all informations:\nStudent number         Name         grade1   grade2   grade3\n");     p1=head;     while(p1)     {         printf("%ld %s %.2f %.2f %.2f\n",p1->student_number,p1->name,p1->grade[0],p1->grade[1],p1->grade[2]);         p1 = p1->next;     }     return 0; }  int main() {     s *head;     head = creat();     output(head);     return 0; }  参考一下吧 main函数里的head传入creat函数没有意义，并且没有初始化。与其传入一个没有意义的参数，不如不传参数进去，保留返回头结点； 链表创建的时候有问题，p2 = p1->next即将NULL赋值给p2，那么p2就是NULL，所以会导致段错误；因此将p2->next = p1->next;然后将p2连入链表；p1->next = p2; 这个需求不建议使用switch case,因为case里的break只是跳出switch不能跳出while，若输入N时，应该是跳出while而不是switch，并且continue也不用加，即使不加也会继续循环。


Question: 新手提问，为什么strcpy copy不了指定大小的字节？

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）

貌似如果string/strcpy.c就是实现的话，那么确实是要多拷贝一个byte了

引用 7 楼 feekee 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strcat.c /*** *strcat.c - contains strcat() and strcpy() * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       Strcpy() copies one string onto another. * *       Strcat() concatenates (appends) a copy of the source string to the *       end of the destination string, returning the destination string. * *******************************************************************************/  #include <cruntime.h> #include <string.h>  #ifndef _MBSCAT #pragma function(strcat,strcpy) #endif  /* _MBSCAT */  /*** *char *strcat(dst, src) - concatenate (append) one string to another * *Purpose: *       Concatenates src onto the end of dest.  Assumes enough *       space in dest. * *Entry: *       char *dst - string to which "src" is to be appended *       const char *src - string to be appended to the end of "dst" * *Exit: *       The address of "dst" * *Exceptions: * *******************************************************************************/  char * __cdecl strcat (         char * dst,         const char * src         ) {         char * cp = dst;          while( *cp )                 cp++;                   /* find end of dst */          while( *cp++ = *src++ ) ;       /* Copy src to end of dst */          return( dst );                  /* return dst */  }   /*** *char *strcpy(dst, src) - copy one string over another * *Purpose: *       Copies the string src into the spot specified by *       dest; assumes enough room. * *Entry: *       char * dst - string over which "src" is to be copied *       const char * src - string to be copied over "dst" * *Exit: *       The address of "dst" * *Exceptions: *******************************************************************************/  char * __cdecl strcpy(char * dst, const char * src) {         char * cp = dst;          while( *cp++ = *src++ )                 ;               /* Copy src over dst */          return( dst ); }  感谢，受教了[/quote] 对了，我翻了一下glibc中strcpy函数，是这样的 [admin@localhost glibc-2.22]$ find ./ -name strcpy* ./debug/strcpy_chk.c ./sysdeps/ia64/strcpy.S ./sysdeps/sparc/sparc64/strcpy.S ./sysdeps/sparc/sparc32/strcpy.S ./sysdeps/sparc/sparc32/sparcv9/strcpy.S ./sysdeps/x86_64/strcpy.S ./sysdeps/x86_64/strcpy_chk.S ./sysdeps/x86_64/multiarch/strcpy.S ./sysdeps/x86_64/multiarch/strcpy-sse2-unaligned.S ./sysdeps/x86_64/multiarch/strcpy-ssse3.S ./sysdeps/s390/s390-64/strcpy.S ./sysdeps/s390/s390-32/strcpy.S ./sysdeps/aarch64/strcpy.S ./sysdeps/powerpc/powerpc32/405/strcpy.S ./sysdeps/powerpc/powerpc32/strcpy.S ./sysdeps/powerpc/powerpc64/power7/strcpy.S ./sysdeps/powerpc/powerpc64/strcpy.S ./sysdeps/powerpc/powerpc64/power8/strcpy.S ./sysdeps/powerpc/powerpc64/multiarch/strcpy-ppc64.S ./sysdeps/powerpc/powerpc64/multiarch/strcpy.c ./sysdeps/powerpc/powerpc64/multiarch/strcpy-power8.S ./sysdeps/powerpc/powerpc64/multiarch/strcpy-power7.S ./sysdeps/i386/i686/multiarch/strcpy-sse2.S ./sysdeps/i386/i686/multiarch/strcpy.S ./sysdeps/i386/i686/multiarch/strcpy-ssse3.S ./sysdeps/i386/i586/strcpy.S ./sysdeps/arm/armv6/strcpy.S ./sysdeps/alpha/strcpy.S ./string/strcpy.c [admin@localhost glibc-2.22]$ 汇编的那些看了头大，看了一下c语言文件./string/strcpy.c，是这样的 #include <stddef.h> #include <string.h>  #undef strcpy  /* Copy SRC to DEST.  */ char * strcpy (char *dest, const char *src) {   return memcpy (dest, src, strlen (src) + 1); } libc_hidden_builtin_def (strcpy)

感谢大家的回复，之前一直没有感觉到strcpy还有这个特性，一般好像都是用strncpy多谢，感谢大家指出我的问题

引用 4 楼 zhao4zhong1 的回复:C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strcat.c /*** *strcat.c - contains strcat() and strcpy() * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       Strcpy() copies one string onto another. * *       Strcat() concatenates (appends) a copy of the source string to the *       end of the destination string, returning the destination string. * *******************************************************************************/  #include <cruntime.h> #include <string.h>  #ifndef _MBSCAT #pragma function(strcat,strcpy) #endif  /* _MBSCAT */  /*** *char *strcat(dst, src) - concatenate (append) one string to another * *Purpose: *       Concatenates src onto the end of dest.  Assumes enough *       space in dest. * *Entry: *       char *dst - string to which "src" is to be appended *       const char *src - string to be appended to the end of "dst" * *Exit: *       The address of "dst" * *Exceptions: * *******************************************************************************/  char * __cdecl strcat (         char * dst,         const char * src         ) {         char * cp = dst;          while( *cp )                 cp++;                   /* find end of dst */          while( *cp++ = *src++ ) ;       /* Copy src to end of dst */          return( dst );                  /* return dst */  }   /*** *char *strcpy(dst, src) - copy one string over another * *Purpose: *       Copies the string src into the spot specified by *       dest; assumes enough room. * *Entry: *       char * dst - string over which "src" is to be copied *       const char * src - string to be copied over "dst" * *Exit: *       The address of "dst" * *Exceptions: *******************************************************************************/  char * __cdecl strcpy(char * dst, const char * src) {         char * cp = dst;          while( *cp++ = *src++ )                 ;               /* Copy src over dst */          return( dst ); }  感谢，受教了

C 语言字符串末尾有一个结束符 '\0'，因此你的ABCDEF + '\0' 总共是7个字符，你定义的buf是6个字节，减掉一个字节用于存储 '\0' 后，只剩下5个字节可以使用了，因此，你strcpy(buf,arg[1]) arg[1] 传递5过去是没有问题的，传递6过去，就超出数组范围了。因此也就提示你Segmentation fault错误

因为argv是字符串，每个参数带有一个值为0的结束符，所以当输入6个字母时，长度为7。

C 语言字符串末尾有一个结束符 '\0'

字符串还有结尾的\0，加上它之后你的字符数组就越界了

字符串"ABCDEF"是7个字符，导致buf越界。因为strcpy会将'\0'拷贝至buf中，算上'\0'，就应该是7个字符，所以越界，越界访问导致段错误。 除去'\0'，buf最多容纳5个有效字符；


Question: 奇数值结点链表（pta）

struct ListNode *readlist() { 	struct ListNode *head,*pre,*p; 	head=(struct ListNode*)malloc(sizeof(struct ListNode)); 	head->next=NULL; 	pre=head;//保存head地址，并替代head进行操作  	while(1) 	{ 	    p=(struct ListNode*)malloc(sizeof(struct ListNode)); 	    scanf("%d",&p->data); 	    if(p->data==-1) 	    break; 		p->next=NULL; 		pre->next=p; 		pre=p; 	} 	free(p); 	return head->next; } struct ListNode *deletem_1( struct ListNode *L)//删除奇数 { 	struct ListNode *head,*p; 	head=L; 	p=L->next; 	while(p) 	{ 		if(p->data%2!=0) 		{ 			L->next=p->next; 			free(p); 			p=L->next; 			continue; 		} 		L=p; 		p=p->next; 	} 	if(head->data%2!=0) 	head=head->next; 	return head; } struct ListNode *deletem_2( struct ListNode *L)//删除偶数 { 	struct ListNode *head,*p; 	head=L; 	p=L->next; 	while(p) 	{ 		if(p->data%2==0) 		{ 			L->next=p->next; 			free(p); 			p=L->next; 			continue; 		} 		L=p; 		p=p->next; 	} 	if(head->data%2==0) 	head=head->next; 	return head; } struct ListNode *getodd( struct ListNode **L ) { 	struct ListNode *head,*pre,*p,*Q;//创建一个新链表，使其与*L链表相等 	head=(struct ListNode*)malloc(sizeof(struct ListNode)); 	head->next=NULL; 	pre=head; 	Q=*L; 	while(Q) 	{ 		p=(struct ListNode*)malloc(sizeof(struct ListNode)); 		p->data=Q->data; 		p->next=NULL; 		pre->next=p; 		pre=p; 		Q=Q->next; 	} 	*L=deletem_1(*L);//得到删除奇数的链表 	return deletem_2(head->next);//得到删除偶数的链表. }

#include <stdio.h> #include <stdlib.h>  struct ListNode {     int data;     struct ListNode *next; };  struct ListNode *readlist(); struct ListNode *getodd( struct ListNode **L );  void printlist( struct ListNode *L ) {     struct ListNode *p = L->next;      while (p) {         printf("%d ", p->data);         p = p->next;     }     printf("\n"); }  int main() {     struct ListNode *L, *Odd;     L = readlist();     Odd = getodd(&L);     printf("Odd list: ");     printlist(Odd);     printf("Even list: ");     printlist(L);      return 0; }  /* 你的代码将被嵌在这里 */ struct ListNode *readlist() {     struct ListNode *head,*tail;     struct ListNode *p;     int size = sizeof(struct ListNode);     head = (struct ListNode*)malloc(size);     head->next = NULL;     p = head;     while(1) {         tail = (struct ListNode*)malloc(size);         scanf("%d", &tail->data);         if (tail->data==-1) {             p->next = NULL;             break;         }         p->next=tail;         p = tail;     }     free(tail);   /* 最后一个节点申请了，但是没有用要释放掉 */      return head;   /*返回一个带哨兵的链表*/ }   struct ListNode *getodd( struct ListNode **L )  //将单链表L中奇数值的结点分离出来，重新组成一个新的链表 {     struct ListNode *odd_head, *prev, *pcur, *pnew;     int size = sizeof(struct ListNode);      odd_head = (struct ListNode *)malloc(size);     if (!odd_head)         exit(1);      prev = *L;     pcur = (*L)->next;     pnew = odd_head;      while (pcur) {         if (pcur->data % 2) {             pnew->next = pcur;             pnew = pcur;             prev->next = pcur->next;             pcur = pcur->next;         } else {             prev = prev->next;             pcur = pcur->next;         }     }     pnew->next = NULL;      return odd_head;     /*     struct ListNode *head,*oddhead,*evenhead,*oddtail,*eventail,*odd,*even,*first,*temp;     head = (struct ListNode*)malloc(size);     oddhead = (struct ListNode*)malloc(size);  odd=oddhead;     evenhead =  (struct ListNode*)malloc(size); even=evenhead;     oddhead->next=NULL;     evenhead->next=NULL;     head=*L;     first=*L;temp=first;              //代表传入的指针的首地址     if(head!=NULL){         if(head->data%2!=0){oddhead=*L;odd=oddhead;}         if(head->data%2==0){evenhead=*L;even=evenhead;}     }      while(head->next!=NULL){         if(head->next->data%2!=0){   //从第二个节点开始判断 (奇数)             head=head->next;             oddtail=head;             oddhead->next=oddtail;             oddhead=oddtail;         }         else if(head->next->data%2==0){  //从第二个节点开始判断 （偶数）             head=head->next;             eventail=head;             evenhead->next=eventail;             evenhead=eventail;         }     }      if(first->data%2==0)      //第一个为偶数     {         *L=first;         return odd->next;     }     else                    //第一个为奇数     {         *L=even->next;         return first;     }     */  }  参考一下吧，对于要求，若定义一个带哨兵的单链表会比较容易解决。详见上面的代码； 分离函数可以简单一些，没必要定义那么多指针变量，因为变量多了会让程序看着不容易理解。

我的第一次提问，实在不知道哪里出错了，求大佬帮帮我，我想了快一天了┭┮﹏┭┮

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


Question: 菜鸟求助！自己定义的power函数，最后得数都是0，实在不知道哪里出了问题，求大神指导！

#include <stdio.h> #include <stdlib.h> #include <math.h>  double power(double a,int n);  int main() {     int n;     double a, s;     printf("请输入底数a：");     scanf("%lf,",&a);     printf("请输入指数n：");     scanf("%d", &n);     s = power(a,n);     printf("%lf\n",s); }  double power(double a, int n) {     int i;     double s = 1.0;     for(i = 0; i < abs(n); i++)         s *= a;     if (n < 0)         return 1.0/s;     return s; } 考虑幂是负数的情况

第一个问题：double类型应该用%lf格式接收收入的数据： scanf("%lf,",&a); 第二个问题：s应该定义成double类型，因为接收的是double的返回值，并且输出是应该用%lf #include <stdio.h>  double power(double a,int n);  int main() {     int n;     double a, s;     printf("请输入底数a：");     scanf("%lf,",&a);     printf("请输入指数n：");     scanf("%d", &n);     s = power(a,n);     printf("%lf\n",s); }  double power(double a,int n) {     int i;     double s = 1.0;     for(i = 0; i < n; i++)         s *= a;      return s; } 参考一下吧

#include"stdio.h" double power(double a,int n); main() { 	int n,s; 	double a; 	printf("请输入底数a："); 	scanf("%f,",&a);                          // a  定义为double类型，但是你sancf 函数内应该使用 %lf 才对，而你使用的是  %f ,这样就会造成你输入的a的值不正确  	printf("请输入指数n："); 	scanf("%d",&n); 	s=power(a,n);                            // 你power函数的返回值是一个 double 类型的值，所以 s 也应该定义成double类型，但是你程序是定义成 int 类型 	printf("%f",s); } double power(double a,int n) { 	int i; 	double s=1.0; 	for(i=1;i<=n;i++) 	{ 		s*=a; 	} 	return s; } 以上你的代码中，我看出来的错误。 在这里我们假设采用的是32位，int  4 Byte float 4 Byte double  8 Byte  简单介绍一下汇编中数据的存储，首先你 a 定义的double类型的变量，因此在内存中就分配了double类型大小的内存空间，我们使用的double 是8 Byte 的大小， 内存中，数据的存储是高位的存放在高地址，地位的存放在低地址。所以你在sanf函数获取输入时%f 取到 的 a 的地址并不是 a实际开始存放的地址，因此你输入的数值存储在错位的地址中，但是你程序调用的 a 使用的是a实际开始的地址，因此，程序调用到的 a 值并不是 你所输入的 a 的值。(PS: 我实际调试中，根据调试程序的内存地址，有看到 %f 和 %lf 开始存放的地址明显是不一样的) 接下去是 s 的返回值为什么会变成0，虽然 从 a开始获取到的值 并不是 你输入的a值，但是power还是正常调用了。说起来还是和上面讲的内存中数据的存储有关。所以你只要将程序修改为  #include"stdio.h" double power(double a,int n); main() { 	int n; 	double s; 	double a; 	printf("请输入底数a："); 	scanf("%lf,",&a); 	printf("请输入指数n："); 	scanf("%d",&n); 	s=power(a,n); 	printf("%f",s); } double power(double a,int n) { 	int i; 	double s=1.0; 	for(i=1;i<=n;i++) 	{ 		s*=a; 	} 	return s; }  还有，楼上的那位说的也没错，你要考虑到指数为负数的情况，以下是引用他的代码  #include <stdio.h> #include <stdlib.h> #include <math.h>   double power(double a,int n);   int main() {     int n;     double a, s;     printf("请输入底数a：");     scanf("%lf,",&a);     printf("请输入指数n：");     scanf("%d", &n);     s = power(a,n);     printf("%lf\n",s); }   double power(double a, int n) {     int i;     double s = 1.0;     for(i = 0; i < abs(n); i++)         s *= a;     if (n < 0)         return 1.0/s;     return s; }

main 里的s是int 的如果结果小于0 不就截掉了吗

不是啊，在main中s我定义的是double型的

函数类型是double，，main里的s是int，类型不一样


Question: 求教大神：ubuntu安装asterisk报错

建议将错误信息（某个代表性的错误信息）粘贴到百度搜一下，然后分析和你相近的解决办法；


Question: Socket服务器，同一份代码，debug可正常通信，release失败

引用 9 楼 cyyhehehe 的回复:谢谢各位，找到原因了，其实是release下SOCKET访问被系统防火墙禁止了。 楼主您好，我电脑的防火墙已经关了，debug可以，release还是不行。请问下具体操作，是如何允许release下SOCKET访问?

debug内存管理和release是不一样的，猜测你应该是某端代码写的不标准引起的。  程序有日志功能不，把listen、accept相关ip地址都打印出来，没有就用MessageBox

学会使用抓包软件wireshark

引用 5 楼 user-4 的回复:PID 为0的进程是系统进程，你自己的程序的pid肯定不会是0.5037是adb默认端口，自己建程序建议建大一点的端口号，小的端口号很多都被占用了，容易导致程序出问题。  感谢回答。 5037这个端口的现象应该跟此题无关。 按照你的建议改成30000的端口了，这个问题还是存在。Release模式下，无法建立连接。是否有其他的跟踪调试手段呢？

第二张图下面那个5050才是你的程序吧。如果不是你的程序的话，就是5050端口被下面那个占用了。是不是debug忘关了？

引用 2 楼 cyyhehehe 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] inet_ntoa The Windows Sockets inet_ntoa function converts an (Ipv4) Internet network address into a string in Internet standard dotted format.  char FAR * inet_ntoa (   struct in_addr in   );   Parameters in  [in] A structure that represents an Internet host address.  Remarks The inet_ntoa function takes an Internet address structure specified by the in parameter and returns an ASCII string representing the address in ".'' (dot) notation as in "a.b.c.d''. The string returned by inet_ntoa resides in memory that is allocated by Windows Sockets. The application should not make any assumptions about the way in which the memory is allocated. The data is guaranteed to be valid until the next Windows Sockets function call within the same thread, but no longer. Therefore, the data should be copied before another Windows Sockets call is made.  Return Values If no error occurs, inet_ntoa returns a char pointer to a static buffer containing the text address in standard ".'' notation. Otherwise, it returns NULL.   QuickInfo   Windows NT: Yes   Windows: Yes   Windows CE: Use version 1.0 and later.   Header: Declared in winsock2.h.   Import Library: Link with ws2_32.lib.  See Also inet_addr 感谢回复，但不太明白红字部分要表达的意思[/quote] QQ:511606848 支付宝:zhao4zhong1@163.com ￥100 包教会，包解决。

引用 1 楼 zhao4zhong1 的回复:inet_ntoa The Windows Sockets inet_ntoa function converts an (Ipv4) Internet network address into a string in Internet standard dotted format.  char FAR * inet_ntoa (   struct in_addr in   );   Parameters in  [in] A structure that represents an Internet host address.  Remarks The inet_ntoa function takes an Internet address structure specified by the in parameter and returns an ASCII string representing the address in ".'' (dot) notation as in "a.b.c.d''. The string returned by inet_ntoa resides in memory that is allocated by Windows Sockets. The application should not make any assumptions about the way in which the memory is allocated. The data is guaranteed to be valid until the next Windows Sockets function call within the same thread, but no longer. Therefore, the data should be copied before another Windows Sockets call is made.  Return Values If no error occurs, inet_ntoa returns a char pointer to a static buffer containing the text address in standard ".'' notation. Otherwise, it returns NULL.   QuickInfo   Windows NT: Yes   Windows: Yes   Windows CE: Use version 1.0 and later.   Header: Declared in winsock2.h.   Import Library: Link with ws2_32.lib.  See Also inet_addr 感谢回复，但不太明白红字部分要表达的意思


Question: 求教，关于服务器端代码出现问题

#define _WINSOCK_DEPRECATED_NO_WARNINGS

1萨达大厦撒

引用 2 楼 user-2 的回复:lz的代码缺少lib库 增加 #pragma comment(lib, "Ws2_32.lib") 谢谢啦，第二种没问题了，但是这样添加了第一种问题还是会出现

是用VS2017编译的，也尝试在visual C++6.0编译，也提示了类似错误


Question: linux c socket 编程 send()方法乱码

解决了！FTP协议漏看了一个地方！

vsftp客户端是把socket绑定到了两个文件流上了，所以你每次发送数据的时候带上'\n'，这样缓冲区会被刷新，不会留下乱七八糟的东西。

http://blog.sina.com.cn/s/articlelist_1595473800_6_1.html 我这里好像有写过，你看看是否对你有帮助

对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

printf("%s %d login success\n", usernames[user_state->user_index], user_state->isLogin); 看一下这句打印的是不是乱码，如果这句里有乱码，那么发过去的就会有乱码；

就是最后send出去的respone数据在vsftpd客户端接收到后前面会有乱码

void ftp_pass(Command *cmd, State *user_state) { 	char *respone = malloc(BUFSIZ); 	if(strcmp(passwords[user_state->user_index], cmd->arg) == 0) 	{ 		// 密码正确 		user_state->isLogin = 1; 		printf("%s %d login success\n", usernames[user_state->user_index], user_state->isLogin); 		sprintf(respone, "230 %s Login successful\n", usernames[user_state->user_index]); 	} 	else 	{ 		// 密码不正确 		user_state->isLogin = 0; 		printf("%s login failed\n", usernames[user_state->user_index]);  		sprintf(respone, "500 user %s Invalid password\n", usernames[user_state->user_index]); 	} 	printf("%s", respone);  	respone[strlen(respone)] = '\0'; 	send(user_state->connection, respone, strlen(respone), 0); 	// write(user_state->connection, respone, sizeof(respone)); }

要把你的代码贴出来给大家看看，才知道问题在哪里

建议贴出发送端和接收端收发数据的部分处理操作。


Question: 怎样用combo box作出一个小型计算器

引用 2 楼 paschen 的回复:不能这样（(CString)i）把整数转换成CString，你要用CString的Format进行转换  感谢分享，已经解决。

所有 ，有什么问题，说明白哈


这个简单，添加个资源文件  再编译就有图标了，，记得事先找好图标哦

百度搜相关关键字。


Question: 麻烦大佬们看看小白这个链表删除函数哪里有问题

void Delete(pNODE head,int x) {     pNODE p=head->next;     int i=1;     pNODE q=NULL;     while(p->next!=NULL&&i<x)     {         p=p->next;         i++;     }     if (p->next == NULL || i > x) {    /*x可能为0*/         printf("Can't find it!\n");         printf("ERROR!");         return;    /* 必须退出函数，否则后面执行了就会有问题*/     }     q = p->next;     p->next = q->next;      free(q); } 参考一下吧

引用 1 楼 user-3 的回复:if(p->next=NULL&&i>x)//这个始终为真啊 要改为p->next==NULL 始终为假才对，因为本来应该是判断表达式，而写成赋值表达式，由于NULL是(void *)0，因此将NULL赋值给p->next，那么p->next为假，后面是&&，所以一直为假。

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


Question: 怎样用easyx使一个圆作随机运动

引用 7 楼 u011583120 的回复:[quote=引用 6 楼 destory27 的回复:] #include <graphics.h> #include <stdio.h> #include <conio.h>  void q_move(int x, int y, int r) {  	for (; x + r/2 <= 640; x += 5) { 		setcolor(RED); 		circle(x, y, r); 		setfillcolor(RED); 		fillcircle(x, y, r); 		Sleep(10); 		setcolor(BLACK); 		circle(x, y, r); 		setfillcolor(BLACK); 		fillcircle(x, y, r);  	}   	return; }  void kb_cir_mov(void) { 	initgraph(640, 480);  	setcolor(RED); 	const int r = 20; 	int x = 320; 	int y = 240; 	circle(x, y, r); 	setfillcolor(RED); 	fillcircle(x, y, r); 	setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 6); 	line(x, y + r, x, y + r + 20); 	line(x, y + r, x - 20, y + 35); 	line(x, y + r, x + 20, y + 35); 	line(x, y + r + 20, x - 20, y + 70); 	line(x, y + r + 20, x + 20, y + 70);  	char c = 0;  	while (c != 27) { 		if (kbhit()) { 			c = getch(); 			switch (c) { 				case 'w': { 					setcolor(BLACK); 					circle(x, y, r); 					setfillcolor(BLACK); 					fillcircle(x, y, r); 					setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 6); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  					if (y - r <= 0) { 						setcolor(RED); 						circle(x, y, r); 						setfillcolor(RED); 						fillcircle(x, y, r); 						line(x, y + r, x, y + r + 20); 						line(x, y + r, x - 20, y + 35); 						line(x, y + r, x + 20, y + 35); 						line(x, y + r + 20, x - 20, y + 70); 						line(x, y + r + 20, x + 20, y + 70); 						break; 					} 					y -= 20; 					setcolor(RED); 					circle(x, y, r); 					setfillcolor(RED); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  				}break;  				case 's': { 					setcolor(BLACK); 					circle(x, y, r); 					setfillcolor(BLACK); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  					if (y + r + 70 >= 480) { 						setcolor(RED); 						circle(x, y, r); 						setfillcolor(RED); 						fillcircle(x, y, r); 						line(x, y + r, x, y + r + 20); 						line(x, y + r, x - 20, y + 35); 						line(x, y + r, x + 20, y + 35); 						line(x, y + r + 20, x - 20, y + 70); 						line(x, y + r + 20, x + 20, y + 70); 						break; 					} 					y += 20; 					setcolor(RED); 					circle(x, y, r); 					setfillcolor(RED); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  				}break; 				case 'a': { 					setcolor(BLACK); 					circle(x, y, r); 					setfillcolor(BLACK); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  					if (x - 35 <= 0) { 						setcolor(RED); 						circle(x, y, r); 						setfillcolor(RED); 						fillcircle(x, y, r); 						line(x, y + r, x, y + r + 20); 						line(x, y + r, x - 20, y + 35); 						line(x, y + r, x + 20, y + 35); 						line(x, y + r + 20, x - 20, y + 70); 						line(x, y + r + 20, x + 20, y + 70); 						break; 					} 					x -= 20; 					setcolor(RED); 					circle(x, y, r); 					setfillcolor(RED); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70); 				}break;  				case 'd': { 					setcolor(BLACK); 					circle(x, y, r); 					setfillcolor(BLACK); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  					if (x + 35 >= 640){ 						setcolor(RED); 						circle(x, y, r); 						setfillcolor(RED); 						fillcircle(x, y, r); 						line(x, y + r, x, y + r + 20); 						line(x, y + r, x - 20, y + 35); 						line(x, y + r, x + 20, y + 35); 						line(x, y + r + 20, x - 20, y + 70); 						line(x, y + r + 20, x + 20, y + 70); 						break; 					 					} 					x += 20; 					setcolor(RED); 					circle(x, y, r); 					setfillcolor(RED); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70); 				}break;  				case 'q': { 					/*	 					circle(x + 23, y, 5); 					setfillcolor(RED); 					fillcircle(x + 23, y, 5); 					*/ 					q_move(x + 28, y, 5);  				}break;   				default:continue; 					 			} 		}  	}  	closegraph();   	return; }  int main(void) { 	kb_cir_mov();  	return 0; } 值得学习[/quote]   结贴吧

引用 6 楼 destory27 的回复:#include <graphics.h> #include <stdio.h> #include <conio.h>  void q_move(int x, int y, int r) {  	for (; x + r/2 <= 640; x += 5) { 		setcolor(RED); 		circle(x, y, r); 		setfillcolor(RED); 		fillcircle(x, y, r); 		Sleep(10); 		setcolor(BLACK); 		circle(x, y, r); 		setfillcolor(BLACK); 		fillcircle(x, y, r);  	}   	return; }  void kb_cir_mov(void) { 	initgraph(640, 480);  	setcolor(RED); 	const int r = 20; 	int x = 320; 	int y = 240; 	circle(x, y, r); 	setfillcolor(RED); 	fillcircle(x, y, r); 	setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 6); 	line(x, y + r, x, y + r + 20); 	line(x, y + r, x - 20, y + 35); 	line(x, y + r, x + 20, y + 35); 	line(x, y + r + 20, x - 20, y + 70); 	line(x, y + r + 20, x + 20, y + 70);  	char c = 0;  	while (c != 27) { 		if (kbhit()) { 			c = getch(); 			switch (c) { 				case 'w': { 					setcolor(BLACK); 					circle(x, y, r); 					setfillcolor(BLACK); 					fillcircle(x, y, r); 					setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 6); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  					if (y - r <= 0) { 						setcolor(RED); 						circle(x, y, r); 						setfillcolor(RED); 						fillcircle(x, y, r); 						line(x, y + r, x, y + r + 20); 						line(x, y + r, x - 20, y + 35); 						line(x, y + r, x + 20, y + 35); 						line(x, y + r + 20, x - 20, y + 70); 						line(x, y + r + 20, x + 20, y + 70); 						break; 					} 					y -= 20; 					setcolor(RED); 					circle(x, y, r); 					setfillcolor(RED); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  				}break;  				case 's': { 					setcolor(BLACK); 					circle(x, y, r); 					setfillcolor(BLACK); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  					if (y + r + 70 >= 480) { 						setcolor(RED); 						circle(x, y, r); 						setfillcolor(RED); 						fillcircle(x, y, r); 						line(x, y + r, x, y + r + 20); 						line(x, y + r, x - 20, y + 35); 						line(x, y + r, x + 20, y + 35); 						line(x, y + r + 20, x - 20, y + 70); 						line(x, y + r + 20, x + 20, y + 70); 						break; 					} 					y += 20; 					setcolor(RED); 					circle(x, y, r); 					setfillcolor(RED); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  				}break; 				case 'a': { 					setcolor(BLACK); 					circle(x, y, r); 					setfillcolor(BLACK); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  					if (x - 35 <= 0) { 						setcolor(RED); 						circle(x, y, r); 						setfillcolor(RED); 						fillcircle(x, y, r); 						line(x, y + r, x, y + r + 20); 						line(x, y + r, x - 20, y + 35); 						line(x, y + r, x + 20, y + 35); 						line(x, y + r + 20, x - 20, y + 70); 						line(x, y + r + 20, x + 20, y + 70); 						break; 					} 					x -= 20; 					setcolor(RED); 					circle(x, y, r); 					setfillcolor(RED); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70); 				}break;  				case 'd': { 					setcolor(BLACK); 					circle(x, y, r); 					setfillcolor(BLACK); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70);  					if (x + 35 >= 640){ 						setcolor(RED); 						circle(x, y, r); 						setfillcolor(RED); 						fillcircle(x, y, r); 						line(x, y + r, x, y + r + 20); 						line(x, y + r, x - 20, y + 35); 						line(x, y + r, x + 20, y + 35); 						line(x, y + r + 20, x - 20, y + 70); 						line(x, y + r + 20, x + 20, y + 70); 						break; 					 					} 					x += 20; 					setcolor(RED); 					circle(x, y, r); 					setfillcolor(RED); 					fillcircle(x, y, r); 					line(x, y + r, x, y + r + 20); 					line(x, y + r, x - 20, y + 35); 					line(x, y + r, x + 20, y + 35); 					line(x, y + r + 20, x - 20, y + 70); 					line(x, y + r + 20, x + 20, y + 70); 				}break;  				case 'q': { 					/*	 					circle(x + 23, y, 5); 					setfillcolor(RED); 					fillcircle(x + 23, y, 5); 					*/ 					q_move(x + 28, y, 5);  				}break;   				default:continue; 					 			} 		}  	}  	closegraph();   	return; }  int main(void) { 	kb_cir_mov();  	return 0; } 值得学习

圆心坐标x，y，程序循环中每次产生随机数dx，dy（正负对称分布），新的圆心坐标为x+dx，y+dy，超出边界的时候处理一下，比如超过的部分减（反弹）回来。

百度搜相关关键字。

现在这个圆的运动是有规律的，请大佬指点一下。

目前这代码只能展示一个圆。


Question: Bug

引用 2 楼 cfjtaishan 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct stu {     int student_number;     char name[20];     float grade[3];     struct stu *next; }s;  int n;   /*全局变量不需初始化位0*/  struct stu *creat() {     s *p1,*p2,*head;     int i=0;     p2 = p1 = (s *)malloc(sizeof(s));     if (!p1)         exit(0);     p1->next = NULL;     //if(n=0)     if(n==0)   /* == not = */         head = p1;     printf("Please input student number:\n");     scanf("%d",&(p1->student_number));     getchar();     printf("Please input student name:\n");     scanf("%c",&p1->name[i]);     while(p1->name[i] != '\n' && i < 20 - 1)     {         i++;         scanf("%c",&p1->name[i]);     }     p1->name[i] = 0;      printf("What are grades?\n");     scanf("%f %f %f",&(p1->grade[0]),&(p1->grade[1]),&(p1->grade[2]));      n += 1;     return (head); };  struct stu *output(s *head) {     s *p1;     p1 = head;     printf("Here are all informations:\nStudent number         Name         grade1   grade2   grade3\n");     while(p1)     {         printf("%10d    %20s   %.2f   %.2f   %.2f\n",p1->student_number,p1->name,p1->grade[0],p1->grade[1],p1->grade[2]);         p1 = p1->next;     } };  int main() {     s *head;     head = creat();     output(head);     return 0; } 参考一下吧  grades数组下表应该是从0开始的。 name是字符数组，若要以%s输出需要给末尾加'\0'；并且注意name越界的问题。即i <20-1是必须的。 head应该是指向p1的，而不是p1->next; output函数里，要先让p1指向head，否则会造成无限循环；  其他问题建议对照代码看一下  楼上是真的强，帮人帮的真彻底

&(p1->grade[3])  访问越界


Question: 大佬们帮帮看看萌新错在了哪

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

#include<stdio.h> #include<stdlib.h> #define     PER_TEN_YEARS        10 #define     FEMALE_PER_EGGS     2 #define     CADRE_PER_EGGS      5 int main(void) { 	int type;   /* 1: female, 0: male*/ 	int work_years; 	int cadre;    /* 1: is cadre, 0: is not cadre*/ 	int total_eggs, base; 	printf("Please input type(1:female, 0: male) and work years: "); 	scanf_s("%d%d", &type, &work_years); 	while (type != 0 && type != 1) { 		printf("Type input error, please input again!\n"); 		scanf_s("%d", &type); 	} 	printf("Please input check if is cadre(1: yes, 0: no): "); 	scanf_s("%d", &cadre); 	while (cadre != 0 && cadre != 1) { 		printf("Cadre input error, please input again!\n"); 		scanf_s("%d", &cadre); 	} 	if (work_years % 10) 		base = work_years / 10 + 1; 	else 		base = work_years / 10; 	total_eggs = PER_TEN_YEARS * base; 	if (type) 		total_eggs += FEMALE_PER_EGGS * base; 	if (cadre) 		total_eggs += CADRE_PER_EGGS * base; 	printf("The staff should get %d kg eggs!\n", total_eggs); 	system("pause"); 	return 0; } 用VS写的，表示正常输出要这样，谢谢各位大佬

#include<stdio.h> #include<stdlib.h>  #define     PER_TEN_YEARS        10 #define     FEMALE_PER_EGGS     2 #define     CADRE_PER_EGGS      5  int main(void) {     int type;   /* 1: female, 0: male*/     int work_years;     int cadre;    /* 1: is cadre, 0: is not cadre*/     int total_eggs, base;      printf("Please input type(1:female, 0: male) and work years: ");     scanf("%d%d", &type, &work_years);     while (type != 0 && type != 1) {         printf("Type input error, please input again!\n");         scanf("%d", &type);     }     printf("Please input check if is cadre(1: yes, 0: no): ");     scanf("%d", &cadre);     while (cadre != 0 && cadre != 1) {         printf("Cadre input error, please input again!\n");         scanf("%d", &cadre);     }      if (work_years % 10)         base = work_years / 10 + 1;     else         base = work_years / 10;     total_eggs = PER_TEN_YEARS * base;      if (type)         total_eggs += FEMALE_PER_EGGS * base;     if (cadre)         total_eggs += CADRE_PER_EGGS * base;     printf("The staff should get %d kg eggs!\n", total_eggs);      return 0;  } 改正上一个的一个Bug.当工作年限正好是10的倍数时，base = work_years  / 10，否则base = work_years  / 10 + 1；

#include<stdio.h> #include<stdlib.h>  #define     PER_TEN_YEARS        10 #define     FEMALE_PER_EGGS     2 #define     CADRE_PER_EGGS      5  int main(void) {     int type;   /* 1: female, 0: male*/     int work_years;     int cadre;    /* 1: is cadre, 0: is not cadre*/     int total_eggs, base;      printf("Please input type(1:female, 0: male) and work years: ");     scanf("%d%d", &type, &work_years);     while (type != 0 && type != 1) {         printf("Type input error, please input again!\n");         scanf("%d", &type);     }     printf("Please input check if is cadre(1: yes, 0: no): ");     scanf("%d", &cadre);     while (cadre != 0 && cadre != 1) {         printf("Cadre input error, please input again!\n");         scanf("%d", &cadre);     }      base = work_years / 10 + 1;     total_eggs = PER_TEN_YEARS * base;      if (type)         total_eggs += FEMALE_PER_EGGS * base;     if (cadre)         total_eggs += CADRE_PER_EGGS * base;     printf("The staff should get %d kg eggs!\n", total_eggs);      return 0;  } 参考一下吧


Question: C语言救急！！

引用 4 楼 cfjtaishan 的回复:[quote=引用 楼主 qq_41229894 的回复:] 我是想将输入的数转化为数字图形。程序不知道哪出了问题，真心求助大家！！  #include<stdio.h> #include<string.h> #include<math.h> char y[1000];//定义全局变量数组y用来存放之后拼接的符号。  char *m[10]; int main() { 	void sca(int a); 	int s,n=0,x; 	char a[20]={' ','#','#',' ','#',' ',' ','#','#',' ',' ','#','#',' ',' ','#',' ','#','#',' '}; 	char b[20]={' ','#',' ',' ','#','#',' ',' ',' ','#',' ',' ',' ','#',' ',' ','#','#','#',' '},c[20]={' ','#','#',' ','#',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ','#','#','#','#'}; 	char d[20]={' ','#','#',' ',' ',' ',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#','#',' '},e[20]={'#',' ','#',' ','#',' ','#',' ','#','#','#',' ',' ',' ','#',' ',' ',' ','#',' '}; 	char f[20]={'#','#','#',' ','#',' ',' ',' ','#','#','#',' ',' ',' ','#',' ','#','#','#',' '},g[20]={' ',' ','#',' ',' ','#',' ',' ','#','#','#',' ','#',' ',' ','#',' ','#','#',' '}; 	char h[20]={'#','#','#','#',' ',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ',' '},i[20]={' ','#','#',' ','#',' ',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#','#',' '}; 	char j[20]={' ','#','#',' ','#',' ',' ','#',' ','#','#','#',' ',' ',' ','#',' ',' ',' ','#'}; 	//定义0到9的符号数组分别存放在数组a到j中。  	m[0]=a,m[1]=b,m[2]=c,m[3]=d,m[4]=e,m[5]=f,m[6]=g,m[7]=h,m[8]=i,m[9]=j; 	//把a到j的首地址复制给指针数组m的0到9. 	scanf("%d",&s); 	sca(s); 	 	return 0; 	 } void sca(int a) { 	int n,c,d,i,p,k; 	char S[100]; 	sprintf(S,"%d",a);//把形参a转化为字符串赋值到数组s中。 	n=strlen(S);//计算长度即输入的整数位数。 	d=n; 	for(i=0;i<5;i++)//有5行所以循环5次。 	{n=d; 		for(;n>0;n--) 		{ 			c=pow(10,(n-1)); 			if(n!=d) 			{a=a-p*pow(10,n);} 			p=(a/c);//计算第1++位的数值。             strncpy(y,(m[p]+4*i),4);//把值输入到y中。		 			 		} 	 } 	 //printf("%d",d); 	 for(n=0;n<5;n++) 	 { 	 	for(i=0;i<20*d;i++) 	 	{   if(i%(4*d)==0) 	 		{printf("\n");} 	 		printf("%c",y[i]); 		 } 	  } }  此处应该是判断而不是赋值  if(i=5)  break;  改为： if(i == 5) break;   逻辑不清晰，不好修改；不知道你要实现怎么表示数字。[/quote]我改了那里现在只有最后一个数是对的，能看看那有错吗  引用 4 楼 cfjtaishan 的回复:[quote=引用 楼主 qq_41229894 的回复:] 我是想将输入的数转化为数字图形。程序不知道哪出了问题，真心求助大家！！  #include<stdio.h> #include<string.h> #include<math.h> char y[1000];//定义全局变量数组y用来存放之后拼接的符号。  char *m[10]; int main() { 	void sca(int a); 	int s,n=0,x; 	char a[20]={' ','#','#',' ','#',' ',' ','#','#',' ',' ','#','#',' ',' ','#',' ','#','#',' '}; 	char b[20]={' ','#',' ',' ','#','#',' ',' ',' ','#',' ',' ',' ','#',' ',' ','#','#','#',' '},c[20]={' ','#','#',' ','#',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ','#','#','#','#'}; 	char d[20]={' ','#','#',' ',' ',' ',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#','#',' '},e[20]={'#',' ','#',' ','#',' ','#',' ','#','#','#',' ',' ',' ','#',' ',' ',' ','#',' '}; 	char f[20]={'#','#','#',' ','#',' ',' ',' ','#','#','#',' ',' ',' ','#',' ','#','#','#',' '},g[20]={' ',' ','#',' ',' ','#',' ',' ','#','#','#',' ','#',' ',' ','#',' ','#','#',' '}; 	char h[20]={'#','#','#','#',' ',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ',' '},i[20]={' ','#','#',' ','#',' ',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#','#',' '}; 	char j[20]={' ','#','#',' ','#',' ',' ','#',' ','#','#','#',' ',' ',' ','#',' ',' ',' ','#'}; 	//定义0到9的符号数组分别存放在数组a到j中。  	m[0]=a,m[1]=b,m[2]=c,m[3]=d,m[4]=e,m[5]=f,m[6]=g,m[7]=h,m[8]=i,m[9]=j; 	//把a到j的首地址复制给指针数组m的0到9. 	scanf("%d",&s); 	sca(s); 	 	return 0; 	 } void sca(int a) { 	int n,c,d,i,p,k; 	char S[100]; 	sprintf(S,"%d",a);//把形参a转化为字符串赋值到数组s中。 	n=strlen(S);//计算长度即输入的整数位数。 	d=n; 	for(i=0;i<5;i++)//有5行所以循环5次。 	{n=d; 		for(;n>0;n--) 		{ 			c=pow(10,(n-1)); 			if(n!=d) 			{a=a-p*pow(10,n);} 			p=(a/c);//计算第1++位的数值。             strncpy(y,(m[p]+4*i),4);//把值输入到y中。		 			 		} 	 } 	 //printf("%d",d); 	 for(n=0;n<5;n++) 	 { 	 	for(i=0;i<20*d;i++) 	 	{   if(i%(4*d)==0) 	 		{printf("\n");} 	 		printf("%c",y[i]); 		 } 	  } }  此处应该是判断而不是赋值  if(i=5)  break;  改为： if(i == 5) break;   逻辑不清晰，不好修改；不知道你要实现怎么表示数字。[/quote]我改了那里现在只有最后一个数是对的，能看看哪有错吗？

我修改了一下 现在无论输入几位数都能显示出他们的第一行，但是其他四行的都出不来 真心希望得到帮助#include<stdio.h> #include<string.h> #include<math.h> char y[1000];//定义全局变量数组y用来存放之后拼接的符号。  char *m[10]; int main() {     void sca(int a);     int s,x;     char a[20]={' ','#','#',' ','#',' ',' ','#','#',' ',' ','#','#',' ',' ','#',' ','#','#',' '};     char b[20]={' ','#',' ',' ','#','#',' ',' ',' ','#',' ',' ',' ','#',' ',' ','#','#','#',' '},c[20]={' ','#','#',' ','#',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ','#','#','#','#'};     char d[20]={' ','#','#',' ',' ',' ',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#','#',' '},e[20]={'#',' ','#',' ','#',' ','#',' ','#','#','#',' ',' ',' ','#',' ',' ',' ','#',' '};     char f[20]={'#','#','#',' ','#',' ',' ',' ','#','#','#',' ',' ',' ','#',' ','#','#','#',' '},g[20]={' ',' ','#',' ',' ','#',' ',' ','#','#','#',' ','#',' ',' ','#',' ','#','#',' '};     char h[20]={'#','#','#','#',' ',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ',' '},i[20]={' ','#','#',' ','#',' ',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#','#',' '};     char j[20]={' ','#','#',' ','#',' ',' ','#',' ','#','#','#',' ',' ',' ','#',' ',' ',' ','#'};     //定义0到9的符号数组分别存放在数组a到j中。      m[0]=a,m[1]=b,m[2]=c,m[3]=d,m[4]=e,m[5]=f,m[6]=g,m[7]=h,m[8]=i,m[9]=j;     //把a到j的首地址复制给指针数组m的0到9.     scanf("%d",&s);     sca(s);           return 0;       } void sca(int a) {     int n,c,d,i,p,k=0;     char S[100];     sprintf(S,"%d",a);//把形参a转化为字符串赋值到数组s中。     n=strlen(S);//计算长度即输入的整数位数。     d=n;//赋值给d。      while(1)     {	 		n=d; 		for(i=0;i<5;i++) 		{     		for(;n>0;n--)     		{ 				c=pow(10,(n-1));     			if(n!=d)     			{a=a-p*pow(10,n);}     			p=(a/c);  				for(k;k<4;k++) 				{ 					static int b=0; 					y[b++]=*(*(m+p)+k+i*4); 				 } 				 k=0;      		}         }if(i=5) break;	 	}      for(n=0;n<(d*20);n++)      {      	if((n%(4*d)==0)&&(n!=0)) printf("\n");      	printf("%c",y[n]); 	 } }

引用 楼主 qq_41229894 的回复:我是想将输入的数转化为数字图形。程序不知道哪出了问题，真心求助大家！！ #include<stdio.h> #include<string.h> #include<math.h> char y[1000];//定义全局变量数组y用来存放之后拼接的符号。  char *m[10]; int main() { 	void sca(int a); 	int s,n=0,x; 	char a[20]={' ','#','#',' ','#',' ',' ','#','#',' ',' ','#','#',' ',' ','#',' ','#','#',' '}; 	char b[20]={' ','#',' ',' ','#','#',' ',' ',' ','#',' ',' ',' ','#',' ',' ','#','#','#',' '},c[20]={' ','#','#',' ','#',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ','#','#','#','#'}; 	char d[20]={' ','#','#',' ',' ',' ',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#','#',' '},e[20]={'#',' ','#',' ','#',' ','#',' ','#','#','#',' ',' ',' ','#',' ',' ',' ','#',' '}; 	char f[20]={'#','#','#',' ','#',' ',' ',' ','#','#','#',' ',' ',' ','#',' ','#','#','#',' '},g[20]={' ',' ','#',' ',' ','#',' ',' ','#','#','#',' ','#',' ',' ','#',' ','#','#',' '}; 	char h[20]={'#','#','#','#',' ',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ','#',' ',' ',' '},i[20]={' ','#','#',' ','#',' ',' ','#',' ','#','#',' ','#',' ',' ','#',' ','#','#',' '}; 	char j[20]={' ','#','#',' ','#',' ',' ','#',' ','#','#','#',' ',' ',' ','#',' ',' ',' ','#'}; 	//定义0到9的符号数组分别存放在数组a到j中。  	m[0]=a,m[1]=b,m[2]=c,m[3]=d,m[4]=e,m[5]=f,m[6]=g,m[7]=h,m[8]=i,m[9]=j; 	//把a到j的首地址复制给指针数组m的0到9. 	scanf("%d",&s); 	sca(s); 	 	return 0; 	 } void sca(int a) { 	int n,c,d,i,p,k; 	char S[100]; 	sprintf(S,"%d",a);//把形参a转化为字符串赋值到数组s中。 	n=strlen(S);//计算长度即输入的整数位数。 	d=n; 	for(i=0;i<5;i++)//有5行所以循环5次。 	{n=d; 		for(;n>0;n--) 		{ 			c=pow(10,(n-1)); 			if(n!=d) 			{a=a-p*pow(10,n);} 			p=(a/c);//计算第1++位的数值。             strncpy(y,(m[p]+4*i),4);//把值输入到y中。		 			 		} 	 } 	 //printf("%d",d); 	 for(n=0;n<5;n++) 	 { 	 	for(i=0;i<20*d;i++) 	 	{   if(i%(4*d)==0) 	 		{printf("\n");} 	 		printf("%c",y[i]); 		 } 	  } }  此处应该是判断而不是赋值  if(i=5)  break;  改为： if(i == 5) break;   逻辑不清晰，不好修改；不知道你要实现怎么表示数字。

谢谢大家。1!!!

我找到错误了这个a变了，应该在这个for语句之前把a定义回原值

冉冉升起的巨星，加油！！！！！！

引用 5 楼 cfjtaishan 的回复:i, j, k都用于数组名了，代码的可读性，coding style不利于阅读。我的运行数字图在下面

好像是这里表达有问题，但是我也不知道该怎么表达，感觉逻辑没问题。

单步跟踪程序运行，观察变量变化情况，看是哪里与你期望的不一致，分析原因


Question: 以下代码有三处错误，请找到错误并用文字描述错误修改方法

问题1：s是野指针，为对其分配有效的内存空间就是用，很可能会导致段错误； 问题2：free(s);free是与malloc/realloc/calloc其中之一匹配使用，没有申请空间的操作，就没有free的操作；因此此处也是可能导致段错误； 问题3：返回局部内存空间地址，这是未定义的操作，因为局部变量的生命周期是从定义开始到函数调用结束而结束；因此局部变量再已经释放后再使用，结果是未定义的。 问题4：sizeof是一个宏，主要是计算某个变量类型的大小，比如sizeof(int)即4(32位系统里），int a; sizeof(a)其实也是计算a类型占内存的大小，和sizeof(int)是一样的，因为a的类型是int；sizeof(s)，由于s是指针，因此sizeof(s)等价于sizeof(int *);大小也是4；若sizeof(ss),由于ss是数组，因此计算的是数组占的内存大小，即sizeof(char) * N;  #include<stdio.h> #include <stdlib.h> #include<string.h>  #define N 80  char* myStrcpy(char *s) {     int i;     char *ss = (char *)malloc(sizeof(char) * N);     if (!ss)         exit(0);      for(i = 0; s[i]; i++)         ss[i] = s[i];      return ss; }  int main() {     char *s, *str = NULL;     s = (char *)malloc(sizeof(char) * N);     if (!s)         return -1;     scanf("%s", s);     str = myStrcpy(s);     printf("%s\n", str);      free(s);     free(str);     return 0; }  修改后的。栈上的空间，生命周期是从申请开始知道free之前

1、函数myStrcpy里对参数s的sizeof运算，得到的结果是字符指针所占空间大小，获取字符串长度的正确方法是strlen； 2、函数myStrcpy不能直接返回ss； 3、main函数中，s未用malloc或alloc分配内存，故不能直接scanf输入，亦不能用free释放内存。

char ss[N];  //数组定义未进行初始化 return ss; //此句前面要给数组的最后加'\0',否则不是完整的数组 free(s);  //free应与malloc函数配套使用，若要是用free函数，前面指针定义应该改成char *s=malloc(N*sizeof(char));


Question: C语言中单引号与双引号的区别？

双引号“”是字符串，以\0结尾。 单引号''是字符。 char本身只能保存一个字符，所以语句 char a = "A";  你用的编译器虽然通过，但是也报了警告。警告的原因是数据类型需要强制转换，你用编译器跟进去看看，41可能就是字符串"A"的地址。

char a = "A"; 把字符串 A 的首地址赋值给 a，这个过程将地址的值 (32为4字节，64位8字节) 截断为 1 字节。结果是不确定的，运行时才能知道。

引用 3 楼 cfjtaishan 的回复:单引号指字符，双引号指字符串。用字符去存储字符串肯定会给警告； 因为字符串至少是赋值给字符数组或者字符指针。 警告的原因是类型不匹配。

两者是不同的 'A’代表的是一个整数，而且这个整数对应的是编译器所采用的字符集中的字符序列对应的数值; "A"是个字符串， printf("%d\n",a)，使用了%d, 就要进行转换， 这也是编译提示警告的原因

因为单引号表示一个字符他与ASCII码对应。双引号就代表字符串，系统会自动给字符串末尾加上'\0'


Question: 【形参和实参的地址】

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

谁说是按地址传递，这明明是按值传递，形参是通过实参复制来的，本身就是两个变量，地址当然不一样了

什么叫”按地址传递参数“？形参和实参是两个对象，在你的程序里就是有两个a。 另外用%p输出int*是未定义行为，见：https://stackoverflow.com/questions/9056328/printf-and-pointers，需要显示转换成void*。


Question: 数组实际运用上的一点小问题，求解决

请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

你Conut声明错了，声明和实现时写的不一致，把声明里第三个参数改成int aver[]

#include "stdafx.h"  #define I 40 #define J 3  void Readscore(int s[][3], int n); int Conut(int s[][3],int sum[],int aver[], int n);  int main() {     int s[I][J], n, sum[I], aver[I],i;     printf("Plase enter the students numbers:");     scanf_s("%d", &n);     Readscore(s, n);                                         /*读入n个学生三科的成绩*/     Conut(s, sum, aver, n);     for (i = 0;i < n; i++)     {         printf("第%d号学生 总分为:%d  平均分为: %d", i, sum[i], aver[i]);     }      return 0; }  void Readscore(int s[][3], int n) {     int i, j;     printf("请分别输入学生三科的成绩:");     for (i = 0; i < n;i++)     {         for (j = 0;j < 3;j++)         {             scanf_s("%d", &s[i][j]);         }     } }  int Conut(int s[][3],int sum[],int aver[],int n) {     int i,j;     for (i = 0;i < n;i++)     {         sum[i] = 0;         for (j = 0;j < 3;j++)         {             sum[i] = sum[i] + s[i][j];         }         aver[i] = sum[i] / 3;     }      return 0; } 参考一下吧  Conut函数声明和定义参数类型不一致，看一下aver类型是否一致； Readscore函数缺少参数，该函数里的n是局部变量，并且是未初始化。从逻辑上考虑，应该是用main函数里的n变量，因此应该加一个形参，然后接收main函数里的n值。

#include "stdafx.h" #define I 40 #define J 3 void Readscore(int s[][3],int n); int Conut(int s[][3],int sum[],int aver[],int n);//这个地方楼主的声明和定义的参数不一致，声明是整形的，定义却是数组类型   int main() { 	int s[I][J], n, sum[I], aver[I],i; 	printf("Plase enter the students numbers:"); 	scanf_s("%d", &n); 	Readscore(s,n);                                         /*读入n个学生三科的成绩*/   	Conut(s, sum, aver, n); 	for (i = 0;i < n;i++) 	{ 		printf("第%d号学生 总分为:%d  平均分为: %d", i, sum[i], aver[i]); 	}  	return 0; }  void Readscore(int s[][3],int n)	//这个地方应该参数少了整形一个变量 int n ; { 	int i;int j;  	printf("请分别输入学生三科的成绩:"); 	for (i = 0;i < n;i++) 	{ 		for (j = 0;j < 3;j++) 		{ 			scanf_s("%d", &s[i][j]); 		} 	} }  int Conut(int s[][3],int sum[],int aver[],int n) { 	int i,j; 	for (i = 0;i < n;i++) 	{ 		sum[i] = 0; 		for (j = 0;j < 3;j++) 		{ 			sum[i] = sum[i] + s[i][j]; 		} 		aver[i] = sum[i] / 3;  	} 	return 0; }  楼主还是要自己多自己检查自己的代码

#include <stdlib.h> #include <stdio.h> #define I 40 #define J 3 void Readscore(int s[][3], int n); int Conut(int s[][3],int sum[],int aver[], int n);   int main() { 	int s[I][J], sum[I], aver[I]; 	 	int n = 0;  	printf("Plase enter the students numbers:");  	scanf("%d", &n);  	 	if(n<1 || n>40){ 		puts("n range error"); 	} 	Readscore(s, n);                                         /*读入n个学生三科的成绩*/    	Conut(s, sum, aver, n); 	for(int i=0; i<n; i++){  		printf("第%d号学生 总分为:%d  平均分为: %d", i, sum[i], aver[i]);  	}  	return 0; }   void Readscore(int s[][3], int n) { 	printf("请分别输入学生三科的成绩:"); 	for (int i = 0;i < n;i++){ 		for (int j = 0;j < 3;j++){  			scanf("%d", &s[i][j]);  		}  	} }   int Conut(int s[][3],int sum[],int aver[],int n) { 	for (int i = 0;i < n;i++){  		sum[i] = 0;  		for (int j = 0;j < 3;j++){  			sum[i] = sum[i] + s[i][j];  		}  		aver[i] = sum[i] / 3;  	} } 编译:gcc test.c -std=c99 -o test 操作系统:ubuntu14 64位 上面代码可以正常工作。


Question: 函数的调用

递归的参数表里只有一个参数；应该是两个参数；  j=age(k-1)+2; 根据自己的逻辑改一下这个地方；  另外，还有一个错误，这个错误是大家都容易犯的错误。  //if(k=1)     if(k==1) 应该是判断语句，不是赋值语句；

j=age(k-1)+2;这一句应该传入两个参数，楼主只传入了一个

#include <stdio.h>  int main()  {  int age(int k,int l);  int a,i,z;  printf("Please input the first student's age:\n");  scanf_s("%d",&a);  printf("Please input the student who you want to know 's number:\n");  scanf_s("%d",&i);  z=age(i,a);  printf("So the %d 's age is: ",i);  return  0;  }   int age(int k,int l)  {  int j;  if(k=1)  j=l;  else  j=age(k-1,2);  return j;  }

楼上正解  你在递归的时候只传了一个参数


Question: 大一新生C语言求助。

可以再“调试”中设置断点，F5运行，进行调试，看堆栈，看看问题出在哪里了，在通过F10，F11通过逐步或逐过程进行调试

引用 10 楼 SXJIAKE 的回复:[quote=引用 6 楼 zaokang5603 的回复:] 我说两点吧： 1.int *p1 = (int *)a; //     int *p2 = (int *)b;   这个代码有问题，上面执行的结果就是把Assisc码转化为整形，例如‘a’变为整形就是97，你可以试着通过下面的函数进行转化：int  atoi（char *）;  1.int c[n1], d[n2] n1和n2没有初始化，应该编译不过去吧， 	for (n = 0; n<n1; n++)//分别赋值到两个数组。  	{ 		c[n] = *(p1 + n); 	} 	for (n = 0; n<n2; n++) 	{ 		d[n] = *(p2 + n); 	} 其实可以给c[100],d[100],想把指针里的内容复制到数组中，可以通过结束符‘\0’判断停止如果你是将 acsii 转为整型，需要转吗？直接用不就是了吗？再说了，也不能 char * 到 int *，一个 1 字节指针,一个 4 字节指针，怎么转?[/quote]我懂了

调试：可以用输出某些值，来判断错误，这种方法比较简单

是不是就是任意两个字符整数相加，最后输出就可以了，怎么感觉你的代码弄得复杂了呢 下面代码仅供参考：  char *a,*b; a=(char *)malloc(100); b=(char *)malloc(100); scanf("%s%s",a,b);//以字符串形式输入 int  num1 =atoi (a); int num2 =atoi(b); int sum =num1 +num2; printf("%d\n",sum); 而且在控制台就是以字符串输入的，我们使用scanf("%d%d",a,b)把字符串格式化为为整形复制给a和b。所以 int a,b; scanf("%d%d",&a,&b);//以字符串形式输入 int  sum =a+b; 可能我理解的有问题把，仅供参考

原来字符串数组可以强转为数字数组，开眼界了……int *p1=(int *)a; //转化为整形。  int *p2=(int *)b;

引用 6 楼 zaokang5603 的回复:我说两点吧： 1.int *p1 = (int *)a; //     int *p2 = (int *)b;   这个代码有问题，上面执行的结果就是把Assisc码转化为整形，例如‘a’变为整形就是97，你可以试着通过下面的函数进行转化：int  atoi（char *）;  1.int c[n1], d[n2] n1和n2没有初始化，应该编译不过去吧， 	for (n = 0; n<n1; n++)//分别赋值到两个数组。  	{ 		c[n] = *(p1 + n); 	} 	for (n = 0; n<n2; n++) 	{ 		d[n] = *(p2 + n); 	} 其实可以给c[100],d[100],想把指针里的内容复制到数组中，可以通过结束符‘\0’判断停止如果你是将 acsii 转为整型，需要转吗？直接用不就是了吗？再说了，也不能 char * 到 int *，一个 1 字节指针,一个 4 字节指针，怎么转?

知道了些我还不太会，继续学习。

引用 3 楼 user-4 的回复:出错了中断下来，通过调用堆栈定位到相关位置，分析原因你说的什么调用的我都不会。。

出错了中断下来，通过调用堆栈定位到相关位置，分析原因

#include<stdio.h> #include<string.h> #include<stdlib.h> int n1,n2,h[1000]; int main() { 	void sum(int *a,int *b,int k1,int k2);//相加函数。  	char *a,*b; 	a=(char *)malloc(100); 	b=(char *)malloc(100); 	scanf("%s%s",a,b);//以字符串形式输入。  	n1=strlen(a); //得出位数。  	n2=strlen(b); 	int *p1=(int *)a; //转化为整形。  	int *p2=(int *)b; 	int c[n1],d[n2],n; 	for(n=0;n<n1;n++)//分别赋值到两个数组。  	{ 		c[n]=*(p1+n); 	} 	for(n=0;n<n2;n++) 	{ 		d[n]=*(p2+n); 	} 	sum(c,d,n1,n2); 	for(n=0;n<1000;n++)//输出相加结果。  	{ 		if((h[n])=='\0')  continue; 		printf("%d",h[n]); 	} 	return 0; } void sum(int *a,int *b,int k1,int k2) { 	int m1,m2,c,n=999; 	for(m1=k1-1,m2=k2-1;(m1>=0)&&(m2>=0);m1--,m2--,n--)//从个为开始加，当有其中一个数位数加尽了停止循环。  	{ 		if(c=(*(a+m1)+*(b+m2)+h[n])>9)//当两个相同位和h数组(即可能上一位进了一)相加大于9时。  		{ 			h[n]=c-10;//和为相加和减去10加上本身的值.  			h[n-1]++; 		} 		else  h[n]=(*(a+m1)+*(b+m2))+h[n];//如没有大于9则不用减10.  		while((m1<0)&&(m2>=0))//即当a数组位数小时。  		{ 			h[n--]=b[m2--]; 		} 		while(m2<0&&m1>=0) 		{ 			h[n--]=b[m1--]; 		} 	}	  } 这是我的代码上面好像发的的乱了


Question: 【char指针的疑问】

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

c指向了字符串的首地址啊，只是改变了c的指向，没有改变C指向内存的内容

表达式“Hello world”的值是char[]类型的，char[]是不是可以赋值给 char* 呢

3、*p=12 这句将可能导致出错，因为p还没指向一块有效内存，p是一个野指针，此时解引可能导致程序崩溃

*p = 12这个操作可能会导致段错误；因为p是野指针。  "Hello world"字符串不是13个字符，而是12个字符；算上'\0'也是12个字符；该字符串是字符串常量，是在只读数据段上申请空间和存放，而申请空间的首地址会存放在指针变量c中。*c是访问字符串的第一个字符；因为c存放的是字符串的首地址，因此*c就是*(c + 0)的意思，即c相对于字符串首地址向后偏移0个字节，即第一个字符。 输出字符串时，c存放的是首地址，输出时是从首地址开始将每个字符输出直到遇到'\0'，停止输出。

1、“Hello world”实际是const char[]类型，可退化为指针，相当于p是指向这个字符串首地址

2、只是指向这个字符串的开头位置，*c的值是'H'，如果要按字节读取后面的，需要身后移动c

大家，怎么没有一个人答道点子上： 既然c是一个指针，为什么可以对其赋值赋予的不是地址而是「字面量」

c风格的字符串是用首地址+结束符'\0'来组合使用的，char *c="Hello World";表示你把常量字符串的第一个字符'H'(首地址)保存在了c指针里头，这个常量字符串末尾隐含一个结束符。所以说这个字符串的size=12（包含那个隐含的结束符）。如果你输出c+2,则会输出 llo World,自己慢慢理解吧

2楼说得对，直接给*c赋值只能赋一个字符，你可以试试用指针指向这个字符，输出*c，发现只能输出一个字符，而输出c的话就是整个字符串了

引用 6 楼 qq_38204686 的回复:[quote=引用 5 楼 das白的回复:]这里赋的是这个字符串的首地址 ""默认加\0 等价于 *c = "" 不要问我为什么 我不知道 编译器就这样的 你可以看看反汇编  坐等大神回答[/quote]  怎么会等价于*c = ""呢？ *c分明是char类型，怎么会等于“”，字符串。应该是*c=‘a’；才对啊。

引用 5 楼 das白的回复:这里赋的是这个字符串的首地址 ""默认加\0 等价于 *c = "" 不要问我为什么 我不知道 编译器就这样的 你可以看看反汇编  坐等大神回答

这里赋的是这个字符串的首地址 ""默认加\0

赋给指针变量的「值」既然是地址，为什么这里只饥饿赋给一串「字面量」？？？

为什么是c=“Hello world”

其实我没太看懂你一楼的描述。直接回答后面的 为什么不是*c="Hello world"？ *c应该只是一个字符char类型，他怎么能等于一个字符串呢！就算用*c，也应该是*c = ‘a’; 也不能是等于字符串！

特别是注意这里，为什么不是*c="Hello world"？不是解指针后才是表示所指向的内容吗，但是这样的话也只能表示所指向的某一个字符啊？？


Question: 问题：人带着狼羊白菜过河，在没有人的时候狼会吃羊， 羊会吃白菜， 船每次只能乘人以及狼羊白菜其中一个，问最少经过多少步并输出步数

百度搜相关关键字。


Question: 还是文件操作函数，但是是新问题，会有无效的参数类型

FIND()函数里，判断语句写成赋值语句；  //if(n=w_room[i].num)         if(n == w_room[i].num) 同理ROOMM函数里： //if(n=w_room[i].num)         if(n == w_room[i].num)  建议比对一下结构体成员，有些成员没有定义或者定义的名字和你的使用名字不对，这些都是基础的语法问题。  类型不匹配：比如下面的代码：  scanf("%d", &w_room[i].live);             printf("请输入入住时间：\n");             scanf("%d", &w_room[i].in);             printf("请输入离店时间：\n");             scanf("%d", &w_room[i].out); in，out都是数组，那么输入的格式这样肯定是有问题的。in，out都是数组名，再取&怎么理解呢。  代码里太多硬性代码，比如30,20，代码可读性很差，另外注意代码风格。 现将语法问题解决，然后在考虑逻辑；注意将警告也一并去掉，即使把error去掉了，但是有警告一样无法实现想要的功能。

帮你改了程序错误，可以编译，逻辑错误没改，自己改改 #include<stdio.h>  #include<stdlib.h>  #define N 30 void main();   struct adm//顾客信息 {  char account[20];//账号  char secret[20];//密码  char name[20];//姓名  int id[19];//身份证号     char tel[20];//手机号码     int num;//正在住的房间 }w_adm[100];   struct selact  {     int room;     //房间号      int timein;   //年份月份    int timeout;  //年份月份      int money;    //所需要交的钱 }w_selact[100];        struct room//房间信息   { int num;//房号（101~110，201~210，301~310）  int kind;//单1，双2，大3 char tenant[20];//入住客户姓名 int live;//入住状态  int in[3];//入住时间  int out[3];//离店时间  int deposit;//所交押金  int money;//预计房费   }w_room[30];//前十个为单人间，中间十个为双人，最后十个为大床房  void FIND()//房间信息查询函数   { struct room w_room[30];  FILE *fpf;  int n,i;  int c;  printf("请输入你想要查询的房间号：\n");    scanf("%d",&n);  if((fpf=fopen("fangjianxinxi.txt","r+"))==NULL)  {  printf("找不到相应数据！"); exit(0);  }  for (i=0;i<30;i++)  {  if(n=w_room[i].num)  {  fscanf(fpf,"%d%d%s%d%d%d%d%d",&w_room[i].num,&w_room[i].kind,w_room[i].tenant,&w_room[i].live,&w_room[i].in,&w_room[i].out,&w_room[i].deposit,&w_room[i].money);  printf("房号：%d%d%s%d%d%d%d%d",w_room[i].num,w_room[i].kind,w_room[i].tenant,w_room[i].live,w_room[i].in,w_room[i].out,w_room[i].deposit,w_room[i].money);  break;  }  }  fclose(fpf);  printf("是否想要继续查询？\n1.继续\t2.返回\t3.退出\n");    scanf("%d",&c);  if (c==1) FIND();  else if(c==2) main();  else exit(0);  }   void ROOMM()//房间信息修改函数   { struct room w_room[30];   FILE *fpr;  int n,i;  int c;  printf("请输入要修改的房间号：\n");    scanf("%d",&n);  if((fpr=fopen("fangjianxinxi.txt","r+"))==NULL)  {  printf("找不到相应数据！"); exit(0);  }  for (i=0;i<30;i++)  {  if(n=w_room[i].num)  {  printf("请输入要修改的信息：\n");  printf("请输入房号：\n");  scanf("%d",&w_room[i].num);  printf("q请输入房间类型：\n");  scanf("%d",&w_room[i].kind);  printf("请输入顾客姓名：\n");  scanf("%s",w_room[i].tenant);  printf("请输入房间状态：\n");//  1代表有人  0代表没人   scanf("%d",&w_room[i].live);  printf("请输入入住时间：\n");  scanf("%d",&w_room[i].in);  printf("请输入离店时间：\n");  scanf("%d",&w_room[i].out);  printf("请输入所交押金：\n");  scanf("%d",&w_room[i].deposit);  printf("请输入预计房费：\n");  scanf("%d",&w_room[i].money);  fprintf(fpr,"%d%d%s%d%d%d%d%d",w_room[n].num,w_room[n].kind,w_room[n].tenant,w_room[n].live,w_room[n].in,w_room[n].out,w_room[n].deposit,w_room[n].money);  break;  }  }  fclose(fpr);  printf("是否继续修改？\n1.继续\t2.回到上一层\t3.退出系统\n");    scanf("%d",&c);  if (c==1) ROOMM();  else if(c==2) main();  else exit(0);  }   void checkin()                             //入住登记函数 { struct room w_room[30];   FILE *fp2,*fp1;      int kind,day,deposit,money,i=0,j=0;                  fp1=fopen("d:\\kcsj\\file\\data1.txt","a+");      fp2=fopen("d:\\kcsj\\file\\data2.txt","r+");      while(!feof(fp2))   {      fscanf(fp2,"%d%d%s%d",&w_room[i].num,&w_room[i].kind,w_room[i].tenant,&w_room[i].live);      fscanf(fp2,"%d%d%d%d",&w_room[i].in,&w_room[i].out,&w_room[i].deposit,&w_room[i].money);      i++;      }      printf("请选择你想要的房间种类：\n");      printf("1.单人房 1000￥/天\n");      printf("2.双人房 1000￥/天\n");      printf("3.大床房 1500￥/天\n");      scanf("%d",&kind);    //输入房间种类 while(kind!=1 && kind!=2 && kind!=3)          {          printf("请输入正确的房间种类(1,2,3):\n");          scanf("%d",&kind);          }                     printf("请输入住宿天数:\n");      scanf("%d",&day);                  switch(kind)  {  case 1:  for(j=0;j<10;j++)  {  if(w_room[j].live==0)  {  printf("您的房间号为：%d\n",w_room[j].num);  w_room[j].live=1;  break;   }   }  money=1000*day;   printf("您预计需要支付%d元:\n",money);  w_room[j].money=money;   deposit=200*day;  printf("请预交 %d 元押金:\n",deposit);  w_room[j].deposit=deposit;  break;   case 2:  for(j=10;j<20;j++)  {  if(w_room[j].live==0)  {  printf("您的房间号为：%d\n",w_room[j].num);  w_room[j].live=1;  break;   }   }  money=1000*day;   printf("您预计需要支付 %d 元:\n",money);  w_room[j].money=money;   deposit=200*day;  printf("请预交 %d 元押金:\n",deposit);  w_room[j].deposit=deposit;  break;  case 3:  for(j=20;j<30;j++)  {  if(w_room[j].live==0)  {  printf("您的房间号为：%d\n",w_room[j].num);  w_room[j].live=1;  break;   }   }  money=1500*day;   printf("您预计需要支付 %d 元\n",money);  w_room[j].money=money;   deposit=300*day;  printf("请预交 %d 元押金\n",deposit);  w_room[j].deposit=deposit;  break;     }   fp2=fopen("d:\\kcsj\\file\\data2.txt","w+");   for(j=0;j<i-1;j++)   {    fprintf(fp2,"%d %d %s %d ",w_room[j].num,w_room[j].kind,w_room[j].tenant,w_room[j].live);          fprintf(fp2,"%d %d %d %d ",w_room[j].in,w_room[j].out,w_room[j].deposit,w_room[j].money);   }    fclose(fp1);   fclose(fp2);  }   void main()  {  char m;  while(1)  {     printf("请选择你想要执行的操作：0，信息录入 \t1，查询 \t2，修改 \t3，退出\n");          scanf("%c",&m);     switch(m)     {     case '1':FIND();     break;     case '2':ROOMM();      break;     case '3':exit(0);     break;     case '0':checkin();     break;     }       getchar();  }  }


Question: 求助！大佬们快来啊

#include "stdafx.h" #include<string.h> #include<stdlib.h>  struct student { 	int num; 	struct student *next; }; int n; #define max sizeof(struct student)  struct student *linklist()  { 	struct student *p, *q; 	struct student *head; 	n = 0; 	p = q = (struct student *)malloc(max); 	if (!p) 		exit(0); 	scanf_s("%d", &p->num); 	head = NULL; 	while (p->num != 0) { 		n = n + 1; 		if (n == 1) 			head = p; 		else  			q->next = p; 		q = p; 		p = (struct student *)malloc(max); 		if (!p) 			exit(0); 		scanf_s("%d", &p->num); 	} 	q->next = NULL; 	free(p);  	return(head); }  void main() {  	struct student *d; 	d = linklist(); 	for ( ;d != NULL;d = d->next) 		printf("%d", d->num); 	printf("\n"); 	system("pause"); } 建议查一下scanf_s的使用，第三个参数若输入的是整型数，第三个参数可以省略，因为默认是4字节，但是若第三个参数是5，那么就会有问题了。int是应该是4字节，不是5字节。 还有退出循环是需要输入0

看了一下，程序没什么问题，但是存在内存泄漏，只malloc了空间后面没有释放 while (p->num != 0)，当你输入0的时候才结束，执行后续的打印


Question: 新手抓破脑袋不知道错在哪里

用 scanf_s 输入一个字符串： #include<stdio.h> int main() { char a[20]; scanf_s("%s",a,20);        /*a,20中的 ,20 是用来指定缓冲区大小的参数，表示最多读取n-1个字符，不加的话，编译器会出错，无法进行正常的字符串输入*/ printf("输入的字符串是:%s\n",a); return 0; }

scanf_s("%s",e, 10);

char e[10];  printf("what fuck:"); scanf_s("%s",e, 10); printf("what fuck:%s\n", e); 两步：去'\n'，加一个参数10；

用scanf_s获取字符串时，要指定大小。 scanf_s("%s",e, 10);

scanf_s("%s",e, 10);

不行 我还是乱码的  char e[10];	 	puts("hello man"); 	scanf_s("%s", e);  	printf("what the hell:%s\n", e);

scanf_s("%s", e， 10);

查了下帮助文档，scanf_s输入字符串的用法是这样的 scanf_s("%s",e,sizeof(e)); 也就是说要还需要一个参数表明e的大小

初始化数组e试试 char e[10]={};


Question: 一变二编码是什么

引用 6 楼 shihengzhen101 的回复:[quote=引用 5 楼 xuebing1995 的回复:] [quote=引用 4 楼 shihengzhen101 的回复:] 没有听说过这种描述方法，上下文中有没有关于这种编码的解释呢？  是BCD码  [/quote] 那就好说了额，最常用的不是8421码吗，转换一下就行了[/quote] 嗯，这个我懂

引用 5 楼 xuebing1995 的回复:[quote=引用 4 楼 shihengzhen101 的回复:] 没有听说过这种描述方法，上下文中有没有关于这种编码的解释呢？  是BCD码  [/quote] 那就好说了额，最常用的不是8421码吗，转换一下就行了

引用 4 楼 shihengzhen101 的回复:没有听说过这种描述方法，上下文中有没有关于这种编码的解释呢？  是BCD码

没有听说过这种描述方法，上下文中有没有关于这种编码的解释呢？

不确定是什么编码，不过看他这意思很可能是把一个字节的高低4位各转换为一个数字0~F，以ASCII编码存储，比如0x80变成"80"，就是两个字节了。

引用 1 楼 cfjtaishan 的回复:没听说过这样的编码 原话是这么说的： 接受客户端的请求，并将客户端的ip地址、接收数据的时间、数据状态（是否加密）、数据前的16字节(注意此处数据如果是密的不需要解密)做1变2编码保存到数据库。

没听说过这样的编码


Question: 萌新求助

感谢大佬，这个是去年的问题现在才看，就是你说的那样

void query_big_info() {     float x,y;     puts("输入价格范围x和y（中间用空格隔开）");     scanf("%f%f",&x,&y);     int i;     struct Info *head=NULL,*tmp=NULL;     for (i=0; i<30; i++)     {         if(info[i].total>=x&&info[i].total<=y)         {             if(!tmp)             {                 tmp=&info[i];                 head=tmp;             }             else             {                 tmp->next=&info[i];                 tmp=tmp->next;             }         }     }     tmp->next = NULL;      tmp = head;     printf("序号   种类    单价   数量    总价    支付    找零    卡号    购前    购后\n");     while(tmp)     {         printf("%4.4d  %s   %.2f   %.2f   %.2f  %.2f  %.2f   %d  %.2f  %.2f",                 tmp->id, fruit[tmp->ftype].fname, tmp->price, info->fnum,                 tmp->total, tmp->pay, tmp->ret, tmp->cardid, tmp->befpay,                 tmp->aftpay);         printf("时间: %d:%d\n", tmp->hour, tmp->minute);         /*         printf("%4.4d  %s   %.2f   %.2f   %.2f  %.2f  %.2f   %d  %.2f  %.2f",                info[i].id,                fruit[info[i].ftype].fname,                info[i].price,                info[i].fnum,                info[i].total,                info[i].pay,                info[i].ret,                info[i].cardid,                info[i].befpay,                info[i].aftpay);         printf("时间: %d:%d\n",info[i].hour,info[i].minute);         */         tmp = tmp->next;     } } 参考一下吧；  另外，自己数一下%d，%f个数和后面的参数是否是一一对应的，包括参数类型。 fscanf(fp,"%d%s%f%f%f%f%d%f%f%d%d",                &info[i].id,                fname,                &info[i].fnum,                &info[i].total,                &info[i].pay,                &info[i].ret,                &info[i].cardid,                &info[i].befpay,                &info[i].aftpay,                &info[i].hour,                &info[i].minute               ); scanf("%f%f",&x,&y); float类型应该以%f接收吧，double采用%lf


Question: 关于出圈问题，自己测试正确，但是oj过不去，问题出在哪里？（ps：初学者，大神勿喷）

简单测试是正确的，背后测试数据库就不是很清楚了。想请教一下。

数据很大的时候O(n*m)估计是过不去了，你百度下约瑟夫环的数学推导算法，那个是O(N)的，肯定能过去

#include <stdio.h> #include <stdlib.h>  int SaveNum(int n, int m) { 	if(n <= 0 || m <= 0) 	{ 		return -1; 	} 	 	struct{ 		int no; 		int next; 	}*a, t;  	int size = n * sizeof(t); 	a = malloc(size); 	if(a == NULL){ 		return -1; 	}  	int i, j, k, pos = 0; 	for(i = 0; i < n; ++i){ 		a[i].no = i + 1; 		a[i].next = (i + 1) % n; 	} 	 	for(i = n; i > 1; --i){ 		for(j = 0; j < m - 1; ++j){ 			if(j == m - 2){ 				a[pos].next = a[a[pos].next].next; 			} 			pos = a[pos].next; 		} 	} 	 	return a[pos].no; }  int main(void) { 	int n = 1, m = 1; 	 	while(n > 0 && m > 0){ 		printf("Please input the number of people(n) and the number to pick up(m):\n"); 		scanf("%d%d", &n, &m); 		printf("The number left is %d\n", SaveNum(n, m)); 	}  	return 0; }  Please input the number of people(n) and the number to pick up(m): 3 4 The number left is 2 Please input the number of people(n) and the number to pick up(m): 9 6 The number left is 7 Please input the number of people(n) and the number to pick up(m): 0 0 The number left is -1


Question: [憋尿坐等]vfork之后父进程的变量值变化的问题,跪求大佬解答

谢谢,来之不易的回答!

vfork  后只能调用 exit， exec 系列函数， 其他都是未定义行为 ...           (From  POSIX.1)  The  vfork()  function  has  the  same effect as fork(2), except that the behavior is undefined if the process created by        vfork() either modifies any data other than a variable of type pid_t used to store the return value from  vfork(),  or  returns  from  the        function  in  which  vfork()  was called, or calls any other function before successfully calling _exit(2) or one of the exec(3) family of        functions.


Question: 学习数组指针遇到的问题.

px的类型是int (*)[2];而*px的类型是int *。可以看一下这篇关于指针的博客。 http://blog.csdn.net/sinat_26106275/article/details/46352785

int arr[16] = { 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 }; int(*px)[2]; //赋值 px = (int(*)[2])arr; printf("%d %d\n",px,*px); //为什么px 与*px的地址值是一样的？ //如果想取数组arr第一个值 1，必须写成printf("%d \n",**px); ------------ 首先，px是一个指针，指向一个一维数组，该数组有2个元素，px每加1，就跳过一维数组所占用内存的长度 *px也是一个地址，与px具有相同的地址，只不过与px的类型不一样，px为 int(*)[2]，*px为int *，所以*px+1跳过一个int元素的长度 最后**px的类型就是int

引用 3 楼 cfjtaishan 的回复: //为什么px 与*px的地址值是一样的？     //如果想取数组arr第一个值 1，必须写成printf("%d \n",**px); px和*px地址是一样的。因为二维数组的地址和第一行第一列的是一个位置，因此地址值一样。但是他们除了地址值一样的，其他是不一样的。比如类型不一样， px的类型是int (*)[2];而*px的类型是int *；由于类型不一样的，因此px + 1与 （*px)+1相对与px和*px的偏移也是不一样的。px + 1等价相对于px的位置向后便宜2 * sizeof(int)个字节； 而(*px)+1等价于向后便宜sizeof(int) px++等价与px = px + 1;

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


Question: C语言txt文件，文件是很多行数字，每个数用空格隔开，怎么对每一个数字进行操作？

引用 4 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/360055953 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224 老师好，这个问题是我不用再开一个文件，只需要求出一个值就好。。

引用 5 楼 cfjtaishan 的回复:问一下对数字做什么操作？读，解析还是其他操作； 若是读，解析每个数字。可以考虑每次读一行，然后使用strtok_r解析，再调用atoi函数，最后可以把数字解析出来。 想把每行数字放在一个数组里，这里面的数字是user的编号，每一行第一个数是用户的编号，后面的数字是他的朋友，然后要算一下圈子，圈子是指他的朋友和朋友的朋友的序号的并集。。 然后我自己的想法是先放在数组里再将数组里的元素和别的数组比较，相同的就并到一起。。但是不知道能不能有效的解决问题

引用 2 楼 user-4 的回复:先读一行，找该行第一个空格，截取空格前部分，再找剩余部分空格，再截取空格..... 有没有具体点的代码呢？刚刚开始学C语言，不是很懂这方面的东西。。

把文件读取到内存中，修改，然后重新写到文件


Question: char[] + int  什么意思？？？求解！！！

后面两个参数，第一个是接收缓存的地址，第二个是接收缓存还剩余的空间。 当第一次接收时，len = 0;那么接收缓存就是地址就是buffer+0,剩余空间sizeof(buffer)就是1024；若第一次接收了8个字节,即len = 8，那么下表从0~7的缓存已经占用了数据，下次接收到数据不能再放下表为0~7缓存里了，因此需要从buffer+8的位置接收。此时缓存的剩余的空间也需要sizeof(buffer)-len（此时len = 8);  代码没有贴全，后面的代码肯定有对len修改的。比如ret是此次接收到的数据长度（单位字节），因此后面应该有len += ret;类似的操作；

buffer+len = (char*)buffer + sizeof(T) * len //T为buffer的类型 即从buffer的首地址起，向前偏移len个sizeof(T)的距离，此时得到的依旧是一个指针地址 int *p = "abcde"; p + 3; *p; //p是字符串的首地址，*p即a，a所在的位置（地址）是 p+0，p+3即字符d所在的地址, *(p+3) == d

buffer表示数组buffer的起始地址，buffer+len表示数组起始地址的偏移，len的值随着read()会发生变化。

A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

int ret = read(fd,buffer+len,sizeof(buffer)-len);  buffer+len 表示从数组的第buffer+len个位置继续写入 sizeof(buffer) -len 表示数组还可以写的数据长度 ret 返回写的长度

这里的int起到偏移的作用，buffer+len表示从buffer起始位置加上len的长度位置开始存储数据， sizeof(buffer)-len表示接受1024 -len个字符的数据


Question: C

scanf("%d",p);

引用 5 楼 Camel_J 的回复:#include<stdio.h> int main() { 	int a[10],*p,n=0; 	 	printf("请输入10个整数:\n"); 	for( p = a ; p < a + 10 ; p++) 		scanf("%d",p); 	printf("*********\n"); 	for(p = p - 1; p > a; p--) 		if(*p % 2 == 0) 			n++; 	printf("偶数的个数%d\n",n); 	 	return 0; } 这个也是一样的，应该是p >= a; 因为数组名本身就是第一个元素的地址。

引用 4 楼 Camel_J 的回复:指针的知识先弄明白吧。 改为以下：  #include<stdio.h> int main() { 	int a[10],*p,n=0; 	 	printf("请输入10个整数:\n"); 	for( p = a ; p < a + 10 ; p++) 		scanf("%d",p); 	for(p = a + 9 ; p > a; p--) 		if(*p % 2 == 0) 			n++; 	printf("偶数的个数%d\n",n); 	 	return 0; } 有问题哦，for(p = a + 9 ; p >= a; p--) 这儿应该是p >= a;否则数组中的第一个元素不会进入*p % 2 == 0的判断。

引用 2 楼 cfjtaishan 的回复:#include<stdio.h> int main() {     int a[10],*p,n=0;     printf("请输入10个整数:\n");     for(p=a;p<a+10;p++)         scanf("%d", p);     for(p--;p>=a;p--)         if(*p % 2 == 0)             n++;     printf("偶数的个数%d\n",n);     return 0; } 参考一下吧； 问题主要有3个： 第一个： scanf("%d", p);，应该用地址，即p而不是用*p,如果用*p，那么前面需要加&就是 scanf("%d", &(*p)); 第二个： if(*p % 2 == 0) 这个地方应该用*p，即应用指向的内存单元里的值；  第三个： for(p--;p>=a;p--) 通过上面输入的循环，p已经指向了数组后面的内存单元，可以理解位&a[10]，数组最后一个元素的地址是&a[9];所以先将p从&a[10]指向&a[9];就要先执行p-- 否则p指向的是越界的回答的非常详细，作参考吧


Question: 数组给指向数组的指针赋值和给指向数组的指针赋值问题

指针变量p指向一个二维数组，b也是一个二维数组

引用 4 楼 weixin_40519528 的回复:题目：将一个3×3的矩阵转置，用一函数实现之。在主函数中用scanf函数输入一下矩阵元素：在执行函数的过程中实现矩阵转置，函数调用结束后在主函数中枢出已转置的矩阵（用指针实现）。 一下是自己的代码 #include<stdio.h> int main() { 	void T(int *p); 	int a[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			scanf("%d",*(a+i)+j); 	T(*a); 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			printf("%d", *(*(a+i)+j) ); }  void T(int *p) { 	int b[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(b+j)+i)=*(*(p+i)+j);  	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(p+i)+j)=b[i][j]; } 出现一下问题 *(*(b+j)+i)=*(*(p+i)+j); error C2100: illegal indirection *(*(p+i)+j)=b[i][j]; error C2100: illegal indirection和error C2106: '=' : left operand must be l-value 这是为什么呢，要怎么改正？ p不是指向一个二维数组哦，而是一个一维数组。 可以改一下形参，如下：  #include<stdio.h>  void T(int (*p)[3]); int main() { 	int a[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			scanf("%d",*(a+i)+j); 	T(a); 	for(i=0;i<3;i++) { 		for(j=0;j<3;j++) 			printf("%d ", *(*(a+i)+j) ); 		putchar(10); 	} }  void T(int (*p)[3]) { 	int b[3][3],i,j; 	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(b+j)+i)=*(*(p+i)+j);  	for(i=0;i<3;i++) 		for(j=0;j<3;j++) 			*(*(p+i)+j)=b[i][j]; } 参考一下吧

p是int*，不是二维数组。

信息提供的不足，p指向的是一个什么样的数组，二维数组，还是什么？ 建议提供更多的信息；

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


Question: 新人求助 死磕一道题两个小时了还是无果

#include <stdio.h> int main() {     int i,c[100],n;     while(scanf("%d",&c[0])!=EOF)     {         char ch='0';         for(i=1;ch!='\n'&&ch != EOF;i++)         {             scanf("%d",&c[i]);             ch=getchar();         }         n=i;           int Max=c[0],cMax=c[1],temp;         if(cMax>Max)         {             temp=cMax;             cMax=Max;             Max=temp;         }         for(i=0;i<n;i++)         {             if(c[i]>Max)             {                 cMax=Max;                 Max=c[i];             }             if(c[i]>cMax&&c[i]<Max)             {                 cMax=c[i];             }         }         printf("%d %d\n",Max,cMax);         if(ch == EOF)             break;     }     return 0; }

应该是题目问题，老师告诉判断结束的条件了

头文件algorithm.h里的sort直接两三行就搞定了。

你的问题和这个帖子是类似的，建议参考一下； http://bbs.csdn.net/topics/392300411

int first_idx, second_idx; void get_max12(int*a, int n) {     int first_max, second_max;     int i, j;     first_max = a[0];     first_idx = 0;       for (i = 1; i < n; i++) {         if (first_max < a[i]) {             second_max = first_max;             second_idx = first_idx;             first_max = a[i];             first_idx = i;             break;         } else if (first_max > a[i]){             second_max = a[i];             second_idx = i;             break;         }     }       //printf("%d %d", first_idx, second_idx);       for (j = i + 1; j < n; j++) {         if (first_max < a[j]) {             second_max = first_max;             second_idx = first_idx;             first_max = a[j];             first_idx = j;             //printf("+++%d %d", first_idx, second_idx);         } else if (first_max != a[j] && second_max < a[j])         {             //printf("---%d %d", first_idx, second_idx);             second_max = a[j];             second_idx = j;         }     } 参考一下吧，first_idx和second_idx分别是最大值和次最大值的下表；并且定义了全局变量。

同意1楼， 因为题目没有要求所有输入数据按一定顺序输出，所以遍历就可以。 如果要排序，推荐快速排序或者堆排序。

不用排序，你直接定义一个Smax和Rmax 然后遍历一遍数组，每次大于Smax的就覆盖Smax， 小于Smax但大于Rmax的，就覆盖Rmax


Question: 新人  求解

第一个题我会  想发第二个题的  不小心把第一个题也发出来了        我不太明白怎么在指定条件下输出‘？’               这是我写的第一个题    #include<stdio.h> main() { 	int i,j,q,b,c,n; 	int a[6][6]; 	printf("输入限定条件 n(1<n<=6)\n"); 	scanf("%d",&n); 	printf("请给数组赋值：\n"); 	for(i=0;i<n;i++) 		for(j=0;j<n;j++) scanf("%d",&a[i][j]); 	printf("原样输出数组：\n"); 	for(i=0;i<n;i++) 	{ 		for(j=0;j<n;j++) printf("%d ",a[i][j]); 		printf("\n"); 	} 	for(i=0;i<n;i++) 	{ 		b=a[i][0]; 		for(j=0;j<n;j++) 		{ 			if(b<a[i][j]) 			{ 				b=a[i][j]; 				c=j; 			} 		} 		for(q=0;q<n;q++) 		{ 			if(a[q][c]<b) break; 			if(q==n-1) printf("鞍点为：%d    a[%d][%d]\n",b,i,c);break; 		} 	} 	if(q!=n-1) printf("none\n"); }

第一题   #include<iostream> using namespace std;  int main() { 	int flag = 0; 	int min = 9999999; 	int x = 0; 	int y = 0; 	int max = 0; 	int mat[6][6]; 	int num; 	cin >> num; 	for (int i = 0; i < num; i++) 	{ 		for (int j = 0; j < num; j++) 		{ 			cin >> mat[i][j]; 		} 	} 	for (int i = 0; i < num; i++) 	{ 		x = 0;  		y = 0; 		min = 9999999; 		max = 0; 		for (int j = 0; j < num; j++) 		{ 			if (mat[i][j]>max) 			{ 				max = mat[i][j]; 				y = j; 			} 		} 		for (int k = 0; k < num; k++) 		{ 			if (mat[k][y] < min) 			{ 				min = mat[k][y]; 				x = k; 			} 		} 		if (x == i) 		{ 			printf("%d %d", x, y); 			flag = 1; 			break; 		} 	} 	if (!flag) printf("NONE"); 	return 0; }   如果是想学习的话，最好是自己先尝试，不懂再问，这样进步才会快

建议自己先写写，调试一下；若遇到问题，可以提出来。写程序需要沉下心来，通过自己学到的知识点来解决这些问题。平时也应该多看课本和别人的成熟程序，自己也应该多练习。不要遇到问题了，再临时抱佛脚。


Question: 关注return 返回值的问题！！求教。跪求，感谢！

%s 就是表示输出指向的字符串，如果你要输出p的地址，用%p

引用 16 楼 cfjtaishan 的回复:[quote=引用 15 楼 hu1991514 的回复:] [quote=引用 12 楼 cfjtaishan 的回复:] 这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。  内存空间被释放里面存放的二进制数不会被清空么？？？ 难道里面的数据还在只是将内存空间设置成未使用？？？再次感谢你的解答！[/quote] 恩，对。不会清空，不然你平时定义一个变量，若不初始化为什么会是随机值呢。[/quote]  引用 16 楼 cfjtaishan 的回复:[quote=引用 15 楼 hu1991514 的回复:] [quote=引用 12 楼 cfjtaishan 的回复:] 这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。  内存空间被释放里面存放的二进制数不会被清空么？？？ 难道里面的数据还在只是将内存空间设置成未使用？？？再次感谢你的解答！[/quote] 恩，对。不会清空，不然你平时定义一个变量，若不初始化为什么会是随机值呢。[/quote]   感谢！！你帮我解答了！很多！！

引用 15 楼 hu1991514 的回复:[quote=引用 12 楼 cfjtaishan 的回复:] 这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。  内存空间被释放里面存放的二进制数不会被清空么？？？ 难道里面的数据还在只是将内存空间设置成未使用？？？再次感谢你的解答！[/quote] 恩，对。不会清空，不然你平时定义一个变量，若不初始化为什么会是随机值呢。

引用 12 楼 cfjtaishan 的回复:这个问题就是返回局部变量的地址了，这个是未定义行为。什么是未定义行为呢，就是可能正常输出也可能不正常输出。 正常输出是因为可能是fun函数释放之后，释放的空间没有被再次使用（申请），那么之前的空间里的数据没有被覆盖，那么就有可能正常输出。但是这个不能保证不被重新申请，因为释放之后这部分空间就会被设置位未使用，那么只要有函数调用，就有可能把刚释放的内存重新用起来。  内存空间被释放里面存放的二进制数不会被清空么？？？ 难道里面的数据还在只是将内存空间设置成未使用？？？再次感谢你的解答！

引用 4 楼 hu1991514的回复:引用 2楼paschen 的回复:%s 就是表示输出指向的字符串，如果你要输出p的地址，用%p我这里不只要输出地址！第一次字符串被输出时，用的是指针p作为printf函数参数！而打印3，用的是变量a作为printf函数参数！a跟p是两个不同的概念，一个是指针一个是变量名，为什么最后打印出来的都是里面的值 p和a都是变量名，输出的内容取决于你前面的格式，http://en.cppreference.com/w/c/io/fprintf

引用 3 楼 hu1991514的回复:引用 1楼paschen 的回复:你这里返回是按值返回的，也就是说，在局部变量a析构前，会对a进行复制，函数外接收的实际是一个复制后的值，如果你返回&a，函数外用*a则可能导致出错请问下，这里返回值复制到什么地方，因为fun函数栈是先被释放掉的，才在main函数中被变量接受，那被接受之前是在哪里！ 返回值通常是在EAX寄存器

引用 10 楼 cfjtaishan 的回复:[quote=引用 9 楼 hu1991514 的回复:] [quote=引用 8楼自信男孩 的回复:][quote=引用 7 楼 hu1991514 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。   帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！[/quote] 难道没安装g++?[/quote]bin文件夹里有g++.exe！你值得是这么[/quote] 应该是没有配置环境变量；  http://ask.csdn.net/questions/156861 看一下别人怎么解决的[/quote]   最后一个问题哈！！结帖就给分了! 这里main函数中的指针b接受了fun函数返回的地址pa，这里的pa应该只是a[10]数组的首地址把，只是一个确切的地址的值（假如是00fff06a）。那么b接受到的也是这个地址00fff06a。那么析构掉fun，回到main函数。那么fun中的数组被析构掉了。。那么此时main中的printf到底能不能打印出来字符串呢？我觉得是不行的，因为内存被清空了，b只是一个地址，没有什么东西可以打印。。但是我之前好像遇到过打印出来的问题！！我这边gcc出问题了，你先帮我解答下！

引用 9 楼 hu1991514 的回复:[quote=引用 8楼自信男孩 的回复:][quote=引用 7 楼 hu1991514 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。  帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！[/quote] 难道没安装g++?[/quote]bin文件夹里有g++.exe！你值得是这么[/quote] 应该是没有配置环境变量；  http://ask.csdn.net/questions/156861 看一下别人怎么解决的

引用 8楼自信男孩 的回复:[quote=引用 7 楼 hu1991514 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。  帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！[/quote] 难道没安装g++?[/quote]bin文件夹里有g++.exe！你值得是这么

引用 7 楼 hu1991514 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。  帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！[/quote] 难道没安装g++?

引用 5 楼 cfjtaishan 的回复:return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。   帮我看看我这个额GCC编译器吃什么问题了？代码没问题的！

引用 5楼自信男孩 的回复:return返回的是值，不是栈上的地址。因此，返回的值，若在main函数里有一个int变量来接收fun()的返回值，那么fun()的返回值会放在这个变量里。如果没有变量接收fun()的返回值，那么它的返回值会丢掉；  %s输出的是字符串，p是指针，指向的字符串的首地址，%s输出就是从字符串的首地址开始输出，直到遇到字符串的结束标志'\0'停止输出； %d是输出一个int类型的数据就会从a变量所在的4个字节内存里拿到值，并输出到标准输出终端。哥们优秀，每次回答的都是我想要的！


Question: 动态内存分配？

引用 4 楼 paschen 的回复:pa = &a; 已经改变了pa的值了，pa已经指向了另一块内存，而不是你申请的，释放这块不是动态申请的内存将导致出错。如果你是要拷贝字符串，应该用strcpy，直接赋值只是改变指针的指向 明白了，非常感谢！

引用 2 楼 hdt 的回复:用strcpy，代替 p=&a; p=a 改变了p的指向。再free p 其实free的a  非常感谢！我按你意思改了一下！可以正常运行！ #include <stdio.h> #include <stdlib.h> #include <string.h>  int main(void) {	 	char *pa = (char*)malloc(100); 	char a[] = {"hello world!"}; 	char b[] = {"hello computer!"}; 	if(!pa) 	{ 		printf("error!"); 		return; 	} 	strcpy(pa,a); 	printf("%s\n",pa); 	free(pa); 	pa = NULL; 	printf("%s\n",pa); 	return 0; }

找到了一些细节 我将free(pa);写到pa = NULL;的上后面，也就是将pa先指向空，再将pa释放。这样的话运行后就正常了。得到结果 holle world! <NULL>  那么我应该是错在，释放正在使用的内存。是不是这样？ 也就是当pa指向a的地址还在使用时，是free不掉的。只有将pa指向空地址后，才可以free释放内存。  这是我的理解，是不是这样？请大神指教！谢谢！

当我将free(pa);这句删掉后，运行结果为：   为什么free(pa);释放语句不能加？

楼上的人都说出答案了！！就是pa指向被改变了！我就来混点分！


Question: C程序运行偶尔有异常

引用 1 楼 jianwen0529 的回复:unsigned char *outData=new unsigned char[strLen + 1];//多分配一个字节，用于存储字符串结束符 '\0' //... outData[strLen] = '\0'; int TwoLen=strlen((char *)outData)-1; //strlen长度是依靠字符串结束符 '0'判断的   谢谢兄弟，我是用指针最后放的 '\0'，问题确实是在数组的长度上，outData是存放二进制数据的，数字的长度要在原始数据的长度上*8， 忘了*8了。不过还是谢谢大兄弟~！


Question: 哈夫曼树凹入法输出，嵌套循环时出现空指针

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

//************************编码与译码操作**********************************    void Decoding(HuffmanTree HT,hfmlist HL,char*size,int n)//这个函数是用来译码的         {int i,j,k;         char p[30];         printf("请输入需要译码的代码:");gets(p);//接受需要译码的字符串         i=2*n-1;         k=0;         for(j=0;p[j]!='\0';j++){             if(p[j]=='0'){ if(HT[i].lchild!=0)i=HT[i].lchild;                            else{   size[k++]=HL[i].letter;                                    i=2*n-1;                                    j--;}                 }             else{  if(HT[i].rchild!=0)i=HT[i].rchild;                    else{   size[k++]=HL[i].letter;                            i=2*n-1;                            j--;}                 }         }//for         if( p[j-1]=='0')size[k++]=HL[i].letter;         else size[k++]=HL[i].letter;         size[k]='\0';      }//decoding    void Encoding(HuffmanCode HC,hfmlist HL,char *coding,int n){        int i,j,t,k=0;        char p[100];        printf("请再次输入需要编码的文本:");        gets(p);        for(i=0;p[i]!='\0';i++){            if((p[i]>='a'&&p[i]<='z')||p[i]==' ')              for(j=1;j<=n;j++)                if(p[i]==HL[j].letter)                  for(t=0;HC[j][t]!='\0';t++)                    coding[k++]=HC[j][t];             }//for        coding[k]='\0';    }//encoding        //************************打印操作****************************    void Print(FILE *fp1,FILE *fp2){        //将文件fp1中的代码以紧凑格式显示在终端上，每行50个代码        //同时将此字符形式的编码文件写入文件fp2中        char c[200];        int i;        fgets(c,200,fp1);        for(i=0;c[i]=='0'||c[i]=='1';i++){            printf("%c",c[i]);            fprintf(fp2,"%c",c[i]);            if((i+1)/50*50==(i+1)){                printf("\n");                fprintf(fp2,"\n");            }        }//for        printf("\n");    }//Print    //********************************************************************!!!!!!!!!!!!!    void PreOrderTraverse(HuffmanTree HT,int k,FILE *fp){        //中序遍历并打印树，结果存放于fp中,k为根结点的下标        int i;                                                          //这个函数跟我自己写的函数看上去没什么差异，但是却可以正常运行      if(HT[k].rchild!=0){                              //百思不得其解            DEPTH++;            PreOrderTraverse(HT,HT[k].rchild,fp);            DEPTH--;        }      	for(i=1;i<=DEPTH;i++)fprintf(fp,"   ");  	fprintf(fp,"%d\n",HT[k].weight);  	     if(HT[k].lchild!=0){            DEPTH++;            PreOrderTraverse(HT,HT[k].lchild,fp);            DEPTH--;        }        if(HT[k].lchild==0&&HT[k].rchild==0)return;        return;    } //PreOrderTraverse     //********************************************************************!!!!!!!!!!!!!!!!   void TreePrinting(HuffmanTree HT,int n,FILE *fp){        //打印树HT，结果存于文件fp中，n为树的叶子结点数        int i,k;        for(i=1;i<=2*n;i++)if(HT[i].parent==0){k=i;break;}//寻找根结点        PreOrderTraverse(HT,k,fp);        return;    }//TreePrinting         //**************************主函数*********************************    int main()    {        FILE *fp1,*fp2,*fp3,*fp4,*fp5;        HuffmanTree HT;        HuffmanCode HC;        hfmlist HL;             unsigned int i,n;        char  *b,c[100],cha,ch;            b=(char *)malloc(100*sizeof(char));        printf("请选择操作：\n");        printf("i:初始化(Initialization)\ne:编码(Encoding)\nd:译码(Decoding)\n");        printf("p:印代码文件(Print)\nt:印哈夫曼树(Tree printing)\nq:退出(Quit)\n");b=(char *)malloc(100*sizeof(char));        HL=(hfmlist)malloc(30*sizeof(hfm));//存储字符与权值，线性表长30        printf("\n");        printf("选择操作(i,e,d,p,t,q):");        ch=getchar();        getchar();        printf("\n");        do{          switch(ch){            case 'i':printf("正在进行初始化……\n");                     printf("输入字符长度：");                     scanf("%d",&n);                     getchar();                     printf("\n");                     HC=(HuffmanCode)malloc((n+1)*sizeof(char));                     HT=(HuffmanTree)malloc((2*n)*sizeof(HTNode));                     for(i=1;i<=n;i++){                         printf("请输入第%d个字符及权值(格式:字符 权值):",i);                         scanf("%c %d",&(HL+i)->letter,&(HL+i)->wt);                         getchar();                                      }//for                     if((fp5=fopen("G:\\code\\hufmtree.txt","w+"))==NULL){                         printf("cannot open file!\n");                         exit(0);                     }//if                     for(i=1;i<=n;i++){                         fprintf(fp5,"第%d个字符及权值:\t\t\t",i);                         fprintf(fp5,"%c %d\n",(HL+i)->letter,(HL+i)->wt);                     }//for                     fclose(fp5);                     HuffmanCoding(HT,HC,HL,n);                     printf("\n已经将Huffman树存入文件hfmTree.txt中\n\n");                     printf("初始化完毕，请选择操作：\n");                     printf("i:重新初始化(Initialization)\ne:编码(Encoding)\nd:译码(Decoding)\n");                     printf("p:印代码文件(Print)\nt:印哈夫曼树(Tree printing)\nq:退出(Quit)\n\n");                     break;            case 'e':                     printf("请输入编码,以#结尾：");                     if((fp2=fopen("ToBeTran.txt","w"))==NULL){                             printf("cannot open file\n");exit(0);                     }//if                         cha=getchar();                     while(cha!='#')                     {                          fputc(cha,fp2);                          cha=getchar();                     }//while                     getchar();                     fclose(fp2);                                          printf("已经把编码存入文件ToBeTran.txt中\n\n");                     Encoding(HC,HL,b,n);                     printf("文本的哈夫曼编码是:");                      printf("%s\n",b);                     printf("下面进行保存:");                     save(b);                     printf("编码完毕，请选择操作：\n");                     printf("i:重新初始化(Initialization)\ne:编码(Encoding)\nd:译码(Decoding)\n");                     printf("p:印代码文件(Print)\nt:印哈夫曼树(Tree printing)\nq:退出(Quit)\n");                     break;            case 'd':                     Decoding(HT,HL,c,n);                     printf("输入要译码的编码：");                     printf("正在进行译码……\n");                     printf("%s\n",c);                     save(c);                     printf("已经将结果存入文件%s中\n",a);                     printf("译码完毕，请选择操作：\n");                     printf("i:重新初始化(Initialization)\ne:编码(Encoding)\nd:译码(Decoding)\n");                     printf("p:印代码文件(Print)\nt:印哈夫曼树(Tree printing)\nq:退出(Quit)\n");                                  break;            case 'p':                     for(i=1;i<=n;i++)                        printf("字符:%c\t\t\t译码:%s\n",HL[i].letter,HC[i]);                     if((fp1=fopen("CodePrin.txt","w"))==NULL){                          printf("cannot open the file!\n");                          exit(0);                     }//if                                          if((fp4=fopen("CodeFile.txt","r"))==NULL){                         printf("cannot open the file!\n");                         exit(0);                     }//if                     Print(fp4,fp1);                     printf("该代码文件已经存在并命名为CodePrin.txt\n");                     fclose(fp4);                     fclose(fp1);                     break;            case 't':printf("打印树存在于文件TreePrin中\n");                     if((fp3=fopen("G:\\code\\hufmtree.txt","w+"))==NULL)                     {printf("cannot open file\n");exit(0);}                     TreePrinting(HT,n,fp3);                     fclose(fp3);                     break;            case 'q':exit(0);break;            default :exit(0);break;          }//switch          printf("\n请选择操作(i,e,d,p,t,q):");          ch=getchar();          getchar();        }while(ch!='q');//do    } 接上面的

#include <string.h>    #include <stdio.h>    #include <stdlib.h>    #include <malloc.h>        typedef struct {        char letter;        int  wt;    }hfm,*hfmlist;        //*************************全局变量************************************    unsigned int s1,s2,n;    char choose;    int DEPTH=0;    char a[20];        //***************Huffman树和Huffman编码的存储表示**********************    typedef struct{        unsigned int weight;        unsigned int code;        unsigned int parent,lchild,rchild;    }HTNode, *HuffmanTree;           //动态分配数组存储Huffman树    typedef char * *HuffmanCode;     //动态分配数组存储Huffman编码表        //***************************初始化Huffman树***************************    void select(HuffmanTree HT,int l){        int a,b,c,j;        s1=s2=1;        a=b=1000;        for(j=1;j<=l;j++){            if(HT[j].code==0){              c=HT[j].weight;              if(c<a){b=a;a=c;s2=s1;s1=j;}              else if(c<b){b=c;s2=j;}                 }//if            }//for        HT[s1].code=HT[s2].code=1;        }//select        void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC, hfmlist HL,unsigned int n){        //w存放n个权值（均>0），构造Huffman树HT,并求出n个字符的Huffman编码HC.        unsigned int i,f,start,c,m;        char*cd;                    if (n<=1) return;        m =2*n-1;        HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));         for(i=1;i<=m;++i){HT[i].weight=HT[i].parent=HT[i].lchild=HT[i].rchild=HT[i].code=0;}        for(i=1;i<=n;++i)HT[i].weight=HL[i].wt;        for (i=n+1;i<=m;++i){            select(HT,i-1);            HT[s1].parent=i;HT[s2].parent=i;            HT[i].lchild=s1;HT[i].rchild=s2;            HT[i].weight=HT[s1].weight+HT[s2].weight;        }            HC=(HuffmanCode)malloc((n+1)*sizeof(char*));        cd=(char*)malloc(n*sizeof(char));        cd[n-1]='\0';        for(i=1;i<=n;++i){            start=n-1;          for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)                if (HT[f].lchild==c) cd[--start]='0';                else cd[--start]='1';            HC[i]=(char*)malloc((n-start)*sizeof(char));            strcpy(HC[i],cd+start);        }        free(cd);    }        //*************************文件操作*****************************    void save (char *p){          FILE *fp;          int i;                    printf("input the name:");          if((fp=fopen(gets(a),"w+"))==NULL){              printf("cannot open the file!\n");              exit(0);}//if          for(i=0;p[i]!='\0';i++){              if(fwrite(p+i,sizeof(char),1,fp)!=1){//fwrite函数写数据块                  printf("File write error!\n");exit(0);}//if          }//for          fclose(fp);    }//save    这个是我在网上找到的类似的代码，但是这个代码可以正常运行，不知道我跟这个的区别在哪里


Question: 求教关于rand（）生成均匀分布随机数的一些问题

仅供参考：#include <stdio.h> #include <stdlib.h> #include <time.h> unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } unsigned __int64 ullrand(void) {     return (      (((unsigned __int64)ulrand())<<32)     | ((unsigned __int64)ulrand())); } int i; unsigned long ul; unsigned __int64 ull; void main() {     srand(time(NULL));     for (i=0;i<10;i++) {         ul=ulrand();         printf("%010lu 0x%08x\n",ul,ul);     }     for (i=0;i<10;i++) {         ull=ullrand();         printf("%020I64u 0x%016I64x\n",ull,ull);     } } //3971076432 0xecb1d150 //2433428051 0x910b2a53 //1415415336 0x545d8628 //1312330759 0x4e389407 //1845758378 0x6e0409aa //0008069933 0x007b232d //4202720757 0xfa806df5 //2669855255 0x9f22c217 //0312068736 0x1299ca80 //2084555989 0x7c3fccd5 //03502077880857307931 0x3099e1472040ab1b //16884702393146816355 0xea52835e19b43763 //01877364819396611730 0x1a0dbd5b45f34e92 //07839440151924835771 0x6ccb4948756a05bb //09471412086917299176 0x8371371c820bfbe8 //04411255971577469925 0x3d37edef2f321be5 //13735846279546091130 0xbe9f876a65b7367a //04512980766520059820 0x3ea15418aa9927ac //15821377118299441610 0xdb90d2a9f1bb49ca //15512417228822200185 0xd7472d480398bf79

windows下用rand生成的随机数最大值只有RAND_MAX（通常被定义为32767）

windows下的rand()的最大值是32767，用来生成0 - 4294967295 是比较坑的。

可以试试c++11的随机数生成器，可以生成各种分布的伪随机数 http://zh.cppreference.com/w/cpp/numeric/random

随机函数产生的数本身就是随机的，若要均匀分布，可以先随机产生50以内的随机值，然后加上一个起始位置，比如要实现1000~50000之间的随机值，那么产生50以内的随机值，然后加上1000， 2000， 3000...59000


Question: 求大佬解释翻译一下

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。