Question: 请问高手非常棘手的问题。

引用 24 楼 jennyvenus 的回复:听赵老湿的话，使用vs，不迷信一些小众群体吹捧出来的编译环境。 vs确实好用。不过，国产教程，用的可是vc6.0. dev c++ 不错了。  引用 25 楼 king_2007 的回复:他的工作环境跟我的工作环境不一样，如果是搞科研的讲课的可以这样，但是企业的主管绝对不会让你这样。 吾不知，不敢语。笑而不语中。

听赵老湿的话，使用vs，不迷信一些小众群体吹捧出来的编译环境。

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

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

引用 19 楼 zhao4zhong1 的回复:VS2010那如何用gtk+编写ui后，如何把值传到界面上？另外你说的vs编译器是哪个版本的？？有兼容性问题吗？

引用 16 楼 zhao4zhong1 的回复:C/C++ in VC6,VS2005,VS2008,VS2010 bat vbs vba VB6 T-SQL asp java html+css asm perl autohotkey ...老师你既然都用过，我就是想问下，如果把gtk+库导入到vs库中，我用gtk+库编写界面，处理数据用到windows api 请问怎么把win32api中的参数或者属性值，调用到gtk+中去？另外如果能编写用什么编译器编译？

引用 7 楼 king_2007 的回复:引用 1 楼 user-5 的回复:程序在哪个平台运行在windows上运行，是有这样的，我喜欢用gtk+做gui，不喜欢用windows api做，另外程序用到windows平台上一些系统功能，需要用到windows api请问如何编译，运行程序。 使用动态库程序中加入代码即可，静态库在IDE里配置链接路径就好了

引用 14 楼 zhao4zhong1 的回复:没用过。老师，你的主要工作的语言是什么？？

没用过。

引用 12 楼 zhao4zhong1 的回复:引用 11 楼 king_2007 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] 对调试每句c/c++对应汇编支持不好或不支持的IDE都应该被摒弃。不支持的IDE都应该被摒弃?这句是什么意思？不理解 某些IDE没有“调试每句c/c++对应汇编”功能。 某些IDE虽然有“调试每句c/c++对应汇编”功能。但在调试每句c/c++对应汇编时会出这样那样的错误。 请把这些IDE扔到垃圾桶里。[/quote]老师你用过gtk+没有？它涉及到哪些领域？

引用 11 楼 king_2007 的回复:引用 9 楼 zhao4zhong1 的回复:对调试每句c/c++对应汇编支持不好或不支持的IDE都应该被摒弃。不支持的IDE都应该被摒弃?这句是什么意思？不理解 某些IDE没有“调试每句c/c++对应汇编”功能。 某些IDE虽然有“调试每句c/c++对应汇编”功能。但在调试每句c/c++对应汇编时会出这样那样的错误。 请把这些IDE扔到垃圾桶里。

引用 8 楼 user-5 的回复:引用 7 楼 king_2007 的回复:[quote=引用 1 楼 user-5 的回复:] 程序在哪个平台运行在windows上运行，是有这样的，我喜欢用gtk+做gui，不喜欢用windows api做，另外程序用到windows平台上一些系统功能，需要用到windows api请问如何编译，运行程序。不能在vs中配置gtk+吗？我没用过gtk+，不知能像windows开发一样使用LoadLibrary载入你想用的windows动态库，然后include相应头文件。 仅为个人看法，不知能否有帮助。[/quote]那请问下，编译该如何编译？用什么编译器？另外vs的兼容性不知道你考虑过没有？

对调试每句c/c++对应汇编支持不好或不支持的IDE都应该被摒弃。

摒弃dev c++ 使用VC 20xx

引用 7 楼 king_2007 的回复:引用 1 楼 user-5 的回复:程序在哪个平台运行在windows上运行，是有这样的，我喜欢用gtk+做gui，不喜欢用windows api做，另外程序用到windows平台上一些系统功能，需要用到windows api请问如何编译，运行程序。不能在vs中配置gtk+吗？我没用过gtk+，不知能像windows开发一样使用LoadLibrary载入你想用的windows动态库，然后include相应头文件。 仅为个人看法，不知能否有帮助。


Question: 真是醉了，大神来帮我找出错误在哪？

引用 8 楼 yuelengdihai 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 几年前我都看懂这是什么意思[/quote] 但总是有“希望有个足够牛×的老师能代替学生我自己领悟和上厕所”的学生！  看来只能寄希望于未来发明大脑、小脑、植物神经的下载和上传接口了。 到时候就真的没有领悟和上厕所的问题了吗？ 本人深表怀疑。

void ex(int *p1,int *p2,int *p3) { if(*p1<*p2) swap(p1,p2); if(*p1<*p3) swap(p1,p3); if(*p2<*p3) swap(p3,p2);//这里原来也写错了  } void swap(int *p7,int *p8) { int temp; temp=*p7; *p7=*p8; *p8=temp;//原来这里写错了 }

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

#include <stdio.h>  int main() { 	void ex(int *p1, int *p2, int *p3); 	int a, b, c, *p4, *p5, *p6; 	scanf("%d%d%d",&a, &b,&c); 	p4 = &a; 	p5 = &b; 	p6 = &c; 	ex(p4,p5,p6); 	printf("the order is %d, %d, %d\n", *p4, *p5, *p6); 	system("pause");     return 0; }  void ex(int *p1, int *p2, int *p3) { 	void swap(int *p7, int *p8); 	if(*p1 < *p2) 		swap(p1, p2); 	if(*p1 < *p3) 		swap(p1, p3); 	if(*p2 < *p3) 		swap(p3, p2); }  void swap(int *p7, int *p8) { 	int temp; 	temp = *p7; 	*p7 = *p8; 	*p8 = temp; }  三处错误 scanf函数错误，不应有逗号 swap函数错误 ex函数第三个判断语句的错误

引用 3 楼 qq423399099 的回复:楼主是想按从大到小吧？ 有两处错误： 1.swap函数里最后一行*p7=temp;应该改为*p8=temp; 2.ex函数里if(*p3<*p2) swap(p3,p2);应该改为if(*p2<*p3) swap(p2,p3); 楼主这手动模拟冒泡又是何苦，3楼正解

交换两个数的值：  temp=*p7; *p7=*p8; *p8=temp;

scanf里不加什么逗号啊，还有你那个ex是干什么的啊，排序？排序不是这样的，你再想一下吧

就是输出的时候还是按照原来的顺序输出！并没有改变顺序！！


Question: 2d图绘制修复

我比较好奇楼主小学语文多少分？

忘了说，如果原图很潦草，用相应的路径字做总规范，然后用笔填，一般用形容词填，左填右，右填左


Question: 用C语言写离散数学题

#include<stdio.h> int main() { 	int n,m,t,i,j,k; 	int a[n]; 	scanf("%d",&n); 	for(m=1;m<=n;m++) 		scanf("%d",&a[m]); 	int b[15][2]; 	scanf("%d",&t); 	for(j=1;j<=15;j++) 	{ 		scanf("%d%d",b[j][1]); 	} 	for(j=1;j<=15;j++) 	{ 		if(b[j][1]%b[j][0]==0) 			break; 		else 			printf("N\n"); 		for(i=1;i<=15&&i!==j;i++) 			{ 				if(b[j][1]==b[j][0]) 					break; 				else 				{ 					if(b[j][0]!==b[i][1]&&b[j][1]!==b[i][0]) 						break; 					else 						printf("N\n"); 				} 			    if(b[j][1]==b[i][0]) 				{ 					for(k=1;k<=15;k++) 					{ 						if(b[k][0]==b[j][0]&&b[k][1]==[i][1]) 							printf("Y\n"); 						else 							printf("N\n"); 					} 				} 			} 		} 	} }求解哪里错了？


Question: 用c语言读写bmp图像，请问为什么读出来的图像的高和宽不对？这个代码哪里出现了问题？麻烦大神们帮我解答一下！谢谢

引用 10 楼 赵4老师的回复:再供参考：#include <math.h> #include <string.h> #include <stdio.h> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib") using namespace Gdiplus; wchar_t formats[5][11]={     L"image/bmp",     L"image/jpeg",     L"image/gif",     L"image/tiff",     L"image/png", }; wchar_t exts[5][5]={     L".bmp",     L".jpg",     L".gif",     L".tif",     L".png", }; int GetEncoderClsid(const WCHAR* format, CLSID* pClsid) {    UINT  num = 0;          // number of image encoders    UINT  size = 0;         // size of the image encoder array in bytes    ImageCodecInfo* pImageCodecInfo = NULL;    GetImageEncodersSize(&num, &size);    if(size == 0) return -1;  // Failure    pImageCodecInfo = (ImageCodecInfo*)(malloc(size));    if(pImageCodecInfo == NULL) return -1;  // Failure    GetImageEncoders(num, size, pImageCodecInfo);    for (UINT j = 0; j < num; ++j) {       if ( wcscmp(pImageCodecInfo[j].MimeType, format) == 0 ) {          *pClsid = pImageCodecInfo[j].Clsid;          free(pImageCodecInfo);          return j;  // Success       }    }    free(pImageCodecInfo);    return -1;  // Failure } int wmain(int argc,wchar_t *argv[]) {     int r=1;     if (argc<4) {     USAGE:         wprintf(L"%s srcimg.{bmp|jpg|gif|tif|png|wmf|emf|ico}  desimg.{bmp|jpg|gif|tif|png}  angle\n",argv[0]);         return r;     }     int i;     for (i=0;i<5;i++) {         if (0==_wcsicmp(argv[1]+wcslen(argv[1])-4,exts[i])) break;     }     if (i>=5) goto USAGE;     for (i=0;i<5;i++) {         if (0==_wcsicmp(argv[2]+wcslen(argv[2])-4,exts[i])) break;     }     if (i>=5) goto USAGE;     GdiplusStartupInput gdiplusstartupinput;     ULONG_PTR gdiplustoken;     GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);     {         Image img(argv[1]);         if (Ok==img.GetLastStatus()) {             UINT height = img.GetHeight();             UINT width  = img.GetWidth();             REAL angle;             if (1==swscanf_s(argv[3],L"%f",&angle)) {                 REAL size;                 size=(REAL)sqrt(1.0*width*width+1.0*height*height);                 Matrix mat;                 mat.Translate(size / -2.0f, size / -2.0f);                 mat.Rotate(-angle, MatrixOrderAppend);                 mat.Translate(size / 2.0f, size / 2.0f, MatrixOrderAppend);                 PointF pfTL((size-width)/2.0f      ,(size-height)/2.0f       );                 PointF pfTR((size-width)/2.0f+width,(size-height)/2.0f       );                 PointF pfBL((size-width)/2.0f      ,(size-height)/2.0f+height);                 PointF pfBR((size-width)/2.0f+width,(size-height)/2.0f+height);                 Graphics tgp(&img);                 Bitmap bmp((UINT)size,(UINT)size,&tgp);//Let bmp Resolution equal to img Resolution                 Graphics gp(&bmp);                 gp.SetTransform(&mat);                 gp.DrawImage(&img,pfTL);                 REAL xmin,ymin,xmax,ymax,x,y,rw,rh;                 mat.TransformPoints(&pfTL);                 xmin=xmax=pfTL.X;                 ymin=ymax=pfTL.Y;                 mat.TransformPoints(&pfTR);                 if (xmin>pfTR.X) xmin=pfTR.X;                 if (xmax<pfTR.X) xmax=pfTR.X;                 if (ymin>pfTR.Y) ymin=pfTR.Y;                 if (ymax<pfTR.Y) ymax=pfTR.Y;                 mat.TransformPoints(&pfBL);                 if (xmin>pfBL.X) xmin=pfBL.X;                 if (xmax<pfBL.X) xmax=pfBL.X;                 if (ymin>pfBL.Y) ymin=pfBL.Y;                 if (ymax<pfBL.Y) ymax=pfBL.Y;                 mat.TransformPoints(&pfBR);                 if (xmin>pfBR.X) xmin=pfBR.X;                 if (xmax<pfBR.X) xmax=pfBR.X;                 if (ymin>pfBR.Y) ymin=pfBR.Y;                 if (ymax<pfBR.Y) ymax=pfBR.Y;                 x=xmin;                 y=ymin;                 rw=xmax-x;                 rh=ymax-y;                 Bitmap* clone;                 clone = bmp.Clone(x,y,rw,rh,PixelFormat24bppRGB);//bmp.GetPixelFormat()                 CLSID encoderClsid;                 if (0<=GetEncoderClsid(formats[i],&encoderClsid)) {                     if (Ok==clone->Save(argv[2],&encoderClsid)) {                         wprintf(L"OK to %s  %s  %s  %s\n",argv[0],argv[1],argv[2],argv[3]);                         r=0;                     } else {                         wprintf(L"Error to save %s\n",argv[2]);                         r=4;                     }                 } else {                     wprintf(L"Error to GetEncoderClsid(%s,...)\n",formats[i]);                     r=3;                 }                 delete clone;             } else {                 wprintf(L"Error to get angle %s\n",argv[3]);                 r=2;             }         } else {             wprintf(L"Error to load %s\n",argv[1]);             r=5;         }     }     GdiplusShutdown(gdiplustoken);     return r; }  谢谢赵老师啦

使用GDI+读图片文件1.jpg并将每个像素的x，y和r，g，b值保存到color.txt中。

引用 3 楼 user-3的回复:你的图片没问题吧？我这里测试是对的 我再找张图片试试

引用 4 楼 ooolinux的回复:[quote=引用 2 楼 qq_34526102 的回复:] [quote=引用 1 楼 ooolinux的回复:]有很多库/函数可以读取图像文件，如果为了应用不需要自己钻研文件格式吧，软件代码是需要复用的。 因为后面要用插值法对图像进行修复，去噪和缩放， 上面那个代码是课本上的， 先读取文件，还要获取像素之类的。但是我的输出并不正确。【确[/quote]  库/函数都是可以获取每个像素的，可以修改每个像素，最后存入文件。 BMP还好点，如果是JPG文件，自己写代码估计够呛。[/quote] 好哒，我去试一下，谢谢

引用 2 楼 qq_34526102 的回复:[quote=引用 1 楼 ooolinux的回复:]有很多库/函数可以读取图像文件，如果为了应用不需要自己钻研文件格式吧，软件代码是需要复用的。 因为后面要用插值法对图像进行修复，去噪和缩放， 上面那个代码是课本上的， 先读取文件，还要获取像素之类的。但是我的输出并不正确。【确[/quote]  库/函数都是可以获取每个像素的，可以修改每个像素，最后存入文件。 BMP还好点，如果是JPG文件，自己写代码估计够呛。

引用 7 楼 赵4老师的回复:仅供参考：#include <iostream> #include <fstream> #include <string> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib")  using namespace std; using namespace Gdiplus;  int main() {     GdiplusStartupInput gdiplusstartupinput;     ULONG_PTR gdiplustoken;     GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);      wstring infilename(L"1.jpg");     string outfilename("color.txt");      Bitmap* bmp = new Bitmap(infilename.c_str());     UINT height = bmp->GetHeight();     UINT width  = bmp->GetWidth();     cout << "width " << width << ", height " << height << endl;      Color color;     ofstream fout(outfilename.c_str());      for (UINT y = 0; y < height; y++)     for (UINT x = 0; x < width ; x++) {             bmp->GetPixel(x, y, &color);             fout << x << "," << y << ";"                  << (int)color.GetRed()   << ","                  << (int)color.GetGreen() << ","                  << (int)color.GetBlue()  << endl;     }      fout.close();      delete bmp;     GdiplusShutdown(gdiplustoken);     return 0; }  菜鸟一只，看不太懂啊啊！不过还是谢谢您啦

你的图片没问题吧？我这里测试是对的

引用 1 楼 ooolinux的回复:有很多库/函数可以读取图像文件，如果为了应用不需要自己钻研文件格式吧，软件代码是需要复用的。 因为后面要用插值法对图像进行修复，去噪和缩放， 上面那个代码是课本上的， 先读取文件，还要获取像素之类的。但是我的输出并不正确。【确


Question: 问一个问题.

引用 4 楼 zhao4zhong1 的回复:搜网络教程“学OpenGL编3D游戏”。  谢谢啊，很好。  请问有具体的教材么

搜网络教程“学OpenGL编3D游戏”。

引用 1 楼 user-2 的回复:3D游戏，连DirectX都很少使用，而是使用含有游戏引擎的平台开发，国外的大型网游一般都是这样。游戏引擎不一而足，某些需要花钱买。  我在有论坛上看到有用C写的3D俄罗斯方块

引用 1 楼 user-2 的回复:3D游戏，连DirectX都很少使用，而是使用含有游戏引擎的平台开发，国外的大型网游一般都是这样。游戏引擎不一而足，某些需要花钱买。  我在有论坛上看到有用C写的俄罗斯方块


WIN7和VC6的兼容就不太好，楼主还是虚拟机跑算了。。。

引用 12 楼 小灸舞的回复:WIN7和VC6的兼容就不太好，楼主还是虚拟机跑算了。。。 新手，求教，怎么弄，

引用 6 楼 szn_409的回复:[quote=引用 4 楼 AK_one 的回复:] [quote=引用 3 楼 user-7的回复:]我猜你用的是win8系统吧 嗯，是的，，，，，，，，[/quote]   换个win7试试 [/quote] 电脑装win7蓝屏的说

引用 9 楼 小灸舞的回复:打sp6补丁加上兼容模式勉强可以用。。。 如何打补丁，，，请教一下

FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn

打sp6补丁加上兼容模式勉强可以用。。。

是vc6 sp6版本吗？

win7还行，最好是xp

引用 4 楼 AK_one 的回复:[quote=引用 3 楼 user-7的回复:]我猜你用的是win8系统吧 嗯，是的，，，，，，，，[/quote]   换个win7试试

不知道 装个虚拟机因该可以吧

引用 3 楼 user-7的回复:我猜你用的是win8系统吧 嗯，是的，，，，，，，，

我猜你用的是win8系统吧

引用 1 楼 szn_409的回复:卸载 ，装vs2010或者其以上版本，vc6是古董了，可以抛弃了 我们学的就是这软件，没办法

卸载 ，装vs2010或者其以上版本，vc6是古董了，可以抛弃了


Question: windows核心编程之RtlUserThreadStart函数第一句就是结束线程是什么意思？

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

ExitThread( (pfnStartAddr)(pvParam) ); ==>     UINT_PTR ret= pfnStartAddr(pvParam);     ExitThread(ret); 这和  char a[80]="1234"; char b[] ="4567890"; printf("%s",strcat(a,b)); 没有什么不同; 函数调用也是表达式。 函数调用表达式  pfnStartAddr)(pvParam)  的结果，作为函数实参表达式， 调用另一个函数ExitThread(），这是C,C++中很正常的函数调用。


Question: 为什么不能输出（后缀表达式）

不能输出是因为程序一直在while里面循环 while(d[i]!='\0'){........} 这个循环都没有对i操作（比如++）所以陷入了死循环

void main() { struct ss { int q[100]; int top; }; struct ss a,*b; b=&a; char c[100]; char d[10]="(1+2)*3";  b->top=-1; int i=0,j=0,k=0; while(d[i]!='\0') { switch(d[i]) {    case '(':b->q[++b->top]=d[i];break;    case ')': 	   if(b->q[b->top]!='(') { c[j++]=b->q[b->top--]; } if(b->q[b->top]=='(') b->top--; break;     	case'-':    case '+': 	   if(b->q[b->top]!='(') { c[j++]=b->q[b->top--]; if(b->q[b->top]=='+'||b->q[b->top]=='-') c[j++]=b->q[b->top--]; }            break;    case'*':   case'/':	c[j++]=b->q[b->top--];         break;   default :if(d[i]>='0'&&d[i]<='9')    {c[j++]=d[i];} 	  } if(d[i]>='0'&&d[i]<='9')    {c[j++]=d[i];} i++; }   while(b->top!=-1) { c[j++]=b->q[b->top--]; } c[j]='\0'; while(c[k]!='\0') {        if(c[j]=='-'||c[j]=='+'||c[j]=='/'||c[j]=='*')               printf(" %c",c[k]);        else            printf(" %d",c[k]);    k++; } }

void main() { struct ss { int q[100]; int top; }; struct ss a,*b; b=&a; char c[100]; char d[10]="(1+2)*3";  b->top=-1; int i=0,j=0,k=0; while(d[i]!='\0') { switch(d[i]) {    case '(':b->q[++b->top]=d[i];break;    case ')': 	/*   if(b->q[b->top]!='(') { c[j++]=b->q[b->top--]; } if(b->q[b->top]=='(') b->top--;*/ break;     	case'-':    case '+': 	  /* if(b->q[b->top]!='(') { c[j++]=b->q[b->top--]; if(b->q[b->top]=='+'||b->q[b->top]=='-') c[j++]=b->q[b->top--]; }*/            break;    case'*':   case'/':	c[j++]=b->q[b->top--];         break;   default :if(d[i]>='0'&&d[i]<='9')    {c[j++]=d[i];} 	  } if(d[i]>='0'&&d[i]<='9')    {c[j++]=d[i];} i++; }   while(b->top!=-1) { c[j++]=b->q[b->top--]; } c[j]='\0'; while(c[k]!='\0') {        if(c[j]=='-'||c[j]=='+'||c[j]=='/'||c[j]=='*')               printf(" %c",c[k]);        else            printf(" %d",c[k]);    k++; } }  while里面不要死循环，只执行一次的话，用if 或者do {}while（） 数组下标不能小于0


Question: 编写expand(s1,s2)，将字符串s1中类似于a-z类的速记符号在字符串s2中扩展为等价的完整列表abc.....xyz。该函数可以处理大小写字母和数字，

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

仅供参考：#include <conio.h> #include <math.h> #include <stdio.h> #include <string.h> FILE *f; int i,n,line,st; int n1,n2,n3; int b1,b2,b3; int e1,e2,e3; int w1,w2,w3; int v1,v2,v3; char ln[256]; char fmt[256]; char fmd[6]; char tmp[256]; char *s1,*s2,*s3,*s4; char L,R,D; void main(int argc,char *argv[]) {     if (argc<2) {     PMT:         printf("%s filename.ext [ParenthesesChar] [DelimiterChar]\nParenthesesChar is '(' default or '[' or '{'\nDelimiterChar is ',' default",argv[0]);         return;     }     if (argc==2) {         L='(';R=')';D=',';     } else {         switch (argv[2][0]) {             case '(':L='(';R=')';break;             case '[':L='[';R=']';break;             case '{':L='{';R='}';break;             default:goto PMT;         }         D=',';         if (argc>=4) D=argv[3][0];     }     sprintf(fmd,"%%d%c%%d",D);     if ((f=fopen(argv[1],"rt"))==NULL) {         printf("Can not open %s",argv[1]);         return;     }     line=0;     while (1) {         fgets(ln,255,f);         if (feof(f)) break;//         line++;         n=0;st=0;         for (i=0;i<(int)strlen(ln);i++) {             switch (st) {             case 0:if (ln[i]==L) st=1;break;             case 1:if (ln[i]==D) st=2;break;             case 2:if (ln[i]==R) {st=0;n++;} break;             }         }         switch (n) {             case 0:                 printf("%s",ln);             break;             case 1:                 s1=strchr(ln,L);                 s2=strchr(s1,R);                 if (s2==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s2++;                 v1=sscanf(s1,fmd,&b1,&e1);                 if (v1==2) {                     w1=1+(int)log10((double)e1);                     sprintf(fmt,"%%s%%0%1dd%%s",w1);                     for (n1=b1;n1<=e1;n1++) {                         printf(fmt,ln,n1,s2);                     }                 } else if (s1[1]==D) {                     b1=s1[0];                     e1=s1[2];                     for (n1=b1;n1<=e1;n1++) {                         printf("%s%c%s",ln,n1,s2);                     }                 } else {                     printf("%s",ln);                 }             break;             case 2:                 s1=strchr(ln,L);                 s2=strchr(s1,R);                 if (s2==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s2++;                 v1=sscanf(s1,fmd,&b1,&e1);                 if (v1==2) {                     w1=1+(int)log10((double)e1);                 } else {                     b1=s1[0];                     e1=s1[2];                 }                  s1=strchr(s2,L);                 s3=strchr(s1,R);                 if (s3==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s3++;                 v2=sscanf(s1,fmd,&b2,&e2);                 if (v2==2) {                     w2=1+(int)log10((double)e2);                 } else {                     b2=s1[0];                     e2=s1[2];                 }                  strcpy(fmt,"%s");                 if (v1==2) sprintf(tmp,"%%0%1dd",w1);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                 if (v2==2) sprintf(tmp,"%%0%1dd",w2);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                 for (n1=b1;n1<=e1;n1++) {                     for (n2=b2;n2<=e2;n2++) {                         printf(fmt,ln,n1,s2,n2,s3);                     }                 }             break;             case 3:                 s1=strchr(ln,L);                 s2=strchr(s1,R);                 if (s2==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s2++;                 v1=sscanf(s1,fmd,&b1,&e1);                 if (v1==2) {                     w1=1+(int)log10((double)e1);                 } else {                     b1=s1[0];                     e1=s1[2];                 }                  s1=strchr(s2,L);                 s3=strchr(s1,R);                 if (s3==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s3++;                 v2=sscanf(s1,fmd,&b2,&e2);                 if (v2==2) {                     w2=1+(int)log10((double)e2);                 } else {                     b2=s1[0];                     e2=s1[2];                 }                  s1=strchr(s3,L);                 s4=strchr(s1,R);                 if (s4==NULL) {                     cprintf("\a\a\a missing %c in line %d",R,line);                     fclose(f);                     return;                 }                 s1[0]=0;                 s1++;                 s4++;                 v3=sscanf(s1,fmd,&b3,&e3);                 if (v3==2) {                     w3=1+(int)log10((double)e3);                 } else {                     b3=s1[0];                     e3=s1[2];                 }                  sprintf(fmt,"%%s%%0%1dd%%s%%0%1dd%%s%%0%1dd%%s",w1,w2,w3);                 strcpy(fmt,"%s");                 if (v1==2) sprintf(tmp,"%%0%1dd",w1);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                 if (v2==2) sprintf(tmp,"%%0%1dd",w2);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                 if (v3==2) sprintf(tmp,"%%0%1dd",w3);                 else strcpy(tmp,"%c");                 strcat(fmt,tmp);                 strcat(fmt,"%s");                  for (n1=b1;n1<=e1;n1++) {                     for (n2=b2;n2<=e2;n2++) {                         for (n3=b3;n3<=e3;n3++) {                             printf(fmt,ln,n1,s2,n2,s3,n3,s4);                         }                      }                 }             break;             default:                 cprintf("\a\a\a > 3 repeat in line %d",line);                 fclose(f);                 return;         }     }     fclose(f); }

谢谢！ 不好意思我是新手，请多指教，麻烦您了。

楼主你都知道是数组越界的问题了。。。。 还不能改吗 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

引用 1 楼 qq423399099 的回复:利用了一个指针来实现，楼主不能sizeof(expand)要用strlen(expand)  #include<stdio.h> void main() { 	char alpha[100]={0},expand[100]={0}; 	int i=0,j=0,m; 	//读入原始字符 	for(i=0;(m=getchar())!='\n';i++) 		alpha[i]=m; 	alpha[i]='\0'; 	char *e = expand; 	for(;j < i; j++) 	{ 		*e++ = alpha[j]; 		if(alpha[j] == '-') 		{ 			e--; 			for(m = alpha[j - 1] + 1; m < alpha[j + 1]; m++){ 				*e++ = m; 			} 		} 	} 	*e = '\0'; 	/*当s1[i+1]==‘-’ && s1[i] < s1[i+2]时， 	将s1[i]至s1[i+2]之间的字符展开到s2中 	否则 	将s1[i]原封不动的写到s2中 	for(i=0;i<sizeof(alpha);i++) 	{ 		if(alpha[i]<alpha[i+2]&&alpha[i+1]=='-') 		{ 			for(j=0;j<alpha[i+2]-alpha[i]+1;j++) 			{ 				expand[j]=alpha[i]; 				alpha[i]+=1; 			}	 		} 		else 		{ 			expand[j++]=alpha[i]; 		}	 	}*/ 	//输出扩展字符 	for(j=0;j<strlen(expand);j++) 		printf("%c",expand[j]); 	printf("\n"); } [/code  为了实现a-a将被扩展为：a-a以及扩展输入a-c-u为：abcdefghijklmnopqrstu，而B比u值小，所以无法扩展，直接输出abcdefghijklmnopqrstu-B这些情况，我加了一些，但是出现了一个警告框。 [code=c]#include<stdio.h> #include<string.h> int main() { 	char alpha[100]={'a'},expand[100]={'a'}; 	int i=0,j=0,m=0,n=0; 	char*p=expand; 	//读入原始字符 	for(i=0;(m=getchar())!='\n';i++) 		alpha[i]=m; 	alpha[i]='\0'; 	//找出扩展字符 	for(j=0;j<i;j++) 	{ 		*p++=alpha[j];//遍历alpha数组 		if(alpha[j]=='-')//如果是‘-’就输出扩展字符 		{ 			*p--;//指针跑到‘-’前面一位 			for(n=alpha[j-1]+1;n<alpha[j+1];n++) 			{ 				*p=n; 				*p++; 			} 			for(;alpha[j-1]>=alpha[j+1];)//当出现类似‘u-B’的情况时，这个是我加的 				*p++=alpha[j++]; 		}		 	} 	*p='\0'; 	//输出扩展字符 	for(j=0;j<strlen(expand);j++) 		printf("%c",expand[j]); 	return 0; } 现在可以正常输出，但是这个框是怎么消除呢？我百度了一下，是数组越界的问题。


Question: c关于失踪的空格和加号

想弄明白就观察下scanf返回值

引用 3 楼 wang0635 的回复:+或-号是%d格式要求中的合法符号，scanf从输入流中接受了它，随后应该紧跟十进制数字字符，但是遇到的却不是了，于是scanf就return了，没有转换成%d对应的数，返回0，那个符号也没有退回给输入流，因为符号本身是合法的、可接受的 这样的呀

因为+-都能读入到数字中，所以scanf读到+-号，会将+或-从输入流里读走到寄存器中，如果寄存器中已经有+了，那扫描到下一个字符是-自然不会再将-也读掉，而是判断出此次读入失败，直接返回0了，而已经读走的+就留在寄存器了吧

引用 1 楼 qq423399099 的回复:我觉得会不会是因为,首先scanf会扫描输入流，然后将符合对应占位符的字符从输入流里读走先暂存起来（例如寄存器）， 然后遇到了不满足的字符或者空白符（tab,space,\n）就判断寄存器中存着的字符是否满足占位符的要求，如果满足就赋给变量， 不满足就返回0那这样的话，应该在读入1之后就直接跳出第一个while循环了呀（我试了把scanf函数中的%d后面的空格删了还是一样的结果）另外，我记得c primer plus 这本书中讲到scanf函数是从第一个非空字符开始扫描，所以在输入为1_2_+-_3_4* 的情况下，第一次读入1，返回1，缓存余下_2_+-_3_4*，第二次跳过空格读入2，返回1 ，缓存余下_+-_3_4*，第三次读+号，这里就出问题了，如果scanf函数将+视为正号而非四则运算符的话，那后面的-怎么办，如果后面是空格呢？现在的调试结果就是scanf将+录入了，不做处理， 返回0，缓存余下-_3_4*，后面也就能说通了，只是这个机制该怎么解释呢？


Question: 虚拟内存去哪里？！

VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

楼主试试GlobalMemoryStatusEx() 用GlobalMemoryStatusEx(), 不要用GlobalMemoryStatus()，MSDN上自己说的，后者可能会返回不正确的结果： GlobalMemoryStatus can return incorrect information. Use the GlobalMemoryStatusEx function instead

什么情况会导致虚拟内存消耗了那么多啊？new VirtualAlloc 或者用内存映射文件都申请不了足够大的比如1G的内存了！！！

把代码贴出来吧。比如之前见过有一堆内存申请，并且每个都是MEM_COMMIT | MEM_RESERVE最后挂掉的奇葩代码...

引用 11 楼 cs290473786 的回复:@5楼，可能GlobalMemoryStatus()不太精确，但是大致应该是差不多的。而且是因为虚拟内存不太够用了，我才用这个函数进行验证的！！  [quote=引用 9 楼 renwotao2009 的回复:] [quote=引用 7 楼 cs290473786 的回复:] [quote=引用 2 楼 renwotao2009 的回复:] 你这项目静态加载了多少库，虚拟地址空间都不够用吗 可能是加载的库里面会申请一些内存导致的吗？[/quote]可能，都是公用的库，还是你们自己写的[/quote] 这种情况自写写的话，那就只能一个个的看是哪里申请了大量内存还是说检查内存泄漏吗？在库里面进行检查吗？[/quote]你们自己写的库的话，可以检查下有没有申请大量空间的代码看能不能优化，或改成动态载入形式，用时载入不用卸载。

@5楼，可能GlobalMemoryStatus()不太精确，但是大致应该是差不多的。而且是因为虚拟内存不太够用了，我才用这个函数进行验证的！！  引用 9 楼 renwotao2009 的回复:[quote=引用 7 楼 cs290473786 的回复:] [quote=引用 2 楼 renwotao2009 的回复:] 你这项目静态加载了多少库，虚拟地址空间都不够用吗 可能是加载的库里面会申请一些内存导致的吗？[/quote]可能，都是公用的库，还是你们自己写的[/quote] 这种情况自写写的话，那就只能一个个的看是哪里申请了大量内存还是说检查内存泄漏吗？在库里面进行检查吗？

引用 10 楼 jdgdf566 的回复:你把内存当硬盘吗 用虚拟内存或者内存映射文件，申请一两个G很正常啊 ？

你把内存当硬盘吗

引用 7 楼 cs290473786 的回复:[quote=引用 2 楼 renwotao2009 的回复:] 你这项目静态加载了多少库，虚拟地址空间都不够用吗 可能是加载的库里面会申请一些内存导致的吗？[/quote]可能，都是公用的库，还是你们自己写的

引用 2 楼 renwotao2009 的回复:你这项目静态加载了多少库，虚拟地址空间都不够用吗 可能是加载的库里面会申请一些内存导致的吗？

引用 1 楼 yuelengdihai 的回复:全局变量也不会申请几个G的内存吧，资源管理器里面看看vs占了多少内存，程序占了多少内存， 感觉是越界引起的内存泄露 main函数才刚进入，怎么看哪里内存泄漏啊？都没有进行malloc和new操作。

引用 3 楼 qq423399099 的回复:要降低虚拟内存使用，方法就是优化你的数据结构和算法，和消除内存泄漏。 如果windows设置成系统管理页面文件，它会根据使用情况自动增加交换空间 是win7操作系统，看虚拟内存设置里面是系统自动管理的！

你这项目静态加载了多少库，虚拟地址空间都不够用吗


Question: 关于预处理__LINE__的问题

非常感谢！我之所以转不出来就是因为一直试图在程序代码里传递参数__LINE__给宏，但始终都不会传递行号，而只是传递字符__LINE__；即便先赋值__LINE__给变量再传递参数也不行（就是没想到在指令里再定义一个宏做中间桥梁） 而在宏定义里使用#__LINE__也只能得到#40而不是“40”。 再次表示感谢！！！

引用 2 楼 handanxuebu_2016 的回复: 感谢大侠！！！！！实在是太感谢了！！！！ 是不是可以这样理解： 宏定义在从程序中接受参数时始终都是直接将参数替换过去，而未进行运算； 仅当从嵌套宏定义中接受参数时才进行运算并替换（书中指“明示常量”）？ 也就是说预处理器在进行宏替换时仅对指令进行明示常量计算并替换程序代码，而不对程序本身进行计算？  过多的文字表述容易把简单问题复杂化。直接看一下展开的流程：   STR(__LINE__)  ==>  INT_STR(line_no)    编译器在处理STR（__LINE__)时，因为此时的宏定义中没有“#”号，所以编译器会先将__LINE__这一宏替换为对应的数值（行号，假设为40），进而再去解析 INT_STR(40)，编译器处理在#40时，会将后面的整数40展开为字符串”40“，然后就可以得到预期的结果。  之所以定义两个宏，是因为在第一次展开时需要获取__LINE__的数值。如果只用一个宏，#__LINE__ 会被替换为"__LINE__"

#define INT_STR(x) #x #define STR(x) INT_STR(x)  #define LINE_FILE "Line " STR(__LINE__) " file " __FILE__


Question: C语言打开文件进行哈希运算得出摘要的程序为什么运行不对啊

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

写代码一定要注释！尤其是要别人帮忙。 有这个时间看你的代码，为什么不能去看大师的代码？至少还有大把技术资料。 逛论坛是随便看看有什么可以顺手解答的，不会有谁有耐心看半天没成型的代码。  多学学软件工程方面的东东吧，以后干起活来肯定要和别人合作，没点基础不行的。 一般先设计，考虑到依赖性和拓展性，设计OK先搞测试用例，好的用例在通过测试时代码就是OK的。 建议看看《重构》，对软件开发非常有用。

main函数开始设断点，F10一步一步看，可以设几个观察的变量

谢谢教导，虽然作为一名仅仅了解C皮毛的大四毕业生，但确实指导很受用！


Question: C语言中自增运算符的问题

不同编译器结果都有可能不一样，这种东西。。诶。。

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

不需要了解 所谓的“了解”只是自欺欺人罢了 正如同一个词在不同方言中的含义不同，是都错了，还是都对了，还是有对有错？ 毫无意义 正常人要做的，就是避免这些东西，才能与所有的正常人交流

不要这样使用，结果是未定义的

这是未定义行为，没有意义

printf计算参数是从右到左压栈的，打印的结果不同的编译器很可能不同 参考：http://bbs.csdn.net/topics/370153775


Question: C语言自动类型转换的问题

理解和讨论之前请先学会如何观察！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

printf("%d,%f",a,a);第一个数据a，按照 int 处理，TC中 他是16Bits的 第二个数据a,按照 double 处理64Bits %f,%lf 只是输出精度可能不同，至少，float 不必采用高精度输出 所有 float,double  取数 都是按照 double 取的 float 参数按照 double 传递 TC中是64Bits的

第二个问题a是按照int方式存储，但按照float方式读取，即IEE754标准读取

第一个问题不同类型参与运算，则先转换为同一种类型再进行计算，转换按照类型提升的方向进行，低精度向高精度转换，或者说向类型长度增加的方向进行。强转则是临时性转换不改变原类型存储方式，仅仅对原类型结果求得目标类型值。 自动转换和强转都是临时性转换

引用 1 楼 qq423399099 的回复:(int)b+c;是int+float都会隐式转换成double进行运算 a的值是3 问题2：请参考IEEE754浮点数存储标准 printf("%f",a); 这样指定输出并不会进行隐式类型转换，只是将a在内存中的二进制形式按照float存储标准来解析  ----------------------------------------------------------- 问题1，如果是表达式为double型的，为什么答案是3而不是3.7？

引用 2 楼 prinke12345 的回复:[quote=引用 1 楼 qq423399099 的回复:] (int)b+c;是int+float都会隐式转换成double进行运算 a的值是3 问题2：请参考IEEE754浮点数存储标准 printf("%f",a); 这样指定输出并不会进行隐式类型转换，只是将a在内存中的二进制形式按照float存储标准来解析  ----------------------------------------------------------- 问题1，如果是表达式为double型的，为什么答案是3而不是3.7？[/quote] 因为你的a是int的啊。。。。


Question: 栈的应用

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

遇到数字：直接输出   遇到'('：压栈   遇到')'：持续出栈，如果出栈的符号不是'('则输出，否则终止出栈。   遇到符号则判断该符号与栈顶符号的运算优先级，如果栈顶符号的运算优先级高，则出栈并输出，直到优先级相等或栈为空；如果栈顶符号的运算优先级低于或等于当前符号的运算优先级，则将当前符号压栈。   处理完字符串后将栈中剩余的符号全部输出。   以下代码把把每一步的栈的情况都会打印，楼主不想显示的话直接注释掉cout以及调用show的地方就好  #include <cstdlib> #include <iostream> #include <stdlib.h> #include<iomanip> using namespace std; class node { public: 	char oper; 	double value; 	node *next; 	node(char c,double v,node *nextval) 	{ 		oper=c; 		value=v; 		next=nextval; 	} 	~node(){}; }; class stack {   public: 	node *top; 	stack() 	{ 		node *head=new node(' ',0,NULL); 		top=head; 	} 	~stack() 	{ 		node *tem; 		while(top->next!=NULL) 		{ 			tem=top; 			top=top->next; 			delete tem;                       		} 	} 	void show()        	{ 		node *temp; 		temp=top; 		if(temp->next==NULL) 		{ 			cout<<"栈空!"; 		} 		else 		{ 			cout<<"栈中元素:"; 			for(;temp->next!=NULL;temp=temp->next) 			{ 				if(temp->oper=='#') 					cout<<temp->value<<" "; 				else 					cout<<temp->oper<<" "; 			} 		} 		cout<<endl; 	} 	void push(char c,double v) 	{ 		node *tem=new node(c,v,top); 		top=tem;      	} 	node* pop() 	{ 		node *tem; 		tem=top; 		top=top->next; 		return tem; 	}        }; int main(int argc, char *argv[]) { 	stack mystack; 	node *tem,*tem2; 	int i,j=0,len,count=0; 	char s1[50],s2[50]; 	cout<<"输入中缀表达式(四则运算,包含括号):"; 	gets(s2); 	len=strlen(s2); 	for(i=0;i<len;i++) 	{ 		if(s2[i]=='(') 		{ 			mystack.push('(',0); 			mystack.show(); 		} 		else if(s2[i]>='0'&&s2[i]<='9') 		{ 			s1[count]=s2[i]; 			count++;                      		} 		else if(s2[i]=='*'||s2[i]=='/') 		{ 			s1[count]=' '; 			count++; 			if(mystack.top->oper=='*'||mystack.top->oper=='/') 			{ 				tem=mystack.pop(); 				s1[count]=tem->oper; 				count++; 				delete tem;  				mystack.show(); 			} 			mystack.push(s2[i],0); 			mystack.show(); 		} 		else if(s2[i]=='+'||s2[i]=='-') 		{ 			s1[count]=' '; 			count++; 			if(mystack.top->oper=='*'||mystack.top->oper=='/'||mystack.top->oper=='-'||mystack.top->oper=='+') 			{ 				tem=mystack.pop(); 				s1[count]=tem->oper; 				count++; 				delete tem;    				mystack.show(); 			} 			mystack.push(s2[i],0);    			mystack.show(); 		} 		else if(s2[i]==')') 		{ 			while(mystack.top->oper!='(') 			{ 				tem=mystack.pop(); 				s1[count]=tem->oper; 				count++; 				delete tem;   				mystack.show(); 			} 			tem=mystack.pop(); 			delete tem; 			mystack.show(); 		}         	} 	while(mystack.top->next!=NULL) 	{ 		tem=mystack.pop(); 		s1[count]=tem->oper; 		count++; 		delete tem;     		mystack.show(); 	} 	s1[count]='\0'; 	cout<<"后缀表达式为:"<<s1<<endl; 	bool change1,change2; 	change1=change2=false; 	for(i=0;i<count;i++) 	{ 		int x;        		char s[20]; 		if(s1[i]>='0'&&s1[i]<='9') 		{ 			s[j]=s1[i]; 			j++; 			change1=true;         		} 		else if(s1[i]!='\0') 		{ 			if(change1) 			{ 				change2=true; 				change1=false; 				s[j]='\0'; 				j=0; 			} 		} 		if(change2) 		{ 			x=atoi(s); 			s[j]='\0'; 			change2=false; 			mystack.push('#',x);    			mystack.show(); 		}  		if(s1[i]=='+'||s1[i]=='-'||s1[i]=='*'||s1[i]=='/') 		{ 			double sum=0; 			if(s1[i]=='+') 			{ 				tem=mystack.pop(); 				mystack.show(); 				tem2=mystack.pop(); 				mystack.show(); 				sum=tem2->value+tem->value; 				cout<<tem2->value<<"+"<<tem->value<<"="<<sum<<endl; 			} 			else if(s1[i]=='-') 			{ 				tem=mystack.pop(); 				mystack.show(); 				tem2=mystack.pop(); 				mystack.show(); 				sum=tem2->value-tem->value; 				cout<<tem2->value<<"-"<<tem->value<<"="<<sum<<endl; 			} 			else if(s1[i]=='*') 			{ 				tem=mystack.pop(); 				mystack.show(); 				tem2=mystack.pop(); 				mystack.show(); 				sum=tem2->value*tem->value;   				cout<<tem2->value<<"*"<<tem->value<<"="<<sum<<endl; 			} 			else if(s1[i]=='/') 			{ 				tem=mystack.pop(); 				mystack.show(); 				tem2=mystack.pop(); 				mystack.show(); 				sum=tem2->value/tem->value; 				cout<<tem2->value<<"/"<<tem->value<<"="<<fixed<<setprecision(2)<<sum<<endl; 			} 			delete tem;	   			delete tem2; 			mystack.push('#',sum);    			mystack.show(); 		} 	} 	tem=mystack.pop(); 	mystack.show(); 	cout<<"结果为:"<<fixed<<setprecision(2)<<tem->value<<endl; 	delete tem; 	system("PAUSE"); 	return EXIT_SUCCESS; }


Question: C语言switch里的default里加continue问题

恩呢 谢谢 已经改好了 的确是函数把回车当成字符的原因

主要是因为输入缓冲区有遗留下来的回车符，所以导致输入错误的时候Scord=getchar();会读到回车 方法是default分支下加上：fflush(stdin);或者getchar();都行  #include<stdio.h> #include<stdlib.h> int main() { 	char Scord; 	printf("-------------成绩管理系统------------\n"); 	printf("等级为'A'成绩在90分以上,\n"); 	printf("等级为'B'成绩在80~90分之间,\n"); 	printf("等级为'C'成绩在60~80分以上,\n"); 	printf("等级为'D'成绩在60分以下\n"); 	printf("请输入成绩等级:");  	while(1) 	{ 		Scord=getchar(); 		switch(Scord) 		{ 		case 'A': 			printf("该学生成绩在90分以上\n"); 			break; 		case 'B': 			printf("该学生成绩在80~90分之间\n"); 			break; 		case 'C': 			printf("该学生成绩在60~80分之间\n"); 			break; 		case 'D': 			printf("该学生成绩在60分以下\n"); 			break; 		default: 			getchar();//或者fflush(stdin);都能清空遗留下来的回车符 			printf("您输入的分数不正确,请重新输入:"); 			continue; 		} 		break; 	} 	system("pause"); }


Question: c语言软件程序混乱

引用 3 楼 zpr5554321 的回复:不行，重装后一开始可以，换了一组数据就又乱了 #include<stdio.h> int main() { 	int max4(int a,int b,int c,int d); 	int a,b,c,d,max; 	scanf("%d,%d,%d,%d",&a,&b,&c,&d); 	max=max4(a,b,c,d); 	printf("%d",max); 	return 0; } int max4(int a,int b,int c,int d) { 	int max2(int a,int b); 	int m; 	m=max2(a,b); 	m=max2(max2(a,b),c); 	m=max2(max2(max2(a,b),c),d); 	return m; } int max2(int a,int b) { 	int max; 	max=(a>b?a:b); 	return max; }  1、a,b,c,d初始化为0：int a=0, b=0, c=0, d=0; 2、输入数据用逗号隔开：1,2,3,4 3、换一个编译器试试，gcc下编译通过且结果正常

楼主重装过系统了啊，楼主用的啥编译软件？

求大神们帮帮我

我试试看看，谢谢。

重装系统试试


Question: 请问我的代码哪错了？

multiply声明了，没有进行运算，还有就是time.h导入的没有什么用啊，用时间播种子表示srand((unsigned)time(NULL));

楼上正解，multiply一直是个垃圾值

multiply没有计算，还有为什么不用循环


Question: while(!feof(fp))跳不出循环

找到错误了，谢谢大家解答

不要使用 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;  //... } 类似的例子还可以举很多。  返回值：实际读取的元素个数。如果返回值与count不相同，则可能文件结尾或发生错误。从ferror和feof获取错误信息或检测是否到达文件结尾。

引用 5 楼 renwotao2009的回复:[quote=引用 4楼我是你的主体 的回复:][quote=引用 3 楼 renwotao2009的回复:]文本文件判断用EOF，EOF为-1。feof既可以判断文件文件也可以判断二进制文件 这个知道，但没找到跳不出循环的原因[/quote]你调试没，看函数返回值[/quote] 调试看了，发现是跳不出for循环，fread的返回值一直是1

引用 6 楼 liehu232的回复:是for循环没退出吧 好像是，fread的返回值一直是1，为什么读到文件末尾不会返回0的

是for循环没退出吧

引用 4楼我是你的主体 的回复:[quote=引用 3 楼 renwotao2009的回复:]文本文件判断用EOF，EOF为-1。feof既可以判断文件文件也可以判断二进制文件 这个知道，但没找到跳不出循环的原因[/quote]你调试没，看函数返回值

引用 3 楼 renwotao2009的回复:文本文件判断用EOF，EOF为-1。feof既可以判断文件文件也可以判断二进制文件 这个知道，但没找到跳不出循环的原因

引用 1 楼 user-4的回复:EOF是文本文件结束的标志。在文本文件中，数据是以字符的ASCⅡ代码值的形式存放，普通字符的ASCⅡ代码的范围是32到127（十进制），EOF的16进制代码为0x1A（十进制为26），因此可以用EOF作为文件结束标志。 PS: 对文本文件的结束判断可以看文件末尾是否读到EOF控制字符。  但是对于二进制文件来说，所有的内容都是以10101的形式存储的，因此在文件的末尾可能存在-1的情况，这样就不能用EOF作为二进制文件末尾的标识。 但我用的是feof，这个函数的返回值只有0和1


Question: 没有stdio.h怎么出来sprintf的？

你包含的头文件里可能间接包含了

自古二楼出真相

你的curl.h里面包含了


Question: 已经写完了函数，main发法怎么写呢

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

全角反斜线 [＼＼] != 半角反斜线 [\\] 全角斜线 [／／] != 半角斜线 [//]

全角斜线 [＼＼] != 半角斜线 [\\] 全角反斜线 [／／] != 半角反斜线 [//]

LZ所谓的写完了，估计也就是网上找的一段，期待有人给他写出完整的程序。

楼主，你61，62行的注释貌似不对吧，运行肯定会报错，明显字体颜色都和上面两行的注释不一样

仅供参考  #include <stdio.h> #include <stdlib.h>  typedef struct SeqStack {     int MAXNUM;	/*栈中最大元素个数*/     int t;		/*顺序栈类型定义*/     int *s;  }SeqStack, *PSeqStack;/*顺序栈类型的指针类型*/   PSeqStack createEmptyStack_seq(int m)  {     PSeqStack pastack = (PSeqStack)malloc(sizeof(SeqStack));     if (NULL == pastack) {     	return NULL; 	}      	if (m) {     	pastack->s = (int*)malloc(sizeof(int) * m);     	if (NULL == pastack->s) {     	free(pastack);     	return NULL;     	} 	}      pastack->MAXNUM = m;     pastack->t = -1;     return pastack; }  void destroyStack_seq(PSeqStack pastack) { 	if (pastack->s) { 		free(pastack->s); 	}  	 	free(pastack); }    void push_seq(PSeqStack pastack, int x)/*栈中插入一个元素*/ {     if (pastack->t >= (pastack->MAXNUM - 1)) {         printf("Overflow!\n");   	 	}     else {         pastack->t++;         pastack->s[pastack->t] = x;     } }   int pop_seq(PSeqStack pastack)/*删除栈顶元素*/ { 	int pop = 0; 	     if (pastack->t == -1) {         printf("Underflow!\n"); 	}      else {      	pop = pastack->s[pastack->t];      	pastack->t--; 	}      	return pop; }  int is_seq_empty(PSeqStack pastack) {     if (pastack->t == -1) {         return 1; 	} 	 	return 0;	 }  int top_seq(PSeqStack pastack)/*当pastack所指的栈不为空栈时，求栈顶元素的值*/ {     if (pastack->t == -1) {         printf("It is empty!\n");         return 0; 	}     else {     	return(pastack->s[pastack->t]); 	} }    int main(void) {     int m = 10;      PSeqStack pastack = NULL;            //创建一个能够容纳10个元素的栈     pastack = createEmptyStack_seq(m);     //向栈中压入数据      push_seq(pastack, 1);     push_seq(pastack, 2);     push_seq(pastack, 3);     push_seq(pastack, 4);     push_seq(pastack, 5);          while (!is_seq_empty(pastack)) {     	printf("pop data %d\n", pop_seq(pastack)); 	} 	 	destroyStack_seq(pastack); 	return 0; }

nt main()  {      int m; int x=1; scanf("%d",&m)      PSeqStack pastack;      pastack=createEmptyStack_seq(m);//创建  pop_seq(pastack);//插入数据     push_seq(pastack, x);//删除栈顶元素 int top = top_seq(pastack);//返回栈顶数据 return 0; }  楼主缺乏基本的debug能力呀，要多练习

你好，你看一下，结果是这样的

mian里面直接调用就行了 nt main()  {      int m; int x=1; scanf("%d",&m)      PSeqStack pastack;      pastack=createEmptyStack_seq(m);//创建  pop_seq(pastack);//插入数据     push_seq(pastack, x);／／删除栈顶元素 int top = top_seq(pastack);／／返回栈顶数据 return 0; }


Question: c语言 串口通信

if（'a' == buf[10]）

请问4楼，怎样可以将输入的数据直接写成a，我写成if（buf[10]=a）错了

5楼的意思是定义多个数组吗？

如果文本框textbox个数很多的话， 可以定义成数组。对应的字符也可以放到数组里面。 然后用循环实现自动分配。

你可以使用if语句或者switc..case 的格式对于你串口输入的数据进行判断，根据输入的数据的不同，跳转到不一样的处理函数。不知道这个的思路能不能解决楼主你的问题。我最近刚写了一点，就是使用stm32芯片，对每次从串口接收的数据进行判断，根据输入的不同调转到不同的出来函数去执行

就是指向一个接收框控件 TEXTBOX

啥叫“指向接收框”？

有没有大神会这个，或者这样可不可行？


Question: 求指导这个问题应该用什么思想去做

这里不是求分拆的结果，只是求分拆的计数 应该有公式吧

至少可以递推

仅供参考：#include <stdio.h> #include <stdlib.h> void print(int res[], int num) {     static int L=0;     L++;     printf("%8d:",L);     for (int i=0;i<num;++i) {         printf(" %d", res[i]);     }     printf("\n"); } void split(int n, int m) {// n表示总数，m表示最大因子     static int res[100];// 保存结果     static int num=-1;// 当前因子下标      if (n<m || n<0 || m<1) return;     num++;     if (0==n) {// 递归终止条件，为0不可再分，直接输出         print(res,num+1);         num--;         return;     } else {         if (n==m) {// 不拆，直接输出             res[num]=m;             print(res,num+1);             num--;         } else {             // 拆分出第一个             res[num]=m;             n=n-m;              if (m>n) m = n; // 最大因子不可能大于总数              for (int i=m;i>=1;--i) {// 循环，第二个因子可以继续拆分，而且按照最大因子不同可以拆分成多个                 split(n,i);             }             num--;         }     } } void Split(int n) {     if (n<=0) return;     if (100<n) {         printf("Up to 100\n");         return;     }     for (int i=n;i>=1;--i) {         split(n, i);     } } void main(int argc,char **argv) {          if (argc<=1) Split(5);     else if (argc>=3) split(atoi(argv[1]),atoi(argv[2]));     else              Split(atoi(argv[1])); }

可以用递归  #include<stdio.h>   int stack[100];   int top;   int total,n;   void dfs(int index)   {     int i;     if(total==n)     {         printf("%d=",n);         for(i=0;i<top-1;i++)             printf("%d+",stack[i]);         printf("%d\n",stack[top-1]);     }     if(total>n )         return ;     for(i=index;i>=1;i--)     {         total+=i;         stack[top++]=i;         dfs(i);         total-=i;         stack[--top];     }   }   void main()   {       while(scanf("%d",&n)!=EOF)       {           top=0;           total=0;           dfs(n-1);       }   }

那学校老师跟本ID比，不是侮辱本ID吗？

#include <stdio.h> #include <stdlib.h> #include <stdarg.h> int stack[1000]; int top; int total,n; int nnnnn = 0; #define push(e) do { total += e;  stack[top++]=e; }while(0) #define pop(e) do { total -= e; top--; }while(0)  void dfsA( int m, int s ) {   int i;   if(total>n )       return ;   if ( m < 0 || s <0 )   {       return ;   }   push(s);   push(m);    if ( n == 1 )   {       printf("1\n");       nnnnn = 1;       return;   }    if ( stack[1] != n )    {      printf("%d=",n);    for(i=0;i<top-1;i++)    if ( stack[i] != 0 )         printf("%d+",stack[i]);     if ( stack[top-1] != 0 )         printf("%d\n",stack[top-1]);      nnnnn++;     }       pop(m);     //pop(s);     //push(s);    for(i=1;i<m;i++)   {       dfsA( m - i, i );   }   pop(s); }  void main() {   int i;     while(scanf("%d",&n)!=EOF)     {         top=0;         total=0;         nnnnn = 0;        // for ( i=1; i<n; i++ )         dfsA(n-0, 0);          printf("total:%d\n", nnnnn );     } }

引用 2 楼 zhao4zhong1 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  代码有参考价值，这段话才更有价值。谢谢，感觉比学校的老师靠谱啊。。

对啊。我是开始想到了递归。。可是我推着推着就蒙了。。


Question: C语言，关于数组的赋值的问题。

看来楼主这家伙还没有真正认识什么是表达式，也不知道表达式会计算一个值。 int x = 0; while(links[i].p[j][k]!=0) {        printf(">%d", s[x ++] = links[i].p[j][k++]-1); }

k++递增一次就成，反正应该就是那个意思

定义一个变量记录a当前使用的下标，在循环中赋值，在循环中递增下标 int l = 0,s[N] = {0};  while(links[i].p[j][k]!=0) {        s[l++] = links[i].p[j][k++]-1;        printf(">%d",links[i].p[j][k++]-1); }

题目中打错了。数组a[]就是数组s[].同一个意思。


Question: 关于windows平台下c语言socket的问题

需要调用 fflush 之类的函数，刷新缓冲区（让数据写入文件），或者关闭文件。 关闭当然最好，但是耽误事情 每次打开关闭，太麻烦了

数据可能还在缓存里，关闭文件可以让缓存里的数据全部存到文件里

是不是没有close(file)?

楼上正解，刷新下缓存buf


Question: 学数据结构的时候写程序遇到的问题，应该很简单，求指教

SqList* &L就是指针的引用传递，加上&可以去改变L的指向，如果不加&则只能改变L所指向的区域的值

有&传递的是一个指针的引用

你用C编译C++于是出问题了 SqList* & L 是指针的引用， C++有引用类型， C没有引用类型 于是乎，编译不了代码

SqList* & L是不是有问题吧。 看L = (SqList*)malloc(sizeof(SqList));这句，SqList是个结构体吧。 SqList* L，L是个结构体指针。

定义的是链表指针SqList*  L；L是链表指针  &L表示L的引用，也就是L的存放地址


Question: debian服务器下多文件使用gettext()出现无法生成.po文件

xgettext: error while opening "antiserver.pot" for reading: No such file or directory


Question: checkCode = checkCode ^ pBuffer[i];  运算问题

a^a =1;

0x56就是0101 0110,和这个进行异或操作？

想表达什么？


Question: 把输入粘贴到输出

1.字符要用%c输出，字符串才用%s 2.output[++m] = '\0';应该改为output[m] = '\0'; 3.(c = getchar()) != EOF我改成了(c = getchar()) != '\n'  #include<iostream> using namespace std; #define MAX_LINE 1000 int main() { 	int	n = 1; 	char	c; 	int	m; 	char	output[MAX_LINE];  	for(m = 0;(c = getchar()) != '\n'; m++){ 		output[m] = c; 	} 	output[m] = '\0'; 	m = 0;  	while(output[m] != '\0'){ 		if(n == 1){ 			printf("Line1:"); 			n += 1; 		} 		if(output[m] != '\n'){ 			printf("%c", output[m]); 			m++; 		} 		else{ 			/* 			printf("%s", output[m]); 			printf("Line%d:", n); 			n++; 			m++;*/ 		} 	}   printf("\n"); }

printf("%s", output[m]);  改成  printf("%s", output); 或者 printf("%c", output[m]);  output[m]只是一个字符

就这样吧：  #include <stdio.h> #include <string.h> #define MAXCHARS 256 char ln[MAXCHARS]; int line, n; int main(void){    line = 1;    while(1){       if(NULL == fgets(ln, MAXCHARS, stdin)) break;       n = strlen(ln);        if('\n' == ln[0]) continue;        printf("%d %s", line, ln);       line++;    }     return 0; }


Question: 问一个保存数据到文件和读取的问题

fp=fopen("book.txt","ab"); 改成 fp=fopen("book.txt","a+b");

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

其实你可以在添加书本的时候动态的统计书本的数量 或者说你可以用文件的大小除以结构体的大小

搞懂了，是上面用追加的方式打开了文件，读取不到之前的数据，谢谢大家解答


Question: PAT(Advanced）1088. Rational Arithmetic (20) 求助

仅供参考：


Question: c++算法

这样子还有没有什么漏掉的？ Date& Date::operator+=(const Date&other)  {  	int k=other.day;  	int cun; 	if(other.day>0){cun=other.day;}  	else cun=-other.day; 	if(k>0){ 	 while(cun>0) 	 { 	 	switch(month) 	 	{ 	 		case 1:if(day+cun<=31){day=day+cun;cun=0;break;}else{cun=cun-(31-day)-1;month++;day=1;} 			case 2:if((year%4==0&&year%100!=0)||(year%400==0)){if(day+cun<=29){day=day+cun;cun=0;break;}else{cun=cun-(29-day)-1;month++;day=1;}} 			else{if(day+cun<=28){day=day+cun;cun=0;break;}else{cun=cun-(29-day)-1;month++;day=1;}} 			case 3:if(day+cun<=31){day=day+cun;cun=0;break;}else{cun=cun-(31-day)-1;month++;day=1;} 			case 4:if(day+cun<=30){day=day+cun;cun=0;break;}else{cun=cun-(30-day)-1;month++;day=1;} 			case 5:if(day+cun<=31){day=day+cun;cun=0;break;}else{cun=cun-(31-day)-1;month++;day=1;} 		        case 6:if(day+cun<=30){day=day+cun;cun=0;break;}else{cun=cun-(30-day)-1;month++;day=1;} 		        case 7:if(day+cun<=31){day=day+cun;cun=0;break;}else{cun=cun-(31-day)-1;month++;day=1;} 		       case 8:if(day+cun<=31){day=day+cun;cun=0;break;}else{cun=cun-(31-day)-1;month++;day=1;} 		       case 9:if(day+cun<=30){day=day+cun;cun=0;break;}else{cun=cun-(30-day)-1;month++;day=1;} 		       case 10:if(day+cun<=31){day=day+cun;cun=0;break;}else{cun=cun-(31-day)-1;month++;day=1;} 		       case 11:if(day+cun<=30){day=day+cun;cun=0;break;}else{cun=cun-(30-day)-1;month++;day=1;} 		       case 12:if(day+cun<=31){day=day+cun;cun=0;break;}else{cun=cun-(31-day)-1;year++;month=1;day=1;} 		 } 	  } } else{ 		while(cun>0) 	{ 		switch(month) 		{ 			case 1:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;year--;month=12;day=31;} 			case 2:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=31;} 			case 3:if((year%4==0&&year%100!=0)||(year%400==0)){ 				if(day-cun>=1){day=day-cun;cun=0;break;} 				else{cun=cun-day;month--;day=29;}  			} 			else{ 				if(day-cun>=1){day=day-cun;cun=0;break;} 				else{cun=cun-day;month--;day=28;} 			} 			case 4:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=31;} 			case 5:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=30;} 			case 6:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=31;} 			case 7:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=30;} 			case 8:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=31;} 			case 9:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=31;} 			case 10:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=30;} 			case 11:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=31;} 		       case 12:if(day-cun>=1){day=day-cun;cun=0;break;}else{cun=cun-day;month--;day=30;} 		} 	} } 	  return *this;   }

楼主多测试几个例子呗，看看有问题没

Date operator+(Date a,int b) {     Date c;c.day=a.day;c.year=a.year;c.month=a.month;     int cun;//要操作的日期总数     if(b>0) {         cun=b;     }//判断是加日期还是减日期，b>0,加日期 ，b<0,减日期     else cun=-b;//强制使得cun是正数     if(b>=0) {//若b>0,加b天         while(cun>0) {//当操作天叔大于0时继续操作             switch(c.month) {//对月份进行判断             //一月份如果天数加上cun还是小于31天，天数直接加上cun并且使存=0；跳出循环；如果加上cun大于了31天，月份+1，天数=1；cun=cun-(31-c.day)-1             //二月份             //如果为闰年，如果天数加上cun还是小于29，天数直接加上cun，cun=0，跳出循环；否则月份+1，天数变为1号，cun=cun-(29-c.day)-1             //如果为平年，如果天数加上cun还是小于28，天数直接加上cun，cun=0，跳出循环；否则月份+1，天数变为1号，cun=cun-(28-c.day)-1             //三到十一月份 如果天数加上cun还是小于31天，天数直接加上cun并且使存=0；跳出循环；如果加上cun大于了31天，月份+1，天数=1；cun=cun-(31-c.day)-1             //十二月份 如果天数加上cun还是小于31天，天数直接加上cun并且使存=0；跳出循环；如果加上cun大于了31天，年份+1，月份+1，天数=1；cun=cun-(31-c.day)-1             case  1:if(c.day+cun<=31) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(31-c.day)-1;}             case  2:if((c.year%4==0&&c.year%100!=0)||(c.year%400==0)) {                     if(c.day+cun<=29) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(29-c.day)-1;}                     } else {                     if(c.day+cun<=28) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(29-c.day)-1;}                     }             case  3:if(c.day+cun<=31) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(31-c.day)-1;}             case  4:if(c.day+cun<=30) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(30-c.day)-1;}             case  5:if(c.day+cun<=31) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(31-c.day)-1;}             case  6:if(c.day+cun<=30) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(30-c.day)-1;}             case  7:if(c.day+cun<=31) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(31-c.day)-1;}             case  8:if(c.day+cun<=31) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(31-c.day)-1;}             case  9:if(c.day+cun<=30) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(30-c.day)-1;}             case 10:if(c.day+cun<=31) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(31-c.day)-1;}             case 11:if(c.day+cun<=30) {c.day=c.day+cun;cun=0;break;} else {c.month++;c.day=1;cun=cun-(30-c.day)-1;}             case 12:if(c.day+cun<=31) {c.day=c.day+cun;cun=0;break;} else {c.year++;c.month=1;c.day=1;cun=cun-(31-c.day)-1;}             }         }     } else {//若b<0,要减b天数         while(cun>0) {             switch(c.month) {             //一月份如果天数减去cun还是大于1号，天数直接减去cun并且使存=0；跳出循环；如果减去cun小于了1号，年份-1，月份=12，天数=31；cun=cun-c.day;             //如果天数减去cun还是大于1号，天数直接减去cun并且使存=0；跳出循环；如果减去cun小于了1号，月份-1，天数=28/29/30/31；cun=cun-c.day;             case  1:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.year--;c.month=12;c.day=31;cun=cun-c.day;}             case  2:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=31;cun=cun-c.day;}             case  3:if((c.year%4==0&&c.year%100!=0)||(c.year%400==0)) {//闰年                     if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=29;cun=cun-c.day;}                     } else {//平年                     if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=28;cun=cun-c.day;}                     }             case  4:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=31;cun=cun-c.day;}             case  5:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=30;cun=cun-c.day;}             case  6:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=31;cun=cun-c.day;}             case  7:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=30;cun=cun-c.day;}             case  8:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=31;cun=cun-c.day;}             case  9:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=31;cun=cun-c.day;}             case 10:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=30;cun=cun-c.day;}             case 11:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=31;cun=cun-c.day;}             case 12:if(c.day-cun>=1) {c.day=c.day-cun;cun=0;break;} else {c.month--;c.day=30;cun=cun-c.day;}             }         }     }     return c; //返回Date c }   http://bbs.csdn.net/topics/380157851

楼主你这个排版。。。 稍微看了下，发现了一个问题： case语句的else分支里{c.month++;c.day=1;cun=cun-(30-c.day)-1;}这样写是不对的 应该改为{cun=cun-(30-c.day)-1;c.month++;c.day=1;} 不然的话c.day都被你置成1了，你才用当月的最大天数减它，显然得到的结果是不对的

我了个去，加号不是双目运算符么，括号里参数只有一个，即类对象本身加上一个参数，计算结果返回！ 方法：先写两个函数，将日期与一个整数互转，即选定以前的某天为基数，一般是以1970-1-1为第1天。 Date operator+(int b)实际上就可以先将日期转为自基数的天数后，加上参数上的天数，再转回日期就行了。 看看VC里的SystemTimeToVariantTime和VariantTimeToSystemTime。 你所写的方法，实话说，懒得看！


Question: C语言新人求助

#include <stdlib.h> #include <stdio.h>  int _tmain(int argc, _TCHAR* argv[]) { 	char buff[1024] = {0}; 	scanf("%s", buff); 	//输入102.01s10后回车  	for (int i = 0; i < 1024; ++i) 	{ 		if (buff[i] == '0') 		{ 			memmove(buff + i, buff + i + 1, 1024 - i - 1); 		} 	}  	double value = strtod(buff, nullptr); 	//value = 12.100000000000000 	return 0; }   这样好看点

字符串转化为整数 http://blog.csdn.net/zhangxiangdavaid/article/details/25245125

#include<stdio.h> void main()  {  	char str[128] = {0}; 	char buffer[128] = {0};     char *p = str, *q = buffer; 	printf("请输入字符串:"); 	scanf("%s", str); 	while(*p != '\0') 	{ 		if(*p >= '1' && *p <= '9') 			*q++ = *p; 		*p++; 	} 	*q = '\0'; 	printf("转换后结果为:%s\n", buffer); }


Question: 请帮助我解决一个小问题

引用 2 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉  收藏了

太感谢了

将它与0x80做 & 运算


Question: 求助: linux服务器socket read或write 出现errno=5的错误

引用 9 楼 xiaowulai1225 的回复:谢谢大家。问题终于找到了。 原来的代码是这样的（send调用的情况类似）： s32 len = recv( m_socket, data, len, 0 ); // printf("recv = %d\n", len); if( len==-1 && (errno==EAGAIN || errno==EWOULDBLOCK) ) { 	break; } recv/send之后有一行printf，是为了调试而新增的。 进程退到后台执行后，程序调用printf会产生errno=5的错误。 而socket在调用recv返回EAGAIN错误后，因为又调用了printf导致errno被修改了， 导致后面的判断条件认为是socket收发数据异常而断开了连接 所以就出现了上面的情况。 谁让你不紧接在出错函数后获取errno的？活该！！

前面说过后台进程读写终端都会引起SIGTTOU或者SIGTTIN的信号这个是会终止进程的

谢谢两位回复，我在试试看。有其他进度或发现在贴出来

这是我最近测试下来的结果：实际测试在centos 5.8  6.5 和 unbutn 14.04上都会出现。 上面说的在 centos5.8 没有出现是因为那个版本在 send recv  后没有调用到printf。 测试版本因为要确认消息的收发，所以特意加上了log输出。  最终测试发现 只要在 send  recv 后面加上printf ，并且程序这样启动  ./xxxx &  ，那么必然会出现 errno=5的错误； 如果不加 printf，或是 printf改为写文件，或是 程序 nohup ./xxxx & 启动，那么就不会出现errno=5的错误；  哪个大神可以帮忙分析下原因吗？

printf改为fprintf写文件吧。 可能是因为printf导致console上卷时耗时过长影响send和recv的速度。我猜。

后台进程写控制终端产生了SIGTTOU信号。你可以捕捉下看看是否是这样

谢谢！这个意思就是还是因为系统（无论是硬件还是软件）引起的了？

流量限制 水晶头接触不良 机房有人碰了网线 传输内容中有禁词 被黑客攻击 电源不稳 散热有问题 ……

感谢回复！那是说是硬件或是驱动问题引起的？ 因为我同样的版本（代码一样）在 centos 5.8 32位系统上重编运行就没有这种错误。 昨天晚上在有问题的机器上做了下echo的测试，客户端每条发200+字节数据，服务器收到后回包。 上了400个连接，基本几分钟就出现一次，感觉像是这个socket到达了某个流量阈值后被断开。 用来测试的两个机器都是阿里云的服务器，只是所属的位置和版本不一样。

errno5 :   Input/output error errno=5的错误是EIO,表示IO错误 EIO比较棘手，你可能需要查看当时更多的信息。 网卡设备异常，驱动异常啊，硬件出错都可能导致这个问题。


Question: 我是菜鸟  关于链表

printf("请输入原来的姓名："); getchar(); gets(name)； 楼主你这里读进来的name你用到了么？ 你比较的时候也是和Taccept比的, if((strcmp(head2->teach.name, Taccept)==0))

麻烦把代码完整得发一下，楼主。。。。


Question: 为什么保存不了数据进文件

struct a {     int all; }b;  这种东西不需要用结构体。

懂了，谢谢大家

#include<stdio.h> struct a { 	int all; }b; int main() { 	FILE *fp; 	int i=0; 	struct a c[10]; 	fp=fopen("a.txt","wb"); 	c[i].all = 1; 	printf("%d",c[i].all); 	fprintf( fp,"%d", c[i].all ); 	fclose(fp); 	return 0; }

你最后都跑到 ab  二进制读写了 txt 是写入了的， 格式不一样

fp=fopen("a.txt","wb");

其实是写入了文件的（楼主从文件的大小应该也能看出来） LZ这个问题涉及到ASCII码问题，首先你存储时使用的fwrite函数，将你的数据按照函数参数存储后，是以二进制文件格式保存的，你出现的问题是因为你直接当txt文件打开时，他会认为你是文本文件，而文本文件是按照ASCII码存储的，因此他会每8个bit读取一次，并显示对应ASCII码中的字符，就会显示出你那种结果。 楼主可以用以下代码验证：  fp=fopen("a.txt","rb"); fread(&b,sizeof(b),1,fp); printf("\n%d\n",b.all);


Question: 求解

matlab也应该可以单步调试或看Call Stack调试吧。


Question: c语言新人提一个问题，麻烦各位大神帮我看一下

&& || 和！非的逻辑问题，上面答的都很好了，楼主多想想

!(x%5==1&&x%6==5&&x%7==4&&x%11==10)  等价于   (x%5!=1||x%6!=5||x%7!=4||x%11!=10)  注意中间是||

逻辑运算基础:  !(A && B) 等价于 !A || !B  !(A || B) 等价于 !A && !B

你的逻辑应该是同时满足除以5余1，除以6余5，除以7余4，除以11余10时跳出while循环 所以你的while判断条件就应该是(x%5==1&&x%6==5&&x%7==4&&x%11==10)的取反，得到 !(x%5==1&&x%6==5&&x%7==4&&x%11==10) 也可以把取反拿到括号中就变成了x%5!=1 || x%6!=5 || x%7!=4 || x%11!=10

应该是||，就是说有一个不满足就要继续。

逻辑关系没弄清楚，题意是必须4个条件同时满足才能得到要求的数，否则，只要有一个条件不能满足就得不到要求的数，你的条件语句应该改成，x%5!=1 || x%6!=6 || x%7!=4 || x%11!=10

package main import ( 	"fmt" )  //要求：找出一个数，使其除以5余1，除以6余5，除以7余4，除以11余10. func main() { 	n := 0 	for{ 		if(n%5==1 && n%6 == 5 && n%7==4 && n%11==10){ 			fmt.Println(n) 			break; 		} 		n++ 	} }  //2111 希望大家能接触一下golang

上面写的！＝是不等于，下面写的＝＝是等于啊


Question: 数组指针与指针数组的问题

引用 5 楼 qq423399099 的回复:[quote=引用 4 楼 face_t0_sea 的回复:] 第三个 int (*)[3]&pa， 我试了，编译不通过啊？你解释的我也没看懂，帮忙再看看~~~~~~ 加个括号呗，不加括号没那种写法的。。 [/quote]  岂止是加个括号，你厉害 ~~    告诉他写错了不得了

pa[3] is pointers to int        pa is a pointer to int*[3]         int (*)[3]&pa;     incorrect expression

理解和讨论之前请先学会如何观察！  仅供参考：//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]

谢谢各位了，你们太牛了！

引用 4 楼 face_t0_sea 的回复:[quote=引用 3 楼 qq423399099 的回复:] int (*pa[3]) --- 一个含有3个元素的数组,其中每个元素都是指向int数据的指针  int (*pa)[3] --- pa是一个指向数组的指针,所指向的数组含有三个int元素 int (*)[3]&pa --- 可以分两步看，第一步（(*)[3]）声明该变量为一个数组指针，第二步&pa,指向了pa首地址  第三个 int (*)[3]&pa， 我试了，编译不通过啊？你解释的我也没看懂，帮忙再看看~~~~~~[/quote] 加个括号呗，不加括号没那种写法的。。

引用 3 楼 qq423399099 的回复:int (*pa[3]) --- 一个含有3个元素的数组,其中每个元素都是指向int数据的指针  int (*pa)[3] --- pa是一个指向数组的指针,所指向的数组含有三个int元素 int (*)[3]&pa --- 可以分两步看，第一步（(*)[3]）声明该变量为一个数组指针，第二步&pa,指向了pa首地址  第三个 int (*)[3]&pa， 我试了，编译不通过啊？你解释的我也没看懂，帮忙再看看~~~~~~

仔细读完保证你之后见到不再会晕  http://blog.csdn.net/angle_birds/article/details/8991816

指针 http://blog.csdn.net/zhangxiangdavaid/article/details/38085743

定义这么复杂的数据做什么？需要的话， 多 typedef 几次，程序看着清晰

int (*&pa)[3];大概是想这么写的吧 实际上大约应该这么写： int a[4][3]={0}; int(*pa)[3]=a;//数组指针 int(*&rpa)[3] = pa;// 数组指针的引用。

《牛肉干》 C语言上机课，某女同学偷偷吃起牛肉干。 有一粒牛肉干掉到了键盘上，卡在7和8键之间。 女同学就在键盘上抠啊、抠啊、抠啊…… 程序里一行代码变成这个样子： int *pa=&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&*&a; 后来的结局是 ————程序顺利通过编译，运行结果正确！

int(*pa)[3] --->array to pointer  int (*)[3]&pa ---> (array to pointer) of head address


Question: 请问大家如何向github上的开源项目提交自己代码？

谢谢你的回答，非常感谢

1. 先fork一份。 2. 根据需要进行修改。 3. 向原gem发Pull Request， 等待对方响应。（有可能不接受你的修改）


Question: 新手学习求大神帮忙

#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

那句a[11] = k越界了  int a[11]  有效的索引只是0-10

找10个数中的最大数的C#源代码：http://www.manonggu.com/biancheng/328 大家可以看下

引用 20楼_说个笑话纪念我 的回复:[quote=引用 19 楼 sinat_34555918 的回复:] [quote=引用 16楼小灸舞 的回复:][quote=引用 14 楼 sinat_34555918 的回复:] [quote=引用 12楼小灸舞 的回复:]什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼[/quote] 不是这个问题，楼主你真的手抖了，哈哈还抖了两次 1.int a[11];写成了int a[1]; 2.else分支里 printf("%d ", a[j]);写成了printf("%d ", &a[j]);[/quote]VC6.0有毒？换个编译器用!=也可以了[/quote]  反正我也是新手，用vs2015，自动排版都不用下插件。。。[/quote]VS2015更新过CRT函数 好多都改了用起来有点麻烦 不过自动排版确实很方便

引用 15 楼 sinat_34555918 的回复:引用 13楼赵4老师 的回复:其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。你在说啥 解释越界访问为什么不报错。

引用 18 楼 sinat_34555918 的回复:[quote=引用 16楼小灸舞 的回复:][quote=引用 14 楼 sinat_34555918 的回复:] [quote=引用 12楼小灸舞 的回复:]什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼[/quote] 不是这个问题，楼主你真的手抖了，哈哈还抖了两次 1.int a[11];写成了int a[1]; 2.else分支里 printf("%d ", a[j]);写成了printf("%d ", &a[j]);[/quote]想再请教一下为什么第二个判断要用 if(k<a[i])而不能用if(k!=a[i]) 我用不等于来做的话就不执行第一个判断了直接进行第二个判断 还有k<a[i]是啥原理啊我没搞懂[/quote]  感觉用小于不完整。如果是1 2 3 4 5 6 7 8 9 10    输入100就直接跳过了，不过他思路给出了，改一改就行了

引用 17 楼 sinat_34555918 的回复:[quote=引用 16楼小灸舞 的回复:][quote=引用 14 楼 sinat_34555918 的回复:] [quote=引用 12楼小灸舞 的回复:]什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼[/quote] 不是这个问题，楼主你真的手抖了，哈哈还抖了两次 1.int a[11];写成了int a[1]; 2.else分支里 printf("%d ", a[j]);写成了printf("%d ", &a[j]);[/quote]woc 丢人丢大了[/quote]  感觉用小于不完整。如果是1 2 3 4 5 6 7 8 9 10    输入100就直接跳过了

引用 19 楼 sinat_34555918 的回复:[quote=引用 16楼小灸舞 的回复:][quote=引用 14 楼 sinat_34555918 的回复:] [quote=引用 12楼小灸舞 的回复:]什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼[/quote] 不是这个问题，楼主你真的手抖了，哈哈还抖了两次 1.int a[11];写成了int a[1]; 2.else分支里 printf("%d ", a[j]);写成了printf("%d ", &a[j]);[/quote]VC6.0有毒？换个编译器用!=也可以了[/quote]  反正我也是新手，用vs2015，自动排版都不用下插件。。。

引用 4楼小灸舞 的回复: #include<stdio.h> void main() { 	int a[11]; 	int i, j, k , t; 	a[10] = 0; 	printf("请输入10个数:\n"); 	for(i = 0; i < 10; i++) 		scanf("%d", &a[i]); 	for(j = 0; j < 9; j++) 	{ 		for(i = 0; i < 9 - j; i++) 			if(a[i] > a[i + 1]) 			{ 				t = a[i]; a[i] = a[i + 1]; a[i + 1] = t; 			} 	} 	printf("请输入1个数:\n"); 	scanf("%d", &k); 	for(i = 0; i < 10; i++) 	{ 		if(k == a[i]) 		{ 			for(j = i; j < 9; j++) 				a[j] = a[j + 1]; 			printf("found\n"); 			printf("排序后为:\n"); 			for(j = 0; j < 9; j++) 				printf("%d ", a[j]); 			break; 		} 		else if(k < a[i]) 		{ 			for(j = 9; j >= i; j--) 				a[j + 1] = a[j]; 			a[i] = k; 			printf("not found\n"); 			printf("插入后为:\n"); 			for(j = 0; j < 11; j++) 				printf("%d ", a[j]); 			break; 		} 	} 	printf("\n"); }  找到了该元素，删除后：  没有该元素,添加后： 为什么我的会这样

引用 1 楼 yuelengdihai 的回复:int a[11]；最大才是a[10] 哪来的a[11]啊 多开一个元素是为了放可能要插入的元素的

引用 1 楼 yuelengdihai 的回复:int a[11]；最大才是a[10] 哪来的a[11]啊 int a[];

int a[11]；最大才是a[10] 哪来的a[11]啊

引用 16楼小灸舞 的回复:[quote=引用 14 楼 sinat_34555918 的回复:] [quote=引用 12楼小灸舞 的回复:]什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼[/quote] 不是这个问题，楼主你真的手抖了，哈哈还抖了两次 1.int a[11];写成了int a[1]; 2.else分支里 printf("%d ", a[j]);写成了printf("%d ", &a[j]);[/quote]VC6.0有毒？换个编译器用!=也可以了

引用 16楼小灸舞 的回复:[quote=引用 14 楼 sinat_34555918 的回复:] [quote=引用 12楼小灸舞 的回复:]什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼[/quote] 不是这个问题，楼主你真的手抖了，哈哈还抖了两次 1.int a[11];写成了int a[1]; 2.else分支里 printf("%d ", a[j]);写成了printf("%d ", &a[j]);[/quote]想再请教一下为什么第二个判断要用 if(k<a[i])而不能用if(k!=a[i]) 我用不等于来做的话就不执行第一个判断了直接进行第二个判断 还有k<a[i]是啥原理啊我没搞懂

引用 16楼小灸舞 的回复:[quote=引用 14 楼 sinat_34555918 的回复:] [quote=引用 12楼小灸舞 的回复:]什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼[/quote] 不是这个问题，楼主你真的手抖了，哈哈还抖了两次 1.int a[11];写成了int a[1]; 2.else分支里 printf("%d ", a[j]);写成了printf("%d ", &a[j]);[/quote]woc 丢人丢大了

引用 14 楼 sinat_34555918 的回复:[quote=引用 12楼小灸舞 的回复:]什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼[/quote] 不是这个问题，楼主你真的手抖了，哈哈还抖了两次 1.int a[11];写成了int a[1]; 2.else分支里 printf("%d ", a[j]);写成了printf("%d ", &a[j]);

引用 12楼小灸舞 的回复:什么鬼？楼主用的啥编译器？ 学校要求用VC6.0我知道很老了 可是我也没办法啊 好多东西在VC6.0上都运行不出来 现在很是头疼


Question: 握手菜鸟，关于链表排序，急需大神，

引用 2 楼 user-3 的回复:链表排序不用交换数据，只要交换链接次序就行了   完美解决

仅供参考：//不带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的单链表:",N);//创建N个节点的单链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             p=q;         }     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=3;     v=5;     printf("将值为%d的结点插入到单链表的第%d个结点前:",v,k);//将值为v的结点插入到单链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=5;             q->next=head;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=5;                 q->next=p->next;                 p->next=q;                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 if (q) {                     p->next=q->next;                     free(q);                 }                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      printf("从小到大排序:");//从小到大排序     for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {         for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个单链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         n++;         s=s->next;     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head=p;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      m=4;     n=6;     printf("将单链表中前%d个结点和后%d个结点进行互换:",m,n);//将单链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;         }         s=p;         p=p->next;     }     q1=head;     head=q->next;     s->next=q1;     q->next=NULL;      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //创建10个节点的单链表:08->74->07->23->03->99->31->56->88->16-> //将值为5的结点插入到单链表的第3个结点前:08->74->05->07->23->03->99->31->56->88->16-> //删除第5个节点:08->74->05->07->03->99->31->56->88->16-> //从小到大排序:03->05->07->08->16->31->56->74->88->99-> //将整个链表逆序:99->88->74->56->31->16->08->07->05->03-> //将单链表中前4个结点和后6个结点进行互换:31->16->08->07->05->03->99->88->74->56-> //

/*有两种方法,一种是删除再插入,另一种是改变指针指向*/  /*删除再插入*/ #include "stdio.h" #include "stdlib.h" struct node {     int data;     struct node *next; }; typedef struct node NODE; #define MAL (NODE *)malloc(sizeof(NODE)) NODE *creat_link(void) {     NODE *head,*s,*r;     r=head=MAL;     s=MAL;     printf("Please input data:");     scanf("%d",&s->data);     while(s->data!=-1)     {         r->next=s;         r=s;         s=MAL;         scanf("%d",&s->data);     }     r->next=NULL;     return head; } void print_link(NODE *head) {     if(head->next==NULL)         printf("This is null link!");     else         for(head=head->next;head!=NULL;head=head->next)             printf("%d ",head->data); } NODE *sort_link(NODE *head)/*排序函数*/ {     NODE *temp1,*temp2,*q,*p;     for(q=head;q->next!=NULL;q=q->next)         for(p=q->next;p->next!=NULL;p=p->next)         {             if(p->next->data<q->next->data)                 if(q->next==p)                 {                     temp1=p->next;                     p->next=p->next->next;                     temp1->next=q->next;                     q->next=temp1;                     p=temp1;                 }                 else                 {                     temp1=p->next;                     temp2=q->next;                     p->next=p->next->next;                     q->next=q->next->next;                     temp1->next=q->next;                     q->next=temp1;                     temp2->next=p->next;                     p->next=temp2;                 }         }     return head; } int main(void) {     NODE *head;     head=creat_link();     print_link(head);     head-sort_link(head);     printf("\n");     print_link(head);     return 0; } /*END*/ /*改变指针指向*/ #include "stdio.h" #include "stdlib.h" struct node {     int data;     struct node *next; }; typedef struct node NODE; #define MAL (NODE *)malloc(sizeof(NODE)) NODE *creat_link(void) {     NODE *head,*s,*r;     r=head=MAL;     s=MAL;     printf("Please input data:");     scanf("%d",&s->data);     while(s->data!=-1)     {         r->next=s;         r=s;         s=MAL;         scanf("%d",&s->data);     }     r->next=NULL;     return head; } void print_link(NODE *head) {     if(head->next==NULL)         printf("This is null link!");     else         for(head=head->next;head!=NULL;head=head->next)             printf("%d ",head->data); } NODE *sort_link(NODE *head) {     NODE *temp,*q,*p;     for(q=head;q->next!=NULL;q=q->next)         for(p=q->next;p->next!=NULL;p=p->next)         {             if(p->next->data<q->next->data)                 if(q->next==p)                 {                     temp=p->next;                     p->next=p->next->next;                     temp->next=p;                     q->next=temp;                     p=temp;                 }                 else                 {                     temp=p->next;                                 p->next=q->next;                                 q->next=temp;                                 temp=p->next->next;                                 p->next->next=q->next->next;                                 q->next->next=temp;                 }         }     return head; } int main(void) {     NODE *head;     head=creat_link();     print_link(head);     head-sort_link(head);     printf("\n");     print_link(head);     return 0; }

链表排序不用交换数据，只要交换链接次序就行了


Question: 关于return 0的问题

出现警告是因为这个函数必须有返回值，而你的代码不是所有条件分枝都有返回值。 char类型函数返回0页是正常的，char类型数据和int类型数据一样，也是一个数，只是char数据长度是1个字节，而int数据长度至少是2个字节。

int main()的return 0是和操作系统的约定，操作系统调用你的程序，你的程序从main运行，从main结束，main return 0表示告诉系统你的程序正常退出，return 1表示你的程序异常退出，1是异常的号码。操作系统可以利用这个return值来做事。 至于你自定义的函数的返回值你可以自己设定，通过返回值来进行一些不同的处理

你自定义的返回值代表什么含义要由有你自己来决定。  用 "return 0; 表示成功" 仅仅是C的编程的一个古老的约定。 在C的传统中，当声明函数返回类型为int 时(比如 int foo(...); ), 如果该返回值不是某个计算的结果，那么往往是指err_code， 其中，0 表示 NO_ERROR。

返回值为char，return 0;可以的，返回值为0x00的char变量 函数的返回值，是调用者使用的，意义完全在于函数设计者和调用者怎么约定。 main函数的返回值是系统在调用，约定的0为成功，这个没法改的。其他自定义函数可以按照需要约定

引用 1 楼 yuelengdihai 的回复:int main()决定了返回值为int （1或0） 看错了  50行那个return 0； 其实0和'\0'值是一样的 这里的0也就是字符‘\0'  是正常结束，函数返回值是'\0'

int main()决定了返回值为int （1或0）


Question: C语言怎么实现指定字符串在txt文本文件出现的次数，所在行列

引用 7 楼 mwj8686 的回复:引用用strstr查找啊，然后把找到的结果字符串指针减去该行字符串的首字符就是在这行的位置（也就是列的位置） 如果一行有多个所查找字符串呢？  放到循环里，每次查找后将起点移动到上一次查找到的字符串后面，一直到找不到为止，就可以统计出出现的次数了  strstr的返回值就是最先找到的字符串的开头，如果找不到则返回NULL

引用 7 楼 mwj8686 的回复:引用用strstr查找啊，然后把找到的结果字符串指针减去该行字符串的首字符就是在这行的位置（也就是列的位置） 如果一行有多个所查找字符串呢？ 那你就这样干：  #include <stdio.h> #include <string.h> int main(void){    char *str="zxabczxdefzxghi";    char *findstr = "zx";    char *p = str;    int times = 0;    while(p = strstr(p, findstr)){       p = p + strlen(findstr);       times++;    }    printf("\"%s\" occurs %d times in \"%s\"\n", findstr, times, str);    return 0; } //"zx" occurs 3 times in "zxabczxdefzxghi"

可以把文件全部读入，用strstr循环查找以确定出现的总次数

引用看楼主是用哪种方式查找的了 如果是string的find_first_of可以直接得到所在列 char *strstr什么的要自己减一下 要用c语言，不是c++

2楼的真不懂

仅供参考：#include <stdio.h> #include <string.h> char s[256]; char *p; int r,n,i; int main() {     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //


Question: 为什么fopen打不开文件呢？

引用 11 楼 paschen 的回复:[quote=引用 6 楼 sinat_29288207 的回复:] [quote=引用 2 楼 qq423399099 的回复:] 第一种方法：楼主这种，直接放在DEBUG目录下不行的，程序不会搜索那个目录（除非你配置过这个目录） 可以放到工程文件所在目录（.vcxproj或者.cpp等源文件的这个目录下） 第二种方法：写上filepath.txt的完整路径  我试过完整路径也不行好像[/quote]  路径中的 \  有没有写成 \\[/quote] 我试了  也不行啊 #include<stdio.h> int main() { 	FILE *fp; 	fp=fopen("c:\\rap.txt","r"); 	if(fp==NULL) 		printf("\a文件打开失败。\n"); 	else{ 		fclose(fp); 	} 	return(0); }

引用 6 楼 sinat_29288207 的回复:[quote=引用 2 楼 qq423399099 的回复:] 第一种方法：楼主这种，直接放在DEBUG目录下不行的，程序不会搜索那个目录（除非你配置过这个目录） 可以放到工程文件所在目录（.vcxproj或者.cpp等源文件的这个目录下） 第二种方法：写上filepath.txt的完整路径  我试过完整路径也不行好像[/quote]  路径中的 \  有没有写成 \\

极有可能是路径、路径、路径不对！

用 wb  看你文件写在哪了

写一个函数，将相对路径转换为绝对路径。

引用 6 楼 sinat_29288207 的回复:[quote=引用 2 楼 qq423399099 的回复:] 第一种方法：楼主这种，直接放在DEBUG目录下不行的，程序不会搜索那个目录（除非你配置过这个目录） 可以放到工程文件所在目录（.vcxproj或者.cpp等源文件的这个目录下） 第二种方法：写上filepath.txt的完整路径  我试过完整路径也不行好像[/quote] 贴一下你完整路径的那行代码，放在工程目录下试过吗？

引用 2 楼 qq423399099 的回复:第一种方法：楼主这种，直接放在DEBUG目录下不行的，程序不会搜索那个目录（除非你配置过这个目录） 可以放到工程文件所在目录（.vcxproj或者.cpp等源文件的这个目录下） 第二种方法：写上filepath.txt的完整路径  我试过完整路径也不行好像

如果你是在调试程序，程序的当前路径并不是EXE所在文件夹，而是工程那个文件夹  另外打开失败可以检查fopen返回值以确定具体原因：http://en.cppreference.com/w/c/io/fopen

_getcwd, _wgetcwd Get the current working directory.  char *_getcwd( char *buffer, int maxlen );  wchar_t *_wgetcwd( wchar_t *buffer, int maxlen );  Routine Required Header Compatibility  _getcwd <direct.h> Win 95, Win NT  _wgetcwd <direct.h> or <wchar.h> 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 a pointer to buffer. A NULL return value indicates an error, and errno is set either to ENOMEM, indicating that there is insufficient memory to allocate maxlen bytes (when a NULL argument is given as buffer), or to ERANGE, indicating that the path is longer than maxlen characters.  Parameters  buffer  Storage location for path  maxlen  Maximum length of path in characters: char for _getcwd and wchar_t for _wgetcwd  Remarks  The _getcwd function gets the full path of the current working directory for the default drive and stores it at buffer. The integer argument maxlen specifies the maximum length for the path. An error occurs if the length of the path (including the terminating null character) exceeds maxlen. The buffer argument can be NULL; a buffer of at least size maxlen (more only if necessary) will automatically be allocated, using malloc, to store the path. This buffer can later be freed by calling free and passing it the _getcwd return value (a pointer to the allocated buffer).  _getcwd returns a string that represents the path of the current working directory. If the current working directory is the root, the string ends with a backslash ( \ ). If the current working directory is a directory other than the root, the string ends with the directory name and not with a backslash.  _wgetcwd is a wide-character version of _getcwd; the buffer argument and return value of _wgetcwd are wide-character strings. _wgetcwd and _getcwd behave identically otherwise.  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tgetcwd _getcwd _getcwd _wgetcwd    Example  // GETCWD.C /* This program places the name of the current directory in the   * buffer array, then displays the name of the current directory   * on the screen. Specifying a length of _MAX_PATH leaves room   * for the longest legal path name.  */  #include <direct.h> #include <stdlib.h> #include <stdio.h>  void main( void ) {    char buffer[_MAX_PATH];     /* Get the current working directory: */    if( _getcwd( buffer, _MAX_PATH ) == NULL )       perror( "_getcwd error" );    else       printf( "%s\n", buffer ); }   Output  C:\code   Directory Control Routines  See Also   _chdir, _mkdir, _rmdir     _chdir, _wchdir Change the current working directory.  int _chdir( const char *dirname );  int _wchdir( const wchar_t *dirname );  Routine Required Header Optional Headers Compatibility  _chdir <direct.h> <errno.h> Win 95, Win NT  _wchdir <direct.h> or <wchar.h> <errno.h> 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 a value of 0 if successful. A return value of –1 indicates that the specified path could not be found, in which case errno is set to ENOENT.  Parameter  dirname  Path of new working directory  Remarks  The _chdir function changes the current working directory to the directory specified by dirname. The dirname parameter must refer to an existing directory. This function can change the current working directory on any drive and if a new drive letter is specified in dirname, the default drive letter will be changed as well. For example, if A is the default drive letter and \BIN is the current working directory, the following call changes the current working directory for drive C and establishes C as the new default drive:  _chdir("c:\\temp");  When you use the optional backslash character (\) in paths, you must place two backslashes (\\) in a C string literal to represent a single backslash (\).  _wchdir is a wide-character version of _chdir; the dirname argument to _wchdir is a wide-character string. _wchdir and _chdir behave identically otherwise.  Generic-Text Routine Mapping:  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tchdir _chdir _chdir _wchdir    Example  /* CHGDIR.C: This program uses the _chdir function to verify  * that a given directory exists.  */  #include <direct.h> #include <stdio.h> #include <stdlib.h>  void main( int argc, char *argv[] ) {    if( _chdir( argv[1] )   )       printf( "Unable to locate the directory: %s\n", argv[1] );    else       system( "dir *.wri"); }   Output   Volume in drive C is CDRIVE  Volume Serial Number is 0E17-1702   Directory of C:\write  04/21/95  01:06p                 3,200 ERRATA.WRI 04/21/95  01:06p                 2,816 README.WRI                2 File(s)          6,016 bytes                              71,432,116 bytes free   Directory Control Routines  See Also   _mkdir, _rmdir, system

VS调试时，程序的当前路径是工程路径！并不是exe所在的目录

这个只是我打开文件的小函数，fclose在main函数里面


Question: 去大神帮我看看哪里出问题了！！！

运行时     是提示.exe出现问题     win7系统

已经把上面那个程序的注释贴上来了  求各位大神看看到底问题在哪。。。。。。。。

把先前定义的结构体贴上来 typedef struct ldpc_node{ 	int degree; 	int *pass_node; 	int *pass_edge; 	double *output_message; }node;//节点的结构体，degree表示节点的度（决定一个节点有几个pass_node和pass_edge；如此例中variable_node的degree就是2，所以每个variable_node会有两个pass_node和两个pass_edge）；pass_node和pass_edge实质是一种坐标，可以从txxt中读进去pass_node，pass_edge要从pass_node转换；  struct decode{ 	double *receive_code; 	int *output_code; 	node *variable_node; 	node *check_node; 	int check_num; 	int variable_num; };//variable_node和check_node分别是上面那个结构体中的两个节点，check_num表示check_node的个数，同理variable_num表示variable_node的个数。  我这边把这个variable_node的pass_node读进来了！现在想把pass_node转换成pass_edge。  这地方函数名 void ini(decode *ldpc_decode)//形参就是上面第二个结构体；  定义一个当前节点node *current_node; / /上面第一个结构体 for (i = 0; i < ldpc_decode->variable_num; i++) //i小于变量节点的个数 { current_node = ldpc_decode->variable_node + i; //当前节点为ldpc_decode的variable_node for (j = 0; j < current_node->degree; j++)  //j小于当前节点的度 { *(current_node->pass_node + j) = Read_Num(fp);  //把当前这个节点也就是variable_node的pass_node读进来 } }  现在就是总共有6个variable_node，每个variable_node会读进去两个pass_node（也就是上面说的每个variable_node的degree为2），比如我读进去的所有的pass_node是1 4 ；2 4； 1 3 ；3 4 ；2 3 ；1 2       所有的pass_node从前往后看，第一次出现这个数就标记为1，第二次出现就标记为2，以此类推。  所以转换后的pass_edge就是1 1 ；1 2； 2 1； 2 3； 2 3； 3 3  我的想法就是把这所有的pass_node读到一个数组里去，然后把数组的最后一个数一次和前面每个数比较，出现相同的就加一，用另一个数组保存这个新的结果，再把数组的结果读到pass_edge里去。  下面就是转换过程，求大神帮我看看有什么问题，现在就是运行不了，也没报错。。。。。。   定义4个指针，并分别分配空间。因为要用这个4个指针操作pass_node和pass_edge，所以分配的空间是variable_num(variable_node的个数)*variable_node的degree。   a = (int*)malloc((ldpc_decode->variable_node->degree*ldpc_decode->variable_num)*sizeof(int)); if (a == NULL) { printf("memory allocation failure!\n"); exit(1); }  b = (int*)malloc((ldpc_decode->variable_node->degree*ldpc_decode->variable_num)*sizeof(int)); if (b == NULL) { printf("memory allocation failure!\n"); exit(1); }  for (i = 0; i < ldpc_decode->variable_num; i++) //i小于variable_node的个数 { current_node = ldpc_decode->variable_node + i; //当前节点为ldpc_decode的variable_node for (j = 0; j < current_node->degree; j++)  //j小于当前节点的degree { a[(i*current_node->degree) + j] = *(current_node->pass_node + j); //把刚才读进去的variable_node的pass_node存到a里面 } }   for (i = 0; i < (ldpc_decode->variable_num*ldpc_decode->variable_node->degree); i++) { b[i] = 1;  //令b的每个值都为1 }  for (i = (ldpc_decode->variable_num*ldpc_decode->variable_node->degree) - 1; i >= 0; i--) { for (j = i - 1; j >= 0; j--) { if (a[i] - a[j] == 0)   //从a的最后一个元素开始，往前对比，发现相同的用b来加一，一直进行到a的第一个元素 b[i] += 1; } }  for (i = 0; i < ldpc_decode->variable_num; i++) { current_node = ldpc_decode->variable_node + i; for (j = 0; j < current_node->degree; j++) { *(current_node->pass_edge + j) = b[(i*current_node->degree) + j];  //把刚才的b转到要转换的variable_node的pass_edge里 } }

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

楼主最好加点注释，略难看懂

在线等大神。。。。。。。


Question: 怎样用C语言实现客户端随时收到服务器的数据

大神，你好。可不可以借你的代码我参考参考。我就要交作业了，对网络编程还没有很熟悉。感激不尽

引用 5 楼 huang5hun 的回复:[quote=引用 1 楼 face_t0_sea 的回复:] 先去学习下socket通信吧 嗯嗯！搞定了！用两个进程就行了！然后用管道传递数据！用signal传递信号！就可以了！[/quote] 提醒：加必要的日志以备未来出错时好调试。

引用 1 楼 face_t0_sea 的回复:先去学习下socket通信吧 嗯嗯！搞定了！用两个进程就行了！然后用管道传递数据！用signal传递信号！就可以了！

引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 huang5hun 的回复:] [quote=引用 1 楼 face_t0_sea 的回复:] 先去学习下socket通信吧 嗯嗯！搞定了！用两个进程就行了！然后用管道传递数据！用signal传递信号！就可以了！[/quote] 提醒：加必要的日志以备未来出错时好调试。  [/quote] 嗯嗯！谢谢！我会注意的！

引用 楼主 huang5hun 的回复:小弟最近想写出一个软件，苦于不知道该怎样实现客户端随时收到来自服务器的数据。还望大神们帮帮忙！  我就是用socket编写的，但是我想让他在后台服务，也就是怎样做成守护进程那样子？

引用 1 楼 face_t0_sea 的回复:先去学习下socket通信吧  我就是用socket编写的，但是我想让他在后台服务，也就是怎样做成守护进程那样子？

嗯，不是用socket吗

先去学习下socket通信吧


Question: C语言链表输出为什么是倒序？

引用 6 楼 saberbeats 的回复:[quote=引用 4 楼 face_t0_sea 的回复:] p->next = head->next;   head->next=p; 每次都是把新建的节点插入到head的后边。 我的代码就是这样的啊[/quote] 恩，是啊，你的链表就是和输入反着的啊，倒着连接的啊。最新的永远在第一个，其他挪到后边了。

引用 4 楼 face_t0_sea 的回复:p->next = head->next;   head->next=p; 每次都是把新建的节点插入到head的后边。 我的代码就是这样的啊

引用 3 楼 paschen 的回复:因为你的链表添加元素时，是先分配空间，然后给该元素赋值，然后让该元素的next指向原来的链表，所以输出时顺序是反的 难道只不是一般的给链表结点数据的方法吗？ 一般应该怎样赋值啊能举个例子吗？

好的，谢谢，我用尾插法做

因为你用的是头插法插入的节点，所以输出的元素是倒序的


Question: 关于while能否正常判断

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

去掉的话就少去了判断输入的x为1位数的情况

如果你的x值为0，不去的话与去掉不同，如果x大于0，那效果是一样的 去与不去取决于你代码想实现什么

代码是求输入整数是几位数的，只去掉循环外的x＝／10 ，会导致结果比实际多一位； 把循环外的n++, 和 x＝／10  都去掉，会导致输入0的结果是0位数。所以，都不能去掉！

1，去掉和不去掉判断条件不一样了   2，x＝／10；说明x大于10的时候while里面才执行

感觉对于大于0的输入，去掉while前的两句和不去掉结果都是一样的 唯一的区别应该是输入0的时候，如果去掉while前的两句那么得到的答案是0，而不去掉得到的是1


Question: 关于自增自减问题的提问，望各位大神解答！

引用 12 楼 min-min的回复:百度下“系列点”，就知道c标准里未规定这种语句执行先后顺序的标准，因此各编译器按自己的优化顺序做，得到不同的结果。不建议使用这类语句。 谢谢你！让积累了经验

这是一个不确定行为，涉及到顺序点，所以不要写这种语句，结果可能因编译器不同而不同  参看：关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

这问题倒真是不好说啊

引用 3 楼 小灸舞的回复:不同的编译器结果很有可能不同，C99没有规定  所以每个编译器会按自己的优化方式编译   比如我用VS打印的结果就是15,24,8,8 嗯嗯，谢谢指教，我也实践过了，果然不一样

引用 2 楼 sdghchj的回复:但是，各编译器对这种复杂的自增自减表达式处理顺序还是有区别的，所以不建议写这样的表达式，尤其是跨平台代码，会得到不同的结果。慎重。 嗯嗯，谢谢回帖，今天我又用别的编译器编译了，结果果然不同

引用 1 楼 sdghchj的回复:q = 7 + 7 + 8 = 22. 先算前面的加法，加法前先自增2次，a变为7。 a是加了两次得7，但是q是由b经(++b)+(++b)+(++b)得到啊！应该是6+7+8=21

因为一向不会算这些东西，所以我一直说，少弄这些比较虚的。


Question: 关于C语言函数参数问题

另  直接传参 会复制一个副本，而不是用形参

指针即地址 引用即别名

比如： int x=3,y=5;  如果定义一个swap(int *a,int *b)函数，参数是指针，调用的时候要写： swap(&x,&y);	//形参是指针，实参为变量地址  如果定义一个swap(int &a,int &b)函数，参数是引用，调用的时候要写： swap(x,y);

指针传递参数本质上是值传递的方式，它所传递的是一个地址值。值传递过程中，被调函数的形式参数作为被调函数的局部变量处理，即在栈中开辟了内存空间以存放由主调函数放进来的实参的值，从而成为了实参的一个副本。值传递的特点是被调函数对形式参数的任何操作都是作为局部变量进行，不会影响主调函数的实参变量的值。 （换句话来说，指针传递只能修改指针所指向的内存区域的值，而不能改变指针的指向） 而在引用传递过程中，被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间，但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址，即通过栈中存放的地址访问主调函数中的实参变量。正因为如此，被调函数对形参做的任何操作都影响了主调函数中的实参变量。

C语言没有引用 ，第二种写法，不合法。

一个是指针，一个是引用


Question: 关于c语言

那样的b是临时变量

你用数组作为实参传入setValue，该参数自动退化为指针了 你要给b赋值的话 应该用b[index]的形式或者*b的形式 传一级指针只能改变指针所指向区域的值，你想让b指向a的内存区域的话(并且在main函数里也起作用)必须要传二级指针

引用 2 楼 u014737253 的回复:b数组不应该是指向a数组吗？我的目的是想把整个a数组存入b数组，做个备份  把a数组值放入b数组，不能叫b指向a，注意指针的概念。 你的让b指向a，也只在你的setValue函数里生效，b只是函数里的临时指针变量。出了函数，又回到原来的地址了。

b数组不应该是指向a数组吗？我的目的是想把整个a数组存入b数组，做个备份

b=a; 把b数组地址变为a数组了，b数组已经不存在。 你的目的应该是b[index] = a [index];