Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 二级指针两个题目

回复:
user: user-0
content: 第一题选C 第二题选D

user: user-1
content: 这主要是考查函数栈局部变量和参数拷贝（值传递）以及指针方面的知识  第一题（答案是C） void f(int **s) //s和mian的r是两个不同函数栈的局部变量，只是值相同（参数复制），也就是r的值==s的值（也就是r和s指向相同的地址，是main的p变量的地址），所以*r==*s（都是相同地址p的内存信息）。 {     int *t=&k;     s=&t;*s=&m; //这里是重新给s赋值，也就是s重新指向了一个和r指向不同的地址（r没变，还是指向原来的地址），所以s和r不再有关联，修改*s不再影响*r。     printf("%d,%d,%d,",k,*t,**s); }   int main() {     int i=3,*p=&i,**r=&p;     f(r);     printf("%d,%d,%d\n",i,*p,**r);//上面说了，r的值没变，所以*r没变（也就是p没变），**r也没变（也就是*p没变）     return 0; }  第二题（答案是D） void f(int **s) //参考第一题的解释 {     int *t=&k;     *s=t;//这里不是给s重新赋值，而是给s指向的地址重新赋值（第一题的解释知道s指向的地址和r指向的地址一样，是main的p变量的地址），所以改变*s也就是改变*r（p的内存信息改变）     printf("%d,%d,%d,",k,*t,**s); }   int main() {     int i=3,*p=&i,**r=&p;     f(r);     printf("%d,%d,%d\n",i,*p,**r); //上面说了*r改变，p也改变（*r就是p），所以*p也就改变了     return 0; }
user-0 提问: 太难了

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 和某帖同款代码，一个老师教的吗  诶哦诶福  LF %lf

user: user-3
content: scanf("%if",&I); 改成 scanf("%lf",&I);

user: user-4
content: #include <stdio.h>  int main() {     double I;     printf("请输入当月利润\n");     //scanf("%if",&I);     scanf("%lf",&I);     if (I>=0&&I<100000)     {         I=I*0.1;         printf("应发奖金%lf\n",I);     }     else if(I>100000&&I<=200000)     {         I=100000*0.1+(I-100000)*0.75;         printf("应发奖金%lf\n",I);     }     else if(I>200000&&I<=400000)     {         I=100000*0.1+(I-200000)*0.5;         printf("应发奖金%lf\n",I);     }     else if(I>400000&&I<=600000)     {         I=100000*0.1+(I-400000)*0.3;         printf("应发奖金%lf\n",I);     }     else if(I>600000&&I<=1000000)     {         I=100000*0.1+(I-600000)*0.1;         printf("应发奖金%lf\n",I);     }     return 0; } 供参考～  另外，似乎还缺少一个else，对于输入大于1000000的数值确实没有任何输出。
user-0 提问: 为什么不能输出东西啊

回复:
user: user-1
content: scanf少一个%吧。 建议直接贴代码，发图片也建议图片不要转向了。

user: user-2
content: scanf("%lf",&I)  LF

user: user-1
content: scanf后面应该是%lf，另外缺少yelse，对于大于1000000的输入值确实没有输出内容。
user-0 提问: 求大神帮忙看看代码，为啥不能合并

回复:
user: user-0
content: 感谢大哥，问题完结

user: user-1
content: #include <iostream>  using namespace std;  #define ok 1 #define error 0 #define overflow -1 #define maxsize 10  typedef int status; typedef int elemtype;//定义线性表类型  typedef struct{     elemtype*elem;     int length; }sqllist;  status linlist(sqllist &L); status create(sqllist &L); status show (sqllist &L); status insert(sqllist &L,int i,elemtype e); void unio(sqllist &La,sqllist Lb);  int main() {      sqllist list,list2;      if(linlist(list)==ok)         cout<<"初始化完成"<<endl;     else         cout<<"内存溢出"<<endl;      if(linlist(list2)==ok)         cout<<"初始化完成"<<endl;     else         cout<<"内存溢出"<<endl;      cout<<"请创建第一个线性表"<<endl;     if(create(list)==ok)         cout<<"数据输入完成"<<endl;     else         cout<<"数据创建失败"<<endl;      show(list);     cout<<"请创建第二个线性表"<<endl;      if(create(list2)==ok)         cout<<"数据输入完成"<<endl;     else         cout<<"数据创建失败"<<endl;      show(list2);      unio(list,list2);     cout<<"合并以后的线性表为"<<endl;     show(list);      return 0; }  status linlist(sqllist &L) {     L.elem = new elemtype[maxsize];     if(!L.elem)         return overflow;     L.length = 0;      return ok; }  status create(sqllist &L) {     int n;     cout<<"请问你要输入的元素有几个"<<endl;     cin>> n;     if(n > maxsize || n < 0)         return error;      cout<<"你输入的元素"<<endl;     for(int i=0; i<n; i++)         cin>>L.elem[i];      L.length = n;      return ok; }  status insert(sqllist &L,int i,elemtype e) {      //if(i < 1 || i > L.length)     if(i < 1 || i > L.length+1)    //如果插入的是在L之后，那么 i > L.length就不符合有要求了         return error;                                      //i不合法     else if(L.length==maxsize)         return overflow;                                   //i溢出     //else     for(int j = L.length-1;j>=i-1;j--)         L.elem[j+1] = L.elem[j];                             //插入后元素后移      L.elem[i-1] = e;                                     //将新元素e放入第i个位置     L.length++;      //show(L);    //debug     return ok; }  status show (sqllist &L) {     for(int i=0;i<L.length;i++)         cout<<"第"<<i+1<<"个元素是"<<L.elem[i]<<endl;     return ok; }  void unio(sqllist &La,sqllist Lb) {     int i=0,j=0, inc = 0;     //status insert(sqllist &L,int i,elemtype e);     while(i < La.length && j < Lb.length)     {         while(La.elem[i] < Lb.elem[j] && i < La.length)             i++;         if(i < La.length) {             /*             //if(La.elem[i]=Lb.elem[j])             if(La.elem[i] == Lb.elem[j])             j++;             else             {             insert(La,++i, Lb.elem[j]);             j++;             }             */             if (La.elem[i] == Lb.elem[j]) {                 j++;                 continue;             }             insert(La, ++i, Lb.elem[j]);             j++;         }     }     while(j < Lb.length){         //cout<<"+++"<<Lb.elem[j]<<endl;         insert(La, ++i, Lb.elem[j]);         j++;     } } 供参考～  楼主的问题在insert函数里的第一个判断条件。
user-0 提问: 指针与循环结构

回复:
user: user-1
content: 数组名是数组的首地址，就像char *p = a;时，首地址的值也保存到p中。

user: user-2
content: 数组名可以当成数组的首地址，也就是一个数字，地址可以进行加减运算的。

user: user-0
content: 这个首地址就是Hello的第一个字母H是吧，那么a+1就是往后一个到e，a+2就是到l，最后输出的就是ello！这样？                 llo！

user: user-3
content: p<a+2表示p指向的地址小于a+2得到的地址，则循环，循环中p指向的地址会增大1个单位（char类型则增大1个字节）

user: user-3
content: 数组名是数组的首地址，地址可以计算，a+2表示a的首地址+2个字节（char类型）的长度的地址
user-0 提问: vs scanf_s 报错 

回复:
user: user-1
content: scanf_s("%d %s %f", &stu1.id, stu1.name, sizeof(stu1.name), &stu1.score); \n问题，有点懵，到底要不要像printf那样放换行符啊，不是这两个函数是对应的吗

user: user-0
content: 去掉换行符  就正确了

user: user-2
content: 不需要加换行符

user: user-3
content: 有什么错误呢？ sizeof(stu1.name)改成20试试
user-0 提问: switch语句

回复:
user: user-1
content: switch中没有break。当i=1时，跳转到case 1，由于没有break，所以case 2，case 3和default都会执行。当i=2时，跳转到case 2,由于没有break，因此case 3和default都会执行；当i=3时，一次类推～

user: user-2
content: 引用 6 楼 weixin_46457534的回复:[quote=引用 1 楼 user-5 的回复：]首先我们看到i=1，进入循环之后case 1，就执行k+=1这个语句，然后紧接着执行k+=2，再紧接着执行k+=3，最后输出k 接下来我们i=2进入循环，直接到case 2，执行k+=2，紧接着执行k+=3，输出k 最后i=3进入循环，直接执行k+=3，输出k 之所以会执行与case什么无关的内容是因为你没有在每个case后面加一句break；为什么第二次会直接到case 2，第三次会直接到default呢？[/quote] 因为case相当于if，在case 1部分i==2，不等于，所以就跳过了。

user: user-3
content: swith(i)就是判断i是什么就会跳到相应的case去啊 比如i是1，就跳到case 1，i是2就跳到case 2，等等。但是如果case没有break，就会继续执行下一个case，比如i是1，执行完case 1后，因为没有break，就会继续执行case 2，等等。如果希望i是1的时候只执行case 1，那么要在case 1的最后加break，即 case 1: k+=1; break;

user: user-0
content: 引用 4 楼 qybao 的回复：算了，就剩最后一个循环，直接也写了吧 每次循环输出一个值 第一次循环i==1，进入case1，计算得到k=0+1=1，因为case没有break，继续进入case2，计算得k=1+2=3，因为没有case没有break，继续进入default，计算k=3+3=6，然后执行打印，6 第二次循环，i==2，case1不满足，跳过，进入case2，计算k=6+2=8，因为case没有break，继续进入default，计算k=8+3=11，然后执行打印，11 第三次循环，i==3，case1，case2不满足，进入default，计算k=11+3=14，然后执行打印，14请问这是怎么判断case是否满足的呢？

user: user-0
content: 引用 1 楼 user-5 的回复：首先我们看到i=1，进入循环之后case 1，就执行k+=1这个语句，然后紧接着执行k+=2，再紧接着执行k+=3，最后输出k 接下来我们i=2进入循环，直接到case 2，执行k+=2，紧接着执行k+=3，输出k 最后i=3进入循环，直接执行k+=3，输出k 之所以会执行与case什么无关的内容是因为你没有在每个case后面加一句break；为什么第二次会直接到case 2，第三次会直接到default呢？

user: user-0
content: 请问这是怎么判断case是否满足的呢？

user: user-3
content: 算了，就剩最后一个循环，直接也写了吧 每次循环输出一个值 第一次循环i==1，进入case1，计算得到k=0+1=1，因为case没有break，继续进入case2，计算得k=1+2=3，因为没有case没有break，继续进入default，计算k=3+3=6，然后执行打印，6 第二次循环，i==2，case1不满足，跳过，进入case2，计算k=6+2=8，因为case没有break，继续进入default，计算k=8+3=11，然后执行打印，11 第三次循环，i==3，case1，case2不满足，进入default，计算k=11+3=14，然后执行打印，14

user: user-3
content: 每次循环输出一个值 第一次循环i==1，进入case1，计算得到k=0+1=1，因为case没有break，继续进入case2，计算得k=1+2=3，因为没有case没有break，继续进入default，计算k=3+3=6，然后执行打印，6 第二次循环，i==2，case1不满足，跳过，进入case2，计算k=6+2=8，因为case没有break，继续进入default，计算k=8+3=11，然后执行打印，11 剩下的循环依次类推。

user: user-4
content: 是不是因为没加break所以搞不懂 如果不加break,就会把剩下的也执行了

user: user-5
content: 首先我们看到i=1，进入循环之后case 1，就执行k+=1这个语句，然后紧接着执行k+=2，再紧接着执行k+=3，最后输出k 接下来我们i=2进入循环，直接到case 2，执行k+=2，紧接着执行k+=3，输出k 最后i=3进入循环，直接执行k+=3，输出k 之所以会执行与case什么无关的内容是因为你没有在每个case后面加一句break；
user-0 提问: 【TJOI2013】单词，一个神奇的问题

回复:
user: user-1
content: #include<stdio.h> #include<string.h> int cheak(char *a,char *b)//从b中找a {     int la,lb,i,j,flag,sum=0;     la=strlen(a);     lb=strlen(b);     for(i=0;i<=lb-la;i++)//遍历i遍     {         flag=1;         j=0;         while(j<la)//j表示a[a]的第j个字符         {             if(a[j]!=b[i+j]){flag=0;break;}             j++;         }         if(flag) sum++;     }     return sum; }  int main() {     int i,j,sum,n;     char *a[201];      scanf("%d",&n);     for(i=0;i<n;i++) {         a[i] = (char *)malloc(sizeof(char) * 128);         if (!a[i])             exit(0);         scanf("%s",a[i]);     }     for(i=0;i<n;i++)     {         sum=0;         for(j=0;j<n;j++)             sum=sum+cheak(a[i],a[j]);//从aj中找ai         printf("%d\n",sum);     }     for (i = 0; i < n; i++)         free(a[i]);     return 0; }  供参考～  出现段错误是必然的。因为a是野指针数组。使用之前需要先申请空间，其实就是让指针指向可读可写的内存位置，堆是其中的内存。

user: user-2
content: 建议你做oj题目不要用指针，直接全局就行，考虑不好的话就会出现野指针或者内存泄漏，都会报RE

user: user-3
content: 这个指针数组的每个元素都是野指针
user-0 提问: 大佬请看看

回复:
user: user-0
content: 引用 8 楼 寻开心 的回复:for (int I=0; I<5; I++)     for(j=5-i; j<6; j++ )   第一轮最后两个比； 第二轮，最后三个比； 第三轮，最后四个比， .... 它能保证，最后都若干个数都是排好大小的 谢谢大佬，我最近脑子总是很混乱

user: user-1
content: for (int I=0; I<5; I++)     for(j=5-i; j<6; j++ )   第一轮最后两个比； 第二轮，最后三个比； 第三轮，最后四个比， .... 它能保证，最后都若干个数都是排好大小的

user: user-1
content: i到5就可以了

user: user-2
content: 验证最好的例子是，想升序，demo就用降序的例子

user: user-2
content: for (j = 5 - i; j < 6; j++) 二层循环有问题。  for (j = 0; j < 6-i-1; j++)     if (a[j] > a[j+1]) {     xxxx }

user: user-3
content: 答案是没有问题的，就是内层循环和平时写的不太一样，效果是一样的 正常的话是for(int j=0;j<5-i;j++)

user: user-0
content: 引用 2 楼 寻开心 的回复:嗷， 不对，写的有问题  j=5-i，  i可以是5的， 那是j是0，   if (a[j] < a[j - 1]) 这个j-1 就成-1了  想法是可以的， 但是写法是错的 j<6改成j>0?

user: user-1
content: 嗷， 不对，写的有问题  j=5-i，  i可以是5的， 那是j是0，   if (a[j] < a[j - 1]) 这个j-1 就成-1了  想法是可以的， 但是写法是错的

user: user-1
content: 是对的 只是泡泡是朝下冒的， 外星球的逻辑呗
user-0 提问: 新人小白

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 可以拓宽一下知识，书本上知识点讲的不够详细，可以考虑买点书籍，从其他书上可以找到课本上讲的不细的地方。 编程主要还是理论和实践相结合，多用实践去检验和验证理论～

user: user-3
content: 我也是大二，嘻嘻，自己学呗，课本上学不到啥的，可以相互交流
user-0 提问: 【新手求助】程序运行出现乱码

回复:
user: user-1
content: scanf是格式化输入函数，所谓格式化，就是scanf的第一个参数里（双引号里）是什么就要输入什么。 建议楼主对比一下自己的输入

user: user-2
content: scanf("\"%s\"",name);修改为scanf("%s",name) 或者输入时输入："name"试试

user: user-3
content: 引用 1 楼 m0_46108109 的回复:为什么用两个引号？ 我猜楼主是想输出“ ”，想用转义字符

user: user-4
content: 输入不要瞎写，里面只能是“%s”,把多余去掉就能得到想要的

user: user-5
content: 为什么用两个引号？
user-0 提问: 都有什么可以重复定义，重复定义的后果是什么？

回复:
user: user-0
content: 谢谢，我有点明白了。 假设一个头文件被多个源文件引用。 我和这种情况搞混了。  这样每个源文件中被定义的同名变量，都有自己的文件域。

user: user-1
content: 你的代码里面， 那些函数都是声明，并不是定义 变量都是定义， 但是不同时#include 两个头文件，也不会有冲突   extern int i; 这样就是声明， 就不会有冲突  #define对应的部分才是宏定义

user: user-1
content: #define是可以重复定义的啊 后者替代前者  函数，变量可以重复声明，但是不能重复定义 宏不是，宏是可以重复的 编译器会给警告，但是可以继续用的

user: user-2
content: 重定义应该编译都不会通过吧，如果重定义了，那么应该用哪个呢？编译器也很为难吧，程序不能出现是是非非，真真假假的情况～
user-0 提问: C语言编程

回复:
user: user-0
content: 谢谢大家的帮忙，问题解决啦

user: user-1
content: int num=531; 改成  int num=0; scanf(“%d”, &num); 就可以了

user: user-2
content: 把赋值改成输入不就行了

user: user-0
content: 引用 1 楼 自信男孩 的回复：#include <stdio.h>  void print_number(int n);  int main(void) {     int num = 531;      print_number(num);      printf("\n");      return 0; }  void print_number(int n) {     if (n == 0)         return;      print_number(n/10);     printf("%d ", n % 10); }  供参考～如果是从键盘输入，用scanf的话，请问怎么改呢

user: user-0
content: 那如果是从键盘输入任意数的话，请问该怎么改呢？

user: user-3
content: #include <stdio.h>  void print_number(int n);  int main(void) {     int num = 531;      print_number(num);      printf("\n");      return 0; }  void print_number(int n) {     if (n == 0)         return;      print_number(n/10);     printf("%d ", n % 10); }  供参考～
user-0 提问: 一道csp考试类型题目疑问

回复:
user: user-0
content: 这道题还是没有找到具体的错误，但是如下解法更加直观和简便，而不是直接暴力逐个读取整个字符串，尤其是sscanf的应用，不过还请大佬帮我找找上面的代码的错误  #include<iostream> #include<string> #include<string.h> #include<vector> #include<stdlib.h> #include<algorithm> using namespace std; struct info { 	string name; 	int cnt; 	int time; 	bool operator <(const info& the_info) 	{ 		if(cnt != the_info.cnt) 			return cnt > the_info.cnt; 		else if(time != the_info.time)  			return time < the_info.time; 		else 			return strcmp(name.c_str(),the_info.name.c_str())<0; 		}  };  int main() { 	int n,m; 	scanf("%d%d",&n,&m); 	char name[100]; 	vector<info> list; 	while(~scanf("%s",name)) 	{ 		int time=0,num=0; 		info std; 		std.name=name; 		for(int i=0;i<n;i++) 		{ 			char s[50]; 			scanf("%s",s); 			int l=strlen(s); 			int t,n; 			if(s[0] == '-')continue; 			else if(s[l-1]==')') 			{ 				sscanf(s,"%d(%d)",&t,&n); 				time+=t+n*m; 				num++; 	 		} 			else 			{ 				time+=atoi(s); 				if(atoi(s) != 0) num++; 	 		}  		} 		std.cnt=num; 		std.time=time; 		list.push_back(std); 	} 	sort(list.begin(),list.end()); 	for(vector<info>::iterator it=list.begin();it!=list.end();it++) 	{ 		printf("%-10s %2d %4d\n",it->name.c_str(),it->cnt,it->time); 	} 	return 0;	 }

user: user-0
content: 引用 1 楼 初学小菜 的回复：感觉格式错了，你都用%-10d了为啥还要加一个空格呢？终于有人看了但是应该不是这里的问题，中间有空格是因为题目要求输出之间除了左右对齐，还要两两有空格，不过谢谢你啊！

user: user-1
content: 感觉格式错了，你都用%-10d了为啥还要加一个空格呢？
user-0 提问: 麻烦大佬看下这个c语言问题出在哪里

回复:
user: user-1
content: scanf_s("%d%s%f", &student1.num, student1.name, 20,  &student1.score);  供参考～  需要指定name的长度。

user: user-2
content: 把scanf_s改成scanf。 scanf_s和scanf的参数不一样，具体可以谷歌百度自己查看两个函数的说明。 另外，最好struct student结构体定义放在main方法的上面（当然这个和这次的问题无关）。
user-0 提问: C语言文件和链表

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 建议直接贴代码～

user: user-3
content: 为什么都喜欢用黑底，我看教程视频里也大多数用黑底。

user: user-4
content: 想看清图片中的代码很费劲。直接贴代码多好

user: user-0
content: 读不进去文件   文件打开依然为空
user-0 提问: 为什么C语言编译成功却运行出错

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 应该是环境的问题，建议将错误信息百度一下，找一下原因和解决办法。

user: user-3
content: void main()？！得是int main()（不知道是不是这个，反正得这么写，其他的编辑器，像dev-c++、VS2019都会报错）

user: user-4
content: 编译 -  链接 - 执行 你这个是链接没有过， link.exe error 估计是VC6 没有安装正确， 这么古老的软件不建议继续用 dev c++ 或者升级到 visual studio 2019去吧

user: user-5
content: 估计是vc6.0的问题，找个devc++用吧
user-0 提问: 华氏摄氏温度转换题目的疑问，求解？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 建议 scanf("%d %d")中间不要有空格 %d表示打印整数， %6.1f 表示打印6位，小数点后一位

user: user-3
content: 可能测试点没有出100以上的限定条件%d%6.1f是printf的格式化输出%6.1f说的是输出长度占6位比如0.46789在该条件下输出就是   0.5（前面有三个空格）， 至于if else的问题，你else后面没有加{   }所以else只会针对printf（”fahr celsius“）到；就截止了
user-0 提问: 新手学习编程 刚刚碰触实例编程

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 我是用的vs 2015 的c 写的
user-0 提问: 发生访问位置冲突

回复:
user: user-1
content: char string[100]是字符数组 直接使用数组名称，相当于取数组首地址 所以scanf的时候，不能 &string，使用string就可以

user: user-2
content: 字符串输入 不用 &string, 直接 scanf（"%s", string); scanf_s需要的参数建议百度一下

user: user-0
content: 因为我在做程序的时候并不知道该长度确切是多少，所以我查阅的资料用的是sizeof（string），这样做对吗？

user: user-3
content: 因为scanf不检查读入的缓存区字符串长度，所以scanf会越界存储。所以标准委员会建议用scanf_s代替scanf。 这个长度，应是字符数组的长度-1，或者等于字符串大小。

user: user-0
content: 感谢感谢，我查阅资料也有看到这个长度参数，现在已经加上了，能不能问一下这个长度参数到底代表什么呢？

user: user-3
content: scanf_s，少了个长度参数

user: user-0
content: 用不用&都试过了，还是访问冲突
user-0 提问: makefile通配符wildcard的问题

回复:
user: user-1
content: 两个展开的阶段不一样，用 wildcard 表示在 Makefile 执行过程中就展开，不用 wildcard 表示在调用具体命令时让 shell 进行展开，或者由被调用程序自行决定是否展开。
user-0 提问: 第1次第2次都有正确输出第三次执行时就出现了Segmentation fault错误

回复:
user: user-1
content: 贴出代码吧，这样能更好的解决你的问题～

user: user-0
content: 引用 2 楼 proorck2019 的回复:关于malloc和free的问题， 我猜你执行了2次malloc，3次free  for(i=0;i<10;i++) {          myfunc(); }  malloc与free是成对的

user: user-2
content: 看看是否越界吧 + 代码说话

user: user-3
content: 没代码不好说

user: user-4
content: 关于malloc和free的问题， 我猜你执行了2次malloc，3次free

user: user-5
content: 没代码没真相
user-0 提问: 大佬们这道题怎么做

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 有一个问题需要注意 在中国的利率计算， 分之后是截断  不是四舍五入， 123.456 当做123.45.   printf语句输出结果是四舍五入123.46 所以不能直接输出， 还要做结果的转化的 要么是用floor函数，要么自己做一下截断处理的转化  double c=0, r=0, s=0; scanf(“%lf%lf”, &c, &r); s = c*r; s = floor(s) / 100.0;  // s = ((int) s)/100; printf(“本金：%.2lf\n”, c); printf(“利息：%.2lf\n”, s); printf(“合计：%.2lf\n”, c+s);  不过，这是到测试题， 也许不用这样。

user: user-3
content: 这样的题自己也不会做，这是从没看过书吗

user: user-4
content: 改一下，s=c*r/100

user: user-4
content: for example double c=0, r=0, s=0; scanf(“%lf%lf”, &c, &r); s = c*r; printf(“本金：%.2lf\n”, c); printf(“利息：%.2lf\n”, s); printf(“合计：%.2lf\n”, c+s);

user: user-5
content: 这个直接写不就行了……

user: user-2
content: floor是math.h里面的函数，要包含头 或者用// 后面的那个代码替换 s = ((int）s)/100.0

user: user-6
content: 这道题应该自己做，没有什么技术难点 #include <stdio.h> int main(void) { 	double c = 0, r = 0, s = 0; 	scanf_s("%lf %lf", &c, &r); 	s = c * r / 100; 	printf("本金： % .2lf\n", c); 	printf("利息： % .2lf\n", s); 	printf("合计： % .2lf\n", c + s); 	return 0; }

user: user-0
content: 引用 5 楼 寻开心的回复:有一个问题需要注意 在中国的利率计算， 分之后是截断  不是四舍五入， 123.456 当做123.45.   printf语句输出结果是四舍五入123.46 所以不能直接输出， 还要做结果的转化的 要么是用floor函数，要么自己做一下截断处理的转化  double c=0, r=0, s=0; scanf(“%lf%lf”, &c, &r); s = c*r; s = floor(s) / 100.0;  // s = ((int) s)/100; printf(“本金：%.2lf\n”, c); printf(“利息：%.2lf\n”, s); printf(“合计：%.2lf\n”, c+s);  不过，这是到测试题， 也许不用这样。 大佬不行哦，在pta上一提交就显示错误
user-0 提问: 初学者，想请问在c语言中 for循环内有scanf语句，为什么不能自己输入

回复:
user: user-0
content: 引用 3 楼 自信男孩 的回复:#include <stdio.h> int main() {     int i;     int a[]={0,1,2,3,4,5,6,7,8,9,10};     int number;     scanf("%d",&number);     if (number > sizeof(a)/sizeof(a[0]))         number = sizeof(a)/sizeof(a[0]);     for(i=0;i<number;i++){         scanf("%d",&a[i]);         printf("%d",a[i]);     }     return 0; } 供参考～ 代码基本上没问题，注意number输入的值，若输入0，那么是不会进入循环的。当然也不能输入大于sizeof(a)/sizeof(a[0])的值，因为会导致数组越界。谢谢

user: user-1
content: #include <stdio.h> int main() {     int i;     int a[]={0,1,2,3,4,5,6,7,8,9,10};     int number;     scanf("%d",&number);     if (number > sizeof(a)/sizeof(a[0]))         number = sizeof(a)/sizeof(a[0]);     for(i=0;i<number;i++){         scanf("%d",&a[i]);         printf("%d",a[i]);     }     return 0; } 供参考～ 代码基本上没问题，注意number输入的值，若输入0，那么是不会进入循环的。当然也不能输入大于sizeof(a)/sizeof(a[0])的值，因为会导致数组越界。

user: user-2
content: 你输入完要输入的数字后按了回车确认，回车键也是会算到你输入的字符中的。比如你要输入 5，实际输入的就是 5 \n。scanf读取完5后 ，\n还留在缓冲区里。

user: user-3
content: 如何解决呢

user: user-4
content: scanf("%d\n",&number);试试这样
user-0 提问: C语言：中缀表达式转后缀表达式并进行逆波兰求值（可以输入小数）？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 用double存数值就可以了吧
user-0 提问: 大佬来瞧瞧，基础问题书上没有他还考的题

回复:
user: user-1
content: 顾名思义， 可以理解成 C++是C的升级版。

user: user-2
content: 引用 2 楼 ?Victor.?? 的回复：[quote=引用 1 楼 與蘤舊縐 的回复:] 条件都没给全，难道还是个论述题  所以说教育出现了问题[/quote]肯定选b的……这有啥歧义码？

user: user-3
content: 强行可以，那没什么好说的，免得给你带沟沟里

user: user-0
content: 引用 1 楼 與蘤舊縐 的回复:条件都没给全，难道还是个论述题  所以说教育出现了问题

user: user-3
content: 条件都没给全，难道还是个论述题
user-0 提问: 不懂

回复:
user: user-0
content: 引用 2 楼 寻开心的回复:看一下ASCII表， 常见的空白字符， 空格，tab和回车当中， 空格的ascii值最大 所以第一个while可以把这些值都过滤掉 从第一个while退出的时候， ch里面已经有了一个值， 这个值已经是大于空格的ascii了 所以直接进入第二个while的循环，第二个while循环急需提取字符，直到遇到一个ascii小于等于空格的字符为止

user: user-1
content: 看一下ASCII表， 常见的空白字符， 空格，tab和回车当中， 空格的ascii值最大 所以第一个while可以把这些值都过滤掉 从第一个while退出的时候， ch里面已经有了一个值， 这个值已经是大于空格的ascii了 所以直接进入第二个while的循环，第二个while循环急需提取字符，直到遇到一个ascii小于等于空格的字符为止

user: user-2
content: ascll码，因为小于空格的都是控制符。这里主要过滤的是\n
user-0 提问: c语言程序运行半路停止，编译器没有显示错误和警告，什么地方出错了，求指点。。。

回复:
user: user-1
content: while(!feof(fp)) 判断不了连续3个读操作，比如 c_num时候读成功，此时已经到文件结尾了，下一个c_name就出错了。所以可以用fscanf的返回值来判断，然后break循环

user: user-2
content: void app(void) { FILE *fp; struct career *p; if((fp=fopen("car.text","r"))==NULL) { printf("打开失败!\n"); exit(1); } while(!feof(fp)) { fscanf(fp,"%s\n",p->c_num); fscanf(fp,"%s\n",p->c_nam); fscanf(fp,"%s\n",p->c_car); printf("%s\n%s\n%s\n",p->c_num,p->c_nam,p->c_car);  对于p这个野指针， 没有初始化， 鬼知道p指向哪儿去了
user-0 提问: 合并中文TXT文件的问题

回复:
user: user-1
content: 引用 6 楼 Kalasapower 的回复:[quote=引用 2 楼 gouyanfen的回复:]明显编码不对，一个是gbk,一个是utf8 对对对，就是这个编码问题，请问怎么解决[/quote] 转为统一的格式再存回去了解一下这个函数WideCharToMultiByte

user: user-0
content: 引用 2 楼 gouyanfen的回复:明显编码不对，一个是gbk,一个是utf8 对对对，就是这个编码问题，请问怎么解决

user: user-0
content: 引用 1 楼 user-3的回复:你不贴代码出来，没人愿意看图说话的 哈哈，昨天糊涂了

user: user-0
content: 引用 楼主 Kalasapower的回复:C语言中合并两个中文txt文件时，第二个中文txt文件变成了乱码，求大佬帮忙指点 #include "stdio.h" #include "stdlib.h" int main() { 	FILE *fp1, *fp2; 	char ch; 	if ((fp1 = fopen("C:\\Users\\DELL\\Desktop\\3.txt", "wt+")) != NULL) 	{ 		if ((fp2 = fopen("C:\\Users\\DELL\\Desktop\\1.txt", "rt+")) != NULL) 			for (; (ch = fgetc(fp2)) != EOF;) 				fputc(ch, fp1); 		fclose(fp2); 		if ((fp2 = fopen("C:\\Users\\DELL\\Desktop\\2.txt", "rt+")) != NULL) 			for (int i = 0; (ch = fgetc(fp2)) != EOF; i++) 				fputc(ch, fp1); 		fclose(fp2); 		fclose(fp1); 	} 	printf("\n"); 	system("pause"); 	return 0; }

user: user-2
content: 找一个读二进制的工具，看一看。

user: user-1
content: 明显编码不对，一个是gbk,一个是utf8

user: user-3
content: 你不贴代码出来，没人愿意看图说话的
user-0 提问: 大佬们救救我吧

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 3 楼 ?Victor.??的回复:sleep作用这是暂停，不是终止 这两个sleep作用不一样呀 sleep(snake speed)应该是让食物停留一段时间 sleep(5000)是让游戏分数显示5秒钟之后再出来“按任意键退出……那堆东西” 哦哦，感谢感谢

user: user-2
content: sleep作用这是暂停，不是终止 这两个sleep作用不一样呀 sleep(snake speed)应该是让食物停留一段时间 sleep(5000)是让游戏分数显示5秒钟之后再出来“按任意键退出……那堆东西”

user: user-0
content: 引用 1 楼 ?Victor.??的回复:让程序运行暂停5秒钟 不是已经有了Sleep（snake speed）了吗，那个Sleep（5000）不就没用了吗，不是很懂

user: user-2
content: 让程序运行暂停5秒钟
user-0 提问: 怎么实现这种参数先展开的宏定义？

回复:
user: user-1
content: int ucT1 = 2; int ucT2 = 6; #define     mT1AndT2    ucT1, ucT2 #define     And(x, y)      x &= y #define wraperAnd(arg) (And(arg)) #include <iostream> using namespace std; int main(){     cout << wraperAnd(mT1AndT2) << endl; }  打包一下就可以了

user: user-2
content: 注意等价替换，括号也会替换进去。所以只有一个参数～

user: user-3
content: 在宏体中，如果宏参数前加个#，那么在宏体扩展的时候，宏参数会被扩展成字符串的形式。

user: user-4
content: 宏的展开顺序是从外向里的， 和函数都调用的从里向外的顺序是反的 你这个想法不行

user: user-0
content: 可能表达的不清楚。只是举了个简单的例子。 实际是有很多的要这样执行。 unsigned char ucT1;  unsigned char ucT2; unsigned char ucT3; unsigned char ucT4;  #define     mT1AndT2    (ucT1, ucT2) #define      mT1AndT3    (ucT1, ucT3) #define      mT1AndT3    (ucT1, ucT4)  #define     And(x, y)      x &= y  #define     Or(x, y)      x |= y  main()  {      And(mT1AndT2);      Or(mT1AndT2);      And(mT1AndT3);  }

user: user-4
content: unsigned char ucT1; unsigned char ucT2; #define     mT1AndT2    (ucT1)&(ucT2) 直接这样就好了
user-0 提问: 这个warning: left-hand operand of comma expression has no effect是怎么回事？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: warning: left-hand operand of comma expression has no effect [-Wunused-value] 这里明确的告诉你了， 逗号表达式

user: user-2
content: 逗号也是合法的表达式， 编译器给你这样的提示，够意思啦   所以不能忽略编译器的任何警告呢 养成0警告编程的习惯是必要的

user: user-2
content: double lAX = sqrt(pow( (n*(A.y-camera.y)-m*(A.z-camera.z) ), 2)                           + pow( ( l*(A.z, camera.z)-n*(A.x-camera.x) ), 2)                           + pow( (m*(A.x-camera.x)-l*(A.y-camera.y)), 2));    // Only Formula's step I 这里是 A.z - camera.z 吧
user-0 提问: 求大佬看看！

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 引用 1 楼 qq_46382116 的回复:这个是之前一个大佬写的，看了我还是不会写  所以，还是要自己写， 然后别人帮你改错误 否则，结果还是这样 最终就是找人要完整的源码  那还学个屁啊

user: user-0
content: 这个是之前一个大佬写的，看了我还是不会写
user-0 提问: 请问#define 和 typedef有什么区别

回复:
user: user-1
content: type就是类型的意思，typedef就是type-define，可以理解为用于类型的定义

user: user-2
content: #define是替换 typedef是别名  #define int INT 不能把基本数据类型替换了 typedef int INT 但是可以给基本数据类型赋予一个别名  #define是预处理语句，是在编译之前完成替换的，因此可以作为编译开关使用。 typedef是语言的关键字，参与编译，可以像extern一个变量那样，参与编译（这个是我脑补的）  书里一般的介绍是。 #define INT 0 可以作用于数值 typedef int 0 只能用于类型替换  然而#define INT int * 无法实现较为复杂的类型替换 而typedef int * INT 可以方便的简化复杂类型  我估计更重要的区别可能是宏函数和函数指针的区别，这两者各有优缺点。
user-0 提问: C语言基础题出现错误，想了好久，求各位大佬纠错

回复:
user: user-1
content: while (scanf("%3s", a)!=EOF)  //用%s, 并且提供数组长度: 详情查阅scanf官方文档

user: user-0
content: tql，真大佬 已关注666

user: user-2
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-3
content: 引用 1 楼 Dreamypurple 的回复:想起来了，加一个getchar()就可以了，如果哪位大佬能解释一下getchar()这个函数，分就给您了谢谢~ %c是会匹配'\n'即换行符的，所以会出现楼主的现象

user: user-4
content: while(scanf("%c%c%c",&a[0],&a[1],&a[2])!=EOF)，还剩一个\n在缓冲区里

user: user-5
content: getchar()就是接收一个字符，包括空格，回车

user: user-0
content: 想起来了，加一个getchar()就可以了，如果哪位大佬能解释一下getchar()这个函数，分就给您了谢谢~
user-0 提问: 关于sqrt有多个重载函数问题的解决方案

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 定一个double类型的就完事儿了 第一种情况，无需处理， 函数都参数可以是表达式， 计算完结果后再传值进去的 第二种情况， 参事是double类型， 你传参给他float类型，编译器会自动做类型转换的
user-0 提问: 请问double x=-b/(2*a)与 x=(-1*b)/(2*a)、x=(0-b)/(2*a)有什么区别

回复:
user: user-0
content: 引用 4 楼 m0_46108109 的回复：负号的优先级比算术优先级低？可是我感觉，无论先取负再计算还是先计算再取负，结果都没区别吧？

user: user-0
content: 引用 3 楼 寻开心 的回复：abc是什么类型？ abc如果是整数类型，那么 -b/(2*a) 和 -1.0*b/(2*a)是有区别的， 前者是整数处罚，结果只是整数， 后者才是浮点数的触发 但是 -b/(2*a) 和 （0-b)/(2*a)没区别， 除非是(0.0-b)/(2*a); 才有整数和浮点数的区别abc都是浮点数类型……

user: user-1
content: 负号的优先级比算术优先级低？

user: user-2
content: abc是什么类型？ abc如果是整数类型，那么 -b/(2*a) 和 -1.0*b/(2*a)是有区别的， 前者是整数处罚，结果只是整数， 后者才是浮点数的触发 但是 -b/(2*a) 和 （0-b)/(2*a)没区别， 除非是(0.0-b)/(2*a); 才有整数和浮点数的区别
user-0 提问: 编程

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:你打了断点，停在第一行了，按f11编译运行，f5是调试 好的😄谢谢

user: user-2
content: 你打了断点，停在第一行了，按f11编译运行，f5是调试
user-0 提问: 救急！！！

回复:
user: user-0
content: #include<iostream> using namespace std; int main() { 	int n,m,a[10001]={},i,j,b,max=-1,max_1[10001],sum=0; 	cin>>n>>m; 	for(i=1;i<=n;i++)     {     	for(j=1;j<=m;j++)     	{     		cin>>b;     	    a[b]++; 		} 	} 	for(i=1;i<=n;i++) 	{ 		if(a[i]>max) max=a[i]; 	} 	for(i=1;i<=n;i++) 	{ 		if(a[i]==max) max_1[++sum]=i; 	} 	for(i=1;i<=sum;i++) 	{ 		cout<<max_1[i]<<" "; 	} 	return 0; }

user: user-1
content: 鬼知道你那个测试数据要考虑多少种合法和非法的选票情况 这种题本来就是给练手的，一个不行，还继续第二题？！ 自己玩儿去吧

user: user-0
content: 代入范例是对的，但AC不了，只有60分

user: user-0

user: user-1
content: #include<stdio.h> #include <string.h> #include<stdlib.h> #define MAXN 1010  int vote[MAXN]; int choices[MAXN]; int main() {     int N, M, i, j;     scanf("%d%d", &N, &M);     for (i=0; i<N; i++) {         memset(choices, 0, sizeof(choices));         for ( j=0; j<M; j++) {             int choice;             scanf("%d", &choice);             if ( choice <1 ||  choice >N ) continue; //无效的票             choices[choice]++;              if (choices[choice]>1 ) break;//             // 一个人，给另外一个人投了多次票， 比如这一行数据是1 1 1 这样的情况             // 如果不需要处理这种情况，注释掉这行即可         }         if ( j==M) {             for ( j=0; j<N; j++ )                 vote[j] += choices[j];         };     }     int maxChoice=vote[1];     for (i=2; i<N; i++)         if ( vote[i] > vote[maxChoice]) maxChoice = i;     for ( int i=1; i<N; i++)         if ( vote[i] == vote[maxChoice])             printf("%d ", i);     return 0; }
user-0 提问: 大佬们请问这个怎么改呀，纯小白。。。

回复:
user: user-1
content: #include <stdio.h> void printf_jisuan(int, int); int main (void) { int x,sum; sum = 5; printf("游戏开始\n"); printf("石子的总数目为：%d\n",sum); printf("请玩家输入取出的石子数目："); scanf("%d",&x); printf_jisuan(x, m); return 0; } void printf_jisuan(int x, int sum); // int *a ,int *sum) { if (x>3 || x < 1) printf("输入错误，请重新输入\n"); else  sum=sum-x; { if(sum>0) printf ("石子的数目为：%d\n",sum); printf_jisuan(x, sum); if(sum == 0) printf ("游戏结束，胜利"); else printf ("输入的石子数目过大，请重新输入\n"); printf_jisuan(x, sum); } }  这么改能让编译通过， 但是你这个printf_jisuan函数都逻辑太高深了，看不懂是个什么玩儿法
user-0 提问: 救救孩子吧

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 1 楼 寻开心的回复:scanf("%lf,%d,%lf", &rate, &n, &capital); 你这是要求输入0.00225，10，1000 输入时候中间的逗号不能省略 谢谢大哥 我晓得了

user: user-2
content: 要么输入0.00225，10，1000 要么改scanf("%lf,%d,%lf", &rate, &n, &capital);为scanf("%lf%d%lf", &rate, &n, &capital);

user: user-2
content: scanf("%lf,%d,%lf", &rate, &n, &capital); 你这是要求输入0.00225，10，1000 输入时候中间的逗号不能省略
user-0 提问: 为什么会这样啊。而且要两个等于号

回复:
user: user-0
content: 引用 7 楼 穷人没资格上闲鱼的回复:[quote=引用 2 楼 weixin_46294972 的回复：][quote=引用 1 楼 穷人没资格上闲鱼的回复:]这段代码功能不明……若你想对a初始化，就该在第二行用=而不是==，直接写a=10. a没初始化，所以a的值是个随机的没意义的数。 至于第二行，只是判断了a+a是否等于20（判断结果为false，也即0），然后也没把这个判断结果传到哪里，直接执行第三行了。 那怎么修改啊[/quote]你的程序是想干什么呢？想让程序输出不乱码的结果，把第二行改成a=10就行，最后输出的值是10[/quote] 搞好了，懂了谢谢

user: user-1
content: 引用 2 楼 weixin_46294972 的回复：[quote=引用 1 楼 穷人没资格上闲鱼的回复:]这段代码功能不明……若你想对a初始化，就该在第二行用=而不是==，直接写a=10. a没初始化，所以a的值是个随机的没意义的数。 至于第二行，只是判断了a+a是否等于20（判断结果为false，也即0），然后也没把这个判断结果传到哪里，直接执行第三行了。 那怎么修改啊[/quote]你的程序是想干什么呢？想让程序输出不乱码的结果，把第二行改成a=10就行，最后输出的值是10

user: user-2
content: a+a==20这是要做什么？首先根据符号优先级，a+a限制执行，然后再与20比较。最后结果什么也没变化，即a的初始值没有被改变。

user: user-3
content: a+a=20;是想这样吗?如果是，可以这么写:a=20/2;

user: user-4
content: a = 10; 这是赋值， 不是判断a是不是和10相等 a == 10 这是判断 a 和 10是否相等  20  = 10 + a； 这种是非法代码， = 是赋值语句，左边必须是一个变量； 程序还不会自动求等式解方程呢？

user: user-5
content: 局部变量不会有初值，保存的应该是以前堆栈里遗留下来的值，有时候恰好等于0 应该先定义 int a=0；

user: user-0
content: 引用 1 楼 穷人没资格上闲鱼的回复:这段代码功能不明……若你想对a初始化，就该在第二行用=而不是==，直接写a=10. a没初始化，所以a的值是个随机的没意义的数。 至于第二行，只是判断了a+a是否等于20（判断结果为false，也即0），然后也没把这个判断结果传到哪里，直接执行第三行了。 那怎么修改啊

user: user-1
content: 这段代码功能不明……若你想对a初始化，就该在第二行用=而不是==，直接写a=10. a没初始化，所以a的值是个随机的没意义的数。 至于第二行，只是判断了a+a是否等于20（判断结果为false，也即0），然后也没把这个判断结果传到哪里，直接执行第三行了。
user-0 提问: 为什么0X44不是使用%#x

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: %x是按字节对齐来输出16进制的（也就是输出的必然是偶数个数），1个字节有8位，0x44是 0100 0100刚好8位 而0x3不满一个字节（奇数个数），如果用%x，会变成0x03（凑满一个字节 0000 0011），所以要用%#x，一个#代表1个数
user-0 提问: C语言

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: API一般不提供源码，而是只给你函数的声明和文档，在文档中一般包含了这个函数使用的样例。 API一般是后端提供给前端的应用程序接口。

user: user-3
content: 什么样的api，网络的，还是其他的等等。

user: user-4
content: 就是函数的源代码 比如字符串拷贝strcpy，字符串长度strlen等等，各种函数的源代码。 用相应的函数名和源码作为关键字谷歌百度一下吧

user: user-5
content: API=应用程序接口
user-0 提问: 如何在C语言中嵌入汇编语言？

回复:
user: user-1
content: 引用 5 楼 gouyanfen 的回复:引用 4 楼 赤勇玄心行天道 的回复:[quote=引用 3 楼 gouyanfen 的回复:] 你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  [quote=引用 楼主 赤勇玄心行天道 的回复:] 本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！  我也是这么想的，可是有些C语言代码经过编译器编译成汇编后，效率还是低了，我想自己来写这个汇编，而不是让C语言编译器来编译。[/quote] 编译器并不只是需要考虑效率，安全性也是个重要指标，如果你想用汇编重写自己的库函数，那就不要用C写了，直接汇编写，要不你没法绕过编译器，只要用C编译器编译，用C内嵌汇编然后编译会多了一些转换比如堆栈处理之类就达不到你想要的效果了，而且只能针对固定的CPU架构来写,没有通用性。[/quote] 编译器并不只是需要考虑效率，安全性也是个重要指标 是库函数，不是编译器，笔误

user: user-1
content: 引用 4 楼 赤勇玄心行天道 的回复:引用 3 楼 gouyanfen 的回复:你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  [quote=引用 楼主 赤勇玄心行天道 的回复:] 本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！  我也是这么想的，可是有些C语言代码经过编译器编译成汇编后，效率还是低了，我想自己来写这个汇编，而不是让C语言编译器来编译。[/quote] 编译器并不只是需要考虑效率，安全性也是个重要指标，如果你想用汇编重写自己的库函数，那就不要用C写了，直接汇编写，要不你没法绕过编译器，只要用C编译器编译，用C内嵌汇编然后编译会多了一些转换比如堆栈处理之类就达不到你想要的效果了，而且只能针对固定的CPU架构来写,没有通用性。

user: user-0
content: 引用 3 楼 gouyanfen 的回复:你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  引用 楼主 赤勇玄心行天道 的回复:本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！  我也是这么想的，可是有些C语言代码经过编译器编译成汇编后，效率还是低了，我想自己来写这个汇编，而不是让C语言编译器来编译。

user: user-1
content: 你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  引用 楼主 赤勇玄心行天道 的回复:本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！

user: user-0
content: 引用 1 楼 qybao 的回复:那还是需要了解汇编语言的 找本汇编语言的教程先学习吧 那有没有教程讲解C语言嵌入汇编的呢？

user: user-2
content: 那还是需要了解汇编语言的 找本汇编语言的教程先学习吧

user: user-0
content: 引用 10 楼 m0_46108109 的回复:可能是你的句法写的不好，看文章说，C编译出来的代码几乎和汇编一样。 例如++； 你写成i+1，可能效率就低点。  ++和+1是一样的汇编代码，但这个和编译器有很大关系的，不同的编译器结果可能是不同。

user: user-3
content: 可能是你的句法写的不好，看文章说，C编译出来的代码几乎和汇编一样。 例如++； 你写成i+1，可能效率就低点。

user: user-0
content: 引用 8 楼 gouyanfen 的回复:这方面帮不到你什么了，只能看啃汇编语言了 哦，好的，感谢您的回答，我还是先去找找汇编语言的教程吧。

user: user-1
content: 这方面帮不到你什么了，只能看啃汇编语言了

user: user-0
content: 引用 5 楼 gouyanfen 的回复:引用 4 楼 赤勇玄心行天道 的回复:[quote=引用 3 楼 gouyanfen 的回复:] 你这个是个伪命题，优化汇编代码，而完全不懂汇编。 我估计你的意思是用C重写某些函数的源码，不需要懂汇编啊，指令集都是CPU白皮书给出的,优化函数又不是写编译器，只要你写的算法够好安全性没问题就可以，其它的就交给编译器了。  [quote=引用 楼主 赤勇玄心行天道 的回复:] 本人只懂C语言，完全不懂汇编语言，想优化某些C语言函数的汇编代码，但是完全不会入手，好像不同的编译器不同的指令集汇编代码都还不一样，所以请问大家知道有什么书或者教程是专门讲解这块的？感激不尽！  我也是这么想的，可是有些C语言代码经过编译器编译成汇编后，效率还是低了，我想自己来写这个汇编，而不是让C语言编译器来编译。[/quote] 编译器并不只是需要考虑效率，安全性也是个重要指标，如果你想用汇编重写自己的库函数，那就不要用C写了，直接汇编写，要不你没法绕过编译器，只要用C编译器编译，用C内嵌汇编然后编译会多了一些转换比如堆栈处理之类就达不到你想要的效果了，而且只能针对固定的CPU架构来写,没有通用性。[/quote]  我想的就是某些函数用汇编写，某些函数还是用C语言写，我现在就是不知道怎么入手，有没有相关的教程？
user-0 提问: 关于char类型疑惑

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: scanf_s("%c%c%c", &a, 1, &b, 1, &c, 1);  改成这样试试, scanf_s对于%c需要制定长度。

user: user-3
content: scanf_s()用于读取字符串时，必须提供一个数字以表明最多读取多少位字符，以防止溢出。 少一个参数。
user-0 提问: c语言给数组进行选择排序报错

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 引用 1 楼 user-2 的回复：max函数和系统函数同名，改成别的名字如maxind试试对啦，谢谢

user: user-0
content: 哦哦，对啦，谢谢

user: user-2
content: max函数和系统函数同名，改成别的名字如maxind试试
user-0 提问: 两组枚举怎么取巧形成映射

回复:
user: user-0
content: 这种方法解决连续的枚举是不错的方法，处理跳变的枚举有没有更好的方法？

user: user-1
content: 我的看法：     打个比方： { NAME1 = 29， NAME3 = 78，NAME2 = A3} {name3   = 4BC, name1   = 759,name2  =37954} 大写和小写相互映射   这里6个数值你认为程序中要不要存下来？ 如果要，那么到这里我们至少需要6个内存空间大小 那么： array1[3] = { NAME1 = 29，NAME2 = A3，   NAME3 = 78}; array2[4] = {name1   = 759, name2  =37954, name3   = 4BC}; 到这里映射已经自然建立完毕了。  至于啥name1这些和下标的映射就很随意了 如一个枚举 enum { NAME1 = 0, NAME2, NAME3, name1 = 0, ... }names;  也可以define

user: user-0
content: 将两组枚举建立映射表？这方法不巧

user: user-2
content: 搞个map?

user: user-3
content: 支持一楼的办法，建立一个第二种枚举类型的数组， 这个数组的下标刚好就是第一组的枚举值

user: user-0
content: 如果UART2_CMD_T一直是累加1，这个方法还是不错的，但是枚举成员值有跳动，如 EN_UART2_CMD_TEST = 0xF0,那这个方法会浪费内存。

user: user-4
content: 鉴于第一个枚举是从零开始的，可以考虑用数组。下标是输入，值是输出。
user-0 提问: VC编程，求助大佬

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 引用 5 楼 qq_42690590 的回复:我还是用devc++吧 这就对了嘛，明智的选择

user: user-0
content: 我还是用devc++吧

user: user-2
content: 能不用他吗

user: user-0
content: 引用 2 楼 qq_42690590的回复:[quote=引用 1 楼 ?Victor.??的回复:]这个代码好奇怪呀 #include<stdio.h> int main() { printf("hello world"); return 0; } 要是这也不对的话，就是编译器出问题了 就是编译器有问题，该怎么解决呢？[/quote] 我用的VC6.0，好像是要改文件名还是咋的

user: user-0
content: 引用 1 楼 ?Victor.??的回复:这个代码好奇怪呀 #include<stdio.h> int main() { printf("hello world"); return 0; } 要是这也不对的话，就是编译器出问题了 就是编译器有问题，该怎么解决呢？

user: user-2
content: 这个代码好奇怪呀 #include<stdio.h> int main() { printf("hello world"); return 0; } 要是这也不对的话，就是编译器出问题了
user-0 提问: 把结构体放在栈中的用法一般是在什么情况下使用的？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 局部变量 和 函数的实参都是栈对象 动态分配的都是堆对象 还用全局变量和静态变量区呢  大概的位置关系如上图   动态内存是可以开的很大， 但是什么都是不是无限的， 在任何现存系统上都有物理限制

user: user-3
content: 1占用内存不大，2使用完后由栈自动释放，这种情况下可以用dog1

user: user-4
content: 我能想到的。 1.考虑占用空间。如果申请的对象占用内存过大。那么你比如栈里定义char a[999999]; 这个肯定会运行崩溃的。 2.考虑对象的运行生存期。如果想生存期特别长，就用堆内存。
user-0 提问: C语言有个i,i++问题,a=(i++,i)，为什么a不等于i 逗号的顺序不是从左到右吗？

回复:
user: user-0
content: 解决了

user: user-0
content: 那你为什么调试的结果和输出结果不一样呢？

user: user-1
content: 我晕，我是让你只打印a和i，因为这样才能确认逗号表达式的结果 你后来的打印又++i了，i又变了，所以跟逗号表达式没关系了

user: user-0
content: 刚刚发的不好，是这样的

user: user-0
content: 输出的结果和调试的结果不一样

user: user-0
content: 你看看

user: user-1
content: 你打印出来确认了吗？ i只有一次++不可能变到6啊 a=(5, 5) 所以a为5，i也为5

user: user-0
content: 但是结果a=5,i=6这怎么解释 逗号表达式不是先i++，后i，所以a=i a不是应该等于i=5吗 就算是未定义行为两者也应该相等 要么都是6 要么都是5

user: user-0
content: 我懂，我还是等大佬回答吧，你解释不清

user: user-2
content: 你看看逗号表达式的语法规则和计算顺序自然明白，不相等才是对的

user: user-0
content: 我说的是a为什么和i不相等

user: user-2
content: 你自己的++i看不到？
user-0 提问: C语言一个代码不同编译器不同结果

回复:
user: user-1
content: 不同的编译器，参数表达式执行顺序可能不一样，有的从左到右，有的从右到左。你也可以在方法内打印两个参数的地址，看看哪个先压栈哪个后压栈

user: user-2
content: 百度搜一下，未定义行为，c/c++标准并为定义函数参数的求值顺序，这些规则由编译器定义，因此不同编译器可能有不同处理方式，这样的代码尽量不要写

user: user-3
content: 说明代码是错的  完毕
user-0 提问: 关于C语言问件的写入问题

回复:
user: user-1
content: 结贴就是感谢了  引用 9 楼 m0_46078443 的回复:[quote=引用 8 楼 user-1的回复:][quote=引用 7 楼 m0_46078443 的回复:] [quote=引用 5 楼 user-1的回复:]fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout 如果不是文件就直接是stdout对吗？[/quote] 你去仔细看看stdout是个什么东西，本质是一段缓存，他的接口定向就什么设备，就是刷新缓存到设备，可以是文件，可以是终端，也可以是其它硬件。[/quote] 哦好的，大概有些了解了，感谢你呀[/quote]

user: user-0
content: 引用 8 楼 user-1的回复:[quote=引用 7 楼 m0_46078443 的回复:] [quote=引用 5 楼 user-1的回复:]fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout 如果不是文件就直接是stdout对吗？[/quote] 你去仔细看看stdout是个什么东西，本质是一段缓存，他的接口定向就什么设备，就是刷新缓存到设备，可以是文件，可以是终端，也可以是其它硬件。[/quote] 哦好的，大概有些了解了，感谢你呀

user: user-1
content: 引用 7 楼 m0_46078443 的回复:[quote=引用 5 楼 user-1的回复:]fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout 如果不是文件就直接是stdout对吗？[/quote] 你去仔细看看stdout是个什么东西，本质是一段缓存，他的接口定向就什么设备，就是刷新缓存到设备，可以是文件，可以是终端，也可以是其它硬件。

user: user-0
content: 引用 5 楼 user-1的回复:fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout 如果不是文件就直接是stdout对吗？

user: user-1
content: 查资料百度上的并不权威，还是看专业的资料好些。

user: user-1
content: fflush强制缓冲区刷新，stdout是缓冲，文件也是缓冲，你要刷新文件，参数就是文件句柄，或者你重定向了stdout

user: user-0
content: 引用 3 楼 m0_46078443的回复:[quote=引用 2 楼 user-1的回复:][quote=引用 1 楼 m0_46078443 的回复:] [quote=引用 楼主 m0_46078443的回复:]C语言的文件写入是需要在程序结束以后才可以从缓存区将数据写入，我想问问怎么样才可以在程序运行时就写入，fflush(stdout)试过不太行应该是我不会用，望大佬可以指教一下，万分感激 用fclose可以，但我还是比较想知道怎么样fflush来实现[/quote] fflush(文件打开名柄),不是stdout[/quote] 哦，真的也，可我百度的是说fflush(stdout)来输出缓存区数据的呀，这。。。[/quote] 哦，是不是文件就是这样不是文件才是fflush(srdout)

user: user-0
content: 引用 2 楼 user-1的回复:[quote=引用 1 楼 m0_46078443 的回复:] [quote=引用 楼主 m0_46078443的回复:]C语言的文件写入是需要在程序结束以后才可以从缓存区将数据写入，我想问问怎么样才可以在程序运行时就写入，fflush(stdout)试过不太行应该是我不会用，望大佬可以指教一下，万分感激 用fclose可以，但我还是比较想知道怎么样fflush来实现[/quote] fflush(文件打开名柄),不是stdout[/quote] 哦，真的也，可我百度的是说fflush(stdout)来输出缓存区数据的呀，这。。。

user: user-1
content: 引用 1 楼 m0_46078443 的回复:[quote=引用 楼主 m0_46078443的回复:]C语言的文件写入是需要在程序结束以后才可以从缓存区将数据写入，我想问问怎么样才可以在程序运行时就写入，fflush(stdout)试过不太行应该是我不会用，望大佬可以指教一下，万分感激 用fclose可以，但我还是比较想知道怎么样fflush来实现[/quote] fflush(文件打开名柄),不是stdout

user: user-0
content: 引用 楼主 m0_46078443的回复:C语言的文件写入是需要在程序结束以后才可以从缓存区将数据写入，我想问问怎么样才可以在程序运行时就写入，fflush(stdout)试过不太行应该是我不会用，望大佬可以指教一下，万分感激 用fclose可以，但我还是比较想知道怎么样fflush来实现
user-0 提问: 怎么定义一个指针，指向指针数组

回复:
user: user-1
content: 使用typedef定义指针数组为PA，再用PA*定义你需要的内容。 这样做可以降低复杂度。

user: user-0
content: 引用 1 楼 user-2 的回复:**((int *[10])(*p) + 1) = 1; //这样试试 [code=c] #include<stdio.h> int main() {  int i;  int* risks[10];  risks[1] = &i;  int** p;//指向指针数组的指针  p = &risks[0];  **(p + 1) = 1;  printf("%d\n", *risks[1]);  return 0; } 我写成这样了。

user: user-2
content: **((int *[10])(*p) + 1) = 1; //这样试试
user-0 提问: 请大佬指点一个C语言链表的问题

回复:
user: user-0
content: 引用 2 楼 user-1的回复:第一,data没有分配内存，简单点就改为chat data[500],记得初始化为0。 第二，把head=head->next，修改为head=q 已经解决了，谢谢

user: user-1
content: 第一,data没有分配内存，简单点就改为chat data[500],记得初始化为0。 第二，把head=head->next，修改为head=q

user: user-0
content: 快看吐了，水平有限，实在找不出解决办法
user-0 提问: 用base64_decode解析一个加密字符串生成的文本第二个字符是\0

回复:
user: user-0
content: 搞定！搞定！搞定！

user: user-1
content: 引用 楼主 snow_zhao_2017 的回复:用base64_decode解析一个加密字符串生成的文本第二个字符是\0  生成的文本长度是24,我是通过char a[]一个个看发现的，现在我要把这个生成的字符串传给另外一个函数，不知该怎么办 要解密的字符串是这个： YgD/UEZ5oxFGI048BooZIF/HCdrtWSiG 你的问题在于myfunc处理的问题，他接收的参数应该是byte * str,int len,这样才可以在内部处理二进制串，你只给一个参数，遇到0之后就出错了

user: user-2
content: 我怀疑你不知道什么叫二进制。

user: user-2
content: 所谓的二进制数据，就是一连串01组成的字节，具体要看编码与解码是否正确， 只有去判断编码之前和解码之后的数据是否二进制相等。 比如你要把整形3编码，他的二进制数据就是0x00000003,编码为一个base64的字符串，然后解码，看看数据还是不是0x00000003

user: user-0
content: 引用 3 楼 真相重于对错 的回复:[quote=引用 2 楼 snow_zhao_2017 的回复:] [quote=引用 1 楼 真相重于对错 的回复:] base64 是把二进制数据编码为文本数据。反过来它是变成二进制数据，而不是文本。。。。 代码部分是这样的 char * str=base64_decode("YgD/UEZ5oxFGI048BooZIF/HCdrtWSiG"); char * abc=myfunc(str); printf("%s",abc);  -----base64解密其它字符串是正确的，如上面就出错了，不知怎么搞[/quote] 你认为二进制数据是可以打印的？？？？？[/quote]  myfunc调用时的实际参数是解码后字符串的一部分，主要就是myfunc调用不了完整的参数

user: user-2
content: 引用 2 楼 snow_zhao_2017 的回复:[quote=引用 1 楼 真相重于对错 的回复:] base64 是把二进制数据编码为文本数据。反过来它是变成二进制数据，而不是文本。。。。 代码部分是这样的 char * str=base64_decode("YgD/UEZ5oxFGI048BooZIF/HCdrtWSiG"); char * abc=myfunc(str); printf("%s",abc);  -----base64解密其它字符串是正确的，如上面就出错了，不知怎么搞[/quote] 你认为二进制数据是可以打印的？？？？？

user: user-0
content: 引用 1 楼 真相重于对错 的回复:base64 是把二进制数据编码为文本数据。反过来它是变成二进制数据，而不是文本。。。。 代码部分是这样的 char * str=base64_decode("YgD/UEZ5oxFGI048BooZIF/HCdrtWSiG"); char * abc=myfunc(str); printf("%s",abc);  -----base64解密其它字符串是正确的，如上面就出错了，不知怎么搞

user: user-2
content: base64 是把二进制数据编码为文本数据。反过来它是变成二进制数据，而不是文本。。。。
user-0 提问: C语言2个问题

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: puts是遇到'\0'停止输出。e没有'\0'，因此会出现越界。  a[0]。strcpy，肯定会越界的。

user: user-3
content: 引用 6 楼 AKK188888881 的回复:  为什么？为什么第二个不警告？ 第一个编译器知道后面的字符串太长了。 第二个编译器不知道运行时字符串是否太长。  第二个越界读取了字符串，不是不警告，是因为这个警告一直没有纳入C标准，所以有的编译器警告，有的不警告。

user: user-0
content: 为什么？为什么第二个不警告？

user: user-0
content: 改成了printf还存在乱码   #include<stdio.h> #include<string.h>  int main() { 	char c[]={"C program"}; 	char d[]={"Hello"}; 	char e[]={'C',' ','p','r','o','g','r','a','m'}; 	int i; 	for(i=0;i<=4;i++) 		c[i]=d[i]; 	printf("%s\n",c);  	printf("%s\n",e); 	 	return 0; }

user: user-4
content: 另外，这里面的用法gets是不可信的，可以注入非法字符串，产生内存coredump

user: user-4
content: 占用的静态数据分区，由于没有定义结束符，puts实际可能会发生越界访问，这个显示时随机的

user: user-0
content: 为什么超出了5个字节还是不会发出警告？   #include<stdio.h>  int main() { 	char str[5]; 	gets(str); 	puts(str); 	return 0; }

user: user-0
content: #include<stdio.h> #include<string.h>  int main() { 	char c[]={"C program"}; 	char d[]={"Hello"}; 	char e[]={'C',' ','p','r','o','g','r','a','m'}; 	int i; 	for(i=0;i<=4;i++) 		c[i]=d[i]; 	puts(c);  	puts(e); 	 	return 0; }        #include<stdio.h>  int main() { 	char e[]={'C',' ','p','r','o','g','r','a','m'}; //	for(i=0;i<=8;i++) 		puts(e); }       #include <string.h>  int main() { 	char a[0]; 	 	//将"abcd"保存到a中 	strcpy(a,"abcde"); 	//输出a中的字符串 	puts(a); 	//将"1234"保存到a中 	strcpy(a,"1234"); 	//输出a中的字符串 	puts(a); }
user-0 提问: C语言刚开始学的菜鸟，跪求大佬解答一下

回复:
user: user-0
content: 谢谢大佬，抽空耐心解答，真的非常的感谢！

user: user-1
content: 这段代码错误的地方： 1.void GetStudentInfo(int a,stu p[a]) =》函数传递 数组参数 这种写法是错误的。  2. stu networkClass[n]; => 数组不能用变量来定义长度。 将你的代码修改了一下  #include <stdio.h> #define N 40  typedef struct student {     char name[12];     int num;     int score; }stu;  void GetStudentInfo(stu p[], int n) {     int i;     for(i=0; i<n; i++)         scanf("%s%d%d",&p[i].name,&p[i].num,&p[i].score); }  void OutputStudentInfo(stu p[], int n) {     int i;     for(i=0; i<n; i++)         printf("姓名：%s\t学号：%d\t成绩：%d\n", p[i].name,p[i].num,p[i].score); }  int main() {     int i, n;     printf("请输入班级学生数：\n");     scanf("%d", &n);      stu networkClass[N]={0};      printf("请输入学生信息：姓名 学号 成绩\n");     GetStudentInfo(networkClass, n);       printf("\n学生的信息为：\n");     OutputStudentInfo(networkClass, n);       return 0;  }

user: user-2
content: void OutputStudentInfo(int b,stu q[b]) 换成stu *q试试
user-0 提问: 严蔚敏数据结构第八章的边界标识法释放内存空闲右邻区问题

回复:
user: user-1
content: 引用 3 楼 KID6200 的回复:这个之前是我看错了，我忘记是可利用表了，再问个问题，为什么书上说递归看起来十分清晰？虽然很妙但我每次看都要看好久 简单的递归思路可能会很清晰，但复杂的递归还是需要一定想象能力和理解能力的，所以不能一概而论。也就是说具体情况具体分析

user: user-2
content: 引用 3 楼 KID6200 的回复:为什么书上说递归看起来十分清晰？虽然很妙但我每次看都要看好久  很正常， 看别人的东西总是不如自己想的容易 你随便看看别人提问的代码，尤其是关于哪些pta，oj，csp的， 哪一个代码让你能一次看明白的， 尽管都觉得很简单的初级题目  和递归都没啥关系， 什么代码都是别人的看着难 出来工作后就会更认识到这点——每人愿意接别人的项目来修改或者急需， 都想重头再来  道理很简单， 解决问题点方法是不同的，一个问题可以以多种解法， 只要和你的想法不一致，你就看着别扭 听老师讲课不同，那是重头到尾引着你走，一步一步的 而看代码，看到的就是直接到表现，内部的关系都要自己去理解 理解慢一点儿也正常，多看看就好了

user: user-0
content: 这个之前是我看错了，我忘记是可利用表了，再问个问题，为什么书上说递归看起来十分清晰？虽然很妙但我每次看都要看好久

user: user-3
content: 递归只能想一层，不然你大脑会死机的，一层没问题，退出条件没问题就可以不用想了.

user: user-4
content: 应该是不一定相邻。我们看到的内存不是物理内存，而是虚拟内存。是通过mmuy映射过的。  对于链表，相邻的节点的内存不一定是相邻的。

user: user-2
content: 毗邻是链表上的节点之间的毗邻关系，不是内存地址上的 内存地址上的毗邻不能等同于链表上的毗邻 哪怕链表是用数组来实现的，上述说明也是如此 也许初始化的时候链表上节点内存是1234这样顺序放入的，但是通过增删改查之后， 相邻的节点之间在内存上关系就可能是任何的情况，可能是38519，可以是任何的其他的关系。
user-0 提问: 十进制转换为k进制

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 如果余数是大于9，那是不是应该要把这个余数转成一个别的字符？比如16进制，10用A表示，11用B表示等等，大于9的用字母表示。怎么把大于9的余数转成字母，注释里已经说明了
user-0 提问: 求帮

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 到这里找找原因吧 https://blog.csdn.net/qq_45861670/article/details/104015023