Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求助！菜鸟一枚，正在拼题a刷题，这题想半天了不知道怎么错的

回复:
user: user-1
content: 问题是 输入的顺序错了 #include<stdio.h> #include<string.h> #include<stdlib.h> struct ifm { 	char name[80]; 	char both[80]; 	char sex[10]; 	char dianhua[80]; 	char phone[80]; }; int main() { 	int n,i, num; 	scanf("%d", &n); 	getchar();//吃掉回车  	struct ifm *uct = (struct ifm*)malloc(sizeof(struct ifm)*n); 	for (i=0;i < n; i++) 	{ 		//姓名 生日 性别 固话 手机 --这个顺序 		scanf("%s %s %s %s %s",  			uct[i].name, uct[i].both, uct[i].sex,uct[i].dianhua, uct[i].phone); 		getchar(); 	}  	scanf("%d", &num);  	int *a= (int*)malloc(sizeof(int)*num);  	for (i = 0; i < num; i++) 	{ 		scanf("%d", &a[i]); 	} 	for (i = 0; i < num; i++)//姓名 固话 手机 性别 生日 	{ 		if (a[i] < n) 		{ 			printf("%s %s %s %s %s\n",  				uct[a[i]].name, uct[a[i]].dianhua, uct[a[i]].phone, uct[a[i]].sex, uct[a[i]].both); 		} 		else 			printf("Not Found\n"); 	}  	free(uct); 	free(a); 	return 0;  }  输出 3 Chris 1984/03/10 F +86181779452 13707010007 LaoLao 1967/11/30 F 057187951100 +8618618623333 QiaoLin 1980/01/01 M 84172333 10086 3 0 1 2 Chris +86181779452 13707010007 F 1984/03/10 LaoLao 057187951100 +8618618623333 F 1967/11/30 QiaoLin 84172333 10086 M 1980/01/01

user: user-0
content: 引用 3 楼 牛不才的回复:好像没什么问题  我也觉得没什么问题，但是他系统说我错了两个测试点，想了好久我都快吐了   我决定跳过这题了

user: user-0
content: 引用 1 楼 牛不才的回复:2 1 7 输出2条数据 分别是 下标1的数据（存在） 下标7的数据（不存在，只有 0，1，2）  结果是对的呀 回复不了图片，这是pat给的三个测试点 0	sample 有查询越界	    答案正确 1 最长字符串，最小N	     答案错误 2	最大N，反复查询同一记录	答案错误

user: user-1
content: 好像没什么问题

user: user-1
content: 2 1 7 输出2条数据 分别是 下标1的数据（存在） 下标7的数据（不存在，只有 0，1，2）  结果是对的呀
user-0 提问: 求大神支招，关于for循环跳出问题

回复:
user: user-1
content: 引用 19 楼 Meng_Meng_Xin 的回复:他没有说是，一下把数据全部赋值完再输出结果，而且输出的答案和紧接着赋的值还不对应 道理很简单，C 语言有 stdin(标准输入流) 和 stdout(标准输出流)，printf 全部输出到 stdout，scanf 全部从 stdin 接受。在 OJ 上，stdin 和 stdout 对应着两个不同的文件，所以这样子完全可以。而在本地上，stdin 和 stdout 全部被接到了交互式的终端上，于是你就会看到图中输入和输出交叉显示的现象。

user: user-0
content: 他没有说是，一下把数据全部赋值完再输出结果，而且输出的答案和紧接着赋的值还不对应

user: user-0
content: 我试了上面的方法在题库运行是正确的 #include<stdio.h> int main() { 	int i,e; 	int x[100]; 	int y[100]; 	while(scanf("%d %d\n",&x[i],&y[i])!=EOF) 	{ 		printf("%d\n",x[i]+y[i]); 		i++; 	}  } 但是我自己运行它，觉得它不符合题目标准

user: user-2
content: while(scanf("%d%d",x[i],y[i])!=EOF){i++}

user: user-1
content: 大概是这么个框架： while (scanf("...", ...) != EOF) {     // 单次操作的代码写在这儿 }

user: user-2
content: scanf()!=EOF，否则退出

user: user-2
content: 机测不可能模拟人输入的，他多半是给程序提供一段字符串，"12\n23\n……"之类的，一般从文件中提取而来，那么判断EOF应该还是可行的

user: user-0
content: 引用 12 楼 apkipa1的回复:[quote=引用 11 楼 Meng_Meng_Xin 的回复:] 刚刚那个方法超时了 OJ 的话要判断的不是换行符，而是 EOF，scanf 可以直接返回 EOF 的。[/quote] 可以写一下嘛，EFO还没学到呢

user: user-1
content: 引用 11 楼 Meng_Meng_Xin 的回复:刚刚那个方法超时了 OJ 的话要判断的不是换行符，而是 EOF，scanf 可以直接返回 EOF 的。

user: user-0
content: 引用 9 楼 apkipa1的回复:[quote=引用 4 楼 與蘤舊縐 的回复:] [quote=引用 3 楼 apkipa1 的回复:] 这样应该可以： if (getchar() == '\n' && getchar() == '\n')     break;  这样就把正常的输入给打乱了  挺为难的[/quote] 啊，对的，看来只能用 ungetc 来操作了。[/quote] 刚刚那个方法超时了

user: user-2
content: 引用 8 楼 Meng_Meng_Xin 的回复:[quote=引用 7 楼 與蘤舊縐的回复:]其他办法还是有的，但具体函数不太清楚  比如只是到缓冲区查看一下输入的下一个字符是什么，不接收，用作判断  或者接收该字符后回退标志位，让这个字符再被接收一次  或者接收了，存起来，用scanf接收的时候把这部分缺的补上去 上面那个方法可以[/quote]  你试一下连续输入，不要直接两个回车推出了

user: user-1
content: 引用 4 楼 與蘤舊縐 的回复:[quote=引用 3 楼 apkipa1 的回复:] 这样应该可以： if (getchar() == '\n' && getchar() == '\n')     break;  这样就把正常的输入给打乱了  挺为难的[/quote] 啊，对的，看来只能用 ungetc 来操作了。

user: user-0
content: 引用 7 楼 與蘤舊縐的回复:其他办法还是有的，但具体函数不太清楚  比如只是到缓冲区查看一下输入的下一个字符是什么，不接收，用作判断  或者接收该字符后回退标志位，让这个字符再被接收一次  或者接收了，存起来，用scanf接收的时候把这部分缺的补上去 上面那个方法可以😊

user: user-2
content: 其他办法还是有的，但具体函数不太清楚  比如只是到缓冲区查看一下输入的下一个字符是什么，不接收，用作判断  或者接收该字符后回退标志位，让这个字符再被接收一次  或者接收了，存起来，用scanf接收的时候把这部分缺的补上去

user: user-0
content: 引用 3 楼 apkipa1的回复:这样应该可以： if (getchar() == '\n' && getchar() == '\n')     break; 真的可以，谢谢指导

user: user-2
content: 首先呢这个题挺过分的，什么退出条件都没有，但你还非得退出不可，不然肯定超时  唯一看起来可能的条件的大概就是这两个数的范围了，如果是机测的话看起来不靠谱  真想达到你的效果也是可以的，大不了接收字符串，空串退出，但这引来的问题就多了，暂时只能想到这了

user: user-2
content: 引用 3 楼 apkipa1 的回复:这样应该可以： if (getchar() == '\n' && getchar() == '\n')     break;  这样就把正常的输入给打乱了  挺为难的

user: user-1
content: 这样应该可以： if (getchar() == '\n' && getchar() == '\n')     break;

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:scanf是不会接受\n的，你把getchar放在scanf下面，那么你提交数据时按的回车会被getchar接收，就会立即退出循环 对啊我想按两下回车再退出循环，该怎么改呢

user: user-2
content: scanf是不会接受\n的，你把getchar放在scanf下面，那么你提交数据时按的回车会被getchar接收，就会立即退出循环
user-0 提问: C语言初学者求助！！！

回复:
user: user-0
content: 引用 8 楼 cool99781的回复:是输入a 计算a+=a, a-=a, a*=a分开只是计算吗？ #include <iostream> #include <string> #include <cstdio>  using namespace std;  int main() { 	int a; 	cin >> a;//第一遍  	a += a - a * a;//对不对 	cin >> a;//第二遍 	int a1 = a * a;  	a += a - a1; 	//我也是菜鸡 	return 0; } 就是写一个程序，在键盘上录入a值之后，计算一下a+=a-=a*a还有另一个式子的值

user: user-1
content: 是输入a 计算a+=a, a-=a, a*=a分开只是计算吗？ #include <iostream> #include <string> #include <cstdio>  using namespace std;  int main() { 	int a; 	cin >> a;//第一遍  	a += a - a * a;//对不对 	cin >> a;//第二遍 	int a1 = a * a;  	a += a - a1; 	//我也是菜鸡 	return 0; }

user: user-0
content: 引用 楼主 weixin_46316277的回复:第七个用C应该怎么写啊 我们老师的意思应该是编写一下计算这两个式子的程序，看看结果

user: user-0
content: 引用 2 楼 cool99781的回复:比如1234 %10取出4个位数，再/10，留下123，这样每次就可以变成一种规律，每次%10 怎么办，想明白了吗？ 我只给你这一道题的代码  #include <iostream> #include <string> #include <cstdio>  using namespace std;  int main() { 	int n; 	cin >> n; 	while(n != 0) 	{ 		cout << n % 10 << endl; 		n /= 10; 	 }  	return 0; }  我没有懂这个，您说的这个是第七题嘛？ 第七题我是这么写的 #include<stdio.h> int main() {     int a,a1,a2;     printf("Input a:");     scanf("%d",&a);     a1 = a;     a2 = a;     a1+ = a1- = a1*a1;     a2+ = a2- = a2* = a2;     printf("%d,%d",a1,a2);     return 0; } 应该怎么改正？

user: user-0
content: 引用 1 楼 初学小菜的回复:直接if语句把这两个数的结果进行比较就行，记得换个变量进行操作 #include<stdio.h> int main() {     int a,a1,a2;     printf("Input a:");     scanf("%d",&a);     a1 = a;     a2 = a;     a1+ = a1- = a1*a1;     a2+ = a2- = a2* = a2;     printf("%d,%d",a1,a2);     return 0; } 我这个应该怎么改？

user: user-1
content: …………//算出结果 //写一个if if(比较) { }

user: user-1
content: 宏常量 #define ……     …… const常量 例： const int n = 100; n = n + 1; 就会报错

user: user-1
content: 比如1234 %10取出4个位数，再/10，留下123，这样每次就可以变成一种规律，每次%10 怎么办，想明白了吗？ 我只给你这一道题的代码  #include <iostream> #include <string> #include <cstdio>  using namespace std;  int main() { 	int n; 	cin >> n; 	while(n != 0) 	{ 		cout << n % 10 << endl; 		n /= 10; 	 }  	return 0; }

user: user-2
content: 直接if语句把这两个数的结果进行比较就行，记得换个变量进行操作
user-0 提问: 指针做形参时，函数中用指针指示结果 可是编译器说必须返回一个值

回复:
user: user-1
content: 引用 5 楼 qq_46316063 的回复:[quote=引用 4 楼 與蘤舊縐的回复:]你只是用指针直接把原来的变量的值改了，这样你就不用返回值了，看你函数的声明原本应当是想返回修改后变量的值，然后用对应变量接收这个值，达到改变变量值得效果  既然定义了返回值类型float就必须返回一个float类型的值  你这么说说明你完全不了解函数返回机制，先去看看资料吧 谢谢！那应该是用void定义函数吗[/quote]  没错，当然你也可以返回值，而不在函数里直接修改外部变量

user: user-0
content: 引用 4 楼 與蘤舊縐的回复:你只是用指针直接把原来的变量的值改了，这样你就不用返回值了，看你函数的声明原本应当是想返回修改后变量的值，然后用对应变量接收这个值，达到改变变量值得效果  既然定义了返回值类型float就必须返回一个float类型的值  你这么说说明你完全不了解函数返回机制，先去看看资料吧 谢谢！那应该是用void定义函数吗

user: user-1
content: 你只是用指针直接把原来的变量的值改了，这样你就不用返回值了，看你函数的声明原本应当是想返回修改后变量的值，然后用对应变量接收这个值，达到改变变量值得效果  既然定义了返回值类型float就必须返回一个float类型的值  你这么说说明你完全不了解函数返回机制，先去看看资料吧

user: user-2
content: 改下函数 float sum_diff(....) 把这个float 改成void就好了

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:返回值和形参有什么关系，你看你的函数定义的返回值是float类型，那么就需要返回一个float类型的变量 可是需要输出的结果在函数中已经用指针指示结果了，为什么编译器说必须有一个返回值呢

user: user-1
content: 返回值和形参有什么关系，你看你的函数定义的返回值是float类型，那么就需要返回一个float类型的变量
user-0 提问: 萌新for循环顺序遇到问题

回复:
user: user-0
content: 引用 8 楼 寻开心的回复:就是告诉你，不明白程序怎么执行的时候，要通过输出这些参与运算的变量的值， 然后根据这些输出结果来看看他们如何执行的 十分感谢，我明白了，谢谢大佬直观的讲解，我能明白你的意思了。以后自己可以多练习练习这个对自己提高肯定很大，之前就比较迷，看不懂就看不懂了，现在我可以自己去研究了哈哈

user: user-1
content: 就是告诉你，不明白程序怎么执行的时候，要通过输出这些参与运算的变量的值， 然后根据这些输出结果来看看他们如何执行的

user: user-1
content: 你不是不理解代码是怎么运行的吗，那就把代码运行过程当中的各个变量情况输出出来 那个示例代码的意思，就是要输出 比较a[0],a[1]    []里面就是当前的i和j 比较a[0],a[2] 比较a[0],a[3]  调试就是直接在调试工具下看这些变量， 这里无非是把这些变量打印出来更直观的看 如果愿意，你还可以在if语句里面继续写 if ( a[i] > a[j] ) {      printf("\t交换%d和%d的数据\n", i, j);      t = a[i];      a[i]=a[j];      a[j]=t; } 这样看输出结果，就更清楚了，可能是 comapre a[0], a[1]      交换0,1 compare a[0], a[2] 。。。。。

user: user-0
content: 引用 3 楼 寻开心的回复:在if比较前，自己加上printf语句把i和j输出出来，看看谁和谁在比较 for(i....)    for (j....){          printf("compare a[%d] and a[%d]\n", i, j);          if ( a[i]>a[j]) .......    }  这样就能看到执行流程了 不会用IDE调试，就先来最简单的直接打印输出 很不好意思，大佬。那个加的那句printf（...）没看懂。你说的调试是不是在自己写的那一行开头的小按钮按一下这一行变成红色，然后运行，运行过程只会运行到这红色的前一行呢？然后鼠标点某些变量会出现数值。我电脑上那个软件是c++的，但是调试过程中一调试就卡主了然后自己退出我挺懵的。那个直接打印输出又是什么。。就是你写的插入的这行printf吗，我看着有点像那个，之前看过一下东西，好像就是运行前加入这些，然后运行过程这些值都会显示出来不知道是不是这个意思

user: user-2
content: 引用 4 楼 m0_46159488 的回复:[quote=引用 2 楼 N-n-N的回复:]i=0 -> (j=i+1=1->j++ until j<=9) -> i+1=1 ->  (j=i+1=2->j++ until j<=9)  -> i++ until i<=9  这个是嵌套循环，括号里面是第二个循环 感谢大佬，步骤我已经看懂了，就是这样子的我怎么能想到呢，我感觉看到题我只能想到一般的单循环，像这样子嵌套第一次看到，课里还没有听明白，看了你的步骤我才懂了，就像一楼说的有没有练习或者自己用调试思考弄明白，不然我也只是知道这个步骤的过程下次看到能知道这个步骤。[/quote]最好上手实操

user: user-0
content: 引用 2 楼 N-n-N的回复:i=0 -> (j=i+1=1->j++ until j<=9) -> i+1=1 ->  (j=i+1=2->j++ until j<=9)  -> i++ until i<=9  这个是嵌套循环，括号里面是第二个循环 感谢大佬，步骤我已经看懂了，就是这样子的我怎么能想到呢，我感觉看到题我只能想到一般的单循环，像这样子嵌套第一次看到，课里还没有听明白，看了你的步骤我才懂了，就像一楼说的有没有练习或者自己用调试思考弄明白，不然我也只是知道这个步骤的过程下次看到能知道这个步骤。

user: user-1
content: 在if比较前，自己加上printf语句把i和j输出出来，看看谁和谁在比较 for(i....)    for (j....){          printf("compare a[%d] and a[%d]\n", i, j);          if ( a[i]>a[j]) .......    }  这样就能看到执行流程了 不会用IDE调试，就先来最简单的直接打印输出

user: user-2
content: i=0 -> (j=i+1=1->j++ until j<=9) -> i+1=1 ->  (j=i+1=2->j++ until j<=9)  -> i++ until i<=9  这个是嵌套循环，括号里面是第二个循环

user: user-3
content: 内层循环进行完再进行外层循环  这种问题建议你自己拿张纸来写，实在搞不懂就单步调试，这样几个例子之后你就能搞明白了，单是看看用处不大
user-0 提问: 求大佬帮忙解答

回复:
user: user-1
content: 虽然一楼也打错字了，但他说的没错  不过我倒是好奇这编译器怎么没给你的STudent报错呢，难不成你还定义了这个结构体不成

user: user-2
content: max（p）那行也有问题吧？ max是c++的标准函数， max（a，b）返回两个数大的  你这个max是什么？

user: user-3
content: print方法的参数是sTudent，注意大小写
user-0 提问: C语言

回复:
user: user-1
content: 哦，明白了，谢谢大老

user: user-0
content: 引用 6 楼 apkipa1的回复:[quote=引用 5 楼 與蘤舊縐 的回复:] return咱还是加上，总有不支持的编译器 好吧，补充一下，int main 不用写 return 0 是支持 C99 的编译器的特性，如果你在用 vc6 等 IDE / 编译器的话，请手动补上，或者换一个现代编译器。[/quote] 好像有点明白了，谢谢大佬

user: user-0
content: 好像有点懂了，谢谢大佬

user: user-2
content: 引用 5 楼 與蘤舊縐 的回复:return咱还是加上，总有不支持的编译器 好吧，补充一下，int main 不用写 return 0 是支持 C99 的编译器的特性，如果你在用 vc6 等 IDE / 编译器的话，请手动补上，或者换一个现代编译器。

user: user-3
content: return咱还是加上，总有不支持的编译器

user: user-2
content: 总是写 int main(void) 或者 int main(int argc, char *argv[])，除非你的环境明确规定要使用另一种写法。当然，你可以把 int main 当 void main 的，反正都不需要写 return。

user: user-3
content: 一般都是int，不是int的骚操作新手应该比较难接触到吧，main函数本身就是一个函数，int就是返回值类型，不是返回int当然不能用int main了

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:C99标准一般写int main()  C11一般为int main(void)  原则上C语言主函数必须有返回值，void main的写法早已被废弃 如果我的返回值不是int类型的也可以用into main吗？

user: user-3
content: C99标准一般写int main()  C11一般为int main(void)  原则上C语言主函数必须有返回值，void main的写法早已被废弃

user: user-4
content: 引用 9 楼 QGHappyQL 的回复:const int **pp2; int *p1; const int n=13; /*pp2=&p1; *pp2=&n;*/       *p1=10; printf("%d\t%d",**pp2,n);  各位大佬们，请教一下，为何p1就变成指向n的指针了？ 做梦时候才会等， 正常情况下都不等 printf("%p  %p", p1, &n); // 输出指针，看看他们等不等  p1都没有赋值，就*p1 = 10； 这是野指针，错误的用法，没准发生什么后果

user: user-1
content: const int **pp2; int *p1; const int n=13; /*pp2=&p1; *pp2=&n;*/       *p1=10; printf("%d\t%d",**pp2,n);  各位大佬们，请教一下，为何p1就变成指向n的指针了？
user-0 提问: C语言求助

回复:
user: user-1
content: 1. c89中没有bool，需要自行定义 2. 素数的判定有更快捷的方法  #ifndef bool #define bool int #endif  #ifndef true #define true 1 #endif #ifndef false #define false 0 #endif  void get_valid_number(int *n); bool is_prime(int x);  bool is_prime(int n) { 	int i = 0; 	//if n is divisible by any number greater or equal to 2 and less than n, then n is not prime. 	for (i = 2; i < n; i++) { 		if (n%i == 0) { 			return false; 		} 	} 	return true;  }  void get_valid_number(int * n) { 	//The valid number is either -1 (to exit the program) or an integer greater than 2. 	//A loop is used to implement input validation, that is, user will be asked to  	//enter a valid number over and over again until a valid number is received. 	printf("Please enter an integer greater than 2 to test its primality, enter -1 to exit \n"); 	scanf("%d", n); 	while (*n != -1) { 		if (*n <= 2) 		{ 			printf("Please enter an integer greater than 2 to test its primality, enter -1 to exit \n"); 			scanf("%d", n); 		} 		else 		{ 			return; 		} 	} }  int main() { 	int n=0; 	get_valid_number(&n); //read 	while (n != -1) { //test 					  //process 		if (is_prime(n)) { 			printf("%d is a prime number!\n", n); 		} 		else { 			printf("%d is not a prime number!\n", n); 		} 		//read again then loop back to test 		get_valid_number(&n); 	} 	return 0; }
user-0 提问: C语言重定义错误

回复:
user: user-1
content: 不一定准确，仅供参考： 1) int a; // 对 a 的试探性定义，此处表现为: 定义 a 为外部链接 ...     int a; // 定义 a 为无链接     extern int a; // 错误: 不能重复声明 a，因为 a 为无链接 ... 2) int x; // 对 x 的试探性定义，此处表现为: 定义 x 为外部链接 ...     extern int x; // 声明 x，引用到上层的 int x     int x; // 错误: 链接类型为无链接，与上层的 int x 的外部链接冲突 ... 3) 两个 int x 都被定义，且有外部链接，链接时自然冲突了。 相关资料: https://zh.cppreference.com/w/c/language/storage_duration https://zh.cppreference.com/w/c/language/extern

user: user-0
content: 引用 1 楼 m0_46300909的回复:对于 1、   和     2、 不是说内层覆盖外层作用域吗，为啥重定义呢 发错了，只是1、中的内层覆盖外层

user: user-0
content: 对于 1、   和     2、 不是说内层覆盖外层作用域吗，为啥重定义呢

user: user-2
content: 1 在同一个作用域当中，你不能声明两个同名的变量     这是编译器的事儿， 它发现同一个作用域下两个同名变量就是不允许    不管是全局变量还是局部变量的区域， int a ； 和extern int a；放在一起声明就是错的  2 你要把extern int x放到主函数的前面，就可以  3 同一个工程当中，两个全局变量还是要共享的， 之所以编译过去，是编译的本c文件，链接是组装，这个时候会产生冲突
user-0 提问: 求大佬帮忙

回复:
user: user-1
content: 编译器给了警告， 第二个参数缺少， leader_name可能没有自动在尾巴给你补充上0 编译器所有的警告一定要看， 并且消除它

user: user-1
content: scanf_s("%s", leader_name, 20);  第二个参数别省略了

user: user-0
content: 我用的是vs2019
user-0 提问: 萌新

回复:
user: user-1
content: 引用 1 楼 與蘤舊縐 的回复：这种简单到没朋友的循环语句建议你自己列表解决，把所有变量列一行，接下来每一行在对应位置写上本次循环时对应变量的值，问别人拖你学习进度，很久都掌握不了斗胆问一下，continue和break在这里都可以吧？

user: user-2
content: 就是33，么得毛病，就是一步一步运行的，这有什么好疑惑的

user: user-3
content: 引用 4 楼 user-4 的回复:[quote=引用 3 楼 與蘤舊縐的回复:][quote=引用 2 楼 user-4 的回复:] [quote=引用 楼主 花海呀的回复:]这运行出来k和n都等于3，求指点，这咋来的 我怀疑你代码打错了，感觉是2，3。[/quote]  3 3没错的[/quote] 抱歉，想差了。k值变了循环也变了。大佬今天很活跃呀，下面好多帖子都有你。[/quote]  天天都有我，真的闲

user: user-4
content: 引用 3 楼 與蘤舊縐的回复:[quote=引用 2 楼 user-4 的回复:] [quote=引用 楼主 花海呀的回复:]这运行出来k和n都等于3，求指点，这咋来的 我怀疑你代码打错了，感觉是2，3。[/quote]  3 3没错的[/quote] 抱歉，想差了。k值变了循环也变了。大佬今天很活跃呀，下面好多帖子都有你。

user: user-3
content: 引用 2 楼 user-4 的回复:[quote=引用 楼主 花海呀的回复:]这运行出来k和n都等于3，求指点，这咋来的 我怀疑你代码打错了，感觉是2，3。[/quote]  3 3没错的

user: user-4
content: 引用 楼主 花海呀的回复:这运行出来k和n都等于3，求指点，这咋来的 我怀疑你代码打错了，感觉是2，3。

user: user-3
content: 这种简单到没朋友的循环语句建议你自己列表解决，把所有变量列一行，接下来每一行在对应位置写上本次循环时对应变量的值，问别人拖你学习进度，很久都掌握不了
user-0 提问: 萌新

回复:
user: user-1
content: i控制的是行，你看i的那个for循环每次打印一个回车  j和k控制的是列，一个是空格，一个是*  for(i……){for(j……)}，那么你看外层循环执行一次，i+1，比如一开始i=1，那么一次循环之后i=2，j一开始最大为1，之后最大为2，也就是打印一个空格和两个空格，k同理，所以随着行数的增加，列数也就相应增加

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:for(j=1;j<=i;j++) 注意到j的最大值是i，而每次外循环i的值都会加1，所以列数就多了 您的意思是i代表列数的多少吗？还是不大清楚诶

user: user-1
content: for(j=1;j<=i;j++) 注意到j的最大值是i，而每次外循环i的值都会加1，所以列数就多了
user-0 提问: C

回复:
user: user-0
content: 引用 10 楼 apkipa1的回复:extern 根据上下文的不同，意思其实也不同，例如: int a; void f(void) {     extern int a; // 此处引用的是当前文件中的 a，别的文件也能用 } 但如果这么写: extern int a; void f(void) {     extern int a; // 此处引用的是外部的 a } 还能这么写: static int a; void f(void) {     extern int a; // 此处引用的还是当前文件中的 a，别的文件不能用 } 但是不能这么写: static int a; void f(void) {     int a;     {         extern int a; // 未定义行为     } } 受教了受教了～～

user: user-1
content: extern 根据上下文的不同，意思其实也不同，例如: int a; void f(void) {     extern int a; // 此处引用的是当前文件中的 a，别的文件也能用 } 但如果这么写: extern int a; void f(void) {     extern int a; // 此处引用的是外部的 a } 还能这么写: static int a; void f(void) {     extern int a; // 此处引用的还是当前文件中的 a，别的文件不能用 } 但是不能这么写: static int a; void f(void) {     int a;     {         extern int a; // 未定义行为     } }

user: user-0
content: 引用 8 楼 與蘤舊縐的回复:        ～～～～～～～

user: user-2

user: user-0
content: 引用 4 楼 與蘤舊縐的回复: #include <stdio.h>  int main(void) {     extern int i;     printf("%d", i);     return 0; }   如上，这么一段代码过不了编译，由于i无法找到，如果移去printf这一句，则可以正常运行  “extern引用别处定义的变量，编译器碰见时放行，不报错”这一句你说对了，一旦遇到需要使用该变量或者又出来了一个同名者，那这时候就得算算账了，如你所言重定义或者未定义就可以阻断编译了 明白了，明白了，谢谢

user: user-0
content: 引用 楼主 m0_46300909的回复:1、 _______________________ #include… extern int x;//x定义在别的文件中 ……… _________________________  我知道这个extern是引用别处定义的变量，链接时会处理  我可不可以理解为extern引用别处定义的变量，那么编译阶段编译器往下碰见这个d标识符时，会放行，也就是不报这个未定义错误（前提是这个标识符在extern声明的作用域内）     2、想用一下我对extern的理解 比如#include…… int  x; int main() {int x; extern int x;…}(会报重定义错误) extern引用别处定义的变量，编译器碰见时放行，不报错，内层的int x定义了个x 编译器往下碰见x时，分不清了（同一个x有了两个意思，不知道是哪个了） ，所以报了个重定义错误  问下大神，我这么简单的理解正确吗？ 这个1、中的未定义错误（x已在其他文件中定义）

user: user-0
content: 引用 楼主 m0_46300909的回复:1、 _______________________ #include… extern int x;//x定义在别的文件中 ……… _________________________  我知道这个extern是引用别处定义的变量，链接时会处理  我可不可以理解为extern引用别处定义的变量，那么编译阶段编译器往下碰见这个d标识符时，会放行，也就是不报这个未定义错误（前提是这个标识符在extern声明的作用域内）     2、想用一下我对extern的理解 比如#include…… int  x; int main() {int x; extern int x;…}(会报重定义错误) extern引用别处定义的变量，编译器碰见时放行，不报错，内层的int x定义了个x 编译器往下碰见x时，分不清了（同一个x有了两个意思，不知道是哪个了） ，所以报了个重定义错误  问下大神，我这么简单的理解正确吗？ 这个1、中的未定义错误（x已在其他文件中定义）

user: user-2
content: #include <stdio.h>  int main(void) {     extern int i;     printf("%d", i);     return 0; }   如上，这么一段代码过不了编译，由于i无法找到，如果移去printf这一句，则可以正常运行  “extern引用别处定义的变量，编译器碰见时放行，不报错”这一句你说对了，一旦遇到需要使用该变量或者又出来了一个同名者，那这时候就得算算账了，如你所言重定义或者未定义就可以阻断编译了

user: user-0
content: 引用 2 楼 與蘤舊縐的回复:那么只能告诉你，如果extern修饰的变量不存在，又在下面的程序中使用了该变量，即在可以联系到的外部无定义，连编译都过不去 如何x存在，我这粗略的理解正确吗

user: user-2
content: 那么只能告诉你，如果extern修饰的变量不存在，又在下面的程序中使用了该变量，即在可以联系到的外部无定义，连编译都过不去

user: user-0
content: 1、中 那个""d""是多余的，打错了
user-0 提问: C语言函数疑问

回复:
user: user-1
content: 传入的是那个地址，那个就作为函数里的首地址

user: user-0
content: 引用 3 楼 與蘤舊縐的回复:形参的值取决与你传入的实参，传入的是a+2，自然是a+2 谢谢大佬（至少十个字是咋回事。。）

user: user-2
content: 形参的值取决与你传入的实参，传入的是a+2，自然是a+2

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:a+2（什么时候网页版也有字数限制了） 你的意思是会将a+2作为首地址吗

user: user-2
content: a+2（什么时候网页版也有字数限制了）
user-0 提问: 代码输出相应字符在键盘上的位置

回复:
user: user-1
content: 不同的键盘的位置不一样吧，准确的获得要靠键盘的扫描码， 除了ps2这种标准键盘还有莫尔特键盘；  不过就你的问题来说， 做一个二维数组就好了 记录键盘位置     1234567890       qwertyuiop     asdfghjkl     zxcvbnm 按键后查找对应的位置，是比较笨的办法 更好的办法 unsigned int keyboard[256] = {};     keyboard['1']  =  0<<16 + 0;  // 0行0列。  整数的最低16位表示在第几列，高16位表示第几行 然后按什么键，直接查表输出

user: user-2
content: 想来也就两个办法，要么手动录入键盘的键位，要么调用某些个已经实现的库  不明确你的具体需求，因此如何记录键位方法就多了
user-0 提问: 比较两个整数的大小，为什么输出的总是第一个数？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 你那个scanf里应该用了中文逗号

user: user-3
content: 关于这个问题的详细描述，请参考这个推文，点击这里 #include<stdio.h>  int main(){   int max(int x, int y);    int a,b,c;   scanf_s("%d,%d",&a,&b);   c=max(a,b);   printf("max = %d\n",c);    return 0; } int max(int x, int y){   int z;   if(x>y) z=x;   else z=y;   return z; }

user: user-4
content: 你少了判断！

user: user-5
content: 单步调试呗，你看y的值为一个随机值，你就知道传进去的y有问题了。

user: user-6
content: scanf_s("%d,%d", &a, &b);  注意输入的时候中间有逗号，也注意逗号的中英文，要和scanf_s中的逗号保持一致。

user: user-7
content: 建议楼主调试一下，分步运行。这样容易知道具体原因。

user: user-8
content: 局部变量最好别当返回值

user: user-9
content: 建议楼主使用 scanf_s 函数时不要使用格式控制，因为你永远不知道程序使用者会怎样输入数据，所以会导致程序不健壮。

user: user-10
content: 我也遇到一样的问题了，但是我用的就是英文逗号啊？

user: user-0
content: 感谢楼上的及时且耐心细致的答复，我刚刚试了下，确实如此，问题解决了，非常感谢您！

user: user-11
content: 比如你输入3 全角逗号 1，那么第二个数字的接收就会出现问题，所以始终是第一个大

user: user-11
content: 极有可能你输入时用了中文逗号，scanf_s("%d,%d", &a, &b);%d逗号%d，需要你输入半角逗号
user-0 提问: 求各位大神解决一下，c语言顺序表问题

回复:
user: user-1
content: length记录的应该是有效的顺序表的长度， 0就空，1就是有一个 对应的element有效范围是0到length-1才对 可是看你的代码， element的length下标元素是可用的， 然后就导致了多个部分代码很奇怪   1 输出部分。for(i=0;i<=pt->length;i++)     如果只有length个有效， 那么就只能是i<pt->length;   2 insert部分  if(i<1||i>pt->length)//说明i不在范围之内  应该是if (I>=pt->length) 就是不在有效范围内 判断是否满，也应该是 length >= MAXSIZE   传参进来的i就是应该是从0开始的， 而不是i--后再来使用，很别扭的；  c/c++里面人都习惯了从0开始； 如果你非要让用户认为从1开始，那你在输入输出的部分做转化， 不去改代码，程序员从0开始是惯例  后面都是这样的问题
user-0 提问: 递归

回复:
user: user-1
content: 引用 4 楼 victorial666 的回复:[quote=引用 1 楼 真相重于对错 的回复:] 举个例子下面的代码能看懂吗? void test1(){   cout<<"test1 call"<<endl;    test2();    cout<<"test1 call"<<endl; } void test2(){    cout<<"test2 call"<<endl; } int main(..) {    test1(); } 这个结果是 test1 call test2 call test1 call 吗？ 但是我问的并不是这个意思   [/quote] 你把test2改成test1不就一样啦。

user: user-0
content: 引用 3 楼 寻开心 的回复:up_and_down(3) 调用了up_and_down(4), 那么up_and_down(4)执行完，就会回到up_and_down(3)去继续执行其他的代码 1    2        3            4            4       3    2 1 我有点懂了，谢谢

user: user-0
content: 引用 1 楼 真相重于对错 的回复:举个例子下面的代码能看懂吗? void test1(){   cout<<"test1 call"<<endl;    test2();    cout<<"test1 call"<<endl; } void test2(){    cout<<"test2 call"<<endl; } int main(..) {    test1(); } 这个结果是 test1 call test2 call test1 call 吗？ 但是我问的并不是这个意思

user: user-2
content: up_and_down(3) 调用了up_and_down(4), 那么up_and_down(4)执行完，就会回到up_and_down(3)去继续执行其他的代码 1    2        3            4            4       3    2 1

user: user-2
content: if (n<4)     up_and_down(n+1); 如果n不小于4呢， 这个就不向下进行了，这个函数就要返回，返回就到了上层了， 那个位置n还是3

user: user-1
content: 举个例子下面的代码能看懂吗? void test1(){   cout<<"test1 call"<<endl;    test2();    cout<<"test1 call"<<endl; } void test2(){    cout<<"test2 call"<<endl; } int main(..) {    test1(); }
user-0 提问: c语言malloc

回复:
user: user-1
content: char  * func(int n) {       char *p = (char*) malloc( sizeof(char)*n);  // 子函数分配       ....       return p; };  int anotherFunc() {        char * str = func(3);        ....         free(str);   // 不再用这个str的时候就可以free掉         return 0; }

user: user-2
content: 一样free啊？？？
user-0 提问: 求问dev-c++这是咋回事

回复:
user: user-0
content: 引用 1 楼 寻开心的回复:1 不要用中文路径和文件名 2 换一下编译目标，改成64 debug或者改成32 debug模式再编译一下看看 改成64和32都不行

user: user-0
content: 引用 1 楼 寻开心的回复:1 不要用中文路径和文件名 2 换一下编译目标，改成64 debug或者改成32 debug模式再编译一下看看 还是不行啊不知道为啥

user: user-1
content: 1 不要用中文路径和文件名 2 换一下编译目标，改成64 debug或者改成32 debug模式再编译一下看看
user-0 提问: 如何理解这部分的代码呢

回复:
user: user-1
content: 这是一坨非常古老的代码 main(_,l)char**l;{6*putchar(--_%20?_+_/21&56>_?strchr(1[l],_^"pt`u}rxf~c{wk~zyHHOJ]QULGQ[Z"[_/2])?111:46:32:10)^_&&main(2+_,l);}  main(_,l)char**l; 这是主函数入口，翻译过来就是 main（int _, char **l) 所以后面的_ 就是表示这个程序被调用时候参数的个数 I是字符串指针， I[0] 这个的程序执行文件的名字， I[1]开始是后面的跟随的一个个参数字符串  后面的代码仔细看也没有什么特别的，只是让那个_ 变量名字给搞的乱而已  main(int argc, char **argv ) {      return 6*putchar( --argc % 20. ? argc + argc/21 & 56 > argc ? strchr(1[l],argc^ "pt`u}rxf~c{wk~zyHHOJ]QULGQ[Z"[argc/2]) ?111:46:32:10) ^ argc && main(2+argc,argv); }  愿意做就继续往下拆解吧， 一坨有一坨

user: user-0
content: 这个是输入字符之后找到字符在键盘上的位置，大概是这个意思，但是没有读懂这个代码。

user: user-2
content: 不懂，只能帮你运行一下，结果是这样的：
user-0 提问: C语言求救   大佬捞我一下

回复:
user: user-0
content: 我的if括号忘记括起来了。。。天哪，功夫不够，继续学习。 只记升温，如果两天温度连续则要重新计数。

user: user-1
content: 用不到dp，就一次循环就出来了  楼主， 你的if(a<m） 配合的else放哪儿去了 ，  仔细看看吧！！       当这个条件不满足的时候，才是重新统计t，在这个时候更改ans才是最合适的地方， 没有必要每次都去比较t和ans   不确定连续两天温度相同算不算序列内， 自己测试测试吧

user: user-2
content: 这个是最长上升子序列的题型，应该用dp做的，你这么写应该会有问题
user-0 提问: C语言函数调用名字改变调用结果会改变吗？

回复:
user: user-1
content: 引用 3 楼 AKK188888881 的回复:C 库导出的符号还是 scanf 没变吗？  我并没有调用库函数！！！ 而是把库函数复制粘贴在用户自定义的"stdio.h" 此时不是<stdio.h>！！！然后我调用了它 把里面的scanf改成了scang相应的源文件scanf也改成了scang 我无语了，你只不过是改了 scanf 的声明而已，问题是 scanf 的函数体定义也要对应改名，然而 scanf 的实现在 C 标准库里，你根本改不了。

user: user-0
content: C 库导出的符号还是 scanf 没变吗？  我并没有调用库函数！！！ 而是把库函数复制粘贴在用户自定义的"stdio.h" 此时不是<stdio.h>！！！然后我调用了它 把里面的scanf改成了scang相应的源文件scanf也改成了scang  但是为什么还是现实scang没有定义？就算我现在还是scanf，scanf还是未定义，因为我调用的文件"stdio.h"的scanf被我改成了scang

user: user-0
content: C 库导出的符号还是 scanf 没变吗？  我并没有调用库函数！！！ 而是把库函数复制粘贴在用户自定义的"stdio.h" 此时不是<stdio.h>！！！然后我调用了它 把里面的scanf改成了scang相应的源文件scanf也改成了scang

user: user-1
content: 头文件不能瞎改。这里是声明了 scang，但是 C 库导出的符号还是 scanf 没变，于是链接时编译器找不到 scang 在哪，然后报错。
user-0 提问: 关于freopen的用法问题

回复:
user: user-1
content: int main() {     int a, b;     FILE *stream1;     freopen_s(&stream1, "in.txt", "r", stdin);       freopen_s(&stream1, "out.txt", "w", stdout);     while (cin >> a >> b)     cout << a + b << endl; // 注意使用endl      fclose(stdin);//关闭文件      fclose(stdout);//关闭文件     return 0;  }

user: user-2
content: freopen_s 和 freopen 的用法不同，可以百度其用法或者选择关闭 SDL 检查。
user-0 提问: 求助一下，怎么让下面的代码无限次循环执行?

回复:
user: user-1
content: 用 for(;;) 包起来也行

user: user-2
content: C莫得true

user: user-3
content: #include <stdio.h> int main(){     int t,i;         while（true） {     scanf("%d",&t);     for(i=1;t>0;i+=2){         t-=i;     }     if(t==0){         printf("Yes");     }     else{         printf("No");     }  }        return 0; }

user: user-2
content: main下面或者int下面到return之前这一段用while(1)包起来
user-0 提问: 我又卡住了

回复:
user: user-0
content: 大佬，有点听不懂，我用fprintf和fscanf输出结果日期没错但是下面的都是0

user: user-1
content: 内存结构到磁盘的写入工作， 用一个单独的函数完成 反向从磁盘读取的工作也是一个单独函数完成 程序启动的时候，从磁盘加载数据到内存 数据增删改之后，写入磁盘 查询就是内存结构直接出结果就好了 除非你的内存数据量特别大，有成千上万条，否则完没有必要处处从磁盘来操作

user: user-1
content: if (fwrite(&t[num], sizeof(struct  teacher), 1, fp) != 1) printf("file write error\n"); 这是写入数据，然后如果输入选择预览就 fread(&t[j], sizeof(struct  teacher), 1, fp); 这不行 fwrite之后，文件指针跑最后去了 fread读回来的只能是eof了 fwrite后，还要fflush或者直接fclose才会保证把数据写入磁盘，否则还在磁盘缓冲区里面呢，马上读也读不出来 fflsh（fp） fseek回到文件头再开始读  此外，为什么要用fread，而不是内存当中提取呢？ 这个逻辑不对 添加，修改了数据后写入文件，查询在内存当中的文件里面进行就好了
user-0 提问: 求助！！！C语言scanf()接受的值错误

回复:
user: user-0
content: 把  %1s  改为 %s 或 %c 都无法解决

user: user-1
content: 原因是溢出了 d只有1个长度， 读取字符串尾巴会自动加一个'\0' 覆盖了c的值
user-0 提问: 谁能告诉我这个c代码错在哪里？

回复:
user: user-1
content: struct Student * p=(struct Student *)malloc(sizeof(struct Student)); pst->sid = 99; pst->age = 88; 注意,定义的变量名为p

user: user-2
content: struct Student *CreateStudent(void) { struct Student * p=(struct Student *)malloc(sizeof(struct Student)); pst->sid = 99; pst->age = 88; return p; }  pst又没有定义成全局变量， 这个函数里面就找不到pst的定义 你要把它如同ShowStudent(ps)的方式一样， 函数传参数进来才可以  c语言里面，所有的变量都有自己的有效范围的 函数里面定义的变量，只能在函数内有效。 ShowStudent里面作为参数使用的pst，只在ShowStudent函数内有效  这样改造吧 struct Student *CreateStudent(struct Student * pst) { 。。。。。 }

user: user-3
content: ShowStudent(ps)的

user: user-3
content: pst->sid = 99; pst->age = 88; 哪来的pst
user-0 提问: 在c语言中要用到  类似java中的ArrayList的功能，一般是怎么做的？

回复:
user: user-1
content: 自己实现，或者第三方库，C++用stl，C应该是没了

user: user-2
content: 标准C肯定没有。 用第三方库吧。
user-0 提问: 求讲解下公交查询程序换乘怎么整。

回复:
user: user-0
content: 有没有人啊！！！！！！！

user: user-1
content: 这个用到算法了，你们应该没有学吧

user: user-1
content: 引用 3 楼 lipjsfds 的回复：[quote=引用 2 楼 初学小菜的回复:]这个用到算法了，你们应该没有学吧 没有学算法，请问怎么整呢。我现在只会让他在一条公交线上乘车[/quote]迪杰斯特拉求最短路径，显示所有路径，这个就看具体怎么yong l

user: user-0
content: 引用 2 楼 初学小菜的回复:这个用到算法了，你们应该没有学吧 没有学算法，请问怎么整呢。我现在只会让他在一条公交线上乘车
user-0 提问: C语言extern关键字

回复:
user: user-1
content: 我这里简单的定义了一个全局变量，

user: user-2
content: 1. 就是在当前翻译单元内引入这个外部对象，这样编译器好生成对应的符号，至于找实际定义并联系起来是链接器干的事情。 2. 选择调试模式即可。

user: user-0
content: 想用vs2010看一下针对特定的一个语句，编译器有什么操作，不知道如何查看

user: user-3
content: 百度下“链接”，跨文件共享变量

user: user-0
content: 引用 10 楼 apkipa1的回复:就拿你的例子来说一种可能的行为(实际行为会有差距)，extern int x; 告诉编译器当前翻译单元需要导入 _global_x，然后编译器在遇到 x = 10; 时就换成了 _global_x = 10 (汇编为 mov dword ptr ds:_global_x, 10)，而在另一个翻译单元里有一句 int x = 1; 告诉编译器需要将 1 存到内存里，并将其导出为 _global_x，最后就由链接器搜索对应的名称、重新计算内存偏移、重定向内存引用到正确的地方上。 懂了懂了 也就是说链接器去搜索_global_x，，搜索到了，10就能存到那块内存了

user: user-2
content: 就拿你的例子来说一种可能的行为(实际行为会有差距)，extern int x; 告诉编译器当前翻译单元需要导入 _global_x，然后编译器在遇到 x = 10; 时就换成了 _global_x = 10 (汇编为 mov dword ptr ds:_global_x, 10)，而在另一个翻译单元里有一句 int x = 1; 告诉编译器需要将 1 存到内存里，并将其导出为 _global_x，最后就由链接器搜索对应的名称、重新计算内存偏移、重定向内存引用到正确的地方上。

user: user-0
content: 引用 2 楼 apkipa1的回复:1. 就是在当前翻译单元内引入这个外部对象，这样编译器好生成对应的符号，至于找实际定义并联系起来是链接器干的事情。 2. 选择调试模式即可。 /a.c中 int x； —————— //b.c中 #include…… extern int x; int main() {……;x=10;……} 编译器编译b. c这个翻译单元时 x=10；（按文件编译时，当前单元无x的定义啊） 编译器不就无法把10存到内存了 还是让连接器来做？

user: user-0
content: 引用 7 楼 自信男孩的回复:找不到，提示警告甚至是错误；找到就会把变量指向内存的位置。 让          连接器找？

user: user-4
content: 找不到，提示警告甚至是错误；找到就会把变量指向内存的位置。

user: user-5
content: 找到之后，就拿来用呀。 就跟自己定义的一样。

user: user-1
content: 引用 4 楼 m0_46300909 的回复:[quote=引用 3 楼 子衿兄的回复:]我这里简单的定义了一个全局变量，  我不懂汇编呀，反汇编的那些代码没看明白[/quote]   不用懂汇编，，你看到显示的符号，，对应就行。。 要理解深入的话，还是要能看懂一些基本的汇编代码

user: user-0
content: 引用 3 楼 子衿兄的回复:我这里简单的定义了一个全局变量，  我不懂汇编呀，反汇编的那些代码没看明白
user-0 提问: PTA查验身份证

回复:
user: user-0
content: 太感谢大佬了，真的是，好几天一直没有过，按照你说的我把输入和输出全部改成%s以后，就全部过了，我还是刚刚接触PTA上的这些题目，不胜感激啊

user: user-1
content: 算法看不出来哪儿有问题 是所有的都不通过，还是个别的？  如果是所有的，你尝试修改三个地方看看 两个是关于k的循环， 有效范围 0到17， 不是<19 而是小于18； 甚至直接把那个%c输出，直接改成%s输出a[i]好了 最后return 0； 测试平台往往是用管道方式来把文件作为参数输入和输出，输出不可见字符0也许会有区别（k循环那里） return 返回值本来就是给调用它的系统使用的， 对于测试平台也一样  还有就是检查一下， 那个全部通过的单词， 是否和你的printf里面的完全一样，最好是复制粘贴过去

user: user-0
content: 一个合法的身份证号码由17位地区、日期编号和顺序编号加1位校验码组成。校验码的计算规则如下： 首先对前17位数字加权求和，权重分配为：{7，9，10，5，8，4，2，1，6，3，7，9，10，5，8，4，2}；然后将计算的和对11取模得到值Z；最后按照以下关系对应Z值与校验码M的值： Z：0 1 2 3 4 5 6 7 8 9 10 M：1 0 X 9 8 7 6 5 4 3 2        现在给定一些身份证号码，请你验证校验码的有效性，并输出有问题的号码。 输入格式： 输入第一行给出正整数N（≤100）是输入的身份证号码的个数。随后N行，每行给出1个18位身份证号码。 输出格式： 按照输入的顺序每行输出1个有问题的身份证号码。这里并不检验前17位是否合理，只检查前17位是否全为数字且最后1位校验码计算准确。如果所有号码都正常，则输出All passed

user: user-1
content: 原始题目要求是什么，要想通过除了算法没有问题外，你还要确保输出的格式和要求的完全一样 最好贴出题目的完整要求
user-0 提问: 如何用outtextxy函数在指定位置输出一个变量的值

回复:
user: user-0
content: 引用 8 楼 apkipa1的回复:可能的话，请在出现问题时截图或录制动态图并发出来，这样更好解决问题。 好的谢谢！我刚来CDSN

user: user-0
content: 引用 7 楼 與蘤舊縐的回复:可能就sprintf、_stprintf_s、_stprintf这几个函数的问题了，我自己在vs 2019上用过sprintf，没出问题，不过大半年前了 好的解决了，sprintf将score打印到数组中可能是会有溢出，改为sprintf_s就好啦，应该是这样解释的吧，刚刚只检查了数组，感谢！

user: user-1
content: 可能的话，请在出现问题时截图或录制动态图并发出来，这样更好解决问题。

user: user-2
content: 可能就sprintf、_stprintf_s、_stprintf这几个函数的问题了，我自己在vs 2019上用过sprintf，没出问题，不过大半年前了

user: user-0
content: 引用 4 楼 與蘤舊縐的回复:用法上没有问题，不过有可能是你的数字转化为字符串超出了字符数组的范围 扩大了数组范围也是一样的

user: user-2
content: 以上只是猜测，感觉不会引起生成问题，以下是官方文档，可以参考一下   // 输出数值，先将数字格式化输出为字符串 (VC6) char s[5]; sprintf(s, "%d", 1024); outtextxy(10, 60, s); Copy // 输出数值 1024，先将数字格式化输出为字符串 (VC2008 / VC2010 / VC2012) TCHAR s[5]; _stprintf(s, _T("%d"), 1024);		// 高版本 VC 推荐使用 _stprintf_s 函数 outtextxy(10, 60, s);

user: user-2
content: 用法上没有问题，不过有可能是你的数字转化为字符串超出了字符数组的范围

user: user-0
content: #include<stdio.h> #include<graphics.h> int score = 0;//总分 int rank = 0;//等级  //欢迎界面 void welcome(void) { 	//初始化画布 	initgraph(550,660); 	setbkcolor(BLACK); 	cleardevice(); 	//设置窗口标题 	HWND window = GetHWnd();//获取窗口 	SetWindowText(window, _T("俄罗斯方块  by炎黄c"));//设置窗口标题 	//设置文本字体样式 	settextstyle(40, 0, _T("微软雅黑"));/tfont无法使用，需要用setteststyle代替 	setcolor(WHITE); 	outtextxy(205, 200, _T("俄罗斯方块")); 	settextstyle(22, 0, _T("楷体")); 	setcolor(BLUE); 	outtextxy(175, 300, _T("编程，从俄罗斯方块开始"));  	Sleep(3000);//暂停3000毫秒，3秒钟   } //初始化游戏场景 void initGameScene(void) { 	char str[16]; 	 	//清除屏幕 	cleardevice(); 	rectangle(27,27,336,635); 	rectangle(29,29,334,633); 	rectangle(370,50,515,195); 	settextstyle(25, 0, _T("楷体")); 	setcolor(WHITE); 	outtextxy(405, 215, _T("下一个:")); 	settextstyle(25, 0, _T("楷体")); 	setcolor(RED); 	outtextxy(405, 280, _T("分数:")); 	settextstyle(25, 0, _T("楷体")); 	setcolor(RED); 	outtextxy(405, 375, _T("等级:")); 	sprintf(str, "%d", score); 	outtextxy(415, 310, str);   }  int main(void) { 	welcome(); 	initGameScene();   	system("pause"); 	closegraph(); 	return 0;  }

user: user-3
content: #include <wchar.h> int swprintf(wchar_t *buffer, const wchar_t *format, ...);  int main( void ) { wchar_t buf[100]; int len = swprintf( buf, L"%s", L"Hello world" ); printf( "wrote %d characters\n", len ); len = swprintf( buf, L"%s", L"Hello\xffff world" ); // swprintf fails because string contains WEOF (\xffff) printf( "wrote %d characters\n", len ); }

user: user-2
content: 先sprintf格式化字符串，再用outtextxy输出，应当不会出问题，请贴代码
user-0 提问: 新手求大神帮忙解决一下问题，谢谢！！

回复:
user: user-1
content: 如上可保证输入正确 算法自己改，对于特例输入1，结果是输出4显然是错的

user: user-1
content: 整那么多重复的去掉清空缓冲区的办法做啥， 任何一样就够了  #include <stdio.h> #include <math.h> #include <stdlib.h>  int main()   {     int ret,day,i=1,sum=1;     printf("Input days:\n");     ret=scanf("%d",&day);     while((ret!=1) || ( day<=0))     {           fflush(stdin);           printf("Input days:\n"); 		  ret=scanf("%d",&day);     }     do  {        sum=(sum+1)*2;        i++;      }while(i<day);     printf("sum=%d\n",sum);     return 0;   }

user: user-0
content: 好的，谢谢大神
user-0 提问: 警告C6387

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

user: user-2
content: if (fp)     fclose(fp); 这样试试～

user: user-3
content: MSDN自己的例程都会报警告，求教楼主最后怎么解决的？

user: user-4
content: 既然已经用errno_t检查过了，没问题是肯定的，不过编译器还是warning。亲测解决方式：if(fp&&!err); 解决了的话赞起来

user: user-5
content: 想去掉警告很简单，下面再判断一次即可

user: user-5
content: fopen_s的第一个参数确实是二级指针，用二级指针修改一级指针的指向，没什么问题  这警告无非是想说fp可能指空了，既然你上面已经判断过err的情况，要么err不包括该情况，要么编译器检查不到位

user: user-6
content: fopen 函数里，第一个参数对对指针变量取地址好像不对吧，第二个参数加了双引号的话那文件名就叫“filename”了。
user-0 提问: 在用数组元素给变量多次赋值时，刚赋值结束，变量值就自动变化是为什么

回复:
user: user-1
content: 开什么玩笑啊  x = Number[x-1][y-1].m ;   y = Number[x-1][y-1].n;     // 此时的x，已经被上一句赋值所替换了  发生变化有何奇怪？！
user-0 提问: C语言作用域

回复:
user: user-1
content: LZ看个简单的例子就明白了，局部变量编译后其实就变成了一个偏移地址，对变量的操作只是对变量这块内存地址的操作  int main() {     int *p1, *p2, *p3;     int a = 1;     p1 = &a;     {         int a = 2;         p2 = &a;     } //如果变量离开作用域块内存就被回收     {         int a = 3; //那么这里的内存地址应该和上面一样，但事实并非如此         p3 = &a;     }     printf("%p, %p, %p\n", p1, p2, p3); //所以每个变量的内存地址不一样，但可以看出地址是连续的，所以说明在编译时就决定了     printf("%d, %d, %d\n", *p1, *p2, *p3); //这里还说明了离开作用域块，变量的内存并没有被回收（因为方法栈没被回收），只不过不能通过作用域块里的变量标识符来访问该内存了，外层作用域块如果有相同的变量标识符则以外层的变量为有效标识，如果外层没有变量标识符则语法检测通不过编译失败。     return 0; }

user: user-2
content: 要相信编译器，不会有问题 作用域本身就是为了 符号复用 (不同作用域的同一个符号表示不同意思) 特意设置的一个语法机制

user: user-3
content: 作用域本身就是为了 符号复用 (不同作用域的同一个符号表示不同意思) 特意设置的一个语法机制 然后不存在什么本质的东西 为了符号复用这个目的设置的这个机制 编译器实现了这个机制 仅此而已

user: user-4
content: 其实编译器会自动处理名称冲突的，给你举个实例吧，这是源代码：  这是编译器生成的代码：  可见编译器对重名的对象进行了适当修改。

user: user-5
content: 不好意思，说错了，python的那个改名字的操作应该是设置私有属性的时候才使用的，不过python本身其实并不是很好地支持属性私有化，甚至可以直接拿变了的那个名字访问所谓的私有变量

user: user-5
content: 讲不出啥，底层自有实现方法，而且C是编译型语言，底层实现可能更纯粹吧，像python的话，类属性和实例属性如果名称一致其实解释器是做了一点小手脚，大致就是在变量名前面加个下划线什么的，C不清楚，感觉他不需要这么拐弯抹角

user: user-6
content: int main() {    int I;    while (1) {        int I;        I = 0;   // 这就是内层的I，不是外层的I   } }  这没有什么原理啊。  编译器，把它当成完全不同的两个变量，对编译器来说，不同的变量名就是不同的内存地址而已 完全没技术含量

user: user-4
content: 没什么本质，只是单纯地覆盖而已，或者可以说是 C 语言规定的特性。

user: user-0
content: 大神 能讲讲本质性问题吗
user-0 提问: 程序算出来的数字精度不对，请问是我的程序写的有问题么，谢谢各位大神

回复:
user: user-1
content: 可以认为是精度的问题，但是不完全是精度的问题 你把float换成doube也没用 关键是浮点数在计算机当中的保存方式的问题 浮点数不能完全的表示一个数， 1.3 很可能在电脑当中保存的就是1.29999999999999 long转换是截断的方式， 29.999999999 也认为是29  你可以先printf（“%10f”， amount[i]）；来看看1.3，2.3.等到底输出的是什么 之所以用.10f是因为printf是带有四舍五入功能的，只有超出了float的精度范围的输出才能体现出来，否则仅为后看不到  要想获得正确的结果，改一下 center[I] = (long)((m[I] - d[I] * 100 + 0.5); 类似这样的方式
user-0 提问: 读写空指针不会报错的情况

回复:
user: user-0
content: 引用 11 楼 apkipa1的回复:顺便用 godbolt 跑了一下，同样能提示出错，我怀疑你配置的环境把程序错误给吃了。  唉，天知道，重配完事，明天再试，感谢帮助

user: user-1
content: 顺便用 godbolt 跑了一下，同样能提示出错，我怀疑你配置的环境把程序错误给吃了。

user: user-0
content: 各位，楼歪了(这app10个字真麻烦)

user: user-2
content: debug 和 release 不一样， 你弄个两个版本去测试去

user: user-0
content: 引用 7 楼 user-3的回复:[quote=引用 4 楼 與蘤舊縐 的回复:] 是的，所以说只是在这个编译器下的侥幸事件，无需纠结，回归正题即可  [quote=引用 3 楼 apkipa1 的回复:] 我试了，在执行到第三个 printf 时程序崩溃了，不过我的系统有点毛病，没法弹出崩溃提示。不过用一些手段能看到抛出的异常： [/quote]  C语言的指针十分强大，但是要求使用者要谨慎使用。你们这个结果显示的是EXCEPTION_ACCESS_VIOLATION,字面意思就是试图访问不可访问的内存。可以使用C++运行这些代码，然后捕捉这个异常并做一下处理试试。[/quote] 崩溃这事上我还是留了一手，至少看到了program exit with code 0，不过调试真没试，看你这么一说突然想起来以前用mysy2配的mingw64工具链应当会对段错误做出反应的，而且报错还是赤裸裸的“段错误”三个字，看来得去检查一下配置了，感谢回复

user: user-3
content: 引用 4 楼 與蘤舊縐 的回复:是的，所以说只是在这个编译器下的侥幸事件，无需纠结，回归正题即可  [quote=引用 3 楼 apkipa1 的回复:] 我试了，在执行到第三个 printf 时程序崩溃了，不过我的系统有点毛病，没法弹出崩溃提示。不过用一些手段能看到抛出的异常： [/quote]  C语言的指针十分强大，但是要求使用者要谨慎使用。你们这个结果显示的是EXCEPTION_ACCESS_VIOLATION,字面意思就是试图访问不可访问的内存。可以使用C++运行这些代码，然后捕捉这个异常并做一下处理试试。

user: user-3
content: 这是在ubuntu18.04 Qt上调试显示的结果

user: user-3
content: 在调用第三个pop时会有一个信号发出。在POSIX兼容的平台上，SIGSEGV是当一个进程执行了一个无效的内存引用，或发生段错误时发送给它的信号。 如果不设置捕捉该信号的情况下程序会自动终止。你可以在第三个pop后面打印一些字符串，你会发现并不会执行。Windows就不太清楚了，原理应该差不多。这种错只从执行结果上很难判断的，只要执行调试，出现信号时一般的调试器都还是能显示的。

user: user-0
content: 是的，所以说只是在这个编译器下的侥幸事件，无需纠结，回归正题即可  引用 3 楼 apkipa1 的回复:我试了，在执行到第三个 printf 时程序崩溃了，不过我的系统有点毛病，没法弹出崩溃提示。不过用一些手段能看到抛出的异常：

user: user-1
content: 我试了，在执行到第三个 printf 时程序崩溃了，不过我的系统有点毛病，没法弹出崩溃提示。不过用一些手段能看到抛出的异常：

user: user-0
content: 引用 1 楼 apkipa1 的回复:神奇，有代码可以复现吗？  重写了个简单的，不同编译器下结果不同，当前编译器效果如下图（最后一句没有输出，没有报错）  这个情况估计是几率性事件，重点在于问题，网上查了一通找到些NULL指针的用法，关于该问题的信息不多，我还是觉得NULL指针不可读写，不过闲来无事碰碰运气，看看能不能搜集到一点特殊情况   typedef int elemType;  typedef struct stack {     elemType item;     struct stack *next; } stack;  stack *predecessor_stack(stack *s) {     if (NULL == s->next) {         return NULL;     } else if (NULL == s->next->next) {         return s;     } else {         return predecessor_stack(s->next);     } }  stack *pop(stack *s) {     stack *temp = s->next;     stack *pre = predecessor_stack(s);     if (NULL == pre) {         return NULL;     } else {         while (NULL != temp->next) {             temp = temp->next;         }         pre->next = NULL;         return temp;     } }  void push(stack *s, elemType x) {     stack *new = (stack *) malloc(sizeof(struct stack));     new->next = NULL;     new->item = x;     while (NULL != s->next) {         s = s->next;     }     s->next = new; }

user: user-1
content: 神奇，有代码可以复现吗？
user-0 提问: 关于外部函数调用的问题

回复:
user: user-1
content: main（）函数里面又定义了局部变量  char option1,option2,option3,option4; 键盘输入都保存到这里了，根本就没有放到全局变量——extern所指定的变量里面去 把main里面的这四个局部变量删掉
user-0 提问: 关于函数返回值的一点小问题

回复:
user: user-1
content: 引用 3 楼 燕子深藏花海 的回复:[quote=引用 1 楼 與蘤舊縐 的回复:] a=a++，那么问题来了，a=a++原本的值，也就是之前的a，那么++操作等于无效，还是等于a++操作之后的a，=赋值不正常  虽然没有明令禁止，但一般不会这么干的 后缀自增的话不是理解成完成其他运算后，再执行自增吗，即a=1 a=a++ 先执行赋值运算 再执行a自增 所以 之后a=2？ 可以这样看出程序的执行顺序？ 后缀自增是在其他运算（return）结束后才执行的？   我所要问的就是这里而已。[/quote]  首先，++不是这么判断顺序的，其次我为什么说先是a++，因为你这里自增操作在函数里完成，赋值运算右边先进行，当然是先执行函数，必然先++，后面是函数返回之后的事情了

user: user-2
content: return (*a)++; 在 return 执行完毕后，对 *a 的自增生效，同时 *a 的原始值被返回到上层。然后 a = f(&a)，在执行到分号后，对 a 的赋值生效，结果是 a 的值没变。

user: user-3
content: 引用 5 楼 燕子深藏花海 的回复:为什么编译器会认为 a=a++ 后 a会自加 ， 而a=f（&a） 却不自加 ，但 b=f（&a） 自加？ 这才是我的问题  a = f(&a);  // a在f函数里面自增了，但是函数里面return的是自增之前的a， 这个值被赋值给了a， 所以覆盖了，导致没有加 b = f(&a); 就没有问题了， 返回的值给了b，a自增自己的，不影响   另外 a = a++； 这种代码属于未定义的行为 不要写，不同编译器结果会不同的

user: user-0
content: 为什么编译器会认为 a=a++ 后 a会自加 ， 而a=f（&a） 却不自加 ，但 b=f（&a） 自加？ 这才是我的问题

user: user-4
content: a=a++，先把=右边的表达式计算出来的结果（就是a）保存在一个临时变量，然后a自增1，然后再把临时变量赋给=左边的a，也就是重新覆盖了a自增的结果，所以最终a还是a

user: user-0
content: 引用 1 楼 與蘤舊縐 的回复:a=a++，那么问题来了，a=a++原本的值，也就是之前的a，那么++操作等于无效，还是等于a++操作之后的a，=赋值不正常  虽然没有明令禁止，但一般不会这么干的 后缀自增的话不是理解成完成其他运算后，再执行自增吗，即a=1 a=a++ 先执行赋值运算 再执行a自增 所以 之后a=2？ 可以这样看出程序的执行顺序？ 后缀自增是在其他运算（return）结束后才执行的？   我所要问的就是这里而已。

user: user-1
content: 你这个与与上述有所不同，很明显你的程序首先执行了a++，a变成了2，而后，return 1，a=1，a又变回1

user: user-1
content: a=a++，那么问题来了，a=a++原本的值，也就是之前的a，那么++操作等于无效，还是等于a++操作之后的a，=赋值不正常  虽然没有明令禁止，但一般不会这么干的
user-0 提问: 关于C语言结构体部分，字体加粗部分不明白为什么，求助！

回复:
user: user-1
content: printf("s1.name = %s, s1.num = %d, s1.isMale = %d.\n",   s1.name, s1.num, s1.isMale);  %s要求是字符串，也就是数组， 所以name必须是char数组， 否则就错了呗

user: user-2
content: 去掉之后name就变成char类型的了，对应的应当是%c，%s对应的是字符数组
user-0 提问: 这种溢出情况怎么解决啊，求各位大神看哈

回复:
user: user-0
content: 引用 1 楼 寻开心的回复:你这个fact函数当中a没有赋予初值， 所以a>0.0001的判断没准儿是什么， 也许根本就没有执行  另外，你在for循环里面，也加上一句printf函数输出b和a，看看每次迭代的数据变化 谢谢谢谢

user: user-1
content: 之所以出错，就是因为a没有初值， a就是你看到的那个所谓的溢出的那个数值， 他是负数， 不大于0.0001， 所以for循环根本没有执行，直接输出那个a了 应该初始a为1.0这样， 让它能进入for循环，之后a就有值了

user: user-1
content: 你这个fact函数当中a没有赋予初值， 所以a>0.0001的判断没准儿是什么， 也许根本就没有执行  另外，你在for循环里面，也加上一句printf函数输出b和a，看看每次迭代的数据变化
user-0 提问: 照书敲出来的代码 为什么有bug啊 不知道怎么解决

回复:
user: user-0
content: 引用 1 楼 user-1 的回复：建议你把这本书扔掉 void fun(int n)改为int fun(int n) void 表示无返回值，return s  s是一个int型数据表示返回的是一个int数据 建议你看下编译错误，提示写的很清楚了，实在不会把提示复制到百度搜索下就会明白了照着样子试了一下您说的改成int，运行了！ 感谢🙏 我上网查了 没查到

user: user-1
content: 建议你把这本书扔掉 void fun(int n)改为int fun(int n) void 表示无返回值，return s  s是一个int型数据表示返回的是一个int数据 建议你看下编译错误，提示写的很清楚了，实在不会把提示复制到百度搜索下就会明白了
user-0 提问: 所有类成员都可以被外部访问为什么是错的

回复:
user: user-1
content: A private成员可以被外部访问很显然是对的，因为这么说不是绝对的，说的是“可以”。而B说的是所有类成员，对于抽象类，抽象类也属于类的范畴，纯虚函数也是抽象类的成员，但抽象类不能实例化，所以就没有可以被外部访问一说了。 以上全是对着这个答案死磕的，如有错误，望大家指正。

user: user-2
content: 这题答案错了吧

user: user-0
content: 引用 2 楼 初学小菜 的回复:保护的不能够被访问 友元也不行吗

user: user-3
content: 保护的不能够被访问

user: user-4
content: 考虑下继承，比如以私有方式继承了一个基类的私有成员，与此同时，基类没有提供任何访问该成员的接口，感觉对这个派生类而言，这个基类的私有成员就完全不可访问了，友元关系好像不能递归或继承的，你可以编码确认下。个人感觉这种题没啥意思
user-0 提问: 这两个程序有什么不一样呢 不懂求指导

回复:
user: user-1
content: o 不对 第二个的fun的判断就错了 按照第二个fun的逻辑，只要有一个收尾匹配就返回了，实际上应该全部首尾匹配才可以

user: user-1
content: fun函数的return情况，这两个例子刚好相反， 主程序里面对返回结果的判断也要相反才对。 后一个程序的 if ( func(s) ) printf(yes)就是错的   应该是 if( !func(s)) printf(yes)
user-0 提问: int a =5 ;  a这个变量与存储5的那一块内存的地址是怎么对应的？

回复:
user: user-1
content: 引用 4 楼 o荞麦o 的回复:"int a" => 分配一块内块 "= 5" => 内存赋值为常量5    引用这位老兄的回答，再加上我的理解：  int a = 5； 1.我们假设int a 分配到的内存地址为0xaa。 2.int a存储空间最大为4个字节，也就是2^32，也就是可以存储的最大值为2^32. 3. = 5, 就是把这块地址0xaa，存储值为5.  综上所述，int a = 5.  a是这块地址的名称，程序员规定的。 0xaa是这块地址的地址，是计算机内存自动分配的。 5 是名字为a，地址为0xaa的内存存储的值。

user: user-2
content: 这要看变量定义在哪儿了， 全局变量，和局部变量不一样 全局变量，是把5存到数据段里面了， 不需要额外的初始化， 程序加载的时候自动就带进俩了， 然后把变量和这个地址对应上 局部变量不一样，函数调用的时候， 要把栈里面为他分配内存，并且初始化为5，然后把指针和他对上  这个要研究一下编译原理去

user: user-3
content: 代码编译后不存在a（也就是机器码里不存在a），a被编译为一个内存相对地址--相对于栈帧首地址的偏移地址 5就是写入a这块内存地址的信息（以二进制的形式保存在a这块内存区域里）

user: user-4
content: 这个时候，你应该学一学汇编

user: user-5
content: "int a" => 分配一块内块 "= 5" => 内存赋值为常量5

user: user-6
content: compiler

user: user-7
content: 由编译器来处理。理论来说你不应该去关心 a 到底对应着哪块内存，这种底层的活都是编译器干的，它甚至可以不给 a 分配任何内存。

user: user-8
content: 编译成二进制代码后就没有了a这个变量名，所谓的a是源代码的概念。编译后只是指的一个内存的区域，那个区域里存放的是整形5.

user: user-9
content: 看你int i定义在哪里，如果是全局变量，编译器分配，如果是局部变量，是运行的时候自动放在堆栈上的（当然还是编译器生成了相应的代码）。 所以你反汇编，可以看到类似 mov ptr[esp + 0x0000xxxx] 这样的指令，这个esp就是堆栈指针

user: user-10
content: 定义一个Int型变量，这个时候会放在文本段中，要看是以什么形式定义，可能放的位置不一样，  运行时，反汇编可以看到，要用这个变量实际上是指的一个地址，从这个地址中取数据  去查看这个地址的内容，可以看到内容
user-0 提问: C语言二分法查找

回复:
user: user-0
content: 引用 2 楼 寻开心 的回复：所以，如果要查找的数， 比*pa还大， 或者比*pb还小， 自然是不在这个范围内的啦懂了 非常感谢

user: user-1
content: 所以，如果要查找的数， 比*pa还大， 或者比*pb还小， 自然是不在这个范围内的啦

user: user-1
content: 那行的意思是如果要查找的数，不在这个数组的范围内，返回-1表示不存在  上一个sort函数里面说了，  这个数组是大的数在前面，小的数在后面 100 90  73  5 1   类似这样的排列关系
user-0 提问: 大神求解！！两次第二次输出为什么都是2？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 两次都是i=1， 然后是i++，或者++i；  无论哪种，最后i都是自增一， 够二的条件了。 而～取反操作，只是用i的数值作为条件来的出新的数值，对i自身并无修改， 不影响i是几 最终就是二

user: user-3
content: ~i++:  这里的++是postfix ++，所以优先级比~高，所以先做postfix ++，然后再取反。这然后的取反操作是后执行的，所以其结果成为整个表达式的值，被打印输出。postfix ++是先evaluate然后再increment。evaluate的结果送去~，在这之后i原先的值++。那么，i原先的值是1，是这个1被取反，结果是-2，作为整个表达式的值，被打印出来。同时i原先的值increment，变成2。因为我前面说的，表达式的值是~的结果，不是postfix ++的结果，所以是-2被送去打印，而不是2。

user: user-4
content: 不是2，应该是什么？

user: user-5
content: i++与++i不同，i++取反是对1取反之后i为2，++i先i自增为2后取反

user: user-3
content: ~++i: ~和prefix ++具有相同的优先级，这一层优先级是right associative，所以先做++i，然后再~。prefix ++的值是increment之后的结果，也就是2。然后对这个2进行~，结果就是-3。-3作为整个~++i表达式的值，送去打印。
user-0 提问: 求问各位博士，各位前辈，各位伙伴，我是调用函数求素数，能不能帮忙看一下我的问题到底出在哪里？怎么调用函数？这调用函数没有起到作用，这到底是为什么呢？

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 第一张图，里面没有花括号， 那for循环是对哪几行语句有效呢？  你自己加一个花括号， 那表示的是所有的花括号里面的语句都是要循环的， 这和第一个图的意思不同  好好看看书

user: user-2
content: 自己再仔细看看第一张图 哪些代码在for的花括号范围内， 那些是在花括号范围外的

user: user-0
content: 不好意思(T ^ T)，各位大神们，我新手入坑，图一发错了，刚才有幸大神指教，我prime里面多加多余的大括号，是for循环学习不足，让各位大神见笑了。在这，我谢谢您们了。
user-0 提问: 怎么获取鼠标在一个窗口中的坐标

回复:
user: user-1
content: 先GetCursorPos,得到在屏幕中的坐标，然后再用ScreenToClient转换一下就好  或者获得屏幕坐标，以及窗口的屏幕坐标， 加加减减就出来了  看你的开发环境，和什么api可用了

user: user-0
content: 引用 3 楼 寻开心 的回复:那是windows编程的api， 你这个用inigrph建立的没有这个功能吧  窗口也有自己的坐标范围， 也是屏幕坐标 你要取得窗口的屏幕坐标， 然后和鼠标的屏幕坐标就都是在统一的坐标系下的了； （只有在统一的坐标系下坐标才可以运算。）  鼠标的屏幕坐标 - 窗口左上角的屏幕坐标， 就是鼠标在窗口内的坐标了  还是那句话， 这取决于你的绘图工具能提供那些api来获取这些坐标 比如，你的窗口是怎么创建的， 创建的时候，就会指定窗口在屏幕上的坐标， 这个坐标就拿来可用  虽然还是不太明白其中的原理     但还是感谢大佬的解答

user: user-1
content: 那是windows编程的api， 你这个用inigrph建立的没有这个功能吧  窗口也有自己的坐标范围， 也是屏幕坐标 你要取得窗口的屏幕坐标， 然后和鼠标的屏幕坐标就都是在统一的坐标系下的了； （只有在统一的坐标系下坐标才可以运算。）  鼠标的屏幕坐标 - 窗口左上角的屏幕坐标， 就是鼠标在窗口内的坐标了  还是那句话， 这取决于你的绘图工具能提供那些api来获取这些坐标 比如，你的窗口是怎么创建的， 创建的时候，就会指定窗口在屏幕上的坐标， 这个坐标就拿来可用

user: user-0
content: 引用 1 楼 寻开心 的回复:先GetCursorPos,得到在屏幕中的坐标，然后再用ScreenToClient转换一下就好  或者获得屏幕坐标，以及窗口的屏幕坐标， 加加减减就出来了  看你的开发环境，和什么api可用了  感谢大佬        再求教一下这个ScreenToClient  这个函数的第一个参数需要一个窗口句柄，如果是initgraph建立的图形窗口该怎么获取它的句柄呢
user-0 提问: 多行文本框，读取不到换行符

回复:
user: user-0
content: 有没有简单一点的代码啊，这个是他们的漏洞吗？明明它自己给我换的行，为什么却读不到他的换行符呢？

user: user-1
content: MSDN的官方示例: 先为Textbox绑定一个CEdit类的变量  int i, nLineCount = m_myEdit.GetLineCount(); CString strText, strLine; // Dump every line of text of the edit control. for (i=0; i < nLineCount; i++){  // length of line i:       int len = m_myEdit.LineLength(m_myEdit.LineIndex(i));       m_myEdit.GetLine(i, strText.GetBuffer(len), len);       strText.ReleaseBuffer(len);       strLine.Format(_T("line %d: '%s'\n"), i, strText);       AFXDUMP(strLine); }
user-0 提问: 大佬们帮忙看一下为什么这个结果是这样的

回复:
user: user-0
content: 引用 1 楼 寻开心的回复:输入函数scanf并不能指定精度 对于你的输入数据，scanf里面要这样指定格式，"%d-%d",  这样输入1-84215021才会把1 和 84215021分别读入不同的变量里面去 懂了谢谢，辛苦了！😜

user: user-1
content: 输入函数scanf并不能指定精度 对于你的输入数据，scanf里面要这样指定格式，"%d-%d",  这样输入1-84215021才会把1 和 84215021分别读入不同的变量里面去
user-0 提问: 结构体的二级指针取值之后无法被识别为结构体或者联合，因而无法访问结构体字段

回复:
user: user-0
content: 引用 6 楼 寻开心 的回复:因为优先级的原因。 *ep->item 和。**p.item 会被认为是 *(ep->item) 和 **(p.item)   吓了我一跳， 特地跑去写了段代码去测试。  坑货   莫慌莫慌，删减版指针写多了，还是我C原汁原味

user: user-1
content: 因为优先级的原因。 *ep->item 和。**p.item 会被认为是 *(ep->item) 和 **(p.item)   吓了我一跳， 特地跑去写了段代码去测试。  坑货

user: user-0
content: 引用 4 楼 寻开心 的回复:(*ep)->item  (**ep).item 怎么就不可以了呢？  哎C都还回去了，刚想起来了，就等你接分了

user: user-1
content: (*ep)->item  (**ep).item 怎么就不可以了呢？

user: user-0
content: (*ep)->item  (*e).item  我傻了

user: user-0
content: 没人那我只好自圆其说了

user: user-0
content: 如果是((example*)*ep)->item这也感觉不咋的  强行取值最为致命
user-0 提问: 萌新求教简单问题

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 15行   while ( getchars() !='\n');  作用就是从键盘缓冲区当中提取字符，直到把遇到的第一个回车键也提取完  应对情况前面那句， scanf获取整数输入的 如果要求输入整数，用户输入了一个字母x然后回车， 那么scanf那句会返回0， ret就是0 如果用户输入正确的一个整数， 然后回车，那么ret 就是1  对于ret是0的情况， 用户输入的x字符，也有可能后面还有一堆乱七八糟的别的内容， 这些东西都要清理做废掉 让用户重新输入正确的数字 15行的作用就是干这个，  把键盘缓冲区当中已经输入的这些用户不想要的统统清理光，让用户重新输入
user-0 提问: (codeblocks编程)编写的程序运行到一个函数后，编译器分配声明的第一个指针时显示越界

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 哦， 不对。 说错了。 你这个并不是局部数组太大的原因 而是 temp是野指针， 你没有给他初始化， 它的数值是多少都是可能的，毫无意义

user: user-2
content: 局部变量分配在栈当中，如果MULSGLEN太大，超出了栈内存大小，就很可能造成这种后果 你的MULSGLEN是多少呢
user-0 提问: 这段程序哪错了为什么结果不对？

回复:
user: user-0
content: 引用 1 楼 寻开心的回复:输入age的时候， scanf代码是错的， 传递的是age的值， 应该是age的地址，少了个取地址的&符号 scanf("%d",  p->age);   这是错的， 第二图，倒数第二行那里 好了，谢谢谢谢(*°∀°)=3

user: user-1
content: 输入age的时候， scanf代码是错的， 传递的是age的值， 应该是age的地址，少了个取地址的&符号 scanf("%d",  p->age);   这是错的， 第二图，倒数第二行那里
user-0 提问: 我又来了。。。

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 自己跟踪调试一下，看看你自己的代码流程，  需要 while （ 1 ） {         如果要***，输入1          如果要*** ，输入2         返回上层 ， 输入0        ch = getchar（）        if（ 1 == ch )   func1（）;        else (2==ch)    func2（）;        else ( 0 == ch )  break;     } } 需要这样的代码结构，才可以让用户不断的看到这一层的操作选择 你的代码结构不满足这种分层结构  如果是多层的， func1， func2 这个函数里面，也是这种while语句的结构，才能保持在这个层级当中不返回上级
user-0 提问: 一个二叉树的疑问求助

回复:
user: user-1
content: 你自己先了解一下什么是完全二叉树不就会了嘛

user: user-2
content: 换句话说，如果把那个淡颜色的数字的节点都补齐了，这些图都是完全二叉树

user: user-2
content: 对于深度为K的，有n个结点的二叉树，当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。 完全二叉树的特点是： 1）只允许最后一层有空缺结点且空缺在右边，即叶子结点只能在层次最大的两层上出现； 2）对任一结点，如果其右子树的深度为j，则其左子树的深度必为j或j+1。 即度为1的点只有1个或0个  你的这个图里面， 有的数字颜色淡， 那是表示空缺的部分吧，以显示现存的叶子节点上的数字关系并不连续，他们并不是真实悬挂在那里的叶子节点， 应该是把他们拿掉之后再看。

user: user-3
content: 完全二叉树是由满二叉树而引出来的。对于深度为K的，有n个结点的二叉树，当且仅当其每一个结点都与深度为K的满二叉树中编号从1至n的结点一一对应时称之为完全二叉树。

user: user-3
content: 第一行右图的10节点是不是表示10节点已经被删除了。