Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 宏定义的空格问题

回复:
user: user-0
content: 引用 3 楼 拥抱Linux 的回复:[quote=引用 2 楼 上帝I文件 的回复:] [quote=引用 1 楼 拥抱Linux 的回复:] 上面的是对的，下面的宏定义里type和name没有空格的是错的。  （1）上面的type和name有空格的，  #define DECLARE(name, type) type name##_##type##_type  int main() { 	DECLARE(val, int); }  宏展开之后，是 int val_int_type  （2）下面的，type和name没有空格的，宏展开之后是 typename_int_type  对于第（2）个宏展开的结果，C编译器肯定把它当成一个标识符了，而且是一个没有定义的标识符，所以才会报错。  估计要么是试卷印刷错误？ 要么是故意写错来考查对宏展开的理解？谢谢回答，第一个代码是把“type name##_##type##_type”整个当做一个标识符了，也就是说，第二个空格后面的所有字符都会被当做一个标识符？那么是否可以理解为第一个标识符中不能有空格（括号内的空格除外）的存在？[/quote]  没看懂你这几句话是什么意思呢。。。特别是没看懂你说的什么当作标识符的意思。 实际上，无论是第一个代码还是第二个代码，根本的地方都在于，宏的展开究竟是如何实现的。 宏的展开，就是简简单单的文本替换，牢牢记住这个就可以了。 第一个代码：  #define DECLARE(name, type) type name##_##type##_type int main() {     DECLARE(val, int); }  宏展开的时候，就是用字符串"val"、"int"分别代替宏定义中的"name"、"type"，所以得到的结果是  int val_int_type;  在宏定义里面，原来的空格还是原来的空格呀，空格也是一个字符，也是整个宏的一部分啊！ 而第二个代码，  #define DECLARE(name, type) typename##_##type##_type  int main() {     DECLARE(val, int); }  宏展开的时候，同样也是文本替换，"val"、"int"分别替换宏里面的"name"、"type"，而"typename"很明显既不是"type"也不是"name"，当然就不能被替换了呀！  这里面，没有什么标识符的问题哦！ 宏，文本替换。就是这么简单！——千万不要把简单的问题复杂化了哦！ 不知道这样解释，能不能想通呢？[/quote] 谢谢，理解了

user: user-1
content: 引用 2 楼 上帝I文件 的回复:[quote=引用 1 楼 拥抱Linux 的回复:] 上面的是对的，下面的宏定义里type和name没有空格的是错的。  （1）上面的type和name有空格的，  #define DECLARE(name, type) type name##_##type##_type  int main() { 	DECLARE(val, int); }  宏展开之后，是 int val_int_type  （2）下面的，type和name没有空格的，宏展开之后是 typename_int_type  对于第（2）个宏展开的结果，C编译器肯定把它当成一个标识符了，而且是一个没有定义的标识符，所以才会报错。  估计要么是试卷印刷错误？ 要么是故意写错来考查对宏展开的理解？谢谢回答，第一个代码是把“type name##_##type##_type”整个当做一个标识符了，也就是说，第二个空格后面的所有字符都会被当做一个标识符？那么是否可以理解为第一个标识符中不能有空格（括号内的空格除外）的存在？[/quote]  没看懂你这几句话是什么意思呢。。。特别是没看懂你说的什么当作标识符的意思。 实际上，无论是第一个代码还是第二个代码，根本的地方都在于，宏的展开究竟是如何实现的。 宏的展开，就是简简单单的文本替换，牢牢记住这个就可以了。 第一个代码：  #define DECLARE(name, type) type name##_##type##_type int main() {     DECLARE(val, int); }  宏展开的时候，就是用字符串"val"、"int"分别代替宏定义中的"name"、"type"，所以得到的结果是  int val_int_type;  在宏定义里面，原来的空格还是原来的空格呀，空格也是一个字符，也是整个宏的一部分啊！ 而第二个代码，  #define DECLARE(name, type) typename##_##type##_type  int main() {     DECLARE(val, int); }  宏展开的时候，同样也是文本替换，"val"、"int"分别替换宏里面的"name"、"type"，而"typename"很明显既不是"type"也不是"name"，当然就不能被替换了呀！  这里面，没有什么标识符的问题哦！ 宏，文本替换。就是这么简单！——千万不要把简单的问题复杂化了哦！ 不知道这样解释，能不能想通呢？

user: user-0
content: 引用 1 楼 拥抱Linux 的回复:上面的是对的，下面的宏定义里type和name没有空格的是错的。  （1）上面的type和name有空格的，  #define DECLARE(name, type) type name##_##type##_type  int main() { 	DECLARE(val, int); }  宏展开之后，是 int val_int_type  （2）下面的，type和name没有空格的，宏展开之后是 typename_int_type  对于第（2）个宏展开的结果，C编译器肯定把它当成一个标识符了，而且是一个没有定义的标识符，所以才会报错。  估计要么是试卷印刷错误？ 要么是故意写错来考查对宏展开的理解？谢谢回答，第一个代码是把“type name##_##type##_type”整个当做一个标识符了，也就是说，第二个空格后面的所有字符都会被当做一个标识符？那么是否可以理解为第一个标识符中不能有空格（括号内的空格除外）的存在？

user: user-1
content: 上面的是对的，下面的宏定义里type和name没有空格的是错的。  （1）上面的type和name有空格的，  #define DECLARE(name, type) type name##_##type##_type  int main() { 	DECLARE(val, int); }  宏展开之后，是 int val_int_type  （2）下面的，type和name没有空格的，宏展开之后是 typename_int_type  对于第（2）个宏展开的结果，C编译器肯定把它当成一个标识符了，而且是一个没有定义的标识符，所以才会报错。  估计要么是试卷印刷错误？ 要么是故意写错来考查对宏展开的理解？
user-0 提问: 输出所有形如aabb的四位完全平方数(前两位数字相等，后两位数字相等)

回复:
user: user-1
content: 基本数学思维都没有的话，学编程挺困难的

user: user-2

user: user-3
content: 因为前两位数字相等，后两位数字相等
user-0 提问: 〔求教大神〕：C中用settimer实现定时，执行功能函数成功后可否得到一个功能码？

回复:
user: user-0
content: 引用 1 楼 user-2的回复:在OnTimer if(nIDEvent==XXX)全局变量X=fun(); 然后获取这个全局变量X 你好，可否详细讲解一下呢？这个是用signal信号来确定fun的执行的，调用的fun是void型的

user: user-1
content: 定时器回调fun传入一个全局变量地址，回调结果保存到这个里面就行啦

user: user-2
content: 在OnTimer if(nIDEvent==XXX)全局变量X=fun(); 然后获取这个全局变量X

user: user-2
content: 引用 3 楼 不解释、 的回复:[quote=引用 1 楼 user-2的回复:]在OnTimer if(nIDEvent==XXX)全局变量X=fun(); 然后获取这个全局变量X 你好，可否详细讲解一下呢？这个是用signal信号来确定fun的执行的，调用的fun是void型的[/quote] 那你就如三楼所说设一个全局变量，fun执行之后改变这个全局变量的值，在其他地方调用这个全局变量就知道执行的情况了

user: user-0
content: 引用 1 楼 user-2的回复:在OnTimer if(nIDEvent==XXX)全局变量X=fun(); 然后获取这个全局变量X 不好意思，标题有误，这个用的是setitimer而不是SetTimer
user-0 提问: 有没有大佬

回复:
user: user-1
content: 江湖救急，拿去用吧~~   #include<stdio.h> int main() { 	int n,a,b; 	double sum=0; 	printf("程序功能：计算s=1/2+2/3+3/5+5/8+8/13+13/21......\n"); 	do { 		printf("\n请输入要求和的项数："); 		scanf("%d",&n); 		if(n<1) 			printf("项数无效，请重新输入！\n\n"); 	} while(n<1); 	int i,tmp; 	a=1,b=2; 	for( i=0;i<n;i++){ 		printf("第%d项: %d/%d\n",i+1,a,b); 		sum+=a/(double)b; 		tmp=a+b; 		a=b; 		b=tmp; 	} 		printf("前%d项之和为%.2f\n",i,sum); 		return 0; 	}
user-0 提问: 关于sizeof函数计算结构体类型空间大小时遇到的问题

回复:
user: user-1
content: 把结构体的末尾改成： } __attribute__(packed); 就可以防止对齐，从而达到需求。这在操作系统开发中非常有用

user: user-2
content: 两条原则： 1.把数据的地址除数据的大小，如果余数结果为0（整除），那么数据就是对齐的。 2.结构最终大小是所对齐数据中最大数据的整数倍，如果不够需要进行填充。 根据这两条，那个数据结构是16，没有问题

user: user-3
content: 这个是不一定的，因系统而已。有些系统必须把每个成员都放在偶数地址上，或4的倍数的地址上，会存在为使用的缝隙。––C Primer Plus

user: user-4
content: 勘误一下： 上面写的「比如int型在32位、64位x86机器上占4个字节，它的地址的数值必须是4的整数倍，也就是 0x7fff....00 这样的地址。」把地址的值写错了，十六进制下4的倍数不是这样的，应该是二进制下的 .....00 这样的地址。一直习惯看到 十六进制的地址，一下子没改过来。不好意思啊！其它内容应该没有笔误。

user: user-4
content: 对于结构体类型，成员的内存对齐，除了有结构体内部的对齐，还有整个结构体本身在内存中的对齐。 看过的一个参考资料，还是比较准确、形象的，截图如下： （1）  （2）  另外，结构体本身在内存中的对齐基数可以用宏alignof来得到，看资料是C11之后支持的，相关头文件为<stdalign.h>。 例如：  #include <stdalign.h> // 获取结构体变量TestStu本身的内存对齐基数，数值的单位是字节 printf("Alignment of int is %zu\n", alignof(TestStu));   输出结果是： Alignment of structure TestStu is 4 意思是，结构体变量TestStu在内存中占用的空间，要以4个字节为基数来对齐。  从上面的截图也可以看出，结构体成员没有占据的部分，就以空字节来占位（padding）。  另外，成员之间也不一定是紧密挨在一起的，各个类型都有相应的「地址的数值」的限制。 简单地说，占单个字节的类型没有限制，其它的占偶数个字节的类型都有限制，比如int型在32位、64位x86机器上占4个字节，它的地址的数值必须是4的整数倍，也就是 0x7fff....00 这样的地址。所以如果一个char和一个int顺序定义的话，在内存里，它们俩也不会紧挨在一起，而是二者之间有空的占位字节（padding）。   总结一下： 你看的书里提到的「如果没有自定义字节对齐数，变量会按照它本身对齐」这句话是对的，但是具体到你的例子，不能只考虑结构体成员而忽视了结构体变量本身——结构体变量也是变量啊！ 还有一点就是，在需要对齐的情况下，变量对地址的数值也是有要求的，不是见到一个地址就放上去的。  希望能帮到你。：）  PS. 在gcc的文档里也说过，数据在内存里也可以不对齐，直接一个紧挨着下一个也行，只是这样的读取效率就低多了。对齐是以空间换时间。

user: user-5
content: 说实话，基本用不到这些，一般直接sizeof，然后再用到其他方面就好了

user: user-6
content: 结构体的最终大小需要是其最大成员大小的整数倍，这个结构体是4个字节，所以A的后面还会预留3个字节，一共16

user: user-7
content: B后面补2个字节，A后面补3个字节，所以是16.另外，结构体对齐得到值是4个倍数，而不是一个13

user: user-8
content: 引用 1 楼 user-9 的回复:结构体的最终大小需要是其最大成员大小的整数倍，所以A的后面还会预留3个字节。  这个就是最简单的计算标准。

user: user-8
content: 结构体的对齐问题，不仅仅要考虑单个结构体，还必须考虑 结构体构成数组(array)时、相应的成员必须位对齐。显然上面说的 13字节进行array时无法 位对齐，如果补3个字节空位到16字节，再进行array时，可以实现位对齐。  位对齐要求，与系统内存分页操作便利有关。  ”如果没有自定义字节对齐数，变量会按照它本身对齐“, 这句话好像不对，应该与编译器设置有关（缺省位对齐)。

user: user-0
content: 引用 1 楼 user-9 的回复:结构体的最终大小需要是其最大成员大小的整数倍，所以A的后面还会预留3个字节。 这是在哪本书里讲的，求教大佬

user: user-9
content: 结构体的最终大小需要是其最大成员大小的整数倍，所以A的后面还会预留3个字节。
user-0 提问: c语言帮帮忙

回复:
user: user-1
content: 在这里帮你是害你，这些都是最最基本的

user: user-2
content: 引用 2 楼 qq_43428547 的回复:既然是wraning那肯定是语句错误  1.x没有加& 2.y没有加& 3.没有return 0； 4.if没有{} 5.else没有{} 6.x==0,y==0

user: user-2
content: 既然是wraning那肯定是语句错误  1.x没有加& 2.y没有加& 3.没有return 0； 4.if没有{} 5.else没有{}

user: user-3
content: 商会出现小数 应该会警告 double转换到int出现截断，造成数据丢失
user-0 提问: 问一个问题

回复:
user: user-1
content: 形参char  (*ss) [M]：是一个数组指针，是一个指向列数为M的二维数组

user: user-2
content: 在调用fun这个函数时，以二维数组名x作为实参。 二维数组名x可以看成一个存放地址常量的指针，其值为二维数组中第一个元素的地址。 即x的值与x[0]的值相同，只是其基类型为具有M个char型元素的数组类型。 因此二维数组名可理解为一个行指针。 所以fun函数对应的形参也必须是一个行指针变量。 fun函数的首部可以是以下三种形式之一：  fun(char (*ss)[M]) /*上述代码使用形式*/ fun(char ss[ ][M]) fun(char ss[N][M])

user: user-3
content: 这是ss是个指针   它指向一个char类型的数组，这个数组有M个元素

user: user-4
content: char(* ss)[M]  ss是指向 char[M]数组的指针
user-0 提问: 哪个大神可以帮一下小弟，实在是不会，不甚感激。

回复:
user: user-1
content: #include <stdio.h> #define MAX 0xFFFF //0-2^16*2^5 int main() { 	int n,sum=0; 	unsigned int arr[MAX]; 	scanf("%d",&n); 	//初始化  	for(int i=0; i<MAX; i++) 		arr[i]=0xFFFFFFFF; 	//求质数  	for(int i=2; i<=n; i++) 		for(int j=i*2; j<=n; j+=i) 			arr[j>>5]&=~(1<<j%32); //选出最后10个  	int a[10],num=0; 	for(int i=n; i>=2&&num<10; i--) { 		if(arr[i>>5]&1<<i%32) 			a[num++]=i; 	} //输出	 	for(int i=num-1; i>=0; i--) { 		printf("%d ",a[i]); 		sum+=a[i]; 	} 	printf("\nsum=%d",sum); 	return 0; }

user: user-2
content: 很早之前写的判断素数的，凑活着用下吧  int isPrime(int num) {   int i;   double k;   if(num<2){return 0;}   k=sqrt((double)num);      for(i=2;i<=k;i++)         {       if(num%i==0)                return 0;      }   return 1; }
user-0 提问: 新手初来乍到，有没有懂这个的，谢谢

回复:
user: user-1
content: 引用 5 楼 636f6c696e 的回复:while循环里只有输入的数是正数 i才会++，输入是负数的时候i的值不变。 而for循环不论输入的数是正式负，i都会++ [quote=引用 4 楼 冷风1023 的回复:] [quote=引用 3 楼 636f6c696e 的回复:] 显然不一样啊： getsum是求n个正数的和，也就是说输入的个数可能大于n个 getsum_v2是求n个数中正数的和，输入只有n个数 不太明白，第一个i大于n不就退出了吗[/quote][/quote] 受教了，还真是。

user: user-2
content: 显然不一样啊： getsum是求n个正数的和，也就是说输入的个数可能大于n个 getsum_v2是求n个数中正数的和，输入只有n个数

user: user-2
content: while循环里只有输入的数是正数 i才会++，输入是负数的时候i的值不变。 而for循环不论输入的数是正式负，i都会++ 引用 4 楼 冷风1023 的回复:[quote=引用 3 楼 636f6c696e 的回复:] 显然不一样啊： getsum是求n个正数的和，也就是说输入的个数可能大于n个 getsum_v2是求n个数中正数的和，输入只有n个数 不太明白，第一个i大于n不就退出了吗[/quote]

user: user-1
content: 引用 3 楼 636f6c696e 的回复:显然不一样啊： getsum是求n个正数的和，也就是说输入的个数可能大于n个 getsum_v2是求n个数中正数的和，输入只有n个数 不太明白，第一个i大于n不就退出了吗

user: user-3
content: 一样哦，都是输入n个值，然后把大于0的值想加，返回去

user: user-4
content: 一样的。都是n个大于0的数求和
user-0 提问: 请问如何修改？

回复:
user: user-1
content: 3错了 sum3 = mony * (1 + air3 / 2) * (1 + air3 / 2);

user: user-0
content: 引用 1 楼 user-1的回复:3错了 sum3 = mony * (1 + air3 / 2) * (1 + air3 / 2); 我知道了，2，3都错了
user-0 提问: malloc内存浪费问题的请教

回复:
user: user-1
content: p = malloc(100); 申请内存空间 只能整个释放掉，不可能释放一半  realloc可以调整空间大小

user: user-2
content: realloc可以对申请的空间进行伸缩的，而不是只可以扩大，其实也可以减小；建议查一下这个函数的使用。

user: user-3
content: 当然不可以这么做，malloc出来的内存是有内存管理结构的。 realloc可以将之前申请的内存变大或者变小。

user: user-4
content: realloc
user-0 提问: C语言有大佬帮我看看吗？

回复:
user: user-0
content: 引用 3 楼 qq_43428547的回复: #include <stdio.h> #include <time.h> #include <stdlib.h> int main() { 	int num = 10;//表示题目数量 	char ch[2] = {'+','-'}; 	int point = 0; 	const char *s1[4] = {"Very good!","Excellent!","Nice work!","Keep up the good work!"}; 	const char *s2[4] = {"No,please try again.","Wrong,try once more.","No,Don't give up.","Not corret.Keep Trying."}; 	srand(time(NULL)); 	while(num--) 	{ 		int answer,a,b; 		int r = rand()%2; 		int r1; 		int daan; 		int i = 0; 		int flag = 0; 		do 		{ 			a = rand()%51; 			b = rand()%51; 		}while(a+b>50 || a-b<0); 		 		if(r == 0) daan = a+b; 		if(r == 1) daan = a-b; 		for(i=0; i<3; i++) 		{ 			r1 = rand()%4; 			printf("%d %c %d = ",a,ch[r],b); 			scanf("%d",&answer); 			if(answer == daan) 			{ 				flag = 1; 				printf("%s\n",s1[r1]); 				break; 			}else 			{ 				printf("%s\n",s2[r1]); 			} 			if(i == 2) 			printf("正确答案:%d\n",daan); 		} 		if(flag = 1) 		{ 			switch(i) 			{ 				case 0 : point+=10;break; 				case 1 : point+=7;break; 				case 2 : point+=5;break; 			} 		} 		 	 }  	 switch(point/=10) 	 { 	 	case 10: 	 	case 9 : printf("SMART");break; 	 	case 8 : printf("GOOD");break; 	 	case 7 : printf("OK");break; 	 	case 6 : printf("PASS");break; 	 	default : printf("TRY AGAIN"); 	 } 	 return 0; 	 }  大佬牛

user: user-1
content: #include <stdio.h> #include <time.h> #include <stdlib.h> int main() { 	int num = 10;//表示题目数量 	char ch[2] = {'+','-'}; 	int point = 0; 	const char *s1[4] = {"Very good!","Excellent!","Nice work!","Keep up the good work!"}; 	const char *s2[4] = {"No,please try again.","Wrong,try once more.","No,Don't give up.","Not corret.Keep Trying."}; 	srand(time(NULL)); 	while(num--) 	{ 		int answer,a,b; 		int r = rand()%2; 		int r1; 		int daan; 		int i = 0; 		int flag = 0; 		do 		{ 			a = rand()%51; 			b = rand()%51; 		}while(a+b>50 || a-b<0); 		 		if(r == 0) daan = a+b; 		if(r == 1) daan = a-b; 		for(i=0; i<3; i++) 		{ 			r1 = rand()%4; 			printf("%d %c %d = ",a,ch[r],b); 			scanf("%d",&answer); 			if(answer == daan) 			{ 				flag = 1; 				printf("%s\n",s1[r1]); 				break; 			}else 			{ 				printf("%s\n",s2[r1]); 			} 			if(i == 2) 			printf("正确答案:%d\n",daan); 		} 		if(flag = 1) 		{ 			switch(i) 			{ 				case 0 : point+=10;break; 				case 1 : point+=7;break; 				case 2 : point+=5;break; 			} 		} 		 	 }  	 switch(point/=10) 	 { 	 	case 10: 	 	case 9 : printf("SMART");break; 	 	case 8 : printf("GOOD");break; 	 	case 7 : printf("OK");break; 	 	case 6 : printf("PASS");break; 	 	default : printf("TRY AGAIN"); 	 } 	 return 0; 	 }

user: user-2
content: 没有大佬也没有帮你看的。
user-0 提问: OJ题目,判断概率,在线等,吐血了,我不知道我思路哪里不对.....

回复:
user: user-0
content: 引用 4 楼 user-1 的回复：极端场景特殊处理下吧，比如m=1 n=1的情况，你a只能选1。 说白了，如果m-1<1那也只能选1，m+1>n也只能选n [quote=引用 3 楼 像风一样的锋 的回复:] #include <stdio.h>  int main() { 	int m,n,a; 	scanf("%d%d",&n,&m); 	a = (m > n / 2) ? m - 1 : m + 1; 	printf("%d",a); 	return 0; } 并不对,也是错误14%[/quote]对喔

user: user-1
content: 极端场景特殊处理下吧，比如m=1 n=1的情况，你a只能选1。 说白了，如果m-1<1那也只能选1，m+1>n也只能选n 引用 3 楼 像风一样的锋 的回复:#include <stdio.h>  int main() { 	int m,n,a; 	scanf("%d%d",&n,&m); 	a = (m > n / 2) ? m - 1 : m + 1; 	printf("%d",a); 	return 0; } 并不对,也是错误14%

user: user-0
content: #include <stdio.h>  int main() { 	int m,n,a; 	scanf("%d%d",&n,&m); 	a = (m > n / 2) ? m - 1 : m + 1; 	printf("%d",a); 	return 0; } 并不对,也是错误14%

user: user-0
content: 引用 1 楼 user-1 的回复：这个不难吧 a = (m > n / 2) ? m - 1 : m + 1;好像我写多了个等号

user: user-1
content: 这个不难吧 a = (m > n / 2) ? m - 1 : m + 1;
user-0 提问: 求大佬帮忙看看这两种为什么不一样

回复:
user: user-1
content: 第二层循环会改变y的值，区别就在这里。不重新赋值的话，y每次进入循环的初始值都不一样。

user: user-2
content: 具体到你的图里面的代码，两层for循环，区别在于第二层 for 循环开始的时候，变量 y 的初始值。  x=0; y=0; // 第一次执行第一层循环的时候，x 的初始值是 0 , 因为上面已经赋值过了 for(;x<=1989;x++){     // 第一次执行第二层循环的时候， y 的初始值是 0 ，同样是因为上面已经赋值过了。     // 但是，当第二层循环全部结束之后，程序进入到第二次执行第一层循环的时候，就有区别了。     // 第一层循环，开始第2次循环，x 的值变为 1 ，这个没有疑问，     // 这时，执行第二层循环了，那么这个时候 y 的值是多少呢？ 还是 上面的 0 吗？ 很明显，已经不是了。     // y 的值现在是 1990 ，所以第二层循环再也不会执行了。     for(;y<=1989;y++){     } }  而另外一种情况，  // 第一次执行第一层循环的时候，x 的初始值是 0 , 因为上面已经赋值过了 for(x = 0 ; x<=1989 ; x++){     // 第一次执行第二层循环的时候， y 的初始值是 0 ，同样是因为上面已经赋值过了。     // 但是，当第二层循环全部结束之后，程序进入到第二次执行第一层循环的时候，就有区别了。     // 第一层循环，开始第2次循环，x 的值变为 1 ，这个没有疑问，     // 这时，执行第二层循环了，那么这个时候 y 的值是多少呢？这里会给 y 赋值 0 ，所以，     // 第二层循环，再次从 y 为 0 开始 执行， 一直到 y 超过 1989 才 结束这层循环。     for(y = 0 ; y<=1989 ; y++){     } }

user: user-3
content: 外部有赋初始值了，所以这两个没啥区别，一般建议在for循环内部设置初值比较好一点。
user-0 提问: 关于for循环（新手）

回复:
user: user-0
content: 哦我看错了谢谢怪不得

user: user-0
content: 我重新解释下题目就是为什么d e f在最后的d/(e*f)里得出的答案永远是0 也就是循环中d e f无法参与到最后的式子中导致最后的式子永远是0/（0*0）还是其他哪里出了问题导致答案永远为0

user: user-1
content: 引用 2 楼 weixin_44906053 的回复:那帮我看看为什么答案永远等于0  根据你的程序，输入两个0的时候，肯定不等于0啊，肯定是输出1啊，哈哈！（好吧，开个玩笑）  言归正传，在你的程序的最后把输出语句修改了一下，把d 、e 、f 的值也一并输出，这样就看得明白了。  		printf("d = %d, e = %d, f = %d\n", d, e, f); 		printf("d / (e + f) = %d\n", d / (e + f));  比如，输入两个数，3 、2，结果是  d = 6, e = 4, f = 30 d / (e + f) = 0  你看，为什么 d / (e + f) 是 0 呢？ 因为 / 是取商运算符，整数对整数取商的话，分子比分母小，结果就是0了呀！ 再试一组数，15、2，结果是  d = 2004310016, e = 1999716352, f = 870 d / (e + f) = 1  这下应该明白了吧？

user: user-1
content: 问题究竟是什么意思呢？ 引用如何把for循环中的d e f变量取出？ 变量 d 、e 、f 的定义位置本来就是在 3 个 for 循环之外，而且 for 循环内部也没有同名局部变量覆盖它们3个的作用域， 所以 这3个变量一直都在for循环里面起作用，也在 for 循环外面起作用啊 ！  所以，问题的意思是想把 d 、 e 、f  提取到哪里呢？ 假如是想在这个 if 代码块外面也能使用的话，何不跟变量 a 、b 、c 等一样定义在 if 的上面呢？ 作用域扩大就好了。

user: user-0
content: 那帮我看看为什么答案永远等于0

user: user-2
content: 本来就获取的到
user-0 提问: 接下来的代码怎么写

回复:
user: user-0
content: 引用 1 楼 user-1的回复:什么叫接下来怎么写。。。你要干什么 实现以上功能，这只是部分的代码，不齐

user: user-0
content: 实现以上所有的功能，这些代码只是实现了部分

user: user-1
content: 什么叫接下来怎么写。。。你要干什么
user-0 提问: C语言关于字符串

回复:
user: user-1
content: 常规算法都需要扫描两遍，第一遍找最大位置，第二遍拼装

user: user-0
content: 应该还有可以改进的地方

user: user-0
content: 因为是手机编译器  字符串  s  s1  s2 的空间就没有给太多

user: user-0
content: 啊哈哈    不小心发了两次
user-0 提问: 记事本窗口里的光标位置可以控制吗？

回复:
user: user-1
content: \b回退一格好像

user: user-0
content: 引用 1 楼 孤星血泪 的回复:可以，通过句柄 可以说说是哪个函数吗？我好去查。

user: user-2
content: 可以，通过句柄

user: user-0
content: 引用 5 楼 孤星血泪 的回复:[quote=引用 4 楼 六道佩恩 的回复:] [quote=引用 3 楼 孤星血泪 的回复:] [quote=引用 2 楼 六道佩恩 的回复:] [quote=引用 1 楼 孤星血泪 的回复:] 可以，通过句柄 可以说说是哪个函数吗？我好去查。[/quote]  HWND hwnd = FindWindow() 获取记事本窗体句柄 RECT rect; GetWindowRect(hwnd,&rect);  获取窗口左上角坐标 SetCursorPos(rect.left+光标相对窗口X轴位置,rect.top+光标相对窗口Y轴位置)； 设置鼠标在记事本窗口里的位置[/quote] 老哥，你这个只是控制鼠标到达目标窗口的相对位置啊，不是光标啊，而且即便想实现鼠标点击更改光标，坐标方式也不一样啊，鼠标的坐标是像素，光标的坐标是字符[/quote]  哦，好像可以用SendMessage()吧，下消息EM_SETSEL[/quote] 我查了下，这个好像是选取一段文字而不是定位光标。也就是说，没有直接操控窗口光标的函数吗？而且发送消息的方式好像最多只能设置定位而不能获取定位吧？

user: user-2
content: 引用 4 楼 六道佩恩 的回复:[quote=引用 3 楼 孤星血泪 的回复:] [quote=引用 2 楼 六道佩恩 的回复:] [quote=引用 1 楼 孤星血泪 的回复:] 可以，通过句柄 可以说说是哪个函数吗？我好去查。[/quote]  HWND hwnd = FindWindow() 获取记事本窗体句柄 RECT rect; GetWindowRect(hwnd,&rect);  获取窗口左上角坐标 SetCursorPos(rect.left+光标相对窗口X轴位置,rect.top+光标相对窗口Y轴位置)； 设置鼠标在记事本窗口里的位置[/quote] 老哥，你这个只是控制鼠标到达目标窗口的相对位置啊，不是光标啊，而且即便想实现鼠标点击更改光标，坐标方式也不一样啊，鼠标的坐标是像素，光标的坐标是字符[/quote]  哦，好像可以用SendMessage()吧，下消息EM_SETSEL

user: user-0
content: 引用 3 楼 孤星血泪 的回复:[quote=引用 2 楼 六道佩恩 的回复:] [quote=引用 1 楼 孤星血泪 的回复:] 可以，通过句柄 可以说说是哪个函数吗？我好去查。[/quote]  HWND hwnd = FindWindow() 获取记事本窗体句柄 RECT rect; GetWindowRect(hwnd,&rect);  获取窗口左上角坐标 SetCursorPos(rect.left+光标相对窗口X轴位置,rect.top+光标相对窗口Y轴位置)； 设置鼠标在记事本窗口里的位置[/quote] 老哥，你这个只是控制鼠标到达目标窗口的相对位置啊，不是光标啊，而且即便想实现鼠标点击更改光标，坐标方式也不一样啊，鼠标的坐标是像素，光标的坐标是字符

user: user-2
content: 引用 2 楼 六道佩恩 的回复:[quote=引用 1 楼 孤星血泪 的回复:] 可以，通过句柄 可以说说是哪个函数吗？我好去查。[/quote]  HWND hwnd = FindWindow() 获取记事本窗体句柄 RECT rect; GetWindowRect(hwnd,&rect);  获取窗口左上角坐标 SetCursorPos(rect.left+光标相对窗口X轴位置,rect.top+光标相对窗口Y轴位置)； 设置鼠标在记事本窗口里的位置
user-0 提问: 新人求助，头文件结构定义语法错误，找不到问题出在哪里。

回复:
user: user-0
content: 引用 1 楼 jsx_SEVEN 的回复:有没有这种可能：node结构体里面不能使用还没出现的别名Node  typedef struct node Node； typedef struct node { 	Item item; 	Node * left; 	Node * right; } Node;  试试，还不确定 你说对了，还未定义的结构体标识符不能用，要写成 struct node * left; 这样。谢谢。

user: user-0
content: 引用 1 楼 jsx_SEVEN 的回复:有没有这种可能：node结构体里面不能使用还没出现的别名Node  typedef struct node Node； typedef struct node { 	Item item; 	Node * left; 	Node * right; } Node;  试试，还不确定  嗯，确实这些Node. 被报错误c2061. 我看的范例也是这么写的，运行成功过。

user: user-1
content: 有没有这种可能：node结构体里面不能使用还没出现的别名Node  typedef struct node Node； typedef struct node { 	Item item; 	Node * left; 	Node * right; } Node;  试试，还不确定
user-0 提问: 输入某个奇数n，编写1+(1+3)+(1+3+5)+……（1＋3＋5＋……＋n）和的程序

回复:
user: user-1
content: 引用 5 楼 拥抱Linux 的回复:[quote=引用 3 楼 早打大打打核战争 的回复:] 算法、算法、算法...  #include <stdio.h>  int main() {   int n;   scanf("%u", &n);   if (n > 0 && n & 1)     printf("%d\n", (++n /= 2, n * (n + 1) * (n * 2 + 1) / 6));    return 0; }  其中关键的一句， 	printf("%d\n", (++n /= 2, n * (n + 1) * (n * 2 + 1) / 6));	 gcc和clang都报错了，「 ++n 不能作为 /= 的左值」，改成下面这样，即再添加一个逗号就可以了： 	printf("%d\n", (++n, n /= 2, n * (n + 1) * (n * 2 + 1) / 6));	[/quote]  作为C++编译就可以了，我忽略了楼主是发在C语言版，C的话可以写n = ++n / 2，实际上n = (n + 1) / 2也没多几个字符~~~

user: user-2
content: 希望能帮到你，欢迎及时确认、结帖、给分！  #include <stdio.h>  int main(int argc, char const *argv[]) { 	int num; 	if (scanf("%d", &num) != 1) { 		printf("Wrong input! \n"); 		return -1; 	} 	if (num <= 0 || num % 2 == 0) { 		printf("Wrong input! \n"); 		return -1; 	} 	int i = (num + 1) / 2; 	int sum = 0; 	while (i > 0) { 		for (int j = num; j > 0; j += -2) { 			sum += j; 		} 		i--; 		num += -2; 	} 	printf("%d\n", sum); 	return 0; }   Linux环境测试运行截图：

user: user-2
content: 引用 4 楼 qq_44897517 的回复:咋都不行涅 用vs2012  俺发在上面1楼的代码，不行么？ 能不能把你在vs2012里的编译、运行情况截图发上来看看呢？ 具体看看是什么原因。

user: user-2
content: 引用 3 楼 早打大打打核战争 的回复:算法、算法、算法...  #include <stdio.h>  int main() {   int n;   scanf("%u", &n);   if (n > 0 && n & 1)     printf("%d\n", (++n /= 2, n * (n + 1) * (n * 2 + 1) / 6));    return 0; }  其中关键的一句， 	printf("%d\n", (++n /= 2, n * (n + 1) * (n * 2 + 1) / 6));	 gcc和clang都报错了，「 ++n 不能作为 /= 的左值」，改成下面这样，即再添加一个逗号就可以了： 	printf("%d\n", (++n, n /= 2, n * (n + 1) * (n * 2 + 1) / 6));

user: user-0
content: 咋都不行涅 用vs2012

user: user-1
content: 算法、算法、算法...  #include <stdio.h>  int main() {   int n;   scanf("%u", &n);   if (n > 0 && n & 1)     printf("%d\n", (++n /= 2, n * (n + 1) * (n * 2 + 1) / 6));    return 0; }

user: user-3
content: int sum( int q ) {      if( q == 1 )            return 1;      else            return n + sum( n - 2 ); }  void main() {         int a;         scanf("请输入一个奇数:%d", &a );         if( a % 2 == 0 )               printf("您输入的不是奇数");         else               printf("和为:%d", sum( a )); }
user-0 提问: 各位社友，可以给我解答一下C语言数据结构的问题吗？例如，在顺序表中是否可以用插入的方法进行

回复:
user: user-0
content: 引用 6 楼 636f6c696e的回复:不能，你想这么干的目的是啥？ [quote=引用 5 楼 修宿休秀 的回复:] [quote=引用 4 楼 636f6c696e的回复:]你首先得表达清楚你的意思。 如果当前节点是表尾的下一个，也就是说查到表尾，需要做以下三个事情： 1. 申请内存 2. 将表尾的next指针指向它 3. 更新表尾为它 嗯，我是在一个链表里进行的插入操作。首先，我们称在某个位置插入时，此位置为当前位置。(此插入为在其后面插入)那么，我们能不能在表尾的下一个位置，也就是说，我们能否把表尾的下一个位置当成当前位置，并在此当前位置进行插入(即往其后插)。[/quote][/quote] 还有，你认为在一个顺序表里我能用插入来给表赋值吗？

user: user-0
content: 引用 6 楼 636f6c696e的回复:不能，你想这么干的目的是啥？ [quote=引用 5 楼 修宿休秀 的回复:] [quote=引用 4 楼 636f6c696e的回复:]你首先得表达清楚你的意思。 如果当前节点是表尾的下一个，也就是说查到表尾，需要做以下三个事情： 1. 申请内存 2. 将表尾的next指针指向它 3. 更新表尾为它 嗯，我是在一个链表里进行的插入操作。首先，我们称在某个位置插入时，此位置为当前位置。(此插入为在其后面插入)那么，我们能不能在表尾的下一个位置，也就是说，我们能否把表尾的下一个位置当成当前位置，并在此当前位置进行插入(即往其后插)。[/quote][/quote] 这是一个实训题目。。。，它的要求思想是这样的。我也有点懵逼。。。

user: user-1
content: 你首先得表达清楚你的意思。 如果当前节点是表尾的下一个，也就是说查到表尾，需要做以下三个事情： 1. 申请内存 2. 将表尾的next指针指向它 3. 更新表尾为它

user: user-0
content: 引用 1 楼 user-3的回复:链表里的内存不是连续的。随便插只要用上一个节点的next指向这块内存就行了 不不不，你没有懂我的意思。。。

user: user-1
content: 不能，你想这么干的目的是啥？ 引用 5 楼 修宿休秀 的回复:[quote=引用 4 楼 636f6c696e的回复:]你首先得表达清楚你的意思。 如果当前节点是表尾的下一个，也就是说查到表尾，需要做以下三个事情： 1. 申请内存 2. 将表尾的next指针指向它 3. 更新表尾为它 嗯，我是在一个链表里进行的插入操作。首先，我们称在某个位置插入时，此位置为当前位置。(此插入为在其后面插入)那么，我们能不能在表尾的下一个位置，也就是说，我们能否把表尾的下一个位置当成当前位置，并在此当前位置进行插入(即往其后插)。[/quote]

user: user-0
content: 引用 4 楼 636f6c696e的回复:你首先得表达清楚你的意思。 如果当前节点是表尾的下一个，也就是说查到表尾，需要做以下三个事情： 1. 申请内存 2. 将表尾的next指针指向它 3. 更新表尾为它 嗯，我是在一个链表里进行的插入操作。首先，我们称在某个位置插入时，此位置为当前位置。(此插入为在其后面插入)那么，我们能不能在表尾的下一个位置，也就是说，我们能否把表尾的下一个位置当成当前位置，并在此当前位置进行插入(即往其后插)。

user: user-2
content: 和小朋友站队插队一个道理 先检查空间是否足够，如果不够分配空间； 从队尾到插入位置的数据依次往后移动一个位置； 然后插入数据&更新长度等；

user: user-3
content: 链表里的内存不是连续的。随便插只要用上一个节点的next指向这块内存就行了
user-0 提问: 打印特殊字符

回复:
user: user-1
content: 仅供参考：windows下可以直接使用getch()，不需要自己写一个mygetch() #include <stdio.h> #include <curses.h> #include <string.h> #include <stdlib.h> #include <termios.h> #include <unistd.h>  int mygetch( ) {     struct termios oldt, newt;     int ch;     tcgetattr( STDIN_FILENO, &oldt );     newt = oldt;     newt.c_lflag &= ~( ICANON | ECHO );     tcsetattr( STDIN_FILENO, TCSANOW, &newt );     ch = getchar();     tcsetattr( STDIN_FILENO, TCSANOW, &oldt );     return ch; }  #define MAX_LEN 	10  void print_screen(int pos) { 	char output[MAX_LEN + 2] = {0}; 	int i; 	 	printf("\r"); 	for (i = 0; i < MAX_LEN + 1; i++) 	{         if (i == pos)	             output[i] = 'O'; 		else	 			output[i] = ' '; 	} 	printf("%s", output); }  int main() {     int pos = MAX_LEN / 2; 	char c = 0; 	int i; 	     printf("use space and enter to control the ball, 'q' to exit.\n"); 	printf("     O     ");     while(c != 'q')     {           if (c == ' ')         {                  pos = (pos + 1 > MAX_LEN) ? MAX_LEN : pos + 1;                   }      		if (c == '\n')         {                  pos = (pos - 1 < 0) ? 0 : pos - 1;                   }                		print_screen(pos);                  c = mygetch();     }      return 0; }
user-0 提问: C语言，筛选法求素数出现Run-Time Check Failure #2 - Stack around the variable 'a' was corrup

回复:
user: user-1
content: 数组访问越界了，如图示：  另外，中间过程的一些语句可以省略，因为执行和不执行的效果都是一样的，比如 a[j+1] = a[j+1]; 还有 else continue; 调整后的代码如下：  // 筛选法求素数  #include <stdio.h>  int main(int argc, char const *argv[]) { 	int a[101]; 	int i, j; 	a[0] = 1; 	for (i = 1; i < 101; i++) { 		a[i] = i; 	} 	for (i = 1; i < 101; i++) { 		if (a[i] != 1) { 			for (j = i; j < 100; j++) { 				if (a[j + 1] % a[i] == 0) { 					a[j + 1] = 1; 				} 			} 		} 	} 	for (i = 0; i < 101; i++) { 		if (a[i] != 1) { 			printf("%d ", a[i]); 		} 	} 	return 0; }  希望能帮到你，欢迎及时确认、结帖、给分！：）

user: user-2
content: 越界了，j+1为101就报错了
user-0 提问: 问题：为啥是这样的？是没有存到吗？还是检验密码哪里出错了？还是？root函数那里出问题了？

回复:
user: user-1
content: 你所说的输出问题在于： wi_come函数里面的switch-case没有加break，导致'y'的分支结束后继续走到了'n'的分支

user: user-1
content: fp没有看到fopen初始化啊
user-0 提问: 问一下下面这个scanf在输入回车之后printf是如何循环输出的

回复:
user: user-0
content: 引用 13 楼 拥抱Linux的回复:前段时间好像见过一模一样的帖子呢？ 恍惚有点儿印象。当然，也有可能是俺记错了，希望题主不是来寻大家开心的哈！  如有得罪，请多多包涵！  回到正题，针对题目有如下图片所示的回答，    希望能解开你的疑惑。 明白了谢谢，知道怎么回事了

user: user-0
content: 引用 3 楼 qq_38834405的回复:缓冲区你输入一个字符串 回车后一个字符一个字符的接受，同时输出字符往后4个ASCII码的字符。直到缓冲区里面碰到回车字符就跳出循环 是在缓冲区里就已经执行向后走4个字符的操作了是吗

user: user-1
content: scanf建议拷贝一句放到while之前，因为a是一个随机值。要么把a附一个初始值。

user: user-2
content: 缓冲区你输入一个字符串 回车后一个字符一个字符的接受，同时输出字符往后4个ASCII码的字符。直到缓冲区里面碰到回车字符就跳出循环

user: user-0
content: 引用 1 楼 AlbertS的回复:这不是你自己写的循环吗？输入不是`\n`就将字符输出啊 scanf循环是自左往右依次循环执行printf里面的语句吗

user: user-3
content: 这不是你自己写的循环吗？输入不是`\n`就将字符输出啊

user: user-2
content: 引用 10 楼 哎咿呀妈耶的回复:[quote=引用 6 楼 qq_38834405的回复:][quote=引用 5 楼 哎咿呀妈耶的回复:][quote=引用 3 楼 qq_38834405的回复:]缓冲区你输入一个字符串 回车后一个字符一个字符的接受，同时输出字符往后4个ASCII码的字符。直到缓冲区里面碰到回车字符就跳出循环 是在缓冲区里就已经执行向后走4个字符的操作了是吗[/quote] 不是，是一个一个来的。你就当成一个字符输入了会有一个字符输出这个过程。只不过你提前一次性输入到缓冲区了，由缓冲区一个一个来输入。然后你要输出的是a+4，那就对应ASCII码+4再输出[/quote] 就是进入一个出去一个然后若一次性进入多个则一个一个输出是吗[/quote] 对的。因为运行速度太快了，是同时显示出来的

user: user-4
content: 前段时间好像见过一模一样的帖子呢？ 恍惚有点儿印象。当然，也有可能是俺记错了，希望题主不是来寻大家开心的哈！  如有得罪，请多多包涵！  回到正题，针对题目有如下图片所示的回答，    希望能解开你的疑惑。

user: user-5
content: #include <stdio.h> int main() {   char a;   while(1){ scanf("%c",&a); if (a == '\n')    break; printf("%c",a+4); }  }

user: user-5
content: 多说无意，自己动手试试就知道了 引用 10 楼 哎咿呀妈耶 的回复:[quote=引用 6 楼 qq_38834405的回复:][quote=引用 5 楼 哎咿呀妈耶的回复:][quote=引用 3 楼 qq_38834405的回复:]缓冲区你输入一个字符串 回车后一个字符一个字符的接受，同时输出字符往后4个ASCII码的字符。直到缓冲区里面碰到回车字符就跳出循环 是在缓冲区里就已经执行向后走4个字符的操作了是吗[/quote] 不是，是一个一个来的。你就当成一个字符输入了会有一个字符输出这个过程。只不过你提前一次性输入到缓冲区了，由缓冲区一个一个来输入。然后你要输出的是a+4，那就对应ASCII码+4再输出[/quote] 就是进入一个出去一个然后若一次性进入多个则一个一个输出是吗[/quote]

user: user-0
content: 引用 6 楼 qq_38834405的回复:[quote=引用 5 楼 哎咿呀妈耶的回复:][quote=引用 3 楼 qq_38834405的回复:]缓冲区你输入一个字符串 回车后一个字符一个字符的接受，同时输出字符往后4个ASCII码的字符。直到缓冲区里面碰到回车字符就跳出循环 是在缓冲区里就已经执行向后走4个字符的操作了是吗[/quote] 不是，是一个一个来的。你就当成一个字符输入了会有一个字符输出这个过程。只不过你提前一次性输入到缓冲区了，由缓冲区一个一个来输入。然后你要输出的是a+4，那就对应ASCII码+4再输出[/quote] 就是进入一个出去一个然后若一次性进入多个则一个一个输出是吗

user: user-0
content: 就是进入一个出去一个然后若一次性进入多个则一个一个输出是吗

user: user-6
content: 你这while循环根本就进不去的，a你都没有初始化

user: user-3
content: 引用 2 楼 哎咿呀妈耶 的回复:[quote=引用 1 楼 AlbertS的回复:]这不是你自己写的循环吗？输入不是`\n`就将字符输出啊 scanf循环是自左往右依次循环执行printf里面的语句吗[/quote] 那些字符被放在缓冲区中一个个读入，是循环读取循环输出的

user: user-2
content: 引用 5 楼 哎咿呀妈耶的回复:[quote=引用 3 楼 qq_38834405的回复:]缓冲区你输入一个字符串 回车后一个字符一个字符的接受，同时输出字符往后4个ASCII码的字符。直到缓冲区里面碰到回车字符就跳出循环 是在缓冲区里就已经执行向后走4个字符的操作了是吗[/quote] 不是，是一个一个来的。你就当成一个字符输入了会有一个字符输出这个过程。只不过你提前一次性输入到缓冲区了，由缓冲区一个一个来输入。然后你要输出的是a+4，那就对应ASCII码+4再输出
user-0 提问: 求

回复:
user: user-0
content: 引用 2 楼 qq_38834405的回复:由大写转小写的字符，相同字符的数量 谢谢，谢谢，我已经明白了

user: user-0
content: 引用 1 楼 椿湫の殇的回复:用来统计相应的小写字母 出现的次数！ 谢谢，今天早上我突然想明白了

user: user-1
content: 由大写转小写的字符，相同字符的数量

user: user-2
content: 用来统计相应的小写字母 出现的次数！
user-0 提问: 怎么求

回复:
user: user-0
content: 我也是这个，但输入其他字符不变怎么理解

user: user-1
content: ①c1<='9' ②'0' ③c2=c1   int main() { 	char c1, c2; 	c1 = getchar(); 	if (c1 >= '0' && c1 <= '9') 		c2 = '9' - (c1 - '0'); 	else 		c2 = c1; 	printf("c1=%c,c2=%c\n", c1, c2); 	  	 }

user: user-2
content: 是在你的图片上的代码改吗？
user-0 提问: 零基础学习C语言，应该从哪里开始？

回复:
user: user-1
content: 顺序大致就是这样：  基础： C语言入门（建议买老外经典的书） 数据结构（严蔚敏那本还可以，不过编程习惯也很差的，所以也是建议买老外） 算法  进阶：（看不懂，或者理解不了，可以快速跳过，后面做了项目再回头看） 《C程序设计语言》《C和指针》《C专家编程》《C陷阱与缺陷》  方向选择： 单片机也叫嵌入式，这个需要了解硬件，所以还得学习电路知识 Linux编程，也要了解硬件，不过如果选应用方向就不需要了解硬件了。

user: user-1
content: 你看下计算机他们开的课程，就可以自学了，计算机是工科，一切都是实践出来的。 建议报个培训班入下门再自学比较稳妥，大致也要1万多这样。 不太建议自己去摸索，因为这种是实践很强的科目，你自己摸索需要花的时间太多了。  数据结构、算法、随便一本C语言入门，然后就是C的四书五经了（百度一下）  语言学完了还要选方向： 嵌入式的要学单片机， Linux的要学Linux操作系统编程， 还需要熟练使用IDE，比如VS，SourceInsight，Eclipse等等。  学习编程没有什么捷径，就是不断看书，敲代码，做项目，阅读源码。  楼主如果是真心喜欢倒还好，如果仅仅是为了待遇高来学，不太建议，说实话这个行业技术更新很快，你要不断学习才能不被淘汰。

user: user-2
content: 提供个基础教程，仅供参考，有讲解，有递进C语言 最后希望你学有所成

user: user-3
content: 我也是土木的学了2年毕业还是下工地去了。如果你不报班不转专业，面试的机会都很少

user: user-4
content: 零基础推荐你从Essential C++开始看，在结合任意一本讲面向对象程序设计思维的书一起阅读，可以帮你更快入门并夯实基础
user-0 提问: 求大佬用c帮忙解决这个问题

回复:
user: user-1
content: C++里如果要用到C里面的头文件，可以在前面加个c，不写后面的.h。。 这两个写成include <stdio.h>  include <string.h>

user: user-0
content: 引用 1 楼 jsx_SEVEN的回复: #include "cstdio" #include "cstring"  int main() { 	unsigned i = 0; 	int result=0; 	char num[100]; 	scanf("%s", num);  	for (i = 0; i < strlen(num); i++) 	{ 		result += num[i]-48;  //不减去48的话就成了数字对应的ASCII码了 	} 	printf("%d", result); }  那个头文件是什么意思我是一个大一学生现在知道就是个include“stdio.h”👀

user: user-2
content: 引用 2 楼 椿湫の殇 的回复:简单的说一下吧 int num=0； int sum=0； scanf（“%d，&num）； while（num/10！=0） ｛sum+=num%10； num=num/10； ｝ printf（“%d”，sum）；  少加了最高位的数。

user: user-3
content: 简单的说一下吧 int num=0； int sum=0； scanf（“%d，&num）； while（num/10！=0） ｛sum+=num%10； num=num/10； ｝ printf（“%d”，sum）；

user: user-1
content: #include "cstdio" #include "cstring"  int main() { 	unsigned i = 0; 	int result=0; 	char num[100]; 	scanf("%s", num);  	for (i = 0; i < strlen(num); i++) 	{ 		result += num[i]-48;  //不减去48的话就成了数字对应的ASCII码了 	} 	printf("%d", result); }
user-0 提问: 新人求个解答

回复:
user: user-0
content: 引用 7 楼 靜止の世界的回复:程序开始，进入第一阶段，要求输入一个数字n，这个n代表你就下来要输入几个数字，假如你输了9，那么接下来你必须输入9个数字，这9个数字代表相对应的数组编号，假如输入了11，12，13，111，112，113，1111，1112，113，那么对于的arr[11]=1,arr[12]=1,以此类推，9个数字中，113出现了两次，那么对于的arr[113]=2。 接下来进入第二阶段，程序要求你输入一个数字k，这个k代表数组下标由大到小排序的第k个数组元素，上面我们输入了9个数字，就有9个数组元素，排序是arr[1112]=1,    arr[1111]=1,     arr[113]=2,    arr[112]=1,    arr[111]=1,    arr[13]=1,    arr[12]=1,    arr[11]=1,一共8个数组元素，假如你输入的k为4，那么最后输出112，1，112代表数组元素下标，1代表arr[112]。以此类推，假如输入k的值为3，那么电脑输出的就是113，2。程序到此就结束了。 最后说一下代码int place=0;  int i=MAX-1;  的位置，它们应该被放在代码int arr[MAX]=0;的后面。。 手写这么多，麻烦了(๑˃̵ᴗ˂̵)و

user: user-1
content: 说漏了一点，假如输入的k值大于8，那么输出的一定是0，0，第一个0代表数组元素下标编号，第二0代表元素arr[0],出现这样的结果从侧面反映了输入的k值大于变动过的数组元素，像本例子中我们变动的元素是八个，所以k不能超出8。

user: user-1
content: 程序开始，进入第一阶段，要求输入一个数字n，这个n代表你就下来要输入几个数字，假如你输了9，那么接下来你必须输入9个数字，这9个数字代表相对应的数组编号，假如输入了11，12，13，111，112，113，1111，1112，113，那么对于的arr[11]=1,arr[12]=1,以此类推，9个数字中，113出现了两次，那么对于的arr[113]=2。 接下来进入第二阶段，程序要求你输入一个数字k，这个k代表数组下标由大到小排序的第k个数组元素，上面我们输入了9个数字，就有9个数组元素，排序是arr[1112]=1,    arr[1111]=1,     arr[113]=2,    arr[112]=1,    arr[111]=1,    arr[13]=1,    arr[12]=1,    arr[11]=1,一共8个数组元素，假如你输入的k为4，那么最后输出112，1，112代表数组元素下标，1代表arr[112]。以此类推，假如输入k的值为3，那么电脑输出的就是113，2。程序到此就结束了。 最后说一下代码int place=0;  int i=MAX-1;  的位置，它们应该被放在代码int arr[MAX]=0;的后面。。

user: user-0
content: 引用 5 楼 636f6c696e的回复:相当于数据范围是0-100000，他建立了个数组统计0-100000每个数字出现多少次。 如果arr[x]为0，说明输入的数字中没有出现，反之则至少出现了1次。 [quote=引用 3 楼 kiroto 的回复:] [quote=引用 1 楼 636f6c696e的回复:]输入n个数字，输出其中第k大的数字 有点看不懂arr[x]++[/quote][/quote] 谢谢大佬，现在已经学了

user: user-2
content: 输入n个数字，输出其中第k大的数字

user: user-2
content: 相当于数据范围是0-100000，他建立了个数组统计0-100000每个数字出现多少次。 如果arr[x]为0，说明输入的数字中没有出现，反之则至少出现了1次。 引用 3 楼 kiroto 的回复:[quote=引用 1 楼 636f6c696e的回复:]输入n个数字，输出其中第k大的数字 有点看不懂arr[x]++[/quote]

user: user-3
content: arr[x]++，这个输入的x是arr的下表，即下表为x的值自增1。

user: user-0
content: 引用 1 楼 636f6c696e的回复:输入n个数字，输出其中第k大的数字 有点看不懂arr[x]++

user: user-4
content: 这个是用来发射宇宙飞船的……
user-0 提问: 求代

回复:
user: user-1
content: 哦输出应该是"%d\n"，上面少了个换行符

user: user-1
content: #include<stdio.h>  int main(){         int a,b;         while(scanf("%d%d",&a,&b)!=EOF)         {                 int c=a>b?a:b;                 printf("%d",c);         }         return 0; }

user: user-2
content: 哪里不会？？
user-0 提问: 求回答，谢谢

回复:
user: user-1
content: 引用 楼主 weixin_44837085的回复:现有程序 void pr( ) ｛ scanf(“% c"，&ch) ; if (ch!='#') pr(); printf("%c" ,ch) ; ｝ 写出输入为abc#时，调用pr函数的输出结果。 Lz有写这个程序吗？

user: user-2
content: 简单的递归输入，答案是cba

user: user-3
content: 每次输入一个不为#的字符，都会调用函数pr,当输入#时，先输出#，然后输出cba

user: user-4
content: 建议自己写个小程序测试一下～

user: user-5
content: 自己写个小程序测试调试下多好， 即获得的预期结果也提高了水平
user-0 提问: 编程

回复:
user: user-1
content: 月亮警察拯救你！   #include <stdio.h> #include<stdlib.h>  typedef struct student {     char name[21];     int sex;     char birthday[9];     float height;     int c;     int calculus; } student,*pstudent;  int main() {     int n,c_avg,c_max,c_min,ca_avg,ca_min,ca_max;     pstudent stu;     scanf("%d",&n);     stu=(pstudent)malloc(sizeof(student)*n);     for(int i=0; i<n; i++) //读入信息     {         scanf("%s%d%s%f%d%d",stu[i].name,               &stu[i].sex,stu[i].birthday,               &stu[i].height,&stu[i].c,               &stu[i].calculus);     } //计算并输出C语言信息     c_avg=0,c_max=0,c_min=stu[0].c;     for(int i=0; i<n; i++)     {         c_avg+=stu[i].c;         if(stu[i].c>c_max)             c_max=stu[i].c;         if(stu[i].c<c_min)             c_min=stu[i].c;     }     c_avg/=n;     printf("C_average:%d\nC_max:%d\n",c_avg,c_max);     for(int i=0; i<n; i++)     {         if(stu[i].c==c_max)             printf("%s %d %s %.2f %d %d\n",stu[i].name,                    stu[i].sex,stu[i].birthday,                    stu[i].height,stu[i].c,stu[i].calculus);     }     printf("C_min:%d\n",c_min); //计算并输出微积分信息     ca_avg=0,ca_max=0,ca_min=stu[0].calculus;     for(int i=0; i<n; i++)     {         ca_avg+=stu[i].calculus;         if(stu[i].calculus>ca_max)             ca_max=stu[i].calculus;         if(stu[i].calculus<ca_min)             ca_min=stu[i].calculus;     }     ca_avg/=n;     printf("Calculus_average:%d\nCalculus_max:%d\n",ca_avg,ca_max);     for(int i=0; i<n; i++)     {         if(stu[i].calculus==ca_max)             printf("%s %d %s %.2f %d %d\n",stu[i].name,                    stu[i].sex,stu[i].birthday,                    stu[i].height,stu[i].c,stu[i].calculus);     }     printf("Calculus_min:%d",ca_min);      free(stu);     return 0; }

user: user-1
content: 引用 1 楼 阿杰鲁   ！ 的回复:帮帮可怜的孩子吧  我来拯救你~~化身成正义~Oh oh la la la la la

user: user-0
content: 什么意思啊，结贴率?

user: user-2
content: 0结帖率伸手党无视

user: user-0
content: 帮帮可怜的孩子吧
user-0 提问: c语言线性表创建

回复:
user: user-1
content: 如果name是一个数组，那么改成这样试试： scanf_s("%s", s[i].name, sizeof(s[i].name)); 如果name是一个指针，那需要给其分配空间在执行这句。 scanf_s("%s", s[i].name, xx/*申请的空间大小*/);
user-0 提问: VS2017错误提示/第16行！

回复:
user: user-0
content: 引用 1 楼 qq_38834405 的回复：scanf_s的用法错了，差一个大小参数。scanf_s("%s", name,40)运行还是不对……

user: user-0
content: 引用 1 楼 qq_38834405 的回复：scanf_s的用法错了，差一个大小参数。scanf_s("%s", name,40)问题找出来了scanf_s（”%d”,weight);

user: user-0
content: 引用 1 楼 qq_38834405 的回复：scanf_s的用法错了，差一个大小参数。scanf_s("%s", name,40)错误🙅‍♂️

user: user-1
content: scanf_s的用法错了，差一个大小参数。scanf_s("%s", name,40)

user: user-2
content: 建议：添加stdlib.h；把scanf_s换成scanf；float weight初始化为0.0；将scanf_s(“%d”,weight)修改为scanf(“%f”,&weight)
user-0 提问: 求助啊啊大佬           只要输出 ）] 这两个括号右边结果一定是匹配失败

回复:
user: user-0
content: 谢谢大哥  非常感谢

user: user-1
content: 给你调试过了，改如下地方：  1：原先是 ） if(!StackEmpty(le)&&'('==GetHead(le).aa) { //可以避免->造成错误  2： 原先是 ] if(!StackEmpty(le)&&'['==GetHead(le).aa) {  3：原先是！原先是 if(StackEmpty(le) && flag)
user-0 提问: 大佬们，，救救渣渣，弄了半天了，错错错，晕了。。。。。。。。。。

回复:
user: user-0
content: 引用 3 楼 coo135的回复:抄的抄的，一定是抄的~~~  把typedef struct all 这句的typedef去掉就可以了，楼主。至于为什么要这样，你自己研究一下~~~ 原来也没有啊，后来百度了一下，发现有一些这么写，也是错啊，我是说在vc 运行

user: user-0
content: 引用 2 楼 zgl7903的回复:粗看 堆栈空间会不够吧？ 没考虑那么多，不过不是这个错

user: user-0
content: 引用 4 楼 自信男孩的回复:struct good_info {     //销售单号、商品编号、商品名称、单价、销售数量、销售时间、销售员     string danhao[10000];     int bianhao[10000];     string name[10000];     int money[10000];     int mun[10000];     string time[1000];     string people[1000];     int munber;     int yesorno[1000];     int sum[1000000]; }good; 数据结构写成这样，说明是粗线条的设计。要想更细的设计数据结构，建议了解一下内存，程序加载和运行。 我知道啊，但是vc6.0运行不了啊，学校要用vc

user: user-1
content: struct good_info {     //销售单号、商品编号、商品名称、单价、销售数量、销售时间、销售员     string danhao[10000];     int bianhao[10000];     string name[10000];     int money[10000];     int mun[10000];     string time[1000];     string people[1000];     int munber;     int yesorno[1000];     int sum[1000000]; }good; 数据结构写成这样，说明是粗线条的设计。要想更细的设计数据结构，建议了解一下内存，程序加载和运行。

user: user-2
content: 抄的抄的，一定是抄的~~~  把typedef struct all 这句的typedef去掉就可以了，楼主。至于为什么要这样，你自己研究一下~~~

user: user-3
content: 粗看 堆栈空间会不够吧？

user: user-4
content: 报什么错？看你这描述这代码应该不是你自己写的

user: user-2
content: 去掉typedef之后的程序能编译的，也没啥问题。如果你不能编译，那贴一下错误信息~~  除了写的不那么讲究，好像也没啥问题~~
user-0 提问: VS2017报告的错误

回复:
user: user-1
content: 引用 2 楼 李尚天 的回复:引用 1 楼 qq_38834405 的回复：代码贴完。没加头文件?不是头文件问题你代码贴完就解决了，字数不够就随便问了一句

user: user-0
content: 引用 3 楼 focuslight 的回复：异常时进调用堆栈， 定位问题函数， 挨个检查函数参数麻烦说下详细操作步骤，菜鸟一枚，不知道步骤

user: user-2
content: 异常时进调用堆栈， 定位问题函数， 挨个检查函数参数

user: user-0
content: 引用 1 楼 qq_38834405 的回复：代码贴完。没加头文件?不是头文件问题

user: user-1
content: 代码贴完。没加头文件?
user-0 提问: C#小白编程遇到了问题，希望大神指点一下

回复:
user: user-1
content: 就你这代码而言，中间的二维数组变量都没用到，根本不会影响。 还有啥叫运行不起？编译错误？运行结果不符合预期？程序直接挂了？

user: user-0
content: 引用 1 楼 user-1的回复:就你这代码而言，中间的二维数组变量都没用到，根本不会影响。 还有啥叫运行不起？编译错误？运行结果不符合预期？程序直接挂了？ 谢谢大佬回复，首先没用到的二维数组是后面程序要用，没有打出来，这里定义不知哪里出问题了，注释掉那部分就能运行出成果，没注释，就会在运行中直接停止工作，目前找到的办法就是从专门定义数组的调用函数调用就不会出错
user-0 提问: 用c#怎么求函数y=x-sinx-1的零点（保留到小数点后16位）

回复:
user: user-1
content: 等效求 x 满足 sinx = x - 1, 这 sinx 取正负1，x在范围  0~2 搜搜即可   #include <cstdio> #include <cmath> inline double y(const double x) { 	return x - sin(x) - 1; } int main(int /*argc*/, char ** /*argv*/) { 	double begin = 0, end = 2; 	while (end - begin > 1e-16) 	{ 		const double mid = (begin + end)/2; 		const double y_left = y(begin); 		const double y_right = y(end); 		const double y_mid = y(mid); 		//之所以不用 y1*y2<0是怕太小了的时候出现精度陷阱。 		if ((y_left>0 && y_mid < 0 )|| (y_left<0 && y_mid > 0)) 			end = mid; 		else if ((y_right>0 && y_mid < 0) || (y_right<0 && y_mid > 0)) 			begin = mid; 		else 			break;			 	} 	const double result = (begin + end)/2; 	printf("y(%.16lf) = %.16lf\n",result,y(result)); 	return 0; }     y(1.9345632107520243) = 0.0000000000000000
user-0 提问: 关于使用sizeof和不使用sizeof

回复:
user: user-1
content: 这段代码作用是什么呢？只要调用这个宏，结果就会存在吧，编译的时候后就确定了的，使用不使用sizeof只是改变了宏的含义，结构不会被优化掉吧，期待大神回答

user: user-2
content: 1、这个宏的作用5楼已经讲解清楚 2、c++只是部分兼容c，在c得到的结果在c++不一致很正常，具体原因可能和编译器有关 3、如果不使用sizeof，确实会声明一个匿名结构体

user: user-3
content: 不只是声明哦，你要考虑具体调用这个宏的地方，都会创建一个真实的结构体，占用栈空间。

user: user-1
content: 引用 9 楼 qq_40162781 的回复:[quote=引用 8 楼 AlbertS 的回复:] [quote=引用 6 楼 lin5161678 的回复:] 先别管  [quote=引用 4 楼 AlbertS 的回复:] 这是什么语法呢？我都编译不过去 BUILD_BUG_ON_ZERO(0) 可以编译  不是0 就不能编译 [/quote] 是0没有编译成功，提示“不允许使用类型定义”[/quote] 对哦，，c语言可以c++不行。。。。。有大神知道什么原因吗[/quote] 测了一下，确实是这样，C语言可以编译通过，C++不行，另外对于位域内变量为0的情况，C++使用sizeof得到的值是1，而C语言是0，等待大神解惑

user: user-0
content: 引用 8 楼 AlbertS 的回复:[quote=引用 6 楼 lin5161678 的回复:] 先别管  [quote=引用 4 楼 AlbertS 的回复:] 这是什么语法呢？我都编译不过去 BUILD_BUG_ON_ZERO(0) 可以编译  不是0 就不能编译 [/quote] 是0没有编译成功，提示“不允许使用类型定义”[/quote] 对哦，，c语言可以c++不行。。。。。有大神知道什么原因吗

user: user-1
content: 引用 6 楼 lin5161678 的回复:先别管  [quote=引用 4 楼 AlbertS 的回复:] 这是什么语法呢？我都编译不过去 BUILD_BUG_ON_ZERO(0) 可以编译  不是0 就不能编译 [/quote] 是0没有编译成功，提示“不允许使用类型定义”

user: user-1
content: 引用 5 楼 636f6c696e 的回复:这个是内核的一种写法，主要用于编译期间就发现这些潜在的致命错误。 !!(e)表示两次取反e，e非0结果为1，e为0结果为0。 struct{int:xx}是一个匿名结构体，冒号表示位域，如果e非0等价于struct{int:-1}，位域不为负数，非法，编译报错。 用sizeof主要是隐藏匿名结构体的声明，且不会在运行过程中产生额外的内存损耗。 你说的这些细节我可以理解，但是我确实编译不过去，BUILD_BUG_ON_ZERO这个宏定义米问题，但是BUILD_BUG_ON_ZERO(0) 编译错误，测试环境VS2015

user: user-4
content: 先别管  引用 4 楼 AlbertS 的回复:这是什么语法呢？我都编译不过去 BUILD_BUG_ON_ZERO(0) 可以编译  不是0 就不能编译

user: user-3
content: 这个是内核的一种写法，主要用于编译期间就发现这些潜在的致命错误。 !!(e)表示两次取反e，e非0结果为1，e为0结果为0。 struct{int:xx}是一个匿名结构体，冒号表示位域，如果e非0等价于struct{int:-1}，位域不为负数，非法，编译报错。 用sizeof主要是隐藏匿名结构体的声明，且不会在运行过程中产生额外的内存损耗。

user: user-1
content: 这是什么语法呢？我都编译不过去

user: user-5
content: sizeof() 是运算符，不是函数~~不会产生匿名结构~  当e不为0时，编译出错，e为0时，sizeof(struct { int:-!!(e); } ; sizeof计算结果为0，整句就被替换成 0; 然后编译器就把它忽略了。
user-0 提问: 求助

回复:
user: user-1
content: 双全难敌四手

user: user-2
content: 同求试用C语言编写8086CPU的IO端口操作函数，函数声明如下：  //功能描述：从id端口读取一个字节  //输入参数：id - 端口号（端口地址），16位无符号数  //返回值：返回读取到的内容（一个字节，8位无符号数）  u8  IOR( u16 id );        //功能描述：向id端口写一个字节value  //输入参数：id - 端口号（端口地址），16位无符号数； value - 写入的内容，8位无符号数  //返回值：无  void IOW( u16  id,   u8  value);
user-0 提问: 萌新求教：请问大神如何简化if嵌套，感谢！

回复:
user: user-0
content: 如果大神觉得看着麻烦，您可以粘贴到您的c语言编程软件上看，麻烦您了，万分感谢！

user: user-0
content: 引用 2 楼 qq_38834405的回复:#include<stdio.h>  int  prt(); char jud(int ret);  int main() { 	char w; 	int ret; 	ret = prt(); 	w = jud(ret); 	printf("转换结果：%c\n", w); 	 	return 0; }  //输入1或2 int  prt() { 	int choice; 	printf("选择1“大写转化为小写”\t选择2“小写转化为大写”"); 	printf("您的选择是："); 	scanf_s("%d", &choice); 	while (choice < 1 || choice > 2) { 		printf("输入错误。重新输入："); 		scanf("%d", &choice); 	} 	return choice; } //判断是否正确并给出相应的提示 char jud(int ret) { 	char w, temp_w; 	printf("请输入您要转换的字母："); 	getchar(); 	while (1) { 		scanf("%c", &w); 		if (getchar() != '\n') { 			printf("您输入字母个数不正确，请重新输入\n"); 			while (getchar() != '\n'); //清空缓冲区 			continue; 		} 		 		if (ret == 1) { 			if (w<'A' || w>'Z') { 				printf("您输入的字母超出范围，请重新输入\n"); 				continue; 			}  			w = w + 32; 			break; 		} 		else { 			if (w<'a' || w>'z') { 				printf("您输入的字母超出范围，请重新输入\n"); 				continue; 			} 			w = w - 32; 			break; 		} 	}  	return w; } 谢谢您的指导！感谢！

user: user-1
content: #include<stdio.h>  int  prt(); char jud(int ret);  int main() { 	char w; 	int ret; 	ret = prt(); 	w = jud(ret); 	printf("转换结果：%c\n", w); 	 	return 0; }  //输入1或2 int  prt() { 	int choice; 	printf("选择1“大写转化为小写”\t选择2“小写转化为大写”"); 	printf("您的选择是："); 	scanf_s("%d", &choice); 	while (choice < 1 || choice > 2) { 		printf("输入错误。重新输入："); 		scanf("%d", &choice); 	} 	return choice; } //判断是否正确并给出相应的提示 char jud(int ret) { 	char w, temp_w; 	printf("请输入您要转换的字母："); 	getchar(); 	while (1) { 		scanf("%c", &w); 		if (getchar() != '\n') { 			printf("您输入字母个数不正确，请重新输入\n"); 			while (getchar() != '\n'); //清空缓冲区 			continue; 		} 		 		if (ret == 1) { 			if (w<'A' || w>'Z') { 				printf("您输入的字母超出范围，请重新输入\n"); 				continue; 			}  			w = w + 32; 			break; 		} 		else { 			if (w<'a' || w>'z') { 				printf("您输入的字母超出范围，请重新输入\n"); 				continue; 			} 			w = w - 32; 			break; 		} 	}  	return w; }
user-0 提问: 关于C语言中printf打印多个字符串问题

回复:
user: user-1
content: 引用 4 楼 CC_YZ的回复:[quote=引用 3 楼 qq_38834405 的回复:] 我没用过这个inet_ntoa函数，查了一下：返回点分十进制的字符串在静态内存中的指针。应该就是这个问题  开始我也这么怀疑，但是单独打印出来又不一样了，这是怎么回事呢？好懵啊[/quote] 因为是同一个指针。。

user: user-2
content: 这个函数必须单独使用 因为他是使用了一段静态内存作为字符串缓存 你调用多次也是使用同一段内存 这样printf输出的3个参数字符串其实是同一位置 按照函数参数计算顺序,是从右到左 这个字符串最后一次写入是local,所以显示了3次这个的值

user: user-0
content: 引用 3 楼 qq_38834405 的回复:我没用过这个inet_ntoa函数，查了一下：返回点分十进制的字符串在静态内存中的指针。应该就是这个问题  开始我也这么怀疑，但是单独打印出来又不一样了，这是怎么回事呢？好懵啊

user: user-1
content: 我没用过这个inet_ntoa函数，查了一下：返回点分十进制的字符串在静态内存中的指针。应该就是这个问题

user: user-0
content: 求助大佬！！！

user: user-0
content: 分开打印就没有问题，一起打印就出事了，好奇怪，为什么？

user: user-0
content: 实验调整打印顺序，证实五楼结论。结贴

user: user-0
content: 引用 5 楼 user-2 的回复：这个函数必须单独使用 因为他是使用了一段静态内存作为字符串缓存 你调用多次也是使用同一段内存 这样printf输出的3个参数字符串其实是同一位置 按照函数参数计算顺序,是从右到左 这个字符串最后一次写入是local,所以显示了3次这个的值我觉得你说得对，结题
user-0 提问: 跪求赵4老师（赵中老师）在三年前出的系列公开课完整课程(10集)

回复:
user: user-0
content: 系列课程安排：  1 代码要素  2 函数  3 数组和二维数组  了解指针与数组对应的汇编内存地址。  通过一维数组实例了解指针与数组对应的汇编内存地址。  通过二维数组实例了解指针与数组对应的汇编内存地址。  4 三维数组  5 带头节点的单链表  6 无头节点的单链表  7 双向链表  8 循环双向链表  9 十字链表(上)  10 十字链表(下)
user-0 提问: 大佬们帮我看看这个求方程的根的程序哪里出错？？

回复:
user: user-1
content: 怀疑你的数据输入有问题， 没加 ,    就是这里  scanf_s("%d,%d,%d", &a, &b, &c);   另外最好用scanf

user: user-2
content: #include <math.h>  //解算一元二次方程的根 //a*x^2 + b*x + c = 0 //输入 a,b,c 一元二次方程的系数 //px1, px2 返回根 //返回值，根的个数 （<=0无解 1一个根 2两个根 >2无数个根) int GetSquareRoot(const double a, const double b, const double c,                   double *px1, double *px2) {   int iRoots = 0;   double ft = b*b - 4*a*c; //b²-4ac   double x1=0, x2=0;      if(a==0) //一次方程   {     if(b==0) //b也等于0     {       if(c == 0) //c也等于0       {         printf("x可以是任意值\n");         iRoots = 3;       }       else       {         printf("Error(%lf == 0) ?????\n", c);         iRoots = -1;       }     }     else     {       x1 = -c/b;       printf("x=%lf\n", x1);       iRoots = 1;     }   }   else //二次方程   {     //x = (-b±sqrt(b^2 - 4ac))/2a     if(ft<0)     {       printf("Error(b^2-4ac) = %lf <0\n", ft);     }     else if(ft == 0)     {       x1 = (-b)/(2*a);       printf("x=%lf\n", x1);       iRoots = 1;     }     else     {       x1 = (-b + sqrt(ft))/(2*a);       x2 = (-b - sqrt(ft))/(2*a);       printf("x1=%lf, x2=%lf\n", x1, x2);       iRoots = 2;     }   }    if(px1) *px1 = x1;   if(px2) *px2 = x2;      return iRoots; }
user-0 提问: 谁知道如何用Windows编程(c语言)在其他窗口上面显示文字

回复:
user: user-1
content: C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: #include "string.h" #include "stdio.h" #include "windows.h" int main( void ) { 	char title[200]={"命令提示符"};						//这里写上窗口标题  	HWND hwnd = FindWindow( NULL , title ); 	if( hwnd==NULL )  	{ 		printf("没找到\n"); 		getchar(); 		return 0; 	} 	HDC hdc = GetDC( hwnd ); 	HFONT font=CreateFont( 30,0,150,0,600,0,1,0,0,0,0,0,0,"楷体");//创建字体 	SelectObject( hdc , font ); 	SetTextColor( hdc , RGB(255 ,0 ,0 ) );			//设置字体颜色  	SetBkColor( hdc , RGB( 0, 0, 255 ) );			//设置文字背景颜色  	 	char str [100]={"这是要显示的文字"}; 	TextOut( hdc , 20 , 60 , str , strlen(str) ); 	ReleaseDC( hwnd, hdc ); 	getchar(); 	return 0;  }   链接的库是gdi32，mingw环境（dev）下链接选项是-lgdi32    这里的函数的参数你自己查

user: user-3
content: SetWindowText

user: user-0
content: 引用 2 楼 focuslight的回复:报什么错？ 贴出来吧 可能你没取对窗口句柄 invaid 啥的。。。很神奇啊

user: user-4
content: 报什么错？ 贴出来吧 可能你没取对窗口句柄

user: user-5
content: 你说的是MFC吗。。

user: user-0
content: 来人啊。。。。。
user-0 提问: 控制台窗口无法接收消息吗？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:控制台窗口对你的程序来说不是真正的窗口，没有消息循环的 为啥控制台不是真正的窗口？

user: user-1
content: 控制台窗口对你的程序来说不是真正的窗口，没有消息循环的
user-0 提问: C语言 fopen读文件出错问题

回复:
user: user-0
content: 谢谢你。不过我这两天找到问题了。是因为我的程序在后面打开文件之后，直接把文件删除了。没有关闭。我现在加了关闭之后删除，就不影响前面的文件操作了。现在程序可以运行了。

user: user-1
content: 你确定是打开文件报的错吗。相关代码贴上来，你的描述对解决你的问题没有丝毫的帮助。
user-0 提问: 数字华容道代码

回复:
user: user-1
content: zero[1]:c 这句注释了吧

user: user-2
content: 大量这种没有缩进的程序 怎么读啊？

user: user-3
content: zero[1]:c  这一句是不是有问题。

user: user-0
content: 是有什么问题吗？不知道该如何修改了
user-0 提问: c语言符号表达式

回复:
user: user-1
content: a 为6. C语言中子表达式是以 逗号分隔，例如： int  x=123,  y=777, z = 888; 显然， a=2*3,      a*5      是两个子表达式， 否则 a 根本求不出值  i=(a=2*3,a*5),      a+6;    分属两个子表达式    【 i的值 来自 a*5 】

user: user-1
content: 引用 3 楼 坏比恩 的回复:[quote=引用 1 楼 tongshou的回复:]a 为6. C语言中子表达式是以 逗号分隔，例如： int  x=123,  y=777, z = 888; 显然， a=2*3,      a*5      是两个子表达式， 否则 a 根本求不出值  i=(a=2*3,a*5),      a+6;    分属两个子表达式    【 i的值 来自 a*5 】 请问和这个是什么区别呢： 　一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式，如(a=3*5，a*4)，a+5 先计算出a的值等于15，再进行a*4的运算得60(但a值未变，仍为15)，再进行a+5得20，即整个表达式的值为20。[/quote]  实际编程中，请不要使用这种 自我复杂化的表达式。因为很容易自我作死(^_^)。当然作为研究、探索编译器运作方式还情有可原。

user: user-0
content: 引用 1 楼 tongshou的回复:a 为6. C语言中子表达式是以 逗号分隔，例如： int  x=123,  y=777, z = 888; 显然， a=2*3,      a*5      是两个子表达式， 否则 a 根本求不出值  i=(a=2*3,a*5),      a+6;    分属两个子表达式    【 i的值 来自 a*5 】 请问和这个是什么区别呢： 　一个逗号表达式又可以与另一个表达式组成一个新的逗号表达式，如(a=3*5，a*4)，a+5 先计算出a的值等于15，再进行a*4的运算得60(但a值未变，仍为15)，再进行a+5得20，即整个表达式的值为20。

user: user-2
content: i=(a=2*3,a*5),a+6; 这里面就只有一次a=出现，如果没有=怎么赋值。a+6只是得到一个12，并没有=来进行赋值
user-0 提问: 大神们啊，以后遇到这种题咋办(´;︵;`)

回复:
user: user-1
content: 高中生就学了诶。这个规律很明显的。

user: user-0
content: 引用 1 楼 qq_38834405的回复:杨辉三角 百度应该比我说的详细 我又不能一眼就看出来

user: user-2
content: 杨辉三角 百度应该比我说的详细
user-0 提问: 求助大佬

回复:
user: user-1
content: 引用 5 楼 qq_44848479的回复:[quote=引用 2 楼 凉拌鱼腥草的回复:]65<=a&&a>=90||97<=a&&a>=122  几个意思 就是ascii码值的比较[/quote] 65<=a&&a>=90 跟a>=90有什么区别吗？a>=90，那a肯定也大于65啊。还用并且干嘛，你确定这里没错吗？

user: user-0
content: 引用 15 楼 凉拌鱼腥草的回复:[quote=引用 5 楼 qq_44848479的回复:][quote=引用 2 楼 凉拌鱼腥草的回复:]65<=a&&a>=90||97<=a&&a>=122  几个意思 就是ascii码值的比较[/quote] 65<=a&&a>=90 跟a>=90有什么区别吗？a>=90，那a肯定也大于65啊。还用并且干嘛，你确定这里没错吗？[/quote] 是我粗心，打错了，

user: user-2
content: if((65 <= a && a <= 90) || (97 <= a && a <= 122))

user: user-3
content: 引用 9 楼 qq_44848479 的回复：[quote=引用 7 楼 stherix的回复:]while((a=getchar()) != '\n') 能细说下不能用的原因吗[/quote]两个getchar，会有一半的输入字符会被while语句里面的消耗掉，不会进入对a的判断

user: user-0
content: 我想知道出错的原因

user: user-0
content: 能否告诉我为什么会出错?

user: user-4
content: #include <stdio.h>  int main() {      int a,z=0,s=0,l=0,m=0;      printf("请输入一串字符：\n");     while((a = getchar())!='\n')     {         if((65 <= a && a >= 90) || (97 <= a && a >= 122)) //判断输入字符中英文字符的个数z             z++;         else if(a == 32)        //判断输入字符中空格个数s             s++;         else if(a >= 48 && a <= 57) //判断输入字符中数字个数l             l++;         else m++;   //其他字符个数m     }     printf("%d\n",z);     printf("%d\n",s);     printf("%d\n",l);     printf("%d\n",m);     return 0; }  供参考～

user: user-0
content: 引用 7 楼 stherix的回复:while((a=getchar()) != '\n') 能细说下不能用的原因吗

user: user-0
content: 能细说下不能用的原因吗

user: user-3
content: while((a=getchar()) != '\n')

user: user-0
content: 引用 1 楼 stherix的回复:循环内有2个getchar，必须去掉一个 就是循环里不能有两个getchar对吧

user: user-0
content: 引用 2 楼 凉拌鱼腥草的回复:65<=a&&a>=90||97<=a&&a>=122  几个意思 就是ascii码值的比较

user: user-1
content: 改成a>=65&&a<=90，另外一个再改掉

user: user-1
content: a大于等于65并且a大于等于90?

user: user-1
content: 65<=a&&a>=90||97<=a&&a>=122  几个意思

user: user-3
content: 循环内有2个getchar，必须去掉一个
user-0 提问: 没有初始赋值怎么会显示数字？

回复:
user: user-1
content: 变量会占据内存里的几个字节，那么始终都是有值的，你没初始化的话，那么这几个字节原本是什么值就是什么值，有的编译器会帮忙初始化，也就是赋值0。

user: user-2
content: 若没有赋值，那么局部变量里的值是随机数，这个值可能是之前的函数栈留下来的。
user-0 提问: Permission denied

回复:
user: user-1
content: 哪里显示permission denied，有截图吗

user: user-2
content: 重装系统 或者装个虚拟机试试

user: user-3
content: 权限不足 首先考虑是不是你的程序还在运行  编译操作会重写可执行文件 如果可执行文件加载在内存中执行 操作系统可能会锁定文件 不允许修改

user: user-4
content: 权限不足，windowds的话以管理员运行，linux的话sudo
user-0 提问: gcc和vs编译相同代码，运行结果不同

回复:
user: user-1
content: 自增或自减是有副作用的，这样的代码不建议写，跟编译器有关的，要看编译器运算的顺序来决定最后的结果。

user: user-0
content: 引用 1 楼 user-2 的回复：因为c++规范里没有对这个执行顺序做要求 不同编译器的实现可能不一样,加上vs的cl是纯c++编译器,而gcc是个c编译器 所以别用这样的风格写代码,要把代码写的易懂,易维护懂了，感谢

user: user-2
content: 因为c++规范里没有对这个执行顺序做要求 不同编译器的实现可能不一样,加上vs的cl是纯c++编译器,而gcc是个c编译器 所以别用这样的风格写代码,要把代码写的易懂,易维护