Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 问下关于 fopen 函数的问题

回复:
user: user-0
content: 引用 2 楼 q3733353520 的回复:1、确定路径正确 2、确定文件是否存在  确实是路径弄错了   唉

user: user-1
content: #include <errno.h>这个别忘了加

user: user-1
content: 引用 3 楼 a1141644656 的回复:[quote=引用 1 楼 lgbxyz 的回复:] 看errno 是什么  怎么看？  [/quote] printf("Can't open %s\n", argv[1]); 这句后面打印 printf("errno = %d\n", errno);

user: user-0
content: 引用 2 楼 q3733353520 的回复:1、确定路径正确 2、确定文件是否存在  同路径的 .c  .exe 文件都能打开的

user: user-0
content: 引用 1 楼 lgbxyz 的回复:看errno 是什么  怎么看？

user: user-1
content: 1、确定路径正确 2、确定文件是否存在

user: user-2
content: 看errno 是什么
user-0 提问: switch季节判断时 case 08 09报错

回复:
user: user-1
content: 直接1，2，3，4，5，6，7，8，9，10，11，12就好了。 因为int，你输入01，只会接收1(内存0是否存储不知道)，然后对应case 1，程序一样会运行。

user: user-2
content: 1.常数已0开头是八进制0~7 2.如果你非要case里有两位，那得看你编译器了，把m声明成字符，有些编译器对‘08’类似字符是取后面最后一个字符的

user: user-3
content: 引用 5 楼 J1101460678 的回复:case后面直接写8,9！！不加零！ +1

user: user-4
content: case后面直接写8,9！！不加零！

user: user-5
content: switch (m) {         case 0x0C:         case 0x01:         case 0x02:             printf("Winter\n");             break;         case 0x03:         case 0x04:         case 0x05:             printf("Sprin\n");             break;         case 0x06:         case 0x07:         case 0x08:             printf("Summer\n");             break;         case 0x09:         case 0x0A:         case 0x0B:             printf("Autumn\n");             break;         default:             break;     }

user: user-6
content: case 08:  改为 case 010 其他以此类推

user: user-7
content: 整型常量如果以0开头表示是8进制数，08 09当然不存在了

user: user-8
content: 因为是以0开头，所以会是8进制

user: user-0
content: 知道了第一点... 八进制是0～7 来表示数的。 照这样说我所有case后的数都被理解为八进制了。那第二个问题还是求大神帮忙看下。虽然两位没啥卵用，不过看起来舒服...
user-0 提问: 考研狗请教数据结构问题，

回复:
user: user-1
content: 参考代码： https://github.com/707wk/Senior-middle-school/blob/master/Filling%20in%20the%20gaps.c

user: user-2
content: 引用 4 楼 baijiaheizhiganmao 的回复:看到你发这个问题,我对你的考研表示担心.对你考研的动机表示怀疑. 原谅我上面的废话. 我的建议是把C语言学好. 实在人说实在话。

user: user-3
content: 严蔚敏的数据结构方面的书，就有C语言版的。你非要买个C++语言版的，搞毛？

user: user-4
content: 《算法精解（C语言描述）》

user: user-5
content: 看到你发这个问题,我对你的考研表示担心.对你考研的动机表示怀疑. 原谅我上面的废话. 我的建议是把C语言学好.

user: user-4
content: 《数据结构（C语言描述）》

user: user-6
content: 有考过的，哈哈。 归并排序 http://blog.csdn.net/zhangxiangdavaid/article/details/34463409

user: user-0
content: 有没有考研的？
user-0 提问: pipe管道 传值 链表 怎么不行啊

回复:
user: user-0
content: 69行打印结果不对，请大神相助！！

user: user-1
content: 修改如下：  #include <unistd.h> #include <stdio.h> #include <string.h> #include <stdlib.h> int main() { 	char *string1, *string2; 	int ret, myPipe[2]; 	char buffer[80 + 1];  	typedef struct protocal 	{ 		char ptype; 		int len; 		struct protocal *next; 	} PRO, *PPRO;  	string1 = malloc(50); 	string2 = malloc(50); 	strcpy(string1, " hjj23 "); 	strcpy(string2, " hjj24 "); 	int length = sizeof(PRO);  	/*create a pipe */ 	ret = pipe(myPipe); 	if (ret == -1) 	{ 		perror("pipe error"); 		exit(-1); 	} 	else if (ret == 0) 	{ 		/*write to pipe */ 		PPRO p = (PPRO)malloc(sizeof(PRO)); 		p->ptype = 'A';/*表示姓名*/ 		p->len = 3; 		p->next = NULL; 		printf("123\n"); 		int bytes_write = write(myPipe[1], p, length); 		if (bytes_write == -1) 		{ 			perror("write pipe error"); 			exit(-1); 		} 		/*write to pipe again */ 		bytes_write = write(myPipe[1], string1, strlen(string1)); 		if (bytes_write == -1) 		{ 			perror("write pipe error"); 			exit(-1); 		} 		bytes_write = write(myPipe[1], string2, strlen(string2)); 		if (bytes_write == -1) 		{ 			perror("write pipe error"); 			exit(-1); 		} 		/*read from pipe */ 		PRO a; 		read(myPipe[0], (void *)&a, sizeof(PRO)); 		printf("a.ptype=%c,a.len=%d\n", a.ptype, a.len); 		int bytes_read = read(myPipe[0], buffer, sizeof(buffer)); 		if (bytes_read == -1) 		{ 			perror("read pipe error"); 			exit(-1); 		} 		buffer[bytes_read] = 0; 		printf("%s\n", buffer); 	} 	return 0; } //123 //a.ptype = A, a.len = 3 // hjj23  hjj24
user-0 提问: c语言中奇怪的初始化赋值导致的错误

回复:
user: user-1
content: 一直以为ＣＳＤＮ还是片净土，没想到也被*污*染了。这就好比说你*有*罪，就是不告诉你哪里*有*罪，反正你就是*有*罪。

user: user-2
content: 蛋

user: user-3
content: 引用 1 楼 king191923157 的回复:把return  FALSE ;   改了   你函数的返回类型是gboolean 而return FALSE; FALSE 的类型不是 gboolean 你返回一个gboolean  FALSE 的定义是  ＃define  FALSE 0  typedef int gint; typedef gint gboolean; FALSE就是0，怎么能说FALSE不是gboolean ？？ VS支持C99？个人表示不相信。

user: user-4
content: gboolean的类型是？

user: user-5
content: 把return  FALSE ;   改了   你函数的返回类型是gboolean 而return FALSE; FALSE 的类型不是 gboolean 你返回一个gboolean  FALSE 的定义是  ＃define  FALSE 0

user: user-6
content: 老工程能编译，估计是编译器对以前的代码为了加快编译速度，没有全部重新编译 你点击下清除解决方案，重新生成试试

user: user-0
content: https://msdn.microsoft.com/zh-cn/library/d3ct4kz9.aspx  Visual Studio 2013 其他版本  “function”未定义；假设外部返回 int 编译器遇到对未定义函数的调用。 通过检查以下可能的原因进行修复 函数名称拼写不正确 原型非 extern 的外部函数  这是我从msdn获取到的信息，依然不懂啥意思？  我只知道，你妹包含， 丫的，编译器怎么能放过去呢？

user: user-0
content: 引用 1 楼 king191923157 的回复:把return  FALSE ;   改了   你函数的返回类型是gboolean 而return FALSE; FALSE 的类型不是 gboolean 你返回一个gboolean  FALSE 的定义是  ＃define  FALSE 0 引用 3 楼 sholber 的回复:[quote=引用 1 楼 king191923157 的回复:] 把return  FALSE ;   改了   你函数的返回类型是gboolean 而return FALSE; FALSE 的类型不是 gboolean 你返回一个gboolean  FALSE 的定义是  ＃define  FALSE 0  typedef int gint; typedef gint gboolean; FALSE就是0，怎么能说FALSE不是gboolean ？？ VS支持C99？个人表示不相信。[/quote]  我是用vs2013  刚才又发现一个奇怪的语法，注意，所有代码都是纯c   我用到了strlen string.h里的一些函数，  注意：我没有包含string.h  居然可以编译过去，但是有警告：  Warning	29	warning C4013: 'strlen' undefined; assuming extern returning int	 Warning	30	warning C4013: 'memcpy' undefined; assuming extern returning int	 Warning	31	warning C4013: 'strcat' undefined; assuming extern returning int	   当然你们肯定不信，我也不信，是啊，头文件都不包含，能编译就见鬼了。  为此我新建一个工程，试一试，果然无法编译。  那么，为什么我的老工程可以编译，只简单的出现警告呢？   为此，通过搜索来解答问题：  http://bbs.csdn.net/topics/110078687  看这个帖子，我居然没看懂。  擦， 没头文件，只是警告？   这是什么理由？  百思不得其解
user-0 提问: c语言 数据存储的问题 

回复:
user: user-1
content: 写的时候你的写入格式不对吧

user: user-2
content: 由于结构体对齐的问题， struct Stu类型的变量会有些多余的字节，改变文件类型进行查看，就会暴露这些多余字节。 建议读写时，模式一致。 要么"w"、"r" 或者"wb"、"rb"
user-0 提问: 为什么C语言标准库中的字符相关函数都用int作参数与返回类型？

回复:
user: user-1
content: size_t吧，

user: user-2
content: 如果不是整形，那你觉得应该是什么类型。库函数的执行结果一般是几种情况，用整形来表示应该会比较方便吧。

user: user-3
content: 引用 楼主 qq_30244069 的回复:为什么C语言标准库中的字符相关函数都用int作参数与返回类型？ 那楼主觉得该用什么类型？

user: user-4
content: getchar: The return type is int to accommodate for the special value EOF, which indicates failure: If the standard input was at the end-of-file, the function returns EOF and sets the eof indicator (feof) of stdin. If some other reading error happens, the function also returns EOF, but sets its error indicator (ferror) instead.

user: user-5
content: 返回类型，由函数功能决定

user: user-6
content: 返回错误用的

user: user-7
content: 具体哪个函数？
user-0 提问: c语言难道可以不包含头文件，就直接使用函数?

回复:
user: user-1
content: 楼上都说的很详细了，这是编译器帮你做的事，默认包含常用的头文件（正确的说，应该是链接，对于找不到的符号，到常用库中搜一下），说白了就是让你写代码方便一些，想一想你写这么多程序，有几个是不用printf等常用的函数，不过推荐是包含的， 一般都要做到没有warning，这对代码排错和后期维护很重要。

user: user-2
content: 没有用到的函数不连接，很正常啊。 不连接，也就不用考虑，是否有连接错误了。 这是C语言（连接器）的重要功能，可以减小代码大小。  printf ,和 scanf 这两个函数，可以不必include  任何头文件，直接用 这在早期的编译器，是很平常的事情 因为任何有点意义的完整的简单程序，都离不开输入输出。，，，， （复杂程序，可以借助各种类型的通讯手段，DLL等等，不必直接输入输出，这里不谈） 所以开了特例，方便学习C语言的时候，使用这两个函数。

user: user-0
content: test.h:  int a;  void show();  #define  BUFSIZE 100   test1.c:  #include "test.h" #include <stdio.h> int fun() {  	printf("Hello World\n"); 	return 0;  }  void show() {  }  test2.c:  #include<stdio.h>  #include "test.h" #include "test.h" //注意我故意写了2行  int  main(void)  { 	//return 0;  	//printf("%s", a); }  也可以编译链接。  顿时崩溃!!!   用gcc试试，结果也如此，人生信念彻底毁灭。

user: user-0
content: 为了再次看c和c++的区别，做个实验：  test.h:    int a;  void show(void);  test1.c:  #include "test.h" #include <stdio.h> int fun() {  	printf("Hello World\n"); 	return 0;  }  void show() {  }   test2.c:   #include<stdio.h>  #include "test.h"  int  main(void)  { 	//return 0;   }  毫无压力，编译。链接都没错误，且无警告。   看到变量 int a没有!!!!     确实让我吃了一惊。

user: user-3
content: 有些库会被编译器自动链接 再加上楼上的说法， 即是解释

user: user-0
content: gcc 试试：   #include <stdio.h>  int main() {     printf("Hello World!\n");     strlen("123");     return 0; }  warning: incompatible implicit declaration of built-in function ‘strlen’   答案已经知晓。  c和c++有个区别： 后者严格申明后使用。 前者，编译器去猜测且假设函数为 int strlen(void)。  当链接的时候，编译器在c库函数里找到了strlen，所以就成功了。  可见c语言非常恐怖！！！

user: user-4
content: 应该是编译器问题吧

user: user-0
content: up 起来

user: user-0
content: http://bbs.csdn.net/topics/391380244  这是姊妹篇
user-0 提问: 求高手指点一下，已经调试出错误在哪了

回复:
user: user-1
content: 楼主你的代码看得我蛋都疼，另外当w = 12 时， v = 12，west_visited[w]==1，所以判断失败，楼主，你在调用每个函数后，测一下数据是不是对的，你的内存开辟在乱了

user: user-1
content: for(k=0;k<18;k++) 	{ 		i=WestYard[k][0]; 		j=WestYard[k][1];  		//将west_alGraph->west_vertices[1~19].west_firstedg指向新开辟的堆内存 		//由于k = 7 和 k = 8时，i值都为8；以及k = 12 和 k = 13时，i值为13 		//west_vertices[8]和west_vertices[13]的west_firstedg之前指向的内存被放弃，然而没有释放，内存泄露 		west_newnode=(west_EdgeNode*)malloc(sizeof(west_EdgeNode)); 		west_newnode->west_adjvex=j; 		west_newnode->west_weight=0; 		west_newnode->west_nextedge = west_alGraph->west_vertices[i].west_firstedge; 		west_alGraph->west_vertices[i].west_firstedge=west_newnode; 		 		//将west_alGraph->west_vertices[2~19].west_firstedg指向新开辟的堆内存 		//由于下标值2~19与1~19有很大重合，造成之前的内存被放弃，然而没有释放，内存泄露 		west_newnode=(west_EdgeNode*)malloc(sizeof(west_EdgeNode)); 		west_newnode->west_adjvex=i; 		west_newnode->west_weight=0; 		west_newnode->west_nextedge = west_alGraph->west_vertices[j].west_firstedge; 		west_alGraph->west_vertices[j].west_firstedge=west_newnode; 	}

user: user-2
content: 领接表dfs,看起来这里根本不往下走 while(west_vexNode!=NULL)     {         w=west_vexNode->west_adjvex;              //当w=12时，开始死循环，不执行if里的WEST_DFS函数         if(!w) break; // w==0 meas end         if(west_visited[w]==0)             WEST_DFS(west_alGraph,w);         west_vexNode =west_vexNode->west_nextedge; // next     }

user: user-3
content: 会执行啊，是不是流程没搞好，单步执行就进去了。

user: user-4
content: 看的好忧桑····
user-0 提问: window用C语言怎么可以把字节数据写进声卡播放

回复:
user: user-1
content: auxGetDevCaps auxGetNumDevs auxGetVolume auxOutMessage auxSetVolume PlaySound sndPlaySound waveInAddBuffer waveInClose waveInGetDevCaps waveInGetErrorText waveInGetID waveInGetNumDevs waveInGetPosition waveInMessage waveInOpen waveInPrepareHeader waveInProc waveInReset waveInStart waveInStop waveInUnprepareHeader waveOutBreakLoop waveOutClose waveOutGetDevCaps waveOutGetErrorText waveOutGetID waveOutGetNumDevs waveOutGetPitch waveOutGetPlaybackRate waveOutGetPosition waveOutGetVolume waveOutMessage waveOutOpen waveOutPause waveOutPrepareHeader waveOutProc waveOutReset waveOutRestart waveOutSetPitch waveOutSetPlaybackRate waveOutSetVolume waveOutUnprepareHeader waveOutWrite

user: user-2
content: 查MSDN是Windows程序员必须掌握的技能之一。
user-0 提问: c语言 数据存储问题 书中的例子 可是出现了问题 小白一名谢谢帮忙

回复:
user: user-1
content: 用文本方式操作

user: user-2
content: 既然要用二进制的方式读取，就得先按二进制的方式写入  #include<stdio.h> #include<stdlib.h> #include<errno.h> #define SIZE 5 struct Stu { 	char name[10]; 	int num; 	int age; 	char addr[15]; }w_stu[SIZE], r_stu[SIZE]; int i; char *file = "D:\\out.dat"; FILE *fp; void write_data() { 	fp = fopen(file, "wb"); 	for (i = 0; i < SIZE; i++) 		fwrite(w_stu + i, sizeof(struct Stu), 1, fp); 	fclose(fp); } void read_data() { 	fp = fopen(file, "rb"); 	for (i = 0; i < SIZE; i++) 	{ 		//fseek(fp, i*sizeof(struct Stu), 0); 		fread(r_stu + i, sizeof(struct Stu), 1, fp); 		printf("%s,%d,%d,%s\n", r_stu[i].name, r_stu[i].num, r_stu[i].age, r_stu[i].addr); 	} 	fclose(fp); } int main() { 	char name[10], addr[15]; 	//构造数据 	for (i = 0; i < SIZE; i++) 	{ 		sprintf(name, "stu_%d", i); 		sprintf(addr, "addr_%d", i); 		strcpy(w_stu[i].name, name); 		strcpy(w_stu[i].addr, addr); 		w_stu[i].age = rand() % 20 + 1; 		w_stu[i].num = rand() % 20 + 1; 	} 	write_data(); 	read_data(); 	return 0; }

user: user-3
content: 不要太迷信书本了
user-0 提问: 布尔函数，请问它带出的值是什么？0吗

回复:
user: user-1
content: 引用 4 楼 ant2012 的回复:typedef unsigned char boolean; #define FALSE               0 可见，在C++中boolean其实就是无符号字符型  此话怎么说？

user: user-2
content: typedef unsigned char boolean; #define FALSE               0 可见，在C++中boolean其实就是无符号字符型

user: user-3
content: 对C语言来说 这段代码无法通过编译  更别提什么运行结果了

user: user-4
content: C语言中是没有关键字boolean的，一般编译器是将false宏定义为0，如在linux中头文件stdbool.h 有 #define false 0

user: user-5
content: 对啊，ture是1
user-0 提问: getch()和ungetch()看不懂，新人求指导

回复:
user: user-0
content: 引用 9 楼 a339299936 的回复:int charch(void); void ungetch(int); int getine(int *pn) {     int c, sign;     while (isspace(c = getch()))         ;     if (!isdigit(c) && c != EOF && c != '+' && c != '-'){         ungetch(c);         return 0;     }     sign = (c == '-') ? -1 : 1;     if (c == '+' || c == '-')         c = getch();     for (*pn = 0; isdigit(c); c = getch())         *pn = 10 * *pn + (c - '0');     *pn *= sign;     if (c != EOF)         ungetch(c);     return c;  教科书上的这段代码写的是什么啊 没看懂 求大神指点

user: user-0
content: int charch(void); void ungetch(int); int getine(int *pn) {     int c, sign;     while (isspace(c = getch()))         ;     if (!isdigit(c) && c != EOF && c != '+' && c != '-'){         ungetch(c);         return 0;     }     sign = (c == '-') ? -1 : 1;     if (c == '+' || c == '-')         c = getch();     for (*pn = 0; isdigit(c); c = getch())         *pn = 10 * *pn + (c - '0');     *pn *= sign;     if (c != EOF)         ungetch(c);     return c;

user: user-1
content: 不过楼主想自定义一个数据缓冲区，也可以像你写的那两个函数样，char buf[BUFSIZE];就像数据缓冲区

user: user-1
content: 直接调用，无需定义，能用系统库的最好用系统库，自己写的代码稳健性在待检测

user: user-1
content: 引用 5 楼 a339299936 的回复:执行后提示 1>------ 已启动生成:  项目: lainxi5, 配置: Debug Win32 ------ 1>  main.c 1>f:\bclx\lainxi5\lainxi5\main.c(8): warning C4013: “getine”未定义；假设外部返回 int 1>f:\bclx\lainxi5\lainxi5\main.c(12): error C2371: “ungetch”: 重定义；不同的基类型 1>          e:\办公软件\vc\include\conio.h(140) : 参见“ungetch”的声明 ========== 生成:  成功 0 个，失败 1 个，最新 0 个，跳过 0 个 ==========  去掉这两个函数的定义，库里面已经实现了它们

user: user-0
content: 执行后提示 1>------ 已启动生成:  项目: lainxi5, 配置: Debug Win32 ------ 1>  main.c 1>f:\bclx\lainxi5\lainxi5\main.c(8): warning C4013: “getine”未定义；假设外部返回 int 1>f:\bclx\lainxi5\lainxi5\main.c(12): error C2371: “ungetch”: 重定义；不同的基类型 1>          e:\办公软件\vc\include\conio.h(140) : 参见“ungetch”的声明 ========== 生成:  成功 0 个，失败 1 个，最新 0 个，跳过 0 个 ==========

user: user-2
content: getch()会读取你输入的第一个字符   就结束该语句 ungetch();   是把一个字符退回到键盘缓冲区中

user: user-0
content: 引用 2 楼 ant2012 的回复:楼主可以include <conio.h>头文件，直接使用这两个函数，无需自己定义 添加 include <conio.h>头文件后 提示错误啊 提示这个void ungetch(int);错误

user: user-1
content: 楼主可以include <conio.h>头文件，直接使用这两个函数，无需自己定义

user: user-1
content: 你自己定义的吗，库函数中，getch()是从缓冲区中无回显地读字符， ungetch()是把一个字符退回到键盘缓冲区中
user-0 提问: c语言新手求助

回复:
user: user-1
content: #include <stdio.h> int main() {     int a,b;     scanf("%d%d",&a,&b);     printf("a=%d, b=%d/n",a,b）； } 而在scanf后写a=%d b=%d,属于语法错误。。

user: user-2
content: 可怎么输入啊 引用 3 楼 wu2304211 的回复:#include<stdio.h> int main() {   int a,b;   scanf("%d%d",&a,&b);   printf("%d %d",a,b); } 这样就行啦！

user: user-3
content: 引用 4 楼 pengyw的回复:可怎么输入啊 [quote=引用 3 楼 wu2304211 的回复:] #include<stdio.h> int main() {   int a,b;   scanf("%d%d",&a,&b);   printf("%d %d",a,b); } 这样就行啦！[/quote] scanf那里不就是用来输入的嘛

user: user-3
content: #include<stdio.h> int main() {   int a,b;   scanf("%d%d",&a,&b);   printf("%d %d",a,b); } 这样就行啦！

user: user-4
content: scanf()的格式控制串可以使用其它非空白字符，但在输入时必须输入这些字符。  例：  scanf("%d,%d",&a,&b);  输入： 3，4 ↙（逗号与"%d,%d"中的逗号对应）  scanf("a=%d,b=%d",&a,&b);  输入： a=3，b=4 ↙（"a=","b=",逗号与"%d,%d"中的"a=","b="及逗号对应）   检查你的输入是不是符合你定义的要求

user: user-5
content: 对应的输入应该是这个样子的 a=12b=34  正常人没有这样用scanf的
user-0 提问: c语言 getchar()函数问题 找不到问题出在哪里

回复:
user: user-1
content: 这个处理缓冲区残留确实是个头疼而且重要的问题，因为它影响你的数据的输入。最典型的就是输入完成后按下回车键，回车产生副作用：在缓冲区留下一个'\n'换行符。 我的建议是：尽量不要使用getchar，因为他什么字符都会读取。包括空白符，如\n  解决办法：1.将getchar替换成scanf("   %c",&ch)   //%c前加一个空格，这样ch就只能读取非空白符了。也就是你输入的有效数据                      2.你会问，那读取其他的数据，如字符串，整数，浮点数怎么处理空白符残留那？                         使用scanf() 时，scanf会清理开始的空白符。不会有影响。                      3.清理错误的输入。有时候输入的数据是错误的，你不能不理他，因为他会残留在缓冲区，需要清理他。                         你使用的是fflush()函数，据我所知，这个函数是为stdout设计的，不建议对stdin使用。                         可以这样：                         void Clear_buf(void)\                         {                               while(getchar()!='\n')                                 ;                           }                         这是通用的清理输入缓冲的办法。
user-0 提问: c语言 文件读写问题 各位大神帮忙

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:检查fopen_s返回值的表达式错了吧我很抱歉 我想给您40点 因为您帮助我解决了问题 可是这个网站有点bug 他总告诉我与总点数不符合 可是我问题点数就是40点 真的抱歉 也真的谢谢您

user: user-1
content: 检查fopen_s返回值的表达式错了吧
user-0 提问: 大神，关于枚举的问题

回复:
user: user-1
content: a是对象，能取里面的任何值。关键是你要给他赋值啊

user: user-2
content: 没有初始化的话，编译都出错，int a=sun ,a的值就是0;

user: user-3
content: 没有初始化，不确定。 可以随后赋值，如： a = mon;
user-0 提问: 小白求教学，关于图的深度优先遍历问题

回复:
user: user-1
content: 深度、广度遍历都是有编程框架可循的。 你代码除了问题，那就要自己调试了

user: user-2
content: 没有试过单步调试吗？打印输出一下，看看哪里有问题。 大篇幅的代码贴上来后应该有一些自己的分析
user-0 提问: 关于字符变量定义问题，求解！

回复:
user: user-1
content: 原因是，char被当作一种整型对待，只是长度只有 一个字节 四个字节 ，32Bits 系统中，可以表示 一个 整型int 类型的数据。 这些编译器，允许单引号内的多个字符，当作整型int 常量用。 估计主要原因还是，多字节字符，unicode字符的出现，字符不再仅仅用一个字节了。 这样，只允许一个字节的话，多于一个字节的字符，可能就不能一下子表示出来了。

user: user-2
content: 带毛笔，呵呵

user: user-1
content: 早期的编译器，不支持非转义字符多字符 char 常量 后来的某些 编译器支持了，标准就不清楚了

user: user-3
content: printf("%d\n", sizeof('a')); //结果是4    C里面字符常量按4个字节存储  char a = 'abcd'; //这样赋值没问题 char a = 'abcde'; //超过4个 编译器就报错了

user: user-0
content: 谢谢各楼的解答，继续努力！

user: user-4
content: 引用 6 楼 zhao4zhong1 的回复:编译器的自定义行为和不可预知行为多如牛毛。  同学：“老师让明天去学校时带钢笔。” 小明：“带毛笔！” A.小明打算带毛笔去学校 B.小明不打算带任何笔去学校 C.小明没钢笔 D.小明有毛笔  可见，人脑这个编译器的自定义行为和不可预知行为也多如牛毛！

user: user-5
content: 编译器对未知行为的不确定

user: user-4
content: 编译器的自定义行为和不可预知行为多如牛毛。  同学：“老师让明天去学校时带钢笔。” 小明：“带毛笔！” A.小明打算带毛笔去学校 B.小明不打算带任何笔去学校 C.小明没钢笔 D.小明有毛笔

user: user-6
content: 这个是未定义问题，标准并未作出强制的要求。 一般编译器系统会给出警告或错误提示。  下面是两种常见的处理方式： 1.cl (windows常用C前端),忽略前面的所有字符,运算结果为最后一个字符 ex: char a = "asdf";     //a的值为'f'  2.ccl (gcc处理C的前端)取第一个有效字符 ex: char a = "asdf";     //a的值为'a'  上述并不是所有编译器处理的绝对情况，请以实验为主 希望能帮助到你

user: user-7
content: 定义的是一个字节，你abcd有四个字节，会发生截取；

user: user-0
content: 为什么呢？我用的VC编写的，没有出现警告与错误啊

user: user-8
content: 只是警告： D:\Project\CTest\main.cpp:5: warning: multi-character character constant [-Wmultichar]      char a='abcd';             ^
user-0 提问: 求解ashmem-dev.c:21:1: error: expected ';', ',' or ')' before '{' token

回复:
user: user-1
content: 没看出来那里有错, 可能那个头文件有问题

user: user-2
content: 在哪出的问题，21行？

user: user-3
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-0
content: 引用 1 楼 ant2012 的回复:会不会是中文的逗号  什么意思 ？代码是同步于官方的，不是我写的，但是编译时就报错

user: user-2
content: 会不会是中文的逗号
user-0 提问: 热烈庆祝本人受关注人数即将突破8000大关！散分！！＋设置终端图标和字体大小C源代码

回复:
user: user-1
content: 接分接分接分接分……

user: user-2
content: 久闻赵老师大名

user: user-3
content: 赵老师，你好啊，我很崇拜你的，希望多多跟你学习。

user: user-4
content: 恭喜，学习的榜样

user: user-5
content: 来晚了一步啊

user: user-0
content: 人总得时不时找点理由庆祝一下哈。今天吃巴甫洛夫……

user: user-6
content: 嗯，关注人数还差46人达8000人，赵老师，在努把力。哈哈  嗯，我在想，当赵老师你的关注人数达8000人时，我把自己对你的关注取消了，这个关注人数不有下落掉8000人了吗？哈哈

user: user-7
content: 希望还没来晚

user: user-8
content: 恭喜恭喜

user: user-9
content: 那些都是我小号，你不信，看我换一个号，发同样的内容

user: user-10
content: 支持分享。

user: user-11
content: 离10000不远了

user: user-12
content: 恭喜楼主，躺下接分

user: user-13
content: 恭喜楼主，接分！

user: user-14
content: 又来接分咯

user: user-15
content: 赵老师，给你增加点人气。赞一个 赞一个 赞一个

user: user-16
content: 没有看到分呀

user: user-17
content: 接分接分

user: user-18
content: 菜鸟来接分了

user: user-19
content: 同楼上。。。。
user-0 提问: 50分， 3个版本的makefile ，百思不得骑姐

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

user: user-1
content: 搜“跟我一起写makefile”

user: user-0
content: up 起来，等高手解答

user: user-0
content: ERR := $(error found an error!)      all:main1 main2         @echo $${array[0]} main1: main1.c     @gcc main1.c -o main1 main2: main2.o     @gcc main2.o -o main2 main2.o: main2.c     @gcc -c main2.c   .PHONY:clean err  err:;$(ERR) clean:     @rm -f main2.o                                 第2行报错，然后makefile停止。  我之所以这么写，是参考以下文章：  http://blog.chinaunix.net/uid-23929712-id-2650467.html 示例2： ERR = $(error found an error!)   .PHONY: err err: ; $(ERR)   这个例子，在make读取Makefile时不会出现致命错误。只有目标“err”被作为一个目标被执行时才会出现。  红色的是文章里提到的内容。  于是我仿写了，结果依然报错。

user: user-0

user: user-0
content: 不是Tab的问题。  在目标内部， 内置函数不需要顶头写，有多少空格，或者tab都无所谓。    刚才又尝试了几次，发现这3个版本的执行结果的原因：  目标内部，error和warning的优先级别高，所以先执行，所以根本不会去管echo!!!   另外一个问题：  在target里的注释问题！！！！！  命令的必须用@#进行注释！！  命令与命令之间没有必要用; 隔开，网上说隔开的，都是扯犊子。  还有，对于内置函数的注释用#，需要顶到行首进行注释。

user: user-1
content: 提醒：makefile里面的tab字符必须是真正的tab字符，不能用几个空格代替。

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:搜“跟我一起写makefile”  解决不了，  我看过哪些文章。
user-0 提问: 么么，新人求助，已知5个人的学号，身高，体重，要求输入学号，输出学号，身高，体重。

回复:
user: user-1
content: 如果是别人，那直接一个结构体存数据但愿，用map组织数据，map自带查找功能。 你想用链表，也可以，自己实现一个链表，设计一个结构体，然后遍历链表查找，自己实现起来，还是很有意思的。

user: user-0
content: 我想用这个题参考，我自己想的题，想看看别人怎么做，哥哥们，给力点 啊。。

user: user-0
content: 恩 用结构体，指针，数组。。。

user: user-1
content: 你直接问代码啊？
user-0 提问: 请问如何用C写一个暴力破解SSH的程序

回复:
user: user-0
content: 你看看我的代码，我不会shell，所以都是瞎写的，不知道错在哪，你看这种方法能实现吗 #include<stdio.h> #include<memory.h> int main(int argc,char**argv){ 	FILE* fp=NULL; 	fp=fopen("passwd.txt","r"); 	char buff[20]; 	int i; 	for(i=0;;i++){ 		memset(buff,0,sizeof(buff));  		if(fp==NULL) 			break;  		fgets(buff,20,fp); 		printf("%s",buff); 		char shell[200]; 		sprintf(shell,"/home/hht/workspeace/work1/ssh.sh %s %s",argv[1],buff); 		system(shell); 			} }  下面是shell  #!/usr/bin/expect -f set passwd $2 #密码 set host $1 #目标主机地址 set name root #用户名  spawn ssh $host -l $name expect "root@$host’s password:" send "$passwd\r"  send"uname\n" expect"LINUX" send_user"success"  expect"Permission denied,please try again." send_user"wrongnumber"

user: user-1
content: 网上使用字典暴力破解的源代码自己搜搜看。

user: user-2
content: 暴力破解好费时间的

user: user-3
content: 我也在想如何做，一直没有头绪

user: user-0
content: 是停费时间的，但是我需要做这样一个程序，毕竟从头做起嘛

user: user-0
content: 就是类似medusa那种功能，但是不用那么专业，只是来试验用
user-0 提问: 自己写了一个字符串连接函数，请问哪里错了

回复:
user: user-1
content: 问题：内存越界。  在你写的函数strcpy()里面， while(*pa!='\0') {      pa++; }  这里没问题。 问题是：后面的 while((*pa++=*pb)!='\0); 因为退出第一个循环后，你的pa指针就指向了字符串的结尾的'\0'，然后，第二个循环你还在让pa++,显然访问了不属于你这个字符串的内存，所以错误罗。 你难道不理解为什么 书上说strcpy()在使用时要确保第一个字符串参数要有足够的空间 ？理解一下。

user: user-2
content: 1. 主函数都有问题，a,b指向的是字符串常量，其指向的数据是只读的，不能更改的 2. while(*pa != '\0'){         pa++;     }     后par指向的值为‘\0’再往后++就越界了

user: user-3
content: char a[80] = "love"; char b[80] = "you";

user: user-4
content: char * a = "love";  char * b = "you"; //Text Segment | Read-Only

user: user-4
content: while((*pa++ = *pb++) != '\0'); //pa | over bounds | SIGSEGV

user: user-5
content: 不是连接函数有问题，是用法有问题，这个用法来调用标准的链接函数也会出问题的。

user: user-0
content: 上面是对pa++

user: user-6
content: while((*pa++ = *pb++) != '\0');  你已经在上面将pb++了，这时候pb已经在字符串的尾部，再对他进行操作，肯定就遇到‘\0’了啊，所以拷贝错误
user-0 提问: 能有位大神帮忙看一下小程序吗？很短的，可惜渣渣怎么都看不懂！感谢

回复:
user: user-1
content: 就是定义了一个结构体而已

user: user-2
content: typedf 是重命名 将结构体命名为T_POST_EVENT_TYPE
user-0 提问: 关于getchar和scanf的问题求助。。。

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

user: user-2
content: 程序运行第一遍的时候是没问题的，scanf读的是2 3 但之后有没有问题，得看你怎么输入了，getchar()能够读取任意字符，包括空格、回车，scanf只能读取规定格式的数据
user-0 提问: JNI中有关C语言指针的疑问

回复:
user: user-1
content: 引用 2 楼 ligenmt 的回复:[quote=引用 1 楼 user-1 的回复:] JNIEnv本身就是指针  哦！那您的意思是env其实是指针的指针了？[/quote] jni.h中  struct JNINativeInterface_; struct JNIEnv_; #ifdef __cplusplus typedef JNIEnv_ JNIEnv; #else typedef const struct JNINativeInterface_ *JNIEnv; #endif

user: user-0
content: 引用 1 楼 user-1 的回复:JNIEnv本身就是指针  哦！那您的意思是env其实是指针的指针了？

user: user-1
content: JNIEnv本身就是指针

user: user-0
content: 引用 3 楼 user-1 的回复:[quote=引用 2 楼 ligenmt 的回复:] [quote=引用 1 楼 user-1 的回复:] JNIEnv本身就是指针  哦！那您的意思是env其实是指针的指针了？[/quote] jni.h中  struct JNINativeInterface_; struct JNIEnv_; #ifdef __cplusplus typedef JNIEnv_ JNIEnv; #else typedef const struct JNINativeInterface_ *JNIEnv; #endif[/quote]  谢谢！
user-0 提问: 求大神帮解一道C语言

回复:
user: user-1
content: 7楼正解。除了一些比较常用的循环以外，基本不用++

user: user-2
content: 除了出题，其他情况用不到这种写法

user: user-3
content: 函数参数的求值顺序是没做定义的，所以楼主的那一次编译最后参数先编译，利用了i = 8 的初始值，而后面的都是些随机情况。 LZ请注意，C语言中只有4个运算符规定了求值顺序 （1） 逻辑与 “&&”  （2)逻辑或“ ||” （3）条件运算符 “？：”（4）逗号运算符“ ，”。 除此之外的都没做定义，需要我们适当使用括号或者分开来写。

user: user-4
content: 又是这种专牛角尖的题。 1.学生被考试害得不轻啊，你要是在面试的时候写这种代码，对不起，走人。 2.教学害得。IT更新多块，什么年代，还在写void main().   --->  int main (void)  解答一下： 这个主要是函数调用时，参数压栈顺序的问题。 函数的值是从右边往左压栈的。所以，副作用从printf(""          ) 的最右边开始。     printf("   xxxxx",++i    ,    i++,     --i     ,     i++     ,--i,       -i++      ,i--)                           (7)           (6)      (5)         (4)       (3)        (2)     (1) 先计算(1) 再(2) .。。。。。。 i++  ++i 这类问题的就看书吧。

user: user-5
content: 几乎没什么人会这么写,这么写的结果很依赖与编译器,你用DEV的话结果又会不一样. 这就是C/C++ . 很大程度上依赖于编译器厂商. 你要做的就是熟悉一个,了解这种差异 这有关于你的问题的详解.....也就是楼上说的顶置贴.......http://bbs.csdn.net/topics/370153775

user: user-6
content: 这种问题去看置顶帖 就算看不懂，只要知道不要这么写就可以了

user: user-7
content: 楼上正解，调用函数的时候，参数从左向右压栈

user: user-8
content: 在计算时，遇到x++会记录此时的x的值作为最后的输出结果。遇到x和++x的时候则不会将此时的计算结果作为最终的输出，只会修改x的值，在最终输出的时候都输出x的值。 对于i++的结果，是有ebp寻址函数栈空间来记录中间结果的，在最后给printf压栈的时候，再从栈中把中间结果取出来；而对于++i的结果，则直接压寄存器变量，寄存器经过了所有的自增操作。  在不同的编译器下结果不同

user: user-9
content: 只看到窗帘，没看到人，好黑。

user: user-10
content: 难道置顶帖放着都不看么？

user: user-11
content: 这个包含参数传递和++等运算符，而且与编译器相关，所以，楼主不要纠结这种问题的答案
user-0 提问: 问一个关于返回值的问题

回复:
user: user-0
content: 感谢各位的回答 问题已解决 就此结帖。

user: user-1
content: 调用函数，被调用函数，实参，形参你应该都清楚吧，这个就不解释其定义了； 看下你代码： #include <stdio.h> int main() {     int latitude = 32 ;     go_south_east(latitude);     printf("当前位置: [%i]\n",latitude);     return 0; } int go_south_east(int lat) {     lat = lat - 1;         return lat; } 你这里在主函数中调用函数int go_south_east（）并将latitude作为实参传递给形参lat，属于值传递，在这个值传递的过程中，发生了以下事情：形参lat是一个局部变量，存储在栈中，接收的值为实参latitude的值，那么请你思考一下两个变量latitude和lat存储在内存中的地址是否相同？说白了是不是指向同一内存空间？ 答案是：不是；不信你打印他们地址看一看，明白了这个就好理解其他的，另个存储在不同内存空间中的两个变量，你改变其中一个变量的值对另外一个有影响吗？肯定没有啊； 再来说说你返回lat，麻烦问一下，你返回lat作为被调用函数的返回值，可主函数中有接受返回值的变量吗？你都没有变量接受那么这个值肯定丢掉了啊；    你可以改成这样看看 latitude= go_south_east(latitude);

user: user-2
content: 楼主你调用函数的时候，使用的参数传递方式是值传递，所以实参是不会受形参的修改而改变的。 另外，你在被调用的函数中是用返回值来表示结果的，所以如果你想得到结果应该用楼上的方式，把返回值保存下来再用。

user: user-3
content: 把返回值接收下，就行，如 latitude = go_south_east(latitude);

user: user-4
content: 1楼的是c++代码，不是c 楼主再仔细看看c语言参数传递那一部分吧

user: user-0
content: @user-5 我不是很明白 能详细说一下么

user: user-5
content: int go_south_east(int& lat)
user-0 提问: Linux下C语言数组用sscanf问题？？

回复:
user: user-1
content: 过早的优化是万恶之源。  但填表式排版还是要用的。 http://bbs.csdn.net/topics/380157851    //get操作          if(strcmp(rectype,"id210")==0) printf("%d\n",a_1  );     else if(strcmp(rectype,"id220")==0) printf("%d\n",a_2  );     else if(strcmp(rectype,"id230")==0) printf("%d\n",a_3  );     ......     else if(strcmp(rectype,"id999")==0) printf("%d\n",a_300);     //set操作          if(strcmp(rectval,"id210")==0) a_1  =recval;     else if(strcmp(rectval,"id220")==0) a_2  =recval;     else if(strcmp(rectval,"id230")==0) a_3  =recval;     ......     else if(strcmp(rectval,"id999")==0) a_300=recval;

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  程序有两个文件，一个a程序一个b声明变量的外部文件，a通过include引用b; html通过ajax请求到a程序，通过接收到的参数来判断引用b文件中哪一个变量。 sscanf("%[^=]=%s",rectype,recval); 如果是get操作只需要recval，如果是set就需要rectype，recval两个局部变量。 现在我用的if判断，如果几百条的话是不是太麻烦了该怎么优化？？ 麻烦了，多谢。。。。 代码如下： b.h  	int a_1; 	int a_2; 	int a_3; 	int a_4; 	...... 	int a_300;           a.c     //get操作 	if(strcmp(rectype,"id210")==0){ 		printf("%d\n",a_1); 	}else if(strcmp(rectype,"id220")==0){ 		printf("%d\n",a_2); 	}else if(strcmp(rectype,"id230")==0){ 		printf("%d\n",a_3); 	} 	...... 	else if(strcmp(rectype,"id999")==0){ 		printf("%d\n",a_300); 	}      //set操作 	if(strcmp(rectval,"id210")==0){ 		a_1=recval; 	}else if(strcmp(rectval,"id220")==0){ 		a_2=recval; 	}else if(strcmp(rectval,"id230")==0){ 		a_3=recval; 	} 	...... 	else if(strcmp(rectval,"id999")==0){ 		a_300=recval; 	}

user: user-0
content: 引用 3 楼 user-2 的回复:[quote=引用 2 楼 GZQ0821 的回复:] 第一位数组data[0]就可以，后面data[1],data[2]。。。就不行了，怎么解决？？ 来 看我口型 跟着我读 因为很重要所以读三次 能输出是运气好  能输出是运气好  能输出是运气好   data[0] 只是 "运气好"  你的错误是野指针 怎么纠正野指针 自己百度[/quote] 谢谢，改为字符数组就可以了！另外，还有一个问题： 程序有两个文件，一个a程序一个b声明变量的外部文件，a通过include引用b; html通过ajax请求到a程序，通过接收到的参数来判断引用b文件中哪一个变量。 sscanf("%[^=]=%s",rectype,recval); 如果是get操作只需要recval，如果是set就需要rectype，recval两个局部变量。 现在我用的if判断，如果几百条的话是不是太麻烦了该怎么优化？？ 麻烦了，多谢。。。。 代码如下： b.h  	int a_1; 	int a_2; 	int a_3; 	int a_4; 	...... 	int a_300;              //get操作 	if(strcmp(rectype,"id210")==0){ 		printf("%d\n",a_1); 	}else if(strcmp(rectype,"id220")==0){ 		printf("%d\n",a_2); 	}else if(strcmp(rectype,"id230")==0){ 		printf("%d\n",a_3); 	} 	...... 	else if(strcmp(rectype,"id999")==0){ 		printf("%d\n",a_300); 	}      //set操作 	if(strcmp(rectval,"id210")==0){ 		a_1=recval; 	}else if(strcmp(rectval,"id220")==0){ 		a_2=recval; 	}else if(strcmp(rectval,"id230")==0){ 		a_3=recval; 	} 	...... 	else if(strcmp(rectval,"id999")==0){ 		a_300=recval; 	}

user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 引用 2 楼 GZQ0821 的回复:第一位数组data[0]就可以，后面data[1],data[2]。。。就不行了，怎么解决？？ 来 看我口型 跟着我读 因为很重要所以读三次 能输出是运气好  能输出是运气好  能输出是运气好   data[0] 只是 "运气好"  你的错误是野指针 怎么纠正野指针 自己百度

user: user-0
content: 引用 1 楼 user-2 的回复:char *rectype,*recval; 这两个是野指针  能输出是运气好 不能输出是常见现象  有时候还会崩溃 第一位数组data[0]就可以，后面data[1],data[2]。。。就不行了，怎么解决？？

user: user-2
content: char *rectype,*recval; 这两个是野指针  能输出是运气好 不能输出是常见现象  有时候还会崩溃
user-0 提问: 怎么把txt中的数据存入数组中

回复:
user: user-1
content: 把原文件文件粘一部分出来，不要用图片，我需要复制数据

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

回复:
user: user-1
content: s是优先队列, 在stl中就是堆了, 通常是建立大顶堆, 这里用的greater, 就是小顶堆, s.top指的就是当前最小的元素

user: user-2
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-0
content: 来人来人来人吧

user: user-0
content: 求解求解求解～
user-0 提问: 关于cpu的流水线，为何写寄存器在时钟周期的前半段，而读寄存器在后半段

回复:
user: user-1
content: 因为必须先存入上一个指令的值，然后才可以读从寄存器文件中读取下一个指令的值

user: user-2
content: 那就不能上条指令写完后再开始本条指令读吗？
user-0 提问: vfork创建子进程，子进程退出后释放内存空间

回复:
user: user-0
content: 昨天才知道了真正的原因，当case0结束后使用的是break，最后没有执行任何语句，则最后退出时默认使用return来退出，而return相当于一个函数的退出，一个函数的退出会释放局部变量，也就是栈内存中的变量，所以会产生这样的结果，而如果在最后使用exit退出则不会释放栈内存，大概就这样，关于进程的退出，可以看我的博客 blog.csdn.net/zhuxinquan61/article/details/47143313

user: user-1
content: 楼主做些尝试了解vfork是可以的，但是vfork只应该调用exec族函数和_exit, 而且不能修改任何变量(接收vfork返回值的变量除外)，否则结果是不确定的。 NAME      vfork - create new process; share virtual memory    SYNOPSIS        #include <unistd.h>      pid_t vfork(void);   DESCRIPTION      The vfork() function has the same effect as fork(), except that the behaviour is undefined if the process created by vfork() either modifies any data other than a variable of type pid_t used to store the return value from vfork(), or returns from the function in which vfork() was called, or calls any other function before successfully calling _exit() or one of the exec family of functions.

user: user-2
content: 百度百科的解释：  子进程在vfork()返回后直接运行在父进程的栈空间，并使用父进程的内存和数据。这意味着子进程可能破坏父进程的数据结构或栈，造成失败。 为了避免这些问题，需要确保一旦调用vfork()，子进程就不从当前的栈框架中返回，并且如果子进程改变了父进程的数据结构就不能调用exit函数。子进程还必须避免改变全局数据结构或全局变量中的任何信息，因为这些改变都有可能使父进程不能继续。

user: user-0
content: 最后我又做了尝试，因为子进程是在break;之后退出的，算作是非正常退出，在其后添加exit(0)之后就不会出现这种随机数了，也就是说，虽然子进程同样会改变父进程使用的变量的值，但是随机数的出现并非是内存释放，而是异常退出导致子进程的数据不正常，也就顺带导致了父进程内存区域的值的改变
user-0 提问: C语言main函数char数组的问题

回复:
user: user-1
content: 输入一个字符串，都是把地址传给printf啊，不过，也可以遍历输出。如 char arr[] = "asdfsd"; printf("%s\n", arr); arr就是数组的首地址。 当采用%s输出字符串时，函数printf通过字符串的首地址和’\0‘来确定其范围

user: user-2
content: 基本功不扎实

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

user: user-4
content: 这种叫格式化输出。C规定，如果是%s就要把输出对象当作字符串。我们知道，字符串实际上是带串尾符的字符数组，所以字符串的指针实际上就是这个数组的首地址。输出时，就顺次把字符全部输出了。

user: user-5
content: %s对应字符串,字符串的值就是其首地址.
user-0 提问: 【C语言】关于typedef 对结构变量的用法

回复:
user: user-1
content: typedef   就是把一种类型定义 成另外一个名字而已 struct LNode{ Elemtype date; struct LNode* next; } 就是一个结构体定义 类似于  { typedef   int INT，*PINT； 等价于 typedef   int INT； typedef   int *PINT；  然后理解INT  i；   就是  int i； PINT  p      ；  就是int　＊ｐ；就行了 }

user: user-2
content: typedef 结构体 自定义名 然后那个自定义名就等同那个结构体

user: user-3
content: LNode还是LNode，LinkList是LNode*的别名。 以下声明等效：LinkList a;  LNode* a;
user-0 提问: C语言结构体数组遍历

回复:
user: user-1
content: struct Name {     const int Base_Class1;     const int  Sub_Class1;     const int  Interface1;     const char  *Meaning1; } mean[17]={     {0x00,0x00,0x00,"All currently implemented devices"},     {0x00,0x01,0x00,"VGA-compatible device"},     {0x01,0x01,0x80,"IDE controller"},     {0x01,0x80,0x00,"Other mass storage controller"},     {0x02,0x00,0x00,"Ethernet controller"},     {0x02,0x80,0x00,"Other network controller"},     {0x03,0x00,0x00,"VGA-compatible controller"},     {0x03,0x80,0x00,"Other display controller"},     {0x06,0x00,0x00,"Host bridge"},     {0x06,0x01,0x00,"ISA bridge"},     {0x06,0x04,0x00,"PCI-to-PCI bridge"},     {0x06,0x04,0x01,"Subtractive Decode PCI-to-PCI bridge"},     {0x06,0x07,0x00,"CardBus bridge"},     {0x0c,0x00,0x10,"IEEE 1394 OpenHCI"},     {0x0c,0x03,0x00,"USB Universal Host Controller"},     {0x0c,0x03,0x20,"Intel USB2 Enhanced Host Controller"},     {0x0c,0x05,0x00,"SMBus"}, }; int i; for (i=0;i<17;i++)     if (Base_Class == mean[i].Base_Class1      &&  Sub_Class == mean[i]. Sub_Class1      &&  Interface == mean[i]. Interface1) break; if (i<17) puts(mean[i].Meaning1); else printf("%s\t","Unknow Device");

user: user-2
content: for(i=0;i<17;i++) {     if(Base_Class == mean[i].Base_Class1 && Sub_Class == mean[i].Sub_Class1 && Interface == mean[i].Interface1)     {         puts(mean[i].Meaning1);         break;     } } if(i == 17)     printf("%s\t","Unknow Device");

user: user-0
content: 这不对吧？不知道你理解我程序想做什么么？

user: user-3
content: BOOL bl =flase; for() { if(true) { bl = true; break; } }  if(!bl) {printf(); }
user-0 提问: 如何将数字字符串转为16进制字符串？

回复:
user: user-1
content: 没有最好，只有更好！ //如何将数字字符串转为16进制字符串？ //字符串：char str[20]=“1234567890123456”; //将中间的“789012”转换为16进制的“0C0A14”； //最后str="1234560C0A143456" #include <stdio.h> int main() {     char str[20]="1234567890123456";     int v;     char c;      sscanf(str+6,"%6d",&v);     c=str[12];     sprintf(str+6,"%06X",v);     str[12]=c;     printf("[%s]\n",str);      return 0; } //[1234560C0A143456] //

user: user-0
content: 非常感谢，写的太好了。

user: user-2
content: 转换：      char src[] = "789012";     int srclen = strlen(src);      int a = atoi(src);      char format[256];     sprintf(format, "%%0%dX", srclen);      char dest[256];     sprintf(dest, format, a);
user-0 提问: 一个宏的笔试题帮我看看！

回复:
user: user-1
content: 引用 2 楼 fly_dragon_fly 的回复:直接展开 ++Z ++Y*X/2 ++X+3*X/2 ++a%4+3*a%4/2 展开后存在求值顺序问题, 不对答案作评价 引用 9 楼 lin5161678 的回复:题目是错的 结果没有意义  看置顶帖 ++

user: user-2
content: 引用 7 楼 zhangxiangDavaid 的回复:[quote=引用 5 楼 w2276190 的回复:] ++a%4+3*a%4/2 宏 直接替换，然后看优先级 * / % +  ++  所以+后面是（3*10）%（4/2）=0 然后算 a%4=10%4=2 ++2=3. 新手共同进步，这个主要考的是优先级的，你可以再看看优先级的资料，记住就行了。 ++优先级高于*[/quote] 谢谢提醒。

user: user-0
content: 引用 6 楼 baidu_30054729 的回复:++a%4+3*a%4/2 第一步++a = 11； a = 11； 第二步:++a%4 = 3； //第一部分值为3 第三步：3*11%4/2 = 0;  //计算就出来了 3+0=3 优先级很多，主要看他是几元运算符，++只有一个操作数，优先级就高。 感谢！

user: user-0
content: 引用 7 楼 zhangxiangDavaid 的回复:[quote=引用 5 楼 w2276190 的回复:] ++a%4+3*a%4/2 宏 直接替换，然后看优先级 * / % +  ++  所以+后面是（3*10）%（4/2）=0 然后算 a%4=10%4=2 ++2=3. 新手共同进步，这个主要考的是优先级的，你可以再看看优先级的资料，记住就行了。 ++优先级高于*[/quote]你的这种算法不理解，* / %是同级的

user: user-3
content: 看了置顶帖这个问题就没有意义了 不过，如果是做题的话，把计算优先级搞清楚就好 如果是自己写代码，你确定类似这种代码提交上去不罚款？

user: user-4
content: 题目是错的 结果没有意义  看置顶帖

user: user-5
content: %的优先级与乘除是一样的呀

user: user-6
content: 引用 5 楼 w2276190 的回复:++a%4+3*a%4/2 宏 直接替换，然后看优先级 * / % +  ++  所以+后面是（3*10）%（4/2）=0 然后算 a%4=10%4=2 ++2=3. 新手共同进步，这个主要考的是优先级的，你可以再看看优先级的资料，记住就行了。 ++优先级高于*

user: user-7
content: ++a%4+3*a%4/2 第一步++a = 11； a = 11； 第二步:++a%4 = 3； //第一部分值为3 第三步：3*11%4/2 = 0;  //计算就出来了 3+0=3 优先级很多，主要看他是几元运算符，++只有一个操作数，优先级就高。

user: user-2
content: ++a%4+3*a%4/2 宏 直接替换，然后看优先级 * / % +  ++  所以+后面是（3*10）%（4/2）=0 然后算 a%4=10%4=2 ++2=3. 新手共同进步，这个主要考的是优先级的，你可以再看看优先级的资料，记住就行了。

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:直接展开 ++Z ++Y*X/2 ++X+3*X/2 ++a%4+3*a%4/2 展开后存在求值顺序问题, 不对答案作评价 算下来答案怎么都应该是4,啊，你算了多少？

user: user-8
content: 楼上正解！！！！

user: user-9
content: 直接展开 ++Z ++Y*X/2 ++X+3*X/2 ++a%4+3*a%4/2 展开后存在求值顺序问题, 不对答案作评价

user: user-10
content: 全部展开 printf ("%d", ++a％4+3*a%4/2);
user-0 提问: 哪位大牛帮忙看下这个

回复:
user: user-0
content: 那这应该是我的机子问题了，可是问题出在哪啊。。

user: user-1
content: 本机测试, 无任何问题 另外: 1:  char result[1024 * 40] = "";  没错, 将第一个字节置0;          不过, 将 40K 的大小作局部变量放在栈中真的合适么, 不怕溢出? 2:  	   char buffer[1024] ;  if (fgets(buffer, 1280, pipe)) //   怎么超过分配在大小了

user: user-2
content: 引用 1 楼 user-4 的回复:see_ip 中 char result[1024 * 40] = "";  改成 char result[1024 * 40] = {0}; ""; 指向一个常量地址， 常量地址不能被赋值， 调用execmd报错 不要误导别人好不好，看清楚什么才叫常量指针	char* cbuf = "123456"; 	char vbuf[] = "123456";

user: user-0
content: 多谢两位。。我去试试

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

user: user-4
content: see_ip 中 char result[1024 * 40] = "";  改成 char result[1024 * 40] = {0}; ""; 指向一个常量地址， 常量地址不能被赋值， 调用execmd报错
user-0 提问: gcc抽风了， gcc搜索库目录的路劲是哪一个？

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

回复:
user: user-0
content: 引用 3 楼 zhangxiangDavaid 的回复:引用是C++中的概念，你得用C++编译器编译试试。 非常感谢

user: user-1
content: 引用是C++中的概念，你得用C++编译器编译试试。

user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:void increase_SqListlength(SqList &L)这是引用，要使用指针，才可以传地址。 谢谢，如果是传递引用的话，这个代码有啥错啊

user: user-1
content: void increase_SqListlength(SqList &L)这是引用，要使用指针，才可以传地址。
user-0 提问: linux 下的open的用法请教

回复:
user: user-1
content: 错了，unmask屏蔽是022，即000 010 010，那么它的权限码就是取反得到 111 101 101，对应八进制是755。 这个时候做&操作：  111 101 101 &100 000 001 -----------------------  100 000 001得到八进制权限码401，与你系统运行的结果一致。
user-0 提问: [leetcode]的题目“Best Time to Buy and Sell Stock”

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:tmp = (int*)malloc(pricesSize *sizeof(*tmp)); 呀，太脑残了，真想抽自己。多谢

user: user-1
content: tmp = (int*)malloc(pricesSize *sizeof(*tmp));
user-0 提问: 【新人求助】关于main函数的疑惑

回复:
user: user-1
content: 返回值是给操作系统中的一个叫加载程序看的。

user: user-2
content: 谁调用谁看了

user: user-3
content: 引用 7 楼 wplink 的回复:[quote=引用 5楼mewiteor 的回复:]在shell中：./你的程序&&echo 运行成功||echo 运行失败 并且: windows下cmd中的%errorlevel% linux下shell中的$? 都是上次程序的返回值能否说详细点？ 我看的视频也是这段话 由于初学自学 我看不懂 所以才过来提问的 烦请指教 不甚感激[/quote]  这个表达式的意思是，  nRet && echo true || echo false  nRet 是0，则 echo true  否则echo false。  nRet---是程序执行的返回值。   命令可以连接在一起的。  ./test.exe && echo true || echo false;  ./test.exe会有返回值。

user: user-0
content: 引用 5楼mewiteor 的回复:在shell中：./你的程序&&echo 运行成功||echo 运行失败 并且: windows下cmd中的%errorlevel% linux下shell中的$? 都是上次程序的返回值能否说详细点？ 我看的视频也是这段话 由于初学自学 我看不懂 所以才过来提问的 烦请指教 不甚感激

user: user-4
content: 可以根据其返回值来判断进程是否正常运行

user: user-5
content: 这个返回值可以通过 GetExitCodeProcess 来获取 获取后你可以根据其返回值来判断进程是否正常运行  如果在编译器中 F5 运行, 则在"输出"栏会直接显示该返回值

user: user-5
content: 给你自己看的, 一般在 main 函数中会调用一系列初始化函数 理想情况下所有函数调用正常, 没有错误发生则 main 可以返回一个你自己定义的无错误的值 如果有错误发生, 那么你可以根据其返回值判断是那一步出错  这些返回值是由你自己定义的, 一般没什么特殊情况下开发工具默认生成的代码都会返回0 因为它不知道你需要什么样的返回值, 如果你自己定义了返回值, 改过来就是了  #define MAINRTN_NOERROR 1 #define MAINRTN_FUNC1ERR 2 #define MAINRTN_FUNC2ERR 3 #define MAINRTN_FUNC3ERR 4  int main {     if (xxx != xxx) return MAINRTN_FUNC1ERR;     if (xxxx != xxxx) return MAINRTN_FUNC2ERR;     if (xxxxx!= xxxxx) return MAINRTN_FUNC3ERR;      // 没有错误发生     return MAINRTN_NOERROR }

user: user-6
content: 受教了，原来main函数都有这么多的学问

user: user-7
content: 在shell中：./你的程序&&echo 运行成功||echo 运行失败 并且: windows下cmd中的%errorlevel% linux下shell中的$? 都是上次程序的返回值

user: user-8
content: 当其他文件要调用这条main()时依靠返回判断文件是否是正常运行。
user-0 提问: linux 的read(0,,)问题

回复:
user: user-0
content: 引用 1 楼 zhangxiangDavaid 的回复:可能是没在当前目录下查找   hello  there  必须是程序？

user: user-1
content: 查找可执行程序

user: user-1
content: 可能是没在当前目录下查找
user-0 提问: 关于getchar、putchar

回复:
user: user-1
content: 引用 5 楼 Real_Bird 的回复:[quote=引用 2 楼 user-2 的回复:] #include<stdio.h> int main() { 	int i; 	for(i=0;i<256;++i) 		printf("%3d:%c\n",i,i); 	return 0; } 整型转换为字符型是问号？[/quote]asc码1是“SOH(start of headline) 标题开始”，在控制台上，对于无法输出的字符，统一使用问号显示。

user: user-1
content: 引用 4 楼 Real_Bird 的回复:[quote=引用 3 楼 Real_Bird 的回复:] [quote=引用 1 楼 Falleyes 的回复:] 错误的，当你使用不加括号的，c的值会是0或者1，但是putchar是根据asc码输出字符啊。输出的应该是asc码0和1对应的字符。 你要是输出0或者1，应该putchar(c+'0')或者使用printf("%d",c);  为什么这两个输出的都是两个1呢  是回车的原因吗[/quote] 还有c+‘0’是把c加上0的asc码吗  这么用是什么意思[/quote]是的，这种是输出数字对应字符的方法。

user: user-1
content: 引用 3 楼 Real_Bird 的回复:[quote=引用 1 楼 Falleyes 的回复:] 错误的，当你使用不加括号的，c的值会是0或者1，但是putchar是根据asc码输出字符啊。输出的应该是asc码0和1对应的字符。 你要是输出0或者1，应该putchar(c+'0')或者使用printf("%d",c);  为什么这两个输出的都是两个1呢  是回车的原因吗[/quote]是的，回车也是字符，只要不是EOF就会输出1

user: user-2
content: 引用 5 楼 Real_Bird 的回复:[quote=引用 2 楼 user-2 的回复:] #include<stdio.h> int main() { 	int i; 	for(i=0;i<256;++i) 		printf("%3d:%c\n",i,i); 	return 0; } 整型转换为字符型是问号？[/quote]你主要看一下putchar(1)是什么结果。

user: user-0
content: 引用 2 楼 user-2 的回复:#include<stdio.h> int main() { 	int i; 	for(i=0;i<256;++i) 		printf("%3d:%c\n",i,i); 	return 0; } 整型转换为字符型是问号？

user: user-0
content: 引用 3 楼 Real_Bird 的回复:[quote=引用 1 楼 Falleyes 的回复:] 错误的，当你使用不加括号的，c的值会是0或者1，但是putchar是根据asc码输出字符啊。输出的应该是asc码0和1对应的字符。 你要是输出0或者1，应该putchar(c+'0')或者使用printf("%d",c);  为什么这两个输出的都是两个1呢  是回车的原因吗[/quote] 还有c+‘0’是把c加上0的asc码吗  这么用是什么意思

user: user-0
content: 引用 1 楼 Falleyes 的回复:错误的，当你使用不加括号的，c的值会是0或者1，但是putchar是根据asc码输出字符啊。输出的应该是asc码0和1对应的字符。 你要是输出0或者1，应该putchar(c+'0')或者使用printf("%d",c);  为什么这两个输出的都是两个1呢  是回车的原因吗

user: user-2
content: #include<stdio.h> int main() { 	int i; 	for(i=0;i<256;++i) 		printf("%3d:%c\n",i,i); 	return 0; }

user: user-1
content: 错误的，当你使用不加括号的，c的值会是0或者1，但是putchar是根据asc码输出字符啊。输出的应该是asc码0和1对应的字符。 你要是输出0或者1，应该putchar(c+'0')或者使用printf("%d",c);
user-0 提问: linux下的系统调用和api有到底有什么区别？

回复:
user: user-1
content: 引用 4 楼 caddor9100 的回复:[quote=引用 3 楼 user-1 的回复:] 有些早期几乎每个编译器都实现了的库函数，没有进入标准库。  你如果使用过man手册，你肯定有印象：  man 1---系统命令 man 2---内核（包括系统调用） man 3---c库  那么api 在man number?   按照man的用法一分，似乎api 在man 2里了。 [/quote]标准库中 stdio.h 中输入输出函数，基本就是对一部分系统调用（API）的封装。 很多编译器的 io.h 中，部分库函数，基本就是 一部分其他系统调用（API）的封装，这部分好像不属于标准库。 man 命令，是UNIX linux 的帮助系统，内核（包括系统调用）基本上对应与API 之所以，API（系统调用），和库函数，关系这么复杂，是因为，标准化，没有吸收所有 unix 库函数（即早期编译器库函数） 而每个编译器，又都增加了自己扩展函数

user: user-1
content: 结论： UNIX，linux  有一部分库函数，是系统调用，或者系统调用的某种简单封装 一部分是，其他标准库函数， 一部分是编译器扩展库函数 。  windows  SDK,DDK，API 都是独立于编译器的 系统库函数，相当于UNIX，linux的某些系统调用。 而，标准库，封装了一部分 API（系统调用），以及一些常用函数。 通常编译器，另外在库中额外提供一些，同样比较常用的，没有进入标准库的扩展库函数。  widows，DOS 操作系统，和编译器是分家的，微软对二者是分别卖钱的。 UNIX，linux则至少提供一个缺省的，和操作系统一起发行的C编译器，供用户使用。 这是二者一个区别。

user: user-0
content: 引用 3 楼 user-1 的回复:有些早期几乎每个编译器都实现了的库函数，没有进入标准库。  你如果使用过man手册，你肯定有印象：  man 1---系统命令 man 2---内核（包括系统调用） man 3---c库  那么api 在man number?   按照man的用法一分，似乎api 在man 2里了。

user: user-1
content: 有些早期几乎每个编译器都实现了的库函数，没有进入标准库。

user: user-1
content: UNIX是和C共生的，linux 是Unix的某种变体 早期的C库，基本就是unix 系统调用，和一些常用函数库（数学库，字符串库等等）。  后来C因为可移植性好，广泛流传，DOS 上就有四大编译器。 由于，广泛流传，所以后来为了统一和可移植性，就制定了标准。 某些库函数，被标准化了，成了标准库的一部分，另一些没有。 标准化的这一部分，就可以用于任何执行标准的编译器，包括DOS和Windows 上的. 没标准化的部分，只能是unix,linux 专用，其他操作系统上的编译器，也有可能部分自己专用库，或者该操作系统专用库 而操作系统，年最核心功能部分的库函数，unix,linux 就是系统调用（听说是X86 上是 int 80中断啥的）。 DOS是 int21中断，Windows 是API,SDK,DDK等。  有些系统调用，和API 被封装到标准库了，有些没有。
user-0 提问: 新人求助   如何搭建C语言环境

回复:
user: user-1
content: http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装

user: user-2
content: 下载http://sourceforge.net/projects/codeblocks/files/Binaries/13.12/Windows/codeblocks-13.12mingw-setup-TDM-GCC-481.exe，直接安装就好了。

user: user-3
content: 学个 C 语言而已，为什么要去安装 VS 这么庞然大物？可试试以下软件： Pelles C for Windows 8.00 英文版（仅支持 C 语言，内置编译器和 Windows 头文件、对话框设计器）： http://www.smorgasbordet.com/pellesc/800/setup.exe http://www.smorgasbordet.com/pellesc/800/setup64.exe C-Free 官方下载页面（中文，仅开发环境，需要自己下载独立编译器配置，根据编译器的不同可支持 C/C++）： http://programarts.com/cfree_ch/download.htm 上面的软件都是十几 MB 左右的大小，对于新手而言，安装动辄几百兆数 GB 的 VS 意义不大。 Code::Blocks Windows 版（支持 C/C++，英文界面，分为仅 IDE 版本和集成 GCC 版本，均可再配置其他编译器）： 仅 Code::Blocks IDE，需自行配置编译器： http://sourceforge.net/projects/codeblocks/files/Binaries/13.12/Windows/codeblocks-13.12-setup.exe/download Code::Blocks IDE + TDM GCC 编译环境： http://sourceforge.net/projects/codeblocks/files/Binaries/13.12/Windows/codeblocks-13.12mingw-setup-TDM-GCC-481.exe/download 大小均不超过 100MB。

user: user-4
content: http://www.visualstudio.com

user: user-5
content: 新手的话，windows下用集成开发环境吧，codeblocks或者楼上说的vc（个人不推荐vc）。这两个开发环境比较小，能满足你的现在的需要。vs比较大，但是也可以试一试。 如果是linux下的话，下载gcc编译器（有的会随系统附带），用记事本写代码，终端调用编译器编译。

user: user-6
content: VC就行 当然，VS也可以  其他也有一些，比如eclipse