Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言求值顺序

回复:
user: user-1
content: 无序

user: user-2
content: 建议先弄明白：a = x + y + z;的执行顺序就可以知道函数的调用顺序了。

user: user-3
content: 按优先级运算的吧

user: user-4
content: 1、2、3吧

user: user-4
content: 确实。无序。 参考：https://blog.csdn.net/weixin_38239856/article/details/70040757
user-0 提问: 请教各位高手，这里的循环为什么会出现这种现象

回复:
user: user-1
content: 你的循环体里会对a, b做修改吗？可以提供更多的关于a, b的操作

user: user-0
content: 引用 1 楼 user-4的回复:strlen返回无符号类型  如果字符串a长度小于字符串b的长度 因为是无符号类型 所以会变成一个非常大的正数 所以会循环很多次 你说的太对了！谢谢！

user: user-2
content: int m=strlen(a) - strlen(b)+1; for (i = 0; i < m; i++){……} 要是改成这样呢？

user: user-3
content: 哥们，你程序不完整，都看不到字符串a和字符串b的实际是什么样的。。。请发完整一点

user: user-4
content: strlen返回无符号类型  如果字符串a长度小于字符串b的长度 因为是无符号类型 所以会变成一个非常大的正数 所以会循环很多次
user-0 提问: 什么时候会用到NULL？求求大佬回答下

回复:
user: user-1
content: 文件打开失败会返回NULL，那么什么时候会失败呢，要根据打开格式分别来区分。比如"r"打开，那么当文件不存在时（路径不对）会失败。 "w"格式打开时，如果文件是只读的，那么打开会失败。但是如果文件不存在会被创建，但不会返回NULL。

user: user-0
content: 非常感谢大佬们

user: user-2
content: 你看fopen的使用说明啊，文件打开失败会返回NULL，打开失败的原因挺多的，比如文件不存在啦（如果你的打开方式支持文件不存在则创建该文件则不会返回NULL），系统不允许你打开该文件啦，等等

user: user-3
content: 比如 w打开 没找到这个文件需要创建 但是你没有创建文件的权限 那就会返回NULL 比如 w打开 找到文件 需要清空文件内容 但是你没有修改文件的权限或者文件只读 就会返回NULL
user-0 提问: 能帮忙看一下错在哪吗

回复:
user: user-0
content: 引用 11 楼 棉猴的回复:#include<stdio.h>  int main() { 	int m, i, max, min; 	float sum, aver; 	int a[100] = { 0 }; 	printf("请输入m个数:\n"); 	scanf("%d", &m); 	scanf("%d", &a[0]);//-----------a[0]改为&a[0] 	sum = max = min = a[0]; 	for (i = 1; i < m; i++) 	{ 		scanf("%d", &a[i]);//----------a[i]改为&a[i] 		sum = sum + a[i]; 		if (a[i] > max) 		{ 			max = a[i]; 		} 		if (a[i] < min) 		{ 			min = a[i]; 		} 	}  	aver = sum / m; 	printf("max=%d min=%d average=%.2f", max, min, aver);      return 0; } VS2015 C++环境  谢谢 ！！！

user: user-0
content: 引用 1 楼 @大愚@的回复:你的再录入a[0]时是不是少一个取地址符& 抱歉 后面的scanf没加& 刚刚才分清了

user: user-1
content: #include<stdio.h>  int main() { 	int m, i, max, min; 	float sum, aver; 	int a[100] = { 0 }; 	printf("请输入m个数:\n"); 	scanf("%d", &m); 	scanf("%d", &a[0]);//-----------a[0]改为&a[0] 	sum = max = min = a[0]; 	for (i = 1; i < m; i++) 	{ 		scanf("%d", &a[i]);//----------a[i]改为&a[i] 		sum = sum + a[i]; 		if (a[i] > max) 		{ 			max = a[i]; 		} 		if (a[i] < min) 		{ 			min = a[i]; 		} 	}  	aver = sum / m; 	printf("max=%d min=%d average=%.2f", max, min, aver);      return 0; } VS2015 C++环境

user: user-0
content: 对 结果一样 是那个意思 先输入一个值 给Max min sum 再。。。

user: user-0
content: 引用 6 楼 user-3的回复:建议把代码粘贴出来，不然有大佬愿意看或指点要重新自己敲一遍？？ #include<stdio.h> int main() {  int m,i,max,min;  float sum,aver;  int a[100];   printf("请输入m个数：\n");  scanf("%d",&m) ;//输入m的值   scanf("%d",a[0]);//输入a[0];   sum=max=min=a[0];  for(i=1;i<m;i++)     {  scanf("%d",a[i]);        sum=sum+a[i];        if (a[i]>max) max=a[i];        if (a[i]<min) min=a[i];     }  aver=sum/m;   printf("max=%d min=%d average=%.2f",max,min,aver); return 0; }

user: user-0
content: 引用 6 楼 user-3的回复:建议把代码粘贴出来，不然有大佬愿意看或指点要重新自己敲一遍？？ 括号对的 先输一个 分别赋值给Max min sum 再输入其他的 谢谢建议 代码附上

user: user-2
content: 看你的代码好像是录入一个数就下标为0的数组元素

user: user-3
content: 建议把代码粘贴出来，不然有大佬愿意看或指点要重新自己敲一遍？？

user: user-3
content: scanf("%d",&a[0]); 这句是想一次把所有数据都输入吗？可只能接收到一个啊

user: user-2
content: 结果还和图一样？？？

user: user-3
content: 大括号没匹配上吧

user: user-0
content: 引用 1 楼 @大愚@的回复:你的再录入a[0]时是不是少一个取地址符& 好像还是不可以

user: user-2
content: 你的再录入a[0]时是不是少一个取地址符&
user-0 提问: 求助【泪目】

回复:
user: user-1
content: // 题目要根据系统是大段 还是小端存储  还要根据系统int是几个字节 通常是4个字节但是也有8个或更多的的情况 	// 这道题考察的是对数据类型在内存中的存储 有一定了解 可以看看深入理解计算机系统这本书 	// 以4字节为例 每个字节代表8位 所以就是32位         int m = 1000; 	printf("0x%02x\n", (m & 0x000000ff) >> 0); 	printf("0x%02x\n", (m & 0x0000ff00) >> 8); 	printf("0x%02x\n", (m & 0x00ff0000) >> 16); 	printf("0x%02x\n", (m & 0xff000000) >> 32);  	// 	3、7、13、17、23、27 	for (int i = 0; i < 32; i++) { 		int bit_mask = 1 << i; 		if (m & bit_mask) { 			printf("bit:%d->%d\n", i, 1); 		} 		else { 			printf("bit:%d->%d\n", i, 0); 		} 	}

user: user-2
content: int a = 0x12345678;  unsigned char* b = &a;  printf("%d,%d,%d,%d\n",*b,*(b+1),*(b+2),*(b+3));  printf("%d",(a>>X)&1);//X代表第几位

user: user-3
content: 你可以设置一个数组来存放这些bit，开始的时候先把数组初始化都赋值0，再用该数组存放这个数的二进制，再把数组进行转置。然后通过下标就可以访问这个数组中的元素了.

user: user-4
content: 应该是位移加掩码来做。

user: user-0
user-0 提问: 利用raw socket从一个端口抓包，然后发到另一个端口，包太大，发不过去怎么办？

回复:
user: user-0
content: 假设抓的包有2000个字节，该如何拆成2个包，需要计算checksum以及分片信息吗？另外Jumbo Frame该怎么用？谢谢！

user: user-1
content: raw socket从一个端口抓包有多大你得说一下，要么分开发，要么用Jumbo Frame（巨型帧）

user: user-0
content: 怎样对一个完整的大包进行拆解，拆开的数据是不是还有计算checksum，以及分片ID等等

user: user-2
content: 拆开，分多次发送。每次发送固定大小。 接收端多次接收，然后组成一个完整的包。
user-0 提问: 练习题，有几处地方看不懂

回复:
user: user-0
content: 引用 6 楼 棉猴的回复: 这个更加看不懂了

user: user-1

user: user-1
content: int main() { 	int i, j, m, n, x; 	for (i = 1; i < 168 / 2 + 1; i++) //枚举i的值，从1到168/2 	{ 		if (168 % i == 0) //保证i×j=168 		{ 			j = 168 / i;//保证i×j=168 			if (i > j && (i + j) % 2 == 0 && (i - j) % 2 == 0)//保证(i+j)/2和(x-j)/2正好是整数，没有余数 			{ 				m = (i + j) / 2; 				n = (i - j) / 2; 				x = n * n - 100; 				printf("%d + 100 = %d * %d\n", x, n, n); 				printf("%d + 268 = %d * %d\n", x, m, m);//这个表达式看懂了，if花括号为啥回在这呢 			} 		} 	}

user: user-2
content: 楼主的想法很难想  X+100=N*N  X+100+168=M*M（M,N均为整数，且M>N)  两式相减：  168=（M+N）*（M-N）  i,j替换了m+n和m-n  所以就变成了找168的因子

user: user-3
content: int square[70] = { 0 }; 	for (int i = 0; i < 70; i++) { 		square[i] = (i + 1) * (i + 1); 	} 	int find = 0; 	for (int i = 0; i < 70; i++) { 		if (square[i] - 168 > 0) { 			int t = square[i] - 168; 			for (int j = 0; j < 70; j++) { 				if (t == square[j]) { 					int t = square[j] - 100; 					if (t < 0) { 						break; 					} 					printf("%d\n", t); 				} 			} 		} 	} 	return 0;    没看懂你代码的脑回路  你学代码的时候 找答案不能找写的菜的学习  要学写代码至少要找个靠谱的学啊  至少看着if else不能那么乱的人学  你的代码可能就是判断一个数是不是平方数  然后加上奇奇怪怪的逻辑   给你写个我写的穷举解法 建议用csdn你发代码至少加上网页标签  有的时候提问比你自身问的问题更重要   可以去leetcode网站学写代码 通常完成里面所有的习题  当你都弄明白时  你已经身前身后无人了  至少在中国的码农级别里是 专家级的

user: user-0
content: 自顶
user-0 提问: 一个double 类型的函数，给他一个int类型的值作为返回值，会出现什么问题鸭？？

回复:
user: user-0
content: 我把add类型改成 int 后，return 的时候函数自动将其转换成了double 类型，而 小 转换成 大的是不会溢出的； 但是算阶乘的时候，由于 int 的范围比 double的小，所以当数据很大的时候就会产生溢出，这时候就会出错。  我还特意将 add 的类型定义为 long long 试了一下（完全正确！！）：   现在来看这个题目：为什么只有测试点1会出错呢？？可能是这个点测试的数据比较大，其他的比较小。（我只能这么理解了）

user: user-1
content: 等价这样：int a; a = 1.1; 相当于把一个浮点数赋值给一个int类型。所以，可以自己试一下int a = 110.323234;看看a输出的结果是多少

user: user-2
content: int范围不够吧，这个应该012都会出错？3固定=1，应该不会错

user: user-3
content: 就类型转换啊 假如你是return a 返回值标明的是double 那么你可以理解为会有这样一步操作 return (double)(a) 即最后返回一个转换后的double变量
user-0 提问: vscode调试成功的同时跳出弹窗“任务出错”

回复:
user: user-0
content: 引用 1 楼 风吟xqy 的回复:这好像是更新版本以后的bug，我今天更新之前没有，更新之后和你一样 我也是之前没有，今天突然就有了

user: user-1
content: 这好像是更新版本以后的bug，我今天更新之前没有，更新之后和你一样
user-0 提问: 小学生问题，困扰好几天，有大佬给下解释吗

回复:
user: user-0
content: 引用 4 楼 真相重于对错的回复:好好想想， 1%3  列个式子 感谢，我弄明白了

user: user-0
content: 引用 3 楼 user-2的回复:我打错了，尴尬...不过思路是没有错的 1除以3，等于0余1，取余数，所以a等于1 哦，我可能一下子没反应过来，谢谢

user: user-1
content: 好好想想， 1%3  列个式子

user: user-2
content: 我打错了，尴尬...不过思路是没有错的 1除以3，等于0余1，取余数，所以a等于1

user: user-0
content: 引用 1 楼 user-2的回复:楼主你搞错了。  除法运算符：/      C语言用符号/表示除法。例如13/5得2。余数舍去。 求模运算符：%    用于整数运算。求模运算符给出其左侧整数除以右侧整数的余数。例如，13%5得3。简单来说这个运算符是用来取余数的。  为了让楼主更好地理解，我简单写一下代码如下： #include <stdio.h>  int main() {     int a,b;     a = 1%3;    //1除以3，等于0余3，取余数，所以a等于3     b = 1/3;     //1除以3，等于0余3，取商，所以b等于0     printf("a=%d, b=%d\n", a,b);      return 0; } 编译后结果：a=1, b=0  还有不懂的请继续提问 那不该=3吗，你这个不对

user: user-2
content: 楼主你搞错了。  除法运算符：/      C语言用符号/表示除法。例如13/5得2。余数舍去。 求模运算符：%    用于整数运算。求模运算符给出其左侧整数除以右侧整数的余数。例如，13%5得3。简单来说这个运算符是用来取余数的。  为了让楼主更好地理解，我简单写一下代码如下： #include <stdio.h>  int main() {     int a,b;     a = 1%3;    //1除以3，等于0余3，取余数，所以a等于3     b = 1/3;     //1除以3，等于0余3，取商，所以b等于0     printf("a=%d, b=%d\n", a,b);      return 0; } 编译后结果：a=1, b=0  还有不懂的请继续提问
user-0 提问: 位置指示器指的是文件指针吗？

回复:
user: user-0
content: 引用 1 楼 Simple-Soft 的回复：指的是指向文件的当前位置的标志，就是表示从什么地方开始写文件或者读文件，这个指示器还可以可以自己指定这个指示器是指针吗？

user: user-1
content: 指的是指向文件的当前位置的标志，就是表示从什么地方开始写文件或者读文件，这个指示器还可以可以自己指定

user: user-2
content: 文件指针是FILE*类型的 它表示指向了一个FILE结构 这个结构里记录了你当前读写的文件的一些信息 比如你读写的哪个文件？以怎样的方式读写的？读写到哪里了之类的 当你用fputc写入了一个字符后 这个FILE结构里的记录肯定要改变对吧 其实，记录你写入的位置要后移1字节对吧，这样你下次写的时候就不会写在上次写的地方了，而是在上次写的那个字节刚好后面的一个字节 指针没有改变，它依然指向那个FILE结构，这个FILE结构在内存中的位置也没变过，只是这个结构里的一点数据发生了改变

user: user-0
content: 好抽象啊...

user: user-3
content: 指示器就是一个标识，标识的值表示处于文件的什么位置（相对于第一个字节的偏移量）打开文件时这个值由内核在维护。读写这个文件都是从这个标识位置开始的。读了或写了多少字节，这个标识的值就增加多少。
user-0 提问: c语言请教大佬

回复:
user: user-1
content: if(*p == c) 改成 （*（p+i) == c)才合适吧。

user: user-2
content: 删除不是这种删除方式，你要是给他赋值'\0'了，就表示字符串结尾了，当然输不出东西了。
user-0 提问: eof用于文件结束和文件错误时的函数返回值，计算机本质上是如何靠eof判断是文件结束还是错误呢

回复:
user: user-1
content: 操作系统打开一个文件，会创建一个文件句柄，该文件句柄指向了一块内存描述该文件，其中包含了文件当前位置和文件的大小，feof只是判断文件位置是否表示已经在文件末尾了，然后返回结果。

user: user-0
content: 自顶

user: user-0
content: 有大佬帮忙解答一下吗？
user-0 提问: 发帖真的有人回吗？

回复:
user: user-1
content: %c就是用来输出字符的

user: user-0
content: 引用 6 楼 自信男孩 的回复:[quote=引用 4 楼 weixin_47633905 的回复:] [quote=引用 2 楼 自信男孩 的回复:] 为什么不自己试试呢？编程还是要多实践的 试了只知道结果，不知道为啥[/quote] 通过结果不会倒推吗？为什么会输出这个结果，可以加一些debug信息出来，比如16进制格式的怎么表示的，二进制是什么，等等[/quote]  谢谢，现在会玩了

user: user-0
content: 引用 5 楼 user-3 的回复:[quote=引用 3 楼 weixin_47633905 的回复：][quote=引用 1 楼 user-3 的回复:] 编译后输出结果如下： c1=a, c2=b c1=97, c2=98  首先c1和c2是字符类型，并分别赋值为97和98  printf("c1=%c, c2=%c\n", c1,c2);     //这行的意思是说用输出函数printf把c1和c2用字符的方式输出，虽然楼主并没有给c1和c2赋值是什么字符，但是却赋值了数字97和98，此时就涉及到一个叫ASCII码的东西，在ASCII中某些字符和数字是一一对应的，而97对应字符a，98对应字符b，所以printf会输出字符a和字符b。我知道楼主想刨根问底，至于为什么要这样对应？这是约定好的。为什么会有这个叫ASCII的东西，您可以去百度百科看看，我也是刚学C语言不久，回答不了太多。  printf("c1=%d, c2=%d\n", c1,c2);   //这行意思就是用printf函数把c1和c2以十进制的方式输出，那就是输出97和98了。  还有什么不懂的请继续追问。 超级感谢你，如果将程序第4/5行改为：        c1=197;         c2=198;      运行结果输出的信息是不是和“上溢出”（这个词只是听过）有关？这样197-128=69对应E，198-128=70对应F[/quote]溢出这个概念楼主最好先别去深究，这涉及到二进制运算，要了解清楚必须学好计算机组成原理中的原码，补码，反码等相关知识，如果要在这里讲的话就要打太多字了，您现在有个印象就好，实在想知道就去补充一下计算机组成原理的相关知识。[/quote] 谢谢你，现在懂了

user: user-2
content: 为什么不自己试试呢？编程还是要多实践的

user: user-2
content: 引用 4 楼 weixin_47633905 的回复:[quote=引用 2 楼 自信男孩 的回复:] 为什么不自己试试呢？编程还是要多实践的 试了只知道结果，不知道为啥[/quote] 通过结果不会倒推吗？为什么会输出这个结果，可以加一些debug信息出来，比如16进制格式的怎么表示的，二进制是什么，等等

user: user-3
content: 引用 3 楼 weixin_47633905 的回复：[quote=引用 1 楼 user-3 的回复:] 编译后输出结果如下： c1=a, c2=b c1=97, c2=98  首先c1和c2是字符类型，并分别赋值为97和98  printf("c1=%c, c2=%c\n", c1,c2);     //这行的意思是说用输出函数printf把c1和c2用字符的方式输出，虽然楼主并没有给c1和c2赋值是什么字符，但是却赋值了数字97和98，此时就涉及到一个叫ASCII码的东西，在ASCII中某些字符和数字是一一对应的，而97对应字符a，98对应字符b，所以printf会输出字符a和字符b。我知道楼主想刨根问底，至于为什么要这样对应？这是约定好的。为什么会有这个叫ASCII的东西，您可以去百度百科看看，我也是刚学C语言不久，回答不了太多。  printf("c1=%d, c2=%d\n", c1,c2);   //这行意思就是用printf函数把c1和c2以十进制的方式输出，那就是输出97和98了。  还有什么不懂的请继续追问。 超级感谢你，如果将程序第4/5行改为：        c1=197;         c2=198;      运行结果输出的信息是不是和“上溢出”（这个词只是听过）有关？这样197-128=69对应E，198-128=70对应F[/quote]溢出这个概念楼主最好先别去深究，这涉及到二进制运算，要了解清楚必须学好计算机组成原理中的原码，补码，反码等相关知识，如果要在这里讲的话就要打太多字了，您现在有个印象就好，实在想知道就去补充一下计算机组成原理的相关知识。

user: user-0
content: 引用 2 楼 自信男孩 的回复:为什么不自己试试呢？编程还是要多实践的 试了只知道结果，不知道为啥

user: user-3
content: 编译后输出结果如下： c1=a, c2=b c1=97, c2=98  首先c1和c2是字符类型，并分别赋值为97和98  printf("c1=%c, c2=%c\n", c1,c2);     //这行的意思是说用输出函数printf把c1和c2用字符的方式输出，虽然楼主并没有给c1和c2赋值是什么字符，但是却赋值了数字97和98，此时就涉及到一个叫ASCII码的东西，在ASCII中某些字符和数字是一一对应的，而97对应字符a，98对应字符b，所以printf会输出字符a和字符b。我知道楼主想刨根问底，至于为什么要这样对应？这是约定好的。为什么会有这个叫ASCII的东西，您可以去百度百科看看，我也是刚学C语言不久，回答不了太多。  printf("c1=%d, c2=%d\n", c1,c2);   //这行意思就是用printf函数把c1和c2以十进制的方式输出，那就是输出97和98了。  还有什么不懂的请继续追问。

user: user-0
content: 引用 1 楼 user-3 的回复:编译后输出结果如下： c1=a, c2=b c1=97, c2=98  首先c1和c2是字符类型，并分别赋值为97和98  printf("c1=%c, c2=%c\n", c1,c2);     //这行的意思是说用输出函数printf把c1和c2用字符的方式输出，虽然楼主并没有给c1和c2赋值是什么字符，但是却赋值了数字97和98，此时就涉及到一个叫ASCII码的东西，在ASCII中某些字符和数字是一一对应的，而97对应字符a，98对应字符b，所以printf会输出字符a和字符b。我知道楼主想刨根问底，至于为什么要这样对应？这是约定好的。为什么会有这个叫ASCII的东西，您可以去百度百科看看，我也是刚学C语言不久，回答不了太多。  printf("c1=%d, c2=%d\n", c1,c2);   //这行意思就是用printf函数把c1和c2以十进制的方式输出，那就是输出97和98了。  还有什么不懂的请继续追问。 超级感谢你，如果将程序第4/5行改为：        c1=197;         c2=198;      运行结果输出的信息是不是和“上溢出”（这个词只是听过）有关？这样197-128=69对应E，198-128=70对应F
user-0 提问: raw socket 用sendto函数发包，包大于MTU就返回sendto: Message too long，发送失败

回复:
user: user-0
content: 我利用raw socket从一个端口抓包，然后将抓到的包发送另外一个端口，结果从一个端口上抓的包太大，调用sendto发不到另外一个端口。

user: user-1
content: 自己分包发送，定义自己的包头

user: user-2
content: sendto不是发udp的函数吗？少放点数据多发几次，然后在终端按照序号重组不就可以了。不需要太复杂吧。

user: user-0
content: 自己组包很复杂吧！要计算分片ID，还要算checksum？
user-0 提问: c语言的弹出提醒。

回复:
user: user-1
content: 首先要#include "windows.h" 然后 MessageBox( NULL, "提示的内容", "标题", 0 ); 或 MessageBox( GetConsoleWindow(), "提示的内容", "标题", 0 ); 第4个参数表示设定按钮类型，自己去查查吧

user: user-2
content: 参考这个改下 https://blog.csdn.net/lazyyjq2/article/details/52768414

user: user-0
content: 引用 1 楼 usecf的回复:AfxMessageBox("你现在的护理工作为如下:"+top->number+":"+top->content); 跟在这个后面试试 有错误，他说，cannot add two poiters

user: user-3
content: 控制台程序吧？AfxMessageBox()是MFC的函数，在控制台程序里面要添加对MFC的支持。

user: user-2
content: AfxMessageBox("你现在的护理工作为如下:"+top->number+":"+top->content); 跟在这个后面试试
user-0 提问: c语言请教大佬

回复:
user: user-1
content: 引用 5 楼 qq_47279096 的回复:[quote=引用 2 楼 qq_1457346882的回复:]你定义的参数是数组地址，传入的是值 int *max(int a[],int n) int a[]要传ａ（首地址） big=max(b[0],n); small=min(b[0],n); *ｐ=ａ,就是ｐ取ａ的首地址了，没必要＆ａ[０]；多了反而容易弄错 如果是取a[1]的地址就是&a[1]吗[/quote] 如果取a[1]看你是初始化还是怎么样，如果是初始化的话&a[1]可以，如果不是，是程序中ｐ取ａ地址后想要通过ｐ找a[1]地址，直接ｐ＋１就行了，a[１]可以看成*(a+1),数组操作的本质也是指针的移动。p=&a[0]=>p=&*(a+0)取值*取址&抵消，p=a+0;=>p=a;p+1=a+1;a+1可以表示成＆*(a+1)=>&a[1];指针很灵活的，也很容易错，要好好理解一下

user: user-0
content: 引用 2 楼 qq_1457346882的回复:你定义的参数是数组地址，传入的是值 int *max(int a[],int n) int a[]要传ａ（首地址） big=max(b[0],n); small=min(b[0],n); *ｐ=ａ,就是ｐ取ａ的首地址了，没必要＆ａ[０]；多了反而容易弄错 如果是取a[1]的地址就是&a[1]吗

user: user-2
content: //int *max(int a[],int n) int max(int a[],int n) {     int *p=&a[0],i;     for(i=0;i<n;i++)     {         if(*p<a[i])             p=&a[i];     }     return *p; }  //int *min(int a[],int n) int min(int a[],int n) {     int *p=&a[0],i;     for(i=0;i<n;i++)     {         if(*p>a[i])             p=&a[i];     }     return *p; } int ave(int a[],int n) {     int i,sum=0;     for(i=0;i<n;i++)     {         sum+=a[i];     }     return sum/n; } //#include <stdio.h> int main() {     int b[10]={1,2,3,4,5,6,7,8,9,10},n=10,big,small,pingjun;     //big=max(b[0],n);     big=max(b, n);     //small=min(b[0],n);     small=min(b, n);     //pingjun=ave(b[0],n);     pingjun=ave(b,n);     printf("%d %d %d\n",big,small,pingjun);     return 0; } 供参考～  big = max(&b[0], n); 也可以这样的。

user: user-1
content: 还有你这个返回值也有问题 int *min(int a[],int n)你定义的返回值类型是指针，但你ｒｅｔｕｒｎ的是值，建议把指针好好看看，不同地方的*有不一样的含义

user: user-1
content: 你定义的参数是数组地址，传入的是值 int *max(int a[],int n) int a[]要传ａ（首地址） big=max(b[0],n); small=min(b[0],n); *ｐ=ａ,就是ｐ取ａ的首地址了，没必要＆ａ[０]；多了反而容易弄错

user: user-3
content: 你只说有问题，没说具体什么现象？编译问题还是运行问题？
user-0 提问: C语言循环遇到了一些问题

回复:
user: user-0
content: int  create_cjlist(Select sclist[],int sccount,Course clist[],int ccount,Student slist[],int scount,Score cjlist[],int *cjcount) { 	int a[99]={0}; 	int i,j,k,z=0,b=0; 	float zxf=0.0,zcj=0.0; 	for(i=0;i<scount;i++)//依次循环知道把slist里面的数据输出完 	{ 		for(j=0;j<sccount;j++)//sclist 		{ 			for(k=0;k<ccount;k++)//clist 			{ 				if(strcmp(sclist[j].xh,slist[i].xh)==0) 				{ 					if(strcmp(sclist[j].kh,clist[k].kh)==0) 					{ 						strcpy(cjlist[i].xh,slist[i].xh); 						strcpy(cjlist[i].xm,slist[i].xm); 						cjlist[i].cj[z++]=sclist[j].cj; 						b++; 						zxf+=clist[k].xf;  						zcj+=sclist[j].cj; 					} 				}	 			}  		} 		printf("%f  %f  %d\n",zxf,zcj,b); 	    cjlist[i].zxf=zxf; 		cjlist[i].zpj=zcj/cjlist[i].zxf; 		a[i]=b; 		zcj=0;zxf=0;z=0;b=0; 	} 	*cjcount=i; }这些是我的代码
user-0 提问: 如图不求答案，求解释，为啥转义字符转换之后a不见了

回复:
user: user-1
content: 我也是初学者....帮你查找了下资料...  \r是回车符，它的作用是把位置移动到当前行的开始处。也就是说在这一行中，不管\r前面有多少东西，都会被删去，所以a被删除了。 \b是退格符，它的作用是在当前位置向左移动一位，在移动的同时把字符i删除了。  这两个转义字符所说的移动并非只是单纯的移动，而是指在移动的同时删除移动过程中覆盖的字符。

user: user-0
content: 引用 4 楼 weixin_45906870的回复:我也是初学者....帮你查找了下资料...  \r是回车符，它的作用是把位置移动到当前行的开始处。也就是说在这一行中，不管\r前面有多少东西，都会被删去，所以a被删除了。 \b是退格符，它的作用是在当前位置向左移动一位，在移动的同时把字符i删除了。  这两个转义字符所说的移动并非只是单纯的移动，而是指在移动的同时删除移动过程中覆盖的字符。 OK，你说得对，我懂了

user: user-0
content: 能不能看看我问啥

user: user-2
content: 最好能记住几种常用的符号 \r是回车符，相当于光标会回到本行行首 \b是退格符，相当于删除光标前一个字符 \r是换行符，相当于光标会移到下一行的行首 \t是制表符，相当于光标会跳转tab键的距离 等等

user: user-0
content: 自顶
user-0 提问: 麻烦各位大佬帮我看下这两段代码有啥不同吗

回复:
user: user-1
content: 不科学!没人

user: user-2
content: 我来拿分了！

user: user-3
content: 引用 楼主 浮沉! 的回复:1、   /*输入一行字符，分别统计出其中英文字母、空格、数字和其它字符的个数。*/ #include<stdio.h> int main() {     int a,b,c,d;     a=b=c=d=0;     int arr;     while((arr=getchar())!='\n')     {         if((arr>='A'&&arr<='Z')||(arr>='a'&&arr<='z'))         {             a++;         }else if(arr==' ')         {             b++;         }else if(arr>'0'&&arr<'9')         {             c++;         }else          {             d++;         }     }     printf("%d %d %d %d ",a,b,c,d);     return 0; }   2、  #include<stdio.h> int main() {    int c, space ,number ,character , other;     space = number = character = other =0;     while( (c = getchar())!='\n')     {         if( c == ' ')         {             space++;         }         else if( c >='0'&& c <='9')         {             number++;         }         else if ( (c >='a' && c <= 'z') || ( c >= 'A' && c <= 'Z') )         {             character++;         }         else         {             other++;         }               }     printf("%d %d %d %d",character,space,number,other);     return 0; }    真的是恶心到我了 第二段在ACM上可以成功 第一段就答案错误  整的我快自闭了   第一段里面 else if( c >'0'&& c <'9')    //数字0h和9不会计算到数字，而是计算到其他字符哦 第二段里面 else if( c >='0'&& c <='9')

user: user-0
content: 送分了  来个人回复下 我结贴

user: user-0
content: 找到错误了
user-0 提问: 这段代码中如果没有exit（EXIT_FAILURE）和return 0会发生什么？

回复:
user: user-0
content: 引用 3 楼 自信男孩 的回复：fclose(fp);会执行失败，没有其他问题。stderr和stdout有什么不同吗？

user: user-1
content: fclose(fp);会执行失败，没有其他问题。

user: user-0
content: 引用 1 楼 user-2 的回复：第一个地方，就是错误在stdout中输出了 第二个地方如果去掉，代码会往后执行，执行到fclose的地方会出错，由于文件对象为空。 去掉第三个地方，编译会出错，没有返回值值1错误在stdout输出，那岂不是stderr和stdout都一样吗？ 2我删去之后再编译，为什么没有问题？ 3这个我懂了

user: user-2
content: 第一个地方，就是错误在stdout中输出了 第二个地方如果去掉，代码会往后执行，执行到fclose的地方会出错，由于文件对象为空。 去掉第三个地方，编译会出错，没有返回值值
user-0 提问: c语言问题求解

回复:
user: user-1
content: scanf("%s %s %s",webs[i].abbr,webs[i].name,webs[i].URL); getchar(); //这里加一句清空输入缓存的回车换行符 scanf("%s",abbr);

user: user-0
content: 哦哦,忘记说了,不过我刚刚已经找到错误了,谢谢哦!

user: user-2
content: 引用 1 楼 user-2 的回复:我也不知道你哪儿错了  你的错误是什么 你的代码想干什么  让我猜的好难  你期待输出什么 实际输出什么？你提问题的时候好歹说一下啊

user: user-2
content: 我也不知道你哪儿错了  你的错误是什么 你的代码想干什么  让我猜的好难
user-0 提问: 中缀表达式转后缀表达式 不知道代码哪里出现问题 请大佬指出

回复:
user: user-0
content: 谢谢您的提醒。

user: user-1
content: 这种提问方式很难得到回答，没有说明什么错误，也没有提供其他信息

user: user-0
user-0 提问: c语言请教大佬

回复:
user: user-1
content: *p=a[j];  p是个野指针

user: user-2
content: #include <stdio.h>  int main(void) {     int a[10],b[10],i,j,  *p;      tmp = a[0];     for(i=0;i<10;i++)         scanf("%d",&a[i]);      for(i=0;i<10;i++)     {         for(j=0;j<10-i-1;j++)         {             if(a[j]>a[j+1])                 //*p = a[j];                 p = &a[j];             else                 //*p = a[j+1];                 p = &a[j+1];         }         b[i] = *p;     }     for(i=0;i<10;i++)         printf("%d",b[i]);     return 0; } 供参考～ 代码还有问题，最小的值没有放到b中。

user: user-3
content: 这种思路有问题，每次选中的值应该在下一次循环前删除。所以还是用冒牌排序吧

user: user-4
content: 你可以用冒泡排序或者选择排序

user: user-4
content: 你这思路也有些问题，如果第一个数值就是最大的，但你总是从第一个开始找，选中后，你也没有排除

user: user-5
content: int p;变量就够了，不用指针，用指针的话你初始化为谁呢，不管是ａ还是ｂ都会改变数组的值
user-0 提问: 大佬帮帮我吧

回复:
user: user-1

user: user-2
content: 一楼说的是对的，你可能没理解。 关键是：输入字符后，按下“Enter”键，这个“Enter”键字符可被 getchar() 获取         在初始选择时，输入“1”，并按下“Enter”键，这时字符‘1’被scanf()获取，而缓冲区内存在“Enter”字符，它可以被getchar()获取，所以在输入完1后，进入 void createBitree() 创建二叉树，函数开头调用getchar()获取字符，这时“Enter”字符被获取到，则二叉树的根为“Enter”字符；        接着执行下面 else 中的第一个 void createBitree() 创建左二叉树分支，输入‘A’，按下“Enter”，该左分支的值为‘A’，“Enter”字符，仍被 getchar() 获取继续创建该分支下的左二叉树分支；        按下的“Enter”字符，作为该左分支的值，下面继续递归执行 else 中的第一个 void createBitree() 创建左二叉树分支，这时输入‘#’，按下“Enter”，则该左分支结束，执行下面的 void createBitree() 创建右二叉树分支；        按下的“Enter”字符，作为该右分支的值，下面继续递归执行 else 中的第一个 void createBitree() 创建左二叉树分支，这时输入‘#’，按下“Enter”，则该左分支结束，执行下面的 void createBitree() 创建右二叉树分支； ...... 如此反复递归，不会结束，这也是为什么会连续输出两次“please enter”，你可以在 void createBitree() 中加入一个参数，表示当前创建的是左分支还是右分支，并把它输出来看一下就清楚了                                        Enter                                      /                                    A                                   /                               Enter                               /    \                             #     Enter                                    /    \                                   #    Enter                                         /   \                                       #     Enter                                               ......  解决方法： 在 void createBitree() 中的 ch = getchar(); 前再调用一次 getchar(); 过滤掉“Enter”字符。

user: user-1
content: 你第一步给s赋值，你输入1程序的运行权就交给了创建二叉树函数，你会敲回车结束给s赋值，转过来创建二叉树，getchar会把你的回车也当做一个字符赋给ch，空格就变成了二叉树的根了

user: user-0
content: 我现在加了printf，但是输出后退不出来，好像不是你说的那个问题
user-0 提问: 我想比较日期跟时间，我的这个冒泡排序法红色勾的地方怎么改，写的是结构体。

回复:
user: user-0
content: 引用 楼主 芒果干。。的回复:具体看图吧，电脑的思维太难搞了。 图忘记发了，后面我又写了一条一样的帖子。
user-0 提问: 哈夫曼树编码函数出现“已触发一个端点”的错误

回复:
user: user-1
content: 你的问题解决了吗？我的问题和你的一模一样

user: user-0
content: 引用 1 楼 user-2 的回复:hc[p]越界了，p越界 越界了吗，我检查了没有呀？？？？

user: user-2
content: hc[p]越界了，p越界
user-0 提问: C语言结构体题目

回复:
user: user-0
content: 已解决，多谢

user: user-1
content: scanf("%s\t%s\t%lf\t%lf\t%lf",stu[i].xh,stu[i].xm,&stu[i].yw,&stu[i].sx,&stu[i].yy); 把里面的\t全去掉，屏幕输入时用空格分开就行了，%lf直接%f  scanf("%s%s%f%f%f",stu[i].xh,stu[i].xm,&stu[i].yw,&stu[i].sx,&stu[i].yy);
user-0 提问: vs2017 printf_s函数出问题了。。。。

回复:
user: user-1
content: scanf_s用%c，%s时要指定长度，也就是要多一个长度参数 即改成 scanf_s("%c", &G->v[i], 1); //多一个长度参数，1表示1个字符

user: user-2
content: 使用scanf_s输入%c会有问题，好像是要加个什么参数 可以把编译器的SDL检查关了，直接用scanf 项目属性——C/C++——SDL检查——否
user-0 提问: 求大佬帮忙呀

回复:
user: user-0
content: 指针没标明指向时是不是都指向NULL，他的base和sq也是指向NULL

user: user-0
content: s->sq是不是每次往后移4个字节

user: user-1
content: s->base=(int*)malloc(sizeof(int)*n); 这一句可以解读为：分配n个int大小的空间，且把空间的首地址赋值给s->base，的确s->base之前是NULL，但这里是赋值。 s->sp - s->base==s->size s->sp是栈顶指针，指向的其实是栈顶的下一个位置，栈顶指针-栈首指针如果==你分配的空间大小，说明栈已满，不能再添加元素了  *s->sp++=val;可以拆分为 *s->sp=val;     将值赋值到栈顶 s->sp++;        栈顶指针往后移
user-0 提问: 关于快速排序的鬼畜问题

回复:
user: user-1
content: 你用的是递归来实现快排。试试非递归实现

user: user-2
content: 楼上说的递归是其中一个原因，调用函数需要的代价比较大。 但是，关键原因是，排40个数字你看不出快排的价值，要看速度，你得至少排40万个数据啊……去排40万个数据，再对比一下耗时，感受一下差距……

user: user-0
content: 这。。。就触及到我的知识盲区了。。
user-0 提问: 二维数组

回复:
user: user-1
content: ｓｃａｎｆ的本质是将数据写入变量的地址，二位数组分行和列，这里地址是可以分开的，str[0][0]是０行０列的地址的值，[]的作用可以理解为*取值，ｓｔｒ[ｉ]就是取第ｉ行，又因为还有列，而列为空，就没有继续取值，str[ｉ]就是ｉ行首地址。数组取值是先找行，找到对应行的首地址，再从那个地址范围去找列，行列结合定位一个值

user: user-2
content: 既然是二维数组，那么就是存在行和列。每行即str[i]，每行都有20个字节，那不相当于有多个char str[20]？ 可以对比一维数组来理解这个问题～

user: user-3
content: 字符串二维数组你可以这样理解，这个数组保存了5个字符串。

user: user-4
content: 二维数组是一维数组的数组。就是二维数组也就是一个数组，也可以按正常数组来操作，区别在于它的每一个元素又是一个一维数组。  char str[5][20] c风格字符串数组。 str表示字符串数组；str[i] 表示第i个字符串，实际为字符串指针； str[i][j] 表示第i个字符串第j个字符。

user: user-5
content: 二维数组有分行和列，可以这样表示
user-0 提问: C程序调试中断处理方法

回复:
user: user-0
content: 引用 5 楼 自信男孩的回复:scanf_s是VS需要的函数，相比scanf是安全性高，但是需要注意对于%c， %s需要指定长度，这也是scanf_s和scanf的其中一些区别之处 我明白了，三克油

user: user-1
content: scanf_s是VS需要的函数，相比scanf是安全性高，但是需要注意对于%c， %s需要指定长度，这也是scanf_s和scanf的其中一些区别之处

user: user-0
content: 引用 3 楼 5250的回复:用scanf不好吗 VS会报错的

user: user-2
content: 用scanf不好吗

user: user-0
content: 引用 1 楼 前行者001的回复:scanf_s()用于读取字符串时，必须提供一个数字以表明最多读取多少位字符，以防止溢出。 scanf_s("%s",buf,5)；//表示最多读取4个字符，因为buf[4]要放'\0' 我这样改过显示错误

user: user-3
content: scanf_s()用于读取字符串时，必须提供一个数字以表明最多读取多少位字符，以防止溢出。 scanf_s("%s",buf,5)；//表示最多读取4个字符，因为buf[4]要放'\0'
user-0 提问: 这个程序为何半天不出结果啊，哪位大神能帮忙看一下

回复:
user: user-0
content: 这个程序，如果我只是简单的以初始状态为基础移动若干步作为最终状态的话还是能出结果的，但现在这个最终状态就不行，为什么啊
user-0 提问: 小白求救！！为什么用数组求极值以及他们人名的时候，人名是一样的

回复:
user: user-1
content: //#include <stdio.h> #include <stdlib.h> #include <time.h> #include <windows.h> #include <string.h> #include "StdAfx.h" // #define N 45 typedef struct _STU{  //结构体头，前面两个是关键字，后面的是结构体名     int iNum;          //学号, 8位数字，如果学号中有字母，则需要定义成什么类型？ 要定义成字符串，长度要适合     char szName[20];      //姓名，最长19个字符，9个汉字，原因是一个汉字占两位相当于两个英文字符     unsigned char sex;      //性别，0代表女生，1代表男生     unsigned char ucAge;      //年龄，范围0-255，一般年龄不设置变量，而是设置成出生年月，     float  fScore[20];        //20门课的成绩     float  fScoreTotal;      //总分     int    iCnt;          //课程数 }ST_STU;              //这个是一个结构体变量名，通常在声明中，结构体名和结构体变量名都使用大写  int _tmain(int argc, _TCHAR* argv[]) //int main(int argc, char* argv[]) {     ST_STU stLd;     ST_STU stRg[N];     int n, iCnt;     int i,j,m,k;     float fMax, fMin, fAvg, fTotal;     while(1){         printf("请输入软件1901班的人数(1-%d之间)和课程表(1-20之间)，用空格隔开:",N);         scanf("%d%d",&n,&iCnt);         if(n < 1 || n> N ||iCnt < 1|| iCnt> 20 ){             printf("输入值有误，请重新输入！！！\n");         }else break;     }     for(i = 0; i < n;i++){         printf("请输入%d号学生的学号、姓名、性别(0:女生，1:男生）、年龄，并使用空格分开", i+1);         //scanf("%d %s %d %d", &stRg[i].iNum, stRg[i].szName, &stRg[i].sex, &stRg[i].ucAge );         scanf("%d %s %d %d", &stRg[i].iNum, stRg[i].szName, &stRg[i].sex, &stRg[i].ucAge );         stRg[i].iCnt = iCnt;    //结构体内部的成员变量名，可以和外部的变量名相同，因为他们处于不同的级别         for( j = 0, stRg[i].fScoreTotal = 0; j < iCnt; j++){             printf("请输入%s同学的第%d门课的成绩", stRg[i].szName, j+1);             scanf("%f",&stRg[i].fScore[j]);             stRg[i].fScoreTotal +=stRg[i].fScore[j];         }     }     //m=k=1;     //for( fMax =stRg[0].fScoreTotal,fMin = stRg[0].fScoreTotal,fTotal = stRg[0].fScoreTotal, i = 1;i < n;i++){      fMax =stRg[0].fScoreTotal,fMin = stRg[0].fScoreTotal,fTotal = stRg[0].fScoreTotal;      m = k = 0;    //初始化应该为0,因为用的是stRg[0]      for( i = 1;i < n;i++){         if( fMax < stRg[i].fScoreTotal){             fMax = stRg[i].fScoreTotal;             k = i;         }          if( fMin > stRg[i].fScoreTotal){             fMin = stRg[i].fScoreTotal;             m = i;         }          fTotal += stRg[i].fScoreTotal;     }     fAvg = fTotal/n;     printf("软工班的最高分是：%s %.1f分\n", stRg[k].szName, fMax );     printf("软工班的最低分是：%s %.1f分\n", stRg[m].szName, fMin );     printf("软工班的平均分是：%.1f分\n", fAvg);     getchar();getchar();getchar();getchar();getchar(); } 供参考～ 注意k和m的初始化需要注意下。

user: user-2
content: 发代码格式多好，这样直接粘贴来的看的头痛。fmax和fmin写在循环外面吧，为啥要写在for()里呢。
user-0 提问: 关于树的程序，这个程序显示没有错误，怎么输入各个值跑出结果

回复:
user: user-1
content: 这个程序写的有问题，不过你要想运行查看结果的话，可以输入这样的字符串然后按回车 12####### 要有时间的话，可以帮你改改
user-0 提问: 请问这里我知道错误原因，因为输入工作时间的回车被读入了，但是为什么第二次的b在按下回车以后读入不进去，还是回复sorry呢,按照字符流不是应该读到b么

回复:
user: user-1
content: #include <stdio.h> #include <ctype.h> #define TIME 40 #define M 1.5          //翻1.5倍 #define MONEY_1 300 #define MONEY_2 450 #define TAX_1 0.15 #define TAX_2 0.20 #define TAX_3 0.25 #define B1 8.75 #define B2 9.33 #define B3 10.00 #define B4 11.20  char get_first(void); char get_option(void); void money(double B);  int main(void) {     char option;      printf("请选择您的工资等级:\n");     printf("a)$8.75/hr\tb)$9.33/hr\nc)$10.00/hr\td)$11.20/hr\nq)quit\n");     while((option=get_option())!='q')     {         switch(option)         {             case 'a':                 money(B1);                 break;             case 'b':                 money(B2);                 break;             case 'c':                 money(B3);                 break;             case 'd':                 money(B4);                 break;         }         getchar();    //for '\n'     } }  char get_first(void) {     char ch;      ch=getchar();     while(isblank(ch))     {         ch=getchar();                       //如果是空白就继续读取，遇到第一个非空白字符不进入循环     }     while(getchar()!='\n')     {         continue;     }      return ch; }  char get_option(void) {     char ch;      ch=get_first();      while((ch<'a'||ch>'d')&&ch!='q')     {         //printf("Srooy, I can not understand it, please respond with a, b, c, d, or q\n");         printf("Sorry, I can not understand it, please respond with a, b, c, d, or q\n");         ch=get_first();     }      return ch; }  void money(double B) {     float hour;     float income;     float r_income;     float tax;     float BASE;      BASE=B;     printf("请输入一周工作时间:");     scanf("%f",&hour);     // fflush(stdin);                          //这里要清除缓存，不然输入工作小时的回车会被放入缓存，在下次循环中，enter已经读取，由于只有一个字符，ch的值就是enter，因此,在get_option中，反复出现sorry     if(hour<=TIME)     {         income=hour*BASE;         if(income<=MONEY_1)         {             tax=income*TAX_1;         }         else if(income<=MONEY_2)         {             tax=MONEY_1*TAX_1+(income-MONEY_1)*TAX_2;         }         else         {             tax=MONEY_1*TAX_1+(MONEY_2-MONEY_1)*TAX_2+(income-MONEY_2)*TAX_3;         }     }     else     {         income=M*hour*BASE;         if(income<=MONEY_1)         {             tax=income*TAX_1;         }         else if(income<=MONEY_2)         {             tax=MONEY_1*TAX_1+(income-MONEY_1)*TAX_2;         }         else         {             tax=MONEY_1*TAX_1+(MONEY_2-MONEY_1)*TAX_2+(income-MONEY_2)*TAX_3;         }     }     r_income=income-tax;     printf("总工资为%f,税收为%f,净收入为%f\n",income,tax,r_income);     printf("\n");     printf("请选择您的工资等级:\n");     printf("a)$8.75/hr\tb)$9.33/hr\nc)$10.00/hr\td)$11.20/hr\nq)quit\n"); }  供参考～  加一句getchar();

user: user-0
content: 按照字符流，先输入了a Enter,然后因为get_first，回车也就没问题了，但是在输入工作时间的时候，如果不清除缓存，回车会被送入get_option的ch,所以输出sorry，但是后面输入的b，按照道理应该在排队，然后就应该到b了，就不该还是出现sorry了，为什么这里还是出现sorry呢？
user-0 提问: 求助大佬，用C语言写，十分感谢

回复:
user: user-1
content: 引用 1 楼 user-5 的回复:虽然我不是大佬，但是估计你心目中的大佬就是免费的劳力，不知道管理员看见这种贴子为什么不直接删除，看的我没心情来CSDN转了，没看新闻当个网络作家都要签卖身合约了，还不醒醒 无力吐槽！！！  所以我一般回帖最多讲思路，还是不懂给伪代码。 csdn上太多那种注册一个号，就上来要源码要方案甚至要项目工程的。鸟都不想鸟。感觉csdn还是应该管管了

user: user-0
content: 谢谢各位，我已经写完了

user: user-2
content: 楼上脾气是真的好！

user: user-3
content: int get_hash_code(char arr[],int n) {     int v_ret = 0;     while(*arr)     {      } }

user: user-4
content: 写了一点，剩下的自己完成。  struct node{    char name[16]; // 姓名    int hash_code; // hash值    int index; // 数组上的位置 用hash值对数组长度求余数    struct node* next; // 相同hash值的下一个节点 };

user: user-5
content: 虽然我不是大佬，但是估计你心目中的大佬就是免费的劳力，不知道管理员看见这种贴子为什么不直接删除，看的我没心情来CSDN转了，没看新闻当个网络作家都要签卖身合约了，还不醒醒 无力吐槽！！！
user-0 提问: 关于C语言中一个项目中有多个源文件怎么运行

回复:
user: user-1
content: 没有函数原型声明

user: user-2
content: 用extern声明将max函数的作用域扩展到main()中去，比如 extern int max(int a, int b);

user: user-3
content: 没有写头文件.h呀

user: user-4
content: 你要确保有 max.h 文件。 然后把max函数声明  放进这个头文件里。或者不用头文件， 在主函数上面加 extern int max(int a, int b);

user: user-5
content: 追加一个max.h文件，文件的内容为 int max(int, int);  或者把main.c的#include "max.h"去掉，改成 extern int main(int, int);

user: user-6
content: 有两种改法，  第一种，将#include"max.h"改成#include"max.c" 第二种，重新创建一个max.h的头文件，然后把max函数放到头文件中  你出现无法识别的原因是在于你没有max.h的头文件。只有max.c文件。
user-0 提问: 请教如何将TC2汉字库中不存在的汉字存储到汉字库里

回复:
user: user-1
content: TC2是DOS下的16位编译器，hzk16类似UCDOS、CCDOS 2.13汉字系统里的点阵字库，都是写死了的。可以参考UCDOS的自造字系统，是矢量字库，很棒。  这个文物级别的环境，太怀旧了，1997年TC2写过UCDOS的模拟显示+超大字体，早就忘记了，代码也没有留下来。如果是为了学习，还是换现代工具链吧。如果是为了兼容控制台，可以参考银行系统的Unix环境。现在的TC2估计不靠虚拟机都跑不起来吧

user: user-2
content: 过时了吧，两半半个汉字。

user: user-3
content: 引用 楼主 qq_45869858 的回复:请教如何将TC2汉字库中不存在的汉字存储到汉字库里 换个字库就解决了，要添加字库，了解一下字库的格式定义，和编码，以及点阵数据，添加进去就可以了。

user: user-0
content: 就是TC自带的hzk16

user: user-4
content: 那个库没有开发API和开发 文档吗？
user-0 提问: c语言请教大佬

回复:
user: user-1
content: 应该是while((*s1++=*s2++)!='\0'); 少了一个 '!'。 用于字符复制，s1,s2分别表示两个字符串的指针，*s1++ = *s2++ 表示将*s2的值复制到*s1中，然后将s2,s1各自向后移动一个字节单位，当*s2中的值不为 '\0'字符串结束符时，一直执行循环进行赋值运算。否侧循环结束，赋值结束。

user: user-2
content: 运行一下就知道了， 那里写错了， 应该是 ！=‘\0’

user: user-3
content: 字符串最后默认以\0结尾，它的意思就是复制到\0才结束
user-0 提问: 全部用动态内存来完成冒泡排序，求助大佬这是哪出了问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:数组才用动态内存分配， int *number=(int *)malloc(4);   int *change=(int *)malloc(4);   这个两个直接用 int number; int change就行了，简单的int变量没必要，把自己都搞晕了 当数组无法定长的时候，用动态内存分配。  int number, change; printf("请输入数字的个数  "); scanf("%d",&number); data=(int *)malloc(sizeof(int)*number); 这样不是很清晰吗我只是想多用下这方面知识，好巩固下

user: user-1
content: 数组才用动态内存分配， int *number=(int *)malloc(4);   int *change=(int *)malloc(4);   这个两个直接用 int number; int change就行了，简单的int变量没必要，把自己都搞晕了 当数组无法定长的时候，用动态内存分配。  int number, change; printf("请输入数字的个数  "); scanf("%d",&number); data=(int *)malloc(sizeof(int)*number); 这样不是很清晰吗
user-0 提问: vs编码问题+c和mysql连接乱码问题【网上方法基本全部试过】

回复:
user: user-0
content: 引用 6 楼 smwhotjay 的回复:[quote=引用 5 楼 胡二多 Hodor 的回复:] [quote=引用 3 楼 smwhotjay 的回复:] .. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8能不能把mysql转换成gbk的，这样就不要转码了额[/quote] 要么mysql统一gbk.万事大吉。vs不必转码。[/quote] 刚刚按您说的全都改成了gbk试了一试，发现汉字最后一个是乱码额，而且插入数据库如果插入的是汉字插不进去这怎么办呃呃

user: user-1
content: 引用 5 楼 胡二多 Hodor 的回复:[quote=引用 3 楼 smwhotjay 的回复:] .. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8能不能把mysql转换成gbk的，这样就不要转码了额[/quote] 要么mysql统一gbk.万事大吉。vs不必转码。

user: user-0
content: 引用 3 楼 smwhotjay 的回复:.. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8能不能把mysql转换成gbk的，这样就不要转码了额

user: user-0
content: 引用 3 楼 smwhotjay 的回复:.. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8好的好的，我大体明白了额，但是我在mysql给c的官网api上没看到相关的转码函数额，这个具体操作能简单说一下吗

user: user-1
content: .. mysql 统一utf8. vs开发，肯定是win系统了。那么，中文系统默认ansi/gb2312 .cmd打印字符串肯定是乱码。 mysql读取出来要转码一下即可。 再就是代码里写入数据库字符也要转码。因为vs默认gb2312. 数据库里是utf8

user: user-0
content: 引用 1 楼 user-2 的回复:不用搞这么复杂，你在把上传的字符串转为utf8就可以了， 下载之后转为gbk,你要改控制台的编码和你的vs文档是什么格式的一点关系没有，右键控制台属性，可以看到你的代码页设定是不是成功设为utf8了能具体举个例子吗，还是没太理解呃呃

user: user-2
content: 不用搞这么复杂，你在把上传的字符串转为utf8就可以了， 下载之后转为gbk,你要改控制台的编码和你的vs文档是什么格式的一点关系没有，右键控制台属性，可以看到你的代码页设定是不是成功设为utf8了
user-0 提问: 请问各位大佬，关于树的程序，这两个错误怎么改

回复:
user: user-1
content: 你的栈底指针和栈顶指针存放的是二叉树结点类型的指针不是char型的而是BiTree类型的

user: user-2
content: 你的树 T也没有定义。C语言中先定义后使用。

user: user-2
content: 你的栈 S没有定义，就是说你在使用S之前需要先定义它。
user-0 提问: 关于C语言读取文件时编码的问题

回复:
user: user-1
content: 引用 4 楼 smwhotjay 的回复: txt 有个两字节头的标记的是unicode. ansi/ utf8没有。 utf8的BOM 可选的，0xEF,0xBB,0xBF

user: user-2
content: txt 有个两字节头的标记的是unicode. ansi/ utf8没有。

user: user-3
content: char改成wchar_t

user: user-0
content: 我试过了，还是一样的

user: user-3
content: 楼主fread是二进制读取，你在开文件的时候将"r"改成"rb" 和"w"改成"wb"试试
user-0 提问: PAT 1075 PAT Judge最后一个测试点死活都不过去

回复:
user: user-0
content: 感谢提醒，这里确实没有注意到。但是更改了之后最后一个测试点还是未通过  else if ( record[id] == 2 ) {			//若该用户状态为提交过编译但均失败  			if ( score == -1 )					//如果这次提交也编译失败  			{ 				stu[id].score[no-1] = -2;		//则本次提交打上编译失败的标记  			} 			else {								//如果这次提交成功了(编译通过)  				for ( k=0; k<p_num; ++k )		//将之前所有被打上编译失败的题目均置为0分  					if ( stu[id].score[k] == -2 ) 						stu[id].score[k] == 0; 				table[++cnt] = id;				//在table表上记录该用户  				record[id] = 1;					//该用户状态置为需要显示的  				if ( full_score[no-1] == score )//若满分则满分数加一  					++stu[id].full; 				stu[id].total = score;			//总分置为此次提交的分数  				stu[id].score[no-1] = score;	//该题分数更新  			} 		}

user: user-1
content: 引用 3 楼 Xavier_97 的回复：感谢回答！但是我的代码中确实加入了这个判断， 如果重复提交满分的话，那么这次分数不会大于上次的分数，也就不会做stu.full自增的操作，所以我感觉不是这里出了问题。  if ( score > stu[id].score[no-1] )  //如果这次分数大于上次的分数              {                 if ( stu[id].score[no-1] == -1 )//若该题从未编译过，直接将分数改为0                      stu[id].score[no-1] = 0;                 stu[id].total += (score-stu[id].score[no-1]);//总分加等于这次提交分数减掉原来分数                  stu[id].score[no-1] = score;    //该题成绩更改                  if ( full_score[no-1] == score )//若满分则满分数加一                      ++stu[id].full;if（....==2）的分支里没有满分的判断，stu.full没有增加。

user: user-0
content: 感谢回答！但是我的代码中确实加入了这个判断， 如果重复提交满分的话，那么这次分数不会大于上次的分数，也就不会做stu.full自增的操作，所以我感觉不是这里出了问题。  if ( score > stu[id].score[no-1] )  //如果这次分数大于上次的分数              {                 if ( stu[id].score[no-1] == -1 )//若该题从未编译过，直接将分数改为0                      stu[id].score[no-1] = 0;                 stu[id].total += (score-stu[id].score[no-1]);//总分加等于这次提交分数减掉原来分数                  stu[id].score[no-1] = score;    //该题成绩更改                  if ( full_score[no-1] == score )//若满分则满分数加一                      ++stu[id].full;

user: user-1
content: 提示已经很清楚“最大化随机测试，重复提交满分题目”。 因为你代码以stu.full作为排序比较，由于满分则增加stu.full，看提示后半句去输入数据，则导致排序不正确。
user-0 提问: 求助！这段程序哪里错了！！写一个函数，用“起泡法”对输入的10个整数按从小到大顺序排列。

回复:
user: user-1
content: sort(a);  即可

user: user-2
content: sort(a[10]);这句有问题，函数调用，参数传递是值传递，a[10]是一个元素的值，不过10是下表，（根据数组a的长度是10，下表只能是[0, 9]，所以a[10]数组越界），数组名是数组的首地址，因此应该是传a而不是a[10]

user: user-3
content: 需要传的是指针，而你传了一个值进去

user: user-0
content: 谢谢大佬们！懂了

user: user-4
content: 调用的地方如LS所说，sort(a)即可 另外，sort函数最好加个参数指定数组的长度，当然本例中固定长度是10没问题，只是传数组的时候数组会退化为指针，在函数内你就取不到数组长度了，所以最好还是加个指定数组长度的参数

user: user-5
content: 调用的时候，传入  a  就行  sort(a);
user-0 提问: 表达式必须是指向完整对象类型的指针

回复:
user: user-1
content: 把 struct stdent *ps;     struct student s[3]={   //数组赋初值         {101,"张山",'男',18},         {102,"李四",'男',19},         {103,"孙俪",'女',17}     }; 改成 struct student s[3]={   //数组赋初值         {101,"张山",'男',18},         {102,"李四",'男',19},         {103,"孙俪",'女',17}     }; struct stdent *ps = s; //指针要初始化，让它指向一片内存地址才能使用

user: user-0
content: 你好，请问这是什么意思 1>C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(147,5): error MSB6006: “CL.exe”已退出，代码为 2。

user: user-2
content: 代码呢?

user: user-3
content: #include<stdio.h> #include<stdlib.h>  struct student{     int id;//学号     char name[20];//姓名     char sex[3];//性别     int age;//年龄 };  int main() {     int i;     //struct stdent *ps;     struct student s[3]={   //数组赋初值         {101,"张山","男",18},         {102,"李四","男",19},         {103,"孙俪","女",17}     };     for(i-0;i<3;i++)    //采用数组访问形式     printf("%d\t %s\t %s\t %d\n",s[i].id,s[i].name,s[i].sex,s[i].age);      system("pause");     return 0; }

user: user-1
content: 单词拼写错误 struct stdent *ps; 改成 struct student *ps;

user: user-0
content: C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\Platforms\Win32\Microsoft.Cpp.Win32.Targets(147,5): error MSB6006: “CL.exe”已退出，代码为 2。 只有这一个错误

user: user-0
content: 在下面赋值，和在定义时赋值都是出现这个问题 表达式必须是指向完整对象类型的指针

user: user-0
content: 不好意思，打错了

user: user-4
content: for(i-0;i<3;i++) ==>>这里是打错了吗 i=0
user-0 提问: VS2012在c语言代码里怎么使用音乐相对路径

回复:
user: user-1
content: 你使用的是相对路径

user: user-0
content: 引用 5 楼 陈仲甫 的回复:试试在虚拟机上模拟他的环境，看是否不同的外部环境引起的。好的谢谢！

user: user-1
content: 试试在虚拟机上模拟他的环境，看是否不同的外部环境引起的。

user: user-0
content: 引用 2 楼 user-2 的回复:你现在使用的就是相对路径，但要保证在程序文件夹内有这个怪兽.wav是的我在文件夹里放了的！我在自己的电脑上打开是可以正常播放的，但我把整个文件夹发送到别的电脑上，打开来却只有电脑系统提示音一直在循环

user: user-0
content: 引用 1 楼 陈仲甫 的回复:你使用的是相对路径这样的吗！可是好奇怪我把整个文件夹（包含音频文件）发到另一台电脑上，打开exe文件播放的一直是系统的提示音TAT

user: user-2
content: 你现在使用的就是相对路径，但要保证在程序文件夹内有这个怪兽.wav
user-0 提问: 求助   数据结构  单链表

回复:
user: user-0
content: 引用 5 楼 慕小北的回复:[quote=引用 2 楼 qybao的回复:]函数怎么调用的？L在哪赋值？IniLinkList(L)的代码没问题吗？ 另外提一下，如果想让r=L; 那么这句代码的前一条代码 r=(DogNode*)malloc(sizeof(DogNode))就是多余，还造成内存泄漏 其他都没题应该，我都测试过，我把代码放评论区了[/quote] 哦哦，我知道问题了，应该吧这个初始化删掉，因为前面初始化过了，谢谢哦！

user: user-0
content: 引用 2 楼 qybao的回复:函数怎么调用的？L在哪赋值？IniLinkList(L)的代码没问题吗？ 另外提一下，如果想让r=L; 那么这句代码的前一条代码 r=(DogNode*)malloc(sizeof(DogNode))就是多余，还造成内存泄漏 其他都没题应该，我都测试过，我把代码放评论区了

user: user-0
content: 引用 1 楼 自信男孩的回复:建议直接贴代码，然后提供更多的代码，包括调用的。  看函数开头，给r申请空间，然后马上r = L;这样会导致内存泄露，因为r刚才申请的空间没办法释放了，找不到地址了。 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef struct Dog { 	char name[10]; 	int id; }Dog;  typedef struct DogNode { 	Dog dog;  	struct DogNode *next;	 }DogNode,*DogLinkList; /* 注意: 1.结点指针和结点两个不同的概念  2.DogLinkList是结构体指针  DogLinkList p<=> DogNode *p; */  void IniLinkList(DogLinkList &L) /* 生成一个头结点   */  { 	L=(DogLinkList)malloc(sizeof(DogNode)); 	strcpy(L->dog.name,"这是头结点"); 	L->next=NULL; }  void CreateList_H(DogLinkList &L,int n)  //从前面插入结点 n个元素的值  { 	IniLinkList(L); 	DogNode *p; 	for(int i=0;i<n;i++) 	{ 		p=(DogNode*)malloc(sizeof(DogNode)); 		printf("输入狗的信息:");  		scanf("%s %d",p->dog.name,&(p->dog.id)); 		//头插入：让 p指向第一个结点后再让头结点指向 p 		//p变为第一个结点，原第一个结点变为第二个结点  		p->next=L->next; 		L->next=p; 	} }  void CreateList_R(DogLinkList &L,int n)  //后插法  //从后面插入n个结点 { 	DogNode *r; 	r=L; 	while(r->next!=NULL) 	{ 		r=r->next; 	} 	DogNode *p; 	for(int i=0;i<n;i++) 	{ 		p=(DogNode*)malloc(sizeof(DogNode)); 		printf("输入狗的信息:");  		scanf("%s %d",p->dog.name,&(p->dog.id)); 		p->next=NULL; 		r->next=p; 		r=p; 	} }  void GetElem(DogLinkList L,int i,Dog &dog) { //获取第i个结点的值放在dog里  	DogNode *p; 	p=L->next; 	int j=1; 	while(p&&j<i) 	{ 		p=p->next; 		++j; 	} 	if(!p||j>i) 		printf("error"); 	else 	{ 		dog.id=p->dog.id; 		strcpy(dog.name,p->dog.name); 	} }  DogNode *LocateElem(DogLinkList &L,Dog dog) { //定位dog  	DogNode *p; 	p=L->next; 	while(p&&(p->dog.id!=dog.id)&&(!strcmp(p->dog.name,dog.name))) 		p=p->next; 	return p; }  void ListInsert(DogLinkList &L,int i,Dog &dog) { //在第i个位置插入dog  	DogNode *p,*s; 	s=(DogNode*)malloc(sizeof(DogNode)); 	p=L; 	int j=0; 	while(p&&(j<i)) 	{ 		p=p->next; 		j++; 	} 	if(p!=NULL) 	{ 		s->dog.id=dog.id; 		strcpy(s->dog.name,dog.name); 		s->next=p->next; 		p->next=s; 	} }  //删除的结点要free（）  void DelElem(DogLinkList &L,int i) { 	DogNode *p,*q; 	p=L;int j=0; 	while((p->next)&&(j<i-1)) 	{ 		p=p->next;j++; 	} 	if(p->next!=NULL&&(j==i-1)) 	{ 		q=p->next;p->next=q->next; 		free(q); 	} }  void PrintList(DogLinkList &L) { 	DogNode *p;//p临时变量名，不用再 malloc  	p=L->next; 	while(p!=NULL) 	{ 		printf("%s %

user: user-1
content: IniLinkList(L)初步判断这个函数是初始化L，里面应该会有malloc语句，那么r=(DogNode*)malloc(sizeof(DogNode))这一句的确多余。

user: user-2
content: 函数怎么调用的？L在哪赋值？IniLinkList(L)的代码没问题吗？ 另外提一下，如果想让r=L; 那么这句代码的前一条代码 r=(DogNode*)malloc(sizeof(DogNode))就是多余，还造成内存泄漏

user: user-3
content: 建议直接贴代码，然后提供更多的代码，包括调用的。  看函数开头，给r申请空间，然后马上r = L;这样会导致内存泄露，因为r刚才申请的空间没办法释放了，找不到地址了。
user-0 提问: 数据结构C语言迷宫问题求助

回复:
user: user-0
content: 引用 3 楼 天翔龙闪的回复:这跟你算法有关，我也是输出这个结果，有的地方应该写错了，你再跟书上的核对一下，或者把书代码的清晰部分发过来，不然我一时半会也看不出来原因。我断点的时候，发现 			if (g == x2 && h == y2 && maze[g][h] == 0) 			{ 				printf("The revers path is:\n"); 				while (isEmptyStack_seq(st)) 				{ 					element = top_seq(st); 					pop_seq(st); 					printf("the node is:%d%d\n", element.x, element.y); 				} 				return; 			}这段代码没走过一次，所以你好好跟书上的确认上 大神 这里不能发图 我私信发给你了😁

user: user-1
content: 这跟你算法有关，我也是输出这个结果，有的地方应该写错了，你再跟书上的核对一下，或者把书代码的清晰部分发过来，不然我一时半会也看不出来原因。我断点的时候，发现 			if (g == x2 && h == y2 && maze[g][h] == 0) 			{ 				printf("The revers path is:\n"); 				while (isEmptyStack_seq(st)) 				{ 					element = top_seq(st); 					pop_seq(st); 					printf("the node is:%d%d\n", element.x, element.y); 				} 				return; 			}这段代码没走过一次，所以你好好跟书上的确认上

user: user-0
content: 引用 1 楼 天翔龙闪的回复:问题关键是在于你函数要求传的是一个二级指针，但是你传进去的是一个数组指针。 最简单的修改方法如下： 将 void mazePath(int(* maze)[11], int(* direction)[2], int x1, int y1, int x2, int y2, int M, int N)这个函数的形参改成数组指针  然后在main里面，传入的参数形式写成mazePath(maze, direction, x1, y1, x2, y2, M, N);这样参数的类型才能匹配。  当然，这样的适用性不好，每当你创建一个新的maze二维数组或者direction二维数组的时候，都需要手动去调对应mazePath函数里面的形参的写法。  但假如你不在意的话，这么改就行。  但如果不想改变mazePath函数的形参类型，也就是说你要传一个二级指针进来的话，那么对应的你在main函数里面，定义maze 和directin的时候，就要设定成二级指针的形式 如下int **maze;和int **direction  然后在调用函数的时候，还是写成 mazePath(maze, direction, x1, y1, x2, y2, M, N);  接下来是二级指针的赋值问题，一般来说都要去堆区赋值。 我现在写下在堆区赋值的方法，如下。 int** maze = (int**)malloc(m * sizeof(int*)); int i, j; for (i = 0; i < m; ++i) { 	maze[i] = (int*)malloc(n * sizeof(int*)); } for (i = 0; i < m; ++i) { 	for (j = 0; j < n; ++j) { 		maze[i][j] = 1;//你要改成你要的数 	} }  //在return 0之前再写这些 for (i = 0; i < m; ++i) { 	free(maze[i]);  	maze[i] = NULL;  } free(maze); array = NULL; 不过我建议此题还是不要搞这么麻烦。你如果想深入二级指针，建议用这种方式试试。 如果你学了c++，用vector<vector<int>>嵌套的方式更好。 大神 用第一种方法能成功运行了 为什么结果会是the path has not been found😭

user: user-1
content: 问题关键是在于你函数要求传的是一个二级指针，但是你传进去的是一个数组指针。 最简单的修改方法如下： 将 void mazePath(int(* maze)[11], int(* direction)[2], int x1, int y1, int x2, int y2, int M, int N)这个函数的形参改成数组指针  然后在main里面，传入的参数形式写成mazePath(maze, direction, x1, y1, x2, y2, M, N);这样参数的类型才能匹配。  当然，这样的适用性不好，每当你创建一个新的maze二维数组或者direction二维数组的时候，都需要手动去调对应mazePath函数里面的形参的写法。  但假如你不在意的话，这么改就行。  但如果不想改变mazePath函数的形参类型，也就是说你要传一个二级指针进来的话，那么对应的你在main函数里面，定义maze 和directin的时候，就要设定成二级指针的形式 如下int **maze;和int **direction  然后在调用函数的时候，还是写成 mazePath(maze, direction, x1, y1, x2, y2, M, N);  接下来是二级指针的赋值问题，一般来说都要去堆区赋值。 我现在写下在堆区赋值的方法，如下。 int** maze = (int**)malloc(m * sizeof(int*)); int i, j; for (i = 0; i < m; ++i) { 	maze[i] = (int*)malloc(n * sizeof(int*)); } for (i = 0; i < m; ++i) { 	for (j = 0; j < n; ++j) { 		maze[i][j] = 1;//你要改成你要的数 	} }  //在return 0之前再写这些 for (i = 0; i < m; ++i) { 	free(maze[i]);  	maze[i] = NULL;  } free(maze); array = NULL; 不过我建议此题还是不要搞这么麻烦。你如果想深入二级指针，建议用这种方式试试。 如果你学了c++，用vector<vector<int>>嵌套的方式更好。
user-0 提问: c语言基础知识

回复:
user: user-0
content: 引用 6 楼 ?Victor.??的回复:看看这个~   https://blog.csdn.net/lord12580/article/details/82109850 谢谢你😊哈哈哈

user: user-1
content: 看看这个~   https://blog.csdn.net/lord12580/article/details/82109850

user: user-0
content: 引用 4 楼 ?Victor.??的回复:空格会切断字符串 啥意思啊，不太明白

user: user-1
content: 空格会切断字符串

user: user-0
content: 找到原因了，输入的时候把逗号，换成空格就好使了，但是不知道为什么会这样

user: user-0
content: 引用 1 楼 自信男孩的回复:输入的时候逗号后加一个空格试试～ 还是不行啊

user: user-2
content: 输入的时候逗号后加一个空格试试～
user-0 提问: 求大佬

回复:
user: user-1
content: 看着很正常呀，有什么问题吗？

user: user-0
content: #include<stdio.h> int main() {    int i,n,s=0;    scanf("%d",&n);    for(i=1;i<=100;i++)    {      if(i%n!=0)      s++;      printf("不能被n整除的数%d\n",i);     }      printf("总共有%d不能被n整除",s); }就是不知道哪里有问题

user: user-0
content: 改了，可是后面结论正确前面又不能了

user: user-0
content: 引用 3 楼 自信男孩的回复:[quote=引用 2 楼 zzl9617 的回复:] [quote=引用 1 楼 user-3的回复:]要求很准确了，试一试自己写写嘛 第2个不会。。。[/quote] 第二个加一个统计变量就好了 [/quote] 帅哥我会我就不会来这里操作了

user: user-2
content: 引用 2 楼 zzl9617 的回复:[quote=引用 1 楼 user-3的回复:]要求很准确了，试一试自己写写嘛 第2个不会。。。[/quote] 第二个加一个统计变量就好了

user: user-0
content: 引用 1 楼 user-3的回复:要求很准确了，试一试自己写写嘛 第2个不会。。。

user: user-3
content: 要求很准确了，试一试自己写写嘛
user-0 提问: 哪位大神能帮忙改改，跪求，我只是个菜鸟

回复:
user: user-1
content: #include<stdio.h> int main() { int a[20], i, num, j, n = 0; for (i = 0;; i++) { scanf_s("%d", &a[i]); if (a[i] =='\n') { num = i - 1; break; } } for (i = 0; i < num - 1; i++) for (j = i + 1; j < num - i; j++) { if (a[i] != a[j]) n++; } printf("%d\n", n); return 0; }  帮你先用代码块贴一下，方便大家看。输入\n的ASCII码就好了。13

user: user-2
content: 你输入10就结束了

user: user-0
content: 是的  主要是输入这地方 我的死循环了 我想按回车结束

user: user-3
content: 是有什么问题吗？
user-0 提问: scanf("%d:%d",&a,&b); 怎么让%d和%d之间有冒号

回复:
user: user-1
content: 同时按下shift和;

user: user-2
content: 楼上的办法应该可以实现你的需求

user: user-3
content: 引用 3 楼 lyhlw007 的回复:如果是%s,有办法在后面输入冒号么       printf("please enter client inf:\n");     for (i = 0; i < m; i++)     {         int ch;         char *p = client[i].name;         while((ch = getchar()) != ':'){             *p = ch;             p++;         }         scanf("%d", &client[i].num);         printf("%s, %d\n", client[i].name, client[i].num);     }  可以这样

user: user-0
content: 如果是%s,有办法在后面输入冒号么

user: user-3
content: %d和%d之间可以 用 ： %s不行
user-0 提问: C语言数组 sizeof用法在传递到函数内部时获取数组长度

回复:
user: user-0
content: 引用 2 楼 chxchxkkk 的回复:数组作为函数参数传进去的是地址，只有4个字节，只能把数组长度当作一个参数传进去 void reverse(int*input, int n)  确实只有这样，谢谢。

user: user-0
content: 引用 5 楼 棉猴 的回复: 所以sizeof(a)实际上是一个地址类型的大小，即4个字节 sizeof(&input)，是input指向的内容的大小，即17*4=68个字节  我想搞定的是传入内部的，最后还是只有从定义的位置传，还是用的2楼的办法。

user: user-1
content: 所以sizeof(a)实际上是一个地址类型的大小，即4个字节 sizeof(&input)，是input指向的内容的大小，即17*4=68个字节

user: user-2
content: 数组传入函数，得到的是指针

user: user-3
content: reverse里的input是指针，而main函数里的a是数组。

user: user-4
content: 数组作为函数参数传进去的是地址，只有4个字节，只能把数组长度当作一个参数传进去 void reverse(int*input, int n)

user: user-5
content: 将元素数目做为参数传入 函数内部，它只知道入参是个指针，不知道是个数组
user-0 提问: 大佬帮忙看看

回复:
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; }  int main() {     float sum=0.0;     int count = 0;     for(int i=100;i<=200;i++){         if(isPrime(i)){             sum += i;             count++;         }     }     printf("100~200之间素数平均值为：%.2f",sum/count);     return 0; }  供参考
user-0 提问: 利用8位数码管实现可以移动的动态显示数字的电路及软件设计。

回复:
user: user-0
content: 但是请尽量不要太难，呃，我可能看不懂

user: user-0
content: 或者有其他思路解决这个问题之类的，请告知
user-0 提问: while里面语句能用if if if吗

回复:
user: user-1
content: 当然可以，为什么不用if else 呢？

user: user-2
content: 每个if都写对了就不会出错 贴代码吧

user: user-3
content: 你可以用一万个

user: user-4
content: 一个if不够你玩的？
user-0 提问: 返回值类型与函数值类型不匹配怎么改

回复:
user: user-1
content: 修改下函数定义呀 如果未找到节点就别返回-1了，返回NULL

user: user-2
content: int InsElem(LinkList* L, ElemType x, int i)  ====》》》返回值是int类型 { int j = 0; LinkList* p = L, * s; if (i <= 0) return 0; while (p != NULL && j < i - 1)	//查找第i-1个节点*p { j++; p = p->next; } if (p == NULL) return -1;	//未找到节点返回-1 else { s = (LinkList*)malloc(sizeof(LinkList));//创建新节点 s->data = x;	//存放元素x s->next = p->next; p->next = s; return L;        ====》返回的是链表指针  与 int不匹配 }

user: user-3
content: 要么改定义，要么改返回啊。。。看你自己需要什么，你要是需要ｉｎｔ判断，那就改返回呗，你要是要返回指针去赋值使用，那就改定义，改成指针类型。错误返回ＮＵＬＬ