Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 蓝桥杯C语言的程序我老出现运行错误是为什么

回复:
user: user-1
content: 函数严格必须要有返回值

user: user-2
content: 蓝桥杯要求必须用 int main() {     return 0; }的格式

user: user-3
content: 你这样输出是截断取整，不是四舍五入

user: user-4
content: 做题就先看清人家的要求

user: user-5
content: 的确是四舍五入 没问题 这里不是答案错误 是运行错误  所以应该是 没有return 0  导致测评机认为程序没有正常退出  按照运行错误判定

user: user-6
content: printf是有四舍五入功能的啊 double d = 0.12345678； printf("%lf", d);  结果是0.1234568  它是“运行错误”， 不是答案错误！

user: user-6
content: printf 尾巴也不要有\n, 有的也会认为是多余的数据

user: user-6
content: int main（） {   。。。。   return 0； } 这个代码结构不要乱省略
user-0 提问: 用C语言写一个程序（IP查询系统，详细如下），谢了！有思路也行，看一下吧，谢谢了！

回复:
user: user-1
content: 请问还要吗，我这边有。

user: user-2
content: utf-8转码怎么弄啊

user: user-3
content: ip地址不过是32位整数，或者把他设为4个8位整数 查询不要按字符串操作，直接用整数操做。

user: user-4
content: 加油，我也想知道

user: user-5
content: 编码是个问题 此外，对于这么大的数据文件， 最好预处理一遍，做个索引，定位一下1.0.0.0开始的在文件什么位置， 2.0.0.0开始的什么位置， 这样比直接搜索要快很多

user: user-6
content: 先写个交互界面，然后用fopen打开文件，用sscanf判断输入的ip是否正确，fgets读取文件数据，定义个结构体将数据放进去，然后写个函数找到那一行输出，因为是UTF8文件所以中文会乱码，在网上找个转码的函数。我目前大概就做这么多。

user: user-2
content: 有木有啥思路啊

user: user-6
content: 湘大的？我也在写

user: user-7
content: 多谢支持。看看先
user-0 提问: 求助c语言指针知识

回复:
user: user-1
content: 指针类型有多种，但是他们都是内存的地址， 因此是统一的，大小是一样的 就好比门牌号， 都是统一派发的，同样的格式，只是内容不同而已  指针类型变量也是变量，当然是可以修改的， 指针的运算只有比较，和对整数的加减这样的操作

user: user-2
content: 不管什么类型的指针其内存信息都是一个地址，对于32位机来说，最大寻址长度只有4个字节（一个字节8位，4个字节就是32位），所以不管什么类型的指针，都是只用4个字节的内存就足够保存一个地址信息了，也就是指针变量本身的内存只需要4个字节就可以了，所以指针类型的内存大小都一样，只占用4个字节。当然64位机的最大寻址长度是64位=8字节。

user: user-3
content: p 一开始先指向 a，然后 p++ 使得 p 指向了 a 的后一个 int (如果把 &a 看作数组，那么此时 p 指向 (&a)[1])。指针本身也是一个对象，所以可以做类似对于 a 所做的事。但是指针的运算和算数运算法则不同，对 p 的加减实质是让 p 向前/后指指定个元素，或者求两个指针间差多少个元素。不同类型的的指针所占的内存空间大小不一定相同(然而你现在能遇到的机器中，所有类型指针的大小确实一样)，所以书上的说法不准确。

user: user-0
content: 引用 2 楼 寻开心的回复:看来还是没有理解指针是什么 p=&a；    a，x，p等所有的变量都是在内存当中保存，保存的具体的位置就是内存地址， 指针就是内存地址 你可以把变量地址理解成房子的门牌号，变量的内容就是房子里面的人，地址和内容是完全不同的两个概念 int a=3；   p = &a； 房子的门牌号放到p里面了，  房子里面住的是3 p++ 的意思是，就是邻居的门牌号  你可以printf("%g", p); 这种方式来输出指针， 自己写代码来看p++后指针的变化 不是只差1，具体差多少要看指针的类型 就好比街道上邻居的门牌号往往相差2而不是1一样 int 是32bits的时候， p++ 和 p相比差4 这些都可以通过自己输出p的值来查看 感谢 那就是说指针变量p也和一个变量一样可以进行计算改变他的值？它自己本身也有一个储存单元 但是书上说 不同类型指针变量所占的内存空间大小都是相同的 这又是怎么回事呢？

user: user-2
content: p++相当于 p=p+1，这里p指向了p+1的地址，所以p不再指向a的地址了

user: user-1
content: 看来还是没有理解指针是什么 p=&a；    a，x，p等所有的变量都是在内存当中保存，保存的具体的位置就是内存地址， 指针就是内存地址 你可以把变量地址理解成房子的门牌号，变量的内容就是房子里面的人，地址和内容是完全不同的两个概念 int a=3；   p = &a； 房子的门牌号放到p里面了，  房子里面住的是3 p++ 的意思是，就是邻居的门牌号  你可以printf("%g", p); 这种方式来输出指针， 自己写代码来看p++后指针的变化 不是只差1，具体差多少要看指针的类型 就好比街道上邻居的门牌号往往相差2而不是1一样 int 是32bits的时候， p++ 和 p相比差4 这些都可以通过自己输出p的值来查看
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: flag只是用来标记的，设0/1本质上没有区别，只要可以检测出flag是否发生变化就行

user: user-0
content: 引用 3 楼 New me的回复:flag只是用来标记的，设0/1本质上没有区别，只要可以检测出flag是否发生变化就行 那为啥前面一个和后面一个程序比较起来，后面一个可以输出等腰直角三角形

user: user-0
content: 引用 1 楼 寻开心的回复:就不能把图正过来吗？！ 看着累 不是，你点击那个图，然后就变正了

user: user-3
content: 就不能把图正过来吗？！ 看着累
user-0 提问: 初来乍到的小萌新，想请教大佬们一个问题。

回复:
user: user-0
content: 好的，我明白了，非常感谢您的帮助！

user: user-1
content: 这也是属于不确定的行为， 不要去研究了， 不同的编译器结果不同 https://blog.csdn.net/happy__888/article/details/103836384
user-0 提问: 因为病毒的缘故，所以要在家学习，可是这个代码怎么运行起来是4的无限次循环呢？想不出缘故
题目如下

回复:
user: user-0
content: 引用 4 楼 寻开心的回复:交作业可以 要学习，可不能偷这个懒 好的好的 谢谢提醒

user: user-1
content: 交作业可以 要学习，可不能偷这个懒

user: user-0
content: 引用 2 楼 寻开心的回复:题目本意是让你移动数组里面的元素内容， 然后显示移动好的数组 你这个好， 直接显示，  投机取巧  我也是和别人学的，对啊，你说得对，我果然生疏了

user: user-1
content: 题目本意是让你移动数组里面的元素内容， 然后显示移动好的数组 你这个好， 直接显示，  投机取巧

user: user-1
content: if （i=n-m） 这个是赋值， 不是判断，要 == 才行
user-0 提问: 求解

回复:
user: user-1
content: 数组不能一句话输出 要循环，一个个的输出

user: user-0
content: 引用 1 楼 寻开心的回复:这种基础练习自己写， 错了再贴代码提问 这个怎么能让数组这样输出？

user: user-1
content: 这种基础练习自己写， 错了再贴代码提问
user-0 提问: 有大佬能讲一下 这是为什么吗

回复:
user: user-1
content: 不知道你的编译环境是什么。 看错误输出的描述是工程/项目不对。 新建的工程/项目的时候，应该有类型的选择的

user: user-0
content: 引用 1 楼 寻开心的回复:你的工程不对，要新建一个桌面的控制台应用，然后再在里面写代码 没听懂  我是按照书上说的 新建 然后再在源文件新建  然后就开始写了

user: user-1
content: 你的工程不对，要新建一个桌面的控制台应用，然后再在里面写代码
user-0 提问: c语言数组和指针问题求解

回复:
user: user-0
content: 引用 4 楼 qybao的回复:你把pp改变了，又不想变回来，又想得到原来的信息，这怎么可能呢？变了就是变了，想恢复就要变回来 比如 int n = 5; n++; //n已经变成6了，你还怎么能得到原来的信息5，所以你只能变回来，要么n--，要么n=5，这一步是必须的，不是多此一举  在你这个例子中，可以不改变pp，通过i的改变来获取数组信息就好了，即取*(pp+i)，这样pp就不变，还是指向A[0]，通过pp+i，i的变化是的pp+i的地址变化，pp始终不变 这个*(pp+i),完美解决了我的问题，使指针尽量与变量地址和内容唯一对应，不然++--的次数多了，容易乱。 打印数组内容，实际上只需要计算机帮我打印一下，并不想改变指针的值。

user: user-1
content: 你把pp改变了，又不想变回来，又想得到原来的信息，这怎么可能呢？变了就是变了，想恢复就要变回来 比如 int n = 5; n++; //n已经变成6了，你还怎么能得到原来的信息5，所以你只能变回来，要么n--，要么n=5，这一步是必须的，不是多此一举  在你这个例子中，可以不改变pp，通过i的改变来获取数组信息就好了，即取*(pp+i)，这样pp就不变，还是指向A[0]，通过pp+i，i的变化是的pp+i的地址变化，pp始终不变

user: user-2
content: 再次让pp = A不就完了嘛！  A是数组变量， 它的地址永远不可能更改 p++跑到了尾巴，要会来干嘛非要--回来啊， 直接pp=A不就回来了嘛 还有指针不是只有p++，p-- 还有 p += 4；  p -= 8； 这样的操作，都可以大幅度的变化

user: user-0
content: 引用 1 楼 qybao的回复:int *pp = A //pp指向A[0]的地址 pp++ 相当于 pp=pp+1 pp最初指向A[0]的地址，所以相当于 pp=&A[0]+1(A[0]的地址+1) 相当于 pp=&A[1](A[1]的地址)，所以pp++的结果就是pp指向了A[1] pp[0]就是从pp这个地址取下标为0的元素，因为pp指向A[1]的地址，所以下标为0的元素就是A[1] 你好，大哥，在pp++后，想通过pp访问A[0]的内容，有没有更好的办法？

user: user-1
content: int *pp = A //pp指向A[0]的地址 pp++ 相当于 pp=pp+1 pp最初指向A[0]的地址，所以相当于 pp=&A[0]+1(A[0]的地址+1) 相当于 pp=&A[1](A[1]的地址)，所以pp++的结果就是pp指向了A[1] pp[0]就是从pp这个地址取下标为0的元素，因为pp指向A[1]的地址，所以下标为0的元素就是A[1]
user-0 提问: 请大佬指点一下

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

user: user-1
content: 一楼正解  字符串 “123456”， 把其中的一个改成'\0'，变成。“123\056”,  那么用它再做字符串操作的时候， 它就等同于“123”了。  字符串被截断了。

user: user-2
content: 字符串以'\0'为结尾，确保strcat拼接正确
user-0 提问: calloc问题和strlen

回复:
user: user-1
content: strlen  是返回字符串长度的，以char指针形式遍历， 碰到'\0'就返回

user: user-2
content: 1）strlen(ST) 这个表达式在编译时就过不了吧 ？  2）从指针 ST中是无法获取 所指数据 数组元素个数。

user: user-3
content: strlen() 函数只能对字符串使用不能对结构数组使用啊，strlen(ST)会把 10 个 stu 的内容都解释成字符，只要遇到 0 就解释成字符串末尾 '\0' ，所以第一个结构的 age 成员被设置成 0 后就被strlen看成字符串末尾了。没有 for 循环由于有 testf 函数，它的 tt 成员被设置成了 0 所以字符串长度为 1。
user-0 提问: 求大佬帮助

回复:
user: user-1
content: int GetMax(int input) { int maxValue = 0;//用于储存计算过程中的最大值  int init_value = input; int a = 0;  while(init_value > 1) { if(init_value %2 == 1) { init_value *= 3; init_value +=1; } else { init_value /=2; } if(init_value > maxValue) maxValue = init_value; } return maxValue; };

user: user-2
content: 用max记录当前出现过的最大n，直到n=1

user: user-3
content: 按照要求写代码呗 初始最大值就是输入的值 然后每生成一步，和记录的最大值比较后并保存  自己写， 错了再贴上来代码提问
user-0 提问: 请问这里#define int datatype不是将int替换为datatype吗
那下面结构体中怎么又datatype elem[maxsize

回复:
user: user-0
content: 引用 13 楼 weixin_46394248 的回复:这是为什么啊 书里面代码错了，这里应该是typedef 而不是#define

user: user-1
content: 这是为什么啊

user: user-1

user: user-2
content: 怎么正确看书 就是看那些语法规则，函数原型的说明 那些算法的原理和运行到逻辑 看懂了这些， 那些示范代码可以一行不看， 看不懂这些，看那些代码也是瞎子点灯

user: user-2
content: 尽信书不如不信书！  看编程的书，要看示范代码之外的文字 ， 那些文字才是重点，  示例代码重来都不是重点 代码只是示范或者验证那些文字的内容的，读懂了那些文字再看示范 懂了那些文字，这些示范有错误你也能自己来找。  不明白算法或者代码思路的情况下直接看代码，就是瞎子摸象， 执行对了不知道为什么，错了就更不知道为什么了 根源还是在没有看书，没有正确的看书

user: user-0
content: 引用 8 楼 真相重于对错的回复:它原意似乎是 typedef  int datatype; 对对对，原意应该是typedef，现在终于反应过来了

user: user-3
content: 它原意似乎是 typedef  int datatype;

user: user-4
content: 宏定义不需要加 ；

user: user-0
content: 引用 5 楼 寻开心的回复:管他哪儿的， 编译器上不通过，就错了。 不能不信书，也不能尽信书！ 嗯嗯谢谢！！！！！！！

user: user-2
content: 管他哪儿的， 编译器上不通过，就错了。 不能不信书，也不能尽信书！

user: user-0
content: 引用 2 楼 寻开心的回复:顺序也翻了 #define datatype int 这样才对 我刚开始是觉得是错的，顺序反了，但是这书是文泉学堂下载的所以有点怀疑😂

user: user-0
content: 引用 2 楼 寻开心的回复:顺序也翻了 #define datatype int 这样才对 这本书是清华大学的文泉学堂下载的，表示懵逼

user: user-2
content: 顺序也翻了 #define datatype int 这样才对

user: user-2
content: #define int datatype 后面没有分hao1
user-0 提问: C语言通讯录管理读写出错

回复:
user: user-1
content: int main()  {  printf("\n\t\t 欢迎使用通讯录管理系统");  printf("\n\t\t 文件导入中...请稍后...\n\n\n\n\n");  system("cls"); NO=loadfile(); 缺少了这个赋值， 导致虽然正确读出了数据。 但是没有告知全局变量， 它还是认为student数组里面有效数据是0个

user: user-1
content: 1 可能和你readfile后面后，没有调用fclose函数关闭文件有关系 导致write不成功没有保存  2 可能和你的student数组的管理有关系， 清理了没有保存
user-0 提问: C语言通讯录管理系统读写出错为什么？

回复:
user: user-0
content: 什么是内存数据管理？

user: user-0
content: https://share.weiyun.com/5Xbk6Y5完正版这里就是你说的那样感觉没问题啊

user: user-1
content: 数据没了的原因未必在这两个函数上， 也有可能在你的内存数据管理上  此外感觉你这个磁盘文件组织有问题，缺少了一个有多少条记录的信息在文件当中 应该先写入一个整数，表示记录有多少条， 然后再循环写入每个记录 读的时候，先出记录条数，然后再循环读取每条的记录  启动程序后     判断数据文件是否存在， 如果有就loadfile加载到内存     如果有了记录变更就writefile到磁盘
user-0 提问: C语言套接字问题

回复:
user: user-0
content: 引用 2 楼 寻开心的回复:sys/types.h：数据类型定义  sys/socket.h：提供socket函数及数据结构  netinet/in.h：定义数据结构sockaddr_in  arpa/inet.h：提供IP地址转换函数  netdb.h：提供设置及获取域名的函数  sys/ioctl.h：提供对I/O控制的函数  sys/poll.h：提供socket等待测试机制的函数    其他在网络程序中常见的头文件  unistd.h：提供通用的文件、目录、程序及进程操作的函数  errno.h：提供错误号errno的定义，用于错误处理  fcntl.h：提供对文件控制的函数  time.h：提供有关时间的函数  crypt.h：提供使用DES加密算法的加密函数  pwd.h：提供对/etc/passwd文件访问的函数  shadow.h：提供对/etc/shadow文件访问的函数  pthread.h：提供多线程操作的函数  signal.h：提供对信号操作的函数  sys/wait.h、sys/ipc.h、sys/shm.h：提供进程等待、进程间通讯（IPC）及共享内存的函数    建议：在编写网络程序时，可以直接使用下面这段头文件代码  #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <fcntl.h> 还有就是那个SOCKET代表什么意思呢？

user: user-0
content: 引用 2 楼 寻开心的回复:sys/types.h：数据类型定义  sys/socket.h：提供socket函数及数据结构  netinet/in.h：定义数据结构sockaddr_in  arpa/inet.h：提供IP地址转换函数  netdb.h：提供设置及获取域名的函数  sys/ioctl.h：提供对I/O控制的函数  sys/poll.h：提供socket等待测试机制的函数    其他在网络程序中常见的头文件  unistd.h：提供通用的文件、目录、程序及进程操作的函数  errno.h：提供错误号errno的定义，用于错误处理  fcntl.h：提供对文件控制的函数  time.h：提供有关时间的函数  crypt.h：提供使用DES加密算法的加密函数  pwd.h：提供对/etc/passwd文件访问的函数  shadow.h：提供对/etc/shadow文件访问的函数  pthread.h：提供多线程操作的函数  signal.h：提供对信号操作的函数  sys/wait.h、sys/ipc.h、sys/shm.h：提供进程等待、进程间通讯（IPC）及共享内存的函数    建议：在编写网络程序时，可以直接使用下面这段头文件代码  #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <fcntl.h> 谢谢啊，这个结帖是怎样弄啊？

user: user-1
content: sys/types.h：数据类型定义  sys/socket.h：提供socket函数及数据结构  netinet/in.h：定义数据结构sockaddr_in  arpa/inet.h：提供IP地址转换函数  netdb.h：提供设置及获取域名的函数  sys/ioctl.h：提供对I/O控制的函数  sys/poll.h：提供socket等待测试机制的函数    其他在网络程序中常见的头文件  unistd.h：提供通用的文件、目录、程序及进程操作的函数  errno.h：提供错误号errno的定义，用于错误处理  fcntl.h：提供对文件控制的函数  time.h：提供有关时间的函数  crypt.h：提供使用DES加密算法的加密函数  pwd.h：提供对/etc/passwd文件访问的函数  shadow.h：提供对/etc/shadow文件访问的函数  pthread.h：提供多线程操作的函数  signal.h：提供对信号操作的函数  sys/wait.h、sys/ipc.h、sys/shm.h：提供进程等待、进程间通讯（IPC）及共享内存的函数    建议：在编写网络程序时，可以直接使用下面这段头文件代码  #include <unistd.h> #include <sys/types.h> #include <sys/socket.h> #include <netdb.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #include <errno.h> #include <malloc.h> #include <netinet/in.h> #include <arpa/inet.h> #include <sys/ioctl.h> #include <stdarg.h> #include <fcntl.h> #include <fcntl.h>

user: user-1
content: #include <sys/socket.h>   #include <netinet/in.h>   应该是这两个
user-0 提问: 请教问题，关于二级指针问题

回复:
user: user-0
content: 引用 2 楼 寻开心 的回复:void initList( List ** list ) { *list = NULL };  int main() {     List * list;     List ** l = &list;     initList(l);     list = addList(list, 10); .... 谢谢！

user: user-1
content: void initList( List ** list ) { *list = NULL };  int main() {     List * list;     List ** l = &list;     initList(l);     list = addList(list, 10); ....
user-0 提问: 请大佬看看这个问题

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

user: user-1
content: 变量在定义的时候，它的地址就已经固定了， 无伦怎样都不能改变量的地址， 只能去改变量的值！

user: user-1
content: int a； 做这个定义的时候，a 的地址就固定了， 不会再改变 int * pA = (int *) p; 这样可以

user: user-0
content: 请问： 如果把int a=*(int*)p 改为*（(int*)p） = a 这样会不会改变a的地址呢

user: user-1
content: int main(){ void *p = malloc(sizeof(int));   cout << p << "\n";   // p是malloc的指针   int a = *(int*)p;     cout << &a;       // 这里输出的a的地址， 根本就不是一个东西，结果自然就不一样 }  int a = * (int*)p; 这句的作用是什么？ 把p转换成int类型指针， 然后取指针指向的的内容赋值给了a；  所以这句只是给a赋值  让p指向a的语句是。p = &a；

user: user-2
content: #include <iostream> #include <cstdlib>  int main(){     using namespace std;     void *p = malloc(sizeof(int));   cout << p << "\n";   int a =10;    p=&a;    cout << p << "\n";   cout << &a<<endl;   cout<<a<<endl;   return 0; }
user-0 提问: 求大神解答

回复:
user: user-1
content: ABCD固定才可以把直线固定，这里说他们为常量，应该是编程的时候，直接指定ABCD的值 const float A = 1.0， B=1.0f，C=1.0f, D=1.0f;  这样 float x0, y0, z0; 程序代码让用户输入x0，y0和z0 然后根据计算出d并输出的意思  代码自己写，很简单的 无非#inlcude <math.h> 用sqrt和fabs函数而已
user-0 提问: turbo c 压缩问题

回复:
user: user-0
content: 引用 6 楼 寻开心的回复:turbo c 看着名字就觉得亲切， 当年就是靠它学的c语言。   Turbo C / Borland C / Visual C++ 一路过来哈哈   哈哈😁😁😁😁😁

user: user-0
content: 引用 5 楼 早打大打打核战争的回复:turbo c太老了，64位系统上不能运行，还要装DOsBox，下这个吧：https://filehippo.com/download_dev-c/ 谢谢谢谢谢谢✔😁😁😁😁

user: user-1
content: turbo c 看着名字就觉得亲切， 当年就是靠它学的c语言。   Turbo C / Borland C / Visual C++ 一路过来哈哈

user: user-2
content: turbo c太老了，64位系统上不能运行，还要装DOsBox，下这个吧：https://filehippo.com/download_dev-c/

user: user-0
content: 引用 1 楼 早打大打打核战争的回复:怎么还用30年前的东西~~~ 大神！可不可以教我下载个turbo c

user: user-0
content: 大神，可不可以给我个turbo c

user: user-0
content: 引用 1 楼 早打大打打核战争的回复:怎么还用30年前的东西~~~ 我不会……我不懂啊！我想自习c所以想下个turbo  c

user: user-2
content: 怎么还用30年前的东西~~~
user-0 提问: 数组与指针

回复:
user: user-1
content: 这个程序代码是有问题的。 prinf函数里面的几个参数执行的先后顺序是未定义行为，结果会因不同的编译器而不同 要避免写这种代码 参看我的博客 https://blog.csdn.net/happy__888/article/details/103836384
user-0 提问: 一道C语言问题求解

回复:
user: user-1
content: %u 是unsigned int类型指定，在scanf当中 好好看看书，无符号整数和有符号整数的区别，就在高位上。有符号的，把最高位当作符号位， 无符号的整数把最高位当作有效数字位。  sizeof(int) 可以告诉你int是多少BYTE的，  len = 8*sizeof（int） 就是多少位（bits）  找最高位，就要用到位运算符  unsigned int flag = 1<<(len-1);   构造出来二进制的 1000 0000 0000 0000 0000 0000 0000 0000   对应的16进制就是 0x8000000 函数传入进来的unsigned int数 u ，用u和它做位运算：  u & flag  就可以判断高位是否是1了   int fun(unsigned u) {    if ( u & ( 1<<31 ) return -1 ; else return 1; }  基础知识： 数的二进制表示， 位运算。  多看看书吧

user: user-2
content: 最高位用除余得到 首先是类型不同，无符号类型和有符号类型，其次是数据范围不同
user-0 提问: c语言gets()函数问题

回复:
user: user-1
content: 引用 2 楼 哟呵咯游 的回复:额，那我这是编译器的问题么 我也不太懂，觉得跟编译器关系不大吧。你结尾加没加 return 0？或者 1 往后的数字确实可能是编译器在程序运行完成之后显示的什么值。要不你在 for 循环之后再加个打印换行看看啥结果。

user: user-2
content: 引用 5 楼 哟呵咯游 的回复:新建数组都要初始化吗？ 我记得整型就没这个问题 整形也需要初始化的（当然除非有的编译器自动初始化了） 可以参考以下帖子，没有初始化时整形数组打印出来的信息 https://bbs.csdn.net/topics/395735254

user: user-0
content: 引用 4 楼 user-2的回复:你没有初始化s，所以数组里的信息是不确定的，即s[1]不一定是'\0'  有的编译器可能会帮你初始化，有的可能不会，所以最好还是自己初始化一下 memset(s, '\0', sizeof(s)); 新建数组都要初始化吗？ 我记得整型就没这个问题

user: user-2
content: 你没有初始化s，所以数组里的信息是不确定的，即s[1]不一定是'\0'  有的编译器可能会帮你初始化，有的可能不会，所以最好还是自己初始化一下 memset(s, '\0', sizeof(s));

user: user-1
content: 首先你使用了 cout 和 endl，这不是 C++ 么，你好像来错论坛了。另外我用codeblocks编译了一下并没有什么问题。

user: user-0
content: 额，那我这是编译器的问题么
user-0 提问: 老哥们帮我看看这是怎么用的

回复:
user: user-1
content: 一个写在循环里的，一个循环外面的

user: user-2
content: while外面的scanf是吸收回车键， 执行后key[i] 就是'\n' 后面的key[I] = 0 又把它覆盖掉了， 这样就可以让key作为字符串来使用了  不吸收这个回车， 那么会影响以后的scanf操作
user-0 提问: VS Code 配置C环境 编译时 no such file

回复:
user: user-1
content: 最后那个划线部分可以看到，gcc命令路径错了，缺少"\"，要在设置里面改一下应该

user: user-2
content: 当前文件夹里没有你那些 头文件啥的，你把头文件下载一下就行啦
user-0 提问: vs2019 打开文件操作 运行会报错

回复:
user: user-1
content: vs就是骚  建议引用那一个头文件，直接免去一切烦恼

user: user-0
content: 引用 1 楼 寻开心的回复:错误提示很清楚，  fopen是不安全的用法， 要用fopen_s来替代  err = fopen_s(&fp, "filename", "r");     if(err == 0) {         printf("The file 'filename' was opened\n");     }     else {         printf("The file 'filename' was not opened\n");     } 成功了，非常感谢前辈

user: user-2
content: 错误提示很清楚，  fopen是不安全的用法， 要用fopen_s来替代  err = fopen_s(&fp, "filename", "r");     if(err == 0) {         printf("The file 'filename' was opened\n");     }     else {         printf("The file 'filename' was not opened\n");     }
user-0 提问: 求教求教

回复:
user: user-1
content: 看看scanf函数的说明，  scanf遇到回车，空格，tab等分隔符时候的处理方法 简单的说 scanf的时候，遇到用户输入回车才开始真正的读取数据， 没有回车的时候，一直等待用户输入/修改/删除输入的内容 用户所有输入的内容，系统会把他们按照输入的顺序放在内存当中，这段内存就叫做键盘缓冲区 键盘缓冲区保留了用户输入的所有的字符包括回车，甚至多行都在里面（复制，粘贴这种情况下） 除了%c（指定读取字符）， scanf在从缓冲区提取数据的时候，会把上一行输入的回车留在键盘缓冲区当中 下次读取非字符类数据的时候会自动过滤这个回车，但是读取字符类型就会把这个回车键读取出来 例如 第一行要输入一个整数，第二行要输入一个字母这种需求，就需要特殊处理 第一行输入整数，并回车；scanf获得了整数，但是回车还在缓冲区里面，如果再scanf（“%c”）就会返会你不想要的这个回车了 要过滤掉这个回车，就用getchar（） 然后再scanf的时候， 输入字母再回车，就可以正常获得输入的字母了  仔细看scanf的帮助函数吧

user: user-2
content: 大致可以理解为就是读取回车符
user-0 提问: 这里的elementtype是tree node吗

回复:
user: user-0
content: 赫夫曼树第一句写 假设H->Size个权值已经存在H->Elements[]->Weight里。是不是就等价于H->Elementtype等于TreeNode。

user: user-0
content: 引用 3 楼 寻开心的回复:显然不是啊。   你可以对一堆整数排序， 也可以对一堆浮点数排序， 到底对什么类型排序， 是在ElementType里面定义的 定义那里也明确了， ElementType * data;  这是一个数组。  堆排序是利用了树结构， 但是ElementType是节点里面的数据， 并不是节点啊 https://www.cnblogs.com/MOBIN/p/5374217.html， 你再好好看看吧 那insert那句解释 将新T插入最小堆。T是一个树节点，而最小堆是一个elementtype的数组，为什么能够插入。

user: user-1
content: 实际使用当中哈夫曼树里面ElementType的结构应该是是      struct ElementType {               char ch;               float Weight;       }  这样的东西，每个字符，占据的百分比。  它是一个结构数据，哈夫曼树是要根据每个字符的权重不同来设置不同的编码， 权重越大编码越短 struct  TreeNode  {       ElementType data;       TreeNode *left, *right; }  这样的结构才是完整的， 否则光有weight是对谁做编码啊？！  堆排序是堆排序， 哈夫曼树是哈夫曼树，  两套伪代码都是出于各自的目的而编写的， 没有合并到一起呢  ElementType就是要排序和处理的数据的类型， 它并不是树节点， 树节点是要包含ElementType以及Left，Right这些关联关系的数据的

user: user-1
content: 显然不是啊。   你可以对一堆整数排序， 也可以对一堆浮点数排序， 到底对什么类型排序， 是在ElementType里面定义的 定义那里也明确了， ElementType * data;  这是一个数组。  堆排序是利用了树结构， 但是ElementType是节点里面的数据， 并不是节点啊 https://www.cnblogs.com/MOBIN/p/5374217.html， 你再好好看看吧

user: user-0
content: 引用 1 楼 寻开心的回复:上面整个堆排序，下面整个哈夫曼树， 这是闹那样啊？！  ElementType往往指的是用户自定义的数据类型，任何类型都可以。  它可以是int、float、struct...  就是用来排序的数据的类型 就是insert为什么一个节点可以直接插入堆，这是不是说堆的数据单位是树结点

user: user-1
content: 上面整个堆排序，下面整个哈夫曼树， 这是闹那样啊？！  ElementType往往指的是用户自定义的数据类型，任何类型都可以。  它可以是int、float、struct...  就是用来排序的数据的类型
user-0 提问: 用函数求最大公约数最小公倍数

回复:
user: user-1
content: https://baike.baidu.com/item/%E6%9C%80%E5%B0%8F%E5%85%AC%E5%80%8D%E6%95%B0/6192375?fr=aladdin

user: user-2
content: 百度都有的，做法也很多滴
user-0 提问: if语句判定

回复:
user: user-0
content: 引用 10 楼 初学小菜的回复:这个if不加括号就执行一个语句而且还是得在满足条件的时候才执行，不满足就跳过这一个语句，你的目的是想执行3个语句 明白了明白了，多谢指教。

user: user-0
content: 引用 11 楼 寻开心的回复:自己把代码整理一下， 按照分号分开，一句一行 结果如下 if (intA<intB)       intT = intA; intA = intB; intB = intT;  // 0就是这么出来的  if (intB<intC) .....  第一个if语句判断不成功， 所以就执行了 intA=intB这一句，以及后面的。。。  楼上那么多层都在说让你加括号，变成 if ( intA<intB) {      intT = intA;      intA = intB；     intB = intT； } if (intB<intC) {    。。。。  这样才是完整的if要执行的思路。  看看书上的例子， 是如何写代码的， 要学习书上的编码习惯 懂了懂了，是我的思路错了还有一些细节问题，感谢纠正。

user: user-1
content: 自己把代码整理一下， 按照分号分开，一句一行 结果如下 if (intA<intB)       intT = intA; intA = intB; intB = intT;  // 0就是这么出来的  if (intB<intC) .....  第一个if语句判断不成功， 所以就执行了 intA=intB这一句，以及后面的。。。  楼上那么多层都在说让你加括号，变成 if ( intA<intB) {      intT = intA;      intA = intB；     intB = intT； } if (intB<intC) {    。。。。  这样才是完整的if要执行的思路。  看看书上的例子， 是如何写代码的， 要学习书上的编码习惯

user: user-2
content: 这个if不加括号就执行一个语句而且还是得在满足条件的时候才执行，不满足就跳过这一个语句，你的目的是想执行3个语句

user: user-2
content: 首先不执行第一个if语句，然后执行把a=b,b=t,然后执行下一个

user: user-0
content: 引用 7 楼 初学小菜的回复:不是不执行…… 那是什么……………

user: user-2
content: 不是不执行……

user: user-0
content: 引用 5 楼 初学小菜的回复:……一步一步跑一下就知道呗 如果像你说的那样，不执行后面那几个的话，那他的结果肯定不是5 0 3，你说呢

user: user-2
content: ……一步一步跑一下就知道呗

user: user-0
content: 引用 1 楼 初学小菜的回复:不加花括号就执行一个，你要是三个都想执行就是用，分开别用; 是这样吗？那它的结果为什么5 0 3

user: user-2
content: 引用 2 楼 初学小菜 的回复：养成良好的代码习惯，加上局面括号

user: user-2
content: 养成良好的代码习惯，加上局面

user: user-2
content: 不加花括号就执行一个，你要是三个都想执行就是用，分开别用;
user-0 提问: 求解，感谢

回复:
user: user-1
content: int main() { 	int i,n,m,a[1001],k=-1,b[1001]; 	scanf("%d",&n); 	for(i=0;i<n;i++) 	{ 		scanf("%s%d%d",stu[i].a,&stu[i].n1,&stu[i].n2); 	} 	scanf("%d",&m); 	for(i=0;i<m;i++) 	{ 		scanf("%d",&a[i]); 		for ( int j=0; j<n; j++) { 			if ( a[i] == stu[j].n1) { 				b[i]=j; 				break; 			}; 		} 	} 	for(i=0;i<m;i++) 	{ 		printf("%s %d\n",stu[b[i]].a, stu[b[i]].n2);	 	} return 0; }

user: user-1
content: for(i=0;i<n;i++) {        //  scanf("\n"); // 没有必要         scanf("%s%d%d",  stu[i].a,&stu[i].n1,&stu[i].n2); } 这里scanf的时候， 读取a的时候不能取地址，数组名字本身就是地址了   然后你读取m后，循环判断a[i] == stu[i].n1 这个也不对， 应该再开一个循环比对stu[j] 才对吧
user-0 提问: 求助！有关segmentation fault

回复:
user: user-0
content: 引用 1 楼 寻开心的回复:scanf("%s %lf %s", a[i].name, a[i].age, a[i].tel);  age要取地址啊，  name和tel是数组，本身就是地址。 age是double类型，输入数据需要取地址的 啊我傻了现在正常了，谢谢你啊！

user: user-1
content: scanf("%s %lf %s", a[i].name, a[i].age, a[i].tel);  age要取地址啊，  name和tel是数组，本身就是地址。 age是double类型，输入数据需要取地址的
user-0 提问: PTA 1002 A+B for Polynomials 为什么测试点2过不了？

回复:
user: user-1
content: 直接怼哈希表 再逆序排序一下 #include<iostream> #include<map> #include<string> using namespace std; int main() {     map<int,double> fp;     int T=2;     while(T--)     {         int n;         cin>>n;         for(int i=0;i<n;++i)         {             int a;             double b;             cin>>a>>b;             if(!fp.count(a)) fp.emplace(a,b);             else fp[a]+=b;             if(fp[a]==0) fp.erase(a);         }     }     int size=fp.size();     cout<<size;     map<int, double>::reverse_iterator it;     for(it= fp.rbegin();it!=fp.rend();++it)     {         cout<<" ";         cout<<it->first<<" ";         printf("%.1lf",it->second);     }     return 0; } ```c++    ```

user: user-0
content: 引用 1 楼 初学小菜 的回复:一看就是数组越界了，你往大开开不就行了 额，我第一次的代码我觉得不会数组越界。K就10个，while判断里也不会越界啊，我不大会用c++，能跟我详细说下吗？

user: user-2
content: 一看就是数组越界了，你往大开开不就行了

user: user-0
content: 引用 6 楼 初学小菜 的回复:你可以参考一下，做oj题目不建议这么开动态数组，要不就是静态要不就是stl 嗯嗯，你说的对，我正在学着改，谢谢你的回复

user: user-0
content: 引用 3 楼 寻开心 的回复:while (i < k1 || j < k2) {         if (j == k2 || n1[i] > n2[j] ) { 当  j <k2， i==k1的时候会如何？    while条件满足       if 的第一个条件不满足，会执行第二个条件的判断：   n1[i]>n2[j]       此时i为k1， n1[k1] 越界了  类似的 i<k1,  j==k2的情况也会越界  这就是while语句里面的 || 条件的锅; 你的第二种写法就没有这个问题了 你是对的！！是我的判断写错了

user: user-2
content: 你可以参考一下，做oj题目不建议这么开动态数组，要不就是静态要不就是stl

user: user-2
content: #include <iostream> #include <iomanip> using namespace std; double a[1005]; int main(){ 	int n,k,x,m,count = 0; 	double y; 	cin>>m; 	for(int i = 0; i < m; i++){ 		cin>>x>>y; 		a[x] += y; 	} 	cin>>m; 	for(int i = 0; i < m; i++){ 		cin>>x>>y; 		a[x] += y; 	} 	for(int i = 0; i < 1001; i++){ 		if(a[i] != 0) count++; 	}  	cout<<count; 	for(int i = 1001; i >= 0; i--){ 		if(a[i] != 0){ 			cout<<" "<<i<<" "<<setiosflags(ios::fixed)<<setprecision(1)<<a[i]; 		} 	} 	return 0; }

user: user-2
content: 测试点2过不了，应该是当系数为负数是你的代码输出不了，你可以试一下

user: user-3
content: while (i < k1 || j < k2) {         if (j == k2 || n1[i] > n2[j] ) { 当  j <k2， i==k1的时候会如何？    while条件满足       if 的第一个条件不满足，会执行第二个条件的判断：   n1[i]>n2[j]       此时i为k1， n1[k1] 越界了  类似的 i<k1,  j==k2的情况也会越界  这就是while语句里面的 || 条件的锅; 你的第二种写法就没有这个问题了
user-0 提问: 【求助】realloc函数错误

回复:
user: user-0
content: 引用 1 楼 user-1的回复:把realoc后面的*sizeof（int）刚到realoc的括号里，即改为LISTINCREMENT*sizeof（int） 解决了，谢谢大佬

user: user-1
content: 把realoc后面的*sizeof（int）刚到realoc的括号里，即改为LISTINCREMENT*sizeof（int）
user-0 提问: 一道C语言问题求解

回复:
user: user-1
content: 指代和内存占用不同，int:定义整数类型变量的标识符。需声明无符号类型的话就需要在类型前加上unsigned。

user: user-2
content: int fi(unsigned int i) { 	return (int)i > 0 ? 1 : -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: user-0
content: 引用 4 楼 user_qym 的回复：送你一个AC代码: #include<bits/stdc++.h> using namespace std; int g[15],cnt,lx[35],ly[35],k[15],n; void dfs(int x) { 	if(x>n) 	{	 		cnt++; 		if(cnt<=3) 		{ 			for(int i=1;i<n;i++) 				cout<<g[i]<<" "; 			cout<<g[n]<<endl; 		} 		return; 	} 	else 	{ 		for(int i=1;i<=n;i++) 		{ 			if(!k[i] and !lx[x-i+n] and !ly[x+i]) 			{ 				k[i]=1; 				lx[x-i+n]=1; 				ly[x+i]=1; 				g[x]=i; 				dfs(x+1); 				k[i]=0; 				lx[x-i+n]=0; 				ly[x+i]=0; 				g[x]=0; 			} 		} 	} } int main() { 	cin>>n; 	dfs(1); 	cout<<cnt; 	return 0; }谢谢哦～

user: user-2
content: 送你一个AC代码: #include<bits/stdc++.h> using namespace std; int g[15],cnt,lx[35],ly[35],k[15],n; void dfs(int x) { 	if(x>n) 	{	 		cnt++; 		if(cnt<=3) 		{ 			for(int i=1;i<n;i++) 				cout<<g[i]<<" "; 			cout<<g[n]<<endl; 		} 		return; 	} 	else 	{ 		for(int i=1;i<=n;i++) 		{ 			if(!k[i] and !lx[x-i+n] and !ly[x+i]) 			{ 				k[i]=1; 				lx[x-i+n]=1; 				ly[x+i]=1; 				g[x]=i; 				dfs(x+1); 				k[i]=0; 				lx[x-i+n]=0; 				ly[x+i]=0; 				g[x]=0; 			} 		} 	} } int main() { 	cin>>n; 	dfs(1); 	cout<<cnt; 	return 0; }

user: user-0
content: 哦不对，这个是全局变量的问题sorry，我用得不熟练就搞错了

user: user-0
content: 我后来又改了，是一处语句位置出了问题，多谢啦

user: user-3
content: 你可以看一下我写的八皇后，对比一下，我觉得可能是没记录走过的位置，回朔的时候没释放走过的位置，你这个条件太多可能漏写
user-0 提问: 【二进制漏洞相关】fscanf读取shellcode时遇到0x0A时读取停止

回复:
user: user-1
content: 这也牵涉到文件的存储格式， 二进制文件格式是要明确的知道这种数据的长短的，你不能放一个非固定长度的数据到二进制文件里面去 字符串这种数据二进制保存的时候，都是先写入一个整数，表示字符串的长度，再写入对应长度的数据。这样二进制读取的时候，先读区出长度，再读区指定长度的数据放到字符串里面去的。

user: user-1
content: 二进制文件，你就不能用fscanf这种命令，要用的是fread，读取固定的长度进来

user: user-1
content: fscanf（或者fgets）和scanf的区别就是， scanf不会把回车读入， fscanf会把回车读入的 最简单的办法，把读入的字符串用strlen计算一下长度，然后把最后的一个字符用'\0'替换就好了

user: user-2
content: 修改你的 shellcode。fscanf 的限制是没法改变的，除非你可以直接获取该进程内存的读写权。

user: user-0
content: 引用 1 楼 真相重于对错的回复:想一下当你用scanf时候 scanf("%d %d",&a,&b)是怎么输入的？靠什么来决定两个数的哪个是哪个？ 靠的是分隔符，空格可以作为分隔符。因此你不要用fscanf获取，而用fgets 额。。目前思考是源码改不了的情况，他那边就是先fopen文件然后用fscanf输入字符串的

user: user-3
content: 想一下当你用scanf时候 scanf("%d %d",&a,&b)是怎么输入的？靠什么来决定两个数的哪个是哪个？ 靠的是分隔符，空格可以作为分隔符。因此你不要用fscanf获取，而用fgets
user-0 提问: 救救孩子吧，分数都给你

回复:
user: user-1
content: 这怕不是寒假作业吧  这类玩意在市场上还是明码标价的，没人会为了没用的分数特地给你写的，除非是真的闲  自己写写看吧，有具体问题再问
user-0 提问: 蓝桥杯2016年本科b组第六题，想用一个递归去写结果和正确答案不一致

回复:
user: user-1
content: 0~9，你是不是弄成1~10了，

user: user-0
content: 老哥厉害，我太粗心了，忽略了它其实是十个数字

user: user-2
content: 递归提前结束了 if(num1==10) //这里应该改成num1==11，因为要排10个数，你main方法是从1开始排的a[i][j]=1;，排10个数的话num1最终要变到11才算10个数排满 更直观一点的做法就是把数组的0都初始化为-1，然后main从0开始a[i][j]=0;，每次排完还原成-1，这样的if(num1==10)用10就可以了
user-0 提问: 5647: C实验题：玩命的复读机  结果对了 但是总是runtime error

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

user: user-1
content: void fdj(char *p) {     char * q = p；     for(p;*p;p++)     {         printf("%c",*p);     }     printf("\n");     free(q); }  或者 void fdj(char *p) {     printf("%s\n", p);     free(p); }

user: user-0
content: 指针我刚刚学 虽然懂了你们说哪里错了 但是改不来，正确的程序能看看吗，我不知道怎么回复你们，这个网站还不会用.....

user: user-2
content: for(p;*p;p++) 这里p变了 free(p); //所以这里释放的内存地址就不对了

user: user-3
content: 要不就不要修改 p，直接 printf %s，要不就保存原始指针的副本，然后再 free，不然肯定出错。
user-0 提问: 求助，为什么这样输入输出字符串不报错

回复:
user: user-1
content: 数组就是一片连续的内存地址，scanf只是把你输入的字符串（%s形式）存入了数组首地址开头的这块内存，所以只要这片内存合法，就可以输入。 换个方式来讨论，比如 int a = 5; char *c = (char*)&a; scanf("%s", c); //字符指针接收输入字符串，这样你就没问题了吧。但其实这个字符指针指向的是int的地址，这个和你用int数组接收字符串是一个道理，就是往一块内存区域保存输入内容

user: user-0
content: 引用 1 楼 qybao的回复:数组就是一片连续的内存地址，scanf只是把你输入的字符串（%s形式）存入了数组首地址开头的这块内存，所以只要这片内存合法，就可以输入。 换个方式来讨论，比如 int a = 5; char *c = (char*)&a; scanf("%s", c); //字符指针接收输入字符串，这样你就没问题了吧。但其实这个字符指针指向的是int的地址，这个和你用int数组接收字符串是一个道理，就是往一块内存区域保存输入内容 很详细，十分感谢，我明白了！

user: user-2
content: 这种操作叫做未定义行为，其最可怕之处在于：它是错的，然而它有时候就是不发作，但一旦发作，一般都很要命。所以请规范编码。
user-0 提问: 关于C语言scanf语句的疑问

回复:
user: user-1
content: 不一样的，如果是整数形式，输入非整数，直接就返回文件结尾，所以拿不到输入结尾的 当然如果输入缓存没被清空（stdin没有fflush）的话，所以你可以继续读取字符getchar之类的来获取输入字符，最终也能拿到输入结尾

user: user-0
content: 引用 1 楼 user-1的回复:可以的 对于字符的输入结尾结尾来说一般是'\n'换行符，对应的ascii码是10 文件结尾符是EOF，可以通过scanf的返回值来直接获得，输入结尾符只能在输入字符串的字符里获得，也就是要判断数组元素是否为'\n' 如果输入的是整数的话，文件结尾与输入结尾一样是吗？

user: user-1
content: 可以的 对于字符的输入结尾结尾来说一般是'\n'换行符，对应的ascii码是10 文件结尾符是EOF，可以通过scanf的返回值来直接获得，输入结尾符只能在输入字符串的字符里获得，也就是要判断数组元素是否为'\n'
user-0 提问: 求助！大佬们用c就行

回复:
user: user-1
content: 引用 2 楼 qybao 的回复：题目要求不够严谨吧，如果k=n-1，那么留哪个？因为不管留哪个，最大值和最小值都是自己，差都为0k=n-1，这没问题啊。题目要求输出差值，这个情况输出0。

user: user-0
content: 引用 2 楼 qybao的回复:题目要求不够严谨吧，如果k=n-1，那么留哪个？因为不管留哪个，最大值和最小值都是自己，差都为0 学长出的题，当时也是这样说的，所以默认少于n-1

user: user-0
content: 引用 1 楼 初学小菜的回复:是没有思路嘛？还是就想要代码呢 代码。。。。。。。。

user: user-2
content: 题目要求不够严谨吧，如果k=n-1，那么留哪个？因为不管留哪个，最大值和最小值都是自己，差都为0

user: user-3
content: 是没有思路嘛？还是就想要代码呢
user-0 提问: c语言switch不管执行哪个case都会执行到default

回复:
user: user-1
content: scanf函数返回的是成功输入的个熟,不是传进去的东西

user: user-2
content: 在这回答一下，刚才也遇到了，方便后人查看吧。scanf确实有读取缓存的问题，会把回车当做下一个循环输入的值，所以可以在scanf下一句加个getchar();来吃掉这个缓存区的回车，有效解决了case与default同时输出的问题。

user: user-3
content: 引用 7 楼 qq_46239680 的回复:[quote=引用 3 楼 gouyanfen 的回复：]明显scanf的问题，你输入了一个字符，第一次读入了这个字符，循环第二次读入了你输入的回车符，所以你每次输入X回车，循环了两次 解决办法进入switch后清空缓冲或者不用scanf用getch我试了两种办法 都可以解决我刚刚的问题 [/quote] 有用及时结贴，谢谢

user: user-0
content: 引用 3 楼 gouyanfen 的回复：明显scanf的问题，你输入了一个字符，第一次读入了这个字符，循环第二次读入了你输入的回车符，所以你每次输入X回车，循环了两次 解决办法进入switch后清空缓冲或者不用scanf用getch我试了两种办法 都可以解决我刚刚的问题

user: user-0
content: 我刚刚试了getchar效果是一样的

user: user-3
content: 引用 4 楼 qq_46239680 的回复:请问如何清空缓存啊 我试了getchar但是有些字母变成了乱码 我说是用getch不是getchar两个是不同的函数getch不需要回车就会返回。 请空flush(stdin)

user: user-0
content: 请问如何清空缓存啊 我试了getchar但是有些字母变成了乱码

user: user-3
content: 明显scanf的问题，你输入了一个字符，第一次读入了这个字符，循环第二次读入了你输入的回车符，所以你每次输入X回车，循环了两次 解决办法进入switch后清空缓冲或者不用scanf用getch

user: user-0
content: 这有啥区别吗 不都是返回default里的值吗 ch会不会也是不管怎么样都执行一次

user: user-4
content: 你为啥不printf ch一下
user-0 提问: C语言if问题

回复:
user: user-1
content: a/b那里有问题，这里是整除了，你可以乘一个浮点数进行运算

user: user-0
content: 引用 1 楼 初学小菜的回复:那就说明sum只满足if那个条件呗 不不不，就是怎么换都是只输出ok

user: user-1
content: 那就说明sum只满足if那个条件呗
user-0 提问: 为什么运行结果不完整？

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

user: user-1
content: 如果只是要反转，用不到true==1 这些判断啊 。也无需判断n是否为偶数。 完整的题目要求是什么呢？ 只是把输入的n位整数反转的话，一个循环交换就可以了 for ( I=0, j=n-1; I<n/2; I++, j-- ) { int temp =a[I]; a[I]=a[j]; a[j]=temp; };   可能需要考虑的只是，100这种数倒过来是001，还是要当作1输出呢

user: user-1
content: for(int i=n;i>n/2;i--) {.  // i要从n-1开始，否则 a【i】就越界了
user-0 提问: c语言练习题求助：有关二维指针存储多行文本以及动态分配问题

回复:
user: user-0
content: 求助：多⾏⽂本⽤char** text来进⾏存储，使⽤动态分配内存为其开辟内存空间，避 免内存空间的浪费。 在遍历的过程中，保障性能⾼效。 要如何实现
user-0 提问: c语言小学生求帮助

回复:
user: user-1
content: main尽管是主函数，但是也是函数，作为函数基本格式是：函数返回值类型 函数名（参数列表）{函数体} 例如：int main（） {     return 0； } 没有返回值可以是void（当然c中是这样，c++就要求是int main了）

user: user-2
content: int  main()
user-0 提问: 请大佬瞧一瞧，我有点懵

回复:
user: user-1
content: 达标了 还可以这样 int *p = a+k-1;                 // p就是&a【k-1】 也就是第k个元素 while ( p < a +n -1) {       // p没有到最后一个元素    *p = *(p+1);    p++; }; *p = 0; // 最后一个用0填充就更好了

user: user-0
content: 引用 5 楼 寻开心 的回复:达标了 还可以这样 int *p = a+k-1;                 // p就是&a【k-1】 也就是第k个元素 while ( p < a +n -1) {       // p没有到最后一个元素    *p = *(p+1);    p++; }; *p = 0; // 最后一个用0填充就更好了 谢谢

user: user-0
content: okk,谢谢大佬帮助

user: user-2
content: 从思路或者功能上来说是对的。这是实现方式的问题，题目要求用指针，我的理解是用memcpy之类的方式来完成，你现在的方式还是相当于数组遍历，指针的意义不大。 另外，pi[i]=a[i+1]; 这里会造成数组越界（i=9时，i+1=10）  我理解的做法是 输入k，判断k是否在0-9之间，不在则结束程序（提示删除位置不对） 如果k==8，则直接舍弃最后一项（也就是打印前9项），如果k<8，则memcpy(&a[k], &a[k+1], (9-k)*sizeof(int)) ，然后打印前9项

user: user-0
content: 引用 1 楼 寻开心 的回复:功能是对的， 但是不是用的指针，而且也应该在原来的数组里面删除，不要借助另外一个。 #include<stdio.h> int main() { 	int a[10]={1,2,3,4,5,6,7,8,9,10}; 	int i,k,n=10,*p=a; 	printf("input k="); 	scanf("%d",&k); 	for(i=k-1;i<n;i++)    		*(p+i)=*(p+i+1);         n--; 	printf("After delete:\n");     for(i=0;i<n;i++)          printf("%d ",a[i]);     return 0; } 请问这次可以吗？

user: user-1
content: 功能是对的， 但是不是用的指针，而且也应该在原来的数组里面删除，不要借助另外一个。
user-0 提问: 求助,为什么程序逐步调试的结果和直接运行的结果不同

回复:
user: user-1
content: srand(time(NULL)); 从create函数里面拿出来，放到main函数里面第一条去执行  整个程序当中srand函数只需要调用一次就好了  运行的时候， 执行很快， time（NULL） 返回的都是同一个值， sround初始化的结果就相同 调试的时候， 一步一步走， time（NULL）返回的值就不同，所以结果会不同 ps time（NULL）返回的是当前到1970/1/1/0:00时刻的秒数，作为随机数的初始化种子使用

user: user-2
content: srand 的时机错了，导致每次播种的种子都是一样的，所以结果不随机。
user-0 提问: c语言基础问题，请大佬们指点

回复:
user: user-0
content: 好的，明白你的意思了

user: user-1
content: 用你原来main方法 void main () {     int i;     int arr[10]={0}; int crr[10]={132101,113002,115703,182304,132105,113006,113007,132308,192109,177715};      msdradix_sort(crr,0,9,6,1);     for(i=0;i<10;i++) { printf("%d",crr[i]); //这里换成打印crr，你就能理解我说的是什么意思了 printf("\n"); } }

user: user-1
content: 我都说了，你的排序方法msdradix_sort(int arr[],int begin,int end,int w,int in) 的参数arr就是个传入传出参数，排序结果就保存在参数arr里，如果你只是希望arr和crr不一样，那最简单的方法就是 void main () {     int i;     int arr[10]={0}; int crr[10]={132101,113002,115703,182304,132105,113006,113007,132308,192109,177715};     memcpy(arr, crr, sizeof(crr)); //把crr复制给arr      msdradix_sort(arr,0,9,6,1); //直接用arr作为参数，因为排序结果就保存在arr里     for(i=0;i<10;i++) { printf("%d",arr[i]); printf("\n"); } }

user: user-0
content: 补充一下，我想将crr这个数组作为参数输入函数并得到一个名字不一样的排序结果arr

user: user-0
content: 排序结果是arr呀，怎么是crr

user: user-1
content: 你的arr都没用到，也没传到排序方法里 看排序方法，好像排序好的结果也是存在crr，那你直接打印crr就好了
user-0 提问: if嵌套语句执行顺序

回复:
user: user-1
content: 是的，就是这么回事，除非第一个if后面有花括号把它后面的内容括起来，否则跟第二个if没关系

user: user-0
content: 引用 1 楼 user-1的回复:哪有if嵌套？ 第一个if是独立的 第二个if和else if和else是一套的 这么说那第一个if成立也执行第二个if，不成立也执行第二个if？

user: user-1
content: 哪有if嵌套？ 第一个if是独立的 第二个if和else if和else是一套的
user-0 提问: C语言关于strcpy函数的问题求解

回复:
user: user-1
content: 好好查看文档说明，理解一下strcpy的参数的意义 拿你的例子来说 aaaccc （开始的字符串） pq（当前指针的位置，p对第一个a，q对第二个a） printf("%s\n", q);打印q地址开始的字符串就是 aaccc（从第二个a开始打印） 到这里没问题吧 strcpy(p,q); 就是把q地址开始的字符串拷贝到p地址开始的内存里，也就是把 aaccc 拷贝到 第一个a开始的位置 所以拷贝后的内存为 aaccc pq（p和q地址不变，但字符串往前挪了） printf("%s\n", q); p和q的位置没变，打印q地址开头的字符串就是 accc  也就是p和q的地址不变，但字符串的往前挪了一个位置，所以q就相当于指向下一个字符串元素

user: user-0
content: 好的我明白了。一开始没注意
user-0 提问: devcpp 调试中的[下一步]按钮不亮

回复:
user: user-1
content: 应该不会，发个图看看，是不是哪弄错了

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:打断点，点调试 你还没开始调试呢，哪来下一步 点了断点和调试了 它仍然是灰色的）

user: user-1
content: 打断点，点调试 你还没开始调试呢，哪来下一步
user-0 提问: 求解

回复:
user: user-1
content: 我怎么觉得这是物理学的追及问题，一只蛙在x位置以速度为m向西行走，另一只蛙在y位置以速度为n向西行走，问两只蛙何时能追及？ 只要两个速度不一样，必然能追上，把速度快的放在后面，速速慢的放在前面（因为只有速度快的追上速度慢的），两者的初始相聚距离为（假设x在前，y在后，即x>y），如果速度快的在前则相距为 L+x-y(相当于要多绕一圈才追上)，如果速度快的在后，则相距为x-y，根据物理的追及公式计算就可以了 所以 只要 m!=n 并且 (x-y)%|m-n| == 0 或者 (L+x-y)%|m-n| == 0就可以追及 追及时跳跃次数为 (x-y)/|m-n| 或者  (L+x-y)/|m-n|
user-0 提问: 各位大佬，请问这个怎么改

回复:
user: user-0
content: 嗯，问题解决了，谢谢

user: user-1
content: double root(double n, double p, double q, double r, double t) {     double f = 1.0;     for (int i=0; fabs(f)>1e-5; f=(p*pow(n,3)+q*pow(n,2)+r*n+t)/(3*p*pow(n,2)+2*q*n+r), n-=f, i++);     return n; }  这里要有个初始化， 否则。 fabs(f)>1e-5 这个条件就没有成立
user-0 提问: C语言if问题

回复:
user: user-1
content: while(i<b){ //是不是该对b做一些限制， c=s[I]; //否则b大于6，一直猜不中的话s就会数组越界 另外，a后续都没用到，特意输入a有什么意义吗？

user: user-0
content: #include<stdio.h> int main() { int a,b,i=0,c; int e; int count=0; scanf("%d%d",&a,&b); int s[6]; for(e=0;e<6;e++){ scanf("%d",&s[e]); } while(i<b){ c=s[i]; if(c==b){ break; } else{ if(c>b){ printf("Too big\n"); } if(c<b){ printf("Too small\n"); } i++; }  count++; } if(count==1) printf("Bingo!\n"); else{ if(count<=3&&count>1) printf("Lucky You!\n"); if(count>3&&count<=b) printf("Good Guess!\n"); if(count==0) printf("Game Over\n"); }  return 0; }

user: user-0
content: 我知道哪的问题了，谢谢你们

user: user-2
content: 既然if条件无伦是否满足都要执行，那干嘛还要if啊， 去掉if呗， 直接执行拉到

user: user-1
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: 解引用空指针。

user: user-3
content: *q = NULL; //q是空指针（也就是p指向一个无效的地址），所以 *q = *(p+5); //这里会发生空指针错误（也就是不能往p指向的地址里写信息）
user-0 提问: 请问为什么这个for循环只执行了一次鸭

回复:
user: user-1
content: 循环条件s<x， 就看你x输入了什么了，因为第一次循环后，s=s+f 增大了，s可能就不满足循环条件了。 另外，n最好初始化为0，否则n有可能统计的不对

user: user-2
content: 循环的判断条件问题

user: user-3
content: scanf 的输入格式， 好好看看。  指定的格式， 和后面配合的变量之间类型必须匹配， 不匹配获得的结果就不对  你的代码用lf格式，要求的就是一个double类型的地址， 而x是long double doube 是64bits的浮点数，  long double 是128bits的浮点数，  他们不匹配  所以，你输入的是4.3， 实际上x获得的结果还是0呢

user: user-3
content: #include<stdio.h> int main() { long double x,f=2; int n;  // 这里没有初始化，应该是int n=0； scanf("%lf",&x); // lf是double， Lf才是long double； x和f没有必要long double， double足够了 // lf 和 long double 搭配， 输入的x就不是你想要的。  这里增加一个printf函数，你能看到输入的4.3，变成了0   for(long double s=0;s<x;n++) { s=s+f; f=f*0.98; } printf("%d",n); }

user: user-0
content: 输入4.3，输出的n为什么为0鸭
user-0 提问: notepad++配置c编译 出现问题

回复:
user: user-1
content: 引用 1 楼 N-n-N 的回复:环境变量没有设置？看截图，成功执行gcc是在notepadproject目录下执行的你试试在其他路径下面执行成不成功

user: user-1
content: 环境变量没有设置？看截图，成功执行gcc是在notepadproject目录下执行的
user-0 提问: 关于用指针交换两个数

回复:
user: user-1
content: 那你的意思就是说他第一段代码交换了那两个变量的地址了？但实际上并没有交换。只是把变量的地址值传给了swap()。

user: user-2
content: 引用 38 楼 咸鱼自翻身的回复:交换地址怎么可以用一级指针。。。要用二级指针啊。 一级指针是地址二级指针也是地址，交换的换就是地址交换了。

user: user-1
content: 交换地址怎么可以用一级指针。。。要用二级指针啊。

user: user-3
content: 第二个能实现但多此一举了，swap函数定义里你完全可以只用两个指针代替形参，声明一个整型变量用作中间交换

user: user-4
content: 交互地址的地址用二级指针。

user: user-0
content: 引用 32 楼 咸鱼自翻身的回复:想要交换地址肯定要用指针的指针啊，也就是二级指针。最重要的是函数参数的传递仅仅只是值传递，在第一段中只是把变量的地址值传过去了，而且swap（）并没有改变什么，两个变量的地址并没有被交换。你可以用printf("%d,%d",*(&a),*(&b));这个语句的输出结果与最初定义的变量a,b的值相比较来判断，如果相同则地址没交换，如果相反则地址交换了。但你的第一段的代码并没有交换地址。 是的。但是交换地址也可以用一级指针，可以参考31楼的说法。还有也可以用数组来交换。

user: user-0
content: 引用 31 楼 Changerman的回复:第一个 直接 int t； 用指针运算符去做交换就可以了 是的。主要是这两段程序的对比，你可以仔细看下。

user: user-1
content: 想要交换地址肯定要用指针的指针啊，也就是二级指针。最重要的是函数参数的传递仅仅只是值传递，在第一段中只是把变量的地址值传过去了，而且swap（）并没有改变什么，两个变量的地址并没有被交换。你可以用printf("%d,%d",*(&a),*(&b));这个语句的输出结果与最初定义的变量a,b的值相比较来判断，如果相同则地址没交换，如果相反则地址交换了。但你的第一段的代码并没有交换地址。

user: user-5
content: 搜索  "C 语言的参数传递"

user: user-2
content: 第一个 直接 int t； 用指针运算符去做交换就可以了

user: user-6
content: 终于有了一个我能看懂的帖子。。。

user: user-7
content: 每一个只是交换了指针，对原变量无影响。 第二个使xx，yy的内容发生了改变

user: user-8
content: 就是换了xx和yy的内容，一开始xx的内容是x的地址，yy是y的地址，x的内容是m的地址，y的内容是n的地址 现在交换*xx和*yy，也就是交换了xx和yy的内容，也就是xx指向了y，那么**xx就是xx取了两次值，也就是*y，就是n，这总行了吧

user: user-0
content: 引用 11 楼 與蘤舊縐的回复:是不是换了m和n的地址打印一下m和n就行，你会发现实际上是没有交换的 的确m，n没有交换，但是*xx，*yy的值变了。也就是说xx，yy的指向地址变了，跟第一段程序的效果是相同。但是第二段程序为什么会互换成功。我的疑问在这。

user: user-8
content: 是不是换了m和n的地址打印一下m和n就行，你会发现实际上是没有交换的

user: user-8
content: 4楼

user: user-8
content: 引用 8 楼 flamesP 的回复:引用 6 楼 與蘤舊縐 的回复:*是取值符号，p=q是把q的内容赋给p，但你要知道p和q的内容都是地址而不是m和n的值，这样的交换只是换了pq的指向而已，并没有交换m和n的值这个我明白，我的疑问是 在我的第2个例子中，*a = *b; 二级指针a，b改变的是一级指针x，y的指向，为什么这个地方就能改变两个数m，n的地址，成功互换两个数字。  上面跟你讲了

user: user-0
content: 引用 6 楼 與蘤舊縐 的回复:*是取值符号，p=q是把q的内容赋给p，但你要知道p和q的内容都是地址而不是m和n的值，这样的交换只是换了pq的指向而已，并没有交换m和n的值这个我明白，我的疑问是 在我的第2个例子中，*a = *b; 二级指针a，b改变的是一级指针x，y的指向，为什么这个地方就能改变两个数m，n的地址，成功互换两个数字。

user: user-8
content: 你要换的是*p和*q

user: user-8
content: *是取值符号，p=q是把q的内容赋给p，但你要知道p和q的内容都是地址而不是m和n的值，这样的交换只是换了pq的指向而已，并没有交换m和n的值
user-0 提问: c语言萌新来啦

回复:
user: user-1
content: 编译器问题，不必纠结

user: user-2
content: c++ 当然不支持，c 语言还有可能支持，而且你书上的写法太老了，建议按 1 楼的写法写。

user: user-3
content: int main(){ …… return 0; }  你书上这种写法还真从来没见过
user-0 提问: 用穷举法（三重循环）编写C语言程序

回复:
user: user-1
content: for (int i = 1; i < 10; i++) for (int j = 0; j < 10; j++) for (int k = 0; k < 10; k++) { if ((i*100+j*10+k)%11 == 0 && i!=j && j!=k && i%k) printf('%d%d%d\n",i,j,k); }

user: user-2
content: 需要三重循环吗，一重循环就好了 for (int i=123; i<1000; i++) {     if (i%11==0 && i%10 != (i%100)/10 && i%10 != i/100 && (i%100)/10 != i/100) { //整除11，并且个位!=十位，个位!=百位，十位!=百位         printf("%d\n", i);     } }

user: user-3
content: 题目说的很详细了，直接写就可以呀

user: user-4
content: for ( i=11*12; i<=(1000/11)*11; i+=11)       if ( i%10 != (i%100)/10 && i%10 != i/100 && (i%100)/10 != i/100)             printf("%d\n", i);  直接从11的倍数开始判断，三位是否相同； 每次自增11依然满足倍数关系
user-0 提问: 求大佬帮我逐行逐句解释这个函数中的每一条代码是什么意思！！

回复:
user: user-1
content: char *s_gets(char *st,int n) {     char *ret_val;     char *find;      ret_val = fgets(st,n,stdin);  // 当用户键入回车后，从键盘读取内容到st当中， 最多n个字符；   // 如果输入不到n个字符，那么fgets会把回车作为最后一个字符读入进来，回车后面是‘\0’ // 如果用户输入的超过了n个字符，那么只返回前n个字符， 后面还在键盘缓冲区当中      if (ret_val)     {         find = strchr(st,'\n');  // 检查st字符串当中是否包含了回车         if (find)             *find = '\0';  // 把字符串当中的回车替换为字符串结束标记。         else             while (getchar() != '\n')    continue;             // st当中没有回车，这就是输入长度超过n的情况，那么把键盘缓冲当中的其他字符都读取出来，知道把回车也读出为止               }     return ret_val; }  这个函数就自己实现的gets_s()函数     从键盘读不超过n个字符的一个字符串，并把键盘缓冲区当中的回车符也吸收掉     如果用户输入的字符超过n个，那么也只把前n个字符放到st当中，  后面的字符全部从键盘缓冲区当中清理掉，为后面输入清理现场

user: user-2
content: 引用 1 楼 N-n-N 的回复:看起来像早有没有换行看起来像找有没有换行

user: user-2
content: 看起来像早有没有换行
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: 引用 3 楼 寻开心的回复:贴文本的代码提问比较好，  图片的看着费劲 谢谢，下次一定注意，第一次发帖子

user: user-2
content: 贴文本的代码提问比较好，  图片的看着费劲

user: user-0
content: 解决了，答案是a！=0

user: user-0
content: 求大家帮帮忙，总共只有50分，全给出去了
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 m, n;     char c;     while  (T-- ) {          scanf("%d",  &m);          while( (c=getchar()) != '\n') {                 scanf("%d", &n);                 m = lcm(m,n);          }          printf("%d\n", m);     }

user: user-0
content: 引用 1 楼 寻开心的回复:第二个while语句不应当存在 改为：  while(T--) {    scanf（"%d%d", &m, &n);     i = ,,,, } 就好了 还是不对呀 输出的是： 2 3 5 7 15 15 105

user: user-2
content: 第二个while语句不应当存在 改为：  while(T--) {    scanf（"%d%d", &m, &n);     i = ,,,, } 就好了
user-0 提问: vc++ 6.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 楼 與蘤舊縐 的回复：+=和-=是并在一起的，不要有空格  另外C语言没有void main的写法 C99一般为int main() {return 0} C11为int main(void) {retuen 0}问题已解决 谢谢您 书上格式是这样的 三者有什么区别嘛！想请教下

user: user-2
content: +=和-=是并在一起的，不要有空格  另外C语言没有void main的写法 C99一般为int main() {return 0} C11为int main(void) {retuen 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: 非常感谢！！！！

user: user-2
content: 你这样少加了最后一项，因为最后一项小于e（题目要求），不满足for的循环条件没有进入循环体，所以漏加了 改成     double pi=0,j=1.0;     for(int i=1;;i++,j*=-1.0){         pi+=4*j/(2*i-1);         if (1.0/(2*i-1) < e) break;      }         return pi;
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 楼 與蘤舊縐 的回复：int num[4]表示定义一个int类型，长度为4的数组，该数组的下标从0开始，分别是0,1,2,3为什么题中只有一个1啊

user: user-2
content: int num[4]表示定义一个int类型，长度为4的数组，该数组的下标从0开始，分别是0,1,2,3

user: user-2
content: int n[4]={1}的意思是四个元素，每一个元素都是1
user-0 提问: 这种题大佬们能看明白吗，怎么做呀呀呀

回复:
user: user-0
content: 引用 4 楼 apkipa1 的回复:你百度一下编辑距离就能查到相关信息了，这里我帮你找了一些： CSDN 博客解法： https://blog.csdn.net/chichoxian/article/details/53944188 简书： https://www.jianshu.com/p/a617d20162cf 英文版维基百科，带算法： https://en.wikipedia.org/wiki/Edit_distance 谢谢谢谢

user: user-0
content: 题目链接是什么意思呀

user: user-1
content: 你百度一下编辑距离就能查到相关信息了，这里我帮你找了一些： CSDN 博客解法： https://blog.csdn.net/chichoxian/article/details/53944188 简书： https://www.jianshu.com/p/a617d20162cf 英文版维基百科，带算法： https://en.wikipedia.org/wiki/Edit_distance

user: user-2
content: 需要代码就发一下题目链接哈

user: user-0
content: 哦，谢谢

user: user-2
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: 在座的各位至少都会一点~~皮毛

user: user-3
content: 你要干嘛呀
user-0 提问: 请求解决

回复:
user: user-0
content: 引用 1 楼 寻开心的回复:隐藏不了， 这个是调试环境/IDE/VS自己模拟的一个环境，这些信息是IDE自带的  你编译出来的exe文件，在磁盘上找到它， 双击运行的时候就不会有这个提示  不用管它的 好的，谢谢帮忙。

user: user-1
content: 隐藏不了， 这个是调试环境/IDE/VS自己模拟的一个环境，这些信息是IDE自带的  你编译出来的exe文件，在磁盘上找到它， 双击运行的时候就不会有这个提示  不用管它的
user-0 提问: 为啥两个scanf语句在输入的时候会出错啊

回复:
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-3
content: &n,&m   少了&
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: 输入那里错了，加上&哈

user: user-3
content: 把scanf换成gets,vs2017上可以运行

user: user-0
content: 反而指定了长度会报错

user: user-0
content: 啊，我之前一直没指定过

user: user-4
content: scanf_s使用不是要指定长度吗
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: void	main() { 	struct stu 	{ 		int num; 		char name[20]; 		float c; 	}; 	struct stu s[5]; 	int i; 	for(i=0;i<4;i++) 	{ 		scanf("%d",&s[i].num); 		getchar();            //接收回车符 		gets(s[i].name); 		scanf("%f",&s[i].c); 	} 	printf("\nNo. Name C \n"); 	i=0; 	for(i=0;i<4;i++) 	{ 		printf("%-5d",s[i].num); 		printf("%-20s",s[i].name); 		printf("%-6.1f",s[i].c); 	}  	getchar(); } 输入方式为： 1 aa 100 2 bb 200 3 cc 300 4 dd 400

user: user-3
content: { 	struct stu 	{ 		int num; 		char name[20]; 		float c; 	}; 	struct stu s[5]; 	int i; 	for (i = 0; i < 4; i++) 	{ 		scanf("%d", &s[i].num); 		gets(s[i].name); 		scanf("%f", &s[i].c);  	} 	printf("\nNo. Name C \n"); 	i = 0; 	for (i = 0; i < 4; i++) 	{ 		printf("~%-10d", s[i].num); // 		printf("~%-20s", s[i].name); 		printf("~%-6.1f\n", s[i].c); 	} }

user: user-3
content: 如果你一定要使用这个代码的话，只能这样输入 201gaoxin 79 202lingpingzhi 82 203 yuelingshan 76 以此类推

user: user-0
content: 可以了,谢谢

user: user-0
content: 我改了您说的问题 可输入输出的还是有问题 如图 明明我想输的是5条数据,但我要输到第六条才能执行 输出的结果也不是预期的样子

user: user-2
content: 第一个问题： for(i=0;i<4;i++) { scanf("%d",&s[i].num); getchar();//这里需要加入这句，才能正常完成输入。 gets(s[i].name); scanf("%f",&s[i].c); } 第二个问题： for(i=0;i<4;i++) { printf("%-10s",s[i].num);//这里很明显不能用s，只能用d，因为你的数据类型是int printf("%-20s",s[i].name); printf("%-6.1f",s[i].c); }
user-0 提问: MQTT重连问题

回复:
user: user-1
content: 问题1：因为你进程最大的fd数量就是1024啊 估计底层用的select，所有已经句柄泄露了，再创建链接fd肯定申请不出来就会是-1 啊。问题2：client 放成员变量里，就不用connect失败就去destory了

user: user-2
content: 感谢提供了思路，我这也碰到相同的问题，不过没有你那个socketFd值的问题，我的是不断重连后会开启新的链接导致很多挂起的无用线程。我比较纳闷的是重连用了同样的clientId，为何不会报错呢？

user: user-3
content: 我也是遇到这个问题了，重连不会释放之前的client线程，导致线程溢出，请问你是怎么解决呢？

user: user-4
content: 这个搞不清楚。

user: user-0
content: 代码在公司，特殊时期在家不出门，在网上求问。
user-0 提问: 前面四个头文件都没问题，然后到了源文件出现SeqList矛盾，求大神解释

回复:
user: user-1
content: 没做好吧。 在每个.h的开头，马上加一个 #pragma once        (我的是c++) 你你这此文件实测，加上过后没问题，能生成

user: user-0
content: 现在加一个测试迪克迪特拉斯函数也是 (第六部分Dijkstra.h) #include<stdio.h>  #include"AdjMGraph.h"  void Dijkstra(AdjMGraph G,int v0,int distance[],int path[]) { 	int n=G.Vertices.size; 	int *s=(int *)malloc(sizeof(int)*n); 	int minDis,i,j,u; 	 	for(i=0;i<n;i++) 	{ 		distance[i]=G.edge[v0][i]; 		s[i]=0; 		if(i!=v0&&distance[i]<MaxWeight)path[i]=v0; 		else path[i]=-1; 	} 	s[v0]=1; 	 	for(i=1;i<n;i++) 	{ 		minDis=MaxWeight; 		for(j=0;j<n;j++) 			if(s[j]==0&&distance[j]<minDis) 			{ 				u=j; 				minDis=distance[j]; 			} 		if(minDis==MaxWeight)return; 		s[u]=1; 		for(j=0;j<n;j++) 			if(s[j]==0&&G.edge[u][j]<MaxWeight&&distance[u]+G.edge[u][j]<distance[j]) 			{ 				distance[j]=distance[u]+G.edge[u][j]; 				path[j]=u; 			} 	} }  (第七部分 测试迪克斯特拉函数.c) #include<stdio.h> #include<stdlib.h>  #include"AdjMGraph.h" #include"AdjMGraphCreate.h" #include"Dijkstra.h"  void main(void) { 	AdjMGraph g; 	char a[]={'A','B','C','D','E','F'}; 	RowColWeight rcw[]={{0,2,5},{0,3,30},{1,0,2},{1,4,8},{2,1,15},{2,5,7},{4,3,4},{5,3,10},{5,4,18}}; 	int i,n=6,e=9; 	int distance[6],path[6]; 	 	GreatGraph(&g,a,n,rcw,e); 	 	Dijkstra(g,0,distance,path); 	 	printf("从结点%c到其他各节点的最短距离为:\n",g.Vertices.list[0]); 	for(i=0;i<n;i++) 		printf("到结点%c的最短距离为%d\:n",g.Vertices.list[i],distance[i]); 		printf("从结点%c到其他各节点最短路径的前一结点为:\n",g.Vertices.list[0]); 		for(i=0;i<n;i++) 			if(path[i]!=-1) 				printf("到结点%c的前一结点为%c:\n",g.Vertices.list[i],g.Vertices.list[path[i]]); }

user: user-0
content: 不是，防包含会更混。。。错误更多

user: user-1
content: #pragma once 或者 #define .....

user: user-0
content: 以上是编译器结果，求大神解答
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: fopen w 或者 a

user: user-3
content: 创建文件的函数当然是有的，在向文件中写入数据的函数中添加参数，当文件不存在时先创建文件  这种情况下一般肯定是将账户信息和账户对应的数据分离开来，至于怎么联系，方法有很多，真想不出来大不了把文件名设置成用户名或用户id  进一步可以使用数据库存储数据
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: vc6 对浮点支持有坑，解决方案： 1. 在使用浮点数之前先初始化/赋值一个浮点对象。 2. 更换更新的开发工具，如 Visual Studio 2019。
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: 你是想问为什么程序会输出1000吧？那你就要看函数的递归和打印的顺序了 b=x%2; f(x/2); //先递归 printf("%d",b); //后打印 也就是函数会一直调用到最后一步才会逆推回来打印 最后一步递归，f(0)，递归结束返回0，回到倒数第二步递归f(1)的printf，参数x是1，b=x%2是1，所以打印1，然后递归结束返回0，回到倒数第三步递归f(2)的printf，参数是2，b=x%2是0，所以打印0，然后递归结束返回0，回到倒数第四步递归f(4)的printf，参数是4，b=x%2是0，所以打印0，然后递归结束，回到最初的函数调用f(8)的printf，参数是8，b=x%2是0，所以打印0，至此函数f(8)调用结束返回0。 所以最终打印结果为1000

user: user-0
content: 引用 1 楼 user-2的回复:你是想问为什么程序会输出1000吧？那你就要看函数的递归和打印的顺序了 b=x%2; f(x/2); //先递归 printf("%d",b); //后打印 也就是函数会一直调用到最后一步才会逆推回来打印 最后一步递归，f(0)，递归结束返回0，回到倒数第二步递归f(1)的printf，参数x是1，b=x%2是1，所以打印1，然后递归结束返回0，回到倒数第三步递归f(2)的printf，参数是2，b=x%2是0，所以打印0，然后递归结束返回0，回到倒数第四步递归f(4)的printf，参数是4，b=x%2是0，所以打印0，然后递归结束，回到最初的函数调用f(8)的printf，参数是8，b=x%2是0，所以打印0，至此函数f(8)调用结束返回0。 所以最终打印结果为1000 看明白了，谢谢大佬解答
user-0 提问: 同一行使用两个strlen()出现bug

回复:
user: user-1
content: strlen 返回值类型是无符号类型  j<strlen(p) 是无符号比较  如果 j 是 -1 无符号 -1 是 无符号最大数  比较结果0 退出循环  循环里面 if j== -1 这个条件无法成立  所以错误