Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 在VS2013下，我的C语言火车问题的队列程序怎么运行不了？

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

user: user-2
content: 我测试不会报错，so，贴错误吧。

user: user-3
content: 千万别用vs
user-0 提问: 请问这个是'指针'么?

回复:
user: user-1
content: *a等价于a[0]

user: user-2
content: 楼主说的对 string存的是实际字符的地址 楼主的问题出在   *  这个运算符上 这个运算符叫指针运算符，也称间接访问运算符 *string 表示“string指向的对象”即string指针变量里的地址指向的字符型变量 *string != '\0' 这样就意味着 string指向的字符型变量与'\0'比较

user: user-3
content: 我比较纳闷的是第一个while有什么用，if不就好了吗？？

user: user-4
content: strings是char ** string = *strings 所以string是char * 那*string就是char了。

user: user-0
content: 我也看错了, string和 strings...

user: user-0
content: 引用 2 楼 caozhy 的回复:strings相当于二维数组。 每个元素是一个字符数组（string） string是一个一维数组（value） value是单个字符。 完全出乎意料,入门c中,谢了...版主...

user: user-0
content: 引用 1 楼 user-6 的回复:char	*string;	/* the string we're looking at */  string是char* *string是char 入门c中,天呀.完全不懂,得把指针和字符串看了先...谢了...

user: user-5
content: strings相当于二维数组。 每个元素是一个字符数组（string） string是一个一维数组（value） value是单个字符。

user: user-6
content: char	*string;	/* the string we're looking at */  string是char* *string是char
user-0 提问: 小白求教，带双引号的字符串和char[]有什么区别，还有怎么获得当前日期的格式化字符串

回复:
user: user-1
content: 仅供参考#include <stdio.h> #include <string.h> #include <time.h> #include <sys/timeb.h>  struct tm st; time_t tt; char mon[4]; char mn[12][4]={"Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"}; int i; char timstr[27]; char tmpbuf[128]; struct _timeb tb; int tz; char c;  void main() {     strcpy(timstr,"08/Dec/2011:15:25:03 +0800");     sscanf(timstr,"%2d/%3s/%4d:%2d:%2d:%2d",&st.tm_mday,mon,&st.tm_year,&st.tm_hour,&st.tm_min,&st.tm_sec);     for (i=0;i<12;i++) if (0==stricmp(mn[i],mon)) {st.tm_mon=i; break;}     st.tm_year-=1900;     tt=mktime(&st);     if (-1!=tt) {         strftime(tmpbuf,128,"%Y-%m-%d %H:%M:%S\n",localtime(&tt));         printf(tmpbuf);//2011-12-08 15:25:03     } else {         printf("[%s] is Invalid time string!\n",timstr);     }      _ftime(&tb);     strftime(tmpbuf,128,"%m/%b/%Y:%H:%M:%S",localtime(&tb.time));     tz=-tb.timezone;     c=(tz>0)?'+':'-';     tz=(tz>0)?tz:-tz;     sprintf(tmpbuf,"%s %c%02d%02d\n",tmpbuf,c,tz/60,tz%60);     printf(tmpbuf);//12/Dec/2011:17:36:41 +0800 }

user: user-2
content: 应该是strftime需要char *，Show_Str需要unsigned char *引起的

user: user-0
content: 引用 1 楼 caozhy 的回复:char *修改为unsigned char * 哇，是C大！  我按照你说的方法改了一下 void display_page1(void) { 	time_t rawtime; 	struct tm * timeinfo; 	unsigned char strbuff[128]; 	 	rawtime = time(NULL); 	timeinfo = localtime(&rawtime);	 	strftime( strbuff, 128, "%Y年 %A月 %d日", timeinfo);	  	Show_Str(80,200,320,16,strbuff,16,0); }  编译的时候，报了另外一个错： ..\MONITOR\monitor_display.c(35): warning:  #167-D: argument of type "unsigned char *" is incompatible with parameter of type "char *restrict"  另外我把u8的定义也贴一下： typedef unsigned          char uint8_t; typedef uint8_t  u8;

user: user-3
content: char 修改为unsigned char

user: user-3
content: char *修改为unsigned char *
user-0 提问: 关于c语言中的宏的问题

回复:
user: user-1
content: #与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         return 0; } 宏展开时： 如果宏定义以#开头，不展开参数，直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"； 如果宏定义不以#开头，展开参数，直接替换，由外层向里层，如果碰到的是#开头的宏，不继续往里层展开，往外层展开。 由外层向里层，如果碰到的是以非#开头的宏，继续往里层走，直至最里层，开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS： ##在宏中定义，是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现，是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         char a = 'a';         cout<<g(a)<<endl; // a         cout<<g(g(a))<<endl; // a         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         printf("%s\n", g(h(f(1,2)))); // h(f(1,2))         printf("%s\n", h(g(f(1,2)))); // "f(1,2)"         printf("%s\n", h(h(f(1,2)))); // "12"         system("pause");         return 0; } 预处理后的：（在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E） int main() {         char a = 'a';         cout<<"a"<<endl;         cout<<"g(a)"<<endl;         printf("%s\n", "12");         printf("%s\n", "f(1,2)");         printf("%s\n", "h(f(1,2))");         printf("%s\n", "\"f(1,2)\"");         printf("%s\n", "\"12\"");         system("pause");         return 0; } --------------------------------------------------- 宏解析 1.       ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号，它不能出现于宏替代表的开端和末尾。 例： #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2.       重新扫描和替换 在替换列表中的所有参数替换过之后，预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时，就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换（防止递归）。 例： #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC

user: user-2
content: 楼主，你的愿意是想输出"a##b"吧,而你宏定义里却只是a##b是个变量，我把你的代码在a##b处添加“”双引号，把它变作字符串，就可运行成功了#define join(a,b) "a##b"

user: user-3
content: error C2065:'ab':undeclared identifier 这个不明摆着的嘛！

user: user-4
content: 遇到宏问题时，可以加上 编译参数 /EP 查看宏展开后的结果  这里 printf ("%s\n", join(a, b));  等价于printf ("%s\n", ab); 而程序中并未定义变量ab，so error

user: user-5
content: printf ("%s\n",join(a,b));  等价于printf ("%s\n",ab); 这能不出错吗

user: user-6
content: 因为没有叫“ab”的变量。 没事别瞎折腾宏。 你这样搞出来的代码，最后只能是维护上的噩梦，害人害己的。

user: user-7
content: 或者lz是想这样 #include <stdio.h> #include <stdlib.h> #include <string.h>   #define show(var) printf (#var"is %d\n",var) #define print(var) printf ("%s\n",#var) #define join(a,b) "%s%s",a,b   int main () {     int number = 10;     char a[]="hsppy ";     char b[]="day!";      show(number);     print(C language);     printf (join(a,b));     return 0; }

user: user-7
content: 引用 5 楼 u014360189 的回复:楼主，你的愿意是想输出"a##b"吧,而你宏定义里却只是a##b是个变量，我把你的代码在a##b处添加“”双引号，把它变作字符串，就可运行成功了#define join(a,b) "a##b"+1
user-0 提问: 在VS2010环境下调试一个C程序，报错了，但是我看不懂，求教

回复:
user: user-1
content: int j=0; while(sum[j]==0) { j++; } 这句话啥意思啊？

user: user-0
content: 谢谢，已经运行出来了。

user: user-2
content: 出错原因是以下语句只申请了一个字节的内存来存放长整数： p1=(char *)malloc(sizeof(char)); p2=(char *)malloc(sizeof(char));  建议如下修改：  #define MAX_LENGTH 100 /*加 假定整数最长不超过99位*/ void main() {   char *p1,*p2,*sum,*sum_out;   p1=(char *)malloc(MAX_LENGTH*sizeof(char));//改 p1=(char *)malloc(sizeof(char));   p2=(char *)malloc(MAX_LENGTH*sizeof(char));//改 p2=(char *)malloc(sizeof(char));
user-0 提问: C语言malloc和strcpy基本问题

回复:
user: user-1
content: strcpy不会管目的地的容量，它只将源地址的以'\0'结尾的字符串复制到目的地，目的地太短的话会越界操作 建议使用有字符数限制的版本  char *strncpy( char *strDest, const char *strSource, size_t count );

user: user-2
content: printf的格式描述要和实参匹配。  打印地址用%p,不要用%d

user: user-3
content: 引用 2 楼 u013025310 的回复:我的意思是c3指向的是3个字节的堆空间，为什么abcdefg超过3个字节能正常输出，这里strcpy的原理是什么？ 溢出,占用了后面的其它空间,可能引发崩溃,当然你程序小,没有不良反应

user: user-2
content: 引用 2 楼 u013025310 的回复:我的意思是c3指向的是3个字节的堆空间，为什么abcdefg超过3个字节能正常输出，这里strcpy的原理是什么？ 已经越界， 行为未定义。 所谓“正常输出“是可能的结果之一。  strcpy的文档：http://www.cplusplus.com/reference/cstring/strcpy/

user: user-0
content: 我的意思是c3指向的是3个字节的堆空间，为什么abcdefg超过3个字节能正常输出，这里strcpy的原理是什么？

user: user-4
content: 输出到"/0"空字符
user-0 提问: 中文的字符输出

回复:
user: user-1
content: // test.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include <iostream> #include <conio.h> #include <atlbase.h> using namespace std;    int _tmain(int argc, _TCHAR* argv[]) {          int k,l; 		USES_CONVERSION;  		wchar_t a[]= {0x5927,0x5bb6,0x597d,0x5927,0x5bb6,0x597d,0x0000}; 		printf("%s\n", W2A(a));          for(k=0;*(a+k)!='\0';k++)         { 			wchar_t p = a[k];                 printf("*(a+%d)=%s",k,W2A(&p)); 				//putchar(*(a+k));                 putchar('\n');         }  	return 0; }

user: user-2
content: 楼主可以试试加一行 printf("%d\n", strlen(a)); 看看这个字符串的长度，应该是11。5个汉字对应了10个字节，再加上一个c 比如说，假定某个汉字的编码是0x1234，那么连续输出0x12和0x34就会显示这个汉字，但是输出0x12 \n 0x34就会显示两行乱码

user: user-2
content: 每个汉字实际上是两个字节，如果各自单独打印就是两个乱码。但是两个乱码连起来就又是一个汉字了。
user-0 提问: 请教高手如何在windows窗口系统下（不是控制台模式）的学习c语言

回复:
user: user-1
content: 查MSDN是Windows程序员必须掌握的技能之一。  英语也是一门计算机语言的说。

user: user-1
content: #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");         ohfont=SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-720, r.top+r.bottom/2-120,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; }

user: user-2
content: MSDN  原汁原味

user: user-3
content: 给你一个例子吧，c++的，其实差不多的 C++写的win32简单密码保险箱

user: user-4
content: 引用 楼主 king_2007 的回复:请问高手哪里有中文的windows api的文档？？最好是翻译不错的。另外学习用c语言开发窗口应用程序？一些句柄的类型如何获取呢？ http://wenku.baidu.com/link?url=edl0-qCA3C9yAEW2sFB_f8oYUD2s_HL6Te8DoVcG3rPEZpLYLQ70haQjDXaG5hhi9EguljLqDQis3HPq-sWtIh8S2YAR4kIdP6XNCGVOA-K 新​编​W​i​n​d​o​w​s​_​A​P​I​_​参​考​大​全​(​真​正​完​整​版​) 但最好用英文版 句柄的类型 可以在VS中 点击右键 －－－> Go to definition of  ****查看是如何定义的

user: user-5
content: 我用cfree入门win32的，以后过渡到vc
user-0 提问: 栈的数组实现 有2行不明白

回复:
user: user-1
content: 你先把 数据类型看清楚  应该就知道哪些东西需要分派内存

user: user-2
content: S应该是一个指向结构体的指针，要为它分配。 S结构的的Array成员也是指针，因此也需要分配空间。

user: user-3
content: 第一次是为S结构体本身开辟空间 第二次是为S结构体的Array成员所指向ElementType结构体数组开辟空间
user-0 提问: 回文判断（用C语言）    求大神帮忙

回复:
user: user-1
content: 如果是短的输入用一个字符串存储，用下标比较前后对应位置是否相等，如果长的话用vector来存储避免浪费内存。

user: user-2
content: bool  isPalindrome(char *str) { 	char *p1=str; 	char *p2=str; 	if(str==NULL)  return false; 	while(*(p2+1))  p2++; 	while(1) 	{ 		if(*p1!=*p2)  return false; 		if(p2<=p1) return true; 		p1++; 		p2--; 	} }

user: user-3
content: #include <stdio.h> #include <string.h> #define N 1000 #define TURE 1 #define FALSE 0 int is_palindrome(char *s) { 	char *h = s; 	char *t = s+strlen(s)-1; 	 	while(h < t) 	{ 		if(*h != *t) 				return FALSE; 		else 		{ 			h++; 			t--; 		} 	} 	return TURE; } int main() { 	char str[N]; 	int ret;  	printf("input\n"); 	scanf("%s",str); 	if(is_palindrome(str)) 	{ 		printf("input is palindrome\n"); 	} 	else 	{ 		printf("input is not palindrome\n"); 	} 	return 0;  }

user: user-4
content: #include<stdio.h> #include<string.h> char _str[1005]; int palindrome(char _str[],int _L,int _R) {  if(_L>=_R)return 1;  if(_str[_L]-_str[_R])   return 0;  return palindrome(_str,_L+1,_R-1); } int main(void ) {  while(gets(_str),strcmp(_str,"@"))//输入@结束   printf("%s\n",palindrome(_str,0,strlen(_str)-1)?"Yes":"No"); }
user-0 提问: if(strcmp(str1,str2))

回复:
user: user-1
content: #include  "stdio.h" #include "string.h"  char str1[]={"china"}; char str2[]={"chinese"}; //if(strcmp(str1,str2)) if(strcmp(str1,str2)==0) //0表示相等  { printf("yes"); } else { printf("NO"); }

user: user-2
content: 经测试时Yes

user: user-3
content: Return Value  The return value for each of these functions indicates the lexicographic relation of string1 to string2.  Value Relationship of string1 to string2  < 0 string1 less than string2  0 string1 identical to string2  > 0 string1 greater than string2   if测试时，把0看作是false，正数和负数都看作是true
user-0 提问: 字符型数据和整形数据组成的结构体类型用sizeof测出的长度为8？

回复:
user: user-1
content: 搜 内存对齐  和  pragma pack()

user: user-2
content: struct Student     {         int mun;                    --->  4         char name[20];       ---> 20         char sex;                  --->  1    --> 与上面的20一起进行填充对齐边界『4的倍数』，故21对齐为24         int age;                     --->  4         float score;              --->  4         char addr[30];         --->  32     };

user: user-0
content: 引用 1 楼 user-2 的回复: 请问怎么结构对其？是向长度最长的成员对其吗？  #include <stdio.h> int main() { 	struct Student 	{ 		int mun; 		char name[20]; 		char sex; 		int age; 		float score; 		char addr[30]; 	}; 	printf("%d\n", sizeof(struct Student));//68 	return 0; }  如果是的话这里有2个整形，1个单精度型，51个字符型，应该是(2+1+51)*4=216字节？为什么显示68呢？ 是我哪里理解错了吗？

user: user-2
content: struct Char_Int     {         char c;         int i;     }; 结构对齐，中间空隙填充所致
user-0 提问: 关于swap函数中的*和&求大神解释

回复:
user: user-1
content: 一个是c++的东东，一个是c里的东东。 用&在传入参数的时候可以直接传入变量名而不用考虑其他。

user: user-2
content: 引用是对指针的封装 楼主的swap1和swap2两个函数，估计编译成机器命令后是一模一样的（哪怕编译器不进行任何优化）

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

user: user-4
content: 引用 6 楼 chengye_xin 的回复:*是指针，C程序员比较喜欢用，C++中逐渐被&取代 &是引用，只在C++中用  具体的区别，基本功能上没有区别，可以互换，可以将&理解为对*的优化：*可能为空，而使用空指针可能造成程序崩溃，而&使用前必须初始化，因而使用&代替*可以避免空指针导致的错误。  具体的可以去查询一下指针和引用的区别。  以上。  http://www.cnblogs.com/kingln/articles/1129114.html  具体的可以参考这个贴，讲的很详细。

user: user-4
content: *是指针，C程序员比较喜欢用，C++中逐渐被&取代 &是引用，只在C++中用  具体的区别，基本功能上没有区别，可以互换，可以将&理解为对*的优化：*可能为空，而使用空指针可能造成程序崩溃，而&使用前必须初始化，因而使用&代替*可以避免空指针导致的错误。  具体的可以去查询一下指针和引用的区别。  以上。

user: user-5
content: &为引用，应该是C++里的东西，就是给变量起个别名。* 为指针，传进函数的参数为实参的拷贝。我也说不太明白了

user: user-6
content: void swap1(int &x,int &y) -----> 通过引用实现交换，C++中可用，C中不可用  void swap2(int *x,int *y)  ----->通过指针实现交换，C++和C中都可用
user-0 提问: 伪随机数加密 为什么要+33？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:查一下该算法的原理 你看明白了吗？ 如果你看明白了，能不能讲讲

user: user-1
content: 查一下该算法的原理
user-0 提问: 特定文件枚举！

回复:
user: user-1
content: #include <Windows.h> #include <stdio.h> #include <Shlwapi.h>  #pragma comment(lib, "Shlwapi")  void enum_path(char *cpath, char *ext) {     WIN32_FIND_DATA wfd;     HANDLE hfd;     char cdir[MAX_PATH];     char subdir[MAX_PATH];      GetCurrentDirectory(MAX_PATH, cdir);    SetCurrentDirectory(cpath);     hfd = FindFirstFile("*.*", &wfd);     if (hfd != INVALID_HANDLE_VALUE)     {       do        {           if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)           {              if (wfd.cFileName[0] != '.')              {                 // 合成完整路径名                 sprintf(subdir, "%s\\%s", cpath, wfd.cFileName);                 // 递归枚举子目录                 enum_path(subdir, ext);             }          }          else          {              if (!lstrcmp(PathFindExtension(wfd.cFileName), ext))                printf("%s\\%s\n", cpath, wfd.cFileName);           }        } while (FindNextFile(hfd, &wfd));     }     SetCurrentDirectory(cdir); }  int main(void) {    //MessageBox(NULL, "", "", MB_OK);    enum_path("D:\\VC\\C", ".c");    return 0; }
user-0 提问: 紧急,,,跪求大神帮忙! 统计一个字符串L（只包含大小写英文字母）中各个字符出现的次数

回复:
user: user-1
content: 引用 5 楼 zcdabing 的回复:  // test.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include <map> #include <iostream>  using namespace std;   int _tmain(int argc, _TCHAR* argv[]) { 	map<char,size_t> mCount; 	char parr[] = "1234567890abcdefghijklmnopqistuvwxyz12345678901234567890"; 	for(int i=0;i!=strlen(parr);i++) 	{ 		map<char,size_t>::iterator cur = mCount.end(); 		map<char,size_t>::iterator pfind = mCount.find(parr[i]); 		if(cur!=pfind) 			pfind->second++; 		else 			mCount.insert(make_pair(parr[i],1)); 	}  	for(map<char,size_t>::iterator it = mCount.begin();it!=mCount.end();it++) 	{ 		printf("%c  %d\n",it->first,it->second); 	}   	return 0; }     看到0%的结贴率我后悔了，要是楼主不给结贴，以后再也不回0结贴率的帖子

user: user-2
content: 简单写一下 #include <stdio.h>  int main(void) {    char str[] = "eradfdgeffasWWSDADAFWFFadad";    int i, j, sum = 0;     for (i = 'a'; i < 'z'; ++i)    {       for (j = 0; str[j]; ++j)       {          if (i == str[j])             ++sum;       }        if (sum)       {          printf("%c : %d\n", i, sum);          sum = 0;       }    }        for (i = 'A'; i < 'Z'; ++i)    {       for (j = 0; str[j]; ++j)       {          if (i == str[j])             ++sum;       }        if (sum)       {          printf("%c : %d\n", i, sum);          sum = 0;       }    }        return 0; }

user: user-1
content: // test.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include <map> #include <iostream>  using namespace std;   int _tmain(int argc, _TCHAR* argv[]) { 	map<char,size_t> mCount; 	char parr[] = "1234567890abcdefghijklmnopqistuvwxyz12345678901234567890"; 	for(int i=0;i!=strlen(parr);i++) 	{ 		map<char,size_t>::iterator cur = mCount.end(); 		map<char,size_t>::iterator pfind = mCount.find(parr[i]); 		if(cur!=pfind) 			pfind->second++; 		else 			mCount.insert(make_pair(parr[i],1)); 	}  	for(map<char,size_t>::iterator it = mCount.begin();it!=mCount.end();it++) 	{ 		printf("%c  %d\n",it->first,it->second); 	}   	return 0; }

user: user-3
content: 只有大小写啊？if(*p<'z')low++;else lag+;就这样不就好了么

user: user-4
content: 楼主找了好久好久，就是从来没想过自己写作业

user: user-0
content: 1)	统计一个字符串L（只包含大小写英文字母）中各个字符出现的次数； b)	输入：程序CharacterUI.exe生成的Character.data.txt，一行，以char类型写的L。 c)	输出：一个txt文件 1)	第一行一个int，说明一共有多少个字符被统计； 2)	从第二行起，每行记录一个字符的情况，以char,int的方式记录字符和出现次数。 d)	程序CharacterUI.exe生成的Character.test.txt文件为对应Character.data.txt的答案。

user: user-0
content: 哦哦,是用C或者C++都行!
user-0 提问: C语言连接sqlserver数据库，非MFC哦

回复:
user: user-1
content: 引用 5 楼 oZaiYue 的回复:[quote=引用 2 楼 mujiok2003 的回复:] ADO, 是COM的。 试试ODBC 那个，大哥，能铺一段代码看看吗？对代码比较敏感[/quote]  msdn有很多odbc的代码呀， 自己动手编译一下嘛

user: user-1
content: 引用 5 楼 oZaiYue 的回复:[quote=引用 2 楼 mujiok2003 的回复:] ADO, 是COM的。 试试ODBC 那个，大哥，能铺一段代码看看吗？对代码比较敏感[/quote]  没有时间写啊

user: user-0
content: 引用 3 楼 user-4 的回复:换Mysql 或sqllite吧，它们有C接口的API 大哥，弄一段代码吧，看着比较清晰，谢谢您了

user: user-0
content: 引用 2 楼 mujiok2003 的回复:ADO, 是COM的。 试试ODBC 那个，大哥，能铺一段代码看看吗？对代码比较敏感

user: user-1
content: ADO, 是COM的。 试试ODBC

user: user-2
content: 未检查返回值 #include <Windows.h>    #include <sqlext.h> //#include <sql.h>    //#include <sqltypes.h> #include <stdio.h>     #pragma comment(lib, "ODBC32.lib")    #define MAXNAME 100   SQLHENV  henv   = SQL_NULL_HENV;    SQLHDBC  hdbc1  = SQL_NULL_HDBC;    SQLHSTMT hstmt1 = SQL_NULL_HSTMT;     int main(void)    {       RETCODE retcode;       char szDSN[SQL_MAX_DSN_LENGTH + 1] = "Northwind",   //必须是一个合法的DSN Name            szUID[MAXNAME]                = "",            //用户名            szAuthStr[MAXNAME]            = "";            //用户密码               retcode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);    retcode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLPOINTER)SQL_OV_ODBC3, SQL_IS_INTEGER);       retcode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc1);    /*连接到数据源,需要到控制面板->管理工具->数据源(ODBC)中添加数据源*/    retcode = SQLConnect(hdbc1,                            (SQLCHAR *)szDSN,                            (SWORD)strlen(szDSN),                            (SQLCHAR *)szUID,                            (SWORD)strlen(szUID),                            (SQLCHAR *)szAuthStr,                            (SWORD)strlen(szAuthStr));        if ((retcode != SQL_SUCCESS) && (retcode != SQL_SUCCESS_WITH_INFO))          printf("Connection Error.\n");       else          printf("Connection Successfully.\n");              //连接成功,你可以操作数据库了       retcode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc1, &hstmt1);               SQLFreeHandle(SQL_HANDLE_STMT, hstmt1);    SQLDisconnect(hdbc1);       SQLFreeHandle(SQL_HANDLE_DBC, hdbc1);       SQLFreeHandle(SQL_HANDLE_ENV, henv);        return 0;   }

user: user-3
content: 引用 楼主 oZaiYue 的回复:哪位大神能提供一下C语言连接数据库的办法，最好用ADO，网上一搜全部是MFC的，我比较小白，想要那种最好是控制台程序的，纯C语言连接数据库的。  有sql的库啊

user: user-4
content: 换Mysql 或sqllite吧，它们有C接口的API
user-0 提问: 如何进行整个结构体的赋值操作？

回复:
user: user-1
content: 糊涂啊。

user: user-2
content: struct a, b; //假设b已经有有效值 a = b; 整体赋值完成 后果自己仔细掂量

user: user-3
content: struct S {  int i;  double d; } s1,s2; s1.i=1; s1.d=2.3; s2=s1; printf("s2.i==%d,s2.d==%lg\n",s2.i,s2.d);

user: user-4
content: 8楼正解 结构就是这么的方便

user: user-5
content: 引用 1 楼 user-10 的回复:需要Copy么？直接等就行了。 默认的赋值函数就是内存拷贝，memcpy 正解，里面又没有指向堆地址的指针，不需要深拷贝，浅拷贝就行了；

user: user-6
content: 啥叫temp一直处于失效的状态？

user: user-7
content: struct User { 	char ID[20]; 	char password[100]; 	char name[20]; 	int sex; 	int age; 	static int count; 	void copy(struct User temp) 	{ 		strcpy(ID,temp.ID); 		strcpy(password,temp.password); 		strcpy(name,temp.name); 		sex=temp.sex; 		age=temp.age; 	} }user[1000];//结构体部分  user[count].copy(user_temp);//调用的语句，目的是把user_temp里的内容复制到user[count]里边去。   这样改行吗？

user: user-8
content: POD数据，直接=就可以了吧。编译器生成的默认的copy函数就可以完成工作了。

user: user-9
content: 如果用strcpy那么，src必须是由'\0'结尾的。

user: user-10
content: 需要Copy么？直接等就行了。 默认的赋值函数就是内存拷贝，memcpy
user-0 提问: 笔试题  船靠岸

回复:
user: user-1
content: 绳子的高度和人一样呢，这样还构成一个长方形了，绳子长度和船的距离是一样的了  引用 3 楼 Intel0011 的回复:[quote=引用 楼主 u012538549 的回复:]            一道程序猿笔试题     在一个平静的湖中有一条小船，湖岸边立着一条木杆，木杆上头系一根绳子，绳子另一头拉在船夫手上，船夫不断拉动绳子，船不断靠近岸边，最终船达到木杆跟前，问：在这个过程中，船的移动速度与绳子在人手上的移动速度哪个快？（说出简单的数学原理）        （ 百度百科上给去了绳子快的答案 ）  将木杆、船到木杆的距离、绳子视为一个直角三角形，木杆、船到木杆的距离为直角边，绳子为直角三角形的斜边， 利用直角三角形的斜边 大于直角三角形的直角边的原理，在时间相等的情况下，很显然绳子在人手上的移动速度的更快[/quote]

user: user-2
content: 引用 楼主 u012538549 的回复:一道程序猿笔试题     在一个平静的湖中有一条小船，湖岸边立着一条木杆，木杆上头系一根绳子，绳子另一头拉在船夫手上，船夫不断拉动绳子，船不断靠近岸边，最终船达到木杆跟前，问：在这个过程中，船的移动速度与绳子在人手上的移动速度哪个快？（说出简单的数学原理）        （ 百度百科上给去了绳子快的答案 ）  将木杆、船到木杆的距离、绳子视为一个直角三角形，木杆、船到木杆的距离为直角边，绳子为直角三角形的斜边， 利用直角三角形的斜边 大于直角三角形的直角边的原理，在时间相等的情况下，很显然绳子在人手上的移动速度的更快

user: user-3
content: 应该是手上的速度快。原理应该是速度的矢量和。

user: user-4
content: 那要看拉的人用什么角度。。

user: user-5
content: 引用 6 楼 u012538549 的回复:我分析得到船速快于绳子速度    问过很多程秀员   全部都是认为绳子速度快于船速（没有一个认为船速大于绳子速度的）               3楼分析模型三角形    船走了一个直角三角形底边    绳子走了一个斜边减掉一个杆长的长度（不是一个斜边）     而三角形中一条边减除另一条边小于第三边            （我问过的程序猿全军覆没    一道高中受力分析题）  呵呵，有点道理

user: user-2
content: 引用 6 楼 u012538549 的回复:我分析得到船速快于绳子速度    问过很多程秀员   全部都是认为绳子速度快于船速（没有一个认为船速大于绳子速度的）               3楼分析模型三角形    船走了一个直角三角形底边    绳子走了一个斜边减掉一个杆长的长度（不是一个斜边）     而三角形中一条边减除另一条边小于第三边            （我问过的程序猿全军覆没    一道高中受力分析题） 有道理，漏了这一因素

user: user-6
content: 这不是数学题，这是物理题

user: user-0
content: 我分析得到船速快于绳子速度    问过很多程秀员   全部都是认为绳子速度快于船速（没有一个认为船速大于绳子速度的）               3楼分析模型三角形    船走了一个直角三角形底边    绳子走了一个斜边减掉一个杆长的长度（不是一个斜边）     而三角形中一条边减除另一条边小于第三边            （我问过的程序猿全军覆没    一道高中受力分析题）

user: user-7
content: 有两种答案，第一种是一样快，第二种是绳子快。这个答案要看题目的具体的图形才知道
user-0 提问: VS2010学习版cout的一个问题

回复:
user: user-0
content: 引用 1 楼 zmlovelx 的回复:估计是把到exit(0) 那句去了。 程序自己退出  没有走exit(0)，走得是下面的else，*x也是一个正常的int值，很奇怪。

user: user-1
content: 却是是运行完了就退出了  并没有什么其他的问题

user: user-2
content: 估计是把到exit(0) 那句去了。 程序自己退出
user-0 提问: 各位大神求教一个计算斜率，进行标定的奇葩问题，一直编译通不过啊。

回复:
user: user-1

user: user-0
content: 果然是编译器的问题，在build 选项的global里设置float ，和double 项为32bit就好了，这编译器居然默认double为24bit，真是奇葩.分全给你了，谢谢啦！

user: user-2
content: 你看一下编译选项，有没有关于double长度的设置。还有就是h不判断吗？为０情况不考虑？

user: user-0
content: 还是不行

user: user-2
content: RAM_Data.k[i]= (double)( (double)k/(double)h );

user: user-0
content: 这个问题其实不太好搞啊

user: user-0
content: RAM_Data.k[i]= ( (double)k/(double)h );改掉    什么意思？

user: user-2
content: 你没把(u32)去掉。

user: user-2
content: u32 k, h; for(i = 0 ; i < 5 ; i++ )     {            k = (RAM_Data.Calibration_Data_In_Order[i+1].Pressure - RAM_Data.Calibration_Data_In_Order[i].Pressure);         h = (RAM_Data.Calibration_Data_In_Order[i+1].AD_Outcome - RAM_Data.Calibration_Data_In_Order[i].AD_Outcome);         RAM_Data.k[i]= (double)k/(double)h ;      }

user: user-0
content: 还是老样子

user: user-2
content: RAM_Data.k[i]= ( (double)k/(double)h );改掉。

user: user-0
content: 貌似还是不行哎。

user: user-2
content: 上面的floast要去掉。

user: user-2
content: 把结构体Data_Save_IN_Flash 里面的k[6] 改成double类型  for(i = 0 ; i < 5 ; i++ )     {            k = (float)(RAM_Data.Calibration_Data_In_Order[i+1].Pressure - RAM_Data.Calibration_Data_In_Order[i].Pressure);         h = (float)(RAM_Data.Calibration_Data_In_Order[i+1].AD_Outcome - RAM_Data.Calibration_Data_In_Order[i].AD_Outcome);         RAM_Data.k[i]= ( (double)k/(double)h );      }

user: user-0
content: 要是弄好了，分就全给你啦。

user: user-2
content: 关键的没有帖出来，包含Pressure 这个词的结构没有贴出来。 这个问题很好调的。

user: user-0
content: 额，RAM_Data.k[i]   定义成double又回到那个无法生成代码的错误上了，将它定义为u32时候可以的。

user: user-2
content: 那没事啊，那你定义成double就可以了。double肯定是３２位的。

user: user-0
content: 谢谢啦，不过虽然编译是通过了，这样的话    RAM_Data.k[i]   就要定义成u32    ，我原来定义的float，因为是计算两点间标定斜率，定义成u32会损失很多精度啊。

user: user-2
content: 上面的float去掉。
user-0 提问: 命令行参数解析问题

回复:
user: user-1
content: 真的是这样，有点令人费解哦

user: user-2
content: http://stackoverflow.com/questions/253556/what-parameter-parser-libraries-are-there-for-c

user: user-3
content: 引用 楼主 ho509ho 的回复:编译运行后结果如下： [root@node0 Linux-C]# ./a.out -i -lr 'hi there' -f args.c -q 问题是： 在for循环中，为什么通过optind变量打印的是字符串‘hi there'  参数换成：[root@node0 Linux-C]# ./a.out -i -lr “hi there” -f args.c -q 要用双引号

user: user-3
content: 取每个参数的时候是这样取的啊。  #include<stdio.h> int main(int argc, char *argv[])  { 	int i; 	for(i=0; i<argc; i++) 	{ 		puts(argv[i]); 	} 	return 0; }

user: user-4
content: man 3 getopt  查看getopt函数的说明

user: user-5
content: http://bbs.csdn.net/topics/390469280
user-0 提问: printf 与stdout行缓冲问题求解

回复:
user: user-0
content: 引用 5 楼 mujiok2003 的回复:这个问题和你的一样，看看吧。 看来标准没有规定，就看所用的编译器了。   引用 1 楼 user-3 的回复:1，第一段代码，完全可能是有正常输出的。如果谁跟你说的有缓冲区就不输出了，去吐他一脸去 2，C++才规定了stdin的时候默认一定要去先刷新stdout，标准的规定。C99有没有在C++标准出来后跟进这个规定，自己去查标准。 3，自己多找几个编译器来试。 用turbo c用printf("dd>");while(1); 是有输出的。gcc就没有了。 感谢^_^

user: user-1
content: 这个问题和你的一样，看看吧。

user: user-1
content: 引用 3 楼 colddown 的回复:逻辑上stdin前先刷stdout是合理的，用户得看到输出提示才能知道输入什么  在stdin, stdout指向同一个终端时，是的。 如果有重定向， 则没有必要。

user: user-2
content: 逻辑上stdin前先刷stdout是合理的，用户得看到输出提示才能知道输入什么

user: user-3
content: 4，这是一个没有实际用途的话题，别在上面浪费太多生命。

user: user-3
content: 1，第一段代码，完全可能是有正常输出的。如果谁跟你说的有缓冲区就不输出了，去吐他一脸去 2，C++才规定了stdin的时候默认一定要去先刷新stdout，标准的规定。C99有没有在C++标准出来后跟进这个规定，自己去查标准。 3，自己多找几个编译器来试。
user-0 提问: 请问，这一小段运行段错误，问题在哪

回复:
user: user-1
content: **a = '1'; *(*a+1)='2'; 这样就可以了，**(a+1)是野指针，不能赋值。

user: user-2
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-3
content: #include <stdio.h> #include <stdlib.h> #include <string.h>   void stringtest(char **a) { 	*a = (char*)malloc(sizeof(char)*100);   //把*a  理解为 主函数里面的t指针 	*(*a+0) = '1'; 	*(*a + 1) = '2'; 	*(*a + 2)  = 0; 	printf("function:%s\n",*a);    	/* 	char *t = (char*)malloc(sizeof(char)*100);  	*(t+0)='1'; 	*(t+1)='2'; 	*(t+2)=0;  字符串记得加个ASCII 的0结尾  一般写成  '\0' 	*/   }  int main(void) {  	char * t; 	stringtest(&t);  	printf("main:%s\n",t); 	return 0; }

user: user-4
content: 段错误——内存访问错误！**(a+1)非法

user: user-5
content: 引用 3 楼 jia_jianlei 的回复:应该用*((*a)+1) = '2'; **（a+1) = '2';//表示将a+4地址变为一个二级指针，会非法访问内存。 a为一个二级指针，加一表示偏移一个数据类型（4个字节）。  运行结果： linux $ ./a.out  12 p: 0x9e66008 pp: 0xbfff22a8 pp + 1: 0xbfff22ac  代码：      1	#include <stdio.h>      2	#include <stdlib.h>      3	#include <string.h>      4	      5	int main(int argc, const char *argv[])      6	{      7		char *p = NULL;      8		char **pp = NULL;      9	     10		p = malloc(sizeof(*p)*4096);     11		bzero(p,4096);     12	     13		pp = &p;     14	     15		**pp = '1';     16		*(*pp+1) = '2';     17		printf("%s\n",p);	     18		printf("p: %p\n",p);	     19		printf("pp: %p\n",pp);	     20		printf("pp + 1: %p\n",pp + 1);	     21	     22	     23		free(p);     24		return 0;     25	}  谢谢！回答的很认真。

user: user-6
content: 应该用*((*a)+1) = '2'; **（a+1) = '2';//表示将a+4地址变为一个二级指针，会非法访问内存。 a为一个二级指针，加一表示偏移一个数据类型（4个字节）。  运行结果： linux $ ./a.out  12 p: 0x9e66008 pp: 0xbfff22a8 pp + 1: 0xbfff22ac  代码：      1	#include <stdio.h>      2	#include <stdlib.h>      3	#include <string.h>      4	      5	int main(int argc, const char *argv[])      6	{      7		char *p = NULL;      8		char **pp = NULL;      9	     10		p = malloc(sizeof(*p)*4096);     11		bzero(p,4096);     12	     13		pp = &p;     14	     15		**pp = '1';     16		*(*pp+1) = '2';     17		printf("%s\n",p);	     18		printf("p: %p\n",p);	     19		printf("pp: %p\n",pp);	     20		printf("pp + 1: %p\n",pp + 1);	     21	     22	     23		free(p);     24		return 0;     25	}

user: user-7
content: **(a+1) = '2'; ------> *(*a+1) = '2'; 另外记得释放申请的内存

user: user-0
content: 第一个**a = ‘1’；不会报错 第二个**(a+1) = '2' 在这里出错
user-0 提问: 大一新生 求大神指导我程序的错误

回复:
user: user-1
content: 你while循环还少了一个do，main函数中switch那里有个while，它会一直陷在switch里面出不来的。你仔细一行一行的对一下你照抄的那本书，然后把错误从头一个一个找，改完第一个错误就编译，然后找新的第一个错误。里面有;){符号之类的一般是你少加了。undeclared 之类的一般是没有声明变量。看不懂英文错误就翻译一下，因为你大学四年碰到的错误就那么几个单词，顶多二十。我也是从那时候过来的。

user: user-2
content: 通常   第一个缺少分号; 的二个缺少花括号 }

user: user-3
content: 引用 3 楼 u013171165 的回复:[quote=引用 2 楼 guanjianai 的回复:] 楼主，你可能是看着程序敲的吧？初学编程，一定记得仔细看错误提示，错误提示里面提供了解决问题的基本思路，你这个一看就是语法错误，说的清清楚楚，缺少;符号。那么你找到对应位置解决。 鉴于你初学，再次提醒下，从第一个错误开始改，后续错误很可能是第一个错误引起的连锁反应，改了第一个，可能后续错误提示都会消失。 找个好的IDE（我用的我用的我当然推荐：http://blog.csdn.net/zhanh1218/article/details/32334517） 话说大一一般都不会开C语言课吧？为什么没人理呢？是这个太简单了？对于自学+初学的人来说，最重要的就是耐心指导嘛！而且相对于天天dota的人来说，也值得。[/quote]+1

user: user-4
content: 不要使用main作为函数名称，也不要调用main，main只能作为程序的入口

user: user-5
content: 引用 2 楼 guanjianai 的回复:楼主，你可能是看着程序敲的吧？初学编程，一定记得仔细看错误提示，错误提示里面提供了解决问题的基本思路，你这个一看就是语法错误，说的清清楚楚，缺少;符号。那么你找到对应位置解决。 鉴于你初学，再次提醒下，从第一个错误开始改，后续错误很可能是第一个错误引起的连锁反应，改了第一个，可能后续错误提示都会消失。 找个好的IDE（我用的我用的我当然推荐：http://blog.csdn.net/zhanh1218/article/details/32334517） 话说大一一般都不会开C语言课吧？为什么没人理呢？是这个太简单了？对于自学+初学的人来说，最重要的就是耐心指导嘛！而且相对于天天dota的人来说，也值得。

user: user-6
content: 引用 3 楼 u013171165 的回复:[quote=引用 2 楼 guanjianai 的回复:] 楼主，你可能是看着程序敲的吧？初学编程，一定记得仔细看错误提示，错误提示里面提供了解决问题的基本思路，你这个一看就是语法错误，说的清清楚楚，缺少;符号。那么你找到对应位置解决。 鉴于你初学，再次提醒下，从第一个错误开始改，后续错误很可能是第一个错误引起的连锁反应，改了第一个，可能后续错误提示都会消失。 找个好的IDE（我用的我用的我当然推荐：http://blog.csdn.net/zhanh1218/article/details/32334517） 话说大一一般都不会开C语言课吧？为什么没人理呢？是这个太简单了？对于自学+初学的人来说，最重要的就是耐心指导嘛！而且相对于天天dota的人来说，也值得。[/quote]  楼主还是要学会耐心看看自己写的东西和错误的含义，因为以后一定要看的

user: user-7
content: 我以前也碰到过这种情况，那时候使用的是VC++6.0，因为不支持C99，所以在VC++6.0里所有函数内的声明语句都得在执行语句之前，这样才能保证通过编译器的语法查错。  我也不保证楼主遇到的是这种问题，总之死马当活马医吧！ 引用 2 楼 guanjianai 的回复:

user: user-0

user: user-8
content: 编译提示错误贴出来
user-0 提问: 函数反之指针类型探讨

回复:
user: user-1
content: http://blog.csdn.net/cwcmcw/article/details/9260401

user: user-2
content: char *r_chara()   {         int *p         static int a=8;         p=&a;         return (char *)p;     }

user: user-3
content: 不能返回局部变量的地址

user: user-4
content: 错误的，你返回了一个局部变量的地址。 其行为未定义，运气好程序运行正确。 运气不好，谁也不知道会怎么样

user: user-0
content: 自己的 沙发
user-0 提问: 用随机产生器做关于链式基数排序会崩溃

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处。
user-0 提问: 新人关于指针的疑问

回复:
user: user-1
content: 上面少写了  int *p; int a,b; p = &b; *p = (int)&a; // p指向的地址是b，则把a的地址做为一个int存到了b中

user: user-1
content: 1： Int *p; P=&a[0];  //p中存放的是a[0]这个元素的地址，也就是p指向了a[0] 和 Int *p; *P=&a[0]; //p指向的地址，那块内存里面存a[0]这个元素的地址，比如  int *p; int a,b; *p = (int)&a; // p指向的地址是b，则把a的地址做为一个int存到了b中   2：   Void swap(int*p1,int*p2) {     int*temp;     *temp=*p1;  //同上，*temp表示是 temp指向的地址里面存*p1，现在temp没有指向的地址，所以会出错； //temp=*p1是可以的，在这个函数里面，能够实现你想要的交换的功能。只是会比较怪异 //因为temp是指针，是int*，而*p1是int，类型不匹配。但是强制类型转换硬存，是能存进去的。      P1=*p2;     P2=*temp; }   Int *p; *p=3; //同上，p没有指向的内存，直接赋值是错误的。  引用 楼主 hans_dh 的回复:关于指针的疑惑 如何才算是给指针恰当的初始值，是在定义指针后马上就赋值吗？在同段代码里面，几行之后赋值算给恰当的初始值吗？（假设这中间并没有用到这个指针）。利用sanf函数从键盘键入一个算不算赋值了呢？有的书上说为了防止误写入，应当在定义指针后立刻赋值为NULL。那这个指针什么都不能干还有什么意义了呢？  在使用指针之前赋值，就是正确的。什么叫“使用指针“，比如你上面的*p，就是在使用p指针。 至于*p是在定义指针之后的什么地方，不要求。只要是在使用指针之前就可以。  利用sanf函数从键盘键入算赋值，但是你输入的可能是个非法值，是一个不能用的指针，并不是所有地址，都是可以让你随便用的。  在定义指针后立刻赋值为NULL，是对指针的初始化，但是不等于初始化之后，你就可以直接用了。你必须给指针一个合法的值，才可以开始使用

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

user: user-3
content: 1.都是危险，不要用。理由是对的。 2.赋值为null，就是写不了。但是可以保证不会成为野指针，不会讲别的数据冲掉。可以在需要使用的时候指向准确的空间即可。 如果你不知道什么时候用这个指针。这么做是规范和安全的。

user: user-4
content: {int*temp; *temp=*p1; P1=*p2; P2=*temp; } 改成 { int temp; temp=*p1; *p1=*p2; *p2=temp; }

user: user-4
content: Int *p; P=&a[0]; 和 Int *p; *P=&a[0]; ------> *p是int类型，&a[0]是int *类型，不可直接赋值，再说此时p是野指针，对*p写操作极其危险 都对吗？ 我认为都对，第一个意思是p和a[0]表示同一个数据。 －－－－》(*p)和a[0]才是表示同一个数据

user: user-5
content: 感觉该说的都说了，lz写代码要把大小写区分好。。。

user: user-6
content: 我就不喷了
user-0 提问: 关于epoll的一点疑问

回复:
user: user-0
content: 不是多线程,是多进程

user: user-1
content: 引用 2 楼 malone1 的回复:没抢到accept锁子,去处理其他的读写事件啊,不光只有连接事件的 那么这一部分是多线程都在处理吗？怎么没有保护 map<int,BaseEvent *>::iterator  iter;         for(size_t i =0;i<signalfd.size();i++)         {                 iter = m_clientmap.find(signalfd[i].fd);

user: user-0
content: 没抢到accept锁子,去处理其他的读写事件啊,不光只有连接事件的

user: user-1
content: if(1 !=shmtx_trylock(m_pmtx)){//多进程抢锁,没抢到就只处理已经连接上来的客户端的事件                 baccept = false;                 m_Reator.Run(signalfd);                 // 你这里是不是应该退出了？，为什么还要去执行后面的东西         }         else{
user-0 提问: release和debug运行结果不一致，这是什么原因？求大神指教

回复:
user: user-0
content: 谢谢大神们回复，5楼正解，受教了。

user: user-1
content: 这种问题没有意义啊，除了在学校。 谁在工作中这样写代码，谁就会被鄙视。  代码执行正确是第一层，方便自己阅读是第二层，方便团队中所有成员阅读是第三层。  实际工作中，尽量写没有歧义的代码，尽量写任何人都能理解的代码，尽量少用奇巧淫技。

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: release是优化版本，编译器会做很多优化处理 debug是调试版本，为了易于调试，会按源代码忠实地编译为二进制 volatile的作用是告诉编译器不对该变量做优化处理，使用时老老实实从内存上取数据

user: user-4
content: 引用 楼主 jinbei2009 的回复:最近我遇到一个问题，vs2012编写代码时，对自增运算符++操作时，发现release 和 debug结果不一致的情况（代码中的exp1），我对这种情况也做了其他尝试。现有两个问题 1、为什么我增加一行 scanf("%d",&c)，release 和debug 结果就一致了呢？ 2、volatile也可以让release和debug 两个结果一致，这是为什么？ 代码如下：  // 发现release版本和dubug版本不一致的情况  #include <stdio.h> #include <string.h> int fun(int a, int b) { 	return a+b; } void main() { 	//exp1,release show： a = 6, b = 10, debug show：a = 6,b = 11 	int a = 5; 	int b = fun(a++,a); 	printf("a = %d, b = %d\n",a,b);	 	//exp2,release & debug show：c = 6, d = 11 	int c = 5; 	int d = fun(c++,c); 	printf("c = %d, d = %d\n",c,d); 	scanf("%d",&c);//因为取地址，所以release没有优化？？ 	//exp3,release & debug show: e = 6, f = 11,  	volatile int e = 5;// volatile 一般在多线程中使用，在这里volatile起了什么作用？ 	int f = fun(e++,e); 	printf("e = %d, f = %d\n",e,f); 	//exp4,release & debug show: g = 5, h = 11,  	int g = 5; 	int h = fun(g,(g+1)); 	printf("g = %d, h = %d\n",g,h); 	//exp5,release & debug show: i = 6, j = 12 	int i = 5; 	int j = fun(i,++i);	 	printf("i = %d, j = %d\n",i,j); }   你Debug得到的值才是对的吧? 把Release的优化选项关掉就行了,我也碰到过

user: user-5
content: C++不保证你那种调用方式运算顺序。  CPU有一个叫做动态调度的东西，它会将两条不相关的指令的顺序改变执行。  自增++运算编译成汇编指令后有数条指令。编译器优化后，很有可能会是这样：  1将a放到寄存器 2将寄存器++ 3将寄存器放回a.  在寄存器放回a之前，cpu有可能会将a的数据压入函数栈，即在上面1-3的指令之间插入一个调用函数指令。  加了volatile会强制编译器不做优化，就是a++这个东西不放到寄存器，直接在内存上操作。  只能跟你说，不要写出根据函数参数的顺序来决定计算结果的代码！因为结果是不确定的！
user-0 提问: C语言 动态规划问题

回复:
user: user-1
content: 我的思路很简单，这样的： 这个问题转化为求解一个最优的i，满足下面的条件 i左边的最大递增序列个数是mi， i右边的最大递减序列个数是ni， 最优解就是求解 max(mi + ni -1) 这样问题就转换为求解最大的递增子序列和递减子序列问题 而最大递增子序列问题很容易求解，网上讲解很多 我的算法基础比较差，大神们看了不要笑
user-0 提问: 关于container_of宏的疑问

回复:
user: user-0
content: 引用 4 楼 Intel0011 的回复:const typeof( ((type *)0)->member ) *__mptr = (ptr); 这句话把三个参数都检查了，试想如果member是type结构体里的成员，但是member不是ptr所指的类型，换句话说ptr是正确的但是member是错误的，(type *)((char *)__mptr - offsetof(type, member)); 显然结果是错误的。但是 (type *)(ptr - offsetof(type, member));这句话编译器检查不出来，编译器不报错发出任何警告和错误  这个回答靠谱。有道理。  主要还是为了在编译阶段做检查及时发现错误。

user: user-1
content: const typeof( ((type *)0)->member ) *__mptr = (ptr); 这句话把三个参数都检查了，试想如果member是type结构体里的成员，但是member不是ptr所指的类型，换句话说ptr是正确的但是member是错误的，(type *)((char *)__mptr - offsetof(type, member)); 显然结果是错误的。但是 (type *)(ptr - offsetof(type, member));这句话编译器检查不出来，编译器不报错发出任何警告和错误

user: user-2
content: 避免该宏的返回值被修改。我猜。

user: user-0
content: 引用 1 楼 mgy4938 的回复:大哥，你这么改，连人家最初的定义都改了！container_of宏，主要作用是用于获得某结构中某成员的入口地址。  #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) TYPE是某struct的类型 0是一个假想TYPE类型struct,MEMBER是该struct中的一个成员. 由于该struct的基地址为0, MEMBER的地址就是该成员相对与struct头地址的偏移量。 关于typeof,这是gcc的C语言扩展保留字,用于声明变量类型. const typeof( ((type *)0->member ) *__mptr = (ptr);意思是声明一个与member同一个类型的指针常量 *__mptr,并初始化为ptr. (type *)( (char *)__mptr - offsetof(type,member) );意思是__mptr的地址减去member在该struct中的偏移量得到的地址, 再转换成type型指针. 该指针就是member的入口地址了.  你没理解我问的什么意思。  这个宏的用途是获取包含member成员的结构体的基址。哪里是获取某成员的入口地址。

user: user-3
content: 大哥，你这么改，连人家最初的定义都改了！container_of宏，主要作用是用于获得某结构中某成员的入口地址。  #define offsetof(TYPE, MEMBER) ((size_t) &((TYPE *)0)->MEMBER) TYPE是某struct的类型 0是一个假想TYPE类型struct,MEMBER是该struct中的一个成员. 由于该struct的基地址为0, MEMBER的地址就是该成员相对与struct头地址的偏移量。 关于typeof,这是gcc的C语言扩展保留字,用于声明变量类型. const typeof( ((type *)0->member ) *__mptr = (ptr);意思是声明一个与member同一个类型的指针常量 *__mptr,并初始化为ptr. (type *)( (char *)__mptr - offsetof(type,member) );意思是__mptr的地址减去member在该struct中的偏移量得到的地址, 再转换成type型指针. 该指针就是member的入口地址了.
user-0 提问: C语言 急  谢谢啊：怎样在一个文本里提取以数字开头的行内容

回复:
user: user-1
content: 1、顺序读取每一行，fgets（）函数 2、使用函数isdigit（）判断读取到的每一行的第一个字符是不是数字 3、第一个字符是数字的字符串追加到另一个文本中，fprintf()函数

user: user-2
content: 我是来混分的  感觉这个用c有点大炮打蚊子，不如用脚本来的快；当然，给客户做应用程序就另说了

user: user-3
content: 引用 2 楼 liuhengxiao 的回复:1、顺序读取每一行，fgets（）函数 2、使用函数isdigit（）判断读取到的每一行的第一个字符是不是数字 3、第一个字符是数字的字符串追加到另一个文本中，fprintf()函数   就用这个

user: user-4
content: if(buffer[0] >= '0' && buffer[0] <= '9'){ //数字 //写入文件 }

user: user-5
content: 引用 1 楼 caozhy 的回复:C#只要1行： File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).ToArray()); 数字排序按在文本出现的早晚，做了这一点吗。

user: user-0
content: 非常感谢楼上的几位大神老师、大哥大姐，特别感动！！ 我昨晚自己赶工基本上做出来了，现在在弄另一个问题，焦急！

user: user-6
content: 看错了。 File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).GroupBy(x => x).SelectMany(x => x).ToArray());

user: user-6
content: 引用 3 楼 Intel0011 的回复:[quote=引用 1 楼 caozhy 的回复:] C#只要1行： File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).ToArray()); 数字排序按在文本出现的早晚，做了这一点吗。 [/quote]  File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).OrderBy(x => x).ToArray());

user: user-7
content: 这个世界上最大的差别和最远的距离都存在于“说”和“做”之间。  //在一个文本里提取以数字开头的行内容，并排序后导出到另一文本，急  谢谢啊 //（数字排序按在文本出现的早晚，如下就是 220  10  110 ） //例如：1.txt //白云城1#测距 //五峰GPS定位 //220km故障 //10km白07备用 //110km检修 //夜明珠2#断档 //220km故障 //110km检修 // //导出到2.txt //220km故障 //220km故障 //10km白07备用 //110km检修 //110km检修 #include <stdio.h> #include <string.h> #include <stdlib.h> #define MAXL 1000  //最多数字开头的行数 #define MAXC 100   //每行最多字符 #define MAXD 10000 //数字最大值 char ln[MAXC]; static char s[MAXL*MAXC]; static int o[MAXD]; int n,d,i; FILE *f; int compare(const void *arg1,const void *arg2) {     int d1,d2;     sscanf((char *)arg1,"%d",&d1);     sscanf((char *)arg2,"%d",&d2);     return o[d1]-o[d2]; } int main() {     f=fopen("1.txt","r");     if (NULL==f) {         printf("Can not open file 1.txt!\n");         return 1;     }     n=0;     while (1) {         if (NULL==fgets(ln,MAXC,f)) break;         if (1==sscanf(ln,"%d",&d)) {             strcpy(s+n*MAXC,ln);             if (0==o[d]) {                 o[d]=n+1;             }             n++;             if (n>=MAXL) {                 printf("Too many lines(>%d)!\n",MAXL);                 break;             }         }     }     fclose(f);     qsort(s,n,MAXC,compare);     f=fopen("2.txt","w");     for (i=0;i<n;i++) {         fprintf(f,"%s",s+i*MAXC);     }     fclose(f);     return 0; }

user: user-6
content: C#只要1行： File.WriteAllLines("output.txt", File.ReadAllLines("input.txt").Where(x => Regex.IsMatch(x, @"^\d+")).ToArray());
user-0 提问: 有关数组和指针的问题

回复:
user: user-1
content: 引用 楼主 chenye277 的回复:# include <stdio.h>  int main(){ 	char name[4]; 	printf("Enter your name:"); 	scanf("%s",name); 	printf("YOur name is %s\n",name); //	printf("name's %p",sizeof(name));//这个输出还是4 	for(i=0;name[i]!='\0';i++){ 		printf("%c",name[i]); 	return 0; }  在这个程序中，我一开始已经声明了name的数组大小，为什么这个程序跑起来，输入4个以上的字符它输出还是4个以上的字符。为什么这个4这个大小没有其作用， 两种方式输出都是一样的，如输入asdfghjkl输出也是asdfghjkl, 所以长度没有所用，按照name指针一直输出到\0为止了是么。 但如果用scanf("%4s",name) 或fgets函数就可以了。  注意这个字符数组最好长一点，输入的时候最好比字符数组少一个字符 因为最后一个字符存放\0  char name[50]={0}; 使用数组习惯性的在后面加{0} 初始化数组，使用起来更安全

user: user-2
content: 不对数组检查越界，让你自己来。

user: user-3
content: 越界存储了

user: user-4
content: scanf有风险，调用需谨慎。。。

user: user-5
content: # include <stdio.h>  int main(){ char name[4]; printf("Enter your name:"); scanf("%3s",name); printf("YOur name is %s\n",name); //  printf("name's %p",sizeof(name));//这个输出还是4 for(i=0;name[i]!='\0';i++){ printf("%c",name[i]); return 0; }

user: user-6
content: scanf函数是不安全的 你虽然只定义了4的空间，但scanf不会管这个，你输入多少它读多少 4字符以内保证安全，超出4字符就不确定会发生什么了，可能覆盖掉其它数据，只是很多时候恰好没有出问题而已

user: user-7
content: 你这肯定不会只输出4个字符啊，因为你的循环体是到‘\0’才结束的，虽然你的数组只有4个字符，可是当你输入的字符个数超过4个他还是会放在name内存的第五个以后挨个存放的，输出时就到‘\0’结束，你在输入时加个4就限制了他只能接受四个字符，所以你以后输进去的字符就不会出现在name4个内存之后了，sizeof（name）算的是name空间的大小，你只申请了4个所以是4
user-0 提问: C语言程序设计———学生学籍管理系统

回复:
user: user-1
content: 我记得当年我们自己做系统的时候都是百度  而不是发帖

user: user-2
content: 百度一下，一搜一大把，而且功能都比这个高级得多

user: user-3
content: 有人50就做了，呵呵呵

user: user-4
content: 500不行， 我要600

user: user-5
content: 引用 1 楼 teddy99999 的回复:500块帮你做 支持，等价交换。 你付出时间，他获得学分

user: user-6
content: 这个百度一下好，没人有义务帮你做这个

user: user-6
content: 这个百度一下好，没人有义务帮你做这个

user: user-7
content: http://www.baidu.com/baidu?word=C语言程序设计———学生学籍管理系统&ie=utf-8

user: user-8
content: 这个不难，自己看书学一学，遇到问题了再过来问吧！

user: user-9
content: 500块帮你做
user-0 提问: 面试时一个问题，菜鸟到现在也想不明白，求教牛人、、、

回复:
user: user-1

user: user-2
content: 移位运算可以使用吗？c=a+b+(b>>1);  引用 15 楼 lin5161678 的回复:[quote=引用 10 楼 zxh707wk 的回复:] 这样吗？ c=a+b+(a==b)别乱写 误人子弟[/quote] 他的结果也是正确的啊。就是好像没跟编译原理挂上挂上钩吧。那使用移位运算也是不行的吧？c=a+b+(b>>1); 高手详解~

user: user-3
content: c=c+(a==b ? 1:0)

user: user-4
content: 2+2=5?在算错的情况下等于5。

user: user-5
content: 为什么面试经常出这种非人类的，没有任何意义的问题

user: user-6
content: 引用 5 楼 zyjj_99 的回复:char s[]="5"; char a[]="2"; int b=2; count<<a<<"+"<<b<<"="<<a+b<<endl;  变量a是个指针，当a+b,实际上就是指针地址+2，正好指向了s所指的内存。。。。。 不是很理解zyjj_99 我也特地的去验证了下

user: user-7
content: 引用 15 楼 lin5161678 的回复:[quote=引用 10 楼 zxh707wk 的回复:] 这样吗？ c=a+b+(a==b)别乱写 误人子弟[/quote]题目理解错了。。。

user: user-8
content: 引用 4 楼 brookmill 的回复:前几天有个“2+2=5”的帖子，倒也和编译原理有点关系。 http://bbs.csdn.net/topics/390820427 不过我觉得这个有点......闲的无聊拿来消遣还可以，作为面试题有点胡闹  胡闹的面试题似乎还有 +++, ---之类的

user: user-9
content: char s[]="5"; char a[]="2"; int b=2; count<<a<<"+"<<b<<"="<<a+b<<endl;  变量a是个指针，当a+b,实际上就是指针地址+2，正好指向了s所指的内存。。。。。

user: user-10
content: 完全是用来显摆的面试题,么价值

user: user-0
content: 引用 9 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/390627329   嗯嗯嗯，多谢赵老师，开阔眼界了，受教！！！

user: user-11
content: 2 + 2 = 烫烫烫烫烫5  好恶心。。。。

user: user-12
content: 引用 10 楼 zxh707wk 的回复:这样吗？ c=a+b+(a==b)别乱写 误人子弟

user: user-0
content: 引用 4 楼 brookmill 的回复:前几天有个“2+2=5”的帖子，倒也和编译原理有点关系。 http://bbs.csdn.net/topics/390820427 不过我觉得这个有点......闲的无聊拿来消遣还可以，作为面试题有点胡闹  当时就懵了，想着这2+2得4都写到内存了，怎么让它还能变，就一直百思不得其解，还以为特别高深，也就忘了问他怎么实现了，如果真是这个答案，那我只能说句他真蛋疼，这跟脑筋急转弯有什么区别、、、、、有意思么？？？

user: user-0
content: 引用 1 楼 gy429476195 的回复:只是a+b？不能使用自增吗？ 引用 1 楼 gy429476195 的回复:只是a+b？不能使用自增吗？  不能啊，当时我就懵了、、、他说与语法有关、、、

user: user-13
content: 栈是倒着生长的。

user: user-14
content: 引用 5 楼 zyjj_99 的回复:char s[]="5"; char a[]="2"; int b=2; count<<a<<"+"<<b<<"="<<a+b<<endl;  变量a是个指针，当a+b,实际上就是指针地址+2，正好指向了s所指的内存。。。。。  我刚学电脑有点不明白，为什么调试的时候显示s占高地址而a占低地址，不是应该先生成s s占地址而a占高地址吗？

user: user-15
content: 前几天有个“2+2=5”的帖子，倒也和编译原理有点关系。 http://bbs.csdn.net/topics/390820427 不过我觉得这个有点......闲的无聊拿来消遣还可以，作为面试题有点胡闹

user: user-7
content: 这样吗？ c=a+b+(a==b)

user: user-16
content: http://bbs.csdn.net/topics/390627329