Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求助，c语言查找排序，快速排序出bug了

回复:
user: user-1
content: 出错时点中断，通过调用堆栈、变量窗口等观察分析原因

user: user-2
content: 不知道你是想以什么为依据排序，但是deal[i]=(int) mes[i][7];中没有第8列，你定义的是double mes[4000000][7]，最多到mes[i][6]。另外迭代算法也有问题，自创了几条数据后单步调试发现，Swap(&A[Center], &A[Right - 1]); /* 将基准Pivot藏到右边*/ 在Right=0时出现错误，因为没有&A[-1]，越界了。你可以减少数据调试下

user: user-0
content: 引用 1 楼 zxhuser-3 的回复: 参考代码段: http://pan.baidu.com/s/17yIcQ 还是没明白啊，错误显示就在swap函数那行

user: user-3
content: 参考代码段: http://pan.baidu.com/s/17yIcQ
user-0 提问: 排序问题求解答！

回复:
user: user-1
content: 用scanf输入数值,以空格分隔,以回车结束输入,然后用getchar检测是否输入完毕

user: user-2
content: 用C++的STL的list实现很容易。  但是估计楼主这是要求用C的作业题，实现起来就繁琐一些
user-0 提问: VS2010合在一起写就不报错，如果分成几个2个头文件和2个c文件，就报错，为什么。。。

回复:
user: user-0
content: 引用 10 楼 fefe82 的回复:你的”主函数“和”boc1-1.c"的内容是一样的？ 代码贴错了，问题已经自己解决了，谢谢大家。

user: user-1
content: 你的”主函数“和”boc1-1.c"的内容是一样的？

user: user-1
content: 在你彻底搞清 .h .c 对编译器的区别，以及 c 的编译链接流程之前，不要 #include  .c 。

user: user-2
content: 引用 5 楼 CYTCHAN 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] .h文件前面加一句 #pragma once 再重建所有不行哎，还是报错。。[/quote] 这个代码作为第一行

user: user-0
content: 引用 6 楼 Jammg 的回复:在Bo1-1.c 里面#include"Bo1-1.c"，想想也是醉了，确定不会死循环吗？还有include .c文件还真没试过，我还是太年轻了恩，现在把函数声明放到"Bo1-1.h"里面去了，不过还是报错

user: user-3
content: 在Bo1-1.c 里面#include"Bo1-1.c"，想想也是醉了，确定不会死循环吗？还有include .c文件还真没试过，我还是太年轻了

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:.h文件前面加一句 #pragma once 再重建所有不行哎，还是报错。。

user: user-0
content: 引用 2 楼 wang0635 的回复:惊现 #include"Bo1-1.c" ！ 这样不可以吗？

user: user-0
content: 还是不行。。。

user: user-4
content: 惊现 #include"Bo1-1.c" ！

user: user-5
content: .h文件前面加一句 #pragma once 再重建所有
user-0 提问: 关于推箱子的自动求解

回复:
user: user-1
content: 引用 3 楼 heikefangxian23 的回复:赵老师简直神人啊

user: user-2
content: 赵老师简直神人啊

user: user-1
content: http://download.csdn.net/detail/zhao4zhong1/3230945

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:http://download.csdn.net/detail/zhao4zhong1/3230945谢谢！学习一下
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: 指针法 估计指的是 *a++ 数组法 估计是  a[i];

user: user-3
content: 分别用字符数组和字符指针作函数参数两种方法编程实现如下功能：在字符串中删除与某字符相同的字符。 这个其实就是一种方法 作为参数会退化成字符指针 一个意思 void DelChar(char* psz, char delchar) { 	if (psz == NULL) 		return; 	char*pcur =psz; 	char* psearch =psz; 	while(*psearch != '\0') 	{ 		if (*psearch != delchar)	 		{ 			*pcur = *psearch; 			pcur++; 			psearch ++; 		}			 		else 		{ 			psearch ++;		 		}	 	} 	*pcur = '\0'; }

user: user-4
content: void del(char *p,char ch) {     char *l=p,*r=p;     while(*r){         if(*r!=ch) *l++=*r++;         else ++r;     }     *l ='\0'; }

user: user-5
content: 把代码贴上来，说明白是什么问题
user-0 提问: 如何把一段字符串逐段的截取

回复:
user: user-1
content: http://www.cnblogs.com/lpshou/archive/2012/06/04/2534376.html

user: user-2
content: CString 中find mid 等函数很好用 还有boost中有分割的函数   引用 1 楼 LLW059 的回复:可以使用strtok()函数，char *strtok(char s[], const char *delim);s为要分解的字符串，delim为分隔符字符串。 以逗号为分割符即可，具体用法可以搜一下。 这个也很好用 很多呢 分割字符串函数

user: user-3
content: 可以使用strtok()函数，char *strtok(char s[], const char *delim);s为要分解的字符串，delim为分隔符字符串。 以逗号为分割符即可，具体用法可以搜一下。
user-0 提问: C语言推箱子，求助！

回复:
user: user-1
content: 这里大把：https://www.baidu.com/s?wd=%E6%8E%A7%E5%88%B6%E5%8F%B0%20%E6%8E%A8%E7%AE%B1%E5%AD%90&rsv_spt=1&rsv_iqid=0x9b3fcf2a00056a97&issp=1&f=3&rsv_bp=0&rsv_idx=2&ie=utf-8&tn=monline_3_dg&rsv_enter=1&rsv_sug3=18&rsv_sug1=9&rsv_sug2=0&prefixsug=%E6%8E%A7%E5%88%B6%E5%8F%B0%20%E6%8E%A8%E7%AE%B1%E5%AD%90&rsp=1&inputT=4321&rsv_sug4=4321  可以先看下别人怎么写的

user: user-2
content: http://download.csdn.net/detail/zhao4zhong1/3230945
user-0 提问: 关于C primer plus 程序清单7.2 cypher.c程序的困惑

回复:
user: user-1
content: 两种写法不同！前者每次循环判断时都会getchar()接收一个字符，后者每次循环都是判断之前的那个ch，而不运行getchar了

user: user-2
content: 按注释写while上面和里面的最下面ch就不需要再读入一个字符了，这样写简化了程序

user: user-3
content: 结果不一样吗，我觉得一样啊
user-0 提问: C语言24位BMP转8位BMP

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:保存和读出来一样处理，不要做任何手脚 保存成8位也24位处理？

user: user-1
content: 保存和读出来一样处理，不要做任何手脚

user: user-1
content: 15Bits  1:5:5:5 16 Bits 5:6:5 24 Bits 8:8:8 32 Bits 8:8:8:8

user: user-1
content: 另外，位图有正向反向两种位图，他们的主要标志是高的符号 高度为正， 正向，高度为负，反向

user: user-1
content: 当然不是  所有位图的数据，都是32Bits对齐的 15，16，24，32 Bits 数据本身可以看作颜色表（或者叫调色板），所以就没有颜色表了 1，4，8 都是有的颜色表  你的问题是，应该保存为 32Bits对齐。
user-0 提问: 数组名作函数的实参，数组做函数的形参问题

回复:
user: user-1
content: 数组是一个内存布局。 数组的首地址是一个指针。 而参数是一个变量，一个指针变量，这个变量的内容就是数组的首地址。

user: user-2
content: 你说数组接收一个地址这个描述就是错的，传入的是个指针，可以操作他所指向的内存，并不是只能通过数组读写内存

user: user-3
content: 形式参数都是变量，不管你怎么写

user: user-4
content: 数组在内存中地址是连续的，数组名就是数组中第一个元素的地址，其他元素可以一次推算出来。

user: user-5
content: 数组是数据的聚集，一个数组的第一个元素的地址，可以确定其他元素的地址 所以只要传递第一个元素地址，整个数组的元素都可以找到 由于参数传递时候，是值传递， 数组采用指针的值传递，所以数组的元素个数，不能通过数组名传递 函数需要添加一个参数，表示数组元素个数 这个函数这样写 float  average(int mark[]，int n)//多传入一个参数 n表示元素个数。 { float ave;   int sum=0,i;  for(i=0;i<n;i++)       sum=sum+mark[i];       ave=(float)sum/n;       return(ave); }  int main(){    int i;    int  score[30];    FILE *fp =fopen("score.txt","r");    if(NULL==fp){        printf("Cannot Open %s","score.txt");        exit(-1);    }      for( i=0;i<30;i++)          fscanf(" %d",a+i); //读取成绩     fclose(fp);     printf("Average =%f\n",  average(score,30));     return 0;  }  C++ 的还可以这么做  template <int N>float  average(int (&mark)[N])//传递数组引用，其实数组指针也可以，但是C没有模板，作用不大 { float ave;   int sum=0,i;  for(i=0;i<N;i++)       sum=sum+mark[i];       ave=(float)sum/N;       return(ave); }  int main(){    int i;    int  score[30];    FILE *fp =fopen("score.txt","r");    if(NULL==fp){        printf("Cannot Open %s","score.txt");        exit(-1);    }      for( i=0;i<30;i++)          fscanf(" %d",a+i); //读取成绩     fclose(fp);     printf("Average =%f\n",  average(score,30));     return 0;  }

user: user-6
content: mark 其实是一个指针。  score 被转换成了指向第一个元素的指针，这个指针传递给饿了 mark 。
user-0 提问: float 型数据比较

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 浮点数最好不要做比较，一般是做差再比较差值

user: user-3
content: 浮点数是有精度问题的，不过你这个貌似也不会0.000047大于0.000050吧
user-0 提问: 0 error(s), 0 warning(s)   出现“exe”已停止工作

回复:
user: user-1
content: void Sort(long a[],float b[],int n)  {      int i,m;float j;long k;      for(i=0;i<n;m++,i++)  {   for(i=0;i<n-1-m;i++)       {if(a[i]>a[i+1])  {k=a[i];a[i]=a[i+1];a[i+1]=k;   j=b[i];b[i]=b[i+1];b[i+1]=j;}   }  } 局部变量没有初始化~~~ m的值不确定，访问后结果未知~~~

user: user-2
content: sort函数中，m没有初始化，会导致内存导致越界，程序出现段错误。

user: user-3
content: 两个0是通知你程序的语法上没有编译错误，运行终止则是程序内在的逻辑有错！编译器是管不了逻辑的！好比：合法正规的驾照考试合格了，但是真正上路跑时，依然会出交通事故，这和驾校没有关系的！是车主自己操作有误

user: user-4
content: 首先Sort函数不需要返回，你返回有个retrun 0删了 其实Sort中你的m没有初始化 目前只看了这么多，你先改了看，有问题再回复
user-0 提问: 比较字符串数组大小的问题

回复:
user: user-1
content: 在string.h中strcmp只能比较字符串 就是a-z或者A-Z，有数字的字符串用Strcmp是不能比较出来的。

user: user-0
content: 引用 1 楼 user-2的回复:if(strcmp(a[2],max)>0) 这句楼主实际应该想表示的是 if(strlen(a[2])>strlen(max))吧 你说的没错 一开始用的strcmp发现不对 改用strlen 结果没有改全

user: user-2
content: strcmp比较的是字符串，而不是字符串的长度

user: user-2
content: if(strcmp(a[2],max)>0) 这句楼主实际应该想表示的是 if(strlen(a[2])>strlen(max))吧
user-0 提问: 判断句 里 ‘=’和‘==’的区别

回复:
user: user-1
content: k=1，是赋值k为1，循环中恒为真。  k==1是判断这个表达式是真还是假

user: user-2
content: 引用 1 楼 user-5 的回复:= 是赋值 == 是比较是否相等  对于你的例子，用=号循环时每次比较相当于是一个赋值，而该值是1，所以永远是true，一直循环 如果改成==，那么你k初始是-1，直接一开始就进不了循环，因为比较结果为假 好好补下基础啊！ 是这样的  = 是赋值          返回的是=号左边的那个值 == 是比较是否相等        返回的是比较后的BOOL值

user: user-3
content: = 是赋值 == 是比较是否相等

user: user-4
content: “=”是赋值运算； “==”是逻辑运算； 楼主for循环中条件k=1，条件始终成立，不会跳出循环的。

user: user-5
content: = 是赋值 == 是比较是否相等  对于你的例子，用=号循环时每次比较相当于是一个赋值，而该值是1，所以永远是true，一直循环 如果改成==，那么你k初始是-1，直接一开始就进不了循环，因为比较结果为假 好好补下基础啊！
user-0 提问: c语言程序设计

回复:
user: user-1
content: #include<stdio.h> #include<math.h>  double Monopoly_Game( double n); int main(void) { 	double x; 	x = Monopoly_Game(30); 	printf("%f", x); 	system("pause"); 	return 0; } double Monopoly_Game( double n) { 	if (n > 0) 		return pow(2, n)+Monopoly_Game(n-1); 	else 		return 0; }

user: user-2
content: 一个月那个陌生人就成富翁了，而富翁就成穷人了

user: user-3
content: int total=0; int new=1; for(int i=0;i<30;i++){ total=total+new; new=new*2; }

user: user-3
content: int total=0; int new=1; for(int i=0;i<30;i++){ total=total+new; new=new*2; }

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

user: user-5
content: 递归的方法：    #include <stdio.h> #include <assert.h> #include <stdint.h>  #define FIRST_DAY_SUBSIDY (1) // 初始收入  uint64_t income(int day, uint64_t * p_sum) { 	uint64_t value; // 当天收入 	assert(NULL != p_sum);  	 	 	if(day < 1) return 0; 	if(day == 1) 	{ 		value = FIRST_DAY_SUBSIDY; 		*p_sum = value; 		return value; 	} 	 	value = income(day - 1, p_sum);	// 获取前一天的收入（包含前一天的总收入） 	value *= 2;						// 当天收入 = 前一天收入 * 2 	*p_sum += value;					// 总收入 = 当天收入 + 前一天的总收入 	 	return value; // 返回当天的收入 }  int main(int argc, char **argv) { 	uint64_t sum = 0; 	uint64_t value = 0; 	int day; 	 	for(day = 1; day <= 30; day++) 	{	 		value = income(day, &sum); 		printf("%d: value = %ld, sum = %ld\n", day, value, sum); 	} 	 	return 0; }

user: user-6
content: int total=0; int new=1; for(int i=0;i<30;i++){ new=new*2; total=total+new; } total就是给富翁的钱
user-0 提问: 如何给结构体指针的数组分配内存

回复:
user: user-1
content: 引用 5 楼 my_live_123 的回复:[quote=引用 3 楼 paschen 的回复:] pash=(position *)malloc(10000*sizeof(pnode));才对  position的类型是pnode*，也就是说是一个指针，你用sizeof得到的是4（32位） 应该是一维吧，pash多了个*，因此强转类型也多了个 * [/quote]  估计楼主是想表示： position pash; pash=(position )malloc(10000*sizeof(pnode));

user: user-2
content: 引用 3 楼 paschen 的回复:pash=(position *)malloc(10000*sizeof(pnode));才对  position的类型是pnode*，也就是说是一个指针，你用sizeof得到的是4（32位） 应该是一维吧，pash多了个*，因此强转类型也多了个 *

user: user-3
content: 你可以做个试验： 打印一下sizeof(Pnode)和sizeof(position)就知道区别了

user: user-1
content: pash=(position *)malloc(10000*sizeof(pnode));才对  position的类型是pnode*，也就是说是一个指针，你用sizeof得到的是4（32位）

user: user-4
content: 建议不用写类型, 让编译器自己去推导  10000*sizeof(*pash)

user: user-5
content: sizeof里面应该是Pnode, 你现在sizeof里面放的是指针，指针大小是4个字节，所以出错了
user-0 提问: 为什么用getche（）接受字符之后会在屏幕输出一个a啊？

回复:
user: user-1
content: 仅供参考：//The _getch function reads a single character from the console without echoing. //Function can not be used to read CTRL+Break. //When reading a function key or an arrow key, //_getch must be called twice; the first call returns 0 or 0xE0, //and the second call returns the actual key code. #include <conio.h> #include <windows.h> void main() {     unsigned short k;      while (1) {         Sleep(100);         k=getch();         if (27==k) break;//按Esc键退出         if (0==k||0xe0==k) k|=getch()<<8;//非字符键         cprintf("%04x pressed.\r\n",k);     } }

user: user-2
content: #define VK_LEFT           0x25 #define VK_UP             0x26 #define VK_RIGHT          0x27 #define VK_DOWN           0x28
user-0 提问: C语言找出一个字符串中最左边的最长单词

回复:
user: user-1
content: 我想问如果用strtok的话是怎么用？ #include <stdio.h> #include <string.h> int main(void){ 	char str[100],*p; 	char max[100]; 	int i,maxnum=0; 	gets(str); 	p=strtok(str," ."); 	if(p){ 		if(strlen(p)>maxnum) 		maxnum=strlen(p); 		max[100]=p; 		p=strtok(NULL," ."); 	} 	printf("%s\n",max[100]); 	return 0; } 我自己这么写好像有毛病，，哭哭。。。

user: user-2
content: 哈哈哈哈weqweqwe

user: user-0
content: 看到自己以前的代码，被自己蠢哭了，哈哈哈。谢谢各位

user: user-3
content: 楼主错误略多啊！我也只是纯粹的帮楼主找错误。已作注释修改，望采纳！    还有个建议，可以去看下strtok（）这个库函数的用法，应该可以简单很多。  #include<stdio.h>> #include<string.h> #define N 80 void LongestWord( char* str,char* c) {     char*b;     char A[N+1];  // 这边有两个错误 1.要定义字符数组非字符指针数组 2.数组定义大     char*a;     int i,j;     b=str;     a=A;      for(j=0;j<strlen(str);j++)     {         if(*(b+j)==' '||*(b+j)=='\0')         {             j++;         }		         for(i=0;*(b+j)!=' '&&*(b+j)!='\0';i++,j++) //这边a的指针偏移不能用j，不然一直是第一个单词，跑不到下面的长度比较中         { 			*(a+i)=*(b+j);  		}         *(a+i)='\0';	//*a='\0',这样字符串的值都被你清空了，strlen(a)恒为0         if(strlen(c)<strlen(a))         {             strcpy(c,a);         }     } } int  main() {   char s[N+1],r[N+1];     gets(s); //********** LongestWord is called here ************     LongestWord(s,r); //**************************************************     printf("%s\n",r);     return 0; }

user: user-4
content: char *A[128]=>char A[128]

user: user-5
content: 修改如楼上所言，这样效率应该很差吧，如果输入字符分布 39个字母+ 空格+39个字母，你这个方法会不会偏了很多呢？
user-0 提问: 关于头文件重复包含的问题

回复:
user: user-1
content: cpp文件不用包含，你加入工程就行（从截图你已经加入了）

user: user-2
content: 你把cpp包括进来了，就会重定义啊，头文件只声明不定义的原因就是防止重定义，你要使用1208里面的函数只要弄个头文件定义一下，然后用cpp实现也能包括进来

user: user-3
content: 是阿，怎么把CPP都包含进来了？这是不好的设计模式

user: user-4
content: 头文件最开始加上 #param once 保证你的头文件只编译一遍

user: user-4
content: 写错了是 #pragma once

user: user-5
content: #include "1208_01.cpp"   这就是在作死,  虽然语法上能通过.  一般来说include的只应该是.h文件.  再有.一般来说.   全局函数, 全局变量都不要在.h文件中实现.    .h文件中只应该存在声明.  你的问题解决办法:   去掉下面这句 #include "1208_01.cpp"  因为你的fun已经在下面声明了.  编译器会自动去找实现的地方来连接.

user: user-6
content: #ifndef TEST_H_ #define TEST_H_ ... ... ... #endif 并去掉头文件中包含的1208_1.cpp

user: user-0
content: 再次感谢各位！

user: user-0
content: 感谢各位，理解了。

user: user-7
content: 楼主，你的代码问题出现在#define TEST这一行；  如果代码中多处出现这一行时，编译会出问题，可以把这行删除，然后在Test.h头文件中添加如下行：  LINE01:  #ifndef  __TEST_HEADER_FILE__ LINE02:  #define  __TEST_HEADER_FILE__  // 定义的其它功能性代码  LINE END: #endif  // #define  __TEST_HEADER_FILE__

user: user-1
content: CPP文件不需要包含

user: user-8
content: test.h包含1208_01.c后，#include “test.h”这句就会被替换为1208_01.c的内容

user: user-0
content: 是不是在Test.h包含1208_01.cpp后编译，会存在两个fun()函数的定义。

user: user-8
content: 楼主我用你的代码做了下实验 #ifndef  _test_ #define _test_ #include <stdio.h> #include <windows.h> #include "1208_01.c" #define TEST "调用其他文件的函数"   void fun(); #endif 问题有两点  1 #include "1208_01.c“ 相当于文本替换，编译1208.c因此这里printf("%s",TEST)与之后的#define TEST "调用其他文件的函数 出现了问题，对调二者位置， 2 已有fun主体的问题， 在你编译了1208.c之后，1208.obj文件中已经包含了fun函数代码，我用dumpbin看的，我于是在工程中删掉1208_01.c,再组建，不编译1208.c之后可以形成.exe文件，运行有打印，证明确实有fun
user-0 提问: 数据结构初学者，求大神指导 C语言

回复:
user: user-0
content: 感谢各位大神指教~小的正努力学习中~

user: user-1
content: 同理setqueue也是这个问题

user: user-1
content: 问了好几个学长都不会，估计他们不想认真帮你  setstack你返回的是一个局部变量的指针，函数结束时对象就没了，当然有问题

user: user-2
content: 你建立空栈就错了，楼上已经跟你提出来了，你应该好生理解下存储时期相关的内容

user: user-3
content: 1.楼主你这码得凌乱了，很难看下去，  2,一般给结构分配空间不是用楼主这种stack s；这样分配的，理由楼上，一般用s=(stack*)malloc(sizeof(stack)  3.这样不是在栈（函数体内的变量所在空间），而是在堆中开辟一块地方用于存放你的结构，在堆中开辟的空间存在的时间由你的代码 掌控，或者程序结束，而栈中开辟的空间在你这个函数结束时就没用了，这个栈空间它可能被其他同属一线程的函数使用，
user-0 提问: c语言面试题

回复:
user: user-1
content: 越界问题，要细腻的思维呀，很容易犯这些小错误的

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-3
content: 放不下了，越界了

user: user-4
content: 很明显越界了，楼主先把基础打好啊

user: user-5
content: c的大小是10个字节，memcpy把11个字节数据放到c里面，越界了

user: user-6
content: 超出字符数组c的人容量限制！

user: user-7
content: 后面加'\0'试试
user-0 提问: C语言中指针就可以访问地址直接操作了，为什么还要变量呢

回复:
user: user-0
content: 明白了，写多就明白了，谢谢

user: user-1
content: 不要捣乱，我支持你

user: user-2
content: 引用 15 楼 tm1mc2 的回复:区分尸食屎柿 http://baike.baidu.com/link?url=FLzIDjlvN5Aalk-J9xd0l6ijfv9Ie49WHc7Cku2U29ssCxdVtY9ozksGvI4x6LqqhaE_al6qmhBB7E4CM_oeFa

user: user-3
content: 区分尸食屎柿

user: user-2
content: 有原子了，为什么还要区别食和屎呢？

user: user-2
content: 有经纬度了，为什么还要地名呢？ 有DNA了，为什么还要种类和姓名呢？

user: user-4
content: 呵呵，这个问题，挺好玩的哦，感觉指针还是挺危险的，用的不好，程序就崩了

user: user-5
content: 哈哈，要不你试一试用01写代码？我相信你会很刺激的 变量是从汇编继承下来的

user: user-6
content: z=x+y 直接用指针 *（int*）(0x1000) =*(int *)(0x1004)+*(int *)(0x1008); 你看这么做好不? 或者  #define  z  (*(int *)0x1000) #defeine x  (*(int *)0x1004) #define   y  (*(int *)0x1008)  z =x+y

user: user-7
content: 让你直接用0和1编程你干不干

user: user-8
content: 代码贴出来大家看看

user: user-6
content: 最早的程序是直接接线连接 表示01的 整个程序就是线的连接，不连为0，连为1 或者相反

user: user-6
content: 1）可读性，编程语言最早用于解决数学计算 有了变量，表达式 和数学公式差别不大，看着很舒服 2）程序员直接操作内存地址，工作量大，并存在很多隐患。 也没啥可读性， 很难直接按照逻辑编程，安排地址就成为主要工作了

user: user-6
content: 让你直接操作地址，准会闹得一团糟 不如，编译器安排，爽利，看着也比较舒服

user: user-9
content: 直接用二进制机器码就可以写程序了，要高级语言干嘛

user: user-10
content: 指针也是一种变量的一种啊 ...

user: user-11
content: 因为它是高级语言，用变量更抽象，更符合人的思维
user-0 提问: 怎样获得dll文件的导入表

回复:
user: user-1
content: nt文件头的index为1的DataDirectory放着导入表的rva，静态扫描涉及到rva到实际文件偏移的转换【扫描节表判断目标Rva落点，然后用相对节表Rva加上PointerToRawData的偏移就是寻址到真正的导入表】，动态则直接一个Rva就完事了，寻址到的结构地址会连着n个IMAGE_IMPORT_DESCRIPTOR【有多少个dll被导入就有多少个这种结构，后面加一个内容全是0的IMAGE_IMPORT_DESCRIPTOR结构（有点字符串的味道）】，在每个IID结构中能够找到dll的函数名和一堆名为IMAGE_THUNK_DATA的数组【也是以0结构结尾】可以用来找导入的函数名称【序号导出就没有函数名】。 iat的查找直接找nt文件头的index为12的DataDirectory

user: user-2
content: WinExec("cmd /c dumpbin /IMPORTS your.dll >d:\\yourdllimports.txt",SW_HIDE); //然后读文件d:\yourdllimports.txt的内容。 C:\Program Files\Microsoft Visual Studio 版本号\VC\bin\dumpbin.exe

user: user-3
content: 用depends看有哪些函数，然后动态加载dll吧

user: user-0
content: 谢谢楼上 不过PE跟COFF不是一种文件格式吧 我们是在做PE的输入表

user: user-4
content: 另外 程序员的自我修养 这本书也有不错的说明，

user: user-4
content: 楼主在网上查查coff文件格式，对你的问题有帮助的
user-0 提问: float变量0在内存中如何表示（0/1代码是多少）？

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: +0，-0 为特殊编码 ，+0 每一位都是0，-0 除了符号位是1，其余都是0 float a =0.0; printf("0x%08x",*(int *)&a);

user: user-3
content: 0 有两个， +0  -0  阶码，尾数为0， 符号位0,1都可以， 很多情况下， 非规格化数/下溢数 也被视为 0， 就是阶码为0， 尾数非0 这种。

user: user-4
content: 表示方法看：http://www.cnblogs.com/dolphin0520/archive/2011/10/02/2198280.html  浮点数0在内存中也全是0，但1就得计算一下才知道了

user: user-5
content: 当然也还是0
user-0 提问:    字符串中每个字符间插入一个空格 运行的时候是错误的 大神看一下吧

回复:
user: user-1
content: 位置很固定, 不知道为什么要两重循环,只要一重应该就够了 void add(char a[]) {     int n;     n=strlen(a);     if(!n) return;     for(int src=n-1,dst=2*src;src;src--){         a[dst--] =a[src];         a[dst--] =' ';     }     a[2*n-1]='\0'; }

user: user-2
content: 自后向前把一个字符变成两个字符，第一个字符不动 例如 123 3 ---> 3 23---> 2 3 1 不动 123--->1 2 3 注意字符串结束符号要加上

user: user-3
content: int main() {     char a[200];     gets(a);     add(a); 	getchar();  } void add(char a[]) {     	int i ,j ,n;     n = strlen(a);     for(i = n-1; i > 0; i--) 	{ 		a[i + i] =  a[i]; 		a[i + i - 1] =  ' '; 	} 	a[n * 2 ] = '\0';      printf("%s",a); }  修改了下 不是很好

user: user-4
content: 引用 5 楼 qq_31897979 的回复:i 改过了   还是不行    1楼说的那个问题确实存在  怎么改呢？？引用  我没具体看你怎么实现的，如果你是要表示i += 2的话也不会一真循环下去，因为n每次只加1，i每次是加2

user: user-0
content: i 改过了   还是不行    1楼说的那个问题确实存在  怎么改呢？？引用

user: user-4
content: 引用 3 楼 qq_31897979 的回复:那应该怎样让n停止到2n？？？？？  你n没问题，有问题的是i

user: user-0
content: 那应该怎样让n停止到2n？？？？？

user: user-4
content: for(i=1;i<n;i+2) 这句是要表示for(i=1;i<n;i+=2)吗，不然 i+2 并不会改变i的值， i 每次循环都是1

user: user-1
content: n不停在加, 这样何时是个头了,i<n成死循环了, 关键a才20
user-0 提问: 运行时候出错。。无法解析的外部符号。。不知道哪里错了，能不能帮我看看

回复:
user: user-1
content: 如果函数在main函数之后定义，应该事先声明一下，你把TimeDiff声明在main之前试试

user: user-2
content: 注意字母大小写  int TimeDiff(struct Time t1, struct Time t2) {  int second1, second2;//秒 int t;
user-0 提问: 用不了break的怎么终止无限循环

回复:
user: user-1
content: 开辟单独的线程

user: user-0
content: 引用 2 楼 user-2 的回复:[quote=引用 1 楼 Dulee_ 的回复:] 比如我要它输入回车就结束， 那应该怎么写呢？  	char ch; 	ch = getchar();       //然后判断ch的值 [/quote] 那这样的话就不会运行下去了啊... 时间就不能动态显示了

user: user-2
content: 引用 1 楼 Dulee_ 的回复:比如我要它输入回车就结束， 那应该怎么写呢？  	char ch; 	ch = getchar();       //然后判断ch的值

user: user-0
content: 比如我要它输入回车就结束， 那应该怎么写呢？

user: user-2
content: int main() { 	int a(void); 	clock_t newtime; 	while(1) 	{  		system("CLS"); 		a(); 		newtime=1000+clock(); 		while(newtime>clock()) 			; 		if(_kbhit()) 		{ 			char ch; 			ch = getchar(); 			if(ch == '\n') 				break; 		} 	} 	return 0; } int a() { 	char ch[100]; 	time_t t; 	struct tm *t1; 	t=time(NULL); 	t1=localtime(&t); 	strftime(ch,100,"%Y年%m月%d日 %H:%M:%S",t1); 	printf("现在是%s\n",ch); 	return 0; }   需要包含头文件#include <conio.h>
user-0 提问: 求解不等式!!!

回复:
user: user-1
content: http://www.doc88.com/p-4925163405966.html参考此论文，看看有没有变换可能 如果没有就蛮力实现即可

user: user-2
content: 思路： 外循环m = 1.0、2.0、3.0.... 内循环计算不等式左边并比较 第一个找到的即为解

user: user-3
content: 引用 4 楼 user-3 的回复:简单处理一下  (M+1)*sqrt(M) <sum(sqrt(M+i),0,M)^2<(m+1)*(sqrt(2M))  M^3<M(M+1)^2 <s ^2 <2*M*(M+1)^2<2M^3  如果 M^3 >= n^2 则 一定有 s>n 如果 M^3 <= n^2/2 则一定不会有 s> n 所以最小的M 在 (n^2 / 2)^(1/3) ~ (n^2)^(1/3)之间 在区间 [floor ((n^2 /2)^1/3) , ceil((n^2)^(1/3))]穷举M即可  校正一下

user: user-3
content: 简单处理一下  (M+1)*sqrt(M) <sum(sqrt(M+i),0,M)<(m+1)*(sqrt(2M))  M^3<M(M+1)^2 <s ^2 <2*M*(M+1)^2<2M^3  如果 M^3 >= n^2 则 一定有 s>n 如果 M^3 <= n^2/2 则一定不会有 s> n 所以最小的M 在 (n^2 / 2)^(1/3) ~ (n^2)^(1/3)之间 在区间 [floor ((n^2 /2)^1/3) , ceil((n^2)^(1/3))]穷举M即可

user: user-3
content: 先定个范围，再穷举 不然只好从1 开始枚举
user-0 提问: 给大家推荐一本经典数据结构图书，个人感觉非常不错

回复:
user: user-0
content: 呵呵，只是推荐而已，可以相互交流

user: user-1
content: 引用 2 楼 crcr 的回复:谢谢，互相交流学习啊，C语言板块熟悉数据结构，对这个比较感兴趣， 楼上是技术牛人吧  没有了，牛人就不逛论坛了

user: user-2
content: 楼主在为自己代言

user: user-0
content: 相互交流学习

user: user-1
content: 另推荐楼主《STL源码剖析》

user: user-0
content: 谢谢，互相交流学习啊，C语言板块熟悉数据结构，对这个比较感兴趣， 楼上是技术牛人吧
user-0 提问: (void (*)(Uint32))svgendq_calc 该语句意义

回复:
user: user-1
content: 先强转成Uint，即无符号整形，然后再转成指针void *; void * 和Unit一般大小相等，可以相互转换而不丢失数据

user: user-2
content: typedef void (*Fn)(Uint32); Fn svgendq_calc; 这回看懂了没？

user: user-2
content: 引用 2 楼 xiaohuagezai 的回复:svgen_dq1.calc(&svgen_dq1);怎么理解 svgen_dq1为结构体变量 结构体指针

user: user-0
content: svgen_dq1.calc(&svgen_dq1);怎么理解 svgen_dq1为结构体变量
user-0 提问: 求助大神  关于for循环 第一次循环和以后循环不同

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

user: user-2
content: scanf函数里面，把\n去掉

user: user-3
content: 点击结帖按钮，然后分配分值， 必须分完，完成即可！

user: user-0
content: 怎么结贴给分啊 我不会用 第一次用  点了不管用

user: user-4
content: scanf("%d", &...)
user-0 提问: vs2015中已经安装easyx 但是调用graphics中函数的时候仍然出错

回复:
user: user-1
content: 只能用于C++啊，Ｃ就不行了

user: user-2
content: bioskey(0)用 		if(_kbhit())	//如果有键盘按下 		{ 			key=_getch();             if( key==0 || key==0xE0 )  // 非字符键                 key = _getch()<<8 | key; 		} 改写，delay改成Sleep()，要包含<windows.h>, getch()要包含<conio.h> randomize是Borland的，VC要用srand()， 其它未定义标识符或没有匹配的函数，是因为函数名一样，但是EasyX实现的时候函数参数已经变了，可以参考下载的EasyX里面的 EasyX_Help.chm 文档，里面有完整的函数文档。

user: user-2
content: int gd = DETECT, gm; initgraph(&gd, &gm, "c:\\tc"); 这2行注释掉，改成initgraph(640,480);

user: user-3
content: 软件兼容编辑 与Borland BGI 绘图库的兼容情况 如果您需要移植原 Turbo C 的绘图程序，需要注意以下几个方面： 1. 颜色。EasyX 库支持了真彩色，这点与 TC 差别很大。 2.getimage / putimage，这组函数较 BGI 做了很多扩充。 3. 设置线性、填充类型的函数，和 BGI 的略有区别。 4.位操作，BGI 的功能很局限，EasyX 库实现了所有的位操作。 5. 常量命名，EasyX 库多采用和 Windows 贴近的命名。 6.其他扩充函数，例如鼠标、批操作等。  有些东西，还是有区别的，还是先看看头文件里有什么吧

user: user-0
content: 编译不成功啊

user: user-3
content: bioskey 不是graphics.h 中的函数吧， 这是 bios函数 （内部调用 Bios功能调用)   编译结果是什么，你这怎么都是提示啊？
user-0 提问: 为什么c语言里，自定义函数在主函数之前，就不用在主函数里声明即可调用？

回复:
user: user-1
content: 定义在前面的话编译器已经认识了这个函数，定义在后面的时候，编译到main函数还不知这个函数，如果未声明，就会出错

user: user-2
content: 其实是因为 定义也是声明。 声明不是定义。  定义在前，表示已经声明了， 多声明一次，不过是重复声明而已， 如果没问题，就会被忽略

user: user-3
content: 编译器在编译过程中可以在Main之前得到函数的声明/定义，就可以在Main中直接使用了。

user: user-4
content: 函数可以调用只需要签过名就可以了。 比如说库函数都在头文件里面签名了。  而函数的定义，包含了定义函数体和签名两个。

user: user-5
content: 因为编译器已经获取到它的信息了，所见即所得！你见过一个人，那么谈起他时就不要特别说明一下了；如果你没见过，那么需要一个细致的描述，你才能认知他！就是这么个理

user: user-6
content: 这个牵涉到函数的作用域问题，楼主还是好好看看基础知识吧

user: user-7
content: 我觉得你可以楼主可以多看看《程序员的自我修养》好多东西就都懂了

user: user-8
content: 人物：A  B  场景1： A发短信给B：家里有饮料，不用买了。 B回来没带饮料 B回来发现家里有好多饮料，苹果味，橘子味等等  场景2： A发短信给B：家里有饮料，苹果味，橘子味...都有 B回来没带饮料  场景3： B回来买了好多饮料 B回家发现家里已经有A之前买的好多饮料，苹果味，橘子味...都有

user: user-9
content: 编译器从前往后按顺序读取源程序并试图理解 看过了函数定义，已经知道调用函数时的所有细节 就用不着另外的声明了

user: user-10
content: 大概可以这样理解和全局变量一样,在函数外声明.
user-0 提问: 字符串排序的一段代码

回复:
user: user-1
content: #include <stdio.h> #include <string.h> void sort(char *str[],int n) { 	char *temp; int i,j; 	for(i=0;i<n-1;i++) 	{ 		for(j=i+1;j<n;j++) 			if(strcmp(str[i],str[j])>0) 			{ 				temp=str[i]; 				str[i]=str[j]; 				str[j]=temp; 			} 	} } void main() { 	int i,n=4; 	char *string[4]={"AASCAL","PASCAL","BASIC","C"}; 	sort(string,n); 	for(i=0;i<n;i++) 		printf("%s\n",string[i]); }

user: user-2
content: 这个程序用的是选择排序思想，楼上说得对 k = 1 if (k != 1) 把1改成i

user: user-3
content: void sort(char *str[],int n) 函数的 k = 1; if (k != 1) 两行中 1 应该是 i 不知道是你打错了，还是书上印错了
user-0 提问:  关于防止头文件重复包含的执行原理的疑问

回复:
user: user-1
content: #ifndef XXX      #define XXX ... #endif 子类一般会用#include"XXX"包含基类头文件，在多继承情况下，为了防止头文件被重复包含，菱形继承里面都要用到XXX一般用的是文件全名或者是能把这个文件区分开来的标识。 如： #ifndef PERSON_H #define PERSON_H class Person { ... }; #endif

user: user-2
content: 你这里定义成空，通常也定义成空，当然你第二句写成#define XXX YYY 也是可以的 另外XXX通常取一个长一点的名字，避免与其他重复

user: user-3
content: #define A #define B 10  其中 A 表示 A 被定义了。但是被定义为空。 B 表示 B 被定义了，而且被定义为 10.  A 一般用在 #ifdef 中，或者用在宏函数中。

user: user-4
content: 什么都没有 .....
user-0 提问: 通过指针引用数组 C语言 STM32串口发送程序 函数调用

回复:
user: user-1
content: bug： 指针访问少一字节，而且越界了  *(pucStr++)  中间的括号保证了，上来就偏移到第2个元素，而且会访问数组越界，就是最后一次循环！所以越界时段错误时就程序不行，每发生段错误，那么程序可能就跑起来了，这将是随即的

user: user-2
content: 你重启什么软件，就成功了。两个函数应该是没区别的。

user: user-0
content: 泥煤啊~~~~~~把有关的软件都关了，从新启动就好啦。为什么这样子。。。。。

user: user-0
content: 有没有帮忙的呀~~~~~~~

user: user-0
content: 顶一下
user-0 提问: c++指针问题，求大神教教

回复:
user: user-1
content: 最大值，最小值，平均值函数中for循环的条件全部都错了，这条件永远不可能满足，返回值不是数组下标8，数组是从0开始的，你冒泡法也错了，没有判断就直接交换了。

user: user-2
content: 乍看一下你的代码，不是很理解你要怎么做，你主要犯了两个错误 1.数组越界：a[8]b[8] 2, for (p = b; p < p + 7; p++)每个函数你都调用了类似这样的东东

user: user-3
content: 你这一会 7 一会 8 的，先想好你的数组里到底有几个元素。
user-0 提问: pthread_cancel取消线程导致的段错误[核心已转储]问题？

回复:
user: user-1
content: 额 看了下pthread_cacel的描述，cancel之后可以join，但是你对thread_result使用有问题，你应该是 if(thread_result == PTHREAD_CANCELED)          printf("Thread is cancel");  这么使用thread_result而不是打印。

user: user-1
content: cancel之后就不要再join线程了。

user: user-2
content: 你如果硬要试试 函数 ret = pthread_cancel(id); 的话, 可以在前面再create一个线程, 线程中等待输入, 当输入特定字符时, 就执行ret = pthread_cancel(id);     而main中就直接  pthread_join(...)

user: user-2
content: 到49行时, pthread_join(id,&thread_result); 里的id已经失效了, 当然会段错误了,   pthread_join 是用在线程未退出前调用,然后会阻塞在那的

user: user-3
content: printf("Thread jointed it returned:%ld", (long)thread_result);  // 把%s 改成 %ld
user-0 提问: 数组下标是表达式或常量，运行速度有影响吗？

回复:
user: user-1
content: 这样的话，编译器确实没法优化， 不过DCTSIZE_7 = DCTSIZE * 7这种优化， 编译器开足马力的话，是可以自己做到的

user: user-0
content: 引用 6 楼 lm_whales 的回复:[quote=引用 5 楼 u010451062 的回复:] [quote=引用 2 楼 lm_whales 的回复:] [quote=引用 1 楼 user-4 的回复:] 第一种编译时就会计算出0和56了，所以这两种编译出来的代码完全一样++ 这里没有优化，这两种代码本质上是相同的  一种区别是 DCTSIZE*0=0，DCTSIZE*7=56 编译器需要计算一下。 0，56做下标，编译器扫描到0，56 就知道这是0，56了 另外一种区别，是修改 0，56 是比较困难的特别是代码很长，有很多这样的代码。[/quote] 谢谢大家的回复。“修改 0，56 是比较困难”是什么意思？是说如果数组下标里的表达式比较复杂的情况吗？这样会有区别吗？[/quote]修改 0，56 是比较困难 是这是数字，或称魔数，直接写在代码中，如果因为某种原因，需要修改为 0，128 那就必须查找 0，56 一个一个修改 而 DCTSIZE 是个 字母表示的数据， 只需要修改定义那一处  就可以了， [/quote] 哦，这样我就明白了，还有一种情况是：DCTSIZE不是用#define定义，而是直接用变量申明的，如 int DCTSIZE；cin>>DCTSIZE; 这样的话，是不是编译器就没有办法优化了？由于用到了for循环，如果在循环外先在计算出 int DCTSIZE_7 = DCTSIZE * 7；这样是否会快一些呢?

user: user-1
content: 引用 5 楼 u010451062 的回复:[quote=引用 2 楼 lm_whales 的回复:] [quote=引用 1 楼 user-4 的回复:] 第一种编译时就会计算出0和56了，所以这两种编译出来的代码完全一样++ 这里没有优化，这两种代码本质上是相同的  一种区别是 DCTSIZE*0=0，DCTSIZE*7=56 编译器需要计算一下。 0，56做下标，编译器扫描到0，56 就知道这是0，56了 另外一种区别，是修改 0，56 是比较困难的特别是代码很长，有很多这样的代码。[/quote] 谢谢大家的回复。“修改 0，56 是比较困难”是什么意思？是说如果数组下标里的表达式比较复杂的情况吗？这样会有区别吗？[/quote]修改 0，56 是比较困难 是这是数字，或称魔数，直接写在代码中，如果因为某种原因，需要修改为 0，128 那就必须查找 0，56 一个一个修改 而 DCTSIZE 是个 字母表示的数据， 只需要修改定义那一处  就可以了，

user: user-0
content: 引用 2 楼 lm_whales 的回复:[quote=引用 1 楼 user-4 的回复:] 第一种编译时就会计算出0和56了，所以这两种编译出来的代码完全一样++ 这里没有优化，这两种代码本质上是相同的  一种区别是 DCTSIZE*0=0，DCTSIZE*7=56 编译器需要计算一下。 0，56做下标，编译器扫描到0，56 就知道这是0，56了 另外一种区别，是修改 0，56 是比较困难的特别是代码很长，有很多这样的代码。[/quote] 谢谢大家的回复。“修改 0，56 是比较困难”是什么意思？是说如果数组下标里的表达式比较复杂的情况吗？这样会有区别吗？

user: user-2
content: 应该是没有影响的 ~

user: user-3
content: 交给编译器了。两种代码编译器出来的运行程序是一样一样的

user: user-4
content: 第一种编译时就会计算出0和56了，所以这两种编译出来的代码完全一样

user: user-1
content: 引用 1 楼 user-4 的回复:第一种编译时就会计算出0和56了，所以这两种编译出来的代码完全一样++ 这里没有优化，这两种代码本质上是相同的  一种区别是 DCTSIZE*0=0，DCTSIZE*7=56 编译器需要计算一下。 0，56做下标，编译器扫描到0，56 就知道这是0，56了 另外一种区别，是修改 0，56 是比较困难的特别是代码很长，有很多这样的代码。
user-0 提问: 数组

回复:
user: user-1
content: 全部相减取绝对值，结果存个新的数组，排个序，取最小的那个就够了

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  #define INPUT_CHARATER 10  int find_max(int *diffret) {         int loop=0;         int min_number=128;         int min_pos=0;          for(loop=0;loop<INPUT_CHARATER;loop++)         {                 if(min_number>diffret[loop])                 {                         min_number=diffret[loop];                         min_pos=loop;                 }         }          return min_pos; }  int find_diff(char *testbuf) {         int diffnum;         int retnum=0;         char diffmark='D';         int diffret[INPUT_CHARATER+1]={0};          for(diffnum=0;diffnum<INPUT_CHARATER;diffnum++)         {                 diffret[diffnum]=abs(testbuf[diffnum] - diffmark);         }          return find_max(diffret); }  int main(void) {         char testbuf[128]={0};         int ret=0;          printf("please input the %d charaters:\n",INPUT_CHARATER);         fgets(testbuf,sizeof(testbuf)-1,stdin);          if(strlen(testbuf)<INPUT_CHARATER)         {                 printf("input charaters number error:%d\n",strlen(testbuf));                 return 1;         }          printf("the input buf is %s",testbuf);         ret=find_diff(testbuf);         printf("the nearly charater position is %d,value is %c\n",ret+1,testbuf[ret]);          return 0; } 结果： please input the 10 charaters: ABSDWQRQRQFQR the input buf is ABSDWQRQRQFQR the nearly charater position is 4,value is D  如果输入有空格或TAB，需要做额外处理

user: user-3
content: 相减取绝对值，然后比较

user: user-4
content: min(abs(char[0..9]-'D'))
user-0 提问: 二维数组中，输入5个人的3项科目成绩，如何计算并输出每一行每一列的平均分？

回复:
user: user-0
content: 我的a[5][5]时表示5个学生，第一列是学号，最后一列是拿来装平均分的。所以才多了2列。 虽然C++我还不是很懂，但是根据你的我还是做出来了。谢谢。

user: user-1
content: 本来只想给你写一个输出的，不过你代码看的我好蛋疼…… 帮你全部重写了一遍——用C++的方法，但你应该把cin和cout改成对应的就可以。 主要是看for的写法  // i是行数， j是列数。我这里是C++的格式，你自己改成printf吧，我不会用printf //另外说一句，你的a[5][5]我看的很蛋疼，5人3科你就a[5][3]啊，[3]是一个人的三科成绩，然后[5]是5个人 #include<iostream> using namespace std;  int main() { 	double total; //total用来计算总分的，除以列数就是该行的平均分，除行数就是该列的平均分 	int i, j; //先初始化行和列 	double a[5][3]; 	//以下是输入成绩的部分 	for (i = 0;i<5;i++) //注意，5个人，就小于5。下面的3科，就小于3，不是小于4，因为是0~4和0~2 	{ 		cout << "现在轮到输入第" << i + 1 << "个人的成绩了" << endl;	//换人的时候，提示 		for (j = 0;j < 3;j++) 		{ 			cout << "***输入他的第" << j + 1 << "科成绩："; 			cin >> a[i][j]; 		} 		cout << endl;	//换人的时候，换一行，看起来更清晰 	}   	//以下是计算平均分的部分，这是计算每个人的 	cout << "以下开始计算每个人的平均分：" << endl; 	for (i = 0;i < 5;i++) 	{ 		total = 0;	//每次换行的时候，总分清0，避免数据干扰 		for (j = 0;j < 3;j++) 		{ 			total = total + a[i][j];	//初始为0，每次都加当前的分数 		} 		cout << "第" << i + 1 << "个人的 " << j << " 科平均分是" << total / j << endl << endl; 	}  	//以下是计算每一科的 	for (j = 0;j < 3;j++) 	{ 		total = 0;	//每次换行的时候，总分清0，避免数据干扰 		for (i = 0;i < 5;i++) 		{ 			total = total + a[i][j];	//初始为0，每次都加当前的分数 		} 		cout << "第" << j+1 << "科的 " << i << " 个人平均分是" << total / i << endl << endl; 	}  	system("Pause"); 	return 0;  }
user-0 提问: 文件操作问题

回复:
user: user-1
content: static struct tushu a[10];	 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。
user-0 提问: 类型转换的问题

回复:
user: user-1
content: 如果直接转换为char，编译器会出警告（长度不一样，指针一般是4字节或8字节，会损失精度）。  不过，这个示例先转换为int也有问题，在x64系统下，编译器也会警告。  应该先转换为long，这样在不同系统架构下就可以通用了： （char)(long)p

user: user-2
content: 哈哈哈 客气客气~

user: user-0
content: 引用 2 楼 hotxlf1 的回复:从你给出的程序中可以知道先前压入栈中的数据类型实际上是(void*)(int)exp[i]，是把char型通过int类型的过度  强制转换成void*，所以实际上是把exp[i]当作void*类型的形参压入栈了，因此  while( priority(exp[i]) <= priority((char)(int)LinkStack_Top(stack)) )中获取栈顶元素时就要反其道而行之，将栈顶的exp[i]  元素回归到char型。这里选用int型作为过渡转换的类型的原因可能是因为指针类型void*和int型所占内存相同，而int和char是可以进  行隐式转换的，因此即使这里你把（char）去除也不会影响程序的正常运行的~~~  这位老师回答的真好

user: user-2
content: 从你给出的程序中可以知道先前压入栈中的数据类型实际上是(void*)(int)exp[i]，是把char型通过int类型的过度  强制转换成void*，所以实际上是把exp[i]当作void*类型的形参压入栈了，因此  while( priority(exp[i]) <= priority((char)(int)LinkStack_Top(stack)) )中获取栈顶元素时就要反其道而行之，将栈顶的exp[i]  元素回归到char型。这里选用int型作为过渡转换的类型的原因可能是因为指针类型void*和int型所占内存相同，而int和char是可以进  行隐式转换的，因此即使这里你把（char）去除也不会影响程序的正常运行的~~~
user-0 提问: 帮忙看一下这两个位移操作实现了什么功能

回复:
user: user-1
content: SetBitsVal(uchar *ch, sint l, sint h, uchar val)：把*ch的从l到h位设置为val的值 比如SetBitsVal(&c, 2, 4, 0x02)，则c变成了 XXX010XX，X表示原值不变

user: user-2
content: 逐步运行看是要实现什么
user-0 提问: C语言,函数没有返回类型,形参没有类型,居然能编译通过?

回复:
user: user-1
content: 老古董的写法了，不用多关心，知道就好了，已经不使用或很少使用了，编译器依然支持，保证向后的兼容

user: user-2
content: 你孤陋寡闻了，现在还有很多开源代码的函数参数表是用你说的那种方式声明。

user: user-3
content: 这段代码 没二十年也差不多了把

user: user-4
content: K&R  的标准写法， 有啥好奇怪的。  谁说只能用 a b 的， 想叫啥名字都可以。

user: user-5
content: 难道又是从谭浩强的书中看到的？

user: user-6
content: 叫老版本C函数的声明方法

user: user-7

user: user-8
content: 形参声明列表在参数表后面，函数的最外层语句组大括号前面。

user: user-8
content: 古董类型，最早的C就是这样的 无返回值类型缺省为 int

user: user-9
content: 好像C是可以这样写的

user: user-10
content: C 很古老的函数声明语法，但现在依然被标准支持。

user: user-0
content: 请大家帮帮忙
user-0 提问: C的fopen打开文件也可以用做数组？

回复:
user: user-0
content: 总算搞明白了，跪谢！

user: user-1
content: 引用 3 楼 libinden71 的回复:[quote=引用 2 楼 libinden71 的回复:] [quote=引用 1 楼 user-1 的回复:] name是要打开的文件名 那不加路径的话name这个文件在哪里？[/quote] 还有个问题fopen（“name”，“a+”）name+双引号和不+双引号的区别是什么？[/quote]  双引号是打开叫name的文件，不然是打开name这个变量里存的字符串为文件名的文件

user: user-0
content: 引用 2 楼 libinden71 的回复:[quote=引用 1 楼 user-1 的回复:] name是要打开的文件名 那不加路径的话name这个文件在哪里？[/quote] 还有个问题fopen（“name”，“a+”）name+双引号和不+双引号的区别是什么？

user: user-0
content: 引用 1 楼 user-1 的回复:name是要打开的文件名 那不加路径的话name这个文件在哪里？

user: user-1
content: name是要打开的文件名
user-0 提问: 关于二叉树的建立与输出，求教！

回复:
user: user-1
content: status biTreeCreate(biTreeNode *t){     char elemValue;     fflush(stdin);     scanf("%c",&elemValue);     if(elemValue=='#')         t=NULL;        if(t==NULL)         return FALSE;     else{             t=(biTreeNode*)malloc(sizeof(biTreeNode));             t->data=elemValue;             biTreeCreate(t->LChild);             biTreeCreate(t->RChild);         }            return TRUE; } 但是这里输入有个疑问，就是为什么当输入为字符时，他是连续输入完毕才接收，而不是输入一个字符回车一下，按道理是这样的，我想这个应该是缓冲区当回车时直接系统才接收

user: user-0
content: 谢谢了，我结合了大家的回复，理解了为什么要用二级指针。 出现的问题不是因为递归，而是因为指针的问题。

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

user: user-1
content: #include <stdio.h> #include <malloc.h> #include <math.h> #include <stdlib.h> typedef char elemType; typedef enum{     FALSE=0,TRUE }status;  typedef struct binaryTreeNode{     elemType data;     struct binaryTreeNode *LChild;     struct binaryTreeNode *RChild; }biTreeNode;  //将树考虑成一个满二叉树，按照先序方式遍历树进入输入，空位用#填充  status biTreeCreate(biTreeNode **t){     char elemValue;     //fflush(stdin);     scanf("%c",&elemValue);     if(elemValue=='#')         *t=NULL;        if(*t==NULL)         return FALSE;     else{ 		*t=(biTreeNode*)malloc(sizeof(biTreeNode)); 		(*t)->data=elemValue; 		biTreeCreate(&((*t)->LChild)); 		biTreeCreate(&((*t)->RChild)); 	}            return TRUE; }  status biTreePreorderPrint(biTreeNode *t){     if(t==NULL)         return FALSE;     else{         printf("%c",t->data);         biTreePreorderPrint(t->LChild);         biTreePreorderPrint(t->RChild);     }     return TRUE; } void main(){     biTreeNode *t;     biTreeCreate(&t);     biTreePreorderPrint(t); } 已解决，看看指针方面的书籍，建议看看零基础学数据结构第二版， 多调试程序，

user: user-1
content: 看看一级指针，二级指针，  为什么要用指针

user: user-3
content: 你在biTreeCreate函数中对t分配了空间，可是此处的t并不是你主函数中的t，只是一个副本！
user-0 提问: C语言求图上每个点的偏心度，偏心度最小的是图的终点，求这个中心点

回复:
user: user-1
content: int d[MAXV][MAXV];// 两点最短路径 void floyd(){     for(int k=0;k<V;k++){         for(int i=0;i<V;i++)             for(int j=0;j<V;j++)                 d[i][j] =min(d[i][j],d[i][k]+d[k][j]);     } }

user: user-0
content: 能做给我看看嘛

user: user-1
content: 用Floyd行吗
user-0 提问: C语言如何将0,1,0,1类型的二进制流,写入二进制文件

回复:
user: user-1
content: size_t fwrite ( const void * ptr, size_t size, size_t count, FILE * stream );  Write block of data to stream Writes an array of count elements, each one with a size of size bytes, from the block of memory pointed by ptr to the current position in the stream.  The position indicator of the stream is advanced by the total number of bytes written.  Internally, the function interprets the block pointed by ptr as if it was an array of (size*count) elements of type unsigned char, and writes them sequentially to stream as if fputc was called for each byte.  Parameters  ptr     Pointer to the array of elements to be written, converted to a const void*. size     Size in bytes of each element to be written.     size_t is an unsigned integral type. count     Number of elements, each one with a size of size bytes.     size_t is an unsigned integral type. stream     Pointer to a FILE object that specifies an output stream.

user: user-2
content: 写二进制用 fwrite 。
user-0 提问: c语言 成绩管理系统问题

回复:
user: user-1
content: 你好歹也加下格式在发嘛，这个看着也太累了

user: user-2
content: void nrank(int n, int grade[N], long num[N])  最外层少了个} 加上就好了！

user: user-2
content: #include <stdio.h> #include <stdlib.h> #pragma warning (disable :4996) #define N 30  void menu(); void input(int *p, long num[N]); void sum(int n, int grade[N]); void grank(int n, int grade[N], long num[N]); void nrank(int n, int grade[N], long num[N]); main() { 	long num[N]; 	int n, grade[N], a; 	menu();  	scanf("%d", &a); 	while (a != 0) 	{  		if (a == 1) 		{  			input(&n, num, grade); 			system("cls");  			menu(); 		}  		if (a == 2) 		{ 			sum(n, grade); 			system("cls"); 			menu(); 		}  		if (a == 3) 		{ 			grank(n, grade, num); 			system("cls");  			menu(); 		} 		if (a == 4) 		{ 			nrank(n, grade, num); 			system("cls"); 			menu(); 		}  		scanf("%d", &a);  	}  } void menu() { 	printf("1.输入记录\n");  	printf("2.计算总分和平均分\n");  	printf("3.按成绩由高到低排出名次表\n");  	printf("4.按学号由小到大排出成绩表\n");  	printf("按序号选择功能\n"); } void menu1() { 	printf("0.返回主菜单"); }  void input(int *p, long num[N], int grade[N]) { 	int i, amd; 	printf("输入人数"); 	scanf("%d", p);  	for (i = 0; i<*p; i++) 	{ 		printf("输入学号"); 		scanf("%ld", &num[i]); 		printf("输入成绩"); 		scanf("%d", &grade[i]); 	} 	menu1(); 	scanf("%d", &amd); }  void sum(int n, int grade[N]) { 	int j, k = 0, amd; 	for (j = 0; j<n; j++) 	{ 		k = k + grade[j]; 	} 	printf("总成绩：%d\n平均分：%d\n", k, k / n); 	menu1(); 	scanf("%d", &amd); } void grank(int n, int grade[N], long num[N]) { 	int x, y, h, g, q, amd; 	for (x = 0; x<n - 1; x++) 	{ 		for (y = 0; y<n - x; y++) 		{ 			if (grade[y]<grade[y + 1]) 			{ 				h = grade[y]; 				grade[y] = grade[y + 1]; 				grade[y + 1] = h; 				q = num[y]; 				num[y] = num[y + 1]; 				num[y + 1] = q;  			} 		}  	} 	for (g = 0; g<n; g++) 	{ 		printf("%ld\t%d\n", num[g], grade[g]); 	} 	menu1(); 	scanf("%d", &amd); }  void nrank(int n, int grade[N], long num[N]) { 	int w, e, u, o, s, amd; 	for (w = 0; w < n - 1; w++) 	{ 		for (e = 0; e < n - w; e++) 		{ 			if (num[e] > num[e + 1]) 			{ 				o = num[e]; 				num[e] = num[e + 1]; 				num[e + 1] = o; 				s = grade[e]; 				grade[e] = grade[e + 1]; 				grade[e + 1] = s; 			} 		} 	} 	for (u = 0; u < n; u++) 	{ 		printf("%ld\t%d\n", num[u], grade[u]); 	} 	menu1(); 	scanf("%d", &amd); }          //少了这个}了，最后一行 。代码运行没错误！

user: user-0
content: 为何木有人

user: user-0
content: 贴吧求助，度娘直接给我删了
user-0 提问: 数组中，输出成绩人数最后显示叠加。我要的结果是不叠加。请大神帮忙

回复:
user: user-1
content: 一楼说的对，每个单独计数，不能用一个count.

user: user-2
content: 哥们，你想统计各成绩段的人数，不分别设count1，count2等等之类的吗

user: user-3
content: 2.0修订版。 #include <stdio.h> int main(void){         int a[20]; //a数组有20个元素   int i,e,f,g;  printf("请输入20个学生的成绩（0<=a[i<=100）：\n"); e=0; f=0; g=0; for(i=0;i<20;i++){ scanf("%d",&a[i]); }     for(i=0;i<20;i++){      if (a[i]>=80 && a[i]<=100) printf("%4d",a[i]);      if (a[i]>=80 && a[i]<=100) e++;     }      printf("优秀人数：%d\n",e);     for(i=0;i<20;i++){      if (a[i]>=60 && a[i]<80) printf("%4d",a[i]);      if (a[i]>=60 && a[i]<80) f++;     }      printf("及格人数：%d\n",f);     for(i=0;i<20;i++){      if (a[i]>=0 && a[i]<60) printf("%4d",a[i]);      if (a[i]>=0 && a[i]<60) g++;     }      printf("不及格人数：%d\n",g); }

user: user-3
content: 按照楼主的原代码改了一些，实现了Dev c++下优秀、及格和不及格的都不叠加，楼主可以试试： #include <stdio.h> int main(void){         int a[20]; //a数组有20个元素   int i,e,f,g;  printf("请输入20个学生的成绩（0<=a[i<=100）：\n"); e=0; f=0; g=0; for(i=0;i<20;i++){ scanf("%d",&a[i]); }     for(i=0;i<20;i++){     	if (a[i]>=80 && a[i]<=100) printf("%4d",a[i]);     	if (a[i]>=80 && a[i]<=100) e++;     }      printf("优秀人数：%d\n",e);     for(i=0;i<20;i++){     	if (a[i]>=60 && a[i]<=80) printf("%4d",a[i]);     	if (a[i]>=60 && a[i]<=80) f++;     }      printf("及格人数：%d\n",f);     for(i=0;i<20;i++){     	if (a[i]>=0 && a[i]<=60) printf("%4d",a[i]);     	if (a[i]>=0 && a[i]<=60) g++;     }      printf("不及格人数：%d\n",g); }
user-0 提问: 求一道编程作业题程序，不用数组和指针

回复:
user: user-1
content: 分别求 AB , AC,  BC, ABC的最小公倍数 这四个值分别为 LAB, LAC, LBC, LABC  第一炮同时放：3* D - D* min(A, B) / LAB - D * min(B, C) / LBC - D * min(AC) / LAC + D * min(A, B, C) / LABC  第一炮不同时放：3* D - D* min(A, B) / LAB - D * min(B, C) / LBC - D * min(AC) / LAC + D * min(A, B, C) / LABC - 2  貌似都和楼主的要求不符，别人是要不用指针和数组，不过这个似乎有点难啊。

user: user-2
content: //甲、乙、丙三人同时放鞭炮，甲每隔A秒放一个，乙每隔B秒放一个，丙每隔C秒放一个，他们各自放D个。对任意给定的A、B、C和D，求能听到多少声鞭响。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int main() {     int A,B,C,D;     int maxABC,i,n;     char *p;     scanf("%d%d%d%d",&A,&B,&C,&D);     maxABC=A;     if (maxABC<B) maxABC=B;     if (maxABC<C) maxABC=C;     p=(char *)calloc(maxABC*D,sizeof(char));     for (i=0;i<D;i++) {         p[A*i]=1;         p[B*i]=1;         p[C*i]=1;     }     n=0;     for (i=0;i<maxABC*D;i++) if (p[i]) n++;     free(p);     printf("%d\n",n);     return 0; } //2 3 7 10 //23 //

user: user-3
content: 分别求 AB , AC,  BC, ABC的最小公倍数 这四个值分别为 LAB, LAC, LBC, LABC  听到的次数就是  3* D - D* min(A, B) / LAB - D * min(B, C) / LBC - D * min(AC) / LAC + D * min(A, B, C) / LABC

user: user-4
content: 弄错了，是每隔ABC秒放一个 共放D个 这样 每个时间间隔是1秒 D个最多放 D*max(A,B,C) 秒 各人 分别放 A*D秒，B*D秒，C*D秒 假设第一响在同一时间 那么甲 每隔A秒，乙每隔B秒，丙每隔C 会响一声鞭炮 如果三者或者两者同时在放，只能听到一声响。 如果A=B=C 那么只能听到 D 声响 如果 A,B,C 互不相等，并且互质并且D*A， 不等于 K*B,K*C,D*B亦然，D*C亦然，  那么可以听到 3D - 2 声响 如果有公因子，那么就会少一点 所以最少D 最多3D-2  至于编程设置三个变量表示每个人点放的鞭炮个数，设置一个数表示时间 每当A,B,C 秒各放一个鞭炮，听到 每秒有人放炮则听到一声响，无人则没听到最后统计一下听到几声响即可

user: user-4
content: 简单点，按照一秒100 个瞬间算，每个瞬间可以放一个鞭炮 ---噢有点快 假设 ABCD都是100 的因子 那么 时间间隔为 1/100 秒 于是变成 甲乙丙丁，四人 各在 100 个时间间隔的任意一个时间间隔开始放鞭炮 不妨设 成顺序 的，甲 早于或等于 乙 早于或等于 丙 早于或等于 丁 然后每隔 100/A,100/B,100/C,100/D时间段 放一个鞭炮 每个鞭炮点房的时间点（1/100 秒）可以听到一声响

user: user-4
content: 最少 一秒 D声 最多一秒 A+B+C+D声

user: user-5
content: 有点象容斥原理, 最简单就是直接枚举, 一个循环搞定

user: user-6
content: 这题就毛病，鞭炮几响的？100头还是一万头的，我都想削出题的

user: user-6
content: a=b=c 完了不就简单了
user-0 提问: 出现error C2065: 'setfont' : undeclared identifier报错该如何解决呢？

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

user: user-0
content: 引用 1楼____________-------- 的回复:去查setfont的声明 作用范围就是不知道他的申明，我在百度上没查到

user: user-0
content: 引用 2楼lm_whales 的回复:TC没有楷体，setfont 不是这个样子的吧？这是用VC6.0编译的结果。

user: user-2
content: TC没有楷体，setfont 不是这个样子的吧？

user: user-3
content: 去查setfont的声明 作用范围
user-0 提问: C语言输出对齐问题

回复:
user: user-1
content: #include <stdio.h> char *s[]={"12","123","12345","324","11234","2345"}; int i; int main() {     for (i=0;i<3;i++) printf("%-6s",s[i]);printf("\n");     for (i=3;i<6;i++) printf("%-6s",s[i]);printf("\n");     return 0; } //12    123   12345 //324   11234 2345 //

user: user-0
content: 引用 3 楼 paschen 的回复:可以限定宽度 能不能给个代码?

user: user-0
content: 引用 2 楼 Jammg 的回复:对于整数%5d 或者%-5d 如果是字符川怎么对齐?

user: user-2
content: 每个输出后用转义字符\t

user: user-3
content: 可以限定宽度

user: user-4
content: 对于整数%5d 或者%-5d

user: user-0
content: 输出就是下面这样的。 12    123       12345 324  11234  2345
user-0 提问: 函数调用问题 求高手帮忙看看 实在是不会改了

回复:
user: user-1
content: 函数没声明就直接调用？把子函数放main函数后边，先声明后调用

user: user-2
content: VS 不支持 variable length array。 换个编译器吧。

user: user-3
content: 数组类型必须编译时确定大小 int Max[n]; 这里n是一个变量，所以不行 如果一定只能是变量，可以考虑使用动态分配内存
user-0 提问: 【链表】链表输入输出函数都写好了，但是为什么我用主函数输出总是程序崩溃

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

user: user-2
content: 这种问题可以用单步调试来找

user: user-3
content: 2楼正解   自己学会用gdb跟代码

user: user-4
content: p2=p1=(struct student*)malloc(LEN);     scanf("num=%ld,score%.5f",&p1->num,&p1->score);  你却没有给 p1->next = null;  没有初始化指向的地方是未知的，当然会崩

user: user-5
content: 出错地方点中断，分析什么原因导致的，不知你这程序要输入什么
user-0 提问: 函数编写问题，求大神指教一下哪里整错了

回复:
user: user-1
content: int IsPrimerNumber(int m) {     int i,k;       if((m==0)||(m==1))     {         return FALSE;     }     else         if(m!=0 && m!=1)         {             k=(int)sqrt(m);             for(i=2;i<=k;i++)             {                 if(m%i==0)                 {                     return FALSE;                 }             }             return TRUE;         } // ==>  这里没有返回值 }  分支有点乱，不要这样写。尽量简单

user: user-2
content: 引用 6 楼 qq_33271984 的回复:额，谢谢了，我的算法有问题，但是改了之后还是有那个警告啊，我觉得每种情况都有返回值啊  你这样for循环只会执行一次，根本没基本执行第二次，循环内就返回了

user: user-0
content: 额，谢谢了，我的算法有问题，但是改了之后还是有那个警告啊，我觉得每种情况都有返回值啊

user: user-2
content: #include<stdio.h> #include<math.h> #define TRUE 1 #define FALSE 0 int IsPrimerNumber(int m) { 	int i,k;  	if((m==0)||(m==1)) 	{ 		return FALSE; 	} 	else 		if(m!=0 && m!=1) 		{ 			k=(int)sqrt(m); 			for(i=2;i<=k;i++) 			{ 				if(m%i==0) 				{ 					return FALSE; 				} 			} 			return TRUE; 		} } void TestPrime(int iNum) { 	int i; 	for(i=0;i<=iNum;i++) 		if(IsPrimerNumber(i)==TRUE) 			printf("\n%d is a prime.",i); 		else 			printf("\n%d is not a prime.",i); } void main() { 	IsPrimerNumber(4); 	int iNum; 	scanf("%d",&iNum); 	TestPrime(iNum); }

user: user-0
content: #include<stdio.h> #include<math.h> #define TRUE 1 #define FALSE 0 int IsPrimerNumber(int m) { 	int i,k;  	if((m==0)||(m==1)) 	{ 		return FALSE; 	} 	else 		if(m!=0 && m!=1) 		{ 			k=(int)sqrt(m); 			for(i=2;i<k;i++) 			{ 				if(m%i!=0) 				{ 					return TRUE; 				} 				else 				{ 					return FALSE; 				} 			} 		} } void TestPrime(int iNum) { 	int i; 	for(i=0;i<=iNum;i++) 		if(IsPrimerNumber(i)==TRUE) 			printf("\n%d is a prime.",i); 		else 			printf("\n%d is not a prime.",i); } void main() { 	int iNum; 	scanf("%d",&iNum); 	TestPrime(iNum); } c(29) : warning C4715: 'IsPrimerNumber' : not all control paths return a value 这样还是有错啊

user: user-2
content: IsPrimerNumber不是所有路径有返回值

user: user-3
content: 函数IsPrimerNumber只定义了m>1的时候的程序，当m=0,1的时候函数无法得知返回值，故而出错，你可以在 if语句外边加个return 0,这样就ok了

user: user-4
content: m == 0 时你看你的函数返回了个啥？
user-0 提问: 希望老师们能帮帮我梳理一下这个题的思路！谢谢

回复:
user: user-1
content: 约瑟夫环，数组实现，超出取余

user: user-2
content: 约瑟夫问题 http://blog.csdn.net/zhangxiangdavaid/article/details/25109205

user: user-3
content: 这里已有答案：http://bbs.csdn.net/topics/391863637?page=1
user-0 提问: 求教

回复:
user: user-0
content: 引用 1楼user-1 的回复: #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <math.h> #include <time.h>  typedef struct _time { 	int seconds; 	int minutes; 	int hours; }TIME, *LPTime;  LPTime InitTime(LPTime time); void UpdateTime(LPTime time); void ShowTime(LPTime time); void delay(int i);  int main() { 	LPTime systemtime = 0;  	systemtime = InitTime(systemtime);  	for (;;) { 		UpdateTime(systemtime); 		ShowTime(systemtime); 		Sleep(100); 	} 	return 0; }  LPTime InitTime(LPTime time) { 	time = (LPTime)malloc(sizeof(TIME));  	if (!time) 	{ 		printf("Error!!!\n"); 		exit(0); 	}  	time->hours = 0; 	time->minutes = 0; 	time->seconds = 0; 	return time;  } void UpdateTime(LPTime time) { 	time->seconds++; 	if (time->seconds == 60) 	{ 		time->seconds = 0; 		time->minutes++; 	} 	if (time->minutes == 60) 	{ 		time->minutes = 0; 		time->hours++; 	} 	if (time->hours == 24) 	{ 		time->hours = 0; 	} }  void ShowTime(LPTime time) { 	printf("%02d:", time->hours); 	printf("%02d:", time->minutes); 	printf("%02d\r", time->seconds); } 我谢谢你，今天才看到。。我马上试试

user: user-1
content: #include <windows.h> #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <math.h> #include <time.h>  typedef struct _time { 	int seconds; 	int minutes; 	int hours; }TIME, *LPTime;  LPTime InitTime(LPTime time); void UpdateTime(LPTime time); void ShowTime(LPTime time); void delay(int i);  int main() { 	LPTime systemtime = 0;  	systemtime = InitTime(systemtime);  	for (;;) { 		UpdateTime(systemtime); 		ShowTime(systemtime); 		Sleep(100); 	} 	return 0; }  LPTime InitTime(LPTime time) { 	time = (LPTime)malloc(sizeof(TIME));  	if (!time) 	{ 		printf("Error!!!\n"); 		exit(0); 	}  	time->hours = 0; 	time->minutes = 0; 	time->seconds = 0; 	return time;  } void UpdateTime(LPTime time) { 	time->seconds++; 	if (time->seconds == 60) 	{ 		time->seconds = 0; 		time->minutes++; 	} 	if (time->minutes == 60) 	{ 		time->minutes = 0; 		time->hours++; 	} 	if (time->hours == 24) 	{ 		time->hours = 0; 	} }  void ShowTime(LPTime time) { 	printf("%02d:", time->hours); 	printf("%02d:", time->minutes); 	printf("%02d\r", time->seconds); }