Question: 哪个大神可以帮一下小弟，实在是不会，不甚感激。

#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; }

很早之前写的判断素数的，凑活着用下吧  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; }


Question: 新手初来乍到，有没有懂这个的，谢谢

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

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

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

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

一样的。都是n个大于0的数求和


Question: 请问如何修改？

引用 1 楼 user-1的回复:3错了 sum3 = mony * (1 + air3 / 2) * (1 + air3 / 2); 我知道了，2，3都错了


Question: malloc内存浪费问题的请教

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

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

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

realloc


Question: 运行错误到底是什么 困扰我好久了

引用 16 楼 拥抱Linux的回复:[quote=引用 13 楼 Martin Morning 的回复:] 针对你说的 1.j不会越界，因为j＝4的时候在for里面会判断是否j＜4，如果不满足，就不会执行循环，所以不存在越界一说。 2.你说的确实没错，不过我觉得就做题而言多此一举了，因为测试点不会用错误的输入来测试你的答案，只会用一组正确的数来检测 3.return 0应该加的，不过每次都懒所以忘记加了，不过不会影响系统判题  嗯，你说的是对的，上面的回复确实不严谨，非常抱歉！  另外，把你上面的代码复制、粘贴到PAT原题练习页面，经过测试，把 gets(s); 改成 scanf("%s",s); 之后，就通过了。   具体原因是什么，俺也不知道，因为没有研究过gets函数。建议你可以研究一下，到时候跟大家再分享一下结论那就最好了。 [/quote] 抱歉老哥，前段时间有点事没看论坛。 我刚刚查了下，ges会在读取一个字符串后加上\0，而我定义的数组只有4个单位，所以会越界。这样推的话scanf ％s是不会加的。

（1）sort函数里，第一层循环变量 i 的结束条件不对，数组下标会越界，应该是   for (i = 0; i < 3; i++) // 否则下面的 j = i + 1 会越界，而且，比较排序的时候， // 前一个数与后一个数比较，前一个数的下标的最大值必然是 （数组元素个数-1） 。  但是，运行时没有报错，就是不知道答题系统自动检测的时候算不算这个是运行时错误。  （2）对于输入的数或者字符串，增加了检查语句，确认是否为数字，  	for (i = 0; i < n; i++) { 		a[i] = s[i] - '0'; 		// 检查是否每位都是数字 		if (a[i] < 0 || a[i] > 9) { 			printf("Wrong input!\n"); 			return -1; 		} 	}  试了一下，不加上面的检查语句，输入字母进去，最后的结果也能算出来是6174，但是中间过程不符合题意。  （3）为main函数，在最后增加一句返回值语句， return 0;  其它的，没有看出来还有什么不对的地方。你再提交试试呢？

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <unistd.h>  #define KEY_NUM     6174  typedef int pfunc(int, int);  int asc_cmp(int a, int b) {     if (a < b)         return 1;     else         return 0; }  int des_cmp(int a, int b) {     if (a > b)         return 1;     else         return 0; }  void sort(char *str, int len, pfunc cmp) {     int i, j, tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (cmp(str[j], str[j+1])) {                 tmp = str[j];                 str[j] = str[j+1];                 str[j+1] = tmp;             } }  int main(void) {     int num, des, asc;     char str[8];      while (1) {     printf("Please input a num: [1000, 9999]: ");     scanf("%d", &num);     if (num < 1000 || num > 10000)         return -1;      while (1) {         snprintf(str, 8, "%04d", num);         sort(str, 4, des_cmp);         des = atoi(str);         sort(str, 4, asc_cmp);         asc = atoi(str);         num = asc - des;         printf("%04d - %04d = %04d\n", asc, des, asc-des);         //sleep(1);         if (num == 0 || num == KEY_NUM)             break;     }      }      return 0; } 供参考！  建议改改我的提供的程序，再试一下能不能通过引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <unistd.h>  #define KEY_NUM     6174  typedef int pfunc(int, int);  int asc_cmp(int a, int b) {     if (a < b)         return 1;     else         return 0; }  int des_cmp(int a, int b) {     if (a > b)         return 1;     else         return 0; }  void sort(char *str, int len, pfunc cmp) {     int i, j, tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (cmp(str[j], str[j+1])) {                 tmp = str[j];                 str[j] = str[j+1];                 str[j+1] = tmp;             } }  int main(void) {     int num, des, asc;     char str[8];      while (1) {     printf("Please input a num: [1000, 9999]: ");     scanf("%d", &num);     if (num < 1000 || num > 10000)         return -1;      while (1) {         snprintf(str, 8, "%04d", num);         sort(str, 4, des_cmp);         des = atoi(str);         sort(str, 4, asc_cmp);         asc = atoi(str);         num = asc - des;         printf("%04d - %04d = %04d\n", asc, des, asc-des);         //sleep(1);         if (num == 0 || num == KEY_NUM)             break;     }      }      return 0; } 供参考！  建议改改我的提供的程序，再试一下能不能通过[img=https://img-bbs.csdn.net/upload/201904/11/1554956385_387505.png" alt="" />你这写的不符合题意啊  看案例就知道是输入一次就可以了

引用 7 楼 xdn1ce的回复:是不是得写成 %04d 只有2种可能，4位和3位，如果是3位就在前面加个0。你再看看

只有2种可能，4位和3位，如果是3位就在前面加个0。你再看看

是不是得写成 %04d

if(k<1000) printf(........... = 0%d)   你这一句能保证是四位数字吗？可能有问题。

引用 1 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h> #include <string.h> //#include <unistd.h>  #define KEY_NUM     6174  typedef int pfunc(int, int);  int asc_cmp(int a, int b) {     if (a < b)         return 1;     else         return 0; }  int des_cmp(int a, int b) {     if (a > b)         return 1;     else         return 0; }  void sort(char *str, int len, pfunc cmp) {     int i, j, tmp;      for (i = 0; i < len; i++)         for (j = 0; j < len - i -1; j++)             if (cmp(str[j], str[j+1])) {                 tmp = str[j];                 str[j] = str[j+1];                 str[j+1] = tmp;             } }  int main(void) {     int num, des, asc;     char str[8];      while (1) {     printf("Please input a num: [1000, 9999]: ");     scanf("%d", &num);     if (num < 1000 || num > 10000)         return -1;      while (1) {         snprintf(str, 8, "%04d", num);         sort(str, 4, des_cmp);         des = atoi(str);         sort(str, 4, asc_cmp);         asc = atoi(str);         num = asc - des;         printf("%04d - %04d = %04d\n", asc, des, asc-des);         //sleep(1);         if (num == 0 || num == KEY_NUM)             break;     }      }      return 0; } 供参考！  建议改改我的提供的程序，再试一下能不能通过 也许你的是对的，但我想知道的是我错在哪

引用 2 楼 coo135的回复:哈哈，算法都对，就是没仔细看题目~~   输入格式：  输入给出一个 (0,10 4  ) 区间内的正整数 N。  所以你要输入N，然后循环N次 才对。  还有一点，就是要把gets() 换成scanf() ，切记!! 这个N不是循环次数吧，你看给的输入输出案例。输入一次运行一次就行了

这个N不是循环次数吧，你看给的输入输出案例。输入一次运行一次就行了

引用 13 楼 Martin Morning 的回复:针对你说的 1.j不会越界，因为j＝4的时候在for里面会判断是否j＜4，如果不满足，就不会执行循环，所以不存在越界一说。 2.你说的确实没错，不过我觉得就做题而言多此一举了，因为测试点不会用错误的输入来测试你的答案，只会用一组正确的数来检测 3.return 0应该加的，不过每次都懒所以忘记加了，不过不会影响系统判题  嗯，你说的是对的，上面的回复确实不严谨，非常抱歉！  另外，把你上面的代码复制、粘贴到PAT原题练习页面，经过测试，把 gets(s); 改成 scanf("%s",s); 之后，就通过了。   具体原因是什么，俺也不知道，因为没有研究过gets函数。建议你可以研究一下，到时候跟大家再分享一下结论那就最好了。

如果题目没有内存大小要求，你数组大小往大了给，因为你也不清楚什么时候就越界了。比如题目要求不大于5的字符串，你就char st[10];来保存

引用 11 楼 qq_38834405的回复:主要问题：越界了，字符串长度是字符长度+1，应该是s[5]（做题你直接给他写100，1000又不会出错） 次要问题：输出格式应该不要求每行输出0123这个格式吧，输出123会错吗？反正最后结果一定是6174 老哥稳，换成s5全通过了。0123是因为题目里说了每个数按4位输出，给的案例也是这样。 不过你括号里那一句话没看懂，望老哥指教


Question: C语言有大佬帮我看看吗？

引用 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; 	 }  大佬牛

没有大佬也没有帮你看的。


Question: OJ题目,判断概率,在线等,吐血了,我不知道我思路哪里不对.....

引用 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]对喔

极端场景特殊处理下吧，比如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%

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

这个不难吧 a = (m > n / 2) ? m - 1 : m + 1;


Question: 求大佬帮忙看看这两种为什么不一样

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

具体到你的图里面的代码，两层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++){     } }

外部有赋初始值了，所以这两个没啥区别，一般建议在for循环内部设置初值比较好一点。


Question: 关于for循环（新手）

哦我看错了谢谢怪不得

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

引用 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  这下应该明白了吧？

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

那帮我看看为什么答案永远等于0

本来就获取的到


Question: 接下来的代码怎么写

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

实现以上所有的功能，这些代码只是实现了部分

什么叫接下来怎么写。。。你要干什么


Question: C语言编程题

给楼主第二题一个简单的方法： #include <stdio.h> #include <string.h>  int main() { 	char s[6]; 	scanf("%s",s); 	printf("最后一位数:%c,几位数:%d",s[strlen(s)-1],strlen(s));  }

引用 2 楼 user-2 的回复:#include <iostream>  //判断是否闰年 bool IsLeapYear(int nYear) { 	bool bIsLeapYear = false; 	if (0 == nYear % 100) 	{ 		if (0 == nYear % 400) 		{ 			bIsLeapYear = true; 		} 	} 	else 	{ 		if (0 == nYear % 4) 		{ 			bIsLeapYear = true; 		} 	}  	return bIsLeapYear; } //计算从公元1990年1月1日到指定时间的天数。 int YearToDay(int nYear, int nMonth, int nDay) { 	int nYearToDay = 0; 	bool bIsLeapYear =false;  	//以年为单位计算 	for (int i = 1990; i < nYear; ++i) 	{ 		bIsLeapYear = IsLeapYear(i);  		if (bIsLeapYear) 		{ 			nYearToDay += 366; 		} 		else 		{ 			nYearToDay += 365; 		} 	}  	//以月为单位累加 	bIsLeapYear = IsLeapYear(nYear); 	for (int j = 0; j < nMonth; ++j) 	{ 		if (1 == j || 3 == j || 5 == j || 7 == j || 8 == j || 10 == j || 12 == j ) 		{ 			nYearToDay += 31; 		} 		else if (4 == j || 6 == j || 9 == j || 11 == j) 		{ 			nYearToDay += 30; 		} 		else if (2 == j) 		{ 			if (bIsLeapYear) 				nYearToDay += 29; 			else 				nYearToDay += 28; 		}  		//以日为单位累加 		nYearToDay += nDay;  	} 	return nYearToDay; } int main() { 	int nStartDay = YearToDay(1995, 1, 1); 	int nEndDay = YearToDay(2000, 12, 10);  	int nSumOfDay = nEndDay - nStartDay + 1;  	std::cout << "从1990年1月1日（包含当天）到2000年12月10日（包含当天）总天数为：" << nSumOfDay << std::endl;  	return 0; }  2题都是我答的，结贴给分！ #include <iostream>  //判断是否闰年 bool IsLeapYear(int nYear) { 	bool bIsLeapYear = false; 	if (0 == nYear % 100) 	{ 		if (0 == nYear % 400) 		{ 			bIsLeapYear = true; 		} 	} 	else 	{ 		if (0 == nYear % 4) 		{ 			bIsLeapYear = true; 		} 	}  	return bIsLeapYear; } //计算从公元1990年1月1日到指定时间的天数。 int YearToDay(int nYear, int nMonth, int nDay) { 	int nYearToDay = 0; 	bool bIsLeapYear =false;  	//以年为单位计算 	for (int i = 1990; i < nYear; ++i) 	{ 		bIsLeapYear = IsLeapYear(i);  		if (bIsLeapYear) 		{ 			nYearToDay += 366; 		} 		else 		{ 			nYearToDay += 365; 		} 	}  	//以月为单位累加 	bIsLeapYear = IsLeapYear(nYear); 	for (int j = 0; j < nMonth; ++j) 	{ 		if (1 == j || 3 == j || 5 == j || 7 == j || 8 == j || 10 == j || 12 == j ) 		{ 			nYearToDay += 31; 		} 		else if (4 == j || 6 == j || 9 == j || 11 == j) 		{ 			nYearToDay += 30; 		} 		else if (2 == j) 		{ 			if (bIsLeapYear) 				nYearToDay += 29; 			else 				nYearToDay += 28; 		} 	}  	//以日为单位累加 	nYearToDay += nDay;  	return nYearToDay; } int main() { 	int nStartDay = YearToDay(1995, 1, 1); 	int nEndDay = YearToDay(2000, 12, 10);  	int nSumOfDay = nEndDay - nStartDay + 1;  	std::cout << "从1990年1月1日（包含当天）到2000年12月10日（包含当天）总天数为：" << nSumOfDay << std::endl;  	return 0; }  //下面这个对，上面一个把nDay不小心放到for循环里了。

#include <iostream>  int main() { 	int n = 0; 	std::cout << "please input a int value(n>0 && n < 100000)" << std::endl; 	std::cin >> n; 	if (n <= 0 || n>=100000) 	{ 		std::cout << "error input! n value is " << n << std::endl; 		return 0; 	}  	int nSigle = 0; 	nSigle = n % 10; 	std::cout << "个位数为：" << nSigle << std::endl;  	int nLen = 0; 	 	if (n < 10) 		nLen = 1; 	else if(n < 100) 		nLen = 2; 	else if (n < 1000) 		nLen = 3; 	else if (n < 10000) 		nLen = 4; 	else 		nLen = 5; 	std::cout << "该正整数的位数是" << nLen << std::endl;  	return 0; }  第二题答案，请给分！


Question: C语言关于字符串

這結果不對嗎？

对于测试的例子来说是对的


Question: C语言关于字符串

常规算法都需要扫描两遍，第一遍找最大位置，第二遍拼装

应该还有可以改进的地方

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

啊哈哈    不小心发了两次


Question: C语言：动态内存分配的二维数组初始化后，使用free()无法释放内存，程序崩溃！！！！

引用 18 楼 yuanlai_ 的回复:[quote=引用 16 楼 lin5161678 的回复:] [quote=引用 15 楼 yuanlai_ 的回复:] [quote=引用 14 楼 lin5161678 的回复:] [quote=引用 13 楼 yuanlai_ 的回复:] [quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针 [/quote]  有没有看懂 二维空间啊[/quote] 我当然可以看懂了 多简单啊  二维空间用数组指针 指针数组 二级指针 都可以实现  你前面 把数组指针解释成指针数组 后面写了一个二级指针的实现  完美的混淆了三种不同操作 [/quote]  解决问题  问的是二维空间的释放 指针数组和二级指针都是用来指向二维空间的[/quote] 数组指针指向一维数组的指针

引用 16 楼 lin5161678 的回复:[quote=引用 15 楼 yuanlai_ 的回复:] [quote=引用 14 楼 lin5161678 的回复:] [quote=引用 13 楼 yuanlai_ 的回复:] [quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针 [/quote]  有没有看懂 二维空间啊[/quote] 我当然可以看懂了 多简单啊  二维空间用数组指针 指针数组 二级指针 都可以实现  你前面 把数组指针解释成指针数组 后面写了一个二级指针的实现  完美的混淆了三种不同操作 [/quote]  解决问题  问的是二维空间的释放 指针数组和二级指针都是用来指向二维空间的

解决问题  问的是二维空间的释放 指针数组和二级指针都是用来指向二维空间的

引用 15 楼 yuanlai_ 的回复:[quote=引用 14 楼 lin5161678 的回复:] [quote=引用 13 楼 yuanlai_ 的回复:] [quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针 [/quote]  有没有看懂 二维空间啊[/quote] 我当然可以看懂了 多简单啊  二维空间用数组指针 指针数组 二级指针 都可以实现  你前面 把数组指针解释成指针数组 后面写了一个二级指针的实现  完美的混淆了三种不同操作

这都写得切末玩意儿啊，我操 你到底懂不懂c语言的基本知识  数组，指针，内存，地址这些东西 你的代码一塌糊涂

引用 14 楼 lin5161678 的回复:[quote=引用 13 楼 yuanlai_ 的回复:] [quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针 [/quote]  有没有看懂 二维空间啊

引用 13 楼 yuanlai_ 的回复:[quote=引用 12 楼 lin5161678 的回复:] [quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }  [/quote]你写的这段代码 和数组指针 和指针数组 都没关系  这是一个二级指针

引用 12 楼 lin5161678 的回复:[quote=引用 10 楼 yuanlai_ 的回复:] 数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组[/quote]  int **alloc2Dmem1(int base,int row,int line) {     int **p=(int **)malloc(line*sizeof(int *));     for(int i=0;i<line;i++)     {         p[i]=(int *)malloc(base*row);     //p为首行地址 p[i]每次增加一个int *空间     }      return p; }  void free2dspace(int **p,int n) {     for(int i=0;i<n;i++)     {         free(p[i]);     }     free(p); }

引用 10 楼 yuanlai_ 的回复:数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针数组

引用 10 楼 yuanlai_ 的回复:数组指针。意思有数组里面都是指针 要循环清理。把N个全部释放掉你说的是指针shuz

shishi

//二级指针     char **a;     a = (char*)malloc(sizeof(char*[13])); 纠正 //二级指针     char **a;     a = (char**)malloc(sizeof(char*[13]));     for(int i=0;i<13;i++)

引用 13 楼 yuanlai_ 的回复: 二维空间   //数组指针 	char (*a)[50]; 	a = (char (*)[50])malloc(sizeof(char[13][50])); 	int i,j; 	for(i=0;i<13;i++) 		for(j=0;j<50;j++) 			a[i][j] = 0; 	free(a);                      //指针数组 	char *a[13]; 	for(int i=0;i<13;i++) 		a[i] = (char*)malloc(sizeof(char[50]));  	for(int i=0;i<13;i++) 		for(int j=0;j<50;j++) 			a[i][j] = 0; 			 	for(int i=0;i<13;i++) 		free(a[i]);   		 //二级指针 	char **a; 	a = (char*)malloc(sizeof(char*[13])); 	for(int i=0;i<13;i++) 		a[i] = (char*)malloc(sizeof(char[50])); 		 	for(int i=0;i<13;i++) 		for(int j=0;j<50;j++) 			a[i][j] = 0; 	       	for(int i=0;i<13;i++) 		free(a[i]);   	free(a);    都是二维空间  但区别很大啊 少年

while(1);没有，程序就是异常退出的，cmd窗口上显示程序返回值不是0；

#include<stdio.h> #include<stdlib.h>  int main() { 	int N; 	int i; 	char **name = NULL; 	scanf("%d", &N); 	 	/*建立二级指针*/ 	name = (char **)malloc(sizeof(char *) * N); 	for (i = 0; i < N; i++) { 		name[i] = malloc(sizeof(char) * 11); 	} 	 	/*释放二级指针*/ 	for(i = 0; i < N; i++) { 		free(name[i]); 		name[i] = NULL; 	} 	free(name); 	name = NULL; 	return 0; }

引用 7 楼 自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  int main() {     const char N = 50;      char (*a)[N];     a = (char (*)[N])malloc(sizeof(char) * 13 * 50);//分配13个指向 char (*)[N]的指针      //a = b;     /*--------将数组所以元素初始化为0--------*/ //初始化操作     int i,j;     for(i=0;i<13;i++)         for(j=0;j<N;j++)             a[i][j] = 0;      free(a);     printf("Successfully free the a!\n");      return 0; }  供参考！ 这句改成这样也可以：  a = (char (*)[N])malloc(sizeof(char) * 13 * N);

二维数组不是那样申请的，要么一次性申请全量内存；要么分两次申请，先申请一维指针，再每一维申请内存

楼上2位 解析说得不错 但代码写得不好  a = (char (*)[N])malloc(sizeof(char[13][N])); 就可以了

顶3楼，很详细了。 如果只想malloc一次，也可以， 分配连续内存，自行分割使用  char* a = malloc(13 * 50);


Question: 记事本窗口里的光标位置可以控制吗？

\b回退一格好像

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

可以，通过句柄

引用 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] 我查了下，这个好像是选取一段文字而不是定位光标。也就是说，没有直接操控窗口光标的函数吗？而且发送消息的方式好像最多只能设置定位而不能获取定位吧？

引用 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

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

引用 2 楼 六道佩恩 的回复:[quote=引用 1 楼 孤星血泪 的回复:] 可以，通过句柄 可以说说是哪个函数吗？我好去查。[/quote]  HWND hwnd = FindWindow() 获取记事本窗体句柄 RECT rect; GetWindowRect(hwnd,&rect);  获取窗口左上角坐标 SetCursorPos(rect.left+光标相对窗口X轴位置,rect.top+光标相对窗口Y轴位置)； 设置鼠标在记事本窗口里的位置


Question: 新人求助，头文件结构定义语法错误，找不到问题出在哪里。

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

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


Question: 输入某个奇数n，编写1+(1+3)+(1+3+5)+……（1＋3＋5＋……＋n）和的程序

引用 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也没多几个字符~~~

希望能帮到你，欢迎及时确认、结帖、给分！  #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环境测试运行截图：

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

引用 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));

咋都不行涅 用vs2012

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 )); }


Question: 求大神指导为啥不能运行啊

怎么又是一个只贴照片的，把代码贴出来嘛


Question: 各位社友，可以给我解答一下C语言数据结构的问题吗？例如，在顺序表中是否可以用插入的方法进行

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

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

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

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

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

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

链表里的内存不是连续的。随便插只要用上一个节点的next指向这块内存就行了


Question: 打印特殊字符

仅供参考：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; }


Question: 大佬看一下为何执行不出来啊，C语言

引用 2 楼 拥抱Linux的回复:主要是（1）locateNode函数，（2）fun函数里的语句有缺陷。更新后的代码如下，有问题的地方已经用注释说明了。  #include <stdio.h> #include <stdlib.h> #define MAX 10 #define MAXIN 5 typedef int ElemType; typedef struct Inode { 	ElemType(*elem); 	int length; 	int listsize; } Sqlist; //Sqlist L; //没有用上的全局变量 void Initlist(Sqlist *L) { /*顺序表初始化*/ 	L->elem = (ElemType *)malloc(MAX * sizeof(ElemType)); 	if (!L->elem) { 		printf("申请空间失败!!!\n"); 		exit(0); 	} else { 		L->length = 0; 		L->listsize = MAX; 	} }  void Setlist(Sqlist *L) { 	ElemType y, *new; 	printf("连续输入，当输入0时停止\n"); 	scanf("%d", &y); 	while (y != 0) { 		L->elem[L->length] = y; 		L->length++; 		if (L->length >= L->listsize) { 			new = (ElemType *)realloc(L->elem, (L->listsize + MAXIN) * sizeof(ElemType)); 			if (!new) { 				printf("存储空间分配失败!\n"); 				exit(0); 			} else { 				L->elem = new; 				L->listsize += MAXIN; 			} 		} 		scanf("%d", &y); 	} } void Printlist(Sqlist L) { 	int i; 	printf("输出顺序表:\n"); 	for (i = 0; i < L.length; i++) 		printf("%d\t", L.elem[i]); 	printf("\n"); } int locateNode(Sqlist *list, ElemType x) { 	int i = 0; 	for (i = 0; i < list->length; i++) { 		if (list->elem[i] == x) { 			return 0; 		} 		//return -1;  // 有问题，阻止了循环的正常执行 	}         //  没有找到匹配的值，返回-1         return -1; } int fun(Sqlist *a, Sqlist *b, Sqlist *L) { 	int i = 0, j = 0, e; 	for (i = 0; i < a->length; i++) { 		e = a->elem[i]; 		if (locateNode(b, e) == 0) { 			L->elem[j++] = a->elem[i];                         // 还应该同步更新L->length的值                         L->length++; 		} 	}         // 函数缺少返回值语句，         // 从整个程序来看，添加也可以，把函数改成void也可以         // 这里就不添加了 } int main() { 	Sqlist L1; 	Sqlist L2; 	Sqlist L3; 	Initlist(&L1); 	Initlist(&L2); 	Initlist(&L3); 	Setlist(&L1); 	Setlist(&L2); 	fun(&L1, &L2, &L3); 	Printlist(L1); 	Printlist(L2); 	Printlist(L3); 	printf("\n"); }   Linux环境测试运行截图：   希望能帮到你，欢迎及时确认、结贴、给分！ ：） 谢谢啊，受益匪浅，解决了问题

#include<stdio.h> #include<stdlib.h>  #define MAX 10 #define MAXIN 5  typedef int ElemType; typedef struct Inode {     //ElemType (*elem);     ElemType *elem;     int length;     int listsize; }Sqlist;  Sqlist L;  void Initlist(Sqlist *L) {     /*顺序表初始化*/     L->elem=(ElemType *)malloc(MAX*sizeof(ElemType));     if(!L->elem)     {         printf("申请空间失败!!!\n");         exit(0);     }     //else    // {         L->length=0;         L->listsize = MAX;     //} }  void Setlist(Sqlist *L) {     //ElemType y,*new;     ElemType y, *pnew;      printf("连续输入，当输入0时停止\n");     scanf("%d",&y);     while(y!=0)     {         L->elem[L->length]=y;         L->length++;         if(L->length>=L->listsize)         {             pnew=(ElemType *)realloc(L->elem,(L->listsize+MAXIN) *sizeof(ElemType));             if(!pnew)             {                 printf("存储空间分配失败!\n");                 exit(0);             }             //else             //{                 L->elem = pnew;                 L->listsize += MAXIN;             //}         }         scanf("%d", &y);     } } void Printlist(Sqlist L) {     int i;     printf("输出顺序表:\n");     for(i=0;i<L.length;i++)         printf("%d\t",L.elem[i]);     printf("\n"); } int locateNode(Sqlist *list,ElemType x) {     int i=0;     for(i=0;i < list->length; i++)     {         if(list->elem[i] == x)         //{             return 0;         //}         //return -1;     }     return -1; }  int fun(Sqlist *a,Sqlist *b,Sqlist *L) {     int i=0,j=0,e;     for(i=0;i<a->length;i++)     {         e = a->elem[i];         if(locateNode(b,e) == 0){             if (L->length < L->listsize)             //L->elem[j++] = a->elem[i];                 L->elem[L->length++] = a->elem[i];         }      }      return 0; } int main() {     Sqlist L1;     Sqlist L2;     Sqlist L3;     Initlist(&L1);     Initlist(&L2);     Initlist(&L3);     Setlist(&L1);     Setlist(&L2);     fun(&L1,&L2,&L3);     Printlist(L1);     Printlist(L2);     Printlist(L3);     printf("\n"); }  供参考！  注意你在给L3赋值时，你是否修改了L3的length呢，没有修改L3的length，那么Printlist如何打印L3呢，其他问题详见上面的代码。

new是c++关键字，你用c++编译器是编译不出来的，得用c编译器~  你把new随便换个名字就可以了~~

new可能是个关键字，可以换成别的，比如snew snew = (Sqlist*)realloc(L->elem, (L->listsize + MAXIN) * sizeof(ElemType));


Question: 用C语言读取RINEX3.02版本的O文件GPS数据的代码怎么写啊？

楼主写出来了没，我也想要一份


Question: C语言，筛选法求素数出现Run-Time Check Failure #2 - Stack around the variable 'a' was corrup

数组访问越界了，如图示：  另外，中间过程的一些语句可以省略，因为执行和不执行的效果都是一样的，比如 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; }  希望能帮到你，欢迎及时确认、结帖、给分！：）

越界了，j+1为101就报错了


Question: 日常任务

第2题写得太丑陋： 2. 不允许创建临时变量，交换两个数的内容（附加题）   给你个简单的方法： i = i + j; j = i - j; i = i - j;


Question: 问题：为啥是这样的？是没有存到吗？还是检验密码哪里出错了？还是？root函数那里出问题了？

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

fp没有看到fopen初始化啊


Question: 问一下下面这个scanf在输入回车之后printf是如何循环输出的

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

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

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

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

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

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

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

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

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

就是进入一个出去一个然后若一次性进入多个则一个一个输出是吗

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

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

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


Question: 求

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

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

由大写转小写的字符，相同字符的数量

用来统计相应的小写字母 出现的次数！


Question: 怎么求

我也是这个，但输入其他字符不变怎么理解

①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); 	  	 }

是在你的图片上的代码改吗？


Question: 零基础学习C语言，应该从哪里开始？

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

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

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

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

零基础推荐你从Essential C++开始看，在结合任意一本讲面向对象程序设计思维的书一起阅读，可以帮你更快入门并夯实基础


Question: 求助，为什么我写的这个纯c读取xml的程序运行以后是空白的，还有就是xml里面的中文应该怎样操作才能显示，而不是乱码

没有人吗？？？


Question: 求大佬用c帮忙解决这个问题

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

引用 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”👀

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


Question: 怎么使用51单片机实现6自由度的机械手模型设计？

额，，，，不太清楚，大概是操控关节处电机的转动方向和转动时间吧


Question: 新人求个解答

引用 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;的后面。。 手写这么多，麻烦了(๑˃̵ᴗ˂̵)و

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

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

输入n个数字，输出其中第k大的数字

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

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

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

这个是用来发射宇宙飞船的……


Question: 求代

哦输出应该是"%d\n"，上面少了个换行符

#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; }

哪里不会？？


Question: 求回答，谢谢

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

简单的递归输入，答案是cba

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

建议自己写个小程序测试一下～

自己写个小程序测试调试下多好， 即获得的预期结果也提高了水平


Question: c语言编程

引用 2 楼 拥抱Linux的回复:你的题目的意思「删除该字符串的所有首部和尾部数字字符」到底是什么？就是说字符串中间出现的数字保留，是吗？ 下面是2个程序，你自己看哪个合适吧。 （1）去除字符串中的所有数字，允许输入的字符串的最大长度默认为99个字符加一个'\0'，可以自行修改。  #include <stdio.h>  #define LENGTH 100  int main(int argc, char const *argv[]) { 	char str[LENGTH]; 	int count = 0; 	char c;  	// 「忽略」所有的数字 	while ((c = getchar()) != '\n' && count < (LENGTH - 1)) { 		if (c < 48 || c > 57) { 			str[count] = c; 			count++; 		} 	} 	str[count] = '\0'; 	printf("%s * %d\n", str, count);  	return 0; }  （2）去除字符串的最前面和最末尾的数字，中间有数字的话，保留。允许输入的字符串的最大长度默认为99个字符加一个'\0'，可以自行修改。  #include <stdio.h> #include <string.h>  #define LENGTH 100  int main(int argc, char const *argv[]) { 	char str[LENGTH]; 	int count = 0; 	char c; 	char *p = str;  	while ((c = getchar()) != '\n' && count < (LENGTH - 1)) { 		str[count] = c; 		count++; 	} 	str[count] = '\0';  	// 「清除」字符串最前面的数字，或者叫「跳过」 	for (int i = 0; i < count; i++) { 		if (str[i] < 48 || str[i] > 57) 			break; 		else { 			p++; 		} 	}  	// 「清除」字符串最后面的数字，或者叫「跳过」 	for (int i = count - 1; i >= 0; i--) { 		if (str[i] < 48 || str[i] > 57) { 			str[i + 1] = '\0'; 			break; 		} 	}  	printf("%s * %d\n", p, (int)strlen(p));  	return 0; }   希望可以帮到你，欢迎及时给分、结帖。 您能再看看我的另一个帖子的题吗 谢谢您

引用 2 楼 拥抱Linux 的回复:你的题目的意思「删除该字符串的所有首部和尾部数字字符」到底是什么？就是说字符串中间出现的数字保留，是吗？ 下面是2个程序，你自己看哪个合适吧。 （1）去除字符串中的所有数字，允许输入的字符串的最大长度默认为99个字符加一个'\0'，可以自行修改。  #include <stdio.h>  #define LENGTH 100  int main(int argc, char const *argv[]) { 	char str[LENGTH]; 	int count = 0; 	char c;  	// 「忽略」所有的数字 	while ((c = getchar()) != '\n' && count < (LENGTH - 1)) { 		if (c < 48 || c > 57) { 			str[count] = c; 			count++; 		} 	} 	str[count] = '\0'; 	printf("%s * %d\n", str, count);  	return 0; }  （2）去除字符串的最前面和最末尾的数字，中间有数字的话，保留。允许输入的字符串的最大长度默认为99个字符加一个'\0'，可以自行修改。  #include <stdio.h> #include <string.h>  #define LENGTH 100  int main(int argc, char const *argv[]) { 	char str[LENGTH]; 	int count = 0; 	char c; 	char *p = str;  	while ((c = getchar()) != '\n' && count < (LENGTH - 1)) { 		str[count] = c; 		count++; 	} 	str[count] = '\0';  	// 「清除」字符串最前面的数字，或者叫「跳过」 	for (int i = 0; i < count; i++) { 		if (str[i] < 48 || str[i] > 57) 			break; 		else { 			p++; 		} 	}  	// 「清除」字符串最后面的数字，或者叫「跳过」 	for (int i = count - 1; i >= 0; i--) { 		if (str[i] < 48 || str[i] > 57) { 			str[i + 1] = '\0'; 			break; 		} 	}  	printf("%s * %d\n", p, (int)strlen(p));  	return 0; }   希望可以帮到你，欢迎及时给分、结帖。谢谢你

本来就不删字母啊，你不是说要：删除该字符串的所有首部和尾部数字字符啊~~

引用 3 楼 coo135的回复:  #include<stdio.h> #include<string.h> int main() { 	char a[100]; 	int len, front, tail; 	scanf("%s", a); 	len = strlen(a); 	for (front = 0; front < len; front++) { 		if (a[front]<'0' || a[front]>'9') 			break; 	} 	for (tail = len - 1; tail >= front; tail--) { 		if (a[tail]<'0' || a[tail]>'9') 			break; 	}  	int i = 0; 	if (front != 0) { 		while (front <= tail) { 			a[i++] = a[front++]; 		} 		a[i] = '\0'; 	} 	else  		a[tail + 1] = '\0'; 	printf("%s * %d\n", a, strlen(a)); 	return 0; }   这个去不了首部字母为什么呢

char str[10]; int i=0; int j; char c;  while(c=getchar()!=回车&&i<9) {    str[i]=c;    i++; } for(j=0;j<i-1;j++) {   str[j]=str[j+1]; } str[j+1]=‘\0’;  这样子可以吗


Question: 求C语言源码

#include<stdio.h> void main() { int i; double sum=0; for(i=1;i<=99;i=i+2)   sum+=1.0/i; printf("%f\n",sum); }


Question: 编程

月亮警察拯救你！   #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; }

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

什么意思啊，结贴率?

0结帖率伸手党无视

帮帮可怜的孩子吧


Question: c语言线性表创建

如果name是一个数组，那么改成这样试试： scanf_s("%s", s[i].name, sizeof(s[i].name)); 如果name是一个指针，那需要给其分配空间在执行这句。 scanf_s("%s", s[i].name, xx/*申请的空间大小*/);


windows 7？怎么看上去是windows 8.1

要将路径加入到环境变量里的 系统变量的path下   命令行管理员身份打开


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

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

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

建议：添加stdlib.h；把scanf_s换成scanf；float weight初始化为0.0；将scanf_s(“%d”,weight)修改为scanf(“%f”,&weight)


Question: 求助啊啊大佬           只要输出 ）] 这两个括号右边结果一定是匹配失败

谢谢大哥  非常感谢

给你调试过了，改如下地方：  1：原先是 ） if(!StackEmpty(le)&&'('==GetHead(le).aa) { //可以避免->造成错误  2： 原先是 ] if(!StackEmpty(le)&&'['==GetHead(le).aa) {  3：原先是！原先是 if(StackEmpty(le) && flag)


Question: 大佬们，，救救渣渣，弄了半天了，错错错，晕了。。。。。。。。。。

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

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

引用 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

粗看 堆栈空间会不够吧？

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

去掉typedef之后的程序能编译的，也没啥问题。如果你不能编译，那贴一下错误信息~~  除了写的不那么讲究，好像也没啥问题~~


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

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

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

代码贴完。没加头文件?


Question: C#小白编程遇到了问题，希望大神指点一下

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


Question: 用c#怎么求函数y=x-sinx-1的零点（保留到小数点后16位）

等效求 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


Question: 关于使用sizeof和不使用sizeof

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

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

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

引用 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，等待大神解惑

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

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

引用 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

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

这是什么语法呢？我都编译不过去

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


Question: 如何在win系统下用c语言来读取xml文件的信息啊？

pugixml了解下


Question: 求助

不是说了吗，你改名啊！ 双全难敌四手啊！


Question: 求助

双全难敌四手

同求试用C语言编写8086CPU的IO端口操作函数，函数声明如下：  //功能描述：从id端口读取一个字节  //输入参数：id - 端口号（端口地址），16位无符号数  //返回值：返回读取到的内容（一个字节，8位无符号数）  u8  IOR( u16 id );        //功能描述：向id端口写一个字节value  //输入参数：id - 端口号（端口地址），16位无符号数； value - 写入的内容，8位无符号数  //返回值：无  void IOW( u16  id,   u8  value);


Question: 萌新求教：请问大神如何简化if嵌套，感谢！

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

引用 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; } 谢谢您的指导！感谢！


Question: 黑色星期五能不能用蔡勒公式求？

你的代码有逻辑问题： #include<stdio.h>  int main() {  int year,month,week,j,a,b,c,y,a1,a2,a3;  scanf("%d",&year);   for(month=3;month<=14;month++)   {    if(month==13)        year--;    c=year/100;    y=year-c*100;    a=y-2*c+12;    a1=c/4;    a2=y/4;    a3=26*(month+1)/10;    week=a1+a2+a3+a;    if(week<0){ week+=7;}    week%=7;    if(week==5)    {  if(month==13 || month==14)     printf("%d-%d-13\n",year + 1,month - 12);  else     printf("%d-%d-13\n",year,month);    }   }   return 0; } 引用 8 楼 weixin_44504818 的回复:[quote=引用 7 楼 636f6c696e的回复:]两处   if(month==13 && month==14)都应该改成   if(month==13 || month==14) 实际上month不可能既等于13也等于14，因此你1/2月份的输出都是错的。  楼上说的“还有你这只输出了13，14也就是1，2月的情况，并没有输出3-12月的情况，再if后面再加个else if就好了” 估计是看错了，你的输出是对的。 但是我改了仍然不行啊，为什么呢？[/quote]

算法对的，但是1、2月份的状况没处理好，如何改进见代码。    #include<stdio.h>  int main() { 	int year,month,week,j,a,b,c,y,a1,a2,a3; 	scanf("%d",&year); 	for(month=3; month<=14; month++) { 		if(month==13 || month==14) 			year--;  //是1、2月份则计算时年份-1  		c=year/100; 		y=year-c*100; 		a=y-2*c+12; 		a1=c/4; 		a2=y/4; 		a3=26*(month+1)/10; 		week=a1+a2+a3+a; 		if(week<0) { 			week+=7; 		} 		week%=7; 		if(month==13|| month==14) 			year++; // 算完再加回来，恢复原状。  		if(week==5) { 			//正确的month用 month>12?month-12:month即可，不要直接去修改。  			printf("%d-%d-13\n",year,month>12?month-12:month); 		} 	} 	return 0; }

只用if不也可以输出3到12月的情况吗？

引用 6 楼 qq_43428547的回复:刚刚看到你的贴子，不知道黑色星期5，也不知道这个公式，所以插了下，自己写了个代码，把你的代码和我的跑结果比较了下，发现，你把&&改为||后，month不能进行自减，输出时减12就好了，还有你这只输出了13，14也就是1，2月的情况，并没有输出3-12月的情况，再if后面再加个else if就好了 改了还是不行呀，怎么回事呢？

引用 7 楼 636f6c696e的回复:两处   if(month==13 && month==14)都应该改成   if(month==13 || month==14) 实际上month不可能既等于13也等于14，因此你1/2月份的输出都是错的。  楼上说的“还有你这只输出了13，14也就是1，2月的情况，并没有输出3-12月的情况，再if后面再加个else if就好了” 估计是看错了，你的输出是对的。 但是我改了仍然不行啊，为什么呢？

引用 13 楼 qq_43428547 的回复:嗯，楼下有人帮你解决了，我看了下 你是先判断week == 5，再year++的 但是year==13时，week！=5，这样year就不会++了， 年份比之前少了1哦 你可以每次for循环式都给year一个初始值，或者把week的判断和month的判断调换一下位置

引用 13 楼 qq_43428547的回复:嗯，楼下有人帮你解决了，我看了下 你是先判断week == 5，再year++的 但是year==13时，week！=5，这样year就不会++了， 年份比之前少了1哦 好的，谢谢，已经可以了

引用 12 楼 636f6c696e的回复:你的代码有逻辑问题： #include<stdio.h>  int main() {  int year,month,week,j,a,b,c,y,a1,a2,a3;  scanf("%d",&year);   for(month=3;month<=14;month++)   {    if(month==13)        year--;    c=year/100;    y=year-c*100;    a=y-2*c+12;    a1=c/4;    a2=y/4;    a3=26*(month+1)/10;    week=a1+a2+a3+a;    if(week<0){ week+=7;}    week%=7;    if(week==5)    {  if(month==13 || month==14)     printf("%d-%d-13\n",year + 1,month - 12);  else     printf("%d-%d-13\n",year,month);    }   }   return 0; } [quote=引用 8 楼 weixin_44504818 的回复:] [quote=引用 7 楼 636f6c696e的回复:]两处   if(month==13 && month==14)都应该改成   if(month==13 || month==14) 实际上month不可能既等于13也等于14，因此你1/2月份的输出都是错的。  楼上说的“还有你这只输出了13，14也就是1，2月的情况，并没有输出3-12月的情况，再if后面再加个else if就好了” 估计是看错了，你的输出是对的。 但是我改了仍然不行啊，为什么呢？[/quote][/quote] 好的，谢谢，已经可以了

引用 3 楼 focuslight的回复:for(month=3;month<=14;month++)   你的循环是从3月开始的吧 对呀，蔡勒公式不是得把一月和二月当十三月和十四月吗？

有人帮我看一下嘛？谢谢啊

有没有大佬帮忙看看呀

有人吗，帮忙看看好吗，谢谢大佬


Question: 关于C语言中printf打印多个字符串问题

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

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

求助大佬！！！

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

实验调整打印顺序，证实五楼结论。结贴

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


Question: 跪求赵4老师（赵中老师）在三年前出的系列公开课完整课程(10集)

系列课程安排：  1 代码要素  2 函数  3 数组和二维数组  了解指针与数组对应的汇编内存地址。  通过一维数组实例了解指针与数组对应的汇编内存地址。  通过二维数组实例了解指针与数组对应的汇编内存地址。  4 三维数组  5 带头节点的单链表  6 无头节点的单链表  7 双向链表  8 循环双向链表  9 十字链表(上)  10 十字链表(下)


Question: 大佬们帮我看看这个求方程的根的程序哪里出错？？

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

#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; }


Question: 菜鸟求教。。

引用 1 楼 qq_38834405 的回复：很详细。真的感谢

引用 1 楼 qq_38834405 的回复：感谢


Question: 谁知道如何用Windows编程(c语言)在其他窗口上面显示文字

C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

#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    这里的函数的参数你自己查

SetWindowText

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

报什么错？ 贴出来吧 可能你没取对窗口句柄

你说的是MFC吗。。

来人啊。。。。。


Question: 控制台窗口无法接收消息吗？

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

控制台窗口对你的程序来说不是真正的窗口，没有消息循环的


Question: 单链表求解!!

NULL 表示链表的终止点。

函数参数里面的*代表指针传参，pre = NULL是为了初始化，先置为空

噢是head=NULL


Question: C语言 fopen读文件出错问题

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

你确定是打开文件报的错吗。相关代码贴上来，你的描述对解决你的问题没有丝毫的帮助。


Question: 为什么我的p3->data写出来是乱码，求解大佬，怎样修改，这是基于c语言的LRU算法基本程序。请大佬看下

引用 6 楼 九华山小和尚 的回复:[quote=引用 5 楼 user-1的回复:][quote=引用 4 楼 九华山小和尚 的回复:] [quote=引用 2 楼 user-1的回复:]这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 p3data是首元结点，然后我循环出问题了[/quote]  等空了给你改改[/quote] 大佬你毕业了吗[/quote]  你家大佬操作系统原理考了100分…… 看了1小时，觉得你的算法好像不大对，*p1 - *p6看着脑壳疼。改程序太费时间了，所以重新写了供你参考 LRU用双链表实现算法看access（）函数~~没你弄得那么复杂~~  你是想做下图的算法对吧~~   上代码~~  #include <stdio.h> #include <stdlib.h> #define LEN 4  //最大页帧数 int count = 0; //缺页次数 typedef int Elemtype; typedef struct Node { 	Elemtype data; 	struct Node *next; 	struct Node *prior; }Node, Stack, *pStack;  int Init(pStack s);//初始化堆栈 void Print(const pStack s);//打印页表 int destroy(pStack s);//清空链表  Node * pick_PF(pStack s, const Elemtype e);//寻找页帧是否在栈中存在，存在：摘出并返回此页帧。 int push(pStack s, Node * n);//将页帧移至栈顶 int access(pStack s, const Elemtype e); //访问<<===LRU算法主要体现在这里。  int main() { 	int  ref_str[100], n = 0; //引用串、长度 	Stack S; 	Init(&S); //建立一个堆栈--用双向链表维护  	printf("输入引用串数字，用空格隔开，-1结束。例如：1 2 3 4 1 2 5 1 2 3 4 5 -1\n"); 	scanf("%d", &ref_str[n]); 	while (ref_str[n] > 0) { 		n++; 		scanf("%d", &ref_str[n]); 	} 	//按引用串依次访问 	for (int i = 0; i < n; i++) { 		access(&S, ref_str[i]);//<<===LRU算法主要体现在这里。 		printf("%d : 缺页 %d 次  ",i+1,count); 		Print(&S); 	}  	destroy(&S); 	return 0; }  //寻找页帧是否在栈中存在，存在：摘出并返回此页帧。 Node * pick_PF(pStack s, const Elemtype e) { 	pStack p = s; 	while (p->next != s) { 		p = p->next; 		if (p->data == e) { 			//摘出并返回 			p->prior->next = p->next; 			p->next->prior = p->prior; 			return p; 		} 	} 	return NULL; }  //将页帧压入栈顶 int push(pStack s, Node * n) { 	if (s == NULL || n == NULL) return 0; 	n->prior = s; 	n->next = s->next; 	s->next->prior = n; 	s->next = n; 	return 1; }  //访问 int access(pStack s, const Elemtype e) {  	Node* n; 	//如页帧存在，移至栈顶，返回。 	if (n = pick_PF(s, e)) { 		push(s, n); 		return 1; 	}  	//否则，缺页。 	if (s->data > 0) {//如有空间，产生新页帧 		n = (Node*)malloc(sizeof(Node)); 		s->data--; 	} 	else {//没有空间，换出栈底部的页帧，它是最久没被访问过的。 		n = pick_PF(s, s->prior->data); 	} 	n->data = e; 	push(s, n);//将其移至栈顶 	count++;  //缺页次数+1 	return 1; }  int del_node(pStack s, Elemtype e) { 	Node * p; 	if (p = pick_PF(s, e)) { 		free(p); 		s->data++; 	} 	return 1; } //清空链表 int destroy(pStack s) { 	Node *t, *p = s->next; 	while (p != s) { 		t = p->next; 		free(p); 		p = t; 	} 	s->next = s->prior = s; 	s->data = LEN; 	return 1; } //打印页表 void Print(pStack s) { 	pStack p = s; 	while (p->next != s) 	{ 		p = p->next; 		printf("| %3d |", p->data); 	} 	printf("\n"); } //初始化堆栈 int Init(pStack s) { 	if (s == NULL) 		return 0; 	s->next = s->prior = s; 	s->data = LEN; 	return 1; }

引用 5 楼 user-1的回复:[quote=引用 4 楼 九华山小和尚 的回复:] [quote=引用 2 楼 user-1的回复:]这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 p3data是首元结点，然后我循环出问题了[/quote]  等空了给你改改[/quote] 大佬你毕业了吗

引用 4 楼 九华山小和尚 的回复:[quote=引用 2 楼 user-1的回复:]这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 p3data是首元结点，然后我循环出问题了[/quote]  等空了给你改改

引用 2 楼 user-1的回复:这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 p3data是首元结点，然后我循环出问题了

引用 2 楼 user-1的回复:这代码看的我脑壳疼。。。 当p5是尾节点时，p3->data是头节点data值，没赋值过所以乱码。 CreatList写的实在太风骚了，遭不住。。。 我改出来了，好多小错误，不过还是改出来了，实在太菜了

大佬帮帮我


Question: 数字华容道代码

zero[1]:c 这句注释了吧

大量这种没有缩进的程序 怎么读啊？

zero[1]:c  这一句是不是有问题。

是有什么问题吗？不知道该如何修改了


Question: c语言符号表达式

引用 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]  实际编程中，请不要使用这种 自我复杂化的表达式。因为很容易自我作死(^_^)。当然作为研究、探索编译器运作方式还情有可原。

引用 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。

i=(a=2*3,a*5),a+6; 这里面就只有一次a=出现，如果没有=怎么赋值。a+6只是得到一个12，并没有=来进行赋值


Question: 想问数据结构返回栈的长度，当栈中元素有12个是用s.top-s.base返回栈长度为什么显示的是11个？

我查了很久也没有弄明白，真心求教啊，谢谢啊


Question: 大神们啊，以后遇到这种题咋办(´;︵;`)

高中生就学了诶。这个规律很明显的。

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

杨辉三角 百度应该比我说的详细


Question: 求助大佬

引用 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啊。还用并且干嘛，你确定这里没错吗？

引用 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] 是我粗心，打错了，

if((65 <= a && a <= 90) || (97 <= a && a <= 122))

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

我想知道出错的原因

能否告诉我为什么会出错?

#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; }  供参考～

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

能细说下不能用的原因吗

while((a=getchar()) != '\n')

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

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

a大于等于65并且a大于等于90?

65<=a&&a>=90||97<=a&&a>=122  几个意思

循环内有2个getchar，必须去掉一个


Question: 没有初始赋值怎么会显示数字？

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

若没有赋值，那么局部变量里的值是随机数，这个值可能是之前的函数栈留下来的。


Question: Permission denied

哪里显示permission denied，有截图吗

重装系统 或者装个虚拟机试试

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

权限不足，windowds的话以管理员运行，linux的话sudo


Question: gcc和vs编译相同代码，运行结果不同

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

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


Question: for循环结构的一个问题

引用 6 楼 niiiloc的回复:sum位置没啥问题，估计是题目搞错了 引用 5 楼 qq_35909809 的回复:答案是它的位置有问题，我想知道它的正确位置在哪里以及为什么题目中的位置不对 正解，应该是题目问题

对于c++等其他语言来说，给float类型的变量赋值要加F，不加F就是double类型了，所以前面有人说是0.0F的问题，但是看你这个的头文件，应该是C语言，虽然看不出来哪里有问题，但是记得以前写C的时候，一般是在定义变量的时候就要给一个初值，也就是float sum=0;float avg=0;....然后把sum=0放在循环的最下面这样就行了。 除了上面这个，还可以试试把sum定义成全局变量，就是放在函数外面，float前面加static

引用 6 楼 niiiloc的回复:sum位置没啥问题，估计是题目搞错了 引用 5 楼 qq_35909809 的回复:答案是它的位置有问题，我想知道它的正确位置在哪里以及为什么题目中的位置不对 嗯，我去问一下老师。多谢

答案是它的位置有问题，我想知道它的正确位置在哪里以及为什么题目中的位置不对

0.0默认是double类型 0.0f才是float类型

想了半节课硬是没搞懂

这个sum=0.0，我认为就是给内循环赋初值，书上也见过相似的例子，就是那个求1的阶乘2的阶乘一直到n的阶乘的和，也是在外面给那个累乘求积变量赋初值


s=n*s/10，你还没有对s初始化，所以系统自动给它赋值为0.0了，你可以先对s变量直接输出就会发现了

引用 6 楼 qq_34840204的回复:s是啥，你也没初始化，默认值为0 变量没有初始化，默认值不是0，是个随机值，也可能是之前内存残留的值

变量没有初始化，默认值不是0，是个随机值，也可能是之前内存残留的值

s是啥，你也没初始化，默认值为0

第7行： s = n*a / 10.0;

没看到你的s = n * s /10;中s没有初始化吗？还是你这句写错了呢，输入的a去哪了？

s=n*a/10; 你写的是s=n*s/10;

s的赋值语句参数写错了。。


Question: C语言小白

你调用函数的形参是数组，你那句调用的语句实参是数组下标为10的数，当然不可以传递了，直接把数组名当实参传递就行了。

实参有问题，在调用eval函数时，去掉数组后面[10]，因为数组名是地址，而str[10]是表示下表为10的数组元素，并且也已经越界了。

引用 2 楼 张小白1.0 的回复:你用数组传参，传的是地址，所以参数应该写str[] 和 ch[]   然后在调用函数的时候写数组名就可以了eval(str,ch);纠正一下，前面的不用改，只用在调用时输入数组的地址就好了

把数组能赋给了变量sum？


Question: 这个错误的问题是什么

引用 6 楼 qhmoon 的回复:[quote=引用 4 楼 jiht594 的回复:] [quote=引用 3 楼 jiht594 的回复:] 为什么只能用%c，而不能使用%s 看书 既然存在%c和%s、它们必然用法是不相同或者不完全相同。自己看看有什么区别[/quote] c是单个字符，s是单个字符或字符串[/quote] 怎么得出来的？代码贴上来

引用 4 楼 jiht594 的回复:[quote=引用 3 楼 jiht594 的回复:] 为什么只能用%c，而不能使用%s 看书 既然存在%c和%s、它们必然用法是不相同或者不完全相同。自己看看有什么区别[/quote] c是单个字符，s是单个字符或字符串

引用 2 楼 自信男孩 的回复:如果想输出%s，建议后面的str1[i]改成str1 + i;因为str1+i是表示地址。  按你的思路调整了一下 输出结果： 输入：hello 输出： hello ello llo lo o

引用 3 楼 jiht594 的回复:为什么只能用%c，而不能使用%s 看书 既然存在%c和%s、它们必然用法是不相同或者不完全相同。自己看看有什么区别

为什么只能用%c，而不能使用%s 看书

因为%c后面跟的是一个变量值，而%s后面要跟的是地址，即需要告诉它一个地址开始的字符串（知道遇到'\0'停止输出）。 根据str1[i]这个是一个比较小的值（你输入的值），而这个值作为地址的内存空间不可以访问，所以导致异常，程序异常退出。


Question: 为啥选D？谁给个解释

sum是个递归函数，这时你需要理解这个递归函数的功能是什么，最重要的一句是“return array[0]+sum(array+1,len-1);”，假如len为1，这条语句就相当于array[0]+array[1]，因为再次调用的时候传的长度为0，返回array[0]，但这个array的值对于外面一层来说是array+1，所以传回来的是(array+1)[0]，其实就是array[1]。 同样的，当len为2可以发现这句的结果是array[0]+array[1]+array[2]，所以我们可以得出结论：函数sum的功能是求出数组array[0]+···+arr[len]的和。 再看main，调用语句是sum(array,4)，那么就是求array[0]+···+array[4]的和，你加起来就是15了。 如果你实在不理解，可以把自己当成计算机来一步一步运算一遍，反正也没几层递归。

array[0]+sum(array+1,3); ： sum(array+1,3) =   array[0]' + sum(array+1,2);  =>array[0]+ array[1] + sum(array+1,2);      array[0]+ array[1] + array[2] + sum(array+1,1);      array[0]+ array[1] + array[2] + array[3] +  array[4]

递归，最后是5+4+3+2+1=15，注意return array[0] + sum(array+1, len-1)并不是所有的array[0]都是指1，因为需要注意下array+1实参，即只有第一次递归的的array[0]是1，第二次是(array+1)[0]即2，第三次递归实在第二次的基础上又加了1，即是3等等，知道len=0，此时array[0]即5，所以再根据递归的返回，所以最后一次是5， 倒数第二次是4，依次3， 2， 1；所以是5+4+3+2+1  之所以是5+4...+1而不是1+2+...+5，因为函数栈是先进后出，最先确定是array[0]是5.


Question: 关于二维数组传递的问题

引用 1 楼 自信男孩的回复:二维数组形参，至少要定义列数，即行数可以不确定，但是列数必须要确定。 直接int **ptr不可以吗，我看见有些程序这样写了

二维数组形参，至少要定义列数，即行数可以不确定，但是列数必须要确定。


Question: C语言中求三角形面积怎么会这样

double和float不对应

书本上也可能印错的！

是double的问题吧

怎么样结帖的

引用 7 楼 niiiloc 的回复：都告诉你错了，还不肯去试试，还在这边躺着耍无赖么？？要么你自己看错了要么书本印刷错了 引用 5 楼 qq_44870309 的回复:引用 1 楼 niiiloc 的回复：是lf不是1f，记得结贴：）是1f,按照书本输的你是对的，确实书本的1和l一样

引用引用 1 楼 niiiloc 的回复： 是lf不是1f，记得结贴：） 是1f,按照书本输的 书上的l和1长得一样

引用 3 楼 qq_41919458 的回复：用float定义试试，把%lf改成%f按照书本输的

按照书本输入的

应该是英文的逗号问题。检查一下输入的逗号是不是成中文了？！

是lf不是1f，记得结贴：）

用float定义试试，把%lf改成%f


Question: C语言写登录程序，输入作为一个函数，判断作为一个函数，该如何连接起来？

修改完毕： #include <stdio.h> #include "s_gets.h" #include <string.h> #include <windows.h> #define FG "*****************************" int sr(void); int yz(char *zh,char *mima); static const char zhanghao[30] = { "cuihe500" }; static const char zmima[30] = { "870219176" }; int main(void) { 	system("color A4"); 	SetConsoleTitle(L"登录系统"); 	printf("%s\n", FG); 	printf("%s\n", "欢迎使用登录系统！"); 	printf("%s\n", FG); 	while (1) 	{ 		if (sr()) 		{ 			break;		//break;不能用于IF语句中 该break;是用于while语句中 如果sr返回值为1 跳出循环 		}  	} 	return 0; } int sr(void) { 	char zh[30]; 	char mima[30]; 	int a,b; 	do 	{ 		printf("请输入账号:"); 		while (!scanf_s("%s", zh, 30)) 		{ 			printf("输入错误，请检查后重新输入！\n");  		} 		printf("请输入密码:"); 		while (!scanf_s("%s", mima, 30)) 		{ 			printf("输入错误，请检查后重新输入！\n"); 		} 		b=yz(zh, mima); 	} while (b);		//do while 当while()判断为假时 关闭循环 	return 1; }  int yz(char *zh, char *mima ) { 		if (strncmp(zhanghao,zh,30)) 		{ 			printf("不存在的用户名！请检查后重新输入!\n"); 			rewind(stdin); 			return 1; 		} 		else if (strncmp(mima, zmima,30)) 		{ 			printf("密码错误！请重新输入\n"); 			rewind(stdin); 			return 1; 		} 		else 		{ 			printf("登录成功！欢迎使用该系统！\n"); 			system("pause"); 			return 0; 		} }

把函数sr中定义的2个变量zh和mima，拿出来，放到main函数中定义 sr函数重新定义为： int sr(char *zh, char*mima) 修改main函数调用sr的方式： while(1) {     if (sr) {         break;     } }


Question: 萌新求教一些C语言问题

引用 1 楼 user-1 的回复:fgets输入的字符串 最后会有一个换行符\n 所以永远不会想等 我已经找到问题了 和您说的一样 后面改用scanf_s();后问题解决！感谢您的帮助！

fgets输入的字符串 最后会有一个换行符\n 所以永远不会想等


Question: python

如果用 Python编程， 应该可以查到类似例子。 如果用 C++编程，可麻烦了。


Question: 有没有大佬告诉我一下这题考的什么知识点，面试题没写出来...

逻辑题，题目理解为 板子1电容数 大于 板子2电容数 板子2电容数 大于 板子4电容数 板子1电容数 大于 板子4电容数 板子4电容数 大于 板子3电容数 最后比较2  和  3 因为2大于4     4大于3 所以2大于3 前者大返回值为1


Question: 输入数字金字塔，不能只用rintf

#include <stdio.h> #include <stdlib.h>  int main() {     int i,j;     for(i=1; i<=9; i++)     {         for(j=9-i; j>=1; j--)         {             putchar(' ');         }         for(j=1; j<=(2*i-1)/2+1; j++)         {             putchar(j+'0');         }         for(j=(2*i-1)/2; j>=1; j--)         {             putchar(j+'0');         }         putchar('\n');      }     return 0; }

<!DOCTYPE html> <html> <head> 	<title>数字金字塔</title> </head> <body>  <?php for($i=1; $i<=9; $i++)     {         for($j=9-$i; $j>=1; $j--)         {              echo "    ";          }         for($j=1; $j<=(2*$i-1)/2+1; $j++)         {             echo "$j  ";         }         for($j=(2*$i-1)%$i; $j>=1; $j--)         {             echo "$j  ";         }         ?>         <br>         <?php              }   ?>  </body> </html>

#include<stdio.h>  main() {     int n,i,j=0;     printf("请输入金字塔的高度（打印数字行数）：");      scanf("%d",&n);      for(i=1; i<=n; i++)     {         for(j=n-i; j>=1; j--)         {             printf(" ");         }         for(j=1; j<=(2*i-1)/2+1; j++)         {             printf("%d",j);         }         for(j=(2*i-1)/2; j>=1; j--)         {             printf("%d",j);         }         printf("\n");      } }


Question: 有人给看看咋回事吗

你是说运行完整的exe吗？exe结束后窗口就会消失，你想要看到结果，就让程序继续运行，比如可以在整体上加循环，或是在最后加getchar()或system("pause")

你的居然会闪退，vc都不会……

楼上说的对，因为程序执行完成了，所以退出了

最后加上这句getchar();

代码没什么问题，在main末尾加一句system("pause");试试

在最后加个死循环呗,类似while(1)这样的

引用 1 楼 盲侠z的回复:在主函数最后加上while(1); while（1）可行  但不知道对程序有没有影响


Question: c语言问题，为什么delete，search，edito函数不能调用链表，怎么改

#include<stdio.h> #include<stdlib.h> //#include<conio.h> #include<string.h>  /*定义结构体*/ int n=0; struct student {     //char ID[4];     char ID[16]; //for '\0'     char name[20];     float score;     struct student *next; };  /*创建一个只有头结点的空链表*/ struct student *create_head() {     struct student *head;     head = (struct student*)malloc(sizeof (struct student) );     if(head==NULL)             //小心别漏这个     {         printf("申请头结点失败!\n");         return NULL;     }     head->next = NULL;     return head; }  /*将s指向的结点插入链表,使链表保持升序,并返回头结点*/ struct student *add(struct student *head) {     struct student *p = head;     struct student *s;     s = (struct student*)malloc( sizeof(struct student) );     printf("输入学生信息:\n");     while(1)//判断学号是否合理     {         printf("学号:");         scanf("%s",s->ID);         if(strlen(s->ID)==4)         {             printf("姓名:");             scanf("%s",s->name);             printf("成绩:");             scanf("%f",&s->score);             break;         }         else         {             printf("输入非法：学号必须为4位，请重新输入\n");             continue;         }     }     while(p->next!=NULL&&strcmp(s->ID,p->next->ID))//特别注意&&左右不能写反,若s最大,最后p->next=NULL,p->next->ID运行出错         p=p->next;     if(p->next==NULL) //s->ID最大的情况     //其实两种情况可以并在一块写     {         p->next=s;    //连接结点         s->next=NULL;   //p->next就等于NULL     }     else     {         p->next=s;    //连接结点         s->next=p->next;     }     n = n+1;      return head; } void Mainmenu() {     printf("=================\n");     printf("|        1.添加学生        |\n");     printf("|        2.查询学生        |\n");     printf("|        3.编辑学生        |\n");     printf("|        4.删除学生        |\n");     printf("|        5.打印全部        |\n");     printf("|        6.总人数          |\n");     printf("|        7.退出系统        |\n"); } /*查找符合条件的结点,并返回指向该结点的指针*/ void search(struct student *head) {     struct student *p=head->next;     char a[20];     int f=0;     printf("请输入要查找学生的学号:\n");     scanf("%s",a);     for(;p!=NULL;p=p->next)         if(!strcmp(a,p->ID))         {             printf("学号为%s的学生信息为:姓名(%s) 成绩(%f)\n",p->ID,p->name,p->score);             f=1;             break;         }     if(!f)         printf("该学生不存在\n"); }  /*输出链表各结点的值,也称对链 输出链表各结点的值,也称对链表的遍历*/ void print(struct student *head) {     struct student *p;     printf("  链表如下:  \n");     p=head->next;     while(p!=NULL)     {         printf("学号为%s的学生信息为:姓名(%s) 成绩(%f)\n",p->ID,p->name,p->score);         p=p->next;     } } /*释放链表*/ void free_list(struct student *head) {     struct student *p=head ;     printf("释放链表:\n");     while(p!=NULL)     {         head = head->next;         free(p);         p = head;     }     printf("释放链表成功!\n"); } /*删除链表中值为ID的结点,并返回链表的首指针*/ void delete_note(struct student *head) {     struct student *p1=head->next , *p2=head ;     char a[4];     printf("选择删除功能:\n");     printf("1.根据学号删除学生信息\n");     printf("2.删除所有学生信息\n");     //switch(getch())     getchar();     switch(getchar())     {         case '1':             {                 printf("请输入要删除学生的学号:");                 scanf("%s",a);                 while(p1!=NULL&&strcmp(p1->ID,a)!=0)//特别注意&&左右条件不能调换,若调换如果p1指向NULL时p1->ID运行出错                 {                     p2 = p1;                     p1 = p1->next;                 }                 if(p1==NULL) {   //特别注意两个if不能调换,若调换如果p1指向NULL时,p1->ID运行出错                     printf("找不到符合删除要求的结点!!!\n");                     break;                 }                 if(strcmp(p1->ID,a)==0)                 {                     p2->next = p1->next;                     free(p1);                     printf("结点删除成功!\n");                 }             }             break;         case '2':             {                 free_list(head);    //少了这一步会导致内存泄露                 head=NULL;                 printf("已删除全部学生\n");             }             break;     } } void Edit(struct student *head) {     char a[20],b[20];     float c;     struct student *p=head;      printf("请输入要编辑学生的学号:");     scanf("%s",a);     getchar();      while(1)     {         if(strcmp(p->ID,a)==0)         {             printf("请选择修改项目:\n");             printf("1.姓名\n");             printf("2.分数\n");             //switch(getch())             switch(getchar())             {                 case '1':                     {                         printf("请输入修改后的姓名:");                         scanf("%s",b);                         strcpy(p->name,b);                     }                 case '2':                     {                         printf("请输入修改后的分数:");                         scanf("%f",&c);                         p->score = c;                     }             }             break;         }         else             p = p->next;         if (!p)             break;     }     if(p==NULL)     {         printf("学号不存在，请重新输入\n");     } } void PrintCnt() {     printf("%d",n); } //void main() int main() {     struct student *p , *head ;     head=create_head();     while(1)     {         Mainmenu();         //switch(getch())         switch(getchar())         {             case '1':                 {                     add(head);                     break;                 }             case '2':                 {                     search(head);                     break;                 }             case '3':                 {                     Edit(head);                     break;                 }             case '4':                 {                     delete_note(head);                     break;                 }             case '5':                 {                     print(head);                     break;                 }             case '6':                 {                     PrintCnt();                     break;                 }             case '7':                 exit(0);             default:                 break;         }         getchar();     } }  供参考 已经修改了一些codes，但是测试发现代码里还有些逻辑错误，建议继续调试。


Question: 萌新第一次求教，帮下忙自己找不出问题！！

一下没注意越界问题 - -，后面那个realloc还没用过，研究一下,提高代码可读性，变量定义成字母是因为想测试一下指针和数组的联系，一般可能会定义成英文单词吧？如果我认真起来用拼音定义还是可以的，英文不好

第一次调用f函数，没问题。不过第一次申请空间的语句建议改成这样：int *a = (int *)malloc(sr * sizeof(sr));因为这样的代码可移植性高一些； 第二次对sr重新输入值，如果这个值大于第一次输入的sr值，就会导致a越界了。通过你的测试用例可知，程序出错是因为内存越界了。 第二次在使用a时，建议使用realloc一下：  a = (int *)realloc(a, sr * sizeof(sr));  if (!a)     exit(0);  至于学不学C++， JAVA,要看你要解决什么问题，C语言是偏底层的语言，主要用于嵌入式方向，比如驱动开发。而C++和C有很大不同，应用的领域也是有差异的，C++的面向对象开发可以用于客户端的开发等等，JAVA就是更跟底层不关了，现在互联网的软件或页面很多是用JAVA写的。  如果你还是一个学生，建议你根据自己的爱好，将来想从事那个领域来确定要深入学习那门语言。  另外，一个好的编码风格里没有将函数定义成一个字母的，你的编码风格还差得远，一步一步来吧，先把程序写的没问题，然后再考虑把代码的可读性提高上去，因为代码除了自己要看，要看明白，也是需要给别人看的，让别人看到你的函数名就能知道这个函数是做什么的最好了。  要精通一门语言不是一天两天的事情，加油吧

推荐拙作，供参考。 ==> https://blog.csdn.net/weixin_44732817/article/details/88530993。


Question: 照着c教材打的 怎末用vc6.0运行就很多错误 求看下哪里错了

引用 3 楼 weixin_44136834 的回复:你的代码运行完什么也不显示 我怀疑你的逻辑是有问题的，虽然语法错误没有了，但不等于程序能正常运行呢 建议你自己改改逻辑或者一句一句和书本上的对一下

你的代码运行完什么也不显示

你的代码运行完什么也不显示

#include<stdio.h> #include<stdlib.h>  struct Matrix_Descriptor{     int m;     int n;     double **base; };  //typedef strut Matrix_Descriptor Matrix; typedef struct Matrix_Descriptor Matrix;  Matrix * GetMatrixSpace(int m,int n) {     int counter;     Matrix *matrix;      matrix = (Matrix *)malloc(sizeof(Matrix));     if(matrix==NULL){         return(NULL);     }     matrix->base= (double **)malloc(m*sizeof(double *));     if(matrix->base==NULL){         free(matrix);         return(NULL);     }     //matrix->base[0] = malloc(m*n*sizeof(doublr));     matrix->base[0] = (double *)malloc(m*n*sizeof(double));     if(matrix->base[0]==NULL){         free(matrix->base);         free(matrix);         return(NULL);     }     matrix->m=m;     matrix->n=n;     for(counter=1;counter<m;counter++){         matrix->base[counter]=matrix->base[0]+counter*n;     }     return(matrix); }  void FreeMatrixSpace(Matrix*matrix) {     free(matrix->base[0]);     free(matrix->base);     free(matrix); }  void TimeMatrix(Matrix*matrixTimes,double coe,Matrix*matrix){     int row,col;     //for(row=;row<matrix->m;row++){     for(row=0;row<matrix->m;row++){         //for(col=;col<matrix->n;col++){         for(col=0;col<matrix->n;col++){             matrixTimes->base[row][col]=coe*matrix->base[row][col];         }     } } void MultiplyMatrix(Matrix *matrixProdut,Matrix *matrix1,Matrix *matrix2) {     int row,col,k;     double sum;     for(row=0;row<matrix1->m;row++){         //for(col=0;colmatrix2->n;col++){         for(col=0;matrix2->n;col++){             sum=0;             for(k=0;k<matrix2->n;k++){                 sum+=matrix1->base[row][k]*matrix2->base[k][col];             }             matrixProdut->base[row][col]=sum;         }     } } void PrintMatrix(Matrix *matrix) {     int row,col;     for(row=0;col<matrix->m;row++){         for(col=0;col<matrix->n;col++){             printf("%10.21f",matrix->base[row][col]);         }         printf("\n");     } } main() {     Matrix *GetMatrixSpace(int,int);     void FreeMatrixSpace(Matrix *);     void AddMatrix(Matrix*,Matrix*,Matrix*);     void TimeMtrix(Matrix*,double,Matrix*);     void MultiplyMatrix(Matrix*,Matrix*,Matrix*);     //voif PrinMatrix(Matrix*);     void PrinMatrix(Matrix*);     int row,col;     //Matrix *matrix1,*matrix2, matrix3;     Matrix *matrix1,*matrix2, *matrix3;     matrix1=GetMatrixSpace(3,4);     if(matrix1==NULL){         exit(1);     }     matrix2=GetMatrixSpace(4,3);     //if(matrix2=NULL){     if(matrix2==NULL){         FreeMatrixSpace(matrix1);         exit(1);     }     matrix3=GetMatrixSpace(3,3);     //if(matrix2=NULL){     if(matrix2==NULL){         FreeMatrixSpace(matrix1);         FreeMatrixSpace(matrix2);         exit(1);     }     for(row=0;row<3;row++){         for(col=0;col<4;col++){             matrix1->base[row][col]=1;         }     }     for(row=0;row<4;row++){         for(col=0;col<3;col++){             matrix2->base[row][col]=row*3+col;         }     }     //MultiplyMatrix(matrix3,matrix1,matrix2);     MultiplyMatrix(matrix3,matrix1,matrix2);     //TimesMatrix(Matrix3,2,Matrix3);     TimeMatrix(matrix3,2,matrix3);     printf("Matrix1:\n");     PrintMatrix(matrix1);     printf("Matrix2:\n");     PrintMatrix(matrix2);     printf("Matrix3:\n");     //PrintMatrix(matrix3);     PrintMatrix(matrix3);     FreeMatrixSpace(matrix1);     FreeMatrixSpace(matrix2);     //FreeMatrixSpace(matrix3);     FreeMatrixSpace(matrix3); } 如果照着教材还能输入这么多错误：变量名大小写，类型不匹配，类型名拼错，循环不赋值等等问题。  既然要写一个200多行的代码，为什么不没写一个函数就编译一下呢，这样像单词拼写错误也不至于出现这么多呢。  上面的代码供参考，语法错误已经修复，感觉代码逻辑还有问题，建议对比教材重新梳理一下。


Question: 小白问一个很小白的问题……

明白了！！谢谢

直接的原因是上面 1 楼说的，最下面的一行语句 printf("%d",sum); 或者 printf("%d",p); 没有放在else的代码块内，也就是else的花括号内，所以，虽然上面程序是进入了if的代码块里（花括号），但是从if出来之后，还是会执行最后的printf语句一次。  另外，如果是从main函数本身的定义来看的话，实际上是因为缺少了返回值语句，即缺少了return语句。 编译的时候，如果设置的警告（warning）提醒条件严格的话，编译器应该是会提醒int main(){}函数缺少返回值的，虽然不是错误（error）。  所以，从比较规范的函数定义方式的角度来看的话，建议是增加return 语句。 （1）在if(n <= 0)的代码块（花括号）里，添加一行  return -1; // 这个返回值是返回给操作系统的，-1 是告诉操作系统程序运行出错了、提前结束。 （2）在main函数的最后，添加一行默认的 return 0; // 0 是告诉操作系统程序运行正常结束。 而这样一来， printf("%d",sum); 或者 printf("%d",p); 的位置就可以不变，不必放到else的花括号里面去了。

printf都没有被else的范围包进去。


Question: 求助求助！！！

这图看的眼睛疼

我估计你这里  if(a[j]>='a'&&a[j]<='z'||a[j]>='A'&&a[j]<='Z')	                                      s[ans][cnt++]=a[j];	          else break;	 跳出后回到大循环然后i++，把符号跳过了，你放两个连续的符号看看，能不能放一个进去

引用 1 楼 自信男孩的回复:不知道是CSDN的网站问题，还是提问者的手机像素问题，图片不清晰呢。建议直接贴代码吧 这是我的代码，我设置过断点尝试，发现它根本不走有关标点的if语句，请问该怎么修改，谢谢 len=strlen(a); void deal(char a[]) {     for(i=0;i<len;i++)	 {		    if(a[i]>='a'&&a[i]<='z'||a[i]>='A'&&a[i]<='Z')		     {			        ans++;			           cnt=0;			        for(j=i;;j++,i++)			        {				          if(a[j]>='a'&&a[j]<='z'||a[j]>='A'&&a[j]<='Z')					                                      s[ans][cnt++]=a[j];				          else break;		      	}	 	}		    else if(a[i]>='!'&&a[i]<='/')	 	{			        ans++;			        cnt=0;			        s[ans][cnt]=a[i];		    		     }	 else continue; } }


Question: 小白求大佬解答

主函数之前没有类型，建议看一下C语言的书，熟悉一下基本的结构 比如 int main() void main() 你这个main 之前加一个int 就能解决

引用 4 楼 qq_44710607 的回复:[quote=引用 3 楼 自信男孩的回复:]#include <stdio.h> int main() {     int Fahre, Celsius;     int min, max, i ;      min=0, max=300, i=20;     Fahre = min;      while (Fahre <= max){         Celsius = 5*(Fahre-32)/9;         printf("%d\t%d\n", Fahre,Celsius);         Fahre = Fahre+i;     }      return 0; }  供参考～ 可是它显示的是我的main（）这一步不对，我又不知道错在哪里[/quote] main是个函数是吧，函数要有返回值类型、参数的是吧？你的main没标参数还可以理解，毕竟编译器会帮你加，但是返回值的类型呢？没有返回值也要标void啊。

你图片里的main()前没有int啊，，

引用 1 楼 自信男孩的回复:图片不清晰，建议直接贴出代码 #include <stdio.h>   main() {     int Fahre, Celsius;     int min, max, i ;     min=0, max=300, i=20;     Fahre=min ;      while (Fahre<=max){         Celsius=5*(Fahre-32)/9;         pintf("%d\t%d\n",Fahre,Celsius);         Fahre=Fahre+i;} }

引用 3 楼 自信男孩的回复:#include <stdio.h> int main() {     int Fahre, Celsius;     int min, max, i ;      min=0, max=300, i=20;     Fahre = min;      while (Fahre <= max){         Celsius = 5*(Fahre-32)/9;         printf("%d\t%d\n", Fahre,Celsius);         Fahre = Fahre+i;     }      return 0; }  供参考～ 可是它显示的是我的main（）这一步不对，我又不知道错在哪里

图片不清晰，建议直接贴出代码


Question: 求教

先自己谢谢吧，这里是解决问题而非帮你做作业的

先自己谢谢吧，这里是解决问题而非帮你做作业的


Question: 数据结构，链表合并

去掉程序里sleep(10)语句，这个是我测试用的，没必要。但是发代码时又忘了去掉。

引用 8 楼 自信男孩的回复:#include <stdio.h> #include <malloc.h> #include <unistd.h>  typedef struct Node {     int data;     struct Node *next; }Node,*LinkList;  void InitList(LinkList *L) {     *L = (LinkList)malloc(sizeof(Node));     (*L)->next = NULL; }  void CreateFromHead(LinkList L) {     Node *s;     char c;     int flag=1;      while(flag)     {         c = getchar();         if (c == '\n')             continue;         if (c == '$')             break;         s=(Node *)malloc(sizeof(Node));         s->data=c;         s->next=L->next;         L->next=s;      }  }   //两个升序合并为一个降序 LinkList MergeLinkList(LinkList LA,LinkList LB) {     LinkList r, tmp;      Node *pa,*pb;     LinkList LC;      pa = LA->next;     pb = LB->next;     LC = LA;     LC->next = NULL;     r = LC;  #if 1     while (pa && pb) {         if (pa->data > pb->data) {             tmp = pb->next;             pb->next = r->next;             r->next = pb;             pb = tmp;         } else if (pa->data == pb->data) {             tmp = pb->next;             pb->next = r->next;             r->next = pb;             pb = tmp;             tmp = pa->next;             free(pa);             pa = tmp;         } else {             tmp = pa->next;             pa->next = r->next;             r->next = pa;             printf("%c ", pa->data);             pa = tmp;         }     }     while (pa) {         tmp = pa->next;         pa->next = r->next;         r->next = pa;         pa = tmp;     }     while (pb) {         tmp = pb->next;         pb->next = r->next;         r->next = pb;         printf("%c ", pb->data);         pb = tmp;     }     free(LB);  #else     while(pa!=NULL&&pb!=NULL)     {         if(pa->data<=pb->data)         {             r->next=pa;             r=pa;             pa=pa->next;         }         else         {             r->next=pb;             r=pb;             pb=pb->next;         }     }      if(pa)         r->next=pa;     else         r->next=pb;      free(LB); #endif     return(LC); }    void ReverseList(LinkList LC) {     LinkList p,q;      p = LC->next;     LC->next=NULL;      while(p!=NULL)     {         q=p->next;         p->next=LC->next;         LC->next=p;         p=q;     } }  void traverseList(LinkList head) {     LinkList p = head->next;      while (p) {         printf("%c ", p->data);         p = p->next;     }     putchar(10); }    int main() {     LinkList LA,LB,LC;      InitList(&LA);     printf("please input data of list LA:\n");     CreateFromHead(LA);     printf("output list LA:\n");     traverseList(LA);      InitList(&LB);     printf("please input data of list LB:\n");     CreateFromHead(LB);     printf("output list LB:\n");     traverseList(LB);      sleep(10);     printf("make list LC:\n");     LC = MergeLinkList(LA,LB);     printf("please output list LC:\n");     traverseList(LC);       return 0;  }   供参考  please input data of list LA: 654321$ output list LA: 1 2 3 4 5 6  please input data of list LB: 987654$ output list LB: 4 5 6 7 8 9  make list LC: please output list LC: 9 8 7 6 5 4 3 2 1 测试用例 好的，谢谢大佬，太感谢了!!!

引用 6 楼 jsx_SEVEN的回复:1.main（）如果要返回0，可以写int main（） 2.MergeLinkList（）的参数只有两个，调用的时候传了三个，可以写成 LC=MergeLinkList（LA,LB）; 3.*LinkList本身就是指针类型，InitList（）可以直接LinkList L； 改了之后，只能打出LA的链表，之后就发生错误了，LB和LC都没办法打出来

引用 1 楼 会飞的鱼～的回复:你把代码贴出来吧，这些图片看得眼睛花，还看不清楚 #include <stdio.h>  #include <malloc.h>    typedef struct Node  {      int data;      struct Node *next;    }Node,*LinkList;    void InitList(LinkList *L)  {      *L=(LinkList)malloc(sizeof(Node));      (*L)->next=NULL;  }    void CreateFromHead(LinkList L)  {     Node *s;     char c;     int flag=1;     while(flag)     {       c=getchar();       if(c!='$')       {          s=(Node *)malloc(sizeof(Node));          s->data=c;          s->next=L->next;          L->next=s;       }       else flag=0;     }  }    LinkList MergeLinkList(LinkList LA,LinkList LB)  {     LinkList r;     Node *pa,*pb;     LinkList LC;     pa=LA->next;     pb=LB->next;     LC=LA;     LC->next=NULL;     r=LC;     while(pa!=NULL&&pb!=NULL)     {        if(pa->data<=pb->data)        {           r->next=pa;           r=pa;           pa=pa->next;        }        else        {           r->next=pb;           r=pb;           pb=pb->next;        }     }     if(pa)     r->next=pa;     else     r->next=pb;     free(LB);     return(LC);  }    void ReverseList(LinkList LC)  {      LinkList p,q;      p=LC->next;     LC->next=NULL;     while(p!=NULL)     {        q=p->next;        p->next=LC->next;        LC->next=p;        p=q;     }  }    void main()  {       LinkList LA,LB,LC;     printf("please input data of list LA:\n");     CreateFromHead(LA);     printf("output list LA:\n");     printf("please input data of list LB:\n");     CreateFromHead(LB);     printf("output list LB:\n");     printf("make list LC:\n");     MergeLinkList(LA,LB,&LC);     printf("please output list LC:\n");       return 0;  }  #include <stdio.h>  #include <malloc.h>    typedef struct Node  {      int data;      struct Node *next;    }Node,*LinkList;    void InitList(LinkList *L)  {      *L=(LinkList)malloc(sizeof(Node));      (*L)->next=NULL;  }    void CreateFromHead(LinkList L)  {     Node *s;     char c;     int flag=1;     while(flag)     {       c=getchar();       if(c!='$')       {          s=(Node *)malloc(sizeof(Node));          s->data=c;          s->next=L->next;          L->next=s;       }       else flag=0;     }  }    LinkList MergeLinkList(LinkList LA,LinkList LB)  {     LinkList r;     Node *pa,*pb;     LinkList LC;     pa=LA->next;     pb=LB->next;     LC=LA;     LC->next=NULL;     r=LC;     while(pa!=NULL&&pb!=NULL)     {        if(pa->data<=pb->data)        {           r->next=pa;           r=pa;           pa=pa->next;        }        else        {           r->next=pb;           r=pb;           pb=pb->next;        }     }     if(pa)     r->next=pa;     else     r->next=pb;     free(LB);     return(LC);  }    void ReverseList(LinkList LC)  {      LinkList p,q;      p=LC->next;     LC->next=NULL;     while(p!=NULL)     {        q=p->next;        p->next=LC->next;        LC->next=p;        p=q;     }  }    void main()  {       LinkList LA,LB,LC;     printf("please input data of list LA:\n");     CreateFromHead(LA);     printf("output list LA:\n");     printf("please input data of list LB:\n");     CreateFromHead(LB);     printf("output list LB:\n");     printf("make list LC:\n");     MergeLinkList(LA,LB,&LC);     printf("please output list LC:\n");       return 0;  }  #include <stdio.h>  #include <malloc.h>    typedef struct Node  {      int data;      struct Node *next;    }Node,*LinkList;    void InitList(LinkList *L)  {      *L=(LinkList)malloc(sizeof(Node));      (*L)->next=NULL;  }    void CreateFromHead(LinkList L)  {     Node *s;     char c;     int flag=1;     while(flag)     {       c=getchar();       if(c!='$')       {          s=(Node *)malloc(sizeof(Node));          s->data=c;          s->next=L->next;          L->next=s;       }       else flag=0;     }  }    LinkList MergeLinkList(LinkList LA,LinkList LB)  {     LinkList r;     Node *pa,*pb;     LinkList LC;     pa=LA->next;     pb=LB->next;     LC=LA;     LC->next=NULL;     r=LC;     while(pa!=NULL&&pb!=NULL)     {        if(pa->data<=pb->data)        {           r->next=pa;           r=pa;           pa=pa->next;        }        else        {           r->next=pb;           r=pb;           pb=pb->next;        }     }     if(pa)     r->next=pa;     else     r->next=pb;     free(LB);     return(LC);  }    void ReverseList(LinkList LC)  {      LinkList p,q;      p=LC->next;     LC->next=NULL;     while(p!=NULL)     {        q=p->next;        p->next=LC->next;        LC->next=p;        p=q;     }  }    void main()  {       LinkList LA,LB,LC;     printf("please input data of list LA:\n");     CreateFromHead(LA);     printf("output list LA:\n");     printf("please input data of list LB:\n");     CreateFromHead(LB);     printf("output list LB:\n");     printf("make list LC:\n");     MergeLinkList(LA,LB,&LC);     printf("please output list LC:\n");       return 0;  } 可以帮我看一下吗

引用 3 楼 自信男孩的回复:贴图片还不如把源码贴出来。  把升序的两个表合并成降序建议新的链表采用头插法，即每次找到两个链表较大的一个放到链表头前一个节点。 #include <stdio.h>  #include <malloc.h>    typedef struct Node  {      int data;      struct Node *next;    }Node,*LinkList;    void InitList(LinkList *L)  {      *L=(LinkList)malloc(sizeof(Node));      (*L)->next=NULL;  }    void CreateFromHead(LinkList L)  {     Node *s;     char c;     int flag=1;     while(flag)     {       c=getchar();       if(c!='$')       {          s=(Node *)malloc(sizeof(Node));          s->data=c;          s->next=L->next;          L->next=s;       }       else flag=0;     }  }    LinkList MergeLinkList(LinkList LA,LinkList LB)  {     LinkList r;     Node *pa,*pb;     LinkList LC;     pa=LA->next;     pb=LB->next;     LC=LA;     LC->next=NULL;     r=LC;     while(pa!=NULL&&pb!=NULL)     {        if(pa->data<=pb->data)        {           r->next=pa;           r=pa;           pa=pa->next;        }        else        {           r->next=pb;           r=pb;           pb=pb->next;        }     }     if(pa)     r->next=pa;     else     r->next=pb;     free(LB);     return(LC);  }    void ReverseList(LinkList LC)  {      LinkList p,q;      p=LC->next;     LC->next=NULL;     while(p!=NULL)     {        q=p->next;        p->next=LC->next;        LC->next=p;        p=q;     }  }    void main()  {       LinkList LA,LB,LC;     printf("please input data of list LA:\n");     CreateFromHead(LA);     printf("output list LA:\n");     printf("please input data of list LB:\n");     CreateFromHead(LB);     printf("output list LB:\n");     printf("make list LC:\n");     MergeLinkList(LA,LB,&LC);     printf("please output list LC:\n");       return 0;  }  #include <stdio.h>  #include <malloc.h>    typedef struct Node  {      int data;      struct Node *next;    }Node,*LinkList;    void InitList(LinkList *L)  {      *L=(LinkList)malloc(sizeof(Node));      (*L)->next=NULL;  }    void CreateFromHead(LinkList L)  {     Node *s;     char c;     int flag=1;     while(flag)     {       c=getchar();       if(c!='$')       {          s=(Node *)malloc(sizeof(Node));          s->data=c;          s->next=L->next;          L->next=s;       }       else flag=0;     }  }    LinkList MergeLinkList(LinkList LA,LinkList LB)  {     LinkList r;     Node *pa,*pb;     LinkList LC;     pa=LA->next;     pb=LB->next;     LC=LA;     LC->next=NULL;     r=LC;     while(pa!=NULL&&pb!=NULL)     {        if(pa->data<=pb->data)        {           r->next=pa;           r=pa;           pa=pa->next;        }        else        {           r->next=pb;           r=pb;           pb=pb->next;        }     }     if(pa)     r->next=pa;     else     r->next=pb;     free(LB);     return(LC);  }    void ReverseList(LinkList LC)  {      LinkList p,q;      p=LC->next;     LC->next=NULL;     while(p!=NULL)     {        q=p->next;        p->next=LC->next;        LC->next=p;        p=q;     }  }    void main()  {       LinkList LA,LB,LC;     printf("please input data of list LA:\n");     CreateFromHead(LA);     printf("output list LA:\n");     printf("please input data of list LB:\n");     CreateFromHead(LB);     printf("output list LB:\n");     printf("make list LC:\n");     MergeLinkList(LA,LB,&LC);     printf("please output list LC:\n");       return 0;  }  #include <stdio.h>  #include <malloc.h>    typedef struct Node  {      int data;      struct Node *next;    }Node,*LinkList;    void InitList(LinkList *L)  {      *L=(LinkList)malloc(sizeof(Node));      (*L)->next=NULL;  }    void CreateFromHead(LinkList L)  {     Node *s;     char c;     int flag=1;     while(flag)     {       c=getchar();       if(c!='$')       {          s=(Node *)malloc(sizeof(Node));          s->data=c;          s->next=L->next;          L->next=s;       }       else flag=0;     }  }    LinkList MergeLinkList(LinkList LA,LinkList LB)  {     LinkList r;     Node *pa,*pb;     LinkList LC;     pa=LA->next;     pb=LB->next;     LC=LA;     LC->next=NULL;     r=LC;     while(pa!=NULL&&pb!=NULL)     {        if(pa->data<=pb->data)        {           r->next=pa;           r=pa;           pa=pa->next;        }        else        {           r->next=pb;           r=pb;           pb=pb->next;        }     }     if(pa)     r->next=pa;     else     r->next=pb;     free(LB);     return(LC);  }    void ReverseList(LinkList LC)  {      LinkList p,q;      p=LC->next;     LC->next=NULL;     while(p!=NULL)     {        q=p->next;        p->next=LC->next;        LC->next=p;        p=q;     }  }    void main()  {       LinkList LA,LB,LC;     printf("please input data of list LA:\n");     CreateFromHead(LA);     printf("output list LA:\n");     printf("please input data of list LB:\n");     CreateFromHead(LB);     printf("output list LB:\n");     printf("make list LC:\n");     MergeLinkList(LA,LB,&LC);     printf("please output list LC:\n");       return 0;  }  可以帮我看一下吗

你有这些功夫还不如把源码粘贴上来

你把代码贴出来吧，这些图片看得眼睛花，还看不清楚


Question: C语言，为什么我输出为乱码

楼主的问题解决了没，怎么解决的噢

截个输出结果的图来看看

定义的数组越界了

去掉输入name的前面的&，因为name是数组，数组名就是地址。  第二个for循环变量时j，下面用i会导致内存越界，在输出时可能会出现段错误。

输入字符串给 name 字符数组的时候，parr[i].name前面不要 &（取地址符）。

输出的for循环中parr[ ]角标应该是 j


Question: C语言

首先你的数组没有初始化，你将1024个字节全部输出，后面肯定都是垃圾数据。其次scanf里的%s在遇到空格时，会截断输入，想要一次读取一行可以尝试gets(),gets_s()，或者用getchar()循环读取。

你是想输入一个句子，然后把每个单词提出来遇到逗号表示这个句子到末尾了？ 如果是这样的话:你那个for循环是不是少了把单词打印出来的语句? 建议你对数组初始化，并用gets()读入,要不然sacnf遇到空格就停了,空格在scanf()函数中读取字符串时是作为分隔符的

你这个输入方式，数组中就没有存储空格，你可以看看字符串的输入，用gets函数

你输入的可能没有1024个，但是你数组没有初始化，所以循环时会把内存原本的垃圾一起读出来，建议先初始化

说你的期望和编译的结果。盲猜一下 你遇到逗号就不输出这个问题?


Question: max()函数为什么总是输出第一个数，而不是最大数？

程序没什么问题，建议查一下输入的格式是否正确。建议查一下scanf的返回值，正常返回2，在出错或者输入不对会小于2.

程序输出没啥问题，请注意输入的是1,2，不能遗漏逗号。 还有，函数声明不应放在函数体内。

兄弟你串题了吧 引用 6 楼 一见 的回复:原因是因为第一个调用的是std::max(double,double)，这是一个模板函数，优先匹配上了，第二个调用的是max(float,float)，它隐藏了模板。using污染了名字空间，如果去掉using语句，则不会调用到模板函数，结果就会如预期：  #include <iostream> //using namespace std; float max(float x,float y) { std::cout<<"函数float max(float x,float y)"; if (x>y) return x; else return y; } int main()  { float x=3.0,y=4.1; std::cout<<"max(3.1,4.1)="<<max(3.1,4.1)<<std::endl; std::cout<<"max(x,y)="<<max(x,y)<<std::endl; return 0; }

你输入的时候要严格按照a,b(中间有个逗号)这样输入。而且我试了你的程序，没问题啊。输出最大的

代码没问题啊，估计是输入两个数的时候没有严格按照"%d,%d"的格式输入吧。 输入格式是"%d,%d"，就要按照像这样的样子输入：3,5<回车>或者5,2<回车>等，即（第一个数）（逗号）（第二个数）<回车>。

引用 1 楼 盲侠z 的回复:int max(int x,int y);   函数声明位置应该在主函数外面 #include <stdio.h> int max(int x,int y);   int main() 这个函数声明没问题。。。。请忽略吧。。。

一看就是自学？

scanf里面有个逗号 去掉就好了


Question: 问题:求解释。

引用 4 楼 拥抱Linux 的回复：谢谢，懂了

引用 2 楼 qq_38834405 的回复： 我尽力了。。我以前也看过老九的视频，很详细就是声音有点小嗯，谢谢

请自己调试下，理解得更清楚，加几个printf不难吧

c语言的函数调用都是按值传递， 参数传递就是一个赋值操作， 在main函数中       chang(&numb); 先对实参求值，再赋值给chang函数的形参，为了方便描述，假设形参的标识符是 p (你用的是 numb)    p = &numb; 所以，   *p  = *(&numb) = numb = 'a'   引用传递的意思是 ，给变量 a 对应的内存区域 取了另外一个新名字 b,  C语言应该没有语法可以 复制引用。

地址没有变化，因为没对指针做修改；注意*numb += 1;这条语句的操作是numb指针指向的内存里存的数据+1。而这个指针指向的对象是main函数里的numb，因此执行完change之后，其实是main函数里numb值加了1.

指针作为形参的时候，你传递的是地址，所以函数内是直接通过这个地址对该地址存放的内容进行操作的，并不需要用return来返回a＋1后的值。在这个程序里指针numb将存放a的地址给了函数，函数根据这个地址直接对a进行操作也就是加一，字符进行加减法时相当于ascll码值加1，也就是b

应该是指针没变  而是a的ASCII码值加一了

我尽力了。。我以前也看过老九的视频，很详细就是声音有点小

这里指针并没有变呀，只是取地址然后指针指向的地址内容变了，也就是你找到存'a'的地址，然后把'a'+1而已


Question: C语言求助！ LPWSTR类型的变量要怎么输出到文件中呢？？

LPWSTR代表他是一个Wide字符指针 %s是输出单字节字符串用的 比如LPSTR %S就能输出LPWSTR类型了

printf("%s",LP); printf("%S",LP);  请问小s和大S分别表示输出的类型是什么。 有什么分别吗？？  我使用%S的方式就可以输出LPWSTR类型的变量。


Question: c语言

#include <stdio.h> #include <stdlib.h> #include <math.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) { 	 	double rate,deposit,n,captital; 	rate=0.0225;     scanf("%lf %lf",&n,&captital); 	 	printf("n:%lf captital:%lf\n*****\n",n,captital); 	deposit=captital*pow(1+rate,n); 	printf("%lf\n" ,deposit); 	 	return 0; }

哪里抄的代码吧，好多都是中文字符： #include <math.h> #include <stdio.h>  void main(){ double rate , deposit,n,captital; rate=0.0225; scanf("%lf,%lf" ,&n,&captital); deposit=captital*pow(1+rate,n); printf("%lf\n" ,deposit);  }  输入1,100可以显示结果。  引用 4 楼 qq_44866249 的回复:[quote=引用 2 楼 niiiloc的回复:]应该是银行复利的计算 deposit=总资产 captital=初始资产 rate=利率 n=存的年限 对 但是我输入数字之后，结果都是0.000000[/quote]

引用 1 楼 自信男孩的回复:Try it by yourself and analyze the results.

引用 3 楼 很黑的黑的回复:这种问题自己编译试一下就知道结果了啊 但是我输入数字之后，结果都是0.000000

引用 2 楼 niiiloc的回复:应该是银行复利的计算 deposit=总资产 captital=初始资产 rate=利率 n=存的年限 对 但是我输入数字之后，结果都是0.000000

这种问题自己编译试一下就知道结果了啊


Question: 求助大佬！！！

你的第二层for循环没有终止条件,肯定会越界的啊.

for (j = i ; ; j++,i++) 这一句错误，for循环没有终止条件，相当于 while（1），程序在这里相当于死循环。 当 i 或 j 的值非常大时（因为有j++,i++）, j 大于数组的长度，就会发生访问越界。


Question: 子函数传指针为什么有的可以改变主函数里的链表结构，有的不行

楼上的几位已经说的很明白了。

能行的说明链表是带哨兵的，即头结点不存储有效数据，并且头结点是在main里定义和申请空间的

void create_linklist(linklist *head, int arr[],int n) 这个函数不能将新的head返回到main函数里，解决办法：使用二重指针或将head返回（定义函数的返回值类型）

虽然这两个函数的参数都是指针类型，但通过函数内部的代码可以看到，实际上这并不是地址传递，而是「值传递」，只不过和书上讲值传递时使用的参数是基本数据类型（比如int型等）的样子不一样，而这里传递的是「指针」而已，也就是说，传递的是主函数中该指针的一个复制品而已，所以无论是第一个函数还是第二个函数，其实都没有改变过外部的主函数的实参指针本体 。  第一个函数，参数表里虽然有一个名字叫 head 的指针，但是正如上面一段所说，传入函数内的是这个指针的一个复制品而已，在这个函数内部对这个名字叫 head 的指针变量所做的任何操作都不会影响到 主函数中的实参本体 一丝一毫，除非最后提供一个返回值并赋值给主函数中的 实参本体指针变量。——也就是说，这第一个函数，参数表里完全可以不要 这个 head 指针， 就在最后 return head; ，同时在主函数里有一个链表的头指针来接受赋值就可以完成创建链表的工作。  第二个函数，传入了参数 l ， 和上面说的一样，传入的是 主函数中的实参指针本体的一个复制品；很明显， 这个复制品 和 主函数中原来的实参指针本体 都是指向 同一个 节点的嘛。 那么，函数内的代码使用 复制品 所指向的节点中的 next 指针的值，那不就是使用 主函数中的原来的实参指针本体 指向的 节点 的 next 指针 的值吗？ 因为 这就是同一个节点 的 同一个 next 指针变量 嘛！ 所以，函数内的代码能运行下去并得到想要的结果啊。  总结：函数的参数是指针类型，但是函数内部的实际操作是使用参数的值，只是值传递。

第一个函数，你把head指针返回就行了。其实参数部分不需要传入head，只需要用返回值。然后你再实现一个释放此head链表内存空间的函数就行。  linklist* create_linklist(linklist *head, int arr[],int n){ linklist *r,*s; head=(linklist*)malloc(sizeof(linklist));   //在这一步，head被重新赋值了。 head->data = arr[0];  head->next = NULL; r = head; for(int i = 1;i < n;i++){ s=(linklist*)malloc(sizeof(linklist)); s->data = arr[i]; r->next = s; r = s; } r->next=NULL;  return  head; }

void create_linklist(linklist *head, int arr[],int n)  这个函数声明，你能修改head指针指向的内容，但不能修改head指针本身。 你的函数内部实现希望修改head指针本身，那就用二级指针来做。  void create_linklist(linklist **head, int arr[],int n) *head=(linklist*)malloc(sizeof(linklist));


Question: 求教大佬们这题怎么做，谢谢！

这图截的也得看的清楚才行

贴的图片至少自己要能看清才行呢

引用 2 楼 zhouqunhai的回复:这图截的也得看的清楚才行 尴尬，没注意，第一次用博客，不太会

引用 1 楼 自信男孩的回复:贴的图片至少自己要能看清才行呢 尴尬，哈哈，没注意


Question: 对于ASCLL码和键盘码的区别，我的理解对吗？

引用 5 楼 六道佩恩 的回复:[quote=引用 3 楼 stherix 的回复:] [quote=引用 2 楼 六道佩恩 的回复:] [quote=引用 1 楼 stherix 的回复:] 差不多吧 键盘码代表你按下了键盘上哪一个键 ASCII则是计算机内的文字符号代码 这两者也没有一一对应 比如ASCII里面没有alt 而键盘上有可能要按几个键才能代表一个ASCII, 就像shift+a = A 那键盘码和键盘扫描码有区别吗？[/quote]  扫描码(ScanCode)是键盘硬件产生的,通过PS/2,USB/蓝牙等传给电脑,不同的键盘可能还多出来不少特定的功能键 这些在键盘码(KeyCode)里可能都没有[/quote] 那扫描码和键盘码的关系是？[/quote] 具体我也说不清 应该键盘扫描码是键盘按键产生的,键盘码则是操作系统为这个键位定的代码  然后ASCII其实是文本的编码,不一定要键盘,无论手写还是语音一样能产生ASCII编码的文本

引用 3 楼 stherix 的回复:[quote=引用 2 楼 六道佩恩 的回复:] [quote=引用 1 楼 stherix 的回复:] 差不多吧 键盘码代表你按下了键盘上哪一个键 ASCII则是计算机内的文字符号代码 这两者也没有一一对应 比如ASCII里面没有alt 而键盘上有可能要按几个键才能代表一个ASCII, 就像shift+a = A 那键盘码和键盘扫描码有区别吗？[/quote]  扫描码(ScanCode)是键盘硬件产生的,通过PS/2,USB/蓝牙等传给电脑,不同的键盘可能还多出来不少特定的功能键 这些在键盘码(KeyCode)里可能都没有[/quote] 那扫描码和键盘码的关系是？

可以这么理解，键盘码是输入，ASCII码是输入后的转换，最终计算机处理的是一个个ASCII码

引用 2 楼 六道佩恩 的回复:[quote=引用 1 楼 stherix 的回复:] 差不多吧 键盘码代表你按下了键盘上哪一个键 ASCII则是计算机内的文字符号代码 这两者也没有一一对应 比如ASCII里面没有alt 而键盘上有可能要按几个键才能代表一个ASCII, 就像shift+a = A 那键盘码和键盘扫描码有区别吗？[/quote]  扫描码(ScanCode)是键盘硬件产生的,通过PS/2,USB/蓝牙等传给电脑,不同的键盘可能还多出来不少特定的功能键 这些在键盘码(KeyCode)里可能都没有

引用 1 楼 stherix 的回复:差不多吧 键盘码代表你按下了键盘上哪一个键 ASCII则是计算机内的文字符号代码 这两者也没有一一对应 比如ASCII里面没有alt 而键盘上有可能要按几个键才能代表一个ASCII, 就像shift+a = A 那键盘码和键盘扫描码有区别吗？