Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: fopen（）打不开文件

回复:
user: user-1
content: 引用 8 楼 lmh589 的回复:[quote=引用 5 楼 smwhotjay 的回复:]  调试和运行，工作路径是不同的。能具体解释一下吗 比如说这个是和上面那个有相同问题的程序这样不对吗？[/quote] 你打开的是test还是test.txt？文件名不全？

user: user-2
content: 估计是哪里的搜索路径设置问题。 我的环境上一直就是在工程文件同目录下。 我也不知道在哪去设置这个路径

user: user-2
content: 估计是哪里的搜索路径设置问题。 我的环境上一直就是在工程文件同目录下。 我也不知道在哪去设置这个路径

user: user-0
content: 引用 9 楼 arfi 的回复:把文件放到上一级目录看看，也就是说和工程文件放一起 收到你的启发我写了一个文件程序放在了哪里，问题果然解决了， 能帮忙解释一下为什么吗？是要和.c 文件放在一起吗？

user: user-2
content: 把文件放到上一级目录看看，也就是说和工程文件放一起

user: user-0
content: 引用 5 楼 smwhotjay 的回复: 调试和运行，工作路径是不同的。能具体解释一下吗 比如说这个是和上面那个有相同问题的程序这样不对吗？

user: user-0
content: 引用 6 楼 自信男孩 的回复:不是路径的问题，而是括号扩的位置不对。根据赋值号=和==的优先级是==高，所以先判断fopen(xx, xx) == NULL,然后把判断结果赋值给fp。所以fp是NULL哦，对的，你说得对，但是改完之后还是无法打开文件，而且我电脑上所有含有fopen函数的程序都无法打开文件。

user: user-1
content: 不是路径的问题，而是括号扩的位置不对。根据赋值号=和==的优先级是==高，所以先判断fopen(xx, xx) == NULL,然后把判断结果赋值给fp。所以fp是NULL

user: user-3
content: 调试和运行，工作路径是不同的。

user: user-0
content: 引用 2 楼 真相重于对错 的回复:输入绝对路径，或者文件所在目录是可执行文件的当前目录下，或者是path环境变量包含的目录。 文件就是在可执行文件的当前目录下的

user: user-4
content: 估计文件路径问题或者文件不存在

user: user-5
content: 输入绝对路径，或者文件所在目录是可执行文件的当前目录下，或者是path环境变量包含的目录。

user: user-0
content: 要说最近干了什么蠢事就是删了系统变量Path，然后复制了一个其他人的，和这个有关系吗？
user-0 提问: 为什么%n无法输出正确的值？？？

回复:
user: user-1
content: 代码和输出不匹配 目测你没有重新编译 或者没保存

user: user-0
content: 我这个是C，我试了一下你那个方法直接报错了

user: user-2
content: 当printf()使用%n时，会有不安全的隐患，因此，默认情况下，%n是不能使用的。如果需要使用，则要打开%n的开关。 int num; 	int c = 12345; 	int e = _get_printf_count_output(); 	if (e == 0) 	{ 		_set_printf_count_output(1); 	} 	printf("%d%n\n", c, &num); 	printf("%d\n", num); VS2015 C++环境调试  请参考《C++中printf()函数的用法10-5》 希望能够帮到你！

user: user-0
content: 这个倒是没有，昨天还出现过nun%2直接改了num的值的情况，不知道是不是我dev -c软件出问题了
user-0 提问: 求助大佬

回复:
user: user-1
content: 你这不是求素数，是求偶数啊 素数是不能被1和自身以外的其他数字整除的 你可以看看这个代码 #include<stdio.h> int main() {     int t,count=0,i,j;     float sum=0;     for(i=100;i<=200;i++) 	{ 		//判断素数  		for(j=2;j<i;j++) 		{ 			if(i%j==0) 				break; 			else 			{ 				sum=sum+i; 				count++; 			} 		} 	}  	printf("%f",sum/count); 	return 0; }
user-0 提问: 既然计算机内部使用的是补码，为什么我们还需要学习原码和反码？

回复:
user: user-0
content: 谢谢大佬们

user: user-1
content: 既然我们吃第三个面包就能饱 为什么要吃前两个面包??  我一直以为这是笑话来着

user: user-2
content: 如果只学补码，你知道补码怎么算吗？给你一个补码，你能知道它应该等于多少吗？ 就好比加密一样，我只告诉你加密后的结果，不告诉你我是怎么加密的，你能知道我加密前的数据是什么吗？

user: user-3
content: 我想是的，要不咋理解补码=反码+1
user-0 提问: 程序出错求解答

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> int main() {     FILE *fp;     fp=fopen("p1.txt","r");     if(fp==NULL)     {         printf("文件打开失败，程序退出! ");         exit( 0);     }     char ch;     int i=0,j=0;      while(!feof(fp))     {         fscanf(fp,"%c",&ch);         if(ch=='[')             i++;         if(ch==']')             j++;         ch = 0;   //重置，防止fscanf读取失败后ch保留上一次的值。     }     if(i==j)     printf("0K!\n");     if(i!=j)     printf("ERROR!\n"); } 供参考～

user: user-2
content: 你只使用feof判断结束是不行的  下面是正确的代码 #include<stdio.h> #include<stdlib.h> int main() { 	FILE *fp; 	fp=fopen("p1.txt","r"); 	if(fp==NULL) 	{ 		printf("文件打开失败，程序退出! "); 		exit( 0); 	} 	char ch; int i=0,j=0; 	while(!feof(fp)) 	{  		int end=fscanf(fp,"%c",&ch); 		if(end==-1) break; 		if(ch=='[')i++; 		if(ch==']')j++; 	} 	if(i==j) 	printf("0K!\n"); 	if(i!=j) 	printf("ERROR!\n"); }   具体错误原因你可以看看这篇文章 https://blog.csdn.net/qq_45721778/article/details/105818272
user-0 提问: printf函数中的转换说明和我们平时用的强制转换说明一样吗？

回复:
user: user-1
content: 任何有赋值号的语句都会改变变量i的值，其他的都是表达式，仅此而已

user: user-2
content: 引用 楼主 weixin_45906870 的回复:举个例子： int i=336； 理解一：printf（“%d %c”， i ,i）; 这里的%d和%c其实只是个翻译说明，整型数i在计算机内存里面并没有因此而改变；  理解二：接着上面 printf("%d", (char)i);  //此时i在转换成char类型时，打印出来的是i等于80，但是i的内存仍然不变，因为printf函数中不管是双引号中的还是双引号外面的转换说明都只是翻译说明。 printf("%d", (int)i);   //此时打印出来的i等于336，上面操作并没有改变i的内存  理解三：接着上面，如果 i = (char)i;           //此时的强制转换说明在内存中发生“截断” printf（“%d”，i ）;   //这里的i真的就是发生的内存改变，打印出来的是80； i = （int）i；      //即使这里再强制转换回去 printf（“%d”，i）;   //这里打印出来的仍然是80，不会再变成336了 结论：所以，printf函数中的转换说明和平时用的强制转换说明是不一样的，我这样理解对吗？ 你的理解是错的. (char)i;会在内存中生成一个临时char，存储这个char,然后i=(char)i这个改变了原来i的值，所以你不可以转换回去，表达式结果存储并不会利用原来的变量空间。

user: user-3
content: %c是从内存里取一个字节，%d是从内存取4个字节（32位系统里）。而不是类型转换。
user-0 提问: c语言请教大佬

回复:
user: user-1
content: 你这代码错误有点多呀  char是单字节变量，只能存储一个字符。如果是比较字符，你最多用’#’，如果想用两个结尾，你得用字符串（字符数组）存储，比较时用strcmp函数。

user: user-0
content: 引用 1 楼 5250的回复:能贴代码就别贴图片 就是直接把代码复制到下头吗？

user: user-0
content: 引用 2 楼 arfi的回复:printf("按成绩排名")前面少了个｝ 是了，解决了一些，不过那个warning还在

user: user-1
content: printf("按成绩排名")前面少了个｝

user: user-2
content: 能贴代码就别贴图片

user: user-3
content: 上面写错了,将 || 改为 |

user: user-3
content: 11行处改为 if (*(short*)&x[i] == ('#' << 8) || '#') 原因"##"(不计算'\0')占两个字节,无法使用char进行比较,使用short进行比较可以

user: user-2
content: 引用 4 楼 qq_47279096 的回复:[quote=引用 1 楼 5250的回复:]能贴代码就别贴图片 就是直接把代码复制到下头吗？[/quote]  引用 4 楼 qq_47279096 的回复:[quote=引用 1 楼 5250的回复:]能贴代码就别贴图片 就是直接把代码复制到下头吗？[/quote]  是呀 下次问问题把代码贴出来  别人可以直接拷过去运行或者调试 你这贴图片 除非是平写错误  要是其他错误 很难看出来
user-0 提问: C程序问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:你的puts后面是两个换行吗？ 看来是将换行作为一个字符读入了。 用scanf替换下好的

user: user-1
content: 你的puts后面是两个换行吗？ 看来是将换行作为一个字符读入了。 用scanf替换下
user-0 提问: error C2109: subscript requires array or pointer type报错 怎么办 求大佬解决

回复:
user: user-1
content: #include <stdio.h> #include <string.h> //void main(void) int main(void) {     char A1[100]={0};     char A2[100]={0};     int i;     printf("请输入任意字符串 \n\r");     //scanf("%s",&A1);     scanf("%s", A1);     memcpy(A2,A1,sizeof(A1)/sizeof(char));     for(i=0;i<100;i++)         //printf("A[%d]=%s\n\r",i,A[i]);         printf("A[%d]=%c\n\r",i,A2[i]);   } 供参考～
user-0 提问: C语言队列题目

回复:
user: user-0
content: 求救啊

user: user-0

user: user-0
content: 没有人在吗？·

user: user-0
content: 我更改了，但还是有问题，调试显示在执行panduan这个函数时，initqueue(q1)这一步的q->front = q->rear = (PNODE)malloc(sizeof(NODE))显示program received signal SIGSEGV，不是很明白啊，求教。

user: user-1
content: 要插入n个数字，就要malloc调用n次， 每次申请一个新的节点，把它插入进去才对

user: user-1
content: Linkqueue insertqueue1(Linkqueue *q, int n) {  int i; PNODE p; p = (PNODE)malloc(sizeof(NODE)); if(p==NULL) exit(0); for(i=0;i<n;i++) {  //你这里是要插入n个数字，但是你每个給每一要插入队列的节点分配内存    // 要把前面对p对malloc，拉到这个循环里面来 scanf("%d",&p->data); p->next = NULL; q->rear->next = p; q->rear = p; } }  先改了这个再看吧
user-0 提问: x*y++为什么表示的是（x）*（y++）呢，是不是p=x*y++就是先做乘法呢

回复:
user: user-1
content: a = b; //这既是一个赋值运算，也是一个表达式，只要表达式就有一个返回值。两个操作 c++； //这既是一个自增运算，也是一个表达式，只要表达式就有一个返回值。两个操作

user: user-2
content: ++运算符优先级较高

user: user-1
content: 引用 9 楼 千梦一生 的回复:p = x*y++; 前两个相邻运算符  A=B*C;  *优先级大于=，因此优先计算B*C表达式的返回值，即计算【x*y++】表达式的返回值X。 return 【A=X】表达式的返回值;//这注意，比如结果A = 88这里并不是该表达式的返回值，只不过在这里碰巧遇上相同了而已 ----------------------------------------------------------------------------------------- x*y++; 前两个相邻运算符  M*N++  ++优先级大于*，因此优先计算N++表达式的返回值，即计算【N++】的返回值X。 return 【M*X】表达式的返回值; ------------------------------------------------------------------------------------------ N++； 一个运算符  step1:N=N+1; step2:return 自增之前的N ------------------------------------------------------------------------------------------  这个式子总结下来就是 p = x*y++; 根据优先级进行运算：设x = 3，y = 2,p = null 1.y++表达式【y自增y = 2，返回y，返回1】 2.x*(1的返回值)【返回3*2 = 6】 3.p=(2的返回值)【p被赋值为2的返回值，返回p的值（这个值在该式子中未被使用）】  一个从左到右的递归求值

user: user-1
content: p = x*y++; 前两个相邻运算符  A=B*C;  *优先级大于=，因此优先计算B*C表达式的返回值，即计算【x*y++】表达式的返回值X。 return 【A=X】表达式的返回值;//这注意，比如结果A = 88这里并不是该表达式的返回值，只不过在这里碰巧遇上相同了而已 ----------------------------------------------------------------------------------------- x*y++; 前两个相邻运算符  M*N++  ++优先级大于*，因此优先计算N++表达式的返回值，即计算【N++】的返回值X。 return 【M*X】表达式的返回值; ------------------------------------------------------------------------------------------ N++； 一个运算符  step1:N=N+1; step2:return 自增之前的N ------------------------------------------------------------------------------------------  这个式子总结下来就是 p = x*y++; 根据优先级进行运算：设x = 3，y = 2,p = null 1.y++表达式【y自增y = 2，返回y，返回1】 2.x*(1的返回值)【返回3*2 = 6】 3.p=(2的返回值)【p被赋值为2的返回值，返回p的值（这个值在该式子中未被使用）】

user: user-1
content: 啊，已经遗忘这种很6的写法了。 本咸鱼基本就一直都是： ...... i++； ......

user: user-3
content: （x）*（y++）和 x*y++的运行结果是一样的 你加多少个括号都不能改变这种规则。 p=x*y++，是先用x,y现在的值计算得出p，然后再给y加1，等同于p=（x*y,y++);

user: user-0
content: 引用 2 楼 lin5161678 的回复：你的问题和运算顺序 无关 y++ 结果就是 y  所以 x*y++ 的值 和 x*y 的值一样   另外 优先级和运算顺序无关就是说x=1，y=1， x*y++结果也是1吗

user: user-4
content: 引用 5 楼 刚学c的超级超级超级菜鸟 的回复:[quote=引用 2 楼 lin5161678 的回复：]你的问题和运算顺序 无关 y++ 结果就是 y  所以 x*y++ 的值 和 x*y 的值一样   另外 优先级和运算顺序无关就是说x=1，y=1， x*y++结果也是1吗[/quote] 运算结束后ｙ的值会加一，前＋＋操作是运算时就执行，后＋＋操作是当这一句执行过后再执行＋＋操作

user: user-5
content: y++这个++在y被使用后才会生效  所以题目你可以这样理解 p=x*y y++

user: user-6
content: 我没听明白你的问题，可否拿代码说明你的问题

user: user-7
content: 你的问题和运算顺序 无关 y++ 结果就是 y  所以 x*y++ 的值 和 x*y 的值一样   另外 优先级和运算顺序无关

user: user-8
content: 因为++的这个运算符优先级比*的高。谁优先谁就算运算。可以自行百度C语言运算符优先级表
user-0 提问: 输入与输出对应

回复:
user: user-1
content: 引用 5 楼 ?Victor.?? 的回复:int main() { 	char c; 	while((c=getchar())!='\n') 	{ 		switch (c) 		{ 			case 'a':printf("1");break; 			case 'b':printf("2");break; 			case 'c':printf("3");break; 		} 	} 	return 0; } 这样应该就可以 如果不考虑变量类型和扩展性的话，5楼基本满足

user: user-0
content: 引用 5 楼 ?Victor.??的回复:int main() { 	char c; 	while((c=getchar())!='\n') 	{ 		switch (c) 		{ 			case 'a':printf("1");break; 			case 'b':printf("2");break; 			case 'c':printf("3");break; 		} 	} 	return 0; } 这样应该就可以 OK，，，，，

user: user-2
content: int main() { 	char c; 	while((c=getchar())!='\n') 	{ 		switch (c) 		{ 			case 'a':printf("1");break; 			case 'b':printf("2");break; 			case 'c':printf("3");break; 		} 	} 	return 0; } 这样应该就可以

user: user-0
content: 引用 3 楼 scribbler的回复:int a = 1; int b = 2; int c = 3;  "abc"->123; "cab"->312;  是这样的题意？ 如果输入acb就要输出132 就是输入abc三个的顺序不同其对应的数输出顺序也不同

user: user-1
content: int a = 1; int b = 2; int c = 3;  "abc"->123; "cab"->312;  是这样的题意？

user: user-0
content: 引用 1 楼 ?Victor.??的回复:有点不明题意  可以给出部分代码吗 就是改变输入abc的顺序，输出结果也要改变

user: user-2
content: 有点不明题意  可以给出部分代码吗
user-0 提问: C语言中char类型和int类型仅仅是取值范围不同吗？

回复:
user: user-1
content: 1 可以这么理解，char比int占用字节数少，所以从省内存的角度来说没问题。 2 计算机的世界里只有0和1，所以它们本质是一样的，都是二进制，所以理解也没问题。 3 这点理解不对，byte（字节，c里char和byte等价）是处理的最小单位，因为一个byte表示的数据大小有限，不足以满足需求，当然用byte数组也可以解决问题，但是不方便，不能把byte数组当作一个整体类型表现，于是就扩展类型，就增加了shor（占2字节），int（占4字节）等等。

user: user-2
content: int i = 1; 	char ch = 1;
user-0 提问: C语言数组

回复:
user: user-1
content: #include <stdio.h>  int main(int argc,char *argv[]){      char s[50],a,b,*p=NULL;     gets(s);     scanf("%c %c",&a,&b);     for(p=s;*p!='\0';p++){         if(*p==a){             *p=b;         }     }     puts(s);     return 0; }  这样吧 稳妥点

user: user-1
content: #include <stdio.h>  int main(int argc,char *argv[]){      char s[50],a,b,*p=NULL;     gets(s);     scanf("%c %c",&a,&b);     for(int i=0;s[i]!='\0';i++){         if(s[i]==a){             s[i]=b;         }     }     puts(s);     return 0; }  似乎那个p没用到....
user-0 提问: 利用指针编写程序，统计字符串的长度。(不要使用求字符串长度函数）

回复:
user: user-1
content: Len = 0; while(*str++)     len++;

user: user-2
content: 引用 1 楼 真相重于对错 的回复:size_t MyStrLen(char* str) { 	if (str == NULL) 		return 0; 	char* p = str; 	while (*p!= '\0') { 		p++;  	} 	return p-str; }  如下供参考～ size_t my_strlen(const char *str) {     if (str == NULL)         return 0;      const char *p = str;      while (*p)         p++;      return p-str; }

user: user-3
content: size_t MyStrLen(char* str) { 	if (str == NULL) 		return 0; 	char* p = str; 	while (*p!= '\0') { 		p++;  	} 	return p-str; }
user-0 提问: c语言请教大佬

回复:
user: user-1
content: 函数声明 int ave(int (*arr)[2], int n);  因此，传递的参数应该是ave(x, 10);  参数o,m都是不确定的值，至少m需要在编译的时候就要确定值。

user: user-2
content: 要不就主函数前面 加上一句 #define o 10 #defube m 2 二维数组作为参数，第二个[]里必须是个常量值，第一个[]可不填
user-0 提问: 为啥我函数的返回值一直是0

回复:
user: user-1
content: 你的x输入的都不是素数？要看你输入的是什么数据？  另外，建议去掉for循环中i < a判断，因为这个判断是多余，因为i = a-1; i--，i < a是恒成立的

user: user-2
content: 贴出你的运行图。你的代码我这里无事。。。。

user: user-3
content: int shushu(int a)的实现部分已经写在main函数前面了，主函数里的声明可以不要
user-0 提问: C语言中，为什么字符串中的字符可以是汉字？而char类型的字符却不可以？

回复:
user: user-1
content: 汉字是多字节或者unicode编码，一个字符不能完整的表达汉字。

user: user-2
content: 汉字是字符串，不是字符。汉字编码不是一个字符能够表示的。

user: user-3
content: 因为汉字是由2个char组成的
user-0 提问: 我编的一个小程序怎么没输出？程序功能：要求写三个函数，一个用来输入10个整数，一个理这组数，一个输出处理后的数。将最小的数和第一个数换，最大的和最后一个调换

回复:
user: user-0
content: 我用了你的程序。很感谢，但是我还是想问哈我的程序错在哪。

user: user-1
content: 你的处理函数太混乱，在你的代码基础上修改，供参考  #include<stdio.h>  void input(int a[]); void f(int a[]); void output(int a[]);  int main() {     int a[10];     input(a);     f(a);     output(a);     return 0; }  void input(int a[]) {     int i = 0;     printf("please input 10 numbers:\n");     for (i=0;i<10;i++)     {         printf("第%d个数字为:",i+1);         scanf("%d", &a[i]);     } }  void f(int a[]) {     int t=0, minindex=0, maxindex=0;     int min=a[0],max=a[0];     int i = 0;     for (i = 0; i < 10; i++)     {         if (a[i] < min)         {             min = a[i];             minindex = i;         }         if (a[i] > max)         {             max = a[i];             maxindex = i;         }     }     if (minindex != 0)     {         t = a[0];         a[0] = a[minindex];         a[minindex] = t;     }     if (maxindex != 9)     {         t = a[9];         a[9] = a[maxindex];         a[maxindex] = t;     } }  void output(int a[]) {     int i = 0;     for (i = 0; i < 10; i++)     {         printf("%3d", a[i]);     }     printf("\n");     printf("最小的数字为:%3d,最大的数字为:%3d\n",a[0],a[9]); }

user: user-0
content: 我的程序如下 #include<stdio.h> int main() { 	void input(int a[]); 	int a[10]; 	void f(int a[]); 	void output(int a[]); 	input(a); 	f(a); 	output(a); 	return 0; }  void input(int a[]) { 	int i = 0; 	printf("please input 10 numbers:\n"); 	for (i=0;i<10;i++) 	{ 		printf("第%d个数字为:",i+1); 		scanf("%d", &a[i]); 	} }  void f(int a[]) { 	int t; 	int min=a[0],max=a[0]; 	int *p1,*p2; 	int i = 0; 	for (i = 0; i < 10; i++) 	{ 		if (a[i] < min)  		{ 			min = a[i]; 			p1=&a[i]; 		} 		if (a[i] > max)  		{ 			max = a[i]; 			p2=&a[i]; 		} 	} 	t=a[0]; 	a[0]=*p1; 	*p1=t; 	t=a[9]; 	a[9]=*p2; 	*p2=t; }  void output(int a[]) { 	int i = 0; 	for (i = 0; i < 10; i++) 	{ 		printf("%3d", a[i]); 	} 	printf("\n"); 	printf("最小的数字为:%3d,最大的数字为:%3d\n",a[0],a[9]); }
user-0 提问: 哪位大神可以帮我看一下

回复:
user: user-1
content: while循环

user: user-2
content: 建议楼主通过调试分别分段来定位问题，先看程序运行到哪里卡顿了。一下子看这么多代码不好定位。

user: user-3
content: 真相只有一个  你的6个while陷入了死循环，大概看了一下，好家伙 没几个正常循环的，哈哈
user-0 提问: 求助

回复:
user: user-1
content: for example int main() {     int a[10]={1,2,3,4,5,6,7,8,9,0};     int max=0, min=0, i;     for (i=0; i<10; i++) {         //scanf("%d", &a[i]);         if (a[i] > a[max])             max = i; //保存最大数的位置         if (a[i] < a[min])             min = i; //保存最小数的位置     }     printf("交换前的数组：");     for (i=0; i<10; i++)         printf("%d ", a[i]); ;     if (max != min) { //交换最大最小         i = a[max];         a[max] = a[min];         a[min] = i;     }       printf("\n交换后的数组：");     for (i=0; i<10; i++)         printf("%d ", a[i]);          return 0; }
user-0 提问: 一个插入数据的问题

回复:
user: user-1
content: scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]); scanf("%d",&a[i]);  这几句看着很难受 for (i=0; i<10; i++) {     scanf("%d", &a[i]); } 这样赋值吧

user: user-2
content: int i; //这里的i没有初始化， 是个随机数了 scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]); scanf("%d",&a[i]);// 这里不知道把数据读到哪儿去了。这里应该是  &a[9]  实际是只是输入了9个有效数字； 第十个输入结果是未知的 后面排序的结果也就未知了

user: user-0
content: 引用 2 楼 chxchxkkk的回复:scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]); scanf("%d",&a[i]);  这几句看着很难受 for (i=0; i<10; i++) {     scanf("%d", &a[i]); } 这样赋值吧 这样赋值是为了输入数据用逗号隔开

user: user-0
content: 引用 1 楼 寻开心的回复:int i; //这里的i没有初始化， 是个随机数了 scanf("%d,%d,%d,%d,%d,%d,%d,%d,%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8]); scanf("%d",&a[i]);// 这里不知道把数据读到哪儿去了。这里应该是  &a[9]  实际是只是输入了9个有效数字； 第十个输入结果是未知的 后面排序的结果也就未知了 谢谢！问题解决了
user-0 提问: 写入位置时发生冲突，如图，该冲突如何解决，求解

回复:
user: user-0
content: 引用 1 楼 user-1的回复:从头到尾你就只在开始的时候用malloc申请了一个结点，后面空指针肯定报错 已解决，3Q

user: user-1
content: 从头到尾你就只在开始的时候用malloc申请了一个结点，后面空指针肯定报错
user-0 提问: 求大佬帮忙解释这个二进制的问题

回复:
user: user-1
content: 打印过程中发生了从char到unsigned int的转换，这种转换默认是按照符号扩展的，也就是11111111会变成1111111.......1111 和下面代码等价  unsigned u = c; printf("u = %u\n", u);

user: user-2
content: printf("c = %u\n", (unsigned char)c);即可  但是这个用法是不安全的。  #include <stdio.h>  int main(void) {         char c = -1;         int i = -1;         char bytes[4] = {0};         bytes[0] = c;         printf("c = %u\n", *(unsinged int*)bytes);         printf("i = %u", i);          return 0; }

user: user-3
content: 别的不说，你是真的sm,gcs,嘻嘻[大哭

user: user-4
content: 类型提升，-1（char)提升到int是-1，再提升到unsigned int

user: user-5
content: %u的作用就是把要输出的数按照无符号整型的方式输出，所以char类型会转换为unsigned int，如果还想以char类型输出，则可以考虑使用如下方法 printf("%hhx", c); 此时的输出是ff 请参考《C++中printf()函数的用法3》 希望能够帮到你！

user: user-6
content: 打印修改为 printf("c = %u\n", (unsigned char)c); 就好。  printf为可变参函数，打印的类型，数目就是靠格式串判定的，所以碰到%u,就会取4字节数据出来。

user: user-7
content: %u是无符号int类型，c是被转成无符号int类型输出。 要想得到unsigned char就应该把c先转成正数（这步很关键），否则负数会自动保持符号位，再按类型所占字节扩展，就得不到你想要的结果。 即 printf(“c=%u\n”, 0x00FF & c); //清除符号位再扩展

user: user-0
content: 我感觉是不是我问的问题太难了，都没多少人回答...
user-0 提问: 队列的一道题，求用c语言

回复:
user: user-1
content: #include <stdio.h> #include <stdio.h> #define MAXSIZE 100  typedef struct {     int score;     struct LinkList *next; } * LinkList;  //创建节点 LinkList CreateList() {     LinkList head = (LinkList)malloc(sizeof(LinkList));     head->score = -1;     head->next = NULL;     return head; }  //插入节点 LinkList insertNode(LinkList head, int num) {     LinkList node = head;     printf("begin head:%d node:%d ",head,node);     while (node->next != NULL)     {         node = node->next;     }     LinkList pnode = (LinkList)malloc(sizeof(LinkList));     pnode->score = num;     pnode->next = NULL;     node->next = pnode;     printf("end head:%d node:%d\n",head,node);     return head; }  int main() {     int num;     int arr[MAXSIZE];     LinkList head1 = CreateList(); //保存奇数     LinkList head2 = CreateList(); //保存偶数     printf("input number of link:");     scanf("%d", &num);     for (int i = 0; i < num; i++)     {         scanf("%d", &arr[i]);         if (arr[i] % 2 == 0)         {             head2 = insertNode(head2, arr[i]);         }         else         {             head1 = insertNode(head1, arr[i]);         }     }     LinkList pNode1 = head1->next;     LinkList pNode2 = head2->next;     while (pNode1!=NULL && pNode2!=NULL)     {         printf("%d %d\n", pNode1->score,pNode2->score);         pNode1 = pNode1->next;         pNode2 = pNode2->next;     }     return 0; }

user: user-1
content: 引用 4 楼 Robinhood169的回复:就是可不可以用rear,front类型的队来做啊 啥意思  用双向链表？

user: user-1
content: 引用 3 楼 Robinhood169的回复:有一点不对啊 哪儿不对，有啥问题？

user: user-0
content: 就是可不可以用rear,front类型的队来做啊

user: user-2
content: 这题看起来很难，估计没几个人能做出来！

user: user-0
content: 有一点不对啊
user-0 提问: 语言中使用全局变量int**a，能否在一个void类型的函数中完成动态内存分配？以及，相应地在其它void类型的函数中完成赋值，释放内存的操作

回复:
user: user-1
content: 谢邀， 不要把内存想得那么复杂，你申请一块内存，那就是一个连续的空间 【至少从进程或者程序员的视角，他是连续的，（可能在物理上并不一定连续，但是没关系，这种转换，操作系统会帮你完成）】。 没错，一长串连续的东西。 只是你怎么操作他是你的事，这是编程中一个绕人的东西。 想象一个4 X 5 = 20cm的绳子，你把它折起来，之字形回折，【每到5cm处折一次】  假设不够直观，你在折角处把他剪断，然后摆平整【但是你要记住，他们再内存中还是连续的】 现在他是一个4 X 5的矩阵了 本来嘛,这样就搞定了 int *p = (int *)malloc(sizeof (int ) * 20); for(int i = 0; i < 4; i++){     for(int j = 0; j < 5; j++){         *p++ = i*5 +j;     } }  但是你非有强迫症，想用二维数组， 告诉你，没有这样的操作，除非你手动像编译器一样去构造这样的东西 二维数组  int a[4][5]; 实际上是什么样的东西呢？ 你不要以为他是简单的二重指针 int **p = a; 这样你就大错特错了，二重指针不是这样设计来操作二维数组的，相信我从今天开始放弃这个想法。 二维数组，用指针来表达是什么样的东西呢，是数组指针。 int (*p)[5];  这不是新手能看懂的东西。 他是一个指针，，指向一个数组类型， ===注意 在C89标准下：      而且这个数组类型的大小必须指定， 比如int (*p)[5]; 这个5必须指定     你不能定义这样的指针  int (*p)[];  又或者是int (*p)[n]; //n是运行时指定的       因为对编译器来说，你代码这样写 p++, 他必须知道地址得往后跳多少个字节，      对于int (*p)[5] 来说，p++ ， 就是p往后跳5个整数， === ~~~ 【平时看到的指针是指向int， char 这些基本类型】，不是像你所想像的一维数组里面放N个指针。 ，如果你对a[i][j]这种风味的东西总是念念不忘， 很抱歉C89标准不支持动态的二维数组，办不到。 C99可以支持动态数组，编译的时候加上--std=c99， 如果你的编译器不支持c99，又或者你用vc之类的，而你又不知道怎么开启c99编译选项，请忘了他吧。不要做这种尝试。 事情没你想的那么复杂，不要过度想象。。。要理解本质。 以下代码在C99编译器下可以运行，【大部分代码直接拷贝你的，然后做修改，按你的意图去实现，你可以体会一下】 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ #include <stdio.h> #include <stdlib.h> void creat(void **a, int m, int n); void fre(void *a); void show(int m, int n, int (*a)[n]);  int main() {     int m, n;     scanf("%d%d", &m, &n);     /*你能想象为什么malloc出来的指针都是void类型的，     都是程序员人为的给他强制转换， 随意揉捏     你认为他是圆的他就是圆的，你认为他是扁的他就是扁的     但是，实质上，他是一条线，就是一段连续的内存，------------------------这样*/      int (*a)[n];      creat((void**)&a, m, n);     show(m, n, a);     fre((void*)a);     return 0; }  /**/ void creat(void **p, int m, int n) // {     *p = malloc(sizeof(int) * m * n);// }  void fre(void *a) {     free(a);//想清楚，为什么这里free的时候不用二重指针，         //回忆一下刚才怎么申请内存的，一次free对应一次malloc } void show(int m, int n, int (*a)[n]) {     int i, j;     for (i = 0; i < m; i++)         for (j = 0; j < n; j++)             scanf("%d", a[i] + j);      for (i = 0; i < m; i++)         for (j = 0; j < n; j++)         {             printf("%d", a[i][j]);             if (j < n - 1)                 printf(" ");             else                 printf("\n");         } }  程序执行结果

user: user-2
content: 没搞清形参，实参  要使实参生效，再加一重指针，调用时传入a的地址
user-0 提问: 求大佬帮忙看一下把c++改成c语言中的错误！

回复:
user: user-1
content: C新标中可以用变量定义数组长度，而C++没有这个标准。 要改成动态分配，或者直接使用容器比如std::vector。

user: user-0
content: 引用 5 楼 m0_46108109的回复:free（sM）； 明白了，多谢啦～

user: user-2
content: free（sM）；

user: user-0
content: 引用 1 楼 user-3的回复:char *sM = (char *)malloc(L+1); 嗯嗯感谢 请问下面还有一句delete sM； 该怎么修改呢？

user: user-3
content: char *sM = (char *)malloc(L+1);
user-0 提问: 文件系函数求解

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:https://blog.csdn.net/COCO56/article/details/80725091?utm_source=blogxgwz3谢谢

user: user-1
content: https://blog.csdn.net/COCO56/article/details/80725091?utm_source=blogxgwz3
user-0 提问: 相邻的素数

回复:
user: user-1
content: 简单代码自己写 弄个判断是否素数的函数， 然后从已知的这个3或者11， 分别向大小两个方向，循环去找素数就好了  或则如果知道范围，比如100以内的，那就提前把所有的素数都算出来放到一个数组里面，然后从中找一样  不难，自己写代码吧
user-0 提问: 来个大佬看看,使用vs2010 c编程后运行输入参数后，按回车直接退出

回复:
user: user-1
content: 看起来是一定会走到printf的呀，你确认保存编译了？

user: user-2
content: 引用 6 楼 ek11one 的回复:加这个system("pause")好像可以了 但是其他的不行  你这是编译运行的吧，不是在ide里运行的吧，所以程序结束后就自动关闭cmd窗口了 本来用getchar也可以让程序暂停的（IO阻塞），只是你前面的输入里有回车符残留在输入缓存，所以getchar直接拿到回车符继续往下运行而结束程序了，所以在程序的最后用system("pause")可以让程序暂停不结束 你说的其他不行是指什么？是指getchar不行？那你在getchar之前加上fflush(stdin)试试，清空输入缓存

user: user-0
content: 加这个system("pause")好像可以了 但是其他的不行

user: user-0
content: 引用 1 楼 arfi 的回复:看起来是一定会走到printf的呀，你确认保存编译了？确定 感觉不是代码问题 是其他问题 我换其他的代码上去,也是只编译输入不编译输出

user: user-3
content: #include<stdio.h> //void main() int main() {     int year;     int month,maxmonth=12;     int day,maxday;     printf("请输入年份：(1000~3000)");     scanf("%d",&year);     //if(year<1000 || year>3000)     while (year<1000 || year>3000)     {         printf("输入错误！请从新输入！\n");         printf("请输入年份：(1000~3000)");         scanf("%d",&year);     }     printf("请输入月份：(1~12)");     scanf("%d",&month);     //if(month<1 || month>12)     while (month<1 || month>12)     {         printf("输入错误！请从新输入！\n");         printf("请输入月份：(1~12)");         scanf("%d",&month);     }     if(month==4||month==6||month==9||month==11)         maxday=30;     else if(month==2)     {         //if(year%400==0 || year%4==0)         if(year%400==0 || (year%4==0 && year % 100 != 0))             maxday=28;         else             maxday=29;     }     else         maxday=31;     printf("请输入日份：(1~31)");     scanf("%d",&day);     //if(day<1 || day>maxday)     while (day<1 || day>maxday)     {         printf("输入错误！请从新输入！\n");         printf("请输入日份：(1~31)");         scanf("%d",&day);     }     if(month==maxmonth && day==maxday)     {         year=year+1;         month=1;         day=1;     }     else if(day==maxday)     {         month=month+1;         day=1;     }     else         day=day+1;     printf("下一天是%d年%d月%d日",year,month,day);     getchar();  } 供参考～

user: user-4
content: 按下“Enter”键，缓冲区内会有“换行”字符，这也会被getchar()取走，你可以试试调用两次getchar()，或者调用system("pause");（需要包含头文件#include <Windows.h>）
user-0 提问: 输入两个不相等的正整数，求两个正整数区间（包含这两个正整数在内）的所有素数。

回复:
user: user-0
content: C++环境，输出时只输出结果

user: user-1
content: #include <stdio.h>  int IsPrime(int x) {     if (x < 2)return 0;     for (int i = 2; i < x; i++)     {         if (x % i == 0)             return 0;     }     return 1; }  void PrintPrime(int m, int n) {     int count = 0;     int k = 0;     for (int i = m; i <= n; i++)     {         if (IsPrime(i))         {             printf("%d ", i);             k++;             count++;         }         if (k == 5)         {             printf("\n");             k = 0;         }     }     if(!count)printf("no prime in the area"); }  int main() {     int m, n;     printf("input two number:");     scanf("%d %d", &m, &n);     if (m < n)     {         PrintPrime(m, n);     }     else     {         PrintPrime(n, m);     }     return 0; }

user: user-0
content: 顶顶顶顶顶顶顶

user: user-0
content: 顶顶顶顶顶顶顶

user: user-0
content: 有没有大神  求解

user: user-0
content: 不是我的意思是   输出结果中间用逗号隔开
user-0 提问: C语言数据结构多项式相加运算

回复:
user: user-1
content: /*AddList 函数未做修改 楼主自行解决*/ 1.创建节点时 内存分配有问题 2.输入时对弈系数的接收格式有问题 3.输出函数判断条件有问题 4.排序函数  结点比较条件有问题，结点之间交换有问题 /*以下程序已对上述问题作出更正 剩余 ADDList 请参照程序自行解决*/   #include <stdio.h> #include <stdlib.h> #include <math.h> #include <malloc.h>  typedef struct polynode {     int exp;     float coef;     struct polynode *next; }polynode,*polypointer;  polypointer CreateList(polypointer Head,int n){     polypointer NewNode;     polypointer pre;      pre = Head;     for(int i=1;i<=n;i++)     {         NewNode=(polypointer)malloc(sizeof(polynode));     	NewNode->next=NULL;//创建一个结点 输入一个数据结点          printf("请输入<第 %d 位>指数\n",i);         scanf("%d",&NewNode->exp);         printf("请输入系数:例如 2.5\n");         scanf("%f",&NewNode->coef);         pre->next=NewNode;         pre=NewNode; 	}     return Head; } void PrintList(polypointer h){ 	polypointer p; 	p=h->next;     while(p!=NULL)//if语句只会执行一次      { 		printf("%.2f*X^%d ",p->coef,p->exp); 		p=p->next; 		printf("\n");     } }  void bubble_sort(polypointer head,int o){ 	polypointer prepre,pre,p,temp; 	//开始位置 prepre,pre,p   表示 Head,1,2 	/*冒泡排序*/ 	for(int i=1;i<=o-1;i++) 	{ 		prepre = head;  		pre=head->next;//每比较一次，指针指向最链表第一个，第二个结点位置  		p=pre->next;  		for(int j=2;j<=o;j++) 		{	//利用幂函数计算结点值     			if(pow(pre->coef,pre->exp)>pow(p->coef,p->exp))//比较的应该是结点内部存储的结点值 而不是结点本身  			{ 				/*如果前驱结点 大于 后继结点 交换位置*/ 				prepre->next = p; 				temp = p->next; 				p->next = pre; 				pre->next = temp; 			} 			prepre = pre;//指针后移  			pre=p; 			p=p->next;	   		}	 	}  }  polypointer AddList(polypointer head1,polypointer head2){ 	polypointer p,q,c,head3; 	int x; 	p=head1->next; 	q=head2->next; 	c=(polypointer)malloc(sizeof(struct polynode)); 	head3=c; 	c=head3->next; 	while(p!=NULL&&q!=NULL) 	{ 		if(p->exp==q->exp)  		{ 			 x=p->coef+q->coef; 			 c->coef=x; 			 c->exp=p->exp; 			 c=c->next; 			 p=p->next; 			 q=q->next; 		} 		else if((p->exp)>(q->exp)) 		{ 			c->coef=q->coef; 			c->exp=q->exp; 			q=q->next; 			c=c->next; 		} 		else if((p->exp)<(q->exp)) 		{ 			c->coef=p->coef; 			c->exp=p->exp; 			p=p->next; 			c=c->next; 		} 	} 	c=head3; 	return c; }  int main(){   int m,n;   polypointer a=(polypointer)malloc(sizeof(polynode));   a->next = NULL;   polypointer b=(polypointer)malloc(sizeof(polynode));   b->next = NULL;   polypointer c=(polypointer)malloc(sizeof(polynode));   c->next = NULL;    printf("请输入多项式 A 的项数 : \n");   scanf("%d",&m);   a=CreateList(a,m);    printf("请输入多项式 B 的项数 : \n") ;   scanf("%d",&n);   b=CreateList(b,n);    /*功能函数测试输出*/   printf("输出A-------\n");   PrintList(a);    printf("输出B*******\n") ;   PrintList(b);    /*功能函数测试输出*/   bubble_sort(a,m);   printf("输出A排序后**\n") ;   PrintList(a);    bubble_sort(b,n);   printf("输出B排序后**\n") ;   PrintList(b);    /*AddList 函数未做修改 楼主自行解决*/   c=AddList(a,b);   printf("输出B******* \n") ;   PrintList(c);   return 0; }
user-0 提问: 编译通过但是无运行结果 谢谢！

回复:
user: user-0
content: 引用 3 楼 菜鸡要会飞的回复:没打印怎么运行。。 打印啦 有错误结果  找到错误点了 谢谢

user: user-1
content: 没打印怎么运行。。

user: user-0
content: 想打开文件读入并打印出来 将排序后的结果写进文件

user: user-0
content: 想打开文件读入并打印出来 再排序写进文件
user-0 提问: 逻辑表达式

回复:
user: user-1
content: 等价于!bool(x)

user: user-2
content: x!=0或者x!=false

user: user-3
content: 说错了，!x 等价于 x==0

user: user-3
content: 布尔类型是0为false，非0为true 所以 !x 等价于 x!=0

user: user-4
content: x<=0
user-0 提问: while(1)段出现问题如何解决？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  struct student_info {     char snum[20];     char sname[30];     char sclass[30]; };  typedef struct student_info   stu;   int main(void) {     stu    p1[10];     FILE   *fp=NULL;     int    i,x;     fp=fopen("students.txt","r");     if(fp==NULL)     {   printf("\n文件打开失败。");         return 0;     }     i=0;     //fscanf(fp,"%s%s%s",&p1[i].snum,&p1[i].sname,&p1[i].sclass);     fscanf(fp,"%s%s%s", p1[i].snum, p1[i].sname, p1[i].sclass);     while(feof(fp)==0)     {         printf("%s\t%s\t%s\n",p1[i].snum,p1[i].sname,p1[i].sclass);         i++;         //fscanf(fp,"%s%s%s",&p1[i].snum,&p1[i].sname,&p1[i].sclass);         fscanf(fp,"%s%s%s",p1[i].snum,p1[i].sname,p1[i].sclass);     }     printf("\n\n------------------------\n");      while(1)     {         printf("被点到的学生是：");         x=rand()%10;         //print("%s\t%s\t%s\n",p1[x].snum,p1[x].sname,p1[x].sclass);         printf("%s\t%s\t%s\n",p1[x].snum,p1[x].sname,p1[x].sclass);         system("pause");     }     fclose(fp);     return 0; } 供参考～

user: user-2
content: print改为printf
user-0 提问: 求助

回复:
user: user-1
content: 16进制和10进制等一样，只是数字的表现形式，和数据类型无关吧

user: user-0
content: 引用 1 楼 user-3 的回复：0x03吗？ 还是字母O是数字0，不是字母O，我才知道555

user: user-0
content: 引用 1 楼 user-3 的回复：0x03吗？ 还是字母O就是16进制的3呀

user: user-2
content: 这问题问的。。。

user: user-3
content: 0x03吗？ 还是字母O
user-0 提问: 在C语言程序中主函数main()在程序中的位置问题

回复:
user: user-1
content: 有且只有一个main(),不管它在哪个位置，都会先运行它

user: user-2
content: 楼主是想写个博客吗？

user: user-3
content: 描述的基本是没问题的。给予肯定～编译的时候编译器会自动去找main，比如你不定义main，看看编译器提示错误不。main函数是对应程序运行的入口

user: user-4
content: so the question is ？
user-0 提问: 求解！为什么打开文件是这样的？

回复:
user: user-0
content: 引用 1 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h>  struct Student {     int num;     char name[20];     float score[3]; }stu[5];  int main() {     FILE *fp;     int i,j;float aver_score[3],temp=0;      printf("please enter data of students:\n");     for(i=0;i<5;i++)         scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);     for(j=0;j<3;j++)     {         for(i=0;i<6;i++)             temp += stu[i].score[j];         aver_score[j]=temp/6.0;         temp = 0;    //重新初始化     }     if((fp=fopen("D:\\CC\\stud.txt","w"))==NULL)     {         printf("can't open the file!\n");         exit(0);     }     for(i=0;i<5;i++)         fwrite(&stu[i],sizeof(struct Student),1,fp);     printf("\n");     for(i=0;i<3;i++)         fwrite(&aver_score[i],4,1,fp);     fclose(fp);     return 0; } 供参考～  打开文件是不是有乱码？因为你是用fwrite写入的，即二进制形式写入 知道了 谢谢！

user: user-0
content: 知道了，谢谢！

user: user-1
content: #include<stdio.h> #include<stdlib.h>  struct Student {     int num;     char name[20];     float score[3]; }stu[5];  int main() {     FILE *fp;     int i,j;float aver_score[3],temp=0;      printf("please enter data of students:\n");     for(i=0;i<5;i++)         scanf("%d %s %f %f %f",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);     for(j=0;j<3;j++)     {         for(i=0;i<6;i++)             temp += stu[i].score[j];         aver_score[j]=temp/6.0;         temp = 0;    //重新初始化     }     if((fp=fopen("D:\\CC\\stud.txt","w"))==NULL)     {         printf("can't open the file!\n");         exit(0);     }     for(i=0;i<5;i++)         fwrite(&stu[i],sizeof(struct Student),1,fp);     printf("\n");     for(i=0;i<3;i++)         fwrite(&aver_score[i],4,1,fp);     fclose(fp);     return 0; } 供参考～  打开文件是不是有乱码？因为你是用fwrite写入的，即二进制形式写入
user-0 提问: 关于scanf_s输入中文字符串的问题。

回复:
user: user-1
content: 大佬有解决问题嘛

user: user-0
content: 引用 3 楼 xiyuyan的回复:估计是所用库函数对中文兼容不好，处理中文输入输出，推荐用 中文C 之前可以输出中文的，我前几天升级了一下版本，是不是这个原因啊

user: user-2
content: 估计是所用库函数对中文兼容不好，处理中文输入输出，推荐用 中文C

user: user-0
content: 大佬我想知道为什么用scanf_s输入的中文字符串打印不出来。。

user: user-3
content: 暂没看出有啥问题，把第一个printf中的&ch前的&去掉；
user-0 提问: 求大佬帮我解释一下getchar函数的内容，最好可以逐行解释

回复:
user: user-1
content: 1 从标准输入读入BUFSIZ个字符保存到buf缓存里 2 如果缓存中没有字符（n是0，--n就会小于0）则返回EOF，否则返回*bb（缓存指针当前的字符），并且缓存指针往前移动一个地址bb++。

user: user-2
content: read函数， 读，第一个参数0是stdin，你可以理解为键盘输入 a？b：c 三元表达式， 就是 if(a) {b} else {c} 的意思
user-0 提问:  error C141: syntax error near 'led', expected ')'怎么解决，跪求大佬救救我

回复:
user: user-1
content: 一个明显的问题： 第22行代码后面多了“；”  代码书写风格不好，建议不要把多行代码放在一行，不好检查

user: user-2
content: 知道define是干啥的吧，写在一行是几个意思

user: user-3
content: 源代码发一下
user-0 提问: C语言数组问题

回复:
user: user-1
content: 这个很简单，分三部，获取字符串，字符串逆序，写入文件中。这都是c的基础啊

user: user-2
content: #include <stdio.h> #include <string.h>  int main() {      char str[50]={'0'};     char res[50]={'0'};     int index = 0;     gets(str);      for (int i = strlen(str)-1; i >= 0; i--)     {         res[index] = str[i];         putchar(str[i]);         index++;     }      FILE *fp = NULL;     fp = fopen("out.txt", "w");     fputs(res, fp);     printf("\n");     printf("the file out.txt write into %s\n",res);     fclose(fp);      return 0; }

user: user-3
content: void switchString(char* arr) {     char tmp;     int len = strlen(arr);     int i = 0;     int j = len-1;     for(i=0;i<len/2;i++,j--)     {         tmp = arr[i];         arr[i] = arr[j];         arr[j] = tmp;     }  } void reverseString() {     char tmpStr[32];     scanf("%s",tmpStr);     switchString(tmpStr);     printf("%s\r\n",tmpStr); }

user: user-4
content: 最好自己先写写，不论写对写错，起码自己尝试了，努力了～
user-0 提问: 简单题

回复:
user: user-1
content: 哦，知道答案了。这应该是一道古代有名的几何题。应该早就被证明过。 不过，我是独立想出来的。 取任意三点组合成一个三角形，若第四个点落在这个三角形内，那么会有六个凹四边形。

user: user-1
content: 这道题有点复杂，我不会做。大致提供一下思路。 如果这个四边形是凸四边形的话，那么只有一种可能，这个应该都会做。 问题的难点在于如何判断这是一个凸四边形。 因为如果是凹四边形的话，会有一个边不等的两种可能。 盲猜涉及到这个凹四边形的夹角和第四点的坐标。  这个好像是个有名的几何题，应该有现成的模型。

user: user-2
content: 4个点还能组成多种四边形？
user-0 提问: 用下面的 scanf 函数输入数据，使 a=10,b=12,c1='B',c2='b',x=2.6,y=-3.89,z=6.7，考虑在键盘上如何输入数据？

回复:
user: user-1
content: 请参考《C++中printf()函数的用法7》 希望能够帮到你！

user: user-2
content: 给你提供个思路，就是先输入，再输入看看最后的结果和题目中的结果是否相同
user-0 提问: 图像识别检测圆心位置

回复:
user: user-1
content: 不会 让我猜猜  第一种 找出差异区(像素对比) 比对原始图  第二种 直接比对原始图

user: user-0
content: hough检测圆 根据园的方程（x－a）×（x－a）＋（y－b）×（y－b）＝R×R，将参数空间增加到a，b，R三维空间. 常用的hough变换计算量太大,然而随机hough变换虽然计算量相对小点,但是准确率没有前者高.现在使用 一种改进的方法:提取边缘图像,然后边缘跟踪,在边缘曲线上进行hough变换检测圆.  double x=0.0,y=0.0,x0=0.0,y0=0.0,cc=0.0,ss=0.0,temp1,temp2;  int aa=0,bb=0,rr=0,saveaa=0,savebb=0,saverr=0,savexx0=0,saveyy0=0,saveQ=0;  int pos = ptNumber/3;     int i = 0,off = 0,k = 0,iBaseFlag = 100,jj = 0;  int tt = 0,m=0,n=0;  int firstBase = 5;  int secendBase = (2*firstBase+1);  int aaBase = (R.right+R.left)/2 - firstBase,bbBase = (R.bottom+R.top)/2 -firstBase;  LONG minrr = 0;  minrr = (R.right - R.left)>(R.bottom - R.top)?(R.bottom - R.top):(R.right - R.left);     int memsize = (int)(minrr+2*firstBase) * secendBase *secendBase;  BYTE * lpabr = new BYTE[memsize];  memset(lpabr,0,sizeof(BYTE)*memsize);  int maxcount = -1;   /* 局部hough变换检测圆曲线段的一部分*/  for(k=0;k<ptNumber;k+=pos)  {   for(aa=(int)(R.left+R.right)/2 - firstBase;aa<=(int)(R.left+R.right)/2 + firstBase;aa++)    {        if(aa<0)      continue;     if(aa>ImageWidth)      break;     for(bb=(int)(R.top+R.bottom)/2 -firstBase;bb<=(int)(R.top+R.bottom)/2 + firstBase;bb++)     {      if(bb<0)       continue;      if(bb>ImageHeight)       break;      temp1 = (pt[k].x-aa)*(pt[k].x-aa) + (pt[k].y-bb)*(pt[k].y-bb);          rr = (int)sqrt(temp1);      if(rr>=10&&rr<=(int)(minrr/2) + firstBase)      lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)]++;      }         }    }   for(rr=10;rr<=(int)(minrr/2) + firstBase;rr++)   for(aa=(int)(R.left+R.right)/2 - firstBase;aa<=(int)(R.left+R.right)/2 + firstBase;aa++)   {    if(aa<0)     continue;    if(aa>ImageWidth)     break;    for(bb=(int)(R.top+R.bottom)/2 - firstBase;bb<=(int)(R.top+R.bottom)/2 + firstBase;bb++)    {     if(bb<0)      continue;     if(bb>ImageHeight)      break;     if(maxcount<lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)])     {      maxcount = lpabr[rr*secendBase*secendBase+(aa-aaBase)*secendBase+(bb-bbBase)];      saverr = rr;      saveaa = aa;      savebb = bb;     }    }   } if(maxcount>=4) { //记录保存中心,半经      saverr = rr;      saveaa = aa;      savebb = bb;   }
user-0 提问: 求大神帮忙

回复:
user: user-1
content: if语句只管到第一个分号，将代码用大括号括起来才管到整个代码块

user: user-2
content: for(j=i+1;j<=10;j++)                 if(a[i]>a[j])                 temp=a[i];                 a[i]=a[j];                 a[j]=temp;   FOR循环用括号括起来   以后记住了

user: user-3
content: if(a[i]>a[j]) 后面的交换操作要用{}
user-0 提问: 全局变量和局部变量同名但类型不同的情况如何分析？

回复:
user: user-1
content: 引用 3 楼 better *man 的回复:[quote=引用 1 楼 自信男孩 的回复:]  printf("%d,%lf\n",a,a); double类型用%lf格式输出。  当全局变量名和局部变量名同名时，局部变量名屏蔽全局变量，即全局变量无效；  float和double类型的输出时的格式说明符都是％f呀！float型会自动转为double型，用％lf和％f结果都一样的。[/quote] 要看编译器吧，要不你自己试试，看看是否一样。

user: user-0
content: 引用 1 楼 自信男孩 的回复: printf("%d,%lf\n",a,a); double类型用%lf格式输出。  当全局变量名和局部变量名同名时，局部变量名屏蔽全局变量，即全局变量无效；  float和double类型的输出时的格式说明符都是％f呀！float型会自动转为double型，用％lf和％f结果都一样的。

user: user-2
content: 请参考double类型在内存中的存储 : https://blog.csdn.net/slience_j/article/details/51965009

user: user-1
content: printf("%d,%lf\n",a,a); double类型用%lf格式输出。  当全局变量名和局部变量名同名时，局部变量名屏蔽全局变量，即全局变量无效；
user-0 提问: 为什么三个科目的平均分都是 0

回复:
user: user-0
content: 引用 4 楼 weixin_45698079的回复:sub[j]+=stu[i].score[j]; 这句错了，你是求三个班级的六个数（科目）的sum，不是每个科目的三个班级总分，建议把stu[i].score[j]的I和j对调 不好意思 没有看懂“每个科目的三个班级总分” 一个班级 六个学生 每个学生对应三个科目的分数

user: user-1
content: sub[j]+=stu[i].score[j]; 这句错了，你是求三个班级的六个数（科目）的sum，不是每个科目的三个班级总分，建议把stu[i].score[j]的I和j对调

user: user-0
content: 引用 1 楼 自信男孩的回复:注意sub是int类型，不是float类型，建议把sub改成float类型。 找了好久谢谢！

user: user-0
content: 引用 1 楼 自信男孩的回复:注意sub是int类型，不是float类型，建议把sub改成float类型。 找了好久谢谢！

user: user-2
content: 注意sub是int类型，不是float类型，建议把sub改成float类型。
user-0 提问: 关于返回整数的getchar函数的三个问题，求大佬解答一下，万分感谢

回复:
user: user-0
content: 引用 2 楼 21211321 的回复：1、你把int（一般4字节）赋值给char（1字节）当然会被截断，其余3字节就没了； 2、是，只不过有时候看不出区别； 3、EOF是结束符，跟你说的没关系。那为什么geychar的返回值类型要定义成int而不是char类型？

user: user-1
content: 1 如LS所说 2 那是在能正常转换的前提下（包括强行转换），否则就会发生类型不匹配的异常 3 除了EOF（宏定义-1）外，还有一些扩展字符（详见ascii码表）在128～255区间，超出了char的-128～127的范围

user: user-2
content: 1、你把int（一般4字节）赋值给char（1字节）当然会被截断，其余3字节就没了； 2、是，只不过有时候看不出区别； 3、EOF是结束符，跟你说的没关系。
user-0 提问: 程序问题

回复:
user: user-1
content: 引用 3 楼 zedd3337502212 的回复:[quote=引用 2 楼 自信男孩 的回复:] 在fp为NULL的执行体里加上一句： printf("%s\n", strerror(errno)); 可以看一下打开文件失败的原因是invalid argument但我不知道咋改[/quote]  https://blog.csdn.net/hpu11/article/details/52693581 如果第二个参数还是没问题，那就不清楚了。

user: user-0
content: 引用 2 楼 自信男孩 的回复:在fp为NULL的执行体里加上一句： printf("%s\n", strerror(errno)); 可以看一下打开文件失败的原因是invalid argument但我不知道咋改

user: user-1
content: 在fp为NULL的执行体里加上一句： printf("%s\n", strerror(errno)); 可以看一下打开文件失败的原因

user: user-2
content: 看看你的 文件存在不
user-0 提问: 求助！C语言 二叉树遍历代码错误，无法正常判断空结点

回复:
user: user-1
content: 30 *T==NULL;   *T=NULL

user: user-0
content: 引用 1 楼 bo_self_effacing 的回复:30 *T==NULL;   *T=NULL 谢了，我瞎了
user-0 提问: 害死人不偿命的3n+1猜想问题

回复:
user: user-0
content: 引用 5 楼 user-1的回复:[quote=引用 4 楼 LINUX/ 的回复:] [quote=引用 1 楼 user-1的回复:]n<=1000 && n>=0是条件限制，并不是循环的限制，循环条件只要是！=就继续 你这个条件限制加入了会出问题，比如999不能被2整除，就要999x3+1 这个>1000了 ，就退出循环了。 噢，那这个条件限制不需要写了，是运行时输入的时候自己明白这个限制，避免输入违法值？[/quote]    恩，你如果真的想限制输入，可以加入判断 if(n<=0 || n>1000)  printf("输入超过范围"); [/quote] 嗯嗯，明白了，谢谢大佬的帮助。

user: user-0
content: 嗯嗯，明白了，谢谢大佬的帮助。

user: user-1
content: 引用 4 楼 LINUX/ 的回复:[quote=引用 1 楼 user-1的回复:]n<=1000 && n>=0是条件限制，并不是循环的限制，循环条件只要是！=就继续 你这个条件限制加入了会出问题，比如999不能被2整除，就要999x3+1 这个>1000了 ，就退出循环了。 噢，那这个条件限制不需要写了，是运行时输入的时候自己明白这个限制，避免输入违法值？[/quote]    恩，你如果真的想限制输入，可以加入判断 if(n<=0 || n>1000)  printf("输入超过范围");

user: user-0
content: 引用 1 楼 user-1的回复:n<=1000 && n>=0是条件限制，并不是循环的限制，循环条件只要是！=就继续 你这个条件限制加入了会出问题，比如999不能被2整除，就要999x3+1 这个>1000了 ，就退出循环了。 噢，那这个条件限制不需要写了，是运行时输入的时候自己明白这个限制，避免输入违法值？

user: user-1
content: n<=1000 && n>=0是条件限制，并不是循环的限制，循环条件只要是！=就继续 你这个条件限制加入了会出问题，比如999不能被2整除，就要999x3+1 这个>1000了 ，就退出循环了。
user-0 提问: 用if语句比较两个数的大小  大神求解小白

回复:
user: user-0
content: 引用 1 楼 user-1的回复:%d, %d  不是  %d, d% 谢谢了。。。

user: user-1
content: %d, %d  不是  %d, d%
user-0 提问: malloc分配内存问题

回复:
user: user-0
content: 引用 2 楼 bo_self_effacing 的回复:void* malloc (size_t size); If size is zero, the return value depends on the particular library implementation (it may or may not be a null pointer), but the returned pointer shall not be dereferenced.  当 malloc 的参数传0的时候，返回的指针为不为null 取决于具体实现，但是该指针不能被解引用。  你这里返回的明显不是null，那就是一个未定义的地址。 你后面的赋值就是在一块未定义的地址上操作。[绝对不可以的] 你这里是程序简单，所以没发现异常。 当你程序复杂，内存分布各种数据的时候你这种操作，程序很容易崩溃。 明白了，谢谢大哥，感谢。

user: user-1
content: void* malloc (size_t size); If size is zero, the return value depends on the particular library implementation (it may or may not be a null pointer), but the returned pointer shall not be dereferenced.  当 malloc 的参数传0的时候，返回的指针为不为null 取决于具体实现，但是该指针不能被解引用。  你这里返回的明显不是null，那就是一个未定义的地址。 你后面的赋值就是在一块未定义的地址上操作。[绝对不可以的] 你这里是程序简单，所以没发现异常。 当你程序复杂，内存分布各种数据的时候你这种操作，程序很容易崩溃。

user: user-0
content: 求解，谢谢了。
user-0 提问: C语言程序编译没有问题但是控制台会报错

回复:
user: user-1
content: Elemtype* transfer = (Elemtype*)malloc(sizeof(Elemtype));  //建立一个Elemtype类型的数组      Elemtype* p = copy(s, transfer, i); //执行数组传递操作，把s传递给数组p  你申请空间不够，只申请了元素空间，i大于1时会踩内存
user-0 提问: 字母大小写转换

回复:
user: user-1
content: vs2015运行不聊，先要确认是否编译成功，vs下不支持scanf吧，应该是scanf_s

user: user-2
content: #include<stdlib.h> int main() { 	char a; 	printf("please input the character\n"); 	scanf("%c", &a); 	char ch = (a >= 'A' && a <= 'Z' ? a + 32 : a);//-------注意这行代码的修改---------- 	printf("%c", ch);     return 0; } VS2015 C++环境调试结果

user: user-3
content: 兄弟，你箭头那里不应该是ch、而应该是a吧？ 还有一个，就是最好把 (a>= 'A' && a <='Z')这样用括号括起来

user: user-0
content: 求大神帮助哈，箭头哪个地方会出错，怎么办

user: user-4
content: ch未定义，兄弟，你输入的保存在a中了
user-0 提问: C语言冒泡排序问题请教

回复:
user: user-0
content: 引用 3 楼 qq_1457346882的回复:ｉ<n-1是要跑得外循环次数，是数组大小减一，你减ｉ会少跑很多次 对啊 蟹蟹嗷

user: user-1
content: ｉ<n-1是要跑得外循环次数，是数组大小减一，你减ｉ会少跑很多次

user: user-2
content: i<10-1

user: user-3
content: for(i = 0; i < max-1; i++) { for(j = 0; j < max-1-i; j++) { if(b[j] > b[j+1]) { tmp = b[j]; b[j] = b[j+1]; b[j+1] = tmp;  } } } 应该是这样的
user-0 提问: 内存动态分配问题

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:这是常见问题 函数里改变参数指针的指向，不影响函数外指针的指向 所以，要么 void init_zifu(zifu **s) //改成双指针 要么 void init_zifu(zifu *&s) //改成指针引用 要么 zifu* init_zifu() //改成返回值是指针  以最少修改量的方式 void init_zifu(zifu *&s) {     s = (zifu*)malloc(sizeof(zifu)); //先给s分配内存     s->base= (zifu**)malloc(sizeof(char*)*newsize);     if (!s->base) {         exit(-1);     }     s->top = s->base;     s->size_of_base = 0; } 谢谢大哥，一下就懂了。谢谢了。

user: user-1
content: 这是常见问题 函数里改变参数指针的指向，不影响函数外指针的指向 所以，要么 void init_zifu(zifu **s) //改成双指针 要么 void init_zifu(zifu *&s) //改成指针引用 要么 zifu* init_zifu() //改成返回值是指针  以最少修改量的方式 void init_zifu(zifu *&s) {     s = (zifu*)malloc(sizeof(zifu)); //先给s分配内存     s->base= (zifu**)malloc(sizeof(char*)*newsize);     if (!s->base) {         exit(-1);     }     s->top = s->base;     s->size_of_base = 0; }

user: user-0
content: 多谢了
user-0 提问: c语言:计算1到100000的偶数和

回复:
user: user-1
content: for (i=2；i<=10000; i+=2) sum+=i;

user: user-2
content: 引用 4 楼 newshou1 的回复:for (i=2；i<=10000; i+=2) sum+=i; 这个靠谱，简单，好理解～

user: user-3
content: 等差数列求和公式 2+4+6+...+100000=2*(1+2+3+...+50000)=2*(50000+1)*50000/2=(50000+1)*50000

user: user-4
content: #include<stdio.h> #include<stdlib.h>  int main() { 	int i = 1; 	int sum = 0; 	while(i < 10000) 	{ 		if(i%2 == 0) 		sum += i; 		i++; 	} 	printf("%d",sum); 	return 0; }

user: user-5
content: 推导公式。。。。。
user-0 提问: 编程，要求从键盘输入数据，使整型变量 a=2011,b=2012；字符型 c1='N',c2='n'；实型变量 x=3.14,y=23.45。

回复:
user: user-1
content: scanf("%d %d%c%c %f %d", &a, &b, &c1, &c2, &x, &y); 试试这样～

user: user-2
content: 简单的打印用选择判断一下就行
user-0 提问: c语言请教大佬

回复:
user: user-1
content: 因为是后增，优先级是高于赋值，所以要先(*--p)与++结合，把整体的值赋值给y，最后在++； 你上一个帖子还发张图片出来，这个帖子没有任何图片不好定位问题呢
user-0 提问: 萌新想有点不会的

回复:
user: user-1
content: ++是后置 后置就是语句结束之后在进行自增

user: user-2
content: 前自增减的优先级高于赋值，后自增减有个条件是这一行语句执行完后才会执行。先－－ｐ得到ｐ０地址，取值五，在（*ｐ）＋＋

user: user-3
content: a  = b++; 是先执行 b++； 不过 返回给a 的值是 b++ 之前的值。

user: user-4
content: 引用 3 楼 qq_47279096 的回复:[quote=引用 2 楼 蜗牛千泷的回复:]* 指针p指向数组a的第1个元素a[1]  表达式：y = ( *--p )++;  1. 括号的优先级大于“++”。先运算括号内的表达式（ *--p ） 2. *与--的优先级相同，结合方向是由由到左，先运算“--” 3. --p 是前自减，所以先对指针p做移位操作，前移一个位置(int)，那么指针p指向了数组a的第0个元素a[0] 4. 然后做*的取内容操作，取得是a[0]的数据，为5 5. 下面看括号后的运算符++，这是后自增，就是先运算当前表达式，再自增，也就是先对y赋值（（ *--p ）赋值给y, 就是y = 5 ）,再自增（（ *--p ）自增，就是a[0]自增，则a[0]为6） 画重点左结合性[/quote] 你去查一下优先级表哦，看一下运算符*、--、++的结合方向

user: user-0
content: 引用 2 楼 蜗牛千泷的回复:* 指针p指向数组a的第1个元素a[1]  表达式：y = ( *--p )++;  1. 括号的优先级大于“++”。先运算括号内的表达式（ *--p ） 2. *与--的优先级相同，结合方向是由由到左，先运算“--” 3. --p 是前自减，所以先对指针p做移位操作，前移一个位置(int)，那么指针p指向了数组a的第0个元素a[0] 4. 然后做*的取内容操作，取得是a[0]的数据，为5 5. 下面看括号后的运算符++，这是后自增，就是先运算当前表达式，再自增，也就是先对y赋值（（ *--p ）赋值给y, 就是y = 5 ）,再自增（（ *--p ）自增，就是a[0]自增，则a[0]为6） 画重点左结合性

user: user-4
content: * 指针p指向数组a的第1个元素a[1]  表达式：y = ( *--p )++;  1. 括号的优先级大于“++”。先运算括号内的表达式（ *--p ） 2. *与--的优先级相同，结合方向是由由到左，先运算“--” 3. --p 是前自减，所以先对指针p做移位操作，前移一个位置(int)，那么指针p指向了数组a的第0个元素a[0] 4. 然后做*的取内容操作，取得是a[0]的数据，为5 5. 下面看括号后的运算符++，这是后自增，就是先运算当前表达式，再自增，也就是先对y赋值（（ *--p ）赋值给y, 就是y = 5 ）,再自增（（ *--p ）自增，就是a[0]自增，则a[0]为6）

user: user-5
content: 后置++是要执行完这行语句才执行的
user-0 提问: 函数返回值

回复:
user: user-1
content: 这里的char估计说的是字符串，而不是单个字符  比如IP地址，Ipv4的话，在网络传输中，使用4字节存储，而与人交流时，可能就得转成192.168.1.1之类的字符串，就不止4个字节了。

user: user-2
content: 参数类型和返回值类型 没有任何关系 所以你的所有疑问都不成立 没必要讨论了

user: user-1
content: 你贴的截图函数原型不完整，要看最前面的声明，是否是char *n_to_char(int)之类的声明。是的话表明是转为字符串。 如果是char n_to_char(int)，那就像你初始理解的，如果没有限制int范围，就会存在一个多至少的映射，会损失数据

user: user-0
content: 引用 1 楼 arfi的回复:这里的char估计说的是字符串，而不是单个字符  比如IP地址，Ipv4的话，在网络传输中，使用4字节存储，而与人交流时，可能就得转成192.168.1.1之类的字符串，就不止4个字节了。 哦哦，那个字符串char返回时与int的类型是不匹配的

user: user-3
content: c里面char就表示一字节，int是4字节

user: user-4
content: 因为本质上，int和char都是内存上的数据，只不过int是4个字节，char是1个字节。从本质上去看，两者互相转换没有任何问题。一些语言不让你转，是为了保护你不去搞些骚操作引起内存问题。

user: user-5
content: 函数的返回值  和接受的实参类型没有关系

user: user-6
content: 返回值和参数的类型没有一点关系
user-0 提问: c语言 萌新小白求指教

回复:
user: user-1
content: 引用 2 楼 slanis 的回复:谢谢大神的回复； main 函数scanf这个地方运行有点问题； 请问如何修正？   有啥问题

user: user-0
content: 谢谢大神的回复； main 函数scanf这个地方运行有点问题； 请问如何修正？

user: user-1
content: #include <stdio.h> #include <string.h>  void StrSwap(char *x, char *y) {     for (int i = 0; i < strlen(x); i++)     {         int InputOrignalChar = 1;         for (int j = 0; j < strlen(y); j++)         {             if (x[i] == y[j])             {                 InputOrignalChar = 0;                 break;             }         }         if (InputOrignalChar)         {             putchar(x[i]);         }         else         {             putchar('*');         }     } }  int main(void) {     char str1[20], str2[10];      printf("第一文字列：");     scanf("%s", str1);     printf("第二文字列：");     scanf("%s", str2);      StrSwap(str1, str2);     return 0; }
user-0 提问: C语言十个数降序帮帮忙

回复:
user: user-1
content: int a[9]是不是要a[10]  冒泡好像也有点问题  int a[10] = {1024,10,2,35,48,92,69,17,8,19}; 	//框架 + 建立交换法 	int temp = 0,i,j; 	//控制比较的次数 	for(i=0;i<10;i++) 	{ 		//每一个数比较的轮数 		for(j=0;j<10-i-1;j++) 		{ 			//前大于后 >升序  <降序 			if(a[j]>a[j+1]) 			{ 				//内层循环 交换相邻 				//两个数的值 				temp = a[j]; 				a[j] = a[j+1]; 				a[j+1]=temp; 			}		 		}		 	}

user: user-2
content: 因为你10个数据只定义了a[9]
user-0 提问: 创建二叉树中的疑惑，求解答

回复:
user: user-0
content: 引用 1 楼 吴**的回复:1.使用*ptr，是你前面传参用的&root。如果直接传root，main()里面的root不会变。这是指针这块的内容 2.二叉树你可以看看原理你就清楚了 谢了，后面看到了一些很好的解释解决了问题1。有好多创建二叉树的方法，都差不多，也明白了一些。

user: user-1
content: 1.使用*ptr，是你前面传参用的&root。如果直接传root，main()里面的root不会变。这是指针这块的内容 2.二叉树你可以看看原理你就清楚了
user-0 提问: 链表的创建

回复:
user: user-0
content: 引用 2 楼 自信男孩的回复:struct Node { int data; //数据域 struct Node * pNext; //指针域 }; //NODE等价于struct Node    PNODE等价于struct Node * 这个结构体声明放在上面typedef的前面试一下。  在我的环境下你的代码编译没问题，编译运行都是可以的。 我试了，也是同样的错误，所以我才定义在前面

user: user-1
content: struct Node { int data; //数据域 struct Node * pNext; //指针域 }; //NODE等价于struct Node    PNODE等价于struct Node * 这个结构体声明放在上面typedef的前面试一下。  在我的环境下你的代码编译没问题，编译运行都是可以的。

user: user-2
content: 标准不一样， typedef struct Node NODE; typedef struct Node * PNODE; 放在结构体声明后面。