Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C 语言 想外部输入16进制的数，保存在数组中，如何判断数是否输完，数的长度未知

回复:
user: user-0
content: 这些采集的数据将作为非字符传输

user: user-1
content: 引用 20 楼 Slzde_sub 的回复:  你这个有点懵啊   要么0  要么FF  要么eof   还想怎样  谁提的需求 。  叫他出来 让输入数据的人血溅当场的时候，就是数据输入完的时候！

user: user-1
content: 为什么不学debug的a命令，连续两次回车结束输入呢？

user: user-2
content: 原始问题？ 通信输入，缓存读空就没了 按键输入可以做延时读空等

user: user-1
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.  结合fgets(buf,len,stdin);

user: user-3
content: 不要提问这种你自己思考一半的问题 把原始的问题贴出来

user: user-4
content: gets回来再解析呗。。。

user: user-5
content: 引用 11 楼 qq_42711337 的回复:[quote=引用 10 楼 jha334201553 的回复:] [quote=引用 9 楼 qq_42711337 的回复:] 请问 getch和 isprint 的具体函数？还有0x1b代表的是什么意思 两个库函数 #include <conio.h> #include <ctype.h> [/quote]  是否有其他方法？ conio.h 貌似不是标准的头文件[/quote] 你这属于能力不够，又喜欢折腾。你自己完全可以标准化重写一个 getch

user: user-0
content: 引用 10 楼 jha334201553 的回复:[quote=引用 9 楼 qq_42711337 的回复:] 请问 getch和 isprint 的具体函数？还有0x1b代表的是什么意思 两个库函数 #include <conio.h> #include <ctype.h> [/quote]  是否有其他方法？ conio.h 貌似不是标准的头文件

user: user-0
content: 数据传入的时候，不能添加#  之前考虑过EOF 但是还是被否决了

user: user-6
content: 设定一个结束符号，比如以#表示结束。那么： do { int x = scanf("%x", a); } while ((char)x != '#');

user: user-0
content: 如何使用scanf的返回值  如果是字符串的话是以回车为结束 如果是scanf("%x",a); 是以空格为结束 ，但是输入的时候是以空格分隔的 ，只能输入一个数 ，后续的数都保存不了

user: user-4
content: 用scanf的返回值。

user: user-0
content: 因为不知道数组的长度 所以不能采用n<16  问题是：输入一个未知长度的数组（而且是16进制） 如何判断是否已经输入完

user: user-7
content: 看你怎么放了，如果你是数组里1个单元放1个数字，那就循环16次啊；   int n=0,num[16]; while(n<16) {     n++;     scanf("%d",num[n]); }

user: user-5
content: 引用 9 楼 qq_42711337 的回复:请问 getch和 isprint 的具体函数？还有0x1b代表的是什么意思 两个库函数 #include <conio.h> #include <ctype.h>

user: user-0
content: 请问 getch和 isprint 的具体函数？还有0x1b代表的是什么意思

user: user-5
content: 用getch完事啦，自己判断是什么字符，比如： esc是 0x1b char ch; while( (ch = getch()) != 0x1b ) {     if (isprint(ch))     {         putch(ch);     } }

user: user-0
content: 请教各位大佬
user-0 提问: 如何用c语言编写  关闭应用  却 不关闭应用 

回复:
user: user-0
content: 引用 7 楼 jha334201553 的回复:窗口显示与关闭都是自己控制的啊，想关闭哪个关闭哪个。别拿console窗口出来，那个是另类对啊是想关闭那个就关闭那个，有必要么？还要用鼠标。我是想少点几下。

user: user-1
content: 窗口显示与关闭都是自己控制的啊，想关闭哪个关闭哪个。别拿console窗口出来，那个是另类

user: user-0
content: 引用 2 楼 colinfang2006 的回复:Window.hide() 楼主还是把自己的诉求说明白点吧→A网页，B代表网页的功能，A包含B，从功能来说B是A的功能(从B图片上那个叉代表的内个功能的角度讲)。？→如何关闭A，不关闭B的进程

user: user-2
content: 想了半天什么叫“关闭应用 却 不关闭应用”

user: user-0
content: 引用 3 楼 yiyefangzhou24 的回复:想了半天什么叫“关闭应用 却 不关闭应用”X和关闭进程

user: user-3
content: Window.hide() 楼主还是把自己的诉求说明白点吧

user: user-4
content: “编写 关闭应用 却 不关闭应用”------> 应用程序窗口隐藏了，看起来好像关闭了，实际上还在~~~~
user-0 提问: 求解答：求1到1888888之间的平衡数。所谓i（十进制数）是平衡数是满足下列要求的数，1到i之间的十进制数中出现1的个数总和与i相等。

回复:
user: user-1
content: 这代码没问题，我用了其他一种方法验算了下，输出结果是一致的。

user: user-2
content: 没看懂你说的平衡数是什么意思。按照你的说法，只有1才是平衡数。其他的任意一个数，出现1的次数都不会比这个数大。

user: user-3
content: for (int i = 1 ; i < 1888888; i++)  { //这里加上 cnt = 0;
user-0 提问: 怎样将 UInt16 * 转为 wchar_t *?

回复:
user: user-1
content: 可以用MultiByteToWideChar。 UInt16*转为CHAR*

user: user-2
content: 可以直接转吧。  比如  A 为 UInt16 *型指针，B为wchar_t *型指针 可以直接写 B= (wchar_t *) A； 这样强转，可能有的编译器会有警告。  也可以这样转，如果你的系统指针是4个字节的话，  B= (wchar_t *)((Uint32) A)；

user: user-3
content: 直接转不行么？ 这两个不都是指针么？ 也就是访问类型，那直接转应该能行把？ 不过就要承受转换后带来的后果了  不同的数据类型访问的地址大小长度肯定是不一样了

user: user-4
content: 你不会的话可以先转成别的类型在转成wchar_t * 比如把 UInt16 * 转成string 、char、或者char[]之类，再转化一次
user-0 提问: 求助，为什么我这个吧整数转换为字符串的函数不正确，谢谢!

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

user: user-1
content: //将一个整数转化为字符串  void MyIntToStr(unsigned char *dst, int len,uint16_t data) { //itoa(data,(char*)dst, 10); snprintf((char *)dst, len, "%d" , data); }   unsigned char wrbuf[9]; MyIntToStr(wrbuf,9-1, 9999);

user: user-1
content: sizeof返回指针的大小，通常是4 strlen返回0结尾的字符串长度 两者都表达不了dst指向地址开始的可用字节数这个概念

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复://将一个整数转化为字符串  void MyIntToStr(unsigned char *dst, int len,uint16_t data) { //itoa(data,(char*)dst, 10); snprintf((char *)dst, len, "%d" , data); }  unsigned char wrbuf[9]; MyIntToStr(wrbuf,9-1, 9999);      实现了，这个是可以 为什么 void MyIntToStr(unsigned char *dst, uint16_t data) {     //itoa(data,(char*)dst, 10);     int len = strlen((const char*)dst);     snprintf((char *)dst, len, "%d", data); }  也不行阿?
user-0 提问: linux C TCP UDP server 接收多个客户端同时连接的多线程

回复:
user: user-1
content: 同IP同port两个程序同时接收可以实现么?

user: user-0
content: 引用 2 楼 user-3 的回复:楼主：应该是下面的代码由问题吧？ ptr_arg.protocol = 'T'; ptr_arg.fd = tcp_connectfd; memcpy((char *)&ptr_arg.sock, (const char *)&client_addr,sizeof(struct sockaddr_in)); ptr_arg.num = i; if(pthread_create(&pthid, NULL, deal_send_pth, (void *)&ptr_arg) < 0) 其中ptr_arg变量，每次接受到一个新客户端连接时，就把这个这个变量值赋值为最新的，而之前保存的那些字应该给覆盖了。所以最后只有一个fd有效了，因为你把以指针参数的方式传给线程使用。楼主可以动态分配ptr_arg值，每次新客户端连接进来就动态分配一个，再传个线程，这样就应该可以了。  不是这个问题，现在问题已经解决了，非常感谢。

user: user-2
content: 参考epoll源代码相关片断。

user: user-3
content: 楼主：应该是下面的代码由问题吧？ ptr_arg.protocol = 'T'; ptr_arg.fd = tcp_connectfd; memcpy((char *)&ptr_arg.sock, (const char *)&client_addr,sizeof(struct sockaddr_in)); ptr_arg.num = i; if(pthread_create(&pthid, NULL, deal_send_pth, (void *)&ptr_arg) < 0) 其中ptr_arg变量，每次接受到一个新客户端连接时，就把这个这个变量值赋值为最新的，而之前保存的那些字应该给覆盖了。所以最后只有一个fd有效了，因为你把以指针参数的方式传给线程使用。楼主可以动态分配ptr_arg值，每次新客户端连接进来就动态分配一个，再传个线程，这样就应该可以了。
user-0 提问: 求助，怎么把[100, 254][1001, 2542]这样字符串中的数字提取出来变成整形数字？

回复:
user: user-1
content: 首先 if ((*str > '0') || (*str < '9'))  这里加不加等于号我不清楚，但是根据你的注释来看 ，“||”应该改成  “&&”   然后你说的下一个问题，既然实现了单个，你把这整套方法加到循环里，多次执行不就能识别出多个来了吗。你这个函数里整体是顺序执行的，局部循环只是为了找出方括号里的数字字符，肯定不能实现多个类似格式数据的查找。

user: user-2
content: int x, y; 	char* str = "[100,10]"; 	int ret = sscanf(str, "[%d,%d]", &x, &y);

user: user-0
content: 这是我自己写的，有点问题，单个[100,100]的时候可以，多个的时候不行，能否指点一下

user: user-0
content: void str2int1(char *str) {       len_point = 0;  //[10,500][20,300]     mid_point = 0;      if (*str == '[' )  //如果第一个字符是 [     {                  //则移到下一个字符         str++;      }     while(*str != 0 )     {         if ( (*str == ',') )  //如果当前字符是 ,         {                     //则退出循环            break;         }         if ((*str > '0') || (*str < '9'))  //如果当前字符是数字         {               //mid_point = mid_point * 10 + (*str - '0'); //如果当前字符是数字则计算数值           mid_point = mid_point * 10 + (*str) - '0';             str++;      //移到下一个字符         }     }      if (*str == ',' )  //如果第一个字符是 ,     {                      //则移到下一个字符         str=str+2;     }     while(*str != 0 )     {         if ( (*str == ']') )  //如果当前字符是 ]         {                     //则退出循环            break;         }         if ((*str >'0') || (*str < '9'))  //如果当前字符是数字         {              //len_point = len_point * 10 + (*str - '0'); //如果当前字符是数字则计算数值             mid_point = mid_point * 10 + (*str) - '0';             str++;      //移到下一个字符         }     }   }

user: user-3
content: 识别数字前后的字符，当做判断条件
user-0 提问: 关于指针：为什么局部变量销毁后，p的值还是不变啊？？

回复:
user: user-1
content: 你再运行一个新的函数 里面的数据就会变化了 临时变量是在堆栈里面的, 你退出了一个函数 堆栈往前移动,  你进入一个函数 堆栈往后移动

user: user-2
content: 还没有人覆盖这个内存的内容，但是允许其他人覆盖，所以不建议这样写

user: user-3
content: 所以stack攻击才得以成立。

user: user-4
content: 调用f()函数时，开辟了个临时int空间（设该空间地址为1234），存放b的值并吧b的地址给了p； 当执行第一个printf语句时，存放在（空间1234）里的值还没被重置， 当执行完第一个printf语句后，空间（1234）里的值就被重置了 所以第二个printf语句输出0； 调用完f()后，函数里面的变量b是被销毁了的，但存放b的值的地址空间是没办法销毁的 不过里面的值会在执行一个语句后刷新重置； 如果b是全局变量，调用f()后就不会被销毁，存放b的值的地址空间的值也就不会刷新，多少次printf值都不会变 以上是我个人理解

user: user-3
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-3
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，[color=#FF00FF]没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。[/color] 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-5
content: 因为被调函数进行了压栈的操作，当返回时，尽管函数栈被销毁，但实际上只是栈顶的指向被修改了而已，这块内存实际上还是可以被访问的。如果这时候你再去调另外一个函数，这个值可能就发生变化了，你可以试验一下。

user: user-6
content: 3楼说的有理，讨论这个没有多大的意义，关键是你要理解指针是怎么回事  另外在f（）里面，这样用是不妥的，返回了一个局部变量的一个地址，这个地址实际上出了函数就不要用了才是

user: user-7
content: p的值是地址，释放的是存在这个地址里的内容，但是这个地址本身是不变的。

user: user-8
content: 那块内存没有被其他程序使用，所以值没有被修改

user: user-3
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-9
content: 说的都很好

user: user-3
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-10
content: 先把堆栈和指针理解了，在看，你的问题自己就解决了。  #include <stdio.h>  int *f()  // normal func return type int* { 	int b = 0xcafe9abe; //int value b = 0xcafe9abe; 	int *p1 = &b;           // p1 is a point value = b 's address; 	return p1;                // return value is a int * point value = b's address (一旦函数结束，int b 的地址（栈）已经被操作系统释放） }  void g() { 	int b = 0xdeadbeee; }  int main() { 	int *p = f(); 	printf("%X\n", *p); 	//g(); 	printf("%X\n", *p); }  不是俩个函数的局部变量名字一样就在内存里一样。仔细看书吧。

user: user-11
content: 都说的很好111

user: user-3
content: 理解和讨论之前请先学会如何观察！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-12
content: 之所以一样，是因为f函数使用的空间未被其他函数占用。局部变量在函数调用结束后是会被自动释放，自动释放的意思就是这部分栈空间可以被其他的函数栈使用，如果继续读取已经释放的栈空间是未定义行为。 如果已经释放的栈空间被别的函数栈使用，那么b的内存空间可能被写入新的值。因此输出的就不是原来的值了。

user: user-13
content: 函数返回后，函数里局部变量的内存空间回归操作系统，因此里面的内容不可预期。 在你的例子中，如果这段内存空间操作系统还没有写入，内容不变；操作系统写入了，内容就有变化。 对于开发者而言，只需记住：函数返回局部变量是不可取的。

user: user-14
content: 就是你刚写过，虽然你放弃了他 但是你放弃的是访问他的权力，他还是那样没有变 直到有人在此访问他改变他的值啊

user: user-15
content: 使用已经销毁的指针是未定义行为，讨论这个毫无意义 要想知道为什么第一次可以第二次不行请自行单步汇编去理解，简单地说就是第一次堆栈的值并没有被覆盖，第二次因为之前调用了一次printf，堆栈已经被覆盖了
user-0 提问: 求任意两个数的最小公倍数

回复:
user: user-1
content: 这种方法不是很好，我们求解最小公倍数和最大公约数问题一般都是采用辗转相除法。 其中，辗转相除法可以这样表示，用函数递归的思想 int X(int a,int b) {    if(b==0) return a;   else      return X(b,a%b); }

user: user-2
content: 使用辗转相除法

user: user-3
content: 辗转相除法求最大公约数 然后两个数相乘除以最大公约数  你这样写时间复杂度太高

user: user-4
content: #define _CRT_SECURE_NO_WARNINGS 1  #include<stdio.h> #include <windows.h>  int main() { 	int a, b; 	printf("请输入两个数:"); 	scanf("%d %d", &a, &b); 	int i = a; 	for (;; i++) 	{ 		if (i%a == 0 && i%b == 0) 		{ 			printf("最小公倍数为:%d\n", i); 			break; 		} 	} 	system("pause"); 	return 0; }

user: user-4
content: 可以用辗转相除法求最大公因式，然后求最小公倍数

user: user-5
content: #include<stdio.h> #include <stdlib.h>  	void main() { 	int a,b; 	scanf("%d%d",&a,&b); 	int i=1,j; 	for(;;i++) 		if(i%a==0 && i%b==0) 		{ 			printf("最小公倍数为:%d\n",i); 			break; 		} 		system("pause"); }

user: user-6
content: 一般算法是先计算 a和b的最大公约数，然后通过最大公约数计算最小公倍数

user: user-7
content: for(;;i++)              if(i%a==0 && i%b==0)              {                  printf("最小公倍数为:%d\n",i)              } 这是一个死循环的逻辑。建议加上break跳出循环

user: user-8
content: 一个是花括号的使用，一个是for循环没有退出，如果是初学者的话，用这个遍历的方法就够了，再难一点就是写算法计算最小公倍数，因为如果数很大的话，遍历费时间  void main() { 	int a,b;     scanf("%d%d",&a,&b);     int i=1,j;     for(;;i++)       { 	      if(i%a==0 && i%b==0)           {              printf("最小公倍数为:%d\n",i);              break;//找到值后退出for循环            }              	  } 	   	getch();//暂停以显示  }

user: user-9
content: 呃 你放这段代码想干嘛？
user-0 提问: C语言编写某公司旗下的车辆使用管理系统 目前还缺少主函数和菜单将三个表连接到一起    个人能力有限，只能写一部分了，还望各位大神帮帮忙！

回复:
user: user-1
content: 用php写更方便吧

user: user-2
content: 引用 1 楼 weixin_42562729 的回复:很好奇拿C语言写管理系统，一般C不是底层硬件开发的么？开发管理系统C语言有交互界面么？用起来不是不方便？  感觉打基础用C语言来写正好，逻辑清楚，就是比较复杂

user: user-3
content: 引用 1 楼 weixin_42562729 的回复:很好奇拿C语言写管理系统，一般C不是底层硬件开发的么？开发管理系统C语言有交互界面么？用起来不是不方便？ C语言写这个确实不是很好的选择，里面特别是用链表实现动态存储的时候，需要考虑的东西不少，但是作者应该是课程设计或者项目设计吧，或者是刚学完C，拿来练手，不管怎么说，除了没有界面，其他的还是很挺好的。  主函数也挺简单的，就定义一个链表当做头结点，把你的其他表挂到里面当做普通变量，然后该传啥传啥，该干嘛干嘛，保证始终操作的是主函数那个头所在的那块地址就好了，然后注意使用的时候判断节点是否为空，不是循环链表判断是否到达链表末尾，就没啥大问题了。

user: user-4
content: 很好奇拿C语言写管理系统，一般C不是底层硬件开发的么？开发管理系统C语言有交互界面么？用起来不是不方便？
user-0 提问: 小顶堆排序出了点问题救助。

回复:
user: user-1
content: for循环中的取值范围设置不当  for (j=2*s+1;j< m;j=j*2+1) for(i=L->length/2-1;i>=0;i--)  排序代码供参考。还有，数据能解决的问题，为啥搞得这么复杂。。。 #include<stdio.h>  typedef struct {     int r[12];     int length; }List;  void HeapAdjust(List *L, int s, int m) {     int temp,j;     temp=L->r[s];     for (j=2*s+1;j< m;j=j*2+1)     {         if(j+1<m && (L->r[j] > L->r[j+1]))         {             ++j;         }          if(temp < L->r[j]) break;          L->r[s] = L->r[j];         s=j;     }     L->r[s] = temp; }  void HeapSort(List *L) {     int i;     for(i=L->length/2-1;i>=0;i--)         HeapAdjust(L,i,L->length);      for(i = L->length-1; i >= 0; i--)     {         int temp = L->r[0];         L->r[0] = L->r[i];         L->r[i] = temp;          HeapAdjust(L,0,i);     } }  int main(int argc, const char * argv[]) {     List a;      List *L = &a;     L->length = 11;  L->r[0]=111;     L->r[1]=333;     L->r[2]=222;     L->r[3]=666;     L->r[4]=555;     L->r[5]=999;     L->r[6]=444;     L->r[7]=777;     L->r[8]=888;     L->r[9]=101;     L->r[10]=121;      HeapSort(L);       for(int i=0;i<11;i++)     {         printf("%d\n",L->r[i]);     }      return 0; }

user: user-0
content: 有没有大佬啊
user-0 提问: 关于gets（）后面的代码会被跳过的问题

回复:
user: user-1
content: void spt(struct student** q) { int i; for (i = 0; i < *q; ++i) { printf("请输入第%d个学生信息：\n", i + 1); printf("姓名："); gets(q[i]->name); printf("年龄："); scanf_s("%d", &q[i]->age); printf("成绩："); scanf_s("%f", &q[i]->score); return; } } 这个逻辑不会发现有问题吗？*q是循环变量的最大值，怎么循环体内还对q[i]->name等呢？

user: user-1
content: scanf_s("%d", &*p); 这个有问题的（*p是取p指向的内存单元的值，&是取地址，取地址一般是对变量的，&*p是对常量取地址，并且这个地址也是不可读写的值）。为什么绕个弯呢，直接一下就好了  scanf_s("%d", p);

user: user-2
content: 给结构体指针分配地址时，len还没有得到输入，它的值是0，因此此处没有分配到内存，接下来的操作就出现非法内存访问了。 第二个问题，函数spt中的循环终止条件是*q，这是地址而不是数组长度，应该跟arr函数一样传入一个学生个数的参数。 另外，传入学生个数不必传地址。
user-0 提问: 好想知道这个关于餐馆点菜的程序哪里出错了，运行时只能进入管理员账户无法创建新用户进入主管和服务员页面

回复:
user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。
user-0 提问: 链表删除结点的问题

回复:
user: user-1
content: 引用 2 楼 heabby2010 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633  谢谢老师，我再研究研究[/quote] 看链接中帖子#43

user: user-2
content: 楼主，可以参考参考下面代码： typedef struct LNODE { 	data_t data; 	struct LNODE * next; }Node_t, *PNode;   int Delete(PNode* PHead, data_t data) { 	int status = -2; 	PNode PCur = *PHead; 	PNode prevNode = NULL; 	while (PCur) 	{ 		if (data.sn == PCur->data.sn) 		{ 			if (prevNode != NULL) 				prevNode->next = PCur->next;  			PNode tempNode = PCur; 			PCur = PCur->next;  			if (prevNode == NULL) 				*PHead = PCur;  			free(tempNode); 			tempNode = NULL;  			status = 0;//success 			break; 		}  		prevNode = PCur; 		PCur = PCur->next; 	} 	return status;//NULL or get it. }

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633  谢谢老师，我再研究研究

user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
user-0 提问: execv函数参数构建

回复:
user: user-0
content: 引用 3 楼 赵4老师的回复:别忘了还有realloc 多谢赵4.....er老师提醒

user: user-1
content: 别忘了还有realloc

user: user-0
content: 多谢您的回复，man手册我读过没有提到过execv系列函数的argv数组指针的构建。您给的这个是execl系列函数的参数介绍，这个其实比较简单我觉得....。 如果使用我的不断malloc的想法的话，释放内存肯定是个问题。感觉这样做太机械化了。

user: user-2
content: 楼主：linux man page说明的参数如下： The const char *arg and subsequent ellipses in the execl(), execlp(), and execle() functions can be thought of as arg0, arg1, ..., argn. Together they describe a list of one or more pointers to null-terminated strings that represent the argument list available to the executed program. The first argument, by convention, should point to the filename associated with the file being executed. The list of arguments must be terminated by a NULL pointer, and, since these are variadic functions, this pointer must be cast (char *) NULL.   按照你说的，你的方法应该可以的，尝试实践才知道结果。
user-0 提问: c语言猜数字

回复:
user: user-0
content: 引用 8 楼 colinfang2006 的回复:我的意思是维护一个数组，保存每次猜测后还有可能是答案的数。 初始数组里面有10 * 9 * 8 * 7=5040个数。 每次猜测后，都需要在数组中划掉一部分不符合要求的数字。 例如你猜测1234，结果是0A0B，那么数组中所有含有1、2、3、4的数组都不符合要求。 哦有点明白的 感觉好难，我努力试试吧 谢谢啦

user: user-0
content: 引用 6 楼 colinfang2006 的回复:提供个思路： 计算机猜测的数字尽可能带来的信息量较大，比如可以猜每次留下的数中，每一位出现最多的数字    大神能在详细的说一下吗....萌新实在是不太懂

user: user-1
content: 提供个思路： 计算机猜测的数字尽可能带来的信息量较大，比如可以猜每次留下的数中，每一位出现最多的数字

user: user-1
content: 我的意思是维护一个数组，保存每次猜测后还有可能是答案的数。 初始数组里面有10 * 9 * 8 * 7=5040个数。 每次猜测后，都需要在数组中划掉一部分不符合要求的数字。 例如你猜测1234，结果是0A0B，那么数组中所有含有1、2、3、4的数组都不符合要求。

user: user-0
content: 引用 1 楼 yfqvip 的回复:http://bbs.bccn.net/viewthread.php?tid=474692&extra=&page=1 自己输入我会就是不太懂如何写 给上一次的A B 程序猜下一个数 求帮助

user: user-0
content: 引用 2 楼 hou09tian 的回复:guess()函数的作用就是提示玩家输入一个数字，并把这个数字作为返回值吧？  就是让程序自己猜不用输入数

user: user-0
content: 引用 2 楼 hou09tian 的回复:guess()函数的作用就是提示玩家输入一个数字，并把这个数字作为返回值吧？不是 是给上一次 A B 的值 然后返回你猜的数

user: user-2
content: guess()函数的作用就是提示玩家输入一个数字，并把这个数字作为返回值吧？

user: user-3
content: http://bbs.bccn.net/viewthread.php?tid=474692&extra=&page=1
user-0 提问: C语言文件打开失败

回复:
user: user-1
content: 我用cocoa编程出现同样问题，命令行没问题。

user: user-2
content: 使用strerror(errno);输出文件打开失败的原因。

user: user-3
content: 沒問題吧？“its fail”都沒見打印出來。
user-0 提问: 动态库链接静态库的问题

回复:
user: user-0
content: 看上去没啥好方法，结贴吧。。。

user: user-0
content: 引用 1 楼 boise 的回复:保持能正常调用的Bin方式， 让你的动态库去调用执行Bin文件，想办法解决传递数据的问题吧。 这是个思路，只是现在用到的函数是性能关键路径，如果通过bin文件的方式去访问，性能损耗比较大

user: user-1
content: 保持能正常调用的Bin方式， 让你的动态库去调用执行Bin文件，想办法解决传递数据的问题吧。
user-0 提问: 求大神解c语言中数组与指针的问题

回复:
user: user-1
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-2
content: a可以理解为指针常量。数组名本身就是地址，可以把a当做指针来用，但需要注意它是指针常量

user: user-3
content: a[b] 就是 *(a + b) 的缩写，其中a、b一个是地址，一个是整数，顺序无所谓

user: user-4
content: 尽量不要问这种问题，非常基础。而且答案 c/c++的基础书籍中，都可以轻易找到

user: user-5
content: VS2015输出是0啊。 &a和a都是指向数组a的第一个元素的地址，即&a[0]  但是两者也是有区别的。 请参考 《C++中对数组名的运算》 《C++中指针的数组和数组的指针》 希望能够帮到你

user: user-6
content: 数组名作为参数传递给函数时,数组名会退化为指针

user: user-7
content: 数组和指针关系了解一下。

user: user-8
content: 在仔细看看数组那块的知识吧。。  数组名是可以直接代表数组首单元的地址的。。。
user-0 提问: 关于C语言中malloc函数的疑问

回复:
user: user-1
content: 当实际用户输入的数据量 > malloc分配时设定的字节大小 越界操作属于高危操作

user: user-2
content: malloc所分配的内存是一块连续的空间（逻辑上连续，物理上不一定）。同时，malloc实际分配的内存空间可能会比你请求的多一点，但是这个行为只是由编译器定义的。malloc不知道用户所请求的内存需要存储的数据类型，所以malloc返回一个void *的指针，它可以转换为其它任何类型的指针。

user: user-3
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-4
content: 不一定连续，但是我们不需要关注连续不连续。我们使用的内存地址是虚拟地址，内存由MMU来管理，MMU是会处理虚拟地址与物理地址的映射关系； 内存分配会比malloc参数指定的要大，因为要存储一些内存管理信息（用于管理申请的内存），这部分多出的内存是有系统决定的（malloc是程序运行时申请的，所以跟编译器没关系）。

user: user-5
content: MSDN关于malloc()函数的描述 The malloc function allocates a memory block of at least size bytes. The block may be larger than size bytes because of the space that's required for alignment and maintenance information. malloc()函数分配的内存空间至少是函数参数指定的字节数，而实际分配的内存空间比指定的要大一些，因为分配的内存空间中还要包含内存空间的排列信息和维护信息。
user-0 提问: 大神们这如何操作

回复:
user: user-1
content: DosBox是个好东东！

user: user-2
content: 引用 7 楼 u010165006 的回复:[quote=引用 6 楼 goldenhawking 的回复:] 各种老掉牙的软件： https://winworldpc.com/library/operating-systems 再用Oracle VirtualBox安装。   层主经历旺盛~[/quote] 老了，把以前写的程序全攒到虚拟机里留着。

user: user-3
content: 引用 6 楼 goldenhawking 的回复:各种老掉牙的软件： https://winworldpc.com/library/operating-systems 再用Oracle VirtualBox安装。   层主经历旺盛~

user: user-2
content: 各种老掉牙的软件： https://winworldpc.com/library/operating-systems 再用Oracle VirtualBox安装。

user: user-2
content: 如果是非要在TC2下输入汉字，只有虚拟机DOS6.22+UCDOS 7.0 +TC2了。老掉牙的东西。 否则，建议参考3楼。

user: user-4
content: 感觉楼上的做法应该可以

user: user-3
content: TC（Turbo C）老代码（比如小游戏）最好看懂了以后，理解了算法和过程，用VC改写成Windows平台的。  楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  下载一个EasyX包，里面有完整的函数手册EasyX_Help.chm，有示例。EasyX官网有很多网友上传的实例，包括游戏。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

user: user-5
content: 挖了个坟，类似主题，不过结果貌似不行。。。 https://bbs.csdn.net/topics/60045726

user: user-6
content: 百度 怎样在TC2.0中输入汉字输出汉字
user-0 提问: 有关 SDK listview 分组的问题？？（再次发帖，寻求大神解答！）

回复:
user: user-0
content: 没有人回答吗？

user: user-0
content: 我没在VC里测试过，不过我想知道在winGW里编译通过，该怎么处理？？

user: user-1
content: 在vs中编译没什么大问题。 #pragma comment(linker, ... 这句估计你的没起作用。
user-0 提问: CentOS64, 一个函数内static指针的值竟然不知怎么就变了——已解决，来接分了

回复:
user: user-1
content: 自己找出問題，成就感滿滿的。

user: user-2
content: 学会使用数据断点：#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }     GDB有watch命令

user: user-3
content: 来接分， 越界操作危害大呀

user: user-0
content: 这个问题就是数组越界的原因，有段代码使用一个数组，数组的索引越来越大，慢慢的就覆盖了它后面的内容，导致它后面的内容被覆盖成了相应的值。 用objdump -x 查找被修改的变量前面的变量，再看检查操作那些变量的代码有没有问题
user-0 提问: 在将汉字存入文件时，遇到了乱码问题，新手求大佬帮助

回复:
user: user-1
content: 楼主，在我本地测试发现如下： 1)“但是如果文件为空的情况，并且第一个存储的汉字是“猫”或者“猫猫”这种连续的以猫为内容的字符串存入的文件就会出现乱码” -->这种情况，内容保存在txt文件中是已utf-8的格式保存的，所以你使用记事本打开时，会显示乱码。如果你使用notepad++使用ANSI编码打开时，显示的就是猫或者猫猫。 2) "如果文件不为空，且第一个存储的汉字不是“猫”，都不会出现乱码" -->这种情况，例如第一个字是狗字，那么保存到文件中的内容的编码是ANSI编码的，所以你使用记事本打开的时候，显示没有乱码。 3)"如果在“猫”字乱码的基础上，再次存入一个其他汉字，猫的乱码就会恢复" -->这种情况例如第一个字是猫字，这是保存的内容的编码是utf-8的编码格式，但输入第二个字，例如为狗字时，保存的内容“猫狗”的编码确实ANSI编码格式了，所以使用记事本打开时，显示没有乱码。  猜测原因：应该是系统会根据你写入文件的内容而动态的改变内容的编码格式，来寻求存储方面的最优化。

user: user-0
content: 谢谢你们，大致了解了

user: user-2
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-3
content: 我估计，当后一种情况的时候，实际上文件头已经标明了UTF编码，比如是EF BB。
user-0 提问: 指针变量问题

回复:
user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-2
content: 印象中这段代码是谭浩强书上的经典错误

user: user-3
content: 引用 1 楼 user-5 的回复:楼主先看下面一段话： 一个由C/C++编译的程序占用的内存分为以下几个部分  1、栈区（stack）： 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。  2、堆区（heap） ： 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表。  3、全局区（静态区）（static）：全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域， 程序结束后有系统释放 。 4、文字常量区：常量字符串就是放在这里的， 程序结束后由系统释放 。 5、程序代码区：存放函数体的二进制代码。  好了，你的代码的问题是，你尝试修改文字常量区的内容。为什么换成数组没问题呢，是因为，数组是被放在栈区，是可以访问并修改的。而文字常量区是不可以修改的。 我曾经修改常量地址的地址骗过了编译器的眼睛

user: user-4
content: int main() { 	void copy_string(char * from, char * to); 	char * a = "I am a teacher."; 	char * b = "You are a student."; 	//char * p;  	printf("string a=%s\nstring b=%s\n", a, b); 	printf("\ncopy string a to string b:\n"); 	b = (char*)malloc(sizeof(char) * strlen(a) + 1); //这里给指针分配了一个内存就可以正常运行了。 	copy_string(a, b); 	printf("string a=%s\nstring b=%s\n", a, b);  	free(b);//释放 	system("PAUSE"); 	return 0; }  void copy_string(char * from, char * to) { 	for (; *from != '\0'; from++, to++) 	{ 		*to = *from; 	} 	*to = '\0'; }

user: user-5
content: 楼主先看下面一段话： 一个由C/C++编译的程序占用的内存分为以下几个部分  1、栈区（stack）： 由编译器自动分配释放 ，存放函数的参数值，局部变量的值等。其操作方式类似于数据结构中的栈。  2、堆区（heap） ： 一般由程序员分配释放， 若程序员不释放，程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事，分配方式倒是类似于链表。  3、全局区（静态区）（static）：全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域， 程序结束后有系统释放 。 4、文字常量区：常量字符串就是放在这里的， 程序结束后由系统释放 。 5、程序代码区：存放函数体的二进制代码。  好了，你的代码的问题是，你尝试修改文字常量区的内容。为什么换成数组没问题呢，是因为，数组是被放在栈区，是可以访问并修改的。而文字常量区是不可以修改的。
user-0 提问: C语言求教：如何在一个坐标轴内用C语言统计表达出点位最集中的小片区域对应的Y轴区域范围的函数？

回复:
user: user-1
content: 生成了100个时间随机数在0-70之间，按照上述算法出来的结果，大于14的  就是比较集中的区间了。你不要看我这些数据分散的比较平均，因为用了时间随机数。。

user: user-1
content: 写简单点  比如说你有一个数组num[100]存的是这些点的y坐标。  根据你图中y大小定义一些变量：y10,y20,y30,y40,y50,y60,y70  for循环100次依次提取num数组中的数并除以10，switch case一下，相应的y大小计数加1。例：循环执行到50次，num[50]中的数为56，除以10后变为5，switch case一下，判断为5后y50自加1。  按上述步骤统计完后100/7=14，计算出平均每组的计数个数，大于等于这个数字的区间准予输出，例： y10=2,y20=10,y30=19,y40=23,y50=29,y60=13,y70=4,其中，y30,y40,y50满足条件，准予输出，即30-40，40-50，50-60，即30-60。输出再自己编写一下就ok。这是一种非常简单的算法，，你可以根据你那边的具体要求再加一点东西进去

user: user-2
content: 百度搜“四叉树”？
user-0 提问: C语言写的一个公交管理系统，不能正确新增和查询数据，好像是结构体内数组输入的时候出了问题，求教怎么办

回复:
user: user-1
content: char type; char name; 这两个输入有错，自己检查下。 你本意要想输入字符串就要用数组，如果字长不确定就用动态分配，但注意用完要释放。

user: user-1
content: char type; char name; 这两个输入有错，自己检查下。

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-3
content: scanf("%s",&LineInfo[n].type);     printf("请输入线路名称\n");     scanf("%s",&LineInfo[n].name);     printf("请输入公交站名称\n"); type和name都是char类型，不是char类型的数组。因此，不用用%s，要么将type和name定义成数组，就可以了。

user: user-2
content: 请检查scanf的返回值。

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 用C怎么把png图片数据转换成二进制数据

回复:
user: user-1
content: 你的意思是不是想把图片保存到内存里面，再加载出来？

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:直接打开图片文件，fread读取到char *的缓存里即可。因为图片本身就是二进制存储的    @自信男孩，png文件存到Char * 中，并且能够转回png文件，fread我这边只能读出一部分，能给代码看下吗

user: user-0
content: @自信男孩，png文件存到Char * 中，并且能够转回png文件，fread我这边只能读出一部分，能给代码看下吗

user: user-0
content: 回复 oblivi ，用C语言来实现，这个有点看不懂

user: user-2
content: 直接打开图片文件，fread读取到char *的缓存里即可。因为图片本身就是二进制存储的

user: user-1
content: 所有文件都是二进制的，你的意思是不是这个BOOL MusicResolve::GetMusicJpgIndirect(LPCTSTR lpszFileName,IStream **pStream) { 	CFile file; 	BOOL flag = file.Open(lpszFileName, CFile::modeRead | CFile::typeBinary); 	if (!flag) 		return FALSE; 	 	int nCount=file.GetLength(); 	BYTE *jpg = new BYTE[nCount]; 	file.Read(jpg, nCount); 	HGLOBAL glb = GlobalAlloc(GHND, nCount); 	LPVOID data = GlobalLock(glb); 	memcpy(data, jpg, nCount); 	delete[]jpg; 	if (FAILED(CreateStreamOnHGlobal(glb, TRUE, pStream))) 		return FALSE; 	return TRUE; }

user: user-3
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-4
content: https://blog.csdn.net/qq_21334991/article/details/79035222 使用libpng就可以省很多事，参考一下上面的文章

user: user-2
content: 引用 5 楼 u014608536 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 直接打开图片文件，fread读取到char *的缓存里即可。因为图片本身就是二进制存储的    @自信男孩，png文件存到Char * 中，并且能够转回png文件，fread我这边只能读出一部分，能给代码看下吗[/quote] 你的png文件多大呢，你读取放到char *缓存里做什么用？ 这个问题就是一个文件操作呢，fopen，fclose, fread/fwrite就能实现
user-0 提问: 指向含有10个函数指针的数组的指针的初始化

回复:
user: user-1
content: 好比  int *a; &a的返回值你打算用什么类型去接收，只能用 int **b;  b=&a;

user: user-2
content: 仅供参考：#include <stdio.h> double A[300][100]; double valuex[300]; double valuey[300]; int i; double fun00(double x,double y) {return x  +   y  ;}; double fun01(double x,double y) {return x*x+ 3*y  ;}; double fun02(double x,double y) {return x  + 2*y*x;}; //...  fun03(double x,double y) {return ...+...   ;}; //... //...  fun98(double x,double y) {return ...+...   ;}; double fun99(double x,double y) {return x/2+20*y  ;}; double (*funNN[100])(double,double)={     fun00,     fun01,     fun02, //  fun03, //  ... //  fun98,     fun99, }; int main() {     double x,y;     int f,FN;      for (i=0;i<300;i++) {         valuex[i]=(double)i;         valuey[i]=(double)i;     }     FN=3;     for (i=0;i<300;i++) {          x=valuex[i];          y=valuey[i];          for (f=0;f<FN;f++) A[i][f]=funNN[f](x,y);     }     for (i=0;i<3;i++) {         for (f=0;f<FN;f++) printf("%lg ",A[i][f]);         printf("\n");     } 	return 0; } //0 0 0 //2 4 3 //4 10 10

user: user-3
content: p是指向含有10个函数指针的数组的指针变量 也就是说，p是数组的指针。 所以应该为p赋数组A的地址，即 p = &A; 数组的一个特性是：在很多用到数组名字的地方，编译器都会自动地将其替换为一个指向数组首元素的指针； 所以 p = A; 时，A的含义是指向int*的指针，而p是指向int*数组的指针，所以会报错！

user: user-0
content: 基本搞清楚了，数组名和数组名取地址虽然值是一样的，都是指向数组首元素的地址，但是类型不一样，可以通过下面的代码来理解  下面的代码中， int arr[10] = { 0,1,2,3,4,5,6,7,8,9 }; arr的类型是 int* 而 &arr的类型是 int(*)[10] 所以如果定义一个变量int(*p)[10]，赋值的时候必须 p=&arr，如果p=arr，那么编译器会报类型不匹配的错误。    #include "stdafx.h" #include "stdlib.h" void test_sizeof_addr(char *a) {     printf("%d\n", sizeof(a)); } void test_sizeof_array(char a[]) {     printf("%d\n", sizeof(a)); }  int main() {     int arr[10] = { 0,1,2,3,4,5,6,7,8,9 };     int *p = arr;     //int *q = &arr; //非法，类型不匹配  cannot convert from 'int (*)[10]' to 'int *'      int b = sizeof(arr);     int a = sizeof(&arr);     //int *q = &arr;     printf("&arr=0x%x\r\n",(int)&arr);     printf("arr=0x%x\r\n", (int)arr);     printf("&arr[0]=0x%x\r\n", (int)&arr[0]);      char d[30];     printf("%d\n", sizeof(d));     printf("%d\n", sizeof(&d));     printf("%x  %x\n", d, &d);     test_sizeof_addr(d);     test_sizeof_array(d);     system("pause");     return 0; }

user: user-0
content: 指针变量和数组名是不同的，数组名取地址和数组名是一样的值，
user-0 提问: 有多个相同字符串的情况下，如何定位到某个指定字符串？

回复:
user: user-1
content: 楼主，可以参考一下下面的代码，原理应该差不多的。 void main() { 	FILE* pFile = NULL; 	fopen_s(&pFile, "2.txt", "r"); 	if (pFile == NULL) 	{ 		return ; 	}  	fseek(pFile, 0, SEEK_END); 	long lFileSize = ftell(pFile); 	if (lFileSize == 0) 	{ 		fclose(pFile); 		return ; 	} 	fseek(pFile, 0, SEEK_SET);  	char* pFileInfo = (char*)malloc(lFileSize + 1); 	if (pFile == NULL) 	{ 		fclose(pFile); 		return; 	} 	memset(pFileInfo, 0, lFileSize + 1);  	int nSpaceIndex = 0; 	while (fgets(pFileInfo, lFileSize, pFile) != NULL) 	{ 		while (pFileInfo[nSpaceIndex] == ' ') 		{ 			++nSpaceIndex; 			continue; 		}  		if (pFileInfo[nSpaceIndex] == '/') 		{ 			nSpaceIndex = 0; 			memset(pFileInfo, 0, lFileSize + 1); 			continue; 		} 		else 		{ 			if (pFileInfo[nSpaceIndex] == '&') 			{ 				int nLen = strlen(pFileInfo); 				if (nLen >= 5) 				{ 					if (pFileInfo[1] == '0' && pFileInfo[2] == '0' && pFileInfo[3] == '0' && pFileInfo[4] == '1') 					{ 						break; 					} 				} 			} 			nSpaceIndex = 0; 			memset(pFileInfo, 0, lFileSize + 1); 			continue; 		} 	} 	fclose(pFile);  	printf("%s", pFileInfo); 	free(pFileInfo);  	getchar(); 	return ; }

user: user-2
content: 建议研究一下正则表达式

user: user-3
content: 使用fgets，strncmp，strtok_r处理字符串；

user: user-4
content: https://www.cnblogs.com/274914765qq/p/4574367.html 参考下这篇文章使用正则表达式， 定义两个正则表达式："&0001.*"，"//&0001.*"判断包含"&0001.*"但不包含"//&0001.*"的就是你需要的
user-0 提问: 网络编程select模型设置超时时间无效

回复:
user: user-1
content: cpu内部的时钟周期并不是无限小，仅仅只是一个比较小的值，再加上操作系统的封装，程序内能表示的最小时间间隔很可能更大。如果你设置的超时时间太小，当然出来的超时结果就不准确了。当然我想这并不是你代码超时不准确的原因。。。 最主要的原因应该是操作系统时间分片机制。如果你对操作系统的线程运作稍微有所了解，就应该知道操作系统的线程并不是真实并行运行的，而是快速交替运行（当然现在的cpu拥有多核多线程可以实现真实并行，但是这种分时机制依然起着主要作用）。假设只有两线程，线程切换周期为10ms,那么如果当前线程只运行了9ms就进行了线程切换，那么设置的超时时间不会在第10ms起作用，因为此时定时器所在的线程已经没有执行权了。只有等到线程再次拿到执行权后，定时器才会起作用，即第19ms。考虑到代码运行也需要时间，定时器将在>19ms的时候超时。 所以，一般来讲，涉及到超时时间，这是超时时间只是一个大概值。并且不能太小，否则会非常非常“大概”。。。

user: user-2
content: Windows计时精度≈15ms

user: user-3
content: 1微妙太短了吧，建议用1秒试试
user-0 提问: 头文件

回复:
user: user-1
content: 楼上2位是正解，getnights()函数的声明后面要加分号

user: user-2
content: 函数的声明是一条语句，因此需要加上分号;

user: user-3
content: extern int getnights(void)后面缺少分号，写代码仔细点

user: user-4
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。
user-0 提问: 请教一条代码的含义

回复:
user: user-1
content: 就是1到10，每个数字都和1到10相加的总和

user: user-2
content: 如果你不知道怎么调试的话，  在sum+=i*j;后面加一句printf("i=%d,j=%d,sum=%d",i,j,sum);来观察3个数的值是如何变化的

user: user-3
content: 你可以对sum+=i*j ;这句加个断点，然后单步调试，观察i、j、sum三个值的变化；  执行的逻辑是进入外圈for i=1时 进入内圈for，从j=1开始到j=9，执行9次 sum=sum+i*j，就是0+1*1+1*2+...+1*9，然后跳出内圈for，此时i=2，同理进行九次45+2*1+2*2+...+2*9，同理执行到i=9，外圈for也执行了9次，内外一共9*9次，sum就是累加和

user: user-4
content: sum=0+1*1+1*2+...+1*9             +2*1+2*2+...+2*9             +...+             +9*1+9*2+...+9*9

user: user-5
content: 两层循环，外层循环i = 1时， sum  = 1 * 1 + 1 * 2 + 1 * 3...+1*9;此时j就是从1~9； 当i = 2时，sum += 2 * 1 + 2 * 2 + 2 * 3...+ 2 * 9; 此时j是从1~9 ... 当i = 9时，sum += 9 * 1 + 9 * 2 + 9 * 3...+9 * 9;

user: user-6
content: 这个在学习了循环语句后很容易理解的，你可以在调试模式下载循环入口处打断点一步一步看，应该就很清楚了
user-0 提问: 二叉树的动态查找

回复:
user: user-1
content: 問題出在把數組ch的地址傳給兩個函數了。 這是一個固定地址，但它的内容隨著scanf的執行而發生變化。 InsertBiTree函數中，data僅僅是指向傳遞進來的字符串地址，所以它指向的其實是ch這個數組。換句話說，執行多次InsertBiTree函數之後，生成的這個樹，每一個data數據項其實都指向同一個地方，這是問題之一。 而在BiTreeSearch函數中，又在這個樹中查找ch這個字符串，既然都指向了ch，再跟ch做比較，豈不是必然相等？  所以解決辦法是： 樹結搆体中的data改用字符數組而不是指針，或者在InsertBiTree中給它動態分配地址。 並且在InsertBiTree中必須用strcpy拷貝字符串内容。

user: user-2
content: 楼上说的正确，楼主可以参考一下下面代码，逻辑差不多的。注意需要添加动态分配的内存释放操作。  #include <stdio.h> #include <string.h> #include <stdlib.h>  typedef struct node{ 	char *data; 	struct node *lchild, *rchild; }Btree;  typedef Btree *BiTree;  int InsertBiTree(Btree **root, char *x) { 	Btree *current = NULL, *parent = NULL, *p = NULL; 	current = *root; 	while (current != NULL) 	{ 		if (strcmp(current->data, x) == 0) 			return 0;  		parent = current; 		if (strcmp(current->data, x) < 0) 			current = current->rchild; 		else 			current = current->lchild; 	}  	p = (Btree*)malloc(sizeof(Btree)); 	if (p == NULL) 	{ 		printf("空间不够\n"); 		exit(1); 	}  	int nLen = strlen(x); 	if (nLen > 9) 	{ 		printf("输入的字符数不对\n"); 		exit(1); 	}  	char* px = (char*)malloc(nLen + 1); 	if (px == NULL) 	{ 		printf("空间不够\n"); 		exit(1); 	} 	memset(px, 0, nLen + 1); 	memcpy(px, x, nLen);  	p->data = px; 	p->lchild = NULL; 	p->rchild = NULL; 	if (parent == NULL) 		*root = p; 	else if (strcmp(x, parent->data) < 0) 		parent->lchild = p; 	else 		parent->rchild = p; 	return 1; }  int BiTreeSearch(Btree *root, char *x){ 	Btree *current; 	if (root != NULL){ 		current = root; 		while (current != NULL){ 			if (strcmp(current->data, x) == 0) 				return 1; 			if (strcmp(current->data, x)<0) 				current = current->rchild; 			else 				current = current->lchild; 		} 	} 	return -1; }   int main(void) { 	Btree *s = NULL; 	char ch[10] = { 0 }; 	printf("请输入最多9个元素:\n"); 	for (int i = 0; i<12; i++){ 		scanf_s("%s", ch, 10); 		InsertBiTree(&s, ch); 		memset(ch, 0, 10); 	}  	printf("请输入要查找的最多9个元素:"); 	scanf_s("%s", ch, 10); 	if (BiTreeSearch(s, ch) == -1) 		printf("无此元素"); 	else  		printf("查找成功");  	getchar(); 	return 0; }
user-0 提问: linux 终端后台执行程序发送udp包，插着usb线就能发送，拔了usb就停止发送了。

回复:
user: user-0
content: 还有一个现象，我把终端插到充电器上，服务端也会收到client的包，但是就会收到几个包，收到几个包后也就收不到了，拔掉充电器也会收到几个包，然后就收不到了。很奇怪，不理解为什么。

user: user-0
content: linux 终端，一个测试软件，软件主要功能向服务端发送udp包，通过adb进入到终端shell，把测试软件后台运行，然后把usb线拔掉，服务端就会收不到client发过来的数据包，但是当我把usb线重新插到终端，不进入adb shell，服务端就会重新收到client发过来的udp包。

user: user-1
content: 用usb做加密，权限，还是说读取了usb中的内容？不清楚，瞎猜的。。。

user: user-2
content: 发送包跟插拔usb有什么关系？建议详细介绍一下你的测试环境
user-0 提问: 大佬们快帮我改一下

回复:
user: user-1
content: #include<stdio.h> #include<malloc.h>  typedef int KeyType;  typedef struct {     KeyType key; }ElemType;  typedef struct {     ElemType *elem; }SSTable;  typedef struct {     int low,high,mid;     ElemType *elem; }STable;  int Search_seq(SSTable ST, int n, KeyType key) {     int i=n-1,count=0;     ST.elem[0].key=key;     while(ST.elem[i].key!=ST.elem[0].key)     {         i--;         count++;     }     if(ST.elem[i].key==ST.elem[0].key&& i!=0)     {         printf("一共有%d次",count);         return i;         //printf("一共有%d次",count);     }     else         return 0; }   int Search_Bin(STable QT, int n,KeyType key) {     int low=0,high=n-1,mid;     while(low<=high)     {         mid=(low+high)/2;         if(key==QT.elem[mid].key)             return mid;         else if(key<QT.elem[mid].key)             high = mid-1;         else             low = mid+1;     }      return 0; }  //void main() int main() {     int a[10],i,j,k;     KeyType key=5;     SSTable ST;     STable QT;     ST.elem = (ElemType *)malloc(100*sizeof(ElemType));     QT.elem = (ElemType *)malloc(100*sizeof(ElemType));     for(i=0;i<10;i++)     {         //scanf("%d",&a);         scanf("%d", &a[i]);         ST.elem[i+1].key=a[i];     }     printf("顺序查找法:\n");      if ((j=Search_seq(ST, 10, key))!=0)         printf("元素%d的位置是%d\n",key,j);     else         printf("该表中无此元素%d\n", key);      printf("折半查找法:\n");     for(i=0;i<10;i++)         QT.elem[i].key = a[i];      if((k=Search_Bin(QT,10,key))!=0)         printf("元素%d的位置是%d\n",key,k);     else         printf("未找到该元素%d\n",key); } 参考一下吧  建议对比上面的代码，找到自己的问题所在。
user-0 提问: VS2015中写C，LINK2019无法解析外部数据_strcopy;

回复:
user: user-1
content: VS中建議用strcpy_s代替

user: user-2
content: strcpy

user: user-0
content: 已经找到问题了，调用标准库，但是strcpy写错了

user: user-1
content: strcopy是你這個庫提供的嗎？
user-0 提问: 为什么59行会警报

回复:
user: user-1
content: 定义StartProgram()函数为 void StartProgram() { }

user: user-2
content: 你这写子函数，不说明类型吗，如果没有返回值，用 void StartProgram() { } void getnumber() { } 如果需要返回值，把void改成int，同时在子函数末尾return一个对应类型的值

user: user-3
content: 函数类型未定义啊。

user: user-4
content: 因为这个函数没有定义返回值类型，若未定义，编译器默认认为是int类型。因此，需要函数返回一个int类型的数据。
user-0 提问: cpp(12) :  error C2065: 'ReadRecord' : undeclared identifier  错在哪里了呢

回复:
user: user-1
content: ReadRecord()这个函数没有定义

user: user-2
content: 你这代码哪下的，子函数全都不写类型

user: user-3
content: 没找到这个函数的定义，该函数需要声明在前，或者定义在前都是可以的。

user: user-4
content: ReadRecord 没有定义，或者定义了，没有声明
user-0 提问: C语言菜鸟提问

回复:
user: user-1
content: 2楼的解释是对的，但初学者可能理解起来很难，以这个例子给你说=和==的区别 void main() { 	int a=0,b=1,c=2;  	if(c==a+b) 		printf("A %d\n",c); 	if(c=a+b) 		printf("B %d\n",c);  	getch();//暂停以显示  }//执行后输出为B 1 if其实是两句话，先执行括号里的代码，然后拿括号里的结果去执行if判断； 第一个if 先判断c是否等于a+b，现在是不等的，所以c==a+b这句话就等于是个false，所以第一个if等效于if(0)，后面的一句不会执行； 第二个if先执行将a+b的值赋值给c，一般没什么内存问题的话，c=a+b这句话就执行成功了，现在c=1了，而且执行成功的话返回一个true，所以第二个if等效于if(1)，会执行后面的一句。

user: user-2
content: sum==a+b; 这句有问题，==是判断符，不是赋值符。

user: user-3
content: sum=a+b       //a+b赋值给sum sum ==a+b   //a+b于sum相比较为等于，然而sum在赋值之前没有任何值

user: user-4
content: 楼主主学的Javascript的吧，哈哈，=，==，===

user: user-5
content: 二楼的理解例子很到位
user-0 提问: malloc问题

回复:
user: user-1
content: 越界访问是未定义行为，即有出错的可能，程序不一定会出问题。但这终归是一个bug。  越界访问可能是越界的内存未被使用，越界的内存正好也是可读可写的。 还有可能，虽然申请sizeof(float)个字节，内存管理会申请比sizeof(float)更多的内存（这是必然，因为需要记录申请的信息）

user: user-2
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。
user-0 提问: 菜鸟请指教~

回复:
user: user-0
content: 下面是这个函数的完整代码：      能否更能帮助你们理解下？

user: user-1
content: 个人感觉应该有两组按键，一组是主按键序列，其状态是ui8CurrentSeq，另外一组是8个按键。 switch...case语句执行的前提就是如果8个按键中某个按键短按、长按1秒和长按2秒；之后再来判断当前的状态ui8CurrentSeq，第一个case中的MAIN_BUTTON_SEQ_NOT_PRESSED，从字面理解就是主按键序列没有被按下，也就是说，如果8个按键中的某个按键短按、长按1秒和长按2秒，但是主按键序列没有被按下，则将主按键序列的对应状态进行设置

user: user-2
content: 程序都不完整 怎么看

user: user-3
content: 可能不同的按鍵對於處理時間長短的邏輯不同，所以case裏面又是根據按鍵進行的。至於一個case之後執行另一個case，這段代碼看不出來，你貼的代碼也不完整。 不同結搆体中的同名數組，含義有可能完全不同的。 賦值可能在另一個進程？ 邏輯技巧嘛，懂業務咯。對業務越熟，越容易看懂。

user: user-4
content: 你应该是没有看清楚aMainButtonStatus的ui8SeqStatus[i]和aExtGPIODrvButtonResult的ui8State[i]不是对应一个按钮，aExtGPIODrvButtonResult应该是一个控制autorepeat的按钮，aMainButtonStatus应该是被autorepeat控制的按钮。 程序分析：先判断aExtGPIODrvButtonResult是否是被按了，如果按了就进入switch，判断aMainButtonStatus按钮状态 1）aMainButtonStatus按钮没有按下，就让它按下，同时设置进入repeat的before_delay时间和进入repeat前的delay的状态。 2）如果是进入repeat前的delay状态，delay时间没到，aMainButtonStatus按钮不按下，delay时间到了，按下aMainButtonStatus，同时设置进入autorepeat的状态，和autorepeat的between_delay时间。 3）启动了autorepeat状态，delay时间没到，aMainButtonStatus不按下，delay时间到了，aMainButtonStatus按下，同时重新设上autorepeat的between_delay时间。 在这个函数调用的地方肯定有一个循环，从repeat没开始到进入repeat，然后一直根据between_delay时间repeat循环按下aMainButtonStatus按钮。 这段代码还是挺高质量的，注释也比较明白，仔细分析应该能看懂的

user: user-5
content: 个人感觉:从代码中，先判断GPIODrv中的按钮状态，如果存在按键,或者按键1秒或者按键2秒情况就执行switch语句的判断, 否则没有按键操作就重新设置按钮的状态。其中aMainButtonStatus数组变量中每个值表示着GPIO按钮的当前状态值。 还是需要根据工程上下文代码好判断，最好能打断点一步一步调试，这样才好弄清楚。
user-0 提问: %.2lf 小数点问题帮忙看看

回复:
user: user-1
content: 你应该先熟悉一下%打印的使用，比如%.是截断而非四舍五入，0.1怎么让他显示成0.100，左对齐，右对齐什么的，%功能很多的；  其次对float和double来说，要注意的是表示范围和精度，比如float，小数点第七位和以后的基本是不准的，为什么不准这些都是要熟知的。

user: user-2
content: MSDN上的说明 The precision value specifies the number of digits after the decimal point. If a decimal point appears, at least one digit appears before it. The value is rounded to the appropriate number of digits. 大概的意思是“对于浮点数来说，printf()函数的精度参数指定了小数点后面的数字个数，即小数位数。如果要输出小数点，则小数点后面至少要有一个数字，即小数位数至少是1。根据输出的小数位数，要输出的值被四舍五入到一个合适的数字” 也就是说printf()函数也可以四舍五入的。那么接下来我们看看d1的值到底是多少  实际上可以看到，d1的值不是37.975000，而是37.974999999999994。 默认情况下，printf()函数输出的浮点数小数位数是6，d1的第7位小数值是9，根据四舍五入，会向前进1位，以此类推，最终当 printf("%lf\n", d1); 时，输出的值是37.975 而printf("%.2lf\n", d1); 时，d1的第3位小数值是4，根据四舍五入，不进位，所以输出的值是37.97 请参考《C++浮点型变量的存储方式》 希望能够帮到你

user: user-3
content: 你只要记住，C语言编程不存在四舍五入。  例如：实际上9/5=1.8    C语言中 9/5=1…4，然后9/5就等于1了，余数直接被吃了。

user: user-4
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-5
content: %.2lf只显示小数点后两位，不会自动给你四舍五入
user-0 提问: linux编译报错

回复:
user: user-1
content: 不是看出來，只是根據經驗。不同版本通常有不一樣的實現，會不兼容的。

user: user-1
content: 我傾向於不同版本造成的衝突，仔細看看版本要求吧。

user: user-0
content: 引用 1 楼 hzy_76 的回复:庫文件的問題，是不是缺文件？還是版本不一致？  我怀疑是引用的头文件问题造成的，我用的是linux  /user/include下的头文件

user: user-0
content: 引用 3 楼 hzy_76 的回复:我傾向於不同版本造成的衝突，仔細看看版本要求吧。  你是如何看出来的？

user: user-1
content: 庫文件的問題，是不是缺文件？還是版本不一致？
user-0 提问: C语言课设 从文件读取时遇到的问题

回复:
user: user-1
content: int read(struct tele *read) {     int i=0;     FILE *fp;     if((fp=fopen("通讯录.txt" , "rb" ))==NULL)     {         printf("error when opening");         exit(0);     }     //fscanf(fp,"%d",cur);     fscanf(fp,"%d", &cur);     fread(read,sizeof(struct tele),cur,fp);     /*     for(i=0;i<cur;i++)     {         fread(read,sizeof(struct tele),cur,fp);     }     */     press();     return 0; }  read函数有问题，另外，函数名最好不要和变量（参数）名相同，否则有些编译器不是别和代码也不好阅读。 建议对比代码找一下原因
user-0 提问: KMP 算法的next函数匹配值如何得到的，只说明原理就行

回复:
user: user-1
content: 有几种方法，有一种方法是对于模式串中的某一字符，提取它前面的字符串，分别从字符串的两端查看连续相同的字符串的个数，在其基础上 +1 ，结果就是该字符对应的值。  https://blog.csdn.net/yzy1103203312/article/details/80836272
user-0 提问: 为什么执行函数read（m）后无法返回主函数继续执行

回复:
user: user-1
content: 不知道你用的什么编译器，我用vs2013编译了一下，就报一个错，未初始化变量fp1，然后我改成FILE *fp1=NULL； 界面正常弹出来啊，并没有卡在read

user: user-2
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

user: user-3
content: int read(zggz a[]) {     zggz A;     FILE *fp;     if((fp=fopen("gx.dat","r"))==NULL) //文件打开失败     {         printf("文件打开失败！\n");          return 0;     }      else     {         do         {             //fscanf(fp, "%s\n", &A.id);             fscanf(fp, "%s\n", A.id);             //fscanf(fp, "%s\n", &A.name);             fscanf(fp, "%s\n", A.name);             //fscanf(fp, "%lf\n", &A.post_wage);             fscanf(fp, "%f\n", &A.post_wage);             //fscanf(fp, "%lf\n", &A.pay_wages);             fscanf(fp, "%f\n", &A.pay_wages);             //fscanf(fp, "%lf\n", &A.post_allowance);             fscanf(fp, "%f\n", &A.post_allowance);             //fscanf(fp, "%lf\n", &A.merit_pay);             fscanf(fp, "%f\n", &A.merit_pay);             //fscanf(fp, "%lf\n", &A.salary);             fscanf(fp, "%f\n", &A.salary);             //fscanf(fp, "%lf\n", &A.income_tax);             fscanf(fp, "%f\n", &A.income_tax);             //fscanf(fp, "%lf\n", &A.take_home_pay);             fscanf(fp, "%f\n", &A.take_home_pay);             a[n]=A;             n=n+1;         }while(!feof(fp));     }     printf("\t\t\t\t\t\t共读取到%d个员工信息\n",n+1);     fclose(fp);     return n;  }  read函数有点问题。对比一下找一下自己的问题。  int write(zggz a[])    //保存 {     FILE *fp1;     if(n<1)     {         if((fp1=fopen("gx.dat","w"))==NULL) //文件打开失败         {             printf("文件打开失败！\n");         }         else         {             printf("未读取到员工数据！\n");         }     }      else     {         for(i;i<n;i++)         {             fprintf(fp1, "%s\n", a[i].id);             fprintf(fp1, "%s\n", a[i].name);             //fprintf(fp1, "%lf\n", a[i].post_wage);             fprintf(fp1, "%f\n", a[i].post_wage);             //fprintf(fp1, "%lf\n", a[i].pay_wages);             fprintf(fp1, "%f\n", a[i].pay_wages);             //fprintf(fp1, "%lf\n", a[i].post_allowance);             fprintf(fp1, "%f\n", a[i].post_allowance);             //fprintf(fp1, "%lf\n", a[i].merit_pay);             fprintf(fp1, "%f\n", a[i].merit_pay);             //fprintf(fp1, "%lf\n", a[i].salary);             fprintf(fp1, "%f\n", a[i].salary);             //fprintf(fp1, "%lf\n", a[i].income_tax);             fprintf(fp1, "%f\n", a[i].income_tax);             //fprintf(fp1, "%lf\n", a[i].take_home_pay);             fprintf(fp1, "%f\n", a[i].take_home_pay);         }         fclose(fp1);     }     return 0; }
user-0 提问: 如何将几个文件合并成一个bin文件

回复:
user: user-1
content: copy  tp.jpg /b+ yjh.jpg /b wocao.bin 漏了个b

user: user-1
content: copy  tp.jpg /b+ yjh.jpg wocao.bin

user: user-2
content: 引用 4 楼 qq_36794790 的回复:引用 3 楼 zhao4zhong1 的回复:file12.bin那这个文件就是二进制文件了吗 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-2
content: 参考这个：#include <stdio.h> #include <string.h> FILE *f; char buffer[4096]; int r,a; void HexDump(char *buf,int len,int addr) { 	int	i,j,k; 	char binstr[80];  	for	(i=0;i<len;i++)	{ 		if (0==(i%16)) { 			sprintf(binstr,"%08x -",i+addr); 			sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]); 		} else if (15==(i%16)) { 			sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]); 			sprintf(binstr,"%s  ",binstr); 			for	(j=i-15;j<=i;j++) { 				sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.'); 			} 			printf("%s\n",binstr); 		} else { 			sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]); 		} 	} 	if (0!=(i%16)) { 		k=16-(i%16); 		for	(j=0;j<k;j++) { 			sprintf(binstr,"%s   ",binstr); 		} 		sprintf(binstr,"%s  ",binstr); 		k=16-k; 		for	(j=i-k;j<i;j++)	{ 			sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.'); 		} 		printf("%s\n",binstr); 	} } int main(int argc,char **argv) { 	if (argc<2)	{ 		fprintf(stderr,"Usage: %s filename.ext\n",argv[0]); 		return 2; 	} 	f=fopen(argv[1],"rb"); 	if (NULL==f) { 		fprintf(stderr,"Can not open file [%s]!\n",argv[1]); 		return 1; 	} 	a=0; 	while (1) { 		r=fread(buffer,1,4096,f); 		HexDump(buffer,r,a); 		a+=r; 		if (r<4096)	break; 	} 	fclose(f); 	return 0; }

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:引用 4 楼 qq_36794790 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] file12.bin那这个文件就是二进制文件了吗 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 [/quote]再问一个问题，fopen打开一个文件后怎么具体输出文件内容的第一个的地址

user: user-3
content: 直接用文件指针读取目标文件，再合并一起？

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:file12.bin那这个文件就是二进制文件了吗

user: user-2
content: file12.bin

user: user-2
content: WinExec("cmd /c copy /b file1.bmp+file2.bmp file12.bmp >NUL 2>NUL",SW_HIDE);

user: user-4
content: 可以尝试用压缩包的形式
user-0 提问: 不能printf扩展ASCII字符码（C code on FreeBSD），请问是什么原因？

回复:
user: user-1
content: 又或者： Windows：使用cprintf Linux：使用CURSES库。

user: user-1
content: chcp命令了解一下。

user: user-2
content: 没有正确设置locale

user: user-3
content: linux不支持扩展ascii码表
user-0 提问: C语言填空题

回复:
user: user-1
content: 讲道理，写作业这种事，一道50分都不一定有人做

user: user-2
content: 服了，这种题请好好自学

user: user-3
content: 额！论坛的资源不是解决这些问题的。作为学生，还是要仔细认真的付出，才能学到自己肚子里。

user: user-4
content: 伸手党。。。
user-0 提问: 大佬帮忙看一下哪里有错谢谢

回复:
user: user-1
content: 问题就在后面的 long int fracsum(int n) { if(/**/ n==0 /**/) return(n);   return(n*/**/ fracsum(n) /**/); }  当前的状态是如果n=0返回0，如果n!=0返回n*fracsum(n)，在新的fracsum里，n的值没变，这导致你的这个函数等效为 long int fracsum(int n) {   return(n*fracsum(n)); } 陷入死循环；  改变在于，每一次调用fracsum这个函数，得让他里面的n减一，所以第二句改成return(n*/**/ fracsum(n-1) /**/); 其次阶乘是从n乘到1，也就是说这个函数调用的终点是n=1的时候，所以第一句改成 if(/**/ n==1 /**/) return(n);  以4为例子，整个递归的逻辑即为： sum=fracsum(4)           =4*fracsum(3)                  =3*fracsum(2)                        =2*fracsum(1)                              =1        =   4*    3*  2*   1

user: user-2
content: #include<stdio.h> #include<conio.h>      long int fracsum(int n); int main() {     int n;     long int sum;     do     { printf("Input n (n =1 to 9) :");         scanf("%d",&n);     }while(n>=10 || n<0);     //sum=fracsum(/**/int n/**/);     sum=fracsum(n);     printf("fracsum(n)  = %ld\n", sum);     getch();     return 0; }  long int fracsum(int n) {     //if(/**/ n==0 /**/)     if(n==0)         return 1;     return(n * fracsum(n-1)); } 参考一下吧 建议去掉无用的注释格式，代码中有一些问题（编译和逻辑），建议对比找一下。

user: user-3
content: ong  int fracsum(int n) { if(/**/ n==0 /**/) return(n);    // n==1   return(n*/**/ fracsum(n) /**/); }

user: user-4
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。