Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: socket  recv从内核缓存中读取数据出错？

回复:
user: user-1
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-0
content: 感觉不像是面包！可能我对粘包理解有误吧！但是确实在大数据量的时候，容易发生错误，此时接受队列有不少数据。另外我把接受缓存增加到1m

user: user-0
content: 粘包吗？我是先接受数据头，过去数据相关信息，再接受数据，现在就是接受数据头的部分出问题啦！上下的包我都有分析，都是正常的！

user: user-0
content: 我的包有帧号，可以肯定是同一个包！

user: user-2
content: 你发的包不一定正好就是你收的包

user: user-3
content: 粘包问题没处理。  网络这块最好不要自己写了，网上一堆还自己写，不是重复造轮子吗。推荐个ZeroMQ，这个很不错。

user: user-0
content: recv数据已经读出，而且获取对应的长度，但是数据内容的头6个字节出错，并不是所有的包都出错

user: user-4
content: 楼主可以详细说下，recv前几个字节到底出了什么错？  因为客户端是非阻塞recv，所以有可能recv返回错误，此时不能断定recv就出错。  楼主说的前几个字节出错，什么意思？
user-0 提问: 编写一个程序，输入一个十进制的正整数，该整数在机器中对应的二进制数，取出该整数的4-7位，并以十进制数形式输出该整数以及该整数的4-7位

回复:
user: user-1
content: unsigned a,b,c,d;         if( scanf("%d",&a) == 1)          printf("%d\n%d",a, (a & 0xF0) >> 4);

user: user-2
content: 仅供参考#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-3
content: 楼主想干嘛，你这个程序不是能实现么？难道还想要更简单的？ d=(a & 0xF0) >> 4;

user: user-0
content: 新手一个，求大神帮助啊~
user-0 提问: C语言HUFFMAN编码部分程序出错不知道为什么

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

user: user-0
content: 引用 3 楼 user-2 的回复:http://blog.csdn.net/bluefatty001/article/details/8454760  长见识了..... 我不怎么看那个提示的内容，除了简单的什么少个括号，变量未知之类的.....

user: user-2
content: http://blog.csdn.net/bluefatty001/article/details/8454760

user: user-2
content: 楼主用的是visual studio吧，在debug模式下他会用0xcc填充未初始化的栈内存，用0xcd填充未初始化的堆内存。所以看到你的图上0xcdcdcdcd的地址，就知道是初始化的问题了。

user: user-0
content: 找到原因了，是makehufftree函数中的temp少了一步初始化的操作，指针默认不是空。
user-0 提问: 编译通过，但是出现弹出错误，是关于二叉排序树问题的，小弟先谢谢了

回复:
user: user-0
content: 我的还是不行

user: user-1
content: 没发现，没用VC6不清楚啥情况

user: user-2

user: user-3
content: 楼主把这一句注释掉，看下： #define NULL 0  我刚才在vs2005上试了下，也报错了。 注释掉NULL后就正常。

user: user-4
content: Status InsertBST(BiTree *T,int key){     BiTree p,s;     if(!SearchBST(*T,key,NULL,&p)){         s = (BiTree)malloc(sizeof(BiTree));         s->data = key;         s->lchild = s->rchild =NULL;         if(!p)             *T = s;  把p初始化为NULL

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

user: user-3
content: 代码没问题吧，linux上编译执行没有错误，结果如下：35 37 47 58 62 73 88 93 99
user-0 提问: 求教 C语言怎么替换掉字符串中的所有回车换行符号？

回复:
user: user-1
content: 循环判断每个字符，如果是'\r' 或者 '\n'，则替换掉。

user: user-2
content: //将串s1中的子串s2替换成串s3 char*replace(char*s1,char*s2,char*s3=NULL) {     char *p,*from,*to,*begin=s1;     int c1,c2,c3,c;         //串长度及计数     c2=strlen(s2);     c3=(s3!=NULL)?strlen(s3):0;     if(c2==0)return s1;     //注意要退出     while(true)             //替换所有出现的串     {         c1=strlen(begin);         p=strstr(begin,s2); //出现位置         if(p==NULL)         //没找到             return s1;         if(c2>c3)           //串往前移         {             from=p+c2;             to=p+c3;             c=c1-c2+begin-p+1;             while(c--)                 *to++=*from++;         }         else if(c2<c3)      //串往后移         {             from=begin+c1;             to=from-c2+c3;             c=from-p-c2+1;             while(c--)                 *to--=*from--;         }         if(c3)              //完成替换         {             from=s3,to=p,c=c3;             while(c--)                 *to++=*from++;         }         begin=p+c3;         //新的查找位置     } }

user: user-3
content: 一个一个读，遇见就跳过去。

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

回复:
user: user-1
content: 好吧，看错了

user: user-1
content: 引用 2 楼 weixiaoyu0824 的回复:[quote=引用 1 楼 user-2 的回复:] for(i=0; i<n; i++)         {             scanf("%d%d",&a[i],&b[i]);             re[i] = (a[i]*1.0)/b[i];         } 这里不能直接re[i] = (a[i]*1.0)/b[i];  因为b[i]有可能是0，也就是咖啡豆是免费的。 这是个问题，改了之后还是AC不了。。[/quote]  明显最后for 循环内的判断有问题。

user: user-2
content: 引用 2 楼 weixiaoyu0824 的回复:[quote=引用 1 楼 user-2 的回复:] for(i=0; i<n; i++)         {             scanf("%d%d",&a[i],&b[i]);             re[i] = (a[i]*1.0)/b[i];         } 这里不能直接re[i] = (a[i]*1.0)/b[i];  因为b[i]有可能是0，也就是咖啡豆是免费的。 这是个问题，改了之后还是AC不了。。[/quote] 给你一个测试用例 输入 1 2 5 0 3 1 输出 8.000 另外一个问题就是在OJ中所有运算结果是浮点数的，最好都使用double，不要使用float。有可能是精度的问题。

user: user-0
content: 引用 1 楼 user-2 的回复:for(i=0; i<n; i++)         {             scanf("%d%d",&a[i],&b[i]);             re[i] = (a[i]*1.0)/b[i];         } 这里不能直接re[i] = (a[i]*1.0)/b[i];  因为b[i]有可能是0，也就是咖啡豆是免费的。 这是个问题，改了之后还是AC不了。。

user: user-2
content: for(i=0; i<n; i++)         {             scanf("%d%d",&a[i],&b[i]);             re[i] = (a[i]*1.0)/b[i];         } 这里不能直接re[i] = (a[i]*1.0)/b[i];  因为b[i]有可能是0，也就是咖啡豆是免费的。
user-0 提问: H.264 JM18 丢包

回复:
user: user-0
content: JM设置RDOptimization=3（即rdopt==3）就会报错

user: user-1
content: 我最近也在写一个h264的东西，我也是模拟丢包，有可能和你的需求不一样。。丢包的是时候 关键帧 不能丢。。。。。
user-0 提问: 子函数不能改变实参指针的值那为什么能删除链表节点？

回复:
user: user-1
content: 子函数delete_node(node *head)只是不能改变head的值，但是可以改变head指向区域的值，比如head->next

user: user-2
content: 不能改变指针的值，但可以改变指针指向地址的值。

user: user-3
content: 分清：指针的值和指针指向的地址的值，就明白了

user: user-4
content: 1楼说得对。能删2、3、4；但删不了1

user: user-5
content: 因为子节点是指针的指针。虽然函数不能改变指针，但是能改改指针的指针
user-0 提问: C-free中的“对话框编辑器”有什么作用？

回复:
user: user-1
content: 楼主为什么不用记事本打开.rc文件亲自看看呢？

user: user-0
content: 最好用通俗的方式，一两句话解释明白。

user: user-2
content: 以配置文件的形式存在，然后这个库自己实现了根据配置文件生成界面的代码。其实MFC也是这样。还有duilib都是。
user-0 提问: 求助：关于文本本件读写的问题

回复:
user: user-1
content: 建议：  1. 不要用隐身函数申明 #include <string.h> //memset 2. 类型名和变量名不要用一样的。  //t_str t_str;    t_str  _str;

user: user-0
content: 为什么r+打开就好了？

user: user-2
content: 等你看懂了就不会问这类问题了。

user: user-3
content: 运行了一下第一段代码，很正常，没有问题呀，数据都写进去了。

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

user: user-0
content: 出错的地方全部是0，正确的地方就是ASCII码，还有就是我如果用r+的方式打开就不会出现这个问题，但是不知道为什么  3楼的老师说的我没怎么看懂

user: user-0
content: 我在linux下运行了，还是错的，前一个记录的空间是空白，后一个才是我输入的数据
user-0 提问: 环境高级编程 例子编译不过 mac环境 vim编辑器

回复:
user: user-1
content: 相信楼主已经解决了问题，如果还有小伙伴们遇到一样的问题请移步我的博客http://my.oschina.net/u/2491285/blog/530425 希望能帮到大家。

user: user-2
content: 是链接错误，但http://blog.csdn.net/jackknight/article/details/1746850 给出的方法并不是解决“链接错误”的。 如果你已经下载了APUE整套源码，可以先make一下，会生成静态库；然后编译自己代码的时候用 gcc 的 -l  选项把生成的静态库链接进去就行了。  如果你没有下载整套APUE的源码，建议你就不要用apue.h，不用错误处理，或者用 assert（位于<assert.h>），可以省去不少麻烦

user: user-3
content: 引用 楼主 xiaoyi20081794 的回复:错误原因：     Undefined symbols for architecture x86_64:   "_err_quit", referenced from:       _main in dir.o   "_err_sys", referenced from:       _main in dir.o ld: symbol(s) not found for architecture x86_64 clang: error: linker command failed with exit code 1 (use -v to see invocation) 这个是链接错误，不是函数声明的问题，而是说找不到函数的实现。你需要apueerror.h http://blog.csdn.net/jackknight/article/details/1746850

user: user-0
content: dir.c                                                                                                 1 #include "apue.h"   2 #include<dirent.h> 包含了呀

user: user-4
content: #include "apue.h"  这是作者在其书中所有demo代码中都使用的一个公共头文件，每个Demo编译的时候，还需要连接  他的库文件。这个头文件就是包含了库文件里的公共函数声明。

user: user-4
content: #include "apue.h"
user-0 提问: 多个源文件如何编译？

回复:
user: user-1
content: 1. gcc -o main increment.c negate.c main.c 或者2 gcc -c increment.c gcc -c negate.c  gcc -o main  main.c increment.o negate.o

user: user-2
content: 你的.c文件有没有对应的.h 文件？如果没有，直接在main.c文件里面加上下面这两句 # include <increment.c> # include<negate.c>

user: user-3
content: 或直接在main.c 中调用前，extern int increment( int value ); extern int negate( int value );

user: user-3
content: 新建一个AAA.h文件，里面用extern声明这两个函数，在main.c中包含这个AAA.h文件就可以了。

user: user-4
content: 放一个工程里，Linux下可以gcc -o 自己链接生成的库

user: user-5
content: 放在一个工程里面就可以了

user: user-6
content: 百度一下那跟寫程式的功力無關

user: user-0
content: 1. 分别建立若干个C++ Source File（C++源程序文件），每个文件单独编写、存盘。 2. 建立一个“项目文件”。  选择“文件/新建”菜单，在“新建”对话框中，点击“工程”选项卡下的“win32 console application”（WIN32控制台程序），然后输入工程名称ff和位置C:\ABC\ff，单击“确定”按钮，建立一个空工程ff.c，并单击“完成”后，再单击“确定”按钮。 3. 将源文件放到项目文件中。 选择“工程/增加到工程/文件”菜单，在出现的对话框中，同时选中欲加入到工程中的所有C程序源文件，单击“确定”按钮。 4. 编译、连接项目文件。 单击编译按钮、运行按钮即可。 ********我在第三步过后出来这样的界面****，编译是灰色的，没有办法编译。链接和！都是可以点的。这是什么问题。

user: user-7
content: 加到一个工程里面就可以了。
user-0 提问: git切换分支，之前的修改被带到另一个分支

回复:
user: user-1
content: git stash 然后再切 切回来之后 stash apply

user: user-2
content: 这个问题请问最后怎么解决的？

user: user-3
content: 我也遇到这个问题了，求救

user: user-0
content: 引用 1 楼 user-4 的回复:修改文件后，git status看看当前状态。 大哥，这基础操作我还是会用的，我现在的情况是“git切换分支，之前的修改被带到另一个分支”！

user: user-4
content: 修改文件后，git status看看当前状态。

user: user-4
content: http://blog.csdn.net/liangxiaozhang/article/details/8296069
user-0 提问: 求助：关于费波那契数列转化为for循环的问题！！

回复:
user: user-1
content: 你不能用全局变量f在递归程序中累计。那种正确的写法是因为每次函数只执行一次才没问题的。 把int f=0;移到函数内做局部变量就好了。
user-0 提问: 对于C语言标准头文件是如何编译的？

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

user: user-2
content: 默认链接和没默认链接

user: user-3
content: 每个编译器都有运行时库的。

user: user-4
content: 标准头文件是被包含到.c这样的编译单元中编译的，其中的函数就得引用库

user: user-5
content: 在我的虚拟机上是这些，是C和C++的运行时库，编译器自动会链接到的。 /usr/lib/libc.a /usr/lib/libc.so /usr/lib/gcc/i386-redhat-linux/4.1.1/libstdc++.a /usr/lib/gcc/i386-redhat-linux/4.1.1/libstdc++.so
user-0 提问: 菜鸟求帮忙，求大神指点，文件输入乱码。各种错，

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A
user-0 提问: 请问c头文件函数声明前面这个__MINGW_NOTHROW是什么意思有什么作用？

回复:
user: user-0
content: 引用 11 楼 pochioly 的回复:正如C++03没有decltype的时候，暂时可以用下面的定义替代部分出现，  #define decltype __typeof   但不大可能反过来用decltype来定义__typeof 因为双下划线的约定俗成的含义是（编译器和头文件）系统内部保留的功能， 不一定是标准或者拿得上台面的东西，用标准的东西去定义这些实在是有点多此一举了看懂了，但是又好像么懂，不过还是谢谢~

user: user-0
content: 引用 7 楼 u011761982 的回复:引用 4 楼 skyline_loafer 的回复:[quote=引用 1 楼 u011761982 的回复:] 估计你是windows下安装mingw吧，函数实现需要你自己去下载的，安装后的mingw只有头文件和dll恩恩，是windows下的mingw，大神，谢谢~ps:能再问您一个问题吗，面试官问c中那些情况回导致内存泄露，您能列举一些吗？ 最简单的例子便是用malloc申请一块地址，最后没有调free函数，那块内存就泄露了。 ps:我不是大神[/quote]恩恩，谢谢

user: user-1
content: 正如C++03没有decltype的时候，暂时可以用下面的定义替代部分出现，  #define decltype __typeof   但不大可能反过来用decltype来定义__typeof 因为双下划线的约定俗成的含义是（编译器和头文件）系统内部保留的功能， 不一定是标准或者拿得上台面的东西，用标准的东西去定义这些实在是有点多此一举了

user: user-1
content: 引用 2 楼 user-4 的回复:C++中若一个函数声明后面有 throw ()表示该函数绝对不会抛出异常。因此我猜这个宏是这么定义的：  #define __MINGW_NOTHROW throw()   我猜这个双下划线的并不是用throw这种标准用法定义的，这么理解可以但方向错了 比如如果在某个时期gcc版本够低，没有实现throw关键字，但实现了特殊的属性， 那么会利用这个属性来#define throw，而不会是反过来用throw来#define __MINGW_NOTHROW  事实上他的定义是gcc特色的属性，也就是__attribute__ ((__nothrow__))

user: user-2
content: 引用 6 楼 skyline_loafer 的回复:引用 3 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。哦，我用的codeblocks，所以么有，，，， windows下建议用VS，是最好的IDE，没有之一

user: user-2
content: 引用 4 楼 skyline_loafer 的回复:引用 1 楼 u011761982 的回复:估计你是windows下安装mingw吧，函数实现需要你自己去下载的，安装后的mingw只有头文件和dll恩恩，是windows下的mingw，大神，谢谢~ps:能再问您一个问题吗，面试官问c中那些情况回导致内存泄露，您能列举一些吗？ 最简单的例子便是用malloc申请一块地址，最后没有调free函数，那块内存就泄露了。 ps:我不是大神

user: user-3
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:VS IDE中，在不明白的符号上点鼠标右键，选转到定义。哦，我用的codeblocks，所以么有，，，，

user: user-0
content: 引用 2 楼 user-4 的回复:C++中若一个函数声明后面有 throw ()表示该函数绝对不会抛出异常。因此我猜这个宏是这么定义的：  #define __MINGW_NOTHROW throw() 哦哦，我想想大概也是这样的，谢谢~

user: user-0
content: 引用 1 楼 u011761982 的回复:估计你是windows下安装mingw吧，函数实现需要你自己去下载的，安装后的mingw只有头文件和dll恩恩，是windows下的mingw，大神，谢谢~ps:能再问您一个问题吗，面试官问c中那些情况回导致内存泄露，您能列举一些吗？

user: user-4
content: C++中若一个函数声明后面有 throw ()表示该函数绝对不会抛出异常。因此我猜这个宏是这么定义的：  #define __MINGW_NOTHROW throw()

user: user-2
content: 估计你是windows下安装mingw吧，函数实现需要你自己去下载的，安装后的mingw只有头文件和dll
user-0 提问: 求助。形参和实参？

回复:
user: user-1
content: 一个传递的是指针，一个传递的是值。

user: user-2
content: 不客气，慢慢学。c语言把概念弄清楚了才能很好的使用。不要飞，不然你后面写的程序绝对是一堆BUG。

user: user-0
content: 引用 1 楼 hhhhhhhhhhkkkkkkkkkk 的回复:你应该好好看一下C语言的地址传递与值传递的区别。 第一个例子传给自定义函数的是地址，而第二个例子传的只是值。 给函数传递地址，相当于别人直接在你家的地皮上弄东西（比如拆掉房子什么的，你就没房子住了），这样你家的地皮上的东西就会被改变； 而传递值，则只是将地址处的值复制一份给别人用，地址处的值是不受影响的，相当于别人在另一个地皮上照着你家地皮上的所有东西（如房子什么的）仿制了一份，然后他对仿制的那些东西进行操作（比如拆掉什么的），你家地皮上的东西当然是不会被他动的啊。 谢谢了。我刚刚开始看c，还没有看到指针，所以不理解，这下看了下你的解释，就相当痛快了，可是郁闷我一上午了。哈哈多谢

user: user-3
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对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解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-2
content: 如果你将第二个例子的自定义函数改成 void f(int*a,int*b)  {int c;  c=*a;*a=*b;*b=c;  } 这样在这个函数里对参数的操作就就相当于改变了传进来的变量，因为*号表示传递实参的地址。也就是你授权别人在你家的地皮上弄东西（比如一把火烧掉你家地皮上的房子什么的）。

user: user-2
content: 你应该好好看一下C语言的地址传递与值传递的区别。 第一个例子传给自定义函数的是地址，而第二个例子传的只是值。 给函数传递地址，相当于别人直接在你家的地皮上弄东西（比如拆掉房子什么的，你就没房子住了），这样你家的地皮上的东西就会被改变； 而传递值，则只是将地址处的值复制一份给别人用，地址处的值是不受影响的，相当于别人在另一个地皮上照着你家地皮上的所有东西（如房子什么的）仿制了一份，然后他对仿制的那些东西进行操作（比如拆掉什么的），你家地皮上的东西当然是不会被他动的啊。
user-0 提问: 学编程没多久，问下POJ上的1001题，帮我看下哪出错了

回复:
user: user-0
content: 引用 1 楼 slx_391987 的回复:大数乘法，用数组存储，用累加法替换乘法。  我看楼主貌似是这样实现的。  可能进位没有处理好吧。 进位没有什么问题吧，关键每次都 说running time error

user: user-1
content: 大数乘法，用数组存储，用累加法替换乘法。  我看楼主貌似是这样实现的。  可能进位没有处理好吧。
user-0 提问: vs调试出现问题，求各位大牛帮忙看看有没有解决的办法

回复:
user: user-1
content: 应该是你建的工程类型不对，看下是不是建成win32项目什么的了，那里面是用不了_tmain的。你要用_tmain就建成控制台应用程序。这样就不会出错了。

user: user-2
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 如何给自己的代码做自动化测试？

回复:
user: user-1
content: 主要看你做的程序的类型，如果是数据输入 处理 输出 ，那么自动测试就只是动手的问题。

user: user-2
content: 自己写,又不太难

user: user-3
content: 最好有个测试框架，我们用的google的gtest

user: user-4
content: 自己写个bat批处理应该不是很难。 把输入保存在input.txt test.exe < input.txt > output.txt 还可以把预期的输出结果保存到correct_output.txt，然后找个windows的diff工具自动比较

user: user-4
content: 我们公司就有这么一套东西，每次有人提交代码就会自动运行，从某个脚本读取输入，把结果输出到文件，再和标准结果diff，如果不一样就会给N多人发邮件

user: user-0
content: 最好是在window平台的方法工具，我用的开发环境是vs2010
user-0 提问: linux环境，获取函数参数类型

回复:
user: user-1
content: pc-lint +1

user: user-2
content: Tiny C Compiler是开源的。

user: user-2
content: 楼主有这功夫，建议不如去学习学习pc-lint怎么用吧。

user: user-2
content: 请问楼主： 如果我或将来有人将  if((n=func(a,b,c))!=0) 写为  if((n=func(     a,     b,     c ))!=0) ，你用grep还能查询吗？！ 另外，如果func(a,func1(b,func2(c)))呢？！！  所以没有类似C/C++编译器这种金刚钻，还是别揽这种瓷器活了。

user: user-3
content: 来学习的，谢谢各位了！

user: user-2
content: 不听老人言，吃亏在眼前。

user: user-0
content: 我说的可能不够详细，各位误会我的意思了。 linux环境中，我用grep查询一个函数，比如说func函数 查询出来的结果是： /home/cbs/src/...../abc.c:150:  if((n=func(a,b,c))!=0) ....... 把grep结果改一下，改成这样，应该能懂吧。 意思就是说func函数是我调用的，我需要知道函数调用里面的参数类型，用以和原函数参数类型做对比，检测函数调用是否正确。

user: user-4
content: 没这个搞过，这个应该是依赖定义的吧！通过大小也只能大致一个范围 python里也是通过typeid可以获取

user: user-2
content: 参考Tiny C Compiler

user: user-5
content: 引用 10 楼 cvictor 的回复:[quote=引用 9 楼 It_way 的回复:] 为什么不直接在 .h 文件中 grep。 在函数声明的时候肯定有类型。 这个func（a,b,c）函数是函数调用，原函数是定义在别的地方 [/quote] 你要问题是不知道 func(a,b,c) 在哪个 .h 文件中声明的？我觉得在工程路径下面 find . -name *.h | xargs grep func 应该可以吧，你试试

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:参考Tiny C Compiler 还有个问题是，使用TCC那么可移植性就不好了，我做的是一个检测函数工具，如果要用TCC，那么其他人用我这个函数的时候是否也需要安装TCC呢

user: user-0
content: 引用 9 楼 It_way 的回复:为什么不直接在 .h 文件中 grep。 在函数声明的时候肯定有类型。 这个func（a,b,c）函数是函数调用，原函数是定义在别的地方

user: user-5
content: 为什么不直接在 .h 文件中 grep。 在函数声明的时候肯定有类型。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:参考Tiny C Compiler 赵4老师，又见面了！ 能详细说说么，比如通过TCC编译器如何解决我所提到的问题，或者我需要学习一下TCC里面哪些方向的内容？ 谢谢！！！

user: user-0
content: 多谢楼上几位回答，不过没有提出有建设性的建议啊，哎！

user: user-6
content: linux环境美有用过。 以下是个人在windows下的经验，不知道能不能用的上。。。 不过只要找到头文件就可以了啊，看原型。如果头文件难找。那么，随便填几个类型的数进去，编译失败的时候会有提示应当是什么类型的吧？

user: user-7
content: c++里面用typeid关键字可以变相获取，c里面就不知道了。 如果非要用c，只能查找头文件了。

user: user-8
content: 这个有点难度。需要在本文件以及包含的所有头文件以及这些头文件嵌套包含的头文件找func的声明。这又涉及到去哪里找头文件，也就是头文件包含路径、gcc的-I选项参数。找到之后需要判断是不是合法的函数声明，如果找到不只一个声明互相冲突了怎么办。 总之，编译器怎么做的，你就需要怎么做了。
user-0 提问: #define N 1和#define N (1)有什么区别

回复:
user: user-1
content: 安全。。。。

user: user-2
content: 引用 1 楼 zhao4zhong1 的回复:编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E 理解和讨论之前请先学会如何观察！

user: user-3
content: 两个都对，使用代括号的不会出现歧义，是一种好习惯

user: user-4
content: 带上括号是比较好的一种习惯。因为宏定义就是简单的文本替换，展开后没有括号的话有的情况下就会出现违背意愿的代码

user: user-5
content: 这个没区别，定义四则混合运算就不同了。

user: user-6
content: 预编译指令（宏定义）的原理是字符替换，你只要想下两种形式的预编译指令（宏定义）替换后有没有主义差别就行了，你所提到的两种形式的宏定义，由于1是常量，所以加不加括号都无所谓，只是第一种形式更加简洁 对含参数的宏定义才需要括号，而且对每一个参数都需要加括号，最后在给整个表达式加个括号，如  #define ADD(a, b) ((a) + (b))

user: user-7
content: 引用 2 楼 jerry_dqh 的回复:你这样的情况基本没有什么区别，更多的是习惯问题。 对于定义复杂的一些情况就有区别了，比如  define N   a+b define N  (a+b)  这样就会有区别，就像N*c，展开后a+b*c,第二种展开后(a+b)*c, 正解，区别明显大大的。

user: user-8
content: 你这样的情况基本没有什么区别，更多的是习惯问题。 对于定义复杂的一些情况就有区别了，比如  define N   a+b define N  (a+b)  这样就会有区别，就像N*c，展开后a+b*c,第二种展开后(a+b)*c,

user: user-2
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E
user-0 提问: [C]关于打印浮点数，求解惑

回复:
user: user-0
content: 谢谢楼上各位解惑

user: user-1
content: 表示显示最小的位数，如果格式化后的输出小于这个长度，则用空格或0补齐长度；如果输出大于这个长度，则它不起作用。 因此输出长度不会比1小，因此这里的1不起作用。 C标准总的说明: An optional minimum field width. If the converted value has fewer characters than the field width, it is padded with spaces (by default) on the left (or right, if the left adjustment flag, described later, has been given) to the field width.

user: user-2
content: 格式控制符m.n，m表示输出数据宽度，n表示数据精度 1.2f是非法的，小数点前的数字必须大于小数点后的数字

user: user-3
content: 表示输出的宽度。比如下边的代码 	float f = 3.1415926f; 	printf("%5.2f\n" ,f); 输出的3.14前边会有一个空格，保证整个输出占5个宽度。
user-0 提问: 求大神帮小弟写个小得不能再小的程序= =

回复:
user: user-1

user: user-2
content: 仅供参考：//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //

user: user-0
content: 楼上求私信原C代码= =

user: user-3
content: 1.把12个数放到4个数组中，a[0],a[1],a[2],a[3] 2.对列号012做全排列 3.对行号0－3做全排列，针对每一个排列，按相应的顺序输出数组 比如得到一个排列是2013，则输出a[2],a[0],a[1],a[3] 在输出数组时，使用列的排列进行输出 比如列号排列为120，则在输出a[0]时顺序为a[0][1], a[0][2], a[0][0] 循环完成就得到你想到的结果了  感觉这个题目就是对1-12做一个全排列
user-0 提问: size_t是如何增强程序的可移植性的？

回复:
user: user-1
content: 赵老湿说的就是例子啊，比如定义结构体里面用size_t。

user: user-0
content: 引用 7 楼 ForestDB 的回复:你自己的陈述就是例子。  如果不用size_t，在机器A上你得写unsigned int；在机器B上你得写unsigned long…… 有了size_t，不管哪个机器，你直接写size_t就行了，你总可以得到“最大无符号数”这个类型，而不用自己去操心。  明白了。谢谢了啊，有点钻牛角尖了可能

user: user-2
content: 你自己的陈述就是例子。  如果不用size_t，在机器A上你得写unsigned int；在机器B上你得写unsigned long…… 有了size_t，不管哪个机器，你直接写size_t就行了，你总可以得到“最大无符号数”这个类型，而不用自己去操心。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:32位： typedef unsigned int size_t; 64位： typedef unsigned __int64 size_t;  定义是没错，但是对移植性的影响是什么呢？赵老师方便的话能举个例子吗

user: user-0
content: 引用 1 楼 user-5 的回复:这个通常用于系统API，关于内存操作的通常都是size_t，因为64和32位支持的地址范围不同，就像void *malloc(size_t size);一样，之所以不是int size或者uint64_t size，就是因为这是平台相关的。  那为什么不都用long unsigned int呢，long unsigned int不也是平台相关的吗，干嘛要多定义个size_t？在32位系统中，字节数为4字节；在64位系统中，Visual C++和Mingw64字节数为4字节。GCC（POSIX系统以及Cygwin）为8字节。

user: user-3
content: 32位： typedef unsigned int size_t; 64位： typedef unsigned __int64 size_t;

user: user-4
content: 学习了，

user: user-5
content: 这个通常用于系统API，关于内存操作的通常都是size_t，因为64和32位支持的地址范围不同，就像void *malloc(size_t size);一样，之所以不是int size或者uint64_t size，就是因为这是平台相关的。
user-0 提问: c语言while循环

回复:
user: user-1
content: 因为你按提示输入最大值后会按下enter键，如果在 scanf("%c",&c)前getchar()的话，getchar()就会接收你刚才按下的enter键字符，之后再输入y、n就能正常运行，但是当你注释掉 scanf("%c",&c)前getchar()后，这个enter键字符就会被scanf("%c",&c)执行，从而c字符接收的就是enter字符了，再与c == 'y'比较当然不相等了

user: user-2
content: scanf出错了，程序有异常，直接返回
user-0 提问: C题目，求答案解释，小白我看不懂

回复:
user: user-0
content: 引用 1 楼 user-1 的回复: #include <stdio.h>  int main(void) { 	int A, B, K, bA, bB, b, bits, temp; 	while (1) 	{ 		printf("请输入三个正整数（前两个数小于10000，第三个数不超过8，各数之间用空格隔开，若前两个数都为零则退出程序）：\n"); 		scanf("%d %d %d", &A, &B, &K);//如果VS勾选了SDL，就把scanf换成scanf_s 		if (A < 0 || B < 0 || A > 10000 || B > 10000 || K < 1 || K > 8) 		{ 			printf("输入错误！\n"); 			continue; 		} 		else if (A == 0 && B == 0) 			break; 		else 		{ 			temp = A > B ? A : B; 			bits = 1; 			while (temp >= 10) 			{ 				temp /= 10; 				++bits; 			} 			b = 1; 			for (int i = 1; i < K; i++) 				b *= 10; 			bA = (A / b) % 10; 			bB = (B / b) % 10; 			if (bA == bB && K <= bits) 				printf("-1\n"); 			else 				printf("%d\n", A + B); 		} 	} 	return 0; } 0%100分

user: user-1
content: #include <stdio.h>  int main(void) { 	int A, B, K, bA, bB, b, bits, temp; 	while (1) 	{ 		printf("请输入三个正整数（前两个数小于10000，第三个数不超过8，各数之间用空格隔开，若前两个数都为零则退出程序）：\n"); 		scanf("%d %d %d", &A, &B, &K);//如果VS勾选了SDL，就把scanf换成scanf_s 		if (A < 0 || B < 0 || A > 10000 || B > 10000 || K < 1 || K > 8) 		{ 			printf("输入错误！\n"); 			continue; 		} 		else if (A == 0 && B == 0) 			break; 		else 		{ 			temp = A > B ? A : B; 			bits = 1; 			while (temp >= 10) 			{ 				temp /= 10; 				++bits; 			} 			b = 1; 			for (int i = 1; i < K; i++) 				b *= 10; 			bA = (A / b) % 10; 			bB = (B / b) % 10; 			if (bA == bB && K <= bits) 				printf("-1\n"); 			else 				printf("%d\n", A + B); 		} 	} 	return 0; }
user-0 提问: 好多问题啊，赵老师求救

回复:
user: user-1
content: +1

user: user-2
content: for (i = 1; i<MAXCHAR; ++i) 		if (cc[c]>maxvalue) 			maxvalue = cc[i];  第二行 cc[c] 应该是cc[i]

user: user-3
content: #include<stdio.h> #include<ctype.h> #define MAXHIST   15 #define MAXCHAR  128 int main() { 	int c, i, cnt = 0; 	int len; 	int maxvalue; 	int cc[MAXCHAR]; 	 	for(i=0;i<MAXCHAR;++i)    //initize the array 		cc[i] = 0; 	while((c = getchar())!=EOF) 		if(c < MAXCHAR) 			++cc[c]; 	maxvalue = 0; 	for(i=1; i < MAXCHAR; ++i) 		if(cc[i] > maxvalue)    //error may be here!  			maxvalue = cc[i]; 	for(i=1; i<MAXCHAR; ++i) 	{ 		if(isprint(i)) 			printf("%5d -  %c - %5d :",i,i,cc[i]); 		else 			printf("%5d - - %5d : ",i,cc[i]); 		if(cc[i] > 0) 		{ 			if((len = (int)cc[i]*MAXHIST/maxvalue) >= 0) 			len = 1; 		} 		else 			len = 0; 		while(len > 0) 		{ 			putchar('*'); 			--len; 		} 		putchar('\n'); 	} 	return 0; }

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

user: user-5
content: for(i=1;i<MAXCHAR;++i) if(cc[c]>maxvalue) maxvalue=cc[i];  你把c和i搞混了，判断条件应该是if(cc[i]>maxvalue)
user-0 提问: Array_game

回复:
user: user-1
content: 既然是数字，你可以把字符转换成数字！而且A-Z也可以有对应的数字的，所以下面的不会有影响。再说char/wchar_t中有两个字符是有问题的吧……抑或把字符换成字符串

user: user-2
content: wchar_t  的問題
user-0 提问: 将文件存入数组的问题

回复:
user: user-1
content: cout<<(int)fileinput.tellg();

user: user-0
content: 引用 1 楼 user-2 的回复:char data[10][20]  改过来了，不过读进去的数据还是不对，感觉是串行了，但我不知道哪里的问题

user: user-2
content: char data[10][20]
user-0 提问: 求教Linux线程的结合状态和分离状态

回复:
user: user-0
content: 引用 5 楼 KuaiPengFei_ 的回复:[quote=引用 3 楼 hpoor 的回复:] [quote=引用 2 楼 KuaiPengFei_ 的回复:] 创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收（退出状态码），所以创建线程者应该调用pthread_join来等待线程运行结束，并可得到线程的退出代码，回收其资源（类似于wait,waitpid) 但是调用pthread_join(pthread_id)后，如果该线程没有运行结束，调用者会被阻塞，在有些情况下我们并不希望如此，比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候，主线程并不希望因为调用pthread_join而阻塞（因为还要继续处理之后到来的链接），这时可以在子线程中加入代码 pthread_detach(pthread_self()) 或者父线程调用 pthread_detach(thread_id)（非阻塞，可立即返回） 这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源 我想描述的就是你说的这种情形，抱歉我描述不清楚。 有个问题，加入pthread_detach后，pthread_join这个函数还需要加上吗？ 还有我加入pthread_detach后，那个线程函数中存在死循环，这种情形程序会怎么处理？一直执行死循环，不释放资源吗。还是执行一次或者限定的次数再释放资源呢？[/quote]  线程的状态就改变了。 pthread_join这个函数不需要了  死循环是肯定不行的，自己在代码里面加死循环的时候就要知道什么时候可以退出  。[/quote]  好的，我知道了。谢谢你了

user: user-1
content: 引用 3 楼 hpoor 的回复:[quote=引用 2 楼 KuaiPengFei_ 的回复:] 创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收（退出状态码），所以创建线程者应该调用pthread_join来等待线程运行结束，并可得到线程的退出代码，回收其资源（类似于wait,waitpid) 但是调用pthread_join(pthread_id)后，如果该线程没有运行结束，调用者会被阻塞，在有些情况下我们并不希望如此，比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候，主线程并不希望因为调用pthread_join而阻塞（因为还要继续处理之后到来的链接），这时可以在子线程中加入代码 pthread_detach(pthread_self()) 或者父线程调用 pthread_detach(thread_id)（非阻塞，可立即返回） 这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源 我想描述的就是你说的这种情形，抱歉我描述不清楚。 有个问题，加入pthread_detach后，pthread_join这个函数还需要加上吗？ 还有我加入pthread_detach后，那个线程函数中存在死循环，这种情形程序会怎么处理？一直执行死循环，不释放资源吗。还是执行一次或者限定的次数再释放资源呢？[/quote]  线程的状态就改变了。 pthread_join这个函数不需要了  死循环是肯定不行的，自己在代码里面加死循环的时候就要知道什么时候可以退出  。

user: user-0
content: 引用 1 楼 KuaiPengFei_ 的回复:pthread_join(tid); 去掉了试试，不太明白的意思，但是程序就是在创建一个线程之后停在了这里！ pthread_join去掉后是可以的，但是这样好像不释放资源，而且一直创建新的线程，会耗尽内存空间吧

user: user-0
content: 引用 2 楼 KuaiPengFei_ 的回复:创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收（退出状态码），所以创建线程者应该调用pthread_join来等待线程运行结束，并可得到线程的退出代码，回收其资源（类似于wait,waitpid) 但是调用pthread_join(pthread_id)后，如果该线程没有运行结束，调用者会被阻塞，在有些情况下我们并不希望如此，比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候，主线程并不希望因为调用pthread_join而阻塞（因为还要继续处理之后到来的链接），这时可以在子线程中加入代码 pthread_detach(pthread_self()) 或者父线程调用 pthread_detach(thread_id)（非阻塞，可立即返回） 这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源 我想描述的就是你说的这种情形，抱歉我描述不清楚。 有个问题，加入pthread_detach后，pthread_join这个函数还需要加上吗？ 还有我加入pthread_detach后，那个线程函数中存在死循环，这种情形程序会怎么处理？一直执行死循环，不释放资源吗。还是执行一次或者限定的次数再释放资源呢？

user: user-1
content: 创建一个线程默认的状态是joinable, 如果一个线程结束运行但没有被join,则它的状态类似于进程中的Zombie Process,即还有一部分资源没有被回收（退出状态码），所以创建线程者应该调用pthread_join来等待线程运行结束，并可得到线程的退出代码，回收其资源（类似于wait,waitpid) 但是调用pthread_join(pthread_id)后，如果该线程没有运行结束，调用者会被阻塞，在有些情况下我们并不希望如此，比如在Web服务器中当主线程为每个新来的链接创建一个子线程进行处理的时候，主线程并不希望因为调用pthread_join而阻塞（因为还要继续处理之后到来的链接），这时可以在子线程中加入代码 pthread_detach(pthread_self()) 或者父线程调用 pthread_detach(thread_id)（非阻塞，可立即返回） 这将该子线程的状态设置为detached,则该线程运行结束后会自动释放所有资源

user: user-1
content: pthread_join(tid); 去掉了试试，不太明白的意思，但是程序就是在创建一个线程之后停在了这里！
user-0 提问: 16进制转换成字符串

回复:
user: user-1
content: 1楼代码是错的。

user: user-1
content: char bin[50] = {0xab,0xbc,0xcd}; char str[100]; for (i = 0; i < 3; i++) {     sprintf(str+i*2,"%02X",(unsigned char)bin[i]); }

user: user-0
content: 引用 1 楼 piaobotudou 的回复:char buf[10]; char bin[50] = {0xab,0xab,0xbc,0xcd}; char str[100] = {0}; int len = strlen(bin); int i; for (i = 0; i < len; i++) {        sprintf(buf,"%.2x",(unsigned char)bin[i]);         strcat(str,buf); }     return 0; 多谢指点

user: user-2
content: char buf[10]; char bin[50] = {0xab,0xab,0xbc,0xcd}; char str[100] = {0}; int len = strlen(bin); int i; for (i = 0; i < len; i++) {        sprintf(buf,"%.2x",(unsigned char)bin[i]);         strcat(str,buf); }     return 0;
user-0 提问: 返回参数地址的问题~请大神乱入~

回复:
user: user-0
content: 第一张图的p应该是函数里面x的地址吧？

user: user-1
content: 引用 2 楼 magic_ggyy 的回复:x在函数里应该是个临时变量吧？那*p之所以打印出来是10 是因为打印出来的是临时变量x的值吧？ 所谓临时变量，就是说该地址(也就是p指针，fct里面x的地址)只有在fct这个函数里面才有效，fct返回了之后就可能失效了。 参数地址是在栈上，函数返回之后，你的第一个例子的栈暂时还没有别人用过，所以还能得到上次的值。 而第二个例子中间多了两个cout<<的调用，栈上的临时变量的地址被他们覆盖了，所以10这个值也就不存在了。 打个比方，从硬盘上删除一个文件，马上恢复运气好的话还能恢复回来。时间长了被覆盖了之后就没法恢复了。

user: user-0
content: 第二张图为什么打印出来的*p的值又变了呢？

user: user-0
content: x在函数里应该是个临时变量吧？那*p之所以打印出来是10 是因为打印出来的是临时变量x的值吧？
user-0 提问: 定义宏#define PRINT() printf("填什么？")，调用PRINT();PRINT();可打印出23

回复:
user: user-1
content: 没看懂的配熬过

user: user-2
content: 哈哈哈哈哈... 大嘴你改卖菜刀肯定有前途。

user: user-3
content: 引用 13 楼 DelphiGuy 的回复:大嘴这个代码可行，就是有位置依赖，如果PRINT();PRINT();之类的就是BUG了。 刚被给出可实现的代码，就立马改需求的人会被码农在心里杀一万遍不止！

user: user-4
content: 函数形式的宏定义？  #include <stdio.h> #define PN(a) printf("%d\n", (a))  int main(void) { 	PN(23); 	PN(31);  	getchar(); 	return 0; }

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

user: user-3
content: 引用 18 楼 DelphiGuy 的回复:哈哈哈哈哈... 大嘴你改卖菜刀肯定有前途。

user: user-3
content: #include <stdio.h> #define PRINT() printf("%d",__LINE__-2) int main(){     PRINT();     PRINT();     return 0; } //23

user: user-0
content: 引用 10 楼 DelphiGuy 的回复:就是编码问题，使用wprintf。 不解，请详细讲一下！

user: user-5
content: 这操蛋的代码

user: user-2
content: 大嘴这个代码可行，就是有位置依赖，如果PRINT();PRINT();之类的就是BUG了。

user: user-0
content: 引用 5 楼 brookmill 的回复:[quote=引用 3 楼 wangmm2008 的回复:] [quote=引用 2 楼 brookmill 的回复:] #define PRINT() printf("23\r") 这个好像打印不出来呀，是不是我写的代码有问题？  #include <stdio.h> #define PRINT() printf("23\r") int main(){     PRINT();     PRINT(); } [/quote] 代码没问题，我用gcc和VS2013都试了，可以打出来[/quote] 终端里面运行没有输出，vim里面:!a运行输出23

user: user-0
content: 引用 5 楼 brookmill 的回复:[quote=引用 3 楼 wangmm2008 的回复:] [quote=引用 2 楼 brookmill 的回复:] #define PRINT() printf("23\r") 这个好像打印不出来呀，是不是我写的代码有问题？  #include <stdio.h> #define PRINT() printf("23\r") int main(){     PRINT();     PRINT(); } [/quote] 代码没问题，我用gcc和VS2013都试了，可以打出来[/quote] 我用gcc，没有打印东西出来

user: user-6
content: 引用 3 楼 wangmm2008 的回复:[quote=引用 2 楼 brookmill 的回复:] #define PRINT() printf("23\r") 这个好像打印不出来呀，是不是我写的代码有问题？  #include <stdio.h> #define PRINT() printf("23\r") int main(){     PRINT();     PRINT(); } [/quote] 代码没问题，我用gcc和VS2013都试了，可以打出来

user: user-0
content: 引用 1 楼 jerry_dqh 的回复:可能是编码的原因，宏的用法并没有问题。 这是个笔试题，就让写宏定义中printf()怎么写

user: user-0
content: 引用 2 楼 brookmill 的回复:#define PRINT() printf("23\r") 这个好像打印不出来呀，是不是我写的代码有问题？  #include <stdio.h> #define PRINT() printf("23\r") int main(){     PRINT();     PRINT(); }

user: user-6
content: #define PRINT() printf("23\r")

user: user-7
content: 可能是编码的原因，宏的用法并没有问题。

user: user-2
content: 就是编码问题，使用wprintf。

user: user-8
content: 引用 2 楼 brookmill 的回复:#define PRINT() printf("23\r") 为什么只打印出一个23呢，不是两个PRINT么

user: user-9
content: 换个写法应该就行了  #define PRINT() printf("\r23")
user-0 提问: 请教

回复:
user: user-1
content: 1、将矩阵看做二值图像； 2、获得二值图像的水平投影和垂直投影； 3、对两个投影曲线取同一位置，且相邻波峰间距也相同的一段； 4、得到求最大间距，然后将转换成方阵边长
user-0 提问: 关于 const char *const buf;请问buf这个变量该如何初始化呢？

回复:
user: user-1
content: 初始化是一开始在声明时就同时赋的值，怎麽搞都可以。  在声明後，再赋值就不行了。

user: user-2
content: 这个声明的意思是，不许修改buf指向的内容(第一个const)，buf初始化之后不许指向其他地址(第二个const) 只要满足这两个条件，怎么初始化都行。 从语法上来说这样应该也可以  const char *const buf = malloc(100); 但是这样没什么意义因为没法修改buf的内容

user: user-0
content: 我试试呵呵。

user: user-2
content: const char *const buf = "abc";
user-0 提问: 树

回复:
user: user-1
content: 仅供参考#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }
user-0 提问: x-r*(360-x)*S=360*R*sin(x)怎么解

回复:
user: user-1
content: 仅供参考//用C语言编程，求出2^x=x^10这个方程的解。 #include <math.h> #include <stdio.h> double x,e; void main () {     x=-1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x);      x=1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x); }

user: user-2
content: 用牛顿迭代法，到两次迭代解的差小于给定的误差为止。

user: user-0
content: 求 sin(x)
user-0 提问: 请问C语言如何获取文件中不定长的字符串

回复:
user: user-0
content: 非常感谢大家的帮助 问题已解决

user: user-1
content: strlen + malloc

user: user-2
content: 仅供参考//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-3
content: 这还不简单吗，倒起来查找逗号啊。

user: user-4
content: 还得包含string.h头文件

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <ctype.h> #define BUFSIZE 1024  int main(void) { 	const char filename[] = "D:\\test.txt"; 	FILE *fp; 	char buf[BUFSIZE]; 	char ch; 	int i; 	 	fp = fopen(filename, "r"); 	if (fp == NULL) 	{ 		fprintf(stderr, "Failed to open file %s", filename); 		exit(EXIT_FAILURE); 	}   	while (fgets(buf, BUFSIZE, fp) != NULL) 	{ 		for (i = 0; i < strlen(buf); ++i) 		{ 			if (isdigit(buf[i]) && i > 0 && buf[i - 1] == ',') 			{ 				buf[i - 1] = '\0'; 			} 		}  		printf("name: %s\n", buf); 	}  	getchar(); 	return 0; }

user: user-5
content: 可以用strcok()将字符串分割，然后判断分割后的字符串的第一个字符，得到是否是name。

user: user-6
content: 把整串字符串读取下来，然后遍历字符串，根据逗号的位置来截取字符串。 不定长的字符串，你可以使用malloc动态分配。
user-0 提问: 无法输出中文字符串

回复:
user: user-1
content: 引用 2 楼 gaoce227 的回复:ok了 ，貌似vi编码的问题 UI?VI？ 设置本地字符环境吧？

user: user-0
content: ok了 ，貌似vi编码的问题

user: user-2
content: char 是asccii码，不能输出汉字
user-0 提问: 请各位路过看下指点指点

回复:
user: user-1
content: Linux下不知道。 Windows下参考API ReadDirectoryChangesW和Microsoft SDK\samples\winbase\IO\fWatch\*.*

user: user-2
content: 太難了還沒學到說

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:man 不是，赵老师，我想用强制锁这种机制来响应一个进程打开一个文件的事件，具体就是对文件进行打开或者读的操作，内核会响应该事件并且发送信号给持有锁的进程，但是现在代码写完了遇到了一个问题，当我鼠标双击文件所在的目录的时候，内核也会向拥有锁的进程发送信号，不知道fcntl怎么可以屏蔽打开目录这件事，或者说双击目录的时候，对该目录下的文件做了哪些动作，真的是打开了目录下的所有文件吗？网上找了好长时间的资料都没有涉及的，请赵老师赐教啊！！谢谢赵老师了先

user: user-1
content: man
user-0 提问: 有关字符输出问题 const char* str="\x56\x78\x12\x34"; printf("%x",*(int*)str);

回复:
user: user-1
content: char*p2="abcdef";为什么这个输出是abcdef呢？菜鸟求指教。。。

user: user-0
content: 都那么晚睡。。。。谢谢啦

user: user-2
content: 一般的32位和64位编译器，int都是4个字节。某些古老的编译器可能是2字节。 const char* str="\x56\x78\x12\x34";  // str指向一块内存，它的前4个字节依次是0x56, 0x78, 0x12, 0x34 printf("%x",*(int*)str);  // 把str指向的内存的4个字节按照int格式输出。小端系统会把字节顺序反过来，输出0x34127856；大端系统保持字节顺序，输出0x56781234。

user: user-2
content: 一个类似的例子： char str[] = { 0x56, 0x78, 0x12, 0x34 };         printf("%x",*(int*)str);  // 小端系统输出0x34127856，大端系统输出0x56781234
user-0 提问: C 函数值赋予传递的问题?

回复:
user: user-0
content: 我主要是要获取 sprintf 这个格化输出的字符串值，在其它的的函数中，使用，刚开始没想到用，可以用全局变量来定义，更简单  谢谢了  二楼的方法也可以，只要稍修改一下就可以了，  static char * conn_rsp_timer_fn(unsigned long arg) { static char name[512]; ............. }  int conn_free(struct conn *conn)  {      char *IP =  conn_rsp_timer_fn(arg);      printk("Client IP %s",IP);        .............................  }

user: user-1
content: 随便定义一个全局变量就可以解决这个问题？你有什么困难吗啡

user: user-2
content: 找个test.h 头文件定义全局变量  extern char name[];  test.c 头部定义 char name;  OK了。。可以在任意函数里调用这个定义的值的，     sprintf(name,"取到名：%s",conn->session->initiator_name);   收工

user: user-0
content: 有没有类于shell 这样的可以定义全局变量这样更新比如在代码顶部：  定义: char *name[];  这样name 这个就可供所有函数里调用的值 谢谢

user: user-0
content: conn_rsp_timer_fn(unsigned long arg , char *name)  编译报错char*name

user: user-3
content: 可以给conn_rsp_timer_fn函数增加一个char * 形参，作为一个输出参数，然后在conn_free 中也增加一个char *形参，作为输入参数来调用，简单示例如下： conn_rsp_timer_fn(unsigned long arg , char *name)  ... conn_free(struct conn *conn ,char *ip) ...  使用时： char name[200]  = {0};  conn_rsp_timer_fn(xx ,name); conn_free(xx ,name);
user-0 提问: connect阻塞问题

回复:
user: user-1
content: 如果该程序只有一个主线称的话，当然会没反应，程序阻塞在connect,你通过IP和port去登录程序，程序已经没去鸟这个连接。试试多线程

user: user-2
content: 如果是单独创建一个线程去connect就不会有这问题，怀疑是主线程去connect，此时消息阻塞，肯定没反应了。

user: user-3
content: 你发出connect的代码是C代码还是php代码？ 管理界面是用什么框架/服务器的？ 有多少是开源的，有多少是你不方便透露的？  目前根本猜不出你的程序究竟在干什么。

user: user-4
content: 服务器绑定了ip和端口，允许连接之后客户端才能反问。
user-0 提问: 请问这个C程序那里出错了？

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-1
content: 请判断scanf的返回值。

user: user-2
content: gcc报错，我也不懂expected ‘=’, ‘,’, ‘;’, ‘asm’ or ‘__attribute__’ before ‘<’ token

user: user-3
content: 用VC6.0 我也沒出現問題喔 #define ms 60 建議最好改成 #define MS 60

user: user-4
content: 引用 2 楼 u010019464 的回复:我用的是dev c++编译器，操作系统是win8的 报什么错？有什么提示？ 我win8 dev c++没问题

user: user-0
content: 我用的是dev c++编译器，操作系统是win8的

user: user-5
content: 没看出来有什么错呀？楼主遇到什么问题？ 可以考虑在printf的时候加一个换行：   "秒数=%d\n"
user-0 提问: c简单隐藏字符串到文件中出错，求高手解决

回复:
user: user-0
content: 我刚解决就贴上去了，没看到你的回复。

user: user-0
content: 引用 2 楼 Idle_ 的回复:你hide_info时将原始信息都破坏了还打算怎么还原？  0xfe & fgetc(ofp)，获取的原始信息最低bit被清空了，比如这么做了之后'a'和'b'是一样的值 你好，这个没动原始文件的信息，就像i+1并没有更改i的值，i=i+1,才更改了i的值。 我就是想简单将字符串和bmp组合成一个新的bmp文件，然后从新bmp文件提取隐藏信息。 你说的没错，就是最低位清零，bmp位图数据最低位不重要，是0是1几乎没影响，所以将字符串的bit从 高到低依次存到bmp位图数据字节的最低位。

user: user-0
content: 搞到底，还是自己来。 第12行，fputc((0xfe & fgetc(ofp)) + (*p & 0x80 ? 1 : 0), nfp); 我要的是高位的1或0，不是128或0 第37行，ch += (fgetc(fp) & 0x01); 这个把我坑了，运算符优先级要注意，一直以为不管怎样最后算加法的， 第18行增加for(i = 0; i < 8; ++i) fputc(fgetc(ofp) & 0xfe, nfp); 就是用来判断字符串结束的null 第36、37行的循环稍微改一下 for(i = 0; i < 8; ++i){         ch <<= 1; 	ch += (fgetc(fp) & 0x01);	 } 满足条件后，不让ch后移，之前没注意  嗯，大体逻辑没错，就是细节出错，细节啊 不知道，该怎么处理分数，自己提出的问题，自己解决了，哎。

user: user-1
content: 你hide_info时将原始信息都破坏了还打算怎么还原？  0xfe & fgetc(ofp)，获取的原始信息最低bit被清空了，比如这么做了之后'a'和'b'是一样的值

user: user-0
content: 啊，自己先顶一下
user-0 提问: vs调试出现问题，请教各位大牛

回复:
user: user-0
content: 谢谢，我的file文件好像找不到，我自己在研究研究...

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

user: user-2
content: 找你代码调用了fopen的地方，检查参数传递错了没有

user: user-0
content: 打错字了，一直出现expression（file != NULL），为什么？

user: user-0
content: 在fopen.c里面的一部分代码 {     REG1 FILE *stream=NULL;     REG2 FILE *retval=NULL;      _VALIDATE_RETURN((file != NULL), EINVAL, NULL);     _VALIDATE_RETURN((mode != NULL), EINVAL, NULL);     _VALIDATE_RETURN((*mode != _T('\0')), EINVAL, NULL);      /* Get a free stream */     /* [NOTE: _getstream() returns a locked stream.] */      if ((stream = _getstream()) == NULL)     {         errno = EMFILE;         return(NULL);     } 一直出现expression（file != NULL），问什么

user: user-3
content: 要么贴代码，要么别问
user-0 提问: 奇怪的结构体初始化

回复:
user: user-1
content: 陣列從0開始喔 樓主

user: user-2
content: typedef struct{ int a; int b;}ab; ab test[2] = {     [0] = {1,2},     [1] = {3,4}, };  这种语法C89标准不支持，C99支持  引用 1 楼 user-5 的回复:用gcc4.8.2编译通过。 一般写法ab test[2] = {  {1,2},  {3,4},  };  看不出来加上[0]和[1]有多大好处 加上[0]和[1]可以在初始化时改变顺序，如 typedef struct{ int a; int b;}ab; ab test[2] = {     [0] = {1,2},     [1] = {3,4}, }; 等价 typedef struct{ int a; int b;}ab; ab test[2] = {     [1] = {3,4},     [0] = {1,2}, }; 不加， typedef struct{ int a; int b;}ab; ab test[2] = {      {1,2},      {3,4}, }; 显然不等价 typedef struct{ int a; int b;}ab; ab test[2] = {     {3,4},     {1,2}, };

user: user-3
content: C99中的designated initilization，详情参考我的博客（初始化部分） http://www.cnblogs.com/edward-bian/p/3870683.html

user: user-4
content: 把[1] = {3,4}改成[2] = {3,4} test只有两个元素。改成2溢出了吧。

user: user-5
content: 用gcc4.8.2编译通过。 一般写法ab test[2] = {  {1,2},  {3,4},  };  看不出来加上[0]和[1]有多大好处
user-0 提问: unix消息队列mq_receive问题

回复:
user: user-1
content: 任何通讯系统，当发送方快速多次发送遇上接收方龟速接收，都会导致通讯卡壳的。

user: user-0
content: 谁能帮忙看下问题啊。。。为啥多次mq_send 和多次的mq_receive之后会失败？

user: user-0
content: 问题没有解决。。。新问题：。多次mq_send 和多次的mq_receive之后会失败，当描述符的路径（("/mq1proces"）改一改又可以使用多次 后失败，这是什么原因呢？  请帮忙解决后再贴上没有问题后的代码。。。

user: user-1
content: 路过帮结帖并接分。

user: user-0
content: 问题已解决。。

user: user-0
content: 另外，自己发现一个问题笔误，childFun里面： mqd_22 == mq_open("/mq1proces" ,O_RDWR);   ==号改为=。 但是问题还是没有解决，同样的执行结果

user: user-2
content: 楼主问题解决之后最好把解决方法给简单的说一下啊，一个问题已解决很是让后来搜到你这个链接的哥们蛋疼不已的

user: user-0
content: 还不能结贴。。。。还是有问题。。。多次mq_send 和多次的mq_receive之后会失败，当描述符的路径（("/mq1proces"）改一改又可以使用多次 后失败，这是什么原因呢？
user-0 提问: PAT题目总，不知哪里错了，百思不解！！！！！！！

回复:
user: user-1
content: 我粘贴这段的时候从来不看楼主问的是啥问题。

user: user-2
content: 引用 6 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 呵呵，说起来一套一套的，跟政府官员一样。 PAT这种题库，错了不知道哪里错的，看不见输入数据，不知道正确答案。这跟调试，看日志有什么关系？ 就你这还骗了那么多积分，都是复制粘贴的吗？

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

user: user-3
content: 按二楼的改了以后再  引用 8 楼 u012421456 的回复:定义的是long，输入的时候用%ld试试

user: user-3
content: 定义的是long，输入的时候用%ld试试

user: user-4
content: 题目对时间，内存有没有要求？将函数内的变量全部移出 函数外，改用全局变量。

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

user: user-0
content: 引用 4 楼 user-5 的回复:实在看不出来还有哪错了。我自己写了一个作为参考吧 #include<stdio.h>  int main() {   int n, i, result = -1;   long a, x;   scanf("%d %ld", &n, &x);   for (i = 0; i < n; i++) {     scanf("%ld", &a);     if (result < 0 && a == x) {       result = i;     }   }   if (result >= 0) {     printf("%d\n", result);   } else {     printf("Not Found\n");   }   return 0; }  谢谢！ 虽然编译还是部分错误，还是感谢你的帮助！

user: user-5
content: 实在看不出来还有哪错了。我自己写了一个作为参考吧 #include<stdio.h>  int main() {   int n, i, result = -1;   long a, x;   scanf("%d %ld", &n, &x);   for (i = 0; i < n; i++) {     scanf("%ld", &a);     if (result < 0 && a == x) {       result = i;     }   }   if (result >= 0) {     printf("%d\n", result);   } else {     printf("Not Found\n");   }   return 0; }

user: user-0
content: 引用 1 楼 user-5 的回复:1. 编译器支持可变长数组吗？把a[n]改成a[30]试试 2. 只处理一组数据就行吗？ 3. 对long int用%d可能会有问题  %ld j+1 这些在修改后 编译器提示有部分错误 0 答案错误 1 256 0/4  1 答案正确 1 256 1/1  2 答案错误 1 256 0/2  3 答案正确 1 256 1/1  4 答案错误 1 256 0/2

user: user-5
content: printf("%d",j+1);  // 这里错了，应该是 printf("%d",j); 输出X的位置（从0开始数）

user: user-5
content: 1. 编译器支持可变长数组吗？把a[n]改成a[30]试试 2. 只处理一组数据就行吗？ 3. 对long int用%d可能会有问题