Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: c sprintf字符转换十六进制问题，急！！！

回复:
user: user-1
content: GDB也有很多GUI外壳的。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 suxinpingtao51 的回复:] [quote=引用 3 楼 my_live_123 的回复:]  sprintf(szMessage+y*2, "%02x", sziMessage[y] & 0xff);//只取低8位  可以说明下，不取8位为什么会是我提的那种结果吗？[/quote] 理解和讨论之前请先学会如何观察！  计算机组成原理→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对应的汇编并单步执行观察相应内存和寄存器变化。） [/quote] 赵老师教训的是以后注意多观察！有个疑问，在Linux或Unix下大家都是用GDB调试的吗，我总是用的不习惯，感觉GDB调试好慢的赶脚，可能是习惯IDE这种的了

user: user-1
content: 引用 4 楼 suxinpingtao51 的回复:[quote=引用 3 楼 my_live_123 的回复:]  sprintf(szMessage+y*2, "%02x", sziMessage[y] & 0xff);//只取低8位  可以说明下，不取8位为什么会是我提的那种结果吗？[/quote] 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-0
content: 引用 3 楼 my_live_123 的回复: sprintf(szMessage+y*2, "%02x", sziMessage[y] & 0xff);//只取低8位  可以说明下，不取8位为什么会是我提的那种结果吗？

user: user-2
content: sprintf(szMessage+y*2, "%02x", sziMessage[y] & 0xff);//只取低8位

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:sprintf(szMessage+y*2, "%02x", (unsigned char)sziMessage[y]); 为什么可以这样强制转呢，我看sziMessage的第二个的十进制是个 负整数，将有符号的强转成无符号的字符，这在取值范围上都不一样啊，这样转的目的是让字符被强制从低位截取8位输出？

user: user-1
content: sprintf(szMessage+y*2, "%02x", (unsigned char)sziMessage[y]);
user-0 提问: 如何判断一个int型变量是否已赋值或者已初始化

回复:
user: user-1
content: 引用 14 楼 ren0065 的回复:IsBadReadPtr() IsBadWritePtr() 涨姿势了！

user: user-2
content: 引用 5 楼 zhangxiangDavaid 的回复:这个没法判断，及时初始化是个好的习惯记忆中好多内存泄露也是4k 4k的泄的

user: user-3
content: IsBadReadPtr() IsBadWritePtr()

user: user-4
content: 对于一个局部变量来说，给变量分配的存储空间是线程的栈，由于进进出出的人很多，变量的值通常是不确定的。

user: user-5
content: [quote=引用 10 楼 a138762698828 的回复:]   [quote=引用 6 楼 zhao4zhong1 的回复:] 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  页的大小，不一定， 很多都是2k

user: user-5
content: [quote=引用 6 楼 zhao4zhong1 的回复:] 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  页的大小，不一定， 很多都是两页，

user: user-6
content: 定义的时候自己赋值好了 int a(1234)这样

user: user-7
content: 定义的时候自己赋值好了 int a = {1234}这样

user: user-8
content: 判断不了的，靠你自己判断吧

user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  仅供参考：windows里常见的内存填充数据含义 * 0xABABABAB : Used by Microsoft's HeapAlloc() to mark "no man's land" guard bytes after allocated heap memory * 0xABADCAFE : A startup to this value to initialize all free memory to catch errant pointers * 0xBAADF00D : Used by Microsoft's LocalAlloc(LMEM_FIXED) to mark uninitialised allocated heap memory * 0xBADCAB1E : Error Code returned to the Microsoft eVC debugger when connection is severed to the debugger * 0xBEEFCACE : Used by Microsoft .NET as a magic number in resource files * 0xCCCCCCCC : Used by Microsoft's C++ debugging runtime library to mark uninitialised stack memory * 0xCDCDCDCD : Used by Microsoft's C++ debugging runtime library to mark uninitialised heap memory * 0xDEADDEAD : A Microsoft Windows STOP Error code used when the user manually initiates the crash * 0xFDFDFDFD : Used by Microsoft's C++ debugging heap to mark "no man's land" guard bytes before and after allocated heap memory * 0xFEEEFEEE : Used by Microsoft's HeapFree() to mark freed heap memory

user: user-9
content: 这个没法判断，及时初始化是个好的习惯

user: user-10
content: 这个只有自己的编程意识了，变量最好都初始化，至于初始化的值，不同的应用场景用不同的值

user: user-11
content: 初始化是什么呢？就是你第一次赋予变量一个值，这个值可以是你想要的值，也可以是预防错误发生的值。 第一种比如int PI=3.14，那么你判断是否为3.14就可以。 第二种比如int* p=NULL; 后面使用该变量的时候，判断指针是否为NULL就可以。  如果你也不清楚初始化应该是多少，那么判断是否初始化过就没有意义了。还不如就在你要判断是否初始化过的地方，直接赋给它一个有意义的值。

user: user-12
content: 未初始化的值是不一定的，所以上面两种方式肯定不行！ 所以于其考虑怎么判断一个值有没有初始化，不好做好每个变量的初始化

user: user-13
content: 只有编译期可以(编译器抛警告) 运行时无法判断
user-0 提问: linux的 sed命令 请教

回复:
user: user-0
content: 顶起来，有高手不

user: user-0
content: 顶起来，有高手不

user: user-0
content: 引用 1 楼 cjqpker 的回复:shell中斜杠是用作转义了吧，终端中好像不是转义  注意有单引号  不存在你说的问题

user: user-1
content: shell中斜杠是用作转义了吧，终端中好像不是转义
user-0 提问: 如何根据一列数据而整行排序，求大神帮忙，跪谢

回复:
user: user-1
content: 弄一个结构体保存读到的数据，再排序不就好咯

user: user-2
content: 仅供参考：//学号 姓名 电话 成绩 //01 XXX 182XXXXXXXX 88 #include <stdio.h> #include <string.h> #define MAXS 10000 struct ST {     int XH;     char XM[11];     char DH[13];     int CJ; } st[MAXS],t; int n,i,j; char ln[80]; FILE *f; int main() {     f=fopen("in.txt","r");     if (NULL==f) {         printf("Can not open file in.txt!\n");         return 1;     }     i=0;     while (1) {         if (NULL==fgets(ln,80,f)) break;         if (4!=sscanf(ln,"%d%10s%12s%d",&st[i].XH,st[i].XM,st[i].DH,&st[i].CJ)) {             st[i].XH=0;             strcpy(st[i].XM,"Unknown");             strcpy(st[i].DH,"Unknown");             st[i].CJ=0;             printf("line %d format error:%s!\n",i+1,ln);         }         i++;         if (i>=MAXS) {             printf(">%d lines Ignored.\n",MAXS);             break;         }     }     fclose(f);     n=i;     for (i=0;i<n-1;i++) {         for (j=i+1;j<n;j++) {             if (st[i].CJ<st[j].CJ) {t=st[i];st[i]=st[j];st[j]=t}         }     }     for (i=0;i<n;i++) {         printf("%5d%10s%12s%4d\n",st[i].XH,st[i].XM,st[i].DH,st[i].CJ);     }     return 0; }

user: user-3
content: 结构体排序你不会吗
user-0 提问: 能否将单独的C文件编译为单独的可执行文件

回复:
user: user-1
content: 引用 5 楼 adlay 的回复:[quote=引用 3 楼 ForestDB 的回复:] $ cat my.c int my_main() {     return 0; }  $ gcc -nostdlib -emy_main my.c  $ ./a.out Segmentation fault (core dumped)  如上，可以做到，但是这里已经暴露了两个问题， 1、不能用printf这样的库了，因为它是标准库； 2、运行程序会有问题，也是因为缺少了标准库做的一些处理； 上述两个问题可以解决，但是要花更多的功夫。 花不了什么功夫  [adie@adintr ~]$ cat my.c #include <stdio.h> #include <stdlib.h>  int my_main() {    printf("hello world\n");    exit(0);    return 0; } [adie@adintr ~]$ gcc -nostdlib -emy_main -lc my.c [adie@adintr ~]$ ./a.out hello world [adie@adintr ~]$  [/quote]

user: user-2
content: 引用 3 楼 ForestDB 的回复:$ cat my.c int my_main() {     return 0; }  $ gcc -nostdlib -emy_main my.c  $ ./a.out Segmentation fault (core dumped)  如上，可以做到，但是这里已经暴露了两个问题， 1、不能用printf这样的库了，因为它是标准库； 2、运行程序会有问题，也是因为缺少了标准库做的一些处理； 上述两个问题可以解决，但是要花更多的功夫。 花不了什么功夫  [adie@adintr ~]$ cat my.c #include <stdio.h> #include <stdlib.h>  int my_main() {    printf("hello world\n");    exit(0);    return 0; } [adie@adintr ~]$ gcc -nostdlib -emy_main -lc my.c [adie@adintr ~]$ ./a.out hello world [adie@adintr ~]$

user: user-3
content: 没有入口函数的可执行文件没有意义。

user: user-1
content: $ cat my.c int my_main() {     return 0; }  $ gcc -nostdlib -emy_main my.c  $ ./a.out Segmentation fault (core dumped)  如上，可以做到，但是这里已经暴露了两个问题， 1、不能用printf这样的库了，因为它是标准库； 2、运行程序会有问题，也是因为缺少了标准库做的一些处理； 上述两个问题可以解决，但是要花更多的功夫。

user: user-4
content: 可以，但不可运行

user: user-5
content: 可以，但需要指定 入口函数。 还不如写上main
user-0 提问: 求助下！ 为什么出现expected ')' before '! ' token这个错误啊！

回复:
user: user-1
content: 检查有没有中文标点

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

user: user-3
content: 这样的问题最好自己先定位，同时在这个过程中积累自己的经验从而避免以后再犯此类错误。

user: user-4
content: 这个编译错误自己检查撒

user: user-5
content: ! =不等于中间该没空格吧
user-0 提问: 如何把一个本地文件的内容嵌入到代码里

回复:
user: user-1
content: #define myfilelength 你要嵌入的那个文件的字节数 unsigned char myfilecontent[myfilelength]={ //此处插入使用楼上代码对你要嵌入的那个文件转换后的字节序列的文本描述 };//全局变量

user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> #include <conio.h> FILE *fi,*fo; unsigned int n; int c; //------------------------------------------------------- void main(int argc,char *argv[]) {     if (argc<3) {         cprintf("Bin2Hex srcfile desfile");         return;     }     if ((fi=fopen(argv[1],"rb"))==NULL) {         cprintf("Can not find file %s",argv[1]);         return;     }     if ((fo=fopen(argv[2],"w"))==NULL) {         fclose(fi);         cprintf("Can not create file %s",argv[2]);         return;     }     n=0;     while (1) {         c=fgetc(fi);         if (EOF==c) break;         n++;         if (1==n)        fprintf(fo,  "0x%02X",c);         else {             if (1==n%16) fprintf(fo,"\n0x%02X",c);             else         fprintf(fo, ",0x%02X",c);         }     }     fcloseall();     cprintf("OK to Bin2Hex %u bytes.",n); }

user: user-0
content: 引用 6 楼 u012006886 的回复:之后就是细节问题了，特别要注意动态内存的处理，使用完毕这块内存之后记得及时释放掉  fp，是FILE*类型的，如何得来？？？

user: user-2
content: 之后就是细节问题了，特别要注意动态内存的处理，使用完毕这块内存之后记得及时释放掉

user: user-2
content: PEM_read_RSAPrivateKey这个接口是封装好的读文件接口吧，对应应该有一个写接口啊，动态申请内存要么你用标准库里面的malloc，如果你们自己封装的有申请动态内存的接口，就用封装好的，这些搞定之后，调用写接口，把key写到你申请的内存里就行吧

user: user-0
content: 引用 3 楼 u012006886 的回复:你都已经把文件内容读出来了，之后申请一块动态内存，把你读出来的文件内容写进去就行了吧  嗯，有文件内容。 能否再具体一点？搞定分都给你了~~~

user: user-2
content: 你都已经把文件内容读出来了，之后申请一块动态内存，把你读出来的文件内容写进去就行了吧

user: user-0
content: 函数倒数第三行FILE是个笔误，请忽略。。。。

user: user-0
content: 顶一个，寻大神帮忙。。。。
user-0 提问: 求Turbc2.0安装软件

回复:
user: user-1
content: 古董级的工具还是有不少人怀念呀

user: user-2
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 5 楼 sholber 的回复:] 在学习C语言的路上，你第一步就走错了，更遑论学好C语言。这年月哪有用TC学C语言的。 赵老湿名义上是帮忙，实际上是落井下石啊。其心可诛，奸侫之师，不可师之！ 那请你找出一个比 Win-TC\tcstudy.chm 更好的中文chm格式的C帮助文件的链接贴上来。[/quote]

user: user-2
content: 引用 12 楼 akirya 的回复:[quote=引用 11 楼 sugar13 的回复:] 关键是TC是16位软件,没法在64位win系统下跑. Win-TC的话,当年在学校的机房里面XP下倒是很正常的跑,自己电脑的XP系统下却总是在编译的时候,肉眼能够找到的函数,它却找不到.. TC2 得和 DOS6.22搭配着使用，实在不行也可以上Win98。XP就有点不搭了。[/quote] TC2和BC31应该在DoxBox里面也能跑得不错。

user: user-3
content: 引用 11 楼 sugar13 的回复:关键是TC是16位软件,没法在64位win系统下跑. Win-TC的话,当年在学校的机房里面XP下倒是很正常的跑,自己电脑的XP系统下却总是在编译的时候,肉眼能够找到的函数,它却找不到.. TC2 得和 DOS6.22搭配着使用，实在不行也可以上Win98。XP就有点不搭了。

user: user-3
content: 引用 15 楼 sugar13 的回复:[quote=引用 12 楼 akirya 的回复:] [quote=引用 11 楼 sugar13 的回复:] 关键是TC是16位软件,没法在64位win系统下跑. Win-TC的话,当年在学校的机房里面XP下倒是很正常的跑,自己电脑的XP系统下却总是在编译的时候,肉眼能够找到的函数,它却找不到.. TC2 得和 DOS6.22搭配着使用，实在不行也可以上Win98。XP就有点不搭了。[/quote]  请问我从itellyou上下载的dos6.22的exe文件，该如何安装到vmware中呢 文件名 SC_MSDOS622sc.exe SHA1 DD3C5CAD0FF837C38D5EB14B0D59E9A670792DCC[/quote] 不清楚是啥版本的，应该是几个软盘镜像才对

user: user-2
content: 引用 15 楼 sugar13 的回复:[quote=引用 12 楼 akirya 的回复:] [quote=引用 11 楼 sugar13 的回复:] 关键是TC是16位软件,没法在64位win系统下跑. Win-TC的话,当年在学校的机房里面XP下倒是很正常的跑,自己电脑的XP系统下却总是在编译的时候,肉眼能够找到的函数,它却找不到.. TC2 得和 DOS6.22搭配着使用，实在不行也可以上Win98。XP就有点不搭了。[/quote]  请问我从itellyou上下载的dos6.22的exe文件，该如何安装到vmware中呢 文件名 SC_MSDOS622sc.exe SHA1 DD3C5CAD0FF837C38D5EB14B0D59E9A670792DCC[/quote] 别费那劲了，为什么不使用DosBox呢？

user: user-4
content: 引用 12 楼 akirya 的回复:[quote=引用 11 楼 sugar13 的回复:] 关键是TC是16位软件,没法在64位win系统下跑. Win-TC的话,当年在学校的机房里面XP下倒是很正常的跑,自己电脑的XP系统下却总是在编译的时候,肉眼能够找到的函数,它却找不到.. TC2 得和 DOS6.22搭配着使用，实在不行也可以上Win98。XP就有点不搭了。[/quote]  请问我从itellyou上下载的dos6.22的exe文件，该如何安装到vmware中呢 文件名 SC_MSDOS622sc.exe SHA1 DD3C5CAD0FF837C38D5EB14B0D59E9A670792DCC

user: user-5
content: 编译工具不是重点，vc++6.0就行

user: user-4
content: 关键是TC是16位软件,没法在64位win系统下跑. Win-TC的话,当年在学校的机房里面XP下倒是很正常的跑,自己电脑的XP系统下却总是在编译的时候,肉眼能够找到的函数,它却找不到..

user: user-6
content: 编译的话Dev-cpp用的不错，还有就是楼上说的VC了，本人觉得这两种都不错

user: user-2
content: 引用 5 楼 sholber 的回复:在学习C语言的路上，你第一步就走错了，更遑论学好C语言。这年月哪有用TC学C语言的。 赵老湿名义上是帮忙，实际上是落井下石啊。其心可诛，奸侫之师，不可师之！ 那请你找出一个比 Win-TC\tcstudy.chm 更好的中文chm格式的C帮助文件的链接贴上来。

user: user-7
content: 这个阶段用gcc还是tc都是一样的，楼主在看《汇编语言》迈

user: user-8
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 5 楼 sholber 的回复:] 在学习C语言的路上，你第一步就走错了，更遑论学好C语言。这年月哪有用TC学C语言的。 赵老湿名义上是帮忙，实际上是落井下石啊。其心可诛，奸侫之师，不可师之！ 那请你找出一个比 Win-TC\tcstudy.chm 更好的中文chm格式的C帮助文件的链接贴上来。[/quote]  大胆胡说，下面冒气  过时软件之过时文档，不要也罢。

user: user-2
content: bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028  要想在Windows环境下稳定运行bc.exe 建一个批处理bc.bat,内容为下面两行，放在bc.exe同目录下，再将bc.bat发送到桌面快捷方式： del bc*.swp >NUL start command /c bc.exe 如果想在IDE里面使用鼠标，还应将快捷方式属性中的快速编辑模式关掉。

user: user-9
content: 好怀念这个软件，只能帮顶了

user: user-8
content: 在学习C语言的路上，你第一步就走错了，更遑论学好C语言。这年月哪有用TC学C语言的。 赵老湿名义上是帮忙，实际上是落井下石啊。其心可诛，奸侫之师，不可师之！

user: user-2
content: 搜索下载“Win-TC”

user: user-10
content: 记得当初学C语言用的就是它，估计现在不好找到了！
user-0 提问: 我头一次发现C语言还能这么玩

回复:
user: user-1
content: 记得有个只用“喵呜”编程的帖子，找不到了。

user: user-2
content: 1.现在的编译器已经支持中文字符了 2.宏的预处理 3.国际乱码大赛常用技巧

user: user-3
content: 宏定义直接替换

user: user-4
content: 多见不怪

user: user-5
content: 引用 4 楼 euewrqe12 的回复:我奇怪的是为什么能用中文 新一些的编译器都支持 中文变量什么的,早就有了

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

user: user-6
content: 电脑又不知道什么是中文   只要字符不非法就行

user: user-0
content: 我奇怪的是为什么能用中文

user: user-7

user: user-8
content: 你很牛，这都整的出来

user: user-9
content: 这是宏替换，没什么稀奇的！
user-0 提问: [求教]c语言数组问题

回复:
user: user-1
content: 搜“辗转相除法”

user: user-2
content: 优化你的GCD函数，两个for循环没法避免吧

user: user-3
content: 没看明白，你的GCD()函数怎么写的，超时又是指什么？

user: user-0
content: 引用 1 楼 JiangWenjie2014 的回复:优化你的GCD函数，两个for循环没法避免吧 有没有什么数学方法来解决这个问题啊
user-0 提问: 关于C中的浮点数的存储问题

回复:
user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-1
content: 引用 2 楼 sz523921551 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] http://bbs.csdn.net/topics/390676437  赵老师能否直接说明下，我是哪里出问题了？[/quote] 懒得说，自己运行这个链接里面我的程序，亲自观察一下。  理解和讨论之前请先学会如何观察！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390676437  赵老师能否直接说明下，我是哪里出问题了？
user-0 提问: 新手求助！如何在一个函数中调用另一个函数来达到search的目的

回复:
user: user-1
content: 从第一个文件的内容（head指针指向的内容）中逐行搜索并找到包含第二个文件中指定字符串的文本行（strFp读出的内容，第二个文件中的每一行就是一个待搜索的字符串，所以针对每个字符串要在要第一个文件的内容中搜索一次），然后直接在控制台上打印出来，while(fgets(buf, LINE, strFp))要实现的就是上述过程

user: user-2
content: 该怎么调用，就怎么调用

user: user-3
content: search(strFile, buf[LINE])；  函数的调用基本就是这样喽，调用的时候 省掉前面的返回值类型，两个参数换下就ok
user-0 提问: 一元二次方程 数据类型用float正确 用double错误 求解

回复:
user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:double类型使用lf读入 scanf("%f %f %f",&a,&b,&c);=>scanf("%lf %lf %lf",&a,&b,&c);     谢谢！

user: user-0
content: 引用 2 楼 s_a_n_ 的回复:改成double后使用scanf读入数据时要把相应的%f改成%lf，就可以了 scanf("%lf %lf %lf",&a,&b,&c);     谢谢！

user: user-1
content: 改成double后使用scanf读入数据时要把相应的%f改成%lf，就可以了 scanf("%lf %lf %lf",&a,&b,&c);

user: user-2
content: double类型使用lf读入 scanf("%f %f %f",&a,&b,&c);=>scanf("%lf %lf %lf",&a,&b,&c);
user-0 提问: 请教一个预编译命令的问题

回复:
user: user-0
content: 展开果然是条空语句，给我留的填空题？

user: user-0
content: 引用 3 楼 ytfhwfnh 的回复:[quote=引用 1 楼 user-2 的回复:] 编译器可以展开宏  可以搜"vc 宏展开" 或者"gcc 宏展开" source insight也可以展开么？[/quote] 哦，gcc -E -P xxx 我试试

user: user-0
content: 引用 1 楼 user-2 的回复:编译器可以展开宏  可以搜"vc 宏展开" 或者"gcc 宏展开" source insight也可以展开么？

user: user-1
content: 这样定义什么都没有

user: user-2
content: 编译器可以展开宏  可以搜"vc 宏展开" 或者"gcc 宏展开"
user-0 提问: C语言printf参数修饰符对%%是否有效？

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

user: user-2
content: 去gnu下载glibc源码看看printf的实现即可

user: user-3
content: 如果真想搞清楚到底是几个，还是翻编译器源代码吧，最直接

user: user-4
content: 经多个编译器测试，确实不行，但不必纠结此事，了解即可。
user-0 提问: 快速排序划分先处理较短的那部分 能提高效率吗？

回复:
user: user-1
content: 楼主我估计在你之前至少有上几十万人次企图优化快速排序算法而不得！

user: user-2
content: 没区别的，都是要算，谁先谁后一样 你这个优化思路的正解是分治后并行计算。但一般没这个必要  我面试别人的时候问快排如果问别人如何优化，基本答出随机化主元以及为什么要这么做就行了。

user: user-3
content: 根较短的没关系吧。跟划分的关键字有关

user: user-4
content: 递归深度用于stack 跟效率关系不大

user: user-5
content: 你可以自己模拟一下啊
user-0 提问: c语言如何求得结构体内某个元素的长度

回复:
user: user-1
content: LZ 的给分。。。，感觉你依旧不懂你的问题。

user: user-2
content: 糊涂了，直接用空指针就可以了啊  sizeof(((struct card *)0)->b);

user: user-2
content: 在不考虑对齐的情况下，可以使用offsetof  #include <stdio.h> #include <stddef.h>   struct card  {        char a;        char  b[4];        char   c; };  int main(int argc, char *argv[]) {         size_t size;          size = offsetof(struct card, c) - offsetof(struct card, b);         printf("size=%d\n", size);          return 0; }

user: user-3
content: 这让我想起Kernel的container_of关键技术了  #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER)  #define container_of(ptr, type, member) ({                      \          const typeof( ((type *)0)->member ) *__mptr = (ptr);    \          (type *)( (char *)__mptr - offsetof(type,member) );})

user: user-4
content: sizeof(A1.b)/sizeof(A1.b[0]);

user: user-4
content: sizeof(A1.b/A1.b[0]);

user: user-1
content: 同意 7楼， 对齐就有偏差了  通常的严谨的结构定义都是需要pack（1），即使对齐也要在结构中添加 reserve来主动对齐。

user: user-5
content: 在确保结构体内部字节对齐的前提下(无无效字节)，可以如楼上的楼上所说。  (int)(&(((struct card *)0)->c)) -(int)( &(((struct card *)0)->b)),若c为int的话，就不可用了。

user: user-6
content: [code = c] struct card { 	char a; 	char  b[4]; 	char   c; }; int main(void) { 	printf("%d\n", sizeof(card::a));  //1 	printf("%d\n", sizeof(card::b));  //4 	printf("%d\n", sizeof(card::c));  //1 	return 0; } [/ code]  查看偏移量 [code = c] struct card { 	char a; 	char  b[4]; 	char   c; }; int main(void) { 	printf("%d\n", offsetof(struct card, a));   //0 	printf("%d\n", offsetof(struct card, b));   //1 	printf("%d\n", offsetof(struct card, c));   //5 	printf("%d\n", sizeof(struct card));        //6 	system("pause"); 	return 0; } [/ code]

user: user-1
content: (int)(&(((struct card *)0)->b)) 获得b开始地址，(int)(&(((struct card *)0)->c)) 获得c开始地址  答案就是：(int)(&(((struct card *)0)->c))  - (int)(&(((struct card *)0)->b))

user: user-1
content: (int)(&(((struct card *)0)->b))

user: user-7
content: 试试这个呢？ sizeof(card::b); c++里新增了，不知道c语言里怎么样

user: user-0
content: 必须声明一个具体的结构体吗,就像我自己试过的那样？

user: user-8
content: 必须声明结构体，才可以
user-0 提问: leetcode OJ的longest Common Prefix这一题，我用C写的，提交之后有bug（OJ说两个“a”的时候不符合），可是我自己测试却可以。

回复:
user: user-1
content: 仅供参考，简化：  #include <stdio.h> char *longestCommonPrefix(char **strs, int n) { 	int i, j; 	static char prefix[100]; 	strcpy(prefix, strs[0]); 	for (i = 1; i < n; i++) 	{ 		j = 0; 		while (prefix[j] && prefix[j] == strs[i][j]) j++; 		prefix[j] = '\0'; 	} 	return prefix; } int main(void) { 	//char *strs[] = { "abcdabc", "abcdxxxx", "abcyyyyy" }; 	char *strs[] = { "a", "a" }; 	printf("%s\n", longestCommonPrefix(strs, sizeof(strs)/sizeof(*strs))); 	return 0; }
user-0 提问: 【新手求解答】 结构体 在函数中赋值的问题！

回复:
user: user-1
content: # include <stdio.h> # include <malloc.h>  struct xues { int age; int fens; char sex; };  void f (struct xues ** A, int t) { int i = 0;  printf("请输入学生的具体资料："); printf("\n"); for(i = 0; i < t; i++) { //	 printf("第%d个学生的信息："，i + 1 );   //19行   printf("age = "); scanf("%d", &((*A[i]).age));  printf("fens = "); scanf("%d", &(*A[i]).fens);  printf("sex = "); scanf("% c", &(*A[i]).sex);  } }  int main (void) { int len; struct xues * p; int t; printf("请输入学生的个数："); scanf("%d", &len);  p = (struct xues *)malloc(len * sizeof(struct xues)); printf("\n");  f(&p, len);  printf("---------------------------------------------------------\n");  for(t = 0; t < len; t++) { printf("第%d个学生的信息是：\n", t); printf("age = %d, fens = %d, sex = %c\n", p[t].age, p[t].fens, p[t].sex); } return 0; } 你说的问题没有了！但是又有新的问题！你自己看看吧！

user: user-2
content: 修改如下：  #include <stdio.h> #include <malloc.h> struct xues { 	int age; 	int fens; 	//int sex; 	char sex; };  void f(struct xues *A, int t)  //直接使用一级指针即可 { 	int i = 0;  	printf("请输入学生的具体资料："); 	printf("\n"); 	for (i = 0; i < t; ++i) 	{ 		//printf("第%d个学生的信息："，i + 1 );   //19行  error:需要英文',' 		printf("第%d个学生的信息：", i + 1); 		printf("age = "); 		scanf("%d", &(A[i].age));  		printf("fens = "); 		scanf("%d", &(A[i].fens));  		getchar();    //读入回车，必须的 		printf("sex = "); 		//scanf("%d", &(*A[t]).sex); 		scanf("%c", &(A[i].sex)); 	} }  int main(void) { 	int len; 	struct xues * p; 	int t; 	printf("请输入学生的个数："); 	scanf("%d", &len);  	p = (struct xues *)malloc(len * sizeof(struct xues)); 	printf("\n");  	f(p, len);  	printf("华丽的分割线\n");  	for (t = 0; t < len; ++t) 	{ 		printf("第%d个学生的信息是：\n", t + 1); 		//printf("age = %d, fens = %d, sex = %d\n", p[t].age, p[t].age, p[t].sex); 		printf("age = %d, fens = %d, sex = %c\n", p[t].age, p[t].fens, p[t].sex); 	} 	//释放内存 	free(p); 	system("pause"); 	return 0; } //f->female, m->male //请输入学生的个数：3 //请输入学生的具体资料： //第1个学生的信息：age = 12 //fens = 89 //sex = f //第2个学生的信息：age = 13 //fens = 92 //sex = m //第3个学生的信息：age = 13 //fens = 88 //sex = f //华丽的分割线 //第1个学生的信息是： //age = 12, fens = 89, sex = f //第2个学生的信息是： //age = 13, fens = 92, sex = m //第3个学生的信息是： //age = 13, fens = 88, sex = f

user: user-3
content: 十九行逗号是中文的, 改成,就好了 后面的(*A)[i]形成(*A)[t]了, *A外面加个括号 		scanf("%d", &((*A)[i].age));  		printf("fens = "); 		scanf("%d", &((*A)[i].fens));  		printf("sex = "); 		scanf("%d", &((*A)[i].sex));
user-0 提问: 递归逆序输出带有头结点链表问题，求解决

回复:
user: user-0
content: 你这是不带头结点啊，那么带头结点呢

user: user-1
content: int inverseListWithoutHead(LinkList L) {         return inverseList(L-next); }  main函数直接inverseListWithoutHead（L）
user-0 提问: 利用指针交换两者数据，这样为什么运行就显示11db?

回复:
user: user-1
content: void exchange(float *num1, float *num2) {       float temp;       temp = *num1;       *num1 = *num2;       *num2 = temp;   }

user: user-2
content: #define SWAP(a,b)  ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):(1);

user: user-3
content: void exchange(float *num1 ,float *num2) {        float *temp = new float  ; \\要分配空间      *temp= *num1;           *num1 = *num2;           *num2 = *temp;      delete c;     }

user: user-2
content: 更改如下：  #include <stdio.h> void exchange(float *num1, float *num2); int main(int argc, const char * argv[]) {  	float a = 10.5; 	float b = 18.8; 	exchange(&a, &b); 	printf("a=%.1f,b=%.1f\n", a, b); 	system("pause"); 	return 0; } void exchange(float *num1, float *num2) { 	//float *temp;   //指针都没有指向，后面如何使用 	float temp;      //这里只需使用简单类型即可 	temp = *num1; 	*num1 = *num2; 	*num2 = temp; } //a=18.8,b=10.5

user: user-4
content: #include <stdio.h>  void exchange(float *num1, float *num2);   int main(int argc, const char * argv[]) {  	float a = 10.5f;  	float b = 18.8f;  	exchange(&a, &b);  	printf("a=%.1f,b=%.1f\n", a, b);  	getchar();  	return 0; }  void exchange(float *num1, float *num2) {  	float temp;  	temp = *num1;  	*num1 = *num2;  	*num2 = temp;  }

user: user-5
content: 仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2
user-0 提问: 菜鸟关于文件读写的三个问题

回复:
user: user-1
content: a+ 打开文件不会把原来的文件内容清楚，所以你运行一次，文件的内容都会增加。 just so

user: user-2
content: 1. 统计有多少行 2. 只是输出显示,对于溢出..其有依赖于 中间的那行输入 while (gets(words) != NULL  && words[0] != '\0')  对于溢出处理,不管输入/输出都要作长度限制.这是比较有效的处理方法 //////-------------------------------------------------------- 对于 fp = fopen("wordy", "a+"); ....这里的 "a+" ,这是一个以添加读写式打开/创建一个文件. 其内部文件读指针与文件写指针是不同步的 文件读指针: 开始指向 位置 0 (有些环境会指出文件结尾 - -!!!) , 对于 fseek 等操作有效 文件写指针: 始终指向文件结尾,  不受 fseek等操影响  //------------------------------ 所以最后的输出之前需要rewind()

user: user-3
content: fgets(words,39,fp) != NULL;改为fgets(words,40,fp) != NULL;最多读入40-1=39个字节，其它的1楼正解

user: user-4
content: #include <stdio.h> #include <stdlib.h> int main(void)  { 	FILE *fp; 	char words[40]; 	int count = 0; 	fp = fopen("wordy", "a+"); 	while ( fgets(words,39,fp) != NULL)   //读文件内容 存到words 	{ 		count++; 		printf("words = [%s]\n", words); 	} 	while (gets(words) != NULL  && words[0] != '\0')//读标准输入 	{ 		fprintf(fp, "%d:%s\n", count++, words); //写入文件 	} 	rewind(fp);                                       //回到文件开头 	while (fscanf(fp,"%s",words) == 1)                //读文件内容到 words  每次读一个字符串,当输入字符串的长度超过40时发生错误 		puts(words);         	fclose(fp); 	return 0; }
user-0 提问: 威慑么

回复:
user: user-1
content: (-1) ^ (i + 1)     // 这里的^表示的是异或运算，并不乘幂 仅供参考：  #include<stdio.h> double sum(int n) { 	int i, flag; 	double a, s; 	i = flag = 1; 	a = 1; 	s = 0; 	while (i <= n) 	{ 		s += flag / a; 		a++; 		flag = -flag; 		i++; 	} 	return s; } int main(void) { 	int n; 	scanf("%d", &n); 	double s; 	s = sum(n); 	printf("s=%.1f\n", s);  //保留一位小数输出 	return 0; } //2 //s=0.5 //3 //s=0.8 //4 //s=0.6
user-0 提问: 【新手求助】 关于指针 数组 函数之间的一个问题 

回复:
user: user-1
content: 引用 4 楼 ViviaN_0214 的回复:[quote=引用 2 楼 relaxisland 的回复:] p[d]  等价于 *(p+d) 因此     *i[2] = 3;  的正确写法是  （*i）[2] = 3;    谢谢大牛~ 能问问具体的原因么？ *i等价于p   *i[2] 等价于 p[2]  这里的* i 要用括号 括起来的原因是什么 能给详细说说么 感激不尽！[/quote] 1+2=3 所以1+2 * 2 = 3*2 = 6吗

user: user-0
content: 引用 2 楼 relaxisland 的回复:p[d]  等价于 *(p+d) 因此     *i[2] = 3;  的正确写法是  （*i）[2] = 3;    谢谢大牛~ 能问问具体的原因么？ *i等价于p   *i[2] 等价于 p[2]  这里的* i 要用括号 括起来的原因是什么 能给详细说说么 感激不尽！

user: user-2
content: p[d] 不等价于 *p+d

user: user-3
content: p[d]  等价于 *(p+d) 因此     *i[2] = 3;  的正确写法是  （*i）[2] = 3;

user: user-0
content: 引用 5 楼 jiht594 的回复:[quote=引用 4 楼 ViviaN_0214 的回复:] [quote=引用 2 楼 relaxisland 的回复:] p[d]  等价于 *(p+d) 因此  *i[2] = 3;  的正确写法是  （*i）[2] = 3;   谢谢大牛~ 能问问具体的原因么？ *i等价于p   *i[2] 等价于 p[2]  这里的* i 要用括号 括起来的原因是什么 能给详细说说么 感激不尽！[/quote] 1+2=3 所以1+2 * 2 = 3*2 = 6吗 [/quote]  大牛今天又遇到这个类似的问题了 求帮助     昨天内个搞懂了 自己书写格式错误 缺少括号   今天这个 也是一样的书写格式错误么？  但是在main 里面 *（p+2->.b也一样不可以赋值 如果他是指向地址的话 等价于他的 另一种书写方式 咋就可以赋值了

user: user-4
content: 引用 4 楼 ViviaN_0214 的回复:[quote=引用 2 楼 relaxisland 的回复:] p[d]  等价于 *(p+d) 因此     *i[2] = 3;  的正确写法是  （*i）[2] = 3;    谢谢大牛~ 能问问具体的原因么？ *i等价于p   *i[2] 等价于 p[2]  这里的* i 要用括号 括起来的原因是什么 能给详细说说么 感激不尽！[/quote] 优先级的问题，参考 C语言操作符优先级 *(解引用)优先级2比+加法优先级4高，所以*先运算

user: user-5
content: B是不是少了一个括号
user-0 提问: 八皇后问题请教

回复:
user: user-1
content: 仅供参考：#include <stdio.h> int d[8][8]; int n; void queen8(int L) {     int x,y;      if (8==L) {         n++;         printf("%d\n",n);         for (y=0;y<8;y++) {             for (x=0;x<8;x++) { //              printf("%d",d[y][x]);                 if (d[y][x]) printf("■");                 else         printf("□");             }             printf("\n");         }         return;     }     for (x=0;x<8;x++) {         for (y=0;y<L;y++) {             if  (              d[y][x      ]              || (x-(L-y)>=0 && d[y][x-(L-y)])              || (x+(L-y)< 8 && d[y][x+(L-y)]))                 break;         }         if (y>=L) {             d[L][x]=1;             queen8(L+1);             d[L][x]=0;         }     } } int main() {     int y,x;     for (y=0;y<8;y++) {         for (x=0;x<8;x++) {             d[y][x]=0;         }     }     queen8(0);     return 0; }  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-2
content: 八皇后问题不需要象chess这样的二维数组，每行只能放一个，其实用一个a[8]保存每个列的坐标就行了。位置判断也相应简化了一点，只需要不同列，不同对角线判断 int sum,a[8]; bool isput(int r,int c) {     for(int k=0;k<r;k++)         if(a[k]==c || abs(r-k)==abs(a[k]-c))             return false;     return true; }  void queen(int r) {     for(int c=0;c<8;c++) if(isput(r,c)) {         a[r] =c;         if(r==7) { sum++;}         else queen(r+1);     } }

user: user-0
content: 编辑下，，看书上说递归调用好像想完全弄清楚每一步很困难，只要搞清楚释放递归的条件和大致的原因即可，是这样吗。我感觉我现在对于这个问题的理解就处于这种程度上，不是完全理解每一步，但是对于这个递归这样的写法和原因算是大致的掌握了。

user: user-3
content: 如果让你放，你怎么放？

user: user-4
content: 这问题最好就是自己设置较少的量，单步调试几遍就会有了自己深入的理解。其他人说多了更糊涂

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

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:八皇后问题不需要象chess这样的二维数组，每行只能放一个，其实用一个a[8]保存每个列的坐标就行了。位置判断也相应简化了一点，只需要不同列，不同对角线判断 int sum,a[8]; bool isput(int r,int c) {     for(int k=0;k<r;k++)         if(a[k]==c || abs(r-k)==abs(a[k]-c))             return false;     return true; }  void queen(int r) {     for(int c=0;c<8;c++) if(isput(r,c)) {         a[r] =c;         if(r==7) { sum++;}         else queen(r+1);     } } 引用 2 楼 fly_dragon_fly 的回复:八皇后问题不需要象chess这样的二维数组，每行只能放一个，其实用一个a[8]保存每个列的坐标就行了。位置判断也相应简化了一点，只需要不同列，不同对角线判断 int sum,a[8]; bool isput(int r,int c) {     for(int k=0;k<r;k++)         if(a[k]==c || abs(r-k)==abs(a[k]-c))             return false;     return true; }  void queen(int r) {     for(int c=0;c<8;c++) if(isput(r,c)) {         a[r] =c;         if(r==7) { sum++;}         else queen(r+1);     } }  我不理解的地方就是对角线的判断，，希望能仔细的解释下，，谢谢。。
user-0 提问: char 

回复:
user: user-0
content: 、。。。、。。、、。。、O(∩_∩)O  谢谢

user: user-1
content: 2楼正解：'10' == 49 * 256 + 48 == 12592

user: user-2
content: - -!!! 现在的小朋友是不是象力越来越丰富了... // ---------------------------------------------------------- '10' 不等 10 对于直接那 'xxxx' 多字节符来作运算,编译器会把内存内容做作一个int来处理 如 '10', 即两个字节 '1'  '0' ,   '1' 的 ascii 码为49   '0'为48,那么 '10' == 49 * 256 + 48 == 12592 ch1 == '3' == 51  (ascii 码) n1 = ch1 - '10'  即  51 - 12592 == -12541  .... ... // ------------------------------------------------------- 当然不是你想要的结果啦..

user: user-3
content: n1 = ch1 - '\10'; 	n1 = ch1 - 10; 	n1 = ch1 - 0x10; 	n1 = ch1 - 010;
user-0 提问: 关于c语言编程获取bios中的温度数据的方法。请高手指点。

回复:
user: user-0
content: 这个域名打不开呀。

user: user-1
content: 引用 1 楼 user-2 的回复:有个open-hardware-monitor开源工具，不过是C#的，不知道你能看懂不。 源码地址：https://code.google.com/p/open-hardware-monitor/ 一楼的，域名被墙了吧！

user: user-2
content: 有个open-hardware-monitor开源工具，不过是C#的，不知道你能看懂不。 源码地址：https://code.google.com/p/open-hardware-monitor/

user: user-2
content: 引用 3 楼 joyson2015 的回复:这个域名打不开呀。  打不开就在csdn下载里搜吧
user-0 提问: libcurl的回调函数中将收到HTTP Body赋值给全局变量

回复:
user: user-1
content: 你这个程序有很多问题： 1、35行申请内存cresult，36行又把buffer赋给cresult，这样第35行申请的内存就泄露了。 2、每次解析HTTP Body libcurl都会有一个内存区域来存放Body，然后调用回调函数write_func，第一个参数buffer就是存放Body的指针，每次你都把buffer指针赋给cresult，所以第34行free的其实是buffer而不是第35行申请的内存，如果buffer是栈内存而不是堆内存的话，程序将可能coredump。 3、第63行curl_easy_cleanup之后应该会释放libcurl库内部申请的内存，包括存放HTTP Body的buffer，所以会出现你所说的问题。 4、第33行和第66行的锁不是这么用的，你得清楚你要锁什么，尽量不要把加锁和解锁放到两个不同的函数中，尽量把锁的粒度压到最小。

user: user-2
content: 没用过这个库 我猜有可能过了生存周期释放了，你memcpy吧。
user-0 提问: ubuntu进程调用子进程执行不同的任务

回复:
user: user-0
content: 谢谢了哈，我仔细学习一下

user: user-1
content: 《Unix编程艺术》

user: user-0
content: 我就想要一个例子  大哥们速度给一个呀

user: user-2
content: //#include "apue.h"  #include <unistd.h> #include <stdlib.h> #include <stdio.h>  #define err_sys(str) perror(str), exit(-1)  int		globvar = 6;		/* external variable in initialized data */ char	buf[] = "a write to stdout\n";  int main(void) { 	int		var;		/* automatic variable on the stack */ 	pid_t	pid;  	var = 88; 	if (write(STDOUT_FILENO, buf, sizeof(buf)-1) != sizeof(buf)-1) 		err_sys("write error"); 	printf("before fork\n");	/* we don't flush stdout */  	if ((pid = fork()) < 0) { 		err_sys("fork error"); 	} else if (pid == 0) {		/* child */ 		globvar++;				/* modify variables */ 		var++; 	} else { 		sleep(2);				/* parent */ 	}  	printf("pid = %ld, glob = %d, var = %d\n", (long)getpid(), globvar, 	  var); 	exit(0); }

user: user-2
content: 看《UNIX环境高级编程》《网络编程第2卷》上面例子很多，有其后面一本

user: user-3
content: 楼主要的是进程池？

user: user-4
content: 你要学的东西好多， 进程间通信， fork和vfork函数的区别。 还有让子进程运行不同的任务， 需要研究exec 函数族。。

user: user-1
content: 在网上搜demo
user-0 提问: printf("123"); 	while(1); 在Linux下无输出，在Windos下有输出？

回复:
user: user-0
content: 谢谢各位的回答~fflush()很好用~

user: user-1
content: 1l， 2l的方法都可行。 printf输出到屏幕的几种情况： 1.输出缓冲区满了 2. 程序结束 3. 遇到"\n" (1L的办法) 4. 人为刷新输出缓冲区.(2楼的办法，fflush(stdout));

user: user-2
content: 用fflush(stdout)

user: user-3
content: 加一个换行 "123\n" 试试
user-0 提问: 一个似乎是C++可以解决的问题

回复:
user: user-1
content: 跟 c++ 没必然联系，就是写模拟程序，先写清楚算法，再按照算法写实现，哪里卡住了再说具体问题。

user: user-2
content: 这不是《概率统计》书里面的习题吗？你查查浙大那一本，温习下知识，自己就能搞定

user: user-3
content: 这东西首先是个数学问题, 我不知道算的对不对.渣数学 for 1-1000   分别计算R1R2R3是否坏了(如R1坏几率是58%, 取随机数(1-100), 如果随机数在1-58之间, 就是坏了)   if(需要修理)     修理     t修理时间增加(修理时间也就是停运时间, 可以按R1R2R3分别计算)   else     t正常时间增加 print t正常时间, t修理时间 tr1 tr2 tr3(修理r1r2r3的时间)

user: user-0
content: 不用考虑A,B都坏了，C就不用工作这种情况，认为三个是完全独立的。
user-0 提问: 读取指定个数的字符，按照要求输出。当指定数目≥32时，出错。

回复:
user: user-0
content: 引用 3 楼 jiht594 的回复:int number;       if(argc > 1){         printf("Please enter the maximum number you want input: ");         scanf("%d", &number);         char *string = new char[number]; ... ...        delete[] string; 我知道了，在声明变长数组之前，变量必须先被赋值。

user: user-1
content: 1楼把你的问题指出来了， 你的 char strings[number]  要动态分配。。你不管传多少，你的字符数组strings的大小在程序启动的时候就已经定死了。

user: user-2
content: 数组大小不能动态变化。

user: user-3
content: 需要修改： char string[100];

user: user-4
content: int number;       if(argc > 1){         printf("Please enter the maximum number you want input: ");         scanf("%d", &number);         char *string = new char[number]; ... ...        delete[] string;

user: user-3
content: 没发现你所说的问题。

user: user-5
content: /***********************************************************************  *读取输入直到文件结尾，按照用户指定输出  *-p：原样输出；-u：转为大写；-l转为小写  * */ #include <stdio.h> #include <ctype.h>  void getInput(char *string, int number); void toUpper(char *string); void toLower(char *string); void showString(const char *string);  int main(int argc, char *argv[]) {     int number;     char *string;      if(argc > 1){         while (1)             printf("Please enter the maximum number you want input(1..10000000): ");             fflush(stdout);             rewind(stdin);             number=0;             scanf("%d", &number);             if (1<=number && number<=10000000) break;         }         string=new char[number];         if (NULL==string) return 1;         while('\n' != getchar())             ;         getInput(string, number);         switch(argv[1][1]){             case 'p': printf("You choose SHOW IT SELF: \n");                       showString(string);                       break;             case 'u': printf("You choose TOUPPER: \n");                       toUpper(string);                       showString(string);                       break;             case 'l': printf("You choose TOLOWER: \n");                       toLower(string);                       showString(string);                       break;             default : printf("WRONG!\n");         }         delete[] string;     } else         printf("Please enter \"-p\" or \"-l\" or \"-u\" atfer the "                 "program name!\nDone!\n");      return 0; }  void getInput(char *string, int number) {     int index;      printf("Please enter no more than %d characters:\n", number);     for(index=0; index<number; index++)         string[index] = getchar();     string[index] = '\0'; }  void toUpper(char *string) {     while(*string){         *string = toupper(*string);         string++;     } }  void toLower(char *string) {     while(*string){         *string = tolower(*string);         string++;     } }  void showString(const char *string) {     while(*string)         putchar(*string++); }
user-0 提问: ubuntu下读出的中文标点无法匹配

回复:
user: user-0
content: 谢谢三楼！！

user: user-0
content: 我觉得无论用什么编码方式存储的（实际是utf-8），读出来总可以通过str[i]&0xff  ==  ？str[i+1]&0xff == ？,str[i+2]&0xff == ？进行匹配吧？

user: user-1
content: ubuntu环境一般是UTF-8编码吧。。所以'，'占三个字节，你要比较三个字节才行 你试试 char str[] = "，"; printf("%d", sizeof(str)); 应该是4吧

user: user-2
content: 。和，不是一回事！

user: user-3
content: 你把关键代码贴出来看看
user-0 提问: 遗传算法给染色体解码程序中 if(*pointer-'0') 这句是什么意思？

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:等价于 if(pointer[0]-'0'!=0) 即pointer[0]不是'0'  大哥能解释下这个函数吗   我不太懂  为什么是 if(*pointer-'0') {decimal+=(long)pow(2,i);} 谢谢

user: user-1
content: 等价于 if(pointer[0]-'0'!=0) 即pointer[0]不是'0'

user: user-1
content: 引用 2 楼 jp417799578 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 等价于 if(pointer[0]-'0'!=0) 即pointer[0]不是'0'  大哥能解释下这个函数吗   我不太懂  为什么是 if(*pointer-'0') {decimal+=(long)pow(2,i);} 谢谢[/quote] 如果当前位置的字符不是'0'（那也就是'1'了），将当前二进制字符串对应的十进制数decimal累加2的i次方。

user: user-2
content: 这一句相当于比较pointer[0]的字符和‘a’字符相不相等的意思。是通过ascii来比较的，字符相同的ascii值就是一样的。
user-0 提问: 大二菜鸟求助

回复:
user: user-0
content: 整整一年，我终于弄明白了  谢谢大家

user: user-1
content: 动态分配内存       （首地址类型）malloc（每块内存大小*内存块数）     一般将他的返回值赋给一个指针！其他的看书吧！

user: user-2
content: #include<stdio.h> #include<stdlib.h>  struct person { 	char name [10]; 	int age; 	char sex [10]; 	struct person *next; };  struct person *per = (struct person*) malloc (20 * sizeof (struct person) );  int main (int argc, char** argv) {   struct person person1 = {"person",18,"sex"};    printf("%s\t%ld\t%s\t",person1.name,person1.age,person1.sex);   return 0; }  首先结构体中定义的 name 只是一个字节，是存不了两个汉字的长度的，sex 也一样道理。 再者，全局变量可以在声明时初始化，但不能像你写的那样重新用一个赋值语句，如果要这样写，就在函数上下文中写，即是在main （）中写。

user: user-3
content: #include<stdio.h> #include<stdlib.h> struct person { char name[10]; int age; char sex[3]; struct person *next; }; //struct person *per; //per=(struct person*)malloc(20*sizeof(struct person));  void main() { struct person *per; per=(struct person*)malloc(20*sizeof(struct person));  struct person person1={"人物",18,"男"};  printf("%s\t%ld\t%s\t",person1.name,person1.age,person1.sex); } 你的结构体创建要注意一些问题，汉字是一个字、俩字节。动态创建有好处就是你需要多少结点就建立多少结点，给你省很多空间。

user: user-4
content: 3楼定义全局变量不能调用函数。  要么将struct person *per = (struct person*) malloc (20 * sizeof (struct person) );这句置于main函数中。  或者定义全局变量struct person *per；空间分配在main函数内per= (struct person*) malloc (20 * sizeof (struct person) )。

user: user-5
content: 你需要好好去看书,  或者去贿赂一下学的好的同学, 然后请教他(她)
user-0 提问: c语言问题

回复:
user: user-1
content: int i = 0; int sum = 0; char state[30];  // initialize state array... for (; i < 30; i ++) {     sum += state [i] ? state [i] : 0; } // output sum   代码应该是这样

user: user-1
content: 创建一个30单位的char 数组，每一个元素代表一天的出勤情况，1代表出勤，0代表缺勤。 之后迭代这个数组，如果元素为1，则工资总和加上50，否则continue。 很简单的问题！  int i = 0; int sum = 0; char state[30];  // initialize ... for (; i < 30; i ++) {     sum += state [i] ? state : 0; } // output sum

user: user-2
content: 仅供参考 #include <stdio.h> #include <stdlib.h> void main() { 	char state[31]={0}; 	for(int i=0;i<31;++i) 	{ 		state[i]=rand()%2; 	} 	int salary=0; 	for(int j=0;j<31;++j) 	{ 		salary+=state[j]*50; 	} 	printf("三月份工资为:%d\n",salary); }

user: user-3
content: 如果不用程序你会做吗，很难............
user-0 提问: 一个很操蛋的问题

回复:
user: user-1

user: user-2

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

user: user-4

user: user-5
content: 你这，，，，，，，，，，

user: user-6
content: 顶下，领分哦。。

user: user-7
content: VC中errno是一个宏吗，我以为只是在Linux/Unix中的系统才是定义过的...
user-0 提问: 求大神创建一个单链表

回复:
user: user-1
content: 我也是初学者，自己写了个，不过是c++的有兴趣可以看看，希望能帮到你。 http://blog.csdn.net/zuiailongkui_yanghl/article/details/44804707

user: user-2
content: 关注，学习，这个“判断指针域是否为NULL来终止创建的方式”怎么做？
user-0 提问: 把英文小写字符串转化成整形数组，就是把a~z变成0~25，但a在转换的时候会发生错误，直接跳过了，请问怎么回事？

回复:
user: user-0
content: 谢谢指导，是我自己大意了

user: user-1
content: while(s2[j]) 既然你把a转化为0，那么还用0来判断不就是说把a视为不存在了吗？ 用 while(j < i) 吧

user: user-2
content: 输入什么，输出什么，什么错误总要说清楚

user: user-3
content: ‘a’-96=1，所以你转换的结果对应的是1-26，而不是0-25。  因此按要求应该s1[i]-97。  此外，输出的循环的条件按楼上修改。

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

回复:
user: user-1
content: 局部变量自己先初始化一下,char b[7]={0};

user: user-2
content: fread(b,2,3,fp);    MSDN上从来没有说过fread会自动加\0

user: user-3
content: 没有0，多加个0就可以了

user: user-4
content: 应该而实际没做到的事多了去了！

user: user-5
content: 为什么要自动加0 请你告诉我，你是从哪里看到的，请告诉我好吗？我很好奇，真的想知道。 菜鸟等你的回答。

user: user-6
content: 局部变量注意要初始化！ b[7]={0};就不会出现?问题了

user: user-7
content: 2*3 = 6 自己赋个'\0'吧
user-0 提问: 初学菜鸟求各位大神帮助

回复:
user: user-0
content: 多谢楼上各位，当时手机上传的图片，没想到没有上传成功。发完贴后没有上，没想到由楼上几位大咖回复，小弟再次谢过，以后常问！

user: user-1
content: 请问图在哪里？耐心上传，我们为你解答

user: user-2
content: 图呢……无语

user: user-3
content: 搞了半天到底想问什么啊？

user: user-4
content: 慢慢总结经验，先自己寻求解决方案！别人帮你解决的也只是别人的经验，还需要自己努力才行啊！

user: user-5
content: 2楼没图也能回答问题并且得分。

user: user-6
content: 就是没图才来问，有图还问你们干什么！真是的。 东晋·僧肇（384～414），善《老》《庄》，后读《维摩经》，写成一书，取名《肇论》，共一卷，计五篇。其中，《不真空论》说道：虽无而有，虽有而无，非有非无，称之为“空”。

user: user-7
content: 没图呀 ~~~~~

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

user: user-8
content: 引用 楼主 u013409439 的回复:各位大神，初学c语言菜鸟求助 图中第六题的结果我看不懂，求解答   图在哪里？
user-0 提问: 紧急！帮忙把这个matlab代码转成C代码吧

回复:
user: user-1
content: 引用 4 楼 LongxiaoZeng2001 的回复:针对楼主问题，2个解决方式： 1.优化你的m文件，能否借助使用矩阵，matlab的向量化计算提高速度；在matlab中能不使用for就绝不使用，会拖慢速度(使用向量化方式)； 2.使用其他语言实现算法，而不是转化代码，推荐python+numpy，plot使用matplotlib；当然针对你问题，fortran之类的最好；   赵老师：不赞成你的“也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。”，这是混编吧？matlab就是这么干的，小的不才，最近准备混编c+fortran。 你还可以在你今后的苦海畅游生涯中混编： C Java Objective-C C++ C# PHP JavaScript Python Visual Basic .NET Visual Basic F# Perl Delphi/Object Pascal Transact-SQL Pascal ABAP PL/SQL Ruby MATLAB R SAS Logo Swift COBOL ML PostScript OpenEdge ABL Assembly Fortran ActionScript D Lisp Scratch Ada Scala Groovy Lua C shell Prolog Max/MSP Scheme RPG (OS/400) Awk PL/I Inform VBScript Go Z shell (Visual) FoxPro LabVIEW

user: user-2
content: 针对楼主问题，2个解决方式： 1.优化你的m文件，能否借助使用矩阵，matlab的向量化计算提高速度；在matlab中能不使用for就绝不使用，会拖慢速度(使用向量化方式)； 2.使用其他语言实现算法，而不是转化代码，推荐python+numpy，plot使用matplotlib；当然针对你问题，fortran之类的最好；   赵老师：不赞成你的“也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。”，这是混编吧？matlab就是这么干的，小的不才，最近准备混编c+fortran。

user: user-3
content: 你要plot这就比较麻烦了。。

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

user: user-4
content: 不会用vs就换txt，txt都不会用就没法了。
user-0 提问: 求问个算法问题

回复:
user: user-1
content: 我的思路跟楼上一样，变成多个等差数列来算，下面的除法(/)都是整数除法： n%1=n-(n/1)*1 n%2=n-(n/2)*2 n%3=n-(n/3)*3 ... n%n=n-(n/n)*n sum{n%n}=n*(n-1)-((n/2)*2+(n/3)*3+...+(n/n)*n) 设n/2=a，那么n/(a+1)==1,n/(a+2)==1,...,n/n==1，所以(n/(a+1))*(a+1)+...+(n/n)*n==(a+1)+(a+2)+...+n 设n/3=b，那么n/(b+1)==2,n/(b+2)==2,...,n/a==2，所以(n/(b+1))*(b+1)+...+(n/a)*a==2*((b+1)+(b+2)+...+a) ... 算到n/x<=2为止，这样算出来了。 这样算要考虑的是整型越界问题，呵呵，能用int64的话就无所谓，不能用就弄个大整数四则运算函数

user: user-2
content: 设n=s*q+r,s>r,s<=q,则n%s=n%q=r,s<=√n 举个例子，n为17 s  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 r   0  1  2  1  2  5  3  1  8  7   6   5   4   3    2    1    0 除数s从17到9,余数r为从0到8,公差为1的等差数列.s:17对应1. 除数s从8到6,余数r为从1到5,公差为2的等差数列.s:8对应2 再往前，s:5与3对应，剩个4  下面先证明一下等差数列： 设1<=t<=√n,u=n/t,则s为t与u时余数相同，设为r 则n-r=t*u 设除数为u-1时商也为t,n-r-x=t*(u-1) 则x=t. 同理，除数为u-k时，x=kt. 所以，除数大于√n时，会形成多个等差数列.  下面求一下k的范围： 设被除数为n,商为t(t<=√n) 因为除数大于余数,余数为r+kt=n%t+t*k 则(n-(n%t+t*k))/t>n%t+t*k. 解得:k<(n/t-n%t)/(t+1) 则k最大取(n/t-n%t-1)/(t+1),设为K 所以从右到左第t个等差数列为:从n%t到n%t+t*K,公差为t,共K+1项.和为t*K/2+n%t. 1<=t<=√n 再把每个等差数列的和加起来，其结果就是n%(n/√n)+...+n/n 这一步时间复杂度为O(√n)  再把n%1+...+n%√n加上 因为√n<=n/√n,当等于的时候,n%√n加了两次,这时需要减一下n%√n 这一步时间复杂度也为O(√n) 最后，两步的和即为n%1+n%2+...+n%n,然后再取个余就行了。  说了这么多，代码你就自己写吧。

user: user-3
content: 定一个数k，x<=k的时候n%k暴力算，x>k的时候对于所有y<=n/k，每一个y用O(1)时间算出所有n/x=y的n%x的和。这样总共是O(k)+O(n/k)复杂度，k取sqrt(n)的时候达到最优。

user: user-0
content: 这题限时是1sec 不能暴力

user: user-0
content: 引用 2 楼 user-3 的回复:定一个数k，x<=k的时候n%k暴力算，x>k的时候对于所有y<=n/k，每一个y用O(1)时间算出所有n/x=y的n%x的和。这样总共是O(k)+O(n/k)复杂度，k取sqrt(n)的时候达到最优。 能细说下你这个算法的原理吗 我还不是很懂
user-0 提问: 动态库 疑问

回复:
user: user-1
content: 感觉这应该是操作系统的活，我们只要做好动态链接就行了。

user: user-2
content: 《深入解析Windows操作系统-Windows Internals》

user: user-3
content: PE装载器会对这些进行处理，如果依赖的dll 已经在内存中了，则将调用例程的地址映射到PE 的IAT 中，这部分对用户是透明的，建议查查装载器相关的资料。 如果进程B 退出了，如果没有使用A 库，则这部分会被装载器回收掉！

user: user-0
content: 补充，进程B退出的时候，如果没有进程使用库A，A是继续驻留内存呢还是退出内存

user: user-4
content: 为了提高查找和加载动态连接库的效率，系统启动后会通过ldconfig工具创建一个库的缓存/etc/ld.so.cache。链接器要从LD_LIBRARY_PATH指定的路径中找到相关的库文件或者直接从/etc/ld.so.cache库缓冲中加载相关库到内存中。

user: user-4
content: 这部分工作有链接器负责。
user-0 提问: SETK_SET中的SET是哪个单词的缩写？怎么就表示文件的开头啦

回复:
user: user-1
content: 这个是规定 记住就行了 做程序员还是需要点记忆能力的

user: user-0
content: 引用 2 楼 vnvlyp 的回复:SET就是set，设置的意思 man里就有说明 SEEK_SET               The offset is set to offset bytes. SEEK_CUR               The offset is set to its current location plus offset bytes. SEEK_END               The offset is set to the size of the file plus offset bytes. SEEK_SET就是设置到offset位置 SEEK_CUR是设置到offset位置加上当前位置 SEEK_END是设置到offset位置加上文件大小  说的有道理，谢谢~~~

user: user-0
content: 这么说SEEK_SET 中的SET是offset的缩写？  为何不用SEEK_BEGIN这样的名字？

user: user-2
content: SET就是set，设置的意思 man里就有说明 SEEK_SET               The offset is set to offset bytes. SEEK_CUR               The offset is set to its current location plus offset bytes. SEEK_END               The offset is set to the size of the file plus offset bytes. SEEK_SET就是设置到offset位置 SEEK_CUR是设置到offset位置加上当前位置 SEEK_END是设置到offset位置加上文件大小

user: user-3
content: 个人感觉SET表示分两步，一：把文件指针设置到文件头（所有用SET），二，从文件开头处偏移。
user-0 提问: 疑惑，你清楚吗？

回复:
user: user-0
content: Sorry，没有看清运行的结果~~~

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

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

user: user-2
content: 引用 3 楼 imfang 的回复:注意下面两行的区别： (*9,16)000000008请按任意键继续. . . (*9,0)000000008请按任意键继续. . .  都是在读取到9个字符后并正好到文件未，为何显示的值不一样！  2楼说的很清楚，第二个程序恰恰是因为程序并不知道读到了文件末尾。只是你认为到了末尾。

user: user-3
content: 引用 1 楼 user-6 的回复:feof返回 非0值, 表示EOF  第二段程序, 你在while(){} 后面再输出一下feof(f)试一下  feof在文件指针指完EOF后才返回非0值

user: user-4
content: (*9,0)000000000(*9,0)000000008(*9,16)000000008请按任意键继续. . . (*9,0)000000000(*9,0)000000008请按任意键继续. . .

user: user-0
content: 注意下面两行的区别： (*9,16)000000008请按任意键继续. . . (*9,0)000000008请按任意键继续. . .  都是在读取到9个字符后并正好到文件未，为何显示的值不一样！

user: user-5
content: 仔细看feof的文档是怎么说的： Checks whether the end-of-File indicator associated with stream is set, returning a value different from zero if it is. This indicator is generally set by a previous operation on the stream that attempted to read at or past the end-of-file. Notice that stream's internal position indicator may point to the end-of-file for the next operation, but still, the end-of-file indicator may not be set until an operation attempts to read at that point. feof只是检查这个流的EOF标识，EOF标识一般只由之前的操作设置，比如fgetc fgets之类的，你第二个程序最后一个fgets正好读取到了文件末尾，但是这时候EOF标识是没有设置的，因为流并不知道文件读到末尾了，你必须再读一次发生错误流才知道文件读完了。你可以试试就算一个空文件，你feof肯定是0，因为你都没有进行任何操作流完全不知道这是个空文件。

user: user-6
content: feof返回 非0值, 表示EOF  第二段程序, 你在while(){} 后面再输出一下feof(f)试一下
user-0 提问: linux中如何输入 EOF ？      

回复:
user: user-0
content: 谢谢。  最终实现是 ctrl+d ctrl+d  按两次  第一次的ctrl+d相当于\n 第二次才是EOF

user: user-1
content: 按Ctrl-Z是将该程序转为后台运行。要输入fg将该程序转到前台。 输入Ctrl-D应该是EOF