Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: keil 警告问题

回复:
user: user-0
content: 引用 5 楼 sholber 的回复:才发现，这题仅仅20分，你说我何苦费这个劲。 分少，谅解，20分都给你了

user: user-1
content: MDK编译会有警告类型不匹配，但是运行的时候是没有问题的。

user: user-2
content: 参数类型不一致。。。

user: user-3
content: 才发现，这题仅仅20分，你说我何苦费这个劲。

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:我觉得没问题。 引用 2 楼 a30037338 的回复:那你定义的时候就 把unsigned char 8* 改成 const char *， kell对类型要求很严格， 或者用数组来存字符串 引用 3 楼 sprawling 的回复:这个有没有问题看实际情况，这样不规范的用法应当避免，不能说你错，但是可以有多种解释。  说没有问题的赵老湿，建议再看看书。说keil对类型要求很严格，这是夸keil呢，还是贬低keil？这不是keil的问题。说有没有问题看实际情况，这个实际情况是什么情况？唵？  翻一下ISO/IEC 9899:201x Committee Draft 文件N1570，strlen函数的原型如下： # include <string.h> size_t strlen (const char * s); 很清楚，strlen函数的参数类型是const char *。  N1570，6.5.2.2 Function calls In preparing for the call to a function, the arguments are evaluated, and each parameter is assigned the value of the corresponding argument. 这即是说，参数传递类似于赋值。那么，我们再看赋值时，如果=运算符左右两个操作数都是指针类型时，有什么样的要求--> N1570，6.5.16.1 Simple assignment the left operand has atomic, qualified, or unqualified pointer type, and (considering the type the left operand would have after lvalue conversion) both operands are pointers to qualified or unqualified versions of compatible types, and the type pointed to by the left has all the qualifiers of the type pointed to by the right; 简言之，左右两个指针所指向的类型，在去掉限定符后，应当是兼容类型。而且，左边那个指针所指向的类型，应当具有右边那个指针所指向的类型的所有限定符。 因为strlen函数的参数类型是const char *，传递给该函数的参数类型是unsigned char *，那么， 1，左边指针所指向的类型具有const限定符，右边指针指向的类型没有限定符。可以视为，左边指针指向的类型具有自己的限定符const，加上右边指针所指向的类型的限定符（无）。这一条件通过； 2，两个指针所指向的类型在去掉限定符后，一个是char，另一个是unsigned char。不管char等价于unsigned char，还是等价于signed char，它们都是三种彼此不兼容的类型。问题就出在这里。  N1570，6.2.7  Compatible type and composite type Two  types  have compatible type if their types are the same.  N1570，第45页，注脚45： CHAR_MIN, defined in <limits.h>, will have one of the values 0 or SCHAR_MIN, and this can be used to distinguish the two options.  Irrespective of the choice made,char is a separate type from the other two and is not compatible with either.

user: user-4
content: 我觉得没问题。

user: user-5
content: 这个有没有问题看实际情况，这样不规范的用法应当避免，不能说你错，但是可以有多种解释。

user: user-6
content: 那你定义的时候就 把unsigned char 8* 改成 const char *， kell对类型要求很严格， 或者用数组来存字符串
user-0 提问: 新手菜鸟的简单问题，关于函数参数的

回复:
user: user-0
content: 引用 3 楼 FightForProgrammer 的回复:printf函数不就是这样么。 http://blog.csdn.net/fengrx/article/details/4135090 三q

user: user-0
content: 引用 2 楼 starytx 的回复:搜索”C 不定参“ 谢谢星哥

user: user-0
content: 引用 1 楼 march0912 的回复:省略形参，具体的自己去看书吧！ 谢谢大哥

user: user-1
content: 参数个数不确定，所以省略。在函数的开始处，可以用宏把参数个数和具体的参数内容解析出来。

user: user-2
content: 传送门：省略形参

user: user-3
content: printf函数不就是这样么。 http://blog.csdn.net/fengrx/article/details/4135090

user: user-4
content: 搜索”C 不定参“

user: user-5
content: 省略形参，具体的自己去看书吧！
user-0 提问: 怎么让BitBlt生成BMP图片是黑底红字~~求助~~~~

回复:
user: user-1
content: 都解决 了，那就接分吧

user: user-2
content: 那我就不凑热闹了，免的被踩死。

user: user-0
content: 问题已经解决了，随便散分了散分了....

user: user-0
content: 我生成后的效果是这样的， 明显不对，我要的是黑底，红字，大神帮忙看看

user: user-0
content: 我要的效果是黑底红字，但是生成的效果是背景是黑色，但是字的部分是红底黑字

user: user-2
content: 看看，我说的吧，4楼就刚刚在我眼前被活活踩死了。那叫一个惨哪！可惜没拍下来传到网上！
user-0 提问: 如何定义数据格式

回复:
user: user-1
content: 用两个字节去表示“UPDATE"字符，除非你用枚举类型吧，两个字节存储6个字节的内容是不现实的。

user: user-2
content: 引用 4 楼 u013163178 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。赵老师，什么是数据格式，什么是文件格式[/quote] http://www.baidu.com/s?wd=%E6%95%B0%E6%8D%AE%E6%A0%BC%E5%BC%8F%20%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg

user: user-3
content: 引用 3 楼 zhao4zhong1 的回复:为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。赵老师，什么是数据格式，什么是文件格式

user: user-2
content: 为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。

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

user: user-4
content: 0-1字节是报文头“UPDATE”   你觉得2个字节能装下“UPDATE” 这么多东西吗.  一般是这样处理;   定义一个2字节的包头常量:  #define UPDATE  0x1FF1   //这个字段最好是能达到4字节以上, 否则很容易被其它数据匹配,  定义2字节的产品名, 可以是一张表.当然如果可以更长些, 那么可以使用字符串.  如果2字节, 那就写在表的索引. 然后是版本号;  内存数据就是这个样子:  F1 1F 01 20 01 00  然后转化成一个结构体就是这样; struct Data {      WORD wHeadFlag;      WORD wNameIndex;      WORD wVersion; };  struct Data da; da.wHeadFalg = 0x1FF1; da.wNameIndex = 0x2001 da.wVersion = 0x0001  BYTE *pBuf = (BYTE*)&da; 这时pBuf指向的数据就是这个样子  F1 1F 01 20 01 00
user-0 提问: 紧急求助：如何把文本里面的汉字转换为中国的形式

回复:
user: user-1
content: #include <stdio.h> #include <windows.h> int main() {     char gbk[]="中国";     wchar_t wc;     char d[256];     int i;      d[0]=0;     for (i=0;i<2;i++) {         MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,gbk+i*2,2,&wc,1);         sprintf(d,"%s&#%d;",d,wc);     }     printf("%s",d);      return 0; } //中国

user: user-2
content: 就是UNicode

user: user-0
content: up@ updwn
user-0 提问: C语言 嵌入式 数组 指针 定义

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

user: user-1
content: 方法2只是定义的同时赋初始值， 其等同于 uchar *p; p=Number; 不能理解为 uchar *p; *p=Number;

user: user-2
content: 还理解个屁！ 你所要做的，是理解赋值运算符和声明（包括初始化器）这两个东西的形式。

user: user-3
content: 在C语言核心技术中提到，你的uchar *p=Number 只是初始化，是一条声明。而楼上的那种是一种赋值语句，编译器用不同的方式对待两者。所以第一种第二种都是正确的！

user: user-4
content: 你的方法2也是正确的；  多一个方法3： uchar Number[6]={0,0,0,0,0,0}; uchar *p; *p=Number; 这个才是错误的。。。正如你所理解，p是一个指针，它只想一个地址，但这个地址里面的内容不应该用数组number的地址编号来赋值
user-0 提问: 一个C工程 vc6.0引用库正常，VS08出现连接错误

回复:
user: user-1
content: 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项

user: user-2
content: 不同版本的C++编译器不能兼容，你要把GMP用VS2008重新编译，然后再引用lib文件
user-0 提问: 求大神看看哪里错了

回复:
user: user-1
content: #define max 1000 #define temp 1 //下移，遵守下定义后使用的原则 typedef struct name {     char lastname[max];     char secondname[max];     char firstname[max]; }Name; typedef struct personal {     int ID;     Name person; }P; void print(P s);  另外，宏定义建议你使用大写$define    MAX    32 从你定义的名字数组的长度可以看出你真是“内存大款”，平时测试能用到1000个字节吗？所以，根据需要定义数组的长度，因为这些在实际操作中都是需要考虑内存呢，当然你这是局部变量还好。从这个定义可以看出你是一个新手，不过我也是这样过来的，对内存的分配还是要“吝啬”一些，需要多少，分配的时候只要比需要的多分配一些，就可以。

user: user-2
content: 将print函数的声明放到结构体定义的后面
user-0 提问: 今天这个问题我已疯 只求解释

回复:
user: user-1
content: 引用 37 楼 zhao4zhong1 的回复:[quote=引用 33 楼 misskissC 的回复:] [quote=引用 18 楼 zhao4zhong1 的回复:] 有时越是常识性问题，越难理解和学会。 何解[/quote] 比如 程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。 [/quote] 赵老湿，那怎么补常识

user: user-2
content: 引用 33 楼 misskissC 的回复:[quote=引用 18 楼 zhao4zhong1 的回复:] 有时越是常识性问题，越难理解和学会。 何解[/quote] 比如 程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。

user: user-3
content: 我感觉入手《Linux程序设计》，前面几章看看先入门为好。

user: user-2
content: 引用 38 楼 misskissC 的回复:[quote=引用 37 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 misskissC 的回复:] [quote=引用 18 楼 zhao4zhong1 的回复:] 有时越是常识性问题，越难理解和学会。 何解[/quote] 比如 程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。 [/quote] 赵老湿，那怎么补常识[/quote] 多犯常识性错误并及时纠正。

user: user-4
content: ./a.out

user: user-5
content: 这么长时间还不结帖，论坛的人都已疯

user: user-1
content: 引用 18 楼 zhao4zhong1 的回复:有时越是常识性问题，越难理解和学会。 何解

user: user-6
content: 居然还有闲情回复我……有这个功夫，还不如直接翻翻LINUX编程指南之类的书籍，问题就解决了。  引用 14 楼 zy_dream 的回复:[quote=引用 12 楼 super_admi 的回复:] 目测楼主是来秀下限的。   呵呵是啊  我就是来秀的 怎么 影响到你了？您是大神 NB嘛  我很坦诚的说我自己才开始学习 自己学习 就什么都不知道 才要学习  任你怎么说[/quote]

user: user-7
content: 引用 18 楼 zhao4zhong1 的回复:有时越是常识性问题，越难理解和学会。是滴，入门最难

user: user-7
content: linux下就不想ＩＤＥ一键直达了

user: user-5
content: 既然都会了，就给分吧，俺是来接分滴。

user: user-8
content: 引用 11 楼 zy_dream 的回复:[quote=引用 4 楼 firetreeSF 的回复:] 简单来说，执行以下两步即可： 1.     $gcc -o h h.c 2.     $./h   多谢多谢 终于可以运行了 因为我们上学期学的是python 那在vim下怎么很简单的样子 所以到c这块自己完全不太清楚[/quote]  其实这是Linux系统的基础知识，和语言本身无关，补Linux基础推荐《鸟哥的私房菜基础篇》

user: user-2
content: 有时越是常识性问题，越难理解和学会。

user: user-9
content: 引用 13 楼 zy_dream 的回复:[quote=引用 10 楼 lucifer886 的回复:] 醉了……你手上没资料么？ 已经知道了 超新手 没有关于vim的资料 只有C primer plus[/quote]看下鸟哥的私房菜吧

user: user-10
content: 1.     $gcc -o h h.c 2.     ./h  有的时候 得到一个答案是一件很简单的事  但是很少有人会反思在答案背后的东西，如果你可以对这俩行代码做了背后到底做了什么有所了解，就已经迈出C语言的第二步了，或者说编译型语言的第二步。如果你连想都没想 怎么这俩条命令就可以执行的话，那你就已经走错路了。  这个俩行操作 涵盖了四个过程 :1 预处理 2 编译 3 汇编 4 链接

user: user-11
content: Linux的哲学，no news is good news。 cc h.c 没有报任何错误，说明该命令执行成功。 只是该命令只是把h.c编译成a.out而已。 如果要执行编译好的程序，还有这样： ./a.out

user: user-0
content: 引用 12 楼 super_admi 的回复:目测楼主是来秀下限的。   呵呵是啊  我就是来秀的 怎么 影响到你了？您是大神 NB嘛  我很坦诚的说我自己才开始学习 自己学习 就什么都不知道 才要学习  任你怎么说

user: user-0
content: 引用 10 楼 lucifer886 的回复:醉了……你手上没资料么？ 已经知道了 超新手 没有关于vim的资料 只有C primer plus

user: user-6
content: 目测楼主是来秀下限的。

user: user-0
content: 引用 4 楼 firetreeSF 的回复:简单来说，执行以下两步即可： 1.     $gcc -o h h.c 2.     ./h   多谢多谢 终于可以运行了 因为我们上学期学的是python 那在vim下怎么很简单的样子 所以到c这块自己完全不太清楚
user-0 提问: C语言求助！！！

回复:
user: user-1
content: 引用 2 楼 configerss 的回复:指针不大会啊，能帮忙改下吗？相当于把m代入f中，再用gs积分 // HELK.cpp : Defines the entry point for the console application. //  #include "stdafx.h" #include<stdio.h> #include<math.h>  //高斯公式 并没有给你改成你想要的直接答案 只提示你出错在哪里   /*typedef double (*D_dd_Fun_Ptr)(double,double);*/  double fun(double x,double m); double gs(double f(double x,double m),double a,double b);//这种写法 已经把第一个参数声明为了函数指针    int main() {     /*D_dd_Fun_Ptr f = fun;*/     double a,b,s,m,x;     //b,a为积分上下限     a=0.0;b=1.0;m=1.0;     s=gs(fun,a,b);// gs的第一个参数 你定义为了函数指针 这就不能传入gs(fun(x,m),a,b);     printf("s=%lf\n",s);     return 0; } double fun(double x,double m)      //积分函数 {     return (m+x*x); }  double gs(double f(double x,double m),double a,double b)  //高斯积分法 {     double z1,z2,h,d,h0,eps,pi;     int i,j,n;     n=1;eps=0.000001;pi=3.1415926525;     z1=z2=0.0;     static double x[5]={-0.906179845938664,-0.538469310105683,0.0,0.538469310105683,0.906179845938664};     static double A[5]={0.236926885056189,0.478628670499366,0.568888888888888,0.478628670499366,0.236926885056189};     h0=fabs(0.001*(b-a));     h=(b-a)/n;     for(i=0;i<n;i++)         for(j=0;j<5;j++)             z1+=A[j]*f(h*(x[j]+2*i+1)/2.0+a,double(0)); // 你程序 f已经是函数指针 而你只传了一个参数      z1=z1*h/2.0;     do     {         n=2*n;         h=h/2.0;         for(i=0;i<n;i++)             for(j=0;j<5;j++)                 z2+=A[j]*f(h*(x[j]+2*i+1)/2.0+a ,double(0)); // 你程序 f已经是函数指针 而你只传了一个参数         z2=z2*h/2.0;         d=fabs(z2-z1);         z1=z2;     }     while((d>eps)&&(h>h0));     return z1; }

user: user-0
content: 指针不大会啊，能帮忙改下吗？相当于把m代入f中，再用gs积分

user: user-1
content: double gs(double f(double x,double m),double a,double b);  这种写法 貌似不存在吧   这种声明编译器不认 如果需求要传这种形式 可以以函数指针的方式存进去。  或者 用其他的实现方式 达到你想要的目的。实际问题转换成语言是要一定规则的，你可以把问题拆分成小问题。  一步步的实现，调用小的函数，在组合成你要的，如果你一定要按照这种实现，可以看看函数指针。
user-0 提问: c primer plus 第6章练习题16

回复:
user: user-0
content: 引用 4 楼 u013163178 的回复:#include<stdio.h>  int remain_money(double n) { 	static int cnt = 0; 	double remain; 	remain = n * (1 + 0.08) - 10.0; 	cnt++; 	if( remain > 0) 		remain_money(remain); 	else 		return cnt; }  int main(int argv,char **argc) { 	printf("%d\n",remain_money(100.0)); 	return 0; }   感谢你的解答，我还想请问下main函数后面括号里的2个变量的用法，请不吝赐教，谢谢、

user: user-1
content: #include<stdio.h> int year(double); int main(void) { printf("年数为：%d",year(108.)); return 0; } int year(double money) { int years=1; double remain=money*(1+8./100)-10; while(remain>=0) { remain=remain*(1+8./100)-10; years++; } return years; }

user: user-2
content: 这都不会，还怎么理财。

user: user-3
content: #include<stdio.h>  int remain_money(double n) { 	static int cnt = 0; 	double remain; 	remain = n * (1 + 0.08) - 10.0; 	cnt++; 	if( remain > 0) 		remain_money(remain); 	else 		return cnt; }  int main(int argv,char **argc) { 	printf("%d\n",remain_money(100.0)); 	return 0; }

user: user-4
content: 年金公式直接算答案

user: user-5
content: 这不是数学公式吗

user: user-6
content: 每年还需要取出来10W呢，你没有在总数里面减去
user-0 提问: char类型输出FFFFFFF8

回复:
user: user-1
content: 引用 4 楼 u011608191 的回复:程序员面试宝典上看到的 改为这样后：     unsigned int a = 0xFFFFFFF7;     unsigned char i = (unsigned char)a;     unsigned char * b = (unsigned char *)&a;     unsigned  char c = 0xFFFFFFF8;      printf("%08x,  %08x,   %08x  , %d\n",i,*b,c,sizeof(c));      结果是：     000000f7    000000f7    000000f8      1      得到的结果是：char类型是fffffff7  ，  unsigned char 是000000f7  这是不对的。 C/C++中有个字符类型, char, signed char, unsigned char。 其中char可能是signed char, 也可能是unsigned char, 这个取决于编译器。  一个结果取决于编译器实现的结果，当然是不确定的。

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-0
content: 我最后就我的理解做一下总结： 1，输出时，%x,是按照整形来输出的，会将字符转换为整形进行输出。 2，如果是无符号字符，其最高位不是符号位，在转换时补0。 3，如果是有符号字符，其最高位是符号位，在转换时，会用符号位补齐。  所以，就会出现我提到的现象。  这是我的理解，如有问题，请多多指教。

user: user-3
content: 题目不大，其中的东西不少 可怜的人，你都不了解printf，也不了解类型转换，也不了解整数提升，也不知道常规算术转换…… 最重要的，你不明白char可能等价于unsigned char，也可能等价于signed char，所以，结果也就不好说了……

user: user-4
content: 引用 7 楼 u013163178 的回复:#include<stdio.h> int main(int argv, char **argc) { 	unsigned char a = 'c'; 	printf("%08x",a);  	return 0; }+1,类型转换不对

user: user-5
content: #include<stdio.h> int main(int argv, char **argc) { 	unsigned char a = 'c'; 	printf("%08x",a);  	return 0; }

user: user-6
content: 不管什么宝典都是个错题。

user: user-7
content: char 只有1个字节  但是 %x 会处理4个字节的数据

user: user-0
content: 程序员面试宝典上看到的 改为这样后：     unsigned int a = 0xFFFFFFF7;     unsigned char i = (unsigned char)a;     unsigned char * b = (unsigned char *)&a;     unsigned  char c = 0xFFFFFFF8;      printf("%08x,  %08x,   %08x  , %d\n",i,*b,c,sizeof(c));      结果是：     000000f7    000000f7    000000f8      1      得到的结果是：char类型是fffffff7  ，  unsigned char 是000000f7

user: user-0
content: 这是一个面试题

user: user-6
content: 你输出格式错了 这种情况下 再分析都意义不大

user: user-8
content: 你是以16进制的形式输出的，即以unsigned int类型输出的。
user-0 提问: 用writefile函数可以修改文件内容吗？

回复:
user: user-1
content: 引用 4 楼 sholber 的回复:赵老湿不要告诉我你用的是瑞星…… 我用的是McAfee

user: user-2
content: 赵老湿不要告诉我你用的是瑞星……

user: user-2
content: 引用 1 楼 zhao4zhong1 的回复:关掉杀毒软件。 #include <windows.h> #include <stdio.h> int main() { char buffer[11]={0x6F,0x68,0x6D,0x79,0x67,0x6F,0x64,0x21,0x21,0x21,0x21}; DWORD dwWriteSize=11; HANDLE hFile = CreateFile("c:\\1.exe",     //创建文件的名称。    GENERIC_WRITE,          // 写文件。    0,                      // 不共享读写。                                    NULL,                   // 缺省安全属性。                                    OPEN_EXISTING,          // 如果文件存在，则打开。                                    FILE_ATTRIBUTE_NORMAL, // 一般的文件。                                             NULL);                 // 模板文件为空。   SetFilePointer(hFile,0x4B383,0,FILE_BEGIN);         WriteFile(hFile,buffer,sizeof(buffer),&dwWriteSize,NULL);  CloseHandle(hFile);  return 0; }   窝哈哈哈，赵老湿，我闻到你学术上的腐朽味道罗…… 既然 dwWriteSize没有什么用处，为什么不这样写： WriteFile (hFile, buffer, sizeof (buffer),& (DWORD) {11}, NULL); 关掉杀毒软件……赵老湿原来不是裸奔……

user: user-3
content: 你的代码可以，注意偏移，PE文件最好用filemapping

user: user-1
content: 关掉杀毒软件。 #include <windows.h> #include <stdio.h> int main() { char buffer[11]={0x6F,0x68,0x6D,0x79,0x67,0x6F,0x64,0x21,0x21,0x21,0x21}; DWORD dwWriteSize=11; HANDLE hFile = CreateFile("c:\\1.exe",     //创建文件的名称。    GENERIC_WRITE,          // 写文件。    0,                      // 不共享读写。                                    NULL,                   // 缺省安全属性。                                    OPEN_EXISTING,          // 如果文件存在，则打开。                                    FILE_ATTRIBUTE_NORMAL, // 一般的文件。                                             NULL);                 // 模板文件为空。   SetFilePointer(hFile,0x4B383,0,FILE_BEGIN);         WriteFile(hFile,buffer,sizeof(buffer),&dwWriteSize,NULL);  CloseHandle(hFile);  return 0; }
user-0 提问: 马上就要期末考试了， 函数指针还有些不明白

回复:
user: user-1
content: int fun(int (*p)(),int a,int b)//在变量声明或函数参数声明中，*前缀表示指向某类型的指针 {  return (*p)(a,b);//在可执行语句中，*前缀表示取后面指针变量所指的内容 } //请注意区别上面两种*的不同之处！

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390969965 引用 5 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390969965 非常感谢！

user: user-1
content: http://bbs.csdn.net/topics/390969965

user: user-0
content: int fun(int (*p)(),int a,int b)//书上是这样子写的 {  return (*p)(a,b); } ------------------------------------------------------------- result=fun(add,a,b); //意思是运行到的时候会转到执行fun函数,然后 return (*p)(a,b);，（*p）代表add这样理解对吗？   @user-3 @yuzhenxiong0823

user: user-1
content: 看在40分的份上：（英雄为五斗米折腰！） #include<stdio.h> int add(int m,int n) {  return m+n; } int mul(int m,int n) {  return m*n; } int fun(int (*p)(),int a,int b)//声明函数fun,带3个参数，第1个参数的类型为int (*p)()，即一个指向某类函数的指针，该类函数无参数，返回int {  return (*p)(a,b);//调用p指向的函数,并将参数a,b传入。 } void main() {  int result,a,b;  printf("请输入两个整数a和b的值：");  scanf("%d%d",&a,&b);  result=fun(add,a,b);//调用fun函数，参数分别为add,a,b  printf("两个数的和为：%d\n",result);  result=fun(mul,a,b);////调用fun函数，参数分别为mul,a,b  printf("两个数的积为：%d\n",result); } 该代码后缀需要用.c而非.cpp才能编译通过。因为C编译器不会阻止 int (*A)() 和 int (*B)(int,int) 这两种类型的变量之间互相赋值。

user: user-2
content: 引用 1 楼 user-3 的回复:int (*p)()，定义了一个函数指针，它指向一个函数（其实就是一个函数的地址），该函数返回值为int，没有参数。   int fun(int (*p)(),int a,int b) {  return (*p)(a,b); }  该fun函数有三个参数，第一个是一个函数指针，第二个第三个都是一个int变量  这个函数的实现应该是错误的，因为给出的函数指针指向的函数应该是没有参数的，但是在使用的时候确传了两个参数进去 这个函数指针应该是这样的：  int fun(int (*p)(int, int),int a,int b) {  return (*p)(a,b); }  上面的说的很清楚，好好的去看看 函数指针 相关的学习内容

user: user-3
content: int (*p)()，定义了一个函数指针，它指向一个函数（其实就是一个函数的地址），该函数返回值为int，没有参数。   int fun(int (*p)(),int a,int b) {  return (*p)(a,b); }  该fun函数有三个参数，第一个是一个函数指针，第二个第三个都是一个int变量  这个函数的实现应该是错误的，因为给出的函数指针指向的函数应该是没有参数的，但是在使用的时候确传了两个参数进去 这个函数指针应该是这样的：  int fun(int (*p)(int, int),int a,int b) {  return (*p)(a,b); }
user-0 提问: 关于ip设计哈希表的问题

回复:
user: user-1
content: 引用 10 楼 ForestDB 的回复:ip就是个unsigned int32。 之前我错以为是__int64了。

user: user-2
content: ip就是个unsigned int32。

user: user-0
content: 谢谢大家的帮助。。我弄好了。。结贴a

user: user-3
content: 用经典的time33，每个字节乘33后加在一起做为key，考虑怎么开链就行了，或者更简单用2^n-1取&为key，按需决定n

user: user-1
content: http://www.baidu.com/s?wd=IP%E5%9C%B0%E5%9D%80%20%E5%93%88%E5%B8%8C%E5%87%BD%E6%95%B0&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_pq=f1dc6b2e0000cd1d&rsv_t=4713pUyAuAe9Pn7jW40WW%2FjNeejyqEJG%2FNaQFCbvjbempZDCRAqK%2FDBTSJSQYXXnD1bh&inputT=6085&rsv_sug3=45&rsv_sug4=947

user: user-1
content: IP地址本质上就是unsigned __int64 将ip区间和unsigned __int64的区间对应起来， 适合unsigned __int64用的hash函数就适合IP地址。

user: user-0
content: 很感谢你的帮助。但是我想要的是C语言来完成。首先是设计一个适用于IP地址的哈希函数。然后通过这个哈希函数的值来判断是否存在于一个自定义的ip区间中。

user: user-1
content: 纠正4楼： http://www.baidu.com/s?wd=ip%E8%8C%83%E5%9B%B4&rsv_spt=1&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_pq=d22ecd6500002e1f&rsv_t=af54fIEJgGadhBkEv6PoOjoEMk6loBM9R6kBI3qRYTvbTV6v23zmi673cPiWFwu3VGlR&inputT=51134&rsv_sug1=24

user: user-1
content: http://www.baidu.com/s?wd=ip%E8%8C%83%E5%9B%B4&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&bs=hash_map

user: user-1
content: http://www.baidu.com/s?wd=hash_map&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg

user: user-0
content: 不好意思。刚刚学C语言不久。能详细点说下吗？

user: user-1
content: 使用map 判断区间用unsigned __int64;
user-0 提问: C语言错哪了？照着书敲的。求x1*x1+x1*x2

回复:
user: user-1
content: 实在不想将.cpp后缀改为.c的话： #include<stdio.h> double f1(double x) {  return x*x; } double f2(double x,double y) {  return x*y; } double fun(double a,double b) {  double (*f)();  double r1,r2;  f=(double (*)())f1;  r1=(*(double (*)(double))f)(a);  f=(double (*)())f2;  r2=(*(double (*)(double,double))f)(a,b);  return r1+r2; } void main() {  double x1,x2,r;  printf("请输入x1x2:");  scanf("%lf%lf",&x1,&x2);  r=fun(x1,x2);  printf("x1=%.2f,x2=%.2f,x1*x1+x1*x2=%.2f\n",x1,x2,r); }

user: user-1
content: 既然是C语言而不是C ，请楼主将你的源代码文件名后缀由.cpp改为.c

user: user-0
content: 把Vc扔了 换一个就好了，  估计刚刚建立错了

user: user-2
content: 把书扔掉，换一本！
user-0 提问: 《数据恢复技术深度揭秘》

回复:
user: user-0
content: 这个是帮助你学习磁盘格式 MBR DBR NTFS header等知识

user: user-1
content: 下完才看到二楼。有分就是任性。

user: user-2
content: 我只会用“EasyRecovery Professional”软件。

user: user-3
content: 下你这资源，30分就没了，我也贴个不要分的给资源分不够的同学们用   数据恢复技术深度揭秘   中文名: 数据恢复技术深度揭秘 作者: 图书 分类: 网络 资源格式: PDF 版本: 扫描版 出版社: 电子工业出版社 书号: 9787121106637 发行时间: 2010年5月21日 地区:  语言:  简介:    - 内容介绍：  　　本书是中国电子信息产业发展研究院培训中心数据恢复技术培训指定教材，是从逻辑类和物理类两个方面全面讲解数据恢复技术的专业书籍。 　　 在逻辑类数据恢复方面，本书包括mbr磁盘分区、动态磁盘分区、gpt磁盘分区、solaris分区、apm分区、bsd分区的恢复技术，windows平台的fat32、fatl6、ntfs、exfat文件系统的恢复技术，unix平台的ufs文件系统恢复技术，apple平台的hfs+文件系统恢复技术，linux平台的ext3、ext4文件系统恢复技术，以及windows、unix、apple、linux平台的raid-0、raid-1、raid-5、raid-5ee、raid-6、hp双循环等磁盘阵列恢复技术。 　　 在物理类数据恢复方面，本书包括各大品牌硬盘出现电路故障、磁头故障、电机故障、扇区读取故障、固件故障后数据恢复的方法及优盘无法识别的恢复方法。 　　 如果您是数据恢复技术的初学者，本书可以由浅入深，一步步将您引入数据恢复技术的神秘殿堂；如果您已经是数据恢复技术的高手，本书同样可以带来令您惊喜的经验和技巧。

user: user-3
content: lz是来这发广告赚资源分的？

user: user-0
content: 你这个不是高清，58M,  我的130多M
user-0 提问: opencv的widthstep问题

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

回复:
user: user-1
content: 引用 3 楼 misskissC 的回复:这语句“ for(ch='$' , ch!='g';scanf("%c",&ch))  ”会输出“输出：abcd” Are you 确定？  被我改了...

user: user-2
content: GCC:

user: user-1
content: 这语句“ for(ch='$';ch!='g';scanf("%c",&ch))  ”会输出“输出：abcd” Are you 确定？

user: user-2
content: vs2013:

user: user-3
content: for语句可以这样用？
user-0 提问: C语言：求高手解决这道题的时间问题

回复:
user: user-1
content: Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-2
content: 计算时间是不是应该建立在一个什么样的硬件配置和软件环境里。这样单纯的要求执行时间，未免有歧义。

user: user-3
content: 上面的代码忘记释放num那个数组本身了，请在main函数return之前加上 free(num);

user: user-3
content: 在屏幕上输出10000以内不太现实吧。。计算可以在1s以内，输出差不多要一二十秒 比如下面的程序输出到Console，计算花了0.4s，输出花了23s   如果是输出到文件那还可以，以下是将输出定向到文件的结果   简单写了一下，基本没有考虑异常，不过一般这种题目重点也不在异常处理上吧 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h>  typedef struct _comb { 	int a; 	int b; 	struct _comb *next; } Comb; // 这个函数计算出小于等于n的素数，注意没有包括第一个素数2因为不需要它 void find_primes(int *arr, int n) { 	int i, j, m, s, r; 	 	arr[0] = 3; 	for (i = 5, m = 1; i <= n; i += 2) { 		s = (int)sqrt(i); 		for (j = 0, r = 1; arr[j] <= s && (r = i % arr[j]); j++); 		if (r) { 			arr[m++] = i; 		} 	} } // 这个函数会将任意两个素数组合，如果能组成一个偶数就记录下来，注意num数组的每一个元素都是一个单链表 void find_combs(int *primes, Comb **num, int n) { 	int i, j, m; 	Comb *comb; 	 	for (i = 0; primes[i] < n; i++) { 		for (j = i; (m = primes[i] + primes[j]) <= n; j++) { 			if (!(m & 1)) { 				if (!(comb = num[m >> 1])) { 					comb = (Comb *)malloc(sizeof(Comb)); 					comb->a = primes[i]; 					comb->b = primes[j]; 					comb->next = NULL; 					num[m >> 1] = comb; 				} else { 					while (comb->next) { 						comb = comb->next; 					} 					comb->next = (Comb *)malloc(sizeof(Comb)); 					comb = comb->next; 					comb->a = primes[i]; 					comb->b = primes[j]; 					comb->next = NULL; 				} 			} 		} 	} } // 这个函数输出结果，并且释放堆内存 void print_combs(Comb **num, int n) { 	int i, m; 	Comb *comb, *next; 	 	printf("4=2+2\n"); 	for (i = 3, m = n >> 1; i <= m; i++) { 		comb = num[i]; 		while (comb->next) { 			next = comb->next; 			printf("%d=%d+%d\n", comb->a + comb->b, comb->a, comb->b); 			free(comb); 			comb = next; 		} 		printf("%d=%d+%d\n", comb->a + comb->b, comb->a, comb->b); 		free(comb); 	} }  int main() { 	int primes[1228], n;  //10000以内有1229个素数，因为不需要2所以只用1228个 	Comb **num; 	clock_t start, calc_finish, end; 	 	printf("Enter n:\n"); 	scanf("%d", &n); 	start = clock(); 	 	find_primes(primes, 10000);  // 实际上不需要每次都把10000以内所有素数算出来，但是这个几乎不耗什么时间所以无所谓 	// num[i] 代表数2(i + 3)的所有表示方法，比如num[0]记录6的表示方法，num[1]记录8的表示方法 	// 之所以这样因为1.不需要记录奇数2.小于6的也不需要记录(至于4=2+2因为不管什么输入都要输出这个所以也不用记录) 	num = (Comb **)calloc((n - 4) / 2, sizeof(Comb *)); 	find_combs(primes, num - 3, n); 	calc_finish = clock(); 	 	print_combs(num - 3, n); 	end = clock(); 	 	printf("\nCalculation time: %dms\n", 				(calc_finish - start) * 1000 / CLOCKS_PER_SEC);  	printf("\nTotal running time: %dms\n", 				(end - start) * 1000 / CLOCKS_PER_SEC); 	return 0; }
user-0 提问: c语言学生管理系统

回复:
user: user-1
content: 一本比较好的C语言书可以解决你的问题，比如C primer plus

user: user-1
content: 1、学习如何调用函数 2、学习如何构造程序逻辑：比如顺序结构、分支结构 3、学习结构体

user: user-0
content: 额，刚看了一下结构体，实在是不怎么懂，但实验还是得尝试着做。老师要求高直接就是工程，我c语言也是在自学过程中。。。。。

user: user-2
content: 你函数都没调用，结构体对象也没啊
user-0 提问: 对指针初始化的动态分配问题

回复:
user: user-1
content: 有兴趣可以自己封装一个函数，实现根据输入字符串长度，自动扩展空间大小，保证其不越界~C++，java这些也不过是已经封装好了类及其方法，你直接用就好了。

user: user-1
content: 引用 7 楼 onlycaocao 的回复:手动输入n的值也不算特别自动吧，如果要输入的字符串很长，不知道n的值怎么办 取名动态分配而不是自动分配，还是有讲究的，这意味着该变量所指向的空间大小可以动态地改变，而不是说该变量指向的空间根据变量长度自动扩展。字符串很长，不是还有realloc()么。很多自动的含义都是针对用户说的，对于开发者来说，还是要自己去实现一个逻辑

user: user-2
content: int n = 10; char str[n]; //error char *a=malloc(sizeof(char) * n); //ok  这就是动态分配

user: user-3
content: 引用 11 楼 onlycaocao 的回复:[quote=引用 9 楼 Evankaka 的回复:] 那就上vector...这个就能满足你的要求了，不够它自己会扩大空间   这个是Java里的吧。。我用的c。我看到有个方法是自己写一个类似getstring的函数，里面增加空间是一个一个增加，用的realloc。[/quote] Java里有，C/C++里也有啊，在STL中，还有list,deque,map,set,,,这些都是STL中的，你可以百度下

user: user-0
content: 引用 9 楼 Evankaka 的回复:那就上vector...这个就能满足你的要求了，不够它自己会扩大空间   这个是Java里的吧。。我用的c。我看到有个方法是自己写一个类似getstring的函数，里面增加空间是一个一个增加，用的realloc。

user: user-3
content: 那就上vector...这个就能满足你的要求了，不够它自己会扩大空间

user: user-0
content: 引用 4 楼 Evankaka 的回复:手动输入1000这种数字。。谁叫你一定要输入1000个字了。。？ 你可以定义一个int. n来输入你要的数组的大小 。。 然后再char *a=（char *）malloc(sizeof(char)*n);//这样才叫动态。。你要多大给多大，点儿都不浪费   手动输入n的值也不算特别自动吧，如果要输入的字符串很长，不知道n的值怎么办

user: user-0
content: 引用 2 楼 kino_chen 的回复:一般来说，动态分配就是指用了mallco等函数分配内存。动态分配还是要指定大小的，并不会根据你的输入长度给你申请合适的内存大小。换个角度方便你理解：如果你定义的是数组如char a[100]，那么它就是100个字节大小，再不会变了，无论你怎么操作，这是静态。但是你用malloc，比如以下的方式scanf("%d",&len);malloc(sizeof(char) * len);你输入几，系统就给你分配多少内存，这就是动态。  手动输入n的值也不算特别自动吧，如果要输入的字符串很长，不知道n的值怎么办

user: user-0
content: @kino_chen 是不是这样回复的。。。。 手动输入n的值也不算特别自动吧，如果要输入的字符串很长，不知道n的值怎么办

user: user-4
content: 存十多个字符本身就是毛病。你只有1个字节。

user: user-3
content: 手动输入1000这种数字。。谁叫你一定要输入1000个字了。。？ 你可以定义一个int. n来输入你要的数组的大小 。。 然后再char *a=（char *）malloc(sizeof(char)*n);//这样才叫动态。。你要多大给多大，点儿都不浪费

user: user-3
content: char *a=（char *）malloc(sizeof(char));.这样写好一点

user: user-1
content: 一般来说，动态分配就是指用了mallco等函数分配内存。动态分配还是要指定大小的，并不会根据你的输入长度给你申请合适的内存大小。换个角度方便你理解：如果你定义的是数组如char a[100]，那么它就是100个字节大小，再不会变了，无论你怎么操作，这是静态。但是你用malloc，比如以下的方式scanf("%d",&len);malloc(sizeof(char) * len);你输入几，系统就给你分配多少内存，这就是动态。

user: user-5
content: 记住就行了，这样就叫动态分配
user-0 提问: 结构体空指针的问题（高手进）

回复:
user: user-1
content: 用于得到成员在结构内的偏移量。 有些C的实现允许在->运算符左边使用NULL指针。对结果采用地址运算符&和将这个结果转换成整数类型可以得到结果成员的偏移量（以字节计）。标准没有提到这种做法，没有允许也没有禁止，但显然是可行的： #define OFFSETOF (type,field) ((size_t) & ((type *) 0) -> field)

user: user-2
content: #define offsetof(type, field)	((long) &((type *)0)->field)  这个是计算type结构中，field成员偏移大小。  CatCTup    *ct = (CatCTup *) (((char *) tuple) -  offsetof(CatCTup, tuple));  这句是从CatCTup结构中tuple成员地址获取tuple所在结构的首地址。tuple地址减去它的偏移大小就是结构的首地址。  这种用法在Linux内核列表的实现中就有用到，你可以去研究一下。
user-0 提问: c语言中与（&）的问题（高手进）

回复:
user: user-1
content: hash函数， sz为2的幂级数，如2，8，16这些，减1后二进制看就是全1，得到一个位置。

user: user-2
content: (Index) ((h) & ((sz) - 1))) ((h) & ((sz) - 1))的结果强制转换i为index类型
user-0 提问: 求助C语言popen问题，一直返回为空

回复:
user: user-1
content: 加上ping就行了 FILE *pipe=popen("ping www.baidu.com","r");

user: user-2
content: 仅供参考  #include <stdio.h>    #include <netdb.h>    #include <stdlib.h>    #include <arpa/inet.h>  int main(int argc, char *argv[]){    	 	struct addrinfo * res, *pt;    	struct sockaddr_in *sinp;    	const char *addr;    	char abuf[INET_ADDRSTRLEN];    	int succ=0,i=0;     	if(argc == 1)    	{    		printf("USAGE: getip <server name>\nFor example:\n    getip www.google.com\n");    		exit(1);    	}     	succ = getaddrinfo(argv[1], NULL, NULL, &res);    	if(succ != 0)    	{    		printf("Can't get address info! error code = %d", succ);    		exit(succ);    	}     	for(pt=res, i=0; pt != NULL; pt=pt->ai_next, i++){    		sinp = (struct sockaddr_in *)pt->ai_addr;    		addr = (const char *)inet_ntop(AF_INET, &sinp->sin_addr, abuf, INET_ADDRSTRLEN);    		printf("%2d. IP=%s\n", i, addr);    	}    }

user: user-3
content: 这哪跟哪啊。。。popen干嘛的先？

user: user-4
content: popen是管道操作，跟www.baidu.com有半毛钱关系。 要获取ip得用到网络的函数，跟域名解析有关，好好baidu一下，或者参考下ping的代码 楼主请不要再任性个四小时了。
user-0 提问: c程序为什么会报错，求解

回复:
user: user-1
content: pArr->pBase[pArr->cnt] = val;//这行为什么会报错？这一行，首先从语法上就不对，看一下pBase是什么类型，而val是什么类型。类型不匹配而去赋值，至少会给提警告。

user: user-2
content: pArr->pBase[pArr->cnt] = val;//这行为什么会报错？ pArr->pBase[pArr->cnt] //这个指向的是结构变量 ((pArr->pBase)[pArr->cnt])->cnt = val;

user: user-3
content: 你的pArr->pBase是一个指向struct  Arr的指针，又不是一个指针数组。显然你的val是整形。怎么能赋值。   typedef struct _st_arr tArr;    struct _st_arr   {         int* element;         int  len;         int  cnt;   };  //或者     struct _st_arr  {        void** element;        int    len;       int    cnt;  };

user: user-4
content: C语言里面没有bool关键字，可以改成int试一试，把true、false改成0、1。

user: user-5
content: pArr->pBase[pArr->cnt] 这句本来就有问题吧？？ pArr->pBase = null；都没错！

user: user-5
content: 引用 楼主 xia_xiao_xiao 的回复:# include <stdio.h> # include <stdlib.h>//包含exit函数 # include <malloc.h>  struct Arr { 	struct Arr * pBase;//动态数组 	int len;//数组的大小 	int cnt;//数组有效的元素 };  bool is_full_arr (struct Arr * pArr);//判断数组是否为满 bool is_empty_arr (struct Arr * pArr);//判断数组是否为空 void init_arr (struct Arr * pArr, int user_array_length);//初始化 bool show_arr (struct Arr * pArr);//显示数组中的内容 bool append_arr (struct Arr * pArr, int val);//添加   int main (void) { 	struct Arr arr; //	int val; 	int user_array_length;//定义用户键入变量  	printf ("请输入要分配素组的大小：");//提示 	scanf ("%d", &user_array_length);//输入分配的大小 	init_arr (&arr, user_array_length);//调用初始化函数 	 	show_arr (&arr);//显示数组中的内容  	append_arr (&arr,4);//添加  	show_arr (&arr);//显示数组中的内容  	  	return 0; }  bool is_full_arr (struct Arr * pArr)//判断数组是否为满 { 	if (pArr->len == pArr->cnt ) 	{ 		return true; 	} 	else 	{ 		return false; 	} }  bool is_empty_arr (struct Arr * pArr)//判断数组数组为空 { 	if (0 == pArr->cnt) 	{ 		return true; 	} 	else 	{ 		return false; 	} }  void init_arr (struct Arr * pArr, int user_array_length)//初始化 { 	pArr->pBase = (struct Arr *)malloc(sizeof(struct Arr) * user_array_length); /*	注意：pArr一定要指向pBase,类型是sruct Arr类型*/ 	if (NULL == pArr) 	{ 		printf ("数组分配失败！\n"); 	} 	else 	{ 		pArr->len = user_array_length; 		pArr->cnt = 0; 		printf ("数组分配成功！\n"); 		printf ("初始化成功！\n"); 	} 	return; }  bool show_arr (struct Arr * pArr)//显示数组中的内容 { 	if ( is_empty_arr(pArr) ) 	{ 		printf ("数组没有内容可显示！\n"); 		return false; 	} 	else 	{ 		int i; 		for (i=0; i<pArr->len; i++) 		{ 			printf ("%d", pArr->pBase[i]); 		} 		return true; 	} }  bool append_arr (struct Arr * pArr, int val)//添加 { 	if ( is_full_arr(pArr) ) 	{ 		printf ("数组满了，添加失败！\n"); 		return false; 	} //		int user_figure; //		printf ("数组还有空间，请输入要添加的数值："); //		scanf ("%d", &user_figure); 		pArr->pBase[pArr->cnt] = val;//这行为什么会报错？ 		(pArr->cnt)++; 		return true; }  求解释啊  你这是将一个链表的下一个节点等于一个整形数字，这就好比别人问你家在哪？你说在13那。你说能对吗？

user: user-6
content: 楼主是不是定义的结构有问题啊 pbase里面的struct arr类型元素 可以直接printf出来吗？ C++里面这种类似的操作好像要重载<<操作符。

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

user: user-0
content: 不是这个原因，c里面有bool关键字的，报错的是113行
user-0 提问: 这个程序我是想从大到小输入数字到数组里面的，然后再用折半查找法来查询，但不知道哪里出错了，请大神详细指点一下，谢谢

回复:
user: user-0
content: 哪里是从小到大查询  不明白

user: user-1
content: 输入从大到小，查找又是按从小到大的？
user-0 提问: 直接写不行, 定义一个临时变量就可以了, 是什么情况

回复:
user: user-1
content: 引用 10 楼 zhao4zhong1 的回复:intel CPU在宽变量未Align时，仍可以操作，只是效率略低。 arm CPU在宽变量未Align时，报错。 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  《The Intel 64 and IA-32 Architectures Software Developer's Manual》 对应这个手册arm也有类似手册。  CPU特性是计算机软件的重要基础知识之一。

user: user-2
content: 格式一定呀正确

user: user-3
content: 对齐的问题...

user: user-4
content: 引用 11 楼 ma100 的回复:  #include <iostream>    using namespace std; #define __int64 long long #pragma pack (  1 ) struct A_STRUCT //  {  	bool bOffsetON[6]; 	__int64 StartF[6]; }x;   template <typename T > T CalculGP ( const T &x1  ) { 	 return x1;  }  int main() { 	x.StartF[0] = 100; 	  	cout << CalculGP ( x.StartF[0] ) << endl; //输出1677721600  	return 0; }  	   我只是觉得有点奇怪 pack(1)了后面不用pack()取消掉后面的字节对齐状态。 另外你确定你模板没写<x>会编译通过么……我觉得一般来说编译器不会出这种错误吧……

user: user-0
content: arm编译器， 应该是字节对齐错了 把 template <typename T > T CalculGP ( const T &x1  ) {      return x1;  }  改为普通函数也错 ------------------------------------------------------------------ 这属于编译器的缺陷还是arm的缺陷还是程序的呢？

user: user-5
content: 引用 11 楼 ma100 的回复:  #include <iostream>    using namespace std; #define __int64 long long #pragma pack (  1 ) struct A_STRUCT //  {  	bool bOffsetON[6]; 	__int64 StartF[6]; }x;   template <typename T > T CalculGP ( const T &x1  ) { 	 return x1;  }  int main() { 	x.StartF[0] = 100; 	  	cout << CalculGP ( x.StartF[0] ) << endl; //输出1677721600  	return 0; }  	   啥编译器啊，这么牛叉？我试了几个都是输出的 100。

user: user-5
content: 把代码上全了，中间的 ... 都干啥了。

user: user-6
content: 引用 7 楼 ma100 的回复:[quote=引用 5 楼 mujiok2003 的回复:] 在call之前data的值是否一致?  怎么看是否一致?  有初始化和赋值, ...省略了[/quote] 调试或加log

user: user-0
content: 引用 5 楼 mujiok2003 的回复:在call之前data的值是否一致?  怎么看是否一致?  有初始化和赋值, ...省略了

user: user-7
content: 上告警信息吧！

user: user-6
content: 在call之前data的值是否一致?

user: user-8
content: 1、调试看看具体是什么问题 2、把data换成全局变量试试看  引用 楼主 ma100 的回复:在一段代码中  { __int64 data; ... ;  fun (  data ); //作为参数传入  函数执行失败  改为 __int64 data; ... ; __int64 t = data;  fun (  t ); //执行成功 }   这种情况是不是栈空间不够用了? (在pc上成功, 在arm上失败的)

user: user-6
content: “函数执行失败”是几个意思？

user: user-9
content: 看不出栈不够用。

user: user-10
content: data没有初始化。。pc上编译器和arm处理未初始化的变量机制不同吧

user: user-11
content: 应该是Data为初始化

user: user-0
content: #include <iostream>    using namespace std; #define __int64 long long #pragma pack (  1 ) struct A_STRUCT //  {  	bool bOffsetON[6]; 	__int64 StartF[6]; }x;   template <typename T > T CalculGP ( const T &x1  ) { 	 return x1;  }  int main() { 	x.StartF[0] = 100; 	  	cout << CalculGP ( x.StartF[0] ) << endl; //输出1677721600  	return 0; }

user: user-1
content: intel CPU在宽变量未Align时，仍可以操作，只是效率略低。 arm CPU在宽变量未Align时，报错。
user-0 提问: C语言文本文件操作问题  

回复:
user: user-0
content: 就第一行的“301101”来说 这是6个字符 在机器的内存里就是48个BIT  难道在输出到屏幕的时候 %ld格式读取了这48个BIT然后 得出值301101 然后将它输出到屏幕？

user: user-1
content: 你处理的文本文件里面就是文本字符，读到流里面也是文本字符，只是你读入的时候将这些文本字符进行了格式化

user: user-2
content: fscanf就是按字符处理的。

user: user-0
content: 不明白你指的“这里”是哪里，详细一点说明下咯

user: user-1
content: 你这里就是字符啊，只是说数字字符被你格式化输入了而已
user-0 提问: 热烈庆祝本人受关注人数即将突破7000大关！散分！！＋“代码修改自身”例子

回复:
user: user-1
content: 修改自身也是打补丁的一个好手段啊！

user: user-2

user: user-3
content: 马上六一儿童节了，是不是除了关注以外，顺带给个六一儿童节的慰问啊，好让我们这群大宅男开心

user: user-3
content: 赵老师，我也要接分，关注你多时了

user: user-4
content: 哈哈，来论坛看过楼主几次，膜拜一下，顺便关注一下。

user: user-5
content: 嗯，关于赵老师你问的那个问题，说实话我也不懂。抱歉，不能给你一个答案。

user: user-5
content: 都快过年了赵老师依旧为自己喜欢的东西去努力，赵老师真的是太认真、太努力了。在问一下赵老师，为什么有些人总是喜欢骂你呢？我感觉赵老师您做人挺热心的呀？

user: user-6
content: 赵老师要普天同庆啊

user: user-7
content: 糊里糊涂的进来 糊里糊涂的 走  已关注

user: user-8
content: 拜访下赵老师

user: user-9
content: nice，欢欢喜喜过大年！

user: user-10
content: 恭喜恭喜，小白前来道贺

user: user-11
content: 虽然不是前排，但不耽误围观赵老师  不明而觉厉

user: user-12
content: 吊炸天。。。膜拜一下，不知道老师对阅读源代码有何建议吗？我打算将一部分源代码抽出来进行编译。。。

user: user-13
content: 厉害，赵老师

user: user-14

user: user-15
content: 哈哈，来论坛看过楼主几次，膜拜一下，顺便关注一下。

user: user-16
content: 接分，接分，接赵老师的分。

user: user-17
content: 300分全给我，我顶你

user: user-0
content: 引用 33 楼 u010399796 的回复:我是来看29楼的.. 那我给不给分呢？
user-0 提问: 【求教】一个关于头文件的问题

回复:
user: user-0
content: 引用 4 楼 jinling4388 的回复:这个一般都没什么特定的含义，但是一般都是有意义的单词组合起来的，有时会加上时间等产生的随机数  恩呢 懂了 谢赐教，嘿嘿

user: user-0
content: 引用 3 楼 a30037338 的回复:[quote=引用 2 楼 xinwei1295 的回复:] [quote=引用 1 楼 a30037338 的回复:] 这个就是一般的防止头文件钻石包含的语法啊 正常我们这么写 #ifndef    XXX_H_ #define XXX_H_  #endif 这里括号里的一大串就是一个宏， 开始判断如果这个宏没定义， 那么就定义这个宏  也就是这个宏并没有什么特殊的含义是吧？[/quote] 是的[/quote]  哦了 懂了  万分感谢

user: user-1
content: 这个一般都没什么特定的含义，但是一般都是有意义的单词组合起来的，有时会加上时间等产生的随机数

user: user-2
content: 引用 2 楼 xinwei1295 的回复:[quote=引用 1 楼 a30037338 的回复:] 这个就是一般的防止头文件钻石包含的语法啊 正常我们这么写 #ifndef    XXX_H_ #define XXX_H_  #endif 这里括号里的一大串就是一个宏， 开始判断如果这个宏没定义， 那么就定义这个宏  也就是这个宏并没有什么特殊的含义是吧？[/quote] 是的

user: user-0
content: 引用 1 楼 a30037338 的回复:这个就是一般的防止头文件钻石包含的语法啊 正常我们这么写 #ifndef    XXX_H_ #define XXX_H_  #endif 这里括号里的一大串就是一个宏， 开始判断如果这个宏没定义， 那么就定义这个宏  也就是这个宏并没有什么特殊的含义是吧？

user: user-2
content: 这个就是一般的防止头文件钻石包含的语法啊 正常我们这么写 #ifndef    XXX_H_ #define XXX_H_  #endif 这里括号里的一大串就是一个宏， 开始判断如果这个宏没定义， 那么就定义这个宏
user-0 提问: 为什么有人说我这个程序是输入从大到小，查找又是按从小到大的？....我不明白查找还分从小到大，，，小弟理解能力不行，就知道这是折半查找法，还有这程序输出结果错误

回复:
user: user-1
content: 引用 楼主 qq2060792279 的回复:#include <stdio.h> #define N 5 void main() {int a[N],i,num,flag=1,bot,end,mid,loc,sign; char c; printf("请从大到小输入N个数:"); scanf("%d",&a[0]); i=1; while(i<N) {scanf("%d",&a[i]); if(a[i]<=a[i-1])    i++; else printf("输入错误,请重新输入：");} while(flag) {printf("请输入要查找的数:"); scanf("%d",&num); if(num>a[0]||num<a[N-1])                         求大神详细告诉我我这个程序怎么个从小到大查找的，，，，，，谢谢 loc=-1; bot=0; end=N-1; sign=0; while((!sign)&&(bot<=end)) {mid=(bot+end)/2; if(num==a[mid]) {loc=mid; printf("%d是第%d个数\n",num,loc+1); sign=1;} else if(num<a[mid]) end=mid-1; else bot=mid+1;} if(loc==-1||!sign) printf("此数不在范围内.\n"); printf("是否继续查找?(Y/N):"); getchar(); scanf("%c",&c); if(c=='N'||c=='n') flag=0;} }  这不是很明显吗？ 从大到小输入N个数那么最小的数是不是num【n-1】里的数？？  你这个查找算法有问题吧，而且是大问题。效率太低了

user: user-2
content: 我好像之前回过这个贴子 举个例子 [ 6，5，4，3，2，1，0]， bot=0,end=6,mid=3,如果num==5,你回答一下bot和end分别应该是多少？
user-0 提问: apue  第一章 程序1-5

回复:
user: user-1
content: (pid = fork() < 0)谁是这么写的

user: user-0
content: 引用 2 楼 user-2 的回复:((pid=fork())<0)

user: user-2
content: ((pid=fork())<0)

user: user-0
content: #include "ourhdr.h"  int main() { 	char buf[MAXLINE]; 	pid_t pid; 	int status;  	printf("%% ");  	while(fgets(buf,MAXLINE,stdin) != NULL) 	{ 		buf[strlen(buf) -1] = 0; 	 		printf("buf = [%s]\n", buf); 		if(pid = fork() < 0) 			err_sys("fork error"); 		else if(pid == 0) 		{ 			execlp(buf, buf, NULL); 			err_sys("couldn't execute: %s pid = [%d]", buf,getpid()); 			exit(127); 		}else if(pid > 0){  			printf("parent pid = [%d]\n", getpid()); 			if( (pid = waitpid(pid, &status,0)) <0) 				err_sys("waitpid error"); 			printf("%% "); 		 		 		}  	} 	exit(0); }   代码重贴
user-0 提问: 自学C语言求助

回复:
user: user-1
content: 直接学习编译原理  和 计算机组成原理

user: user-2
content: 最简单的办法，去某个新华书店，买一本全国二级C语言过级的书去，那个也是从最初级的讲起的，要钱还少。

user: user-3
content: 引用 12 楼 zhao4zhong1 的回复:[quote=引用 11 楼 puxinping 的回复:] 这么牛逼的问题没有我的偶像赵老师真是美中不足。 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm [/quote] 直接看文档不太好，还是建议先去看视频教程，再看c prime之类进阶的书

user: user-4
content: 引用 19 楼 sholber 的回复:[quote=引用 12 楼 zhao4zhong1 的回复:] [quote=引用 11 楼 puxinping 的回复:] 这么牛逼的问题没有我的偶像赵老师真是美中不足。 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm [/quote]  某学生：第一次玩计算机，WINDOWS 7不会用，请问有什么好推荐？ 赵老湿：请买一台80386，然后安装MS-DOS 3.3 某学生：……[/quote] zhao4zhong1：请买一把电烙铁，然后……

user: user-4
content: 引用 20 楼 sholber 的回复:[quote=引用 12 楼 zhao4zhong1 的回复:] [quote=引用 11 楼 puxinping 的回复:] 这么牛逼的问题没有我的偶像赵老师真是美中不足。 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm [/quote]  路人甲：赵老板，有草纸吗？ 赵老湿：木有草纸，有上好的砂纸要不要？[/quote] zhao4zhong1：有正品粘蝇纸要不要？

user: user-5
content: C和指针。这本书我觉得真心不错。

user: user-6
content: 我推荐一个fenby的视频网站吧... 看书之前看看这个网站的视频我觉得应该会有点帮助

user: user-7
content: 《C primer plus》严重推荐啊

user: user-8
content: 引用 12 楼 zhao4zhong1 的回复:[quote=引用 11 楼 puxinping 的回复:] 这么牛逼的问题没有我的偶像赵老师真是美中不足。 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm [/quote]  路人甲：赵老板，有草纸吗？ 赵老湿：木有草纸，有上好的砂纸要不要？

user: user-8
content: 引用 12 楼 zhao4zhong1 的回复:[quote=引用 11 楼 puxinping 的回复:] 这么牛逼的问题没有我的偶像赵老师真是美中不足。 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm [/quote]  某学生：第一次玩计算机，WINDOWS 7不会用，请问有什么好推荐？ 赵老湿：请买一台80386，然后安装MS-DOS 3.3 某学生：……

user: user-9
content: 找本好书，比如上面说的C primer plus 另外，主要的是多动手练习，多敲代码

user: user-10
content: 引用 14 楼 zsl_2014 的回复:1.谭浩强的《C程序设计》最基础了 2.《C primer plus》 谭浩强那本是坑代码不规范还一堆错,建议还是C primer plus

user: user-11
content: 谭浩强的也行，英语的话就是C primer plus了，还是得多敲代码才行

user: user-12
content: C primer plus

user: user-13
content: 1.谭浩强的《C程序设计》最基础了 2.《C primer plus》

user: user-14
content: C primer plus

user: user-4
content: 引用 11 楼 puxinping 的回复:这么牛逼的问题没有我的偶像赵老师真是美中不足。 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

user: user-15
content: 这么牛逼的问题没有我的偶像赵老师真是美中不足。

user: user-16
content: 谭浩强的最基础了

user: user-8
content: 是进来看赵老师回复的
user-0 提问: 求高手帮忙指导指导 分析下我这个程序实现的难度

回复:
user: user-1
content: 如果不要求很细的话，考虑用下libcurl，如果我没记错一次HTTP请求libcurl的API会将其阻塞直到超时或者数据返回（也就是同步），记录下请求时间和回调返回时间就好了。

user: user-2
content: 或者参考Linux源代码中相关片断。

user: user-2
content: 先学会使用抓包软件比如wireshark 然后搜winpcap相关例子代码。
user-0 提问: 为什么字符移位解密文件后，文件的内容后面会多出一个问号（急求解答）

回复:
user: user-1
content: 循环次数多啦！ 1. ch 的类型应该是int而不是char 2. 用 fgetc 返回值判断是否EOF，不要用feof  #include<stdio.h> #include<stdlib.h>  //1.txt加密以后保存到1jia.txt,解密以后保存到1jie.txt void jia() { 	int ch; 	FILE *pfr;//读取1.txt 	FILE *pfw;//写入1jia.txt 	char pathr[100]="1.txt"; 	char pathw[100]="1jia.txt";  	pfr=fopen(pathr,"rb");//用读的模式打开被加密的文件 	pfw=fopen(pathw,"wb");//用写的模式打开要写入加密的文件 	if (pfr==NULL || pfw==NULL) 	{ 		printf("文件故障,加密失败"); 		return; 	} 	while ((ch=fgetc(pfr)) != EOF)//一直读到要加密的文本的末尾 	{ 		ch=ch+1;//字符移位加密 		fputc(ch,pfw);//写入文本 	} 	fclose(pfw); 	fclose(pfr); }  void jie() { 	int ch; 	FILE *pfr;//读取1jia.txt 	FILE *pfw;//写入1jie.txt 	char pathr[100]="1jia.txt"; 	char pathw[100]="1jie.txt"; 	pfr=fopen(pathr,"rb");//用读的模式打开加密以后的文件 	pfw=fopen(pathw,"wb");//用写的模式打开要写入解密的文件 	if (pfr==NULL || pfw==NULL) 	{ 		printf("文件故障,解密失败"); 		return; 	} 	while ((ch=fgetc(pfr)) != EOF)//一直读到要解密的文本的末尾 	{ 		ch=ch-1;//字符移位解密 		fputc(ch,pfw);//写入文本 	} 	fclose(pfw); 	fclose(pfr); }  int main(void) {  	jia(); 	jie(); 	return 0; }

user: user-2
content: ？是-51 给最后一个元素赋值0

user: user-3
content: 是不是你解密最后解错了，最后出了不可打印字符。然后自动给你替换为 ？ 显示了

user: user-4
content: while (1)//一直读到要加密的文本的末尾 { char ch=fgetc(pfr);//读取文本 if( feof(pfr) ) break; ch=ch+1;//字符移位加密 fputc(ch,pfw);//写入文本 }

user: user-0
content: 用VS2013编译器就不会出现这个问题,这应该是VC6编译器的BUG吧?

user: user-5
content: 用十六进制编辑器看看问号是什么，一般是只有\r 没有\n 会出现问号

user: user-6
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-0 提问: 求指导  最近在学c语言，看什么书比较好

回复:
user: user-1
content: 看赵老师回复

user: user-0
content: 话说DOS命令还要学吗？感觉不是非常重要。。

user: user-0
content: 谢谢！对我帮助很大！！

user: user-2
content: 先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-0
content: 感觉自己c语言水平太低了。。有没有什么好书推荐一下

user: user-3
content: 计算机专业c语言掌握的应该差不多了吧， 数据结果算法可以搞一搞， 链表，二叉树，的增删改查，  栈， 队列的实现，  查找算法(二分法)， 排序算法(冒泡， 插入， 选择， 快速等)，  这些都搞完了， 就尝试搞些小项目练手， 看别人的开源代码， 都是可以的。
user-0 提问: 用C语言读取计算机cpu、硬盘等主要硬件信息并输出到文本文件、MS Word

回复:
user: user-1
content: PS：上面获取的CPU ID和硬盘ID是伪ID； CPU信息想要获取更详细的要内嵌汇编； 硬盘ID，可以考虑CWMI； 不过两种方法都比较麻烦。

user: user-1
content: LS的太偷懒了。。。。 这个是我写的批处理脚本，LZ可以自己移植到C上，难度不大。 @echo off&setlocal ENABLEDELAYEDEXPANSION set sig=0 for /f %%i in ('wmic DISKDRIVE get Caption') do ( set /a sig+=1 if !sig!==2 set pcid=%%i ) echo 硬盘 ID为	: %pcid%  set sig=0 for /f %%i in ('wmic cpu get ProcessorId') do ( set /a sig+=1 if !sig!==2 set pcid=%%i ) echo CPU ID为	: %pcid%  set sig=0 for /f %%i in ('wmic BASEBOARD get SerialNumber') do ( set /a sig+=1 if !sig!==2 set pcid=%%i ) echo 主板 ID为	: %pcid%  set sig=0 for /f %%i in ('wmic computersystem get caption') do ( set /a sig+=1 if !sig!==2 set pcid=%%i ) echo 计算机名为	: %pcid%  set sig=0 for /f %%i in ('wmic computersystem get name') do ( set /a sig+=1 if !sig!==2 set pcid=%%i ) echo 用户名为	: %pcid%  set sig=0 for /f %%i in ('wmic NICCONFIG where "index='1'" get ipaddress') do ( set /a sig+=1 if !sig!==2 set pcid=%%i ) echo IP地址为	: %pcid%  set sig=0 for /f %%i in ('wmic NICCONFIG where "index='1'" get macaddress') do ( set /a sig+=1 if !sig!==2 set pcid=%%i ) echo MAC地址为	: %pcid%  echo. pause

user: user-2
content: system("systeminfo >sysinfo.txt"); //然后读文件sysinfo.txt的内容。
user-0 提问: C语言结构体的问题。。oj上一直runtime error

回复:
user: user-1
content: 可以用STL中的multimap来做。。

user: user-2
content: 改成1000000 这么大的数组，直接栈溢出了 楼主的算法有问题，去网上搜索一下查找第N大的算法 这个用不用链表都没有影响
user-0 提问: “编写程序，将句中所有单词的顺序颠倒输出。” 这个是否可以递归实现？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> char inStr[80+1]; char outStrs[40+1][80+1]; int main() {	gets(inStr); 	int len = strlen(inStr); 	int wordNum = 0; 	int i, j = 0; 	for (i = 0; i < len; i++) 	{ 		if (inStr[i] == ' ')//按空格划分单词  		{ 			j = 0; 			wordNum++; 			continue; 		} 		outStrs[wordNum][j] = inStr[i]; 		j++;  	} 	for (i = wordNum; i > 0 ; i--) 	{ 		printf("%s ", outStrs[i]); 	} 	printf("%s\n", outStrs[0]);  	return 0; }

user: user-2
content: 可以递归,不过这种递归走了极端,是一种递归的误用

user: user-3
content: #include <stdio.h>  void funiction() { 	char ch=getchar(); 	if(ch!='\n')funiction(); 	printf("%c",ch); }  int main () { 	funiction(); 	return 0; }

user: user-4
content: 如果一句中有2000000个单词的话……  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-5
content: 楼上各种淫才。。。

user: user-6
content: void reverse( char* InP, char* OutP ) { 	if( InP==NULL || OutP==NULL ) return; 	char *p; 	p = strstr( InP, " " ); 	if( p==NULL ) 	{ 		strcat( OutP, InP ); 		return; 	} 	 	reverse( p+1, OutP ); 	strncat( OutP, InP, p-InP ); } void main() { 	char a[100]="afda affsdfa adfafaf"; 	char b[100]; 	reverse( a, b ); }

user: user-7
content: #include <stdio.h> #include <string.h>  void reverse (char* buf) {     char* p = strchr(buf, ' '); 	if (p) 	{ 		*p = 0; 		reverse(p+1); 	}     printf("%s ", buf); }  int main(){  	char buf[1000]; 	//scanf("%s", buf);	//用字符串直接模拟吧，就不输入了     strcpy(buf,"a b c d e f g h i j k l m n");//多个词的用例 	reverse(buf); 	printf("\r\n");  	strcpy(buf,"a");	//单个词的用例 	reverse(buf); 	printf("\r\n");  	return 0; }    output:  n m l k j i h g f e d c b a a Press any key to continue

user: user-8
content: void reverse(存放数据的数组地址，单词的个数，数组的下标)//小标从0开始 { if(单词的个数>1) reverse(数组地址，单词个数自减1，数组下标自加1)； printf(数组地址[数组下标]); }
user-0 提问: 遇到小麻烦：acos(1.0000)居然返回： -1.#IND00

回复:
user: user-1
content: 为啥？？、、、

user: user-0
content: 已解决，呵，原来是1.0000000000100100

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

user: user-3
content: 自变量超过了定义域
user-0 提问: 黑白棋小游戏--C语言学了半年

回复:
user: user-1
content: 引用 3 楼 u013163178 的回复:[quote=引用 2 楼 zxh707wk 的回复:] [quote=引用 1 楼 zhao4zhong1 的回复:] http://www.baidu.com/s?wd=%E9%BB%91%E7%99%BD%E6%A3%8B%E5%B0%8F%E6%B8%B8%E6%88%8F--C%E8%AF%AD%E8%A8%80&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg  正是有楼主这样连度娘都懒得用的衣食父母，本ID才有论坛积分赚啊！+1[/quote][/quote]

user: user-2
content: 引用 1 楼 zhao4zhong1 的回复:http://www.baidu.com/s?wd=%E9%BB%91%E7%99%BD%E6%A3%8B%E5%B0%8F%E6%B8%B8%E6%88%8F--C%E8%AF%AD%E8%A8%80&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg  正是有楼主这样连度娘都懒得用的衣食父母，本ID才有论坛积分赚啊！+1

user: user-3
content: http://www.baidu.com/s?wd=%E9%BB%91%E7%99%BD%E6%A3%8B%E5%B0%8F%E6%B8%B8%E6%88%8F--C%E8%AF%AD%E8%A8%80&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg  正是有楼主这样连度娘都懒得用的衣食父母，本ID才有论坛积分赚啊！

user: user-4
content: 引用 2 楼 zxh707wk 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] http://www.baidu.com/s?wd=%E9%BB%91%E7%99%BD%E6%A3%8B%E5%B0%8F%E6%B8%B8%E6%88%8F--C%E8%AF%AD%E8%A8%80&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg  正是有楼主这样连度娘都懒得用的衣食父母，本ID才有论坛积分赚啊！+1[/quote]