Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 怎么理解++的后缀运算符的优先级高于前缀的优先级？

回复:
user: user-1
content: 根据常见的编译器，VS和GCC的运算过程来看，显然前缀++和--优先级高于后缀++和--，，不过国内课本的附录上，普遍都写着后缀优先级高于前缀，，到底谁抄谁的，不清楚，，怀疑是以讹传讹，目前还在错误,国内和国外的课本都有这样的描述，，不过经过真理检验的经验是：（1）前缀++a（或--a）的优先级大于所有数值运算符（2）后缀a++（或a--）的优先级小于所有数值运算符

user: user-2
content: 按照The C Programming Language第二版第二章末尾的图2-1,C语言的设计者似乎并未区分前缀和后缀的优先级;百度百科也没有区分,我们学校的教材也没有区分(把前缀放在二级,但是后缀巧妙地没有出现在优先级表格中); 但是维基百科则是仅仅给出C++的运算符优先级,而C Primer Plus第六版中的"B.2参考资料Ⅱ:C运算符"开头的优先级表格区分了前缀和后缀的优先级

user: user-3
content: 顶一下，我也刚好在看这里，谈谈我自己的理解，希望对您有帮助！  一、参考资料： 1、《C陷阱与缺陷》，第 1.3 节，P8 ；第 2.2 节，P19 ； 2、《C Primer Plus （第6版）中文版》，附录 B.2 ，P667 ； 3、《C程序设计语言 （第2版）》，第 2.12 节，P42 ； 4、百度百科 - 运算符优先级 ：https://baike.baidu.com/item/%E8%BF%90%E7%AE%97%E7%AC%A6%E4%BC%98%E5%85%88%E7%BA%A7/4752611?fr=aladdin  二、问题疑惑： 1、如楼主所问，在看参考资料 2 时，有一个疑问，为什么 ++ 的后缀运算符比前缀运算符优先级高？ 2、++（--）前缀运算符与后缀运算符的结合律一样吗？  三、基础理解： 1、++ 的后缀运算符：a++； 2、++ 的前缀运算符：++b； 3、-- 运算符也是类似；  由参考资料 1 的一个实际情况举例： 1、如下代码应该怎么理解？  a---b   2、由《C陷阱与缺陷》本节所讲的“贪心法”可得，编译器会从左到右一个字符一个字符读入，重复判断读入的这些字符能否组成一个有意义的符号； 引用引用书中解释：编译器将程序分解成符号的方法是，从左到右一个字符一个字符地读入，如果该字符可能组成一个符号，那么再读入下一个字符，判断已经读入的两个字符组成的字符串是否可能是一个符号的组成部分：如果可能，继续读入下一个字符，重复上述判断，直到读入的字符组成的字符串已不再可能组成一个有意义的符号。  3、那么我们就按照“贪心法”，来理解上述表达式，可以想到下边这个表达式与上边的表达式含义是一样的；  a-- - b   4、下边这种表达式，与上述两种表达式都不相同，注意看符号的连接与符号之间的空格！  a - --b   四、++（--）前缀运算符与后缀运算符的结合律 1、根据参考的资料来看，结合律应该是不一样的；  2、如果根据“贪心法”来理解结合律，感觉都应该是 从左往右 ；  3、根据百科资料中的运算符优先级结合性概念来理解，理解的不是很透彻；但是百科中也区分了前缀（前置）运算符、后缀（后置）运算符； 引用引用百科资料 - 结合性     当一个运算对象两侧的运算符优先级别相同时，则按运算符的结合性来确定表达式的运算顺序。关于结合性的概念在其他高级语言中是没有的，这是C语言的特点之一。     它是仲裁者，在几个操作符具有相同的优先级时决定先执行哪一个。  4、总结一下，我认为关于结合性这块，应该要区分前缀运算符、后缀运算符；因为这两种运算符的结合律不同，且后缀运算符优先级要高于前缀运算符；

user: user-0
content: 哦哦，明白了。

user: user-4
content: C语言 不用考虑 前缀后缀哪个优先级高 因为这两个运算符根本无法摆在同一个表达式上面

user: user-5
content: #include<stdio.h>  int main() {     int a[] = {10,20,30,40,50};     int* b = a;      int* d = a;     printf("%d\n", ++d++[2]);     printf("%d\n",(++b)++[2]);     printf("%p\n", d);     printf("%p\n",b);     return 0; } 可以这样试一下

user: user-6
content: 你又不可能一行中对一个变量同时++--，或者前缀后缀++-- 一起用。所以可以不管.

user: user-0
content: int main(void) { 	int a[] = {10,20,30,40,50}; 	int* b = a; 	int* c = a; 	int* d = a; 	printf("%d\n", a[0]); 	printf("%p\n", b); 	printf("%d\n", b++[0]); 	printf("%p\n", b); 	printf("%p\n", c); 	printf("%d\n", ++c[0]); 	printf("%p\n", c); 	printf("\n"); 	printf("%p\n", d); 	printf("%d\n", ++d++[2]); 	printf("%p\n", d); 	return 0; }  这么理解可能对了。

user: user-0
content: 引用 1 楼 ?Victor.?? 的回复:我们书上是这么写的  优先级 1 初等运算 [ ] ( ) -> .             2 自增自减 后置++  后置--             3 一元运算 前置++ 前置--  加号+ 减号-  &  *  ~  !   sizeof()             ……  int main(void) { 	int a[] = {10,20,30,40,50}; 	int* b = a; 	int* c = a; 	printf("%d\n", a[0]); 	printf("%p\n", b); 	printf("%d\n", b++[0]); 	printf("%p\n", b); 	printf("%p\n", c); 	printf("%d\n", ++c[0]); 	printf("%p\n", c); 	return 0; } 我这么理解对吗，这个前缀后缀，指的结合优先级

user: user-5
content: 我们书上是这么写的  优先级 1 初等运算 [ ] ( ) -> .             2 自增自减 后置++  后置--             3 一元运算 前置++ 前置--  加号+ 减号-  &  *  ~  !   sizeof()             ……
user-0 提问: 二分法

回复:
user: user-1
content: 引用 8 楼 寻开心 的回复:int *p； 不要断章取义。 这里是p的类型定义， p是int *类型  先回去看书， 看明白指针再说算法的事儿。  看看数组， 里面必然会有数组和指针的部分 基础还没有搞明白， 看算法也白看  赞同。新学习是很多不明白的，但是先学会基本的东西，课本有的内容。

user: user-2
content: int *p； 不要断章取义。 这里是p的类型定义， p是int *类型  先回去看书， 看明白指针再说算法的事儿。  看看数组， 里面必然会有数组和指针的部分 基础还没有搞明白， 看算法也白看

user: user-0
content: 引用 5 楼 寻开心的回复:p就是要用二分法查找的数组的指针， 数组一共n个元素 *p就是指针所对应的元素的值， p是地址， *p就是地址里面的内容 *p=a[  ]？

user: user-0
content: *p=a[  ]？

user: user-2
content: p就是要用二分法查找的数组的指针， 数组一共n个元素 *p就是指针所对应的元素的值， p是地址， *p就是地址里面的内容

user: user-0
content: 引用 1 楼 lirg8405的回复:调用函数啊，然后根据返回值判断。 指针*p有什么作用

user: user-1
content: 调用函数啊，然后根据返回值判断。
user-0 提问: 柔性数组 sizeof的问题

回复:
user: user-1
content: 标准C 首先 柔性数组是 不完整数组类型  比如 double ele[ ]; 不是double ele[0]; 注意区别   然后 结构体中只有柔性数组成员这种情况是不允许的 看标准描述  As a special case, the last element of a structure with more than one named member may have an incomplete array type; this is called a flexible array member.   总结 你说的情况只是编译器扩展  编译器怎么扩展的需要你翻阅你使用的编译器说明书了 标准C中 这样的做法是不行的

user: user-2
content: 不是每种编译器都支持0长度数组的 如果不支持，估计是double ele[0] 数组名本身占一个指针大小的字节（类似于ele退化为指针），所以是4。你就不需要打印结构体的size，直接打印0长度数组的size看看就可以 比如 double ele[0]; printf("%d", sizeof(ele));
user-0 提问: 一个C语言问题

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:你看看你的编辑器long型和int型的取值范围，一般来说int和long型范围时一样的，你用下面的语句试试。      printf("%d\n",__INT_MAX__);     printf("%ld\n",__LONG_MAX__);     printf("%lld\n",__LONG_LONG_MAX__);  从你的输出来看明显时两种方法结果都超过了int的最大范围，改为long long应该就可以了。嗯，之后我看了一遍，是long的范围太小了，溢出，换成long long就好了

user: user-1
content: 你看看你的编辑器long型和int型的取值范围，一般来说int和long型范围时一样的，你用下面的语句试试。      printf("%d\n",__INT_MAX__);     printf("%ld\n",__LONG_MAX__);     printf("%lld\n",__LONG_LONG_MAX__);  从你的输出来看明显时两种方法结果都超过了int的最大范围，改为long long应该就可以了。
user-0 提问: 使用while ((c = getchar()!=EOF)) {putchar(c);}输出为什么乱码

回复:
user: user-1
content: 赋值=的优先级低于!=，因此getchar() != EOF先执行，然后把1的结果赋值c，所以每次输出的putchar(1);即乱码了。

user: user-2
content: 等号的优先级最低，所以是先计算右边的，在赋值给c

user: user-3
content: while ((c = getchar()!=EOF))  因为这句话 getchar() != EOF 在你没有Ctrl+Z之前输入的字符都不是EOF，所以判断结果始终是1 c = 1 putchar（1） 你看看1的ascii对应的是什么就知道了  改正 while ((c = getchar()) !=EOF )

user: user-4
content: #include<stdio.h> int main() { int c;	                                      ====》》 改成 char c; while ((c = getchar()!=EOF))         ====》》改成  while ((c=getchar()) != EOF)  {     putchar(c); } return 0; }
user-0 提问: 疑惑

回复:
user: user-0
content: 引用 2 楼 user-1的回复:你的for后面用{}，否则for循环只有scanf语句有效  i=0; i<n; 和 i=1; i<=n 的区别就是循环次数一样，循环中的 i 的值不一样 我懂了(￣∀￣)谢谢兄dei

user: user-1
content: 你的for后面用{}，否则for循环只有scanf语句有效  i=0; i<n; 和 i=1; i<=n 的区别就是循环次数一样，循环中的 i 的值不一样

user: user-0
content: 还有就是我写i=0 i小于n和i=1i小于等于n有啥区别
user-0 提问: va_arg第二个参数不解

回复:
user: user-0
content: 引用 7 楼 寻开心 的回复:这个保护不是对所有的这种变长的函数都一样，只是printf函数 只是拿这个来说明一下， 这种变长参数，如果一个参数弄错了，会连带把其他的参数也在栈地址给搞错误，提取不到正确的结果了 是的，我去看了下头文件的定义，发现只是这样。我看那个菜鸟驿站的解释，还以为这个宏有什么内部机制，先搞个缓存哈哈

user: user-1
content: 这个保护不是对所有的这种变长的函数都一样，只是printf函数 只是拿这个来说明一下， 这种变长参数，如果一个参数弄错了，会连带把其他的参数也在栈地址给搞错误，提取不到正确的结果了

user: user-1
content: 关键是char*，是指针， 现在的指针是8个字节的， 和int 4个字节的不一样长。  printf函数的规则里面提到了，char，int都是入栈4字节，一样长。  float和double都是入栈8字节 这样保证了，你指定格式%c，%d的时候，无论传入进入是int还是char类型参数都可以正确获得 指定%f和%lf，传递float还是double都可以正确  但是指针不同啊， 它是8个字节， 它和类型不匹配，会导致其他的参数错乱了

user: user-0
content: 引用 2 楼 寻开心 的回复:你想想printf，scanf，如果format和参数类型不匹配会如何  我发现打印的格式不对。。 我这样输入 vspfunc("%d %d %s", i, f, str); printf("test1 %d\n", va_arg(aptr, int)); printf("test2 %d\n", va_arg(aptr, int)); printf("test3 %s\n", va_arg(aptr, char*)); 这样打印没问题， 如果想 printf("test1 %d\n", va_arg(aptr, int)); printf("test3 %s\n", va_arg(aptr, char*)); printf("test2 %d\n", va_arg(aptr, int)); 这样打印就不行了。。我看说明，我的理解是找到那个类型的数据，然后读出来。所以我想的是，只有一个char*,我在什么顺序都可以唯一的读取到，而有两个int，所以int有顺序，对我这个例子，char*没顺序。 但是这样是报错的。所以这个只能按照顺序导出来对吧。。

user: user-0
content: 引用 1 楼 user-2 的回复:vspfunc("%d %d %s", i, f, str); // int ,int, char*,  不是 int， char， int 我日，我没注意我写的是char不是char*。。。

user: user-0
content: 引用 1 楼 user-2 的回复:vspfunc("%d %d %s", i, f, str); // int ,int, char*,  不是 int， char， int 我本来是对应的写的，你看我在3个printf对应输出的是 %d %d %s，我是想和输入的对照的。但是发现打印出来的不是我想要的结果。而且按照菜鸟驿站的说明，我的理解是char* 在int前输入或后都一样，第一个检查到的char* 就能打印出来。而两个int，所以这俩int才有顺序。

user: user-1
content: 你想想printf，scanf，如果format和参数类型不匹配会如何

user: user-2
content: vspfunc("%d %d %s", i, f, str); // int ,int, char*,  不是 int， char， int
user-0 提问: 不知道为什么会数组越界 VS不停报错，牛客网上却能运行

回复:
user: user-1
content: 引用 20 楼 寻开心 的回复:引用 18 楼 ggglivw 的回复:[quote=引用 17 楼 Milk_exe 的回复:] [quote=引用 16 楼 ggglivw 的回复：]要学会调试，你这个都是很简单的了我是定位到j的值有问题 但是找不到原因，对int的范围不敏感啊  以后这种循环用无符号变量unsigned int.  好处就是都是正数，只需要判断不超过最大，不会引起程序崩溃，至于加翻山是最大还是变成0还是变成0继续累加剩下的你可以测试下。[/quote]  改成unsigned 也是不可以的。   I*i越界超过整数范围，取模回来还可能比MAXN小，但是那就是错误的结果了，已经不再是i原始的i都倍数了 I*I mod maxint  不能保证还是I的倍数 [/quote]  逻辑错误靠你自己，这样可以少判断负数也不会崩溃

user: user-2
content: 引用 18 楼 ggglivw 的回复:引用 17 楼 Milk_exe 的回复:[quote=引用 16 楼 ggglivw 的回复：]要学会调试，你这个都是很简单的了我是定位到j的值有问题 但是找不到原因，对int的范围不敏感啊  以后这种循环用无符号变量unsigned int.  好处就是都是正数，只需要判断不超过最大，不会引起程序崩溃，至于加翻山是最大还是变成0还是变成0继续累加剩下的你可以测试下。[/quote]  改成unsigned 也是不可以的。   I*i越界超过整数范围，取模回来还可能比MAXN小，但是那就是错误的结果了，已经不再是i原始的i都倍数了 I*I mod maxint  不能保证还是I的倍数

user: user-0
content: 引用 18 楼 ggglivw 的回复:引用 17 楼 Milk_exe 的回复:[quote=引用 16 楼 ggglivw 的回复：]要学会调试，你这个都是很简单的了我是定位到j的值有问题 但是找不到原因，对int的范围不敏感啊  以后这种循环用无符号变量unsigned int.  好处就是都是正数，只需要判断不超过最大，不会引起程序崩溃，至于加翻山是最大还是变成0还是变成0继续累加剩下的你可以测试下。[/quote]好的 感谢

user: user-1
content: 引用 17 楼 Milk_exe 的回复:引用 16 楼 ggglivw 的回复：要学会调试，你这个都是很简单的了我是定位到j的值有问题 但是找不到原因，对int的范围不敏感啊  以后这种循环用无符号变量unsigned int.  好处就是都是正数，只需要判断不超过最大，不会引起程序崩溃，至于加翻山是最大还是变成0还是变成0继续累加剩下的你可以测试下。

user: user-0
content: 引用 16 楼 ggglivw 的回复：要学会调试，你这个都是很简单的了我是定位到j的值有问题 但是找不到原因，对int的范围不敏感啊

user: user-1
content: 要学会调试，你这个都是很简单的了

user: user-1
content: 你看看vs的报错啊，明显是j+翻山了，几秒钟就可以看到的。

user: user-0
content: 引用 12 楼 寻开心 的回复：不用long long其实也可以的  需要修改一下判断的逻辑 执行到这步是要把i的倍数对应的isPrime数组值都设置为false 之所以从i*i出发， 是因为2*i，3*i，5*i, 等都已经被2,3， 5， 等素数设置过了  if( i<= sqrt(MAXN) )      for ( int j = i * i; j < MAXN; j+=i)好的 感谢

user: user-2
content: sqrt(MAXN)也无需每次都计算，在initial函数进来的时候，计算一次就可以了  int sqrtMAXN = sqrt(MAXN);  // #include <cmath> 这个函数在这个头文件里面呢

user: user-2
content: 不用long long其实也可以的  需要修改一下判断的逻辑 执行到这步是要把i的倍数对应的isPrime数组值都设置为false 之所以从i*i出发， 是因为2*i，3*i，5*i, 等都已经被2,3， 5， 等素数设置过了  if( i<= sqrt(MAXN) )      for ( int j = i * i; j < MAXN; j+=i)

user: user-0
content: 引用 9 楼 寻开心 的回复:for (long long  j = i * i; j < MAXN; j+=i) {ok,

user: user-3
content: prime[primeSize++] = i;这里越界了

user: user-2
content: for (long long  j = i * i; j < MAXN; j+=i) {

user: user-2
content: 是 i*i 超出了int的表达范围了，让j直接变成了负数了 把j改成long long 类型就好了

user: user-0
content: #include <iostream> #include <cstdio> #include <vector>  using namespace std;  const int MAXN = 100000;  bool isPrime[MAXN]; int prime[10000]; int primeSize;  void initial() { 	for (int i = 2; i < MAXN; i++) { 		isPrime[i] = true; 	} 	isPrime[0] = false; 	isPrime[1] = false; 	primeSize = 0; 	for (int i = 2; i < MAXN; i++) { 		if (!isPrime[i]) { 			continue; 		} 		prime[primeSize++] = i; 		for (int j = i * i; j < MAXN; j+=i) { 			isPrime[j] = false; 		} 	} 	return; }  int main() { 	initial(); 	printf("%d\n", primeSize); 	return 0; }

user: user-2
content: 你把源码都贴上来吧，没有几行， 调试看一下， 别贴图， 省的我们再敲一遍代码。

user: user-0
content: 引用 4 楼 ggglivw 的回复:你代码没贴完，堆栈也没截图下来，信息不够，VS既然都运行时报错，肯定是有问题的。 主函数就执行这个initial函数，调用堆栈就在右下角啊

user: user-1
content: 你代码没贴完，堆栈也没截图下来，信息不够，VS既然都运行时报错，肯定是有问题的。

user: user-0
content: 引用 1 楼 寻开心 的回复：十万以内的质数9562个，prime数组不会数组越界啊 你这个是筛素数法，应该可以的  vs提示哪里越界了？range check failure 下面👇有图

user: user-0
user-0 提问: C语言int和double int能输出12的阶乘，double为啥不可以？

回复:
user: user-0
content: 把“你用int的时候已经超出int范围了，所以数据被截断，即 13！的计算结果不是 1932053504，而是 6227020800”改为“你用int的时候已经超出int范围了，所以数据被截断，即 13！的计算结果不是 6227020800，而是  1932053504”我懂了。f是int类型，fac(n - 1) * n是double，转换会截断，懂了。

user: user-1
content: 你用int的时候已经超出int范围了，所以数据被截断，即 13！的计算结果不是 1932053504，而是 6227020800  可以打印查看 long long l = 6227020800; printf("%d\n", (int)l); //这个打印是1932053504， 即6227020800的高位被截断，输错结果不对 printf("%d\n", (int)(double)l); //这个结果是 -2147483648  即你的返回值是double，但是临时变量f用int，就相当于把 6227020800 先转成double（fac(n - 1) * n的结果是double），再转成double 转成int（f=fac(n - 1) * n 等号左边是int，右边是double），然后返回值是double，就是再把 -2147483648 转成double

user: user-2
content: 12没溢出，13的阶乘溢出整数范围了

user: user-3
content: 这个使用你的double代码算出来的12的阶乘  应该没问题吧

user: user-3
content: 当用double时，算出来的值是6,227,020,800‬，换成二进制就是 1 0111 0011 0010 1000 1100 1100 0000 0000‬ 从你的第一幅图可以看出，int的大小是4个字节，所以对以上数字取4个字节的截断  0111 0011 0010 1000 1100 1100 0000 0000‬ 换成十进制就是 1,932,053,504‬

user: user-0
content: 我问的是，为什么int输入12可以算出12的阶乘，这个我理解，但是为啥double输入12不可以算出12的阶乘，为什么？

user: user-2
content: double fac(int n) {     double f;     if (n < 0)         printf("n<0,data error!");     else if (n == 0 || n == 1)         f = 1;     else         f = fac(n - 1) * n;     return (f); } f如果是整数的话，超过整数范围，类型转换会发生错误。   f = fac(n - 1) * n; 将double转换为整数，截断错了

user: user-0
content: #include<stdio.h>  int main() { 	int fac(int n); 	int n; 	int y; 	printf("input an integer number:"); 	scanf("%d",&n); 	y=fac(n); 	printf("%d!=%d\n",n,y); 	return 0; }  int fac(int n) { 	int f; 	if(n<0) 		printf("n<0,data error!"); 	else if(n==0||n==1) 		f=1; 	else 		f=fac(n-1)*n; 	return (f); }    #include<stdio.h>  int main() { 	double fac(int n); 	int n; 	double y; 	printf("input an integer number:"); 	scanf("%d",&n); 	y=fac(n); 	printf("%d!=%f\n",n,y); 	return 0; }  double fac(int n) { 	int f; 	if(n<0) 		printf("n<0,data error!"); 	else if(n==0||n==1) 		f=1; 	else 		f=fac(n-1)*n; 	return (f); }
user-0 提问: 自学小白求救

回复:
user: user-0
content: 引用 1 楼 @大愚@的回复:你这个是printf()函数不用加‘&’符号 是的 谢谢了(^～^)

user: user-1
content: 你这个是printf()函数不用加‘&’符号
user-0 提问: 求教

回复:
user: user-1
content: 哦 0.9精度不够0.9999就差不多了

user: user-1
content: 加0.9取整输出 这不是很简单吗

user: user-2
content: 就是8.5米，你要量8个1米，和一个0.5米，一共要量9次。 所以，就是一个把浮点数向上取整的问题。例如8.1，向上取整为9

user: user-0
content: 引用 2 楼 lin5161678的回复:哦 0.9精度不够0.9999就差不多了 我不懂啊啊啊啊啊啊
user-0 提问: 想问一下，VS2019如何使用复数类型？

回复:
user: user-1
content: 哈哈哈哈试试把c++文件改成c文件

user: user-2
content: https://docs.microsoft.com/en-us/cpp/standard-library/complex-class?redirectedfrom=MSDN&view=vs-2019 要使用复数，包含头文件#include <complex>

user: user-0
content: 引用 4 楼 user-3的回复:[quote=引用 3 楼 C_Y990821 的回复:] 谢谢大佬解惑，那么VS如果要进行复数类型定义和计算只有自己写代码实现嘛？ 理论上是的。不过如果你的 VS 支持 clang 作为后端的话，那么可以借助 clang 来绕过 VS 默认后端编译器的不足，进行原生复数运算(，不过这样就不完全算 VS 了)。[/quote] 好的，谢谢了

user: user-3
content: 引用 3 楼 C_Y990821 的回复:谢谢大佬解惑，那么VS如果要进行复数类型定义和计算只有自己写代码实现嘛？ 理论上是的。不过如果你的 VS 支持 clang 作为后端的话，那么可以借助 clang 来绕过 VS 默认后端编译器的不足，进行原生复数运算(，不过这样就不完全算 VS 了)。

user: user-0
content: 引用 1 楼 user-3的回复:不可以，预计在将来的 VS 版本也不可能，因为微软的开发团队对这个功能(或者说是 C 语言本身)不太感兴趣。 谢谢大佬解惑，那么VS如果要进行复数类型定义和计算只有自己写代码实现嘛？

user: user-0
content: 引用 楼主 C_Y990821的回复:头文件包括了complex.h定义double complex z=5+5*I报错？ 对包括了complex.h

user: user-3
content: 不可以，预计在将来的 VS 版本也不可能，因为微软的开发团队对这个功能(或者说是 C 语言本身)不太感兴趣。
user-0 提问: 这是一个刚开始学C语言课程小白的求助，求大佬拯救一下失足少女吧qwq

回复:
user: user-0
content: 引用 3 楼 棉猴的回复:正如楼上朋友说的， if(a[i]>max); 改为if(a[i]>max) 以下是调试结果  如果是if(a[i]>max);，则以上是一个语句，就丧失了if语句的特性，也即是说，无论a[i]>max的值是true还是false，都会执行max = a[i];，所以，无论你的输入是什么max = a[i];都会执行9次，即max的值始终是最后一个输入的值。 嗯嗯嗯   下次要把眼镜戴上!!!

user: user-0
content: 引用 2 楼 effort2019的回复:if和for语句带个大括号不好嘛？ 啊~我现在只知道int main 和for后面有两个及以上语句时还有if后面还要if时要有大括号  其他.....还在学习中

user: user-0
content: 引用 1 楼 @大愚@的回复:你的if语句后面带了分号，这就造成了if就成了一个没有任何作用的一段语句，所以你把if后面的分号去除就可以了 天呐  去的分号就可以了 🙈C语言真是太严谨了  蟹蟹

user: user-1
content: #include <stdio.h> #define N 10 int main(int argc, char* argv[]) { 	int i, a[N]; 	printf("请输入十个整数：\n"); 	for(i=0; i<10; i++) 	{ 		scanf("%d", &a[i]); 	} 	int max = a[0]; 	for(i=1; i<10; i++) 	{ 		if(a[i]>max) 		{ 			max = a[i]; 		} 	} 	printf("最大的数为%d\n", max); 	return 0; }

user: user-1
content: 正如楼上朋友说的， if(a[i]>max); 改为if(a[i]>max) 以下是调试结果  如果是if(a[i]>max);，则以上是一个语句，就丧失了if语句的特性，也即是说，无论a[i]>max的值是true还是false，都会执行max = a[i];，所以，无论你的输入是什么max = a[i];都会执行9次，即max的值始终是最后一个输入的值。

user: user-2
content: if和for语句带个大括号不好嘛？

user: user-3
content: 你的if语句后面带了分号，这就造成了if就成了一个没有任何作用的一段语句，所以你把if后面的分号去除就可以了
user-0 提问: 求大神指点，关于大数相加……

回复:
user: user-1
content: 思路正确，细节没处理好~  1：int length=length1>length2 ? length1:length;  应改为length2  2：if(s1[i]<=10)  ，大于等于10 才要进位，改为 >=  3：for(int i=0;i<=length;i++)，低位放在前的啊~~需要从高位开始输出~ 改为比如：for(int i=length-1; i>=0; i--)

user: user-2
content: 输出哪个部分的if判断也是弄反了的 if(s1[length]==0)     {         for(int i=length-1;i>=0;i--)             printf("%d",s1[i]);     }     else     {         for(int i=length;i>=0; i--)             printf("%d",s1[i]);     }

user: user-0
content: 引用 2 楼 user-3的回复:除了LS说的  if(s1[length]>0) length++; //最后一位还有判断是否有效 （虽然你也判断了，不过if(s1[length]==0) 的else里没修改length） 去掉 if(s1[length]==0) 和 else 的代码，最后直接 for(int i=length-1; i>=0; i--) 输出就好了  另外，上面说了，length可能会增大1位的 if(s1[length]>0) length++; 所以数组s1数组长度最好设301，防止越界 题目要求的是200位，我设定300位是可以的。不过细节之处也是值得我学习的。谢谢啦

user: user-0
content: 引用 1 楼 coo135的回复:思路正确，细节没处理好~  1：int length=length1>length2 ? length1:length;  应改为length2  2：if(s1[i]<=10)  ，大于等于10 才要进位，改为 >=  3：for(int i=0;i<=length;i++)，低位放在前的啊~~需要从高位开始输出~ 改为比如：for(int i=length-1; i>=0; i--) 谢谢，运行通过了。

user: user-3
content: 除了LS说的  if(s1[length]>0) length++; //最后一位还有判断是否有效 （虽然你也判断了，不过if(s1[length]==0) 的else里没修改length） 去掉 if(s1[length]==0) 和 else 的代码，最后直接 for(int i=length-1; i>=0; i--) 输出就好了  另外，上面说了，length可能会增大1位的 if(s1[length]>0) length++; 所以数组s1数组长度最好设301，防止越界
user-0 提问: 在c语言中用scanf取地址给一个字符变量赋值，为什么可以正确输出但不能正确使用strcmp函数

回复:
user: user-0
content: 引用 9 楼 qybao的回复:没超过是可以的，但是你只要输入1个字符就会超，因为字符串还有个结尾符‘\0’ 关于这种内存越界，你可以谷歌百度一下函数栈信息以及函数调用过程的栈管理，这样你就知道内存越界到什么位置会破坏什么样的栈信息。 好哒感谢啦

user: user-1
content: 没超过是可以的，但是你只要输入1个字符就会超，因为字符串还有个结尾符‘\0’ 关于这种内存越界，你可以谷歌百度一下函数栈信息以及函数调用过程的栈管理，这样你就知道内存越界到什么位置会破坏什么样的栈信息。

user: user-0
content: 引用 7 楼 qybao的回复:这个程序属于危险程序，输入的字符串如果超过了x的内存长度会造成内存越界，当然因为例子中程序，内存越界不造成影响，所以能正确运行，但如果在后面加上strcmp函数调用，函数调用入栈前的内存地址信息就被破坏，导致函数调用后返回不到正确的内存地址，所以出错。 那如果没超过它的存储范围那是不是可行的

user: user-1
content: 这个程序属于危险程序，输入的字符串如果超过了x的内存长度会造成内存越界，当然因为例子中程序，内存越界不造成影响，所以能正确运行，但如果在后面加上strcmp函数调用，函数调用入栈前的内存地址信息就被破坏，导致函数调用后返回不到正确的内存地址，所以出错。

user: user-0
content: 它既然可以输出字符串，为什么不能直接用strcmp函数，而要定义一个数组，我发的那个程序有的输出结果是对的，有的是错的，不懂原因

user: user-2
content: 引用 3 楼 119???110 的回复:[quote=引用 1 楼 lin5161678的回复:]字符串操作要求 0 结尾 这里没0  错 #include <string.h> #include <stdio.h> int main() {     char x;     scanf("%s",&x); [/quote] 输入成功就是 数组越界 GG

user: user-3
content: VC++6.0，我的最爱，没有之一 #include <string.h> #include <stdio.h>  int main(int argc, char* argv[]) { 	   int i, findFlag=0; 	   char x[13] = {0};//---------改成字符数组，即字符串--------     char str[][13]={ "Pascal","Basic","Fortran", "Java", "Visual C", "Visual Basic" };     findFlag=0;     printf("请输入一个字符串:");     scanf("%s",&x);      i=0;     while (i<6 && !findFlag)     {         if (strcmp(x,str[i])==0)//-------改成x，即字符串首地址-----------         {             findFlag = 1;          }          i++;     }      if (findFlag)     {        puts(x);//-------改成x，即字符串首地址-----------     }     else     {        printf("没找到!\n");     } 	return 0; }  调试结果

user: user-0
content: 引用 1 楼 lin5161678的回复:字符串操作要求 0 结尾 这里没0  错 #include <string.h> #include <stdio.h> int main() {     int i, findFlag=0;     char x;     char str[][13]={ "Pascal","Basic","Fortran", "Java", "Visual C", "Visual Basic" };     findFlag=0;     printf("请输入一个字符串:");     scanf("%s",&x);      i=0;     while (i<6 && !findFlag)     {         if (strcmp(&x,str[i])==0)         {             findFlag = 1;          }          i++;     }      if (findFlag)     {        puts(&x);     }     else     {        printf("没找到!\n");     }        return 0; }

user: user-0
content: 引用 1 楼 lin5161678的回复:字符串操作要求 0 结尾 这里没0  错 这个程序是正确的，但为什么不能代入用strcmp函数

user: user-2
content: 字符串操作要求 0 结尾 这里没0  错
user-0 提问: 请教大佬

回复:
user: user-0
content: 引用 6 楼 user-1 的回复:当然，每次冒泡拷贝字符串太慢，你可以用个数组记住下标 泡排序 int *idx = new int[n]; for(int i=0; i<n; i++) idx[i]=i; for(int i=0; i<n-1; i++) {     for(int j=0; j<n-i-1; j++) {          if(q[j]>q[j+1]) { //冒泡同时改变字符串位置             int t = q[j];             q[j]=q[j+1];              q[j+1]=t;              t = idx[j];//用下标               idx[j]=idx[j+1];               idx[j+1]=t;              //char tc[30];              //strcpy(tc, p+j);              //strcpy(p+j, p+j+1);              //strcpy(p+j+1, tc);         }     } } //打印 for(int i=0; i<n; i++)      cout<<(p+idx[i])<<endl; 嗯嗯，受益匪浅

user: user-1
content: 当然，每次冒泡拷贝字符串太慢，你可以用个数组记住下标 泡排序 int *idx = new int[n]; for(int i=0; i<n; i++) idx[i]=i; for(int i=0; i<n-1; i++) {     for(int j=0; j<n-i-1; j++) {          if(q[j]>q[j+1]) { //冒泡同时改变字符串位置             int t = q[j];             q[j]=q[j+1];              q[j+1]=t;              t = idx[j];//用下标               idx[j]=idx[j+1];               idx[j+1]=t;              //char tc[30];              //strcpy(tc, p+j);              //strcpy(p+j, p+j+1);              //strcpy(p+j+1, tc);         }     } } //打印 for(int i=0; i<n; i++)      cout<<(p+idx[i])<<endl;

user: user-0
content: 引用 4 楼 user-1 的回复:冒泡排序 for(int i=0; i<n-1; i++) {     for(int j=0; j<n-i-1; j++) {          if(q[j]>q[j+1]) { //冒泡同时改变字符串位置             int t = q[j];             q[j]=q[j+1];              q[j+1]=t;              char tc[30];              strcpy(tc, p+j);              strcpy(p+j, p+j+1);              strcpy(p+j+1, tc);         }     } } //排好序直接打印结果即可 明白了，谢谢大佬

user: user-1
content: 冒泡排序 for(int i=0; i<n-1; i++) {     for(int j=0; j<n-i-1; j++) {          if(q[j]>q[j+1]) { //冒泡同时改变字符串位置             int t = q[j];             q[j]=q[j+1];              q[j+1]=t;              char tc[30];              strcpy(tc, p+j);              strcpy(p+j, p+j+1);              strcpy(p+j+1, tc);         }     } } //排好序直接打印结果即可

user: user-0
content: 引用 1 楼 user-1 的回复:首先，统计pij为1的个数时，没有考虑到字符串结尾符。 其次qi和rj比较没意义，冒泡排好序直接输出结果即可，为啥还要qi==rj才输出，不等不就没有输出了吗？r和k多余，q就够了 delete[] p可以 但是冒泡排序之后，只是q排序了，p还是没变，输出还是原来的

user: user-1
content: for (j=0;j<30&&p[i][j]!=‘\0’; j++) //因为如果内存有垃圾信息，统计会出错

user: user-1
content: 首先，统计pij为1的个数时，没有考虑到字符串结尾符。 其次qi和rj比较没意义，冒泡排好序直接输出结果即可，为啥还要qi==rj才输出，不等不就没有输出了吗？r和k多余，q就够了 delete[] p可以
user-0 提问: 数据结构

回复:
user: user-0
content: 引用 2 楼 长风～的回复:[quote=引用 1 楼 @大愚@的回复:]你先判断i后面的元素够不够K个如果够，就删除，删除的原理是从被删除的位置开始好面的元素往前移动， 如果不够直接删除完大致思路是这样的，希望能帮到你 能帮着写一下吗？若不够k个元素时，将i后面的元素全部删除这一段的[/quote] 谢谢你非常感谢

user: user-0
content: 引用 1 楼 @大愚@的回复:你先判断i后面的元素够不够K个如果够，就删除，删除的原理是从被删除的位置开始好面的元素往前移动， 如果不够直接删除完大致思路是这样的，希望能帮到你 能帮着写一下吗？若不够k个元素时，将i后面的元素全部删除这一段的

user: user-1
content: 你先判断i后面的元素够不够K个如果够，就删除，删除的原理是从被删除的位置开始好面的元素往前移动， 如果不够直接删除完大致思路是这样的，希望能帮到你

user: user-2
content: 引用 2 楼 长风～ 的回复:[quote=引用 1 楼 @大愚@的回复:]你先判断i后面的元素够不够K个如果够，就删除，删除的原理是从被删除的位置开始好面的元素往前移动， 如果不够直接删除完大致思路是这样的，希望能帮到你 能帮着写一下吗？若不够k个元素时，将i后面的元素全部删除这一段的[/quote] 直接修改顺序表长度就等于删除了从i开始的元素了吧
user-0 提问: 小白想问

回复:
user: user-1
content: 最后一句放进去，这代码问题可大了

user: user-2
content: 最后一句明显不对，不管怎样，都会显示这句，不合逻辑啊。建议拿起笔，画流程图，对提高编程能力有帮助。

user: user-0
content: 引用 2 楼 proorck2019 的回复：最后一句明显不对，不管怎样，都会显示这句，不合逻辑啊。建议拿起笔，画流程图，对提高编程能力有帮助。好嘞

user: user-0
content: 引用 1 楼 user-3 的回复：因为你在for的else打印了，放到for外面来打印 for(i=2; i<m; i++) {     if(m%i==0) break; } if(i==m) printf(“%d是素数\”n, m); //放到for外面打印，否则for循环中只有不满足if就会打印 else printf(“%d不是素数\”n, m);万分感谢

user: user-3
content: 因为你在for的else打印了，放到for外面来打印 for(i=2; i<m; i++) {     if(m%i==0) break; } if(i==m) printf(“%d是素数\”n, m); //放到for外面打印，否则for循环中只有不满足if就会打印 else printf(“%d不是素数\”n, m);
user-0 提问: 单项链表逆置小问题问题

回复:
user: user-1
content: 这一类问题都是不会画图引起的，放下电脑，拿起笔，在纸上画图，可以提高编程能力。

user: user-2
content: pt根本就没有指向第三个节点，而是指向了NULL pr也是NULL，while就没有执行  不对啊，这个不是刚刚给你回答完的问题吗？ 怎么又贴出来了呢
user-0 提问: 功能5没反应。其他都正常。。。

回复:
user: user-0
content: 逆置函数：pa直接代表了头节点的下一个节点（头节点中data没有值），第二个节点后续作为尾节点，所以设为NULL，pt指向第三个节点，pr指向pt。循环中pt进入第四个节点。然后pr为第三个节点，需要把第二个节点（后续的尾节点）地址传给第三个的next；然后都在进一位，依次类推。最后pt出来为空（疑问：pt的data，next均为空？），都为空的话是不是可以直接让pt作为头节点，所以pt->next=pa；链接起来。哪里错了？

user: user-0
content: 最后一行复制错了
user-0 提问: 不允许指针指向不完整的类类型

回复:
user: user-1
content: 引用 5 楼 寻开心 的回复:struct node {     char str[26];     struct node* next[26]; }; 这个地方也怪怪的， 这是要建立26叉树？  链表应该这样 struct node {     char str[26];     struct node* next; };  struct node* create() {     struct node* phead = NULL;     struct student* pend, * pnew;     count = 0;  // 这个count也莫名其妙的做什么用呢     scanf_s("%s", &pnew->str, 26); 这里向下是是不是省略了一堆代码啊     明显不全啊     你的错误提示，是发生在那一行代码上的， 给全所在行周边的代码   } 可以有26杈树吗，多叉树一般用于什么地方？

user: user-2
content: struct node {     char str[26];     struct node* next[26]; }; 这个地方也怪怪的， 这是要建立26叉树？  链表应该这样 struct node {     char str[26];     struct node* next; };  struct node* create() {     struct node* phead = NULL;     struct student* pend, * pnew;     count = 0;  // 这个count也莫名其妙的做什么用呢     scanf_s("%s", &pnew->str, 26); 这里向下是是不是省略了一堆代码啊     明显不全啊     你的错误提示，是发生在那一行代码上的， 给全所在行周边的代码   }

user: user-3
content: creat函数没有返回值

user: user-0
content: 引用 2 楼 寻开心 的回复:pNew = (struct node*) malloc( sizeof(struct node));  需要有这个一句 不能没有分配内存就往里面写数据 加上了分配内存的代码，但是报错内容并没有变？

user: user-2
content: pNew = (struct node*) malloc( sizeof(struct node));  需要有这个一句 不能没有分配内存就往里面写数据

user: user-4
content: scanf_s("%s", &pnew->str, 26); pnew是野指针呢，这样操作可能会导致段错误。  struct student这个类型没看到定义的地方。
user-0 提问: towlower和tolower有什么区别？

回复:
user: user-1
content: char 用 tolower，wchar_t 用 towlower。简单来说，宽字符能存的字符范围比普通字符要来得大，但我个人不建议使用 wchar_t 存储字符，因为 wchar_t 的字符存储相比 char 几乎没有任何优势(在 Windows 上会和 char 一样，可能把一整个字符切断[例如 emoji]，而在 Linux 上占的空间太大了)。
user-0 提问: 单链表的删除

回复:
user: user-1
content: 求代码

user: user-0
content: 引用 1 楼 寻开心的回复:要代码自己百度  要学习就自己写， 贴错误代码来提问 👌🏻 谢啦 第一次来这里提问不太懂 已经写完提交了

user: user-2
content: 你至少需要一个打印链表的函数，先写这个函数，整个编程过程能方便一点。

user: user-3
content: 要代码自己百度  要学习就自己写， 贴错误代码来提问
user-0 提问: 显示信息的时候出问题了，求助！！！代码如下

回复:
user: user-0
content: 给了呀，10分，你可能没注意呢

user: user-1
content: 结贴啊？给我点分

user: user-0
content: 谢谢！！！格式改了一下真的成功了诶！！！谢谢！！！

user: user-0
content: s 是指针的

user: user-2
content: showstudent函数打印成绩的时候，格式错了 for(j = 0;j < 4;j ++) { printf("%d",s ->score[j]); //printf("%f ",s ->score[j]); 这里要用 %f 因为是浮点数，而且输出一个后叫一个空格，否则连在一起不好分辨 } }

user: user-1
content: void InputStudent(STUDENT *s) { int i,j;    for (i = 0;i < count;i++,s ++)s是指针，*吧？
user-0 提问: 【萌新求解】文件就是读不出来 但是可以成功写入T_T

回复:
user: user-1
content: #include<stdio.h> #include<string.h>  struct neirong { 	char day[4];	              //日期 	int top[3];                   //1.作业 2.备忘 3.记事 	char wen[1000];	         //neirong }; struct neirong nr, rq; //  包括的结构 void find() { 	FILE *op, *mp; 	char fday[30]; 	int i = 0, s = 1, j = 0;  	if (!(op = fopen("D:\\day.txt", "r"))) 	{ 		printf("出错了！\n"); 		return; 	} 	if (!(mp = fopen("D:\\netrng.txt", "r+"))) 	{ 		printf("出错了！\n"); 		return; 	}  	printf("要查找的日期："); 	scanf("%s", fday);  	while (strcmp(fday, nr.day) != 0) 	{ 		i = i + 1; s = i; 		fscanf(op, "%s\n", nr.day); 		fscanf(mp, "%s\n", nr.wen); 	} 	//fscanf(op, "%s\n", nr.day); 	printf("找到了！\n");  	//for (j = 0; j < s - 1; j++) 	//{ 	//	rewind(mp);  	//	fscanf(mp, "%*[^\n]%*c"); 	//} 	//fgets(nr.wen, 30, mp); 	printf("%s\n", nr.wen); 	fclose(mp); 	printf("11"); }  void main() { 	FILE *fp, *lp; 	int j = 0, n = 1;   	if (!(fp = fopen("D:\\day.txt", "a+"))) 	{ 		printf("出错了！\n"); 		return; 	} 	if (!(lp = fopen("D:\\netrng.txt", "a+"))) 	{ 		printf("出错了！\n"); 		return; 	} 	while (1) 	{ 		j = j + 1; 		printf("今天的日期："); 		scanf("%s", rq.day); 		fprintf(fp, "%s\n", rq.day); 		/*for (n = 1; n < 30; n++) 		{if (strcmp(nr[i].day, nr[i + n].day) == 0) 		{if (!feof(fp)) 		{printf("已经有这个日期了！"); exit(0); 		} 		} 		}*/ 		printf("开始记录吧：\n"); 		scanf("%s", rq.wen);        //输入的内容 		fprintf(lp, "%s\n", rq.wen);      //输入进txt 		if (getchar() == '\n') break; 	}        //当最后的一个符号位xxx时 break 	fclose(fp); 	fclose(lp);//必须关闭文件否则导致缓存消失 	find(); }

user: user-2
content: main里面向day文件只写入了日期，其他的都写入了内容     fprintf(fp, "%s\n", rq.day);     fprintf(lp, "%s\n", nr.wen); find里面呢， 从日期文件又读日期，又读内容，这个显然也是不匹配的     fscanf(op, "%s\n", &rq.day);}     fscanf(op, "%s\n", &nr);

user: user-1
content: 代码太乱了，格式不清晰，我不复制到编译器调整格式我都没法看。错误也很多，你那个nr和rq应该是要一个用来写一个用来读吧，你要写的日期放rq，内容放nr，这么做就没有搞结构体的必要了，输出也类似；fscanf(op, "%s\n", &nr);这条语句这是要读取字符串到结构体？find()函数里那个while(1)循环里面放两个break是什么情况？只执行一次就不要用while，while跟break配合一般要结合if语句，满足特定条件才跳出，你的while循环下直接放两个break，遇见第一个的时候就跳出了，后面那一段代码永远不执行，既是去掉第一个也是刚执行一遍就遇到break，相当于顺序执行

user: user-2
content: 你要打开几遍啊  一个文件，只留一个fopen

user: user-0
content: 求求大哥萌了 弄两天了 要哭了
user-0 提问: C语言在线编程段错误是怎么回事

回复:
user: user-1
content: 仔细看输入描述 系数和指数都是绝对值不超过1000的， 这个什么意思啊？ 就是说， 这个多项式可能有1001项， 指数从1000到0都有的情况 系数呢绝对值不超过1000，加上符号位的话系数最多占五位 所以表达式可能是-1000 1000 -1000 999 -1000 998 ..... -1000 0 0 0 你自己算算这个字符串有多长， 能不越界吗？ 你的numbers，index，answer数组开的太小啦

user: user-0
content: 引用 1 楼 寻开心的回复:贴代码和题目出来 题目和代码见三楼

user: user-0
content: 引用 2 楼 proorck2019的回复:有可能是数组太大造成的，如： int a[10000000000]; 题目和代码在三楼

user: user-0
content: #include<stdio.h> #include<stdlib.h> #include<string.h>  int main() {     char nums[60];     char index[30];     int j=0;//j数字长度     int k=0;//整型数组计数器     int temp;     int answers[30];//最终答案      int m=0;     gets(nums);     for(int i=0;i<59 && nums[i] != '\0';i++,j++)     {         m=0;         if(nums[i] == ' ')         {             for(;m<j;m++)             {                 index[m] = nums[i-j+m];             }             index[m] ='\0';              temp = atoi(index);             answers[k] = temp;             k++;//             j=-1;         }//if         if(nums[i+1] == '\0')         {             i=i+1;             for(;m<=j;m++)             {                 index[m] = nums[i-j-1+m];             }             index[m] ='\0';              temp = atoi(index);             answers[k] = temp;             k++;              break;         }//if     }//for      for(int s=0;s<k  ;s+=2)     {             if(answers[s+1]== 0)                 answers[s]=answers[s+1]=0;             else             {                 answers[s] *= answers[s+1];                 answers[s+1]--;             }     }//for     for(int s=0;s<k;s += 2)    {            if(answers[s+1]!= 0 && answers[s]!= 0)             {                 if(s+1 == k)                     printf("%d %d",answers[s],answers[s+1]);                 else                    printf("%d %d ",answers[s],answers[s+1]);             }             else             {                 if(answers[s+1]== 0) {printf("%d %d",answers[s],answers[s+1]);break;}             }    }//for     return 0; }

user: user-0
content: 引用 6 楼 寻开心的回复:仔细看输入描述 系数和指数都是绝对值不超过1000的， 这个什么意思啊？ 就是说， 这个多项式可能有1001项， 指数从1000到0都有的情况 系数呢绝对值不超过1000，加上符号位的话系数最多占五位 所以表达式可能是-1000 1000 -1000 999 -1000 998 ..... -1000 0 0 0 你自己算算这个字符串有多长， 能不越界吗？ 你的numbers，index，answer数组开的太小啦 谢谢解答，问题已解决

user: user-2
content: 有可能是数组太大造成的，如： int a[10000000000];

user: user-1
content: 贴代码和题目出来
user-0 提问: 如何使用imageload和imagesave显示图片

回复:
user: user-1
content: openGL库没有提供加载图片的api， 是要自己处理的

user: user-2
content: 这个要熟悉glut库的 猜测是在init里loadimage（load完后程序中没有一个全局变量保存），display是绘制load好的image LZ自己谷歌百度一下glut库的例子估计效率更快

user: user-1
content: OpenGL 加载bmp图片纹理和截图保存？ 太多例子啦 自己百度一下去， opengl加载纹理， opengl截屏保存 https://blog.csdn.net/xiadidi/article/details/100035833 https://blog.csdn.net/weixin_30390075/article/details/95618244 https://blog.csdn.net/epluguo/article/details/19014325?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task   unsigned int getint(FILE *fp)这个函数有什么意义呢 二进制打开， 一次fread一个int类型进来就是了，为什么要分四次读四个char再合并呢
user-0 提问: 求解——C语言新手

回复:
user: user-1
content: 调用的代码给出来啊

user: user-2
content: 错误提示是你把函数指针转成了数组，你是怎么调用xn的，把调用的代码也贴出来

user: user-3
content: 调用部分的代码呢 哪个错误的提示就是你调用的时候給到参数形式，和这个定义的形式不一致
user-0 提问: 求助大神，实在做不出来了…

回复:
user: user-0
content: 引用 4 楼 5250的回复:[quote=引用 2 楼 kusanagiyoli 的回复:] [quote=引用 1 楼 5250的回复:]def sortedNumbers(num1,num2,num3):     list = []     list.append(num1)     list.append(num2)     list.append(num3)     list.sort()     for i in list:         print(i)  num1 = int(input("please input 1st number:")) num2 = int(input("please input 2nd number:")) num3 = int(input("please input 3rd number:"))  sortedNumbers(num1,num2,num3) 大佬大佬，最后的运算结果输出怎么让他显示:”请输入三个数（用逗号分隔）：”这种形式啊？[/quote]  啥意思，一次性输入三个数吗？  num1,num2,num3 = input("请输入三个数:").split(',')[/quote] 是的，谢谢大佬！

user: user-1
content: 引用 2 楼 kusanagiyoli 的回复:[quote=引用 1 楼 5250的回复:]def sortedNumbers(num1,num2,num3):     list = []     list.append(num1)     list.append(num2)     list.append(num3)     list.sort()     for i in list:         print(i)  num1 = int(input("please input 1st number:")) num2 = int(input("please input 2nd number:")) num3 = int(input("please input 3rd number:"))  sortedNumbers(num1,num2,num3) 大佬大佬，最后的运算结果输出怎么让他显示:”请输入三个数（用逗号分隔）：”这种形式啊？[/quote]  啥意思，一次性输入三个数吗？  num1,num2,num3 = input("请输入三个数:").split(',')

user: user-2
content: #!/usr/bin/python #coding=utf-8  list = []; for i in range(3):         list.append(eval(raw_input("请输入第%d整数: " % (i+1)))) list.sort() print (list);

user: user-0
content: 引用 1 楼 5250的回复:def sortedNumbers(num1,num2,num3):     list = []     list.append(num1)     list.append(num2)     list.append(num3)     list.sort()     for i in list:         print(i)  num1 = int(input("please input 1st number:")) num2 = int(input("please input 2nd number:")) num3 = int(input("please input 3rd number:"))  sortedNumbers(num1,num2,num3) 大佬大佬，最后的运算结果输出怎么让他显示:”请输入三个数（用逗号分隔）：”这种形式啊？

user: user-1
content: def sortedNumbers(num1,num2,num3):     list = []     list.append(num1)     list.append(num2)     list.append(num3)     list.sort()     for i in list:         print(i)  num1 = int(input("please input 1st number:")) num2 = int(input("please input 2nd number:")) num3 = int(input("please input 3rd number:"))  sortedNumbers(num1,num2,num3)
user-0 提问: devc++  用system（“pause”）报错  为什么 求助

回复:
user: user-1
content: 就该getchar()吧，加#include<stdio.h>

user: user-1
content: 如果是C++的话加一下#include <windows.h>，如果还是不行，那就。。。

user: user-0
content: 引用 1 楼 寻开心 的回复:#include <stdlib.h> 这个加了吗  加了  不知道怎么回事

user: user-2
content: #include <stdlib.h> 这个加了吗
user-0 提问: 单项链表的添加小问题

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复:你的print函数是while (pt->next != NULL)，那么当pt->next == NULL时，pt不是NULL呀，所以最后一个节点的data没有输出。谢谢

user: user-1
content: 你的print函数是while (pt->next != NULL)，那么当pt->next == NULL时，pt不是NULL呀，所以最后一个节点的data没有输出。
user-0 提问: C语言运算不正确，怎么办？

回复:
user: user-1
content: 精度问题，没办法，你可以用double试试。 如果希望得到准确结果，就自己用数组模拟。

user: user-2
content: 并不是所有的浮点数都可以在电脑中精确的表达，这点和整数不一样 浮点数float的有效数字只有6~7位， double类型是15~16位 无法精确表达的时候，只会用最近似的数值来替代 0.02可能会变成0.0199999这样的数字， 你用%.2f输出， 会四舍五入得到0.02的

user: user-3
content: 浮点数存在精度问题，因此会出现不像数学里1-0.98=0.02

user: user-4
content: 浮点数精度问题

user: user-5
content: 废话，1-0.98的0.02
user-0 提问: 为什么我这个删除函数有问题呢？各位大佬能帮小弟看一下嘛

回复:
user: user-1
content: 你把代码贴上来，我给你修改加注吧

user: user-0
content: 引用 7 楼 燚认的回复:你需要获得待删除节点的前一个节点，而不是待删除节点本身，把待删除节点的前一个节点的next指向待删除节点的后一个节点就删除掉了 代码应该怎么实现，我还是不太懂这个逻辑 好复杂😂

user: user-2
content: 你需要获得待删除节点的前一个节点，而不是待删除节点本身，把待删除节点的前一个节点的next指向待删除节点的后一个节点就删除掉了

user: user-0
content: 引用 3 楼 (´▽`)ﾉProgram(´▽`)ﾉ的回复:你是不是一共就建立了3个,然后你每一个元素都靠后了一个 我也不太懂  你知道吗

user: user-0
content: 引用 1 楼 待续_1006的回复:首先你想删除一个节点要保存被删节点的前一个节点以及后一个节点，你调试下你的listdelete里的逻辑，你有保存被删除节点的前一个节点吗？建议先画图理解一下链接的规则！ 我只知道要引用一个新的指针，保存那个被删除的，然后释放

user: user-0
content: 引用 1 楼 待续_1006的回复:首先你想删除一个节点要保存被删节点的前一个节点以及后一个节点，你调试下你的listdelete里的逻辑，你有保存被删除节点的前一个节点吗？建议先画图理解一下链接的规则！ 不是太懂这个逻辑，大佬能不能帮我讲一下根据这个题

user: user-3
content: 你是不是一共就建立了3个,然后你每一个元素都靠后了一个

user: user-3
content: 你是不是一共就建立了3个,然后你每一个元素都靠后了一个

user: user-4
content: 首先你想删除一个节点要保存被删节点的前一个节点以及后一个节点，你调试下你的listdelete里的逻辑，你有保存被删除节点的前一个节点吗？建议先画图理解一下链接的规则！

user: user-2
content: Linklist *q = L, *k = q->next; 	//L有头结点,即现在q指向头结点，无数据,k指向第一个节点 	//位置从0开始计数，即n为0删除第一个节点 	for (int i = 0; k && (i < n); ++i)//这里把k作为判断条件，防止超限 	{ 		//始终保持q是k的前一个节点 		q = k; 		k = k->next; 	} 	//循环结束k指向的节点是要删除的，q是他的前一个节点 	q->next = k->next; 	free(k);
user-0 提问: 求助！vc++无法构建程序！

回复:
user: user-1
content: 建议楼主换软件，我用VS，这种问题代码刚输进去都不用编译就有提示

user: user-2
content: 主函数的返回值“void”都写错了

user: user-3
content: VS2019更新到现在，明显BUG不多了，实在不放心就VS2017。守着一个20多年前的VC6，干嘛呢？新版本一般来说比老版本更方便，而且如今的C/C++也比当年的C/C++扩充了不少。

user: user-0
content: 大佬，创建程序之后直接就显示停止工作了，悲

user: user-4
content: 换vs2017社区版, 你以后去公司，99.99%的公司都不会让你用vc++6.0

user: user-5
content: 我个人倒是觉得VC++6.0还是挺不错的，简单易用，容易上手

user: user-6
content: 换个吧，都啥年代了还用这古老的东西。devc++ codeblocks这些都很好用，要不就vs2019

user: user-5
content: 重新在VC++6.0里面新建一个项目    然后再把你的代码拷贝到

user: user-0
content: 引用 7 楼 Filthy_killer的回复:主函数的返回值“void”都写错了 啊哈哈，咱也才刚接触，还请谅解，不过大佬能指出来错误的地方还是非常感谢的

user: user-0
content: 引用 8 楼 燚认的回复:建议楼主换软件，我用VS，这种问题代码刚输进去都不用编译就有提示 好的，谢谢大佬
user-0 提问: 关于结构体作为函数的参数的初始化

回复:
user: user-1
content: backgrand->data =  (unsigned char*)malloc(sizeof(char)); 这句是不是有问题啊？

user: user-2
content: 释放内存的先后顺序问题 backgrand都被free了，还能访问backgrand->data吗？

user: user-3
content: 你这个free两个语句的顺序反了 先free data，后free backgrand才可以  编译器报告不了NULL指针， 运行后才知道
user-0 提问: 创建队列遇到的问题

回复:
user: user-1
content: printlist的while条件错 原因很简单，假设只加了一个元素，Q->front为0，Q->rear为1，那么打印从0到1循环就够了，只打印一个元素，你从0到1+1就会多打印一个元素 而且，还应该考虑Q->rear变成0回到开头的情况，很可能Q->front就大于Q->rear

user: user-2
content: 楼主，你看看你的第二个函数，i<=n，Q->rear++,那么Q->rear = 7 , 然后在输出函数里退出条件Q->rear+1所以多了一个，不应该+1
user-0 提问: 哪位大神帮忙解决一下。

回复:
user: user-1
content: 自己看看底下的错误输出 第五行scanf不能用了， 要改成scanf_s参数 自己百度去， scanf和scanf_s的区别 对于输入字符或者字符串才有区别，输入数字只是换个函数名，参数无需变动。
user-0 提问: 哪里错了啊

回复:
user: user-1
content: int i = (int)strlen(a) + 1; //注意这里的括号，否则a是数组，不能+1 其实你这个用不到，没必要算strlen

user: user-2
content: 哎~~跟着这个解题思路写就是了啊~~错哪里了自己对~  #include <stdio.h> #include <ctype.h> int main() { 	char a[81]; 	int word=0; 	int count=0; 	gets(a);//读入一行用gets(); 	for(int i=0; a[i]!='\0'; i++) { 		if (isalpha(a[i]))  //如果是字母， 			word=1;	 //则表示出现新单词 		else if(isspace(a[i])&&word==1) { 			count++;   //碰到单词后面的空格，单词+1；  			word=0;	   //标志复位~  		} 	} 	if(word==1) count++; //最后一个单词~  	printf("有%d个单词\n",count); 	return 0; }

user: user-3
content: 把图片都倒着发，就是最大的错误 你打算让帮助你的人倒着看？
user-0 提问: 数据结构删除为x的结点

回复:
user: user-0
content: 就是通过ListDelete函数返回删除值为x的结点后剩余的结点数，用j来计数；请问一下，怎么样做可以通过各个函数时可以让L参数返回，运行程序没有输出。

user: user-1
content: 不知道你的ListDelete当中返回值的意思，没有动它 自己改吧  主要问题是CreateList函数的时候，L并不能通过参数返回，所以列表没有创建成功 增加了一个ListPrint函数，方便查看创建后和删除后的队列情况 ListDelete返回值要做什么， 不明朗，很奇怪

user: user-1
content: #include<stdio.h> #include <stdlib.h> typedef struct LNode {  int data;     struct LNode *next; }  LinkNode; int a[50];  LinkNode * CreateList(int a[] ,int n) {     LinkNode *s,*r, *L;     int i;     L=(LinkNode *)malloc(sizeof(LinkNode));     L->next=NULL;     r=L;     for(i=0;i<n;i++)     { s=(LinkNode *)malloc(sizeof(LinkNode));         s->data=a[i];         r->next=s;         r=s;     }     r->next=NULL;     return L; }  int ListDelete(LinkNode *L,int x) {     int j=0;     LinkNode *p=L,*q;     if(L->next==NULL)         return 0;     else{         while(p->next!=NULL){             if((p->next)->data==x){                 q = p->next;                 p->next = q->next;                 free(q); j++;  // j是什么意思？ 列表当中有多个x存在吗？ 如果是还需要一句 p=p->next;在这里              }             else                 p=p->next;         }         return j;     } }  void ListPrint(LinkNode * L){     if ( L && L->next) {         printf("List datas:\n");         LinkNode * p = L;         while ( p->next ) {             printf("%d ", p->next->data);             p = p->next;         }         printf("\n");     } else {         printf("\n --- Empty List ----- \n");     } }  int main() {     LinkNode *L;     int x,i,n,k;     scanf("%d %d",&x,&n);     for(i=0;i<n;i++)         scanf("%d",&a[i]);  L = CreateList(a,n);     ListPrint(L);     k=ListDelete(L,x);     ListPrint(L);     printf("%d",a[0]);     if(k!=0){         for(i=0;i<k;i++)             printf("%d ",a[i]);     }     else         printf("NULL");     return 0; }
user-0 提问: 为什么第一个是对的，第二个是错的，if语句，关系运算符。

回复:
user: user-1
content: 我去，我写了10+年还没有看到有人这么写得

user: user-2
content: 哇哈哈  慕课的随堂测试

user: user-3
content: 1<=n<=10 语法上没有毛病 执行结果是先1<=n判断， 结果是0或者1， 然后用这个结果去做<=10 到判断， 结果就永远是真 在语法上说，这句是对的  但是表示的意思明显不是  1<=n  && n<=10, 因此第二个就是错的

user: user-4
content: n无论等于几，都是永真吧。 if((1<=n)<=10)，一般不建议这么写
user-0 提问: 一道很有意思的题

回复:
user: user-1
content: 用 c11 的话可以一行解决  std::sort(arr, arr + 3, [](int x, int y)->bool { return abs(x) == abs(y) ? (x < y) : abs(x) < abs(y); });

user: user-0
content: 引用 1 楼 user-4 的回复:直接定义另一个数组只记原来数组的下标就行了，排序把下标标记在另一个数组中，最后直接按下标输出就行了  引用 3 楼 寻开心 的回复:void MaxMin (int& a, int& b) {      if ( fabs(a)< fabs(b) swap (a, b);      else if ( fabs(a)==fabs(b))          if ( a<b) swap(a, b); }  引用 4 楼 qybao 的回复:直接冒泡排序改一下比较方法就好 int a[3] = {1,3,-3}; for (int i=0; i<3-1; i++) {     for (int j=0; j<3-i-1; j++) {         if (fabs(a[j]) > fabs(a[j+1]) || (fabs(a[j]) == fabs(a[j+1]) && a[j] > a[j+1])) {             int tmp = a[j];             a[j] = a[j+1];             a[j+1]= tmp;         }     } } for (int i=0; i<3; i++) printf("%d", a[i]);  好的，大佬们的方法都好简单，谢谢了

user: user-2
content: 直接冒泡排序改一下比较方法就好 int a[3] = {1,3,-3}; for (int i=0; i<3-1; i++) {     for (int j=0; j<3-i-1; j++) {         if (fabs(a[j]) > fabs(a[j+1]) || (fabs(a[j]) == fabs(a[j+1]) && a[j] > a[j+1])) {             int tmp = a[j];             a[j] = a[j+1];             a[j+1]= tmp;         }     } } for (int i=0; i<3; i++) printf("%d", a[i]);

user: user-3
content: void MaxMin (int& a, int& b) {      if ( fabs(a)< fabs(b) swap (a, b);      else if ( fabs(a)==fabs(b))          if ( a<b) swap(a, b); }

user: user-3
content: void MaxMin (int& a, int& b) {      if ( fabs(a)< fabs(b) swap (a, b);      else if ( fabs(a)==fabs(b)) swap(a, b); }  然后冒泡排序就行了 for ( x ...)     for(y ....)       MaxMin(a[x], a[y]);

user: user-4
content: 直接定义另一个数组只记原来数组的下标就行了，排序把下标标记在另一个数组中，最后直接按下标输出就行了
user-0 提问: 努力学习C，想请教各位老师个问题

回复:
user: user-0
content: 引用 1 楼 寻开心 的回复:#include<stdio.h> void br(int); void ic(int); int main(void)  {     br(0);     ic(1);     br(1);     ic(1);      return 0; } void br(int newLine) {      printf("Brazil,Russia");     if (newLine )        printf(".\n");    else        printf(", ");  }  void ic(int newLine) {     printf("India,China");     if (newLine )        printf(".\n");    else        printf(", "); }   谢谢老师，学到了。 我在读C primer plus 还没讲到 else和if句

user: user-1
content: #include<stdio.h> void br(int); void ic(int); int main(void)  {     br(0);     ic(1);     br(1);     ic(1);      return 0; } void br(int newLine) {      printf("Brazil,Russia");     if (newLine )        printf(".\n");    else        printf(", ");  }  void ic(int newLine) {     printf("India,China");     if (newLine )        printf(".\n");    else        printf(", "); }
user-0 提问: 请问这两个程序有什么区别呢

回复:
user: user-0
content: 引用 7 楼 寻开心 的回复：第一个，那个是初始化， 把那个字符串的内容复制了一份放到数组里面。 数组内存不是在只读区的，读写都没有问题 第二个，那个同样是初始化， 但是是把只读缓冲区的地址给予了那两个char*变量，这个时候操作写是在只读内存上，无法写成功明白了 感谢

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

user: user-1
content: 你自己试试， a[1] = 'X';  b[1] = 'y';   你可以看到，第一种写法， 可以更改生效； 第二种写法，估计就是一个崩溃的提示了

user: user-1
content: 第一个，那个是初始化， 把那个字符串的内容复制了一份放到数组里面。 数组内存不是在只读区的，读写都没有问题 第二个，那个同样是初始化， 但是是把只读缓冲区的地址给予了那两个char*变量，这个时候操作写是在只读内存上，无法写成功

user: user-0
content: 引用 5 楼 user-2 的回复：第一个和第二个的区别只在[]和"".  char *from=a这句话不是根源第一个 char a[]=“xxxx”;char *from=a; 第二个 char a*=“xxxx”;  第一个可以得到正确结果第二个不可以

user: user-2
content: 第一个和第二个的区别只在[]和"".  char *from=a这句话不是根源

user: user-0
content: 引用 2 楼 寻开心 的回复：区别大了 char *a = "kdkdlkddk"   // 这个字符串是const char * 不可能更改 char a[]   // 这个是数组，内容随便改那第一个char *from=a  为啥就可以了呢

user: user-2
content: 打错了，第一个你要判断大小，拷贝的时候不能目标一定要比源大，否则还是要报错。

user: user-1
content: 区别大了 char *a = "kdkdlkddk"   // 这个字符串是const char * 不可能更改 char a[]   // 这个是数组，内容随便改

user: user-2
content: 很简单，你这个改了不应该你改的内存。两个都是。
user-0 提问: 数组作为函数参数问题!!!

回复:
user: user-0
content: 引用 14 楼 chxchxkkk的回复:[quote=引用 13 楼 chxchxkkk 的回复:] [quote=引用 12 楼 chxchxkkk 的回复:] 你要想求n个， n<N, 循环定义成 for(i=0; i<n; n++)就行了。哪儿能用得着CTRL+Z中断 就象前面哥们说的先要赋初值。  比如： int a[N] = {0}, n=0, sum=0;[/quote]  发段代码参考一下吧  #include <stdio.h> #define N 100  float average(float arr[], int n) {     int i;     float aver, sum = 0;     for(i=0; i<n; i++)     {         sum += arr[i];     }     aver = sum / n;     return aver; }  int main() {     int i, n=0;     float arr[N] = {0}, aver=0;     printf("要求多少个人的平均分: \n");     scanf("%d", &n);     for(i=0; i<n; i++)     {         printf("输入第 %d 个人的成绩： \n", i+1);         scanf("%f", &arr[i]);     }      aver = average(arr, n);     printf("平均分= %.2f", aver);      return 0; }  [/quote] 今天第一次学这种在main函数外面还写一个的 没想明白为什么可以一个就写完的还要在外面加一个

user: user-1
content: 引用 13 楼 chxchxkkk 的回复:[quote=引用 12 楼 chxchxkkk 的回复:] 你要想求n个， n<N, 循环定义成 for(i=0; i<n; n++)就行了。哪儿能用得着CTRL+Z中断 就象前面哥们说的先要赋初值。  比如： int a[N] = {0}, n=0, sum=0;[/quote]  发段代码参考一下吧  #include <stdio.h> #define N 100  float average(float arr[], int n) {     int i;     float aver, sum = 0;     for(i=0; i<n; i++)     {         sum += arr[i];     }     aver = sum / n;     return aver; }  int main() {     int i, n=0;     float arr[N] = {0}, aver=0;     printf("要求多少个人的平均分: \n");     scanf("%d", &n);     for(i=0; i<n; i++)     {         printf("输入第 %d 个人的成绩： \n", i+1);         scanf("%f", &arr[i]);     }      aver = average(arr, n);     printf("平均分= %.2f", aver);      return 0; }

user: user-1
content: 引用 12 楼 chxchxkkk 的回复:你要想求n个， n<N, 循环定义成 for(i=0; i<n; n++)就行了。哪儿能用得着CTRL+Z中断 就象前面哥们说的先要赋初值。  比如： int a[N] = {0}, n=0, sum=0;

user: user-1
content: 你要想求n个， n<N, 循环定义成 for(i=0; i<n; n++)就行了。哪儿能用得着CTRL+Z中断

user: user-2
content: 你想多了，工作中不会有人用这种方式输入。要么协议，要么配置，你最重要的是做好函数接口，知道流程如何跑的，输入这种次要的。

user: user-0
content: 引用 9 楼 user-2的回复:你的demo自己坑自己，要输入100个成绩，前面又不初始化存成绩的数组，不能少输入几个来测试吗 我就是想如果是n个该怎么办 然后弄了个100  输几个数中间用Ctrl+z中断 输出结果每次都是这个

user: user-2
content: 你的demo自己坑自己，要输入100个成绩，前面又不初始化存成绩的数组，不能少输入几个来测试吗

user: user-2
content: 咋个可能没用，只要有初始值，最后不是除0，输出不可能那样.

user: user-0
content: 引用 5 楼 user-2的回复:意思就是你所有的值都要初始化，你sum也没有初始化的，我以为你能发现自己剩余的问题的 我之前试过 没用...

user: user-0
content: 引用 3 楼 chxchxkkk的回复:主函数中没见调用子函数。按题意应该子函数读取数组，求出平均数并返回给主函数。主函数定义数组并输入数组的值。调用子函数（传入数组）得到平均值并打印出来。 啊对  我加上去了...还是这样

user: user-2
content: 意思就是你所有的值都要初始化，你sum也没有初始化的，我以为你能发现自己剩余的问题的

user: user-0
content: 引用 1 楼 user-2的回复:小写的n没有初始化 赋0还是这样

user: user-1
content: 主函数中没见调用子函数。按题意应该子函数读取数组，求出平均数并返回给主函数。主函数定义数组并输入数组的值。调用子函数（传入数组）得到平均值并打印出来。

user: user-2
content: average没有容错性，如果n==0咋个办, 都在for里面做即可，没有必要外面获得一次[0]

user: user-2
content: 小写的n没有初始化
user-0 提问: 决胜21点（纸牌游戏），第一组组数据没问题，第二组读取数据的时候就有问题了，大神教教我这个新手吧！

回复:
user: user-0
content: sscanf()功能果然加强大

user: user-1
content: 用不到gets啦。  H10， H3 这样的都成为一个个单独的字符串，保存在临时变量char str[20]当中 然后再用一个字符串函数，从字符串当中读取内容 char ch； int d; sscanf(str, "%c%d", &ch, &d); 就可以啦 str此时如果是"H10"， 那么读取完了ch就是H字符， d就是10了

user: user-0
content: 引用 4 楼 寻开心的回复:每组数据 先 scanf("%d%d", &w,&s); 而后那一行的四个或者几个也好， 循环读取字符串就行了 char str[20] for(I=0; I<w; I++)    scanf("%s", str);  // str就是独立分开的H10， H3 这样的了  H10 H3虽然是一行，但是中间有空格的， %s自己回区分他们的 可是这样只换了思路，没有解决gets这一用法的错误呀~

user: user-1
content: 每组数据 先 scanf("%d%d", &w,&s); 而后那一行的四个或者几个也好， 循环读取字符串就行了 char str[20] for(I=0; I<w; I++)    scanf("%s", str);  // str就是独立分开的H10， H3 这样的了  H10 H3虽然是一行，但是中间有空格的， %s自己回区分他们的

user: user-1
content: scanf("%d%d",&w,&s);和 scanf("%d %d ",&w,&s); 没区别， 而且写成前者会更好 scanf输入多个数，数之间用空白符分割， 空白符是空格，tab或者回车 这个是scanf自动支持， 根本就不需要你去指定 你可以输入1                            2回车 你可以是1回车2回车 根本没有区别  你的问题反而是出现在那两个getchar调用上， 纯属多此一举，反而产生副作用， 回车提走了， 正常的有效数据也给提走了 根本不需要的，键盘缓冲的回车， scanf会自动过滤的  你自己scanf之后，马上printf一次，就知道是否正确的获得了结果了  网上有一堆说如何过滤键盘缓冲区里面的回车的说法， 但是，但是，但是，那都是在输入单个字符的情况 你没有单个字符的输入需求  就没有必要瞎折腾

user: user-0
content: 两个getchar都可去掉

user: user-0
content: 解决了，把 scanf("%d%d",&w,&s);换成  scanf("%d %d ",&w,&s);
user-0 提问: 求帮

回复:
user: user-1
content: strcmp是按照字符串每个字符的ascii值来比较的，和是否中文没有关系 如果第一个比第二个字符串"大", 返回1， 两个字符串完全一样返回0，第一个比第二个小则返回-1  字符串"2", 比"1342342sdfdsfsdfs"大， 只是因为第一个字符2比1的ascii值大而已  详细的你可以看看函数原型 https://baike.baidu.com/item/strcmp/5495571?fr=aladdin 这里有详细的解释，和模拟代码

user: user-2
content: 引用 2 楼 qq_45768878 的回复:[quote=引用 1 楼 自信男孩的回复:]strcmp("你好", "世界"); 就这么简单～  strcmp是字符串比较～ 这个两个谁大谁小怎么确定的？[/quote] -1， 0， 1 -1是指参数1小于参数2， 0是指参数1等于参数2 1是指参数1大于参数2.  用strcmp，最好了解它的参数，返回值等等信息

user: user-3
content: 引用 4 楼 qq_45768878的回复:[quote=引用 3 楼 不知道用什么名字。的回复:]字符1等于于字符2，函数值0 1>2 函数值正整数 1<2 函数值负整数 两个汉字字符串谁大谁小C语言怎么确定呢？[/quote] 你输出一下这个的值看看

user: user-0
content: 引用 3 楼 不知道用什么名字。的回复:字符1等于于字符2，函数值0 1>2 函数值正整数 1<2 函数值负整数 两个汉字字符串谁大谁小C语言怎么确定呢？

user: user-3
content: 字符1等于于字符2，函数值0 1>2 函数值正整数 1<2 函数值负整数

user: user-0
content: 引用 1 楼 自信男孩的回复:strcmp("你好", "世界"); 就这么简单～  strcmp是字符串比较～ 这个两个谁大谁小怎么确定的？

user: user-2
content: strcmp("你好", "世界"); 就这么简单～  strcmp是字符串比较～
user-0 提问: 国密标准GM/T 0020-2012中证书信任列表指的是什么？有什么用途？

回复:
user: user-1
content: 参考TLS,证书这东西，必须有个可信的第三方来检验证书的可靠性，这个应该是想建立一个这样的机构吧
user-0 提问: 如何VS2019中 用C语言CreatProcess()创建子进程

回复:
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: 答非所问
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-0 提问: c语言数组的高级定义问题

回复:
user: user-1
content: 那不就是正确的吗？i=1 则c=4，i是0则c是/，数组的下标是从0开始的。也就是说 / 也是其中的元素，因为它也是字符串中的一个字符啊。

user: user-0
content: 引用 1 楼 user-1 的回复：理论上可以的，可能不同的编译器处理不同吧，LZ的得到什么样的结果，和预期哪里不同？ “/4/3/2/1/5/6”是个字符串常量指针，指针[i]就是取第i个元素，等价于 const char *p = "/4/3/2/1/5/6";  c = p[1];编译器将/也算做其中的一个元素

user: user-1
content: 理论上可以的，可能不同的编译器处理不同吧，LZ的得到什么样的结果，和预期哪里不同？ “/4/3/2/1/5/6”是个字符串常量指针，指针[i]就是取第i个元素，等价于 const char *p = "/4/3/2/1/5/6";  c = p[1];
user-0 提问: 以下关于指针的描述对吗？

回复:
user: user-1
content: 2.通过获取指针变量的数据，（然后当作地址），可以从这个地址提取数据或者写入数据 指针变量中的数据就是地址。定义个野指针，然后提取或写入数据是非法的。

user: user-1
content: 第一个应该没有问题。我个人理解，匿名的含义，并不是指隐藏名字。而是指没有名字。 通过malloc函数分配的数据，本身并没有名字，这块数据的属性是指针定义的。 我是这么理解指针指向匿名数据的

user: user-0
content: 引用 1 楼 m0_46108109 的回复:2.通过获取指针变量的数据，（然后当作地址），可以从这个地址提取数据或者写入数据 指针变量中的数据就是地址。定义个野指针，然后提取或写入数据是非法的。 第一个没问题吧
user-0 提问: void Pos(int x,int y){

回复:
user: user-1
content: windows编程中，必须有handle，相当于OOP中的对象。 本段中，先获取handle，再设置它的pos， 写成handle.pos=(x,y)是在一行里， 但是规定必须分两行写。

user: user-0
content: 求详细解释一下这一段

user: user-0
content: void Pos(int x,int y)//设置光标位置 {     COORD pos; HANDLE hOutput;     pos.X=x;     pos.Y=y;     hOutput=GetStdHandle(STD_OUTPUT_HANDLE);     SetConsoleCursorPosition(hOutput,pos); }