Question: 请问C语言能否将一个字符串储存在char*指针里，并指定字符串为UTF8编码方式储存呢？

引用 15 楼 yyxgs 的回复:[quote=引用 14 楼 zhao4zhong1 的回复:] 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  我迷信赵老师的回帖。[/quote] 人不能没有信仰！码农是人。

引用 12 楼 zhao4zhong1 的回复:In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:  fopen("newfile.txt", "rw, ccs=<encoding>");  Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.  Encodings Used Based on Flag and BOM Flag  No BOM (or new file)  BOM: UTF-8  BOM: UTF-16   UNICODE  ANSI  UTF-8  UTF-16LE   UTF-8  UTF-8  UTF-8  UTF-16LE   UTF-16LE  UTF-16LE  UTF-8  UTF-16LE  原来如此，也就是说这种方法来确定文件的编码仅限于新创建的文件。

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

引用 8 楼 zhao4zhong1 的回复:// UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89   赵老师，我明白了。 我将字符串的ANSI编码打印出来:   然后将这个字符串的UTF8编码打印出来:   int main(int argc, char* argv[])  { 	char* path = "c:/下载/2.txt"; 	int* data = doi(21);  	*(data + 0) = 20; // 有20个数据  	*(data + 1) = 239; 	*(data + 2) = 187; 	*(data + 3) = 191; 	*(data + 4) = 230; 	*(data + 5) = 136; 	*(data + 6) = 145; 	*(data + 7) = 229; 	*(data + 8) = 150; 	*(data + 9) = 156; 	*(data + 10) = 230; 	*(data + 11) = 172; 	*(data + 12) = 162; 	*(data + 13) = 67; 	*(data + 14) = 232; 	*(data + 15) = 175; 	*(data + 16) = 173; 	*(data + 17) = 232; 	*(data + 18) = 168; 	*(data + 19) = 128; 	*(data + 20) = 33;  	writeByte(path, data);  	if (data != NULL) { 		free(data); 		data = NULL; 	}  	getchar(); 	return 0; }   然后我直接将后者的编码字节写入文件，文件的编码就是UTF8。

引用 9 楼 yyxgs 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] // UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89   既详细又易懂，赵老师辛苦了，感谢！[/quote]  赵老师，我还请教一个问题，那我能不能定义一个结构体 struct UTF8 { 	char* byteStr; // 给byteStr分配适合的长度来储存每个字符 }; 然后按UTF8的方式将字符储存在每个UTF8变量里，这样将每个UTF8变量写入文件的时候，文件会是UTF8编码吗？

引用 2 楼 user-5 的回复:char *p,a='5'; p=&a;  p="abcd";    这样写是完全没有问题，不知道你是不是这个意思。  我说的是按UTF8编码方式储存

不能指定放在char指针里的编码格式。因为在内存里不认识什么ascii还是utf-8，它只认识010101这样的二进制。 如果保存到文件中，想要UTF-8编码的文件内容，可以通过其他工具转换。

好久没登陆了。好不容易找回来密码。。

由于 Windows 上原生不支持 UTF-8，Windows 上的 C 编译器都没有办法直接办到。 如果是 C++ 的话，使用支持 C++11 标准的编译器开启 C++11 特性是可以的： char u8s[] = u8"世界你好";

引用 8 楼 zhao4zhong1 的回复:// UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89   既详细又易懂，赵老师辛苦了，感谢！

还是说char*指针里保存的字符串都是以Ascll码方式储存的呢？ 那么，能不能定义一个结构体来储存UTF8编码呢？


Question: 谁帮我解释下题干中的这些概念

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

阅读下列说明和C代码，回答问题1至问题3，将解答写在答题纸的对应栏内。 【说明】 用两台处理机A和B处理n个作业。设A和B处理第i个作业的时间分别为ai和bi。由于各个作业的特点和机器性能的关系，对某些作业，在A上处理时间长，而对某些作业在B上处理时间长。一台处理机在某个时刻只能处理一个作业，而且作业处理是不可中断的，每个作业只能被处理一次。现要找出一个最优调度方案，使得n个作业被这两台处理机处理完毕的时间（所有作业被处理的时间之和）最少。 算法步骤： （1）确定候选解上界为R短的单台处理机处理所有作业的完成时间m， 点击查看大图 （2）用p（x,y,k）=1表示前k个作业可以在A用时不超过x且在B用时不超过y时间 内处理完成，则p（x,y,k）=p（x-ak,y,k-1）||p（x,y-bk,k-1）（表示逻辑或操作）。 （3）得到最短处理时问为min（max（x，y））。 【C代码】 下面是该算法的C语言实现。 （1）常量和变量说明 n: 作业数 m: 候选解上界 a: 数组，长度为n，记录n个作业在A上的处理时间，下标从0开始 b: 数组，长度为n，记录n个作业在B上的处理时间，下标从0开始 k: 循环变量 p: 三维数组，长度为（m+1）*（m+1）*（n+1） temp: 临时变量 max: 最短处理时间 （2）C代码 include<stdio.h> int n, m; int a[60], b[60], p[100][100][60]; void read(){ /*输入n、a、b，求出m，代码略*/} void schedule(){ /*求解过程*/ int x,y,k; for（x=0；x<=m；x++）{ for(y=0；y<m；y++）{ （1） for（k=1；k<n；k++） p[x][y][k]=0； } } for（k=1；k<n；k++）{ for（x=0；x<=m；x++）{ for（y=0；y<=m；y++）{ if（x - a[k-1]>=0） （2） ； if（（3） ）p[x][y][k]=(p[x][y][k] ||p[x][y-b[k-1]][k-1]); } } } } void write(){ /*确定最优解并输出*/ int x，y，temp，max=m; for（x=0；x<=m；x++）{ for（y=0;y<=m;y++）{ if(（4） ）{ temp=（5） ； if（temp< max）max = temp; } } } printf("\n%d\n"，max）, } void main(){read();schedule();write();} 【问题1】 （9分） 根据以上说明和C代码，填充C代码中的空（1）～（5）。 【问题2】（2分） 根据以上C代码，算法的时间复杂度为（6）（用O符号表示）。 【问题3】（4分） 考虑6个作业的实例，各个作业在两台处理机上的处理时间如表4-1所示。该实例的最优解为（7），最优解的值（即最短处理时间）为（8）。最优解用（x1,x2,x3,x4,x5,x6）表示，其中若第i个作业在A上赴理，则xi=l，否则xi=2。如（1，1，1，1，2，2）表示作业1，2，3和4在A上处理，作业5和6在B上处理。 点击查看大图 请帮忙给出正确答案和分析，谢谢！


Question: 归并排序在两万数据量时机子崩溃

引用 2 楼 cfjtaishan 的回复:建议贴出你的归并排序逻辑 你用捅排试试

建议贴出你的归并排序逻辑

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

应该不是内存问题


Question: 请问C语言写的类，除了在参数中传入对象指针，还有别的办法能又能和方法挂钩，又省去这么写的做法吗？

引用 11 楼 zhao4zhong1 的回复:https://bbs.csdn.net/topics/390467268  厉害，长见识了。

引用 5 楼 u010165006 的回复:楼主研究这个亚，个人觉得买本100多页的C++书，就可以代替楼主的需求了，C++可以当做C用的，还可以用类。  嗯嗯，果然还是直接学C++才是正道。

引用 4 楼 hdt 的回复:你可以加一个this指针指向他自己 引用 4 楼 hdt 的回复:你可以加一个this指针指向他自己   可以指针还是要和对象关联，还是没有办法省掉object指针

百度搜“Windows下的grep、sed、awk”

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

看错题目了，以上回答请忽视

你可以加一个this指针指向他自己

可以呀，代码太长没看 你的lengh函数可以 size_t string::length()const{   return this->length; }

我觉得这样写很麻烦: printf("字符串长度: %d\n", str->length(str)); 能不能直接这样: printf("字符串长度: %d\n", str->length());


Question: 写了一个简单的链表函数，但是没输出，改了一下红色的i的类型为int就有输出了，一直搞不明白怎么回事

#include<stdio.h> #include<stdlib.h>  struct link {     char name[20];     int num;     struct link *next; };  struct link* creatLink() {     struct link*p;     struct link*q;     struct link*head;     int i;     p = (struct link*)malloc(sizeof(struct link));     printf("please enter the name and number\n");     scanf("%s %d",p->name,&(p->num));      head = p;     q = head;     p->next = NULL;     printf("if you want to end up entering data,please enter 1,else enter 2\n");     scanf("%d",&i);     while(i==1)     {         p = (struct link*)malloc(sizeof(struct link));         printf("please enter the name and number\n");         scanf("%s %d",p->name,&(p->num));          q->next = p;         q = p;         printf("if you want to continue enter data,please enter 1,else enter 2\n");         scanf("%d",&i);      }     p->next = NULL;     return head;  }  void printLink(struct link* head) {     struct link* p;     p = head;     while(p)     {         printf("%s\t",p->name);         printf("%d\n",p->num);         p= p->next;     } } int main() {     struct link* head;     head =creatLink();     printLink(head);     return 0; }   参考一下吧  没有输出，那么是程序在while中死循环了吗？输入需要和格式相匹配

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

因为在红色语句的子函数的第二个scanf是以%d的形式输入的，把char改成int数据类型就相符合了

不是有标准库吗？为什么要自己写？

我在vs2013中调试的时候会出现Run-Time Check Failure #2- Stack around the variable "i" was corrupted . 可能是i只占一个字节的内存，但是你用%d接收的时候，其他三个字节的内存也被影响了，但是用vs接着输出时是对的。


Question: 链表建立后的输出问题？、？

p2->next=p1; p2 = p1;    //不移动p2的话链表不会增长

p2的next指向p1的语句后面，将p1赋给p2应该就解决了

每次输入链表节点的时候都通过p2改变了head指针的next。你只用把head指针的next改变一次


Question: 求水仙花数用while，为什么没有输出结果，求大佬修改。

这个只能求三位数的水仙花数。do{ 		i=n/100; 		j=n/10%10; 		k=n%10; 		if(i*100+j*10+k==i*i*i+j*j*j+k*k*k) 		{ 		printf("%5d",n); 		break; 		} 		n++; 	 		} while(n<1000);

额，请问如果这道题用do.......while和break语句编写要怎么写

#include<stdio.h> main() { int x,a,b,c; for(x=100;x<1000;x++) {a=0.01*x;b=0.1*x-a*10;c=(x-100*a-10*b); if(x==a*a*a+b*b*b+c*c*c) printf("%5d\t",x); } }   用自己的方法写了一下，你看看可不可以

n=100 不是n==100 第二个不是赋值语句

n没有赋初始值

额，如果要用do......while和continue语句，那个continue插在哪？

错误： 1.n==100有错，赋值语句用一个等号就可以，判断的时候需要两个等号 2.i*100+j*10+k==i*i*i+j*j*j+k*k*k可以简写为n==i*i*i+j*j*j+k*k*k 3.你写的程序只能是输出三位数的水仙花数 4.修改之后的代码仍有错误是因为return 0;上面多了一个} 下面是输出所有三位数水仙花数的代码:

#include<stdio.h> int main() { 	int i,j,k,n; 	printf("number is:"); 	n=100; do{         i=n/100;         j=n/10%10;         k=n%10;         if(i*100+j*10+k==i*i*i+j*j*j+k*k*k)         {         printf("%5d",n);         break;         }         n++;               } while(n<1000); 	} 	return 0; } 按照大佬写了，但是有错，说那个return 和最后的}有问题？


Question: 问一下关于c自定义函数的问题

第一个10是main函数内的第一条打印的输出； 第二个10是sum函数内的第一条打印的输出。 依次输出。  程序是按顺序执行的。

顺序执行，你是觉得  int sum(int, int);会执行？

c = sum( a, b);   这里a的实参是10, 那个全局没用， 局部优先

为什么你会觉得是第二种的输出方式呢，，，，程序按顺序输出就应该是第一种啊

输出第一个a之后，执行sum函数输出a，b，最后才输出c。


Question: 内存错误

引用 4 楼 qq_37171619 的回复:[quote=引用 3 楼 cfjtaishan 的回复:]  while(temp)         {             if(key < temp->data)             {                 temp = temp->lchild;                 if(!temp)                 {                     temp->lchild = p;                 }             }             else             {                 temp = temp->rchild;                 if(!temp)    //问题出在这个地方，因为temp已经为NULL了，然后再操作temp->rchild = p;就会导致段错误；同理上面的操作                 {                     temp->rchild = p;                 }             }         } 对NULL指针操作->rchild或->lchild都会导致段错误；建议重新梳理一下逻辑。 这是个问题，主要我调试的时候，提示creat()函数中用的bt 0xcccccccc[/quote] 还有一个问题就是你的creat函数中的指针不是指向NULL。 void insert(btree **bt, int key) {     if(search(*bt, key) == 1)     {         node *p = (node *)malloc(sizeof(node));         p->data = key;         p->lchild = p->rchild = NULL;         if(*bt == NULL)         {             *bt = p;             printf("helloworld\n");             return;         }         node *temp = *bt;//定义游标         while(temp)         {             if(key < temp->data)             {                 temp = temp->lchild;                 if(!temp)                 {                     temp->lchild = p;                 }             }             else             {                 temp = temp->rchild;                 if(!temp->rchild)                 {                     temp->rchild = p;                 }             }         }     } }  void creat(btree **bt, int a[], int n) {     int i;      *bt = NULL;     for(i=0; i<n; i++)         insert(bt, a[i]); }  void MidOrderTraverse(btree *bt) {     node *p = bt;     if(p)     {         MidOrderTraverse(p->lchild);         printf("%d ", p->data);         MidOrderTraverse(p->rchild);     } }  //#include "BST.H"  //void main() int main() {     btree *bt = NULL;     int a[5] = {1, 3, 2, 4, 5};     creat(&bt, a, 5);     MidOrderTraverse(bt);      return 0; }

引用 3 楼 cfjtaishan 的回复: while(temp)         {             if(key < temp->data)             {                 temp = temp->lchild;                 if(!temp)                 {                     temp->lchild = p;                 }             }             else             {                 temp = temp->rchild;                 if(!temp)    //问题出在这个地方，因为temp已经为NULL了，然后再操作temp->rchild = p;就会导致段错误；同理上面的操作                 {                     temp->rchild = p;                 }             }         } 对NULL指针操作->rchild或->lchild都会导致段错误；建议重新梳理一下逻辑。 这是个问题，主要我调试的时候，提示creat()函数中用的bt 0xcccccccc

引用 1 楼 user-2 的回复:你这个程序是要干什么的呀，能所具体点吗？？ 就是二叉排序树

你这个程序是要干什么的呀，能所具体点吗？？


Question: 循环之后为什么会多出一句？

回车换行也是一个字符

因为scanf("%c", &xx);是匹配字符，换行符也是字符。因此也是和%c相匹配的。因此，第一个是匹配'7'，第二个匹配的就是'\n'。

你在while循环外面和scanf("%c",&ch)之间加上getchar()就好了，原因是在编译的时候当你输入7时，你同时敲入回车键，而getchar()正好接收一个字符回车，就不会出现你上面那种情况了

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

忽视了换行符

同意楼上的

因为你输入7，按下回车，程序会读取两个字符，一个是7，一个回车，所以会出现那个打印


Question: C语言里怎样将图片与exe文件打包？

用打包软件阿，可以去百度一下，不难

图片和exe同一个目录，代码中直接用文件名（相对路径）试试。


Question: [求助]同一个文件夹下的两个文件同时编译时出错

注意，min.c中定义的函数名也是max，函数重名了，重复定义。  建议添加一个头文件，比如：  #ifndef _HELLO_H_ #define _HELLO_H_  int max(int, int); int min(int, int);  #endif 并在hello.c中引入hello.h。 然后再试一下

hello.c 中加上max和min的声明（原型）


Question: VC写一个截图UDP广播小程序，UDP广播不是说很块吗？为什么我的这么慢？

引用 10 楼 yiyefangzhou24 的回复:你确定能发出去？缓冲区满了会返回失败吧？确定能发送，已经实现接收现实。就是慢了点。

引用 6 楼 TheDaXiang 的回复:引用 2 楼 cfjtaishan 的回复:是局域网吗？https://download.csdn.net/download/thedaxiang/10422229我的项目上传了，最少必须设置了一分。不好意思。帮忙看看。 建议贴出代码，或者至少是关键性（与问题相关的）代码。给你解决问题还要花费这个吗？

引用 3 楼 zhouqunhai 的回复:能贴全代码看看吗https://download.csdn.net/download/thedaxiang/10422229我的项目上传了，最少必须设置了一分。不好意思。帮忙看看。

引用 1 楼 user-5 的回复:异步发送试试。https://download.csdn.net/download/thedaxiang/10422229我的项目上传了，最少设置了一分。不好意思。帮忙看看。

用tcp发送8M数据也不至于1分钟啊。。。。。。。贴代码吧

能贴全代码看看吗

是局域网吗？

引用 8 楼 cfjtaishan 的回复:引用 6 楼 TheDaXiang 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] 是局域网吗？https://download.csdn.net/download/thedaxiang/10422229我的项目上传了，最少必须设置了一分。不好意思。帮忙看看。 建议贴出代码，或者至少是关键性（与问题相关的）代码。给你解决问题还要花费这个吗？[/quote]不知道哪里有问题，都不知道贴哪里。已改百度云，当时没想到。https://pan.baidu.com/s/13D_A3eAzi1n7XGIGLLNggw

你确定能发出去？缓冲区满了会返回失败吧？

异步发送试试。


Question: 大一萌新求问，大神路过扫一眼，解答下啊啊啊

if判断有问题，把它改成赋值号==

引用 3 楼 dark9527 的回复:if判断有问题，你写的是赋值，可以写成if(c==s[i])这样编译器在编译的时候可以检测出来。 这样也是检测不出来的。因为c是变量。若c是常量，因为常量不能做左值，编译器可以检测出来。但是c是变量，所以也是检测不出来的。

“=”   "==" 你这个函数会输出啊 全空“       ” 多次操作getchar gets 检查下是否获取正常，刷新下

if判断有问题，是s[i] == c（判断表达式）而不是s[i] = c赋值表达式。 另外，确认一下getchar();得到字符是否是你输入的字符，只需要打印一下就可以判定。

引用 4 楼 cfjtaishan 的回复:[quote=引用 3 楼 dark9527 的回复:] if判断有问题，你写的是赋值，可以写成if(c==s[i])这样编译器在编译的时候可以检测出来。 这样也是检测不出来的。因为c是变量。若c是常量，因为常量不能做左值，编译器可以检测出来。但是c是变量，所以也是检测不出来的。[/quote] 疏忽了。4楼说的对。没有仔细想。


Question: C怎么做获取文件路径。

程序中生成路径再赋值给宏定义，这样是没办法办到的。宏定义不是运行时生成的，而是编译阶段就确定的。建议使用字符数组保存文件路径。

引用 1 楼 lianshaohua 的回复:#define F  这条语句是在预处理阶段完成的，运行的时候改不了值的 生成带#define F的.h或.c/cpp文件后，调用编译链接重新生成后再运行。 参考代码生成（codegen）技术。

#define F  这条语句是在预处理阶段完成的，运行的时候改不了值的


Question: 大神菜鸟都看看啊,两种if else写法,代码逻辑部分的写法就应该像二叉树一样优雅严密,我觉得第一种像二叉树啊,为什么你们觉得第二种好呢?没分分,我只剩下C币了

还有其他大神, 我就不一一回复了. 我特别喜欢你们,你们都好厉害. 我特别佩服你们, 什么时候我能想你们这么优秀就好了.

引用 9 楼 DelphiGuy 的回复:串联的if else，应该把出现概率大的情况放在前面 大神,我特别喜欢你.你和赵老师一样牛.我特别佩服你.

赵老师,我有什么问题都希望能得到你的指点,心里特别高兴,这两天生病了.大家都保护好身体.

下面两种if语句的书写格式哪个比较好？为什么？ ①if (a>1 && a<5 && b>3 && b<7) ②if (1<a && a<5           && 3<b && b<7)  ②较好，两个变量分开，变量范围一目了然1<a<5，3<b<7，且数字从左到右从小到大排列

第一种要多打一对大括号，缩进，不爽。为啥这么执着2呢

无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

引用 9 楼 DelphiGuy 的回复:串联的if else，应该把出现概率大的情况放在前面  CPU分支预测？

如果想了解更深，考虑学习汇编语言，毕竟所有的编译器都需要将高级语言编译成机器码才可以执行。 不过就你的这两种方式，编译成机器码而言，应该是一样的。你可以试着编译一下，看看CPU中，翻译成汇编是如何执行的。 大意就是如下： 比较（最开始的if） 如果不满足就跳走，当然了满足就继续执行，到最后时也是跳走。 至于你是 else {     if()     {}     else     {} } 还是 else if() {} else {} 这里都是一条比较语句，就是你的条件比较。 如果不满足就跳走（跳到else那里执行），满足就继续执行，完毕后跳走即可。  当然不同的编译器可能编译成不同的机器语言，但是这个简单的条件，应该没啥大区别。

串联的if else，应该把出现概率大的情况放在前面

写的很细。。。。

只要逻辑见解，易懂就好。嵌套不易过多，过多会使理解变得困难。

无谓好坏，通常根据语义，第2种更倾向表达几个分支都是并列关系，而第1种倾向表达后面的分支是前面的一个子情况，虽然两种实际效果是一样的，但根据不同情况你可以选择更容易理解的写法

研究精神值得鼓励！虽然这个问题看起来很小。

我写了六段代码,运行结果是,两种if else的写法,是一样的. 我觉得第一种更像二叉树,更清晰. 可是好多人说第二种if else 更清晰. 难道是我错了? 可能有人要说,研究这有毛的意义,有毛的区别? 代码首先要写的逻辑严密,不留死角.才有健壮性,才不会奔溃啊. 还有,代码要写给自己和别人看,写的规范,严谨点好啊.


Question: 为什么在这设得是a[3][3],可是我只能输入两个字符

a[3][3]是每次输入2个字符，因为输入多余2个字符就会越界。最后一个字符空间用于存储'\0'字符串结束标识。但是可以连续输入3次，一次最多输入2个字符。

末尾不是还有一个'\0'吗。


Question: 求助：为什么这个霍夫变换vc代码运行时代开bmp文件失败啊？

程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。


Question: 对指针型字符数组的打印问题

#include <stdio.h> #include <string.h>   void week(int, char *); // 此函数用于将星期几赋给字符数组 int main() {     int d; // 储存输入的数字     char day[16] = {0}; // 字符数组day用于储存数字对应的星期几      printf("Please enter a number between 1 and 7: ");     scanf("%d", &d);     //void week(int d,char *day[10]);      week(d, day);      printf("%s\n", day);      return 0; }  void week(int d,char day[]) {     switch (d) {         case 1:             //strcpy("*day[10]","Sunday");             strcpy(day, "Sunday");             break;         case 2:             //strcpy("*day[10]","Monday");             strcpy(day, "Monday");             break;         case 3:             //strcpy("*day[10]","Tuesday");             strcpy(day, "Tuesday");             break;         case 4:             //strcpy("*day[10]","Wednesday");             strcpy(day, "Wednesday");             break;         case 5:             //strcpy("*day[10]","Thursday");             strcpy(day, "Thursday");             break;         case 6:             //strcpy("*day[10]","Friday");             strcpy(day, "Friday");             break;         case 7:             //strcpy("*day[10]","Saturdays");             strcpy(day, "Saturdays");             break;         default:             printf("\aYou have entered an wrong number!\n");             break;     } } 参考一下吧  注意函数调用的方式，以及数组的意义和使用，字符串的处理的方法。基本功不扎实，建议多练习和学习课本知识。

几个问题： 1、定义char *day[10]时，表示的是字符指针数组，即数组的每一个元素都是字符指针，此时必须动态分配内存。这里的字符数组应该定义为  char day[10];  2、函数传入字符指针时，应为char *，它表示传入一块字符类型的内存的首地址，可以在地址中存入内容。 3、输出时，之前已经定义字符数组为char day[10]，则这里直接输出day就好了，即：  printf("%s",day);  4、strcpy的第一个参数是字符指针，用双引号就失去指针的意义了，正确写法是：  strcpy(day,"Sunday");

字符数组约等于字符串，字符指针数组约等于字符串数组，前者是一级指针，后者是二级指针，概念搞混了。


Question: 这个代码无法控制移动，求教是怎么回事

我用的是codeblocks， 用Dev C++也能运行 While循环里的声明要改成调用

是否是软件版本问题？楼主是用什么版本的软件

最后的函数调用把void给删除了，删除updateWithoutInput函数就可以用了，因为这是我初次在CSDN上发帖，很多东西打错了，具体的你可以看我后面的飞机大战帖子，那个比这个完善

把while循环里的两个函数声明改成调用。


Question: 和不能共存问题

我之前在哪里看到过在使用wireless.h是也会出现这个问题，好像他是把include Linux/if.h屏蔽了

是不是内核版本不一致呢，内核一直在更新，部分结构体也可能跟着变化。代码在移植过程中需要关注一下结构体的变化

是的，我遇到過類似的問題，龍芯的系統。 應該是龍芯對頭文件做過一些升級，以便在基礎版本上支持一些更新的功能。 但是新加入的代碼需要的結構體又無法全部滿足，結果就跟你一樣了。

引用 1 楼 hzy_76 的回复:不能并存是因爲有結構體重複定義了吧，這應該是版本不一致引起的。我的做法一般是直接定義結構體，抛棄其中一個頭文件。 意思是把一个头文件里面的结构体提取出来直接用？


Question: Windows编程在同时2个窗口存在时定时器不起作用

仅供参考：#pragma comment(lib,"user32") #include <stdio.h> #include <time.h> #include <sys/timeb.h> #include <windows.h> CRITICAL_SECTION cs_log; char datestr[16]; char timestr[16]; char mss[4]; void log(char *s) {     struct tm *now;     struct timeb tb;      EnterCriticalSection(&cs_log);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,s);     LeaveCriticalSection(&cs_log); } VOID CALLBACK myTimerProc1(   HWND hwnd, // handle of window for timer messages   UINT uMsg, // WM_TIMER message   UINT idEvent, // timer identifier   DWORD dwTime // current system time ) {  log("In myTimerProc1\n"); } VOID CALLBACK myTimerProc2(   HWND hwnd, // handle of window for timer messages   UINT uMsg, // WM_TIMER message   UINT idEvent, // timer identifier   DWORD dwTime // current system time ) {  log("In myTimerProc2\n"); } int main() {     int i;     MSG msg;      InitializeCriticalSection(&cs_log);     SetTimer(NULL,0,1000,myTimerProc1);     SetTimer(NULL,0,2000,myTimerProc2);     for (i=0;i<20;i++) {         Sleep(500);         log("In main\n");         if (GetMessage(&msg,NULL,0,0)) {             TranslateMessage(&msg);             DispatchMessage(&msg);         }      }     DeleteCriticalSection(&cs_log);     return 0; } //2018-04-17 10:07:54.218 In main //2018-04-17 10:07:54.718 In myTimerProc1 //2018-04-17 10:07:55.218 In main //2018-04-17 10:07:55.718 In myTimerProc2 //2018-04-17 10:07:56.218 In main //2018-04-17 10:07:56.218 In myTimerProc1 //2018-04-17 10:07:56.718 In main //2018-04-17 10:07:56.718 In myTimerProc1 //2018-04-17 10:07:57.218 In main //2018-04-17 10:07:57.718 In myTimerProc2 //2018-04-17 10:07:58.218 In main //2018-04-17 10:07:58.218 In myTimerProc1 //2018-04-17 10:07:58.718 In main //2018-04-17 10:07:58.718 In myTimerProc1 //2018-04-17 10:07:59.218 In main //2018-04-17 10:07:59.718 In myTimerProc2 //2018-04-17 10:08:00.218 In main //2018-04-17 10:08:00.218 In myTimerProc1 //2018-04-17 10:08:00.718 In main //2018-04-17 10:08:00.718 In myTimerProc1 //2018-04-17 10:08:01.218 In main //2018-04-17 10:08:01.718 In myTimerProc2 //2018-04-17 10:08:02.218 In main //2018-04-17 10:08:02.218 In myTimerProc1 //2018-04-17 10:08:02.718 In main //2018-04-17 10:08:02.718 In myTimerProc1 //2018-04-17 10:08:03.218 In main //2018-04-17 10:08:03.718 In myTimerProc2 //2018-04-17 10:08:04.218 In main //2018-04-17 10:08:04.218 In myTimerProc1 //2018-04-17 10:08:04.718 In main //2018-04-17 10:08:04.718 In myTimerProc1 //2018-04-17 10:08:05.218 In main //2018-04-17 10:08:05.718 In myTimerProc2 //2018-04-17 10:08:06.218 In main //2018-04-17 10:08:06.218 In myTimerProc1 //2018-04-17 10:08:06.718 In main //2018-04-17 10:08:06.718 In myTimerProc1 //2018-04-17 10:08:07.218 In main //2018-04-17 10:08:07.718 In myTimerProc2

引用 1 楼 zhao4zhong1 的回复:两个wndclass使用同一个WndProc，导致SetTimer以同样参数执行了两次。  即使SetTimer一次也不在WndProc里面执行也是一样   用SetTimer(NULL,NULL,1000,ProcTimer)  在WinMain函数 创建一个定时器  窗口过程不创建SetTimer 也不接受WM_TIMER消息  结果也是一样。。。。。。  同样的代码用32位汇编写没问题 换成C 就出现问题了 不知道咋回事


Question: 控制步进电机转动指定步数的编程问题

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

楼主问题解决了吗？

不论你是FOR出来的，还是BREAK出来的，出来后都没有代码了，然后乱跑，于是就碰巧执行到RST后第一条代码了，然后程序重跑一遍，反复重跑。

程序没有while（1）循环，有可能跑完复位又跑一次

百度搜相关关键字。

引用 2 楼 dark9527 的回复:在for循环里面i到不了200，在到200的时候for循环的条件不满足，不进入循环了，所以break语句执行不到。 哦哦,我明白了!谢谢!我改一下

那我使用延时程序一样两层for循环可以吗


Question: codeblocks怎样查看形参数组的值

数组作为参数传递会退化为指针，f1参数实际是int*，是指针而不是数组，f1中没法知道数组大小，自然也不会按数组方式显示

因为此时a就是一个指针，所以只能看它的值（一个地址） 可以看它指向的内容，打开Memory窗口，地址输入a即可 不过只能整型数据能看清，浮点的就算了

作为形参这个类型会退化成指针，调试时也仅仅把它当做一个指针而已 VS也仅能查看第一个值


Question: 关于C语言指针的表述

让b指向a的地址，是对b赋值  *b = 3 才是对*b赋值

b是一种char类型指针的变量，它保存的是一个指针值。在您的例子中，它保存的是a的地址，也就是说，它的值是a的地址。

第二行是不是多了个*号？ unsigned char* b = &a 把变量a的地址赋值给*b，我的理解是这样，但是不懂为什么知乎上面这里的意思是吧变量a的地址赋值给b？

这里定义了*b，那么第二行不应该是这样吗？ unsigned char* b = &a;  这里为什么前面会多了一个*号？ 不是应该是unsigned char b=&a;

unsigned char* b = &a; 这句话的意思是：把a的地址赋值给*b还是b？


Question: 逆向匹配分词算法utf8

出门左拐进Python论坛。


Question: 请教一个关于C语言数组的问题

百度搜相关关键字。

积分能变不！！

for (i=0;i<n;n++) {         for (j=0;j<n;j++) {             for(k=0;k<n;k++) {                 if (i==j||i==k||j==k)                     continue;                 count=judge(a[i],a[j],a[k]);             }         }     } 注意你的第一层循环，循环变量增加怎么变成n++了呢？是不是应该是i++呢

count 每次都会更新值但并不会储存，用static int定义 count应该就可以..变量生存期问题

[code=c][    for (i=0;i<n;n++) {         for (j=0;j<n;j++) {             for(k=0;k<n;k++) {                 if (i==j||i==k||j==k)                     continue;                 count=judge(a[i],a[j],a[k]);             }         }     }/code] 就是关于这一段的从数组a中任取三个数，上述方法是不是有问题？具体出在哪呢？

建议学习一下变量的生存期

引用 2 楼 hdt 的回复:你要做什么？ 有若干个长度不等的木条，我们要把其中的木条，尽可能多的组装成三角形的架子，当然，有些木条组合起来，不一定能组成三角形。    输入格式:  第一行输入n  第二行输入n个木条的长度：a1   a2    a3………an    输出格式：  可最多组成三角形的个数    输入样例：  3[回车]  3[空格]4[空格]5[回车]    输出样例：  1[回车]

你要做什么？


Question: 麻烦各位前辈帮我检查下这道题的错误~ HDU 1496 枚举求多项式解的数量

scanf("%d%d%d%d",&a,&b,&c,&d) 注意scanf不一定是返回0,1.若成功，scanf返回的是输入项目的个数，比如上面的代码，若输入格式正确，则返回4，若有3个格式正确则返回3. 因此判断scanf的返回值不能用～取反，因为有可能返回2， 3， 4

这题没啥难度，唯一有点技巧的地方是利用对称性把测试范围从16亿缩小到1亿：  #include <stdio.h>  int main() {   int a, b, c, d;   while (scanf("%d%d%d%d", &a, &b, &c, &d) != EOF)   {     int s = 0;     if (!((a > 0 && b > 0 && c > 0 && d > 0) || (a < 0 && b < 0 && c < 0 && d < 0)))       for (int i = 1; i < 101; i++)       for (int j = 1; j < 101; j++)       for (int k = 1; k < 101; k++)       for (int w = 1; w < 101; w++)         if (!(a * i * i + b * j * j + c * k * k + d * w * w)) s++;     printf("%d\n", s * 16);   }    return 0; }


Question: 程序问题

有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行！ 写日志到文件参考下面： //循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef _MSC_VER     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX; CRITICAL_SECTION cs_BBB; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             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]:'.');             }             Log("%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]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int main() { #ifdef _MSC_VER     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX);     InitializeCriticalSection(&cs_BBB); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef _MSC_VER     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef _MSC_VER     DeleteCriticalSection(&cs_BBB);     DeleteCriticalSection(&cs_HEX);     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }

建议将代码贴出来，这样大家查看你的代码，讨论你的代码比较方便。

百度搜“调试驱动程序”

引用 1 楼 zhao4zhong1 的回复:百度搜“调试驱动程序” 额，我说的驱动程序是指“函数的测试程序”


Question: codeblocks调试时怎样查看全局变量？

watch窗口下面第一列输入 ::a


Question: 大神帮忙看个程序

#include"stdio.h"  void sort(int num[10]);  int main(){      int num[10]={12,35,89,576,3958,0,34,8,6,1};     int i;      for(i=0;i<10;i++)         printf("%d\n",num[i]);     printf("\n");     sort(num);     for(i=0;i<10;i++)         printf("%d\n",num[i]);   //是num[i]，不是num     return 0; }  void sort(int num1[]){     int i,j,t;     for(i=0;i<10;i++){         for(j=0;j<10;j++){             if(num1[i] > num1[j]){                 t=num1[i];                 num1[i]=num1[j];                 num1[j]=t;             }         }     } }

printf("%d\n",num);//不应该是printf("%d\n",num[i]);吗

printf("%d\n",num);这个编译器会报告警吧,楼主都不关注告警的么


Question: 不能正常输出

你这个x，y的递增递减在哪里？ 还有你的矩阵是不是建的太小了点？ 但是目测你的显示问题与以上都无关。

cmd里的字符集的问题。。。。

引用 6 楼 zhao4zhong1 的回复:#include <locale.h> setlocale(LC_ALL,"chs"); ?已经知道问题所在了，更新了win10预览版。是系统的问题，虚拟机里能正常输出

数组怎么开这么点

数组定义要大一点！这样的数组，一下子就溢出了，会出问题的。

引用 1 楼 hzy_76 的回复:数组定义要大一点！这样的数组，一下子就溢出了，会出问题的。跟数组没关系吧，看我输出的第一句，他连正常输出字符都做不到，我在同学电脑上运行就是正常的

引用 2 楼 weixin_41133154 的回复:数组怎么开这么点跟数组没关系吧，看我输出的第一句，他连正常输出字符都做不到，我在同学电脑上运行就是正常的


Question: 为什么会多输出#？

#include <stdio.h> #include <ctype.h> #include <string.h>  #define MAX_CHAR_NUM   26  int main() {     char str[100];     int i;      scanf("%s", str); #if 1     i = 0;     while (str[i]) {         if (isupper(str[i]))             str[i] = (str[i] - 'A' + 3) % MAX_CHAR_NUM + 'a';         else if (islower(str[i]))             str[i] = (str[i] - 'a' + 3) % MAX_CHAR_NUM + 'A';         i++;     }     puts(str); #else     len = strlen(a);     for (i = 0; i < len; i++) {         if (isupper(str[i]))             str[i] = (str[i] - 'A' + 3) % MAX_CHAR_NUM + 'a';         if (islower(str[i]))             str[i] = (str[i] - 'a' + 3) % MAX_CHAR_NUM + 'A';     }     puts(str); #endif  #if 0     for (i = 0; i <= len; i++)     {         if (a[i] >= 'a' && a[i] <= 'z')             a[i] = a[i] - 32;         else             a[i] = a[i] + 32;     }     a[i] = '\0';     for (i = 0; i <= j; i++)     {         if ((a[i] >= 120 && a[i] <= 122) || (a[i] >= 88 && a[i] <= 90))             a[i] = a[i] - 23;         else a[i] = a[i] + 3;         printf("%c", a[i]);     } #endif     return 0; } 参考一下吧； 建议可以使用库函数isupper， islower。 另外，算法建议找到规律。对于字符，不建议使用数值，比如'A'用65表示。这样代码可读性不高。

引用 2 楼 MonGo17 的回复:错误： 1.输入时，数组名代表数组的首地址，故&a应改为a 2.用for循环时，i是从0开始的故不应该循环到j,应改为for(i=0;i<j;i++) 3.a[i] = '\0';是错误的，这样就把最后一个字母改变了 正确的代码如下：  谢谢回答 关于那个a[i]=‘\0',之前也是遇到过一个问题，就是定义一个数组，因为vs不允许用变量输入赋值表示数组元素个数，就必须写一个比实际元素个数大的数字，但是，又不想让后边空着的元素全都变成零，那个'\0'不是表示结束符吗

for (i = 0; i <= j; i++)    ===> for (i = 0; i < j; i++)


Question: 为什么char a[5]="hello"也可以？

char 是字符型变量可以存储字符,可容纳单个字符的一种基本数据类型 char a[5] char a[5] = {'h','e','l','l','\0'};后面更者“\0”占一个字节，每一个字母都是用单个字符表示，于是字母“o"没有地址存放 char a[5]="hello"是正确的代表一个字符串，是正确形式 能达到相同目的的方式还有 char *a[5] = "hello" 定义一个char类型指针a，*符号，在定义的语句中，表示声明了一个指针的类型.

为什么人走铁道也可以？

ASCII码没有0，还是有点不清楚

感觉6和7是矛盾，答主那个第2段话是说，比如char a[4]="abc",那 '\0' 就在a[3]上吗？@云海玉弓缘

首先，C语言没有字符串变量，只有字符串常量，所以字符串变量的任务就交给字符数组解决了！ 字符串常量："qwer" 这是一个字符串常量，字符串常量会在结尾加一个结束符'\0'，所以这个字符串常量的实际长度为5 字符数组：char[5]; 1.首先，这个字符串数组的长度为5，这一定没问题：从c[0]到c[4]。 2.然后，这其中字符数组必须也有一个结束符号'\0'，它在最后一个有意义的字符之后的一个位置（如果有意义的字符是2个的话，结束字符就在a[2]上，如果有意义的字符是3个的话，结束字符就在a[3]上）  1.char[5]={'q','w','e','r'}(正确写法，末尾自动添加结束符) 2.char[5]={'q','w','e','r'.'t'};（错误写法，编译器不会报错，输出字符串数组名的时候结尾会有烫烫烫） 3.char[]={'q','w','e','r'};（错误写法，编译器不会报错，输出字符串数组名的时候结尾会有烫烫烫,因为并不知道字符串的长度，无法推断出结束符的位置，可以理解为编译器不那么智能） 4.char[]={'q','w','e','r','\0'};（正确写法，编译器可以推断出字符串结束符号的位置） 5.char[5]="qwer";（正确写法，末尾自动添加0） 6.char[5]={"qwer"}（正确写法，末尾自动添加0） 7.char[5]="qwert"（正确写法，末尾自动添加0） 8.char[5]={"qwert"}（错误写法，编译器会报错） 9.char[]="qwer"（正确写法，结尾自动添零，推断出字符串长度） 10.char[]={"qwer"}（正确写法，结尾自动添零，推断出字符串长度） 11.char[5]; a[0]='q' a[1]='w' a[2]='e' a[3]='r' (错误写法，编译器不会报错，输出字符串数组名的时候结尾会有烫烫烫)

编译器不负责任呗


Question: 服务器如何正常接收并打印收到16进制数据？

有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行！ 写日志到文件参考下面： //循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef _MSC_VER     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX; CRITICAL_SECTION cs_BBB; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             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]:'.');             }             Log("%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]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int main() { #ifdef _MSC_VER     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX);     InitializeCriticalSection(&cs_BBB); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef _MSC_VER     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef _MSC_VER     DeleteCriticalSection(&cs_BBB);     DeleteCriticalSection(&cs_HEX);     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }

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

引用 5 楼 zhao4zhong1 的回复: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);     } }  赵老师，我通过抓包发现，服务器接收到的数据不完整，服务器用libevent写的，这样怎么解决呀？

引用 3 楼 Forward__J 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 十六进制只是数据的表示形式，客户端可以发送的不是按照16进制形式传输的而是二进制形式。 服务器无法打印，是没有收到吗？确认一下是否收到，然后在考虑输出的问题。 如果有codes，建议贴出来。  我用char数组接收的，这样应该没问题把？[/quote] 没问题，可以用char数组接收。输出时按照%x输出即可以输出16进制

引用 1 楼 cfjtaishan 的回复:十六进制只是数据的表示形式，客户端可以发送的不是按照16进制形式传输的而是二进制形式。 服务器无法打印，是没有收到吗？确认一下是否收到，然后在考虑输出的问题。 如果有codes，建议贴出来。  我用char数组接收的，这样应该没问题把？

只要能接收到byte[]， 显示为2进制，8进制还是16进制只是显示格式不同


Question: 不明白程序的错误，请求支援

多了个 if那多了个;

这里面高手真多，楼上太强悍了

你的程序没什么大错误，只是在那句if(str1[i]!='*')后多了个分号，所以条件判断其实没生效，后面那段赋值語句一直在执行，所以会原样输出。 下面是修改后的程序运行结果

判斷不爲*的那個if語句最後多了個分號，所以條件判斷其實沒生效，後面那段賦值語句一直在執行。

兄弟把if后面的；去掉可好

没有警告吗？

引用 4 楼 cfjtaishan 的回复:[quote=引用 1 楼 qq_30918465 的回复:] 兄弟把if后面的；去掉可好 +++ 编程需要仔细和认真[/quote]  +++

引用 1 楼 qq_30918465 的回复:兄弟把if后面的；去掉可好 +++ 编程需要仔细和认真

这是多加了个；啊


Question: 判断13开始到100可被13整除的数，存在问题

帮帮忙 看一下问题 数组的值总为0

check(); int max(); 把int去掉试试

//最大的可被13整除的数，从13开始// #include<stdio.h>  #define NUM 100 int number=13, count=0,max_num=0; int main()  { 	for (number = 13; number<= NUM; number++)//13-100之间// 		if (number % 13 == 0) { 			count++; 			max_num = number; 		} 	printf("有%d个数字，最大值为%d\n", count, max_num); return 0; }   不需要那么复杂，这样就可以啦。

能不这么使用全局变量，则不要使用。建议通过传递参数实现更好

#include<stdio.h>  #define NUM 100  void check(void); int max(void);  //int number=13, count=0,max_num=0; //int record[100] = { 0 }; int number, count,max_num; int record[100];  int main() {     for (number = 13; number<= NUM; number++)//13-100之间//         check();     max();     printf("最大值为%d\n", max_num);     return 0; }  void check() {     int i;     if (number % 13 == 0) {         record[count] = number;         count++;         /*         for (i = 0; i <count; i++) {             record[i] = number;         }         */      } }  int max() {     int a;     for (a = 0; a <=count; a++) {         if (record[a] < record[a + 1])             max_num = record[a + 1];     }     return (max_num); } 参考一下吧  全局变量即使不显示初始化为0，编译器也会自动将其赋值为0. 参考一下逻辑问题

check和max都有问题    #include<stdio.h> #include <stdlib.h>   #define NUM 100   void check(void);  int max(void);   int number=13, count=0,max_num=0;  int record[100] = { 0 };  int main()   {  for (number = 13; number<= NUM; number++)//13-100之间// 	check();   max();  printf("最大值为%d\n", max_num);   system("pause");  return 0;  }   void check()  {  if (number % 13 == 0) {  record[count] = number;  count++;  }  }     int max()  {  int a;  for (a = 0; a < count; a++) {  if (max_num < record[a]) 	 max_num = record[a];  }  return (max_num);  }


Question: C语言，关于if语句的编译

《数字逻辑电路》 《计算机组成原理》

好像是根据是否通电进行判断

if语句的详细解释可以看看这个：https://cloud.tencent.com/developer/doc/1023

有个寄存器叫状态寄存器，里面有很多标志，每条指令执行完后，状态寄存器都记录了一些标记，JE和JNE就是根据状态寄存器里的标志来跳转的。

全是大佬。。。。。。

没错，要是想了解硬件如何处理，还是学习一下汇编语言吧。汇编中有比较，如果是真，就调到一个子函数中执行，如果是假，就跳到另外的子函数执行。 子函数也无非就是一个地址的开始，最后有返回罢了。

引用 2 楼 jndx_xyc 的回复:[quote=引用 1 楼 wang0635 的回复:] 80X86中有 CMP    XX, YY    比较XX与YY JE    XXXX    如果相等则转移到XXXX JNE    XXXX    如果不相等则转移 JG    XXXX    如果大于则转移 等等指令。  第一句意思是，进行条件的判断，各标志位变化，那么当执行到JE语句时，CPU不是还得根据标志位的状态去判断是否转移吗？我想要理解的是这个JE和JNE指令执行时候的一个CPU内部的流程！谢谢[/quote] 先要了解汇编语言

看下这个，或许能解决你的疑问

引用 1 楼 wang0635 的回复:80X86中有 CMP    XX, YY    比较XX与YY JE    XXXX    如果相等则转移到XXXX JNE    XXXX    如果不相等则转移 JG    XXXX    如果大于则转移 等等指令。  第一句意思是，进行条件的判断，各标志位变化，那么当执行到JE语句时，CPU不是还得根据标志位的状态去判断是否转移吗？我想要理解的是这个JE和JNE指令执行时候的一个CPU内部的流程！谢谢

2. 条件转移指令	(短转移,-128到+127的距离内)( 当且仅当(SF XOR OF)=1时,OP1<OP2 ) 	JA/JNBE		不小于或不等于时转移. 	JAE/JNB		大于或等于转移. 	JB/JNAE		小于转移. 	JBE/JNA		小于或等于转移. 		以上四条,测试无符号整数运算的结果(标志C和Z). 	JG/JNLE		大于转移. 	JGE/JNL		大于或等于转移. 	JL/JNGE		小于转移. 	JLE/JNG		小于或等于转移. 		以上四条,测试带符号整数运算的结果(标志S,O和Z). 	JE/JZ		等于转移. 	JNE/JNZ		不等于时转移. 	JC			有进位时转移. 	JNC			无进位时转移. 	JNO			不溢出时转移. 	JNP/JPO		奇偶性为奇数时转移. 	JNS			符号位为 "0" 时转移. 	JO			溢出转移. 	JP/JPE		奇偶性为偶数时转移. 	JS			符号位为 "1" 时转移.  《The Intel 64 and IA-32 Architectures Software Developer's Manual》

微处理器设计

楼主是要学习数字电路之类的吗？

引用 8 楼 jndx_xyc 的回复:[quote=引用 7 楼 wenpinglaoyao 的回复:] 我有一个不政治正确的建议：如果题主您只是想从事编程工作，那么对于硬件底层的具体实现原理不用太过纠结，能符合您的大致想象即可，因为人的精力有限，好钢用在刀刃上吧，希望您能理解。 哈哈，谢谢你的建议，我觉得有道理。不过我每当编程的时候想到这个问题就遍不下去了，睡觉也睡不着，就在一直想像这个过程。。。挺烦躁的，可能还是理解不够深刻[/quote] 恕我直言题主，您这种情况，可以算是强迫症式的心理“疾病”，要知道计算机进化到现在，是一个超大集体几代人共同的努力，其中倾注的心血，说是凝聚成了海洋也不过分。所以我们单靠自己民科式的猜想来想象她的模样，大多时候只会给我们徒增苦恼，要经过枯燥而系统的学习才可以见其一二。

再回到您的问题本身来，如果您会看反汇编就会发现，所谓的if执行流程是这样的：首先，有一个标志位，里面是if条件表达式的结果【0或1】，然后后面是一个跳转动作，如果那个标志位是1,那么就执行这个跳转动作，不然就执行紧跟if语句后的那些指令。

引用 7 楼 wenpinglaoyao 的回复:我有一个不政治正确的建议：如果题主您只是想从事编程工作，那么对于硬件底层的具体实现原理不用太过纠结，能符合您的大致想象即可，因为人的精力有限，好钢用在刀刃上吧，希望您能理解。 哈哈，谢谢你的建议，我觉得有道理。不过我每当编程的时候想到这个问题就遍不下去了，睡觉也睡不着，就在一直想像这个过程。。。挺烦躁的，可能还是理解不够深刻

引用 4 楼 qq_30918465 的回复:  谢谢，看懂了，里面还有一个问题就是检查标志位，这个动作我是实在不理解，感觉涉及到硬件电路构造的东西，我去找找有什么相关书籍


Question: VS2017调试C语言程序直接进入scanf函数，F10失效

变量a, key, grade, flag定义的数组长度太大（栈上的空间是有限的），不知道你是否针对会运用到这么大的空间，建议使用malloc/free动态申请空间。 scanf不跳出是因为正等待终端输入。


Question: 从键盘输入两个数X,Y，计算数学表达式tan(PI/6)+2*PI*sqrt(3*y=exp(x))/(y-x)

n是double类型，需要使用%lf格式输出。 另外，输入时注意在两个数据中间使用逗号。确保再计算tan之前x, y是自己输入的数据，建议在scanf后加一条打印printf，确认x, y的值。

printf("n=%lf",n);


Question: C 音乐播放器 怎么开发波普

图形界面建议C#

这个问题很简单，但是需要一些知识积累。 音乐文件->解码->PCM 大致的流程是这样的，PCM的数字大小可以表示振幅，这样就可以绘制了。 我觉得你还是需要找个demo看看

波谱应该是指频谱（vs 波形图概念），解码得到wav波形数据后，还需要转化到频域。

使用bass库

波谱的话，音频需要自己解码吧，搜索一下有没有音频解码的开源库。

VC6EN http://pan.baidu.com/s/1jImOtAe  Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

什麽年代了還要6.0？換一個啦，起碼2012


Question: 段错误（核心已转移）

引用 3 楼 dear_Alice_moon 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令  赵老师，好厉害啊，膜拜一下。  其实你写的是啥，我都有些看不懂，在这里膜拜吹捧你一下。 (^__^)  现在该走了，下班了！  好累，一直996的工作，我都想辞职了。  [/quote] 一言以蔽之：不明觉厉，人生苦短。

就是你前面的blabla……，浓缩成一句话就是“不明觉厉，人生苦短。”

引用 4 楼 zhao4zhong1 的回复:[quote=引用 3 楼 dear_Alice_moon 的回复:] [quote=引用 2 楼 zhao4zhong1 的回复:] Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令  赵老师，好厉害啊，膜拜一下。  其实你写的是啥，我都有些看不懂，在这里膜拜吹捧你一下。 (^__^)  现在该走了，下班了！  好累，一直996的工作，我都想辞职了。  [/quote] 一言以蔽之：不明觉厉，人生苦短。[/quote]  赵老师能不能说的“通俗易懂”些？   您说的“一言以蔽之：不明觉厉，人生苦短。” ，我个人资质鲁钝，无法理解！

引用 2 楼 zhao4zhong1 的回复:Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令  赵老师，好厉害啊，膜拜一下。  其实你写的是啥，我都有些看不懂，在这里膜拜吹捧你一下。 (^__^)  现在该走了，下班了！  好累，一直996的工作，我都想辞职了。

#include<stdio.h> #include<stdlib.h> #include<unistd.h> #include <stdbool.h> #include<string.h> #include <errno.h>  int main(int argc,char *argv[]) {     int arg;     char data[20]={0};     bool flag=false;   //判断输入Id是否存在     FILE *fp;      if (argc < 2)         return 0;      /*$./student -i 101 zhangsan studentinfo.txt       选项i完成插入功能，如果101已经存在，则报错，不执行插入操作.如果101不存在，       把指定参数的内容追加到文件的末尾新的一行*/     if(!strcmp(argv[1],"-i")){         //fp = fopen("studentinfo.txt","a+");         fp = fopen("studentinfo.txt","r");         if (!fp) {             printf("Open file error: %s\n", strerror(errno));             exit(0);         }         while(!feof(fp)){             fgets(data,20,fp);             if(strstr(data,argv[2])!=NULL) flag=true;         }         if(flag==true)             printf("该数据已存在");         else{             fseek(fp,0,2);             fprintf(fp,"%s%s",argv[2],argv[3]);         }         fclose(fp);     }      /*$./student -d 101  studentinfo.txt       选项d完成删除操作，如果学号101不存在，退出程序并给出提示，       如果学号101存在，则删除该行，并给出相应提示*/     if(!strcmp(argv[1],"-d")){         fp=fopen("studentinfo.txt","rb+");         if (!fp) {                 printf("Open file error: %s\n", strerror(errno));                 exit(0);         }         while(!feof(fp)){             fgets(data,20,fp);             if(strstr(data,argv[2])!=NULL)                 flag=true;         }         //if(flag=true){         if(flag == true){             FILE *ff;             char c[20];             //ff=fopen("temp.txt","a");             ff=fopen("temp.txt","r");             if (!ff) {                 printf("Open file error: %s\n", strerror(errno));                 exit(0);             }             while(fgets(c,20,fp)){                 if(strcmp(c,argv[2])!=0) fputs(c,ff);             }             remove("studentinfo.txt");             rename("temp.txt",argv[3]);             printf("删除成功");             fclose(ff);         }         else             printf("这行数据不存在");         fclose(fp);      }      /*$./student -s 101  studentinfo.txt       选项s完成查询操作，如果学号101不存在，退出程序并给出提示，       如果学号101存在，则把该行数据显示出来*/     if(!strcmp(argv[1],"-s")){         fp = fopen("studentinfo.txt","rb+");         if (!fp) {             printf("Open file error: %s\n", strerror(errno));             exit(0);         }         char data1[20]={0};         while(!feof(fp)){             fgets(data,20,fp);             if(strstr(data,argv[2])!=NULL){                 flag=true;                 memcpy(data1,data,strlen(data)+1);             }         }         //if(flag=true)         if(flag==true)             printf("%s",data1);         //if(flag=false)         if(flag==false)             printf("这行数据不存在");     } } 参考一下吧，问题可以对照找一下； 若以追加的形式打开文件，文件指针指向文件末尾，这样试读不到数据的。 文件指针需要判断返回值的，即文件是否打开成功。 文件指针需要接收fopen的，有一个if中，只有fopen，并没有得到它的返回值。 问题建议一一对比查找一下


Question: 想做个读取文本文件里的内容，数据能导入到excel，有大佬给下思路么。

建议你生成csv文件，可以最简单的用excel打开。。。。

引用 4 楼 qq_30519247 的回复:[quote=引用 3 楼 lye2000000_super 的回复:] 不然的话参考下这个https://zhidao.baidu.com/question/2078273603354779788.html 看不懂.不知道CSpreadSheet.h怎么用、[/quote] 参考这个https://blog.csdn.net/lpf1990823/article/details/17316281

引用 3 楼 lye2000000_super 的回复:不然的话参考下这个https://zhidao.baidu.com/question/2078273603354779788.html 看不懂.不知道CSpreadSheet.h怎么用、


Question: codeblocks中无法编译头文件

有遇到过类似情况 的么

我用gcc命令编译这几个文件是可以的，在codeblocks中就不行，应该是codeblocks的设置不正确。有碰到过类似问题的么

编译时把包含wait_function_test函数的那个文件和main.c一起编译。gcc main.c wait_function.c -g -o main

先试下头文件包含时使用绝对路径是否可以

没有找到函数

用不同的编译器编译？gcc和g++ 编译时可以指定头文件


Question: if..else if..if为啥我输入5不执行y=100+x

a=0 改成a==0

只要输入大于0的数，直接执行输出y=x2;不管是不是大于100的

不执行? 那输出的是什么 你想要的结果是什么


Question: 有道题不会，求解

编译一下就行了，23吧

引用 6 楼 Q__ing 的回复:不是特别清楚你的题目，所以按我的理解做了两种题，希望能帮助你。

不是特别清楚你的题目，所以按我的理解做了两种题，希望能帮助你。

还有这种，真心希望对你有用哦

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

代码都有了，复制粘贴编译得到的结果都比问来的快吧

为什么不自己编译运行一下呢？

应该是23，对角线相加


Question: 如何读取txt的我想要的数据？

像这种数据要是自己写进去的，可以写成ini，有专门的的读写函数。方便。（也许还有更好的方法）

引用 4 楼 qq_30519247 的回复:[quote=引用 3 楼 wldrzx 的回复:] fgets按行读的。读第二行。在取“Zmini：”后面的字符串啊 额 取字符串位置的代码该如何写[/quote] 这个肯定搜得到啊。。我记串了 。find（）？ indexof（）？

引用 3 楼 wldrzx 的回复:fgets按行读的。读第二行。在取“Zmini：”后面的字符串啊 额 取字符串位置的代码该如何写

fgets按行读的。读第二行。在取“Zmini：”后面的字符串啊

引用 1 楼 wyyy2088511 的回复:fgets读取第二行，让后再解析字符串 怎么读。。用fseek确定位置么。。不现实啊。。

fgets读取第二行，让后再解析字符串


Question: c语言编译时出现 access violation at ******   write of address

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

此类错误其实包含的错误类型很多 比如，指针越界，空指针


Question: 刚学C 麻烦大神帮我看下程序没错误 为什么不能输出结果 要哭了

求三个数最大值有两种方法，更具方法不同则函数参数对象不同。 求a.b.c中的最大值可以写成max(max(a,b),c)或者是max(a,b,c)。 两种都可以，只是两种的max函数的参数是不一样的。一个max函数的参数只有两个，第二个max函数的参数是3个。前一个是先将函数max（a，b）运算完后，在将得到的返回值作为一个参数放入max这个函数中，后一个是直接将三个参数放入函数进行运算。 你这个是第二种形式，套用max函数，但是你自己设置的参数不对，所以运行失败。 #include <stdio.h>   main() { int i,j,max,min,a[3],t; printf("请输入a,b,c的值:"); for (i=0;i<3;i++) {scanf("%d",&a[i]); }for(i=0;i<2;i++) for(j=0;j<2-i;j++) if(a[j]<a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; }printf("最大值为%d\n",a[0]); printf("最小值为%d\n",a[2]);}    /*=======================*/ #include <stdio.h>  main() { int i,j,max,min,t,a,b,c;printf("请输入a,b,c的值:");scanf("%d%d%d",&a,&b,&c); max=min=a; if(b>max)max=b;   else if(b<min)min=b; if(c>max)max=c;   else if(c<min)min=c; printf("最大值为%d\n",max); printf("最小值为%d\n",min);} 以上是两种方式的运行代码

【// 要在a，b，c中找出最大数，只有a，b，c三个值 哪个最大就取哪个的值 int max(int x, int y, int z);    //对被调用函数进行声明】 ↑↑↑这个有点讲究的。 求a.b.c中的最大值可以写成max(max(a,b),c)或者是max(a,b,c)。 两种都可以，只是两种的max函数的参数是不一样的。一个max函数的参数只有两个，第二个max函数的参数是3个。前一个是先将函数max（a，b）运算完后，在将得到的返回值作为一个参数放入max这个函数中，后一个是直接将三个参数放入函数进行运算。 你这个是第二种形式，套用max函数，但是你自己设置的参数不对，所以运行失败。 #include <stdio.h>   main() { int i,j,max,min,a[3],t; printf("请输入a,b,c的值:"); for (i=0;i<3;i++) {scanf("%d",&a[i]); }for(i=0;i<2;i++) for(j=0;j<2-i;j++) if(a[j]<a[j+1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t; }printf("最大值为%d\n",a[0]); printf("最小值为%d\n",a[2]);}   /*=======================*/ #include <stdio.h>  main() { int i,j,max,min,t,a,b,c;printf("请输入a,b,c的值:");scanf("%d%d%d",&a,&b,&c); max=min=a; if(b>max)max=b;   else if(b<min)min=b; if(c>max)max=c;   else if(c<min)min=c; printf("最大值为%d\n",max); printf("最小值为%d\n",min);}  这是两种不同形式，你可以参考一下，麻烦给个赞

if (x > y > z);   /* 若x大于y大于z成立，则将x的值赋给q*/  q = x;  写成   if(x>y&&x>z)      q=x;  剩下两个也这样改， 你的写法得到FALSE, 没法给 q 赋值。

函数声名写在主函数外面， x＞y＞z 不能这样写，改成x ＞ y && y＞z

等待你输入，输入后数据比较后才会输出

# include<stdio.h>  int max(int x, int y, int z);    //对被调用函数进行声明 int main() {      int a = 2,b = 3,c = 6,d;      scanf("%d,%d,%d",&a, &b, &c);      printf("a = %d, b = %d, c = %d\n", a, b, c);     d = max(a,b,c);      printf("max =%d\n",d);      return 0; } int max(int x, int y, int z) {      if (x > y) {         if (x > z)             return x;         else             return z;     } else {         if (y > z)             return y;         else             return z;     }     if (x > z) {         if (x > y)             return x;         else             return y;     } else {         if (z > y)             return z;         else             return y;     }      if (y > z) {         if (y > x)             return y;         else             return x;     } else {         if (z > x)             return z;         else             return x;     }  /*     int q;       //max函数中的声明部分，定义本函数中用到的变量q为整形     if (x > y > z);   // 若x大于y大于z成立，则将x的值赋给q     q = x;     if (y > x > z);   //若y大于x大于z成立，则将y的值赋给q     q = y;     if (z > x > y);  //若z大于x大于y成立，则将z的值赋给q     q = z;     return(q);   //将q的值作为max函数值 返还到调用max函数的位置 */ }   另个问题: 问题1：判断表达式x > y > z是不对的，判断的语法不是这样的，详见上面的代码； 问题2：scanf是格式化输入，输入时注意加上逗号。发现逗号有中文字符，因此要么改成英文，要么输入时输入中文逗号。在scanf之后加一句打印输出，保证输入的内容和接收到一致。


Question: curl库中libcurl.so找不到

引用 6 楼 HelegeHeHeha 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 HelegeHeHeha 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 那么你自己的代码也是arm-xxx-gcc编译的吗？ 这个库若是arm-xxx-gcc编译的，那么这个库只能用于arm-xxx-gcc编译的代码  是的，都是用arm-xxx-gcc编译的，还有一个问题就是，一开始它显示#include<curl/curl.h>这个找不到，不知道为啥[/quote] 应该是路径的问题，你看一下你的编译选项里有没有指定头文件的路径[/quote]    makefile里面都写了的，[/quote] 路径对不对？就是makefile和头文件的相对路径

引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 HelegeHeHeha 的回复:] [quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 4 楼 HelegeHeHeha 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 那么你自己的代码也是arm-xxx-gcc编译的吗？ 这个库若是arm-xxx-gcc编译的，那么这个库只能用于arm-xxx-gcc编译的代码  是的，都是用arm-xxx-gcc编译的，还有一个问题就是，一开始它显示#include<curl/curl.h>这个找不到，不知道为啥[/quote] 应该是路径的问题，你看一下你的编译选项里有没有指定头文件的路径[/quote]    makefile里面都写了的，[/quote] 路径对不对？就是makefile和头文件的相对路径[/quote]  我找到错了，我好像把makefile文件写成文本格式了

引用 5 楼 cfjtaishan 的回复:[quote=引用 4 楼 HelegeHeHeha 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 那么你自己的代码也是arm-xxx-gcc编译的吗？ 这个库若是arm-xxx-gcc编译的，那么这个库只能用于arm-xxx-gcc编译的代码  是的，都是用arm-xxx-gcc编译的，还有一个问题就是，一开始它显示#include<curl/curl.h>这个找不到，不知道为啥[/quote] 应该是路径的问题，你看一下你的编译选项里有没有指定头文件的路径[/quote]    makefile里面都写了的，

引用 4 楼 HelegeHeHeha 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] 那么你自己的代码也是arm-xxx-gcc编译的吗？ 这个库若是arm-xxx-gcc编译的，那么这个库只能用于arm-xxx-gcc编译的代码  是的，都是用arm-xxx-gcc编译的，还有一个问题就是，一开始它显示#include<curl/curl.h>这个找不到，不知道为啥[/quote] 应该是路径的问题，你看一下你的编译选项里有没有指定头文件的路径

引用 3 楼 cfjtaishan 的回复:那么你自己的代码也是arm-xxx-gcc编译的吗？ 这个库若是arm-xxx-gcc编译的，那么这个库只能用于arm-xxx-gcc编译的代码  是的，都是用arm-xxx-gcc编译的，还有一个问题就是，一开始它显示#include<curl/curl.h>这个找不到，不知道为啥

引用 1 楼 cfjtaishan 的回复:注意下这个lib.curl.so的是通过gcc编译的还是arm-xxxx-gcc编译的？ 是通过我的arm-xxx-gcc编译的，他那里面好像有个链接


Question: C语言 数字华容道

百度搜相关关键字。


Question: c语言，哪位大神帮帮忙

实践出真理，不知道要自己敲一遍，自己去运行一下  答案为58  1+2+23+32=58

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

58，这是在外面面试呢

建议自己在电脑上运行一下。  从第二层循环体可以知道，s加的都是证书，因为负数直接continue；另外，遇到0，那么这一行后面的（0后面的）正数都不会加到s中。因此结果是: 1 + 2 + (第二行以0开头，因此直接跳过）23+32 = 58

这个问题是for语句与二维数组的结合，首先你需要了解二维数组与for语句的应用，同时，该题中包含continue与break语句，所以也要了解它们的用法 题中有两个for语句里面那条控制二维数组每一行，行内的运算，而外面的for语句是行运算结果的相加，首先执行里面的for语句得到结果{3，0，23，32}其中运算时碰到小于1的不相加，继续下一个值的计算，当计算遇到0时跳出当前循环执行下一个循环。第二次循环的结果是0 接着执行外部的循环也就是3+0+23+32，所以得到结果58 个人见解，还望接纳


Question: Matlab调用c++闪退问题

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


Question: 顺序表和单链表执行出来结果 完全相反 求教为什么n。。

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

#include <stdio.h> #include <stdlib.h> #include <string.h>  #define OK 1 #define ERROR  0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 50  typedef int Status; // 函数的类型 其值是函数结果状态代码，如OK等 typedef char ElemType; // 数据元素类型 根据实际情况而定 这里假设为int  struct LNode /* 结点定义 */ {     ElemType data;     struct LNode *next; }; typedef struct LNode *LinkList; /* 表的头指针类型 */   Status ListEmpty(LinkList L) // 判断是否为空表 {     if(L->next)         return TRUE;     else         return FALSE; };  Status ListLength(LinkList L) // 求表的长度 {     int count = 0;     LinkList p = L;     while(p)     {         p = p->next;         count++;     }      return count; };   Status GetElem(LinkList L, int i, ElemType *e) // 取表中一个元素 {     int j = 1; // j 为计数器     LinkList p = L;     while(p && j < i) // 顺指针向后查找，直到p指向第i个元素或者p为空     {         p = p->next;         j++;     }     if(! p||j > i) // 第i个元素不存在         return ERROR;     *e = p->data; // 取第i个元素     return OK; };  Status equal(ElemType e1, ElemType e2) // 满足关系equal的数据元素的位序 {     if(e1 == e2)         return TRUE;     else         return FALSE; };  Status LocateElem (LinkList L, ElemType e,Status (*equal)(ElemType, ElemType)) // 判断表L中符合位序的元素 {     LinkList p = L;     int i = 1;     while(p)     {         if(equal(p->data, e))             return 1;         i++;         p = p->next;     }     return 0; };  void ListInsert(LinkList L, int i, ElemType e) // 插入一个元素 {     int j = 1;     LinkList p, q;     p = L;     while(p&&j < i-1) // 寻找第i-1个结点     {         p = p->next;         ++j;     }     q = (LinkList )malloc(sizeof(struct LNode)); // 生成新结点     q->data = e; // 插入L中     p->next = q;     q->next = NULL; };  void Union(LinkList *La, LinkList Lb) // 共用体 { // 将所有在表Lb中但不在La中的数据元素插入到La中 //     ElemType e;     int La_len, Lb_len;     int i;     La_len = ListLength(*La); // 求La的长度 //     Lb_len = ListLength(Lb);     printf("la = %d, lb = %d\n", La_len, Lb_len);     for(i=1; i<=Lb_len; i++)     {         GetElem(Lb, i, &e); // 取Lb中的第i个元素赋给e //         if(!LocateElem(*La, e, equal)) // La中不存在和e相同的元素 则插入 //             ListInsert(*La, ++La_len, e); // 插入元素 //     } };  LinkList creat() {     int i = 0;   //note initize     LinkList p, q, head = NULL;     p = q = head = (LinkList)malloc(sizeof(struct LNode));     printf("Please input the L:\n");     scanf("%c",&p->data);     while(p->data != '\n')     {         i = i + 1;         if(i == 1)             head = p;         else             q->next = p;         q = p;         p = (LinkList)malloc(sizeof(struct LNode));         scanf("%c",&p->data);     }     q->next = NULL;     return (head); }   void print(LinkList head) {     LinkList p = head;     while(p)     {         //printf("%s", p->data);         printf("%c", p->data);         p = p->next;     }     putchar(10); }  int main() {     LinkList Lahead, Lbhead, p;      Lahead = creat();     Lbhead = creat();     print(Lahead);     print(Lbhead);      Union(&Lahead, Lbhead);      for(p = Lahead; p->next!=NULL; p = p->next)         printf("%c" ,p->data);     printf("%c\n",p->data); } 参考一下吧  对比一下找一下自己的问题。

#include <stdio.h> #include <stdlib.h> #include <string.h>  #define OK 1 #define ERROR  0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 50  typedef int Status; // 函数的类型 其值是函数结果状态代码，如OK等 typedef char ElemType; // 数据元素类型 根据实际情况而定 这里假设为int  typedef struct {     ElemType data[MAXSIZE];     int length; }SqList;  Status ListEmpty(SqList L) // 判断是否为空表 {     if(L.length == 0)         return TRUE;     else         return FALSE; }  Status ListLength(SqList L) // 求表的长度 {     int len;     len = strlen(L.data);     L.length = len;      return len; }   Status GetElem(SqList L, int i, ElemType *e) // 取表中一个元素 {     *e = L.data[i-1];      return OK; }  Status equal(ElemType e1, ElemType e2) // 满足关系equal的数据元素的位序 {     if(e1 == e2)         return TRUE;      return FALSE; }  Status LocateElem (SqList L, ElemType e,Status (*compare)(ElemType, ElemType)) // 判断表L中符合位序的元素 {     int j;     int flag;     for(j=0; j<L.length; j++)   //既然j是从0开始，那么下面是不是将j-1改成j呢，否则会越界。     {         if((flag = compare(L.data[j], e)) != FALSE)    //这儿的compare为什么没用，还有需要加一个括号在这。             return TRUE;     }     return FALSE; }  void ListInsert(SqList *L, int i, ElemType e) // 插入一个元素 {     L->length = i;     L->data[i-1] = e;     L->data[i] = '\0'; }  void Union(SqList *La, SqList Lb) // 共用体 { // 将所有在表Lb中但不在La中的数据元素插入到La中 //     ElemType e;     int La_len, Lb_len;     int i;     La_len = ListLength(*La); // 求La的长度 //     Lb_len = ListLength(Lb);     La->length = La_len;     Lb.length = Lb_len;      for(i=1; i<=Lb_len; i++)     {         GetElem(Lb, i, &e); // 取Lb中的第i个元素赋给e //         if(!LocateElem(*La, e, equal)) // La中不存在和e相同的元素 则插入 //             ListInsert(La, ++La_len, e); // 插入元素 //     } };  int main() // 主函数 {     SqList La, Lb;     printf("Please input the La:\n");     gets(La.data);     printf("Please input the Lb:\n");     gets(Lb.data);      //ListEmpty(La);     //ListEmpty(Lb);     Union(&La,Lb);      printf("The final L is La:\n");     printf("%s\n",La.data);     return 0; } 参考一下吧

说错了  是在 “  LocateElem  ”函数

把链表的 j=0 改为了 j=1 之后就和顺序表一样了    现在链表也是 输出12341了   但是那个1是怎么来的呢？ 怎么能把那个1弄掉了  是开始读入数据错了吗？


Question: 程序执行到delay函数时程序运行出错，感觉一直在delay（）函数中不返回。将delay（）中的work（）去掉后程序运行正常

int get(){ while (RI != 1); RI = 0; return SBUF; } work()也没啥问题，建议查一下get()函数，这儿有一个死循环。注意while之后的;。

对了对了，，，没注意到这一句，谢谢

问题是不是出在get函数的这句：  while (RI != 1);  RI不为1时一直在死循环，什么情况下RI会为1？

求解答，，自己想不通


Question: 怎样从JSON中获取数组键值


Question: 大一c语言作业求教

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

引用 5 楼 qq_38310070的回复:最后str2的休止符没有添加到str1 高手

应该是main

单词拼写问题。同事注意str1的内存，若两个字符串输入的输入的字符总和小于10个，不会出现问题，否则就会有问题。 还有一个重要问题，str1末尾没有加'\0‘，需要在第二个while外，并且是while循环后加一条语句str1[i] = 0;   //0 == '\0'; 否则即使在输入总和不超过10个字符，那也会出现乱码或者段错误，因为输出可能是越界。

mian可以改成main

只是不用strcat是吧，其他函数可以用不？  	char str1[64] = { 0 }; 	char str2[64] = { 0 }; 	printf("请输入两个字符串："); 	gets(str1); 	gets(str2); 	int len1 = strlen(str1); 	int len2 = strlen(str2); 	memcpy(str1 + len1, str2, len2);

mian改成main  str1空间可能不够，此时会越界崩溃

最后str2的休止符没有添加到str1

引用 1 楼 user-10的回复:思路没有问题，在定义str1时因为要保存两个字符串连接后形成的新字符串，你字符数组空间可能不够。 有道理，这个问题确实要考虑进去

引用 2 楼 focuslight的回复:你把main 写成 mian了。 char str1[10]={0}, str2[10]={0}; 初始化一下 哦哦哦，献丑了


Question: 控制台随机陷入死循环

仅供参考：#include <stdio.h> #include <time.h> #include <stdlib.h> #define MAXX 10 #define MAXY 10 void main() {     char MAP[MAXX][MAXY];     char str;     int x,y,z,f,n;      for (x=0;x<MAXX;x++) {         for (y=0;y<MAXY;y++) {             MAP[x][y]='.';         }     }      for (x=0;x<MAXX;x++) {         printf("\n");         for (y=0;y<MAXY;y++) {             printf("%c",MAP[x][y]);         }     }     printf("\n");      srand((unsigned) time(NULL)); RETRY:     x=0;y=0;str='A';MAP[x][y]=str;      for (str='B';str<='Z';str++) {         n=0;         f=1;         while (1) {             n++;             z=rand()%4;             switch (z) {                 case 0: if (y+1<MAXY && MAP[x  ][y+1]=='.') {y++;MAP[x][y]=str;f=0;} break;                 case 1: if (x+1<MAXX && MAP[x+1][y  ]=='.') {x++;MAP[x][y]=str;f=0;} break;                 case 2: if (y-1>0    && MAP[x  ][y-1]=='.') {y--;MAP[x][y]=str;f=0;} break;                 case 3: if (x-1>0    && MAP[x-1][y  ]=='.') {x--;MAP[x][y]=str;f=0;} break;             }             if (f==0) break;             if (n>200) {//钻入死胡同                 for (x=0;x<MAXX;x++) {                     for (y=0;y<MAXY;y++) {                         MAP[x][y]='.';                     }                 }                 goto RETRY;             }         }//while         if (x==MAXX-1 || y==MAXY-1) break;     }//for      for (x=0;x<MAXX;x++) {         printf("\n");         for (y=0;y<MAXY;y++) {             printf("%c",MAP[x][y]);         }     }     printf("\n"); }

else     k--; 然后for接着又k++，死循环了。


Question: Clang-Tidy use of a signed integer operand with a binary bitwise operator

敢于用clang的猿，都具有做律师的资质，赞一个。

size改成 unsigned p->size >> 1u 这样可以

Clang-Tidy 静态检查比较严谨，位操作必须使用无符号数，包括常量。 在 pl->size >> 1 当中，光 pl->size 是 unsigned 还不够， 1 必须也是。 所以，改成 pl->size >> 1u ，就不会有警告提示了。

引用 4 楼 SinY_Chan 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 SinY_Chan 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 这个警告是是对有符号数做按位操作。size应该是有符号变量，若将size编程无符号变量试一下。有符号整型编程无符号整型。  刚试过了，改成unsigned也还是会有这个警告诶。。而且我通常不用unsigned，用这个的话计算可能会有问题。。 难道C里面有符号数位移会有问题？[/quote] 那建议不使用移位操作，而采用除法，即p->size/2 + 1;[/quote]  嗯呢我现在改成这种写法了，因为我觉得用位移操作会更快嘛。。所以就这么写了，但是自我感觉没啥问题却给我了警告，就有所疑问。。还是多谢你[/quote] 也可以先强制类型转换一下再移位。 (unsigned int)(p->size) >> 1

仅供参考：#include <stdio.h> unsigned short int ui;   signed short int si; int main() { 	ui=(unsigned short int)0x8000u; 	si=(  signed short int)0x8000; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si); 	ui=ui>>1; 	si=si>>1; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si);  	printf("--------------\n"); 	ui=(unsigned short int)0x8000u; 	si=(  signed short int)0x8000; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si); 	ui=((  signed short	int)ui)>>1; 	si=((unsigned short	int)si)>>1; 	printf("ui=%u\n",ui); 	printf("si=%d\n",si);  	return 0; } //ui=32768 //si=-32768 //ui=16384 //si=-16384 //-------------- //ui=32768 //si=-32768 //ui=49152 //si=16384

引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 SinY_Chan 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 这个警告是是对有符号数做按位操作。size应该是有符号变量，若将size编程无符号变量试一下。有符号整型编程无符号整型。  刚试过了，改成unsigned也还是会有这个警告诶。。而且我通常不用unsigned，用这个的话计算可能会有问题。。 难道C里面有符号数位移会有问题？[/quote] 那建议不使用移位操作，而采用除法，即p->size/2 + 1;[/quote]  嗯呢我现在改成这种写法了，因为我觉得用位移操作会更快嘛。。所以就这么写了，但是自我感觉没啥问题却给我了警告，就有所疑问。。还是多谢你

引用 2 楼 SinY_Chan 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 这个警告是是对有符号数做按位操作。size应该是有符号变量，若将size编程无符号变量试一下。有符号整型编程无符号整型。  刚试过了，改成unsigned也还是会有这个警告诶。。而且我通常不用unsigned，用这个的话计算可能会有问题。。 难道C里面有符号数位移会有问题？[/quote] 那建议不使用移位操作，而采用除法，即p->size/2 + 1;

引用 1 楼 cfjtaishan 的回复:这个警告是是对有符号数做按位操作。size应该是有符号变量，若将size编程无符号变量试一下。有符号整型编程无符号整型。  刚试过了，改成unsigned也还是会有这个警告诶。。而且我通常不用unsigned，用这个的话计算可能会有问题。。 难道C里面有符号数位移会有问题？


Question: 同步操作的问题，是选线程还是进程

不知你是怎么搞的，我一般都是用select模型，用select进行判断，如果有数据进入处理，没有就等几秒跳过重新等。

按理说你一个接受数据线程阻塞了，如果并没有数据发过来，那么是很正常的

引用 4 楼 tb01024632 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 线程和进程都能实现。主要是这两个业务需要那些数据同步，这两个业务的关联在哪   主要是现在只有1个业务在运行，就是想找到问题在哪儿[/quote] 你的socket对端有没有发数据过来呢？

引用 1 楼 cfjtaishan 的回复:线程和进程都能实现。主要是这两个业务需要那些数据同步，这两个业务的关联在哪   主要是现在只有1个业务在运行，就是想找到问题在哪儿

引用 2 楼 phenix2009 的回复:跟线程进程无关，阻塞是你程序里面写的不合理造成的 INT32 i32Ret;     pthread_t tPid;     i32Ret = pthread_create(&tPid, NULL, (void *)socket_Waiting(), NULL);     if (0 != i32Ret)     {         M2M_RTE_LOG(M2M_LOG_ERROR,"create pthread error!\n");     }       i32Ret = pthread_detach(tPid);          while(TRUE)     {         printf("doing somthing!\n");         sleep(10);     }   socket_wait()是用来收发数据的，也有一个while(true)的循环，一直在收发数据，这样会阻塞在首发数据，请问该怎么办，感谢

跟线程进程无关，阻塞是你程序里面写的不合理造成的

线程和进程都能实现。主要是这两个业务需要那些数据同步，这两个业务的关联在哪


Question: 求助 汉字对比，把以能实现的doc窗口下的代码转为mfc，识别不了汉字

我做的是一个写字平台我自己编好了一些汉字的运行轨迹，我要实现的是我输入汉字程序调剂识别打印相应的汉字，每次可以打印1-n个汉字，我之前编写了偏移函数，首先第一步我需要判断输入的汉字是不是我编好运动轨迹的汉字，之前我用c语言利用#include <locale>     wchar_t x[20];setlocale(LC_ALL, "");这个头文件之后直接可以把汉字当做条件利用一个for语句便利数组 wscanf(L"%ls", x);就可以判断是否是已有运动轨迹的汉字，之后也可以直接用汉字当为判断进行书写，但是利用mfc得到的汉字输入直接是字符串我就不会处理了

我上面写的代码有问题吗，不就一字符数组，你随便弄呗

我随便写了一下，你看看是不是这个意思：  	TCHAR    szValue[32] = { '\0' }; 	GetDlgItem(IDC_EDIT1)->GetWindowText(szValue, 32);  	TCHAR   szFormat[32] = _T("大人"); 	 	if (_tcscmp(szValue, szFormat) == 0) 	{ 		MessageBox(_T("相同")); 	}

不用这种方式也可以只要能把编辑框里面的汉字识别对比能进行条件判断就好


Question: C语言的求两个集合的合并运算—新手求dalao解答疑问

请问一下，我现在把length的长度表现出来，发现长度有问题，结果也只是第一个集合的元素，请问该怎么改

仅供参考：#include <algorithm> #include <iostream> #include <functional> #include <cstring> using namespace std; int main() {     char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;     char *Vowels   = "aeiou" ;     char *AlphaNum = "0123456789abcdef" ;     char result[45] ;     char *last ;      int lenA  = strlen(Alphabet) ;     int lenV  = strlen(Vowels  ) ;     int lenAN = strlen(AlphaNum) ;      cout << "Alphabet = " << Alphabet << endl ;     cout << "Vowels   = " << Vowels   << endl ;     cout << "AlphaNum = " << AlphaNum << endl ;      cout << "\nusing non-predicate versions" << endl ;      //non-predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //non-predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      cout << "\nusing predicate versions" << endl ;      //predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result  , less<char>()) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result  , less<char>()) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result  , less<char>()) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result  , less<char>()) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      return 0 ; }

好好检查下你程序的各个子函数的功能，先确定下有没有逻辑错误，再检查其他的错误，编好程序后，少输入一些数据，单步测试一下。

错误太多了， 比如说 i = 0; ch=0; while (ch!= '\n') { scanf("%d", &La.data[i]); ch=getchar(); } 你的i一直是0 ,所以一直输入的是La的第一个元素，还有输入后La的length信息没有赋值，所以La的长度信息不对，Lb同La，以后union计算肯定出错

引用 13 楼 dark9527 的回复:你的链表没有初始化void init_list(SqList* l) {  	memset(l->data,0,MAXSIZE); 	l->length=0; } 我初始化后没乱码， 但是没有结果

好吧，谢谢了......

引用 9 楼 Reimu__Hakurei的回复:看得见，我是初始化了的，for (i = 0; i < La.length; i++)， 在上课，不好改代码。

int main(void) { SqList La,Lb; int i; char ch; printf("请输入集合1的元素:"); i = 0; ch=0; while (ch!= '\n') { scanf("%d", &La.data[i]); ch=getchar(); } printf("请输入集合2的元素:");  i = 0; ch=0; while (ch!= '\n') { scanf("%d", &Lb.data[i]); ch=getchar(); } Union(&La,Lb); printf("集合合并后的所有元素:");  for (i = 0; i < La.Listlength(); i++) { printf("%d ", La.data[i]); } return 0; }   void Union(SqList *La,SqList Lb) { /* 将所有在表Lb中但不在La中的数据元素插入到La中 */    ElemType e;    int La_len,Lb_len;    int i;    La_len = ListLength(*La); /* 求表La的长度 */    Lb_len = ListLength(Lb);    for(i = 0; i <= Lb_len; i++)    {      GetElem(Lb, i, &e); /* 取Lb中第i个数据元素赋给e */      if(LocateElem(*La, e)!=1)/* La中不存在和e相同的元素,则插入之 */      {         ListInsert(La, ++La_len, e);      }     } }

for (i = 0; i < La.Listlength(); i++) { printf("%d ", La.data[i]); } 还有合并哪里  i初始化为0

for (i = 0; i < La.Listlength; i++) { printf("%d ", La.data[i]); }

兄弟，你看的到上面的吗?不知道为什么回复只有一点点内容显示

改后变成这样，还是有问题..... =

SqList La,Lb; memset(La.data,0,sizeof(int)*50); memset(Lb.data,0,sizeof(int)*50); 感觉就是没初始化

还有，那个请问可以把改的东西发一下吗

忘传运行结果了

你好！可以看下data数组有没有全部初始化为0。


Question: 用xcode写了一个小程序出现了问题

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

声明的是getRadius，实现的是getRaius

thanks 我没有仔细看

声明和定义的函数名不一样！！！

注意函数名的单词拼写。将每个函数名的声明与定义一个字母一个字母比较一下，然后就会发现问题在哪了。

提示的已经很明显了，_getRadius连接不到，你声明的函数是getRadius，实现的是getRaius，仔细比较一下


Question: linux c中printf输出格式问题

引用 2 楼 jianwufeng26 的回复:[quote=引用 1 楼 shihengzhen101 的回复:] "%s %s\r\n" + 3 其实就变成了 "%s\r\n"  也就是原来的字符串向后移动三个字节 const char *s3 = ("hello world\r\n" +3);向后移动3个字节，是输出lo world这个我理解； "%s %s\r\n" + 3 其实就变成了 "%s\r\n" ？？？ 你这里说的向后移动三个字节也不能变成输出 hello吧？[/quote] 只接受一个参数就是输出hello

引用 3 楼 user-2 的回复:+3 就是像后移动3个字符  "%s %s\r\n" 移动后变成了："%s\r\n"  此时只需要1个字符串了，而且取的是第一个   嗯嗯，看明白了，理解了。多谢！！！

"hello world\r\n" +3 也是向后移动3个字符  也就是"lo world\r\n" +3

引用 1 楼 shihengzhen101 的回复:"%s %s\r\n" + 3 其实就变成了 "%s\r\n"  也就是原来的字符串向后移动三个字节 const char *s3 = ("hello world\r\n" +3);向后移动3个字节，是输出lo world这个我理解； "%s %s\r\n" + 3 其实就变成了 "%s\r\n" ？？？ 你这里说的向后移动三个字节也不能变成输出 hello吧？


Question: 如果取一个有符号16位数的低12位？

我表达错了，一会修改

short int x = -0x3123, y =  (short)(x << 4) >> 4;

如果是取十进制数最后三位，那么模1000就行了： 	short temp = -3123; 	short temp2 = temp % 1000;

我觉得你表述有问题，如果你想取低12位，那么是我之前发的那个写法，但得不到-123； 如果你的意思是取一个十进制数的第三位，则是另外一回事，不是所谓取低12位，请认清概念。

short temp = -3123; 	short temp2 = temp & 0xfff; 不过，怎么得到-123呢，不懂


Question: Linux下c编程

#!/bin/bash iNum1=$1 shift iNum2=$2 if [ $Num1 -lt $Num2 ] then      echo "The big one is " $iNum2 else if [$Num1 -gt $Num2] then     echo "The big one is " $iNum1 else     echo "The two number is equal" fi fi

《Linux C编程一站式学习》

《高级Bash脚本编程指南--中文版》

引用 7 楼 Jingjingjng0504 的回复:谢谢大家，已经给搞定了，确实是我输入不正确那么shell编程该怎么弄呀？ 就各种命令呗，常用的不过就是移动路径，注册权限，运行，难道还需要在shell里面搞啥？ 我接触有限，只是做了linux下的程序之后拷贝到设备运行罢了，不知你说的shell编程什么意思。

谢谢大家，已经给搞定了，确实是我输入不正确那么shell编程该怎么弄呀？

scanf输入是格式化输入，代码中输入数据中间需要有一个逗号，但是你的输入没有加逗号。所以会出现问题。

引用 3 楼 phenix2009 的回复:程序跑起来没什么问题，你输入两个数时候，是根据格式输入的吗，比如输入4和5格式为：4,5。是的哦 ，怪我自己粗心了，还一直没有看出来哈哈哈哈，谢谢了~

引用 1 楼 Jingjingjng0504 的回复:这就是出现问题的截图，希望大家帮我看看该怎么弄 你没按照格式输入，所以两个数没能正确的获取到，应该输入：2,6

怎么没输入逗号呢

这就是出现问题的截图，希望大家帮我看看该怎么弄


Question: 涂色问题，怎么做？

引用 4 楼 hdt 的回复:其实，就算离散学的不好，这种问题百度一下，就应该知道了https://baike.baidu.com/item/%E5%9B%BE%E7%9D%80%E8%89%B2%E9%97%AE%E9%A2%98/8928655?fr=aladdin 就你学的好，看了你给别人的评论，都是贬低别人的话，就以为自己很牛 让你说，你又说不出所以然，rubbish。

引用 4 楼 hdt 的回复:其实，就算离散学的不好，这种问题百度一下，就应该知道了https://baike.baidu.com/item/%E5%9B%BE%E7%9D%80%E8%89%B2%E9%97%AE%E9%A2%98/8928655?fr=aladdin 我知道这个 但是请你给我说说 这两个的联系  说的具体点 别这么含糊 我笨

引用 2 楼 zhagoodwell 的回复:[quote=引用 1 楼 真相重于对错的回复:]离散数学，了解图论 ？？？了解离散数学的哪里？ 图论～二分图，最短路径，出度入度？回路？环？……哪块的内容？说一下[/quote] 看书要仔细，离散里的图论专门有讲，着色问题

引用 1 楼 真相重于对错的回复:离散数学，了解图论 ？？？了解离散数学的哪里？ 图论～二分图，最短路径，出度入度？回路？环？……哪块的内容？说一下

离散数学，了解图论


Question: 关于C语言

引用 1 楼 weixin_42145190的回复:你这。。是数学问题吧。num=960不是表示960夸脱水吗，960×960才表示克啊 950，手滑，不好意思

1夸脱水约有950克，num克水有num * rate1克  一个水分子有rate2克，所有水分子有num * rate1克  所以水分子数= num * rate1 / rate2  如果还理解不了，建议看下小数数学


Question: printf中的\n与\r

你说的是早期的电传打字机了，现在不同系统对换行要求并不相同了，UINX只需要\n，MAC只需要\r，WIN下需要\r\n，但控制台只需要\n就行了

好像 在windows下一个enter 把两个人的活都干了

引用 1 楼 user-2 的回复:好像 在windows下一个enter 把两个人的活都干了  按下enter同时录入\n和\r我可以理解，但是手动输入'\n'出来的却是\n+\r的效果，这个就有点诡异了……


Question: 本人菜鸟遇到一个c语言题目，求大神解答

建议自己先编译运行一下，然后再找原因。 建议自己多动手，编程就是要动手操作的。 很明显选D，原因是指针在向后移动，%s输出是遇到'\0'结束。

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

---我刚刚测试了改为%c\n 发现是这样。。。  对不起 。。。不过这题目意思是选D

抱歉:是 printf("%c\n",pcPtr);

如果输出语句是\n而不是/n 选D 如果改为 printf("%c"\n,pcPtr);  这样就是 A B C D E 了

引用 4 楼 Q__ing 的回复:printf("%s/n", pcPtr);这条语句错了哦，应该是printf("%s\n", pcPtr); 答案是选D 对于过程我是这样子理解的 首先要知道for语句是for（循环初始化；循环条件；执行循环体一次后的某些处理） 题中应该是定义一个字符型数组  char   acArr[]= "ABCDE";    pcPtr = acArr令pcPtr（指向数组的第一个地址）;pcPtr < acArr + 5（用来限制行数，个人认为在这题中可以认为是语句循环次数）; pcPtr++（表示循环执行一次后指针往后以一位，就是从第一位移到第二位，，一直有效直到循环结束）)         printf("%s/n", pcPtr);表示输出数组，而输出的数组是从指针指向开始输出到最后 然后结束循环 答案图片发不出去，为以下格式 ABCDE BCDE CDE DE E你可以在软件中输入一遍，然后稍微改一下限制条件，有助于理解题目，对学习也更有帮助哦     然后定义指针   *pcPtr;

printf("%s/n", pcPtr);这条语句错了哦，应该是printf("%s\n", pcPtr); 答案是选D 对于过程我是这样子理解的 首先要知道for语句是for（循环初始化；循环条件；执行循环体一次后的某些处理） 题中应该是定义一个字符型数组  char   acArr[]= "ABCDE";     然后定义指针   *pcPtr;    pcPtr = acArr令pcPtr（指向数组的第一个地址）;pcPtr < acArr + 5（用来限制行数，个人认为在这题中可以认为是语句循环次数）; pcPtr++（表示循环执行一次后指针往后以一位，就是从第一位移到第二位，，一直有效直到循环结束）)         printf("%s/n", pcPtr);表示输出数组，而输出的数组是从指针指向开始输出到最后 然后结束循环 答案图片发不出去，为以下格式 ABCDE BCDE CDE DE E


Question: makefile编译错误

建议手动去执行mkdir -p xxxx，如果能够成功，建议找一下原因。如果不能成功，应该会给出详细的错误信息。

很明显啊，$(PACKSODIR)为空啊，看这个Makefile的写法，该值可能是要从外面的Makefile（或执行make时）传进来的啊


Question: [C语言]哈夫曼树问题新手求问

说的甚是详细，谢谢各位大佬的辛苦成果

#include <stdio.h> #include <ctype.h> #include <string.h> #include <stdlib.h> #include <malloc.h> #include <windows.h> #define MaxValue 512 #define Maxbit  16  typedef struct { 	char chara; 	int weight; 	int flag; 	int parent; 	int leftchild; 	int rightchild; }haffnode;  typedef struct{ 	int bit[Maxbit]; 	int weight; 	int start; }haffcode;  int my_stdin(void) { 	lb1:fprintf(stderr, "%s", "input num :"); 	char str[1024]; 	fgets(str, 1024, stdin); 		 	int len = strlen(str); 	for(len-1; isspace(str[len-1]) && len >= 0; str[(len--)-1] = '\0') 		; 	 	char *p[1024]; 	int i = 0; 	int j = 0; 	while(str[i]){ 		while(isspace(str[i]) && str[i]) 			++i; 		 		p[j++] = &str[i++]; 		while(isalnum(str[i]) && str[i]) 			++i; 		 		str[i] = '\0'; 		++i; 			 	}  	if(j != 1){ 		fprintf(stderr, "%s\n", "Input error!"); 		fflush(stdin); 		goto lb1; 	} 	 	i = 0; 	int flag = 1; 	while(p[0][i]){ 		if(isdigit(p[0][i])) 			++i; 		else { 			flag = 0; 			break; 		} 			 	} 	 	if(flag == 0){ 		fprintf(stderr, "%s\n", "Input error!"); 		fflush(stdin); 		goto lb1; 	} 	 	int num = atoi(p[0]); 	return num; 	 }    void creat_hafftree(int n, haffnode *hafftree) { 	int i = 0; 	for(; i < 2*n-1; ++i){ 		if(i >= n) 			hafftree[i].weight = 0; 		hafftree[i].flag = 0; 		hafftree[i].parent = -1; 		hafftree[i].leftchild = -1; 		hafftree[i].rightchild = -1; 	} 	 	for(i = 0; i < n-1; ++i){ 		int m1 = MaxValue; 		int m2 = MaxValue; 		int x1 = 0; 		int x2 = 0; 		for(int j = 0; j < n+i; ++j){ 			if(hafftree[j].weight < m1 && hafftree[j].flag == 0){ 				m2 = m1; 				x2 = x1; 				m1 = hafftree[j].weight; 				x1 = j; 			} 			else if(hafftree[j].weight < m2 && hafftree[j].flag == 0){ 				m2 = hafftree[j].weight; 				x2 = j; 			} 		}  		hafftree[x1].parent = n+i; 		hafftree[x2].parent = n+i; 		hafftree[x1].flag = 1; 		hafftree[x2].flag = 1; 		hafftree[n+i].weight = hafftree[x1].weight + hafftree[x2].weight; 		hafftree[n+i].leftchild = x1; 		hafftree[n+i].rightchild = x2; 		 	} 	 	for(i = 0; i < 2*n-1; ++i){ 		printf("%d %2d %2d %2d %2d %2d  \n", i, hafftree[i].weight,\ 		hafftree[i].flag, hafftree[i].parent, hafftree[i].leftchild, hafftree[i].rightchild); 	} 	 	 	return ; }  void haff_code(int n, haffnode *hafftree, haffcode ** code) { 	int i= 0; 	for(; i < n; ++i){ 		code[i] = (haffcode *)malloc(sizeof(haffcode)); 		(haffcode *)memset(code[i], 0x00, sizeof(haffcode)); 		code[i]->weight = hafftree[i].weight; 		code[i]->start = n-1; 		int child = i; 		int parent = hafftree[child].parent; 		 		while(parent != -1){ 			if(hafftree[parent].leftchild == child) 				code[i]->bit[code[i]->start--] = 0; 			else 				code[i]->bit[code[i]->start--] = 1; 			 			child = parent; 			parent = hafftree[child].parent; 		} 		 	} 	 	 	return; }  int main(void) { 	system("cls"); 	fprintf(stderr, "%s\n", "To the number of coding."); 	system("color 04"); 	Sleep(1000); 	system("color 0A"); 	int n; 	n = my_stdin(); 	system("cls"); 	haffnode hafftree[2*n-1]; 	int i = 0; 	for(; i < n; ++i){ 		fprintf(stderr, "%s%d%s", "hafftree[", i, "].chara:"); 		fflush(stdin); 		 		hafftree[i].chara = getchar(); 		 		fprintf(stderr, "%s%d%s\n", "hafftree[", i, "].weight."); 		system("color 04"); 		Sleep(1000); 		system("color 0A"); 		fflush(stdin); 		 		hafftree[i].weight = my_stdin(); 	 	} 	 	creat_hafftree(n, hafftree); 	haffcode *code[n]; 	haff_code(n, hafftree, code); 	 	for(i = 0; i < n; ++i){ 		printf(" chara = %c  weight = %d  ", hafftree[i].chara, code[i]->weight); 		printf("code = "); 		int j; 		for(j = code[i]->start+1; j < n; ++j) 			printf("%d", code[i]->bit[j]); 		printf("\n"); 	} 	 	 	 	return 0; }

引用 5 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 谢谢。 我有详细调试和分析，也找到了问题所在位置，可是不懂为什么会发生这样的问题，也有查询但没有找到结果，所以想问问。

引用 3 楼 user-4 的回复:# include <stdio.h> # define N 1001 void insert(int Tree[],int X);//向堆中插入值 X int Delmin(int Tree[]);  //删除最小值  并返回最小值 int tree[N+1]; long long sum; int main(){     int n,a; 	scanf("%d",&n); 	while(n--) 	{ 		scanf("%d",&a); 		insert(tree,a); 	} 	while(tree[0]>1) 	{ 	   a=Delmin(tree)+Delmin(tree); 	   sum+=a; 	   insert(tree,a); 	} 	printf("%lld\n",sum);     return 0; } void insert(int Tree[],int X) {     int par,i=++Tree[0];       while(i>1)       {        par=(i>>1);         if(Tree[par]<=X) break;          Tree[i]=Tree[par];        i=par;     }     Tree[i]=X; } int Delmin(int Tree[]) {    int i=1,L=2,root=Tree[1],X=Tree[Tree[0]--];    while(L<=Tree[0])    {       L+=L<Tree[0]&&Tree[L+1]<Tree[L];       if(Tree[L]>=X) break;        Tree[i]=Tree[L];       i=L;L=i<<1;    }    Tree[i]=X;    return  root; }  把这个代码交上去 保证又快又对 谢谢，可是我想知道自己的为什么不对呀

# include <stdio.h>  //WEI行 N列的优先队列    # define N 20001   void insert(int Tree[],int X);//向堆中插入值 S[WEI]    int Delmin(int Tree[]);  //删除最小值-并返回最小值   int tree[N+1];   long long sum;         int main(){       int n,a; 	scanf("%d",&n); 	while(n--) 	{ 		scanf("%d",&a); 		insert(tree,a); 	} 	while(tree[0]>1) 	{ 	   a=Delmin(tree)+Delmin(tree); 	   sum+=a; 	   insert(tree,a); 	} 	printf("%lld\n",sum);     return 0;   }   void insert(int Tree[],int X)       {           int par,i=++Tree[0];  //插入X 后 Tree[0]+1           while(i>1)  //直到i不是根节点           {              par=(i>>1);  //父节点为par              if(Tree[par]<=X) break;   //将<=改为>=即改为最大堆了          Tree[i]=Tree[par]; //否则调整堆 即位置上移              i=par;           }           Tree[i]=X;//插入新节点       }       int Delmin(int Tree[])       {          int i=1,L=2,root=Tree[1],X=Tree[Tree[0]--];         while(L<=Tree[0])          {                 L+=L<Tree[0]&&Tree[L+1]<Tree[L];       if(Tree[L]>=X) break;         //并且将>=改为<=即为最大堆         Tree[i]=Tree[L];//否则继续调整堆             i=L;L=i<<1;     }          Tree[i]=X;      return  root;       }   如果单纯求权值 直接用堆  速度快

测试结果如上


Question: c语言用链表写酒店管理系统

百度搜相关关键字。

1.房间一条链，主要信息有房间类型，入住状态等；客人一条链，主要信息有客人ID、类型（要求），积分等 2. 客人信息录入时在客人链上创建节点，如已有节点则不创建 3. 入住时在房间链上寻找满足要求的节点，退房时删除节点，在客人链上上刷新积分 大致如此。


Question: 就很想知道realloc函数会用在什么地方？能否举个实际一点的例子。

realloc不是在内存不足时使用，而是在需要改变之前分配的内存时使用。而且没说一定要变大，也可以变小。换句话说，就是你要调整之前申请的内存大小时使用。

引用 7 楼 狼二羊的回复:[quote=引用 2 楼 paschen 的回复:] 1、比如你第一次分配了N大小的内存，第一次用完后，第二次需要M大小内存，就可以用realloc重新分配  2、没有要求realloc的内存要比malloc时的大，realloc根据不同情况作不同处理  3、如果申请的内存后面还有足够空间，它会进行标记，并仍然返回你原指针，否则会重新寻找足够大小的空间，并复制后释放原指针的空间 有什么具体例子代码看么（看我真挚的小眼神）[/quote] http://en.cppreference.com/w/c/memory/realloc  链接里有用法说明与示例

引用 9 楼 qq_30519247 的回复:[quote=引用 8 楼 cfjtaishan 的回复:] realloc不知道分配的内存不足，这个发现内存不足需要我们来发现和重新分配。realloc函数做不到自动发现内存不足。 程序员需要自己根据需要来定时否需要realloc增加/减少内存空间。 当程序员发现内存不够的时候还要打开源代码改？[/quote] 写代码时就要有逻辑处理可能内存不足的情况，通过realloc扩大或减少内存。 等程序运行在改肯定不行。但要注意的一点，realloc不会告诉并处理内存不足或者内存过多的情况。

引用 8 楼 cfjtaishan 的回复:realloc不知道分配的内存不足，这个发现内存不足需要我们来发现和重新分配。realloc函数做不到自动发现内存不足。 程序员需要自己根据需要来定时否需要realloc增加/减少内存空间。 当程序员发现内存不够的时候还要打开源代码改？

引用 2 楼 paschen 的回复:1、比如你第一次分配了N大小的内存，第一次用完后，第二次需要M大小内存，就可以用realloc重新分配  2、没有要求realloc的内存要比malloc时的大，realloc根据不同情况作不同处理  3、如果申请的内存后面还有足够空间，它会进行标记，并仍然返回你原指针，否则会重新寻找足够大小的空间，并复制后释放原指针的空间 有什么具体例子代码看么（看我真挚的小眼神）

引用 1 楼 user-6 的回复:记得  《数据结构》严蔚敏  那本书开始部分讲栈的时候 先malloc了100个int的内存，当栈Push的时候检测是否要用完，如果用完，就在原来的基础上 多加10个int的栈空间 这时候就用了 realloc    你可以看看   《数据结构》严蔚敏P47页 的Push函数里面 用了 realloc 虽然没这本书，但我看你写的我自己理解了一下。是不是这样的，假如有100的内存，当用完了就加10个内存变成110，当检测110用完了再加10？以此类推

仅供参考：//文件1中的内容排序并去重,结果保存到文件2中 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXCHARS 128      //能处理的最大行宽,包括行尾的\n和字符串尾的\0 int MAXLINES=10000,MAXLINES2; char *buf,*buf2; int c,n,hh,i,L; FILE *f; char ln[MAXCHARS]; int ignore_case=0; int icompare(const void *arg1,const void *arg2) {    return stricmp((char *)arg1,(char *)arg2); } int compare(const void *arg1,const void *arg2) {    return strcmp((char *)arg1,(char *)arg2); } int main(int argc,char **argv) {     if (argc<3) {         printf("Unique line. Designed by zhao4zhong1@163.com. 2012-08-20\n");         printf("Usage: %s src.txt uniqued.txt [-i]\n",argv[0]);         return 1;     }     if (argc>3) ignore_case=1;//若存在命令行参数3，忽略大小写     f=fopen(argv[1],"r");     if (NULL==f) {         printf("Can not find file %s!\n",argv[1]);         return 1;     }     buf=(char *)malloc(MAXLINES*MAXCHARS);     if (NULL==buf) {         fclose(f);         printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);         return 2;     }     n=0;     hh=0;     i=0;     while (1) {         if (NULL==fgets(ln,MAXCHARS,f)) break;//         hh++;         L=strlen(ln)-1;         if ('\n'!=ln[L]) {//超长行忽略后面内容             printf("%s Line %d too long(>%d),spilth ignored.\n",argv[1],hh,MAXCHARS);             while (1) {                 c=fgetc(f);                 if ('\n'==c || EOF==c) break;//             }         }         while (1) {//去掉行尾的'\n'和空格             if ('\n'==ln[L] || ' '==ln[L]) {                 ln[L]=0;                 L--;                 if (L<0) break;//             } else break;//         }         if (L>=0) {             strcpy(buf+i,ln);i+=MAXCHARS;             n++;             if (n>=MAXLINES) {                 MAXLINES2=MAXLINES*2;                 if (MAXLINES2==1280000) MAXLINES2=2500000;                 buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);                 if (NULL==buf2) {                     printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);                     printf("WARNING: Lines >%d ignored.\n",MAXLINES);                     break;//                 }                 buf=buf2;                 MAXLINES=MAXLINES2;             }         }     }     fclose(f);     if (n>1) {         if (ignore_case) qsort(buf,n,MAXCHARS,icompare);         else qsort(buf,n,MAXCHARS,compare);     }     f=fopen(argv[2],"w");     if (NULL==f) {         free(buf);         printf("Can not create file %s!\n",argv[2]);         return 2;     }     fprintf(f,"%s\n",buf);     if (n>1) {         if (ignore_case) {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if (stricmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         } else {             hh=0;             L=MAXCHARS;             for (i=1;i<n;i++) {                 if ( strcmp((const char *)buf+hh,(const char *)buf+L)) {                     fprintf(f,"%s\n",buf+L);                 }                 hh=L;                 L+=MAXCHARS;             }         }     }     fclose(f);     free(buf);     return 0; }

比如用在动态数组中灵活调整数组大小。

比如数组内存增加的时候


Question: C语音的一些疑问

题目5是年龄，这个年龄可能是要包含月份。比如1988年5月出生，那么1989年1月就是7/12年。因此是浮点数也是可以理解的。 题目6，rate2是每个水分子的质量，num * rate1得到的是总质量，所以需要除以rate2

1、不是天数，而是年数，也可以是浮点数，比如1.5表示一年半  2、num * rate1是水的总质量，一个水分子有rate2克，那么有多少个水分子自然除以rate2就可以得到

1，整数能表达的范围有限，容易溢出。不过以long类型最大范围到9223372036854775807而言，其实也足以表达一个人的年龄秒数了，你的怀疑有道理。 2，因为要算的是分子数啊，第一段计算只得出质量（克），除以rate2才是分子数。


Question: keil中C编写的问题，求帮助，程序不难

引用 4 楼 LIYAN2012013931 的回复:少了pic.h文件 应该是路径不对～

少了pic.h文件

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

每一个错误以及错误点都已经说的明明白白了，还叫编译器怎么告诉你！

错误实在太明显了，把你代码的第一行拷到文本编辑器（UE、notepad++）等一看就知道了，#是全角，i nclude中间有空格，你这代码是自己敲的吗


Question: c语言二叉树

1) CreateBiTree( )：根据先序遍历序列生成一棵二叉树 (2) Depth( )：求此二叉树的深度 (3) CountLeaf( )：统计该二叉树中叶子结点的个数 (4) InOrderTraverse( )：中序遍历二叉树 (5) PostOrderTraverse( )：后序遍历二叉树

怎么你注释都是乱码，看不到的