Question: PAT basic 1044火星文字

边界条件 输入输出格式 ……

#include <stdio.h> #include <stdlib.h> #include <string.h>   static char *fire_digit[13] = { "tret", "jan", "feb",     "mar", "apr", "may",     "jun", "jly", "aug",     "sep", "oct", "nov",     "dec" };  static char *carray_digit[12] = {   "tam", "hel", "maa",     "huh", "tou", "kes",     "hei", "elo", "syy",     "lok", "mer", "jou" };  static char *digit = "0123456789";  #define FIRE_NUM     (sizeof(fire_digit)/sizeof(fire_digit[0]))  void divide_str(char *str, char **part1, char **part2);  int main(void) {     char str[32];     char *p = NULL, *q = NULL;     int time, num;     int i, j;      scanf("%d", &time);     getchar();    /*for '\n' */      for (i = 0; i < time; i++) {         fgets(str, 32, stdin);         str[strlen(str)-1] = 0;         if (strchr(digit, str[0])) {             num = atoi(str);             printf("num = %d\n", num);             if (num >= 0 && num < 169) {                 printf("%s ", carray_digit[num / FIRE_NUM-1]);                 printf("%s\n", fire_digit[num % FIRE_NUM]);             }         } else {             divide_str(str, &p, &q);             num = 0;             if (p && q) {                 for (j = 0; j < FIRE_NUM -1; j++)                     if (strcmp(p, carray_digit[j]) == 0) {                         num += (j + 1) * FIRE_NUM;                         break;                     }                 for (j = 0; j < FIRE_NUM; j++)                     if (strcmp(q, fire_digit[j]) == 0) {                         num += j;                         break;                     }             } else {                 for (j = 0; j < FIRE_NUM; j++)                     if (strcmp(q, fire_digit[j]) == 0) {                         num += j;                     }             }             printf("%d\n", num);         }     }      return 0; }  void divide_str(char *str, char **part1, char **part2) {     int i = 0;      while (str[i] == ' ')         i++;      *part1 = str + i;     for (; str[i]; i++) {         if (str[i] == ' ') {             str[i] = 0;             *part2 = str + i + 1;             break;         }     } } 参考一下吧

引用 1 楼 cfjtaishan 的回复:这个题目的要求是什么？什么是火星文字，不明白。代码有点乱，逻辑不是很清楚。建议，把需求贴出来吧


Question: ACM中遇到的有个问题  不是很理解  一个getchar()解决的问题  为什么加上getchar()就AC了  没有就报错

这个问题可能跟题目本身的数据有关，个人刷过的题这样的写法一般能A

谢谢您， 以后记得及时使用

谢谢您  我只是个小白  不懂这么多  以后多问多学

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

getchar() 大部分情况下是 get 输入后的那个会车，空格啥的

个人认为（通过测试）getchar()这句可有可无。 在某些代码里，加上getchar()是为了获取残留在输入缓存里的回车符，但是下面是用scanf("%s")输入的，如果用gets或fgets，那么这句getchar();是必须的，因为残留在输入缓存里的回车符会直接让第一输入为空串，gets和fgets都是遇到回车符直接退出。


Question: GCC 编译出现一个.c文件出现 as: unrecognized option '--64'

你的虚拟机是不是安装了linux64位的系统，结果在VMware把配置改成内存低于了4GB，64位系统支持4Gb内存以上

引用 6 楼 fussier 的回复:把系统能update的都update一下，或者是不是 .bashrc里设置了太多arm-gcc-none-eabi的路径了？ https://stackoverflow.com/questions/42205916/as-unrecognized-option-64   问题解决了 是我不小心在什么时候把环境变量GCC的连接器删除了   .barshrc 文件添加这句话就好了 export PATH=/usr/x86_64-linux-gnu/bin:$PATH

引用 3 楼 zhao4zhong1 的回复:命令行参数中的--64改为-m64 我试过了  gcc  -m64  hello.c还是不行  但是 预处理 编译 汇编 连接   编译时出现了gcc: warning: scan: linker input file unused because linking not done 这样的错误

引用 2 楼 qq_31019981 的回复:就是一个只打印 hello world 的程序没什么好看的  这个因该是一个编译器选项的问题 那要看你的怎么操作的，这个error提示如果跟代码没关系，那么至少给你编译器环境和你的编译操作有关系。 如果只是提出这样的error信息，而不提供更多有效的提示，除非和你一样遇到这样的问题，否则单纯靠猜测，也不很现实。

命令行参数中的--64改为-m64

还是看代码吧


Question: 新手编一个程序时，循环输出数组是总会输成另一个字符串，求指教


Question: 阶乘和数问题,想知道我的代码哪里错啦?

厉害,中间那个while用的太好了

#include<stdio.h>  #define     MAX_NUM     10000  long stratum(int x) {     int i, val = 1;     if(x == 0) {         val = 0;          return 0;     }     for(i = 1; i <= x; i++)         val = val * i;     return val; }  int  main() {     int i;     int num, total = 0;      for (i = 1; i < MAX_NUM; i++) {         num = i;          while (num) {             total += stratum(num % 10);             num /= 10;         }          if (total == i) {             printf("%d\t", i);         }         total = 0;     }     putchar(10);      return 0; }


Question: 求助  可见光室内定位装置

引用 5 楼 wangwangpengpeng 的回复:电赛题目我也正在想你想出来了吗

这不是大学生电子竞技大赛的题目吗？

各位大神，求解答、、、

期待脑洞大开的那一刻

同问同问同问同问同问

电赛题目我也正在想

百度或百度图片搜相关关键字。

40分就想买个答案，也太容易了


Question: C 函数调用、头文件声明、编译链接相关问题

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

引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 qq_31849783 的回复:] [quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 qq_38204686 的回复:] 你把fun放下面试试 为啥非得放main上面 楼主是两个源文件：b.c放func函数定义，test.c是main的定义和调用func函数。不是在一个源文件里。 楼主的这个问题，func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前，就类似func在main函数前定义。 个人见解，欢迎指正。[/quote]  应该是编译的问题，你运行这个程序了没有，什么结果？[/quote] 这个程序不复杂，输入两个值，得到是这两个值的和。 [/quote]  我的意思是你按照我那样做，程序是不是也能正常运行，我想看看你们的都是什么情况

引用 6 楼 qq_31849783 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] [quote=引用 1 楼 qq_38204686 的回复:] 你把fun放下面试试 为啥非得放main上面 楼主是两个源文件：b.c放func函数定义，test.c是main的定义和调用func函数。不是在一个源文件里。 楼主的这个问题，func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前，就类似func在main函数前定义。 个人见解，欢迎指正。[/quote]  应该是编译的问题，你运行这个程序了没有，什么结果？[/quote] 这个程序不复杂，输入两个值，得到是这两个值的和。

引用 2 楼 cfjtaishan 的回复:[quote=引用 1 楼 qq_38204686 的回复:] 你把fun放下面试试 为啥非得放main上面 楼主是两个源文件：b.c放func函数定义，test.c是main的定义和调用func函数。不是在一个源文件里。 楼主的这个问题，func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前，就类似func在main函数前定义。 个人见解，欢迎指正。[/quote]  应该是编译的问题，你运行这个程序了没有，什么结果？

引用 4 楼 shetougong 的回复:如果你之前没有进行fun函数的宏定义应该是运行不成功的，编译阶段会在内核中将每个函数编译成一个号码，在Linux下用nm命令可看到每个函数在编译时的号码。 nm操作    nm+可执行文件名（如 nm   a.out）  那我还是截个图把，看着方便些    用的VS2013，就建了这两个.c文件

楼上很有道理 可能就是编译器的事 我试了一下报错 并不能运行 建议楼主贴出完整代码  大概你的编译器比较高级？

引用 1 楼 qq_38204686 的回复:你把fun放下面试试 为啥非得放main上面 楼主是两个源文件：b.c放func函数定义，test.c是main的定义和调用func函数。不是在一个源文件里。 楼主的这个问题，func函数本身就是定义和声明。在编译的时候应该是编译b.c在test.c前，就类似func在main函数前定义。 个人见解，欢迎指正。

你把fun放下面试试 为啥非得放main上面


Question: 中文版的C语言

这样写好吗？？？？

感觉能做出来这个编译器很厉害哟

为什么不出一个梵文版的C语言再去找联合国教科文组织申请非物质文化遗产呢？！

听说过         。

引用 4 楼 zhao4zhong1 的回复:为什么不出一个梵文版的C语言再去找联合国教科文组织申请非物质文化遗产呢？！  就是字符串替换，梵语版的话，换个配置文件就ok了

做出来这个编译器很厉害哟我支持

从前不是有个“易语言”吗？相比C语言进步的地方在哪？

这个有市场吗？做东西应该考虑意义，实用吧 不过，能做出来还是挺厉害的。


Question: 学C语言后的迷茫？

不要想太多，你学C语言只是为了学习编程和计算机的基础，并不一定就要用它做什么实际的东西。

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

便底层的开发！比如算法相关、服务器相关等...

相当于盖房子打地基一样

入门，让你知道计算机是干嘛的，怎么运行的，有一个大致的了解。

编程开发的基础，攻城狮的语言，程序猿的饭碗。

C语言一般作为学习程序设计的第一门语言，可以学习程序设计的基本逻辑，以及C系语言（C、C++、C#、Java等）的基本语法，学好C语言就是打下了良好基础，然后看你以后想做什么，比如做游戏，可以进一步学习C++，做桌面客户端软件，可以学习C++或者C#，做Web应用，可以学习Java或者C#，等等。

C语言主要是偏底层，比如驱动；另外，就是后台，做后台的开发也可以用C。 嵌入式方向，是C语言的专项。


Question: 新人求助

输入的逗号是不是中文里的逗号？注意将输入法切换至英文。 先保证你的输入数据都写到内存的a,b,c变量里了。建议在scanf后面将3个变量值打印出来。

[img=https://img-bbs.csdn.net/upload/201708/09/1502275873_696691.png] 为什么还是不对？

scanf("%d %d",&a,&b); 格式如上  详情百度

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

scanf的写法不对。


Question: 求教 c

引用 8 楼 wyyy2088511 的回复:[quote=引用 7 楼 flamesP 的回复:] [quote=引用 5 楼 wyyy2088511 的回复:] #include <stdio.h> #include <string.h> #include <ctype.h> #define MAXLINE 1000 int getline(char line[],int max); int strindex(char sourse[],char searchfor[]);  char v[]="ould";  char pattern[]="ould";  int main() { 	char line[5][MAXLINE]={0}; 	int found=0;  	for(int i=0; i<5; i++) 	{ 		getline(line[i],MAXLINE); 	 	} 	for(int i=0; i<5; i++) 	{ 		if(strindex(line[i],pattern)>=0) 		{ 			printf("%s",line[i]); 			//found++; 		} 	} 		getchar(); 		return found; } int getline(char s[],int lim) { 	int c,i;  	i=0; 	while(--lim>0&&(c=getchar())!=EOF&&c!='\n') 		s[i++]=c; 	if(c=='\n') 		s[i++]=c; 	return i; }  int strindex(char s[],char t[]) { 	int i,j,k; 	for(i=0;s[i]!='\0';i++){  		for(j=i,k=0;t[k]!='\0'&&s[j]==t[k];j++,k++); 		if(k>0&&t[k]=='\0') 			return i; 	} 	return -1; }  如果想输入比较大，数组改大点，或者用vector。   [/quote]strindex在main之前已经声明过的，我是在vs下编译的，没有问题。[/quote]  我用的是dev

引用 9 楼 zhao4zhong1 的回复:int strindex(char sourse[],char searchfor[]); 和 int strindex(char *sourse,char *searchfor); 不是一回事！  不懂

引用 7 楼 flamesP 的回复:[quote=引用 5 楼 wyyy2088511 的回复:] #include <stdio.h> #include <string.h> #include <ctype.h> #define MAXLINE 1000 int getline(char line[],int max); int strindex(char sourse[],char searchfor[]);  char v[]="ould";  char pattern[]="ould";  int main() { 	char line[5][MAXLINE]={0}; 	int found=0;  	for(int i=0; i<5; i++) 	{ 		getline(line[i],MAXLINE); 	 	} 	for(int i=0; i<5; i++) 	{ 		if(strindex(line[i],pattern)>=0) 		{ 			printf("%s",line[i]); 			//found++; 		} 	} 		getchar(); 		return found; } int getline(char s[],int lim) { 	int c,i;  	i=0; 	while(--lim>0&&(c=getchar())!=EOF&&c!='\n') 		s[i++]=c; 	if(c=='\n') 		s[i++]=c; 	return i; }  int strindex(char s[],char t[]) { 	int i,j,k; 	for(i=0;s[i]!='\0';i++){  		for(j=i,k=0;t[k]!='\0'&&s[j]==t[k];j++,k++); 		if(k>0&&t[k]=='\0') 			return i; 	} 	return -1; }  如果想输入比较大，数组改大点，或者用vector。   [/quote]strindex在main之前已经声明过的，我是在vs下编译的，没有问题。

引用 5 楼 wyyy2088511 的回复:#include <stdio.h> #include <string.h> #include <ctype.h> #define MAXLINE 1000 int getline(char line[],int max); int strindex(char sourse[],char searchfor[]);  char v[]="ould";  char pattern[]="ould";  int main() { 	char line[5][MAXLINE]={0}; 	int found=0;  	for(int i=0; i<5; i++) 	{ 		getline(line[i],MAXLINE);  	} 	for(int i=0; i<5; i++) 	{ 		if(strindex(line[i],pattern)>=0) 		{ 			printf("%s",line[i]); 			//found++; 		} 	} 		getchar(); 		return found; } int getline(char s[],int lim) { 	int c,i;  	i=0; 	while(--lim>0&&(c=getchar())!=EOF&&c!='\n') 		s[i++]=c; 	if(c=='\n') 		s[i++]=c; 	return i; }  int strindex(char s[],char t[]) { 	int i,j,k; 	for(i=0;s[i]!='\0';i++){  		for(j=i,k=0;t[k]!='\0'&&s[j]==t[k];j++,k++); 		if(k>0&&t[k]=='\0') 			return i; 	} 	return -1; }  如果想输入比较大，数组改大点，或者用vector。

引用 3 楼 fussier 的回复:[quote=引用 2 楼 fussier 的回复:]  if(c=='\n') s[i++]=c;   改成  if(c=='\n') s[i++]=‘\0’;   strindex 第二个for循环后面有个逗号，我不知道这是不是有意为之，问一下这个函数是干啥的吗？  分号，说错了[/quote]  你的改动好像还是不行 sringdex函数中的第二个for循环后的分号是必要的，它执行的是一个空循环。这个函数的作用是寻找输入中是否含有'ould'字符 如果有，则返回ould在输入字符中第一次出现的位置并打印

建立一个二维数组，多次输入，然后保存起来，再进行ould比较包含字串的打印出来。

引用 2 楼 fussier 的回复: if(c=='\n') s[i++]=c;   改成  if(c=='\n') s[i++]=‘\0’;   strindex 第二个for循环后面有个逗号，我不知道这是不是有意为之，问一下这个函数是干啥的吗？  分号，说错了

建议用二维数组


Question: 求大神看看，为什么这个归并排序运行错误？？？感觉问题出在new和delete的地方，但是不知道为什么？

没人来看吗？自己顶

大神快来看看啊，折磨了我一下午，clion单步调试有时候能过有时候过不了，好神奇


Question: 求 c/c++大神帮助

C Bit Fields In addition to declarators for members of a structure or union, a structure declarator can also be a specified number of bits, called a “bit field.” Its length is set off from the declarator for the field name by a colon. A bit field is interpreted as an integral type.   Syntax  struct-declarator :  declarator type-specifier declarator opt : constant-expression  The constant-expression specifies the width of the field in bits. The type-specifier for the declarator must be unsigned int, signed int, or int, and the constant-expression must be a nonnegative integer value. If the value is zero, the declaration has no declarator. Arrays of bit fields, pointers to bit fields, and functions returning bit fields are not allowed. The optional declarator names the bit field. Bit fields can only be declared as part of a structure. The address-of operator (&) cannot be applied to bit-field components.   Unnamed bit fields cannot be referenced, and their contents at run time are unpredictable. They can be used as “dummy” fields, for alignment purposes. An unnamed bit field whose width is specified as 0 guarantees that storage for the member following it in the struct-declaration-list begins on an int boundary.   Bit fields must also be long enough to contain the bit pattern. For example, these two statements are not legal:  short a:17;        /* Illegal! */ int long y:33;     /* Illegal! */  This example defines a two-dimensional array of structures named screen.   struct  {     unsigned short icon : 8;     unsigned short color : 4;     unsigned short underline : 1;     unsigned short blink : 1; } screen[25][80];  The array contains 2,000 elements. Each element is an individual structure containing four bit-field members: icon, color, underline, and blink. The size of each structure is two bytes.  Bit fields have the same semantics as the integer type. This means a bit field is used in expressions in exactly the same way as a variable of the same base type would be used, regardless of how many bits are in the bit field.   Microsoft Specific —>  Bit fields defined as int are treated as signed. A Microsoft extension to the ANSI C standard allows char and long types (both signed and unsigned) for bit fields. Unnamed bit fields with base type long, short, or char (signed or unsigned) force alignment to a boundary appropriate to the base type.  Bit fields are allocated within an integer from least-significant to most-significant bit. In the following code   struct mybitfields {     unsigned short a : 4;     unsigned short b : 5;     unsigned short c : 7; } test;  void main( void ); {     test.a = 2;     test.b = 31;     test.c = 0; }  the bits would be arranged as follows:  00000001 11110010 cccccccb bbbbaaaa  Since the 8086 family of processors stores the low byte of integer values before the high byte, the integer 0x01F2 above would be stored in physical memory as 0xF2 followed by 0x01.  END Microsoft Specific

quint32这个是数据类型；crc变量，后面冒号和1，表示变量占1位（32位中的一位），这个值只有两个值（1或0）；


Question: 求大神指点以下代码

搜“VBA for AutoCAD”？

老师，我是做结构设计的，画图画多了想提高效率学习点CAD的编写插件，但是入不得门。

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！  注释掉所有On Error Resume Next语句，在VB6 IDE中运行， 出错后点击调试，光标会停在出错的那条语句处， 或者 事先在怀疑可能有逻辑错误的语句处设置断点，运行经过断点时中断，  此时可以在立即窗口中使用 ?变量名 或 ?函数名(函数参数) 或 过程名(参数) 辅助调试。

'打开文件   Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long Private Const SW_SHOW = 5 '-------------------切换线程------------- Private Declare PtrSafe Function GetWindowThreadProcessId Lib "user32" _     (ByVal hwnd As Long, lpdwProcessId As Long) As Long Private Declare PtrSafe Function AttachThreadInput Lib "user32" _     (ByVal idAttach As Long, ByVal idAttachTo As Long, ByVal fAttach As Long) As Long Private Declare PtrSafe Function GetForegroundWindow Lib "user32" () As Long Private Declare PtrSafe Function SetForegroundWindow Lib "user32" (ByVal hwnd As Long) As Long Private Declare PtrSafe Function IsIconic Lib "user32" (ByVal hwnd As Long) As Long Private Declare PtrSafe Function ShowWindow Lib "user32" _     (ByVal hwnd As Long, ByVal nCmdShow As Long) As Long  'Private Const SW_SHOW = 5  '与打开文件里面的重复了，这里取消 Private Const SW_RESTORE = 9 '-------------------切换线程------------- Sub 批量替换()  Dim i As Integer    On Error Resume Next     FileCopy ThisDrawing.Path & "\PiLiangTiHuan.dll", "C:\WINDOWS\system32\PiLiangTiHuan.dll"   Shell "regsvr32   /s   PiLiangTiHuan.dll"       Err.Clear        Dim xlApp As Object, xlSheet As Object            Set xlApp = GetObject(, "Excel.Application")        If Err Then      Err.Clear     Set xlApp = GetObject(, "ET.Application")                 End If        If Err Then        Err.Clear             ShellExecute MyhWnd, "open", ThisDrawing.Path & "\TT_AutoCAD文字自动替代.xls", vbNullString, vbNullString, SW_SHOW       GoTo QueDingSheet          End If          If xlApp.Workbooks.Count > 0 Then     For i = 1 To xlApp.Workbooks.Count                           If InStr(xlApp.Workbooks(i).Name, "TT_AutoCAD文字自动替代") > 0 Then           Set xlSheet = xlApp.Workbooks(i).ActiveSheet           GoTo QueDingSheet                    End If      Next          End If          Err.Clear           ShellExecute MyhWnd, "open", ThisDrawing.Path & "\TT_AutoCAD文字自动替代.xls", vbNullString, vbNullString, SW_SHOW            QueDingSheet:                  ForceForegroundWindow Application.hwnd         Dim objForm As Object      ' New PiLiangTiHuan.TiHuan        Set objForm = CreateObject("PiLiangTiHuan.TiHuan")     Set objForm.Application = Application          DoEvents          objForm.ShowFormMain       Err.Clear     End Sub  Private Sub AcadDocument_Activate()   On Error Resume Next  FileCopy ThisDrawing.Path & "\PiLiangTiHuan.dll", "C:\WINDOWS\system32\PiLiangTiHuan.dll"   Shell "regsvr32   /s   PiLiangTiHuan.dll"       Err.Clear    批量替换 End Sub Public Function ForceForegroundWindow(ByVal hwnd As Long) As Boolean    Dim ThreadID1 As Long    ' 线程ID    Dim ThreadID2 As Long    ' 线程ID    Dim nRet As Long        ' 如果指定的窗体已经在前台，不做任何操作    If hwnd = GetForegroundWindow() Then       ForceForegroundWindow = True    Else       ' 首先获得指定窗体相关的线程和当前前台窗口所在的线程       ThreadID1 = GetWindowThreadProcessId(GetForegroundWindow, ByVal 0&)       ThreadID2 = GetWindowThreadProcessId(hwnd, ByVal 0&)              ' 通过共享输入状态，两个线程分享当前窗口       If ThreadID1 <> ThreadID2 Then          Call AttachThreadInput(ThreadID1, ThreadID2, True)          nRet = SetForegroundWindow(hwnd)          Call AttachThreadInput(ThreadID1, ThreadID2, False)       Else          nRet = SetForegroundWindow(hwnd)       End If              ' 恢复和重画       If IsIconic(hwnd) Then          Call ShowWindow(hwnd, SW_RESTORE)       Else          Call ShowWindow(hwnd, SW_SHOW)       End If              ' 精确地返回函数执行结果       ForceForegroundWindow = CBool(nRet)    End If End Function     'Private Sub AcadDocument_EndCommand(ByVal CommandName As String)    '  On Error GoTo errhand    'If CommandName = "VBALOAD" Or CommandName = "VBAMAN" Or CommandName = "APPLOAD" Or CommandName = "COMMANDLINE" Then  '   Dim objForm As New PiLiangTiHuan.TiHuan  '   Set objForm.Application = Application  '   objForm.ShowFormMain 'End If  'errhand: 'If Err.Number = 0 Then   ' Else      '  MsgBox Err.Description & Err.Number        '  Err.Clear      'End If    'End Sub Private Sub AcadDocument_BeginDoubleClick(ByVal PickPoint As Variant)   批量替换 End Sub 帮我看下这个吧

VB上学那会学过，早忘了

VB，能加你QQ么？现在程序我网上已经找到了，但是调试的时候老是显示.hwnd处类型不匹配。如何破

这是什么语言的语法？看着不是C语言的


Question: 编写一个c语言程序，实现快速查作业文件

引用 2 楼 qq_38871638 的回复:[quote=引用 1 楼 自信男孩的回复:]建议先从网上查查，要么自己先构思一下； 拷贝文件，简单的办法是打开文件，在另一目录里创建一个文件，然后打开。最后，一个从A文件里读，写道B文件里。（A和B文件名字一样，但是路径不一样）关闭文件完成。 主要是得根据产品序列号找出对应的文件 然而文件名除了序列号还有其他的[/quote] 就是文件名里有产品序列号，还有其他信息，那么先遍历源目录下的文件名，有一个办法能获取某目录下的文件名；  #include <stdio.h> #include <string.h> #include <sys/types.h> #include <errno.h> #include <dirent.h>  int main(int argc, char *argv[]) {     if (argc < 2) {         fprintf(stdout, "Usage: too few paramters!\n");         return 0;     }      DIR *dp = NULL;      dp = opendir(argv[1]);     if (!dp) {         fprintf(stderr, "opendir: %s\n", strerror(errno));         return 0;     }      struct dirent *dirp;     while ((dirp = readdir(dp))) {         if (strcmp(dirp->d_name, ".") == 0 || strcmp(dirp->d_name, "..") == 0)             continue;         printf("%s\n", dirp->d_name);     }     closedir(dp);      return 0; } 显示目录下的所有文件（除了.和..)

仅供参考：//将c:\\tmp文件夹下的所有文件的内容全部放到用malloc分配的内存中 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> struct FB {     char fn[256];     size_t fl;     char *b;     struct FB *next;     struct FB *prev; } *fh,*fb,*ft; char ln[256]; char fpn[256]; FILE *af; FILE *f; int L,n; int main() {     system("dir /b /a-d c:\\tmp\\*.* >c:\\allfn.txt");     af=fopen("c:\\allfn.txt","r");     if (NULL==af) {         printf("Can not open file c:\\allfn.txt!\n");         return 1;     }     fh=NULL;     fb=NULL;     n=0;     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         printf("read %s\n",ln);         strcpy(fpn,"c:\\tmp\\");         strcat(fpn,ln);         ft=(struct FB *)malloc(sizeof(struct FB));         if (NULL==ft) {             printf("Can not malloc ft!\n");             fclose(af);             return 2;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]==%p\n",n,ft);         strcpy(ft->fn,fpn);         f=fopen(fpn,"rb");         if (NULL==f) {             printf("Can not open file %s!\n",fpn);             fclose(af);             return 3;//之前的malloc在main退出后由操作系统自动free         }         ft->fl=_filelength(fileno(f));         ft->b=malloc(ft->fl);         if (NULL==ft->b) {             printf("Can not malloc ft->b!\n");             fclose(f);             fclose(af);             return 4;//之前的malloc在main退出后由操作系统自动free         }         printf("ft[%d]->b==%p\n",n,ft->b);         if (ft->fl!=fread(ft->b,1,ft->fl,f)) {             printf("fread error!\n");             fclose(f);             fclose(af);             return 5;//之前的malloc在main退出后由操作系统自动free         }         fclose(f);         ft->next=NULL;          if (NULL==fh) {             ft->prev=NULL;             fh=ft;         } else {             fb->next=ft;             ft->prev=fb;         }         fb=ft;         n++;     }     fclose(af);     printf("-----list-----\n");     for (ft=fh;NULL!=ft;ft=ft->next) {         printf("%8d %s\n",ft->fl,ft->fn);         if (NULL!=ft) fb=ft;     }     printf("-----free-----\n");     n--;     if (NULL!=fh) {         for (ft=fb->prev;NULL!=ft;ft=ft->prev) {             if (NULL!=ft->next->b) {                 printf("ft[%d]->b==%p\n",n,ft->next->b);                 free(ft->next->b);             }             if (NULL!=ft->next) {                 printf("ft[%d]==%p\n",n,ft->next);                 free(ft->next);             }             n--;         }         if (NULL!=fh->b) {             printf("ft[0]->b==%p\n",fh->b);             free(fh->b);         }         printf("ft[0]==%p\n",fh);         free(fh);     }     return 0; } //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //找不到文件 // //C:\tmp\tmp\Debug>tmp //找不到文件 //-----list----- //-----free----- // //C:\tmp\tmp\Debug>dir /a-d c:\tmp // 驱动器 C 中的卷是 C_HD5_1 // 卷的序列号是 1817-D526 // // c:\tmp 的目录 // //2011-06-30  18:04            44,840 my_c.rar //2011-06-30  17:18             1,036 err.frm //2011-06-30  14:32            14,243 出租.txt //2011-06-28  12:08            23,681 MSDN98书签.txt //             4 个文件         83,800 字节 //             0 个目录 17,041,870,848 可用字节 // //C:\tmp\tmp\Debug>tmp //read my_c.rar //ft[0]==00421800 //ft[0]->b==00520068 //read err.frm //ft[1]==00421670 //ft[1]->b==0052AFC0 //read 出租.txt //ft[2]==00421530 //ft[2]->b==00378F28 //read MSDN98书签.txt //ft[3]==004213F0 //ft[3]->b==0052B3F8 //-----list----- // 44840 c:\tmp\my_c.rar //  1036 c:\tmp\err.frm // 14243 c:\tmp\出租.txt // 23681 c:\tmp\MSDN98书签.txt //-----free----- //ft[3]->b==0052B3F8 //ft[3]==004213F0 //ft[2]->b==00378F28 //ft[2]==00421530 //ft[1]->b==0052AFC0 //ft[1]==00421670 //ft[0]->b==00520068 //ft[0]==00421800 // //C:\tmp\tmp\Debug>

引用 3 楼 实娃星哥的回复:遍历文件夹里的文件，取得文件名查找是否包含指定的序列号，匹配到以后复制到其他文件夹 大神 程序怎么写， 我是菜鸟，不太会

引用 1 楼 自信男孩的回复:建议先从网上查查，要么自己先构思一下； 拷贝文件，简单的办法是打开文件，在另一目录里创建一个文件，然后打开。最后，一个从A文件里读，写道B文件里。（A和B文件名字一样，但是路径不一样）关闭文件完成。 主要是得根据产品序列号找出对应的文件 然而文件名除了序列号还有其他的


Question: 我想问一下以后做游戏开发 需要看什么

引用 2 楼 zhao4zhong1 的回复:Unity3D https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=detail&fr=&hs=0&xthttps=111111&sf=1&fmq=1502337506715_R&pv=&ic=0&nc=1&z=&se=&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=Unity3D

想入坑游戏编程可以先从纯C/C++小游戏开始（比较简单，全部自己代码控制，理解原理，手工作坊），然后过渡到游戏引擎（较大的游戏，美工、逻辑关卡、代码等多人合作，工业化组装）。  仅供参考： 学C++还是C#、Java？  http://blog.163.com/tab_98/blog/static/11924097201511274543737/  用VC的话， Windows游戏程序设计基础 　秦海玉 数据结构课程设计编程实例:基于Win32 API编程 　厉旭杰 游戏开发设计基础教程 　屈喜龙  游戏编程入门 　莫里森  （例子、技术点很不错） 以上几本还可以。 游戏程序设计教程:从游戏引擎构建到实际应用 　万立中 这本书教手动打造一个游戏引擎，包含了游戏有关的Windows程序设计的内容。 游戏设计概论(第4版) 　胡昭民 这本书侧重基础概念和理论。

这到开发游戏还有一段很长的历程，建议先将语言基础学好了，从简单的游戏逻辑开始。 现在还是多写，多调，多想和多总结。


Question: linux c gsoap 接收为循环结构体，请问帮忙看一下如何取值

引用 1 楼 user-1 的回复：取出body 内容，解析xml感谢，后来直接用gsoap解析出来了

请问gsoap这个怎么取出：   xml如下 <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">    <soap:Body>       <ns2:submitResponse xmlns:ns2="http://www.longshine.com/aig">          <return>             <success>true</success>             <dbset>                <r>                   <c n="mobile">                      <value>15210156146</value>                   </c>                   <c n="orgno">                      <value>144010501</value>                   </c>                   <c n="rtncode">                      <value>1000</value>                   </c>                   <c n="rtnmsg">                      <value>执行成功</value>                   </c>                </r>             </dbset>          </return>       </ns2:submitResponse>    </soap:Body> </soap:Envelope>

取出body 内容，解析xml


Question: C语言如何对图片base64编码后的字符串进行解码？

引用 9 楼 zwfgdlc的回复:[quote=引用 8 楼 lonmecy 的回复:] [quote=引用 7 楼 zwfgdlc 的回复:]  #include <atlenc.h>  	FILE* fp; 	fopen_s(&fp, "h:\\123.jpg", "rb"); 	fseek(fp, 0, SEEK_END); 	UINT FileSize = ftell(fp); 	PVOID pbuf = malloc(FileSize); 	fseek(fp, 0, SEEK_SET); 	fread(pbuf, FileSize, 1, fp); 	fclose(fp);  	int Base64EncLen = Base64EncodeGetRequiredLength(FileSize, ATL_BASE64_FLAG_NOCRLF); 	PCHAR szEncBase64 = (PCHAR)malloc(Base64EncLen); 	Base64Encode((PBYTE)pbuf, FileSize, szEncBase64, &Base64EncLen, ATL_BASE64_FLAG_NOCRLF);  	int Base64DecLen = Base64DecodeGetRequiredLength(Base64EncLen); 	PVOID pDebuf = malloc(Base64DecLen); 	Base64Decode(szEncBase64, Base64EncLen, (PBYTE)pDebuf, &Base64DecLen);  	FILE* file; 	fopen_s(&file, "d:\\1.jpg", "wb"); 	fwrite(pDebuf, Base64DecLen, 1, file); 	fclose(file);  	free(pbuf); 	free(szEncBase64); 	free(pDebuf); 中间的代码是放在main里运行吗？为什么我一用就报错啊，点开错误信息出了atlalloc.h和atlconv.h这两个头文件，显示了一大堆"应输入声明"。另外这种base64编码解码的原理是什么啊？有没有什么可供参考的资料啊。 [/quote] 什么编译器?[/quote] 问题已经解决了，之前报错是因为源文件是c文件而不是cpp文件，十分感谢

引用 8 楼 lonmecy 的回复:[quote=引用 7 楼 zwfgdlc 的回复:]  #include <atlenc.h>  	FILE* fp; 	fopen_s(&fp, "h:\\123.jpg", "rb"); 	fseek(fp, 0, SEEK_END); 	UINT FileSize = ftell(fp); 	PVOID pbuf = malloc(FileSize); 	fseek(fp, 0, SEEK_SET); 	fread(pbuf, FileSize, 1, fp); 	fclose(fp);  	int Base64EncLen = Base64EncodeGetRequiredLength(FileSize, ATL_BASE64_FLAG_NOCRLF); 	PCHAR szEncBase64 = (PCHAR)malloc(Base64EncLen); 	Base64Encode((PBYTE)pbuf, FileSize, szEncBase64, &Base64EncLen, ATL_BASE64_FLAG_NOCRLF);  	int Base64DecLen = Base64DecodeGetRequiredLength(Base64EncLen); 	PVOID pDebuf = malloc(Base64DecLen); 	Base64Decode(szEncBase64, Base64EncLen, (PBYTE)pDebuf, &Base64DecLen);  	FILE* file; 	fopen_s(&file, "d:\\1.jpg", "wb"); 	fwrite(pDebuf, Base64DecLen, 1, file); 	fclose(file);  	free(pbuf); 	free(szEncBase64); 	free(pDebuf); 中间的代码是放在main里运行吗？为什么我一用就报错啊，点开错误信息出了atlalloc.h和atlconv.h这两个头文件，显示了一大堆"应输入声明"。另外这种base64编码解码的原理是什么啊？有没有什么可供参考的资料啊。 [/quote] 什么编译器?

引用 7 楼 zwfgdlc 的回复: #include <atlenc.h>  	FILE* fp; 	fopen_s(&fp, "h:\\123.jpg", "rb"); 	fseek(fp, 0, SEEK_END); 	UINT FileSize = ftell(fp); 	PVOID pbuf = malloc(FileSize); 	fseek(fp, 0, SEEK_SET); 	fread(pbuf, FileSize, 1, fp); 	fclose(fp);  	int Base64EncLen = Base64EncodeGetRequiredLength(FileSize, ATL_BASE64_FLAG_NOCRLF); 	PCHAR szEncBase64 = (PCHAR)malloc(Base64EncLen); 	Base64Encode((PBYTE)pbuf, FileSize, szEncBase64, &Base64EncLen, ATL_BASE64_FLAG_NOCRLF);  	int Base64DecLen = Base64DecodeGetRequiredLength(Base64EncLen); 	PVOID pDebuf = malloc(Base64DecLen); 	Base64Decode(szEncBase64, Base64EncLen, (PBYTE)pDebuf, &Base64DecLen);  	FILE* file; 	fopen_s(&file, "d:\\1.jpg", "wb"); 	fwrite(pDebuf, Base64DecLen, 1, file); 	fclose(file);  	free(pbuf); 	free(szEncBase64); 	free(pDebuf); 中间的代码是放在main里运行吗？为什么我一用就报错啊，点开错误信息出了atlalloc.h和atlconv.h这两个头文件，显示了一大堆"应输入声明"。另外这种base64编码解码的原理是什么啊？有没有什么可供参考的资料啊。

仅供参考 和 拿去用吧 不是一回事！

引用 3 楼 赵4老师的回复:仅供参考：#include <stdio.h> #include <string.h> #include <stdlib.h>  #define BASE64_VALUE_SZ 256 int     base64_value[BASE64_VALUE_SZ]; const unsigned char alphabet[65] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; class Base64Utility { public:     Base64Utility();     int base64_encode(char *src, int srclen, char *dst, int tail);     int base64_decode(char *src, int srclen, char *dst); private:     void base_64_init(void); }; Base64Utility::Base64Utility() {     base_64_init(); } void Base64Utility::base_64_init(void) {     int i;      for (i = 0; i < BASE64_VALUE_SZ; i++) base64_value[i] = -1;     for (i = 0; i < 64; i++) base64_value[(int) alphabet[i]] = i;     base64_value['='] = 0; } int Base64Utility::base64_encode(char *src, int srclen, char *dst, int tail) {     int     bits, char_count, len;     char    *o_char, *lim, *o_lim;     unsigned char   c;      if ( !src || !dst) return 0;     len = srclen;     lim = src + len;     o_char = dst;     o_lim  = dst + (len*4)/3 + 1;     char_count = 0;     bits = 0;     while ( (src < lim) && (o_char < o_lim)) {         c = *(src++);         bits += c;         char_count++;         if (char_count == 3) {             *(o_char++) = alphabet[bits >> 18];             *(o_char++) = alphabet[(bits >> 12) & 0x3f];             *(o_char++) = alphabet[(bits >> 6) & 0x3f];             *(o_char++) = alphabet[bits & 0x3f];             bits = 0;             char_count = 0;         } else {             bits <<= 8;         }     }     if (char_count != 0) {         bits <<= 16 - (8 * char_count);         *(o_char++) = alphabet[bits >> 18];         *(o_char++) = alphabet[(bits >> 12) & 0x3f];         if (char_count == 1) {             if (tail) {                 *(o_char++) = '=';                 *(o_char++) = '=';             }         } else {             *(o_char++) = alphabet[(bits >> 6) & 0x3f];             if (tail) {                 *(o_char++) = '=';             }         }     }     *(o_char) = 0;     return strlen(dst); } int Base64Utility::base64_decode(char *src, int srclen, char *dst) {     int j;     unsigned int k;     int c, base_result_sz;     long val;      if (!src || !dst) return 0;     base_result_sz = srclen;     val = c = 0;     for (j = 0; *src; src++) {         k = (int) *src % BASE64_VALUE_SZ;         if (base64_value[k] < 0) continue;         val <<= 6;         val += base64_value[k];         if (++c < 4) continue;         dst[j++] = (char) (val >> 16);         dst[j++] = (val >> 8) & 0xff;         dst[j++] = val & 0xff;         val = c = 0;     }     switch (c) {         case 2://xxxxxx xx0000             dst[j++] = (val >> 4) & 0xff;         break;         case 3://XXXXXX XXxxxx xxxx00             dst[j++] = (char) (val >> 10);             dst[j++] = (val >> 2) & 0xff;         break;     }     return j; } Base64Utility b64u; #define MAXLENS 1024768 #define MAXLEND 1366360 char bufd[MAXLEND]; char bufs[MAXLENS]; FILE *fs,*fd; int fsize; int main(int argc,char *argv[]) {     if (argc<4) {     USE:         printf("%s <-e|-E|-d> srcfile desfile\n",argv[0]);         return 1;     }     if (stricmp(argv[1],"-e") && stricmp(argv[1],"-d")) goto USE;     if (0==stricmp(argv[1],"-e")) {         fs=fopen(argv[2],"rb");         if (NULL==fs) {             printf("Can not open file %s!\n",argv[2]);             return 2;         }         fsize=fread(bufs,1,MAXLENS,fs);         if (fsize<=0) {             fclose(fs);             printf("Can not read file %s!\n",argv[2]);             return 3;         }         if (MAXLENS==fsize) printf("Warning: Up to %d bytes.\n",MAXLENS);         fclose(fs);         b64u.base64_encode(bufs,fsize,bufd,('E'==argv[2][1]));         fd=fopen(argv[3],"w");         if (NULL==fd) {             printf("Can not create file %s!\n",argv[3]);             return 4;         }         fprintf(fd,"%s",bufd);         fclose(fd);     } else {//0==stricmp(argv[1],"-d")         fd=fopen(argv[2],"rb");         if (NULL==fd) {             printf("Can not open file %s!\n",argv[2]);             return 2;         }         fsize=fread(bufd,1,MAXLEND,fd);         if (fsize<=0) {             fclose(fd);             printf("Can not read file %s!\n",argv[2]);             return 3;         }         if (MAXLEND==fsize) printf("Warning: Up to %d bytes.\n",MAXLEND);         fclose(fd);         fsize=b64u.base64_decode(bufd,fsize,bufs);         fs=fopen(argv[3],"wb");         if (NULL==fs) {             printf("Can not create file %s!\n",argv[3]);             return 4;         }         if (fsize!=(int)fwrite(bufs,1,fsize,fs)) {             printf("Write %s error!\n",argv[3]);             fclose(fs);             return 5;         }         fclose(fs);     }     return 0; }  这是将解码的数据输出到一个文件里了吗？经过测试了吗？

这是程序最后运行的结果

现在需要对一个图片编码后的字符串进行解码，这个图片编码后的字符串我存在一个txt文件中，然后在程序中读取这个txt文件，用一个长度为30000的字符数组来存放它，这个字符串差不多有两万多位，在网上找了一个base64的解码方法，代码如下： static const char *ALPHA_BASE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";  char *decode(const char *base64Char, const long base64CharSize, char *originChar, long originCharSize) { 	int toInt[128] = { -1 }; 	for (int i = 0; i < 64; i++) { 		toInt[ALPHA_BASE[i]] = i; 	} 	int int255 = 0xFF; 	int index = 0; 	for (int i = 0; i < base64CharSize; i += 4) { 		int c0 = toInt[base64Char[i]]; 		int c1 = toInt[base64Char[i + 1]]; 		originChar[index++] = (((c0 << 2) | (c1 >> 4)) & int255); 		if (index >= originCharSize) { 			return originChar; 		} 		int c2 = toInt[base64Char[i + 2]]; 		originChar[index++] = (((c1 << 4) | (c2 >> 2)) & int255); 		if (index >= originCharSize) { 			return originChar; 		} 		int c3 = toInt[base64Char[i + 3]]; 		originChar[index++] = (((c2 << 6) | c3) & int255); 	} 	return originChar; } 现在的问题是，我用这个函数对字符串进行解码后，显示的解码后的字符串的长度才11，解码后的源码也就是几个乱码，想问一下这是什么问题？是解码函数的问题还是什么？如果是解码函数的问题能提供一个经过测试的解码函数吗？在这里先谢了。 FILE *in = fopen("g:\\test.txt","r"); 	char line[30000]; 	char *line_temp=malloc(30000*sizeof(char)); 	fgets(line, sizeof(line), in); 	//printf("%s", line); 	printf("编码字符串的长度为%d\n",strlen(line)); 	decode(line, strlen(line), line_temp, len); 	printf("解码后的源码长度为：%d\n", strlen(line_temp)); 	printf("解码后的字符串为%s\n", line_temp);


Question: 对于仍在 初学 还不会 C 的的 同学......链接：......教程：......

对于初学者是很好的建议

建议不错  不过适合自己的才是对的

非常感谢，棒棒的。

Linux下开发和Windows下开发有不同，编译器也有相应的区别。

CSDN就需要这样的好贴，帮忙新人，让国内的程序员队伍越来越大，越来越强！

路过，点个赞

强烈鄙视那些不能看每句C/C++对应汇编指令的C/C++ IDE！ http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素


Question: rsa_public_encrypt与cipher.doFinal加密结果不一致

纠正楼主一个概念：加解密的对象是字节数组，不是别的。

现在发现点眉目，在java端对c的“”123“”加密串做解析，发现解析的结果是313233后面跟122个0，而正确的解析结果应该是125个0后面跟123，网上有搜到要在加密串的后面填充'\0'，但是没效果

仅供参考：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }


Question: 一个简单的C问题

引用 9 楼 qq_38204686 的回复:‘\0’是c/c++语言中的字符串结束符，在ASCII字符集中对应空字符NULL。--百度百科 你的程序很正确 https://baike.baidu.com/item/%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6/86397?fr=aladdin '\0'代表空串NULL，但是不能划等号。

引用 8 楼 wyyy2088511 的回复:[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 3 楼 wyyy2088511 的回复:] 因为gets在每次读取的时候都会给最后一个字节添加一个0，如果是一个空行的话，只会给第0个字节赋值0，而转义字符‘\0’是NULL，也就是0，所以能够进行判断。 '\0'等于数值0，但是不是NULL吧，类型就不一样。NULL == (void *)0;[/quote]查一下转义字符表就明白了。[/quote] 我的意思，'\0'是空串，但是不能划等号，代码里不能这么写。

引用 5 楼 cfjtaishan 的回复:[quote=引用 3 楼 wyyy2088511 的回复:] 因为gets在每次读取的时候都会给最后一个字节添加一个0，如果是一个空行的话，只会给第0个字节赋值0，而转义字符‘\0’是NULL，也就是0，所以能够进行判断。 '\0'等于数值0，但是不是NULL吧，类型就不一样。NULL == (void *)0;[/quote]查一下转义字符表就明白了。

引用 1 楼 ebailixi 的回复:number[0]是你往number里输入的第一个字符，而`\0`就是空格的的意思，所以当第一个字符你敲空格时，退出循环，退出来了。'\0' 不是空格

引用 3 楼 wyyy2088511 的回复:因为gets在每次读取的时候都会给最后一个字节添加一个0，如果是一个空行的话，只会给第0个字节赋值0，而转义字符‘\0’是NULL，也就是0，所以能够进行判断。 '\0'等于数值0，但是不是NULL吧，类型就不一样。NULL == (void *)0;

引用 1 楼 ebailixi 的回复:number[0]是你往number里输入的第一个字符，而`\0`就是空格的的意思，所以当第一个字符你敲空格时，退出循环，退出来了。 '\0'不是空格哦，它是字符串结束标记。如果number[0]为'\0'，那么它就是空行，即没有有效的字符在number缓存里。 空格是属于有效字符的。

如果等于'\0'，那么就是没有字符输入到缓冲区number里

while(gets(number)&&number[0] != '\n') 这样，敲一个回车就可以退出了

引用 11 楼 cfjtaishan 的回复:[quote=引用 9 楼 qq_38204686 的回复:] ‘\0’是c/c++语言中的字符串结束符，在ASCII字符集中对应空字符NULL。--百度百科 你的程序很正确 https://baike.baidu.com/item/%E8%BD%AC%E4%B9%89%E5%AD%97%E7%AC%A6/86397?fr=aladdin '\0'代表空串NULL，但是不能划等号。[/quote] 谢谢 确实不是一样的  但是对于字符串来说都可以判断是否为空


Question: 基于51单片机的温湿度DHTII的采集

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

额，提示没有函数原型，这个函数你有没有定义，然后有没有去实现，或者说头文件不在一个文件里，是不是要extern声明一下？


Question: 请大侠帮我分析下程序的功能

程序的功能应该是将数组a中的元素从大到小排列。但是程序里面有些错误，所以未能达到从大到小排列的效果。 1程序修改 #include "stdafx.h" #include<stdio.h>  int main() { 	int a[] = { 4,0,2,3,1 }, i, j, t; 	for (i = 1; i<5; i++) 	{ 		t = a[i];  		j = i - 1; 		while (j >= 0 && t>a[j]);//去掉该分号 		{  			a[j + 1] = a[j];  			j--; 			a[j + 1] = t; 		} 	} 	for (i = 0; i < 5; i++) 	{ 		printf("a[%d]=%d  ", i, a[i]); 	}//原先代码中i的值是5，已经越界     return 0; } 以下是输入效果  2 程序分析 这个程序可以看成是“从后向前冒泡”。假设有一个数组a[3] = {0, 1,2}，第一步比较a[1]和a[0]，如果a[1]>a[0]，则将a[0]与a[1]进行交换；第二步比较a[2]和a[1]，如果a[2]大于a[1]，则a[2]与a[1]交换，第三步比较a[1]和a[0]，如果a[1]大于a[0]，则a[1]与a[0]交换。  以下为程序的流程图

请无视我

应该是将数组倒序排序，输出最小的数； 但是 while后面多了分号，a[i]也越界了

一个关于for循环语句的小文章 http://blog.csdn.net/hou09tian/article/details/77001685 请多指教

像一个排序的程序 还是测试的程序？

两个问题，1, while循环后多一个分号; 2.for循环之后，i的值为5，a[i]已经越界了。


Question: C程序小问题

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

哦，明白了，谢谢

引用 3 楼 JILAU_WHO_AM_I_Q234 的回复:[quote=引用 1 楼 user-4的回复:]struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();                   if(ch!='\n')         {             arr[i++] = ch;          }else break;     }     twos.Length = i;     twos.p = arr;     free(arr);     return twos; } get函数就有问题了，你把twos的p指针指向arr，然后释放了arr。p指针应该编程野指针了 我是把arr赋值给p之后才free arr的呀[/quote] 此时twos的p和arr是一样的，因为是指针，它们都指向的malloc申请的堆上的一段空间，free其一，都是将malloc之后的空间归还了（free），既然free，再使用是未定义行为。

引用 3 楼 JILAU_WHO_AM_I_Q234 的回复:[quote=引用 1 楼 user-4的回复:]struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();                   if(ch!='\n')         {             arr[i++] = ch;          }else break;     }     twos.Length = i;     twos.p = arr;     free(arr);     return twos; } get函数就有问题了，你把twos的p指针指向arr，然后释放了arr。p指针应该编程野指针了 我是把arr赋值给p之后才free arr的呀[/quote] arr是赋给了p，但是这里不是内存拷贝，只保存地址 arr被释放后，p指向的地址也就无意义了

引用 1 楼 user-4的回复:struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();                   if(ch!='\n')         {             arr[i++] = ch;          }else break;     }     twos.Length = i;     twos.p = arr;     free(arr);     return twos; } get函数就有问题了，你把twos的p指针指向arr，然后释放了arr。p指针应该编程野指针了 我是把arr赋值给p之后才free arr的呀

#include <stdio.h> #include <stdlib.h> #include <string.h>   #define LEN 100  struct two {     int Length;     char *p; }; struct two Get(void) {     struct two twos;     char *arr = (char*)malloc(LEN);     char ch;     int i = 0;     while(1)     {         ch = getchar();          if(ch!='\n')         {             arr[i++] = ch;         }else             break;     }     twos.Length = i;     twos.p = arr;     printf("i = %d\n", i);     //free(arr);    /*This arr can't free here.*/     return twos; }  int KillSpace(char *,int n); int main(void) {     char * pt;     int i;     int cnt; /* count the number of space */      struct two first;     printf("请输入字符串:(空行结束)\n");     first = Get();     pt = (char *)malloc(first.Length);     for(i = 0;i < first.Length;i++)     {         pt[i] = first.p[i];     }     cnt = KillSpace(pt,first.Length);      for (i = 0; i < first.Length - cnt; i++)         printf("%c", pt[i]);     putchar(10);     free(pt);     free(first.p);    /* free here */     system("pause");     return 0; } int KillSpace(char * p1,int n) {     char ch;     int i = 0, j;     int cnt = 0;     while(1)     {         ch = p1[i];         if(ch != ' '&& i < n) {             //printf("%c\n",p1[i]);             i++;         }         else if(i == n)             break;         else {    /* 向前覆盖方法 */             cnt++;             for (j = i; j < n - cnt; j++)                 p1[j] = p1[j+1];         }     }      return cnt; } 以上的代码参考一下吧； 问题主要是，Get函数里将申请的空间立即释放，这是未定义的，因为还未使用就释放，那申请空间做什么呢？！！ kill空格，其实是一个伪功能，因为根本就没有删除嘛。


Question: 求大佬解答，到底哪里出错了

同意1楼                                   。

VS2015+Windows10 64位测试没问题啊

哪里错了 我觉着还蛮好的...

输入0 输出？

读入自然数，你输的1234567890987654321123456789，是字符形式吧


Question: 有关C代码的一些问题，求大神指教~

引用 7 楼 qq_16071447 的回复:[quote=引用 4 楼 cfjtaishan 的回复:]  #include <stdio.h> #include <conio.h>  void main() {     char first,second;     printf("请任意输入某天英文单词的的第一个字母:\n");     first = getchar();     getchar();    /* 接收回车符 */     switch (first)     {         case 'S': printf("请输入第二个字母：\n");                   second = getchar();                   if (second == 'u')                       printf("这是星期日\n");                   else if (second == 'a')                       printf("这是星期六\n");                   else printf("data erro\n");                   break;         case 'M':  printf("这是星期一\n");                    break;         case 'T':  printf("请输入第二个字母：\n");                    second = getchar();                    if (second == 'u')                        printf("这是星期二\n");                    else  if (second == 'h')                        printf("这是星期四\n");                    else printf("data erro\n");                    break;         case 'W':  printf("这是星期三\n");                    break;         case 'F':  printf("这是星期五\n");                    break;         default: printf("data erro\n");     }     getch();  } 跟getchar有关，详见代码；  [quote=引用 2 楼 qq_16071447 的回复:] 你把getchar换成scanf输入就没事了，getchar把你的回车换行也输入进去了 scanf一样是有这个问题的，建议写几行代码试试[/quote] scanf("%c\n",..)这样应该没问题[/quote] 希望自己验证一下再发表意见，"%c\n"，你试试能不能正常工作？

引用 4 楼 cfjtaishan 的回复: #include <stdio.h> #include <conio.h>  void main() {     char first,second;     printf("请任意输入某天英文单词的的第一个字母:\n");     first = getchar();     getchar();    /* 接收回车符 */     switch (first)     {         case 'S': printf("请输入第二个字母：\n");                   second = getchar();                   if (second == 'u')                       printf("这是星期日\n");                   else if (second == 'a')                       printf("这是星期六\n");                   else printf("data erro\n");                   break;         case 'M':  printf("这是星期一\n");                    break;         case 'T':  printf("请输入第二个字母：\n");                    second = getchar();                    if (second == 'u')                        printf("这是星期二\n");                    else  if (second == 'h')                        printf("这是星期四\n");                    else printf("data erro\n");                    break;         case 'W':  printf("这是星期三\n");                    break;         case 'F':  printf("这是星期五\n");                    break;         default: printf("data erro\n");     }     getch();  } 跟getchar有关，详见代码；  [quote=引用 2 楼 qq_16071447 的回复:] 你把getchar换成scanf输入就没事了，getchar把你的回车换行也输入进去了 scanf一样是有这个问题的，建议写几行代码试试[/quote] scanf("%c\n",..)这样应该没问题

第二个getchar调用不会等待用户按键，而直接读取缓冲区中的换行字符，直到缓冲区中的字符读完为后，才等待用户按键，所以最简单的解决的办法就是在第二个getchar之前多加一个getchar();

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

#include <stdio.h> #include <conio.h>  void main() {     char first,second;     printf("请任意输入某天英文单词的的第一个字母:\n");     first = getchar();     getchar();    /* 接收回车符 */     switch (first)     {         case 'S': printf("请输入第二个字母：\n");                   second = getchar();                   if (second == 'u')                       printf("这是星期日\n");                   else if (second == 'a')                       printf("这是星期六\n");                   else printf("data erro\n");                   break;         case 'M':  printf("这是星期一\n");                    break;         case 'T':  printf("请输入第二个字母：\n");                    second = getchar();                    if (second == 'u')                        printf("这是星期二\n");                    else  if (second == 'h')                        printf("这是星期四\n");                    else printf("data erro\n");                    break;         case 'W':  printf("这是星期三\n");                    break;         case 'F':  printf("这是星期五\n");                    break;         default: printf("data erro\n");     }     getch();  } 跟getchar有关，详见代码；  引用 2 楼 qq_16071447 的回复:你把getchar换成scanf输入就没事了，getchar把你的回车换行也输入进去了 scanf一样是有这个问题的，建议写几行代码试试

楼上正解....


Question: c语言中如何实现换行数据标准输入输出？

printf（'\n');  就表示输出换号

在程序循环判定不是最后一次加个printf（'\n');

实现换行，可以再每一行判定完之后输出换行，两层for循环，内部for循环查找每一行中最大数，循环外部（内部循环的外部）输出数和换行

定义一个二维数组，将此问题转换为求每行（二维数组）的最大值。

最大值的问题，自己动手写写


Question: libusb-win32  获取设备数据，运行一段时间之后，命令通道和数据通道都断了

检查是否资源泄漏的办法之一： 在任务管理器 进程 查看 选择列 里面选择：内存使用、虚拟内存大小、句柄数、线程数、USER对象、GDI对象 让你的程序(进程)不退出,循环执行主流程很多遍，越多越好，比如1000000次甚至无限循环，记录以上各数值，再隔至少一小时，越长越好，比如一个月，再记录以上各数值。如果以上两组数值的差较大或随时间流逝不断增加，则铁定有对应资源的资源泄漏！  搜“GDI泄露检测”

来人求助


Question: 请问sprintf函数的用法？2个参数？

pstBoxInfo->aucFavReName[ iIndex ] 内容 赋给 pcCorrectString指向的内存

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

引用 1 楼 cfjtaishan 的回复:sprintf和printf是很类似的。不同的地方是，printf是将数据以第一个参数的格式输出到终端。而sprintf是以某种格式输出到缓存（第一个参数）里。   那这里是什么意思，没有第三个参数，假如第二个参数是数组的首地址，是什么意思呢？谢谢

int sprintf( char *buffer, const char *format, [ argument] … ); 只有最后一个参数是可选的 buffer：char型指针，指向将要写入的字符串的缓冲区。 format：char型指针，指向的内存里面存放的将要格式字符串。 [argument]...：可选参数，可以是任何类型的数据。 也就是说只有俩个参数的话   第一个参数pcCorrectString指向一块内存 第二个参数应该放的是格式字符串 指明是什么格式的

引用 2 楼 hushiganghu 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] sprintf和printf是很类似的。不同的地方是，printf是将数据以第一个参数的格式输出到终端。而sprintf是以某种格式输出到缓存（第一个参数）里。   那这里是什么意思，没有第三个参数，假如第二个参数是数组的首地址，是什么意思呢？谢谢[/quote] 没见过你这样使用sprintf的，建议从网上搜一下这个库函数原型。


Question: C语言队列小问题

pitem指向的地址的，被删除了，不要这样做 他用途是什么就只一个用途的好

分析代码应该把代码补全


Question: 贪吃蛇求助帖，帮忙看下问题

贪吃蛇，一个新的开始，知道自己不会了。

这个需要分析和调试代码，要花费很长时间，在线通过帖子上询问，有可能没有人会花时间去分析，帮你解答。  需要你自己分析具体哪个函数不符合你预期，去调试代码。  这个链接下还有一个更高级的实现，可以参考下： http://www.oschina.net/code/snippet_261347_26002

《Visual C++ 游戏开发经典案例详解》

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


Question: 求助帖

scanf 是省略参数，所以编意不会出错

引用 6 楼 wzyanhaianbenpao 的回复:明白了，是scanf中的双引号用错了位置，但是为什么前面不报错呢？ 可能报的是警告，警告建议也不要放过。

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

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

scanf("%f, &score"); ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ scanf("%f", &score);

明白了，是scanf中的双引号用错了位置，但是为什么前面不报错呢？

# include <stdio.h>  int main(void) { 	float score;//score 分数  	printf("请输入您的考试成绩："); 	scanf("%f, &score");  	if (score > 100) 		printf("这是做梦！\n"); 	else if (score >= 90 && score <= 100)//能写成90<=score<=100 		printf("优秀！\n"); 	else if (score >= 80 && score < 90) 		printf("良好！\n"); 	else if (score >= 60 && score < 80) 		printf("及格！\n"); 	else if (score >= 0 && score < 60) 		printf("不及格！\n"); 	else 		printf("您输入的分数过低，不予显示等级！\n");  	return 0; }

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

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

怀疑是代码的问题。所以，还得看代码

代码看不见，不知道啥问题！


Question: C语言 数据的存储与查询

只有触发和未触发两种状态可以用位存储呗， 1表示触发，0表示未触发。优先级越高位数越大，用与或等位运算来存储和查询

多谢指点！！

二维数组。或者链表


Question: 求解  cgi 编辑HTML上传文件 cgiFormFileOpen返回值cgiFormIO

引用 3 楼 赵4老师的回复:char b[100000] = { 0 }; char k[100000] = { 0 }; char m[100000] = { 0 }; char g[100000] = { 0 }; 每行前面都加static 试试。  在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 函数里使用时都不会超过20个字符，为什么这里必须要定义字符数组b k m g长度100000。正常我定义成charb[20]就够了吧！为什么这里不行呢？

百度搜相关关键字。

引用 1 楼 赵4老师的回复:百度搜相关关键字。 百度没解决好才上论坛，在如鹏网视频学的，代码一样敲出来，就是运行不了


Question: c语言新手求助！二维数组循环少一个

我已经明白了。。多谢各位

最好把所有代码都贴出来。一步一步调就确认了。

你这代码是怎么读取n个字符串的

从这段代码看不出什么问题，建议提供更多的信息。比如测试输入的数据，其他调用和被调用的函数代码。

我感觉这和写到哪里没关系 你这个代码我也看不出来什么 你可以一步一步的调试一下 看看里面的值是如何变化的

你还是把你整个代码贴出来吧


Question: C语言的问题求解决

可以用*name去接受参数，  char *name 和 char name[12]  的效果是一样的，，前者在有些情况下需要分配内存，但在作为形参是不需要，编译器会做处理，，知道name的大小，，char name[]  也可以接受实参，数组就是指针。

函数少了个{。

打开文件。还需要close啊

可以直接接收main函数里name

这样写不对吧，FILE*是在栈区创建的，当file_open  执行完毕，函数的活动记录会被清除。你要是非要这么写那就用unique_ptr。


Question: C语言代码分析，运行结果出错。

for (iIndex = 0; cString[iIndex] = '\0'; iIndex++)   你把所有的字符都等于\0了，应该是for (iIndex = 0; cString[iIndex] = ='\0'; iIndex++)

for (iIndex = 0; cString[iIndex] = '\0'; iIndex++) 这个循环可以结束吗？  改为： for（iIndex = 0; cString[iIndex] ; iIndex++）

#include <stdio.h>  int main() {     char cString[100];     int iIndex,iWord=1;     char cBlank;     //gets_s(cString, 20);     gets(cString);      if (cString[0] == '\0')     {         printf("There is no char!\n");     }     else if (cString[0] == ' ')     {         printf("First char just is a blank!\n");     }     else     {         for (iIndex = 0; cString[iIndex] != '\0'; iIndex++)         {             cBlank = cString[iIndex];             if (cBlank ==' ')             {                 iWord++ ;             }         }         printf("%d\n",iWord);     }     return 0; } 注意这句： for (iIndex = 0; cString[iIndex] != '\0'; iIndex++)

cString[iIndex] = '\0'赋值语句，不是判断语句

for (iIndex = 0; cString[iIndex] = '\0'; iIndex++) 循环条件你错了，‘\0’是行尾结束符，所以应该改成!=

for(  iIndex=0;   cString[iIndex] =='\0';  iIndex++) 改为 for(  iIndex=0;   cString[iIndex] !='\0';  iIndex++)


Question: 大端存储的数据如何按小端读出来？（或者反之）

如2楼和6楼所示， 最终思路为按字节（unsigned char）读取， 若是Int进行移位操作即可。 float型可先读成int，然后按照下面两条语句转为float float float_; *((int*)&float_) = int_num; float_即为想要的值。

htonl,htons, ntohl, ntohs, WSAHtonl, WSAHtons, WSANtohl, WSANtohs

从文件里不能直接转换之后读取，建议先将其读到内存里，然后在转换。比如short类型读到内存，然后再将两个字节转换一下。 u16 a = (a <<8) | (a >> 8);

如一楼所述，大小端转换。

刚学不就，不知道这样做对不对，一个字节一个字节读，然后移位 int a,b; int c; fread(&a, 1, 1, fp);   //0x57 fread(&b, 1, 1, fp);  //0x1f c ＝ (b << 4) | a;    //0x1f57

如果是四字节的整数倍，把第一和第四字节转换，把第二个字节和第三个字节转换


Question: 数据结构链表

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

#include<stdio.h> #include<stdlib.h> #include<string.h>  struct node {     int num;     char name[20];     struct node *next; };  struct node *create_singly_link(int num) {     struct node *head, *prev, *cur;     int i;      head = NULL;     for(i = 0; i < num; i++) {         cur = (struct node *)malloc(sizeof(struct node));         if (!cur) {             printf("Malloc error!");             return NULL;         }         cur->next = NULL;         cur->num = i+1;         snprintf(cur->name, 20-1, "%c", 'A'+i);         if (!head) {             head = cur;             prev = cur;         } else {             prev->next = cur;             prev = prev->next;         }     }     prev->next = head;     return head; }  static void test_print(struct node *phead) {     struct node *pcur = phead->next;      printf("num = %d\t name = %s\n", phead->num, phead->name);     while (pcur != phead) {         printf("num = %2d\t name = %s\n", pcur->num, pcur->name);         pcur = pcur->next;     } }  int output( struct node *head, int start, int step, int total) {     struct node *p, *q;     int count = 0;     int num = 0, i;      q = head;      for(i = 0; i < start; i++)         q = q->next;      while(count < total-1) {         p = q->next;         num++;         if(!(num % step)) {             q->next = p->next;             printf("%s\n", p->name);             free(p);             count++;         } else {             q = p;         }     }     printf("num = %d\t, name = %s\n", q->num, q->name);     free(q);      return 0; } int main(int argc, const char *argv[]) {     int total, step, start;     struct node *head;      printf("Please input total test number: ");     scanf("%d", &total);     head = create_singly_link(total);     test_print(head);      printf("Please input start position and steps: ");     scanf("%d%d", &start, &step);      output(head, start, step, total);      return 0; } 建议使用单项循环链表，这样容易计算M； 上面的代码作为一个参考吧

无头环链会不会容易点


Question: 一个输出单词数量的程序，运行不了，求大神。

引用 1 楼 T20091 的回复:c = getchar() != STOP 这里有个优先级的问题，修改成 (c = getchar()) != STOP 原来是这样，擦。。。明白了，谢谢大佬！


Question: 遇到一个很不科学的问题,感觉毫无破绽，但是出错了，请大佬们进来看看！

应该就是野指针的问题 见笑了。。

是不是因为第三个里面的*p是个野指针，不能直接用在fgets里？我把p指向一个字符数组后就能正常运行了。 但是为什么第二个里面的*p就没问题？能运行


Question: 求求大神看看我这个程序哪里有问题

#include "stdafx.h" #include<iostream> #include<cmath> using namespace std; int main() { 	int x; 	cout << "请输入一个整数：" << endl; 	cin >> x;  	int temp = x; 	int new_int = 0; 	int n = 0; 	int x0 = 0;  	while (temp!=0) 	{ 		x0 = temp % 10; 		new_int += x0*pow(10, n); 		temp = temp / 100; 		n++; 	}  	cout << x << '\t' << new_int << endl;     return 0; }

#include<stdio.h> #include<math.h> int main(void) {  int x,i,k=0; int n=0; int a[10];  printf("输入一个数："); scanf("%d",&x); while(x!=0) { 	    a[n]=x%10;         x=x/10;         n++;  }  n--; for(i=n;i>=0;i-=2)     printf("%d",a[i]); }

奇数位，怎么理解。最好举个例子

或者： 1：1 21：2 321：31 4321：42 54321：531 987654321：97531 675429879：65289

1：1 21：1 321：31 4321：31 54321：531 987654321：97531 675429879：65289


引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 feekee 的回复:] 我汗啊，还是让愿意解决问题的人来解决吧  怎么比喻呢，咱们离得太远了，我都看不清您要表达什么，也不明白你的意思。。 我的意思是要你尊重自己眼前的事实，鄙视别人对他自己过去事实的描述。[/quote] 好吧，就是事实与我原来的认知不一致，才有此提问的 不过平常与人讨论的少，所以往往一下子发出来很多东西，别人也看不明白到底是什么意思

这个问题描述的不太好，可能问的不太清楚  ： 我在学习rm的实现，最终找到了是unlinkat()函数对对象进行删除，函数调用如上面帖子中的贴图。明显，这应该是个函数调用；但是我man unlinkat()的时候，看到手册里说unlinkat是个系统调用。所以，想问一下各位大大，系统调用的使用是不是也类似glibc中的fopen、fread等函数，在c程序中可以直接使用（排除内联汇编的情况）?  以及，该页man里面写到2.4版本的glibc才增加了unlinkat库，怎么我的glibc是 2.22中就有了，而且还在相应linux发行版的coreutils的rm实现中直接就使用了？要么只可能是这个发行版下安装的man手册不同步，请各位对开源软件的版本和发展比较了解的老大们帮忙解释一下，多谢

引用 6 楼 feekee 的回复:我汗啊，还是让愿意解决问题的人来解决吧  怎么比喻呢，咱们离得太远了，我都看不清您要表达什么，也不明白你的意思。。 我的意思是要你尊重自己眼前的事实，鄙视别人对他自己过去事实的描述。

任何问题首先是一个哲学问题。

楼上您好， 如果您发现我的内容哪里不对或者有问题，请及早告诉我 您发这些虚无缥缈的说法，有嘛用啊  再说了，上面这个帖是不是有推广博客的嫌疑……？

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

程序员之“盲人摸太阳 http://blog.sina.com.cn/s/blog_72a61f2f01015l9l.html

我倒，楼上怎么回答了一个口号啊， 忽然想起来，最后少了一个说明coreutils中unlinkat调用的截图，这样大家可能不知道在说什么  这个是对rm进行追踪找到的最后删除文件时的代码  PS楼上大大：就是看到了事实，然后理论上有些想不通~


Question: 使用结构体指针做为参数的疑问

引用 11 楼 u013992933 的回复:mov 不是 dst src这种格式吗？怎么汇编里看上去是反过来的？ ×86汇编有两种语法，intel语法和AT&T语法，两种语法的源操作数和目的操作数位置相反

参数如果是指针直接一个Lea就可以了， 如果是值，他选要把他全部压入栈中

引用 6 楼 u013992933 的回复:00000000004004c2 <foo>:   4004c2:	55                   	push   %rbp   4004c3:	48 89 e5             	mov    %rsp,%rbp   4004c6:	89 7d fc             	mov    %edi,-0x4(%rbp)   4004c9:	48 89 f1             	mov    %rsi,%rcx   4004cc:	48 89 d0             	mov    %rdx,%rax   4004cf:	48 89 4d e8          	mov    %rcx,-0x18(%rbp)   4004d3:	48 89 45 f0          	mov    %rax,-0x10(%rbp)   4004d7:	c7 45 fc 03 00 00 00 	movl   $0x3,-0x4(%rbp)   4004de:	c6 45 e8 64          	movb   $0x64,-0x18(%rbp)   4004e2:	c9                   	leaveq    4004e3:	c3                   	retq     00000000004004e4 <main>:   4004e4:	55                   	push   %rbp   4004e5:	48 89 e5             	mov    %rsp,%rbp   4004e8:	48 83 ec 20          	sub    $0x20,%rsp   4004ec:	c7 45 fc 64 00 00 00 	movl   $0x64,-0x4(%rbp)   4004f3:	c6 45 e0 01          	movb   $0x1,-0x20(%rbp)   4004f7:	66 c7 45 e2 14 00    	movw   $0x14,-0x1e(%rbp)   4004fd:	c7 45 e4 2c 01 00 00 	movl   $0x12c,-0x1c(%rbp)   400504:	48 c7 45 e8 a0 0f 00 	movq   $0xfa0,-0x18(%rbp)   40050b:	00    40050c:	48 8b 4d e0          	mov    -0x20(%rbp),%rcx   400510:	48 8b 55 e8          	mov    -0x18(%rbp),%rdx   400514:	8b 45 fc             	mov    -0x4(%rbp),%eax   400517:	48 89 ce             	mov    %rcx,%rsi   40051a:	89 c7                	mov    %eax,%edi   40051c:	e8 a1 ff ff ff       	callq  4004c2 <foo>   400521:	c9                   	leaveq    400522:	c3                   	retq      400523:	66 2e 0f 1f 84 00 00 	nopw   %cs:0x0(%rax,%rax,1)   40052a:	00 00 00    40052d:	0f 1f 00             	nopl   (%rax) --------------------------------------------------------------------------------------- typedef struct st{ 	char a; 	short b; 	int c; 	long d;   }st;  void foo(int i,st st){ 	i=3; 	st.a=100; 	return; }  void main(){ 	int i=100; 	st st={1,20,300,4000}; 	foo(i,st);  return; } 你再传一个指针试一下，比较两者的区别

无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！  调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

引用 2 楼 u013992933 的回复:可是我在看汇编时，并没有找到cpoy相关的代码...... 大佬，可不可举个栗子 你没看懂汇编，把你看到的汇编贴出来

如果形参是结构，那么会占用一部分内存空间（指针只占4个字节--32位系统）。  引用 2 楼 u013992933 的回复:可是我在看汇编时，并没有找到cpoy相关的代码...... 大佬，可不可举个栗子 值传递，是需要将实参拷贝至形参的。形参是自定义函数上的变量。而指针，即将实参的地址传过去。用指针跳转要比拷贝实参至形参效率高多了。这也是指针的优势。 对于这样的问题，我们要考虑结构体较大时，优势越明显。

如果直接使用结构体作为参数，实际过程是创建一个临时对象传给函数的，也就是要拷贝一次，效率自然就低了。用指针不用创建对象的过程，效率就高。这是函数传参的特点。

我觉得在这个问题上，你还用不着去看汇编。 你弄懂函数参数是“值传递”，和自定义对象在值传递时需要做什么，就应该明白了。 1. 什么是值传递？ void foo(int v){ //这里的v和外面的a其实是两个变量，函数调用时，做了如下操作：v = a;   v = 2; //这里的v不是main中的a，所以修改v后，a不会改变！ } int main() {   int a = 1;   foo(a);   assert(a == 1); //a没有改变   return 0; } 2. 值传递时做了什么？ 基本数据类型，看不出来，或者说什么也没做，只是赋值；而自定义对象则不同：在栈上分配对象需要的内存空间，然后调用(复制)构造函数！这也耗时的主要原因。 struct A{ A(){} A(const A&){cout << "复制构造函数被调用" << endl;} }; void foo(A){} int main() {   A a;   foo(a);   return 0; }

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

还有一个疑问是。 mov 不是 dst src这种格式吗？怎么汇编里看上去是反过来的？  多谢大佬

大佬，. 1.0x1c 0x1e地址的值怎么没有放寄存器里，结构体不是四个成员变量吗？ 2.为什么偏移都是4，成员的类型都不一样啊？ 3.0x4偏移那个0x64是什么用啊？


Question: C程序字符问题

非常感谢

不要使用 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;  //... } 类似的例子还可以举很多。

注意优先级的问题 cha = getchar() && (!isblank(cha)) 赋值优先级是最低的。所以要加上括号； while (((cha = getchar) && (!isblank(cha))) && i < n) 不如直接改成这样：  while ((!isblank(cha = getchar())) && i < n)


Question: c   求指教

引用 4 楼 katie3000 的回复:c=s[j} ; s[j]=s[i]; s[i]=c; 作用是调换数组内两个元素的位置，缺一不可，不是你说的可有可无。 如果少了c=s[j]和s[i]=c，互换过程中没了数据缓存，互换的两个元素必然会丢失一个，而且的到的结果必定是对称的。 比如这个例子：-25经过while循环后，s= ‘5’，‘2’，‘-’，‘\0’。for循环就是要翻转前三个字节的顺序。 第一步，j和I分别指向‘5’和‘-’，如果没有c的存在，只执行s[j]=s[I]; 结果‘5’丢失，s=‘-’，‘2’，‘-’，‘\0' 第二步，j和I不满足循环条件，退出。 所以，所以，所以。。。已经很详细了。。。我是有多无聊。。。 非常感谢楼主耐心详细的讲解，以后多指教

引用 3 楼 L1171274211 的回复:c=s[j]和s[i]=c，这个是交换参数的常见形式。。。没有这个，你怎么交换参数，我没看代码，不知道是否能帮上你 懂了，谢谢

，，，，，能

你确定你的代码能通过编译？？？


Question: 求教一道跟scanf有关的小问题

引用 4 楼 dawangguotie 的回复:我定义了整数   [quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 dawangguotie 的回复:] 是实数   [quote=引用 1 楼 cfjtaishan 的回复:] 所有的什么数？应该不是实数吧  scanf("%d%d", &a, &b); if (a < b)      for (i = a; i < b; i++)         printf("%d ", i); [/quote] 那你得说明精确到多少位，不然会有太多了，（理论上是无穷的）[/quote][/quote] 定义整数了，但是你要求的是整数之间的实数，实数是有精确多少位的

树上10只鸟，打死一只还剩几只？看看程序员是怎么思考的： http://www.kuqin.com/algorithm/20111230/316933.html

啥叫整数？12345678901234567890123456789012345678901234567890123456789012345678901234567890是整数吗？

啥叫两个整数之间的所有数？ 啥叫两个整数之间的所有整数？

我定义了整数   引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 dawangguotie 的回复:] 是实数   [quote=引用 1 楼 cfjtaishan 的回复:] 所有的什么数？应该不是实数吧  scanf("%d%d", &a, &b); if (a < b)      for (i = a; i < b; i++)         printf("%d ", i); [/quote] 那你得说明精确到多少位，不然会有太多了，（理论上是无穷的）[/quote]

引用 2 楼 dawangguotie 的回复:是实数   [quote=引用 1 楼 cfjtaishan 的回复:] 所有的什么数？应该不是实数吧  scanf("%d%d", &a, &b); if (a < b)      for (i = a; i < b; i++)         printf("%d ", i); [/quote] 那你得说明精确到多少位，不然会有太多了，（理论上是无穷的）

是实数   引用 1 楼 cfjtaishan 的回复:所有的什么数？应该不是实数吧  scanf("%d%d", &a, &b); if (a < b)      for (i = a; i < b; i++)         printf("%d ", i);


Question: 国标码 字符问题

仅供参考：#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; }

多出来的是gbk增加的


Question: 用dev c++编译器 出现undefined reference to `showFlew'

这个是低级错误了。 你看看你的函数名是showFlew，还是showFlex w和x区别


Question: LINUX中 readdir 和 stat 的使用问题

可是返回的inode和size都一样不知道怎么办。。。。。。。。

代码测试没问题。


Question: 简单的指针赋值

cout<<。。。。 相当于 cout.operator<<(..........)

问题已经找到，我的程序在cout后还有一句*(pArray +row*n + col) = *(res+row*n + col);从而影响了cout输出，可问题是我的cout在该句前边，怎么还会影响cout输出呢？

不好意思，上边index[2] = {1,0};

引用 楼主 linzertling 的回复:	unsigned int * res = (unsigned int*)malloc(4*sizeof(unsigned int)); 	for(int row = 0; row < m; row++){ 		for(int col = 0; col < n; col++){ 			*(res + row*n + col) = pArray[index[row]*n + col]; 			cout << *(res + row*n + col) << endl; 		} 	} 代码片段如上，pArray[2][2] = {{1,2},{3,1}};正常输出的res应该是 {{3,1}，{1,2}}，但是结果却是 {{3,1},{3,1}}，求大神指教！index[2] = {1,2},这个确定没问题，而且我把循环中改为cout << pArray[index[row]*n + col] << endl就能正常输出3,1,1,2，太诡异了

unsigned int * res = (unsigned int*)malloc(4*sizeof(unsigned int));     for(row = 0; row < m; row++){         for(col = 0; col < n; col++){             *(res + row*n + col) = pArray[row][col];             cout << *(res + row*n + col) << endl;         }     } 这样做是没问题的。建议查一下index问题。尤其是这个表达式： pArray[index[row]*n + col]


Question: sscanf 写入的字符串为空

一个指针没有指向一个空地址

不应该出现两个字符串是NULL的情况，因为两个字符串是数组，数组名不能作为左值，怎么会指向NULL呢 反而word_sec是一个野指针，不能直接使用，需要给其申请空间，或者令其指向一个可读可写的有效内存空间；  #include <stdio.h> #include <stdlib.h>   int main(void) {     char cmd[100];     char word_fir[10], word_third[10];     int *word_sec = (int *)malloc(sizeof(int));      gets(cmd);      sscanf(cmd, "%s %d %s", word_fir, word_sec, word_third);      printf("%s %d %s\n", word_fir, *word_sec, word_third);      return 0; }

#include <stdio.h> char word_fir[10], word_third[10]; int word_sec; char cmd[100]; int main() {     gets(cmd);     sscanf(cmd, "%s %d %s", word_fir, &word_sec, word_third);     printf("word_fir:[%s]\nword_sec:%d\nword_third:[%s]",word_fir, word_sec, word_third);     return 0; } //mode 20 upper //word_fir:[mode] //word_sec:20 //word_third:[upper]


Question: 自加优先级的问题

等效的。 这个建议你写个简单的程序验证一下。


Question: C语言循环求解

#include "stdafx.h" #include <iostream> #include<cmath> using namespace std; int main() { 	int count=0; 	int add = 0; 	int sum = 0; 	cout << "请输入一个数：" << endl; 	cin >> count;  	for (int i=0;i<count;i++) 	{ 		add+= count*pow(10, i); 		sum += add; 	}  	cout << sum << endl;     return 0; }

int main(int argc, char* argv[]) {     const int DEFAULT_NUM = 2;     int res = 0, maxTimes = 0, num = 0;      printf("please inupt max times:");     scanf("%d", &maxTimes);      for (int i = 0; i < maxTimes; ++i)     {         num =num * 10 + DEFAULT_NUM;         res += num;     }      printf("result is %d\n", res);      system("pause");     return EXIT_SUCCESS; }

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

仅供参考：//给定一个数组a[9]={'a','b','c','1','2','3','!','@','#'}， //要求程序启动后提示输入整数n(0<n<9),根据输入整数进行输出， //输出规则为：从一行一字符到n行n字符遍历数组中所有字符，比如： //n=1,则输出： //a,b,c,1,2,3,!,@,# //n=2.则如下输出： //a,b,c,1,2,3,!,@,# //aa,ab,ac,a1,a2,a3,a!,a@,a#,ba,bb,bc,b1,b2,b3,b!,b@,b#,ca,cb,cc,c1,c2,c3,c!,c@,c#,1a,1b,1c,11,12,13,1!,1@,1#,2a,2b,2c,21,22,23,2!,2@,2#,3a,3b,3c,31,32,33,3!,3@,3#,!a,!b,!c,!1,!2,!3,!!,!@,!#,@a,@b,@c,@1,@2,@3,@!,@@,@#,a,#b,#c,#1,#2,#3,#!,#@,## //…… #include <stdio.h> char a[9]={'a','b','c','1','2','3','!','@','#'}; char t[9]; void out(int m,int L) {     int i;     if (m==L) {         for (i=0;i<m;i++) printf("%c",t[i]);         for (i=0;i<m;i++) if ('#'!=t[i]) break;         if (i<m) printf(",");         return;     }     for (i=0;i<9;i++) {         t[L]=a[i];         out(m,L+1);     } } void out1_n(int n) {     int m;      for (m=1;m<=n;m++) {         out(m,0);         printf("\n");     } } int main() {     int n;      while (1) {         printf("Input n(0<n<9):");         fflush(stdout);         rewind(stdin);         if (1==scanf("%d",&n)) {             if (0<n && n<9) break;         }     }     out1_n(n);     return 0; } //Input n(0<n<9):1 //a,b,c,1,2,3,!,@,# // //Input n(0<n<9):2 //a,b,c,1,2,3,!,@,# //aa,ab,ac,a1,a2,a3,a!,a@,a#,ba,bb,bc,b1,b2,b3,b!,b@,b#,ca,cb,cc,c1,c2,c3,c!,c@,c#,1a,1b,1c,11,12,13,1!,1@,1#,2a,2b,2c,21,22,23,2!,2@,2#,3a,3b,3c,31,32,33,3!,3@,3#,!a,!b,!c,!1,!2,!3,!!,!@,!#,@a,@b,@c,@1,@2,@3,@!,@@,@#,#a,#b,#c,#1,#2,#3,#!,#@,## // //Input n(0<n<9):3 //a,b,c,1,2,3,!,@,# //aa,ab,ac,a1,a2,a3,a!,a@,a#,ba,bb,bc,b1,b2,b3,b!,b@,b#,ca,cb,cc,c1,c2,c3,c!,c@,c#,1a,1b,1c,11,12,13,1!,1@,1#,2a,2b,2c,21,22,23,2!,2@,2#,3a,3b,3c,31,32,33,3!,3@,3#,!a,!b,!c,!1,!2,!3,!!,!@,!#,@a,@b,@c,@1,@2,@3,@!,@@,@#,#a,#b,#c,#1,#2,#3,#!,#@,## //aaa,aab,aac,aa1,aa2,aa3,aa!,aa@,aa#,aba,abb,abc,ab1,ab2,ab3,ab!,ab@,ab#,aca,acb,acc,ac1,ac2,ac3,ac!,ac@,ac#,a1a,a1b,a1c,a11,a12,a13,a1!,a1@,a1#,a2a,a2b,a2c,a21,a22,a23,a2!,a2@,a2#,a3a,a3b,a3c,a31,a32,a33,a3!,a3@,a3#,a!a,a!b,a!c,a!1,a!2,a!3,a!!,a!@,a!#,a@a,a@b,a@c,a@1,a@2,a@3,a@!,a@@,a@#,a#a,a#b,a#c,a#1,a#2,a#3,a#!,a#@,a##,baa,bab,bac,ba1,ba2,ba3,ba!,ba@,ba#,bba,bbb,bbc,bb1,bb2,bb3,bb!,bb@,bb#,bca,bcb,bcc,bc1,bc2,bc3,bc!,bc@,bc#,b1a,b1b,b1c,b11,b12,b13,b1!,b1@,b1#,b2a,b2b,b2c,b21,b22,b23,b2!,b2@,b2#,b3a,b3b,b3c,b31,b32,b33,b3!,b3@,b3#,b!a,b!b,b!c,b!1,b!2,b!3,b!!,b!@,b!#,b@a,b@b,b@c,b@1,b@2,b@3,b@!,b@@,b@#,b#a,b#b,b#c,b#1,b#2,b#3,b#!,b#@,b##,caa,cab,cac,ca1,ca2,ca3,ca!,ca@,ca#,cba,cbb,cbc,cb1,cb2,cb3,cb!,cb@,cb#,cca,ccb,ccc,cc1,cc2,cc3,cc!,cc@,cc#,c1a,c1b,c1c,c11,c12,c13,c1!,c1@,c1#,c2a,c2b,c2c,c21,c22,c23,c2!,c2@,c2#,c3a,c3b,c3c,c31,c32,c33,c3!,c3@,c3#,c!a,c!b,c!c,c!1,c!2,c!3,c!!,c!@,c!#,c@a,c@b,c@c,c@1,c@2,c@3,c@!,c@@,c@#,c#a,c#b,c#c,c#1,c#2,c#3,c#!,c#@,c##,1aa,1ab,1ac,1a1,1a2,1a3,1a!,1a@,1a#,1ba,1bb,1bc,1b1,1b2,1b3,1b!,1b@,1b#,1ca,1cb,1cc,1c1,1c2,1c3,1c!,1c@,1c#,11a,11b,11c,111,112,113,11!,11@,11#,12a,12b,12c,121,122,123,12!,12@,12#,13a,13b,13c,131,132,133,13!,13@,13#,1!a,1!b,1!c,1!1,1!2,1!3,1!!,1!@,1!#,1@a,1@b,1@c,1@1,1@2,1@3,1@!,1@@,1@#,1#a,1#b,1#c,1#1,1#2,1#3,1#!,1#@,1##,2aa,2ab,2ac,2a1,2a2,2a3,2a!,2a@,2a#,2ba,2bb,2bc,2b1,2b2,2b3,2b!,2b@,2b#,2ca,2cb,2cc,2c1,2c2,2c3,2c!,2c@,2c#,21a,21b,21c,211,212,213,21!,21@,21#,22a,22b,22c,221,222,223,22!,22@,22#,23a,23b,23c,231,232,233,23!,23@,23#,2!a,2!b,2!c,2!1,2!2,2!3,2!!,2!@,2!#,2@a,2@b,2@c,2@1,2@2,2@3,2@!,2@@,2@#,2#a,2#b,2#c,2#1,2#2,2#3,2#!,2#@,2##,3aa,3ab,3ac,3a1,3a2,3a3,3a!,3a@,3a#,3ba,3bb,3bc,3b1,3b2,3b3,3b!,3b@,3b#,3ca,3cb,3cc,3c1,3c2,3c3,3c!,3c@,3c#,31a,31b,31c,311,312,313,31!,31@,31#,32a,32b,32c,321,322,323,32!,32@,32#,33a,33b,33c,331,332,333,33!,33@,33#,3!a,3!b,3!c,3!1,3!2,3!3,3!!,3!@,3!#,3@a,3@b,3@c,3@1,3@2,3@3,3@!,3@@,3@#,3#a,3#b,3#c,3#1,3#2,3#3,3#!,3#@,3##,!aa,!ab,!ac,!a1,!a2,!a3,!a!,!a@,!a#,!ba,!bb,!bc,!b1,!b2,!b3,!b!,!b@,!b#,!ca,!cb,!cc,!c1,!c2,!c3,!c!,!c@,!c#,!1a,!1b,!1c,!11,!12,!13,!1!,!1@,!1#,!2a,!2b,!2c,!21,!22,!23,!2!,!2@,!2#,!3a,!3b,!3c,!31,!32,!33,!3!,!3@,!3#,!!a,!!b,!!c,!!1,!!2,!!3,!!!,!!@,!!#,!@a,!@b,!@c,!@1,!@2,!@3,!@!,!@@,!@#,!#a,!#b,!#c,!#1,!#2,!#3,!#!,!#@,!##,@aa,@ab,@ac,@a1,@a2,@a3,@a!,@a@,@a#,@ba,@bb,@bc,@b1,@b2,@b3,@b!,@b@,@b#,@ca,@cb,@cc,@c1,@c2,@c3,@c!,@c@,@c#,@1a,@1b,@1c,@11,@12,@13,@1!,@1@,@1#,@2a,@2b,@2c,@21,@22,@23,@2!,@2@,@2#,@3a,@3b,@3c,@31,@32,@33,@3!,@3@,@3#,@!a,@!b,@!c,@!1,@!2,@!3,@!!,@!@,@!#,@@a,@@b,@@c,@@1,@@2,@@3,@@!,@@@,@@#,@#a,@#b,@#c,@#1,@#2,@#3,@#!,@#@,@##,#aa,#ab,#ac,#a1,#a2,#a3,#a!,#a@,#a#,#ba,#bb,#bc,#b1,#b2,#b3,#b!,#b@,#b#,#ca,#cb,#cc,#c1,#c2,#c3,#c!,#c@,#c#,#1a,#1b,#1c,#11,#12,#13,#1!,#1@,#1#,#2a,#2b,#2c,#21,#22,#23,#2!,#2@,#2#,#3a,#3b,#3c,#31,#32,#33,#3!,#3@,#3#,#!a,#!b,#!c,#!1,#!2,#!3,#!!,#!@,#!#,#@a,#@b,#@c,#@1,#@2,#@3,#@!,#@@,#@#,##a,##b,##c,##1,##2,##3,##!,##@,### //

先把每个数计算出来，然后相加。

引用 2 楼 u010273433 的回复:当输入5时，运行结果是：sum = 2 + 22 + 222 + 2222 + 22222  并没有算出结果，为什么呢？ 想计算结果也是可以的，定义sum，然后输出sum就可以了。

#include <stdio.h> #include <math.h>  int main(void) {     int num;     int i, j;     unsigned long long digit = 0;      scanf("%d", &num);      if (num >= 1 && num <= 10)         printf("sum = 2 ");     digit = 2;     for (i = 1; i < num; i++) {         digit += 2 * (int)pow(10, i);         printf("+ %llu ", digit);     }      return 0; } 注意越界


Question: 求助，折半法排序的一些问题！

快速排序思想吗？

int main() { int i,a[10]; ...... CelerityRun(0,9,a); ...... return 0； } void CelerityRun(int left,int right,int array[]) { int i,j ; int middle,iTemp; i=left; j=right; middle=array[(left+right)/2]; /*求中间值*/ do { while((array[i]<middle)&&(i<right)) /*从左找小于中值得数*/ i++; while((array[j]>middle)&&(j>left)) /*从右找小于中值得数*/ j--; if(i<=j) /*找到的数进行交换*/ { iTemp=array[i]; array[i]=array[j]; array[j]=iTemp; i++; j--; } }while(i<=j); /*如果两边的下标交错，就停止（完成一次）*/ /*递归左半边*/ if(left<j) CelerityRun(left,j,array) /*递归右半边*/ if(right>i); CelerityRun(left,j,array) }


Question: C语言磁强计椭球面校准时采集数据量编码

您好，我有点不懂啊  我采集的数据是一个二维的数据，也就是X轴与Y轴一一对应的，也就是要每个相像采集20个数，4个相像对应就是80个，这样我就好拟合椭圆面了。您这个函数是怎么操作的了，能具体说一下吗

仅供参考：/****************************************************************************** *return 0: 采样点不满足校准要求 *return 1: 校准完成 * ******************************************************************************/ static uint8_t auto_exit_revise_deal(uint8_t* data_buff) {    int16_t sample_x,sample_y,sample_z;   int16_t scale_x,scale_y;     sample_x = (int16_t)((*(data_buff+0) +(*(data_buff+1)<<8))) ;   sample_y = (int16_t)((*(data_buff+2) +(*(data_buff+3)<<8)));   sample_z = (int16_t)((*(data_buff+4) +(*(data_buff+5)<<8)));    scale_x = (int16_t) (sample_x - circle_center_x0);   scale_y = (int16_t) (sample_y - circle_center_y0);   if(scale_x > 0 && scale_y > 0)     quad_rec.quad_1 = quad_rec.quad_1 + 1;   else if(scale_x < 0 && scale_y > 0)     quad_rec.quad_2 = quad_rec.quad_2 + 1;   else if(scale_x < 0 && scale_y < 0)     quad_rec.quad_3 = quad_rec.quad_3 + 1;   else if(scale_x > 0 && scale_y < 0)     quad_rec.quad_4 = quad_rec.quad_4 + 1;    if((quad_rec.quad_1 >= used_thresh) &&      (quad_rec.quad_2 >= used_thresh) &&        (quad_rec.quad_3 >= used_thresh) &&          (quad_rec.quad_4 >= used_thresh) )   {     quad_thresh_reach_flag = true;     return 1;   }   else if(quad_rec.quad_1 +quad_rec.quad_2+quad_rec.quad_3+quad_rec.quad_4 >= used_thresh*4*4)   {     quad_thresh_reach_flag = true;     return 1;   }   else     return 0; } static uint8_t revise_many_times(int16_t times) {     int count;      count=0;     while (1) {         //...         if (1==auto_exit_revise_deal(data_buf)) count++;     }     if (count>=times) return 1; }     //...     revise_many_times(20);     //...

自己顶一下,，麻烦了


Question: 链表无法结束输入

我去掉了逗号,如果有逗号，输入name之后要加个空格，然后再输入逗号，再加一个空格再输入score. 对于自己输入的是否是自己想要的，可以加个打印输出来吧，如果不能退出肯定是输入的不正确嘛

#include<stdio.h> //#include<malloc.h> #include <stdlib.h> #include <string.h>  #define LEN sizeof(struct Student)  struct Student {     char name[20];     float score;     struct Student *next; }; int n;  struct Student *creat() {     struct Student *head=NULL;     struct Student *p1=NULL;     struct Student *p2=NULL;     n = 0;      p1= p2 = (struct Student *)malloc(LEN);     scanf("%s%f", p1->name, &p1->score);     while(strncmp("end", p1->name, 3) != 0)     {         n = n+1;         if(1 == n)         {             head = p1;         }         else         {             p2->next = p1;         }         p2 = p1;         p1 = (struct Student *)malloc(LEN);         scanf("%s%f", p1->name, &p1->score);     }     free(p1);     p2->next = NULL;     return(head); }  void print(struct Student *head) {     struct Student *p;     printf("\nNow,These %d records are:\n",n);     p = head;     if(head != NULL)     {         do         {             printf("%s %5.1f\n", p->name, p->score);             p = p->next;         }while(p != NULL);     } }  int main(void) {     struct Student * head;     head=creat();     print(head);     return 0; }  测试如下： hello 1.2 world 1.3 end 1.2  Now,These 2 records are: hello   1.2 world   1.3  p1->name[20]已经提示越界，怎么没有修改呢。 为什么没有结束，其实这个问题可以一点点检测出来的。 最重要的是自己要动手，加加打印，测试一下。

[code=csharp#include<stdio.h> #include<malloc.h>  #define LEN sizeof(struct Student)  struct Student    { 	   char name[20];        float score;        struct Student *next;     }; int n;  struct Student *creat()    { 	   struct Student *head=NULL;        struct Student *p1=NULL; 	   struct Student *p2=NULL;        n = 0;      	   p1= p2 = (struct Student *)malloc(LEN);        scanf("%s,%f", p1->name, &p1->score); 	   if(0 == strncmp("end", p1->name, 3)) 	   { 		   return head; 	   }        head = NULL;        while('0' != p1->name[20])        { 		  n=n+1;           if(1 == n)  		  { 			  head = p1; 		  }           else  		  { 			  p2->next = p1; 		  }           p2 = p1;           p1 = (struct Student *)malloc(LEN);           scanf("%s,%f", p1->name, &p1->score); 		  if(0 == strncmp("end", p1->name, 3)) 		  { 			  return head; 		  }         }         	   p2->next = NULL;        return(head);    }  void print(struct Student *head)    { 	   struct Student *p;        printf("\nNow,These %d records are:\n",n);        p = head;        if(head != NULL) 	   { 		  do            { 			   printf("%s %5.1f\n", p->name, p->score);                p = p->next;            }while(p != NULL); 	   }     }][/code] 不知道为什么把scanf（“%s,%f”）里面逗号去掉就没办法结束循环，不去掉就会出现字符串没办法准确判别的问题

引用 3 楼 cfjtaishan 的回复:输入一下可以退出创建链表的循环； 0 1.1    /*两个数之间有空格*/ 结束不了呀

输入 0 1.1结束不了创建列表循环呀

输入一下可以退出创建链表的循环； 0 1.1    /*两个数之间有空格*/

name[20] 越界了吧 = =

#include <stdio.h> #include<malloc.h>  #define LEN sizeof(struct Student)  struct Student {     char name[20];     float score;     struct Student * next; };  int n;  struct Student * creat() {     struct Student * head;     struct Student * p1,* p2;     printf("please input records:\n");     n = 0;     p1=p2=(struct Student *) malloc(LEN);     scanf("%s%f", p1->name, &p1->score);     head = NULL;     while(p1->name[0] !='0')     {         n = n+1;         if(n==1)             head=p1;         else             p2->next = p1;         p2 = p1;         p1 = (struct Student *) malloc(LEN);         scanf("%s%f", p1->name, &p1->score);     }     free(p1);     p2->next = NULL;      return(head); }  void print(struct Student * head) {     struct Student * p;     printf("\nNow, These %d records are:\n",n);     p=head;     if(head!=NULL) {         do         {             printf("%s,%5.1f\n",p->name, p->score);             p=p->next;         }while(p!=NULL);     } }  int main() {     struct Student * head;     head=creat();     print(head);      return 0; }  scanf有问题，格式建议去掉逗号，用空格隔开


Question: 大神帮我看一下程序出错原因

输入没有不用\n

#include<stdio.h>  int main() {     int a,i;     printf("请输入一个数:");     scanf("%d", &a);    /*remove '\n'*/     printf("%d=", a);     for(i=2;i<=a;i++)     {         while(a%i==0)         {             printf("%d",i);             a/=i;             if(a!=1)                 printf("*");         }     }     printf("\n");     return 0; }


Question: 小白求助接口的参数类型如何使用

emSdkFileType是枚举标识，不能当作变量使用。 建议看一下这位博主的博客： http://www.cnblogs.com/JCSU/articles/1299051.html


Question: NtSetInformationProcess和NtSetInformationThread有上层的调用函数吗？

引用 1 楼 zhao4zhong1 的回复:设断点到该函数中，命中后看调用堆栈即可得到谁在哪里调用了该函数。 这种都没有文献说明吗？我知道deletefile会调用NtDeletefile，但是我怎么反推呢？没有样本，我怎么NtDeletefile可能会被deletefile调用，是这个意思

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

这个可能得去问微软，或者你写个？

设断点到该函数中，命中后看调用堆栈即可得到谁在哪里调用了该函数。


Question: C语言蚂蚁感冒

/* *且每次最多传染一只，同时同一个地点碰面蚂蚁最多两只，这里的计算方法局限 *很大，楼主可扩展至任意位置任意个数个传染源 *1输入蚂蚁个数 *2输入蚂蚁位置 *3位置各自+1 *4位置为0或100蚂蚁数-1，相邻蚂蚁位置相同各自取反位置, 感冒蚂蚁与下一个蚂蚁位置相 *同感冒蚂蚁数+1 *5蚂蚁数大于1跳至3否则跳至6 *6输出结果 * */ #include<stdio.h> #include<string.h> #include<stdlib.h> #define PMAX 100 #define PMIN 0 int main() {         unsigned int totalantnumber = 0;         unsigned int illant = 0;         signed int pgroupdata[50]; 	signed int *pgroup = pgroupdata; 	unsigned char pcounter = 0; 	unsigned char inputbuf1[5]; 	unsigned char inputbuf2[500]; 	signed int i = 0; 	signed int j = 0; 	signed int tmp = 0; 	unsigned char inputchar = 0; 	memset(inputbuf1, 0, 5); 	memset(inputbuf2, 0, 500); 	//save total ant 	for(i = 0; (i < 1000) && ((inputchar = getchar()) != -1) && ('\n' != inputchar) && ('\r' != inputchar); i++) 	{ 		if((i < 4) && (inputchar <= '9') && (inputchar >= '0')) 			inputbuf1[i] = inputchar; 	} 	inputbuf1[i] = '\0'; 	totalantnumber = atoi(inputbuf1); 	if(totalantnumber > 50) 	{ 		totalantnumber = 50; 	} 	//save ants position 	for(i = 0; (i < 1000) && ((inputchar = getchar()) != -1) && ('\n' != inputchar) && ('\r' != inputchar); i++)         {                 if((i < 500) && (((inputchar <= '9') && (inputchar >= '0')) || '-' == inputchar))                 { 			inputbuf2[i] = inputchar; 		} 		else if((i < 500) && (0x20 == inputchar)) 		{ 			inputbuf2[i] = '\0'; 		} 		         }         inputbuf2[i] = '\0'; 	inputbuf2[i + 1] = '#'; 	i = 0; 	pcounter = 0; 	while('#' != inputbuf2[i]) 	{ 		if( ((inputbuf2[i] <= '9') && (inputbuf2[i] >= '0')) || ('-' == inputbuf2[i])) 		{ 			tmp = atoi(&inputbuf2[i]); 			if(abs(tmp) <= PMAX) 			{ 				pgroup[pcounter] = tmp; 				pcounter++; 				if(pcounter >= 49) 					break; 			} 			while('\0' != inputbuf2[i]) 			{ 				i++; 			} 		} 		else	 		{ 			i++; 		} 	} 	if(pcounter != totalantnumber) 	{ 		return -1; 	} 	//sort to easy 'delete' die ant 	for (j = 0; j < totalantnumber - 1; j++) 	{ 		for (i = 0; i < totalantnumber - 1 - j; i++) 		{ 			if(abs(pgroup[i]) > abs(pgroup[i + 1])) 			{ 				pgroup[i] ^= pgroup[i + 1]; 				pgroup[i + 1] ^= pgroup[i]; 				pgroup[i] ^= pgroup[i + 1]; 			} 		} 	} 	while(totalantnumber) 	{ 		for(i = 0; i < totalantnumber; i++) 		{ 			pgroup[i] += 1; 			if((i > 0) && (i < (totalantnumber - 1)) && ((PMIN == pgroup[i])||(PMAX == pgroup[i]))) 			{ 				return -2; 			} 		} 		tmp = 0; 		if((PMIN == pgroup[0]) || (PMAX == pgroup[0])) 		{ 			pgroup += 1; 			tmp += 1; 		} 		if((PMIN == pgroup[totalantnumber - 1]) || (PMAX == pgroup[totalantnumber - 1])) 		{ 			tmp += 1; 		} 		totalantnumber -= tmp; 		if(totalantnumber <= 1) 			break; 		for(i = 0; i < totalantnumber - 1; i++) 		{ 			if(abs(pgroup[i]) == abs(pgroup[i + 1])) 			{ 				pgroup[i] ^= pgroup[i + 1]; 				pgroup[i+1] ^= pgroup[i]; 				pgroup[i] ^= pgroup[i + 1]; 				if(illant == i) 				{ 					illant++; 				} 			} 		} 	} 	illant++; 	printf("%d\n",illant); 	return 0; }

百度搜相关关键字。  边界条件 输入输出格式 ……


Question: C语言创建链表

你运行过？有许多错

http://blog.csdn.net/zhagoodwell/article/details/59230474 既有链表的有序插入 还有链表的有序合并

引用 6 楼 qq_37260235 的回复:为什么在vs2012上编译会有很多错误呢？ VS2012默认开启了安全开发生命周期检测，而C语言标准库的scanf()函数确实不安全的，它对输入的数量没有限制，所以VS2012默认不使用，它将标准库的不安全的函数换成了scanf_s()，多了一个参数，用来指定输入的数量。具体你可以自行搜索。

引用 5 楼 qq_37260235 的回复:[quote=引用 1 楼 zy010101 的回复:]  #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node {   int data;//定义一个数据段   struct node * pNext;//定义个指针域 }Node, * Pnode;  Pnode creat_list(void); void traverse_list(Pnode Phead);  int main(void) { Pnode pHead = NULL; pHead = creat_list();//创建一个非循环单链表,把链表的头结点地址付给Phead traverse_list(pHead);//遍历 return 0;  } Pnode creat_list(void) { int len;//用于存放有效节点的个数 int val;//用来临时存放用户输入的节点的值 int i;   //分配了一个不存放有效数据的头结点 Pnode pHead = (Pnode)malloc(sizeof(Node)); if (NULL == pHead) { printf("分配失败，程序终止！\n"); exit(-1); } Pnode pTail = pHead; pTail->pNext=NULL;   printf("请输入链表的长度: len = "); scanf("%d",&len);  for(i = 0; i<len;++i) { printf("请输入第%d个节点的值",i+1); scanf("%d,&val");     //这里写错了,scanf("%d",&val); Pnode pNew = (Pnode)malloc(sizeof(Node)); if(NULL == pNew) { printf("分配失败，程序终止!\n"); exit(-1); } pNew->data = val; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew;  } return pHead; } void traverse_list(Pnode pHead) { Pnode p = pHead->pNext; while (NULL != p) { printf("%d",p->data); p = p->pNext; } printf("\n"); return; }   之前在vs上编译了我发现了还改了的。。结果一直报错，我就忘记保存了，在c-free5上就没注意。。对了对了，多谢[/quote]  你注意看一下IDE下面的提示，即使没有错误，应该也会有警告的，警告也需要你注意。警告不是真的可以忽略的。

将两个有序链表合并成一个有序链表 http://blog.csdn.net/lalor/article/details/7429989

#pragma warning(disable:4996)

引用 6 楼 qq_37260235 的回复:为什么在vs2012上编译会有很多错误呢？ 那只能说跟你的编译器有关。 在Linux下，编译，运行，测试都没有问题。

为什么在vs2012上编译会有很多错误呢？

引用 1 楼 zy010101 的回复: #include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef struct node {   int data;//定义一个数据段   struct node * pNext;//定义个指针域 }Node, * Pnode;  Pnode creat_list(void); void traverse_list(Pnode Phead);  int main(void) { Pnode pHead = NULL; pHead = creat_list();//创建一个非循环单链表,把链表的头结点地址付给Phead traverse_list(pHead);//遍历 return 0;  } Pnode creat_list(void) { int len;//用于存放有效节点的个数 int val;//用来临时存放用户输入的节点的值 int i;   //分配了一个不存放有效数据的头结点 Pnode pHead = (Pnode)malloc(sizeof(Node)); if (NULL == pHead) { printf("分配失败，程序终止！\n"); exit(-1); } Pnode pTail = pHead; pTail->pNext=NULL;   printf("请输入链表的长度: len = "); scanf("%d",&len);  for(i = 0; i<len;++i) { printf("请输入第%d个节点的值",i+1); scanf("%d,&val");     //这里写错了,scanf("%d",&val); Pnode pNew = (Pnode)malloc(sizeof(Node)); if(NULL == pNew) { printf("分配失败，程序终止!\n"); exit(-1); } pNew->data = val; pTail->pNext = pNew; pNew->pNext = NULL; pTail = pNew;  } return pHead; } void traverse_list(Pnode pHead) { Pnode p = pHead->pNext; while (NULL != p) { printf("%d",p->data); p = p->pNext; } printf("\n"); return; }   之前在vs上编译了我发现了还改了的。。结果一直报错，我就忘记保存了，在c-free5上就没注意。。对了对了，多谢

引用 3 楼 cfjtaishan 的回复:#include<stdio.h> //#include<malloc.h> #include<stdlib.h>  typedef struct node {     int data;     struct node * pNext; }Node, * Pnode;  Pnode creat_list(void); void traverse_list(Pnode Phead);  int main(void) {     Pnode pHead = NULL;     pHead = creat_list();     traverse_list(pHead);     return 0;  } Pnode creat_list(void) {     int len;     int val;     int i;       //分配了一个不存放有效数据的头结点     Pnode pHead = (Pnode)malloc(sizeof(Node));     if (NULL == pHead)     {         printf("分配失败，程序终止！\n");         exit(-1);     }     Pnode pTail = pHead;     pTail->pNext=NULL;       printf("请输入链表的长度: len = ");     scanf("%d",&len);      for(i = 0; i<len;++i)     {         printf("请输入第%d个节点的值",i+1);         scanf("%d", &val);    /*这个地方的error编译器应该会有提示才对*/         Pnode pNew = (Pnode)malloc(sizeof(Node));         if(NULL == pNew)         {             printf("分配失败，程序终止!\n");             exit(-1);         }         pNew->data = val;         pTail->pNext = pNew;         pNew->pNext = NULL;         pTail = pNew;      }     return pHead; } void traverse_list(Pnode pHead) {     Pnode p = pHead->pNext;     while (NULL != p)     {         printf("%d",p->data);         p = p->pNext;     }     printf("\n");     return; }   建议把没必要的注释去掉，注释太多反而会让代码看着更凌乱。 对于一看就能懂的代码不需要加注释。这个代码里创建链表的方法可以加一下注释：尾插法创建链表  因为才在学这里，就注释了很多，编译器也没报错。。就是一运行就工作停止那种，是哪里错了呀

[b同学，C语言的错误如此的难以寻找，不如来学习python吧][/b]


Question: linux c正则表达式，我在用C做一个邮箱的正则表达式匹配，不知道为什么匹配不过

另外的话赵四老师给的例子是windows下面C++的正则表达式匹配，其实开始我也是用的这个，但是移植到linux下面就不行了，所以就开始研究linux下的POSIX  C  正则表达式，http://blog.csdn.net/echo_qiang/article/details/5907679这篇博客说的比较详细，但是其中有些内容是错误的，不过最后慢慢摸索成功了，还好。

楼上的str字符串写错了，应该为： string str = "futu-i!#$%&’*+/=?^_`{|}~-n_c.n_n@futu5-h_eheda.c_-om.c_-n.g-g.si-_mida.x-_ixi";

哎，赵四老师果然英明神武，给你分啦，最后我发现每部分都加（）就能匹配了，不知道是不是和POSIX的规则有关系，以下是我准备使用的代码，    char heheda[4096*1024];     //FILE *file = fopen("/home/iversonzhang/testfile/allemail.txt","r");     //FILE *out  = fopen("/home/iversonzhang/testfile/outfile.txt","w");     const char * str2 = "^([[:space:]]*[[:alnum:].!#$%&’*+/=?^_`{|}~-]+)@([[:alnum:]/_/-]+)(([/.][[:alnum:]/_/-]+){1,64}[[:space:]]*)$";     string str = "futu-i!#$%&’*+/=?^_`{|}~-]+n_c.n_n@futu5-h_eheda.c_-om.c_-n.g-g.si-_mida.x-_ixi";     const char * str1 = str.c_str();     //size_t filesize = fread(heheda, sizeof(char), sizeof(heheda), file);     //printf("filesize:%d; %d\n",filesize,4096*1024);     regex_t comment;     size_t nmatch;     regmatch_t regmatch[100];          int i = regcomp(&comment, str2, REG_EXTENDED);     if(i !=0){ 	    printf("i:%d\n",i);     }     int j;     j = regexec(&comment,str,99,regmatch,0);     if(j != 0)     { 		printf("j:%d\n",j); 		return 0;     }     //输出匹配字串     for(int i = 0; i< 100 && regmatch[i].rm_so!= -1;i++)     {            char aa[100];         strncpy(aa, str1+regmatch[i].rm_so, regmatch[i].rm_eo - regmatch[i].rm_so);         aa[regmatch[i].rm_eo-regmatch[i].rm_so]='\0';         printf("%s\n",aa);     }     regfree(&comment);     return 0;

仅供参考：#include <iostream> #include <string> #include <regex> using namespace std; int main() {     string str("This expression could match from A and beyond. [ expression  express ]");     string rs = "exp\\w*";  // 正则字符串，exp开始的单词     cout << str << endl;      regex expression(rs); // 字符串传递给构造函数，建立正则表达式  // regex_match 判断一个正则表达式(参数 e)是否匹配整个字符序列 str. 它主要用于验证文本。 // 注意，这个正则表达式必须匹配被分析串的全部，否则函数返回 false. // 如果整个序列被成功匹配，regex_match 返回 True.     bool ret = regex_match(str, expression);     if (ret)         cout << "可以匹配整个文本" << endl;     else         cout << "不能匹配整个文本" << endl;  // regex_search 类似于 regex_match, 但它不要求整个字符序列完全匹配。 // 你可以用 regex_search 来查找输入中的一个子序列，该子序列匹配正则表达式 e.     ret = regex_search(str, expression);     if (ret)         cout << "能够搜索到 " << rs << endl;     else         cout << "不能搜索" << endl;  // regex_replace 在整个字符序列中查找正则表达式e的所有匹配。 // 这个算法每次成功匹配后，就根据参数fmt对匹配字符串进行格式化。 // 缺省情况下，不匹配的文本不会被修改，即文本会被输出但没有改变。      str = regex_replace(str, expression, string("表达式")); // VC2010或者TR1注意：这里第三个参数要用string()转换 // http://www.johndcook.com/cpp_regex.html // started with C++ TR1 regular expressions     cout << str << endl;     return 0; } //This expression could match from A and beyond. [ expression  express ] //不能匹配整个文本 //能够搜索到 exp\w* //This 表达式 could match from A and beyond. [ 表达式  表达式 ]

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。


Question: 为什么在调用C语言链表的时候会出现这种运行错误？？

引用 10 楼 kugeniha 的回复:因为你的main函数L是二重指针，并且是一个野指针。那么传到createList_head中，一样是一个野指针。那么野指针，操作*L申请空间很可能会出现段错误。                             恍然大悟(ಡωಡ) 同悟同悟

引用 8 楼 cfjtaishan 的回复:#include <stdio.h> #include<stdlib.h>  typedef struct LNode{     int data;     struct LNode *next; }LNode,*LinkList;  //头插法 void createList_head(LinkList *L) {     LNode *s;      int x;     (*L) = (LinkList)malloc(sizeof(LNode));     (*L)->next = NULL;     scanf("%d",&x);     while(x!=999){         s =(LNode *)malloc(sizeof(LNode));         s->data = x;         s->next = (*L)->next;         (*L)->next = s;         scanf("%d",&x);     } }     int main() {     LinkList* L1;     LinkList L ;     createList_head(&L);      return 0; } 因为你的main函数L是二重指针，并且是一个野指针。那么传到createList_head中，一样是一个野指针。那么野指针，操作*L申请空间很可能会出现段错误。 将main函数里的ListList改成一重的指针就可以了。 你的上一个程序，可能也是这个原因。 哦哦好了换成一重指针就好了，为什么一重指针和二重指针同样是作为指针二传到createList_head中会有区别呢，他们定义的时候是不是都是野指针？然后把一重指针的地址&L传进create函数里面然后createList_head（**L）里面的**L就不是一个野指针了，然后操作*L就不会出现错误了，是不是这样理解的？

引用 5 楼 cfjtaishan 的回复:定义的数据结构有问题吧，链表的每个节点都有row, col，但是都没有使用。只用了第一个节点（即头节点）的row和col; 另外，你的col（输入的）若大于10，那么data就越界了。  [quote=引用 3 楼 hkangj 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 只看这几部分代码，看不出什么问题来。也不知道你创建链表的逻辑是什么，怎么判定是否有error  创造链表的代码在这里[/quote][/quote] 可是换成这样也是运行有错 源代码： #include <stdio.h>  #include<stdlib.h> typedef struct LNode{ 	int data; 	struct LNode *next;  }LNode,*LinkList;  //头插法	 void createList_head(LinkList* L ){ 	LNode *s; 	int x; 	(*L) = (LinkList)malloc(sizeof(LNode));//开辟头节点的空间  	(*L)->next = NULL;  //设头节点的指针域为空  	scanf("%d",&x); 	while(x!=999){ 		s =(LNode *)malloc(sizeof(LNode)); 		s->data = x;  //头插法建立链表  		s->next = (*L)->next; 		(*L)->next = s; 		scanf("%d",&x); 	} }  int main(){ 	LinkList* L1  ; 	LinkList* L ; 	createList_head(L);	 }

typedef struct LNode {     ElemType *data;     ElemType size;     struct LNode *next; }LNode, *LinkList; 定义成上面的格式，然后每次创建节点时，对data先malloc

定义的数据结构有问题吧，链表的每个节点都有row, col，但是都没有使用。只用了第一个节点（即头节点）的row和col; 另外，你的col（输入的）若大于10，那么data就越界了。  引用 3 楼 hkangj 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 只看这几部分代码，看不出什么问题来。也不知道你创建链表的逻辑是什么，怎么判定是否有error  创造链表的代码在这里[/quote]

引用 2 楼 kaijkl 的回复:你的链表为什么要定义成二级指针？ 操作链表

引用 1 楼 cfjtaishan 的回复:只看这几部分代码，看不出什么问题来。也不知道你创建链表的逻辑是什么，怎么判定是否有error  创造链表的代码在这里

你的链表为什么要定义成二级指针？

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

引用 12 楼 cfjtaishan 的回复:[quote=引用 9 楼 hkangj 的回复:] [quote=引用 8 楼 cfjtaishan 的回复:] #include <stdio.h> #include<stdlib.h>  typedef struct LNode{     int data;     struct LNode *next; }LNode,*LinkList;  //头插法 void createList_head(LinkList *L) {     LNode *s;      int x;     (*L) = (LinkList)malloc(sizeof(LNode));     (*L)->next = NULL;     scanf("%d",&x);     while(x!=999){         s =(LNode *)malloc(sizeof(LNode));         s->data = x;         s->next = (*L)->next;         (*L)->next = s;         scanf("%d",&x);     } }     int main() {     LinkList* L1;     LinkList L ;     createList_head(&L);      return 0; } 因为你的main函数L是二重指针，并且是一个野指针。那么传到createList_head中，一样是一个野指针。那么野指针，操作*L申请空间很可能会出现段错误。 将main函数里的ListList改成一重的指针就可以了。 你的上一个程序，可能也是这个原因。 哦哦好了换成一重指针就好了，为什么一重指针和二重指针同样是作为指针二传到createList_head中会有区别呢，他们定义的时候是不是都是野指针？然后把一重指针的地址&L传进create函数里面然后createList_head（**L）里面的**L就不是一个野指针了，然后操作*L就不会出现错误了，是不是这样理解的？[/quote] main函数里定义一个一重指针，在create里你是对一重指针申请空间，这没问题呢。[/quote] 懂了懂了，恍然大悟，谢谢谢谢

引用 9 楼 hkangj 的回复:[quote=引用 8 楼 cfjtaishan 的回复:] #include <stdio.h> #include<stdlib.h>  typedef struct LNode{     int data;     struct LNode *next; }LNode,*LinkList;  //头插法 void createList_head(LinkList *L) {     LNode *s;      int x;     (*L) = (LinkList)malloc(sizeof(LNode));     (*L)->next = NULL;     scanf("%d",&x);     while(x!=999){         s =(LNode *)malloc(sizeof(LNode));         s->data = x;         s->next = (*L)->next;         (*L)->next = s;         scanf("%d",&x);     } }     int main() {     LinkList* L1;     LinkList L ;     createList_head(&L);      return 0; } 因为你的main函数L是二重指针，并且是一个野指针。那么传到createList_head中，一样是一个野指针。那么野指针，操作*L申请空间很可能会出现段错误。 将main函数里的ListList改成一重的指针就可以了。 你的上一个程序，可能也是这个原因。 哦哦好了换成一重指针就好了，为什么一重指针和二重指针同样是作为指针二传到createList_head中会有区别呢，他们定义的时候是不是都是野指针？然后把一重指针的地址&L传进create函数里面然后createList_head（**L）里面的**L就不是一个野指针了，然后操作*L就不会出现错误了，是不是这样理解的？[/quote] main函数里定义一个一重指针，在create里你是对一重指针申请空间，这没问题呢。


Question: 关于mingw.h的报错，有个简单但是又找不到解决办法的问题

没有装Winows SDK吧。

这是没有找到头文件吧,stdio.h