Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 有点错误 请看一下

回复:
user: user-0
content: 引用 4楼user-1 的回复:加上b[11] = '\0';   #include<stdio.h>   int main() { 	char a[]="Dahhk,sknhz"; 	char b[99999]; 	printf("%s\n",a); 	printf("请输入解密字符:\n"); 	if(getchar()=='T') 	{ 		for(int i=0;i<11;i++) 			if(a[i]==' ') b[i]=' '; 			else if(a[i]>='w'&&a[i]<='z'||a[i]>='W'&&a[i]<='Z') b[i]=(a[i]-22); 			else if(a[i]==',') b[i]=','; 			else if(a[i]=='.') b[i]='.'; 			else 				b[i]=(a[i]+4); 			b[11] = '\0'; 			printf("%s",b); 	}  	else printf("error!");   	return 0; }  谢谢 解决了

user: user-1
content: #include<stdio.h>   int main() { 	char a[]="Dahhk,sknhz"; 	char b[99999]; 	printf("%s\n",a); 	printf("请输入解密字符:\n"); 	if(getchar()=='T') 	{ 		for(int i=0;i<11;i++) 			if(a[i]==' ') b[i]=' '; 			else if(a[i]>='w'&&a[i]<='z'||a[i]>='W'&&a[i]<='Z') b[i]=(a[i]-22); 			else if(a[i]==',') b[i]=','; 			else if(a[i]=='.') b[i]='.'; 			else 				b[i]=(a[i]+4); 			b[11] = '\0'; 			printf("%s",b); 	}  	else printf("error!");   	return 0; }

user: user-1
content: 加上b[11] = '\0';   #include<stdio.h>   int main() { 	char a[]="Dahhk,sknhz"; 	char b[99999]; 	printf("%s\n",a); 	printf("请输入解密字符:\n"); 	if(getchar()=='T') 	{ 		for(int i=0;i<11;i++) 			if(a[i]==' ') b[i]=' '; 			else if(a[i]>='w'&&a[i]<='z'||a[i]>='W'&&a[i]<='Z') b[i]=(a[i]-22); 			else if(a[i]==',') b[i]=','; 			else if(a[i]=='.') b[i]='.'; 			else 				b[i]=(a[i]+4); 			b[11] = '\0'; 			printf("%s",b); 	}  	else printf("error!");   	return 0; }

user: user-0
content: 引用 1楼user-1 的回复:图片不方便看啊，贴代码上来啊，初步判断你输出的字符串是否未以\0结尾#include<stdio.h> int main() { char a[]="Dahhk,sknhz"; char b[99999]; printf("%s\n",a); printf("请输入解密字符:\n"); if(getchar()=='T') { for(int i=0;i<11;i++) if(a[i]==' ') b[i]=' '; else if(a[i]>='w'&&a[i]<='z'||a[i]>='W'&&a[i]<='Z') b[i]=(a[i]-22); else if(a[i]==',') b[i]=','; else if(a[i]=='.') b[i]='.'; else b[i]=(a[i]+4); printf("%s",b); }  else printf("error!");   return 0; }

user: user-1
content: 图片不方便看啊，贴代码上来啊，初步判断你输出的字符串是否未以\0结尾
user-0 提问: 二维数组中查找某个值的实现思路

回复:
user: user-1
content: 引用 8 楼 FightForProgrammer 的回复:[quote=引用 7 楼 paschen 的回复:] int t[m][n]可以有那么大？？m和n都千万级别，不说栈暴了，堆都暴了  如果要想查找快，你放数据就应该用关联式容器（如哈希表等储存），否则你查找时只能逐个遍历 确实没那么大，也不是数组，一共2g左右把。就用内存映射咯？[/quote]  2G 是2*1000 000 000 int[m][n]是 4 *千万*千万 或者 8  *千万*千万*是 千万*千万 = 1000 *1000 * 1000 * 1000* 100 = 100T；共400T或者800T 和2G不是一个数量级的。 一个磁盘也就1T,2T,市面上最大的也就4T 你可能需要B+树这一类的数据结构.噢，估计还是不行 你还是用数据库，放服务器上吧

user: user-0
content: 引用 7 楼 paschen 的回复:int t[m][n]可以有那么大？？m和n都千万级别，不说栈暴了，堆都暴了  如果要想查找快，你放数据就应该用关联式容器（如哈希表等储存），否则你查找时只能逐个遍历 确实没那么大，也不是数组，一共2g左右把。就用内存映射咯？

user: user-2
content: int t[m][n]可以有那么大？？m和n都千万级别，不说栈暴了，堆都暴了  如果要想查找快，你放数据就应该用关联式容器（如哈希表等储存），否则你查找时只能逐个遍历

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 FightForProgrammer 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 1 楼 lm_whales 的回复:] 用文件当数组使用吧 英雄所见略同！[/quote] 多谢，能指点一下大概的实现框架吗？[/quote] // 创建文件句柄 HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 创建文件映射 HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL); // 读取映射中的内存 LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);  // 好了文件的内存已经获取了，你可以随意处理了  // 释放映射内存 ::UnmapViewOfFile(lpBuffer); // 关闭文件映射 ::CloseHandle(hMap); // close file handle ::CloseHandle(hFile);   Linux下参考 void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);    [/quote]  嗯。这是把数据准备好把。其实想问的是如何组织数据，高效查询，难道只有逐个遍历这一条路吗？

user: user-3
content: 引用 4 楼 FightForProgrammer 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 1 楼 lm_whales 的回复:] 用文件当数组使用吧 英雄所见略同！[/quote] 多谢，能指点一下大概的实现框架吗？[/quote] // 创建文件句柄 HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 创建文件映射 HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL); // 读取映射中的内存 LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);  // 好了文件的内存已经获取了，你可以随意处理了  // 释放映射内存 ::UnmapViewOfFile(lpBuffer); // 关闭文件映射 ::CloseHandle(hMap); // close file handle ::CloseHandle(hFile);   Linux下参考 void * mmap(void *start, size_t length, int prot , int flags, int fd, off_t offset);

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:[quote=引用 1 楼 lm_whales 的回复:] 用文件当数组使用吧 英雄所见略同！[/quote] 多谢，能指点一下大概的实现框架吗？

user: user-3
content: 引用 1 楼 lm_whales 的回复:用文件当数组使用吧 英雄所见略同！

user: user-4
content: 没有规律，你还是要遍历一遍的。

user: user-1
content: 用文件当数组使用吧
user-0 提问: 急~各位大牛万能的CSDN，请教一个关于xml字符串解析的问题

回复:
user: user-1
content: 引用 4 楼 realmardrid 的回复:http://bbs.csdn.net/topics/380115580 那个问题也可以这样用啊，不过我没有试过。

user: user-2
content: #include <stdio.h> #include <string.h> char s[]=     "<A>\n"     "<B>b</B>\n"     "<C>c</C>\n"     "<D>d</D>\n"     "</A>\n"; char t[100]; char *p,*q; int main() {     p=strstr(s,"<A>");     q=strstr(p+3,"</A>");     strncpy(t,p+3,q-p-3);t[q-p-3]=0;     printf("%s",t);     return 0; } // //<B>b</B> //<C>c</C> //<D>d</D> //

user: user-3
content: 解析xml是一件非常简单的事情.你别看别人的帖子了,去研究一个例子吧.我使用xml的时候也就花了半天时间去看一个使用tinyxml的类解析的文件的例子.网上很多,你去百度一下:tinyxml!

user: user-0
content: 引用 2 楼 baijiaheizhiganmao 的回复:[quote=引用 楼主 realmardrid 的回复:] <A> <B>b</B> <C>c</C> <D>d</D> </A>  C语言处理  现有这样一个串只去掉最外层，得到<B>b</B>、<C>c</C>、<D>d</D>这样的串？谢谢 这个啊B和b等都是可以获取的。假如你使用tinyxml等读写xml文件的类的时候，你获取的时候是不带<>括号的。需要你在获取了之后重新组合他们。 假如你使用普通文件读写的时候就更简单了，只需要依次按行读，读出来后与最外成的皮对比一下，不相同则是你需要的。[/quote]http://bbs.csdn.net/topics/380115580

user: user-0
content: http://bbs.csdn.net/topics/380115580

user: user-0
content: 引用 1 楼 sand6174 的回复: boost的 ptrre pt; read_xml("a.xml",pt); pt = pt.get_child("A");  ///这里就是去掉外层的数据 for ( ptree::assoc_iterator iter = pt.ordered_begin() ; iter != pt.not_found() ; ++iter ) {   } 参考了这个http://bbs.csdn.net/topics/380115580

user: user-3
content: 引用 楼主 realmardrid 的回复:<A> <B>b</B> <C>c</C> <D>d</D> </A>  C语言处理  现有这样一个串只去掉最外层，得到<B>b</B>、<C>c</C>、<D>d</D>这样的串？谢谢 这个啊B和b等都是可以获取的。假如你使用tinyxml等读写xml文件的类的时候，你获取的时候是不带<>括号的。需要你在获取了之后重新组合他们。 假如你使用普通文件读写的时候就更简单了，只需要依次按行读，读出来后与最外成的皮对比一下，不相同则是你需要的。

user: user-1
content: boost的 ptrre pt; read_xml("a.xml",pt); pt = pt.get_child("A");  ///这里就是去掉外层的数据 for ( ptree::assoc_iterator iter = pt.ordered_begin() ; iter != pt.not_found() ; ++iter ) {   }
user-0 提问: 关于Code blocks的问题

回复:
user: user-0
content: 引用 3 楼 paschen 的回复:重新建个工程，换个路径看下

user: user-1
content: 重新建个工程，换个路径看下

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:以管理员身份运行 以XP兼容模式运行  关掉UAC、防火墙、杀毒软件、…… 還是一樣不行欸

user: user-2
content: 以管理员身份运行 以XP兼容模式运行  关掉UAC、防火墙、杀毒软件、……

user: user-2
content: 必要的话，重启电脑。
user-0 提问: C语言 fgets()和getc()读取文件流的区别

回复:
user: user-0
content: 谢谢赵老师 书上好像提过短路，不过没注意，现在吸取教训了:)

user: user-1
content: 搜“逻辑短路”  用fgets受MAX限制
user-0 提问: 地址分配的问题。

回复:
user: user-1
content: malloc返回的是void*，是个地址值，转换成int*，之后这块内存上的内容将按int类型去解释

user: user-2
content: p1 是变量，怎么返回值？ 你是想问 malloc 的返回值吧  malloc 返回的是地址，类型是 void*    (int*) 把 void* 转换成 int*

user: user-3
content: 引用 3 楼 jk_101 的回复:[quote=引用 1 楼 adlay 的回复:] p1 是变量，怎么返回值？ 你是想问 malloc 的返回值吧  malloc 返回的是地址，类型是 void*    (int*) 把 void* 转换成 int*  不好意思啊  我想问的是p1的值是返回的地址吗？谢谢。[/quote]  p1 的值是这串内存空间的地址

user: user-0
content: 引用 1 楼 adlay 的回复:p1 是变量，怎么返回值？ 你是想问 malloc 的返回值吧  malloc 返回的是地址，类型是 void*    (int*) 把 void* 转换成 int*  不好意思啊  我想问的是p1的值是返回的地址吗？谢谢。
user-0 提问: c语言中文件操作

回复:
user: user-1
content: while(ch = getc(fp1) != EOF)   ===>  while((ch = getc(fp1)) != EOF)

user: user-0
content: 现补充点，这一句 if((fp1 = fopen("mycopy.c","r")) == NULL) 原文 是    if( fp1 = fopen(argv[1],"r") == NULL); 是发现问题后改的   运行程序后打开文件成这样
user-0 提问: if (fp!=NULL) { fclose(fp); fp = NULL; }为什么fclose不直接置为null，需要外部置为null？

回复:
user: user-1
content: 引用 3 楼 taric_ma 的回复:补充一个疑问，我这边 写代码的时候，首先是fopen，例如，if((fp1=fopen("file1","r")) == NULL)，这样也就对fp1做了非NULL检查，那么在关闭文件的时候，还用显示的判断fp1 != NULL吗？ 判断的目的是避免代码多了之后不小心在多处fclose多次引发运行时错误。

user: user-2
content: 当然你不把他置为空也是可以滴，只是置空是一种好的习惯

user: user-3
content: 补充一个疑问，我这边 写代码的时候，首先是fopen，例如，if((fp1=fopen("file1","r")) == NULL)，这样也就对fp1做了非NULL检查，那么在关闭文件的时候，还用显示的判断fp1 != NULL吗？

user: user-1
content: 引用 1 楼 user-4 的回复:fclose没法设置, 传入的是FILE*, 不是 FILE ** 一语道破天机！

user: user-4
content: fclose没法设置, 传入的是FILE*, 不是 FILE **
user-0 提问: 关于十六进制转化成十进制的问题

回复:
user: user-1
content: 引用 7 楼 dsq2753919456 的回复:明白了，居然会犯这样的错误，而且十六进制数字符至多为F，我也没注意  学习的时候可以自己写了练习下，实际用一般就用标准库中的就行，这些基本函数标准库中都已经实现好了

user: user-0
content: 明白了，居然会犯这样的错误，而且十六进制数字符至多为F，我也没注意

user: user-1
content: 另外，htoi的返回值应该是int不是char吧   # include <stdio.h> # define N 100 int htoi(char s[]); int main() { 	char a[N]; 	printf("请输入十六进制数的字符串"); 	gets(a); 	htoi(a); 	printf("十进制数为：%d", htoi(a)); 	return 0; } int htoi(char s[]) { 	int i; 	int n; 	int sum; 	sum = 0; 	for (i = 0; s[i] != '\0'; i++) 	{ 		if (s[i] >= '0' && s[i] <= '9') 			n = s[i] - '0'; 		else if (s[i] >= 'a' && s[i] <= 'z') 			n = s[i] - 87; 		else if (s[i] >= 'A' && s[i] <= 'Z') 			n = s[i] - 55; 		sum = 16 * sum + n; 	} 	return sum; }

user: user-1
content: if (s[i] >= '0' || s[i] <= '9')  应该是用&&而不是 || 吧，其他几个if中的也对应改了

user: user-0
content: 还是不能解决我的问题啊，运行出来的值不对

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

user: user-3
content: 你的函数声明和定义时返回的是char值，然而实际上你在函数里返回的是 int值

user: user-4
content: int htoi(char s[]){...}
user-0 提问: 邮件是应用层，为什么，还可以http的形式提供服务给用户呢？

回复:
user: user-1
content: “邮箱全程加密” 我理解就是即使是邮箱系统管理员，也无法获知使用该邮箱的用户发送和接收邮件的具体内容。

user: user-2
content: 那应该就是传输过程加密，使用ssl连接。只是保证传输的过程，客户端到邮件服务器是安全的。

user: user-0
content: 引用 2 楼 akirya 的回复:1  发送邮件流程 客户端将邮件内容编码  smtp 邮件发送服务器   浏览器 使用 http将邮件的内容 传送到www服务器，www后台将邮件编码 -> 邮件发送服务器  其中 www后台将邮件编码 -> 邮件发送服务器 这个过程，可以使用文件共享 数据库 等等。可以说一个公司一个做法。  2 指的安全电子邮件，是指对邮件内容加密和数字签名。只有接受者才能解密，并且保证邮件不是伪造的。  对于你说的第一点，是不是这么理解：  web形式的邮箱，其不是走stmp, pop之类的协议，  而客户端的，比如桌面程序，手机app， 是用stmp的协议。   第2点，大神，你没有看清楚我的问题。  我其实知道 有的邮件是可以通过，数字签名，证书一类的手段，防止篡改，不可抵赖性。    有的邮件厂商，号称，邮件都加密， 似乎我们没有选择证书来发送邮件啊。  我们没有选择证书，没有签名，  软件厂商，声称邮件安全，保密。  所以让我很奇怪。

user: user-2
content: 1  发送邮件流程 客户端将邮件内容编码  smtp 邮件发送服务器   浏览器 使用 http将邮件的内容 传送到www服务器，www后台将邮件编码 -> 邮件发送服务器  其中 www后台将邮件编码 -> 邮件发送服务器 这个过程，可以使用文件共享 数据库 等等。可以说一个公司一个做法。  2 指的安全电子邮件，是指对邮件内容加密和数字签名。只有接受者才能解密，并且保证邮件不是伪造的。

user: user-1
content: 这种问题应该在http://bbs.csdn.net/forums/IP_Protocolconfiguration问。
user-0 提问: 写了一个返回结构体指针的函数，编译时总是提醒没有初始化q，但是初始化了。

回复:
user: user-0
content: 恩恩。太感谢大家了，问题解决了。定义q的时候就让q=NULL.

user: user-1
content: 你这是一个函数，当呼叫这个函数是 n=0，那么返回什么呢？  你运行时的 n 只是一个特里，编译器要保证所有的分支。  简单说，if(n) 语句，你可以在 else 里面有语法错误吗？  if(n) { p = 1; } else { p = 0; //这里也要赋值，赋值编译器会认为没有初始化。 }  其实，你只需要在定义的时候，初始化就可以了。这是最好的做法。

user: user-0
content: 恩恩，谢谢Saleayas。加了#define n 26后就可以执行了。但是Cfree为什么不加也可以呢？

user: user-2
content: 感觉没啥错 或许可以在编译器里配置 忽略这个错误吧

user: user-0
content: 编译器保证所有分支是什么意思我不太明白，刚才用CFree试了一下程序可以了，但是VS2013就是不行

user: user-1
content: 你把 n 强制修改成 26 就没有错误。 因为此时编译器知道没有不执行赋值的块。

user: user-1
content: 编译器需要保证所有的分支。 这是编译不是运行。

user: user-0
content: 我调用函数的时候，n为26

user: user-0
content: 循环肯定执行了

user: user-1
content: 当你的循环不执行的时候， q  就没有初始化。

user: user-3
content: 你的q并没有初始化，刚申请完空间，就开始使用q->data

user: user-0

user: user-4
content: 编译提示贴出来看看
user-0 提问: 编写单链表出现的Debug   Assertion   Failed，网上说什么用了野指针，可是我不明白，望高手解答！

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

user: user-0
content: 引用 6 楼 lm_whales的回复:// combine two Links 这句后面这段程序里，多打几个打断点 嗯，调试后，free那里出问题了。

user: user-1
content: 将两个有序链表合并成一个有序链表 http://blog.csdn.net/lalor/article/details/7429989

user: user-1
content: 搜“单链表合并”

user: user-0
content: 引用 7 楼 lm_whales的回复: if(pa->data <= pb->data){ pc->next = pa;//这段可能会有问题，因为你的所有节点都没有做脱链处理。 pc = pa; pa = pa->next; } else{ pc->next = pb; pc = pb; pb = pb->next; }  合并链表 可以分为，破坏式合并，和非破坏式合并。 破坏式合并，原链表被拆开， 节点从链表中取出。  1）一种方法是每个节点从链上取出，保持链的完整（取下节点后，还是一个链表） 然后，插入到新链表中 2）第二种方法是，一条链作基础，从另一条链上取出节点，插入进去。 这些是利用原来节点，破坏性合并 3）还有一种，非破坏式合并，分配新节点，每次从链表中取数据。合并到链表中。 得到一个新链表，原链表以及节点保持不变。 我采用的是第二种方法，请问我要怎样进行脱链处理呢？由于数据结构是用伪代码写的，用C语言把思路实现会出现一系列的问题....请教一下，怎么改啊？

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

user: user-2
content: if(pa->data <= pb->data){ pc->next = pa;//这段可能会有问题，因为你的所有节点都没有做脱链处理。 pc = pa; pa = pa->next; } else{ pc->next = pb; pc = pb; pb = pb->next; }  合并链表 可以分为，破坏式合并，和非破坏式合并。 破坏式合并，原链表被拆开， 节点从链表中取出。  1）一种方法是每个节点从链上取出，保持链的完整（取下节点后，还是一个链表） 然后，插入到新链表中 2）第二种方法是，一条链作基础，从另一条链上取出节点，插入进去。 这些是利用原来节点，破坏性合并 3）还有一种，非破坏式合并，分配新节点，每次从链表中取数据。合并到链表中。 得到一个新链表，原链表以及节点保持不变。

user: user-2
content: // combine two Links 这句后面这段程序里，多打几个打断点

user: user-3
content: 测试数据是什么

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

user: user-0
content: 引用 11 楼 赵4老师的回复:将两个有序链表合并成一个有序链表 http://blog.csdn.net/lalor/article/details/7429989 你说的调用我真的不是很明白，但是你说的我今完要试一下的，试玩我再回复。

user: user-0
content: 引用 3 楼 user-5的回复:你的VS没装好吧 那就单步调试 写其他程序可以啊，你能运行的出来吗？

user: user-5
content: 你的VS没装好吧 那就单步调试

user: user-0
content: 引用 1 楼 user-5的回复:按“重试”打开默认调试器进行调试 不行啊，一重试直接没了。

user: user-5
content: 按“重试”打开默认调试器进行调试
user-0 提问: 用OpenGL写了一个关于碰撞的小程序期间遇到的麻烦

回复:
user: user-1
content: 参考开源打砖块游戏项目的源代码片断。

user: user-2
content: 设绿块前进方向向量为v, 反射向量为r , 法向n, r= v -  2n(v dot n)
user-0 提问: 求解！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！！

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> char s[256]; char *p; int r,n,i; int main() {     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //

user: user-2
content: 下面是我写的一个程序，可供参考 #include<stdio.h> #include<stdlib.h>  #define max 100  void mystrcmp(char str1[],char str2[],char *s);  int main() { 	char str1[max],str2[max]; 	char c; 	char *s,*s1; 	s1=(char *)malloc(100*sizeof(char)); 	s=s1; 	int i=0,j=0; 	while((c=getchar())!='\n'&&i<max) 		str1[i++]=c; 	str1[i]='\0'; 	while((c=getchar())!='\n'&&i<max) 		str2[j++]=c; 	str2[j]='\0'; 	mystrcmp(str1,str2,s1); 	printf("%s\n",s); 	return 0; }  void mystrcmp(char str1[],char str2[],char *s) { 	int i=0,j; 	 	while(str2[i]!='\0') 	{ 		j=0; 		while(str1[j]!='\0'&&str1[j]!=str2[i]) 			j++; 		if(str1[j]=='\0') 			*s++=str2[i]; 		i++; 	} 	*s='\0'; }
user-0 提问: 从控制台输入两个字符串，判断第一个字符串中是否包含第二个字符串，并把结果输出来          求解！！！

回复:
user: user-1
content: 仅供参考： C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strstr.c /*** *strstr.c - search for one string inside another * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines strstr() - search for one string inside another * *******************************************************************************/  #include <cruntime.h> #include <string.h>  /*** *char *strstr(string1, string2) - search for string2 in string1 * *Purpose: *       finds the first occurrence of string2 in string1 * *Entry: *       char *string1 - string to search in *       char *string2 - string to search for * *Exit: *       returns a pointer to the first occurrence of string2 in *       string1, or NULL if string2 does not occur in string1 * *Uses: * *Exceptions: * *******************************************************************************/  char * __cdecl strstr (         const char * str1,         const char * str2         ) {         char *cp = (char *) str1;         char *s1, *s2;          if ( !*str2 )             return((char *)str1);          while (*cp)         {                 s1 = cp;                 s2 = (char *) str2;                  while ( *s1 && *s2 && !(*s1-*s2) )                         s1++, s2++;                  if (!*s2)                         return(cp);                  cp++;         }          return(NULL);  }

user: user-2
content: 引用 2 楼 user-2 的回复: #include <stdio.h> #include "Header.h" #include <conio.h> int main() { 	char arr[100]; char arr2[100]; int i,j,n; 	printf("输入字符:\n"); 	gets_s(arr); 	printf_s("输入要去除的字符：\n"); 	gets_s(arr2); 	for (i = 0; arr2[i]; i++) 	{ 		for ( j = 0, n=0; arr[j]; j++) 		{ 			if (arr[j]!=arr2[i]) 			{ 				arr[n++] = arr[j]; 			} 			else 			{ 				 			} 		} 		arr[n] = '\0'; 	} 	printf_s("%s", arr);  	char c; 	c =_getch(); 	 }  额(⊙﹏⊙)b  看错 以为你要删除相同的 你要是打印出来在else函数里面打印就行了

user: user-2
content: #include <stdio.h> #include "Header.h" #include <conio.h> int main() { 	char arr[100]; char arr2[100]; int i,j,n; 	printf("输入字符:\n"); 	gets_s(arr); 	printf_s("输入要去除的字符：\n"); 	gets_s(arr2); 	for (i = 0; arr2[i]; i++) 	{ 		for ( j = 0, n=0; arr[j]; j++) 		{ 			if (arr[j]!=arr2[i]) 			{ 				arr[n++] = arr[j]; 			} 			else 			{  			} 		} 		arr[n] = '\0'; 	} 	printf_s("%s", arr);  	char c; 	c =_getch();  }
user-0 提问: 请问RegQueryValueEX这个函数读REG_SZ值是乱码是怎么回事

回复:
user: user-1
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: user-1
content: RegQueryValueEx The RegQueryValueEx function retrieves the type and data for a specified value name associated with an open registry key.   LONG RegQueryValueEx(   HKEY hKey,           // handle to key to query   LPTSTR lpValueName,  // address of name of value to query   LPDWORD lpReserved,  // reserved   LPDWORD lpType,      // address of buffer for value type   LPBYTE lpData,       // address of data buffer   LPDWORD lpcbData     // address of data buffer size ); …… lpcbData  Pointer to a variable that specifies the size, in bytes, of the buffer pointed to by the lpData parameter. When the function returns, this variable contains the size of the data copied to lpData.  If the data has the REG_SZ, REG_MULTI_SZ or REG_EXPAND_SZ type, then lpcbData will also include the size of the terminating null character.   The lpcbData parameter can be NULL only if lpData is NULL.   If the buffer specified by lpData parameter is not large enough to hold the data, the function returns the value ERROR_MORE_DATA, and stores the required buffer size, in bytes, into the variable pointed to by lpcbData.   If lpData is NULL, and lpcbData is non-NULL, the function returns ERROR_SUCCESS, and stores the size of the data, in bytes, in the variable pointed to by lpcbData. This lets an application determine the best way to allocate a buffer for the value's data.

user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A

user: user-2
content: 我先在遇到了和楼主一样的问题，也是读取到的REG_SZ数据是乱码。。。请问你解决这个问题了么？求助啊~

user: user-1
content: 请判断每个函数的返回值。

user: user-0
content: 引用 2 楼 user-3 的回复:要读多长的数据，就new多少个char出来，不要用string 能不能麻烦大侠帮忙调试一下程序

user: user-0
content: 引用 2 楼 user-3 的回复:要读多长的数据，就new多少个char出来，不要用string 对RegQueryValueEX不太会用，我用这个函数size设为定值13读取mac地址可以成功，但是现在我要读的数据不是定值，也没办法每次去new

user: user-3
content: 要读多长的数据，就new多少个char出来，不要用string

user: user-0
content: 程序需要管理员权限，UAC执行级别里面需要设为require administrator，RegQueryValueEX这个函数返回错误代码234，经过查阅MSDN得出是data长度不够的问题，但是我怎么改都无法正常运行，求大侠帮忙
user-0 提问: 数据溢出  

回复:
user: user-1
content: 用long long存储

user: user-0
content: 恩恩 我明白了  对于int来说20的阶乘太大了

user: user-2
content: 数值溢出了会取短，int型32位，超过32位的会被抛弃，只取后32位， 数据的最高位是符号位，如果最高位是1，就是负数。
user-0 提问: 这个是什么意思？为什么我编译的时候没有错误！

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

user: user-2
content: NULL 指针的解析。

user: user-3
content: 跟堆栈啊，朋友，ide什么都能告诉你

user: user-4
content: 出错时定位通过调用堆栈定位出错位置，然后分析，从你出错的信息看，应该是访问了空指针
user-0 提问: 这代码编译时没错，但运行时出错了；我调试后，在第三次入队时出错了，但还是不知道原因，求解决！

回复:
user: user-1
content: LINE L;//在堆栈上分配一段内存用于存放L

user: user-0
content: 原来这样就可以了，先感谢你的回答！但我还有个疑问，像我刚才那样为什么会出错，为什么不能给pL分配内存吗？意义有不同吗

user: user-1
content: #include <stdio.h> #include <malloc.h> typedef struct qnode{     int data;     struct qnode * next; }QNode,*PQNode;  typedef struct line{     PQNode front;     PQNode rear; }LINE,*PLINE; void init(PLINE pL); void enLine(PLINE pL,int val); void outLine(PLINE p); int main(void){     LINE L;     init(&L);     enLine(&L,3);     enLine(&L,1);     enLine(&L,44);     outLine(&L);     return 0; } //链队初始化 void init(PLINE pL){     pL->front=pL->rear=NULL; } //入队 void enLine(PLINE pL,int val){     PQNode p=(PQNode)malloc(sizeof(QNode));     p->data=val;     p->next=NULL;     if(pL->rear==NULL){         pL->front=pL->rear=p;     }     else{         pL->rear->next=p;         pL->rear=p;     } } //遍历输出队列 void outLine(PLINE p){     PQNode q;     while (p->front!=NULL) {         q=p->front;         printf("%d ",q->data);         p->front=q->next;         free(q);     } }
user-0 提问: 编了个十进制换算二进制的c程序，遇到了点小问题

回复:
user: user-1
content: 一般局部变量也是放在栈上,i和bi[64]地址刚好相同,你在对bi[64]赋值的时候实际是对i赋值,把&i和bi+64打印出来看看就明白了

user: user-2
content: 数组越界并不是编译器来保证，是程序员自己保证的，没出错只是运气好，如果后面跟着重要的数据，可能就被你覆盖了

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

user: user-4
content: 纠结未定义行为没有意义
user-0 提问: 如何才算精通C语言？？？希望能得到答案；

回复:
user: user-1
content: C语言本身就是一种编程语言，就是一种语言。 类比下我们的汉语，可以怎么问：怎么样才算是精通汉语呢？ 答：。。。。此处省略，实在不知道怎么说。鄙人作文不合格。

user: user-2
content: 感觉够用就可以了，毕竟所有的东西都是为了用的。

user: user-3
content: 引用 15 楼 zhao4zhong1 的回复:如何才算精通XXX？？？希望能得到答案； 当lz不再问这个问题的时候，我认为lz就精通了。 当lz百年之后，lz不会再问这个问题。 综上所述，lz百年之后，就精通XXX了。  所谓的精通都是相对的~

user: user-4
content: 如何才算精通XXX？？？希望能得到答案； 当lz不再问这个问题的时候，我认为lz就精通了。 当lz百年之后，lz不会再问这个问题。 综上所述，lz百年之后，就精通XXX了。

user: user-5
content: 你只要做到通过c语言这个引子，去了解其他东西，并经过时间的积累，才有资格谈精通，不然就是夜郎自大。

user: user-6
content: 首先要做到《ISO/IEC 9899:1990》、《ISO/IEC 9899:1999》和《ISO/IEC 9899:2011》这三个文档倒背如流。

user: user-7
content: C 语言就是一个 unsigned long 时,你就入门了

user: user-8
content: 引用 11 楼 ri_aje 的回复:[quote=引用 10 楼 dustpg 的回复:] 当lz不再问这个问题的时候, 我认为lz就精通了. ++[/quote] i++；

user: user-9
content: 引用 10 楼 dustpg 的回复:当lz不再问这个问题的时候, 我认为lz就精通了. ++

user: user-10
content: 当你能看懂01的时候就真的精通了

user: user-11
content: 你想实现某个功能，可以很顺手的用C刷刷刷就写出来，在论坛上看到C的问题都知道是个什么回事

user: user-12
content: 精通c语言(或任何语言)，都是指精通语言之外的东西，不是语言本身

user: user-13
content: 当lz不再问这个问题的时候, 我认为lz就精通了.

user: user-14
content: 任何编程语言，主要的是运用，会熟练用就行。。。

user: user-15
content: 如果是单片机C，如果懂得汇编级调试差不多算精通了

user: user-16
content: 会是一回事，精通是另一回事。至于SOCKET,MFC什么的，不属于“精通C”这个范畴。  引用 1 楼 user-19 的回复:还有 Socket 网络啊，还有 MFC 图形界面程序啊，标准 C 谁不会啊，你去街上随便找个小学生都会写，要学 MFC，没有人喜欢控制台程序  按我的理解，精通C，应该包含两方面内容： 1.底层：C语言代码的汇编实现。这一点主要体现在C代码的优化上，也就是说，你既要知道你的C代码，也要知晓C代码编译成汇编后，大致是个什么样子，如果再进一步，你需要对C编译器特别熟悉，知道它具体是如何工作的。  2.标准：需要对C语言标准有深入理解，能熟练使用标准库中的大部分内容。  至于算法，那是另一个范畴；MFC属于框架结构范畴；SOCKET属于网络编程范畴。

user: user-17
content: 很显然是不会有标准的, 多看好的代码, 多写好的代码, 自然就精通了

user: user-18
content: 如果什么都能做，什么都会写，什么岗位都胜任。。

user: user-19
content: 还有 Socket 网络啊，还有 MFC 图形界面程序啊，标准 C 谁不会啊，你去街上随便找个小学生都会写，要学 MFC，没有人喜欢控制台程序

user: user-4
content: 个人意见：眼睛看到的是C语句，脑中响应的是该C语句对应的Debug和Release版汇编指令以及这些指令通过OS对内存、磁盘、网卡等存储或通讯设备上各字节的影响。
user-0 提问: 求助 小白

回复:
user: user-0
content: 好复杂

user: user-0
content: 自己写了 感觉麻烦了

user: user-1
content: 好好学习，勤快作业

user: user-2
content: #include <stdio.h> #define ABS(a) ((a)>=0?(a):-(a)) char s[]="DCBABCD"; int i; int main() {     for (i=-3;i<=3;i++) printf("%*s%.*s\n",ABS(i),"",(4-ABS(i))*2-1,s+ABS(i));     return 0; } //   A //  BAB // CBABC //DCBABCD // CBABC //  BAB //   A //

user: user-3
content: 7*7的矩形，以3为中位。行改变是否显示，列改变字母。 两个For循环嵌套即可。。
user-0 提问: 急需一个代码...初接触C语言 求两段和素数有关的代码。谢谢！！！

回复:
user: user-1
content: 百度呀，不是挺多的么

user: user-2
content: 第一个问题：  //Eratosthenes筛法求素数 //把min和max之间所有整数放到一起， //保留2，把2的所有倍数从中去掉，再保留3，同时删去所有3的倍数，下一个数是5、7... //该函数实际是算出2到max之间的素数，再取出min到max的部分 int GetPrime(int*prime,unsigned min,unsigned max) { 	if(prime==NULL || max<min) 		exit(1); 	if(max<2) 		return 0; 	if(min<2) 		min=2; 	int num=0; //素数个数 	bool *sieve=new bool[max+1]; 	for(unsigned i=1;i<max+1;i++) 		sieve[i]=true; 	unsigned j=1; 	while(j<max) 	{ 		j++; 		if(sieve[j] && j>=min) 			prime[num++]=j; 		for(unsigned k=j;k<max+1;k+=j) 			sieve[k]=false; 	} 	delete[] sieve; 	return num; }    第二个问题，循环判断每个数就行  bool IsPrime(unsigned n) { 	if(n<2) 		return false; 	for(unsigned i=2;i*i<=n;i++) 		if(n%i==0) 			return false; 	return true; }   用的是用unsigned int 无符号整数

user: user-3
content: Finding prime numbers - Kenneth Haugland  Different schemas for finding prime numbers explained with code http://www.codeproject.com/Articles/429694/Finding-prime-numbers

user: user-4
content: 找到一个好的算法，画好流程图，然后自己动手写，然后调试，这样能更好的学好c，等成高手在copy也不迟

user: user-5
content: 1 直接筛 #define N 1000000 bool not_prime[N];  void sieve_init(){     for(int i=2,ii=sqrt(N)+1;i<=ii;i++) if(!not_prime[i]){         for(int j=i*i;j<N;j+=i) not_prime[j] =1;     } }  int main() {     int a,b;     sieve_init();     while(cin>>a>>b&&b){         if(b>=N) continue;         for(int i=max(a,2);i<=b;i++) if(!not_prime[i])             printf("%d ",i);         puts("");     }     return 0; }
user-0 提问: C语言的新手问题！

回复:
user: user-0
content: 明白了！ 感谢2位大神！

user: user-1
content: double array[][5]={0};  第一维没有指定，需要使用初始化列表来推断。你的初始化列表只有一个元素，所以会推断为 double[1][5]。  所以从 array[1][0] 开始，就已经访问越界了。

user: user-2
content: 1）double array[][5]={0};相当于 double array[1][5]={0};   要么初始化数据确定数组 大小，要么直接在数组声明部分确定数组大小   不要过于偷懒 2）array[1075576832][0]=8 这个数组没这么大？这是严重的越界。

user: user-0
content: array[1075576832][0]=8        //这样的时候 顺便输入一个数或则字符什么的 就自行结算了 按 <RETURN> 来关闭窗口...
user-0 提问: 求助 如何在有序加权任务图中寻找后继节点并找到最小值

回复:
user: user-0
content: 是我表述不清楚么

user: user-1
content: 楼主这个问题太高大上，不是矮穷矬的我辈所能理解和帮忙解决的。
user-0 提问: 关于SD卡判断最后存入的数据的位置

回复:
user: user-1
content: 你需要在成功写入一个数据块的时候，在 SD 卡上写入标志。  我们的硬件工程师说，在掉电的时候，是有足够的时间向 SD 卡写入最后的数据的。

user: user-0
content: 引用 3 楼 Saleayas 的回复:你需要在成功写入一个数据块的时候，在 SD 卡上写入标志。  我们的硬件工程师说，在掉电的时候，是有足够的时间向 SD 卡写入最后的数据的。 我的意思是我掉电之后再上电，怎么找到SD卡中我最后存入的数据的位置在哪里

user: user-0
content: 引用 1 楼 user-2 的回复:不懂， 文件可以带时间吗？ 我也是刚开始用SD卡，还不清楚怎么带时间

user: user-2
content: 不懂， 文件可以带时间吗？
user-0 提问: 代码

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

user: user-2
content: void squeeze(char s1[], char s2[]) { 	int i, j, k; 	k = 0; 	for (i = 0; s1[i] != '\0'; i++) 	{ 		for (j = 0; s2[j] != '\0'; j++) 			if (s1[i] == s2[j]) 				break; 		if(s2[j] == '\0') 			s1[k++] = s1[i]; 	} }

user: user-3
content: g刚没注意括号 void squeeze(char s1[], char s2[]) { int i, j, k; k = 0; for (i = 0; s1[i] != '\0'; i++) { for (j = 0; s2[j] != '\0'; j++) { if (s1[i] == s2[j]) break; } if(s2[j] == '\0') { s1[k] = s1[i]; k++; } } }

user: user-3
content: 显然错了啊，没判断是否结束啊 void squeeze(char s1[], char s2[]) { int i, j, k; k = 0; for (i = 0; s1[i] != '\0'; i++) for (j = 0; s2[j] != '\0'; j++) { if (s1[i] == s2[j]) break; } if(s2[j] == '\0') { s1[k] = s1[i]; k++; }  }
user-0 提问: C++,错误:"const char *"类型的实参与"char *类型的形参不兼容"

回复:
user: user-1
content: if (ReadPgm ("im000.pgm", &I))  这个函数在visual stdio 2017中报了两个错，请教各位大神帮助  "const char *" 类型的实参与 "char *" 类型的形参不兼容  int ReadPgm(char*,imagestruct*)":无法将参数1从“”const char [10]“转换成“char” 请问各位大神以上两个问题应该怎么解决，谢谢

user: user-2
content: data.c_str()

user: user-3
content: chartowchar 是个什么函数，他的参数类型是什么，是不是const char *

user: user-0
content: 奇怪，为什么结帖后分数没有给出，我记得分配了分数的，谢谢大家，如果真的没有分数真不好意思

user: user-0
content: 谢谢各位，最后解决了，用const_cast<char *>强制去除const属性，data.data(),data.c_str()我都试过不行的

user: user-0
content: 引用 1 楼 user-4 的回复:应该写data.c_str()吧 类型不兼容，强制转呗 写成 LPCTSTR macaddressvalue = chartowchar((char *)data.c_str()); 谢谢，这个待我试试

user: user-4
content: 应该写data.c_str()吧 类型不兼容，强制转呗 写成 LPCTSTR macaddressvalue = chartowchar((char *)data.c_str());
user-0 提问: 这个算法该怎么写?

回复:
user: user-1
content: 就是遍历出这棵树就行了吧

user: user-2
content: 应该一个简单的递归就可以吧  void OutputNode( Node *pNode )	{ 	if ( pNode->pLeft != NULL )	{ 		OutputNode ( pNode->pLeft ); 	} 	 	printf("%d", pNode->value ); 	 	if ( pNode->pRight != NULL )	{ 		OutputNode ( pNode->pRight ); 	} }  OutputNode ( root );	//Root is the root of 二叉排序树
user-0 提问: C语言的内存模式在DOS下和保护模式的区别?? 

回复:
user: user-1
content: VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！

user: user-2
content: 平面内存模式 (flat memory model) 是一种组织 内存 寻址空间的方式。一个用本地32位Windows格式写成的程序是由所谓“平坦内存模型”创建的，它只有一个包含代码和数据的段。这个程序必须在386或更高的处理器上运行。早期的16位代码，由段和偏移地址混合达到寻址64k（段的限制）。与此不同的是，平坦内存模型只需要偏移量却有4G的寻址范围。这使得汇编更容易书写，而代码总得来说也将快一点。 在这种模式下，一个电脑的应用程序最多使用两个内存区段，一个是给程序码使用，另外一个是资料。此外，同样的区段也可以用量同时给程序码或是资料使用，但这是不必要的，因为只有对于自我更改程序码 的程序才有用处，但这种程序设计风格 现今被视为一种很不好的方法。  平面内存模型的优点 应用程序在存取他们的资料时候不需要切换不同的区段。然而，在 16 位元的 Intel 8086 和 80286 中，这种方式是不可行的，因为应用程序无法存取超过 64 KB 的资料。在 32 位元的芯片，应用程序可以存取最大到 4 GB 的资料。但这也变成现在大的数据库以及像是影片编辑应用程序的问题。  在这种平坦内存模型下，所有的段寄存器都被自动设为相同的值，而这意味着段/偏移寻址方式一定不能用于在32位Windows上运行的32位程序。 对于曾经在DOS下写程序的程序员来讲，一个32位的Windows PE可执行文件就像一个DOS下的COM文件，它们仅有一个包含程序代码和数据的段，而它们都直接用偏移地址，而不是段/偏移寻址方式。平坦模型程序是近（NEAR）代码寻址以及近数据寻址，都是在4G的范围之内。搜索 FS和GS段寄存器不在普通的程序中用到，但却被操作系统的某些程序实例所利用。

user: user-3
content: Win32 是仅有一种 （保护模式）flat 模式，有人翻译为 平坦模式。 不过汇编语言，还支持实模式 tiny,small 等5～6种模式

user: user-2
content: 你问这些一下解释不清，要需要看这本书：杨季文《80x86汇编语言程序设计教程》的中后部分（从提高部分开始），该书讲解的相当不错，网上能下载到。

user: user-4
content: 在WIN32下这个貌似不重要，都是虚拟存储管理、虚拟地址空间了，都是32位地址、指针。
user-0 提问: 求助大神阿！关于RGBA数据写BMP文件的问题！

回复:
user: user-1
content: 4字节对齐数据，计算一下图像宽度吧，如果除4不是整数，就要多写余数个0补齐4字节。

user: user-2
content: 引用 3 楼 u010297717 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] RGBA, 这是32位的bmp吗 是的，图像的长宽像素都没有错误，但是打出来的图片都是错位的，而且错位的都很有规律[/quote]如果是32位图, 本身就对齐的暂时想不到什么原因, 这种规律倒像是24位图没对齐

user: user-3
content: 提醒：每行像素数据是按4字节对齐的，如果没对齐，后面会有1、2、3个字节补齐。

user: user-4
content: 1）是原图就是这样。 2）是读取数据出错。 用 画图程序看图，如果还是这样，就是原图错误，否则是读取有问题

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:RGBA, 这是32位的bmp吗 是的，图像的长宽像素都没有错误，但是打出来的图片都是错位的，而且错位的都很有规律

user: user-2
content: RGBA, 这是32位的bmp吗

user: user-4
content: 估计是多线程读取，或者批量读取 开始位置计算错误，或者行宽算错了

user: user-4
content: 文件宽度错误
user-0 提问: C语言的重定向和直接打开文件问题

回复:
user: user-1
content: 用feof判断文件尾试试

user: user-2
content: 你在编译器中调试时默认路径一般不是Debug文件夹路径，而是你CPP文件所在的那个文件夹，把txt放到那下面，或者用完整路径代替试下

user: user-3
content: 楼主公布一下所有源码吧，我在我机器执行一下看看

user: user-4
content: 用绝对路径, 或者在调试设置一下当前路径

user: user-5
content: Get the current working directory. char *_getcwd( char *buffer, int maxlen );  Change the current working directory. int _chdir( const char *dirname );  Create an absolute or full path name for the specified relative path name. char *_fullpath( char *absPath, const char *relPath, size_t maxLength );
user-0 提问: 谁有可以计算各种多项式crc值的网站

回复:
user: user-1
content: https://www.baidu.com/s?wd=%E5%90%84%E7%A7%8D%E5%A4%9A%E9%A1%B9%E5%BC%8Fcrc&rsv_spt=1&rsv_iqid=0xa013bcfc0001873c&issp=1&f=8&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_n=2&rsv_sug3=1
user-0 提问: C 语言下　读包含中文的unicode文件

回复:
user: user-1
content: In Visual C++ 2005, fopen supports Unicode file streams. A flag specifying the desired encoding may be passed to fopen when opening a new file or overwriting an existing file, like this:  fopen("newfile.txt", "rw, ccs=<encoding>");  Allowed values of the encoding include UNICODE, UTF-8, and UTF16-LE. If the file is already in existence and is opened for reading or appending, the Byte Order Mark (BOM) is used to determine the correct encoding. It is not necessary to specify the encoding with a flag. In fact, the flag will be ignored if it conflicts with the type of the file as indicated by the BOM. The flag is only used when no BOM is present or if the file is a new file. The following table summarizes the modes used in for various flags given to fopen and Byte Order Marks used in the file.  Encodings Used Based on Flag and BOM Flag  No BOM (or new file)  BOM: UTF-8  BOM: UTF-16   UNICODE  ANSI  UTF-8  UTF-16LE   UTF-8  UTF-8  UTF-8  UTF-16LE   UTF-16LE  UTF-16LE  UTF-8  UTF-16LE

user: user-2
content: 把所有的char都转成 wchar

user: user-2
content: 首先读取的是ascii码，然后转成unicode码  参考c/c++  http://blog.csdn.net/u010370871/article/details/48029071  代码如下 #include <iostream> #include <sstream> #include <fstream> #include <windows.h> using namespace std;  int main() {  	cout<<"input the strFilename:"<<endl; 	string strFilename; 	cin>>strFilename; 	ifstream infile(strFilename.c_str()); 	string strGetString; 	getline(infile,strGetString);  	int nGetStringSize=strGetString.length(); 	DWORD dwStringSize=MultiByteToWideChar(CP_ACP, 0, strGetString.c_str(), nGetStringSize, NULL, 0); 	wchar_t *wchGetString=new wchar_t[dwStringSize+1]; 	wmemset(wchGetString, L'\0', dwStringSize+1);  	//进行转换 	int nRet=MultiByteToWideChar(CP_ACP, 0, strGetString.c_str(), nGetStringSize, wchGetString, dwStringSize); 	if(nRet<=0) 	{ 		cout<<"转换失败"<<endl; 		DWORD dwErr=GetLastError(); 		switch(dwErr) 		{ 		case ERROR_INSUFFICIENT_BUFFER: 			printf("ERROR_INSUFFICIENT_BUFFER\n"); 			break; 		case ERROR_INVALID_FLAGS: 			printf("ERROR_INVALID_FLAGS\n"); 			break; 		case ERROR_INVALID_PARAMETER: 			printf("ERROR_INVALID_PARAMETER\n"); 			break; 		case ERROR_NO_UNICODE_TRANSLATION: 			printf("ERROR_NO_UNICODE_TRANSLATION\n"); 			break; 		} 	}  	wcout.imbue(locale("chs"));//中文输出 	cout<<strGetString<<endl; 	wcout<<wchGetString<<endl; 	wcout<<endl; 	  	return 0; }
user-0 提问: 二维数组用一维数组输出值为什么是地址？

回复:
user: user-1
content: 其实C/C++中的二维数组就不是真正意义上的二维数组，而是一维数组的一维数组

user: user-1
content: 其实C/C++中的二维数组就不是真正意义上的二维数组，而是一维数组的一维数组   假如 int arr[2][3][4]，则最左侕的int arr[2] 为第一层包内数据，下标2说明第一层包内有2个int[3][4]类型的小包；打开下一个小包，里面是int[4]，再打开下一个，里面是int  所以如果你只是写arr[0]那么得到的只是下一个包（是个数组），数组名可转换为指针，指向数组首地址，固输出的是地址

user: user-0
content: 引用 2 楼 Drench_ed的回复:二维数组为什么要用一维数组去输出呢？ 只是想知道用一维数组输出后是什么结果

user: user-2
content: 二维数组为什么要用一维数组去输出呢？
user-0 提问: 将一个浮点数转化为一个整数，不用强转，用位运算，怎么弄？

回复:
user: user-1
content: http://bbs.csdn.net/topics/390676437

user: user-2
content: 先看这个：http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html  上面这个是浮点数在内存中的存储方式，是分成几部分存的，你用位取出各部分，再运算，得到对应的其他类型数  不建议楼主自己实现，麻烦且效率不高；如果直接转换，用的是硬件实现，使用CPU浮点寄存器

user: user-3
content: 看是否IEEE浮点数， 不过一般如下方式处理就可以了： 首先，看是否特殊数，+0，-0，∞，Nan， 非数 设置一个策略，处理这些情况。 其次，是否非规格化小数，是 大约只能置为0 因为太小了。 对于规格化浮点数， 首先看指数，在不在整数表示范围。 不在，要么巨大，超过表示范围，置为最大整数（或者取最后若干位） 要么太小，不能化为整数，只能置为0了 其次看符号 设置+，-号 其次看尾数 ，和指数联合移位， 取出整数部分。 可能还需要 四舍五入，二进制其实是0 舍1入， 这个要根据你选取的策略，来决定是全部舍去，还是四舍五入 还是采用所谓的银行家算法（也是一种四舍五入， 不过5入不入看情况，分奇偶），

user: user-4
content: 如果是 IEEE 754 的浮点数的话，可以参考 IEEE 754 标准浮点数的表示。  https://en.wikipedia.org/wiki/IEEE_floating_point
user-0 提问: gcc 编译 utf16 编译不通过！跪求解决方法？？ 

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:1) u"" 的类型是 char16_t []   2) g++ 4.9.2 可以识别。  请给出你使用完整的程序，编译器及版本，完整的编译命令行及输出。   编译命令：   g++ -std=c++0x templ.cpp  已经通过。谢谢！

user: user-0
content: 引用 1 楼 user-1 的回复:1) u"" 的类型是 char16_t []   2) g++ 4.9.2 可以识别。  请给出你使用完整的程序，编译器及版本，完整的编译命令行及输出。  请问g++ 如何升级？

user: user-0
content: 引用 1 楼 user-1 的回复:1) u"" 的类型是 char16_t []   2) g++ 4.9.2 可以识别。  请给出你使用完整的程序，编译器及版本，完整的编译命令行及输出。  多谢，多谢。  代码：  #include <uchar.h> int main(void) {         const char16_t *s=u"abcdefg";         return 0; }   编译命令行   g++ templ.cpp   编译器输出  templ.cpp:1:19: fatal error: uchar.h: No such file or directory compilation terminated.   g++版本： #g++ --version g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 Copyright (C) 2011 Free Software Foundation, Inc. This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

user: user-1
content: 1) u"" 的类型是 char16_t []   2) g++ 4.9.2 可以识别。  请给出你使用完整的程序，编译器及版本，完整的编译命令行及输出。
user-0 提问: 二维数组用一维数组表示输出的为什么是地址？

回复:
user: user-1
content: 当成地址看就好了，本身也是地址而已

user: user-2
content: 二维数组分为行和列；i[1]表示的就是指第二行的首地址，即也是第二行第一列的首地址；当然在内存里存放的都是线性的，第一行和第二行都是串行保存在内存里的；为了便于理解二维数组，你可以理解成行和列，平面存储的；

user: user-3
content: #include <stdio.h> 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);     } } int main() {     int i[2][2]={{1,2},{3,4}};     HexDump((char *)&(i[0][0]),4*sizeof(int),(int)&(i[0][0]));     return 0; } //0012ff60 - 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 00  ................ //

user: user-4
content: 正确的打印方法i[1][1];

user: user-5
content: 其实C/C++中的二维数组就不是真正意义上的二维数组，而是一维数组的一维数组   假如 int arr[2][3][4]，则最左侕的int arr[2] 为第一层包内数据，下标2说明第一层包内有2个int[3][4]类型的小包；打开下一个小包，里面是int[4]，再打开下一个，里面是int  所以如果你只是写arr[0]那么得到的只是下一个包（是个数组），数组名可转换为指针，指向数组首地址，固输出的是地址

user: user-6
content: int i[2][2]; i    数组的数组 i[1] 数组 printf("...", i[1]);  数组，自动转化为指向数组第一个元素的指针 &i[1]  指向数组（i[1] ）的指针。  数组与数组的第一个元素拥有相同的地址。

user: user-7
content: 书上应该会告诉你，二维数组第一维是指针吧 http://blog.csdn.net/u010518261/article/details/43016765 博客上看看，
user-0 提问: 简易的关机小程序

回复:
user: user-1
content: 怎么不能运行呀

user: user-0
content: //以上版本在vs中不能运行，原因是vs中很多带“_s”后缀的函数是为了让原版函数更安全，传入一个和参数有关的大小值，避免引用到不存在的元素,防止越界。 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include <conio.h> using namespace std; void output() { 	printf("   ********************************\n"); 	printf("   *           关机小程序         *\n"); 	printf("   *                              *\n"); 	printf("   *   1.定时关机    2.取消关机   *\n"); 	printf("   *                              *\n"); 	printf("   *   3.立即关机    4.重启本机   *\n"); 	printf("   *                              *\n"); 	printf("   *   5.注销用户    0.退出程序   *\n"); 	printf("   *                         ydw  *\n"); 	printf("   ********************************\n"); } int main() { 	system("title 关机小程序");//设置cmd窗口标题 	system("mode con cols=38 lines=17");//窗口宽度高度 	system("color 0E");//设置颜色 	system("date /T");//时间 	system("TIME /T"); 	char cmd[20]= "shutdown -s -t "; 	char  t[10] = ""; 	output(); 	char c; 	int s; 	printf("请选择输入："); 	c = _getche(); 	//scanf("%d",&c); 	//getchar(); 	switch (c) 	{ 	case '1': 		printf("\n多少分钟后自动关机(输入后按回车):"); 		scanf_s("%d", &s); 		s = s * 60; 		sprintf_s(t, "%d", s);//将int 型的s 转为字符串型的 t 		strcat_s(cmd, 20, t);//拼接两个个字符串 		system(cmd); 		break; 	case '2':system("shutdown -a"); break; 	case '3':system("shutdown -s -t 0"); break;//system("shutdown -p"); 	case '4':system("shutdown -r"); break; 	case '5':system("shutdown -l"); break; 	case '0':break; 	default:printf("Error!\n"); 	} 	//system("pause"); 	//exit(0); 	return 0; }

user: user-0

user: user-2
content: 不错不错，学习了，谢谢楼主

user: user-3
content: 直接批处理更直接

user: user-3
content: 用批处理更直接

user: user-4
content: 可以自己做个界面，不用控制台语句而是使用API 另外重启应该改为system("shutdown -r -t 0");

user: user-5
content: 其实就是个控制台语句………

user: user-4
content: 不错不错~~！
user-0 提问: 怎么计算出各segment的虚拟地址

回复:
user: user-0
content: 引用 4 楼 lm_whales 的回复:为什么要等于？  段与段之间不是应该相邻吗？我测试的时候相差0x1209，计算式算上连接处的两次映射和地址对齐也不应该相差这么多。 那段之间的部分应该是什么内容呢？

user: user-1
content: 为什么要等于？

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:Linux下ELF的装载和Windows下PE的装载没有本质区别，我觉得。  PE的装载不怎么熟悉，请问是怎么得到各segment的地址的呢？

user: user-2
content: Linux下ELF的装载和Windows下PE的装载没有本质区别，我觉得。

user: user-0
content: 追加： 为什么segment table中第一行中的segment的地址加上segment大小不等于第二条segment的初始地址？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:参考《Windows PE权威指南》？ 现在主要是学习ELF的装载，没怎么注意PE的部分

user: user-2
content: 参考《Windows PE权威指南》？
user-0 提问: 求一个实验的C语言

回复:
user: user-1
content: 照着汇编用C语言改啊

user: user-2
content: 主程序花点时间倒是可以转出来,但 引用EXTRN	CODE(PCF8563_INIT,Write,Read,Read_Sequence,Time_Write,Time_Read,Alarm_Read,Alarm_Stop,Sec_Read) EXTRN	CODE(LCD_INIT, Disp_LineR)这些外部函数怎么办?  还有,把单片机的问题发到这个版块合适吗?

user: user-3
content: 这个网上应该有类似的资源的，你给100分估计没也没人愿意给你写的，这可不是一时半会能写好的，我建议你自己在网上搜一下吧

user: user-4
content: = =大学时也做过这种题目。略怀念。。
user-0 提问: C语言函数名后函数体外定义的指针变量

回复:
user: user-0
content: 去掉，运行不了

user: user-1
content: C 语言函数定义里，参数表有两种写法：  void rev(LINKLIST *head) {    ... } void rev(head) LINKLIST *head; {    ... }  两种写法效果差不多。
user-0 提问: c++小白求助

回复:
user: user-1
content: 我就是来看一下…因为我也是个小白…特别小白

user: user-2
content: 请看楼上的解答！

user: user-3
content: if (x<100 || x>999) { printf("输入有误，请重新输入:"); scanf("%d",&x); }

user: user-4
content: 引用 楼主 dqingshou 的回复:#include <stdio.h> void main() { 	int x; 	int a,b,c; 	printf("请输入一个三位数:"); 	scanf("%d",&x); 	if x<100 || x>999 :         printf("输入有误，请重新输入:"); 	scanf("%d",&x); 	a=x/100; 	b=(x-a*100)/10;     c=x-a*100-b*10; 	printf("百位数为:%d\n",a); 	printf("十位数为:%d\n",b); 	printf("个位数为:%d\n",c); } D:\作业\c++\151108\1.c(8) : error C2061: syntax error : identifier 'x' 求解 怎么改  a= x/100; b= (x%100)/10; c = x%10

user: user-5
content: if x<100 || x>999 :   ->   if (x<100 || x>999)  加个括号，去掉冒号
user-0 提问: c语言求助，本人菜鸟

回复:
user: user-1
content: 作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。  //如何将NSAB,14,25,1,65,357913941,N,34,E,757502,903701,1048976,1194525,中的357913941,757502,903701,1048976,1194525,提取出来放到一个新的数组中。。 #include <stdio.h> char s[]="NSAB,14,25,1,65,357913941,N,34,E,757502,903701,1048976,1194525"; double d[5]; int i; int main() {     if (5==sscanf(s,"%*[^,],%*[^,],%*[^,],%*[^,],%*[^,],%lf,%*[^,],%*[^,],%*[^,],%lf,%lf,%lf,%lf",&d[0],&d[1],&d[2],&d[3],&d[4])) {         for (i=0;i<5;i++) printf("%.15lg\n",d[i]);     } else {         printf("Format error:%s\n",s);     }     return 0; } //357913941 //757502 //903701 //1048976 //1194525 //
user-0 提问: 如何理解typedef Node * List 

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: List表示Node*,函数中可以通过传入指向想要访问的变量的指针来对指针所指向的内存进行访问，所以传入Node**,可以对Node*进行访问

user: user-3
content: 引用 2 楼 wwbpm 的回复:[quote=引用 1楼paschen 的回复:]typedef Node * List;    表示可以用List表示Node*这种类型  如下面写：List a;  等价于 Node* a;而Node表示struct node这个类型，那List * plist不就表示Node **List了，还是不明白这两个**是什么意思……只用一个表示成List plist不就可以了吗……[/quote]  对，就表示Node**了 两个**是二级指针，指向Node*指针，具体为什么用要看程序的功能 二级指针可以表示一个一级指针的地址，或者表示一个二维数组等，具体看程序需要

user: user-0
content: 引用 1楼paschen 的回复:typedef Node * List;    表示可以用List表示Node*这种类型  如下面写：List a;  等价于 Node* a;而Node表示struct node这个类型，那List * plist不就表示Node **List了，还是不明白这两个**是什么意思……只用一个表示成List plist不就可以了吗……

user: user-3
content: typedef Node * List;    表示可以用List表示Node*这种类型  如下面写：List a;  等价于 Node* a;

user: user-4
content: typedef  Node  *  List 意思是List是存放链表的地址。是否可以理解成链表的头指针。  typedef  Node  List相当于定义List是链表的一个节点
user-0 提问: C语言编译时总是提示类型冲突

回复:
user: user-1
content: 请加 --std=c99 或者 --std=c11 。  gcc 扩展提供了一个 getline 函数，与你的冲突。加上以上选项可以避免加载 gcc 的扩展。

user: user-2
content: for(i=0;(length[i]=getline(str))>0;i++)  您的两个for,我都觉得有问题。
user-0 提问: 求教，这个程序为什么运行不了？

回复:
user: user-0
content: 谢谢，大家的解答。

user: user-1
content: 1、if后面的复合语句要加｛｝ 2、没有字符串给字符变量赋值的，要么char *grade; grade="first", 要么  char grade[20]; strcpy(grade,"first"); 3、字符串的输出用%s

user: user-2
content: 怎么个运行不了？需要说说具体现象啊。 另外，贴代码请用代码格式。要不太难读了。

user: user-3
content: 1.char grade[100];//如果字符串赋值，要接个长度，不然只是赋值一个字符，如‘a’; 2.printf("Grade:%s",grade);//字符串输出为 %s

user: user-0
content: 自己顶一下.
user-0 提问: 一个关于sprintf的问题求教：！

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

user: user-2
content: %nd 只保证 数据位数，包括（正）负号，比位宽小的时候，能够正确输出数据 当 实际位数>n的时候，n失效，按照实际宽度输出数据。

user: user-3
content: 题目忽悠你呢 主要是i的位数， 32位整数最大10位，5个char怎么也放不下

user: user-4
content: 无论%nd, 这个n是多少, 它不会截短整数, 只要i超过4位,s就没地方放0了

user: user-5
content: 大致理解：s长度为5,最后一个字节为 ‘\0’，因此能存储整数的字节为4个，"%4d"表示准换后保留4位，如果没有4，当转化的数字大于4位，可能溢出，因此不安全。

user: user-6
content: C  snprintf 会安全一些。
user-0 提问: 大神 求指导，5阶幻方运行停止

回复:
user: user-0
content: #include<stdio.h> main() {   int i,j,x=1,y=3,a[6][6]={0};              /*因为数组下标要用1到5，所以数组长度是6*/   for(i=1;i<=25;i++)   {     a[x][y] =i;                         /*将1到25所有数存到存到数组相应位置*/     if(x==1&&y==5)     {       x=x+1;                            /*当上一个数是第1行第五列时，下一个数放在它的下一行*/       continue;                         /*结束本次循环*/     }     if(x==1)                            /*当上一个数是是第1行时，则下一个数行数是5*/       x=5;     else       x--;                              /*否则行数减1*/     if(y==5)                            /*当上一个数列数是第5列时，则下一个数列数是1*/       y=1;     else       y++;                          /*否则列数加1*/     if(a[x][y]!=0)                      /*判断经过上面步骤确定的位置上是否有非零数*/     {       x=x+2;                            /*表达式为真则行数加2列数减1*/       y=y-1;     }   }   for(i=1;i<=5;i++)                      /*将二维数组输出*/   {     for(j=1;j<=5;j++)       printf("%4d",a[i][j]);       printf("\n");                     /*每输出一行回车*/   } }

user: user-0
content: 怎么改阿。。。

user: user-1
content: if(a[x][y]!=0) 		{ 			x=x+2; 			y=y-1; 		}  这步反问越界了，你调试下