Question: 输入10个数，找出其中绝对值最小的数，将它和最后一个数交换，然后输出这10个数     怎么不输出交换后的数组

引用 2 楼 zhao4zhong1 的回复:m=a[n]; a[n]=a[8]; a[8]=m;  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？赵老师，引个题外话，http://bbs.csdn.net/topics/391044546 以前在c/c++论坛经常看到你，转了java之后，现在有回c/c++板块。诚心请教java转mfc问题！

for(i=1;i<10;i++) { if(abs(a[i])<min) min=abs(a[i]); n=i; }  你这个if后面的两句代码是不是要{}呢

楼上看错了吧，程序没有差1的问题，是if(abs(a[i])<min)后面没有加{},导致n每次都被赋值，或者改为 if(abs(a[i])<min) min=abs(a[i])，n=i;

为什么都不好好贴代码呢？  #include<stdio.h> #include<stdlib.h> int main() { 	int a[10]; 	int min, i, m, n; 	for (i = 0; i < 10; i++) scanf("%d", &a[i]); 	min = abs(a[0]); 	n = 0; 	for (i = 1; i < 10; i++) 	{ 		if (abs(a[i]) < min) 		{ 			min = abs(a[i]); 			n = i; 		} 	} 	m = a[n]; 	a[n] = a[9]; 	a[9] = m; 	for (i = 0; i < 10; i++) printf(" %d", a[i]); 	return 0; } // 1 2 3 0 4 5 6 7 8 9 // 1 2 3 9 4 5 6 7 8 0

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


Question: c语言 有关全局变量的疑惑

哈哈 java或者c#过来的吧

C语言里没有private修饰符。  建议楼主找找C11看看。  学C语言，要从基本词汇（关键字）和语法学起

应该是从java或者c#转来的？ java和c#都是纯面向对象的，定义的全局变量本身也是类的一个成员变量，所以可以用private c语言不是面向对象的，c程序不是一个类，也没有private关键字。

c语言关键字中没有private，将其去掉就可以了

嗯，C语言中不存在所谓的private关键字，C++有，但是不是用在这里的。 全局变量的什么方法就是在全局命名空间声明一个变量，简单的说就是在所有函数的外部声明。 除此之外，如果想声明作用域文整个文件而连接性为内部的变量，那么需要在文件内的所有函数外声明，并且使用关键字static。 拥有内部连接的全局变量的意思就是：在这个文件内部的所有部分，这个变量都可见（排除被局部变量覆盖的情况），而在这个文件的外部，这个变量是不存在的。 也就是说如果你打算为一个组织在一个文件中的模块定义一个全局的变量，而不希望与其他文件中重名的变量冲突，那么在定义需要使用关键字static。

lz应该花点时间看下C语言语法基础

去掉private就对了

private 是 C++ 类成员的属性，全局变量显然是不属于类的。  引用 楼主 BugAndError 的回复:#include<stdio.h> private int index;  int main(){     index = 0;     printf("%d",index); }    为什么上面的代码不能编译通过，C语言的全局变量难道不是这么申明的吗？求大神赐教！

# define private

不严格意义的讲 C语言有32个关键字 auto 局部变量（自动储存） break无条件退出程序最内层循环 case   switch语句中选择项 char单字节整型数据 const定义不可更改的常量值 continue中断本次循环，并转向下一次循环 default switch语句中的默认选择项 do  用于构成do.....while循环语句 double定义双精度浮点型数据 else构成if.....else选择程序结构 enum枚举 extern在其它程序模块中说明了全局变量 float定义单精度浮点型数据 for构成for循环语句 goto构成goto转移结构 if构成if....else选择结构 int基本整型数据 long长整型数据 registerCPU内部寄存的变量 return用于返回函数的返回值 short短整型数据 signed有符号数 sizoef计算表达式或数据类型的占用字节数 static定义静态变量 struct定义结构类型数据 switch构成switch选择结构 typedef重新定义数据类型 union联合类型数据 unsigned定义无符号数据 void定义无类型数据 volatile该变量在程序中执行中可被隐含地改变 while用于构成do...while或while循环结构  并没有你写的private  C++中有这个关键字  这种调试环境 会报语法错误 你可以仔细看看报的什么错误 在决定你是否要问这个问题。

private 是什么意思


Question: 结构化程序设计方法

一般使用牛顿法逼近。。

可以先找到一种“算法”，比如： 假定x ^ 2 = n; 然后不断尝试x，比如： n = 5 x = 1 小了，不对 x = 2 小了，不对 x = 3 大了，不对 x = 2.5 大了，不对 …… 如此反复，找到“精度”允许范围内最接近的值。  找到根号n的数学展开式，用语言实现。

搜“竖式求平方根”


Question: 如何用C标准库画图

C标准肯定不会有绘图的东西额，它不属于语言的范畴。它属于窗口系统的范畴。一般都是基于x11的开发库。如果想用c写界面，推荐使用GTK

你画图只是想生成一张图片还是希望在程序中显示到屏幕上 如果是显示到屏幕上在windows下用GDI就可以绘制了，高效高级一点的可以directX或者OpenGL 如果只要生成图片，那么你可以按每个点一个int数字的方式组织号内存，用jpg库，png库编码，或者直接保存bmp格式

c语音里画图函数很多，比如circle,line。

c标准库里没有图形库  你要在显示器上画图，就必须经过系统---因为是系统把硬件结合起来的  所以我们不会把图形库嵌到c标准里  因为c是跨平台的  你嵌个图形库 不就只能在特定的系统上跑了吗？

Non-ANSI/ISO Libraries

推荐使用opencv或opengl 简单的图片也可以自己按着图片的文件格式自己用c语言写，如bmp格式的，就是工作量太大

C标准库中没有图形函数  图形都跟环境有关

仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <windows.h> HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND   hwnd;     HDC    hdc;     HFONT  hfont;     RECT   rect,wsize;     HBRUSH hbrush;     int    y,x,d,g;      system("color F0");     system("cls");     HideTheCursor();     hwnd  =GetConsoleWindow();     GetClientRect(hwnd,&wsize);     hdc   =GetDC(hwnd);     hfont =CreateFont(48,0,0,0,0,0,0,0,0,0,0,0,0,"华文楷体");     hbrush=CreateSolidBrush((COLORREF)0x00FFFFFF);     SelectObject(hdc,hfont);     y=10;x=30;d=4;g=3;     while (1) {         rect.left=x;         rect.top=y;         rect.right=x+300+d+1;         rect.bottom=y+60+d+1;         FillRect(hdc, &rect, hbrush);         TextOut(hdc,x+10,y+10,"地球人都知道！",14);         MoveToEx(hdc,x+5,y+5,NULL);         LineTo(hdc,x+300,y+  5);         LineTo(hdc,x+300,y+ 60);         LineTo(hdc,x+  5,y+ 60);         LineTo(hdc,x+  5,y+  5);         Sleep(15);         if (_kbhit()) {getch();break;}         switch (g) {         case 0:if (y>                d) y-=d; else g=2;if (x>                d) x-=d; else g=1;break;// ↖         case 1:if (y>                d) y-=d; else g=3;if (x<wsize.right-300-d) x+=d; else g=0;break;// ↗         case 2:if (y<wsize.bottom-60-d) y+=d; else g=0;if (x>                d) x-=d; else g=3;break;// ↙         case 3:if (y<wsize.bottom-60-d) y+=d; else g=1;if (x<wsize.right-300-d) x+=d; else g=2;break;// ↘         }     }     DeleteObject(hbrush);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     system("color 07");     system("cls");     ShowTheCursor();     return 0; }


Question: 请教一个关于 c语言 pow() 函数 的问题

To set a breakpoint when a variable changes value   From the Edit menu, click Breakpoints.   Click the Data tab of the Breakpoints dialog box.   In the Expression text box, type the name of the variable.   Click OK to set the breakpoint.

pow Calculates x raised to the power of y.  double pow( double x, double y );  Routine Required Header Compatibility  pow <math.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  pow returns the value of xy. No error message is printed on overflow or underflow.   Values of x and y Return Value of pow   x < > 0 and y = 0.0 1  x = 0.0 and y = 0.0 1  x = 0.0 and y < 0 INF    Parameters  x  Base  y  Exponent  Remarks  The pow function computes x raised to the power of y.   pow does not recognize integral floating-point values greater than 264, such as 1.0E100.  Example  /* POW.C  *  */  #include <math.h> #include <stdio.h>  void main( void ) {    double x = 2.0, y = 3.0, z;     z = pow( x, y );    printf( "%.1f to the power of %.1f is %.1f\n", x, y, z ); }   Output  2.0 to the power of 3.0 is 8.0   Floating-Point Support Routines  See Also   exp, log, sqrt


Question: 用指针访问数组元素比数组下标访问数组元素快？why？

见c专家编程。

教科书说指针快，但我感觉一样。

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

那是你错觉，下标只不过是一个语法糖。最终的访问方式是一样

谁说的？胡说八道

这个问题压根就不该考虑，有那么大的影响吗？有测试过瓶颈在这里吗？  其实应该考虑为哪种写法更符合项目组大多数成员习惯，以至于定为项目组内部标准。 还要考虑哪种写法更加有利于后期维护。

无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！  不要低估Windows编译器生成Release版时所用优化算法的设计者的智商！

不见得。。。

对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！

引用 6 楼 zhangxiangDavaid 的回复:不对，在Debug下，指针是间接寻址，反而更慢。 汇编说明一切：  	int arr[3] = { 0 }; 00A8D0C8  mov         dword ptr [arr],0   00A8D0CF  xor         eax,eax   00A8D0D1  mov         dword ptr [ebp-10h],eax   00A8D0D4  mov         dword ptr [ebp-0Ch],eax   	int *p = arr; 00A8D0D7  lea         eax,[arr]   00A8D0DA  mov         dword ptr [p],eax   	p[0] = 1; 00A8D0DD  mov         eax,4   00A8D0E2  imul        ecx,eax,0   00A8D0E5  mov         edx,dword ptr [p]   00A8D0E8  mov         dword ptr [edx+ecx],1   	p[1] = 2; 00A8D0EF  mov         eax,4   00A8D0F4  shl         eax,0   00A8D0F7  mov         ecx,dword ptr [p]   00A8D0FA  mov         dword ptr [ecx+eax],2   	p[2] = 3; 00A8D101  mov         eax,4   00A8D106  shl         eax,1   00A8D108  mov         ecx,dword ptr [p]   00A8D10B  mov         dword ptr [ecx+eax],3   	arr[0] = 1; 00A8D112  mov         eax,4   00A8D117  imul        ecx,eax,0   00A8D11A  mov         dword ptr arr[ecx],1   	arr[1] = 2; 00A8D122  mov         eax,4   00A8D127  shl         eax,0   00A8D12A  mov         dword ptr arr[eax],2   	arr[2] = 3; 00A8D132  mov         eax,4   00A8D137  shl         eax,1   00A8D139  mov         dword ptr arr[eax],3     就算有差异，绝大多数应用，不可能在乎这点点性能差异  反而是代码规范、可维护性更重要！


Question: 80分真心求解，队列舞会问题

#include <cstdio> #include <cstdlib> typedef struct {     char name[20];     char sex; }people; typedef people DataType; typedef struct node{     DataType data;     struct node *next; }QueueNode; typedef struct{     QueueNode *front;     QueueNode *rear; }LinkQueue;   void Initial(LinkQueue* Q); void Push(LinkQueue* Q,DataType e); DataType Pop(LinkQueue* Q); int IsEmpty(LinkQueue* Q);   int main() {     int i,pair,number;     LinkQueue F,M;     people p,p_f,p_m;  	Initial(&F);  	Initial(&M);     printf("请输入参加舞会的人数：");     scanf("%d",&number);     getchar();     for(i=1;i<=number;i++)     {         printf("请输入第%d个人的姓名:\n",i);         scanf("%s",p.name);         printf("请输入第%d个人的性别(F/M):\n",i);         scanf("%c",&(p.sex));         getchar();         if(p.sex=='F')             Push(&F,p);         else Push(&M,p);     }     printf("请输入配对总数:");     scanf("%d",&pair);     for(i=1;i<=pair;i++)     {         p_f=Pop(&F);         Push(&F,p_f);           p_m=Pop(&M);         Push(&M,p_f);           printf("第%d对为:女:%s  男:%s\n",i,p_f.name,p_m.name);     }          getchar();     return 0; }   void Initial(LinkQueue *Q) /*将顺序队列置空*/   {    Q->front=Q->rear=NULL; }   /*判队列空*/ int IsEmpty(LinkQueue *Q) {     return Q->front==NULL&&Q->rear==NULL; }   /*进队列*/ void Push(LinkQueue *Q,DataType x) { /*将元素x插入链队列尾部*/     QueueNode *p=(QueueNode *)malloc(sizeof(QueueNode));/*申请新结点*/    // p->data=x;     p->next=NULL;     if(IsEmpty(Q))         Q->front=Q->rear=p;  /*将x插入空队列*/     else     { /*x插入非空队列的尾*/         Q->rear->next=p;     /*p链到原队尾结点后*/         Q->rear=p;           /*队尾指针指向新的尾*/     } }   /*出队列*/ DataType Pop(LinkQueue *Q) {     DataType x;     QueueNode *p;     if(IsEmpty(Q))     {         printf("队列为空");/*下溢*/         exit(1);     }     p=Q->front;                   /*指向对头结点*/     x=p->data;                    /*保存对头结点的数据*/     Q->front=p->next;             /*将对头结点从链上摘下*/     if(Q->rear==p)/*原队中只有一个结点，删去后队列变空，此时队头指针已为空*/         Q->rear=NULL;     free(p);   /*释放被删队头结点*/     return x;  /*返回原队头数据*/ }

引用 1 楼 pengzhixi 的回复:输入scanf("%c",p.sex);这个之后你就不和之前一样把回车吃掉？ 我试过了  还是不行啊

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

输入scanf("%c",p.sex);这个之后你就不和之前一样把回车吃掉？


Question: 关于一个C语言指针操作的问题

你这是linux内核代码中很出名的两个宏。 #define offset_of(type, member) \     ((unsigned long)(&(((type*)0)->member))) 求结构体某个成员的地址偏移量，如 struct a {     int x;     char c[2];     float y; }; 字节对齐的话，成员y在结构体的字节偏移量是8. 第二个 #define container_of(ptr, type, member) \     ((type*)((unsigned long)(ptr) - offset_of(type, member))) offset_of已经解释过了 struct node {     node *prev;     node *next; }; struct B {     int x;     node n;     int y; }; B b; 该宏的目的是，已知b.n的地址，求b的地址。（ptr就是&b.n， type是 B，member是n ）

member的偏移，从0开始算

类似这样:char *P = NULL. 有时候你可以这样写 char *p = 0,但是,最好是这样写char *p = (char*)0; ---- 就是说题目中的0 相当于NULL,只不过怕你的系统中没有定义,所以强制转化了而已.


Question: 用动态规划法解决0/1背包问题，运行过程中一直崩，求解救！

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

代码排版一下，j-w[i]，没判断j<w[i]的情况


Question: SendTo函数向主机发送数据时能伪装本地IP地址么？

Win7限制使用RAW socket

raw socket即可。

ip头里面有发送者的IP，可以修改


Question: 请教大神一个问题，socket服务器端 不同的端口向客户端发送数据 如何实现这个呢？

三年过去啦，你有答案了吗，可以分享下吗

如果是TCP   方式一.  客户端与服务端建立多个链接。如                 client                    / \                  /     \  server: 80    81   不同链接对应不同端口   方式二 . 建立一个  网关服(链接服)  ---- gateway.这种方式比较常见 如  client <-----------------------> 80:gateway                                                     / \     \-------- n 个内部链接 ------与服务                                                   /     \              \         \                                          s1:80      s1:81    s2  ... sn

UDP 内容中包含加密后的下一个要使用的端口号 ？

tcp连接必须确定端口

顶啊啊啊              啊 啊


Question: 求助：在for循环到第三个的时候数据输出异常

调试就知道了。

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


Question: 负数为什么使用补码会计算方便，方便在哪里

-1的补码0xffffffff -1 + 1 == 0 0xffffffff + 0x1 == 0

引用 5 楼 s332031515 的回复:[quote=引用 3 楼 s332031515 的回复:] [quote=引用 1 楼 adlay 的回复:] 这样正数和负数的加法可以用同一条指令，用同样的硬件电路来实现。 引用 1 楼 adlay 的回复:这样正数和负数的加法可以用同一条指令，用同样的硬件电路来实现。  嗯嗯，谢谢。那负数的补码和原来的负数已经不同了，为什么还可以计算呢 [/quote]  难道是负数的补码参与运算使用的加法，，负数的原码参与运算使用的减法，，由于计算结果相同，这个加法比减法简单，就硬性规定使用补码[/quote] 差不多吧，可以用补码表示负数来参与计算主要就是计算机的位数是有限的，而超出的位数会被舍弃

引用 3 楼 s332031515 的回复:[quote=引用 1 楼 adlay 的回复:] 这样正数和负数的加法可以用同一条指令，用同样的硬件电路来实现。 引用 1 楼 adlay 的回复:这样正数和负数的加法可以用同一条指令，用同样的硬件电路来实现。  嗯嗯，谢谢。那负数的补码和原来的负数已经不同了，为什么还可以计算呢 [/quote]  难道是负数的补码参与运算使用的加法，，负数的原码参与运算使用的减法，，由于计算结果相同，这个加法比减法简单，就硬性规定使用补码

负数是2补码 这样解释吧 一个数的负数为0-它本身 对于char来说0x100也是0 于是一个数的负数为0x100-它本身 又规定signed型一半是负数，一半是非负 所以0x7f表示127，0x81表示-127，两者和为0x100 特别的有0x80表示-128，它不具有正数形式 又因为2进制数加上它的1补码正好是0xff，在加一才是0x100 因此2进制数的负数是它的2补码 好处在于signed和unsigned的运算方式一致，除移位运算

引用 1 楼 adlay 的回复:这样正数和负数的加法可以用同一条指令，用同样的硬件电路来实现。 引用 1 楼 adlay 的回复:这样正数和负数的加法可以用同一条指令，用同样的硬件电路来实现。  嗯嗯，谢谢。那负数的补码和原来的负数已经不同了，为什么还可以计算呢

嗯嗯，谢谢。那负数的补码和原来的负数已经不同了，为什么还可以计算呢

这样正数和负数的加法可以用同一条指令，用同样的硬件电路来实现。


Question: hash表求交集

pSetArray[a[i]]这里a[I]如果很多肯定会越界，b[I]作为索引也是。


Question: 负数的原码，反码，补码是否相等

反码不怎么用，补码主要是为了加减法方便，如是a为正数，那么-a在二进中表示为2^x-a, 相加结果去掉溢出位，刚好为0

负数的原码、反码和补码，从二进制上看，肯定不一样。 理解补码的存在性即可。


Question: 学生管理系统代码运行会关闭

去学调试器。

if (strcmp(&str[i].name,&x)==0)  这个没问题吗？

引用 3 楼 user-4 的回复:看堆栈设断点调试呗  看不太懂。。 int Find_(STU str[],int n)  //查找成绩 { 	char x; 	int i; 	printf("----------------请输入学生的姓名----------------\n"); 	printf("\t\t姓名："); 	scanf("\t\t%s",&x); 	for (i=0;i<n;i++) 	{ 		if (strcmp(&str[i].name,&x)==0) 		{ 			printf("\t\t学期：%d\n",str[i].term); 			printf("\t\t班级：%d\n",str[i].class1); 			printf("\t\t学号：%ld\n",str[i].num); 			printf("\t\t姓名：%s\n",str[i].name); 			printf("\t\t科目：%s\n",str[i].score.subject); 			printf("\t\t分数：%d\n",str[i].score.grade); 		} 	} 	return 0; } 比如这个我实在不知道是哪里导致文件关闭

看堆栈设断点调试呗

顶一下 麻烦帮个忙 谢谢

知道有的功能还有错误 可是就是想知道一下为什么会关闭 谢谢


Question: 如何判断URL汉字为哪种编码并相应解码？（C语言）

好吧，最后我采用的是匹配1110xxxx，10xxxxxx，10xxxxxx方法为utf-8，虽然不完全靠谱。。。结贴

引用 4 楼 user-5 的回复:刚好最近在弄 #include <cstdio>  #define UNICODE 1  #include <objbase.h> #include <comip.h> #include <mlang.h> #include <tchar.h>  typedef _com_ptr_t<_com_IIID<IMultiLanguage3, &IID_IMultiLanguage3>> IMultiLanguage3Ptr;  int main() { 	CoInitialize(NULL); 	{ 		IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC); 		char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB }; 		int isize = sizeof(data); 		DetectEncodingInfo result[32]; 		int result_count = sizeof(result) / sizeof(result[0]); 		HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count); 		if (!SUCCEEDED(hr)) 		{ 			fprintf(stderr, "Failed with 0x%x\n", hr); 			CoUninitialize(); 			return hr; 		} 		for (int i = 0; i < result_count; i++) 		{ 			WCHAR desc[100] = {0}; 			pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, 100); 			printf("CP:%d (%S)\n", result[i].nCodePage, desc); 		} 	} 	CoUninitialize(); 	return 0; } 输出： CP:936 (Chinese Simplified (GB2312)) 引用 6 楼 zhao4zhong1 的回复:向4楼学习！ #define _UNICODE 1 #pragma warning(disable:4305 4309) #pragma comment(lib,"ole32") #pragma comment(lib,"comsupp") #include <cstdio> #include <objbase.h> #include <comip.h> #include <mlang.h> #include <tchar.h>  typedef _com_ptr_t<_com_IIID<IMultiLanguage3, &IID_IMultiLanguage3> > IMultiLanguage3Ptr;  int main() {     CoInitialize(NULL);     {         IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC);         char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB };         int isize = sizeof(data);         DetectEncodingInfo result[32];         int result_count = sizeof(result) / sizeof(result[0]);         HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count);         if (!SUCCEEDED(hr))         {             fprintf(stderr, "Failed with 0x%x\n", hr);             CoUninitialize();             return hr;         }         for (int i = 0; i < result_count; i++)         {             WCHAR desc[100] = {0};             pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, 100);             printf("CP:%d (%S)\n", result[i].nCodePage, desc);         }     }     CoUninitialize();     return 0; }

HTTP协议，头部会指出所用编码格式。  你把整个http数据包抓出看下就知道了

引用 5 楼 bravery36 的回复:utf8和gb2312的码库是重的，无法判定每个字符。唯一靠谱一点的是整段文字一起判定，有一个不是utf8的就是gb。就算是这样子也有例外，比如说我的同事全名就是无法判定utf8和gb的。 每三个字节判定符合utf-8的编码标准，不符合为gb的意思吗？ 那gb又如何解码？

引用 4 楼 user-5 的回复:刚好最近在弄 #include <cstdio>  #define UNICODE 1  #include <objbase.h> #include <comip.h> #include <mlang.h> #include <tchar.h>  typedef _com_ptr_t<_com_IIID<IMultiLanguage3, &IID_IMultiLanguage3>> IMultiLanguage3Ptr;  int main() { 	CoInitialize(NULL); 	{ 		IMultiLanguage3Ptr pML(CLSID_CMultiLanguage, NULL, CLSCTX_INPROC); 		char data[] = { 0xD6, 0xD0, 0xCE, 0xC4, 0xB1, 0xE0, 0xC2, 0xEB }; 		int isize = sizeof(data); 		DetectEncodingInfo result[32]; 		int result_count = sizeof(result) / sizeof(result[0]); 		HRESULT hr = pML->DetectInputCodepage(MLDETECTCP_NONE, 0, data, &isize, result, &result_count); 		if (!SUCCEEDED(hr)) 		{ 			fprintf(stderr, "Failed with 0x%x\n", hr); 			CoUninitialize(); 			return hr; 		} 		for (int i = 0; i < result_count; i++) 		{ 			WCHAR desc[100] = {0}; 			pML->GetCodePageDescription(result[i].nCodePage, result[i].nLangID, desc, 100); 			printf("CP:%d (%S)\n", result[i].nCodePage, desc); 		} 	} 	CoUninitialize(); 	return 0; } 输出： CP:936 (Chinese Simplified (GB2312)) 请问4楼，你这用了什么函数，能加个注释吗？另外，这个函数库识别出来之后可以解码吗？

举个例子，比如python有个库，可以guess一下编码，可以做相关搜索。

引用 1 楼 ForestDB 的回复:URL的encode只能是utf8？ 引用 1 楼 ForestDB 的回复:URL的encode只能是utf8？不全是，有些是gb2312如上面那个例子

向4楼学习！


引用 4 楼 u012421456 的回复:不知楼主要干什么需要用到这个低版本，同楼上，自己编译安装吧 可参考——http://www.it165.net/os/html/201401/7117.html    make编译的时候一直报错：gnu/stubs-32.h: No such file or directory

make编译的时候报这种错gnu/stubs-32.h: No such file or directory

make编译的时候宝这种错

楼主要编译tfs吗?

基本新的系统都是最新的gcc,你试试老版本的linux系统吧、。；

引用 3 楼 iyomumx 的回复:自己编译一个吧编译太慢

为什么要用老的？

编译器还是用新的吧,老的以后维护会更加困难?

自己编译一个吧

引用 1 楼 user-9 的回复:这么旧的gcc，有个毛用？ 大神知道吗？

这么旧的gcc，有个毛用？


Question: 关于fopen过程中，打开的源文件被修改或者删除，会有什么后果

不行的，只要打开了在读的时候，其他人最多也只能打开读，是不能写和删除的。 平时用的软件打开了一个文件后其他人还可以写和删除那是因为打开文件的软件是打开后就把文件对到内存然后就关闭了文件了。

可以捕捉这个错误，如果出现错误，提示XXX  楼主不用担心误读了硬盘其他地方，如果删了，他再读肯定会出错

如果这样，会出现错误，可以用捕捉到，文件读取写入的错误类型有一大堆，楼主可以自己试下就知了，也可以参看MSDN

引用 2 楼 ForestDB 的回复:应该删除不了才对。  可以用独占方式打开看看。 假设我们不是独占打开，可以修改和删除，会有什么后果

应该删除不了才对。  可以用独占方式打开看看。

在线等！！！！

_locking Locks or unlocks bytes of a file.  int _locking( int handle, int mode, long nbytes );  Routine Required Header Optional Headers Compatibility  _locking <io.h> and <sys/locking.h> <errno.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  _locking returns 0 if successful. A return value of –1 indicates failure, in which case errno is set to one of the following values:  EACCES  Locking violation (file already locked or unlocked).  EBADF  Invalid file handle.  EDEADLOCK  Locking violation. Returned when the _LK_LOCK or _LK_RLCK flag is specified and the file cannot be locked after 10 attempts.  EINVAL  An invalid argument was given to _locking.  Parameters  handle  File handle  mode  Locking action to perform  nbytes  Number of bytes to lock  Remarks  The _locking function locks or unlocks nbytes bytes of the file specified by handle. Locking bytes in a file prevents access to those bytes by other processes. All locking or unlocking begins at the current position of the file pointer and proceeds for the next nbytes bytes. It is possible to lock bytes past end of file.  mode must be one of the following manifest constants, which are defined in LOCKING.H:  _LK_LOCK  Locks the specified bytes. If the bytes cannot be locked, the program immediately tries again after 1 second. If, after 10 attempts, the bytes cannot be locked, the constant returns an error.  _LK_NBLCK  Locks the specified bytes. If the bytes cannot be locked, the constant returns an error.  _LK_NBRLCK  Same as _LK_NBLCK.  _LK_RLCK  Same as _LK_LOCK.  _LK_UNLCK  Unlocks the specified bytes, which must have been previously locked.  Multiple regions of a file that do not overlap can be locked. A region being unlocked must have been previously locked. _locking does not merge adjacent regions; if two locked regions are adjacent, each region must be unlocked separately. Regions should be locked only briefly and should be unlocked before closing a file or exiting the program.  Example  /* LOCKING.C: This program opens a file with sharing. It locks  * some bytes before reading them, then unlocks them. Note that the  * program works correctly only if the file exists.  */  #include <io.h> #include <sys/types.h> #include <sys/stat.h> #include <sys/locking.h> #include <share.h> #include <fcntl.h> #include <stdio.h> #include <stdlib.h>  void main( void ) {    int  fh, numread;    char buffer[40];     /* Quit if can't open file or system doesn't      * support sharing.      */    fh = _sopen( "locking.c", _O_RDWR, _SH_DENYNO,                   _S_IREAD | _S_IWRITE );    if( fh == -1 )       exit( 1 );     /* Lock some bytes and read them. Then unlock. */    if( _locking( fh, LK_NBLCK, 30L ) != -1 )    {       printf( "No one can change these bytes while I'm reading them\n" );       numread = _read( fh, buffer, 30 );       printf( "%d bytes read: %.30s\n", numread, buffer );       lseek( fh, 0L, SEEK_SET );      _locking( fh, LK_UNLCK, 30L );       printf( "Now I'm done. Do what you will with them\n" );    }    else       perror( "Locking failed\n" );     _close( fh ); }   Output  No one can change these bytes while I'm reading them 30 bytes read: /* LOCKING.C: This program ope Now I'm done. Do what you will with them   File Handling Routines  See Also   _creat, _open

引用 7 楼 henuyx 的回复:如果是我设计fopen系列的函数：   fopen之后，我会把这个文件放在一个保护区   即使你删了，也只是ls看不到了，但是实际上这个文件还在，但不会增加新的链接数   直到打开这个文件的链接数为0之后，再将这个文件真正的删除了！   这样就不会出现你说的那种疑问了。   可以测试一下。   ------------------------------------------------------------------------   个人理解  你的这个推测离真相很近，测试结果也是这样，即使删除了，还是会继续处理，删除我不是很担心，我担心的是如果被覆盖或修改会不会有误读的风险？


Question: C语言的题目 新人求帮助 跪谢大神了TAT

修改如下：  #include <stdio.h> #include <stdlib.h> typedef int datatype; typedef struct node { 	datatype data; 	struct node *next; }linknode, *linklist; //检查输入 int Check_Input(char *buf) { 	if (NULL == buf) return 0; 	int n = strlen(buf); 	int i; 	for (i = 0; i < n; i++) 		if (buf[i] < '0' || buf[i] > '9') 			return 0; 	return 1; } //建立链表(含头节点) linklist CreateList() { 	char buf[12]; 	linklist Head = (linklist)malloc(sizeof(linknode)); 	linklist tmp = Head; 	tmp->next = NULL; 	linklist loc; 	printf("请输入相应的数据（以0作为结束）如2 6 4 7 3 0\n"); 	int input = 0; 	do { 	begin: 		printf("input:"); 		scanf("%s", buf); 		if (0 == Check_Input(buf)){ 			printf("Input error!,input again\n"); 			goto begin; 		} 		sscanf(buf, "%d", &input); 		if (0 == input) break; 		//申请新节点 		loc = (linklist)malloc(sizeof(linknode)); 		loc->data = input; 		loc->next = NULL; 		//更新前一节点 		tmp->next = loc; 		tmp = loc; 	} while (true); 	return Head; } //寻找最优解 datatype Adjmax(linklist H) { 	linklist tmp = H->next; 	datatype maxTmp, max = 0; 	datatype result; 	while (tmp != NULL) { 		if (tmp->next != NULL) 			maxTmp = tmp->data + tmp->next->data; 		else 			maxTmp = tmp->data; 		if (maxTmp > max) { 			max = maxTmp; 			result = tmp->data; 		} 		tmp = tmp->next; 	} 	return result; } //释放链表 void FreeList(linklist H) { 	linklist midTmp, tmp = H; 	while (tmp != NULL) { 		midTmp = tmp->next; 		free(tmp); 		tmp = midTmp; 	} } void solve() { 	linklist H = CreateList(); 	printf("所求的节点的值为：%d\n", Adjmax(H)); 	FreeList(H); } int main() { 	char choice; 	do { 		solve(); 		printf("是否继续？（y/n）\n"); getchar(); 		choice = getchar(); 		if (choice == 'n') { 			printf("GoodBye!"); 			break; 		} 	} while (true); 	return 0; }

那你只能scanf("%s"去得到字符串，自己判断是不是数字

输出格式获取用字符串，之后自己写一个字符串parse函数来判断字符串是否含有非法字符，含有就报错，如果是纯数字就再将字符串转为整型存入链表。


Question: 为什么调用函数传递形参变量自增自减运算符有时没有效果？

这一次判断：c[i]==c[j] 下一次就得判断：c[i-1]==c[j-1]; 所以必须使用：++i; --j; 而不是：i++; j--;

i++和++i的区别，前者是先取i传递过去，i再自加，后者是i先自加再传递过去

按值传递参数的时候，会在栈区新建变量，把参数的值赋给这个变量，作用到函数中。  假如 i 的值是 1 调用 com( i++ ) 的时候，会创建一个新的变量 i' (为了区分加了一撇） 相当于 int i' ; i' =i; i += 1;  显然 i 增加了1 成了2 ，但 i' 依然还是 1 ，而 i' 才是新函数里的 i  于是，你无数次地递归，创建了无数个不同的 i ，i 的值永远都是1  而 ++i 是先递增后赋值，等效于 i+=1; int i' ; i’=i;  如果要实现你理想的效果，用引用作参数 com(char *c,int &i,int &j) 这样不会创建新的变量，而是直接在原来的 i 和 j 上操作。

问题在代码注释里.............


Question: 用无限循环监控全局变量，CPU占用99！！！

while中加Sleep(50)，相当于放弃执行权50毫秒，如果你不加，CPU一直在执行，当然是满占用啦

#include <windows.h>  Sleep(30);

别的且不说，就算你用死循环等待，也得在循环内部哪怕sleep(0)啊

《Windows核心编程》

模块2的问题应该不大，循环在等待你输入的时候不会执行下去。 模块1中死循环是为了等待线程全部执行完成么？如果是可以不用死循环的方式等待，看看WaitForMultipleObjects，然后尝试替换死循环去等待线程完成。

while中不加sleep就是来耗cpu资源的

关键字：线程同步对象


Question: 请教C语言中while循环和文件操作语言fread/fwrite的问题

引用 1 楼 user-2 的回复:1、循环条件是fread读取返回值，也就是是否读取到了数据，因为fread没读到数据返回0，while结束 2、fwrite返回写入的个数，你要让他写3个，它返回不是3不就出错了么。。 3 总的来说，lz需要看看函数的参数和返回值的含义 谢谢

建议lz，先弄懂语言基础。


Question: 请教一个如何设置source insight的问题

真的没人了解吗

是不是因为有near，整个union是不是在某个ifdef中？

额 。。。用的也不熟。。

忘了说，这个联合体的定义是在.h文件里的。.h文件已经被添加到文件过滤里面了了。


Question: C 1+2+3测试中发现的一个问题，求解答指导谢谢

引用 2 楼 weixin_28404455 的回复:i从1加到7加6次，sum加了6次3 是不是可以理解为for的循环让I循环6次，也让sum的值循环了6次+3，   i<=3所代表的循环次数由于for语句所以控制着i++的次数和sum+3的次数

i从1加到7加6次，sum加了6次3

这到底是为什么？


Question: C语言中1+2+3中有个问题，想请大大们帮忙指导下

啥意思? 1+ 1+1+1+1+1不就是6？ 同理 6个2相加 不就是12？


Question: 求帮忙看下为什么程序会关闭

调试是必须学会的

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

至少有三处需要改动：  void Find_(STU str[], int n)  //查找成绩 { 	char x[20];     //改动，20个字节，够吗？ 	int i; 	printf("----------------请输入学生的姓名----------------\n"); 	printf("\t\t\t"); 	scanf("%s", x);   //改动 	for (i = 0; i < n; i++) 	{ 		//if (strcmp(&str[i].name, &x) == 0) 		if (strcmp(str[i].name, x) == 0)    //改动 		{ 			printf("\t\t学期：%d\n", str[i].term); 			printf("\t\t班级：%d\n", str[i].class1); 			printf("\t\t学号：%d\n", str[i].num); 			printf("\t\t姓名：%s\n", str[i].name); 			printf("\t\t科目：%s\n", str[i].score.subject); 			printf("\t\t分数：%d\n", str[i].score.grade); 		} 	} }

引用 1 楼 user-4 的回复:x是char型，只能存放一个字节，应该char x[12]; 还是会关闭

x是char型，只能存放一个字节，应该char x[12];


Question: 求助：const的用法一例，急急急

不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

int a = 0; void foo(const int * a) {     // *a = 1; } foo(&a);  在函数调用的过程中实参和形参是否该保持一致？ 是，这里的一致表示一致或者兼容的意思。 比如有函数void foo(long a); long x; foo(x);这是一致 int y; foo(y);这是兼容，因为int可以转化成long，且无精度损失。 另外兼容还有一种情形，就是这种non-const传给const的，因为函数调用对non-const的实参没有影响。  int a = 0; void foo(const int * a) {     // *a = 1; // 由于const，这条语句是不允许的。 } foo(&a);

你问的问题太深了，我不知道。

传地址 travers(&movies, show（。。。）); 这样是可以的。 大多数情况下，要求类型匹配，对于const有例外：右侧类型可以转化为左侧类型。 如：const int i = 12.1;        //double->int

movies的类型是list ，而函数要求是const list *,这样调用是错的，跟const无关

实参和形参该保持一致。没看明白楼主第二个问题到底想问啥。。。


Question: 如何理解int *number = 100

做死的写法，谁家的教材这么坑！

哦，原来100是个地址啊，我一直看成一个int型数字了，现在明白了，我就说以前输出*number会失败，原来存入的是100的地址，但是100那个地址里并没有值。多谢楼上三位朋友的热心解答。

你那句就是把100作为一个地址存放到number这个指针变量里面。至于100这个地址上是否存放有一个整形变量，这个你心里应该是清楚的。至于输出正常因为你本身就是输出了number这个变量，而非这个地址里面包含的整型值。仅此而已。

请查阅"指针的初始化"相关资料.

为什么不把100看成一个地址，  地址实际上不也是一个整数吗


Question: 如何实现向多个IP的ping指令,并将ping的结果集保存在文件中

这么多啊，大哥这是什么级别了

这需求也是坑死爹了。 连续不同的IP呢？ 丢包超时呢？  让你看下这个代码 //icmpPing.h #include <tchar.h> #include <stdio.h> #include <WinSock2.h>  #ifdef ICMPPING_EXPORTS #define ICMPPING_API __declspec(dllexport) #else #define ICMPPING_API __declspec(dllimport) #endif  DWORD ICMPPING_API icmp_ping(LPSTR szIP,int* needTime,int sendDataSize, int iPingTimeout);  //icmpPing.cpp  unsigned long ResolveIP(LPSTR strIP) { 	unsigned long ip; 	ip =(IPAddr)inet_addr(strIP); 	return ip; }  DWORD icmp_ping(LPSTR szIP,int* needTime,int sendDataSize, int iPingTimeout) { 	//Task 1: Open ICMP Handle 	//Task 2: Create Structure to receive ping reply 	//Task 3: SendPing （SendEcho） 	//Task 4: Close ICMP Handle 	//Task 5: Return RoundTripTime  	int dataSize = sendDataSize / sizeof(TCHAR) + 1; 	TCHAR *SendData = new TCHAR[sendDataSize];  	for (int i = 0; i != dataSize; ++i) 	{ 		SendData[i] = (TCHAR)65; 	} 	SendData[dataSize - 1] = (TCHAR)0;  	DWORD    SendDataSize = dataSize; 	LPVOID    ReplyBuffer = NULL; 	DWORD    ReplySize = 0;  	ReplySize = SendDataSize + sizeof(ICMP_ECHO_REPLY); 	ReplyBuffer = new TCHAR[ReplySize];  	HANDLE icmphandle = IcmpCreateFile(); 	if(INVALID_HANDLE_VALUE == icmphandle){ 		delete SendData;  		return GetLastError(); 	} 	DWORD nRet = IcmpSendEcho(icmphandle,ResolveIP(szIP), SendData, (WORD)SendDataSize, NULL, ReplyBuffer,ReplySize,iPingTimeout); 	PICMP_ECHO_REPLY pEchoReply = (PICMP_ECHO_REPLY)ReplyBuffer; 	if(pEchoReply->Status != 0){ 		std::cout<<"ping error = "<<GetLastError()<<std::endl; 		*needTime = 10000; 	}else{ 		*needTime = pEchoReply->RoundTripTime; 	} 	IcmpCloseHandle(icmphandle); 	ULONG   Status = pEchoReply->Status; 	delete SendData; 	delete ReplyBuffer; 	return Status; }  //icmpUtility.h #pragma once  #ifdef ICMPUTILITY_EXPORTS #define ICMP_API __declspec(dllexport) #else #define ICMP_API __declspec(dllimport) #endif  #ifndef ICMPUTILITY_H_ #define ICMPUTILITY_H_ #include <string> #include <functional>    struct ICMP_API IcmpResponse{ 	int m_milliseconds; 	std::string m_ip; 	unsigned long m_status; };  typedef ICMP_API std::function<void(IcmpResponse)> IcmpCallback;  struct ICMP_API IcmpParam{ 	std::wstring m_ip; 	IcmpCallback m_callback; }; bool ICMP_API startIcmp(IcmpParam param); #endif  //icmpUtility.cpp  UINT __stdcall icmpThreadProc(void* lpParam) { 	IcmpParam* paramPtr = (IcmpParam*)lpParam; 	if(NULL == paramPtr){ 		return 1; 	} 	USES_CONVERSION; 	LPSTR ip = W2A(paramPtr->m_ip.c_str()); 	IcmpResponse resp; 	resp.m_milliseconds = 10000; 	resp.m_status = icmp_ping(ip,&resp.m_milliseconds,1,10000); 	resp.m_ip = ip; 	switch(resp.m_status) 	{ 	case IP_SUCCESS:{}break; 	case IP_BUF_TOO_SMALL:{std::cout<<"缓冲太小"<<std::endl;}break; 	case IP_DEST_NET_UNREACHABLE:{std::cout<<"目标网络不可达"<<resp.m_milliseconds<<std::endl;}break; 	case IP_DEST_HOST_UNREACHABLE:{std::cout<<"目标主机不可达"<<resp.m_milliseconds<<std::endl;}break; 	case IP_DEST_PROT_UNREACHABLE:{std::cout<<"目的地址不可达 "<<resp.m_milliseconds<<std::endl;}break; 	case IP_DEST_PORT_UNREACHABLE:{std::cout<<"目标端口不可达"<<std::endl;}break; 	case IP_NO_RESOURCES:{std::cout<<"ip资源不足"<<std::endl;}break; 	case IP_BAD_OPTION:{std::cout<<"指定了错误的IP选项"<<std::endl;}break; 	case IP_HW_ERROR:{std::cout<<"一个硬件错误"<<std::endl;}break; 	case IP_PACKET_TOO_BIG:{std::cout<<"包太大"<<std::endl;}break; 	case IP_REQ_TIMED_OUT:{std::cout<<"请求超时"<<std::endl;}break; 	case IP_BAD_REQ:{std::cout<<"一个坏的请求"<<std::endl;}break; 	case IP_BAD_ROUTE:{std::cout<<"一个糟糕的路线"<<std::endl;}break; 	case IP_TTL_EXPIRED_TRANSIT:{std::cout<<"在传输过程中的生存时间（TTL）的过期"<<std::endl;}break; 	case IP_TTL_EXPIRED_REASSEM:{std::cout<<"在碎片重组过程中的生存时间过期"<<std::endl;}break; 	case IP_PARAM_PROBLEM:{std::cout<<"一个参数的问题"<<std::endl;}break; 	case IP_SOURCE_QUENCH:{std::cout<<"数据报到达太快，处理和数据报可能被丢弃"<<std::endl;}break; 	case IP_OPTION_TOO_BIG:{std::cout<<"一个IP选项是太大了"<<std::endl;}break; 	case IP_BAD_DESTINATION:{std::cout<<"一个坏的目的地"<<std::endl;}break; 	case IP_GENERAL_FAILURE:{std::cout<<"一般故障。这个错误可以返回一些畸形的ICMP数据包"<<std::endl;}break; 	} 	if(paramPtr->m_callback){ 		paramPtr->m_callback(resp); 	} 	delete paramPtr; 	return 0; }  bool startIcmp(IcmpParam param) { 	IcmpParam* lpParam = new IcmpParam; 	lpParam->m_callback = param.m_callback; 	lpParam->m_ip = param.m_ip; 	::_beginthreadex(NULL,0,icmpThreadProc,lpParam,0,0); 	return TRUE; }

哈，老师，学习了……谢谢！

仅供参考：#include <windows.h> #include <stdio.h> #include <string.h> char YN(int k) {     FILE *f;     char fn[40];     char ln[80];     char yn;     int n;      yn='N';     sprintf(fn,"d:\\ping%d.txt",k);     f=fopen(fn,"r");     if (NULL!=f) {         n=0;         while (1) {             if (NULL==fgets(ln,80,f)) break;//             if (strstr(ln,"ms ")) {                 yn='Y';                 break;//             }             n++;             if (n>=4) break;//         }         fclose(f);     }     return yn; } void main(int argc,char **argv) {     char cmdstr[256];     int i;     int IP[3];     char c;      if (argc<2) {     USAGE:         printf("Usage example:\n    %s 192.168.60.\nto test 192.168.60.1-254\n",argv[0]);         return;     }     if (4==sscanf(argv[1],"%d.%d.%d%c",&IP[0],&IP[1],&IP[2],&c)) {         if (0<=IP[0] && IP[0]<=255          && 0<=IP[1] && IP[1]<=255          && 0<=IP[2] && IP[2]<=255          && '.'==c) {             for (i=1;i<255;i++) {                 sprintf(cmdstr,"cmd /c ping %s%d -n 1 -w 1000 >d:\\ping%d.txt",argv[1],i,i);                 WinExec(cmdstr,SW_HIDE);             }             Sleep(3000);             for (i=1;i<255;i++) {                 printf("%c %s%d\n",YN(i),argv[1],i);             }             Sleep(3000);             WinExec("cmd /c del /q d:\\ping*.txt",SW_HIDE);         } else goto USAGE;     } else goto USAGE; }

这个有用嘛，我是要在c语言的函数代码来实现ping命令的循环多个ip的

装一个nmap，然后调用nmap的ping扫描结果！哇哈哈！我真是太聪明了。

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


Question: 写个新数据写入数组的0位置，老数据向后推移一位

var list = [4,5,6];  list.push(7);  var newList = list.sort(x => x !== 7) 		 document.write(newList)

谢谢各位，明白了

你一看就应该明白啊。 while (i<40) { g_peak[i+1] = g_peak[i]; i++; } 这样后面的元素都被覆盖了。 应该 i = 39; while(i>=0) { g_peak[i] = g_peak[i-1]; i--; }

从0到39循环是不行的，得反过来，从39到0才可以

1 2 3 指向你的 i+1 = i 变成  1 1 3 再执行 i+i = i 变成  1 1 1  当然不行了  从后向前 i-1 = i


Question: 请问 unsigned char 数组和char数组怎么互相转换?

直接强制类型转换。

同意楼上的，对输入有把握，直接强转

unsigned char和char是不兼容的两种类型； unsigned char *和char *也是不兼容的两种类型。 如果能保证存放的是基本执行字符集的成员，ie，就像你说的，全是英文字母，那么，可以强制转换，没问题，不会损失什么。

你的这种情况直接强转即可。  HalLcdWriteString((char *) buffer, option);


Question: 远程文件同步算法的程序代码

搜“robocopy”

冒昧的请问楼主： 代码呢？怎么没见到？


Question: C语言中如何实现 大数 求 对数，或者仅仅是求对数

看题目不是直接求大数的对数，试着推导了一下 已经知a=lgx,b=lgy,求lg(x+y) =lg(2^a+2^b) , 假设a>=b，令k=a-b 式子为 lg(2^b(2^k+1)) == b + lg(2^k+1) 如果k>=32，那么lg(2^k+1)应该接近为k，否则double的pow可以直接计算。 剩下就是写一个大数的相加和相减


Question: 怎么使用sigsetjmp和signal来实现try-catch

仅供参考：longjmp Restores stack environment and execution locale.  void longjmp( jmp_buf env, int value );  Routine Required Header Compatibility  longjmp <setjmp.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  None  Parameters  env  Variable in which environment is stored  value  Value to be returned to setjmp call  Remarks  The longjmp function restores a stack environment and execution locale previously saved in env by setjmp. setjmp and longjmp provide a way to execute a nonlocal goto; they are typically used to pass execution control to error-handling or recovery code in a previously called routine without using the normal call and return conventions.  A call to setjmp causes the current stack environment to be saved in env. A subsequent call to longjmp restores the saved environment and returns control to the point immediately following the corresponding setjmp call. Execution resumes as if value had just been returned by the setjmp call. The values of all variables (except register variables) that are accessible to the routine receiving control contain the values they had when longjmp was called. The values of register variables are unpredictable. The value returned by setjmp must be nonzero. If value is passed as 0, the value 1 is substituted in the actual return.  Call longjmp before the function that called setjmp returns; otherwise the results are unpredictable.  Observe the following restrictions when using longjmp:   Do not assume that the values of the register variables will remain the same. The values of register variables in the routine calling setjmp may not be restored to the proper values after longjmp is executed.    Do not use longjmp to transfer control out of an interrupt-handling routine unless the interrupt is caused by a floating-point exception. In this case, a program may return from an interrupt handler via longjmp if it first reinitializes the floating-point math package by calling _fpreset.   Be careful when using setjmp and longjmp in C++ programs. Because these functions do not support C++ object semantics, it is safer to use the C++ exception-handling mechanism.  Example  /* FPRESET.C: This program uses signal to set up a  * routine for handling floating-point errors.  */  #include <stdio.h> #include <signal.h> #include <setjmp.h> #include <stdlib.h> #include <float.h> #include <math.h> #include <string.h>  jmp_buf mark;              /* Address for long jump to jump to */ int     fperr;             /* Global error number */  void __cdecl fphandler( int sig, int num );   /* Prototypes */ void fpcheck( void );  void main( void ) {    double n1, n2, r;    int jmpret;    /* Unmask all floating-point exceptions. */     _control87( 0, _MCW_EM );    /* Set up floating-point error handler. The compiler     * will generate a warning because it expects     * signal-handling functions to take only one argument.     */     if( signal( SIGFPE, fphandler ) == SIG_ERR )     {       fprintf( stderr, "Couldn't set SIGFPE\n" );       abort();   }     /* Save stack environment for return in case of error. First      * time through, jmpret is 0, so true conditional is executed.      * If an error occurs, jmpret will be set to -1 and false      * conditional will be executed.     */    jmpret = setjmp( mark );    if( jmpret == 0 )    {       printf( "Test for invalid operation - " );       printf( "enter two numbers: " );       scanf( "%lf %lf", &n1, &n2 );       r = n1 / n2;       /* This won't be reached if error occurs. */       printf( "\n\n%4.3g / %4.3g = %4.3g\n", n1, n2, r );        r = n1 * n2;       /* This won't be reached if error occurs. */       printf( "\n\n%4.3g * %4.3g = %4.3g\n", n1, n2, r );    }    else       fpcheck(); } /* fphandler handles SIGFPE (floating-point error) interrupt. Note  * that this prototype accepts two arguments and that the   * prototype for signal in the run-time library expects a signal   * handler to have only one argument.  *  * The second argument in this signal handler allows processing of  * _FPE_INVALID, _FPE_OVERFLOW, _FPE_UNDERFLOW, and   * _FPE_ZERODIVIDE, all of which are Microsoft-specific symbols   * that augment the information provided by SIGFPE. The compiler   * will generate a warning, which is harmless and expected.   */ void fphandler( int sig, int num ) {    /* Set global for outside check since we don't want     * to do I/O in the handler.     */    fperr = num;    /* Initialize floating-point package. */    _fpreset();    /* Restore calling environment and jump back to setjmp. Return      * -1 so that setjmp will return false for conditional test.     */    longjmp( mark, -1 ); } void fpcheck( void ) {    char fpstr[30];    switch( fperr )    {    case _FPE_INVALID:        strcpy( fpstr, "Invalid number" );        break;    case _FPE_OVERFLOW:        strcpy( fpstr, "Overflow" );         break;    case _FPE_UNDERFLOW:        strcpy( fpstr, "Underflow" );        break;    case _FPE_ZERODIVIDE:        strcpy( fpstr, "Divide by zero" );        break;    default:        strcpy( fpstr, "Other floating point error" );        break;    }    printf( "Error %d: %s\n", fperr, fpstr ); }   Output  Test for invalid operation - enter two numbers: 5 0 Error 131: Divide by zero   Process and Environment Control Routines  See Also   setjmp

引用 1 楼 zhao4zhong1 的回复:个人意见： 实现再多的try-catch，也不如学会分析dump文件。 会分析再多的dump文件，也不如学会设置数据改变断点， 设置再多的数据改变断点，也不如学会写日志到文件。  有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中  但是老师要求我们实现。。。


Question: GNU C库 初始化该如何进行

有大神过来帮忙 讲下 ARM裸机程序使用GNU -LD 链接C库方法配置项吗

引用 1 楼 zhao4zhong1 的回复:GNU C是开源的。  你意思市区源码里面找吗？

GNU C是开源的。


Question: 这样写可以吗？

引用 8 楼 FightForProgrammer 的回复:[quote=引用 7 楼 sholber 的回复:] [quote=引用 6 楼 FightForProgrammer 的回复:] [quote=引用 4 楼 sholber 的回复:] [quote=引用 3 楼 FightForProgrammer 的回复:] 试验了一下，个人感觉不行。 比如 int x = (a == 3 ? b : c); 整个三元表达式的返回值 是b或者c，而不是最终a是否等于3 关键是要看三元表达式的返回值是什么，因为if就是以三元表达式的返回值来做判断的  你说的什么，我完全不懂。[/quote]   int a = 1, b = 2, c = 3; int x = (a == 0 ? b : c);//如果a=0，表达式返回值是b（即x的值为b）；a!=0，表达式返回值是c（即x的值是c）。  如果这样，还是不是你想要的判断条件呢[/quote]   对呀，我要判断什么呢？[/quote]  如果像上面例子那样，不管a是不是等于0，返回不是2就是3，也就是if都是真的，这有啥意义额。。[/quote]  他的程序并不是这样的。 if(S->sys.ExactMatch == 0 ? index[i].bmnum >= inputnum : index[i].bmnum == inputnum) 如果S->sys.ExactMatch == 0成立，则if语句的条件是index[i].bmnum >= inputnum是否成立； 如果S->sys.ExactMatch == 0不成立，则if语句的条件是index[i].bmnum == inputnum是否成立。

引用 7 楼 sholber 的回复:[quote=引用 6 楼 FightForProgrammer 的回复:] [quote=引用 4 楼 sholber 的回复:] [quote=引用 3 楼 FightForProgrammer 的回复:] 试验了一下，个人感觉不行。 比如 int x = (a == 3 ? b : c); 整个三元表达式的返回值 是b或者c，而不是最终a是否等于3 关键是要看三元表达式的返回值是什么，因为if就是以三元表达式的返回值来做判断的  你说的什么，我完全不懂。[/quote]   int a = 1, b = 2, c = 3; int x = (a == 0 ? b : c);//如果a=0，表达式返回值是b（即x的值为b）；a!=0，表达式返回值是c（即x的值是c）。  如果这样，还是不是你想要的判断条件呢[/quote]   对呀，我要判断什么呢？[/quote]  如果像上面例子那样，不管a是不是等于0，返回不是2就是3，也就是if都是真的，这有啥意义额。。

引用 6 楼 FightForProgrammer 的回复:[quote=引用 4 楼 sholber 的回复:] [quote=引用 3 楼 FightForProgrammer 的回复:] 试验了一下，个人感觉不行。 比如 int x = (a == 3 ? b : c); 整个三元表达式的返回值 是b或者c，而不是最终a是否等于3 关键是要看三元表达式的返回值是什么，因为if就是以三元表达式的返回值来做判断的  你说的什么，我完全不懂。[/quote]   int a = 1, b = 2, c = 3; int x = (a == 0 ? b : c);//如果a=0，表达式返回值是b（即x的值为b）；a!=0，表达式返回值是c（即x的值是c）。  如果这样，还是不是你想要的判断条件呢[/quote]  对呀，我要判断什么呢？

引用 4 楼 sholber 的回复:[quote=引用 3 楼 FightForProgrammer 的回复:] 试验了一下，个人感觉不行。 比如 int x = (a == 3 ? b : c); 整个三元表达式的返回值 是b或者c，而不是最终a是否等于3 关键是要看三元表达式的返回值是什么，因为if就是以三元表达式的返回值来做判断的  你说的什么，我完全不懂。[/quote]   int a = 1, b = 2, c = 3; int x = (a == 0 ? b : c);//如果a=0，表达式返回值是b（即x的值为b）；a!=0，表达式返回值是c（即x的值是c）。  如果这样，还是不是你想要的判断条件呢

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

引用 3 楼 FightForProgrammer 的回复:试验了一下，个人感觉不行。 比如 int x = (a == 3 ? b : c); 整个三元表达式的返回值 是b或者c，而不是最终a是否等于3 关键是要看三元表达式的返回值是什么，因为if就是以三元表达式的返回值来做判断的  你说的什么，我完全不懂。

肯定行，试下就知道了

能.................


以管理员身份运行


Question: 新手第一帖，想请教下关于格式化输入scanf配合switch的问题的讨论

哦，原来如此，我对标准输入输出流了解还不够深，终于找到原因啦，太谢谢了。

你需要 fflush(stdout);

#include <stdio.h> #define TRUE 1 #define FALSE 0 char DisplayMenu() {     int order;      printf("**The order list is as follows:\n");     printf("**10 - do what\n");     printf("**11 - do what\n");     printf("**20 - do what\n");     printf("**21 - do what\n");     printf("**30 - do what\n");     printf("**31 - do what\n");     printf("**00 - Exit\n");     while (1) {         printf("Please input your order:");fflush(stdout);         rewind(stdin);         if (1==scanf("%d", &order)) {             if (order==0              || order==10              || order==11              || order==20              || order==21              || order==30              || order==31) {                 break;             }         }         printf("Illegal order!\n");     }     return order; } char ExecuteOrder(char order) {     switch (order) {     case 10: {             do what                 return TRUE;         }     case 11: {             do what                 return TRUE;         }     case 20: {             do what                 return TRUE;         }     case 21: {             do what                 return TRUE;         }     case 30: {             do what                 return TRUE;         }     case 31: {             do what                 return TRUE;         }     case 0: {             return FALSE;         }     } } int main(void) {     char instruction = 0;     char flag = TRUE;     while(flag) {         instruction = DisplayMenu();         flag = ExecuteOrder(instruction);     }     return 0; }


Question: 三维数组的赋值与调用问题，求帮忙看看问题出哪了？急急急！！！！求各路大神帮忙！！！

for(j=0; j<=4; j++)    { for (l=0; l<=4; l++) { //循环1的内层循环 for (ii=0; ii<=4; ii++) { if (0 == ii) { d[ii][j][l] = ((1/2)*T[ii+1][j][l] + T[ii][j-1][l]+T[ii][j+1][l]+T[ii][j][l-1]+T[ii][j][l+1]+((1/F0)-5)*T[ii][j][l]);  你看看这段吧 如果j=0,或者j=4时， j-1,j+1是不是有问题。其他的都类似去排查

调试吧。。。爱莫能助

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


Question: 三维数组的赋值与调用问题，求帮忙看看问题出哪了 问题？急急急！求各路大神帮忙，感激不尽！！！！！！

一步步调试看下呗...


Question: 三维数组的赋值与调用问题，求帮忙看看问题出哪了

在你另外一个帖子里面回复了，去看看吧

运行以后d的值除了前5个其余都是零，但实际计算结果不是0，应该是500，而且每一次的循环好像不能执行。

运行以后d的值除了前5个其余都是零，但实际计算结果不是0，应该是500，这是运行结果

有什么问题啊？


Question: MFC登录、注册数据库无法连接

删了那一行问题依旧，没有什么变化啊

login login; if(IDOK==login.DoModal()) { } //else exit(0); //--删除这行


Question: 如何输入一组不定长度的数组

你可以使用标准模板库中的几种，比如std::vector，使用起来很方便，而且效率也很高

动态申请数组。  另外就是设置一个足够长的。

struct info{     int size;     char data[0]; };  楼主查找下零长数组，就知道如何在C语言实现变长数组的使用了

写一个函数计算总长，然后用malloc动态开辟空间。

malloc、realloc、free

#include<stdio.h> #include<malloc.h>  // 使用系统栈临时保存，保存数量受系统栈大小限制 // 参数1是个计数器，参数2用于返回int数组 // 返回元素数量 size_t getInts(int n,int **pns) { 	char c; 	if(!pns)return 0; 	// 过滤无效字符 	while((c=getchar())!='\n'&&(c<'0'||c>'9')&&c!='+'&&c!='-'); 	if(c=='\n') 	{ 		*pns=(int*)malloc(sizeof(int)*n); 		return 0; 	} 	else 	{ 		int a=0;size_t sz; 		ungetc(c,stdin);// 将c放回缓冲区 		scanf("%d",&a); 		sz=getInts(n+1,pns); 		if(!*pns) 			return 0; 		else 		{ 			(*pns)[n]=a; 			return sz+1; 		} 	} }  int main() { 	int* ns=NULL; 	size_t sz=getInts(0,&ns),i; 	if(ns) 	{ 		for(i=0;i<sz;++i) 			printf("%d\n",ns[i]); 		free(ns); 	} 	return 0; }

是在C语言中实现的，不指定输入的数字个数

#include<stdio.h> int main() { 	int i,j;     int a[1000000]; printf("请输入你想输入的数字的个数：\n"); scanf("%d",&j); printf("请输入你的数组：\n"); for(i=0;i<j;i++) scanf("%d",&a[i]); return 0; }

STL中的容器倒是现成的好工具

你可以用容器试试

C99好像已经支持了用变量做数组大小参数： #include<stdio.h>  #include<stdlib.h>  int main()  {int number;  int i;  printf("请输入数量；\n");  scanf("%d",&number);   int a[number];  for(i=0;i<number;i++)  {printf("a[%d]=",i);  scanf("%d",&a[i]);}  for(i=number-1;i>=0;i--)  {printf("a[%d]=%d\n",i,a[i]);}  free(a);  return 0;   } 两种方法，咱们共勉

#include<stdio.h> #include<stdlib.h> int main() {int number; int *a; int i; printf("请输入数量；\n"); scanf("%d",&number);  a=(int*)malloc(number*sizeof(int));//int*a=(int*)malloc(n*sizeof(int)); for(i=0;i<number;i++) {printf("a[%d]=",i); scanf("%d",&a[i]);} for(i=number-1;i>=0;i--) {printf("a[%d]=%d\n",i,a[i]);} free(a); return 0;  }  这次好多了  楼主希望对你有帮助的哦

#include<stdio.h> #include<stdlib.h> int main() {int number; int *a; int i; printf("请输入数量；\n"); scanf("%d",&number);  a=(int*)malloc(number*sizeof(int));//int*a=(int*)malloc(n*sizeof(int)); for(i=0;i<number;i++) {printf("a[%d]=",i); scanf("%d",&a[i]);} for(i=number-1;i>0;i--) {printf("a[%d]=%d",i-1,a[i]);} free(a); return 0;  }  这个应该更好些  至少我是这么认为，不喜勿喷

malloc realloc

malloc函数好像可以申请动态内存   好像可以这么做  前两天看到的   表示也是小白

#include"stdio.h" #include"malloc.h"//malloc()函数被包含在malloc.h里面 int main(void) {   char*a=NULL;//声明一个指向a的char*类型的指针       a=(char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址，然后赋值给a   if(!a)//如果malloc失败，可以得到一些log           { perror("malloc"); return-1; }   sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址      printf("%s\n",a);//输出用户输入的数据       free(a);//释放掉使用的内存地址   return 0;//   }


Question: 关于文件读写问题，求帮忙看看代码！谢谢！

if((fp=fopen("addressbook.txt","ab"))==NULL) 	{ 		printf("\n\t\tOpen fail!"); 		exit(0); 	} 保存的时候，用追加的方式， w会把之前写的覆盖。

单看save和read没有问题


Question: 帮我看我的程序，实在找不出那个地方出问题了。

引用 楼主 qq_28456621 的回复:#include<stdio.h> int main() {     float a; 	int c=1,f=1,g,p=1,sum=0,l,n,z=0; 	int b[1000],d; 	printf("请输入学生人数："); 	scanf("%d",&d); loop2:for(;f<=d;f++) 	{         printf("请输入学号为"); 	    printf("%d",f);         printf("学生成绩：0~100的实数。 \n"); 		break; 	} loop:scanf("%f",&a); 		 if((a<=100)&&(a>=0)) 			 	 	while(c<=d) 	{ 		c++; 		b[c]=a; 		f++; 		goto loop2; 	} 					//printf("%2.1f\n",a); 		 else { 			 printf("输入范围有误，请重新输入：0~100的实数。\n");          goto loop; 		 } 	 	c=1; 		f=1; loop3:for(;f<=d;f++) 	{         printf("学号为"); 	    printf("%d",f);         printf("学生成绩为:\t"); 		break; 	} 	while(c<=d) 	{ 		c++; 		printf("%d",b[c]); 			printf("\n"); 			f++; 			goto loop3; 	} loop4:printf("\n"); 	printf("\n"); 	printf("1.学生的平均成绩\n"); 	printf("2.学生及格的人数\n"); 	printf("3.学生不及格的人数\n"); 	printf("4.学生的排名\n"); 	printf("\n"); 	printf("请输入要查询的编号，按Enter。"); 	scanf("%d",&g); 	if(g==1){ 		for(c=1;c<=d;c++) 		{ 		sum=sum+b[c]; 		} 		l=sum/d; 		printf("%d",l); 	}else if(g==2){for(c=1;c<=d;c++) 			{ 				if(b[c]>=60)n++; 			} 				printf("%d",n); 	}else if(g==3){for(c=1;c<=d;c++) 				{ 					if(b[c]<=60)n++; 				} 				printf("%d",n); 	}else if(g==4){for(c=1;c<=d;c++) 					{ 						if(b[c]<=b[c++]) 						{ 							z=b[c]; 							b[c]=b[c++]; 							b[c++]=z; 						} 	} 	} 	goto loop4;   system("pause"); } 呵呵，又是学生管理系统。。。。 看了你的程序，我有几点建议： 1、改进程序风格，尽量不用goto 2、变量命名尽可能取有意义的名字，而不是a b c d这些 3、{和}最好单独占用一行，这个和个人风格有关，如果你觉得你这种写法最漂亮清晰，你可以维持，我觉得单独占一行要比你这么写清晰漂亮的多。 4、if else 如果前面用了代码块，后面最好保持风格统一，建议无论语句多少都使用复合语句代码块。 5、main函数应该简短并只负责功能驱动，如果代码量少没什么关系，如果代码量多，你这么写将降低程序可读性，建议合理划分具体功能，定义具体函数，共同完成相关的功能。

引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 jack960330 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 为什么你不能像我一样，一点点提出建议，而是发一段在话呢，很容易被人认为你是copy的[/quote] 我copy我自己的也侵权吗？证明NM是NM？[/quote] 比别误会啊，我不是这个意思

引用 4 楼 jack960330 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 为什么你不能像我一样，一点点提出建议，而是发一段在话呢，很容易被人认为你是copy的[/quote] 我copy我自己的也侵权吗？证明NM是NM？

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

修改如下：  #include<stdio.h> int main() { 	float a; 	int c = 1, f = 1, g, p = 1, sum = 0, l, n, z = 0; 	int b[1000], num[1000], d; 	printf("请输入学生人数："); 	scanf("%d", &d); 	//读入学生的成绩 	while (f <= d) 	{ 		printf("请输入学号为%d学生成绩：0~100的实数:"); 		scanf("%f", &a); 		if ((a <= 100) && (a >= 0)) 		{ 			b[c] = a; 		} 		else printf("输入范围有误，请重新输入：0~100的实数。\n"); 	} 	c = 1; 	f = 1; 	//打印学生成绩 	for (; f <= d; f++) printf("学号为%d的学生的成绩为:%d\n", f, b[c++]); loop4: 	printf("\n"); 	printf("\n"); 	printf("1.学生的平均成绩\n"); 	printf("2.学生及格的人数\n"); 	printf("3.学生不及格的人数\n"); 	printf("4.学生的排名\n"); 	printf("\n"); 	printf("请输入要查询的编号，按Enter。"); 	scanf("%d", &g); 	if (g == 1) { 		for (c = 1; c <= d; c++) 		{ 			sum = sum + b[c]; 		} 		l = 1.0 * sum / d; 		printf("%d", l); 	} 	else if (g == 2) { 		for (c = 1; c <= d; c++) 		{ 			if (b[c] >= 60)n++; 		} 		printf("%d", n); 	} 	else if (g == 3) { 		for (c = 1; c <= d; c++) 		{ 			if (b[c] <= 60) n++; 		} 		printf("%d", n); 	} 	else if (g == 4) { 		for (c = 1; c <= d; c++) 		{ 			num[c] = c; 			for (p = c + 1; p <= d; p++) 			{ 				num[p] = p; 				if (b[c] < b[p]) 				{ 					z = b[c]; 					b[c] = b[p]; 					b[p] = z; 					z = num[c]; 					num[c] = num[p]; 					num[p] = z; 				} 			} 			pirntf("%3d", num[c]);   //打印学号 		} 		printf('\n'); 	} 	goto loop4; 	system("pause"); }


Question: ACLlib做一个用户输入的界面，TAT感觉无从下手啊，求助

dos不就满足你说的么..


Question: 逐行读取数据到嵌套结构体怎么申请空间

引用 4 楼 zhangxiangDavaid 的回复:定位到具体的代码行？ extern "C" static int __cdecl CheckBytes(         unsigned char * pb,         unsigned char bCheck,         size_t nSize         ) {         int bOkay = TRUE;         while (nSize--)         {             if (*pb++ != bCheck)  //中断             { /* Internal error report is just noise; calling functions all report results - JWM */ /*                _RPT3(_CRT_WARN, "memory check error at 0x%p = 0x%02X, should be 0x%02X.\n", */ /*                    (BYTE *)(pb-1),*(pb-1), bCheck); */                 bOkay = FALSE;             }         }         return bOkay; }

定位到具体的代码行？

引用 2 楼 zhangxiangDavaid 的回复:稍作修改：  typedef struct { 	int x; 	int y; }PeakData; typedef struct { 	int label; 	int peakCount; 	PeakData* peaks; }MaterialData; int main(void) { 	int i = 0; 	int s = 0; 	int m = 0; 	int n = 100; 	int label1; 	int peakCount1; 	int x1, y1; 	char buf[50]; 	MaterialData *m_all; 	m_all = (MaterialData *)malloc(m_all, n*sizeof(MaterialData)); 	while (1) 	{ 		if (100 == i) 		{ 			n += 100; 			m_all = (MaterialData *)realloc(m_all, n*sizeof(MaterialData)); 		} 		if (NULL == fgets(buf, 50, fp)) break; 		if (4 != sscanf(buf, "%d%d%d%d", &label1, &peakCount1, &x1, &y1)) continue; 		m_all[i].peaks = malloc(sizeof(PeakData));    //为peaks分配指向 		//threshold哪里来的？ 		if (label1 == s) { 			m_all[i].label = label1; 			m_all[i].peakCount = peakCount1; 			m_all[i].peaks[m].x = x1; 			m++; 			s = label1; 		} 		else { 			i++; 			m = 0; 			m_all[i].label = label1; 			m_all[i].peakCount = peakCount1; 			m_all[i].peaks[m].x = x1; 			m++; 			s = label1; 		} 	} 	return 0; }  还是有问题：读取位置 0xcdcdcdc8 时发生访问冲突

求教


Question: 中文文档如何去掉停用词

想问下这里的src.txt格式有要求吗？我对中文文档分词，用“/”作为分隔符，怎么去除停用词前后没变化，停用词没去掉呢？

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

我都已经验证过，你自己找下错误

大神大神……txt 的地址我也更改为相对应的地址了，试验之后无错误……但是……为什么编译之后显示停止工作，求指教

引用 2 楼 shaqkoko54 的回复:我想问一下楼上，src是要去停用词的文件么？des是去停用词后存储的文件么？  还想知道一下……为什么显示结果有误…请大神指教  你的src和des的理解是正确的， 加上头文件 #incldue<stdio.h> #include<string.h>

一个简易的例子：  int main(void) { 	int i, n; 	FILE *fstop, *fs, *fd; 	if (NULL == (fstop = fopen("stop.txt", "r"))) return 1; 	if (NULL == (fs = fopen("src.txt", "r"))) return 1; 	if (NULL == (fd = fopen("des.txt", "w"))) return 1; 	char stop[100][30];   //100个停用词，够吗？ 	char buf[256];        //一行255个字符，够吗？ 	//读入停词表 	n = 0; 	while (1) 	{ 		if (NULL == fgets(buf, 256, fstop)) break; 		if ('\n' == buf[0]) continue;   //空行 		buf[strlen(buf) - 1] = 0;       //去掉'\n' 		strcpy(stop[n++], buf); 	} 	fclose(fstop); 	while (1) 	{ 		if (NULL == fgets(buf, 256, fs)) break; 		if ('\n' == buf[0]) continue;   //空行 		buf[strlen(buf) - 1] = 0;       //去掉'\n' 		for (i = 0; i < n; i++) 		{ 			char *p = buf; 			int len = strlen(stop[i]); 			while (p = strstr(p, stop[i])) 			{ 				memmove(p, p + len, strlen(p + len) + 1); 			} 		} 		fprintf(fd, "%s\n", buf); 	} 	fclose(fs); 	fclose(fd); 	return 0; }


Question: 求解此程序中的数据结构

RSA就几个数，是不是要这样  struct ras_key{    int n,p,q,e,d };

那些处理的函数都能算是数据结构，因为也算个功能实现的封装

至少prime应改为：  int prime(int m)       /*判断一个数是否为素数*/ { 	int i; 	int n; 	if (m <= 1) return 0; 	n = (int)sqrt(m); 	for (i = 2; i <= n; i++) 		if (m % i == 0) return 0; 	return 1; }


Question: 用C语言写一个FTP的客户端程序，需要了解哪些知识？

没思路时找个开源的看看，uboot，busybox里有的

一、需要的知识点： 1、SOCKET技术，网络编程的基本功能 2、FTP 3、如果需要自己写，可能需要熟悉各个网络框架 二、编写FTP所需要掌握的框架 1、wininet 2、libcurl

Unix/linux应用编程手册

google或baidu

需要了解socket编程和ftp协议。

What is NcFTPd Server?  NcFTPd is a high-performance File Transfer Protocol (FTP) server software solution for UNIX systems, designed especially for high-traffic sites and internet service providers. It is also popular among students, home users, educational sites, and businesses. NcFTPd has been providing fast, flexible, secure, and commercially supported FTP service since 1996!  The current version is: 2.8.7 (September 9, 2012).

Licensing entitles you to compile your programs and link with the compiled library code. You may distribute your compiled programs (with LibNcFTP linked with it) as you normally would; there are no royalty charges for distributing programs compiled with LibNcFTP. Please note that the source-code license does not allow you to re-distribute the LibNcFTP source code with your product. When you're ready to license the library, proceed to the ordering instructions.

LibNcFTP is an application programming interface that provides File Transfer Protocol (FTP) client services to your UNIX applications. Linking the library with your programs give you the capability to copy files to and from remote hosts using a time-tested protocol supported by almost every system connected to a TCP/IP network. Even better, you can do all of this without any user interaction!


Question: 求大神指点迷津

以管理员权限运行

你的scanf第二个形参前面是要加上&的，我看你都没加

char n; printf("\n   -------------*********欢迎使用户籍信息管理系统*********---------------\n"); printf("\n\t\t*************--请选择功能--***************"); printf("\n\t\t     --       0-退出系统       --"); printf("\n\t\t     --       1-查询个人信息   --"); printf("\n\t\t     --       2-管理员登陆     --"); printf("\n   -------------******************************************---------------\n"); scanf("%c", n);  这几行就有问题，自己单步调试，很容易。

试试单步调试。


Question: 关于C 串口发送失败？

后来解决了没有，貌似我也遇到你的问题了

红色框框是 十六进制显示接收到的。后面绿色框框是 利用字符格式 接受的。我试过其他的串口工具，竟然也是一样的现象。实在不解不解啊~~~

引用 2 楼 u011916206 的回复:[quote=引用 1 楼 u011916206 的回复:] while(str2[i]!='\0')     { SendOneByte(str2[i++]);	     }      SendrStr(str1);    SendrStr(str2); //这个肯定发布出去了··················   str2一直在++，在你发送的时候发送的时候str2是什么呢？想过吗  不好意思 看错了 ，以上无效。  建议楼主把两次str2的地址打出来，看是否是编译器优化的时候修改了str2的地址[/quote] 出现的现象太奇怪了，我利用 字符显示 就显示 “133” 我用十六进制显示，却可以都接受到。我的代码 和 结构如下图：

引用 2 楼 u011916206 的回复:[quote=引用 1 楼 u011916206 的回复:] while(str2[i]!='\0')     { SendOneByte(str2[i++]);	     }      SendrStr(str1);    SendrStr(str2); //这个肯定发布出去了··················   str2一直在++，在你发送的时候发送的时候str2是什么呢？想过吗  不好意思 看错了 ，以上无效。  建议楼主把两次str2的地址打出来，看是否是编译器优化的时候修改了str2的地址[/quote] 恩    我试试   好久没搞程序了，现在一个串口都把我搞死了···哎

引用 1 楼 u011916206 的回复:while(str2[i]!='\0')     { SendOneByte(str2[i++]);	     }      SendrStr(str1);    SendrStr(str2); //这个肯定发布出去了··················   str2一直在++，在你发送的时候发送的时候str2是什么呢？想过吗  不好意思 看错了 ，以上无效。  建议楼主把两次str2的地址打出来，看是否是编译器优化的时候修改了str2的地址


Question: 二叉树，退栈到P是什么意思？

引用 1 楼 user-3 的回复:就是从栈顶拿出来一个元素，赋值给p 也叫出栈 引用 2 楼 user-3 的回复:比如，一个二叉树只有两个结点，根结点和他的Rchild。那么 第2步把T->Rchild进栈 第3步的p=p->Lchild之后，p为空，转(4)， 第4步，栈里只有一个结点，就是第一步的T->Rchild，把它赋值给p，然后栈就空了。 谢谢 ，懂了

该子树已遍历完，当然要退栈遍历其他子树。知道所有的子树都遍历完了，就是栈为空的时候

出栈，获取栈顶元素

就是从栈顶拿出来一个元素，赋值给p 也叫出栈


Question: 请问一个结构体的问题

传入实参数组point没正确初始化

引用 5 楼 zhangxiangDavaid 的回复:[quote=引用 3 楼 xubinlife 的回复:] [quote=引用 1 楼 hnwyllmm 的回复:] 这两个数组是怎么创建的？代码贴出来看看 代码挺长的就不贴了。。 *point 数组没问题，调试的时候有结果了 material只是做了MaterialData *material定义，应该还差什么 运行的时候报错：0xC0000005: 写入位置 0x00000000 时发生访问冲突 应该就是赋值的时候有问题 [/quote] material.peaks没有分配内存，无法赋值[/quote] 感谢 ，别的地方还有个小问题，现在已经解决了

引用 6 楼 zhangxiangDavaid 的回复:双击定位到错误处，看看哪行出错 编译没错  就是调试的时候出错： material.peaks[i].x = point[i].x;      cxx0030 错误 无法计算表达式的值

双击定位到错误处，看看哪行出错

引用 3 楼 xubinlife 的回复:[quote=引用 1 楼 hnwyllmm 的回复:] 这两个数组是怎么创建的？代码贴出来看看 代码挺长的就不贴了。。 *point 数组没问题，调试的时候有结果了 material只是做了MaterialData *material定义，应该还差什么 运行的时候报错：0xC0000005: 写入位置 0x00000000 时发生访问冲突 应该就是赋值的时候有问题 [/quote] material.peaks没有分配内存，无法赋值

引用 2 楼 zhangxiangDavaid 的回复:需要提前分配好内存  material.peaks = new PeakData[n];  我按您说的添加了，可还是出现一样的问题

引用 1 楼 hnwyllmm 的回复:这两个数组是怎么创建的？代码贴出来看看 代码挺长的就不贴了。。 *point 数组没问题，调试的时候有结果了 material只是做了MaterialData *material定义，应该还差什么 运行的时候报错：0xC0000005: 写入位置 0x00000000 时发生访问冲突 应该就是赋值的时候有问题

这两个数组是怎么创建的？代码贴出来看看


Question: 有关字符动画的问题

引用 4 楼 z931680577 的回复:[quote=引用 1 楼 zjq9931 的回复:] 需要用到的技术 定时。 像素读取。 输出。 能给出一些具体代码吗[/quote] 说实在的没有：但用到的函数如下： 定时器:settimer 等待：sleep 像素读取需要对图片数据结构有一定的了解，当然也可以直接用gid，cximage等读取， 然后把像素用适当的字符代替来输出。

Linux下参考NCURSES库

console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

引用 1 楼 zjq9931 的回复:需要用到的技术 定时。 像素读取。 输出。 能给出一些具体代码吗

需要用到的技术 定时。 像素读取。 输出。


Question: 关于c语言的一个小问题

下面是程序输出 输出的数字 依次为  0.1的累加和i, i取整的值， i的值 0.1与累加次数的乘积j j取整的值  =========================== 0.0 = 0		i=0.0 == j=0.0 ==> 0 0.1 != 0		i=0.1 == j=0.1 ==> 0 0.2 != 0		i=0.2 == j=0.2 ==> 0 0.3 != 0		i=0.3 == j=0.3 ==> 0 0.4 != 0		i=0.4 == j=0.4 ==> 0 0.5 != 0		i=0.5 == j=0.5 ==> 0 0.6 != 0		i=0.6 < j=0.6 ==> 0 0.7 != 0		i=0.7 < j=0.7 ==> 0 0.8 != 0		i=0.8 < j=0.8 ==> 0 0.9 != 0		i=0.9 < j=0.9 ==> 0 1.0 != 0		i=1.0 < j=1.0 ==> 1 1.1 != 1		i=1.1 < j=1.1 ==> 1 1.2 != 1		i=1.2 < j=1.2 ==> 1 1.3 != 1		i=1.3 == j=1.3 ==> 1 1.4 != 1		i=1.4 == j=1.4 ==> 1 1.5 != 1		i=1.5 > j=1.5 ==> 1 1.6 != 1		i=1.6 > j=1.6 ==> 1 1.7 != 1		i=1.7 > j=1.7 ==> 1 1.8 != 1		i=1.8 > j=1.8 ==> 1 1.9 != 1		i=1.9 > j=1.9 ==> 1 2.0 != 2		i=2.0 > j=2.0 ==> 2 2.1 != 2		i=2.1 > j=2.1 ==> 2 2.2 != 2		i=2.2 > j=2.2 ==> 2 2.3 != 2		i=2.3 > j=2.3 ==> 2 2.4 != 2		i=2.4 > j=2.4 ==> 2 2.5 != 2		i=2.5 > j=2.5 ==> 2 2.6 != 2		i=2.6 > j=2.6 ==> 2 2.7 != 2		i=2.7 > j=2.7 ==> 2 2.8 != 2		i=2.8 > j=2.8 ==> 2 2.9 != 2		i=2.9 > j=2.9 ==> 2 3.0 != 3		i=3.0 > j=3.0 ==> 3 3.1 != 3		i=3.1 > j=3.1 ==> 3 3.2 != 3		i=3.2 > j=3.2 ==> 3 3.3 != 3		i=3.3 > j=3.3 ==> 3 3.4 != 3		i=3.4 > j=3.4 ==> 3 3.5 != 3		i=3.5 > j=3.5 ==> 3 3.6 != 3		i=3.6 > j=3.6 ==> 3 3.7 != 3		i=3.7 > j=3.7 ==> 3 3.8 != 3		i=3.8 > j=3.8 ==> 3 3.9 != 3		i=3.9 > j=3.9 ==> 3 4.0 != 4		i=4.0 > j=4.0 ==> 4 4.1 != 4		i=4.1 > j=4.1 ==> 4 4.2 != 4		i=4.2 > j=4.2 ==> 4 4.3 != 4		i=4.3 > j=4.3 ==> 4 4.4 != 4		i=4.4 == j=4.4 ==> 4 4.5 != 4		i=4.5 == j=4.5 ==> 4 4.6 != 4		i=4.6 < j=4.6 ==> 4 4.7 != 4		i=4.7 < j=4.7 ==> 4 4.8 != 4		i=4.8 < j=4.8 ==> 4 4.9 != 4		i=4.9 < j=4.9 ==> 4 5.0 != 4		i=5.0 < j=5.0 ==> 5 5.1 != 5		i=5.1 < j=5.1 ==> 5 5.2 != 5		i=5.2 < j=5.2 ==> 5 5.3 != 5		i=5.3 < j=5.3 ==> 5 5.4 != 5		i=5.4 < j=5.4 ==> 5 5.5 != 5		i=5.5 < j=5.5 ==> 5 5.6 != 5		i=5.6 < j=5.6 ==> 5 5.7 != 5		i=5.7 < j=5.7 ==> 5 5.8 != 5		i=5.8 < j=5.8 ==> 5 5.9 != 5		i=5.9 < j=5.9 ==> 5 6.0 != 5		i=6.0 < j=6.0 ==> 6 6.1 != 6		i=6.1 < j=6.1 ==> 6 6.2 != 6		i=6.2 < j=6.2 ==> 6 6.3 != 6		i=6.3 < j=6.3 ==> 6 6.4 != 6		i=6.4 < j=6.4 ==> 6 6.5 != 6		i=6.5 < j=6.5 ==> 6 6.6 != 6		i=6.6 < j=6.6 ==> 6 6.7 != 6		i=6.7 < j=6.7 ==> 6 6.8 != 6		i=6.8 < j=6.8 ==> 6 6.9 != 6		i=6.9 < j=6.9 ==> 6 7.0 != 6		i=7.0 < j=7.0 ==> 7 7.1 != 7		i=7.1 < j=7.1 ==> 7 7.2 != 7		i=7.2 < j=7.2 ==> 7 7.3 != 7		i=7.3 < j=7.3 ==> 7 7.4 != 7		i=7.4 < j=7.4 ==> 7 7.5 != 7		i=7.5 < j=7.5 ==> 7 7.6 != 7		i=7.6 < j=7.6 ==> 7 7.7 != 7		i=7.7 < j=7.7 ==> 7 7.8 != 7		i=7.8 < j=7.8 ==> 7 7.9 != 7		i=7.9 < j=7.9 ==> 7 8.0 != 7		i=8.0 < j=8.0 ==> 8 8.1 != 8		i=8.1 < j=8.1 ==> 8 8.2 != 8		i=8.2 < j=8.2 ==> 8 8.3 != 8		i=8.3 < j=8.3 ==> 8 8.4 != 8		i=8.4 < j=8.4 ==> 8 8.5 != 8		i=8.5 < j=8.5 ==> 8 8.6 != 8		i=8.6 < j=8.6 ==> 8 8.7 != 8		i=8.7 < j=8.7 ==> 8 8.8 != 8		i=8.8 < j=8.8 ==> 8 8.9 != 8		i=8.9 < j=8.9 ==> 8 9.0 != 8		i=9.0 < j=9.0 ==> 9 9.1 != 9		i=9.1 < j=9.1 ==> 9 9.2 != 9		i=9.2 < j=9.2 ==> 9 9.3 != 9		i=9.3 < j=9.3 ==> 9 9.4 != 9		i=9.4 < j=9.4 ==> 9 9.5 != 9		i=9.5 < j=9.5 ==> 9 9.6 != 9		i=9.6 < j=9.6 ==> 9 9.7 != 9		i=9.7 < j=9.7 ==> 9 9.8 != 9		i=9.8 < j=9.8 ==> 9 9.9 != 9		i=9.9 < j=9.9 ==> 9 10.0 != 9		i=10.0 < j=10.0 ==> 10 10.1 != 10		i=10.1 < j=10.1 ==> 10 10.2 != 10		i=10.2 < j=10.2 ==> 10 10.3 != 10		i=10.3 < j=10.3 ==> 10 10.4 != 10		i=10.4 < j=10.4 ==> 10 10.5 != 10		i=10.5 < j=10.5 ==> 10 10.6 != 10		i=10.6 < j=10.6 ==> 10 10.7 != 10		i=10.7 < j=10.7 ==> 10 10.8 != 10		i=10.8 < j=10.8 ==> 10 10.9 != 10		i=10.9 < j=10.9 ==> 10 11.0 != 10		i=11.0 < j=11.0 ==> 11 11.1 != 11		i=11.1 < j=11.1 ==> 11

浮点数运算有误差。尽量不要对浮点数比较相等，比较大小时也要尽量加上一个极小的冗余值。  下面的代码可显示，10个0.1累加是小于10的，N个0.1相加与N*0.1多数情况下是不相等的，有大有小。      1  #include <stdio.h>   2    3    4 int main()   5 {   6         double i;   7         int n=0;   8         double j;   9         for(i=0;i!=10;i+=0.1, n++)  10         {  11                 j = n*0.1;  12                 int x = (int)i;  13                 char* s;  14                 if (i==x) s = "=";  15                 else s = "!=";  16                 printf("%.1f %s %d\t\t",i, s, x);  17   18                 int k = (int)j;  19                 if (i<j) printf("i=%.1f < j=%.1f ==> %d\n", i,j,k);  20                 else if (i==j) printf("i=%.1f == j=%.1f ==> %d\n", i,j,k);  21                 if (i>j) printf("i=%.1f > j=%.1f ==> %d\n", i,j,k);  22                 if(i>11)  23                         break;  24         }  25         return 0;  26 }


Question: 写一函数，输入一个十六进制数，输出相应的十进制数。编译成功，调试结果出错

此贴未解决。

这样写太复杂了，用个简单的办法。

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

引用 16 楼 u013409439 的回复:[quote=引用 15 楼 wenpinglaoyao 的回复:] [quote=引用 14 楼 u013409439 的回复:] [quote=引用 11 楼 wenpinglaoyao 的回复:] [quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：[/quote]  问题来了，二者编译的结果并没有任何变化啊~！[/quote]  有变化吧，最起码我把那句【getchar】给注释掉了。。。[/quote] 亲，真的没有，你把注释拿掉试试[/quote]  注释去掉了，结果如图所示：

引用 15 楼 wenpinglaoyao 的回复:[quote=引用 14 楼 u013409439 的回复:] [quote=引用 11 楼 wenpinglaoyao 的回复:] [quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：[/quote]  问题来了，二者编译的结果并没有任何变化啊~！[/quote]  有变化吧，最起码我把那句【getchar】给注释掉了。。。[/quote] 亲，真的没有，你把注释拿掉试试

引用 14 楼 u013409439 的回复:[quote=引用 11 楼 wenpinglaoyao 的回复:] [quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：[/quote]  问题来了，二者编译的结果并没有任何变化啊~！[/quote]  有变化吧，最起码我把那句【getchar】给注释掉了。。。

引用 11 楼 wenpinglaoyao 的回复:[quote=引用 10 楼 u013409439 的回复:] [quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：[/quote]  问题来了，二者编译的结果并没有任何变化啊~！

引用 8 楼 tianxia2s 的回复:七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、

引用 7 楼 wenpinglaoyao 的回复:哎，现在的人啊，太浮躁！ 楼上的网友根本就不认真回答楼主的问题，你们认为扔给他一个备胎就能让他安心忘记这个疑惑了？？这完全是授人鱼或授人渔的问题好吗？楼主，您的代码问题全处在第25行代码【c = getchar()】上，因为它的存在，多喝掉您一个输入，仅此而已  怎么处理？删掉吗？删掉编译结果还是这样~

引用 9 楼 u013409439 的回复:[quote=引用 7 楼 wenpinglaoyao 的回复:] 哎，现在的人啊，太浮躁！ 楼上的网友根本就不认真回答楼主的问题，你们认为扔给他一个备胎就能让他安心忘记这个疑惑了？？这完全是授人鱼或授人渔的问题好吗？楼主，您的代码问题全处在第25行代码【c = getchar()】上，因为它的存在，多喝掉您一个输入，仅此而已  怎么处理？删掉吗？删掉编译结果还是这样~[/quote] 再看代码【照抄您的，做了一点小小改变，注释了那句getchar】：  #include<stdio.h> #define MAX 1000 void main() {     int htoi(char s[]);     int c, i, flag, flag1;     char t[MAX];     i = 0;      flag = 0;     flag1 = 1;     printf("\ninput a HEX number:");     while ((c = getchar() )!= '\0'&&i < MAX && flag1)     {          if (c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F')         {             flag = 1;             t[i++] = c;         }         else if (flag)         {             t[i] = '\0';             printf("decimal number %d:\n", htoi(t));             printf("continue or not?");             //c = getchar();             if (c == 'N' || c == 'n')                 flag1 = 0;             else             {                 flag = 0;                 i = 0;                 printf("\ninput a HEX number:");             }         }     } }   int htoi(char s[]) {     int i, n;     n = 0;     for (i = 0; s[i] != '\0'; i++)     {         if(s[i] >= '0' && s[i] <= '9')             n = n * 16 + s[i] - '0';         if (s[i] >= 'a' && s[i] <= 'f')             n = n * 16 + s[i] - 'a' + 10;         if (s[i] >= 'A' && s[i] <= 'F')             n = n * 16 + s[i] - 'A' + 10;     }     return(n); }

引用 10 楼 u013409439 的回复:[quote=引用 8 楼 tianxia2s 的回复:] 七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。 你什么都没有改吗？删掉楼上那个还是不行、[/quote] 先看结果：

七楼正确，运行了楼主的代码，发现结果与楼主的结果不同，当时感觉就是好奇怪。

1. 建议给这一行加几个括号         if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')) 我不记得&&和||的优先级，加了括号踏实一点。  2. 如果出错有两个可能：htoi出错，或者输入部分出错。建议在htoi一开始就printf("%s\n", s);这样就可以判断是哪边的问题。 目测htoi感觉没错。我个人习惯把后两个if改成“else if"，不过这不是本质问题。

引用 1 楼 zhangxiangDavaid 的回复:你这太麻烦了，  int main(void) { 	char str[11]; 	scanf("%s", str); 	long l; 	sscanf(str, "%x", &l); 	printf("l=%d\n", l); 	return 0; } //16 //l=22  这是书上课后题的答案~

引用 3 楼 yaojuntong77 的回复:[quote=引用 2 楼 yaojuntong77 的回复:] 是的，代码太麻烦了，你看看这个函数合用不：  百度百科：sprintf函数 原型 int sprintf( char *buffer, const char *format, [ argument] … ); 参数列表 buffer：char型指针，指向将要写入的字符串的缓冲区。 format：格式化字符串。 [argument]...：可选参数，可以是任何类型的数据。 返回值 字符串长度（strlen）  入参用一个字符串，检测用户是不是输入的十六进制格式，并且确保切掉用户输入的首部0x记号， 然后设置一个十六进制转十进制函数，出参最好设置成堆上动态申请的字符串，外部输出限时完成后由调用方释放该字符串的堆内存；这样可以确保用户输入的数据过大时，常规整型容纳不下的问题  当然咯，你也可以用普通方式记录下来，然后输出转换后的字符串，这样就不用动态申请内存了   刚才一不小心点了：[Ctrl] + [Enter] [/quote] 额额，我还没有看到指针~~

引用 2 楼 yaojuntong77 的回复:是的，代码太麻烦了，你看看这个函数合用不：  百度百科：sprintf函数 原型 int sprintf( char *buffer, const char *format, [ argument] … ); 参数列表 buffer：char型指针，指向将要写入的字符串的缓冲区。 format：格式化字符串。 [argument]...：可选参数，可以是任何类型的数据。 返回值 字符串长度（strlen）  入参用一个字符串，检测用户是不是输入的十六进制格式，并且确保切掉用户输入的首部0x记号， 然后设置一个十六进制转十进制函数，出参最好设置成堆上动态申请的字符串，外部输出限时完成后由调用方释放该字符串的堆内存；这样可以确保用户输入的数据过大时，常规整型容纳不下的问题  当然咯，你也可以用普通方式记录下来，然后输出转换后的字符串，这样就不用动态申请内存了   刚才一不小心点了：[Ctrl] + [Enter]

是的，代码太麻烦了，你看看这个函数合用不：


Question: C语言结构初学的一个小问题，求大神。

使用p++;可如下：  #include <stdio.h> #define N 10 struct student { 	int num; 	char name[10]; 	float point; }; void input(struct student *p) { 	struct student *q = p; 	for (; p != q + N; p++) 	{ 		printf("Input num:"); 		scanf("%d", &(*p).num); 		printf("Input name:"); 		scanf("%s", &(*p).name); 		printf("Input point"); 		scanf("%f", &(*p).point); 	} } struct student *imax(struct student *p) { 	struct student *q, *r; 	q = r = p; 	for (p++; p != q + N; p++) 	{ 		if ((*p).point > (*r).point) r = p; 	} 	return r; } int main() { 	struct student *p; 	struct student stu[N]; 	input(stu); 	imax(stu); 	p = imax(stu); 	printf("%d %s %f", (*p).num, (*p).name, (*p).point); 	return 0; }

引用 1 楼 zhao4zhong1 的回复:#include <stdio.h> #define N 10 struct student{     int num;     char name[10];     float point; }; void input(struct student *p) {     for (int i=0;i<N;i++)     {         printf("%d/%d\n",i+1,N);         printf("Input num:");fflush(stdout);         scanf("%d", &p[i].num);         printf("Input name:");fflush(stdout);         scanf("%9s", p[i].name);         printf("Input point");fflush(stdout);         scanf("%f", &p[i].point);     } } struct student *max(struct student *p) {     struct student *v;     v=p;     for (int i=1;i<N;i++)     {         if (p[i].point > v->point)         {             v=p+i;         }     }     return v; } int main() {     struct student *p;     struct student stu[N];     input(stu);     p = max(stu);     printf("%d %s %f", p->num, p->name, p->point);     return 0; }  非常感谢，不过我想问如果在input函数里用p++这样的操作能实现吗？

1：边界值N应该传入参数，输入的个数可以通过传出参数控制。 2：输出多了&，注意 scanf和printf区别。 scanf("%lf", &(*p).point); printf("%d%s%f", &(*p).num, &(*p).name, &(*p).point);   此外注意： 1：数组应该memset初始化下。 2：注意下区别整数，浮点型，char区别。     for (; (*p).num !='\0'; p++)     for (; (*p).point!= '\0'; p++)


Question: 求助大神 C语言怎么播放 MP3文件

使用bass库

之前尝试过直接用CMD调出系统播放区播放但是出现了这个问题。


Question: 关于MATLAB和c混编的问题，MATLAB调用mex文件实现

引用 1 楼 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不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！  这样做有没有考虑到数据处理的实时性问题

无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！  实在担心所谓的实时性，你不会将文件放在RAMDISK上吗。


Question: 求大神帮忙做下流程图，c语言杨辉三角的

画再完美的流程图或写再完美的伪代码，也不如一个能实际运行的实例。

伪代码,说错了

做流程图还不如用伪语言写的好


Question: 【C语言探索之旅】系列课程

盖到1000楼，我也是醉了。你可以用一个if语句来实现盖1000楼

大家请互相谅解，和气一点。我发了贴之后好久没来看了，怎么为了这点小事吵起来了呢？不值得。也许我的陈述是有不够严谨之处，你的见解也很独到。希望大家讨论技术，加油。

引用 10 楼 happyxghero 的回复:怎么说着说着就骂起来了 吓得我都忘了顶博主了

怎么说着说着就骂起来了

引用 8 楼 ypzhong 的回复:[quote=引用 7 楼 sholber 的回复:] [quote=引用 6 楼 ypzhong 的回复:]  第1点：你没有正面回答你在2楼反驳楼主是不是对的，不认错，转移另一个问题。第一个没咬到又开始咬第二个了。 第2点：就正面回答你回复我的帖子，，他的帖子有说“if()”括号里就是条件表达式吗？自己给别人身上拉泡屎，然后对着别人大骂，咬文嚼字加咬人。 第3点，我不是马甲，我是网络清理某种咬人生物的清理员，别人都叫我活雷锋。  先来看看谁的语文有问题。你不是说我没正面回答第一个问题吗？  第1点，楼主说，“条件表达式使我们可以测试变量”。这是一句非常主观的话，我可以理解为，条件表达式的主要目的和功能是测试变量。然后我举了if (1)。我的意思是，条件表达式的主要目的并非如此。  第2点，他的帖子里虽然没有说if括号里是条件表达式，但是，稍微头脑正常的人都知道他就是这个意思。如果你有疑义，请先检查自己的大脑。至于拉屎之类的，表明你不仅需要检查自己的大脑，还需要顺便检查一下自己的视力，那是幻觉。  第3点，你不是马甲，但你是候德拉姆同学。这一点，从你的文风和惯用词“有说”就看出来了。本版都是正常的大陆人，基本上没有操着港台腔伪装香港台湾人的家伙，除了你老兄。当然，你是谁我不关心。  最后，没有人咬你，是你自己咬自己，不怕咬不到自己鼻子，你是站在凳子上咬的。楼主是很谦虚的，人家看到批评意见，不管对不对，都虚心接受，都没说什么，一个外人，一个看热闹的人，反而跳踉而出，狼奔豕突，说三道四，正应了那句话：皇帝不急，急死太监。  暂时说这么多，请你批评指正，咱们热烈探讨，不盖到1000楼誓不罢休。 so long...[/quote]  还讨论个屁啦，你自己写的第一第二点都承认了是你自己主观认为的观点，并非楼主的意思。我爽到了就行，没闲工夫再和你吐口水。傻子才和你盖到1000楼。[/quote]  没有主观的认知，没有理解作者（楼主）话外意思的能力，你还看书，真有意思。 没想到被我批评让你感觉很爽，那你别走，继续盖楼。

引用 7 楼 sholber 的回复:[quote=引用 6 楼 ypzhong 的回复:]  第1点：你没有正面回答你在2楼反驳楼主是不是对的，不认错，转移另一个问题。第一个没咬到又开始咬第二个了。 第2点：就正面回答你回复我的帖子，，他的帖子有说“if()”括号里就是条件表达式吗？自己给别人身上拉泡屎，然后对着别人大骂，咬文嚼字加咬人。 第3点，我不是马甲，我是网络清理某种咬人生物的清理员，别人都叫我活雷锋。  先来看看谁的语文有问题。你不是说我没正面回答第一个问题吗？  第1点，楼主说，“条件表达式使我们可以测试变量”。这是一句非常主观的话，我可以理解为，条件表达式的主要目的和功能是测试变量。然后我举了if (1)。我的意思是，条件表达式的主要目的并非如此。  第2点，他的帖子里虽然没有说if括号里是条件表达式，但是，稍微头脑正常的人都知道他就是这个意思。如果你有疑义，请先检查自己的大脑。至于拉屎之类的，表明你不仅需要检查自己的大脑，还需要顺便检查一下自己的视力，那是幻觉。  第3点，你不是马甲，但你是候德拉姆同学。这一点，从你的文风和惯用词“有说”就看出来了。本版都是正常的大陆人，基本上没有操着港台腔伪装香港台湾人的家伙，除了你老兄。当然，你是谁我不关心。  最后，没有人咬你，是你自己咬自己，不怕咬不到自己鼻子，你是站在凳子上咬的。楼主是很谦虚的，人家看到批评意见，不管对不对，都虚心接受，都没说什么，一个外人，一个看热闹的人，反而跳踉而出，狼奔豕突，说三道四，正应了那句话：皇帝不急，急死太监。  暂时说这么多，请你批评指正，咱们热烈探讨，不盖到1000楼誓不罢休。 so long...[/quote]  还讨论个屁啦，你自己写的第一第二点都承认了是你自己主观认为的观点，并非楼主的意思。我爽到了就行，没闲工夫再和你吐口水。傻子才和你盖到1000楼。

引用 6 楼 ypzhong 的回复:[quote=引用 5 楼 sholber 的回复:] [quote=引用 4 楼 ypzhong 的回复:] [quote=引用 2 楼 sholber 的回复:] 看了你给的链接，于是有几个小问题，随便聊聊：  “if…else条件表达式 条件表达式使我们可以测试变量。 打个比方，我们可以这样说： 要是变量的值等于10，那就执行什么什么操作。” if (1) {} 这里的1也是变量吗？  “单一的if语句 逻辑： 如果 变量的值是这样 则 执行如下操作”  if (g ()) {} 这个函数调用g()，怎么来解释变量的值是哪样？  “while循环 while循环的结构是这样的： while (/* 条件 */)  {     // 重复执行的指令 }”  你的“条件”到底指的是什么？不清楚。例如： while (printf ("hello")) ; printf函数调用是条件吗？ 另外，这里没有用花括号，不也可以么？ 又在这咬人了，人家说的是”条件表达式使我们可以测试变量。“，你反驳这句话是”这里的1也是变量吗？“，你丫语文白学了，看不懂汉语吗，”可以测试变量“你要反驳也反驳”不可以测试变量“。你说你自己是不是看到就什么就想咬人。[/quote]  看你的精神状态，就知道不用别人咬了。 说话带脏字，什么家庭出身？什么大学毕业？还是先关心一下自己的修养，再来管闲事吧。  “条件表达式”在C中是有所指的，指的是： 6.5.15 Conditional operator Syntax conditional-expression:      logical-OR-expression      logical-OR-expression ? expression : conditional-expression  if语句里的那个表达式叫控制表达式： 6.8.4 Selection statements Syntax selection-statement:      if ( expression ) statement      if ( expression ) statement else statement      switch ( expression ) statement 6.8.4.1 The if statement Constraints 1 The controlling expression of an if statement shall have scalar type.  这都没搞清楚，还义愤填膺，你哪来的底气？排行老几？看你这么激动，想必是马甲？若果真如此，你的书不写也罢。[/quote]   第1点：你没有正面回答你在2楼反驳楼主是不是对的，不认错，转移另一个问题。第一个没咬到又开始咬第二个了。 第2点：就正面回答你回复我的帖子，，他的帖子有说“if()”括号里就是条件表达式吗？自己给别人身上拉泡屎，然后对着别人大骂，咬文嚼字加咬人。 第3点，我不是马甲，我是网络清理某种咬人生物的清理员，别人都叫我活雷锋。[/quote]  先来看看谁的语文有问题。你不是说我没正面回答第一个问题吗？  第1点，楼主说，“条件表达式使我们可以测试变量”。这是一句非常主观的话，我可以理解为，条件表达式的主要目的和功能是测试变量。然后我举了if (1)。我的意思是，条件表达式的主要目的并非如此。  第2点，他的帖子里虽然没有说if括号里是条件表达式，但是，稍微头脑正常的人都知道他就是这个意思。如果你有疑义，请先检查自己的大脑。至于拉屎之类的，表明你不仅需要检查自己的大脑，还需要顺便检查一下自己的视力，那是幻觉。  第3点，你不是马甲，但你是候德拉姆同学。这一点，从你的文风和惯用词“有说”就看出来了。本版都是正常的大陆人，基本上没有操着港台腔伪装香港台湾人的家伙，除了你老兄。当然，你是谁我不关心。  最后，没有人咬你，是你自己咬自己，不怕咬不到自己鼻子，你是站在凳子上咬的。楼主是很谦虚的，人家看到批评意见，不管对不对，都虚心接受，都没说什么，一个外人，一个看热闹的人，反而跳踉而出，狼奔豕突，说三道四，正应了那句话：皇帝不急，急死太监。  暂时说这么多，请你批评指正，咱们热烈探讨，不盖到1000楼誓不罢休。 so long...

引用 5 楼 sholber 的回复:[quote=引用 4 楼 ypzhong 的回复:] [quote=引用 2 楼 sholber 的回复:] 看了你给的链接，于是有几个小问题，随便聊聊：  “if…else条件表达式 条件表达式使我们可以测试变量。 打个比方，我们可以这样说： 要是变量的值等于10，那就执行什么什么操作。” if (1) {} 这里的1也是变量吗？  “单一的if语句 逻辑： 如果 变量的值是这样 则 执行如下操作”  if (g ()) {} 这个函数调用g()，怎么来解释变量的值是哪样？  “while循环 while循环的结构是这样的： while (/* 条件 */)  {     // 重复执行的指令 }”  你的“条件”到底指的是什么？不清楚。例如： while (printf ("hello")) ; printf函数调用是条件吗？ 另外，这里没有用花括号，不也可以么？ 又在这咬人了，人家说的是”条件表达式使我们可以测试变量。“，你反驳这句话是”这里的1也是变量吗？“，你丫语文白学了，看不懂汉语吗，”可以测试变量“你要反驳也反驳”不可以测试变量“。你说你自己是不是看到就什么就想咬人。[/quote]  看你的精神状态，就知道不用别人咬了。 说话带脏字，什么家庭出身？什么大学毕业？还是先关心一下自己的修养，再来管闲事吧。  “条件表达式”在C中是有所指的，指的是： 6.5.15 Conditional operator Syntax conditional-expression:      logical-OR-expression      logical-OR-expression ? expression : conditional-expression  if语句里的那个表达式叫控制表达式： 6.8.4 Selection statements Syntax selection-statement:      if ( expression ) statement      if ( expression ) statement else statement      switch ( expression ) statement 6.8.4.1 The if statement Constraints 1 The controlling expression of an if statement shall have scalar type.  这都没搞清楚，还义愤填膺，你哪来的底气？排行老几？看你这么激动，想必是马甲？若果真如此，你的书不写也罢。[/quote]   第1点：你没有正面回答你在2楼反驳楼主是不是对的，不认错，转移另一个问题。第一个没咬到又开始咬第二个了。 第2点：就正面回答你回复我的帖子，，他的帖子有说“if()”括号里就是条件表达式吗？自己给别人身上拉泡屎，然后对着别人大骂，咬文嚼字加咬人。 第3点，我不是马甲，我是网络清理某种咬人生物的清理员，别人都叫我活雷锋。

引用 4 楼 ypzhong 的回复:[quote=引用 2 楼 sholber 的回复:] 看了你给的链接，于是有几个小问题，随便聊聊：  “if…else条件表达式 条件表达式使我们可以测试变量。 打个比方，我们可以这样说： 要是变量的值等于10，那就执行什么什么操作。” if (1) {} 这里的1也是变量吗？  “单一的if语句 逻辑： 如果 变量的值是这样 则 执行如下操作”  if (g ()) {} 这个函数调用g()，怎么来解释变量的值是哪样？  “while循环 while循环的结构是这样的： while (/* 条件 */)  {     // 重复执行的指令 }”  你的“条件”到底指的是什么？不清楚。例如： while (printf ("hello")) ; printf函数调用是条件吗？ 另外，这里没有用花括号，不也可以么？ 又在这咬人了，人家说的是”条件表达式使我们可以测试变量。“，你反驳这句话是”这里的1也是变量吗？“，你丫语文白学了，看不懂汉语吗，”可以测试变量“你要反驳也反驳”不可以测试变量“。你说你自己是不是看到就什么就想咬人。[/quote]  看你的精神状态，就知道不用别人咬了。 说话带脏字，什么家庭出身？什么大学毕业？还是先关心一下自己的修养，再来管闲事吧。  “条件表达式”在C中是有所指的，指的是： 6.5.15 Conditional operator Syntax conditional-expression:      logical-OR-expression      logical-OR-expression ? expression : conditional-expression  if语句里的那个表达式叫控制表达式： 6.8.4 Selection statements Syntax selection-statement:      if ( expression ) statement      if ( expression ) statement else statement      switch ( expression ) statement 6.8.4.1 The if statement Constraints 1 The controlling expression of an if statement shall have scalar type.  这都没搞清楚，还义愤填膺，你哪来的底气？排行老几？看你这么激动，想必是马甲？若果真如此，你的书不写也罢。

引用 2 楼 sholber 的回复:看了你给的链接，于是有几个小问题，随便聊聊：  “if…else条件表达式 条件表达式使我们可以测试变量。 打个比方，我们可以这样说： 要是变量的值等于10，那就执行什么什么操作。” if (1) {} 这里的1也是变量吗？  “单一的if语句 逻辑： 如果 变量的值是这样 则 执行如下操作”  if (g ()) {} 这个函数调用g()，怎么来解释变量的值是哪样？  “while循环 while循环的结构是这样的： while (/* 条件 */)  {     // 重复执行的指令 }”  你的“条件”到底指的是什么？不清楚。例如： while (printf ("hello")) ; printf函数调用是条件吗？ 另外，这里没有用花括号，不也可以么？ 又在这咬人了，人家说的是”条件表达式使我们可以测试变量。“，你反驳这句话是”这里的1也是变量吗？“，你丫语文白学了，看不懂汉语吗，”可以测试变量“你要反驳也反驳”不可以测试变量“。你说你自己是不是看到就什么就想咬人。

给我一点时间，空间

楼主还真有心啊，直接写了一本教材出来，印刷成册吧


Question: 怎么把偏态分布转换为正态分布

偏态分布只有满足一定的条件（如样本例数够大等）才可以看做近似正态分布。  与正态分布相对而言，偏态分布有两个特点：  一是左右不对称（即所谓偏态）；  二是当样本增大时，其均数趋向正态分布。


Question: 关于结构体嵌套的问题

typedef struct {         int   label;         int   peakCount;         struct tag_PeakData {             int   x;             int   y;         } PeakData; } MaterialData;

1、第8行末尾的冒号改成分号； 2、第9行的开头，去掉struct；  更正代码如下：  typedef struct {         int   x;         int   y;  } PeakData;  typedef struct {         int   label;         int   peakCount;         PeakData  *peaks; } MaterialData;    楼主试试？

引用 1 楼 zhangxiangDavaid 的回复:修改如下：  typedef struct{     int x;     int y; }PeakData; typedef struct{     int label;      int peakCount:      //struct PeakData* peaks;  //去掉struct     PeakData* peaks; }MaterialData;  m=data[i].peaks[j].x    //这个用法没问题 多谢   其实之前没问题 struct是刚加的，之前问题出在peakCount;打成了:


Question: 如何在c文件中显示特殊的图形

_     _          _     _          _     _         (o\---/o)        (o\-~-/o)        (o\~~~/o)          ( 6 6 )          ( , , )          ( 9 9 )  ____,~~.(_(T)_),~~.__,--.{_(Y)_},--.__,--.(_(T)_),--.____ |    "--"       "--"  "--"       "--"  "~~"       "~~"    | |                                                         | |                                                         | |   _,-.    ,-._       _,-.    ,-._        _,-.    ,-._   | |__(ooO )__( Ooo)_____(ooO )__( Ooo)______(ooO )__( Ooo)__|    ((_) )  ( (_))     ((_) )  ( (_))      ((_) )  ( (_))     "--"    "--"       "~~"    "~~"        "-~"    "~-"

感觉楼主会对这个帖子感兴趣：http://bbs.csdn.net/topics/391035037 其实绘制图形就是将图形按照一定的排列方式输出即可，让小的形状组合成一个大的形状。当然楼主要是还对这些东西感兴趣，还可以去专门学习openGL绘图，相信会有收获的

搜“SigZag”

ascii码图形制作工具？

引用 2 楼 user-5 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 拼命的printf() 不过如果有些图形符号排列有些规律，可以用循环加一些控制语句来实现(同为fresh bird，我之前看到过同样的，不过不知道可不可以)[/quote] 能实现效果，怎么都行

引用 1 楼 zhangxiangDavaid 的回复:拼命的printf() 不过如果有些图形符号排列有些规律，可以用循环加一些控制语句来实现(同为fresh bird，我之前看到过同样的，不过不知道可不可以)

拼命的printf()


Question: 请各位高手帮我看看，这个程序在vs2008中编译的结果，什么地方出了问题？

多谢各位高手指点！

第二个for循环应该只包含紧跟它的if语句，你的目的是对穷举找出n的每个因子并求和。在你的源代码里，把第二个if也包含在内，就会在求n因子的过程中(还没有完全求完，只是部分因子)得到的和与n相同，然后就会输出全部。

一个高效点的版本：  int factors[100];  //存放因子 int main() { 	int n, i, j, s; 	for (n = 2; n <= 1000; n++) 	{ 		s = 0; 		j = 0; 		for (i = 1; i <= n/2; i++) 		{ 			if (n % i == 0) 			{ 				s = s + i; 				factors[j++] = i;  //记录n的因子 			} 		} 		if (s == n) 		{ 			printf("%d是完全数。它的因子是：", n); 			for (i = 0; i < j; i++) printf("%d ", factors[i]); 			printf("\n"); 		} 	} 	return 0; } //6是完全数。它的因子是：1 2 3 //28是完全数。它的因子是：1 2 4 7 14 //496是完全数。它的因子是：1 2 4 8 16 31 62 124 248

修改如下：  int main() { 	int n, i, s; 	for (n = 2; n <= 1000; n++) 	{ 		s = 0; 		for (i = 1; i < n; i++) 		{ 			if (n % i == 0) 				s = s + i; 		} 		if (s == n) 		{ 			printf("%d是完全数。它的因子是：", n); 			for (i = 1; i < n; i++) 			{ 				if (n % i == 0) 					printf("%d  ", i); 			} 			printf("\n"); 		} 	} 	return 0; }


Question: 程序运行怎么提示是（核心已转储），求大神指点！

修改如下：  #define N 100 char *delchar(char *p, char b) { 	int i, j; 	for (i = 0; p[i]; i++) 	{ 		if (p[i] == b) 		{ 			for (j = i; j < strlen(p); j++) 				p[j] = p[j + 1]; 				//return p; 		} 	} 	return p; } void main() { 	char a[N] = "yanglongfei", y; 	printf("请输入一个字符串和要要删除的字符:"); 	scanf("%s %c", a, &y);   //%s和%c之间给一个空格 	printf("%s\n", delchar(a, y)); } //zhangxiang x //zhangiang

char *delchar(char *p, char b )   {   6         int i,j;   7         char s[N];   8         p=s;   9         for(i=0; i<strlen(s); i++)  10         {  11              if(s[i]==b)  12               {   13                 for(j=i; j<strlen(s)-1; j++)  14                   s[j]=s[j+1];  15                   return p;                                     16               }  17         }  我这边调试没有你说的那个错误，不过运行还是会出错的 这个p=s是什么意思，你是想把p赋值给s吧，那也应该是s=p，但是你这样定义char s[N]，s是一个const类型的数组，不能这样赋值 #include <stdio.h>                                                           #include <string.h> #include <stdlib.h> #define N 100 char *delchar(char *p, char b,size_t len )  { 	int i,j; 	 	for(i=0; i<len; i++) 	{ 		if(p[i]==b) 		{  			for(j=i; j<len-1; j++) 				p[j]=p[j+1]; 			p[j]='\0'; 			return p;                                    		} 	} 	return NULL;  } void main() { 	char a[N],y; 	printf("请输入一个字符串和要要删除的字符:"); 	scanf("%s %c",a,&y); 	printf("%s\n",delchar(a,y,strlen(a))); 	system("pause"); }  仅供参考

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

引用 1 楼 yaojuntong77 的回复:MARK  第07行：这是个局部变量 第08行：经过赋值以后，外部传入的数组根本没用上，而是指向内部局部堆栈上的数组变量地址 第09行：i<strlen(s) 可能出现问题，因为局部数组变量还没赋值，这个strlen(s) 求出的是个可能越界的数值 第15行：所以，在这里执行 return p; 是有问题的  归纳：子函数内部，不需要申请额外的局部数组s[N], 直接使用参数 char *p 带进来的字符数组既可；       另外，在这个情况下，只要更新数组元素的值，且子函数不需要返回这个指向数组的指针，即申明返回类型为void就OK。  我来拿分哟，楼主觉得答案满意的话，请多多关照，嘻嘻  在上面的修改模式下，第25行的调用方式将发生变化，可以在外部调用完delchar(a, y); 之后，再使用：     printf("%s\n", a); 直接打印；  如果希望保留原样，那么子函数还是保留 char *返回类型和 return p;语句咯～


Question: free出错，以百度，相信很多人有这样的问题

1、我用szMessage1获得一个新的内存 2、然后将szMessage内容的值赋给szMessage1, 3、然后将szMessage指向的旧的内存释放掉 4、然后将szMessage指针指向新的内存地址szMessage1; 5、给新申请来的内存赋初值；

你分配的是给szMessage1 释放的是szMessage

在free(*(szMessage+i))时出错了

free 出错原因是 free 了 TEXT("NULL\0");  指向的内存  还有内存泄漏问题 for (i = 0; i < 4*iMsCount; i++) {   *(szMessage1+i) = (TCHAR*)malloc(sizeof(TCHAR) * 6);  // malloc 了 (4*iMsCount) 次 } //转移数据 if (szMessage != NULL) {     for (i = 0; i < 4 * (iMsCount-1); i++)     // ....     free(...)...        // 这个 free 只 free 了 4 * (iMsCount-1) 次   从代码罗辑猜测楼主的 szMessage 是一个 有 4 段 每段有 iMsCount 个字符串 最后的字符串为 "NULL"; 但最后这段代码做法有问题 szMessage = szMessage1; for (i=4*(iMsCount-1); i < 4 * iMsCount; i++) {       szMessage[i] = TEXT("NULL\0");    /// 这里需要用 copy 操作才行 } 1) 硬生生地把 szMessage[i] 原来所指向的内存掉丢了, 指向一段常量内存 2) 并不是将 每段 最后的字符串设为 "NULL"; 也就是这里引致为什么会 free 出错

malloc什么，就free什么

你提供的代码看不出 szMessage 第一次是怎么分配出来的， 大小是对少。

BOOL NewStringArray()//申请一段新的存放字符数组空间，并释放旧的字符串 { 	int i,j; 	TCHAR **szMessage1;  	//二重指针 	if (NULL == (szMessage1 = (TCHAR**)malloc(sizeof(TCHAR*)*4*iMsCount))) 	{ 		MessageBox(NULL, TEXT("字符串内存申请失败"), TEXT("提示"), MB_ICONERROR); 		return FALSE; 	}  	//一重指针 	for (i = 0; i < 4*iMsCount; i++) 	{ 		*(szMessage1+i) = (TCHAR*)malloc(sizeof(TCHAR) * 6); 	} 	//转移数据 	if (szMessage != NULL) 	{ 		for (i = 0; i < 4 * (iMsCount-1); i++) 		{ 			//if(i>=4*(iMsCount)) 			//memcpy(*(szMessage1+i),*(szMessage+i), lstrlen(szMessage[i])); 			for (j = 0; j <= lstrlen(szMessage[i]); j++) 			{ 				*(*(szMessage1 + i) + j) = *(*(szMessage + i) + j); 			} 			//*(*(szMessage1 + i) + j) = TEXT('\0'); 			free(*(szMessage+i)); 			szMessage[i] = NULL; 		} 		free(szMessage); 	} 	szMessage = szMessage1; 	szMessage1 = NULL; 	for (i=4*(iMsCount-1); i < 4 * iMsCount; i++) 	{ 		szMessage[i] = TEXT("NULL\0"); 	} 	return TRUE; }


Question: 碰到一个诡异的问题

原因很简单，没有包含math.h, 就没有exp函数的原型，所以参数传递和返回值都是错误的

说得，非常好啊

调用的每个库函数都有确定性的包含头文件的，c/c++的编译器有不少重写的库函数

这是低安全性！！！！！

在C++中没有包含头文件，是无法编译通过的 但在C语言中没有包含头文件，也是可以编译通过的 C语言中有个东西叫"隐式函数声明" 你可以在a.c中写一个函数 然后在b.c中调用它，也是能编译通过的 出错的原因楼上几位已经说到了

头文件没有，不能调用

理解和讨论之前请先学会如何观察！  计算机组成原理→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执行停在该断点处的时候。

用其它编译器

生来就是这样！TC2 也是如此 这个要追溯 C 的老祖宗的责任了

引用 13 楼 lm_whales 的回复:微软编译器好像没有隐式声明这回事吧 试试看  老式编译器是有要求的 更古老的编译器，只是对函数参数比较随意点 这个内建函数，应该是半新不旧的标准 MS 应该还没来得及实现吧  老式的C 除了scanf,printf 之外，都要求函数有声明或者定义 scanf,printf  是唯一可以直接使用的两个函数 不过后来，也有编译器（几乎所有）都要求必须 声明  也就是  #include <stdio.h>  gcc linux 都是比较新的软件，虽然比较流行，跟那些古老的编译器和操作系统比起来，还是年轻得多 C (不是C++) 最新的标准都不要求函数使用前一定要声明。 直接使用默认声明是  int func(); ===== 注意 C 里，int func(); 跟 int func(void); 不是一码事，前者对参数没有任何要求，后者不能有任何参数。

嗯，编译器怎么处理的问题。

C 语言没有对函数声明的要求，也就是不需要函数在使用前先对函数进行声明  没有声明的函数默认返回 int 。  对函数的使用与实际函数的定义不一致时，结果是不确定的。

你好，请问你是做机器视觉开发工作的人员吗？


Question: 急：c语言如何实现DOS命令:copy/B

不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

引用 5 楼 zhangxiangDavaid 的回复:[quote=引用 4 楼 lovecjyjack 的回复:] [quote=引用 1 楼 zhangxiangDavaid 的回复:] 这样可好：  FILE *fs, *fd; char buf[256]; int n; int main(int argc, char *argv[]) { 	if (3 != argc) 	{ 		printf("usage:copy filesrc filedest\n"); 		return 1; 	} 	if (NULL == (fs = fopen(argv[1], "rb"))) 	{ 		fprintf(stderr, "can not open file %s\n", argv[1]); 		return 2; 	} 	if (NULL == (fd = fopen(argv[2], "wb"))) 	{ 		fprintf(stderr, "can not create file %s\n", argv[2]); 		fclose(fs); 		return 2; 	} 	while (1) 	{ 		if (0 == (n = fread(buf, 1, 256, fs))) break; 		fwrite(buf, 1, n, fd); 	} 	fcloseall(); 	return 0; }   能具体一点吗？[/quote] 把该代码编译生成可执行程序，玩下，就知道了[/quote] 我能说直接输出usage:copy filesrc filedest吗。。。。。

引用 4 楼 lovecjyjack 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 这样可好：  FILE *fs, *fd; char buf[256]; int n; int main(int argc, char *argv[]) { 	if (3 != argc) 	{ 		printf("usage:copy filesrc filedest\n"); 		return 1; 	} 	if (NULL == (fs = fopen(argv[1], "rb"))) 	{ 		fprintf(stderr, "can not open file %s\n", argv[1]); 		return 2; 	} 	if (NULL == (fd = fopen(argv[2], "wb"))) 	{ 		fprintf(stderr, "can not create file %s\n", argv[2]); 		fclose(fs); 		return 2; 	} 	while (1) 	{ 		if (0 == (n = fread(buf, 1, 256, fs))) break; 		fwrite(buf, 1, n, fd); 	} 	fcloseall(); 	return 0; }   能具体一点吗？[/quote] 把该代码编译生成可执行程序，玩下，就知道了

引用 1 楼 zhangxiangDavaid 的回复:这样可好：  FILE *fs, *fd; char buf[256]; int n; int main(int argc, char *argv[]) { 	if (3 != argc) 	{ 		printf("usage:copy filesrc filedest\n"); 		return 1; 	} 	if (NULL == (fs = fopen(argv[1], "rb"))) 	{ 		fprintf(stderr, "can not open file %s\n", argv[1]); 		return 2; 	} 	if (NULL == (fd = fopen(argv[2], "wb"))) 	{ 		fprintf(stderr, "can not create file %s\n", argv[2]); 		fclose(fs); 		return 2; 	} 	while (1) 	{ 		if (0 == (n = fread(buf, 1, 256, fs))) break; 		fwrite(buf, 1, n, fd); 	} 	fcloseall(); 	return 0; }   能具体一点吗？


Question: 在vs2013环境下：写一个函数，使输入的一个字符串按反序存放，在主函数中输入和输出字符；编译结果不一致？

引用 10 楼 yangyunzhao 的回复:不建议用_s的函数，可能带来移植性问题  是的，10楼的考虑很周到，如果是这样的话，考虑到移植性，可以自己封装个scanf_s函数就好办了，同步关掉告警， 哈哈

引用 7 楼 yaojuntong77 的回复:建议你弄个头文件，把要关闭的告警全收集起来，然后在需要屏蔽这些告警的地方，把这个头文件包含进去，就省了打字的麻烦  比如说你定义的数组是10个元素上限，由于不带_s的函数不检测上界，这个嘛就 哈哈哈哈…… BUG很严重，BOSS很生气的  所以会有这些_s函数的诞生 哦哈哈，原来酱紫。 既然有警告那就不需要屏蔽了哇，要是屏蔽了不就出问题了还不知道了么

直接上修改后的代码给你吧：   #include <stdio.h> #include <string.h>  #define  MAX_STR_LEN   100  char * InvertStr(char * const pStr);  void main(void) { 	char  str[MAX_STR_LEN] = {'\0'};  	printf("Please input a string without any blank space key: "); 	fflush(NULL); 	scanf_s("%s", str, MAX_STR_LEN); 	printf("Before invert: %s\n", str); 	printf("After invert : %s\n", InvertStr(str)); 	putchar('\n'); }  char * InvertStr(char * const pStr) { 	char    tmpChar; 	size_t  StrLength = strlen(pStr); 	size_t  i;  	for (i=0; i<StrLength/2; i++) 	{ 		tmpChar = pStr[i]; 		pStr[i] = pStr[StrLength-i-1]; 		pStr[StrLength-i-1] = tmpChar; 	} 	return pStr; }    这个是我刚刚编译通过的

引用 5 楼 yaojuntong77 的回复:简单的说： 1、在VisualStudio2005之前的开发环境中，比如VC++6.0环境，使用了早期的库文件，所以默许scanf函数为安全函数； 2、在VisualStudio2005开始的新IDE环境中，考虑到scanf的不安全性，用scanf_s函数进行替换，然后对用户使用scanf函数进行告警性提示； 3、如果你想用安全的代码，建议用scanf_s，如果非要用scanf也可以，但是会告警，屏蔽告警的方法如下：  // 在调用到scanf函数的文件的第一行，加入如下代码： #pragma warning(disable: 4996)   谢谢！除了sacnf函数，还是gets函数等，都要用相应_s函数替代，并且要加上参数具体值限制，否则会溢出怎么样的，这其中的原理我不是太清楚，请大神给讲讲哇~

引用 2 楼 iyomumx 的回复:用scanf并关闭sdl选项，或者 scanf_s("%s", str, 100);  哦，对，我又把这事给忘了，每次换成了sacnf_s，后面的字符串数量限制还是老是忘，不知道这其中的奥妙在哪里？ 另外，请教大神：sdl选项是什么东东，怎么关闭？

引用 1 楼 user-4 的回复:char str1[2048]="hello"; char str[2048]={0}; for(int i=0;i<len;i++) {       str[len-i-1]=str1[i]; } printf("%s\n",str); 啥意思，不明觉厉额?


Question: const char *strA ="\\xE5\\085\\x8D";   // 请问怎吗变成“免”字？

搜把汉子转为16进制

char a[] = {'\xe5', '\x85', '\x8d', 0}; buffer1把'\xe5'神马的都拆开了，就不是原来的意思了。 buffer2只用了4个字符完成的，你用了13个。

Windows下还需要UTF8转Unicode，参考下面，尽管是VB6： Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long) As Long Private Declare Function WideCharToMultiByte Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpWideCharStr As Long, ByVal cchWideChar As Long, ByRef lpMultiByteStr As Any, ByVal cchMultiByte As Long, ByVal lpDefaultChar As Long, ByVal lpUsedDefaultChar As Long) As Long '常用的代码页： const cpUTF8   =65001 const cpGB2312 =  936 const cpGB18030=54936 const cpUTF7   =65000 Function MultiByteToUTF16(UTF8() As Byte, CodePage As Long) As String     Dim bufSize As Long     bufSize = MultiByteToWideChar(CodePage, 0&, UTF8(0), UBound(UTF8) + 1, 0, 0)     MultiByteToUTF16 = Space(bufSize)     MultiByteToWideChar CodePage, 0&, UTF8(0), UBound(UTF8) + 1, StrPtr(MultiByteToUTF16), bufSize End Function  Function UTF16ToMultiByte(UTF16 As String, CodePage As Long) As Byte()     Dim bufSize As Long     Dim arr() As Byte     bufSize = WideCharToMultiByte(CodePage, 0&, StrPtr(UTF16), Len(UTF16), 0, 0, 0, 0)     ReDim arr(bufSize - 1)     WideCharToMultiByte CodePage, 0&, StrPtr(UTF16), Len(UTF16), arr(0), bufSize, 0, 0     UTF16ToMultiByte = arr End Function  Private Sub Command1_Click()     MsgBox MultiByteToUTF16(UTF16ToMultiByte("ab中,c", cpUTF8), cpUTF8) End Sub

const char *strA ="\\xE5\\x85\\x8D";   // 请问怎吗变成“免”字？ char s[4]; int i,v; for (i=0;i<3;i++) {  sscanf(strA+2+i*4,"%2X",&v);  s[i]=(char)(v&0xffu); } s[3]=0; printf("[%s]\n",s);

其实我是要把 const char *strA = "\\xE5"; 变成   char *strB = "\xE5"？

unicode 兔机器码

int main(void) { 	char c1, c2; 	char s[] = "兔"; 	c1 = s[0]; 	c2 = s[1]; 	printf("%s\n", s); 	printf("%c%c\n", c1, c2); 	return 0; } //兔 //兔


Question: XP中，RasGetErrorString（）正常，但WIN7、8中，不能完整取到错误信息，什么原因？

引用 3 楼 zhao4zhong1 的回复:以管理员身份运行 以XP兼容模式运行  试了，貌似跟这两个选项无关。

以管理员身份运行 以XP兼容模式运行

测试的WIN7是32位的，WIN8当时让同事帮测，倒没注意这个问题。

没准是因为你Win 7、8是64位的。