Question: 使用Dev C++5.1.1 scanf输入多个值的问题

确实如楼主所说，即使输入时按逗号要求输入，也是得不到正确的值 不知道别的编译器是不是 但这样题目能过，我猜是编译器的原因

引用 11 楼 zhao4zhong1 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] 6楼的代码实现了输入两个整数时随便你怎么分隔。 再＋10086[/quote] 对输入容错才是好的设计。

scanf("%d %d %d",&a,&b,&c)，由于 整型和浮点型数据读取的时候， 缺省会跳过（吃掉）所有前导空白（空格符，制表符，回车符等空白符） 所以加个空格，跟没加空格，效果是一致的 ------------------------------------------------------------------------  格式串中的空格作用是跳白，也就是吃掉空白符 ---跳过空白符，直到遇到非空白符号为止。------------- 所以： 不打算输入空行，以及前导空白，可以在%s格式前加空格 不打算输入空白字符，也可以在%c的前面加上空格

指明了什么样的格式，就要有什么样的输入。  "%d" "%d" "%d"其实就是"%d%d%d" 对应输入：1<space>2<space>3  "%d %d %d"由于格式中有额外的空格，所以输入中除了原先的空格之外，还需要有对应的额外的空格： 对应输入：1<space><space>2<space><space>3  "%d,%d,%d"由于格式中用于分隔数字的符号是,，所以输入中要用,来分隔 对应输入：1,2,3  指明了什么样的格式，就要有什么样的输入。

scanf 格式串中非格式字符部分，表示期待输入的（数据以外的）字符  格式串也是字符串，所以字符串连接，字符串中的转义序列，对格式串同样适用。 只有% 号序列，是格式串独有的序列，表示要输入的数据类型，格式。

"%d" "%d" "%d"这是三个字符串连接成一个字符串 中间的空格被忽略

第一个 自动跳白 ，格式等同于 “%d%d%d”，输入的时候，依然需要空格，等空白符号分开数据。不然就会产生输入混乱 第二个按照格式跳白-----空格的作用是跳白----- 第三个输入逗号作为分隔符，并跳过逗号，自动跳白 这几个格式本身并没有错误 只是 格式串，和大家所能想象的输入格式未必相同，和预期的格式不太一致。

引用 9 楼 zhao4zhong1 的回复:6楼的代码实现了输入两个整数时随便你怎么分隔。 再＋10086

引用 2 楼 paschen 的回复:第一种是错的 第二种输入时可用空格分 第三种输入时要用逗号分隔 在+1

6楼的代码实现了输入两个整数时随便你怎么分隔。

这个也不好解释吧..... http://download.csdn.net/detail/huangzhengdoc/9618890 还是自己看一下吧......

引用 2 楼 paschen 的回复:第一种是错的 第二种输入时可用空格分 第三种输入时要用逗号分隔  +1

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

引用 2 楼 paschen 的回复:第一种是错的 第二种输入时可用空格分 第三种输入时要用逗号分隔 c语言连着写的字符串常量编译器会自动合并的。

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

验证了确实如此。 VS就不是这样？

第一种是错的 第二种输入时可用空格分 第三种输入时要用逗号分隔

你写成这种格式scanf("%d,%d,%d",&a,&b,&c)，意味着你输入的时候也要用逗号分隔，而不是空格 比如:1,2,3


Question: 统计文件内容 c语言初学者 统计文本中字符 空格 数字个数并保持文件，请帮我看一下那里有问题，好几个小时了，初学不懂。

引用 12楼我是你的主体 的回复:[quote=引用 11 楼 u010165006 的回复:] char filename1[50]="f:\\gd\\185.txt"; 不用 printf("file name\n"); scanf("%s", filename1); 先试试。  #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void main() { 	FILE *fp1, *fp2; 	char ch ; 	int character,num,space,other; 	character = num = space = other = 0;  	char filename1[50] = { "f:\\gd\\185.txt" }; 	fp1 = fopen(filename1, "r");  	char filename2[50] = { "f:\\gd\\55.txt" };  	fp2 = fopen(filename2, "w");  	while ((ch = fgetc(fp1)) != EOF) 	{ 		if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 			character++; 		else if (ch >= '0' && ch <= '9') 			num++; 		else if (ch = ' ') 			space++; 		else 			other++; 	} 	fprintf(fp2, "character%d space%d num%d other%d", character, space, num, other); 	fclose(fp1); 	fclose(fp2);  } 改过之后，编译没报错，但运行错了。不知为什么？[/quote]else if(ch==' ')……

楼主应该学会调试程序，

引用 13 楼 u010165006 的回复:if (fp1== NULL) { printf("cannot open\n"); exit(1); }  这个留着试试。 谢谢，我再看看书，回头看完书再看看怎么回事。

引用 11 楼 u010165006 的回复:char filename1[50]="f:\\gd\\185.txt"; 不用 printf("file name\n"); scanf("%s", filename1); 先试试。  #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> void main() { 	FILE *fp1, *fp2; 	char ch ; 	int character,num,space,other; 	character = num = space = other = 0;  	char filename1[50] = { "f:\\gd\\185.txt" }; 	fp1 = fopen(filename1, "r");  	char filename2[50] = { "f:\\gd\\55.txt" };  	fp2 = fopen(filename2, "w");  	while ((ch = fgetc(fp1)) != EOF) 	{ 		if (ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z') 			character++; 		else if (ch >= '0' && ch <= '9') 			num++; 		else if (ch = ' ') 			space++; 		else 			other++; 	} 	fprintf(fp2, "character%d space%d num%d other%d", character, space, num, other); 	fclose(fp1); 	fclose(fp2);  } 改过之后，编译没报错，但运行错了。不知为什么？

引用 9 楼 paschen 的回复:[quote=引用 7 楼 hxf1220 的回复:] [quote=引用 6 楼 qq423399099 的回复:] 要两个反斜杠才行。 即：f:\\gd\\185.txt  按完回车就没黑框了，和原来一样。[/quote]  不用两个斜杠，输入的时候一个就行[/quote] 谢谢，我试过，\也不对。

引用 7 楼 hxf1220 的回复:[quote=引用 6 楼 qq423399099 的回复:] 要两个反斜杠才行。 即：f:\\gd\\185.txt  按完回车就没黑框了，和原来一样。[/quote]  不用两个斜杠，输入的时候一个就行

引用 3 楼 paschen 的回复:通过 errno 的值判断文件打开失败原因   fopen返回值判断参看：  http://en.cppreference.com/w/c/io/fopen  我不太懂您说的什么，刚学，加个断点这样了。

引用 6 楼 qq423399099 的回复:要两个反斜杠才行。 即：f:\\gd\\185.txt  按完回车就没黑框了，和原来一样。

要两个反斜杠才行。 即：f:\\gd\\185.txt

引用 2 楼 qq423399099 的回复:你这个是文件打开失败了。 看看文件是否存在，路径是不是写错了（当前目录是指工程目录，不是exe所在目录） 同时注意/和\的区别，或者用绝对路径试试 楼主最好把你输入的截图看一下 截图了麻烦帮看一下。

我一按回车就结束了。

看看文件存在吗


Question: 自己构造二级指针，实现二维数组使用

引用 2 楼 qq423399099 的回复:int *ptr = (int *)malloc(3 * sizeof(int *));应该是int **ptr = (int **)malloc(3 * sizeof(int *)); p = (int **)&ptr;应该是p = (int **)ptr;  #include<stdio.h> #include<stdlib.h> void main() { 	int data[3][4] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12 }; 	int i, j; 	int **p; 	//int *ptr[3] = { data[0], data[1], data[2] }; 	int **ptr = (int **)malloc(3 * sizeof(int *)); 	for (i = 0; i < 3; i++) 	{ 		*(ptr + i) = data[i]; 	} 	p = (int **)ptr; 	printf("%p %p %p\n", p[0], p[1], p[2]); } 牛逼！

动态分配二维数组不像你这种写  参看： http://blog.chinaunix.net/uid-22516719-id-263215.html

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

弄清楚地址和值，弄清你代码中的每个变量的值和地址


Question: 赋值的位置不同， 为什么 " c=1 " 放在开头定义会错误

是为了每次循环前把c重置为1，不然c会一直累加的。

楼主想表达的大概是for循环里的c=1语句移到main函数的第一句为什么不行吧？

结果错误吗， 因为!n = 1*3*5*...*n,所以c每次都要从1开始网上加。

向别人请教问题时，要将问题描述清楚，包括你的操作、各种现象、你采取的尝试，这样有利于大家快速的分析问题，帮你解决掉。 建议你学习这篇文章《提问的智慧》 http://www.jianshu.com/p/60dd8e9cd12f

什么叫放在开头定义错误？

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


Question: compile没错，可是build事却出现一个错误，怎么回事？

scanf（"%f，&weight"）  改成 scanf("%f"，&weight);

[quote=引用 3 楼 qq423399099 的回复:]好的，谢谢

引用 楼主 qq_30202127 的回复:  你的截图将最有用的内容给隐藏掉了。 在输出窗口，显示了有一个编译错误，必然有错误信息，可惜给隐藏掉了。  让大家看看那条错误信息，很快就可以帮你解决。  另外，记住，向别人请教问题时，要将问题描述清楚，包括你的操作、各种现象、你采取的尝试，这样有利于大家快速的分析问题，帮你解决掉。 建议你学习这篇文章《提问的智慧》 http://www.jianshu.com/p/60dd8e9cd12f

VC6太老了，经常各种问题  另外你代码scanf中引号位置错了，这虽然不会引起编译错误，但运行时可能会崩

引用 6 楼 qq_30202127 的回复:引用 1 楼 cherish_ff 的回复:scanf（“%f”，&weight）我试了下，还是不对啊。什么情况？编译器太老了吗？  你那什么错误，这几行还扯不上编译器。

Visual Studio 6/2005/2008/2010/2012/2013 各版本编译器 下载 http://bbs.csdn.net/topics/390812579 Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

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

注意细节啊。。 建议楼主可以换个IDE了，VC6太老了，建议换成VS

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

scanf（“%f”，&weight）


Question: c语言文件导入导出

解决了 在LoadAdd函数里面声明一个node变量，分配内存空间。 每调用一次LoadAdd,就为P重新分配一次内存空间。 int LoadAdd(node *h) {     node *p = (node *)malloc (sizeof(node));     strcpy(p->Name,h->Name);     strcpy(p->address,h->address);     strcpy(p->num,h->num);     p->next=NULL;     printf("%s\n%s\n%s\n",p->Name,p->address,p->num);     p->next=Number[Hashtable_Number(p->num)]->next;     Number[Hashtable_Number(p->num)]->next=p;      return 0; }

单步调试已经找到问题了、 这句话中，h被连接到了两个指针后面，所以两个不为空的指针输出的都是h         h->next=NULL;         h->next = Number[Hashtable_Number(h->num)]->next;         Number[Hashtable_Number(h->num)]->next=h;  有什么解决办法呢？

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

遇到问题单步跟踪分析原因更容易解决问题

我把Load函数里面的fscanf函数改成了fread函数 现在在命令行里面可以正常显示了 int LoadAdd(node *h) {     h->next=NULL;     h->next=Number[Hashtable_Number(h->num)]->next;     Number[Hashtable_Number(h->num)]->next=h;     printf("%s\n%s\n%s\n",h->Name,h->address,h->num);     return 0; }  int Load() {     FILE*fp;     node *h;     int i;      if(!(h = (node *)malloc (sizeof(node))))     {          printf("分配内存失败\n");     }     if((fp=fopen("result.txt","r")) == NULL)//以只读形式打开二进制文件     {         printf ("Fail to load\n");     }     fseek(fp,0,SEEK_END);     int m=ftell(fp)/sizeof(node);     fseek(fp,0,SEEK_SET);      for(i=0;i<m;i++)     {         fread(h,sizeof(node),1,fp);         LoadAdd(h);     }      fclose(fp);      return 0; }  但是node却在添加过程中出了问题

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


Question: 编译出现lvalue required as increment operand，估计是不能使用++，求解

同时这也是为什么定义指针变量后可以成功运行的原因。

简单来说，a和b是不可改变的常量，并不是变量。只有变量支持改变，包括++。

你的a和b是数组名，不能++ 你应该用指针指向数组，然后进行++操作  #include <stdio.h> int main(void) { 	char a[20] = "hello"; 	char b[] = "world"; 	char *p = a; 	char *q = b; 	while ((*p) != '\0') 	{ 		p++; 	} 	while ((*q) != '\0') 	{ 		*(p++) = *(q++); 	} 	printf("a = %s", a); 	return 0; }

变量a和b是定义的数组，虽然代表了数组首地址和第一个元素的地址，但是是不能改变的，不能对其做赋值运算，但是可以给其他变量赋值，楼主可以通过以下方式来对数组进行引用    char* pa =a; char* pb = b; ……  pa++； pb++；

a++，b++是不行的。因为他们的类型都是char[]数组类型


Question: 救命呀！！求老师解答，有没有懂Glib的老师呀！急！！！！

glib 移植的没有问题吗？ https://developer.gnome.org/glib/2.48/glib-cross-compiling.html

引用 4 楼 zhao4zhong1 的回复:Windows下的虚拟机中的linux就不是windows下了？ 老师 ，虚拟机没办法解决问题呀，做出来的东西。别人也要用呢，不能让别人也装虚拟机吧。

凡是用虚拟机不能解决的问题都不是问题。 参考 《黑客帝国》完全解析_知识库_博客园 《黑客帝国》里的锡安是不是虚拟世界_知识库_博客园

Windows下的虚拟机中的linux就不是windows下了？

引用 2 楼 zhao4zhong1 的回复:为什么不在Windows下的HyperV/VirtualBox/VMWare里面的Linux下使用这个Glib呢？ 因为我在写windows GUI应用，就算在linux编译好了，也要移植到windows下的。公司项目呢，用虚拟机不能解决问题。

再贴上一些相关的Glib接口原型和介绍  #define G_DEFINE_TYPE(TN, t_n, T_P)			    G_DEFINE_TYPE_EXTENDED (TN, t_n, T_P, 0, {}) /**  * G_DEFINE_TYPE_WITH_CODE:  * @TN: The name of the new type, in Camel case.  * @t_n: The name of the new type in lowercase, with words separated by '_'.  * @T_P: The #GType of the parent type.  * @_C_: Custom code that gets inserted in the *_get_type() function.  *   * A convenience macro for type implementations.    * Similar to G_DEFINE_TYPE(), but allows you to insert custom code into the   * *_get_type() function, e.g. interface implementations via G_IMPLEMENT_INTERFACE().  * See G_DEFINE_TYPE_EXTENDED() for an example.  *   * Since: 2.4  */ GFile *                 g_file_new_for_path               (const char                 *path);

任何收发两端速度不一致的通讯，都需要在它们之间使用一个足够大的FIFO缓冲区。 对任何FIFO缓冲区的使用，都需要仔细考虑接收端接收时超时无数据和发送端发送时FIFO缓冲区已满这两种情况下该如何做。 这些概念都在这段经典代码中有所体现。 这段经典代码还包括以下必须考虑的因素： ◆跨Windows和Linux平台 ◆多线程锁 ◆多线程日志 ◆日志文件占用的磁盘空间可控 ◆日志中的时间包括毫秒 ◆传输的数据对应的每个字节到底是几 ◆如何退出多线程程序 ◆……

既然你执意不使用虚拟机来解决兼容性问题，那就给你一根救命稻草吧：  有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： //循环向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; }   码畜：靠编译器帮自己查语法错误。 码农：靠调试器帮自己查逻辑错误。 码人：靠写日志帮自己查运营错误。 码神：靠冥想和顿悟帮自己查不可再现错误。

引用 14 楼 zhao4zhong1 的回复:虚拟机存在的必要性之一就是为了解决平台兼容性问题。 别逗我了，自己玩玩倒是无所谓，这是公司项目。[/quote] 你以为公司项目不用虚拟机？[/quote] 用是用，但是不适宜我这情况[/quote] 但我个人觉得恰好适宜你这情况。[/quote] 那就说定了，明天辞（被）职（炒）就去找你。

引用 12 楼 u014711608 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] [quote=引用 10 楼 u014711608 的回复:] [quote=引用 9 楼 zhao4zhong1 的回复:] 虚拟机存在的必要性之一就是为了解决平台兼容性问题。 别逗我了，自己玩玩倒是无所谓，这是公司项目。[/quote] 你以为公司项目不用虚拟机？[/quote] 用是用，但是不适宜我这情况[/quote] 但我个人觉得恰好适宜你这情况。

去读“别人封装的Glib库”的文档和代码

引用 11 楼 zhao4zhong1 的回复:[quote=引用 10 楼 u014711608 的回复:] [quote=引用 9 楼 zhao4zhong1 的回复:] 虚拟机存在的必要性之一就是为了解决平台兼容性问题。 别逗我了，自己玩玩倒是无所谓，这是公司项目。[/quote] 你以为公司项目不用虚拟机？[/quote] 用是用，但是不适宜我这情况

引用 10 楼 u014711608 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] 虚拟机存在的必要性之一就是为了解决平台兼容性问题。 别逗我了，自己玩玩倒是无所谓，这是公司项目。[/quote] 你以为公司项目不用虚拟机？

引用 9 楼 zhao4zhong1 的回复:虚拟机存在的必要性之一就是为了解决平台兼容性问题。 别逗我了，自己玩玩倒是无所谓，这是公司项目。

虚拟机存在的必要性之一就是为了解决平台兼容性问题。

引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 u014711608 的回复:] [quote=引用 4 楼 zhao4zhong1 的回复:] Windows下的虚拟机中的linux就不是windows下了？ 老师 ，虚拟机没办法解决问题呀，做出来的东西。别人也要用呢，不能让别人也装虚拟机吧。[/quote] 让别人装虚拟机不会死人的。[/quote] 老师。。。你这是在坑我呀，我这样做。明天就得去投靠你。你还要人吗

引用 6 楼 u014711608 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] Windows下的虚拟机中的linux就不是windows下了？ 老师 ，虚拟机没办法解决问题呀，做出来的东西。别人也要用呢，不能让别人也装虚拟机吧。[/quote] 让别人装虚拟机不会死人的。


Question: C语言位域问题

位域的长度最大为int 或者 最长整数 这应该也是实现定义的吧

你先把位域设成8Byte 的看看是什么结果 然后再设成6Bits的，这样就好理解了  union bs64{ struct base64{         unsigned  d1:6;         unsigned  d2:6;         unsigned  d3:6;         unsigned  d4:6;          } bs6; struct base64{         unsigned  c1:8;         unsigned  c2:8;         unsigned  c3:8;         unsigned  c4:8;      } bs8; };  bs64 *p =“123456”; 这样看看

1. 一个位域必须存储在同一个字节中，不能跨两个字节。如一个字节所剩空间不够存放另一位域时，应从下一单元起存放该位域。也可以有意使某位域从下一单元开始。 2. 由于位域不允许跨两个字节，因此位域的长度不能大于一个字节的长度，也就是说不能超过8位二进位。

上面的程序中buf指向的是 "qwertyui" 这个字符串。我的理解是，如果将buf 强转成（struct base64*)  再赋值给 bs; 应该是将buf 的前三位 "qwe"  直接赋值给了bs， 但qwe的整个编码是  qwe_buf 表示的一长串二进制数，如果按qwe_buf 对bs赋值， 结果应该是 演示中的第一种行情况。 但实际上，是将ewq_buf 从后往前依次赋给了bs，也就是演示中的第二种情况，这里不明白为什么会这样。

#include <stdio.h> #include <stdlib.h> #include <string.h>   struct base64{         unsigned  d1:1;         unsigned  d2:1;         unsigned  d3:1;         unsigned  d4:1;         unsigned  d5:1;         unsigned  d6:1;         unsigned  d7:1;         unsigned  d8:1;         unsigned  d9:1; };  int main() {     char buf[10]="qwertyui";     struct base64 *bs=(struct base64 *)buf;     printf("d1=%u ,d2=%u, d3=%u, d4=%u\n",bs->d1,bs->d2,bs->d3,bs->d4);     printf("d5=%u ,d6=%u, d7=%u, d8=%u d9=%d\n",bs->d5,bs->d6,bs->d7,bs->d8,bs->d9); }   运行结果： d1=1 ,d2=0, d3=0, d4=0 d5=1 ,d6=1, d7=1, d8=0 d9=1

发这个帖子是想知道位域的赋值方式。 即对整个结构体赋值时，结构体里面的每个成员是怎样得到数据的； 感谢6楼的提示，感谢各位的回帖；  其实赋值的顺序并没有改变  就是 qwe_buf的数据； 改变的是赋值的方式： q=01110001 w=01110111 e=01100101  qwe的二进制编码如上； 读取第一个字节q的数据  从低位开始到高位依次赋给d1的6个bit位，而d1在接收的时候也是从低位到高位存储接收到的数据，q中剩余的2位赋值给d2中最低的2个bit位； 读取第二个字节时也是按照上面的方式进行赋值。  感谢各位的支持，上面是个人理解，若有不对的地方还请指正。

#include <iostream> #include <iomanip>  template <typename T> void print(const T&t,std::ostream&os = std::cout, const char *prefix=" ",const char *postfix ="\n") {     os<<prefix<<" dec:"<<std::setw(6)<<std::setfill(' ')<<dec<<t<<" hex:0x"<<hex<<std::setw(2)<<std::setfill('0')<<t<<postfix; }  #define print_all(x) do{print(x##1),print(x##2),print(x##3),print(x##4);}while(0)  int main() {    /// sales s;      union bs64{ struct base64{         unsigned  d1:6;         unsigned  d2:6;         unsigned  d3:6;         unsigned  d4:6;  } bs6; struct base64_1{         unsigned  c1:8;         unsigned  c2:8;         unsigned  c3:8;         unsigned  c4:8;      } bs8;  struct base64_2{         unsigned  h1:16;         unsigned  h2:16;         unsigned  h3:16;         unsigned  h4:16;      } bs16; };  bs64 *p =(bs64 *)"12345678"; print_all(p->bs6.d); print_all(p->bs8.c); print_all(p->bs16.h);      return 0; }  输出：     dec:    49 hex:0x31   dec:     8 hex:0x08   dec:    51 hex:0x33   dec:    12 hex:0x0c   dec:    49 hex:0x31   dec:    50 hex:0x32   dec:    51 hex:0x33   dec:    52 hex:0x34   dec: 12849 hex:0x3231   dec: 13363 hex:0x3433   dec: 13877 hex:0x3635   dec: 14391 hex:0x3837  分析，这个X86 上的Windows 上的code::blocks 自带的编译器 位域的字节序，按照 Intel 字节序处理，位序从低到高诸位占用。 第一个6Bits占用最低地址的低6Bits 第二个6Bits占用低字节2Bits高位，第二字节的4Bits 低位 第三个6Bits占用第二字节高4Bits，第三字节低2Bits 第四个6Bits占用第三个字节高6Bits 一共占有24Bits

位域 的位顺序，和字节顺序，是由实现决定的 uinion { struct { unsigned char a:1; }b; unsigned char uc; unsigned int ui;  }; b.a=1; // ui  可能是 1,也可能是0x80000000;

一个位域必须存储在同一个字节中，不能跨两个字节。如一个字节所剩空间不够存放另一位域时，应从下一单元起存放该位域.


Question: 无法跳入mian函数中的while循环

倒数第一个while这一行后面加了分号，去掉试试

while (pTemp!=pHead);  后面多了分号，以使while成了循环体为空，并不是后面大括号中的内容

main函数里while (pTemp != pHead);这句后面多了个分号

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

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


Question: c语言中使用rapidjson库遇到的问题

int_object.SetString(test,strlen(test));   改为 int_object.SetString(test,strlen(test)，allocator);  就好了。

刚才结果写错了实际结果是： haha_2 haha_2 haha_2


Question: 关于C语言加密函数

奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！

BASE64 又不是加密,   本来就是明文啊.   邮件加密用 S/MIME 或者  PGP/GPG 啥的也不错,  这些都基于 PKCS,   在量子计算出现前都足够安全鸟...


惭愧，感谢3楼，我还以为是地址发送失败，特地在排序函数中调用输出函数。

外层for循环多了个分号，编译器竟然都没检测出来，看了我近两个小时，楼主把分号去掉就行了

你那个范围有点错误，是pArr.cnt而不是pArr.cnt-1,下面的也一样，改一下就可以 我是这样写的啊，没有写pArr.cnt-1，因为复制得比较急没注意格式，VC上缩进了的 int i, j, t;  	for (i = 0; i <pArr->cnt; ++i); 	{ 		for(j = i+1; j <pArr->cnt; ++j) 		{ 			if (pArr->pBase[i] > pArr->pBase[j]) 			{ 				t = pArr->pBase[i]; 				pArr->pBase[i] = pArr->pBase[j]; 				pArr->pBase[j] = t;//排序 			} 		 		} 	 	} 我看你引用了其他函数，我目前还没学，暂时不考虑那样实现，因为我是自学所以没有老师，麻烦你看下我的排序是不是有问题，谢谢啦

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

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

楼主，帮你调试了一下确实是排序的问题，你那个范围有点错误，是pArr.cnt而不是pArr.cnt-1,下面的也一样，改一下就可以 还有楼主写程序的时候注意缩进，哈哈！ #include <stdio.h>//标准函数的头文件 #include <malloc.h>//使用malloc动态分配函数的头文件 #include<stdlib.h>//exit函数头文件 #include<iostream> using namespace std; #include <algorithm> //这是算法的头文件，可以用sort函数，可以百度一下 //定义数据类型struct Arr struct Arr { 	int * pBase;//存储的是数组第一个元素的地址 	int len;//数组最多所能容纳的的元素的个数 	int cnt;//当前数组有效元素的个数 }; void init_arr(struct Arr *pArr, int length);//函数声明，初始化函数。 bool append_arr(struct Arr *pArr, int val);//追加，bool函数表示返回的值为false(真)(1)或者true(假)(0) bool insert_arr(struct Arr *pArr, int pos, int val);//pos的值从1开始,函数功能为在第pos个元素前插入val bool delete_arr(struct Arr *pArr, int pos, int *pVal);//pos表示第几个元素个数，val表示要删除元素的值，pVal表示Val的地址 int get(); bool iss_empty(struct Arr * pArr);//判断数组是否有有效的元素 bool is_full(struct Arr * pArr);//判断数组是否满(即有效元素个数是否等于数组长度) //void sort_arr(struct Arr *pArr);//排序 void show_arr(struct Arr * pArr);//输出数组的所有元素 void inversion_arr(struct Arr *pArr);//函数声明，倒置 bool cmp(int a, int b) { 	if (a < b)  return true; 	else return false; }   //////////////////////////////////////////////////////主函数   int main(void) { 	struct Arr arr;//定义	struct Arr型变量arr 	int val;  	init_arr(&arr, 7);//调用函数	init_arr并发送arr的地址，和长度 	show_arr(&arr);//输出 	append_arr(&arr, 1);//追加 	append_arr(&arr, 2);//追加 	append_arr(&arr, 77);//追加 	append_arr(&arr, 4);//追加 	append_arr(&arr, 66);//追加 	append_arr(&arr, 6);//追加 	delete_arr(&arr, 3, &val);//3表示删除第3个元素  	/*if (append_arr(&arr,7)) 	{ 	printf("追加成功!\n"); 	} 	else 	{ 	printf("追加失败!\n"); 	}*/ //判断是否最近成功 	//insert_arr(&arr, 6, 55); 	inversion_arr(&arr);//倒置元素 	sort(arr.pBase, (arr.pBase) + arr.cnt, cmp); 	//sort_arr(&arr);//排序 	show_arr(&arr);//输出 	system("pause"); 	return 0; }  //////////////////////////////////////////////////主函数   void init_arr(struct Arr *pArr, int length)//定义函数，且接收类型为struct Arr *型和int型 { 	pArr->pBase = (int *)malloc(sizeof(int) * length);//分配动态内存，变量pArr得以跨函数使用 	if (NULL == pArr->pBase)//如果pBase为空则内存分配失败 	{ 		printf("动态内存分配失败!\n"); 		exit(-1);//终止整个程序 	} 	else 	{ 		pArr->len = length;//长度为length 		pArr->cnt = 0;//有效元素个数为0 	} 	return; 	//(*pArr).len = 99;//PArr指针变量所指向的结构体变量pBase这个成员 }  bool iss_empty(struct Arr *pArr) { 	if (0 == pArr->cnt)//有效元素个数为0 		return true; 	else 		return false; }  bool is_full(struct Arr * pArr) { 	if (pArr->cnt == pArr->len) 		return true; 	else 		return false; }  void show_arr(struct Arr * pArr) { 	if (iss_empty(pArr))//调用函数is_empty 	{ 		printf("数组为空!\n"); 	} 	else 	{ 		for (int i = 0; i<pArr->cnt; ++i)//输出有效个数以内的值 			printf("%d ", pArr->pBase[i]); 		printf("\n"); 	} } bool append_arr(struct Arr *pArr, int val) { 	if (is_full(pArr))//满是返回false错误 		return false;  	//不满时追加 	pArr->pBase[pArr->cnt] = val; 	(pArr->cnt)++; 	return true; } bool insert_arr(struct Arr *pArr, int pos, int val) { 	int i; 	if (is_full(pArr))//如果数组满了，则不插入值 		return false; 	if (pos<1 || pos> pArr->cnt + 1)//如果pos（表示元素的位置）为负或者pos的值大于有效个数的值加一 		return false; 	for (i = pArr->cnt - 1; i >= pos - 1; --i)   //通过将前一个数的值赋给另一个数再给需要插入的位置的数赋值 	{	// 		pArr->pBase[i + 1] = pArr->pBase[i];// 	}	// 	pArr->pBase[pos - 1] = val; 	pArr->cnt++;//元素插入成功后增加有效元素个数，在show_arr函数中定义了只能输出有效元素个数以内的值 	return true; } bool delete_arr(struct Arr *pArr, int pos, int *pVal) { 	int i; 	if (iss_empty(pArr))//数组有效元素个数为0返回false 		return false; 	if (pos<1 || pos>pArr->cnt)//pos表示要删除的第pos个元素 		return false;// 	*pVal = pArr->pBase[pos - 1];//这里相当于把要删除的值赋给*pVal相当于主函数的val，然后下面从3后面开始向前移以为，虽然val值还在但是val被排在了末尾且有效个数减一，故val不会输出 	for (i = pos; i<pArr->cnt; ++i) 	{ 		pArr->pBase[i - 1] = pArr->pBase[i]; 	} 	pArr->cnt--; 	return true; } void inversion_arr(struct Arr *pArr) { 	int i = 0; 	int j = pArr->cnt - 1;//j为有效元素个数减一 	int t;  	while (i < j) 	{ 		t = pArr->pBase[i];//将第一个元素的值赋给t 		pArr->pBase[i] = pArr->pBase[j];//将第j个元素赋值给第一个元素 		pArr->pBase[j] = t;//将t的值赋给第j个元素 		++i;//i加j减 达到倒置元素的目的 		--j; 	} 	return; }  /*void sort_arr(struct Arr *pArr) { int i, j, t;  for (i = 0; i < pArr->cnt; ++i); { for(j = i+1; j < pArr->cnt; ++j) { if (pArr->pBase [i] > pArr->pBase [j]) { t = pArr->pBase [i]; pArr->pBase [i] = pArr->pBase [j]; pArr->pBase [j] = t;//a[0]分别于其他四位比保留最小数为a[0],第二轮保留最小为a[2] }  }  } printf("排序完成!\n");  }*/ /*void sort_arr(struct Arr *pArr) { int i, j, t;  for (i = 0; i < pArr->cnt -1; ++i); { for(j = 0; j < pArr->cnt -1-i; ++j) { if(pArr->pBase [j] > pArr->pBase [j+1]) { t = pArr->pBase [j]; pArr->pBase [j] = pArr->pBase [j+1]; pArr->pBase [j+1] = t;//冒泡排序 }  }  } printf("排序完成!\n");  }*/


Question: 各位大神大哥们好，c语言，只能输入汉字，英文和数字，下划线，该怎么写

都不知道C语言是否有正则表达式库文件。。不过话说限制这些干啥。。。。。。。

啥叫汉字？ #pragma comment(lib,"gdi32") #include <windows.h> #include <stdio.h>  int main() {     const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;      PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);     pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);     pbmi->bmiHeader.biWidth = uWidth;     pbmi->bmiHeader.biHeight = uHeight;     pbmi->bmiHeader.biPlanes = 1;     pbmi->bmiHeader.biBitCount = 1;     pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;     pbmi->bmiColors[0].rgbBlue = 0;     pbmi->bmiColors[0].rgbGreen = 0;     pbmi->bmiColors[0].rgbRed = 0;     pbmi->bmiColors[1].rgbBlue = 255;     pbmi->bmiColors[1].rgbGreen = 255;     pbmi->bmiColors[1].rgbRed = 255;      HDC hDC = CreateCompatibleDC (0);     void * pvBits;     HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);     SelectObject (hDC, hBitmap);     HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体"); //  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");     SelectObject (hDC, hFont);     BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);      char c[4];     int i, j;     for (i = 128; i < 256; i++) {         sprintf (c, "%02X", i);         TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);     }     for (j = 0; j < 256; j++) {         sprintf (c, "%02X", j);         TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);     }     for (i = 128; i < 256; i++) {         for (j = 0; j < 256; j++) {             c[0] = (char) i;             c[1] = (char) j;             TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);         }     }     for (i = 0; i < 130; i++) {         MoveToEx (hDC, 0, i * 17, NULL);         LineTo (hDC, uWidth, i * 17);     }     for (j = 0; j < 258; j++) {         MoveToEx (hDC, j * 17, 0, NULL);         LineTo (hDC, j * 17, uHeight);     }      BITMAPFILEHEADER bmfh;     bmfh.bfType = *(PWORD) "BM";     bmfh.bfReserved1 = 0;     bmfh.bfReserved2 = 0;     bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;     bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;      HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);     if (hFile != INVALID_HANDLE_VALUE) {         DWORD dwWritten;         WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);         WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);         WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);          CloseHandle (hFile);     }      DeleteObject (hFont);     DeleteObject (hBitmap);     DeleteDC (hDC);     LocalFree (pbmi);      return 0; }  #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     wchar_t wc[2];      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(48,0,0,0,0,0,0,0,GB2312_CHARSET ,0,0,0,0,"宋体-方正超大字符集");     SelectObject(hdc,hfont);     wc[0]=0xD854u;     wc[1]=0xDC00u;     TextOutW(hdc,10,10,wc,2);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; } #if 0 代理项或代理项对是一对共同表示单个字符的 16 位 Unicode 编码值。需要记住的关键一点是： 代理项对实际上是 32 位单个字符，不能再假定一个 16 位 Unicode 编码值正好映射到一个字符。  使用代理项对 代理项对的第一个值是高代理项，包含介于 U+D800 到 U+DBFF 范围内的 16 位代码值。 该对的第二个值是低代理项，包含介于 U+DC00 到 U+DFFF 范围内的值。通过使用代理项对， 16 位 Unicode 编码系统可以对已由 Unicode 标准定义的一百多万个其他字符 (220) 进行寻址。  在传递给 XmlTextWriter 方法的任何字符串中都可以使用代理项字符。不过，代理项字符在编写的 XML 中应该有效。例如，万维网联合会 (W3C) 建议不允许在元素或属性的名称中使用代理项字符。 如果字符串包含无效的代理项对，则引发异常。  另外，可以使用 WriteSurrogateCharEntity 写出与代理项对相对应的字符实体。字符实体以十六 进制格式写出，并用以下公式生成：  (highChar -0xD800) * 0x400 + (lowChar -0xDC00) + 0x10000  如果字符串包含无效的代理项对，则引发异常。下面的示例显示将代理项对作为输入的 WriteSurrogateCharEntity 方法。  C#复制  // The following line writes 𐀀. WriteSurrogateCharEntity ('\uDC00', '\uD800'); 下面的示例生成一个代理项对文件，将其加载到 XmlReader 中，并用新的文件名保存文件。 然后，原始文件和新文件被加载回应用程序的 XML 文档对象模型 (DOM) 结构中以进行比较。  C#复制  char lowChar, highChar; char [] charArray = new char[10]; FileStream targetFile = new FileStream("SurrogatePair.xml",       FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);  lowChar = Convert.ToChar(0xDC00); highChar = Convert.ToChar(0xD800); XmlTextWriter tw = new XmlTextWriter(targetFile, null); tw.Formatting = Formatting.Indented; tw.WriteStartElement("root"); tw.WriteStartAttribute("test", null); tw.WriteSurrogateCharEntity(lowChar, highChar); lowChar = Convert.ToChar(0xDC01); highChar = Convert.ToChar(0xD801); tw.WriteSurrogateCharEntity(lowChar, highChar); lowChar = Convert.ToChar(0xDFFF); highChar = Convert.ToChar(0xDBFF); tw.WriteSurrogateCharEntity(lowChar, highChar);  // Add 10 random surrogate pairs. // As Unicode, the high bytes are in lower // memory; for example, word 6A21 as 21 6A. // The high or low is in the logical sense. Random random = new Random(); for (int i = 0; i < 10; ++i) {       lowChar = Convert.ToChar(random.Next(0xDC00, 0xE000));       highChar = Convert.ToChar(random.Next(0xD800, 0xDC00));       charArray[i] = highChar;       charArray[++i] = lowChar; } tw.WriteChars(charArray, 0, charArray.Length);  for (int i = 0; i < 10; ++i) {       lowChar = Convert.ToChar(random.Next(0xDC00, 0xE000));       highChar = Convert.ToChar(random.Next(0xD800, 0xDC00));       tw.WriteSurrogateCharEntity(lowChar, highChar); }  tw.WriteEndAttribute(); tw.WriteEndElement(); tw.Flush(); tw.Close();  XmlTextReader r = new XmlTextReader("SurrogatePair.xml");  r.Read(); r.MoveToFirstAttribute(); targetFile = new FileStream("SurrogatePairFromReader.xml",        FileMode.Create, FileAccess.ReadWrite, FileShare.ReadWrite);  tw = new XmlTextWriter(targetFile, null); tw.Formatting = Formatting.Indented; tw.WriteStartElement("root"); tw.WriteStartAttribute("test", null); tw.WriteString(r.Value); tw.WriteEndAttribute(); tw.WriteEndElement(); tw.Flush(); tw.Close();  // Load both result files into the DOM and compare. XmlDocument doc1 = new XmlDocument(); XmlDocument doc2 = new XmlDocument(); doc1.Load("SurrogatePair.xml"); doc2.Load("SurrogatePairFromReader.xml"); if (doc1.InnerXml != doc2.InnerXml) {       Console.WriteLine("Surrogate Pair test case failed"); } 在使用 WriteChars 方法（一次写出一个缓冲区的数据）写出时，输入中的代理项对可能 会在一个缓冲区内被意外拆分。由于代理项值是定义完善的，如果 WriteChars 遇到来自 较低范围或者较高范围的 Unicode 值，它将该值标识为代理项对的一半。当遇到  WriteChars 将导致从拆分代理项对的缓冲区写入的情况时，将引发异常。使用   IsHighSurrogate 方法检查缓冲区是否以高代理项字符结束。如果缓冲区中的最后一个   字符不是高代理项，可以将该缓冲区传递给 WriteChars 方法。  请参见 概念 使用 XmlTextWriter 创建格式正确的 XML XmlTextWriter 的 XML 输出格式设置 XmlTextWriter 的命名空间功能  #endif


Question: C语言运行输入数字后，没有任何输出，并且会出现等待关闭的对话框。这是代码的问题吗？

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

是不是 还要加下 getchar(); 或 system("pause");

确实是代码问题 http://blog.csdn.net/lambyuyu/article/details/5544341

primenum函数中输出应该是printf

scanf("%d isn't prime number",a);   scanf("%d is prime number",a);    这里应该是用printf  printf是输出，scanf是输入  如果printf，后面要写成&a


Question: 关于c语言基础 位移问题

int x=0x12345678; assert(( x & 0x0000FFFF )==0x00005678);

没太搞懂楼主啥意思，可以自己转换成二进制去计算一下

知道什么原因了


Question: 关于C语言中的sleep的疑问，新手入门

引用 7 楼 qq423399099 的回复:主线程结束时会释放掉和其相关的所有资源（包括子线程） 你可以用类似WaitForSingleObject这样的函数等待子线程跑完再执行之后的代码   //============================================================================ // Name        : cplus.cpp // Author      : deepocean // Version     : // Copyright   : Your copyright notice // Description : Hello World in C++, Ansi-style //============================================================================  #include <iostream> #include <windows.h>  using namespace std; DWORD WINAPI ThreadFun(PVOID par) {    cout<<"线程方法正在执行..."<<endl;    Sleep(3000);     return 0; }  int main() {      DWORD ThreadID;     HANDLE hThread=CreateThread(NULL,0,ThreadFun,(void*)0,0,NULL);     while(TRUE)     {        //这里等待时间是设置的1秒钟，可以设置为INFINITE(就不需要外面的死循环了)        DWORD r= WaitForSingleObject(hThread,1000);         if(r==WAIT_TIMEOUT)         {             cout<<"WAIT_TIMEOUT"<<endl;//输出2-3次             continue;         }         else if(r==WAIT_OBJECT_0)         {              cout<<"WAIT_OBJECT_0"<<endl;//线程方法睡眠3秒以后输出             break;         }         else         {             cout<<"hello"<<endl;             continue;         }     }     CloseHandle(hThread);    system("PAUSE");     return 0; } 非常感谢

仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h>     #include <process.h>     #define  MYVOID             void #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define ARRSIZE(x) (sizeof(x)/sizeof(x[0])) #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; char logstr[16000]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 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;     if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;     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);             }             flog=fopen(logfilename1,"a");             if (NULL==flog) return;         }         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} int No_Loop=0; MYVOID testThread(void *pcn) {     int n,i;      n=(int)pcn;     i=0;     while (1) {         sleep_ms(1000);         Log("in testThread %d:i==%ds\n",n,++i);         if (i>=5) No_Loop=1;     } } int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL);     pthread_t threads[1];     int threadsN;     int rc; #endif     Log("=========BEGIN==================\n"); #ifdef WIN32     _beginthread((void(__cdecl *)(void *))testThread,0,(void *)1); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,testThread,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif     i=0;     while (1) {         sleep_ms(100);         Log("in main:i==%d\n",++i);         if (No_Loop==1) break;//     }     Log("=========END====================\n"); #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //2012-06-14 16:27:21.500 =========BEGIN================== //2012-06-14 16:27:21.609 in main:i==1 //2012-06-14 16:27:21.718 in main:i==2 //2012-06-14 16:27:21.828 in main:i==3 //2012-06-14 16:27:21.937 in main:i==4 //2012-06-14 16:27:22.046 in main:i==5 //2012-06-14 16:27:22.156 in main:i==6 //2012-06-14 16:27:22.265 in main:i==7 //2012-06-14 16:27:22.375 in main:i==8 //2012-06-14 16:27:22.484 in main:i==9 //2012-06-14 16:27:22.500 in testThread 1:i==1s //2012-06-14 16:27:22.593 in main:i==10 //2012-06-14 16:27:22.703 in main:i==11 //2012-06-14 16:27:22.812 in main:i==12 //2012-06-14 16:27:22.921 in main:i==13 //2012-06-14 16:27:23.031 in main:i==14 //2012-06-14 16:27:23.140 in main:i==15 //2012-06-14 16:27:23.250 in main:i==16 //2012-06-14 16:27:23.359 in main:i==17 //2012-06-14 16:27:23.468 in main:i==18 //2012-06-14 16:27:23.500 in testThread 1:i==2s //2012-06-14 16:27:23.578 in main:i==19 //2012-06-14 16:27:23.687 in main:i==20 //2012-06-14 16:27:23.796 in main:i==21 //2012-06-14 16:27:23.906 in main:i==22 //2012-06-14 16:27:24.015 in main:i==23 //2012-06-14 16:27:24.125 in main:i==24 //2012-06-14 16:27:24.234 in main:i==25 //2012-06-14 16:27:24.343 in main:i==26 //2012-06-14 16:27:24.453 in main:i==27 //2012-06-14 16:27:24.500 in testThread 1:i==3s //2012-06-14 16:27:24.562 in main:i==28 //2012-06-14 16:27:24.671 in main:i==29 //2012-06-14 16:27:24.781 in main:i==30 //2012-06-14 16:27:24.890 in main:i==31 //2012-06-14 16:27:25.000 in main:i==32 //2012-06-14 16:27:25.109 in main:i==33 //2012-06-14 16:27:25.218 in main:i==34 //2012-06-14 16:27:25.328 in main:i==35 //2012-06-14 16:27:25.437 in main:i==36 //2012-06-14 16:27:25.500 in testThread 1:i==4s //2012-06-14 16:27:25.546 in main:i==37 //2012-06-14 16:27:25.656 in main:i==38 //2012-06-14 16:27:25.765 in main:i==39 //2012-06-14 16:27:25.875 in main:i==40 //2012-06-14 16:27:25.984 in main:i==41 //2012-06-14 16:27:26.093 in main:i==42 //2012-06-14 16:27:26.203 in main:i==43 //2012-06-14 16:27:26.312 in main:i==44 //2012-06-14 16:27:26.421 in main:i==45 //2012-06-14 16:27:26.500 in testThread 1:i==5s //2012-06-14 16:27:26.531 in main:i==46 //2012-06-14 16:27:26.531 =========END====================

引用 4 楼 qq423399099 的回复:1.Windows中，Sleep()里面的单位，是以毫秒为单位，所以如果想让函数滞留1秒的话，应该写成： Sleep(1000); 2.在CreateThread后加上getchar()  PS:不推荐使用eclipse来编写C/C++代码  这个我是这样写的  就是出不来 void main() {       int i=0;     //创建线程1        CreateThread(             NULL,              // default security attributes             0,                 // use default stack size             ThreadProc1,        // thread function             NULL,             // argument to thread function             0,                 // use default creation flags             NULL);          getchar(); }

这个循环为什么在停止主线程时 才能打印出来

引用 1 楼 qq423399099 的回复:1. C语言标准库中没有sleep这个函数，它实际上是一个系统API函数。 函数功能: 执行挂起一段时间 在VC中使用带上头文件，而且全称为Sleep()，第一个字母需要大写。 #include <windows.h> //需要添加头文件 Sleep(unisgned long); //函数声明 Windows中，Sleep()里面的单位，是以毫秒为单位，所以如果想让函数滞留1秒的话，应该写成：  在gcc中，使用的头文件因gcc版本的不同而不同，一般来说，linux系统需要添加的头文件为： #include <unistd.h> 在Linux下，sleep()里面的单位是秒，而不是毫秒。  2.你打印不出来，是因为你的主函数（主线程）已经结束了，你在主函数里加个getchar();让它不要结束就行了  我不是用VC编辑  我是用eclipse，sleep应该写成什么样的，没看见，能麻烦你再写下不，线程这个我再主线程里面加了个while（1）循环  还是打印不出来

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


Question: codeblocks运行有问题啊

我也遇到这样的问题，请问楼主怎么解决的？

呃，已经解决了，谢谢大家

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

安装360安全卫士 一键优化 卸载360安全卫士

1）重做系统，或者买新电脑 2）清理垃圾 3）不要太多杀毒软件 4）及时查杀病毒 。。。。。。。。。。

光从这儿看不出什么问题，不过3秒多是比较慢

不过关闭那个窗口后有这么一句

没修改过啊，我刚装的系统，所有盘都清空了一遍才装的。

你之前对CB做了什么更改？

一个样子。。。

你这样试试

但是反应速度慢了好多啊。有办法调回原来的样子吗？

没问题，很好的


Question: 不太懂进程这一块儿的东西，麻烦帮忙看看

杀毒软件是程序开发的“猪队友”。

引用 9 楼 user-3的回复:[quote=引用 8 楼 shiyuzuxiaqianli 的回复:] [quote=引用 7 楼 user-3的回复:][quote=引用 6 楼 shiyuzuxiaqianli 的回复:]  那个500还没改过来[/quote] 已改，还是不行，估计不是这里的问题。[/quote]C程序没问题。Sleep(500)只是闪一下。检查下IE[/quote] 先吃饭去啦，回来再查查看

Sleep(5000) 才是5s  不然只是500ms

引用 8 楼 shiyuzuxiaqianli 的回复:[quote=引用 7 楼 user-3的回复:][quote=引用 6 楼 shiyuzuxiaqianli 的回复:]  那个500还没改过来[/quote] 已改，还是不行，估计不是这里的问题。[/quote]C程序没问题。Sleep(500)只是闪一下。检查下IE

引用 7 楼 user-3的回复:[quote=引用 6 楼 shiyuzuxiaqianli 的回复:]  那个500还没改过来[/quote] 已改，还是不行，估计不是这里的问题。

引用 6 楼 shiyuzuxiaqianli 的回复: 那个500还没改过来

如图，关键是打不开IE

引用 3 楼 shiyuzuxiaqianli 的回复:[quote=引用 2 楼 user-3 的回复:] #define CMD    " http://www.baidu.com/" 前面带一个空格空格加上去了，可是依然无法启动IE。。。[/quote] 打印的错误号是什么

引用 2 楼 user-3 的回复:#define CMD    " http://www.baidu.com/" 前面带一个空格空格加上去了，可是依然无法启动IE。。。

引用 17 楼 user-3 的回复:[quote=引用 16 楼 shiyuzuxiaqianli 的回复:] [quote=引用 15 楼 user-3 的回复:] [quote=引用 14 楼 shiyuzuxiaqianli 的回复:] [quote=引用 13 楼 user-3的回复:]windows中，找到“运行”，输入 C:\Program Files\Internet Explorer\iexplore.exe http://www.baidu.com/ 看能不能启动IE和百度 可以的，这个之前就试过了[/quote]这就怪了，我试了试，程序运行正常。你那个500改大了吗[/quote]好了，莫名其妙的好了，不知道是哪里出了问题。我刚才把IE版本升级了一下[/quote]也说不定是杀毒、防木马软件捣的鬼[/quote]好吧，太可恶了

引用 16 楼 shiyuzuxiaqianli 的回复:[quote=引用 15 楼 user-3 的回复:] [quote=引用 14 楼 shiyuzuxiaqianli 的回复:] [quote=引用 13 楼 user-3的回复:]windows中，找到“运行”，输入 C:\Program Files\Internet Explorer\iexplore.exe http://www.baidu.com/ 看能不能启动IE和百度 可以的，这个之前就试过了[/quote]这就怪了，我试了试，程序运行正常。你那个500改大了吗[/quote]好了，莫名其妙的好了，不知道是哪里出了问题。我刚才把IE版本升级了一下[/quote]也说不定是杀毒、防木马软件捣的鬼

引用 15 楼 user-3 的回复:[quote=引用 14 楼 shiyuzuxiaqianli 的回复:] [quote=引用 13 楼 user-3的回复:]windows中，找到“运行”，输入 C:\Program Files\Internet Explorer\iexplore.exe http://www.baidu.com/ 看能不能启动IE和百度 可以的，这个之前就试过了[/quote]这就怪了，我试了试，程序运行正常。你那个500改大了吗[/quote]好了，莫名其妙的好了，不知道是哪里出了问题。我刚才把IE版本升级了一下

引用 14 楼 shiyuzuxiaqianli 的回复:[quote=引用 13 楼 user-3的回复:]windows中，找到“运行”，输入 C:\Program Files\Internet Explorer\iexplore.exe http://www.baidu.com/ 看能不能启动IE和百度 可以的，这个之前就试过了[/quote]这就怪了，我试了试，程序运行正常。你那个500改大了吗

引用 13 楼 user-3的回复:windows中，找到“运行”，输入 C:\Program Files\Internet Explorer\iexplore.exe http://www.baidu.com/ 看能不能启动IE和百度 可以的，这个之前就试过了

引用 9 楼 user-3的回复:[quote=引用 8 楼 shiyuzuxiaqianli 的回复:] [quote=引用 7 楼 user-3的回复:][quote=引用 6 楼 shiyuzuxiaqianli 的回复:]  那个500还没改过来[/quote] 已改，还是不行，估计不是这里的问题。[/quote]C程序没问题。Sleep(500)只是闪一下。检查下IE[/quote] 怎么检查IE呢？不知道是什么问题


Question: 怎样让一个数组元素的个数始终固定为一个定值

多谢，就是要这样的效果

等间距取元素吗？  #include <stdio.h>  int filter(int* src,int ns,int* result,int nr) { 	int step;								//采样步长 	int o = 0;								//输出序号 	int i; 	int r;									//执行除法的余数 	int op = 0;								//按step+1采样的个数  	if(ns <= 0) return o;  	if(ns <= nr)							//样本小时逐个输出 	{ 		step = 0; 		op = nr = ns; 	} 	else 	{ 		step = (ns - 1) / (nr - 1); 		r = (ns - 1) % (nr - 1);  		if(r >= step)						//仅余数大于步长时将多出的加到前几次采样中 			op = r; 	}  	for(i=0,o=0;o<nr;o++){ 		result[o] = src[i]; 		i += step; 		if(o < op) i++; 	}  	return o; }  void show(int* arry,int len) { 	int i; 	for(i=0; i<len; i++) 	{ 		if(i != 0) printf(","); 		printf("%d",arry[i]); 	} 	printf("\n"); }  int main() { 	int Array_1[13]; 	int result[5]; 	int i,o,n;  	for(i=0; i<sizeof(Array_1)/sizeof(int); i++) 		Array_1[i] = i + 1;  	for(n=0; n<sizeof(Array_1)/sizeof(int); n++) 	{ 		o = filter(Array_1,n,result,sizeof(result)/sizeof(int)); 		printf("src: "); 		show(Array_1,n); 		printf("dst: "); 		show(result,o); 		printf("\n"); 	}  	return 0; }   运行结果如下：  红框框出不一致的地方，应该是楼主的问题吧？

用程序去完成

建议楼主先修一下《数理逻辑》

你都把这个问题说很清楚了，还有什么问题，按你描述逻辑写就行了

就是求一个筛选算法，完成上述功能就可以了

筛选算法是什么？ 能把算法描述清楚，这个工作就已经完成了

我知道了，楼主大概是想减小采样率，或者是做一种抽样.....但这个用初中数学就能解决啊

“”最终元素要是原来数组元素差不多间距位置的元素“” 这句话真心不懂。


Question: C语言黑框一闪就没了

你在每一个 return 1; 前面也加上 system("pause"); 试试

引用 1 楼 user-1 的回复:改成什么样了，发出来看看 #include <stdio.h> #include <math.h> #include <stdlib.h> #include <time.h>   #define A 10//行数 #define B 35//列数  int main()  { 	double  start, finish; 	start = clock();//取开始时间     int data[A][B];//用于存放栅格数据 	int suit[A][B];//用于存放限制值 	int so[A][B];//用于存放影响因子       FILE *fp;//读取栅格数据     fp=fopen("text.txt","r");     if(!fp) 	{         printf("不能找到text.TXT!");         return 1;     }     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             fscanf(fp,"%d",&data[i][j]);     fclose(fp);  	FILE *fp2;//读取限制条件     fp2=fopen("1.txt","r");     if(!fp2) 	{         printf("不能找到1.TXT!");         return 1;     }     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             fscanf(fp2,"%d",&suit[i][j]);     fclose(fp2); 	 	FILE *fp3;//读取影响因子     fp3=fopen("2.txt","r");     if(!fp3)  	{         printf("不能找到2.TXT!");         return 1;     }     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             fscanf(fp3,"%d",&so[i][j]);     fclose(fp3); 	     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             printf("data[%d][%d]=%d\n",i,j,so[i][j]);  	float P[A][B]={0};//定义转换概率二维数组 	int near=0;//定义领域内建设用地的数目 	 	//for(int time=1;time<11;time++)//time为迭代次数+1 	//{ 		for(int i=1;i<A-1;i++)//计算P的值 		{ 			for(int j=1;j<B-1;j++) 			{ 				if(data[i][j]==-9999||data[i][j]==1)//判断用地类型，排除数据空值和原本的城镇用地 					P[i][j]=0; 				else 					for(int m=i-1;m<i+2;m++) 					{ 						for(int n=j-1;n<j+2;n++) 						{ 							if(data[m][n]==1) 							{ 								near=near+1; 							} 						} 					} 					//float near2=near/8; 					//float randdata=1+pow(-log(rand()/(RAND_MAX+1.0)), 2);//随机影响因素 					int suitdata=suit[i][j];//限制值 					int posdata=so[i][j];//开发概率 					P[i][j]=near+suitdata+posdata; 					near=0; 					printf("P[%d][%d]=%f\n",i,j,P[i][j]); 			} 		} 	finish = clock();//取结束时间 	printf( "本次运行消耗%f seconds\n",(finish - start) / CLOCKS_PER_SEC);//以秒为单位显示之     system("pause");     return 0; }

改成什么样了，发出来看看


Question: C语言小程序中一个“ 1 个无法解析的外部命令”错误！！！

引用 23 楼 ljcljxsxq 的回复:感觉有点像是上次的编译器没有关闭  我的这个问题已经解决了，谢谢你。

感觉有点像是上次的编译器没有关闭

引用 21 楼 u012997273 的回复:[quote=引用 20 楼 dear_Alice_moon 的回复:] [quote=引用 19 楼 u012997273 的回复:] 楼主，我好像认识你，哈哈 这个问题提示的已经很明显了，就是入口函数的问题 一般c的是main，windows 的是winmain，俺已经不搞技术了，但是问题在哪，还是一眼能看出来滴    你认错人了，我目前还是一位在校生。  谢谢你的回复，谢谢。    [/quote]  嗯，我好像搞错了[/quote]

引用 20 楼 dear_Alice_moon 的回复:[quote=引用 19 楼 u012997273 的回复:] 楼主，我好像认识你，哈哈 这个问题提示的已经很明显了，就是入口函数的问题 一般c的是main，windows 的是winmain，俺已经不搞技术了，但是问题在哪，还是一眼能看出来滴    你认错人了，我目前还是一位在校生。  谢谢你的回复，谢谢。    [/quote]  嗯，我好像搞错了

引用 19 楼 u012997273 的回复:楼主，我好像认识你，哈哈 这个问题提示的已经很明显了，就是入口函数的问题 一般c的是main，windows 的是winmain，俺已经不搞技术了，但是问题在哪，还是一眼能看出来滴    你认错人了，我目前还是一位在校生。  谢谢你的回复，谢谢。

引用 14 楼 NabariOu 的回复:最后的调用函数，return后面括号都没有  return后的花括号是有的。

引用 16 楼 zhao4zhong1 的回复:Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  Visual Studio 6/2005/2008/2010/2012/2013 各版本编译器 下载 http://bbs.csdn.net/topics/390812579  谢谢，真的谢谢赵老师。编辑器，我自己在网上找到了。谢谢

帮顶

最后的调用函数，return后面括号都没有

main函数是在源文件里，不是新建头文件

解决了就分享下给大家共勉！可以结贴了！

引用 5 楼 xmt1139057136 的回复:c不太会啊，www.xttblog.com   没关系，问题已经解决了。谢谢

c不太会啊，www.xttblog.com

引用 11 楼 lm_whales 的回复:开发环境问题 重新安装  我应经在第2楼给了问题的解决方法。  不需要重新安装软件。谢谢

引用 10 楼 user-9 的回复:用工具还要考虑操作的问题，通常linux用vim非常方便从不会有这样的问题，楼主编写测试程序可以考虑转linux平台，便于以后开发  嗯，谢谢你的提醒。  Linux我用了一点点，对于Linux的系统命令不懂，弄得我很难受。我对Linux一点都不懂，自学起来难度非常大！自学起来好困难！

开发环境问题 重新安装

引用 8 楼 paschen 的回复:main函数是在源文件里，不是新建头文件  嗯，谢谢。


Question: 关于C语言宏展开的一个诡异现象！不理解啊，求大神解释

引用 3 楼 zhao4zhong1 的回复:#与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         return 0; } 宏展开时： 如果宏定义以#开头，不展开参数，直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"； 如果宏定义不以#开头，展开参数，直接替换，由外层向里层，如果碰到的是#开头的宏，不继续往里层展开，往外层展开。 由外层向里层，如果碰到的是以非#开头的宏，继续往里层走，直至最里层，开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS： ##在宏中定义，是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现，是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         char a = 'a';         cout<<g(a)<<endl; // a         cout<<g(g(a))<<endl; // a         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         printf("%s\n", g(h(f(1,2)))); // h(f(1,2))         printf("%s\n", h(g(f(1,2)))); // "f(1,2)"         printf("%s\n", h(h(f(1,2)))); // "12"         system("pause");         return 0; } 预处理后的：（在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E） int main() {         char a = 'a';         cout<<"a"<<endl;         cout<<"g(a)"<<endl;         printf("%s\n", "12");         printf("%s\n", "f(1,2)");         printf("%s\n", "h(f(1,2))");         printf("%s\n", "\"f(1,2)\"");         printf("%s\n", "\"12\"");         system("pause");         return 0; } --------------------------------------------------- 宏解析 1.       ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号，它不能出现于宏替代表的开端和末尾。 例： #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2.       重新扫描和替换 在替换列表中的所有参数替换过之后，预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时，就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换（防止递归）。 例： #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC  很详细也很有用！谢谢

引用 1 楼 Saleayas 的回复: #define _STR(x) #x   #define _STR(x) __STR(x)  #define __STR(x) #x 这确实可以解决我的问题，但为什么多一层后就好了呢？

试下带行方式  http://blog.csdn.net/qyee16/article/details/9322281


Question: scanf输入非零数后得到的确是零，请问哪里出了问题？

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

谢谢user-3，小灸舞和赵4老师指点和提戒，C语言就是一个在细节上见功夫的语言，pitfalls和traps多啊！要仔细仔细再仔细才能达到最低要求。

C语言中的格式占位符： %a,%A 读入一个浮点值(仅C99有效) %c 读入一个字符 %d 读入十进制整数 %i 读入十进制，八进制，十六进制整数 %o 读入八进制整数 %x,%X 读入十六进制整数 %s 读入一个字符串，遇空格、制表符或换行符结束。 %f,%F,%e,%E,%g,%G 用来输入实数，可以用小数形式或指数形式输入。 %p 读入一个指针 %u 读入一个无符号十进制整数 %n 至此已读入值的等价字符数 %[] 扫描字符集合 %% 读%符号

如果要unsigned short，用 %hu

scanf("%u", &n);  %u对应的是unsigned int ，而不是unsigned short


Question: 用c语言怎么删除字符串中某段字符串啊，要删除的字符串知道开头跟结尾

基本可以用下面的代码，如果不合适调整一下。  char sSourE[1024] = "iuncoao14cscsdzsxcwvwv1x"; char *s1 = "co" char *s2 = "4c" char *p1 = NULL, *p2 = NULL; p1 = strstr(sSour, s1); p2 = strstr(s1, s2); while(*p2) {  *p1  =  *p2;   p1++;   p2++ }

方法二，让字符串指针指向co，然后在4c的下一个字符改成'\0'

方法一：将需要的部分复制出来


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


Question: 圆覆盖矩形优化问题

以下是相同的圆覆盖矩形的优化问题（但我调试了好几次总有错误） #include <windows.h> #include <math.h> #include <stdio.h> #define WINDOW_WIDTH 400 #define WINDOW_HEIGHT 400 char* g_szApplicationName="圆覆盖矩形（矩形覆盖）"; char* g_szWindowClassName="LinrenWindowClass"; struct  mypoint{ double x,y; }myp[200]; struct myrect{ double x,y; double x2,y2; double x3,y3; }myr[200]; /**只用修改这里******************************/ #define PARM_R 24.1 #define PARM_L 233.5 #define PARM_D 197.4 /******************************只用修改这里**/ int n,n2; double r=PARM_R,l=PARM_L,d=PARM_D; double at,sq2,x,y; double a,e; #undef PARM_R #undef PARM_L #undef PARM_D char str[100]; void fun(){ int cl,cd,i,j; x=(double(WINDOW_WIDTH)-l)/2.0; y=(double(WINDOW_HEIGHT)-d)/2.0; sq2=sqrt(2.0); a=sq2*r; at=(a-r)/sq2; cl=(int)(l/a); cd=(int)(d/a); n=0; for(i=0;i<cl;i++){ for(j=0;j<cd;j++){ myp[n].x=x+a*i; myp[n].y=y+a*j; n++; } } e=(int)(r+r+1e-15); n2=0; double t1,t2,t3,t4; int kd; t1=l-cl*a; t2=sqrt((r+r)*(r+r)-t1*t1); t3=d-cd*a; t4=sqrt((r+r)*(r+r)-t3*t3); if(t1<t4){ kd=(int)(l/t4); myr[n2].x=x+kd*t4; myr[n2].y=y+cd*a; myr[n2].x2=x+(kd+1)*t4; myr[n2].y2=y+d; myr[n2].x3=myr[n2].x-(r-t4/2.0); myr[n2].y3=myr[n2].y-(r-t3/2.0); n2++; }else if(t3<t2){ kd=(int)(d/t2); myr[n2].x=x+cl*a; myr[n2].y=y+kd*t2; myr[n2].x2=x+l; myr[n2].y2=y+(kd+1)*t2; myr[n2].x3=myr[n2].x-(r-t1/2.0); myr[n2].y3=myr[n2].y-(r-t2/2.0); n2++; }else{ kd=(int)(l/t4); myr[n2].x=x+kd*t4; myr[n2].y=y+cd*a; myr[n2].x2=x+(kd+1)*t4; myr[n2].y2=y+d; myr[n2].x3=myr[n2].x-(r-t4/2.0); myr[n2].y3=myr[n2].y-(r-t3/2.0); n2++; kd=(int)(d/t2); myr[n2].x=x+cl*a; myr[n2].y=y+kd*t2; myr[n2].x2=x+l; myr[n2].y2=y+(kd+1)*t2; myr[n2].x3=myr[n2].x-(r-t1/2.0); myr[n2].y3=myr[n2].y-(r-t2/2.0); n2++; } kd=(int)(d/t2); for(i=0;i<kd;i++){ myr[n2].x=x+cl*a; myr[n2].y=y+i*t2; myr[n2].x2=x+l; myr[n2].y2=y+(i+1)*t2; myr[n2].x3=myr[n2].x-(r-t1/2.0); myr[n2].y3=myr[n2].y-(r-t2/2.0); n2++; } kd=(int)(l/t4); for(i=0;i<kd;i++){ myr[n2].x=x+i*t4; myr[n2].y=y+cd*a; myr[n2].x2=x+(i+1)*t4; myr[n2].y2=y+d; myr[n2].x3=myr[n2].x-(r-t4/2.0); myr[n2].y3=myr[n2].y-(r-t3/2.0); n2++; } sprintf(str,"总数：%d",n+n2); } LRESULT CALLBACK WindowProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam){ static HBRUSH hbrush=(HBRUSH)GetStockObject(NULL_BRUSH); static HPEN newpen=CreatePen(PS_SOLID,1,RGB(255,0,0)); static HPEN oldpen=NULL; switch(msg){ case WM_CREATE: { PAINTSTRUCT ps; int i; BeginPaint(hwnd,&ps); SelectObject(ps.hdc,hbrush); for(i=0;i<n;i++){ Ellipse(ps.hdc,(int)(myp[i].x-at+0.5),(int)(myp[i].y-at+0.5),(int)(myp[i].x-at+e+0.5),(int)(myp[i].y-at+e+0.5)); Rectangle(ps.hdc,(int)(myp[i].x+0.5),(int)(myp[i].y+0.5),(int)(myp[i].x+a+0.5),(int)(myp[i].y+a+0.5)); } for(i=0;i<n2;i++){ Ellipse(ps.hdc,(int)(myr[i].x3+0.5),(int)(myr[i].y3+0.5),(int)(myr[i].x3+e+0.5),(int)(myr[i].y3+e+0.5)); Rectangle(ps.hdc,(int)(myr[i].x+0.5),(int)(myr[i].y+0.5),(int)(myr[i].x2+0.5),(int)(myr[i].y2+0.5)); } oldpen=(HPEN)SelectObject(ps.hdc,newpen); Rectangle(ps.hdc,(int)(x+0.5),(int)(y+0.5),(int)(x+l+0.5),(int)(y+d+0.5)); SelectObject(ps.hdc,oldpen); TextOut(ps.hdc,20,20,str,strlen(str)); EndPaint(hwnd,&ps); } break; case WM_PAINT: { PAINTSTRUCT ps; int i; BeginPaint(hwnd,&ps); SelectObject(ps.hdc,hbrush); for(i=0;i<n;i++){ Ellipse(ps.hdc,(int)(myp[i].x-at+0.5),(int)(myp[i].y-at+0.5),(int)(myp[i].x-at+e+0.5),(int)(myp[i].y-at+e+0.5)); Rectangle(ps.hdc,(int)(myp[i].x+0.5),(int)(myp[i].y+0.5),(int)(myp[i].x+a+0.5),(int)(myp[i].y+a+0.5)); } for(i=0;i<n2;i++){ Ellipse(ps.hdc,(int)(myr[i].x3+0.5),(int)(myr[i].y3+0.5),(int)(myr[i].x3+e+0.5),(int)(myr[i].y3+e+0.5)); Rectangle(ps.hdc,(int)(myr[i].x+0.5),(int)(myr[i].y+0.5),(int)(myr[i].x2+0.5),(int)(myr[i].y2+0.5)); } oldpen=(HPEN)SelectObject(ps.hdc,newpen); Rectangle(ps.hdc,(int)(x+0.5),(int)(y+0.5),(int)(x+l+0.5),(int)(y+d+0.5)); SelectObject(ps.hdc,oldpen); TextOut(ps.hdc,20,20,str,strlen(str)); EndPaint(hwnd,&ps); } break; case WM_DESTROY: DeleteObject(hbrush);DeleteObject(newpen);DeleteObject(oldpen); PostQuitMessage(0);break; } return DefWindowProc(hwnd,msg,wParam,lParam); } int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance, LPSTR szCmdLine,int iCmdShow){ HWND hWnd; WNDCLASSEX winclass; winclass.cbSize = sizeof(WNDCLASSEX); winclass.style = CS_HREDRAW | CS_VREDRAW; winclass.lpfnWndProc = WindowProc; winclass.cbClsExtra = 0; winclass.cbWndExtra = 0; winclass.hInstance = hInstance; winclass.hIcon = LoadIcon(NULL, IDI_APPLICATION); winclass.hCursor = LoadCursor(NULL, IDC_ARROW); winclass.hbrBackground = (HBRUSH)GetStockObject (WHITE_BRUSH); winclass.lpszMenuName = NULL; winclass.lpszClassName = g_szWindowClassName; winclass.hIconSm = LoadIcon(NULL, IDI_APPLICATION); if (!RegisterClassEx(&winclass)){ MessageBox(NULL,"RegisterClassEx Error!","error",0);return 0; } hWnd=CreateWindowEx(NULL, g_szWindowClassName, g_szApplicationName, WS_OVERLAPPEDWINDOW, GetSystemMetrics(SM_CXSCREEN)/2-WINDOW_WIDTH/2, GetSystemMetrics(SM_CYSCREEN)/2-WINDOW_HEIGHT/2, WINDOW_WIDTH, WINDOW_HEIGHT, NULL,NULL,hInstance,NULL); if(!hWnd){ MessageBox(NULL,"CreateWindowEx Error!","error",0);return 0; } fun(); ShowWindow(hWnd, iCmdShow);UpdateWindow(hWnd); MSG msg; while(GetMessage(&msg,NULL,0,0)){ TranslateMessage(&msg);DispatchMessage(&msg); } return msg.wParam; }

排料问题大牛:http://www2.stetson.edu/~efriedma/packing.html

这是我在数学建模中遇到的问题

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


Question: 数据结构中序遍历问题

仅当GetTop(S,p)&&p.data满足时才循环

大神，请问上面的红色的功能是什么啊？


Question: 自己写了个strpbrk...结果段错误了.求助!

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

引用 3 楼 zw545378330的回复:首先不说程序干嘛的，你的函数返回null，且不判断是否为空直接使用这就是错误。你的问题是内部循环没有查找到第一个字符，返回了null。再就是你的内部循环是不是少了，例如第一个字符没找到，第二个字符从哪里开始找？ 说直白点，访问null所指空间☞是非法的

要注意每次循环是不是要把什么变量重新置为初始值。  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

另外，如果返回值是NULL，再取*是错误的

单步跟踪程序运行，观察分析原因

发现问题了..........内圈循环跑飞了..........

数组没有越界的,第二个看着有点长,但是够了


Question: 安装wdm驱动报错》由于没有为设备实例指定函数驱动程序，安装没有成功

Windows驱动开发 http://www.osronline.com/

引用 3 楼 zhao4zhong1 的回复:Windows驱动开发 http://www.osronline.com/ 没看懂，你直接跟我说改哪里吧

求人大神分分钟解决

。。。。。。没人么


Question: realloc成功了为什么最后free还会出错，调试地址也没变,求大神解答

引用 11 楼 mstlq 的回复:简单例子模拟类似楼主错误,连realloc都不需要，注意第一句的500和第二句的1000  char *p=malloc(500); memset(p,7,1000); free(p);  这种问题可以通过以下办法捕获：#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

5楼所言甚是，还请楼主仔细检查

我的程序  多加入三个字符没有申请多申请3个 使用用-lmcheck   ，报错memory clobbered past end of allocated block

if (!(psTemp = (double*)realloc(pS, (LENGTH + n)*sizeof(double)))) {

引用 2楼小灸舞 的回复:你这个肯定是越界破坏了堆空间。 导致内存管理信息被破坏，所以free出错我调试了，但是发现指针地址都没有变化，而且数值也没有出错，应该没有越界

引用 3 楼 NabariOu的回复:引用 1楼paschen 的回复:检查使用分配的内存有没出现越界情况，如果有会破坏了堆空间，通常表现在释放的时候出错我调试了，但是发现指针地址都没有变化，而且数值也没有出错，应该没有越界 不是只有指针改变才会越界

PROTOTYPE: void * realloc ( void * ptr, size_t new_size );  关于realloc的行为方式，结合源码总结为： 1. realloc失败的时候，返回NULL；  2. realloc失败的时候，原来的内存不改变，也就是不free或不move，(这个地方很容易出错)；  3. 假如原来的内存后面还有足够多剩余内存的话，realloc的内存=原来的内存+剩余内存,realloc还是返回原来内存的地址; 假如原来的内存后面没有足够多剩余内存的话，realloc将申请新的内存，然后把原来的内存数据拷贝到新内存里，原来的内存将被free掉,realloc返回新内存的地址；  4. 如果size为0，效果等同于free()；  5. 传递给realloc的指针可以为空，等同于malloc；  6. 传递给realloc的指针必须是先前通过malloc(), calloc(), 或realloc()分配的。

引用 4 楼 NabariOu 的回复:[quote=引用 2楼小灸舞 的回复:]你这个肯定是越界破坏了堆空间。 导致内存管理信息被破坏，所以free出错我调试了，但是发现指针地址都没有变化，而且数值也没有出错，应该没有越界[/quote]  你描述的现象（指针地址都没有变化，而且数值也没有出错）无法得到你的结论（没有越界）

你这个肯定是越界破坏了堆空间。 导致内存管理信息被破坏，所以free出错


Question: 新手上路，求教vs 2015读取txt的问题

引用 1 楼 qq423399099 的回复:txt文件应该放在工程目录文件夹下，而不是你EXE所在的DEBUG目录下。 楼主也可以用绝对路径试试。  好的我去试试谢谢您


Question: 可变参数函数的问题，麻烦帮助。有代码，有错误详细截图

因为你尝试用 %d 来输出一个 char* （"20"）

参数2输出到文件明显是错误的


Question: 一个简单问题

确实是这样，我太粗心了

其实只是循环了i次，你之所以会需要多输入一次是因为你的scanf("%d\n")这个里面的\n (你这里完全可以改成scanf("%d",num + n);) \n,空格和制表符，是空白符。 空白字符会使scanf()函数在读操作中略去输入中的一个或多个空白字符。 只有输入一个非空白符的时候才能终止scanf的输入。 如果你一定要这样用scanf("%d\n", &i); 你输入一个数后，它是不会立即显示的，要等再接收到一个非（空格、制表符、回车）的输入scanf语句才结束。


Question: realloc成功了为什么最后free还会出错，调试地址也没变，为什么

麻烦你这样输入代码麻烦你这样输入代码方便他人，方便自己


Question: 结构体的伸缩型数组成员 为其分配存储空间 分配不了

这是 C ，注意不要用C++ 编译器或者编译器的 C++ 模式。  扩展名是 .cpp , .cc 等的一般会自动进入 C++ 模式。 扩展名是 .c 的一般会自动使用 C 模式

引用 1 楼 user-4 的回复:double scores[];要攺成double scores[0]; 改成 0 才会出问题。这里只能空着，要么写大于 0 的数字。 如果不是因为 360 报错，那就是编译器太老不支持。

可以了，谢谢！ @user-4  刚刚不知道为什么赋不了值，可能是开了360~

没错啊，你用的什么编译器

@user-4 我试过你这样定义，没有报错，但后面赋值就会出现问题。

pg = (struct grade *)malloc( sizeof(struct grade) + n * sizeof(double) );  新版支持array[]这样的定义了啊?

double scores[];要攺成double scores[0];


Question: C语言创建二叉树，栈溢出。。，求解(只剩40分了，全发)

C中整型和字符型可以比较，建议用C编译器而不要用C++编译器编译C程序

引用 1 楼 qq423399099 的回复:1.栈溢出是因为你的if(x=='#') 这句，你的x是整形，这样判断是不行的 2.你的CreateTree函数写的也有问题，你如果想把malloc的任务都放在CreateTree函数里，那么必须用二级指针才行 3.你的TreePrint函数里应该用if而不是while  #include <stdlib.h> #include <stdio.h>  typedef struct bTree { 	int data; 	struct bTree *pLeftChild; 	struct bTree *pRightChild;  }bTree;  bool CreateTree(bTree **T); void TreePrint(bTree * T);  int main(int argc, char* argv[]) { 	bTree *T = NULL; 	CreateTree(&T); 	printf("----打印树----\n"); 	TreePrint(T); 	return 0; }  bool CreateTree(bTree **T) { 	int x = 0; 	scanf("%d", &x); 	if (x == 0) 	{ 		*T = NULL; 		return false; 	} 	else 	{ 		*T = (bTree *)malloc(sizeof(bTree)); 		(*T)->data = x; 		CreateTree(&(*T)->pLeftChild); 		CreateTree(&(*T)->pRightChild); 	}  	return true; }  void TreePrint(bTree * T) { 	if (T) 	{ 		printf("%d\n", T->data); 		TreePrint(T->pLeftChild); 		TreePrint(T->pRightChild); 	} }       谢谢小灸舞，真是一言惊醒梦中人，我今天写代码写到傻掉了。

借用赵四老师的话： 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。


Question: 求折点个数！运行老是自动终止，求助求助！谢谢！！

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

1.getchar()可以去掉 2.for的第二部分和第三部分你搞错顺序了 3.if判断也有问题，应该是if (aa[i]>aa[i - 1] && aa[i]<aa[i + 1])  #include<iostream> using namespace std; int main(){ 	int n; 	cin >> n; 	//getchar(); 	int *aa = new int[n]; 	int i, count = 0; 	for (i = 0; i < n; i++) 		cin >> aa[i]; 	for (i = 1; i<n - 1; i++){ 		if (aa[i]>aa[i - 1] && aa[i]<aa[i + 1]) 			count++; 	} 	delete[]aa; 	cout << count << endl; 	return 0; }

for语句的格式…… for (/*初始化*/; /*条件*/; /*循环末子句*/) { /* ... */ }

你的for（i=0;i<n;i++）你写反了  你要是单步调式你就明白了为什么只能这样写


Question: 输入数字的个数，求他们的最大公约数

1）遍历法，只需要N-1 次 求最大公约数，即可求出最大公约数，好处是一个循环结束。逻辑简单 2）多轮两两相求法，次数为N/2+N/4+...N/2^k 应该也为N-1次吧，好处是每一轮的公约数，总是变小，实际复杂度变小。  算法时间复杂度， 最坏O(N *log(max(ai)))

求两个数的最大公约数使用辗转相除法，多个数的最大公约数也是类似的，先计算n个数其中两个数的最大公约数，得到的数放入原先的序列中，将本轮进行计算的两个数拿出来，这样就得到一个n-1长度的序列，再求这n-1个数的最大公约数，过程和前面是一样的。重复这一过程直到n=1为止，这个数就是最大公约数。为了降低计算量，计算之前首先将序列降序排列，每次取最大的两个数做辗转相除，这样子应该会更加高效一点。

分组，求公约数多次即可 两两一组

把数组 0 作为 结果。 从数组 1 开始一次遍历，和结果求最大公约数，保存到结果中。 最大公约数使用辗转相除法。

引用 6 楼 kongl123 的回复:如果这一组是大数的话还真不好做。 上面几楼的方法都有问题。。。辗转相除法是可以的，我错了

如果这一组是大数的话还真不好做。 上面几楼的方法都有问题。。。

引用 楼主 qida0911 的回复:输入数字的个数，求他们的最大公约数 如输入len=5 arr{2,4,6,8,10｝ 输出2 arr{2,4,6,8,10｝ 这个是从哪里来的？都是偶数？ 也就是数的列表从哪里来的？ 从2开始的偶数？ 如果是这样，都不用计算了，无论输入什么都是2。。。 如果数列是不确定的。 那么就找到数列中最小的数，递减，再用数列里的数逐个除以这个数，如果都没有余数，那就是最大公约数了。

引用 1 楼 zhao4zhong1 的回复:搜“辗转相除法”这是求两个数的，这里好像不太奏效啊

因式分解一个数，把所有因子作为一个集合，用这个集合和剩下的每个数作比较，把不能整除的因子从集合删除，最后集合中最大的数就是最大公约数

搜“辗转相除法”

引用 10 楼 lm_whales 的回复:N个数，中 n-1，n-2,,,,,2 个数的公约数 一定>= 这N 个数的公约数 所以，公约数，只会越求越小，不会越求越大 所以，只要有办法求两个数的公约数 那么，就可以求出 N个数的公约数， 总的来说，时间复杂度不会很高的 达不到 O(max(N,max(xi))^2) 所以，不需要怎么考虑时间复杂度 甚至也达不到O(N log(max(xi));  修改一下

N个数，中 n-1，n-2,,,,,2 个数的公约数 一定>= 这N 个数的公约数 所以，公约数，只会越求越小，不会越求越大 所以，只要有办法求两个数的公约数 那么，就可以求出 N个数的公约数， 总的来说，时间复杂度不会很高的 达不到 O(max(N,max(xi))) 所以，不需要怎么考虑时间复杂度 甚至也达不到O(N log(max(xi));


Question: 给len个整数，求最小公约数 如给arr {2 4 6 8｝输出为2

做一个求两个数最小公约数的程序  每相邻两个数求最小公约数， 对求出来的最小公约数，再次运用此法 直至求出为止

可以参考一下，我写的代码 #include<iostream> using namespace std;  int main() { 	int arr[1000]; 	int len;  cin >> len; 	for(int i = 0; i < len; i++) 	{ 		cin >> arr[i]; 	} 	int iMAX = 0; //存储最大公约数  	int iMin = INT_MAX; 	 	for(int i = 0; i < len; i++) 	{ 		if(arr[i] < iMin) iMin = arr[i]; 	} 	 	int flag = false; //作为标志  	for(int i = 1; i <= iMin; i++) //iMin存储数组中最小数  	{ 		 		for(int j = 0; j < len; j++) 		{ 			if(arr[j]%i != 0)  			{ 				flag = true; 				break; 			} 		} 		 		if(!flag) 		{ 			iMAX = i; 			flag = false ; 		} 		if(flag) flag = false;			 	} 	cout << iMAX << endl; 	return 0; }

给你一个，时间有点复杂的思路，从1开始到数组中最小的数，看是否有一个数能被所有的整除，如果能，更新关键字，知道 完成遍历！

给len个整数，求最大公约数 如给arr {2 4 6 8｝输出为2，如输入len=5 arr{2,4,6,8,10｝ 输出2  怎么编

给len个整数，求最小公约数 如给arr {2 4 6 8｝输出为2，如输入len=5 arr{2,4,6,8,10｝ 输出2  怎么编

最小

估计写错了 最小公倍数，或者最大公约数

最小公约数不是1么？是求最大公约数吧


Question: 好像不对

靠，答贴怎么变成了发帖，新手晕死


Question: 救命

你那个函数里的s=&k要去掉啊

f函数里的参数是一个形参，百度一下实参和形参的区别可以解。首先s进去是一个指向参数的指针，函数里的第一步，s保存有的全局函数k的地址，下一步，把k的值赋给s指针指向的数，即k


Question: 关于C语言读取数据到TXT

仅供参考：#include <stdio.h> #include <string.h> char s[80]; double d; char c; int main() {     while (1) {         printf("Input a double:");fflush(stdout);         rewind(stdin);         fgets(s,80,stdin);         if (strlen(s)>20) {             printf("Input too long(>20)!\n");             continue;         }         if (2==sscanf(s,"%lf%c",&d,&c)) {             if ('\n'==c) {                 printf("%lg is a double.\n",d);                 break;             }         }         if ('\n'==s[strlen(s)-1]) s[strlen(s)-1]=0;         printf("\"%s\" is NOT a double!\n",s);     }     return 0; }

你这个数组申请的就有问题。 1.用的是char 2.长度也不对，A和B应该是35和4才对

你的程序问题多。  #include <stdio.h> #define A 34 #define B 30   int main() {     char data[A][B];       FILE *fp;//文件指针     fp = fopen("data.txt","r+");//打开TXT文件     if(!fp)         printf("不能找到data.TXT!");//判断是否能打开文件     for(int i=0;i<20;i++)     {         for(int j=0;j<5;j++)             fprintf(fp,"%ld",data[i][j]);//注意使用fprintf,并且data[i][j]，不能取地址     }     fclose(fp);     for(int m = 0;m<20;m++)     {         for(int n = 0;n<5;n++)         {             printf("data[%d][%d]=%ld\n" , m,n,data[m][n]);         }     }     //system("pause");     return 0; }

引用 7 楼 zhao4zhong1 的回复:#include <stdio.h> #define A 35 #define B 4 int main() {     int data[A][B];      FILE *fp;     fp=fopen("data.txt","r");     if(!fp) {         printf("不能找到data.TXT!");         return 1;     }     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             fscanf(fp,"%d",&data[i][j]);     fclose(fp);     for(int i=0;i<A;i++)         for(int j=0;j<B;j++)             printf("data[%d][%d]=%d\n",i,j,data[i][j]);     system("pause");     return 0; }  你好，对于既有整数又有小数的是用%f格式读取嘛

#include <stdio.h> #define A 35 #define B 4 int main() { 	int	data[A][B];  	FILE *fp; 	fp = fopen("data.txt","r"); 	if(!fp)	{ 		printf("不能找到data.TXT!");         return 1;     } 	for(int	i=0;i<A;i++) 		for(int	j=0;j<B;j++) 			fscanf(fp,"%d",&data[i][j]); 	fclose(fp); 	for(int	i =	0;i<A;i++) 		for(int	j =	0;j<B;j++) 			printf("data[%d][%d]=%d\n" , i,j,data[i][j]); 	system("pause"); 	return 0; }

引用 4 楼 zhao4zhong1 的回复:仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8   想将数据读取成二维数组怎么调整，希望能再指教一下

不知道你预期的结果是什么。B的值是3。所以数据的第二个下标有效值最大是2。事实上data〔0〕〔3〕保存的位置其实是data［1］［0］,而data［0］［4］是保存在data［1］［1］中，这样4,和5分别就保存在data［1］［0］和data［1］［1］处，这样当循环到i为1，j为0时，6便被保存在data［1］［0］处。所以会是这样的结果。。。。。。二维数组的保存其实也是连续的。额，可以看看c与指针。会对这块知识有更加深刻的理解


Question: 二进制转换到十进制 一个问题

main函数的while循环后面多了一个分号，去掉就对了  while(c!='#'); //这里多了一个分号！！！！！！！！！！！！！！ { Push(&s,c); scanf("%c",&c); }


Question: C代码运行中报Segmentation fault，求指点

你已经指定协议是HTTPS了，参数中的主机名就不要带https://了，./https_client www.baidu.com试试

引用 2 楼 iyomumx 的回复:这程序没写完吧…… 用法是 https_client <地址> 比如 引用$ ./https_client bbs.csdn.net (1) SSL 上下文初始化完毕  (2) 'bbs.csdn.net' 的IP地址为 '101.200.29.173' 不是程序没写完，是它第（2）步没执行完就报Segmentation fault然后异常退出了

引用 1 楼 user-3 的回复:hostname你传递进去了么 传了呀 ./https_client https://www.baidu.com运行的

hostname你传递进去了么


Question: 请教 如何使用C做一个计算器

#include <stdio.h> #include <math.h> #define clear 1;if(c>=11){c=0;sscanf(_,"%lf%c",&r,&c);while(*++_-c);}\   else if(argc>=4&&!main(4-(*_++=='('),argv))_++;g:c+= #define puts(d,e) return 0;}{double a;int b;char c=(argc<4?d)&15;\   b=(*_%__LINE__+7)%9*(3*e>>c&1);c+= #define I(d) (r);if(argc<4&&*#d==*_){a=r;r=usage?r*a:r+a;goto g;}c=c #define return if(argc==2)printf("%f\n",r);return argc>=4+ #define usage main(4-__LINE__/26,argv) #define calculator *_*(int) #define l (r);r=--b?r: #define _ argv[1] #define x  double r; int main(int argc,char** argv){   if(argc<2){     puts(       usage: calculator 11/26+222/31       +~~~~~~~~~~~~~~~~~~~~~~~~calculator-\       !                          7.584,367 )       +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+       ! clear ! 0 ||l   -x  l   tan  I (/) |       +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+       ! 1 | 2 | 3 ||l  1/x  l   cos  I (*) |       +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+       ! 4 | 5 | 6 ||l  exp  l  sqrt  I (+) |       +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~+       ! 7 | 8 | 9 ||l  sin  l   log  I (-) |       +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(0     );   }   return 0; }  请仔细研读（逃

这代码看得好熟悉，回去复制一份给你。。。。。。。

仅供参考：/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console) 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数^     ⑿向上取整ceil     ⒀向下取整floor     ⒁四舍五入取整round 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab=0x9; const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int pcs=15; double round(double dVal, short iPlaces) {//iPlaces>=0     char s[30];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } double fun(double x,char op[],int *iop) {     while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop-1]) {         case  7: x=sin(x);    (*iop)--;break;         case  8: x=cos(x);    (*iop)--;break;         case  9: x=tan(x);    (*iop)--;break;         case 10: x=sqrt(x);   (*iop)--;break;         case 11: x=asin(x);   (*iop)--;break;         case 12: x=acos(x);   (*iop)--;break;         case 13: x=atan(x);   (*iop)--;break;         case 14: x=log10(x);  (*iop)--;break;         case 15: x=log(x);    (*iop)--;break;         case 16: x=exp(x);    (*iop)--;break;         case 17: x=ceil(x);   (*iop)--;break;         case 18: x=floor(x);  (*iop)--;break;         case 19: x=round(x,0);(*iop)--;break;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={"sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round",NULL};     double ST[10]={0.0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*rexp,*pp,*pf;     int ist=1,iop=1,last,i;      if (!deep) {         pp=pf=expr;         do {             c = *pp++;             if (c!=' '&& c!=Tab)                 *pf++ = c;         } while (c!='\0');     }     pp=expr;     if ((c=*pp)=='-'||c=='+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c=*pp)!='\0') {         if (c=='(') {//左圆括弧             deep++;             ST[ist++]=calc(++pp,addr);             deep--;             ST[ist-1]=fun(ST[ist-1],op,&iop);             pp = *addr;             last = DIGIT;             if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }         else if (c==')') {//右圆括弧             pp++;             break;         } else if (isalpha(c)) {             if (!strnicmp(pp,"Pi",2)) {                 if (last==DIGIT) {                     cout<< "π左侧遇）" <<endl;exit(1);                 }                 ST[ist++]=3.14159265358979323846264338328;                 ST[ist-1]=fun(ST[ist-1],op,&iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp,"Pi",2)) {                     cout<< "两个π相连" <<endl;exit(2);                 }                 if (*pp=='(') {                     cout<< "π右侧遇（" <<endl;exit(3);                 }             } else {                 for (i=0; (pf=fname[i])!=NULL; i++)                     if (!strnicmp(pp,pf,strlen(pf))) break;                 if (pf!=NULL) {                     op[iop++] = 07+i;                     pp += strlen(pf);                 } else {                     cout<< "陌生函数名" <<endl;exit(4);                 }             }         } else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^') {             char cc;             if (last != DIGIT) {                 cout<< "运算符粘连" <<endl;exit(5);             }             pp++;             if (c=='+'||c=='-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] += ST[ist];break;                     case '-':  ST[ist-1] -= ST[ist];break;                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*'||c=='/'||c=='%') { operate:        cc = op[iop-1];                 if (cc=='+'||cc=='-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 }             } else {                 cc = op[iop-1];                 if (cc=='^') {                     cout<< "乘幂符连用" <<endl;exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 cout<< "两数字粘连" <<endl;exit(7);             }             ST[ist++]=strtod(pp,&rexp);             ST[ist-1]=fun(ST[ist-1],op,&iop);             if (pp == rexp) {                 cout<< "非法字符" <<endl;exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '('||isalpha(*pp)) {                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }     }     *addr=pp;     if (iop>=ist) {         cout<< "表达式有误" <<endl;exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] += ST[ist];break;         case '-':  ST[ist-1] -= ST[ist];break;         case '*':  ST[ist-1] *= ST[ist];break;         case '/':  ST[ist-1] /= ST[ist];break;         case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;         case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     int a;      if (argc<2) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else if (argc==2 && 0==strcmp(argv[1],"/?")) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算由≥1个命令行参数给出的函数表达式的值。最后一个参数是.0～.15表示将计算结果保留小数0～15位"<<endl<<"支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>2) {             for (a=2;a<argc-1;a++) strncat(s,argv[a],MAXLEN-1);//将空格间隔的各参数连接到s             if (1==sscanf(argv[a],".%d",&pcs) && 0<=pcs && pcs<=15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n",pcs,calc(s,&endss));             } else {                 strncat(s,argv[a],MAXLEN-1);                 printf("%.15lg\n",calc(s,&endss));             }         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     return 0; }


Question: C语言从TXT读取数字，包含空格和换行

首先，程序中数组越界了，这是这个程序最主要的问题。 其次，这个程序还有一个潜藏的问题，就是静态分配了一个大的二维数组。目前来说A和B还不算太大，所以这个问题没有充分暴露出来。如果A和B再大一点，这种静态分配大数组的方式应该是行不通的，编译器会报错。所以最好采用动态内存分配。

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

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8   #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

fgets 读取一行 再去分隔读取

你定义的数组最大下标是data[241][183],而不是data[242][184]，数组越界了

可以自己调试一下，看看data里面的值


Question: labwindows初学者（希望大神帮帮忙！！！）

提示的很清楚了：参数类型不对。


Question: 函数中字符串返回的问题

在主函数释放，或等到进程退出时让操作系统帮你释放，不会死人的。

引用 2 楼 zhao4zhong1 的回复:malloc、realloc、free 引用 3 楼 qq423399099 的回复:返回生命周期结束的变量是不行的。 在函数内malloc就行了，然后返回malloc出来的首地址 然而这样就要在主函数才释放了……

malloc、realloc、free

std::string？？？