Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 数据结构中形参& int a什么意思？大神们帮忙指教一下。

回复:
user: user-0
content: 明白了，谢谢各位~

user: user-1
content: &在这里表示引用，int& n就是一个引用变量。 先举几个栗子：“及时雨”宋江、“卧龙”诸葛亮、“齐天大圣”孙悟空、“怡红公子”贾宝玉。 上面几个例子都是引用，不是叫一个新人物“及时雨”、“卧龙”等等，而是给这些任务取了一个别名，本质上他们是一个人。  引用的概念，引用是为已存在的变量取了一个别名，它是某个已存在变量的另一个名字。一旦把引用初始化为某个变量，就可以使用该引用名称或变量名称来指向变量。引用和引用的变量共用同一块内存空间，  格式：类型& 引用变量名(对象名) = 引用实体；   int& ra = a;  ra为a的引用  特点： 引用实体和引用类型必须为同种类型 引用在定义时必须初始化 一个实体可以有多个引用，但一个引用只能引用一个实体  用引用变量就像用引用实体一样，如果你往函数里传一个引用，这个引用变量引用的实体就可能改变数值。如下面的代码：  #include <iostream> using namespace std; void fun1(int n) {     n = n + 1; } void fun2(int& n) {     n = n + 1; } int main(void) {     int a = 5;     cout << a << endl;     fun1(a);     cout << a << endl;     fun2(a);     cout << a << endl;     return 0; }  输出为  5 5 6  在fun1里，传参时把a的值复制给了n，这里的n就只是fun1内的一个局部变量，修改它只是修改n，跟a没有关系。 在fun2里，传的是a的引用，那么这个n就代表main里面的a，修改n会直接改变a。  所以在你说的这个函数中不仅修改了A，还一并修改了n，所以这个函数不需要返回值

user: user-2
content: 如果你的函数里要修改原来的n的话，确实要用&引用

user: user-2
content: 原因，直接传值的话那个a和b变成了swap的局部变量，与main无关了 而传引用的话就直接对你之前int的a和b进行操作。 用指针也可以，但引用更方便，只用加个&就行了

user: user-2
content: int n是传值 int &n是引用传递 最典型的例子  void swap(int a, int b) { int tmp=a; a=b; b=tmp; } int main() { int a=1, b=2; swap(a,b); cout << a << " " << b << endl; return 0; }  是没有用的，输出还是1和2.  void swap(int a, int b) { int tmp=a; a=b; b=tmp; } int main() { int a=1, b=2; swap(a,b); cout << a << " " << b << endl; return 0; }  输出变成2和1.
user-0 提问: 哪位大佬分析一下这题的算法

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

回复:
user: user-0
content: 引用 1 楼 qybao 的回复:c里也一样 不过正如你所说，数组指针和指向一维数组的指针意思是不一样的，只是它们都指向自己同一个地址而已。a+i和&a[i]是数组指针，a[i]&a[i][0]   引用 2 楼 user-2 的回复:从迂腐的角度来说，从来没有所谓行地址的说法(至少 C 语言没有)。所谓的行地址实质是指向数组的指针罢了，例如有 int a[3][5]; 则 a + 1 或者 &a[1] 指向 a 这个数组里的第二个元素，元素类型为 int[5]，即 a + 1 的类型为 int(*)[5]。当然，也从来没有规定说 a[i] 的值和 &a[i] 的值相等，这是因为 a[i] 的类型为 int[5] (转换后为 int*)，但 &a[i] 的类型为 int(*)[5]，两个类型不兼容，自然不能保证它们的值相同(可惜的是，主流平台上所有指针的内部表示都完全一样，差异仅仅存在于文法层面)。   引用 3 楼 qybao 的回复:按错键了，还没输完 继续补充，a[i]和&a[i][0]是指向1维数组的指针。 其实就是 *(a+i)==a[i] 好的，谢谢

user: user-1
content: 按错键了，还没输完 继续补充，a[i]和&a[i][0]是指向1维数组的指针。 其实就是 *(a+i)==a[i]

user: user-2
content: 从迂腐的角度来说，从来没有所谓行地址的说法(至少 C 语言没有)。所谓的行地址实质是指向数组的指针罢了，例如有 int a[3][5]; 则 a + 1 或者 &a[1] 指向 a 这个数组里的第二个元素，元素类型为 int[5]，即 a + 1 的类型为 int(*)[5]。当然，也从来没有规定说 a[i] 的值和 &a[i] 的值相等，这是因为 a[i] 的类型为 int[5] (转换后为 int*)，但 &a[i] 的类型为 int(*)[5]，两个类型不兼容，自然不能保证它们的值相同(可惜的是，主流平台上所有指针的内部表示都完全一样，差异仅仅存在于文法层面)。

user: user-1
content: c里也一样 不过正如你所说，数组指针和指向一维数组的指针意思是不一样的，只是它们都指向自己同一个地址而已。a+i和&a[i]是数组指针，a[i]&a[i][0]
user-0 提问: C语言编程问题

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

user: user-0
content: scanf没问题，不是C4996错误，会不会是使用了次方的代码？（像这样a=a*(10（一个倒三角）n）指a等于a乘以10的n次方

user: user-2
content: C4996错误？

user: user-2
content: 会不会是scanf没有设置？

user: user-3
content: 贴出代码看看

user: user-4
content: 就是代码有问题呀
user-0 提问: setbuf/setvbuf有啥用

回复:
user: user-1
content: 这个buffer的大小和你的硬盘有关系， 对于固态硬盘估计没多大用途， 机械硬盘作用大些 buffer也不宜设置太大，和硬盘的扇区大小结合起来保持一致就好了，以前老的硬盘扇区512字节， 以它为基数翻倍， 现在一般的硬盘也都有4k了，buffer和它保持一致是最合理的 数据在硬盘上以扇区为单位存储文件，一个文件至少占据一个扇区，哪怕它实际长度只有1个字节。  硬盘有自己的cache但是这个和我们说的这个buffer关系不大， 硬盘的catch是给所用应用提供共享服务的， 而setbuf这个只是给特定的这个文件读写使用的。 · 有了buffer之后， 写文件的时候就更要注意， 调用了write或者fpritf之类的函数后，数据并不会马上写入磁盘，还在buffer里面呢， 要等到buffer快慢了，或者调用fflush， fclose等操作的时候才会把数据真正的写入磁盘的。

user: user-2
content: 很少用的到，因为在stdio标准库本身就设置了BUFSIZ的值

user: user-3
content: 效果就是你说的那样，一般情况下也确实没什么好控制的。作用可参考 #1 所描述的。例子可参见： setbuf: https://zh.cppreference.com/w/c/io/setbuf setvbuf: https://zh.cppreference.com/w/c/io/setvbuf

user: user-1
content: 可以自己做测试的列子  就是一个一个的从磁盘文件getchar（）或者scanf 比如1024次，  还是弄一个1024长度*sizeof（int）或则其他什么类型的buffer，一次读取一个buffer 然后从里面用字符串下标的方式，一个个的取字符 ；或者sscanf的方式从字符串当中提取数据

user: user-1
content: 加快访问速度的 比如， 保存一堆整数在磁盘文件当中， 逐个读出， 如果每个都是启动磁盘io来读取， 那么必然是花费时间很长 而buffer的作用，是一次从磁盘读取一段数据， 在用户读取的内容没有超过buffer的范围的时候，不必再启动磁盘io去处理 写入也是类似的，先写到这个缓冲区内，然后把缓冲区内的内容一次性写入磁盘   磁盘读写消耗的时间很长， 启动硬盘， 根据文件系统寻找数据位置，磁头寻道， 读取/写入磁盘扇区， 这个很耗时间的
user-0 提问: 指针问题：为什么 *px 和px  输出数值不一样

回复:
user: user-1
content: 一封信，封信上的地址（Px）,和信里面的内容（.*px）当然不一样。

user: user-2
content: 一个是指针，一个是指针指向的内容， 他们不是一个东西啊，结果自然就不同了 char * px；  px是一个指针，  *px才是指针指向的内容  好比px就是你家门牌号， *px你家屋里住的人一样，  两类不同的情况

user: user-3
content: px是地址，是x的内存地址 *px是地址的信息，是x的内存信息，就是6
user-0 提问: 新装的dev c++总是出现如下情况

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

user: user-2
content: 我不知道了，呵呵

user: user-0
content: 引用 16 楼 cool99781的回复:你应该是安装在c：\program files（x86）里面,有一个Dev-Cpp的文件夹吧？ 打开解压，把原来的MinGW32和MinGW64替换了就行 满意结贴给分 我把原来的两个删了，再把你给的两个放进dev-cpp目录下，还是没用。。。

user: user-2
content: 你应该是安装在c：\program files（x86）里面,有一个Dev-Cpp的文件夹吧？ 打开解压，把原来的MinGW32和MinGW64替换了就行 满意结贴给分

user: user-3
content: 百度搜索腾讯软件中心，在里面搜devc++

user: user-0
content: 引用 13 楼 cool99781的回复:把这个链接下载 https://download.csdn.net/download/cool99781/12182330 放在dev-cpp的安装文件夹里 然后把下载的压缩包放在dev app内解压吗？

user: user-2
content: 把这个链接下载 https://download.csdn.net/download/cool99781/12182330 放在dev-cpp的安装文件夹里

user: user-4
content: 不是说你一直点next点错了 而是，你下载的dev 软件的安装包是否错了， 网上的安装包很多， 但是不是所有的安装包都是完好的

user: user-0
content: 引用 10 楼 寻开心的回复:腾讯电脑关键 - 软件管理 - Dev C++。48M大小的， 这个用了好久了没问题 也是怀疑是软件没有正确的安装 没有用，devc的安装一直next吧，没什么特别注意的。但就是不知道问题出在哪。。。

user: user-4
content: 腾讯电脑关键 - 软件管理 - Dev C++。48M大小的， 这个用了好久了没问题 也是怀疑是软件没有正确的安装

user: user-0
content: 引用 5 楼 與蘤舊縐的回复:[quote=引用 4 楼 临安清风伴佳人的回复:][quote=引用 3 楼 與蘤舊縐的回复:]你的程序里没有include？那两软件应该没问题，把你程序好好看看 #include <stdio.h> int main () { 	int a=1; 	printf("%d",a); 	return 0;  } 随便写了个最简单的程序，还是有问题，实在是找不到问题所在了。[/quote] 那就不晓得怎么回事了，这个报错明显是找不到某个文件夹 ，只能这样了，要么换个编译器吧，vs？[/quote] 好的吧，还是非常感谢你的帮助。

user: user-0
content: 引用 7 楼 cool99781的回复:等一会给你文件，免费的 在的，麻烦了

user: user-2
content: 等一会给你文件，免费的

user: user-2
content: 在吗，可能是mingw有问题

user: user-5
content: 引用 4 楼 临安清风伴佳人的回复:[quote=引用 3 楼 與蘤舊縐的回复:]你的程序里没有include？那两软件应该没问题，把你程序好好看看 #include <stdio.h> int main () { 	int a=1; 	printf("%d",a); 	return 0;  } 随便写了个最简单的程序，还是有问题，实在是找不到问题所在了。[/quote] 那就不晓得怎么回事了，这个报错明显是找不到某个文件夹 ，只能这样了，要么换个编译器吧，vs？

user: user-0
content: 引用 3 楼 與蘤舊縐的回复:你的程序里没有include？那两软件应该没问题，把你程序好好看看 #include <stdio.h> int main () { 	int a=1; 	printf("%d",a); 	return 0;  } 随便写了个最简单的程序，还是有问题，实在是找不到问题所在了。

user: user-5
content: 你的程序里没有include？那两软件应该没问题，把你程序好好看看

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:缺东西，重装吧，腾讯管家或者360软件库里的那个没问题 没有用啊，哭了，一样的问题。

user: user-5
content: 缺东西，重装吧，腾讯管家或者360软件库里的那个没问题
user-0 提问: 队列的插入和删除影响其他元素吗 

回复:
user: user-1
content: 可能空间不够，或空间过多，所以要移动数据

user: user-2
content: 记得回答过这个问题啊 顺序存储情况下  用int 数组来举例，从尾巴入，从头出， 不断的操作下，就会发现还存在队列当中的数据在不断的靠近数组的尾巴 数组从0开始的到队列现存的第一个有效数据之间都是浪费的空间了 继续这样操作下去，跑到数组最后一个元素， 队列无法再添加数据了，再添加就要溢出了  为解决这个问题，可以考虑的一种实现方式就是每从队列头提走一个数据，就把剩下的内容向前移动一格， 这样就可以最大效率的利用起来数组的空间。 这种实现方式下， 出队列的操作就会影响原来的数据的位置  如果你把数组当作循环数组，到了尾巴还可以自动的回绕的话， 不移动队列数据的方式也可以实现。

user: user-3
content: 引用 3 楼 user-3 的回复:在顺序存储中 但是原题中有这句，这就和实现有关了 通常来说：假设一个队列有n个元素，则顺序存储的队列需要建立一个大于n的数组，并把队列的所有元素存储在数组的前n个单元，数组下标为0的一端即为队头。 这样就存在移动的问题了

user: user-3
content: 在顺序存储中 但是原题中有这句，这就和实现有关了

user: user-3
content: 从逻辑上不需要移动，否则会效率极其低下。如果空间满了也有可能需要
user-0 提问: C语言自学。小白求教

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

user: user-2
content: eof是文件结束符号，windows系统下的Ctrl+Z也是可以的  按照定义，eof实际就是-1，  ascii对应的是255， alt+小键盘输入数组255，看看是不是吧， 没windows环境测试不了

user: user-3
content: eof 是指读到了文件结尾，但你这里是从标准输入读取的，不存在文件结尾这一概念，必须手动发送这个"信号"

user: user-3
content: win 的控制台下应该是按 control+z 输入 eof，printf应该写到循环外面

user: user-4
content: 引用 2 楼 m0_46379381 的回复:EOF 是文件结束符（end of file)我都是按书上敲的 刚学。就是不懂为甚么循环才可以输出 有可能是你一直没有碰上EOF，循环一直没出去

user: user-0
content: EOF 是文件结束符（end of file)我都是按书上敲的 刚学。就是不懂为甚么循环才可以输出

user: user-4
content: 不知道EOF是干什么用的，是不是和\0功能差不多？ 你这个不是字符数组，用EOF应该是没用 主要问题是\n的统计，因为你一按回车就输出了 #include<stdio.h> int main() { 	int c,i,nwhile,nother; 	int ndigit[10]; 	for(i = 0;i <= 9;i++) 		ndigit[i] = 0; 	while((c=getchar())!='\n') 	{ 		if(c >= '0'&&c <= '9') 			++ndigit[c-'0']; 		else if(c == ' '||c == '\t') 			++nwhile; 		else 			++nother; 	} 	printf("digits="); 	for(i = 0;i <= 9;i++) 		printf("%d",ndigit[i]); 	printf("while=%d,other=%d",nwhile,nother); 	return 0; } 这个版本统计不了\n #include<stdio.h> void StringCount( char s[] ) { 	int i=0; 	int letter=0,blank=0,digit=0,other=0; 	while(s[i]) 	{ 		if(s[i]>64 && s[i]<91 || s[i]>96 && s[i]<123) 			letter++; 		else if(s[i] == ' ' || s[i] == '\n')          			blank++; 		else if(s[i]>47 && s[i]<58) 			digit++; 		else 			other++; 		i++; 	} 	printf("letter = %d, blank = %d, digit = %d, other = %d",letter,blank,digit,other); }  int main() { 	char s[100]; 	gets(s); 	StringCount(s); 	return 0; }  这个应该可以

user: user-5
content: EOF是End Of  File 的简称，表示文件结束，Windows命令行按Ctrl+Z，Unix工作站按Ctrl+D
user-0 提问: vc6 番茄助手怎么用啊？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html
user-0 提问: 各位大佬看看这道题，为何我结果总是为1

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

user: user-0
content: 引用 2 楼 ?Victor.??的回复:就是for(i=0;c[i]!='\0';i++);去掉分号呀 谢谢

user: user-0
content: 引用 2 楼 ?Victor.??的回复:就是for(i=0;c[i]!='\0';i++);去掉分号呀 我去试试。。。

user: user-2
content: 就是for(i=0;c[i]!='\0';i++);去掉分号呀

user: user-3
content: 我按你的原稿试了一遍，源程序是没有错的，但我和你的编译器可能或许不同，版本不同的编译器会造成不同的结果，你如果有条件的话可以试试下载另一个编译器。
user-0 提问: 帮忙看看这道题，为啥我运行结果总是为1。求各位大佬指点。

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

user: user-2
content: for(i=0;c[i]!='\0';i++)；这里分号去掉
user-0 提问: 二叉树的锯齿形层次遍历——报错求帮找问题

回复:
user: user-0
content: 引用 1 楼 寻开心 的回复:给temp[++move]赋值的时候，不考虑子节点是否为NULL是不行的 NULL进入了temp数组， 回头取出，在做temp[I]->val的时候，就错了呗  temp[++move] = temp[i]->left;  //保存当前节点的左右分支节点； temp[++move] = temp[i]->right;   应该是： if ( temp[I]->left ) temp[++move] = temp[I]->left; if (temp[u]->right] temp[++mvoe] = temp[I]->right; 这样才对感谢感谢，好不容易把逻辑理清了，忘了这茬儿。

user: user-1
content: 给temp[++move]赋值的时候，不考虑子节点是否为NULL是不行的 NULL进入了temp数组， 回头取出，在做temp[I]->val的时候，就错了呗  temp[++move] = temp[i]->left;  //保存当前节点的左右分支节点； temp[++move] = temp[i]->right;   应该是： if ( temp[I]->left ) temp[++move] = temp[I]->left; if (temp[u]->right] temp[++mvoe] = temp[I]->right; 这样才对
user-0 提问: 求助关于C语言char*转换为wchar_t*的问题

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

user: user-0
content: 引用 5 楼 smwhotjay 的回复:跨平台用iconv 吧。 我反正没跨过。一直用win32api 或mfc  A2W 简单的一批 iconv不是局限于linux吗？

user: user-2
content: 跨平台用iconv 吧。 我反正没跨过。一直用win32api 或mfc  A2W 简单的一批

user: user-3
content: MultiByteToWideChar

user: user-4
content: 个人感觉 C 语言自带的转换函数很鸡肋，如果要做转换的话可以调用 iconv 库，或者自己写转换代码。 附注：printf 和 wprintf 不可以一起调用，这是未定义行为。

user: user-3
content: c++11提供了宽字节库，建议研究一下。

user: user-0
content: 引用 1 楼 真相重于对错 的回复:MultiByteToWideChar 我想开发跨平台的软件
user-0 提问: C

回复:
user: user-0
content: 引用 1 楼 自信男孩的回复:楼主的例子中,a[1]和*(*a+ 1)类型是一样的. a+1首先是一个二维数组的偏移1 * sizeof(a);长度. 而a[1]是指第二行的首地址.还是在a之内.(a是2*3的数组); a+1已经超出a的表示范围了. a[0]可以改写成*(a+0)，两者等价啊 在一维数组中，a[0]和*(a+0)类型一样啊 怎么到了二维，等价的写法类型却不同了 还没弄清楚

user: user-1
content: 楼主的例子中,a[1]和*(*a+ 1)类型是一样的. a+1首先是一个二维数组的偏移1 * sizeof(a);长度. 而a[1]是指第二行的首地址.还是在a之内.(a是2*3的数组); a+1已经超出a的表示范围了.

user: user-0
content: 引用 4 楼 寻开心的回复:[quote=引用 楼主 m0_46300909 的回复:] 二维数组a[2][3] a[1]的类型是int* *(a+1)指向一个数组，类型int*[3]. a[1]相当于*(a+1) a[1]和*(a+1)是一回事，为啥类型不同 弄不明白 C小白  a+1是 int (*) [3] 不是 int * [3] 前者是数组的指针， 后者是指针的数组 a[1] 和 a+1 这两个指针的值是一样的，但是类型是不同的，  printf执行%p格式输出就知道他们的值是一样的 但是a[1]和a+1类型不一样，  a[1]  和 *(a+1)的类型是一样的  a[1][0] 和 (*(a+1))[0] 是一样的  做个例子 a [2][3] = {1,2,3, 4,5,6}; a[1][0]和（*（a+1））【0】都会是4的 [/quote] 知道错哪里了，谢谢～～

user: user-2
content: 引用 楼主 m0_46300909 的回复:二维数组a[2][3] a[1]的类型是int* *(a+1)指向一个数组，类型int*[3]. a[1]相当于*(a+1) a[1]和*(a+1)是一回事，为啥类型不同 弄不明白 C小白  a+1是 int (*) [3] 不是 int * [3] 前者是数组的指针， 后者是指针的数组 a[1] 和 a+1 这两个指针的值是一样的，但是类型是不同的，  printf执行%p格式输出就知道他们的值是一样的 但是a[1]和a+1类型不一样，  a[1]  和 *(a+1)的类型是一样的  a[1][0] 和 (*(a+1))[0] 是一样的  做个例子 a [2][3] = {1,2,3, 4,5,6}; a[1][0]和（*（a+1））【0】都会是4的

user: user-3
content: 引用 2 楼 m0_46300909 的回复:[quote=引用 1 楼 自信男孩的回复:]楼主的例子中,a[1]和*(*a+ 1)类型是一样的. a+1首先是一个二维数组的偏移1 * sizeof(a);长度. 而a[1]是指第二行的首地址.还是在a之内.(a是2*3的数组); a+1已经超出a的表示范围了. a[0]可以改写成*(a+0)，两者等价啊 在一维数组中，a[0]和*(a+0)类型一样啊 怎么到了二维，等价的写法类型却不同了 还没弄清楚[/quote]  二维数组中，a[0] 是第0行的首地址，而不是第0行第0列的首地址。 一维数组中，*(a+0)得到是数组第一个元素的值 二维数组中，*(a+0)得到的是第0行的首地址。*(*a+1)才能得到第0行第一个元素的值。
user-0 提问: 求大佬指点，数据结构与算法

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

user: user-2
content: new_node = malloc(xxx); new_node->data = x; new_node->next = p->next; p->next = new_node;

user: user-3
content: 引用 1 楼 自信男孩 的回复: new_node = malloc(xxx); new_node->data = x; new_node->next = p->next; p->next = new_node;  new_node = (xxxx *) malloc(xxxx);
user-0 提问: c 语言用c++头文件

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

user: user-2
content: c与c++混合编程没有任何问题 在实际开放中，经常需要把之前的c代码放到c++的工程中来

user: user-0
content: 引用 1 楼 user-3的回复:你的标题是错的，不过从你的意思推测，你应该是想在 c++ 里用 c 的函数，这是完全可以的。比赛的话可以选择 #include <bits/stdc++.h>，被称为万能头文件(这个头文件提前包括了你可能用到的所有头文件)。但无论使用什么头文件，using namespace std; 一定要加。 哈哈，因为我没有接触过c ++方面的东西，谢谢你了

user: user-3
content: 你的标题是错的，不过从你的意思推测，你应该是想在 c++ 里用 c 的函数，这是完全可以的。比赛的话可以选择 #include <bits/stdc++.h>，被称为万能头文件(这个头文件提前包括了你可能用到的所有头文件)。但无论使用什么头文件，using namespace std; 一定要加。
user-0 提问: 这个怎么可能会错呢

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

user: user-0
content: 引用 4 楼 apkipa1的回复:论英文+和中文＋的区别。 我去  谢谢

user: user-2
content: 论英文+和中文＋的区别。

user: user-3
content: 代码是没有问题，我也用过这个，但是手机上一旦出了问题，不像电脑上那么多设置，基本上搞不定的

user: user-0
content: 引用 1 楼 ?Victor.??的回复:换个编译器吧，电脑上就很难搞，更不用说手机了 电脑刚关，别人问我这东西，就在手机上弄了个这，感觉代码没问题🌝

user: user-3
content: 换个编译器吧，电脑上就很难搞，更不用说手机了
user-0 提问: 学完java基础了，想学习一下c，怎么学比较好呢

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

user: user-2
content: 看书——练习——理解 三角循环
user-0 提问: 哪位大佬知道这个题怎么做？

回复:
user: user-0
content: 引用 3 楼 寻开心的回复:还有， 别人给你回答了问题，如果满意记得去结账 总揭帖率0%的，下次就不会有人给你回答问题了 哦好的，谢谢！我还不知道这回事

user: user-1
content: 还有， 别人给你回答了问题，如果满意记得去结账 总揭帖率0%的，下次就不会有人给你回答问题了

user: user-1
content: 这个和if else的语句结构是类似的 通过在c/cpp文件里面，这段#include <这个头文件>之前，写还是不写#define  GLOBLE_VAR 这句来控制数组对于此c/cpp来说是外部的还是本地全局的。

user: user-1
content: #ifdef GLOBLE_VAR                         // 如果有#define GLOBLE_VAR这样的语句在这行之前存在     #define G_VAR_PREFIX             //         那么 G_VAR_PREFIX这个宏定义就是空白   #else                                              // 否则    #define G_VAR_PREFIX extern //           G_VAR_PREFIX 这个宏定义就等同于 extern   #endif                                            //  结束  G_VAR_PREFIX uint_8 g_recvBuff[20];  #define GLOBLE_VAR #ifdef GLOBLE_VAR                             #define G_VAR_PREFIX               #else                                                  #define G_VAR_PREFIX extern    #endif                                              代码如果这样， 注意蓝色第一条语句， 那么 G_VAR_PREFIX uint_8 g_recvBuff[20];  就等等加于 extern  uint_8 g_recvBuff[20]; // 表示这是一个外部变量，别的地方有定义的  如果代码是  // #define GLOBLE_VAR // 注意此处注释掉 #ifdef GLOBLE_VAR                             #define G_VAR_PREFIX               #else                                                  #define G_VAR_PREFIX extern    #endif                                              那么 G_VAR_PREFIX uint_8 g_recvBuff[20];  就等等加于 uint_8 g_recvBuff[20];  // 表示这是一个变量，就是在这里定义的
user-0 提问: 关于二级指针的疑惑求解

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

user: user-2
content: 瞎子点灯白费蜡  你不看我前面给你的答复，都是对你的上一个问题的答复 实在不明白， 你自己写一行代码 int I=2； printf（“%c %c”,  *(a+1)[I],  *((*(a+1)+i));  自己看看输出了什么  上一个问题你在问，有办法取到字母吗， 给你的那两个就是取字母

user: user-0
content: 引用 7 楼 寻开心 的回复:*(a+1)[I]  *((*(a+1)+i)  这两个结果分别是什么请问？是一个意思吗？ char *a[2]={"hello","good"}  *a[1] 是指的 good吧（ 指针数组，每个元素都是指针，a[1]指的good地址，加上* 就是good吧？】 那么*(a+1)[I] 是什么呢？ a+1是干什么？

user: user-2
content: 知道了指针的类型，对应的加*加偏移或者用下标就可以啦

user: user-2
content: *(a+1)[I]  *((*(a+1)+i)

user: user-0
content: 引用 3 楼 寻开心 的回复:归根到你，你还是没有明白指针和数组的区别  仔细看看书，关于数组的部分吧，那里都会有介绍  语言类的书看法和别的书不一样， 你要把书上的事例代码抛开， 把剩余的文字， 逐个细读慢慢品味 代码是拿来解释那些文字， 核心都是在那些文字描述上 看那些文字就如同做数学应用题， 不去扣字眼儿， 很容掉入各种坑  那第二个有办法取到字母吗，看样在加上*只能取到单词吧？

user: user-0
content: 引用 1 楼 user-4 的回复:char * a时指向字符串首地址的指针，a[i]取到的时第i个位置的一个字母（i从0开始） char *a[2]是包含两个元素的指针数组，a[0]指向第一个字符串首地址，a[1]指向第二个字符串首地址，  那第二个有办法取到字母吗，看样在加上*只能取到单词吧？

user: user-3
content: 第一个a不就是第二个a的子集吗? 第一个a取字母a[0], a[1]等等 第二个a去字母a[0][0], a[0][1]

user: user-2
content: 归根到你，你还是没有明白指针和数组的区别  仔细看看书，关于数组的部分吧，那里都会有介绍  语言类的书看法和别的书不一样， 你要把书上的事例代码抛开， 把剩余的文字， 逐个细读慢慢品味 代码是拿来解释那些文字， 核心都是在那些文字描述上 看那些文字就如同做数学应用题， 不去扣字眼儿， 很容掉入各种坑

user: user-2
content: 上面的图，把int换成char就一摸一样了，没有区别 char *a = “hello”；  系统在只读内存分配了一块地址长度为6， 内容是hello5个字符，外加字符串结尾的0的字符，一共6个字符       而后把这个指针的地址给与了a。  你可以当作数组的方式一个一个的访问这些字符，也可以做为字符串整体使用它       但是你不能改变这个字符串的任何内容， 试图改写它就会程序错误甚至崩溃了 实际“hello”是const char *的类型， const 关键词表示内容不可更改  char * a[2] = {"abc", "123"}; a是一个数组， 数组元素类型是 char*， 你不能把a简单的理解成为char ** 就如同不能简单的把数组理解为和指针一样； 数组名可以当指针来用，但是不等价于就是指针 数组在定义的时候，就明确了数据的大小， 数组名只是数据的首地址，这个地址是指针；但是整个数据区才是数组。 回到这个char * a[2]的定义，  a[0], a[1]都是char*类型， 分别指向初始化时候设定的那两个字符串；  char ** 正确的定义是这样的 char * a = “abc”； char ** pa = &a; pa 是a的地址， 也就是一个char*类型变量的地址， 这个才是char**的准确定义， 这里和int**是完全一样的  前面的char * a[2] = {....} a实际上是一个 char（*）[2]，是一个指向数组的指针，并不是指向char*的指针，这才是准确的说法 这种定义下可以把a当作char**来使用的， 但是并不是真正的char**类型  就如同自然数是整数，但是整数不都是自然数一样

user: user-4
content: char * a时指向字符串首地址的指针，a[i]取到的时第i个位置的一个字母（i从0开始） char *a[2]是包含两个元素的指针数组，a[0]指向第一个字符串首地址，a[1]指向第二个字符串首地址，
user-0 提问: 帮忙看看

回复:
user: user-1
content: sum=sum+sign*(1.0/n); 这样试试. 需要保证1/n是浮点数除法,否则1/n是整型数除法.

user: user-2
content: 1/n是两个整数相除， 整数相除的结果也是整数， 小数点后面的全部舍弃 1.0/n就是浮点数和整数除法，会转化成两个浮点数相除，这才是你所需要的

user: user-2
content: 1/n都是0 1.0/n才能获得浮点数的结果
user-0 提问: 问答

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

user: user-0
content: 为什么会出现图一的结果，现在再去打其他的代码，都会出现图一的结果

user: user-2
content: printf("%s\n",x);这一句，x定义的是int, 应该用%d.printf("%d\n",x);
user-0 提问: 麻烦大佬们看下

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

user: user-2
content: .h多了一个空格呢

user: user-3
content: 字符串字面量不能换行，但可以这么写：  printf(     "*****\n"     "  *****\n"     "    *****\n"     "      *****\n" );

user: user-4
content: 头文件的问题外： 第二张图你可以这样写的 printf("\         ******\n\            *******\n\              *******\n" );  此时每行最好的那个\作为一行放不下分行写的标记符号

user: user-0
content: 引用 2 楼 chxchxkkk的回复:printf()不支持二图这样的 谢谢大佬们谢谢谢谢

user: user-5
content: printf()不支持二图这样的

user: user-6
content: stdio.h和stdio.  h不一样呀
user-0 提问: 字符串数组怎么判断与某个字符串相等

回复:
user: user-1
content: strcmp(q,"wang)==0

user: user-2
content: if (!strcmp(q, "wang")) {

user: user-3
content: strcmp/strncmp或memcmp都可以判断字符串是否相等 建议查一下这些函数的用法和注意事项.
user-0 提问: C语言大一小白求助！！！

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复:贴全代码吧,代码不全呢现在还在修改，有点眉目，改不出来我再发，多谢回复

user: user-0
content: 引用 1 楼 自信男孩 的回复:贴全代码吧,代码不全呢抱歉啊

user: user-1
content: 贴全代码吧,代码不全呢
user-0 提问: 求详细解答获取字符除去\n的方法

回复:
user: user-1
content: 1=flag肯定是编译不过去的.因为1是常量不能被修改.  getchar()一次只能获取一个字符.while循环中当遇到'\n'时就退出了.不会把'\n'赋值给z

user: user-2
content: 1=flag……莫非他是个变量

user: user-3
content: 1 = flag是什么操作

user: user-0
content: 哪个是==    不是=
user-0 提问: C

回复:
user: user-1
content: a是数组的指针 比如 int a[2][3]，a是int (*)[3]类型指针，指向长度为3的整形数组的指针。所以a+1，地址会移动数组长度*sizeof(int)个字节 lz可以自己打印测试看看 int a[2][3]; printf(“%p, %p”, a, a+1); 看看两个地址相差多少个字节就知道了。

user: user-0
content: 一个新手，C初学者  ～～～

user: user-2
content: a是数组,不能完全等同于指针.不过,可以拿数组当指针使用(注意数组名不能做左值),当然,指针也可以当数组使用,再某些情况下是可以相互转换的.
user-0 提问: 新人求教学啊

回复:
user: user-0
content: 引用 6 楼 與蘤舊縐的回复:[quote=引用 5 楼 童话与云的回复:][quote=引用 3 楼 focuslight的回复:]转义字符： 所有的ASCII码都可以用“\”加数字（一般是8进制数字）来表示。  ＇\10＇ 八进制字符常量 010， 等于十进制8， 就是 backspace 键（回退一格键）。 例如： printf("ABCD\10Z"); 输出 ABCZ （由于回退一格，D没了，Z占了D的位子）。 不是要\ddd，三位数才可以嘛？ 哦！因为8不是八进制的数码，所以那个\10计算机就认为它少了个0，补全了就是\010！！！  那这么多ASCII码新手要去记嘛？[/quote] 常用的记住，要用的时候查一下就够了[/quote] 好的！感谢大佬，新人是在太难了

user: user-1
content: 引用 5 楼 童话与云的回复:[quote=引用 3 楼 focuslight的回复:]转义字符： 所有的ASCII码都可以用“\”加数字（一般是8进制数字）来表示。  ＇\10＇ 八进制字符常量 010， 等于十进制8， 就是 backspace 键（回退一格键）。 例如： printf("ABCD\10Z"); 输出 ABCZ （由于回退一格，D没了，Z占了D的位子）。 不是要\ddd，三位数才可以嘛？ 哦！因为8不是八进制的数码，所以那个\10计算机就认为它少了个0，补全了就是\010！！！  那这么多ASCII码新手要去记嘛？[/quote] 常用的记住，要用的时候查一下就够了

user: user-0
content: 引用 3 楼 focuslight的回复:转义字符： 所有的ASCII码都可以用“\”加数字（一般是8进制数字）来表示。  ＇\10＇ 八进制字符常量 010， 等于十进制8， 就是 backspace 键（回退一格键）。 例如： printf("ABCD\10Z"); 输出 ABCZ （由于回退一格，D没了，Z占了D的位子）。 不是要\ddd，三位数才可以嘛？ 哦！因为8不是八进制的数码，所以那个\10计算机就认为它少了个0，补全了就是\010！！！  那这么多ASCII码新手要去记嘛？

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:\10转义了，只能输出8 \10转义了变成十进制吧8？ 不是的话那10去哪了？ 这个8是原来的还是转义的？ 啊啊啊啊

user: user-2
content: 转义字符： 所有的ASCII码都可以用“\”加数字（一般是8进制数字）来表示。  ＇\10＇ 八进制字符常量 010， 等于十进制8， 就是 backspace 键（回退一格键）。 例如： printf("ABCD\10Z"); 输出 ABCZ （由于回退一格，D没了，Z占了D的位子）。

user: user-3
content: 详细解释挺麻烦的 百度搜索 c语言转义字符

user: user-1
content: \10转义了，只能输出8
user-0 提问: 求助，C语言素数

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

user: user-0
content: 引用 7 楼 清风徐来的回复:[quote=引用 3 楼 _FjR的回复:][quote=引用 1 楼 清风徐来的回复:]for (j=2; j<i; j++)，这个循环遍历完时，此时j==i， 即i是一个素数，素数个数count+1 至于j>=i,这里应该是j==i,因为不会出现j>i这种情况。 是对第一个if筛选出来的数进行假设吗？假设j==i？[/quote] if (j>=i)  这句代码应该是 if(j==i),  另外考虑效率的话，可以参考二楼的说法， 假设一个数为X,判断它是否为素数，只需在[2，根号X]，没必要在[2，X]判断。[/quote] 好的好的，明白了，谢谢

user: user-0
content: 引用 5 楼 user-3的回复:[quote=引用 4 楼 _FjR 的回复:] 可是我怎么知道具体是到多少了，比如判断200是否是一个素数，我也要推算到中间那个因子才可以判断他有多少个因子，如果是一个不确定的数我怎么推得出中间那个因子嘞？ 判断200只需找[2,sqrt(200)]之间的数，sqrt(200)约等于14，只需要在[2,14]之间找有没有数能够整除200，如果有，说明不是素数 为什么可以这样呢，那个简单的点的来说，12的因子有1*12,2*6,3*4，这些因子都是成对存在的，且分居于sqrt(12)（约等于3）两侧，所以查找素数的时候，只需找一侧就可以了，这样能很大程度提升效率[/quote] 哦哦好的，明白了，谢谢

user: user-2
content: 引用 3 楼 _FjR的回复:[quote=引用 1 楼 清风徐来的回复:]for (j=2; j<i; j++)，这个循环遍历完时，此时j==i， 即i是一个素数，素数个数count+1 至于j>=i,这里应该是j==i,因为不会出现j>i这种情况。 是对第一个if筛选出来的数进行假设吗？假设j==i？[/quote] if (j>=i)  这句代码应该是 if(j==i),  另外考虑效率的话，可以参考二楼的说法， 假设一个数为X,判断它是否为素数，只需在[2，根号X]，没必要在[2，X]判断。

user: user-0
content: 引用 3 楼 _FjR的回复:[quote=引用 1 楼 清风徐来的回复:]for (j=2; j<i; j++)，这个循环遍历完时，此时j==i， 即i是一个素数，素数个数count+1 至于j>=i,这里应该是j==i,因为不会出现j>i这种情况。 是对第一个if筛选出来的数进行假设吗？假设j==i？[/quote] 但是我们要找素数的话不应该是第一个if那里条件为i％j!＝0的吗？

user: user-3
content: 引用 4 楼 _FjR 的回复:可是我怎么知道具体是到多少了，比如判断200是否是一个素数，我也要推算到中间那个因子才可以判断他有多少个因子，如果是一个不确定的数我怎么推得出中间那个因子嘞？ 判断200只需找[2,sqrt(200)]之间的数，sqrt(200)约等于14，只需要在[2,14]之间找有没有数能够整除200，如果有，说明不是素数 为什么可以这样呢，那个简单的点的来说，12的因子有1*12,2*6,3*4，这些因子都是成对存在的，且分居于sqrt(12)（约等于3）两侧，所以查找素数的时候，只需找一侧就可以了，这样能很大程度提升效率

user: user-0
content: 引用 2 楼 user-3的回复:判断素数其实完全没必要这么弄， 比如你判断100，是不是素数，对100开方等于10 只需要找[0,10]之前有没有数能够整除100，而不需要直接从0-100  #include <stdio.h> int main() { 	int i, j; 	int count = 0; 	for (i = 101; i <= 200; i++) 	{ 		for (j = 2; j < i; j++) {	//如果[2,i)之间一直没有数j能够整除i，那么j能够增长到与i相同，说明这个数是素数 			if (i % j == 0) break; 		} 		if (j >= i) { 			count++; 			printf("%d ", i); 			if (count % 5 == 0) 				printf("\n"); 		} 	} 	return 0; }  可是我怎么知道具体是到多少了，比如判断200是否是一个素数，我也要推算到中间那个因子才可以判断他有多少个因子，如果是一个不确定的数我怎么推得出中间那个因子嘞？

user: user-0
content: 引用 1 楼 清风徐来的回复:for (j=2; j<i; j++)，这个循环遍历完时，此时j==i， 即i是一个素数，素数个数count+1 至于j>=i,这里应该是j==i,因为不会出现j>i这种情况。 是对第一个if筛选出来的数进行假设吗？假设j==i？

user: user-3
content: 判断素数其实完全没必要这么弄， 比如你判断100，是不是素数，对100开方等于10 只需要找[0,10]之前有没有数能够整除100，而不需要直接从0-100  #include <stdio.h> int main() { 	int i, j; 	int count = 0; 	for (i = 101; i <= 200; i++) 	{ 		for (j = 2; j < i; j++) {	//如果[2,i)之间一直没有数j能够整除i，那么j能够增长到与i相同，说明这个数是素数 			if (i % j == 0) break; 		} 		if (j >= i) { 			count++; 			printf("%d ", i); 			if (count % 5 == 0) 				printf("\n"); 		} 	} 	return 0; }

user: user-2
content: for (j=2; j<i; j++)，这个循环遍历完时，此时j==i， 即i是一个素数，素数个数count+1 至于j>=i,这里应该是j==i,因为不会出现j>i这种情况。
user-0 提问: return 0和void的关系

回复:
user: user-1
content: return是函数返回的数值。void是修饰函数返回值（或函数参数个数），void是表示函数无返回值， 就是return后面不跟任何变量或数值(如果要用return).

user: user-2
content: 返回值为void的函数也是可以return的 只是return后不要加任何东西 主要是用来指定在某一位置退出函数的，如果你的函数需要全部执行完才退出，就不用加return了
user-0 提问: C语言二维数组的打印问题

回复:
user: user-0
content: 引用 1 楼 自信男孩的回复:图二也不是自己换行的,而是这一行在显示器上显示不聊了,所以换行了.  你看看电脑上一行显示不完不都是在下面继续显示吗? 对哦，这也太刚好了。。。是我多想了，感谢感谢

user: user-1
content: 图二也不是自己换行的,而是这一行在显示器上显示不聊了,所以换行了.  你看看电脑上一行显示不完不都是在下面继续显示吗?
user-0 提问: 巩固

回复:
user: user-1
content: 引用 2 楼 lwy01251028 的回复:题目：班级学生数据库创建及维护 语言和环境 实现语言：SQL语言。 环境要求：SQL Server 2008及以上版本。 提交要求： 学生需先以自己的班级编号和姓名创建文件夹（如班级编号为1301，姓名为张三，则文件夹名为1301_张三），将以自己姓名拼音命名的数据库文件和以自己姓名拼音命名的SQL文件保存在该文件夹中，提交结果必须有数据库文件(.mdf)、日志文件（.ldf）、和SQL文件（.sql）,最后压缩后按监考老师要求提交。 标识为“手工实现”的，只需在 SQL Server Management Studio 中使用鼠标操作的方式实现，最后提交分离数据库后的.mdf文件和.ldf文件即可 标示为“语句实现”的，需要使用 SQL 语句实现功能，保存并提交.sql文件，一个文件中可以包含多个语句，使用注释说明题号即可。 功能需求 创建数据库，以自己的姓名拼音命名。例如：张三同学命名数据库为“ZhangSan” 在以自己的姓名拼音命名的数据库中创建两个表（手工实现）： 你之前的都没结帖子，不结帖子别人不咋想写的，更何况这个代码多的你自己还没写，帮你改可以，但是你自己不写直接要全的也不会有几个人会写的

user: user-0
content: 题目：班级学生数据库创建及维护 语言和环境 实现语言：SQL语言。 环境要求：SQL Server 2008及以上版本。 提交要求： 学生需先以自己的班级编号和姓名创建文件夹（如班级编号为1301，姓名为张三，则文件夹名为1301_张三），将以自己姓名拼音命名的数据库文件和以自己姓名拼音命名的SQL文件保存在该文件夹中，提交结果必须有数据库文件(.mdf)、日志文件（.ldf）、和SQL文件（.sql）,最后压缩后按监考老师要求提交。 标识为“手工实现”的，只需在 SQL Server Management Studio 中使用鼠标操作的方式实现，最后提交分离数据库后的.mdf文件和.ldf文件即可。 标示为“语句实现”的，需要使用 SQL 语句实现功能，保存并提交.sql文件，一个文件中可以包含多个语句，使用注释说明题号即可。 功能需求 创建数据库，以自己的姓名拼音命名。例如：张三同学命名数据库为“ZhangSan” 在以自己的姓名拼音命名的数据库中创建两个表（手工实现）： 表1名：txb（同学表） 字段名 类型 说明 约束  StuID char(6) 学号 主键  Name nchar(8) 姓名 唯一  Gender nchar(2) 性别 非空  Age int 年龄 非空  Nation nchar(10) 民族 默认“汉族”  DorID char(3) 宿舍号 外键  表2名：ssb（寝室表） 字段名 类型 说明 约束  DorID char(3) 宿舍号 主键  Tel char(10) 宿舍电话   向ssb表插入下面3条记录   --（语句实现） 宿舍号    宿舍电话 101      6331157 102      6331777 202      6331779 向txb插入下面5条记录    --（语句实现）  学号    姓名    性别  年龄  民族    宿舍号 001101  高小方  男    19    汉族    101 001102  刘红花  女    18    土家族  102 001103  王红旗  男    19    汉族    101 001301  刘莲花  女    18    汉族    202 001302  杨红霞  女    17    土家族  202 使用SQL语句完成以下功能（语句实现） 将ssb表中宿舍号为101的宿舍电话改为6331158（5分） 将txb表中的年龄都增加1岁（5分） 显示txb表平均年龄（5分） 显示学号为“001103”的学生信息（5分） 显示姓刘学生的全部信息（10分） 显示姓名中第2个字是“红”学生的姓名，年龄（10分） 显示姓名，年龄信息，并对年龄进行降序排列（10分） 统计男女生人数【分组查询】（10分） 查询显示：高小方及他所在的宿舍号、宿舍电话【联接查询】（10分） 查询显示：宿舍号、各宿舍人数，人数升序排列【联接、分组查询】（10分）

user: user-2
content: 这个不难吧.  cnt计算个数.  if (num % 3 == 0 && num % 7 == 0) {     cnt++;     printf("%d ", num);     if (cnt % 5 == 0)         printf("\n"); }
user-0 提问: 关于一个printf的问题

回复:
user: user-1
content: sleep函数返回值：若进程暂停到参数seconds所指定的时间则返回0，若有信号中断则返回剩余秒数。 所以a=0, secs-a=6-0=6;

user: user-2
content: 建议看一下sleep的返回值. 返回值应该是是实际休眠的时间

user: user-3
content: 从你的描述来看，secs是6秒，程序休眠6秒，返回值a也是6秒，所以secs-a就是6-6=0，如果只打印a，那当然就是6了
user-0 提问: compile error问题

回复:
user: user-0
content: 引用 2 楼 寻开心的回复:比较函数里面是     if ( c->x == d->x )           return c->y > d->y;      else          return c->x>d->x;  这样吧。  c当中类型前面的 struct关键词不能省略， 除非你用typedef 处理过 刚刚结贴了，不好意思。

user: user-1
content: 比较函数里面是     if ( c->x == d->x )           return c->y > d->y;      else          return c->x>d->x;  这样吧。  c当中类型前面的 struct关键词不能省略， 除非你用typedef 处理过

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  struct coordinate{     int x,y; }coor[100];  int comp( const void *a , const void *b ) {     //struct coordinate *c = (coordinate *)a;     //struct coordinate *d = (coordinate *)b;     struct coordinate *c = (struct coordinate *)a;     struct coordinate *d = (struct coordinate *)b;     if(c->x != d->x)     {         return c->x - d->x;     }     else     {         return c->y - d->y;     } }  int main(void) {     int type,amount;     while(scanf("%d%d",&type,&amount) != EOF)     {         for(int i = 0;i < amount;i++)         {             scanf("%d%d", &coor[i].x,&coor[i].y);         }         qsort(coor, amount, sizeof(coor[0]),comp);         printf("helloworld!\n");         switch(type)         {             case 1:                 for(int i = 0;i < amount;i++)                 {                     printf("%d %d\n",coor[i].x,coor[i].y);                 }                 break;             case 2:                 for(int i = 0;i < amount;i++)                 {                     printf("<%d,%d>\n",coor[i].x,coor[i].y);                 }                 break;         }     }     return 0; } 供参考~
user-0 提问: 麻烦大佬看一下

回复:
user: user-1
content: #include <stdio.h>  void test() {     char c, a;     scanf("%c", &c);     if(c !='.'){         test();         printf("%c", c);     }     //return c; }  int main() {     test();     //printf("%c",test());     return 0; } 供参考~

user: user-2
content: 仅供参考  #include <stdio.h>  char test() {     char c, a;     scanf("%c", &c);     if(c !='.'){         a=test();         if(a!='.')         printf("%c", a);     }     return c; }  int main() {     printf("%c",test());     return 0; }

user: user-3
content: 返回值 函数(){ 字符=接收 如果(……){返回} 否则{函数()} 打印 }
user-0 提问: 小白求助！关于字符串输入的问题

回复:
user: user-1
content: 建议对于字符串中间有空格使用fgets或者getchar()判断换行符;  fflush对于stdin在有些编译器或系统下是未定义行为,即不一定一定有效.

user: user-2
content: scanf会把回车放到缓冲区， fflush（stdin）是清除键盘。  pta测试的时候，是用管道从文件当中输入，也许因为系统的原因导致差异 你可以试试把fflush（stdin）改成fflush(NULL),  也就是清理所有的缓冲， 包括文件的和键盘的

user: user-0
content: 引用 2 楼 昕er的回复:#include<stdio.h> struct book 	{ 		char name[31]; 		double price; 	}; int main() { 	  	struct book b[10]; 	int x,y,i,z=0,a=0,n; 	scanf("%d",&n); 	scanf("\n");//getchar();//用于处理缓冲区中的回车。 	for (i = 0; i<n; i++) 	{ 		//scanf("\n");//当不用getchar时，换行符就要加上，若是连用，则多一个回车，此时，无输出。 		    gets(b[i].name); 		    scanf("%lf", &b[i].price); 		    getchar(); 		if (b[i].price>b[z].price)z = i;	    				        	    	 	   	if (b[i].price<b[a].price)a = i; 	 			 	} 	printf("%.2f, %s\n", b[z].price, b[z].name); 	printf("%.2f, %s\n", b[a].price, b[a].name); 	return 0; } 关键在于缓冲区的问题 是的，我用fflush()的时候也能正常输入，编译也没问题，输出也看不出来异常（人眼），但是放到pta上会保错，换成scanf("\n")就好了，这两个对缓冲区（输入价格后缓冲区只有\n了吧）的操作有什么不一样么

user: user-3
content: #include<stdio.h> struct book 	{ 		char name[31]; 		double price; 	}; int main() { 	  	struct book b[10]; 	int x,y,i,z=0,a=0,n; 	scanf("%d",&n); 	scanf("\n");//getchar();//用于处理缓冲区中的回车。 	for (i = 0; i<n; i++) 	{ 		//scanf("\n");//当不用getchar时，换行符就要加上，若是连用，则多一个回车，此时，无输出。 		    gets(b[i].name); 		    scanf("%lf", &b[i].price); 		    getchar(); 		if (b[i].price>b[z].price)z = i;	    				        	    	 	   	if (b[i].price<b[a].price)a = i; 	 			 	} 	printf("%.2f, %s\n", b[z].price, b[z].name); 	printf("%.2f, %s\n", b[a].price, b[a].name); 	return 0; } 关键在于缓冲区的问题

user: user-2
content: scanf 的时候%s遇到空格、tab和回车都返回了，而 [^\n] 是只有遇到回车才返回 差异就在对空格和tab上
user-0 提问: printf语句与if语句问题

回复:
user: user-0
content: 好的，暂时没有问题了。

user: user-1
content: intJ+1就是控制输出的，与case没关系 case里面就是计数器的作用，每次到达这个分数段，就加1

user: user-0
content: 题目：某年级共有3个班级，每班有N名学生，开设两门课程，要求分别对每个班级的成绩进行分等统计，并将统计结果保存在一个二维数组中。

user: user-0
content: 引用 1 楼 ?Victor.?? 的回复:就是intJ这个数加上1 if(a++=b)是错误的 你是不是想问a++==b 不成立也加1 #include<stdio.h> #define M 3 #define N 5 main() { 	float intA,intB; 	int intAve,intI,intJ; 	static int intArrResult[M][5]; 	for(intJ=0;intJ<M;intJ++) 	{ 		for(intI=1;intI<=N;intI++) 		{ 			printf("Clss %d achievement%d(intA,intB):",intJ+1,intI); 			scanf("%f,%f",&intA,&intB); 			intAve=(intA+intB)/2; 			switch(intAve/10) 			{ 			case 10: 			case 9:intArrResult[intJ][0]++;break; 			case 8:intArrResult[intJ][1]++;break; 			case 7:intArrResult[intJ][2]++;break; 			case 6:intArrResult[intJ][3]++;break; 			default:intArrResult[intJ][4]++; 			} 		} 	} 	for(intJ=0;intJ<M;intJ++) 	{ 		for(intI=0;intI<5;intI++) 			printf("%5d",intArrResult[intJ][intI]); 		printf("\n"); 	} 	return 0; }

user: user-1
content: 引用 5 楼 weixin_45718499 的回复:[quote=引用 3 楼 ?Victor.??的回复:][quote=引用 2 楼 自信男孩 的回复:] intJ + 1应该是第几行的输出. 对，我刚才解释无脑了[/quote] 那它与case后面的++有什么关系呢？[/quote] 贴一下源码，我看看这个代码是干什么的

user: user-0
content: 引用 3 楼 ?Victor.??的回复:[quote=引用 2 楼 自信男孩 的回复:] intJ + 1应该是第几行的输出. 对，我刚才解释无脑了[/quote] 那它与case后面的++有什么关系呢？

user: user-0
content: 引用 3 楼 ?Victor.??的回复:[quote=引用 2 楼 自信男孩 的回复:] intJ + 1应该是第几行的输出. 对，我刚才解释无脑了[/quote] 还好你回复了，不然我要看个半天了

user: user-1
content: 引用 2 楼 自信男孩 的回复:intJ + 1应该是第几行的输出. 对，我刚才解释无脑了

user: user-2
content: intJ + 1应该是第几行的输出.

user: user-1
content: 就是intJ这个数加上1 if(a++=b)是错误的 你是不是想问a++==b 不成立也加1
user-0 提问: argv[1]是什么格式

回复:
user: user-1
content: argv[1]是字符串格式即char *

user: user-1
content: 那是因为楼主是以只读的形式打开文件,然后往文件里写肯定是不行,需要"w"或"a"的形式打开文件才可以写文件.或者以"r+"形式打开文件也是可以的.

user: user-2
content: 文件名要带后缀名，windows只是隐藏了后缀名 所以应该这样启动程序 test test.txt
user-0 提问: 穷孩子难得阔绰一会进来看看呗

回复:
user: user-1
content: 引用 4 楼 一条河可以 的回复:请问我的代码62———66为什么改成strcpy会出错呢？ strcpy是针对字符串的,对int不可以.

user: user-2
content: 排了序后的a和c之间的对应关系也跟着改变了， c[0]未必是原来的a[0],  要一直的话，交换数据就两者一起交换

user: user-2
content: a[i] = abs(a[i]); 你这个是改了原来的数值吧 让你按照绝对值排序，但是不是让你把数改成它的绝对值输出啊，输出还要输出原数

user: user-0
content: 请问我的代码62———66为什么改成strcpy会出错呢？

user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  int k; int comp_sheng(const void*a,const void*b) {     return *(int*)a - *(int*)b; }  int comp_jiang(const void*a,const void*b) {     return *(int*)b - *(int*)a; }  int comp_abs_jiang(const void *a, const void *b) {     return (abs(*(int *)b) - abs(*(int *)a)); }  int print(int *a,int b) {     for(int i = 0;i < b;i++)     {         printf("%d ",a[i]);     }     printf("\n"); }  int print_1(int *a,int *c,int b) {     for(int i = 0;i < b;i++)     {         for(int ii = 0;ii < b;ii++)         {             if((c[ii] == a[i])||(-c[ii] == a[i]))             {                 printf("%d ",c[ii]);             }         }     }     printf("\n"); }  int main(void) {         int n,a[1000];//,c[1000];      while(scanf("%d",&k) != EOF&&k != 0)     {         scanf("%d",&n);         if (n > 1000)             n = 1000;         //a = (int *)malloc(sizeof(int) * n);         //c = (int *)malloc(sizeof(int) * n);         for(int i = 0; i < n; i++)         {             scanf("%d",&a[i]);         }         switch(k)         {             /*             case 0:    //冗余代码                 break;             */             case 1:                 qsort(a,n,sizeof(int),comp_sheng);                 //print(a,n);                 break;                 //continue;             case 2:                 qsort(a,n,sizeof(int),comp_jiang);                 //print(a,n);                 break;                 //continue;             case 3:                 //int c[n];                 /*                 for(int i = 0;i < n;i++)                 {                     c[i] = a[i];                     a[i] = abs(a[i]);                 }                 */                 //strcpy(c,a);                 qsort(a,n,sizeof(int),comp_abs_jiang);                 //print_1(a,c,n);                 //continue;                 break;         }         print(a,n);     }     return 0; }  供参考~

user: user-3
content: k==3绝对值降序排序再写个方法不就好了吗？ int comp_jiang_juedui(const void* a, const void *b) {     return abs(*(int*)b) - abs(*(int*)a); //直接用绝对值比较就好了 }  case 3的时候，像调用其他排序方法一样，直接调用comp_jiang_juedui就好了。
user-0 提问: C语言求助 argc问题

回复:
user: user-1
content: 补充说明一下 启动程序的命令行输入 ./rotate 1 2 3 4 这里的程序名就是 ./rotate 程序名后面才是参数

user: user-2
content: argc表示从终端需要输入的参数个数,需要注意的是第一个参数就是可执行程序,比如编译生成a.out,那么a.out就是argv[0]即第一个参数.所以,如果要输入4个参数数据,需要加上a.out,即5个参数(一个是可执行程序本身).

user: user-1
content: if(argc==5)参数包括程序名在内，所以个数是5 而且，第一个参数从下标1开始，因为下标0是程序名
user-0 提问: 改错

回复:
user: user-0
content: 引用 1 楼 ?Victor.??的回复:首先 scanf("%lf"&,a[i][j]); 其次laver这个函数是干什么的 哦哦，谢谢，我知道了

user: user-1
content: 首先 scanf("%lf"&,a[i][j]); 其次laver这个函数是干什么的
user-0 提问: 求大佬帮忙看看这个c语言的题。

回复:
user: user-1
content: 设置一个计数器在for循环里 14行if语句里加上count++； for语句外if(count==0) printf("no")

user: user-2
content: LS已经给出思路了 这里只提一下，if里没必要再计算一次ge+10*shi+100*bai，直接用 i 就好了，即 if (i==ge*ge*ge+shi*shi*shi+bai*bai*bai)
user-0 提问: 单向链表全部删除

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:delall是从链表头开始删除的，也就是链表头的内存也释放了，所以list.pStrHead是野指针了，再使用就会出错 而del是只是删除链表的某个节点，链表头并没有释放，所以可以继续使用 好的，谢谢

user: user-1
content: delall是从链表头开始删除的，也就是链表头的内存也释放了，所以list.pStrHead是野指针了，再使用就会出错 而del是只是删除链表的某个节点，链表头并没有释放，所以可以继续使用
user-0 提问: 链表

回复:
user: user-1
content: 建议从网上搜吧,代码是不缺的.如果分不清单链表和双链表已经如何使用,其实搜着了也没有用.

user: user-2
content: 百度一堆，有详细解释的

user: user-3
content: 网上一查一大堆  自己先尝试一下，你要觉得逻辑复杂了点，就拿张纸好好整理一下
user-0 提问: 有定义 j 为何还会出现 ”j：未知标识符是什么意思”？

回复:
user: user-0
content: 引用 2 楼 自信男孩 的回复:for(int j = 0, xxxx)后面多了一个分号,导致后面大括号里面的语句不在for的语句块里.因为j是再for中定义的,因此j的作用域仅存在for的语句块里. 但是这里为什么还是会这样？

user: user-1
content: for(int j = 0, xxxx)后面多了一个分号,导致后面大括号里面的语句不在for的语句块里.因为j是再for中定义的,因此j的作用域仅存在for的语句块里.

user: user-2
content: for j 循环的那句代码的最后多了个分号，去掉它

user: user-1
content: 引用 3 楼 daicsll 的回复:[quote=引用 2 楼 自信男孩 的回复:] for(int j = 0, xxxx)后面多了一个分号,导致后面大括号里面的语句不在for的语句块里.因为j是再for中定义的,因此j的作用域仅存在for的语句块里. 但是这里为什么还是会这样？     [/quote] 道理是一样的.你的printf不在for循环体里,自然不能使用i, j了. 我说的是总评分和平均分的那条printf打印
user-0 提问: C语言新手在指针上遇到的问题

回复:
user: user-1
content: 数组名即是数组的地址，也是数组首元素的地址，是说a指向的地址是&a取得的地址，也是&a[0]地址，即&a和&a[0]取得的地址相同。但是，他们的指针类型不同，只是指向了同一个地址而已。&a是int(*)[]类型，也就是数组的指针（也就是说&a取得的地址类型是一个指向数组类型的指针），所以该指针加1，就会移动数组长度个int字节，即&a+1指向的地址是&a的地址+数组长度*sizeof(int)，所以打印结果就比&a多5*4=20个字节。而&a[0]和a都是int*类型，也就是int指针（也就是指向int类型的指针），所以指针加1就会移动1个int字节，也就是4个字节。所以打印结果a+1比a多4个字节。

user: user-2
content: a+1是表示第二个元素的地址,a是数组的首地址同时也是第一个元素的地址.因此a+1是第二个元素的地址. &a表示int (*)[5]类型, 也是一个地址,只是类型不一样了. &a+1表示向后偏移sizeof(int) * 5的地址.

user: user-3
content: 数组不是地址，数组也是类似于 int 的普通的对象，但一般情况下数组名会自动变成指向首元素的指针(这里经常有人会误解)，也就是说，a 可以表示 &a[0]。&a 是取这个数组对象的地址。
user-0 提问: 三角形ABC中，cos（A-B)=2sinAsinB/sinC,则三角形ABC的周长最小值为

回复:
user: user-1
content: 1. 这里是 C 语言论坛，不是数学论坛，请去对应的论坛询问。 2. 这里只有角度关系，怎么可能求得周长最小值？我并不会这道题，不过可以告诉你一些猜想出来的可能条件：这个三角形是等腰直角三角形(即 (sinA + sinB + sinC)min = 1 + √2)。
user-0 提问: 大一萌新求教，C语言指针题目！！

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

user: user-0
content: 引用 1 楼 ?Victor.?? 的回复：#include<stdio.h> #include<stdlib.h> #include<time.h> #define max 99 #define min 10 int main() { 	int *a; 	int i = 0,j = 0,temp = 0; 	a = (int *)malloc(10*sizeof(int)); 	srand(time(0)); 	for(i = 0;i < 10;i++) 	{	 		a[i]=rand()%(max-min)+min; 	} 	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; 		} 	} 	for(i = 0;i < 10;i++) 		printf("%d\n",a[i]); 	return 0; }谢谢大佬🙏

user: user-2
content: 引用 3 楼 ?Victor.?? 的回复:[quote=引用 2 楼 qybao 的回复:] [quote=引用 1 楼 ?Victor.?? 的回复:] #include<stdio.h> #include<stdlib.h> #include<time.h> #define max 99 #define min 10 int main() { 	int *a; 	int i = 0,j = 0,temp = 0; 	a = (int *)malloc(10*sizeof(int)); 	srand(time(0)); 	for(i = 0;i < 10;i++) 	{	 		a[i]=rand()%(max-min)+min; 	} 	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; 		} 	} 	for(i = 0;i < 10;i++) 		printf("%d\n",a[i]); 	return 0; } 可以不用记录min和max，直接 rand()%100就可以了，对100取余，范围就在10-99之间了[/quote] 大佬，我试了，可是会产生个位数（0~9）[/quote] 哦，是我考虑疏忽了。

user: user-3
content: 引用 2 楼 qybao 的回复:[quote=引用 1 楼 ?Victor.?? 的回复:] #include<stdio.h> #include<stdlib.h> #include<time.h> #define max 99 #define min 10 int main() { 	int *a; 	int i = 0,j = 0,temp = 0; 	a = (int *)malloc(10*sizeof(int)); 	srand(time(0)); 	for(i = 0;i < 10;i++) 	{	 		a[i]=rand()%(max-min)+min; 	} 	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; 		} 	} 	for(i = 0;i < 10;i++) 		printf("%d\n",a[i]); 	return 0; } 可以不用记录min和max，直接 rand()%100就可以了，对100取余，范围就在10-99之间了[/quote] 大佬，我试了，可是会产生个位数（0~9）

user: user-2
content: 引用 1 楼 ?Victor.?? 的回复:#include<stdio.h> #include<stdlib.h> #include<time.h> #define max 99 #define min 10 int main() { 	int *a; 	int i = 0,j = 0,temp = 0; 	a = (int *)malloc(10*sizeof(int)); 	srand(time(0)); 	for(i = 0;i < 10;i++) 	{	 		a[i]=rand()%(max-min)+min; 	} 	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; 		} 	} 	for(i = 0;i < 10;i++) 		printf("%d\n",a[i]); 	return 0; } 可以不用记录min和max，直接 rand()%100就可以了，对100取余，范围就在10-99之间了

user: user-3
content: #include<stdio.h> #include<stdlib.h> #include<time.h> #define max 99 #define min 10 int main() { 	int *a; 	int i = 0,j = 0,temp = 0; 	a = (int *)malloc(10*sizeof(int)); 	srand(time(0)); 	for(i = 0;i < 10;i++) 	{	 		a[i]=rand()%(max-min)+min; 	} 	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; 		} 	} 	for(i = 0;i < 10;i++) 		printf("%d\n",a[i]); 	return 0; }
user-0 提问: 九宫格数独解决方案C语言版

回复:
user: user-0
content: 有人说严谨的数独只应有且只有一个解，如果有朋友手上有一个解的盘面，麻烦留言，我想用这程序跑一下，看能不能解出来，能解的话看看效率如何
user-0 提问: c语言fscanf函数读取时，文件指针的问题

回复:
user: user-1
content: 引用 8 楼 tjw316248269 的回复:... 可是在第二次循环即都第二行时候，b=5。我的疑问在这里，按照我的理解，此时的指针位置应该为7吧？(why not b!=7?) 这表示你没懂我 #5 第二条的意思。我感觉你思考得太一厢情愿了，谁告诉你第二次循环就读取到你所谓的第二行了？而且，既然你明白最后一行 fscanf 是怎么工作的，这里应该没有任何问题才对。

user: user-0
content: 引用 7 楼 apkipa1 的回复:[quote=引用 6 楼 tjw316248269 的回复:] @apkipa1，可是最后一次，应该是因为换行符，所以指针移动了两位。可为什么之前正常的读取，指针不会因为换行符而移动呢？ 首先，这里 @ 没有用，你要回复的话需要点“引用”。 然后再来看你的问题。这里我演示一下 fscanf 的运作，就拿最后一次好了：  10 81 810\r\n          ^ fscanf 从这里开始读取。因为第一个要读的是 %d，fscanf 会先筛去空白符，即 \n。于是，在消耗一个 \n 后，指针到达了这儿：  10 81 810\r\n              ^ fscanf 继续读取下一个字符，然而指针已经指向文件末尾了，读不了了。于是 fscanf 给文件流设置了 EOF 符，然后返回了 EOF。在下一次循环时，feof 就能返回非 0 值了。[/quote]  Hi： 你说的最后一行这个我明白，我不明白的是这个： 首先，代码的35行的int b = ftell(fp)得到的是在fscanf之前的指针位置， 而代码段37行的int d = ftell(fp)得到的是fscanf之后的指针位置。 那么以 打印结果的第一行和第二行来说，第一行fscanf后，d=5，也就是打印完第一行3个数后，指针位置在5.。 这个d=5是因为1 0 0，而对于文件写与读取，应该是 1 0 0\r\n。 此后还有2位\r\n.。欲读取到下一行的数据，指针应该先经过\r\n两位吧。也就是指针偏移+2。 可是在第二次循环即都第二行时候，b=5。我的疑问在这里，按照我的理解，此时的指针位置应该为7吧？(why not b!=7?)

user: user-1
content: 引用 6 楼 tjw316248269 的回复:@apkipa1，可是最后一次，应该是因为换行符，所以指针移动了两位。可为什么之前正常的读取，指针不会因为换行符而移动呢？ 首先，这里 @ 没有用，你要回复的话需要点“引用”。 然后再来看你的问题。这里我演示一下 fscanf 的运作，就拿最后一次好了：  10 81 810\r\n          ^ fscanf 从这里开始读取。因为第一个要读的是 %d，fscanf 会先筛去空白符，即 \n。于是，在消耗一个 \n 后，指针到达了这儿：  10 81 810\r\n              ^ fscanf 继续读取下一个字符，然而指针已经指向文件末尾了，读不了了。于是 fscanf 给文件流设置了 EOF 符，然后返回了 EOF。在下一次循环时，feof 就能返回非 0 值了。

user: user-0
content: @apkipa1，可是最后一次，应该是因为换行符，所以指针移动了两位。可为什么之前正常的读取，指针不会因为换行符而移动呢？

user: user-1
content: 1. 确实，fscanf 什么都没有读到，所以谁也不知道你再访问 tmp 的时候会读到什么。这是典型的未定义行为。这里还能打印，表示你运气好。 2. 在你第一次读取到第二次读取的间隙，没有任何文件读取的操作，文件指针当然停在 5，它不能也不可以自说自话移动指针。

user: user-0
content: 谢谢两位，我知道怎么改了。可是我还是有地方不清楚， 第一处： 我理解了最后因为还有换行符\r\n为两字节，所以不是文件末尾。 我理解的读取，无论是从文本文档读还是二进制文件读，文件读取应该是根据文件指针位置来的。 但是，倒数第二次打印的时候，文件指针应该已经到了可读字符的末尾，为何fscanf还可以读出来该行的数据？ 我打印了一下fscanf返回值，为-1，说明没有正确读取，可为何还是打印了出来？我这可是临时变量，不受上一次赋值影响的啊。 第二处： ftell返回的是指针偏移量，从头开始算，所以就是指针位置。那么，fscanf遇到换行符或空格结束，所以不会显示出来。那么第一行是0=>5，第二行打印，算上换行符，应该是从第7位开始，可为何还是从5开始？

user: user-0
content: 引用 9 楼 apkipa1 的回复:[quote=引用 8 楼 tjw316248269 的回复:] ... 可是在第二次循环即都第二行时候，b=5。我的疑问在这里，按照我的理解，此时的指针位置应该为7吧？(why not b!=7?) 这表示你没懂我 #5 第二条的意思。我感觉你思考得太一厢情愿了，谁告诉你第二次循环就读取到你所谓的第二行了？而且，既然你明白最后一行 fscanf 是怎么工作的，这里应该没有任何问题才对。[/quote]  哦哦，我知道了，指针是移动了，但那个是fscanf之前测得，还是在上一次的结束点。新的一轮fscanf时候，才读到换行符。所以第二行读出来是从5到12，动了7位，已经包含了\r\n。多谢

user: user-2
content: fscanf 和 scanf的区别之一就是遇到回车换行的处理方式 scanf会过滤它， fscanf会读出来它 fprintf的时候输出了回车 fscanf的时候也要把回车带到那个格式当中  好在你这里读写的都是整数，如果是字符串你就会发现问题更大了！ —————— 回车的影响

user: user-2
content: fscanf读完最后一行的时候，并没有发生eof 只有下一次再读，没有读到数据才产生eof的状态 fscanf有返回值，你看返回值是不是你设置的要读取的数据的数量 这个例子当中你要读取三个整数， 所以判断  3 == fscanf（。。。。。） 作为是否成功获取数据的标志即可

user: user-1
content: 1. 由于你使用文本模式打开文件，ftell 的返回值是没有明确意义的。这里可以推测 ftell 返回的是二进制模式下的位置。在 Windows 下，文字的换行是 \r\n，占 2 个字节，所以你会观察到莫名的 2 位空间。 2. 你对文件流的 EOF 了解不透彻。EOF 仅在文件被读到末尾时被设置。即使读到文件的最后一个字符，feof 都会返回 0，这时只有再读一次，读取函数发现无数据可读的时候，EOF 才能被设置。
user-0 提问: C语言哥德巴赫猜想

回复:
user: user-0
content: 引用 3 楼 寻开心的回复:楼主的代码对吗？  main函数当中有个scanf没错， isprime函数里面怎么还有一个scanf，这个和题目不符吧。  即便注释掉scanf函数，后面的那个if也是错的 if（p<=1） return 0； else if ( p==2) return 0; else ....  2怎么就不是素数了呢？ 谢谢(*°∀°)=3

user: user-0
content: 引用 1 楼 ?Victor.??的回复:4=2+2 不是4=3+1 好巧我也做过这种题 #include<stdio.h> #include<math.h> int prime(long int m) { 	long int i; 	int count = 0; 	for(i=2;i<=sqrt(m);i++) 	{ 		if(m%i==0) 			count++; 	} 	if(count==0) 		return 1; 	else 		return 0;//不是素数  } int main() { 	long int n,i; 	scanf("%ld",&n); 	for(i=2;i<n;i++) 	{ 		if(prime(i)==1&&prime(n-i)==1) 		{ 			printf("%ld=%ld+%ld",n,i,n-i); 			break; 		} 	} 	return 0; } 谢谢(*°∀°)=3

user: user-1
content: 楼主的代码对吗？  main函数当中有个scanf没错， isprime函数里面怎么还有一个scanf，这个和题目不符吧。  即便注释掉scanf函数，后面的那个if也是错的 if（p<=1） return 0； else if ( p==2) return 0; else ....  2怎么就不是素数了呢？

user: user-1
content: 1不算是素数啊

user: user-2
content: 4=2+2 不是4=3+1 好巧我也做过这种题 #include<stdio.h> #include<math.h> int prime(long int m) { 	long int i; 	int count = 0; 	for(i=2;i<=sqrt(m);i++) 	{ 		if(m%i==0) 			count++; 	} 	if(count==0) 		return 1; 	else 		return 0;//不是素数  } int main() { 	long int n,i; 	scanf("%ld",&n); 	for(i=2;i<n;i++) 	{ 		if(prime(i)==1&&prime(n-i)==1) 		{ 			printf("%ld=%ld+%ld",n,i,n-i); 			break; 		} 	} 	return 0; }
user-0 提问: C 计算 圆周率（定积分）

回复:
user: user-1
content: 这个代码有啥问题呢？ register关键词的优化如果不支持，你可以直接删除  把循环这样改一下，精度更高一些， 如果你明白定积分就不用解释， 不明白解释也白解释 for(register double x=0.5*dx; x<=1; x+=dx)
user-0 提问: 求大佬指点一下这个程序段

回复:
user: user-1
content: 问题是你怎么知道你读的对呢？ fscanf一个字符串就printf输出一个看看，这样才确信读出来的正确  fscanf第一个参数是in啊，你的参数丢了，怎么编译过去的呢？ fscanf(in,  "%s", &word[i]);

user: user-0
content: 引用 1 楼 寻开心的回复:第一步，先验证fscanf正确读出了字符串， 在其后printf一次，如果读都没有读出来，还排什么 第二， 字典排序要比较单词， 用strcmp函数， 排序算法就先冒泡去吧， 所有书都有个算法的 我就是先读然后输出，还没排序呢，结果读的操作就gg了

user: user-1
content: 贴代码的文本上来， 需要别人帮助修改的话， 没人愿意再给你敲一遍

user: user-1
content: 第一步，先验证fscanf正确读出了字符串， 在其后printf一次，如果读都没有读出来，还排什么 第二， 字典排序要比较单词， 用strcmp函数， 排序算法就先冒泡去吧， 所有书都有个算法的
user-0 提问: 大一寒假课题，给孩子整蒙了

回复:
user: user-0
content: 引用 3 楼 vocanicy的回复:这个译文你没翻译对吧？！ 不是我翻译的，原题就是这个

user: user-0
content: 我问问老师吧，毕竟她给的题就是这样的没有英文

user: user-1
content: 上英文吧！你这翻得肯定不对！

user: user-2
content: 这个译文你没翻译对吧？！

user: user-0
content: 引用 1 楼 寻开心的回复:怎么觉得这个题目不对呢 x & y 是位运算，这个和顺序没有个关系啊 没明白题目要做什么了 贴原文看看呗 原文给的就是这样的，我也不明白

user: user-3
content: 怎么觉得这个题目不对呢 x & y 是位运算，这个和顺序没有个关系啊 没明白题目要做什么了 贴原文看看呗
user-0 提问: 队列的插入和删除影响其他元素吗

回复:
user: user-1
content: 在顺序存储中： 栈：插入和删除运算不需要移动表中其他元素的。 队列：需要移动。 百度了一下队和栈的区别，看到了上面的一种区别  这里有前提条件， 顺序存储， 或者理解为用数组来实现，  队列是两头操作，从后边加入，从前面出。  那么随着不断的操作， 队列的头（出队的方向）会越来越接近数组的尾巴 再继续下去，数组就满了。 但是实际上数组还没有怎么利用呢。为避免这个问题 出队列的时候， 要考虑把后面的数组元素都向前平移来利用数组空间，  如果是这种方式就会有影响 如果你用循环数组来管理，就可以不用移动， 但是考虑到回绕的问题， 这个是不还算顺序存储就有待商榷了
user-0 提问: 求求大佬帮忙看一下我这段代码出了什么问题，我是小朋友

回复:
user: user-1
content: LZ应该找本入门级别的书脑补一下变量的作用域方面的知识 m的作用域（也就是作用范围）在while的花括号里，离开了while的花括号m就无效了，所以error就是提示m没有声明（因为不在m的作用范围里），不能使用m。 至于while里面警告，只是提示m只有赋值，没有使用，也就是说该行代码没意义，代码冗余。这只是个警告，所以忽略也没关系。
user-0 提问: 问题

回复:
user: user-1
content: for循环的条件是j<i, 既然是正常循环结束出来了， j还能小于i吗 ？！！ 显然你的理解是错的咯  for（初始值；  循环条件； 每次循环后的操作 ） {       循环体 }  最后一次循环， 循环结束后的操作j++， 会让 j<i 不成立， 然后才退出循环， 那么什么值会让循环条件不成立呢？  你猜