Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求救VS2022输入这个代码，是什么问题

回复:
user: user-1
content: #include <stdio.h> int main() {     float fahr,celsius; //float fahr, float celsius;     int step;     float lower,upper; //float lower, float upper;     lower = 0, upper = 300.00, step = 20;     fahr = lower;     while (fahr <= upper) {         celsius = (5.0 / 9.0) * (fahr - 32.0);         printf("fahr:%f℉, celsius:%f℃\n",fahr,celsius);         fahr = fahr + step;         //return 0;     }     return 0; }

user: user-0
content: 搞明白了，非常感谢！

user: user-2
content: 类型声明的格式是一个类型，后面跟一个或多个被声明的标识符，多个的情况用逗号分隔，最后用分号结束。

user: user-0
content: 没看懂，请问要怎么修改？

user: user-0
content: 搞明白了，非常感谢
user-0 提问: 二维数组加一和二维数组加一解引用

回复:
user: user-1
content: 如果你仅希望ptr2指向aa[1][0]这个后果的话，没有区别。 但是稍有冗余。 其实可以 int * ptr2 = (int * )(aa+1); 也可以 int * ptr2 = * (aa+1); 也就是说，在有了这个解引用以后，它前面的强制类型转换就是多余的了，因为右侧表达式 * (aa+1)本来就是int * 类型的了。 但是没有这个解引用的话，由于(aa+1)这个表达式是int (* ) [5]类型的，所以强制类型转换是需要写上去的。

user: user-1
content: 真累人，网站总是把星号理解成斜体格式符，建议网站关注。

user: user-0
content: 懂了,感谢大佬 *(aa+1)之后 类型是int*

user: user-2
content: 也就是说，在有了这个解引用以后，它前面的强制类型转换就是多余的了，因为右侧表达式 * (aa+1)本来就是int * 类型的了。 这是不是有问题啊？解引用出来后是数组的值，怎么会是地址呢？

user: user-2
content: 同学，不是加不加*的问题，，看似赋值没问题，但你这句根本是错误的，左边是指针，右边是数组aa的第2个位置的值。so1、如果你是想将ptr2指向数组的第2个位置，这样：int *ptr2 = aa + 1;（这样也可以：int ptr2 = &((aa+1));，但就多些一举了）2、如果你是想获取数组的第2个位置的值，这样：int ptr2 = *(aa + 1);

user: user-0
content: 老铁 int *ptr2 = aa + 1; //这个右边是数组左边是指针,最好不是应该强制转化一下吗,(虽然地址是相同的) 第2个你是写错了吗? 如果像你这样子写 int ptr2 = *(aa + 1); 不就成把地址赋给整形了吗?

user: user-2
content: 数组的名称就是数组的首地址啊，怎么了？为什么要强转？*(aa + 1)就是解引用，得到就是数组下标1的值啊

user: user-2
content: 对，它是二维数组！
user-0 提问: 求值 9Bh=-27，1Bh=27 如何计算这个值，c 

回复:
user: user-1

user: user-1
content: 既然1000 0101可以是-5，那么1001 1011是-27那不是顺理成章的么？

user: user-1
content: 至于为什么用原码而不是补码，那得问系统设计者。 不过咱得承认原码对人类肉眼更友好不是么？
user-0 提问: 这个里面的c++和++c两种自增出来的结果为什么是一样的？

回复:
user: user-1
content: 是因为，我就拿你的a = i++来回答吧。编译器在遇到a = i++的时候，它会这样理解：i先把自己值赋给a，再i+1而编译器再遇到a = ++i的时候，它会这样理解：i先加1，再返回a里你看看，i先 + 1和后+1都是一样的，而a就不同了：一个是得到i原来的值，一个是得到i+1后的值。

user: user-2
content: 一是 for() 循环体执行序列的问题，先执行初始化语句，再执行判断语句若成立执行循环体否则结束循环，循环体执行完后是第三个增量语句，再去判断语句；单独的语句，自增在前或在后，对变量自己没影响，影响的是以之赋值的对象，所以第二个例子，i 为 1，a 为 0 （因为自增在后，先执行赋值语句[其时a=i=0]再自增[i=1，a仍为0]）。
user-0 提问: 求助 代码在dev-c++成功运行，vs2022却运行失败

回复:
user: user-1
content: 使用vc 2022时在头文件前加#define _CRT_SECURE_NO_WARNINGS，就不用scanf_s了

user: user-2
content: scanf_s("%s%s", stu[a].num, 10, stu[a].name, 20);

user: user-0
content: 谢谢大佬，解决了。这是scanf_s函数必须要限定范围吗？刚刚接触vs studio的时候我就知道scanf_s是防止越界的，但是发现在日常使用中scanf_s并不需要设定范围,就没有注意。在数组，结构体这种可能越界的都需要限定范围吗？
user-0 提问: 我又来了，内存对齐问题

回复:
user: user-1
content: 结构体在创建时，会按照占用空间最大的那个类型为单位开辟空间，所以都是按照8开辟的，第一个结构体，他会开辟88，后面的2和4，可以放到第2个8里面。第二个，先开辟一个8，放short a2,剩余6个，不够存放long a1，载开辟一个8,存放a1，然后第三次开辟一个8存放a3.这个也就面试的时候可能会问到，用处不太大。

user: user-0
content: 明白了，谢谢大佬

user: user-2
content: 内存对齐这种事，知道有这回事就行，不求自己算。因为不同平台不同编译器不同编译参数造成不同的对齐后果，所以没法算。

user: user-0
content: 哦，谢谢大佬
user-0 提问: 求助，leetcode heap buffer overflow错误

回复:
user: user-1
content: 在我印象中，二分查找好象不是这样吧？是不是应该改为这样呢？ int search(int* nums, int numsSize, int target)  {     int low = 0;     int hight = numsSize -1;     while (low <= high) {          int middle = (low + high) / 2;          if (target == nums[middle]) {              return middle;          } else if (target > nums[middle]) {              low = middle + 1;          } else {              high = middle - 1;          }     }           return -1; }
user-0 提问: 力扣网的练习题，请问这个 *returnSize = 2; 这一句意义何在

回复:
user: user-1
content: 意义在于，用来通知这个函数的调用者，你刚才让我做的问题有解，别忘了free 。

user: user-2
content: 只是有无解的话，返回值就可以的，是 NULL 还是其它有效指针。

user: user-1
content: 所以说写代码和答题是两回事。

user: user-2
content: 这个函数其实返回两个内容，一个是 return 语句返回的，一个就是这个 returnSize 表示的，它应该是调用者里的一个变量的地址，那个变量用来存放所寻得区间的大小；从这个函数里的语句来看，是没有意义，因为固定了返回有效时它总是 2，但便于函数后来的扩展和变更。
user-0 提问: 求大佬解答该如何让此软件运行，本人电脑是windows11，这个软件是老师上课要求要下载的。

回复:
user: user-1
content: 如果不能换老师的话，就换系统吧。在自己的机器上装虚拟机或者租用云主机用它的远程桌面，然后在里面安装windows98，接着在上面安装VC6。
user-0 提问: 关于形参和实参的概念

回复:
user: user-1
content: 用初中的话说，就是变量和代入变量的值嘛。

user: user-2
content: 这个问题，其实不需要深究，我的理解，举个例子吧，当定义一个函数时，比如： int max(int a, int b) {     if (a > b) return a;     return b; }  参数a,b就是型参，在实际使用该函数时，比如：max(10,5);此时，此时a=10,b=5,10和5就是实参。注意，C语言中函数的声明可以不写形参，比如：int max(int, int);也是可以的。

user: user-0
content: 嗯嗯我知道形参和实参的概念，但是我就是发现翁恺的定义还有网上搜到的定义当中都有一个点，就是在定义一个函数时，参数表里面那个是形参，我就在想那如果是主函数的话没有参数表这个说法是不是也就不存在形参这个说法了

user: user-2
content: 一样啊，标准C语言中，主函数int main (int argc,char *argv[])不是有参数吗？多数时候，为了方便，你不需要参数，直接就void main()。

user: user-0
content: 好的！谢谢大佬！！
user-0 提问: 这道题的形参有什么意义

回复:
user: user-1
content: 这些题其实也没什么意义，只不过就是让你明白，函数的传参类型有好几种，其中当传值时，即使在函数内改变了参数a的值，返回后，a还是原来的值，没改变。

user: user-0
content: 这道题考的是变量的作用域，我审题不清

user: user-2
content: 没什么意义，相当于return c++;

user: user-0
content: 还是不太明白，按照题目我的理解是，把a++代入函数funa，但是在函数funa里并没有关于a的计算式，只有一个赋值式a=c++，也就是说之前一个代入白做，完全没起到作用，我哪里理解错了？
user-0 提问: C语言题目，想知道哪错了，为什么总是输出不存在

回复:
user: user-1
content: int    flag = 0;这个地方会使 if (flag == 1)  永不成立

user: user-1
content: int len = sizeof(nums) / sizeof(int);这个地方错啦，这里会使len等于1为什么不直接len = target;

user: user-2
content: 最好把需求列出来。可以把下面的int flag=0去掉，这个会覆盖flag之前的值

user: user-3
content: break只能跳出一个for循环 可以在外面判断flag跳出外面的for

user: user-4
content: 正解

user: user-5
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。提醒：再牛×的老师也无法代替学生自己领悟和上厕所！单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 技能树看到的题 为啥是8 我不理解8 1 4怎么也是16吧。。

回复:
user: user-1
content: 建议楼主看一下其他题目，如果也是这么不清不楚的，就放弃那个网站吧。 严格说来，那个代码声明了一个结构体类型，而没有定义该类型的变量，所以就不应该占用内存。但从编译原理角度，一个类型总得有个内部handle，而handle么，一般就是机器字大小。  也许我想多了，扯远了，但总归是因为题目含糊其辞造成的。

user: user-0
content: 这是 csdn技能树的题

user: user-2
content: 我的理解，1机器字=2个int=4个char=8位，结构体=1char*+1char+1int=2+2+4=8，是这样吗？

user: user-0
content: 我用dev 运行sizeof(Test)  得到16    定义了结构体类型的变量t  运行sizeof(t) 也是16

user: user-2
content: dev本身默认一个机器字就是32位啊，跟题目不一样

user: user-0
content: 首先1个机器字是8位（8bit） 那题目中这个系统应该是64位（1byte=8bit），抛开这个不谈 我也问了别人 32位机 *占4字节 char1字节 int 4字节 对齐那应该是12 ；64位机 *占8字节 char1字节 int 4字节 对齐应该是16；

user: user-3
content: 我肯定蒙 2+2+4
user-0 提问: 第一个是录入文件的数据，为什么我想把学号输出来，却把S也带出来了，S是学生的意思，第三个是我录入的方式，a是结构体指针

回复:
user: user-1
content: 直接从文件读数据到结构中，结构的字段没结束符，所以会把S一起带出来。

user: user-2
content: 请粘贴完整代码
user-0 提问: （JAVA区成鬼区了，问问题还得来C语言区）

回复:
user: user-1
content: 渣哇中参数只有数组和对象是传引用，所有基础类型都传值，你可以int a[1]，然后传a就可以了

user: user-0
content: 谢谢大佬，问题解决，C语言区果然给力
user-0 提问: 为什么我这个只能检查第一个数据，无法检测剩下的账户是否存在

回复:
user: user-1
content: 读文件不应该这样写，读取的语句重复了2次，文件读取完成后都要关闭它，一开始就应该判定是否文件结尾，像这样会好点： int isExist = 0; // 先假定用户不存 while(!feof(fp)) {   fread(&b, sizeof(struct Users), 1, fp);   if (0 == strcmp(user->Cid, b.Cid)) {  //  用户已存在，标记它，退出       isExist = 1;       break;     } } flcose(fp); if (isExist) {     ......................如果存在，做些什么 }

user: user-0
content: 好的，我试试
user-0 提问: openjudge的题，大佬们帮帮忙，我实在看不出来该修改哪里

回复:
user: user-1
content: 试试： #include <stdio.h> #include <math.h>  int main() {   double a, b, c, f;    scanf("%lf%lf%lf", &a, &b, &c);   f = b * b - 4 * a * c, -b > -1E-16 ? b = 0 : b = - b;   f > 1E-16 ?     printf("x1=%.5f;x2=%.5f\n", b + sqrt(f) / (2 * a), b - sqrt(f) / (2 * a)) :   f < 0 ?     printf("x1=%.5f+%.5fi;x2=%.5f-%.5fi\n",             b / (2 * a), sqrt(-f) / (2 * a), b / (2 * a), sqrt(-f) / (2 * a)) :     printf("x1=x2=%.5f\n", b);    return 0; }

user: user-0
content: 修改出来一个错误，但还是显示回答错误

user: user-2
content: 不能直接计算 sqrt(b*b-4*a*c) 吧，因为里面可能小于 0 啊。先比较 b*b 和 4*a*c 的关系，再针对情况和题目要求进行下面的计算吧。
user-0 提问: 求解析，谢谢各位大佬！

回复:
user: user-1
content: 字符串转int，知识点可能在于 ASCII 的数字提取？ #include<stdio.h> int main() {     static char a[]="-12345";     int k=0,symbol,m;     if(a[k]=='+'||a[k]=='-') // 取符号         symbol=(a[k++]='+')?1:-1; // 正或者负     for(m=0;a[k]>='0'&&a[k]<='9';k++) // 取数字，非数字则退出循环         m=m*10+a[k]-'0';  // 每多一位数字，加在前一位数字进十后     printf("number=%d\n",symbol*m); }
user-0 提问: 问题 。。。。。。。。。。。。。。。。。。

回复:
user: user-1
content: 这种形式叫做递归调用展开是一个层级的形式

user: user-0
content: 那能解释一下这个展开是怎么回事，p最后赋值为7，有点不懂

user: user-1
content: 递归的理解你得先到最后一层，也就是 x==0||x==1 得情况，第一次x=9，第二次x=7...最终x==1的时候退出，返回3，反推上一层调用时，x等于3，p等于3-3=0，再反推上一层，x等于5，p等于5-0=5，再反推上一层x=7，p等于7-5=2，再反推一层x=9，p等于9-2=7  以最终程序运行结果为准，上面只是思路，可能不正确...
user-0 提问: C语言中memcpy的参数顺序设计思想是什么？为什么这样设计？

回复:
user: user-1
content: 用宏很容易解决楼主的癖好：#define memcopy(src, size, dest) memcpy(dest, src, size)

user: user-2
content: 让我想起了《仙剑奇侠传》里面的沉思鬼：”让我走可以，但你告诉我，我到底应该先迈左脚还是先迈右脚呢？“书中仙：”把脚剁掉！“沉思鬼：”然也。”(^_^)

user: user-1
content: 与x86指令设计无关(只是语法层面的设计，同样x86指令,，AT&T语法和intel语法的src、dest顺序就是反的)，dennis ritchie设计C语言的时候还没有x86，当初他移植unix的PDP-11计算机，mov指令是mov src, dest这种格式，dennis ritchie也许故意反其道而行之，算是一种恶趣味吧。

user: user-3
content: 我觉得(目的，源）这样更合理。2个差不多的函数strcpy和strncpy都是把目的地址放前面，如果把目的地址放后面，这函数参数的位置就很别扭。

user: user-4
content: 是intel的x86架构造成了  mov eax,ebx  是把ebx复制到eax  不知道为什么会这么反人类的设计方式
user-0 提问: 严重性	代码	说明	项目	文件	行	禁止显示状态 错误	C4996	'strcpy': This function or variable may be unsafe. Consider using 

回复:
user: user-1
content: 我建议开头加 #pragma warning(disable:4996)

user: user-2
content: 谢谢了

user: user-3
content: 没有解决

user: user-4
content: 为什么还是报错啊
user-0 提问: c语言输出hello,world 但判断结果一直是WA,给孩子整不会了,看不出错误.

回复:
user: user-1
content: #include<bits/stdc++.h> using namespace std; int main(){       cout<<"********************"<<endl;     cout<<"    Hello,World!"<<endl;         cout<<"********************"<<endl;             return 0; }  这么写！

user: user-2
content: 是不是中文逗号错了HELLO,WORLD

user: user-0

user: user-3
content: 第一行总共20个号，后面无空格，第二行先是4个空格，然后是Hello,World!，两个单词之间有一个逗号，第二个单词后面跟一个感叹号，后面没有任何空格。第三行是20个号。 上面这句话，是要求还是你的理解？

user: user-0
content: 是要求

user: user-4
content: 兄弟 截图出来看一下，

user: user-2
content: 可能把第三个\n去掉？

user: user-0
content: 试过了,不行
user-0 提问: 字节问题（凑够10个字太离谱了）

回复:
user: user-0
content: 问题解决了https://blog.csdn.net/AlbertFly/article/details/52065629

user: user-1
content: 可以自己作一个实验，像这样：     printf("%p\n", &un.s);     printf("%p\n", un.c);  分别在屏幕上打印出un.s和un.c的首地址，它们是指向相同的地址，是不是就很好理解了？

user: user-0
content: 谢谢，我问题没说清楚，其实是16进制怎么存的问题，现在搞懂了

user: user-2
content: union 成员是同一个东西，就如麻将里的一付牌 一二三万，在一起就是这么一组牌，分开看，不就分别是 一万、二万、三万嘛。

user: user-0
content: 谢谢，我问题没说清楚，其实是16进制怎么存的问题，现在搞懂了
user-0 提问: 递归......................

回复:
user: user-1
content: f(0)=1f(1)=1f(2)=f(1)+f(0)=2f(3)=f(2)+f(1)=3f(4)=f(3)+f(2)=5f(5)=f(4)+f(3)=8f(6)=f(5)+f(4)=13 这个递归公式就是f(n)=f(n-1)+f(n-2)

user: user-0
content: 多谢大牛

user: user-2
content: 优化手痒系列：int f(int n){  return n < 2 ? n > -1 : f(n - 1) + f(n - 2);}

user: user-0
content: six

user: user-3
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！递归函数关注以下几个因素·退出条件·参数有哪些·返回值是什么·局部变量有哪些·全局变量有哪些·何时输出·会不会导致堆栈溢出

user: user-0
content: 感谢大牛
user-0 提问: 这个for 循环哪里出错了，系统一直报错

回复:
user: user-1
content: j<n,i<m是一个逗号运算，逗号运算的机理：先计算左边的操作数，再计算右边的操作数。右操作数的类型和值作为整个表达式的结果。因此，你程序中只有i<m有效，j<n被抛弃了。

user: user-2
content: 哪有问题

user: user-0
content: 好像是格式不对，就是删去一个int 就没有问题

user: user-2
content: 同一般声明变量一样逗号后面当然是不用再声明类型

user: user-3
content: 除了不少心打了中文符号，这个for循环好象没有问题啊，贴完整代码吧。

user: user-0
content: 就是我删去一个Int就没有问题，不知道为什么

user: user-4
content: j<n,i<m; 这个中间语句有问题吧，中间语句是作为判断条件的，你这么写，怎么理解呢？写成 (j<n)&&(i<m); 或 (j<n)|| (i<m); 分别对应两个条件必须同时满足，两个条件某一满足即可，看你实际的情况了。

user: user-0
content: 哦哦，我好像没考虑过这个问题，感谢

user: user-5
content: 我一直说要把语法学透，我是认真的。
user-0 提问: <C语言>我感觉我的程序漏洞百出，有没有大佬帮忙看一下……

回复:
user: user-0
content: 谢谢，现在明白了，修改了很久，还有就是发现txt文档的编码是UTF-8，读出来全是乱码，改成ANSI才行

user: user-1
content: fp = fopen()  这个地方应该检查文件打开是否异常char  p[8][9] = {0};读文件应该是  for (i = 0; i < 7; ++i)
user-0 提问: 十分钟带你学会C语言的文件操作

回复:
user: user-1
content: 不要把fopen("...","...");fscanf,fprintf,fgets,fgetc,fputc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待和fopen("...","...b");fseek,ftell,fread,fwrite,fscanf,fprintf,fgets,fgetc,fputc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待弄混了

user: user-0
content: 谢谢支持！
user-0 提问: C语言大一PTA输入一个英文句子，将每个单词的第一个字母改成大写字母。

回复:
user: user-1
content: int i,j;    char a[101];    gets(a);     if(a[0]>='a'&&a[i]<='z')//这里的i 是局部变量 而且没有赋初始值，它是一个随机值，所以a[i]很可能会越界；改成a[0]//后面的 if(a[i]=='\0')   '\0'是字符串结束的标志，不是语句间的间断标识符

user: user-2

user: user-2
content: 这里if里面一个a[0]一个a[i]好像有点不对
user-0 提问: 有5本书，每本书包含书号，书名，作者，价格，出版社的信息，编写函数：1.输出5本书信息。2.输出价格最高的那本书的信息。3.输出价格最低的那本书信息。在主函数中使用这3个函数

回复:
user: user-1
content: 同学，请参考： #include <stdio.h> // #include <string.h>  struct MyBook {     char number[20]; // 书号     char title[100]; // 书名     char author[20]; // 作者     double price; // 单价     char publisher[100]; // 出版社  };  #define MAX_BOOKS 1 // 书的数量  MyBook myBooks[MAX_BOOKS]; // 书本列表 int HighestIndex = 0; // 最高价书的索引 int LowestIndex = 0; // 最低价书的索引  void inputData(); // 输入资料 void printData(int index); // 打印资料  int main() {      inputData();     printf("\n\n列印所有书本的资料：\n");     printData(-1);     printf("\n\n列印最高价的书本资料：\n");     printData(HighestIndex);     printf("\n\n列印最低价的书本资料：\n");     printData(LowestIndex);      return 0; }  // 输入资料 void inputData() {     double highestPrice = 0.00; // 最高价     double lowestPrice = 999999.00; // 最低价     for (int index = 0; index < MAX_BOOKS; index++) {         // 如果严谨点，应该检测书号是否重复以及单价不能少于等于0         printf("--- 请输入第%d本书的资料 ---", index + 1);         printf("\n\t书号：");         scanf("%s", myBooks[index].number);         printf("\t书名：");         scanf("%s", myBooks[index].title);         printf("\t作者：");         scanf("%s", myBooks[index].author);         printf("\t单价：");         scanf("%lf", &myBooks[index].price);         printf("\t出版社：");         scanf("%s", myBooks[index].publisher);         // 比较最高价         if (myBooks[index].price > highestPrice) {             highestPrice = myBooks[index].price;             HighestIndex = index;         }         // 比较最低价         if (myBooks[index].price < lowestPrice) {             lowestPrice = myBooks[index].price;             LowestIndex = index;         }     } }  // 打印资料 void printData(int index) {     int startNumber = 0;     int endNumber = MAX_BOOKS;     if (index != -1) {         startNumber = index;         endNumber = index + 1;     }     printf("================================================================\n");     for (int i = startNumber; i < endNumber; i++) {         printf("书  号：%s\n", myBooks[i].number);         printf("书  名：%s\n", myBooks[i].title);         printf("作  者：%s\n", myBooks[i].author);         printf("单  价：%6.2lf\n", myBooks[i].price);         printf("出版社：%s\n", myBooks[i].publisher);         printf("----------------------------------------------------------------\n");     } }
user-0 提问: 问题 

回复:
user: user-1
content: 二、填空题1.定义s[0].x 等于 1;s[0].y 等于 3;s[1].x 等于 2;s[1].y 等于 7;问 s[0].x 乘以 s[1].x 等于几？(也就是printf语句中的内容)  ：）

user: user-2
content: 同学，如果把s[2]={1,3,2,7}改为s[2] = {{1, 3}, {2, 7}}是否更容易理解？是不是一下子就明白了？在C语言中所有的多维数组其实在内部都是一块连续的储存空间，也就是，它其实就是一维数组的扩展。

user: user-0
content: 还是不理解。。。

user: user-2
content: s[2]={1,3,2,7}相当于定义了一个上述结构的数组，那么，s[0].x=1，s[0].y=3，s[1].x=2，s[2].y=7，结果，1*2=2，就是这么简单啊。

user: user-0
content: 谢谢

user: user-3
content: 我想知道这样直接的问题怎么会有歧义的

user: user-0
content: 不，我只是不懂它的意思，那s【0】.x*s[1].x是什么意思

user: user-4
content: 这位同学可能没整明白*是乘以的意思吧哈哈哈

user: user-0
content: 是的，我还以为是什么别的意思
user-0 提问: 在调试时出现了unhandled exception 0xC0000005:Access Violation的错误

回复:
user: user-1
content: malloc的空间都不够大，所以就越界访问了。sizeof一个指针只有4字节，应该sizeof(struct xxx)或者sizeof(*Edge)

user: user-2
content: 看不懂，但从运行上来看，CreateGraph() 里的 malloc() 应该是 malloc(sizeof(GNode)) 吧。 另外，输入的 scanf() 里不要用中文汉字的逗号做分隔符，最好是用英文的空格吧。

user: user-0
content: 请大家帮帮忙吧
user-0 提问: 为什么运行不起啊，求教

回复:
user: user-1
content: 实际应用中，不见得所有环境都是‘好系统’，‘好机器’，‘好软件’...；vc6.0作为c语言基础的学习工具，个人认为很有必要，再过几年，新的又变成旧的了...，其实掌握知识才应是重点。

user: user-1
content: 如果只是计算数组中的元素个数，为什么不用 sizeof(A)/sizeof(A[0]); 代码中的指针数组和数组能混用？！

user: user-2
content: 阻止编译成功的是下面的error，而不是显示出来的这两个warning当然对照error改完回头再改这些warning也好

user: user-3
content: 看来如今大学老师都是误人子弟,还用20年前的工具,可以下载VS2019,好用多了,报错也更智能易懂
user-0 提问: c语言结构 这个结果一直都是不对的

回复:
user: user-1
content: 看最后的输出，是要找出最低成绩的记录号，就以 &i 为参数啊：  fun(a,&i);找出最小成绩数，一次遍历就可以了吧，两重循环，是排序性的了：  void fun(struct Student a[],int *s) {     int i,b;     *s = 0;  // s=&a[0];     b = a[0].score;     for ( i = 1; i < N; i++)       if (a[i].score < b)          {              *s = i;              b = a[i].score;          }     return;          /*     for(i=0;i<N;i++)     {         for(b=1;b<=N-i-1;b++)         {             if(a[i].score>a[i+b].score)             *s=a[i+b];             else             *s=a[i];         }     }     */ }
user-0 提问: 为什么运行起来不能执行么，我令n1=3就能正常运行，不该是swap(n1,n2)不发生改变swap（n2，n3发生换位么

回复:
user: user-1
content: 代码中 'if(a > b)' 的意思是地址比较，不是(int)比较

user: user-1
content: void swap(int* a, int* b) {     int temp = 0;      if( (*a) > (*b) )     {         temp = (*a);         (*a) = (*b);         (*b) = temp;     } }

user: user-2
content: 明明是你自己换成这样的。那两个1换了位置，然而你看不出来它们的不同。

user: user-0
content: 我执行的3个当中 swap(n1,n2)   n1&lt;n2 不执行 swap（n2，n3）   n2&gt;n3 执行   n3=2  n2=1 swap（n1，n2）     n1=n2     不执行啊 这样不该是 n1=1  n2=1  n3 =2 么 是我哪理解错误了么求教
user-0 提问: 为什么字符串中带有NUMBER后换显示乱码啊

回复:
user: user-1
content: 如果非要用NUMBER，可以改为char s[NUMBER+1]="hello"，另外，变量j没有使用，int temp改为char temp更好。

user: user-0
content: 懂了谢谢

user: user-2
content: 字符串需要结束符，所以你不写NUMBER的那个相当于数组大小是6，而写了NUMBER的那个就造成位置不够，被迫越界了。

user: user-0
content: 懂了谢谢
user-0 提问: 一道循环题 

回复:
user: user-1
content: #include <stdio.h>   int main() {     int s[3][5];     int max = 0; // 假设最高分=0     int z = 0; // 假设第1个学生是最高分     int x = 0; // 假设第1课程是最高分              for(int i = 0; i < 3; i++) {         for(int j =0; j < 5; j ++) {             while(1) {                 printf("\n请输入第%d个学生的第%d门课程的成绩：", i + 1, j + 1);                 scanf("%d", &s[i][j]);                 if (s[i][j] < 0 || s[i][j] > 100) {                     printf("输入的成绩无效，请重新输入！\n");                 }                 if (s[i][j] > max) { // 输入的最高分比假设的高，替换它                     max = s[i][j];                     z = i + 1;                     x = j + 1;                 }                 break;             }         }     }          printf("\n最高分数是：%d", max);     printf("\n所对应的学生是：%d", z);     printf("\n所对应的课程是是：%d", x);          return 0; }

user: user-1
content: 跟昨天这位同学的题目没差多少啊，你们是不是同一学校？https://bbs.csdn.net/topics/603675455
user-0 提问: 关于整型的一点小疑问，求大佬解惑

回复:
user: user-1
content: 八进制的数字只能是0-7，逢8要进1。

user: user-2
content: 可能 c 里把 0 打头的数值认为是八进制而非其它，所以 8 出现在 068 里就突兀了。

user: user-0
content: 原来是这样，非常感谢
user-0 提问: 各位能不能帮我改善一下，感觉我的有点奇怪

回复:
user: user-1
content: 同学，函数的声明，不要在main()内，这是最基本的语法基础了。还有，为什么要做的这么复杂呢？在输入的时候就直接可以找到最高分，根本不需要另写函数啊，请参考我的代码： #include <stdio.h>  int main() {     int s[3][5];     int max = 0; // 假设最高分=0     int z = 0; // 假设第1个学生是最高分     int x = 0; // 假设第1课程是最高分              for(int i = 0; i < 3; i++) {         for(int j =0; j < 5; j ++) {             while(1) {                 printf("\n请输入第%d个学生的第%d门课程的成绩：", i + 1, j + 1);                 scanf("%d", &s[i][j]);                 if (s[i][j] < 0 || s[i][j] > 100) {                     printf("输入的成绩无效，请重新输入！\n");                 }                 if (s[i][j] > max) { // 输入的最高分比假设的高，替换它                     max = s[i][j];                     z = i + 1;                     x = j + 1;                 }                 break;             }         }     }          printf("\n最高分数是：%d", max);     printf("\n所对应的学生是：%d", z);     printf("\n所对应的课程是是：%d", x);          return 0; }

user: user-2
content: 用c++做，超级简单（sort（））。你写的懒得看。

user: user-0
content: c都还没学明白
user-0 提问: 这个值为什么是8，我实在想不通。

回复:
user: user-1
content: int ivar=10;     int *pvar=&ivar; // 它指向ivar的地址     *pvar=8; // 相当于ivar=8     printf("ivar=%d\n",ivar); // ivar=8，是没有问题。     printf("pvar=%d\n",*pvar); // 这句就有问题了，pvar是指针，显示的却是解引用，会让人感到迷惑的

user: user-1
content: 我在初学指针的时候，也容易搞混指针声明和解引用。

user: user-0
content: 谢谢

user: user-2
content: int *p=&a;的正确理解是int * p;p=&a;而不是像你以为那样理解。

user: user-0
content: 谢谢
user-0 提问: select可读问题？

回复:
user: user-0
content: 已经找到原因并解决

user: user-1
content: 所以你提问的时候希望别人解释，解决了以后自己却不解释的做法是会给别人添堵的。 真的懒得解释不妨删贴哦。
user-0 提问: 计算机大一上课设作业

回复:
user: user-1
content: 请用数据库来实现这个功能,非常简单。去搜索  C语言连接操作数据库

user: user-1
content: 请用数据库来实现这个功能,非常简单。去Google  C语言连接操作数据库

user: user-2
content: 先标记，周六日有时候，把代码写出来，跟你一起学习。

user: user-3
content: 因为你说你只学到指针，所以这题目里边没有要求你上次输入的数据下次使用，很合理呀。
user-0 提问: 求一个三位数的个位，十位，百位？ 1）用3种方法解题？数学法2种+字符法1种。 2）求一个四位数？ 3）求一个不固定位数？

回复:
user: user-1
content: 同学，请参考我之前的作业，可以求出C语言任意整数的位数及其对应位的数值： #include <stdio.h>  #define MAX_UNIT 10 // C语言，32位最大整数是10位  int main() {     const char *units[MAX_UNIT] = {"个", "十", "百", "千", "万", "十万", "百万", "千万", "亿", "十亿"};     int digits[MAX_UNIT] = {0};     int number;          printf("请输入一个整数：");     scanf("%d",&number);      int remainder = number;    // 余数     int length = 0; // 位数     for(; length < MAX_UNIT; length++) {         int result = remainder % 10; // 对应位数的数字         if (result > 0) {             digits[length] = result;         }         remainder /=  10;         if (remainder <= 0) { // 当没有余数时，中止循环             break;         }     }          printf("位数：%d\n", length + 1);     for(int i = MAX_UNIT - 1; i >=0 ; i--) {          if (digits[i] > 0 || i <= length) {             printf("%s位：%d\n",units[i], digits[i]);         }     }          return 0; }

user: user-2
content: 百位应该是b=a/100

user: user-0
content: 不太理解

user: user-3
content: sprintf或者itoa
user-0 提问: 不是字符串数组不能带&么为什么这个程序不带运行不起，反而带了可以运行呢求解

回复:
user: user-1
content: s是数组s[i]是char

user: user-0
content: 老师我是用char定义的啊s［］

user: user-0
content: 哦哦老师我懂了我没有区分开两个的意义谢谢老师
user-0 提问: 我的这个8皇后for循环出不来怎么办

回复:
user: user-1
content: 楼主这代码，级联10个for，太凶猛了~

user: user-0
content: 汗，其他的什么递归回溯看不懂，就能看懂for。😥

user: user-2
content: 仅供参考： #include <stdio.h> int d[8][8]; int n; void queen8(int L) {     int x,y;      if (8==L) {         n++;         printf("%d\n",n);         for (y=0;y<8;y++) {             for (x=0;x<8;x++) { //              printf("%d",d[y][x]);                 if (d[y][x]) printf("■");                 else         printf("□");             }             printf("\n");         }         return;     }     for (x=0;x<8;x++) {         for (y=0;y<L;y++) {             if  (              d[y][x      ]              || (x-(L-y)>=0 && d[y][x-(L-y)])              || (x+(L-y)< 8 && d[y][x+(L-y)]))                 break;         }         if (y>=L) {             d[L][x]=1;             queen8(L+1);             d[L][x]=0;         }     } } int main() {     int y,x;     for (y=0;y<8;y++) {         for (x=0;x<8;x++) {             d[y][x]=0;         }     }     queen8(0);     return 0; }
user-0 提问: 这问题怎么解决啊？新手，求指点

回复:
user: user-1
content: 同学，这个排序函数float average(float a[10])不能传值，要么引用或指针，否则，返回的不是你所要的。我之前有做过差不多的作业，请参考：https://blog.csdn.net/SuperC_Game/article/details/121540497?spm=1001.2014.3001.5502
user-0 提问: 【求助】无头结点单链表尾插法失效，编译无报错，运行终止

回复:
user: user-1
content: 怎么要这样写初始化链表函数？除了逻辑不对外，还要传一个参数进去，直接在里面分配一个，然后返回不是更好吗？像这样： /**  * @brief    创建节点  * @return    返回创建后的节点，它的数据域、指针域都指向NULL  **/ MYNODE *MyLinkedListCreate() {     // 分配链表的节点储存空间（使用c语言库函数malloc分配储存空间实质就是在内存分配了一块连续     // 的储存空间，它返回的就是这块储存空间的首地址，所以，需要对它进行强制转换为LinkedList*指针类型     MYNODE *pNode = (MYNODE *) malloc(sizeof(MYNODE));     // 要养成将还没有分配到内存空间的指什指向NULL的好习惯！     pNode->_pData = NULL; // 它的数据域指向NULL     pNode->_pNext = NULL; // 它的指针域也指向NULL（下一个节点）      return pNode; } // End of LinkedListCreate()   同学，你如果对这段代码有兴趣，可以去我在的B站下载，里面有百度网盘的分享，可以下载全部的源码：https://space.bilibili.com/1901488254

user: user-2
content: 逻辑上整个不对啊。Init() 函授里，L=malloc() 了，接着却 L=NULL; ？在 Tail() 函授里，p==NULL 时，却硬要往 p 里塞数据？

user: user-0
content: 哦哦，那把L=malloc删掉，直接L=NULL，那请问第一个元素怎么添加

user: user-0
content: 我知道了，谢谢大佬提醒！
user-0 提问: 求二维整型数组的“最大点”。二维数组的“最大点”定义为：某个数是所在行的最大值，并且是所在列的最大值。注意：某行或某列上可能有多个“最大点” 求大佬帮忙看一下，为什么得不到想要的输出

回复:
user: user-1
content: 同学，请参考我的修改：  #include <stdio.h>  int main() {     int i, j, n, m, flag = 1, max, c = 0, d = 0, k;     scanf("%d%d", &n, &m);     int a[n][m];     for (i = 0; i < n; i++) {         for (j = 0; j < m; j++) {             scanf("%d", &a[i][j]);         }     }     // 下面是原式，不知道想表达什么，需要这么多个for循环？ //    for (i = 0; i < n; i++) { //        flag = 1; //        for (j = 0; j < m; j++) { //            max = a[i][0]; //            if (a[i][j] > max) { //                max = a[i][j]; //                c = j; //                d = i; //            } //        } //        for (k = 0; k < n; k++) { //            if (a[k][c] > max) { //                flag = 0; //            } //        } //        if (1 == flag) { //            printf("%d %d %d\n", max, d + 1, c + 1); //        } //    }     // 把上面的原式，改为这样：     max = a[0][0]; // 假设第1个元素就是最大值     for(i = 0; i < n ; i++) {         for(j = 0; j < m; j++) {             if (a[i][j] > max) {                 max = a[i][j];                 c = i;                 d = j;             }         }     }          printf("%d %d %d\n", max, d + 1, c + 1);          return 0; }  除了上面的方法，还有更紧凑的，因为C语言的多维数组实质是一维数组的扩展，所以，也可以只使用一个for即可。

user: user-2
content: 没仔细看题哦

user: user-1
content: 对，我没仔细看题目，以为只是求它的最大值。

user: user-0
content: for(i=0;i&lt;n;i++)     {         flag=1;         for(j=0;j&lt;m;j++)         {             max=a[i][0];             if(a[i][j]&gt;max)             {                 max=a[i][j];                 c=j;                 d=i;             }         }   上面这个for循环我是先把最大值定义为每一行的第一个值，找出一行的最大值后记录他的行标和列标  然后下面这个for循环是判断它所在列是否还有比它大的值， 有就flag=0不输出位标   for(k=0;k&lt;n;k++)         {             if(a[k][c]&gt;max)             {                 flag=0;             }         } if(1==flag)             {                 printf("%d %d %d\n", max, d+1, c+1);             }if(1==flag)             {                 printf("%d %d %d\n", max, d+1, c+1);             }  然后回到第一个for循环， 接着找出i=1也就是第二行所在的最大值，重复上面再判断所在列是否为最大；

user: user-2
content: 调试啊，走一下第二行，就会发现，max=a[i][0] 应该是在 for(j) 循环的外面吧。

user: user-0
content: 哦哦，对对，我调整了一下，输出498的值了

user: user-0
content: 多谢多谢
user-0 提问: 下了个gcc11.2，不知道怎么安装

回复:
user: user-1
content: 那个10.3的安装实测是可以的，如果不行应该是你的当地网络访问github有问题

user: user-1
content: 或者下载这里：https://github.com/jmeubank/tdm-gcc-src/releases

user: user-0
content: gcc 10.3我下载了，但是不会安装，打开是这样的tdm64-gcc-10.3.0-2.exe  前面两个选了提示什么下载失败，最后一个我也不敢选，还有为什么只有exe版，没有压缩包？

user: user-2
content: 同学，欢迎看看我弟弟在B站有关Dev-C++安装视频（在百度网盘有最新的下载版本）。

user: user-2
content: https://www.bilibili.com/video/BV1eq4y1M7XY

user: user-0
content: 你没有回答我的问题

user: user-0
content: 正好我问一下，源码包和预编译的二进制发布有什么区别？分别代表什么，这是我下载的8.1版本，x86_64-8.1.0-release-posix-seh-rt_v6-rev0.7z，解压缩到DEV C++里就可以直接用，这是源码还是二进制？如果要下载下来直接用的话，应该下载哪个？ 打开是这样的

user: user-1
content: 这个是源码包还是预编译的二进制发布，二进制发布一般都用TDM，目前只更新到gcc 10.3：https://jmeubank.github.io/tdm-gcc/download/
user-0 提问: DEV C++ 中文乱码是什么原因

回复:
user: user-1
content: win10，但是应该一样的，控制台子系统从win2000以来几乎没有变化

user: user-0
content: 难道是系统的原因，你是win7还是10？

user: user-1
content: 我试了，是好的：

user: user-1
content: 因为它默认存储的源文件编码是utf8，中文字符串都是utf8编码，你需要在控制台执行chcp 65001，然后再运行你的程序就正常了。也可以存源程序的时候选择ANSI编码，这样就和dev-c++ 5.11一样了。

user: user-0
content: 默认就是ANSI，没动过，换成utf8也不行。你说控制台是指cmd命令下输入chcp 65001吗，我试了，还是不行

user: user-2
content: 在regedit中找到HKEY-CURRENT-USER下面的console，然后找cpp后缀的，看你那个控制台是在那个盘里面，如果是c盘就找到c盘那个，然后找到旁边的codepage，弹出来的对话框里面选择十进制改为，65001，点确定，然后重新编译允许就可以了
user-0 提问: 最大公约数问题 新手求教！！！

回复:
user: user-1
content: 没有吧，vc2008后一切正常。可能是你输入数据不合 scanf() 的规格，它要求两数据用一个英文逗号分隔。

user: user-0
content: 是的，解决了， 谢谢大佬
user-0 提问: 为什么第十行去掉0就不能将数字保存到s[]中

回复:
user: user-1
content: j 的除以 10 的余数，是 0-9 间的数值，+'0' 就是对应的用于显示的字符了；所以，不是没有存起来，而是存的数值，要显示成字符，就要 +'0'

user: user-0
content: 对啊，我就奇怪为什么加了0就可以把数字显示成字符
user-0 提问: 为什么第一二个打印不出来，而第三个可以

回复:
user: user-1
content: 同学，第一、二个你使用的是传进来的实数，它分配空间已是固定了，你不能简单地重声明一下或不声明就认为能改变它们的大小，就是错误的。我老师说，在习惯上，主程序main最好在它的形参前加上关键字const会比较好。

user: user-0
content: 学到了，谢谢

user: user-2
content: 要写代码，请对语法规则保持尊重。
user-0 提问: 如果avg出现负数是不是因为数字越界了

回复:
user: user-1
content: 整数的数组可能包括负数，累加的结果出现负数，有什么问题呢？

user: user-0
content: 可是我输入的是正数

user: user-0
content: 我又发了图您看看哪里出问题了

user: user-1
content: 同学，它们累计后的值，超出C语言的整数取值范围了，改为long long试试，还有，把运算改在同一个for循环内，可以使代码更紧凑。

user: user-2
content: -1、-2、-3的平均值是多少

user: user-0
content: 有的正数得出也是负的
user-0 提问: 我输入3.142412swich不应该只加3就退出了么，为什么后面会显示其他数字也加了啊求问

回复:
user: user-1
content: switch内的break只break switch，不会 break while

user: user-2
content: 同学，你输入了多个字符后，如果你没有清除键盘缓冲区，getchar()会将它们都读取，所以，每一次调用getchar()函数后，最好清除一下键盘缓冲区，像这样： #include <stdio.h>  int main(void) {     int i, ch;     int cnt[10] = {0};    /* 数字字符的出现次数 */      while ((ch = getchar()) != EOF) {         setbuf(stdin, NULL); // 加上这1行：清除键盘缓冲区【windows可以直接用fflush(stdin)】         switch (ch) {             case '0' :                 cnt[0]++;                 break;             case '1' :                 cnt[1]++;                 break;             case '2' :                 cnt[2]++;                 break;             case '3' :                 cnt[3]++;                 break;             case '4' :                 cnt[4]++;                 break;             case '5' :                 cnt[5]++;                 break;             case '6' :                 cnt[6]++;                 break;             case '7' :                 cnt[7]++;                 break;             case '8' :                 cnt[8]++;                 break;             case '9' :                 cnt[9]++;                 break;         }     }      puts("数字字符的出现次数");     for (i = 0; i < 10; i++)         printf("'%d'：%d\n", i, cnt[i]);      return 0; }

user: user-0
content: 哦哦哦懂了谢谢老师了

user: user-3
content: 那就是 break; 只 break 了 switch() 吧，外面还有个 while()

user: user-4
content: 写switch 为什么没有 default ???

user: user-5
content: 那么while是啥意思呢？
user-0 提问: 求助getchar清理缓冲区的问题

回复:
user: user-0
content: 感谢!

user: user-1
content: 关系运算符优先级高于赋值符号事实上tmp要么是1要么是0，从来不是getchar的返回值啊

user: user-2
content: 看生成的代码，大致是被理解成了 tmp=(getchat()!='\n') 但看你的描述，似乎应该是 (tmp=getchar())!='\n'  就是符号的优先级和想象的不一样，加全了保险但可能看着眼花缭乱了。

user: user-0
content: 求求 ！十分感谢。
user-0 提问: 为啥我c语言 程序 本地可以 传到oj 就出现了运行错误

回复:
user: user-1
content: 同学，我修改了部份代码，你看改成这样是不是更好： #include <stdio.h>  int main() {     long n, k;     scanf("%ld%ld", &n, &k);     // long a[1100]; // 原式：没有必需啊，重量怎么可能是长整数呢？     int a[1100];     // long long sum; // 原式：没有必需啊，重量怎么可能是长整数呢？     int sum;     for (int i = 1; i <= n; i++) {         // scanf("%ld", &a[i]); // 原式         scanf("%d", &a[i]);     }     for (int i = 1; i <= k; i++) {         int l, r;         l = 0;         r = 0;         scanf("%d%d", &l, &r);         sum = 0; //        while (l <= r) { // 直接用for循环不是更好吗 //            while (a[l] == 0) { // 原式：不明白想表达什么意思？ //                l = l + 1; //                if (l > r) //                    break; //            } //            if (l > r) // 这个退出条件也是多余的 //                break; //            sum = sum + a[l]; //            l = l + 1; //        }         for (; l <= r && r < n; l++) { // 使用for循环，同时也要检测是否越界             sum += a[l];         }         // printf("%lld\n", sum); // 原式         printf("%d\n", sum);     }     return 0; }

user: user-1
content: 同学，这一段想表达什么呢？跟题意没一点关系，如果a很大，它就是个死循环无异？while(a[l]==0){    l=l+1;    if(l>r)break;}

user: user-0
content: 数组改成a[11000]也是运行错误
user-0 提问: 求助！我的字符串输出结果最后一位总是随机多一个符号TAT

回复:
user: user-1
content: 同学，下面这一行中，m是不是没有初始化值，是不是应该把它的条件改为j<260    ?    for (int j = 0; j <= m; j++) {        line1[j] = line2[j] = '\0';    }
user-0 提问: 请大佬帮忙看看这个约瑟夫环问题，不知道为什么我这个代码没有输出结果 呜呜

回复:
user: user-1
content: 同学，你的代码有些地方出错了，也有些不合理，我已修改，请参考： #include <stdio.h>  int main() {     int i, j, k, m, n, x, nout;     int N, S, W;     printf("请输入小孩数N:\n");     scanf("%d", &N);     // int people[N + 1]; // 原式：N + 1是什么意思呢？     int people[N];     char result[N];     char name[N];     printf("请依次输入他们的名字：\n");     for (m = 0; m < N; m++) {         scanf("%s", &name[m]);         people[m] = 0; // 在这里初始化，不需要多一个for循环     }     printf("请输入W，S。输入时用','隔开\n");     scanf("%d,%d", &W, &S);     // for (i = 0; i < N; i++) { // 原式：多余的循环     //    people[i] = 0;     // }     k = 0;     x = W - 1;     nout = 0;     while (nout != N) {         x++;         // if (x = N + 1) { // 原式：逻辑表达式错误了         if (x >= N) { // 改为这个就可以了             x = 0;         }         if (people[x] == 0) {             k++;             if (k == S) {                 people[x] = 1;                 k = 0; //                for (j = 0; j < N; j++) { // 不明白想表达什么？ //                    result[j] = name[x]; //                }                 result[nout++] = name[x];             }         }     }     for (n = 0; n < N; n++) {         // printf("%s", result[n]); // 原式：你定义的是char数组！         printf("%c", result[n]);     }      return 0;  }

user: user-0
content: 非常感谢大佬的修改与指正!☺️ 感激不尽

user: user-1
content: 我还是小学生

user: user-0
content: 哇！那你也太厉害了
user-0 提问: 学C的原动力 

回复:
user: user-1
content: 如果不做运动员，或者说想做也做不了，那么跑步有什么用，这关系到你的第一需要

user: user-2
content: 汇编和C是基础语言，程序员必会，否则属于不及格～

user: user-3
content: 所以说80%的程序员都不及格
user-0 提问: 求教（如何理解这段代码？）

回复:
user: user-1
content: 同学，我开始学C语言的时候，都习惯都每一行的代码都写注解，像这样： #include <stdio.h> // 包含标准输入输出的头文件 #include <stdlib.h> // 包含标准库函数的头文件：如果不使用system()函数，可以不包含  int main() { // C语言主程序入口：无参数     int i, j; // 声明两个整型变量：i, j     i = 1; // 将变量i初始化为1          while (i <= 10) { // 第1个while循环开始，它的执行条件是变量i小于或等于10         j = 1; // 将变量j初始化为1         while (j <= i) { // 第2个while循环开始，它的执行条件是变量j小于或等于i             printf("OK  \n"); // 每一循环，在控制台窗口上打印"OK"并换行             // printf("i = %d, j = %d, OK\n", i, j); // 可以把i,j的值都打印出来，更好理解它             j++; // 每一循环，变量j自增1，也就是j = j + 1;         }         i++; // 每一循环，变量i自增1，也就是i = i + 1;     }          system("pause"); // 调用系统命令，暂停程序运行，直到按下任何键才继续          return 0; // 程序结束，并返回值0（返加值0通常表示程序没有问题） }  // 进阶学习，可以发现，将上述程序改为for循环更好，可以试一下能否自己改为for循环呢？
user-0 提问: 同时int两个变量，为什么一个是0而另一个是1？

回复:
user: user-1
content: 变量是先定义再赋值最后是使用。int i,j;这样写只是定义了两个变量，从内存的角度说就是分配了两个连续的4字节空间，用于存储i和j。但是没有给这两个空间中赋初始值，内存中现有的数据是什么，谁都不知道。所以就出现你说的这种情况。你反复的执行这段代码，每次执行可能都没有更改分配到的内存空间，所以是你看的的样子。你把代码换到其他人的电脑上试试，或者重启计算机后再运行，可能结果就不一样了。

user: user-2
content: 程序里未初始化的变量，相当于食堂里的碗（这个比方有点恶心，忍一忍）由于是内存里的事，不涉及卫生，所以这俩碗没必要洗，接着用就行。之前盛过米饭的就有两粒米在上面，之前盛过肉片的就有两滴油在上面。你碰巧拿的就是这俩碗，你喜欢叫它 i 或者 j 都无所谓。

user: user-3
content: 函数内的变量是在栈里的，其初始内容，和调用这个函数的那里刚才如何使用堆栈有关，尤其的之前调用的另外个函数，操作和动作比较固定，那这里基本上也是固定。可以试试把这个函数复制为另外个名字，先调用复制后的，给 i 和 j 设下值，再进这个函数直接看看是什么内容。
user-0 提问: 求大佬帮助指点，不知道哪里错了

回复:
user: user-1
content: 定义的数组太小，题目里明确了数组大小要到1000×1000

user: user-2
content: 1、是不是忘记判定数组的大小（n)是否有效？操作（b）是否有效？行列号（c）是否有效？2、每个操作（b）最后都要用同一语句：printf("\n");，是不是可以放到for(i=0;i<a;i++)循环体的最后呢？
user-0 提问: 此道wihle题，为什么我的写法和书上的不一样？

回复:
user: user-1
content: 两个情况下，分别输入 0 看看结果？

user: user-0
content: 确实，书后面也有注释，我没看到

user: user-2
content: 我们小学数学里面，明确最小的一位数是1，不是0，你是对的。
user-0 提问: 为什么我输入0后它还是让我继续输入

回复:
user: user-1
content: 同学，请修改条件：while(i != 0)

user: user-0
content: 那可以告诉我while(1)怎么用吗？感激不尽

user: user-1
content: 非要用while(1)不可，这么倔强吗？那就在scanf("%d", &i);这一行的后面，增加1个退出条件：if (i ==0) break;

user: user-0
content: OK，谢谢你
user-0 提问: 这个删去重复数字的代码哪里出问题了

回复:
user: user-1
content: 同学，同一个数组，你左移一下，右移一下，就会出现空窿，还是原来的数组吗？不就是删除重复的数字吗，为什么要搞的这么复杂呢？在输入的时候，查询一下数组有没有刚输入的数字，有就取消它，让它重新输入就不行了吗？

user: user-0
content: 可是我不知道怎么取消它，能给点提示吗

user: user-1
content: 同学，代码如下，所有提示非必要，只是让人容易理解： #include <stdio.h>  int main() {     int N = 5;     int num[N];     int i, j, k;     int n, repeat;      for (i = 0; i < N;) {         printf("请输入第%d个数字（共%d个）：", i + 1, N);         scanf("%d", &n);         repeat = 0;         for (k = 0; k <= i; k++) { // 查询已输入的数字，有没有重复的             if (num[k] == n) { // 已有这个数字，不记录它，重新输入                 repeat = 1;                 break;             }         }         if (!repeat) { // 没有重复，记录它             num[i++] = n;         } else {             printf("数字：%d已存在，请重新输入！\n", n);         }     }      // 打印出来，验证有没有重复 //    for (i = 0; i < N; i++) { //        printf("num[%d] = %d\n", i, num[i]); //    }      return 0; }

user: user-0
content: 感谢感谢
user-0 提问: 为什么红字部分和橙色部分位置互换结果不一样

回复:
user: user-1
content: scanf接受%d%e%f%lf%u等等数值数据的时候会跳过前置白空格找到合适的数据，读到不能接受的字节为止，然后把不接受的内容留在缓冲区里。然而%c不行，它只抓缓冲区里的第一个字节，不管它是啥。红字在上的时候，刚开始运行，缓冲区是空的，看起来正常。红字换到橙色下方，它就只能收到缓冲区里遗留的空格回车神马的了。除非先清空一下标准输入缓冲区rewind(stdin);
user-0 提问: PTA最后一个测试点过不了，大佬帮我看看哪里错了呜呜呜

回复:
user: user-1
content: 同学，我写了一个不使用递归，而且，很容易理解的代码，请参考： #include <stdio.h>  #define MaxWorks 100  int main() {     int works; // 工作数量     int feeList[MaxWorks][MaxWorks]; // 费用列表     int workers[MaxWorks]; // 工人的标记     int jobs[MaxWorks]; // 工作的标记     int maxFee = 0; // 最大费用     int totalMinFee = 0; // 最小费用合计      printf("请输入工作数量：");     scanf("%d", &works);     if (works <= 0 || works > MaxWorks) {         printf("输入的工作数量无效!\n");         return 1;     }      for (int i = 0; i < works; i++) {         for (int j = 0; j < works; j++) {             printf("请输入第%d行，第%d列个工作的费用：", i, j);             scanf("%d", &feeList[i][j]);             maxFee += feeList[i][j]; // 累计所有工作费用作为最小工作费用的初始值         }         workers[i] = 0; // 初始化工人的标记         jobs[i] = 0; // 初始化工作的标记     }           for (int k = 0; k < works; k++) {         int minFee = maxFee; // 最小费用         int workerTag; // 已分配的工人标记         int JobTag; // 已分配的工作标记         for (int i = 0; i < works; i++) {             if (workers[i] != 0) { // 此工人已有工作，跳过它                 continue;             }             for (int j = 0; j < works; j++) {                 if (jobs[j] == 0 && feeList[i][j] < minFee) { // 此工人收取的最小费用是最低的                     minFee = feeList[i][j];                     workerTag = i;                     JobTag = j;                 }             }         }         totalMinFee += minFee;         workers[workerTag] = 1;         jobs[JobTag] = 1;         printf("k = %d, workerTag = %d, JobTag = %d, minFee = %d\n", k, workerTag, JobTag, minFee);     }      printf("最小的工作费用：%d\n", totalMinFee);      return 0; }

user: user-1
content: 同学，你想的太复杂了，需要用到递归算法吗？而且，你的代码有几个地方不合理，我试试改一下，你参考： #include <iostream> using namespace std; int n;  int fee[100][100];//工作费用矩阵 int minfee = 100000; //最小的费用（这个假设是不合理的） int curfee;//目前的费用 int x[100];//记录工作分配方案 void swap(int a, int b) {     int tmp = x[a];     x[a] = x[b];     x[b] = tmp; }  void Backtrack(int t) { //遍历第t层     if (t > n) { //判断是否到达叶子节点         if (curfee < minfee) {             minfee = curfee;             return; // 改在这里         }         // return; 不能在这里就返回了！     }     for (int i = t; i <= n; i++) { //第t次选择要走到的城市         if (curfee + fee[t][x[t]] < minfee) { //提高效率，剪枝,限界函数             swap(t, i);             curfee += fee[t][x[t]];             Backtrack(t + 1);             curfee -= fee[t][x[t]];    //回溯             swap(i, t);         }     } }  int main() {     cin >> n;     for (int i = 1; i <= n; i++) { //输入工作费用         for (int j = 1; j <= n; j++) {             cin >> fee[i][j];             minfee += fee[i][j]; // 累计所有的工作费用作为最小的费用         }         x[i] = i; // x数组初始化(不需要多一个循环对它进行初始化）     }     // for (int i = 1; i <= n; i++) { // x数组初始化     //    x[i] = i;     // }     Backtrack(1);     cout << minfee; }

user: user-1
content: 同学，为什么例子给出的答案是9，不是8吗？难道，我理解错了？它是标准答案，还是随便举例子？

user: user-0
content: 标准答案.我的理解是三份工作三个人，安排每个人做不同的一份工作，比如第一排取2，第二排取4，那第三排只能取3
user-0 提问: Notepad++中配置C++编译环境问题。MinGW成功安装，但notepad里运行仍有看不懂的问题

回复:
user: user-1
content: 缺依赖，要么是你没有引对头文件，要么是没有加动态库，具体缺啥得看代码

user: user-0
content: 感谢
user-0 提问: 我用if else语句，是否有更简洁的写法？

回复:
user: user-1
content: f = (a > 1000 ? 8 + (a - 501) / 500 * 4 : 8) + (c != 'N' && c != 'n') * 5;

user: user-2
content: 同学，请参考： #include <stdio.h>  int main() {     int a, b, f; //a是重量，b是超重部分，c是加急，f是总费用     char c;      printf("输入重量，是否加急？");     scanf("%d %c", &a, &c);     b = (a - 1000) / 500;      f = 8; // 基本费用，一定要收的     if (a > 1000 && a % 500 != 0) { // 整收         b++;     }     f += b * 4; // 超重收费     if (c == 'y') { // 加急费         f += 5;     }      printf("总费用为：%d", f);      return 0; }

user: user-0
content: 感谢
user-0 提问: 定义一个字符数组a，字符数组a中的字符是有序的；另一个字符数组s是无序的。要求将数组s中的字符插入到有序字符数组a中(大佬求解！)

回复:
user: user-1
content: #include<stdio.h> #include <string.h> int main() {     char a[100] = "afhjlmp";     char s[100] = "boimyr";     int lb = strlen(s);     for (int j = 0; j < lb; j++) {         int la = strlen(a) - 1;         while (la >= 0 && a[la] > s[j]) {             a[la + 1] = a[la];             la--;         }         a[la+1] = s[j];      }     for (int i = 0; a[i]; i++) {          printf("%c", a[i]);     } }

user: user-2
content: 同学，你想的太复杂了，排序首先冒泡啊，学C语言必会的排序，请参考： #include <stdio.h>  int main() {     char a[] = "afhjlmp";     char s[] = "boimyr";      // 1、先连接成一个字符串     strcat(a, s);     int len = strlen(a);     // 2、使用冒泡重新排序它     for (int i = 0; i < len - 1; i++) {         for (int j = 0; j < len - i - 1; j++) {             if (a[j] > a[j + 1]) { // 从小到大排序                 char temp = a[j];                 a[j] = a[j + 1];                 a[j + 1] = temp;             }         }     }     // 打印排序好的字符串     printf("%s\n", a);      return 0; }

user: user-0
content: 谢谢Thanks♪(･ω･)ﾉ 又学到一个新方法。 不过我已经写出来了--- #include&lt;stdio.h&gt; #include&lt;string.h&gt; int paixu(char *arr ,char *brr); int main(){   char c[20]="awfer";  char x[]="crf";  paixu(c,x);  } int paixu(char *arr,char *brr){  int n,m;  n=strlen(arr);  m=strlen(brr);  int i,j,k;  for(i=0;i&lt;m;i++){   for(j=0;j&lt;n;j++){    if(arr[j]&gt;brr[i]){     for(k=n;k&gt;j;k--){      arr[k]=arr[k-1] ;     }     arr[j]=brr[i];      break;    }   }   n++;  }  puts(arr); }

user: user-2
content: 同学，题意不明啊，插入有序数组后，是否要保持有序，还是间隔插入即可？

user: user-0
content: 要保持有序

user: user-3
content: a[] 没有给 s[] 留下空间啊；还是要用到各自字符串长度，因为 a[] 里后移给 s[?] 腾空间时，是要从最后一个字符向前移的。具体的细节上的问题也有，因不合大的逻辑就不提了。

user: user-0
content: 需要a数组留一定的空间吗，我原以为不给定范围数组会自己判断
user-0 提问: 有老板知道这个用c语言怎么写么

回复:
user: user-1
content: 同学，怎么不是王子呢？呵呵，请参考我的代码： #include <stdio.h> #include <math.h>  #define TargetNumber 7140229933 // 目标是10位数，可以由2个5位数相乘得到 #define StartNumber 10000 // 最小的5位数 #define EndNumber 99999 // 最大的5位数  int PrimeList[EndNumber - StartNumber]; int TotalPrime = 0; void makePrimeList();  int main() {     makePrimeList();     for (int i = 0; i < TotalPrime; i++) { // 双循环，暴力求解         for (int j = 0; j < TotalPrime; j++) {             // 我的妈啊，这句花了我不少时间，dev-c++居然要强转，让我怀疑人生啊！             long long int m = (long long int) PrimeList[i] * PrimeList[j];             if (TargetNumber == m) {                 printf("公主的微信号：li%d%d\n", PrimeList[i], PrimeList[j]);                 return 0;             } else if (m > TargetNumber)  { // 小小优化                 break;             }         }     }      return 0; }  // 产生质数列表 void makePrimeList() {     long m, k, i;     for (m = StartNumber; m < EndNumber; m++) {         k = (int)sqrt((double)m);         for (i = 2; i <= k; i++) {             if (m % i == 0) {                 break;             }         }         if (i > k) {              PrimeList[TotalPrime++] = m;         }     } }

user: user-2
content: 83777 85229

user: user-3
content: BTW：要通过做题之前的海选，叫九章啊，九歌啥的还行，叫九离那很有可能就没机会做题啊。

user: user-1
content: 最简单就是用暴力求解啦

user: user-4
content: 你想应聘驸马就要自己写出来～
user-0 提问: 总说超出时间限制，请求支援

回复:
user: user-1
content: 试看int n = 0; while (n > -1)scanf("%d",&n);total/=q;...

user: user-2
content: 我考试的时候，通常出现超时，都是算法比它的标准答案复杂，优化后都能通过。这1行：printf("%.1lf %d\n",1.0*total/q,num);total本身就是double，为什么还要乘1.0呢，它会不会认为是多余，所以，就说超时呢？

user: user-2
content: 如果还不行，估计最大可能就是这行：while(scanf("%d",&n)!=EOF&&n!=-1)太复杂了，输入的时候几乎没可能出现EOF，把这个条件删除了，直接改为：while(scanf("%d",&n)&&n!=-1)

user: user-2
content: 同学，代码应该没有问题啊，是不是最后的输出行格式不对了？把它改成这样试试： printf("%.1lf\t%d\n", 1.0 * total / q, num);

user: user-0
content: 还是不行，而且提示答案错误

user: user-2
content: 我考试的时候，通常出现超时，都是算法比它的标准答案复杂，优化后都能通过。

user: user-0
content: 希望有空的大佬能瞄一下我的题，万分感谢
user-0 提问: C语言中自增自减问题

回复:
user: user-1
content: 为啥写这么复杂的程序，炫技么？如果不炫技，拆开写吧，另外同一个编译器可能理解一致，换平台就不好说了，所以不要搞这种花里胡哨的

user: user-2
content: C说，它得几都行。所以我们不能这么写代码。

user: user-3
content: 1、前置++/--在此行的语句中，是先执行+/--+，再执行本行语句2、后置++/--在此行的语句中，是先执行本行语句，再++/--所以，输出是5是对的，但，此行执行完后，c的值就等于6了3、另外，不同的编译器对很复杂的前置++/--、后置++/--的解释可能是不一样的（特别是在同一条语句有多个++或--）
user-0 提问: 求助求助孩子想不懂啊。

回复:
user: user-1
content: 同学，你传进函数的结构体变量不能是传值啊，要么传指针或引用，否则，传到函数里面是它的复制品，在函数内修改的是复制品，不是你想要的。
user-0 提问: 求助，求大神指导！！

回复:
user: user-1
content: #include <stdio.h>  int main(int argc, char *argv[]) {     for (int i = 1; i <= 9; i++) {         for (int j = 1; j <= i; j++) {             printf("%d x %d = %d\t", i, j, i * j);         }         printf("\n");     }      return 0; }   ```c    ```

user: user-0
content: 感谢

user: user-2
content: 看我博客，有详解版，怎么打印9*9乘法口诀表
user-0 提问: 用指针修改const int为什么打印出来还是原值

回复:
user: user-1
content: 使用指针操作常量区是没有任何问题的，但有时即使修改了常量区的值也对运行结果没有影响，编译器会优化在使用常量时不去常量的存储位置取值，而是编译阶段直接将值写入到代码区 另：即使写入到代码区的值也可以修改，通过某种神奇的方法找到编译后代码的位置，将逻辑修改为从内存寻值；或者暴力点内嵌汇编......https://blog.csdn.net/weixin_39583222/article/details/117062110

user: user-2
content: 不知道你想干啥？ const， 又要非const，你写规则这么复杂的程序，不怕别人看不懂么？ 还是就想别人看不懂

user: user-3
content: 同学，关键字const的作用是不是忘记了？你是不能更改const声明的变量的值的，把它去掉试试吧！

user: user-0
content: const是可读常量，视频讲解的就是可以通过指针来修改const常量，我去查了查这种现象叫做常量折叠，有的说可以显示出来不同的值，有的说相同的值

user: user-3
content: 如果是C语言，除非是特定的编译器，一般正常的编译器都不支持修改const常量，再说，你都把它声明了常量，还去修改它，这不是折腾吗？不管如何，有这么厉害的视频，贴个地址，我上去学习一下！

user: user-3
content: 我老师说，C++还有一个关键字：volatile，在const加上这个，有些编译器是可以编译通过的，不过，这样做真是没事找事，真折腾了！

user: user-4
content: 你的源代码文件扩展名是.c么？

user: user-0
content: 是的
user-0 提问: 新手照抄为什么都报错啊？求解

回复:
user: user-1
content: 换visual studio吧 devc++不还用。。vs全给你部署好了 有问题可以百度  很多人用 很多回答

user: user-2
content: 他这会儿在自闭中。。用个好点的IDE，加个插件。

user: user-0
content: 谢谢大家

user: user-0
content: 我弄好了

user: user-3
content: 同学，你在第9行重复定义了struct Student，这里的定义是空的结构，把此行前面的关键字struct 去掉试试。

user: user-0
content: 没有用

user: user-4
content: 4 float score;16 c.next=NULL;21,22行有不是字母数字的汉字字符

user: user-0
content: {printf("%ld%5.1f\n",p-&gt;num,p-&gt;score);     p=p-&gt;next;    } while(p!=NULL)；     return 0； 没有吧，老师你看看
user-0 提问: c语言循环结构求输入的数字是几位数。十位数以上的为什么判断不了位数？ 跪求！谢谢！

回复:
user: user-1
content: 你用int num存储输入的数，但是int是有极限的，你可以试试输入10位以上的数，用int型保存，然后输出，你会发现并不会输出你输入的数，所以你要存储输入的数字，就需要考虑上限会输入多少，以及用什么去存储，然后再解析

user: user-2
content: 因为存不下。

user: user-3
content: 同学，我突然想到一个很简单的方法，请参考： #include <stdio.h> #include <string.h>  int main(int argc, char *argv[]) {     int a, num;     a = 0;     printf("请输入一个正整数：");     scanf("%d", &num);     char sBuffer[255];      sprintf(sBuffer, "%d", num); // 把输入的整数转为字符串     printf("%d\n", strlen(sBuffer)); // 字符串的长度就是它的位数      return 0; }
user-0 提问: C语言读取二进制文件出错

回复:
user: user-1
content: 指针这一概念在内存中实现是地址在文件中实现是文件偏移量

user: user-2
content: fwrite(&da,sizeof(DynamicArray),1,fp); 这种写法只能把指针地址和后面两个long 变量写入文件。 想要把指针结构体内容写入文件，可以这么写fwrite(&da.item[0],sizeof(Item),1,fp),接着把另外两个变量写入，读取的时候也要这么处理。 针对数组长度大于1的，循环写几遍或者一次性写入sizeof(Item)*数组长度。  读取的时候建议把    long maxSize;    long currentSize;连个变量放在结构体最前面，先读取数组长度，然后根据数组长度再去读取指针内容

user: user-0
content: 我好像发现问题所在了，保存数据到文件中的是动态数组的地址。下次取出来的时候，取出的是一个地址，而不是一个结构体。然后这个地址与某个其他地址冲突导致异常。但是发现问题了，我也不知道怎么实现将动态数组存入文件中。
user-0 提问: 如何用C语言将txt文本中的数据改成如下的格式

回复:
user: user-1
content: #define _CRT_SECURE_NO_WARNINGS #include "Stdio.h" #include "Conio.h" #include <sys\stat.h>  #include <time.h> #include "ctype.h" #include "stdlib.h" #include "string.h"   char* NopEnter(char* str)  // 此处代码是抄的,  但是比较 好懂. {     char* p=NULL;          if ((p = strchr(str, '\n')) != NULL)     {     *p = '\0';          }              return str; }   int main() {     FILE* fpSS;     FILE* fpDS;     int err;     char* str;     char* temp;     char t11[] = "  1\n";     char t22[] = "  0\n";     //指定哪行需要标识，且标识为是0还是1     //第一行 需要标识 ，标识 为0     //第二行需要标识 ，标识 为1     int a[10][2] = { 1,0,2,1,3,0,4,1,6,1,8,1};     int j = 1;     int i = 0;     char t3 = 0;     system("color 17");      str = (char*)malloc(sizeof(char) * 101);     temp = (char*)malloc(sizeof(char) * 101);     err = fopen_s(&fpSS, "filess.txt", "r");     err = fopen_s(&fpDS, "fileds.txt", "w");     if (fpDS == NULL)     {     puts("-fileds.txt- 文件打开错误!!\n");     exit(-1);     }     if (fpSS == NULL)     {     puts("-filess.Txt- 文件打开错误\n");     fputs("源文件打开错误!", fpDS);     exit(-1);     }       while (fgets(str, 100, fpSS) != NULL)     {          if (j == a[i][0])   //需要标识      {          puts(str);         str = NopEnter(str);  //去掉回车          t3 = a[i][1];         if(t3==1)         strcat(str, t11);         else         strcat(str, t22);                   fputs(str, fpDS);         i++;     }     else  //不需要标识      {         fputs(str, fpDS);     }          j++;      }     fclose(fpSS);     fclose(fpDS);         return(0); }   ```c    ```

user: user-0
content: 十分感谢

user: user-2
content: 直接在原文件上不行吧，大致是另外创建个文件，逐行读入这个文件，看是否要写入特殊标记，写入到新建文件，新建数据文件加行末标记，以此循环直到末；原文件是删除还是改名备份，新文件重命名为原文件。

user: user-3
content: 根据现有描述不足以理解您的意图。
user-0 提问: 在编辑数据结构线性表的顺序储存结构上出现取消对null指针的引用 咋解决啊大佬们？

回复:
user: user-1
content: 我想知道99个闲置的结构体是干啥用的。

user: user-2
content: 高版本高要求啊，连 scanf 都不让用了，用 vc2008 cl 了下，没有这些问题。点下前面的小三角，看看怎么个解释和建议，照着做就是了；就如下面的对 scanf 的说明。

user: user-0
content: 好吧ヽ( ￣д￣;)ノ 我就想把书上的东西好好自己弄一下  下个2022还有问题了真的是

user: user-0
content: 那我感觉真的好挫败啊  昨天为这个折腾半天 刚刚我用vc运行出来了  唉😔