Question: 在编译函数的时候会有"声明类型太多"的错误报告是什么意思？？？求解答啊啊啊啊

引用 8 楼 u013326388 的回复:文件这样做，对吗？？想问 ？？？

文件这样做，对吗？？想问

struct stu                                                                   /*struct*/ {  char *name;  int sex;  char *class;  char number[10];  int math_score;  int English_score;  int c_score;  char *native;  char *math_teacher;  char *English_teacher;  char *c_teacher;  char *classroom;  char *time; }  楼主，分号呢？ struct stu { ... };

case 8:                   do                   {                    printf("please input the native:"); 	           gets(p);                    q=student[0].native; 	           search_s(q,fp,p,student[num]);                                                  /*search*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 9:                   do                   {                    printf("please input the math_teacher:"); 	           gets(p);                    q=student[0].math_teacher; 	           search_s(q,fp,p,student[num]);                                                  /*search*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 10:                   do                   {                    printf("please input the English_teacher:"); 	           gets(p);                    q=student[0].English_teacher; 	           search_s(q,fp,p,student[num]);                                                  /*search*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 11:                   do                   {                    printf("please input the c_teacher:"); 	           gets(p);                    q=student[0].c_teacher; 	           search_s(q,fp,p,student[num]);                                                  /*search*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 12:                   do                   {                    printf("please input the classroom:"); 	           gets(p);                    q=student[0].classroom; 	           search_s(q,fp,p,student[num]);                                                  /*search*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 13:                   do                   {                    printf("please input the time:"); 	           gets(p);                    q=student[0].time; 	           search_s(q,fp,p,student[num]);                                                  /*search*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;           default:          }          if(m==10)break;          printf("Do you want to search once?");          printf("1.Yes\n2.no\n");          scanf("%d",&j);          while(j!=1&&j!=2)          {           printf("Error;please input again:");           scanf("%d",&j);          }         }while(j==1);         break;    case 3:       do       {        clrscr();        printf("Which score's reorder do you want to know ?");        printf("1.math_score");        printf("2.English_score");        printf("3.c_score");        scanf("%d",&m);        while(m!=1&&m!=2&&m!=3)        {         printf("Error;please input again:");         scanf("%d",&m);        }        switch(m)        {         case 1:p=&student[0].math_score;break;         case 2:p=&student[0].English_score;break;         case 3:p=&student[0].c_score;break;         default:printf("No this kind of message!");break;        }        if((fp=fopen("F:\\stud.data","r"))==NULL)        {         printf("\nerror on open F:\\stud.data!");         getchar();         exit(1);        }        n=ftell(f)/sizeof(struct stu);        for(i=0,b=0;i<n-1;i++)        {         for(j=1;j<n;j++)          if(*(p+b)<*(p+j))b=j;         fscanf(f,"%s%d%s%s",student[i].name,&student[i].sex,student[i].class,student[i].number);         fscanf(f,"%d%d%d",&student[i].math_score,&student[i].English_score,&student[i].c_score);         fscanf(f,"%s%s%s",student[i].native,student[i].math_teacher,student[i].English_teacher);         fscanf(f,"%s%s%s",student[i].c_teacher,student[i].classroom,student[i].time);         fscanf(f,"%s%d%s%s",student[b].name,&student[b].sex,student[b].class,student[b].number);         fscanf(f,"%d%d%d",&student[b].math_score,&student[b].English_score,&student[b].c_score);         fscanf(f,"%s%s%s",student[b].native,student[b].math_teacher,student[b].English_teacher);         fscanf(f,"%s%s%s",student[b].c_teacher,student[b].classroom,student[b].time);          strcpy(student1.name,student[b].name);strcpy(student[b].name,student[i].name);strcpy(student[i].name,student1.name);         student1.sex=student[b].sex;student[b].sex=student[i].sex;student[i].sex=student1.sex;         strcpy(student1.class,student[b].class);strcpy(student[b].class,student[i].class);strcpy(student[i].class,student1.class);         strcpy(student1.number,student[b].number);strcpy(student[b].number,student[i].number);strcpy(student[i].number,student1.number);         student1.math_score=student[b].math_score;student[b].math_score=student[i].math_score;student[i].math_score=student1.math_score;         student1.English_score=student[b].English_score;student[b].English_score=student[i].English_score;student[i].English_score=student1.English_score;         student1.c_score=student[b].c_score;student[b].c_score=student[i].c_score;student[i].c_score=student1.c_score;         strcpy(student1.native,student[b].native);strcpy(student[b].native,student[i].native);strcpy(student[i].native,student1.native);         strcpy(student1.math_teacher,student[b].math_teacher);strcpy(student[b].math_teacher,student[i].math_teacher);strcpy(student[i].math_teacher,student1.math_teacher);         strcpy(student1.English_teacher,student[b].English_teacher);strcpy(student[b].English_teacher,student[i].English_teacher);strcpy(student[i].English_teacher,student1.English_teacher);         strcpy(student1.c_teacher,student[b].c_teacher);strcpy(student[b].c_teacher,student[i].c_teacher);strcpy(student[i].c_teacher,student1.c_teacher);         strcpy(student1.classroom,student[b].classroom);strcpy(student[b].classroom,student[i].classroom);strcpy(student[i].classroom,student1.classroom);         strcpy(student1.time,student[b].time);strcpy(student[b].time,student[i].time);strcpy(student[i].time,student1.time);        }         printf("Which ranking do you want to know ?\n");        printf("please input the ranking:");        scanf("%d\n",&v);        while(v>n)        {         printf("Error;please input again:");         scanf("%d",&v);        }        printf("%s\n",student[v-1].name);        switch(student[v-1].sex)        {         case 1:printf("man\n");break;         case 2:printf("woman\n");break;         default:break;        }        printf("%s\n",student[v-1].class);        printf("%s\n",student[v-1].number);        printf("%d\n",student[v-1].math_score);        printf("%d\n",student[v-1].English_score);        printf("%d\n",student[v-1].c_score);        printf("%s\n",student[v-1].native);        printf("%s\n",student[v-1].math_teacher);        printf("%s\n",student[v-1].English_teacher);        printf("%s\n",student[v-1].c_teacher);        printf("%s\n",student[v-1].classroom);        printf("%s\n",student[v-1].time);         fprintf(f,"%s%d%s%s",student[i].name,student[i].sex,student[i].class,student[i].number);        fprintf(f,"%d%d%d",student[i].math_score,student[i].English_score,student[i].c_score);        fprintf(f,"%s%s%s",student[i].native,student[i].math_teacher,student[i].English_teacher);        fprintf(f,"%s%s%s",student[i].c_teacher,student[i].classroom,student[i].time);        fprintf(f,"%s%d%s%s",student[b].name,student[b].sex,student[b].class,student[b].number);        fprintf(f,"%d%d%d",student[b].math_score,student[b].English_score,student[b].c_score);        fprintf(f,"%s%s%s",student[b].native,student[b].math_teacher,student[b].English_teacher);        fprintf(f,"%s%s%s",student[b].c_teacher,student[b].classroom,student[b].time);         fclose(fp);        printf("Do you want to do it once?");        printf("1.Yes\n2.no\n");        scanf("%d",&j);        while(j!=1&&j!=2)        {         printf("Error;please input again:");         scanf("%d",&j);        }       }while(j==1);       break;

do           {            printf("What do you search for?");            printf("*******************STUDENT'S STUDY SYSTEM************\n\n");            printf("                        1.name\n");            printf("                        2.sex\n");            printf("                        3.class\n");            printf("                        4.number\n");            printf("                        5.math_score\n");            printf("                        6.English_score\n");            printf("                        7.c_score\n");            printf("                        8.native\n");            printf("                        9.math_teacher\n");            printf("                        10.English_teacher\n");            printf("                        11.c_teacher\n");            printf("                        12.classroom\n");            printf("                        13.time\n");            printf("                        14.back\n");            printf("please input the key's number:");            scanf("%d",&m);            while(m<1||m>14)            {             printf("Error;please input again:");             scanf("%d",&m);            }            switch(m)            {             case 1:                    do                    {                     printf("please input the name:"); 	            gets(p);                     q=student[0].name; 	            search_s(q,fp,p,student[num]);                                                  /*search*/                     printf("Do you want to do it once?");                     printf("1.Yes\n2.no\n");                     scanf("%d",&j);                     while(j!=1&&j!=2)                     {                      printf("Error;please input again:");                      scanf("%d",&j);                     }                    }while(j==1);                    break;            case 2:                   do                   {                    printf("please input the sex:");                    scanf("%d",&v);                    if(v!=1&&v!=2)                    {                     printf("error,1.man\t2.woman");                     printf("please input again:");                     scanf("%d",&v);                    }                    seacher_i(&student[0].sex,fp,v,student[num]);                                                 /*search_i*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 3:                   do                   {                    printf("please input the class:"); 	           gets(p);                    q=student[0].class; 	           search_s(q,fp,p,student[num]);                                                  /*search*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 4:                   do                   {                    printf("please input the number:"); 	           gets(p);                    q=student[0].number; 	           search_s(q,fp,p,student[num]);                                                  /*search*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 5:                   do                   {                    printf("please input the math_score:");                    scanf("%d",&v);                    while(v<0||v>100)                    {                     printf("error:0=<v=<100");                     printf("please input again:");                     scanf("%d",&v);                    }                    seacher_i(&student[0].math_score,fp,v,student[num]);                                          /*seach_i*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 6:                   do                   {                    printf("please input the English_score:");                    scanf("%d",&v);                    while(v<0||v>100)                    {                     printf("error:0=<v=<100");                     printf("please input again:");                     scanf("%d",&v);                    }                    seacher_i(&student[0].English_score,fp,v,student[num]);                              /*seach_i*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;            case 7:                   do                   {                    printf("please input the c_score:");                    scanf("%d",&v);                    while(v<0||v>100)                    {                     printf("error:0=<v=<100");                     printf("please input again:");                     scanf("%d",&v);                    }                    seacher_i(&student[0].c_score,fp,v,student[num]);                                 /*seach_i*/                    printf("Do you want to do it once?");                    printf("1.Yes\n2.no\n");                    scanf("%d",&j);                    while(j!=1&&j!=2)                    {                     printf("Error;please input again:");                     scanf("%d",&j);                    }                   }while(j==1);                   break;                   j++;                  }                 }                 if(j==0)printf("no this kind of message!");                 break;          case 2:                 for(i=0,j=0;i<n;i++)                 {                  fscanf(f,"%s%d%s%s",student[i].name,&student[i].sex,student[i].class,student[i].number);                  fscanf(f,"%d%d%d",&student[i].math_score,&student[i].English_score,&student[i].c_score);                  fscanf(f,"%s%s%s",student[i].native,student[i].math_teacher,student[i].English_teacher);                  fscanf(f,"%s%s%s",student[i].c_teacher,student[i].classroom,student[i].time);                  *student2[0].class=*student[0].class;                  if(strcmp(tname,p+i)==0)                  {                   for(b=0,v=0;b=<j;b++)                   {                    if(strcmp(student2[b].class,student[i].class)==0)v++;                   }                   if(v==0)                   {                    printf("%s\n",student[i].class);                    j++;                    *student2[j].class=*student[i].class;                   }                  }                 }                 if(j==0)printf("no this kind of message!");                 break;

#include<stdio.h> #include<conio.h> #include<stdlib.h> #include<string.h> #define num 100  struct stu                                                                   /*struct*/ {  char *name;  int sex;  char *class;  char number[10];  int math_score;  int English_score;  int c_score;  char *native;  char *math_teacher;  char *English_teacher;  char *c_teacher;  char *classroom;  char *time; }  struct stu *input(struct stu *student,FILE *f) {   int i,n;   char ch;   if((f=fopen("F:\\stud.data","wt+"))==NULL)   {    printf("\nerror on open F:\\stud.data!");    getchar();    exit(1);   }    do   {    clrscr();    i=0;    printf("please input the student's messages:\n");    printf("name:");    gets(student[i].name);    printf("sex:\n");    printf("1.man\n2.woman\n");    scanf("%d",&student[i].sex);    if(student[i].sex!=1&&student[i].sex!=2)    do    {        printf("\nerror,1.man\t2.woman\n");        printf("please input again:");        scanf("%d",&student[i].sex);        getchar();    }while(student[i].sex!=1&&student[i].sex!=2);    printf("\nclass:");    gets(student[i].class);    getchar();    printf("\nnumber:");    scanf("%s",student[i].number);    while(strlen(student[i].number)!=10)    {         printf("\nerror,please input the right data:");         gets(student[i].number);         getchar();    };    if(i>0)    {     for(n=0;n<i;n++)     {      if(strcmp(student[n].number,student[i].number)==0)      {         printf("\nerror,please input the right data:");         gets(student[i].number);         getchar();      }     }    }    printf("\nmath_score:");    scanf("%d",&student[i].math_score);    if(student[i].math_score>100||student[i].math_score<0)    do    {         printf("\nerror,please input the right math_score:");         scanf("%d",&student[i].math_score);    }while(student[i].math_score>100||student[i].math_score<0);    printf("\nEnglish_score:");    scanf("%d",&student[i].English_score);    if(student[i].English_score>100||student[i].English_score<0)    do    {         printf("\nerror,please input the right English_score:");         scanf("%d",&student[i].English_score);    }while(student[i].English_score>100||student[i].English_score<0);    printf("\nc_score:");    scanf("%d",&student[i].c_score);    if(student[i].c_score>100||student[i].c_score<0)    do    {         printf("\nerror,please input the right c_score:");         scanf("%d",&student[i].c_score);    }while(student[i].c_score>100||student[i].c_score<0);    printf("\nnative:");    gets(student[i].native);    getchar();    printf("\nmath_teacher:");    gets(student[i].math_teacher);    getchar();    printf("\nEnglish_teacher:");    gets(student[i].English_teacher);    getchar();    printf("\nc_teacher:");    gets(student[i].c_teacher);    getchar();    printf("\nclassroom:");    gets(student[i].classroom);    getchar();    printf("\ntime:");    gets(student[i].time);    fwrite(&student[i],sizeof(struct stu),1,f);    i++;    printf("Have another student record(y/n)?");    ch=getchar();    getchar();   }while(ch=='Y'||ch=='y');  fclose(f);  return(student); }  struct stu *add(struct stu *student,FILE *f) {   int i,n;   char ch;   if((f=fopen("F:\\stud.data","at+"))==NULL)   {    printf("\nerror on open F:\\stud.data!");    getchar();    exit(1);   }    do   {    clrscr();    i=ftell(f)/sizeof(struct stu);    n=ftell(f);    fseek(f,n,0);    printf("please add the student's messages:\n");    printf("name:");    gets(student[i].name);    printf("sex:\n");    printf("1.man\n2.woman\n");    scanf("%d",&student[i].sex);    if(student[i].sex!=1&&student[i].sex!=2)    do    {        printf("\nerror,1.man\t2.woman\n");        printf("please input again:");        scanf("%d",&student[i].sex);        getchar();    }while(student[i].sex!=1&&student[i].sex!=2);    printf("\nclass:");    gets(student[i].class);    getchar();    printf("\nnumber:");    scanf("%s",student[i].number);    while(strlen(student[i].number)!=10)    {         printf("\nerror,please input right data:");         gets(student[i].number);    };    printf("\nmath_score:");    scanf("%d",&student[i].math_score);    if(student[i].math_score>100||student[i].math_score<0)    do    {         printf("\nerror,please input the right math_score:");         scanf("%d",&student[i].math_score);    }while(student[i].math_score>100||student[i].math_score<0);    printf("\nEnglish_score:");    scanf("%d",&student[i].English_score);    if(student[i].English_score>100||student[i].English_score<0)    do    {         printf("\nerror,please input the right English_score:");         scanf("%d",&student[i].English_score);    }while(student[i].English_score>100||student[i].English_score<0);    printf("\nc_score:");    scanf("%d",&student[i].c_score);    if(student[i].c_score>100||student[i].c_score<0)    do    {         printf("\nerror,please input the right c_score:");         scanf("%d",&student[i].c_score);    }while(student[i].c_score>100||student[i].c_score<0);    printf("\nnative:");    gets(student[i].native);    getchar();    printf("\nmath_teacher:");    gets(student[i].math_teacher);    getchar();    printf("\nEnglish_teacher:");    gets(student[i].English_teacher);    getchar();    printf("\nc_teacher:");    gets(student[i].c_teacher);    getchar();    printf("\nclassroom:");    gets(student[i].classroom);    getchar();    printf("\ntime:");    gets(student[i].time);    fwrite(&student[i],sizeof(struct stu),1,f);    i++;    printf("Have another student record(y/n)?");    ch=getchar();    getchar();   }while(ch=='Y'||ch=='y');  fclose(f);  return(student); }  void search_s(char *q,FILE *f,char *p,struct stu student) {   int i,n,m;   if((f=fopen("F:\\stud.data","r"))==NULL)   {    printf("\nerror on open F:\\stud.data!");    getchar();    exit(1);   }   n=ftell(f)/sizeof(struct stu);   for(i=0,m=0;i<n;i++)   {    fscanf(f,"%s",q);                                   /*q is the first.*/    if(strcmp(q+i,p)==0)    {     fscanf(f,"%s%d%s%s",student[i].name,&student[i].sex,student[i].class,student[i].number);     fscanf(f,"%d%d%d",&student[i].math_score,&student[i].English_score,&student[i].c_score);     fscanf(f,"%s%s%s",student[i].native,student[i].math_teacher,student[i].English_teacher);     fscanf(f,"%s%s%s",student[i].c_teacher,student[i].classroom,student[i].time);     printf("%s\t\n",student[i].name);     switch(student[i].sex)     {      case 1:printf("man\n");break;      case 2:printf("woman\n");break;      default:break;     }     printf("%s\n",student[i].class);     printf("%s\n",student[i].number);     printf("%d\n",student[i].math_score);     printf("%d\n",student[i].English_score);     printf("%d\n",student[i].c_score);     printf("%s\n",student[i].native);     printf("%s\n",student[i].math_teacher);     printf("%s\n",student[i].English_teacher);     printf("%s\n",student[i].c_teacher);     printf("%s\n",student[i].classroom);     printf("%s\n",student[i].time);     m++;    }   if(m==0)printf("no this kind of message!");   }   fclose(f); }  void search_i(int *q,FILE *f,int p,struct stu student[]) {   int i,n,m;   if((f=fopen("F:\\stud.data","r"))==NULL)   {    printf("\nerror on open F:\\stud.data!");    getchar();    exit(1);   }   n=ftell(f)/sizeof(struct stu);   for(i=0,m=0;i<n;i++)   {    fscanf(f,"%d",q);                              /*q is the first.*/    if(*q==p)    {     fscanf(f,"%s%d%s%s",student[i].name,&student[i].sex,student[i].class,student[i].number);     fscanf(f,"%d%d%d",&student[i].math_score,&student[i].English_score,&student[i].c_score);     fscanf(f,"%s%s%s",student[i].native,student[i].math_teacher,student[i].English_teacher);     fscanf(f,"%s%s%s",student[i].c_teacher,student[i].classroom,student[i].time);     printf("%s\t\n",student[i].name);     switch(student[i].sex)     {      case 1:printf("man\n");break;      case 2:printf("woman\n");break;      default:break;     }     printf("%s\n",student[i].class);     printf("%s\n",student[i].number);     printf("%d\n",student[i].math_score);     printf("%d\n",student[i].English_score);     printf("%d\n",student[i].c_score);     printf("%s\n",student[i].native);     printf("%s\n",student[i].math_teacher);     printf("%s\n",student[i].English_teacher);     printf("%s\n",student[i].c_teacher);     printf("%s\n",student[i].classroom);     printf("%s\n",student[i].time);     m++;    }   if(m==0)printf("No this kind of message!");   }   fclose(f); }  main()                                                                      /*main*/ {  int a,b;  struct stu student[num],student1,student2[num];  int i,m,v,n,j;  char *p,*q,ch;  char tname[20];  FILE *fp;  do  {   clrscr();   printf("*******************STUDENT'S STUDY SYSTEM************\n\n");   printf("                     1.data's inputing\n");   printf("                     2.key words' searching\n");   printf("                     3.scores' reorder\n");   printf("                     4.teacher's messages\n");   printf("                     5.classroom's messages\n");   printf("                     6.exit\n");   printf("which function do you want ?");   scanf("%d",&a);   while(a<1||a>6)   {    printf("Error;please input again:");    scanf("%d",&a);   }   switch(a)   {    case 1:           do           {            printf("Do you want add some messages to it ?\nY\t\tN\n");            if(getchar()=='Y'||getchar()=='y')              add(student[num],fp);                                                    /*add*/            else              {               input(student[num],fp);                                                    /*input*/              }            printf("Do you want to do it once?");            printf("1.Yes\n2.no\n");            scanf("%d",&j);            while(j!=1&&j!=2)            {             printf("Error;please input again:");             scanf("%d",&j);            }           }while(j==1);           break;    case 2:

最好把报错的内容也贴上来

struct stu 定义传上来，另外其它相关的也传上来


Question: 在线等 struct mode **head

指向结构体mode的指针与双重指针~~~

**head，指针的指针； *ah *bh，两个指针。

深刻理解指针才能领悟其中含义。


Question: 这算不算是一种新的压缩方法

引用 11 楼 zhou19891113 的回复:[quote=引用 5 楼 baipv008 的回复:] 一个字节有255个可能值，如果你想表达这255个可能的值，用少于一个字节是不可能的。 是有可能的[/quote] for example?

引用 5 楼 baipv008 的回复:一个字节有255个可能值，如果你想表达这255个可能的值，用少于一个字节是不可能的。 是有可能的

你的算法跟已有的，有版权的，不一样，就不算侵权。

7z zip rar cab ……

压缩算法很多拉，百度把。

我同意楼主的关点。同样的意思用文言文来表达，确实要简洁许多

现在的压缩算法很多，类似的有 霍夫曼算法，KMP算法

什么叫“把字节变短”？

从信息的角度讲，压缩文件是把数据内的信息分成两部分，共性部分作为压缩解压算法，特性部分作为压缩后的数据 用数学计算将字节变短，如果字节数据本身没有特殊限制，那应该是不可能的，楼主所说的方法类似于永动机，试图用“数学计算”来挑战信息守恒定律

引用 楼主 coler_ming 的回复:我想用一种数学计算 把文件的字节 变短   我想问问目前有没有这种压缩方式    如果开发了 算不算侵权啊？   所有的压缩本质上都是将编码变短，比如霍夫曼编码最短是是1位表示字符（其不同码值编码位数不同）  如果lz你确实能独立的开发出一种编码压缩算法，即使和已经存在的方式擂同，那你也是算法的牛人！

引用 5 楼 baipv008 的回复:一个字节有255个可能值，如果你想表达这255个可能的值，用少于一个字节是不可能的。  是256个。


Question: 编一程序实现,输入一个整数，输出与该整数对应的月份的英文简称。具体要求为：1）使用指针数组，将指针元素的下标和指针所指向的字符串对应起来。2）超出范围的月份一律

这是考试？？ 题目太少了

根本就不能，重新编吧

for(int i=0;i<13;i++) {     puts(month[i]); }

char *month[13]={ "unlegal month" "January" "February" .... }


Question: 求高手帮我写一个游戏的排行榜（要用到文件）

createfile,readfile,writefile,closefile

额噩噩噩噩噩噩噩噩噩噩噩噩噩噩噩


Question: 大一新生的C语言疑问

建议：踏实学，基础学好，勿浮躁，学好各门基础课程，多编写，多调试，认真学好数学课程，毕业后前途不可限量！！！

原来是短路运算符啊，一直不知道还有这个名字

引用 2 楼 a510579741 的回复:首先 这个跟优先级关系不大 你说的对  ++的优先级比&&高    &&比||要高 但是  &&和||涉及到短路运算    你可以这么看这个式子（++a||（++b&&++c）） ++a = 3 >0  后面跟的是|| 所以  整个式子值是1    就不在运行++b和++c了 输出的结果为 3,2,2  如果把a的初值设置为-1的话 ++a = 0=0  后面跟的是|| 所以  要执行后面的式子    就执行++b  ++b后面跟的是&& 所以要执行++c 所以输出结果为 0,3,3支持

引用 6 楼 xyzinfernity 的回复:||前面判断为真的时候后面不执行，所以执行代码只有++a 结果是a=3,b=2,c=2正解！

确实，忘记了还有或运算就是这样，如果左边为1的话，右边根本不会参与计算。这应该是编译器的作用吧。

其实这种问题一点都不用纠结的，按你想要的运算顺序加上括号就是了，省得还要想运算级的高低

引用 7 楼 truelance 的回复:ANSI C标准 6.5.14.4 Unlike the bitwise | operator, the || operator guarantees left-to-right evaluation; there is a sequence point after the evaluation of the first operand. If the first operand compares unequal to 0, the second operand is not evaluated. +1

术语：短路代码。

只能说编译器越来越厉害了

式子是这样的（（++a）||（++b&&++c）） 少打了个括号

编译器也是人写的，而且越来越能优化代码，如果写编译器的人像你所说那样的去做，那么效率会较低。 而且if(条件1 || 条件2）这样的语句，你可以理解为： if(条件1）    // 成立,do someting else if(条件2）    // 成立，do something  语句按顺序从上到下执行，不会因为后面的语句带有优先级高的运算符就先执行后面的语句吧？ 比如： ++a || ++b 看一下它的反汇编就明白了：  ++a || ++b; 00D618D3  mov         eax,dword ptr [a]   00D618D6  add         eax,1   00D618D9  mov         dword ptr [a],eax   00D618DC  jne         main+47h (0D618E7h)   00D618DE  mov         ecx,dword ptr [b]   00D618E1  add         ecx,1   00D618E4  mov         dword ptr [b],ecx


Question: 前段时间看见的一个有趣的C问题

引用 楼主 Losicke 的回复:void a() {     ...... }  int main() {        int x=1,y=2;       a();       printf("x=%d,y=%d",x,y);       return 0;  }  记得好像是两个月前在CSDN上看见的这道题，找了很久找不到了，没记错的是这样，大意是在函数a中写程序要求改变main函数中输出x和y的值~~~~~~ 额，当时记得是用压栈，然后我尝试了几次只改变了x的值，y的值一直没变化~~~~~~  不同编译器，甚至同一编译器，不同时刻编译出的代码，x,y 占用的内存可能会不同；  另外同一编译器，不同配置（比如 Release,Debug）x,y占用内存，也未必相同 同样对于 函数 a() 调用，也可能由于优化的原因，变的面目全非。  因此，非要通过溢出方式，改写x,y ，而且要求任何时候效果相同， 这是不可能完成的任务。  如果，你写的代码，实现了这个功能，或者出错造成这种效果； 那道是可以分析出来，是什么原因造成的。

VC++12 32为测试结果  #include <stdio.h>  void a() { 	int i;  	{ 		int *p=&i; 		p[5]=5; 		p[6]=8; 	} }  int test() { 	int x=1, y=2; 	a(); 	printf("%d %d", x, y); 	return 0; }  int main() { 	test(); }  在debug下输出5 8貌似修改成功，release输出1 2。编译器的优化肯定会忽略a()的副作用的

引用 10 楼 zhuobattle 的回复:这类题目编译器相关性太大了，你要debug版本还好，release版本编译优化后直接没有x,y就两个常数。 另外a函数你改成naked还有点可行性。要不入口处那个esp预留的堆栈空间又有不确定性，你怎么去操作呢  没错。

上面Hack不能保证成功。好的编译器会直接把main处理成类似  [code=c] int main() {          // push eax     a(); // call _a     printf("x=%d, y=%d", 1, 2);// mov eax, 2                                // push eax                                // mov eax, 1                                // push eax                                // mov eax, addressof"x...."                                // push eax                                // call _printf       return 0;                   }

用宏

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。

简单一点 void a() { 	printf("x=%d,y=%d",10,20); 	exit(0); }

我估计是用人为溢出吧~

#include <stdio.h>  void a() { asm( 	"movl 36(%ebp) , %eax\n\t" //y的值赋给 eax 	"movl 32(%ebp), %edx\n\t"  //x的值赋给 edx 	"movl %eax , 32(%ebp)\n\t" //eax 赋给x地址所指向的内存 	"movl %edx , 36(%ebp)\n\t" //edx 赋给y地址所指向的内存 	);	 } int main() { 	int x=1, y=2; 	a(); 	printf("x=%d, y=%d", x, y);	 	return 0;	 }  编译环境 ubantu 13.10 gcc编译器

void a(int *p, int *q) {     int *a = p;     int *b = q;      *a = 10;     *b = 20;      return; }  这个运行过，是可以的额

只要找出x,y的地址、或者在栈中的位置

老师曾经提到过，不过忘了


Question: 大一新生的C语言疑问

引用 4 楼 u013078986 的回复:[quote=引用 1 楼 user-3 的回复:] 查查C运算符的优先级和结合顺序 引用 2 楼 relaxisland 的回复:与的优先级 高于 或吧 ++a||++b&&++c;  ----》等价于 ++a|| (++b&&++c); 引用 3 楼 KenZhang1031 的回复:条件1 || 条件2 && 条件3 因为&&优先级比||高，所以相当于 条件1 || （条件2 && 条件3） 只要条件1为真，那么后面不会计算了，因为无论后面如何，结果一定为真。如果为假，才会计算后面。  还有一个疑问，优先级高的不是应该先计算吗？ 比如：3-2*4    应该先算2*4=8，让后再3-8=-5 同样，为什么不先算++b&&++c=3&&3=1，然后再计算++a||……？[/quote]  只能说编译器太聪明了吧。 不过优先级高 不一定先计算的， 还要跟 结合性， 以及 左右操作数的计算顺序（不同编译器可能不一样）有关。 比如 a + b + (c +d ) * (e * f)

引用 1 楼 user-3 的回复:查查C运算符的优先级和结合顺序 引用 2 楼 relaxisland 的回复:与的优先级 高于 或吧 ++a||++b&&++c;  ----》等价于 ++a|| (++b&&++c); 引用 3 楼 KenZhang1031 的回复:条件1 || 条件2 && 条件3 因为&&优先级比||高，所以相当于 条件1 || （条件2 && 条件3） 只要条件1为真，那么后面不会计算了，因为无论后面如何，结果一定为真。如果为假，才会计算后面。  还有一个疑问，优先级高的不是应该先计算吗？ 比如：3-2*4    应该先算2*4=8，让后再3-8=-5 同样，为什么不先算++b&&++c=3&&3=1，然后再计算++a||……？

查查C运算符的优先级和结合顺序


Question: 比较两个数组的问题

引用 4 楼 u012322264 的回复:[quote=引用 2 楼 baipv008 的回复:] 不能使用额外存储空间吗？ 我定义了另外两个数组  一个放第二次运行结果  一个放差  运行一直提示段错误  搞了好久不提示了  运行了好久还没结果[/quote] 恩，局部变量数组肯定是不行的。  你要声明称static变量 或者通过malloc来分配动态内存。

引用 3 楼 u012322264 的回复:[quote=引用 1 楼 relaxisland 的回复:] 那个计算都会计算了， 单纯 相减，取绝对值，再比较应该不难吧。  是担心性能问题？ 对啊  我一开始想的想把开始的数组存到一个文件里去，然后再比较 那个TXT得5M打都打不开- - 后来直接又定义数组  运行就没结束- -[/quote]  你什么机器啊 5M根本不算大啊。

引用 5 楼 KenZhang1031 的回复:这个问题其实就是把每点的相邻6个点的平均值作为该点的新值，组成一个新的数组，然后求新数组和原来的数组对应位置的差值的最大值。直接用原来的数组，计算某点和其相邻6个点的差值的平均值结果是一样的，不需要生成新的数组。没明白解释？计算某点和其相邻6个点的差值的平均值不就是这个点的值么~~还用算？

楼主的意思是在一次调用函数中结束么？

引用 2 楼 baipv008 的回复:不能使用额外存储空间吗？ 我定义了另外两个数组  一个放第二次运行结果  一个放差  运行一直提示段错误  搞了好久不提示了  运行了好久还没结果

引用 1 楼 relaxisland 的回复:那个计算都会计算了， 单纯 相减，取绝对值，再比较应该不难吧。  是担心性能问题？ 对啊  我一开始想的想把开始的数组存到一个文件里去，然后再比较 那个TXT得5M打都打不开- - 后来直接又定义数组  运行就没结束- -

不能使用额外存储空间吗？


Question: C语言已知解密算法求加密算法（急）

好像是个仿射变换！楼主自己写吧！


Question: 问一个一元多项式计算器的加减问题，，

引用 12 楼 lm_whales 的回复:抱歉，第一种方案是 ： 一种方案，不管某一项系数，是否为零，都存储该项，不存储任何指数， 项数 =  最高项的指数 + 1 各项按照升序，或者降序存储。 同次项顺次相加，相减。 如果是项数少的减多的，那么较长的多项式，高次项，直接取相反数。其他项顺序相减     an x^n + .... + am x^m      +....+ a1     x    + a0 +)                 bm x^m      +....+ b1     x    + b0  ---------------------------------------------------------         an x^n+.......+ (am+bm) x^m +.....(a1+b1) x +(a0+b0) ================================================================    an x^n + .... + am x^m      +....+ a1     x    + a0 -)                 bm x^m      +....+ b1     x    + b0  ---------------------------------------------------------        an x^n+.......+ (am-bm) x^m +.....(a1-b1) x +(a0-b0)  ===============================================================                    am x^m      +....+ a1     x    + a0 -) bn x^n+.......+ bm x^m      +....+ b1     x    + b0  ---------------------------------------------------------        -bn x^n+.......+(am-bm) x^m +.....+(a1-b1) x +(a0-b0)  另一种方案，同时存储指数和系数 如果存储时候已经排序，病合并同类项， 那么可以顺序比较指数，相同者系数相加，相减。  如果减数指数较高，减数中，没有和被减数相减的项，系数取为相反数，作为差的同一指数的项 计算中，结果为零的项，直接删除。 谢谢，这个问题我解决了～～给你好评～

你好像，没有比较指数，指数相同才可以相加。 一种方案，不过某一项指数是否为零，都存储该项，不存储指数， 最高项的指数 = 项数 + 1  此时只要最高项指数相同，就可以顺序相加，否则  低次项相加就行了，高次项，只有一个多项式有，就不相加了。只要找到较长多项式， 中指数，等于，另一个多项式，最高指数的那一项，就可以了顺次相加了。 这可以通过比较项数，和简单的移动指针，得到。  另一种方案，同时存储指数和系数 如果存储时候已经排序，病合并同类项， 那么可以顺序比较指数，相同者系数相加。

引用 4 楼 u012794099 的回复:[quote=引用 3 楼 lm_whales 的回复:] 减法不就是加法么？ 方法视一样的 就是我只在里面看到 q->coef=q->coef+p->coef; 这个指数相加的操作，那么减法的操作呢，而且加法做完之后，它已经把p给释放掉了，而p存储的是相加之后的结果，那pq相减的操作怎么完成？[/quote] 系数可以是负数的，你可以输入-1，-2。。。。

引用 2 楼 Benjaminzhou93 的回复:我的思路: 用数组存储更方便 1.初始化全为0 2.下标代表幂 3.计算 我不是问怎么写程序，而是这个程序我又不太懂得地方，想问一问。

引用 3 楼 lm_whales 的回复:减法不就是加法么？ 方法视一样的 就是我只在里面看到 q->coef=q->coef+p->coef; 这个指数相加的操作，那么减法的操作呢，而且加法做完之后，它已经把p给释放掉了，而p存储的是相加之后的结果，那pq相减的操作怎么完成？

引用 7 楼 lm_whales 的回复:这有两个方法 1）直接用加法做减法 A+B =A - (-B); 需要定义 -B 这个操作，把每项系数改成相反数 2）定义减法，一切都和加法相同，加号改成减号即可。 即加法的：  q->coef=q->coef + p->coef;  改成减法的： q->coef = q->coef - p->coef; 我的程序运行结果是这样子的

引用 6 楼 Benjaminzhou93 的回复:[quote=引用 4 楼 u012794099 的回复:] [quote=引用 3 楼 lm_whales 的回复:] 减法不就是加法么？ 方法视一样的 就是我只在里面看到 q->coef=q->coef+p->coef; 这个指数相加的操作，那么减法的操作呢，而且加法做完之后，它已经把p给释放掉了，而p存储的是相加之后的结果，那pq相减的操作怎么完成？[/quote] 系数可以是负数的，你可以输入-1，-2。。。。[/quote] ..我问的是我的题目中的源程序的代码怎么实现的，。。。运行之后加法答案和减法答案都可以同时得到。

引用 7 楼 lm_whales 的回复:这有两个方法 1）直接用加法做减法 A+B =A - (-B); 需要定义 -B 这个操作，把每项系数改成相反数 2）定义减法，一切都和加法相同，加号改成减号即可。 即加法的：  q->coef=q->coef + p->coef;  改成减法的： q->coef = q->coef - p->coef; 我想问的是，我这个程序里面没有减法这个代码，但是当程序运行的时候却会出来减法，就是输入俩个多项式ha，ha然后enter他就会有加之后的答案和减之后的答案，，，，能给我解释一下他是怎么做到的吗，就是我问题中的原程序。。

减法不就是加法么？ 方法视一样的

我的思路: 用数组存储更方便 1.初始化全为0 2.下标代表幂 3.计算

如果给几个输入输出例子，那将更好理解


Question: 计算结构体大小

引用 2 楼 user-11 的回复:搜索内存对齐，就有相关说明了正解

收获了！！！

引用 15 楼 nice_cxf 的回复:[quote=引用 14 楼 akirya 的回复:] [quote=引用 13 楼 nice_cxf 的回复:] [quote=引用 12 楼 akirya 的回复:] [quote=引用 10 楼 nice_cxf 的回复:] [quote=引用 4 楼 u013288113 的回复:] [quote=引用 1 楼 akirya 的回复:] 结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。 [/quote] 这个应该说是vs系列这里做的不够好，是按照最大的对齐，如果是gcc，32位系统下就是按4字节对齐，[/quote] 对齐规则都是一样的 struct s { 	char a[3]; 	short b; }; 这个在gcc下也一样是6[/quote]  没有double类型，vs和gcc结果是一样的，找个有double的试试就知道了[/quote]  struct s { 	char a; 	double b; 	char c; }; 这种么? gcc vs 都是 24 ,能不能举个例子看看?[/quote] 我这里gcc是16啊，怎么会是24？你操作系统64位的？[/quote] 系统是64位的，但32位gcc和64位gcc的结果是一致的，全部使用默认选项。

引用 14 楼 akirya 的回复:[quote=引用 13 楼 nice_cxf 的回复:] [quote=引用 12 楼 akirya 的回复:] [quote=引用 10 楼 nice_cxf 的回复:] [quote=引用 4 楼 u013288113 的回复:] [quote=引用 1 楼 akirya 的回复:] 结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。 [/quote] 这个应该说是vs系列这里做的不够好，是按照最大的对齐，如果是gcc，32位系统下就是按4字节对齐，[/quote] 对齐规则都是一样的 struct s { 	char a[3]; 	short b; }; 这个在gcc下也一样是6[/quote]  没有double类型，vs和gcc结果是一样的，找个有double的试试就知道了[/quote]  struct s { 	char a; 	double b; 	char c; }; 这种么? gcc vs 都是 24 ,能不能举个例子看看?[/quote] 我这里gcc是16啊，怎么会是24？你操作系统64位的？

引用 13 楼 nice_cxf 的回复:[quote=引用 12 楼 akirya 的回复:] [quote=引用 10 楼 nice_cxf 的回复:] [quote=引用 4 楼 u013288113 的回复:] [quote=引用 1 楼 akirya 的回复:] 结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。 [/quote] 这个应该说是vs系列这里做的不够好，是按照最大的对齐，如果是gcc，32位系统下就是按4字节对齐，[/quote] 对齐规则都是一样的 struct s { 	char a[3]; 	short b; }; 这个在gcc下也一样是6[/quote]  没有double类型，vs和gcc结果是一样的，找个有double的试试就知道了[/quote]  struct s { 	char a; 	double b; 	char c; }; 这种么? gcc vs 都是 24 ,能不能举个例子看看?

引用 12 楼 akirya 的回复:[quote=引用 10 楼 nice_cxf 的回复:] [quote=引用 4 楼 u013288113 的回复:] [quote=引用 1 楼 akirya 的回复:] 结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。 [/quote] 这个应该说是vs系列这里做的不够好，是按照最大的对齐，如果是gcc，32位系统下就是按4字节对齐，[/quote] 对齐规则都是一样的 struct s { 	char a[3]; 	short b; }; 这个在gcc下也一样是6[/quote]  没有double类型，vs和gcc结果是一样的，找个有double的试试就知道了

引用 10 楼 nice_cxf 的回复:[quote=引用 4 楼 u013288113 的回复:] [quote=引用 1 楼 akirya 的回复:] 结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。 [/quote] 这个应该说是vs系列这里做的不够好，是按照最大的对齐，如果是gcc，32位系统下就是按4字节对齐，[/quote] 对齐规则都是一样的 struct s { 	char a[3]; 	short b; }; 这个在gcc下也一样是6

最大字节对齐，当然你可以指定对齐方式，这样不至于不同编译器，不同编译环境可能导致不同的结果。  #pragma pack(push, 2) //对齐方式改用2字节  struct a { 	unsigned short u1; 	unsigned short u2; 	unsigned short u3; }aa;  struct b { 	char q1; 	int q2; 	short q3; }bb; #pragma pack(pop)//恢复原来默认

其实楼主根本不了解对齐的真实含义

引用 4 楼 u013288113 的回复:[quote=引用 1 楼 akirya 的回复:] 结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。 [/quote] 这个应该说是vs系列这里做的不够好，是按照最大的对齐，如果是gcc，32位系统下就是按4字节对齐，

内存对齐，费了老大劲才弄明白。。。。

引用 4 楼 u013288113 的回复:[quote=引用 1 楼 akirya 的回复:] 结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。 [/quote] 计算机为了方便取得地址

引用 4 楼 u013288113 的回复:[quote=引用 1 楼 akirya 的回复:] 结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。 [/quote] 结构体套结构体的时候，就需要用到这个了。

计算机为了方便，都是用最大字节来分配的，所以是4+4+4 = 12

引用 1 楼 akirya 的回复:结构体的大小是最大成员的整数倍。因为有int所以是12而不是10 为什么是最大成员的整数倍呢？  我一直以为是4字节的整数位，因为是32位机，一次处理32位，所以是4字节的整数倍。  我的理解有什么偏差，您能帮我解释一下吗？  谢谢了。

搜索内存对齐，就有相关说明了

结构体的大小是最大成员的整数倍。因为有int所以是12而不是10


Question: 怎么同时输入字符串和数字

函数设置一个标记位Flag，表示该输入数据类型（学生名字数组和成绩数组），这样公用了一个接口。例如Flag = 1 为学生名字，Flag = 2为学生成绩  不知道这是不是你想要的。

C++可以operator >>重载

引用 5 楼 ovoovo 的回复:引用 4 楼 u012495008 的回复:[quote=引用 1 楼 ovoovo 的回复:] 分两个数组，分别读入，然后后续合并做处理就可以，或者读取一行的方法读入，都可以。后续合并处理的时候老是出问题，如果输入字符串用getchar(),成绩用scanf输入的话可不可行呢？都用scanf也不行。。。  参考如下代码的输入： #include <stdio.h> #include <stdlib.h> #include <string.h>     typedef struct _bookinfo {     char  name[60];     float price; }bookinfo;     int main() {       int nbookCount = -1;       int maxpriceindex = 0;       float maxprice = 0.0;       bookinfo *pBooklist = NULL;     printf("please intput the number of books:\n");     scanf("%d", &nbookCount);           if(nbookCount <= 0)     {         printf("error books count!\n");         exit(-1);     }           pBooklist = (bookinfo *)malloc(nbookCount * sizeof(bookinfo));     if(pBooklist == NULL)     {         printf("malloc memory failed!!\n");         exit(-1);     }           int i;     for(i=0; i<nbookCount; i++)     {         printf("please intput the %dth book name:\n", i+1);         scanf("%s", pBooklist[i].name);                   printf("please intput the %dth book price:\n", i+1);         scanf("%f", &pBooklist[i].price);         if(maxprice < pBooklist[i].price)         {             maxprice = pBooklist[i].price;             maxpriceindex = i;         }         printf("\n\n----------------------------------------------------\n", i+1);     }           printf("The most dear book is:[%s]. The price is:[%f]\n", pBooklist[maxpriceindex].name, pBooklist[maxpriceindex].price);           free(pBooklist); } [/quote] 非常感谢。

引用 4 楼 u012495008 的回复:引用 1 楼 ovoovo 的回复:分两个数组，分别读入，然后后续合并做处理就可以，或者读取一行的方法读入，都可以。后续合并处理的时候老是出问题，如果输入字符串用getchar(),成绩用scanf输入的话可不可行呢？都用scanf也不行。。。  参考如下代码的输入： #include <stdio.h> #include <stdlib.h> #include <string.h>     typedef struct _bookinfo {     char  name[60];     float price; }bookinfo;     int main() {       int nbookCount = -1;       int maxpriceindex = 0;       float maxprice = 0.0;       bookinfo *pBooklist = NULL;     printf("please intput the number of books:\n");     scanf("%d", &nbookCount);           if(nbookCount <= 0)     {         printf("error books count!\n");         exit(-1);     }           pBooklist = (bookinfo *)malloc(nbookCount * sizeof(bookinfo));     if(pBooklist == NULL)     {         printf("malloc memory failed!!\n");         exit(-1);     }           int i;     for(i=0; i<nbookCount; i++)     {         printf("please intput the %dth book name:\n", i+1);         scanf("%s", pBooklist[i].name);                   printf("please intput the %dth book price:\n", i+1);         scanf("%f", &pBooklist[i].price);         if(maxprice < pBooklist[i].price)         {             maxprice = pBooklist[i].price;             maxpriceindex = i;         }         printf("\n\n----------------------------------------------------\n", i+1);     }           printf("The most dear book is:[%s]. The price is:[%f]\n", pBooklist[maxpriceindex].name, pBooklist[maxpriceindex].price);           free(pBooklist); }


Question: C语言小疑问

memcpy(por->p, "a", 1);改成memcpy(por.p, "a", 1);

建议在memset(por, 0, sizeof(struct bao));后，打印一下指针p的值，没猜错的话，应该被memset弄成空指针了.

por->p = malloc(3);让p指向刚分配的内存，然后memset(por, 0, sizeof(struct bao));又让p指向了0地址；最后memcpy(por->p, "a", 1);往0地址写"a",自然段错误。


Question: 一道简单的贪心算法问题

n个物品，每个都可以放或者是不放，组合成最大体积，上限是v。 动态规划的解法,如果第n个物品放，体积就为T（n-1,v-vn)+vn , 如果不放则为T（n-1,v） 递归式如下: T(n,v) = max{T(n-1,v-vn)+vn , T(n-1,v)} 时间复杂度： O(n*v)


Question: RSA算法四字节数字加密解密！

我找到原因了，RSA算法中用到的整数定义的时候是int类型，但是int类型的变量值的范围是-32768~32767（2^5-1）,如果变量值超出这个范围，就会数据溢出，把int类型换成是long int就可以了，也可以定义无符号基本整形unsined int！

还有人研究过这方面的问题吗？

引用 6 楼 zhuobattle 的回复:[quote=引用 5 楼 t59616 的回复:] [quote=引用 3 楼 zhuobattle 的回复:] [quote=引用 2 楼 t59616 的回复:] [quote=引用 1 楼 zhuobattle 的回复:] RSA有长度限制的，你的D d N要足够长。 不太懂，能详细解释下吗？RSA的长度手什么限制，n=p*q, ed=1 mod(n),这些长度都要多少bit才能满足RSA的安全性？[/quote] RSA真实实现是大整数来做（比如N长度1024bits)的，你用int来做，根本没有什么安全性而言。 一般长度起码要在96bits以上的长度.明文长度有如下关系： 根据不同的padding格式， RSA_PKCS1_PADDING RSA_size-11 RSA_NO_PADDING RSA_size-0 RSA_X931_PADDING RSA_size-2。 举个例子吧，一般密钥1024bits(128 Bytes),那么明文长度不能超过128-11 = 117 Bytes.(采用PKCS1_padding) 所以一般RSA不会用在太长的数据加密上，一般用在签名或者小部分交换加密，如果你真要用 大块数据加密，那么你自己分片吧。   [/quote] 其实我也很奇怪，有的时候t是1024bit，解密m是1024bit的就成功，有的时候就失败了，因为我设置的p和q是随机的，所以t大小也不确定，三位数的是没问题了。  [/quote] 你可以看下，失败的时候那个m值是不是比成功的m值小？[/quote] 你可以看下，失败的时候那个m值是不是比成功的m值大？（上面打错了）

引用 5 楼 t59616 的回复:[quote=引用 3 楼 zhuobattle 的回复:] [quote=引用 2 楼 t59616 的回复:] [quote=引用 1 楼 zhuobattle 的回复:] RSA有长度限制的，你的D d N要足够长。 不太懂，能详细解释下吗？RSA的长度手什么限制，n=p*q, ed=1 mod(n),这些长度都要多少bit才能满足RSA的安全性？[/quote] RSA真实实现是大整数来做（比如N长度1024bits)的，你用int来做，根本没有什么安全性而言。 一般长度起码要在96bits以上的长度.明文长度有如下关系： 根据不同的padding格式， RSA_PKCS1_PADDING RSA_size-11 RSA_NO_PADDING RSA_size-0 RSA_X931_PADDING RSA_size-2。 举个例子吧，一般密钥1024bits(128 Bytes),那么明文长度不能超过128-11 = 117 Bytes.(采用PKCS1_padding) 所以一般RSA不会用在太长的数据加密上，一般用在签名或者小部分交换加密，如果你真要用 大块数据加密，那么你自己分片吧。   [/quote] 其实我也很奇怪，有的时候t是1024bit，解密m是1024bit的就成功，有的时候就失败了，因为我设置的p和q是随机的，所以t大小也不确定，三位数的是没问题了。  [/quote] 你可以看下，失败的时候那个m值是不是比成功的m值小？

引用 7 楼 zhuobattle 的回复:你可以看下，失败的时候那个m值是不是比成功的m值大？（上面打错了） 这个的关键是要注意t的长度吗？

引用 2 楼 t59616 的回复:[quote=引用 1 楼 zhuobattle 的回复:] RSA有长度限制的，你的D d N要足够长。 不太懂，能详细解释下吗？RSA的长度手什么限制，n=p*q, ed=1 mod(n),这些长度都要多少bit才能满足RSA的安全性？[/quote] RSA真实实现是大整数来做（比如N长度1024bits)的，你用int来做，根本没有什么安全性而言。 一般长度起码要在96bits以上的长度.明文长度有如下关系： 根据不同的padding格式， RSA_PKCS1_PADDING RSA_size-11 RSA_NO_PADDING RSA_size-0 RSA_X931_PADDING RSA_size-2。 举个例子吧，一般密钥1024bits(128 Bytes),那么明文长度不能超过128-11 = 117 Bytes.(采用PKCS1_padding) 所以一般RSA不会用在太长的数据加密上，一般用在签名或者小部分交换加密，如果你真要用 大块数据加密，那么你自己分片吧。

引用 3 楼 zhuobattle 的回复:[quote=引用 2 楼 t59616 的回复:] [quote=引用 1 楼 zhuobattle 的回复:] RSA有长度限制的，你的D d N要足够长。 不太懂，能详细解释下吗？RSA的长度手什么限制，n=p*q, ed=1 mod(n),这些长度都要多少bit才能满足RSA的安全性？[/quote] RSA真实实现是大整数来做（比如N长度1024bits)的，你用int来做，根本没有什么安全性而言。 一般长度起码要在96bits以上的长度.明文长度有如下关系： 根据不同的padding格式， RSA_PKCS1_PADDING RSA_size-11 RSA_NO_PADDING RSA_size-0 RSA_X931_PADDING RSA_size-2。 举个例子吧，一般密钥1024bits(128 Bytes),那么明文长度不能超过128-11 = 117 Bytes.(采用PKCS1_padding) 所以一般RSA不会用在太长的数据加密上，一般用在签名或者小部分交换加密，如果你真要用 大块数据加密，那么你自己分片吧。   [/quote] 其实我也很奇怪，有的时候t是1024bit，解密m是1024bit的就成功，有的时候就失败了，因为我设置的p和q是随机的，所以t大小也不确定，三位数的是没问题了。

引用Quote: 引用 1 楼 zhuobattle 的回复: RSA有长度限制的，你的D d N要足够长。 不太懂，能详细解释下吗？RSA的长度手什么限制，n=p*q, ed=1 mod(n),这些长度都要多少bit才能满足RSA的安全性？ RSA真实实现是大整数来做（比如N长度1024bits)的，你用int来做，根本没有什么安全性而言。 一般长度起码要在96bits以上的长度.明文长度有如下关系： 根据不同的padding格式， RSA_PKCS1_PADDING RSA_size-11 RSA_NO_PADDING RSA_size-0 RSA_X931_PADDING RSA_size-2。 举个例子吧，一般密钥1024bits(128 Bytes),那么明文长度不能超过128-11 = 117 Bytes.(采用PKCS1_padding) 所以一般RSA不会用在太长的数据加密上，一般用在签名或者小部分交换加密，如果你真要用 大块数据加密，那么你自己分片吧。 +1

引用 1 楼 zhuobattle 的回复:RSA有长度限制的，你的D d N要足够长。 不太懂，能详细解释下吗？RSA的长度手什么限制，n=p*q, ed=1 mod(n),这些长度都要多少bit才能满足RSA的安全性？

RSA有长度限制的，你的D d N要足够长。


Question: 服务器没有文件系统，如何实现文件下载

引用 3 楼 derekrose 的回复:那是什么OS啊 同问，这个没有文件系统的OS叫什么名字？？？

没有文件系统，那是裸设备了

连文件系统都没有，那还叫操作系统吗？而且有了文件系统，那也和你读写文件基本无关~

那是什么OS啊

FTP.....


Question: 求高手帮忙解决一个一个问题

scanf("%d%c", &n, &c); while (c != '\n') {     fflush(stdin);     scanf("%d%c", &n, &c); }

是以外，不是意外，发错了，不好意思。楼上把问题想复杂了，我用的是C语言，可以用正则表达式吗，那个好像是过滤提取的，我的没那么复杂，只要输入的不是数字，就提示出错，然后重新输入，嗯，就这样。

google一下正则表达式，比自己对每一位上进行检查要好多了。

怎么个意外法？ 输入的类型都由scanf("%s", addr)""里控制的， 如果要输入的是数字，scanf("%d", &a);就好。  比如，如果用户需要输入整数，但是你输入的是1a2的话，系统会认为a是非法字符而当做输入结束，则此时输入的整数就为1。


Question: 一道考研题，求大神指教

引用 1 楼 vipcxj 的回复:m=24 n=4 s=4 m=24+4/2=26/2=13 n=13 s=13-1=12 k=75 rt 26+75=101 m=13+13/2=19/2=9 n=9+3=12 s=null k=56 rt 19+56=75 m=9+12/2=15/2=7 n=7+3=10 s=null k=41 rt 15+41=56 m=7+10/2=12/2=6 n=6 s=6-1=5 k=29 rt 12+29=41 m=6+6/2=9/2=4 n=4+3=7 s=null k=20 rt 9+20=29 m=4+7/2=7/2=3 n=3+3=6 s=null k=13 rt 7+13=20 m=3+6/2=6/2=3 n=3 s=3-1=2 k=7 rt 6+7=13 m=3+3/2=4/2=2 n=2 s=2-1=1 k=3 rt 4+3=7 m=2+2/2=3 rt 3;  所以最后打印 /*k*/ 3 7 13 20 29 41 56 75 /*s*/ 1 2 5 12 4   using namespace std;   queue<int> Q; stack<int> S;  int finding(int n);  void findout(int m, int n) { 	Q.push(m); 	S.push(n); 	finding(n); 	while (!S.empty()) 	{ 		int tmp = S.top(); 		S.pop(); 		cout << tmp << endl; 	} }  int finding(int n) { 	int m, k; 	m = Q.back() + n/2; 	Q.pop(); 	if (m > 3) 	{ 		n = m/2; 		Q.push(n); 		if ((n << 1) == m) 		{ 			S.push(n-1); 			k = finding(n); 		} 		else 		{ 			k = finding(n+3); 		} 	} 	else 	{ 		return m; 	} 	cout << k << " "; 	return m + k; }  int main() {    findout(24,4);    return 0; }   这是第二题的，第一题逻辑和第二题是不一样的，但我没看出啥技巧，只能你看懂代码后死算。附上的程序是我的测试程序，我用了预编译头，所以你要自己加上头文件。已经编译并运行过了，用得vs2012，得到的结果和人工分析的结果是一样的

第一个程序执行  m=30 n=4 初值  1. n=4 m=30+4/2=32     n=16 2. n=15 m=16+15/2=23 n=11 3. n=15 m=11+15/2=18 n=9 4. n=15 m=9+15/2=16 n=8 5. n=7 m=9+17/2=11 n=5 6. n=7 m=5+7/2=8 n=4 7. n=3 m=4+3/2=5 n=2 8. n=3 m=2+3/2=3返回 打印： 3 5 8 11 16 18 23（m) 3 7 15 4在Findout中打印（栈里的内容）


Question: 有三万对坐标数据（x，y），要求分成合理的行列。求算法

是不是可以这样：  随机预先选择一个位置作为种子， 在其上下左右寻找最近距离的邻居，  然后根据一个随机预设的deltaX/deltaY来判断该邻居是否可以视作同行或同列，循环迭代，得到一个划分；  然后调整deltaX/deltaY，又得到另外一种划分，在外层循环迭代，得不同的划分。  最后评估这些不同的划分，得出最优。  --- 但是数据点多了之后感觉运算量好大

后面这种的不合理，产生了多余的空洞。 像下面蓝色部分的

引用 5 楼 lelieven 的回复:惭愧，没明白楼主的意思！  不好意思， 可能是我没有把这个问题很好的表述出来。 最通俗的毕业， 类似于这样：  撒一把绿豆到桌面上， 在没有更多信息的条件下， 怎么把这些绿豆划分成合理的行和列。  例如对于如下：   可以划为：   也可以划成：   但合理的结果应该是第一种。

惭愧，没明白楼主的意思！

同楼上~~~~~

我也没看明白。

合理的行列，何为合理？

楼主的意思是想先把重复的数据删除吗？


Question: intel MKL中三角函数调用问题

好东西大家分享

感谢楼主分享。

谢谢分享

好东西大家分享


Question: 关于子函数里从键盘读入一个字符的问题

getchar（）也可输入回车。

引用 1 楼 user-4 的回复:因为留在输入缓冲区的回车键被getchar接收了 你在第一个getchar地方加上fflush(stdin)试试  刚刚百度输入缓冲区的时候产生一些疑问 1为什么输入缓冲区会留下回车键 2.getchar不是只读一个字符吗？而且不是遇到回车就结束吗？为什么会连续读两个 大一菜鸟 求解

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

楼上正解...


Question: TCP网络编程多个文件传输出错o(>﹏<)o

引用 4 楼 SKATE11 的回复:少年啊，千万要重视单步调试和设置断点， 用VC调试时记得按下Alt+5、Alt+6、Alt+7和Alt+8。   对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和 寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时 候。单步了 ··程序还是不会改

引用 1 楼 max_min_ 的回复:1 客户端connect 等于0的时候才是成功 2 服务端接收的时候定长循环接收,检查返回值是否匹配长度，然后再接收下一次的嗷 您好歹给你代码示例啊··

不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://topic.csdn.net/u/20120210/09/51109ed0-07b9-41f2-b487-a51597f2ca01.html


Question: linux中关于sigsuspend信号屏蔽函数的疑问

我专门帮你到内核里翻了一下。 你还是换个信号试一下吧，因为 static int sig_handler_ignored(void __user *handler, int sig) { 	/* Is it explicitly or implicitly ignored? */ 	return handler == SIG_IGN || 		(handler == SIG_DFL && sig_kernel_ignore(sig)); }  #define sig_kernel_ignore(sig) \ 	(((sig) < SIGRTMIN) && siginmask(sig, SIG_KERNEL_IGNORE_MASK))  #define SIG_KERNEL_IGNORE_MASK (\         rt_sigmask(SIGCONT)   |  rt_sigmask(SIGCHLD)   | \ 	rt_sigmask(SIGWINCH)  |  rt_sigmask(SIGURG)    )  默认情况下SIGWINCH是一个会被忽略的信号。 而忽略的信号 在信号根本投递不到目标进程中。 所以 你上面扯那么多其他的都没用了就。  PS  貌似你这个问题也发错区了吧。。。在C/C++区发这个问题 不合适的吧？


Question: 这个break 用得对吗？

这么久才来结贴，真是抱歉，因为我以为我没有未结贴的内容，而且有半个多月没有进来csdn。

有除法操作就要小心分母为0的情况

艾玛啊，丢人了，我错了。那个是分母，不是分子。也就是说0不能做除数。抱歉啊

if(oddcount != 0 && evencount !=0) 	{ 		printf("There are %d odds and the average is %f;" 		"and there are %d evens and the average is %d.\n", 		oddcount, (float)oddsum/oddcount, evencount, evensum/evencount); 	}

各位，是分子为0的情况。 在(float)oddsum/oddcount, evensum/evencount中，oddcount和eventcount可能为零， 建议在打印输出前，做一次检测。

break用法正常，你没有考虑到输入安全性问题，假如你输入的不是数字时候，会出现什么状况了。你可以去测试下这个问题。

break用的没有问题，至于代码是否达到你个人预期的那样，这个就看你自己的想法了。

先输入0后面输出里分母是0

什么意思？异常检查？  “另外，对于终止的条件是用break好， 还是在while条件里直接加上a!=0好？”  语义不同，while的语义是满足了条件后进入循环体代码  如果放在循环体里面，那么条件是scanf的返回值为1 如果放在条件里面，那么条件变成复合条件，看你感觉怎样表达的语义更好咯

引用 1 楼 u012210441 的回复:break没问题，但你要保证分母不为0！正解

break没问题，但你要保证分母不为0！


Question: 请写过骑士漫游算法的同学帮忙看一下，多谢

谢谢truelance。我居然问了一个200年前就证明正确的问题，:-)

这种类型的算法叫贪心算法, 在一般情况下是不能找到最优解的. 但是在象棋马中的这个贪心算法在将近200年前就已经被证明过是正确的.


Question: 求助source insight的注释是这样看不清怎么办？

View -> Draft View (Alt + F12)  Nice. This is the answer. Who can tell me why?

引用 8 楼 ForestDB 的回复:另外可以试试View -> Draft View (Alt + F12) 这个是对的

谢谢

注意观察细节。

引用 7 楼 stormier 的回复:[quote=引用 6 楼 ForestDB 的回复:] 为什么改“Comment Heading1”而不是改“Comment”？ 因为comment是这样[/quote] 注意图片上的sample，说明没有Verdana字体，sample显示很怪异，而前一张图Comment Heading1的字体是Arial，显示的sample就很正常，说明有Arial字体。

引用 8 楼 ForestDB 的回复:另外可以试试View -> Draft View (Alt + F12) 这个成功了，多谢呀！

另外可以试试View -> Draft View (Alt + F12)

引用 6 楼 ForestDB 的回复:为什么改“Comment Heading1”而不是改“Comment”？ 因为comment是这样

为什么改“Comment Heading1”而不是改“Comment”？

引用 3 楼 zhao4zhong1 的回复:手动设置一下选项中注释文字的字体 同上

引用 2 楼 derekrose 的回复:1楼...  在setting里面修改font 没找到setting 在这里点done没用

手动设置一下选项中注释文字的字体

1楼...  在setting里面修改font

英文的，好的老外都这种风格的注释


Question: 新手编程出现关于fork（）的小问题

求解答啊求解答

1 因为这个时候套接字进入的是半关闭状态，也就是主动关闭的一方进去了TIME_WAIT状态，   中间有2MSL时间的，可以通过setsockopt函数设置下REUSEADDR 地址服用！ 2 没看到你S端怎么发送消息的！  -------------主动关闭的那一方，换个端口也可以

int setsockopt(int s,int level,int optname,const void * optval,,socklen_toptlen); 函数说明  setsockopt()用来设置参数s所指定的socket状态。参数level代表欲设置的网络层，一般设成SOL_SOCKET以存取socket层。参数optname代表欲设置的选项，有下列几种数值: SO_DEBUG 打开或关闭排错模式 SO_REUSEADDR 允许在bind（）过程中本地地址可重复使用 SO_TYPE 返回socket形态。 SO_ERROR 返回socket已发生的错误原因 SO_DONTROUTE 送出的数据包不要利用路由设备来传输。 SO_BROADCAST 使用广播方式传送 SO_SNDBUF 设置送出的暂存区大小 SO_RCVBUF 设置接收的暂存区大小 SO_KEEPALIVE 定期确定连线是否已终止。 SO_OOBINLINE 当接收到OOB 数据时会马上送至标准输入设备 SO_LINGER 确保数据安全且可靠的传送出去。 参数  optval代表欲设置的值，参数optlen则为optval的长度。 返回值  成功则返回0，若有错误则返回-1，错误原因存于errno。 附加说明  EBADF 参数s并非合法的socket处理代码 ENOTSOCK 参数s为一文件描述词，非socket ENOPROTOOPT 参数optname指定的选项不正确。 EFAULT 参数optval指针指向无法存取的内存空间


Question: 求助：linux进程中调用system函数启动另外一个程序的问题

怎么用了fork还用system

引用 4 楼 zhao4zhong1 的回复:不要企图优雅的结束（因为这是不可能办到的） 而要在烂的不能再烂的摊子上也能重整河山！ Elegant finish is impossible while we should build a new world on rubbish

引用 5 楼 u013286150 的回复:[quote=引用 2 楼 max_min_ 的回复:] system是开启新的进程的！不会继承远进程里的任何东西！ 两个进程没有关系。只是当前进程会阻塞而已！ 从实际测试来看，确实是占用了。[/quote]  难道你不知道你的代码至少启动了4个进程？？？

system打开另外的程序，是阻塞式的吧。不会继承原进程的所有资源吧，fork会把原来复制一份出来。

上原始代码。

线程！！？？

引用 2 楼 max_min_ 的回复:system是开启新的进程的！不会继承远进程里的任何东西！ 两个进程没有关系。只是当前进程会阻塞而已！ 从实际测试来看，确实是占用了。

都fork了 还用啥system啊 fork后想执行个新程序 用exec啊。 exec那一族函数参数可以控制各种继承的东西。 你这个资源释放问题 不是system()造成的。


Question: 关于数据溢出问题

004119AD  mov         byte ptr [ebp-11h],7Fh  004119B1  movsx       eax,byte ptr [ebp-11h]  004119B5  mov         esi,esp  004119B7  push        eax   004119B8  push        offset string "a = %d\n" (417724h)  004119BD  call        dword ptr [__imp__printf (41A310h)]  004119C3  add         esp,8   看编译器汇编，直接取了低地址一个BYTE

溢出了，肯定就先转化，然后再截取了

引用 1 楼 u012997273 的回复:恩，的确是，int -129  = 0FFFFFF7F 赋值给char a 的时候，截断为0x7F 0x7F就是127了 0xFFFFFF7F

%d输出，那么它会把a的值隐式提升为int类型；首先，char类型的a变量标识不了-129即会截断！然后，截断后数据在隐式提升为int类型！

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）


Question: C语言fseek函数,返回值总是-1,继续执行结果正确.求解...

我错了 是代码逻辑有问题.

引用 7 楼 luoyihu 的回复:[quote=引用 6 楼 zmlovelx 的回复:] fp有问题，可能文件没有被打开成功， fp值不正确 等。  我打开文件的时候,判断是否打开成功了. 我如果不管fseek的返回值,继续往下执行,是可以得到正确结果的.[/quote] 你使用一楼的 fseek(fp, 0L, SEEK_SET) 后仍然是出现现在的错误吗? 把完整的打开文件的代码和对文件的操作代码贴一下

引用 6 楼 zmlovelx 的回复:fp有问题，可能文件没有被打开成功， fp值不正确 等。  我打开文件的时候,判断是否打开成功了. 我如果不管fseek的返回值,继续往下执行,是可以得到正确结果的.

fp有问题，可能文件没有被打开成功， fp值不正确 等。

等待错误原因。没遇到这个错误呢。

char *strerror(int errnum);      printf("%s\n",strerror(errno)) 或者直接perror("Error\n")

引用 1 楼 zmlovelx 的回复:fseek(fp, 0L, SEEK_SET)    另外查下errno什么错误。   errno=9 Bad file number   这是什么原因造成的呀?

引用 1 楼 zmlovelx 的回复:fseek(fp, 0L, SEEK_SET)    另外查下errno什么错误。   怎么没把errno中的错误,复制到一个字符数组里面呀?谢谢.

fseek(fp, 0L, SEEK_SET)    另外查下errno什么错误。


Question: 数据结构之一元多项式求值，求牛人解答

最讨厌把代码都贴上来了......


Question: Windows下获取已知目录下的所有文件夹的名字

引用 5 楼 N_sev7 的回复:[quote=引用 4 楼 user-1 的回复:] The WIN32_FIND_DATA structure describes a file found by the FindFirstFile, FindFirstFileEx, or FindNextFile function.   typedef struct _WIN32_FIND_DATA { // wfd      DWORD dwFileAttributes;      FILETIME ftCreationTime;      FILETIME ftLastAccessTime;      FILETIME ftLastWriteTime;      DWORD    nFileSizeHigh;      DWORD    nFileSizeLow;      DWORD    dwReserved0;      DWORD    dwReserved1;      TCHAR    cFileName[ MAX_PATH ];      TCHAR    cAlternateFileName[ 14 ];  } WIN32_FIND_DATA;    Members dwFileAttributes  Specifies the file attributes of the file found. This member can be one or more of the following values: Attribute Meaning  FILE_ATTRIBUTE_ARCHIVE The file or directory is an archive file or directory. Applications use this attribute to mark files for backup or removal.  FILE_ATTRIBUTE_COMPRESSED The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories.  FILE_ATTRIBUTE_DIRECTORY The handle identifies a directory.  FILE_ATTRIBUTE_ENCRYPTED The file or directory is encrypted. For a file, this means that all data streams are encrypted. For a directory, this means that encryption is the default for newly created files and subdirectories.  FILE_ATTRIBUTE_HIDDEN The file or directory is hidden. It is not included in an ordinary directory listing.  FILE_ATTRIBUTE_NORMAL The file or directory has no other attributes set. This attribute is valid only if used alone.  FILE_ATTRIBUTE_OFFLINE The file data is not immediately available. Indicates that the file data has been physically moved to offline storage.  FILE_ATTRIBUTE_READONLY The file or directory is read-only. Applications can read the file but cannot write to it or delete it. In the case of a directory, applications cannot delete it.  FILE_ATTRIBUTE_REPARSE_POINT The file has an associated reparse point.  FILE_ATTRIBUTE_SPARSE_FILE The file is a sparse file.  FILE_ATTRIBUTE_SYSTEM The file or directory is part of the operating system or is used exclusively by the operating system.  FILE_ATTRIBUTE_TEMPORARY The file is being used for temporary storage. File systems attempt to keep all of the data in memory for quicker access, rather than flushing it back to mass storage. A temporary file should be deleted by the application as soon as it is no longer needed. 我去 考我英语呢  好吧 [/quote] FILE_ATTRIBUTE_DIRECTORY The handle identifies a directory.

引用 4 楼 user-1 的回复:The WIN32_FIND_DATA structure describes a file found by the FindFirstFile, FindFirstFileEx, or FindNextFile function.   typedef struct _WIN32_FIND_DATA { // wfd      DWORD dwFileAttributes;      FILETIME ftCreationTime;      FILETIME ftLastAccessTime;      FILETIME ftLastWriteTime;      DWORD    nFileSizeHigh;      DWORD    nFileSizeLow;      DWORD    dwReserved0;      DWORD    dwReserved1;      TCHAR    cFileName[ MAX_PATH ];      TCHAR    cAlternateFileName[ 14 ];  } WIN32_FIND_DATA;    Members dwFileAttributes  Specifies the file attributes of the file found. This member can be one or more of the following values: Attribute Meaning  FILE_ATTRIBUTE_ARCHIVE The file or directory is an archive file or directory. Applications use this attribute to mark files for backup or removal.  FILE_ATTRIBUTE_COMPRESSED The file or directory is compressed. For a file, this means that all of the data in the file is compressed. For a directory, this means that compression is the default for newly created files and subdirectories.  FILE_ATTRIBUTE_DIRECTORY The handle identifies a directory.  FILE_ATTRIBUTE_ENCRYPTED The file or directory is encrypted. For a file, this means that all data streams are encrypted. For a directory, this means that encryption is the default for newly created files and subdirectories.  FILE_ATTRIBUTE_HIDDEN The file or directory is hidden. It is not included in an ordinary directory listing.  FILE_ATTRIBUTE_NORMAL The file or directory has no other attributes set. This attribute is valid only if used alone.  FILE_ATTRIBUTE_OFFLINE The file data is not immediately available. Indicates that the file data has been physically moved to offline storage.  FILE_ATTRIBUTE_READONLY The file or directory is read-only. Applications can read the file but cannot write to it or delete it. In the case of a directory, applications cannot delete it.  FILE_ATTRIBUTE_REPARSE_POINT The file has an associated reparse point.  FILE_ATTRIBUTE_SPARSE_FILE The file is a sparse file.  FILE_ATTRIBUTE_SYSTEM The file or directory is part of the operating system or is used exclusively by the operating system.  FILE_ATTRIBUTE_TEMPORARY The file is being used for temporary storage. File systems attempt to keep all of the data in memory for quicker access, rather than flushing it back to mass storage. A temporary file should be deleted by the application as soon as it is no longer needed. 我去 考我英语呢  好吧

BOOL FindNextFile(   HANDLE hFindFile,  // handle to search   LPWIN32_FIND_DATA lpFindFileData                       // pointer to structure for data on found file );  这个lpFindFileData里面有文件属性  用作判断

引用 1 楼 user-1 的回复:FindFirstFile   FindNextFile  然后筛选 只需要当前目录下的   文件夹   的名字 貌似这个函数是得到文件的名字  然后根据后缀筛选？？？

FindFirstFile   FindNextFile  然后筛选


Question: 请教如果给数组快速赋一个最大值？

引用 12 楼 damo_xu 的回复:[quote=引用 1 楼 baichi4141 的回复:] int * pI = arr; int * pE = arr + sizeof(arr)/sizeof(arr[0]); while( pI != pE ) *( pI++ ) = INT_MAX;  这代码貌似就是一个循环，给内存赋值，我若这样写似乎没什么区别：  for (int i=0; i<100; ++i) *( arr+i ) = INT_MAX;  您的这样写优化到哪里？求教了，多谢。 各位：纯粹写代码为了玩，不考虑编译器优化或者实用性。[/quote]他这个就是为了当你调整数组大小，不用改这一块代码，只需要改声明的地方。 通常在基础函数中这样，也算是比较好的习惯。当然，得看是什么项目需求了，如果是追求高效率的，不一定这样

引用 11 楼 rogone 的回复:[quote=引用 10 楼 damo_xu 的回复:] [quote=引用 8 楼 rogone 的回复:] int arr[100] = INT_MAX;//c++ style 目测楼主需要的是编译优化，在编译期确定初始值  兄弟，这个语句应该是给第100个赋值，前99个还没赋吧？[/quote] 你应该说“兄弟，这个语句应该是给第100 + 1个赋值，前99 + 1个还没赋吧？” C++的数组初始化就是这样写的，我记得C语言还不支持数组初始化[/quote]  哦，你原来是这个意思。 第一个问题，我错了。呵呵，哥们连数组最后一位应该减一也忘了！看来，是该拾起来的时候了。 第二个问题，你的这个C++给数组赋值应该没有这个语法。现在的编译器，应该都是给数组默认赋值的。而且我刚刚在VC9里debug测试了，你这个语句对数组内存没有作用。

引用 1 楼 baichi4141 的回复:int * pI = arr; int * pE = arr + sizeof(arr)/sizeof(arr[0]); while( pI != pE ) *( pI++ ) = INT_MAX;  这代码貌似就是一个循环，给内存赋值，我若这样写似乎没什么区别：  for (int i=0; i<100; ++i) *( arr+i ) = INT_MAX;  您的这样写优化到哪里？求教了，多谢。 各位：纯粹写代码为了玩，不考虑编译器优化或者实用性。

引用 10 楼 damo_xu 的回复:[quote=引用 8 楼 rogone 的回复:] int arr[100] = INT_MAX;//c++ style 目测楼主需要的是编译优化，在编译期确定初始值  兄弟，这个语句应该是给第100个赋值，前99个还没赋吧？[/quote] 你应该说“兄弟，这个语句应该是给第100 + 1个赋值，前99 + 1个还没赋吧？” C++的数组初始化就是这样写的，我记得C语言还不支持数组初始化

引用 8 楼 rogone 的回复:int arr[100] = INT_MAX;//c++ style 目测楼主需要的是编译优化，在编译期确定初始值  兄弟，这个语句应该是给第100个赋值，前99个还没赋吧？

多谢众位的回复。哥们快2年没编程了（原来可是我的唯一，哈哈）。现在年前得空，想把排序再玩一遍。只是觉得赋值应该有个既快又简洁的函数，类似memset的。  既然各位大拿都说了，还是用循环吧。如果实际的项目，确实要考虑编译器优化。  多谢了。

引用 3 楼 max_min_ 的回复:memset的本身效率也是不高的！ 如果在循环体中，也是不建议使用的！  有其它更高效的做法吗? 不使用循环.  楼主还是老实的使用循环吧, 即使是memset内部, 也是用的循环来做的.

楼主没有必要苛求效率到赋值一块

循环赋值呗，你觉得怎么才叫快速

引用 17 楼 zhao4zhong1 的回复:#include <stdio.h> int arr[100]; int main() {     int i;     __asm {         push ecx         push edi         mov eax,0x7FFFFFFF         mov ecx,100         mov edi,offset arr[0]         rep stosd         pop edi         pop ecx     }     for (i=0;i<100;i++) printf("%03d,%d\n",i,arr[i]);     return 0; }   汇编？呵呵，这个就不懂了。

memset的本身效率也是不高的！ 如果在循环体中，也是不建议使用的！

引用 1 楼 baichi4141 的回复:int * pI = arr; int * pE = arr + sizeof(arr)/sizeof(arr[0]); while( pI != pE ) *( pI++ ) = INT_MAX;  说实话, 这种优化价值不大, 现代编译器的优化完全可以取代这种手工优化. LZ不要在这种问题上花太多时间.

这种根本就不算优化。

引用 7 楼 zhuobattle 的回复:如果对性能确实有较高要求，内存都是对齐的，可以用MMX,SSE2指令，肯定比编译器编出来的代码快很多 这也仅仅是针对特定CPU的优化, 使用特定的编译器就可以支持这种优化, 比如ICC

#include <stdio.h> int arr[100]; int main() {     int i;     __asm {         push ecx         push edi         mov eax,0x7FFFFFFF         mov ecx,100         mov edi,offset arr[0]         rep stosd         pop edi         pop ecx     }     for (i=0;i<100;i++) printf("%03d,%d\n",i,arr[i]);     return 0; } //000,2147483647 //001,2147483647 //002,2147483647 //003,2147483647 //004,2147483647 //005,2147483647 //006,2147483647 //007,2147483647 //008,2147483647 //009,2147483647 //010,2147483647 //011,2147483647 //012,2147483647 //013,2147483647 //014,2147483647 //015,2147483647 //016,2147483647 //017,2147483647 //018,2147483647 //019,2147483647 //020,2147483647 //021,2147483647 //022,2147483647 //023,2147483647 //024,2147483647 //025,2147483647 //026,2147483647 //027,2147483647 //028,2147483647 //029,2147483647 //030,2147483647 //031,2147483647 //032,2147483647 //033,2147483647 //034,2147483647 //035,2147483647 //036,2147483647 //037,2147483647 //038,2147483647 //039,2147483647 //040,2147483647 //041,2147483647 //042,2147483647 //043,2147483647 //044,2147483647 //045,2147483647 //046,2147483647 //047,2147483647 //048,2147483647 //049,2147483647 //050,2147483647 //051,2147483647 //052,2147483647 //053,2147483647 //054,2147483647 //055,2147483647 //056,2147483647 //057,2147483647 //058,2147483647 //059,2147483647 //060,2147483647 //061,2147483647 //062,2147483647 //063,2147483647 //064,2147483647 //065,2147483647 //066,2147483647 //067,2147483647 //068,2147483647 //069,2147483647 //070,2147483647 //071,2147483647 //072,2147483647 //073,2147483647 //074,2147483647 //075,2147483647 //076,2147483647 //077,2147483647 //078,2147483647 //079,2147483647 //080,2147483647 //081,2147483647 //082,2147483647 //083,2147483647 //084,2147483647 //085,2147483647 //086,2147483647 //087,2147483647 //088,2147483647 //089,2147483647 //090,2147483647 //091,2147483647 //092,2147483647 //093,2147483647 //094,2147483647 //095,2147483647 //096,2147483647 //097,2147483647 //098,2147483647 //099,2147483647 //

引用 14 楼 xinhua0910 的回复:他这个就是为了当你调整数组大小，不用改这一块代码，只需要改声明的地方。 通常在基础函数中这样，也算是比较好的习惯。当然，得看是什么项目需求了，如果是追求高效率的，不一定这样  哦，多谢了。我通常把数组100 define 成 N，到时候改N值。 他这种写法的确不错。

引用 7 楼 zhuobattle 的回复:如果对性能确实有较高要求，内存都是对齐的，可以用MMX,SSE2指令，肯定比编译器编出来的代码快很多 +1 其他方法貌似都不能起到性能的要求


Question: 用断言好还是if语句？

引用 9 楼 lm_whales 的回复:防御性编程…不是我的发明创造 只是，为了保证代码安全，为了代码代码的健壮性采取的一种措施。 我们有时会自发的这么处理，不过自觉处理可能更好。  防御性编程，就是预防程序； 因为处理不了，而放任代码出错，采取的措施。  比如 你的程序可以处理3种正常情况； 而你的参数，外部变量，等；可能会出现3种正常情况以外的，异常情况  这些没有处理的情况，在调试的时候，可以采用断言处理。  但是发布版，断言不起作用； 要保证程序，不会因为异常情况出错；  就可以用if 语句，把额外的情况排除掉；  在下面正式处理的代码中，就不会再出现例外的情况，从而排除了异常； 可以按照，正常逻辑，直接编写了代码。了解…

两者没任何关系

去看《编程精粹》

C安全编码标准.pdf 编写安全的C,C++代码 等

推荐看看这本书 编写安全的代码(write secure code.pdf英文版)

引用 2 楼 lm_whales 的回复:断言是用于调试的 有了断言，可以再加if语句，做防御编程处理，以策代码安全。 不考虑代码安全，只加上断言，就可以了。  另外断言，实际上也是一种文档。 断言设定了，函数的入口条件。增加了代码的可读性。  所以能加断言，还是尽量加的好。第一次听到防御性编程…

引用 4 楼 lin5161678 的回复:用户输入之类 无法掌控的 用if 比如说 除法计算的时候 除0 错误  这种情况一般用if 处理  能自己掌控的  能确定运行到这里  这个参数必然是有效 用断言  比如 空指针 [一般没有用户操作生成一个指针传递给你的函数吧]  或者换一种说法  发布之后 仍然需要进行判断的用if  发布之后 可以不进行检查的用断言了解

引用 5 楼 fuxiang 的回复:断言用于在开发阶段监测BUG，进行调试。 其存在的意义在于检测代码在开发过程中是否出现了问题。  而"if... ",更准确的说是错误处理，是在你的release版本中实实在在应该有的，处理程序运行过程中产生的错误并进行处理，以提高程序的健壮性。  对于在开发过程中的程序员来说，加断言是个好习惯，可以帮助调试。明白了

首先要分清 流程控制和测试目的的区别

if是实的，真正的增加代码量，降低执行效率；而断言是虚的，在Debug的时候可以帮助调试，在Release的时候并不存在。  引用 楼主 explorer8 的回复:感觉断言的功能，可以用if语句来对异常情况进行的处理来代替。那这样，断言还有什么意义吗？


Question: 主进程中修改子线程的参数不成功

谢谢各位，发现问题了。是由于共享内存的问题。

在板子上可能在主线程未修改之前就已经反馈到子线程了 之后主线程才修改的！ 这两个线程加锁处理了呢？或者再获取一次试试？

得看两个线程谁先处理这个数据吧，也不一定是系统的问题

贴出一些代码吧，从你的描述上感觉不出问题的所在！


Question: 本人用C语言重写的一款冒险游戏，求大家支持！

只想问一下，5k多行为什么有这么大

回3楼？不能运行？我当然测试过的，Windows系统应该没问题，我在贴吧开过试玩帖，有上百人回复我，没有人提过不能运行呀 （LINUX可能无法运行）  贴吧试玩帖传送门： http://tieba.baidu.com/p/2776066674

运行的平台和需要把需要那些库或者支持软件呢？！！！

程序无法运行，发言完毕

不错，支持下，感谢分享

恩，要积分的


Question: 如何提升自己的C水平?

请高手推荐基本源代码分析的C语言方面的书

eclipse 下比较好的调试C 的插件是什么

要经常自己动手调试，多看别人编的程序进行比较

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文 字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针 的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  进程都退出了，输入缓冲区刷不刷新都无关痛痒。  不要企图优雅的结束（因为这是不可能办到的） 而要在烂的不能再烂的摊子上也能重整河山！  这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。 常立志不如立长志，立长志不如立即干！  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。   （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

引用 11 楼 dsoyy 的回复:硬件也要写程序，简单地是单片机，ARM,DSP,复杂的LINUX等，不光是电路，模拟和数字，程序也要回。 不过都不够精。  引用 10 楼 zmlovelx 的回复:软硬通吃不错。  抵触可能是因为没有兴趣，没兴趣想提升比较难吧。 这是要搞底层驱动的节奏？

引用 6 楼 cheng7068 的回复:多实践多看书，理论结合实践，项目结合学习，进步应该会很快+1

个人感觉，在使用过程中学习最快。最好是找点相关的工作边做边学。

软硬通吃不错。  抵触可能是因为没有兴趣，没兴趣想提升比较难吧。

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

做硬件的，对于C语言的算法要求的不是很高吧。我是做软件的，对做硬件的C语言要求不是很高吧~~~

其实看代码才是迅速提高自己水平的最佳方法，没有之一

多实践多看书，理论结合实践，项目结合学习，进步应该会很快

先从不抵触开始。  学习，然后改善。

要求的功能一般情况都没问题，但是代码的好不好，明眼人一看就知道了  这是要改变的

改变自己，然后坚持下去！  引用 楼主 dsoyy 的回复:大家好，自我介绍一下，硬件工程师，暂时在做软件，C也用了很多年，一般功能都能实现，看代码的时候不愿意多看。 总觉得这么多年C的水平没有提升，还是仅仅限于功能的实现，没有什么算法，也没有考虑优化，这两天看公司的代码在不情愿的抵触情绪中，也人知道自己水平的欠缺，想进一步提升，争取上一个台阶，请大家指点，不吝赐教，各抒己见。

支持楼主，个人觉得C语言本身没什么学的，关键是在一个平台上应用，也就是说C的具体应用才是重要的，勿喷！

你能突破自己不断进步就会不断提升了，你自己说的看代码不想多看，那么你必须学会看代码， 突破自己这样才能提高啊，不突破永远在原地了


Question: ping "www.baidu.com"

引用 2 楼 ForestDB 的回复:LZ想多了，不要上来就内核什么的。  gethostbyname解决了,的确和内核不相关,帖子只是一个最边的猜想,少了libnss_dns

LZ想多了，不要上来就内核什么的。  gethostbyname

man 3 gethostbyname


Question: C语言 简单DP

引用 2 楼 edwardvsnc 的回复:如果不要求连续的话，我觉得可以用前k大数来求， 背包应该也能做， 但我能想出的状态方程都比上面这个算法的复杂度要高。  价值和重量 相同。容量为lim。 dp[i]=dp[i-1]+pay[i]; 感觉还可以吧。 不知道什么是前K大数

引用 6 楼 M173475237 的回复:[quote=引用 4 楼 uuuououlcz 的回复:] [quote=引用 1 楼 uuuououlcz 的回复:] 考虑： 假设数组为a[],长度为n，f(i)表示以元素a[i]为结尾的不大于limit的最大和，则  f(0）= a[0] > limit ? 0 : a[0]; if(a[i] > 0 && f(i-1)+a[i] <= limit) f(i) = f(i-1)+a[i]; else f(i) = f(i-1);  另外，由于f(i)仅与f(i-1)有关，我们没有必要保存所有的f(i)  以上所述，不保证正确，更不保证最优，抛砖引玉，仅供参考  突然想起来，如果数组中的元素如果都是非正数，则要另外考虑~~~[/quote]  那个。。请问这个f()是什么意思？[/quote]  说了呀，f(i)表示以元素a[i]为结尾的不大于limit的最大和

引用 4 楼 uuuououlcz 的回复:[quote=引用 1 楼 uuuououlcz 的回复:] 考虑： 假设数组为a[],长度为n，f(i)表示以元素a[i]为结尾的不大于limit的最大和，则  f(0）= a[0] > limit ? 0 : a[0]; if(a[i] > 0 && f(i-1)+a[i] <= limit) f(i) = f(i-1)+a[i]; else f(i) = f(i-1);  另外，由于f(i)仅与f(i-1)有关，我们没有必要保存所有的f(i)  以上所述，不保证正确，更不保证最优，抛砖引玉，仅供参考  突然想起来，如果数组中的元素如果都是非正数，则要另外考虑~~~[/quote]  那个。。请问这个f()是什么意思？

引用 3 楼 wusuopuBUPT 的回复:仅供参考： #include<stdio.h> #define LIMIT 10  int result(int i, int *a, int lim); int max(int a, int b);  int main() { 	int a[] = { 1, 4, 11, 7, 8 };  	int n = result(0, a, LIMIT); 	printf("result=%d\n", n); 	return 0; }  int result(int i, int a[], int lim) { 	if(i == 4) { /*array length - 1*/ 		return a[i] <= lim ? a[i] : 0; 	} 	else { 		if(a[i] > lim) { 			return result(i+1, a, lim); 		} 		else { 			return max(result(i+1, a, lim), a[i]+result(i+1, a, lim-a[i])); 		} 	} }  int max(int a, int b) { 	return a >= b ? a : b; }  ACM果然不能随便用递归。。果断超时了。。

引用 1 楼 uuuououlcz 的回复:考虑： 假设数组为a[],长度为n，f(i)表示以元素a[i]为结尾的不大于limit的最大和，则  f(0）= a[0] > limit ? 0 : a[0]; if(a[i] > 0 && f(i-1)+a[i] <= limit) f(i) = f(i-1)+a[i]; else f(i) = f(i-1);  另外，由于f(i)仅与f(i-1)有关，我们没有必要保存所有的f(i)  以上所述，不保证正确，更不保证最优，抛砖引玉，仅供参考  突然想起来，如果数组中的元素如果都是非正数，则要另外考虑~~~


Question: 据说答对的都不是纯粹的工科生，C语言版提前祝大家新年愉快！

几号车位 就是 87 车体挡住了什么 就是 L8

好吧  我投降了

引用 8 楼 max_min_ 的回复: 表示不懂是啥意思！+1

反着看，87

87倒过来  没能在20s内看出来

智商捉急呀，

呵呵呵

LZ,卷子拿反了

角立起来的无穷大

87~，这不就是倒过来看？

我很怀疑我的智商了。。。

我是来接分的。


Question: 太奇怪了，为啥两个结果不同

我在VS2010上写是这样的，版主可以试试

。。。25？  很难想象

引用 29 楼 zxj10620 的回复:[quote=引用 28 楼 lin5161678 的回复:] [quote=引用 27 楼 lm_whales 的回复:] 虽然是未定义行为，但是 debug 和 Release 结果不同，也应该是Bug 未定义行为就可以出现 同一个编译器 结果不同结果的现象  不是编译器的BUG 好嘛  [/quote] 再请教一下，我还不是太明白，那个j值为什么会是未定义行为呢？[/quote] 因为在Debug下一般没有优化，所有的步骤都是一步步来的。对于变量i，它在做右移的时候可能会先判断是否大于32，如果大于32则取该数膜，然后再进行右移。 但是对于Release下，编译器会进行优化，它会去掉它认为毫无意义的步骤，在编译期前就会直接把i替换成34。所以j=100%i，实际上就是100%34，所以结果会变成0。  当然，对于常量右移时是否进行取膜，也要看编译器实现。不过一般能在编译期间确定的事，编译器就不会拿到运行期进行操作。而编译期间一般是不会分步骤去执行，所以取膜过程也没有进行。所以100%34只会是0，而100%i，则要看是否进行了优化，这样就有两个结果，这就是一个典型的不确定行为。

常量折叠，不能算优化 const int a =10;  int *p=&a;  *p=100;  printf("a =%d,*p=%d",a,*p); //有些编译器，输出 10，100；不知是不是所有编译器，都这么处理。  a = 10 ，是所谓的常量折叠。这只是编译器，保证常量正确的手段，不能算优化。  常量代换，才是优化  int shift(int x,int y){     return x >> y;      // x 替换成常量100，y 替换成常量34， 计算结果为0      //结果是这里生成 xor eax,eax          //相当于mov eax, 0   }  int main(){ int x=100,i=34; cout<<(x>>i)<<endl; }

引用 28 楼 lin5161678 的回复:[quote=引用 27 楼 lm_whales 的回复:] 虽然是未定义行为，但是 debug 和 Release 结果不同，也应该是Bug 未定义行为就可以出现 同一个编译器 结果不同结果的现象  不是编译器的BUG 好嘛  [/quote] 好吧！

编译器看到 i 只在 100>>i 这个地方用了，就直接将 i 优化成34了。

楼上有人说debug和release版结果不同，那是因为release版做优化了，debug版会尽量不优化。

首先说第二个，100>>34，两边都是立即数，编译器直接优化了，所以结果是0. 第一个：int i = 34; 100>>i 此时 i 是变量，编译器无法优化，只能在运行时依照标准来，将i的值与上一个掩码：cpu位数 - 1，即：32位上是 i & 31 ，取 i 的低 5 位。也就是说当 i 的值是 34 时，在32位机器上实际上 100>>i 变成了 100>>2.

引用 28 楼 lin5161678 的回复:[quote=引用 27 楼 lm_whales 的回复:] 虽然是未定义行为，但是 debug 和 Release 结果不同，也应该是Bug 未定义行为就可以出现 同一个编译器 结果不同结果的现象  不是编译器的BUG 好嘛  [/quote] 再请教一下，我还不是太明白，那个j值为什么会是未定义行为呢？

引用 27 楼 lm_whales 的回复:虽然是未定义行为，但是 debug 和 Release 结果不同，也应该是Bug 未定义行为就可以出现 同一个编译器 结果不同结果的现象  不是编译器的BUG 好嘛

引用 19 楼 lin5161678 的回复:[quote=引用 17 楼 lm_whales 的回复:] #include <iostream> using namespace std; int shiftConst(int x){ 	return x>>34; }  int shiftVar(int x,int i){ 	return x>>i; }  int main() { 	int i=34; 	int x=100; 	cout<<(100>>34)<<endl; 	cout<<(100>>i)<<endl;  	cout<<shiftConst(x)<<endl; 	cout<<shiftVar(x,i)<<endl; 	cin.get(); 	return 0; } release : 0       //直接用常量计算，这个结果是编译器，自己算出来的。  0       //常量代换，结果相当于，直接用常量计算，这个结果是编译器，自己算出来的。 0       //常量代换，结果相当于，直接用常量计算，这个结果是编译器，自己算出来的。 0       //常量代换，结果相当于，直接用常量计算，这个结果是编译器，自己算出来的。  debug: 0         //直接用常量计算，这个结果是编译器，自己算出来的。 25        //有变量，应用程序计算出来的。   25        //有变量，应用程序计算出来的。  25        //有变量，应用程序计算出来的。  PS：  这应该是VC10 的Bug ,原因应该是， VC编译器的开发者，使用的编译器，没有按照 新编译器的方式处理这种计算，结果就是，用常量计算，按照开发新VC编译器的那个编译器（版本）的方法计算。 用变量计算，编译器生成，按照新编译器的方法，计算的代码。  结果常量表达式的计算结果，以及常量代换优化后的代码的结果，还是0；  使用变量计算的，不使用常量代换优化的代码，结果是25； 未定义行为被你说成是bug  编译器何其无辜  另外 编译期求值 / 运行期求值 直观一点 不是什么 编译器算 应用程序算[/quote]  虽然是未定义行为，但是 debug 和 Release 结果不同，也应该是Bug 编译期求值 / 运行期求值 只是术语而已，  编译期求值，不就是编译器把结果求出来，直接给出答案，编译生成的应用程序中，省略计算步骤吗？ 运行期求值，不就是编译器直接，生成计算代码，让应用程序自己去计算吗？  关键是英文术语原文，我不清楚。  现在同一个术语，有不同的翻译，真个是百花齐放； 在没有对照原文的时候，不清楚哪个更准确一点，有可能都翻译得不好。  所以，这种自己不能确定，是否翻译准确的术语，自然不用为好。 还是大白话来得实在。都能看懂。

一个是常量折叠，在编译时直接算的，一个是在运行时算的，由于34>32，属于未定义行为，所以两个结果都正常

同意是优化产生的差异，可以反汇编看看编译器做了什么。

一个是按照>>2来算的； 为0的结果应该是大于32，编译器直接优化掉了，可以关优化试试。

引用 6 楼 user-13 的回复:[quote=引用 5 楼 netbooting 的回复:] [quote=引用 3 楼 zxj10620 的回复:] 刚才在ubuntu下面也试了，也是一样的结果  又自己查了一下 结果如下链接： http://blog.csdn.net/wmda999/article/details/17032331  你给的链接都已经给出原因了。 当要移动的位大于实际位数时，实际移动的位是和编译器相关的。  100是int占32位，现在要移动34位，实际上只移动了34%32=2位，100>>2=25[/quote]  那么请问为嘛100>>34就变0了呢?[/quote]  100>>34是在编译阶段算出的为0，在输出时直接push 0，而100>>i是在运行时通过移位操作来完成的。

前一个，位移值只有最后5位起作用。 后一个，应该是被编译期优化掉了

不要深究大于位数的位移行为。  引用 楼主 zxj10620 的回复:int i = 34; int j = 100>>i; j的值为25  而 int i = 34; int j = 100>>34; j的值为0   求各位大大帮忙解答啊，困惑得不行

100右移7位的时候已经是0值了，如果右移很大的话编译时编译器已经告诉你：计数为负或过大，其行为未定义。所以不要纠结这个了，没有意义

引用 5 楼 netbooting 的回复:[quote=引用 3 楼 zxj10620 的回复:] 刚才在ubuntu下面也试了，也是一样的结果  又自己查了一下 结果如下链接： http://blog.csdn.net/wmda999/article/details/17032331  你给的链接都已经给出原因了。 当要移动的位大于实际位数时，实际移动的位是和编译器相关的。  100是int占32位，现在要移动34位，实际上只移动了34%32=2位，100>>2=25[/quote]  那么请问为嘛100>>34就变0了呢?

引用 3 楼 zxj10620 的回复:刚才在ubuntu下面也试了，也是一样的结果  又自己查了一下 结果如下链接： http://blog.csdn.net/wmda999/article/details/17032331  你给的链接都已经给出原因了。 当要移动的位大于实际位数时，实际移动的位是和编译器相关的。  100是int占32位，现在要移动34位，实际上只移动了34%32=2位，100>>2=25


Question: 算法+几何知识：两圆相交，有没有可能不能形成三角形？

不可能，三点不在一条直线上就可以形成三角形，如果相交的话三点必然不在同一条直线上，如果在一条直线上了那就是相切了

两个圆重合算不算它们相交呢？

你把相切，重合，视为相交的特殊情况，就会出现三点一线（相切），或者无数的交点（重合）情况，则此时，可能不构成三角形。 如果把相切，重合，看作和相交，截然不同的两种情况，则必然构成三角形。

不可能。 圆o1与圆o2相交 等价于 |r1-r2| < o1o2 < r1+r2 这不就是形成三角形的条件吗

跟算法有什么关系。。纯几何问题

不可能。 两圆相交，O1O2 < AO1 + AO2，这表示A一定不在圆心连线上，进而一定是三角形。

要说不构成四边形还有可能 空间圆么  三角形 三个不在同一条直线上的点就可以确定一条平面了  必然可以是个三角形


Question: 如何替换指定开头和结束字符串中间的字符串

引用 7 楼 aaadddzxc 的回复:哦  那个const char *lpszSource 参数写错了而已 不应该加const 不用在意 你的写法是正确的 就算你不写const，它依然是常量不可修改

常量字符串不能修改

查找+替换。

void func(char *lpszSource,const char *lpszStart, const char *lpszEnd,const char *lpszChange) {     if( lpszStart != NULL )         strcat(lpszSource, lpszStart);     if( lpszChange != NULL )         strcat(lpszSource, lpszChange);     if( lpszEnd != NULL )         strcat(lpszSource, lpszEnd); }

引用 1 楼 Automation_dmu 的回复:sprintf(lpsz,"%s%s%s",lpszSource,lpszChange,lpszEnd); +1

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！  #pragma comment(linker,"/SECTION:.rdata,RW") #include <stdio.h> #include <string.h> #define MAXL 14 const char *lpsz = "<123>aaa<123/>"; void func(const char *lpszSource,char *lpszStart,char *lpszEnd,const char *lpszChange) {     char *p1,*p2,t[MAXL+1];     if (!lpszSource || !lpszStart || !lpszEnd || !lpszChange) return;     p1=strstr(lpszSource,lpszStart);if (!p1) return;     p2=strstr(lpszSource,lpszEnd  );if (!p2) return;     _snprintf(t,MAXL,"%.*s%s%s",p1-lpszSource+strlen(lpszStart),lpszSource,lpszChange,p2);t[MAXL]=0;     strcpy((char *)lpszSource,t); } int main() {     printf("%s\n",lpsz);     func(lpsz,"<123>","<123/>","bbb");     printf("%s\n",lpsz);     strcpy((char *)lpsz,"<123><123/>");     printf("%s\n",lpsz);     func(lpsz,"<123>","<123/>","bbb");     printf("%s\n",lpsz);     return 0; } //<123>aaa<123/> //<123>bbb<123/> //<123><123/> //<123>bbb<123/> //


Question: 求助c代码优化

楼主，你自己没点想法吗？


Question: 求用C语言   字符串的加密解密源代码  求帮助

楼主的结帖率让人爱莫能助。

号是刚申请不久  新手   肯定给分得    你帮我完成  给你100


Question: 求教数组按照指定顺序排列算法

引用 7 楼 liuzihe1979 的回复:[quote=引用 1 楼 letian0805 的回复:] 居然妄想一趟循环排序。两两交换冒泡排序怎么可能一趟排好。而且你的题目也不清楚，不知道你是笔误还是题目就是这样。我想 按照顺序：{5,1,2,3,4,5,6,7}排列应该是 {8,1,2,3,4,5,6,7} 吧。 也就是将数组各元素移一个位置而已。  不好意思，确实是笔误 我的意思是初始数组存放的是：{1,2,3,4,5,6,7,8} 假设数组下标是从1开始的，那么想要通过两两交换，一趟循环使得数组按照指定的下标顺序比如8,1,2,3,4,5,6,7（或其他顺序）进行排列[/quote]  还是没明白楼主到底想干嘛

申请空间，一趟生成新数组，再一趟复制回原数组。最好一开始就使用动态数组，那么改变指针指向新数组即可，原来的释放丢弃...

引用 1 楼 letian0805 的回复:居然妄想一趟循环排序。两两交换冒泡排序怎么可能一趟排好。而且你的题目也不清楚，不知道你是笔误还是题目就是这样。我想 按照顺序：{5,1,2,3,4,5,6,7}排列应该是 {8,1,2,3,4,5,6,7} 吧。 也就是将数组各元素移一个位置而已。  不好意思，确实是笔误 我的意思是初始数组存放的是：{1,2,3,4,5,6,7,8} 假设数组下标是从1开始的，那么想要通过两两交换，一趟循环使得数组按照指定的下标顺序比如8,1,2,3,4,5,6,7（或其他顺序）进行排列

自己帮忙顶一个

其实是这样的，问题原本是指针数组地址的值进行重新排列，我利用数组的下标存储了地址的索引，得到排列的下标值后，想利用两两交换的方式将原来的地址值通过一趟排序的方式进行改变

我也没看明白题目

一趟循环当然可以解决问题，将多重循环改写成一重循环只是一个机械的转换技巧，除了降低代码可读性没有意义，也不会改变算法复杂度。

你的问题描述得不清楚。


Question: linux下C线程问题？？？？

我还以为是程序处理数据需要10s 左右的时间了

引用 5 楼 cfjtaishan 的回复:[quote=引用 1 楼 letian0805 的回复:] http是基于tcp协议的。对方没有关闭套接字的时候，如果没有数据而且你是阻塞模式的话，read会阻塞。你读完了文件后等待了10秒，可能是服务器端10秒后才关闭套接字，这个可能是服务器设置的10秒超时自动关闭。你应该用非阻塞IO来读取，用select或者epoll或者poll都可以。 这种情况是有可能的，不过也可能是你读取的数据太少了吧！一次读取1个字节吗？！！！[/quote]  所以建议他用非阻塞IO。这一次读一个字节，得多慢。

引用 1 楼 letian0805 的回复:http是基于tcp协议的。对方没有关闭套接字的时候，如果没有数据而且你是阻塞模式的话，read会阻塞。你读完了文件后等待了10秒，可能是服务器端10秒后才关闭套接字，这个可能是服务器设置的10秒超时自动关闭。你应该用非阻塞IO来读取，用select或者epoll或者poll都可以。 这种情况是有可能的，不过也可能是你读取的数据太少了吧！一次读取1个字节吗？！！！

阻塞在这里了。

read(sock, buff, 1) write(fd, buff, 1);  不卡么？


Question: 我写的一个小程序，运行后一直没有结果，来看看哦

1.fopen()必须和fclose()成对使用； 2.fscanf默认的结束符好像是以‘\n’.文件中的数据是一行一个值存储的么

记得close文件指针

楼主只是从文件中读取数据，又没有输出肯定看不到结果

首先应该判断文件是否打开成功（这个可能是成功的）；其次是要确定fscanf函数是否正确，即查看返回值；

请判断fscanf函数的返回值！

在init中加断点，单步运行，看哪里卡了


Question: 求助：手势密码算法题

一共就9个点，暴力搜索应该也行的吧，但是稍微观察一下，我们就能做一个不小的优化： （1）由对称性可知，所有合法的密码路径起点一共分为3种： 以1为首的合法的密码路径，与以3、7、9为首的合法路径个数相同，设个数为X 以2为首的合法的密码路径，与以4、6、8为首的合法路径个数相同，设个数为Y 以5为首的合法的密码路径，设个数为Z 则所有合法的密码路径个数Sum = 4X+4Y+Z （2）用搜索的方式确定总长度为Len的密码的下一个数字 用矩阵illegal[i][j]表示数字i与数字j(i != j)直接相连的合法与否，则不难得到1与3、1与7、1与9，2与8，4与6互联是不合法的 代码也不难写：  #include <cstdio>  bool used[10] = {0}; bool illegal[10][10] = {0};  void init() {     illegal[1][3] = true;     illegal[1][7] = true;     illegal[1][9] = true;     illegal[2][8] = true;     illegal[3][1] = true;     illegal[3][7] = true;     illegal[3][9] = true;     illegal[4][6] = true;     //link 5 with any other is legal     illegal[6][4] = true;     illegal[7][1] = true;     illegal[7][3] = true;     illegal[7][9] = true;     illegal[8][2] = true;     illegal[9][1] = true;     illegal[9][3] = true;     illegal[9][7] = true; } int dfs(int st, int remainLen) {     if(remainLen == 1) return 1;          int sum = 0;     used[st] = true; --remainLen;//mark used, decrease remaining length     for(int i = 1; i < 10; ++i){ //here it's not possible to link st to st         if(!used[i] && !illegal[st][i]) sum += dfs(i, remainLen);     }     used[st] = false;            //recover situation      return sum; } int howmany() {        int X = 0, Y = 0, Z = 0, len;          for(len = 2; len < 10; ++len) X += dfs(1, len);     for(len = 2; len < 10; ++len) Y += dfs(2, len);     for(len = 2; len < 10; ++len) Z += dfs(5, len);          return (X<<2) + (Y<<2) + Z; }  int main() {     init();     printf("%d legal passwords\n", howmany());          return 0; }   最后，以上所述并不保证正确，更不保证最优，抛砖引玉，仅供参考

int main() { 	const int p1[]={2,4,5,0}; 	const int p2[]={1,3,4,5,6,0}; 	const int p3[]={2,5,6,0}; 	const int p4[]={1,2,5,7,8,0}; 	const int p5[]={1,2,3,4,6,7,8,9,0}; 	const int p6[]={2,3,5,8,9,0}; 	const int p7[]={4,5,8,0}; 	const int p8[]={4,5,6,7,9,0}; 	const int p9[]={5,6,8,0}; 	const int *pp[]={p1,p2,p3,p4,p5,p6,p7,p8,p9}; 	bool pNotUsed[9]={true,true,true,true,true,true,true,true,true}; 	char pResult[10]; 	int i,iCount=0;  	for (i=0;i<9;i++) 	{ 		pNotUsed[i]=false; 		Enum(i,pp,pNotUsed,pResult,0,&iCount); 		pNotUsed[i]=true; 	}  	return 0 }  void Enum(int iThis,const int *pp[],bool pNotUsed[],char pResult[],int iLevel,int *pCount) { 	int i,n; 	 	pResult[iLevel]='1'+iThis; 	if (iLevel>0) 	{ 		(*pCount)++; 		pResult[iLevel+1]=0; 		printf("%d: %s\n",*pCount,pResult); 	} 	for (i=0;pp[iThis][i]>0;i++) 	{ 		n=pp[iThis][i]-1; 		if (pNotUsed[n]) 		{ 			pNotUsed[n]=false; 			Enum(n,pp,pNotUsed,pResult,iLevel+1,pCount); 			pNotUsed[n]=true; 		} 	} }


Question: C语言预编译问题，求大神指点

引用 6 楼 u013214580 的回复:[quote=引用 4 楼 dfgrgf 的回复:] [quote=引用 1 楼 turingo 的回复:] PRINT_A和B符号都是没有定义的，所以值默认都为0，==的关系是成立的。  但是如果在 printf("define A");下面添加一句printf("%d"，B);会提示错误；  error: ‘B’ undeclared (first use in this function) 一个是预编译，一个是变量[/quote] 能不能说的具体些，一楼说PRINT_A和B值默认都是0，这个正确吗？

引用 4 楼 dfgrgf 的回复:[quote=引用 1 楼 turingo 的回复:] PRINT_A和B符号都是没有定义的，所以值默认都为0，==的关系是成立的。  但是如果在 printf("define A");下面添加一句printf("%d"，B);会提示错误；  error: ‘B’ undeclared (first use in this function) 一个是预编译，一个是变量

引用 3 楼 dfgrgf 的回复:但是如果在 printf("define A");下面添加一句printf("%d"，B);会提示错误；  error: ‘B’ undeclared (first use in this function) 因为你的B不是代码中实际定义的变量，没有地址。。。。

#ifdef A

PRINT_A和B符号都是没有定义的，所以值默认都为0，==的关系是成立的。  引用 楼主 dfgrgf 的回复:#include <stdio.h> int main(void) {  #if PRINT_A == B   printf("define A");  #else   printf("not define A");  #endif  return 0; }  运行结果是，打印出：define A；  感觉很奇怪，求大神解释


Question: 编程，从键盘上输入一个小写字母，将其转化为大写字母

其实我觉得吧这种题目就是先将ASCII码表的对应的字符赋给一个一维数组,然后用循环语句进行查找，如果成功返回查找到的字符,否则返回错误!具体的代码我要测试一下,目前觉得还是可以的!

第五位为1或为0就是大小写的区分~~~

char ch = getch(); if (ch >= 'a' && ch <= 'z')     ch = ch - 'a' + 'A'; else     printf("Unexpected char\n");

char ch = getch();  /* 读入字母 */ ch &= ~(1 << 5);    /* 转为大写字母 */   引用 楼主 u012876050 的回复:编程，从键盘上输入一个小写字母，将其转化为大写字母

'a'->'A','a' - 32 == 'A'

这个表中 ASC非打印控制字符  怎么打出来？ALT+“小键盘上的数字键”什么也打不出啊！

先输入一个字符，判断是否为小写字符  是  则大小减去32输出 否  则丢弃重新输入

#include <stdio.h> #include <ctype.h>  int main() {    unsigned char ch;    while(1)    { 	   printf("输入一个字符:"); 	   scanf("%c",&ch);getchar(); 	   if(!isalpha(ch)) 	   { 		  puts("输入的不是字母！"); 		  continue; 		} 	   if(islower(ch)) 		 putchar(toupper(ch)); 	  putchar(10);    }           return 0; }

#include <stdio.h> void main() {    char ch;    printf("请输入一个字符：\n");    scanf("%c",&ch);    printf("其大写字符是：%c\n",ch-32); }

引用 2 楼 max_min_ 的回复:先输入一个字符，判断是否为小写字符  是  则大小减去32输出 否  则丢弃重新输入  考虑locale

引用 8 楼 u013235485 的回复:奇怪，没有回答使用 toupper的吗？  ++

包含γ→Γ吗？

奇怪，没有回答使用 toupper的吗？


Question: 输入两个字符相加后将其字符对应的数字相加后输出

楼上正解！每天回帖即可获得10分可用分

引用 2 楼 KenZhang1031 的回复:键盘输入时要按照你程序中写的scanf的格式，比如你写了scanf("%c%c",&x,&y)，那么两个字符中间是没有东西隔开的，直接输入"AB"，然后回车，那么x就等于A，y就等于B。如果中间加空格，写成scanf("%c %c",&x,&y)，那么你输入时也要空格，比如"A B"，如果用了逗号，你输入时也要输入逗号，比如写成scanf("%c,%c",&x,&y)，那么输入就要是"A,B"，格式要一致。+1

你输入的是 A 空格 B吧 A是65 space32 65+32=97


Question: vs2013中处理字符串，求助

引用 9 楼 oOo532200 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] #pragma warning(disable:4996) 这是解决根本问题的办法吗,如果这样,那为什么还要用这个gets_s,不如不做修改[/quote] 虽然假洋鬼子们都升级改用刀叉吃饭了，但我仍喜欢坚持用筷子吃饭。

char *gets_s(     char *buffer,    size_t sizeInCharacters ); 还是改回gets，警告就警告了。但这符合标准。

VS2012还能用非安全版本的，只不过每次都要warning很烦人。 strcpy_s在C程序下还是用三个参数 http://blog.csdn.net/johnny710vip/article/details/6681160 #include <stdio.h> #include <stdlib.h> #include <string.h>  int main() { 	char temp[81]; 	char *fname; 	printf_s("Enter your first name : "); 	gets_s(temp, 81); 	fname = (char *)malloc(strlen(temp) + 1); 	strcpy_s(fname, strlen(temp) + 1, temp); 	printf_s("%s", temp);  	system("pause"); 	return 0; } VS2012下编译通过

引用 13 楼 u012433862 的回复:不是符合不符合标准，是还回去程序不执行，编译不通过  #pragma warning(disable:4996)  别人都已经告诉你解决办法了，你为什么要无视呢？而且我记得你用gets虽然编译器报错，但同时编译器也会提示你可以通过上面这条命令禁掉这些错误，你都根本不用来求助。再者如果你坚持要用gets_s，那就应该百度下加了_s后函数怎么用，这些东西msdn里都有详细用法甚至例子。即使给你回帖的人里面都已经告诉你加上s后用法有区别，你还是选择性无视吗？ 至于标准，LS各位也提到了，这是微软自己弄出来的版本，不是标准库里的东西，其他平台不一定支持，以后如果要跨平台会有毛病，所以给你提的善意建议罢了。

不是符合不符合标准，是还回去程序不执行，编译不通过

_s，就是表示安全的意思,safety or security? 如5楼所说，_s的加上长度了，不会再去破坏缓冲区了

因为之前的一些strcpy, strcat等等函数可能会出现缓冲区溢出， 导致可能后面的堆或栈内存破坏。  所以为了减少这些问题，字符串函数开始推荐使用strcpy_s,strcat_s的函数，比如：  char pDest[8]; char pSrc[] = "abcdefjakfjdkafjadkfj"; strcpy(pDest, pSrc);//显然这里出错了，但不会马上crash，后面导致返回地址出错等问题 //改进后: strcpy_s(pDest,8, pSrc);//执行时直接这里出错，因为此函数知道你pDest只能最多接受8 //个字符，而pSrc明显超过了，所以问题就容易排查了  所我了解，VS2010之前对于这类函数调用还只是warning，但vs2012后，是直接报错了。

string.h....这个不会错的~就是用gets编译不能通过，用gets_s又提示参数不够，其他字符处理函数也一样呃，晕，好奇怪

看看你添加的头文件

.....这是错误截图，求助

右键选择“Properties->C/C++ | Preprocessor | Preprocessor Definitions”在后面添加“_CRT_SECURE_NO_DEPRECATE“ 就不会再警告了

引用 7 楼 zhao4zhong1 的回复:#pragma warning(disable:4996) 这是解决根本问题的办法吗,如果这样,那为什么还要用这个gets_s,不如不做修改

#pragma warning(disable:4996)

但是会报错...gets，以及处理字符串的函数，还有一些....在vs2013里不仅会编译报错unsafe~而且不能执行

你需用gets,这个警告不要理会


Question: 执行switch case 语句时，里面有句输入语句cin.getline(Cal,N)没有执行，求解？？

我把switch case语句去掉时，cin.getline语句又能正常运行啦，我只学过C语言，C++里面的cin语句都不清楚，去百度吧。。又看不明白，你帮帮我啊~~~

我加了这个，然后用回车结束，后面输出的时候，输出的是空的东西

getchar() ; //加一个这个，每次输入可能有一个回车符影响了

当我输入2的时候，它执行default：后面的语句，但是发现运行到cin的时候，它没让你输入就pass了。。。。何解啊？？


Question: codeblocks怎么无法实现函数，变量的跳转？

引用 1 楼 user-1 的回复:貌似不规范的代码不处理... int main() 引用 1 楼 user-1 的回复:貌似不规范的代码不处理... int main()谢谢你，大神啊，这都知道

貌似不规范的代码不处理... int main()


Question: 两者的区别

你看到的不同对于编译器而言没有区别

没有区别，不过上面的TAG，可以在数组定义里面使用： typdef struct QNode {     struct QNode *next; } QNode; 如果没有上面的TAG typdef struct {     如何表示next??? } QNode;

没有什么区别 ， 只是上面多了一个tags


Question: 求教一个简单的C语言自增问题

引用 4 楼 Adol1111 的回复:[quote=引用 3 楼 harold2007 的回复:] [quote=引用 2 楼 max_min_ 的回复:] 和你实际的编译环境有很大的关系吧！无须纠结了！ 看看这个http://bbs.csdn.net/topics/370153775 看了你给你的链接，这个竟然没有定论，我倒！[/quote] 不是没有定论，而是结论就是未确定行为，这是C/C++标准上写清楚的。 这样写本身就毫无意义，正式开发中写这种代码的程序员，应该第一个滚蛋。 写出人看不懂的，或者一句话要想半天才能看懂的代码的程序员，都是不合格的。 在写代码之前，应该先想想，你自己能否看懂。运行前能够看着代码猜测自己写的代码是什么结果，运行后能否符合预期结果。不要运行前就无法确定，运行后还是不知道为什么是这个结果。连自己写的都不确定，别人能知道你写的是什么意思么？？[/quote] 赞同，受教！

看置顶帖

引用 3 楼 harold2007 的回复:[quote=引用 2 楼 max_min_ 的回复:] 和你实际的编译环境有很大的关系吧！无须纠结了！ 看看这个http://bbs.csdn.net/topics/370153775 看了你给你的链接，这个竟然没有定论，我倒！[/quote] 不是没有定论，而是结论就是未确定行为，这是C/C++标准上写清楚的。 这样写本身就毫无意义，正式开发中写这种代码的程序员，应该第一个滚蛋。 写出人看不懂的，或者一句话要想半天才能看懂的代码的程序员，都是不合格的。 在写代码之前，应该先想想，你自己能否看懂。运行前能够看着代码猜测自己写的代码是什么结果，运行后能否符合预期结果。不要运行前就无法确定，运行后还是不知道为什么是这个结果。连自己写的都不确定，别人能知道你写的是什么意思么？？

引用 2 楼 max_min_ 的回复:和你实际的编译环境有很大的关系吧！无须纠结了！ 看看这个http://bbs.csdn.net/topics/370153775 看了你给你的链接，这个竟然没有定论，我倒！

跟编译器有关系，别费心这个了。


Question: C语言的发展

引用 1 楼 user-9 的回复:楼主，你想多了！ 走路固然可以走回家，为什么不直接搭车这么方便的呢？ +1

结贴率为0的楼主

引用 9 楼 zhao4zhong1 的回复:搭车还有可能自燃…… 赵老师来捣乱了，狼来了

，C语言可以做很多事情，不过从完成一件事情的好坏和复杂度考虑可能会选择其他语言！

引用 9 楼 zhao4zhong1 的回复:搭车还有可能自燃…… 哥们，你真幽默，呵呵，我乐了

搭车还有可能自燃……

引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 u012997273 的回复:] [quote=引用 1 楼 user-9 的回复:] 楼主，你想多了！ 走路固然可以走回家，为什么不直接搭车这么方便的呢？ +1[/quote] 车上可能有小偷！[/quote] 路上也有可能被偷，哈哈，在说，路上还可能碰到抢劫的，托到小树林。。。。。

引用 6 楼 u012997273 的回复:[quote=引用 1 楼 user-9 的回复:] 楼主，你想多了！ 走路固然可以走回家，为什么不直接搭车这么方便的呢？ +1[/quote] 车上可能有小偷！

LZ明明是来散分的. 什么? 结贴率为0?

LZ这是要吵架的征兆么？

楼主是刷分的吧？ C语言绘图能力强？语言本身压根就没有绘图能力。

楼主，你想多了！ 走路固然可以走回家，为什么不直接搭车这么方便的呢？


Question: 函数指针使用遇到的问题

void Translation::out_put() { 	const std::string unit = "Credits"; 	std::map<char,std::string> tmp; 	std::map<std::string,char>::const_iterator mapIt = begin(m_map_reflect); 	for (; end(m_map_reflect) != mapIt; ++mapIt) 	{ 		tmp[mapIt->second] = mapIt->first; 	} 	const char * pTmp = NULL; 	std::string strRst; 	char cstr[32] = {0}; 	std::vector<RST>::const_iterator rtIt = begin(m_vec_rst); 	for (; end(m_vec_rst) != rtIt; ++rtIt) 	{ 		strRst.clear(); 		pTmp = (*rtIt).strRoman.c_str(); 		while(*pTmp) 		{ 			strRst += tmp[*pTmp] + " "; 			++pTmp; 		}  		if ((*rtIt).strMetal.empty()) 		{ 			strRst += "is "; 			sprintf_s(cstr,"%d",(*rtIt).uiValue); 			strRst += cstr; 		} 		else 		{ 			 			if (std::string::npos !=(*rtIt).strMetal.find("Gold")) 			{ 				sprintf_s(cstr,"%.f ",(*rtIt).uiValue*m_stu_rate[TYPE_GOLD]._rate); 				strRst += "Gold is "; 				strRst += cstr + unit; 			} 			else if (std::string::npos !=(*rtIt).strMetal.find("Silver")) 			{ 				sprintf_s(cstr,"%.f ",(*rtIt).uiValue*m_stu_rate[TYPE_SILVER]._rate); 				strRst += "Silver is "; 				strRst += cstr + unit; 			} 			else if (std::string::npos !=(*rtIt).strMetal.find("Iron")) 			{ 				sprintf_s(cstr,"%.f ",(*rtIt).uiValue*m_stu_rate[TYPE_IRON]._rate); 				strRst += "Iron is "; 				strRst += cstr + unit; 			} 			 		} 		puts(strRst.c_str()); 	}  }   void main() { 	std::string __input; 	printf("Please enter:\n"); 	std::getline(std::cin,__input,'!'); 	Translation obj(__input); 	obj.symbol_reflect(); 	obj.replace_symbol(); 	obj.get_exchange_rate(); 	obj.calculate_issue(); 	obj.out_put();  	 	//printf("arabic= %d\n",make_arabic("XLII")); 	system("pause"); }

额。。。 光顾优先级了，忘了这强制转换了。谢了！

类型加括号  (void*) 这个已经是 强制类型转换了   懂了吗?

int a = 10; 这是定义一个整型数;  (int) a = 10; 这样的话，好像在给a进行强制类型转换

SAYER 你那样 也编译不过。我想难道我之前对 函数的返回类型的理解都是错的吗？ 加不加 括号不应该一样吗？void*,  * 是左结合的和 void 结合是表示返回的是 一个无类型的地址。（void *） 还是一样啊。   为啥不能加括号？？？？？？？？？？？？？？？？？？？？？？

正确的 我知道 我以前也这样用的，我想知道 我加括号为啥不正确。

正确的如下： typedef void * (*pfun)(void *); 定义函数指针类型

以前觉的(void *)  加不加 都可以就没注意，但是今天 加了一下竟然出错了。

typedef (void *) (*pfun)(void *);

上关键代码吧  清楚一点