Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言结构体指针

回复:
user: user-1
content: 引用 4 楼 千梦一生 的回复:参加过运动会吧。 我指着（站在左上角的）你说 ：看这一排走的真整齐（排 指针） ：这迎面走来的是3年纪4班的同学们。他们...（班 指针） ：下面将要入场的是3年纪的同学们。他们...（年级 指针）  显然，我都是指着左上角的的你 也就是指向的位置都是相同的。  但是类型不一样。  当我需要指向下一排的时候，则，（排 指针 ++） 当我需要指向下一个班级的时候，则，（班级 指针++） ... 写完了才看，有点答非所问了。算我的

user: user-1
content: 参加过运动会吧。 我指着（站在左上角的）你说 ：看这一排走的真整齐（排 指针） ：这迎面走来的是3年纪4班的同学们。他们...（班 指针） ：下面将要入场的是3年纪的同学们。他们...（年级 指针）  显然，我都是指着左上角的的你 也就是指向的位置都是相同的。  但是类型不一样。  当我需要指向下一排的时候，则，（排 指针 ++） 当我需要指向下一个班级的时候，则，（班级 指针++） ...

user: user-2
content: 这是一个链表。 每个结构体中保存着下一个结构体的地址。 链表需要一个头，这里将头简化为和链表结构相同了。 你发现stu123都被初始化了，但是head没有被初始化。 实际上，程序只使用了head.next作为链表头，结构的其他成员并没有被使用。 一般在链表中要单独设置一个链表头的，这里简化了 这是初学者困扰的第一个地方。  struct student *p p是在遍历链表时不断变化的，所以要单独定义一个指针p p = head.next 实际上p就是第一个结构的地址 也就是说，在这个链表中，遍历就是从链表头开始 这就是困扰楼主的地方。  在以往的遍历中，例如for循环 都有一个控制变量，控制循环。 而链表的遍历，一般没用这样一个整体的链表索引。有索引也不叫链表，叫数组了。 链表是通过自身完成遍历的。 也就是说，每个结构中，都保存了下一个结构的地址。 依次遍历所有结构。

user: user-3
content: 因为你循环前已经定义好指向了。

user: user-4
content: 指针里放的是什么？地址，是吧，p所指元素的next指针里存放的地址赋值给p，就相当于p移动了，打个比方，比如你站着火车的一节车厢上，把下一节车厢移到你脚下，是不是等价于你往后移动了，不过这个比喻有点鬼畜

user: user-5
content: p->next是指针变量，存放的是下一个节点的地址；p = p->next;就是将下一个节点的地址赋值给p，那么p就指向了下一个节点，因此用p去访问下一个节点的no, name, year是没问题。  year改成age可能代码可读性更好一些～
user-0 提问: 小白求解，不懂。。

回复:
user: user-1
content: a是野指针，所谓野指针就是a指向的内存地址不确定，如果a指向了可读可写的，这样的程序运行是没问题的。 但是如果a指向了不可以读写的位置，那么就会出现段错误了。 所以并不能保证每次都能正常运行的。 另外，即使正常运行，a指向的位置也是未被系统分配的，那么其他程序还可能继续使用这块内存，因此赋值可能被修改或者修改别的程序在这块区域的值。因此，很危险。
user-0 提问: 求100到999的超级逆向素数，答案为39，我算出来57，实在不知道哪里错了

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <math.h>  int sushu(int); int main() { 	int i = 0; 	int nCount = 0; 	int ni = 0, num; 	for (i = 100;i <= 999;i ++) { 		num = i; 		if (sushu(num) && num % 100 > 10 && sushu(num%100) && sushu(num % 10)) { 			nCount++; 			printf("%d\t", num); 		} 			/* 		if (sushu(i)) 		{ 			int a = i / 10 % 10; 			int b = i % 10;  			ni = a * 10 + b; 			if (sushu(ni) && a != 0 && b != 0) 			{ 				int c = i % 10;  				if (sushu(c)) 				{ 					nCount ++; 				}  			} 		} 			*/ 	} 	printf ("++%d", nCount); 	system ("pause"); 	return 0; }   int sushu(int n) { 	int i = 0; 	if (n < 2) 		return 0; 	for (i = 2; i <= sqrt(n); i++) 	{ 		if (n % i == 0) 			return 0; 	} 	return 1; } /* int sushu(int i) { 	int n = 0; 	for (n = 2;n <= sqrt(i);n ++) 	{ 		if (i % n == 0) 			return 0; 	} 	return 1; }  */  供参考～  素数判断的逻辑有点问题，如果i是1，那么也认为是素数了。

user: user-0
content: 引用 1 楼 user-2的回复:16进制39等于十进制57 可我是按照10进制答应的

user: user-2
content: 16进制39等于十进制57
user-0 提问: 数据结构C语言关于栈和队列

回复:
user: user-0
content: 引用 1 楼 user-1的回复:这个就是最基本的栈和队列操作，LZ自己模仿数据结构的栈和队列操作的例子修改就可以了 停车场和待停区是栈，候车区是队列 停车场进车就是从候车区的队列取前一个元素push进栈 停车场出车就是停车场栈的元素依次pop，然后push到待停区，出车结束后再把待停区的元素依次pop，然后push回停车场即可 老铁我不会写，找了也不知道为什么就是很多指针什么的我都写不出来

user: user-1
content: 这个就是最基本的栈和队列操作，LZ自己模仿数据结构的栈和队列操作的例子修改就可以了 停车场和待停区是栈，候车区是队列 停车场进车就是从候车区的队列取前一个元素push进栈 停车场出车就是停车场栈的元素依次pop，然后push到待停区，出车结束后再把待停区的元素依次pop，然后push回停车场即可
user-0 提问: c语言两个存了中文字符数组的内容怎么进行交换？

回复:
user: user-0
content: 我懂了，就算是中文也是数字编码的，只要有一个一样大的数组可以直接继续交换，一直到遇到'\0',没有必要每2个字符2个字符的换。 int zfcjh(char s[][30],int x) { 	int c[30];  	int j; 	for(j=0;s[x][j]!='\0';j++) 	{ 		c[j]=s[x][j]; 		 		s[x][j]=s[x+1][j]; 		 		s[x+1][j]=c[j];	 		 	}

user: user-1
content: 按照正常的字符交换即可，使用一个中间字符数组；  如果是字符串，按照字符串的交换方式，也是要借助中间字符数组。

user: user-2
content: memcpy
user-0 提问: 求助

回复:
user: user-1
content: 引用 2 楼 weixin_46625589 的回复:[quote=引用 1 楼 N-n-N的回复:]就用cout<<"xxx"<<endl; 一行行输出，然后cin流输入，再到if或者switch判断就好了 可不可以有提供一个具体的代码。？初学者有些懵[/quote]像下面那个框架那样，循环就是里面的while(1)就是一个条件循环语句

user: user-0
content: 引用 3 楼 user-2的回复: #include <stdio.h>  int main(void) {     int num;     printf("本机提供如下5种有机蔬菜：\n");     //用printf打印出选项菜单     while (1)     {        printf("请输入你选择的端口序号(按0结束)： ");        scanf("%d", &num);         switch (num)         {                case 1: printf(""); break;                case 2: printf(""); break;                case 3: printf(""); break;                case 4: printf(""); break;                case 5: printf(""); break;                case 0: return;         }            }     return 0; }   基本框架就是这样了，供参考。 那那个循环咋弄

user: user-2
content: 商品打成端口了。

user: user-2
content: #include <stdio.h>  int main(void) {     int num;     printf("本机提供如下5种有机蔬菜：\n");     //用printf打印出选项菜单     while (1)     {        printf("请输入你选择的端口序号(按0结束)： ");        scanf("%d", &num);         switch (num)         {                case 1: printf(""); break;                case 2: printf(""); break;                case 3: printf(""); break;                case 4: printf(""); break;                case 5: printf(""); break;                case 0: return;         }            }     return 0; }   基本框架就是这样了，供参考。

user: user-0
content: 引用 1 楼 N-n-N的回复:就用cout<<"xxx"<<endl; 一行行输出，然后cin流输入，再到if或者switch判断就好了 可不可以有提供一个具体的代码。？初学者有些懵

user: user-1
content: 就用cout<<"xxx"<<endl; 一行行输出，然后cin流输入，再到if或者switch判断就好了
user-0 提问: 新人求解

回复:
user: user-1
content: #include <stdio.h>  int main() {     int i, num = 0, sum = 0;     for (i=1;;i++)     {         if((i+3)%5==0 && (i-3)%6==0)         {             sum += i;             num += 1;             printf("%5d", i);             if (num%5==0)                 printf("\n");         }          if (num == 15)             break;     }     printf("%d\n", sum);     return 0; }

user: user-2
content: 引用 2 楼 N-n-N 的回复:#include <iostream> using namespace std; int main(){ int i=1; int num=0; white(1){ if(i%3==0&i%5==0&(1-3)%6==0){ cout<<i; num++; } if(num==15)return 0; if(num%5==0){ cout<<endl; } i++; } } 打错 是 while

user: user-2
content: #include <iostream> using namespace std; int main(){ int i=1; int num=0; white(1){ if(i%3==0&i%5==0&(1-3)%6==0){ cout<<i; num++; } if(num==15)return 0; if(num%5==0){ cout<<endl; } i++; } }

user: user-3
content: 老弟，因为从0开始前面几个数都不满足     if ((i+3)%5==0&&(i-3)%6==0)  这个条件，你的num一直就为0，0%5==0满足，所以一直输出换行，解决方法为把    if (num%5==0)printf("\n");  放到        if ((i+3)%5==0&&(i-3)%6==0)  {  num=num+1;  printf("%6d",i);  } 这个里面就可以解决，还有就是你这个代码可以放到一个循环里面就可以解决，不需要搞两个for循环。
user-0 提问: C语言 字符串 

回复:
user: user-1
content: a指向的区域是只读的，所以scanf对a指向的区域进行写操作会出现问题（段错误）；解决版本是变成数组。 char a[32] = "xxx";

user: user-2
content: char *a 指向常量字符串，不能修改。 char a[]字符数组，可以修改

user: user-3
content: 字符串一旦用第一种方式初始化后，指针就不可以被修改了！

user: user-4
content: 指针指向字符串的值不可修改 数组可以
user-0 提问: c语言单链表逆置没有错误，一到执行单链表函数就崩溃，求大神

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  typedef struct { 	char no[8];   //8位学号 	char name[20]; //姓名 	int score;     //成绩 }Student;  typedef struct LNode{ 	Student   data;       //数据域 	struct LNode  *next;   //指针域 }LNode,*LinkList;    //int InitList(LinkList l)           // l不用加*，已经是指针 int InitList(LinkList *l)           // l不用加*，已经是指针 {  	*l=(LinkList)malloc(sizeof(LNode)); 	(*l)->next=NULL;               //头结点 	return 1; }  int createlist(LinkList l,int n) { 	for(int i=n;i>=1;i--) 	{ 		LinkList p;        //前插法创建列表    创建指针（不是Student类型） 		p=(LinkList)malloc(sizeof(LNode));            		printf("请输入学生的学号，成绩及姓名："); 		scanf("%s %d %s",p->data.no,&p->data.score,p->data.name);      //注意. 和.>使用    		p->next=l->next; 		l->next=p;           //相当于在l后插入p结点 	} 	return 1; }  int showlist(LinkList l) { 	LinkList p=l->next; 	while(NULL != p) 	{ 		printf("%s %d %s\n",p->data.no,p->data.score,p->data.name); 		p=p->next; 	} 	printf("\n"); 	return 1; }  LNode *Inverse(LinkList L) { 	LinkList p,q; 	p=L->next; 	L->next=NULL; 	while(p!=NULL) 	{ 		q=p; 		p=p->next; 		q->next=L->next; 		L->next=q; 	} 	return L; }  int main() { 	LinkList L; 	int n; 	if(InitList(&L)) 		printf("初始化链表成功。\n"); 	else  		printf("初始化链表失败。\n"); 	printf("请输入学生个数：\n"); 	scanf("%d", &n); 	if(createlist(L,n)) 		printf("创建链表成功。\n"); 	else  		printf("创建链表失败。\n"); 	//showlist(L);  	Inverse(L);  	showlist(L);  	return 0; }  供参考～  改了main函数里的L类型，如果定义成lnode类型，那就不需要初始化链表头节点了。

user: user-2
content: LNode *Inverse(LinkList L) { LinkList p,q; p=L->next; L->next=NULL; while(p!=NULL) { q=p; p=p->next; q->next=L->next; L->next=q; } return L; } 这个函数应该有问题，把主函数中 Inverse(&L); 注释掉可以正常运行
user-0 提问: 求解决 编译错误syntax error : missing ';' before 'type'

回复:
user: user-1
content: 应该是中文分号

user: user-2
content: 存在设计错误：输入值超过100，怎么办？

user: user-3
content: 把change声明放到开头去

user: user-4
content: AlcorMP AU698xAlcorMP AU698x

user: user-0
content: 引用 4 楼 user-11 的回复:估计是中文分号没有  我手打了一遍还是不对

user: user-0
content: 我自己重新手打了一遍还是相同的错误，命令我贴出来了   希望哥哥们们可以帮我看一下

user: user-0
content: #include <stdio.h>  int main() {     int price = 0;      printf("请输入金额（元）：");     scanf("%d", &price);      int change = 100 - price;      printf("找您%d元。\n", change);      return 0; }       这个就是源代码

user: user-5
content: 引用 1 楼 LeoYang0331 的回复:我的错误是显示在 int change=100-price这一行你这一行或者之前一行，应该有个全角的回车或者其他不可见的字符。

user: user-6
content: 引用 1 楼 LeoYang0331的回复:我的错误是显示在 int change=100-price这一行 c语言应该要先定义名字再使用吧！先int change;再change＝100-price试试

user: user-5
content: 开发环境还是vs好使。 不过vc6.0确实很轻巧，劣势就是不支持新规范。

user: user-7
content: 哪一行有中文分号吧

user: user-8
content: dev-c++也可以  对新手很友好  百度腾讯软件中心  在里面搜就可以

user: user-0
content: 引用 15 楼 akari10032 的回复:[quote=引用 14 楼 LeoYang0331 的回复:] [quote=引用 13 楼 akari10032 的回复:] vs2019，社区版免费的，直接下载就能用 老哥可以提供个下载地址吗[/quote]https://visualstudio.microsoft.com/zh-hans/vs/ 百度一下不是就有了[/quote] 好的 老哥  非常感谢

user: user-9
content: 引用 14 楼 LeoYang0331 的回复:[quote=引用 13 楼 akari10032 的回复:] vs2019，社区版免费的，直接下载就能用 老哥可以提供个下载地址吗[/quote]https://visualstudio.microsoft.com/zh-hans/vs/ 百度一下不是就有了

user: user-0
content: 引用 13 楼 akari10032 的回复:vs2019，社区版免费的，直接下载就能用 老哥可以提供个下载地址吗

user: user-9
content: vs2019，社区版免费的，直接下载就能用

user: user-0
content: 引用 2 楼 ?Victor.?? 的回复:贴一下你的源代码  我试一试 我把命令贴在评论区了 谢谢大哥   引用 11 楼 akari10032 的回复:换个编译器，vc6只支持c89，变量定义要写在函数开始的地方，换个编译器吧，这也太古老了好 非常感谢 我自己在网上也找到原因了 但是我一直找不到别的编译器资源  求大佬告知

user: user-9
content: 换个编译器，vc6只支持c89，变量定义要写在函数开始的地方，换个编译器吧，这也太古老了

user: user-10
content: 至少有一个问题：C语言（因为楼主的文件扩展名是：.c）中，变量要在开关一次性地定义，除非是最新标准的C。请考虑一下究竟是C还是C++！

user: user-11
content: 估计是中文分号
user-0 提问: C语言读二进制数据装入结构体

回复:
user: user-1
content: 可以使用 #pragma pack(1) 在 结构体 声明之前

user: user-1
content: 可以使用 #pragma pack(1) 在截个图声明之前，之后再使用 #pragma pack(4) 或者 #pragma pack(8)

user: user-2
content: 先用一个字符数组把数据读出来（以二进制的方式读取文件），在把字符数组的信息强行转换为结构体或者内存拷贝给结构体 for example char buf[136]; FILE *fp = fopen("your_file", "rb"); while (!foef(fp)) {     memset(buf, 0, sizeof(buf));     int len = fread(buf, 1, 132, fp);     struct your_struct st; //你的结构体变量     memset(st, 0, sizeof(st));     memcpy(st, buf, sizeof(buf)); //内存拷贝的方式     /*     struct your_struct *st = (struct your_struct*)buf; //强行转化的方式     */     。。。 }

user: user-0
content: 解决了。。。是我读入时，用了结构体的长度。。。
user-0 提问: 计算a的n次方mod p，a，n，p均为正整数，均可用32位整型变量存储。从屏幕中输入a，n和p。

回复:
user: user-0
content: 引用 2 楼 前行者001的回复:程序如下， #include<stdio.h> #include<math.h>  int main() { 	int a,n,p,num,temp = 1;//num表示余数，temp用于中间值计算  	printf("请输入变量a,n,p对应值,输入格式例如：3,5,6 \n"); 	scanf("%d,%d,%d",&a,&n,&p);  	//方法 1 利用 pow幂函数解决问题  	num = (int)pow((double)a,(double)n)%p;   	//方法2 利用for循环解决问题 	/* 	for(int i = 1;i <= n;i++)  	{ 		 temp = temp * a; 	} 	*/ 	num = temp % p;  	printf("\n%d^(%d) mod %d = %d",a,n,p,num); }  运算结果  感谢感谢，非常感谢

user: user-1
content: 程序如下， #include<stdio.h> #include<math.h>  int main() { 	int a,n,p,num,temp = 1;//num表示余数，temp用于中间值计算  	printf("请输入变量a,n,p对应值,输入格式例如：3,5,6 \n"); 	scanf("%d,%d,%d",&a,&n,&p);  	//方法 1 利用 pow幂函数解决问题  	num = (int)pow((double)a,(double)n)%p;   	//方法2 利用for循环解决问题 	/* 	for(int i = 1;i <= n;i++)  	{ 		 temp = temp * a; 	} 	*/ 	num = temp % p;  	printf("\n%d^(%d) mod %d = %d",a,n,p,num); }  运算结果
user-0 提问: 求教大佬们，vs2019，用scanf读取字符常量时显示 读取位置发生冲突 的原因

回复:
user: user-0
content: 引用 3 楼 lin5161678的回复:scanf_s 不是 scanf 不能直接套用 scanf的用法 具体用法百度   备注 不用解释为什么不用scanf 去百度scanf_s就行了 啊懂了懂了，谢谢

user: user-1
content: scanf_s 不是 scanf 不能直接套用 scanf的用法 具体用法百度   备注 不用解释为什么不用scanf 去百度scanf_s就行了

user: user-0
content: 引用 1 楼 ?Victor.?? 的回复:输入的问题 写两个scanf吧 字符用循环 scanf一次只接收一个字符 还有输入数字时要有空格分隔  嗯嗯用多个scanf可以解决，但是让我很疑惑的是，这串代码在网站上是可以跑的 是因为不同的编译器的原因嘛

user: user-2
content: 输入的问题 写两个scanf吧 字符用循环 scanf一次只接收一个字符 还有输入数字时要有空格分隔
user-0 提问: 输入数据按回车换行没有输出结果

回复:
user: user-0
content: 嗯，，，我看看

user: user-1
content: 您好，请问你是因为我的代码没有包含math.h然后自己修改了我的代码，结果出现bug，跑到我博文下撂一句“回车没反应”的吗? 检查检查你写的第24行。
user-0 提问: 为什么define定义全局变量的时候不能用阶码

回复:
user: user-0
content: 引用 3 楼 真相重于对错 的回复:2.0E2直接替换A int a[A]就变成了int A[2.0E2] 这样的语句，你觉得会对吗？？？ 看了一下数组下标是整型或整型表达式；但是指数形式是浮点型，所以不行；谢谢。

user: user-1
content: 2.0E2直接替换A int a[A]就变成了int A[2.0E2] 这样的语句，你觉得会对吗？？？

user: user-0
content: 引用 1 楼 真相重于对错 的回复:宏就是文字替换，要看你如何使用那个宏 #include<stdio.h> #define A 2.0E2 int main(){ 	int a[A]; 	a[A]={'0'}; 	printf("%d",a[A]); 	return 0; }   大概就是想把它用作数组的下标，但是我想偷懒不想一个个打零写成200的形式就发现编译不能通过，我想是不是#define 在定义的时候不能用阶码的形式？（这一段代码是刚才随便写的，可能有错，但是不重要，我想问的是关于define定义的规则之类的问题）

user: user-1
content: 宏就是文字替换，要看你如何使用那个宏
user-0 提问: 跪求大佬关于用gcc编译c语言程序的问题，环境已经配置好了gcc也安装了，在桌面创建了一个c语音hello.c文件，用gcc hello.c不能运行，显示No

回复:
user: user-1
content: 请问一下如何在桌面创建一个hello.c的程序

user: user-0
content: 引用 6 楼 Behard的回复:看看当前什么路径，下面有什么文件 dir or ls? 嗯嗯，谢谢，解决了，是在创建文本文档系统把后追TXT隐藏了，我重命名微hello.c，其实是hello.c.txt文件，所以显示no such file

user: user-2
content: 看看当前什么路径，下面有什么文件 dir or ls?

user: user-0
content: 引用 4 楼 liups的回复:https://blog.csdn.net/liups/article/details/102512769 严格按照上面的去做，保证没有问题！ 还不行，下载了最新版，结果一样

user: user-3
content: https://blog.csdn.net/liups/article/details/102512769 严格按照上面的去做，保证没有问题！

user: user-0
content: 引用 2 楼 與蘤舊縐的回复:路径都不对  桌面还在下一级的desktop 两个路径下都有

user: user-4
content: 路径都不对  桌面还在下一级的desktop

user: user-5
content: 1，看下你当前目录有没有hello.c这个文件 2. 看下你windows是不是隐藏了后缀名，你这个hello.c可能是hello.c.txt这个文件哦
user-0 提问: c语言函数参数为指针

回复:
user: user-1
content: for (i = 0; i < 2; i++) { get(&today); printf("%d-%d-%d",p->year,p->month,p->day); }

user: user-2
content: 直接 struct date *p= get(&today); 就行了 你的 get 函数没有问题，strcat 函数就是这样写的（联合调用）： strcat(strcat(xxx, yyy), zzz);

user: user-3
content: 定义一个结构体数组，返回数组指针
user-0 提问: 请问为什么这个程序在vc运行不了啊

回复:
user: user-0
content: 引用 5 楼 liups的回复:[quote=引用 4 楼 嘿嘿٩(๑`н´๑)۶ 的回复:] [quote=引用 3 楼 liups的回复:][quote=引用 2 楼 嘿嘿٩(๑`н´๑)۶ 的回复:] 就改了这个就可以了吗 哪抄的代码？楼主不知道cin、cout这些是标准的C++写法吗？[/quote] 呃是复制粘贴的⊙_⊙我不懂[/quote] 如果你是学C的，请修改代码或重新找一个。如果你是学C++的，我不知道该说什么了！[/quote] 噢噢⊙_⊙好滴

user: user-1
content: 引用 4 楼 嘿嘿٩(๑`н´๑)۶ 的回复:[quote=引用 3 楼 liups的回复:][quote=引用 2 楼 嘿嘿٩(๑`н´๑)۶ 的回复:] 就改了这个就可以了吗 哪抄的代码？楼主不知道cin、cout这些是标准的C++写法吗？[/quote] 呃是复制粘贴的⊙_⊙我不懂[/quote] 如果你是学C的，请修改代码或重新找一个。如果你是学C++的，我不知道该说什么了！

user: user-0
content: 引用 3 楼 liups的回复:[quote=引用 2 楼 嘿嘿٩(๑`н´๑)۶ 的回复:] 就改了这个就可以了吗 哪抄的代码？楼主不知道cin、cout这些是标准的C++写法吗？[/quote] 呃是复制粘贴的⊙_⊙我不懂

user: user-1
content: 引用 2 楼 嘿嘿٩(๑`н´๑)۶ 的回复:就改了这个就可以了吗 哪抄的代码？楼主不知道cin、cout这些是标准的C++写法吗？

user: user-0
content: 就改了这个就可以了吗

user: user-2
content: 代码文件用cpp后缀
user-0 提问: 请教二插树，函数传参数中间不知道哪错了

回复:
user: user-1
content: gdb里运行，出现段错误时看下各个堆栈，然后慢慢调吧（说了跟没说一样）

user: user-0
content: 引用 5 楼 user-2 的回复:感觉是二叉树算法错了，好像所有函数都很奇怪的样子，还是建议对照一下《数据结构》先吧。 兄弟这是用的递归，左节点和右节点互相调用递归

user: user-2
content: 感觉是二叉树算法错了，好像所有函数都很奇怪的样子，还是建议对照一下《数据结构》先吧。

user: user-1
content: 引用 2 楼 Gnglas 的回复:[quote=引用 1 楼 akari10032的回复:]gdb里运行，出现段错误时看下各个堆栈，然后慢慢调吧（说了跟没说一样） 牛B。。。。。[/quote]61行段错误-->root为NULL--->29行head为NULL--->24行head没赋值--->21行size不为0--->19行root初始化--->42行对size进行了赋值

user: user-0
content: 有没有人，来帮帮忙呀

user: user-0
content: 引用 1 楼 akari10032的回复:gdb里运行，出现段错误时看下各个堆栈，然后慢慢调吧（说了跟没说一样） 牛B。。。。。
user-0 提问: 关于C语言的报错

回复:
user: user-0
content: 引用 2 楼 狐帝 的回复:第86行，ElementType实际上是int类型，却用作strcmp的实参，这是语法错误。 createTable函数体没写return语句。 HashAdd函数体没写return语句。谢谢您的回复。我去试试看。

user: user-1
content: 第86行，ElementType实际上是int类型，却用作strcmp的实参，这是语法错误。 createTable函数体没写return语句。 HashAdd函数体没写return语句。

user: user-2
content: 可能是你的主函数中 调用HashAdd(const char *key )子函数时传入的参数类型与子函数函数定义的形参变量类型不匹配
user-0 提问: RETURN_STRING(str10,1);总是显示Segmentation fault (core dumped)

回复:
user: user-1
content: str10分配后是否写入正确值，并将最后一字节清0?

user: user-0
content: 引用 1 楼 user-1 的回复:str10分配后是否写入正确值，并将最后一字节清0?  有把最后一字节置成\0
user-0 提问: 函数入参作为函数内的临时变量数组的长度为啥没问题？

回复:
user: user-1
content: 引用 8 楼 adaizhuadaizhu 的回复:[quote=引用 2 楼 自信男孩 的回复:] 第一个是有问题的，因为len不确定长度，因此编译器不知道要给它申请多长的数组。 第二个是没问题的，因为是动态申请的，是在调用函数时才会去调用malloc申请空间。第1段代码没有问题，我编译和运行和第二种结果完全一样 [/quote] 那如果第一种没问题，问一下未调用之前，len是多少呢？

user: user-2
content: 引用 7 楼 adaizhuadaizhu 的回复:[quote=引用 3 楼 真相重于对错 的回复:] 第一个有问题。语法错误 要不 array[len]=10; 要不就是 int array[100]={10};  int array[len]={10}没有这么写的 第1段代码没有问题，我编译和运行和第二种结果完全一样[/quote] 你的编译器不符合标准

user: user-0
content: 引用 6 楼 coo135 的回复:这个到不是保存在栈上的问题。从C99开始引入VLA，所以int array[len] 合法，但是不能用{ }初始化。第一段代码能编译通过，说明编译器用的是c++哈，而且不是上古时期的那种~~~编译和运行正确，我试验过，但是确实不能={}初始化，为啥不能初始化

user: user-0
content: 引用 2 楼 自信男孩 的回复:第一个是有问题的，因为len不确定长度，因此编译器不知道要给它申请多长的数组。 第二个是没问题的，因为是动态申请的，是在调用函数时才会去调用malloc申请空间。第1段代码没有问题，我编译和运行和第二种结果完全一样

user: user-0
content: 引用 3 楼 真相重于对错 的回复:第一个有问题。语法错误 要不 array[len]=10; 要不就是 int array[100]={10};  int array[len]={10}没有这么写的 第1段代码没有问题，我编译和运行和第二种结果完全一样

user: user-2
content: 要想正确，除非他支持vla

user: user-0
content: 引用 10 楼 真相重于对错 的回复:[quote=引用 7 楼 adaizhuadaizhu 的回复:] [quote=引用 3 楼 真相重于对错 的回复:] 第一个有问题。语法错误 要不 array[len]=10; 要不就是 int array[100]={10};  int array[len]={10}没有这么写的 第1段代码没有问题，我编译和运行和第二种结果完全一样[/quote] 你的编译器不符合标准 [/quote] leetcode上也是正常运行的

user: user-3
content: 这个到不是保存在栈上的问题。从C99开始引入VLA，所以int array[len] 合法，但是不能用{ }初始化。第一段代码能编译通过，说明编译器用的是c++哈，而且不是上古时期的那种~~~

user: user-4
content: 但是 VLA是不能初始化的  所以你的第一段代码应该还是错的

user: user-4
content: C99有一个vla特性支持你用变量作为数组大小

user: user-2
content: 第一个有问题。语法错误 要不 array[len]=10; 要不就是 int array[100]={10};  int array[len]={10}没有这么写的

user: user-1
content: 第一个是有问题的，因为len不确定长度，因此编译器不知道要给它申请多长的数组。 第二个是没问题的，因为是动态申请的，是在调用函数时才会去调用malloc申请空间。

user: user-2
content: 数组长度必须是编译期能够确定。 除非是支持变长的数组的编译器。
user-0 提问: c语言链表插入问题

回复:
user: user-1
content: 所以你又把NULL的ha拿去插入，NULL没有->next，所以在s -next=p-next时会segmentation fault

user: user-1
content: 你这个传递有问题，你初始化一个ha指针，把这个指针传去初始化，这样是无效的。接受参数你那里也是list，类型一样，是传值，你在init里的赋值是给L在操作，和ha没关系的。
user-0 提问: 为什么我的写法不可以啊

回复:
user: user-1
content: 你当这是数学吗？

user: user-2
content: 没有规矩不成方圆，这就是规定  既然 给你四则运算符号 + - * /，那就是要在相应的情况下使用他们， 注意这里是C语言，不是平时的数学符号语言 如果2 * x 表示成2x, 那 int a； int a2= 0；这里a2表示什么，a乘以2？，不是的 a2是个变量名  因为变量可以由数字 字母下划线组成（不能以数字开头）  条件运算符也是一样，语言上 不存在这一的东西，1 <=x < 10  我觉得这种东西，记住就好，至于为什么，涉及语言和编译器 的东西，一般人解释不清楚 厉害的人 解释清楚了你又听不明白，徒增烦恼
user-0 提问: 为什么会出现终止，重试，忽略的弹屏呢？截屏如下，请各位帮忙看看，急急急！谢谢谢谢谢！！！

回复:
user: user-0
content: 谢谢

user: user-0
content: 嗯嗯，我试试

user: user-1
content: main函数里 f1 = fopen(filename, "r")；文件是只读打开的“r”  接着你又用 fprintf(f1,"id:%03d\n",students[i].id )对该文件进行写了，因为 权限不足，退出了  === 你可以从报错信息看出，问题出在 fprintf.c，他在fprintf这个函数里有个断言，str != NULL 就是说你调用的时候，fprintf判断出fp是只读的，那么唯一合法的条件就是你传个空指针NULL去写他 因为不允许写嘛，空也就相当于不写了，，，，题外话了  另外你设计上可以规定好哪个文件是拿来读的， 比如你让用户输入要读的文件，然后去尝试打开它，看下里面有没有内容 如果打开出错（不存在这个文件），或者内容有误（你的作业应该没要求做这个错误判断） 这样出错了 你给用户返回一条信息（printf打印“文件不存在，请重新输入”）， 然后调scanf再请求用户输入，，，，如此循环直到正确  这样的话就不用像你的代码那样，f1，f2切来切去，一大堆重复代码
user-0 提问: 求助：C语音写430芯片

回复:
user: user-1
content: 记录前半秒数据集，求一下max。 如果大数据的话，可以按时间序列，其值升序排序。即： a = 双端队列。 b = 新输入值。 输入时:       弹出a前端超出时间的，再弹出a后端小于b的，最后压入b.
user-0 提问: C++ cout<<的问题，求助！

回复:
user: user-1
content: 前面都说了解决就不献丑，不过有个疑问，A那个函数的参数是啥意思，传参再取址嘛？如果是传a的地址应该是int* x      A(&a）吧？

user: user-2
content: 引用 4 楼 coo135的回复:[quote=引用 3 楼 Italink 的回复:] 一般是从右往左，但最好不要再一个表达式中多次处理一个变量  这是表达式求值顺序的问题，不存在“一般是从右往左”的说法，这在C++规范中有详细的说明，所以第一张图的cout...的行为是未定义的。 楼主，求值顺序规则蛮多的，简单的讲，如要在一个表达式（准确的讲是在同一个求值点）中多次修改同一变量，则需要分开写。[/quote] 嗯嗯，记下了

user: user-3
content: 引用 3 楼 Italink 的回复:一般是从右往左，但最好不要再一个表达式中多次处理一个变量  这是表达式求值顺序的问题，不存在“一般是从右往左”的说法，这在C++规范中有详细的说明，所以第一张图的cout...的行为是未定义的。 楼主，求值顺序规则蛮多的，简单的讲，如要在一个表达式（准确的讲是在同一个求值点）中多次修改同一变量，则需要分开写。

user: user-2
content: 一般是从右往左，但最好不要再一个表达式中多次处理一个变量

user: user-4
content: 执行的时候 右往做，输出的时候就是左→右

user: user-4
content: 右往左 消。。

user: user-3
content: 引用 5 楼 Italink 的回复:[quote=引用 4 楼 coo135的回复:][quote=引用 3 楼 Italink 的回复:] 一般是从右往左，但最好不要再一个表达式中多次处理一个变量  这是表达式求值顺序的问题，不存在“一般是从右往左”的说法，这在C++规范中有详细的说明，所以第一张图的cout...的行为是未定义的。 楼主，求值顺序规则蛮多的，简单的讲，如要在一个表达式（准确的讲是在同一个求值点）中多次修改同一变量，则需要分开写。[/quote] 嗯嗯，记下了[/quote]  补充一下哈，C++标准更新很快啊~~，从C++ 17开始，第一种写法是合法的，两者结果是一样的。 因为C++17中，规定了移位运算符的求值顺序：表达式 E1<<E2 和 E1>>E2 中，E1 的每个值计算和副作用都按顺序早于 E2 的每个值计算和副作用。

user: user-5
content: 放心 很简单的  代码错 未定义行为 结果没意义

user: user-6
content: 引用 6 楼 qq_1457346882 的回复:前面都说了解决就不献丑，不过有个疑问，A那个函数的参数是啥意思，传参再取址嘛？如果是传a的地址应该是int* x      A(&a）吧？  一. 值传递 1. 用值传递方式，实际上是把实参的内容复制到形参中，实参和形参是存放在两个不同的内存空间中。在函数体内对形参的一切修改对实参都没有影响； 2. 如果形参是类的对象，利用值传递的话每次都要调用类的构造函数构造对象，效率比较低。 二. 指针传递（地址传递） 1. 当进行指针传递的时候，形参是指针变量，实参是一个变量的地址或者是指针变量，调用函数的时候，形参指向实参的地址； 2. 指针传递中，函数体内可以通过形参指针改变实参地址空间的内容。 三. 传递引用 1.引用实际上是某一个变量的别名，和这个变量具有相同的内存空间； 2. 实参把变量传递给形参引用，相当于形参是实参变量的别名，对形参的修改都是直接修改实参； 3. 在类的成员函数中经常用到类的引用对象作为形参，大大的提高代码的效率。
user-0 提问: 当把某个字符数组赋值给char *的时候会发生什么？ 

回复:
user: user-1
content: 如果想输出单个字符,应该是 printf("%c");

user: user-2
content: 引用 5 楼 冷风1023 的回复:[quote=引用 3 楼 Jags 的回复:] 还有等号左边是不能自增的 自++没有问题，只是打印有问题，就像两位说的，如果用指针就用%s,如果有*就应该是%c printf("%s\n", --p);  或者 printf("%c\n", *--p); [/quote] 看错了，之前碰到一个类似#define p      (unsigned int *)0x08000000UL  的例子

user: user-3
content: 引用 3 楼 Jags 的回复:还有等号左边是不能自增的可以的

user: user-4
content: 引用 6 楼 自信男孩 的回复:*--p 这个是一个数值，即比如是'h'，而%s后面要对应的是一个地址，即字符串的地址。之所以出现段错误，是因为'h'开始的地址不能读写。  可以查一下'h'开始的地址是多少？即'h'的16进制数据值。 %s要求后面的跟的地址，而*--p是一个数值，那么把这个数值作为一个地址，系统认为这个地址是不能访问的，所以段错误了。

user: user-4
content: *--p 这个是一个数值，即比如是'h'，而%s后面要对应的是一个地址，即字符串的地址。之所以出现段错误，是因为'h'开始的地址不能读写。  可以查一下'h'开始的地址是多少？即'h'的16进制数据值。

user: user-5
content: 引用 3 楼 Jags 的回复:还有等号左边是不能自增的 自++没有问题，只是打印有问题，就像两位说的，如果用指针就用%s,如果有*就应该是%c printf("%s\n", --p);  或者 printf("%c\n", *--p);

user: user-6
content: p指向buf了，这个应该没有问题，应该是后面的出问题了

user: user-2
content: 还有等号左边是不能自增的

user: user-2
content: 把*--p的*去掉看一下
user-0 提问: 小学数学测验（C语言）（只差最后一个要求啦）

回复:
user: user-1
content: #include<iostream>  using namespace std;  //#include<time.h> #include<ctime> #include <cstring>  void Pd(int &sum,int a,int b) {     int x=3;     int y;     int s=0;     while(x--)     {         s++;         cout<<a<<"+"<<b<<"=";         cin>>y;         if(y==a+b)         {             cout<<"计算正确。下一题：";             if(s==1)                 sum+=10;             if(s==2)                 sum+=7;             if(s==3)                 sum+=5;             return;         }         else         {             cout<<"计算错误，请重新输入";             if(s==3)             {                 cout<<"下面的等式才是正确的哦";                 cout<<a<<"+"<<b<<"="<<a+b<<endl;             }         }     } }  void Pdl(int &sum,int a,int b) {     int x=3;     int y;     int s=0;     while(x--)     {         s++;         cout<<a<<"-"<<b<<"=";         cin>>y;         if(y==a-b)         {             cout<<"计算正确。下一题：";             if(s==1)                 sum+=10;             if(s==2)                 sum+=7;             if(s==3)                 sum+=5;             return;         }         else         {             cout<<"计算错误，请重新计算";             if(s==3)             {                 cout<<a<<"-"<<b<<"="<<a-b<<endl;             }         }     } }  int main() {     int n=10;     int sum=0;     int a,b,c;     int s=1;     srand((int)time(0));     char name[32], date[32];     time_t tm;      cout<<"Please input your name: ";     cin>>name;     FILE *fp = fopen("1.txt", "a+");     if (!fp)         return -1;      cout<<"本次测试现在开始，一共十道题目。一题十分，满分为一百分。每个题目有三次机会回答，第一次答对得十分，第二次答对得7分，第三次答对得5分。若三次都不对，则0分。";     while(n--)     {         cout<<"第"<<s++<<"题为：";         a=rand()%10+15;         b=rand()%10+15;         c=rand()%10;         //cout<<c<<endl;         if(c%2==0)         {             Pd(sum,a,b);         }         else             while(1)             {                 if(a>=b){Pdl(sum,a,b);break;}                 else                 {                     a=rand()%10+15;                     b=rand()%10+15;                 }             }         cout<<endl;     }      cout<<"您的总成绩为："<<sum<<endl<<endl;     while(1)     {         if(sum>=90)         {cout<<"SMART";break;}         if(sum>=80&sum<90)         {cout<<"GOOD";break;}         if(sum>=70&sum<80)         {cout<<"OK";break;}         if(sum<60)         {cout<<"TRY AGAIN";break;}         else         {             cout<<"PASS";break;}     }      tm = time(NULL);     ctime_r(&tm, date);     date[strlen(date)-1] = 0;   //rm '\n'     fprintf(fp, "%s %s %d\n", name, date, sum);     fclose(fp);     //fprintf(fp, "%s %s %d\n", name, ctime(time()), sum);     return 0; } 供参考～  详见main函数内

user: user-2
content: 定义变量获取日期时间，有函数的 这里存储因为看题目要存储多个，所以建议你做个结构体来存信息，再创建文件把结构体整个写进去就好了，都是直接调用函数就可以了，因为平台可能不一样，就不给你具体函数了，百度一下就都出来了
user-0 提问: 小白

回复:
user: user-0
content: 输出结果是这样

user: user-1
content: #include <stdio.h> #include <math.h> int main() {         double x1,y1;         double x2,y2;         scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2);         float d =sqrt((x2-x1)*(x2-x1)+(y2-y1)*(y2-y1));         printf("%f\n",d);         return 0; } 输出 0 0 3 4 5.000000 如果要5的话 printf("%.f\n",d);

user: user-0
content: 改成%f之后就这样了

user: user-0
content: 但要求是不输出多余的0

user: user-1
content: 输出格式错了，应该用f而不是g，如果要控制位数就.几f

user: user-2
content: 单精度浮点数的格式控制符为%f

user: user-3
content: 引用 6 楼 blurryfaceu 的回复:输出结果是这样 scanf函数写错了。应该是scanf("%lf %lf %lf %lf",&x1,&y1,&x2,&y2); 你的双引号把要赋值的变量都包括进去了，就等于没赋值。

user: user-4
content: x1, y1, x2, y2都是随机值呀，输出的结果是未定义的。  还有sqrt得到的是double类型，如果用float去接收，势必会截断数据，double是8字节，float是4字节（32位系统下）

user: user-3
content: 1.首先你的x1,y1,x2,y2，没有赋值，按你的程序应该是想用sacnf进行赋值的。测试了一下，在main函数里，首次定义的double x1，x2,x3,x4，若没有经过初始化，值全都是0，所以你的测试结果一直都是0; （很奇怪，每次运行main函数，查看这四个变量的地址都是一样的，但是，如果我初始化并赋值，比如说x1=3,x2=4,x3=5,x4=6，按理说下次创建的时候，如果地址一样，x1,x2,x3,x4的初始值值应该会变成3，4，5，6，但是还是0。（换了另一个工程下的函数测试也全为0）而且如果在后面又定义了double y1,y2,y3,y4。此时y1的值会大概率一直变化，其余都是0，不知道为什么。）  2.其次，float d = sqrt()这一条语句，把double类型强制转换成了float类型，可能会造成精度丢失。如果题目要求是不输出多余的0，用%g输出是应该的。它会以较短的方式输出实数。
user-0 提问: c语言小程序用swicth语句输出成绩评语

回复:
user: user-1
content: case 90 ... 100:      是大于等于90 小于100的意思,注意中间是三个点

user: user-0
content: 引用 5 楼 若歌的回复:输入成绩除10求商，再switch一下怎么样？ 我就是这么解决的，哈哈哈

user: user-1
content: 引用 8 楼 lin5161678 的回复:引用 6 楼 chxchxkkk 的回复:除非你能确定 发帖人的编译环境支持这个特性 否则这个特性不能作为通用规则描述 你的意见是正确的

user: user-2
content: switch (n/10) {     case 10: case 9:     break;     case 8:     break; .... ...  可以考虑这样，减少case的次数

user: user-3
content: 引用 6 楼 chxchxkkk 的回复:除非你能确定 发帖人的编译环境支持这个特性 否则这个特性不能作为通用规则描述

user: user-3
content: 引用 6 楼 chxchxkkk 的回复:引用 4 楼 lin5161678 的回复:[quote=引用 2 楼 chxchxkkk 的回复:] case 90 ... 100:      是大于等于90 小于100的意思,注意中间是三个点没这样的用法 [/quote]这是编译器方言 只在某个特定编译器上面有效

user: user-1
content: 引用 4 楼 lin5161678 的回复:引用 2 楼 chxchxkkk 的回复:case 90 ... 100:      是大于等于90 小于100的意思,注意中间是三个点没这样的用法

user: user-4
content: 输入成绩除10求商，再switch一下怎么样？

user: user-3
content: 引用 2 楼 chxchxkkk 的回复:case 90 ... 100:      是大于等于90 小于100的意思,注意中间是三个点没这样的用法

user: user-5
content: 第十二行，case没有空格

user: user-0
content: 有大神指导一下吗
user-0 提问: virtual judge上一道快速排序，我用c的程序，VS上正常运行，到virtual judge上就显示Segmentation Fault，想问问怎么回事

回复:
user: user-0
content: 但是题目要求数组元素个数n<100000

user: user-1
content: int a[100000]; 这个数组定义是否有点大了，弄小点试试

user: user-2
content: while(a[--j]>key && i < r); //@1 while(a[++i]<key);    //@2  改成 while(a[--j]>key )｛ if(j == p)break; } while(a[++i]<key) { if(i == r) break; }  ========= 首先@1, 两个地方不对：分析如下 1.因为是对j, 自减，你要防止j 越界，这里不是判断i < r, 应该是i要大于等p，不能超过左边界 2.就算是改成这样while(a[--j] > key && j >= p;这样呢  ？你认为OK了吗？   还是有问题的，假设j==p，这时候while还会继续走一次， 下一次 whlie条件走了前面一半，(a[--j] > key), j又越界了 那么改成 while(a[--j] > key && j >p); 如何？ OK了,
user-0 提问: c语言程序问题

回复:
user: user-1
content: 你的c定义成int了，但是你输入的是字符

user: user-2
content: 引用 14 楼 折腾的小飞 的回复：[quote=引用 13 楼 折腾的小飞 的回复：]建议重新学一下字符输入输出函数，getchar函数一次只能输入一个字符；printf函数输出不能那样写，双引号，分号，格式字符也没有； 你这个是输入\t，getchar取了前面的\，对应下面的c=”\\”，输出\\\\，实际是\\，就是你这个结果看错了switch循环输入，我再看看[/quote]我看了一下确实是输出的第三个if语句的结果\\\\

user: user-2
content: 引用 13 楼 折腾的小飞 的回复：建议重新学一下字符输入输出函数，getchar函数一次只能输入一个字符；printf函数输出不能那样写，双引号，分号，格式字符也没有； 你这个是输入\t，getchar取了前面的\，对应下面的c=”\\”，输出\\\\，实际是\\，就是你这个结果看错了switch循环输入，我再看看

user: user-2
content: 建议重新学一下字符输入输出函数，getchar函数一次只能输入一个字符；printf函数输出不能那样写，双引号，分号，格式字符也没有； 你这个是输入\t，getchar取了前面的\，对应下面的c=”\\”，输出\\\\，实际是\\，就是你这个结果

user: user-0
content: 引用 10 楼 GKatHere的回复:[quote=引用 8 楼 weixin_45718499 的回复:] main() { 	int c; 	while((c=getchar())!=EOF){ 		if(c=='\t') 			printf("\\t"); 		if(c=='\b') 			printf("\\b"); 		if(c=='\\') 			printf("\\\\"); 		if(c!='\b') 			if(c!='\t') 				if(c!='\\') 					printf(c); 	}	 	return; } 错了，printf(c);应为printf("%c", c);  你的编译器竟然没有把这个问题检测出来。[/quote] 最近写多java了，有点混乱，不知你是用什么编译器，我也下载一个。

user: user-3
content: 引用 8 楼 weixin_45718499 的回复:main() { 	int c; 	while((c=getchar())!=EOF){ 		if(c=='\t') 			printf("\\t"); 		if(c=='\b') 			printf("\\b"); 		if(c=='\\') 			printf("\\\\"); 		if(c!='\b') 			if(c!='\t') 				if(c!='\\') 					printf(c); 	}	 	return; } 错了，printf(c);应为printf("%c", c);  你的编译器竟然没有把这个问题检测出来。

user: user-4
content: 你输入了\t，那就是输入两个字符了 简单来说你记住，输入没有转义，输出才有转义一说

user: user-0
content: 引用 6 楼 GKatHere 的回复:[quote=引用 4 楼 weixin_45718499 的回复:] [quote=引用 1 楼 GKatHere的回复:]'\t'为输入，那么只输出'\\', 确实不对 那你知道是什么问题吗？[/quote] 我的输出为'\\t',要不你把实际代码传上来看看是不是有细微不同？[/quote] #include<stdio.h> main() { 	int c; 	while((c=getchar())!=EOF){ 		if(c=='\t') 			printf("\\t"); 		if(c=='\b') 			printf("\\b"); 		if(c=='\\') 			printf("\\\\"); 		if(c!='\b') 			if(c!='\t') 				if(c!='\\') 					printf(c); 	}	 	return; }

user: user-0
content: 引用 5 楼 user-5的回复:[quote=引用 3 楼 weixin_45718499 的回复:] [quote=引用 2 楼 user-5的回复:]没什么不对  你输入 \ c == '\\' 这个判断成立 输出 \\ 你输入t 你全部 if 都不满足这个输入  自然什么都没输出 我输入的是\t的，它不是应该输出\\t吗？[/quote]输入\t 不是这样输入的 你得按tab键 键盘左边 6个按键 从上到下依次是  esc `~ tab caps lock shift ctrl 第三个 输入这个才是 \t  [/quote] 我刚才又试了一下它这次输出的是\t还是少了一个反斜杠

user: user-3
content: 引用 4 楼 weixin_45718499 的回复:[quote=引用 1 楼 GKatHere的回复:]'\t'为输入，那么只输出'\\', 确实不对 那你知道是什么问题吗？[/quote] 我的输出为'\\t',要不你把实际代码传上来看看是不是有细微不同？

user: user-5
content: 引用 3 楼 weixin_45718499 的回复:[quote=引用 2 楼 user-5的回复:]没什么不对  你输入 \ c == '\\' 这个判断成立 输出 \\ 你输入t 你全部 if 都不满足这个输入  自然什么都没输出 我输入的是\t的，它不是应该输出\\t吗？[/quote]输入\t 不是这样输入的 你得按tab键 键盘左边 6个按键 从上到下依次是  esc `~ tab caps lock shift ctrl 第三个 输入这个才是 \t

user: user-0
content: 引用 1 楼 GKatHere的回复:'\t'为输入，那么只输出'\\', 确实不对 那你知道是什么问题吗？

user: user-0
content: 引用 2 楼 user-5的回复:没什么不对  你输入 \ c == '\\' 这个判断成立 输出 \\ 你输入t 你全部 if 都不满足这个输入  自然什么都没输出 我输入的是\t的，它不是应该输出\\t吗？

user: user-5
content: 没什么不对  你输入 \ c == '\\' 这个判断成立 输出 \\ 你输入t 你全部 if 都不满足这个输入  自然什么都没输出

user: user-3
content: '\t'为输入，那么只输出'\\', 确实不对
user-0 提问: 加window头文件就不能运行

回复:
user: user-1
content: 我碰到有的自己不会的问题，我就逐渐减少代码量一点一点筛查。 有的时候ide会出问题  这个我也不太懂  反正换了重新跑一次代码就正常了，也不报错啥的😂

user: user-2
content: 引用 17 楼 xiaobaicaiaihe的回复:[quote=引用 13 楼 akari10032的回复:]估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 但为什么不加Windows头文件我直接用Max就可以运行，加了Windows就函数重载，难道头文件会导致函数重载吗[/quote] 函数重载是，两个函数的函数名相同，参数个数或参数类型不同，概括说就是形参列表不同，包含windows.h就相当于把这个头文件里的函数都写在了你的这个文件，windows里面可能有max函数，你也自定义了一定同名函数，所以会出错。

user: user-0
content: 引用 14 楼 akari10032的回复:另外，自己写函数最好不要直接用max，min，swap，sort之类的看起来很简洁的命名，这些很可能系统头文件已经使用了，加一个一眼就能看出来是自定义的标识，比如my_xxx，或者projectname_xxx 谢谢指导 OK

user: user-3
content: 另外，自己写函数最好不要直接用max，min，swap，sort之类的看起来很简洁的命名，这些很可能系统头文件已经使用了，加一个一眼就能看出来是自定义的标识，比如my_xxx，或者projectname_xxx

user: user-3
content: 估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏

user: user-4
content: 确实不知道，你这也没几个代码，顶多重新写一遍。  新建工程。建好运行一遍。。 再include<windows.h>,再运行一遍。 再写，再运行，直到出错，或者没再出错了。就可以对比一下。 但重写时，不建议复制粘贴

user: user-0
content: 引用 10 楼 千梦一生的回复:留下include <windows.h>把你那个max删了重写。包括声明 先删掉，直接运行main。看有没有错，有错改了。 再重新写一遍你的max 我试试看，谢谢

user: user-4
content: 留下include <windows.h>把你那个max删了重写。包括声明 先删掉，直接运行main。看有没有错，有错改了。 再重新写一遍你的max

user: user-0
content: 引用 7 楼 千梦一生的回复:把windows.h扔到最上面去。看看报错有没有什么变化。 有时候遇到一些错误，确实有点莫名其妙，只能尽量干了。尽量排查。缩小范围。  以前自己也遇到过奇奇怪怪的问题。也有没有解决出来的时候，只有全部放弃从头再来。 把他放到最上面也一样，但是把他放到double自定义函数下面 报错地方就变了 变到下面的调用函数那里就double  max（double a，double b）

user: user-0
content: 引用 6 楼 千梦一生的回复:有没有不小心动过windows.h 我就直接打Windows头文件，没有这个头文件就可以运行，有就不行，但我添加其他的头文件就可以

user: user-4
content: 把windows.h扔到最上面去。看看报错有没有什么变化。 有时候遇到一些错误，确实有点莫名其妙，只能尽量干了。尽量排查。缩小范围。  以前自己也遇到过奇奇怪怪的问题。也有没有解决出来的时候，只有全部放弃从头再来。

user: user-4
content: 有没有不小心动过windows.h

user: user-4
content: 不知道。这个问题有点难

user: user-0
content: 引用 18 楼 akari10032的回复:[quote=引用 17 楼 xiaobaicaiaihe的回复:][quote=引用 13 楼 akari10032的回复:]估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 但为什么不加Windows头文件我直接用Max就可以运行，加了Windows就函数重载，难道头文件会导致函数重载吗[/quote] 感觉有点误导你了，你暂时把重载这两个字忘掉吧，C里压根没有重载的概念。另外这个头文件里是用宏实现的max，你可以点进去看看。不懂的话去学下关于宏定义的知识[/quote] okay ....

user: user-3
content: 引用 17 楼 xiaobaicaiaihe的回复:[quote=引用 13 楼 akari10032的回复:]估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 但为什么不加Windows头文件我直接用Max就可以运行，加了Windows就函数重载，难道头文件会导致函数重载吗[/quote] 感觉有点误导你了，你暂时把重载这两个字忘掉吧，C里压根没有重载的概念。另外这个头文件里是用宏实现的max，你可以点进去看看。不懂的话去学下关于宏定义的知识

user: user-0
content: 引用 13 楼 akari10032的回复:估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 但为什么不加Windows头文件我直接用Max就可以运行，加了Windows就函数重载，难道头文件会导致函数重载吗

user: user-0
content: 引用 13 楼 akari10032的回复:估计重名了，给你的函数换个名字就好了，C里面不支持函数重载，而且我觉得Windows.h里面的应该是个宏 确实是可以了

user: user-0
content: 引用 3 楼 真相重于对错的回复:看错了 那请问那里有问题？

user: user-5
content: 看错了

user: user-0
content: 引用 1 楼 真相重于对错的回复:c不支持函数重载吧? 什么意思，能说具体点吗，谢谢
user-0 提问: 求助大佬！（快速幂转换成快速加）

回复:
user: user-0
content: 引用 1 楼 user-1的回复:a, b, c, d; a == b+c; 即：a%d == (b%d + c%d)%d pow(2, n) == pow(2, n-1) +pow(2, n-1) ; pow(2, n)%d == ((pow(2, n-1)%d)  *2)%d; 就这样分解就是 嗷嗷嗷，谢谢您！！！*罒▽罒*

user: user-1
content: a, b, c, d; a == b+c; 即：a%d == (b%d + c%d)%d pow(2, n) == pow(2, n-1) +pow(2, n-1) ; pow(2, n)%d == ((pow(2, n-1)%d)  *2)%d; 就这样分解就是
user-0 提问: c语言求指教，大神来看看

回复:
user: user-0
content: 引用 8 楼 @大愚@的回复:你是不是，输入的时候没有输入对应的逗号我刚才就忘输入了 哈哈哈不是我解决了，都是需要%g这个类型的

user: user-1
content: 你是不是，输入的时候没有输入对应的逗号我刚才就忘输入了

user: user-0
content: 引用 4 楼 ?Victor.??的回复:#include <stdio.h> int main() { 	float x,y,z,a; 	scanf("%f,%f,%f",&x,&y,&z); 	if(x>y) 		a=y; 	else 		a=x; 	if(z>a) 		printf("%g",a); 	else 		printf("%g",z); 	return 0; }  哦，他还考虑了格式，试试这个 没这个错了，跟我的结果一样

user: user-0
content: 引用 4 楼 ?Victor.??的回复:#include <stdio.h> int main() { 	float x,y,z,a; 	scanf("%f,%f,%f",&x,&y,&z); 	if(x>y) 		a=y; 	else 		a=x; 	if(z>a) 		printf("%g",a); 	else 		printf("%g",z); 	return 0; }  哦，他还考虑了格式，试试这个 好👌谢谢啦，我去试试看

user: user-2
content: 测试用例有浮点数，所以x, y，z需要是浮点数。

user: user-3
content: #include <stdio.h> int main() { 	float x,y,z,a; 	scanf("%f,%f,%f",&x,&y,&z); 	if(x>y) 		a=y; 	else 		a=x; 	if(z>a) 		printf("%g",a); 	else 		printf("%g",z); 	return 0; }  哦，他还考虑了格式，试试这个

user: user-0
content: 引用 2 楼 ?Victor.??的回复:把int 改成 float  测试用例不是有小数吗 改了还没用还是全部错误了

user: user-3
content: 把int 改成 float  测试用例不是有小数吗

user: user-0
content: 有人吗大哥们
user-0 提问: c语言小程序，求指教

回复:
user: user-1
content: 发过来看下吧

user: user-0
content: 引用 2 楼 云销-雨霁的回复:#include <stdio.h>”  int main() { 	float t,weight,high;  	printf("input weight: "); 	scanf("%f",&weight); 	printf("input high: "); 	scanf("%f",&high);  	t = weight/(high*high);  	if(t<18) 	{ 		printf(" 低体重"); 	} 	else if((t >= 18) && (t < 25))  	{ 		printf("正常体重"); 	} 	else if((t > 25) && (t <= 27) ) 	{ 		printf("正常体重"); 	} 	if(t > 27) 	{ 		printf("超重"); 	}  }; 可以帮我看看另外一个吗

user: user-1
content: #include <stdio.h>”  int main() { 	float t,weight,high;  	printf("input weight: "); 	scanf("%f",&weight); 	printf("input high: "); 	scanf("%f",&high);  	t = weight/(high*high);  	if(t<18) 	{ 		printf(" 低体重"); 	} 	else if((t >= 18) && (t < 25))  	{ 		printf("正常体重"); 	} 	else if((t > 25) && (t <= 27) ) 	{ 		printf("正常体重"); 	} 	if(t > 27) 	{ 		printf("超重"); 	}  };

user: user-0
content: 小白.求指教
user-0 提问: double浮点数0.5可以精确表达吗？乘于2以后有没有可能变成0.99999999999999x取整为0？

回复:
user: user-1
content: 引用 3 楼 ooolinux 的回复:[quote=引用 2 楼 user-1 的回复:] 0.5和1都可以精确表示  ok，我记得0.5，0.25，0.125。。以及它们的组合都是可以精确表达的，都有对应的二进制位。[/quote]是的

user: user-0
content: 引用 2 楼 user-1 的回复:0.5和1都可以精确表示  ok，我记得0.5，0.25，0.125。。以及它们的组合都是可以精确表达的，都有对应的二进制位。

user: user-1
content: 0.5和1都可以精确表示

user: user-0
content: 如果无法精确就要加个0.00...01修正了。
user-0 提问: c

回复:
user: user-1
content: 在结尾值为0时 char*可用strlen判断长度 wchar*,long char*,(unsigned )short*可用wcslen判断长度 unsigned*/int */float *自行写函数判断  unsigned pintlen(int *array){     unsigned len = 0;     while (*array++) len++;     return len; }  (unsigned )long*/double *在32位时如上,在64位时将上述代码int改为long

user: user-2
content: [b]//利用 strlen函数计算数组内元素个数 若数组类型为float,double类型的数组无法使用strlen函数计算[/b] #include<stdio.h> #include<string.h>   int main() { 	char String[20] = {1,2.1,3,4,5,6,7,8,9}; 	printf("数组逆序输出\n"); 	// strlen()用来计算指定的字符串s 的长度，不包括结束字符"\0"。 	for (int i = strlen(String) - 1; i >= 0; i--)     printf("%d ", String[i]); }  测试结果

user: user-3
content: for (i = length-1; i >= 0; i--)     printf("xxx", arr[i]);[/color]
user-0 提问: 在线程中创建 CreateDialog卡死

回复:
user: user-0
content: 引用 4 楼 真相重于对错 的回复:多线程访问UI，需要发送消息。  难住我了， 我刚学，您的介绍太笼统，让我一脑子浆糊， 而且我这是需要在宿主进程内执行的代码，宿主应该不会给我发送的消息的。

user: user-1
content: 多线程访问UI，需要发送消息。

user: user-0
content: 我在网上找到相关的介绍了， 但是我看见有部分的人的程序，没有经过特别的加工 也能在dll创建ui不知道咋做到的 引用 1 楼 真相重于对错 的回复:我记得多线程，不特别修改，除主线程外不能直接使用ui

user: user-0
content: 自己顶一下

user: user-1
content: 我记得多线程，不特别修改，除主线程外不能直接使用ui
user-0 提问: 编程题，从文件 data.txt 输入数据，然后输出到文件 result.txt。

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复:版主？你确认是在问问题？  打开文件，读写文件的操作。网上可以搜一下的 你看清下题目，这道题目是先输入数据到data.txt然后在输出结果到result.txt，输出的结果你自己仔细看看，我现在第一步 就是有点没搞懂这个输入多行数据到文件中怎么弄

user: user-0
content: 你仔细看看这个题目

user: user-1
content: 版主？你确认是在问问题？  打开文件，读写文件的操作。网上可以搜一下的
user-0 提问: c程序设计问题

回复:
user: user-1
content: 引用 2 楼 zedd3337502212 的回复:[quote=引用 1 楼 自信男孩 的回复:] 楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11. 那个确实是我笔误了，但改了后还是不显示  问题应该在循环体里[/quote] 在你的代码基础上作了些修改，供参考  #include <stdio.h> #include <string.h> #define N 3  typedef struct person { 	char name[20]; 	int count; } Leader;  int main() {     Leader leader[N] = {"li", 0, "zhang", 0, "wang", 0}; 	int i; 	char leader_name[20]; 	for (i=0; i<N; i++) 	{ 		printf("请输入候选人的名字：\n"); 		gets(leader_name); 		if (strcmp(leader_name, leader[0].name) == 0) 		   leader[0].count++;         else if (strcmp(leader_name, leader[1].name) == 0) 		   leader[1].count++;         else if (strcmp(leader_name, leader[2].name) == 0) 		   leader[2].count++; 	} 	 	for (i=0; i<N; i++) 	{ 		printf("%5s : %d\n", leader[i].name, leader[i].count); 	}	 	 	getchar(); 	return 0; }

user: user-0
content: 引用 3 楼 自信男孩 的回复:[quote=引用 2 楼 zedd3337502212 的回复:] [quote=引用 1 楼 自信男孩 的回复:] 楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11. 那个确实是我笔误了，但改了后还是不显示  问题应该在循环体里[/quote] 我还怀疑你输入10次了吗？因为上一个循环循环次数是10次。[/quote] 破案了 我忘记输入10次了。。 感谢指点。

user: user-2
content: 引用 2 楼 zedd3337502212 的回复:[quote=引用 1 楼 自信男孩 的回复:] 楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11. 那个确实是我笔误了，但改了后还是不显示  问题应该在循环体里[/quote] 我还怀疑你输入10次了吗？因为上一个循环循环次数是10次。

user: user-0
content: 引用 1 楼 自信男孩 的回复:楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11. 那个确实是我笔误了，但改了后还是不显示  问题应该在循环体里

user: user-2
content: 楼主输出时，用的是i，应该改成j吧。因为在j的循环里。 如果还用leader[i].name那么是越界的。 因此此时的i是11.
user-0 提问: 求问关于VS run-time check failure #3报错的问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:你B没有初始化，DEBUG模式下会提示你，因为逻辑原因，导致你有可能使用没有初始化得变量。 哦哦我知道了，那看来是我写的有问题导致b的赋值失败了。 谢谢大佬！

user: user-1
content: 你B没有初始化，DEBUG模式下会提示你，因为逻辑原因，导致你有可能使用没有初始化得变量。
user-0 提问: 链表插入之后，发现链表最后一个节点与插入的节点（打印的时候陷入死循环）

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> /* typedef struct link { 	int data; 	struct link *next; }*linklist, listnode;  //*/#include "linklist.h" linklist Create_List(int n) {//创建n个长度的链表 	int i=0; 	linklist head,L,prep; 	if(n<=0){ 		puts("invalid element input!"); 		exit(0); 	} 	head=prep=(linklist)malloc(sizeof(listnode)); 	if(head == NULL){ 		puts("malloc failed!"); 		return head; 	} 	for(i=1; i<=n; i++){ 		if((L=(linklist) malloc (sizeof(listnode))) == NULL){ 			puts("failure to apply new space!"); 			return head; 		} 		else{ 			L->data = i; 			prep->next = L; 			prep = L; 		}  	} 	prep->next = NULL; 	//free(L);   //为什么要释放L呢，L已经加入到head链表里了 	return head; } int Insert_List(linklist head, int pos){//插入第pos位置的一个链表 	linklist p; 	p = head; 	linklist L = (linklist)malloc(sizeof(listnode)); 	L ->data = 99; 	L->next = NULL; 	int i=0; 	if (head ==NULL){ 		puts ("this list is null"); 		return -1; 	} 	if(L==NULL){ 		puts("new list is NULL"); 		return -1; 	} 	if(pos<=0){ 		puts("an error occurred in the location of the new list"); 		return -1; 	} 	//else{ 	while(p->next!=NULL){ 		p=p->next; 		i++; 		if(i==pos){ 			printf("yes\n"); 			L->next=p->next; 			p->next = L; 			//free(L);//为啥释放呢？ 			return 0; 		} 	} 	free(L);//为啥不释放呢？ 	puts("cross-border access"); 	return -1; 	//	} } int Is_Empty_List(linklist head){//是否为空 ，我没用这个函数 	if(head->next==NULL){ 		puts("this list is empty"); 		return -1; 	} 	else{ 		return 1; 	} } void Show_list(linklist head){//打印链表 	if(head == NULL){ 		puts("the head is null!"); 		return; 	} 	int i=0; 	linklist L; 	L = head->next; 	//while(L->next != NULL){ 	while(L != NULL){ 		i++; 		printf("the number %d -> data is %d\n",i,L->data); 		L=L->next; 	} 	return; }  /* int main(void) {  	linklist phead;  	phead = Create_List(10);  	Insert_List(phead, 5); 	Show_list(phead); }*/ 供参考～  不该释放的地方释放了，该释放的地方没有释放～
user-0 提问: 自增运算符问题

回复:
user: user-1

user: user-2
content: 这有关编译器的具体实现,如果真想弄清楚,需要查看反汇编代码,不过这样做也没什么具体意义

user: user-3
content: 不用太纠结，很烦的

user: user-4
content: 你只要知道: int i=3; int a=i++;  a=3;i=4； int b=++i; b=5;i=5 这样就好了，主要的知识点是i++和++i在赋值的时候的变化。 实际工作中是不会写你那样的代码的，要挨批评的。

user: user-5
content: 几十年了，老是有人问同一行一个变量多次++--，别这样写，没有C强制标准，编译器自己实现，就是编译器啥结果都可以理解为符合C规范.

user: user-6
content: 未定义行为 结果没意义 不用讨论
user-0 提问: 关于销毁栈的操作疑问

回复:
user: user-1
content: 手动申请的（new)，那么需要手动释放(delete)，否则申请的内存会成为碎片，下次这部分内存就不会再次被申请。当然你的程序执行完会被操作系统释放，但是前提是程序退出了。因此开发服务器程序，就需要注意这个情况，因为服务器程序一般不退出

user: user-0
content: OK内存了解了，那我直接让S . base = S . top = NULL，让两个指针不在指向栈。可以算是销毁栈吗？(空间是否释放先忽视)

user: user-2
content: base的内存应该是动态申请的吧，这样的话你自己不销毁，操作系统不会给你释放，delete与new 是成对存在的。
user-0 提问: 求二维数组所有素数的和

回复:
user: user-1
content: #include <stdio.h>  int main() {       int arr[3][3] = {0};     int i, j, sum = 0;     for (i=0; i<3; i++)     {         for (j=0; j<3; j++)         {             scanf("%d", &a[i][j];         }     }      for(i=0;i <3; i++)     {         for (j=0; j<3; j++)         {             if (不是素数)  //---》 自己写个判断素数的函数                continue;             else                sum += a[i][j];        }     }      printf("%d", sum);      getchar();     return 0; }  大致是这么个流程，写个判断是否是素数的子函数，
user-0 提问: 为什么用fputs（）写入不到txt中呢？

回复:
user: user-0
content: 读取这个文件里面的特定数据，但写入的文件里什么也没有。

user: user-0
content: 引用 2 楼 自信男孩的回复:代码这么写有问题，注意逗号是英文的，不是中文的。： //if (ch == '，')                                 if (ch == ',') 中文逗号不是占一个字符 太感谢您了

user: user-1
content: 代码这么写有问题，注意逗号是英文的，不是中文的。： //if (ch == '，')                                 if (ch == ',') 中文逗号不是占一个字符
user-0 提问: 求大佬解答下*p和**p的赋值问题

回复:
user: user-1
content: int *p; 表示p是指向整型的指针。 int **p; 表示p是指向整型指针的指针。

user: user-0
content: 第三个写错了  x函数里面应该是m=&i； 是不是说第三个里面p与m等价   m=&i；是不是就等于m中存放的内容不是p了，内容成了x函数中i的地址了 而第二个里面*m=3；是不是就等价于*p等于3，m中还是存放的p的内容？

user: user-2
content: 首先第一个，i是局部变量，当函数x调用完之后，*m或者p指向i的位置就没有意义了。 第二个，传的实参是p，即i的地址，m变量里存的是i的地址，在x函数里*m = 3；等价于i = 3;（此i是main函数里的i）； 第三个，形参是一重指针，由于m是局部变量，并且*m = &i;;但是这样，由于i是局部变量，并且m是和p是等价的。所以，第一和第三基本上是一样的。

user: user-0
content: 为什么第二个的输出是3？
user-0 提问: C的exe文件可否脱壳为C源码

回复:
user: user-0
content: 好的 大概知道了，谢谢各位大佬！最近在看论文提供的代码 其中一个exe程序的源代码没法看到挺难受的，毕竟算法类太难了

user: user-1
content: 加壳是对exe文件进行处理，压缩、加密，脱壳则相反。 编译对应的反编译，实际上反编译是不能获得C源程序的，只有某些非真正编译的语言才能获得源程序，比如C#

user: user-2
content: 自然不行，  只能看反汇编代码。

user: user-3
content: 那不叫封装，叫编译，不可逆的过程，IDA之类可以反编译为C代码，但是和原来一样是不可能的，只能做为参考。 壳是在编译之后加的一层指令加密操作，在运行时还原指令，两回事
user-0 提问: 为什么c会输出11啊

回复:
user: user-1
content: 没毛病  区分 b--跟--b的用法 就行！

user: user-2
content: 注意b--和--b的用法区别。b--是先参与计算，然后b-1; --b是先-1再计算

user: user-3
content: 没问题啊，b--意思就是直行c=a-b,然后b-=1;

user: user-4
content: b-- 是后减减，先是a-b然后再b-1。

user: user-5
content: b初始值是 1 b-- 计算结果就是 1
user-0 提问: 小白求教，有一个c语言的问题困扰我很多天了，求大神帮帮忙

回复:
user: user-1
content: score[][]是一个二维数组  里边的里边的第一个元素的值（60）可以用**score 表示。最后一个是*(*(score+2)+3). *(score+1)是数组score[1][0]的地址 ,其后地址为score[1][0]  score[1][1] score[1][2] score[1][3]；后边还有 score[2][0]  score[2][1]等等   题目中p是一个地址  *（score+n-1）也是一个地址    我感觉你主要还是没有搞懂二维数组的指针表示。反正你知道二维数组中一个 * 是地址 两个* 是数值就好了

user: user-2
content: 二维数组前面加一个星号就代表列了，p=*（score+n-1）代表p指向a[n-1][0]的地址， *(score+1)+2就代表a[1][2]

user: user-3
content: 嗯？二维数组？ 认识这个吗？对没错，这就是传说中的套娃， 不过，用这个来比喻本例中的二重指针**不是很恰当，需要稍微改装一下， 大声唱：大套娃装小套娃，一个小套娃呀，两个小套娃，三个小套娃呀四个小娃，             小套娃里装豆豆，套娃是指针啊，豆豆是数据 嗯嗯，唱完你就会了 假设这套娃只有3层，大套娃（最外层指针）里面并排装了4个小套娃（里层指针）， 至于这4个小套娃，里面装多少粒豆子（数据 int，注意这里用豆子，而不是套娃了，再套下去套路就太深了），你随意，在本例中是3，（3行4列） 这就是参数 （float score[][4]）,表达的意思； score就是那个外层大套娃  指针操作这东西，*，每用一次*，你就可以理解为打开一层套娃， 而目前所学的，指针跟数组的关系，就是那么一条 int arr[4]; int *p = arr; *p；    //也就是 *(p+0)， p[0] *(p+1）；    //p[1] *(p+2)；    //p[2] *(p+3）；    //p[3]; 好了， 来看代码float *search(float score[][4],int n){     float *p;     p=*(score+n-1);     /*     *(score + 0);    score 是什么？大套娃，*呢？ 打开它（一次）； 打开一次之后你看到豆子了吗？--没有，你看到了4个小套娃 *(score+0)呢，4个中的第一个“套娃” *(score+1)呢？   第二个“套娃” ........ *(score+3)呢， 第四个“套娃” 好了，p是什么？豆豆？ 不是的，不是豆豆，是套娃，回想前面的歌谣，，套娃是什么，套娃是指针 从函数返回，丢个小套娃出去，想访问数据（豆豆）， 再开一次套娃，怎么开 用*， *(p+0) *(p+1)....... */      return p;  }   最后，正经点的，来折磨你一下，其实编译器是怎么翻译这个函数的呢  //先来个简单的,热身一下 float *search(float score[4], int n); //实际上转为====> float *search(float *score, int n);  //然后这个呢 float *search(float score[][4],int n) //实际上在编译器里，他是这样的东西==》 float *search(float (*score)[4], int n);   你看懂了吗？如果不懂，，还是想想套娃吧。

user: user-4
content: #include<stdio.h> float *search(float * score, int n); int main() { 	float score[][4] = { { 60,70,80,90 },{ 56,89,67,88 },{ 34,78,90,66 } }; 	printf("Please input you need to score of student's number:\n"); 	int n; 	float *p; 	scanf("%d", &n); 	p = search((float*)score, n); 	printf("You need to number of %d student 's score:\n", n); 	int i; 	for (i = 0; i<4; i++) { 		printf("%.2f\t", *(p + i)); 		//p++; 	} 	return 0; } float *search(float * score, int n) { 	float *p; 	p = (score + (n - 1)*sizeof(float)); 	return p; } 这样可能更容易理解一下指针，原来的关键在于编译器如何解释这个二唯数组

user: user-5
content: score是一个二维数组。每个学生一行记录共四个整形数，对应数组编号1号学生score[0][0]-score[0][3],编号2号学生score[1][0]-score[1][3],编号3号学生score[2][0]-score[2][3],编号4号学生score[3][0]-score[3][3],。指针p可以取到第二维的每一个数据地址即第n个学生的第一个成绩score[n-1][0]，*（p+1）第二个成绩score[n-1][1]，*（p+2）第三个成绩score[n-1][2]，...
user-0 提问: 创建一个控制台应用程序，在其中定义两个4行3列的矩阵 求帮助

回复:
user: user-1
content: 供参考  #include <stdio.h>  void arr_input(int p[4][3]); void arr_print(int p[4][3]);  int main() { 	int a[4][3], b[4][3], c[4][3]; 	printf("输入第一个矩阵的元素：\n"); 	arr_input(a); 	printf("输入第二个矩阵的元素：\n"); 	arr_input(b); 	int i, j;	 	for (i=0; i<4; i++) 	{ 		for (j=0; j<3; j++) 		{ 			c[i][j] = a[i][j] - b[i][j];			 		}		 	} 	printf("新矩阵是：\n"); 	arr_print(c); 	 	getchar(); 	return 0; }  void arr_input(int p[4][3]) {     int i, j;	 	for (i=0; i<4; i++) 	{ 		for (j=0; j<3; j++) 		{ 			scanf("%d", &p[i][j]); 		} 	} 	 }  void arr_print(int p[4][3]) { 	int i, j;	 	for (i=0; i<4; i++) 	{ 		for (j=0; j<3; j++) 		{ 			printf("%5d", p[i][j]); 		} 		printf("\n"); 	} }
user-0 提问: 求大佬告知我这段代码末尾为什么会重复打印最后一行，请解释地详细点

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  #define MAX 1024  int main(void) {     FILE *fp;     char buffer[MAX];      if ((fp = fopen("lines.txt", "w")) == NULL)     {         printf("打开文件失败！\n");         exit(EXIT_FAILURE);     }     fputs("Line one: Hello World!\n", fp);     fputs("Line two: Hello Fishc!\n", fp);     fputs("Line three: I love Fishc.com!\n", fp);      fclose(fp);      if ((fp = fopen("lines.txt", "r")) == NULL) {         printf("打开文件失败！\n");         exit(EXIT_FAILURE);     }      while (!feof(fp))     {         if (fgets(buffer, MAX, fp)== NULL)             break;         printf("%s", buffer);     }     fclose(fp);      return 0; } 供参考～

user: user-2
content: int ch;         while (!feof(fp))         {             fgets(buffer, MAX, fp);             printf("%s", buffer);             ch = fgetc(fp);             if (ch == -1)                break;         }  “C”语言的“feof()”函数返回的是最后一次“读操作的内容”。多年来把“位置和内容”相混，从而造成了对这一概念的似是而非。 那么，位置和内容到底有何不同呢？举个简单的例子，比如有人说“你走到火车的最后一节车箱”这就是位置。而如果说“请你一直向后走，摸到铁轨结束”这就是内容。也就是说用内容来判断会“多走一节”。这就是完全依赖于“while(!feof(FP)){...}”进行文件复制时，目标文档总会比源文档“多出一些”的原因。 在“C”文件读取操作时不能完全依赖于“while(!feof(FP)){...}”的判断。 更多细节，可以查询百度百科 feof 函数
user-0 提问: c语言如何处理不知道行数的字符串输入？

回复:
user: user-0
content: 输出： 如果屏蔽词库如下： is good are the ha ha some get has more bad 则输出：  The night falls gently. And you !@#$%^&* not here. I m!@#$%^&*sing you !@#$%^&* and !@#$%^&* and I start !@#$%^&*ting worried as I st!@#$%^&* at !@#$%^&* door just waiting for you to surpr!@#$%^&*e me with your arrival at any moment. Sweet delusion... you !@#$%^&* so far away right now that all I can ask for !@#$%^&* that time moves faster...

user: user-0
content: The night falls gently. And you are not here. I missing you more and more and I start getting worried as I stare at the door just waiting for you to surprise me with your arrival at any moment. Sweet delusion... you are so far away right now that all I can ask for is that time moves faster...

user: user-0
content: 题目描述： 互联网中存在许多的不和谐词汇，在我们浏览互联网的时候，搜索引擎经常会出现提示信息“根据相关法律法规和政策，部分搜索结果未予显示”。小王同学也想制作一个自己的屏蔽词库，这样他就可以将自己不喜欢的词汇从文件中换成别的字符了。屏蔽词库是一个ASCII码文件，这个文件中只含有单词，每个单词占一行，每个单词中只可能有大小写字母与空格。题目中和谐词库的文件名为dict.dic。（屏蔽词库中每个词汇长度小于10，屏蔽词汇个数不超过10.） 你的任务是将输入中的所有和谐词库中的词语全部替换成“!@#$%^&*”（按住键盘shift和数字1至8），然后输出。这里要注意，如果一个词语中包含屏蔽词汇，那么只将屏蔽词汇替换，例如“hehasAAA”被处理后将得到“he!@#$%^&*AAA”，注意屏蔽词汇区分大小写，即aaa与AAA是两个不同的单词，为了使问题简化，屏蔽词汇中不会出现互相包含的情况，如“xabcx”与“abc”不会同时出现在同一个屏蔽词库中。由于小王同学很不擅长文件操作，所以他希望你能帮他制作这个屏蔽词汇程序。