Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于GCC 优化选项的问题

回复:
user: user-1
content: gcc --help gcc -v --help

user: user-1
content: -fdata-sections         place data items into their own section

user: user-1
content: -R                      fold data section into text section

user: user-2
content: man gcc 里有所有选项的解释。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:加const？并不行

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:加const？ 加const 一般不都是在.data段吗，我先试试

user: user-1
content: 加const？

user: user-0
content: 或者说，优化选项-O2到底做了哪些优化，网上基本没有说明，只是弄了一堆选项 -fthread-jumps            -falign-functions  -falign-jumps            -falign-loops  -falign-labels            -fcaller-saves            -fcrossjumping            -fcse-follow-jumps  -fcse-skip-blocks            -fdelete-null-pointer-checks            -fdevirtualize -fdevirtualize-speculatively            -fexpensive-optimizations            -fgcse  -fgcse-lm             -fhoist-adjacent-loads            -finline-small-functions            -findirect-inlining            -fipa-cp            -fipa-cp-alignment            -fipa-sra            -fipa-icf            -fisolate-erroneous-paths-dereference            -flra-remat            -foptimize-sibling-calls            -foptimize-strlen            -fpartial-inlining            -fpeephole2            -freorder-blocks-algorithm=stc            -freorder-blocks-and-partition -freorder-functions            -frerun-cse-after-loop             -fsched-interblock  -fsched-spec            -fschedule-insns  -fschedule-insns2            -fstrict-aliasing -fstrict-overflow            -ftree-builtin-call-dce            -ftree-switch-conversion -ftree-tail-merge            -ftree-pre            -ftree-vrp            -fipa-ra
user-0 提问: 汉诺塔递归算法中的回归是如何体现的

回复:
user: user-1
content: 引用 3 楼 qq_25980231 的回复:[quote=引用 2 楼 qq_36409192 的回复:] 回归的过程，其实就是结束每一层递归的过程。  就是这一点不明白，在程序中是如何体现结束每一层递归的？ 由n到n-1,....最后到1，到1 的时候不直接出去了吗，如何结束每一层递归的，感觉只有递推啊[/quote] 递归，其实就是在每一层的语句中，套用该函数，直到找到出口位置。楼主所说的回归，其实就是，找到这个出口以后，由于这个函数是在上一层函数中套用的，那么你找到这个出口以后就相当于你上个函数的递归函数执行结束了，自然而然就得回到前一个函数，依次下去，最终也就结束函数的进行。  理解的过程，需要自己在写代码的过程中去体会，我说的你可能也听的不是很明白。如果楼主还不能理解，那么我只能建议楼主去多写写代码，看看别人写的递归，自己多思考下这个过程了。

user: user-2
content: 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-0
content: 引用 2 楼 qq_36409192 的回复:回归的过程，其实就是结束每一层递归的过程。  就是这一点不明白，在程序中是如何体现结束每一层递归的？ 由n到n-1,....最后到1，到1 的时候不直接出去了吗，如何结束每一层递归的，感觉只有递推啊

user: user-1
content: 回归的过程，其实就是结束每一层递归的过程。

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

回复:
user: user-1
content: 就是double的尾数是52位吧 前边是0说明减去的float的尾数位数。

user: user-0
content: 引用 8 楼 赵4老师的回复:看不懂，结合MSDN或百度中搜相关不懂的函数说明，并单步执行看或加printf();getchar();语句输出每一步中间结果使劲看。 好，谢谢老师，我去看一下

user: user-2
content: 看不懂，结合MSDN或百度中搜相关不懂的函数说明，并单步执行看或加printf();getchar();语句输出每一步中间结果使劲看。

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

user: user-3
content: http://blog.csdn.net/techx/article/details/43830781

user: user-4
content: 先自己把 1.2 转写为二进制小数看看

user: user-0
content: 引用 2 楼 DelphiGuy 的回复:23、52位是指二进制，十进制精度哪有那么高。 对啊，所以我的困惑就是： 23和52都是二进制情况下的精度，10进制下float 6~7位，double 15~16位，但为什么在我实验过程中（上图），会出现直到52位仍然有数字的情况，而且到60位时，又恰好出现了8个0，这是巧合还是错误

user: user-0
content: 引用 1 楼 user-6 的回复:这个和浮点数的精度有关    float：   1bit（符号位） 8bits（指数位） 23bits（尾数位）   double：   1bit（符号位） 11bits（指数位） 52bits（尾数位）     float：2^23 = 8388608，一共七位，这意味着最多能有7位有效数字，但绝对能保证的为6位，也即float的精度为6~7位有效数字；   double：2^52 = 4503599627370496，一共16位，同理，double的精度为15~16位。 但是就拿double来说，既然它的精度只有15~16位，那么为什么会出现上面最多可以在52位上有数字的情况呢？

user: user-5
content: 23、52位是指二进制，十进制精度哪有那么高。

user: user-6
content: 这个和浮点数的精度有关    float：   1bit（符号位） 8bits（指数位） 23bits（尾数位）   double：   1bit（符号位） 11bits（指数位） 52bits（尾数位）     float：2^23 = 8388608，一共七位，这意味着最多能有7位有效数字，但绝对能保证的为6位，也即float的精度为6~7位有效数字；   double：2^52 = 4503599627370496，一共16位，同理，double的精度为15~16位。
user-0 提问: 用c语言画棋盘

回复:
user: user-1
content: 引用 1 楼 c_vs_noob的回复:我是根据这个写的  大佬，那个构成棋盘的线条是怎么从键盘上打出来的哦

user: user-2
content: 别人的有continue的，你不加continue，就需要把全部的if都改成else if ，或者switch break结构

user: user-3
content: 楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  下载一个EasyX包，里面有完整的函数手册EasyX_Help.chm，有示例。EasyX官网有很多网友上传的实例，包括游戏。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

user: user-3
content: 用 if ... else if if(i==0 && j==0) 的时候 后面的： if(i==0) 。。。 if(j==0) 。。。 还会执行

user: user-4
content: 条件i == max - 1  && j == max - 1的时候是不是应该有一个回车？

user: user-0
content: 我是根据这个写的

user: user-5
content: 用 定位 X  Y 坐标的方法画 更直观 容易理解   for(int i=0;i<max*max;++i) { int x=i%max; int y=i/max; 在这上面两个表达式计算后 整个棋盘每个点的X ,Y坐标都可以唯一确定了,接着你就可以根据坐标画对应的符号 在画完符号后 接一个换行控制 if(i%max==max-1) 当此条件成立的时候输出换行 } 我一直是写的C++   C的输入输出不会写   所以就不具体写了

user: user-6
content: 仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdio.h> #include <stdlib.h> #include <windows.h> HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");     SelectObject(hdc,hfont);     TextOut(hdc,10,10,"地球人都知道！",14);     MoveToEx(hdc,5,5,NULL);     LineTo(hdc,300,  5);     LineTo(hdc,300, 60);     LineTo(hdc,  5, 60);     LineTo(hdc,  5,  5);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getchar();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }
user-0 提问: int main

回复:
user: user-1
content: 有参数是为了接受dos下运行时的传递参数或者文件关联时候传递文件路径等等信息 不管如何，你写上参数总是不会错了，而且就多打敲几下键盘的事情  _tmain 是vs兼容ASCII 和 宽字符版本参数的主函数入口 主要是参数的区别，前者使用char**传递过来，后者使用wchar_t**传递过来 其他方面应该没什么差别

user: user-2
content: 在命令行中执行该程序时参数才有意义。 main和_tmain是一个东西，typedef定义的别名。

user: user-3
content: 首先，这个_tmain()是为了支持unicode所使用的main一个别名而已，既然是别名，应该有宏定义过的，在哪里定义的呢？就在那个让你困惑的<stdafx.h>里，有这么两行 #include <stdio.h> #include <tchar.h> 我们可以在头文件<tchar.h>里找到_tmain的宏定义      #define _tmain      main 所以，经过预编译以后， _tmain就变成main了，这下明白了吧

user: user-4
content: 第一个问题：是否需要传递参数，要看实际是否需要。如果需要在执行程序时由系统传递参数，则需要定义成：int main (int argc, char *argv[])否则，参数为void即可。 第二个问题，这两个接口意义是一样的，只是用在不同的环境下，Linux环境下编程就是使用int main(void)。

user: user-5
content: 在命令行中执行该程序时参数才有意义。 main和_tmain是一个东西，typedef定义的别名。

user: user-6
content: main（）在命令行中执行该程序时传递你需要的参数。 _tmain是typedef定义的别名，应该需要加上其他的头文件。还有许多类似的 比如常见的_bool.

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

user: user-8
content: 问题1：在你需要处理命令行参数或者环境变量的时候  问题2：前者是多字节版本的，后者是多字节或UNICODE的通用版本（仅VS）
user-0 提问: 一个小程序的输出问题

回复:
user: user-1
content: 另外，建议char ch;改成int ch;当然在你的这个函数里不影响，若是和EOF比较时若ch是char类型就会有问题了。

user: user-1
content: 在Linux下，回车符的ASCII值是10，通过man ascii可以看到。也可以通过 putchar(10);看一下是否相当于一个回车或者相当于printf("\n");

user: user-2
content: 10是回车符的ASCII值
user-0 提问: fread()与fwrite()在C语言中的运用

回复:
user: user-1
content: fread fwrite都是整块内容的io操作  你写文件是把整个结构体的内存写入（sizeof(struct student_score)大小） 读的时候就是一个逆向行为，把读取到的整块数据（sizeof(struct student_score)大小），赋给一个结构体

user: user-2
content: fwrite不会自动换行，只有在关闭文件的时候会自动添加结束符。 写入就是把内存中的数据放到文件中，读取是把文件中的数据取回内存中。因为写入的时候是按照sizeof(结构体)的大小写入的字节数，读取也是如此。又因为结构体大小已知，内存分布也已知：前10个字节是name，接着4个字节是num，以此类推。所以在读的时候按照这个内存分布分配数据就是了。

user: user-3
content: fwrite写入的数据是不会自动换行的，另外，以wb打开的文件，写入的数据也可能是有乱码，不过这是正常的，你只需要通过fread以相反方式读取即可得到写入的数据。fread和fwrite需要配套使用，即使用fwrite写入的数据，反过来使用fread可以读取到写入的数据。

user: user-4
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-0 提问: c

回复:
user: user-1
content: 网上搜索 “c FILE”

user: user-2
content: #include <stdio.h> #include <sys/types.h> #include <fcntl.h> #include <unistd.h>  int main(void) {     int fd;     unsigned int pos = 1024 * 1024 * 1024;      fd = open("1.txt", O_CREAT|O_WRONLY, 0666);     if (fd <= 0) {         fprintf(stderr, "open error!\n");         return -1;     }      lseek(fd, pos, SEEK_SET);      write(fd, "a", 1);     close(fd);      return 0; } 试一下这种方式～1.txt文件大小超过1G

user: user-3
content: long writeFileData(const char * filename, const char * chScrData, size_t lenScrData,bool isAppend) {     if( filename==NULL||chScrData==NULL||lenScrData<=0 ) return -1;          FILE * file = NULL;     if( isAppend )     {         file = fopen(filename, "a");     }     else {         file = fopen(filename, "w");     }          if( file!=NULL)     {         long len = ftell(file);         if( len>0) fseek(file, len, SEEK_END);         fwrite(chScrData,sizeof(char),lenScrData,file);         fseek(file, 0,SEEK_END);         len = ftell(file);         fclose(file);         return len;     }     else      {         return -1;     } } int main(int argc, const char * argv[]) {     // insert code here...     long blockSize = 1024*4;     long blockCount = 1024*256;     char * data = (char*)malloc(blockSize);     memset(data, 0, blockSize);     long i = 0;     while (1)     {         if(i>=blockSize)             break;         data[i] = i;         i++;     }     for ( i=0; i<blockCount; i++)     {         writeFileData("/users/XXX/Desktop/abc", data, blockSize, true);     }         return 0; }

user: user-4
content: 一直往文件中写数据不就好了吗。
user-0 提问: 误打误撞 不知为何要这样

回复:
user: user-0
content: 谢谢大家  学习了

user: user-1
content: 那个是取一个字符操作，把前一次未读取的换行符给读取出来并且弃用 那么就可以读下一行，否则读取字符串会为空  而gets会读取\n，并且转为\0，所以这个不需要getc读取换行符

user: user-2
content: 引用 2 楼 paschen 的回复:接收了输入完留在缓冲区中的换行符\n  否则会被后面的接收了从而使得结果不正确 正解；可以设计puts函数来验证 gets_s(c);//真的gets_s是接收了输入完留在缓冲区的回车？ 	puts("Right?"); 	puts(c);//接收了回车;puts会打印出回车来

user: user-2
content: 因为你在输入完组数后要输入字符串；在有了字符串之后才可以进行排序；

user: user-3
content: 使用能读取回车符的输入函数前，应该注意输入缓冲区是否有遗留的字符（比如回车符）

user: user-4
content: scanf读取一个字符之后会在缓冲区留一个‘\n’，这个换行符会在下次正确读取前一直在缓冲区里， 你可以用你那个函数，也可以用getchar();

user: user-5
content: 接收了输入完留在缓冲区中的换行符\n  否则会被后面的接收了从而使得结果不正确

user: user-6
content: 应该是接收的输入数字后的回车
user-0 提问: 我这个链表头部怎么插不进去

回复:
user: user-1
content: 你插入头部之所以失败，在于你else分支里的这句：s = current; 你要想在add函数内改变指针的指向必须传一级指针的引用或者二级指针才行（因为实参和形参并不是同一个指针，它们只是指向了一块相同的内存区域而已）

user: user-2
content: 引用 1 楼 jianwen0529 的回复:void Add(struct Student *&s) // 让s成为引用，这样子才能真正修改指针值 // 其他代码 if     Student *temp = s;     while         temp = s->link; //此处启用临时指针，因为此时对s的修改会影响实参，所以不能直接赋值给s         position--;     current->link = temp->link;     temp->link = current;  else //同你的代码  修正下，红色标注位置  while         temp = temp->link; //此处启用临时指针，因为此时对s的修改会影响实参，所以不能直接赋值给s         position--;

user: user-2
content: void Add(struct Student *&s) // 让s成为引用，这样子才能真正修改指针值 // 其他代码 if     Student *temp = s;     while         temp = s->link; //此处启用临时指针，因为此时对s的修改会影响实参，所以不能直接赋值给s         position--;     current->link = temp->link;     temp->link = current;  else //同你的代码
user-0 提问: 请教一个问题大神们

回复:
user: user-1
content: 你单步跟踪程序运行，观察程序执行流程以及变量变化情况，自己就可以想通原因了

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

user: user-3
content: prime number意思是质数。 3*3<=6false是跳出循环，之前为2是进入if 已经被判断为非质数了

user: user-4
content: num每自增1，下面的for语句都会先把div重置为2的，2*2=4，4<6,所以进入for循环
user-0 提问: C语言经典问题之读取到某字符串时停止读取

回复:
user: user-1
content: strstr

user: user-2
content: #include <stdio.h> #include <string.h> int main(int argc, const char * argv[]) {     // insert code here...      char s[100];     char *substr = 0;     while (1)     {         printf("Input string:");         fflush(stdout);         rewind(stdin);         fgets(s,100,stdin);         if((substr = strstr(s, "$$$")))         {             s[substr - s] = '\0';             printf("sub:%s\n",s);                  break;         }         else             printf("src:%s\n",s);     }          return 0; }

user: user-3
content: #include <stdio.h> #include <string.h>  #define  MAX_STR_LEN    1024  int main(void) {      char buff[MAX_STR_LEN], *substr;      while (fgets(buff, MAX_STR_LEN, stdin)) {         if ((substr = strstr(buff, "$$$"))) {             *substr = 0;             printf("%s\n", buff);             break;         }         printf("%s", buff);      }     return 0; }   建议使用fgets，因为从安全角度上考虑，fgets更安全，不会导致输入的数据越界。

user: user-4
content: 私聊，给你代码，加我微信2423824433

user: user-5
content: 纯手打，有什么编译错误你自己修正下  #include <stdio.h> #include <string.h>  int main(int argc, char **argv) {     char buf[1024];     while(!gets(buf))     {         char *substr = 0;         if(substr = strstr(buf, "$$$"))         {             *substr = '\0';             printf(buf);             break;         }         else             printf(buf);     } }
user-0 提问: 目前流行的操作系统到底有没有支持用户级线程

回复:
user: user-1
content: 用户线程又不需要操作系统支持, 自己随手写个就是了,  我前不久写了个 javascript 版本的, 跑着还不错...

user: user-2
content: http://blog.csdn.net/debugingstudy/article/details/12668389 这篇博客或许对你的问题有帮助～

user: user-3
content: 大部分linux或者unix的线程模型是1:1的，一个内核线程对应一个用户线程。单纯的用户级线程库应该很少，但是有这样一个机制可以实现：调度激活机制， 内核创建一个调度激活对象，通过upcall告诉用户线程库可以使用这个调度激活对象来执行线程，然后用户级线程库调度一个线程在该激活对象上来执行。但是具体哪个系统实现了不清楚。一般的情况是在线程上再使用协程，这个协程就可以认为是你说的完全是用户级“线程”。

user: user-4
content: jvm  ？
user-0 提问: 返回值为HANDLE 间接级别不同

回复:
user: user-1
content: typedef void * HANDLE;  直接把指针赋值给Int 需要强制转换， 64位系统下还有可能会被截短  建议就用 void *

user: user-0
content: 谢谢各位！解决了

user: user-2
content: HANDLE  V_OpenProcess(int ProcessID) 试试
user-0 提问: C语言经典问题之显示字符串n次

回复:
user: user-0
content: 谢啦

user: user-1
content: for(j=0;a[j]!='0';j++) 这一行应该是  for(j=0;a[j]!='\0';j++)  ‘0’只是一个普通的字符0，字符串的结尾是'\0'
user-0 提问: 如何通过SIMD指令做这样的操作？

回复:
user: user-1
content: Intel是小端,所以应该是0x0f,0x0f,0x0e,0x0e...这样逆序

user: user-2
content: https://msdn.microsoft.com/en-us/library/bb531427(v=vs.90).aspx 查MSDN是Windows程序员必须掌握的技能之一。

user: user-0
content: uint8_t a[32] = {0,1,2,3,4,5,6,7,8,                 9,10,11,12,13,14,15,16,                 17,18,19,20,21,22,23,24,                 25,26,27,28,29,30,31} ; __m256i aa = _mm256_loadu_si256((__m256i *)a); __m256i shuffle_1 = _mm256_set_epi8(0x00,0x00,0x01,0x01,0x02,0x02,0x03,0x03,0x04,0x04,0x05,0x05,0x06,0x06,0x07,0x07,                                     0x08,0x08,0x09,0x09,0x0a,0x0a,0x0b,0x0b,0x0c,0x0c,0x0d,0x0d,0x0e,0x0e,0x0f,0x0f);    aa = _mm256_shuffle_epi8 (aa, shuffle_1);         for(j=0;j<32;j++){                 printf("%d  ",((int8_t*)&aa)[j]);         }    这段代码的输出为什么是 15  15  14  14  13  13  12  12  11  11  10  10  9  9  8  8  23  23  22  22  21  21  20  20  19  19  18  18  17  17  16  16  非常不理解

user: user-0
content: 求大家出手相助！
user-0 提问: c 语言的小问题 求解答

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

user: user-2
content: 输入的内容不合格式，不会被scanf提取出去，仍然在输入流中 printf("wrong f,try again:\n"); 之前应该先清除输入流中的剩余内容 比如用 getchar 吃掉那些字符，包括最后的回车
user-0 提问: 求助！如何用SIMD指令完成如下的选择赋值?

回复:
user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:先浏览一遍intrin.h ？ 同时在MSDN里面参考其中的函数

user: user-1
content: 先浏览一遍intrin.h ？
user-0 提问: 未声明标识符

回复:
user: user-0
content: 谢谢老师们，问题解决了。

user: user-1
content: #include "stdio.h" #include<math.h> #define F(y,t)(y+2*exp(4*t)) #define w(t)((2.0/3.0)*exp(4.0*t)-(11.0/3)*exp(t)) void main() { 	int i, n = 10000; 	double h = 0.0001, y, t, y0 = -3, t0 = 0; 	y = y0; 	t = t0; 	printf("t y(t) w(t) error\n"); 	printf("===========================================================================\n"); 	printf("%.21f            %10.61f               %10.61f                   %10.61f\n", t, y, w(t), fabs(y - w(t))); 	for (i = 1; i <= n; i++) 	{  		y = y + h*F(y, t); 		t = t + h; 		if (i % 1000 == 0) 			printf("%.21f            %10.61f               %10.61f                   %10.61f\n", t, y, w(t), fabs(y - w(t))); 	} 	return; }

user: user-2
content: 区分半角() 和全角（）
user-0 提问: 求解释算法

回复:
user: user-1
content: *(n_2+i)输出字符啊！n_2是字符串的首地址，倒序输出字符串每个地址为的字符！

user: user-0
content: 自定义函数部分我算是明白了 else语句完全没用，p++也没用，只要while(m>0) {r=m%2; *p=r+48; m=m/2;} *p='\0'; 这几句就可以计算2进制结果， 回到主函数，for语句作用是把二进制得出的字符串倒序输出这个没问题，但是*(n_2+i)是什么意思？

user: user-0
content: 如您所说，书确实有印错的地方，问题是运行结果是对的

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-2
content: 书印错了。

user: user-0
content: r=m%2只能是0或1吧？为什么if语句条件是r<10？ *p=r+48是把数字r转换成ASCII码的数字赋值给p，p等于0或1，但是r>=10条件下，r+55是英文字母A、B？
user-0 提问: 回溯法做八皇后  哪里不对呢？？

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

user: user-2
content: #include <stdio.h>  int left[15]={0},right[15]={0},col[8]={0}; int q[8],top=-1; int cnt=0;  void print()  //按顺序输出  { 	int i,j; 	printf("这是第%d个解:\n",++cnt); 	for(i=0;i<8;i++) 	{ 		for(j=0;j<8;j++) 		{ 			if(q[i]==j) 				printf("Q "); 			else printf("X "); 		} 		printf("\n"); 	} }  void EightQueue () { 	int i=0,j=0; 	top=-1; 	while(i<8)  //从第一层开始  	{ 		while(j<8)  //从第一列开始  		{ 			if(col[j]==0&&left[i+j]==0&&right[i+7-j]==0)  //如果满足条件，则跳出循环  				break; 			j++; 		} 		if(j<8)  //如果跳出循环后j是在0~7，则放皇后  		{ 			q[++top]=j; 			left[i+j]=1; 			right[i+7-j]=1; 			col[j]=1; 			if(i<7)  //如果放的层数在0~7，则说明还没放完  			{ 				i++; 				j=0; 			} 			else  //8层全部放满了，输出棋盘  			{ 				print(); 				printf("\n"); 				if(top!=-1)  //如果这个时候栈非空，则回到栈顶皇后，并将其抹去  				{ 					i=top; 					j=q[top--]; 					left[i+j]=col[j]=right[i+7-j]=0; 					j++; 				} 			} 		} 		else  //如果在0~7中没找到合适的位置放皇后，则回到栈顶皇后，并将其抹去（栈不为空）  		{ 			if(top!=-1) 			{ 				i=top; 				j=q[top--]; 				left[i+j]=col[j]=right[i+7-j]=0; 				j++; 			} 		} 		if(i==-1) //当第一层的位置都已经使用过，则会使i跳到下面一层，即皇后的放法已经全部找出   			break; 	} }   int main (void) { 	EightQueue(); 	return 0; }
user-0 提问: 求解答if嵌套问题

回复:
user: user-1
content: 1.if与else一般是就近原则。栈的原理。  2.为了避免这种情况，一般if else后面都加上{};

user: user-2
content: 我觉得如果没有那个花括号的话，那个else会跟最近的那个if匹配，也就是你要括起来的那个if不会跟外面那个if匹配。

user: user-3
content: else总是与最近没匹配的if配对

user: user-3
content: 没有的话,花括号下面的else就和if((len=cc[i] * MAXHIST……这个if配对了

user: user-4
content: else是就近匹配  没脸括号，else匹配的是 之前大括号里面的那个if

user: user-5
content: 你这是什么IDE？

user: user-6
content: 引用 7 楼 yaoqibbs 的回复:你这是什么IDE？像是vim

user: user-0
content: 引用 5楼我是你的主体 的回复:引用 1楼几罗星人 的回复:没有的话,花括号下面的else就和if((len=cc[i] * MAXHIST……这个if配对了还有为什么cc【i】=1但是*打了五个出来这个知道了写完自己忘了

user: user-0
content: 引用 1楼几罗星人 的回复:没有的话,花括号下面的else就和if((len=cc[i] * MAXHIST……这个if配对了还有为什么cc【i】=1但是*打了五个出来

user: user-0
content: 引用 1楼几罗星人 的回复:没有的话,花括号下面的else就和if((len=cc[i] * MAXHIST……这个if配对了如果和最近的if配对的话，那这两个if和else是如何执行的，是否第一个if没有语句执行了
user-0 提问: accept函数返回0  write（0，buf，n）尽然可以输出。。。

回复:
user: user-1
content: 0 1 2 分别对应 标准输入 标准输出 标准出错，（在没有重定向、管道的情况下 对应了键盘 显示器 显示器）。

user: user-2
content: write（0，buf，n）的功能是向文件描述符0的文件或设备（一般是标准输入，标准输入一般重定向到终端)写入n个字节，首地址为buf的内容。 至于accept返回0,你是不是把标准输入关了，这样系统是从值最小的文件描述符开始的，0没有使用，所以就返回了 参考http://stackoverflow.com/questions/36615243/accept-returning-0-zero-stdin-fd-in-c-socket-prog

user: user-3
content: 有什么问题么？accept返回非负数就算是成功了，至于是否是0，就看当前进程可用的最小的文件描述符是多少。

user: user-4
content: 网络编程？Linux下？

user: user-2
content: 引用 6 楼 Demok_Long 的回复:[quote=引用 3 楼 ipqtjmqj 的回复:] write（0，buf，n）的功能是向文件描述符0的文件或设备（一般是标准输入，标准输入一般重定向到终端)写入n个字节，首地址为buf的内容。 至于accept返回0,你是不是把标准输入关了，这样系统是从值最小的文件描述符开始的，0没有使用，所以就返回了 参考http://stackoverflow.com/questions/36615243/accept-returning-0-zero-stdin-fd-in-c-socket-prog  一般是标准输入，标准输入一般重定向到终端 ，有这句话就是说write（0，buf，n）是可以写出来喽，我没有关闭0描述符，但是accept却自己返回0[/quote] 那就这样： int fd = open("/dev/null", O_RDONLY); dup2(fd, STDIN_FILENO); close(fd); 文件描述符分配给"/dev/null"再使用accept

user: user-0
content: 引用 3 楼 ipqtjmqj 的回复:write（0，buf，n）的功能是向文件描述符0的文件或设备（一般是标准输入，标准输入一般重定向到终端)写入n个字节，首地址为buf的内容。 至于accept返回0,你是不是把标准输入关了，这样系统是从值最小的文件描述符开始的，0没有使用，所以就返回了 参考http://stackoverflow.com/questions/36615243/accept-returning-0-zero-stdin-fd-in-c-socket-prog  一般是标准输入，标准输入一般重定向到终端 ，有这句话就是说write（0，buf，n）是可以写出来喽，我没有关闭0描述符，但是accept却自己返回0

user: user-0
content: 引用 1 楼 sum_TW 的回复:网络编程？Linux下？ @sum_TW 是的
user-0 提问: 图像数据编码后形成了码流，如何保存起来，以便比较

回复:
user: user-1
content: 所有的数据都是二进制 你所说的编码成01是什么意思？  你读取时候是用什么形式存储的？你编码过程又是怎么存储的？

user: user-2
content: 仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdlib.h> #include <stdio.h> #include <io.h> #include <conio.h> #include <windows.h> #include <atlimage.h> #include <objidl.h> void DrawPic(HDC hdc,char *buf,int len) {     HGLOBAL hMem=GlobalAlloc(GMEM_FIXED,len);     BYTE* pMem=(BYTE*)GlobalLock(hMem);     memcpy(pMem,buf,len);     IStream* pStream;     HRESULT hr=CreateStreamOnHGlobal(pMem,FALSE,&pStream);      CImage img;     img.Load(pStream);     img.Draw(hdc,CPoint(0,0));      img.Destroy();     pStream->Release();     GlobalUnlock(hMem);     GlobalFree(hMem); } //HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     HBITMAP hbm;     HDC hdcBits;     BITMAP bm;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");     SelectObject(hdc,hfont);     TextOut(hdc,10,10,"这是泡泡",8);     DeleteObject(hfont);     hbm=(HBITMAP)LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);     if (hbm) {         hdcBits = CreateCompatibleDC(hdc);         GetObject (hbm, sizeof(BITMAP), &bm);         SelectObject(hdcBits,hbm);         BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);         DeleteDC(hdcBits);         DeleteObject(hbm);     }     getch();     FILE *f;     f=fopen("c:\\new\\tmp.jpg","rb");     if (f) {         int fl=filelength(fileno(f));         char *buf=(char *)malloc(fl);         if (buf) {             fread(buf,fl,1,f);         }         fclose(f);         if (buf) {             DrawPic(hdc,buf,fl);             free(buf);         }     }     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }
user-0 提问: c语言释放动态申请的二维数组问题；

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

user: user-2
content: 申请空间时候是N-count 释放的循环写的是N-count+1

user: user-0
content: 现在知道问题解决了，是有两个数组访问越界了，但是这两个数组和c1和loc1没关系啊？为什么为在这里报错求大神解释。

user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

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

user: user-0
content: 调试的时候是在free(c1)报错的

user: user-1
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: 求解答 卡了一天了

user: user-0
content: 引用 4 楼 shihengzhen101 的回复:申请空间时候是N-count 释放的循环写的是N-count+1 中间有个count++没贴出来，不是这个问题； 怎么没人回复啦，，，

user: user-0
content: 还能顶吗？，，，，

user: user-0
content: 再顶一个！一会来看，麻烦大家了。

user: user-0
content: 老规矩，自己先顶一个
user-0 提问: 算法问题 排序和输出

回复:
user: user-1
content: #include<stdio.h>  #define N 200  int main() {     int number[N];     int n;     int i=0, j;     int k;      scanf("%d\n",&n);      for (i = 0; i < n; i++)         scanf("%2d",&number[i]);      for(j = 0; j < n; j++)         for(i = 0; i < n-1-j; i++)             if(number[i] > number[i+1])             {                 k = number[i];                 number[i] = number[i+1];                 number[i+1] = k;             }      for(i = 0; i < n; i++)         printf("%2d", number[i]);     putchar(10);      return 0; } 有多少个实际数据，就对多少个实际数据进行排序～

user: user-2
content: 排序算法有错误啦： for(int j=0;j<n;j++) for(int i=0;i<n-j-1;i++) if(number[i] > number[i+1]) { k=number[i]; number[i] = number[i+1]; number[i+1] = k; } 由于你只是要求对5个数组元素排序，可是你的算法却是对10个数组元素排序，这样当然有问题啦 PS：排版能好点吗，至少要像楼上那样啦

user: user-3
content: return 0; }

user: user-3
content: #include<stdio.h> #define N 200  int main() { 	int number[N]; 	int n,k; 	scanf("%d",&n); 	for(int i=0;i<n;i++) 		scanf("%d",&number[i]);  	for(int j=0;j<n-1;j++) 		for(int i=0;i<n-1;i++) 			if(number[i] > number[i+1]) 			{ 				k=number[i]; 				number[i] = number[i+1]; 				number[i+1] = k; 			} 	for(int i=0;i<n;i++) 		printf("%2d",number[i]); 	r
user-0 提问: 强制转换

回复:
user: user-1
content: 引用 4 楼 hswshya 的回复:[quote=引用 3 楼 qq_36409192 的回复:] x为什么会转换为float型？？？ （float） x ；  不是就把x转换成了float类型吗。。 初学，谢谢[/quote] 这是强制类型转换；是将x的值强制转换为float类型，但是x还是int类型。 第二个初始想法应该是(float *)&x吧， 第二个是将转换为float类型的指针。一般这些表达式都是要赋值给某些变量的；即作为赋值号的右边；

user: user-2
content: 第二个应该是把一个指针  转换成float型

user: user-0
content: 引用 3 楼 qq_36409192 的回复:x为什么会转换为float型？？？ （float） x ；  不是就把x转换成了float类型吗。。 初学，谢谢

user: user-3
content: x为什么会转换为float型？？？

user: user-4
content: 不同吧，指针转换跟数据类型转换不同吧。关注一下，互相学习。

user: user-5
content: (flat *)&x 才是转换指针
user-0 提问: 22行，m的表达式值看不懂？？？

回复:
user: user-1
content: int m = (n - 1) / 2; n是传入的形参

user: user-2
content: 对数组进行倒序，以中间元素为“标杆”，交换的次数就是(n-1)/2,没问题

user: user-3
content: 在定义变量的时候给出初值，这叫初始化。 初始化给出的值必须在编译的时候就能确定。 这里的int m=(n-1)是初始化，但是n也是变量，编译时无法确定值，所以肯定报错。

user: user-4
content: 22行定义了temp  i  j   m  这几个变量  并让m初始化为 (n-1) / 2的值
user-0 提问: 一个指针的问题，通过编译器调用正常，直接运行报错（增加问题描述）

回复:
user: user-0
content: 引用 2 楼 zzmlake 的回复:*tptr1= xxx;// 这句出错  估计是tptr1指向的地址不可访问，非法。 建议你用printf("%p\n", tptr1);输出地址看看。  你这代码不全，没法明确判断 rval = (ldouble *)calloc( size * size, sizeof( ldouble));    if( rval)    tptr1 = rval; 这3行是说明这个地址应该没有问题。  刚刚测试了半天出现更加诡异的问题。 在调用该函数前的一段代码加上调试语句 printf("1\n"); 一段代码 printf("2\n"); 一段代码 printf("3\n"); *tptr1= xxx; printf("4\n"); 运行程序出现 1 2 3 崩溃  如果把 printf("1\n"); printf("2\n"); 全部删掉，则直接崩溃， 3这行也看不到，就是说理论上完全没有用的printf("1\n");也会影响程序是否出错，我猜是某些随机操作，比如分配内存之类的出现问题，但是我没有办法调试。 目前能想到的解决办法是下午换个编译器试试。

user: user-1
content: *tptr1= xxx;// 这句出错  估计是tptr1指向的地址不可访问，非法。 建议你用printf("%p\n", tptr1);输出地址看看。  你这代码不全，没法明确判断

user: user-0
content: 刚刚增加了测试数据，经过测试，发现无论是通过编译器调用还是通过cmd窗口运行，一样在*tptr1= xxx;会出错，有没有人有经验，在这种情况出错的原因是什么？

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 尝试了一下，出现这个 线程 'Win32 线程' (0x2854) 已退出，返回值为 0 (0x0)。 gauss_devcpp.exe 中的 0x00435193 处未处理的异常: 0xC0000005: 读取位置 0xffffffff 时发生访问冲突 还是完全看不懂。  我刚刚找了一个codeblock，重新编译了一下，这次很顺利的把程序跑完了，没有出现那个奇怪的问题。 编译器devcpp背锅了吧

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

user: user-3
content: 重点看你那一大段代码有没有对temp直接或间接的内存指向重新修改  printf()是可能对崩溃点造成影响的 经典的情况是在一个函数内打印，然后返回局部的指针或者引用，最后在调用处打印返回结果，那么就可能并不会崩溃
user-0 提问: 求助，初学C语言，请问strcasestr究竟该如何使用？

回复:
user: user-1
content: #include <string.h>         char *strstr(const char *haystack, const char *needle);         #define _GNU_SOURCE         /* See feature_test_macros(7) */         #include <string.h>         char *strcasestr(const char *haystack, const char *needle);  DESCRIPTION        The strstr() function finds the first occurrence of the substring needle in the string haystack.  The terminating null bytes ('\0') are not compared.         The strcasestr() function is like strstr(), but ignores the case of both arguments.  RETURN VALUE        These functions return a pointer to the beginning of the located substring, or NULL if the substring is not found.

user: user-2
content: strcasestr 比 strstr 多了一个忽略大小写的功能吧，怎么用strstr就怎么用strcasestr  char *strcasestr(const char *str1, const char *str2) {   char *cp = (char *) str1;   char *s1, *s2;    if (!*str2) return (char *) str1;    while (*cp) {     s1 = cp;     s2 = (char *) str2;      while (*s1 && *s2 && !(tolower(*s1) - tolower(*s2))) s1++, s2++;     if (!*s2) return cp;     cp++;   }    return NULL; }

user: user-3
content: strcasestr函数         #define _GNU_SOURCE         #include <string.h>         char *strcasestr(const char *haystack, const char *needle);          用于在c串haystack中查找c串needle，忽略大小写。如果找到则返回needle串在haystack串中第一次出现的位置的char指针          在实际的应用中如果只加上头文件，当编译时会出现  warning: assignment makes pointer from integer without a cast         这是因为函数的声明在调用之后。未经声明的函数默认返回int型。         因此要在#include所有头文件之前加  #define _GNU_SOURCE  ，以此解决此问题。

user: user-4
content: 这种东西难得用上，没必要纠结。

user: user-5
content: http://blog.csdn.net/a1009563517/article/details/47971375

user: user-6
content: 不是标准的C，必须在linux上，在include前面还要加#define _GNU_SOURCE  参考：http://stackoverflow.com/questions/9935642/how-do-i-use-strcasestr https://linux.die.net/man/3/strcasestr

user: user-0
content: 引用 1 楼 user-6 的回复:你哪里查到有strcasestr这个函数？  我是在浙江大学的mooc上学习的，其中老师提到了一句：   课程链接：http://www.icourse163.org/course/ZJU-1001614008#/info 在字符串一课，9.2》字符串搜索函数。  后来我也查询了这个函数：http://blog.csdn.net/huanggang982/article/details/37901937  但貌似相关资料比较有限

user: user-6
content: 你哪里查到有strcasestr这个函数？
user-0 提问: C语言  吃掉换行符问题  求指教！！

回复:
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-0
content: 好像不行啊   还是把换行符写入文件里了

user: user-2
content: if (member_name[0] != ‘\0') {  fprintf(...); }  member_name[0] != '\n'  这个判不判断都可以  gets  不存储换行符的，即 '\n' fgets 存储换行符
user-0 提问: 一个内存分配的问题？ 

回复:
user: user-1
content: 空数组不占用任何内存空间，标准是说结构的最后一个元素可以是空数组，情形2这种情况是不是属于不确定的情况啊  C99的原文： As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member. With two exceptions, the flexible array member is ignored. First, the size of the structure shall be equal to the offset of the last element of an otherwise identical structure that replaces the flexible array member with an array of unspecified length. Second, when a . (or ->) operator has a left operand that is (a pointer to) a structure with a flexible array member and the right operand names that member, it behaves as if that member were replaced with the longest array (with the same element type) that would not make the structure larger than the object being accessed; the offset of the array shall remain that of the flexible array member, even if this would differ from that of the replacement array. If this array would have no elements, it behaves as if it had one element but the behavior is undefined if any attempt is made to access that element or to generate a pointer.

user: user-2
content: http://blog.csdn.net/u013165704/article/details/53733412  最后一个成员是大小为0的数组才不占用空间

user: user-0
content: 还有就是值为0 是为什么？  是编译器的原因 还是？  其他？  麻烦详细解答下。。。我写的程序因为这个困扰。。。。
user-0 提问: Uva1225 想利用itoa（）函数来解

回复:
user: user-0
content: 引用 6 楼 yangyangsnr 的回复:[quote=引用 4 楼 yangyangsnr 的回复:] 用itoa的话应该再用一个字符串存储转换的数字，然后合并到s中，itoa本身不会智能的在原字符串末尾继续添加 或者说不组合了，直接判断数字  #include <stdio.h> int main() {     int n;     int a[10];     for( int i = 0; i != 10; i++ )         a[i] = 0;      scanf( "%d", &n );          for( int i = 0; i <= n; i++ )     {         int t = i;         while( t!= 0 )         {               a[t % 10]++;                     t /= 10;         }         }              for( int i = 0; i != 10; i++ )         printf( "%d:%d\n", i, a[i] );              getchar();     getchar();     return 0; }  [/quote]先谢谢你啦！我先看看

user: user-1
content: for循环嵌套,第二个for里的循环变量不能用i,换一个 否则是死循环

user: user-0
content: 引用 9 楼 lgbxyz 的回复:case的值也错了,应该是字符 '0' ~ '9''嗯嗯，确实这里有问题，谢谢你，这个case不加break结果也是一样的，都能跑出来

user: user-0
content: 引用 5 楼 user-3 的回复:for(i=1; i <= n; i++) {    itoa(i, s, 10);      for(j=0;  s[j]; j++)     {        a[s[j] - '0'] ++;    } }谢谢你，加上你这个内循环，以及综合其他几位大神提的建议，结果正确了，能解释下内循环吗，谢谢！

user: user-1
content: case后面都没加break

user: user-1
content: case的值也错了,应该是字符 '0' ~ '9''

user: user-1
content: itoa 第一个参数错了,应该是i

user: user-0
content: 引用 2 楼 lgbxyz 的回复:把第二个for循环拿到第一个for循环里面 放进去之后输入n一直没结果出来，好像程序一直在跑，可是再怎么也不会跑那么久吧

user: user-2
content: 引用 4 楼 yangyangsnr 的回复:用itoa的话应该再用一个字符串存储转换的数字，然后合并到s中，itoa本身不会智能的在原字符串末尾继续添加 或者说不组合了，直接判断数字  #include <stdio.h> int main() {     int n;     int a[10];     for( int i = 0; i != 10; i++ )         a[i] = 0;      scanf( "%d", &n );          for( int i = 0; i <= n; i++ )     {         int t = i;         while( t!= 0 )         {               a[t % 10]++;                     t /= 10;         }         }              for( int i = 0; i != 10; i++ )         printf( "%d:%d\n", i, a[i] );              getchar();     getchar();     return 0; }

user: user-3
content: for(i=1; i <= n; i++) {    itoa(i, s, 10);      for(j=0;  s[j]; j++)     {        a[s[j] - '0'] ++;    } }

user: user-2
content: 用itoa的话应该再用一个字符串存储转换的数字，然后合并到s中，itoa本身不会智能的在原字符串末尾继续添加

user: user-0
content: 引用 1 楼 user-3 的回复:for(……) {   itoa(i, a, 10);   stract_s(s, a); }  switch (s[i])   设置断点 单步 调试， 看看结果是否是按自己的思路走的vc++6.0好像不能使用这个函数，我用dev编译，这个函数也出现 [Error] 'stract_s' was not declared in this scope

user: user-1
content: 把第二个for循环拿到第一个for循环里面

user: user-3
content: for(……) {   itoa(i, a, 10);   stract_s(s, a); }  switch (s[i])   设置断点 单步 调试， 看看结果是否是按自己的思路走的
user-0 提问: 菜鸟关于在vs2015上遇到的一个小问题

回复:
user: user-0
content: 引用 2 楼 jianwen0529 的回复:你两个程序不一样的地方 一个用的是 scanf_s 一个用的是 scanf  前者要求传入一个指定大小的参数 我用vs2015 scanf不能用  他会叫我用scanf_s替换。这是为什么？

user: user-0
content: 引用 1 楼 heyuhang112 的回复:scanf_s("%s", a);改成scanf_s("%s", &a, 20); 多谢，问题以解决。

user: user-1
content: http://blog.csdn.net/silleyj/article/details/8545408 scanf_s缺少参数。

user: user-2
content: 你两个程序不一样的地方 一个用的是 scanf_s 一个用的是 scanf  前者要求传入一个指定大小的参数

user: user-3
content: scanf_s("%s", a);改成scanf_s("%s", &a, 20);

user: user-0
content: 引用 6 楼 jianwen0529 的回复:[quote=引用 5 楼 c_vs_noob 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] 你两个程序不一样的地方 一个用的是 scanf_s 一个用的是 scanf  前者要求传入一个指定大小的参数 我用vs2015 scanf不能用  他会叫我用scanf_s替换。这是为什么？[/quote]  工程配置 -- C/C++ -- 常规 -- SDL checks 设置为No[/quote] 非常感谢！问题解决了！

user: user-2
content: 引用 5 楼 c_vs_noob 的回复:[quote=引用 2 楼 jianwen0529 的回复:] 你两个程序不一样的地方 一个用的是 scanf_s 一个用的是 scanf  前者要求传入一个指定大小的参数 我用vs2015 scanf不能用  他会叫我用scanf_s替换。这是为什么？[/quote]  工程配置 -- C/C++ -- 常规 -- SDL checks 设置为No
user-0 提问: C# 提示当前上下文中不存在名称Dcommission

回复:
user: user-0
content: 谢谢了。。跑错地方了

user: user-1
content: 你的Dcommission定义在if里面，所以它的的作用域只在if里面，改成下面这样   double Dcommission = 0.0; if (tkSpecialCampaignIdRateMap.Trim() != "null") {           Dcommission = sdx(pid); //返回比例 }  还有，C#的问题最好到C#板块去问
user-0 提问: 问一个关于c语言的入门问题

回复:
user: user-1
content: ((mount-m-n)/8.0) 计算后的值是5.5， 返回后变成5 printf打印转换成浮点型也就成5.0

user: user-2
content: 你这个test函数返回的是int类型，即使函数内计算出来是5.500000，返回时会转换为int类型，返回5，然后这个返回值赋值给b，由于b是float型，会把int类型的5转变为float类型的5.000000赋值给b

user: user-3
content: 改一下test返回值类型即可，改成float或者double。test的返回值为int类型，是现将float类型取整得5，然后又强制类型转换float给b，所以会得到5.00000; 这中间有两次类型转换，如果返回值直接是float或double就不会有中间的取整环节了。

user: user-4
content: 注意test函数返回值类型

user: user-0
content: 非常感谢大家! 我明白了(主要是点醒了我 之前也是知道函数前面的修饰符 修饰返回值类型 只是一叶障目 只记得return类型) (其实之前一直用js的) 今天看书还觉得自己发现问题 就是打印的时候%d之间加上修饰宽度/精度的值(比如%0.1就是宽度没有最小值 精度保留小数点后一位)没想到还是没想到点上 谢谢大家!  同时 6楼的朋友 我的理解是 函数前面的修饰符权重大于return的类型 或者说是强制转换为修饰符的类型 这应该是c和其他语言的不同(因为比如js都没有函数前的修饰符啊)

user: user-5
content: int test(float a[10])改为float test(float a[10])函数返回也存在类型转换

user: user-6
content: 看了您的问题我也是不太理解为什么test返回的是int类型，感觉 return ((mount-m-n)/8.0);这里应该是返回至少是浮点数类型。 如果题主明白了，再帮我解答下可好，多谢
user-0 提问: C语言小白问一个关于printf函数的问题

回复:
user: user-0
content: 明白了，我忘记替换的字符串也带有换行符，谢谢你！

user: user-1
content: "%s!C is cool!\n"   上面红色字符被替换成了："%s!C is cool!\n"  所以得到你图片的结果，因为后面是换行符，所以显示成了两行
user-0 提问: dos下面调用程序出错！求大神解答

回复:
user: user-1
content: 1.看看CPU等硬件的区别 2.有些品牌机有保护机制,不允许访问敏感区域数据

user: user-0
content: 引用 3 楼 littlebeat123 的回复:运行脚本的时候有切换到脚本所在的目录吗？ 脚本所在目录已经是在环境变量里面了，这个关系应该不大，因为他报的错和直接调用报的错都是一样的

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:需要在DosBox下运行？ 不是在DosBox下运行的，就是用ＰＸＥ启动进入的ＤＯＳ

user: user-0
content: 引用 1 楼 lgbxyz 的回复:没太明白, 一个C程序中用system函数执行一个程序, DJGPP编译后的exe在DOS中执行,报OOM错误,BC编译后在DOS中能正确执行 ? excel调用的是DJGPP编译后的exe? 用system和execl调用的是一个外部程序，这个程序不知道是用什么编译器写的，这个程序叫image for dos，但是有一点很奇怪，就是如果不能调用的话在所有机器上都应该不能调用，但是有些机型能够调用，有些机型不能调用，试了几台机子过后，发现联想的笔记本基本都不能这样调用，而用其他笔记本是可以成功调用的，而且台式机和一体机也各试过一台，也是能够调用的。

user: user-2
content: 运行脚本的时候有切换到脚本所在的目录吗？

user: user-3
content: 需要在DosBox下运行？

user: user-1
content: 没太明白, 一个C程序中用system函数执行一个程序, DJGPP编译后的exe在DOS中执行,报OOM错误,BC编译后在DOS中能正确执行 ? excel调用的是DJGPP编译后的exe?
user-0 提问: 求浮点值下溢实例

回复:
user: user-1

user: user-2
content: double d = 4.9406564584124654418e-324;   printf("%0.15f\n", d / 2.0);

user: user-3
content: （在C Primer Plus中说，以十进制为例，把一个有4位有效数字的数（如，0.1234E-10）除以10，得到的结果是0.0123E-10）  计算机里用的是二进制。 这个不是“实际”计算机里的例子。

user: user-4
content: 可以理解成精度丧失, 不用太钻研这种没有的技巧,只要知道有这么一回事就行了   float toosmall = 0.1234E-43 / 10;  printf("%e\n", toosmall);
user-0 提问: C语言经典问题之哨兵难度提升

回复:
user: user-1
content: 一楼的idx[k++]=i确实是精髓所在，但是不知道是不是我编译器问题 运行结果不一致啊

user: user-2
content: #include <stdio.h> #include <string.h>  #define     MAX_SIZE 10   int search_idx(const int *v, int *idx, int key, int n);  int main(void) {     int array[MAX_SIZE] = { 1, 7, 5, 7, 2, 4, 7};     int idx[MAX_SIZE], cnt, i;      memset(idx, -1, sizeof(idx));      cnt = search_idx(array, idx, 7, MAX_SIZE);      printf("total number: %d\n", cnt);     printf("idx list is:\n");     for (i = 0; i < MAX_SIZE; i++) {         if (idx[i] != -1)             printf("%d ", idx[i]);     }     putchar(10);      return 0; }  int search_idx(const int *v, int *idx, int key, int n) {     int i, k = 0;      for (i = 0; i < n; i++) {         if (v[i] == key)             idx[k++] = i;     }      return k; }

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:#include <stdio.h> #include <string.h>  #define     MAX_SIZE 10   int search_idx(const int *v, int *idx, int key, int n);  int main(void) {     int array[MAX_SIZE] = { 1, 7, 5, 7, 2, 4, 7};     int idx[MAX_SIZE], cnt, i;      memset(idx, -1, sizeof(idx));      cnt = search_idx(array, idx, 7, MAX_SIZE);      printf("total number: %d\n", cnt);     printf("idx list is:\n");     for (i = 0; i < MAX_SIZE; i++) {         if (idx[i] != -1)             printf("%d ", idx[i]);     }     putchar(10);      return 0; }  int search_idx(const int *v, int *idx, int key, int n) {     int i, k = 0;      for (i = 0; i < n; i++) {         if (v[i] == key)             idx[k++] = i;     }      return k; }楼主果然是厉害啊，这道题目最难的地方就在于正确储存idx数组的值，说白了这里最重要的一行代码就是idx[k++],这实在是太精彩了，感谢各位层主的大力支持

user: user-3
content: 难度太大了，写不来。

user: user-4
content: #include <stdio.h> #include <stdlib.h>   int search_idx(const int v[] ,int** idx ,int key,int n); int main() { 	int j=0; 	int v[]={1,31,34,3,2,3,7}; 	int len=sizeof(v)/sizeof(int); 	int *p=NULL;     int i=0; 	j=search_idx(v,&p,3,len);  	for(i=0;i<j;i++) 	{ 		printf("p[%d]=%d",i,p[i]);  	}  	printf("hello..."); 	system("pause"); 	return 0; }  int search_idx(const int v[] ,int** idx ,int key,int n) { 	int* tmp=NULL; 	int count=0; 	int i=0; 	for(i=0;i<n;i++) 	{ 		if(v[i]==key) 		{ 			count++; 		} 	}  	if(count==0) 		return count; 	tmp=(int*)malloc(sizeof(int)*count); 	*idx=tmp;  for(i=0;i<n;i++) { 	if(v[i]==key) 	{ 		*tmp=i; 		tmp++; 	} } return count;  }
user-0 提问: HC-05蓝牙串口接收数据丢失问题

回复:
user: user-1
content: 不懂你的问题,但是有点建议 1.输出数据的最大速率是多少 2串口的波特率是多少,能否满足输出的要求 3.输入端处理的最小速率是多少,能否满足处理全部输入数据
user-0 提问: C语言中fread和fcanf从文件读取数据的区别

回复:
user: user-1
content: fwrite和fread是以整体作为单位进行读取/写入，一般是一次读取/写入一个结构体大小的块； fscanf和fprintf是格式化的读写；类型printf/scanf，读写的都是基本类型数据，所以对于一个结构体，一次需要按照类型分别读取其中的元素；  另外，对于文件末尾判定；fscanf是以EOF作为判定， fread使用feof函数判定。

user: user-2
content: 先看x,假定CPU是32位，这是int长度就是4字节。x的存放是这样的：（x86）  06 00 00 00 01 00 00 00 02 00 00 00..... 你用fwrite写文件，写入了3个int，也就是写入12个字节。完成后你看txt文件大小是12字节。 fread读一个int，把06 00 00 00读了出来。 这个txt文件是二进制文件，你type test.txt看到的是乱码。  fprintf写文件的话是按ASCII字符写的，写入文件的实际内容是“612”字符串，这个test.txt文件是type看到的。scanf取int时，碰到第一个非数字字符结束，然后将字符串转换为int因此是612。 你把fprintf中的%d之间加个空格，就可以看到scanf读一个int，应该也读到6，而不是612。

user: user-3
content: 前者是整块内容读入 后者是格式化读入，一般处理文本
user-0 提问: posix多线程程序设计 第一个小程序

回复:
user: user-0
content: 谢谢！！！你们都完美解决了。。。

user: user-1
content: http://www.360doc.com/content/12/0807/17/8006573_228871199.shtml 仿照这个err_exit写，或者直接改一下名，err_exit改成err_abort

user: user-1
content: 引用 2 楼 cfjtaishan 的回复:该文件看看是否在书的最后面，看看书的目录？如果没有，建议从网上找一下。 最简单的方法就是自定义err_abort,然后把头文件errors.h引用去掉。 类似这样的： void err_abort(int status, const char *msg, ...) {   va_list ap;   va_start(ap, msg); #if HAVE_VSYSLOG   if(_syslog) {             vsyslog(LOG_ERR, msg, ap);     } else #endif           vprintf(msg, ap);   va_end(ap);   exit(1); } 缺点是我没有对status参数处理。 另外，记着加上头文件#include <stdarg.h>

user: user-1
content: 该文件看看是否在书的最后面，看看书的目录？如果没有，建议从网上找一下。 最简单的方法就是自定义err_abort,然后把头文件errors.h引用去掉。 类似这样的： void err_abort(int status, const char *msg, ...) {   va_list ap;   va_start(ap, msg); #if HAVE_VSYSLOG   if(_syslog) {             vsyslog(LOG_ERR, msg, ap);     } else #endif           vprintf(msg, ap);   va_end(ap);   exit(1); } 缺点是我没有对status参数处理。

user: user-2
content: 这个是书上自定义的头文件，你可能需要去下载
user-0 提问: c语言语法问题

回复:
user: user-1
content: http://blog.csdn.net/xyy410874116/article/details/6397549

user: user-2
content: 引用 2 楼 jianwen0529 的回复:警告而已 你这样子写 char p[] = "XXXXXXXXXXXXXXXXXXXX"; const *p = "XXXXXXXXXXXXXXXXXXX"; 是const char *p = "XXXXXXXXXXXXXXXXXXX";

user: user-2
content: 警告而已 你这样子写 char p[] = "XXXXXXXXXXXXXXXXXXXX"; const *p = "XXXXXXXXXXXXXXXXXXX";

user: user-3
content: 先把文件扩展名改成c再说。人家编译器是按c++处理的。
user-0 提问: 关于数组的问题，各位大神指点迷津

回复:
user: user-1
content: 在一楼的基础上进行的修改 #include<stdio.h> int main(void) { 	int ss[3]; 	int STR[9]; 	int i, count;  	for (i = 0, count = 0; i == count; i++)//判断用户输入的字符个数 	{ 		scanf_s("%d", &ss[i]); 		 		if (getchar() == ' ') 			count++;  	} 	count++;//count表示用户输入有几个数字 	 	for (i = 0; i < 3; i++)//由用户输入的值给STR赋值 	{ 		switch (ss[i]) 		{ 		case 1:   			STR[i * 3 ] = 'A'; 			STR[i * 3 + 1] = 'B'; 			STR[i * 3 + 2] = 'C'; 			break; 		case 2: 			STR[i * 3 ] = 'D'; 			STR[i * 3 + 1] = 'E'; 			STR[i * 3 + 2] = 'F'; 			break; 		case 3: 			STR[i * 3 ] = 'H'; 			STR[i * 3 + 1] = 'J'; 			STR[i * 3 + 2] = 'K'; 			break; 		default: 			break;  		} 		  	}  	for (i = 0; i < 3 * count; i++)//输出 		printf("%c ", STR[i]); 	 }

user: user-2
content: #include <stdio.h> #include <time.h> #include <stdlib.h>  #define ROW 3 #define COL 3   void init_str(char (*pstr)[COL], int row, int col); void show_str(char (*pstr)[COL], int row, int col);  int main(void) {     char str[ROW][COL];     int num[ROW], i, j;      init_str(str, ROW, COL);      srand(time(NULL));     for (i = 0; i < ROW; i++) {         num[i] = rand() % ROW;     }     for (i = 0; i < ROW; i++) {         if (num[i] <= 0)             continue;         printf("num = %d\t: ", num[i]);         for (j = 0; j < COL; j++)             printf("%c ", str[num[i]-1][j]);         putchar(10);     }      return 0; }  void init_str(char (*pstr)[COL], int row, int col) {     int i, j;     int ch = 'A';      for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             pstr[i][j] = ch++; }  void show_str(char (*pstr)[COL], int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         for (j = 0; j < col; j++)             printf("%c ", pstr[i][j]);         putchar(10);     }     putchar(10); }  作为一个参考吧

user: user-3
content: #include <stdio.h>  #define SIZE_ARRAY 9  int main()  {     int SS[] = { 2, 1, 3 };     int nSize = sizeof(SS) / sizeof(int);      int STR[SIZE_ARRAY] = { 0 };     for (int i = 0; i < nSize; i++)     {         switch (SS[i])         {         case 1:             STR[i * 3] = 'A';             STR[i * 3+1] = 'B';             STR[i * 3+2] = 'C';             break;         case 2:             STR[i * 3] = 'D';             STR[i * 3 + 1] = 'E';             STR[i * 3 + 2] = 'F';             break;         case 3:             STR[i * 3] = 'G';             STR[i * 3 + 1] = 'H';             STR[i * 3 + 2] = 'I';             break;         default:             break;         }     }      for (int i = 0; i < nSize ; i++)     {         printf("%c %c %c\n", STR[i * 3], STR[i * 3 + 1], STR[i * 3 + 2]);     }      return 0; }