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

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

引用 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*没顺序。 但是这样是报错的。所以这个只能按照顺序导出来对吧。。

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

引用 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才有顺序。

你想想printf，scanf，如果format和参数类型不匹配会如何


Question: 不知道为什么会数组越界 VS不停报错，牛客网上却能运行

引用 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]  逻辑错误靠你自己，这样可以少判断负数也不会崩溃

引用 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的倍数

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

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

要学会调试，你这个都是很简单的了

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

引用 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)好的 感谢

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

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

prime[primeSize++] = i;这里越界了

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

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

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

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

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


Question: C语言int和double int能输出12的阶乘，double为啥不可以？

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

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

12没溢出，13的阶乘溢出整数范围了

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

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

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

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转换为整数，截断错了

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


Question: C语言题目，要求时间复杂度最高为O（n），球球大佬们了

引用 2 楼 lin5161678的回复:[quote=引用 1 楼 mymtom 的回复:] 统计黑牛，白牛的数量就可以了呀  #include <assert.h> #include <stdio.h>  int main() {     int i, n;     int c, s[3] = {0};      assert(1 == scanf("%d", &n));      for (i = 0; i < n; i++) {         assert(1 == scanf("%d", &c));         assert(c == 1 || c == 2);         s[c]++;     }      printf("%d\n", (s[1] < s[2]) ? s[1] : s[2]);      return 0; }  这样是不行的 比如  11111222 结果是一次魔法棒都不用挥  应该输出 0 按照你的做法 会输出 3 [/quote] 对，没错，不过我的同学都觉得挺简单的

引用 1 楼 mymtom 的回复:统计黑牛，白牛的数量就可以了呀  #include <assert.h> #include <stdio.h>  int main() {     int i, n;     int c, s[3] = {0};      assert(1 == scanf("%d", &n));      for (i = 0; i < n; i++) {         assert(1 == scanf("%d", &c));         assert(c == 1 || c == 2);         s[c]++;     }      printf("%d\n", (s[1] < s[2]) ? s[1] : s[2]);      return 0; }  这样是不行的 比如  11111222 结果是一次魔法棒都不用挥  应该输出 0 按照你的做法 会输出 3

全白的最小的结果就是最后一个，m+n为0， 这个结果就表明了无需再改 全黑的最小的结果就是第一个  第一遍计算的是m数组，第二遍计算的n数组 两个对照做加法，然后找到最小值， 结果就是0

没有漏， 全白和全黑对应的m+n的最小值都是0, m+n的意义就是要改变的数量  全白， 第一遍从前向后累计多少黑：得到的数组 0     0     ......  0 第二遍从后向前累计多少白：得到的数组 n-1 n-2  ......   0 最小的结果就是第一个，m+n为0， 这个结果就表明了无需再改  全黑 第一遍得到数组 0 1  2  3 4 .....n-1 第二遍得到数组 0 0 0 .....         0 m+n最小值依然是0

我觉得上面的答案可能还漏掉一种情况，即全白或者全黑，即题目中 【注意，可以将所有的奶牛都变成白色，或者都变成黑色。】，这种情况是否也该考虑？ 如果是全黑或者全白就是0，否则，还需要从 m+n 和 白妞总数 和 黑妞总数 中取最少，即变成全黑或全白，min(m+n, 白妞总数, 黑妞总数)

非要分出黑妞和白妞 ，还挺能挑的  这个题目是要找到一个点， 此点前面的有n个黑妞，后面有m个白妞，让m+n最小 所以要做多次循环 第一次，从前向后，记录每个位置前面的黑妞数量 第二次，从后向前，记录每个位置后面的白妞数量 第三次，前面两个数组求和，并找到最小值 第四次，这点前面都都是白妞，后面的都是黑妞 搞定，麻烦一点儿， 但是谁让你想找最好的妞呢  虽然是四次循环，它还是O（n）的计算量

引用 4 楼 mymtom 的回复:上面的程序，题意理解错误了！  #include <assert.h> #include <stdio.h> #include <stdlib.h>  #define WHITE   1 #define BLACK   2  int main() {     int i, n;     int *c, *w, *b;     int m, mw, mb;      assert(1 == scanf("%d", &n));      c = malloc(n * sizeof(int));     w = malloc(n * sizeof(int));     b = malloc(n * sizeof(int));     for (i = 0; i < n; i++) {         assert(1 == scanf("%d", &c[i]));         assert(c[i] == WHITE || c[i] == BLACK);     }      /* 统计第i个位置之前的黑色奶牛 */     mb = 0;     for (i = 0; i <= n - 1; i++) {         b[i] = mb;         if (c[i] == BLACK) {             mb++;         }     }      /* 统计第i个位置之后的白色奶牛 */     mw = 0;     for (i = n - 1; i >= 0; i--) {         w[i] = mw;         if (c[i] == WHITE) {             mw++;         }     }      /* 最多需要 n - 1 次? n / 2 就够了吧 */     m = n - 1;     for (i = 0; i <= n - 1; i++) {         if (m > w[i] + b[i]) {             m = w[i] + b[i];         }     }      printf("%d\n", m);     free(c);     free(w);     free(b);      return 0; }    太牛了 就是找到队列中的白牛黑牛分界点，后面如果有白牛就是白牛的挥棒次数，前面有黑牛，就是有黑牛的挥棒次数。 两者之和，就是队伍变成现在样子，求队伍每个位置的最小值。


Question: 自学小白求救

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

你这个是printf()函数不用加‘&’符号


Question: 求教

哦 0.9精度不够0.9999就差不多了

加0.9取整输出 这不是很简单吗

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

引用 2 楼 lin5161678的回复:哦 0.9精度不够0.9999就差不多了 我不懂啊啊啊啊啊啊


Question: 想问一下，VS2019如何使用复数类型？

哈哈哈哈试试把c++文件改成c文件

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

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

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

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

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


Question: 这是一个刚开始学C语言课程小白的求助，求大佬拯救一下失足少女吧qwq

引用 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的值始终是最后一个输入的值。 嗯嗯嗯   下次要把眼镜戴上!!!

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

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

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

if和for语句带个大括号不好嘛？


Question: 求大神指点，关于大数相加……

输出哪个部分的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]);     }

引用 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位是可以的。不过细节之处也是值得我学习的。谢谢啦

引用 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--) 谢谢，运行通过了。


Question: 在c语言中用scanf取地址给一个字符变量赋值，为什么可以正确输出但不能正确使用strcmp函数

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

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

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

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

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; }  调试结果

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

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

字符串操作要求 0 结尾 这里没0  错


Question: 请教大佬

引用 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; 嗯嗯，受益匪浅

引用 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);         }     } } //排好序直接打印结果即可 明白了，谢谢大佬

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

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


Question: VS2019结构体排序错误

结构体都是全局变量


Question: 数据结构

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

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

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


Question: 小白想问

最后一句放进去，这代码问题可大了

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

引用 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);万分感谢


Question: 单项链表逆置小问题问题

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

pt根本就没有指向第三个节点，而是指向了NULL pr也是NULL，while就没有执行  不对啊，这个不是刚刚给你回答完的问题吗？ 怎么又贴出来了呢


Question: 一条malloc语句引发的血案

引用 16 楼 lin5161678 的回复:xlist是一个数组越界读写操作是未定义行为 未定义行为没有保证错误 会不会错误 会出现什么样的错误 看具体运行环境 这里这块内存有写入权限 你写数据就没问题 但是写入的数据把堆信息覆盖了 所有依赖堆信息的操作都可能出错 比如这里后面的malloc需要依靠这些堆信息查找内存块 所以malloc执行出错 也可以malloc没出错  但是free的时候获取到的堆信息错误而执行失败 可能性很多 谢谢

引用 10 楼 lin5161678 的回复:Graph 这个变量名和你的结构体名字重复 按照作用域 函数内部的Graph这个标识符表示一个指针  malloc 一个指针大小 后面按照一个结构体进行读写  越界导致破坏堆信息 所以malloc出错  改个名字就完事了能再问一下吗，malloc一个指针大小是不是，就是Graph指向了一个指针大小的堆内存空间，那么下面按个for循环初始化顶点向量xlist[MAX]的时候(这里我不知道xlist是一个指针放在这块堆内存还是整个数组放在这个堆内存内，如果是一个指针，那这块内存就是放了两个int变量加一个指针，所以越界了，如果是整个数组就更大了，肯定越界了），应该就破坏堆内存了，为什么到还能运行到下一个for循环的malloc语句？ 不知道我上面这个理解对了多少。。。

引用 10 楼 lin5161678 的回复:Graph 这个变量名和你的结构体名字重复 按照作用域 函数内部的Graph这个标识符表示一个指针  malloc 一个指针大小 后面按照一个结构体进行读写  越界导致破坏堆信息 所以malloc出错  改个名字就完事了厉害

请输入顶点数和边数9 6 请输入第1条边1 3 0x7ffeefbff550stopbreak请输入第2条边 运行，妹的没有毛病

你的变量名为什么要定义成和类型名一样呢？没有其他名字了吗？

因为前面就直接闪没了，所以我觉得没有看后面代码的必要，之前就没发

大神，再看看，不行的话我重打一编。。。。。 代码全部在这里 #include<stdio.h> #include<stdlib.h> #define MAX 100 struct AdjNode{ 	int tailvex,headvex; 	AdjNode *hlink,*tlink; }; typedef struct VexNode{ 	int vertex; 	AdjNode *firstin,*firstout; }XList[MAX]; struct Graph{ 	int vexnum,arcnum; 	XList xlist; }; typedef Graph* MGraph; MGraph CreateGraph() { 	MGraph Graph=(MGraph)malloc(sizeof(Graph)); 	printf("请输入顶点数和边数"); 	scanf("%d%d",&Graph->vexnum,&Graph->arcnum); 	AdjNode *p=(AdjNode*)malloc(sizeof(AdjNode)); 	int i,j,k,l; 	for(i=1;i<=Graph->vexnum;i++){ 		Graph->xlist[i].vertex=i; 		Graph->xlist[i].firstout=Graph->xlist[i].firstin=NULL; 	} 	for(l=1;l<=Graph->arcnum;l++){ 		printf("请输入第%d条边",l); 		scanf("%d%d",&i,&j); 		AdjNode *q; 		printf("%p",q); 		printf("stop"); 						q=(AdjNode*)malloc(sizeof(AdjNode));						//出问题 		printf("break"); 		*q={i,j,Graph->xlist[j].firstin,Graph->xlist[i].firstout}; 		Graph->xlist[i].firstout=Graph->xlist[j].firstin=q; 	} 	return Graph; } int firstarc(MGraph Graph,int v){ 	return Graph->xlist[v].firstout->tailvex; } int nextarc(MGraph Graph,int v,int w){ 	AdjNode* p; 	for(p=Graph->xlist[v].firstout;p->tailvex!=w;p=p->tlink); 	if(p->tlink) return p->tlink->headvex; 	else return -1;  } int* FindIndegree(MGraph Graph) { 	AdjNode* p=NULL; 	int *indegree=(int*)malloc(sizeof(int)*(Graph->vexnum+1)); 	int i; 	for(i=1;i<=Graph->vexnum;i++){ 		p=Graph->xlist[i].firstin;  		while(p){ 			indegree[i]++; 			p=p->hlink; 		} 	} 	return indegree; } struct Stack{ 	int *base,*top; 	int Size; }; void iniStack(Stack &stack){ 	stack.base=stack.top=(int*)malloc(sizeof(int)*MAX); 	stack.Size=MAX-1; } void push(Stack &stack,int x){ 	*(stack.top++)=x; } void pop(Stack &stack,int i){ 	i=*(--stack.top); } bool EmptyStack(Stack &stack){ 	if(stack.base==stack.top) 		return true; 	else return false; } void TopologicalSort(MGraph Graph) {	 	int* indegree=FindIndegree(Graph); 	int v,w,count=0; 	Stack stack; 	iniStack(stack); 	int i=1; 	for(i=1;i<=Graph->arcnum;i++) 	{ 		if(!indegree[i]) push(stack,indegree[i]); 	} 	while(!EmptyStack(stack)){ 		pop(stack,i); 		printf("%d",i); 		++count; 		for(w=firstarc(Graph,i);w>=0;w=nextarc(Graph,v,w)){ 			if(!(--indegree[w])) push(stack,i); 		} 	}  } int main(){ 	MGraph Graph=CreateGraph(); 	TopologicalSort(Graph); }

看不明白为啥      只好总结为： 脸不好

引用 3 楼 寻开心 的回复:下面的那句 *q = {....}倒是有些怀疑 应该不会吧，那*p之前的打印break语句都没显示出来就结束

光看贴出的代码确实没看出来 AdjNode定义的代码也发出来看看吧

下面的那句 *q = {....}倒是有些怀疑

看不出问题。  AdjNode是怎么定义的，也发出来看看


Question: 二维数组输出格式怎么会错误？请指点一下，谢谢！

看提示啊， 19行

你少写了一个%d


Question: 功能5没反应。其他都正常。。。

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

最后一行复制错了


Question: 不允许指针指向不完整的类类型

引用 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杈树吗，多叉树一般用于什么地方？

creat函数没有返回值

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

scanf_s("%s", &pnew->str, 26); pnew是野指针呢，这样操作可能会导致段错误。  struct student这个类型没看到定义的地方。


Question: towlower和tolower有什么区别？

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


Question: 蓝桥杯13年B组第7题

题目要求是什么，要达到什么样的结果，你好歹描述一下吧。


Question: 单链表的删除

求代码

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

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

要代码自己百度  要学习就自己写， 贴错误代码来提问


Question: 显示信息的时候出问题了，求助！！！代码如下

给了呀，10分，你可能没注意呢

结贴啊？给我点分

谢谢！！！格式改了一下真的成功了诶！！！谢谢！！！

s 是指针的

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

void InputStudent(STUDENT *s) { int i,j;    for (i = 0;i < count;i++,s ++)s是指针，*吧？


Question: 单向链表的逆置问题

引用 7 楼 寻开心 的回复:head本来就是空的头结点，函数结束的时候， head->next要指向原来的尾巴， 然后head依然是整个链表的头结点，无需返回。  进入while之前的那几个指针的初始化，如上一个回复可以看到， 你肯定是弄错了， 那样初始化后while都不能执行，pt已经是NULL了  你的pT，pR，pA分别代表什么意思？ 说明一下 我给你的代码当中， pPrev代表前一个节点，pT当前节点，pNext下一个节点，变量名可以提现出来  进入while循环到时候，你是假定当前状态是什么， 三个指针各自代表什么意思，处于什么状态 一个循环完了，三个指针是否还继续保持有效状态， 这个解决了while里面的代码才是完整的  void ListReverse(LinkNode * pHead ) {     if (pHead ==NULL || pHead->next==NULL ) return; // 如果head是空，或者只有一个有效节点，无需反转     LinkNode * pPrev=NULL, * pNext=NULL;  // 当前要处理的节点的上一个和下一个节点     LinkNode * pT = pHead->next;                  // 当前节点是第一个有效的节点     pHead->next=NULL;                                 // 这句可以没有， 加它只是表明在中间处理状态下，先断掉头     // 至此pT是当前有效节点， pPrev是NULL节点——显然反转后pT是尾巴了，尾巴的下一个节点必须是NULL      while ( pT->next ) {   // 当前节点不是原来的尾巴节点的时候，pT->next就不是NULL         pNext = pT->next;          // 临时保存         pT->next = pPrev;          // 当前节点的下一个节点，要指向原来的上一个节点         pPrev = pT;                    // 反转完成，为下一次循环准备初始变量。 当前节点成为了下一次循环当中的上一个节点         pT = pNext;                   //  下一次循环当中的当前节点就是前面临时保存的节点     }     // 执行到这里的时候， pT是原来链表的尾巴节点了， pRrev仍然是上一个处理完的有效节点     pT->next=pPrev;                 pHead->next = pT;      // 把原来的尾巴节点--反转后的第一个有效节点，挂接到head下 }非常感谢

引用 5 楼 寻开心 的回复: 换下位置，但是整个函数还是等一会自动退出，用输出函数无法输出没反应后自动结束了

引用 3 楼 寻开心 的回复:void ListReverse(LinkNode * pHead ) {     if (pHead ==NULL || pHead->next==NULL ) return;     LinkNode * pPrev=NULL, * pNext=NULL;     LinkNode * pT = pHead->next;     pHead->next=NULL;      while ( pT->next ) {         pNext = pT->next;         pT->next = pPrev;         pPrev = pT;         pT = pNext;     }     pT->next=pPrev;     pHead->next = pT; } 大概是这么个东西吧 逆置函数：pa直接代表了头节点的下一个节点（头节点中data没有值），第二个节点后续作为尾节点，所以设为NULL，pt指向第三个节点，pr指向pt。循环中pt进入第四个节点。然后pr为第三个节点，需要把第二个节点（后续的尾节点）地址传给第三个的next；然后都在进一位，依次类推。最后pt出来为空（疑问：pt的data，next均为空？），都为空的话是不是可以直接让pt作为头节点，所以pt->next=pa；链接起来。哪里错了？

head本来就是空的头结点， 倒置之后，让head的next指向原来的尾巴就好了。 不能再弄一个新的出来

上来就while（pt！=NULL） 问题是你的pt还没有初值呢


Question: 【萌新求解】文件就是读不出来 但是可以成功写入T_T

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

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

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

你要打开几遍啊  一个文件，只留一个fopen

求求大哥萌了 弄两天了 要哭了


Question: C语言在线编程段错误是怎么回事

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

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

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

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

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

贴代码和题目出来


Question: 如何使用imageload和imagesave显示图片

openGL库没有提供加载图片的api， 是要自己处理的

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

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再合并呢


Question: 求解——C语言新手

调用的代码给出来啊

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

调用部分的代码呢 哪个错误的提示就是你调用的时候給到参数形式，和这个定义的形式不一致


Question: 求助大神，实在做不出来了…

引用 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] 是的，谢谢大佬！

引用 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(',')

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

引用 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) 大佬大佬，最后的运算结果输出怎么让他显示:”请输入三个数（用逗号分隔）：”这种形式啊？


Question: C语言一维生命游戏，请看一下错误在哪里

//这是二维的规则，因为上面一维的规则要参照二维 //老师给了我们二维的标答，但是我仿照二维数组写这串一维数组的代码的时候始终无法输出正确结果，看了好几遍也看不出问题 Definitions： Life is really a simulation, not a game with players. It takes place on unbounded rectangular grid in which each cell can either be occupied by an organism or not. Occupied cells are called alived; unoccupied cells are called dead. Which cells are alive changes from generation to generation according to the number of neighboring cells that are alive, as follows transition rules: (1) The neighbors of a given cell are the eight cells that touch it vertically, horizontally, or diagonally. (2) If a cell is alive but either has no neighboring cells alive or only one alive, then in the next generation the cell dies of loneliness. (3) If a cell is alive and has four or more neighboring cells also alive, then in the next generation the cell dies of overcrowding. (4) A living cell with either two or three living neighbors remains alive in the next generation. (5) If a cell is dead, then in the next generation it will become alive if it has exactly three neighboring cells, no more or fewer, that are already alive. All other dead cells remain dead in the next generation. (6) All births and deaths take place at exactly the same time. (7) The size of grid is 20*60  Input: the coordinates of living cells (Terminate the list with the special pair -1 -1).       The number (n) of generation. (n=0 means the initial Grid) Output: the next n generations of the grid.  For example： 【输入】 5 3 5 4 5 5 5 6 -1 -1 //输入结束 3 //输出第3代的结果 【输出】 ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ---**------------------------------------------------------- --*--*------------------------------------------------------ ---**------------------------------------------------------- ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------ ------------------------------------------------------------

One-Dimensional Life takes place on a straight line instead of a rectangular grid. Each cell has four neighboring positions: those at distance one or two from it on each side. The rules are similar to those of two-dimensional Life except (1) a dead cell with either two or three living neighbors will become alive in the next generation, and (2) a living cell dies if it has zero, one, or three living neighbors. (Hence a dead cell with zero, one, or four living neighbors stays dead; a living cell with two or four living neighbors stays alive.) The progress of sample communities is shown in Figure 1.6(Textbook page44）. Design, write, and test a program for one-dimensional Life. The total count of the cells is less than 60.  Input: the position of living cells (1<=postion<=60. Terminate the list with the special number -1).       The number (n) of generation. (n=0 means the initial Grid) Output: the next n generations of the grid.  For example： 【输入】 5 7 -1 1 【输出】 -----*------------------------------------------------------


Question: devc++  用system（“pause”）报错  为什么 求助

就该getchar()吧，加#include<stdio.h>

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

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

#include <stdlib.h> 这个加了吗


Question: 单项链表的添加小问题

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


Question: C语言运算不正确，怎么办？

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

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

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

浮点数精度问题


Question: 为什么我这个删除函数有问题呢？各位大佬能帮小弟看一下嘛

你把代码贴上来，我给你修改加注吧

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

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

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

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

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

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

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


Question: 求助！vc++无法构建程序！

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

主函数的返回值“void”都写错了

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

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

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

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

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

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

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

引用 8 楼 燚认的回复:建议楼主换软件，我用VS，这种问题代码刚输进去都不用编译就有提示 好的，谢谢大佬


Question: 求帮忙

去百度，搜索： windows安装vscode


Question: 顺序表总显示为空

引用 2 楼 xqq&ngc2237 的回复:[quote=引用 1 楼 coo135 的回复:] 你的Empty(SqList *L)，空表返回1，非空返回0。  而你在printout中， if(Empty(L)==0)  则输出空表~，把0改成1吧。  ！改完可以运行了 不过还是不能正确的显示…… [/quote]   main()中的   L=(SqList*)malloc(maxsize);  多余，干啥都不知道，删掉。 for(i=0;i++;i<n)，i++和i<n弄反了吧，改过来。  printout()中的 for(i=0;i<=L->length;i++)，把i<=L->length 改成 i<L->length。 好了，成功。

引用 6 楼 自信男孩 的回复:[quote=引用 4 楼 mymtom 的回复:] 有几处错误： 1. printout  < if(Empty(L)==0){ --- > if(Empty(L)){  < for(i=0;i<=L->length;i++) --- > for(i=0;i<L->length;i++)  2. main <     for(i=0;i++;i<n) <     scanf("%d",&a[i]); --- <     for(i=0; i<n; i++) <     scanf("%d",&a[i]);  另外建议注意格式  #include<stdio.h> #include<stdlib.h> #define maxsize 100  #define debug(fmt, ...) \     printf("[DBUG][%4.4s:%04d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)  typedef int ElemType; typedef int Status; typedef struct {     ElemType data[maxsize];     int length; } SqList;  void CreateList(SqList * L, ElemType a[], int n) {               //dingyi      if (n > maxsize || n < 1) {         printf("输入不合法\n");         return;     }     for (int i = 0; i < n; i++)         L->data[i] = a[i];     L->length = n;     debug("L->length=%d", L->length); }  int Empty(SqList * L) {     if (L->length == 0)         return 1;     else         return 0; }  void printout(SqList * L) {     int i;     debug("L->length=%d", L->length);     if (Empty(L)) {         printf("空表");         return;     }     for (i = 0; i < L->length; i++)         printf("%d ", L->data[i]); }  int main() {     int i, n;     ElemType a[maxsize];     SqList *L, c;     L = &c;     L = (SqList *) malloc(sizeof(SqList));     printf("链表长度和各数据:\n");     scanf("%d", &n);     debug("n=%d", n);     for (i = 0; i < n; i++) {         scanf("%d", &a[i]);         debug("a[%d]=%d", i, a[i]);     }     CreateList(L, a, n);      printout(L); }   SqList *L, c;     L = &c;     L = (SqList *) malloc(sizeof(SqList));  没感觉这儿怪怪的吗？[/quote] 是有问题，下面一行不需要的

引用 4 楼 mymtom 的回复:有几处错误： 1. printout  < if(Empty(L)==0){ --- > if(Empty(L)){  < for(i=0;i<=L->length;i++) --- > for(i=0;i<L->length;i++)  2. main <     for(i=0;i++;i<n) <     scanf("%d",&a[i]); --- <     for(i=0; i<n; i++) <     scanf("%d",&a[i]);  另外建议注意格式  #include<stdio.h> #include<stdlib.h> #define maxsize 100  #define debug(fmt, ...) \     printf("[DBUG][%4.4s:%04d] " fmt "\n", __FILE__, __LINE__, ##__VA_ARGS__)  typedef int ElemType; typedef int Status; typedef struct {     ElemType data[maxsize];     int length; } SqList;  void CreateList(SqList * L, ElemType a[], int n) {               //dingyi      if (n > maxsize || n < 1) {         printf("输入不合法\n");         return;     }     for (int i = 0; i < n; i++)         L->data[i] = a[i];     L->length = n;     debug("L->length=%d", L->length); }  int Empty(SqList * L) {     if (L->length == 0)         return 1;     else         return 0; }  void printout(SqList * L) {     int i;     debug("L->length=%d", L->length);     if (Empty(L)) {         printf("空表");         return;     }     for (i = 0; i < L->length; i++)         printf("%d ", L->data[i]); }  int main() {     int i, n;     ElemType a[maxsize];     SqList *L, c;     L = &c;     L = (SqList *) malloc(sizeof(SqList));     printf("链表长度和各数据:\n");     scanf("%d", &n);     debug("n=%d", n);     for (i = 0; i < n; i++) {         scanf("%d", &a[i]);         debug("a[%d]=%d", i, a[i]);     }     CreateList(L, a, n);      printout(L); }   SqList *L, c;     L = &c;     L = (SqList *) malloc(sizeof(SqList));  没感觉这儿怪怪的吗？

#include<stdio.h> #include<stdlib.h>  #define maxsize 100  typedef int ElemType; typedef int Status;  typedef struct{ 	ElemType data[maxsize]; 	int length; } SqList;  void CreateList(SqList *L,ElemType a[],int n)  {   //dingyi  	if(n > maxsize || n < 1) {  		printf("输入不合法\n");  		return; 	} 	for(int i=0;i<n;i++) 		L->data[i]=a[i]; 	L->length=n; }  int Empty(SqList *L) { 	if(L->length==0)  		return 1; 	else  		return 0; } void printout(SqList *L) { 	int i; 	//if(Empty(L)==0){ 	if (Empty(L)) { 		printf("空表"); 		return; 	} 	//for(i=0;i<=L->length;i++) 	for(i=0;i<L->length;i++) 		printf("%d ", L->data[i]); 	putchar(10); }  int main() {     int i,b,n; 	ElemType a[maxsize]; 	SqList *L;//,c;  	//L = &c; 	//L=(SqList*)malloc(maxsize); 	L=(SqList*)malloc(sizeof(SqList)); 	if (!L) 		return -1;  	printf("链表长度和各数据："); 	scanf("%d",&n); 	//for(i=0;i++;i<n) 	for(i=0;i<n; i++) 		scanf("%d",&a[i]); 	CreateList(L,a,n);  	printout(L); }   供参考～  建议对比代码找出不足；  SqList *L;//,c;  	//L = &c; 	//L=(SqList*)malloc(maxsize); 	L=(SqList*)malloc(sizeof(SqList)); 	if (!L) 		return -1; 两种赋值L的方法都可以，选择其中一种即可。

引用 1 楼 coo135 的回复:你的Empty(SqList *L)，空表返回1，非空返回0。  而你在printout中， if(Empty(L)==0)  则输出空表~，把0改成1吧。  ！改完可以运行了 不过还是不能正确的显示……


Question: 关于结构体作为函数的参数的初始化

backgrand->data =  (unsigned char*)malloc(sizeof(char)); 这句是不是有问题啊？

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

你这个free两个语句的顺序反了 先free data，后free backgrand才可以  编译器报告不了NULL指针， 运行后才知道


Question: 创建队列遇到的问题

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

楼主，你看看你的第二个函数，i<=n，Q->rear++,那么Q->rear = 7 , 然后在输出函数里退出条件Q->rear+1所以多了一个，不应该+1


Question: 哪位大神帮忙解决一下。

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


Question: 哪里错了啊

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

哎~~跟着这个解题思路写就是了啊~~错哪里了自己对~  #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; }

把图片都倒着发，就是最大的错误 你打算让帮助你的人倒着看？


Question: 数据结构删除为x的结点

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

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

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


Question: 为什么第一个是对的，第二个是错的，if语句，关系运算符。

我去，我写了10+年还没有看到有人这么写得

哇哈哈  慕课的随堂测试

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

n无论等于几，都是永真吧。 if((1<=n)<=10)，一般不建议这么写


Question: 这个完整的程序怎么写

自己写， 错了后贴自己的代码来提问


Question: 一道很有意思的题

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

引用 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]);  好的，大佬们的方法都好简单，谢谢了

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


Question: 努力学习C，想请教各位老师个问题

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


Question: 请问这两个程序有什么区别呢

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

明白了 ，感谢

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

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

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

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

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

很简单，你这个改了不应该你改的内存。两个都是。


Question: 数组作为函数参数问题!!!

引用 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函数外面还写一个的 没想明白为什么可以一个就写完的还要在外面加一个

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

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

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

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

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

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

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

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

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

小写的n没有初始化


Question: 决胜21点（纸牌游戏），第一组组数据没问题，第二组读取数据的时候就有问题了，大神教教我这个新手吧！

sscanf()功能果然加强大

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

引用 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这一用法的错误呀~

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

两个getchar都可去掉

解决了，把 scanf("%d%d",&w,&s);换成  scanf("%d %d ",&w,&s);


Question: 求帮

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

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

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

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

字符1等于于字符2，函数值0 1>2 函数值正整数 1<2 函数值负整数

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


Question: 国密标准GM/T 0020-2012中证书信任列表指的是什么？有什么用途？

参考TLS,证书这东西，必须有个可信的第三方来检验证书的可靠性，这个应该是想建立一个这样的机构吧


Question: 如何VS2019中 用C语言CreatProcess()创建子进程

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

答非所问


Question: 求大佬们指点迷津，小的跪谢


Question: c语言数组的高级定义问题

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

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


Question: 以下关于指针的描述对吗？

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

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


Question: void Pos(int x,int y){

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

求详细解释一下这一段

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


Question: 老师布置的题目好难。

取余

不难好吧，而且我觉得难度还偏低了。 清华大学大一的作业才叫难，我看了题目以后感觉我全职一年都做不完。

读字符，这样就很好解决了

#include <stdio.h> int main() { 	int a[5],num,k,i=0; 	printf("请输入一个不多于五位的正整数:"); 	scanf("%d",&num); 	if(num<=0) 		printf("请输入一个正整数"); 	while(num>0) { 		k=num%10; 		a[i]=k; 		++i; 		num=num/10; 	} 	if(i>=6) 		printf("请输入一个不多于五位的正整数!"); 	else { 		printf("这是一个%d位数;\n",i); 		printf("逆序打印为:"); 		for(int j=0; j<=(i-1); j++) { 			printf(" %d",a[j]); 		} 	} 	return 0; }

百度都有的， 直接百度吧

引用 楼主 m0_46505358的回复:从键盘读入一个不多于5位的正整数，求它是几位数，逆序打印出各位数字。 大佬能用c语言帮我编程一下吗？


Question: C语言

int stat[26] = {0}; while ( .... ) {    ch = ......;    if ( ch >='a' && ch <='z' )        stat[ch-'a']++; }  for ( int i=0;i<26; i++ )    printf("%c:%d ", i+'a', stat[i]);

我用数组每个对应英文字母，然后输入一串英文字符，如果有重复那就数组对应某个加一，我现在解决不了的是这些26个数组如何统计出一个具体的数而不是cmd中输出26个数字字符

至少你需要一个数组，来储存字母的个数；然后需要遍历文件或字符串；


Question: 向大神求助，方法不限，只看思路和结果

代码还是比较简单的，思路就是dfs，就是一个排列组合 #include<bits/stdc++.h> using namespace std; int n,r; bool vis[30]; int a[30]; void pr(){ 	for(int i=1;i<=r;i++){ 		cout<<a[i]; 		if(i==4){ 			cout<<"-"; 		} 	} 	cout<<"=2016"<<endl; } void dfs(int x,int num){ 	if(num>r){ 		if(a[1]*1000+a[2]*100+a[3]*10+a[4]-a[5]*1000-a[6]*100-a[7]*10-a[8]==2016){ 			pr(); 		}  	} 	else{ 		for(int i=1;i<=n;i++){ 			if(!vis[i]){ 				vis[i]=1; 				a[x]=i; 				dfs(x+1,num+1); 				vis[i]=0; 			} 		} 	} } int main(){ 	scanf("%d%d",&n,&r); 	dfs(1,1); 	return 0; } 输入 9 8 结果为 9 8 4613-2597=2016 5714-3698=2016 5812-3796=2016 7314-5298=2016 7412-5396=2016 8513-6497=2016

直接dfs就行……

这不是刚有人问过吗？思路就像LS说的 lz参考以下帖子吧 https://bbs.csdn.net/topics/396055683

最简单的就是因为都是4位数，所以ABCD最小都是3016，EFHH最小是1000，直接循环遍历出来满足条件的就行了。


Question: C语言关于链表插入的问题

首先teatdown不对 while (head != NULL) {     node_t *p = head->next;     free(head); //free后head->next就不存在了     head = p; //所以用p临时变量 } add方法实现 void add(node_t **head, char *str, int length) {     node_t *nodeadd = (node_t *)malloc(sizeof(node_t));     strcpy(nodeadd->str, str);     nodeadd->length = length;     nodeadd->next = *head;     *head = nodeadd; }


Question: C语言用二分法求方程根。fabs(fx0)<= 1e-5和fabs(fx0)>= 1e-5有什么区别，都是认为fx0接近0所以认为是0吗？

哦哦，我知道了，如果是fabs(fx0)>=1e-5，fx0的绝对值没有>=1e-5之前要一直循环，输入-10,10，只执行2次；而如果是fabs(fx0)<=1e-5，fx0的绝对值没有<=1e-5之前要一直循环，但输入-10,10，一开始就不满足，只执行1次，所以前者x0=2，后者x0=0，前者是对的。

while(fabs(fx0)<=1e-5); 是执行条件 当>=时一直执行，所以结果是对的,要结果无限接近0，没接近之前要一直循环，<=这个值一开始就返回false 就没有一直循环，只计算一次，怎么会对呢

第一张图代码:  #include<stdio.h> #include<math.h>  int main() { 	double x0,x1,x2,fx0,fx1,fx2; 	 	do 	{ 		printf("输入x1,x2的值:"); 		scanf("%lf,%lf",&x1,&x2); 		fx1=2*x1*x1*x1-4*x1*x1+3*x1-6; 		fx2=2*x2*x2*x2-4*x2*x2+3*x2-6; 	}while(fx1*fx2>0); 	 	do 	{ 		x0=(x1+x2)/2; 		fx0=2*x0*x0*x0-4*x0*x0+3*x0-6; 		if(fx0*fx1<0) 		{ 			x2=x0; 			fx2=fx0; 		} 		else 		{ 			x1=x0; 			fx1=fx0; 		} 	}while(fabs(fx0)>=1e-5); 	 	printf("x=%5.2f\n",x0); 	 	return 0; }   第二张图代码:  #include<stdio.h> #include<math.h>  int main() { 	double x0,x1,x2,fx0,fx1,fx2; 	 	do 	{ 		printf("输入x1,x2的值:"); 		scanf("%lf,%lf",&x1,&x2); 		fx1=2*x1*x1*x1-4*x1*x1+3*x1-6; 		fx2=2*x2*x2*x2-4*x2*x2+3*x2-6; 	}while(fx1*fx2>0); 	 	do 	{ 		x0=(x1+x2)/2; 		fx0=2*x0*x0*x0-4*x0*x0+3*x0-6; 		if(fx0*fx1<0) 		{ 			x2=x0; 			fx2=fx0; 		} 		else 		{ 			x1=x0; 			fx1=fx0; 		} 	}while(fabs(fx0)<=1e-5); 	 	printf("x=%5.2f\n",x0); 	 	return 0; }


Question: 算法分析求助

t=0 print("满足条件的5位数") for i in range(10000,90001,10000):     for j in range(0,901,100):         num=9095+i+j         if(num%57==0 and num%67==0):             t=t+1             print(num) print(t)

int main(){cout<<"sb";return 0;}

#include "stdio.h"  int main() { int cout=0; int i; for(i=10000;i<99999;i++) if(i%57==0&&i%67==0) { cout++; printf("%d\n",i); } printf("cout is %d",cout); return 0; }

改了一下count 瞬间第九行报错了。。。

引用 5 楼 user-3的回复:int main() { int cout=0; int i; for(i=10000;i<99999;i++) if(i%57==0&&i%67==0) { cout++; printf("%d\n",i); } printf("cout is %d",cout); return 0; } 十一行这一块有问题啊 我真的个小白 还有劳帮助

十一行printf未声明

引用 3 楼 user-3的回复:[quote=引用 2 楼 Eminem. 的回复:] [quote=引用 1 楼 user-3的回复:]int cout=0; for(int i=10000;i<99999;i++) if(i%57==0&&i%67==0) { cout++; printf("%d\n",i); } printf("cout is %d",cout); 真的太感谢了 解决了燃眉之急啊[/quote] for(int i=10000;i<=99999;i++) if(i%57==0&&i%67==0) { cout++; printf("%d\n",i); } printf("cout is %d",cout);[/quote] 少打了个=号,解决了就结贴[/quote] 但是还是无法运行 报错 就是第二行

引用 2 楼 Eminem. 的回复:[quote=引用 1 楼 user-3的回复:]int cout=0; for(int i=10000;i<99999;i++) if(i%57==0&&i%67==0) { cout++; printf("%d\n",i); } printf("cout is %d",cout); 真的太感谢了 解决了燃眉之急啊[/quote] for(int i=10000;i<=99999;i++) if(i%57==0&&i%67==0) { cout++; printf("%d\n",i); } printf("cout is %d",cout);[/quote] 少打了个=号,解决了就结贴

引用 1 楼 user-3的回复:int cout=0; for(int i=10000;i<99999;i++) if(i%57==0&&i%67==0) { cout++; printf("%d\n",i); } printf("cout is %d",cout); 真的太感谢了 解决了燃眉之急啊


Question: 数据结构，结果不对，大佬帮忙解决一下

#include <stdio.h>  #define OK 1 #define ERROR 0  typedef int Status; //三元组的类型先定义为float,可以随时变换成别的类型 typedef float ElemType;  typedef struct {     ElemType e[3]; }Triplet;  Status initTriplet(Triplet &T,ElemType V0,ElemType V1,ElemType V2) {     T.e[0]=V0;     T.e[1]=V1;     T.e[2]=V2;     return OK; }  Status destroyTriplet(Triplet &T) {     return OK; }  Status getElem(Triplet T,int i,ElemType &e) {     if(i<1||i>3)         return ERROR;     else         e=T.e[i-1];     //return e;     return OK;    //这里应该是是返回OK吧 }  Status putElem(Triplet &T,int i,ElemType e)// {     if(i<1||i>3)         return ERROR;     else         T.e[i-1]=e;     //return e;     return OK; }  Status isAscending(Triplet T) {     return (T.e[0]<=T.e[1])&&(T.e[1]<=T.e[2]); }  Status isDescending(Triplet T) {     return (T.e[0]>=T.e[1])&&(T.e[1]>=T.e[2]); }  ElemType getMax(Triplet T,ElemType &e) {     if(T.e[0]>T.e[1])         e =T.e[0];     else         e = T.e[1];     if(T.e[2]>e)         e = T.e[2];      return e; }  ElemType getMin(Triplet T,ElemType &e) {     if(T.e[0]<T.e[1])         e = T.e[0];     else         e=T.e[1];      if(T.e[2]<e)         e = T.e[2];     return e; }  int main() {     Triplet T;     Status flag;     ElemType v0,v1,v2,e;     printf("请进入三元组的三个值v0,v1,v2:\n");     scanf("%f,%f,%f",&v0,&v1,&v2);     flag = initTriplet(T,v0,v1,v2);     printf("调用初始化函数后,flag=%d,T的三个值为%4.2f,%4.2f,%4.2f\n",flag,T.e[0],T.e[1],T.e[2]);     if(isAscending(T))         printf("该三元组元素为升序\n");     if(isDescending(T))         printf("该三元组元素为降序\n");     printf("该三元组元素中的最大值为:%4.2f,最小值为:%4.2f\n",getMax(T,e),getMin(T,e));     return OK; }     供参考～  注意输入时需要用逗号隔开。

谢谢，忘记输逗号了


Question: C语言编程作业题求教各位大佬！！拜托了！

引用 2 楼 m0_46509725 的回复:[quote=引用 1 楼 三号室的回复:]这个是参考程序，通过我的注释即可理解该程序  #include<stdio.h> //通过if计算的函数 double byIf(double tmp){     double ans = 0;     if(tmp>=5000){         ans += (tmp-5000)*0.15;         tmp = 5000;     }     if(tmp>=4000){         ans += (tmp-4000)*0.1;         tmp=4000;     }     if(tmp>=2000){         ans += (tmp-2000)*0.05;         tmp = 2000;     }     return ans; } //通过switch计算的函数 double bySwitch(double tmp){     double ans = 0;     switch(int(tmp/1000)){     default:     case 9:     case 8:     case 7:     case 6:     case 5:         ans += (tmp-5000)*0.15;         tmp = 5000;     case 4:         ans += (tmp-4000)*0.1;         tmp=4000;     case 3:     case 2:         ans += (tmp-2000)*0.05;         tmp = 2000;     case 1:     case 0:break;     }     return ans; }  int main(){     double tmp;     printf("请输入工资：\n");     scanf("%lf",&tmp);     printf("税收为：\n");     printf("%.5lf (if计算)\n",byIf(tmp));     printf("%.5lf (switch计算)\n",bySwitch(tmp));     return 0; }   谢谢！我去编译调试一下看看！[/quote] 记得结贴嗷

引用 1 楼 三号室的回复:这个是参考程序，通过我的注释即可理解该程序  #include<stdio.h> //通过if计算的函数 double byIf(double tmp){     double ans = 0;     if(tmp>=5000){         ans += (tmp-5000)*0.15;         tmp = 5000;     }     if(tmp>=4000){         ans += (tmp-4000)*0.1;         tmp=4000;     }     if(tmp>=2000){         ans += (tmp-2000)*0.05;         tmp = 2000;     }     return ans; } //通过switch计算的函数 double bySwitch(double tmp){     double ans = 0;     switch(int(tmp/1000)){     default:     case 9:     case 8:     case 7:     case 6:     case 5:         ans += (tmp-5000)*0.15;         tmp = 5000;     case 4:         ans += (tmp-4000)*0.1;         tmp=4000;     case 3:     case 2:         ans += (tmp-2000)*0.05;         tmp = 2000;     case 1:     case 0:break;     }     return ans; }  int main(){     double tmp;     printf("请输入工资：\n");     scanf("%lf",&tmp);     printf("税收为：\n");     printf("%.5lf (if计算)\n",byIf(tmp));     printf("%.5lf (switch计算)\n",bySwitch(tmp));     return 0; }   谢谢！我去编译调试一下看看！


Question: 大佬求解

先自己写写吧，有问题再提出来~

蟹蟹！

以下是参考程序，希望能得到你的认可  typedef struct LNode{     ElemType data;     struct LNode *next; }LNode,*LinkList;  typedef void Status;  Status GetElem_L(LinkList L,int i,ElemType *e){     if(L==NULL){         *e=NULL;         return;     }     while(i!=0&&L!=NULL){         L = L->next;         --i;     }     *e = L; }


Question: 我想问一下我生成的随机数为何写不进文本？在线求！谢谢各位大佬了

引用 3 楼 自信男孩 的回复：#include <stdio.h> //#include <cstdlib> #include <stdlib.h> #include <time.h>  int main() {     int n, a, d[100];     FILE *fp;     fp=fopen("random number.txt","w+");     if(fp==NULL) //判断如果文件指针为空     {         printf("File cannot open! " );         exit(0);     }      srand(time(NULL));     for ( n = 0; n <100; n++)     {         d[n]=1+rand()%100;         //printf("random number between 1 ~ 100: %d\n", 1 + rand()%100 );         fprintf(fp, "random number between 1 ~ 100: %d\n", 1 + rand()%100 );     }     fclose(fp);     //int i=1;     //while(i=1) {     while(1) {         printf("请输入要查询的数(输入-1退出)：\n");         scanf("%d",&a);         for(n=0;n<100;n++) {             if(d[n]==a) {                 printf("随机数中有此数据\n");                 break;             }         }         if (n >= 100) {             printf("随机数中无此数据\n");             break;         }     }     return 0;  }  供参考～感谢🙏

引用 1 楼 user-2 的回复：从头到尾没看见写文件操作 fprintf是写入到文件大佬能帮我改一下么……我对文件这边还是不懂，我想将随机数存到文件中，在文件中查找

从头到尾没看见写文件操作 fprintf是写入到文件


Question: c语言 动态链表

是为了给s->next赋值。看代码是尾插法，即把新节点都从尾部插入，新节点的next用p->next赋值。  其实，这条语句可以去掉，因为在循环外有p->next = NULL;这样保证单链表的末尾是NULL。

引用 1 楼 user-2的回复:假设p->next--->h1 指向h1 那么 s->next = p.next 后， s->next-->h1 s的next也指向h1，这点没问题吧  然后p->next = s; 就变成了 p->next-->s p的next指向s，所以整个结果变成 p->next-->s->next-->h1 如果没有 s->next = p.next，那么h1是不是就找不到了，因为p->next = s是的p的next抛弃了h1，指向了s，那么h1节点都没有任何节点只想它了，h1节点岂不是丢失了吗？所以要把h1先保留起来，那么怎么保留？就直接保留在s的next里，所以就是s->next = p.next  其实用个临时变量，估计LZ就理解了 Node *h1 = p->next; //把p的next指向的节点h1保存 p->next = s; //然后p的next指向s s->next = h1; //然后s的next再指向h1 这样是不是也达到了 p->next-->s->next-->h1  所以s->next = p.next 只是省略了 Node *h1 = p->next 用临时变量而已 就是说整个链表就是靠p->next 这个地址连接起来的对吧 p始终是最后一个节点 p把p->next暂时放到新连接过来的s的next里面 然后自己往后移动一个单位 指向s 然后又把p->next找回来了 就是这样循环的对吧


Question: 编程题

这两道题应该自己做，这个其实能提高逻辑运算能力。 否则以后检查逻辑错误，更蒙蔽。  &&因为逻辑运算符的优先级低于关系运算符。 所以先求a+b>c和b==c的值。 同时因为数学运算符又大于关系运算符，所以先算a+b然后再和c比较。  同时，因为&&和||的运算特点，c为了提高效率，所以有了沙发提到的短路逻辑式求值方法。

题目不是说了吗  scanf输入

引用 2 楼 ?Victor.??的回复:板凳板凳  #include<stdio.h> #define pi 3.14 int main() { 	float c,s,v; 	float r,h; 	scanf("%f %f",&r,&h); 	c=2*pi*r; 	s=pi*r*r; 	v=s*h; 	printf("周长 %.2f\n面积 %.2f\n体积 %.2f\n",c,s,v); 	return 0; } 在哪里给r和h赋值啊

沙发沙发  （1）真&&假  0  （2）真（后面短路）1    (3)   假（后面短路）0,0


Question: 小白求救，请问各位大佬这个哪错了

polygen的第二个参数用加上括号即，(const POINT *)

刚学c语言不久，我还以为直接发那个他显示出错的地方就可以了！

引用 4 楼 初学小菜的回复:你要是方便把代码贴出来吧……迷之报错 #include"acllib.h"  int Setup() { 	initWindow("test",DEFAULT,DEFAULT,500,500); 	beginPaint(); 	setPenColor(WHITE); 	setBrushColor(WHITE); 	rectangle(0,0,500,500); 	endPaint(); 	 	beginPaint(); 	setPenColor(BLUE); 	setBrushColor(BLUE); 	acr(150,150,350,300); 	line(200,300,300,300); 	endPaint(); 	 	beginPaint(); 	setPenColor(RED); 	setBrushColor(RED); 	POINT p1[]={ 	{250,220}, 	{245,245}, 	{220,250}, 	{245,255}, 	{250,280}, 	{255,255}, 	{280,250}, 	{255,245}, 	{250,220}, 	}; 	Polygon(p1,9); 	endPaint(); 	 	beginPaint(); 	setPenColor(BLACK); 	setBrushColor(BLACK); 	rectangle(240,300,260,400); 	endPaint(); 	 	beginPaint(); 	setTextColor(GREEN); 	setTextsize(20); 	paintText(230,5,"曾小佳")；  	endPaint(); 	 	  	return 0;  }

你要是方便把代码贴出来吧……迷之报错

引用 1 楼 初学小菜的回复:你把错误倒是发出来呀……errors 发成这样看得清吗？看不清我就重新发帖吧，谢谢你的回复啊！

引用 1 楼 初学小菜的回复:你把错误倒是发出来呀……errors C:\Users\Admin\Desktop\ack\main.c	In function 'Setup': 33	2	C:\Users\Admin\Desktop\ack\main.c	[Warning] passing argument 1 of 'Polygon' from incompatible pointer type [enabled by default] 71	0	e:\bianyiqi\dev-cpp\mingw64\x86_64-w64-mingw32\include\windows.h	In file included from e:\bianyiqi\dev-cpp\mingw64\x86_64-w64-mingw32\include\windows.h 50		C:\Users\Admin\Desktop\ack\acllib.h	                 from acllib.h 1		C:\Users\Admin\Desktop\ack\main.c	                 from main.c 3353	28	e:\bianyiqi\dev-cpp\mingw64\x86_64-w64-mingw32\include\wingdi.h	[Note] expected 'HDC' but argument is of type 'struct POINT *' 33	2	C:\Users\Admin\Desktop\ack\main.c	[Warning] passing argument 2 of 'Polygon' makes pointer from integer without a cast [enabled by default] 71	0	e:\bianyiqi\dev-cpp\mingw64\x86_64-w64-mingw32\include\windows.h	In file included from e:\bianyiqi\dev-cpp\mingw64\x86_64-w64-mingw32\include\windows.h 50		C:\Users\Admin\Desktop\ack\acllib.h	                 from acllib.h 1		C:\Users

你把错误倒是发出来呀……errors


Question: 为什么用atof转换长的字符串会出错？

应该还是溢出了。

浮点数有效数字float只有6~7位， double只有15~16位 这个溢出不是表达范围的溢出，是有效数字的溢出  1/3 0.333333333无限下去， 数字计算机只能有有限的二进制的单位来表示，必然是无法精确的表达的，只能是近似

double：2^52 = 4503599627370496，一共16位，同理，double的精度为15~16位。

用sscanf也是同样的效果


Question: 新人刚刚学习C语言，求前辈帮忙解决一下这个问题

谢谢各位老哥指出错误，学习了。

注意编译失败的提示，跟着提示找语法错误很快的

有三处错误 1.printf("My favorite number is %d because it is first.\n ,num ")      这句话里面后面没有加； 2.return 0;之间应该有空格 3.printf("My favorite number is %d because it is first.\n ,num ")；   如果你想输出num，应该这么写： printf("My favorite number is %d because it is first.\n ",num );

printf("My favorite number is %d because it is first.\n ,num ") 后面加上分号


Question: C#如何识别当前登录学生的成绩并录入到成绩表中？现在没有名字只有成绩

你帖子发错地方了，这里是C/C++的


Question: C语言小白求助！

引用 2 楼 weixin_45906870 的回复:引用 1 楼 user-1 的回复：你查一下 getchar这个函数就知道了，它返回的就是 int但是我用char也是对的，这是为什么呢？ 这是 linux manual 中对 getchar() 函数返回值的描述：fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.  当函数正确从输入流中读取到字符时，会把读取到这这一个字节转成 int 类型返回，当出错时或读取到文件结尾时返回 EOF。EOF 时 stdio 头文件里的一个宏，通常值是 -1。如果用 char 类型接收，高位的部分会被截断，然后再和 EOF 进行比较是又强转成了 int，这时候是有可能发生错误的，不过现在的编译器基本上都不会出错，但是保险起见，还是用 int 来接比较好

你查一下 getchar这个函数就知道了，它返回的就是 int


Question: 线性表元素插入

引用 1 楼 user-1的回复:代码不全看出来 你的5被插入了2的位置，怀疑length不对，而且 你好 没有被打印，说明找不到e 要看你其他的处理是不是有问题 懂了  谢谢你了

晕，你确定没问题？ main方法 for(i=0;i<=m-1;i++) scanf("%d",&L.elem[i]); //这里虽然输入了数据，但是L的length没有改变  所以insertlist的时候，因为L的length还是0，所以按照你的逻辑就只能插在位置1了，也就是5插在了2的位置  修改 main方法 for(i=0;i<=m-1;i++) scanf("%d",&L.elem[i]);  改成 for(i=0;i<=m-1;i++) {scanf("%d",&L.elem[i]);  L.length++;} //注意加入元素，length也要增加  还有，最好length也要判断有没有达到LIST_INIT_SIZE，如果达到了会数组越界

引用 1 楼 user-1的回复:代码不全看出来 你的5被插入了2的位置，怀疑length不对，而且 你好 没有被打印，说明找不到e 要看你其他的处理是不是有问题 可是我感觉没什么问题啊

引用 1 楼 user-1的回复:代码不全看出来 你的5被插入了2的位置，怀疑length不对，而且 你好 没有被打印，说明找不到e 要看你其他的处理是不是有问题 #include<stdio.h> #include<stdlib.h> #define LIST_INIT_SIZE 100 //下面声明线性表------------------------ typedef struct{ 	int *elem; 	int length; 	int listsize; }SqList;  //下面初始化线性表-------------------------- int initlist(SqList *L) { 	L->elem=(int*)malloc(LIST_INIT_SIZE*sizeof(int)); 	if(!L->elem) {printf("分配失败");return 1;} 	L->length=0;L->listsize=LIST_INIT_SIZE;printf("初始化成功\n");return 0; }  //下面插入元素-------------------------------- int insertlist(SqList *L,int e){int i,j; /*找到插入位置i*/ /*中间插入*/ for(i=0;i<=L->length-1;i++) if(e>=L->elem[i]&&e<=L->elem[i+1])	{printf("你好！");break;} /*将第i个元素向后移 插入元素*/ for(j=L->length-1;j>=i+1;j--) L->elem[j+1]=L->elem[j];L->elem[i+1]=e;++L->length; printf("插入成功\n");return 0; }   //下面进行输出--------------------------- int printlist(SqList L,int m){int i; for(i=0;i<=m-1;i++) if(i==m-1)  printf("%d",L.elem[i]); else printf("%d ",L.elem[i]);  }  /*--------------------------下面是主函数-------------------------------------------*/ int main() { 	SqList L;int i,n,m; 	printf("请输入元素个数和插入元素:"); 	scanf("%d%d",&m,&n); 	initlist(&L); 	for(i=0;i<=m-1;i++) scanf("%d",&L.elem[i]); 	insertlist(&L,n);printlist(L,m); 	return 0; }


Question: 为什么＊q＝＊p那句报错

这里就是因为出现了野指针，就是没有明确指针指向了哪块地址内存

p是指针，指向i的地址。q也是个指针，指向哪里没设定，所以不能设定*q。 注意指针使用时 指针变量=内存地址 如p=&i *指针变量=数据的值 如*p=6 这两者的区别。 先有第一步指针变量=内存地址 ，才能使用第二步的*指针变量=数据的值，第一步就做指针初始化，没有第一步就是野指针或者空指针，也就是没有指向正确的内存地址，所以不能保存数据。


Question: 小白求教，为什么我写的这个求每个科目平均数的程序编译之后无法运行？

不用用什么define，还没到这个阶段，先用const，把程序绝对简化，自己看就懂了

all class  gaicheng  class1  chinese input doesn't come out.

发个报错信息看看

引用 10 楼 ?Victor.?? 的回复:感觉好像是求每科的  #include<stdio.h> int number; int class1; #define MAX_NUM 30 #define MAX_CLASS 6  #define MAX_LEN 10 typedef struct student{ 	long ID; 	char name[MAX_LEN]; 	float result[MAX_NUM][MAX_CLASS]; }STU; void sumaver1(float result[MAX_NUM][MAX_CLASS]);  int main() { 	STU stu; 	int i,j; 	printf("Input student number(n<30):\n"); 	scanf("%d",&number); 	printf("Input course number(m<=6):\n"); 	scanf("%d",&class1); 	printf("Input student's ID,name and result:\n"); 	for(i=0;i<number;i++){ 		scanf("%ld %s",&stu.ID,&stu.name); 		for(j=0;j<class1;j++) 			scanf("%f",&stu.result[i][j]);     }     sumaver1(stu.result); 	return 0; }  void sumaver1(float result[MAX_NUM][MAX_CLASS]){ 	int i; 	int j; 	float sum[MAX_CLASS]={0}; 	double average[MAX_CLASS]={0.0}; 	for(i=0;i<class1;i++){ 		for(j=0;j<number;j++){ 			sum[i]+=result[j][i]; 		} 		average[i]=sum[i]/number; 	}	 	for(i=0;i<class1;i++){ 		printf("course %d:sum=%.0f,aver=%.0f\n",i+1,sum[i],average[i]); 	} }  供参考 刚刚试了下，确实这样是对的，找到自己的问题了，谢谢大佬！

引用 9 楼 ?Victor.?? 的回复:你要求每科平均分  还是  每个学生平均分  呀  ？ 每科的平均分，大佬帮我看看吧！

你要求每科平均分  还是  每个学生平均分  呀  ？

引用 2 楼 不知道用什么名字。 的回复:发个报错信息看看 发了大佬

大佬们输入完数据之后就卡着不动了，数字也输入不进去，也不输出结果，是不是因为我的程序写错了？

引用 4 楼 ?Victor.?? 的回复:中文输入法终于出来了  刚才一直不出来  class是c++关键字  把所有class改成class1或者别的什么   大佬可是改完之后还是不行，就是运行之后把数据输入进去，却无法输出任何结果

有人嘛，求个大佬帮我看看


Question: 好心人救救俺吧(ง ˙o˙)ว

引用 8 楼 ?Victor.??的回复:#include<stdio.h> int main() { 	int a[10][10]; 	int i,j,k; 	for(i=0;i<10;i++) 	{ 		for(j=0;j<10;j++) 		{ 			k=i*j; 			a[i][j]=k; 		} 	} 	for(i=0;i<10;i++) 	{ 		for(j=0;j<10;j++) 		{ 			if(a[i][j]!=0&&i>=j) 			printf("%d*%d=%d",j,i,a[i][j]); 			printf(" "); 		} 		printf("\n\n"); 	} 	return 0; } 别的自己想吧   谢谢

你要是打算交作业， 百度一下c++ 乘法表， 代码很多， copy一个拉倒 要想学编程， 没有偷懒能学成的， 自己写， 错了贴代码提问

啥？乘法口诀有啥用呀

我这里有个乘法口诀的  以前写的

引用 1 楼 user-4的回复:这种简单的代码，lz先自己写吧，有错再把代码贴出来提问

引用 2 楼 chxchxkkk的回复:这是最简单的小程序了，自己尝试着写一下，就是循环和判断。

这是最简单的小程序了，自己尝试着写一下，就是循环和判断。

这种简单的代码，lz先自己写吧，有错再把代码贴出来提问


Question: 新手救助，题目是"把多个连续空格替换为一个空格"，我这样写不会打印空格，实在想不出来了。

引用 1 楼 tjw316248269的回复:除了state==NONBANK少个等号，好像没啥问题吧 哇，好像是，怪不得打不出来空格

除了state==NONBANK少个等号，好像没啥问题吧


Question: 为什么输出带$？

p/p=1  d*r=3000  p/p-d*r=-2999

[quote=引用 2 楼 ?Victor.?? 的回复:] log(p/p-d*r)  p/p-d*r<0  ？ p/p-d*r不是小于零吧？

log(p/p-d*r)  p/p-d*r<0

引用 4 楼 ?Victor.?? 的回复:p/p=1  d*r=3000  p/p-d*r=-2999   sorry，我错了，没打括号，哈哈哈


Question: 怎么构造一个字符串使得下列这个程序输出为len = [1361654881]

直接把字符串数组改成指针就ok了

循环语句试试？ 好像不行

题目错 没合适做法实现 企图通过越界修改len的想法太年轻太天真太甜 现实世界可没有这么简单美好

引用 54 楼 Miao0012的回复:怎样获得C币 发博文可以吗 楼主刚来，还不知道哦

学习一下努力

学习一下，受教了

赞，牛气啊 学习了啊 内容，啊哈哈哈哈哈哈

怎样获得C币 发博文可以吗

这是二级C语言吗 学习一下

引用 5 楼 DYf3244 的回复:[quote=引用 4 楼 qybao的回复:]你可以测试一下数组后面的地址是不是就是len的地址 char *p=str printf(“%p, %p”, p+9; &len);  //数组越界，确认下标为9的地址是否是len的地址？如果是，就是按我上面说的思路，不是，那就没办法做到。 地址上差一点点[/quote]  引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。 引用 50 楼 asd255255 的回复:学习一下。。。。。。。。。学习一下

学习一下。。。。。。。。。

小白来看看，IT

引用 38 楼 SinMu-L的回复:请问一下，不能把这个str转换成long long 型输出么 肯定不行啦。

请问一下，不能把这个str转换成long long 型输出么

循环语句试试？

我希望大家学c++, 不要把c++学成一种宗教。

百度知道 宗教与科学的区别 科学与宗教的本质区别是什么查看全部1个回答 科学与宗教的本质区别是什么 我来答 晴天摆渡-数学 专注数学题目解答，特别是高等数 2018-06-12 科学与宗教的本质区别在于科学的实证性与宗教的信仰性，二者是难以简单调和的。 “科学在我们的眼里，就是不可辩驳的真理，就是基督徒眼里的基督。”问题就出在这里！科学并不是“不可辩驳的真理，”而是随时准备修正错误的有限真理。基督徒才认为基督教“是不可辩驳的真理”。这正是科学与宗教的本质区别。 第一，科学是关于自然、社会和思维规律的知识体系，是获取知识的认识与研究活动。宗教则是人类在未知自然及其规律的情况下所采取的一种消极的认识态度和方式，它束缚了人类的认识和改造自然的主观能动性和创造性。 第二，科学追求的是客观真理，它的成果属于全人类，科学没有阶级性，它具有中立性的特点。而宗教在阶级社会中表现出强烈的阶级性，它一般为统治阶级服务，成为各个朝代统治者统治的舆论工具。在阶级社会中，反动的宗教常常是和封建迷信联系在一起的。

法律不允许偷，骗，抢，我们是不是不用去了解偷，骗，抢了？ 标准对此没有定义，是不是这些东西就不存在了吗？ 我想问一下，微软为什么要发布几千个补丁？

这个数组越界了，越界数组越界的部分会随机输出，这可是个危险的事，不信可以试下这个有趣又简单的程序，每次输出都不一样！！！（可以用它来测测你的幸运数字） #include<iostream>  using namespace std;  int main() { 	int a[]={1,2,3,4,5}; 	for(int i=0;i<=100;i++) 	{ 	    cout<<a[i]<<endl; 	} 	 }


Question: 请高手讲究一下这段代码

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html


Question: 小白求教，字符1与整型1

知道了谢谢各位

数字的字符在ascii表里面是顺序排列的 所以， 1 = '1' -'0';  2 = '2'-'0', .... 看看'0'的ascii是多少， 48 所以  1 = '1' - 48

其实没有必要记啊。 ‘1’-‘1’+1； 这不就转化过来了吗 字符转数字 s[i]-‘0’

在ASCII码表中，48~57为0到9十个阿拉伯数字 字符‘1’==  49， 要换成整型 1 = ‘1’-48

LZ可以自己打印字符1看看多少，然后就知道怎么转成整形1了 printf("%d", '1'); //打印字符1看看是多少？


Question: 关于PTA上的的《求整数段和》

把if(a==b){ sum+=a;} 去掉  后面sum已经加了


Question: 题目

简单粗暴法就是3个for循环，复杂的排列组合，递归算法就不说了。 int i,j,k; for(i=1; i<=198/4; i++) {     for(j=i+1; j<=198/4; j++) {          for(k=j+1; k<=198/4; k++) {             printf(“198=%d+%d+%d+%d\n”, i, j, k, 198-(i+j+k));         }     } }

枚举，暴力法，for


Question: 求助！！


Question: 编程题求助

引用 4 楼 早打大打打核战争的回复: int nsplit(int n, int k) {   int i, r;    if (n < 1 || k < 1 || n < k) return 0;   if (n == k || k == 1) return 1;   if (k == 2) return n / 2;   for (i = 1, r = 0; i <= k; i++) r += nsplit(n - k, i);    return r; }   nsplit(198, 4) = 54722种方案 哇😯谢谢谢谢

可以。它没有限制

拆分数可以重复？

穷 举 法


Question: c语言构建九九乘法表

#include<stdio.h>  int main(){ 	for(int i = 1; i < 10; i++){ 		for(int j = 1; j <=i; j++){ 			printf("%d*%d=%d ", j, i, i * j); 		} 		printf("\n"); 	} 	return 0; }

我之前看到过

引用 1 楼 ?Victor.?? 的回复：#include<stdio.h> int main() { int a[10][10]; int i,j,k; for(i=0;i<10;i++) { for(j=0;j<10;j++) { k=i*j; a[i][j]=k; } } for(i=0;i<10;i++) { for(j=0;j<10;j++) { if(a[i][j]!=0&&i>=j) printf("%d*%d=%d",j,i,a[i][j]); printf(" "); } printf("\n\n"); } return 0; }又学到一个


Question: 传递参数，将整数赋给指针，未做类型转换，默认启用，求大神

估计是少了什么头文件，未声明的函数默认返回int，应该是这个错误


Question: 【C语言求助】源程序简单分析器：统计注释个数部分


Question: 这个函数应该怎么写？


Question: 怎么利用数组越界解决这个问题


Question: 各位大佬，有人知道这里的p1，p2为什么不要先指向结构体变量，然后再使用的吗？

引用 2 楼 自信男孩的回复:不明白楼主的意思，还是楼主描述的有问题。楼主标注的代码是动态申请空间，因为p1, p2都是野指针，并没有让指针指向有效的可以读写的位置，因为malloc申请了内存，让指针指向了可以读写的内存，后面就可以使用了。否则，野指针直接使用会出现段错误。 明白啦，明白啦，万分感谢(❁´ω`❁)！

p1，p2是结构体指针，指向申请好的内存，这个就等同于指向结构体变量啊，只是前者是动态申请内存，后者是指向已声明过的结构体变量的地址而已

先开辟空间  不然之后输入往哪里放呀


Question: 求解释int a[const 5]这代表啥意思？

这样的函数int func(int a[const 5], const int b[5])这个第一形参是什么意思啊？第二个是说数组b前面5个元素不能修改吗？

引用 5 楼 apkipa1 的回复:这种用法只有用在说明函数形参时才能用，其效果等价于第二个。 你是说int a[const 5]等价于int *const？

不知道答案，所以上来问大神

拆解这个问题： int* const 数组 是以上三者的组合。

这种用法只有用在说明函数形参时才能用，其效果等价于第二个。

如果是选择题，第四个可能是正确答案。  const int *a，a指向的内容不能改变 int * const a，a本身不能改变

https://blog.csdn.net/qq_37941471/article/details/80678904?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task  首尾两个指针是指向 int[5]这样的数组的， 只是指针类型不一样


Question: 新人求解！！！

之前刚回答了一道类似的题，LZ参考修改一下吧 https://bbs.csdn.net/topics/396053574


Question: c语言

引用 7 楼 燚认的回复:[quote=引用 1 楼 user-6 的回复:] 新手区估计有很多作业题 话说，书里面没有练习题吗？ 想找项目，可以去github上搜 大佬，github全是英文，看不懂啊[/quote] 用翻译不就行了吗哈哈

PTA，LEETCODE，

引用 1 楼 user-6 的回复:新手区估计有很多作业题 话说，书里面没有练习题吗？ 想找项目，可以去github上搜 大佬，github全是英文，看不懂啊

推荐 K&R C 中的课后题

引用 1 楼 user-6的回复:新手区估计有很多作业题 话说，书里面没有练习题吗？ 想找项目，可以去github上搜 首先谢谢回答，请问朋友你说的新手区是哪里？

书里的题都做完了？在新手区答题，就可以。

刷题不知道会不会有用，楼主可以试试

新手区估计有很多作业题😄 话说，书里面没有练习题吗？ 想找项目，可以去github上搜


Question: C语言能对未知变量进行计算么

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

引用 2 楼 寻开心的回复:顺序写成 y=x-2； fun=x*y＋1. 就可以了 我去试一下，。。。。。。。。

引用 楼主 You're  Beautiful 的回复:比如fun=x*y＋1. y=x-2； 能实现出fun=x*x-2*x+1 你想解方程？不过你这方程太简单。  int y(int x) { return x -2; } int fun(int x){ return x * y(x) +1; }

C应该不能，这个涉及并行计算，以下内容瞎说。 多年以前看过，内容早忘了。大致是一个调度器，把计算分散给不同的cpu或内核或线程。 当计算到fun=x*y＋1时，这个线程挂起，并产生一个标记。 当另外一个线程计算到y=x-2；根据标记，唤醒标记线程继续fun=x*y＋1计算。

顺序写成 y=x-2； fun=x*y＋1. 就可以了

不清楚你想表达什么    试一试不就知道了


Question: 修路


Question: 求解

供参考：//fun(x,n)=1 + x^2/2! + x^4/4! + x^6/6! + ... + x^(2*n-2)/(2*n-2)!  //fun(6.66,8) = 389.443 //fun(6.66,15)= 390.276  #include<stdio.h>  double fun(double x,int n);  int main() {     int    n;     double x;     scanf("%lf%d",&x,&n);     printf("fun(%.2f,%d)=%.3f\n",x,n,fun(x,n));          return 0; }  double fun(double x,int n) {     int    i=1,k=2;     double tmp=1,sum=1;     while(i<n)     {           tmp *= (double)(x*x)/(k*k-k);           sum += tmp;           i++;k+=2;     }     return sum; }


Question: 输出一个数列的第k小值

那要怎么弄呢

用数组也不太好办，用字符串来操作比较方便

说但是序列，你为什么要输入一个数呢？？？思路就有问题呀

无序序列这里可以用数组存

输入的序列超出了整数能表达的范围了 自己去查查int能表达的最大的数是多少去  什么类型都不是万能的， 必须考虑能表达的有效范围


Question: 求助，题目是"编写打印输入中单词的长度的直方图"，我这样打不出来*号,不知道为什么

for (int p = 1;p <= num;) putchar ('*'); printf ("\n");   } 这几行代码要么循环体不执行，即使执行了也可能是死循环呢。

#include <stdio.h> int main () { 	char c[1000]={0},c1; 	int a[100]={0},b[16]={0}; 	int i,j,k=0,l; 	for(i=0;i<1000;i++) 	{ 		c[i]=getchar(); 		if(c[i]=='\n') 		break; 	}	 	for(j=0;j<i;j++) 	{ 		if(c[j]==' ') 		{ 			if(c[j+1]!=' ') 			{ 				printf("\n"); 				k++; 			} 			if(c[j+1]==' '&&c[j+2]==' ') 			j++; 		} 		else 		{ 			printf("*"); 			a[k]++; 		} 	} 	printf("\n"); 	for(i=0;i<k+1;i++) 	{ 		for(j=0;j<16;j++) 		{ 			if(a[i]==j+1) 			b[j]++; 		} 		if(a[i]>15) 		b[15]++; 	} 	for(j=0;j<15;j++) 	{ 		if(b[j]!=0) 		printf("长度为%d的单词的个数为%d\n",j+1,b[j]); 	} 	printf("超过限度的单词%d个",b[15]); 	return 0; }  可能有点麻烦

#include <stdio.h> #define MAXWORD 15 #define IN 1 #define OUT 0  int main() {     int c,wl[16],i,state = OUT,overflow = 0;      // 从while里面搬出来了     for (i = 0; i <= MAXWORD; i ++) wl[i] = 0;      i = 0;     while ((c = getchar()) != EOF)     {         if ( c== '\b') { // 这是删除前一个字符             if ( i ) i--;         } else if (c == ' ' ||c == '\t' || c=='\n') {             if (state == IN) {                 if (i <= MAXWORD)                     wl[i] ++;                 else                     overflow ++;             }             // 遇到单词分割后， 状态要重新改为out，并且长度计数要清0             state = OUT;             i=0;         }  else {             // 以前的两个if都可以合并成一个，已经是in，继续设置in也无妨             i ++;             state = IN;         }     }     // 最后是Ctrl+z 退出的，此时i还有长度也要统计     if (i <= MAXWORD)         wl[i] ++;     else         overflow ++;     printf("\n");     for (int h=1; h <= MAXWORD; h++)     {         // 原来的num，min什么的都是废话，直接输出就好了         printf ("长度为%d的单词的个数为%d\t:", h, wl[h]);         for (int p = 1; p <= wl[h]; p++) putchar ('*');         printf ("\n");     }     if (overflow > 0)         printf ("有%d个单词超过了最大限度\n", overflow);     return 0; }

最大长度15，个数没有限制

最大长度是多少？15吗？  单词个数有限制吗？


Question: glibc库中一种奇怪的函数定义方式

这个是旧式的函数定义。好像是因为这些参数编译时，就是放在前面的地址上。

奇怪是指将形式参数列表分成了两部分，在括号内给出形参名称，而在括号外给出其类型定义。我是个C小白，以前没有见过这种风格的函数定义。


Question: 大神求解啊，*号里填什么，用C语言

引用 1 楼 user-3的回复:你这怎么也要说明一下fun想达到什么结果啊 如果没有要求，随便return个double就好了，比如return 0; return x; return x*n; 等等 例如: fun( 6.66, 8 ) = 389. 443

可能让你写这个函数有什么问题吧，参数的类型错误。


Question: C语言新手关于变量位置的疑惑

引用 1 楼 user-3的回复:第一个因为sum一直累加（把上一次循环的结果也累加），所以if(sum==i)一直不会满足，所以没打印  第二个每次循环取得i的因数前，先把sum清零，所以累加的是i的因数，所以if(sum==i)可能会满足，所以可能有结果打印 懂了懂了，谢谢！

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> int   main() {     for (int i = 0; i < 10; i++)     {         int j = 10;         {             printf("%d\n", j++);         }     }     return 0; } 为什么j一直是10，定义不是只运行一次吗？j不是在块中一直有生命期吗？


Question: c语言初学者，求大佬指点

这样更方便 int m = (0x7FFFFFFF<<n) & (0x7FFFFFFF>>p); //p-n的部分都是1，其余都是0 int v = ~(x & m) & (x | m);

引用 6 楼 milk____shake 的回复:可是，好像不符合题意 忽略了中间部分取反的时候变负数了，要修正回来 int v = (x & ~(x%(1<<(p+1)))) | (x%(1<<n)) | (~(x%(1<<(p+1)) & ~(x%(1<<n))) & (0x7FFFFFFF<<n) & (0x7FFFFFFF>>p)); 或者中间变量 int m =  (0x7FFFFFFF<<n) & (0x7FFFFFFF>>p);  int v = (x & ~(x%(1<<(p+1)))) | (x%(1<<n)) | (~(x%(1<<(p+1)) & ~(x%(1<<n))) & m);

引用 5 楼 user-2的回复:减法可以用&减数的反 int v = (x & ~(x%(1<<(p+1)))) | (x%(1<<n)) | ~(x%(1<<(p+1)) & ~(x%(1<<n))) 可是，好像不符合题意

改一下 int v = (x-(x%(1<<(p+1)))) | (x%(1<<n)) | ~(x%(1<<(p+1)) - x%(1<<n));

那你就把v1，v2，v3合起来写，之所以分开写想象让你清楚逻辑 int v = (x/(1<<(p+1))) | (x%(1<<n)) | ~(x%(1<<(p+1)) - x%(1<<n)); printf(“%d\n”, v);

引用 1 楼 user-2的回复:for example int main(int argc, const char * argv[]) {     int x, p, n;     scanf("%d", &x);     scanf("%d%d", &p, &n);     int v1 = (x>>(32-p-1)) << (32-p-1); //p的左半部 (右移再左移，把p的右半部清0)     int v2 = (1<<n); //n的右半部     v2 = x % v2; //这里用取余法简化（也可以移位）     int v3 = 0; //p-n部分     for (int i=0; i<=p-n; i++) { //取出p到n的位的数并取反         v3 = ((~((x>>(p-i)) & 0x00000001)) & 0x00000001) << (p-i) | v3;     }     printf("%d\n", v1|v3|v2);     return 0; } 如果只要求用一个表达式表示出来呢


Question: 小白请教一下代码错误

scanf_s("%d %s %d", (p+i)->xh, (p+i)->name, (p+i)->Cnsoe);         printf("第%d个学生的信息：学号：%d\n姓名：%s\n语文分数%d\n", &(p+i)->xh, &(p+i)->name, &(p+i)->Cnsoe); 主要是这里有问题，记住一个原则，凡是要修改值的调用，参数必须是指针 (p+i)->Cnsoe这里虽然p是指针，但是他指向了一个变量，所以还得取变量的地址才行。&(p+i)->Cnsoe 而在不修改实参的值的调用中，参数一般是变量，但是有时为了保持和相应函数的一致性，也可以使用一个常量指针。 &(p+i)->xh这里的取址操作明显不符合上面所说的原则


Question: 编写代码过程中，光标移动的便捷方法

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

用↑↓←→（上下左右键）可以操控光标，就是不用鼠标，但是很多情况还是用鼠标好，少量记住一些快捷键也是有用的  跨度太大的时候也要用鼠标 上下左右键就是玩游戏的键 要结帖！！结贴！！

vs2019，其他应该差不多吧，查下ide的帮助

引用 2 楼 m0_46108109的回复:Ctrl+Shift+Enter 话说快捷键我根本记不住，我一直动鼠标的。 这快捷键那些编译环境可以用

Ctrl+Shift+Enter 话说快捷键我根本记不住，我一直动鼠标的。

麻烦指点小生一二


Question: 洛谷——插火把问题

很明显你的火把情况考虑的少了(萤石没看) a[x+2][y+2]=1; //物品所在位         a[x+1][y+2]=a[x][y+2]=1; //左边两个         a[x+3][y+2]=a[x+4][y+2]=1;//右边两个         a[x+2][y+1]=a[x+2][y]=1;//上边两个         a[x+2][y+3]=a[x+2][y+4]=1;//下边两个         a[x+3][y+3]=a[x+3][y+1]=1;//左下和右下         a[x+1][y+3]=a[x+1][y+1]=1;//左上和右上


Question: C语言

除了编程题，也许别处就用不到了

引用 7 楼 xianming3的回复:什么东西上用到这么大的数？ 是一个编程题（数根）

似乎得用上log，得用数学方法

什么东西上用到这么大的数？

引用 4 楼 ggglivw的回复:话说这个数字有多大，我感觉已经超过我能理解的范畴了 我也是，谢谢你了

我也是，谢谢你了

话说这个数字有多大，我感觉已经超过我能理解的范畴了

用结构，好像在离散数学里，专门讲了，超过计算机限制的大数运算。 就是你自己定义一个数据类型，自己设计算法。

可以用数组。。。

只能用字符串了,  有不少的大数据计算类，都是用字符串存数据. 你们老师也是牛逼，才学C就给你们出这种题目


Question: c语言

引用 5 楼 qybao的回复:嚯嚯，原来如此 也就是说移位运算如有表达式（不管在移位符的左边还是右边），就会把位移的位数先对32取模，取模的结果才是最终位移的位数  所以改一下步骤2，也许LZ就能理解了 1:  ~(~0<<32) 2:  ~(~0 << (32%32) ) 3:  ~(0xFFFFFFFF << 0) 3:  ~(0xFFFFFFFF << 0) 4:  ~0xFFFFFFFF 5:  0 哦哦，这样可以懂了

引用 3 楼 寻开心的回复:正确答案是这样的  对于 x << y的处理 要分两种情况，区分字面量和表达式 如果是字面量， 那么y大于等于32的时候，都是0（这是编译器处理，编译器够智能才行） 不管是1<<32 还是 0xFFFFFFFF<<32 都是0 你可以去测试！   如果是运算， 那么首先把y对32取模，然后再进行移动计算 所以楼主的代码执行过程是这样的 1:  ~(~0<<32) 2:  ~(0xFFFFFFFF << 32 ) 3:  ~(0xFFFFFFFF << 0) 4:  ~0xFFFFFFFF 5:  0  这题是一些面试官经常考的问题！ 所你会发现， 把一个数直接左移动32次，和循环32次，一次移动一位的结果完全不同  代码上你可以写 1<<33，但是这就是字面量了， 直接是0（有的编译器可能会不同） 如果int v=1；  v<<33 哈， 这个有意思， 它等价于v<1;  二不二 没懂那个代码执行过程2-3步

引用 1 楼 qybao 的回复:你可以循环打印看看变化 for (int i=0; i<33; i++) {     printf("%08X\n", ~0<<i);     printf("%08X\n", 1<<i); } 也就是~0=0xFFFFFFFF，左移32位，相当于int的位数的一个循环，又回到了原点 所以相当～(~0)，所以还是0  解释不通 ~的优先级高于< 先执行~后执行<< 0按照字面量理解的时候是int类型， 就当做32位来解释吧 ~0是0xFFFFFFFF 左侧移动32结果是0 最后括号外面的~会把结果变成0xFFFFFFFF 如何解释？


Question: 那我重新上传一下，抱歉

引用 1 楼 user-1的回复:就是要数组越界才能达到目的 只是很奇怪，两个连续的局部变量，既然内存地址不连续 我上传文件之后通过了，应该确实是编译器嗯问题，太谢谢你啦

就是要数组越界才能达到目的 只是很奇怪，两个连续的局部变量，既然内存地址不连续


Question: 区别

各位大神，不好意思，本来我要结贴的，后来不小心点错成了无满意结帖，下次一定给各位加分

谢谢(*°∀°)=3

建议楼主写个程序验证一下，用到sizeof，用实践去验证你的想法，猜想～

*str[10]这是指针数组，即还是数组，只是数组内的元素都是指针。 (*str)[10]是数组指针，即指向数组的指针，注意最终str是指针。指向的是一个二维数组，该二维数组是一个列数是10的二维数组。 str[][10]是数组，二维数组，只是行数不确定，由初始化决定行数。如果str[][10]作为形参，那么和(*str)[10]是等价的。

纠正一下，*st[10]是指针数组

*st[10]是数组指针，st指向一个长度为10的数组，该数组的每个元素是个指针，即该数组的每个元素的内存地址是连续的，但每个数组元素可以指向不连续的内存地址（比如st[0]指向内存1，st[1]指向内存8，内存1和内存8不一定连续），st+1会移动1个指针大小的字节（32位机就是移动4个字节），移到数组的下一个元素的地址，st属于一级指针，可以改变指向，*(st+i)可以得到数组第i个元素的值（它的值是个指针）。适用于一组数组分别保存非连续内存的信息。比如数组元素是个对象指针（动态new出来的） (*st)[10]是数组指针，st指向一个长度为10的数组，这个和上面的区别是st+1会移动数组长度x数组类型个字节，即st+1访问不了数组的元素（不会移动到数组的下一个元素的地址），也就是这个数组是个整体，把这个整体看成一种类型就可以）。st属于二级指针，可以改变指向，*(st+i)得到第i个长度为10的数组，*(*(st+i)+j)得到第i个长度为10的数组的第j个元素。适用于把数组当作一个整体来访问的情况（一般用于指向二维数组，st+i就可以达到二维数组的行增加） st[][10]这个和数组指针很像，也是二级指针，只是st是数组名，不能改指向。适应场合没什么可说的，就是二维数组，一维的长度由数组声明的时候给它赋值的元素来确定。

以char类型为例子 int* st[10]  指针的数组， 这个数组有10个元素，每个元素的类型都是char *         st[1] = (int*) malloc( sizeof(char) * 8);             char ch;  s[2] = &ch;         比如，給多个字符串排序，你就可以把字符串指针放到这个数组里面， strcmp两个元素后交换他们的值  char (*st)[10] 数组的指针，  指针指向一个 char[10]的数组         对于二维数组  char ary[20][10] 来说， ary[0], ary[1], ... 这些都是此类型的         二维数组名字当值指针来使用的时候，实际上也是这个类型         对于这个指针， 因为知道了是指向char[10]的类型的，所以这个指针的p++， 就是sizeof（char）*10的数值变化         char a[10];        char (*p)[10] = a;    st[][10] 也是数组的指针         它可以用于二维数组的初始化; 因为二维数组是若干个一维数组的顺序排列，所以必须要先知道一维数组的长度才可以定位类型                  初始化二维数组的时候， 第一个下标可以空，根据后面 = { ... } 花括号里面一维数组的个数来自动确定第一个下标的值                  但是你不能空第二个下标参数， 因为它不指定就无法确定基本数据的长度                  你可以不知道有多少个一维数组，但是你必须知道每个一维数组的长度                  例如： char [][3] = {{'1','2','3'}, {'a', 'b','c'}, };           也可以用于二维数组的函数传参 ，  void func( char *[][10] ); 原因同上， 还是必须要知道第二个下标参数的大小，不能空。


Question: 【求助】

还有就是fgets那个循环里面， 你可以先printf %s buf出来，看看读出的数据是什么

char * fileline[1024]; 要这样定义 fileline， 一个数组，元素是char*  后面是 fileline[l] = (char*) malloc( strlen(buf));


Question: 这道题咋写啊？求助！！！！

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

union  {     unsigned int v;     unsigned char ch[4]; } u; 給ch数组赋值完了， v直接就出来了， 啥合并都不用     unsigned char ch[4];  int v = *((int*)ch);                也可

还有这种操作？？？

#define UCHAR_TO_INT_U(a, b, c, d)   (((a)<<24) + ((b)<<16) + ((c)<<8) + d)   试试这个～

打错了 int型

#define Byte32(Byte4, Byte3, Byte2, Byte1)  ((unsigned int)((((unsigned int)(Byte4))<<24) \ 		| (((unsigned int)(Byte3))<<16) | (((unsigned int)(Byte2))<<8) | ((unsigned int)(Byte1))))


Question: 关于C语言的clock()函数的使用

stop - start是clock_t类型，如果细心研究一下clock_t是 long类型。CLK_TCK也不是double，应该也是unsigned long或unsigned int类型。因此如果不加double，那么得到的结果是unsigned long类型的，而duration是double类型，如果让除法变成double类型的除法就需要强转一下。

楼上正解， c语言中的自动类型转换原则是： 一个表达式中出现不同类型间的混合运算，较低类型将自动向较高类型转换。 stop、 start、CLK_TCK通过自动转换，变不成double类型 所以，需要强制类型转换下


Question: 初学者的一个问题...

程序没什么问题，就是scanf函数 你写的scanf("%d, %d, %d", &a, &b, &c);是用逗号分隔的，输入数值时也要用逗号分隔，而且要用英文的逗号。

程序没什么问题，建议楼主注意一下输入格式。注意逗号，不要输入成中文逗号了。  或者在scanf下面打印一下a, b, c，确保输入的没问题，然后在定位exchange是否有问题。


Question: 与用c语言编写程序，求解？

数组名可以不要，这个是数组元素，必须得要。p可以不要&, p[i]必须得要&

引用 3 楼 chxchxkkk 的回复:贴个简单的代码供参考。  #include <stdio.h> #define STUSIZE 5 struct student {     int num;     char name[20];     char sex[4];     char homeaddr[50];     float yuwen;     float shuxue;     float waiyu; };  //输入学生信息 void input_stu(struct student p[]) {     int i;     for (i=0; i<STUSIZE; i++)     {         printf("请输入第%d个学生信息：\n", i+1);         printf("请输入学号：\n");         scanf("%d", &p[i].num);         printf("请输入姓名：\n");         scanf("%s", &p[i].name);         printf("请输入性别：\n");         scanf("%s", &p[i].sex);         printf("请输入住址：\n");         scanf("%s", &p[i].homeaddr);         printf("请输入语文成绩：\n");         scanf("%f", &p[i].yuwen);         printf("请输入数学成绩：\n");         scanf("%f", &p[i].shuxue);         printf("请输入外语成绩：\n");         scanf("%f", &p[i].waiyu);     } }  //检索学生信息 void findstu(struct student stu[], int num) {     int i = 0;     for(i=0; i<STUSIZE; i++)     {         if(stu[i].num == num)         {             printf("此学生三门课成绩为：语文%.2f  数学%.2f  外语%.2f\n",stu[i].yuwen,stu[i].shuxue, stu[i].waiyu);             break;         }         else         {             printf("未找到此学生！\n");         }     } }  //显示不及格学生人数 void showstu(struct student stu[]) {     int i, icount=0, acount=0;     for(i=0; i<STUSIZE; i++)     {         if(stu[i].yuwen < 60 || stu[i].shuxue < 60 || stu[i].waiyu < 60)         {             icount ++;         }         if(stu[i].yuwen < 60 && stu[i].shuxue < 60 && stu[i].waiyu < 60)         {             acount ++;         }     }     printf("有一门不及格的人数是：%d  所有课程都不及格的人数是： %d", icount, acount); }  int main() {     int n=0;     struct student stu[STUSIZE] = {0};     input_stu(stu);     printf("请输入要检索的学生学号：\n");     scanf("%d", &n);     findstu(stu, n);     showstu(stu);      return 0; }    scanf("%s", &p[i].name); scanf("%s", &p[i].homeaddr); 这两行代码去掉&才对吧。因为数组名就是地址呀

这个作业简单也简单，说难也难，估计老师就没讲过键盘输入中的异常情况需求，各种确认以后的更改需求，哈哈. 用键盘太恶心了，能用文本当输入源码

要想学习，这种题目就自己写，错了的话贴代码提问 要想交作业糊弄老师，就百度源码去吧


Question: 求助大神

就是根据返回的true/false，也可以是1/0，都能代表真假

引用 5 楼 ?Victor.?? 的回复:[quote=引用 4 楼 與蘤舊縐 的回复:] if (true == date1.set(y,m,d))手残党就得反着写    大佬爬杆归来？  [/quote]  饭点

引用 4 楼 與蘤舊縐 的回复:if (true == date1.set(y,m,d))手残党就得反着写    大佬爬杆归来？

if (true == date1.set(y,m,d))手残党就得反着写

这样写当然是根据返回值判断了 if(dt.set(yy,mm,dd)) 另外m应该小于1就返回false，否则a[m-1]就出错

板凳板凳  if (date1.set(y,m,d) == true)  是这么操作吗？

沙发沙发


Question: C为什么我的输出函数没有运行呢？

引用 6 楼 tjw316248269的回复:[quote=引用 5 楼 m0_46472878 的回复:] [quote=引用 3 楼 tjw316248269的回复:][quote=引用 2 楼 m0_46472878 的回复:] [quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。 [/quote] 大佬 那个memset函数  那个加了和没加的结果是一样的吗，那个具体是干什么的 不太明白，我没加那个然后也是正常输出了  [/quote]  我写那个就是把内存清零的，初始化嘛，要养成好习惯啊[/quote] 还有那个输入函数，为啥是两次输入呢，没怎么明白 😂  能告诉下吗

引用 5 楼 m0_46472878 的回复:[quote=引用 3 楼 tjw316248269的回复:][quote=引用 2 楼 m0_46472878 的回复:] [quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。 [/quote] 大佬 那个memset函数  那个加了和没加的结果是一样的吗，那个具体是干什么的 不太明白，我没加那个然后也是正常输出了  [/quote]  我写那个就是把内存清零的，初始化嘛，要养成好习惯啊

引用 3 楼 tjw316248269的回复:[quote=引用 2 楼 m0_46472878 的回复:] [quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。 [/quote] 大佬 那个memset函数  那个加了和没加的结果是一样的吗，那个具体是干什么的 不太明白，我没加那个然后也是正常输出了

引用 3 楼 tjw316248269的回复:[quote=引用 2 楼 m0_46472878 的回复:] [quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。 [/quote] 感谢大佬！ 真是以前没学 现在啥都不懂啊，谢谢这么用心的帮我都打出来了，非常感谢！！！ 太感谢了   好人一生平安 谢大佬  有不懂得 我还会继续在下面问的 您有空就帮我解答一下子 哈哈 谢谢了

引用 2 楼 m0_46472878 的回复:[quote=引用 1 楼 tjw316248269的回复:]怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬[/quote]   你不是要以指针形式保存么，声明一次，把附加的附到后面不就好了。 先假设你写的程序别的问题没有，单纯说在函数体malloc的，生命周期也只有那个函数存活周期。所以你认为你把这个东西给了L，然后就可以调用函数show打印了。但是结果是没有的。 因为传到show的还是你第一次在main声明的那个，你在连接node的函数中连接的那部分内存，被泄露了。也就是并没有附加到L。所以L->next是空的，当然也就打印不出来了。 当然你的程序问题太多了，比如说释放指针要free啊，然后你这个在main中声明的指针也没有初始化，这是野指针。。 如果你想要在函数体malloc然后再传到外面，你可以声明为static，这样存活周期就和整个程序存活周期一样了。

引用 1 楼 tjw316248269的回复:怎么说呢，代码问题有点多。最主要的一点就是，在函数中声明的，函数结束后就消失了。 我给你改写了一下，你看看吧  #include <stdio.h> #include <stdlib.h> #include <string.h>  typedef int Elemtype;  typedef struct Lnode { 	Elemtype data; 	struct Lnode* next; }Linklist;  void ScanfLinkList(Linklist* L, int n) { 	int i = 0; 	  	Linklist* pcurr = L;  	printf("enter data:"); 	scanf("%d", &pcurr->data);  	for (int i = 1; i < n; i++) { 		Linklist* tmp = (Linklist*)malloc(sizeof(Linklist)); 		if (L == NULL) { 			printf("malloc error!\n"); 			return; 		} 		printf("enter data:"); 		scanf("%d", &tmp->data); 		tmp->next = NULL; 		pcurr->next = tmp; 		pcurr = pcurr->next; 	} }  void show(Linklist* L) { 	if (L == NULL) { 		printf("this is null\n"); 		return; 	}  	while (L) { 		printf("data is %d\n", L->data); 		L = L->next; 	} }  int main() { 	int n = 0; 	Linklist* L = (Linklist*)malloc(sizeof(Linklist)); 	printf("init list!!!!!\n"); 	if (L == NULL) { 		printf("malloc error!\n"); 		return -1; 	} 	memset(L, 0, sizeof(Linklist)); 	printf("enter length of list:"); 	scanf("%d", &n); 	ScanfLinkList(L, n);  	show(L);  	return 0; }  那个创建空间，就直接在main函数中创建一次就可以吗，这个不太懂 大佬


Question: 【C语言求助】

正则表达式 ^\s*$

引用 6 楼 proorck2019的回复:正则表达式 ^\s*$ 我学习一下先

引用 4 楼 qybao的回复:for example char c[256]; char *p = gets(c, sizeof(c); stdin); //这里以标准输入为例，可以改成文件指针 if (p!=NULL && c[0]==‘\n’) printf(“空行”); 好嘞我试试！

引用 5 楼 寻开心的回复:看空行如何定义了 只有一个回车的一行当然是 那么这一行只有8个空格算不算 这一行有两个tab算不算  fgets读取一行，判断这一行当中所有的字符是否都是空白字符，也就是上面说的空格，tab和回车 fgets是可以把回车也读进来的 谢谢您我试试！

引用 2 楼 初学小菜的回复:或则ch==32直接ascll判断也可以 好嘞谢谢！我试试去

用getchar呀，ch=getchar；ch==' ';


Question: 第61行和101有相同的错误，不懂，望各位大佬求救

引用 9 楼 自信男孩的回复:去掉双引号，因为stdin, stdout本身就是FILE *类型的。  另外，提醒一下fflush(stdin);是未定义行为，fflush(stdout)是有效的。 解决了，三q

哈哈哈哈哈哈哈

引用 6 楼 千梦一生 的回复:https://baike.baidu.com/item/fflush/10942194?fr=aladdin 它那儿就有现成的例子。 不是不回你，yysy，流这个名字，一直觉得怪里怪气的

引用 4 楼 千梦一生的回复:比如一个函数，实现了一个功能：把字符串拼接 A(字符串，字符串)  你这样调用 A(字符串)；//不对的。因为很显然，不能是一个参数对吧，因为我函数要拼接你的字符串，那肯定至少需要两个字符串才能做到你满足你的功能 A(整数变量，整数变量)；//不对的。因为很显然，不能是一个参数对吧，因为我函数要拼接你的字符串，那肯定至少需要两个字符串才能做到你所希望的功能  函数是一个过程。把某些状态从x-->y。x即是输入，y即是输出。x、y在这里可能是一种状态，但在全是数字的计算机世界种，所谓状态也不过是数据罢了。 因此，这是我个人认为，事实上一个有用的函数必定有输入和输出，只是有些是单纯的参数与返回，有些是环境变量、全局变量、云云。 既然过程、函数是把输入x-->y。那么，一个有效的x当然是必须的了。 作为参数，它以参数类型告知你它需要一个怎样的输入n才能执行n-->m的一个正确的，被希望的过程。  //////////////////// 而你这个具体的问题，你得具体的看那个函数的描述了。我对流也不怎么理解 哇，先谢谢你了

引用 1 楼 千梦一生的回复:是不是参数没给对？你去找找这个函数需要什么输入。百度就有 这个不是清理输入缓存吗？和参数有什么关系(萌新瑟瑟发抖 )

去翻译一下吧，报错写的很清楚了

是不是参数没给对？你去找找这个函数需要什么输入。百度就有


Question: 不能载入该控件文件

以管理员身份运行

楼主解决了吗？


Question: 【SDOI2014】数数 段错误

char s[200][100000]; char N[200][100000]; 这也太大了，用malloc/free，在堆上分配，就没问题了。


Question: 编译错误 c6031 返回值被忽略scanf

#define _CRT_SECURE_NO_WARNINGS 有很多开关只是能让代码编译，而依然会作为警告提示给开发者

int n = scanf("%lf%lf", &num1, &num2); if ( 2 !== n) {       错误提示       return0； }  要想让用户必须输入正确才继续下去的话，这个就复杂点儿 while ( 2 != scanf("%lf%lf", &num1, &num2) ) {        fflush(stdin);  // 清理掉键盘缓冲区当中的内容        提示输入错误，重新输入 }

所以大神我应该怎么修改呢

scanf函数是有返回值的， 用来表述正确的从键盘获得到输入数据的个数 你这个例子来说，要求输入两个double类型， 但是如果你输入 12.3  xyz 会如何 scanf的返回值是1， 通知你只有一个double被正确的获得了， 接下来怎么处理，你自己看着办 你不管的话，num1就是正确的值， num2就不是你想要的了 后面你还当他们是正确的值来处理的话， 后果自负吧  这是提供安全检测到警告，就和此处非本单位车辆禁止停放一样， 你可以不管，后果自负


Question: 刚写个了小程序，求大佬们评价一下。。。。

这个东西怎么看怎么像作业

没太细看 shezhi函数有一部分代码和youxizhuti函数几乎一样，可以在shizhi函数中调用youxizhuti函数，减少重复代码。

不对呀，我可以违反规则，让对手输啊，这个是BUG

似乎来个选项可以人机对战好一点，毕竟身边没有小姐姐。 似乎应该拿3n-1数就可以取胜。

我明明排过版了，怎么又左对齐了，难搞啊