Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 两个关联页面的动态数据抓取

回复:
user: user-1
content: public string flightSearch(string oneway,string orgcity,string dstcity,string flightdate)         {             string Url = "https://www.urumqi-air.com/flight/searchflight!getFlights.action";             //string Referer = "https://www.urumqi-air.com/flight/searchflight.action?tripType="+oneway+"&orgCity1="+orgcity+"&dstCity1="+dstcity+"&flightdate1="+flightdate+"&flightdate2=";             string PostData = "<flight><tripType>"+oneway+"</tripType><orgCity1>"+orgcity+"</orgCity1><dstCity1>"+dstcity+"</dstCity1><flightdate1>"+flightdate+"</flightdate1><index>1</index></flight>";             string flights = post(Url, PostData);             return flights;         }   public string post(string url, string str)         {             HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create(url);             req.Method = "POST";             req.Host = "www.urumqi-air.com";             req.UserAgent = "Mozilla/5.0 (Windows NT 6.1; rv:41.0) Gecko/20100101 Firefox/41.0";             req.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8";             //req.Referer = refer;             byte[] buf = Encoding.UTF8.GetBytes(str);             req.ContentLength = buf.Length;             using (Stream s = req.GetRequestStream())             {                 s.Write(buf, 0, buf.Length);             }             HttpWebResponse resp = (HttpWebResponse)req.GetResponse();             using (Stream s = resp.GetResponseStream())             {                 using (StreamReader sr = new StreamReader(s))                 {                     return sr.ReadToEnd();                 }             }         }

user: user-0
content: 比如：http://www.urumqi-air.com/ 打开后选择搜索数据   点击搜索   跳转到另一个页面    获得跳转后的页码的数据  才学习这个  不怎么懂  希望具体的思路和操作问题给我解析一下    小弟感激不尽
user-0 提问: 关于C语言函数返回指向局部字符数组问题

回复:
user: user-1
content: 这是一种不确定行为，你输出的值和函数中的一样只能说明他该值还未被其他值覆盖，如果你调用其他函数等，之前指针所指的内存可能就被其他数据覆盖了，所以不要返回局部变量的指针

user: user-2
content: 错误的程序可以得到任何结果。包括你期望看到的和不期望看到的结果。
user-0 提问: Unicode UTF-8 gb2312 字符集 

回复:
user: user-1
content: // UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89

user: user-2
content: utf8 中文是 3 个字节。  unicode 现在应该是可以到 0x1FFFFF 吧。utf16 用 2 个或 4 个字节(surrogate pairs) ，utf32 全是 4 个字节。  unicode 本身不是一种编码。
user-0 提问: 如何用C语言实现读取某txt文档并在有数字的地方自动换行的功能?

回复:
user: user-1
content: 你总需要找到一个可以用来确认你要换行的判断方法 比如你可以把全部字符串读入，然后遍历查找数字,且数字之后为'.' 的，满足条件的插入\r\n 当然也可以直接用一些支持正则表达式的文本工具直接替换

user: user-0
content: 引用 3 楼 my_live_123 的回复:方案： 1.打开文本文件，创建新的临时文件并打开 2.逐个字符复制，当遇到数字时，向临时文件添加一个换行符 3.重复2直到所有文本处理完成！ 4.修改临时文件名，此文件就是你需要的文件，保留原文件不动！  思路不对。第二步遇到数字就添加换行符不对，因为文本中的数字，不一定全都是序号，也有可能有的数字是文本内容之一。比如抓住这5个要点去做事中的5.

user: user-2
content: 正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549

user: user-2
content: 引用 7 楼 zhao4zhong1 的回复:凡是？。！后面跟1～1000后面跟半角.的，在？。！后面加回车换行。 //凡是？。！后面跟1～1000后面跟半角.的，在？。！后面加回车换行。 //in.txt: //1.测试。2.测试2？3.测试3！4.测试 //四。5.测试。6.测试6？7.测试3！8.测试 //运行该程序将输出重定向到比如out.txt即可将输出保存到文件out.txt中 #include <iostream> #include <fstream> #include <string> #include <regex> using namespace std; int main() {     wifstream wifs("in.txt");     wifs.imbue(locale("chs"));     wstring wstr(L""),wln;     while (wifs) {         getline(wifs,wln);         wstr+=wln;     }     wifs.close();     wcout.imbue(locale("chs"));     wcout << wstr << endl;      wstring rs = L"([？。！])(\\d{1,3}\\.)";     wregex expression(rs);     wstr = regex_replace(wstr, expression, wstring(L"$1\r\n$2"));     wcout << wstr << endl;      return 0; } //1.测试。2.测试2？3.测试3！4.测试四。5.测试。6.测试6？7.测试3！8.测试 //1.测试。 //2.测试2？ //3.测试3！ //4.测试四。 //5.测试。 //6.测试6？ //7.测试3！ //8.测试 //

user: user-2
content: 凡是？。！后面跟1～1000后面跟半角.的，在？。！后面加回车换行。

user: user-3
content: 引用 4 楼 czrzyy 的回复:[quote=引用 3 楼 my_live_123 的回复:] 方案： 1.打开文本文件，创建新的临时文件并打开 2.逐个字符复制，当遇到数字时，向临时文件添加一个换行符 3.重复2直到所有文本处理完成！ 4.修改临时文件名，此文件就是你需要的文件，保留原文件不动！  思路不对。第二步遇到数字就添加换行符不对，因为文本中的数字，不一定全都是序号，也有可能有的数字是文本内容之一。比如抓住这5个要点去做事中的5.[/quote]  思路是对的，只是条件不同而已！比对条件增强一下就是了，比如需要严格判定“5.“

user: user-3
content: 方案： 1.打开文本文件，创建新的临时文件并打开 2.逐个字符复制，当遇到数字时，向临时文件添加一个换行符 3.重复2直到所有文本处理完成！ 4.修改临时文件名，此文件就是你需要的文件，保留原文件不动！

user: user-4
content: 假如你只是要处理文件,可以用notepad++  学一下正则表达式. 编程的话,以下代码,只是  后面没标点,原txt在行尾处有看不见的换行符没处理. #include <stdio.h>  int fw(char *filename) { 	FILE *fp; 	char ch; 	long n; 	n = 0; 	if((fp = fopen( filename , "r+")) == NULL) 		return -1; 	fseek(fp,3L,SEEK_SET); 	while((ch = fgetc(fp)) != EOF) 	{ 		if(ch < 48 || ch > 57) 			continue; 		else 		{ 			for(n = 1 ; (ch = fgetc(fp)) > 47 && ch < 58 ;n++); 			if(ch != 46) 				continue; 			else 				{ 					fseek(fp,-1 * (n + 3L),SEEK_CUR); 					fputc('\n',fp); 					fseek(fp,n + 5L,SEEK_CUR); 				} 		} 	} 	return fclose(fp); } int main (void) { 	char filename[10] = {'\0'}; 	printf("please input the filename:"); 	gets(filename); 	fw(filename) == 0 ? printf("\n操作成功!\n") : printf("\n操作失败!\n" ); 	return 0; } 仅供参考.
user-0 提问: 一个printf都能改变计算的值，搞不懂。。。

回复:
user: user-1
content: 我在linux上测试，并没有楼主这样的问题。

user: user-2
content: 很高深啊，vc的汇编是什么意思啊

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执行停在该断点处的时候。

user: user-4
content: 输出只是从存储区读取数据怎么能影响数据的值呢？ 是向整形强转时导致的！不是printf影响的！

user: user-5
content: 浮点误差  引用 3 楼 qq_32874397 的回复:我在奇怪为什么不是9.0000....

user: user-6
content: 我在奇怪为什么不是9.0000....

user: user-7
content: 引用 9 楼 fefe82 的回复:[quote=引用 8 楼 paschen 的回复:] [quote=引用 7 楼 fefe82 的回复:] 贴编译结果的汇编吧 ...  VC6上确实有这个问题 VS上用的是xmm寄存器，而VC6不是  [/quote]  没有 printf 的话，估计没有 fst 和 fld 这两步。结果就不同了。[/quote]    如果有printf，c=(int)b; 这一句是从内存里取回b的值，没有prinf则直接用寄存器中的，应该是这里导致的

user: user-5
content: 引用 8 楼 paschen 的回复:[quote=引用 7 楼 fefe82 的回复:] 贴编译结果的汇编吧 ...  VC6上确实有这个问题 VS上用的是xmm寄存器，而VC6不是  [/quote]  没有 printf 的话，估计没有 fst 和 fld 这两步。结果就不同了。

user: user-7
content: 引用 7 楼 fefe82 的回复:贴编译结果的汇编吧 ...  VC6上确实有这个问题 VS上用的是xmm寄存器，而VC6不是

user: user-5
content: 贴编译结果的汇编吧 ...

user: user-7
content: 我在VS上调试均是9，float变量是9.000000....

user: user-0
content: 引用 1 楼 user-8的回复:亲，这不是printf改变的，是(int)改变的。类型转换发生信息丢失，是很常见的问题。 可是，上下的代码都一样，一个有printf一个没有，导致结果不同

user: user-8
content: 亲，这不是printf改变的，是(int)改变的。类型转换发生信息丢失，是很常见的问题。
user-0 提问: 怎么同时显示测试函数时间的结果

回复:
user: user-1
content: 2楼正解，a已经排好序了，再用插入排序只需要一个O(n)的时间了，所以用时很短没法计时

user: user-2
content: 这个意思？ printf("The time was:%5.2f ---- %5.2 ---- %5.2\n", (double)(end1 - start1) / CLK_TCK,  (double)(end2 - start2) / CLK_TCK,  (double)(end3 - start3) / CLK_TCK);

user: user-3
content: a已经排好序了, 再排就没用了, 拷贝两份出来, 分别排序

user: user-4
content: 这样，你的变量不重复定义吗？
user-0 提问: 保留后六位

回复:
user: user-1
content: 对每个阶乘 求余数相加

user: user-2
content: 只求最后一位那么只需要算个位数相乘，只求最后两位只需要算最后两位数相乘，同理，只求最后六位那么只需要算最后六位相乘。这个题应该是计算大数据阶乘最后六位的，要么你先用数组直接把阶乘算出来再取后六位，要么就按上面的思路做

user: user-3
content: 用取余的方法：s %= 100000;    #include<stdio.h> int main() { 	int n, s = 0, t, j, i; 	printf("请输入n\n"); 	scanf("%d", &n); 	for (i = 1; i <= n; i++) 	{ 		t = 1; 		for (j = 1; j <= i; j++) 		{ 			t = t*j; 		} 		s = s + t; 	} 	s %= 100000; 	printf("%d\n", s); 	return 0; }
user-0 提问: C program language上的1-13题

回复:
user: user-1
content: 你说一下原题吧，都不知道原题要干啥

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

user: user-3
content: 什么问题呢？自己探究没有呢？

user: user-0
content: 练习题目……

user: user-4
content: C program language上的1-13的例子还是练习题目啊
user-0 提问: 写个字符串反序输出的函数,结果无法puts

回复:
user: user-1
content: 如果只是要一个反序输出的结果，那么不必改变原串中的字符，这样处理：

user: user-2
content: 如楼上所言，sta要减一不能把空字符算进去

user: user-3
content: void brck(char *ch)//字符串反序输出 { 	int i;     int sta = 0;     int number;     char temp[1];       while (ch[sta] != '\0')         sta++;     sta--;//不要把结束符算进去       number = sta / 2;     for (i = 0;i<=number; i++,sta--)     {         temp[0] = ch[sta];         ch[sta] = ch[i];         ch[i] = temp[0];       } 	puts(ch); }

user: user-4
content: 字符串头尾交换了2遍啊…… 就好比“360度转弯”这样…… 改为for (int i = 0; i <= number / 2; i++, sta--)
user-0 提问: 多个c程序编译生成so文件，在cygwin环境下

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:函数声明写去头文件里，其他C文件里包含头文件谢谢你

user: user-1
content: 函数声明写去头文件里，其他C文件里包含头文件

user: user-0
content: 自己顶，顶起顶起
user-0 提问: 链表的内存越界问题

回复:
user: user-0
content: 啊那个valuename是[21],复制的时候手抖了

user: user-0
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  char *getfileall(char *filename) { 	//将外部文件中的代码输入程序 	FILE *fp; 	char *str; 	char text[1000]; 	int filesize; 	if ((fp = fopen(filename, "r")) == NULL)  	{ 		printf("打开文件%s错误\n", filename); 		return NULL; 	} 	else 	{ 		fseek(fp, 0, SEEK_END);  		filesize = ftell(fp); 		str = (char *)malloc(filesize); 		str[0] = 0;  		rewind(fp); 		while ((fgets(text, 1000, fp)) != NULL) 		{ 			strcat(str, text); 		} 		fclose(fp); 		return str; 	} }  typedef struct node { 	char valuename[20]; 	int type; 	int ivalue; 	double dvalue; 	struct node *link; };  struct node * creat(struct node *p, struct node *h, struct node *s,int t, struct node *name[21]) { 	if ((s = (struct node *)malloc(sizeof(struct node) + sizeof(*name))) == NULL) /*分配空间并检测*/ 	{ 		printf("不能分配内存空间!"); 		exit(0); 	} 	p->link = s; /*把s的地址赋给p所指向的结点的链域，这样就把p和s所指向的结点连接起来了*/ 	strcpy(s->valuename, name); 	s->type = t; 	s->ivalue = 0; 	s->dvalue = 0.0; 	printf("%d%s", t,s->valuename); 	s->link = NULL; 	p = s; }  int main()  {  	int i = 0, j = 0, k = 0, l = 0, m = 0, a = 0;//j为行数，k为各行长度，i、l、m用于循环，a用以记录变量名 	char *code, code1[1000][1000] = { '\0' }; 	char *filename[20] = { '\0' }; 	gets(filename); 	code = getfileall(filename);  	//将一维代码按分号分割成二维 	for (i = 0; i < strlen(code); i++) 	{ 		if (code[i] == '\n' || code[i] == '\r') 		{ 			code[i] = ' '; 		} 	} 	for (i = 0; i < strlen(code); i++) 	{ 		if (code[i] == ';') 		{ 			code1[j][k] = code[i]; 			j++; 			k = 0; 		} 		else 		{ 			code1[j][k] = code[i]; 			k++; 		} 	} 	free(code);  	//对定义部分进行检测，将变量名输入并初始化对应数组内的空间 	struct node *p, *h, *s; /* *h保存表头结点的指针，*p指向当前结点的前一个结点，*s指向当前结点*/ 	char *name[21] = { '\0' }; 	int t; 	if ((h = (struct node *)malloc(sizeof(struct node))) == NULL) /*分配空间并检测*/ 	{ 		printf("不能分配内存空间!"); 		exit(0); 	} 	h->valuename[0] = '\0'; /*把表头结点的数据域置空*/ 	h->link = NULL; /*把表头结点的链域置空*/ 	p = h; /*p指向表头结点*/ 	s = NULL;  	for (i = 0; i < j; i++) 	{ 		if (strstr(code1[i], "int ") != NULL) 		{ 			name[21] = ""; 			for (l = 4; l < strlen(code1[i]); l++)                                             //此处改用指针以排除句首空格干扰 strstr返回值为‘i’的地址 			{ 				if (code1[i][l] != ' ' && code1[i][l] != ',' && code1[i][l] != ';') 				{ 					name[a] = code1[i][l]; 					a++; 				} 				else if (code1[i][l] == ',' || code1[i][l] == ';') 				{ 					a = 0; 					t = 0; 					creat(p, h, s, t, name); 					name[21] = ""; 				} 			} 		}		 		else if (strstr(code1[i], "double ") != NULL) 		{ 			name[21] = ""; 			for (l = 7; l < strlen(code1[i]); l++) 			{ 				if (code1[i][l] != ' ' && code1[i][l] != ',' && code1[i][l] != ';') 				{ 					name[a] = code1[i][l]; 					a++; 				} 				else if (code1[i][l] == ',' || code1[i][l] == ';') 				{ 					a = 0; 					t = 1; 					creat(p, h, s, t, name); 					name[21] = ""; 				} 			} 		} 		else 		{  		} 	} 	system("pause"); 	return 0; } 我剪一块0.0

user: user-0
content: 全部有几百行0.0而且没写完

user: user-1
content: 你倒是把代码上全啊

user: user-0
content: 我这里过了 可能后来被我改得面目全非了ˊ_>ˋ

user: user-2
content: 编译都通不过啊  strcpy(s->valuename, name); 这里的name是struct node *name[21]
user-0 提问: 请教一个关于命令行参数的问题。

回复:
user: user-1
content: 2 If they are declared, the parameters to the main function shall obey the following constraints: — The value of argc shall be nonnegative. — argv[argc] shall be a null pointer. — If the value of argc is greater than zero, the array members argv[0] through argv[argc-1] inclusive shall contain pointers to strings, which are given implementation-defined values by the host environment prior to program startup. The intent is to supply to the program information determined prior to program startup from elsewhere in the hosted environment. If the host environment is not capable of supplying strings with letters in both uppercase and lowercase, the implementation shall ensure that the strings are received in lowercase. — If the value of argc is greater than zero, the string pointed to by argv[0] represents the program name; argv[0][0] shall be the null character if the program name is not available from the host environment. If the value of argc is greater than one, the strings pointed to by argv[1] through argv[argc-1] represent the program parameters. — The parameters argc and argv and the strings pointed to by the argv array shall be modifiable by the program, and retain their last-stored values between program startup and program termination.

user: user-2
content: http://bbs.csdn.net/topics/390469280

user: user-3
content: argc这个参数的值最小为1，即命令行下不输入任何参数的情况，此时argv数组里边就一个值，那就是该命令所在的路径构成的字符串。你的，明白？

user: user-4
content: 你如果没有命令行的参数的话确实是1，为程序exe文件路径

user: user-5
content: DOS年代运行程序都是输入命令行的，由常驻内存的command.com这个DOS下命令解释器（类似Linux下的sh、bash）解释执行 比如： edit  a1.txt dir  /a  /w edit是外部命令，就是一个具体的程序名字，由command.com调用执行 dir是command.com的内部命令，直接执行它自身的部分代码 命令后面的就是命令的参数 如edit  a1.txt，argc==2, argv[0]=="edit", argv[1]=="a1.txt" 你也可以在命令行cmd（Win-R组合键，输入cmd运行）下运行你的程序，后面输入参数

user: user-6
content: 你输入的决定的，所以叫命令行，你实际运行看看就明白多了。
user-0 提问: char *a='"qwer";  和 char[] = "qwer";的区别

回复:
user: user-1
content: char *a='"qwer" 编译会有告警

user: user-2
content: char *a = "qwer"; // 将一个常量指针赋值给a a[0] = 'a';  // 非法。因为a指针指向的是常量“qwer”，不允许修改  char a[] = "qwer"; // 在栈上分配5个字节的空间，并初始化为“qwer" （以'\0'结束） a[0] = 'a'; // 可以。

user: user-0
content: char *a = "qwer"; char a1 = *(a++); 这样是不行的 ； 而 char a[] = "qwer"; char a1 = *(a++); 才可以   您的意思是这样吗

user: user-3
content: 常量和变量的区别
user-0 提问: C/C++下随机生成UTF-8编码数据

回复:
user: user-0
content: 哎，没有更好的办法了么？不过还是感谢二位的回复，谢谢啦，散分！

user: user-1
content: 你应该先生成  UCS2 的字符， 再转换回 UTF8 。

user: user-2
content: 仅供参考：// UTF-8 编码字符理论上可以最多到 6个字节长，但目前全世界的所 // 有文字和符号种类加起来也只要编到 4个字节长就够了。 // 　　UTF-8 是以 8位（即 1个字节）为单元对原始码进行编码（注意一 // 点：这里所讲的原始码都是指Unicode码），并规定：多字节码（2个字 // 节以上才称为多字节）以转换后第1个字节起头的连续“1”的数目（这 // 些连续“1”称为标记位），表示转换成几个字节：“110”连续两个 // “1”，表示转换结果为2个字节，“1110”表示3个字节，而“11110” // 则表示4个字节……跟随在标记位之后的“0”，其作用是分隔标记位和 // 字符码位。第2～第4个字节的起头两个位固定设置为“10”，也作为标 // 记，剩下的6个位才做为字符码位使用。 // 　　这样，2字节UTF-8码剩下11个字符码位，可用以转换0080～07FF的 // 原始字符码，3字节剩下16个字符码位，可用以转换0800～FFFF的原始字 // 符码，由此类推。编码方式的模板如下： // // 原始码（16进制）　UTF－8编码（二进制） // -------------------------------------------- // 0000 - 007F       0xxxxxxx // 0080 - 07FF       110xxxxx 10xxxxxx // 0800 - FFFF       1110xxxx 10xxxxxx 10xxxxxx // …… // -------------------------------------------- // // 　　模板中的“x”表示字符码。 // 　　Ascii码＜007F，编为1个 // 字节的UTF－8码。汉字的 Unicode编码范围为0800－FFFF，所以被编为 // 3个字节的UTF－8码。 // 　　例如“汉”字的Unicode编码是6C49，6C49在0800-FFFF之间，所以 // 要用3个字节的模板：1110wwww 10xxxxyy 10yyzzzz。  //    6    C    4    9 // 0110 1100 0100 1001 // wwww xxxx yyyy zzzz //     wwww   xxxxyy   yyzzzz // 1110wwww 10xxxxyy 10yyzzzz。 // 11100110 10110001 10001001 //    E   6    B   1    8   9 //“汉”字的UTF-8编码是E6 B1 89
user-0 提问: 请问，为什么我在调试的时候会自动打开stdio.h，莫名其妙，然而可以正常执行，结果输出正常

回复:
user: user-1
content: 因为你调试的时候进入stdio.h包含函数了，你没发现你的程序有问题？ for (i=b;putchar(ch[i])!='\0';i++); printf(",%c",ch[0]); for循环多了分号
user-0 提问: 统计包含0x00元素的数组个数问题？？？

回复:
user: user-1
content: 既然初始化列表是你自己写的，那么最简单的：  int main(void){     char buf[100] = {0x7E,0x08,0x00,0x09,0x67,0x33};     int num=6;     printf("num=%d\n",num);     return 0; }

user: user-2
content: #include <stdio.h> #include <stdlib.h> int main(void){     char buf[100] = {0x7E,0x08,0x00,0x09,0x67,0x33};     int num=0,i = 0;     for(i=0;i<100;i++){         if(buf[i] != 0x33) {             num=num+1;             continue;         }         else             break;     }     num++;     printf("num=%d\n",num);     return 0; }

user: user-3
content: char buf[100] = {0x7E,0x08,0x00,0x09,0x67,0x33}; 	int count = sizeof(buf) / sizeof(buf[0]); 	while(count > 0) 	{ 		if(buf[count - 1]) break; 		--count; 	} 	printf("count = %d\n", count); 	return 0;

user: user-0
content: 对啊，问题就在这，我是想有没有什么办法，改变一下if的判断条件，得到num=6的结果

user: user-4
content: 你不是有一句叫if(buf[i] != '\0')，当然判断到0就结束了

user: user-0
content: 那如何得到我想要的num=6 的结果啊

user: user-5
content: 如果希望统计已经初始化的数据个数，那么没有任何手段可以统计出来 因为不确定你的数据中有没有 0这个数据

user: user-0
content: 五楼的朋友我的必须是这样的：char buf[100] = {0x7E,0x08,0x00,0x09,0x67,0x33}; 不能把0x00放到最后

user: user-0
content: 因为我的程序是有上文的， char buf[100]是不能变的，不能写成这位仁兄的unsigned char buf[] = {0x7E,0x08,0x00,0x09,0x67,0x33};  这种情况下，如何得到num=6 的结果

user: user-5
content: 你能确定后面的全是0 ？ 那么可以统计最后一个非0数据。

user: user-6
content: 看你程序的意思字符'\0'为结束字符, 但是你的声明如下: char buf[100] = {0x7E,0x08,0x00,0x09,0x67,0x33}; 第3个0x00就等'\0', 所以结果为2, 你把0x00放在最后面就可以统计了, 但是数据中不能包含0x00 char buf[100] = {0x7E,0x08,0x11,0x09,0x67,0x33,0x00};

user: user-3
content: unsigned char buf[] = {0x7E,0x08,0x00,0x09,0x67,0x33}; int size = sizeof(buf);

user: user-1
content: 引用 2 楼 vshuo7013 的回复:我定义的数组buf是100个字节，如何算出它只有六个字节  它确实有 100 个元素，并不是只有六个元素。  这里只显式初始化了6个元素，其余元素其实也被初始化了。也就是说，buf 现在有 100 个已经初始化了的元素。

user: user-0
content: 我定义的数组buf是100个字节，如何算出它只有六个字节

user: user-1
content: 什么叫“实际元素个数”？
user-0 提问: 高手看看如何避免重复输出呢？

回复:
user: user-0
content: 改好了  #include <stdio.h> char result[20]; int N = 0; void solve(int c, int t, int l, int d) {     int i = 1; 	if(d == l) 	{ 		result[ (l - 1) * 2 ]  = '+'; 		result[ (l - 1) * 2 + 1]  = '0' + N - t;         if(result[ (l - 1) * 2 + 1] >= result[ (l - 1) * 2 - 1])         {             for(i = 1; i < 20 ; i++)             {                 printf("%c",result[i]);             }             printf("\n");         }  	} 	else 	{  	   for(i = c;i + t < N ;i++) 	   { 		 result[(l - 1) * 2] = '+'; 		 result[(l - 1) * 2 + 1] = '0' + i;          solve(i, t + i, l + 1,d); 	   }  	} } void reset() { 	int i = 0; 	for(; i < 20; i++) 	{ 		result[i] = '\0'; 	} } int main() {     int i = 0; 	N = 10; 	printf("input number\n"); 	scanf("%d", &N); 	printf("\n"); 	for(i = 2; i <= N; i++) 	{ 		reset(); 		solve(1,0,1,i); 	} 	return 0; }

user: user-0
content: 引用 3 楼 paschen 的回复:实现该算法的是时候加上一个条件：后一个数不能小于前一个数 明白了

user: user-1
content: 从大到小也可以，总之按照升序或者降序即可

user: user-1
content: 你只要按顺序分割就可以了 如果分割后，后面的数据比前面的小，那就是重复的，直接剪裁掉， 保证所有分割从小到大排列即可。

user: user-2
content: 1: 5        2: 4 1        3: 3 2        4: 3 1 1        5: 2 2 1        6: 2 1 1 1        7: 1 1 1 1 1

user: user-3
content: 实现该算法的是时候加上一个条件：后一个数不能小于前一个数

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> void print(int res[], int num) {     static int L=0;     L++;     printf("%8d:",L);     for (int i=0;i<num;++i) {         printf(" %d", res[i]);     }     printf("\n"); } void split(int n, int m) {// n表示总数，m表示最大因子     static int res[100];// 保存结果     static int num=-1;// 当前因子下标      if (n<m || n<0 || m<1) return;     num++;     if (0==n) {// 递归终止条件，为0不可再分，直接输出         print(res,num+1);         num--;         return;     } else {         if (n==m) {// 不拆，直接输出             res[num]=m;             print(res,num+1);             num--;         } else {             // 拆分出第一个             res[num]=m;             n=n-m;              if (m>n) m = n; // 最大因子不可能大于总数              for (int i=m;i>=1;--i) {// 循环，第二个因子可以继续拆分，而且按照最大因子不同可以拆分成多个                 split(n,i);             }             num--;         }     } } void Split(int n) {     if (n<=0) return;     if (100<n) {         printf("Up to 100\n");         return;     }     for (int i=n;i>=1;--i) {         split(n, i);     } } void main(int argc,char **argv) {          if (argc<=1) Split(5);     else if (argc>=3) split(atoi(argv[1]),atoi(argv[2]));     else              Split(atoi(argv[1])); }

user: user-0
content: 引用 1 楼 user-4 的回复:如果认为 2+3和3+2是一种情况 那么1+1+3和1+3+1和3+1+1是不是也认为是一种情况？  是啊，感觉很难去重

user: user-4
content: 如果认为 2+3和3+2是一种情况 那么1+1+3和1+3+1和3+1+1是不是也认为是一种情况？
user-0 提问: 帮忙指出下列程序程序代码中的错误或不足，请说明原因

回复:
user: user-1
content: B的构造函数中， 1、没有对分配的空间进行初始化，可以用memset()。 2、没有对参数字符串的长度进行判断，传入的参数长度有可能会超过256。可以先取得长度，再分配空间。 3、对分配的内存有没有成功也没有判断。

user: user-2
content: 为了代码安全

user: user-0
content: 您能给我说说原因嘛？我才入门不是太懂，谢谢您啦

user: user-3
content: strcpy(m_buf,info);   应改为  strncpy(m_buf,info,255);  m_buf[255]=0;

user: user-0
content: 谢谢了.....

user: user-4
content: 用#include<iostream>  另外没有指定名字空间，所以cout要改成std::cout
user-0 提问: 求助 如何读取内存的中英文混合字符串

回复:
user: user-1
content: 上面打错  memcpy(name, name_addr,10); 改成 strcpy(name, name_addr)

user: user-1
content: memcpy(name, name_addr,10); 改成 memcpy(name, name_addr)

user: user-2
content: 仅供参考： void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }
user-0 提问: 出现runtime error 了 是代码问题还是?

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

user: user-2
content: 出错的话最好自己设置断点调试一下

user: user-3
content: 点重试，然后点中断，通过调用堆栈及变量监视窗口等观察分析出错原因

user: user-4
content: 运行没发现错误啊
user-0 提问: 在vs2015社区版写了一段代码，编译通过，运行出错，没查出原因，跟IDE有关吗？

回复:
user: user-1
content: 引用 6 楼 keith_bb 的回复:引用 2 楼 paschen 的回复:出错时断下看出错在哪分析原因错误就是这两张截图，特别是插入那个输出连续输出两个，而且第二个还是乱码，不应该啊  点重试，再点中断，通过调用规格与变量监视等窗口观察分析原因，从提示上说应该是buffer = NULL了，但你断言他不应该等于NULL

user: user-2
content: 怎么出错法？

user: user-3
content: 编译通过并不能证明程序就没有问题，比如一些逻辑性的错误，如除数为0，这样编译器是检查不出来 的，但是你运行的时候 就会出错

user: user-0
content: 引用 2 楼 paschen 的回复:出错时断下看出错在哪分析原因错误就是这两张截图，特别是插入那个输出连续输出两个，而且第二个还是乱码，不应该啊

user: user-0
content: 引用 3 楼 user-3 的回复:编译通过并不能证明程序就没有问题，比如一些逻辑性的错误，如除数为0，这样编译器是检查不出来 的，但是你运行的时候 就会出错对，我就是检查不出来，郁闷

user: user-0
content: 引用 1 楼 relaxisland 的回复:怎么出错法？

user: user-1
content: 出错时断下看出错在哪分析原因
user-0 提问: c语言算矩阵乘法，有的值算出来是负数，是溢出了吗？

回复:
user: user-0
content: 楼上都是明白人啊，数组定义有问题，改了

user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-2
content: 检查是否数组访问越界了

user: user-0
content: 自己顶起，等待回复

user: user-0
content: 自己顶起，等待回复

user: user-0
content: 初学者，别嘲笑我啊

user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-3
content: 数组的定义大小与真实大小不一致，导致数组越界。对于数组越界的问题，建议参考这篇帖子：http://bbs.csdn.net/topics/310083831

user: user-4
content: 1）数组不能动态修改占用内存大小，和元素个数 2）数组越界，
user-0 提问: 请问C语言中，整型指针数组怎么获得结构中整型变量的地址

回复:
user: user-1
content: n 是结构体名称，需要一个结构体变量

user: user-2
content: 因为在我感觉上，结构体就是把一些数据攒到一段连续内存里。也就是楼主的struct n 里面的a、b、c是在一段连续内存里，也就是有了a，那么b、c也就知道了，楼主平白多了一个指针数组来存储a、b、c，是不是多余呢？ 因为 struct n *struct_p; 一个指针变量就可以了，你想要a，可以用(*struct_p).a, 想要b，可以用(*struct_p).b

user: user-3
content: 你需要有一个结构体对象，因为你结构体中的变量是属于对象的，也就是说每个对象都有一份a、b、c，如果按你这么写，编译器怎么知道你要的是哪个对象的  但你可以写成这样；  struct n var; p[0] = &var.a
user-0 提问: 遇到一个无符号与有符号比较的怪异问题

回复:
user: user-1
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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-2
content: if(c1>uc1) 这句把c1与uc1都转换成了int， c1转换后是个负数，而uc1是正数，所以条件不成立，执行else  小于int的类型比较大小时，若类型不一致，会转换成int比较

user: user-3
content: 在某个范围内的无符号数和有符号数，相同二进制，表示不相同的数。 所以千万别直接比较 无符号数和有符号数 除非知道数的范围

user: user-4
content: 整数类型在进行比较的时候，都至少会提升（隐式类型转化; integral promotion）为 int （如果 int 可以提升前类型的所有值）或 unsigned int （如果 int 不能表示提升前类型的所有值）。（详细规则略） 这一提升对每一个操作数单独进行的，不考虑另一侧的操作数。  前两个比较都是两侧均提升为 int 进行的，因为 int 可以表示 char, unsigned char, short, unsigned short 的所有值。  最后一个，一侧为 int ，另一侧为 unsigned int 。（两侧提升独立进行，没有关系。这里实际都没有类型的转换）  此时，一个称作 usual arithmetic conversions 的转换将进行，将一侧的类型转换为另一侧的类型：在一侧为 signed T ，另一侧为 unsigned T 时，那么 signed T 类型将转换为 unsigned T 类型。（其它规则略）  所以最后一个比较，最终两侧都转换为 unsigned int 进行。  =========== 总结：不要比较 signed 和 unsigned 类型。最好比较前将其转换为同为 signed 或 同为 unsigned 类型。
user-0 提问: 请教一个回调函数返回的结构体指针能够直接赋值吗

回复:
user: user-1
content: p2=p1,这种形式只是浅拷贝，即只把结构体的指针拷贝了，而里面的数据地址并没有被拷贝，memcpy可以进行深拷贝，数据地址也会被拷贝

user: user-2
content: 另外结构体赋值，如果是C++类差不多作用的结构体，内部的指针指向的数据，并没有被复制过来，而是直接bitcopy的指针。

user: user-2
content: struct xxx x; struct xxx y,*p1=y; struct xxx *p2=& x; call(callBack, p1);//这样就可以了，值在y中 x=*p1;//如果需要转储，可以这样 除非C版本低 结构体可以直接赋值

user: user-3
content: C语言下的结构体可以直接memcpy，把另一个结构体内存数据复制过来

user: user-0
content: memcpy这个我知道可以使用，但我想知道为什么传递不过去

user: user-4
content: 使用 memcpy struct S{ };  memcpy(&d, &s, sizeof(struct S));
user-0 提问: 我是新手，弱弱问一句作业问题能问吗。。

回复:
user: user-1
content: #include <stdio.h> #include <ctype.h>  void input(char *p, int n); int main(void) { 	char shuzu[80] = {0}; int n; 	printf("a num:\n"); 	scanf("%d", &n); 	getchar(); 	input(shuzu, n); 	puts(shuzu); 	return 0; } void input(char *p, int n) { 	int i; 	for (i = 0; i < n; i++) 	{ 		*p = getchar(); 		if (isspace(*p++)) 			break; 	} }

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

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

user: user-0
content: 引用 9 楼 paschen 的回复:[quote=引用 5 楼 qq_32874397 的回复:] [quote=引用 1 楼 paschen 的回复:] isspace(*p) 此时p所指的位置还没被初始过  你*p++; 这句的效果等价于 p++，如果你是要表示p所指的字符+1应该写成 (*p) ++我这个应该怎么改。。感觉懵圈了[/quote]  p++放到isspace后面？ 我不知你是想要什么效果[/quote] 不用指针我改了一下。 void input(char *p, int n) { int i; for(i=0;i<n;i++) { p[i]=getchar(); if(isspace(p[i]))  //为什么无效  break; } p[i+1]='\0'; } 但是为什么我那个不行还是搞不清。*p=getchar();*p++;这两行我是想输第一个字母指针指到下一个字母，然后循环又输入指到的这个字母，你们说的优先级的问题，查了下是同优先级，自右向左，按理说这程序应该不对，但运行起来却可以实现，只是没有遇到空格就不输出的这个功能。

user: user-0
content: 引用 8 楼 weixin_30460121 的回复:for(i=0;i<n;i++) { *p=getchar(); if(isspace(*p))       break; p++; }试了下不行，感觉字符串的不能不用指针去自增。

user: user-1
content: 引用 5 楼 qq_32874397 的回复:[quote=引用 1 楼 paschen 的回复:] isspace(*p) 此时p所指的位置还没被初始过  你*p++; 这句的效果等价于 p++，如果你是要表示p所指的字符+1应该写成 (*p) ++我这个应该怎么改。。感觉懵圈了[/quote]  p++放到isspace后面？ 我不知你是想要什么效果

user: user-3
content: for(i=0;i<n;i++) { *p=getchar(); if(isspace(*p))       break; p++; }

user: user-0
content: 引用 14 楼 paschen 的回复: #include <stdio.h> #include <ctype.h>  void input(char *p, int n); int main(void) { 	char shuzu[80] = {0}; int n; 	printf("a num:\n"); 	scanf("%d", &n); 	getchar(); 	input(shuzu, n); 	puts(shuzu); 	return 0; } void input(char *p, int n) { 	int i; 	for (i = 0; i < n; i++) 	{ 		*p = getchar(); 		if (isspace(*p++)) 			break; 	} } 好的，多谢版主

user: user-0
content: 引用 4 楼 xusongge 的回复:虽然我是菜鸟，但我从头到尾看了一下楼主的代码，很混乱，你是主函数读取要打印的字符串然后传递到函数？好像不是！因为你主函数和函数部分都有getchar（），而且主函数部分还用错了。如果我写*p++这句话，我一定会写成（*p)++或*(p++)，因为我记不住哪个优先级高，根据实际需求加括号。。 input函数用来输入，主函数用来输出啊，主函数那个getchar()是为了消除回车符，为什么我也不知道，我是看的书上说的。

user: user-0
content: 引用 2 楼 xusongge 的回复:getchar不是这样用的吧？你不把getchar得到的字符赋给一个变量？？？赋给指针为什么不行啊

user: user-0
content: 引用 1 楼 paschen 的回复:isspace(*p) 此时p所指的位置还没被初始过  你*p++; 这句的效果等价于 p++，如果你是要表示p所指的字符+1应该写成 (*p) ++我这个应该怎么改。。感觉懵圈了

user: user-4
content: 虽然我是菜鸟，但我从头到尾看了一下楼主的代码，很混乱，你是主函数读取要打印的字符串然后传递到函数？好像不是！因为你主函数和函数部分都有getchar（），而且主函数部分还用错了。如果我写*p++这句话，我一定会写成（*p)++或*(p++)，因为我记不住哪个优先级高，根据实际需求加括号。。

user: user-4
content: 应该换成gets(shuzu)

user: user-4
content: getchar不是这样用的吧？你不把getchar得到的字符赋给一个变量？？？

user: user-1
content: isspace(*p) 此时p所指的位置还没被初始过  你*p++; 这句的效果等价于 p++，如果你是要表示p所指的字符+1应该写成 (*p) ++
user-0 提问: c语言

回复:
user: user-1
content: 代码就如楼上所给，其实思想倒是挺简单的，proc函数只需要执行两个for循环就ok了。

user: user-2
content: #include <stdio.h>  #define M 5 int a[M][M];  void proc(int arr[][M]); void print(int arr[][M]); int main() { 	 	int i,j; 	for(i=0;i<M;i++) 		for(j=0;j<M;j++) 			a[i][j]=i+2*j; 	print(a); 	proc(a); 	print(a); 	getchar(); 	return 0; } void proc(int arr[][M]) { 	int i,j; 	for(i=0;i<M;i++) 		for(j=i;j<M;j++) 			arr[i][j]=0; } void print(int arr[][M]) { 	int i,j; 	for(i=0;i<M;i++){ 		for(j=0;j<M;j++) 			printf("%d ",arr[i][j]); 		printf("\n"); 	} }
user-0 提问: c语言

回复:
user: user-1
content: void proc(char a[], char b[], int n) { 	int i; 	char *p; 	i = 0; 	p = a; 	while (*p != *(a + n)) 		b[i++] = *p++; 	++p; 	while (*p) 		b[i++] = *p++; 	b[i] = '\0'; }
user-0 提问: 一道oj的题

回复:
user: user-1
content: 按照上面的要求写了一下 void sort(int a[],int n) {     for(int i=1;i<n;i++){         int x=a[i],j=i-1;         for(;j>=0&&a[j]>x;j--) a[j+1]=a[j];         a[j+1] =x;     } } int find(int a[],int n,int value) {     for(int i=0;i<n;i++) if(a[i]==value) return i;     return -1; } void display(int a[],int n) {     printf("%d",a[0]);     for(int i=1;i<n;i++) printf(" %d",a[i]);     printf(".\n"); } void reverse(int a[],int n) {     for(int i=0,j=n-1;i<j;i++,j--){         int t=a[i];         a[i] =a[j];         a[j] =t;     } } void remove(int a[],int n,int pos) {     for(int i=pos+1;i<n;i++) a[i-1]=a[i]; } int main() {     int n,a[15],b[15],x;     scanf("%d",&n);     while(n--){         for(int i=0;i<10;i++) scanf("%d",a+i);         scanf("%d",&x);         bool handle=false;         int arraylen=10;         int pos=find(a,arraylen,x);         if(x&1){             handle =pos!=-1;             if(handle){                 remove(a,arraylen--,pos);                 sort(a,arraylen);             }         }else{             handle =pos==-1;             if(handle){                 a[arraylen++] =x;                 sort(a,arraylen);                 reverse(a,arraylen);             }         }         if(!handle){             int odd=0,even=9;             for(int i=0;i<arraylen;i++){                 if(a[i]&1) b[odd++] =a[i];                 else b[even--] =a[i];             }             memcpy(a,b,arraylen*sizeof(*a));             sort(a,odd);             reverse(a,odd);             sort(a+odd,arraylen-odd);             reverse(a+odd,arraylen-odd);         }         display(a,arraylen);     }     return 0; }

user: user-0
content: 引用 1 楼 user-2 的回复:写个程序哪这么复杂。貌似还是Java风格。不得不吐槽下，你的变量没注释，而且命名很随意，读起来很晦涩 。。。什么叫java风格

user: user-2
content: 写个程序哪这么复杂。貌似还是Java风格。不得不吐槽下，你的变量没注释，而且命名很随意，读起来很晦涩
user-0 提问: 求exec函数使用方法

回复:
user: user-1
content: 仅供参考：/* EXEC.C illustrates the different versions of exec including:  *      _execl          _execle          _execlp          _execlpe  *      _execv          _execve          _execvp          _execvpe  *  * Although EXEC.C can exec any program, you can verify how   * different versions handle arguments and environment by   * compiling and specifying the sample program ARGS.C. See   * SPAWN.C for examples of the similar spawn functions.  */  #include <stdio.h> #include <conio.h> #include <process.h>  char *my_env[] =                /* Environment for exec?e */ {    "THIS=environment will be",    "PASSED=to new process by",    "the EXEC=functions",    NULL };  void main() {    char *args[4], prog[80];    int ch;     printf( "Enter name of program to exec: " );    gets( prog );    printf( " 1. _execl  2. _execle  3. _execlp  4. _execlpe\n" );    printf( " 5. _execv  6. _execve  7. _execvp  8. _execvpe\n" );    printf( "Type a number from 1 to 8 (or 0 to quit): " );    ch = _getche();    if( (ch < '1') || (ch > '8') )        exit( 1 );    printf( "\n\n" );     /* Arguments for _execv? */    args[0] = prog;    args[1] = "exec??";    args[2] = "two";    args[3] = NULL;     switch( ch )    {    case '1':       _execl( prog, prog, "_execl", "two", NULL );       break;    case '2':       _execle( prog, prog, "_execle", "two", NULL, my_env );       break;    case '3':       _execlp( prog, prog, "_execlp", "two", NULL );       break;    case '4':       _execlpe( prog, prog, "_execlpe", "two", NULL, my_env );       break;    case '5':       _execv( prog, args );       break;    case '6':       _execve( prog, args, my_env );       break;    case '7':       _execvp( prog, args );       break;    case '8':       _execvpe( prog, args, my_env );       break;    default:       break;    }     /* This point is reached only if exec fails. */    printf( "\nProcess was not execed." );    exit( 0 ); }

user: user-1
content: man exec中的6个函数
user-0 提问: 问个关于char与函数的小问题

回复:
user: user-1
content: 错误提示不是已经写了，第一个没有初始化就直接用了，而第二个你用用户的输入初始化后才用的，所以没问题

user: user-2
content: 很明显，第一个程序中的子函数word的输入ch未定义，故而出错。而第二个程序ch=ch=getchar()这句你是要干嘛？多此一举。
user-0 提问: 关于指针数组的问题

回复:
user: user-1
content: 我也是新手，我觉得char是个很特殊的类型，特别是使用指针时，char*我感觉其实不只是char类型的指针，他更像是一个字符串，是一体的，

user: user-2
content: 因为有%s.......

user: user-3
content: printf("%s\n", p[i]); 你都用%s了当然是打印字符串了

user: user-4
content: 这个就是对指针的理解不够透彻了。 第一个问题，只要明白char** p与char* p[]等效，问题就不难理解了 第二个问题，指针的指向都发生改变了，那么内容自然就不同了。举个例子，如果A路通往北京，B路通往上海，现在我把两条路改修为A通往上海，B通往北京，那么两条路指向发生了改变，目的地也就不同了

user: user-5
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-0 提问: 下面C程序的输出结果是什么呢？谢谢老师们

回复:
user: user-1
content: 作为新手我表示没有tab的代码看不下去

user: user-2
content: 找个编译器试一下就知道了。

user: user-3
content: 你这个代码对？ class B不继承A？ 继承A的话，多态，结果： Class B: 25

user: user-4
content: 引用 2 楼 lm_whales 的回复:vitural void pick(int a = 1)； 重载的函数，不要重载缺省参数不要修改缺省参数

user: user-4
content: vitural void pick(int a = 1)； 重载的函数，不要重载缺省参数

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

回复:
user: user-1
content: 等于3啊，三目运算符，打好基础啊

user: user-2
content: a?b:c是c语言中少数几个三值运算符中的一个，该语句是个逻辑语句，执行过程为：若a为真则返回b，否则返回c

user: user-3
content: 老实说，这种题目如果不能够懂的话，考试是真没的考

user: user-4
content: #include <stdio.h>  int main() {     int a = 10, b = 2, c = 3, d;      d = (b>c) ? a : c;     printf("d=%d\n", d);      return 0; 编译后，程序运行结果如下： d=3  ========== expression1 ? expression2 : expression3 称为条件表达式。它首先计算expression1，如果其值不等于0（为真），则计算expression2的值，并以该值作为条件表达式的值；否则计算expression3的值，并以该值作为条件表达式的值。 ? : 的优先级高于 = 的优先级，所以会先计算出 (b>c) ? a : c的值，再赋值给d。由于b>c为假，故条件表达式的值为c的值，即3.
user-0 提问: 大神帮我把这段C代码转换成汇编语言。

回复:
user: user-0
content: 引用 4 楼 seanking1987 的回复:等我把头折成90度再来看看  有打出来的代码啊。

user: user-1
content: 引用 5 楼 u011702993 的回复:[quote=引用 4 楼 seanking1987 的回复:] 等我把头折成90度再来看看  有打出来的代码啊。[/quote]  上个可以正常编译的代码来

user: user-0
content: 来人

user: user-2
content: 等我把头折成90度再来看看

user: user-3
content: 代码编辑好，选择合适的编译器，编译输出汇编语言代码即可 如果需要名字可读性，手动改变编译器生成的名字。 几乎每个编译器都有这个功能。  人工翻译 的话，必须自己做，不然不会了解为何翻译成这个样子。

user: user-1
content: 把代码输入后，在调试过程中通过反汇编窗口查看转换成的汇编代码，或者把生成的EXE文件用IDA等工具生成反汇编代码
user-0 提问: DSP28335响应中断后，CPU将IER清除，为什么还能继续响应中断？

回复:
user: user-1
content: 楼主后来问题解决了嘛，我也有这个疑问

user: user-2
content: 技术上是可以重入的，即便高优先级的中断，也可以在ISR中设置EOI，允许响应中断。

user: user-3
content: 同一个中断总不允许重入吧。

user: user-2
content: 可以，有特殊全嵌套方式，允许在中断处理中响应同级或更高级中断。

user: user-3
content: 据我所知，相同优先级的中断是不能重入的。
user-0 提问: c程序求助

回复:
user: user-1
content: 哦~原来真的有100分。。。

user: user-1
content: #include<stdio.h> #include<string.h> void xianshi(); void game_ks(); void game_xuanze(int); char biaozhun[100]; char shuru[100]; int main() {     xianshi();     int xuanze;     scanf("%d",&xuanze)     game_xuanze(xuanze);     gets(shuru)     game_ks();     return 0; } //给用户展示 的内容 void xianshi() {     printf("这是一个指法练习");     printf("请选择游戏类型\n");     printf("1:数字练习\n");     printf("2:字母练习\n");     printf("3:字符练习\n");     printf("4:超强混合练习（敢来挑战么？）\n");     printf("其他键 默认练习\n"); } //游戏开始-选择(仅限1234) void game_xuanze(int x) {     switch (x) {     case '2': strcpy(biaozhun,"abcdefgABCDEFG"); break;     case '3': strcpy(biaozhun,"$*(&#@#$%^*())&%#@@");break;     case '4': strcpy(biaozhun,"$*(&#@#$%^AFHGDXJsd1234565432hxjxj*())&%#@@");break;     default: strcpy(biaozhun,"078276870"); break;     } } // 游戏开始 void game_ks() {     if(strcmp(shuru,biaozhun)==0) {         printf("you are right!完全正确\n");     }     else {         int n,i,fase=0;         float baifenlv=0.0;         n=strlen(shuru);         int n_biaozhun=strlen(biaozhun);         for (i=0;i<n && i<n_biaozhun;i++) {             if(biaozhun[i]!=shuru[i])                 fase++;         }         printf("输入字符个数%d\n",n);         printf("错误个数%d\n",fase);         baifenlv=(float)(n_biaozhun-fase)/n_biaozhun;         printf("正确率是%f%%\n",baifenlv*100.0);     } }

user: user-0
content: 帮忙改错 谢谢

user: user-2
content: 引用 2 楼 zhao4zhong1 的回复:#include<stdio.h> #include<string.h> void xianshi(); void game_ks(); void game_xuanze(int); char biaozhun[100]; char shuru[100]; int main() {     xianshi();     int xuanze;     scanf("%d",&xuanze)     game_xuanze(xuanze);     gets(shuru)     game_ks();     return 0; } //给用户展示 的内容 void xianshi() {     printf("这是一个指法练习");     printf("请选择游戏类型\n");     printf("1:数字练习\n");     printf("2:字母练习\n");     printf("3:字符练习\n");     printf("4:超强混合练习（敢来挑战么？）\n");     printf("其他键 默认练习\n"); } //游戏开始-选择(仅限1234) void game_xuanze(int x) {     switch (x) {     case '2': strcpy(biaozhun,"abcdefgABCDEFG"); break;     case '3': strcpy(biaozhun,"$*(&#@#$%^*())&%#@@");break;     case '4': strcpy(biaozhun,"$*(&#@#$%^AFHGDXJsd1234565432hxjxj*())&%#@@");break;     default: strcpy(biaozhun,"078276870"); break;     } } // 游戏开始 void game_ks() {     if(strcmp(shuru,biaozhun)==0) {         printf("you are right!完全正确\n");     }     else {         int n,i,fase=0;         float baifenlv=0.0;         n=strlen(shuru);         int n_biaozhun=strlen(biaozhun);         for (i=0;i<n && i<n_biaozhun;i++) {             if(biaozhun[i]!=shuru[i])                 fase++;         }         printf("输入字符个数%d\n",n);         printf("错误个数%d\n",fase);         baifenlv=(float)(n_biaozhun-fase)/n_biaozhun;         printf("正确率是%f%%\n",baifenlv*100.0);     } } 赵四罕见地不讲人生大道理了。哦~原来有100分。。。

user: user-3
content: game_xuanze 函数返回类型声明为char，但返回的是char[100]  game_ks函数中n_biaozhun没定义  biaozhun名字拼错了
user-0 提问: 有关C语言连字符##使用

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

user: user-2
content: ## 只能用于宏替换的串里。不能用在其它地方。  你这个，直接去掉 ## 加个空格，编译器会自动拼接相邻的字符串。

user: user-0
content: 引用 1 楼 user-2 的回复:## 只能用于宏替换的串里。不能用在其它地方。  你这个，直接去掉 ## 加个空格，编译器会自动拼接相邻的字符串。 哈哈，脑袋晕了。多谢。
user-0 提问: 大一小白求大神指教一下~

回复:
user: user-1
content: 你的闰年的判断为什么要写个反的。应该判断是闰年的情况。 然后，你的闰年时，应该是month[1]=29 ，数组从0开始 再着，你的m从2开始，那不是无法统计1月份的日期了。你算天数的算法根本就是错的。  下面的应该是对的，你参考下。  #include <stdio.h> void main() { 	int year,day,d,m,leap; 	int month[12]={31,28,31,30,31,30,31,31,30,31,30,31}; 	printf("Input the year and day:\n"); 	scanf("%d",&year); 	scanf("%d",&day); 	if ((year%4==0&&year%100!=0)||(year%400==0))  		leap=1;	//是闰年  	else 		leap=0;	//不是闰年  	 	if (leap==1) 		month[1]=29; 		 	m=1; 	for (int i=0;i<12;i++) 	{ 		if (day>month[i]) 		{ 			day=day-month[i]; 			m++; 		}  		else 		{ 			d=day; 			break;	 		}		 	} 	 	printf("The date is :%d年%d月%d日",year,m,d);  }

user: user-0
content: 求各位大神帮帮我啊！
user-0 提问: 求大神解答 关于文件的输入输出问题

回复:
user: user-1
content: 不知道你想问什么，是想问输入的数据怎么读出来吗。 我加了个dat_read函数，不知道是不是要问这个。   #include <stdio.h> #include <stdlib.h> #define size 4 struct student_type {     char name[10];     int num;     int age; }stud[size],std[size]; void save() {     FILE *fp;     int i;     if((fp=fopen("student.dat","wb"))==NULL)     {         printf("error1");         exit(0);     }     for(i=0;i<4;i++)         if(fwrite(&stud[i],sizeof(struct student_type),1,fp)!=1)         printf("error2");     fclose(fp); }  void dat_read() {     FILE *fp;     int i;     if((fp=fopen("student.dat","rb"))==NULL)     {         printf("error1");         exit(0);     }	          for(i=0;i<4;i++)         if(fread(&std[i],sizeof(struct student_type),1,fp)!=1)         printf("error2");         else         {         	printf("%s-%d-%d\n",std[i].name,std[i].num,std[i].age); 		}     fclose(fp);  }    int main() {     int i;     for(i=0;i<size;i++)     {         scanf("%s%d%d",stud[i].name,&stud[i].num,&stud[i].age);     }         save();                  printf("-----输入的数据是--------\n"); 		          dat_read();                  return 0; }
user-0 提问: 求大神介绍一个支持win764位的C语言软件，谢谢了

回复:
user: user-1
content: http://wenku.baidu.com/link?url=ixMRUQhLgvdz_RE5Hp20c0dsu2g_Lwfs5xvx1H3OSTBk9CA8FbBFJviSxT3jXKDD30JoVrTsyKXAP9Q0mYJ4Ns40Y6BWxk50XtLIoBAD91q

user: user-2
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-3
content: 《深入理解C指针》这本书不错，当当或者亚马逊都有。 《C语言点滴》 《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例  c primer plus 或者谭浩强 C语言程序设计：现代方法：第2版(被誉为"近10年来最好的一部C语言著作") C和指针

user: user-4
content: code::blocks
user-0 提问: 求大神帮助~

回复:
user: user-1
content: http://www.easyx.cn

user: user-2
content: graphics.h是什么鬼, 以前tc的东西吗? 要么就认真学API, 没时间就搞一份网上的代码来自己编译,也当学习了

user: user-3
content: 楼主你好，如果是Windows的话，可以用GDI做，用到有限的一些API函数借口，上百度一搜或者到MSDN查一下怎么传参就好了。

user: user-4
content: 之前在控制台下写过扫雷

user: user-5
content: 这样的一个小模块，你再网上搜一下，有好多类似的资源。挑挑拣拣，改一改就出来了。。。

user: user-6
content: 说的好像所谓的"line"不是API一样
user-0 提问: C语言中while结果显示问题

回复:
user: user-1
content: 前面从100开始的也输出了 只不过屏幕上存不下那么多行内容 不信你输出到文件试试 或者把MAX改小点

user: user-2
content: 程序是对的没有问题 只是你要输出的东西太多了 输出框装不下了 所以在没有显示完 你把while(--count>0)改成while(--count>50)你就明白了
user-0 提问: #ifdef WIN32 的问题

回复:
user: user-1
content: WIN32/_WIN32 可以用来判断是否 Windows 系统（对于跨平台程序）， 对于64位不需要更改，你可以试试。 _WIN64 用来判断编译环境是 x86 还是 x64。

user: user-2
content: 代表32-bit platform，而不是32位系统

user: user-3
content: 百度的相关解答链接:为什么要定义 #ifdef WIN32 和#endif
user-0 提问:  跪求源代码！！用c语言设计实现一个模拟的通信录管理系统（信息系统）

回复:
user: user-1
content: 估计没人会帮你写！ 论坛交流学习用的 不是帮你写程序用的，如果你有不懂的，哪里写不出来，有很多大神帮忙（虽然我不是），而不是拿到个问题，什么都不想，直接扔论坛了，这样你一辈子也写不出程序来（本人的想法）不好意思！好像说重了

user: user-2
content: 这样的一个小模块，你再网上搜一下，有好多类似的资源。挑挑拣拣，改一改就出来了。。。很简单。
user-0 提问: 函数的数组地址

回复:
user: user-1
content: 思考一下，为什么不把整个互联网内容当作函数参数传来传去呢？

user: user-2
content: 当调用一个函数时，参数只是堆栈上的一个空间。  而数组是没有变量的。数组名只是一个地址而已。 你的情况就是，当呼叫函数时， 在堆栈上创建了一个变量，这个变量的内容就是数组的地址。  数组，地址，指针，指针变量。

user: user-3
content: 当函数的参数包含有数组时，将被默认为该数组类型的指针，MAIN中调用函数时，应该是对应类型的指针奥！

user: user-4
content: 其实吧 数组都会退化成指针！ 你那f(a); 其实传给形参int a[] 就是指针int*a指向了主函数里面a数组的首地址！

user: user-5
content: C/C++中如果是数组作为函数参数，数组将退化为指向数组首元素的指针，完全等价于void f(int* a)

user: user-6
content: 形式参数都是变量

user: user-7
content: void f(int a[]) 与 void f(int *a)近似等价.

user: user-8
content: 它不是真正的数组，它只是一个指针。
user-0 提问: 这是一个求助帖。C语言关于选择排序法的问题，求指教。

回复:
user: user-1
content: 两个交换按理说是等价的

user: user-2
content: 这两个交换是没什么区别，自己再去看看提交的程序是不是哪里写错了。比如把 i 和 j 给敲错了

user: user-0
content: 有没有人回复啊？