Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 北大ACM1034，为什么运行结果对了，不能通过？

回复:
user: user-0
content: 问题是Hunter Bob often walks with his dog Ralph. Bob walks with a constant speed and his route is a polygonal line (possibly self-intersecting) whose vertices are specified by N pairs of integers (Xi, Yi) ? their Cartesian coordinates.  Ralph walks on his own way but always meets his master at the specified N points. The dog starts his journey simultaneously with Bob at the point (X1, Y1) and finishes it also simultaneously with Bob at the point (XN, YN).  Ralph can travel at a speed that is up to two times greater than his master's speed. While Bob travels in a straight line from one point to another the cheerful dog seeks trees, bushes, hummocks and all other kinds of interesting places of the local landscape which are specified by M pairs of integers (Xj',Yj'). However, after leaving his master at the point (Xi, Yi) (where 1 <= i < N) the dog visits at most one interesting place before meeting his master again at the point (Xi+1, Yi+1).  Your task is to find the dog's route, which meets the above requirements and allows him to visit the maximal possible number of interesting places. The answer should be presented as a polygonal line that represents Ralph's route. The vertices of this route should be all points (Xi, Yi) and the maximal number of interesting places (Xj',Yj'). The latter should be visited (i.e. listed in the route description) at most once.  An example of Bob's route (solid line), a set of interesting places (dots) and one of the best Ralph's routes (dotted line) are presented in the following picture:   Input  The first line of the input contains two integers N and M, separated by a space ( 2 <= N <= 100 ,0 <= M <=100 ). The second line contains N pairs of integers X1, Y1, ..., XN, YN, separated by spaces, that represent Bob's route. The third line contains M pairs of integers X1',Y1',...,XM',YM', separated by spaces, that represent interesting places.  All points in the input file are different and their coordinates are integers not greater than 1000 by the absolute value.  Output  The first line of the output should contain the single integer K ? the number of vertices of the best dog's route. The second line should contain K pairs of coordinates X1'',Y1'' , ...,Xk'',Yk'', separated by spaces, that represent this route. If there are several such routes, then you may write any of them.

user: user-1
content: 注意边界检查。而且它的测试用例很多，不能说你自己例举的一些用例通过没问题就没问题了。 注意代码健壮性

user: user-2
content: 根据观察到的LZ程序中的问题，设计了以下测试用例： 3 2 0 0 2 0 2 2 1 1 1 -1  正确输出是： 5 0 0 1 -1 2 0 1 1 2 2  LZ程序输出是： 4 0 0 1 1 2 0 2 -858993460  其中-858993460是由于 printf("%d %d ",x[n+2],x[n+3]); 中最后一个点的下标错误引起。应改为： printf("%d %d\n",x[(n-1)*2],x[(n-1)*2+1]);  遗漏“1 -1”的问题需要大改。

user: user-3
content: 样例仅仅是测试用例的一部分，后台还有很多未公开的测试用例。因此样例全部通过不能说明完全正确。否则，我针对样例if else输出一通就通过了。  acm讨论区里有许多其他人提供的已经通过的代码，你可以随机构造一些输入，利用他人的正确程序产生一些输出，然后用这些输入输出做测试用例来测试你的程序并找出问题所在。不过最好还是自己找出错误来了

user: user-4
content: 样例对了不代表代码是对的。 不能通过说明你的代码是错误的。

user: user-5
content: 题目要求是什么？！！！！！
user-0 提问: C语言 1-1/2+1/3-1/4+...+1/99-1/100问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:i是整数，两个整数做除法结果还是整数，所以1/i=0 改成做浮点数除法才行。 p=p-1.0/i; p=p+1.0/i;   凹，有理！Thanks!

user: user-1
content: i是整数，两个整数做除法结果还是整数，所以1/i=0 改成做浮点数除法才行。 p=p-1.0/i; p=p+1.0/i;
user-0 提问: 求帮助！！！！！！！

回复:
user: user-1
content: 注意你输入的时候回车符

user: user-2
content: #include<stdio.h> #define M 5 void sort(int h[],int t) { 	int i,j,k=0; 	for(i=0;i<t-1;i++)//i<t改为i<t-1，你那样越界 	{ 		for(j=0;j<t-i-1;j++)//j<t-i改为j<t-i-1 		{ 			if(h[j]>h[j+1]) 			{ 				k=h[j+1]; 				h[j+1]=h[j]; 				h[j]=k; 			}	 		} 	} 	for(i=0;i<t;i++) 		printf("%d\t",h[i]); } int main() {	 	int a[M],b[M],c[M]; 	int i,j,k=0,y=0; 	printf("请输入数组A\n"); 	for(i=0;i<M;i++) 		scanf("%d",&a[i]); 	printf("输出有序表A\n"); 	sort(a,M); 	printf("\n"); 	printf("请输入数组B\n"); 	for(i=0;i<M;i++) 		scanf("%d",&b[i]); 	printf("输出有序表B\n"); 	sort(b,M); 	printf("\n"); 	return 0; }  调用函数的名字也别写错了

user: user-3
content: 嗯，将第32行代码名字改正后没问题啊——

user: user-3
content: 不对，报错提示是什么

user: user-4
content: 楼主是不是程序写的有点问题？ 倒数第四行，sortwe函数是什么？多打了个we吧？
user-0 提问: 字符串复制求解

回复:
user: user-1
content: 凶手就是这句代码 while((*pds=*pss)!='\0')

user: user-2
content: /*** *char *strcpy(dst, src) - copy one string over another * *Purpose: *       Copies the string src into the spot specified by *       dest; assumes enough room. * *Entry: *       char * dst - string over which "src" is to be copied *       const char * src - string to be copied over "dst" * *Exit: *       The address of "dst" * *Exceptions: *******************************************************************************/  char * __cdecl strcpy(char * dst, const char * src) {         char * cp = dst;          while( *cp++ = *src++ )                 ;               /* Copy src over dst */          return( dst ); }  参见源码 strcat.c

user: user-3
content: pss与pds是俩字符串的首地址。 所以*pss就是字符串的第一个元素"C"。 那么pds的第一个元素也等于pss的第一个元素等于“C”。而且他俩的值不为“\0”。 所以运行pss++，pds++； 然后*pss与*pds就指向字符串的下一个元素。同时重复上述循环。 知道*pss=“\n”即字符串结束符，并将这个赋给*pds时，循环结束。 所以字符串pds的值就与pss相同了。

user: user-4
content: 完成复制的是这句： *pds=*pss pds++和pss++只是指针往后走，遍历下一个字符 下面这个实现更简洁： char *strcpy(char *dst, char *src) {       char *temp = dst;       while ((*dst++ = *src++) != '\0') ;       return temp; }

user: user-5
content: 两个变量不断的自加1，指向的字符不断向后移 楼主了解指针吗？
user-0 提问: 【小白问问题】一个关于链表的问题

回复:
user: user-1
content: 引用 1 楼 user-4 的回复:free(current);         current = current->next;  // current被free了之后就不要再用了。 改成这样：         next = current->next;         free(current);         current = next;  应该就是这样的原因了吧

user: user-2
content: 仅供参考 http://pan.baidu.com/s/17yIcQ

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

user: user-4
content: free(current);         current = current->next;  // current被free了之后就不要再用了。 改成这样：         next = current->next;         free(current);         current = next;
user-0 提问: 关于C语言的实际程序设计应用

回复:
user: user-1
content: 如果特别聪明，那么学什么都可以，如果不是天才，那么最好学一门工作中使用的语言，说到底，各种语言还是有差别的，能看懂代码，不表明对工具完全了解，不表明会修改，不表明会debug。

user: user-2
content: 哇哇哇哇哇哇哈

user: user-3
content: 可以试试在linux下编程试试，你会觉得界面其实不是那么重要，界面只是给用户看的，只是程序的冰山一角

user: user-4
content: Win32应用程序可以达到你的要求。 但是做界面这类的用c。mfc太累了也不好看。可以玩QT

user: user-1
content: mfc如果想学也是不错的，公司中用vc的相当多。

user: user-5
content: C语言说到底是一门以内存为中心的编程语言，学C语言到底学些什么—— 「语法」和「函数库」 可以好好看看这个——http://zhuanlan.zhihu.com/linjr/19694823

user: user-6
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=(HFONT)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-7
content: c语言不是用来写窗口程序的。 要写窗口程序，应该是用C#或MFC吧
user-0 提问: face recognition,face verification,face identification

回复:
user: user-1
content: 1:1 静态照片人脸验证 FaceVerification http://qiansou.cn/www/index.php/Web/tuwen_de/tid/81/id/94/iid/27

user: user-1

user: user-2
content: 人脸识别，人脸检查，人脸认证？
user-0 提问: 各位大神求助啊。。。。。。

回复:
user: user-1
content: 宏，只会作简单替换不会安全检查等这些工作。

user: user-2
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-3
content: 两位都说的正确，这是宏的问题啊 http://baike.baidu.com/view/2076445.htm 带参数  除了一般的字符串替换，还要做参数代换 格式： #define宏名（参数表） 字符串 例如：#define S(a,b) a*b area=S(3,2)；第一步被换为area=a*b; ，第二步被换为area=3*2; 类似于函数调用，有一个哑实结合的过程： （1）实参如果是表达式容易出问题 #define S(r) r*r area=S(a+b);第一步换为area=r*r;,第二步被换为area=a+b*a+b; 正确的宏定义是#define S(r) ((r)*(r)) （2）宏名和参数的括号间不能有空格 （3）宏替换只作替换，不做计算，不做表达式求解 （4）函数调用在编译后程序运行时进行，并且分配内存。宏替换在编译前进行，不分配内存 （5）宏的哑实结合不存在类型，也没有类型转换。 （6）宏展开使源程序变长，函数调用不会 （7）宏展开不占运行时间，只占编译时间，函数调用占运行时间（分配内存、保留现场、值传递、返回值）[2]

user: user-4
content: 第一短代码  宏替换后是 5.5*1+2*1+2=9.5 第二段代码  相当于  printf("%d",9.5)  在C标准里边   printf()中格式不匹配   结果是未定义的

user: user-5
content: 第一段是宏定义问题   S（x+y）替换后是PT*x+y*x+y=5.5*1+2*1+2=9.5 第二段是数据类型的问题，%d是输出整型，而S（x+y）的结果不是整型
user-0 提问: 用scanf函数输入数据问题

回复:
user: user-1
content: C1读取缓冲区内的换行符，那c2不是就应该读取R字符呢？但为什么结果是c2也是空白字符呢？

user: user-1
content: %c不忽略空白字符，这个我明白。有点不懂，但有一点不理解： 在程序执行了scanf("%f##%f",&k,&m);这条语句之后 ，缓冲区留下了一个换行符，再执行scanf("%c,%c",&c1,&c2);语句时，读取换行符存入c1变量，那为什么c2读取的不是R字符呢？（我的调试结果c2输出@符号）？在缓冲区发生了什么变化呢？

user: user-2
content: 引用 6 楼 u013824562 的回复:[quote=引用 1 楼 u012421456 的回复:]  前边加一个getchar 那为什么第一个scanf("i=%d**j=%d",&i,&j);后面不需要添加getchar()而第二个需要[/quote] 你第一个scanf，缓冲区内也有一个回车。只不过你第二个scanf一开始读的是 浮点数(忽略开始回车空格等空白字符)，如果此时你读取的不是浮点数或整数，而是字符或字符串，同样出问题。

user: user-0
content: 引用 1 楼 u012421456 的回复: 前边加一个getchar 那为什么第一个scanf("i=%d**j=%d",&i,&j);后面不需要添加getchar()而第二个需要

user: user-3
content: 清除

user: user-3
content: 楼主可以搜——scanf清楚键盘缓冲区

user: user-4
content: #include<stdio.h> void main()  {     int i,j;     float k,m;     char c1,c2;     scanf("i=%d**j=%d",&i,&j);     scanf("%f##%f",&k,&m);     getchar();//接收换行     scanf("%c,%c",&c1,&c2);     printf("i=%d,j=%d,k=%.2f,m=%.1f,c1=%c,c2=%c",i,j,k,m,c1,c2); }

user: user-4
content: #include<stdio.h> void main()  { 	int i,j; 	float k,m; 	char c1,c2; 	scanf("i=%d**j=%d",&i,&j); 	scanf("%f##%f",&k,&m); 	getchar();//结束换行 	scanf("%c,%c",&c1,&c2); 	printf("i=%d,j=%d,k=%.2f,m=%.1f,c1=%c,c2=%c",i,j,k,m,c1,c2); }

user: user-3
content: 前边加一个getchar
user-0 提问: C语言字符数组复制问题，求教、

回复:
user: user-1
content: from[i] != EOF 得出的是逻辑值真或假 返回的是1或0

user: user-2
content: ！=的优先级高于 =

user: user-3
content: while(to[i] = (from[i] != EOF)) 先计算 from[i] != EOF，是逻辑判断 结果是真或者假 在把判断结果赋值给to[i] 因此全是1
user-0 提问: 如何不使用变量完成 atoi() 函数  (C语言)

回复:
user: user-1
content: 楼上的方法我也想过，但是这么做意义不大，因为strlen已经是O(N)复杂度，这样子递归变成O(^2)复杂度了，还不如用一个简单的循环来完成

user: user-2
content: 按楼主的思路稍微改动一下，好像可以实现，而且也没用变量，可我怎么觉得像作弊呢？ int my_atoi(const char *str) { if(*str) return  (*str-'0') * pow(10, strlen(str) - 1) + my_atoi(str+1); else return 0; }

user: user-3
content: 使用sscanf就可以  #include <stdio.h>  void main( void ) {    char  tokenstring[] = "15 12 14...";    char  s[81];    char  c;    int   i;    float fp;     /* Input various data from tokenstring: */    sscanf( tokenstring, "%s", s );    sscanf( tokenstring, "%c", &c );    sscanf( tokenstring, "%d", &i );    sscanf( tokenstring, "%f", &fp );     /* Output the data read */    printf( "String    = %s\n", s );    printf( "Character = %c\n", c );    printf( "Integer:  = %d\n", i );    printf( "Real:     = %f\n", fp ); }  Output  String    = 15 Character = 1 Integer:  = 15 Real:     = 15.000000

user: user-4
content: 不会写，写了几下，没想明白，不写了。   //high_syntax_c_hwnd ( 008E0640 , 00 )  //#include "stdafx.h" #include "stdio.h"  int my_atoi( int basevalue, const char *str) {  //...不使用变量  if(*str)  return my_atoi( ( basevalue + (*str-'0') ) *10, str+1);  else  return basevalue / 10; }   int main() {  char str1[256] = "123";  char str2[256] = "456";   int n_add1, n_add2;   n_add1 = my_atoi(0,str1);  n_add2 = my_atoi(0,str2);   printf("%d + %d = %d\n", n_add1, n_add2, n_add1 + n_add2);    return 0; }  //-----Final result ---  //

user: user-1
content: 貌似不行的，递归只能从左到右，而且越后面权重越大
user-0 提问: 来自高校俱乐部的挑战

回复:
user: user-1
content: 初始化的过程： #define MAX_N 1000000 int counts[MAX_N]; int total = 0; void init() {   int i;   for (i = 0; i < MAX_N; i++) {     if (isHuiWen(i)) {       total++;     }     counts[i] = total;   } }

user: user-1
content: 引用 1 楼 brookmill 的回复:数据范围这么小，初始化的时候一次性处理，打个表就行了。 数组counts[1000000]，把counts[i]初始化为[0,i]之间的个数，可以做到O(1)的查询，直接counts[b]-counts[a]就行了。 有点小问题，counts[b]-counts[a]的结果是(a,b]的结果，需要单独再判断a是不是，如果是就把结果加1，不过还是O(1)

user: user-1
content: 数据范围这么小，初始化的时候一次性处理，打个表就行了。 数组counts[1000000]，把counts[i]初始化为[0,i]之间的个数，可以做到O(1)的查询，直接counts[b]-counts[a]就行了。

user: user-0
content: 引用 3 楼 brookmill 的回复:初始化的过程： #define MAX_N 1000000 int counts[MAX_N]; int total = 0; void init() {   int i;   for (i = 0; i < MAX_N; i++) {     if (isHuiWen(i)) {       total++;     }     counts[i] = total;   } }  小弟没学数组，不懂这些代码什么意思

user: user-2
content: 引用 2 楼 brookmill 的回复:[quote=引用 1 楼 brookmill 的回复:] 数据范围这么小，初始化的时候一次性处理，打个表就行了。 数组counts[1000000]，把counts[i]初始化为[0,i]之间的个数，可以做到O(1)的查询，直接counts[b]-counts[a]就行了。 有点小问题，counts[b]-counts[a]的结果是(a,b]的结果，需要单独再判断a是不是，如果是就把结果加1，不过还是O(1)[/quote] 那为啥不直接做counts[b]-counts[a-1]。。。

user: user-3
content: 引用 1 楼 brookmill 的回复:数据范围这么小，初始化的时候一次性处理，打个表就行了。 数组counts[1000000]，把counts[i]初始化为[0,i]之间的个数，可以做到O(1)的查询，直接counts[b]-counts[a]就行了。长知识了，原来只会一边算一边计数

user: user-4
content: 引用 5 楼 kamenriderdrive 的回复:小弟没学数组，不懂这些代码什么意思 那楼主想干什么啊
user-0 提问: 打印最长的文本行程序

回复:
user: user-1
content: 引用 1 楼 u012061345 的回复:printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中  这句话不在循环中，所以不会打印你输入的每一个line。 但是会输出最后一个line。你考虑一下最后一个line是什么，为什么跟不打印的效果一样？ 想不出来就单步调试一下。

user: user-0
content: printf("%s",longest); 这句也不在循环中 为啥打印了额？

user: user-0
content: 引用 2 楼 zxhuser-2 的回复:[quote=引用 1 楼 u012061345 的回复:] printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中+1[/quote]  引用 1 楼 u012061345 的回复:printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中 printf("%s",longest);那这句也不在循环中为啥打印输出了呢？  引用 2 楼 zxhuser-2 的回复:[quote=引用 1 楼 u012061345 的回复:] printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中+1[/quote]  引用 2 楼 zxhuser-2 的回复:[quote=引用 1 楼 u012061345 的回复:] printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中+1[/quote]  引用 2 楼 zxhuser-2 的回复:[quote=引用 1 楼 u012061345 的回复:] printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中+1[/quote]

user: user-0
content: 引用 6 楼 u012061345 的回复:[quote=引用 1 楼 u012061345 的回复:] printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中  这句话不在循环中，所以不会打印你输入的每一个line。 但是会输出最后一个line。你考虑一下最后一个line是什么，为什么跟不打印的效果一样？ 想不出来就单步调试一下。[/quote] 我想了下所因为函数所值传递，所以line的值并未改变，所以最后一个line是空字符串。但是最后的longest为啥值改变了？

user: user-2
content: 引用 1 楼 u012061345 的回复:printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中+1

user: user-1
content: printf("%s",line);   //为什么这句不能打印输出line  因为这句话不在循环中
user-0 提问: 字符串替换的问题，求大神指导

回复:
user: user-1
content: 引用 1 楼 user-2 的回复:for(p1=p,p2=p+len-1;p1<p2;p1++,p2--)正解。

user: user-2
content: for(p1=p,p2=p+len-1;p1<p2;p1++,p2--)
user-0 提问: 为什么当输入0时程序执行不正常

回复:
user: user-0
content: 当是0时无法执行

user: user-1
content: 你不讲讲是什么不正常吗？

user: user-0
content: vc++编译器

user: user-2
content: 楼主程序能执行？楼主什么编译器啊
user-0 提问: 做回文数用循环，哪里有错

回复:
user: user-1
content: 上面打错了。应该是： 各个变量都是全局变量，都被系统清零。因此a=b=c=e=q=0 既然q=0，那么只有第一个if是真的，因此输出“0”。

user: user-1
content: 各个变量都是全局变量，都被系统清零。因此a=b=c=e=q=0 既然q=0，那么所有的if都为假，因此不会输出任何东西。

user: user-2
content: 这部分代码编译都过不去吧， 1<=a && a<=9;    1<=b && b<=9;    1<=c && c<=9;    1<=e && e<=9; 这部分是伪代码？建议你通过自己首先把编译出错的问题去掉，然后通过打印的方法找到逻辑错误。这样进步更快吧~~~

user: user-3
content: #include <stdlib.h> #include <stdio.h> #include <string.h> void main() { 	int i,j,num; 	char str[20],str1[20]; 	printf("请输入数字的范围\n");//找出两个数字之间的所有回文数字 	scanf("%d %d",&j,&num); 	for (i=j;i<=num;i++) 	{ 		itoa(i,str,10);//转换成字符串 		itoa(i,str1,10); 		strrev(str1);//翻转字符串 		if (strcmp(str1,str)==0)// 		printf("%d\n",i); 	} }

user: user-3
content: #include <stdlib.h> #include <stdio.h> #include <string.h> void main() { 	int i,j,num; 	char str[20],str1[20]; 	printf("请输入数字的范围\n"); 	scanf("%d %d",&j,&num); 	for (i=j;i<=num;i++) 	{ 		itoa(i,str,10); 		itoa(i,str1,10); 		strrev(str1); 		if (strcmp(str1,str)==0) 		printf("%d\n",i); 	} }

user: user-4
content: 附上代码供参考：  #include <stdio.h>  /** 该函数 判断是否是回文数。返回值 0 表示 否， 1 表示是回文数 */ int isPalindrome(int value) {     int sum = 0;     int i = 0;     int tmp = value;      while (0 != tmp)     {         sum = sum*10 + tmp%10;         tmp = tmp/10;     }      if (sum == value)     {         return 1;     }          return 0; }  int main(int argc, char* argv[]) {     int iRet = 0;  //用于存放函数返回值     int input_value = 0;  //存放用户输入的值     scanf("%d", &input_value);      iRet = isPalindrome(input_value);  //判断是否是回文数     if (1 == iRet)     {         printf("%d is a palindrome \n", input_value);     }     else     {         printf("%d is NOT a palindrome \n", input_value);     }      return 0; }

user: user-4
content: 1<=a && a<=9;     1<=b && b<=9;     1<=c && c<=9;     1<=e && e<=9;     a==e,b==c  这些语句什么意思？？？  反正在代码里没起到任何作用。

user: user-4
content: printf("%d",q,q=a*10+b,a==b);  只打印一个整数， 输入了这么多参数。。。
user-0 提问: 我写的这个冒泡算法怎么可以编译成功但运行的时候没有最后的输出值

回复:
user: user-1
content: if后面没加｛｝。

user: user-2
content: jf

user: user-3
content: #include <stdio.h> #include <stdlib.h> int main() { 	int i,j,k,l,temp; 	int a[10]; 	printf("input number:\n"); 	for(k=0;k<10;k++) 		scanf("%d",&a[k]); 	for (i=0;i<=8;i++) 	{ 		for (j=0;j<9-i;j++) 		{ 			if (a[j]>a[j+1])///加括号 			{ 				temp=a[j+1]; 				a[j+1]=a[j]; 				a[j]=temp; 			} 		} 	} 	for (l=0;l<10;l++) 	{ 		printf("%3d",a[l]); 	} 	system("pause");////加上一个暂停，防止程序一闪而过 }

user: user-4
content: 跟你的返回值return 0，有关，程序是对的，只是你显示的时候就是闪了一下就不见了，你在rerurn  0的上面加固定函数就可以了

user: user-5
content: 引用 2 楼 greatkafka 的回复:[quote=引用 1 楼 u012421456 的回复:] 上图？别人怎么帮调试？ 第十行 不好意思啊 第一次发帖[/quote] 第一次发帖，不知道代码格式，这个没什么，但是点出这个问题了，楼主为何不代码格式重发一下代码？ 楼主莫非问题解决了？ 其实这个并不算难，网上应该也很好找到 楼主可以找一个能用的，然后对比自己的为什么不能用，找不到原因可以再来问

user: user-6
content: 看着代码挺别扭，括号if{}没有

user: user-7
content: 引用 2 楼 greatkafka 的回复:[quote=引用 1 楼 u012421456 的回复:] 上图？别人怎么帮调试？ 第十行 不好意思啊 第一次发帖[/quote]没学会走就学会跑了？lz看你骨骼惊奇，必是个练武奇才。。。

user: user-0
content: 引用 1 楼 u012421456 的回复:上图？别人怎么帮调试？ 第十行 不好意思啊 第一次发帖

user: user-5
content: 上图？别人怎么帮调试？ 第十行
user-0 提问: 关于scanf("%d",&num)的问题，有什么好的解决方案？

回复:
user: user-1
content: 对 用字符串统一读 然后处理成数字 字符等其他

user: user-2
content: 用gets读取整个一行，然后自己处理字符串。

user: user-3
content: 可以用scanf的返回值。 要想完善处理，用1楼的方法。
user-0 提问: 请问下列两个宏的区别

回复:
user: user-1
content: 引用 1 楼 Saleayas 的回复:因为 & 运算对机器来说比较简单啊。 引用 2 楼 u011779875 的回复:计算机中只有加法 减一个数即加上他的反码 通过减来使现除法  而加法实现根据基本的与 或 非 逻辑运算 实现 所有 &运算快于/ 第一个宏是把&的结果/8 第二个是直接/8 是这2个的区别

user: user-2
content: 问题变成 一条add指令 和俩条and指令的比较

user: user-2
content: 看俩段汇编代码 	key = ((((len) + 8 - 1)&(~(8-1)))/8); 000E1A4C  mov         eax,dword ptr [len]   000E1A4F  add         eax,7   000E1A52  and         eax,0FFFFFFF8h   000E1A55  cdq   000E1A56  and         edx,7   000E1A59  add         eax,edx   000E1A5B  sar         eax,3   000E1A5E  mov         dword ptr [key],eax      	key=((((len) + 8 - 1))/8); 008C1A4C  mov         eax,dword ptr [len]   008C1A4F  add         eax,7   008C1A52  cdq   008C1A53  and         edx,7   008C1A56  add         eax,edx   008C1A58  sar         eax,3   008C1A5B  mov         dword ptr [key],eax

user: user-2
content: 计算机中只有加法 减一个数即加上他的反码 通过减来使现除法  而加法实现根据基本的与 或 非 逻辑运算 实现 所有 &运算快于/

user: user-3
content: 因为 & 运算对机器来说比较简单啊。

user: user-2
content: 看错了 效率是第二条 比第一条快  少了条000E1A52  and         eax,0FFFFFFF8h   可能如楼上所说 是为了留着以后的扩展问题吧

user: user-4
content: 负数两个就有区别了。这就是为什么asm里有cdq指令 不过这个宏本身该不该用在负数上那是另一回事

user: user-5
content: #include <stdio.h> #define nbytes1(len) ((((len) + 8 - 1)&(~(8-1)))/8) #define nbytes2(len) ((((len) + 8 - 1))/8) int main() {     int L;      for (L=-17;L<=17;L++) {         printf("%4d %3d %3d\n",L,nbytes1(L),nbytes2(L));     }     return 0; } // -17  -2  -1 // -16  -2  -1 // -15  -1  -1 // -14  -1   0 // -13  -1   0 // -12  -1   0 // -11  -1   0 // -10  -1   0 //  -9  -1   0 //  -8  -1   0 //  -7   0   0 //  -6   0   0 //  -5   0   0 //  -4   0   0 //  -3   0   0 //  -2   0   0 //  -1   0   0 //   0   0   0 //   1   1   1 //   2   1   1 //   3   1   1 //   4   1   1 //   5   1   1 //   6   1   1 //   7   1   1 //   8   1   1 //   9   2   2 //  10   2   2 //  11   2   2 //  12   2   2 //  13   2   2 //  14   2   2 //  15   2   2 //  16   2   2 //  17   3   3 //

user: user-6
content: 貌似结果没有区别呀！
user-0 提问: 字符串匹配问题

回复:
user: user-0
content: 嗯好的，我去试试看

user: user-1
content: 还是回车的问题，改的不彻底呀。把getchar()从循环里拿出来，不用每次都做，但是要紧跟着scanf后面做一次。 scanf("%d",&n); getchar(); for(t=0;t<n;t++) { gets(a[t]); } 我觉得没有其它问题了。如果结果还是不对，自己调试一下，看看读入的结果对不对： scanf("%d",&n); getchar(); for(t=0;t<n;t++) { gets(a[t]); printf("%s\n", a[t]); // 加上这一行看看，确认读取正确。 }

user: user-0
content: 现在在用手机没法以代码框形式展现出来啦。 每次输入字符不会超过上限。例如 输入 3 aaa bbb aaa 输出本应当是1，运行结果却为0 修改了你上面提到的那两点。即 #include<stdio.h>  #include<string.h>  main()  {  int n,t,k,j,s=0;  char a[100][8];  	scanf("%d",&n);  	for(t=0;t<n;t++)  	{  	gets(a[t]);          getchar();  	}  	for(k=0;k<n;k++)  	{  		for(j=k+1;j<n;j++)  		{if(strcmp(a[k],a[j])==0) s++;}  	}  printf("%d\n",s);  }

user: user-1
content: 引用 3 楼 xxt_99 的回复:我太笨啦。发这个贴之前我已经修改了这两处错误，但还是运行结果错误我才来询问的，不小心复制了错误代码过来～那请问更改了这两点以后还有什么错误呀？新手真的看不出来了π_π 1. 修改之后的代码麻烦你贴出来 2. 运行结果什么错误 3. 这个代码只能处理最长为7的字符串，你的输入没有更长的吧，输入了什么？

user: user-0
content: 我太笨啦。发这个贴之前我已经修改了这两处错误，但还是运行结果错误我才来询问的，不小心复制了错误代码过来～那请问更改了这两点以后还有什么错误呀？新手真的看不出来了π_π

user: user-0
content: 引用 6 楼 brookmill 的回复:还是回车的问题，改的不彻底呀。把getchar()从循环里拿出来，不用每次都做，但是要紧跟着scanf后面做一次。 scanf("%d",&n); getchar(); for(t=0;t<n;t++) { gets(a[t]); } 我觉得没有其它问题了。如果结果还是不对，自己调试一下，看看读入的结果对不对： scanf("%d",&n); getchar(); for(t=0;t<n;t++) { gets(a[t]); printf("%s\n", a[t]); // 加上这一行看看，确认读取正确。 } 改成这样就对了~谢谢大家。想知道为什么不用每一次循环都做一次getchar();，是因为gets()；不会把回车读进去么？

user: user-2
content: 引用 1 楼 brookmill 的回复:{if(strcmp(a[k],a[j]==0)) s++; 括号错了 {if(strcmp(a[k],a[j])==0) s++; +++ 输入的字符个数不要超过6个，记着还有一个字符'\n'也会进入字符串里，因为你用的是gets（）；函数。

user: user-1
content: 还有一个问题，第一次运行gets的时候，可能会把输入n的时候敲的回车读进去。如果你发现运行的时候少读了一行，那就是这个原因了，用getchar()之类的把那个回车先读出来就好了

user: user-1
content: {if(strcmp(a[k],a[j]==0)) s++; 括号错了 {if(strcmp(a[k],a[j])==0) s++;
user-0 提问: c 语音用什么编译器好，求推荐

回复:
user: user-1
content: 写代码尽量避免不通用的问题。

user: user-2
content: 可以看看——http://www.csdn.net/article/2014-02-27/2818564-best-compilers-and-ides-for-c-programmers

user: user-2
content: dev c++，codeblocks，c-free

user: user-3
content: 初学者用VS

user: user-4
content: const int SIZE=6; char board[SIZE][SIZE]={0};  这条语句在C语言中有语法错误， 在C++中这样的语法是正确的。  编译器的话，linux系统下用GCC， windows装个VS, VC就行了啊。

user: user-5
content: 不一定支持语法糖种类越多的编译器就越好用。

user: user-6
content: 初学推荐：windows下devc++，linux下用gcc,g++ 编译不过的时候多思考原理，多实践，学的才是你的，代码质量会越来越好
user-0 提问: 求大神看看下面代码（语法没有错但是运行的时候会崩溃）

回复:
user: user-1
content: man下 strcmp吧！  不要轻视任何一些警告

user: user-2
content: strcpy(temp,aga[i]);  printf("%s",temp[i]);  这二句，都是以'\n'结束的。你的aga和temp都没有初始化为0，所以有可能访问数组越界

user: user-3
content: 我的事dev c++

user: user-3
content: #include <stdio.h> #include <string.h>  int main() { 	char aga[80],temp[80]; 	int i, j = 0; 	gets(aga); 	for(i=0;i<=50;++i) 	{ 		 //		if(strcmp(aga[i], "a") != 0) 		if (aga[i] != 'a') 		{ //			strcpy(temp, aga[i]); 			temp[j] = aga[i]; 			j++; 		} 	} //	for(i=0;i<=50;++i) //		printf("%s", temp[i]); 	printf("%s\n", temp); 	 	return 0; } 字符串操作函数不能这么用 参考一下——http://blog.csdn.net/u012421456/article/details/38645335#t5 楼主什么编译器，我的直接报错了

user: user-4
content: 还说语法没错，下面这句编译器不警告吗？ strcmp(aga[i],'a')

user: user-3
content: VC6比较老了，可以找一个比较新的编译器
user-0 提问: 又来了，一个小程序，运行出现了问题

回复:
user: user-0
content: 引用 3 楼 zy1404 的回复:scanf() 引号中是格式控制符号 不能有回车换行抱歉，我太大意了，你那篇博客我也收藏了，会认真看的，谢谢！

user: user-1
content: 输入两个数，中间最好加个空格，不然在某些情况下可能出现莫名的问题

user: user-1
content: scanf中不要随便加非输入控制符，尤其是\n——http://blog.csdn.net/u012421456/article/details/18501309

user: user-2
content: scanf() 引号中是格式控制符号 不能有回车换行

user: user-2
content: scanf() 引号中是格式控制符号

user: user-2
content: #include<stdio.h> int main(void) {   int i,min,max; //min，max代表下限和上限                                          while(2==(scanf("%d %d",&min,&max)))/////                                          {       printf("%5s %5s %5s\n","num","square","cube");       for(i=min;i<=max;i++)         {           printf("%4d %4d %4d\n",i,i*i,i*i*i);         }       scanf("%d %d",&min,&max);//////////                                            }   return(0); }
user-0 提问: 请教简单的字符串处理函数

回复:
user: user-1
content: void main() { 	char * str="abc1234def23ghi"; 	char dst[20] = {}; 	char ch[10] = {}; 	int j = 0; 	int k = 0; 	for(int i = 0; i < strlen(str); i++) 	{ 		if(str[i] >= 'a' && str[i] <= 'z' || str[i] >= 'A' && str[i] <= 'Z' ) 		{ 			dst[j] = str[i]; 			j++; 		} 		else 		{ 			ch[k] = str[i]; 			k++; 		} 	} 	strcat(dst,ch); 	printf("%s", dst); }

user: user-2
content: 虽然楼主是搞VB的，但是这样的思维应该有吧，这个题楼主难道真的想不出来？ 还是楼主想做一个什么实验？

user: user-3
content: 一楼的方法很好，相比2楼的方法就不那么快了

user: user-4
content: 遍历两遍，第一遍只复制字母，第二遍只复制数字。

user: user-5
content: 1先把字母提出来，放来a串 2再把数字提出业，放到b串 3将b串加到a串的末尾  这个a串就是你要求的。
user-0 提问: 请问为什么我这个追加空格的小算法输出有乱码?

回复:
user: user-0
content: 引用 2 楼 hqbobo 的回复:memset (n,0,2 * len + 1);  最后一位不是0 可能出问题  对了...谢了...两位大侠...

user: user-1
content: memset (n,0,2 * len + 1);  最后一位不是0 可能出问题

user: user-2
content: return f;前加上（不是在for循环里）*n = '\0';
user-0 提问: 简单的代码，为什么这样赋值不行？

回复:
user: user-1
content: 指针*dest赋值后已经在*str内存的后面了 可以定义另外一个指针*p 在while前 p=des; 在while后des=p;        p=dest;         while(*str)         {                 *res++=*str++;         }         dest=p;

user: user-2
content: dst=(char *)malloc(30);这句分配空间，就把指针dst指向最后啦

user: user-3
content: 我是看大神指教的~

user: user-4
content: 1楼是对的

user: user-5
content: 引用 7 楼 zy1404 的回复:#include <stdlib.h> #include <stdio.h> int main(void) {   char * str="abcdef";   char * dst,*p;   dst=(char *)malloc(30);   p=dst;   while(*str)     {       *p++=*str++;     }   printf("%s",dst);   free(dst);    return 0; }  ++ lz咋会犯这种错误...

user: user-6
content: #include <stdlib.h> #include <stdio.h> int main(void) {   char * str="abcdef";   char * dst,*p;   dst=(char *)malloc(30);   p=dst;   while(*str)     {       *p++=*str++;     }   printf("%s",dst);   free(dst);    return 0; }

user: user-6
content: int main(void) { char * str="abcdef"; char * dst,*p; dst=(char *)malloc(30); p=dst; while(*p) {  *p++=*str++; } printf("%s",dst); return 0; }

user: user-7
content: 头指针一般不直接操作  定义一个临时的指过去 再操作临时的

user: user-0
content: 怎么让指针回到首地址？而不是通过dst-6的方式

user: user-0
content: 哪一句表示dst已经指向了尾部？

user: user-8
content: 你试试printf("%s",dst-6);  1楼说的很清楚。另外记得free()。

user: user-9
content: 赋值没问题，问题是你的dst 现在已经指向了字符串的屁股。头指针你没保护起来
user-0 提问: 在运行时如何获取函数的大小

回复:
user: user-0
content: 谢谢大家的回复，也许环境不一样，我是在嵌入式的板子上运行，定义两个函数的方式并不可行，在链接重定位的时候函数地址不能保证是连续的。目前用嵌入式汇编的方法解决，即保存开始于结束的PC指针，运算得出CODE的大小。

user: user-1
content: 这样应该也可以吧

user: user-2
content: #include <Windows.h> #include <tchar.h>  #pragma comment(lib, "user32.lib")  #pragma comment(linker, "/SECTION:.text,ERW")  int lnth1; TCHAR szDlgTitle[] = _T("SMC example"); TCHAR Phony[]      = _T("This is lst call of proc."); TCHAR Replc[]      = _T("This is 2nd call of proc."); TCHAR ttl1[]       = _T("Original Code"); TCHAR ttl2[]       = _T("ReplaceMent Code");  void CalledProc(void); //void EndCalledProc(void); void RepalceMentProc(void); void EndRepalceMentProc(void);  int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) {    int lnth1 = (TCHAR *)EndRepalceMentProc - (TCHAR *)RepalceMentProc;    CalledProc();    memcpy((TCHAR *)CalledProc, (TCHAR *)RepalceMentProc, lnth1);        CalledProc();    return 0; }  void CalledProc(void) {    MessageBox(NULL, Phony, ttl1, MB_OK);   }  //void EndCalledProc(void) //{ //}  void RepalceMentProc(void) {    MessageBox(NULL, Replc, ttl2, MB_OK | MB_ICONEXCLAMATION);  }  void EndRepalceMentProc(void) { }  /* 分析: 本例中,我们先执行了CalledProc函数,显示出一个MESSAGEBOX.然后,我们用RepalceMentProc函数的内容, 在运行过程中修改CalledProc函数,在C语言中,函数名代表函数的首地址,为了计算函数体的长度,我们在 函数后面定义了一个空函数,通过下面这样的公式,来大致的计算函数体的长度.主要原因是函数之间还有 空隙.lnth1 = (TCHAR *)EndRepalceMentProc - (TCHAR *)RepalceMentProc; 由于代码段属性是可写的,因此,我们在这里通过下面的代码 memcpy((TCHAR *)CalledProc, (TCHAR *)RepalceMentProc, lnth1); 使用RepalceMentProc函数体中的机器码替换了CalledProc函数中原有的机器码. 这样再次调用CalledProc的时候,实际就执行的是RepalceMentProc函数的代码了. */

user: user-3
content: 下一个函数的起始地址减去本函数的起始地址，大致就是本函数的大小（可能略大于实际大小，因为编译器可能对齐函数起始地址）。

user: user-4
content: 引用 楼主 spbb202 的回复:请问如何在运行时获取一个函数的大小，即这个函数的代码占了多少空间？ 例如有一个函数A，在函数B中通过 int func_start_addr = (int)A; 可以得到A的起始地址，如何获取A的结束地址或者A代码的size 一个函数的大小是指什么 ?如果是代码段表示这个函数的大小，可以直接读取代码段反汇编分析 。不过这个应用场景是啥呢？

user: user-5
content: 我只举个例子  void func(int a) { if(a==1)return; else if(a==2) return; return; }  这个函数有三个结束点，你觉得那一个点才是这个函数的结束地址？

user: user-6
content: 引用 楼主 spbb202 的回复:请问如何在运行时获取一个函数的大小，即这个函数的代码占了多少空间？ 例如有一个函数A，在函数B中通过 int func_start_addr = (int)A; 可以得到A的起始地址，如何获取A的结束地址或者A代码的size 好高深   有高手来说说 真的可以吗？
user-0 提问: 钩子消息处理函数的参数值HC_ACTION在哪个头文件中定义的？

回复:
user: user-0
content: 找到了，在WINUSER.H之中。

user: user-0
content: 引用 1 楼 user-1 的回复:一般都在windef.h中 windef.h中没有

user: user-1
content: 一般都在windef.h中
user-0 提问: c语言多个文件使用全局变量问题

回复:
user: user-1
content: 变量和数组声明的extern 最好不要省略 函数的原型声明，以及函数定义的 extern  ....如果 不是  extern "C",,extern "C++" 那么完全可以省略。

user: user-2
content: 没试过，但最好别这么做。。。

user: user-3
content: 引用 3 楼 Saleayas 的回复:在link 的时候，由于 .h 里面定义的是弱符号，而在 .c 里面定义的是强名字。 此时他们可以合并的。  是这样吗？难道不是应该每include一次头文件，就产生一组新的变量？

user: user-4
content: 在link 的时候，由于 .h 里面定义的是弱符号，而在 .c 里面定义的是强名字。 此时他们可以合并的。

user: user-5
content: 如果把extern去掉，那么每个包含global.h的源文件里面都有一份定义，他们彼此是不相干的。按理在链接的时候是会冲突的

user: user-6
content: 我也发现了，看起来应该是为了确保可以实现， 按我理解，如果去掉，应该是有可能出错，只是代码太简单正好没出错而已……
user-0 提问: 又是一个很难的题目（表示看不懂题目）

回复:
user: user-1
content: 围观。。。。

user: user-2
content: 建议，令 X< Y ,扫描 X~ X*Y 之间的数据，找到最小的那个数 个人人文 对于所有 > C=X*Y 数据，或者有类似结构的数据 一定可以表示为    aX+bY 不知道有没有道理

user: user-2
content: 这个连续指的是，从最小值 （6）以后，所有正整数，都可以用 aX+bY表示，其中 a>=0,b>=0, X>0,Y>0

user: user-2
content: 我想，这题完整的题目，大概是这样的 。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。 前面照抄，直到输入 X,Y 如果不互素，输出错误信息 ，X,Y必须互素，如果 不是正整数输出错误信息。X ,或者Y不是正整数 如果X,Y是互素的正整数，输出可表示的连续序列的最小值。  PS：  这个必须有一定数学知识，证明，你的方法确实找到了这个最小值，否则无从下手。

user: user-3
content: 这是数论里的裴蜀定理

user: user-4
content: 引用 1 楼 user-5 的回复:当X，Y互素时，aX+bY可以表示任意整数，例如输入X=3，Y=4， 1)a=0,b=0 aX+bY=0 2)a=-1,b=1 aX+bY=1 3)a=-2,b=2 aX+bY=2 4)a=1,b=0 aX+bY=3 ... 既然能表示任意整数，那这道题的意思是什么我也不知道。 看他举的例子，貌似a,b必须>0 ?  即使看懂了，感觉算法也不会啊 这是数学题目吧。

user: user-5
content: 当X，Y互素时，aX+bY可以表示任意整数，例如输入X=3，Y=4， 1)a=0,b=0 aX+bY=0 2)a=-1,b=1 aX+bY=1 3)a=-2,b=2 aX+bY=2 4)a=1,b=0 aX+bY=3 ... 既然能表示任意整数，那这道题的意思是什么我也不知道。
user-0 提问: 菜鸟求解

回复:
user: user-1
content: 引用 1 楼 u010868023 的回复:传入的是一个指针    所以是四字节 strlen判断即可+1

user: user-2
content: a是一个指针，大小就是4字节，楼主是想要用这种方式判断数组大小，可惜的是C中间输出数组大小的功能

user: user-3
content: 32位操作系统：指针占4个字节 64位操作系统：指针占8个字节  数组作参数会退化成指针，如果想要知道数组的长度，传一个数组的长度参数到函数即可 修改如下：  int main(void) {      char buffer[32]={0};      fun(buffer,32);      return 0; }  void fun(char * a, unsigned int len) {      int b =sizeof(a); }

user: user-4
content: 引用 13 楼 zhao4zhong1 的回复:编译期，运行期。 直击要害，正解啊

user: user-5
content: 引用 18 楼 yuefy520 的回复:还问一下高手们，fun函数参数赋值，如何防止赋值越界.没办法判断大小，就没办法知道这个函数参数大小。 和赵老师讲的一样, 你再加一个参数用来表示数组的大小

user: user-5
content: 你传递的那个是指针, 指针的长度是和操作系统攸关, 所以字节是4

user: user-6
content: 数组名当参数传递时会退化为指针

user: user-7
content: [quote=引用 4 楼 yuefy520 的回复:] 但有一点不明白，不知道为什么sizeof(buffer)  又是32字节了？[/quote  a 是一个指针，a里面放的是buffer的首地址相当于a = &buffer[0] 而 buffer是一个数组

user: user-8
content: void foo(char * buffer, int len)

user: user-9
content: int main(void) {      char buffer[32]={0};      fun(buffer,32);      return 0; }   void fun(char * a,int len) {      int b =len; }

user: user-0
content: 还问一下高手们，fun函数参数赋值，如何防止赋值越界.没办法判断大小，就没办法知道这个函数参数大小。

user: user-10
content: 我觉得五楼说的比较对

user: user-11
content: a是指针， 所以是4

user: user-9
content: 编译期，运行期。

user: user-12
content: 数组名当参数传递时会退化为指针

user: user-12
content: 你这个是求得的指针的大小不是结构体的大小

user: user-4
content: 楼上都没哟说到重点,重点是sizeof是一个运算符，不是一个函数，他是在预处理的时候就求得结果的，所以并没有调用函数，也不知道你传进来的数组有多长，甚至你传经来的可能不是数组，是一个字符的地址呢。所以sizeof(a)是指针的大小，不是数组的大小，那为什么用strlen可以得到字符串数组的大小呢，因为，strlen是一个函数，这个运行是绑定了参数，就知道你串进来的是一个字符串。

user: user-13
content: 指针的字节数 与typeof(buffer)得到的数值 不是一个东西啊 在调用 fun(buffer); 的时候 是buffers数组的首地址传给了  void fun(char * a)  中的形参a

user: user-14
content: 引用 2 楼 CKRGD 的回复:所有指针规定是4个字节 并不是所有指针都是4个字节  楼主还是没搞懂指针，传进的a是个指针，一般都是占四个字节 而在数组定义处，数组名是代表了整个的数组

user: user-15
content: buffer是一个数组，并且初始化了，在内存中分配了空间，sizeof(buffer)就是整个数组的长度了咯，不知道这样理解行不行？
user-0 提问: 新手，书上的一点问题

回复:
user: user-0
content: 明白了。。。。。

user: user-1
content: 加油加油加油加油

user: user-0
content: 引用 5 楼 xpdavis 的回复:引用 4 楼 filia2014 的回复:[quote=引用 1 楼 xpdavis 的回复:] 楼主跟踪一下所有的循环，就知道整个过程是怎么进行的，内外层总共也才15次循环楼主就是跟踪了才有此疑问。。。。。 楼主需要仔细观察，认真思考，谨慎分析，一般不会有什么问题了[/quote]  问一下，if语句if（array[j]<array[k]）k=j;是不是只有条件达成才会进入到下一句k=j对吧，执行的也就只有一句k=j对吧，下面的t=什么的那些替换语句是每一次for循环都会做的对吧？书上说 如果if语句要做多个命令是不是要加上“{}”花括号才行？

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

user: user-3
content: 引用 4 楼 filia2014 的回复:引用 1 楼 xpdavis 的回复:楼主跟踪一下所有的循环，就知道整个过程是怎么进行的，内外层总共也才15次循环楼主就是跟踪了才有此疑问。。。。。 楼主需要仔细观察，认真思考，谨慎分析，一般不会有什么问题了

user: user-0
content: 引用 1 楼 xpdavis 的回复:楼主跟踪一下所有的循环，就知道整个过程是怎么进行的，内外层总共也才15次循环楼主就是跟踪了才有此疑问。。。。。

user: user-4
content: void sort(int array[],int n) {int i,j,k,t; for(i=0;i<n-1;i++)   //循环n-1次，每次找出剩余数字中最小的 {k=i; for(j=i+1;j<,;j++)    //遍历数组找出剩余数字中最小的所在的数组序号 if(array[j]<array[k])k=j; t=array[k];array[k]=array[i];array[i]=t;  //把当前最小数字交换到当前位置 } }

user: user-5
content: for(j=i+1;j<,;j++)？？？   引用 楼主 filia2014 的回复:假设我要比较5个数：3 6 1 9 4  当array[2]也就是1，小于array[0]也就是3然后做了替换。进入到下次循环的时候if(array[j]<array[k])k=j;此时array[j=3]也就是9了，那么k这个时候是不是array[2]，上一轮j的值给赋给了k，这个时候是不是在跟array[2]做比较？那不是就是和3做比较？ 不清楚变量的变化，设断点自己单步调试看看吧，不行也可以在适当部分加上printf把相关变量的值输出看看

user: user-3
content: 楼主跟踪一下所有的循环，就知道整个过程是怎么进行的，内外层总共也才15次循环
user-0 提问: 变长数组

回复:
user: user-0
content: 这个数组越界访问合法，指针行吗？

user: user-1
content: 看不出这种语言特性有什么用处，传一个变量无非就是为了计算地址嘛，简单的，可以化二维为一维或者用堆的空间来动态分配

user: user-0
content: 引用 2 楼 xpdavis 的回复:这个并不是变长数组，C语言规定二维数组形参必须指定一维的尺寸，新的C标准支持用变量来指定 第二维不需要指定，你这个函数的效果跟下面的一样； int  arr_ele(int  n,  int  A[n][],  int  i,  int  j) {         return  A[i][j]; } 如果是一维数组，就不需要了 int  arr_ele(int  n,  int  A[],  int  i) {         return  A[i]; } 实际上，数组的空间是在函数调用之前分配好的，而不是在函数体内分配的 引用 3 楼 r_Jimy 的回复:楼主这个函数完全没必要，假设外面定义了数组 int arr[3][4]; 调用arr_ele（3,arr,2,2); 等同于直接访问arr[2][2]; 想要变长，其实用malloc动态申请内存就可以了 引用 4 楼 zhao4zhong1 的回复:思考一下为什么没人将整个互联网内容作为函数参数传来传去呢？ 我的那个例子不太好，5楼回复就不错

user: user-2
content: 思考一下为什么没人将整个互联网内容作为函数参数传来传去呢？

user: user-3
content: 楼主这个函数完全没必要，假设外面定义了数组 int arr[3][4]; 调用arr_ele（3,arr,2,2); 等同于直接访问arr[2][2]; 想要变长，其实用malloc动态申请内存就可以了

user: user-1
content: 这个并不是变长数组，C语言规定二维数组形参必须指定一维的尺寸，新的C标准支持用变量来指定 第二维不需要指定，你这个函数的效果跟下面的一样； int  arr_ele(int  n,  int  A[n][],  int  i,  int  j) {         return  A[i][j]; } 如果是一维数组，就不需要了 int  arr_ele(int  n,  int  A[],  int  i) {         return  A[i]; } 实际上，数组的空间是在函数调用之前分配好的，而不是在函数体内分配的

user: user-4

user: user-5
content: 对于二维数组传参数，至少传递数组的列数。即 int arr_ele(int n, int arr[][n], int i, int j)

user: user-6
content: 以下内容来自《c primer lus》，我搬运过来，也学习下   变长数组中的“变”并不是表示在创建数组后，您可以修改其大小。变长数组的大小是实在创建后就是保持不变的。“变”的意思是说其维度大小可以用变量来表示。 因为变长数组是新增的特性，所以目前支持他的并不多。让我们来看一个简单的例子，该例子阐明如何编写一个计算任意二维int数组的和的函数。 首先，下面代码示范了如何声明一个妲有二维变长数组参数的函数： int sum2d(int rows, int cols, int ar[rows][cols]);//ar是一个变长数组 注意两个参量用作ar的维度，因为ar声明中使用哦了rows和cols，所以在参量列表中，他们两个声明必须变早于ar.因此，下面原型是错的 int sum2d(int ar[rows][cols],int rows, int cols);//错的  又学习了
user-0 提问: fgetws

回复:
user: user-1
content: 引用 6 楼 A812DLG1 的回复:赵老师：你说的VS也是编译器的一种吗？如果是敢问赵老师网上哪里有这种编译器？ http://bbs.csdn.net/topics/390812579

user: user-0
content: 赵老师：你说的VS也是编译器的一种吗？如果是敢问赵老师网上哪里有这种编译器？

user: user-0
content: 赵老师：你的三个方法我都试过了，还是报错。是不是程序有问题 啊？我是按书上给的程序练习的。“fgetws”它是函数吗？

user: user-1
content: 我VC6没错。 建议重装VS

user: user-1
content: 再不行，将所有printf("...改为wprintf(L"... ?

user: user-1
content: 或者将#include <wchar.h>挪到第一行？

user: user-1
content: 删掉#include <wchar.h>试试看。
user-0 提问: 简单C语言问题！

回复:
user: user-1
content: 7楼应该是对的，楼主多调试，动手才能提高哦

user: user-2
content: 单步调试，这样就知道代码的意思了。

user: user-3
content: 引用这个回车是换行符吗？ 是  看这几个输出，楼主明白不 楼主输入的字符，只要是2，就会原样输出，其它字符都会变成输出b

user: user-4
content: getchar()是单个单个字符读入的，输入abcde，它会一个一个的去缓冲区读取a  ,  b  ,  c   , d  ,e 当按下换行符时，再读取'\n'，进而跳出while()循环

user: user-5
content: 输入一个字符，知道这个字符是回车或者是EOF才结束

user: user-6
content: while ((c = getchar()) != EOF && c!='\n') 这一行应该如何理解？ 输入结束符或者回车，循环结束 你输入a再输回车，只会收到a 只有单输回车的时候，才会收到'\n'，结束循环

user: user-6
content: getchar()是输入字符，直到碰到回车才返回的，返回第一个字符，如果只敲回车，就返回回车 我看你的意思，是需要用 getche()函数 你看一下这个资料 http://blog.csdn.net/lhsgbc/article/details/7190432

user: user-7
content: EOF是文件结束标识，不能用来标识命令行结束输入。

user: user-0
content: 那我输入abcdef的时候程序是怎样的一个流程。是不是我输入一个a然后程序讲a存到键盘缓冲区，然后我在如入b继续存入键盘缓冲区。然后我输入回车后，程序不是就跳出循环了吗？那它是怎么显示的呢？
user-0 提问: 不使用 “+” 号，实现加法

回复:
user: user-1
content: lz这做法的主要意义是修改一下以后就能应付会溢出的平均数了。这个做法的出处估计其实就是从那里来的。

user: user-2
content: int Add(int x,int y) {     int i;     if(y==0) return x;     else     {         for(i=1;i<=y;i++)         {             x++;         }         return x;     } }

user: user-3
content: a + b  --->  a - (-b)

user: user-4
content: 引用 18 楼 u013163178 的回复:能解释下printf函数里面的东西吗 return printf("%*c%*c", a, '\r', b, '\r');  * 就是后面a的值，a = 3 的话，就是printf("%3c", '\r');  这位大神果然牛人！

user: user-5
content: 茴香豆的‘茴’有几种写法

user: user-6
content: 记得看过一个写HelloWorld的乱码大赛

user: user-7
content: 这...个...有...意...思...么...？考发散性思维？

user: user-8
content: add( x ^ y, (x & y) << 1); 楼主这代码能解释下吗？不理解啊！

user: user-9
content: 不错，很好的例子。

user: user-0
content: /*************************************************************************     > File Name: sum.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月25日 星期六 14时57分38秒  ************************************************************************/  #include<stdio.h> int * add(int a, int b) { 	int *const p=(unsigned int *)a; 	return &p[b]; }  int main() { 	printf("%d\n",(int)add(2,3));  	return 0; } 算出来是错的

user: user-10
content: 引用 2 楼 wushishuihuo 的回复:两个减号，num1-（-num2）+1

user: user-11
content: _asm{     ADD AX,CX; }

user: user-12
content: 引用 8 楼 slx_391987 的回复:自增 ++ 算不？   自增输入特例吧～而且这玩意俩加号～

user: user-0
content: 引用 5 楼 u010375827 的回复:计算机最底层都是用补码进行加法计算。 知道是补码有什么用，怎么在代码中把这个思想利用起来

user: user-0
content: 引用 2 楼 wushishuihuo 的回复:两个减号，num1-（-num2） 也是一个好方法啊，学习了

user: user-0
content: 引用 9 楼 max_min_ 的回复:位于 位或   | & ^  都可以啊 版主大大能不能给个C/C++语言的例子，学习一下

user: user-13
content: 位于 位或   | & ^  都可以啊

user: user-4
content: 自增 ++ 算不？

user: user-14
content: 法子真多。。。

user: user-15
content: 2个减号
user-0 提问: c语言

回复:
user: user-1
content: 应该 还真是你代码问题！ 一切的不可思议都是在情理之中，这就是编码的乐趣。

user: user-2
content: 绝对？ 不要这么肯定， 同一楼， 无码无真相

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

user: user-4
content: 无码无真相
user-0 提问: 关于小写字符转大写字符的问题，请教指点！

回复:
user: user-1
content: 自己实现库函数就行啦  #include <stdio.h>  int my_isupper(char c) {     return (c >= 'A' && c <= 'Z'); }  int my_islower(char c) {     return (c >= 'a' && c <= 'z'); }  int my_toupper(char c) {     if (my_islower(c))         return 'A' + (c - 'a');     else         return c; }  int my_tolower(char c) {     if (my_isupper(c))         return 'a' + (c - 'A');     else         return c; }  char *strupper(char *s) {     char *p;      for (p = s; *p; ++p)         *p = my_toupper(*p);     return s; }  char *strlower(char *s) {     char *p;      for (p = s; *p; ++p)         *p = my_tolower(*p);     return s; }  int main(int argc, char *argv[]) {     char s[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ-abcd-1234";      printf("%s\n", strupper(s));     printf("%s\n", strlower(s));      return 0; }

user: user-0
content: 引用 1 楼 user-4 的回复:void uppers(const char *str,char *dest){ assert((str!=NULL)&&(dest!=NULL)); while(*str!='\0'){ *dest=*str; if( (*str>='a') && (*str<='z') ) { *dest=*str-32; } str++; dest++; } *dest='\0'; }  谢谢回复！对于不用处理的字符应该给赋值，我写程序的时候没考虑。

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

user: user-0
content: 引用 2 楼 u013163178 的回复:从语言标准库里面有这个函数，看我代码 /*************************************************************************     > File Name: toupper.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月23日 星期四 10时33分57秒  ************************************************************************/  #include<stdio.h> #include<ctype.h>  int main() { 	char s[] = "hello world!"; 	printf("before toupper is: %s\n",s); 	for(int i=0; i< sizeof(s); i++) 		s[i] = toupper(s[i]); 	printf("after toupper is: %s\n",s);  	return 0; } 详情可登陆www.gfsoso.com  这是一道笔试题：编写一个函数实现将字符串的小写字母转换为大写字母，不能调用C/C++库函数。 函数原型为void uppers(const char *src,char *dest) 其中src是输入字符串的地址，dest是输出字符串的地址。

user: user-3
content: 从语言标准库里面有这个函数，看我代码 /*************************************************************************     > File Name: toupper.c     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月23日 星期四 10时33分57秒  ************************************************************************/  #include<stdio.h> #include<ctype.h>  int main() { 	char s[] = "hello world!"; 	printf("before toupper is: %s\n",s); 	for(int i=0; i< sizeof(s); i++) 		s[i] = toupper(s[i]); 	printf("after toupper is: %s\n",s);  	return 0; } 详情可登陆www.gfsoso.com

user: user-4
content: void uppers(const char *str,char *dest){ assert((str!=NULL)&&(dest!=NULL)); while(*str!='\0'){ *dest=*str; if( (*str>='a') && (*str<='z') ) { *dest=*str-32; } str++; dest++; } *dest='\0'; }
user-0 提问: 求大神指教，我想从键盘输入一段字符串，然后从屏幕上显示出来。。。

回复:
user: user-1
content: 找本基础的资料看看呗，入门级的

user: user-2
content: printf("%s\n", text);这一句放进while循环中才是输出你当前输入的字符串

user: user-3
content: # include <stdio.h> # include <string.h>  # define TEXTLEN 10   int main (void) {	 	char endstr[] = "*\n"; 	char text[TEXTLEN]; 	int i = 0;  	printf("请输入任意字符串\n"); 	while(1) 	{ 		fgets(text, TEXTLEN, stdin);    ///为什么不直接写gets( text ) ? 		i = strcmp(text, endstr);  ////看看i的值是多少  		if( !i )    ///当你输完一句话能执行到break吗？ 			break;  		if(strlen(text) > TEXTLEN) 		{ 			printf("超过容量，请重新开始输入\n"); 			return 1; 		} 	}  	printf("%s\n", text);  	return 0; }

user: user-4
content: 这两行顺序错了吧，对调一下试试 } printf("%s\n", text);
user-0 提问: 链表遍历疑问

回复:
user: user-1
content: 代码太乱 没看 不过 建议你create的时候 都memset 0 一下

user: user-2
content: 单步跟踪，多加打印，自已动手，丰衣足食 在你觉得有问题的地方加打印，看输出是怎么样得出来的，然后相应的调整 祝你成功

user: user-3
content: llist_node_st{  char data[0]; struct llist_node_st *prv; struct llist_node_st *next;	 };  char data[0]; 是什么意思阿？
user-0 提问: 程序入口main函数，main文件？

回复:
user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:对任何开发环境，熟悉这个开发环境下的调试器是大前提。  这里的RUN TO main，没有说明是main.c还是main(),不过从汇编那个看来，是main：。 但是在工程中找不到main：后面init_all的C代码

user: user-1
content: 对任何开发环境，熟悉这个开发环境下的调试器是大前提。

user: user-0
content: 引用 2 楼 zmlovelx 的回复:入口函数是可以指定的。  工程里找不到 init_all 这个函数

user: user-2
content: 入口函数是可以指定的。

user: user-3
content: 嵌入式的东西有点特殊。
user-0 提问: 有关外部函数调用的问题

回复:
user: user-0
content: Thank U!

user: user-1
content: 引用 4 楼 u014592447 的回复:[quote=引用 2 楼 Bigbalana 的回复:] VS2013上将这个函数定义为不安全函数，有些病毒利用这类获取输入函数，大量的输入内容达到覆盖内存的效果。像这样的还有gets_S(),以及很多的字符串处理函数都被VS2013定义为不安全 但是如果我想在上面的函数中使用scanf_s这个函数，那要进行什么样的操作呢？[/quote]  如果说你是用它来获取字符串  scanf_s("%s",aa,20)  aa是字符型指针 或者数组名  20是你希望获取字符串的最多字符数，除了这种情况外 其他的使用方法与scanf() 相同

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-0
content: 引用 2 楼 Bigbalana 的回复:VS2013上将这个函数定义为不安全函数，有些病毒利用这类获取输入函数，大量的输入内容达到覆盖内存的效果。像这样的还有gets_S(),以及很多的字符串处理函数都被VS2013定义为不安全 但是如果我想在上面的函数中使用scanf_s这个函数，那要进行什么样的操作呢？

user: user-3
content: 这个问题许多人都问过了——http://bbs.csdn.net/topics/370236436

user: user-1
content: VS2013上将这个函数定义为不安全函数，有些病毒利用这类获取输入函数，大量的输入内容达到覆盖内存的效果。像这样的还有gets_S(),以及很多的字符串处理函数都被VS2013定义为不安全

user: user-0
content: 发现问题所在 我用的VS2013 其中我将scanf_s("%c",c) 换成了 scanf("%c",c)虽然提出安全警告 但是结果却显示正确。 请问大神们，这里scanf 和 scanf_s的区别体现在什么地方
user-0 提问: codebolcks+gcc编译器怎么运行多线程程序？

回复:
user: user-0
content: 哦，对，是因为我的主线程结束了，所以子线程也死了，一语惊醒。WaitForMultipleObjects函数太复杂了，容易出错，为了先看到效果，就先用system("PAUSE")试了一下，找到了原因，谢谢！

user: user-1
content: 在主线程使用WaitForMultipleObjects等待子线程的创建。

user: user-1
content: windows下使用CreateThread好像也是可以的啊，你的程序没有出现你想要的情况，是因为你的主进程结束了，所以你创建两个线程也跟着结束了。

user: user-0
content: 我试试，等等你是说添加运行库pthread_create吗？

user: user-1
content: 使用pthread_create

user: user-0
content: 贴上代码：  #include <stdio.h> #include <stdlib.h> #include <windows.h>   DWORD WINAPI driverWork(LPVOID lpParameter); DWORD WINAPI sellerWork(LPVOID lpParameter);  HANDLE dEvent,tEvent;   //事件对象，相当于司机和售票员的私有信号量  int main() {     DWORD driverID,ticke_sellerID;   //司机线程和售票员线程的id     HANDLE driver,ticket_seller;    //司机线程和售票员线程的句柄      //创建事件对象     //dEvent = CreateEvent(NULL,FALSE,FALSE,NULL);     //tEvent = CreateEvent(NULL,FALSE,FALSE,NULL);     //printf("创建事件完毕！\n");     //创建线程     driver = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)driverWork,NULL,0,&driverID);     ticket_seller = CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)sellerWork,NULL,0,&ticke_sellerID);     if(driver && ticket_seller) {         printf("创建线程完毕！\n");     }     //关闭线程     //printf("开始关闭线程！\n");     //CloseHandle(driver);     //CloseHandle(ticket_seller);     return 0; }  //司机线程 DWORD WINAPI driverWork(LPVOID lpParameter) {     int i = 0;     while(i < 10)     {         printf("正常行车，到站，停车\n");         i++;     }     return 0; }  DWORD WINAPI sellerWork(LPVOID lpParameter) {     int i = 0;     while(i < 10)     {         printf("售票\n");         i++;     }     return 0; }  运行结构如下，有两种情况，但都不是想要的情况：
user-0 提问: #define 宏定义空值 对程序有多大影响

回复:
user: user-0
content: 很感谢大家给予及时回复

user: user-1
content: 宏不能定义宏。  就像 #define define    将define定义为空  你觉得它下面的所有define 是不是就是空了呢？  这是鸡生蛋，蛋生鸡的问题

user: user-2
content: 简单的讲，就是编译预处理，宏替换的问题，对于""中出现的宏名不做替换。 仅此而已，详细内容就去看预处理的细节。

user: user-3
content: #define和#include都是预处理命令，两者是并列关系，不存在相互调用关系。我猜。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:研究一下gcc源代码中处理#define和#include相关部分。  呵呵，不是我不求甚解。我非计算机专业，只是在自己的编程中发现了这个问题，只想做个简单的了解。望大师给指点一下即可。简明扼要

user: user-0
content: 引用 1 楼 ForestDB 的回复:你试试 # include <stdio.h>  已知""内的内容不做宏替换。  没有什么影响，哪儿有讲这方面理论的吗？我在书上和网上都没找到

user: user-3
content: 研究一下gcc源代码中处理#define和#include相关部分。

user: user-0
content: 没有什么影响，哪儿有讲这方面理论的吗？我在书上和网上都没找到

user: user-2
content: 你试试 # include <stdio.h>  已知""内的内容不做宏替换。