Question: 小白求助

struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; typedef int ElementType; struct Node {     ElementType Element;     Position Next; }; //创建链表   List CreateList(); //遍历链表   void TraverseList(List L); //清空链表   List MakeEmpty(List L); //判断给定列表是否为空   int IsEmpty(List L); //判断节点在给定链表中是否为空   int IsLast(Position P, List L); //在指定的链表中查找给定元素。   //存在则返回其第一次出现的位置，不存在则返回NULL   Position Find(ElementType X, List L); //删除链表中的某个元素   void Delete(ElementType X, List L); //在指定链表中查找给定元素的前驱节点   Position FindPrevious(ElementType X, List L); //在链表给定位置的后面插入元素   void Insert(ElementType X, List L, Position P); //删除链表   void DeleteList(List L); //返回链表的头结点   Position Header(List L); //返回链表第一个数据元素节点   Position First(List L); //返回当前位置的下一个位置   Position Advance(Position P); //获取当前位置元素的值   ElementType Retrive(Position P); int IsEmpty(List L) {     return L->Next == NULL;  //你写的这个地方又报错了 } //想要实现的功能和函数名的意思不太一致 int IsLast(Position P, List L)//判断节点在给定链表中是否为空   {     //return P->Next == NULL;     if (NULL == P) return 0;     PtrToNode q = L->Next;     while (q)     {         if (P == q) return 1;         q = q->Next;     }     return 0; } Position Find(ElementType X, List L) {     Position P = L->Next;     while (P != NULL && P->Element != X)     {         P = P->Next;     }     return P; } void Delete(ElementType X, List L) {     Position P, TmpCell;     P = FindPrevious(X, L);     if (!IsLast(P, L))     {         TmpCell = P->Next;         P->Next = TmpCell->Next;         free(TmpCell);     } } Position FindPrevious(ElementType X, List L) {     Position P = L;     while (P->Next != NULL && P->Next->Element != X)     {         P = P->Next;     }     return P; } void Insert(ElementType X, List L, Position P) {     Position TmpCell;     //TmpCell = malloc(sizeof(struct Node));    //————这个地方老报错怎么回事？     TmpCell = (PtrToNode)malloc(sizeof(struct Node));    //在有些编译器下，需要这样     if (TmpCell == NULL)     {         printf("Out of space!\n");         return;     }     TmpCell->Element = X;     TmpCell->Next = P->Next;     P->Next = TmpCell; } void DeleteList(List L) {     Position P, Tmp;     P = L->Next;     L->Next = NULL;     while (P != NULL)     {         Tmp = P->Next;         free(P);         P = Tmp;     } } Position Header(List L) {     return L; } Position First(List L) {     return L->Next; } Position Advance(Position P) {     return P->Next; } ElementType Retrive(Position P) {     return P->Element; } List CreateList() {     int i;     Position P, Tmp;     List L = malloc(sizeof(struct Node));     P = L;     for (i = 0; i < 5; i++)     {         Tmp = malloc(sizeof(struct Node));         Tmp->Element = i;         P->Next = Tmp;         P = Tmp;     }     P->Next = NULL;     return L; } void TraverseList(List L) {     Position P;     P = L->Next;     while (P != NULL)     {         printf("%d\n", P->Element);         P = P->Next;     } } int main(void) {     //创建链表       List L = CreateList();     //查找元素1在链表中的位置       Position P = Find(1, L);     //在元素1后面插入元素8       Insert(8, L, P);     //查找元素8前驱结点       P = FindPrevious(8, L);     //遍历链表       TraverseList(L);     return 0; }

修改如下：   struct Node; typedef struct Node *PtrToNode; typedef PtrToNode List; typedef PtrToNode Position; typedef int ElementType; struct Node { 	ElementType Element; 	Position Next; }; //创建链表   List CreateList(); //遍历链表   void TraverseList(List L); //清空链表   List MakeEmpty(List L); //判断给定列表是否为空   int IsEmpty(List L); //判断节点在给定链表中是否为空   int IsLast(Position P, List L); //在指定的链表中查找给定元素。   //存在则返回其第一次出现的位置，不存在则返回NULL   Position Find(ElementType X, List L); //删除链表中的某个元素   void Delete(ElementType X, List L); //在指定链表中查找给定元素的前驱节点   Position FindPrevious(ElementType X, List L); //在链表给定位置的后面插入元素   void Insert(ElementType X, List L, Position P); //删除链表   void DeleteList(List L); //返回链表的头结点   Position Header(List L); //返回链表第一个数据元素节点   Position First(List L); //返回当前位置的下一个位置   Position Advance(Position P); //获取当前位置元素的值   ElementType Retrive(Position P); int IsEmpty(List L) { 	return L->Next == NULL; } //想要实现的功能和函数名的意思不太一致 int IsLast(Position P, List L)//判断节点在给定链表中是否为空   { 	//return P->Next == NULL; 	if (NULL == P) return 0; 	PtrToNode q = L->Next; 	while (q) 	{ 		if (P == q) return 1; 		q = q->Next; 	} 	return 0; } Position Find(ElementType X, List L) { 	Position P = L->Next; 	while (P != NULL && P->Element != X) 	{ 		P = P->Next; 	} 	return P; } void Delete(ElementType X, List L) { 	Position P, TmpCell; 	P = FindPrevious(X, L); 	if (!IsLast(P, L)) 	{ 		TmpCell = P->Next; 		P->Next = TmpCell->Next; 		free(TmpCell); 	} } Position FindPrevious(ElementType X, List L) { 	Position P = L; 	while (P->Next != NULL && P->Next->Element != X) 	{ 		P = P->Next; 	} 	return P; } void Insert(ElementType X, List L, Position P) { 	Position TmpCell; 	//TmpCell = malloc(sizeof(struct Node));    //————这个地方老报错怎么回事？ 	TmpCell = (PtrToNode)malloc(sizeof(struct Node));    //在有些编译器下，需要这样 	if (TmpCell == NULL) 	{ 		printf("Out of space!\n"); 		return; 	} 	TmpCell->Element = X; 	TmpCell->Next = P->Next; 	P->Next = TmpCell; } void DeleteList(List L) { 	Position P, Tmp; 	P = L->Next; 	L->Next = NULL; 	while (P != NULL) 	{ 		Tmp = P->Next; 		free(P); 		P = Tmp; 	} } Position Header(List L) { 	return L; } Position First(List L) { 	return L->Next; } Position Advance(Position P) { 	return P->Next; } ElementType Retrive(Position P) { 	return P->Element; } List CreateList() { 	int i; 	Position P, Tmp; 	List L = malloc(sizeof(struct Node)); 	P = L; 	for (i = 0; i < 5; i++) 	{ 		Tmp = malloc(sizeof(struct Node)); 		Tmp->Element = i; 		P->Next = Tmp; 		P = Tmp; 	} 	P->Next = NULL; 	return L; } void TraverseList(List L) { 	Position P; 	P = L->Next; 	while (P != NULL) 	{ 		printf("%d\n", P->Element); 		P = P->Next; 	} } int main(void) { 	//创建链表   	List L = CreateList(); 	//查找元素1在链表中的位置   	Position P = Find(1, L); 	//在元素1后面插入元素8   	Insert(8, L, P); 	//查找元素8前驱结点   	P = FindPrevious(8, L); 	//遍历链表   	TraverseList(L); 	return 0; }

TmpCell = (Position)malloc(sizeof(struct Node)); 加个强制类型转换

还是不对，麻烦再来人看看

struct 去掉试试


Question: 大神求助，信号量问题


Question: 新人小白求分析代码

这个好像关键代码都没有啊，都是对buffer 的操作？

代码不完整 read_signals和output_signals都未实现

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


Question: 新人小白求大神分析

慢慢学习，，，不要着急，，，，需要付出的

只看到 3处宏定义 一个结构体


Question: 求大神帮忙用c语言编个题目

这是数据结构的题目，用栈就能算出。

第一题网搜，嗯

向4楼学习。

1) 直接搜索，本身状态比较少  #define WOLF    (1<<2) #define SHEEP   (1<<1) #define CAB     (1<<0) #define ALL     (WOLF|SHEEP|CAB)  const int mv[]={0,CAB,SHEEP,WOLF}; const char *name[]={"empty","cabbage","sheep",0,"wolf"}; int vis[2][20],path[100],maxd; inline int bitct(int k) { return !k ? 0 : (k&1)+bitct(k>>1); } inline bool eat(int s){return s==6||s==3;} bool dfs(int d,int s){     if(!(d&1)&&s==0) return true;     int h =bitct(d&1 ? s^ALL : s);     if(d+1+(h-1)*2>maxd) return false;     for(int i=0;i<4;i++){         if(!mv[i]||(s&mv[i])){             s^=mv[i];             if(!vis[d&1][s]&&!eat(s)){                 vis[d&1][s] =1;                 path[d] =mv[i];                 if(dfs(d+1,s^ALL)) return true;                 vis[d&1][s]  =0;             }             s ^=mv[i];         }     }     return 0; }  void river(){     for(maxd=1;;maxd+=2){         memset(vis,0,sizeof vis);         if(dfs(0,ALL)) break;     }     for(int i=0;i<maxd;i++){         printf("%d takes %s\n",i+1,name[path[i]]);     } } int main(void) {     river();     return 0; }  2） 菲波数列，这个增长很快，N大一点就会超过32位， int fib(int n){     if(n<2) return 1;     return fib(n-1)+fib(n-2); }

第2题:斐波那契数列


Question: 读取到内存中的数据后如何转换成字符串

引用 13 楼 zhao4zhong1 的回复:谁告诉你二进制数据中除了单字节ASCII码和UnicodeASCII码外其余的必然不是多字节GBK汉字就是Unicode汉字来着？  对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 虽然最后没有实际的解决 但还是谢谢你了  这次我又学到一些东西了

引用 9 楼 zhao4zhong1 的回复:%c和%C不是一回事！  printf Type Field Characters The type character is the only required format field ; it appears after any optional format fields. The type character determines whether the associated argument is interpreted as a character, string, or number. The types C and S, and the behavior of  c and s with printf functions, are Microsoft extensions and are not ANSI-compatible.   Table R.3   printf Type Field Characters  Character Type Output Format  %c int or wint_t When used with printf functions, specifies a single-byte character; when used with wprintf functions, specifies a wide character.  %C int or wint_t When used with printf functions, specifies a wide character; when used with wprintf functions, specifies a single-byte character. 传好了 你有时间看看

引用 7 楼 user-3 的回复:一看你这个注册表项, 就知道它就是一个字符串, 并且应该是UNICODE的.  对于UNICODE, 请使用wprintf 没用过 求个事例  数据在内存中

改成%C 也无法正确显示汉字

引用 4 楼 zhao4zhong1 的回复:%c和%C不是一回事！  printf Type Field Characters The type character is the only required format field ; it appears after any optional format fields. The type character determines whether the associated argument is interpreted as a character, string, or number. The types C and S, and the behavior of  c and s with printf functions, are Microsoft extensions and are not ANSI-compatible.   Table R.3   printf Type Field Characters  Character Type Output Format  %c int or wint_t When used with printf functions, specifies a single-byte character; when used with wprintf functions, specifies a wide character.  %C int or wint_t When used with printf functions, specifies a wide character; when used with wprintf functions, specifies a single-byte character.   关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习” - - 搞的我都不好意思问你了   但是汉字还是无法正确显示  这表项用来保存WIN7任务栏 固定的快捷方式  如果你有环境请在帮我看看 跪谢!!!

你把%c改为%C后运行的截图发出来。  对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

不好意思 我仔细看你给出的代码 - -   我试过了 比之前好很多 就是汉字怎么输出啊?   哎 关于数据方面的知识不知道到哪看好

引用 1 楼 zhao4zhong1 的回复:#include <locale.h> int main() {     long Open,Read,Type,length,i=0;     BYTE *nr;     char *jg,*ar;     HKEY Handle;     setlocale(LC_ALL,"chs");     Open=RegOpenKeyEx(HKEY_CURRENT_USER,         "Software\\Microsoft\\Windows\\CurrentVersion\\Explorer\\Taskband",         0,         KEY_ALL_ACCESS,&Handle);     if(Open==ERROR_SUCCESS && Handle!=0)//判断是否成功打开     {         Read=RegQueryValueEx(Handle,TEXT("Favorites"),0,&Type,NULL,&length);//查询字符串所占用的字符数 and DataType         if(Read==ERROR_SUCCESS && length!=0)//判断查询长度         {             printf("所需要的长度:%d \n",length);             MessageBox(NULL,"获取长度成功","信息:",0);             nr=(BYTE *)malloc(length+4 );//分配内存成功 4952             printf("内存块大小:%d \n",sizeof(BYTE)*length);             Read=RegQueryValueEx(Handle,TEXT("Favorites"),0,NULL,(LPBYTE)nr,&length);//读取表项 类型为REG_BINARY             printf("查询结果:%d \n",Read);             printf("length==%d\n",length);             while(i<length)             {                 printf("%C",*(wchar_t *)(nr+i));                 i+=2;             }             printf("\n");             free(nr);//释放内存*/             nr=NULL;         }         else         {             MessageBox(NULL,"失败","信息:",0);             printf("%d \n",Read);                      }         RegCloseKey(Handle);         return 0;     }     RegCloseKey(Handle);     MessageBox(NULL,"打开表项失败","信息:",0);     return 0; }    数据中保存的是文件的路径 但路径中有汉字  并不能输出显示出来 这个要怎么解决啊??


Question: 关于GCC优化选项打开后编译出错的问题

引用 2 楼 mymtom 的回复:编译命令用错啦！ gcc emmbed.c -o2 emmbed ===> gcc -O2 emmbed.c -o emmbed 赞！

编译选项对大小写是敏感的。

#include<stdio.h> int main() {      printf("%d\n",2);      return 0; } 这样的话用你那个编译器还会出错吗？


Question: C语言 文件指针 (*fp1)._base CXX0030: Error: expression cannot be evaluated

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

readFile看看这里面是怎么运行的

调试下 readFile里面有误吧


Question: VC6.0断点编译后出现LINK : fatal error LNK1168:  （之前的运行窗口已关闭）

谢谢各位啦~

VC在重新生成Debug目录下的exe文件时，需要先删除原先的exe文件。但因为文件正在运行或是被锁定等原因，删除不了，于是出现 LNK1168错误。你可以先将原先的exe文件关闭后手工删除（如果找不到窗口，就看看任务管理器中是有这个exe正在运行，存在就强制关闭它）。如果删除失败，则用右键菜单中的36o解除占用试试。

编译没有问题，但代码中递归没有出口. 可以考虑加个判断数据大小的条件.  char ch; 	static int i=0; 	//fflush(stdin); 	//scanf("%c",&ch); 	ch=node[i]; 	i++; 	if(i >= 8) 		return NULL;


Question: libevent怎么才能做到大并发

你100个客户连接是使用的子线程连接吗？我创建了几万个都没问题


Question: 求，百度面试中，如何用c 语言 实现 在一个 txt按行读取，并查找和定位每行 的 X 和Y 字符或其他汉字

用文件指针操作.

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

这样可好：  FILE *fp; char buf[256]; char *p; int X, Y; int main(void) { 	if (NULL == (fp = fopen("1.txt", "r"))) 	{ 		fprintf(stderr, "Can not open file : 1.txt\n"); 		return 1; 	} 	fgets(buf, 256, fp);   //读入第一行 	printf(buf); 	while (1) 	{ 		if (NULL == fgets(buf, 256, fp)) break; 		if (2 == sscanf(buf, "X %d Y %d", &X, &Y)) printf("X=%d,Y=%d\n", X, Y); 	} 	fclose(fp); 	return 0; } //孔型: A //X = 1000, Y = 243600 //X = -10000, Y = 301000 //X = -100200, Y = 246000 //X = -100200, Y = 322400 //X = -101200, Y = 122800 //X = -101324, Y = 265174 //X = -101324, Y = 268324 //X = -101324, Y = 271474 //X = -101324, Y = 274623 //X = -101324, Y = 277773 //X = -101324, Y = 284072 //X = -101324, Y = 287222 //X = -101324, Y = 293521 //X = -101324, Y = 296670 //X = -101324, Y = 299820 //X = -101400, Y = 306200 //X = -101400, Y = 315600 //X = 10200, Y = 242600 //X = 102000, Y = 246000 //X = 102000, Y = 269600 //X = 102000, Y = 297200 //X = 102000, Y = 301200


Question: C++读取8位和24位bmp图到txt改写成c语言，求助

然并卵，谢谢大家

仅供参考：#include <iostream> #include <fstream> #include <string> #include <windows.h> #include <gdiplus.h> #pragma comment(lib, "gdiplus.lib")  using namespace std; using namespace Gdiplus;  int main() {     GdiplusStartupInput gdiplusstartupinput;     ULONG_PTR gdiplustoken;     GdiplusStartup(&gdiplustoken, &gdiplusstartupinput, NULL);      wstring infilename(L"1.jpg");     string outfilename("color.txt");      Bitmap* bmp = new Bitmap(infilename.c_str());     UINT height = bmp->GetHeight();     UINT width  = bmp->GetWidth();     cout << "width " << width << ", height " << height << endl;      Color color;     ofstream fout(outfilename.c_str());      for (UINT y = 0; y < height; y++)     for (UINT x = 0; x < width ; x++) {             bmp->GetPixel(x, y, &color);             fout << x << "," << y << ";"                  << (int)color.GetRed()   << ","                  << (int)color.GetGreen() << ","                  << (int)color.GetBlue()  << endl;     }      fout.close();      delete bmp;     GdiplusShutdown(gdiplustoken);     return 0; }

修改如下：  #include<math.h> #include <stdlib.h> #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <stdbool.h> //以下该模块是完成BMP图像(彩色图像是24bit RGB各8bit)的像素获取，并存在文件名为xiang_su_zhi.txt中 unsigned char *pBmpBuf;//读入图像数据的指针  int bmpWidth;//图像的宽 int bmpHeight;//图像的高 RGBQUAD *pColorTable;//颜色表指针  int biBitCount;//图像类型，每像素位数 			   //------------------------------------------------------------------------------------------- 			   //读图像的位图数据、宽、高、颜色表及每像素位数等数据进内存，存放在相应的全局变量中 bool readBmp(char *bmpName) { 	FILE *fp = fopen(bmpName, "rb");//二进制读方式打开指定的图像文件  	if (fp == 0) return 0;  	//跳过位图文件头结构BITMAPFILEHEADER  	fseek(fp, sizeof(BITMAPFILEHEADER), 0);  	//定义位图信息头结构变量，读取位图信息头进内存，存放在变量head中  	BITMAPINFOHEADER head;  	fread(&head, sizeof(BITMAPINFOHEADER), 1, fp); //获取图像宽、高、每像素所占位数等信息  	bmpWidth = head.biWidth;  	bmpHeight = head.biHeight;  	biBitCount = head.biBitCount;//定义变量，计算图像每行像素所占的字节数（必须是4的倍数）  	int lineByte = (bmpWidth * biBitCount / 8 + 3) / 4 * 4;//灰度图像有颜色表，且颜色表表项为256  	if (biBitCount == 8) 	{  		//申请颜色表所需要的空间，读颜色表进内存  		//pColorTable = new RGBQUAD[256];  //对应如下的C代码 		pColorTable = malloc(sizeof(RGBQUAD) * 256);  		fread(pColorTable, sizeof(RGBQUAD), 256, fp);  	}  	//申请位图数据所需要的空间，读位图数据进内存  	//pBmpBuf = new unsigned char[lineByte * bmpHeight]; 	pBmpBuf = malloc(sizeof(unsigned char)*lineByte * bmpHeight);  	fread(pBmpBuf, 1, lineByte * bmpHeight, fp);  	fclose(fp);//关闭文件  	return 1;//读取文件成功 } //////----------------------------------- //----------------------------------------------------------------------------------------- //给定一个图像位图数据、宽、高、颜色表指针及每像素所占的位数等信息,将其写到指定文件中 bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,  	int biBitCount, RGBQUAD *pColorTable)  {  	//如果位图数据指针为0，则没有数据传入，函数返回  	if (!imgBuf)  		return 0;  	//颜色表大小，以字节为单位，灰度图像颜色表为1024字节，彩色图像颜色表大小为0  	int colorTablesize = 0;  	if (biBitCount == 8)  		colorTablesize = 1024;  	//待存储图像数据每行字节数为4的倍数  	int lineByte = (width * biBitCount / 8 + 3) / 4 * 4;  	//以二进制写的方式打开文件  	FILE *fp = fopen(bmpName, "wb");  	if (fp == 0) return 0;  	//申请位图文件头结构变量，填写文件头信息  	BITMAPFILEHEADER fileHead;  	fileHead.bfType = 0x4D42;//bmp类型  							 //bfSize是图像文件4个组成部分之和  	fileHead.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)  		+ colorTablesize + lineByte*height;  	fileHead.bfReserved1 = 0;  	fileHead.bfReserved2 = 0;  	//bfOffBits是图像文件前3个部分所需空间之和  	fileHead.bfOffBits = 54 + colorTablesize;  	//写文件头进文件  	fwrite(&fileHead, sizeof(BITMAPFILEHEADER), 1, fp);  	//申请位图信息头结构变量，填写信息头信息  	BITMAPINFOHEADER head;  	head.biBitCount = biBitCount;  	head.biClrImportant = 0;  	head.biClrUsed = 0;  	head.biCompression = 0;  	head.biHeight = height;  	head.biPlanes = 1;  	head.biSize = 40;  	head.biSizeImage = lineByte*height;  	head.biWidth = width;  	head.biXPelsPerMeter = 0;  	head.biYPelsPerMeter = 0;  	//写位图信息头进内存  	fwrite(&head, sizeof(BITMAPINFOHEADER), 1, fp);  	//如果灰度图像，有颜色表，写入文件   	if (biBitCount == 8)  		fwrite(pColorTable, sizeof(RGBQUAD), 256, fp);  	//写位图数据进文件  	fwrite(imgBuf, height*lineByte, 1, fp);  	//关闭文件  	fclose(fp);  	return 1;  } /////---------------------------------------------------------- void xiang_su_du_qu()  {  	//读入指定BMP文件进内存  	char readPath[] = "2117.BMP";  	readBmp(readPath);  	//输出图像的信息  	//cout << "width=" << bmpWidth << " height=" << bmpHeight << " biBitCount=" << biBitCount << endl; 	printf("width=%d, height=%d, biBitCount=%d\n", bmpWidth, bmpHeight, biBitCount);  //具体类型你知道 	 	//循环变量，图像的坐标  	//每行字节数  	int lineByte = (bmpWidth*biBitCount / 8 + 3) / 4 * 4;  	//循环变量，针对彩色图像，遍历每像素的三个分量  	int m = 0, n = 0, count_xiang_su = 0;  	//将图像左下角1/4部分置成黑色  	//ofstream outfile("图像像素.txt", ios::in | ios::trunc); 对应如下两行C代码 	FILE *outfile; 	fopen("图像像素.txt", "r+");  	if (biBitCount == 8) //对于灰度图像 	{ 		//------------------------------------------------------------------------------------ 		//以下完成图像的分割成8*8小单元，并把像素值存储到指定文本中。由于BMP图像的像素数据是从 		//左下角：由左往右，由上往下逐行扫描的  		//int L2=0; 		//int fen_ge=8; 		for (int i = bmpHeight - 1; i >= 0; i--)//64*64矩阵行循环 		{ 			for (int j = 0; j<bmpWidth; j++)//64*64列矩阵循环 			{ 				//--------------------------------------------  				m = *(pBmpBuf + i*lineByte + j); 				//outfile << setw(4) << m; 				printf("%4d", m); 				// outfile<<m<<"  "; 				count_xiang_su = count_xiang_su + 1; 				if ((count_xiang_su) % (bmpWidth) == 0)// 				{ 					//outfile << endl; 					printf('\n'); 				} 			}  		} 	}  	//double xiang_su[2048]; 	//ofstream outfile("xiang_su_zhi.txt",ios::in|ios::trunc); 	if (!outfile) 	{ 		//cout << "open error!" << endl; 		printf("open error!\n"); 		exit(1); 	} 	else if (biBitCount == 24) {//彩色图像  		for (int i = 0; i<bmpHeight; i++) 		{  			for (int j = 0; j<bmpWidth; j++) 			{  				for (int k = 0; k<3; k++)//每像素RGB三个分量分别置0才变成黑色  				{ 					//*(pBmpBuf+i*lineByte+j*3+k)-=40; 					m = *(pBmpBuf + i*lineByte + j * 3 + k); 					//outfile << m << " "; 					printf("%d ", m); 					count_xiang_su++; 					if (count_xiang_su%bmpWidth == 0) 					{ 						//outfile << endl; 						printf('\n'); 					} 					//n++; 				} 				n++; 			}  		} 		//cout << "总的像素个素为:" << n << endl; 		printf("总的像素个素为:%d\n", n); 		//cout << "----------------------------------------------------" << endl; 		printf("----------------------------------------------------\n"); 	}  	//将图像数据存盘  	char writePath[] = "nvcpy.BMP";//图片处理后再存储  	saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);  	//清除缓冲区，pBmpBuf和pColorTable是全局变量，在文件读入时申请的空间  	//delete[]pBmpBuf; 	free(pBmpBuf);  	if (biBitCount == 8) 		//delete[]pColorTable; 		free(pColorTable);  } void main() { 	xiang_su_du_qu(); }


Question: 请高手来帮忙解释一下continue的一个问题！

continue只是终止本次循环，继续下次循环，而导致退出的原因是下一次循环前的判断不成立

continue结束当前此次循环,break结束整个循环

这里你应该使用break;

引用 3 楼 Sandrer 的回复:continue 不会退出循环，而是从循环开始的地方执行 你可以看看汇编代码，它只是简单的做了一个跳转，跳转的地方就是循环开始的地方  而 break 则是跳转到循环结束的地方 但是 the c primer 上面说continue会忽略部分循环甚至终止它！如果可以是否能帮忙看一下我刚才的回复，看说的对不对。谢谢

引用 1 楼 pww20055 的回复:[quote=引用 楼主 pww20055 的回复:] 才学了continue和break，发现很多人都说continue只是终止本次循环，不会导致整个循环退出。但是我觉得在有些时候应该能退出整个循环，例如 while ((ch=getchar())!='#') {   if(ch=='\n')     continue:   statements } 当输入\n的时候就会退出while,所以请教一下，continue在什么时候会终止循环？我个人理解这里使用了continue导致了忽略getchar()，所以退出while，因为该while条件等价与 while(ch!='#') { if(ch=='\n') continue; statements ch=getchar(); }[/quote] 刚才发现这个好像没有终止循环！所以请问高手在输出回车以后它跳过进入下一个循环，但是下一个循环没有扫描的输入才会执行while后面的语句？并不是直接退出，请高手解答

你这个代码贴的太精简了。。。我都有点看不懂。。。  continue后面跟个':'是什么意思。。。  statements是什么意思。。。  ？？？

引用 楼主 pww20055 的回复:才学了continue和break，发现很多人都说continue只是终止本次循环，不会导致整个循环退出。但是我觉得在有些时候应该能退出整个循环，例如 while ((ch=getchar())!='#') {   if(ch=='\n')     continue:   statements } 当输入\n的时候就会退出while,所以请教一下，continue在什么时候会终止循环？我个人理解这里使用了continue导致了忽略getchar()，所以退出while，因为该while条件等价与 while(ch!='#') { if(ch=='\n') continue; statements ch=getchar(); }

注意：getchar函数虽然是从stdin缓冲区提取一个字符，但如果stdin缓冲区没有字符，getchar会等待用户输入，直到输入‘\n’才返回。 所以楼主的程序运行状况如下： 输入一行字符，如果包含‘#’，则输入回车后程序退出； 输入一行字符，如果不包含‘#’，则输入回车后程序继续运行。

continue只是终止本次循环，继续下次循环，也就是说加入当前是循环第三次，遇到了continue，那么continue下面的代码不执行，直接进行第四次循环


Question: 修改密码程序

for(j=0;j<13;j++) write_data(table9[j]);//清屏显示成功 // 循环只有上面一句吧，到这里j的值固定为13，等于执行了一句Users[13]=bb[13] Users[j]=bb[j]; //更改用户密码  还有，怎么没看见对输入长度的控制，bb和cc的长度肯定是6吗？会不会大于6或者小于6？

if(k>6)     //两次一样 如果两次一样，循环结束的时候k=6，所以要改成 if(k==6)  或者 if(k>=6)


Question: 求助，WINDOWS核心编程一书的SDK在哪里有下载？

SD


Question: 第15行提示左值指定const对象  是怎么回事

其实你这第7行也是错的：  test.cpp:7: 错误：未初始化的常量‘target’ test.cpp:15: 错误：assignment of read-only variable ‘target’   const是一个C语言的关键字，它限定一个变量不允许被改变，有的时候你初始化了一个变量之后不希望有修改操作时就可以用const修饰，但是const是要有初始化的。  跑了一下你的程序，是要猜测rand()%100+1出来的随机数是吧，呵呵！

const int target; 常量、变量要区分

第一句const 去掉

const int target;, target是常量，所以在第15行不能被赋值。


Question: dll无法注入到靶子

没有写错 是我的文件的后缀名错了 应该是.c  而不是cpp  希望遇到这样问题的 朋友注意了

_declspec(dllexport) 这个写错了把 是 __declspec(dllexport)

全部折叠全部展开      代码：全部 代码：多个 代码：Visual Basic 代码：C# 代码：Visual C++ 代码：J# 代码：JScript   Visual Basic C# Visual C++ J# JScript Visual C++  DLL  发送反馈意见     动态链接库 (DLL) 是作为共享函数库的可执行文件。动态链接提供了一种方法，使进程可以调用不属于其可执行代码的函数。函数的可执行代码位于一个 DLL 中，该 DLL 包含一个或多个已被编译、链接并与使用它们的进程分开存储的函数。DLL 还有助于共享数据和资源。多个应用程序可同时访问内存中单个 DLL 副本的内容。  动态链接与静态链接的不同之处在于：动态链接允许可执行模块（.dll 文件或 .exe 文件）仅包含在运行时定位 DLL 函数的可执行代码所需的信息。在静态链接中，链接器从静态链接库获取所有被引用的函数，并将库同代码一起放到可执行文件中。  使用动态链接代替静态链接有若干优点。DLL 节省内存，减少交换操作，节省磁盘空间，更易于升级，提供售后支持，提供扩展 MFC 库类的机制，支持多语言程序，并使国际版本的创建轻松完成。  下列主题提供有关对 DLL 编程的详细信息。  本节内容 应用程序和 DLL 之间的区别  描述应用程序和 DLL 之间的基本区别。  使用 DLL 的优点  描述动态链接的优点。  DLL 常见问题  提供有关 DLL 的常见问题解答。  将可执行文件链接到 DLL  描述与 DLL 的显式链接和隐式链接。  初始化 DLL  讨论当 DLL 加载时必须执行的 DLL 初始化代码（如分配内存）。  运行时库行为  描述运行时库如何执行 DLL 启动序列。  LoadLibrary 和 AfxLoadLibrary  讨论如何使用 LoadLibrary 和 AfxLoadLibrary 显式链接到 DLL。  GetProcAddress  讨论如何使用 GetProcAddress 获取 DLL 中导出函数的地址。  FreeLibrary 和 AfxFreeLibrary  讨论当不再需要 DLL 模块时如何使用 FreeLibrary 和 AfxFreeLibrary。  Windows 用来定位 DLL 的搜索路径  描述 Windows 操作系统用来定位系统上的 DLL 的搜索路径。  动态链接到 MFC 的规则 DLL 的模块状态  描述动态链接到 MFC 的规则 DLL 的模块状态。  扩展 DLL  解释通常实现从现有 Microsoft 基础类库类派生的可重用类的 DLL。  创建纯资源 DLL  讨论只包含资源（如图标、位图、字符串和对话框等）的纯资源 DLL。  MFC 应用程序中的本地化资源：附属 DLL  提供对附属 DLL 的增强支持，该功能有助于创建针对多种语言进行本地化的应用程序。  导入和导出  描述如何将公共符号导入应用程序或从 DLL 导出函数。  Active 技术和 DLL  使对象服务器得以在 DLL 内完全实现。  DLL 中的自动化  描述“MFC DLL 向导”中的“自动化”选项提供的内容。  MFC DLL 命名约定  讨论 MFC 中包含的 DLL 和库如何遵循结构化命名约定。  从 Visual Basic 应用程序调用 DLL 函数  描述如何从 Visual Basic 应用程序中调用 DLL 函数。  相关章节 将 MFC 作为 DLL 的一部分使用  描述规则 DLL，它使您可以将 MFC 库作为 Windows 动态链接库的一部分来使用。  MFC 的 DLL 版本  描述如何将 MFCxx.dll 和 MFCxxD.dll（其中 x 是 MFC 版本号）共享动态链接库用于 MFC 应用程序和扩展 DLL。  常见编程方法  提供有关下列内容的主题链接：描述有关 Visual C++ 库的概念信息和讨论各种编码技术和方法。  发送反馈意见，就此主题向 Microsoft 发送反馈意见。

老老实实照MSDN中“开发工具和语言、Visual Studio文档、Visual C++、常见编程方法、DLL”一章的内容学习DLL

加上 extern "C"


Question: 大家帮我看下这程序有什么问题（小程序）

问题多多，，，，，输入的是非数字字符怎么办

引用 12 楼 super_admi 的回复:没有用处。我最初复制的楼主的代码，改用了system("pause")暂停，忘记删除了……  [quote=引用 11 楼 da___ 的回复:] [quote=引用 3 楼 super_admi 的回复:] 给你玩点花样：   #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() {     int a = 0, b = 0, c = 0;     char* direction[] = {"before", "after"};     scanf("%d",&a);     b = a % 2;     c = b * 2 - 1;     printf("%s: %d, %d, %d\n", direction[b], a + c * 1, a + c * 2, a + c * 3);     system("pause");     return 0; }   第三个头文件对这个程序有什么用处？[/quote][/quote] 自己一想突然也就明白了多谢指导 开拓思维也是不错的

引用 3 楼 super_admi 的回复:给你玩点花样：   #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() {     int a = 0, b = 0, c = 0;     char* direction[] = {"before", "after"};     scanf("%d",&a);     b = a % 2;     c = b * 2 - 1;     printf("%s: %d, %d, %d\n", direction[b], a + c * 1, a + c * 2, a + c * 3);     system("pause");     return 0; }   第三个头文件对这个程序有什么用处？

引用 4 楼 zhao4zhong1 的回复:输入2147483647试试看。   这个不错，溢出搞的爽死

再补充一点：在高中数学，求函数表达式的时候，我们常常用1和-1来控制符号（加或者减）。 其实我这么做，看起来代码简洁，但实际效率，还不如直接用printf，所以我只是说搞点花样，而不是说优化代码。  引用 6 楼 zy_dream 的回复:[quote=引用 3 楼 super_admi 的回复:] 给你玩点花样：   #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() {     int a = 0, b = 0, c = 0;     char* direction[] = {"before", "after"};     scanf("%d",&a);     b = a % 2;     c = b * 2 - 1;     printf("%s: %d, %d, %d\n", direction[b], a + c * 1, a + c * 2, a + c * 3);     system("pause");     return 0; }   如果a是偶数这个程序还可以理解，但是如果是奇数的话，那个c怎么看 还有就是 求得余b怎么就可以在direction里使用，不过说到底还是对char* direction[] = {"before", "after"};不理解[/quote]

貌似我说错了一点：c的分段函数式，是：c(x)= x是偶数，则为-1；x是奇数，则为1.  引用 6 楼 zy_dream 的回复:[quote=引用 3 楼 super_admi 的回复:] 给你玩点花样：   #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() {     int a = 0, b = 0, c = 0;     char* direction[] = {"before", "after"};     scanf("%d",&a);     b = a % 2;     c = b * 2 - 1;     printf("%s: %d, %d, %d\n", direction[b], a + c * 1, a + c * 2, a + c * 3);     system("pause");     return 0; }   如果a是偶数这个程序还可以理解，但是如果是奇数的话，那个c怎么看 还有就是 求得余b怎么就可以在direction里使用，不过说到底还是对char* direction[] = {"before", "after"};不理解[/quote]

其实，b和c只是建立了两个对应关系，如果你能够回想起高中的一些数学知识（分段函数），还是很容易理解的。 b = a%2，其实就是建立这么一个关系：偶数对应0，奇数对应1，你可以用分段函数把它表达出来。 同样，c=b*2-1，建议的关系是：偶数对应1，奇数对应-1，这样可以决定是向前查找数字还是向后查找数字。  引用 6 楼 zy_dream 的回复:[quote=引用 3 楼 super_admi 的回复:] 给你玩点花样：   #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() {     int a = 0, b = 0, c = 0;     char* direction[] = {"before", "after"};     scanf("%d",&a);     b = a % 2;     c = b * 2 - 1;     printf("%s: %d, %d, %d\n", direction[b], a + c * 1, a + c * 2, a + c * 3);     system("pause");     return 0; }   如果a是偶数这个程序还可以理解，但是如果是奇数的话，那个c怎么看 还有就是 求得余b怎么就可以在direction里使用，不过说到底还是对char* direction[] = {"before", "after"};不理解[/quote]

表明人家用的是windows而不是linux

没有用处。我最初复制的楼主的代码，改用了system("pause")暂停，忘记删除了……  引用 11 楼 da___ 的回复:[quote=引用 3 楼 super_admi 的回复:] 给你玩点花样：   #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() {     int a = 0, b = 0, c = 0;     char* direction[] = {"before", "after"};     scanf("%d",&a);     b = a % 2;     c = b * 2 - 1;     printf("%s: %d, %d, %d\n", direction[b], a + c * 1, a + c * 2, a + c * 3);     system("pause");     return 0; }   第三个头文件对这个程序有什么用处？[/quote]

引用 3 楼 super_admi 的回复:给你玩点花样：   #include <stdio.h> #include <stdlib.h> #include <windows.h> int main() {     int a = 0, b = 0, c = 0;     char* direction[] = {"before", "after"};     scanf("%d",&a);     b = a % 2;     c = b * 2 - 1;     printf("%s: %d, %d, %d\n", direction[b], a + c * 1, a + c * 2, a + c * 3);     system("pause");     return 0; }   如果a是偶数这个程序还可以理解，但是如果是奇数的话，那个c怎么看 还有就是 求得余b怎么就可以在direction里使用，不过说到底还是对char* direction[] = {"before", "after"};不理解

printf不应该这样用  if (a%2==0)     printf("%d %d %d",a-1,a-2,a-3);    else      printf("%d %d %d",a+1,a+2,a+3);

if和else没加大括号。修改如下： #include <stdio.h>  #include <stdlib.h>  #include <windows.h>  int main()  {  int a;      scanf("%d",&a);      if (a%2==0)      {       printf("%d",a-1);      printf("%d",a-2);      printf("%d",a-3);      }       else      {       printf("%d",a+1);      printf("%d",a+2);      printf("%d",a+3);      }       Sleep(500000);      return 0;   }

差两对大括号吧


Question: 求教MFC读取文件数据到结构体的问题

引用 3 楼 zhao4zhong1 的回复:如果m_all没定义的话，还需要在第11行加一句 PeakData *m_all;m_all在头文件中已经定义了

引用 2 楼 zhao4zhong1 的回复:在第12行加一句： m_all=NULL; 因为： realloc Reallocate memory blocks.  void *realloc( void *memblock, size_t size );  Routine Required Header Compatibility  realloc <stdlib.h> and <malloc.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  realloc returns a void pointer to the reallocated (and possibly moved) memory block. The return value is NULL if the size is zero and the buffer argument is not NULL, or if there is not enough available memory to expand the block to the given size. In the first case, the original block is freed. In the second, the original block is unchanged. The return value points to a storage space that is guaranteed to be suitably aligned for storage of any type of object. To get a pointer to a type other than void, use a type cast on the return value.  Parameters  memblock  Pointer to previously allocated memory block  size  New size in bytes  Remarks  The realloc function changes the size of an allocated memory block. The memblock argument points to the beginning of the memory block. If memblock is NULL, realloc behaves the same way as malloc and allocates a new block of size bytes. If memblock is not NULL, it should be a pointer returned by a previous call to calloc, malloc, or realloc.  The size argument gives the new size of the block, in bytes. The contents of the block are unchanged up to the shorter of the new and old sizes, although the new block can be in a different location. Because the new block can be in a new memory location, the pointer returned by realloc is not guaranteed to be the pointer passed through the memblock argument.  realloc calls malloc in order to use the C++ _set_new_mode function to set the new handler mode. The new handler mode indicates whether, on failure, malloc is to call the new handler routine as set by _set_new_handler. By default, malloc does not call the new handler routine on failure to allocate memory. You can override this default behavior so that, when realloc fails to allocate memory, malloc calls the new handler routine in the same way that the new operator does when it fails for the same reason. To override the default, call   _set_new_mode(1)  early in your program, or link with NEWMODE.OBJ.  When the application is linked with a debug version of the C run-time libraries, realloc resolves to _realloc_dbg. For more information about how the heap is managed during the debugging process, see Using C Run-Time Library Debugging Support.  Example  /* REALLOC.C: This program allocates a block of memory for  * buffer and then uses _msize to display the size of that  * block. Next, it uses realloc to expand the amount of  * memory used by buffer and then calls _msize again to  * display the new amount of memory allocated to buffer.  */  #include <stdio.h> #include <malloc.h> #include <stdlib.h>  void main( void ) {    long *buffer;    size_t size;     if( (buffer = (long *)malloc( 1000 * sizeof( long ) )) == NULL )       exit( 1 );     size = _msize( buffer );    printf( "Size of block after malloc of 1000 longs: %u\n", size );     /* Reallocate and show new size: */    if( (buffer = realloc( buffer, size + (1000 * sizeof( long )) ))          ==  NULL )       exit( 1 );    size = _msize( buffer );    printf( "Size of block after realloc of 1000 more longs: %u\n",              size );     free( buffer );    exit( 0 ); }   Output  Size of block after malloc of 1000 longs: 4000 Size of block after realloc of 1000 more longs: 8000   Memory Allocation Routines  See Also   calloc, free, malloc非常感谢， 添加了m_all=NULL;就解决了

格式问题吧，"%d %d %d %f %f %f %f"改成"%d\t%d\t%d\t%f\t%f\t%f\t%f"


Question: 非阻塞输出

按Ctrl+D


Question: 50分通宵求一段规范的代码读TXT，把X  Y坐标 保存在 合理的数据结构，处理txt文档

引用 1 楼 yxwsbobo 的回复: #include <fstream> #include <string> #include <iostream> #include <vector> struct Point { 	int x; 	int y; }; int main( void ) { 	std::string fPath; 	std::cin >> fPath; 	std::string skip; 	std::vector<Point> Points;  	std::ifstream fStream{ fPath,std::ifstream::in }; 	while( fStream ) 	{ 		Point temp; 		fStream >> skip; 		if( skip.compare( "X" ) != 0 ) 		{ 			continue; 		} 		fStream >> temp.x; 		fStream >> skip; 		fStream >> temp.y; 		Points.push_back( temp ); 	}  	for( const auto& pt : Points ) 	{ 		std::cout << "x :" << pt.x << "  y :" << pt.y << std::endl; 	} 	return 0; };   孔型: A   注意这里有孔型A ，  但是还有孔型B ,C,D   怎么设计数据结构呢

引用 1 楼 yxwsbobo 的回复: #include <fstream> #include <string> #include <iostream> #include <vector> struct Point { 	int x; 	int y; }; int main( void ) { 	std::string fPath; 	std::cin >> fPath; 	std::string skip; 	std::vector<Point> Points;  	std::ifstream fStream{ fPath,std::ifstream::in }; 	while( fStream ) 	{ 		Point temp; 		fStream >> skip; 		if( skip.compare( "X" ) != 0 ) 		{ 			continue; 		} 		fStream >> temp.x; 		fStream >> skip; 		fStream >> temp.y; 		Points.push_back( temp ); 	}  	for( const auto& pt : Points ) 	{ 		std::cout << "x :" << pt.x << "  y :" << pt.y << std::endl; 	} 	return 0; };  编译不过啊

假设孔型名以后有用，用map来存 struct vec2 {      int x,y; } map<string,vector<vec2>> data;

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

1.在读的时候，汉字应该要读到内存中。至于你用不用，那由你之后的业务逻辑决定；  2.建议的数据结构如下：   struct { string name; string type; string value; vector< pair<int, int> >; //如果这里讲究速度，而不考虑顺序，使用map<int, int>更好。

头文件包含了吗

引用 1 楼 yxwsbobo 的回复: #include <fstream> #include <string> #include <iostream> #include <vector> struct Point { 	int x; 	int y; }; int main( void ) { 	std::string fPath; 	std::cin >> fPath; 	std::string skip; 	std::vector<Point> Points;  	std::ifstream fStream{ fPath,std::ifstream::in }; 	while( fStream ) 	{ 		Point temp; 		fStream >> skip; 		if( skip.compare( "X" ) != 0 ) 		{ 			continue; 		} 		fStream >> temp.x; 		fStream >> skip; 		fStream >> temp.y; 		Points.push_back( temp ); 	}  	for( const auto& pt : Points ) 	{ 		std::cout << "x :" << pt.x << "  y :" << pt.y << std::endl; 	} 	return 0; };  tdafx.cpp 1>  1234.cpp 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(23): error C2601: “fStream”: 本地函数定义是非法的 1>          e:\visual studio 2010\projects\1234\1234\1234.cpp(17): 此行有一个“{”没有匹配项 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(23): error C2143: 语法错误 : 缺少“;”(在“}”的前面) 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(24): error C2065: “fStream”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(27): error C2065: “fStream”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(27): error C2065: “skip”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(28): error C2065: “skip”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(28): error C2228: “.compare”的左边必须有类/结构/联合 1>          类型是“'unknown-type'” 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(32): error C2065: “fStream”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(33): error C2065: “fStream”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(33): error C2065: “skip”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(34): error C2065: “fStream”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(35): error C2065: “Points”: 未声明的标识符 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(35): error C2228: “.push_back”的左边必须有类/结构/联合 1>          类型是“'unknown-type'” 1>e:\visual studio 2010\projects\1234\1234\1234.cpp(36): fatal error C1903: 无法从以前的错误中恢复；正在停止编译 1> 1>生成失败。 1> 1>已用时间 00:00:00.84 ========== 生成: 成功 0 个，失败 1 个，最新 0 个，跳过 0 个 ==========


Question: 批处理，vs2010 external tools?

请在前面加一句 cd /d "你期望该批处理所在当前文件夹"


Question: 每个单词的首字母转换问题

修改如下：  #include<stdio.h> #include<string.h> int main() { 	int i; 	char zy[30]; 	printf("Enter some words:\n"); 	scanf("%[^\n]s", zy); 	zy[0] &= 223;    //将第一个单词的首写字母大写 	for (i = 1; i < 30 && zy[i]; i++) //开始进行循环 	{ 		if (zy[i] == ' ' && zy[i + 1])//当找到空格时 		{ 			zy[i + 1] &= 223;//对此单词的首字母小写变大写 			continue; 		} 	} 	printf("%s", zy); 	printf("\n"); 	return 0; } //we are family  //We Are Family

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.  To read strings not delimited by space characters, a set of characters in brackets ([ ]) can be substituted for the s (string) type character. The corresponding input field is read up to the first character that does not appear in the bracketed character set. If the first character in the set is a caret (^), the effect is reversed: The input field is read up to the first character that does appear in the rest of the character set.  Note that %[a-z] and %[z-a] are interpreted as equivalent to %[abcde...z]. This is a common scanf function extension, but note that the ANSI standard does not require it.

scanf("%29[^\n]s", zy); 小心驶得万年船！

问题现在是 输入一句有空格的全是小写的句子 结果只输出第一个空格之前的 而且还不变成大写


Question: 今天百度面试一到小的字符串处理题做的不好，睡不着，求大神帮忙分析下，能贴点代码吗


Question: 编写一个测试一个串是否为回文的递归函数的代码

//[x,y) bool ispal(const char *s,int x,int y){     if(y-x<=1) return true;     return s[x]==s[y-1] && ispal(s,x+1,y-1); }

楼上精彩


Question: windows内存管理中内存碎片的问题

所以才要内存对齐

这里的内存分配你要从虚拟内存地址去考虑。资料中是要求分配连续内存地址，中间不能有被其他已经使用的地址隔开的。

难道这个只是为了使用非分页内存的情况？

连续内存...那本书是windows驱动开发技术详解


Question: echo 复合使用

直接重定向不行吗？ ps -aux|grep TEST|grep -v grep > a.txt 为啥一定要用echo?

使用命令重定向操作符可以使用重定向操作符将命令输入和输出数据流从默认位置重定 向到不同的位置。输入或输出数据流的位置即为句柄。  下表将列出可用的句柄。  句柄      句柄的数字代号 描述 STDIN     0              键盘输入 STDOUT    1              输出到命令提示符窗口 STDERR    2              错误输出到命令提示符窗口 UNDEFINED 3-9            这些句柄由应用程序单独定义，并且是各个工具特定的。  数字 0 到 9 代表前 10 个句柄。可以使用命令 Cmd.exe 运行程序并将该程序前 10 个 句柄中的任何一个重定向。要指定想使用的句柄，可在重定向操作符前面键入该句柄的 数字。如果未定义句柄，则默认的 < 重定向输入操作符是 0，而默认的 > 重定向输出 操作符是 1。键入 > 或 < 操作符之后，必须指定要读取或写入数据的位置。可以指定 文件名或另一个现有的句柄。  要指定重定向到现有句柄，请使用与 (&) 字符，后面接要重定向的句柄号 （例如 &句柄#）。例如，下面的命令可以将句柄 2（即 STDERR）重定向到 句柄 1（即 STDOUT）：  2>&1  下表列出了可用于将输入和输出数据流进行重定向的操作符。  重定向操作符 描述 > 将命令输出写入到文件或设备（例如打印机）中，而不是写在命令提示符窗口或句柄中。 < 从文件中而不是从键盘或句柄中读入命令输入。 >> 将命令输出添加到文件末尾而不删除文件中的信息。 >& 将一个句柄的输出写入到另一个句柄的输入中。 <& 从一个句柄读取输入并将其写入到另一个句柄输出中。 | 从一个命令中读取输出并将其写入另一个命令的输入中。也称作管道。  默认情况下，可以从键盘将命令输入（即 STDIN 句柄）发送到 Cmd.exe，然后由 Cmd.exe 将命令输出（即 STDOUT 句柄）发送到命令提示符窗口。  重定向输入 (<) 要将键盘输入重定向到文件或设备，请使用 < 操作符。例如，要从 File.txt 获取 sort 命令的输入，请键入：  sort<file.txt  File.txt 的内容将以字母顺序列表的方式显示在命令提示符窗口中。  < 操作符可以打开具有只读访问的指定文件名。所以，不能使用该操作符向文件中写入 信息。例如，如果以 <&2 启动程序，则所有试图读取句柄 0 的操作都将失败，因为句 柄 2 最初是以只写访问打开的。   注意  0 是 < 重定向输入操作符的默认句柄。 重定向输出 (>) 几乎所有的命令都将输出发送到命令提示符窗口。即使将输出发送到驱动器或打印机的 命令也会在命令提示符窗口显示消息和提示。  要将输出从命令提示符窗口重定向到文件或设备，请使用 > 操作符。可以在许多命令中 使用该操作符。例如，要将 dir 输出重定向到 Dirlist.txt，请键入：  dir>dirlist.txt  如果 Dirlist.txt 不存在，Cmd.exe 将创建该文件。如果 Dirlist.txt 存在，Cmd.exe 将使用 dir 命令的输出替换文件中的信息。  要运行 netsh routing dump 命令，然后将输出发送到 Route.cfg，请键入：  netsh routing dump>c:\route.cfg  > 操作符可以打开具有只写访问属性的指定文件。所以，不能使用该操作符读取文件。 例如，如果使用重定向 >&0 启动程序，则所有试图写入句柄 1 的操作都将失败，因为 句柄 0 最初是以只读访问打开的。   注意  1 是 > 重定向输出操作符的默认句柄。 复制句柄 重定向操作符 & 可以将输出或输入从一个指定句柄复制到另一个指定的句柄。例如， 要将 dir 输出发送到 File.txt 并将错误输出发送到 File.txt，请键入：  dir>c:\file.txt 2>&1  复制句柄时，可以复制该句柄原状态的所有特性。例如，如果一个句柄具有只写访问的 属性，则该句柄的所有副本都具有只写访问属性。不能将一个具有只读访问属性的句柄 复制到另一个具有只写访问属性的句柄。  使用 & 操作符重定向输入和副本 要将重定向输入操作符 (<) 与复制操作符 (&) 一起使用，指定的文件必须已经存在。 如果输入文件存在，Cmd.exe 将以只读方式打开该文件，然后将文件中包含的字符作为 输入发送到此命令（如同从键盘输入一样）。如果指定了句柄，Cmd.exe 将指定的句柄 复制到系统现有的句柄中。  例如，要以句柄 0 输入读取（即 STDIN）的方式打开 File.txt，请键入：  <file.txt  要打开 File.txt，并在内容排序后将输出发送到命令提示符窗口（即 STDOUT），请键入：  sort<file.txt  要查找 File.txt，然后将句柄 1（即 STDOUT）和句柄 2（即 STDERR）重定向到 Search.txt，请键入：  findfile file.txt>search.txt 2<&1  要以句柄 0 输入读取（即 STDIN）的方式复制用户定义句柄 3，请键入：  <&3  使用 & 操作符重定向输出和复制 如果将输出重定向到文件且指定了现有的文件名，Cmd.exe 将以只写方式打开文件并覆 盖该文件内容。如果指定了句柄，Cmd.exe 将文件复制到现有句柄中。  要将用户定义句柄 3 复制到句柄 1，请键入：  >&3  要将包括句柄 2（即 STDERR）的所有输出从 ipconfig 命令重定向到 句柄 1（即 STDOUT），然后将输出重定向到 Output.log，请键入：  ipconfig.exe>>output.log 2>&1  使用 >> 重定向操作符追加输出 要从命令中将输出添加到文件末尾而不丢失文件中已存在的任何信息，请使用两个连续 的大于号（即 >>）。例如，下面的命令可以将由 dir 命令生成的目录列表追加到 Dirlist.txt 文件：  dir>>dirlist.txt  要将 netstat 命令的输出追加到 Tcpinfo.txt 的末尾，请键入：  netstat>>tcpinfo.txt  使用管道操作符 (|) 管道操作符 (|) 可以提取一个命令的输出（默认情况下是 STDOUT），然后将其导入另 一个命令的输入中（默认情况下是 STDIN）。例如，下面的命令将对目录分类：  dir | sort  在本例中，将同时启动两个命令，但随后 sort 命令会暂停，直到它接收到 dir 命令 的输出为止。sort 命令使用 dir 命令的输出作为输入，然后将输出发送到 句柄 1（即 STDOUT）。  合并带重定向操作符的命令 可以通过合并带有其他命令和文件名的筛选器命令创建自定义命令。例如，可以使用以 下命令存储包含“LOG”字符串的文件名:  dir /b | find "LOG" > loglist.txt  dir 命令的输出通过 find 筛选器命令发送。包含字符串 "LOG" 的文件名作为文件名 列表（例如，NetshConfig.log、Logdat.svd 和 Mylog.bat）存储在文件 Loglist.txt 中。  要在相同命令中使用多个筛选器，请使用管道 (|) 分隔筛选器。例如，下面的命令将 搜索 C 盘上的每个目录以查找包含 "LOG" 字符串的文件名，并且在命令提示符窗口中 每次显示一屏：  dir c:\ /s /b | find "LOG" | more  利用管道 (|) 可以将 Cmd.exe 导向为通过 find 筛选器命令发送 dir 命令输出。 find 命令只选择包含字符串 "LOG" 的文件名。more 命令可以显示由 find 命令选择 的文件名（在命令提示符窗口中每次显示一屏）。有关筛选器命令的详细信息，请参阅 使用筛选器。


Question: 红色部分怎么理解？？

引用 2 楼 henuyx 的回复:红色部分，其是是想求value的y次方除以z取余。 一步一步来思考： 第一步就是 result = result * value % z, 循环y次，就得出结果  但是这样做是不是还能再优化呢？答案是肯定的。我们先用递归的思路思考一下： 比如 已经得到 result = result * value %z 那么 如果y是2 的话 那利用上面的 result 就可以得到 result = result * result %z 如果y是 4的话，再利用上一步的result，可以得到result = result * result %z 如果y是8的话，继续利用上一步的result，可以得到：result = result * result %z ......  其实红色的部分就是要把上述的递归部分转化成循环的方法来实现。 具体红色那样做对不对呢？我现在还不想给你结论！（其实我还没优化到那一步，不许揭穿我！）  ------------------------ 个人见解。  说得有道理. 其实就跟2进制一样,从低位到高位这样跌起来.有1就加起来.

引用 2 楼 henuyx 的回复:红色部分，其是是想求value的y次方除以z取余。 一步一步来思考： 第一步就是 result = result * value % z, 循环y次，就得出结果  但是这样做是不是还能再优化呢？答案是肯定的。我们先用递归的思路思考一下： 比如 已经得到 result = result * value %z 那么 如果y是2 的话 那利用上面的 result 就可以得到 result = result * result %z 如果y是 4的话，再利用上一步的result，可以得到result = result * result %z 如果y是8的话，继续利用上一步的result，可以得到：result = result * result %z ......  其实红色的部分就是要把上述的递归部分转化成循环的方法来实现。 具体红色那样做对不对呢？我现在还不想给你结论！（其实我还没优化到那一步，不许揭穿我！）  ------------------------ 个人见解。 2楼的朋友，，谢了哈，懂了一些，，，红色那里是对的

把%z去掉就是快速冪的算法，

x^y = x^(y/2) y为偶数 x^y = x * x^(y/2) y为奇数


Question: 各位帮我解释下这段简单代码！

不成立就继续往下判断把，应该是这样的。。。

我回答的时候楼主应该已经有答案了。但我给点建议。可以在每个if（）后面加上printf（你想要知道的值），输出中间结果，观察，问来问去自己试一遍反而最有印象~哈哈。if()括号里不为0的话，就执行下一条。

找几个数一步一步按程序在纸上执行就明白了

if的意思就是判断两个数的大小然后是否交换。  如果条件不成立，当然是跳出当前if()判断，继续执行下一条语句。

就是把abc这三个数从小到大输出，如果不成立就不执行

你可以在VC里点F9设置断点，设置临时变量输入你要试的值，单步调试F10，一步一步看不就得了

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


Question: 怎么在VS2012上编写一个扫雷，用SDL库

话说我还没听过SDL库，等我先去普及

我就看看，不说话，静待高手来解答！


Question: linux下的一个程序，在return时报错提示stack smashing detected，求解

看堆栈调试一下你的程序呗

意思是栈被破坏了. 可能由于你的main中对某个数组操作的时候, 越界了. 导致main函数的调用栈信息被破坏, 不能返回到正确的地方.

在进入main函数后，在当前堆栈顶设置内存修改观察点： 2. 设置观察点(WatchPoint) 观察点一般用来观察某个表达式(变量也是一种表达式)的值是否变化了。如果有变化，马上停住程序。有下面的几种方法来设置观察点： watch <expr> 为表达式(变量)expr设置一个观察点。一旦表达式值有变化时，马上停住程序。 rwatch <expr> 当表达式(变量)expr被读时，停住程序。 awatch <expr> 当表达式(变量)的值被读或被写时，停住程序。 info watchpoints 列出当前设置的所有观察点。    将所有sprintf和strcpy，strcmp改为对应的snprinf,strncpy,strncmp


Question: 疑惑

引用 9 楼 li824814957 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 我用debug调试的时候是把（_BP+8+a+a）这个字节赋给al寄存器， 然后在把al赋给0XB8000000+160*10+80+a+a[/quote] 学会使用Turbo Debuger是你的当务之急。 bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028 里面有Turbo Debuger

引用 5 楼 youjun610789338 的回复:*(char far *)(0XB8000000+160*10+80+a+a) = *(int *)(_BP+8+a+a); 这样可以理解为：用数值对字符进行赋值，系统会根据ASCII码自动转换为相应的字符   #define Buffer ((char *)*(int far *)0x200) 这一句可以理解为0x200地址中存放的就是一个char *指针，而这个指针的大小就等于int的大小 这样我就明白了

引用 8 楼 zhao4zhong1 的回复:推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。 我用debug调试的时候是把（_BP+8+a+a）这个字节赋给al寄存器， 然后在把al赋给0XB8000000+160*10+80+a+a

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

引用 2 楼 zhao4zhong1 的回复:*(char far *)(0XB8000000+160*10+80+a+a) = *(int *)(_BP+8+a+a); 0XB8000000+160*10+80+a+a是一个整数，记为Z (char far *)Z将Z强制类型转换为char far *类型，记为CZ *CZ为取CZ指向的char  _BP+8+a+a是一个整数，记为A *(int *)A为取A地址处的一个int，记为B *CZ=B将B的值自动转为char填写到CZ地址处 最后那个自动转为 是不是里面的数字也自动转为ascII码？

引用 2 楼 zhao4zhong1 的回复:*(char far *)(0XB8000000+160*10+80+a+a) = *(int *)(_BP+8+a+a); 0XB8000000+160*10+80+a+a是一个整数，记为Z (char far *)Z将Z强制类型转换为char far *类型，记为CZ *CZ为取CZ指向的char  _BP+8+a+a是一个整数，记为A *(int *)A为取A地址处的一个int，记为B *CZ=B将B的值自动转为char填写到CZ地址处     #define Buffer ((char *)*(int far *)0x200) *(int far *)0x200为地址0x200处保存的int值，记为Y ((char *)Y)为指向地址Y的char类型指针 比如Buffer[0]表示地址0x200处保存的int值Y对应地址处的char  感觉还是有点绕。。

这里会自动只取第一个字节吗 C语音不会用整数赋值给字符的时候只取第一个字节吗


Question: pdf图片逆时针旋转90度

不是为了给自己加分，发帖前没有仔细研究如何设置图片方向，等发出后才能明白。所以想赶快结贴。

自己已经找到答案

帮结帖蹭分。


Question: 有个手机号后7位隐藏了，但是有整条源代码，求大神翻译～～

别个加密就是为了安全, 如果这样就破了..... 那还有什么安全可言.

这玩意需要有个密码吧

初步怀疑为3DES加密算法的结果

破解了告诉我...

引用 5 楼 user-6 的回复:[quote=引用 4 楼 zhao4zhong1 的回复:] 为什么不"0000000'～“9999999”逐个试呢？ 成本高啊，就是短信1毛一条，也要10万块钱才能找到[/quote] 我还以为你有将"13900000000"转换为类似“5ebecb45d7a66e719199d899boa134eb”的源代码呢！

引用 4 楼 zhao4zhong1 的回复:为什么不"0000000'～“9999999”逐个试呢？ 成本高啊，就是短信1毛一条，也要10万块钱才能找到


Question: 浮点数精度

把二进制小数转成十进制看看是多少

printf("%10.10f", xxx)


Question: socket怎样实现广域网通信

如果是家里的路由，进192.168.1.1->DHCP服务器->静态地址分配,->添加自己的MAC地址，并设置IP 转发规则->虚拟服务器(虚拟服务器定义了广域网外部端口和局域网网络服务器之间的映射关系，所有对该广域网外部端口的访问将会被重定位给通过IP地址指定的局域网网络服务器)->设置外部端口号、内部端口号、IP地址、协议  如果是学校的网，应该要向学校的信息化建设处申请吧

要用公网ip才行吧。

引用 1 楼 guicaisa 的回复:我刚才又百度了半天，学校用的网应该是内网吧，如果想拿自己电脑做服务器的话，就得用端口映射，将学校的公网的ip的某个端口与私网内自己的ip地址做映射才行，，是这样吗。具体怎么做端口映射我也不是很懂！想就这个问题请教下各位。 学校的话，基本不用想了，你应该不会有权限修改端口映射的 自己家里还有希望


Question: 文件读取的文件结束符

对于第一个结果 我不太懂windows的结果 因为 文件虽然有5个字符 但是还有一个文件结束符 所以最后应该是6个字符 文件结束符，根本就不会存在文件里。  对于第二个结果 我不懂linux的结果 就算要输出文件结束符 为什么会输出一个换行 Linux下的文本编辑器，会自动加上换行符

我在CSDN论坛发帖内容中如未注明Linux，都默认仅Windows。

引用 2 楼 zhao4zhong1 的回复:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了 就楼主这个问题来说，根本不存在这个转换！ WINDOWS下的例子根本就没有换行符！ Linux下的例子确实有换行符，但是根本不存在这种转换！

把%c换成%x


Question: 李白喝酒问题，C新手。For循环出错，求解答

int main() {   int cnt=0;  for (int i=0; i<1<<15; i++)  {   int k=2;   int n=0;   int x=i;   int flag=1;   for (int j=1; j<=15; j++)   {    if (x&1)     k*=2;    else     k--;    if (k==0&&x)    {     flag=0;     break;    }    n+=x&1;    x>>=1;   }   if ( n !=5 || (i & (1<<14)) || !flag || k != 0)    continue;   cnt++;  }  printf("%d",cnt);  char ch;  ch = getchar();  return 0; }

没有涉及指针，都很好调试的

不用int   用实数看看

调试，跟踪下，看是不是每一步都跟预期一样的..

循环太多，自己调试吧，反正我这运行结果是 0 the types of Libai are:0 Press any key to continue


Question: 链表与文件的读取与保存问题，求大神帮看看，给跪了

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

feof(fp)是可以的， 但while(1)结合fscanf()返回值，是一种更好的方案

引用 4 楼 zhangxiangDavaid 的回复:修改如下：  void save(struct goods *head) { 	struct goods *p1; 	FILE *fp; 	p1 = head;  	fp = fopen("date.txt", "w"); 	while (p1 != NULL) 	{ 		fprintf(fp, "%d %s %d %d\n", p1->ID, p1->name, p1->price, p1->count); 		p1 = p1->next; 	} 	fclose(fp); 	printf("保存成功\n"); } struct goods *readInfo() { 	struct goods *p1, *p2, *head; 	FILE *fp; 	int flag; 	n = 0; 	while ((fp = fopen("date.txt", "r")) == NULL) 	{ 		printf("加载文件失败"); 	} 	head = NULL; 	while(1) 	{ 		p1 = (struct goods *)malloc(sizeof(struct goods)); 		if (4 != fscanf(fp, "%d %s %d %d\n", &p1->ID, p1->name, &p1->price, &p1->count)) break; 		n = n + 1; 		if (n == 1) 		{ 			head = p1; 		} 		else  		{ 			p2->next = p1; 		} 		p2 = p1; 	}; 	fclose(fp); 	p2->next = NULL; 	free(p1); 	save(head); 	return head; }  为什么我用fopen这个判断条件不可以呢?

引用 4 楼 zhangxiangDavaid 的回复:修改如下：  void save(struct goods *head) { 	struct goods *p1; 	FILE *fp; 	p1 = head;  	fp = fopen("date.txt", "w"); 	while (p1 != NULL) 	{ 		fprintf(fp, "%d %s %d %d\n", p1->ID, p1->name, p1->price, p1->count); 		p1 = p1->next; 	} 	fclose(fp); 	printf("保存成功\n"); } struct goods *readInfo() { 	struct goods *p1, *p2, *head; 	FILE *fp; 	int flag; 	n = 0; 	while ((fp = fopen("date.txt", "r")) == NULL) 	{ 		printf("加载文件失败"); 	} 	head = NULL; 	while(1) 	{ 		p1 = (struct goods *)malloc(sizeof(struct goods)); 		if (4 != fscanf(fp, "%d %s %d %d\n", &p1->ID, p1->name, &p1->price, &p1->count)) break; 		n = n + 1; 		if (n == 1) 		{ 			head = p1; 		} 		else  		{ 			p2->next = p1; 		} 		p2 = p1; 	}; 	fclose(fp); 	p2->next = NULL; 	free(p1); 	save(head); 	return head; }  可以说一下我错哪里了吗 我这没有编译环境 看着很麻烦 麻烦您了

帮帮忙吧大神们

这个问题困扰我好几天了

有没有能帮帮我的各位


Question: C语言中scanf被跳过的问题（不是输入字符）

VS上没问题，估计是编译器差异造成的

在VC上面也没有问题

这么奇怪，在Linux下可以输入哦，可能是缓冲区的问题，按楼上说的那样试试刷一下缓冲区再scanf；

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

恩, 有可能是缓存问题. 在scanf前加个fflush(stdin);试试

难道是输入缓冲区有数据，我乱猜的，不懂编程，hello world水平。


Question: C语言，关于函数的形参实参的小问题

前面几个楼说的很对，值传递 地址传递的区别吧   --------------------- 怎么总是会邀请回答呢？不是那么多人回答过了吗

一个小问题都有这么多人回答，实在是感谢。 分数有限，人人都有

static double sum=0; 把它放在ErrorCalculate() 中  然后去掉double sum这一参数！

如果变量声明是全局的话，data3没有必要作为实参传递，应该把函数中的形参删掉 如果你的data3不是全局变量，在进入ErrorCalculate函数时候会把data3当做short类型的数组，所以才会有上面的结果 其实你可以用指针啊，形参声明数组多麻烦啊。 double ErrorCalculate(short *a,short *b,int wave,double * sum) 改成上面的形式试一试，调用地方一样。没有编译器就不帮你调试了。

你应该把  static double sum=0;  声明为全局的 并且ErrorCalculate()不必使用double sum这一参数

最后一个形参你得设置成引用，设置成引用，就是对对象本身的操作，会改变对象本身，你传值，只是对它的副本进行操作，sum当然是0

引用 4 楼 wsdhren 的回复:代码的计算逻辑没有细看，有以下意见可供参考： 1. 从你贴出的代码和你描述的需求上看，这里没有必要使用static 2. 当sum传入ErrorCalculate函数时，ErrorCalculate函数中得sum参数实际时你传入的sum的一个拷贝，所以函数中无论怎样操作sum，在函数结束后你再输出sum，结果都会时函数处理前的值。 3. 如果你希望函数执行后sum值有变化：（1）直接用返回值去赋值；（2）传入sum的指针，对指针进行操作。  之前传入了数组形参，把自己误导了。其实数组也是指针。我明白了，非常感谢。  顺便问一下，把sum声明为 enternal 有用么？

形参sum得到的是实参sum的值 函数中形参的值改变了 返回后形参没了 原sum还是原值  形参应该为指针 传sum的地址

我是这样理解的，你有一个静态全局的sum，有一个静态局部的sum。调用ErrorCaculate时，全局的sum值给了局部的sum，操作的也是这个静态局部sum，调用返回时，静态局部sum虽然还在，但出了访问范围了。此时你输出的应是静态全局那个sum，此值并没有变化。

传值调用与传址调用

short data3[65536][128]   栈上的也这么大？？

SNR=ErrorCalculate(data3,data4,wave,&sum);   double ErrorCalculate(short a[65536][128],short b[65536][128],int wave,static double * sum) {     double sum_tmp = 0;      double SNR=0;     for (int i = 0; i < 65536; i++)     {         sum_tmp+=(a[i][wave]-b[i][wave])*(a[i][wave]-b[i][wave]);     }     sum_tmp=sum_tmp/65536;//sum_tmp是均方值     SNR = 10*log10((255*255) /sum_tmp );     *sum = sum_tmp;     return SNR; }

sum=sum/65536;//sum是均方值 有可能是上一步计算完，sum的值就是0吧。


Question: 如何在vs2013中运行一个多文件的程序？

出现重定义的问题原因： 一个项目中同名函数只能定义一次。 如果在源文件1中加入#include“源2.cpp”     就等于是在源文件1中又定义了一次其内容  所以显示重定义 认真理解报错内容 共勉  实例： all.h里： #include<iostream> using namespace std; void dispaly1(); void dispaly2();  dispaly1.cpp里： #include“all.h”  void dispaly1() {  } int main() { dispaiy1(); dispaly2(); return 0; }   dispaly2.cpp里： #include“all.h”  void dispaly2() {  }

引用 6 楼 xxl19900724 的回复:你把那三个外部函数声明放到你各自源文件里，在你的main()函数里调用 还是不行啊

#include "file2.c" #include"file3.c" #include"file4.c"  把这三行去除即可。

引用 8 楼 xxl19900724 的回复:你试试用命名空间的方法包含你那几个函数 问题解决了，这个例子是我敲得谭浩强《c语言程序设计》书上的例子，上面有一节专门讲述“如何运行一个多文件的程序”的三种情况下的方法，当然上面肯定没有在vs2013编译环境下的多文件运行方法，所以我就尝试了书上的第三种方法用“#include”命令，将另外三个文件file2.c、file3.c、file4.c包含到file1.c中，所在在文件一中的开头加了三行： #include "file2.c" #include"file3.c" #include"file4.c" 进行编译就出现了如图所示的问题。 解决办法就是不用管这些456，直接按例子上敲上去，main（）函数里面3行声明在这里就管用。 由此我发现：在vs2013编译环境下，没有那么多456，直接开干~~

你试试用命名空间的方法包含你那几个函数

你把那三个外部函数声明放到你各自源文件里，在你的main()函数里调用

引用 4 楼 ldplsj 的回复:[quote=引用 3 楼 ldplsj 的回复:]  你基本上每个文件里都定义了一遍那三个函数，重复定义了  每个定义一个，在Main()所在的文件里调用就可以了  另外的三个文件file2/3/4中，没有用到其他两个的，不要加头文件[/quote] 其他三个我没有加，只有file2.c加了#include<stdio.h>啊

引用 3 楼 ldplsj 的回复:你基本上每个文件里都定义了一遍那三个函数，重复定义了  每个定义一个，在Main()所在的文件里调用就可以了  另外的三个文件file2/3/4中，没有用到其他两个的，不要加头文件

引用 1 楼 zhao4zhong1 的回复:.c不需要#include  我是照着书上敲得

.c不需要#include


Question: 文件输出

我能说，我只是copy了你的代码然后在Linux下g++编译后运行，没有出现你描述的现象吗   另外，1楼我想问问，你确定Linux用gcc能编译通过吗，我用gcc编译报如下错误： /tmp/ccGpl1qQ.o:(.eh_frame+0x12)：对‘__gxx_personality_v0’未定义的引用 collect2: ld 返回 1

100 99 98 97 96 95 94 93 92 91  90 89 88 87 86 85 84 83 82 81  80 79 78 77 76 75 74 73 72 71  70 69 68 67 66 65 64 63 62 61  60 59 58 57 56 55 54 53 52 51  50 49 48 47 46 45 44 43 42 41  40 39 38 37 36 35 34 33 32 31  30 29 28 27 26 25 24 23 22 21  20 19 18 17 16 15 14 13 12 11  10 9 8 7 6 5 4 3 2 1

若使用fwrite和fread，请使用"~b"的模式打开文件 修改如下：  /*  将 1 - 100 写入文件 然后倒序读出来 */ #include <stdio.h> #include <stdlib.h> int main(void) { 	FILE* pfile = NULL; 	int val = 0; 	long cnt = 0L; 	int i = 0;  	// open the file 	//pfile = fopen("abc.txt", "w"); 	pfile = fopen("1.txt", "wb"); 	if (!pfile) 	{ 		fprintf(stderr, "can not open the file \n"); 		exit(1); 	}  	// write the file 	for (val = 1; val <= 100; ++val) 	{ 		fwrite(&val, sizeof(int), 1, pfile); 	}  	// close the file 	fclose(pfile);  	// open the file 	pfile = fopen("1.txt", "rb");  	for (i = 1; i <= 100; ++i) 	{ 		fseek(pfile, -i * sizeof(int), SEEK_END); 		fread(&val, sizeof(int), 1, pfile); 		printf("%d ", val); 		if (i % 10 == 0) printf("\n"); 	}  	// close the file 	fclose(pfile); 	return 0; }

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

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

输出上卷到屏幕外面了吧。我猜。

正常啊 linux gcc 环境下面


Question: socket程序运行不了

不能运行, 总会找到哪里执行错了撒.   你这个程序, 从头到尾, 只有开头那点点有错误判断, 后面全部没有了. 判断好每一个函数返回值, 然后再看是什么错.  还有, 你的程序在完成第一个连接的接待前, 是不能得到第二个连接的.  因为你们要聊完5句话啊.

引用 2 楼 lovesmiles 的回复:好难帮你，你应该建个控件台工程。  大哥我真是蠢。。。。。让你看笑话了。。。。

好难帮你，你应该建个控件台工程。


Question: 求教C语言图形编程的问题

那要看你的窗口大小， 比如 1280*720，那么你按比例计算即可

y坐标＝第3行×每行所占像素高度 x坐标＝第4列×每列所占像素宽度

引用 3 楼 zhao4zhong1 的回复:GetClientRect The GetClientRect function retrieves the coordinates of a window's client area. The client coordinates specify the upper-left and lower-right corners of the client area. Because client coordinates are relative to the upper-left corner of a window's client area, the coordinates of the upper-left corner are (0,0).   BOOL GetClientRect(   HWND hWnd,      // handle to window   LPRECT lpRect   // address of structure for client coordinates );   Parameters hWnd  Handle to the window whose client coordinates are to be retrieved.  lpRect  Pointer to aRECT structure that receives the client coordinates. The left and top members are zero. The right and bottom members contain the width and height of the window.  Return Values If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, callGetLastError.   Remarks Windows CE: Command bars are included in the client area.  QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in winuser.h.   Import Library: Use user32.lib.  See Also Windows Overview, Window Functions, GetWindowRect,RECT  赵4老师，你好，我英语不好。。。请问一下：如果我已经画一个五子棋的棋盘的话，要在棋盘上某个特定地点落子，如何确定棋子的坐标以便在我能在那个特定地点画棋子呢？就比如说我要在棋盘的第3行第4列画棋子，我怎么知道第3行第4列的横纵坐标是多少呢

在网上搜vc绘图，然后安装之后包含graphics.h头文件就可以随意的绘图了


Question: 求大神帮看此大数相加代码是否有问题

楼主的代码中，随着p2不断减少，极有可能越过最小边界。 试一下，测试用例 999999999999999 + 9

仅供参考：#include <stdio.h> #include <string.h> #define MAXLEN 1000 char a1[MAXLEN]; char a2[MAXLEN]; static int v1[MAXLEN]; static int v2[MAXLEN]; static int v3[MAXLEN]; int i,j,n,L,z; void main(void) {     scanf("%d",&n);     for (j=0;j<n;j++) {         scanf("%s%s",a1,a2);          L=strlen(a1);         for (i=0;i<L;i++) v1[i]=a1[L-1-i]-'0';          L=strlen(a2);         for (i=0;i<L;i++) v2[i]=a2[L-1-i]-'0';          for (i=0;i<MAXLEN;i++) v3[i]=v1[i]+v2[i];          for (i=0;i<MAXLEN;i++) {             if (v3[i]>=10) {                 v3[i+1]+=v3[i]/10;                 v3[i]=v3[i]%10;             }         }          printf("Case %d:\n", j+1);         printf("%s + %s = ", a1, a2);          z=0;         for (i=MAXLEN-1;i>=0;i--) {             if (z==0) {                 if (v3[i]!=0) {                     printf("%d",v3[i]);                     z=1;                 }             } else {                 printf("%d",v3[i]);             }         }         if (z==0) printf("0");          printf("\n");     } } //Sample Input //3 //0 0 //1 2 //112233445566778899 998877665544332211 // //Sample Output //Case 1: //0 + 0 = 0 //Case 2: //1 + 2 = 3 //Case 3: //112233445566778899 + 998877665544332211 = 1111111111111111110

然而事实证明我的16位的9加 上9结果还是对的    -_-||...

可是我的并没有什么不对啊

修改如下：  #include<stdio.h> #include<string.h> #define size 1001  int main() { 	char str1[size], str2[size], *num1, *num2, *p1, *p2; 	int ncase/*多组输入数目*/, mcase = 1/*输出时的第几个输出计数器*/, up/*进位存储器*/, len1, len2, len; 	scanf("%d", &ncase); 	while (ncase--) 	{ 		scanf("%s %s", str1, str2); 		printf("case %d:\n", mcase++); 		printf("%s + %s = ", str1, str2); 		len1 = strlen(str1);/*分别计算两数长度*/ 		len2 = strlen(str2); 		if (len1 >= len2)/*把num1赋较大数的数组首地址num2赋较小数的数组首地址，且保证len1存长数组长度len2存短数组长度*/ 		{ 			num1 = str1; 			num2 = str2; 		} 		else 		{ 			num1 = str2; 			num2 = str1; 			len = len1; 			len1 = len2; 			len2 = len; 		} 		up = 0;/*进位赋初值0*/ 		//for (p1 = num1 + len1 - 1, p2 = num2 + len2 - 1; p1 >= num1; p1--, p2--)/*从各自最小位逐位相加，以较大数的最高位为边界*/ 		for (p1 = num1 + len1 - 1, p2 = num2 + len2 - 1; p2 >= num2; p1--, p2--)/*从各自最小位逐位相加，以较大数的最高位为边界*/ 		{ 			//if (p2 < num2)/*当高位无数时补0*/ 			//	*p2 = 48; 			*p1 = *p1 + *p2 - 96 + up;/*由ascII码值化为十进制值*/ 			up = 0; 			if (*p1 >= 10)/*如果此位相加结果十进制值大于10则作减10处理*/ 			{ 				*p1 -= 10; 				up = 1;/*进位寄存器赋1*/ 			} 			*p1 += 48;/*再次化为ascII码以供输出*/ 		} 		if (up == 1)/*当最高位加上进位仍产生进位则需于前再输出一个“1”*/ 			//printf("1"); 		{ 			while (p1 >= num1) 			{ 				*p1 += 1; 				if (*p1 > '9') 				{ 					*p1 = '0'; 					up = 1; 					p1--; 				} 				else break;   //无进位，直接跳出 			} 			if (p1 < num1) printf("1"); 		} 		printf("%s\n", num1);/*输出经加法处理改动的大数组*/ 		if (ncase != 0) 			printf("\n"); 	} 	return 0; }


Question: 求正交试验L9（3-4）正交试验设计软件源代码（能运行就行）

想下载试用一下


Question: 缓冲呢溢出问题！！有源代码！！

引用 3 楼 zhangxiangDavaid 的回复:把所有的 point_to_card[card_count] = (char*)malloc(sizeof(char)*strlen(current_name)); 改为 point_to_card[card_count] = (char*)malloc(sizeof(char)*(strlen(current_name)+1)); 是哦。最后还有个结束符

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

另外在赋上一句,定义为数组的char是有初始地址的,没必要再malloc

字符串溢出,把空间定义大点。 #include<stdio.h> #include<string.h> #include<stdlib.h> #include<time.h>  const char card[] = "IDB_CARD_";  const char *card_4[] = { "SWORD_", "WAND_", "PENT_", "CUP_" };  const char *card_royal[] = { "KING", "KNAVE", "QUEEN", "KNIGHT" };  char *point_to_card[78] = { NULL };    int sort[78] = { 0 };//the card's sorting  int main()//this is a model to get name in dll ,it's ok?? { char current_name[50] = "\0", num[10] = "\0";//字符串溢出,把空间定义大点。 int count = 0, big_count = 0, card_count = 0;  int i; strcpy(current_name, card); for (big_count = 1; big_count <= 5; big_count++) { 	if (big_count == 1) 	{ 		for (count = 0; count <= 21; count++) 		{ 			itoa(count, num, 10); 			strcat(current_name, num); 			point_to_card[card_count] = (char*)malloc(sizeof(char)*strlen(current_name)); 			strcpy(point_to_card[card_count], current_name); 			strcpy(current_name, card); 			card_count++; 			 		} 	} 		else{ 			for (count = 1; count <= 14; count++) 			{ 				if (count <= 10) 				{ 					strcat(current_name, card_4[big_count - 2]); 					itoa(count, num, 10); 					strcat(current_name, num); 					point_to_card[card_count] = (char*)malloc(sizeof(char)*strlen(current_name)); 					strcpy(point_to_card[card_count], current_name); 					strcpy(current_name, card); 					card_count++; 					 				}  				else 				{ 					strcat(current_name, card_4[big_count - 2]); 					strcat(current_name, card_royal[count - 11]); 					point_to_card[card_count] = (char*)malloc(sizeof(char)*strlen(current_name)); 					strcpy(point_to_card[card_count], current_name); 					strcpy(current_name, card); 					card_count++; 					 				} 			} 		} 	} }


Question: 简单的单向链表输出问题，急！！

仅供参考：//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //

参考代码段 https://github.com/707wk/Senior-middle-school/blob/master/Filling%20in%20the%20gaps.c

引用 8 楼 windzhu0514 的回复:最后一个元素的next指针没有置空有的。

最后一个元素的next指针没有置空

引用 5 楼 zhangxiangDavaid 的回复:从头至尾，看下逻辑，你会明白的原先的head=p1，然后p1=p2，地址变化了，此时head的地址和p1不等，是这样吧？？

引用 5 楼 zhangxiangDavaid 的回复:从头至尾，看下逻辑，你会明白的好的，谢谢！

从头至尾，看下逻辑，你会明白的

引用 2 楼 ilinfe 的回复:[quote=引用 1 楼 zhangxiangDavaid 的回复:] 修改如下：  void creat() { 	count *p1, *p2; 	p1 = new count;  	p2 = new count; 	head = p1; 	cin >> p2->shu; 	p1->next = p2;    //加一句 	p1 = p2; 	while (p1->shu != -1) 	{ 		p2 = new count; 		cin >> p2->shu; 		p1->next = p2; 		p1 = p2; 	} 	//p2 = new count; 	//p2 = NULL; 	p1->next = NULL; 	p1 = head; 	while (p1 != NULL)   //输出，问什么停不下来？！ 	{ 		cout << p1->shu << endl; 		p1 = p1->next; 	}} 这样不行啊  输入 2 3 -1 输出的是2014140（大数） 3  -1[/quote] 你这个是带头节点的，第一个数据不算

引用 1 楼 zhangxiangDavaid 的回复:修改如下：  void creat() { 	count *p1, *p2; 	p1 = new count;  	p2 = new count; 	head = p1; 	cin >> p2->shu; 	p1->next = p2;    //加一句 	p1 = p2; 	while (p1->shu != -1) 	{ 		p2 = new count; 		cin >> p2->shu; 		p1->next = p2; 		p1 = p2; 	} 	//p2 = new count; 	//p2 = NULL; 	p1->next = NULL; 	p1 = head; 	while (p1 != NULL)   //输出，问什么停不下来？！ 	{ 		cout << p1->shu << endl; 		p1 = p1->next; 	} } 我改了一点解决了。请教一下，之前为啥输出停不下来？？？一直搞不懂

引用 1 楼 zhangxiangDavaid 的回复:修改如下：  void creat() { 	count *p1, *p2; 	p1 = new count;  	p2 = new count; 	head = p1; 	cin >> p2->shu; 	p1->next = p2;    //加一句 	p1 = p2; 	while (p1->shu != -1) 	{ 		p2 = new count; 		cin >> p2->shu; 		p1->next = p2; 		p1 = p2; 	} 	//p2 = new count; 	//p2 = NULL; 	p1->next = NULL; 	p1 = head; 	while (p1 != NULL)   //输出，问什么停不下来？！ 	{ 		cout << p1->shu << endl; 		p1 = p1->next; 	}} 这样不行啊  输入 2 3 -1 输出的是2014140（大数） 3  -1


Question: 华为oj测试为什么缺少一种情况

没设格式，真心不好看  #include <stdio.h>  static int search_tab(const char *tab, int len) { 	int i; 	int k = 0; 	char s = -1; 	 	for (i = 0; i < len; ++i) { 		if (tab[i] == 0) { 			continue; 		} 		 		if (s == -1) { 			s = tab[i]; 		} 		else { 			if (s != tab[i]) { 				return 0; 			}	 		} 		k++;			 	} 	 	return k;	 }  int get_min_period(const char *input) { 	char tab[256] = {0}; 	int s; 	 	while (*input != '\0') { 		tab[*input++]++;		 	} 	 	s = search_tab(tab, sizeof(tab)); 	 	return s; }  /* test */ int main(void) { 	int s; 	char *p = "abcabcabcabcabc"; 	 	s = get_min_period(p); 	 	if (s) { 		printf("palindrome, min period: %d\n", s); 	} 	else { 		printf("Non palindrome\n"); 	} 	 	return 0;	 }

随手写了一个，不过只能检测完整的回文  #include <stdio.h>  static int search_tab(const char *tab, int len) { 	int i; 	int k = 0; 	char s = -1; 	 	for (i = 0; i < len; ++i) { 		if (tab[i] == 0) { 			continue; 		} 		 		if (s == -1) { 			s = tab[i]; 		} 		else { 			if (s != tab[i]) { 				return 0; 			}	 		} 		k++;			 	} 	 	return k;	 }  int get_min_period(const char *input) { 	char tab[256] = {0}; 	int s; 	 	while (*input != '\0') { 		tab[*input++]++;		 	} 	 	s = search_tab(tab, sizeof(tab)); 	 	return s; }  /* test */ int main(void) { 	int s; 	char *p = "abcabcabcabcabc"; 	 	s = get_min_period(p); 	 	if (s) { 		printf("palindrome, min period: %d\n", s); 	} 	else { 		printf("Non palindrome\n"); 	} 	 	return 0;	 }

对于类似于“abcdef”这种字符串，总可以返回自身长度吧


Question: windows程序设计例题疑问

引用 1 楼 user-1 的回复:CreateWindow UpdateWindow GetDC ReleaseDC 检查一下自己是不是打错，打漏，弄错大小写  好了，，此贴终结，，，，，，我脑残，，


Question: 求助，程序编译出错

将错误信息中出现的标识符放在google里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 工程、设置、Link、分类：Input、附加库路径：填写附加依赖库所在目录 分号间隔多项 工程、设置、Link、分类：Input、对象/库模块：填写附加依赖库的名字.lib 空格间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

提示说明变量外部符号_DibLoadImage无法链接，很可能是没有导入包含函数DibLoadImage的lib和dll的问题。

程序崩溃时，中止程序，查看调用堆栈，定位到出错的代码处


Question: MATLAB写的年龄估计程序，svm建立的模型测试出的label永远是1

哥，我是一样的，能不能把你的代码发一份给我看看？   matlab的年龄估计。


Question: c语言读取txt文档，有程序，但是要读取的文档没有

这只是程序读取的部分，程序是可以运行的。因为这个程序我是拿过来修改的，没有txt文档，所以程序中读取txt部分我不太懂。这个是多种格式读取。谢谢大家的回复，我自己研究了很长时间，最后写出txt文档了，只要按照scacnf所要求的格式严格依次在txt中逐行输入数据就可以了，感谢大家！

多种格式混合读取

根据代码推测文件格式？

,&n,&m,&pq,&pv,&duidi,&eps 这些东西的定义呢。你确定可以编过么


Question: 基于BP神经网络的手写体数字识别系统

要求是用C语言做，邮箱：972052780@qq.com ，跪谢


Question: 关于C中随机数的一个问题

谢谢您，受教了

不要把srand放在取随机数的地方，这玩意初始一次就够了。然后每一次的rand()里面会有线性同余的方法作一下叠代运算。


Question: 将一个含n个字符的字符串从第m个字符开始的全部字符复制成另一个字符串，为什么结果少最后一个字符？

上面有个地方讲错了啊。。。“证据就是在你的输出代码中并没有任何换行符，但是输出内容却自动换行了。”这句话是错的，，我脑残了，，请自动过滤，，。。

# include <stdio.h>  void copy(char *, int, int);  int main(void) { 	int n, m; 	int i; 	char str[20] = {0}; 	printf("enter num\n"); 	scanf("%d %d", &n, &m); 	getchar(); 	 	for (i = 0; i < n; i++) 	{ 		scanf("%c", &str[i]); 	} 	copy(str, m, n);  	return 0; }  void copy(char * str, int m, int n) { 	int i; 	for (i = m-1; i < n; i++) 		printf("%c", str[i]); 	printf("\n"); }  问题出在你输入数字之后按下的那个回车，被下面循环中的获取字符操作，存在了字符数组里，你看上去输入的是qwerty，其实应该是\nqwert并没有Y。你传进去的参数m是2，在数组中是第三个元素，即w，所以输出的内容是wert。证据就是在你的输出代码中并没有任何换行符，但是输出内容却自动换行了。在scanf2个数字之后使用getchar()接住换行符，或者使用flushall()清空缓冲区即可。 引用赵老师的名言，F9加断点，F5执行，F10单步执行，自己观察监视器中各个变量的实时数据，进行推测哪里出错了。然后F11进入函数什么的，后面的我不会编了。好了就说到这里，不知道我上面的解答有没什么错误，后续跟上即可。


Question: 新手求助[文本]C语言如何删除文本内指定的的字符或单词 插入字符或单词怎么实现？

引用 1 楼 henuyx 的回复:我来说说我的理解。  首先，文本文件在磁盘上的存储一般是一块一块连续的，  如果单纯修改文件的内容（一对一修改），这种情况下不会修改文件的长度，这样还好，直接读到那个位置将新数据写入即可。  但是如果涉及到了文件长度的修改，比如删除了一些字符，或者是插入了一些字符，这样必然会影响之后的数据位置的偏移。  所以我的思路是，先读出数据，存到一个buffer里，然后按要求修改数据，最后再把数据写入文件（写入之前将文件truncate为0）。  上面的思路有一个问题，如果文件比较大，那buffer也不可能想多大就多大对吧， 可以每次读出一部分数据比如2048个字节，先修改这2048个字节的数据，再写入另外一个新的文件，继续读数据，修改，再继续追加写入那个新的文件。最后将旧文件删除，将新文件名字改为旧文件的名字。 （这里注意一种情况，就是，每次读出的数据，最后那个单词什么的，可能被截截断了，所以要做一个特殊处理）。   ----------------- 个人理解，大神一般都在楼下面。  存到缓存区之后可以随便自主修改的吗？我不知道怎么实现这个功能…

引用 2 楼 xiaohuh421 的回复:既然是初学者, 那就不要考虑太多.  最简单的实现场景即可. 1. 读取原文件到内存缓冲区.  (可以假定文件不超过1K) 2. 按需要增删改查字符串. 3. 重新写回文件. 先做好这个, 再来看1楼提到大文件操作, 你就明白得多了. 按需要增删改 要怎么实现的？ 例如文本内容 ------------------------------------------ abc test is abc dfg test1 ------------------------------------------ 例如我要在里面某个位置增加一个字符或字符串 要怎么找到我需要的位置呢？删除也同理

按需要增删改 要怎么实现的？  例如文本内容 ------------------------------------------ abc test is abc dfg test1 ------------------------------------------ 例如我要在里面某个位置增加一个字符或单词，要怎么找到我需要的位置并插入呢？删除也同理


Question: 关于建立链表时结构体的一些问题

引用 8 楼 user-1 的回复:[quote=引用 6 楼 olewa_HHH 的回复:] [quote=引用 5 楼 user-1 的回复:] typedef struct LNode{ ElemType data; struct LNode *next; }*LinkList; 这句typedef已经将LinkList变为LNode*的别名了，所以你上面在定义p的时候直接LinkList p就行了，在加个*就是二级指针了。  谢谢你的回答，以下还有几个问题： 若修改为： typedef struct ElemType{      float coef;      int expn; }ElemType;  typedef struct LNode{      ElemType data;      struct LNode *next; }*Link;  typedef struct {      Link head,tail;      int len; }LinkList; 定义LinkList L; 1.L的tail成员中的data成员的coef的值应该如何表示 2.之前我学习的是谭浩强的书，没有关于结构体这方面的详细知识，请问在哪些书中有这方面的详细知识 [/quote]  L是个结构体变量，所以L.tail  tail是个指向结构体的指针，所以tail->data, data也是个结构体变量，所以data.coef。所以就是L.tail->data.coef谭老师的书看完之后可以看下c primer plus期间可以看下郝斌的C语言的视频教程。之后看看c和指针和c陷阱与缺陷。我也是去年才开始学编程的，这也是我自己的学习路线。之后准备学啥就看你自己的喜好了，我之后又去学了c++，前段时间才看完c++primer，准备再看一遍。还有传智播客的网上有很多免费的视频，感觉讲的挺好的，有功夫可以去看看有什么自己想看的视频。谭老师的书看一遍就够，反正就是个领你上个道儿，后续的书籍也可以参考论坛里很多大神们推荐的书籍，看个2，3遍肯定是要的。[/quote]  typedef struct ElemType{ 	float coef; 	int expn; }ElemType;  typedef struct LNode{ 	ElemType data; 	struct LNode *next; }LinkList,*Polynomial;  //构造一个空链表 Status InitList(Polynomial L){ 	L = (Polynomial)malloc(sizeof(LNode)); 	if (!L) exit(OVERFLOW); 	(*L).next = NULL; 	return OK; }   //在链表尾后加入节点 Status MakeNode(Polynomial L, ElemType e){ 	Polynomial q; 	q = (Polynomial)malloc(sizeof(LNode)); 	if (!q) exit(OVERFLOW); 	(*q).data.coef = e.coef; 	(*q).data.expn = e.expn; 	(*q).next = NULL; 	while (NULL != L)  L = (*L).next; 	L = q; 	return OK; }  void main() { 	Polynomial A, B; 	InitList(A); 	InitList(B); } 能否帮忙纠错MakeNode函数，while (NULL != L)是死循环，然而我找不出原因

知道错误了，谢谢

引用 6 楼 olewa_HHH 的回复:[quote=引用 5 楼 user-1 的回复:] typedef struct LNode{ ElemType data; struct LNode *next; }*LinkList; 这句typedef已经将LinkList变为LNode*的别名了，所以你上面在定义p的时候直接LinkList p就行了，在加个*就是二级指针了。  谢谢你的回答，以下还有几个问题： 若修改为： typedef struct ElemType{      float coef;      int expn; }ElemType;  typedef struct LNode{      ElemType data;      struct LNode *next; }*Link;  typedef struct {      Link head,tail;      int len; }LinkList; 定义LinkList L; 1.L的tail成员中的data成员的coef的值应该如何表示 2.之前我学习的是谭浩强的书，没有关于结构体这方面的详细知识，请问在哪些书中有这方面的详细知识 [/quote]  L是个结构体变量，所以L.tail  tail是个指向结构体的指针，所以tail->data, data也是个结构体变量，所以data.coef。所以就是L.tail->data.coef谭老师的书看完之后可以看下c primer plus期间可以看下郝斌的C语言的视频教程。之后看看c和指针和c陷阱与缺陷。我也是去年才开始学编程的，这也是我自己的学习路线。之后准备学啥就看你自己的喜好了，我之后又去学了c++，前段时间才看完c++primer，准备再看一遍。还有传智播客的网上有很多免费的视频，感觉讲的挺好的，有功夫可以去看看有什么自己想看的视频。谭老师的书看一遍就够，反正就是个领你上个道儿，后续的书籍也可以参考论坛里很多大神们推荐的书籍，看个2，3遍肯定是要的。

#include<stdio.h> #include<stdlib.h>  #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1 #define OVERFLOW -2 //增强语言描述功能  typedef int Status;  typedef struct ElemType{ 	float coef; 	int expn; }ElemType;  typedef struct LNode{ 	ElemType data; 	struct LNode *next; }LinkList,*Polynomial;  //构造一个空链表 Status InitList(Polynomial L){ 	L = (Polynomial)malloc(sizeof(LNode)); 	if (!L) exit(OVERFLOW); 	(*L).next = NULL; 	return OK; }   //在链表尾加入节点 Status MakeNode(Polynomial L, ElemType e){ 	Polynomial q; 	Polynomial p = L; 	q = (Polynomial)malloc(sizeof(LNode)); 	if (!q) exit(OVERFLOW); 	(*q).data = e; 	(*q).next = NULL; 	while (NULL != (*L).next) 	{ 		L = (*L).next; 	} 	(*L).next = q; 	return OK; }  //销毁线性表L，L不再存在 Status DestroyList(Polynomial L){ 	Polynomial q; 	q = L; 	while (NULL != (*L).next) 	{ 		L = (*q).next; 		free(q); 		q = L; 	} 	return OK; }  //判断e是否在L中，是则返回OK，否则返回ERROR Status LocateElem(Polynomial L, ElemType e){ 	ElemType temp; 	while (NULL != (*L).next) 	{ 		temp = (*L).data; 		if (e.coef == temp.coef && e.expn == temp.expn) return OK; 		L = (*L).next; 	} 	return ERROR; }  //建立一个多项式链表 void CreatPolyn(Polynomial L,int n){ 	int m=0,i=0; 	Polynomial p=L; 	ElemType e; 	InitList(L); 	e.coef = 0.0; e.expn = -1; 	(*L).data = e; 	printf("The number of %d List:", n); 	scanf_s("%d", &m);//scanf可能会造成内在泄露 	for (i = 1; i <= m; i++) 	{ 		printf("number %d", i); 		printf("\ncoef is: ");  scanf_s("%d", &e.coef); 		printf("expn is: ");  scanf_s("%d", &e.expn); 		MakeNode(L, e); 		p = (*p).next; 	} }  void main() { 	LinkList PA, PB; 	Polynomial A=&PA,B=&PB; 	CreatPolyn(A, 1); 	CreatPolyn(B, 2); }  这段代码在运行时会提示出错，麻烦帮找错误！

引用 5 楼 user-1 的回复:typedef struct LNode{ ElemType data; struct LNode *next; }*LinkList; 这句typedef已经将LinkList变为LNode*的别名了，所以你上面在定义p的时候直接LinkList p就行了，在加个*就是二级指针了。  谢谢你的回答，以下还有几个问题： 若修改为： typedef struct ElemType{      float coef;      int expn; }ElemType;  typedef struct LNode{      ElemType data;      struct LNode *next; }*Link;  typedef struct {      Link head,tail;      int len; }LinkList; 定义LinkList L; 1.L的tail成员中的data成员的coef的值应该如何表示 2.之前我学习的是谭浩强的书，没有关于结构体这方面的详细知识，请问在哪些书中有这方面的详细知识

引用 3 楼 olewa_HHH 的回复:[quote=引用 1 楼 user-1 的回复:] 1.对的 2.前者 3.LNode temp; L->next = &temp; Status MakeNode(LinKList *L, ElemType e){ LinKList *q; LinKList *p=L; q = (LinKList *)malloc(sizeof(LinKList)); if (!q) exit(OVERFLOW); (*q)->data = e; (*q)->next = NULL; while (NULL != *p) { L = p; *p = (*L)->next; } (*L)->next = *q; return OK; }  这段代码在(*q)->data = e;会出错，是什么原因呢？[/quote]  q是一个指向结构体的指针，如果对q进行了解引用，*q就是该指针所指向的结构体的对象，如果需要使用成员的话，请使用点操作符。所以应该是q->data， (*q).data这样使用结构中的成员。

引用 1 楼 user-1 的回复:1.对的 2.前者 3.LNode temp; L->next = &temp; Status MakeNode(LinKList *L, ElemType e){ LinKList *q; LinKList *p=L; q = (LinKList *)malloc(sizeof(LinKList)); if (!q) exit(OVERFLOW); (*q)->data = e; (*q)->next = NULL; while (NULL != *p) { L = p; *p = (*L)->next; } (*L)->next = *q; return OK; }  这段代码在(*q)->data = e;会出错，是什么原因呢？


Question: 求助 一个打字测速的软件的核心while部分始终达不到预期效果 C语言初学者。。

3楼砖家说得很对。

查找问题办法：屏蔽一部分功能，测试剩余部分，再减少屏蔽内容继续测试

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

能否把代码贴好吗？

大神帮帮我吧！！！


Question: linux下有没有比较好用的字符串分割函数？

strtok已经很好用了. 想一步到位, 那就只有封装下了.

boost里面有

仅供参考：#include <stdio.h> #include <string.h> char string[80]; char seps1[3]; char seps2[3]; char *token; char *zzstrtok (     char *string,     const char *control1,//连续出现时视为中间夹空token     const char *control2 //连续出现时视为中间无空token     ) {     unsigned char *str;     const unsigned char *ctrl1 = (const unsigned char *)control1;     const unsigned char *ctrl2 = (const unsigned char *)control2;     unsigned char map1[32],map2[32];     static char *nextoken;     static char flag=0;     unsigned char c;     int L;      memset(map1,0,32);     memset(map2,0,32);     do {         map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7));     } while (*ctrl1++);     do {         map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7));     } while (*ctrl2++);      if (string) {         if (control2[0]) {             L=strlen(string);             while (1) {                 c=string[L-1];                 if (map2[c >> 3] & (1 << (c & 7))) {                     L--;                     string[L]=0;                 } else break;             }         }         if (control1[0]) {             L=strlen(string);             c=string[L-1];             if (map1[c >> 3] & (1 << (c & 7))) {                 string[L]=control1[0];                 string[L+1]=0;             }         }         str=(unsigned char *)string;     }     else str=(unsigned char *)nextoken;      string=(char *)str;     while (1) {         if (0==flag) {             if (!*str) break;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 break;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 string++;                 str++;             } else {                 flag=1;                 str++;             }         } else if (1==flag) {             if (!*str) break;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 flag=0;                 break;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 flag=2;                 break;             } else str++;         } else {//2==flag             if (!*str) return NULL;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 str++;                 string=(char *)str;                 flag=0;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 str++;                 string=(char *)str;             } else {                 string=(char *)str;                 str++;                 flag=1;             }         }     }     nextoken=(char *)str;      if (string==(char *)str) return NULL;     else             return string; } void main() {    strcpy(string,"A \tstring\t\tof ,,tokens\n\nand some  more tokens, ");    strcpy(seps1,",\n");strcpy(seps2," \t");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,"1234| LIYI|China | 010 |201110260000|OK");    strcpy(seps1,"|");strcpy(seps2," ");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,"1234|LIYI||010|201110260000|OK");    strcpy(seps1,"");strcpy(seps2,"|");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,"1234|LIYI||010|201110260000|OK");    strcpy(seps1,"|");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,"a");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,"a,b");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,"a,,b");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,",a");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,"a,");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,",a,,b");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,",,a,,b,,");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,",");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,",,");    strcpy(seps1,",");strcpy(seps2,"");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    }     strcpy(string,",,,");    strcpy(seps1,",");strcpy(seps2," ");    printf("\n[%s]\nTokens:\n",string);    token=zzstrtok(string,seps1,seps2);    while (token!=NULL) {       printf(" <%s>",token);       token=zzstrtok(NULL,seps1,seps2);    } } // //[A      string          of ,,tokens // //and some  more tokens,] //Tokens: // <A>, <string>, <of>, <>, <tokens>, <>, <and>, <some>, <more>, <tokens>, <>, //[1234| LIYI|China | 010 |201110260000|OK] //Tokens: // <1234>, <LIYI>, <China>, <010>, <201110260000>, <OK>, //[1234|LIYI||010|201110260000|OK] //Tokens: // <1234>, <LIYI>, <010>, <201110260000>, <OK>, //[1234|LIYI||010|201110260000|OK] //Tokens: // <1234>, <LIYI>, <>, <010>, <201110260000>, <OK>, //[a] //Tokens: // <a>, //[a,b] //Tokens: // <a>, <b>, //[a,,b] //Tokens: // <a>, <>, <b>, //[,a] //Tokens: // <>, <a>, //[a,] //Tokens: // <a>, <>, //[,a,,b] //Tokens: // <>, <a>, <>, <b>, //[,,a,,b,,] //Tokens: // <>, <>, <a>, <>, <b>, <>, <>, //[,] //Tokens: // <>, <>, //[,,] //Tokens: // <>, <>, <>, //[,,,] //Tokens: // <>, <>, <>, <>,

linux下用stl的string如何


Question: 位运算，除法与位数的关系 问题

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

B=A/16     这个它会把A/16的结果是8位   但B只取低四位的值

看汇编，明白一切

右移分为逻辑右移和算术右移，C语言中对于无符号数据采取逻辑右移，此时高位用0填充；但对于有符号数据则采用算术右移，高位用符号位填充。对于这两种情况，右移k位都等效于除以2^k，仅在对结果的舍入上有细微的差别。

引用 2 楼 q3733353520 的回复:#include <stdio.h>  int main() { 	short int *b = (unsigned short int)41855;  	char *a = &b;  	printf("a = [%x]\n", *a); 	printf("b = [%x]\n", *b); } #include <stdio.h> 不好意思 例子有问题  int main() { 	short int b = 41855;  	char *a = &b;  	printf("a = [%hx]\n", *a); 	printf("b = [%hx]\n", b); }

右移和除法是等效的 你说的第一种情况A1是8位，但是高4位都是0，和4位有啥区别呢？主要是看保存A的类型所占用的位数。 B=A/16和B=A>>4等效。把A右移四位之后的结果保存到B


Question: 新手上机练习编译该用什么编译器

引用 9 楼 zhao4zhong1 的回复:先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm+1

我以前一直用VC6的IDE ,现在我发现 eclispe + MinGW 很好用，还能写JAVA, 和手机应用开发。优点：单步运行调试程序，只要你想看到的变量，基本都能看到，比VC强，功能强大。如果只对数据结构算法感兴趣，TC就足以，很小。也很好。

先下载Win-TC，然后参考C:\Win-TC\tcstudy.chm

vs2015 https://www.visualstudio.com/zh-cn/downloads/visual-studio-2015-downloads-vs

+1 引用 5 楼 mymtom 的回复:code::Blocks

dev-c++ gcc

code::Blocks

vc6好一些,vs有些复杂.

都说VS，我就去下来看看，谢谢啦

VS gcc

VS吧，我觉得挺好的


Question: glibc源代码如何入手研究

引用 1 楼 zmlovelx 的回复:在linux下结合find   grep 等工具查找，事半功倍。 英雄所见略同

在linux下结合find   grep 等工具查找，事半功倍。


Question: 求助用C拼接Buffer的问题，求高手指点？

搞定啦，谢谢各位的支持

仅仅根据你的结果，把前面两个数转换成字符就行了。 例如：   54 是 字符‘6’的十进制值。          50 50 是字符‘2’‘2’的十进制值。 你看看你哪个地方转错了。  引用 6 楼 absenvan 的回复:我用下面的方式打印buf：  for (int i = 0; i< (len1+len2+len3); i++) {             printf("%d,",buf[i]);         }  你的代码打印如下： 54,118,49,46,51,46,48,50,50,104,116,116,112,58,47,47,119,119,119,46,115,105,110,97,46,99,111,109,46,99,110,51,51,57,98,97,97,49,54,56,100,57,98,99,99,99,57,102,97,99,55,55,97,98,97,50,97,97,57,102,48,  我失望得到这样的： 0,6,118,49,46,51,46,48,0,22,104,116,116,112,58,47,47,119,119,119,46,115,105,110,97,46,99,111,109,46,99,110,0,33,57,98,97,97,49,54,56,100,57,98,99,99,99,57,102,97,99,55,55,97,98,97,50,97,97,57,102,48,55,55,100,99,51,   我解解释下： 0,6,  //第一个参数的长度 118,49,46,51,46,48, //第一个参数 0,22, //第二个参数的长度 104,116,116,112,58,47,47,119,119,119,46,115,105,110,97,46,99,111,109,46,99,110, //第二个参数 0,33,//第三个长度 57,98,97,97,49,54,56,100,57,98,99,99,99,57,102,97,99,55,55,97,98,97,50,97,97,57,102,48,55,55,100,99,51,//第三个参数  请问你上面的代码怎么优化得到这个数据呢？

malloc、realloc、free

Buffer  =  第一个参数+ 第二个参数 + 第三个参数 拼接格式： Buffer   =  [wParamLen + strParamValue]+ [wParamLen + strParamValue]+ [wParamLen + strParamValue]   wParamLen:表示2个字节，strParameValue：表示字符串。

这样可好：  int main(void) { 	char buf[256]; 	char *p = buf; 	int r; 	char *para1 = "v1.3.0"; //strParamValue; 	unsigned short len1 = strlen(para1);  //wParamLen 	char *para2 = "http://www.sina.com.cn"; 	unsigned short len2 = strlen(para2); 	char *para3 = "9baa168d9bccc9fac77aba2aa9f077dc3"; 	unsigned short len3 = strlen(para3); 	r = sprintf(p, "%d", len1); 	p += r; 	r = sprintf(p, "%s", para1); 	p += r; 	r = sprintf(p, "%d", len2); 	p += r; 	r = sprintf(p, "%s", para2); 	p += r; 	r = sprintf(p, "%d", len3); 	p += r; 	r = sprintf(p, "%s", para3); 	printf("%s\n", buf); 	return 0; } //6v1.3.022http://www.sina.com.cn339baa168d9bccc9fac77aba2aa9f077dc3

char *para1 = "v1.3.0"; char *para2 = "http://www.sina.com.cn"; char *para3 = "9baa168d9bccc9fac77aba2aa9f077dc3"; int len = strlen(para1) + strlen(para2) + strlen(para3);  char *buffer = (char *)malloc(len + 1); sprintf(buffer, "%s%s%s", para1, para2, para3); printf("%s", buffer); free(buffer)

这是我拼接的不知道对不对啊？求指导？         char *para1 = "v1.3.0";         char  len1 =  strlen(para1);         char *para2 = "http://www.sina.com.cn";         char  len2 =  strlen(para2);         char *para3 = "9baa168d9bccc9fac77aba2aa9f077dc3";         char  len3 =  strlen(para3);                  char buffer[256]={0};         strcat(buffer, &len1);         strcat(buffer, para1);                  strcat(buffer, &len2);         strcat(buffer, para2);                  strcat(buffer, &len3);         strcat(buffer, para3);         printf("%s",buffer);

strcat或sprintf


Question: C语言及程序设计通关秘籍，一般人不告诉他

看了，想去学习，。。。。

我想去 进一步了解C语言

可以代写单片机程序吗？

有没有代写程序的

还是得有本好书。 《C语言非常道》了解一下。

不错，表示个人用着还算不错

丢了十几年，为了孩子再拿起来，看着还行。。。

刚开始就想放弃

不明觉厉，很厉害的样子

学习了，谢谢大神！

点个赞，老师好，10个字符

能不能试听一下啊

引用 12 楼 虱尊的回复:还有价格 高人说过学习不能谈钱 大哥说的很有道理

所谓的秘籍也就是持之以恒的学习和耐力吧

kindle格式的文档有没有啊

基础东西，对于初学者有用

学习了，已收藏

了解一下！！！！

数据结构不会