Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于管理学成成绩的系统问题

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  #define N 2  struct student {     int num;     char name[32];     char cla[32];     float momen;     float exam;     float total; };  int information(struct student stu[], int nums) {      int i,j;     float s1=0;     //float a[100]={0};      for(i=0;i < nums;i++)     {         printf("学号：");         scanf("%d", &stu[i].num);          printf("姓名：");         scanf("%s",stu[i].name);          printf("课程名：");         scanf("%s",stu[i].cla);          if((strcmp(stu[i].cla, "#" )==0))             break;          printf("请输入成绩平时成绩和考试成绩\n");         scanf("%f%f",&stu[i].momen,&stu[i].exam);          printf("平时成绩：%.2f 考试成绩：%.2f\n",stu[i].momen,stu[i].exam);          s1 = s1 + stu[i].momen*0.2+stu[i].exam*0.8;         stu[i].total = s1;      }      return i; #if 0     //stu[100].total=si;     for(i=0;i<=N;i++)     {         if(stu[i].total==0)         {stu[i].total=s1;break;}     }  #endif }  void output(struct student stu) {     printf("学号：%d\n姓名: %s\n",stu.num,stu.name); }  struct student max(struct student stu[], int num) {     int i,m=0;     //for(i=0;i<N;i++)     for(i = 1;i<num;i++)     {         if(stu[i].total>stu[m].total)         {             m = i;         }     }     return stu[m]; }  struct student min(struct student stu[], int num) {     int i,m=0;     //for(i=0;i<N;i++)     for(i = 1;i<num;i++)     {         if(stu[i].total<stu[m].total)         {             m = i;         }     }     return stu[m]; }  int main() {     //int k;     int num;     //char a[100]={0};     struct student stu[100],*p=stu;     printf("在课程号按'#'号键退出\n");     /*     for(k=1;k<=N;k++)     {         printf("学号：");         scanf("%d",&stu[k-1].num);          printf("姓名：");         scanf("%s",stu[k-1].name);          information(stu);          printf("总评成绩：%.2f\n\n",stu[k-1].total);     }*/     num = information(stu, 100);      printf("num = %d\n", num);     printf("最高分的同学信息\n");     output(max(p, num));     printf("最低分的同学信息\n");     //output(max(p, num));     output(min(p, num));     return 0; } 参考一下吧  最后输出时，注意没有调用min函数，两次都是调用了max函数。即最高和最低都是调用了max

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

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

user: user-0
content: 程序太长，发不上来。。。
user-0 提问: 求解一个函数指针的问题

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

user: user-2
content: (funcptr)0这是将0强制转换为函数指针类型，0是一个地址，也就是说一个函数存在首地址为0的一段区域内 funcptr是二级指针,你*funcptr不就是二级指针了吗，有什么意义啊

user: user-0
content: 引用 1 楼 qq_36751214 的回复:typedef  void(*)()   funcptr ；这么写意思是对的，不过 typedef  void(funcptr*)()   ；是标准写法，另外函数名即是地址。 对typedef不是很熟悉，我再研究下。看看typedef的用法

user: user-0
content: 引用 5 楼 paschen 的回复:从理解上确实第二种更好理解，但标准要求的是第一种形式我再研究下

user: user-3
content: 注意typedef 和#define还是有区别的。建议对比一下这两种写法和意义的不同。

user: user-4
content: typedef  void(funcptr*)() 这么写是对的，其中funcptr就是函数指针的类型

user: user-5
content: 从理解上确实第二种更好理解，但标准要求的是第一种形式

user: user-6
content: 楼上是正解。

user: user-7
content: 如果不用typedef 大概应该这样写  void(*funcptr)(); void test() { 	printf("ok"); };  int main() { 	funcptr = test; 	funcptr();     return 0; }

user: user-7
content: typedef  void(*)()   funcptr  这个写法不对，试一下就知道了

user: user-8
content: typedef  void(*)()   funcptr ；这么写意思是对的，不过 typedef  void(funcptr*)()   ；是标准写法，另外函数名即是地址。
user-0 提问: C语言里面struct问题，输入三个人的信息，为什么查询的信息只有最后一个

回复:
user: user-0
content: 谢谢大佬提点

user: user-1
content: 定义结构体数组要在定义结构体之后定义，而且输入的是3个学生的信息，要用结构体数组。 正确的代码如下： #include<stdio.h> typedef struct student  {      char name[10];      char num[100];      char sex[10];      int age;      float score[2];  }STU;  STU si[3];  int main()  {  int i,m;  for(i=0;i<3;i++)  {        printf("please import name\n");      scanf("%s",&si[i].name);      printf("please import number\n");      scanf("%s",&si[i].num);      printf("please import sex\n");      scanf("%s",&si[i].sex);      printf("please import age\n");      scanf("%d",&si[i].age);      printf("please import score\n");      scanf("%f %f",&si[i].score[0],&si[i].score[1]);   }  printf("请输入查询信息：\n");  printf("1,名字\n");  printf("2，学号\n");   printf("3，性别\n");  printf("4，年龄\n");  printf("5，分数\n");  scanf("%d",&m); for(i=0;i<3;i++)  {   switch(m)  {  case 1:printf("名字 %s\n",si[i].name);break;  case 2:printf("学号 %s\n",si[i].num);break;  case 3:printf("性别 %s\n",si[i].sex);break;  case 4:printf("年龄 %d\n",si[i].age);break;  case 5:printf("分数 %.2f% .2f\n",si[i].score[0],si[i].score[1]);break;  default: printf("Error\n");break;  } }  return 0;  }

user: user-2
content: for(i=0;i<3;i++)  {  STU si;                         //这个 si 离开了for循环就释放了， 应该申请在for的前面， 而且应用数组
user-0 提问: 指针和字符串

回复:
user: user-1
content: 引用 2 楼 shihengzhen101 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] char *s = "2222abcdefgh1111"； 因为这样定义的s是一个指针变量，指针变量存放的是地址。等号后面的是字符串常量，在只读数据段存放。既然是只读，那么后面的操作是对其修改。因此是运行异常； 改成： char s[] = "2222abcdefgh1111"; 这样定义的s是字符数组，字符数组的长度由等号后的字符串长度（算上'\0')决定。该初始化会有一个将后面的字符串会有一个拷贝到字符数组的过程。 若是定义指针，只是将字符串的首地址存到指针变量里。 写成  const char *s = "2222abcdefgh1111";  是不是也行[/quote] 应该写成这样。

user: user-0
content: 引用 2 楼 shihengzhen101 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] char *s = "2222abcdefgh1111"； 因为这样定义的s是一个指针变量，指针变量存放的是地址。等号后面的是字符串常量，在只读数据段存放。既然是只读，那么后面的操作是对其修改。因此是运行异常； 改成： char s[] = "2222abcdefgh1111"; 这样定义的s是字符数组，字符数组的长度由等号后的字符串长度（算上'\0')决定。该初始化会有一个将后面的字符串会有一个拷贝到字符数组的过程。 若是定义指针，只是将字符串的首地址存到指针变量里。 写成  const char *s = "2222abcdefgh1111";  是不是也行[/quote]如果只是定义的话，是可以的。 但是因为我后面需要对这个字符串进行修改。 刚刚在书上看到一句话——关于应用字符串时，数组和指针的区别：如果打算修改字符串，就不要用指针指向字符串字面量。

user: user-2
content: 引用 1 楼 cfjtaishan 的回复:char *s = "2222abcdefgh1111"； 因为这样定义的s是一个指针变量，指针变量存放的是地址。等号后面的是字符串常量，在只读数据段存放。既然是只读，那么后面的操作是对其修改。因此是运行异常； 改成： char s[] = "2222abcdefgh1111"; 这样定义的s是字符数组，字符数组的长度由等号后的字符串长度（算上'\0')决定。该初始化会有一个将后面的字符串会有一个拷贝到字符数组的过程。 若是定义指针，只是将字符串的首地址存到指针变量里。 写成  const char *s = "2222abcdefgh1111";  是不是也行

user: user-1
content: char *s = "2222abcdefgh1111"； 因为这样定义的s是一个指针变量，指针变量存放的是地址。等号后面的是字符串常量，在只读数据段存放。既然是只读，那么后面的操作是对其修改。因此是运行异常； 改成： char s[] = "2222abcdefgh1111"; 这样定义的s是字符数组，字符数组的长度由等号后的字符串长度（算上'\0')决定。该初始化会有一个将后面的字符串会有一个拷贝到字符数组的过程。 若是定义指针，只是将字符串的首地址存到指针变量里。
user-0 提问: 小白C语言求助

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

user: user-2
content: #include<stdio.h> #include <ctype.h> #include <stdlib.h>  int main() {  #if 1     char str[100], digit[16], *p;     int cnt, k, i;     int num[100];      gets_s(str, 100);       k = 0;     cnt = 0;     p = str;     while (*p) {         if (isdigit(*p))             digit[k++] = *p;          if (!isdigit(*p) && k > 0){             digit[k] = 0;             num[cnt++] = atoi(digit);             k = 0;         }         p++;     }     if (k > 0) {         digit[k] = 0;         num[cnt++] = atoi(digit);     }      printf("Total numbers are %d\n", cnt);     printf("Number list: \n");      for (i = 0; i < cnt; i++)         printf("%7.2d", num[i]);      putchar(10);  #else     char str[100];     char *p;     int a[100], num[100], *q;     int h, i, j, k = 0, m, sum = 0;      printf("输入字符串：");     printf("\n");     gets_s(str, 100);     p = str;     for (i = 0; i < 100; i++)    //从第一个字符开始检查a数组的字符     {         if (48 <= *(p+i)&&*(p+i) <= 57)    //如果p指向的数组元素为数字，进入下一个字符的检查         {             q = num;               //使q指向num数组             h = 0;                 //初始化h为0，h用于统计连续数字的个数             for (j = i; j < 100; j++)    //从连续数字中的第一个数字开始循环，最多循环100次，将连续的数字送入num数组             {                 if (48 <= *(p + j) && *(p + j) <= 57)    //如果从第i个字符开始后的字符均为数字，就将其以数字形式赋给q所指向的num数组的地址，h+1                 {                     *q = *(p + j) - 48;                     h++;                 }                 else                         //如果不是数字，就停止循环                     break;             }             q = num;                     //使q重新指向num数组的首地址             a[k] = 0;                    //对a[k]赋初值为0             for (m = 0; m < h; m++, q++)             {                 a[k] = a[k] + (*q) * 10 ^ (h - m - 1);             }             k++;             sum++;             i = j + 1;         }         else             continue;     }     printf("总共有%d个整数，分别为：\n", sum);     for (i = 0; i < k; i++)     {         printf("%7.5d", a[i]);         if ((i + 1) % 5 == 0)             printf("\n");     }     printf("\n"); #endif     return 0; } 参考一下吧 遍历str时，不能用i < 100；因为你的输入确定是100个有效字符吗？我们测试一般输入20~30个字符。因此建议用*p != '\0'
user-0 提问: 告诉我为什么输不出真确的值（行列式求值） 求解呀

回复:
user: user-1
content: for(k=0;k<n-1;k++)             {                 if(j<i)                     p = 0;                 else                     p = 1;                 //b[j][k] = a[j+p][k++];                 b[j][k] = a[j+p][k];             } 注释掉的那句是不是有问题呢，k++，那么循环变量k也会操作k++
user-0 提问: c语言链表问题

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-2
content: //#include "stdafx.h" #include <stdlib.h> #include <stdio.h>  typedef struct {     int  pn; /*专业编号*/     int  pern; /*预计招生人数*/ }school;  typedef struct {     int  fc; /*第一志愿*/     int  sc; /*第二志愿*/     int  tc; /*第三志愿*/ }choice;  typedef struct {     int  num; /*学号*/     char  name[20]; /*姓名*/     int  score; /*成绩*/     choice  ch; /*志愿*/     int adm; /*是否录取*/ }student;  typedef  struct  Lnode {     student data; /*数据域*/     struct Lnode *next; /*指针域*/ } LinkNode, *stu;  typedef  struct  node {     school data; /*数据域*/     struct node *next; /*指针域*/ } Node, *sch;  stu  initListStu(); /*置一个空表（带头结点）*/ sch  initListSch(); /*置一个空表（带头结点）*/ void creatStu(stu head); /*创建学生链表并读取*/ void creatSch(sch head); /*创建学校链表并读取*/ void prtStu(stu head); /*打印学生链表*/ void prtSch(sch head); /*打印学校链表*/  int main() {     stu tu;     sch cc;     tu= initListStu();     cc= initListSch();     creatStu(tu);     creatSch(cc);     prtStu(tu);     prtSch(cc);     return 0; }  stu  initListStu() /*置一个空表（带头结点）*/ {     stu  p;     p = (stu)malloc(sizeof(LinkNode));     if (!p)    //check p         exit(0);     p->next = NULL;      return  p; }  sch  initListSch() /*置一个空表（带头结点）*/ {     sch  p;     p = (sch)malloc(sizeof(Node));     if (!p)    //check p         exit(0);     p->next = NULL;     return  p; }  void creatStu(stu head)  /*创建学生链表并读取*/ {     FILE* fp;     student x;     stu p, h;     if ((fp = fopen("student.txt", "r")) == NULL)     {         printf("error file.\n");         exit(1);     }     h = head;     while (!feof(fp))     {         fscanf(fp, "%d%s%d", &x.num, x.name, &x.score);         //fscanf(fp, "%d%&d&d", &x.ch.fc, &x.ch.sc, &x.ch.tc);         fscanf(fp, "%d%d%d", &x.ch.fc, &x.ch.sc, &x.ch.tc);         fscanf(fp, "%d", &x.adm);         p = (stu)malloc(sizeof(LinkNode));         p->data = x;         h->next = p;         h = p;     }     h->next = NULL;     fclose(fp); }  void creatSch(sch head)  /*创建学校链表并读取*/ {     FILE* fp;     school x;     sch p, h;     if ((fp = fopen("school.txt", "r")) == NULL)     {         printf("error file.\n");         exit(1);     }     h = head;     while (!feof(fp))     {         //fscanf(fp, "%d%d", &x.pn, x.pern);         fscanf(fp, "%d%d", &x.pn, &x.pern);         p = (sch)malloc(sizeof(Node));         p->data = x;         h->next = p;         h = p;     }     h->next = NULL;     fclose(fp); }  void prtStu(stu head) /*打印学生链表*/ {     stu p;     p = head->next;     while (p)     {         printf("%d:%-5s :%-4d :%-3d :%-3d :%-3d :%-3d\n", p->data.num, p->data.name, p->data.score, p->data.ch.fc, p->data.ch.sc, p->data.ch.tc, p->data.adm);         p = p->next;     }     printf("\n"); }  void prtSch(sch head) /*打印学校链表*/ {     sch p;     p = head->next;     while (p)     {         printf("%d :%-4d\n", p->data.pn, p->data.pern);         p = p->next;     }     printf("\n"); }   参考一下  没有数据，应该是读文件的地方出了问题。建议贴出你的txt文件。注意fscanf/fprintf是格式化的读写，因此格式需要匹配

user: user-0
content: 用单步调试发现ch.sc ch.tc 和adm都没存进去

user: user-0
content: 第三条的报错已解决 再运行的时候虽然没报错但是是空白一片
user-0 提问: 新人求助，关于c的迭代的

回复:
user: user-1
content: 同楼上所说，楼主的if-else句型用的有问题，尾部的else只和前一个if相互联系，将第一个if后的所有if改成else if就好了。 另外，楼主最好不要在函数里嵌套函数声明，应该把它们放在外面，具体位置的话，只需在调用所声明的函数之前，而且声明一次就行了。

user: user-2
content: 中间的一些 if 要改成 else if 吧

user: user-1
content: 其实如果函数的定义和调用同在一个文件里，而且定义是在调用的前面，那么可以不用另外的函数声明。
user-0 提问: 第一次接触C语言，零基础，有没有大神帮我改改~

回复:
user: user-1
content: #include <stdio.h> #include <math.h>  int main() {     //int a,b,c,d,e,f,g,h,i,j;     int a, X, i;     double Y;     printf("Please  enter ten numbers \n");      i = 0;     X = 0;     while (i < 10) {         scanf("%2d", &a);         X += a;     }     /*     scanf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j);     X=a+b+c+d+e+f+g+h+i+j;     */     Y = X / 10.00;     printf("Average: %2f\n",Y);     if (Y > 80 && fabsl(Y - 80) >= 1e-6)     {         printf( "The grade is A");     }     else if (Y > 60 && fabsl(Y - 60) >= 1e-6)     {         printf("The grade is B");     }     else     {         printf("The grade is C");     }     return 0; } 参考一下吧

user: user-2
content: #include <stdio.h> #define N 5 int main() { //int a,b,c,d,e,f,g,h,i,j; //int X; int a[N],i,sum=0;// double Y; printf("Please  enter ten numbers \n"); //scanf("%2d %2d %2d %2d %2d %2d %2d %2d %2d %2d",&a,&b,&c,&d,&e,&f,&g,&h,&i,&j); //X=a+b+c+d+e+f+g+h+i+j; for(i=0;i<N;i++) { 	scanf("%d",&a[i]); 	sum+=a[i]; } Y=((double)sum)/N;  printf("Average: %2f\n",Y);  if (Y>=80)     {       printf( "The grade is A"); } else if (Y>=60) {   printf("The grade is B");     } else      {   printf("The grade is C"); } return 0; }  定义数组存放元素，定义一个循环从标准输入接收数据。

user: user-0
content: 引用 1楼Little丶Five 的回复:你想实现什么样？说明需求我们才能帮你改呀。em...就是往里边加个循环结构就行，怎样的循环结构都可以

user: user-3
content: 你想实现什么样？说明需求我们才能帮你改呀。
user-0 提问: 发一个有趣的C代码，电脑上编译才有效果哦:)

回复:
user: user-1
content: 键入shutdown -a即可

user: user-2
content: [Error] taking address of temporary array

user: user-3

user: user-4
content: 引用 12 楼 hu19921016 的回复:请教楼主 #define puts decode(...)这个宏命令什么意思，为什么下面的puts可以带参数 编译优先级，宏在预编译就处理完了，等到正在编译已经是system替换puts了

user: user-5
content: 你有张良计我有过墙梯  引用 15 楼 zhao4zhong1 的回复:电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 #include<stdio.h> int main() {      system("shutdown/a");        return 0; }

user: user-6
content: 请问这个怎么运行啊 要在什么环境下？求求求

user: user-1
content: C语言环境哦

user: user-7
content: 可以看到：　楼主的第2个数据其实取得不太合理。 不过因 '\0' 标识字符串终止，后面的数据虽然“非0”也不会有影响。

user: user-7

user: user-8
content: 请教楼主 #define puts decode(...)这个宏命令什么意思，为什么下面的puts可以带参数

user: user-9
content: 哈哈！中招！ 这个##是连接的意思，相当于把 r 的值、f的值..穿起来。 #define decode(p,r,i,n,t,f) r##f##r##i##t##p 这个 puts 是假的，其实等于 #define puts decode(m,s,t,o,e,y) s##y##s##t##e##m 穿起来就是“system”  所以， puts(...); 变成  system("....")  加上里头浮点内存其实和字符串”shutdown“ 字节一样的，结果就生生关机了。

user: user-10
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-10
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-8
content: 楼主，我想问下你是如何得到那个double类型的数值的，怎么将 字符串“ shutdown -s”转成double类型的值

user: user-11
content: 我没有问题，因为我是用户模式的，这个需要管理员权限的。

user: user-12
content: 看不懂是啥意思

user: user-13
content: 这个东西真的很神奇

user: user-14
content: (char*)(double[]){1.3553894309652565e+224,5.1218111469478266e+303} 实际是：shutdown -s  但你要强调，只有WINDOWS上才有效

user: user-15
content: 是自动关机吗

user: user-0
content: 引用 5 楼 hiv002 的回复:楼主，你赔我的损失，我的的程序代码还没保存。一天工作成果啊。你赔我。   不好意思，真的不好意思，     没设置超时，但默认有30秒延时，你都没保存吗？

user: user-16
content: 中招， 狠点加上-t 0，嘿嘿
user-0 提问: 萌新求助！！！！！

回复:
user: user-1
content: 引用 4 楼 qq_42203883 的回复:我学的是谭浩强的c语言后面的书里面写着就是 （是，返回1，不是，则返回0） 谭浩强那本书中错误还是比较多的，不要全信，要相信手册，实在不信，可以考虑去看libc库的代码实现。

user: user-0
content: 我学的是谭浩强的c语言后面的书里面写着就是 （是，返回1，不是，则返回0）

user: user-2
content: 第一个程序，那些is开头的函数返回值没说一定要是1啊，手册里写的是非零数，所以那个函数全部没匹配上，全部other++了。

user: user-1
content: 上面忘了解释为什么了，我就继续在下面跟一下。首先使用一个函数，得知道传入的参数什么，返回值是什么，不同的返回值表示什么意思，一般系统函数和标准库函数直接可以直接用man手册，例如 isalpha这个函数，你可以输入命令 man isalpha ,就可以得到这个函数的详细手册，如果你用的是window系统，那么可以通过查阅在线手册http://zh.cppreference.com/w/c。上面代码一的问题就是没有弄懂isalpha 这个函数返回值的意义，函数的在线帮助页面http://zh.cppreference.com/w/c/string/byte/isalpha，仔细阅读一下，你就会明白问题在什么地方。 给一个建议：以后一定要注意代码格式规范，至少要看起来舒服，不然回答者还需要帮你整理格式。

user: user-1
content: #include <stdio.h> #include <ctype.h>  int main() {     int zm=0,space=0,sz=0,other=0;     char ch;     ch=getchar();     while(ch!='\n')     {         if(isalpha(ch) != 0)             zm++;         else if(isspace(ch) != 0)             space++;         else if(isdigit(ch) != 0)             sz++;         else             other++;         ch=getchar();     }     printf("zm=%d space=%d sz=%d other=%d \n", zm, space, sz, other);     return 0; }          isxdigit()               checks for hexadecimal digits, that is, one of               0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F.  RETURN VALUE        The values returned are nonzero if  the  character  c  falls  into  the        tested class, and zero if not.
user-0 提问: windows net-snmp agent No Such Object available on this agent at this OID

回复:
user: user-0
content: 这个问题暂时解决了 ，由于需要用到netsnmp.dll 但是这个dll 如果你是使用exe安装的 那么默认是32位的 在安装的时候就会提示你 64位除了子代理这个功能其他都可以正常，所以就需要编译 ，下载了 源代码 进入win32目录下面，  最下面有两个dsw后缀的一个是win32.dsw,另外一个是win32dll.dsw 如果你只是简单的使用，你完全可以使用exe的方式 ，你如果需要做sub-agent的开发，那么你需要编译后面的win32dll.dsw，因为第一个不生成你需要的netsnmp.dll 。 编译的方式你可以详细读一下 readme.win32里面  Microsoft Visual C++ - Workspace - Building  这下面的内容 会告诉你编译的方式 需要改个东西。  这个坑趟完 我又遇到坑了哎

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84mib%20snmpget%20%E2%80%9CNo%20Such%20Object%20available%20on%20this%20agent%20at%20this%20OID%E2%80%9D&oq=%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589%25E7%259A%2584mib%2520snmpget&rsv_pq=c2403a9b00000ec6&rsv_t=dd57eAZiiF3kcpYUcDYTA0JYj8c2XDNLjApHTRExYEVbq6JjOh0o6BxvW5Y&rqlang=cn&rsv_enter=1&rsv_sug3=6&bs=%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84mib%20snmpget   赵老师 ，这些确实是针对 No Such Object available on this agent at this OID 的回答 能产生这个问题的 在linux' 可能是 服务未启动 或者 没有相关的mib导入，在windows确实没有 而且针对linux的解决方案 我的windows操作没有任何问题

user: user-1
content: https://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&rsv_idx=1&tn=baidu&wd=%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84mib%20snmpget%20%E2%80%9CNo%20Such%20Object%20available%20on%20this%20agent%20at%20this%20OID%E2%80%9D&oq=%25E8%2587%25AA%25E5%25AE%259A%25E4%25B9%2589%25E7%259A%2584mib%2520snmpget&rsv_pq=c2403a9b00000ec6&rsv_t=dd57eAZiiF3kcpYUcDYTA0JYj8c2XDNLjApHTRExYEVbq6JjOh0o6BxvW5Y&rqlang=cn&rsv_enter=1&rsv_sug3=6&bs=%E8%87%AA%E5%AE%9A%E4%B9%89%E7%9A%84mib%20snmpget

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:百度搜相关关键字。 实在是百度很久了 windows上的资料很少 确实没找到

user: user-1
content: 百度搜相关关键字。
user-0 提问: 队列出队

回复:
user: user-1
content: 引用 2 楼 qq_40478118 的回复:如果我想出队一个元素后，我的原队列其实没有改变要怎么做那，就是我出队之后再显示，它的队列依旧是我原来的那个 出队不对队列做删除操作就可以了。De_queue里有一个删除操作。因此将删除操作去掉，变成遍历队列；另外，加一个参数，即出队的是第几个元素；

user: user-0
content: 如果我想出队一个元素后，我的原队列其实没有改变要怎么做那，就是我出队之后再显示，它的队列依旧是我原来的那个

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <malloc.h>  typedef int DataType;  typedef struct Node {     DataType data;     struct Node *next; }Lnode; //节点类型  typedef struct Qu {     Lnode *front;     Lnode *rear; } Queue;//队列类型   Queue * Initiate_queue()//初始化队列，队列有头结点。返回队列的指针。 {     Queue *p;     /*     Lnode *q=(Lnode *)malloc(sizeof(Lnode));     if (!q)         exit(0);     */     p = (Queue *)malloc(sizeof(Queue));     if (!p)         exit(0);     //p->front = q;     p->front = NULL;     //p->front->next = NULL;     p->rear=p->front;      return p; }  int Queue_empty (Queue *queue)//判断队列是否为空，为空返回1，否则返回0 {     if(queue->front == NULL || queue->rear == NULL)         return 1;     else         return 0;  }  void En_queue(Queue *queue, DataType node)//入队 {     Lnode *p=(Lnode *)malloc(sizeof(Lnode));     p->data = node;     p->next = NULL;     if (!queue->front) {         queue->front = p;         queue->rear = p;         return;     }     queue->rear->next = p;     queue->rear=p; }  DataType De_queue(Queue *queue)//出队一个节点，返回其值 {     Lnode *de_node;     int seq;     if(Queue_empty(queue)==1)//判断队列是否为空     {         printf("\n");         printf("The queue is empty! Cannot dequeue\n");         return -1;     }      //else//出队一个元素     //{         de_node=queue->front;         queue->front=de_node->next;         if(de_node->next==NULL)         {             queue->rear=queue->front;         }         seq = de_node->data;         free(de_node);         return seq;     //}  }  void displayQueue(Queue *queue)//显示从队头到队尾的元素 {     Queue *p;     Lnode *de_node;     p = queue;     //int i=1;     //while(i)     while(1)     {         if(Queue_empty(p)==1)//判断队列是否为空         {             printf("\n");             printf("The queue is empty now\n");             break;         }         else         {             de_node=p->front;             p->front=de_node->next;             printf(" %d \n",de_node->data);         }     } }    //void main()//主函数 int main()//主函数 {     Queue *Q;     int i=0,m;     int a[100];     printf("m=");     scanf("%d",&m);     if (m > 100)         exit(0);     printf("Input a=:");     for(i=0;i<m;i++)     {         scanf("%d",&a[i]);     }     Q = Initiate_queue();      printf("Please input  elements\n");     for(i=0;i<m;i++)     {         En_queue(Q,a[i]);     }      printf("out: %d\n",De_queue(Q));     displayQueue(Q);  } 参考一下吧  注意入队和出队的第一个节点；
user-0 提问: 请大大们帮忙看看，这个C程序哪里出了问题

回复:
user: user-0
content: 呵呵，谢谢各位。 另外，我这么写只是把刚学的东西都用上一遍，还没有考虑到优化，后面会注意这个问题

user: user-1
content: for(i=0;i<(stds_m<stds_e)?stds_e:stds_m;i++)    //5     {         if(i<(stds_m<stds_e)?stds_m:stds_e)    //3         {             printf("[%d]号数学：",i+1);                scanf("%d",&score_m[i]);             printf("     英语：");                scanf("%d",&score_e[i]);         }         else         {             if(stds_m<stds_e)             {                 printf("[%d]号英语：",i+1);                    scanf("%d",&score_e[i]);             }             else             {                 printf("[%d]号数学：",i+1);                    scanf("%d",&score_m[i]);             }         }     } 这部分建议用两个循环分开来输入；不要用二层嵌套的输入。因为没看出数学和英语成绩之间有对应关系，或者说有某种关系

user: user-2
content: 宏定义stds_m 和 stds_e for(i=0;i<(stds_m<stds_e)?stds_e:stds_m;i++)    //5     {         if(i<(stds_m<stds_e)?stds_m:stds_e)  这样玩看着不累吗

user: user-0
content: 我已经意识到了，非常感谢！！

user: user-3
content: 运算符的优先级  了解一下？
user-0 提问: 大一c语言作业求助

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

user: user-2
content: 设数组的长度为N：  （1）比较前后相邻的二个数据，如果前面数据大于后面的数据，就将这二个数据交换。  （2）这样对数组的第0个数据到N-1个数据进行一次遍历后，最大的一个数据就“沉”到数组第N-1个位置。  （3）N=N-1，如果N不为0就重复前面二步，否则排序完成。  以上就是冒泡排序的基本思想 以下仅供参考 #include <stdio.h> void main() {     int a[5];     int i,j,t;     printf("输入五位数字：");     for(i=0;i<=4;i++)         scanf("%d",&a[i]);     for(j=0;j<=3;j++)     {         for(i=0;i<4-j;i++)             if(a[i]>a[i+1])             {                 t=a[i];                 a[i]=a[i+1];                 a[i+1]=t;             }     }     for(i=0;i<=4;i++)         printf("%d ",a[i]);                                 printf("\n"); }

user: user-3
content: 注意：递归出口在哪？n是数元素的个数，所以进行冒泡排序是世，要进行循环的次数应当与n相同，进一步说明，当循环次数为零是，递归完成。

user: user-4
content: https://blog.csdn.net/qq_36065506

user: user-5
content: #include<stdio.h>  void bubble_sort(int v[], int n) { 	if (n == 0) 		return; 	 	for (int i = 0; i < n-1; i++) 	{ 		if (v[i] > v[i + 1]) 		{ 			int temp; 			temp = v[i + 1]; 			v[i + 1] = v[i]; 			v[i] = temp; 		} 	} 	bubble_sort(v, n - 1); }  int main() { 	int n=5; 	int nums[5]; 	for (int i = 0; i < n; i++) 	{ 		scanf("%d", &nums[i]); 	} 	bubble_sort(nums, 5); 	for (i = 0; i < 5; i++) 	{ 		printf("%d ", nums[i]); 	} 	printf("\n"); 	getchar();  	return 0; }

user: user-6
content: #include<stdio.h> void bubble_sort(int*v,int i,int j,int v_size)//数组v，数组处理用i,j，数组大小v_size { if(i==v_size-1) break; else if(j==v_size-1)  bubble_sort(v,i+1,0,v_size); else  if(v[j]>v[j+1])   {int temp;temp=v[j];v[j]=v[j+1];v[j+1]=temp;bubble_sort(v,i,j+1,v_size);} }

user: user-7
content: https://www.2cto.com/kf/201305/212172.html
user-0 提问: 求解error C2084: function 'int __cdecl mn(int (*)[5],int )' already has a body

回复:
user: user-1
content: 引用 3 楼 zhao4zhong1 的回复:请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？你有 freestyle 吗？

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？ 因为互联网在赵老那儿，别人无法当参数传递。所以，大家只能把数组之类的作为参数传来传去了。

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

user: user-2
content: #include "stdio.h" #include "conio.h"  void exchange(int a[5][5]); int get_row_sum(int a[5][5],int m); int get_col_sum(int b[5][5],int m); //int mn(int a[5][5],int m); //int nm(int b[5][5],int m); void main() {     int a[5][5]={{1,2,3,4,5},{5,10,15,20,25},{10,20,30,40,50},{15,30,45,60,75},{20,40,60,80,100}};     int m,n,k,tot;     for(m=0;m<5;m++)     {         if(m==0)             a[m][0]=1;         else             a[m][0]=m*5;     }     for(m=0;m<5;m++)         for(n=1;n<5;n++)             a[m][n] = a[m][0]*(n+1);     exchange(a);      for(m=0;m<5;m++)     {         printf("\n");         for(n=0;n<5;n++)             printf("%4d",a[m][n]);     }      for(m=0;m<5;m++)     {         int t;         t = get_row_sum(a, m);         printf("第%d行的和是：%d\n",m+1,t);     }     for(m=0;m<5;m++)     {         int t;         t = get_col_sum(a,m);         printf("第%d列的和是：%d\n",m+1,t);     } } void exchange(int a[5][5]) {     int k,m,n;     for(m=0;m<5;m++)         for(n=0;n<5;n++)         {             k=a[m][n];             a[m][n]=a[n][m];             a[n][m]=k;         } }  int get_row_sum(int a[5][5],int m) {     int n,t=0;     for(n=0;n<5;n++)         t = t+a[m][n];     return(t); } int get_col_sum(int b[5][5],int m) {     int n,t=0;     for(n=0;n<5;n++)         t=t+b[n][m];     return(t); } 参考一下吧

user: user-4
content: int mn(int a[5][5],int m)  {int n,t=0;  for(n=0;n<5;n++)  t=t+a[m][n];  return(t);}  int mn(int b[5][5],int m)       //你把nm  写成  mn 了
user-0 提问: 请问各位大佬，哪里错了怎么改，谢谢

回复:
user: user-1
content: 代码不全，麻烦再发一下

user: user-2
content: 代码不全吧，并且比较乱，建议贴出完整代码；  #include <stdio.h> #include <stdlib.h> #include <string.h>  struct NODE {     int data;     struct NODE *next; };  struct NODE *create_list(struct NODE *head) {     int d;     struct NODE *p,*pr;      scanf("%d",&d);     while (d) {         p = (NODE*)malloc(sizeof(NODE));         if (!p)             exit(0);         p->data = d;          if (!head)             head = p;         else             pr->next = p;         pr = p;          scanf("%d",&d);     }     pr->next = NULL;      return head; } void output(NODE*head) {     NODE *p=head;      while(p)     {         printf("%d\n",p->data);         p = p->next;     } } int main() {     NODE *head=NULL;      head = create_list(head);     output(head);      return 0; } 参考一下吧； 创建链表时，输入0停止创建；

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

user: user-4
content: #include <stdio.h> #include <string.h> typedef struct _NODE {     int data;     struct NODE *next; }NODE; void myfunc(NODE **head) {     int d;     NODE *p=(NODE*)malloc(sizeof(NODE));     NODE *pr = NULL;     p->next=NULL;     printf("input p data\n");     scanf("%d",&d);     p->data=d;     if((*head)==NULL)     {         *head = p;     }     else     {         pr = (*head);         while(pr->next!=NULL)         {             pr=pr->next;         }         pr->next=p;     } } void output(NODE *head) {     NODE *p= head;     while(p!=NULL)     {         printf("%d\n",p->data);         p=p->next;     } }  void aaa(NODE **head) {     char c;     do     {         myfunc(head);         printf("if input data?y or n\n");         scanf(" %c",&c);     }while(c=='y'); } int main() {     NODE *head = NULL;     aaa(&head);     printf("all data are following\n");     output(head);     return 0; }
user-0 提问: 报错，C4700	使用了未初始化的局部变量“L”

回复:
user: user-1
content: #define _CRT_SECURE_NO_DEPRECATE #include <stdio.h> #include <stdlib.h> #define see system("pause") typedef struct LNode {     char data;     struct LNode *next; }LNode;  void CreateList_L(LNode **L, int n) {     *L = (LNode *)malloc(sizeof(LNode));     if (!(*L))         exit(0);     LNode *p;     (*L)->next = NULL;     for (int i = n; i > 0; --i) {         p = (LNode *)malloc(sizeof(LNode));         if (!p)             exit(0);         scanf("%c", &p->data);         p->next = (*L)->next;         (*L)->next = p;     } } int main(void) {     LNode *L;     int n = 6;     CreateList_L(&L,n);      return 0; } 建议创建函数使用二重指针或者一重引用指针（C++支持引用，若是C编译器建议用二重指针）；否则创建函数没有意义，调用之后会导致内存泄露

user: user-2
content: CreateList_L函数的第一个参数要传地址，不然是按值传递，你分配的内存只是给了一个复制后的指针

user: user-3
content: void CreateList_L(LNode *&L, int n) 应该要这样子才对，函数内赋值才能修改参数  还有这个应该只是个警告，或者你把错误级别调高了？ 你能确保代码没问题，这个可以忽略，但是良好的做法还是初始化一下

user: user-4
content: 编译器不致倒你要在方法里面去初始化。 初始化放调用前。  int main(void) {     LNode *L;     int n = 6; 	L = (LNode *)malloc(sizeof(LNode));     CreateList_L(L,n); 	return 0; }

user: user-0
content: 有没有人帮忙看下
user-0 提问: 数组指针释放内存问题，求大佬帮助

回复:
user: user-1
content: int (*b)[3];//定义数组指针，相当于定义一个二维数组，行数不确定但列数是三  我理解是定义了数组指针 也就是数组中一共有三个元素 但是每一个元素都是指针  b=(int (*)[3])malloc(sizeof(int *)*3);//为数组指针申请三行内存，相当于b[3][3] 我理解 是每一个元素大小 以上就是一个一维数组。

user: user-2
content: b=(int (*)[3])malloc(sizeof(int *)*3);//为数组指针申请三行内存，相当于b[3][3] b=(int (*)[3])malloc(sizeof(int )*3 *3);

user: user-3
content: int (*b)[3];//定义数组指针，相当于定义一个二维数组，行数不确定但列数是三 这句的注释是对的。没问题。 b=(int (*)[3])malloc(sizeof(int *)*3);//为数组指针申请三行内存，相当于b[3][3] 这句的注释就有问题，不是申请了3行3列的空间。sizeof(int *)长度是sizeof(int)一样的。这儿只是申请了3 * sizeof(int)的空间。  b=(int (*)[3])malloc(sizeof(int)*3 * 3);/ 这才是申请了了3行3列的空间；

user: user-4
content: int (*b)[3];//定义数组指针，相当于定义一个二维数组，行数不确定但列数是三  我觉得这句有问题，这是定义了一个指向一维数组的指针，不是定义二维数组，定义二维数组这个词一定是要确定二维数组的行号列号。

user: user-5
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

user: user-6
content: 分配的大小有问题 b是一个指向一个3大小的数组，你需要三个这样子的内存，那就是3*3*sizeof(int)的大小（32系统36字节，你实际分配的是12字节)
user-0 提问: 通讯录小程序  链表文件问题

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

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:第一个问题：while循环是找到要删除的节点位置。这个位置需要判断节点是否存在，另外序号是否存在； 第二个问题：ch是char类型，但是EOF是int类型，类型不匹配。建议将ch定义为int类型； 第三个问题：建议查一下你用的是什么加密算法，找一下加密原理。  457行的统计功能 能帮忙改改么？看不太懂

user: user-2
content: 第一个问题：while循环是找到要删除的节点位置。这个位置需要判断节点是否存在，另外序号是否存在； 第二个问题：ch是char类型，但是EOF是int类型，类型不匹配。建议将ch定义为int类型； 第三个问题：建议查一下你用的是什么加密算法，找一下加密原理。
user-0 提问: Process finished with exit code -1073741571 (0xC00000FD)，总是报这个错，这是怎么回事呢？

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

user: user-2
content: 在哪个地方报的这个错？ 跟踪下看看
user-0 提问: 统计文件中英文单词数目并输出到文本文件中，这个程序中的1.txt比较小时可以运行，比较大时输出文件就不能打开，求解答

回复:
user: user-0
content: 修改之后输出过程中还是会出错，自动终止。希望能更加详细的解答一下

user: user-1
content: while(fscanf( fp1, "%s", buf ) > 0 ) 这个操作是从文件中读取一串字符，但是文件里没有'\0'。建议使用fgets。

user: user-2
content: 在循环中反复打开文件，因为文件描述符有限，导致用尽后，会打开文件失败。 另外 打开的每一个文件描述符，用户需要关闭，不然资源泄露给。
user-0 提问: sality感染型病毒清除方法

回复:
user: user-1
content: 你确定不是从毒霸那里抄过来的帖子？

user: user-2
content: 360可以清除吗

user: user-0
content: 毒霸不行，单机工作没什么效果，就是个垃圾清理软件 。火绒还可以，不停报警。不过exe都被感染了，没办法。删不干净。

user: user-0
content: 赵四老师分析的很对，我果断格盘了。

user: user-3
content: 这个病毒的作者和毒霸的作者沆瀣一气。
user-0 提问: C可以和openfire服务器进行对接吗

回复:
user: user-1
content: 百度搜索gloox

user: user-0
content: 引用 2 楼 yiyefangzhou24 的回复:openfire 使用的是xmpp通讯协议，是应用层协议，楼主学习一下7层网络协议，想方便的话直接用socket封装xmpp即可，socket实现的是传输层以上的内容    目前socket封装的xmpp吗?

user: user-0
content: 目前socket封装的xmpp吗?

user: user-1
content: openfire 使用的是xmpp通讯协议，是应用层协议，楼主学习一下7层网络协议，想方便的话直接用socket封装xmpp即可，socket实现的是传输层以上的内容

user: user-2
content: 需要设计协议，让他们之间通信。使用tcp/ip
user-0 提问: while(1)循环无法进行？？

回复:
user: user-1
content: 没看到标红的地方。

user: user-2
content: 标红的的地方是哪儿？你的代码没有标注红色的地方。  while(1) {     sprintf(fname,"%s%s",PATH, SYSTEM_CONFIG_FILE);     fp = fopen(fname, "rb");     if(fp)     {         if(fread(&sc, sizeof(SYSTEM_CONFIG), 1, fp)!=1) {             printf("Read file %s%s failed!\n", PATH, SYSTEM_CONFIG_FILE);             fclose(fp);             return(3);         }         else {             set2=sc.host_ip;             printf("host_ip=%s \n ",set2);             fclose(fp);         }      }     else     {         printf("Open file %s%s failed!\n", PATH, SYSTEM_CONFIG_FILE);         return(2);     }      set1=strcat(set1,set2);     printf("set1:%s \n",set1);     system(set1);     usleep(1000000); }

user: user-3
content: fclose(fp); fopen没有对应
user-0 提问: 萌新求助，写一个函数，用起泡法对输入的10个字符按由小到大顺序排列

回复:
user: user-1
content: if (a[j] = '\0')  改成  if (a[j] == '\0')

user: user-2
content: #include<stdio.h> #include <string.h>  void mpbj(char a[11], int len);  int main() {     int len;     char a[11];     scanf("%s", a);     len = strlen(a);     mpbj(a, len);     printf("%s\n", a);      return 0; }  void mpbj(char a[11], int len) {     int i,j;     char t;      //a[10]='\0';      for(i=0;i< len;i++)         for(j=0;j < len-i-1;j++)         {             /*             if(a[j] == '\0')                 break;             else                 */                 if(a[j]>a[j+1])                 {                     t = a[j+1];                     a[j+1] = a[j];                     a[j] = t;                 }         } } 参考一下吧  scanf以%s格式输入，会自动把'\0'加到字符串末尾。 冒泡排序不用判断'\0'，只需要添加一个参数，可以让冒泡更有普遍使用。

user: user-3
content: for(i=0;i<=9;i++)  for(j=0;j<9-i;j++)                  // 不能是 10-i   ,  你那么写导致 '\0' 被换到数组第一个位置， printf遇到 '\0' 就返回了后面不显示  { 	if(a[j]=='\0')                     //改成这样, 你用的是 =
user-0 提问: c语言编程实现 strlen 函数，要求不使用库函数

回复:
user: user-1
content: 就是遍历字符串的每个字符，一边读一边计数，直到读到字符值为‘\0'的停止，计数的值就是strlen的返回值

user: user-2
content: 引用 23 楼 qq_43315962 的回复:判断什么时候出现\n就可以了 你确定是\n ??

user: user-3
content: 判断什么时候出现\n就可以了

user: user-4
content: int strlen1(const char * s) {     int  i=0;     for( i=0 ; s[i]!='\0' ; i++);     return i; }

user: user-5
content: //支持不同类型大小的字符串 //define YYSIZE_T __SIZE_TYPE__   define YYSIZE_T size_t define yystrlen strlen static YYSIZE_T yystrlen (const char *yystr) {   YYSIZE_T yylen;   for (yylen = 0; yystr[yylen]; yylen++)     continue;   return yylen; }

user: user-6
content: 应该先判断输入指针的合法性， 上面的在输入0指针时 估计大部分都会奔溃

user: user-7
content: VS里面都有strlen的实现源码

user: user-8
content: size_t __cdecl strlen(const char *s) { 	size_t n = 0; 	while (*s++) n++; 	return n; }

user: user-9
content: 指针遍历 遇到\0就退出循环 一个INT 累加

user: user-10
content: 计数器方法 int my_strlen(const char *p) {     assert(p);     int count = 0;     while (*p != '\0')     {         count++;         p++;     }     return count; } 递归方法： int my_strlen(const char *p) {     if (*p=='\0')         return 0;     else         return 1 + my_strlen(p + 1); } 指针-指针 int my_strlen(const char *p) {     const char *ret = p;     while (*p)     {         p++;     }     return p - ret;   }

user: user-11
content: int mystrlen(char *array){     //a代表接收的数组         int index=0;                    // index代表数组的角标，从零开始；         while(array[index]){　//循环array[index]只要为真，就继续走循环体里面的index++;                index++;               //index++ 代表计数器，只要array[index]为真，index就加一，然后继续循环；         }         return index;　　　　//最后index得到最后的计数器总数，返回给主函数。 }

user: user-12
content: 汇编实现，太牛了

user: user-13
content: 引用 10 楼 cfjtaishan 的回复:不要求使用库函数，但是可以把库函数实现单独从库中拿出来，然后修改一下名字，变成自定义函数。这样用效率也不减少 就服你

user: user-14
content: #5正解！

user: user-15
content: 不要求使用库函数，但是可以把库函数实现单独从库中拿出来，然后修改一下名字，变成自定义函数。这样用效率也不减少

user: user-16
content: int strlen(const char * str){     int len=0;     while(*str!='\0') {     len++;     str++ }     return len; }

user: user-17
content: 哈哈！这么短的函数，应该在C++里重新提供一个inline版本，提高效率。

user: user-18
content: int strlen(const char * str){     int len=0;     while(*str++)++len;     return len; }  捂脸~

user: user-19
content: 这种函数 一般不用考虑空指针的

user: user-20
content: 这种问题只要回去看看书，就能解决的，话说，只要懂一丢丢的C语言，这么简单的问题都能自己搞定的吧！严厉批评！
user-0 提问: 为什么输出a，b的值没有发生改变？

回复:
user: user-1
content: 值传递不会改变其本身

user: user-2
content: 你的做法是值传递 当函数用完 函数里的变量也就释放了 没有了  所以不影响你的main里传的参数。 如果要产生关系 就要传地址

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

user: user-2
content: 传递地址  主调函数分配内存 被调函数使用

user: user-4
content: https://blog.csdn.net/zhao_miao/article/details/80036936]你可以看看这个函数的调用过程

user: user-4
content: swap(a,b)中a，b是实参，调用swap函数swap（int a，int b）a，b只是实参的一份临时拷贝，你把拷贝过去的值进行交换，当然不会改变实参的值。 但是如果穿地址，对地址解引用操作，就可以改变实参的值。 所以如果想改变a，b的值就必须穿地址

user: user-5
content: 通俗的讲，调用swap传递的a与b，并main函数中真实的a,b，传的仅仅是a与b的值。不管你在swap函数中如何操作参数a,b都不会改变main中的a,b。如果要达到值的交换效果，C++中可以用引用或者指针传递，C语言用指针传递，如swap(int &a, int &b)或者swap(int *a, int *b)

user: user-6
content: 因为是形参，值传递，如果是指针或引用，则会改变值

user: user-7
content: 你的形参是整形变量，它接收得必须是整形变量，而c,d是指针即是地址，指针传给整形变量本身就是错误的， ，传递什么类型，接收必须什么类型，同理，接收什么类型，也必须给它传递什么类型， 形参必须是指针（int *a,int *b）这样接收的指针才能用

user: user-8
content: 因为你的swap函数是值传递，看懂楼上几个的发言应该就能明白了

user: user-9
content: 传值与传地址的不同

user: user-10
content: void swap(int& a, int& b) {     int tmp;     tmp = a;     a = b;     b = tmp;     c = &a;     d = &b; }

user: user-11
content: swap的参数a,b是局部于swap的，出了swap函数a,b就没有了，因此c = &a;    d = &b;也就指向了一个不存在的空间地址，在main中自然不可能访问到任何信息

user: user-12
content: 你要是能看懂反汇编这个问题就显而易见了， 计算机执行函数的时候 函数内创建的临时变量都存在与栈上，函数返回时，数据虽然还留在栈上，但是是在返回栈指针之外，就是无效的，会被下一次调用覆盖

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

user: user-13
content: void swap(int a, int b) 经典的问题了。因为这儿的a, b是局部变量是swap函数栈上的变量。参数传递是值传递，实参传递给形参，是将值传给了形参a, b；swap函数内两个形参交换了，但并没有修改调用函数（main）函数中的a, b值。（main函数中的a, b是实参）。  解决办法是使用指针，传a, b的地址到swap。如下： void swap(int *a, int *b) {     int tmp;      tmp = *a;     *a = *b;     *b = tmp; } 要想更好的理解，建议查找参数，参数传递的相关资料
user-0 提问: fwrite二进制形式读取一个int只能读取两个字节

回复:
user: user-1
content: 引用 5 楼 DelphiGuy 的回复:赵氏老师有个专门用于回帖的文本文件吧，每天一上班就打开...  果然不出你的所料。

user: user-2
content: 赵氏老师有个专门用于回帖的文本文件吧，每天一上班就打开...

user: user-1
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: 写的是二进制格式，不要用文本编辑器查看，要用ultraedit、hex workshop之类的软件查看。

user: user-3
content: 记事本打开二进制文件会出现乱码，你可以试着用记事本打开一个可执行程序，你会发现它里面有很多的乱码；对于二进制文件需要专门的工具打开； 记事本适用于打开文本文件的

user: user-4
content: 是不是只有3个字符？还有一个字符是'\0'，fwrite函数默认会读n-1个字节，最后一个加这个'\0'。但是我不知道你这个空格是怎么回事。
user-0 提问: 将stdout指向文件fp后，对stdout输出就是输出到文件，但是遇到'\n'会出现异常情况。

回复:
user: user-1
content: 标准已经说了，你不能自己设置，你需要使用freopen去设置，重写向可能还需修改一些参数，你自己直接赋值行为是未定义的  http://en.cppreference.com/w/c/io  Once set, the orientation can only be changed with freopen.

user: user-2
content: 验证了一下，确实会有这个问题 看了一下，出问题的是输出的普通字符串，需要格式化的输出就没问题 这个可能是内部实现机制的问题吧 以前从来没看过有用stdout=fp这样的用法 想完成这样的事情一般有两种做法，一个是fprintf(fp,....... 还有一个是用freopen
user-0 提问: 大一新生，请教一个数组问题

回复:
user: user-1
content: #include <stdio.h>  #define ARR_SIZE 40  void Sort(float score[],long num[],int n);  int main(void) {     long num[ARR_SIZE];     float score[ARR_SIZE];     int n,i;     printf("Please enter total number:");     scanf("%d", &n);     printf("Please enter the number and score:\n");     for (i=0;i<n;i++)     {         scanf("%ld%f",&num[i], &score[i]);     }     Sort(score,num,n);     for(i=0;i<n;i++)     {         printf("%ld****%f\n",num[i],score[i]);     }     return 0; } void Sort(float score[],long num[],int n) {     int i,j,k;     float temp2;     long temp1;     for (i=0;i<n-1;i++)     {         k = i;         for (j=i+1;j<n;j++)         {             if (score[j]>score[k])             {                 k = j;             }         }         if (k != i) {             temp1 = num[i];             num[i] = num[k];             num[k] = temp1;             temp2 = score[i];             score[i] = score[k];             score[k] = temp2;         }     } }  参考一下吧  选择排序有点问题，建议把交换放到第二层循环外，第一层循环内。  小数点后面的数据由于精度问题（本身问题），可能会与输入的值有一定的差距。  浮点数比较大小，不能像整型数那样比较，浮点数有自己的比较方法： 如果fabs(a-b)<=1E-6，那么就是相等了。 fabs是求浮点数绝对值的函数。  类似的 判断大于的时候，就是if(a>b && fabs(a-b)>1E-6)。 判断小于的时候，就是if(a<b&&fabs(a-b)>1E-6)。

user: user-2
content: 看了一下你的代码，这是选择排序法吧？我也很奇怪为什么第一张图里小数变了，才这几位小数，float类型完全够用啊。
user-0 提问: 关于gcc处理递归函数返回值的疑惑。

回复:
user: user-1
content: 如果函数中有部分路径没有返回时，实际返回的是EAX寄存器当前的值，如果EAX中的值正好没修改且符合你预期，你就觉得是正确，但没什么能保证EAX的值不会修改，可能换个编译器或者某种情况下，你的结果就是错的  总而言之，这是未定义行为，不要写这样的代码

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-3
content: else也是多余的，应该： struct test *find(struct test *a,int tmp) {     if(!a) return NULL;     if(a->n==tmp) return a;     return find(a->p,tmp); }
user-0 提问: typedef struct LNode *list和struct LNode有什么区别

回复:
user: user-1
content: C 语言中：struct StructName是一个完整的类型名。就像：int一样，区别是 struct 是自定义类型，而 int 是内置类型。所以声明的时候写法也是类似的：int n; struct StructName dummy;但是 C 语言同样提供一个 typedef 关键字，可以给已有类型（包括内置和自定义类型）定义别名：typedef int INT; typedef struct StructName STRUCTNAME;注意看上面的结构，其实和声明变量一样的，只是在前面加一个 typedef。 如果没有 typedef，INT 就是一个 int 类型变量，STRUCTNAME 是 struct StructName 类型变量。 加了 typedef 则“变量名”就变身“类型名”，而“类型名”代表的类型正是加 typedef 之前“变量名”对应的类型。 根据上述逻辑，也可以定义对应的指针类型：typedef int *PINT; typedef struct StructName *PSTRUCTNAME;定义了这些别名之后，你就可以这样用：INT n; STRUCTNAME dummy; PINT pn; PSTRUCTNAME pdummy;等价于：int n; struct StructName dummy; int *pn; struct StructName *pdummy;C++ 语言： C++ 中引入了类，关键字为 class，它是 struct 的增强版本。声明一个类：class ClassName { private: 	int n; public: 	void setValue(int n); 	int getValue(); };当声明这个类的对象时，这样书写：ClassName className;而不需要像 struct 一样写成这样：class ClassName className;但是，在 C++ 中，把 class 换成 struct 一样可以编译：struct StructName { private: 	int n; public: 	void setValue(int n); 	int getValue(); };声明这个“struct”的对象时，可以这样书写：StructName structName;而不需要像在 C 语言中一样写成这样：struct StructName structName;但是由于 C++ 兼容绝大多数 C 语法特性，因此上面这种写法也是正确的。

user: user-2
content: 引用 3 楼 a34140974 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] typedef是给类型别名， typedef struct LNode * list; 这条语句就是将struct LNode *可以用list代替。当然struct LNode也是可以定义指针的。 但是也是有区别的。 比如如下： list a, b; struct LNode *a, b; 第一条语句定义了2个指针变量，第二条语句定义了一个指针变量，一个结构体普通变量； 这就是为什么用宏定义和typedef的一个区别吧  实际上是有区别的，别的不说，struct LNode在旧版C中，类型是struct LNode，因此你不能像这么定义一个变量LNode a;(正确的是struct LNode a;)，所以会有typdef这种写法。现在的C具体怎样需要实测一下。但较新的c++里面，为了方便，两种写法最终都可以使用LNode a;这种定义方式[/quote] 注意其别名和把别名定义成结构体名不是一个概念。别名可以定义成很多不同的名字。 楼主没提是什么环境下，新版的C也不支持LNode a这样的定义。

user: user-3
content: 引用 2 楼 cfjtaishan 的回复:typedef是给类型别名， typedef struct LNode * list; 这条语句就是将struct LNode *可以用list代替。当然struct LNode也是可以定义指针的。 但是也是有区别的。 比如如下： list a, b; struct LNode *a, b; 第一条语句定义了2个指针变量，第二条语句定义了一个指针变量，一个结构体普通变量； 这就是为什么用宏定义和typedef的一个区别吧  实际上是有区别的，别的不说，struct LNode在旧版C中，类型是struct LNode，因此你不能像这么定义一个变量LNode a;(正确的是struct LNode a;)，所以会有typdef这种写法。现在的C具体怎样需要实测一下。但较新的c++里面，为了方便，两种写法最终都可以使用LNode a;这种定义方式

user: user-2
content: typedef是给类型别名， typedef struct LNode * list; 这条语句就是将struct LNode *可以用list代替。当然struct LNode也是可以定义指针的。 但是也是有区别的。 比如如下： list a, b; struct LNode *a, b; 第一条语句定义了2个指针变量，第二条语句定义了一个指针变量，一个结构体普通变量； 这就是为什么用宏定义和typedef的一个区别吧

user: user-4
content: typedef struct LNode *list表示定义了一个别名list，list代表 struct LNode *类型的别名，它是一个指针类型。list a，就代表定义了一个struct LNode *类型的变量a。 而struct LNode代表一个结构体类型。struct LNode a代表定义了struct LNode类型的变量a。
user-0 提问: 萌新求助 编写一个函数，由实参传来一个字符串，统计此字符串中字母，数字、空格和其他字符的个数，在主函数中输入字符串以及输出上述的结果

回复:
user: user-0
content: 谢谢大家了

user: user-1
content: 错误原因：get_s输入的字符串不会包含最后输入的'\n'，这样会找不到\n'结束符，直到读取到非法内存报异常。 解决方法：void fenlei(char a[50]) {     int zimu = 0, kongge = 0, shuzi = 0, qita = 0, i;     char zifu;     for (i = 0; (zifu = a[i]) != '\0'; i++)         // 错在这里，我不知道为什么 引发了未经处理的异常 : 读取访问权限冲突。 * *a** 是 0x2410112。

user: user-2
content: #include<stdio.h>  void fenlei(char a[50]);  int main() {     char a[50];     printf("请输入一串字符\n");     gets_s(a, 50);     fenlei(a);     return 0; } void fenlei(char a[50]) {     int zimu = 0, kongge=0,shuzi=0,qita=0,i;     char zifu;     for(i=0; (zifu = a[i]) !='\0';i++)     {         if( (zifu>='a'&&zifu<='z')|| (zifu>='A'&&zifu<='Z'))             zimu++;         else if(zifu == ' ')             kongge++;         else if(zifu>='0'&&zifu<='9')             shuzi++;         else             qita++;     }     printf("字母有%d个\n",zimu);     printf("空格有%d个\n",kongge);     printf("数字有%d个\n",shuzi);     printf("其他字符有%d个\n",qita); }  参考一下吧  出错的地方是数组越界，因为输入的字符串中，并没有将'\n'加入到字符数组a中，只需要判断字符是否为'\0'即可。 另外，gets_s需要指定字符数组的长度。

user: user-2
content: 引用 1 楼 cfjtaishan 的回复:#include<stdio.h>  void fenlei(char a[50]);  int main() {     char a[50];     printf("请输入一串字符\n");     gets_s(a, 50);     fenlei(a);     return 0; } void fenlei(char a[50]) {     int zimu = 0, kongge=0,shuzi=0,qita=0,i;     char zifu;     for(i=0; (zifu = a[i]) !='\0';i++)     {         if( (zifu>='a'&&zifu<='z')|| (zifu>='A'&&zifu<='Z'))             zimu++;         else if(zifu == ' ')             kongge++;         else if(zifu>='0'&&zifu<='9')             shuzi++;         else             qita++;     }     printf("字母有%d个\n",zimu);     printf("空格有%d个\n",kongge);     printf("数字有%d个\n",shuzi);     printf("其他字符有%d个\n",qita); }  参考一下吧  出错的地方是数组越界，因为输入的字符串中，并没有将'\n'加入到字符数组a中，只需要判断字符是否为'\0'即可。 另外，gets_s需要指定字符数组的长度。 注意代码风格，建议注意下自增的用法，建议对比代码找一下自己的问题。