Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 为什么执行是这个结果？不应该啊

回复:
user: user-1
content: main的crr和jscxc_sortc的crr不是同一个东西，要么把crr声明为全局变量，要么作为参数传到jscxc_sortc

user: user-2
content: 未初始化的局部变量，内容随机（运行N次，可能N次都不一样）。你的crr变量就是这种。 如果需要确定的值，需要明确初始化。  变量未初始化之前不要使用

user: user-3
content: crr未初始化，且中间未使用
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-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-0
content: 意思是输入n阶行列式，将行列式传递到函数中，将行列式最下面一行乘对应的数加到上面各行，变成 1350 2370 5480 1341这样。
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: 你用的fwrite，存放是二进制格式的东西，除了名字外，那些double之类的都是二进制的，所以是乱码。不碍事，只要功能对的就成了。存成可读的格式，效率差，不如你这个。
user-0 提问: 各位大神帮忙看看  递归函数求最大公约数 程序有点bug 

回复:
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 func(int min,int max) {     return max%min ？ func(max%min,min) ：min; //如果max可以整除min，min就是最大公约数 }

user: user-3
content: int func(int min,int max) {     return max%min ？ func(max%min,min) ：max%min; }
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: 引用 4 楼 去死吧^爱情^ 的回复:fgets(buf,sizeof(buf),stdin);这行不太清楚 这是从标准输入（也就是控制台）接收输入的字符串，第一个参数是保存输入字符串的字符数组（或字符指针），第二个参数是控制接收输入字符的长度（一般为了安全，指定不超过数组的长度），第三个参数是输入源（也就是这个字符串从哪来的，可以从文件来，也就是文件指针，或者stdin，表示标准输入）。 当然，用gets也行，也就是gets(buf)，不过这个没有长度参数控制（输入可能会超过数组的长度），所以相对来说不如fgets安全。 具体你可以自己网上查看一下fgets或gets的文档说明。

user: user-0
content: 引用 1 楼 user-2的回复:用fgets比较好吧, for example char buf[100]; fgets(buf, sizeof(buf), stdin); for(int i=0, j=0; i<strlen(buf); i++, j++)  {     if ((j+1)%3==0) printf("\n");     printf("%c-%d ", buf[i], buf[i]); } fflush(stdin);  fgets(buf,sizeof(buf),stdin);这行不太清楚

user: user-0
content: 引用 1 楼 user-2的回复:用fgets比较好吧, for example char buf[100]; fgets(buf, sizeof(buf), stdin); for(int i=0, j=0; i<strlen(buf); i++, j++)  {     if ((j+1)%3==0) printf("\n");     printf("%c-%d ", buf[i], buf[i]); } fflush(stdin);  谢谢你的回复，我会参考

user: user-0
content: 刚开始学习C语言，这个有点难懂。

user: user-2
content: 用fgets比较好吧, for example char buf[100]; fgets(buf, sizeof(buf), stdin); for(int i=0, j=0; i<strlen(buf); i++, j++)  {     if ((j+1)%3==0) printf("\n");     printf("%c-%d ", buf[i], buf[i]); } fflush(stdin);
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: 嗯。我也知道是遍历像素，但是不知道具体的方法 网上查了很多也没找到，难道是我找的方法不对吗。opencv是什么我也不知道，我果然懂的还是太少了 😅

user: user-2
content: 用opencv。可以遍历所有像素。

user: user-3
content: HWND GetDesktopWindow() HDC GetDC(HWND hWnd)； COLORREF GetPixel(HDC hdc, int nXPos, int nYPos)；

user: user-4
content: 你遍历一下屏幕的像素不是就找到了？

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-0
content: 引用 1 楼 user-2的回复:已经好久没见到了赵老师了，你肯定是之前做了什么鬼畜的操作，贴出来的部分是没有问题的 系啊系啊确实这样，另一个帖子里已经晓得啦

user: user-2
content: 已经好久没见到了赵老师了，你肯定是之前做了什么鬼畜的操作，贴出来的部分是没有问题的
user-0 提问: 大神们，帮忙看一下这段C函数为什么不正确？当输入大于1的数后，总是死掉

回复:
user: user-1
content: int recursion(int n) {     if（0 == n ） return 1； int z;  z=recursion(n-1)*n;  return(z); }    0! 是1，不是0哈

user: user-2
content: 咳咳，上面写了个错别字，执行“不”到

user: user-2
content: 楼上的意思是，你的递归执行起来，最后一步执行一到。 举个例子： 6！=6*5*4*3*2*1 int recursion(int n) { int z;  z=recursion(n-1)*n;  return(z); } 你的n=6传进去之后会做这样的步骤： z=recursion(5)*6     z=recursion(4)*5         z=recursion(3)*4             z=recursion(4)*3                 z=recursion(3)*2                     z=recursion(2)*1                         z=recursion(1)*0            ====》做到这一步的时候我们并不知道1的递归是多少，0的递归又是多少 虽然你在主函数里面定义了，但那只能说明是你输入的数字是0和1的时候输出的值是多少，在执行函数的过程中并不会回到主函数里面，只有最后把你输入的6！求完了才会继续去执行 printf("%d的阶乘是%d\n", n, c); 所以，你写的递归函数是没有出口的，运行不到最后一步。

user: user-3
content: 我想可能是你没搞懂递归

user: user-3
content: 主程序跟你递归有关系吗？仔细再想想

user: user-0
content: 但是我主程序里面用if语句只有n大于1才调用递归程序啊？

user: user-3
content: 递归没有出口 int recursion(int n) { if(n==1)  return 1; int z;  z=recursion(n-1)*n;  return(z); }
user-0 提问: PAT题，输出不了.

回复:
user: user-1
content: 引用 4 楼 阿里巴巴和四十大盗滴 的回复:[quote=引用 2 楼 真相重于对错 的回复:] 程序逻辑错误一大堆 1、count 在一次循环中，加了两次 2、如果a是偶数，它等于它的一半，之后的判断有时又会执行一次，例如10的一半是5，之后if(a%2==1)又被执行，如够是a=2,那么寻魂永不结束 第二个，如果是2的话，只循环1次，我跑了一下，输出是1.[/quote] 如果你能输出1，说明你的编译器是错误的，该换编译器了

user: user-0
content: 引用 1 楼 user-2 的回复:if后面用花括号{} if(a%2==0) { a=a/2; count+=1; } if(a%2==1) //其实这里用else就好 { a = 3*a+1; a=a/2; count+=1; } 代码没问题了，但是超时。

user: user-0
content: 引用 2 楼 真相重于对错 的回复:程序逻辑错误一大堆 1、count 在一次循环中，加了两次 2、如果a是偶数，它等于它的一半，之后的判断有时又会执行一次，例如10的一半是5，之后if(a%2==1)又被执行，如够是a=2,那么寻魂永不结束 第二个，如果是2的话，只循环1次，我跑了一下，输出是1.

user: user-0
content: 懂了，pat新手。 谢谢

user: user-1
content: 程序逻辑错误一大堆 1、count 在一次循环中，加了两次 2、如果a是偶数，它等于它的一半，之后的判断有时又会执行一次，例如10的一半是5，之后if(a%2==1)又被执行，如够是a=2,那么寻魂永不结束

user: user-2
content: if后面用花括号{} if(a%2==0) { a=a/2; count+=1; } if(a%2==1) //其实这里用else就好 { a = 3*a+1; a=a/2; count+=1; }
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: 没错的，如果你想显示出正确的行列的话，那就最后一句改成printf("最大值=%d\n行号= %d\n列号= %d\n",max,row+1,colum+1);

user: user-3
content: 嗯，下标是从0开始的

user: user-4
content: 程序运行怎么个不正确了？行号和列号都是从0开始的，难道你期待的是从1开始算的？那就if里的row和colum都再加1就可以了。

user: user-5
content: 没看出来哪里不对
user-0 提问: Easy x图形界面库的一些问题

回复:
user: user-1
content: easyx功能有点弱  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder书籍下载： https://pan.baidu.com/s/13n9hxwVj9ai1p5L2rQC83Q

user: user-0
content: 引用 2 楼 ooolinux 的回复:easyx功能有点弱  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder书籍下载： https://pan.baidu.com/s/13n9hxwVj9ai1p5L2rQC83Q  谢谢     感谢指导

user: user-0
content: 引用 1 楼 與蘤舊縐 的回复:前一个建议你查一下文档，easyx安装的时候会给你安装一个说明文档，不想查也可以直接画一个画布大小的其他颜色的矩形  后一个直接把后一张图片放在需要的位置即可，还是放图片的那个函数  哦哦  感谢感谢

user: user-2
content: 前一个建议你查一下文档，easyx安装的时候会给你安装一个说明文档，不想查也可以直接画一个画布大小的其他颜色的矩形  后一个直接把后一张图片放在需要的位置即可，还是放图片的那个函数
user-0 提问: 简单C程序，存款多种利率问题

回复:
user: user-0
content: 还问个问题看到有贴子说要结贴怎么弄？

user: user-0
content: 虽然有点迷糊的解决啦，但是学会了怎么调试。感谢

user: user-1
content: m的计算也可以移出去了

user: user-1
content: 那么估计根本没进switch，建议你单步跟踪看一下，另外各个变量定义的时候赋初值，b和m最好赋初值

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:既然都是一样的，那么就直接把这两句放在switch后面，里面的全去掉 可是直接放到最后面，运行时b的值就是0，不知道为什么

user: user-1
content: 既然都是一样的，那么就直接把这两句放在switch后面，里面的全去掉
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: scanf("%d*c%d*c%d", &year, &month, &day); 这样你输入 2000-12-21  还是 2000/12/21 还是2000/12- 21都可以了 *c表示从键盘读取一个字符但是不存储到变量里面去， 所以三个数字之间你可以放任何一个字符来分割他们都可以

user: user-3
content: scanf("%d-%d-%d",&goods[i].pro_time.year,&goods[i].pro_time.month,&goods[i].pro_time.day);

user: user-0
content: 提前谢谢各位的帮助了
user-0 提问: 请问	long int show_time = 1L

回复:
user: user-1
content: 如同1楼解释 windows系统下 long int 和 int是一样的，都是32位的  默认输入的整数都是int，默认输入的浮点数都是double  好好看数， c语言里面的字面量的表示

user: user-2
content: 就是 1转换为long 再赋值给show_time,默认1是int,这个看用什么写代码，有的不写也可以，有的不行.
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: #include<stdio.h> #include "stdafx.h" int main() { 	int i,n,count; 	printf("欢迎来到我的系统！\n"); 	count=2; 	for(i=0;i<3;i++) 	{ 		printf("请输入密码!"); 		scanf("%d",&n); 		if(n==123456) 		{ 			printf("密码正确!"); 			break;  		} 		else  		{  			count--; 			printf("你还有%d次机会",count); 			if(count=0) 			{printf("你的账号已经被冻结！");  			} 		} 	} 	return 0; }

user: user-0
content: 引用 1 楼 寻开心的回复:if(n=123456)  是  == 才对 嗯，我改了，但是无论我输入什么它都显示密码正确

user: user-3
content: if(n==123456)  因为 = 是赋值，无法完成变量与常数的比较的。

user: user-4
content: if 判断相等是 ==

user: user-5
content: if(n=123456)  是  == 才对
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: https://blog.csdn.net/weixin_43778744/article/details/100016668
user-0 提问: 关于c结构体初始化的问题

回复:
user: user-0
content: 引用 7 楼 无敌阿晨的回复:谢谢各位 我自己改好了。。。 等我研究一下咋删。。

user: user-0
content: 谢谢各位 我自己改好了。。。

user: user-1
content: 引用 3 楼 真相重于对错 的回复:c语言不能这么写，你这是c++的写法  楼主的代码都搞出class了， 这个不可能是c的

user: user-2
content: c语言不能这么写，你这是c++的写法

user: user-1
content: StackTop  = new Node{oneSet, StackTop};

user: user-3
content: stack():StackSize(0),StackTop(NULL){}; 你在构造函数这里的才叫初始化 StackTop=(node*){oneSet,StackTop}; 你这叫初始化吗？？ 你把一个node结构体强制转为 node *？？？这样也行吗

user: user-4
content: C++ 问题请去 C++ 论坛提问。

user: user-2
content: 引用 4 楼 寻开心 的回复:[quote=引用 3 楼 真相重于对错 的回复:] c语言不能这么写，你这是c++的写法  楼主的代码都搞出class了， 这个不可能是c的[/quote] 看清楚标题，和栏目？
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: scanf_s这个接口不需要长度作为参数吗

user: user-3
content: while ((a[i] != '\0') || (b[i] != '\0'))  -》 while ((a[i] != '\0') && (b[i] != '\0')) ？

user: user-4
content: scanf_s("%s", a,80);指定下长度，而且最后printf("big-string\n", a);这个a没意义啊，你可以写成printf("big-string is a:%s\n", a);
user-0 提问: 萌新求教

回复:
user: user-0
content: 引用 1 楼 不闻窗外事的回复:等号运算是从右往左，首先，a*3等于9，然后a-=9 表示为a=a-9；所以a等于-6；a+=a表示为a=a+a；a=-12 那个图片里的倒数第二行a+=-6,是不是a=a+(-6),然后右边的a是不是在前面已经算出是-6了，然后直接一代就行了

user: user-1
content: 引用 6 楼 花海呀 的回复:这个咋结帖啊？找了好久都不晓得@_@ 帖子标题旁边有结帖按钮，如果看不见就用电脑版登录。

user: user-0
content: 引用 4 楼 apkipa1的回复:#2 和 #3 是正解，这属于未定义行为。写这些代码的作者明显不了解迂腐的 C 语言标准，建议换书看。 这个咋结帖啊？找了好久都不晓得@_@

user: user-1
content: #2 和 #3 是正解，这属于未定义行为。写这些代码的作者明显不了解迂腐的 C 语言标准，建议换书看。

user: user-2
content: 我想他想表达的意思应该是a+=a-=3，即a-3+（a-3），也就是a-=3之后a已经发生变化，这和程序的结果是一致的

user: user-2
content: 按着这么3行算下来不一定是-12，a+=a-=1，那a在-=的时候是变了还是没变呢，这感觉就和a+=a++是一个问题  按楼上的说法第一行的结果是-12可以理解  但如果他的意思是这三行算下来是-12，那就有点诡异了  试了下连续计算下每行的结果分别是-12 -42 -36，拍的不全，看不明白什么意思

user: user-3
content: 等号运算是从右往左，首先，a*3等于9，然后a-=9 表示为a=a-9；所以a等于-6；a+=a表示为a=a+a；a=-12
user-0 提问: win32 API中的A后缀和W后缀，A是指ANSI还是ASCII？

回复:
user: user-1
content: 所以说CreateWindowA 这个指的是ANSI

user: user-1
content: ANSI包含ASCII ASCII只是英文字母和符号，占一个字节 ANSI每个国家都有自己的标准，如中国GBK编码，这些编码是多字节编码。  英文占一个字节，如中文可能占两个字节，或3个字节，或4个字节

user: user-2
content: 官网上的一句话 In the ANSI version of this function, the name is limited https://docs.microsoft.com/zh-cn/windows/win32/api/fileapi/nf-fileapi-createfilea?redirectedfrom=MSDN

user: user-3
content: ANSI和ASCII都是单字节编码，不同是ASCII是7位编码（最高位保持为0），ANSI是8位编码

user: user-4
content: ASCII码是不可能ASCII码的，ASCII码一共就那么几个，输入中文咋办，比如路径
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: #include <stdio.h>  void main()  {  int i,j,row = 0 ,colum = 0,max;  int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};  max = a[0][0];  for(i=0;i<=2;i++)  for(j=0;j<=3;j++)  if(a[i][j]>max)  {  max = a[i][j];  row = i;  colum = j;  }  printf("最大值=%d\n行号= %d\n列号= %d\n",max,row,colum);  }  这个程序运行出来行和列不对呀

user: user-0
content: 这个程序没有问题。 通过运行可以得出最后的结果是这样的： 最大值=10 行号= 2 列号= 1  因为数组下标默认是从0开始的，所以这里的行和列对应的就是第三行第二列。 如果你觉得不够直观，可以在最后输出时改成这样： printf("最大值=%d\n行号= %d\n列号= %d\n",max,row+1,colum+1);  引用 1 楼 weixin_45671534 的回复:#include <stdio.h>  void main()  {  int i,j,row = 0 ,colum = 0,max;  int a[3][4]={{1,2,3,4},{9,8,7,6},{-10,10,-5,2}};  max = a[0][0];  for(i=0;i<=2;i++)  for(j=0;j<=3;j++)  if(a[i][j]>max)  {  max = a[i][j];  row = i;  colum = j;  }  printf("最大值=%d\n行号= %d\n列号= %d\n",max,row,colum);  }  这个程序运行出来行和列不对呀
user-0 提问: C内存问题

回复:
user: user-0
content: 引用 1 楼 寻开心 的回复:void minStackPush(MinStack *obj, int x) {         obj->length++;         if (obj->length > obj->size)         {                 int **content = (int **)malloc(sizeof(int *) * 2 * obj->size);                 memset(content, 0, sizeof(int *) * 2 * obj->size);                 memcpy(content, obj->content, sizeof(int *) * (obj->length - 1));                 safe_free(obj->content);                 obj->content = content;                 obj->size = obj->size * 2;         } 老铁牛逼，我看一下午都没能看出来

user: user-1
content: void minStackPush(MinStack *obj, int x) {         obj->length++;         if (obj->length > obj->size)         {                 int **content = (int **)malloc(sizeof(int *) * 2 * obj->size);                 memset(content, 0, sizeof(int *) * 2 * obj->size);                 memcpy(content, obj->content, sizeof(int *) * (obj->length - 1));                 safe_free(obj->content);                 obj->content = content;                 obj->size = obj->size * 2;         }
user-0 提问: C# 用oledb写dll插件运行报错 生成exe程序可以正常运行

回复:
user: user-0
content: 我才学不久   谢谢你了

user: user-1
content: 从你的数据库连接字符串来看，你只是连接EXCEL，用得着这么大阵仗？  建议NPOI来读写EXCEL。

user: user-0
content: 这个问题应该和应用程序池里面的没有关系  因为生成exe的时候可以用  然后主程序是用反射去调用这个dll程序     平台目标也不能改   改成X86就调用不了了 现在老阔好大
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: 引用 2 楼 寻开心 的回复:你这样看不出来问题， 做测试就要做成能发现问题的 union  M {    long long int ll;    int n[2];    short  s[4];    char   c[8] } u; 做成这样的一个联合体，   然后你再测试你的代码去  先说我认为的答案 scanf第一个字符串指定了后面的内容的格式，  第二个开始起， 都是一个一个的内存地址 按照指定的格式， 把读入数据放到指定的内存当中去，在这个过程当中并没有做内存地址的安全性检测，是假定你给的地址都是对的 你指定要读入一个long int（windows下long int和int都是32位的）， 但是你传递给他的是一个char 类型的地址 这样有没有问题？ 有问题， 只是未必显现出来。 windows当中， int是4个字节， 低位字节在前，高位字节在后 因此读入一个整数的时候， 如果不超过255那么，它所占据的有效地址就是char所在的空间， 超出的时候才占据了更高地址的空间 为测试这点， 你定义一个char c【4】这样的数组， scanf（“%d”， c）； 这样，你输入不同的数，然后看c【0】～c【4】内容的变化就可以验证这一点。  你的代码可以运行，并感觉没错，那恐怕只是scanf读取的数据所破坏掉的内存空间，并没有被使用， 效果没有显现出来而已 char a = 0； char b = 0; char c = 0; char d = 0; scanf("%d", &b);  你输入65535，然后看看c和a的值是否发生变化了（ 具体是a还是c变了，取决于编译器，大部分编译器会把栈地址做成向下增长，也就是b的地址比a的地址低，所以b存放int的时候，必然向上增长覆盖a的空间。） 或者用前面给的那个union结构体， 看看同一空间下，不同的数值变化，就知道内存占据的情况了例子不好  char str[sizeof (int)] = ""; 然后 scanf %d str 可以明确看到操作结果

user: user-3
content: 你这样看不出来问题， 做测试就要做成能发现问题的 union  M {    long long int ll;    int n[2];    short  s[4];    char   c[8] } u; 做成这样的一个联合体，   然后你再测试你的代码去  先说我认为的答案 scanf第一个字符串指定了后面的内容的格式，  第二个开始起， 都是一个一个的内存地址 按照指定的格式， 把读入数据放到指定的内存当中去，在这个过程当中并没有做内存地址的安全性检测，是假定你给的地址都是对的 你指定要读入一个long int（windows下long int和int都是32位的）， 但是你传递给他的是一个char 类型的地址 这样有没有问题？ 有问题， 只是未必显现出来。 windows当中， int是4个字节， 低位字节在前，高位字节在后 因此读入一个整数的时候， 如果不超过255那么，它所占据的有效地址就是char所在的空间， 超出的时候才占据了更高地址的空间 为测试这点， 你定义一个char c【4】这样的数组， scanf（“%d”， c）； 这样，你输入不同的数，然后看c【0】～c【4】内容的变化就可以验证这一点。  你的代码可以运行，并感觉没错，那恐怕只是scanf读取的数据所破坏掉的内存空间，并没有被使用， 效果没有显现出来而已 char a = 0； char b = 0; char c = 0; char d = 0; scanf("%d", &b);  你输入65535，然后看看c和a的值是否发生变化了（ 具体是a还是c变了，取决于编译器，大部分编译器会把栈地址做成向下增长，也就是b的地址比a的地址低，所以b存放int的时候，必然向上增长覆盖a的空间。） 或者用前面给的那个union结构体， 看看同一空间下，不同的数值变化，就知道内存占据的情况了

user: user-4
content: 不一定，在32位系统里，long和int是等长字节数。都是4字节的。建议sizeof(long)和sizeof(int)对比下。在64位系统里，你这句话是成立的。
user-0 提问: c语言 BFS

回复:
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: user-0
content: 引用 3 楼 一股清流~的回复:超时说明递归用多了 没有用递归，我用的是广度优先搜索...

user: user-3
content: 超时说明递归用多了

user: user-4
content: 提了十个问题，一个帖子也不结的，还是不回答了。

user: user-0
content: #include<stdio.h> #include<string.h> typedef struct {     int x;     int y;     int dis[1][2];     int veer; } Q; Q que[10005];  int f[4][2]= {{0,1},{1,0},{0,-1},{-1,0}}; char map[105][105],book[105][105]; int n,m,i,j,k,x1,x2,y1,y2,tx,ty,l,head,tail,flag;  int main() {     int num;     while(scanf("%d",&num)!=EOF) {         while(num--) {             memset(book,0,sizeof(book));             scanf("%d %d",&n,&m);                          for(i=0; i<n; i++) {             getchar();                 for(j=0; j<m; j++)                     scanf("%c",&map[i][j]);             }             scanf("%d %d %d %d %d",&k,&x1,&y1,&x2,&y2);             head=tail=0;             que[tail].x=x1-1;             que[tail].y=y1-1;             que[tail].veer=-1;             que[tail].dis[0][0]=0;             que[tail].dis[0][1]=0;             tail++;             book[x1-1][y1-1]=1;             flag=0;              while(head<tail) {                 if(que[head].veer>k) {                     head++;                     continue;                 }                 for(l=0; l<4; l++) {                     tx=que[head].x+f[l][0];                     ty=que[head].y+f[l][1];                     if(tx<0||tx>=n||ty<0||ty>=m||map[tx][ty]=='*')                         continue;                     if(map[tx][ty]=='.'&&book[tx][ty]==0&&que[head].veer<=k) {                          book[tx][ty]==1;                         que[tail].x=tx;                         que[tail].y=ty;                         que[tail].dis[0][0]=f[l][0];                         que[tail].dis[0][1]=f[l][1];                         tail++;                         if(que[head].dis[0][0]==f[l][0]&&que[head].dis[0][1]==f[l][0])                             que[tail].veer=que[head].veer;                         else                             que[tail].veer=que[head].veer+1;                         if(tx==x2-1&&ty==y2-1&&que[tail-1].veer<=k) {                             flag=1;                             break;                         }                     }                  }                 if(flag) break;                 head++;             }             if(flag) printf("yes\n");             else printf("no\n");         }     }     return 0; } 原代码有bug,修改一下依然超时
user-0 提问: 请问如何解决win10lnk1120的问题

回复:
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 楼 與蘤舊縐的回复:手机上用的是clang吧  这什么软件，dev还是vc，看看lib里有没有string.h头文件吧，没有就重装，换个靠谱的 重装啦谢谢你!!!!

user: user-0
content: 引用 5 楼 真相重于对错的回复:建立的工程类型不对，建立win console类型工程 谢谢我换了一个程序重装了一下，可以用了，但是运行起来很慢..

user: user-2
content: 建立的工程类型不对，建立win console类型工程

user: user-3
content: 手机上用的是clang吧  这什么软件，dev还是vc，看看lib里有没有string.h头文件吧，没有就重装，换个靠谱的

user: user-0
content: 引用 1 楼 一股清流~的回复:你这个是缺头文件，你用了strcat，这个函数的头文件是string.h QAQ怎么办呀，手机上的编译软件不加也可以

user: user-0
content: 引用 1 楼 一股清流~的回复:你这个是缺头文件，你用了strcat，这个函数的头文件是string.h 我重新加了还是一样的错误

user: user-4
content: 你这个是缺头文件，你用了strcat，这个函数的头文件是string.h
user-0 提问: 求组合数

回复:
user: user-1
content: 错误原因是整数除法    i/(i-n+m);  是整数除法， 比如2/3结果就会是0。3/2是1  s *= i/(i-n+m);  是先计算 *= 的右侧， 右侧是整数除法， 结果就不正确  s = s*i/(i-n+m);  会先计算s*i而后再去除以(i-n+m);  因为s*i已经包含了后者的因子， 除法结果还是正确的  换成float类型， float除法结果可以保证正确性

user: user-2
content: 如果是个浮点类型的就没问题，整形就得考虑运算符优先级了

user: user-3
content: C语言的运算符优先级是先算‘*’，再算‘/’,在错误的代码里先算了‘*=’右边的表达式，然后才算乘号，所以值不对。
user-0 提问: 在很大的二进制文件中怎么查有没有重复出现的128bit

回复:
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: 16个bytes相等是特殊情况， 如果要遍历就不要这种特例就好了 如果是遍历连续130个bits，会是认为3个不同的128bits的匹配 要不要遍历算法控制上的简单问题   15个连续的bytes，也就是120bits存在的可能性是比16个bytes（128bits）的可能性高 但是作为查找算法， 先找到15个byte的效率绝对比直接找128bits高得多 bits比较就要从byte里面摘出来，然后逐个位去比较。 而byte，cpu支持直接比较二者是否相同 之所以放大到long long int，64bits，因为同样的cpu可以完成一次64位的比较  至于结果缓存不缓存，那是基础问题， 这个理解不了，这个题目对你就太难了

user: user-0
content: 引用 4 楼 寻开心 的回复:这个肯定是可以加速的 吓人的是要按照bits来， 听起来要移位，可是真的需要吗？！  128bits是16个Byte， 无论按照bits是怎么排列的，不管怎样跨Byte的边界，最终一定有15个Bytes是连续的 所以在大文件当中，先找到所有的15个连续Byte的可能， 如果有16个直接结束就ok了 如果没有， 15个的基础上再想前或者后相邻的2个byte上找能不能在凑出8个bits的相同位来，这个很比较狠容易解决，最多14次比较而已。  要求是遍历所有的。。不能因为有了就停下来，而且15个连续的bytes的可能性太多了吧。。是要存放起来吗，，，不太理解呀

user: user-2
content: 这样把按照bits移位，转化成按照bytes移位来比较了。  同样的道理， 不按照bytes比较15个，而是进一步把数据整合， 整合到long long int类型， 也就是64位的int 这样每次移位64位，就更快了  64位也是最大的整合了。 long doulbe是128位的，可以把数据认为是long double数组并能进行比较，问题是移位bits就绕不过去了

user: user-2
content: 这个肯定是可以加速的 吓人的是要按照bits来， 听起来要移位，可是真的需要吗？！  128bits是16个Byte， 无论按照bits是怎么排列的，不管怎样跨Byte的边界，最终一定有15个Bytes是连续的 所以在大文件当中，先找到所有的15个连续Byte的可能， 如果有16个直接结束就ok了 如果没有， 15个的基础上再想前或者后相邻的2个byte上找能不能在凑出8个bits的相同位来，这个很比较狠容易解决，最多14次比较而已。

user: user-3
content: 使用内存映射文件，CreateFileMapping

user: user-0
content: 按照1bit，不是按照整字节操作的

user: user-4
content: 你这个对齐是按8位呢，还是按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: 引用 1 楼 寻开心 的回复：你到你要闹哪样啊？ double get_input(void) {     double a;     while(scanf("%lf",&a)!=1)  // 输入的是double内容，那么while循环体不执行； 如果不是double，键盘缓冲区的内容并没有变化，还是原来的内容，所以一直在这儿死循环        {         printf("\nEnter a number\n");     }     return a; }   陷入循环...  但是添加  double get_input(void) {     double a;     char ch;     while(scanf("%lf",&a)!=1)    {   // 输入的不是一个double类型数据， 会进入这个while循环体          while ((ch=getchar())!='\n') // 把缓冲区的字符一个一个的提取出来， 包括最后的回车符， 也就是放弃了这一整行的数据了             putchar(ch);         printf("\nEnter a number\n");     }     return a; } 后面的这个函数，因为可以把键盘缓冲区清空，让用户重新输入数据，所以可以继续进行下去 前面的那个函数，因为没有清理缓冲区， 所以读取double的条件始终无法达到  如果只是这个目的。 循环体里面用一个fflush（stdin）就好了或者gets函数也可以解决。谢谢🙏

user: user-2
content: 你到你要闹哪样啊？ double get_input(void) {     double a;     while(scanf("%lf",&a)!=1)  // 输入的是double内容，那么while循环体不执行； 如果不是double，键盘缓冲区的内容并没有变化，还是原来的内容，所以一直在这儿死循环        {         printf("\nEnter a number\n");     }     return a; }   陷入循环...  但是添加  double get_input(void) {     double a;     char ch;     while(scanf("%lf",&a)!=1)    {   // 输入的不是一个double类型数据， 会进入这个while循环体          while ((ch=getchar())!='\n') // 把缓冲区的字符一个一个的提取出来， 包括最后的回车符， 也就是放弃了这一整行的数据了             putchar(ch);         printf("\nEnter a number\n");     }     return a; } 后面的这个函数，因为可以把键盘缓冲区清空，让用户重新输入数据，所以可以继续进行下去 前面的那个函数，因为没有清理缓冲区， 所以读取double的条件始终无法达到  如果只是这个目的。 循环体里面用一个fflush（stdin）就好了或者gets函数也可以解决。
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: 你是小的除大的，会得0余小的，所以后面的不等于0是成立的，不会退出循环

user: user-3
content: （20%20！=0 ）  || （ 5%20！=0） 显然||后面的不是0啊， 5%20是5， 所以没有退出循环
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: 典型的代码测试如下  printf("%p %p", b, b+1); //  输出这两个指针， 看看他们之间的差是多少  如果是int类型就是sizeof（int）， 如果是int【3】，差距就是3*sizeof（int） 从而可以证明，b是什么类型的指针了

user: user-0
content: 引用 6 楼 寻开心的回复:p和b的类型不一样 p类型是int* b烈性是int[3]*  二维数组，和一维数组不同 int*q， c[3];  q = 3;  这个没有毛病，  q和c都可以认为是int*  二维数组不是这样，b【2】【3】 是两个 int【3】数组相邻摆放，  b的类型就是 int【3】这个类型，并不是int类型 好的，了解了，谢谢你

user: user-2
content: p和b的类型不一样 p类型是int* b烈性是int[3]*  二维数组，和一维数组不同 int*q， c[3];  q = 3;  这个没有毛病，  q和c都可以认为是int*  二维数组不是这样，b【2】【3】 是两个 int【3】数组相邻摆放，  b的类型就是 int【3】这个类型，并不是int类型

user: user-0
content: 引用 4 楼 林涅槃的回复:[quote=引用 3 楼 寻开心的回复:]p的指针可以指向b，p=&b【0】【0】 这就是正确的指向方法  你的解释不通！ 原因是，数据都在内容同一个地址放着， 如何解释要靠对应它的指针的类型 比如 int a；  放的是一个整数， 你要用一个float类型指针指向它，行不行呢？  float *f = &a; 行， 但是，上面这样写是错的，原因就是 类型不匹配， 正确写法是：  f = （float*） &a；  p = （int *) b; 这是可以的， 强制转换  强制类型转换， 顾名思义， 强制性的一个类型转换成另外的类型， 也许他们根本就不匹配 那么为什么a可行，b不可行呢？[/quote] a，b的类型都是int吧

user: user-0
content: 引用 3 楼 寻开心的回复:p的指针可以指向b，p=&b【0】【0】 这就是正确的指向方法  你的解释不通！ 原因是，数据都在内容同一个地址放着， 如何解释要靠对应它的指针的类型 比如 int a；  放的是一个整数， 你要用一个float类型指针指向它，行不行呢？  float *f = &a; 行， 但是，上面这样写是错的，原因就是 类型不匹配， 正确写法是：  f = （float*） &a；  p = （int *) b; 这是可以的， 强制转换  强制类型转换， 顾名思义， 强制性的一个类型转换成另外的类型， 也许他们根本就不匹配 那么为什么a可行，b不可行呢？

user: user-2
content: p的指针可以指向b，p=&b【0】【0】 这就是正确的指向方法  你的解释不通！ 原因是，数据都在内容同一个地址放着， 如何解释要靠对应它的指针的类型 比如 int a；  放的是一个整数， 你要用一个float类型指针指向它，行不行呢？  float *f = &a; 行， 但是，上面这样写是错的，原因就是 类型不匹配， 正确写法是：  f = （float*） &a；  p = （int *) b; 这是可以的， 强制转换  强制类型转换， 顾名思义， 强制性的一个类型转换成另外的类型， 也许他们根本就不匹配

user: user-0
content: 引用 1 楼 寻开心的回复:因为类型不匹配 p= &b[0][0]  这样是可以的  int (*p2)[3] = b; //这才可以，   b是一个指向int[3]这种类型的指针， 它和int*不一样。 可第一行地址和第二行地址是连续的，从地址上来看，第一行地址6000，第二行6012，地址上是看跟一维数组是没有区别的吧，也可以看成是一维数组a[6]吧，此时a和b如果地首址相同，那么a[6]的大小和地址是和b[2][3]一致的，那么为什么p指针不能指向b

user: user-2
content: 因为类型不匹配 p= &b[0][0]  这样是可以的  int (*p2)[3] = b; //这才可以，   b是一个指向int[3]这种类型的指针， 它和int*不一样。

user: user-0
content: 好的，谢谢你!😊😊😊😊😊😊😊
user-0 提问: pta问题求救

回复:
user: user-0
content: 引用 1 楼 寻开心的回复:if(len/N==0) { lie = len/N; } else { lie = len/N + 1; }  应该是 if  ( 0 == len%N )  而不应该是  len/N  只有当len<N的时候，这个除法才是0 擦→_→ 原来是这里不对，想写整除来着。写顺手，就写成除法了。改完就对了。谢谢哥

user: user-1
content: lie = (len + N - 1 ) / N;  // 这样写一行就搞定了

user: user-1
content: if(len/N==0) { lie = len/N; } else { lie = len/N + 1; }  应该是 if  ( 0 == len%N )  而不应该是  len/N  只有当len<N的时候，这个除法才是0
user-0 提问: 大神救救我呀！

回复:
user: user-1
content: 获取字符串s长度，作为数组dp的长度。

user: user-0
content: 引用 2 楼 qq_1457346882的回复:dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2 这是干嘛用的？ 没睡醒，给个思路吧。你可以定义一个数组记录他的有多少个，看题目来说，()才算，那就是遍历，判断前一个是（且后一个是）或者前一个是）且后一个是（j++，其余的把j置零，同时判断j/2是不是大于0，是就把j/2写到记录数组中，最后循环判断记录的最大数，输出有最大数*2个，再输出最大数个() 看四楼凑字数哈哈哈哈哈

user: user-0
content: 引用 2 楼 qq_1457346882 的回复:dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2 这是干嘛用的？ 没睡醒，给个思路吧。你可以定义一个数组记录他的有多少个，看题目来说，()才算，那就是遍历，判断前一个是（且后一个是）或者前一个是）且后一个是（j++，其余的把j置零，同时判断j/2是不是大于0，是就把j/2写到记录数组中，最后循环判断记录的最大数，输出有最大数*2个，再输出最大数个()

user: user-2
content: dp[i] = dp[i-1] + dp[i-dp[i-1]-2] + 2 这是干嘛用的？ 没睡醒，给个思路吧。你可以定义一个数组记录他的有多少个，看题目来说，()才算，那就是遍历，判断前一个是（且后一个是）或者前一个是）且后一个是（j++，其余的把j置零，同时判断j/2是不是大于0，是就把j/2写到记录数组中，最后循环判断记录的最大数，输出有最大数*2个，再输出最大数个()

user: user-3
content: 按题目要求  strstr 用好像比较简单哈 int finds(const char *s, const char *key) {   int iCnt = 0;   while(s && key && (s=strstr(s, key))!=NULL)   {     s = s + strlen(key);     iCnt += strlen(key);   }   return iCnt; }  void Test() {   VERIFY(finds("(()", "()") == 2);   VERIFY(finds(")()())", "()") == 4);  }

user: user-0
content: 错了啊！

user: user-4
content: 几行代码的事儿 int longestValidParentheses(char * str) {     char *p = str;     int maxLen=0, curLen = 0;     while ( *p != '\0' ) {         if ( *p == '('  && *(p+1)==')' ) {             curLen +=2;    p += 2;         } else {             if ( curLen > maxLen ) maxLen = curLen;             curLen = 0;    p++;         }     }     return maxLen; }  如果答案满意就结贴给分儿， 老问问问题不给分儿， 下次就不搭理你了
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: c-free也可以

user: user-3
content: 我去年用的vc精简版32&64bit，初学阶段完全够用，要的话传送门->https://pan.baidu.com/s/1ClKUb6tjk4ab1RE7tBCssg 提取码:5bpz

user: user-4
content: 我用的也是笔记本64位 vc6.0没问题呀 具体怎么无法执行 报什么错

user: user-5
content: 64位兼容32位的，无法执行肯定不是这个原因 visual c++实在太老了，你能找到这软件看来你自学用的教材也有点老了 visual studio，现在的笔记本大多都可以承受得起vs，你要觉得太占地方那就算了 dev C++，也比较老了，不过对初学者比较友好 CLion，挺智能的，可以用学生邮箱申请免费使用，当然还有那啥啥 visual studio code，省省吧，太恶心人了

user: user-6
content: 1 下载dev c++ 腾讯电脑管家 - 软件管家 - 搜索 dev， 找到48M的那个  2 下载 visual studio community 2019版本就好
user-0 提问: feof读写最后会再读入一次FF怎么解决

回复:
user: user-1
content: fread（buffer， 1， 1024， fp）； 少写了个参数

user: user-1
content: feof（fp） 必须是到尾巴了还读了一下，才发生设置eof的标记 可以如下方式 while （1） {      c = fgetc(fp);      if ( c == eof ) break;      else    buf[selectBitSize]=c;  } 但是一个一个的读效率太低了 fread一次读一个数组，这个函数了解下 比如，定义一个char buffer[1024] int nReadOK = fread(bufer, 1024, fp); 根据nReadOK来判断读取成功了多少，如果nReadOK是1024表示文件还有可能有剩余，继续读 如果不足1024表示到尾巴了，结束了
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: #include<stdio.h>  void choose(int num[],int length) {     int i, j, min, tmp;      for (i = 0; i < length; i++) {         min = i;          for (j = i+1; j < length; j++)             if (num[min] > num[j])                 min = j;         if (min != i) {             tmp = num[min];             num[min] = num[i];             num[i] = tmp;         }     } #if 0     int i,j,temp;     for(i=0;i<=length-1;i++)     {         for(j=length-1;j>=length-1-i;j--)         {             if(num[i]>num[j])             {/*                 temp=num[i];                 temp=num[j];                 num[j]=num[i];                 */                 temp = num[i];                 num[i] = num[j];                 num[j] = temp;             }         }     } #endif } int main() {     int length=8;     int num[8]={5,6,8,4,1,2,7,3};     printf("排序前:\n");     for(int i=0;i<length;i++)     {         printf("%d,",num[i]);     }     choose(num,length);     printf("排序后:\n");     for(int i=0;i<length;i++)     {         printf("%d,",num[i]);     }     printf("\n");     return 0; } 供参考～  选择排序

user: user-3
content: 别的暂且不看，你的交换  temp=num[i];     temp=num[j];     num[j]=num[i]; temp的作用是中间的介质，你两次对他进行改变然后后面有没有用，而是直接赋值一个数组值给另一个，肯定都是最大的啊， 交换交换，你根本就没有换啊  temp=num[i];  num[i]=num[j];  num[j]=temp; 这样 才是交换

user: user-4
content: 首先你要明白你要用什么方法，看看初始条件和判断条件是否正确，最重要的看看if交换数据对了吗？

user: user-0
content: 对啊

user: user-5
content: if(num[i]>num[j])    {     temp=num[i];     temp=num[j];     num[j]=num[i];     }  这是交换数据吗？
user-0 提问: 结果和预想的不一样

回复:
user: user-1
content: return 在exit前面

user: user-2
content: 为什么是1 2你调用print打引2以后return代表函数调用结束，没有其他操作了，自然是返回主函数继续执行啊

user: user-0
content: 谢谢  明白了
user-0 提问: q to quit是什么意思？？

回复:
user: user-1
content: 说错了， sorry！ 程序实现了 这里 while (scanf("%d",&num)==1) 如果用户输入的是数字，然后回车。 scanf返回就是1 否则scanf返回是0， 也就退出了  你不输入数字，随便输入一个或者几个字符回车，就能退出  scanf返回值，是表示成功的获取了指定格式的数据的个数， 要求整数，你输入的了字符什么的， 返回就是0

user: user-1
content: 不输入数字，输入字符q，程序退出，否则程序一直循环下去  只是程序代码并没有实现这个功能， 所以这个提示没有意义了
user-0 提问: linux环境下使用fclose后出现段错误

回复:
user: user-1
content: 你的代码中有越界到fclose的部分,fclose时就会出错.

user: user-2
content: 缓存最好是 buffer_size+1, 且最后一个元素设置为0 避免buffer自身满的时候用strcat这种函数，从buffer当中读字符串的时候就越界  fclose之后， fpCon也赋值为NULL，避免二次调用close，当然二次处理怎么都是错  是否要关闭，应该是eof是否到达或者是不再使用了，是常规的判断基础

user: user-3
content: 引用 2 楼 beastsam 的回复:[quote=引用 1 楼 user-3 的回复:] strlen(total) 结果是BUFFER_SIZE 说明必然是越界了 处理边界的时候 注意一下  谢谢，我修改了一下果然没报错。 可是我还是有个疑问，当我把这段单独写出一个测试用例，多次运行，结果却是正常的，请问这个是什么原因？[/quote]内存布局无法确定 越界之后修改了什么数据无法确定 导致什么结果无法确定 从崩溃到什么事都没发生都是正常的

user: user-2
content: 我觉得是因为文件很长 每次读取buffer_size长度， 并进行处理， buffer是满的 所以长度等于buffer_size的部分被多次调用 因此fclose被多次调用，所以完蛋了  fclose后给这个文件做一个=NULL的赋值，你再看看

user: user-0
content: 引用 1 楼 user-3 的回复:strlen(total) 结果是BUFFER_SIZE 说明必然是越界了 处理边界的时候 注意一下  谢谢，我修改了一下果然没报错。 可是我还是有个疑问，当我把这段单独写出一个测试用例，多次运行，结果却是正常的，请问这个是什么原因？

user: user-3
content: strlen(total) 结果是BUFFER_SIZE 说明必然是越界了 处理边界的时候 注意一下
user-0 提问: 程序显示错误

回复:
user: user-0
content: 引用 2 楼 user-2 的回复:第一个if最后少了一个括号)，你自己check一下 谢谢提醒，括号有点多

user: user-0
content: 引用 1 楼 與蘤舊縐 的回复:else if (a=b)???? 你看你前面怎么写的 else if((a==b)||(a==c)||(b==c)) printf("等腰三角形"); 这样改了之后还是显示语法错误

user: user-0
content: 引用 3 楼 與蘤舊縐 的回复:好吧，前面没有== else if((a==b)||(a==c)||(b==c)) printf("等腰三角形"); 我等号搞错了

user: user-1
content: 好吧，前面没有==

user: user-2
content: 第一个if最后少了一个括号)，你自己check一下

user: user-1
content: else if (a=b)???? 你看你前面怎么写的
user-0 提问: scanf输入字符串中有空格，再用strlen函数计算长度问题跪求大佬解答

回复:
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: 还是仔细看看函数的说明吧，  默认的遇到空格 tab 和回车的时候， scanf是如何工作的  函数帮助文档还是要仔细的去看的 scanf("%[^\n]%*c", str);  类似这样的代码也得看懂啊

user: user-0
content: 引用 2 楼 與蘤舊縐的回复:你可以用gets接收，无视空格 原来是这样 那我明白了 感谢感谢

user: user-0
content: 原来是这样 那我明白了 感谢感谢

user: user-0
content: 你可以用gets接收，无视空格

user: user-0
content: 空格和\n都是scanf的分隔符，也就是%s部分遇到空格就结束了，不是说空格是结束符，直接初始化自然没问题
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: 引用 6 楼 寻开心的回复:#include<stdio.h> double com(double x,double y); double fact(double n); int main() { int a,b,c; double s=0; for(a=0;a<=3;a++) { for(b=0;b<=6-a;b++) { for(c=0;c<=9-a-b;c++) { s = s+(com(a,13)*com((9-a),32)/com(9,45))*(com(b,(13-a))*com((9-b),(23+a))/com(9,36))*(com(c,(13-a-b))*com((9-c),(14+a+b))/com(9,27)); } } } printf("%lf",s); return 0; } double com(double x,double y)              //计算yCx  { int num; num=fact(y)/(fact(x)*fact(y-x)); return num; } double fact(double n)              //计算n的阶乘  { double pro=1,i; if(n>=1) for(i=1;i<=n;i++) { pro=pro*i; } else pro=1; return pro; } 把你的int都改成double就得到0.659902啦 再说double不够还有long double那个可是128位的浮点数， 还不够吗  可以吗？那可能是我中途某个地方写错了，我再试试，谢谢

user: user-2
content: #include<stdio.h> double com(double x,double y); double fact(double n); int main() { int a,b,c; double s=0; for(a=0;a<=3;a++) { for(b=0;b<=6-a;b++) { for(c=0;c<=9-a-b;c++) { s = s+(com(a,13)*com((9-a),32)/com(9,45))*(com(b,(13-a))*com((9-b),(23+a))/com(9,36))*(com(c,(13-a-b))*com((9-c),(14+a+b))/com(9,27)); } } } printf("%lf",s); return 0; } double com(double x,double y)              //计算yCx  { int num; num=fact(y)/(fact(x)*fact(y-x)); return num; } double fact(double n)              //计算n的阶乘  { double pro=1,i; if(n>=1) for(i=1;i<=n;i++) { pro=pro*i; } else pro=1; return pro; } 把你的int都改成double就得到0.659902啦 再说double不够还有long double那个可是128位的浮点数， 还不够吗

user: user-0
content: 谢谢楼上的各位大佬，问题已解决 double型似乎也承受不了，网述超大数四则运算过于麻烦，萌新无法理解...所以我把n的阶乘结果除以10的n次方，在组合数公式中分子分母恰好可把10的n次方全部抵消，避免了出现超大数 还用了x，y，z分别代表三个超几何分布算式结果，输出后任取了几个用计算器验算，均正确，最终结果0.655902 诸多不足，请多赐教！

user: user-2
content: 程序代码除了溢出问题以外，还有问题 1 printf（“%ld”， s）； 这是错的， s是double类型，  要%lf方式来输出  2 com（a） / com（b） 这些都是整数除法， 整数除法的结果依然是整数， 比如 1/3 就是0.  不是0.333333   你确定这些除法都是整数吗？

user: user-3
content: 个人感觉45的阶层整型已经接收不了了，包括double，要用字符串类型才能接收

user: user-4
content: 因为int有符号，正数最多容纳21亿。阶乘算数直接溢出了。如果是需要长期用这个公式，需要一位一位算，把结果装到数组里，类似字符串。你可以查一下100的阶乘怎么算，网上是有的。不是用算数迭代或者递归。谢谢！

user: user-2
content: 用int类型计算阶乘溢出了， int表达的范围没有那么大， 我记得13！就要冒了 改成double类型去运行看看吧
user-0 提问: C语言为什么我们尽量不使用goto语句？

回复:
user: user-1
content: 不加限制地使用goto：破坏了清晰的程序结构，使程序的可读性变差,甚至成为不可维护的"面条代码"。经常带来错误或隐患，比如它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句。 关于使用goto语句的原则： （1）使用goto语句只能goto到同一函数内，而不能从一个函数里goto到另外一个函数里。 （2） 使用goto语句在同一函数内进行goto时，goto的起点应是函数内一段小功能的结束处，goto的目的label处应是函数内另外一段小功能的开始处。 （3）不能从一段复杂的执行状态中的位置goto到另外一个位置，比如，从多重嵌套的循环判断中跳出去就是不允许的。 （4）应该避免像两个方向跳转。这样最容易导致"面条代码"。

user: user-2
content: 你最后两句话不是解答了吗

user: user-3
content: 老师说频繁用可能会导致程序崩溃，我没见到过，可能程序太小也没咋用，不过试过死循环，不小心放错了位置，就死循环了。放的多了还不好找错

user: user-4
content: 性能损失  goto是由硬件汇编衍生过来的，对应汇编的jump或者long jump。但是在过去时间里面cpu的主频比较低，但是还是会有基本的流水线结构，一般执行当前指令时，会预取两条指令存储在寄存器中。但是goto回直接让cpu进行跳转，这样的结果就是预取的指令用不上了，然后需要重新预取指令进行执行。早一些的cpu的跳转能力还很差，多次的跳转会让cpu性能损失比较严重。

user: user-5
content: 引用 6 楼 寻开心的回复:是执行效率的问题 现代计算机都可以预取指令， goto就打破了这个方式了 不同意效率的说法 是代码逻辑需要跳指令 goto只是手段 用break 用return 都会造成预读指令失效的情况

user: user-4
content: 此外就是goto实际上会把结构化和模块化的方式打破， 多了就更难理解程序的结构了 不是不能用， 可以用

user: user-5
content: 引用 3 楼 HZHI123 的回复:不加限制地使用goto：破坏了清晰的程序结构，使程序的可读性变差,甚至成为不可维护的"面条代码"。经常带来错误或隐患，比如它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句。 关于使用goto语句的原则： （1）使用goto语句只能goto到同一函数内，而不能从一个函数里goto到另外一个函数里。 （2） 使用goto语句在同一函数内进行goto时，goto的起点应是函数内一段小功能的结束处，goto的目的label处应是函数内另外一段小功能的开始处。 （3）不能从一段复杂的执行状态中的位置goto到另外一个位置，比如，从多重嵌套的循环判断中跳出去就是不允许的。 （4）应该避免像两个方向跳转。这样最容易导致"面条代码"。  原则1 毫无意义 goto 本来就没有跨函数的功能 原则3 跳出多层循环本来就是goto 使用场景之一 不用goto用什么?

user: user-4
content: 是执行效率的问题 现代计算机都可以预取指令， goto就打破了这个方式了

user: user-6
content: 想要一次性跳出多层循环用下goto省事呗，还有些喜欢用goto跳到错误处理的，另外可能不太用 像从一个函数跳到另一个函数的这种太可怕了，严重的新手不友好

user: user-0
content: 没人举例子吗？
user-0 提问: 二分法找数字位置，大师帮忙看看

回复:
user: user-1
content: 二分查找的条件是： 序列有序; 序列之内无重复值。

user: user-2
content: 二分查找是对有序数组的

user: user-3
content: 怎么不科学呢。 都是按照你的代码逻辑走的啊 输入133，一直找到没有找到，但是mid的数值还是一直有效的啊，最后要输出，剩下什么就输出什么了 你的代码一直查右边， left=right=9就是结束情况，mid也是它  关键是二分法查找，先决条件是数组是排序过的，你这个没有排， 二分法也不好使

user: user-4
content: 最好直接贴代码，不要贴图片了。测试过程和结果可以贴图片的

user: user-3
content: 说错了， 你的流程是 while 进来后      mid =4。（9/2就是4）       find=133     第一个if不符合条件     第一个else符合条件          left=6         然后break退出了while循环  打印了mid+1 也就是5出来了  按照你的思路走 while 里面的部分要如下修改    if  成立的部分       只留一句break就可以了    第一个else里面         删除break那行    第二个else里面         不用改 } while 循环体外面， 到这里只有两种情况发现结果break出来的， 或者是left<right不满足 所以这里才是    if（left<right)          输出找到的结果   数组不是有序数组， 二分法无效的问题要先解决，否则前面的算法就是废柴
user-0 提问: 循环提前结束，循环的条件无故被修改

回复:
user: user-1
content: 我用vs2017运行了一下你这代码，没问题。建议你打个断点调试一下。

user: user-2
content: T[i].Left=cl-'0'; 重点看一下这个Left值是不是会导致check越界，越界操作可能就会修改N的值。

user: user-0
content: 为什么N会被修改呢？

user: user-2
content: #include<stdio.h>  #define MaxTree 10 #define ElementType char #define Tree int #define Null -1  struct TreeNode {     ElementType Element;     Tree Left;     Tree Right; }T1[MaxTree],T2[MaxTree];   Tree BuildTree(struct TreeNode T[]) {     Tree N,i,Root;     ElementType cl,cr;     printf("输入结点数\n");     scanf("%d",&N);//N的输入值为8     getchar();    //for '\n'     Tree check[20];     printf("输入每个结节的信息\n");     if(N){         for(i=0;i<N;i++){             check[i]=0;         }         for(i=0;i<N;i++){             printf("%d %d\n",i, N);             scanf("%c %c %c", &T[i].Element,&cl,&cr);             getchar();             if(cl!='-'){                 T[i].Left=cl-'0';                 check[T[i].Left]=1;             }             else T[i].Left=Null;         }         printf("i=%d N=%d\n", i,N);//循环提前结束，N的值也被无故修改         for(i=0;i<N;i++){             if(!check[i]){                 break;             }         }         Root=i;     }     return Root; }  int main(void) {     BuildTree(T1);      return 0; } 供参考～   加一条getchar();在第一个scanf之后，然后测试输出i = 8, N = 8

user: user-3
content: 因为 cr还没有被处的缘故吧 cl处理了，cr读入但是没有处理 check检查的时候遇到了没有被设置过的节点了  if(cl!='-'){                 T[i].Left=cl-'0';                 check[T[i].Left]=1;             }             else T[i].Left=Null; 这个后面应该有 if (cr != '-') 对T[I].Right 赋值和设置check【t【I】.Right】
user-0 提问: C语言小白求助！！！！！！！！！！！！！！

回复:
user: user-1
content: 这个就是可以无限输入哈，正数0负数都可以输入，楼上说的有些问题哈

user: user-2
content: 应该是只要输入就执行循环吧

user: user-3
content: scanf函数返回值是int，就是返回你成功输入的数量，而while是判断0或非零的，所以可以放在判断里，有输入则执行，没有为零跳出

user: user-4
content: 有看过书或者看视频学习吗？没有的话，建议百度一下。
user-0 提问: 急求，c语言大神

回复:
user: user-0
content: 尴尬，main 昏头了

user: user-1
content: 至于这个错误，我们是main函数，不是mian函数

user: user-1
content: printf里面\n不是空格，空格隔开最后在换行 你第一个的if比较完了a=b？那不是改变了变量本身的值？下面在用变量值会出错 第二个max>a[i]了那max都是大的了为啥要赋小的值？min同理；max跟min的判断可以放在一个循环，两个if就好了，没必要另开一个循环
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: switch语句在执行时 到case 1以后会在向下执行case直到遇到break

user: user-3
content: 缺少break，未必不是程序设计者的本意啊

user: user-4
content: #include<stdio.h> int main(void) { 	int x=1,y=1; 	int m,n; 	m=n=1; 	switch(m) 	{ 		case 0: 			x=x+2; 			break; 		case 1: 			{ 				switch(n) 					{ 						case 1:x=x*2;break; 						case 2:y=y*2;break; 						case 3:x++;break; 					} 				break; 			} 		case 2: 			x++;y++; 			break; 		case 3: 			x*=2;y*=2; 			break; 		default: 			x++; 			y++; 			break; 	} 	printf("%d %d\n",x,y); 	return 0; }

user: user-4
content: 缺少break吧

user: user-5
content: 没有加break的case会从你判断进入的case开始一直往下执行，不论下面的case的值是不是匹配，知道遇到break或执行结束为止

user: user-0
content: 了解 谢谢大佬

user: user-3
content: case 1: x*=2; case 2:y*=2; break;  因为 x*=2; 后面没有break， 它就会继续向下运行 case 2:部分的语句， 一直到遇到break为止  从内层的switch case语句出来，继续运行到break才推出外层的switch语句  看看书上关于case语句的描述， 有break和没有break的区别
user-0 提问: C语言求助！！！！！关于getchar（）的问题！！

回复:
user: user-1
content: getchar（）这个函数就是获取一个字符，只要你用了就会去获取，ch = getchar(); 就会把这个字符赋值给ch变量，跟ch有没有加一没有关系，其次你这个是字符不是数组，ch加一也只是去找下一个字符输出出去，也不会改变ch的值，你输出ch+1的时候ch是不变的，只是放到输出的结果的对应值会加一输出

user: user-0
content: 引用 1 楼 寻开心 的回复：ch = getchar();    //这里不懂！为什么会自动获取下一个字符，不是应该获取原字符吗？ch又没有+1 自动获取下一个字符，应该表述为，获得下一个键盘输入的字符 不是ASCII字母表顺序的下一个字符  while循环里面， 不断的获取键盘输入字符判断是什么内容并做不同的处理，直到遇到回车字符为止但是ch没有+1啊！为什么就获取了键盘输入的下一个字符？

user: user-2
content: ch = getchar();    //这里不懂！为什么会自动获取下一个字符，不是应该获取原字符吗？ch又没有+1 自动获取下一个字符，应该表述为，获得下一个键盘输入的字符 不是ASCII字母表顺序的下一个字符  while循环里面， 不断的获取键盘输入字符判断是什么内容并做不同的处理，直到遇到回车字符为止
user-0 提问: C语言初学者之10个数字排序问题

回复:
user: user-1
content: 注意j < 10时，j+1已经越界了。  第二层循环内改成： for (j = 0; j < 10 -1 -i; j++) if (a[j] > a[j+1]) {     temp = a[j];    a[j] = a[j+1];     a[j+1] = temp; }

user: user-0
content: 引用 1 楼 自信男孩 的回复：注意j < 10时，j+1已经越界了。  第二层循环内改成： for (j = 0; j < 10 -1 -i; j++) if (a[j] > a[j+1]) {     temp = a[j];    a[j] = a[j+1];     a[j+1] = temp; }点赞
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: 7  3 7  1 7 3  1 7 3 8  1 6    3 8 7   1 6    2 8 7 3  1 6    2 8 7 3 4  1 5    2 6 7 3 4 8

user: user-3
content: min-heap

user: user-4
content: 那就要么都写，要么就写一个后面坠上大还是小就好了啊，反正作业，练得是你会不会用，会了老师都会过的
user-0 提问: 结构体指针p指向结构体变量stu，在引用指针时（*p）以此形式出现，当中（*p）表示p指向的结构体变量stu，但*p不是表示取p指向的变量stu的值吗？

回复:
user: user-1
content: p是指针，不能p.num，只能p->num， p->num和stu.num是一样的 (*p).num和p->num，stu.num是一样的

user: user-2
content: p不是指向stu的指，而是指向stu的地址 即 赋值时 your_struct* p = &stu //声明一个结构体指针，指向stu的地址 所以 p->num 等价于 stu.num，等价于(*p).num

user: user-3
content: struct {      int num； } stu， *p； p = &stu; 如果是这样的话 那么    p->num   stu.num     (*p).num   这三者是一致的
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: 打印格式不对吧，而且打印参数和打印格式的个数也不一致 printf("%*s,%*s\n", 10, first_name, 10, last_name); //打印格式只有2个而且有误，打印参数有4个

user: user-3
content: getchar用于吸收scanf留到键盘缓冲区的回车键 一般是数字和字符混合输入的时候使用， 输入一个数字，再要求输入一个字符的时候， 需要在输入字符前用这个getchar函数或者fflush函数把键盘缓冲区清空， 否则获取的字符就是之前输入的回车键  从你的代码上，后面没有输入，这个getchar没有什么意义

user: user-4
content: scanf_s("%s", first_name, 40); 缺少参数。  可以不用。自己试试不用是否可以正常运行呢，自己完全可以自己试试
user-0 提问: 有关scanf的参数为函数或字符串的问题

回复:
user: user-1
content: 也可以去修改那个itobs函数， 在里面malloc一个空间， 然后return出去，用完了之后再去free它 这样他爱写多长的printf都可以，只要调用前用一个char*指针缓存这个返回值，回头用完了free掉就好了 itobs函数第二个参数都不必需要了

user: user-2
content: #include <stdio.h> #include <limits.h>  unsigned int lrotate(unsigned int, int); char * itobs(unsigned int, char *); int main() { 	unsigned int test; 	int bits; 	char bstr1[CHAR_BIT * sizeof(unsigned int) + 1]; 	char bstr2[CHAR_BIT * sizeof(unsigned int) + 1]; 	printf("请输入一个无符号整数\n"); 	while (scanf("%u", &test)) 	{ 		printf("请输入要旋转的位数\n"); 		scanf("%d", &bits); 		int ret; 		char *ret_bin1,*ret_bin2; 		ret_bin1 = itobs(test, bstr1); 		ret = lrotate(test, bits); 		ret_bin2 = itobs(ret, bstr2); 		printf("%u(%s) 向左旋转%d位后是%u(%s)\n", test, ret_bin1, bits, ret, ret_bin2); 		printf("请输入下一个无符号整数\n"); 	} 	return 0; } unsigned int lrotate(unsigned int dec, int n) { 	unsigned int mask = 0; 	unsigned int loss; 	unsigned int newdec;  	n = n % (CHAR_BIT * sizeof(unsigned int));  	for (int i = 0; i < CHAR_BIT * sizeof(unsigned int); i++) 	{ 		mask <<= 1; 		if (i < n) 			mask++; 	} 	loss = mask & dec; 	newdec = (dec << n) + loss; 	return newdec; }  char * itobs(unsigned int ori, char * pt) { 	const int size = CHAR_BIT * sizeof(int); 	for (int i = size - 1; i >= 0; i--, ori >>= 1) 		pt[i] = (1 & ori) + '0'; 	pt[size] = '\0'; 	return pt; } VS2015 C++环境调试

user: user-1
content: 存在两个问题 一  最关键在这个itobs(test, bstr)上面 printf函数里面调用了它两次， 而两次都对bstr做了修改， 这就是问题所在 c语言函数调用的时候，参数本身是函数，那么所有的函数都计算完成后，把结果作为参数完成真正的调用 你想想，此时这两个参数是什么？ 都是bstr这个字符串！！！ 所以，这两个参数是同一个值   二 为什么是代码上第一个 itobs调用后的bstr值，而不是第二个 这是因为，c语言当中并没有规定，函数的参数的执行顺序， 多个参数表达式谁先执行，谁后执行是未定义行为， 编译器可以自行规定 所以，这个结果在不同的编译器上，很有可能是不同的。 这种未定义行为必须避免  如何改 两次调用itobs用不同的bstr参数就好啦
user-0 提问: c/c++里，一段int类型怎么转成float？

回复:
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: 必须用普通循环逐个进行转换并赋值，复杂度为 O(kn)。 在实践中，如果你的平台支持 SIMD，则可以通过手动/编译器优化代码来减小常数 k。

user: user-3
content: 你没办法用memcpy啊， 两者之间的内存结构差异太大 只有同种类型的，你用memcpy取代赋值是可行的， int 1和float 1都是32位，但是内存结构上完全不同的， 不能用内存拷贝替代  如果只是char，short，int， long这些可以用memcpy 但是他们和float，double这种之间就没有办法了 赋值不是简单的memcpy，还包含了格式转换这一步

user: user-0
content: 引用 2 楼 自信男孩的回复:float表示的范围应该是大于int，所以直接赋值就好了。 当数据量大的时候，赋值比memcpy多2~3倍的时间

user: user-3
content: 没啥好办法， 只能再开个floa他数组，挨个赋值转换后再使用

user: user-0
content: 引用 1 楼 寻开心的回复:分配一个int类型的动态内存 和float有什么关系啊  float * data = (float*) malloc(sizeof(float)*(1<<23));   2^23在c里面可不是2的23次方，而是位预算当中的异或操作。   data是4*1024*1024*8 大概32MB的内存不算大 2^23是一个表示。 我有int的数据，要转成float来调用函数来运算，接口给的float。

user: user-4
content: 需要重新拷贝一遍吧

user: user-5
content: float表示的范围应该是大于int，所以直接赋值就好了。

user: user-3
content: 分配一个int类型的动态内存 和float有什么关系啊  float * data = (float*) malloc(sizeof(float)*(1<<23));   2^23在c里面可不是2的23次方，而是位预算当中的异或操作。   data是4*1024*1024*8 大概32MB的内存不算大
user-0 提问: 安装C语言的可选扩展，使完整支持C11，需要搜点什么装一下

回复:
user: user-0
content: 引用 3 楼 user-1的回复:C语言写的代码不死，但是C语言本身已经死了。 在硬件领域仍然在动的是C89甚至是k & r C [quote=引用 2 楼 與蘤舊縐 的回复:] [quote=引用 1 楼 user-1的回复:]C语言已死，没人折腾C11了吧。 这么嚣张的嘛不管怎么说至少在硬件领域依旧是王者[/quote][/quote] 原来如此，我只是喜欢新的，想了解下

user: user-1
content: C语言写的代码不死，但是C语言本身已经死了。 在硬件领域仍然在动的是C89甚至是k & r C 引用 2 楼 與蘤舊縐 的回复:[quote=引用 1 楼 user-1的回复:]C语言已死，没人折腾C11了吧。 这么嚣张的嘛不管怎么说至少在硬件领域依旧是王者[/quote]

user: user-0
content: 引用 1 楼 user-1的回复:C语言已死，没人折腾C11了吧。 这么嚣张的嘛不管怎么说至少在硬件领域依旧是王者

user: user-1
content: C语言已死，没人折腾C11了吧。
user-0 提问: c中如何对浮点数进行位运算？如果不能，怎么读取浮点数二进制内容？

回复:
user: user-0
content: 错了，这样弄不成，兜兜转转还是要转换。 妙啊!

user: user-0
content: 引用 4 楼 寻开心 的回复:long long itobs(long long int n) {  	long long int s=0; int i; int size=8*sizeof(long long); for(i=size-1;i>=0;i--,n>>=1)     { s|=(1&n); // 这里s最多也就是1， 因为之前的s是0    	s>>=1;  // 再右侧移， 结果必然是0     }     printf("%lld\n",s); return s; }  没明白你这个函数要做什么  主函数里面 long long int t = *((long long int*)&num);  这样才是把num强制转换成long long printf("%#llX", t); // 就可以直接输出16进制的long long类型  通过了   原来的思路是想通过位运算，把t的二进制数字复制到s中，把s中的数字弄到字符串里，用itoa。。。。不过貌似不能实现，itoa进的是十进制intger  这个是仿照c primer plus里的一个显示二进制的程序改编的，但是貌似这里好像用不了这么麻烦。。。。  我想实现以二进制形式的copy，虽然及其笨拙。。。但是我调试的时候，s的值有1啊。我觉得这个逻辑没问题。

user: user-1
content: long long itobs(long long int n) {  	long long int s=0; int i; int size=8*sizeof(long long); for(i=size-1;i>=0;i--,n>>=1)     { s|=(1&n); // 这里s最多也就是1， 因为之前的s是0    	s>>=1;  // 再右侧移， 结果必然是0     }     printf("%lld\n",s); return s; }  没明白你这个函数要做什么  主函数里面 long long int t = *((long long int*)&num);  这样才是把num强制转换成long long printf("%#llX", t); // 就可以直接输出16进制的long long类型

user: user-0
content: 引用 2 楼 寻开心 的回复:double d = 123.456； long long int  t = (long long int *) &d; 然后把t按照位输出就行了  double是8位， float是4位 int 和 long int 在windows下都是 4位， long long int 才是8位 #include <stdlib.h> #include <stdio.h> long long itobs(long long int n) {  	long long int s=0; 	int i; 	int size=8*sizeof(long long); 	for(i=size-1;i>=0;i--,n>>=1)     {    		s|=(1&n);    		s>>=1;     }     printf("%lld\n",s); 	return s; } int main(void) {     double num;     char str[65];     scanf("%lf",&num);     long long int t=(long long int)*#     itoa(itobs(t),str,16);     printf("%s",str);     return 0; } 不知道怎么回事，这个t用longlong输出是0，调试的时候位操作有效，但这个好像只截了一部分

user: user-1
content: double d = 123.456； long long int  t = (long long int *) &d; 然后把t按照位输出就行了  double是8位， float是4位 int 和 long int 在windows下都是 4位， long long int 才是8位

user: user-0
content: 源题 7-35 研究：双精度实数的机内码* (10分)  输入格式 十进制实数  输出格式 机内码(十六进制)  要求：十六进制机内码中的字母均为大写。  例如：实数 3.6 转换成二进制是 11.1001100110011001...，科学计数法记为：1.11001100110011001...×10^ ​1 ​​ ，因此 64 位的机内码为：0100000000001100110011001100110011001100110011001100110011001101，用十六进制书写则为：400CCCCCCCCCCCCD。