Question: 做一个链表的题目~不知道哪儿错了，求教

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

建议单步跟踪程序运行，观察每条语句执行结果与你期望的是否一致，分析原因

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  仅供参考：//不带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> #include <locale.h> struct NODE {     int          data;     struct NODE *next; } *head,*p,*q,*s,*p1,*p2,*q1,**ta; int i,k,n,t,m,v,N=10; int main() {     setlocale(LC_ALL,"chs");     srand(time(NULL));      head=NULL;      printf("创建%d个节点的单链表:",N);//创建N个节点的单链表     p=head;     for (i=0;i<N;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) exit(1);         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         if (NULL==p) {             head=q;             p=head;         } else {             p->next=q;             p=q;         }     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=3;     v=5;     printf("将值为%d的结点插入到单链表的第%d个结点前:",v,k);//将值为v的结点插入到单链表的第k个结点前     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) exit(1);             q->data=v;             q->next=head;             head=q;             break;         } else {             if (k-1==n) {                 q=(struct NODE *)malloc(sizeof(struct NODE));                 if (NULL==q) exit(1);                 q->data=v;                 q->next=p->next;                 p->next=q;                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      k=5;     printf("删除第%d个节点:",k);//删除第k个节点     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==1) {             q=head;             head=head->next;             free(q);             break;         } else {             if (k-1==n) {                 q=p->next;                 if (q) {                     p->next=q->next;                     free(q);                 }                 break;             }         }         p=p->next;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      printf("从小到大排序:");//从小到大排序     for (p=head,p1=NULL;p!=NULL;p1=p,p=p->next) {         for (q=p->next,q1=p;q!=NULL;q1=q,q=q->next) {             if (p->data > q->data) {                  //交换data //              printf("swap %02d %02d\n",p->data,q->data); //              t=p->data;p->data=q->data;q->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->data,q->data);                 if (p==head) {//p是头                     if (p->next==q) {//pq挨着                         head=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=head;                     } else {//pq不挨着                         head=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=head;                     }                 } else {//p不是头                     if (p->next==q) {//pq挨着                         p1->next=q;                         p->next=q->next;                         q->next=p;                         q=p;                         p=p1->next;                     } else {//pq不挨着                         p1->next=q;                         p2=p->next;                         p->next=q->next;                         q->next=p2;                         q1->next=p;                         q=p;                         p=p1->next;                     }                 }                  //输出整个单链表 //              s=head; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表并计算链表长度n     n=0;     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         n++;         s=s->next;     }      printf("将整个链表逆序:");//将整个链表逆序     if (n>=2) {         p=head;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head=p;     }      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      m=4;     n=6;     printf("将单链表中前%d个结点和后%d个结点进行互换:",m,n);//将单链表中前m个结点和后n个结点进行互换,m+n为链表总长     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m==k) {             q=p;         }         s=p;         p=p->next;     }     q1=head;     head=q->next;     s->next=q1;     q->next=NULL;      //输出整个单链表     s=head;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //创建10个节点的单链表:08->74->07->23->03->99->31->56->88->16-> //将值为5的结点插入到单链表的第3个结点前:08->74->05->07->23->03->99->31->56->88->16-> //删除第5个节点:08->74->05->07->03->99->31->56->88->16-> //从小到大排序:03->05->07->08->16->31->56->74->88->99-> //将整个链表逆序:99->88->74->56->31->16->08->07->05->03-> //将单链表中前4个结点和后6个结点进行互换:31->16->08->07->05->03->99->88->74->56-> //

我做出来了~改了好多。多谢你的建议


Question: 一道关于打印非打印字符的C语言问题

仅供参考：#pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <conio.h> #include <stdio.h> #include <stdlib.h> #include <windows.h> wchar_t a2w[256]={ 0x0020,0x263a,0x263b,0x2665,0x2666,0x2663,0x2660,0x2022, 0x25d8,0x25cb,0x25d9,0x2642,0x2640,0x266a,0x266b,0x263c, 0x25ba,0x25c4,0x2195,0x203c,0x00b6,0x00a7,0x25ac,0x21a8, 0x2191,0x2193,0x2192,0x2190,0x221f,0x2194,0x25b2,0x25bc, 0x0020,0x0021,0x0022,0x0023,0x0024,0x0025,0x0026,0x0027, 0x0028,0x0029,0x002a,0x002b,0x002c,0x002d,0x002e,0x002f, 0x0030,0x0031,0x0032,0x0033,0x0034,0x0035,0x0036,0x0037, 0x0038,0x0039,0x003a,0x003b,0x003c,0x003d,0x003e,0x003f, 0x0040,0x0041,0x0042,0x0043,0x0044,0x0045,0x0046,0x0047, 0x0048,0x0049,0x004a,0x004b,0x004c,0x004d,0x004e,0x004f, 0x0050,0x0051,0x0052,0x0053,0x0054,0x0055,0x0056,0x0057, 0x0058,0x0059,0x005a,0x005b,0x005c,0x005d,0x005e,0x005f, 0x0060,0x0061,0x0062,0x0063,0x0064,0x0065,0x0066,0x0067, 0x0068,0x0069,0x006a,0x006b,0x006c,0x006d,0x006e,0x006f, 0x0070,0x0071,0x0072,0x0073,0x0074,0x0075,0x0076,0x0077, 0x0078,0x0079,0x007a,0x007b,0x007c,0x007d,0x007e,0x2302, 0x00c7,0x00fc,0x00e9,0x00e2,0x00e4,0x00e0,0x00e5,0x00e7, 0x00ea,0x00eb,0x00e8,0x00ef,0x00ee,0x00ec,0x00c4,0x00c5, 0x00e9,0x00e6,0x00c6,0x00f4,0x00f6,0x00f2,0x00fb,0x00f9, 0x00ff,0x00d6,0x00dc,0x00a2,0x00a3,0x00a5,0x20a7,0x0192, 0x00e1,0x00ed,0x00f3,0x00fa,0x00f1,0x00d1,0x00aa,0x00ba, 0x00bf,0x2310,0x00ac,0x00bd,0x00bc,0x00a1,0x00ab,0x00bb, 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556, 0x2555,0x2563,0x2551,0x2557,0x255d,0x255c,0x255b,0x2510, 0x2514,0x2534,0x252c,0x251c,0x2500,0x253c,0x255e,0x255f, 0x255a,0x2554,0x2569,0x2566,0x2560,0x2550,0x256c,0x2567, 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256b, 0x256a,0x2518,0x250c,0x2588,0x2584,0x258c,0x2590,0x2580, 0x03b1,0x00df,0x0393,0x03c0,0x03a3,0x03c3,0x00b5,0x03c4, 0x03a6,0x0398,0x03a9,0x03b4,0x221e,0x03c6,0x03b5,0x2229, 0x2261,0x00b1,0x2265,0x2264,0x2320,0x2321,0x00f7,0x2248, 0x00b0,0x2219,0x00b7,0x221a,0x207f,0x00b2,0x25a0,0x00ff, }; extern "C" HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);      if(GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     wchar_t ws[256];     unsigned char s[256];     int i;       system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hfont = CreateFont(16,  0, 0, 0, 0, 0, 0, 0, 0           , 0, 0, 0, 0, "Lucida Console");     SelectObject(hdc,hfont);     TextOutW(hdc,10,10,L"你好",2);     for (i=0;i<256;i++) s[i]=i;     for (i=0;i<256;i++) ws[i]=a2w[s[i]];     TextOutW(hdc,10, 40,ws    ,32);     TextOutW(hdc,10, 80,ws+ 32,32);     TextOutW(hdc,10,120,ws+ 64,32);     TextOutW(hdc,10,160,ws+ 96,32);     TextOutW(hdc,10,200,ws+128,32);     TextOutW(hdc,10,240,ws+160,32);     TextOutW(hdc,10,280,ws+192,32);     TextOutW(hdc,10,320,ws+224,32);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

引用 2 楼 qq_25185543 的回复:[quote=引用 1 楼 user-2的回复:]约定俗成的，你在终端输入ctrl + I就打印出^I CTRL l就是tab？[/quote] 你看一下ASCII表就知道了

引用 1 楼 user-2的回复:约定俗成的，你在终端输入ctrl + I就打印出^I CTRL l就是tab？

约定俗成的，你在终端输入ctrl + I就打印出^I


Question: 请帮忙看下哪里错了  感谢！！！

引用 2 楼 qq_35983245 的回复:[quote=引用 1 楼 paschen 的回复:] CreatSMatrix函数没有返回一个值  PrintSMartrix 也没有返回 这个没关系吧  主要是输出不对[/quote]  建议在必要的地方设置断点，然后单步跟踪程序运行，看每条语句执行结果与你期望是否一致

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

调试一下，看看每个值是否和你想要的值相符，找出不对的地方，再根据这个值来找你错的位置。

引用 1 楼 paschen 的回复:CreatSMatrix函数没有返回一个值  PrintSMartrix 也没有返回 这个没关系吧  主要是输出不对


Question: 字符易位破译程序，下面是我写的，看不懂Debug，请解释一下，谢谢

这样改：  #include <stdio.h> int change(char a[5],char b[5]) { 	int i,j; 	for(i=0;i<5;i++) a[i]=(int)a[i]; 	for(j=0;j<5;j++) b[i]=(int)b[i]; 	return (a[5],b[5]); }  int sort(char a[5],char b[5]) { 	int i,j,t; 	for(i=0;i<4;i++) 	{ 		if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;} 	}	 	for(j=0;j<4;j++) 	{ 		if(b[i]>b[i+1]) {t=b[i];b[i]=b[i+1];b[i+1]=t;} 	} 	return (a[5],b[5]); }	   int compare(char a[5],char b[5]) { 	int i; 	for(i=0;i<5;i++) 	{ 		if (a[i]==b[i]) printf("是字母异位词"); 		else printf("不是字母异位词"); 	} }   int main() { 	int i,j; 	char a[5]; 	char b[5]; 	for(i=0;i<5;i++) scanf("%s",&a); 	for(j=0;j<5;j++) scanf("%s",&b); 	change (a,b); 	sort (a,b); 	compare (a,b); }

不知道你的程序是干什么的，只能把语法错误调没了 #include <stdio.h> int change(char a[5],char b[5]) { 	int i,j; 	for(i=0;i<5;i++) a[i]=(int)a[i]; 	for(j=0;j<5;j++) b[i]=(int)b[i]; 	return (a[5],b[5]); }  int sort(char a[5],char b[5]) { 	int i,j,t; 	for(i=0;i<4;i++) 	{ 		if(a[i]>a[i+1]) {t=a[i];a[i]=a[i+1];a[i+1]=t;}; 	}	 	for(j=0;j<4;j++) 	{ 		if(b[i]>b[i+1]) {t=b[i];b[i]=b[i+1];b[i+1]=t;}; 	} 	return (a[5],b[5]); }	   int compare(char a[5],char b[5]) { 	int i; 	for(i=0;i<5;i++) 	{ 		if (a[i]==b[i]) printf("是字母异位词"); 		else printf("不是字母异位词"); 	} 	return 0; }   int main() { 	int i,j; 	char a[5]; 	char b[5]; 	scanf("%s",&a); 	scanf("%s",&b); 	change(a,b); 	sort(a,b); 	compare(a,b); }


Question: Turbo C 为什么不支持windows.h？

include windows.h的全路径,全路径参考下面的博客... http://blog.csdn.net/hyman_c/article/details/53057037

莫非楼主想写的是Win32控制台程序？用VC就可以了。

你需要包含这个文件，这个文件通常在平台SDK目录下，你需要设置包含目录  建议换VS，别去折腾TC了

当真？for DOS的编译器支持windows.h？

BC支持windows.h bc++3.1 http://download.csdn.net/source/2805028  Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

需要设置一下include的搜索路径。

支持的，你不会用编译器而已


Question: 请问C语言Windows记事本的行数用'\n'统计的行数怎么不一样呢？

引用 4 楼 yyxgs 的回复:[quote=引用 3 楼 u010165006 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。[/quote]  嗯，不过我这个选项，我每次装系统都会关掉的，即使关掉，也只能显示1024列。[/quote]  我的Win7系统的记事本，自动换行默认是开的，你用的是什么系统？1024列没有试过。

引用 3 楼 u010165006 的回复:[quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。[/quote]  嗯，不过我这个选项，我每次装系统都会关掉的，即使关掉，也只能显示1024列。

引用 2 楼 yyxgs 的回复:[quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。

引用 6 楼 yyxgs 的回复:[quote=引用 5 楼 u010165006 的回复:] [quote=引用 4 楼 yyxgs 的回复:] [quote=引用 3 楼 u010165006 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。[/quote]  嗯，不过我这个选项，我每次装系统都会关掉的，即使关掉，也只能显示1024列。[/quote]  我的Win7系统的记事本，自动换行默认是开的，你用的是什么系统？1024列没有试过。[/quote]  我也是Win7旗舰，自动换行是关的。但也只能显示1024列。[/quote]  我试了一下，确实只能显示1024列。

引用 5 楼 u010165006 的回复:[quote=引用 4 楼 yyxgs 的回复:] [quote=引用 3 楼 u010165006 的回复:] [quote=引用 2 楼 yyxgs 的回复:] [quote=引用 1 楼 u010165006 的回复:] 贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行[/quote]  Windows记事本有个自动换行选项。[/quote]  嗯，不过我这个选项，我每次装系统都会关掉的，即使关掉，也只能显示1024列。[/quote]  我的Win7系统的记事本，自动换行默认是开的，你用的是什么系统？1024列没有试过。[/quote]  我也是Win7旗舰，自动换行是关的。但也只能显示1024列。

引用 1 楼 u010165006 的回复:贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。  我知道原因了，记事本显示1024列数据后会自动换行

贴代码看看？有可能读取一行的时候碰到中间有空白字符就没有读取空白后面的半行了。


Question: 编译器分配内存会出错吗

上面的for写错，应该是while循环

引用 10 楼 TSlyhkk 的回复:[quote=引用 9 楼 qq423399099 的回复:] 建议楼主截一下调试时候的图，感觉肯定是哪里搞错了 [/quote]  也许编译器有出错的时候，但这样简单的简单肯定不会有错。 崩溃出错原因是因为你没有对NULL检查，当next为NULL时p->next->data.pri 这出错了。 至于为什么p和L->next不一样这是肯定不会一样的，从你截图上看，你是在出错时才看他们的值，这个时候for循环已经跑了好多次了，改变了p的值，如果你把断点下到for循环这，第一次进来绝对是相等的。

引用 13 楼 TSlyhkk 的回复:[quote=引用 12 楼 qq423399099 的回复:] 你这个while循环有没有进行过？ 这里L->next->next是和p地址一样的 对啊，我也很奇怪为什么L->next->next和p的地址是一样的。[/quote] 学会使用数据断点。  仅供参考：#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

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

引用 9 楼 qq423399099 的回复:建议楼主截一下调试时候的图，感觉肯定是哪里搞错了

建议楼主截一下调试时候的图，感觉肯定是哪里搞错了

引用 12 楼 qq423399099 的回复:你这个while循环有没有进行过？ 这里L->next->next是和p地址一样的 对啊，我也很奇怪为什么L->next->next和p的地址是一样的。

稍微改了一下代码，但错误还是一样的，在排序的地方出错了 #include<stdio.h> #include<stdlib.h>  typedef struct{     char name;     int pri; }P;   typedef struct Node{     P data;     struct Node *next; }LinkList, Node;  LinkList *L=NULL;  //排序 void order() { 	LinkList *p=L->next;        while(p) 	{ 		 		if(p->data.pri<p->next->data.pri) 		{ 			P temp; 			temp=p->data; 			p->next->data=temp; 		} 		p=p->next; 	} } void print(LinkList *L) {     int i = 1;     LinkList *p = L->next;     system("cls");     while (p)     {         printf("%d", p->data.pri);         p = p->next;     }   }  int InitList() {     int num, i;     LinkList *p;     L = (LinkList*)malloc(sizeof(Node));     L->next = NULL;    scanf("%d", &num);     for (i = 0; i<num; i++)     {         p = (LinkList*)malloc(sizeof(Node)); 	fflush(stdin);         scanf("%d", &p->data.pri);         fflush(stdin);         p->next = L->next;         L->next = p;     } 	return 0; } void main() { 	InitList(); 	order(); 	print(L); 	system("pause"); }

两边是同一类型嘛？

不要怀疑编译器，它是您最忠实的伴侣。。。

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

这是执行完后的

这不是编译器分配内存出错了，因为里面不涉及内存分配 还有你的地址值是从哪儿看到的啊，是这句话刚执行完吗？是不是还没执行，或者又执行了其他的代码

要执行完这条语句之后才是一样的

嗯，这两个指针之间差了0x50，楼主用这80字节干了什么呢，我好好奇啊


Question: 动态库互相调用问题

在 编写 B 的时候，你不能假定这个 B 是由 A 呼叫的。 她可能是由 C 呼叫的。  所以，你不能这样去理解。  你应该要求，当 B 加载的时候，或者调用某个函数的时候，需要提供一个回调机制。  举个例子： 比如你的 B 的一个函数用来计算一个很复杂的数值，但是需要很长的时间。 此时 B 的这个函数，除了正常的输入参数外，还需要一个回调接口， 这个回调接口就是，当 B 计算完成时，呼叫的一个方法。 至于这个回调到底是什么，是 A 的，还是 C 的，B不知道，也不需要知道。

引用 2 楼 csc008008 的回复:@cyfcsd 感觉不知道哪里不对   都是有源码的，但是A 动态加载B的   但是B想用A里面的FUN  这个怎么做呢 跟动态不动态没关系，只要是源码可改就可以用下面的方法就行，如果不行那可能是其他问题  //main.cpp #include <iostream> #include "a.h"  using namespace std;  int main() { 	fa1(); 	system("pause"); 	return 0; }  //a.h #ifndef _A_H #define _A_H  void fa1(); void fa2();  #endif  //a.cpp #include "b.h" #include <iostream>  using namespace std;  void fa1() { 	cout<<"fa1()"<<endl; 	fb(); } void fa2() { 	cout<<"fa2()"<<endl; }  //b.h #ifndef _B_H #define _B_H  void fb();  #endif  //b.cpp #include <iostream>  using namespace std;  void fb() { 	cout<<"fb()"<<endl; 	fa2(); }

A中声明回调函数供B调用。

动态库是你自己生成的吗？要是自己生成的应该不会有问题啊，直接调用就可以了啊，你是哪儿出的问题啊


Question: C语言文件操作fread的小问题

引用 1 楼 cyfcsd 的回复:你百度下 realloc就知道了，st不是以前的地址了，原先的内容被复制到新的地方了，返回的是新的地址  你的意思我知道，但realloc是在原内存后面不够的时候才指向新地址，有的话仍指向原地址的。  这个代码的问题老师今天说了是昨天他自己写错了。。


Question: windows.h

Windows.h包含了其他Windows头文件，这些头文件的某些也包含了其他头文件。这些头文件中最重要的和最基本的是： WINDEF.H 基本数据类型定义。 WINNT.H 支持Unicode的类型定义。 WINBASE.H Kernel(内核)函数。 WINUSER.H 用户界面函数。 WINGDI.H 图形设备接口函数。 这些头文件定义了Windows的所有资料型态、函数调用、资料结构和常数识别字，它们是Windows文件中的一个重要部分。


Question: c语言链栈运行时触发断点

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

建议你单步跟踪程序运行，观察每一步结果与你期望的是否一致，分析原因   另外你在Push函数中InitStack(s);貌似没有什么意义

#include<stdio.h> #include<stdlib.h>  typedef struct {     char name[50];     int age; }DataType;   typedef struct stacknode {     DataType data;     struct stacknode *next; }StackNode;   typedef struct {     StackNode *top; }LinkStack;   StackNode *StackInit(void) {     StackNode *p;     if (p = ((StackNode *)malloc(sizeof(StackNode))))     {         p->next = NULL;         return p;     }     return NULL; }   void InitStack(LinkStack *s) {     s->top = NULL; }     int StackEmpty(LinkStack *s) {     return s->top == NULL; }     void Push(LinkStack *s, DataType x) {     StackNode *p = (StackNode *)malloc(sizeof(StackNode));     p -> data = x;     p->next = s->top;     s->top = p; }     DataType Pop(LinkStack *s) {     DataType x; 	StackNode *p = s->top;     if (StackEmpty(s))     {         printf("stack underflow");     }     x = p->data;     s->top = p->next;     free(p);     return x; }     DataType StackTop(LinkStack *s) {     if (StackEmpty(s))     {         printf("stack is empty");     }     return s->top->data; }    int main(void) { 	LinkStack ls; 	InitStack(&ls);     DataType data, data1;       printf("接下来进行入栈操作!\n");     printf("按照 姓名 年龄依次输入信息:  ");     scanf("%s%d", data.name, &data.age);     Push(&ls, data); printf("按照 姓名 年龄依次输入信息:  ");     scanf("%s%d", data.name, &data.age);     Push(&ls, data);               printf("接下来进行出栈操作!\n");     data1 = Pop(&ls);     printf("出栈操作的数据是(%s,%d)\n", data1.name, data1.age);     data1 = Pop(&ls);     printf("出栈操作的数据是(%s,%d)\n", data1.name, data1.age);       system("pause");     return 0;     }  稍微改了一下，但不是很标准，标准的实现网上有很多，你可以去看一下

引用 1 楼 GailyYelp 的回复:编译是对的，运行时输入完数据就会触发断点 改用release模式

编译是对的，运行时输入完数据就会触发断点


Question: 大神们  帮帮我  用“*”这个符号在屏幕上面输出“你好”的形状

仅供参考：#include <stdio.h> #include <conio.h> const unsigned char bit[8]={128,64,32,16,8,4,2,1}; unsigned char buffer[32]; FILE *hzk; unsigned long offset; unsigned int q,w; int x,y,qw; //-------------------------------------------------------- void display(char *hz) {      qw=*((int *)hz);     q=(qw&0x00FF)-0xA1;     w=((qw>>8)&0x00FF)-0xA1;     offset=q*0x5E+w;     offset*=32;     if ((hzk=fopen("HZK16","rb"))==NULL) {         printf("Can not open file HZK16!\n");         return;     }     fseek(hzk,offset,SEEK_SET);     fread(buffer,1,32,hzk);     fclose(hzk);     for (y=0;y<16;y++) {         for (x=0;x<16;x++) {             if (buffer[y*2+x/8] & bit[x%8]) {                 printf("%s",hz);             } else {                 printf("  ");             }         }         printf("\n");     } } void main() {     display("啊");     getch(); } //                          啊 //    啊  啊啊啊啊  啊啊啊啊啊啊 //啊啊啊啊啊    啊          啊 //啊  啊  啊    啊          啊 //啊  啊  啊  啊        啊  啊 //啊  啊  啊  啊    啊啊啊啊啊 //啊  啊  啊啊      啊  啊  啊 //啊  啊  啊  啊    啊  啊  啊 //啊  啊  啊  啊    啊  啊  啊 //啊  啊  啊    啊  啊  啊  啊 //啊啊啊  啊    啊  啊啊啊  啊 //啊  啊  啊啊  啊  啊  啊  啊 //        啊  啊            啊 //        啊                啊 //        啊            啊  啊 //        啊              啊啊

有一个清新脱俗的库叫 libcaca ，大概可以干这个

参照点阵字生成...

2              ****                                                                     ******                                                                   ****                                      **                             ****              ****************************                           ****                                    ********                         ****                                    ****                           ****                                    ****                             ****          **                      ****                     ****************************                    **                                 ****        ****                ******                                   **          ****                ******                                 ****          ****                ******                                 ****          ****                ****                                   ****        ****                  ****                                   **          ****                  ****                                   **          ****                  ****            ****                 ****          ****  **************************************               ****          ****                  ****                                 **          ****                    ****                               ****          ****                    ****                               ****          ****                    ****                               ****        ****                      ****                                   ******  ****                      ****                                       ********                      ****                                         **********                  ****                                       ****    ********              ****                                       ****      ******              ****                                     ****          ****              ****                                   ****              **              ****                               ****                        **************                             ****                              **********                           **                                      ****                                                                     **

1                  ****              **                                                     ********        ********                                                 ****            ******                                                 ******            ****                                                   ****            ******                                                   ****            ****                                                   ****              ****                        **                         ****            **********************************                     ****              ****                        ********                   ****            ****                          ****                     ********          **            ****          ****                       **  ****        ****            ******        **                       ****  ****        **              ****                                 ****    ****      **                ****                                 **      ****    **                  ****                               **        ****              ****      ****                             **          ****            ******      ****      **                     **          ****            ****        ****        **                               ****            ****        ****        ****                             ****          ****          ****          ****                           ****          ****          ****            ****                         ****          **            ****            ******                       ****        ****            ****              ****                       ****        **              ****              ******                     ****      **                ****              ******                     ****    ****                ****                ****                     ****    **                  ****                **                       ****  **                    ****                                         ****                        ****                                         ****                ************                                         ****                    ********                                         **                        ****

只弄“你好”可以按上头的搞法来，如果要灵活的话就得弄点阵字库了

#include <iostream>  using namespace std;  int main() {      string str = "　　* *        *         \n"                  "    * *        *  *****  \n"                  "   *  ******   *      *  \n"                  "   *  *    * *****   *   \n"                  "  ** *  * *   *  *  *    \n"                  " * *    *     *  *  *    \n"                  "   *  * * *   *  ******* \n"                  "   *  * *  * *  *   *    \n"                  "   *  * *  *  * *   *    \n"                  "   * *  *  *   *    *    \n"                  "   *    *     * *   *    \n"                  "   *   **    *   * **    \n";      string str2 = "　　　　　　　　　　　　　　　　　　　　　　　　 \n"                   "　　　　**　**　　　　　　　　**　　　　　　　　 \n"                   "　　　　**　**　　　　　　　　**　　**********　 \n"                   "　　　**　　************　　　**　　　　　　**　 \n"                   "　　　**　　**　　　　**　**********　　　**　　 \n"                   "　　****　**　　**　**　　　**　　**　　**　　　 \n"                   "　**　**　　　　**　　　　　**　　**　　**　　　 \n"                   "　　　**　　**　**　**　　　**　　************** \n"                   "　　　**　　**　**　　**　**　　**　　　**　　　 \n"                   "　　　**　　**　**　　**　　**　**　　　**　　　 \n"                   "　　　**　**　　**　　**　　　**　　　　**　　　 \n"                   "　　　**　　　　**　　　　　**　**　　　**　　　 \n"                   "　　　**　　　****　　　　**　　　**　****　　　 \n";       cout << str << endl;     cout << str2 << endl;     return 0; }

http://ku.cndesign.com/dot/default.aspx   　　　　　　　　　　　　　　　　　　　　　　　　 　　　　　　　　　　　　　　　　　　　　　　　　 　　　　**　**　　　　　　　　**　　　　　　　　 　　　　**　**　　　　　　　　**　　**********　 　　　**　　************　　　**　　　　　　**　 　　　**　　**　　　　**　**********　　　**　　 　　****　**　　**　**　　　**　　**　　**　　　 　**　**　　　　**　　　　　**　　**　　**　　　 　　　**　　**　**　**　　　**　　************** 　　　**　　**　**　　**　**　　**　　　**　　　 　　　**　　**　**　　**　　**　**　　　**　　　 　　　**　**　　**　　**　　　**　　　　**　　　 　　　**　　　　**　　　　　**　**　　　**　　　 　　　**　　　****　　　　**　　　**　****　　　 　　　　　　　　　　　　　　　　　　　　　　　　 这个网站可以转换

三种不同字号的点阵字体


Question: 关于%c前加空格的问题，求详解！

scanf %c和getchar()什么的，都会读取输入缓冲区遗留的回车符的（比如你之前输入过数据了） 所以在scanf %c前面加一句fflush(stdin);清空输入缓冲区

//请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];

就是第二个 scanf  %c前得加空格，不然就出错误，求解答

应该是你的程序问题，在你调用scanf函数如果缓冲区中有多余的字符肯定是不正确的，这不是空格的问题

有些时候是什么时候啊，是不是前面还有别的东西啊

你第一次输入完后还会在缓冲区中留下换行符\n，会被下一次接收掉

楼主是说的scanf  ("%c%c", &a,&b) ;这种情况输入中间加空格吗？还是什么其他的意思？


Question: 请问C语言从文件读取数据，为什么中文读出来是乱码，英文读出来却是正确的呢？

引用 2 楼 user-4 的回复:txt文件用ANSI编码保存 老哥  太感谢了 能说下为什么吗

将数据转成宽字节然后输出就可以了，fopen（）fread（）读出来的数据是ASCII

用Windows记事本——另存为，可以看到编码，是不是存为UTF-8了？有些系统比如Linux，默认的字符编码是UTF-8。

txt文件用ANSI编码保存


Question: 关于文件的操作

你fclose之前先判断fp是不是NULL啊。 要使用文件指针之前都判断一下fp的有效性，如果文件打开失败了，你应该让程序终止或者跳转到异常模块去进行一些处理

楼主是从VB6转过来的。我猜。

引用 6 楼 vectorindex 的回复:但是我执行了fp=null后 就没办法执行fclose()了 程序会中断啊啊啊啊啊啊  所以在关闭文件之前你不应该将他改为NULL啊

fp=NULL 只是让指针指向NULL，并不是关闭文件  fclose(fp) 是关闭文件

没有人可以帮我吗 啊啊啊啊啊啊

我查询函数 查不到的都返回个NULL给文件指针 当判断 可是fp置位空就fclose不了 程序中断 关不了流 那么 删除必定13

这个我知道 但是 我查找函数 如果查不到就把指针置为NULL 可是 fp置为NULL之后再执行fclose(fp) 程序会中断的 删除不了 就是因为其他功能的查找失败 文件流没有正常关闭 可是我关不了！！！！！！

fclose(fp);//才是关掉文件吧 fp = null;//只是防止野指针吧


Question: dll结构体参数传出不完全

仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

引用 6 楼 zhao4zhong1 的回复:调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx  资料里说参数是结构体的时候，是将指向它的指针传入R8寄存器，但依然不能解决我的疑惑。结构体成员的顺序不是一开始就划分好内存了吗？为什么写入顺序会造成影响？

引用 1 楼 cyfcsd 的回复:你的接口函数形参写的是啥啊？ 打一个断点，看看是不是刚执行完这个函数里面就是空的，如果是那就说明这个dll封装的函数有问题，或者是有些初始条件你没给正确

这么写是没问题的, 可能是传出来后又被其他地方覆盖了

引用 1 楼 cyfcsd 的回复:你的接口函数形参写的是啥啊？  不好意思，是帖子里写错了。。。应该是AAA &aaa

问题解决了，实参最开始用的={0}的初始化方式，改用memset之后可以传出剩余的第四个大小为900的参数了，但第五个参数依然无法传出。 后按照接口函数中对结构体成员有写入的顺序，把结构体中e[70]的位置提前，就可以正常传出五个值了 typedef struct AAA { CHAR	a[36];	 CHAR	b[460]; CHAR	e[70]; CHAR	c[12];	 CHAR	d[900];		 } AAA  虽然问题解决了，但为什么是这样还是没有想清楚

你的接口函数形参写的是啥啊？


Question: 在c使用函数部分是总出现这个

#include<stdio.h> #include<stdlib.h> #include<string.h> void main() { 	void p(char a[300]); 	char a[300]; 	gets_s(a, 300); 	p(a); 	puts(a); 	system("pause"); } void p(char a[]) { 	int t,i,j; 	char k; 	t = strlen(a); 	for ( i = 0,j=t; i < t/2; i++,j--) 	{ 		k = a[j-1], a[j-1] = a[i], a[i] = k; 	} }

字符串逆转… 为什么main里头的p模块还要有形参的类型char[]呢？不是应该传实参了麽

t = strlen(a[300]);  改成  t = strlen(a);

谢谢，那么什么时候用gets 呢？gets和scanf 有什么区别呢？

你确定这段代码能编译过去？#include<stdio.h> #include<stdlib.h> #include<string.h> void main() { 	void p(char a[300]); 	char a[300]; 	gets_s(a); 	p(a); 	puts(a); 	system("pause"); } void p(char* a) { 	int t,i,j; 	char k; 	t=strlen(a); 	for (i=0,j=t; i < t/2; i++,j--) 	{ 		k=a[j-1],a[j-1]=a[i],a[i]=k; 	} }


Question: 用c语言模拟 post 上传文件遇到的问题 ， 急！急！急！ 请教大神啊！！

既然已经用上C了，就该上 Wireshark，这个可以抓包然后直接把包转成C语言数组格式，也就是花括号里一堆数字，这个功能我一直不知道用在什么地方，要不你看看 .... 你那怪异的字符肯定不再话下.....

Chrome + Advanced REST client 对比测试


Question: 杭电acm1019，，有哪位大神可以帮忙看看为什么不能ac？？

最终结果是32位整型，但中间结果有可能溢出。 ac参考代码 #include<stdio.h> _int64 maxMod(_int64 x,_int64 y){     _int64 m=x,n=y;     _int64 r = x%y;     while(r!=0){         x=y;         y=r;         r=x%y;     }     return m/y*n; } int main(){     int n;     scanf("%d",&n);     while(n--){         int m;         scanf("%d",&m);         _int64 t1,result;         scanf("%I64d%I64d",&t1,&result);         result=maxMod(t1,result);         for(int i=2;i<m;i++){             scanf("%I64d",&t1);             result=maxMod(t1,result);         }         printf("%I64d\n",result);     }     return 0; }

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


Question: n的阶乘(n很大)

仅供参考：#include<stdio.h> #define N 1000    //要计算的N long s[N]={1,1},n=N,t=2,a=1,b=0; int main()//雨中飞燕之作 {     for(;a<=*s||(++t<=n?(b=0,a=1):0);(*s==a++&&b)?(*s)++:0)         s[a]=(b+=s[a]*t)%10000,b/=10000;     for(printf("%d",s[*s]);--*s>0;) printf("%04d",s[*s]);     return 0; }

要精确的每一位数可以考虑用字符串存储，不然可以用double、long double 类型

引用 3 楼 小灸舞的回复:考虑用数组存储  #include<stdio.h> int main() { 	static int a[100000]; //设置一个超大数组来存储乘积结果。 	int n;//要求的n的阶乘 	int jw;//用来表示进位 	int i, j;//控制循环 	int len = 1;//初始化数组长度为1 	int temp;//过程变量 	scanf("%d", &n); 	a[1] = 1; 	for (i = 2; i <= n; i++)//遍历。从1到n 	{ 		jw = 0; 		for (j = 1; j <= len; j++)//从数组的低位开始乘 		{ 			temp = a[j] * i + jw;//变量存储结果 			a[j] = temp % 10;//将变量最后一位放入数组。 			jw = temp / 10;//表示除了最后一位需要进位的数 			if (j >= len && jw != 0) 				len++;  //数组长度加一  		}  	} 	for (i = len; i >= 1; i--)//逆序输出数组就是结果 		printf("%d", a[i]); 	printf("\n"); 	return 0; }  能不能简单的说下程序的思路。。看的不是很懂。。


Question: 有人在吗？这是一个C语言问题，改了半天结果还是出不来。有人可以帮我看看吗？非常感谢。

有点长啊！你可以自己单步调试一下。。写这种长的程序最好还是写一部分编译一下。。确定前面没什么问题了再继续写后面的。。不然就会遇到像你现在这样的问题。。(由于是手机，所以只能给你点小意见)

谢谢大家  我调试好了。。。。嘿嘿。。

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

引用 5 楼 阳光下的彩虹的回复:调用judegEmpty（）时count=0,所以导致judegEmpty()中跟count有关的循环都没有进入 main函数里  count  是赋值了的。。  谢谢你  我已经改好了。

建议在必要的地方设置断点，然后单步跟踪程序运行，观察每一步结果是否与你期望的一致

为什么学生都指望老师帮自己上厕所呢？

你这么长的代码要我们怎么看?用断点调试了吗?


Question: 10进制转二进制代码问题

帮结贴

引用 1 楼 tiandragon00 的回复:已解决 ，谢谢   学会解决问题比解决问题好~

已解决 ，谢谢

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


Question: define DOUBLE（x) ((x)+(x))和函数return(x+x）的返回值。

printf("%f\n", dob((double)y/x)-DOUBLE((double)y/x));

引用 8 楼 calen_ 的回复:那里写着 int 这和浮点数有个毛关系，如果楼主没抄错题的话，我敢肯定是因为嵌入式开发需要较高的数学水平，所以出道题来测试楼主十以内加减法。除非..... 除非他说有什么寄存器或者IO给映射到了地址在2或者3的地方，这样的话一个表达式确实能玩出花样............   我记得define 定义的  引用 7 楼 zhao4zhong1 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437  多谢我知道原因了。

表达式相同，这似乎恒成立吧！(x+x)-((x)+(x))不就是0吗？

引用 5 楼 fefe82的回复:[quote=引用 2 楼 qq_36409192 的回复:] 表达式相同，这似乎恒成立吧！(x+x)-((x)+(x))不就是0吗？  由于浮点误差的存在，（以及计算机数值计算的一些其他问题，）数学中的各种运算定律都不能直接使用。[/quote] 谢谢。。

引用 2 楼 qq_36409192 的回复:表达式相同，这似乎恒成立吧！(x+x)-((x)+(x))不就是0吗？  由于浮点误差的存在，（以及计算机数值计算的一些其他问题，）数学中的各种运算定律都不能直接使用。

引用 3 楼 paschen 的回复:你这个式子是要赋值0，还是让他们结果为0  如果你是要让他们的结果为0很容易啊，比如填x+y   这里指的是相减为值0，不是赋值。面试嵌入式C，给的题。

这个题目出错了吧。。。 #define DOUBLE(x)  ((x)+(x)) 如果是 #define DOUBLE(x)  (x)+(x) 那还有点意思，有个括号的话，怎么输值都是0，已经可以避开宏的副作用了。


Question: 请问C语言怎么获取控制台光标的坐标?

参考：  #include <stdio.h> #include <windows.h> #include <stdlib.h>   int main(int argc, char* argv[]) {     HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);     COORD coordScreen = {0, 0}; //光标位置     CONSOLE_SCREEN_BUFFER_INFO csbi;       if (GetConsoleScreenBufferInfo(hConsole, &csbi))     {         printf("光标坐标:(%d,%d)\n",  csbi.dwCursorPosition.X, csbi.dwCursorPosition.Y);     }     return 0; }

标准库没有  WINDOWS API：  GetConsoleScreenBufferInfo 可以获取，在CONSOLE_SCREEN_BUFFER_INFO结构中的dwCursorPosition成员  SetConsoleCursorPosition 可以设置  具体可参看MSDN

Linux下参考NCURSES库。

GetConsoleScreenBufferInfo


Question: 任何一个大于6的偶数，都可以表示成两个奇质数之和，求一个数的两个奇质数。。。

最后那个if中，= 换成 ==

if(i == flag1 + flag2)

求大神帮忙改改，或者重新帮我写一个，不用函数。。

首先lz的算法就有问题，跟if判断没有任何关系。 ac代码楼主参考下 #include<stdio.h> bool isPrime(int n){     for(int i=2;i*i<=n;i++){         if(n%i==0)return false;     }     return true; }  int main(){     int n;     while(scanf("%d",&n) && n!=0){         int count=0;         for(int i=2;i<n/2;i++){             if(isPrime(i)&&isPrime(n-i)){                 count++;             }         }         printf("%d\n",count);     }     return 0; }


Question: 字符读入的问题

用getchar()和scanf %c的时候要特别注意输入缓冲区是不是有遗留的字符（比如回车符） 可以使用fflush(stdin);来清空输入缓冲区

谢谢楼上各位大神！postgres20的回答非常好！

这样改试下：  #include <stdio.h> int main(void) { 	int guess=50,min=0,max=100; 	char ch; 	printf("choose an integer from 1 to 100.    d for larger, x for smaller and y for yes.\n"); 	printf("I guess it is %d\n",guess); 	while((ch=getchar())!='y') 	{ 		switch(ch) 		{ 		case 'd' : max=guess;break; 		case 'x' : min=guess;break; 		case '\n':continue; 		default : printf("Error");return 0; 		} 		guess=(min+max)/2; 		printf("Then I guess it is %d\n",guess); 	} 	return 0; }

因为你while((ch=getchar())!='y') 输入完之后还会在缓冲区中留下\n  下一次while((ch=getchar())!='y')的时候接收了\n，于是退出了循环

楼上的几位，仔细看LZ逻辑，其实LZ已经考虑了\n的情况，如果是\n，会走到  if(ch=='\n') getchar(); LZ的意思应该是如果是\n，那么再读一次，跳过\n，但是LZ并没有把再读到的字符赋值给ch，所以在getchar()前面加上ch=就行了，即改成 if(ch=='\n') ch=getchar();便可。

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

if(ch=='\n') getchar(); 这一行并没有改变ch值，getchar()被丢弃了，应该改成  if(ch=='\n') ch=getchar();


Question: 求助这个-> . 是怎么理解？inet_pton(AF_INET, ip, (void *)(&(remote->sin_addr.s_addr)));

指针指向结构体的内容。

用->还是.关键看你这个左边的变量是不是指针类型啊

用. 还是->看你前面的对象类型的

A->B 等价于 (*A).B  a.b 等价于 (&a)->b

remote = (struct sockaddr_in *)malloc(sizeof(struct sockaddr_in *));


Question: 链表创建节点，对节点赋值出现读取失败

sed heap memory 链表的每个节点都需要malloc  void main() { 	struct ListNode *a = (struct ListNode*)malloc(sizeof(struct ListNode)); 	struct ListNode *l1 = (struct ListNode*)malloc(sizeof(struct ListNode)); 	l1->val = 2; 	struct ListNode *l2 = (struct ListNode*)malloc(sizeof(struct ListNode)); 	for (int i = 2; i <= 3; i++) 	{ 		l1->next = (struct ListNode*)malloc(sizeof(struct ListNode)); 		l1 = l1->next; 		l1->val = i * 2; 	} 	l1->next = NULL;  	....... }

引用 2 楼 KOMO_TI 的回复:[quote=引用 1 楼 paschen 的回复:] 因为你给l1分配了内存，但没有给这个结构体里面的指针也分配内存  当你执行l1 = l1->next;之后，l1变成了l1->next，而l1->next是一个未初始的指针，他没有指向已经申请好的内存所以才需要用一个函数来创建链表的么？[/quote]  用不用函数是你实现的问题，你需要把你逻辑理清楚，需要遍历的元素要申请好内存

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

引用 1 楼 paschen 的回复:因为你给l1分配了内存，但没有给这个结构体里面的指针也分配内存  当你执行l1 = l1->next;之后，l1变成了l1->next，而l1->next是一个未初始的指针，他没有指向已经申请好的内存所以才需要用一个函数来创建链表的么？


Question: 结构体数组初始化问题

建议单步跟踪程序运行，观察每一步结果变化，分析原因

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


Question: 【请教】C++中怎么存入浮点型数据然并在第二次打开的时候还能使用

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

浮点数格式 http://bbs.csdn.net/topics/390676437

以二进制方式 保存到文件，然后之后从文件读取

将浮点数存入文件中，第二次打开的时候加载读取文件就可以了


Question: 求大神解决

引用 4楼paschen 的回复:给出你完整的程序，你的SqList 与LNode又是什么关系谢谢，已经解决了，我当时忘了考虑指针的一个特性。

给出你完整的程序，你的SqList 与LNode又是什么关系

你初始化一下呗。 SqList p = L, q;改成SqList p = L, q = NULL;

SqList p = L, q; 这里的问题吧？ 是不是应该写成SqList p = L；                             SqList p =q；

这种问题你单步调试一下呗


Question: scanf读入字符串不是从数组的首地址开始存储

重建所有

不可能，估计是你哪里搞错了

数组初始化就行了

你有别的地方越界了吧？ 建议贴上完整代码

arr_in数组清空。 memset(arr_in,0x0,sizeof(arr_in)*sizeof(char));


Question: 新手关于图书管理系统调试不通过的疑问

想知道哪里的问题为何不单步跟踪程序运行，观察每一步结果是否与你预期一致，以快速找到原因

struct book library[MAXBKS]; memset(library, 0, sizeof(library));    void add_book(struct book *p) {     if(count<MAXBKS-1)     {         //count++;         printf("Please add new book titles:");         gets(p[count].title);         printf("Now enter the auther:");         gets(p[count].author);         printf("Now enter the value:");         scanf("%lf",&p[count].value);         while(getchar()!='\n')             continue;         count++;     }     else     {         printf("The book.dat file is full.\n");         exit(1);     } }

struct book library[MAXBKS];


Question: C语言中关于指针定义的问题。int*a中a的值到底是什么？

引用 5 楼 kay_1010 的回复:你用什么编译器编写的，我的怎么都编译不过去。  codeblocks

你用什么编译器编写的，我的怎么都编译不过去。

引用 2 楼 user-3 的回复:int *a=4 已经将int转换成了int * 了，a是指向地址为4的内存地址，而不是内存中的内容为4  int p=&a; p 是已经由 int*转换成了int，存储的是变量a的地址  int* 不是一种变量类型啊，int *a 不是说的是*a是int类型，而a是指针类型嘛。  你的意思我明白了，谢谢！

引用 1 楼 qq_36496856 的回复:a不是指向4的地址，而是一个可以储存地址的指针变量。int *a，中的*表示a是个指针，而不是int *a中应该把int *看成一部分，表明a是指向整形的指针变量，那么int *a＝4就是定义和赋值的结合，即int *a和a＝4  谢谢！


Question: C语言宏定义的疑惑

但宏替换则仍然是用（1.0*2.0）进行替换

编译器会把编译期能计算出的表达式都计算了，所以运行时一般来说都直接是2.0

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

宏其实就是起名字(#define N (1.0*2.0))。在使用的时候，宏不会自带计算，而是原封不动的将(1.0*2.0)替代N所在的位置。你这里float res=N;，其实就是float res=(1.0*2.0);由程序自己来进行运算。

优化掉了，没有乘法时间。 例：  template<long _NB> struct BBB : public BBB<_NB -1> { 	static const long v = _NB + BBB<_NB -1>::v; };  template <> struct BBB<0>  { 	static const long v = 0; };  LONG fv = __FILE__[0] + __FILE__[1] +__FILE__[2];	//	debug未化，release直接取值 LONG sum = BBB<10>().v;		//	直接取值 printf("The End: %d, %d\n", fv, sum);

2楼正解，预编译不计算，程序里面替换宏，还是要计算的


Question: 四子棋程序两个问题求帮助！

建议在必要地方设置断点，然后单步跟踪运行，观察每一步是否与你期望的结果一致

你会调试吗?就问你这句话，自己debug一下，就可以了。不会debug的话，上网搜这方面的内容就可以了


Question: 简单c语言问题求帮助

while(fabs(t)<0.000001){  改成  while(fabs(t)>=0.000001){  while (xxx) 是要在xxx为真时才运行循环体  建议单步跟踪程序运行观察程序流程及每步结果分析原因

循环是在条件成立的情况下才执行循环题，你fabs(t)第一部就不满足条件，肯定直接跳出来输出pi了啊！

#include<stdio.h> #include<math.h> void main(){ 	double t = 1.0, pi = 0.0, s = 1.0; 	int n = 1; 	while (fabs(t)>=0.000001){ 		pi = pi + t; 		n = n + 2; 		s = -s; 		t = s / n; 	} 	pi = pi; 	printf("%lf\n", pi);  	getch(); }

While(ture)才运行


Question: 老是出现这个对话框，请问大家为什么

既然你的L是个全局变量，InitList函数就不需要传递参数了，如果要传递参数，你要传入L的地址，否则是按值传递的，也就是说InitList中你申请的空间是给了一个复制后的变量，全局的L仍然是NULL

读取位置 0x00000020 时发生访问冲突，表示你尝试操作一个NULL指针。 L已经是全局变量了，InitList就不要带参数了，否则形参作用域会覆盖全局变量作用域 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  #include<stdio.h> #include<stdlib.h>   typedef struct{ 	char name[20]; 	int priority; 	int serviceTime; 	int needTime; }PCB;  typedef struct Node{ 	PCB data; 	struct Node *next; }LinkList, Node;  int InitList();  void print(LinkList *L);  LinkList *L = NULL;  void main() { 	InitList(); 	print(L); 	system("pause"); }   int InitList() { 	int num, i; 	LinkList *p; 	L = (LinkList*)malloc(sizeof(Node)); 	L->next = NULL; 	printf("进程数："); 	scanf("%d", &num); 	for (i = 0; i<num; i++) 	{ 		p = (LinkList*)malloc(sizeof(Node)); 		printf("第%d个进程：", i + 1); 		fflush(stdin); 		scanf("%s,%d,%d", &p->data.name, &p->data.priority, &p->data.serviceTime); 		fflush(stdin); 		p->next = L->next; 		L->next = p; 	} 	return 0; }  void print(LinkList *L) { 	int i = 1; 	LinkList *p = L->next; 	system("cls"); 	while (p) 	{ 		printf("第%d个进程：%s,%d,%d", i++, p->data.name, p->data.priority, p->data.serviceTime); 		p = p->next; 	}  }

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


Question: c语言简单问题求解答

贴下源码吧

异常退出吗？贴一下源码。


Question: 我自己写的 判断一个三位数是不是水仙花数 但是输出不对！即使输入153这个水仙花数也不行

a 没有初始化就使用了，应该把scanf放到前面  if (a>99,a<999); 应该写成：if (a>99 && a<999);  if (a=m*m+n*n+p*p)("a 是水仙花数%d");  if 中应该用== 而不是=  后面的括号没有这种用法

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

楼主错误有点多啊，还是多去看看书吧，练习一下基本的。 #include <stdio.h> int main() { 	int a,m,n,p;   //m=百位,n=十位,p=个位; 	printf ("输入一个百位数"); 	scanf("%d",&a); 	m=a/100; 	n=(a-m*100)/10; 	p=(a-m*100-n*10); 	if(a==(m*m*m+n*n*n+p*p*p)) 		printf("a是水仙花数\n"); 	else 		printf("a不是水仙花数\n"); 	printf ("a=%d\n",a); 	return 0;  }


Question: 输入10个整数，将其中最小的数与第一个数对换，把最大的数和最后一个数对换，写三个函数  大神看看这哪里错了.运行时出错！！

scanf("%d",*(p+i));  改成  scanf("%d",p+i);

1.scanf的问题 2.if(max<*(p+i)) max=*(p+i);j=i;少了大括号，而且建议楼主不要一行上写多行代码，很容易出错，可读性差，难调试。 3.最大的数和最后一个数对换的时候应该是*(p + 9)和*(p + j)调换，而不是*p和*(p + j)  #include<stdio.h> void input(int*p) { 	int i, j; 	for (i = 0; i<10; i++) 	{ 		scanf("%d", p + i); 	} } void conduct(int*p) { 	int max, min, i, j, k, temp; 	max = *p; 	min = *p; 	for (i = 0; i<10; i++) 	{ 		if (max<*(p + i)){  			max = *(p + i); 			j = i;  		} 		if (min>*(p + i)){ 			min = *(p + i);  			k = i; 		} 	} 	temp = *p; 	*p = *(p + k); 	*(p + k) = temp; 	temp = *(p + 9); 	*(p + 9) = *(p + j); 	*(p + j) = temp;  } void output(int*p) { 	int i; 	printf("\n"); 	for (i = 0; i<10; i++) 		printf("%d ", *(p + i));  } void main() { 	int a[10]; 	input(a); 	conduct(a); 	output(a); }

引用 1 楼 paschen的回复:scanf("%d",*(p+i));  改成  scanf("%d",p+i); 嗯啊，scanf的后面那个参数要是个地址。  楼主的main语句为什么不加int啊，即使编译器会默认返回类型为int，还有个return 0


Question: 链表头美有被赋值

引用 1 楼 paschen的回复:因为你的参数是按值传递的，你申请的变量是给了一个复制后的变量，并不是你函数外面的裸骑那个变量，你应该传入变量的地址 可以贴个代码么？我听不太懂

引用 4 楼 qq423399099 的回复:你贴的这个结果我们看不懂啥意思，建议你贴出完整代码。 还有就是你调用addTwoNumbers函数应该接收了它的返回值并且赋值给你的head的吧？ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。这是LeeCode上面的题目，我也没其他部分的代码

引用 3 楼 paschen 的回复:[quote=引用 2 楼 KOMO_TI 的回复:] [quote=引用 1 楼 paschen的回复:]因为你的参数是按值传递的，你申请的变量是给了一个复制后的变量，并不是你函数外面的裸骑那个变量，你应该传入变量的地址 可以贴个代码么？我听不太懂[/quote]  建议单步跟踪程序运行，观察每一步是否与你期望的致[/quote]我明白了，弄了好久，才发现，tail被附了两次值，导致与head的联系被切断了；

引用 2 楼 KOMO_TI 的回复:[quote=引用 1 楼 paschen的回复:]因为你的参数是按值传递的，你申请的变量是给了一个复制后的变量，并不是你函数外面的裸骑那个变量，你应该传入变量的地址 可以贴个代码么？我听不太懂[/quote]  建议单步跟踪程序运行，观察每一步是否与你期望的致


Question: 如何将文件中的数据按要求存入数组中

引用 12 楼 darren4567 的回复:[quote=引用 11 楼 bigwatercar 的回复:] [quote=引用 9 楼 darren4567 的回复:] [quote=引用 4 楼 bigwatercar 的回复:]  #include <stdio.h>  int main(void) {     FILE *fp = NULL;     float a[10][5];     int i, j;     int end = 0;      fp = fopen("srcfile", "r");     if (NULL == fp)     {         perror("openfile failed.\n");         return -1;     }      for (i = 0; i < 10 && !end; i++)     {         for (j=0; j<5; j++)         {             if (-1 != fscanf(fp, "%e", &a[i][j]))             {                 printf("%e\t", a[i][j]);             }             else             {                 end = 1;                 break;             }         }         printf("\n");     }     fclose(fp);      return 0; }     写了一段测试代码，无问题。 gcc 4.8.4   您好，如果我想用atof函数将数组中的每一个字符转换为double变量的话直接写 printf("%d\t",atof(&a[i][j]));  行吗？  stdlib.h文件已加的情况下[/quote]  atof是将字符串转浮点数。那你就得按字符串读取。 你这数组设计的也不对了，得三维数组。   话说你说了这么久也没见你把错误提示贴出来，别人都是猜猜猜。  至少先说下你的编译环境，如何出错，出了什么错。这样别人才能帮你。[/quote]   我试着编写了下面的程序 #include <stdio.h> #include <stdlib.h> int main(void) {     FILE *fp ;     double a[10000][5];     double b[10000][5];     int i,j,k,l;       fp = fopen("G:\\云CT\\多能云CT - 扫描部分\\140KVSingles_0.txt", "r");     if (NULL == fp)     {         printf("openfile failed.\n");         return -1;     }    for(k=0,i=0;(k<10000)&&(i<10000);k++,i++)     {         for(l=0,j=0;(l<5)&&(j<5);l++,j++)         {             if (-1 != fscanf(fp, "%d", &a[i][j])) { b[k][l]=atof(&a[i][j]); printf("%d\t", b[k][l]);}         }         printf("\n");     }     fclose(fp);       return 0; }	        我用的是C语言编译环境，用完这个程序执行后出现这个情况    转换后的数大部分都是0  还有atof函数 只能转换字符串吗？如果要转换字符数组里的字符串的话应该怎么转换？  C语言新手，请多多指教。[/quote]  用的是VC++ 6.0环境

引用 11 楼 bigwatercar 的回复:[quote=引用 9 楼 darren4567 的回复:] [quote=引用 4 楼 bigwatercar 的回复:]  #include <stdio.h>  int main(void) {     FILE *fp = NULL;     float a[10][5];     int i, j;     int end = 0;      fp = fopen("srcfile", "r");     if (NULL == fp)     {         perror("openfile failed.\n");         return -1;     }      for (i = 0; i < 10 && !end; i++)     {         for (j=0; j<5; j++)         {             if (-1 != fscanf(fp, "%e", &a[i][j]))             {                 printf("%e\t", a[i][j]);             }             else             {                 end = 1;                 break;             }         }         printf("\n");     }     fclose(fp);      return 0; }     写了一段测试代码，无问题。 gcc 4.8.4   您好，如果我想用atof函数将数组中的每一个字符转换为double变量的话直接写 printf("%d\t",atof(&a[i][j]));  行吗？  stdlib.h文件已加的情况下[/quote]  atof是将字符串转浮点数。那你就得按字符串读取。 你这数组设计的也不对了，得三维数组。   话说你说了这么久也没见你把错误提示贴出来，别人都是猜猜猜。  至少先说下你的编译环境，如何出错，出了什么错。这样别人才能帮你。[/quote]   我试着编写了下面的程序 #include <stdio.h> #include <stdlib.h> int main(void) {     FILE *fp ;     double a[10000][5];     double b[10000][5];     int i,j,k,l;      fp = fopen("G:\\云CT\\多能云CT - 扫描部分\\140KVSingles_0.txt", "r");     if (NULL == fp)     {         printf("openfile failed.\n");         return -1;     }  for(k=0,i=0;(k<10000)&&(i<10000);k++,i++)     {         for(l=0,j=0;(l<5)&&(j<5);l++,j++)         {             if (-1 != fscanf(fp, "%d", &a[i][j])) { b[k][l]=atof(&a[i][j]); printf("%d\t", b[k][l]);}         }         printf("\n");     }     fclose(fp);       return 0; }	      我用的是C语言编译环境，用完这个程序执行后出现这个情况    转换后的数大部分都是0  还有atof函数 只能转换字符串吗？如果要转换字符数组里的字符串的话应该怎么转换？  C语言新手，请多多指教。

引用 9 楼 darren4567 的回复:[quote=引用 4 楼 bigwatercar 的回复:]  #include <stdio.h>  int main(void) {     FILE *fp = NULL;     float a[10][5];     int i, j;     int end = 0;      fp = fopen("srcfile", "r");     if (NULL == fp)     {         perror("openfile failed.\n");         return -1;     }      for (i = 0; i < 10 && !end; i++)     {         for (j=0; j<5; j++)         {             if (-1 != fscanf(fp, "%e", &a[i][j]))             {                 printf("%e\t", a[i][j]);             }             else             {                 end = 1;                 break;             }         }         printf("\n");     }     fclose(fp);      return 0; }     写了一段测试代码，无问题。 gcc 4.8.4   您好，如果我想用atof函数将数组中的每一个字符转换为double变量的话直接写 printf("%d\t",atof(&a[i][j]));  行吗？  stdlib.h文件已加的情况下[/quote]  atof是将字符串转浮点数。那你就得按字符串读取。 你这数组设计的也不对了，得三维数组。   话说你说了这么久也没见你把错误提示贴出来，别人都是猜猜猜。  至少先说下你的编译环境，如何出错，出了什么错。这样别人才能帮你。

引用 16 楼 bigwatercar 的回复:[quote=引用 14 楼 zhao4zhong1 的回复:] [quote=引用 5 楼 zhao4zhong1 的回复:] http://bbs.csdn.net/topics/360055953 引用 8 楼 zhao4zhong1 的回复:static int a[50000][5]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 无视我回帖的坛友一般都会浪费一大段青春。[/quote]  我也觉得，哎，可怜楼主抄都抄不对。[/quote]

引用 18 楼 darren4567 的回复:[quote=引用 15 楼 bigwatercar 的回复:] 你的数组定义的是double，你格式化读取的时候就要按double读。 格式化读取的 时候也是double读的啊？我的程序有什么问题吗？ [/quote]  你不再检查一下你的fscanf的第二个参数吗？

引用 15 楼 bigwatercar 的回复:你的数组定义的是double，你格式化读取的时候就要按double读。 格式化读取的 时候也是double读的啊？我的程序有什么问题吗？

引用 14 楼 zhao4zhong1 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] http://bbs.csdn.net/topics/360055953 引用 8 楼 zhao4zhong1 的回复:static int a[50000][5]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 无视我回帖的坛友一般都会浪费一大段青春。[/quote]  不好意思了，谢谢回答！

引用 14 楼 zhao4zhong1 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] http://bbs.csdn.net/topics/360055953 引用 8 楼 zhao4zhong1 的回复:static int a[50000][5]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 无视我回帖的坛友一般都会浪费一大段青春。[/quote]  我也觉得，哎，可怜楼主抄都抄不对。

你的数组定义的是double，你格式化读取的时候就要按double读。

引用 5 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/360055953 引用 8 楼 zhao4zhong1 的回复:static int a[50000][5]; 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 无视我回帖的坛友一般都会浪费一大段青春。

你的是浮点数，应该用double或者float变量来接收，而不是int

float a[50000][5];

引用 1 楼 bigwatercar 的回复:for(i=0;i<50000;i++) {     fgets(fp, buf);  for(j=0;j<5;j++) { fscanf(fp,"%e",&a[i][j]); } fscanf(fp,"\n"); }   试一下    会出现错误提示，程序运行不了

引用 4 楼 bigwatercar 的回复: #include <stdio.h>  int main(void) {     FILE *fp = NULL;     float a[10][5];     int i, j;     int end = 0;      fp = fopen("srcfile", "r");     if (NULL == fp)     {         perror("openfile failed.\n");         return -1;     }      for (i = 0; i < 10 && !end; i++)     {         for (j=0; j<5; j++)         {             if (-1 != fscanf(fp, "%e", &a[i][j]))             {                 printf("%e\t", a[i][j]);             }             else             {                 end = 1;                 break;             }         }         printf("\n");     }     fclose(fp);      return 0; }     写了一段测试代码，无问题。 gcc 4.8.4  我试着编写了下面的程序 #include <stdio.h> #include <stdlib.h> int main(void) {     FILE *fp ;     double a[10000][5];     double b[10000][5];     int i,j,k,l;      fp = fopen("G:\\云CT\\多能云CT - 扫描部分\\140KVSingles_0.txt", "r");     if (NULL == fp)     {         printf("openfile failed.\n");         return -1;     }  	for(k=0,i=0;(k<10000)&&(i<10000);k++,i++)     {         for(l=0,j=0;(l<5)&&(j<5);l++,j++)         {             if (-1 != fscanf(fp, "%d", &a[i][j])) 			{ b[k][l]=atof(&a[i][j]); 				printf("%d\t", b[k][l]);}         }         printf("\n");     }     fclose(fp);       return 0; }	  然后出来的都是0  请问问题出在哪？

引用 4 楼 bigwatercar 的回复: #include <stdio.h>  int main(void) {     FILE *fp = NULL;     float a[10][5];     int i, j;     int end = 0;      fp = fopen("srcfile", "r");     if (NULL == fp)     {         perror("openfile failed.\n");         return -1;     }      for (i = 0; i < 10 && !end; i++)     {         for (j=0; j<5; j++)         {             if (-1 != fscanf(fp, "%e", &a[i][j]))             {                 printf("%e\t", a[i][j]);             }             else             {                 end = 1;                 break;             }         }         printf("\n");     }     fclose(fp);      return 0; }     写了一段测试代码，无问题。 gcc 4.8.4   您好，如果我想用atof函数将数组中的每一个字符转换为double变量的话直接写 printf("%d\t",atof(&a[i][j]));  行吗？  stdlib.h文件已加的情况下

栈的大小一般可以通过编译器开关/STACK:设置，不然默认的是 1 MB 你的数组就占了1MB了


Question: if(ch != ' " ' && ch != ' \' ') 急求下面问题的疑惑T T，困扰半天了\哭

char c1 = '"'; char c2 = '\"'; char c3 = '\''; char s1[] = "'abc'"; char s2[] = "\'abc\'"; char s3[] = "\"abc\"";

单引号里面写双引号，双引号里面写单引号，可以不用转义，当然你用也没关系。

语法规定，这样比较对称。

Collapse AllExpand All      Code: All Code: Multiple Code: Visual Basic Code: C# Code: Visual C++ Code: J# Code: JScript   Visual Basic C# Visual C++ J# JScript Visual C++ Language Reference  C++ Character Constants  See Also  Send Feedback     Character constants are one or more members of the "source character set," the character set in which a program is written, surrounded by single quotation marks ('). They are used to represent characters in the "execution character set," the character set on the machine where the program executes.  Microsoft Specific  For Microsoft C++, the source and execution character sets are both ASCII.  END Microsoft Specific  There are three kinds of character constants:   Normal character constants  Multicharacter constants  Wide-character constants  Note:  Use wide-character constants in place of multicharacter constants to ensure portability.    Character constants are specified as one or more characters enclosed in single quotation marks. For example:    Copy Code  char ch = 'x';          // Specify normal character constant. int mbch = 'ab';        // Specify system-dependent                         //  multicharacter constant. wchar_t wcch = L'ab';   // Specify wide-character constant.    Note that mbch is of type int. If it were declared as type char, the second byte would not be retained. A multicharacter constant has four meaningful characters; specifying more than four generates an error message.  Characters within a character constant may be any graphic characters in the source character set, except for newline, backslash \, single quote ' and double quote ", or they may be specified using an escape sequence. There are three types of escape sequences: simple, octal and hexadecimal escape sequences.  Simple escape sequences may be any of the following:    Copy Code  \' \" \? \\\a \b \f \n \r \t \v    An octal escape sequence is a backslash followed by a sequence of up to 3 octal digits.  A hexadecimal escape sequence is a backslash, followed by the character x, followed by a sequence of hex digits.  Microsoft C++ supports normal, multicharacter, and wide-character constants. Use wide-character constants to specify members of the extended execution character set (for example, to support an international application). Normal character constants have type char, multicharacter constants have type int, and wide-character constants have type wchar_t. (The type wchar_t is defined in the standard include files STDDEF.H, STDLIB.H, and STRING.H. The wide-character functions, however, are prototyped only in STDLIB.H.)  The only difference in specification between normal and wide-character constants is that wide-character constants are preceded by the letter L. For example:    Copy Code  char schar = 'x';               // Normal character constant wchar_t wchar = L'\x8119';    // Wide-character constant    The following table shows reserved or nongraphic characters that are system dependent or not allowed within character constants. These characters should be represented with escape sequences.  Character  ASCII   Representation  ASCII   Value  Escape Sequence   Newline  NL (LF)  10 or 0x0a  \n   Horizontal tab  HT  9  \t   Vertical tab  VT  11 or 0x0b  \v   Backspace  BS  8  \b   Carriage return  CR  13 or 0x0d  \r   Formfeed  FF  12 or 0x0c  \f   Alert  BEL  7  \a   Backslash  \  92 or 0x5c  \\   Question mark  ?  63 or 0x3f  \?   Single quotation mark  '  39 or 0x27  \'   Double quotation mark  "  34 or 0x22  \"   Octal number  ooo  —  \ooo   Hexadecimal number  hhh  —  \xhhh   Null character  NUL  0  \0    If the character following the backslash does not specify a legal escape sequence, the result is implementation defined. In Microsoft C++, the character following the backslash is taken literally, as though the escape were not present, and a level 1 warning ("unrecognized character escape sequence") is issued.  Octal escape sequences, specified in the form \ooo, consist of a backslash and one, two, or three octal characters. Hexadecimal escape sequences, specified in the form \xhhh, consist of the characters \x followed by a sequence of hexadecimal digits. Unlike octal escape constants, there is no limit on the number of hexadecimal digits in an escape sequence.  Octal escape sequences are terminated by the first character that is not an octal digit, or when three characters are seen. For example:    Copy Code  wchar_t och = L'\076a';  // Sequence terminates at a char    ch = '\233';     // Sequence terminates after 3 characters    Similarly, hexadecimal escape sequences terminate at the first character that is not a hexadecimal digit. Because hexadecimal digits include the letters a through f (and A through F), make sure the escape sequence terminates at the intended digit.  Because the single quotation mark (') encloses character constants, use the escape sequence \' to represent enclosed single quotation marks. The double quotation mark (") can be represented without an escape sequence. The backslash character (\) is a line-continuation character when placed at the end of a line. If you want a backslash character to appear within a character constant, you must type two backslashes in a row (\\). (See Phases of Translation in the Preprocessor Reference for more information about line continuation.)  See Also Concepts Literals (C++) Send feedback on this topic to Microsoft.

单引号中的 " 字符，不使用转义字符编译器也可以分辨出来，但仍建议使用转义字符 \

没必要纠结这种问题，不要把宝贵的时间浪费在这个上面，记住就行了，每次输出双引号都加上转义符 它可以不加转义符不代表你就要这样去用。 转义字符 意义 ASCII码值(十进制)    \a 响铃(BEL) 007    \b 退格(BS) 008    \f 换页(FF) 012    \n 换行(LF) 010    \r 回车(CR) 013    \t 水平制表(HT) 009    \v 垂直制表(VT) 011    \\ 反斜杠 092    \? 问号字符 063    \' 单引号字符 039    \" 双引号字符 034    \0 空字符(NULL) 000    \ddd 任意字符 三位八进制    \xhh 任意字符 二位十六进制

C++ Character Constants Character constants are one or more members of the “source character set,” the character set in which a program is written, surrounded by single quotation marks ('). They are used to represent characters in the “execution character set,” the character set on the machine where the program executes.  Microsoft Specific   For Microsoft C++, the source and execution character sets are both ASCII.  END Microsoft Specific  There are three kinds of character constants:   Normal character constants   Multicharacter constants   Wide-character constants  Note   Use wide-character constants in place of multicharacter constants to ensure portability.  Character constants are specified as one or more characters enclosed in single quotation marks. For example:  char ch = 'x';          // Specify normal character constant. int mbch = 'ab';        // Specify system-dependent                         //  multicharacter constant. wchar_t wcch = L'ab';   // Specify wide-character constant.  Note that mbch is of type int. If it were declared as type char, the second byte would not be retained. A multicharacter constant has four meaningful characters; specifying more than four generates an error message.  Syntax  character-constant :  'c-char-sequence' L'c-char-sequence'  c-char-sequence :  c-char c-char-sequence c-char  c-char :  any member of the source character set except the single quotation mark ('), backslash (\), or newline character escape-sequence  escape-sequence :  simple-escape-sequence octal-escape-sequence hexadecimal-escape-sequence  simple-escape-sequence : one of  \' \" \? \\ \a \b \f \n \r \t \v  octal-escape-sequence :  \octal-digit \octal-digit octal-digit \octal-digit octal-digit octal-digit  hexadecimal-escape-sequence :  \xhexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit  Microsoft C++ supports normal, multicharacter, and wide-character constants. Use wide-character constants to specify members of the extended execution character set (for example, to support an international application). Normal character constants have type char, multicharacter constants have type int, and wide-character constants have type wchar_t. (The type wchar_t is defined in the standard include files STDDEF.H, STDLIB.H, and STRING.H. The wide-character functions, however, are prototyped only in STDLIB.H.)  The only difference in specification between normal and wide-character constants is that wide-character constants are preceded by the letter L. For example:  char schar = 'x';               // Normal character constant wchar_t wchar = L'\x81\x19';    // Wide-character constant  Table 1.2 shows reserved or nongraphic characters that are system dependent or not allowed within character constants. These characters should be represented with escape sequences.  Table 1.2   C++ Reserved or Nongraphic Characters  Character ASCII  Representation ASCII  Value Escape Sequence  Newline NL (LF) 10 or 0x0a \n  Horizontal tab HT 9 \t  Vertical tab VT 11 or 0x0b \v  Backspace BS 8 \b  Carriage return CR 13 or 0x0d \r  Formfeed FF 12 or 0x0c \f  Alert BEL 7 \a  Backslash \ 92 or 0x5c \\  Question mark ? 63 or 0x3f \?  Single quotation mark ' 39 or 0x27 \'  Double quotation mark " 34 or 0x22 \"  Octal number ooo — \ooo  Hexadecimal number hhh — \xhhh  Null character NUL 0 \0    If the character following the backslash does not specify a legal escape sequence, the result is implementation defined. In Microsoft C++, the character following the backslash is taken literally, as though the escape were not present, and a level 1 warning (“unrecognized character escape sequence”) is issued.  Octal escape sequences, specified in the form \ooo, consist of a backslash and one, two, or three octal characters. Hexadecimal escape sequences, specified in the form \xhhh, consist of the characters \x followed by a sequence of hexadecimal digits. Unlike octal escape constants, there is no limit on the number of hexadecimal digits in an escape sequence.  Octal escape sequences are terminated by the first character that is not an octal digit, or when three characters are seen. For example:  wchar_t och = L'\076a';  // Sequence terminates at a char    ch = '\233';     // Sequence terminates after 3 characters  Similarly, hexadecimal escape sequences terminate at the first character that is not a hexadecimal digit. Because hexadecimal digits include the letters a through f (and A through F), make sure the escape sequence terminates at the intended digit.  Because the single quotation mark (') encloses character constants, use the escape sequence \' to represent enclosed single quotation marks. The double quotation mark (") can be represented without an escape sequence. The backslash character (\) is a line-continuation character when placed at the end of a line. If you want a backslash character to appear within a character constant, you must type two backslashes in a row (\\). (SeePhases of Translation in the Preprocessor Reference for more information about line continuation.)

所以到底是为什么- -


Question: 这个程序为什么会奔溃？求大神解答

if(head=NULL)     {     	head=p; } else { tail->next=p; // tail应该是空的。。 }  奔溃 无非就是地址非法访问。你这里就几个链表的指针。

看到奔溃笑了....... 楼主的编译器处理器和操作系统竭尽全力帮助楼主的程序自尽........

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

tail空指针，没有new就用了

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

还有 if(head=NULL) 改成  if(head==NULL)  scanf("%s",&time); 需要char*指针，但你的&time是int*类型

createbook函数中：  	if(number==0) 	{ 		return; 	}  改成；  	if(number==0) 	{ 		return NULL; 	}


Question: 开发数据恢复软件，需要了解那些专业知识

数据恢复，我觉得主要从数据存储原理，数据介质（软硬件），通过汇编语言掌握对机器码，电脑硬件的调用等。 　数据恢复是一个技术含量比较高的行业，数据恢复技术人员需要具备汇编语言和软件应用的技能，还需要电子维修和机械维修以及硬盘技术。  第一：软件应用和汇编语言基础  第二：电子电路维修技能  第三：机械维修技能  第四：硬盘固件级维修技术

参考EasyRecovery Professional软件及其类似软件。 参考开源数据恢复方面的项目。


Question: 请教一个二叉树查找结点问题

谢谢各位，之前没遇到过，谢谢

可以在scanf后面加一个getchar接收掉留在缓冲区中的\n，否则会被之后调用scanf接收了

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

因为你建立树的时候已经输入过数据了（所以输入缓冲区有遗留的回车符） 会被main函数里的scanf("%c", &data);直接读取掉 在scanf("%c", &data);前面加一句getchar();或者fflush(stdin);就行了。


Question: 求解答

前面说的是，换开发工具，要学就实战的，老的就不要用了，

引用 8 楼 paschen的回复:不要用VC6了，太老了，新手可以用VS2010，从大一开始养成好习惯 嗯，我得努力，就是个破二本

有什么书可以推荐一下吗？现在我啥也不会

但他是国家计算机二级的考试环境啊

不要用VC6了，太老了，新手可以用VS2010，从大一开始养成好习惯

引用 5 楼 赵4老师的回复:FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn  用英文版的MSDEV.exe替换中文版MSDEV.exe 谢谢赵四老师虽然不懂，刷机吧，我也不会，学习吧

引用 5 楼 赵4老师的回复:FileTool.exe 替换打开和添加到项目中 Visual C++ 的新功能 http://support.microsoft.com/kb/241396/zh-cn  用英文版的MSDEV.exe替换中文版MSDEV.exe 下载filetool?

玩游戏玩太嗨 或者 杀毒软件太流氓  会重装系统、重装软件、备份重要文件、……都属于码农的基本技能。

是不是要该操作系统，关键是matlab也报废

不是代码问题，压根输入不了程序

是你代码问题还是你的VC6有问题。 代码问题：单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 软件问题：换成VShttp://blog.csdn.net/cometnet/article/details/19551125


Question: 关于生成随机数

不太明白楼主的问题。 printf("Computer's turn.\n");之后你有一句scanf("%d", &r); 当然需要输入一个数才能继续下去啊？ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: 【请教】fprintf的内容存入文本后怎么让他显示在屏幕上？

引用 5 楼 zhao4zhong1 的回复:system("cmd /c type your_result.txt | mode");//将文件your_result.txt逐屏显示到屏幕上 system("notepad your_result.txt");//将文件your_result.txt用记事本打开显示到屏幕上 纠正：mode应为more

fscanf 时需要传入的是地址，而不是数值，所以%d 应该用一个变量的地址来接收

%d和%f对应的变量需要加上取地址符 fscanf(fp,"收入日期：%d-%d-%d  收入原因：%s  收入%f \n",&year,&month,&day,reason,&money);

引用 1 楼 user-4 的回复:scanf要传地址 拜托能讲详细一点吗 刚学

拜托能讲详细一点吗 刚学

scanf要传地址


Question: 用C语言怎么实现以下功能，请教大神！

具体代码你自己实现，我把思路说一下： 1.用fopen只读打开源文件A，用fopen以“w”写的方式打开一个空目标文件B。 2.用fread逐行读取内容存储到一个缓存char数组中（数组空间要足够），然后用C函数strstr查找第一个",找到之后，指针操作，再找第二个"，把第一个引号的指针和第二个引号的指针做差得出你要索取的字符个数（步长），然后用fwrite（第一个引号的指针+步长）写进文件B 3.关闭文件A和文件B

怎么把新文件里面重复的NODE名字删掉？求大神指教

#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { FILE *fp1; FILE *fp2; fp1=fopen("src.txt","r"); fp2=fopen("生成.txt","w"); if(NULL==fp1) { 	printf("未发现原文件!!!\n"); 	exit(-1); } if(NULL==fp2) { 	printf("目标文件打开失败!!!\n"); 	exit(-1); } const char* Key[] = {"drive","receive","detector"}; char buf[1024] = {0}; char* p1 = NULL; char* p2 = NULL; int i; while(!feof( fp1 ) ) { 	memset(buf,0,sizeof(buf)); 	fgets(buf,sizeof(buf)-1,fp1); 	for(i=0;i < sizeof(Key)/sizeof(char*);++i) 	{ 		p1=strstr(buf,Key[i]);//对比关键字是否存在 		if(NULL != p1) 		{ 			p1 = strstr(buf,"\"");//查找第一个引号 			if(NULL != p1) 			{ 				p2 = strstr(++p1,"\""); 				if(NULL != p2) 				{ 					*p2 = '\0'; 					fprintf(fp2,"%s\n",p1); 				} 			} 		} 	} } fclose(fp1); fclose(fp2); return 0; }


Question: 运行时总是出现这样的问题，怎么回事啊。

建议不要花时间比较这些，只要代码能达到你的要求就可以

引用 2 楼 qq_33347226 的回复:[quote=引用 1 楼 paschen的回复:]void Visit(ElemType T)  函数参数是否应该为BiTree类型  ElemType其实是char，你在Visit中调用printf("%c",T->data);是错的，因为没有data成员 ElemType改BiTree又会出现其它问题[/quote] 一楼说的没问题。不过需要你进行连带修改，不能把函数定义改完，其他调用的地方就不改了。程序段很多情况有关联性。 另外，你要加上main入口函数。  #include <iostream>   #include <stdlib.h>  #include <string.h>  #include <math.h>  using namespace std; typedef char ElemType;   //定义结点数据为字符型  typedef int Status;       //定义函数类型为int型  #define ERROR 0   #define OK 1     int leafNum=0;  typedef struct BiTNode {        //定义结构体   ElemType        data;     //结点数值   struct BiTNode   *lchild;  //左孩子指针   struct BiTNode   *rchild;  //右孩子指针     }BiTNode, *BiTree;   Status InitBiTree(BiTree &T)  //构造空二叉树T   {   T=NULL;    cout<<"空二叉树构建成功!\n"<<endl;  return OK;   }//InitBiTree  Status DestroyTree(BiTree &T)  //销毁二叉树 {     if(T) {                 DestroyTree(T->lchild);      DestroyTree(T->rchild);  free(T); T=NULL;    }         return OK;  }//DestroyTree  Status CreatBiTree(BiTree &T)//用扩展先序遍历序列创建二叉树，如果是当前树根置为空，否则申请一个新节点  {    ElemType ch;    cin>>ch;     if(ch=='#') T=NULL;   else   {      T=(BiTNode*)malloc(sizeof(BiTNode));//申请一段关于该节点类型的存储空间      T->data=ch;                     //生成根结点      CreatBiTree(T->lchild);         //构造左子树       CreatBiTree(T->rchild);         //构造右子树   }    return OK; } void Visit(const BiTree& T) { if(T!=NULL) printf("%c",T->data); }  Status PreOrder(const BiTree& T)  //按先序次序(递归)访问二叉树  {   if(T==NULL) return 0; Visit(T); PreOrder(T); PreOrder(T); //填空 return OK;   }  Status InOrder(BiTree T)  //按中序次序(递归)访问二叉树  {   if(T==NULL) return 0; InOrder(T->lchild); Visit(T); InOrder(T->rchild); return OK;   }  Status PostOrder(BiTree T)  //按后序次序(递归)访问二叉树  {   if(T==NULL) return 0; PostOrder(T->lchild); PostOrder(T->rchild); Visit(T); return OK;   }  Status PrePrintLeaf(BiTree T)  //按先序次序(递归)输出叶子结点 { if(T==NULL) return 0; { if(T->lchild==NULL&&T->rchild==NULL) printf("%c",T->data); PrePrintLeaf(T->lchild); PrePrintLeaf(T->rchild); } return OK;   }  Status CountLeafNum(BiTree T)  //统计叶子结点的个数 { int n;n=0; if(T==NULL) return 0; { if(T->lchild==NULL&&T->rchild==NULL) n++; CountLeafNum(T->lchild); CountLeafNum(T->rchild); } return OK;   }  Status PostPrintNode(BiTree T)  //按后序次序(递归)输出度为2的结点 {  if(T==NULL) return 0; { PostPrintNode(T->lchild); PostPrintNode(T->rchild); if(T->lchild!=NULL&&T->rchild!=NULL) printf("%c",T->data); } return OK;   }  int PostTreeDepth(BiTree T)  //获取二叉树高度  {   int hl,hr,max; if(T!=NULL) { hl=PostTreeDepth(T->lchild ); hr=PostTreeDepth(T->rchild ); max=hl>hr?hl:hr; return(max+1); } else return 0;   }

引用 1 楼 paschen的回复:void Visit(ElemType T)  函数参数是否应该为BiTree类型  ElemType其实是char，你在Visit中调用printf("%c",T->data);是错的，因为没有data成员 ElemType改BiTree又会出现其它问题


Question: oracle proc insert动态sql和数组使用，请大神指导！

引用 3 楼 sunyongliang118 的回复:把你的代码贴一下。感觉你的插入的数据和列的个数不匹配 确实是不匹配的，要不我就不标注红丝部分了，如果使用循环多次使用cursor就不纠结了！！！

把你的代码贴一下。感觉你的插入的数据和列的个数不匹配

引用 1 楼 sunyongliang118 的回复:你这是存储过程的代码报错？？？  另外 PCC-S-02365, Indicator array size cannot be smaller than host array size  这句的意思大概是标识的阵列空间不可以比主机阵列的小。  不是存储过程，是oracle proc的代码，就是想直接指定插入的条目数


Question: C calls C++ class in Eclipse

引用 1 楼 user-4 的回复:no picture your say a JB 好口语

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

see Stroustrup's answer

no picture your say a JB


vs还是比较好用的．

谢谢! 我明白您的意思，直接连接吗？

因为你的find是在test中定义的，所以test1.c中确实找不到啊。 你可以把定义find的文件先编译成一个.o，再与test11.c编译生成的.o一块链接。

test.c: #include "test.h" int find() { return 1; } int test() { return 2; } test.c是这个样子的，但还是有同样的问题

因为你定义了两个main函数

连接时的问题： Linking... test11.obj : error LNK2001: unresolved external symbol _find test11.obj : error LNK2001: unresolved external symbol _test Debug/test11.exe : fatal error LNK1120: 2 unresolved externals 执行 link.exe 时出错.  test11.exe - 1 error(s), 0 warning(s) 三个文件在同一个文件夹下，如何解决，望大神指教一二


Question: 如何通过指针实现执行代码的软重启（假设执行代码的起始地址为0x0000）

没那么复杂，用typedef声明下，很简单明了  typedef int(*VF)(); VF vf = (VF)0x10000; vf();   int _tmain(int argc, _TCHAR* argv[]) { 	if (LONG(argv) ==0) 	{ 		printf("0\n"); 		return 0; 	} 	else if (LONG(argv) ==1) 	{ 		printf("1\n"); 		return 0; 	} 	else printf(__FUNCTION__ "\n");  	::getchar(); 	 	((int(*)(int, _TCHAR*[]))_tmain)(0, 0);  	typedef int(*VF)(int,  _TCHAR*[]); 	VF vf = (VF)_tmain; 	vf(0, (_TCHAR**)1);;  	printf("The End\n"); 	::getchar(); 	return 1; }

参考开源虚拟机源代码相关片断。

我估计它的意思是通过函数指针在某一个时刻将某一段代码加载到某个内存段中执行～其实就是拷贝代码动态执行的意思罢……


Question: 制作图像加密软件，需要了解哪些知识？

作为初步的尝试...... 楼主可以把图片用 Adobe Photoshop 打开，然后 文件(F) ->存储为(A)，格式(F) 一栏选 Portable Bit Map. 然后楼主上网查一下 PPM 图像格式，这应该是最简单的一种了。当然，jpeg 的库多得是，各种年代的都有......

图像处理基础 http://www.codeproject.com/Articles/781213/Fundamentals-of-Image-Processing-behind-the-scenes

建议先把基础打好  如果是位图，在WINDOWS上可以调用GetDIBits，或者直接使用OPENCV


Question: 怎样将.mat文件应用到C语言中，直接读入就行吗？

你指的是MATLAB中的.mat文件吗，需要了解这种文件的存储格式  可参看：《matlab与c/c++混合编程》


Question: 数据结构求二叉树深度，问题在代码上标出

递归出的结果是当前结点的子结点的深度，因为自己也是一层，所以要加一返回给上一层。

分别求出左子树的深度、右子树的深度，两个深度的较大值+1即可求出二叉树深度

+1还要算上根节点  函数用到了递归

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

更正：hl是左子树高度，hr是右子树高度

hr是左了树的高度，+1是因为当结点要算一层


Question: 哪位能给我一个不重不漏的C标准库函数大全。

引用 11 楼 zhao4zhong1 的回复:查MSDN是Windows程序员必须掌握的技能之一。 会用man命令是Linux程序员必须掌握的技能之一。 请教赵４老师，如果是写linux驱动，要用内核函数，到哪查哪。  我目前下到一个linux-api-2.6.22.14的chm文件，可是发现不全。 另外我也知道了用make htmldocs 能自动生成手册，但那是html的，想要直接查一个函数或结构体很麻烦。 用man命令内核函数根本没有

不重不漏地将C标准库全部倒背如流又能怎样？ 还是飞不到天外。

你说的ultoa不是标准的C函数库。  网上查一般就cplusplus.com与cppreference.com, cppreference.com有中文版的。 网上可以下到一个根据cppreference做到一个chm格式的文档，但比较早，收录的函数不是很全。

grep  https://www.baidu.com/s?wd=linux驱动开发

引用 13 楼 zhao4zhong1 的回复:[quote=引用 12 楼 ipqtjmqj 的回复:] [quote=引用 11 楼 zhao4zhong1 的回复:] 查MSDN是Windows程序员必须掌握的技能之一。 会用man命令是Linux程序员必须掌握的技能之一。 请教赵４老师，如果是写linux驱动，要用内核函数，到哪查哪。  我目前下到一个linux-api-2.6.22.14的chm文件，可是发现不全。 另外我也知道了用make htmldocs 能自动生成手册，但那是html的，想要直接查一个函数或结构体很麻烦。 用man命令内核函数根本没有[/quote] 提醒：Linux是开源的。[/quote] 我试过，源代码太多了，查一个函数都要等好几秒，见这个主题

引用 12 楼 ipqtjmqj 的回复:[quote=引用 11 楼 zhao4zhong1 的回复:] 查MSDN是Windows程序员必须掌握的技能之一。 会用man命令是Linux程序员必须掌握的技能之一。 请教赵４老师，如果是写linux驱动，要用内核函数，到哪查哪。  我目前下到一个linux-api-2.6.22.14的chm文件，可是发现不全。 另外我也知道了用make htmldocs 能自动生成手册，但那是html的，想要直接查一个函数或结构体很麻烦。 用man命令内核函数根本没有[/quote] 提醒：Linux是开源的。

引用 3 楼 stalk12 的回复:呵呵，不好意思，有没有中文注释的？  http://zh.cppreference.com/w/c/header

仅 C 的部分就是这两个网址了： http://www.cplusplus.com/reference/clibrary http://en.cppreference.com/w/c

引用 3 楼 stalk12 的回复:呵呵，不好意思，有没有中文注释的？  没有  http://en.cppreference.com/w/Main_Page

英语也是一门计算机语言的说。

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

呵呵，不好意思，有没有中文注释的？


Question: 杭电2072的题目，为什么我的测试数据自己测试都符合要求，就是WA

引用 1 楼 赵4老师的回复:边界条件 输入输出格式 …… 发现问题了，如果先打多个空格就会出错

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


Question: 不知道哪里出错了，运行不出来，求助；

Void Visit(ElemType T)  改成  void Visit(ElemType T)   if(T==NuLL)  改成  if(T==NULL)  没有下面这两个函数，检查你是要用哪个 PreOrderPrePrintLeaf(T->lchild); PreOrderPrePrintLeaf(T->rchild);

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

建议楼主单步调试一下。


Question: 用语言编写生成三幅分辨率为800*600的bmp图片，颜色分别为红绿蓝。萌新求大神支招

用C语言呢。。。。

用C语言编写。有具体的代码吗？

先查询bmp图像的格式，然后照着格式一个字节一个字节写就可以了

引用 2 楼 u010165006 的回复:http://download.csdn.net/detail/u010165006/9688692  图形用户界面可以学习C++ Builder，入门比较容易。 仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/ C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/

仅供参考：#pragma comment(lib,"gdi32") #include <windows.h> #include <stdio.h>  int main() {     const DWORD uWidth = 18 + 17 * 256, uHeight = 18 + 17 * 128;      PBITMAPINFO pbmi = (PBITMAPINFO) LocalAlloc (LPTR, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2);     pbmi->bmiHeader.biSize = sizeof (BITMAPINFOHEADER);     pbmi->bmiHeader.biWidth = uWidth;     pbmi->bmiHeader.biHeight = uHeight;     pbmi->bmiHeader.biPlanes = 1;     pbmi->bmiHeader.biBitCount = 1;     pbmi->bmiHeader.biSizeImage = ((uWidth + 31) & ~31) / 8 * uHeight;     pbmi->bmiColors[0].rgbBlue = 0;     pbmi->bmiColors[0].rgbGreen = 0;     pbmi->bmiColors[0].rgbRed = 0;     pbmi->bmiColors[1].rgbBlue = 255;     pbmi->bmiColors[1].rgbGreen = 255;     pbmi->bmiColors[1].rgbRed = 255;      HDC hDC = CreateCompatibleDC (0);     void * pvBits;     HBITMAP hBitmap = CreateDIBSection (hDC, pbmi, 0, &pvBits, NULL, 0);     SelectObject (hDC, hBitmap);     HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "宋体"); //  HFONT hFont = CreateFont (16, 0, 0, 0, 0, 0, 0, 0, SHIFTJIS_CHARSET, 0, 0, 0, 0, "宋体");     SelectObject (hDC, hFont);     BitBlt (hDC, 0, 0, uWidth, uHeight, NULL, 0, 0, WHITENESS);      char c[4];     int i, j;     for (i = 128; i < 256; i++) {         sprintf (c, "%02X", i);         TextOut (hDC, 1, (i - 127) * 17 + 1, c, 2);     }     for (j = 0; j < 256; j++) {         sprintf (c, "%02X", j);         TextOut (hDC, (j + 1)* 17 + 1, 1, c, 2);     }     for (i = 128; i < 256; i++) {         for (j = 0; j < 256; j++) {             c[0] = (char) i;             c[1] = (char) j;             TextOut (hDC, (j + 1) * 17 + 1, (i - 127) * 17 + 1, c, 2);         }     }     for (i = 0; i < 130; i++) {         MoveToEx (hDC, 0, i * 17, NULL);         LineTo (hDC, uWidth, i * 17);     }     for (j = 0; j < 258; j++) {         MoveToEx (hDC, j * 17, 0, NULL);         LineTo (hDC, j * 17, uHeight);     }      BITMAPFILEHEADER bmfh;     bmfh.bfType = *(PWORD) "BM";     bmfh.bfReserved1 = 0;     bmfh.bfReserved2 = 0;     bmfh.bfOffBits = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2;     bmfh.bfSize = bmfh.bfOffBits + pbmi->bmiHeader.biSizeImage;      HANDLE hFile = CreateFile ("goal.bmp", GENERIC_WRITE, 0, 0, CREATE_ALWAYS, 0, 0);     if (hFile != INVALID_HANDLE_VALUE) {         DWORD dwWritten;         WriteFile (hFile, &bmfh, sizeof (BITMAPFILEHEADER), &dwWritten, NULL);         WriteFile (hFile, pbmi, sizeof (BITMAPINFOHEADER) + sizeof (RGBQUAD) * 2, &dwWritten, NULL);         WriteFile (hFile, pvBits, pbmi->bmiHeader.biSizeImage, &dwWritten, NULL);          CloseHandle (hFile);     }      DeleteObject (hFont);     DeleteObject (hBitmap);     DeleteDC (hDC);     LocalFree (pbmi);      return 0; }

引用 2 楼 u010165006 的回复:http://download.csdn.net/detail/u010165006/9688692  参考： http://blog.163.com/tab_98/  图形用户界面可以学习C++ Builder，入门比较容易。 仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/ 学C++还是C#、Java？ http://blog.163.com/tab_98/blog/static/11924097201511274543737/ 《C++ Builder（BCB）从初学到入门》 http://blog.163.com/tab_98/blog/static/119240972016157466626/