Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 二进制文件读写，结构中带指针。字符串多出乱码

回复:
user: user-1
content: 它是直接malloc更大的空间，而不是根据实际输入的字符长度来malloc的

user: user-2
content: 引用 1 楼 jingxingxiaozhang 的回复:我找到问题了。我想后面有乱码肯定是没有\0，没有\0肯定是写入文件的时候，没有写入\0.我将 one.age = 20; one.name_len = strlen(name) +1   one.name = malloc(strlen(name)+1);     //这里开辟内存空间包括了\0 strcpy_s(one.name, strlen(name)+1, name);   //将name复制给noe.name 我给one.name_len 加上了1一个字节。这个输出就正确了。 但是我看视频上，同样的他是这么写的 	struct teacher one; 	char* name = "zhangsan"; 	one.age = 10; 	one.id = 20; 	one.name = malloc(64); 	memest(one.name, 0, 64); 	strcpy(one.name, name); 	one.name_len = strlen(name); 他这个也没有给\0的空间，为什么他最后能正常输出呢？？？？ 他直接先malloc了64个字节

user: user-3
content: 把结构体中的指针写入文件是没用的，你需要写入指针指向的内容，读取时重新创建

user: user-4
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

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

user: user-0
content: 我找到问题了。我想后面有乱码肯定是没有\0，没有\0肯定是写入文件的时候，没有写入\0.我将 one.age = 20; one.name_len = strlen(name) +1   one.name = malloc(strlen(name)+1);     //这里开辟内存空间包括了\0 strcpy_s(one.name, strlen(name)+1, name);   //将name复制给noe.name 我给one.name_len 加上了1一个字节。这个输出就正确了。 但是我看视频上，同样的他是这么写的 	struct teacher one; 	char* name = "zhangsan"; 	one.age = 10; 	one.id = 20; 	one.name = malloc(64); 	memest(one.name, 0, 64); 	strcpy(one.name, name); 	one.name_len = strlen(name); 他这个也没有给\0的空间，为什么他最后能正常输出呢？？？？
user-0 提问: 求一个编写C语言的软件，谢谢！！！

回复:
user: user-1
content: Pelles C for Windows

user: user-2
content: visual studio 2013

user: user-3
content: 感觉用vc++顺手啊啊啊啊

user: user-4
content: DEV——C++  小 好用 编写控制台小程序好了

user: user-5
content: c-free

user: user-0
content: 谢谢各位大神。

user: user-6
content: WINDOWS下可以用VS2010

user: user-7
content: VS2008或者Devc++ CodeBlocks也行

user: user-8
content: vs2012

user: user-9
content: vs2015或vscode

user: user-10
content: C与C++程序设计学习与实验系统 2013.3 可以不用建立项目（单文件），简单的试验代码甚至不用保存为文件，直接编译运行观察结果，比较方便。 只有几十M大小。

user: user-11
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-12
content: 没人推荐codeblocks?

user: user-13
content: vs2010
user-0 提问: 多源代码文件程序的编译,新手求教，急急！！！

回复:
user: user-1
content: 通常有个IDE的话直接添加到IDE新建的项目里即可

user: user-0
content: 已经好了，谢谢

user: user-2
content: 类似这样： gcc -g -Wall -o test xx1.c xx2.c xx3.c

user: user-3
content: 1.如果是用的是IDE，比如VS之类的 将文件添加到工程中，然后点运行就行  2.GCC手动编译链接：http://www.cnblogs.com/hdchild/archive/2009/11/07/1598178.html
user-0 提问: C语言 八字节浮点数时间戳怎么转

回复:
user: user-1
content: 引用 5 楼 qq_15534581 的回复:不是一个人。。。 只是《黑客帝国》中Matrix系统中同一个类的不同实例。

user: user-0
content: 不是一个人。。。

user: user-2
content: 和那个帖主是一个人吗，怎么数据都那么象

user: user-1

user: user-0
content: 多谢  看到里面你说的那句  加31年 瞬间顿悟

user: user-1
content: http://bbs.csdn.net/topics/392043099
user-0 提问: 这个函数怎么实现它的功能？

回复:
user: user-1
content: 链接发错帖子了

user: user-1
content: https://msdn.microsoft.com/en-us/library/bb776913.aspx https://msdn.microsoft.com/en-us/library/bb775966.aspx

user: user-2
content: 这是事件机制，当按下键盘某个键时候，就会触发键盘事件，程序会给予响应

user: user-3
content: #include <conio.h> int main() {     int key;       while(1)     {         key=getch(); //这里         if (key == '\033') //按了ESC键         {             printf("0x%x\n",key);             break;         }         else         {             printf("0x%x\n",key); //*打印出各键对对应的键值         }     }       return 0; }

user: user-4
content: ESC的ASCII码是27，可以通过检查是不是27判断是否按的是ESC

user: user-5
content: VS IDE中，在Exit上点鼠标右键，选查找所有引用。

user: user-0
content: 能具体说一下吗，没有听懂……我是新手……

user: user-6
content: 按键消息..
user-0 提问: 关于sizeof的浅显理解

回复:
user: user-1
content: sizeof 和 strlen 的关系，就像数值 2 和 "int a" 的 a 一样。

user: user-2
content: 的确理解够浅显

user: user-3
content: 分析的不错啊，不过sizeof的水还是比较深的，慢慢体会吧

user: user-4
content: 谢谢楼主分享

user: user-5
content: 总是把不相关的知识点放在一起讨论。

user: user-6
content: sizeof  是一个编译期间的运算符, 编译完成后就是一个常数 strlen 是运行的时候要去扫描内存, 是动态计算结果的.

user: user-7
content: sizeof和\0没什么关系

user: user-8
content: 建议楼主闲来无事去看看gcc/g++源代码中sizeof的实现。

user: user-9
content: sizeof 给出的类型的大小。如果给它一个对象，那么给出的这个对象的类型的大小。  当对象是一个子对象的时候，sizeof 给出的大小可以跟对象的实际大小不一致。
user-0 提问: 为什么JAVA的封装函数那么多而C库函数少？

回复:
user: user-1
content: 因为C处在底层，从底层到高层是倒金字塔型， 最底层就是高电平低电平两个接口

user: user-2
content: C发展的比较早（那时候软件开发的规模也要小些），还没有面向对象，也就没有类库，只有一些标准库函数和一些IDE扩充的库函数。 好比诺基亚黑白屏手机，和现在的苹果、安卓手机比。

user: user-3
content: 面向对象 +　设计模式

user: user-4
content: C只是标准库函数少，基本得用平台库。就看你要不要把平台库看成是C库了。

user: user-5
content: 因为缺少的功能可以自己编

user: user-6
content: 因为C完成很多功能无需库。

user: user-7
content: 实际上JDK中也不过4000多个类，和.net框架、VCL/FMX框架比还差得远，后两者都上万。

user: user-8
content: C不属于任何一个公司，而java属于oracle

user: user-7
content: 为什么QQ那么便宜Ferrari那么贵？
user-0 提问: 获取可变长数组内的无素出现乱码

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

user: user-2
content: 1.这种写法只有GCC编译器可以通过编译 scanf("%d%d",&n,&m);  int array[n][m];  2.用malloc或者new动态分配  3.用STL，比如vector什么的

user: user-0
content: 也就是说在程序运行期，可变长数组的长度是不可改变的罗只能使用下面这个方式  #define ROW_MAX 2 #define COLUMN_MAX 3 int a[ROW_MAX][COLUMN]_MAX;  如果需要在程序运行时改变大小，只能利用malloc calloc分配内存进行操作，这样理解没问题吧？还有没其它方法可以实现在程序运行过程中动态改变的？

user: user-2
content: int array[n][m]; printf("这是一个二维数组遍历的参考例子\n"); printf("请输入二维数组的行和列\n"); scanf("%d%d", &n, &m);  你这样的写法已经定死了数组的两个维度了，是1X1的

user: user-3
content: //int array[n][m];       printf("这是一个二维数组遍历的参考例子\n");       printf("请输入二维数组的行和列\n");       scanf("%d%d",&n,&m);       int array[n][m];
user-0 提问: usb鼠标 绝对坐标

回复:
user: user-1
content: 将鼠标换成数字手写板。

user: user-0
content: 就单片机做鼠标连电脑来的

user: user-2
content: 数字化仪支持绝对坐标输入，就是不便宜啊

user: user-3
content: 引用 3 楼 tw2429 的回复:就单片机做鼠标连电脑来的  用单片机感觉有点大材小用，虽然比较万能（通用）。

user: user-3
content: 驱动和操作系统也要配合。

user: user-3
content: 应该要修改硬件的固件（可能是集成的芯片）。
user-0 提问: 在.h头文件中宏定义数组元素，但不定义数组，在.c文件中再正式定义数组行吗？

回复:
user: user-1
content: 要完全彻底地弄清楚这个问题，我觉得可以试试了解一下gcc源代码中处理宏定义相关片断。

user: user-0
content: 请cyfcsd回答一下我的问题，数组怎么就成为只读的了？为什么不能写AOCC_BSADE[0]=...这样的语句了?

user: user-2
content: 引用 7 楼 xixia07m 的回复:请cyfcsd回答一下我的问题，数组怎么就成为只读的了？为什么不能写AOCC_BSADE[0]=...这样的语句了? 你定义了#define  AOCC_BSADE[0]  one以后程序里的所有AOCC_BSADE[0]都会变成one，one=...这种语句不能通过编译

user: user-2
content: 宏定义就是纯粹的字符串替换，以后你代码中的AOCC_BSADE[0]都会变成one，这应该不是你想要的吧，还有在.c文件中定义不加extern，声明时才用 你到底是要实现什么功能啊？

user: user-0
content: 引用 5 楼 cyfcsd 的回复:[quote=引用 4 楼 xixia07m 的回复:] [quote=引用 1 楼 cyfcsd 的回复:] 宏定义就是纯粹的字符串替换，以后你代码中的AOCC_BSADE[0]都会变成one，这应该不是你想要的吧，还有在.c文件中定义不加extern，声明时才用 你到底是要实现什么功能啊？  这是我想要的。把定义语句改为  char  AOCC_BSADE[AOCC_BSADE_NUM]  是不是就可以了？这个数组要在串口通讯程序中用到，我的问题就是能不能在.h文件中不定义这个数组，而把它定义在串口通讯程序所在的main程序的前面？这样的安排可以吗？[/quote] 这么用那这个数组就成了只读的了，不能写AOCC_BSADE[0]=...这样的语句了，定义可以放到main程序前面，但只能在main函数这个文件里用，不能在别的文件里用[/quote]  为什么就成只读的了？写成AOCC_BSADE[0]=XXX会有什么问题？

user: user-2
content: 引用 4 楼 xixia07m 的回复:[quote=引用 1 楼 cyfcsd 的回复:] 宏定义就是纯粹的字符串替换，以后你代码中的AOCC_BSADE[0]都会变成one，这应该不是你想要的吧，还有在.c文件中定义不加extern，声明时才用 你到底是要实现什么功能啊？  这是我想要的。把定义语句改为  char  AOCC_BSADE[AOCC_BSADE_NUM]  是不是就可以了？这个数组要在串口通讯程序中用到，我的问题就是能不能在.h文件中不定义这个数组，而把它定义在串口通讯程序所在的main程序的前面？这样的安排可以吗？[/quote] 这么用那这个数组就成了只读的了，不能写AOCC_BSADE[0]=...这样的语句了，定义可以放到main程序前面，但只能在main函数这个文件里用，不能在别的文件里用

user: user-0
content: 引用 1 楼 cyfcsd 的回复:宏定义就是纯粹的字符串替换，以后你代码中的AOCC_BSADE[0]都会变成one，这应该不是你想要的吧，还有在.c文件中定义不加extern，声明时才用 你到底是要实现什么功能啊？  这是我想要的。把定义语句改为  char  AOCC_BSADE[AOCC_BSADE_NUM]  是不是就可以了？这个数组要在串口通讯程序中用到，我的问题就是能不能在.h文件中不定义这个数组，而把它定义在串口通讯程序所在的main程序的前面？这样的安排可以吗？

user: user-1
content: 理解和讨论之前请先学会如何观察！  VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-3
content: 要实现啥目的呢？
user-0 提问: printf()参数列表类型的问题

回复:
user: user-1
content: 与 %s 匹配的本身就是 char* 指针，而输出的内容就是字符串，而不是指针的值  要输出指针的值，用的是%p

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

user: user-3
content: 与%s匹配的应该是指针

user: user-0
content: 下面是百度到的，好像明白了。 “具体说就是用char *p="abcqer12345";这种方法定义字符串是不能通过指针改变内容的，原因是这个定义确定了abcqer12345是字符串常量——因为char *p="abcqer12345";被编译器解释为“创建一个字符串常量abcqer12345，并把它的首地址(就是a的地址)赋给char *型指针p”——既然是“常量”，自然就不能更改。”

user: user-4
content: char *first;表示的是指向一个字符串的指针，不是代表指向一个字符的指针。 你用%c去输出treas.first当然有警告

user: user-0
content: #include <stdio.h> int main(void) {     struct pnames{     	char *first;     	char *last; 	}; 	struct pnames treas={'n','m'}; 	printf("%c\n",treas.first); 	system("pause"); 	return 0;	 } 为什么会报错？8	9	D:\CPP\TestStruc.c	[Warning] initialization makes pointer from integer without a cast

user: user-5
content: char* first;   // 是一指针 指向了常量 "Brad";  和 char * str="Brad";的道理;  #include <stdio.h> int main(void) {     struct pnames {         char* first;         char* last;     };     struct pnames treas = {"Brad", "Fallingjaw"};     char* str = "Brad";      printf("%s\t%d\n", treas.first, &treas.first);     printf("%s\t%d\n", str, &str);     return 0; }  //    输出 //    Brad    2686744 //    Brad    2686740
user-0 提问: DEV C++改完配置之后可以调试，但重新打开出现问题是怎么回事？

回复:
user: user-1
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  关闭UAC、防火墙、杀毒软件、……

user: user-2
content: DEV C++ 默认只带 32位编译器吧 你改成使用 64 位编译器设置，但是实际没有 64位的吧
user-0 提问: 为什么fgets没有读取到\n

回复:
user: user-1
content: http://en.cppreference.com/w/c/io/fgets

user: user-2
content: 不要妄下结论。 fgets, fgetws Get a string from a stream.  char *fgets( char *string, int n, FILE *stream );  wchar_t *fgetws( wchar_t *string, int n, FILE *stream );  Function Required Header Compatibility  fgets <stdio.h> ANSI, Win 95, Win NT  fgetws <stdio.h> or <wchar.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns string. NULL is returned to indicate an error or an end-of-file condition. Use feof or ferror to determine whether an error occurred.  Parameters  string  Storage location for data  n  Maximum number of characters to read  stream  Pointer to FILE structure  Remarks  The fgets function reads a string from the input stream argument and stores it in string. fgets reads characters from the current stream position to and including the first newline character, to the end of the stream, or until the number of characters read is equal to n – 1, whichever comes first. The result stored in string is appended with a null character. The newline character, if read, is included in the string.   fgets is similar to the gets function; however, gets replaces the newline character with NULL. fgetws is a wide-character version of fgets.   fgetws reads the wide-character argument string as a multibyte-character string or a wide-character string according to whether stream is opened in text mode or binary mode, respectively. For more information about using text and binary modes in Unicode and multibyte stream-I/O, see Text and Binary Mode File I/O and Unicode Stream I/O in Text and Binary Modes.  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _fgetts fgets fgets fgetws    Example  /* FGETS.C: This program uses fgets to display  * a line from a file on the screen.  */  #include <stdio.h>  void main( void ) {    FILE *stream;    char line[100];     if( (stream = fopen( "fgets.c", "r" )) != NULL )    {       if( fgets( line, 100, stream ) == NULL)          printf( "fgets error\n" );       else          printf( "%s", line);       fclose( stream );    } }   Output  /* FGETS.C: This program uses fgets to display     Stream I/O Routines  See Also   fputs, gets, puts

user: user-3
content: 你可以试着从文件读，就可以读到换行符了

user: user-3
content: 因为被控制台吃了，控制台通过换行符判断一次输入结束
user-0 提问: 求给定精度的简单交错序列部分和 

回复:
user: user-1
content: #include<stdio.h> int main() { 	double a,b,d,sum=0; 	int i,c=1; 	scanf("%lf",&a); 	for(i=1;c!=0;i=i+3) 	{ 		b=1.000/i; 		if(i%2!=0) 			sum=sum+b; 		else 			sum=sum-b; 		if(b<=a) 			c=0; 	} 	printf("sum = %lf",sum); 	return 0; }

user: user-2
content: 看一下while的循环条件，应该是while(fabs(k)>eps)

user: user-3
content: 首先“ }while(fabs(k)>=eps);”改成“ }while(fabs(k)>eps);”，满足题目中不大于的条件； 其次将   if (fabs(k)<eps)  break; 改成    if (fabs(k)<eps) { s=1.0; break; } 这样是保证当输入esp的值大于1时，输出的值为1.

user: user-4
content: 题目中说不大于， 这里改成    }while(fabs(k)>eps);  看下是否可以

user: user-5
content: printf("sum = %.15lg\n",s); ？
user-0 提问: 关于链表

回复:
user: user-0
content: 非常感谢两位

user: user-1
content: link 相当于Node * link l; 相当于 Node *l; typedef是取别名的意思，不是定义变量

user: user-2
content: 前面有typedef, link是定义一个类型，相当于node *
user-0 提问: 归并排序为什么for循环不从第一个数字开始输出

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

user: user-2
content: 是你的控制台输出的行数有限。 点击窗口左上角的那个小图标，选择“默认值”，然后在“布局”选项卡中增大缓冲区的高度。
user-0 提问: 数据结构二叉树问题

回复:
user: user-0
content: 修改发的错误                  void leaf1(BiTree root) { if(root!=NULL) { leaf(root->LChild); leaf(root->RChild); if(root->LChild==NULL&&root->RChild!=NULL)   LeafCount1++; if(root->LChild!=NULL&&root->RChild==NULL)   LeafCount1++; }	 }
user-0 提问: 关于文件remove函数的操作

回复:
user: user-0
content: 嗯 删除文件

user: user-1
content: 你说的是删除文件？？？？

user: user-2
content: 写保护？ 关闭UAC、防火墙、杀毒软件、……  Change the current working directory. int _chdir( const char *dirname );
user-0 提问: 高手求教，为什么swap函数没能交换两指针变量本身的地址。。

回复:
user: user-1
content: swap（）函数用void空类型，并不会改变*p1和*p2的值啊，这两个值只会在函数内改变，并不会把主程序中的*p1和*p2改掉，而且函数内的变量用完就自动删掉了，并没有什么用。你可以把*p1和*p2改为全局变量，这样就可以在执行函数的时候改动变量的值了。注意swap括号里的东西要删掉。

user: user-2
content: void swap(int *p1,int *p2){ int p; p=*p1,*p1=*p2,*p2=p; }

user: user-3
content: 你传地址应该改内容啊 改成这样试试   #include <stdio.h> void swap(int *p1,int *p2){ int p; p=*p1,*p1=*p2,*p2=p; } void main(){ int a,b; int *t1=&a,*t2=&b; printf("请输入a和b的值\n"); scanf("%d,%d",&a,&b); if(a<b){ swap(t1,t2); } printf("a=%d,b=%d\n",a,b); printf("max=%d,min=%d",*t1,*t2); }

user: user-4
content: 仅供参考：#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-5
content: 例3： #include <stdio.h>  void change(int *, int *); int main (void) {     int x = 3, y = 5;      change(&x,&y);     printf("x = %d, y = %d",x, y);     return 0; } void change(int * a, int * b) {     int t;     t = *a;     *a = *b;     *b = t; }  结果：x = 5, y = 3 分析：交换成功！把地址传过去，直接改地址里的值。

user: user-5
content: #include <stdio.h>  void change(int *, int *); int main (void) {     int x = 3, y = 5;      change(&x,&y);     printf("x = %d, y = %d",x, y);     return 0; } void change(int * a, int * b) {     printf("a = %d, b = %d\n",*a, *b);     int * t;     t = a;     a = b;     b = t;     printf("a = %d, b = %d\n",*a, *b); }  结果： a = 3, b = 5 a = 5, b = 3 x = 3, y = 5 分析：没有交换！把地址传过去，但是是把地址传给了新定义的两个指针变量，然后两个指针变量的值的给交换啦，所以两个新定义的指针变量所指向的对象交换啦，但是原先的两个整型变量值并没有改！ 易错点：C语言中实参变量和形参变量之间的数据传递是单向的“值传递”方式。不能通过执行调用函数（change）来改变实参指针变量(&x,&y)的值，但是可以改变实参指针变量所指变量的值。
user-0 提问: 关于使用Visual Studio 2013运行c程序的问题

回复:
user: user-1
content: 引用 10 楼 hdj_cz_forever 的回复:[quote=引用 4 楼 wenpinglaoyao 的回复:] [quote=引用 2 楼 wenpinglaoyao 的回复:] 楼主，首先，你上传的是图片，这样不利于大家帮您找问题，您应该上传源代码，我们复制粘贴以后在自己的平台上运行一下，会更容易找问题。其次，楼上正解，scanf_s不同于老版的scanf，如果给它传递字符数组，需要传递一个数组大小的，说是为了scanf函数的安全着想【怕溢出攻击】  改成这样【scanf_s("%s", name, 40);】[/quote] 请问，scanf_s("%f",&weight);  这条语句中，变量weight没有上述要求了吧？[/quote]  嗯是的，因为变量weight只是一个单个int变量，函数不需要知道它的内存大小，但字符数组不同。

user: user-0
content: 引用 4 楼 wenpinglaoyao 的回复:[quote=引用 2 楼 wenpinglaoyao 的回复:] 楼主，首先，你上传的是图片，这样不利于大家帮您找问题，您应该上传源代码，我们复制粘贴以后在自己的平台上运行一下，会更容易找问题。其次，楼上正解，scanf_s不同于老版的scanf，如果给它传递字符数组，需要传递一个数组大小的，说是为了scanf函数的安全着想【怕溢出攻击】  改成这样【scanf_s("%s", name, 40);】[/quote] 请问，scanf_s("%f",&weight);  这条语句中，变量weight没有上述要求了吧？

user: user-0
content: 引用 7 楼 qq423399099 的回复:scanf_s读取%c和%s的时候必须多传一个参数来指定读入的字符长度 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 受教了，谢谢~

user: user-0
content: 引用 5 楼 shihengzhen101 的回复:楼主，你不要用中文的文件名啊，虽然这里不是这个问题，但是尽量不要用中文命名文件名和路径名 好的，谢谢提醒~

user: user-2
content: scanf_s读取%c和%s的时候必须多传一个参数来指定读入的字符长度 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-3
content: 单步跟踪程序运行，观察分析原因，看是在哪一步出了问题

user: user-4
content: 楼主，你不要用中文的文件名啊，虽然这里不是这个问题，但是尽量不要用中文命名文件名和路径名

user: user-1
content: 引用 2 楼 wenpinglaoyao 的回复:楼主，首先，你上传的是图片，这样不利于大家帮您找问题，您应该上传源代码，我们复制粘贴以后在自己的平台上运行一下，会更容易找问题。其次，楼上正解，scanf_s不同于老版的scanf，如果给它传递字符数组，需要传递一个数组大小的，说是为了scanf函数的安全着想【怕溢出攻击】  改成这样【scanf_s("%s", name, 40);】

user: user-1
content: 顺带说一句，我也是自学，大家以后互相鼓励啊亲！

user: user-1
content: 楼主，首先，你上传的是图片，这样不利于大家帮您找问题，您应该上传源代码，我们复制粘贴以后在自己的平台上运行一下，会更容易找问题。其次，楼上正解，scanf_s不同于老版的scanf，如果给它传递字符数组，需要传递一个数组大小的，说是为了scanf函数的安全着想【怕溢出攻击】

user: user-5
content: scanf_s函数少一个参数，40， 所以运行时读不到这个参数，内存访问不了就报错了
user-0 提问: 求大佬帮我看看，哪里有错。自己写的还有头结点的链式队列

回复:
user: user-1
content: 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  #include <stdio.h> #include <malloc.h> #include <stdlib.h> typedef struct node { 	int date; 	struct node* next; }*Node, NODE; typedef struct { 	Node front, rear; }SeqQueue, *Queue; Queue init_Queue(); void in_Queue(Queue, int); void out_Queue(Queue, int*); int empty_Queue(Queue); int main(void) { 	Queue ps = init_Queue(); 	int i, val; 	printf("入队元素："); 	for (i = 0; i<3; i++) 	{ 		printf("%3d", i); 		in_Queue(ps, i); 	} 	printf("\n"); 	printf("出对列的元素："); 	while (empty_Queue(ps)) 	{ 		out_Queue(ps, &val); 		printf("%3d", val); 	} 	printf("\n"); 	return 0; } Queue init_Queue() { 	Queue ps; 	Node p = (Node)malloc(sizeof(NODE));//建立一个头结点 	ps = (Queue)malloc(sizeof(SeqQueue)); 	if (ps == NULL) 		exit(0); 	else 	{ 		p->next = NULL; 		ps->rear = ps->front = p; 	} 	return ps; } void in_Queue(Queue ps, int val) { 	Node p = (Node)malloc(sizeof(NODE));//生成新节点 	p->date = val; 	p->next = NULL; 	ps->rear->next = p;//当前节点的尾指针指向下一个新的节点 	ps->rear = p;//尾指针指向新节点 	return; } void out_Queue(Queue ps, int*val)//FIFO.首节点出队列 { 	Node p; 	if (empty_Queue(ps)) 	{ 		p = ps->front->next;//用p指针来保存新节点。 		*val = p->date; 		ps->front->next = p->next; 		free(p); 	} 	else 	{ 		printf("dui列为空,出队列失败！\n"); 		return; 	} 	if (ps->front->next == NULL) 		ps->rear = ps->front; 	return; } int empty_Queue(Queue ps) { 	if (ps->front == ps->rear) 		return 0; 	else 		return 1; }

user: user-2
content: if(ps->front->next=NULL)  改成  if(ps->front->next==NULL)
user-0 提问: 严蔚敏《数据结构》 归并排序递归调用  空间复杂度疑问

回复:
user: user-1
content: 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！
user-0 提问: 小白求助

回复:
user: user-1
content: 输入两个整数（随便用什么间隔）：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

user: user-3
content: 两个数之间没有空格scanf是无法分辨出来的

user: user-4
content: #include<stdio.h> #include<stdlib.h> int main() {     int a=0,b=0; float x=0.f,y=0.f;//最好初始化一下 char c1,c2; scanf("%d%d%f%e",&a,&b,&x,&y); fflush(stdin);//scanf读取单个字符时，要清空一下标准输入的缓存，因为里面存储了之前输入的回车符。 scanf("%c",&c1); fflush(stdin); scanf("%c",&c2); printf("-----------------------分界线---------------------\n"); printf("%d\n%d\n%f\n%e\n%c\n%c\n",a,b,x,y,c1,c2); system("PAUSE\n"); return 0; }  每输入完毕一个数据（每次的一个数据就是你的3或者7或者8.5等等），需要回车。

user: user-5
content: 每个变量的输入中间加个空格/回车/tab键（随便一个）就可以了。。

user: user-6
content: 默认分隔符是空格，或者scanf("%c,%c",&c1,&c2); 输入8.5,7.1。注意中间的逗号

user: user-7
content: 你需要用空格分隔 啊
user-0 提问: 小白提问，用codeblocks编译找不到头文件（C语言）

回复:
user: user-1
content: 链接:http://pan.baidu.com/s/1nv76469 密码:gu7n  EasyX示例项目_CodeBlocks_vc2010.7z等  已经配置好的 解压到 D盘或者E盘   然后开始 CB，建立 C++ 控制台项目，选编译器 VC2010 会建立个 hello world，先编译运行下，没问题 再把你的代码复制进去 编译.  不要问为什么 直接打开你的源文件不行，因为打开方式不对。

user: user-2
content: 需要自己下载，默认当然没有............

user: user-1
content: http://tieba.baidu.com/p/3935050359?pid=72658804406&cid=0#72658804406  CodeBlocks使用vc2010编译器配置成功   后来通过 google 哪些错误的API，原来需要 引入 Ole32.lib OleAut32.lib shell32.lib  CB建立控制台项目，编译器选 VC2010 ， 导入这些库名 <Add library="easyx.lib" /> <Add library="Ole32" /> <Add library="OleAut32" /> <Add library="shell32" />

user: user-1
content: https://github.com/hongwenjun/CodeBlocks/raw/master/CHM/ege15.04.7z 这个库里有，不过用法上和你的教材可能有点不一样 搜索下 ege 库配置

user: user-0
content: 我下了graphics.h放进include里总是头文件中报错，有没有大神加qq给我说下，854629027，感激不尽！！！

user: user-3
content: graphics.h不是标准的头文件，默认没有，用要自己安装
user-0 提问: while循环

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

user: user-2
content: 循环的范围只有这一句：low++;  while后面没有大括号，只有紧接的一条语句是

user: user-3
content: 默认循环while后的一条语句，不过这种方式不提倡，容易出现BUG

user: user-4
content: while() 语句a; 语句b; 语句c; 当while在复合语句中没有使用花括号时 循环体只有语句a， 相当于while()后第一个分号前面的语句就是循环体。

user: user-0
content: 还能这么玩呢。。。谢哥

user: user-5
content: 默认控制一条语句好不好 分号
user-0 提问: 关于>>运算符，请教

回复:
user: user-1
content: 看看ar的类型有没有实现对>>操作符的重载

user: user-2
content: 试试F11，看看能不能跳转过去看看具体实现

user: user-3
content: 将存档的内容读入到pLayer，类似于cin>>

user: user-4
content: 引用 1 楼 user-4 的回复:从ar读入数据到pLayer。 ">>"和"<<"应该是I/O流的运算符。 补充下，从名字看，ar应该是用于持久化的Archive之类的类型。它的">>" 运算符会为pLayer分配内存，然后从档案中读入数据。

user: user-4
content: 从ar读入数据到pLayer。 ">>"和"<<"应该是I/O流的运算符。
user-0 提问: 小白求教，关于结构体指针数组的简单问题，求大神解答，谢谢。

回复:
user: user-1
content: 指针存放的是地址 不能存放数据！

user: user-0
content: 引用 2 楼 user-2 的回复:if(p[j]->grade>p[j+1]->grade) p[j]->grade^=p[j+1]->grade^=p[j]->grade^=p[j+1]->grade; 这句里面你不能拿doulbe类型的变量进行异或，这里你自己改，其他的帮你改好了  #include<stdio.h> int i,j; struct student { 	int num; 	char name[8]; 	char sex; 	int age; 	double grade; }; void input(struct student *q[]); int main() { 	struct student st[10]={{101,"Zhang",'M',19,95.6}, 	{102,"Wang",'F',18,92.2}, 	{103,"Zhao",'M',19,85.7}, 	{104,"Li",'M',20,96.3}, 	{105,"Gao",'M',19,90.2}, 	{106,"Lin",'M',18,91.2}, 	{107,"Ma",'F',18,98.7}, 	{108,"Zhen",'M',21,88.7}, 	{109,"Xu",'M',19,90.1}, 	{110,"Mao",'F',22,94.7}},*p[10];//定义一个指针数组  	for(i=0;i<10;i++) p[i]=&st[i];//让指针数组指向结构体数组，这里出错[Error] incompatible types in assignment of 'student' to 'student [10]' 	printf("排序前：\n\n"); 	input(p); 	for(i=0;i<9;i++)  //对结构体进行冒泡排序  		for(j=0;j<9-i;j++) 			if(p[j]->grade>p[j+1]->grade) p[j]->grade^=p[j+1]->grade^=p[j]->grade^=p[j+1]->grade; 	printf("排序后：\n\n"); 	input(p); 	return 0; } void input(struct student (*q)[10])//输出  { 	printf("   num    name  sex   age   grade"); 	for(i=0;i<10;i++) 		printf("\n%6d%s%6c%6d%8.2f\n\n",q[i]->num,q[i]->name,q[i]->sex,q[i]->age,q[i]->grade); }    可以了，非常感谢。

user: user-2
content: if(p[j]->grade>p[j+1]->grade) p[j]->grade^=p[j+1]->grade^=p[j]->grade^=p[j+1]->grade; 这句里面你不能拿doulbe类型的变量进行异或，这里你自己改，其他的帮你改好了  #include<stdio.h> int i,j; struct student { 	int num; 	char name[8]; 	char sex; 	int age; 	double grade; }; void input(struct student *q[]); int main() { 	struct student st[10]={{101,"Zhang",'M',19,95.6}, 	{102,"Wang",'F',18,92.2}, 	{103,"Zhao",'M',19,85.7}, 	{104,"Li",'M',20,96.3}, 	{105,"Gao",'M',19,90.2}, 	{106,"Lin",'M',18,91.2}, 	{107,"Ma",'F',18,98.7}, 	{108,"Zhen",'M',21,88.7}, 	{109,"Xu",'M',19,90.1}, 	{110,"Mao",'F',22,94.7}},*p[10];//定义一个指针数组  	for(i=0;i<10;i++) p[i]=&st[i];//让指针数组指向结构体数组，这里出错[Error] incompatible types in assignment of 'student' to 'student [10]' 	printf("排序前：\n\n"); 	input(p); 	for(i=0;i<9;i++)  //对结构体进行冒泡排序  		for(j=0;j<9-i;j++) 			if(p[j]->grade>p[j+1]->grade) p[j]->grade^=p[j+1]->grade^=p[j]->grade^=p[j+1]->grade; 	printf("排序后：\n\n"); 	input(p); 	return 0; } void input(struct student (*q)[10])//输出  { 	printf("   num    name  sex   age   grade"); 	for(i=0;i<10;i++) 		printf("\n%6d%s%6c%6d%8.2f\n\n",q[i]->num,q[i]->name,q[i]->sex,q[i]->age,q[i]->grade); }

user: user-2
content: (*p)[10]; 不是指针数组，而是指向10个元素数组的指针  另外：  void input(struct student *q[])  改成  void input(struct student (*q)[10])
user-0 提问: 非法间接

回复:
user: user-1
content: 你的函数应该是void average(float **p, int n)吧？ 传的是个二级指针吧

user: user-2
content: 解引运算符 * 只对指针可以用，你的内存的 * 解引后已经得到float 类型，外层再来个 * 就错了

user: user-3
content: *(p+n)+1结果是个浮点数。你要对这个浮点数进行*(float)这样的运算？？？
user-0 提问: 如何将数组中的非零元素存储在链表中

回复:
user: user-0
content: 谢谢各位大神，谨受教。鞠躬  -==-！！

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

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

user: user-3
content: if (NULL==H） 这里使用了中文的括号，改成英文的

user: user-4
content: p->pNext=p;  这一句什么意思？那不是死循环了？另外，你为H分配了节点，后面就没有用了！ 写代码和写文章是一样的，自己脑子不清楚，别指望代码能正确。大概这样改:  #include<stdio.h> #include<stdlib.h> typedef struct node { int data; struct node*pNext;  }linknode,*link; link Creatlist() { int i,j,value; int a[6][7]={{0,12,9,0,0,0,0},{0,0,0,0,0,0,0}, {-3,0,0,0,0,14,0},{0,0,24,0,0,0,0}, {0,18,0,0,0,0,0},{15,0,0,-7,0,0,0}}     link p,H;    H=NULL; p=NULL; // 先全部设置为空。     for(i=0;i<6;i++){     	for(j=0;j<7;j++){     	if(a[i][j]!=0){         if (NULL==H）        {  //找到第一个，创建H节点；            H=(link)malloc(sizeof(linknode));            H->data=a[i][j];            H->pNext=NULL;            p=H;  //p指向H, 用于向下走        }        else //第一个之后的节点追加       {     	    p->pNext =(link)malloc(sizeof(linknode)); //连接到链表最后             p=p->pNext; //p 向下走一步             p->data=a[i][j];             p->pNext=NULL;  //尾巴要封掉        } } }     //括号数不清了，也许多了一个？ }      }
user-0 提问: C语言舞伴问题——循环队列，求大神更正

回复:
user: user-1
content: 仅供参考：//舞会上，男士们（m人）和女士们（n人, n<m）进入舞厅时，各自排成一队。跳舞开始时，依次从男队和女队的队头上各出一人配成舞伴。 //男队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。在第t首曲子时，第x个女生和第几个男生配对跳舞？ #include <stdio.h> #include <string.h> #define MAX 26 int m,n,t,x,y,i,j,k; char md[MAX]; char nd[MAX]; char c; void main() {     while (1) {         printf("Input n m(1<=n<m<=%d):",MAX);         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1<=n && n<m && m<=MAX) break;         }     }     while (1) {         printf("Input t x(1<=t<=%d 1<=x<=%d):",MAX,n);         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&t,&x)) {             if (1<=t && t<=MAX && 1<=x && x<=n) break;         }     }     for (i=0;i<m;i++) md[i]='A'+i;     for (i=0;i<n;i++) nd[i]='a'+i;     k=0;     for (i=0;i<t;i++) {         printf("%2d: ",i+1);         for (j=0;j<n;j++) {             c=' ';             if (i==t-1 && j==x-1) {c='*';y=k+1;}             printf("%c%c%c",md[k],nd[j],c);             k=(k+1)%m;         }         printf("\n");     }     printf("%d\n",y);  }

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

user: user-3
content: while(a=1)  改成  while(a==1)
user-0 提问: container_of

回复:
user: user-1
content: typeof是gcc的扩展，vc应该不支持。

user: user-2
content: test_struct = container_of(ptr_ch, struct foo, a);

user: user-3
content: 先自己把宏替换进去看什么问题，括号对不对称等

user: user-4
content: 复合语句不能用作表达式， ({...}) 作为表达式的用法是 gcc 扩展，不能在 msvc 上使用

user: user-5
content: 没看懂，container_of是一个struct  foo吗？好像不是吧
user-0 提问: 一个错误代码，编译没问题，请请你分析并画出 执行后的结果；

回复:
user: user-0
content: 编译不通过，，怎么改正？？

user: user-0
content: 就是  有错误，。。但是能运行。

user: user-0
content: 答非所问，，，，这些我懂，我就一个错误，能解决吗？

user: user-1
content: 你给的程序编译通不过，整个程序里就只有一个if怎么会有两个else

user: user-2
content: 给你讲下你存在的几个问题： 1.没有注释，程序的可读性很低，你这一直在循环，程序出了点什么问题回头看就得花很多时间，学会用注释是每个程序员必备的。 2.你的主函数不能是void型，改成int型，并且在最后面加上return 0;（void main()表示main函数不会处理返回的数值，调用者不能利用任何main函数返回的数值信息，main程序以return;或exit();或不写返回语句结尾。int main()表示main函数应当返回一个整型的数据，可以用它描述运行状态，比如是否正常运行结束。main程序以return 0;或exit(0);结尾，当然这语句中的0可以换成变量取值或其他整型常量返回。一般编译器在你的main函数前面没有发现描述，如main()时默认就是int main()，而你主程序中没有发现return 0;之类的返回语句时，会给出警告信息提示应当返回一个有效的整数。）。 3.一个if只能和一个else对应（可以理解为：要么这样，要么那样，二选一）。

user: user-1
content: void main() { 	int i,j,k; 	for(i=1;i<=4;i++) 	{ 		for(j=1;j<=4-i;j++) 			printf(" "); 		for(k=1;k<2*i;k++) 			printf("*"); 		printf("\n"); 	} 	for(i=1;i<=3;i++) 	{ 		for(j=1;j<=i;j++) 			printf(" "); 		for(k=6-2*i;k>=0;k--) 			printf("*"); 		printf("\n"); 	} }

user: user-3
content: 这应该是你的程序想要运行的结果吧，如果是，可以参考我上面的代码

user: user-3
content: #include<iostream> using namespace std; void main() { 	int i,j,space=4,star=1; 	for(i=0;i<4;i++) 	{    		for(j=0;j<space;j++) 			cout<<" "; 		space--; 		for(star=1;star<=2*i+1;star++)          cout<<"*"; 		cout<<endl; 	} 	while(i<7) 	{ 		int k;      space=2; 	 star=5; 	for(i=4;i<7;i++) 	{   	for(j=0;j<space;j++) 			cout<<" "; 		space++; 		for(k=0;k<star;k++)          cout<<"*"; 		star-=2; 		cout<<endl; 	} 	} }

user: user-0
content: 那怎么让他能编译？正常运行？

user: user-1
content: 引用 4 楼 qq_36370998 的回复:就是  有错误，。。但是能运行。  不能编译又何谈能运行？
user-0 提问: vs2013系统找不到指定文件

回复:
user: user-1
content: 去路径下看一下有没有文件，如果没有，重新编译一下，如果有可能就是杀毒软件的问题， 还有一种情况就是你打开了TGP

user: user-2
content: 去对应路径的文件夹下看看有没有EXE 可能是你的权限不够

user: user-3
content: 清理后重新建工程，关闭杀软件

user: user-0
content: 我电脑win10的，望大神们赐教
user-0 提问: DEV-C++打开.cpp文件时出现“向程序发送命令时出现问题”，请大牛帮忙

回复:
user: user-1
content: 参照：http://blog.csdn.net/nocky/article/details/6196169

user: user-2
content: 安装 CODEBLOCKS 使用下汉化包就可以了

user: user-3
content: http://blog.csdn.net/cometnet/article/details/19551125

user: user-4
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt
user-0 提问: pthread_mutex_t的本质是什么？

回复:
user: user-1
content: pthread_mutex_init是个函数，用于初始化pthread_mutex_t类型  pthread_mutex_t具体形式你不必详细了解  pthreadtypes.h中：  typedef union {   struct __pthread_mutex_s   {     int __lock;     unsigned int __count;     int __owner; #if __WORDSIZE == 64     unsigned int __nusers; #endif     /* KIND must stay at this position in the structure to maintain        binary compatibility.  */     int __kind; #if __WORDSIZE == 64     int __spins;     __pthread_list_t __list; # define __PTHREAD_MUTEX_HAVE_PREV      1 #else     unsigned int __nusers;     __extension__ union     {       int __spins;       __pthread_slist_t __list;     }; #endif   } __data;   char __size[__SIZEOF_PTHREAD_MUTEX_T];   long int __align; } pthread_mutex_t;

user: user-2
content: 不是有对应的源代码吗？
user-0 提问: 小白提问：大神们帮忙看一下如下代码吧！拜托了

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

user: user-2
content: //求串长 int Strlength(HString &S) {   //返回S的元素个数，即串的长度     int i;     for(i = 0;S.ch[i] != '\0'; i++) {       }     S.length = i+1;     return S.length; } 这个函数并没有返回S的长度，而是S + 1；跳出for循环的条件是ch[i] == '\0', 此时的i已经是包含‘\0‘的长度了，你还S.length = i+1;  //串复制 int Strcopy(HString &T, HString &S) {	//将串S复制到T中     int i;     if(T.ch) {           //+++++*ch这个指针在你初始化HString对象的时候没有指向NULL，所以成了野指针，在这里条件成立，然后调用free函数，一调用free准出错。         free(T.ch);//释放旧空间     }       if(!(T.ch=(char *)malloc(S.length*sizeof(char)))) {          return 0;//申请内存失败则返回0     }      for(i=0; i <= S.length-1; i++) {         T.ch[i] = S.ch[i];     }     T.length = S.length;     return 1; }  建议你把这些单个的函数一个一个的测试一下是否都能通过，都通过了再调用你的主函数来测试。

user: user-3
content: 帮你顶帖，，，，，。，，，，，，，，，，

user: user-0
content: 大神，在吗？？

user: user-0
content: 2解决了，可3 和5还是有问题，拜托了

user: user-4
content: 执行2的时候你得先执行过1，否则S的Lenght成员还骨初始

user: user-0
content: 程序编译没错误，但运行就不行
user-0 提问: windows pe 文件c分析

回复:
user: user-1
content: 《Windows PE权威指南》

user: user-2
content: WORD *value = (WORD*)(stlDH + (&stlDH->e_lfanew-stlDH))

user: user-0
content: 我要取出stIDH.elfnew里面保存的word值，再加上p的基地址，你说的这个方法 行得通吗

user: user-3
content: 直接加上stIDH->e_lfanew这个值，而不是把stIDH->e_lfanew作为指针再解引  加的时候要把指针转成byte*，否则移动的距离不是stIDH->e_lfanew

user: user-0
content: IMAGE_NT_HEADER p = p + *(int*)stIDH.elfnew; 报错
user-0 提问: int __cdecl 错误该怎么改？求指教

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

user: user-2
content: 1.你调用和实现的函数名不一致，调用是MaxsubseqSum，实现是MAxsubseqSum 2.函数需要前置声明 3.MaxsubseqSum函数内ThisSum需要初始化成0才行  #include<stdio.h> int MaxsubseqSum(int A[], int N); void main() { 	int MaxsubseqSum(int A[], int N); 	int a[10] = { -1, 3, -4, 1, 5, 7, 3, 4 }; 	int n = 8; 	MaxsubseqSum(a, n); } int MaxsubseqSum(int A[], int N) { 	int ThisSum = 0, MaxSum = 0; 	int i; 	for (i = 0; i < N; i++){ 		ThisSum = ThisSum + A[i]; 		if (ThisSum >MaxSum) 			MaxSum = ThisSum; 		else if (ThisSum = 0) 			ThisSum = 0; 	} 	return MaxSum; }
user-0 提问: 关于C的字符串长度的问题

回复:
user: user-1
content: 我在自家花园散步时，不小心越界踩到邻居家花园的草。 为什么当我踩到第108脚的时候，邻居才发现并将我扭送派出所？ 派出所有没有自动发现并提示我越界的选项？

user: user-0
content: 引用 6 楼 u010312274 的回复:编译器有没有自动截断并提示越界的选项？ C语言不会有这种检测的...

user: user-2
content: 编译器有没有自动截断并提示越界的选项？

user: user-3
content: 看似正确不代表是正确的，现在不崩溃最多只能说运气好，可能你程序什么时候就崩溃了

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

user: user-4
content: 这种越界写入的未定义行为，并不一定会造成程序崩溃。 比如你覆盖到了调试信息，栈信息ebp esp， 指令指针eip等那么很可能程序就崩了

user: user-5
content: 未定义行为，正好多出的１３个字节没使用

user: user-6
content: 不要这么做，这样肯定溢出了。内存溢出未必就能显现问题，有时并不明显的缺陷才是隐患。 建议用std::string或者字符串流输入。这样至少在代码上不必考虑缓存的大小问题。
user-0 提问: 在下面的代码中char* ret = destnation;为什么一定要放在前面程序才能执行

回复:
user: user-1
content: C要求变量的声明放在所有执行语句前面，但C++可以下没有这个限制

user: user-0
content: 没有调用库函数的情况下，自己编写的一个strcpy

user: user-2
content: 1.之所以要保存destnation的首地址，是为了return的时候使用。 2.为什么strcpy要有返回值呢？ 考虑： int length = strlen( strcpy(str, “Hello World”) ); 你就能发现奥秘了。为了实现链式操作，将目的地址返回

user: user-3
content: C 曾经有这种要求。  现在已经没有这种要求了。  楼主的编译器是不是太古老了。
user-0 提问: list control win32

回复:
user: user-1
content: 参看：http://www.cnblogs.com/flysnail/archive/2011/07/01/2095674.html

user: user-2
content: 自行参考MSDN98中的相关例子代码。 MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl

user: user-0
content: 引用 2楼paschen 的回复:参看：http://www.cnblogs.com/flysnail/archive/2011/07/01/2095674.html我想win32    包含的静态库和动态库  还有初始化函数就可以
user-0 提问: 求解数组定义问题

回复:
user: user-1
content: cl.exe /E gcc -E cpp 可以查看宏展开的结果

user: user-2
content: 大括号里只是预编译指令，定义宏和包含头文件，大括号中的内容相当于是空

user: user-3
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898
user-0 提问: 快速排序后数列还是无序的

回复:
user: user-1
content: http://blog.csdn.net/guoyong10721073/article/details/8025201

user: user-2
content: 小心驶得万年船。

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

user: user-4
content: 第一个while循环语句while(i<j&&r[j]>=flag)是判断r[j]

user: user-5
content: 单步调试，跟踪一遍自然就知道了。。
user-0 提问: 插入排序问题，书上是不是错了，还有前哨的作用

回复:
user: user-1
content: 书上就算有错误也是很正常的，不用太相信书

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

user: user-3
content: 谢邀，没看出什么缘由 猜测楼主大意为，比如65不符合LT条件，但仍然复制到了L.r[0]中 搜索了下相关的，这段是伪码，所以并非真正执行的代码，是否不符合条件下复制到哨兵也并不影响算法功能  所以，如有兴趣，可提供书籍名称及页码，有空时我阅读下上下文再来补充

user: user-4
content: 这课本好像跟我当年学的课本是一样的...

user: user-4
content: 这书好像跟我当年学的是一样的...

user: user-5
content: 单纯从语言角度来说，if条件不成立的条件下，L.r[0] = L.r[i]不可能执行，是不是你的 LT (L.r[i].key, L.r[i-1].key)函数有问题？条件根本就是成立的？ 你说的执行了L.r[0] = L.r[i]，我猜是因为else的分支里也有L.r[0] = L.r[i]  从这段代码和书的截图看应该是这个意思： 1、设置一个监视哨L.r[0] ，这个哨是不参与排序的，也就是说从L.r[1]开始排序，L.r[0] 只是后面排序成员的一个副本 2、每次排序都将 监视哨和需要排序的元素进行对比，若后者较小交换数据把后者设置成监视哨；若后者较大不必交换数据，但是还是要把后者设置成监视哨，        也就是说不管你的if成不成立，都会把监视哨设置成上次需要排序的元素，也就是说永远会执行L.r[0] = L.r[i]  没有上下文，纯属猜测，错了勿喷。
user-0 提问: 有关于malloc(): memory corruption的问题

回复:
user: user-0
content: 嗯嗯呢，谢谢啦

user: user-1
content: 学会使用gdb调试程序。

user: user-2
content: 这叫运行错误，你肯定是申请动态内存的时候，申请的大小的值弄错了
user-0 提问: 求大神给我详细解释一下下面的代码，每行都解释

回复:
user: user-0
content: [quote=引用 7 楼 qq423399099 的回复:] 这个我知道，我也是实在没有办法了，谢谢了

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

user: user-2
content: /*  * 函数名称： Ｗarning  * 函数描述：输出警告信息到标准错误流  * 函数参数：    ＠Msg： 警告信息内容  * 函数返回：空  * 函数作用域： static  * 依赖类型： $$FILE  * 依赖函数： $$fprintf  * 依赖变量： $$stderr  */  static void Warning(const char *Msg) {      fprintf (stderr, "Warning: %s\n", Msg); }

user: user-2
content: 解释下列函数 static void Error(const char *Msg) {     fprintf (stderr, "%s\n", Msg);     fprintf (stderr, "strerror() is %s\n", strerror(errno));     exit(1); } /*  * 函数名称： Error  * 函数描述：输出错误信息到标准错误流  * 函数参数：    ＠Msg： 错误消息    * 函数返回：空  * 函数作用域： static  * 依赖类型： $$FILE  * 依赖函数： $$fprintf, $$strerror, $$exit  * 依赖变量： $$errno, $$stderr  */

user: user-0
content: 好的，谢谢啦

user: user-3
content: 你一次问的太多了，分几次问应该会有人来回答

user: user-4
content: http://www.cnblogs.com/kissazi2/archive/2013/07/20/3203242.html  网上相关文章查到了，你可以看下，有注释的

user: user-4
user-0 提问: c\main.c|14|error: 'seqstring' has no member named 'length'|

回复:
user: user-1
content: 贴一下你的seqstring类 检查是不是有length成员，是不是拼写错误或者忘记写了

user: user-2
content: p.length   这句，p没有length成员，检查是不是名字拼写错了
user-0 提问: 关于函数

回复:
user: user-1
content: 地址

user: user-2
content: 函数原型与函数定义里的p就是函数名，调用是可以用p（a）、（*p）（a）、（&p）（a），这是C语言的规定

user: user-1
content: 函数名，指向函数体入口的地址，函数名和函数入口地质。
user-0 提问: setbuf

回复:
user: user-0
content: 不对吧 这是说在main函数结束之前就已经被清掉了，为什么main函数结束之前就被清掉了  和setbuf有关吗

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

user: user-1
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。

user: user-1
content: 栈中的变量通常包括函数参数和函数里声明的临时变量。 栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。 而栈中的类变量退出其作用域时，会自动执行其析构函数，……

user: user-2
content: main结束 不代表整个进程结束   （1）全局对象的构造函数会在main 函数之前执行，           全局对象的析构函数会在main函数之后执行；           用atexit注册的函数也会在main之后执行。   （2）一些全局变量、对象和静态变量、对象的空间分配和赋初值就是在执行main函数之前,而main函数执行完后，还要去执行一些诸如释放空间、释放资源使用权等操作   （3）进程启动后，要执行一些初始化代码（如设置环境变量等），然后跳转到main执行。全局对象的构造也在main之前。

user: user-3
content: 你在while循环里加上fflush(stdout);主动清理缓冲区就能正常运行了

user: user-4
content: 他说的之前就是main函数结束的时候，函数中的局部变量都会清除掉

user: user-1
content: 栈中的变量在退出作用域后已经无效了。
user-0 提问: 小白，求帮助，求源代码 

回复:
user: user-0
content: 引用 4 楼 user-2 的回复:[quote=引用 3 楼 bb152 的回复:] 我是初学者，能发个源码给我吗？ 在此[/quote] 谢谢洛

user: user-1
content: 引用 3 楼 bb152 的回复:我是初学者，能发个源码给我吗？   #include<stdio.h> int main() { 	int a,b,c,max,min,mid; 	printf("请输入三个整数: "); 	scanf("%d %d %d",&a,&b,&c); 	if(a>b && a>c) 	{ 		if(b>c) 		{ 			mid=b; 			min=c; 			max=a; 		} 		else 		{ 			mid=c; 			min=b; 			max=a; 		} 	} 	else if(b>a && b>c) 	{ 		if(a>c) 		{ 			mid=a; 			min=c; 			max=b; 		} 		else 		{ 			mid=c; 			min=a; 			max=b; 		} 	} 	else if(c>a && c>b) 	{ 		if(a>b) 		{ 			mid=a; 			min=b; 			max=c; 		} 		else 		{ 			mid=b; 			min=a; 			max=c; 		} 	} 	printf("从大到小的顺序为: %d %d %d",max,mid,min); 	getchar(); 	return 0;	 	 }

user: user-2
content: 引用 3 楼 bb152 的回复:我是初学者，能发个源码给我吗？ 在此

user: user-0
content: 我是初学者，能发个源码给我吗？

user: user-2
content: 排序用qsort,

user: user-2
content: 这也弄了两天
user-0 提问: C语言   求大神  解释清楚

回复:
user: user-1
content: 要别人和你讲还不如自己跟踪程序运行理解的清楚

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

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

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

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

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

回复:
user: user-0
content: 引用 4 楼 ipqtjmqj 的回复:[quote=引用 2 楼 SJunTe 的回复:] [quote=引用 1 楼 ipqtjmqj 的回复:] 先一个固定长度是message_code, 消息类型 根据消息类型得知是什么请求，　至于长度，　只有增加一些字段表示长度就可以了，也就是消息是变长的。 谢谢。我想再问一下：是不是所有类型的数据都要转化成字符串再进行传输？传输的字符串用char message[MAX_LEN]定义还是根据数据长度malloc？如果指定了MAX_LEN，那一条信息太长无法一次发送怎么办？[/quote] 不管是字符串还是图片，本质都是一串０，１，Ｃ语言通常以８个位为单位，也就是字节来处理，　至于它表示什么，则有相应的编码，　或者是协议，　接收方如何得知是什么编码，　就是通过我前面说的message_code, 或者sub_code之类的，　字符编码的话主要ＡＳＣＩＩ码，　要传中文有UTF16, UTF8, 注意大端与小端。　整数编码的话一般就是补码，　浮点数是ＩＥＥＥ７５４编码，　时间编码要么直接用字符串要么是从１９７０年１月１日０时开始的秒数（３２位的到２０３８年溢出),　多媒体(图像，声音，视频）编码则更多了。　有的发送前还要压缩，加密，　接收时要解压，解密。  信息太长，如果是Ｃ语言，只有malloc动态申请堆内存了，用完要用free释放， 如果是Ｃ＋＋，可以直接用std::string,内存自动申请与释放。  无法一次性发送，　那就分拆成几个包，　像ＴＣＰ一样增加一个字段表示包的序号。 或者还是一个包，　先发了后，　根据返回值判断写入了多少，　然后移动指针，　循环直到写完为止。[/quote] 非常感谢！！我大概有思路了:)

user: user-1
content: 引用 2 楼 SJunTe 的回复:[quote=引用 1 楼 ipqtjmqj 的回复:] 先一个固定长度是message_code, 消息类型 根据消息类型得知是什么请求，　至于长度，　只有增加一些字段表示长度就可以了，也就是消息是变长的。 谢谢。我想再问一下：是不是所有类型的数据都要转化成字符串再进行传输？传输的字符串用char message[MAX_LEN]定义还是根据数据长度malloc？如果指定了MAX_LEN，那一条信息太长无法一次发送怎么办？[/quote] 不管是字符串还是图片，本质都是一串０，１，Ｃ语言通常以８个位为单位，也就是字节来处理，　至于它表示什么，则有相应的编码，　或者是协议，　接收方如何得知是什么编码，　就是通过我前面说的message_code, 或者sub_code之类的，　字符编码的话主要ＡＳＣＩＩ码，　要传中文有UTF16, UTF8, 注意大端与小端。　整数编码的话一般就是补码，　浮点数是ＩＥＥＥ７５４编码，　时间编码要么直接用字符串要么是从１９７０年１月１日０时开始的秒数（３２位的到２０３８年溢出),　多媒体(图像，声音，视频）编码则更多了。　有的发送前还要压缩，加密，　接收时要解压，解密。  信息太长，如果是Ｃ语言，只有malloc动态申请堆内存了，用完要用free释放， 如果是Ｃ＋＋，可以直接用std::string,内存自动申请与释放。  无法一次性发送，　那就分拆成几个包，　像ＴＣＰ一样增加一个字段表示包的序号。 或者还是一个包，　先发了后，　根据返回值判断写入了多少，　然后移动指针，　循环直到写完为止。

user: user-2
content: 参考apache源代码。

user: user-0
content: 引用 1 楼 ipqtjmqj 的回复:先一个固定长度是message_code, 消息类型 根据消息类型得知是什么请求，　至于长度，　只有增加一些字段表示长度就可以了，也就是消息是变长的。 谢谢。我想再问一下：是不是所有类型的数据都要转化成字符串再进行传输？传输的字符串用char message[MAX_LEN]定义还是根据数据长度malloc？如果指定了MAX_LEN，那一条信息太长无法一次发送怎么办？

user: user-1
content: 先一个固定长度是message_code, 消息类型 根据消息类型得知是什么请求，　至于长度，　只有增加一些字段表示长度就可以了，也就是消息是变长的。
user-0 提问: 新手请教，结果为什么是6

回复:
user: user-1
content: 因为是"" 字符串，那么末尾还有一个'\0'字符

user: user-2

user: user-2
content: 以为结尾会有一个'\0'表示结束的字符啊，正好6个

user: user-3
content: strlen,结果是５ 用引号的是字符数组，会自动在末尾增加一个'\0'用作结尾标志，所以是６

user: user-4
content: sizeof(ch) = 6; sizeof(ch[0]) = 1; 所以结果是6。

user: user-5
content: http://blog.csdn.net/21aspnet/article/details/1539951

user: user-6
content: sizeof是告诉你占了多少个内存空间 而你要的是元素个数。 就像楼上各位说的，数组最后会有一个结束符，这个结束符也占用了一个内存空间。

user: user-7
content: 因籽还包括了字符串结尾的 '\0' 字符  用strlen可以

user: user-8
content: char ch[]={'4','5','6','7','8'};   //此时为5
user-0 提问: undefined reference to 这个编译出错问题

回复:
user: user-1
content: 将错误信息中出现的标识符放在百度里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。  项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-2
content: 这不是链接错误，就是因为你没有定义才会出现