Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 请教问什么b的值变为了50

回复:
user: user-1
content: a是b的引用，这两个变量就绑定在一起了，两个值同时改变~

user: user-2
content: a是b的引用，对a的改变就相当于对b的改变

user: user-3
content: 本质上来说，引用就是指针。 指针定义： int a = 123; int* p = &a; *p = 999 ---------------------- 引用类型 int a = 123; int& r = a; r = 999;  仔细一比较，不难发现，其实引用就是指针。

user: user-4
content: 指针即地址 引用即别名

user: user-5
content: 这是引用，不是指针取址

user: user-6
content: 这是C++相对C而言独有的引用功能，引用即类似C语言里的typedef

user: user-7
content: int &a = b; 这里a是b的引用  你可以理解成a只是b的一个别名，他们实际是同一个变量  所以修改a 实际就是修改b  具体内容楼主可搜索：引用

user: user-8
content: int &a = b;  a和b引用了同一块内存地址，修改a的值就等于修改了b的值  建议楼主去看一下C++里面的引用类型
user-0 提问: 字符串加密，数据结构

回复:
user: user-1
content: 建议使用malloc和realloc，realloc可用于内存空间增加和减少。不论是行不确定，还是列不确定，都可以用realloc增加行数和列数。并且是动态增加和减少。

user: user-2
content: 动态数组 malloc  或者弄个链表
user-0 提问: 字符串大小的问题

回复:
user: user-1
content: 拙作 http://blog.csdn.net/hou09tian/article/details/69841380，主要说的是strlen与sizeof处理字符数组与字符指针的事情 请多指教

user: user-2
content: 1是数组元素个数，2是char*占的字节数，既sizeof(char *)。sizeof()输出的是类型所占内存的大小。 如果要求字符串的长度，用strlen()，这样的话1和2的输出结果是一样的。

user: user-3
content: 很简单：数据类型不同。 s 是指针变量----char * Test (数组名)是常指针----const char *  常指针就是一个常数，实质就是一个无符号int整数。

user: user-4
content: 数组与指针是两种不同的类型  数组与指针的联系是数组名可以退化为指针  数组作为函数参数时会自动退化为指针  sizeof 指针 得到的是指针的大小（32位程序是4）  sizeof 数组 得到的是数组的大小   如果需要在函数中知道数组的大小，可再添加一个参数，将数组大小传入到函数

user: user-5
content: 第一个是数组，sizeof之后是数组的长度，即元素的个数； 第二个是指针，即形参是一个接收一个地址的指针，sizeof的值是4（32为系统下）。 理论上，数组名也是指针，可以理解成指针常量，因为数组名不能做左值，即不能在赋值号左边；它是指针但是还不能等同于普通指针变量。
user-0 提问: 关于GNU C语言中字符串大小的问题

回复:
user: user-1
content: 因为参数s是一个指针，虽然实参是数组，但是传递的值，即数组名是一个地址值，传递给形参s（指针）。sizeof一个指针，在32为系统里，所有指针的长度（sizeof)都是占4个字节
user-0 提问: 进行链表的合并，运行为啥会出错？

回复:
user: user-1
content: 创建链表的函数里，没有将申请的哨兵节点赋值给链表头。因为执行完创建链表后没有得到链表的头节点。建议如下修改： void CreateLinkList(LinkList *L, int n)//前插法创建单链表 {     //int a[6]={1,2,3,4,5};     int i;     LinkList s = NULL;     s = (LinkList)malloc(sizeof(LNode));     s->next = NULL;     *L = s;     for (i = n; i>0; --i)     {         LinkList p = (LinkList)malloc(sizeof(LNode));         //scanf("%d ",p->data);         p->data = i;         p->next = s->next;         s->next = p;     } }

user: user-1
content: void CreateLinkList(LinkList *L, int n)//前插法创建单链表 {     //int a[6]={1,2,3,4,5};     int i;     LinkList s = NULL;     s = (LinkList)malloc(sizeof(LNode));     s->next = NULL;     *L = s;    /*将哨兵节点赋值给头节点*/     for (i = n; i>0; --i)     {         LinkList p = (LinkList)malloc(sizeof(LNode));         //scanf("%d ",p->data);         p->data = i;         p->next = s->next;         s->next = p;     } }

user: user-2
content: void CreateLinkList(LinkList *L, int n) { LinkList s; ...... *L=s; }  这样应该可以，你自己调试下

user: user-2
content: CreateLinkList 有问题  LinkList s = *L; 后面s 又malloc过，已经不指向L了。  你单步调试下，执行完下面这两句la,lb还是野指针 CreateLinkList(&la, 4); CreateLinkList(&lb, 4);

user: user-3
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: 基于CentOS的SFTP代理程序，C语言编写，有哪位大神可以给个实例吗？

回复:
user: user-1

user: user-2
content: 寻找的时候，注意看代码的环境，一般Linux环境下使用的就可以

user: user-3
content: 百度搜相关关键字。
user-0 提问: 有没有能用于运动目标检测的AVI格式的视频啊，求大神

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:使用QQ影音自带的转换工具转换为不压缩的AVI。 不压缩的avi格式是哪种啊，为啥我这错误一直是无法找到解压装置解压视频流？谢谢那

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:使用QQ影音自带的转换工具转换为不压缩的AVI。 我试一下，谢谢！

user: user-1
content: 使用QQ影音自带的转换工具转换为不压缩的AVI。

user: user-1
content: 安装QQ影音后没准所需的视频解码器也随之安装了。
user-0 提问: 本人萌新求大佬解答下

回复:
user: user-0
content: 哪也不对啊如果覆盖掉了 呢么我第一次输入abcd 地二次输入abc那第二次也是abcd但是第二次等于abca。 第二次输入abc只覆盖掉第一次abc但是d没有覆盖掉啊

user: user-1
content: 为什么可以存放多个字符串，因为你每次输入的字符串都是放在了同一缓存里（数组a），即第二次的输入将第一次的输入覆盖了。其实，是一个缓存循环利用了。

user: user-0
content: 谢谢啦大佬哈

user: user-1
content: 引用 4 楼 androidioskl 的回复:哪也不对啊如果覆盖掉了 呢么我第一次输入abcd 地二次输入abc那第二次也是abcd但是第二次等于abca。 第二次输入abc只覆盖掉第一次abc但是d没有覆盖掉啊  上面的描述是你实际测试中得到的结果，还是你的想法。%s输入会自动加上'\0'，这个你是否考虑进去。 scanf，%s输入会将字符串结束标记'\0'加上。若是以%s输出，你是看不到上一次残留在缓存里的（数组a里）的数据的。除非，你一个个的输出，按照%c。 第一次输入abcd,第二次输入abc，那么，在第二次的abc后面会加上一个'\0'一样将第一次的'd'字符覆盖。当然，第一次输入的abcd后面也会加上一个'\0'

user: user-2
content: 百度搜索相关关键字，弄清楚scanf输入的机制。

user: user-3
content: 兄弟，数组名a是一个地址，你给printf的第二参数是一个地址。 你怎样操作相当于对数组a进行了9次写入（当然你实际上只写入了6次）。 scanf（）函数遇到空格，tab,回车就会停止读入。 所以第一次读入的是ghjgk， 并且打印了ghjgk 第二次读入的是gjhgj 并打印了gjhgj，由于没有换行符也没有空格，所以就直接在ghjgk后面打印 第三次读入的是gkgk 并在第二次打印的结果后面继续打印。 。。。 以此类推，最后所有的打印都写在一行上， 所以给了你以此读取所有的错觉。  我也是刚学，不知道对不对
user-0 提问: 帮忙看看，这段代码哪里错了

回复:
user: user-1
content: # include <stdio.h> # include <malloc.h> # include <stdlib.h> # include <time.h>  typedef struct Node {     int data;     struct Node * pNext; }NODE, *PNODE;  void createlist(PNODE *L, int n) {     PNODE p,r;     int i;      srand(time(0));     *L = (PNODE)malloc(sizeof(NODE));     r = *L;     r->pNext = NULL;     for(i=0; i<n; ++i)     {         p = (PNODE)malloc(sizeof(NODE));         p->data = rand()%100+1;         p->pNext = r->pNext;         r->pNext = p;      } }  void traversal_list(PNODE pHead) {     PNODE p = NULL;     p = pHead->pNext;     while (p) {         printf("%d ", p->data);         p = p->pNext;     }     printf("\n"); }   int main(void) {     PNODE pHead = NULL;     createlist(&pHead,5);     traversal_list(pHead);      return 0; }  这是一个带有岗哨的单链表，问题主要是出在头节点（岗哨节点）没有初始化pNext的值，即没有执行 r->pNext = NULL; //或者 (*L)->next = NULL; 详见上面的代码；如果没有这一步的初始化，那么输出的时候就不能判断结束即找不到NULL； 上面输出时，我去掉了NULL != p,改成while(p)因为p为NULL时，即为假。while 退出

user: user-0
content: 引用 1 楼 自信男孩的回复:# include <stdio.h> # include <malloc.h> # include <stdlib.h> # include <time.h>  typedef struct Node {     int data;     struct Node * pNext; }NODE, *PNODE;  void createlist(PNODE *L, int n) {     PNODE p,r;     int i;      srand(time(0));     *L = (PNODE)malloc(sizeof(NODE));     r = *L;     r->pNext = NULL;     for(i=0; i<n; ++i)     {         p = (PNODE)malloc(sizeof(NODE));         p->data = rand()%100+1;         p->pNext = r->pNext;         r->pNext = p;      } }  void traversal_list(PNODE pHead) {     PNODE p = NULL;     p = pHead->pNext;     while (p) {         printf("%d ", p->data);         p = p->pNext;     }     printf("\n"); }   int main(void) {     PNODE pHead = NULL;     createlist(&pHead,5);     traversal_list(pHead);      return 0; }  这是一个带有岗哨的单链表，问题主要是出在头节点（岗哨节点）没有初始化pNext的值，即没有执行 r->pNext = NULL; //或者 (*L)->next = NULL; 详见上面的代码；如果没有这一步的初始化，那么输出的时候就不能判断结束即找不到NULL； 上面输出时，我去掉了NULL != p,改成while(p)因为p为NULL时，即为假。while 退出 谢谢了
user-0 提问: devc++求解

回复:
user: user-1
content: 建议加上一些编译选项（比如一些比较严格的编译选项），看看是否有warning?，或者隐式声明之类的。

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

user: user-3
content: 我不信，编译器会自动给你做一些事情，但是不可能去掉所有的头文件都可以运行，这些头文件肯定满足一些特定的规律，比如在项目中、在根目录、在共享目录等等，但是你写一个头文件把它放到桌面上，他肯定不会自动引用
user-0 提问: 请教一下关于malloc和free的问题

回复:
user: user-1
content: 引用 3 楼 qq_34287840 的回复:[quote=引用 1 楼 shihengzhen101 的回复:] malloc和free应该是对应的，但是这个free可以放在程序的最后，如果你需要不断的malloc那么堆是会“满”，到时候会出现申请不到内存的情况，当然如果是程序的最后free不写也没什么问题，但写上时最规范的 我想问下如果满了的话 是会提示出现断点吗？[/quote] 不会出现断点，但是当你尝试向heap分配内存时，如果内存空间不够，你的指针将会是NULL，当你尝试通过该指针对内存空间进行读写时，就会报错，这是running error；所以，良好的编程习惯是，每次用malloc/new申请空间后，都要检测下指针是不是NULL，如果是直接LOG报错！别给自己留坑！

user: user-1
content: 按规则来说，每malloc一块memory空间，都需要用free去释放它，但是具体在哪里释放，什么时候释放是根据你的设计走的！你在addNode函数中malloc了一块空间，如果函数返回后这个空间不想用了（或者说addNode函数没有把该空间的指针传递出去），就一定要在addNode函数中free它，不然肯定内存泄漏！如果你在addNode外还想用到这个空间，那么addNode中肯定不能free该空间，等到你程序到了不再会使用到这块空间的时候再去free它；

user: user-2
content: 首先来看看malloc的声明，void *malloc(unsigned int num_bytes);参数是你从堆中申请内存的大小，你不断的增加节点的时候，堆内存是一直在增加的，如果溢出了，程序是直接奔溃的，不会给你任何提示。在专业的开发中有专门的工具来检测程序中是否有申请的内存没有释放的。这就是C语言的精髓所在，内存的管理在于程序员来控制。当然没个几年经验是hold不住的。

user: user-3
content: 你从村委会申请承包的地，不种了最好去注销了，以便让别人来种，而不是不吭声

user: user-4
content: 引用 3 楼 qq_34287840 的回复:[quote=引用 1 楼 shihengzhen101 的回复:] malloc和free应该是对应的，但是这个free可以放在程序的最后，如果你需要不断的malloc那么堆是会“满”，到时候会出现申请不到内存的情况，当然如果是程序的最后free不写也没什么问题，但写上时最规范的 我想问下如果满了的话 是会提示出现断点吗？[/quote] 不会，一个程序可用的内存是有限的，操作系统负责分配，成功分配到内存malloc会返回内存的指针，否则应该会返回NULL，所以对malloc的返回值做判断即可

user: user-5
content: 引用 3 楼 qq_34287840 的回复:[quote=引用 1 楼 shihengzhen101 的回复:] malloc和free应该是对应的，但是这个free可以放在程序的最后，如果你需要不断的malloc那么堆是会“满”，到时候会出现申请不到内存的情况，当然如果是程序的最后free不写也没什么问题，但写上时最规范的 我想问下如果满了的话 是会提示出现断点吗？[/quote] 首先malloc是在堆上申请的空间，堆上的空间相对是比较富裕的，比栈大的太多了。一般不会出现申请不到的情况，除非你一直不停的申请，并且中间也不释放，每次申请的也挺多。至于你将malloc申请之后的加入到链表这是正常的操作，只要你加入到链表的链表头能够找到，那么在程序的最后或者链表不需要的时候将其一起释放即可。 堆上的空间相对栈是宽裕的，如果申请多的内存空间，建议在堆上

user: user-0
content: 感谢大家的回复！感激不尽

user: user-0
content: 引用 1 楼 shihengzhen101 的回复:malloc和free应该是对应的，但是这个free可以放在程序的最后，如果你需要不断的malloc那么堆是会“满”，到时候会出现申请不到内存的情况，当然如果是程序的最后free不写也没什么问题，但写上时最规范的 我想问下如果满了的话 是会提示出现断点吗？

user: user-6
content: 这个问题就相当于一个故事有开头，你觉得要不要个结尾呢？

user: user-4
content: malloc和free应该是对应的，但是这个free可以放在程序的最后，如果你需要不断的malloc那么堆是会“满”，到时候会出现申请不到内存的情况，当然如果是程序的最后free不写也没什么问题，但写上时最规范的
user-0 提问: 求大神指导关于malloc函数的问题

回复:
user: user-1
content: 引用 1 楼 user-2 的回复:我严重怀疑是你的堆满了，内存泄露了。。。 没有很有力的证据证明是堆满，内存泄漏了，因为从程序里来看，结构体的大小一定大于4个字节，但是申请空间时，只申请4个字节，对结构体里的元素赋值时，自然是内存越界了，导致非法地址访问。

user: user-1
content: PThrTreeNode s = (PThrTreeNode)malloc(sizeof(PThrTreeNode)); 这句有问题，malloc的参数是申请的字节数，sizeof得到是4个字节吧（32位系统），因为sizeof是指针。实际上应该是结构体的大小，但是申请4个字节长度（指针长度）没有返回NULL，所以判断是否申请成功是不能检查出来的。

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:PThrTreeNode s = (PThrTreeNode)malloc(sizeof(PThrTreeNode)); 这句有问题，malloc的参数是申请的字节数，sizeof得到是4个字节吧（32位系统），因为sizeof是指针。实际上应该是结构体的大小，但是申请4个字节长度（指针长度）没有返回NULL，所以判断是否申请成功是不能检查出来的。 PThrTreeNode s = (PThrTreeNode)malloc(sizeof(ThrTree)); 是我大意了，我写成这样就不会越界了，感谢前辈！！！

user: user-0
content: 引用 4 楼 cfjtaishan 的回复:PThrTreeNode s = (PThrTreeNode)malloc(sizeof(PThrTreeNode)); 这句有问题，malloc的参数是申请的字节数，sizeof得到是4个字节吧（32位系统），因为sizeof是指针。实际上应该是结构体的大小，但是申请4个字节长度（指针长度）没有返回NULL，所以判断是否申请成功是不能检查出来的。 [img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/54.gif] [/img]那我想请问下我该如何申请呢？是直接申请结构体大小的空间吗？谢谢！

user: user-0
content: 我还发现只要用release模式不用debug。。。就没问题了。。有人能告诉我是为啥吗

user: user-0
content: 引用 1 楼 user-2 的回复:我严重怀疑是你的堆满了，内存泄露了。。。 怎样才能判断堆有没有满呢。。本人初学，请大神赐教

user: user-2
content: 我严重怀疑是你的堆满了，内存泄露了。。。
user-0 提问: 问题可能有些简单，但还是请各位大神抽空帮忙看一下/(ㄒoㄒ)/~~这个要怎么改

回复:
user: user-0
content: 引用 楼主 qq_38748751 的回复:C代码： #include<stdio.h> #include<string.h> #include<stdlib.h>  void main() { 	char* inputcode = ""; 	int judge; 	while(1) 	{ 		printf("请输入abc：\n"); 		scanf("%c",&inputcode);  		if(strcmp(inputcode,"abc")==0) 			judge=1; 		else 			judge=0;  		if(judge==1) 			break;  	} 	printf("login\n"); } 附图：  引用 楼主 qq_38748751 的回复:C代码： #include<stdio.h> #include<string.h> #include<stdlib.h>  void main() { 	char* inputcode = ""; 	int judge; 	while(1) 	{ 		printf("请输入abc：\n"); 		scanf("%c",&inputcode);  		if(strcmp(inputcode,"abc")==0) 			judge=1; 		else 			judge=0;  		if(judge==1) 			break;  	} 	printf("login\n"); } 附图： 谢谢

user: user-1
content: #include<stdio.h> #include<string.h> #include<stdlib.h>  int main() {     char inputcode[32] = "";     int judge;     while(1)     {         printf("请输入abc：\n");         scanf("%s", inputcode);          if(strcmp(inputcode,"abc")==0)             judge=1;         else             judge=0;          if(judge == 1)             break;      }     printf("login\n");      return 0; } inputcode要定义成字符数组（栈上申请空间）或通过malloc申请空间（堆上）； 对于字符串输入，要使用%s
user-0 提问: 帮忙解析代码

回复:
user: user-1
content: 楼主的问题，主要是设计到结构体的使用。建议，将结构体类型看成类似简单类型一样，但是注意下结构体对与成员的引用方式。

user: user-2
content: struct customer              { int num;        结构体变量     char name[10];   // 存放姓名数组     char sex[10];    //数组 double money;  //变量 char obj[10];   //数组 struct customer *next;  //结构体类型指针，可以指向下一个成员 };      struct customer *       creat_by_input();                        //返回值为struct customer * 的  类似于  int * struct customer *       get_last_customer(struct customer *head); struct customer *       Print_menu_main()

user: user-3
content: 就一个结构体和三个函数原型，没有什么可以解释的！ 如果这都不懂，那你应该回去看书而不是发帖
user-0 提问: 前辈们！请教（形参实参类型问题）

回复:
user: user-1
content: 问题的答案楼上已经指出来了，建议楼主可以扩展阅读以下，K&R第二版里的【 附录A.6 转换】，里面详细讲解了各种情形下发生的转换，包括整形提升和算术类型转换等等，当然也包括void*指针与其他类型指针之间的转换。

user: user-2
content: 隐式类型转换。 指针都是一个int数值，都是可以转换的。

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

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

user: user-4
content: 1楼正解  不过还有个更带劲的，boost::any

user: user-5
content: http://www.360doc.com/content/10/0814/19/2379862_46047109.shtml 这算是C语言的一种转换，但是这种转换可以不显示（隐式类型转换），除了void的隐式转换，还有比如  unsigned int a = 10;  char b = -10; if (a + b > 0)     printf("Hello"); else     printf("World");  这个程序就是存在一个隐式类型转换，但是和void不一样。它是b在计算a+b时，先将b类型隐式提升为unsigned int，所以b的值-10，就是会编程一个很大的值。所以会输出World

user: user-6
content: int* 可以 隐式转换为 void*  实际上，任意类型指针均可隐式转换为void*，但反之不成立
user-0 提问: 关于链队列出队的疑惑

回复:
user: user-1
content: 边界条件……

user: user-2
content: 出队列时需要先判断队列是否为空，因为队列为空，则不能再次出队列，否则会出现指针指向空，或者数据出错。

user: user-3
content: #define QueueSize 100  /*假定预分配的队列空间最多为100个元素*/     typedef char DataType ; /*假定队列元素的数据类型为字符*/         typedef struct node{       DataType data;       struct node *next;   }QueueNode;         typedef struct{       QueueNode *front;  /*头指针*/       QueueNode *rear;   }LinkQueue;         /* 置队列空*/   void Initial(LinkQueue *Q)       /*将顺序队列置空*/   {           Q->front=Q->rear=NULL;   }          /*判队列空*/   int IsEmpty(LinkQueue *Q)   {       return Q->front==NULL&&Q->rear==NULL;   }         /*进队列*/   void Push(LinkQueue *Q,DataType x)   {       /*将元素x插入链队列尾部*/       QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode));/*申请新结点*/       p->data=x;       p->next=NULL;       if(IsEmpty(Q))           Q->front=Q->rear=p;  /*将x插入空队列*/       else        { /*x插入非空队列的尾*/           Q->rear->next=p;     /*p链到原队尾结点后*/           Q->rear=p;           /*队尾指针指向新的尾*/       }   }         /*出队列*/   DataType Pop(LinkQueue *Q)   {       DataType x;       QueueNode *p;             if(IsEmpty(Q))       {           printf("队列为空");/*下溢*/           exit(1);       }             p=Q->front;                   /*指向对头结点*/       x=p->data;                    /*保存对头结点的数据*/       Q->front=p->next;             /*将对头结点从链上摘下*/       if(Q->rear==p)                /*原队中只有一个结点，删去后队列变空，此时队头指针已为空*/           Q->rear=NULL;             free(p);   /*释放被删队头结点*/       return x;  /*返回原队头数据*/   }         /* 取队列顶元素*/   DataType Front(LinkQueue *Q)   {       if(IsEmpty(Q))       {           printf("队列为空"); /*下溢,退出运行*/           exit(1);       }       printf("Q->front->data:%c \n",Q->front->data);//测试 若数据不为基本类型，则用其他方式显示       return Q->front->data;   }

user: user-0
content: 引用 1 楼 qq_36409192 的回复:DataType Pop(LinkQueue *Q)   {       DataType x;       QueueNode *p;             if(IsEmpty(Q))       {           printf("队列为空");/*下溢*/           exit(1);       }             p=Q->front;                   /*指向对头结点*/       x=p->data;                    /*保存对头结点的数据*/       Q->front=p->next;             /*将对头结点从链上摘下*/       if(Q->rear==p)                /*原队中只有一个结点，删去后队列变空，此时队头指针已为空*/           Q->rear=NULL;             free(p);   /*释放被删队头结点*/       return x;  /*返回原队头数据*/   }    恳请给出完整的程序 包括链队列的定义

user: user-3
content: DataType Pop(LinkQueue *Q)   {       DataType x;       QueueNode *p;             if(IsEmpty(Q))       {           printf("队列为空");/*下溢*/           exit(1);       }             p=Q->front;                   /*指向对头结点*/       x=p->data;                    /*保存对头结点的数据*/       Q->front=p->next;             /*将对头结点从链上摘下*/       if(Q->rear==p)                /*原队中只有一个结点，删去后队列变空，此时队头指针已为空*/           Q->rear=NULL;             free(p);   /*释放被删队头结点*/       return x;  /*返回原队头数据*/   }
user-0 提问: hdu1242 提问

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <conio.h> #include <graphics.h> int xs[10000]; int ys[10000]; int i=0,xx,yy; int fc,bc; void push(int x,int y) { 	xs[i]=x; 	ys[i]=y; 	if (i<10000-1) { 		i=i+1; 	} else { 		printf("stack overflow!\n"); 		exit(1); 	} } void pop(void) { 	i=i-1; 	xx=xs[i]; 	yy=ys[i]; } int check(int x,int y) { 	int	c;  	c=getpixel(x,y); /*	获取当前点的颜色 */ 	return ((c!=bc)&&(c!=fc));/* 如果颜色为边界色或填充色则不填充 */ } void seedfilling(int x,int y,int fill_color,int boundary_color) { 	fc=fill_color; 	bc=boundary_color; 	push(x,y); 	while (1) { 		if (i<=0) return; 		pop(); 		if (check(xx,yy)) { 			putpixel(xx, yy, 14);getch();  /* 加上这行显示当前填充状态 */  			putpixel(xx, yy, fill_color); /* 画点 */  			if (check(xx-1,yy  )) push(xx-1,yy	); 			if (check(xx  ,yy+1)) push(xx  ,yy+1); 			if (check(xx  ,yy-1)) push(xx  ,yy-1); 			if (check(xx+1,yy  )) push(xx+1,yy	); 			/* 去掉下面四句就是四连通 */ 			if (check(xx-1,yy-1)) push(xx-1,yy-1); 			if (check(xx-1,yy+1)) push(xx-1,yy+1); 			if (check(xx+1,yy-1)) push(xx+1,yy-1); 			if (check(xx+1,yy+1)) push(xx+1,yy+1);         }     } } void main() {     int a,b,color;     int gdriver = DETECT, gmode, errorcode;     int poly[10];  	initgraph(&gdriver,	&gmode,	"d:\\bc\\bgi");     a=150;     b=140;     color=4;     poly[0]=110;/* 第一个点的x坐标以及y坐标 */     poly[1]=110;     poly[2]=200;/* 第二点 */     poly[3]=105;     poly[4]=170;/* 第三点 */     poly[5]=120;     poly[6]=150;/* 第四点 */     poly[7]=170;     poly[8]=110;/* 多边形的起点与终点一样 */     poly[9]=110;     drawpoly(5,poly);/* 显示各点连接起来的多边形 */      /* 保证边界对八连通是封闭的 */     setviewport(0,1,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */     setviewport(1,0,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */     setviewport(1,1,600,300,0);     drawpoly(5,poly);/* 显示各点连接起来的多边形 */      /* 恢复默认viewport */     setviewport(0,0,600,300,0);      seedfilling(a,b,color,15);  /* 种子填充多边形 */      getch();     closegraph(); }

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

user: user-0
content: 但我还是不太懂我到底错哪了啊= =

user: user-0
content: 引用 6 楼 user-2 的回复:OJ对格式要求比较严格，最后两个printf 的换行符 不一定在最后一次输出时要求出现。 也就是赵4老师说的，IO格式问题 然而这不是问题所在啊= =AC代码和我的输出格式一样啊，还是应该是算法出了问题

user: user-1
content: 不想费劲，只瞎猜一下总可以吧。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:边界条件 输入输出格式 …… “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？恕小弟不才..什么意思，我的输入输出格式有问题吗= =才疏学浅，见谅，请说的详细一点

user: user-1
content: BTW：头像很养眼！

user: user-1
content: 边界条件 输入输出格式 …… “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-0
content: 做了几组测试用例，也都通过了，不知道为什么，有没有大佬啊= =

user: user-2
content: OJ对格式要求比较严格，最后两个printf 的换行符 不一定在最后一次输出时要求出现。 也就是赵4老师说的，IO格式问题
user-0 提问: 怎么修改啊

回复:
user: user-1
content: 两个错误： 1、main函数没有带类型,正确的写法 void main() { ... } 2、delay函数的参数定义错误，应该写出void delay(unsigned int i)

user: user-2
content: 引用 5 楼 qq_38773731 的回复:error C2447: missing function header (old-style formal list?)什么意思啊 你定以header函数了吗？该函数可能没有先声明

user: user-3
content: 此外，主函数中P1没有声明

user: user-3
content: 去掉这两句中的code：  unsigned char code F_Rotation[4]={0x03,0x05,0x0D,0x09};//正转表格  unsigned char code B_Rotation[4]={0x09,0x0D,0x05,0x03};//反转表格      void Delay(unsigned inti)  改成：  void Delay(unsigned int i)

user: user-0
content: error C2447: missing function header (old-style formal list?)什么意思啊

user: user-4
content: 另外，延时函数里面需要加一行代码，否则瞬间就结束了，起不到延时作用  void Delay(unsigned inti)  //延时  {          while(--i)        {             Sleep(1);        }  }

user: user-5
content: #include <config.h>里面的函数或者类声明等  少了 }  或者 ;（分号），检查一下
user-0 提问: 什么意思啊

回复:
user: user-0
content: 谢谢了   明白了

user: user-1
content: 类型没有定义，需要加上：  typedef unsigned int uint; typedef unsigned char uchar;  引用 楼主 qq_38773731 的回复:uint t=0; uchar t1=0; uchar k; error C2146: syntax error : missing ';' before identifier 't' error C2501: 'uint' : missing storage-class or type specifiers fatal error C1004: unexpected end of file found

user: user-2
content: 类型未定义，这是你自定义类型？
user-0 提问: 定义了外部变量，子函数的参数又定义一次，是不是重复了，有没有简洁的方式

回复:
user: user-0
content: 引用 1 楼 qq_35542689 的回复:怎么会是重复，在max函数里面定义的a,b变量的作用域只在max函数里面起作用，而定义在函数外边的变量是全局变量作用域在全局，并且你max()定义的是形参，你也可以定义为aa,bb 只要你传参进来了就行，其实并没有起到实质作用。而外部变量是确实存在的，是有值的  int max( int aa, int bb) c=max(a,b);  也就是说，子函数中可以定义为别的变量名，像这样int max( int aa, int bb)，在主函数中调用子函数时，为c=max(a,b);就建立了子函数形参和外部变量a b的联系，将a b引入了子函数的aa bb对吧

user: user-1
content: 怎么会是重复，在max函数里面定义的a,b变量的作用域只在max函数里面起作用，而定义在函数外边的变量是全局变量作用域在全局，并且你max()定义的是形参，你也可以定义为aa,bb 只要你传参进来了就行，其实并没有起到实质作用。而外部变量是确实存在的，是有值的

user: user-2
content: 首先max的a,b和上面的定义是不一样的。在max函数的a,b叫做形参，实在函数栈max申请的局部变量；上面定义的a，b是在数据段上申请的全局变量；是不一样的。  声明和定义的区别主要是是否在内存给其分配空间，若分配了则是定义，不论是显示赋值还是不赋值（是随机值）。
user-0 提问: 二维字符串数组 应用gets()函数错在哪

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

user: user-2
content: #include <stdio.h> #include <stdlib.h>  void rev_string(char s[][128],int n) {     int i,k;      for(i=0;i<n;i++) {         int j=0;         while(s[i][j])             j++;         for(k=0; k<j/2 ;k++){             int tmp=s[i][k];              s[i][k]=s[i][(j-1)-k];             s[i][(j-1)-k]=tmp;         }         printf("s[%d]=\"%s\"\n",i,s[i]);       }  }  int main() {     int i,n;     char carry[128][128];      printf("设定几维数组:");     scanf("%d",&n);     getchar();     for(i=0; i<n; i++){          gets(carry[i]);      }     rev_string(carry,n);      return 0; }  在scanf后面加一句getchar();即可 原因是gets是遇到回车结束输入，那么scanf输入后会输入回车，那么有一个回车符在输入缓存里，所以第一个gets读到了回车符直接返回了。所以是空串； 另外，建议使用fgets可以提高程序的安全性

user: user-0
content: 没人呢 ？？

user: user-2
content: 引用 4 楼 yaoqibbs 的回复:引用 1 楼 yaoqibbs 的回复:没人呢 ？？谢谢了 能否给举个简单的fgets（）函数的例子，我想在没学到指针。  char buf[32]; fgets(buf, 32, stdin); buf[strlen(buf)-1] = 0; /* 0 is equal to '\0'*/  stdin是标准输入（键盘）； fgets有一个问题，就是若输入的字符数少于第二个参数减1时，会将回车符加入到字符串中。所以，需要单独一步用于去掉回车符；

user: user-3
content: scanf 输入后缓冲区中还留下了换行符\n，会被之后的gets接收了，可以在scanf后加上getchar

user: user-0
content: 引用 1 楼 yaoqibbs 的回复:没人呢 ？？谢谢了 能否给举个简单的fgets（）函数的例子，我想在没学到指针。
user-0 提问: 一个二维数组两次输出结果不一样

回复:
user: user-0
content: 楼上是什么意思，能解释下吗

user: user-1
content: #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-0
content: 我按你说的检查了，但是zn[0][t]和num[t]在t=1,2,3的时候都是正确的，好崩溃

user: user-2
content: 我怀疑t = 0, t = 1时，num[t]的值为0

user: user-2
content: 建议查一下t = 0时，t = 1, t = 2时，zn[0][t]的值，有可能是t = 0, t = 1, t = 2时，num[t]的值是多少

user: user-0
content: #include<stdio.h>//定义输入／输出函数  #include<stdlib.h>//定义杂项函数及内存分配函数  #include<string.h>//字符串处理  #include<math.h>//定义数学函数   #define N 2   //2列 #define L 1000  //100行  const char file_name[50] = "data.txt";    int main(int argc, char *argv[]) {        int i,t,c,p,q; 	int zm[40][36];//初水位  	int zn[i][t];//末水位  	//int cq[p][c];//水位库容  	double E[i][t];//余留期效益值 	double n[i][t];//t-1到t阶段的最优出力期望 	   	      FILE *fp;     int data[N][L] = {0};   //二维数组     int index[N] = {0};   //二维数组列下标     double temp;       int v, u;     int count = 0;  //计数器，记录已读出的浮点数     if((fp=fopen(file_name, "rb")) == NULL) {         //printf("请确认文件(%s)是否存在!\n", file_name);         exit(1);     }     while(1==fscanf(fp, "%lf", &temp)) {         data[count%N][(index[count%N])++] = temp;         count++;     }     for(v = 0; v < N; v++) {                 for(u = 0; u < index[v]; u++) {            data[v][u];         }        // printf("\n");     }     fclose(fp);                         int a=0,num[36]={0};         for(u = 0; u < 36; u++) { 		   // printf("%d\t",data[0][u]);		     		    //printf("%d\t",data[1][u]); 			//printf("\n"); 		  num[a]=data[0][u]-data[1][u]; 		  a++; 		          }  // for(a= 0; a < 36; a++)    //printf("%d\n",num[a]);        for(t= 0; t < 36; t++){         for(i=0;i <=num[t] ;i++){   		zn[i][t] =data[0][t];   		data[0][t]--; 		printf("%d\t",zn[i][t]); 				 			//	printf("%d\t",data[0][t]);	 			//	printf("\n");   	      }      	// printf("\n");   }	      		for(t= 0; t < 36; t++){          for(i=0;i <=num[t] ;i++){      	  printf("%d\t",zn[i][t]); 		   } 		 printf("\n"); 	}      }

user: user-2
content: int zn[i][t]; 这人i, t都是随机值，会不会zn导致栈溢出；这个地方要改一下，设定一个确认值； 另外，改一下输出，看看两个输出是否一样： for(t = 0; t < 36; t++){         for(i=0; i <= num[t]; i++){             zn[i][t] = data[0][t];             data[0][t]--;             printf("zn[%d][%d] =%d\t", i, t, zn[i][t]);          }      }      for(t= 0; t < 36; t++){         for(i=0;i <= num[t]; i++){             printf("zn[%d][%d] =%d\t", i, t, zn[i][t]);         }         printf("\n");     }
user-0 提问: debug assertion failed

回复:
user: user-0
content: 引用 3 楼 user-2 的回复:还是贴下代码吧. 还有，malloc分配之后，都正确地释放了吗？都释放了。因为代码较长，局部变量结果都是正确的，找不到错误的块，所以没贴代码，非常抱歉啊。

user: user-1
content: 引用 4 楼 doubyZZ 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 建议贴出相关的代码～非常谢谢你，我可能找到了错误的地方。想请教一下你，我定义了一个int类型的数组，且用static修饰过了，然后用一个int 类型的指针指向它，请问会出问题吗？ 比如：static int a[20][30]={.......}; int *p=a[0];[/quote] 嗯，没问题。这个指针指向了a第一行的首地址。static只是说明a数组不是在栈上申请的（若a在函数里定义），而是在静态数据端申请的。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:建议贴出相关的代码～非常谢谢你，我可能找到了错误的地方。想请教一下你，我定义了一个int类型的数组，且用static修饰过了，然后用一个int 类型的指针指向它，请问会出问题吗？ 比如：static int a[20][30]={.......}; int *p=a[0];

user: user-2
content: 还是贴下代码吧. 还有，malloc分配之后，都正确地释放了吗？

user: user-1
content: 建议贴出相关的代码～

user: user-0
content: 不知道为啥上传不了图片
user-0 提问: 用递归实现n³

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

user: user-2
content: 递归相对于迭代而言，对于求n^3，迭代效率更高。

user: user-3
content: 求n的三次方没必要用递归，直接pow(n,3)就可以了。

user: user-4
content: 引用 3 楼 shihengzhen101 的回复: #include <stdio.h>   int mypow(int s, int n) {         return  (n-- > 0)  ?  (s * mypow(s, n) : 1; }   int main() {     printf("%d\n", mypow(2, 3));     return 0; }   改一下，少个括号   #include <stdio.h>   int mypow(int s, int n) {         return  (n-- > 0)  ?  (s * mypow(s, n)) : 1; }   int main() {     printf("%d\n", mypow(2, 3));     return 0; }

user: user-4
content: #include <stdio.h>   int mypow(int s, int n) {         return  (n-- > 0)  ?  (s * mypow(s, n) : 1; }   int main() {     printf("%d\n", mypow(2, 3));     return 0; }

user: user-5
content: 1楼很赞，我是小白，看了代码恍然大悟

user: user-6
content: #include <stdio.h>  int _pow(int s, int n) { 	if (n-- > 0) { 		return s * _pow(s, n); 	} else { 		return 1; 	} }  int main(int argc, char *argv[]) { 	printf("%d\n", _pow(2, 3)); 	return 0; }
user-0 提问: 关于C语言中简化函数定义的问题

回复:
user: user-0
content: 今天才看到这个贴几年了，都还没有结贴，居然都已经忘记了当时发帖的初衷了。不过复习了一遍，收到了各位大神的很大启发，受教了。 此贴正式结束。多谢大家。

user: user-1
content: 引用 10 楼 kingofghost 的回复:[quote=引用 8 楼 shihengzhen101 的回复:] 我没有搞懂，你为什要定义那么多一样的函数  简单讲，因为这些函数，是作为回调函数注册到下层的，而注册回调函数时，会判断此函数是否已经被注册，如果已经被注册，则不再注册。由于软件框架是使用的C/S模式，注册回调会在不同的client发起，所以会造成前一个client注册了回调，后一个client再注册，就会注册失败。[/quote]  那你就用宏定义呗，这样写起来还方便点，可能可读性会差点

user: user-2
content: #define 高招  但是弱弱的问一句，定义这么多一样的函数有必要吗。 函数名要有一定的意义，见名知意。 一个函数能实现，就在函数内部做分支呀。

user: user-0
content: 引用 8 楼 shihengzhen101 的回复:我没有搞懂，你为什要定义那么多一样的函数  简单讲，因为这些函数，是作为回调函数注册到下层的，而注册回调函数时，会判断此函数是否已经被注册，如果已经被注册，则不再注册。由于软件框架是使用的C/S模式，注册回调会在不同的client发起，所以会造成前一个client注册了回调，后一个client再注册，就会注册失败。

user: user-3
content: 仅供参考：#include <stdio.h> double A[300][100]; double valuex[300]; double valuey[300]; int i; double fun00(double x,double y) {return x  +   y  ;}; double fun01(double x,double y) {return x*x+ 3*y  ;}; double fun02(double x,double y) {return x  + 2*y*x;}; //...  fun03(double x,double y) {return ...+...   ;}; //... //...  fun98(double x,double y) {return ...+...   ;}; double fun99(double x,double y) {return x/2+20*y  ;}; double (*funNN[100])(double,double)={     fun00,     fun01,     fun02, //  fun03, //  ... //  fun98,     fun99, }; int main() {     double x,y;     int f,FN;      for (i=0;i<300;i++) {         valuex[i]=(double)i;         valuey[i]=(double)i;     }     FN=3;     for (i=0;i<300;i++) {          x=valuex[i];          y=valuey[i];          for (f=0;f<FN;f++) A[i][f]=funNN[f](x,y);     }     for (i=0;i<3;i++) {         for (f=0;f<FN;f++) printf("%lg ",A[i][f]);         printf("\n");     } 	return 0; } //0 0 0 //2 4 3 //4 10 10

user: user-3
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George  前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题；他觉得前同事们应该用这些问题来问自己；实际上不管在哪里工作的开发者们都应该经常问问自己这些问题： ◆“要保证这个问题不会再出现，我该怎么做？” ◆“要想少出些Bug，我该怎么做？” ◆“要保证Bug容易被修复，我该怎么做？” ◆“要保持对变化的快速响应，我该怎么做？” ◆“要保证我的软件的运行速度，我该怎么做？” 如果大多数团队都能不时问一下自己，必定会从中得益，因为这些都是真正强而有力的问题。

user: user-4
content: 多态------

user: user-1
content: 我没有搞懂，你为什要定义那么多一样的函数

user: user-5
content: 功能一样为啥要一系列函数不是一个函数？

user: user-6
content: #define正解

user: user-7
content: 其实就是函数指针数组，参考 http://blog.csdn.net/chenglibin1988/article/details/8916534  引用 楼主 kingofghost 的回复:比如，我要向定义一系列功能一样的函数： func1(x) func2(x) func3(x) func4(x) .....  这样写起来代码很难看，而且很多重复，如果要修改这些函数的实现，得每个函数都要修改，重复的工作也很多，并且容易有遗漏。 我想知道，有没有一个办法，可以用一个函数来代替所有这个函数的定义，并且在函数调用的时候，根据不同的情况调用不同的函数？  先谢谢各位大神！

user: user-8
content: lz可以搜下 “c语言 策略模式” 基本思想是用函数指针

user: user-9
content: 建议定义函数指针，将具有相同参数（类型，个数）和相同返回值的函数用一个函数指针。
user-0 提问: 请教为什么C语言中 char 数据类型所指定的字节大小没有起到作用？

回复:
user: user-1
content: 引用 2 楼 MHLAH 的回复:[quote=引用 1 楼 turingo 的回复:] 1、sizeof得到的是数组大小； 2、字符串长度应该用strlen函数。  嗯，在过程中计算了sizeof 数组的大小。 这里有一个问题。  char name[4];  char 指定 name字符串数组的大小为 4； 但是在为 name字符串数组赋值时，我输入了 LiSongMing 共计10个字节； 按理说，已经超出了，我对 name 数组所占用内存的大小； 可是却没有造成任何可见的影响。 [/quote] scanf输入并不会检查你的输入是否越界，这也是为什么会有scanf_s的存在。

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

user: user-0
content: 引用 3 楼 turingo 的回复:已经溢出了，没有影响是因为你的程序太小，后面的部分刚好没有被用到；没有影响不表示没有问题，只是运气好没有发作而已。  [quote=引用 2 楼 MHLAH 的回复:] [quote=引用 1 楼 turingo 的回复:] 1、sizeof得到的是数组大小； 2、字符串长度应该用strlen函数。  嗯，在过程中计算了sizeof 数组的大小。 这里有一个问题。  char name[4];  char 指定 name字符串数组的大小为 4； 但是在为 name字符串数组赋值时，我输入了 LiSongMing 共计10个字节； 按理说，已经超出了，我对 name 数组所占用内存的大小； 可是却没有造成任何可见的影响。 [/quote][/quote]  嗯，也就是说，这个越界操作，确实不被允许； 在指定数组的大小时，要尽量取大。 在运行时，sizeof 取得的name数组的大小值并没有因为其内字符多少的改变而改变。 使用strlen可以准确的捕捉到改变，sizeof则无法完成这一点。  谢谢了

user: user-3
content: 已经溢出了，没有影响是因为你的程序太小，后面的部分刚好没有被用到；没有影响不表示没有问题，只是运气好没有发作而已。  引用 2 楼 MHLAH 的回复:[quote=引用 1 楼 turingo 的回复:] 1、sizeof得到的是数组大小； 2、字符串长度应该用strlen函数。  嗯，在过程中计算了sizeof 数组的大小。 这里有一个问题。  char name[4];  char 指定 name字符串数组的大小为 4； 但是在为 name字符串数组赋值时，我输入了 LiSongMing 共计10个字节； 按理说，已经超出了，我对 name 数组所占用内存的大小； 可是却没有造成任何可见的影响。 [/quote]

user: user-0
content: 引用 1 楼 turingo 的回复:1、sizeof得到的是数组大小； 2、字符串长度应该用strlen函数。  嗯，在过程中计算了sizeof 数组的大小。 这里有一个问题。  char name[4];  char 指定 name字符串数组的大小为 4； 但是在为 name字符串数组赋值时，我输入了 LiSongMing 共计10个字节； 按理说，已经超出了，我对 name 数组所占用内存的大小； 可是却没有造成任何可见的影响。

user: user-3
content: 1、sizeof得到的是数组大小； 2、字符串长度应该用strlen函数。

user: user-4
content: 缓存溢出的数据是未定义的，即有可能会出问题的。为了保证程序的可靠性，还是杜绝导致溢出的操作
user-0 提问: 求修改C程序【数据挖掘之数据预处理】有人可以帮我改改吗？刚开始学不太懂

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

回复:
user: user-1
content: 随便写个文字游戏玩玩，边写边学习，会好玩很多。

user: user-2
content: [quote=引用 3 楼 huojiaxin 的回复:] 入门先不管这些概念性的东西，等你学完C跟C++后自然而然就理解面向过程跟面向对象的区别了。 学编程最需要的就是静心耐心，不要看了一本没看完又换一本，建议先看C primer plus，然后就是C和指针、C陷阱与缺陷、C专家编程这C语言三剑客了，静下心来看完，总会有收获的。

user: user-3
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-4
content: 我的建议是看出也要加上实践，从实践中你能学到很多书上没有的东西。

user: user-0
content: 本人有个问题希望大神解答。什么是面向对象什么是面向过程。这两个有什么区别？

user: user-5
content: 引用 3 楼 huojiaxin的回复:本人有个问题希望大神解答。什么是面向对象什么是面向过程。这两个有什么区别？ 面对过程很简单，就是C的编程，C不支持面对对象。面对对象是一种编程思想，不会也没关系，照样可以写代码。

user: user-6
content: 多看书多敲代码，不会的不理解的反复敲，直到懂为止

user: user-7
content: C语言视频没看过，书有不错的。
user-0 提问: 出现错误表达式必须是指向完整对象类型的指针

回复:
user: user-1
content: 错误原因很明显。struct room room[6]; 这个用法没错的，这个只在 room.c 里面有，room.h 和 in.h 中都没有。但是 room.h 中有一个 void room(); 而 in.c 既包含了 room.h 也包含了 in.h，对于 in.c 可见的非结构体名称的 room 就只有一个 void room(); 也就是个函数名，而你对一个函数名进行 &room[i] 这样的调用当然会报错。struct room room[6]; 对于 in.c 是不可见的。虽然说 struct room room[6]; 这个用法没错，但是尽量避免这样使用。况且在你的全部的四个文件中，有 struct room，有 room[6]，有 void room()。你三个不同意义的 room，这是在迷惑编译器吧？

user: user-2
content: 换个名字试试吧？结构体类型定义也用room，变量名也用room，感觉要出问题。

user: user-3
content: 在in.c中定义一个room变量 struct room room[6];

user: user-4
content: 这个错误明显是函数in()里room这个数组没定义啊

user: user-5
content: room有声明吗？？？
user-0 提问: 大哥来看了

回复:
user: user-1
content: 输出指针地址建议用 %p，  %d是按十进制方式输出

user: user-1
content: 此外  char h[2][5]={"gffdy","usfd"},(*y)[5],*j;  改成：  char h[2][6] = { "gffdy","usfd" }, (*y)[6], *j;  因为 "gffdy"是有6个元素

user: user-1
content: printf("%d\n", *（y + 1)); 这句你用的是中文的括号，要用英文的，改成：  printf("%d\n", *(y + 1));

user: user-2
content: #include<stdio.h> int main() {     char h[2][5] = {"gffdy","usfd"},(*y)[5],*j;     y=h;     printf("%p\n", y);     printf("%p\n",*(y+1)+1);     printf("%p\n",j);     j=*(y+1)+1;     printf("%p\n",j);     printf("%p\n",*(h+1)+1);     printf("%p\n",*(y+1));      return 0; } 输出地址要用%p或%P。

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

user: user-4
content: #include<stdio.h> int main() {     // 分配太小（5）不足以存储 下“dffdy”，字符串直接初始字符数组，会在最后增加一个 \0     char h[2][6] = { "gffdy", "usfd" }, (*y)[6], *j;     y = h;     printf("%d\n", y);     printf("%d\n", *(y + 1) + 1);     //printf("%d\n", j); //未初始化就使用     j = *(y + 1) + 1;     printf("%d\n", j);     printf("%d\n", *(h + 1) + 1);     printf("%d\n", *(y + 1));     return 0; }
user-0 提问: c primer plus 第六版中文电子书谁有

回复:
user: user-1
content: 引用 7 楼 hurryboylqs 的回复:[quote=引用 6 楼 qq_36409192 的回复:] 想好好学，个人建议你还是去买一本实体书，没必要省那几十块钱，电子书看的很伤眼睛，而且还不能简单的勾画，学起来效果比较差。  我是教，不是学，呵呵，我想看下里面的内容[/quote] 哦，你试试这个 https://pan.baidu.com/share/link?shareid=1931156646&uk=3308986765

user: user-0
content: 引用 8 楼 qq_36409192 的回复:[quote=引用 7 楼 hurryboylqs 的回复:] [quote=引用 6 楼 qq_36409192 的回复:] 想好好学，个人建议你还是去买一本实体书，没必要省那几十块钱，电子书看的很伤眼睛，而且还不能简单的勾画，学起来效果比较差。  我是教，不是学，呵呵，我想看下里面的内容[/quote] 哦，你试试这个 https://pan.baidu.com/share/link?shareid=1931156646&uk=3308986765[/quote]  还是一样，C++的，不找了

user: user-0
content: 引用 6 楼 qq_36409192 的回复:想好好学，个人建议你还是去买一本实体书，没必要省那几十块钱，电子书看的很伤眼睛，而且还不能简单的勾画，学起来效果比较差。  我是教，不是学，呵呵，我想看下里面的内容

user: user-1
content: 想好好学，个人建议你还是去买一本实体书，没必要省那几十块钱，电子书看的很伤眼睛，而且还不能简单的勾画，学起来效果比较差。

user: user-2
content: 引用 4 楼 hurryboylqs 的回复:出了，书店有卖 买一本。

user: user-0
content: 出了，书店有卖

user: user-3
content: C Primer Plus 第六版还没出来吧？  引用 2 楼 hurryboylqs 的回复:[quote=引用 1 楼 turingo 的回复:] 参考http://down.51cto.com/data/823025 这是C++ primer plus 不是c primer plus 又被骗了一次[/quote]

user: user-0
content: 引用 1 楼 turingo 的回复:参考http://down.51cto.com/data/823025 这是C++ primer plus 不是c primer plus 又被骗了一次

user: user-3
content: 参考http://down.51cto.com/data/823025
user-0 提问: 安装nemesis问题

回复:
user: user-1
content: 错误信息提示你，去那个网站下载libnet头文件。

user: user-0
content: 引用 3 楼 u010165006 的回复:看最后的Error提示信息最后错误信息我都查了百度1天多 我也很绝望 安装不上

user: user-0
content: 最后错误信息我都查了百度1天多 我也很绝望 安装不上

user: user-0
content: 你当我是什么?这么简单的复制去百度搜索还要教 水的可以  赵老师 这个逼装的66

user: user-2
content: 必应、谷歌、……

user: user-2
content: 将错误提示信息放在百度搜索框里面搜一下。

user: user-1
content: 看最后的Error提示信息

user: user-0
content: 求大神指导 感激不尽

user: user-0
user-0 提问: 如何将十进制数转换为十六进制并转换为ascii码

回复:
user: user-1
content: 参考一下这个博文，最后的转换说明符 http://blog.csdn.net/libing403/article/details/72934198

user: user-2
content: 你给点击发送0x64和100都是一样的，电机应该都认为是同样的结果！

user: user-3
content: char 类型不就是整数么。 还转换什么？

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

user: user-1
content: 如果是数字 100，如楼上所说直接赋值。如果是字符串，转换一下即可： buff[5] = atoi(s);

user: user-4
content: buff[5]=100;

user: user-5
content: 16进制或10进制输出，是我们要求以什么形式输出的。但在内存里，10进制的100和16进制的100都是二进制形式存放的。所以，如果将100存放在到buff，直接赋值100即可。除非你的通信另一方不能识别十进制数。 当然用snprintf或sprintf可以实现你要求的。或者用下面的dec_to_hex转换 #include <stdio.h>  int dec_to_hex(char *buf, int len, int num); int main(void) {     int size, i;     char buf[12];      size = dec_to_hex(buf, 12, 100);      for (i = 0; i < size; i++)         putchar(buf[i]);      putchar(10);     return 0; }  int dec_to_hex(char *buf, int len, int num) {     int cnt = 2, i;     int tmp;      buf[0] = '0';     buf[1] = 'x';     while (num) {         if (num % 16 >= 10)             buf[cnt] = num % 16 - 10 + 'A';         else             buf[cnt] = num % 16 + '0';         num = num / 16;         cnt++;         if (cnt >= len)             break;     }     for (i = 0; i < (cnt - 2) / 2; i++) {         tmp = buf[i+2];         buf[i+2] = buf[cnt-1-i];         buf[cnt - 1 - i] = tmp;     }      return cnt; }

user: user-6
content: 所谓八进制十进制十六进制都是表现形式，所有的数据都是二进制表示  所以你buff[5] 是一个字符，十进制整形解析表示为100，十六进制整形解析表示为64 所有的一切都是都是表现，显示出来都是字符图形。你需要的话可以变成任何进制  所以你需要让buff[5]在界面显示为十六进制，那么： sprintf(buff, "%#x", buff[5]);

user: user-6
content: sprintf(buff, "%#x", 100);
user-0 提问: c语言里面的高位值-0x30是什么意思啊

回复:
user: user-1
content: 请查看有关2进制10进制16进制问题 http://blog.csdn.net/zhangyandong16/article/details/20203227

user: user-2
content: 0x表示16进制数，0x30表示16进制的30，16进制的30转化成10进制就是48

user: user-3
content: 0x30等于十进制的48，48也是0的ASCII值，，1-9的ASCII值是49-57，，所以某一个值－0x30，，就是将字符0-9转换为0-9

user: user-4
content: ‘0'～'9' -0x30 变成 0～9

user: user-5
content: 要看楼主这个0x30是那个地方用的？
user-0 提问: vs2015中文件流怎么读入String类变量

回复:
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-2
content: std::string

user: user-0
content: 改好了，谢谢~

user: user-3
content: String 是小写
user-0 提问: 大哥帮改一下错

回复:
user: user-1
content: #include<stdio.h>  char count(char *str) {     int i = 0,j = 0, k, num;     char (*p)[10],r[10][10];      p = r;     for(k = 0;*(str + k)!='\0'; k++)     {         if(*(str + k)>='0'&&*(str+k)<='9')         {             *(*(p + i) + j) = *(str + k);             j++;         }         if(!(*(str+k)>='0'&&*(str+k)<='9'))         {             if(j >= 1)             {                 *(*(p + i) + j) = 0;                 i++;                 j = 0;             }         }     }     num = i;     for(i = 0; i < num;i++)     {         for(j=0;j < 10 && p[i][j];j++)         {             printf("%c",*(*(p+i)+j));         }         printf("\n");     }     return 0; } int main() {     char a[100]={"sjd2342hg4346.hg54353hj35?et47865fd4fdg54675f64dg:566,yt678"};     count(a);     return 0; } 对比一下，有些地方是需要改一下的

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

user: user-3
content: j == 0;  改成：  j = 0;
user-0 提问: 一个简单的表格问题，虚心请教各位

回复:
user: user-1
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: user-0
content: 引用 1楼user-2 的回复:

user: user-2
user-0 提问: 格式化输出的问题

回复:
user: user-1
content: 有区别，9是整数，9.0是浮点数，具体可以参考一下这篇博文 http://blog.csdn.net/libing403/article/details/72934198

user: user-2
content: 为什么不参考printf的源代码比如 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c 呢？   printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  printf("%鱼类",CSDN的qq_37824129);//你希望输出啥呢？

user: user-0
content: 两种编译器，产生了不同的结果。额，这个有什么解释么。

user: user-2
content: 为什么不参考printf的源代码 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c 呢？

user: user-0
content: 引用 5 楼 wanggui2015 的回复:楼上说的float格式的问题，楼主应该是懂的额，其实楼主应该想问的是这两种输出方式为什么得到不一样的结果吧？？  我在我的编译器上试了，结果都是0额，不晓得什么情况，网上找了篇资料，也许能帮到你。  http://blog.csdn.net/solomon1558/article/details/40798901 嗯嗯，关于浮点数的二进制表示，我查过资料，了解了一些。 但是同样是  将浮点数以%d输出，或者  将整数以%f输出，但是得到的结果确不相同的。 不明白。所以，前来请教。 我是0基础学习，没有学过什么计算机基础知识，更不知道什么叫做编译原理。这是我在看C Primer Plus时候，在书上看到的一句话想到的问题。so，还请详细解答下。

user: user-3
content: 楼上说的float格式的问题，楼主应该是懂的额，其实楼主应该想问的是这两种输出方式为什么得到不一样的结果吧？？  我在我的编译器上试了，结果都是0额，不晓得什么情况，网上找了篇资料，也许能帮到你。  http://blog.csdn.net/solomon1558/article/details/40798901

user: user-4
content: 建议了解一下float类型在内存中的存储方式。int类型的存储相对比较简单，float就不一样了，建议了解一下就能回答你这些问题了。 http://blog.csdn.net/xieyihua1994/article/details/51659379 还有  http://www.cnblogs.com/little-white/archive/2013/08/04/3236493.html

user: user-5
content: 看一下ieee754里的floa格式你就明白了。

user: user-6
content: int类型和float类型的存储格式完全是不相通的，直接取地址这样的做法是错误的。

user: user-7
content: 你这是在玩编译器啊，使用正确的格式化符号才能正确的输出对应的值

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

user: user-0
content: 引用 9 楼 qq_36409192 的回复:请参考：http://blog.csdn.net/solomon1558/article/details/40798901 谢谢你。

user: user-8
content: 请参考：http://blog.csdn.net/solomon1558/article/details/40798901

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:为什么不参考printf的源代码 C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c 呢？  谢谢赵老师的回复。
user-0 提问: 求助！光电计数在8*8点阵LED显示0—99,下面程序哪里出错了

回复:
user: user-1

user: user-2
content: 1、延迟有问题的话，最后用示波器实际测量一下； 2、软件的角度看看延迟程序是否被优化掉了，尝试加volatile修饰符，例如volatile uint x,y;   引用 楼主 qy06007aili 的回复:#include<reg51.h>  #define uchar unsigned char  #define uint unsigned int  uchar code tab[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; uchar code number_l[][4]={ {0xff,0xc1,0xdd,0xc1}, //0 {0xff,0xff,0xff,0xc1}, //1 {0xff,0xc5,0xd5,0xd1}, //2 {0xff,0xd5,0xd5,0xc1},//3 {0xff,0xf1,0xc1,0xf7},//4  {0xff,0xd1,0xd5,0xc5}, //5 {0xff,oxc1,0xd5,0xd5},//6 {0xff,0xfd,0xfd,0xc1}, //7 {0xff,0xc1,0xd5,0xc1},//8 {0xff,0xd1,0xd5,0xc1}//9  }   void delay(uint z){    uint x,y;    for(x=z;x>0;x--)     for(y=110;y>0;y--);  }    void display(uchar num){  uchar decade,unit,a,b;   decade=num/10;   unit=num%10;   b=0;  for(a=0;a<8;a++){   P2=tab[b];   if(a<4){        P0=~number_l[decade][a];        delay(1);    }    else{        P0=~number_l[unit][a-4];        delay(1);        }     b++;    }  }  void main() {    EA=1;     EX0=1;    IT0=1;    num=0;    P0=0xff;     P2=0x00; 	delay(1000);  	P0=0x00;  	delay(1000);   	P0=0xff; 	delay(1000); 	while(1){ 	 display(num);  	} 	  }   void exter0() interrupt 0 { 	  num++; 	  if(num==100) { 	  num=0; 	  }  }   用keil编程的时候显示延迟程序有错误，求大神帮忙，看一下整体程序有什么错误嘛？

user: user-1
user-0 提问: 大哥帮忙看看

回复:
user: user-1
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价  理解和讨论之前请先学会如何观察！ 仅供参考：//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: y是指向 char[5]类型的指针，指向的是char数组  而j是一个char*类型的指针  它们是两种完全不同类型的指针，不能进行隐式转换

user: user-0
content: 我只想输出一个字母。

user: user-3
content: #include<stdio.h> int main() {     char h[2][6] = {"gffdy","usfd"}, (*y)[6], *j;     y = h;     j = y[1];     printf("%c\n",*j);     return 0; } 注意字符串"gffdy"，若用%s输出就已经越界了。 j = y[1] 表示第二行（从0开始）的首地址。也可以写成： j = *(y+1) y表示的是长度为6的指针。y是数组指针，和j的类型是有区别的。
user-0 提问: C语言文件的读取和写入不成功是什么原因啊。

回复:
user: user-1
content: 如果要读的文件以"w"打开，那么文件就会被截断，即源文件的内容就为空。即无法从源文件里读到数据。while循环就不会执行。 要写的文件以”r"形式打开，那么它是没有写权限的。

user: user-1
content: 引用 1 楼 zhao4zhong1 的回复:to = fopen("1.txt", "w"); from = fopen("2.txt", "r"); 一语中第，要写的文件的以读的形式打开，会有问题，要读的以写的形式打开没问题

user: user-2
content: 吃饭用碗，拉屎用马桶。

user: user-2
content: to = fopen("1.txt", "w"); from = fopen("2.txt", "r");
user-0 提问: 关于进制转换的问题

回复:
user: user-1
content: 这个资料可能对你有用---转换说明符 http://blog.csdn.net/libing403/article/details/72934198

user: user-2
content: 引用 1 楼 cfjtaishan 的回复:十进制转十六进制，在循环取余时，注意看余数是否大于等于10，若大于等于10，则加‘A’，若小于10，则加'0'，比如  if (num % 16 >= 10) hex[i] = num % 16 + 'A'; else hex[i] = num % 16 + '0';  if (num % 16 >= 10)     hex[i] = num % 16 + 'A' - 10; else     hex[i] = num % 16 + '0'; 更改一下

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

user: user-0
content: 引用 3楼实娃星哥 的回复:更正一下 // 10进制转化为16进制字符串 std::string t10216(int x) { 	static std::string str; 	int m = x / 16; 	int n = x % 16; 	char c[2] = { 0 }; 	if (n < 10) 	{ 		sprintf_s(c ,"%d",n); 	} 	else 	{ 		sprintf_s(c,"%c" ,'A'+n-10); 	} 	str = c + str; 	if (m > 0) 	{ 		return t10216(m); 	} 	std::string strResult = str; 	str.clear(); 	return strResult; }谢谢，放学后试一下

user: user-4
content: 更正一下 // 10进制转化为16进制字符串 std::string t10216(int x) { 	static std::string str; 	int m = x / 16; 	int n = x % 16; 	char c[2] = { 0 }; 	if (n < 10) 	{ 		sprintf_s(c ,"%d",n); 	} 	else 	{ 		sprintf_s(c,"%c" ,'A'+n-10); 	} 	str = c + str; 	if (m > 0) 	{ 		return t10216(m); 	} 	std::string strResult = str; 	str.clear(); 	return strResult; }

user: user-4
content: 仅供参考 // 10进制转化为16进制字符串 std::string t10216(int x) { 	static std::string str; 	int m = x / 16; 	int n = x % 16; 	char c[2] = { 0 }; 	if (n < 10) 	{ 		sprintf_s(c ,"%d",n); 	} 	else 	{ 		sprintf_s(c,"%c" ,'A'+n-10); 	} 	str = c + str; 	if (m > 0) 	{ 		t10216(m); 	} 	 	return str; }  // 16进制字符串(不带前缀0X,字母都是大写)转化为10进制整型 int t16210(LPCSTR str16) { 	int nResult = 0; 	const char *p = str16+strlen(str16)-1; 	int iStep = 0; 	while (p >= str16) 	{ 		int nTemp = 0; 		if (*p > 64) 		{ 			nTemp = 10 + *p - 'A'; 		} 		else 			nTemp = *p - '0'; 		for (int i = 0; i != iStep;++i) 		{ 			nTemp *= 16; 		}  		nResult += nTemp ; 		iStep++; 		p--; 	} 	return nResult; }

user: user-2
content: 十进制转十六进制，在循环取余时，注意看余数是否大于等于10，若大于等于10，则加‘A’，若小于10，则加'0'，比如  if (num % 16 >= 10) hex[i] = num % 16 + 'A'; else hex[i] = num % 16 + '0';
user-0 提问: 求教如何通过算法对数列走势做筛选

回复:
user: user-1

user: user-1

user: user-2
content: 简单判断：用第二个数减去第一个数得到一个差值...第N个数减去第N-1个数得到一个差值，总共得到N-1个差值，分析这个差值序列就可以判断，比如其中至少有2/3是负值并且至少有连续若干个小于0的数就可以断定为大致降序，标准可以自己设定。

user: user-0
content: 你确定用信号系统的相关知识处理这个问题是最简便的方法么？大学学过，不过忘得差不多了。有没有更简便的算法？

user: user-3
content: 搜“低通滤波”

user: user-4
content: 引用 3 楼 DelphiGuy 的回复:简单判断：用第二个数减去第一个数得到一个差值...第N个数减去第N-1个数得到一个差值，总共得到N-1个差值，分析这个差值序列就可以判断，比如其中至少有2/3是负值并且至少有连续若干个小于0的数就可以断定为大致降序，标准可以自己设定。