Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 串口发送数据，怎么判断数据和已有数组相等？

回复:
user: user-1
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-2
content: 引用 1 楼 user-2 的回复:直接比较，或逐字节比较(memcpy) 打错了，是memcmp

user: user-2
content: 直接比较，或逐字节比较(memcpy)
user-0 提问: PAT乙级--1057. 数零壹(20)

回复:
user: user-1
content: 如果sum初始就为0的话，上面的while就不会执行了，下面的do...while会执行一次

user: user-2
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: 谢谢了
user-0 提问: C语言编译后无法导出DLL函数怎么回事？

回复:
user: user-1
content: 项目类型错误？

user: user-2
content: D:\CProject\yjx\test63\edr\Release\edr.lib 明显不是你查看的路径：...\CProject\yjx\test63\edr\edr\Release
user-0 提问: 移码在浮点数中是怎么运用的？

回复:
user: user-0
content: 引用 5 楼 wenpinglaoyao 的回复:题主，我可以给您一个小工具，使用它您就会明白浮点数的表示原理。  什么工具呢？能够清楚说明问题吗？

user: user-1
content: 引用 6 楼 u014132659 的回复:[quote=引用 5 楼 wenpinglaoyao 的回复:] 题主，我可以给您一个小工具，使用它您就会明白浮点数的表示原理。  什么工具呢？能够清楚说明问题吗？[/quote]  名字叫IEE，比如您输入一个十进制，然后让它帮您转换成二进制，您可以对比看看，看懂很利于您的理解。可以加我QQ

user: user-1
content: 题主，我可以给您一个小工具，使用它您就会明白浮点数的表示原理。

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

user: user-3
content: https://www.zhihu.com/question/24115452

user: user-3
content: 原来负位的高位是1,用移码整体往前移一半后，负数高位是0,正数高位是1,这样可以直接比较大小。

user: user-4
content: 一般用做浮点数的阶码，引入的目的是为了保证浮点数的机器零为全0。
user-0 提问: strcpy的实现

回复:
user: user-1
content: 2.  为什么要单个赋值 如 *strdestination++=*strsouce++ (直接把 strsouce 的值给strdestination :strdestination=strsouce ?) 1）有可能strsource是某个硬件设备的内部空间在DRAM的映射地址，虽然你能够用*strsource来访问，但有可能易变，而如果不copy到真正的strdestination的dram的话，过会儿后，硬件设备的实际strsource就被改变了。所以不同访问时间就会导致数据的未知改动。 2）同样的道理适用于share memory

user: user-0
content: 引用 7 楼 幻夢之葉的回复:[quote=引用 6 楼 software_breeze 的回复:] [quote=引用 4 楼 FD_2013的回复:]这里指针就不能当作字符串值来理解了，这里只是单纯的指针位置偏移，复制一份，ret指向的是字符串首地址，dst后面当作偏移指针来使用，做了++操作，指向的已经不是字符串首地址了 如果直接 dst=src不就可以了吗 为什么还要设置偏移指针？[/quote] 两块不同的内存啊，你直接 dst = src 只是浅拷贝。 也就是说让 dst 指向scr的内存块，当src 被修改或者被销毁的时候，那么你用dst 的时候，轻则数据错误，重则程序崩溃  strcpy做的是深度拷贝，把src的每一个char复制过来[/quote] 我懂了 谢谢

user: user-2
content: 你这样只是多了一个可以访问src的指针，但是没有把src复制到dst的空间里面，没有达到复制的目的！

user: user-3
content: 引用 6 楼 software_breeze 的回复:[quote=引用 4 楼 FD_2013的回复:]这里指针就不能当作字符串值来理解了，这里只是单纯的指针位置偏移，复制一份，ret指向的是字符串首地址，dst后面当作偏移指针来使用，做了++操作，指向的已经不是字符串首地址了 如果直接 dst=src不就可以了吗 为什么还要设置偏移指针？[/quote] 两块不同的内存啊，你直接 dst = src 只是浅拷贝。 也就是说让 dst 指向scr的内存块，当src 被修改或者被销毁的时候，那么你用dst 的时候，轻则数据错误，重则程序崩溃  strcpy做的是深度拷贝，把src的每一个char复制过来

user: user-0
content: 引用 4 楼 FD_2013的回复:这里指针就不能当作字符串值来理解了，这里只是单纯的指针位置偏移，复制一份，ret指向的是字符串首地址，dst后面当作偏移指针来使用，做了++操作，指向的已经不是字符串首地址了 如果直接 dst=src不就可以了吗 为什么还要设置偏移指针？

user: user-0
content: 引用 1 楼 自信男孩的回复:用ret指针保存dst目标串的首地址，因为后面*dst++是地址偏移了，dst就不能指向目标串的首地址了。 *dst++= *src++是字符赋值并且将源串和目标串的地址都自增1，即源串和目标串都指向各自串的下一个字符地址。 *是取值，即去地址指向的内存空间里的字符。 我懂了        谢谢

user: user-4
content: 这里指针就不能当作字符串值来理解了，这里只是单纯的指针位置偏移，复制一份，ret指向的是字符串首地址，dst后面当作偏移指针来使用，做了++操作，指向的已经不是字符串首地址了

user: user-5
content: 1.  要返回一个指向目的字符串指针 （不是已经将源字符串保存在 目的字符串里了吗？） 为了支持链式操作。  2.  为什么要单个赋值 如 *strdestination++=*strsouce++ (直接把 strsouce 的值给strdestination :strdestination=strsouce ?) 逐个赋值是深拷贝，直接指针赋值，而且是传值参数赋值，不会有任何效果。  3. 为什么 还要中间定义一个 char* 的变量 来存储strdestination的值？ 因为后面dst变化了，只能在最开始的时候保存下来，以方便返回。

user: user-6
content: 用ret指针保存dst目标串的首地址，因为后面*dst++是地址偏移了，dst就不能指向目标串的首地址了。 *dst++= *src++是字符赋值并且将源串和目标串的地址都自增1，即源串和目标串都指向各自串的下一个字符地址。 *是取值，即去地址指向的内存空间里的字符。

user: user-7
content: 自己读读代码，基础
user-0 提问: C语言ACM新手题，求解这个算法有什么没考虑到的地方。

回复:
user: user-0
content: 确定，，还没学到哪呢，题目说 Otherwise, even though it may cause some of the next cake to no longer be able to make, she will still make this kind of cake.

user: user-1
content: 你确定这不是最大匹配题么

user: user-0
content: 按顺序检测，不考虑使用某个配方的后果。 同一个配方是指现在检查的配方A所需的所有食材都被某个配方B占用。 同时确保配方A，和配方B的M相同，就能判断是相同配方。

user: user-2
content: 是说最大可行的配方个数？  “检查：一个配方的食材都可用或者都被同一个配方占用了，如果被占用了，两个配方的M相等。两个检查都为真，那么这个配方就可行” 看不懂。什么叫同一个配方？是指配方完全相同？
user-0 提问: APUE里面第10章，关于信号的这段代码不理解。请指教

回复:
user: user-1
content: 楼主，我也想学，这本书和The Linux Programming Interface哪本好啊

user: user-2
content: http://bbs.csdn.net/topics/390621351?page=1

user: user-3
content: As shown by this example, if we call a nonreentrant function from a signal handler, the results are unpredictable. 书上说是结果是不可预知的。因为getpwnam返回了静态区的数据，是个不可重入的函数。  我试了下，就输出了一句in signal handler,然后就卡住了

user: user-3
content: 引用 4 楼 chenzhp 的回复:[quote=引用 3 楼 user-3 的回复:] 第１个问题：　1楼已经回答了， 是通过strerror(errno)得到的 第２个问题：　因为err_sys中调用了exit所以返回了  谢谢回复。 但是我想知道一点，当主函数里面调用signal函数，处理信号，这个我自己定义的信号函数里面 static void my_alarm(int signo) {     struct passwd *rootptr;     printf("IN signal handler\n");       if((rootptr = getpwnam("root")) == NULL)         err_sys("getpwnam(root) error");     alarm(1); }   有一句，printf  in signal handler，但是在调用的时候，屏幕无输出。按理说必须进这里面来啊。[/quote] 先进入主函数中的for,由于用户名找不到，所以退出了。把两处"sar"换成你的用户名就可以了

user: user-0
content: 引用 3 楼 user-3 的回复:第１个问题：　1楼已经回答了， 是通过strerror(errno)得到的 第２个问题：　因为err_sys中调用了exit所以返回了  谢谢回复。 但是我想知道一点，当主函数里面调用signal函数，处理信号，这个我自己定义的信号函数里面 static void my_alarm(int signo) {     struct passwd *rootptr;     printf("IN signal handler\n");       if((rootptr = getpwnam("root")) == NULL)         err_sys("getpwnam(root) error");     alarm(1); }   有一句，printf  in signal handler，但是在调用的时候，屏幕无输出。按理说必须进这里面来啊。

user: user-3
content: 第１个问题：　1楼已经回答了， 是通过strerror(errno)得到的 第２个问题：　因为err_sys中调用了exit所以返回了
user-0 提问: 大神帮帮忙，大一的程序设计作业

回复:
user: user-1
content: 程序给你改了改，我是在Linux修改和编译的，目前没有语法错误； 编程不得发进步很慢。你的程序有那么多语法错误，自己得慢慢解决呀，不然怎么进步呢 有问题再沟通吧；将你的邮箱通过私信发给我，我给你发过去。

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

user: user-0
content: 卧槽发错了尴尬。。http://pan.baidu.com/s/1qYauqHe
user-0 提问: 浮点数精度为什么有6位，也有7位

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

user: user-2
content: 4位二进制和1位16进制 8位二进制和2位16进制 是完全对等的

user: user-0
content: 引用 1 楼 akirya 的回复:那么4位二进制表示十进制中的1位 这个是错的啊 十进制二进制转换不是这么转的  请说明一下，谢谢

user: user-3
content: 23 * log(2) / log(10)    大约 6.9 位精度,  考虑到中间过程会损失一部分精度,  算 6位精度比较合适.

user: user-4
content: 那么4位二进制表示十进制中的1位 这个是错的啊 十进制二进制转换不是这么转的
user-0 提问: gcc编译共享库怎么不报错啊

回复:
user: user-1
content: 引用 10 楼 imarshal 的回复:[quote=引用 9 楼 ipqtjmqj 的回复:] 你具体用了math.h中的哪个函数，传的给那个函数的参数是常数还是变量。  就是sin和cos，gcc好像是这样处理共享库[/quote]  关键是传的是常数还是变量，如果是常数，可能不需要动态库了

user: user-0
content: 引用 9 楼 ipqtjmqj 的回复:你具体用了math.h中的哪个函数，传的给那个函数的参数是常数还是变量。  就是sin和cos，gcc好像是这样处理共享库

user: user-1
content: 你具体用了math.h中的哪个函数，传的给那个函数的参数是常数还是变量。

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:编译时加-Wall试试，加不加-lm提示有没有错误，主要还要看程序里有没有使用数学函数库  不提示错误的

user: user-0
content: 引用 4 楼 mLee79 的回复:加链接选项   -Wl,--no-undefined  不提示错误的

user: user-2
content: 引用 3 楼 imarshal 的回复:现在是用ldd -r手动查看共享库，可以显示缺少的库，有没有其他方法啊，还是不知道gcc为什么不报错 多使用ldd才是正道。

user: user-3
content: 编译时加-Wall试试，加不加-lm提示有没有错误，主要还要看程序里有没有使用数学函数库

user: user-4
content: 加链接选项   -Wl,--no-undefined

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

user: user-0
content: 引用 14 楼 mLee79 的回复:前后应该无所谓..  -Wl 是传递给 ld 的参数, 你也可以用  ld  --no-undefined -shared -o 1.so 1.o  链接, 就不需要 -Wl 的前缀.  一般主流的是放哪啊

user: user-4
content: 前后应该无所谓..  -Wl 是传递给 ld 的参数, 你也可以用  ld  --no-undefined -shared -o 1.so 1.o  链接, 就不需要 -Wl 的前缀.

user: user-0
content: 引用 12 楼 mLee79 的回复:在生产 .so 的时候用, 怎么可能没用  function run { echo $*; $*; }; run cat 1.c; run gcc -fPIC -c -o 1.o 1.c; run gcc -shared -o 1.so 1.o; run gcc -shared -o 1.so 1.o  -Wl,--no-undefined cat 1.c #include <math.h>  double foobar(double x) {    return sin(x); }  gcc -fPIC -c -o 1.o 1.c gcc -shared -o 1.so 1.o gcc -shared -o 1.so 1.o -Wl,--no-undefined 1.o: In function `foobar': 1.c:(.text+0x1b): undefined reference to `sin' collect2: error: ld returned 1 exit status  哦，原来是lmn的l，我以为是IJK的I，多谢了，还有这个选项一般是写在gcc后面还是最后啊

user: user-4
content: 在生产 .so 的时候用, 怎么可能没用  function run { echo $*; $*; }; run cat 1.c; run gcc -fPIC -c -o 1.o 1.c; run gcc -shared -o 1.so 1.o; run gcc -shared -o 1.so 1.o  -Wl,--no-undefined cat 1.c #include <math.h>  double foobar(double x) {    return sin(x); }  gcc -fPIC -c -o 1.o 1.c gcc -shared -o 1.so 1.o gcc -shared -o 1.so 1.o -Wl,--no-undefined 1.o: In function `foobar': 1.c:(.text+0x1b): undefined reference to `sin' collect2: error: ld returned 1 exit status

user: user-0
content: 现在是用ldd -r手动查看共享库，可以显示缺少的库，有没有其他方法啊，还是不知道gcc为什么不报错

user: user-0
content: 引用 1 楼 user-5 的回复:那就静态库喽  gcc为什么不报错啊，有没有选项能让gcc报错或者警告，还是说共享库都是这样的，缺少的库让最后的可执行一起添加，不过还是感觉逻辑有问题

user: user-5
content: 那就静态库喽
user-0 提问: gcc自带函数是什么意思，函数名冲突怎么解决啊

回复:
user: user-1
content: gcc a.c -o a.out -fno-builtin

user: user-0
content: 引用 1 楼 user-1 的回复:自带函数冲突是什么，原文就是这么说的？  应该是你的conj这个函数的参数类型 不匹配吧  conj是我自己定义的，gcc编译报warning: conflicting types for built-in function 'conj'，我搜了下，gcc确实有这个内置函数，怎么把这个警告去掉啊，总不会要我改自己的函数名啊

user: user-1
content: 自带函数冲突是什么，原文就是这么说的？  应该是你的conj这个函数的参数类型 不匹配吧
user-0 提问: 北邮ACM题

回复:
user: user-1
content: gets(a); getchar(); //读取一个字符，把换行符读取掉  你试试这个

user: user-1
content: gets(a);不丢弃换行符，所以会导致下一次读不是预期的数据

user: user-2
content: 边界条件 输入输出格式 ……

user: user-0
content: 嗯嗯，谢谢各位，这里貌似用gets总是会读入回车  引用 3 楼 cfjtaishan 的回复: #include <stdio.h> #include <string.h>  int main() {     char a[1008];     int m, i, j, count, min;      scanf("%d\n",&m);      while(m--) {         fgets(a, 1007, stdin);         a[strlen(a)-1] = 0;         min=9999999;         for(i=0;a[i]!='\0';i++){             count=0;             for(j=0;a[j]!='\0';j++){                 if(a[i]>a[j])                     count+=(a[i]-a[j])<(a[j]+26-a[i])?(a[i]-a[j]):(a[j]+26-a[i]);                 if(a[i]<a[j])                     count+=(a[j]-a[i])<(a[i]+26-a[j])?(a[j]-a[i]):(a[i]+26-a[j]);             }             if(min>count)                 min=count;         }         printf("%d\n",min);     }     return 0; }  用fgets替换gets是想把警告去掉；fgets和gets都会将换行符自动加到字符数组倒数第二个位置，最后一个字符是字符串结束标志。 所以，通过a[strlen(a)-1] = 0就是用字符串结束标记覆盖回车符。这样就把字符数组a中的回车符去掉了。 这里还是答案错误了

user: user-3
content: 引用 2 楼 jianwen0529 的回复:gets(a); getchar(); //读取一个字符，把换行符读取掉  你试试这个 这种方法是行不通的，因为gets是将回车符加到了字符串数组中成为字符串的一部分，getchar是接收回车符，是改变不了gets将回车符加到字符串中的。 比如输入abbba,在字符串中的存放是： abbba\n\0

user: user-3
content: #include <stdio.h> #include <string.h>  int main() {     char a[1008];     int m, i, j, count, min;      scanf("%d\n",&m);      while(m--) {         fgets(a, 1007, stdin);         a[strlen(a)-1] = 0;         min=9999999;         for(i=0;a[i]!='\0';i++){             count=0;             for(j=0;a[j]!='\0';j++){                 if(a[i]>a[j])                     count+=(a[i]-a[j])<(a[j]+26-a[i])?(a[i]-a[j]):(a[j]+26-a[i]);                 if(a[i]<a[j])                     count+=(a[j]-a[i])<(a[i]+26-a[j])?(a[j]-a[i]):(a[i]+26-a[j]);             }             if(min>count)                 min=count;         }         printf("%d\n",min);     }     return 0; }  用fgets替换gets是想把警告去掉；fgets和gets都会将换行符自动加到字符数组倒数第二个位置，最后一个字符是字符串结束标志。 所以，通过a[strlen(a)-1] = 0就是用字符串结束标记覆盖回车符。这样就把字符数组a中的回车符去掉了。

user: user-3
content: 引用 7 楼 jianwen0529 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] gets(a); getchar(); //读取一个字符，把换行符读取掉  你试试这个 这种方法是行不通的，因为gets是将回车符加到了字符串数组中成为字符串的一部分，getchar是接收回车符，是改变不了gets将回车符加到字符串中的。 比如输入abbba,在字符串中的存放是： abbba\n\0[/quote]  gets 跟 fgets 是不一样的，buffer中并不会保存换行符 http://www.cplusplus.com/reference/cstdio/gets/?kw=gets[/quote] sorry,是我记错了～

user: user-1
content: 引用 4 楼 cfjtaishan 的回复:[quote=引用 2 楼 jianwen0529 的回复:] gets(a); getchar(); //读取一个字符，把换行符读取掉  你试试这个 这种方法是行不通的，因为gets是将回车符加到了字符串数组中成为字符串的一部分，getchar是接收回车符，是改变不了gets将回车符加到字符串中的。 比如输入abbba,在字符串中的存放是： abbba\n\0[/quote]  gets 跟 fgets 是不一样的，buffer中并不会保存换行符 http://www.cplusplus.com/reference/cstdio/gets/?kw=gets
user-0 提问: 为什么我用C语言无法实现输入，应该是一个很简单的问题，但是我不知道问题出在哪

回复:
user: user-1
content: 改成scanf("%lf",&r);

user: user-2
content: 6楼头像太萌！会萌死人的。

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

user: user-3

user: user-4
content: %d 是 int %f 是 float %lf 是 double

user: user-0
content: 引用 3 楼 u011498414 的回复:应该是scanf("%lf",&r); 因为这是DOUBLE型的数据。 果然解决了，非常感谢！ 但是10个用例只能通过7个，请问是怎么回事呀？

user: user-5
content: 应该是scanf("%lf",&r); 因为这是DOUBLE型的数据。

user: user-0
content: 引用 1 楼 sinat_35261315 的回复:scanf("%f",&r); 我试了，还是不行。。。输出依然是0。

user: user-6
content: scanf("%f",&r);
user-0 提问: C语言函数setenv为找到定义

回复:
user: user-1
content: 引用 3 楼 小灸舞 的回复:setenv 头文件 #include<stdlib.h>  定义函数 int setenv(const char *name,const char * value,int overwrite);  函数说明 setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。  参数 value则为变量内容，参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0，而该环境变量原已有内容会被改为参数value所指的变量内容。如果overwrite为0，且该环境变量已有内容，则参数value会被忽略。  返回值 执行成功则返回0，有错误发生时返回-1。  举例： #include<stdlib.h> int main() { 　　char * p; 　　if((p=getenv(“USER”))) 　　　　printf(“USER =%sn”,p); 　　setenv(“USER”,"test",1); 　　printf(“USER=%sn”,getenv(“USEr”)); 　　unsetenv(“USER”); 　　printf(“USER=%sn”,getenv(“USER”)); } 执行： USER = root USER = test USER = (null) 说明：1、unsetenv函数就是清除环境变量的值(value)，这个很明显           2、如果overwrite 的值是0，并且环境变量name中的value是空(NULL)，也会将传进的参数值value赋给环境变量name。这一特性经常使用。  版主大大，这个setenv如果设置失败返回-1的原因有哪些呀？ 我在测试中调用一直返回0，但是在生产上突然出现返回-1的情况。但我又没有排查出来问题。希望请教一下

user: user-2
content: setenv 头文件 #include<stdlib.h>  定义函数 int setenv(const char *name,const char * value,int overwrite);  函数说明 setenv()用来改变或增加环境变量的内容。参数name为环境变量名称字符串。  参数 value则为变量内容，参数overwrite用来决定是否要改变已存在的环境变量。如果overwrite不为0，而该环境变量原已有内容会被改为参数value所指的变量内容。如果overwrite为0，且该环境变量已有内容，则参数value会被忽略。  返回值 执行成功则返回0，有错误发生时返回-1。  举例： #include<stdlib.h> int main() { 　　char * p; 　　if((p=getenv(“USER”))) 　　　　printf(“USER =%sn”,p); 　　setenv(“USER”,"test",1); 　　printf(“USER=%sn”,getenv(“USEr”)); 　　unsetenv(“USER”); 　　printf(“USER=%sn”,getenv(“USER”)); } 执行： USER = root USER = test USER = (null) 说明：1、unsetenv函数就是清除环境变量的值(value)，这个很明显           2、如果overwrite 的值是0，并且环境变量name中的value是空(NULL)，也会将传进的参数值value赋给环境变量name。这一特性经常使用。

user: user-3
content: #include<stdlib.h>

user: user-4
content: 应该是_putenv
user-0 提问: 大神老师看过来！这个函数的功能是删除字符串中的字符，但是这个函数具体是怎样执行的？求详细叙述

回复:
user: user-1
content: 引用 5 楼 include_xy 的回复:引用 2 楼 cfjtaishan 的回复:逻辑是：通过遍历str字符数组，用后面的字符覆盖前面查到的字符ch，你注意一下i和j的变化；单步调试的时候i=j=0这一步是直接跳过的，这个我很疑惑 直接跳过是什么意思？i=j=0这句是初始化呢

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

user: user-1
content: 逻辑是：通过遍历str字符数组，用后面的字符覆盖前面查到的字符ch，你注意一下i和j的变化；

user: user-3
content: void delete_string(char str[],char ch)   功能描述：去掉原字符串(str)中含有指定字符（ch），并返回 执行过程： void delete_string(char str[],char ch) { int i,j; for(i=j=0;str[i]!='\0';i++)/*循环依次指向str中的每个字符，直至结局，即str[i]='\0'*/ if(str[i]!=ch) str[j++]=str[i];/*当ch不等于str第i个字符时，当前字符不变（i 和j自加前是相等的）*/ str[j]='\0'; }

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:逻辑是：通过遍历str字符数组，用后面的字符覆盖前面查到的字符ch，你注意一下i和j的变化；单步调试的时候i=j=0这一步是直接跳过的，这个我很疑惑

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:逻辑是：通过遍历str字符数组，用后面的字符覆盖前面查到的字符ch，你注意一下i和j的变化；在那之前我已经单步调试了，只是单步调试后也不是很明白，所以才会问的。你说的很有道理！谢谢！

user: user-4
content: 向前递增，判断某个字符是否为需要删除的字符（i）     是：         跳过     不是：         则赋值给 j 位置，并且 j 向前一步 i 递增  所有字符循环完毕，在有效字符的下一个位置用 '\0' 截断
user-0 提问: 菜鸟求大解答一下

回复:
user: user-0
content: 多谢了，要的就是这样的东西。

user: user-1
content: 1.pNew->pNext=NULL;	//这一行你的理解是对的，将新结点的pNext指针指向空 2.pEnd->pNext=pNew; //这一行你的理解好像就不对了，并不是将pNew的值给了pEnd，而是将pEnd(指向最后一个结点)的pNext指向指向了新结点（实现了新节点的插入操作） 3.pEnd=pNew; //这行理解也不对，并不是pNew（空）给了pEnd，此时的pNew并不为空，它是刚刚malloc出来的啊 意思是：pEnd指向pNew（pEnd始终保持指向最后一个结点）

user: user-0
content: else语句，第一行pNew一开始指向空，第二行将pNew的值给了pEnd，第三行怎么又将pNew（空）给了pEnd呢？大神我是纯属自学，下学期才开课了。基础不好请见谅

user: user-2
content: 因为开始时，链表为空，当iCount为1时，就是创建第一个节点时，即头节点。后面创建的节点直接放在头节点之后。

user: user-1
content: iCount为1的时候，也就是这是你第一个插入的结点： pNew->pNext=pHead;	/*使得指向为空*/ pEnd=pNew;	/*跟踪新加入的结点*/ pHead=pNew;	/*头指针指向首结点*/ 感觉注释讲的很清楚了啊？  else分支： pNew->pNext=NULL;	/*新结点的pNext指针为空*/ pEnd->pNext=pNew;	/*原来的最后一个结点的pNext指向新结点,也就连上了新的结点到链表上了*/ pEnd=pNew;	/*pEnd指向新结点（最后一个结点）*/

user: user-3
content: 1： 如果链表没有节点 把新的节点赋值给头结点 否则 把新节点追加到尾节点的下一个节点  2： 链表结构简化为下面 Head-->1-->2-->3-->......-->NULL  一直找下去直到NULL为止
user-0 提问: 学习APUE书的时候，编译源代码提示找不到 -lbsd

回复:
user: user-1
content: 可用命令ld --verbose | grep SEARCH列出搜索路径， 一般/lib, /usr/lib, /usr/local/lib这三个都有，另外就是自定义的

user: user-1
content: 引用 2 楼 chenzhp 的回复:[quote=引用 1 楼 user-1 的回复:] 试试sudo apt-get install libbsd-dev  还是你厉害啊。谢谢，成功了。 顺便问一下，我install了这个以后，为什么我在usr/lib里面还是看不到libbsd相关的，但是编译就没问题了呢。[/quote] 那可能在其他目录 ，你可以用locate命令搜索一下

user: user-0
content: 引用 1 楼 user-1 的回复:试试sudo apt-get install libbsd-dev  还是你厉害啊。谢谢，成功了。 顺便问一下，我install了这个以后，为什么我在usr/lib里面还是看不到libbsd相关的，但是编译就没问题了呢。

user: user-1
content: 试试sudo apt-get install libbsd-dev
user-0 提问: 我把main函数和print函数放在不同的文件中，但有错误，错误我放在程序最后，急用，求大神

回复:
user: user-1
content: 最好还是全部编译通过最好

user: user-2
content: 你这只是一些警告，如果没有ERROR的话应该是能编译过去的。 http://wenku.baidu.com/link?url=KYYGCw9QfkY4ua_gZzu9QeCg3S3Y3wFf0Dbm-QfXMIOY_QmHmKF9Z6Fv7DWg3V7zYmhI4yLa6G8tFfYADQh_r3NnbQ88_HSyfNgXfU5QxcK

user: user-3
content: 注意，将函数的声明放在main函数的前面，函数定义可以放在main函数之后。 也可以将函数声明放在一个头文件里，然后通过include到main函数所在的文件里。

user: user-4
content: main()函数的文件加上#include "XXX.h"  把main()函数文件的#include <stdio.h> 写到 .h 文件里去

user: user-5
content: 在你实现         void scan(); 	void print(); 	void delet(); 	void stu_aver(); 	void total_aver(); 的c文件里面 #include<stdio.h>  void (*p)(); 修改为 typedef void (*p)();

user: user-6

user: user-0
content: 只是把void( *p )( )改为typedef  void （*p）（）的话不对啊，有语法错误

user: user-7
content: 感觉应该要添加自己编写库函数的头文件~
user-0 提问: 北邮ACM字符串问题本机没问题，总是WA或者运行时错误

回复:
user: user-0
content: #include <stdio.h> int main(){ 	int m,n,i,j,count,min; 	char a[1008]; 	scanf("%d\n",&m); 	while(m--){ 		gets(a); 		min=9999999; 		for(i=0;a[i]!='\0';i++){ 			count=0; 			for(j=0;a[j]!='\0';j++){ 			   if(a[i]>a[j]) 				   count+=(a[i]-a[j])<(a[j]+26-a[i])?(a[i]-a[j]):(a[j]+26-a[i]);                  if(a[i]<a[j])                       count+=(a[j]-a[i])<(a[i]+26-a[j])?(a[j]-a[i]):(a[i]+26-a[j]); 			} 			if(min>count) 				min=count; 	} 		printf("%d\n",min); 	} 		return 0; 	} 那这样呢？

user: user-1
content: if(min>count||i==1)  这估计bac就能放倒了

user: user-0
user-0 提问: 转跳不到switch语句

回复:
user: user-1
content: 定位这样的问题，可以看一下choice的值；如果进不了switch逻辑，很可能是choice的值不是在switch中。 如果choice不是所输入的值，那就向上查看，很可能是上面的输入后的数据进入到choice的内存空间里。

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

user: user-3
content: 楼上说的地方确实有问题，需要改正，而且在最后的时候需要做一次清除缓冲的处理 printf("请输入您的选择：\n"); fflush(stdin); scanf("%d",&choice); 就行了。

user: user-4
content: for(i=0;i<n;i++) 		scanf("%s%f",name[i],&score[i]);
user-0 提问: 求助一个数据结构c语言版的问题

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <time.h> unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } unsigned __int64 ullrand(void) {     return (      (((unsigned __int64)ulrand())<<32)     | ((unsigned __int64)ulrand())); } int i; unsigned long ul; unsigned __int64 ull; void main() {     srand(time(NULL));     for (i=0;i<10;i++) {         ul=ulrand();         printf("%010lu 0x%08x\n",ul,ul);     }     for (i=0;i<10;i++) {         ull=ullrand();         printf("%020I64u 0x%016I64x\n",ull,ull);     } } //3971076432 0xecb1d150 //2433428051 0x910b2a53 //1415415336 0x545d8628 //1312330759 0x4e389407 //1845758378 0x6e0409aa //0008069933 0x007b232d //4202720757 0xfa806df5 //2669855255 0x9f22c217 //0312068736 0x1299ca80 //2084555989 0x7c3fccd5 //03502077880857307931 0x3099e1472040ab1b //16884702393146816355 0xea52835e19b43763 //01877364819396611730 0x1a0dbd5b45f34e92 //07839440151924835771 0x6ccb4948756a05bb //09471412086917299176 0x8371371c820bfbe8 //04411255971577469925 0x3d37edef2f321be5 //13735846279546091130 0xbe9f876a65b7367a //04512980766520059820 0x3ea15418aa9927ac //15821377118299441610 0xdb90d2a9f1bb49ca //15512417228822200185 0xd7472d480398bf79
user-0 提问: 杭电OJ1002求大神帮测什么地方有问题

回复:
user: user-1
content: 网上找下AC的代码吧。 1.看看你们的输入输出格式是不是一致 2.多测试一些样例

user: user-2
content: 另外这个题目要求输出的数字和加号，等号之间都是有空格的。你的输出结果没有

user: user-2
content: 看下测试的结果
user-0 提问: 取余计算总是有误差

回复:
user: user-1
content: 0x75没有问题，正确值是0x75,取余数不是移位。如果想得到低八位的数，不能用取余的办法，可以考虑使用移位的方法（若要取高位）。 y = x & 0xFF;

user: user-0
content: 引用 7 楼 自信男孩的回复:0x75没有问题，正确值是0x75,取余数不是移位。如果想得到低八位的数，不能用取余的办法，可以考虑使用移位的方法（若要取高位）。 y = x & 0xFF; 我取了高八位，用的是y=x/0xff；经过你的提醒，我改成了y=(x>>8)&0xff;多谢

user: user-0
content: 谢谢大家的热心帮助，我都试了一下，发现下面三种方法都是有效的，都可以得到正确的结果  y=x&0xff;  y=(uint8)x;  y=(uint8)(x%256);

user: user-2
content: 0xff是255，你是要对256取余。 uint32 x =0x372; uint8 y = x; //一般强制转换就行了，自动截断，取低字节。 或者y = x & 0xFF;  //按位与

user: user-3
content: (X & 0x00FFU)

user: user-4
content: y= x & 0xff;

user: user-5
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-6
content: 写成：y=(uint8)x%0xff; 得到的才是0x72  y=(uint8)(x%0xff); 得到的是0x75

user: user-0
content: 0x72％0xff=0x72成立，但0x372％0xff会有误差

user: user-7
content: y=(uint8)(x%0x100);
user-0 提问: 求解，怎样用C写一个convertor将C++语法代码转化成C语法代码

回复:
user: user-1
content: 引用 4 楼 douqihou7537 的回复:额，这是我们的一个作业，要我们写代码的。我没什么思路，所以上来寻解 全部支持的话工程很大，可以先从简单的开始，只支持部分C++语法。 比如你说的把class换成struct. 下一步class中的函数全部变成全局函数，可以用类名作为新的全局函数的前缀。 新的全局函数增加一个this指针参数，搜索函数实现中的变量，如果是类的成员数据，改成this->xxx

user: user-0
content: 因为是作业，也有时间限制，所以不是说将所有的C++代码转换成C代码，满足一定要求即可

user: user-0
content: 额，这是我们的一个作业，要我们写代码的。我没什么思路，所以上来寻解

user: user-1
content: 1楼正确。C++最初就是先编译成C然后再编译的

user: user-2
content: 楼主，这个工程很浩大啊！！！！

user: user-3
content: cfront
user-0 提问: 求大神相助

回复:
user: user-0
content: 我排完序了却不知道怎样把学生和他的名词联系起来，就是怎么查询他的名次

user: user-1
content: 名次的计算水很深。

user: user-2
content: 求单门课程的平均成绩：遍历所有学生，然后累加，然后除以学生数 求每门课程的平均成绩并排序：排序可以用冒泡 求某一个人在班级的名次：排完序的学生，求一个人的名次想必就简单了吧？

user: user-0
content: void main() { 	 	int choice; 	while(1) 	{ 		system("color 7D"); 		/*主菜单*/ 		printf("\n\t\t*****学生成绩管理系统*****\n"); 		printf("\t\t*\t		1.录入成绩\t\t *\n");		 		printf("\t\t*\t		2.保存成绩\t\t *\n"); 		printf("\t\t*\t		3.修改成绩\t\t *\n"); 		printf("\t\t*\t		4.删除成绩\t\t *\n"); 		printf("\t\t*\t		5.学生查询平均成绩\t *\n"); 		printf("\t\t*\t		6.排序\t\t\t *\n"); 		printf("\t\t*\t		7.单门课程平均成绩\t *\n"); 		printf("\t\t*\t		8.学生名次查询\t\t *\n");		 		printf("\t\t*\t		0.退出\t\t\t *\n"); 		printf("\t\t**********●0●*********\n\n"); 		printf("请选择您要执行的操作(0-10):"); 		scanf("%d",&choice); 		getchar(); 		switch(choice) 		{ 		case 1: 			Student_Input(); 			break; 		case 2: 			Save();//Student_Display(); 			break; 		case 3: 			Student_Modify();//Student_Add(); 			break; 		case 4: 			Student_Delete();//Student_Insert();Student_Display();			 			break; 		case 5: 			Student_aver_Select(); 			break; 		case 6: 			Student_Sort(); 			 			break; 		case 7: 			//Student_Select(); 			break; 		case 8: 			Search(); 			break; 		case 0: 			printf("\n操作结束,再见！\n"); 			exit(0); 			break; 		default: 			printf("\n输入错误！请重新输入！\n"); 		} 	} }
user-0 提问: 学生信息管理的文件修改函数，拜托拜托，在线等

回复:
user: user-1
content: 将旧的文件删掉。 在fwrite前面加一句rewind(pf_modify);

user: user-0
content: 引用 5 楼 赵4老师的回复:将旧的文件删掉。 在fwrite前面加一句rewind(pf_modify); 天呐老师真的是太太太太太厉害了，一句话就解决我4天都找不出的问题。

user: user-2
content: 引用 3 楼 Potato_Lyy 的回复:[quote=引用 2 楼 jianwen0529 的回复:] 写前重新定位下读写位置？ fseek 试过了没有用。。。[/quote]  那更一了百了的方式：分开读写

user: user-0
content: 引用 2 楼 jianwen0529 的回复:写前重新定位下读写位置？ fseek 试过了没有用。。。

user: user-2
content: 写前重新定位下读写位置？ fseek

user: user-1
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224
user-0 提问: 求一个概率问题

回复:
user: user-1
content: 如果G抽到红球的概率为80%，那么G抽到红球的概率是80%

user: user-0
content: 引用 9 楼 fefe82 的回复:A和B抽同时中(红球或蓝球)的概率为80%  同时红和同时蓝都是 80% ，加一起就已经 160% ...  一红一篮的概率是负的？.... 确实是...

user: user-0
content: 引用 8 楼 zilaishuichina 的回复:请先练习如何把题目描述清楚  你描述的是：A和B抽同时中(红球或蓝球)的概率为80%  即2种情况：  A和B同时中红球的概率为80%，在一次测试中B抽中蓝球，求A抽中红球的概率  A和B同时中蓝球的概率为80%，在一次测试中B抽中蓝球，求A抽中红球的概率  见下图  确实是...

user: user-0
content: 引用 8 楼 zilaishuichina 的回复:请先练习如何把题目描述清楚  你描述的是：A和B抽同时中(红球或蓝球)的概率为80%  即2种情况：  A和B同时中红球的概率为80%，在一次测试中B抽中蓝球，求A抽中红球的概率  A和B同时中蓝球的概率为80%，在一次测试中B抽中蓝球，求A抽中红球的概率  见下图  很矛盾，如楼上所说的，是不是我的问题有问题...

user: user-1
content: A和B抽同时中(红球或蓝球)的概率为80%  同时红和同时蓝都是 80% ，加一起就已经 160% ...  一红一篮的概率是负的？....

user: user-2
content: 请先练习如何把题目描述清楚  你描述的是：A和B抽同时中(红球或蓝球)的概率为80%  即2种情况：  A和B同时中红球的概率为80%，在一次测试中B抽中蓝球，求A抽中红球的概率  A和B同时中蓝球的概率为80%，在一次测试中B抽中蓝球，求A抽中红球的概率  见下图

user: user-3
content: 《概率论与数理统计》

user: user-0
content: 引用 1 楼 fefe82 的回复:如果G抽到红球的概率为80%，那么G抽到红球的概率是80% A和B抽同时中(红球或蓝球)的概率为80% A和C同上 A和D同上 A和E同上  在一次测试中 B抽中蓝球 C抽中蓝球 D抽中蓝球 E抽中红球 求A抽中红球的概率

user: user-0
content: 引用 1 楼 fefe82 的回复:如果G抽到红球的概率为80%，那么G抽到红球的概率是80% A和B抽同时中(红球或蓝球)的概率为80% A和C同上 A和D同上 A和E同上  在一次测试中 B抽中蓝球 C抽中蓝球 D抽中蓝球 E抽中红球 求A抽中红球的概率

user: user-0
content: 引用 3 楼 zilaishuichina 的回复:仅从lz的描述  如果x，则y 是不能反推： 如果y，则x  如果G抽到红球的概率为80%，那么A、B、C、D抽到的红球概率也是80%。 是不能反推出 ：  如果A、B、C、D抽到的红球概率是x%， 则G抽到红球的概率为y%  因此，如果一次测试中A抽到红球、B抽到红球、C抽到蓝球、D抽到蓝球， 跟G有半毛钱关系啊 谢谢回答！可能我的问题没有描述清楚，我再尝试描述一次吧: A和B抽同时中(红球或蓝球)的概率为80% A和C同上 A和D同上 A和E同上  在一次测试中 B抽中蓝球 C抽中蓝球 D抽中蓝球 E抽中红球 求A抽中红球的概率

user: user-2
content: 仅从lz的描述  如果x，则y 是不能反推： 如果y，则x  如果G抽到红球的概率为80%，那么A、B、C、D抽到的红球概率也是80%。 是不能反推出 ：  如果A、B、C、D抽到的红球概率是x%， 则G抽到红球的概率为y%  因此，如果一次测试中A抽到红球、B抽到红球、C抽到蓝球、D抽到蓝球， 跟G有半毛钱关系啊

user: user-4
content: 你自己都说了80%，那就80%呗
user-0 提问: C的线程池原理 进程池原理 多路io原理和优化

回复:
user: user-1
content: 搜“毛德操 进程管理 线程调度”

user: user-2
content: 一般如果涉及到线程处理较慢或者线程里要处理大量的io读写操作时，这时我们引入线程池的方式来统一管理线程，线程池说白了就是控制线程并发数量，防止程序阻塞，上学时肯定学过游泳池放水排水的问题，自己查查资料不难理解。  通俗的说就是很多线程同时处理较慢的数据时，往往容易造成系统自动分配时间分配的不好，这样，我们就通过线程池控制同时执行的线程数量，并控制顺序，让系统干不了的事我们自己来干  进程池类似于线程池，不同的是管理的进程而已。  多路io复用，说白了也是为了优化操作系统本身的不足。  总之就一句话，以上这些东西，没啥道道，主要是为了让程序更稳定，处理速度更快（不受系统缺陷的影响）
user-0 提问: 这个C++我编译出错 但是我不知道该怎么改 各位大神教教我

回复:
user: user-1
content: 感觉你这代码哪里抄来的，WinSunProc函数第2第3个case名字不对

user: user-2
content: 将错误拿去搜索

user: user-3
content: 贴错误代码  感觉你这是因为字符编码的问题  如果是这样子，你在所有显示字符串前加L宏 比如 wndcls.lpszClassName=L"xiahezhuang Game";
user-0 提问: 分治求最大连续和。。。（当输入数据全是0 的时候 上下界的输出就不对了），求大神

回复:
user: user-1
content: 数组下标最好从0开始

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

回复:
user: user-1
content: 引用 3 楼 ipqtjmqj 的回复:你没编译show.c当然找不到了。 编译命令改成  gcc -o main main.c show.c

user: user-0
content: 引用 6 楼 ipqtjmqj 的回复:[quote=引用 4 楼 qq_15623245 的回复:] [quote=引用 3 楼 ipqtjmqj 的回复:] 你没编译show.c当然找不到了。 编译命令改成  gcc -o main main.c show.c 感谢！这个真的可行！ 有没有方法不用gcc -o  main main.c  show.c, 直接使用gcc -o main main.c[/quote] 那要分几条指令了 gcc -c main.c gcc -c show.c gcc -o main main.o show.o  觉得太长的话，可以存到一个shell脚本里，或者写个Makefile[/quote] 感谢！我愚钝了，make用的多！却没自个写好好写过makefile，忘了基本的编译流程。。。

user: user-2
content: 引用 4 楼 qq_15623245 的回复:[quote=引用 3 楼 ipqtjmqj 的回复:] 你没编译show.c当然找不到了。 编译命令改成  gcc -o main main.c show.c 感谢！这个真的可行！ 有没有方法不用gcc -o  main main.c  show.c, 直接使用gcc -o main main.c[/quote] 那要分几条指令了 gcc -c main.c gcc -c show.c gcc -o main main.o show.o  觉得太长的话，可以存到一个shell脚本里，或者写个Makefile

user: user-0
content: 还有一个问题是 我在test.h 中定义了一个全局变量int info_count，在show.c 和main.c中使用有以下问题 /tmp/cce6Jr5W.o:(.bss+0x0): multiple definition of `info_count' /tmp/ccgVGa1h.o:(.bss+0x0): first defined here

user: user-0
content: 引用 3 楼 ipqtjmqj 的回复:你没编译show.c当然找不到了。 编译命令改成  gcc -o main main.c show.c 感谢！这个真的可行！ 有没有方法不用gcc -o  main main.c  show.c, 直接使用gcc -o main main.c

user: user-2
content: 你没编译show.c当然找不到了。 编译命令改成  gcc -o main main.c show.c

user: user-0
content: 意思是将.c 改成.cpp,gcc改成g++？ 结果还是一样，找不到show（）

user: user-3
content: 不把show.c变进去，程序是找不到show函数的。 编译是第一步，链接是第二步； 第一步只是检查语法错误，生成.o文件，第二步链接，将.o文件合到可执行文件。 gcc -Wall main.c show.c其实是包含编译和链接两步的。

user: user-4
content: 改成cpp试试，或者就直接包含.c文件
user-0 提问: 枚举变量赋值问题

回复:
user: user-1
content: 因为你加了__attribute__((packed))，导致sizeof(ptp_bool)是1。

user: user-2
content: 引用 4 楼 laoqiuge 的回复:援引二楼，不错我用了memset(a,1,64*sizeof(ptp_bool));但是a只占用一个字节，我怎么会同时对四个字节赋值呢？  你的TRUE与FALSE类型是int，如果要char，要写成：enum xxx :  char  另参看：  http://en.cppreference.com/w/cpp/language/enum

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

user: user-0
content: 我知道了是我用输出类型%d的原因

user: user-4
content: 引用 4 楼 laoqiuge 的回复:援引二楼，不错我用了memset(a,1,64*sizeof(ptp_bool));但是a只占用一个字节，我怎么会同时对四个字节赋值呢？  你得把 sizeof(ptp_bool) 打出来看看。  还有，你得去重新看看 memset 的文档。

user: user-4
content: 引用 1 楼 jianwen0529 的回复:bool 当 0 表示false，非0值为 true 大多数编译器false转int为0，true 为 1（不一定，可以自行决定具体的表现）  C 没有 bool ,之后 _Bool （从哪个版本加上的记不得了，C11 已经有了），用来保存两个值，0 和 1 。  stdbool.h 里定义了 #define bool _Bool #define true 1 #define false 0

user: user-0
content: printf的时候用了%d，应该没有正确对应enum的输出类型

user: user-0
content: 援引二楼，不错我用了memset(a,1,64*sizeof(ptp_bool));但是a只占用一个字节，我怎么会同时对四个字节赋值呢？

user: user-4
content: 引用 楼主 laoqiuge 的回复:枚举变量在定义好之后，如果对这个变量赋值不是只能取已经定义好的值吗？比如说，我定义这样一个枚举变量 typedef enum {    FALSE = 0,    TRUE  = 1, }__attribute__((packed)) ptp_bool;  ptp_bool a[24]; 那么a[0-23]不是只可以取值0或者1吗？但是我给赋值2或者3之类的合法值也是可以赋上的，不知道什么原因？ 而且赋值为1的时候打印结果却不是1，qt下编译是16843009？ （ps:第二个问题值不对感觉很奇怪）  1. C 标准下 enum type 大小至少是一个 sizeof(char) 。在用非 enum constant 给 enum 变量赋值的时候，标准允许给 warning , 但是这不是一个强制要求。  2. 不知道你是怎么输出的。    比如：printf 输出的时候，%d 一类格式控制符需求的类型与给出的类型不一致的时候，是一个 UB (可能得到任何结果）。    printf 没有用于输出 enum 的格式控制符，所以必须手工转换。

user: user-5
content: 16843009，即0x01010101，你是不是用什么函数给变量赋值了，比如memset(a, 1, sizeof(a));

user: user-6
content: bool 当 0 表示false，非0值为 true 大多数编译器false转int为0，true 为 1（不一定，可以自行决定具体的表现）
user-0 提问: 麻烦大家帮我看看这个问题！

回复:
user: user-0
content: 能否麻烦以上两位从运行时的初始化给我讲一下！

user: user-1
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-2
content: 用{}只有定义的时候才可以那样写（定义的时候初始化） 之后只能用strcpy来赋值

user: user-3
content: 你的name是一个字符数组，要用strcpy赋值

user: user-4
content: strcpy
user-0 提问: 关于VS2013下的Debug Assertion Failed

回复:
user: user-1
content: 引用 7 楼 LOSWind 的回复:[quote=引用 1 楼 paschen 的回复:] int compare_num = compare(input_num, rand_num[4]);  改成：  int compare_num = compare(input_num, rand_num); 为什么要这样改，好像用数组做实参是可以的吧？[/quote]   rand_num[4] 只是数组的第5个元素，而且这个元素还越界了

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

user: user-3
content: 弹出的错误意思是，表达式c（char类型？）的值应位于[-1，255]之间

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

user: user-4
content: 你这个judge函数写的不对，比如我输入5621 它直接就isalpha(judge_num)也就是isalpha(5621)就出现那个错误了 这个isalpha要一个个字符判断才行

user: user-0
content: 引用 1 楼 paschen 的回复:int compare_num = compare(input_num, rand_num[4]);  改成：  int compare_num = compare(input_num, rand_num); 为什么要这样改，好像用数组做实参是可以的吧？

user: user-0
content: 引用 2 楼 jianwen0529 的回复:不是告诉你那个文件第几行，是c 的问题么没有定义c啊，56行是i和j

user: user-0
content: 引用 1 楼 paschen 的回复:int compare_num = compare(input_num, rand_num[4]);  改成：  int compare_num = compare(input_num, rand_num);试了，一样

user: user-5
content: 不是告诉你那个文件第几行，是c 的问题么

user: user-1
content: int compare_num = compare(input_num, rand_num[4]);  改成：  int compare_num = compare(input_num, rand_num);
user-0 提问: 着急！菜鸟有关链表的小问题

回复:
user: user-1
content: 恕我直言，写的不是一点点的小问题，首先在函数部分，在结构体没有用别名的情况下声明结构体类型应该要加上struct，其次，下面的链表构建完全不是一个画风的，准确来说很难猜到您要表达的意思，首先，while后面的判断，在您申请的头节点，存储下一个节点地址的next应该就是NULL，其次，在循环中的节点构建此时已经不是头节点了，tail已经单独的成为了一个新的节点，和head没有任何关系了。 以上回答如有发现有问题的，麻烦指出来，相互学习！谢谢！

user: user-0
content: 引用 1楼user-1 的回复:恕我直言，写的不是一点点的小问题，首先在函数部分，在结构体没有用别名的情况下声明结构体类型应该要加上struct，其次，下面的链表构建完全不是一个画风的，准确来说很难猜到您要表达的意思，首先，while后面的判断，在您申请的头节点，存储下一个节点地址的next应该就是NULL，其次，在循环中的节点构建此时已经不是头节点了，tail已经单独的成为了一个新的节点，和head没有任何关系了。 以上回答如有发现有问题的，麻烦指出来，相互学习！谢谢！谢谢了，我是初学者，听取了您的意见现在已经改好了。
user-0 提问: 求大神帮忙看一下，实在改不出来。

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:错误表现是什么？错的地方已经改正了，谢谢你的关注。

user: user-1
content: 错误表现是什么？
user-0 提问: CTurkeyAdapter到底是鸡还是鸭？

回复:
user: user-1
content: 使用上错了，正确方法如下  CTurkeyAdapter *pAdapter=new CTurkeyAdapter(pTurkey); pAdapter-＞Quack(); pAdapter-＞Fly();  接口适配器主要用于统一接口 对于一些你不便修改的的情况下（比如得不到源码，公有接口在别人的模块被太多使用不便修改）  比如你CTurkeyAdapter 适配器就是在你不能随意更改CTurkey的接口函数下 而你又想修改公用接口函数的名称，就多加了一层包装 void Quack() {     m_pTurkey-＞Gobble(); }  说白了就是换个接口名称或者封装一组操作
user-0 提问: 在做C解析器的时候关于转义字符的转换问题

回复:
user: user-1
content: 你是不是在看调试器 ....  你把它打出来看看 ...

user: user-2
content: 参考Tiny C Compiler源代码。

user: user-3
content: 转义字符就这几种类型： http://baike.baidu.com/link?url=gc3TOKUt9_W6keS3wZzWee2vfp_zGX6aZ8MDpuI1rEVufIjdU8qZI3tdegQp8uQ56CW5dBiNhX8no4FT5OpRNd_zm05jQ9NC3KWTCVHvqK9xiIc6fm4RATfdLtrvBGHE
user-0 提问: 关于受限制的双端队列问题

回复:
user: user-1
content: 参考stl dqueue？

user: user-2
content: 另外，你的代码是链表，不是队列。 队列一般采用顺序存储，不允许中间插入删除。

user: user-2
content: “只能在front端出队但能在rear端进行入队、出队” 你的意思是，"在front端只能出队但能在rear端进行入队、出队" ？  肯定还是用双向链表，你把front的push操作去掉就行了，其它一模一样。

user: user-0
content: 那我用的结构还是双向链表结构？  typedef struct DQueuelist    //定义结构体结点 { 	int data;                //结构体数据域 	struct DQueuelist *prior; //结构体前向指针 	struct DQueuelist *next;  //结构体后向指针 }DQueuelist, *DQueueptr; typedef struct                //定义双端队列 { 	DQueueptr front;         //头指针，指向链队列头结点 	DQueueptr rear;          //尾指针，指向链队列最后一个结点 }LinkDQueue;

user: user-3
content: 双端队列你不是都有了吗  class MyQueue { public: //你的三个操作 private: MyDeque m_deq; //双端队列 }  要求模板的话就实现为模板
user-0 提问: ODBC 多线程并行执行SQLExecute

回复:
user: user-0
content: 多进程是可以的并行的。

user: user-0
content: 感谢。 发现是odbc配置文件 odbcinst.ini的问题。 其中有一条属性是 Threading = 0/1/2/3，不附加该内容的话，默认被设置为3，在驱动层面是串行执行的。 添加Threading = 1 问题解决。

user: user-1
content: 试试使用多进程。
user-0 提问: 变量的存储类别

回复:
user: user-1
content: c语言的存储类别问题，请看博客http://blog.csdn.net/libing403/article/details/72934528

user: user-2
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]  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-0
content: 引用 3 楼 企鹅爱吃方便面的回复:感觉你是想问auto，static，extern，register的问题，你看看这个吧，http://blog.csdn.net/hjxhjh/article/details/8947397 感谢：)  文章很有用 已经收藏了

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

user: user-3
content: 感觉你是想问auto，static，extern，register的问题，你看看这个吧，http://blog.csdn.net/hjxhjh/article/details/8947397

user: user-4
content: 引用 楼主 qq_37308044 的回复:定义变量时，如果指明变量的存储类型时，此时改变量的存储类别是什么  求解答 存储类别是指在内存中所占用的位置吗？

user: user-0
content: 这个在百度和书上的没找到 = =
user-0 提问: 请教一下为什么sendto的返回值一直是-1

回复:
user: user-0
content: 引用 3 楼 jianwen0529 的回复:网上找个例子先运行下，端口开大点，先启动服务端然后再启动客户端  我的程序基本是照着视频照抄的，视频上运行成功了，可是我这个却不行，换了好几个端口号了都不行，用netstat -ano检查端口，也没有被占用。接收程序在 bind(st,(SOCKADDR *)&addr,sizeof(SOCKADDR)) 这里就返回-1，接收不到数据。代码跟视频比较很多次都不知道是什么问题，实在是没辙了。

user: user-1
content: 网上找个例子先运行下，端口开大点，先启动服务端然后再启动客户端

user: user-1
content: http://www.cnblogs.com/ayanmw/archive/2012/05/03/2480854.html  测试下这个！

user: user-0
content: 引用 5 楼 jianwen0529 的回复:http://www.cnblogs.com/ayanmw/archive/2012/05/03/2480854.html  测试下这个！  感谢帮助，已经解决。我把SOCKET结构体赋值放在初始化前面了，所以socket函数没有调用成功

user: user-0
content: 引用 1 楼 jianwen0529 的回复:你这个是客户端，但是你的服务程序呢  我是小白不太懂，服务程序是接收程序吗，接收程序我也写了，但是在bind绑定端口那里就挂了，错误代码也是10038

user: user-1
content: 你这个是客户端，但是你的服务程序呢
user-0 提问: 请教前辈，在dev C++下建立一个c项目文件，出现recipe for target "Project1.exe" failed错误

回复:
user: user-1
content: 原来是这一坨有错误来着

user: user-1
content: 新建的项目自带一个main.c文件，我原来是把这个文件删了，用自己的文件里面的main函数发现不行，然后把自己文件main函数的内容复制到项目自带的main文件里面，发现可以编译运行了点yes就OK了

user: user-2
content: 同问解决了吗

user: user-3
content: 我想问楼主你解决了这个问题吗

user: user-4
content: 关闭UAC、防火墙、杀毒软件 在任务管理器里面结束掉进程collect2.exe，如果有。
user-0 提问: 指针的类型和指针所指向的类型不同时，数据解析问题

回复:
user: user-1
content: double可以可能由于变量大于4字节后就是用指针类型去解释了  建议楼主单步跟踪到prinft函数里去找原因

user: user-1
content: printf 参数是按值传递的  如果你传递的参数类型是int，但格式是(%f)，prinft内部应该直接将一个int变量赋值给一个浮点变量，而不是按指针类型去解释

user: user-0
content: @赵4老师  float和double同为浮点数，只是精度不同，为何double可以，而float不行呢？

user: user-2
content: 可能跟printf的实现有关

user: user-3
content: 字节序 结构体成员对齐 编解码 ……

user: user-0
content: 经过多方查找，已有正确解释： float类型的参数，在入栈时会进行类型转换，变成double类型，而%f解析的是双精度浮点数8字节，所以最后解析输出会出现错误。  另外：无符号char short在作为参数入栈时也会自动转换为无符号int            有符号char short在作为参数入栈时也会自动转换为有符号int  %c  %hd在解析时分别只解析1字节和2字节数据，但是指针位移是4字节

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

回复:
user: user-0
content: 我试过   好像也不行  出现了新的错误

user: user-1
content: 应该是fclose(fp)不是fclose(p)

user: user-0
content: 额   你知道怎么解决吗

user: user-2
content: 这段代码你是哪里抄来的吧
user-0 提问: 关于getchar函数的一个疑问

回复:
user: user-1
content: getchar就是读取缓冲区中的一个字符  scanf后，缓冲区中还会留下你最后的回车产生的换行符\n，第一个getcahr接收了他，否则换行符会仍留在缓冲区中  第二个则是等待用户输入一个字符再继续

user: user-2
content: 楼上已经基本解释清楚了。 比如你输入3+回车符（此时输入缓冲区是:3\n） 你scanf %d只是读取掉了3，回车符还会遗留下来的，所以可以用getchar清掉这个回车符

user: user-3
content: 第一个回车是用来终止scanf的，getchar是用来清楚这个回车用的，不然这个回车还残留在缓冲区中。第二个不一定要输入回车，随便输入个东西按回车就会继续。getchar是从缓冲区中读取第一个字符，这个字符是什么都行，如果缓冲区没有字符可以读取，就等待输入。
user-0 提问: 如何定义函数和向函数传递参数？参数类型为字符串二维数组，即二维数组中每个元素类型为字符串类型

回复:
user: user-1
content: http://www.cnblogs.com/CBDoctor/archive/2012/07/29/2614054.html

user: user-2
content: 数组退化成指针。

user: user-0
content: 根据大家的建议，采用了如下方式，达到了同等的目的吧。 #include<cstring> #include<iostream> #include<stdio.h> #include<stdlib.h> #include<iomanip>  using namespace std;  void threeArr(char** arr,int m,int n){     int count = 0;     for(int i=0;i<m;i++){         for(int j=0;j<n;j++){             cout<<std::left<<std::setw(10)<<*(arr + n*i + j)<<" ";             ++count;         }         if(count%n == 0){             cout<<endl;         }     } };  int main(){     char *arrays[3][5] = {{"bcdaqw","thbcda","weccgh","uk3e","13br04"},                          {"gjh","df7h","5i6sf","yhjj5","xkh"},                          {"nml","lwfm","fbjyn","huxue","qibo"}};     threeArr((char**)arrays,3,5);     return 0; }

user: user-3
content: 每个元素都是char*类型。又是数组当然用数组指针呀

user: user-4
content: 你这个是一个二维的char*数组  你给的代码没有编译问题

user: user-5
content: void threeArr(int(&arr)[3][5]); //必须传 3X5 大小的数组 void threeArr(int **arr, int row, int col); void threeArr(int *arr[], int row, int col);
user-0 提问: 请教一个数据结构的问题，在不同.c文件中用不同的元素类型

回复:
user: user-0
content: 引用 3 楼 jianwen0529 的回复:[quote=引用 2 楼 luo560 的回复:] [quote=引用 1 楼 jianwen0529 的回复:] typedef union{ uint16_t u16; unit32_t u32; float f; double d; }ElementType;  用联合体来替代ElementType，在你用不同场景的时候选择适当的union中的值即可 恩恩，的确解决我的问题了，但是假如有很多文件的话并且结构体成员比较多的话就比较麻烦了[/quote]  用C++[/quote] 用C++的话要用到哪块知识呢   我没学过C++

user: user-1
content: 引用 2 楼 luo560 的回复:[quote=引用 1 楼 jianwen0529 的回复:] typedef union{ uint16_t u16; unit32_t u32; float f; double d; }ElementType;  用联合体来替代ElementType，在你用不同场景的时候选择适当的union中的值即可 恩恩，的确解决我的问题了，但是假如有很多文件的话并且结构体成员比较多的话就比较麻烦了[/quote]  用C++

user: user-0
content: 引用 1 楼 jianwen0529 的回复:typedef union{ uint16_t u16; unit32_t u32; float f; double d; }ElementType;  用联合体来替代ElementType，在你用不同场景的时候选择适当的union中的值即可 恩恩，的确解决我的问题了，但是假如有很多文件的话并且结构体成员比较多的话就比较麻烦了

user: user-2
content: 参考protobuf

user: user-1
content: typedef union{ uint16_t u16; unit32_t u32; float f; double d; }ElementType;  用联合体来替代ElementType，在你用不同场景的时候选择适当的union中的值即可
user-0 提问: c语言用什么编译器好点啊

回复:
user: user-1
content: 我用的是MinGW版，gcc……凑个字数

user: user-2
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-3
content: http://blog.csdn.net/cometnet/article/details/19551125

user: user-4
content: WINDOWS下就用VS吧

user: user-5
content: VS系列都行，比较好用。

user: user-6
content: 手机用c4droid

user: user-7
content: devc++
user-0 提问: 结构体的指针和首末地址的问题

回复:
user: user-1
content: se3buf* pt=se3bufs2; se3bufs2[10]取首地址就是“se3bufs2”或者pt,   (pt+i)=&se3bufs2[i] 末地址就是   &se3bufs2[9]或者(pt+9)  se3bufs1是结构体对象,只有一个首地址&se3bufs1,不是结构体数组,所以不存在未地址的说法,或者可以说未地址等于首地址,也是&se3bufs1

user: user-2
content: 引用 4 楼 u010417757 的回复:[quote=引用 3 楼 reg_wan 的回复:] se3bufs1是结构体对象,只有一个首地址&se3bufs1,不是结构体数组,所以不存在未地址的说法,或者可以说未地址等于首地址,也是&se3bufs1  我说法错了，，我是想知道se3bufs1所占用的地址范围，第一位和最后一位的地址 首位的话就应该是&se3bufs1，末位的话应该是什么？？ （&se3bufs1+sizeof(se3bufs1)）,????[/quote]  寻址只到字节，不到位。 se3bufs1的地址就是&se3bufs1，占用大小是sizeof(se3bufs1)。

user: user-3
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-0
content: 引用 3 楼 reg_wan 的回复:se3bufs1是结构体对象,只有一个首地址&se3bufs1,不是结构体数组,所以不存在未地址的说法,或者可以说未地址等于首地址,也是&se3bufs1  我说法错了，，我是想知道se3bufs1所占用的地址范围，第一位和最后一位的地址 首位的话就应该是&se3bufs1，末位的话应该是什么？？ （&se3bufs1+sizeof(se3bufs1)）,????

user: user-4
content: 引用它的名称“se3bufs2”也是它的指针。 这种说法就不对。摒弃这种说法。数组是数组，指针是指针，只是数组在很多情况下为转化为指向其首元素的指针。 这样可能会好理解一些。
user-0 提问: C语言结构体赋值

回复:
user: user-1
content: 赋值时没有 {} 这种方式，一个成员一个成员地进行赋值吧

user: user-2
content: 最好定义成结构体数组。

user: user-3
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-4
content: Student arr1 = { 20, 88.8, "zhang" }; arr[0] = arr1;

user: user-5
content: 检查标点符号中英文

user: user-6
content: 只有在声明定义时才能用大括号初始化，赋值就不能这样用了，只能给成员一个个地赋值。
user-0 提问: 高精度加法基础

回复:
user: user-0
content: 你这个是不是数位没有对齐

user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110
user-0 提问: c程序用库在tc中找不到

回复:
user: user-1
content: 楼主如果想用TC编写图形程序，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。  下载一个EasyX包，里面有完整的函数手册。EasyX官网有实例。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

user: user-2
content: http://www.easyx.cn

user: user-3
content: 书上的题就把书扔了  老师的题就退学  30年前的技术了
user-0 提问: C语言 大神来解读这个程序

回复:
user: user-1
content: 第10行到第14行完成的。 既然你只贴图，不贴代码，我也懒得打一遍你的代码了。  关键：如果c为空格，lastc也是空格，那就什么都不做了。多个空格也就没有打出来了。

user: user-2
content: 单引号里本来就只能表示一个字符
user-0 提问: 能帮我看一下函数错哪里了吗，每一次都会进入add函数中的if（phear->next==0）可是第一次又改变啊

回复:
user: user-1
content: 不明白你add函数里写的： if (phear->next == 0) 	{ 		phear = ptail = newnode; 		phear->next = newnode; 		getchar(); 	} 这样写根本不对。  楼上写的思路是对的，但是ptail = newnode;是没有用的，在函数内要想改变指针的指向，必须传二级指针或者一级指针的引用才行

user: user-2
content: 单链表保持一个数据项为null的头节点,在链表头插入节点：  if (phear->next == NULL){　　//链表空     phead->next = newnode;     ptail = newnode;     newnode->next = NULL; } else { //链表非空     newnode->next = phead->next;     phead->next = newnode; }
user-0 提问: 标准中，变量声明关键字顺序！char[] a; 这样不是更明了

回复:
user: user-1
content: 存在即合理。

user: user-2
content: C/C++变量类型定义语法错综复杂，有[]、*、()....  如不按标准要求的写，可能对于简单类型看似可以，但对于一些复杂的（如函数指针指向的函数又返回一个函数指针）等一些情况可能就会出现语义含糊的问题  习惯了我觉得第一种没什么不好，如果要增强可读性可以用typedef  以上个人理解

user: user-3
content: a[]这样的声明才明了吧，一看就知道是数组，而且知道是几维数组，而你所说的[]a是Java里面的声明方式。 并没有感觉[]a会符合习惯，另外，标准又不是我们制定的，讨论这个问题没什么意义。

user: user-4
content: 续上 作为一个语言编译器来说，一般一个语言中的类型，最后要形成一个表，以备后用 作为c来说 我可以这么写 int a[],b; 但是如果按照你的方式 必须 int[] a; int b; 因此，int[] 和int是两个类型，所以，上边所说的类型表，至少要扩大一倍 你再想想c语言的发展，它是上世界70年代末兴起的，当时的计算机内存应该是以k计，你觉得作为c语言的作者能像现在一样挥霍内存吗？

user: user-5
content: 在这个问题上C是祖先（毕竟它最老），它的的想法就是： “某个类型的变量的定义，看上去就跟该类型变量的使用，是一样一样的。” 简化版：“变量的定义方式和变量的使用方法一样”。  然后问题来了，基本上不经过训练，很多人很难理解复杂的变量定义；后续语言的发明人为了缓解这个问题，就把类型独立出来了，然后所有变量的定义方式就统一成了type var; 代表语言就是Java和Go。
user-0 提问: 请教一下大神

回复:
user: user-1
content: 这是源码   #include <stdio.h> main() { int j,i,temp; int a[]={12,23,21,45,32,34,66,33,78,36};    for(i=0;i<10;i++)    {    printf("%5d",a[i]);    }    printf(" 原先数组\n");    printf("\n-------------------\n");    for(i=0;i<10;i++)    {     if (a[i]>a[i+1])    {      temp=a[i];      a[i]=a[i+1];      a[i+1]=temp;    }    for(j=0;j<10;j++)     {    printf("%5d",a[j]);    if(j==9)    printf(" 第%d次检验结束\n",i+1);     }     printf("\n-----------------\n");    }    for(i=0;i<10;i++)    {    printf("%5d",a[i]);    }    printf(" 排序后最终结果");  }

user: user-2
content: 我怀疑你这能运行吗

user: user-3
content: 在第一层循环内第二层循环外，再从头到尾输出一次