Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: unsigned char i=0x80;  	printf("0x%x\n", ~i>>3+1);//无符号16进制输出 	 char ci=0x80;  	

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）  先 http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  再参考 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c

user: user-2
content: 1) 移位操作优先级最低, 所以都是右移4位, 取反优先级最高, 最先做 2) 整形提升, uchar会提升到uint, 而char会提升到int, 所以0x80在uint中还是0x80, 而在int为0xffffff80, 它们取反的结果就不同了

user: user-3
content: 取反操作前，字符型数据会自动转成整形 即 i = 0x00000080 ~i 为 0xffffff7f ~i>>3+1 由于+号运算符优先级比>>位移运算符高，所以~i>>3+1等价于~i>>4，则得到0xfffffff7  ci变量也一样，先转换成整形，为0xffffff80(因为ci为有符号型字符变量，且符号位为1，转成整形时，高位补1) 之后同理
user-0 提问: unsigned char i=0x80;  	printf("0x%x\n", ~i>>3+1);//无符号16进制输出 	 char ci=0x80;  	

回复:
user: user-1
content: 小伙 你想说明什么呢？

user: user-2
content: 小伙 你想说明什么呢？
user-0 提问:  如何使用windows证书库中加载证书   给openssl  使用。   求指点啊

回复:
user: user-0
content: boost error_code 返回的 错误信息 是 https proxy request

user: user-0
content: 错误代码： 336027803        第一次使用openssl 开发坏境boost vs2013

user: user-1
content: 系统API有无检查返回值和错误值？
user-0 提问: C语言编程变量无故自动更改

回复:
user: user-1
content: 不是你说没有操作就没有操作的

user: user-2
content: 学会使用数据断点是楼主的当务之急。

user: user-3
content: 越界了，下写断点。

user: user-4
content: structEFCoord_t             earth                = {}; 定义变量时没有初始化，你打印时取到的值都是内存中的随机值，所以可能有变化，建议定义变量时初始化一下。 如 定义完变量后加上这句 memset（&earth，0，sizeof（structEFCoord_t  ））；应该就行了

user: user-5
content: 看不出, 不过earth是个自动变量, 可能是栈数组操作越界, 修改了它

user: user-6
content: i<=SECTION_NUM  下标是否越界了
user-0 提问: C语言菜鸟求助

回复:
user: user-1
content: 最后一个for循环有问题

user: user-2
content: void fun5() {     int n = 0;     scanf("%d", &n);          for (int i = 1; i <= 2* n - 1; i++) {         int t = i > n ? 2*n - i : i;                  for (int i1 = 1; i1 <= n - t; i1++) {             printf(" ");         }                  for (int i2  = 1; i2 <= 2 * t - 1; i2++) {             printf("*");         }         printf("\n");              } }

user: user-3
content: 高手都是这么晚也在玩程序的吗.?

user: user-0
content: 谢谢各位的帮助！

user: user-4
content: 最后一个for（）循环有问题吧！

user: user-5
content: 你好。 可以参看我的这篇博客。 http://blog.csdn.net/zidane_2014/article/details/39208855

user: user-6
content: 最后一个for循环的循环条件写掉了一个小于号。（再水一贴！）
user-0 提问: 如何读取一个文件中的字符串，然后删除它

回复:
user: user-1
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。

user: user-2
content: read file into list iterate on the list, post, remove item post succeeded write file from list

user: user-3
content: 修改文件都是比较复杂的.  最简单的处理办法, 就是读取到内存, 然后再删除掉不需要的, 再写回去.

user: user-4
content: 可以将文件的所有数据都读出来，然后删除指定的数据，再写回去
user-0 提问: 无法跳出函数体问题求教!~!

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

user: user-2
content: void main() {     int n;     menu();     scanf("%d", &n);     while(n)  //循环内部没有提供重新输入n的机会, 一但你第一次输入了一个大于0的数, n就永远为非0, 就死循环了.     {         switch(n)         {         case 0: exit(0);          case 1: in(); break;             //    case 2: search(); break;             //    case 3: del(); break;             //    case 4: modify(); break;             //    case 5: insert(); break;             //    case 6: order(); break;             //    case 7: total(); break;             //    case 8: show(); break;         default : break;         }     }     getch();     menu();     scanf("%d", &n); }

user: user-3
content: 可以考虑使用goto语句

user: user-4
content: 楼上正解。 你的break只是跳出switch。 但是while一直循环。 所以就会出错。

user: user-5
content: 不是无法跳出，是跳出后又进入了in()函数。在你的主函数里一直在while
user-0 提问: 关于指针和字符数组输出的问题，稍微指导一下下

回复:
user: user-1
content: 引用 2 楼 dcy652701 的回复:[quote=引用 1 楼 ant2012 的回复:] 楼主，你这句代码是不是有点问题 alGraph->vertices[i].place[i] = mid_place[i][n] ;  place[n]是不是应该为place[i]。  输出字符串，直接把字符串的首地址给输出流不就行了，如输出alGraph->vertices[i]中的字符串内容，cout<<alGraph->vertices[i].place<<endl; 谢谢，place那块我改过来了，刚才我试了，编译时出问题了，cout<<alGraph->vertices[i].place<<endl;是c++里的，我用的是c，还有什么方法呢[/quote]  那就用printf  printf("%s\n", alGraph->vertices[i].place);

user: user-0
content: 引用 1 楼 ant2012 的回复:楼主，你这句代码是不是有点问题 alGraph->vertices[i].place[i] = mid_place[i][n] ;  place[n]是不是应该为place[i]。  输出字符串，直接把字符串的首地址给输出流不就行了，如输出alGraph->vertices[i]中的字符串内容，cout<<alGraph->vertices[i].place<<endl; 谢谢，place那块我改过来了，刚才我试了，编译时出问题了，cout<<alGraph->vertices[i].place<<endl;是c++里的，我用的是c，还有什么方法呢

user: user-1
content: 楼主，你这句代码是不是有点问题 alGraph->vertices[i].place[i] = mid_place[i][n] ;  place[n]是不是应该为place[i]。  输出字符串，直接把字符串的首地址给输出流不就行了，如输出alGraph->vertices[i]中的字符串内容，cout<<alGraph->vertices[i].place<<endl;
user-0 提问: c编程遇到问题，求大牛解答！

回复:
user: user-1
content: int max_arr(int ar[],int n) { 	int max;     int i=0; 	for(max=ar[0];i<5;i++) 	{ 		if(max<=ar[i]) 			max=ar[i]; 	} 	printf("The biggest number of array is:%d\n",max); 	return max; }     这样就不会有问题，原因是 int i=0,max=ar[0]; 表示声明两个变量i、max并且初始化，而不是声明变量i=0，对max赋值这两个操作。纯语法问题。

user: user-0
content: 引用 5 楼 H_Clong 的回复:就是前面说的那样   。直接在外面给max赋值就好了。在里面定义就是局部变量只在for里面有用。 外面的max没有任何改变； 你的代码和这个一样的； int max_arr(int ar[],int n) {     int max;     for(int i=0,n=ar[0];i<5;i++)     {         if(n<=ar[i])            n=ar[i];     }     printf("The biggest number of array is:%d\n",max);     return max; } 问题解决，真心感谢

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 受教，谢谢！

user: user-0
content: 引用 2 楼 xade 的回复:声明 max 的时候必须给一个初始值。  int max = 0; 或者 int max = ar[0];  因为这是一个函数内变量，是放在栈空间上的，你声明的时候编译器只是把栈空间留出来，并不会清理栈上的内容，很有可能这个地方原本的数据会构成一个比 ar 中所有数据都大的数，这样循环内永远都不会执行 if 后面的操作，所以CRT检测到这个问题才会报错。  大哥您的回复太专业了，可能我 还没到那个层次，所以看不太懂，不过能解决我碰到的问题，谢谢了

user: user-2
content: 声明 max 的时候必须给一个初始值

user: user-3
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-4
content: 循环外的max与循环内的max不是同一个变量

user: user-5
content: 就是前面说的那样   。直接在外面给max赋值就好了。在里面定义就是局部变量只在for里面有用。 外面的max没有任何改变； 你的代码和这个一样的； int max_arr(int ar[],int n) {     int max;     for(int i=0,n=ar[0];i<5;i++)     {         if(n<=ar[i])            n=ar[i];     }     printf("The biggest number of array is:%d\n",max);     return max; }

user: user-6
content: 对，3L说的是对的，看掉了你在for上又定义了一个max，这个max在退出for之后就没了，用的还是外面没有被赋值的max所以报错了。

user: user-7
content: 楼主，你在for上定义一个max 可是又在for里 int i=0,max=ar[0];  这里又定义一个max，导致之前的max被屏蔽了，等for循环退出后，for里的max结束（有些编译器会将定义在for表达式上的变量的生命周期延长到for外，如vc6.0），之后访问的max就是那个之前没有初始化的max

user: user-6
content: 声明 max 的时候必须给一个初始值。  int max = 0; 或者 int max = ar[0];  因为这是一个函数内变量，是放在栈空间上的，你声明的时候编译器只是把栈空间留出来，并不会清理栈上的内容，很有可能这个地方原本的数据会构成一个比 ar 中所有数据都大的数，这样循环内永远都不会执行 if 后面的操作，所以CRT检测到这个问题才会报错。

user: user-8
content: 赶脚你重复定义max了。
user-0 提问: 初学者疑问一道题

回复:
user: user-1
content: 已经比较了，因为最大的一直放在max，只有一个

user: user-2
content: 这个很好理解啊，一开始让max = a,  当 max = a < b 时，说明b大于a , 则让max = b，再让max 与 c比较，如果c > max，则让max = c。  其设计思想，就是先求两个数的最大值，再将最大值与第三个数比较，求最终的最大值，不跟淘汰赛一样么
user-0 提问: 初始化链栈，为 top 指针申请一节点，申请之后却不用，而将 top 指针指向NULL？？求大神指教这个申请节点的操作的作用何在？

回复:
user: user-1
content: 你们老师的意思是创建一个头节点，然后要它的next指向NULL,而不是它本身指向NULL

user: user-2
content: 引用 2 楼 u010815558 的回复:[quote=引用 1 楼 cjqpker 的回复:] S->top = (LinkStackPtr)malloc(sizeof(StackNode));  S->top=NULL;  显然发生了内存泄露，刚申请的内存，令 top = NULL 后就找再也不到了，也就没法释放了。 创建一个top表明是头部，令其next指向NULL表明是空链表。虽然top节点可能不存数据，但是要用到其next指针，所以必须创建这个节点 那这个好多都这样写啊，不申请一个空间行么？[/quote]  怎么会好多这样写的？ 就算某处要赋值为NULL，那也要free()释放内存之后，再赋值为NULL。 这里如果top不作为节点，只记录第一个节点的地址，也是可以的。那就不要有S->top = (LinkStackPtr)malloc(sizeof(StackNode));这一步操作了。

user: user-3
content: 可以搜索研究下带header的链表和不带header的链表。 对特定的链表操作，尝试对两种链表都实现一下，可以发现差别。

user: user-0
content: 引用 1 楼 cjqpker 的回复:S->top = (LinkStackPtr)malloc(sizeof(StackNode));  S->top=NULL;  显然发生了内存泄露，刚申请的内存，令 top = NULL 后就找再也不到了，也就没法释放了。 创建一个top表明是头部，令其next指向NULL表明是空链表。虽然top节点可能不存数据，但是要用到其next指针，所以必须创建这个节点 那这个好多都这样写啊，不申请一个空间行么？

user: user-2
content: S->top = (LinkStackPtr)malloc(sizeof(StackNode));  S->top=NULL;  显然发生了内存泄露，刚申请的内存，令 top = NULL 后就找再也不到了，也就没法释放了。 创建一个top表明是头部，令其next指向NULL表明是空链表。虽然top节点可能不存数据，但是要用到其next指针，所以必须创建这个节点

user: user-4
content: malloc的对象，不用的时候肯定要free

user: user-0
content: 引用 4 楼 cjqpker 的回复:[quote=引用 2 楼 u010815558 的回复:] [quote=引用 1 楼 cjqpker 的回复:] S->top = (LinkStackPtr)malloc(sizeof(StackNode));  S->top=NULL;  显然发生了内存泄露，刚申请的内存，令 top = NULL 后就找再也不到了，也就没法释放了。 创建一个top表明是头部，令其next指向NULL表明是空链表。虽然top节点可能不存数据，但是要用到其next指针，所以必须创建这个节点 那这个好多都这样写啊，不申请一个空间行么？[/quote]  怎么会好多这样写的？ 就算某处要赋值为NULL，那也要free()释放内存之后，再赋值为NULL。 这里如果top不作为节点，只记录第一个节点的地址，也是可以的。那就不要有S->top = (LinkStackPtr)malloc(sizeof(StackNode));这一步操作了。[/quote]偶偶，谢谢了

user: user-0
content: 引用 3 楼 ForestDB 的回复:可以搜索研究下带header的链表和不带header的链表。 对特定的链表操作，尝试对两种链表都实现一下，可以发现差别。好的，谢谢了
user-0 提问: getopt疑问

回复:
user: user-1
content: l: 表示l后面有参数，但是你并没有提供参数。         case 'l':             b_opt_arg = optarg;             printf("Our love is %s\n", optarg);             break; 看到optarg没有？

user: user-2
content: optstring是选项字母组成的字串。如果该字串里的任一字符后面有冒号，那么这个选项就要求有选项参数 所以 ./hello  -l forever

user: user-3
content: l后有冒号  冒号-l后面必须跟一个参数，否则报错。  和顺序无关。  http://www.cnblogs.com/pengyingh/articles/2503440.html  http://blog.csdn.net/mr_jj_lian/article/details/6835137
user-0 提问: free()出错 DAMAGE:after normal block(#)

回复:
user: user-0
content: 多谢楼上的大侠，j<=FileSize真的越界了。

user: user-1
content: for(j=0;j<FileSize;j++)  你赋值越界了

user: user-2
content: 楼主，你的C_buffer是什么类型，没看到在哪定义啊
user-0 提问: 输入数组不得使用getchar

回复:
user: user-1
content: #include <iostream> #include <vector> #include <iterator> #include <algorithm>  int main(){    std::istream_iterator<int> start(std::cin), end;	     std::vector<int> v;    std::copy(start,end, std::back_inserter(v));    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, "  "));    std::cout << std::endl;    return 0; }  C:\Users\Administrator\Desktop\demo>echo 10 13 15 14 10 |  demo 10  13  15  14  10

user: user-2
content: cin>>n; vetor<int> v; istream_iterator<int> beg(cin); copy(beg,istream_iterator<int> (),v.begin()); cin.clear(); 输入  10 1 2 3 4 5 6 7 8 9 10 a

user: user-2
content: 如果用 copy 函数，从 cin 上输入，表面上并没有循环
user-0 提问: C++ static_cast int类型转换为char类型

回复:
user: user-0
content: 谢谢各位帮忙，第一次发帖求助分不多，学习了~

user: user-1
content: 引用 5 楼 freedemolody 的回复:[quote=引用 4 楼 fly_dragon_fly 的回复:] 加不加static_cast没什么区别, 结果也没错, 你想看到什么, 调试器显示是字符, 不显示整数   请问，难道不是array2的数组中的每个int型数值对应array3数组中的每一个char型数值么？ 可是经过static_cast转换后，为甚么array里只对应这个"霅墹"。另外array2和array3数组中的内容是我添加“监视”时copy的。 拜托解答一下了，非常谢谢[/quote]直接在内存中看一下array3

user: user-2
content: void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-3
content: 引用 5 楼 freedemolody 的回复:[quote=引用 4 楼 fly_dragon_fly 的回复:] 加不加static_cast没什么区别, 结果也没错, 你想看到什么, 调试器显示是字符, 不显示整数   请问，难道不是array2的数组中的每个int型数值对应array3数组中的每一个char型数值么？ 可是经过static_cast转换后，为甚么array里只对应这个"霅墹"。另外array2和array3数组中的内容是我添加“监视”时copy的。 拜托解答一下了，非常谢谢[/quote] 试试在watch窗口中观察array3,5 这个可以把普通地址转换为数组。

user: user-0
content: 引用 4 楼 fly_dragon_fly 的回复:加不加static_cast没什么区别, 结果也没错, 你想看到什么, 调试器显示是字符, 不显示整数   请问，难道不是array2的数组中的每个int型数值对应array3数组中的每一个char型数值么？ 可是经过static_cast转换后，为甚么array里只对应这个"霅墹"。另外array2和array3数组中的内容是我添加“监视”时copy的。 拜托解答一下了，非常谢谢

user: user-1
content: 加不加static_cast没什么区别, 结果也没错, 你想看到什么, 调试器显示是字符, 不显示整数

user: user-4
content: 整形占四个字节，字符型1个字节，当然是不安全的

user: user-0
content: 版主，static_cast不是强制类型转换么，这样转换不可以吗

user: user-5
content: 一个是整形 一个是char
user-0 提问: 如何理解程序的编译、链接、加载等各个过程

回复:
user: user-1
content: 参考Tiny C Compiler源代码？

user: user-1
content: 《Windows PE权威指南》 《程序员的自我修养——链接、装载与库》 The Intel 64 and IA-32 Architectures Software Developer's Manual

user: user-2
content: 程序员的自我修养 就是这买本书讲解  同样看不懂的落。  看不懂就先不看。

user: user-0
content: 引用 2 楼 FightForProgrammer 的回复:还有一本：程序员的自我修养这本书很晦涩，看不懂

user: user-3
content: 还有一本：程序员的自我修养

user: user-4
content: 推荐一本书吧：CSAPP Computer System: from A Programmer's Perspective
user-0 提问: 字符串

回复:
user: user-1
content: 直接使用strstr函数可以了。  char[] a = "abcd0efg00hijkl0mnop00qr"; char* pIndex = null; pIndex = strstr((const char*)a, "00");

user: user-2
content: strstr现成的。

user: user-3
content: 也可以使用库函数

user: user-4
content: int find_twozero(const char *s){     for(auto p =s;s[0]&&s[1];s++) if(s[0]=='0'&&s[1]=='0') return s-p;     return -1; }

user: user-5
content: int i = 0; while(a[i] != 0 || a[i+1] != 0) {     i++; }
user-0 提问: posix socket api thread safe

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:《Windows核心编程》  epoll 是linux 里面才有吧，虽然概念一样但是细节不同。

user: user-1
content: 《Windows核心编程》

user: user-0
content: 这样的读写应该不是一个好的设计，只不过就是想了解一下。是得去追linux 内核才能知道吗？？
user-0 提问: 怎么用VC画波形图

回复:
user: user-1
content: 直接用C语言图形编程就能解决啊，给你个网站这里面有现成的，自己找去。 http://www.easyx.cn

user: user-2
content: 马克

user: user-3
content: http://blog.csdn.net/onlymydreams_mfc/article/details/7378094

user: user-4
content: 可以用mschart,或者ntgraph这个，以前用过ntgraph这个挺简单的。

user: user-0
content: 你给的那个网站上的第一和第二步你能和我说说吗？我看不懂呀

user: user-5
content: http://www.jizhuomi.com/software/246.html

user: user-5
content: http://www.pudn.com/downloads384/sourcecode/windows/bitmap/detail1648955.html 去这里找找 用GDI或GDI+来做。
user-0 提问: 十进制字符串转换为16进制

回复:
user: user-1
content: char *p="123456789012345678901234567890" 这个１６进制是0x18ee90ff6c373e0ee4e3f0ad2，１０多个字节，int　或者long long都不能表示，只能自己用数组来模拟了． 这里给个最初的版本，可以改进．  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define  MAXBUF   20  void DecString2HexString( unsigned char *dest, const  unsigned char *src ); void SumArray( unsigned char *dest, const unsigned char *src1, const unsigned char *src2 ); void LeftShift( unsigned char *dat ); unsigned char Num2Char( unsigned char ch );   unsigned char *p="123456789012345678901234567890"; unsigned char result[sizeof(p)];//大小自己定 unsigned char binNum[MAXBUF];  int main() {         DecString2HexString( result, p );     printf( result ); 	getchar();     return 0; }    /* 描述:将１０进制的字符串转换成十六进制的形式 */ void DecString2HexString( unsigned char *dest, const unsigned char *src ) {     unsigned char *pBuf = src;     unsigned char i,j, ch;     unsigned char temp1[MAXBUF];     unsigned char temp2[MAXBUF];     unsigned int len = 0;      	memset( binNum, 0, MAXBUF );      while ( (ch = *pBuf++ ) != 0 )     {         ch = ch - '0';         memcpy( temp1, binNum, MAXBUF ); 		//binNum = binNum * 10;          LeftShift(temp1);         memcpy( temp2, temp1, MAXBUF );         LeftShift(temp1);         LeftShift(temp1);         SumArray( binNum, temp1, temp2  );          binNum[MAXBUF-1] += ch;      }      for ( i=0; i<MAXBUF; i++ )     {         if ( binNum[i] != 0 ) break;     }      if ( (binNum[i] & 0xf0) == 0)     {         dest[len++] = Num2Char(binNum[i]);         i++;     }      for ( j=i; j<MAXBUF; j++ )     {         dest[len++] = Num2Char( binNum[j]>>4 );         dest[len++] = Num2Char( binNum[j]&0xf );     }   }  unsigned char Num2Char( unsigned char ch ) {     return ch <= 9? (ch + '0') : (ch + 'a' - 10); }  //两个数组之和 void SumArray( unsigned char *dest, const unsigned char *src1, const unsigned char *src2 ) {     char i;     unsigned char c;     unsigned short sum;      c = 0;     for ( i=MAXBUF-1; i>=0; i-- )     {         sum = src1[i] + src2[i] + c;          if ( sum > 255 )         {             c = 1;         }         else         {             c = 0;         }          dest[i] = sum & 0xff;      } }   //左移 void LeftShift( unsigned char *dat ) {     unsigned char i, c;      dat[0] = dat[0] << 1;      for ( i=1; i<MAXBUF; i++ )     {         c = dat[i]>>7;          if ( c == 1 )         {             dat[i-1] |= 1;         }         else         {             dat[i-1] &= 0xfe;         }          dat[i] = dat[i] << 1;     } }
user-0 提问: 请教各位大神，指针访问指定内存

回复:
user: user-1
content: 你怎么知道在0xf0000到0xfffff之间？

user: user-0
content: 对啊，就是要查找SMBIOS信息。我再查找下物理地址怎么查找

user: user-2
content: 楼主这是要查找SMBIOS的信息啊, 你所说的内存地址0xf0000到0xfffff, 其实它们是内存的物理地址即实际内存地址. 我们写出来的程序所有使用的内存地址都是虚拟地址, 虚拟地址和物理地址之间是不匹配的. 所以你需要去访问物理内存地址,  因为访问物理内存地址是操作硬件级别的代码, 所以需要ring0权限 你可以使用驱动来进行ring0访问 目前封装好的访问硬件的库有WinRing0, WinIO等, WinRing0默认不能进行物理内存访问, 你需要下载源码自己开启物理内存访问, 然后编译, WinIO我没使用过不太清楚.

user: user-3
content: 在DosBox下 或 使用WinIO.sys

user: user-4
content: 引用 7 楼 MRCRL 的回复:因为要获取SMBIOS必须先获得eps表，而这个表就是存放在0xf0000-0xfffff之间内存 。。。。饿， 首先，你直接赋值 一个常量作为指针，这种方式肯定是不可取的，很容易就崩了。 然后，那里的0xf0000-0xfffff是系统物理内存地址呀。。。 －－－－－－－－－－－－－－－－－－－－－－－－－－－－ 我只大概看了下， 如果你是想获取电脑的硬件信息，建议你可以采用其他方式，具体的忘了可搜索， 如果你非要这么干，建议搜索windows下访问物理内存，

user: user-0
content: 因为要获取SMBIOS必须先获得eps表，而这个表就是存放在0xf0000-0xfffff之间内存

user: user-4
content: 引用 5 楼 MRCRL 的回复:是已知” _SM_ "这串字符是一个表格内容头部，存放在0xf0000-0xfffff这段内存之间，我要找到这个表格。  关于内存范围问题，0xf0000-0xfffff这明显不像是一个可以合法访问的内存地址呢。。。。 你的问题应该是"存放在0xf0000-0xfffff这段内存之间"这句话很不对劲， 你那个表格是哪里来的，你是怎么知道这个表格在0xf0000-0xfffff的,。。。。

user: user-0
content: 是已知” _SM_ "这串字符是一个表格内容头部，存放在0xf0000-0xfffff这段内存之间，我要找到这个表格。

user: user-5
content: 解析随机生成的文件是吗

user: user-0
content: 就是“_SM_"存在内存的0xf0000-0xfffff之间，我要找到他。请问可以怎么找到呢

user: user-4
content: 。。。你也是个人才。。。。这么操作内存，这不就个野指针，对野指针的访问，运行结果完全未知 管你是0xf0000还是0xfffff 建议你说清实际情况再讨论吧；

user: user-4
content: 。。。你也是个人才。。。。这么操作内存，这不就个野指针，对野指针的访问，运行结果完全未知 管你是0xf0000还是0xfffff 建议你说清实际情况再讨论吧；
user-0 提问: 假如我有4个数组，怎样对外表现为一个数组？

回复:
user: user-1
content: 这个无妨的。楼主是将数组做封装了，原则上是不可能用memcpy,memset对数组直接操作的。  引用 7 楼 jiqiang01234 的回复:最好不要模拟成一个数组，因为数组是可以memcpy()memset()操作的，而模拟的是无法做到，而且也无法防止调用端这样使用

user: user-2
content: 永远都不可以的。

user: user-3
content: 最好不要模拟成一个数组，因为数组是可以memcpy()memset()操作的，而模拟的是无法做到，而且也无法防止调用端这样使用

user: user-4
content: 直接不行就加个间接好了 int a[11],b[14],c[33],d[443],     *pp[]={ a, b, c, d}; int start[]={0,11,14+11,33+14+11},len[]={11,14+11,33+14+11,443+33+14+11}; int get(int idx){     int which;     for(which=0;which<4;which++) if(idx<len[which]) break;     if(which>=4) {assert(false); return -1;}     return pp[which][idx-start[which]]; }

user: user-5
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George

user: user-6
content: 忘了写在代码里了

user: user-6
content: 换个更加灵活的写法： template <typename T>class CombPArr{ int *a,*b,*c,*d; size_t aSZ,bSZ,cSZ,dSZ ; public : CombPArr(T *pa,T* pb,T *pc, T* pd,size_t szA,size_t szB,size_t szC,size_t szD) :a(pa),b(pb),c(pc),d(pd),aSZ(szA),bSZ(szB),cSZ(szC),dSZ(szD) { }; const int & operator [](int n)const { return n<aSZ?a[n] :n<bSZ ? b[n]: n<cSZ?c[n]:d[n];} int& operator[] (int n){ return n<aSZ?a[n] :n<bSZ? b[n]: n<cSZ?c[n]:d[n]; }; };

user: user-6
content: C++ 可以这么处理 template<int M,int N,int K,int L> class CombArr{ enum {aSZ=M,bSZ =N,cSZ=K,dSZ=L}; int (&a)[aSZ]; int (&b)[bSZ]; int (&c)[cSZ]; int (&d)[dSZ];  public : CombArr(int (&A)[aSZ],int (&B)[bSZ],int (&C)[cSZ],int (&D)[dSZ]):a(A),b(B),c(C),d(D){}; const int & operator [](int n)const { return n<aSZ?a[n] :n<bSZ ? b[n]: n<cSZ?c[n]:d[n];} int& operator[] (int n){ return n<aSZ?a[n] :n<bSZ? b[n]: n<cSZ?c[n]:d[n]; }; }; #define arrsize(x) (sizeof(x)/sizeof(x[0])) //这可以改进为更好的版本   CombArr<arrsize(a),arrsize(b) ,arrsize(c),arrsize(d) > ca(a,b,c,d); 现在  ca 可以当作数组处理了

user: user-7
content: #define _countof(a)   (sizeof(a)/sizeof(a[0]))   size_t GetCount(){ return _countof(A) + _countof(B) + _countof(B) + _countof(D); }  类型   GetElement(size_t i){ if(i < _countof(A))        return A[i]; else if(i < _countof(B))        return B[i]; else if(i < _countof(C))        return C[i]; else if(i < _countof(D))        return D[i]; }

user: user-8
content: 写一个类，把4个数组做为成员变量，重载类的[]运算符

user: user-9
content: 4个数组都放到一个类里面，类里面给一个getElem的成员函数，对索引值进行判断看在哪个数组里，找到然后再把那个元返回。 建议可以先判断在不在D数组内，因为D比较大，在里面的几率高，总体来说可以略节省点时间。

user: user-6
content: 定义为一个数组
user-0 提问: getchar()与ch=getchar()

回复:
user: user-1
content: // 1 while((ch = getchar()) != '\n')             putchar(ch); // 2			 while((getchar()) != '\n')             putchar(getchar()); getchar()每调用一次，指针往后移动了一位。第2种调用了2次getchar(),  是错的。每次只输出了第2,4,6,8...个字符，因为中间的，被第一个getchar()消耗掉了，而你又没保存输出。

user: user-0
content: 引用 楼主 Real_Bird 的回复:#include <stdio.h>  int main(void) {     int input;     char ch;      while(scanf("%d", &input) != 1)     {         while((ch = getchar()) != '\n')             putchar(ch);         printf(" isn't a integer.please input again\n");     }     printf("%d\n", input);      return 0; }  图如下。  我不明白这两个区别在哪 我太疏忽了。。多谢
user-0 提问: C primer plus 编程答案 有点问题 找不出来 帮忙看一下 谢谢了

回复:
user: user-0
content: 好吧  .........

user: user-1
content: 保存、读取应该没有问题

user: user-1
content: struct pack { struct book book;  bool delete_me; }; 中的delete_me是标志位，必须处理  if (getlet("yn") == 'y') { 		 } 保存、读取应该没有问题 else 	library[count].delete_me = false;
user-0 提问: 帮忙看一下   哪里出错了VS2010

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

user: user-2
content: 这类错误，用IDE排下格式应该就能发现

user: user-3
content: 同上，多了个分号！！难道编译器不定位错误么

user: user-4
content: #include<stdio.h> int main() { int n;     int f1; int f2; int f3; int i;  f1=1; f2=2; printf("请输入你需要的序列："); scanf("%d",&n); if (1 == n) f3=1; else if (2 == n);//此处多了一个双引号，执行的是空语句  f3=2; else   //这个找不到if对应了 { for （i=3;i<=n; ++i） { f3=f1+f2; f1=f2; f2=f3;	     } } printf("%d\n", f3);  return 0; }
user-0 提问: C语言define可以将字符串定义为空格吗？

回复:
user: user-1
content: VC编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-0
content: 求教，为什么不可以呢？不是说在读了两个空格确定宏名称之后，剩下的到末尾都是字符串吗？

user: user-2
content: ，，，，不能

user: user-3
content: 参考记事本的替换功能

user: user-4
content: 那要看你怎么用，#define只是做文本上的替换，也就是后面所有用A的位置都被替换为了‘ ’。 如果是char  a = A； 替换之后变成char  a = ‘ ’； 这倒是可以当空格用。
user-0 提问: while(getchar() != '\n')

回复:
user: user-1
content: 前一个是空语句，所以效果一样

user: user-2
content: 效果是一样的，continue是结束本次循环，后面不再执行

user: user-3
content: 应该是一样的

user: user-4
content: 效果一样，con 会跳过继续下一轮
user-0 提问: xcode使用问题

回复:
user: user-1
content: main重复了吧,直接新建个targets

user: user-2
content: 你main函数重复定义了吧。

user: user-3
content: 什么版本的Xcode？  为何不用obj-c？

user: user-4
content: http://www.baidu.com/baidu?wd=Apple+Mach-O+Linker+Error&tn=monline_dg
user-0 提问: 求一组正则表达式实现方法

回复:
user: user-1
content: 去linux版块吧

user: user-2
content: 提醒：正则表达式不是万能的；有限状态自动机才是万能的。

user: user-3
content: 否定向前查找试试 s/(set\s+((?!nocount)\w)+\s+on)//g

user: user-2
content: 提供给楼主一个新思路： 分四步： 第一步：确定你文件中没有某个字符串，比如”--==--“ 第二步：将所有set nocount on替换为--==-- 第三步：删除所有set ... on的行 第四步：将所有--==--替换为set nocount on

user: user-4
content: 可以先将 on set 替换成 on \nset ，然后在使用正则表达式处理。

user: user-5
content: 什么正则？ 什么环境？
user-0 提问: 想找人一起做操作系统

回复:
user: user-0
content: 引用 35 楼 u014444402 的回复:连定时器都不用？线程怎么调度？ 可以循环跑任务，能抢占？我是不是可以认为是一个大循环？ 目前只是一级内核，基本适用于所有硬件，升级内核会根据硬件的能力逐渐实现这些功能，在一级内核中有模拟的定时器，光标就是用它来实现的，一级内核运用了简单的消息机制，纯C语言实现，具体实现方法就不说了，想了解的话请加qq1286671822

user: user-0
content: 引用 34 楼 adlay 的回复:不依赖于硬件就意味着不会针对特定的硬件优化，也无法充分发挥硬件的功能。 而要在各种硬件上都能运行，就只能取硬件功能交集的部分来用，面对一个 64 位多核的 CPU，你也把它当成一个 16 位的单核 CPU 来用么？ 因为对硬件的操作是通过包来实现的，所以在做包时会充分利用硬件，发挥其最大功能，在做包时会对不同的硬件做不同的包，并会分不同的位数（我前面提到的是大部分代码通用）。

user: user-1
content: 连定时器都不用？线程怎么调度？ 可以循环跑任务，能抢占？我是不是可以认为是一个大循环？

user: user-2
content: 不依赖于硬件就意味着不会针对特定的硬件优化，也无法充分发挥硬件的功能。 而要在各种硬件上都能运行，就只能取硬件功能交集的部分来用，面对一个 64 位多核的 CPU，你也把它当成一个 16 位的单核 CPU 来用么？

user: user-3
content: 是感觉好厉害的样子

user: user-4
content: 不用理会别人的质疑，只有写操作系统的过程才能更进一步把自己的技术融会贯通，编写操作系统时候会遇到许许多多的问题，当问题都解决了，什么都不是问题了。

user: user-5
content: 楼主太牛  楼主加油 ,我们用裁剪的linux，本人感觉就挺伟大的，楼主更伟大。

user: user-6
content: 大神加油, 期待国产, 核心技术

user: user-7
content: 加油。。。。。。。。

user: user-8
content: 不明觉厉。中国的屌丝程序员们都疲于生计和攀比吧？ lz好有闲情，不如先研究透UNIX内核吧，有句话说，“不懂UNIX的人，注定发明个蹩脚的UNIX”。 个人觉得只有研究透现有的技术，才有可能青出于蓝。

user: user-9

user: user-0
content: 引用 27 楼 stupid_boy2007 的回复:不明觉厉。中国的屌丝程序员们都疲于生计和攀比吧？ lz好有闲情，不如先研究透UNIX内核吧，有句话说，“不懂UNIX的人，注定发明个蹩脚的UNIX”。 个人觉得只有研究透现有的技术，才有可能青出于蓝。 好，谢谢

user: user-10

user: user-11
content: ...曾经计划写模拟器都没坚持下来的表示支持

user: user-12
content: 做好通知我有用。

user: user-0
content: 只是换了一种显示的方式而已。。。

user: user-13
content: 我看你似乎写的是一个SHELL?

user: user-14

user: user-15
content: 好厉害的样子

user: user-0
content: 引用 18 楼 jack960330 的回复:[quote=引用 17 楼 jack960330 的回复:] [quote=引用 16 楼 u012430857 的回复:] [quote=引用 15 楼 jack960330 的回复:] [quote=引用 14 楼 u012430857 的回复:] [quote=引用 12 楼 jack960330 的回复:] [quote=引用 10 楼 u012430857 的回复:] [quote=引用 7 楼 jack960330 的回复:] 请问目前楼主主要用的什么语言？目测内核层 汇编、c 、应用层cpp 因为大部分代码不依赖硬件，所以内核大部分功能由外部的包来完成，包由汇编和c实现，主程序为c语言编写[/quote] 不可能完全不依赖硬件，内存管理单元（MMU）、中断管理，你肯定有吧？这些都是硬件[/quote] 比如说中断吧，将中断响应函数设置为包内的某个函数，它对信息进行处理后（比如是键盘中断，会将收到的按键编码进行处理后调用主程序的反向信息输入函数），而在主程序里这一切都是抽象的，主程序不知道什么是键盘，什么是鼠标，只会对收到的信息进行处理，所以我会说，对硬件的控制是由包来实现的，而包就相当于一个库。[/quote]  那你引导程序呢？再说了，什么系统不是把很多汇编组编成函数的形式？还是说你会完完全全用汇编实现？[/quote] 首先，主程序是用C写的，并且主程序也相当于是一个函数被调用的，操作系统由包内的引导程序开始，引导程序将操作系统加载完后，会调用主程序，当主程序收到用户发来的关机命令后，会先完成必要的处理，然后调用包内的Shutdown_S__X86_64()关机，包对主程序来说其内部是未知的，可以用汇编写也可以用汇编和C或者是别的写，只要能完成相应的功能就行。再举个例子，主程序不知道显存是什么，甚至不知道显示器如何运行，包只提供一个设置像素的函数，画线等函数都在主程序内，主程序计算出坐标后对相应坐标通过这个函数设置颜色。 我出去有点事，暂时不回复了[/quote]0  正确的顺序是这样的，首先由bios执行自检，然后进入引导程序，首先会进入MBR（主引导记录），由主引导记录根据用户选择调用操作系统的引导记录（MBR引导区一般0柱面0盘面1扇区），引导程序执行后，进行硬件系统初始化，磁盘初始化，读操作系统引导文件，然后跳转到特定地址执行，这个地址还是汇编，所需要做的就是初始化c执行环境，cpu工作模式由实模式切换保护模式，建立系统内核区，然后才真正跳转到入口函数执行c语言入口点，入口点还不行，还要进行保护模式中断向量表初始化、全局内存段初始化、键盘鼠标初始化、硬件设备缓存区初始化、然后设备初始化，驱动初始化，整个过程完成后，才算初始化完成。[/quote]  而且根据系统规模，完善的系统初始化过程还要更多，比如文件系统初始化，win还要加载注册表，[/quote] 是这样的，我也写了初始化函数，具体怎么实现的要是说的话要说很多，还要看最后是怎么做磁盘映像的，我看您对操作系统很了解，可以加个qq好友么，有问题还要请教您 qq1286671822
user-0 提问: 有名管道问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:在创建进程之前打开管道，说明父子进程都有打开那个管道，然后子进程将当前系统时间写到管道中，而父进程只是用来控制每隔一秒运行一次子进程（Ps：管道中有数据，就读）。 第二个fifo程序，在子进程中打开管道，对父进程是没有任何影响的（Ps：也就是说父进程中的操作对管道没有作用），而在子进程中，一直往管道里面写当前系统时间。不太懂。。。你能不能解释一下第二种写法为什么会导致PID乱和刚开始的那一段时间不变而后面就递增呢？

user: user-1
content: fork（） 创建的进程，父子进程没有先后的执行顺序。所以觉得你这个程序用进程不好，建议直接顺序直接写下去，如果一定要分两步来的话，用线程。其中一个线程sleep（1），另一个线程将当前的系统时间写到管道里去。

user: user-1
content: 在创建进程之前打开管道，说明父子进程都有打开那个管道，然后子进程将当前系统时间写到管道中，而父进程只是用来控制每隔一秒运行一次子进程（Ps：管道中有数据，就读）。 第二个fifo程序，在子进程中打开管道，对父进程是没有任何影响的（Ps：也就是说父进程中的操作对管道没有作用），而在子进程中，一直往管道里面写当前系统时间。
user-0 提问: gcc里printf("\n");对指针指向的值有影响怎么回事

回复:
user: user-1
content: 引用 6 楼 flymanveryhigh 的回复:distribution()函数定义在这个代码文件外，输出的是一个指针，指向一个int数组的开头，正常的传进来了，若是一开始在此文件内部进行复制int数组，复制出来的一点问题没有，如果在复制前加入类似于for();或printf("\n");就可能出问题了，问题是为什么 distribution()刚刚返回后，其局部变量（int数组）内的内容还没有被破坏；但是调用printf()（调用任何函数结果也类似）时，一般要建立printf函数的局部变量空间（栈帧），新函数的局部变量、包括参数很可能与前一次函数调用时的位置重叠，因此覆盖了原先（已经过时了）的局部变量。原int数组的内容就变了。 如果distribution()函数返回的是malloc()分配的空间地址就没问题了，但是要主调函数负责free()掉。

user: user-2
content: To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints.   Click the Data tab of the Breakpoints dialog box.   In the Expression text box, type the name of the variable.   Click OK to set the breakpoint.

user: user-3
content: 最关键的函数distribution没给出

user: user-4
content: 怎么就不正常了

user: user-5
content: distribution() 这个函数返回的int*   是堆空间的还是栈空间 的？

user: user-6
content: 你倒是把代码上全啊出啥问题了都没说清

user: user-0
content: distribution()函数定义在这个代码文件外，输出的是一个指针，指向一个int数组的开头，正常的传进来了，若是一开始在此文件内部进行复制int数组，复制出来的一点问题没有，如果在复制前加入类似于for();或printf("\n");就可能出问题了，问题是为什么

user: user-0
content: distribution()函数定义在这个代码文件外，输出的是一个指针，指向一个int数组的开头，正常的传进来了，若是一开始在此文件内部进行复制int数组，复制出来的一点问题，如果在复制前加入类似于for();或printf("\n");就可能出问题了，问题是为什么
user-0 提问: 请教C语言如何调用C#动态链接库。。

回复:
user: user-1
content: 引用 4 楼 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不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！无限膜拜中。。。。

user: user-2
content: 3楼正解，得com组件

user: user-3
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-4
content: 饿，c调用c#的dll....这不行吧； 参考4楼， 如果非要这么做，那得托管的c++才行呢； 另外，也许你可以用托管c＋＋在封装c#dll，然后提供个标准dll接口，让c来调用，我没这么干过只是提供个思路不知道是否可行

user: user-5
content: 俺一般都是把C#封装成COM组件，供C++调用。

user: user-6
content: C语言大概可以，C++勉强能用，C++/CLI完全够用 取决于你能不能修改C#部分的代码或者重新封装

user: user-7
content: C#那个dll貌似不叫动态链接库，叫做程序集什么的。
user-0 提问: 面试题请教

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-0
content: 引用 5 楼 ant2012 的回复:类型转换问题  A在进行取反操作前，会转换成整形，然后再进行取反操作  楼主可以通过typeid测一下~A的类型就知道了 的确是这样的，谢谢你的回答啊

user: user-0
content: 引用 2 楼 lgbxyz 的回复:http://bbs.csdn.net/topics/390994744 明白了，谢谢你啊

user: user-0
content: 引用 1 楼 a1193561652 的回复:也许是%u是unsigned int型输出，所以a就被强制转换为unsigned int了。 刚明白了是因为unsign  char在取反的时候进行了类型的提升，unsign  char会变为int型，所以扩展为32位了。谢谢你的回答

user: user-2
content: printf的压栈参数不是int,就是double, 给一个ushort,还是按int压栈,

user: user-3
content: 类型转换问题  A在进行取反操作前，会转换成整形，然后再进行取反操作  楼主可以通过typeid测一下~A的类型就知道了

user: user-4
content: 这是因为参数传递的关系  要保证正确： unsingned short，short %hu    //十进制: 按照无符号short格式 %hd   // 十进制:  按照(有符号)short格式 %hx   // 十六进制:  按照short格式  /============  unsingned char，char %hhu    //十进制: 按照无符号short格式 %hhd   // 十进制:  按照(有符号)short格式 %hhx   // 十六进制:  按照short格式

user: user-5
content: 刚刚看了下反汇编，发现是因为函数传递参数是通过压栈来实现的，但是压栈一次要压一个双字节的操作数，所以word型的short就被扩展为doubleword型的了。

user: user-6
content: http://bbs.csdn.net/topics/390994744

user: user-5
content: 也许是%u是unsigned int型输出，所以a就被强制转换为unsigned int了。
user-0 提问: 关于数组的问题

回复:
user: user-1
content: zip[1][2]等价于*(*(zip + 1)+2)，由于会分配一个连续的内存区域给数组，所以zip[1][2]的结果应该是1才对(gcc的运行结果是1)。

user: user-2
content: 因为数组是顺序存储的，所以如果超出了界限，那么就是下一个这里zippo[1][2]就是第三行的第一个

user: user-2
content: 这个数组是4行2列 zippo[1][2]表示的意思是：第二行，第三列

user: user-3
content: zippo[1][2]是第2个元素的第3个，下标是从0起的。
user-0 提问: 深度优先搜索的问题，很简单，高手稍微指导一下就好

回复:
user: user-1
content: 返回这个结点做什么，在while循环里面还是外面好像都不行，如果在调用DFS前加，会忽略之后的代码，如果在调用DFS之后加，那只能访问到最后一个结点时，才开始由下往上，逐级返回  直接压栈不就行了

user: user-2
content: 你递归dfs的时候就没用到返回值, 这值用来做什么
user-0 提问: if ..else if.. 后的else可以省掉不？

回复:
user: user-1
content: 还是先看一下基础语法吧

user: user-0
content: 引用 3 楼 jiqiang01234 的回复:return 0是单独的依据，和if else没关系，但if语句如果有多个分支，且else分支为空的话，最好把else写出来，顺便加一个断言，表示永远不会进入else分支。     int val = 1;     if(1== val)     {     }     else if(2 == val)     {     }     else     {        assert(0);//表示如果逻辑正确的话，永远不会进入此分支，如果进入会触发断言，程序停止运行     }   你的意思是说：   c/c++规定，可以只有  1 if   2 只有if ....... else if    2种情况，都可以把else 省去， 同时候后面的代码是单独的。

user: user-0
content: 引用 3 楼 jiqiang01234 的回复:return 0是单独的依据，和if else没关系，但if语句如果有多个分支，且else分支为空的话，最好把else写出来，顺便加一个断言，表示永远不会进入else分支。     int val = 1;     if(1== val)     {     }     else if(2 == val)     {     }     else     {        assert(0);//表示如果逻辑正确的话，永远不会进入此分支，如果进入会触发断言，程序停止运行     }   你的意思是说：   c/c++规定，可以只有  1 if   2 只有if ....... else if    2种情况，都可以把else 省去， 同时候后面的代码是单独的。

user: user-1
content: return 0是单独的依据，和if else没关系，但if语句如果有多个分支，且else分支为空的话，最好把else写出来，顺便加一个断言，表示永远不会进入else分支。     int val = 1;     if(1== val)     {     }     else if(2 == val)     {     }     else     {        assert(0);//表示如果逻辑正确的话，永远不会进入此分支，如果进入会触发断言，程序停止运行     }

user: user-2
content: 单独的，if只包含下一个{}的，

user: user-1
content: return 0是单独的依据，和if else没关系，但if语句如果有多个分支，且else分支为空的话，最好把else写出来，顺便加一个断言，表示永远不会进入else分支。     int val = 1;     if(1== val)     {     }     else if(2 == val)     {     }     else     {        assert(0);//表示如果逻辑正确的话，永远不会进入此分支，如果进入会触发断言，程序停止运行     }

user: user-2
content: 单独的，if只包含下一个{}的，
user-0 提问: 原始套接字 和vlan的问题   来人啊!!!

回复:
user: user-0
content: 引用 2 楼 ForestDB 的回复:有没有设置混杂模式？ 又或者是否和你网卡的VLAN模式相关？  混杂模式试过 不管用

user: user-0
content: 引用 2 楼 ForestDB 的回复:有没有设置混杂模式？ 又或者是否和你网卡的VLAN模式相关？  linux应该不纯在这个问题。 vconfig都能配置

user: user-1
content: 有没有设置混杂模式？ 又或者是否和你网卡的VLAN模式相关？

user: user-2
content: 这种问题看TCP/IP详解
user-0 提问: 关于arm与pc之间进行socket通信

回复:
user: user-1
content: 你用的socket类库是否依赖于系统？socket通信是不用修改的，关键是看你用的socket类库是否支持跨平台。

user: user-2
content: 楼上正解 。。。。。。

user: user-3
content: arm中如果是linux系统，直接在pc的linux中交叉编译，然后下载到arm中运行即可

user: user-0
content: 引用 1 楼 zjq9931 的回复:做过很基本的一些，理解不是很深，但是这个既然是socket的，通信协议都是TCP/IP，就没有问题吧？不用做什么修改啊。。。 需要在arm中移植协议吗？还是说直接烧进程序就ok

user: user-4
content: 做过很基本的一些，理解不是很深，但是这个既然是socket的，通信协议都是TCP/IP，就没有问题吧？不用做什么修改啊。。。
user-0 提问: 条件运算符求3个数中间数

回复:
user: user-1
content: int mid( int a, int b, int c ) { 	if ( a > b ) 	{ 		if ( a < c ) 		{ 			return a; 		} 		else 		{ 			if ( b > c ) 			{ 				return b; 			}  			else 			{ 				return c; 			} 		} 	} 	else 	{ 		if ( b < c ) 		{ 			return b; 		} 		else 		{ 			if ( a > c ) 			{ 				return a; 			}  			else 			{ 				return c; 			} 		} 	} } 我真是太无聊了。

user: user-0
content: int d = a > b ? a : b;          if (d == a && d < c) {         printf("%d\n", a);     } else if (d == b && d < c) {         printf("%d\n", b);     } else {         printf("%d\n", c);     } 有点感觉

user: user-2
content: a > b ? (a < c ? a : (b > c ? b : c)) : (b < c ? b : (a > c ? a : c)); a==b,上面为false,所以直接跑到 (b < c ? b : (a > c ? a : c)); b==c,上面为false，所以直接跑到 (a > c ? a : c)); a==c,上面为false，所以直接跑到c
user-0 提问: 求无序数组中的最小K个数，用划分的方法，时间复杂度为什么是O(n)

回复:
user: user-1
content: 因为每次递归只进入一边，所以复杂度是 O(n).

user: user-0
content: 引用 3 楼 ri_aje 的回复:因为每次递归只进入一边，所以复杂度是 O(n). 恩，是这个道理。在回复别人的时候突然想通了，快排是必须要向下递归的，而上面这个并不需要递归，而是类似折半。 1+1/2+1/4+1/8+...<2    ，o(2n)=o(n)，所以时间复杂度是o(n)。  欧了。谢谢大神！

user: user-0
content: 引用 5 楼 fly_dragon_fly 的回复:象是select 算法, 记忆中应该是期望时间是O(n), 有兴趣翻一下 CLRS顺序统计量那章,上面有证明 这是快排中的划分方法。快排必须递归到logn层，而求最小k个数可能只需要划分几次就找到index了。

user: user-0
content: 引用 1 楼 user-4 的回复:这个是使用计数排序的吧？不过，用堆来做个人感觉更常见上些 不是计数排序，是用了快排中的划分方法。堆方法适合处理海量数据，性能确实比较好，时间复杂度为o(nlogk)。我现在想知道为什么划分这种方法时间复杂度是o(n) ？

user: user-2
content: 象是select 算法, 记忆中应该是期望时间是O(n), 有兴趣翻一下 CLRS顺序统计量那章,上面有证明

user: user-0
content: 引用 2 楼 GKatHere 的回复:假设  Partition(input, n, start, end); 为 index++; 那么 for(int index = 0; index < k; index++) ;的时间复杂度为多少? 每次 Partition都要扫描一次数组，按照你这种说法时间复杂度就是o(nk)了

user: user-2
content: 引用 7 楼 gk405128494 的回复:[quote=引用 5 楼 fly_dragon_fly 的回复:] 象是select 算法, 记忆中应该是期望时间是O(n), 有兴趣翻一下 CLRS顺序统计量那章,上面有证明 这是快排中的划分方法。快排必须递归到logn层，而求最小k个数可能只需要划分几次就找到index了。[/quote]part具有随机性,不可能完成折半,也就只有期望时间,

user: user-3
content: 假设  Partition(input, n, start, end); 为 index++; 那么 for(int index = 0; index < k; index++) ;的时间复杂度为多少?

user: user-4
content: 这个是使用计数排序的吧？不过，用堆来做个人感觉更常见上些
user-0 提问: 现在你们都用什么编译环境啊？

回复:
user: user-1
content: devc++ ，vs2010，vs2013，vs2015,codeblock, c_free，

user: user-2
content: C-Free只是IDE，还需要编译器、连接器、调试器、库、头文件... 这些，VC6太老了，C++03都不支持（事实上C++98支持多少都很可疑），用免费的Visual Studio Community 2015是不错的选择，追求优化性能要用intel C++，如果要快速开发应用软件，用C++Builder XE5~XE8这一系列最合适。

user: user-0
content: 我已经找到了vc++6.0完整版，还下了c free5,我家旁边大学软件学院用的就这个

user: user-3
content: 引用 14 楼 DelphiGuy 的回复:[quote=引用 11 楼 zjq9931 的回复:] [quote=引用 10 楼 akirya 的回复:] [quote=引用 9 楼 zjq9931 的回复:] 编译环境，这个问题，我曾经也纠结了很久。 后来发现，抛开自己的目标来挑选编译环境，那就是没头的苍蝇。 不清除提问题人的目标，随意推荐编译环境那就是耍流氓啊。 不论平台，就说编译环境的人，不是狂人就是渣。。。 lz是问 “你们用什么的？哪有？还是要花钱买正版？” 没有问自己该用哪个啊。[/quote] 看楼主的内容楼主的意思明显是在问，该用哪个。（当然我也是猜的，可能猜错了。。） 否则的话也不会问出来这种问题了。。。 你的回答还是很切实际的。因为楼主还在下VC6，所以平台什么的都没什么问题。 但是我看到竟然有人回答用GCC。所以呢，心头一万只草泥马狂奔而过。。。[/quote]  这帖里就您一个答非所问、颠三倒四、忘乎所以、出言不逊...  [/quote] 好吧我补上，我用的是VS2010免费版。

user: user-2
content: 引用 11 楼 zjq9931 的回复:[quote=引用 10 楼 akirya 的回复:] [quote=引用 9 楼 zjq9931 的回复:] 编译环境，这个问题，我曾经也纠结了很久。 后来发现，抛开自己的目标来挑选编译环境，那就是没头的苍蝇。 不清除提问题人的目标，随意推荐编译环境那就是耍流氓啊。 不论平台，就说编译环境的人，不是狂人就是渣。。。 lz是问 “你们用什么的？哪有？还是要花钱买正版？” 没有问自己该用哪个啊。[/quote] 看楼主的内容楼主的意思明显是在问，该用哪个。（当然我也是猜的，可能猜错了。。） 否则的话也不会问出来这种问题了。。。 你的回答还是很切实际的。因为楼主还在下VC6，所以平台什么的都没什么问题。 但是我看到竟然有人回答用GCC。所以呢，心头一万只草泥马狂奔而过。。。[/quote]  这帖里就您一个答非所问、颠三倒四、忘乎所以、出言不逊...

user: user-4
content: vs2013 MyEclipse2015

user: user-5
content: FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn

user: user-5
content: VC6

user: user-6
content: 主要还是看要做什么。

user: user-7
content: vc6

user: user-3
content: 引用 10 楼 akirya 的回复:[quote=引用 9 楼 zjq9931 的回复:] 编译环境，这个问题，我曾经也纠结了很久。 后来发现，抛开自己的目标来挑选编译环境，那就是没头的苍蝇。 不清除提问题人的目标，随意推荐编译环境那就是耍流氓啊。 不论平台，就说编译环境的人，不是狂人就是渣。。。 lz是问 “你们用什么的？哪有？还是要花钱买正版？” 没有问自己该用哪个啊。[/quote] 看楼主的内容楼主的意思明显是在问，该用哪个。（当然我也是猜的，可能猜错了。。） 否则的话也不会问出来这种问题了。。。 你的回答还是很切实际的。因为楼主还在下VC6，所以平台什么的都没什么问题。 但是我看到竟然有人回答用GCC。所以呢，心头一万只草泥马狂奔而过。。。

user: user-8
content: 引用 9 楼 zjq9931 的回复:编译环境，这个问题，我曾经也纠结了很久。 后来发现，抛开自己的目标来挑选编译环境，那就是没头的苍蝇。 不清除提问题人的目标，随意推荐编译环境那就是耍流氓啊。 不论平台，就说编译环境的人，不是狂人就是渣。。。 lz是问 “你们用什么的？哪有？还是要花钱买正版？” 没有问自己该用哪个啊。

user: user-3
content: 编译环境，这个问题，我曾经也纠结了很久。 后来发现，抛开自己的目标来挑选编译环境，那就是没头的苍蝇。 不清除提问题人的目标，随意推荐编译环境那就是耍流氓啊。 不论平台，就说编译环境的人，不是狂人就是渣。。。

user: user-9
content: 大神告诉你 vi + gcc

user: user-8
content: Visual Studio Community 2015 免费

user: user-2
content: VC++ 2013、VC++ 2010、gcc 4.8.1、intel C++ XE 2013、CB XE5...

user: user-10
content: Microsoft Visual C++ 2010 Express C++Builder 6

user: user-11
content: codeblocks+mingw5.03
user-0 提问: 为什么memcpy会让程序崩溃呢

回复:
user: user-1
content: 原因楼上已经说了，常量区不可写  楼主可以这样写：  	char a[]="abcde";   	char *b="12345";   	memcpy(a,b,2);       printf("*a=%c,*b=%c",*a,*b);  上面的a中字符串是在栈上分配的，所以可以

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

user: user-3
content: 楼主去看看程序内存组成，有些是const不可写，只能读

user: user-4
content: 楼上正解，但是这其实与编译器有关，你的程序也就能在Turbo C下正常运行。

user: user-5
content: char *a="abcde"这种写法数据在常量静态区写入非法
user-0 提问: sqlite C语言开发  如何在一个字段中存储数组

回复:
user: user-1
content: 跟sqlite怎么存没什么关系, 把 sqlstr  打出来看看

user: user-2
content: 用  data varchar(5) 没有问题。但你的数据定义是char data_data[2]，只有两个字符。如果要用%s来格式化字符串，那必须保证字符串的最后一个字符是'\0'

user: user-3
content: https://sqlite.org/cintro.html 看过没？

user: user-4
content: data_data多长？sqlite3是utf8编码的。。。

user: user-2
content: data_data[2] 存储的都是可见字符吗？还是可能有非可见字符？

user: user-5
content: 为什么不用blob呢？ 此外，sqlite是弱类型，哪怕你数据库中定义为int类型，依然可以正确的插入、读取text类型。

user: user-0
content: 引用 1 楼 jiqiang01234 的回复:用  data varchar(5) 没有问题。但你的数据定义是char data_data[2]，只有两个字符。如果要用%s来格式化字符串，那必须保证字符串的最后一个字符是'\0'  但如果不想加 “\0”   只是单纯地 存储 data_data[2]     那样的话，可以用 varchar(5)  吗
user-0 提问: c89和c99都函数的使用，是不是有区别？

回复:
user: user-1
content: prinf即可

user: user-2
content: “管道”这个概念虽然是通用的，但具体实现和操作系统有关，所以一般需要调用操作系统的API来创建、使用和管理管道。 这属于“进程间通信”的一种方式。  quote=引用 5 楼 caddor9100 的回复:] 引用 4 楼 lgbxyz 的回复:对于你的程序来说 echo的字符串就是标准输入  #include <stdio.h>  int main(void) {     char buf[512] ={0};      gets(buf);      printf("%s\n", buf);      return 0; }   验证过代码，是可以的。  那么一个程序向管道别给别人，改如何呢、  比如，我想实现一个类似echo 的功能的程序，我该如何做？  ./myprogram "segsg" | wc -l   [/quote]

user: user-0
content: 引用 4 楼 lgbxyz 的回复:对于你的程序来说 echo的字符串就是标准输入  #include <stdio.h>  int main(void) {     char buf[512] ={0};      gets(buf);      printf("%s\n", buf);      return 0; }   验证过代码，是可以的。  那么一个程序向管道别给别人，改如何呢、  比如，我想实现一个类似echo 的功能的程序，我该如何做？  ./myprogram "segsg" | wc -l

user: user-1
content: 对于你的程序来说 echo的字符串就是标准输入  #include <stdio.h>  int main(void) {     char buf[512] ={0};      gets(buf);      printf("%s\n", buf);      return 0; }

user: user-0
content: 多谢。   引用 2 楼 lgbxyz 的回复:怎么无法验证了，gcc默认的是-std=gun89而已，    //test.c #include <stdio.h>  int main(void) {     int x = 1;      printf("x = %d\n", x);      int y = 2;      printf("y = %d\n", y);      return 0; }  /* result [linux]$ gcc test.c -std=c89 test.c:1: error: expected identifier or ‘(’ before ‘/’ token  */    请教一个问题，如何实现一个程序，能够接受标准输入。  比如我从网上找一条命令，  echo "hewsggds" | ./myprogram  echo 把字符串写到标准输出里，  而我的程序可以读取  "hewsggds"。  我该如何做？

user: user-1
content: 怎么无法验证了，gcc默认的是-std=gun89而已，    //test.c #include <stdio.h>  int main(void) {     int x = 1;      printf("x = %d\n", x);      int y = 2;      printf("y = %d\n", y);      return 0; }  /* result [linux]$ gcc test.c -std=c89 test.c:1: error: expected identifier or ‘(’ before ‘/’ token In file included from /usr/include/stdio.h:75,                  from test.c:2: /usr/include/libio.h:332: error: expected specifier-qualifier-list before ‘size_t’ /usr/include/libio.h:364: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/libio.h:373: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/libio.h:495: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘_IO_sgetn’ In file included from test.c:2: /usr/include/stdio.h:336: error: expected declaration specifiers or ‘...’ before ‘size_t’ /usr/include/stdio.h:704: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘fread’ /usr/include/stdio.h:710: error: expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘fwrite’ [linux]$ gcc test.c -std=c99 [linux]$  */

user: user-3
content: 代码在哪里？
user-0 提问: 请问注册表里的ip和网卡的ip为什么不一致?

回复:
user: user-1
content: 引用 5 楼 moonworld1 的回复:针对楼上提到的禁用问题 我试过 但是在ip地址 子网掩码 默认 网关里只有默认网关修改成功..  当然注册表依然显示全部修改成功重启试试

user: user-0
content: 针对楼上提到的禁用问题 我试过 但是在ip地址 子网掩码 默认 网关里只有默认网关修改成功..  当然注册表依然显示全部修改成功

user: user-2
content: 搜devcon

user: user-1
content: 改了之后把网卡禁用再启用试试

user: user-3
content: 网卡 down ，然后up 一下

user: user-4
content: 不知道你用什么API修改的。 其实用CMD命令就可以修改成功： netsh interface ip set address 本地连接 static 192.168.1.47 255.255.255.0 192.168.1.1 netsh interface ip set dns 本地连接 static 192.168.1.1
user-0 提问: 关于结构体指针问题。什么时候在指针前面加*号，什么时候不加 

回复:
user: user-1
content: struct _S {  int F; } S,*pS=&S;  pS->F //等价于 (*pS).F

user: user-2
content: 对于简单的提取成员情况： 如果对指针变量做解引用了（即其前面出现了*），则引用结构体成员时用点（.）运算符 如果对指针变量没有解引用，则引用结构体成员时用指针（->）运算符  如果楼主要用结构体指针的值，就是加*号的 如果是对同类型的指针变量进行相互赋值传递，则是不加*号的，相当于把指针变量内部的值（指向结构体对象的首地址）当作一个无符号整形进行对比和计算（但是指针值的计算一般是比较是否相同，或者相隔多少）；  这个讨论很有趣，大家继续～

user: user-3
content: 不加*是指针，加了*是取指针所指向的值  另外(p + j) -> name也可以写成(*(p + j) ).name  ->这个符号用于指针

user: user-4
content: 引用 楼主 o0Joker0o 的回复:在函数if比较的冒泡排序中，为什么strcmp函数中俩个相比较的指针(p + j) -> name和(p + j + 1) -> name前面为什么不能加*。     但是为什么下面进行冒泡排序赋值的时候就必须要加*   问： (p + j) -> name和(p + j + 1) -> name前面为什么不能加*？  答： p 是Stu * 类型的一个指针变量 p + j 也是Stu * 类型的一个指针变量 p + j  + 1也是Stu * 类型的一个指针变量 用结构体（或者是类）的指针去获取该结构体（或者是类）的成员变量的值有两种方法 1是用->运算符：  p->name， 2是用*运算符：(*p).name 所以你可以写成(p + j) -> name，(p + j + 1) -> name 也可以写成 (*(p + j)).name，(*(p + j + 1)).name  问： 但是为什么下面进行冒泡排序赋值的时候就必须要加*？ 答：*运算符的运算结果是将指针类型运算成结构（或者是类类型） p 是Stu * 类型的一个指针变量 *p则是Stu 类型的一个变量 所以可以Stu temp = *(p + j); 当然，你也可以直接用->运算符，对Stu 的每个成员挨个赋值：如下 Stu temp; temp.name = (p + j)->name; temp.XXX= (p + j)->XXX;

user: user-5
content: 类型要一致 , strcmp第一个参数是const char *, 而name的类型刚好是, 如果*name, 类型就是const char, 就不匹配了,同样, p的类型是Stu*, 你的temp类型是Stu, 不能匹配,

user: user-6
content: 我是小弱，我也不太懂，我来抛砖，说错了大神来拍砖。。 (p + j) -> name：p本身是指针了，你要加*，写成*(p + j). name应该也可以啊。 下边加*，是对指针所指的地址进行操作，这样才能把实参对应的数据修改，否则只是交换形参指针，实参内容没有任何变化，可以参考交换函数void swap(int a, int b) 和 void swap(int* a, int* b)

user: user-7
content: (p + j) -> name 可以匹配指针 (p+j) 指向结构数组第j个元素的指针 name  结构的成员。是个数组 (p + j) ->   <==>(* (p + j)).name 这是个数组 其中 name 是结构的数组成员的名字 . 表示取结构的成员 .name 也就是数组 name 这部分 数组（名） 可以匹配指针参数
user-0 提问: trim 字符串

回复:
user: user-1
content: while ((*pTmp == ' ') && (pTmp >= pStr)) ——这样？

user: user-1
content: 多了没细想，反正你的代码当输入参数是空串时会出问题；当输入参数为只包含一个空格的字符串时，似乎也不能正确处理。 其他情况应该还有，先把这两个解决了，或许就对了。

user: user-1
content: 多了没细想，反正你的代码当输入参数是空串时会出问题；当输入参数为只包含一个空格字符的字符串时，也不能正确处理。 其他情况应该还有，先把这两个解决了，或许就对了。
user-0 提问: 正在c进阶，想提高下自己的代码能力，跪求优秀的代码

回复:
user: user-1
content: C语言怪异代码大赛历届作品大全 1984～1996，1998，2000，2001，2004～2006，2011，2012http://download.csdn.net/detail/zhao4zhong1/5538847

user: user-2
content: 引用 9 楼 均陵鼠侠的回复:主流的观点是正确的编码。但是，如果没有尝试非法和怪异的编码，人生是不完整的，而且也无法体验到正确编码的优势所在。这就像人生，如果从小就是乖孩子，通常是没脸出息的。 赞

user: user-3
content: ftp minidlna filezilla tinyhttpd

user: user-4
content: nginx apache portable runtime

user: user-5
content: mid = a > b ? (a < c ? a : (b > c ? b : c)) : (b < c ? b : (a > c ? a : c)); printf("中间数%d\n", mid);

user: user-6
content: 主流的观点是正确的编码。但是，如果没有尝试非法和怪异的编码，人生是不完整的，而且也无法体验到正确编码的优势所在。这就像人生，如果从小就是乖孩子，通常是没脸出息的。

user: user-7
content: CSDN下载频道挺多有原代码的资源的，楼主可以去看下，另外还要多看书，最好自己有想法，自己来写程序，而不只是看别人写的

user: user-8
content: 《深入理解C指针》这本书不错，当当或者亚马逊都有。  C语言程序开发范例宝典 C语言经典编程282例 《C语言点滴》 《C语言课程设计案例精编》

user: user-1
content: 引用 5 楼 u012830734 的回复:1楼的连接打不开啊 使用chrome浏览器再试试。

user: user-0
content: 1楼的连接打不开啊

user: user-9
content: glib，一个很棒的C库。http://ftp.gnome.org/pub/GNOME/sources/glib/2.40/glib-2.40.0.tar.xz

user: user-10
content: nginx不错

user: user-11
content: 下载chromium，看看它的base库，我虽然不佩服他代码的设计（比如类层次太多），但是，对于他的设计思路却佩服的五体投地。

user: user-1
content: https://www.baidu.com/s?wd=zhao4zhong1%20main%20site%3Abbs.csdn.net&rsv_spt=1&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_sug3=37&rsv_sug1=18&rsv_t=7ae6qNvmYrzRGEhhaaJF%2FfJNDpJ2%2B3yQw49SgfnMgSlbNo4B8gbwMujE0LJlFXZaJg2a&inputT=20733&rsv_sug4=20733
user-0 提问: 求推荐一个好用的C语言书籍

回复:
user: user-1
content: 《C程序设计语言》徐宝文翻译的那个不错

user: user-2
content: 谭浩强老师的<<C程序设计>>

user: user-3
content: 引用 1 楼 单片机工程师的回复:《C程序设计语言》徐宝文翻译的那个不错 这个可不基础。。。作为入门的话肯定有很多地方不懂。
user-0 提问: 第一天学习 C 找不哪里错了，求帮忙。

回复:
user: user-0
content: 引用 1 楼 a1193561652 的回复:printf ("x=%d\n",x);写这样试试。 是那么回事，谢谢啊！

user: user-0
content: 是那么回事，谢谢啊！

user: user-1
content: printf ("x=%d\n",x);写这样试试。
user-0 提问: c89是不是强制规定，变量必须放在可以执行语句之前？

回复:
user: user-0
content: 2个问题  顶起来

user: user-1
content: 变量必须放在可以执行语句之前？这个得看标准了，不过，推荐你还是放在之前吧。 因为有些网上做题目的题库（比如，华为的上机系统，我就遇到过这个坑，程序明明要本地能跑，但是上传到华为上机系统就是报错），它就有可能会报错。

user: user-2
content: 报的都是warning，应该没问题吧。

user: user-2
content: 是C89标准问题，必须放在执行语句前。

user: user-3
content: 是的！！！！！！！1

user: user-4
content: 请参考gcc源代码相关片断。