Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求优化，测试显示内存超限和段错误，在源代码基础上还能怎么优化？？？

回复:
user: user-1
content: 应该不会超时了吧，再超时就不能用链表了~~   #include<stdio.h> #include<stdlib.h>  typedef struct lnode { 	int data; 	struct lnode *next; } Q; Q* list=NULL;  void push(int s,int v);//压入 int pop(int s);//弹出 int is_empty(int s);//判断栈是否空 void free_list(int n);  int main(void) { 	int T,n,q; 	scanf("%d",&T); 	while(T--) { //几组样例 		scanf("%d%d",&n,&q); //读入栈的个数、行数 		//创建n+1个栈的头结点； 		list=(Q*)malloc(sizeof(Q)*(n+1)); 		//初始化 		for(int i=0; i<=n; ++i) 			list[i].next=NULL; 		int temp=0;	//其中第0个栈用来做临时存储 		int op,s,v,s1;//每一行的数据  		while(q--) { //操作的个数 			scanf("%d",&op); 			if(op==1) { //1操作 				scanf("%d%d",&s,&v); 				push(s,v); 			} else if(op==2) { //2操作 				scanf("%d",&s); 				if(is_empty(s)) 					printf("EMPTY\n"); 				else 					printf("%d\n",pop(s)); 			} else { //3操作 				scanf("%d%d",&s,&s1); 				//链表合并 				if(!is_empty(s1)){ 					Q* p=list[s1].next; 					while(p->next!=NULL)  						p=p->next; 					p->next=list[s].next; 					list[s].next=list[s1].next; 					list[s1].next=NULL; 				} 			} 		}          free_list(n);//释放空间 	} 	return 0; } //用链表来做栈，所以采用头插法。 void push(int s,int v) { 	Q* node=(Q*)malloc(sizeof(Q)); 	node->data=v; 	node->next=list[s].next; 	list[s].next=node; } int pop(int s) { 	Q* p=list[s].next; 	int data=p->data; 	list[s].next=p->next; 	free(p); 	return data; }  int is_empty(int s){ 	return list[s].next==NULL; } void free_list(int n){ 	//把所有的栈都清空 	for(int i=0;i<=n;i++){ 		while(!is_empty(i)) 			pop(i); 	} 	//释放头结点 	free (list); }

user: user-1
content: 这个就是模拟栈的操作就可以了啊~~内存么，用malloc分配哈。  #include<stdio.h> #include<stdlib.h>  typedef struct lnode { 	int data; 	struct lnode *next; } Q; Q* list=NULL;  void push(int s,int v);//压入 int pop(int s);//弹出 int is_empty(int s);//判断栈是否空 void free_list(int n);  int main(void) { 	int T,n,q; 	scanf("%d",&T); 	while(T--) { //几组样例 		scanf("%d%d",&n,&q); //读入栈的个数、行数 		//创建n+1个栈的头结点； 		list=(Q*)malloc(sizeof(Q)*(n+1)); 		//初始化 		for(int i=0; i<=n; ++i) 			list[i].next=NULL; 		int temp=0;	//其中第0个栈用来做临时存储 		int op,s,v,s1;//每一行的数据  		while(q--) { //操作的个数 			scanf("%d",&op); 			if(op==1) { //1操作 				scanf("%d%d",&s,&v); 				push(s,v); 			} else if(op==2) { //2操作 				scanf("%d",&s); 				if(is_empty(s)) 					printf("EMPTY\n"); 				else 					printf("%d\n",pop(s)); 			} else { //3操作 				scanf("%d%d",&s,&s1); 				//先把s1逆序存到temp 				while(!is_empty(s1)) 					push(temp,pop(s1)); 				//在把temp逆序存到栈s 				while(!is_empty(temp)) 					push(s,pop(temp)); 			} 		}          free_list(n);//释放空间 	} 	return 0; } //用链表来做栈，所以采用头插法。 void push(int s,int v) { 	Q* node=(Q*)malloc(sizeof(Q)); 	node->data=v; 	node->next=list[s].next; 	list[s].next=node; } int pop(int s) { 	Q* p=list[s].next; 	int data=p->data; 	list[s].next=p->next; 	free(p); 	return data; }  int is_empty(int s){ 	return list[s].next==NULL; } void free_list(int n){ 	//把所有的栈都清空 	for(int i=0;i<=n;i++){ 		while(!is_empty(i)) 			pop(i); 	} 	//释放头结点 	free (list); }
user-0 提问: 为什么要有位运算，位运算用在什么地方，位运算存在的意义

回复:
user: user-1
content: 为运算在嵌入式开始应用比较多

user: user-2
content: 位运算效率高，在门电路实现的时候，位运算的效率要比加减乘除的效率高多了。

user: user-3
content: 学点硬件或汇编就知道了：当前的计算机都是位运算！差别只是多少位而已

user: user-4
content: 看到不少人说了 所以强调一下  不要用二进制优化程序里面的加减乘除 现代编译器能完成这种程度的优化 手写二进制乘除算是一个不合时宜的炫技行为 十年前可能算是一个技巧  现在不算

user: user-5
content: 除了ls说的，一般在信号控制或嵌入式方面也用的比较广。 还有一些程序优化，用位运算效率更高。比如用异或法找数组重复元素，乘2除2用左移右移，等等。

user: user-6
content: 位运算更快  一点，算法竞赛有一些技巧

user: user-7
content: 位图，哈希，加解密，标志位等等，很多地方都要用

user: user-4
content: 很多地方会用到的 举个例子 处理图片/视频有时候需要把RGB数据转换为BGR数据
user-0 提问: 函数调用

回复:
user: user-0
content: 谢谢哎~看了你的回复，去搜索了scanf_s的用法。知道了错误 应该这样写scanf_s("%s", st,50); scanf_s("%c", &c,1);  引用 2 楼 user-1 的回复:scanf_s的参数和scanf不一样，%s格式要指定长度 另外，尽量别用string这样的特殊单词来定义变量，有的头文件定义了string类型，容易发生歧义

user: user-1
content: scanf_s的参数和scanf不一样，%s格式要指定长度 另外，尽量别用string这样的特殊单词来定义变量，有的头文件定义了string类型，容易发生歧义

user: user-0
content: 为什么呢？？
user-0 提问: 前提是循环链表，实际可运行且结果正确，debug时发现，未初始化的指针tem被默认为指向指针q的指针，为什么呢

回复:
user: user-1
content: 1：   return h->next;//不带头结点 ， 那么，头结点分配的空间如何删除？ 2： 要找 循环链表内容是否相等, 要以先列出个伪代码： for (i = B链表中的每个节点)         for (j = A链表中与 i 相等的每个节点)               以 i, j 作为 B.A链表的临时开头，检测B.A链表是否完全相等。

user: user-0
content: 引用 1 楼 user-1 的回复:未初始化的值是随机的。 实际上，如果此值是在栈上，那么进入函数，栈指针esp产生移动，tem = [esp + N], 原地址值是什么，就是未初始化tem的值。 我debug之后发现确实是像您说的那样，但是我有一个问题很疑惑，在我那个程序里，打开文件直接运行，是可以正确跑的，但是当我一行一行进入函数去debug之后发现，函数是一个无限循环，退出debug之后，程序就不能跑了，也会是无限循环，而且会出现warning，tem未初始化，但是如果不debug就会正常运行，我真的很疑惑 我用的Code Blocks   以下是完整的代码   问题描述：循环链表首尾相连都有头结点，然而在很多时候，当两个循环链表长度相等且构成环以后，可能在内容上完全相等，然而若从头结点开始看这两个循环链表可能不能对应相等。此处给出判断两个循环链表内容是否相等的方法。 然而还有通常做法中从首字母开始比一直到结束看是否相等，然而当待比较的字符串含有多个基准字符串的首字母时，也应从待比字符串多处地方依次比较。 #include<stdio.h> #include<malloc.h> #include<stdlib.h> #define true 1 #define false 0  typedef struct Lnode //定义链表结点的数据结构 {     char data;     struct Lnode *next; }node; node *create()//尾插法构建循环链表不带头结点 {   char x;     node *h, *t;     t = h = (node *)malloc(sizeof(node));     h->next = NULL;      scanf("%c", &x);     while (x !='#')     {         node *s = (node *)malloc(sizeof(node));         s->data = x;         s->next = h->next;         t->next = s;         t = s;         scanf("%c", &x);     }     t->next=h->next;//尾和head->next相连     return h->next;//不带头结点 } int compare(node *A,node*B) {     node *p=A;     node *tem;     node *q=B;     int i=0;     int flag=0;     while(1)     {     	if(q->data!=p->data)             q=q->next;//找到B中与A首字符相等的字符位置     	if(q==tem)//如果试图找出B中每个与A首字符相等时其后所构成的字符串与A比较失败后，     				//B循环一遍后又回到最初开始比较的位置，则整个比较失败，返回失败。          	return false;     	if(q->data==p->data)       		while(1)       		{         		if(p->data!=q->data)         		{ 					i++;            			if(i==1)             			q=tem;//tem记录第一次找到B中与A首字符相等的字符位置             		flag=1;//其后试图第二次找到B中与A首字符相等的字符位置             		break;         		}         		p=p->next;         		q=q->next;      			if(p==A)//如果A链表循环一遍到头值后也未发现不相等的字符则成功         			return true ;       		}      		if(flag==1)      		{         		p=A; 				flag=0;//试图第二次找到B中与A首字符相等的字符位置时让p指向A的头重新与A进行比较      		}     } } int main(void) {     printf("请输入两个字符串以分别以#号结束") ;     node *a=create();     node *b=create();     if(compare(a,b))     printf("两个字符串循环相等为同内容循环链表");     else     printf("两个字符串不循环相等为不同内容循环链表"); }

user: user-1
content: 未初始化的值是随机的。 实际上，如果此值是在栈上，那么进入函数，栈指针esp产生移动，tem = [esp + N], 原地址值是什么，就是未初始化tem的值。
user-0 提问: segmentation fault ，我传进去的指针为什么还要初始化？

回复:
user: user-0
content: 引用 3 楼 user-1的回复:reader(*head);//从数据库读取数据  ==》》这一句调用有问题 reader函数的参数是 *head, head在main中定义了是结构体指针，这里传参应该把*号去掉。 while(head->flag){         head=menu(*head);  ==》这里也一样 对吼，谢谢(*°∀°)=3

user: user-1
content: reader(*head);//从数据库读取数据  ==》》这一句调用有问题 reader函数的参数是 *head, head在main中定义了是结构体指针，这里传参应该把*号去掉。 while(head->flag){         head=menu(*head);  ==》这里也一样

user: user-0
content: 引用 1 楼 user-1的回复:Book *now=head;      ==》这里改成 Book *now = head->next; 试试     Book *temp;     temp=(Book*)malloc(sizeof(Book));     while(fscanf(fp,"%d,%d,%lf",&temp->ISBN,&temp->publishDate,&temp->price)!=EOF){         fscanf(fp,"%s",temp->bookName);         fscanf(fp,"%s",temp->publisher);         fscanf(fp,"%s",temp->author);         now->next=temp;//segmentation fault         temp->next=NULL;         now=now->next;        ==》这里改成 now = temp; 试试看         temp=(Book*)malloc(sizeof(Book));  ==》这里 temp= 改成 temp->next = 试试看         n++;     } 感觉上是这几个地方，试试看 还是一样报错，在函数里面第一个出现head next的地方就会报错

user: user-1
content: Book *now=head;      ==》这里改成 Book *now = head->next; 试试     Book *temp;     temp=(Book*)malloc(sizeof(Book));     while(fscanf(fp,"%d,%d,%lf",&temp->ISBN,&temp->publishDate,&temp->price)!=EOF){         fscanf(fp,"%s",temp->bookName);         fscanf(fp,"%s",temp->publisher);         fscanf(fp,"%s",temp->author);         now->next=temp;//segmentation fault         temp->next=NULL;         now=now->next;        ==》这里改成 now = temp; 试试看         temp=(Book*)malloc(sizeof(Book));  ==》这里 temp= 改成 temp->next = 试试看         n++;     } 感觉上是这几个地方，试试看
user-0 提问: 救救孩子吧

回复:
user: user-1
content: #include<stdio.h> int main() { 	int n, i; 	double h, j, b, a; 	scanf("%d",&n); 	for (i = 1; i <= n; i++) { 		scanf("%lf %lf", &a, &b); 		h = (a - 100)*0.9 * 2; 		j = h * 0.1; 		b = b - h; 		if (b > -j && b < j) { 			printf("perfect!\n"); 		} 		else { 			if (b >= j) { 				printf("fat!\n"); 			} 			else { 				printf("thin!\n"); 			} 		} 	} 	return 0; }  仅供参考
user-0 提问: 从键盘输入n的值，根据n的值，输出三角图案，如n=4时，输出图案如下： *******  *****   ***    *

回复:
user: user-1
content: int main() {  int i,a,n,b,j;  scanf("%d",&n);  for(i=n;i>0;i--)//循环执行次数等于n     {         for(j=0;j<n-i;j++)//输出空格         {              printf(" ");          }         for(j=0;j<2*i-1;j++){//输出*         printf("*");         }         printf("\n");     }     return 0; }   代码简化不香嘛？ 你这分开输出不在一行，难道最后不会多出来一行空格嘛？

user: user-2
content: 是作品展示？
user-0 提问: C 调bug调崩溃了。。。这是为啥？？？

回复:
user: user-1
content: 引用 2 楼 qq_24711751 的回复:vc++6.0 参考以下链接 https://blog.csdn.net/w77_20/article/details/94616321

user: user-2
content: c99还是哪个标准多少前忘了，要求变量声明必须放在最前面。

user: user-3
content: 我也遇到同样的问题了，但是我用的是TC2。不知道是开发环境的问题还是系统不够安全被黑了。

user: user-4
content: 看不出有什么问题，把全部代码这样贴出来

user: user-0
content: 引用 1 楼 qybao 的回复:编译器什么版本？一些老版本编译器要求变量必须在函数的最开头声明  vc++6.0

user: user-1
content: 编译器什么版本？一些老版本编译器要求变量必须在函数的最开头声明
user-0 提问:  if(x!=0)  y=1;  else  y=2;  与（ ）等价。的真假问题

回复:
user: user-1
content: if(x=0) y=2;  这是条语句 x=0 这是个表达式  在c中，x=0的含义并不是将0赋值给x x=0是个表达式，这个表达式的值是0，而将0赋值给x，是这个表达式的副作用。  也就是说并不是，将0赋值给x，然后表达式的值才是0的。 而是表达式的值是0，而x=0，是这个求值过程中的副作用。  那么 if(x=0) y=2;  的含义是，如果表达式的值为真，将2赋值给y 而x=0这个表达式的值，是x=0后的值，也就是永远为假 所以D不对

user: user-2
content: D错在用了=号，比较要用==号
user-0 提问: 这个代码为啥Dev上运行成功VS就不成功

回复:
user: user-0
content: 引用 1 楼 user-1的回复:肯定是你 VSCode 的编译器没安装好。  如果不是，那就是因为两个编译器不同的原因（不过大部分应该一样）。  如果你觉得还不是，那试试这样：  把头文件加上  #include<bits/stdc++.h>  然后把 char * 都改成 string （可能指针内部实现错误吧）。  要是还不行，那我也没办法了，希望得到帮助！ 感谢感谢，解决问题了

user: user-1
content: 肯定是你 VSCode 的编译器没安装好。  如果不是，那就是因为两个编译器不同的原因（不过大部分应该一样）。  如果你觉得还不是，那试试这样：  把头文件加上  #include<bits/stdc++.h>  然后把 char * 都改成 string （可能指针内部实现错误吧）。  要是还不行，那我也没办法了，希望得到帮助！
user-0 提问: vs的_s问题

回复:
user: user-1
content: 要用vs不加_s就把sdl安全检查关了，要不编译不通过。不关必须加_s。

user: user-2
content: 所谓_s ,就是vs 独有，是不对 看一下这个链接吧 https://zh.cppreference.com/w/c/io

user: user-3
content: 引用 2 楼 ?Victor.?? 的回复:就是加_CRT_SECURE_NO_WARNINGS  不用_s  对吗 标准也有安全的函数库啊，不知道的时候可以谷歌百度一下函数的用法，就会有多函数的比较，安全的，非安全的，自己根据需求取舍就好了

user: user-4
content: 不需要，标准c有安全的函数

user: user-5
content: 我一般不用s 使用前先判断长度。

user: user-0
content: 引用 1 楼 qybao 的回复:那是面向windows的函数库，非windows用不了，所以如果考虑到移植，最好用标准的函数库  就是加_CRT_SECURE_NO_WARNINGS  不用_s  对吗

user: user-3
content: 那是面向windows的函数库，非windows用不了，所以如果考虑到移植，最好用标准的函数库

user: user-0
content: 引用 6 楼 真相重于对错 的回复:所谓_s ,就是vs 独有，是不对 看一下这个链接吧 https://zh.cppreference.com/w/c/io  谢谢大佬，明白了，这个网站真不错
user-0 提问: 汉诺塔——要求显示递归的层数

回复:
user: user-1
content: 在递归的参数里加一个 last 表示上次移动的盘子，f 表示递归层数即可。  希望得到帮助，代码自行思考。

user: user-0
content: 嗯嗯 已经做出来了 感谢各位 自己的代码贴上： #include <stdio.h> #include <stdlib.h> int i=1;  int layer=1;  void hanoi(char src, char mid, char dst, int n) { if (n == 1) { printf("第%d步：将%d号盘子从%c移动到%c\n",i++,n, src, dst); printf("返回第%d层\n",--layer); }  else  { printf("调用第一个递归进入第%d层\n",++layer); hanoi(src, dst, mid, n - 1); printf("第%d步：将%d号盘子从%c移动到%c\n",i++,n, src, dst); printf("调用第二个递归进入第%d层\n",++layer); hanoi(mid, src, dst, n - 1); if(layer!=1) printf("返回第%d层\n",--layer); } }  int main(void) { int n; printf("请输入盘子的个数\n"); while (scanf("%d", &n) != EOF)  { 	printf("盘子移动情况如下：\n"); 	hanoi('A', 'B', 'C', n); 	printf("一共需要%d步\n",i-1); } return 0; }

user: user-2
content: 思路挺简单的，就是用一些指针变量记录移动次数，递归层数，和盘子编号就行了 给你写个例子，偷懒了把指针变量改用数组，数组长度也省略了 递归的思路就不说明了，各种汉诺塔的程序都有解释说明，这里解释一下移动次数和递归层数 void han(int n, char a, char b, char c, int *info) {     if (n==1) {         info[0]++; //每次移动时移动次数递增         printf("第%d步: 将%d号盘子从%c移动到%c\n", info[0], info[2]-info[1]+1, a, c); //打印移动情况，盘子编号看main方法解释     } else {         printf("在第%d层调用第一个递归进入第%d层\n", info[1], info[1]+1); //打印第一次调用递归层数         info[1]++; //调用递归前递归层数递增         han(n-1, a, c, b, info); //然后调用递归（在递归结束后，递归层数要记得递减）         printf("返回第%d层\n", --info[1]); //调用递归结束后递归层数递减，然后打印返回层数         info[0]++; //每次移动完时移动次数递增         printf("第%d步: 将第%d号盘子从%c移动到%c\n", info[0], info[2]-info[1]+1, a, c); //打印移动情况         printf("在第%d层调用第二个递归进入第%d层\n", info[1], info[1]+1); //打印第二次调用递归层数         info[1]++; //调用递归前递归层数递增         han(n-1, b, a, c, info); //然后调用递归（在递归结束后，递归层数要记得递减）         printf("返回第%d层\n", --info[1]); //调用递归结束后递归层数递减，然后打印返回层数     } }  int main(int argc, const char * argv[]) {     char a='A', b='B', c='C';     int n, info[3] = {0, 1, 0}; //数组第一个元素是移动次数，第二个是递归层数，第三个是总盘子数（总盘子数-递归层数+1=盘子编号）     printf("请输入盘子个数:\n");     scanf("%d", &n);     info[2] = n; //设定盘子数     printf("盘子移动情况如下:\n");     han(n, a, b, c, info);     printf("共移动了%d次:\n", info[0]);      return 0; }
user-0 提问: 想问一下C语言中怎么把字符型数据转化成ASCII码值来进行运算

回复:
user: user-1
content: 两个字符都用字符接收就好了 scanf("%d%c", &y, &c); 改成 scans("%d %c", &y, &c); //中间加个空格，否则你的空格就被当字符读入了

user: user-2
content: printf("%d\n", 'a');
user-0 提问: 怎么封装动态库的头文件

回复:
user: user-1
content: 引用 2 楼 红毛怪之飞蓬 的回复:那我还是要在新的C.h里inlclude  A.h，但是提供给同事的时候只能提供一个头文件给他  不知道这种对外提供动态库的行业通常封装方式是怎样的 我也觉得你这个设计有点问题，既然调用你的dll只需要C.h，那何必include A和B，你的C.h就应该只放你的dll入口函数声明以及用到的一些结构体声明，具体实现的C.cpp才去include其它相关的A和B，如果C.h的结构体定义需要A和B的结构体，你可以像之前所说的，在C.h声明一下就好了。也就是1L的把include "A.h"放到C.cpp里，然后在C.h里追加A和B的结构体的声明就好了。

user: user-2
content: 如果不让别人看到A.h, B.h，那么就不要在C.h中包含前两个，因为如果包含，只给了C.h，那么对方编译不通过。 所以，把A.h， B.h不要放在C.h里，而是放在.c源文件里，在源文件里引入前两个头文件

user: user-0
content: 引用 1 楼 qybao 的回复:试试看在新的C.h里不要重新定义A和B结构体，只是声明结构体 比如 A.h 有结构体定义 typedef struct A {     int a; } STA;  C.h则改成 struct A; #include "A.h"  这样应该就不会发生重复定义了吧  那我还是要在新的C.h里inlclude  A.h，但是提供给同事的时候只能提供一个头文件给他  不知道这种对外提供动态库的行业通常封装方式是怎样的

user: user-1
content: 试试看在新的C.h里不要重新定义A和B结构体，只是声明结构体 比如 A.h 有结构体定义 typedef struct A {     int a; } STA;  C.h则改成 struct A; #include "A.h"  这样应该就不会发生重复定义了吧
user-0 提问: 能不能解释一个，我看不懂。

回复:
user: user-1
content: 存p年后的本利合计=本金 * (1 + 年利率)^p，如果年利率不是绝对数字而是百分比就要除以100，他的代码就是循环求乘方

user: user-0
content: 引用 3 楼 自信男孩的回复:[quote=引用 2 楼 weixin_46294972 的回复:] [quote=引用 1 楼 自信男孩的回复:]需求呢?代码是根据需求写出来的～ 按年利率r％存入本钱x，存入p年后的本利合计为y=x*((100+r)/100)^p。求y的值[/quote] 那你的p为什么要定义成float类型呢？[/quote] 这是网上的正确答案。我就是看不懂

user: user-2
content: 引用 2 楼 weixin_46294972 的回复:[quote=引用 1 楼 自信男孩的回复:]需求呢?代码是根据需求写出来的～ 按年利率r％存入本钱x，存入p年后的本利合计为y=x*((100+r)/100)^p。求y的值[/quote] 那你的p为什么要定义成float类型呢？

user: user-0
content: 引用 1 楼 自信男孩的回复:需求呢?代码是根据需求写出来的～ 按年利率r％存入本钱x，存入p年后的本利合计为y=x*((100+r)/100)^p。求y的值

user: user-2
content: 需求呢?代码是根据需求写出来的～

user: user-3
content: 本钱x，刚存入没有利息，所以总额y的值就是x中间循环p是年份，循环一次代表一年，因为i是int类型，比较要把p换成同类型，你的p是float，（int）p是把p强制转换成int类型

user: user-4
content: x代表本金，r代表利率，p代表年数，y代表p年后的总金额，是这个意思吧？ y=x，表示最开始总金额和本金一样 for循环表示循环p年，每循环一次计算一次总金额 y*=(100+r)/100 等价于 y = y*(100+r)/100，表示每循环一次，重新计算y， y的计算公式是 总金额 = 元金 + 元金*利率，即 y=y+y*(r/100)=y*(100+r)/100 最后打印y，保留2位小数
user-0 提问: c语言

回复:
user: user-1
content: int i,j,sum=0; //自己建立3*3数组输入数据 for(i=0;i<3;i++){       for(j=0;j<3;j++){             if(i>=j){                 sum+=arr[i][j]; } } }  上三角的特点就是对角线i=j的时候为界限。所以把i>=j，也就是行大于等于列的加起来就好了
user-0 提问: 从屏幕获取两个变量的值和一个算术运算符（+、-、*、/、%），对这两个变量进  行相应的算术运算，输出计算结果，对于其他运算符给出错误信息。

回复:
user: user-1
content: 你放心 都是错的

user: user-2
content: scanf(“%s”, &c)有问题（内存越界），字符串会带有结束符‘\0’，也就是在&c地址的后一个字符被赋值为‘\0’，按照栈内存地址分布，c之后是b，b之后是a，所以‘\0’把b的内存信息修改了，所以你先输入数字的话，后输入的c会修改b的信息，导致结果不对，反过来先输入字符的话，虽然字符修改了b，但后输入的数字又把b改回来了，所以结果正确。 所以正确的做法是”%s”改成”%c”

user: user-0
content: 引用 1 楼 user-3的回复:读入顺序错了啊  一个是先读入字符，再读入数字；  一个是先读入数字，再读入字符。  这肯定不一样啊 那为什么先读入数字运算出来的答案是错的

user: user-3
content: 读入顺序错了啊  一个是先读入字符，再读入数字；  一个是先读入数字，再读入字符。  这肯定不一样啊
user-0 提问: opengl现在是什么情况

回复:
user: user-0
content: 引用 8 楼 帅得不敢出门 的回复:推陈出新是肯定的，  人也是不断学习的， 旧的东西也是一种积累。  那d3d9中有哪些能在d3d12中用啊

user: user-0
content: 引用 5 楼 ggglivw 的回复:你觉得要多少年？还有很多东西用着，不会很快的，就像现在很多祖传代码维护，比如VB这种依然有生存空间。C++做应用开发的软件也很多，就算是维护祖传代码也可以继续生存多年，虽然大家都知道现在用C++开发上层逻辑层应用不好用了。  搞笑，windows上不用c++用什么，都是khronos开发的，我看用不了几年，差不多就像swift淘汰objectivec一样

user: user-1
content: 引用 4 楼 imarshal 的回复:[quote=引用 2 楼 ggglivw 的回复:] 想多了，影响就是以后的招聘会由精通opengl,dx  变成精通  opengl, dx, vulkan  opengl肯定会淘汰，换成metal还差不多[/quote]  你觉得要多少年？还有很多东西用着，不会很快的，就像现在很多祖传代码维护，比如VB这种依然有生存空间。C++做应用开发的软件也很多，就算是维护祖传代码也可以继续生存多年，虽然大家都知道现在用C++开发上层逻辑层应用不好用了。

user: user-0
content: 引用 2 楼 ggglivw 的回复:想多了，影响就是以后的招聘会由精通opengl,dx  变成精通  opengl, dx, vulkan  opengl肯定会淘汰，换成metal还差不多

user: user-0
content: 引用 1 楼 帅得不敢出门 的回复:我们项目目前用opengl，完全被取代夸大了。  问题是这两个现在是同一个开发组

user: user-1
content: 想多了，影响就是以后的招聘会由精通opengl,dx  变成精通  opengl, dx, vulkan

user: user-2
content: 我们项目目前用opengl，完全被取代夸大了。

user: user-2
content: 推陈出新是肯定的，  人也是不断学习的， 旧的东西也是一种积累。

user: user-1
content: 引用 6 楼 imarshal 的回复:[quote=引用 5 楼 ggglivw 的回复:] 你觉得要多少年？还有很多东西用着，不会很快的，就像现在很多祖传代码维护，比如VB这种依然有生存空间。C++做应用开发的软件也很多，就算是维护祖传代码也可以继续生存多年，虽然大家都知道现在用C++开发上层逻辑层应用不好用了。  搞笑，windows上不用c++用什么，都是khronos开发的，我看用不了几年，差不多就像swift淘汰objectivec一样[/quote]  你才是搞笑好吧。谁说windows上就一定要用C++？
user-0 提问: 问一下用C语言编译简单的酒店管理系统怎么做（帮写一下用重谢呀）下面的题是英文的，有意者加一下微信好友：TX00ST

回复:
user: user-0
content: 引用 2 楼 红毛怪之飞蓬 的回复：英文不好，爱莫能助啊，加油！可以用一下有道翻译嘛

user: user-0
content: 引用 1 楼 Mrxlin 的回复：写控制台操作的吗，为什么是英文的练习，国外大学吗？中外合作大学

user: user-1
content: 英文不好，爱莫能助啊，加油！

user: user-2
content: 写控制台操作的吗，为什么是英文的练习，国外大学吗？
user-0 提问: 1.  从键盘输入一行字符，要求输出其相应的密码。密码规则：每个英文字母变成其后的第4个字母，如A变成E, z变成d，非字母字符保持不变.

回复:
user: user-1
content: 貌似某个信息学训练的基础题 自己一行代码不写就要答案有啥意思呢， 能学会什么？

user: user-2
content: #include <stdio.h> #include <ctype.h> #include <string.h>  #define MAX_CHAR_NUM   26  int main() {     char str[100];     int i;      scanf("%s", str); #if 1     i = 0;     while (str[i]) {         if (isupper(str[i]))             str[i] = (str[i] - 'A' + 3) % MAX_CHAR_NUM + 'a';         else if (islower(str[i]))             str[i] = (str[i] - 'a' + 3) % MAX_CHAR_NUM + 'A';         i++;     }     puts(str); #else     int len = strlen(str);     for (i = 0; i < len; i++) {         if (isupper(str[i]))             str[i] = (str[i] - 'A' + 3) % MAX_CHAR_NUM + 'a';         if (islower(str[i]))             str[i] = (str[i] - 'a' + 3) % MAX_CHAR_NUM + 'A';     }     puts(str); #endif      return 0; } 在这个基础上改改吧

user: user-3
content: #include <stdio.h> #include <string.h>  int main(){         char str[100]={};         char dest[100]={};         gets(str);         int len = strlen(str);         int i;         for (i=0;i<len;i++){                 if(str[i]>='a'&&str[i]<='z'){                         dest[i]=str[i]+4;                         if(dest[i]>'z'){                                 dest[i]=dest[i]-'z'+'a';                         }                 }                 //else if{大写情况}                 else{                         dest[i]=str[i];                 }         }         printf("%s\n",dest);         return 0;

user: user-4
content: 判断大小写，然后mod
user-0 提问: 为什么进行加减运算后的结果为0？

回复:
user: user-1
content: printf 不用加 &

user: user-2
content: #include<stdio.h> struct member {     char name[10];     float jiben;     float fudong;     float zhichu;     float salary; }; int main() {     int N,i;     struct member m1[100];     scanf("%d", &N);     if (N > 100)         N = 100;     for (i = 0; i < N; i++)     {         //scanf("%s %f %f %f", &m1[i].name, &m1[i].jiben, &m1[i].fudong, &m1[i].zhichu);         scanf("%s %f %f %f", m1[i].name, &m1[i].jiben, &m1[i].fudong, &m1[i].zhichu);         m1[i].salary = (m1[i].jiben + m1[i].fudong )-m1[i].zhichu;     }     for (i = 0; i < N; i++)     {         //printf("%s %.2f", &m1[i].name, &m1[i].salary);         printf("%s %.2f", m1[i].name, m1[i].salary);         putchar('\n');     } } 供参考～
user-0 提问: printf函数的问题

回复:
user: user-1
content: #define FORMAT "%s C is cool!\n"  则printf(FORMAT,FORMAT);将第一个FORMAT中的"%s"替换为FORMAT(即"%s C is cool!\n") 则输出 %s C is cool!(这是第二个参数的FORMAT内容,包括'\n')  C is cool!(%s被替换了,所以没有)

user: user-2
content: 很好理解呢，第二个FORMAT是对应的%s内容。

user: user-3
content: 第一个format  "%s ...................."//这里的%s是第二个format的内容  第二个里面有%s，所以会先打印一个%s出来
user-0 提问: 如何获取已封装完的函数内部的值

回复:
user: user-1
content: 引用 3 楼 weixin_45985307 的回复:[quote=引用 1 楼 早打大打打核战争的回复:]int multiplication1 () {   // ...   return product; } 需要printf函数先打印然后再得到pro的值，直接return，printf就不执行了[/quote] 把return product放在printf后面就OK了。

user: user-0
content: 引用 1 楼 早打大打打核战争的回复:int multiplication1 () {   // ...   return product; } 需要printf函数先打印然后再得到pro的值，直接return，printf就不执行了

user: user-2
content: int multiplication1 () { int product; int multiplication1A = rand() % 10;                           int multiplication1B = rand() % 10;                          //建立两个随机数 product = multiplication1A * multiplication1B; printf("%d * %d = ?\n", multiplication1A , multiplication1B);//打印问题 return producet; } 方法1  void multiplication1 (int *output) { int product; int multiplication1A = rand() % 10;                           int multiplication1B = rand() % 10;                          //建立两个随机数 product = multiplication1A * multiplication1B; printf("%d * %d = ?\n", multiplication1A , multiplication1B);//打印问题 *output = product; } 方法2 注意方法2需要传一个int类型的变量地址。

user: user-3
content: int multiplication1 () {   // ...   return product; }
user-0 提问: 编写c程序，数组储存5个数，并按照输入的顺序输出

回复:
user: user-1
content: 伪代码（不用数组）  int a,b,c,d,e; cin>>a>>b>>c>>d>>e; printf("%d %d %d %d %d\n",a,b,c,d,e);

user: user-2
content: //参考，自行修改下 #include <stdio.h> #define VALBUFF_LEN	5 double valBuff[VALBUFF_LEN]; int main(int argc, char *argv[]) { 	int i=0; 	int j=0; 	char ret=0; 	double maxVal=0; 	double minVal=0; 	//int valBuff[VALBUFF_LEN]; 	printf("数组最大最小值差值!\n"); 	do{ 		printf("请输入%d个数字!\n",VALBUFF_LEN); 		for(i=0;i<VALBUFF_LEN;i++) 		{ 			scanf("%lf",&valBuff[i]); 			printf("已输入数字:"); 			for(j=0;j<i+1;j++) 			{ 				printf("%lf ",valBuff[j]); 			} 			printf("\n"); 		}  		printf("\n"); 		//清空输入流 		{ 			char c=0; 			while(((c=getchar())!='\n')&&c!=EOF);	 		}  		ret = getchar(); 		putchar(ret);putchar('\n');putchar('\n'); 	}while(ret!='0'); 	return 0; }

user: user-3
content: 基本的操作，看书
user-0 提问: 急急急，求速答

回复:
user: user-1
content: 出现错误有提示的，看看错误的提示，认真对比代码就好了。你多输入了一个大括号。

user: user-2
content: #include<iostream> using namespace std; int main() { cout<<".................."<<endl; return 0; }
user-0 提问: 汉字姓名如何排序？

回复:
user: user-1
content: 汉字有字符编码，是ASCLL的进阶，叫ANSI，你的大脑还在DOS时代

user: user-2
content: 汉字的字符编码是按边旁来排序的

user: user-3
content: char *不管汉字不汉字，只当作字节序列处理，所以可以用strcmp比较大小，如果按汉字拼音或者姓氏笔画排序，需要一个对照表，网上能找到，搜“汉字拼音排序表”

user: user-0
content: 引用 1 楼 早打大打打核战争 的回复:你需要怎样排序？按字符编码排序可以用strcmp，如果需要按拼音或者姓氏笔画排序则需要自己写比较函数汉字还有字符编码吗？ 似乎这个应该用汉语拼音排序。 自己怎么写，如何把汉字和拼音联系起来？

user: user-3
content: 你需要怎样排序？按字符编码排序可以用strcmp，如果需要按拼音或者姓氏笔画排序则需要自己写比较函数
user-0 提问: 一个选择结构的小题目不知道问题出在哪，看了一下午了没看出错误，望指点！！！

回复:
user: user-1
content: 如果搞不清if else对应关系，建议把 { }加上。

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main() {     float x;     int w,y;      scanf("%f%d",&x,&y);      w = y/5 * 2;     if(x<=3) {         printf("%d",10+w);         return 0;     }     if(x<=10) {         y = 10+(x-3)*2;         printf("%d",(int)(y+0.5)+w);         return 0;     }     y=10+2*(10-3)+(x-10)*3;     printf("%d",(int)(y+0.5)+w);      return 0; }  供参考～

user: user-3
content: #include <stdio.h>  int main() {     float a,s;     int b,c,t;     scanf("%f%d",&s,&t);         if(s<=3)             a=10;         else if(s>3&&s<=10)              a=2*s+4;         else             a=3*s-6;         if(t<5)             b=0;         else             b=(t/5)*2;          c=(int)(a+b+0.5);         printf("%d",c);     return 0; 试试这个行不行

user: user-3
content: 12行的else后面要加{      }  到下一个else结束
user-0 提问: 关于C语言出现答案错误求解     输入3个大整数，位数不超过100位，按从小到大的顺序输出这三个整数。要求定义并使用如下函数比较两个大整数的大小。  

回复:
user: user-0
content: 就像这个排序结果就错误了

user: user-0
content: #include<stdio.h> int cmp(char *a,char *b); #include<string.h> #define N 101 int main() {    	char a[N],b[N],c[N];    	gets(a);gets(b);gets(c);    	if(cmp(a,b)==1)    	{    	   if(cmp(a,c)>=0&&cmp(c,b)>=0)//a与c比较     	   {    	   	puts(b);puts(c);puts(a); 		  } 		  else if(cmp(c,b)==-1) 		  {puts(c);puts(b);puts(a); 	      } 	else if (cmp(a,c)==-1)  	{puts(b);puts(a);puts(c); 	 }      } 	if(cmp(a,b)==0) 	{ 		if(cmp(a,c)>=0)    	   {    	   	puts(c);    	   	puts(b);    	   	puts(a); 		  }    	   else if(cmp(a,c)==-1)    	   {    	   	puts(b);puts(a);puts(c); 		  } 	   }   	if(cmp(a,b)==-1) 	{ 		if(cmp(b,c)>=0&&cmp(a,c)>=0)    	   	{  puts(c);puts(a);puts(b);         } 		   else if(cmp(a,c)==-1&&cmp(b,c)>=0) 		   {puts(a);puts(c);puts(b); }  	 	    if(cmp(b,c)==-1)    	   {    	   	puts(a);puts(b);puts(c); 		  } 	}        	return 0;  }   int cmp(char *a,char *b)  {  	int m,n; 	sscanf(a,"%d",&m);  	sscanf(b,"%d",&n);   	if(m>n)  	{ 	 return 1;     }  	else if(m==n)  	{ 	 return 0;     }  	else if(m<n)  	{ 	 return -1;     }  }   运行时输入1 2 3正确，但换成大整数就错误了

user: user-0
content: 引用 3 楼 真相重于对错 的回复:几个问题，第一输入允许负数吗？ 第二、因为你贴的是图，我就没看你的代码， 我这里只把我自己的想法，说一下 3个100位大整数，不能直接用语言自带的整形来处理，所以用字符串， 那么如果第一个问题不允许的化，就是直接比较表示整数的字符串 3个数比大小很简单，主要处理的是比较函数。比较函数肯定是两两相比 先比较两个字符串的长度，长度大的大。 如果一样长，从0到N依次比较，直到分出大小。 如果允许负数。那么把负数的逻辑加进去就可以了。不好意思回复晚了，十分感谢您的回复！！！我用的是sscanf，把字符串直接转成数字，不知道这样会不会造成什么问题，我把代码贴楼下了

user: user-1
content: 直接用strcmp就可以了吧

user: user-2
content: 如果只是单纯的比较输出数，你可以考虑改变变量阿，这样代码会少很多， 比较函数里面改下，如果给定的可以出来if》=0交换值，这样就保证了abc是按照一定顺序排的，你只需要比较好了把对应的数交换到对应的变量里，输出就最后输出一下就行。 你这个有点乱。我眼睛不舒服就不细看了，不过你判断的{} 是不是没有对好?好像有个有6个{5个}

user: user-3
content: 建议直接贴代码，贴图片不好调试～

user: user-4
content: 比较负数的逻辑： 一正，一负，整数大 二负，大小，与我刚才说的整数比较结果相反。

user: user-4
content: 几个问题，第一输入允许负数吗？ 第二、因为你贴的是图，我就没看你的代码， 我这里只把我自己的想法，说一下 3个100位大整数，不能直接用语言自带的整形来处理，所以用字符串， 那么如果第一个问题不允许的化，就是直接比较表示整数的字符串 3个数比大小很简单，主要处理的是比较函数。比较函数肯定是两两相比 先比较两个字符串的长度，长度大的大。 如果一样长，从0到N依次比较，直到分出大小。 如果允许负数。那么把负数的逻辑加进去就可以了。

user: user-0
content: 求帮助啊真的找不到原因了大哭

user: user-0
content: 请看此程序上个忘修改了一部分
user-0 提问: c语言：拼题a提交后运行超时

回复:
user: user-1
content: 发这么多图片，不如直接把代码贴出来～  #include <stdio.h> #include <stdlib.h> #include <time.h>  #define ROW 4 #define COL 5   void init_array(int (*array)[COL], int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             array[i][j] = rand() % 100; }   void show_array(int (*array)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%2d ", array[i][j]);         putchar(10);     } }  void check_saddle_point(int (*point)[2], int (*array)[COL], int row, int col) {     int i, j, k, cnt = 0;     int row_idx, col_idx;     int max_row, min_col;      for (i = 0; i < row; i++) {         max_row = array[i][0];         col_idx = 0;         /* find max value in row */         for (j = 1; j < COL; j++)             if (max_row < array[i][j]) {                 max_row = array[i][j];                 col_idx = j;             }          /* Find min value in col */         min_col = array[i][col_idx];         row_idx = i;         for (k = 0; k < row; k++)             if (min_col > array[k][col_idx]) {                 min_col = array[k][col_idx];                 row_idx = k;             }         /* Check the condition*/         if (row_idx == i && min_col == max_row) {             point[cnt][0] = row_idx;             point[cnt][1] = col_idx;             cnt++;         }      } }  void init_point_array(int (*point)[2], int row) {     int i, j;      for (i = 0; i < row; i++)         for (j = 0; j < 2; j++)             point[i][j] = -1; }  void show_saddle_point(int (*point)[2], int (*array)[COL], int row) {     int i, row_idx, col_idx;      for (i = 0; i < row; i++) {         row_idx = point[i][0];         col_idx = point[i][1];         if (row_idx >= 0 && col_idx >= 0)             printf("鞍点为array[%d][%d] = %d\n", row_idx, col_idx, array[row_idx][col_idx]);     } }  int main(void) {     int array[ROW][COL];     int point[ROW][2];      init_array(array, ROW, COL);     init_point_array(point, ROW);     show_array(array, ROW, COL);     check_saddle_point(point, array, ROW, COL);     show_saddle_point(point, array, ROW);      return 0; } 供参考～
user-0 提问: 求助：向文件写入数据时失败

回复:
user: user-1
content: fopen那里，因为你括号用错了，==优先级高于=，所以先判断fopen==null   此时不等于，所以返回false赋给fp指针也就是fp=0，所以下面写入fp不成功

user: user-1
content: 你的fopen括号用错了吧，还要就是fwrite你写入二进制，你打开文件是不好看里面数据的，会有乱码

user: user-2
content: #include<stdio.h> #include<stdlib.h>  #define N 2  struct Student_type {     int num;     char name[10];     int age;     char addr[25]; }; struct Student_type stud[N];  int main() {     FILE* fp;     int i;     //if((fp=fopen("C:\\Users\\ASUS\\Documents\\C-Free\\practice\\file1.dat","wb")==NULL))     if((fp=fopen("C:\\Users\\ASUS\\Documents\\C-Free\\practice\\file1.dat","wb"))==NULL)     {         printf("Can not open this file!\n");         exit(0);     }     printf("Please enter the student data.The format is:\nNo.\t|Name\t|Age\t|Address\t\n");     for(i=0;i<N;i++)     {         scanf("%d%s%d%s",&stud[i].num,stud[i].name,&stud[i].age,stud[i].addr);         if(fwrite(&stud[i],sizeof(struct Student_type),1,fp)!=1)         {             printf("File write error!\n");         }     }     fclose(fp);     return 0; } 供参考～

user: user-3
content: fwrite函数的返回值是写入的字节数

user: user-4
content: 看你写了两个括号，应该是有考虑到优先级问题，但是写错了

user: user-0
content: 我贴一张格式清楚点的图

user: user-0
content: 引用 1 楼 依旧野指针 的回复:write函数中的参数好好看一下 实在不好意思，能再说清楚点吗，fwrite()四个参数，第一个是一个指针，最后一个是FILE*型的指针，中间两个应该没问题，我感觉类型都对上了啊，实在不知道了...

user: user-3
content: write函数中的参数好好看一下
user-0 提问: c語言中如何依次输入一个字符，且连续输入两个回车符结束输入

回复:
user: user-1
content: #include <stdio.h>  #define STR_LEN     128  int main(void) {     char str[STR_LEN];     int ch1, ch2 = 0, i, j;      i = 0, j = 1;     while (1) {         if (j > i)             printf("input NO.%d character!\n", i+1);         ch1 = getchar();         if (ch1 == 10 && ch2 == 10)    //'\n' == 10             break;         if (ch1 != 10 && i < STR_LEN) {             str[i] = ch1;             i++;             j = i+1;         }         if (ch1 == 10)             j = i;         if (i >= STR_LEN)             break;         ch2 = ch1;     }        return 0; }  供参考～  建议参考这个代码，上面的有点问题～

user: user-1
content: #include <stdio.h>  #define STR_LEN     128  int main(void) {     char str[STR_LEN];     int ch1, ch2 = 0, i;      i = 0;     while (1) {         //printf("Please input NO.%d character!\n", i+1);         ch1 = getchar();         if (ch1 == 10 && ch2 == 10)    //'\n' == 10             break;         if (ch1 != 10 && i < STR_LEN)             str[i] = ch1;         if (i >= STR_LEN)             break;         i++;         ch2 = ch1;     }        return 0; }  供参考～

user: user-2
content: 输入一个字符用getchar(),依次输入用循环就可以了； 想要通过两个回车来结束输入，可以用两个变量来获取，当两个变量同时为回车时跳出循环输入的代码块即可 例如  char ch1 = 'a', ch2 = 'a'; while(ch1 == '\n'&&ch2 == '\n') {     ch1 = getchar();     if(ch1 == '\n' && ch2 != '\n')     {         ch2 = ch1;         ch1 = 'a';     }     if(ch1 == '\n' && ch2 == '\n')         break;     else         ch2 = 'a';  }
user-0 提问: c语言 无符号有符号int类型相加

回复:
user: user-1
content: 先假设 int 和 unsigned int 的数据位(符号位 + 值位)都占 32 位，那么如果有 int a = -10，意味着 a 存的就是 -10(见附注)。如果是从 unsigned int 转换到 int 的话会比较麻烦，但对于从 int 转换到 unsigned int，C 语言定义了一个很简单的办法：观察 int 的值是否为负数，如果不是，保持值不变；如果是，就给这个 int 加上 UINT_MAX + 1，这里即加上 2^32。那么 a + b 自然就变成了 (2^32 - 10) + (5)。  (附注：-10 用补码来看，就是 1111 1111 1111 1111 1111 1111 1111 0110，但不建议这么看负数，除非你确定你的电脑使用的就是补码，而不是反码等其它编码方式，来存储负数)

user: user-2
content: 引用 1 楼 user-4 的回复:没错，你可以用电脑上的计算器试试。 -10 == 1111 .... 0110二进制 -10 +5 = -5 -5的无符号值就是 4294967291 观点和你的不一样的。  注意，符号数和无符号数相加首先是将两个数据类型统一，根据有符号和无符号相加，首先将有符号类型提升到无符号（因为类型向高提升）类型统一之后再计算加法。  -10提升到无符号之后是：4294967286，然后再加上5，正好是:4294967291  注意一个类型隐式提升，提升的方向是更高的，表示范围更大的提升。

user: user-3
content: 符号不同，实现方式不同，内部存储不同，运算封装不同，怎么能相加！

user: user-2
content: 引用 3 楼 m0_46478585 的回复:为什么提升到无符号 是4……286 不是4……306吗 为什么是2^32-10 而不是加10？ int -->unisgned int这是C语言的规定吧

user: user-0
content: 为什么提升到无符号 是4……286 不是4……306吗 为什么是2^32-10 而不是加10？

user: user-4
content: 没错，你可以用电脑上的计算器试试。 -10 == 1111 .... 0110二进制 -10 +5 = -5 -5的无符号值就是 4294967291
user-0 提问: 求c语言大神帮忙！被一道题目（自己的无知）所困扰！

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  int main(void) {     //char* word[100] = { "0" }; // 每个元素为1个单词（char*）     char* word[100] = { NULL }; // 每个元素为1个单词（char*）     char str[1000] = { 0 }; // 字符串     int str_len = 0, flag = 1;     int index = 0;      fgets(str, 1000, stdin);      str_len = strlen(str) - 1; // 删去换行符     str[str_len] = 0;      word[index] = str;     for (int i = 0; i < str_len; i++)     {         if (str[i] == ' ' || str[i] == '\n') {             if (flag)                 index++;             flag = 0;             str[i] = 0;         } else if (flag == 0) {             word[index] = &str[i];             flag = 1;         } #if 0         if (str[i] != ' ') // 将每个单词单独存储成一个char*         {             //*(word[index]) = str[i];             word[index] = &str[i];             //word[index]++;         }         else         {             index++;         } #endif     }      for (int i = index+1; i > 0; i--) // 倒序输出     {         printf("%s ", word[i - 1]);     }     putchar(10);      //system("pause");      return 0; } 供参考～

user: user-2
content: char* word[100] = { "0" };// word为char*指针数组，且char*指向的"0"为常量，不可修改。 试试 char[10][100] = {0}; //注意大小是否步够
user-0 提问: C程序在IDE中运行正常，在Shell下用GCC运行异常

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:命令行 * 要转义，不转意的情况下就是当前路径的所有文件，就好你打命令 ls * 一样，查看所有文件 所以要转义输入，或者用双引号括起来，即 输入 2 3 4 + \* 或者 2 3 4 + "*" 谢谢老师火眼金睛，问题解决

user: user-1
content: 命令行 * 要转义，不转意的情况下就是当前路径的所有文件，就好你打命令 ls * 一样，查看所有文件 所以要转义输入，或者用双引号括起来，即 输入 2 3 4 + \* 或者 2 3 4 + "*"
user-0 提问: switch问题

回复:
user: user-1
content: 多说一句，简单代码贴图，无所谓，复杂代码最好贴源码，难道你要问人问题，还要麻烦别人再敲一编代码？

user: user-1
content: 你下边的是错误的，因为8月要算的是前7个整月+8的，而不是8个整月+8的

user: user-1
content: 他那么写可以。

user: user-0
content: 引用 7 楼 真相重于对错的回复:我没听懂你在问什么？ 第一个程序没有break,那么比如你输入12，依次执行下面所有的语句， 第二个程序，有break,所以你输入12只执行case 12 到 break;之间的代码 那第一个程序是不是错了，问题是要求2008年8月第8天是那一年第几天

user: user-1
content: 我没听懂你在问什么？ 第一个程序没有break,那么比如你输入12，依次执行下面所有的语句， 第二个程序，有break,所以你输入12只执行case 12 到 break;之间的代码

user: user-0
content: 引用 3 楼 自信男孩的回复:switch case需要和break配合使用的 switch语句不是符合就可以执行吗。为什么第一个程序不要break啊。月份是8。不是直接执行8那个语句吗。就是date+=31然后date之前定义为0那个算出来不是31吗

user: user-0
content: 引用 1 楼 真相重于对错的回复:没有break，顺序执行 第一张图片不是我的程序。我就是想问一下。那个月份为什么要倒过来。12了再11在往后这么写

user: user-0
content: 引用 2 楼 ?Victor.??的回复:因为你第一个程序没有break， 从上往下 是逐条执行的， 我的是有break的那个

user: user-2
content: switch case需要和break配合使用的

user: user-3
content: 因为你第一个程序没有break， 从上往下 是逐条执行的，

user: user-1
content: 没有break，顺序执行

user: user-4
content: 引用 6 楼 weixin_46294972 的回复:[quote=引用 3 楼 自信男孩的回复:]switch case需要和break配合使用的 switch语句不是符合就可以执行吗。为什么第一个程序不要break啊。月份是8。不是直接执行8那个语句吗。就是date+=31然后date之前定义为0那个算出来不是31吗[/quote] 执行完8那条语句后没有break,会继续执行7，6，5，4.。。的语句，每月天数加起来

user: user-5
content: 引用 11 楼 真相重于对错 的回复:多说一句，简单代码贴图，无所谓，复杂代码最好贴源码，难道你要问人问题，还要麻烦别人再敲一编代码？ 复制粘贴不是比上传图片更省心吗，非得贴个图片
user-0 提问: 输入一系列的数字和字符，但只输出字符，为什么输出的是问号

回复:
user: user-0
content: 引用 1 楼 lin5161678 的回复:有中文逗号了哈哈哈，一直找问题找了半天，原来是中文标点输入，谢谢，问题解决

user: user-1
content: 有中文逗号了

user: user-2
content: 多说一句，scanf的时候，最好不要加额外的分隔符，否则在输入的时候很容易出问题
user-0 提问: 运行程序时NTL报语法错误

回复:
user: user-1
content: 人家那是c++代码，你的是c

user: user-0
content: 这是报错的一部分代码，就是直接在官网下载的NTL

user: user-2
content: 贴代码吧。  可能是在形参里加了&,C 语言不支持形参前加&（引用）的，C++支持这样的语法～
user-0 提问: 结构数组

回复:
user: user-1
content: ->符号，必须跟在指针类型数据后 p[0] 数组方式不是指针。

user: user-2
content: VS2015 C++环境  应该没问题啊

user: user-3
content: #include<stdio.h>  struct date { //定义结构     int year;     int month;     int day; };  struct date* get(struct date*p);  int main() {     struct date dates[]={{2020,03,28},{2020,03,29},{2020,03,30}}; //定义结构数组并初始化     struct date*p=dates; //定义一个类型为struct date类型的指针并将数组的第一个单元的值赋给指针     int i;     for(i=0;i<sizeof(dates)/sizeof(dates[0]);i++){ //遍历输出数组中的结构值         //printf("%d-%d-%d",p[i].year,p[i].month,p[i].day);         printf("%d-%d-%d",(p+i)->year, (p+i)->month, (p+i)->day);     }     return 0; } 这样就可以用-> p[i]等价dates[i];
user-0 提问: c语言。  有符号和无符号。补码原码 还有赋值问题 求解

回复:
user: user-1
content: 5化成二进制是0101，它的补码是1010，再加1是1011，%u是输出整型，所以是32位，即1111 1111 1111 1111 1111 1111 1111 1011,所以是 4294967291

user: user-2
content: -5 原码 00000101 ，补码11111011，扩展到32位，就是1111，1111，1111，1111，1111，1111，1111，1011 所以按32位无符号数打印就是你看到的， 如果按有符号的则是-5 也就是说32位的-5，二进制就是1111，1111，1111，1111，1111，1111，1111，1011

user: user-2
content: %u 按无符号32位数计算 负数按补吗表示，补码的计算就是，按位取反+1，然后最高位置1
user-0 提问: 求解答else printf("%d\n", days[m-1]); 是怎么输出正确结果的，我不是很懂

回复:
user: user-1
content: m==2，这说明月份是从1开始，但是数组下表是从0开始的。所以1月份的天数对应的数组是days[0]

user: user-2
content: days[12]->days[0]到days[11]

user: user-3
content: 数组下标是从0开始  m-1对应m月

user: user-4
content: 显示的是月份而数组下标第一个数是0
user-0 提问: 三个字符串的排序，我错到哪里了？

回复:
user: user-0
content: 引用 2 楼 chxchxkkk 的回复:第三个判断应该是 a c比较吧，你写成和第一个判断一样的了 if(strcmp(a,b)){         strcpy(temp,a);         strcpy(a,b);         strcpy(b,temp); 不是的，必须是对比a和b，因为如果c<b的话b处已经是c的值了。 比如321，对比ab得231，对比bc得213，之后一定是对比ab而不是ac

user: user-0
content: 引用 1 楼 ?Victor.?? 的回复:#include<stdio.h> #include<string.h> int main() { 	char a[128],b[128],c[128],temp[128]; 	scanf("%s",&a); 	scanf("%s",&b); 	scanf("%s",&c); 	if(strcmp(a,b)>0){ 		strcpy(temp,a); 		strcpy(a,b); 		strcpy(b,temp); 	} 	if(strcmp(b,c)>0){ 		strcpy(temp,c); 		strcpy(c,b); 		strcpy(b,temp); 	} 	if(strcmp(a,b)>0){ 		strcpy(temp,a); 		strcpy(a,b); 		strcpy(b,temp); 	} 	puts(a); 	puts(b); 	puts(c); 	return 0; } 试试这个 判断条件应该>0吧，查一下strcmp用法 以为这个表达式会直接返回正数，然后if就成立了。。。

user: user-1
content: 第三个判断应该是 a c比较吧，你写成和第一个判断一样的了 if(strcmp(a,b)){         strcpy(temp,a);         strcpy(a,b);         strcpy(b,temp);

user: user-2
content: #include<stdio.h> #include<string.h> int main() { 	char a[128],b[128],c[128],temp[128]; 	scanf("%s",&a); 	scanf("%s",&b); 	scanf("%s",&c); 	if(strcmp(a,b)>0){ 		strcpy(temp,a); 		strcpy(a,b); 		strcpy(b,temp); 	} 	if(strcmp(b,c)>0){ 		strcpy(temp,c); 		strcpy(c,b); 		strcpy(b,temp); 	} 	if(strcmp(a,b)>0){ 		strcpy(temp,a); 		strcpy(a,b); 		strcpy(b,temp); 	} 	puts(a); 	puts(b); 	puts(c); 	return 0; } 试试这个 判断条件应该>0吧，查一下strcmp用法
user-0 提问: 求解，为什么代码检查没有错误运行出来啥也没有

回复:
user: user-1
content: 你要用循环来加，如果不想用for就想用switch的话，把月份从后往前写，然后把break去掉。因为switch case的机制是从上往下判断，知道遇到满足case的开始执行后面，而一旦开始执行case 那么执行完就会继续往后执行，知道遇到break或switch结束，所以你倒过来写，一月放最后可以达到循环加的效果，会先判断几月，然后从那个月开始往下都加，记得去掉break这样写的花，具体逻辑你想想怎么实现加

user: user-2
content: #include<stdio.h>  void fun(int arr[], int len) { 	arr[0] = 2; 	printf("addr_in_fun:%p\n", &arr); } int main() { 	int year = 2008; 	int month = 8; 	int day = 8; 	int flag;  	int sum = 0; //-----sum赋初值---------- 	if (year % 4 == 0 && year % 100 == 0 || year % 100 == 0 && year % 4 != 0)//---|改为|| 		flag = 1; 	else 		flag = 0; 	for (int i = 0; i < month; ++i)//----添加for循环------------- 	{ 		switch (month) 		{ 		case 1: 			sum = (31); 			break; 		case 2: 			sum = (sum + 28); 			break; 		case 3: 			sum = (sum + 31); 			break; 		case 4: 			sum = (sum + 30); 			break; 		case 5: 			sum = (sum + 31); 			break; 		case 6: 			sum = (sum + 30); 			break; 		case 7: 			sum = (sum + 31); 			break; 		case 8: 			sum = (sum + 31); 			break; //这里没有用8天加，而是用31-23 case 9:sum=(sum+30);break; case 10:sum=(sum+31);break; 		case 11: 			sum = (sum + 30); 			break; 		case 12: 			sum = (sum + 31); 			break; 			  		} 	} //-----------把以下两行代码移至for循环之外--------------------- 	sum -= 23 + flag; //sum-=23的意思是用八月的31-23天就等于8天 	printf("%d年%d月%d日是该年的第%d天", year, month, day, sum); 	return 0; } VS2015 C++环境调试结果

user: user-3
content: 当被测试的变量等于 case 中的常量时，case 后跟的语句将被执行，直到遇到 break 语句为止。 当遇到 break 语句时，switch 终止，控制流将跳转到 switch 语句后的下一行。 不是每一个 case 都需要包含 break。如果 case 语句不包含 break，控制流将会 继续 后续的 case，直到遇到 break 为止。

user: user-4
content: if(year%4==0&&year%100==0|year%100==0&&year%4!=0) 这一句 判断条件 if(year%4==0&&year%100！=0||year%400==0)

user: user-3
content: 结果肯定是错啊，你这个并没有把8月前面几个月的天数相加。 switch里的case只会执行一个。你把break去掉看看会有什么效果

user: user-0
content: 引用 1 楼 冷风1023的回复:printf("%d年%d月%d日是该年的第%d天",year,month,day,sum); 这个打印要放到switch外面才能用打印 我的运行结果也错了

user: user-0
content: 引用 1 楼 冷风1023的回复:printf("%d年%d月%d日是该年的第%d天",year,month,day,sum); 这个打印要放到switch外面才能用打印 好勒好勒谢谢

user: user-3
content: printf("%d年%d月%d日是该年的第%d天",year,month,day,sum); 这个打印要放到switch外面才能用打印
user-0 提问: 我是新手，请问vs2013 出现这种错误怎么改？

回复:
user: user-1
content: 应该是缺少库，建议查一下编译环境，代码没发现什么问题。  唯一的问题应该是浮点数的比较与整型数有区别，需要注意下～  建议搜一下浮点数比较～

user: user-2
content: 没有问题。本身就是这样。 test1.exe的符号文件pdb是能打开的， ntdll.dll等系统文件的pdb是找不到的。除非的你另外去windows中下载的这些符号文件。

user: user-3
content: 这个代码看上去是没有问题的，可以换个编译器试试，比如CFree。
user-0 提问: 为什么输出的内容少个0；

回复:
user: user-0
content: 引用 5 楼 lin5161678 的回复:输出格式 010ld 就可以了 这是什么意思啊？

user: user-1
content: 输出格式 010ld 就可以了

user: user-2
content: 去掉fscanf格式里的数字试试～

user: user-2
content: 建议去掉fscanf中的12数字，8个数字。输出可以用数字，读取的时候建议去掉试试～

user: user-0
content: 那不更麻烦了，还得循环输出

user: user-3
content: 你那个ID用的是长整型变量，通俗地讲也就是一个数字。建议用含有10个元素的一维数组。
user-0 提问: 刚刚学的小白问一下，为什么会出现这个情况

回复:
user: user-1
content: printf（）；中加了& 就变成打印地址了，就不是打印值

user: user-2
content: printf() 中不要加 &符号

user: user-3
content: scanf_s中不要加\n

user: user-4
content: 贴代码图的，我只想给一个提示 把c++的基本语法学好，因为人脑不是电脑，面对图片确实不知道怎么回答
user-0 提问: 两个不相干的C程序放在一个项目中怎么避免重复调用main函数，求解

回复:
user: user-0
content: 刚想到一个办法把不用的main函数注释掉不知道可行吗？

user: user-1
content: 这个是VC6的项目

user: user-1
content: ms的VS系列吧？可以用它的那个功能：把文件加入项目和移出项目，注意后者不是删除文件

user: user-0
content: 我嫌总是建项目不放便，才问的。

user: user-2
content: 先把基本语法学好，不然这样的问题将会此起彼伏。

user: user-0
content: 刚才一个C语言群中大佬说加static变量不知道是怎么实现的

user: user-3
content: 改名 把不用的改成main1,main2.............. 不知道还有没有什么别的高级的方法
user-0 提问: 新人求助：换行输入数字，到0结束

回复:
user: user-0
content: 引用 5 楼 ?Victor.?? 的回复:第三个有点奇怪，是要干什么？  a数组值是1，2，3，4，6，9，13，19.。。。。。  输入b数组的值只是想输出对应的a数组位置的值？ https://www.dotcpp.com/oj/problem1004.html 哈哈，母牛问题

user: user-1
content: 第三个有点奇怪，是要干什么？  a数组值是1，2，3，4，6，9，13，19.。。。。。  输入b数组的值只是想输出对应的a数组位置的值？

user: user-1
content: 引用 3 楼 煮酒老麦 的回复:第三个代码也明白了，因为出现了i++，i的值就已经发生了更改 是的,i++就是控制输入的

user: user-0
content: 第三个代码也明白了，因为出现了i++，i的值就已经发生了更改

user: user-1
content: 第一个 if(a[i]=0){ 改成==，否则是赋值 第二个 int a[5] = {1,1,1,1,1}; 否则{1,0,0,0,0}
user-0 提问: 出现value 3221225477

回复:
user: user-0
content: 谢谢大家帮忙

user: user-1
content: #include<stdio.h> #include<stdlib.h>  typedef struct node{     int height;     struct node *next; }linklist;  linklist *CreateList() {     linklist *head=(linklist *)malloc(sizeof(linklist));     head->next=NULL;     return head; }  void ini(linklist *head,int num) {     linklist *s,*r;     int i;      r = head;     for (i=0;i<num;i++)     {         s=(linklist*)malloc(sizeof(linklist));         if (!s)             exit(0);         scanf("%d",&s->height);         r->next = s;         r=s;     }     r->next=NULL; }  void insert(linklist *head,int h) {     linklist *p,*q,*z;     q = head;     p = (linklist *)malloc(sizeof(linklist));     if (!p)         exit(0);     p->height = h;     while(q->next && q->next->height < h)     {         q = q->next;     }      p->next = q->next;     q->next = p;  #if 0     if (q->next==NULL)     {         q->next=p;         p->next=NULL;     }     else     {         z=q->next;         q->next=p;         p->next=z;     } #endif }  void Output(linklist *head) {     linklist *p=head->next;     while(p!=NULL)     {         printf("%d ",p->height);         p=p->next;         //printf(" %d",p->height);     } }  int main() {     int num,number;     linklist *L;     L=CreateList();     scanf("%d%d",&num,&number);     ini(L, num);     insert(L,number);     Output(L);     return 0; } 供参考～

user: user-2
content: void Output(linklist *head) {     linklist *p=head->next;     printf("%d",p->height);     while(p!=NULL)     {         printf(" %d",p->height);         p=p->next;        // printf(" %d",p->height); 这句放到上面就没有问题了	     } }
user-0 提问: 问一个C语言基础问题

回复:
user: user-1
content: 先把基本的c语言的语法学好吧，多说无益

user: user-2
content: 数组越界 代码错 没讨论价值

user: user-3
content: 第一个这样定义和输入，是数组越界访问了，相当于输入的内容把后面的内存（栈）冲掉了，结果是未定义行为～
user-0 提问: 为啥int类型和long int类型占用的字节一样

回复:
user: user-1
content: 引用 4 楼 我也不晓得该取个啥名儿 的回复:[quote=引用 3 楼 自信男孩 的回复:] 这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。我就是64位系统，结果两个占用的字节一样[/quote]我的也是这样，long int与int所占的字节数都是4，只是long long不一样，占8字节

user: user-2
content: 跟64位编译器使用的数据模型有关，LP64、LLP64（windows下的64位编译器一般使用这种模型，long long和pointer是64位的，其他数据类型保持不变）、ILP64，甚至还有SILP64

user: user-0
content: 引用 6 楼 自信男孩 的回复:[quote=引用 4 楼 我也不晓得该取个啥名儿 的回复:] [quote=引用 3 楼 自信男孩 的回复:] 这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。我就是64位系统，结果两个占用的字节一样[/quote] 看一下你的编译器位数[/quote]好的，谢谢。

user: user-3
content: 引用 4 楼 我也不晓得该取个啥名儿 的回复:[quote=引用 3 楼 自信男孩 的回复:] 这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。我就是64位系统，结果两个占用的字节一样[/quote] 看一下你的编译器位数

user: user-0
content: 引用 1 楼 user-5 的回复:因为标准没说不能一样明白了，明白了。感谢

user: user-0
content: 引用 3 楼 自信男孩 的回复:这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。我就是64位系统，结果两个占用的字节一样

user: user-3
content: 这是规定的，没什么要讨论的吧。  在64位系统里，int和long int就是有区别了，一个4字节，一个是8字节。

user: user-4
content: c规范了没规定long int一定是8个字节，但long long是8个字节，如果long int满足不了要求就该用long long吧

user: user-5
content: 因为标准没说不能一样
user-0 提问: 用c怎么编辑出这样啊？求大佬帮我解答一下

回复:
user: user-0
content: 谢谢大佬的帮忙，懂了

user: user-1
content: 打空格加换行

user: user-2
content: 我的道行还很浅，这代码都看不懂。。先学习一个

user: user-3
content: 供参考  #include <stdio.h>  int main() {     char ch = 'a';     int i, j, n;     printf("输入要打印几层:\n");     scanf("%d", &n);      for (i=0; i<n; i++)     {         for (j=0; j<n-i-1; j++)             printf (" ");         for (j=0; j<=i; j++)         {             if (j==0)                 printf("%c ", ch);             else                 printf("%c ", ch+j);         }         printf("\n");      }      getchar();     return 0; }
user-0 提问: 如何用%s输出字符串。

回复:
user: user-1
content: %s是输出字符串，输出的方式是一个字符一个字符输出，直到遇到'\0'停止输出。如果不对ch[0]赋值，那么要看ch[0]是什么，如果是'\0'那么自然什么都不输出。 如果没有'\0'作为结尾，那么会继续向后寻找直到找到'\0'，这样会出现越界访问，结果是未定义的。
user-0 提问: 为什么测试平台不认同我的啊

回复:
user: user-1
content: #include<stdio.h> int main() {     int year,month,flag, day;     scanf("%d  %d",&year,&month);     //if(year%100==0&&year&400==0||year%4==0&&year%10==0)     if(year % 400==0||(year%4==0&&year%100 !=0))     {         flag=1;     }     else     {         flag=0;     }     switch(month)     {         case 1:         case 3:         case 5:         case 7:         case 8:         case 10:         case 12:             day = 31;             break;          case 4:         case 6:         case 9:         case 11:             day = 30;             break;          case 2:             day = 28 + flag;             break;          default:             break;         /*         case 1:month=31;break;         case 2:month=28+flag;break;         case 3:month=31;break;         case 4:month=30;break;         case 5:month=31;break;         case 6:month=30;break;         case 7:month=31;break;         case 8:month=31;break;         case 9:month=30;break;         case 10:month=31;break;         case 11:month=30;break;         case 12:month=31;break;         */     }     printf("%d",month);     return 0; }  供参考～

user: user-2
content: if (year % 100 == 0 && year & 400 == 0 || year % 4 == 0 && year % 10 == 0) 这是个什么判断？？？ 改成人家那种

user: user-3
content: printf换成puts

user: user-4
content: 因为测试有数据范围要求，下面这种月份输错并不会有输出，但是你的样例给错误的月份照样会有输出。最好是在输入之后做个判断。
user-0 提问: 关于德才论测试点2错误

回复:
user: user-1
content: //scanf("%s %d %d",&stu1[i].num,&stu1[i].D_grade,&stu1[i].C_grade); 		scanf("%s %d %d", stu1[i].num,&stu1[i].D_grade,&stu1[i].C_grade); 供参考～
user-0 提问: 刚学C语言，求求各位大佬们帮我看看这几个程序错在哪里吧！

回复:
user: user-0
content: 引用 1 楼 qq_45883336的回复:第二个 log(x+1) 第三个 term=a应该写在scanf后面，for里面是分号，i=0或者i<=n. 第四个 sum=0,n=n/10 好的好的谢谢你！！！！

user: user-0
content: 好的好的，谢谢你！！！

user: user-1
content: //printf("%.2lf\n",y); 		printf("%.2f\n",y); y定义的是float类型，因此输出应该用%f而不是%lf

user: user-2
content: 第二个 log(x+1) 第三个 term=a应该写在scanf后面，for里面是分号，i=0或者i<=n. 第四个 sum=0,n=n/10
user-0 提问: C语言两层循环嵌套，外层只循环了一次

回复:
user: user-1
content: int gcd(int a0,int b0) {     //int temp;     int temp = 1;     while(temp!=0)     {         temp=a0%b0;         a0=b0;         b0=temp;     }      return a0; } 供参考～  问题可能不在循环上，而是gcd函数内temp的没初始化上。 改成如下： int gcd(int a0,int b0) {     int temp; #if 1     do {         temp = a0 % b0;         a0 = b0;         b0 = temp;     }while (temp);  #else     while(temp!=0)     {         temp=a0%b0;         a0=b0;         b0=temp;     } #endif     return a0; }

user: user-2
content: int gcd(int a0,int b0) {	int temp;   ===》》 这里temp没有初始化，不知道是什么值 while(temp!=0)  ==》》 导致这里的循环判断出现问题  解决办法是给 temp 赋个不等于0的初值 { temp=a0%b0; a0=b0; b0=temp; } return a0; }

user: user-0
content: 引用 1 楼 user-2的回复:int gcd(int a0,int b0) {	int temp;   ===》》 这里temp没有初始化，不知道是什么值 while(temp!=0)  ==》》 导致这里的循环判断出现问题  解决办法是给 temp 赋个不等于0的初值 { temp=a0%b0; a0=b0; b0=temp; } return a0; } 但为什么我加了个输出就特别神奇的可以正常运行了

user: user-0
content: 但是为什么我加上那个输出就可以很神奇的正常执行了