Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: linux fcntl

回复:
user: user-1
content: GDB 单步跟踪一下

user: user-0
content: 引用 3 楼 misskissC 的回复:之所以整个大方向，是因为我也没用过这个函数，也不会。  linux 终端下，输入命令：man  fcntl  【Read it, practice it】  FCNTL(2)                                                     Linux Programmer's Manual                                                    FCNTL(2)    NAME        fcntl - manipulate file descriptor  SYNOPSIS        #include <unistd.h>        #include <fcntl.h>         int fcntl(int fd, int cmd, ... /* arg */ );  DESCRIPTION        fcntl() performs one of the operations described below on the open file descriptor fd.  The operation is determined by cmd.         fcntl() can take an optional third argument.  Whether or not this argument is required is determined by cmd.  The required argument type is        indicated in parentheses after each cmd name (in most cases, the required type is int, and we identify the argument using the name arg), or        void is specified if the argument is not required.     Duplicating a file descriptor        F_DUPFD (int)               Find the lowest numbered available file descriptor greater than or equal to arg and make it be a copy of fd.  This is different from               dup2(2), which uses exactly the descriptor specified.                On success, the new descriptor is returned.                See dup(2) for further details.     ........ 在文件加锁之后，用鼠标点击文件所在的目录，内核也会报事件，向拥锁进程发信号，在fcntl中使用DNOTIFY控制不了，为啥，大神们，求救啊～～～～～～～～～～～～～～～

user: user-0
content: 引用 1 楼 misskissC 的回复:man fcntl  能说的详细下吗？我只想在我双击打开文件的时候获得内核发送的消息，但是fcntl中的锁会响应双击文件夹（该文件所在的文件夹），设置参数屏蔽也没有效果，不知道怎么做？请再指点一下阿，多谢！！！

user: user-1
content: 之所以整个大方向，是因为我也没用过这个函数，也不会。  linux 终端下，输入命令：man  fcntl  【Read it, practice it】  FCNTL(2)                                                     Linux Programmer's Manual                                                    FCNTL(2)    NAME        fcntl - manipulate file descriptor  SYNOPSIS        #include <unistd.h>        #include <fcntl.h>         int fcntl(int fd, int cmd, ... /* arg */ );  DESCRIPTION        fcntl() performs one of the operations described below on the open file descriptor fd.  The operation is determined by cmd.         fcntl() can take an optional third argument.  Whether or not this argument is required is determined by cmd.  The required argument type is        indicated in parentheses after each cmd name (in most cases, the required type is int, and we identify the argument using the name arg), or        void is specified if the argument is not required.     Duplicating a file descriptor        F_DUPFD (int)               Find the lowest numbered available file descriptor greater than or equal to arg and make it be a copy of fd.  This is different from               dup2(2), which uses exactly the descriptor specified.                On success, the new descriptor is returned.                See dup(2) for further details.     ........

user: user-1
content: man fcntl
user-0 提问: 求大神，

回复:
user: user-1
content: Enter、Ctrl+Z、Enter

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:Enter、Ctrl+Z、Enter 已经知道了，不过同样谢谢你。

user: user-2
content: windows里面Ctrl+Z

user: user-0
content: 引用 1 楼 user-3 的回复:windows里面Ctrl+Z linux里面Ctrl+D 为什么我试了不行呢。按下ctrl+z只是输入^z、、、

user: user-0
content: 引用 4 楼 user-3 的回复:[quote=引用 3 楼 CYTCHAN 的回复:] [quote=引用 1 楼 user-3 的回复:] windows里面Ctrl+Z linux里面Ctrl+D 为什么我试了不行呢。按下ctrl+z只是输入^z、、、[/quote] 我在windows试了一下，好像ctrl+z之前之后都要按回车才行[/quote] 我试了下，怎么不行啊

user: user-3
content: 引用 3 楼 CYTCHAN 的回复:[quote=引用 1 楼 user-3 的回复:] windows里面Ctrl+Z linux里面Ctrl+D 为什么我试了不行呢。按下ctrl+z只是输入^z、、、[/quote] 我在windows试了一下，好像ctrl+z之前之后都要按回车才行

user: user-3
content: 引用 楼主 CYTCHAN 的回复:书中“如果输入中不包含字符”，如何理解？在我看来，我们输入的不都属于字符吗，难道还有输入不是字符的？ 我觉得他的意思是，不输入abc之类的字符，一上来直接就Ctrl+Z给你个EOF，这样就进不去这个while循环了。

user: user-3
content: windows里面Ctrl+Z linux里面Ctrl+D
user-0 提问: C语言中主函数中相关问题？？？

回复:
user: user-1
content: 引用 楼主 pingheng74 的回复:主函数中：分别输入的   scanf("%d",&b[i])与scanf("%d",&mp[i][j])在主函数中什么作用？在整个代码中又是什么作用呢？ 请大侠帮小弟解释一下呗。谢谢了！！！ 就是让你从键盘先输入n个整数，给b[0]到b[n-1]赋值；然后再输入n*n个整数，给mp[0][0]到mp[n-1][n-1]赋值。 楼主问的是这个吗？
user-0 提问: 一道网络选择题

回复:
user: user-1
content: 同觉选D！！！

user: user-2
content: 现在题目越来越变态了。。。

user: user-0
content: 引用 1 楼 MisteryMethod 的回复:TTL 归零时才应该丢弃，只有转发时减少TTL 才需要丢弃掉报文，为1的时候如果是到本机的报文应该是没问题的，例如ping 路由器时采用TTL = 1时是可以得到回的response的。选D？

user: user-3
content: 引用 1 楼 MisteryMethod 的回复:TTL 归零时才应该丢弃，只有转发时减少TTL 才需要丢弃掉报文，为1的时候如果是到本机的报文应该是没问题的，例如ping 路由器时采用TTL = 1时是可以得到回的response的。  分析的有理

user: user-4
content: TTL  Time to live 就是生命周期，BC 都一定不对，A 的话可以说对，可以说不对，如果是需要转发的报文，那应该是会被丢弃掉的。

user: user-4
content: TTL 归零时才应该丢弃，只有转发时减少TTL 才需要丢弃掉报文，为1的时候如果是到本机的报文应该是没问题的，例如ping 路由器时采用TTL = 1时是可以得到回的response的。
user-0 提问: 求解:输出1/2013的结果,要求精确到小数后30位

回复:
user: user-1
content: 引用 7 楼 Fung3zZ 的回复:[quote=引用 6 楼 zjq9931 的回复:] 如果不暂存，实时输出，那么想多少位都是可以的。int a = 1; int b = 2013; int i = 0; for (i = 0; i < 2013; i++) { 	printf("%d", a/b); 	a = a%2013*10; } 看到的这个代码, 下面那个a = a%2013*10 是怎么回事, 能再给我解释下吗[/quote] 和上面我写的是一个思路，这个更专业话，我那个更好懂，你可以不断的缩减我那个程序。就可以得到这个了。

user: user-0
content: 引用 6 楼 zjq9931 的回复:如果不暂存，实时输出，那么想多少位都是可以的。int a = 1; int b = 2013; int i = 0; for (i = 0; i < 2013; i++) { 	printf("%d", a/b); 	a = a%2013*10; } 看到的这个代码, 下面那个a = a%2013*10 是怎么回事, 能再给我解释下吗

user: user-1
content: 如果不暂存，实时输出，那么想多少位都是可以的。

user: user-0
content: 引用 4 楼 zjq9931 的回复:晕了，没有验证，刚才的代码有错误，改好了。  #include<stdio.h>  int main() { 	int a=1; 	int b=2013; 	int result[100]; 	int i; 	int iNum; 	for(i=0; i<100; i++) 	{ 		if(a==0) 		{ 			break; 		} 		if(a<b) 		{ 			a*=10; 			if(a<b) 			{ 				result[i]=0; 			} 			else 			{ 				i--; 			} 			continue; 		} 		else 		{ 			result[i]=a/b; 			a=a%b; 		} 	} 	iNum = i;  	printf("0."); 	for(i=0; i<iNum; i++) 	{ 		printf("%d", result[i]); 	} 	printf("\n%d 位\n", i); 	return 0; }  引用 4 楼 zjq9931 的回复:晕了，没有验证，刚才的代码有错误，改好了。  #include<stdio.h>  int main() { 	int a=1; 	int b=2013; 	int result[100]; 	int i; 	int iNum; 	for(i=0; i<100; i++) 	{ 		if(a==0) 		{ 			break; 		} 		if(a<b) 		{ 			a*=10; 			if(a<b) 			{ 				result[i]=0; 			} 			else 			{ 				i--; 			} 			continue; 		} 		else 		{ 			result[i]=a/b; 			a=a%b; 		} 	} 	iNum = i;  	printf("0."); 	for(i=0; i<iNum; i++) 	{ 		printf("%d", result[i]); 	} 	printf("\n%d 位\n", i); 	return 0; } 懂了, 谢谢大哥了

user: user-1
content: 晕了，没有验证，刚才的代码有错误，改好了。  #include<stdio.h>  int main() { 	int a=1; 	int b=2013; 	int result[100]; 	int i; 	int iNum; 	for(i=0; i<100; i++) 	{ 		if(a==0) 		{ 			break; 		} 		if(a<b) 		{ 			a*=10; 			if(a<b) 			{ 				result[i]=0; 			} 			else 			{ 				i--; 			} 			continue; 		} 		else 		{ 			result[i]=a/b; 			a=a%b; 		} 	} 	iNum = i;  	printf("0."); 	for(i=0; i<iNum; i++) 	{ 		printf("%d", result[i]); 	} 	printf("\n%d 位\n", i); 	return 0; }

user: user-1
content: 代码写下了，原理你可明白？  #include<stdio.h>  int main() { 	int a=1; 	int b=2013; 	int result[100]; 	int i; 	int iNum; 	for(i=0; i<100; i++) 	{ 		if(a==0) 		{ 			break; 		} 		if(a<b) 		{ 			a*=10; 			result[i]=0; 			continue; 		} 		else 		{ 			result[i]=a/b; 			a=a%b; 		} 	} 	iNum = i;  	for(i=0; i<iNum; i++) 	{ 		printf("%d", result[i]); 		if(i==0 && result[i]==0) 		{ 			printf("."); 		} 	} 	printf("\n%d 位\n", i); 	return 0; }

user: user-2
content: 使用bc计算器

user: user-3
content: 你可以自己实现除法
user-0 提问: 关于结构体里面指针的指针（续）

回复:
user: user-1
content: unsigned char **rgba; 主要是因为要把图像的RGBA各个通道的数据分开存储在4个内存空间里。 LZ想怎么存读到的像素数据？用 unsigned char *pixels;也可以， 只用一段连续的内存存储整张图片的像素数据。

user: user-1
content: 其实你可以参考libpng给的示例程序代码，然后在它的基础上做修改，改成适合你的。

user: user-1
content: 好眼熟的代码，貌似这是我很久以前整的代码。。。

user: user-2
content: 发烧，大脑有些，不够用，单步跟踪。应当那个可以跟出来吧？

user: user-0
content: 顶顶等高手帮忙解决
user-0 提问: 那个大神，有C#学生补考管理系统

回复:
user: user-1
content: 补考管理系统。。。应该很少有人做这种项目。 去C#技术区吧，这里是C++。去.NET技术板块的C#技术区

user: user-2
content: 童鞋，这个不会有人直接给你答案的，建议自己搜一个，仔细认真看源码，争取看懂吧
user-0 提问: c语言文件操作，读不到数据啊？

回复:
user: user-1
content: 请检查fscanf函数的返回值。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: for( i = 0; i != COL ; i++){ for( j = 0; j < VOL; j++){ fscanf(fp,"%.3f", &val); printf("\t %f \n", val); if( val > 1000 && val < 10000){	 grid[i][j] = val; } 你的val没初始化，都是-107374176.000。你自己检查下
user-0 提问: 大家帮我看看，为什么我输出的值是101？

回复:
user: user-0
content: 谢谢赵4老师的谨言，我会铭记的。

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

user: user-0
content: 袄，非常感谢

user: user-2
content: for (i=2; i<=100; i++ );  // 这一行最后多了个分号
user-0 提问: 这一题很有意思   求各路大神指导  为什么我的栈溢出了

回复:
user: user-0
content: #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAX 100000 // 元素个数 #define NUM_MAX 100000 // 随机数的最大值+1 int Partition(int a[],int n,int low,int high)//快速寻找分界点 { int pivotkey,t; pivotkey=a[low]; while(low<high) { while(low<high&&a[high]>=pivotkey) high--; t=a[low]; a[low]=a[high]; a[high]=t; while(low<high&&a[low]<=pivotkey) low++; t=a[low]; a[low]=a[high]; a[high]=t; } return low; }  void QSort(int a[],int n,int low,int high)//快速排序 { int pivotloc; if(low<high) { pivotloc=Partition(a,n,low,high); QSort(a,pivotloc,low,pivotloc-1); QSort(a,high-pivotloc,pivotloc+1,high); } } void swap(int a[], int i, int j) { int t = a[i]; a[i] = a[j]; a[j] = t; }  void BubbleSort(int a[],int n)//冒泡排序 { int t,i,j; for(j=1;j<=n-1;j++) for(i=1;i<=n-j;i++) if(a[i-1]>a[i]) { t=a[i-1]; a[i-1]=a[i]; a[i]=t; } }  int main() {  srand(time(00)); int i,a[MAX]; clock_t begin, end; double cost;  for(i=0;i<MAX;i++) a[i]=rand()%NUM_MAX; begin = clock(); BubbleSort(a,MAX); end = clock(); cost = (double)(end - begin) / CLOCKS_PER_SEC; printf("冒泡排序用时为：%lf 秒\n", cost);   begin = clock(); QSort(a,MAX,0,MAX-1); end = clock(); cost = (double)(end - begin) / CLOCKS_PER_SEC; printf("快速排序用时为：%lf 秒\n", cost); system("pause"); return 0; }

user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-2
content: 在函数内部定义临时变量，100000个整型肯定会导致栈溢出。应该使用new生成变量。  不过没有代码，说个jb啊。

user: user-3
content: 用第归了没？ 嵌套层次是否太深

user: user-4
content: 没代码那还说啥

user: user-1
content: static int a[MAX]; #include <stdio.h> #include <stdlib.h> #include <time.h> unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } int i; unsigned long ul; void main() {     srand(time(NULL));     for (i=0;i<10;i++) {         ul=ulrand();         printf("%010lu 0x%08x\n",ul,ul);     } } //2337588057 0x8b54c359 //1977377429 0x75dc6295 //3607316769 0xd7034921 //0009828482 0x0095f882 //3350859779 0xc7ba1003 //0945794621 0x385fae3d //3400869024 0xcab524a0 //3097846779 0xb8a563fb //4287421124 0xff8cdac4 //3934016258 0xea7c5302

user: user-0
content: 不是   我用vs运行的

user: user-2
content: int Partition(int a[],int n,int low,int high)//快速寻找分界点 { int pivotkey,t; pivotkey=a[low];//这个还支持变量长度的数组？新版c++吗？最好还是改成new 吧。
user-0 提问: 初学链表有问，大神帮忙

回复:
user: user-1
content: scanf("%d",&n);

user: user-0
content: 好吧，手误....

user: user-2
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
user-0 提问: 在C语言中说补码运算是可交换和可结合的，它具体指的是什么意思？

回复:
user: user-1
content: 关键不在补码上，而是说整数可以进行交换和组合而不影响精度，因为整数运算不失精度。 但浮点运算是要丢失精度的，不能随便改变计算顺序。 比如计算 1.00001 + (- 1.0) + 0.000000001，按正常顺序可以得到0.00001+0.000000001, 两个数相差不大，结果可以保持较高精度。 但如果改为1.00001 + (-1.0 + 0.000000001)，后两者相差太大，可能0.000000001被丢失。

user: user-0
content: 这句话出自《深入理解计算机系统》第五章中的5.9节------“提高并行性”。其中为了提高程序的性能在循环中定义多个临时积累变量。它说：补码运算是可交换和可结合的，所以这样优化不会影响运算结果的正确性，但浮点乘法和加法不是可结合的，所以这样的优化会产生不同的运算结果。  不太清楚它说的所谓的：可结合与可交换是指数学上的，还是C语言的特性，具体情况是什么？ 请高手解答一下，谢谢！！

user: user-1
content: C语言对整数编码不作要求，请给出更多信息（哪本书，具体怎么说）。 另外，数学上交换和结合分别指 a*b=b*a 和 (a*b)*c=a*(b*c)

user: user-2
content: “结合律”

user: user-2
content: 搜“交换律”、“结合率”。

user: user-0
content: 嗯，就你这么举例一说，的确整数运算时改变计算顺序，不会改变运算的结果，而浮点运算就不同了。 改变了原来的计算顺序可能会产生不同的运算结果，尤其是当发生四舍五入或溢出时。
user-0 提问: 构造法 

回复:
user: user-1
content: 1）数组 b 没有有初始化，默认为 0？？？ 2）a[n] 这个数据没输入，默认为0？？？ 3）输入过程中 b[a[i]] 中最后一个更新的数据（编号）保存了下来，所以 数组 b非 0数据，比n要少。 4）while(n--) 中，用排过序的数据作为下标，处理b中的数据      4.1）b[a[i]]=x-b[a[i]];（b镜像？），和翻转处理(a)      4.2）对全体数据(n+1个)，再做一次    b镜像，a翻转  这个原问题没给出，猜测很吃力

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

user: user-3
content: scanf("%d",&a[i]);  b[a[i]]=i;  //a[i]是输入的一个数, b[a[i]]表示这个数是第几个被输入的
user-0 提问: C语言实现push pop操作

回复:
user: user-0
content: struct 结构体可根据需要自己补充变量

user: user-1
content: typedef struct tag_Queue{     int array[5]; 	int number; }Queue;   Queue *queue; void push(Queue *queue, int value){     //填充内容  	if (queue->number >= 5) 		return; 	queue->array[queue->number] = value; 	queue->number++; 	 }   int pop(Queue *queue){     //填充内容 	if (queue->number <= 0) 		return 0; 	queue->number--;  	return queue->array[queue->number]; }  pop出错和push出错都没有处理，一个返回了0 一个直接不添加。要想处理出错情况要修改下参数。
user-0 提问: 我这有个函数看不明，望指教

回复:
user: user-1
content: 引用 7 楼 u010211892 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 赵老师，我好想举报你，永远在复制粘贴！！！[/quote] 我好想举报整个IT界，永远在使用冯诺依曼架构。

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

user: user-3
content: 感觉你这个不是2进制转换器，而是256进制转换器。l = l*256 + (long)psBinString[i];中的256是等于多少进位的数，进几进制数，比如1*10+2，就是十进制转换。二进制转换器应该是l = l*2+ (long)psBinString[i]; 你的二进制字符串是："1100"这种么，其中的每个数字就是一个二进制位，还是？？？

user: user-4
content: 引用 2 楼 shuitamen 的回复:[quote=引用 1 楼 MisteryMethod 的回复:] psBinString[n] 是一个UCHAR 0x00000000 占用8bit  所以每次偏移一个UCHAR 就需要乘256  0x00000001 0x00000002 转换为10进制 不就是 2+1*256 我试着放了一个“A5”进行运算，A5换算成十进制是165，但得到的l却大得离谱：16693，是我用错了，还是说需要在转换一下？[/quote]   A5 是按照字符串传进去的。。 也就是说 第一个UCHAR 存入的是 A 的 ASCII码对应的值65，第二个对应的是5对应的ASCII码的值 53 内存位置是这样0x01000001 0x00110101 65 * 256 + 53 = 16693  A5是 16进制表示的话，0xA5应该是 一个UCHAR对应的是 psBinString[0] = 165 或者 psBinString[0] = 0xA5;

user: user-5
content: 1.psBinString在这里是缓冲区的概念 2.(long)psBinString[i],这里做了强制转换,步长是8Byte(看上去你这是64位系统,否则不会乘以256)

user: user-0
content: 引用 1 楼 MisteryMethod 的回复:psBinString[n] 是一个UCHAR 0x00000000 占用8bit  所以每次偏移一个UCHAR 就需要乘256  0x00000001 0x00000002 转换为10进制 不就是 2+1*256 我试着放了一个“A5”进行运算，A5换算成十进制是165，但得到的l却大得离谱：16693，是我用错了，还是说需要在转换一下？

user: user-4
content: psBinString[n] 是一个UCHAR 0x00000000 占用8bit  所以每次偏移一个UCHAR 就需要乘256  0x00000001 0x00000002 转换为10进制 不就是 2+1*256

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

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

user: user-0
content: 引用 1 楼 Idle_ 的回复:insert时没有增加cnt  真的，谢谢~~

user: user-1
content: insert时没有增加cnt

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

回复:
user: user-1
content: 因为str 跟 q 的地址重复了， 因此 strcat失败  str跟r连接之后变成了 123efg456   因为efg跟456 之间没有 字符串结束符\0，因此str要到  456之后才算结束  这样就跟 4开始的q字符串 地址重复了。  失败

user: user-2
content: #include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //
user-0 提问: 咨询一个glibc中strcat的实现的一个疑问

回复:
user: user-1
content: Obsolete Forms of Function Declarations and Definitions The old-style function declarations and definitions use slightly different rules for declaring parameters than the syntax recommended by the ANSI C standard. First, the old-style declarations don’t have a parameter list. Second, in the function definition, the parameters are listed, but their types are not declared in the parameter list. The type declarations precede the compound statement constituting the function body. The old-style syntax is obsolete and should not be used in new code. Code using the old-style syntax is still supported, however. This example illustrates the obsolete forms of declarations and definitions:    double old_style();           /* Obsolete function declaration */  double alt_style( a , real )  /* Obsolete function definition */     double *real;      int a;  {     return ( *real + a ) ; }  Functions returning an integer or pointer with the same size as an int are not required to have a declaration although the declaration is recommended.   To comply with the ANSI C standard, old-style function declarations using an ellipsis now generate an error when compiling with the /Za option and a level 4 warning when compiling with /Ze. For example:  void funct1( a, ... )  /* Generates a warning under /Ze or */ int a;                 /* an error when compiling with /Za */ { }  You should rewrite this declaration as a prototype:  void funct1( int a, ... ) { }  Old-style function declarations also generate warnings if you subsequently declare or define the same function with either an ellipsis or a parameter with a type that is not the same as its promoted type.   The next section, C Function Definitions, shows the syntax for function definitions, including the old-style syntax. The nonterminal for the list of parameters in the old-style syntax is identifier-list.

user: user-2
content: 不要纠结了，这是二十多年前的语法，早就淘汰了。 int strhhh (a)      int *a; { ...... 这个相当于 int strhhh (int *a) { ...
user-0 提问: GCC编译参数问题

回复:
user: user-1
content: 搜“跟我一起写makefile”

user: user-2
content: 一楼的回答很好，编译器无法改变代码的内容， 除非选择条件编译 具体事例是什么呢

user: user-3
content: 你的具体需求是什么？ 1楼说的是一个方法

user: user-4
content: 编译时修改值不太可能。 可能的做法是根据不同的编译参数，选择不同的值。 例如： int a=0; #if defined ( D1)      a=1; #elif defined(D2)      a=2; #endif
user-0 提问: 已在struct与typedef迷惑求解

回复:
user: user-1
content: 一言以蔽之：typedef就是为某个自定义类型起了个名字而已罢了。

user: user-2
content: struct 定义结构体； typedef 为类型（包括结构体，类）定义别名；  struct  A { };  typedef A AA；

user: user-3
content: struct 是定义结构体，但是声明时需要struct XXX enployee;才能使用 typedef 为复杂的声明定义简单的别名  typedef struct xxx { }AAA; 这样就可以使用AAA 直接定义 AAA enployee;
user-0 提问: 静态库 头文件问题

回复:
user: user-1
content: 《程序员的自我修养——链接、装载与库》

user: user-2
content: 从语法来说不一定需要，c语言对函数声明的要求不严格，即使不声明也能调用。但是还是声明一下比较清楚规范。 比如，不包含string.h也能使用memset等库函数，但是应该声明。

user: user-3
content: 如果不在头文件里声明，其他人如何知道你提供了哪些接口？所以头文件里包含的是所有你提供接口的声明。链接期间链接器处理的是中间文件（*.o或*.obj），它看不到h和c源文件。

user: user-4
content: 建议包含头文件。虽然说 strcpy、memset 之类的不用 stdio、stdlib 都一样调用，并且会提示，但能编译过去，因为是标准 C 的。你试试不包含 windows.h 来调用 Windows API？肯定么没玩没了的报错。

user: user-5
content: 2楼+10086
user-0 提问: c 程序监控mysql 表数据变化

回复:
user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:我的意思是你不要去做Java或C#转为C的无用功。 赵老师可能误解我意思了， 类似帖子如下： Java程序监控MySQL数据库更新的问题 http://bbs.csdn.net/topics/370148351 C#监控MySQL数据库/表变化 http://bbs.csdn.net/topics/390661071 这两个链接可忽略不看的，我这里说的是其他语言监控mysql的类似帖子，而我这里是C的，不是要将Java或C#转为C哈吗，场景见4楼我的回复。 C程序监控mysql应该不涉及语言之间的转化吧

user: user-1
content: 我的意思是你不要去做Java或C#转为C的无用功。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·…… 谢谢，不知道赵老师可以回复得通俗些，接地气些么，呵呵 场景是这样的，用户---【操作】---》客户端网站---【增删改】---》mysql数据库---【数据表中数据变化】《------》C 程序获知数据变化------》根据逻辑条件do something 按你说的A将请求数据写到文件a.txt，写完后改名为aa.txt，我这边是操作不了A的，只能操作B 网上基本两种建议：1 触发器 ，2 监控binlog

user: user-0
content: 引用 1 楼 user-2 的回复:你研究一下mysql提供的C API就可以了，应该不麻烦 谢谢，我看看...

user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……

user: user-2
content: 你研究一下mysql提供的C API就可以了，应该不麻烦

user: user-1
content: 你就不能等Java或C#的弄出来后，用管道或共享文本文件的方法调用它们吗？ 实在不想等的话，自己搜“监控mysql C源代码”
user-0 提问: C中socket通信关于断线重连的问题

回复:
user: user-1
content: 搜“VC 心跳包 源代码”

user: user-2
content: 这个心跳包属于长链接，需要后台支持的！

user: user-0
content: 引用 1 楼 lovesmiles 的回复:服务器端定时发一个包给客户端，客户端在规定时间内检查有没有收到这个包，没有就是断线了，重连接。  可以用clock函数实现计时。 服务器哪边怎么写的我不知道......发这个包有没有返回呢？？要不要select监听？如果断开我是需要再重新创建套接字进行连接？那我的套接字就变了？是不是套接字也要设定为动态的？

user: user-3
content: 服务器端定时发一个包给客户端，客户端在规定时间内检查有没有收到这个包，没有就是断线了，重连接。  可以用clock函数实现计时。

user: user-0
content: 引用 3 楼 liuxingyu0502 的回复:这个心跳包属于长链接，需要后台支持的！能不能再说详细点？后台怎么支持的呢？
user-0 提问: 怎么把一段字符串插入到另一段字符串

回复:
user: user-1
content: 以下代码的任务是将ch2插入到ch1的第m个字符之后，并将结果放在ch3中，这里需保证m不能大于ch1的总长度，否则ch2无法插入。仅供参考，大神勿喷 	char ch1[30] = {0}; 	char ch2[30] = {0}; 	char ch3[100] = {0}; 	int m;			// 在ch1中第m个字符之后插入ch2,不应该大于ch1的总长度  	printf("please input ch1:\n"); 	scanf("%s",ch1); 	printf("please input ch2:\n"); 	scanf("%s",ch2); 	printf("please input m:\n"); 	scanf("%d",&m);  	char *p1 = ch1; 	char *p2 = ch2; 	char *p3 = ch3; 	int nTemp = 0; 	while (*p1 != '\0') 	{ 		if (nTemp < m) 		{ 			*p3++ = *p1++; 		} 		else 		{ 			if (*p2 == '\0') 			{ 				*p3++ = *p1++; 			} 			else 			{ 				*p3++ = *p2++; 			} 		} 		nTemp++; 	}   	printf("str1:%s\nstr2:%s\n%d\n" ,ch1,ch2,m); 	printf("%s\n",ch3);

user: user-1
content: 代码很乱啊，第二个循环中ch2[i]就不对吧，这个i应该是从0开始吧（或者这里应该是一个从0开始的j）

user: user-2
content: 仅供参考#include <stdio.h> #include <string.h> #include <locale.h> char s[256]; char *p; int r,n,i; int main() {     setlocale(LC_ALL,"chs");     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //

user: user-3
content: 写成函数不好吗？  #include <stdio.h> #include <string.h>   /**   * @brief insert s2 into s1 at position n  *   * @param s1  * @param s2  * @param n   *   * @return s1  */ char *strins(char *s1, const char *s2, size_t n) {     size_t n1, n2;      n1 = strlen(s1);     if (n > n1)         n = n1;      n2 = strlen(s2);     memmove(s1 + n + n2, s1 + n, n1 - n + 1);     memcpy(s1 + n, s2, n2);      return s1; }  int main(int argc, char *argv[]) {     char s1[1024];     char s2[] = "abc";      strcpy(s1, "0123456789");     strins(s1, s2, 3);     printf("%s\n", s1);      strcpy(s1, "0123456789");     strins(s1, s2, 0);     printf("%s\n", s1);      strcpy(s1, "0123456789");     strins(s1, s2, 10);     printf("%s\n", s1);      strcpy(s1, "0123456789");     strins(s1, s2, 15);     printf("%s\n", s1);      return 0; }  /* output: 012abc3456789 abc0123456789 0123456789abc 0123456789abc */

user: user-4
content: 其实LZ是想把ch1和ch2组合成一个新的字符数组，但是不是strcat那样直接把ch2添加到ch1尾部，而是把ch2内容插到ch1第m个元素的后面。

user: user-5
content: 什么把ch2插入到ch1，又分段存储到ch3中？不明白你的意思了……你那个m怎么理解？如果我输入101？怎么办？还有记住数组的初始化、sizeof和strlen的区别……

user: user-6
content: strcat函数，连接两个字符串 http://blog.csdn.net/u012421456/article/details/38645335#t7
user-0 提问: 分享一下我的C笔记

回复:
user: user-1
content: 写的不错哦  赞一个

user: user-2
content: So many books

user: user-3
content: 膜拜楼主

user: user-4
content: 这笔记更像是对c的介绍

user: user-5
content: 小白在此感谢楼主……

user: user-6
content: 学习学习，

user: user-7
content: 对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！

user: user-8
content: 不错呀！谢谢分享

user: user-9
content: 寫得太好了 頂!!!

user: user-0
content: 这个笔记不太适合初学者

user: user-10
content: 很好   刚开始学习C   正好学习一下  谢了你的分享
user-0 提问: 为什么C程序的结果会是这样的？

回复:
user: user-1
content: 引用-789.124023 后面小数023哪来的？ 浮点数的规格化问题

user: user-1
content: 认真复习一下printf format实参的意义。

user: user-2
content: 1. 浮点数都是2进制表示的，不能精确表示所有数； 2. printf 的格式为%[flags][width][.precision][length]type，小数点前是最小长度，小数点后表示精度

user: user-3
content: http://bbs.csdn.net/topics/390676437

user: user-4
content: 1.计算机无法精确的区分浮点数，所以后面那几位数是无效的，可以不理会 2.你指的位宽是什么？是总共输出的位数，还是小数点后数字的个数。如果数字位数大于指定的位数，会全部输出，小于，则对齐。小数后指定位数的格式是“%.2f”，这样只会保留2位小数
user-0 提问: 不知是哪里出错了,将“log.txt”读入结构体数组,搜索结构体内某个成员并将该成员所在结构体数组的flowin&flowout取负值.

回复:
user: user-0
content: 我感觉被骗了，一直在用code block 大叔你是说用visual stdio吗

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 关于结构体里指针的指针赋值问题

回复:
user: user-1
content: 引用 7 楼 cl781121 的回复:[quote=引用 6 楼 xusen1013 的回复:] [quote=引用 2 楼 cl781121 的回复:] 那应该怎么样写呢？ struct _pic_data { unsigned char **rgba; }; ....... void main() { pic_data* poutdata=new pic_data; poutdata->rgba = (unsigned char**) malloc(1024); poutdata->rgba[0] = 0; } 这样就OK了[/quote]    可是我的项目里一定要poutdata->rgba[0][0]这样的方式去赋值，我应该怎么写？[/quote] 你的什么项目要用这种方式赋值？ 你可以把 poutdata->rgba 当成一个指向指针数组的指针。 poutdata->rgba = (unsigned char**) malloc(sizeof(unsigned char*)*4);  4个指针就够了，因为只需要用到4个内存空间存R、G、B、A这4个通道的像素数据。 上面是为指针数组分配了空间，下面为指针数组中的4个指针分配空间：  poutdata->rgba[0] = (unsigned char*)malloc(sizeof(unsigned char)*size); poutdata->rgba[1] = (unsigned char*)malloc(sizeof(unsigned char)*size); poutdata->rgba[2] = (unsigned char*)malloc(sizeof(unsigned char)*size); poutdata->rgba[3] = (unsigned char*)malloc(sizeof(unsigned char)*size);  size 值为多少，需要看你的图片尺寸有多大，一般是图片的宽x高，这4段内存空间是用来分别存R、G、B、A通道的数据的。

user: user-0
content: 引用 6 楼 xusen1013 的回复:[quote=引用 2 楼 cl781121 的回复:] 那应该怎么样写呢？ struct _pic_data { unsigned char **rgba; }; ....... void main() { pic_data* poutdata=new pic_data; poutdata->rgba = (unsigned char**) malloc(1024); poutdata->rgba[0] = 0; } 这样就OK了[/quote]    可是我的项目里一定要poutdata->rgba[0][0]这样的方式去赋值，我应该怎么写？

user: user-2
content: 引用 2 楼 cl781121 的回复:那应该怎么样写呢？ struct _pic_data { unsigned char **rgba; }; ....... void main() { pic_data* poutdata=new pic_data; poutdata->rgba = (unsigned char**) malloc(1024); poutdata->rgba[0] = 0; } 这样就OK了

user: user-3
content: 简单说你rgba指向的是数组，而不是指针。 你可以把rgba定义为unsigned char[N]* N如果不是常数，则只好一维化或再申请一个指针数组

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-5
content: 行数可以没有，列数得有吧

user: user-0
content: 那应该怎么样写呢？

user: user-2
content: poutdata->rgba[0][0] = 0; 是因为你想模拟二位数组，但你告诉系统你的行数，也没有列数，所以系统没法处理
user-0 提问: gcrypt为什么这样对我。。。

回复:
user: user-1
content: 引用 7 楼 user-3 的回复:https://www.gnupg.org/documentation/manuals/gcrypt/ 根据这个文档推测gcrypt是带测试代码的。 我有在tests下找到一个叫fipsdrv.c的文件，里面的代码应该有参考性。

user: user-2
content: #include <cstdlib> #include <iostream> #include <string> #include <gcrypt.h>  using namespace std;  #define GCRY_CIPHER GCRY_CIPHER_AES128   // Pick the cipher here #define GCRY_MODE GCRY_CIPHER_MODE_ECB // Pick the cipher mode here  void aesTest(void) {     gcry_cipher_hd_t handle;     size_t keyLength = gcry_cipher_get_algo_keylen(GCRY_CIPHER);      string txtBuffer ("123456789 abcdefghijklmnopqrstuvwzyz ABCDEFGHIJKLMNOPQRSTUVWZYZ");     size_t txtLength = txtBuffer.size() +1; // string plus termination     char * encBuffer = (char *)malloc(txtLength);     char * outBuffer = (char *)malloc(txtLength);      char * key = "one test AES key"; // 16 bytes      gcry_control (GCRYCTL_DISABLE_SECMEM, 0);      gcry_control (GCRYCTL_INITIALIZATION_FINISHED, 0);      gcry_cipher_open(&handle, GCRY_CIPHER, GCRY_MODE, 0);      gcry_cipher_setkey(handle, key, keyLength);      gcry_cipher_encrypt(handle, encBuffer, txtLength, txtBuffer.c_str(), txtLength);      gcry_cipher_decrypt(handle, outBuffer, txtLength, encBuffer, txtLength);      size_t index;     printf("encBuffer = ");     for (index = 0; index<txtLength; index++)         printf("%c", encBuffer[index]);     printf("\n");      printf("outBuffer = %s\n", outBuffer);      gcry_cipher_close(handle);     free(encBuffer);     free(outBuffer); }   int main() {     aesTest();     return 0; }   https://stackoverflow.com/questions/26189967/aes128-in-libgcrypt-not-encrypting

user: user-3
content: https://www.gnupg.org/documentation/manuals/gcrypt/ 根据这个文档推测gcrypt是带测试代码的。 我有在tests下找到一个叫fipsdrv.c的文件，里面的代码应该有参考性。

user: user-0
content: 没人懂么。。网上也基本没有程序例子。。

user: user-0
content: 引用 4 楼 user-3 的回复:LZ有读参考手册么？ 有啊。。。读了才知道怎么写的。

user: user-3
content: LZ有读参考手册么？

user: user-0
content: 有人懂gcrypt嘛~~

user: user-0
content: 虽然我后面有几个0没处理，但前面的内容应该正常显示啊。。

user: user-0
content: 于是就打印出来一堆乱码。加密马上解密都不可以。
user-0 提问: 对于一个文本文件（包含中英文、全角、半角标点符号），请将其分为两栏（用空格分隔）重新保存。

回复:
user: user-1
content: 使用wchar_t以及相关的文件读写和字符串操作函数。

user: user-2
content: 你打开文件，按行读数据 对每一行数据，从头到尾遍历，发现空格时就停止，把前面的部分输出的文件1中，后面部分加上\n。后面的部分输出的文件2中。空格不要，就OK了

user: user-3
content: 对于这样的提问，只能呵呵了
user-0 提问: 求一个JNI c调用java的demo，java使用可第三方jar库的。

回复:
user: user-0
content: 引用 2 楼 wgmhj328 的回复:网上找找一大把。我最近正做这方面的项目 调用顺序为 JAVA ->JNI->C 第三库并没有什么，将JAVA编译成jar包，这个再由其他程序调 即其他java程序->jar包->JNI->C  我做了个试验。你看下哪里有问题？    /**    * File Name : add.java public class add { 	public static int myAdd(int a, int b){ 		return a + b; 	} }     /**    * File Name : show.java   */   public class show { 	 	@SuppressWarnings("static-access") 	public static void myShow()throws Exception{ 		add padd = new add(); 		int result = padd.myAdd(3, 4); 		System.out.print(result); 	} }  分别打成 jar 包   /**    * File Name : test.c   */  #include <jni.h> #include <stdio.h>   int main(int argc, char * * argv) {     JavaVM * jvm = (JavaVM *)0;     JNIEnv * env = (JNIEnv *)0;       jclass cls;     jmethodID mid;          JavaVMInitArgs vm_args;            JavaVMOption options[1];              options[0].optionString = "-Djava.class.path = -classpath ./show.jar;./add.jar";             vm_args.version = JNI_VERSION_1_6;      vm_args.nOptions = 1;     vm_args.options = options;     vm_args.ignoreUnrecognized = JNI_FALSE;      if(  JNI_CreateJavaVM(&jvm, (void **)&env, &vm_args)  != JNI_OK )     {         printf("create JVM error!\n");         return ;     }      cls = (*env)->FindClass(env, "show");     if(cls == 0)     {         printf("find class failed!\n");         return ;     }       mid = (*env)->GetStaticMethodID(env, cls, "myShow", "()V");     if(mid != 0)     {         printf("find method [myShow] !\n");                          (*env)->CallStaticObjectMethod(env, cls, mid);     }      if(jvm)     {         (*jvm)->DestroyJavaVM(jvm);     } }    root@wx:/home/jni_wx# ls add.jar  make.sh    show.jar  test  test.c    root@wx:/home/jni_wx# ./test  find class failed!    是这个参数 options[0].optionString = "-Djava.class.path = -classpath ./show.jar;./add.jar";    有问题吗？

user: user-0
content: java使用了第三方jar库的。

user: user-1
content: 实际中会把jni 和c编译成库，即测试程序->jar包->c库

user: user-1
content: 网上找找一大把。我最近正做这方面的项目 调用顺序为 JAVA ->JNI->C 第三库并没有什么，将JAVA编译成jar包，这个再由其他程序调 即其他java程序->jar包->JNI->C
user-0 提问: 这个怎么计算天数？！！！我一点不会

回复:
user: user-1
content: 太长了

user: user-2
content: 参考一下

user: user-3
content: 没明白在干啥！！

user: user-4
content: 仅供参考#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }
user-0 提问: 学c语言不久，遇到一道题，求解。

回复:
user: user-0
content: 明白了，谢谢各位的解答

user: user-1
content: 只有做函数的参数时，数组名才和指针等价。泛泛的讲数组名可以做指针用的书都可以烧掉了

user: user-2
content: 引用 3 楼 lian_d 的回复:数组名不是可以当做指针用的吗？ 数组名和指针不是一回事。 某些情况下，数组名可以转换成指针，但不是所有情况都可以。

user: user-0
content: 数组名不是可以当做指针用的吗？

user: user-2
content: char str[100]; strcpy(str, "Hello!");  // 调用库函数把"Hello!"复制给str

user: user-2
content: char *str;   str="Hello!"; // str是个指针，指针可以这样赋值 char str[];  str="Hello!"; // str是个数组，数组不能这样赋值，或者像书上说的，数组名不能作为左值 char str[] = "Hello!"; // 这个可以，初始化
user-0 提问: 有一个长度不大于40的字符串，已知其中共包含两个字符“A”，求处于两个字符“A”中间的字符个数，及这些字符

回复:
user: user-1
content: 2楼代码声明变量不在函数开头，也就这算C++吧。

user: user-1
content: 全贴中我都没看到哪句是C++

user: user-0
content: 以C++的方法来写，完全看不懂。我只是个学C语言的学生。。。。。java都学不好

user: user-1
content: 谁让我最近很无聊呢？ #include <stdio.h> #include <stdlib.h> char a[40],b[40];int n=0; //1.定义字符数组a[40],b[40]，计数器n=0; /*用户自定义函数 */ void myfun() {     int i;      for (i=0;i<40;i++) if (a[i]=='A') break; //3.定位第一个字符’A’的位置;     if (i>=40) {printf("error1\n");exit(1);}     i++;     while (1) { //4.从’A’的后一个字符开始为字符数组b赋值,同时计数器加一，直到遇到第二个字符’A’;         if (a[i]=='A') break;         if (a[i]=='\n') {printf("error2\n");exit(2);}         b[n]=a[i];         n++;         i++;     }     b[n]=0; //5.修正字符数组b； } int main() {     fgets(a,40,stdin); //2.接收字符数组a；     myfun();     printf("b:[%s],n:%d\n",b,n); //6.输出字符数组b和计数器n。     return 0; } //123A456A789 //b:[456],n:3 //

user: user-2
content: 闲着没事，给你写了一个，仅供参考。 int fun(char * src ,char * des) { 	int num = 0; 	if (src == NULL || des == NULL) 	{ 		return 0; 	} 	char *pStart = src; 	char *pEnd = src; 	bool bFlag = false; 	while (*pEnd != '\0')  	{ 		if (bFlag) 		{ 			if (*pEnd != 'A') 			{ 				num++; 				pEnd++; 			} 			else 			{ 				break; 			} 		} 		else 		{  			if (*pStart == 'A') 			{ 				bFlag = true; 				pStart++; 				pEnd = pStart; 				continue; 			} 			else 				pStart++; 		} 	} 	strncpy(des ,pStart ,num); 	return num; }  int main(int argc, _TCHAR* argv[]) { 	char src[40] = {0}; 	char des[40] = {0};  	scanf("%s" ,src); 	int n = fun(src ,des); 	printf("%s ,%d\n" ,des ,n); 	return 0; }

user: user-3
content: 这么明确要求，很容易实现啊
user-0 提问: 《C和指针》一书中第6章查找指针数组里字符的程序是不是有问题

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-2
content: printf("%d",find_char(vp,'f', sizeof(vp)/sizeof(vp[0])));  int find_char(char **strings,int value, int size ) {     char *string;     int i;     for (i = 0; i < size; i++)     {         string = strings[i];

user: user-2
content: 改成这样可以解决  char *vp[]={"ab","cd","ef", NULL }; 更好的办法是给find_char加个参数，表示指针数组的大小

user: user-2
content: 确实有问题 while ((string=*strings++)!=NULL)  // 这个结束条件不对。 循环的过程是string依次为vp[0]，vp[1]，vp[2]，vp[3]，但是这个vp[3]越界了，是不是NULL就不一定了
user-0 提问: 函数指针

回复:
user: user-1
content: 恰恰相反，函数调用只作用于函数指针。f()将f先转为指针再调用，等于(&f)()。pf()直接调用，(*pf)()纯属多余。

user: user-2
content: 这些概念在数学中有提到： 可以写出y=f(x)的叫显示解  只能写出f(x,y)=C的叫隐式解

user: user-0
content: 我的意思是说对于函数指针指针调用函数是用p()函数指针直接调用函数的时候，编译器会不会自动加上*进行隐式解引用

user: user-1
content: 不知道LZ想问什么 除sizeof、_Alignof和&作用下，函数名自动转换为函数指针
user-0 提问: C语言中关于“统计数”的函数

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

user: user-1
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-2
content: fopen之后一定要检查他的返回值是不是NULL

user: user-3
content: fscanf是读取文件，为什么要等你输入呢？
user-0 提问: 为什么printf不能输出多个字符串

回复:
user: user-1
content: # include <stdio.h>  int main(void) { 	char c;     scanf("%c",&c); 	while(c!='#') 	{ 		if(c>='a'&&c<='z') 		{ 			c-=32; 		} 		else if(c>='A'&&c<='Z') 		{ 			c+=32; 		} 		printf("%c",c); 		scanf("%c",&c);//不加这个， c只是个字符，你输入字符串当然不行了 ,这样是循环输入一个个字符  	} 	 	return 0; //最好加上这个  }

user: user-2
content: http://ideone.com/2yilRg

user: user-2
content: 引用 3 楼 fzx6393 的回复:[quote=引用 1 楼 user-2 的回复:]    scanf("%c",&c);  while(c!='#')  -->     while( scanf("%c",&c) == 1 && c !='#')   while( scanf("%c",&c) == 1 && c !='#')[/code][/quote]这句话输出结果不对[/quote] http://ideone.com/2yilRg

user: user-0
content: 引用 1 楼 user-2 的回复:   scanf("%c",&c);  while(c!='#')  -->     while( scanf("%c",&c) == 1 && c !='#')   while( scanf("%c",&c) == 1 && c !='#')[/code][/quote]这句话输出结果不对

user: user-0
content: while( scanf("%c",&c) == 1 && c !='#') 这句话 输入

user: user-2
content: scanf("%c",&c);  while(c!='#')  -->     while( scanf("%c",&c) == 1 && c !='#')
user-0 提问: C语言点滴程序3-8问题，求解

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

user: user-2
content: 初学者最好不要使用具有联想功能的IDE，使用editplus或者sublime text都是很好的选择

user: user-3
content: 因为对内存数据，不同的数据类型解释不同。 我用的Codeblocks

user: user-0
content: 噢噢，知道了。为什么上面的i用 f %输出就会成了这结果. PS：你用的是什么编程软件？

user: user-3
content: #include<stdio.h>  int main () {     int i=123456789;     float f=123456789.0f;     f+=20;     printf("%f\n",f);     f=(float)i;     printf("%f\n",f); }

user: user-3
content: 你的程序打错了，printf应该输出f
user-0 提问: 用c语言写出程序

回复:
user: user-1
content: 仅供参考//运用C语言开发一个“小学生算术四则运算测试系统”。该系统是让计算机充当一位给小学生布置作业的算术老师，为学生出题并阅卷。该系统要求实现下列功能： //①为小学生出题（分别进行+、-、*、/等不同运算）。 //②学生做题后，进行评阅。学生每做一题后，评阅给出“答题正确，很好”或“答题错误，重做”等信息。 //③加、减、乘、除运算功能可以自由选择实现。 //④运算数值可控制在两位数的四则运算范围内。 #include <stdio.h> #include <stdlib.h> #include <time.h> int c,a,b,r,ri; void main() {     srand( (unsigned)time( NULL ) );     system("cls");     printf("小学生算术四则运算测试系统\n");     while (1) {         printf("1加法 2减法 3乘法 4除法 0退出:");fflush(stdout);         rewind(stdin);         scanf("%d",&c);         if (0==c) break;         switch (c) {         case 1:             a=rand()%100;             b=rand()%100;             r=a+b;             while (1) {                 printf("%d+%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 2:             a=1+rand()%99;             b=rand()%a;             r=a-b;             while (1) {                 printf("%d-%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 3:             a=rand()%99;             b=rand()%99;             r=a*b;             while (1) {                 printf("%d*%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 4:             a=2+rand()%998;             b=1+rand()%(a/2);             while (1) {                 if (0==a%b) break;                 b--;             }             r=a/b;             while (1) {                 printf("%d/%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         }     } }

user: user-2
content: 这种活，就是费时间，自己写吧！

user: user-3
content: 其实这种问题的难度不大，就是麻烦而已，说白了就是体力活。。。

user: user-4
content: 好写是好写 就是麻烦点  30分够呛 30元肯定有。。。

user: user-5
content: 自己慢慢写吧，这事找别人帮忙不好
user-0 提问: mmap映射文件的问题。

回复:
user: user-1
content: 把后面内容全部复制上来，然后截断。

user: user-2
content: 这和一般的文件操作是一样的。 文件没有删除一行的功能，只能把后面的内容前移过来覆盖掉。然后在文件尾加EOF截掉不要的部分。

user: user-3
content: 可以memset为0，然后还能读到空的文件，有定义EOF吗？将文件第一个字符改为EOF
user-0 提问: 如和用C语言将汉字转化成unicode编码

回复:
user: user-0
content: 好的，多谢啦

user: user-1
content: 好吧，给你代码，环境是DEV C++，根据你自己的需要自己调整吧  #include <stdio.h> #include <stdlib.h> #include <Windows.h>  int main(int argc, char *argv[]) { 	char *testStr = "中"; 	unsigned short outputStr[20] = {0}; 	int  unicodeLen = 0; 	int i = 0; 	 	unicodeLen = MultiByteToWideChar( CP_ACP,             0,             testStr,             -1,             NULL,             0 ); 	 	 	 	MultiByteToWideChar( CP_ACP,          0,          testStr,          -1,          (LPWSTR)outputStr,          unicodeLen );                for (i=0;i<unicodeLen/2;i++) 	{ 		printf("[%d]%x\r\n",i,outputStr[i]); 	} 	 	return 0; }

user: user-0
content: 我的目的不是为了得到某个字的unicode值，所以用C语言以外的方法是行不通的， 有谁知道如何用C语言将 某个字转化为unicode值呢

user: user-1
content: 第1种方法，如楼上所说，调用WINDOWS API，直接转换 第2种方法，可以将汉字写入文本文件中，保存为unicode，以二进进方式读，取值

user: user-0
content: 这是我们的作业。 我不需要讲所有的汉字都转化成unicode编码，我只需要将我需要转化 的字符变为unicode编码，所以不需要考虑工作量的问题， 我要的只是转化的方法 只能用于Windows或者linux的方法是行不通的

user: user-2
content: 所以，你要做的就是调用API来完成。windows下有对应的转换函数，MultibyteToWideChar、WideCharToMultibyte，查MSDN吧。其他平台不知道，应该也是有资料的。

user: user-2
content: 这个工作比较艰巨，光是unicode就有好几个标准：utf8、utf16le、utf16be、utf32等等。你要一一实现的话，不知道几年能做完。而且更重要的是，这个别人早都做好了，为什么还要重复呢。
user-0 提问: 请问一个用指针交换字符串中两个字符的问题

回复:
user: user-1
content: void reverse(char *p1 ,char *p2) { char temp = *p1; *p1 = *p2; *p2 = temp; }  void main() { char s[]="i am a student"; char *pstart = s; char *pend=s; while(*pend!='\0') { pend++; } pend--; reverse(pstart,pend); printf("c=%s\n",s); }

user: user-2
content: char *S="i am a student"; 这个应该定义为  char const *S="i am a student";  这个 BUG 是因为历史原因。

user: user-3
content: 把char *S="i am a student";改成char S[]="i am a student";

user: user-0
content: 楼上感谢！想了半天

user: user-4
content: 定义成数组吧，字符串常量只读