Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 怎样把反斜杠\，不被当成转义字符处理

回复:
user: user-1
content: 都过去一年多了啊 楼主现在有没有好的解决方案啊 ，我今天也遇到这样的问题。我是把字符串转换为stringBuilder 借助这个类的insert方法 在“\”这个字符的index下标前插入一个“\”这样就算解决了。

user: user-2
content: 这样写： \\\\

user: user-0
content: 谢谢各位 我还是用笨方法吧，转义字符也没几个，我挨个在字符串中查找，如找到某个转义字符，先替换成"-"，然后再在“-”后加上因配合转义字符丢掉的那个字母就行了

user: user-3
content: 引用 1 楼 user-8 的回复:两个就行了 \\+1

user: user-4
content: 引用 4 楼 linhan007 的回复:[quote=引用 2 楼 alln0211 的回复:] while(str[i]!='\0') {      if(str[i]=='\\')          {str[i]='-';} }  同样行不通。字符'\'，会自动和'\r'一块变成转义字符[/quote] 用fprintf把字符串写到文本里，再用fgetchar去读呢？

user: user-5
content: 将半角\替换为全角＼

user: user-6
content: "\\PCS\rConverterUDCtotal_1"，这个字符串里面只有一个反斜杠。\r 这个写法只是 C++ 的字符串的写法，\r 是回车，看不到反斜杠的。 可以看作是： @"\PCS<return>ConverterUDCtotal_1"，<return> 就是回车符。

user: user-7
content: 文件夹名字不允许有\

user: user-0
content: 引用 5 楼 user-8 的回复:[quote=引用 3 楼 linhan007 的回复:] [quote=引用 1 楼 user-8 的回复:] 两个就行了 \\ 字符限定是"\\PCS\rConverterUDCtotal_1"，你可以试一下行不行。字符'\'，会自动和'\r'一块变成转义字符[/quote]文件或文件夹里边不能有\ /等等字符。[/quote] 文件的命名里是不能有\字符，所以用这此字符串用来命名文件前，我才要把反斜杠替换掉。问题是单个反斜杠怎样替换，怎样不被当做转义字符？

user: user-8
content: 引用 3 楼 linhan007 的回复:[quote=引用 1 楼 user-8 的回复:] 两个就行了 \\ 字符限定是"\\PCS\rConverterUDCtotal_1"，你可以试一下行不行。字符'\'，会自动和'\r'一块变成转义字符[/quote]文件或文件夹里边不能有\ /等等字符。

user: user-0
content: 引用 2 楼 alln0211 的回复:while(str[i]!='\0') {      if(str[i]=='\\')          {str[i]='-';} }  同样行不通。字符'\'，会自动和'\r'一块变成转义字符

user: user-0
content: 引用 1 楼 user-8 的回复:两个就行了 \\ 字符限定是"\\PCS\rConverterUDCtotal_1"，你可以试一下行不行。字符'\'，会自动和'\r'一块变成转义字符

user: user-4
content: while(str[i]!='\0') {      if(str[i]=='\\')          {str[i]='-';} }

user: user-8
content: 两个就行了 \\
user-0 提问: 给出一种将非素数分解为素数的算法，希望各位大神高手能帮忙优化

回复:
user: user-1
content: 可以用递归，代码精简一些

user: user-2
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-0 提问: 求一段简单病毒程序及杀毒代码

回复:
user: user-1
content: 想研究病毒，就自己多花时间精力。 不要寄希望在别人给简单代码。

user: user-2
content: 病毒起码得能自我复制吧,你们那算病毒吗,那新手每天都在写病毒.

user: user-3
content: 任何一个死循环分配内容都是病毒程序

user: user-4
content: 我曾经在网上贴过欢乐时光的代码，被封号了。

user: user-5
content: while(1) int *a=new int[10000];

user: user-6
content: 病毒代码 {       while(1)         交叉感染; }  杀毒代码 {       if(找到你)  干死你个B养的; }
user-0 提问: 求大神告诉我哪里出错了，详细点，谢谢~~~~

回复:
user: user-1
content: 自己用debug模式调试跟踪一下，在while((!sign)&&(bot<=end))处设置个断点看看各个变量的值，然后F10单步跟踪看看查找流程

user: user-2
content: 修改了23行、38行和40行，添加了49行 数字是从大到小排列的，你的逻辑是从小到大排列

user: user-2
content: #include <stdio.h> #define N 5  void main() { 	int a[N],i,num,bot,end,mid,loc,sign; 	char c; 	printf("请从大到小输入N个数:"); 	scanf("%d",&a[0]); 	i=1; 	while(i<N) 	{ 		scanf("%d",&a[i]); 		if(a[i]<=a[i-1]) 			i++; 		else 			printf("输入错误,请重新输入："); 	} 	while(1) 	{ 		printf("请输入要查找的数:"); 		scanf("%d",&num); 		if(num>a[0]||num<a[N-1]) 			loc=-1; 		bot=0; 		end=N-1; 		sign=0; 		while((!sign)&&(bot<=end)) 		{ 			mid=(bot+end)/2; 			if(num==a[mid]) 			{ 				loc=mid; 				printf("%d是第%d个数\n",num,loc+1); 				sign=1; 			} 			else if(num<a[mid]) 				bot=mid+1; 			else 				end=mid-1; 		} 		if(loc==-1||!sign) 			printf("此数不在范围内.\n"); 		printf("是否继续查找?(Y/N):"); 		getchar(); 		scanf("%c",&c); 		if(c=='N'||c=='n') 			break; 		sign = 0; 	} }

user: user-3
content: #include <stdio.h> #define N 5 int main() { 	int arr[N] = {}; 	int flag = 1; 	while(flag) 	{ 		printf("input five number(a,b,...):"); 		scanf("%d,%d,%d,%d,%d", &arr[0], &arr[1],&arr[2], &arr[3], &arr[4]); 		int num; 		printf("input find number:"); 		scanf("%d", &num); 		int i = 0; 		for(i = 0; i < N; ++i) 		{ 			if(arr[i] == num) 			{ 				printf("have number%d, index = %d\n\r", arr[i], i); 				flag = 0; 				break; 			} 		} 		if(flag != 0) 			printf("not find number\n\r"); 	} 	return 0; }  写代码注意规范， 实在不想看， 干脆重新给你写一个算了
user-0 提问: c指针

回复:
user: user-1
content: void myprintf(char* fmt, ...)  {  char* pArg=NULL; char *p; char c;   pArg = (char*) &fmt; //你觉得这句是什么什么意思

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

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

回复:
user: user-0
content: 引用 5 楼 fly_dragon_fly 的回复:把abs换掉 OK，accepted解决了，换成if语句判断，小于零求反就解决了。谢谢

user: user-0
content: 引用 4 楼 u013163178 的回复:输入是03:00,你用int来接受u输入,真的好吗 用int接受03和00，系统就当3和0处理了。不影响计算啊？

user: user-1
content: 把abs换掉

user: user-2
content: 输入是03:00,你用int来接受u输入,真的好吗

user: user-0
content: 引用#2 00:00 06:00也对啊，分别是0.00与180.00，没问题啊

user: user-3
content: 试试 00:00 06:00

user: user-0
content: 上面输出是 90.00 172.50 没复制完全
user-0 提问: 对于一个数组x 将相同的x值对应的y(x)取平均值 应该怎么实现？急急急~~~~~~

回复:
user: user-1
content: 引用 2 楼 darksworld 的回复:[quote=引用 1 楼 ri_aje 的回复:] 可以按 x 值排序，然后同 x 的点就相邻了，然后再遍历一遍，把相邻同 x 的点求 y 平均即可。 或者直接遍历一遍，用散列表存储同 x 的点。  “把相邻同 x 的点求 y 平均即可”，刚刚忘说x已经按照从小到大排列了，请问具体引号里的这句话具体怎么操作。。。[/quote] 就是这样，比如有点， (1,0) (2,0) (2,1) (2,4) (3,7) (4,1) 那么相邻同 x=2 的点就是 (2,0) (2,1) (2,4) 把他们的 y 值取平均就是 5/3。因为所有点按 x 值已序，所以 x 值相同的点在序列中一定相邻。

user: user-2
content: 查找 累加，计数 相除

user: user-3
content: double  x[100]={......}; double  y[100]={........}; bool    check[100]={0};     //检查过的数据做个标记,即空间换时间 long    checknum=0;         //检查过的数目  double  cx[100]={0};   //没重复的x值 double  py[100]={0};   //对应y平均值 long    yn[100]={0};   //同x值的个数 long    cn=0;          //无重复的x个数  double   sum=0; double   count=0;  for(int i=0;i<100;i++) { 	if(!check[i]) 	{ 		check[i]=true; 		sum=y[i]; 		count=1; 		cx[cn]=x[i]; 		checknum++; 		for(int j=i+1;j<100;j++) 		{ 			if(x[i]==x[j]) 			{ 				sum+=y[j]; 				count++; 				check[j]=true; 				checknum++; 				yn[cn]++; 			}         } 		py[cn]=sum/count; 		cn++; 	} 	if(checknum>=100) break; }

user: user-3
content: if(x[i]==x[j])  {                 sum+=y[j];                 count++;                 check[j]=true;                 checknum++;//这个漏了  }

user: user-3
content: double  x[100]={......}; double  y[100]={........}; bool    check[100]={0};     //检查过的数据做个标记,即空间换时间 long    checknum=0;         //检查过的数目  double   sum=0; double   count=0;  for(int i=0;i<100;i++) { 	if(!check[i]) 	{ 		check[i]=true; 		sum=y[i]; 		count=1; 		checknum++; 		for(int j=i+1;j<100;j++) 		{ 			if(x[i]==x[j]) 			{ 				sum+=y[j]; 				count++; 				check[j]=true; 			}         } 		平均值=sum/count; 	} 	if(checknum>=100) break; } 你可以再定义一个数组来保存平均值

user: user-4
content: 关键要确定x有那几个y对应

user: user-0
content: 引用 1 楼 ri_aje 的回复:可以按 x 值排序，然后同 x 的点就相邻了，然后再遍历一遍，把相邻同 x 的点求 y 平均即可。 或者直接遍历一遍，用散列表存储同 x 的点。  “把相邻同 x 的点求 y 平均即可”，刚刚忘说x已经按照从小到大排列了，请问具体引号里的这句话具体怎么操作。。。

user: user-1
content: 可以按 x 值排序，然后同 x 的点就相邻了，然后再遍历一遍，把相邻同 x 的点求 y 平均即可。 或者直接遍历一遍，用散列表存储同 x 的点。
user-0 提问: C语言课设问题：五子棋

回复:
user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:http://www.baidu.com/s?wd=%E4%BA%94%E5%AD%90%E6%A3%8Bc%E8%AF%AD%E8%A8%80%E4%BB%A3%E7%A0%81&rsv_spt=1&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_pq=c5e5a92100005975&rsv_t=6b31sdgDHn7NJBw4kQZjGZXYYftspo4gNWIsq6i7f93g5e0SLFz9K1uFsYPUJTmg220P&oq=%E4%BA%94%E5%AD%90%E6%A3%8B%20C&inputT=13175&rsp=0  正是有楼主这样连度娘都懒得用的衣食父母，本ID才有论坛积分赚啊！你没看我发的文件，要在AI函数里补充的

user: user-0
content: 引用 1 楼 user-2 的回复:还有 木马？那个是运行的exe，360要添加信任

user: user-1
content: http://www.baidu.com/s?wd=%E4%BA%94%E5%AD%90%E6%A3%8Bc%E8%AF%AD%E8%A8%80%E4%BB%A3%E7%A0%81&rsv_spt=1&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=0&rsv_pq=c5e5a92100005975&rsv_t=6b31sdgDHn7NJBw4kQZjGZXYYftspo4gNWIsq6i7f93g5e0SLFz9K1uFsYPUJTmg220P&oq=%E4%BA%94%E5%AD%90%E6%A3%8B%20C&inputT=13175&rsp=0  正是有楼主这样连度娘都懒得用的衣食父母，本ID才有论坛积分赚啊！

user: user-2
content: 还有 木马？
user-0 提问: 关于对话框的回调函数自定义变量位置

回复:
user: user-1
content: BOOL CALLBACK XinZengLuRu (HWND hDlg, UINT message,                             WPARAM wParam, LPARAM lParam) {     TCHAR sXuHao[10],sFileDir[1024];     HWND hList=GetDlgItem(hDlg,LV_A);     switch(message)     {     case WM_INITDIALOG :     {         TCHAR sField[5][50]={"序号","班级","姓名","身份证号"};         ListView_SetExtendedListViewStyle(hList, LVS_EX_GRIDLINES|LVS_EX_CHECKBOXES);         AddList(sField,hList);         return TRUE ;     }     case WM_CLOSE:         EndDialog(hDlg,0);         return 0;     case WM_COMMAND:         switch(LOWORD(wParam))         {         case BT_XUANZE:             ZeroMemory(sFileDir,sizeof(sFileDir));             SetDlgItemText(hDlg,ET_WENJIAN,GetFileDir(sFileDir));                    return 0;         case BT_LURUPL:                          return 0;         }         return 0;     }     return 0; }
user-0 提问: 字符串指针与字符串数组的问题

回复:
user: user-1
content: #include <stdio.h> #include <cstdlib> void main(){ 	char st[20],*ps; 	int i; 	printf("input a string:"); 	scanf("%s",st);//改用scanf，直接给数据赋值 	ps=st;//指针指向数组首地址 	for(i=0;ps[i]!='\0';i++) 		if(ps[i]=='k'){ 			printf("there is a 'k' in the string\n"); 			break; 		} 		if(ps[i]=='\0') 			printf("There is no 'k' in the string\n"); 		system ("pause"); }

user: user-2
content: char st[20],*ps;  //定义了一个数组， 以及一个指针 	int i; 	printf("input a string:"); 	ps=st; //数组名也等于一个指针, 赋值之后ps可以操作st这个数组的内容 	scanf("%s",ps);  //这里不要用scanf_s（）; 不具备通用性， scanf()才是标准C的函数  	for(i=0;ps[i]!='\0';i++)  //for循环要加大括号， 否则第二个if不在for循环的作用域中 	{ 		if(ps[i] == 'k'){ 			printf("there is a 'k' in the string\n"); 			break; 		} 		if(ps[i]=='\0') 			printf("There is no 'k' in the string\n"); 	}

user: user-3
content: scans_s 要么指定长度，要么传入数组名，直接传指针不行的 scanf_s("%s", st)

user: user-4
content: 把“scanf_s("%s",ps);”改成“scanf_s("%s",ps，20);”或者“scanf("%s",ps);”

user: user-0
content: 引用 2 楼 fly_dragon_fly 的回复:scans_s 要么指定长度，要么传入数组名，直接传指针不行的 scanf_s("%s", st)  用scanf_s的话确实要指定长度，直接传入指针或数组名都无法得到正确结果

user: user-0
content: 引用 6 楼 adusuccessfully 的回复:另外 char st[20],*ps;     int i;     printf("input a string:");     ps=st;     scanf_s("%s",ps);  我觉得可以简化，没有必要再定义一个指针：  char ps[20]; 	int i; 	printf("input a string:"); 	//scanf("%s",ps); 	scanf_s("%s",ps,20);   嗯，如果优化代码确实是这样，我因为是想把指针学得透彻一点。所以才把代码写成这样

user: user-0
content: 感谢各位的不吝赐教~  自己也验证了一下：把scanf_s("%s",ps);这行代码改成scanf("%s",ps);程序可以得出正确结果，但是依然会有一个安全警告，如果不喜欢可以改成scanf_s("%s",ps,20);或者scanf_s("%s",st,20);程序都可运行出正确结果

user: user-5
content: 另外 char st[20],*ps;     int i;     printf("input a string:");     ps=st;     scanf_s("%s",ps);  我觉得可以简化，没有必要再定义一个指针：  char ps[20]; 	int i; 	printf("input a string:"); 	//scanf("%s",ps); 	scanf_s("%s",ps,20);

user: user-5
content: 我试了，一楼的解答是正确的~~~  #include <stdio.h> #include <cstdlib> void main(){ 	char st[20],*ps; 	int i; 	printf("input a string:"); 	ps=st; 	//scanf("%s",ps); 	scanf_s("%s",ps,20); 	for(i=0;ps[i]!='\0';i++) 		if(ps[i]=='k'){ 			printf("there is a 'k' in the string\n"); 			break; 		} 	if(ps[i]=='\0') 		printf("There is no 'k' in the string\n"); 	system ("pause"); 		//return 0; }  百度一下scanf_s，得知：很多带“_s”后缀的函数是为了让原版函数更安全，传入一个和参数有关的大小值，避免引用到不存在的元素，有时hacker可以利用原版的不安全性黑掉系统。比如:char d[20];写成scanf_s("%s",d,20);才是正确的，有这个参数20使准确性提高。 学习了~~~
user-0 提问: P3段无法继续输入，scanf不能运行了，为啥？

回复:
user: user-1
content: p1：,p2：,p3： 这是干啥的？

user: user-2
content: 请判断scanf的返回值！

user: user-3
content: 楼上程序有些瑕疵，换这个：#include <stdio.h> int main() { 	int l, i, r, j, k, m, n; 	int a[1001]; 	char s; 	char b[1001]; 	float t; 	float c[1001]; P1:scanf("%d", &l); 	for (i = 0; i < l; i++) 	{ 		scanf("%d", &a[i]); 	} 	scanf("%d", &r); 	puts("P1 End");  P2:scanf("%d", &m); 	getchar(); 	for (j = 0; j < m; j++) 	{ 		scanf("%c", &b[j]); 		getchar(); 	} 	scanf("%c", &s); 	puts("P2 End");  P3:scanf("%d", &n); 	for (k = 0; k < n; k++) 	{ 		scanf("%f", &c[k]); 	} 	scanf("%f", &t); 	puts("P3 End"); }

user: user-3
content: 这样改：#include <stdio.h> int main() { 	int l, i, r, j, k, m, n; 	int a[1001]; 	char s; 	char b[1001]; 	float t; 	float c[1001]; P1:scanf("%d", &l); 	for (i = 0; i < l; i++) 	{ 		scanf("%d", &a[i]); 	} 	scanf("%d", &r); 	puts("P1 End");     //运行位置输出  P2:scanf("%d", &m); 	getchar(); 	for (j = 0; j < m; j++) 	{ 		scanf("%c", &b[j]); 	} 	getchar(); 	scanf("%c", &s); 	puts("P2 End");      //运行位置输出  P3:scanf("%d", &n); 	for (k = 0; k < n; k++) 	{ 		scanf("%f", &c[k]); 	} 	scanf("%f", &t); 	puts("P3 End");    //运行位置输出 }
user-0 提问: 编程题-去掉字符串重复字符

回复:
user: user-1
content: 可以用位图算法实现。或者哈希表。就可以提高效率

user: user-2
content: #include <stdio.h>  void funiction(char* old,char* new) { 	int temp[256]={0}; 	for(;*old;old++) 	{ 		if(temp[*old]==0) 		{ 			*new=*old; 			temp[*old]=1; 			new++; 		} 	} 	*new='\0'; }  int main () { 	char oldstr[100]; 	char newstr[100]; 	gets(oldstr); 	funiction(oldstr,newstr); 	puts(newstr); 	return 0; }

user: user-3
content: 拿第一个和后面的比较，相同的就用后面的字符覆盖；然后拿第二个和后面的比较，相同的就用后面的字符覆盖。依次类推，直到字符串的末尾;

user: user-0
content: 引用 6 楼 user-8 的回复:华为的一道编程题目也就这个，下面是我写的。。  #include <iostream> using namespace std; void stringFilter(const char *pInputStr,long lInputLen,char *pOutputStr) { int i,j; *pOutputStr = *pInputStr; int k=0; for(i=1;i<lInputLen;i++) { bool m_flag=false; for(j=0;j<i;j++) { if(pInputStr[i]==pInputStr[j]) { m_flag=false; break;     } else   m_flag=true; } if(m_flag) pOutputStr[++k]=pInputStr[i]; } pOutputStr[++k]=0; return; } int _tmain(int argc, _TCHAR* argv[]) {     char a[1000]; char *str=a; cin>>str; int len=strlen(a)+1; char b[1000]; stringFilter(str,len,b);//b只能用数组，用指针就报错,要用指针的话要给指针分配内存空间，如用new,或将指针指向一个静态数组 cout<<b; system("pause"); return 0; } 写的代码很好1

user: user-4
content: 楼主可以参考这个帖子，我以前看过~~~http://bbs.csdn.net/topics/390933887

user: user-5
content: 新建一个串，原串逐个边检查边往新串里插入。

user: user-6
content: 查找子串的变体，可以参考一些查炸子串的算法

user: user-7
content: #include<set> #include<string> #include<iostream> using namespace std;  int main() { 	set<char> s; 	string  str; 	cin >> str; 	for(auto const &a : str) 	{ 		s.insert(a); 	}  	for(auto const &a : s) 	{ 		cout << a; 	} 	cout << endl; }

user: user-8
content: 华为的一道编程题目也就这个，下面是我写的。。  #include <iostream> using namespace std; void stringFilter(const char *pInputStr,long lInputLen,char *pOutputStr) { int i,j; *pOutputStr = *pInputStr; int k=0; for(i=1;i<lInputLen;i++) { bool m_flag=false; for(j=0;j<i;j++) { if(pInputStr[i]==pInputStr[j]) { m_flag=false; break;     } else   m_flag=true; } if(m_flag) pOutputStr[++k]=pInputStr[i]; } pOutputStr[++k]=0; return; } int _tmain(int argc, _TCHAR* argv[]) {     char a[1000]; char *str=a; cin>>str; int len=strlen(a)+1; char b[1000]; stringFilter(str,len,b);//b只能用数组，用指针就报错,要用指针的话要给指针分配内存空间，如用new,或将指针指向一个静态数组 cout<<b; system("pause"); return 0; }
user-0 提问: 初学者求助！请各位大神帮忙写个代码

回复:
user: user-0
content: 这是本人写的，按“＃”更改密码那个想不出来，请各位大神帮忙修改，谢谢了。  #include <f330lib.h>  unsigned char n[4]; unsigned char p[4]={'2','4','1','0'};		// compare password 2410  void keyGetPwd(void)		//define function "keyGetPwd" { 	unsigned char i,j=0;	// unsigned i,j 	lcdInit();		// initialise lcd screen  	lcdSetXY(0,0);		// 1st column and 1st row 	lcdPutStr("WELCOME");		// place "WELCOME" at 1st column and 1st row  	lcdSetXY(0,1);		// 1st column and 2nd row 	lcdPutStr("Password:");		// palce "Password:" at 1st column and 2nd row    	for (i=1;i<5;i++)		// for loop get key char,until i=4,total 4 words(2410) 	{ 		j=keyGet();		// j get from keypad 		lcdPutCh('*');		// "*" is present instead of what char get from key pad 		n[i-1]=j;		// use "*" to clear the word 		  		if (j==0x2A)	// if "*" entered 		{ 			lcdInit();   			lcdSetXY(0,0);      			lcdPutStr("WELCOME");  	  		lcdSetXY(0,1);     			lcdPutStr("Password:");	  			i = 0;		// after clear restart 		}  		else if (j==0X23)	// if "#" entered 		{ 			lcdInit();   			lcdSetXY(0,0);      			lcdPutStr("New Password:");  	  		lcdSetXY(0,1);     			lcdPutStr(""); 		} 	} }  void main (void) { 	unsigned char m = 0; 	 	Init_Device();		// initialize device 	keyInit();		// initialize keypad 	lcdInit();		// initialize lcd screen  	while(1)  	{  		keyGetPwd();		// keygetpassword function       		if ((p[0] == n[0])&&(p[1] == n[1])&&(p[2] == n[2])&&(p[3]))  // compare the n[] array data from key set with unsigned char p[] array 		{   			lcdInit(); 			lcdSetXY(0,0); 			lcdPutStr("WELCOME"); 			lcdSetXY(0,1); 			lcdPutStr("Correct");		// if 2 array are same, display Correct 			m = 0;		// if correct password rerun  		} 		else 		{ 			lcdInit(); 			lcdSetXY(0,0);  			lcdPutStr("WELCOME"); 			lcdSetXY(0,1); 			lcdPutStr("Incorrect");		// if 2 array are not same, display Incorrect 			m++; 			if (m == 3)		// only can keyin 3 times wrong password 			{ 				lcdInit(); 				lcdSetXY(0,1); 				lcdPutStr("Entry is Locked!"); // after key 3 times wrong password display 				while(1);		// refuse any password entry	 			} 		} 				delayms (5000);		// delay 5 seconds 	 	} }

user: user-0
content: 我只需要代码就可以了，非机子不可吗？

user: user-1
content: 关于单片机的，没机子怎么写。。。

user: user-1
content: 简单的密码输入问题。。。
user-0 提问: sqlite3_step: errmsg    SQL logic error or missing database

回复:
user: user-0
content: 谢谢  问题已经解决了   程序太大了  是在其他线程 因为某些原因把其重新打开 造成的问题

user: user-1
content: 数据库查询逻辑错误或丢失的数据库。

user: user-0
content: 引用 1 楼 user-2 的回复:里面的errmsg不是出现了错误信息的么？还是其他什么问题？  SQL logic error or missing database

user: user-0
content: 引用 1 楼 user-2 的回复:里面的errmsg不是出现了错误信息的么？还是其他什么问题？  我不太清楚 这个错误信息是什么造成的

user: user-2
content: 里面的errmsg不是出现了错误信息的么？还是其他什么问题？

user: user-2
content: 引用 3 楼 q3733353520 的回复:[quote=引用 1 楼 user-2 的回复:] 里面的errmsg不是出现了错误信息的么？还是其他什么问题？  SQL logic error or missing database[/quote] 根据错误信息很明显的可以找问题啊。 要么sql语句出了问题，要么数据库不存在。你可以用SQLite的命令行检查
user-0 提问: 求高手解答一个班级选票系统，万分感激！！！

回复:
user: user-0
content: 谢了，不过这不是c语言吧

user: user-1
content: #include <stdio.h>  #include <stdlib.h>  typedef struct node  { // 候选人结构  char name[8];  int num;  int score;  int tax;  }Node;  void shellSort( Node **, int );  int main(void)  {  int n = 0;  Node * pArray[9]={};//指针数组，长度9  int count = 0;  //int status = 1;  int vote = -1;  printf("Input the number of the candidates(1-9):\n");  scanf("%d", &n);  while(getchar()!='\n')  {;  }  while (n>9 || n<1)  {if (n>9)  {printf("No, there cannot be so many candidates. Retry.\n");  }  else{  printf("No candidates? It cannot be! Retry!\n");}  scanf("%d", &n);  while(getchar()!='\n')  { ;}  }  for (count=0; count<n; count++)  {  pArray[count] = (Node *)malloc(sizeof(Node));  pArray[count]->num = count+1;  pArray[count]->tax = 0;  pArray[count]->score = 0;  printf("Input No.%d candidate's name:\n", count+1);  gets(pArray[count]->name);  }  while (vote)  {  printf("Now, let us vote:\n*************\n");  for (count=0; count<n; count++)  {  printf("%d. %s\n", count+1, pArray[count]->name);  }  printf("0.quit\n*************\n");  scanf("%d", &vote);  while(getchar()!='\n')  {  ;  }  while (vote<0 || vote>n)  {  printf("No joke, thank you. Revote.\n");  scanf("%d", &vote);  while(getchar()!='\n')  {  ;  }  }  if (vote>0&&vote<=n)  {  pArray[vote-1]->score++;  }  }  printf("Finish voting. Let's find the winner......\n\n");  shellSort( pArray, n );  for (count=0; count<n; count++)  {  pArray[count]->tax=count+1;  printf("%d. %s %d votes.\n", count+1, pArray[count]->name, pArray[count]->score);  }  for(count=0; count<n; count++)  {  free(pArray[count]);  pArray[count] = NULL;  }  return 0;  }  void shellSort( Node *p[], int len )  {  const int Length = len;  int i = 0;  int j = 0;  int gap = 0;  Node *temp = NULL;  gap = Length/2;  while (gap>0)  {  for (i=gap; i<Length; i++)  {  j = i - gap;  temp = *(p+i);  while ( (j>=0) && (p[j]->score < temp->score) )  {  *(p+j+gap) = *(p+j);  j = j - gap;  }  *(p+j+gap) = temp;  }  gap /= 2;  }  }
user-0 提问: c控制台程序如何save&load

回复:
user: user-1
content: console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

user: user-2
content: 我记得控制台程序可以SetConsoleCtrlHandler得到事件，由于不能得到wndproc，并不知道系统在之前做了些什么，最好还是用GUI的消息机制，自己处理一下更为简单

user: user-0
content: 手机码字，有错误的地方，请见谅，在路上，没电脑
user-0 提问: make 时出错误~求大神看看

回复:
user: user-0
content: 引用 2 楼 ricciinhp 的回复:在msx264.c文件的第58行，将整型值强制转化成指针时出错了，你改一下源代码，如下 void *p = (void*)integer //58行哦  谢谢~

user: user-1
content: 在msx264.c文件的第58行，将整型值强制转化成指针时出错了，你改一下源代码，如下 void *p = (void*)integer //58行哦

user: user-2
content: gcc的版本不对。我猜。
user-0 提问: 做了个学生信息管理，半成品~~文件内查找有问题，真心求指导不胜感激

回复:
user: user-1
content: void cx()             //3功能查找 {  system("cls");  printf("--------------------------------------------------------------------------------");  printf("       1.按学号查找              2.按姓名查找              3.返回主菜单\n");  printf("--------------------------------------------------------------------------------\n");  printf("请输入所需要功能对应的数字：\n");  scanf("%d",&choose);  switch(choose)  {  case 1:cx_num();  break;  case 2:cx_name();  break;  default:main();       // 虽然这里没有出错，但是建议楼主不要这样做。这样写，查询次数一多，每次都选3，跑不了多久就会挂的，递归调用占用栈空间，会造成栈溢出  break;  }

user: user-1
content: void cx_num()     //学号查找 {char ch2;  int a;  FILE *fp;   printf("请输入要查找的学号:\n");  scanf("%d",&a);  printf("--------------------------------------------------------------------------------");  printf("\t\t学号	姓名	性别	年龄	成绩	地址\n");  fp=fopen("stu.txt","r");  ch2=fgetc(fp);  while(ch2!=EOF)  {putchar(ch2);   if(strcmp(ch2,a)==0) // a是数字，ch2是字符，为什么用字符串比较？                                                                                 // 不是应该把输入的转换成字符串，然后跟文件中的字符串对比吗？或者都转换为数字也可以    printf("%s",ch2);   // ch2是字符，也不能用%s打印   else    printf("没有找到\n") ;  } }

user: user-2
content: printf("\t\t学号	姓名	性别	年龄	成绩	地址\n");  fp=fopen("stu.txt","r");  ch2=fgetc(fp);   //把这句放到循环中，  while(ch2!=EOF)  {putchar(ch2);   if(strcmp(ch2,a)==0)    printf("%s",ch2);   else    printf("没有找到\n") ;  }     循环有问题，

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

user: user-0
content: 学号查找和姓名查找那儿，一查就会崩溃

user: user-4
content: 学会发问！再具体点

user: user-0
content: 引用 6 楼 hnwyllmm 的回复:void cx()             //3功能查找 {  system("cls");  printf("--------------------------------------------------------------------------------");  printf("       1.按学号查找              2.按姓名查找              3.返回主菜单\n");  printf("--------------------------------------------------------------------------------\n");  printf("请输入所需要功能对应的数字：\n");  scanf("%d",&choose);  switch(choose)  {  case 1:cx_num();  break;  case 2:cx_name();  break;  default:main();       // 虽然这里没有出错，但是建议楼主不要这样做。这样写，查询次数一多，每次都选3，跑不了多久就会挂的，递归调用占用栈空间，会造成栈溢出  break;  }嗯嗯，学习了
user-0 提问: PAT Basic Level 第1020题，一个CASE提示段错误，另外，求教关于double类型数组的排序算法

回复:
user: user-1
content: 有没有可可能是总需求量大于总存储量 导致越界呢

user: user-2
content: Linux： 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令  Windows： 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: 关于malloc和字符串常量的问题请教下大家，谢谢

回复:
user: user-1
content: 无链接的标识符只能声明一次。傻了吧？ 6.7 Declarations 3 If an identifier has no linkage, there shall be no more than one declaration of the identifier (in a declarator or type specifier) with the same scope and in the same name space, except that: — a typedef name may be redefined to denote the same type as it currently does, provided that type is not a variably modified type; — tags may be redeclared as specified in 6.7.2.3. 4 All declarations in the same scope that refer to the same object or function shall specify compatible types.

user: user-2
content: 你所说的有问题是什么意思。问题描述不清

user: user-3
content: 第一种不行是你重复声明变量Ip1，变量名相同当然不行  你把  char *Ip1="192.168.0.1"; 改成 Ip1="192.168.0.1"; 也是可以的，只是会出现内存泄露

user: user-4
content: 第一种情况char *Ip1=(const char *)malloc(sizeof(char)*16);     char *Ip1="192.168.0.1";  =右边是const型，左为是非const 型，不可以直接赋值，可以去掉const属性。 再执行到第二行时第一行的堆内存会泄露。  第二种情况是定义一个指向常量存储区字符串的指针，没有问题。

user: user-5
content: char *ip1=(char *)malloc(sizeof(char)*16);   //不要用const char* //char *ip1="192.168.0.1"; //malloc 分配的内存相当于数组， 数组的赋值显然不能这样 sprintf(ip1,"%s", "192.168.0.1");   第二种情况 const char *ip1 = "192.168.0.1"; //字符串的字面值是在只读常量区，要用const char *, 显式的说明这个变量不可改
user-0 提问: 问一下职业方向

回复:
user: user-1
content: 慢慢学习，到后面你会发现主要问题都不是 逻辑问题。

user: user-2
content: 软件做到后面就是熟练工了。不会有那么多逻辑的问题。

user: user-3
content: 你做的那些嵌入式都是一些简单application，你想做一些深入的自己就好好学习操作系统（Linux之类的），协议（这个很多，有限无线通信协议，ethernet, wlan, bt, lte, 接口协议,pci, sd, usb, 存储协议/算法, 大数据处理），太多了，其实你还是一个小白

user: user-4
content: 楼主是在校学生吗？若是在校学生的话，找工作是参加校园招聘，可以看看往年各个公司的笔试题，自己就可以有方向地去学习~~~ 这个链接是我15年一些公司的笔试面试题： 2015百度，腾讯，新浪，美团，360，去哪儿网，迈瑞，展讯通信，杰发科校园招聘笔试题（软件开发类） http://download.csdn.net/detail/adusuccessfully/8096019

user: user-5
content: lz喜欢算法，但不想写代码，那就去找算法研究员之类工作吧。记得要找带“研究员”字样的职位，不是“工程师”职位

user: user-6
content: 看来得高人回帖

user: user-7
content: 我感觉数学比较适合你。

user: user-8
content: 搞哲学吧。 研究一下计算机科学的数学原理。哈哈。
user-0 提问: 如何用c语言读取二进制文件并输出这个图型

回复:
user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-1
content: 引用 3 楼 zerg73 的回复:楼上是不是回复错帖子了。。。 仅供参考，仅供参考。 楼主可以参考34～37行，将二进制字符串转为实际字节。

user: user-2
content: 楼上是不是回复错帖子了。。。

user: user-1
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: 题目的要求不太清晰啊……二进制文本的格式和含义是啥
user-0 提问: 字符串求助

回复:
user: user-1
content: 引用 3 楼 ycao24 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] #include <stdio.h> char s[]="FE 01 01 87 03 B5 01 01 00 00 00 00 00 00 32 B8"; int i; int main() {     i=0;     while (1) {         printf("[%.2s] ",(char *)s+i*3);         if (s[i*3+2]==0) break;         i++;     }     return 0; } //[FE] [01] [01] [87] [03] [B5] [01] [01] [00] [00] [00] [00] [00] [00] [32] [B8]   感谢赵老师 帮我解决问题[/quote]  这个表情应该是要报酬的意思吧。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:#include <stdio.h> char s[]="FE 01 01 87 03 B5 01 01 00 00 00 00 00 00 32 B8"; int i; int main() {     i=0;     while (1) {         printf("[%.2s] ",(char *)s+i*3);         if (s[i*3+2]==0) break;         i++;     }     return 0; } //[FE] [01] [01] [87] [03] [B5] [01] [01] [00] [00] [00] [00] [00] [00] [32] [B8]   感谢赵老师 帮我解决问题

user: user-1
content: #include <stdio.h> char s[]="FE 01 01 87 03 B5 01 01 00 00 00 00 00 00 32 B8"; int i,n,v; char b[100]; int main() {     i=0;     while (1) {         if (1!=sscanf((char *)s+i*3,"%2X",&v)) break;         b[i]=(char)v;         i++;         if (i>=100) break;     }     n=i;     for (i=0;i<n;i++) printf("%02X ",(unsigned char)b[i]);     return 0; } //FE 01 01 87 03 B5 01 01 00 00 00 00 00 00 32 B8

user: user-1
content: #include <stdio.h> char s[]="FE 01 01 87 03 B5 01 01 00 00 00 00 00 00 32 B8"; int i; int main() {     i=0;     while (1) {         printf("[%.2s] ",(char *)s+i*3);         if (s[i*3+2]==0) break;         i++;     }     return 0; } //[FE] [01] [01] [87] [03] [B5] [01] [01] [00] [00] [00] [00] [00] [00] [32] [B8]
user-0 提问: 什么是相对定时器？

回复:
user: user-1
content: 看接口也只能猜，要看源码才行。 可能它有一个绝对计时，比如从系统开始，晶振中断就计数。 而相对计时就相对这个计数而已

user: user-2
content: 相对定时器就是设定时长，在此刻之后设定时长到了时触发。其工作原理通常是利用当前时刻＋设定时长计算出一个未来的绝对时刻，再使用时钟定时器实现，或者，利用每间隔较短时长比如一秒，累加计数器，直到计数器值到达设定时长比如五秒实现。 时钟定时器就是设定绝对时刻如XX年XX月XX日XX时XX分XX秒，在设定绝对时刻到了时触发。  我猜。
user-0 提问: 谁能帮帮我，我编了好久都没编出来，急用

回复:
user: user-1
content: 引用 4 楼 TELIUOSE 的回复:用C语言来编。 纯C你能使用STL?楼主究竟搞清楚STL的使用场景不？

user: user-2
content: 引用 楼主 TELIUOSE 的回复:【设计要求】 设计基于堆的优先队列的哈夫曼编码程序。 （1）采用STL的堆、向量等数据结构。  我编不好，不知道是我想错了还是理解不透彻，希望大伙能帮我用C语言编出这道题，谢谢了！！！  这到底是要用C++还是用C？

user: user-3
content: 引用 1 楼 zhao4zhong1 的回复:把你的半成品贴上来。 老师风范，可以帮你费力找问题，拒绝顺手写代码

user: user-0
content: 用C语言来编。

user: user-4
content: 把你的半成品贴上来。
user-0 提问: 请教一个问题 马上就要考试了 这个编程不会做

回复:
user: user-1
content: 引用 9 楼 sholber 的回复:不该点进来，被楼上有些代码**到了，话说写个简单的程序就不能不那么臃肿么 float pay (int weight)  {     return weight >= 20 ? weight * 7.5 : weight * 9.3;  }66666666666666666666666666666666666

user: user-2
content: 引用 9 楼 sholber 的回复:不该点进来，被楼上有些代码**到了，话说写个简单的程序就不能不那么臃肿么 float pay (int weight)  {     return weight >= 20 ? weight * 7.5 : weight * 9.3;  }  佩服

user: user-3
content: 不该点进来，被楼上有些代码**到了，话说写个简单的程序就不能不那么臃肿么 float pay (int weight)  {     return weight >= 20 ? weight * 7.5 : weight * 9.3;  }

user: user-4
content: 我也是刚学C，我觉得这个比较浅显易懂。希望对你有用！

user: user-4
content: #include <stdio.h> void main() { 	int weight; 	float price,pay; 	printf("input the weight:\n"); 	scanf("%d",&weight); 	if(weight<=0) 		printf("error!\n"); 	else if(weight>20) 	{ 		price=7.5; 		pay=(float)weight*price; 		printf("pay=%.1f\n",pay); 	} 	else if(weight<=20) 	{ 		price=9.3; 		pay=(float)weight*price; 		printf("pay=%.1f\n",pay);  	} 	 }

user: user-5
content: 嗯，分两种情况，一个是小于20公斤的，另一个是大于20公斤的，分情况计算。

user: user-6
content: 这是在逗我玩呢？

user: user-7
content: #include <stdio.h> void CalPrice(void) {     float weight = 0;     float price = 0; mark_alarm:     printf("请输入购买的质量:]\r\n");     scanf("%f",&weight);     if( weight <= 0 )     {         printf("输入无效\r\n");         goto mark_alarm;     }     else if( weight > 20 )     {         price = weight * 7.5;         printf("您购买%f斤,单价7.5, 应支付%f元！\n", weight, price);     }     else     {         price = weight * 9.5;         printf("您购买%f斤,单价9.5,应支付%f元！\n", weight, price);     } }

user: user-8
content: #include <stdio.h> int _tmain(int argc, _TCHAR* argv[]) { 	float weight = 0; 	float price = 0; 	printf("请输入购买的质量:"); 	scanf("%f",&weight); 	if(weight > 20 && weight > 0) 	{ 		price = weight * 7.5; 		printf("您购买%f斤,单价7.5, 应支付%f元！\n", weight, price); 	} 	else 	{ 		price = weight * 9.5; 		printf("您购买%f斤,单价9.5,应支付%f元！\n", weight, price); 	} 	return 0; }

user: user-9
content: bool pay(uint32 weight, uint32 *pay_value) {    if(weight>20)    {         *pay_value = weight*7.5    }    else    {          *pay_value = weight*9.3    }     return true; }  貌似没啥难度，这里的批发价是指超出20公斤的部分有批发价还是全部都是批发价?
user-0 提问: 一个C语言结构体的问题，有些不理解

回复:
user: user-1
content: 这样初始化看着别扭，直接先memset清零，再对需要赋值的字段分别赋值。。

user: user-2
content: struct第四个成员是个数组啊。

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:引用 9 楼 PhycoKnight 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] para_data是数组。哇，赵老师！我知道是数组，只是自己见的程序少，以前没见到过大括号整体赋值这种做法。 “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。 [/quote]非常感谢耐心解答！

user: user-3
content: 引用 9 楼 PhycoKnight 的回复:引用 6 楼 zhao4zhong1 的回复:para_data是数组。哇，赵老师！我知道是数组，只是自己见的程序少，以前没见到过大括号整体赋值这种做法。 “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:para_data是数组。哇，赵老师！我知道是数组，只是自己见的程序少，以前没见到过大括号整体赋值这种做法。

user: user-4
content: C标准初始化就是这样的规则，记住吧！如果非要问为什么，只有C他爹里奇知道为什么了！不过从规则上看，为了避免歧义，构成一个初始化块！

user: user-5
content: 对于这种连续内存块的初始化， c99标准和c++11标准都有不同的规定。 c99  struct T{      int a;      int b;     double c; };  struct T  t[ ] = {     {1, 2, 0.5},     {5, 12, 78.00},     {45, 12, 44} };  //这样就定义了一个结构体数组并且赋了初值  里面的{} 相当于这样 int arr[10] = {0}; //对他进行初始化

user: user-6
content: 用来初始化数组

user: user-7
content: 保留的，一般只是起一个占用空间的作用，以备后用。 大括号是用来初始化结构体里边的数组成员para_data的。

user: user-8
content: para_data[SRM_PARA_NUMBER-3];方便为数组赋值吧

user: user-3
content: para_data是数组。

user: user-0
content: 引用 4 楼 my_live_123 的回复:C标准初始化就是这样的规则，记住吧！如果非要问为什么，只有C他爹里奇知道为什么了！不过从规则上看，为了避免歧义，构成一个初始化块！ 好吧，thx
user-0 提问: c和指针 里提到的一个标量的问题

回复:
user: user-1
content: Integer and ﬂoating types are collectively called arithmetic types   Arithmetic types and pointer types are collectively called scalar types.Array and structure types are collectively called aggregate types

user: user-0
content: 可以具体一点吗？还有我的第二个问题，可以解答么？谢谢哦

user: user-0
content: 思路基本理清

user: user-0
content: 明白了，谢了哈

user: user-2
content: 你那个内容过时了。标准在4楼帖着

user: user-0

user: user-2
content: 看清楚回答啊

user: user-0
content: 那为什么说结构体变量也是一个标量呢。

user: user-2
content: 不是矢量类型，是复合类型 比如数组 结构体

user: user-0
content: 那段话说是因为x是一个标量才不合法，那么和标量相对的矢量类型又是什么？

user: user-2
content: 比如int x; int*px=&x;那么px+1 就指向x后一个位置那这个位置上存放的东西你不清楚自然解引用就不合法

user: user-2
content: c里面算术类型和指针类型统称为标量类型

user: user-0
content: typedef struct {       int a;       short b[2]; }  Ex2;  typedef struct EX {       int a;       char b[3];       Ex2 c;       struct EX *d; } Ex;  Ex x ={10, "hi", {5, {-1, 25}}, 0}; Ex *px = &x;
user-0 提问: 求问c语言 fscanf 读txt文件一行多个字符串 最后一个字符串被重复

回复:
user: user-1
content: 在vc++6.0中试过，运行正常

user: user-2
content: 因为你没有判断fscanf函数的返回值。

user: user-3
content: 我也觉得奇怪了。

user: user-4
content: 我在vs2010上简单试了一下1楼的程序：  #include <stdio.h> int main() { 	char No[20]; 	char Name[20]; 	char Major[20]; 	char Class[20]; 	char Phone[20];  	FILE * fp = fopen("search.txt","r"); 	if(fp) 	{ 		fscanf(fp,"%s%s%s%s%s",No,Name,Major,Class,Phone); 		printf("%s %s %s %s %s\n",No,Name,Major,Class,Phone); 	} 	else 		printf("文件不存在！！");	 	return 0; }  这个没有写操作，直接给文件“search.txt"里存了一行：123  wyx computer s1  1224324，这样做没出现楼主说的那种情况…… 楼主能不能把你这个练习的完整程序贴出来？？我们一块学习~~~

user: user-5
content: #include <stdio.h>  int main() { 	char No[20]; 	char Name[20]; 	char Major[20]; 	char Class[20]; 	char Phone[20];  	FILE * fp = fopen("search.txt","r"); 	fscanf(fp,"%s%s%s%s%s",No,Name,Major,Class,Phone); 	printf("%s %s %s %s %s\n",No,Name,Major,Class,Phone); 	return 0; }
user-0 提问: 宏使用遇到的小问题

回复:
user: user-1
content: 两个阶段： for循环是运行阶段执行 宏是预编译阶段 在经过宏展开后代码就成为  for(char i = 1;i<10;i++)   CLEAR_ROW_i;   然后编译阶段 error：CLEAR_ROW_i未定义 LZ想做什么呢？ 即使展开成CLEAR_ROW_1然后循环中语句就是1;这一样是非法语句！

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

user: user-3
content: 这是预编译时候发生的事情， 就是说此时for循环里面根的 i 的值还是未知的， 程序还没开始运行，  你一编译， 程序就被替换成这样 void fun() { 	for(char i = 1;i<10;i++) 		//CLEAR_ROW(i) ; 		CLIEAR_ROW_i;  //在预编译阶段， i的值未知， i只是一个符号， 不可能发生你想像的那样i = 1， i = 2.....  }

user: user-4
content: 去看看模版元编程有你要的

user: user-5
content: 把它写成函数传送参数不就行了。

user: user-0
content: 引用 1 楼 pengzhixi 的回复:一个预编译期替换，一个运行期才能确定怎么可能呢那有没有什么宏方法能实现我上面的作用咧？

user: user-4
content: 一个预编译期替换，一个运行期才能确定怎么可能呢
user-0 提问: C 语言 sin(x)积分问题求助？

回复:
user: user-1
content: 引用 3 楼 u011606329 的回复:但是即使是0到1.02积分，那么答案也应该是在1左右啊，但是，事实山好像这个不是真正的，致命的错误啊。怎么会是1呢？sinx在0到1上积分，是cos0-cos1，是1-0.54=0.46。 使用double类型精确一下，得到近似的结果：#include<stdio.h> #include<math.h> int main() { 	double num = 0.0, sum = 0.0; 	while (num <= 1.0) 	{ 		num += 0.02; 		sum += sin(num)*0.02; 	} 	printf("sum is %lf\n", sum);    //0.468097 }

user: user-2
content: 引用 3 楼 u011606329 的回复:但是即使是0到1.02积分，那么答案也应该是在1左右啊，但是，事实山好像这个不是真正的，致命的错误啊。 所以说你高数得重修了，sin(x)从0到1的积分大约是0.45970

user: user-0
content: 但是即使是0到1.02积分，那么答案也应该是在1左右啊，但是，事实山好像这个不是真正的，致命的错误啊。

user: user-2
content: 高数重修确定 另外你这是0到1.02的积分

user: user-3
content: sin每次乘0.02是什么意思
user-0 提问: 新手求教一个关于c语言的小问题，

回复:
user: user-1
content: 这种语句相当于TVB的经典台词“你妈逼的！”  不同的编译器有不同的理解  另外，别看这些屎语句了，毛意义都没有

user: user-2
content: 对于这种未定义的行为， 不同的编译器结果不一样， 楼主只需记住前++是先改变本身在计算， 后++先计算在自增。   实际开发中是不会写出这种代码的，  只有考二级会有这种。。。。

user: user-3
content: 楼主还不明白吗， i = i++ + ++i; 这样的语句，不同的编译器有不同的解释。  比如下面这句话： “我爱上你了！”  不同的人的理解就完全不同嘛！

user: user-4
content: 引用 9 楼 Eazil3 的回复:我现在纠结的是，这个计算的步骤到底有没有一个正规的步骤，现在就两个版本，1+3 和 2+2+1 这两种算法都算对吗？根据不同编译器的规则来看的花 没有正规的步骤，标准压根就没规定正规步骤。所以，这种代码压根就不该出现在程序里。  这个问题，等你对C有了比较深刻的了解再来研究也不迟。

user: user-5
content: 楼主，不要纠结于这种无聊的问题上。 这跟小学生的那种“一边灌水一边排水，什么时候把水灌满”的问题没有什么区别

user: user-0
content: 我现在纠结的是，这个计算的步骤到底有没有一个正规的步骤，现在就两个版本，1+3 和 2+2+1 这两种算法都算对吗？根据不同编译器的规则来看的花

user: user-0
content: 引用 5 楼 jacksonfan 的回复:VS08输出2,5 i = i++ + ++i; 1、++i，i = 2； 2、i++，i = 3； 3、i++ + ++i，i = （2 + 1）+ 2  对于你这个步骤我是不怎么赞同的 我觉得是i = 1                 ++i   i = 2                i = 2 + 2                i++  i= i+1

user: user-6
content: VS08输出2,5 i = i++ + ++i; 1、++i，i = 2； 2、i++，i = 3； 3、i++ + ++i，i = （2 + 1）+ 2

user: user-7
content: 未定义行为，各种编译器编译出来的结果不同，导致运行结果不一样，实际使用中，不应该写出这种代码。

user: user-0
content: 自己顶一下，求帮忙，谢谢

user: user-0
content: 才疏学浅没怎么看懂，现在的问题就是  到底是2+2+1 还是1+3   现在就是这两个版本，是不是不同编译器不一样？

user: user-8
content: http://bbs.csdn.net/topics/370153775看这个贴
user-0 提问: 统计字符个数

回复:
user: user-0
content: 引用 1 楼 user-3 的回复:#include <stdio.h> /* count characters in input; 1st version */ int main() { 	long nc; 	nc = 0; 	while (getchar() != EOF) 		++nc; 	printf("%ld\n", nc); } 谢谢啊，明白了。  引用 2 楼 TJF331311545 的回复:输入还没有结束 按了回车也不等于结束  谢谢啊，现在明白了。  引用 3 楼 robertbo 的回复:getchar()!= EOF, EOF 是终止符，不同的系统终止符不同·· Windows的控制台里面可以通过Ctrl   +   Z来表示终止 Linux/Unix的Shell里面可以通过Ctrl   +   D来表示终止 谢谢啊~

user: user-1
content: getchar()!= EOF, EOF 是终止符，不同的系统终止符不同·· Windows的控制台里面可以通过Ctrl   +   Z来表示终止 Linux/Unix的Shell里面可以通过Ctrl   +   D来表示终止

user: user-2
content: 输入还没有结束 按了回车也不等于结束

user: user-3
content: #include <stdio.h> /* count characters in input; 1st version */ int main() { 	long nc; 	nc = 0; 	while (getchar() != EOF) 		++nc; 	printf("%ld\n", nc); }
user-0 提问: 求解如何把数组中的unsigned char 转16进制数输出

回复:
user: user-0
content: 恩，谢谢，我已经知道怎么做了，是要做为界面控件输出的，用sprintf循环实现。

user: user-1
content: for(int i = 0; i != 16;i++) printf("%x" ,ivec[i]);
user-0 提问: 菜鸟求助关于指示灯的问题

回复:
user: user-1
content: 引用 1 楼 shangyu0801 的回复:外部中断进入的后，状态转换的时机的控制问题吧。比如如果下次为全亮，此次必须要执行1HZ的由灭转亮后，再常亮。而不能当前还是灭呢，马上就让灯亮。  +1   从先全灭了  然后在点亮要点亮的！

user: user-2
content: 外部中断进入的后，状态转换的时机的控制问题吧。比如如果下次为全亮，此次必须要执行1HZ的由灭转亮后，再常亮。而不能当前还是灭呢，马上就让灯亮。
user-0 提问: 1.生成1-99范围内的99个随机数，并删除重复数 2.若要补充齐全1-99位数，标记处补充内容

回复:
user: user-1
content: .生成1-99范围内的99个随机数，并删除重复数 和 .生成1-99范围内的99个不重复的随机数 不是一回事！

user: user-2
content: 洗牌就行了，仅供参考 srand((unsigned)time(0));  // 设置随机种子 int n[99]; // 初始化为1~99的值 for(int i = 0; i != 99; i++) n[i] = i+1;  // 洗牌，打乱顺序 for(int i = 0; i != 99; i++) {     int ntmp = n[i];     int nIndex = rand()%99;     n[i] = n[nIndex];     n[nIndex] = ntmp; }

user: user-3
content: 本质上是1-99的洗牌算法，参考http://blog.csdn.net/microchenhong/article/details/6456625
user-0 提问: hdoj1003，很多测试用例都通过了，但还是提示wa，求大神指导一下

回复:
user: user-1
content: 如下修改可AC:  #include"stdio.h" int main() //改 main() {   int cases , amount , i , p , q , temp1 , temp2 , max_temp , a[100000] ;   int max , start , end ;   scanf("%d" , &cases) ;   if(cases < 1 || cases > 20)     return ;   for(temp1 = 0 ; temp1 < cases ; temp1++)   {     scanf("%d" , &amount) ;      for(temp2 = 0 ; temp2 < amount ; temp2++)       scanf("%d" , a + temp2) ;      max = a[0] ;     p = 1 ;     q = 1 ;     start = 1 ;     end = 1 ;      for(i = 1 , max_temp = a[0] ; i < amount ; i++) //改 for(i = 0 , max_temp = 0 ; i < amount ; i++)     {       max_temp += a[i] ;       q = i + 1 ;       if(max_temp < a[i]) //加       {         max_temp = a[i] ; //加         p = i + 1;        //加       }       if(max_temp > max)       {         max = max_temp ;         start = p ;         end = q ;       }       /*删       else if(max_temp < 0)       {         max_temp = 0 ;         p = i + 2 ;         q = i + 2 ;       }*/     }       printf("Case %d:\n%d %d %d\n" , temp1 + 1 , max , start , end) ;     if(temp1 < cases - 1)       printf("\n") ;   }    return 0; //加 }

user: user-2
content: 之前做过，贴下代码，a是数组，len是数组长度  void max_sum(int *a, long len) {     long i,p = 0;     int curSum = 0;      int maxSum = -1000;      long start = 0,end = 0;      for(i = 0;i < len;i++)     {         if(curSum < 0)         {             curSum = *(a+i);             p = i ;         }         else             curSum += *(a+i);         if(curSum > maxSum )         {             maxSum = curSum;             start = p;             end = i;         }     }     printf("%d %ld %ld",maxSum,start+1,end+1);  }

user: user-3
content: 这是你的程序输出结果，正确结果应该是-1。

user: user-3
content: 看下面这组测试。
user-0 提问: 关于用C语言实现图像处理

回复:
user: user-1
content: 就是opencv了， 及其强大的图像处理功能， 还有模式识别， 非常厉害， 我也在学。

user: user-2
content: 参考 MSDN98\SAMPLES\VC98\SDK\GRAPHICS\GDI\SHOWDIB\*.* MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl

user: user-3
content: 参考我的博文 http://blog.csdn.net/turingo/article/details/8131057  引用 楼主 csdnqxh1 的回复:各位大神，请问一下，能不能推荐一些关于“用C语言实现图像处理功能的软件”的资料啊，谢谢谢谢

user: user-4
content: 楼主有兴趣的话可以研究研究 GTK3  这个是C的！

user: user-5
content: 下载研究OpenCV 《学习OpenCV（中文版）》

user: user-0
content: 老师说是只要实现作图以及一些类似翻转，平移等的功能就行，要用纯C编，为什么我随便写了一个小程序在VC里面有错误呢，是不是一定要在turboC里面编啊，但是电脑又没办法装turboC

user: user-0
content: 你好，我是在做毕业论文，原来学过C语言，不过都是一些基础知识，看到这个题目感觉无从着手，所以在找点资料看看，谢谢回答

user: user-2
content: 下载研究OpenCV 《学习OpenCV（中文版）》
user-0 提问: float类型不定参数的问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:因为有个默认的类型提升。float-->double 根据您的提示，我搜到了这编文章，也解决了我的问题。 http://blog.csdn.net/astrotycoon/article/details/8284501

user: user-1
content: 因为有个默认的类型提升。float-->double
user-0 提问: getchar 在程序中的用途？？

回复:
user: user-1
content: 在这里没用作用纯多余 有和没有都不影响程序正常运行

user: user-2
content: #include<stdio.h> main() { 	char a[101],l,m; 	while(scanf("%s",a)!=EOF) 		{ 			l=getchar(); 			printf("%d\n",l); 			a[0]-=32; 			printf("%s",a); 			if(l=='\n') 			printf("\n"); 			else 			printf(" "); 		} 			  	m=getch();  	printf("%d",m);  	return 0; }你可以试一下这个程序，至于getchar是一般是10和32，表示换行和空格符，对于getch（）是13，说明返回的是回车符的值，当然，没有这一句，输入流还是在缓冲中， 不影响程序的本次执行

user: user-3
content: 你可以设个变量c=getchar，然后看看c是什么就知道为啥要有了。
user-0 提问: 魔术师猜数问题

回复:
user: user-1
content: 上面ans>1000应该为 ans>=1000

user: user-0
content: 引用 1 楼 user-3 的回复:不就是 input = 122a + 212b + 221c，实在不行穷举法算出a，b，c 请问穷举怎么编代码，基本功不是很扎实。。。

user: user-1
content: #include <stdio.h>  //      sum              ans     = 222* k // 122a+212b+221c + 100a +10b+10 = 222*(a+b+c) int guess(int sum) {     int k = (sum+221)/222;     int ans =k *222- sum;     for(;k<9*3+1;k++,ans+=222){         if(ans>1000) return 0;         if(ans<100) continue;         if(ans/100+ans%100/10+ans%10 == k) return ans;     }     return 0; }  int main() {     int n;     while(1)     {         scanf("%d",&n);         if(!n) break;         n = guess(n);         n ? printf("%d\n",n) : puts("Error.");     }     return 0; }

user: user-1
content: 和为 122a+212b+221c， 如果加上原数 100a+10b+10c，就刚好是222(a+b+c),可以此处想办法去解，然后穷举一下满足这个条件的数

user: user-2
content: 穷举。。。 。

user: user-3
content: 不就是 input = 122a + 212b + 221c，实在不行穷举法算出a，b，c
user-0 提问: 定义一个求两个整数最大值的函数max(int a,int b)，从键盘上输入4个整数u,v,w,x,通过调用max(int a,int b)求出它们的最大数并输

回复:
user: user-1
content: ++  引用 1 楼 user-3 的回复: #include <stdio.h>  int max(int a,int b) { 	return a > b?a:b; }  void main() { 	int a,b,c,d; 	int r = 0; 	scanf("%d %d %d %d",&a,&b,&c,&d); 	r = max(max(max(a,b),c),d); 	printf("%d",r); }

user: user-2
content: int MyMax(int _a ,int _b) { 	return ((_a > _b)?_a:_b); }   int main() { 	int a,b,c,d; 	scanf("%d %d %d %d" ,&a,&b,&c,&d); 	int k = MyMax(a,b); 	int h = MyMax(c,d); 	int j = MyMax(k,h); 	printf("最大的数是%d\n" ,j); }

user: user-3
content: #include <stdio.h>  int max(int a,int b) { 	return a > b?a:b; }  void main() { 	int a,b,c,d; 	int r = 0; 	scanf("%d %d %d %d",&a,&b,&c,&d); 	r = max(max(max(a,b),c),d); 	printf("%d",r); }
user-0 提问: 暖橘子程序

回复:
user: user-1
content: 橘子暖透了，CPU烧坏了。

user: user-0
content: 引用 8 楼 CharlesSimonyi 的回复:光CPU发热还不够，想办法把GPU调用起来

user: user-2
content: 等我有时间了贴出我的暖菠萝程序

user: user-3
content: 你这么吊。cpu愿意吗

user: user-4
content: 都是大神啊~

user: user-5
content: 光CPU发热还不够，想办法把GPU调用起来

user: user-0
content: 引用 3 楼 u013163178 的回复:#include<unistd.h> #include<sys/types.h> int main() { 	for(;;) 	{ 		fork(); 	} 	return 0; } 你这不得把系统搞晕了啊。。。

user: user-0
content: 引用 5 楼 luoxuechengbing 的回复:  我也来一发~！

user: user-6
content: 我也来一发~！

user: user-7
content: LZ这是要干啥？？？贴出来程序的一部分，我们也没法体验暖橘子呀~~~~

user: user-8
content: #include<unistd.h> #include<sys/types.h> int main() { 	for(;;) 	{ 		fork(); 	} 	return 0; }

user: user-8
content: 放开那个橘子,给我吃
user-0 提问: __int64如何输入

回复:
user: user-1
content: 用整数保存电话号码是不可取的。

user: user-2
content: 哥 temp 指针你给开空间了么？ 就malloc 或指向其它数据了么？

user: user-3
content: ++  引用 1 楼 user-5 的回复:是%I64d，大写的i，不是小写的L

user: user-4
content: 引用 1 楼 user-5 的回复:是%I64d，大写的i，不是小写的L  +1 scanf("%I64d",&phone );

user: user-5
content: 是%I64d，大写的i，不是小写的L
user-0 提问: 程序与操作系统的问题，望高手赐教

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-2
content: 引用 楼主 cumtwyc 的回复:一个程序调入内存开始执行时，它的堆的大小还有栈的大小是怎么确定的？ 还有既然虚拟存储空间可以很大，怎么感觉一个简单递归就经常出现堆栈溢出等问题呢？ 比如一个最简单的程序只有一条输出语句，操作系统还会为它分配堆空间吗？  堆大小是运行时才确定的，不然也不用判断malloc的返回值了。  栈大小虽然最终体现在运行上，不过从源码级别也能够判断，大小和源码息息相关。 递归搞挂了肯定是没归回来，查查代码吧。

user: user-1
content: 《程序员的自我修养——链接、装载与库》

user: user-0
content: 引用 6 楼 C0909 的回复:

user: user-3
content: 不好意思 刚配图配错了

user: user-3
content: 栈是有限制大小的,好像是2M左右,具体忘了 楼主可以试试 创建一个数组  VS会报栈溢出的

user: user-0
content: 回答的都很好啊

user: user-4
content: 不同平台栈的大小可能不一样！ Linux下，THREAD_SIZE_ORDER指定了栈的大小，通过alloc_thread_info进行分配。目前kernel-3.16源码THREAD_SIZE_ORDER值依旧为1，即进程分配的栈依旧是一页！至于页的大小有OS指定，可以是4k，1M等等

user: user-1
content: /STACK   (Stack Allocations) Home |  Overview |  How Do I |  Linker Options  The Stack Allocations (/STACK:reserve[,commit]) option sets the size of the stack in bytes.   To find this option in the development environment, click Settings on the Project menu. Then click the Link tab, and click Output in the Category box. The Reserve text box (or in the reserve argument on the command line) specifies the total stack allocation in virtual memory. The default stack size is 1 MB. The linker rounds up the specified value to the nearest 4 bytes.  The optional value specified in the Commit text box (or in the commit argument on the command line) is subject to interpretation by the operating system. In Windows NT, it specifies the amount of physical memory to allocate at a time. Committed virtual memory causes space to be reserved in the paging file. A higher commit value saves time when the application needs more stack space, but increases the memory requirements and possibly the startup time.  Specify the reserve and commit values in decimal or C-language notation.  Another way to set the size of the stack is with the STACKSIZE statement in a module-definition (.DEF) file. STACKSIZE overrides the Stack Allocations (/STACK) option if both are specified. You can change the stack after the .EXE file is built by using the EDITBIN tool.

user: user-4
content: 栈的大小一般都是一页的样子，而且不能扩充，由OS指定，而堆则大的多。理论上，以32位系统的1:3比例划分，4G可用内存，有3G都可以作为堆来分配。

user: user-5
content: 我看书写的是栈一般是向低字节分配的，一般有2M，也不是肯定的，还和系统有关。堆是向高字节分配的，所以理论来讲没有空间限制（还有硬盘空间呢！这个也可以拿来用）

user: user-6
content: 栈有限，递归不结束肯定溢出。 输出语句会用到c库或c++库，库会申请堆空间

user: user-7
content: 在Windows系统上程序运行起来后栈大小默认是1MB，当然这个值可以在编译程序的时候通过链接器命令来修改。 堆上内存空间需要程序向操作系统申请，比如malloc或new，不申请就不分配。