Question: 关于形参和实参的概念

用初中的话说，就是变量和代入变量的值嘛。

这个问题，其实不需要深究，我的理解，举个例子吧，当定义一个函数时，比如： 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);也是可以的。

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

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

好的！谢谢大佬！！


Question: 这道题的形参有什么意义

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

这道题考的是变量的作用域，我审题不清

没什么意义，相当于return c++;

还是不太明白，按照题目我的理解是，把a++代入函数funa，但是在函数funa里并没有关于a的计算式，只有一个赋值式a=c++，也就是说之前一个代入白做，完全没起到作用，我哪里理解错了？


Question: 代码没有错误 但是运行不出来

代码与特定的库相和图形环境关联，没办法测试。请把相关的编译及运行信息贴出来看看，能不能找到问题所在。


Question: C语言题目，想知道哪错了，为什么总是输出不存在

int    flag = 0;这个地方会使 if (flag == 1)  永不成立

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

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

break只能跳出一个for循环 可以在外面判断flag跳出外面的for

正解

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


Question: 技能树看到的题 为啥是8 我不理解8 1 4怎么也是16吧。。

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

这是 csdn技能树的题

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

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

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

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

我肯定蒙 2+2+4


Question: 第一个是录入文件的数据，为什么我想把学号输出来，却把S也带出来了，S是学生的意思，第三个是我录入的方式，a是结构体指针

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

请粘贴完整代码


Question: （JAVA区成鬼区了，问问题还得来C语言区）

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

谢谢大佬，问题解决，C语言区果然给力


Question: 为什么我这个只能检查第一个数据，无法检测剩下的账户是否存在

读文件不应该这样写，读取的语句重复了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) {     ......................如果存在，做些什么 }

好的，我试试


Question: 这么小的数也会溢出吗？

for 循环后 n 是 0，除以 0 还不溢出啊。

哦对，没留意，谢谢


Question: openjudge的题，大佬们帮帮忙，我实在看不出来该修改哪里

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

修改出来一个错误，但还是显示回答错误

不能直接计算 sqrt(b*b-4*a*c) 吧，因为里面可能小于 0 啊。先比较 b*b 和 4*a*c 的关系，再针对情况和题目要求进行下面的计算吧。


Question: 求助为什么结构体的大括号里定义变量要用数组（红色那里）

因为学生的学号 名字不可能是一个字符啊  所以就用数组啊


Question: 求解析，谢谢各位大佬！

字符串转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); }


Question: 问题 。。。。。。。。。。。。。。。。。。

这种形式叫做递归调用展开是一个层级的形式

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

递归的理解你得先到最后一层，也就是 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  以最终程序运行结果为准，上面只是思路，可能不正确...


Question: C语言中memcpy的参数顺序设计思想是什么？为什么这样设计？

用宏很容易解决楼主的癖好：#define memcopy(src, size, dest) memcpy(dest, src, size)

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

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

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

是intel的x86架构造成了  mov eax,ebx  是把ebx复制到eax  不知道为什么会这么反人类的设计方式


Question: 严重性	代码	说明	项目	文件	行	禁止显示状态 错误	C4996	'strcpy': This function or variable may be unsafe. Consider using

我建议开头加 #pragma warning(disable:4996)

谢谢了

没有解决

为什么还是报错啊


Question: c语言输出hello,world 但判断结果一直是WA,给孩子整不会了,看不出错误.

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

是不是中文逗号错了HELLO,WORLD

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

是要求

兄弟 截图出来看一下，

可能把第三个\n去掉？

试过了,不行


Question: 字节问题（凑够10个字太离谱了）

问题解决了https://blog.csdn.net/AlbertFly/article/details/52065629

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

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

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

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


Question: 已安装DEV C情况下如何装VScode

点manage替换已安装的版本

安装后显示这个对话框请问该选哪个？


Question: 为什么DEV C++内外编译器不一样？

jmeubank.github.io/tdm-gcc/about/简单说，TDM就是基于MinGW（gcc的windows移植版本）的一个实现


Question: 进程虚拟内存空间的问题？

系统这个词有歧义吧？

32位"系统"是这个么，直接复制过来，应该是32位以下分布


Question: 递归求和

scanf("%d",n); 应该是  scanf("%d", &n);


Question: 递归......................

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)

多谢大牛

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

six

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

感谢大牛


Question: 求解求解 c语言文件方面的

31行 ，不是s=&i; 应是*s=i;


Question: 这个for 循环哪里出错了，系统一直报错

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

哪有问题

好像是格式不对，就是删去一个int 就没有问题

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

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

就是我删去一个Int就没有问题，不知道为什么

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

哦哦，我好像没考虑过这个问题，感谢

我一直说要把语法学透，我是认真的。


输入省略b=1;输出省略

用不到嵌套

有个打字错误。


Question: 简单的民宿预约系统代码编写

html搞定，还C语言


Question: 调试时候出现这个对话框是什么意思

出现这个，就说明你的代码有问题，最可能是引用了野指针、超标（越界）。


Question: <C语言>我感觉我的程序漏洞百出，有没有大佬帮忙看一下……

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

fp = fopen()  这个地方应该检查文件打开是否异常char  p[8][9] = {0};读文件应该是  for (i = 0; i < 7; ++i)


Question: 为什么DEV C 5.15会自动添加空格？

还有这么神奇的工具吗？这编码规范太舒服了，强求一个linux的版本！

这不是很好么~


Question: 十分钟带你学会C语言的文件操作

谢谢支持！


Question: C语言大一PTA输入一个英文句子，将每个单词的第一个字母改成大写字母。

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'是字符串结束的标志，不是语句间的间断标识符

这里if里面一个a[0]一个a[i]好像有点不对


Question: 有5本书，每本书包含书号，书名，作者，价格，出版社的信息，编写函数：1.输出5本书信息。2.输出价格最高的那本书的信息。3.输出价格最低的那本书信息。在主函数中使用这3个函数

同学，请参考： #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");     } }


Question: C语言题目，想知道哪里错了，为什么输不出素数

感谢


Question: 问题

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

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

还是不理解。。。

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，就是这么简单啊。

谢谢

我想知道这样直接的问题怎么会有歧义的

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

这位同学可能没整明白*是乘以的意思吧哈哈哈

是的，我还以为是什么别的意思


Question: 在调试时出现了unhandled exception 0xC0000005:Access Violation的错误

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

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

请大家帮帮忙吧


Question: 为什么运行不起啊，求教

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

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

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

看来如今大学老师都是误人子弟,还用20年前的工具,可以下载VS2019,好用多了,报错也更智能易懂


Question: c语言结构 这个结果一直都是不对的

看最后的输出，是要找出最低成绩的记录号，就以 &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];         }     }     */ }


Question: 为什么运行起来不能执行么，我令n1=3就能正常运行，不该是swap(n1,n2)不发生改变swap（n2，n3发生换位么

代码中 'if(a > b)' 的意思是地址比较，不是(int)比较

void swap(int* a, int* b) {     int temp = 0;      if( (*a) > (*b) )     {         temp = (*a);         (*a) = (*b);         (*b) = temp;     } }

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

我执行的3个当中 swap(n1,n2)   n1<n2 不执行 swap（n2，n3）   n2>n3 执行   n3=2  n2=1 swap（n1，n2）     n1=n2     不执行啊 这样不该是 n1=1  n2=1  n3 =2 么 是我哪理解错误了么求教


Question: C程序设计里面的一道题：手动输入动态数组求平均数。我试了下返回得到的是0，打印max是0

26行那里，应该是  scanf("％lf",&item); 吧


Question: 为什么字符串中带有NUMBER后换显示乱码啊

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

懂了谢谢

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

懂了谢谢


Question: 一道循环题

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

跟昨天这位同学的题目没差多少啊，你们是不是同一学校？https://bbs.csdn.net/topics/603675455


Question: 关于整型的一点小疑问，求大佬解惑

八进制的数字只能是0-7，逢8要进1。

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

原来是这样，非常感谢


Question: 各位能不能帮我改善一下，感觉我的有点奇怪

同学，函数的声明，不要在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; }

用c++做，超级简单（sort（））。你写的懒得看。

c都还没学明白


Question: 求用c语言编写一个课程管理系统

标记一下，周六日有时间把它写了，一起学习。


Question: 这个值为什么是8，我实在想不通。

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

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

谢谢

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

谢谢


Question: select可读问题？

已经找到原因并解决

所以你提问的时候希望别人解释，解决了以后自己却不解释的做法是会给别人添堵的。 真的懒得解释不妨删贴哦。


Question: 计算机大一上课设作业

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

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

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

因为你说你只学到指针，所以这题目里边没有要求你上次输入的数据下次使用，很合理呀。


Question: 求一个三位数的个位，十位，百位？ 1）用3种方法解题？数学法2种+字符法1种。 2）求一个四位数？ 3）求一个不固定位数？

同学，请参考我之前的作业，可以求出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; }

不太理解

sprintf或者itoa


Question: 不是字符串数组不能带&么为什么这个程序不带运行不起，反而带了可以运行呢求解

s是数组s[i]是char

老师我是用char定义的啊s［］

哦哦老师我懂了我没有区分开两个的意义谢谢老师


Question: 我的这个8皇后for循环出不来怎么办

楼主这代码，级联10个for，太凶猛了~

汗，其他的什么递归回溯看不懂，就能看懂for。😥

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


Question: 这问题怎么解决啊？新手，求指点

同学，这个排序函数float average(float a[10])不能传值，要么引用或指针，否则，返回的不是你所要的。我之前有做过差不多的作业，请参考：https://blog.csdn.net/SuperC_Game/article/details/121540497?spm=1001.2014.3001.5502


Question: 【求助】无头结点单链表尾插法失效，编译无报错，运行终止

怎么要这样写初始化链表函数？除了逻辑不对外，还要传一个参数进去，直接在里面分配一个，然后返回不是更好吗？像这样： /**  * @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

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

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

我知道了，谢谢大佬提醒！


Question: 求二维整型数组的“最大点”。二维数组的“最大点”定义为：某个数是所在行的最大值，并且是所在列的最大值。注意：某行或某列上可能有多个“最大点” 求大佬帮忙看一下，为什么得不到想要的输出

同学，请参考我的修改：  #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即可。

没仔细看题哦

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

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

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

哦哦，对对，我调整了一下，输出498的值了

多谢多谢


Question: 下了个gcc11.2，不知道怎么安装

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

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

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

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

你没有回答我的问题

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

这个是源码包还是预编译的二进制发布，二进制发布一般都用TDM，目前只更新到gcc 10.3：https://jmeubank.github.io/tdm-gcc/download/


Question: DEV C++ 中文乱码是什么原因

win10，但是应该一样的，控制台子系统从win2000以来几乎没有变化

难道是系统的原因，你是win7还是10？

我试了，是好的：

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

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

在regedit中找到HKEY-CURRENT-USER下面的console，然后找cpp后缀的，看你那个控制台是在那个盘里面，如果是c盘就找到c盘那个，然后找到旁边的codepage，弹出来的对话框里面选择十进制改为，65001，点确定，然后重新编译允许就可以了


Question: 最大公约数问题 新手求教！！！

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

是的，解决了， 谢谢大佬


Question: 为什么第十行去掉0就不能将数字保存到s[]中

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

对啊，我就奇怪为什么加了0就可以把数字显示成字符


Question: 为什么第一二个打印不出来，而第三个可以

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

学到了，谢谢

要写代码，请对语法规则保持尊重。


Question: 怎么把goto语句换成其他的语句？

同学，goto语句+label语句，其实就是一个循环，你的代码不算复杂，还是比较好修改的，请参考： #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> void login(char *username, char *password); void change_password(char *old_password);  int main() {     char username[1000] = "asdf";     char password[1000] = "123456";//username和password数组开这么大是为了避免操作指针的时候发生越界的问题     int mod = 0;//设定一个变量mod,用来让用户选择系统工作的模式      while (1) { // 增加一个while循环 // remake: // 原式：去掉label         printf("\n");         printf("\t*******************************\n");         printf("\t***** 请输入你要选择的模式 ******\n");         printf("\t*********1.登录系统*************\n");         printf("\t*********2.修改密码*************\n");         printf("\t*********3.退出系统*************\n");         printf("\t*******************************\n");         printf("\n");          scanf("%d", &mod); //读入用户的选择         switch (mod) { //使用switch来控制分支             case 1:                 login(username, password); //向登录函数传入所给定的用户名和用户密码                 // goto remake; // 原式：去掉label                 break;             case 2:                 change_password(password);                 // goto remake; // 原式：去掉label                 break;             case 3:                 printf("\t再见，欢迎下次使用！");                 return 0;             default:                 printf("\t输入错误，重新输入\n");                 // goto remake; // 原式：去掉label                 break;         }     } }  void login(char *username, char            *password) { //模块化程序设计的思路，这个是登录模块，单独来做个函数，传入的参数为主函数中给定的正确的用户名和密码      char name[1000];     char word[1000];     int n;     printf("\n");     printf("\t*******************************\n");     printf("\t********* 用户登录系统 *********\n");     printf("\t*******************************\n");     printf("\n\n");     printf("\t请输入用户名.\n");     printf("\t用户名:");     scanf("%s", name);     printf("\n");     if ( strcmp(username, name) == 0) {         printf("\t输入用户名.\n");         printf("\t输入密码:");         scanf("%s", word);         for (n = 0; n < 5; n++) {             if ( strcmp( password, word) == 0 ) {                 printf("\n");                 printf("\t*******************************\n");                 printf("\t********* 欢迎用户！ *********\n");                 printf("\t*********3.返回上一级界面*************\n");                 printf("\t*******************************\n"); // re: // 原式：去掉label                 while (1) { // 增加一个while循环                     int flag = 1;                     scanf("%d", &flag);                     if (flag == 3) {                         return ;                     } else {                         printf("\t******* 无效命令！请重新输入 ******\n");                         // goto re ; // 原式：去掉label                     }                     printf("\n");                 }                 break;             } else {                 printf("\t\t请重试!\n");                 printf("\t密码:");                 scanf("%s", word);                 if ( strcmp( password, word) == 0 ) {                     printf("\n");                     printf("\t*******************************\n");                     printf("\t********* 欢迎用户！ *********\n");                     printf("\t*********3.返回上一级界面*************\n");                     printf("\t*******************************\n"); // re1: // 原式：去掉label                     while (1) { // 增加一个while循环                         int flag = 1;                         scanf("%d", &flag);                         if (flag == 3) {                             return ;                         } else {                             printf("无效命令");                             // goto re1; // 原式：去掉label                         }                         printf("\n");                     }                     break;                 }             }         }     }      else if ( strcmp(username, name) != 0) {         printf("\t用户名错误! 请重新输入!\n");     } }  void change_password(char *old_password) {     char temp_mima[1000], temp_mima1[1000], temp_mima2[1000]; //三个字符串密码，原始密码，新密码1，新密码2     // printf("请输入原来的密码："); // 原式：移动到while循环内 // loop: // 原式：去掉label     // scanf("%s", temp_mima); // 原式：移动到while循环内     while (1) {         printf("请输入原来的密码："); // 原式：移动到while循环内         scanf("%s", temp_mima); // 原式：移动到while循环内         if (strcmp(temp_mima, old_password) == 0) {             printf("\n\n");             printf("\t*******************************\n");             printf("\t********* 密码正确！ *********\n");             printf("\t*******************************\n");             printf("\t请输入新密码：\n");             scanf("%s", temp_mima1);             printf("\t请再次输入密码：\n");             scanf("%s", temp_mima2);             if (strcmp(temp_mima1, temp_mima2) == 0) {                 printf("\t*******************************\n");                 printf("\t*****修改密码正确！请牢记密码!******\n");                 printf("\t*******************************\n");                 printf("");                 strcpy(old_password, temp_mima1); //用新的密码代替旧的密码，                 return; //返回主函数 // 原式：可以改为break;更好             } else {                 printf("\t*******************************\n");                 printf("\t***两次输入的密码不一致！修改失败！***\n");                 printf("\t*******************************\n");                 // printf("\t请输入原来的密码：:"); // 原式：重复多余了 //                goto loop; //实现用户输出错误密码了，重新输入密码 ， // 原式：去掉label                 // getch(); // 原式：多余                 return; // 原式：可以改为break;更好             }         } else {             printf("\t*******************************\n");             printf("\t*********输入的密码错误！**********\n");             printf("\t*******************************\n");             // printf("\t请输入原来的密码：:"); // 原式：重复多余了  //            goto loop; // 原式：去掉label             // getch(); // 原式：多余             // break; // 原式：因为需要重复修改，所以，不能使用它中止while循环         }     }  }

感谢大佬的帮助，太感谢了


Question: 如果avg出现负数是不是因为数字越界了

整数的数组可能包括负数，累加的结果出现负数，有什么问题呢？

可是我输入的是正数

我又发了图您看看哪里出问题了

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

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

有的正数得出也是负的


Question: 我输入3.142412swich不应该只加3就退出了么，为什么后面会显示其他数字也加了啊求问

switch内的break只break switch，不会 break while

同学，你输入了多个字符后，如果你没有清除键盘缓冲区，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; }

哦哦哦懂了谢谢老师了

那就是 break; 只 break 了 switch() 吧，外面还有个 while()

写switch 为什么没有 default ???

那么while是啥意思呢？


Question: 求助getchar清理缓冲区的问题

感谢!

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

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

求求 ！十分感谢。


Question: 为啥我c语言 程序 本地可以 传到oj 就出现了运行错误

同学，我修改了部份代码，你看改成这样是不是更好： #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; }

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

数组改成a[11000]也是运行错误


Question: 为啥我c语言 程序 本地可以 传到oj 就出现了运行错误

求各位大神解答


Question: 求助！我的字符串输出结果最后一位总是随机多一个符号TAT

同学，下面这一行中，m是不是没有初始化值，是不是应该把它的条件改为j<260    ?    for (int j = 0; j <= m; j++) {        line1[j] = line2[j] = '\0';    }


Question: 请大佬帮忙看看这个约瑟夫环问题，不知道为什么我这个代码没有输出结果 呜呜

同学，你的代码有些地方出错了，也有些不合理，我已修改，请参考： #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;  }

非常感谢大佬的修改与指正!☺ 感激不尽

我还是小学生

哇！那你也太厉害了


Question: 学C的原动力

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

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

所以说80%的程序员都不及格


Question: 求教（如何理解这段代码？）

同学，我开始学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循环呢？


Question: 同时int两个变量，为什么一个是0而另一个是1？

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

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

函数内的变量是在栈里的，其初始内容，和调用这个函数的那里刚才如何使用堆栈有关，尤其的之前调用的另外个函数，操作和动作比较固定，那这里基本上也是固定。可以试试把这个函数复制为另外个名字，先调用复制后的，给 i 和 j 设下值，再进这个函数直接看看是什么内容。


Question: 求大佬帮助指点，不知道哪里错了

定义的数组太小，题目里明确了数组大小要到1000×1000

1、是不是忘记判定数组的大小（n)是否有效？操作（b）是否有效？行列号（c）是否有效？2、每个操作（b）最后都要用同一语句：printf("\n");，是不是可以放到for(i=0;i<a;i++)循环体的最后呢？


Question: 此道wihle题，为什么我的写法和书上的不一样？

两个情况下，分别输入 0 看看结果？

确实，书后面也有注释，我没看到

我们小学数学里面，明确最小的一位数是1，不是0，你是对的。


Question: 为什么while里不能用1来表示

你就这么无视题意地追求死循环么？必要时可以写死循环，关键是...到必要时了么？


Question: 为什么我输入0后它还是让我继续输入

同学，请修改条件：while(i != 0)

那可以告诉我while(1)怎么用吗？感激不尽

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

OK，谢谢你


Question: 这个删去重复数字的代码哪里出问题了

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

可是我不知道怎么取消它，能给点提示吗

同学，代码如下，所有提示非必要，只是让人容易理解： #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; }

感谢感谢


Question: 为什么红字部分和橙色部分位置互换结果不一样

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


Question: PTA最后一个测试点过不了，大佬帮我看看哪里错了呜呜呜

同学，我写了一个不使用递归，而且，很容易理解的代码，请参考： #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; }

同学，你想的太复杂了，需要用到递归算法吗？而且，你的代码有几个地方不合理，我试试改一下，你参考： #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; }

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

标准答案.我的理解是三份工作三个人，安排每个人做不同的一份工作，比如第一排取2，第二排取4，那第三排只能取3


Question: Notepad++中配置C++编译环境问题。MinGW成功安装，但notepad里运行仍有看不懂的问题

缺依赖，要么是你没有引对头文件，要么是没有加动态库，具体缺啥得看代码

感谢


Question: 阶乘与（-1）的n次方的累加和输出

a*=m;

谢谢大佬


Question: 我用if else语句，是否有更简洁的写法？

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

同学，请参考： #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; }

感谢


Question: 为什么这个循环输入数组没有输出结果

差点怀疑之前学的东西。。。scanf("%d ",&a[i]); 多了一个空格。


Question: 关于switch语句的嵌套问题

同学，你第2个switch语句的break只能中止当前switch，出来后还是继续执行第1个switch语句的4，6，9，11后面的case！


Question: 定义一个字符数组a，字符数组a中的字符是有序的；另一个字符数组s是无序的。要求将数组s中的字符插入到有序字符数组a中(大佬求解！)

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

同学，你想的太复杂了，排序首先冒泡啊，学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; }

谢谢Thanks♪(･ω･)ﾉ 又学到一个新方法。 不过我已经写出来了--- #include<stdio.h> #include<string.h> 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<m;i++){   for(j=0;j<n;j++){    if(arr[j]>brr[i]){     for(k=n;k>j;k--){      arr[k]=arr[k-1] ;     }     arr[j]=brr[i];      break;    }   }   n++;  }  puts(arr); }

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

要保持有序

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

需要a数组留一定的空间吗，我原以为不给定范围数组会自己判断


Question: 有老板知道这个用c语言怎么写么

同学，怎么不是王子呢？呵呵，请参考我的代码： #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;         }     } }

83777 85229

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

最简单就是用暴力求解啦

你想应聘驸马就要自己写出来～


Question: 位置不相交嘛意思，一头雾水？

意思就是不同类型的括号不能有交叉，([)]这种


Question: 总说超出时间限制，请求支援

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

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

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

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

还是不行，而且提示答案错误

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

希望有空的大佬能瞄一下我的题，万分感谢


Question: C语言中自增自减问题

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

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

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


Question: 求助求助孩子想不懂啊。

同学，你传进函数的结构体变量不能是传值啊，要么传指针或引用，否则，传到函数里面是它的复制品，在函数内修改的是复制品，不是你想要的。


Question: 求助，求大神指导！！

#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    ```

感谢

看我博客，有详解版，怎么打印9*9乘法口诀表


Question: 想请问一下这个程序超时应该怎么改？

同学，我看你的代码很费劲，你直接把问题写出来，我们一起学习，可能我写代码比修改你的更快呢


Question: 用指针修改const int为什么打印出来还是原值

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

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

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

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

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

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

你的源代码文件扩展名是.c么？

是的


Question: 新手照抄为什么都报错啊？求解

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

他这会儿在自闭中。。用个好点的IDE，加个插件。

谢谢大家

我弄好了

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

没有用

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

{printf("%ld%5.1f\n",p->num,p->score);     p=p->next;    } while(p!=NULL)；     return 0； 没有吧，老师你看看


Question: 有没有检测C代码规范的工具？

轻量级的可以试下PC-Lint，重量级的可以用klockwork和coverity。

C++Builder有CodeGuard


Question: get 传参问题，该如何解答。。。。

如果是data的话，url上面没有参数


Question: c语言循环结构求输入的数字是几位数。十位数以上的为什么判断不了位数？ 跪求！谢谢！

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

因为存不下。

同学，我突然想到一个很简单的方法，请参考： #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; }


Question: C语言读取二进制文件出错

指针这一概念在内存中实现是地址在文件中实现是文件偏移量

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

我好像发现问题所在了，保存数据到文件中的是动态数组的地址。下次取出来的时候，取出的是一个地址，而不是一个结构体。然后这个地址与某个其他地址冲突导致异常。但是发现问题了，我也不知道怎么实现将动态数组存入文件中。


Question: sprintf赋值255个char型数组 有什么好方法？

#pragma warning(disable:4996) //开头加这句或项目、属性、配置属性、C/C++、预处理器、预处理器定义中添加“_CRT_SECURE_NO_WARNINGS” #include <stdio.h> char s[8192]; int DayGridWeights[255]; int NightGridWeights[255]; int i,L,p; int main() {     for (i=0;i<255;i++) {           DayGridWeights[i]=i;         NightGridWeights[i]=i;     }      p=0;     L=0;      p+=L;  L=sprintf(s+p,"{\"DayGridWeights\":[");     for (i=0;i<255-1;i++) {         p+=L;  L=sprintf(s+p,"%d,",DayGridWeights[i]);     }     p+=L;  L=sprintf(s+p,"%d]",DayGridWeights[255-1]);      p+=L;  L=sprintf(s+p,",\"NightGridWeights\":[");     for (i=0;i<255-1;i++) {         p+=L;  L=sprintf(s+p,"%d,",NightGridWeights[i]);     }     p+=L;  L=sprintf(s+p,"%d]}",NightGridWeights[255-1]);     p+=L;      printf("len:%d\n",p);     printf("%s",s);      return 0; } //len:1861 //{"DayGridWeights":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254],"NightGridWeights":[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254]}

我的理解，你是不是想这样做：     char buffer[255];     for (int i = 0; i < 255; i++) {         sprintf(buffer, "{i = %d, \"DayGridWeights\":[%d],\"NightGridWeights\":[%d]}", i, DayGridWeights[i], NightGridWeights[i]);         printf("buffer = %s\n", buffer);     }

sprintf函数会清空的，你这相当于重复赋值了255次而已。 sprintf(buffer, "%s {i = %d, \"DayGridWeights\":[%d],\"NightGridWeights\":[%d]}",buffer, i, DayGridWeights[i], NightGridWeights[i]); 这样才能把255次拼接成一个字符串

不好意思 我应该表达的不清楚 我想是：sprintf("{\"DayGridWeights\":[%d,%d,%d....],\"NightGridWeights\":[%d,%d,%d....]}", DayGridWeights[0],DayGridWeights[1],DayGridWeights[2],.....NightGridWeights[0],NightGridWeights[1],NightGridWeights[2]........)); 一次把225个成员全部赋值进去，一个一个的 一直要写225次，太麻烦，所以想问下有没有简单的方法

开个大区间，循环了往里加，一次加一组数据？

根据已有的描述，无法理解你的意图。


Question: 如何用C语言将txt文本中的数据改成如下的格式

#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    ```

十分感谢

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

根据现有描述不足以理解您的意图。


Question: 在编辑数据结构线性表的顺序储存结构上出现取消对null指针的引用 咋解决啊大佬们？

我想知道99个闲置的结构体是干啥用的。

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

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

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


Question: 程序设计题——小白求救SOS！

因为不知道你是否确定输入只有4个整数，我将它的输入范围设定为最多100个整数，请参考： #include <stdio.h>  #define MaxData 100  int main(int argc, char *argv[]) {     int data[MaxData];     int count;      printf("请输入整数的个数：");     scanf("%d", &count);     if (count > MaxData || count <= 0) {         printf("整数的个数不能超过%d，也不能是负数或等于0！\n", MaxData);         return 0;     }      int maxNumber = 0;     for (int i = 0; i < count; i++) {         printf("请输入第%d个整数：", i + 1);         scanf("%d", &data[i]);         if (data[i] > maxNumber) {             maxNumber = data[i];         }     }      for (int result = maxNumber; result > 0; result++) { // 暴力求解         int isOK = 1;         for (int i = 0; i < count; i++) {             if (result % data[i] != 0) {                 isOK = 0;                 break;             }         }         if (1 == isOK) {             printf("它们的最小公倍数是：%d\n", result);             break;         }     }      return 0; }


Question: 这代码没错啊，为什么PTA显示部分正确？

我最后将感叹号改成中文的就可以了😅

#include <stdio.h> int main(int argc, char *argv[]) {     int m;     scanf("%d", &m);     switch (m) {         case 1:             printf("星期一 8节课\n");             break;         case 2:             printf("星期二 10节课\n");             break;         case 3:             printf("星期三 6节课\n");             break;         case 4:             printf("星期四 8节课\n");             break;         case 5:             printf("星期五 6节课\n");             break;         case 6:         case 7:             printf("今天没有课，可以好好休息一下啦!\n");             break;         default:             printf("输入无效，只能输入1-7!\n");             break;     }     return 0; }

switch完整呗。吧default:break;也加上试试

这个也没错：int main(){return 0;}


Question: 大一新生，讲的递归调用，不知道哪里错了，求大神解答

1：注意if(c=='+') 这里的写法，常量写前面。2：F函数再加一个非 +-*/的 else分支3：除法要判断一下被除数是否为0

要说错，可能是标题里提及的“递归调用”，而你这里，却没有，虽然我也看不出来你代码里表现出来的功能和递归有多大关系。


Question: 排序，从小到大输出n个输入的数字，运行不了

for (k = 0; k < n - 1; i++) 这里错误，应该为：for (k = 0; k < n - 1; k++)

谢谢，自己怎么看都没看出来敲错了。


Question: 一个小白对数组的疑问

对cout进行了重载，如果是学习C而不是C++，就不应该使用cout，应该先学会使用printf()函数可以这样理解吧：第1个cout << a，相当于printf("%p",a)，第2个cout << a相当于printf("%s",a)

重载这个词的意思是，看起来长得一样，其实根本不是同一个东西。我在说流输出运算符。


Question: 大家有没有发现最近的品牌电脑读不出来硬盘序列号了

有类似问题的网友，请百度EasyHardwareID 这个工具

原因是wmic不支持NVME。需要自己写

都有，在硬盘的SMART数据中

scsi硬盘没有smart

ATA-3+、SCSI-3、SATA、SAS接口的硬盘都支持SMART，基本上90年代后期以来的硬盘全支持

硬盘序列号，准确说是IDE标准下的东西，很古老了，具体说就是在某个位置存放的2进制数据。读不出有几种情况：1、本身就没有序列号，比如非IDE类的scsi硬盘；2、读取方法有问题，比如最近这些版本的windows就需要管理员权限之类的才能读取，又比如这些直进制数据本身就是空白的内容，还有一种序列号前面是若干个空格，有的软件没有考虑到这种情况就不能正确处理；3、LZ说的这种，也有可能人家的序列号本身就是那样的，为什么一定要是：非空格的标准ascii字符呢？

补充一点：序列号可能有组织或存放形式的区别，或者说对2进制的解析不对

识别错误的序列号，四位字符间隔


Question: 第3个for小括号里面是什么意思啊？

逗号间隔的多个表达式

i从0开始，条件是i<5，如果满足，那么就做花括号里的，接着i+1，然后再继续判断条件是否成立，成立则做括号里，不成立就跳出了，理解否？


Question: 运用数组逆序输出1到11的数字，求问以下代码运行逻辑？

因为你运行的exe程序不是你这段源代码生成的。


Question: 结构体的地址引用问题

楼上正解，像楼上一样定义，就没有警告 typedef struct tt{ char data; struct tt *lchild,*rchild; }test;  这个警告就是说你的类型不对应，你这里struct test不规范。

typedef struct  tt{char data;struct tt *lchild,*rchild;}test;


Question: 二叉树建树编译不通过

修改如下，供参考： #include<stdio.h> #include<stdlib.h>  typedef struct TreeNode // 修改 {     char   val;     struct TreeNode* left;     struct TreeNode* right; }TNode, * T_Pointer;  void Build_Tree(T_Pointer& T) {     char ch;     scanf("%c", &ch);     if (ch == '#')     {         T = NULL;     }     else     {         T = (T_Pointer)malloc(sizeof(TNode));         T->val = ch;         Build_Tree(T->left);         Build_Tree(T->right);     } }  void Printf_Tree(T_Pointer& T)//修改 {     if (T != NULL)     {         printf("%c", T->val);         Printf_Tree(T->left);         Printf_Tree(T->right);     } }  int main(void) {     T_Pointer root;     root = NULL;     Build_Tree(root);     Printf_Tree(root);     return 0; }

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。


Question: visual studio 2019 Windows 10 sdk的应用实例在哪里？

我的没有。


Question: 编译后 sum=sum+a[i]*(x^i);为什么说double和int有无效操作

c里这个运算符是逻辑异或，不是指数吧，指数要用 pow() 函数。


Question: c语言 怎么把输入的字符串输出成若干个单个的字符啊

存数组里面挨个打印出来啊

putchar(a[0]);for(i=1;a[i];i++)printf(",%c",a[i]);


Question: 浙大的c语言程序设计 page70 例4-1 运行不了

scanf("%lf",&eps);

scanf那里双引号位置错了，谢谢

双引号敲错位置了。


Question: 有关魔方阵，救救孩子吧！

#include <stdio.h>#include <stdlib.h> int main(){    int n,i,j,k,s[100][100];    scanf("%d",&n);    for(i=0;i<100;i++)        for(j=0;j<100;j++)        s[i][j]=0;//数组初始化    for(i=1;i<=n;i++)//一共n个正方形        for(j=i;j<=2n-i;j++)//坐标从i到2n-i            for(k=i;k<=2n-i;k++)                s[j][k]+=1;//面积填充    for(i=1;i<=2n-1;i++)    {        for(j=1;j<=2*n-1;j++)            printf("%d",s[i][j]);//输出        printf("\n");    }}


Question: 关于谭浩强书里不同类型数据间的混合运算问题

书上说的不对呗内外有别不要混淆语言规则与硬件运算硬件浮点固然都是double的但是语言规则说float/float=float所以那个商是被转换为float，然后再考虑送给printf的

请问“硬件浮点固然都是double的”能详细说下是什么意思吗？另外您的意思是：那个商根据c语句规则，就应该是float，然后转换成double类型，传给printf作为参数吗？

CPU里面或者CPU身边的真正进行浮点运算的部件，它只能处理64位（或更长）的浮点数，它不会处理32位的浮点数。 然而C语言讨论的是内存里面的事儿，float是32位存储单元，double是64位存储单元。对于CPU来说，内存在它外面。 所以按照C语言的规则，我们有三个32位的存储单元，这几个单元向/从浮点运算部件传送数据的时候要有个额外的32/64位格式转换，但这个转换是编译器在后台暗戳戳地加上的，本质上和我们的代码无关。 结论是C程序员只要不写操作系统或编译器，那就应该忽略掉书上“都是double”的描述，这样对谁都好。


Question: 延时函数更改值后无变化（延时函数没有延时）

for(j=100;j>0;j--); //改为 for(j=1000;j>0;j--);

#define u16 unsigned short

有可能是循环里没实际操作被编译器给优化掉了。应该用 sleep() 类函数吧；用硬循环来实现，即使有效也让人不适（一是不同平台延时不一，二是无谓的消耗）。

不要骗自己啊，unsigned char怎么可能放得下5000呢？就算放得下，延时也还是太短。


Question: 一个开辟动态内存后的小问题（再次修改）

不调试的吗？上面代码的 16行有问题吧，不能有它，删除了即可；它即破坏了 原始的 P 这个又要被作为结果返回值的，下面的循环里又有 malloc() 的。

好家伙，现在再一看立马看出问题来了，太感谢了

这样的代码需要你在同一行里无分隔符地连续输入字符，最后输入！然后回车。

谢谢你，不过无限输出乱码

我说的是你之前问的scanf问题，你不要把不同的问题混在一起思考，不利于理顺思路。

好的哥，salute

自己尝试debug发现第二个scanf会直接跳过，每两次while才输入一次scanf，不知为何


Question: 有没有大佬帮我为什么总么算都是一个数

scanf("%lf",&Amount);把lf改为f就行了

粗看一眼是int 和float疯狂混用，导致commission一直为0？？？，这个是dev c++？debug一下马上就知道为什么了

float和%lf不搭应该用%f其他逻辑错误慢慢找。


Question: 大佬们解释一下这个代码(●'◡'●)

就是从n到m每个数加起来的和

有什么书籍推荐吗

明解C语言

谢谢

说句难听的，你不要不高兴。不想学就不要学，但凡把c语言前三章学完了也不会问这种问题

了解

有什么书籍推荐吗

这个代码还要解释？哪里看不明白？

对初学者来说有什么书籍推荐吗


Question: 这个在c语言中的意思是什么啊

如果a是’.‘这个符号，p为真，否则如果 a<=’9‘且a>=‘0’,且!p为真的情况执行下面操作结合语境去看代码啊，单引号内的内容表示为字符而不是真的数字

if (a == '.')     p = true; else if ((!p) && (a <= '9') && (a >= '0'))    // ....


Question: 有没有大佬帮我看看这个代码有什么问题啊？（用的VS2019）

我看最明显的是这个代码不产生输出，但既然你这样写，想必是有自己的理由的，因此对你来说这个不算是问题。


Question: linux下用c写多进程服务器端时，对sigaction函数与信号处理的时机有点小问题

主函数里的调用一系列库函数的顺序，应遵循你学习到的正确顺序，不能自己发挥。因为涉及到库函数里相应数据结构的正确初始化。

这样子啊，感谢～


Question: 编写程序：计算y年m1月d1日与同年的m2月d2日之间的天数（m2>m1）,若m2=m1且d2=d1则算1天。 输入：2017，2，27，3，10 输出：12

把switch语句放到for(month=0;month<m;month++)这个for循环内，试试。


Question: 以下说明语句哪句是错的

Dstutype是typedef定义的类型名

谢谢！


Question: 这个表达式10！=9的值是多少

值就是1啊，逻辑表达式如果成立，值就是1，不成立值就是0

非零值

严格来说，应该是 true 吧，虽然它常被定义为 1

谢谢！


Question: 这个题为什么打印没有输出

#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

strcat() 的问题吧，它不是形成临时变量，而是把第二个字符串添加到第一个末尾，p1 是没空间存放额外的。

谢谢！看来答案有问题


Question: 运行结果变量b没有减1

因为逻辑短路

谢谢！逻辑短路是什么意思？能具体说说嘛

&&运算左边是假的，结果注定是假的了，右边就忽略了。

谢谢！那个的值呢？

那个b的值呢？


Question: 求教，一直不知道错在哪里了

你试的数不够大。


Question: 静态库太麻烦了不同平台不同工程都要重新编译，有没有简单的方式

You need a cup of JAVA.

可惜用的是C

难道这就是JAVA的优势吗？

大家怎么处理的？

没人啊？


Question: 这怎么解决啊，求解？？

先声明那个函数，或者把主函数整个拉到下面去。


Question: 为什么会报错[Error] expected declaration specifiers or '...' before numeric constant

因为你把函数调用写成了函数声明的格式。去掉主函数里面的两个void

我就是声明了一个函数，然后在主函数里面调用这个函数，我这个程序在vss里面可以运行但是到了vec里面就一直说我错


Question: 请问这行代码是什么意思？void (*io_isr_cbfun)(u8 index) = NULL;

楼上说的都对 : )

给io_isr_cbfun这个指针变量赋初值NULL其类型是一个函数指针，指向  “没有返回值，带一个u8类型的参数index"这类原型的函数

函数指针赋值


Question: C++队列舞会问题触发断点，求解

仅供参考： //舞会上，男士们（m人）和女士们（n人, n<m）进入舞厅时，各自排成一队。跳舞开始时，依次从男队和女队的队头上各出一人配成舞伴。 //男队中未配对者等待下一轮舞曲。现要求写一算法模拟上述舞伴配对问题。在第t首曲子时，第x个女生和第几个男生配对跳舞？ #include <stdio.h> #include <string.h> #define MAX 26 int m,n,t,x,y,i,j,k; char md[MAX]; char nd[MAX]; char c; void main() {     while (1) {         printf("Input n m(1<=n<m<=%d):",MAX);         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1<=n && n<m && m<=MAX) break;         }     }     while (1) {         printf("Input t x(1<=t<=%d 1<=x<=%d):",MAX,n);         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&t,&x)) {             if (1<=t && t<=MAX && 1<=x && x<=n) break;         }     }     for (i=0;i<m;i++) md[i]='A'+i;     for (i=0;i<n;i++) nd[i]='a'+i;     k=0;     for (i=0;i<t;i++) {         printf("%2d: ",i+1);         for (j=0;j<n;j++) {             c=' ';             if (i==t-1 && j==x-1) {c='*';y=k+1;}             printf("%c%c%c",md[k],nd[j],c);             k=(k+1)%m;         }         printf("\n");     }     printf("%d\n",y);  }


Question: 求教一道题，请大佬解答

发现问题了，改成5.0就好了

整数计算得不到浮点结果非法数据判断条件也不对


Question: C++作业求大牛看一下 实在是不会！！

发觉自己能力退步了哎  写个这种东西居然调试了很久 #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h>  struct Data {     unsigned int s;     unsigned char c[4];     int n,A,B; }; void Clear( Data *d ){ memset( (void*)d,0,sizeof(Data) ); } void Printf( Data *d ){ printf("%d%d%d%d\n",d->c[0],d->c[1],d->c[2],d->c[3]); } int AddNum( Data *d,unsigned char v ) {     if( (d->s)&(1<<v) ) return d->n;     d->c[d->n++]=v;     (d->s)|=(1<<v);     return d->n; } int Check( Data *d,int in ) {     if(in<1000||in>9999) return 0;     unsigned char c[4]={0};     for( int i=3;i>=0;i-- ){         c[i]=in%10; in/=10;         if( c[i]==0 ) return 0;     }     unsigned int v=0;     for( int i=0;i<4;i++ ){  v|= 1<<c[i];  }     unsigned int n;     for (n = 0; v; v >>= 1) { n += v & 1; }      if(n!=4) return n;     int x=0,y=0;     for( int i=0;i<4;i++ )     {     if( c[i]==d->c[i] ){ x++; }     if( d->s&(1<<c[i]) ) { y++; }     }     d->A=x; d->B=y-x;     return 4; }  int main() {      srand(time(NULL));      Data D;      Clear(&D);      while( AddNum( &D,1+rand()%9 )<4 ){}      unsigned int In=0,Pass=10;      while(1)      {      printf("Enter 4 num:\n");      scanf("%d",&In);      if( Check( &D,In )!=4 ){         printf("Num cant't be 0 or repeat!\n");         In=0;      }      else if( D.A==4 ){        printf("You win!\n");        break;      }      else{ printf("%dA%dB\n",D.A,D.B); Pass--; }      printf( "Left:%d\n",Pass );      if( Pass==0 ){ printf("You lost! Num is:\n"); Printf(&D);break; }      }     return 0; }

百度搜“猜数字 C源代码”，这是经典题目。


Question: 萌新发现一个问题，求大佬解答

看看C新标准里有没有定义这种用法，没有就是错误的

好！谢谢

这是要做啥，10个字符指针的数组？应该：typedef char** Strings;

理解不了的就是不正确的。嗯，编译器理解不了的。


Question: 运行之后不显示顺序表的元素，只显示这是一个空表

调试啊，写代码不调试是不行的，代码难免会有异常，不能总是寻求别人，自己也未必能一眼就瞅出问题所在。你这个，主要问题可能是在 ListInsert() 函数开头的判断 i<1 这个似乎应该是 i<0 因为首个元素的序号为 0，这样就总也无法插入数据了。


Question: 请教一下，这个咋解决， 纯新手，完全不懂

大约是你在42行重复定义了函数f


Question: 放在pta上全是段错误 求解

段错误是理论上可以单步找到的。不调试，无新知。


Question: 请教一下，这个错在哪里了？

a 是你定义的那个结构的名，不是个变量名；还需定义个变量如 a va1; 然后 ..., &va1.x, &va1.y, ...

也就是说仅仅定义了一个结构是不行的，需要再定义结构变量再进行操作是嘛

是这个意思。

谢谢


Question: 我的问题我的问题求答

我知道了，scanf格式字符串中最后一个转换说明后面打了一个空格。 感谢你们。

调试卡在scanf这里，就算输入数据一直点下一步也没有办法继续。

用 switch 不合适吧，要用循环从 1月加到 (month-1)月；而闰月，还要看 month 是不是大于 2 了；严格点儿的话，甚至还应对 month 和 day 进行检查是否合法。

这样的话是结果未必对的问题。然而楼主是输入了没结果。 大概率是输入格式不对，按代码来，年月日空格分开。

好像也不是，我输入的格式特地加了空格。

我也想用循环其实，但这里老师要求用switch。 头痛。


Question: 请问c语言中这个错误是怎么回事啊？

你的main()函数定义了有返回值，但是，你并没有提供返回值，增加一条return 0;即可 #include <stdio.h> int main() {     char c[] = {"China"};          printf("%s", c);          return 0; } ```c

这就相当于你考试把答案写在草稿纸上，所以没有成绩。

百度搜了但没看懂


Question: 求答，if else问题

float a,b;  //定义单精度浮点数scanf("%lf %lf",&a,&b);// %lf 是错误的，应该为:%fprintf("%d",a); // a 是浮点数，%d 输出是整形数

爱你！


Question: 请问这个转化为c语言代码是什么

if的条件也要使用()包起来

if/else内只有一条语句，直接把then去掉就可以了，如果有多条语句，使用{}包起来即可


Question: 求教学 感谢大佬帮助！！！

能发一个完整的过程么？谢谢大佬


Question: PTA作业求助，感谢大佬

#include <stdio.h>int main(){    int a,b,c,t;    scanf("%d %d %d",&a,&b,&c);    t=a;    a=b;    b=c;    c=t;    printf("%d %d %d",a,b,c);    return 0;}

scanf("%d%d%d",&c,&a,&b);printf("%d %d %d\n",a,b,c);


判断一个正整数n是不是素数，只要从2递增判断到小于等于n的平方根的所有素数都不是n的因数，那么n就是素数。


Question: 求助，如何从标准输入中读取指令

自己逐个字符判断并取子串正则表达式有限状态自动机 以上方法都可行

指令库应该是棵树。

建议了解一下词法分析，和语法分析


Question: socket传输效率问题

无profiler不谈效率

脱离实际谈效率那是耍流氓啊。一个长期连接，每10秒发来1字节和文件下载能同日而语么？

当然是一次读取多个字节，每次recv都会有一次系统调用

read 底层不也是 一字节一字节的读吗？

有文章或者资料吗？想看看read底层实现

另外，就算底层是一字节一字节的读，你代码里也写成一字节一字节的读，但是最外面始终都得有个while吧？ ```c read(fd, _1KBData, 1024); // 一次函数调用，底层 for 循环 1024 次 for(int i = 0; i < 1024; ++i) { // 调用时 for 循环 1024 次，同时1024次函数调用     read(fd, &_1KBData[i], 1); } ```


Question: 问题。。。。。。。。。。

ch >= 'A' && ch <= 'Z' || ch >= 'a' && ch <=  'z'   ch >= '0' && ch < '9'  ch == 32  else

fabs(ch-77.5)<12.6 || fabs(ch-109.5)<12.6fabs(ch-52.5)<4.6!(ch-32)


Question: 请问这个代码应该怎么写

小学老师告诉我们，这玩意得拆项消项，它得(double)n/(2*n+1)极限是0.5，不可能得14.2。

百度


Question: 请问这个代码有啥问题（用的VS2019）

scanf_s("%s",name,(unsigned)_countof(ws));

修改部分如下： scanf_s("%s", name,20);//表示最多读取19个字符，name[19]放'\0'  输入字符时scanf_s比scanf多一个参数！

谢谢大哥，我自己找了两天都没有搞定，谢谢谢谢


Question: 关于vj上Time Limit Exceeded问题的请教

题目是啥？


Question: 各位大佬求解，为啥我的自反闭包会出现乱码？？？最后一行的两个？？

这里的else语句，没有使用}吧？else{   int i,j;

有的


Question: C语言嵌入式开发去哪里招人？

求职招聘     https://bbs.csdn.net/forums/jobdiscussion?category=0

谢谢大佬


Question: 关于指向数组的指针作函数参数的问题

因为数组名是地址常量，把它传给变量的时候需要类型兼容。score是float [3][4]类型，兼容于指针类型float (*)[4]*score是float [4]类型，兼容于指针类型float *


Question: puts(words);编译器指出words未初始化，怎么回事？？求解。

换编译器吧

我也懵了，感觉没问题的


Question: C语言标准库＜limits.h＞

下一篇建议楼主写float.h


百度搜“python 捕获ctrl+c”


Question: 求求将下面的C语言转成Java语言

import java.io.IOException; public class MyInput {     public static void main(String[] args) throws IOException {          int x, n, i, j;         x = System.in.read();         n = System.in.read();         int count = 0;         while(0 == count) {             x++;             for(j = 2; j <=x; j++) {                 if (0 == x % j ) {                     break;                 }                 if (x == j) {                     System.out.print("x = " + x + " ");                     ++count;                 }             }         }     }


Question: 为什么当a重复输入时就会出现奇怪的东西求解

char a[81] = {0};char b[81] = {0};或者每次 给数组赋值之前先清理一下数组memset(a,0,sizeof(a));

改成char a[81]{0}；b也如此

把if语句改为这个试试：        if (a[i] == 'a' || a[i] == 'e' || a[i] == 'i' || a[i] == 'u' || a[i] == 'o' || a[i] == 0x00) {

puts(b); 输出字符串吧，字符串，是以 0x00 字节标记结束的，但好像没看到你的代码里有设置这个结束标记字节的地方；puts(b); 前加个 b[c]=0x0; 语句试试？

字符串的结尾我看书上写的是\0...我改成\0行不通改成0x00是可以的谢谢,能告诉一下是为什么吗

应为\0这个东西既然叫做转义字符，那就得放在字符该放的环境，单引号里面才是它的用武之地。


Question: 求助为啥后面会多一个o


Question: 这个错在哪怎么改求解答

你这样是死循环，break只能中止最接近的for循环，不能中止外层的for循环，改成这样试试： #include <stdio.h> int main() {      int i;     int x;     int isprime = 1;     int cnt = 0;     for (x = 2; cnt < 50; x++) {         for (i = 2; i < x; i++) {             if (x % i == 0) {                 isprime = 0;                 break;             }         }         if (isprime == 1) {             printf("%d", x);             cnt++;         } else {             break;         }     }     return 0; }

这不是问题，虽然算法上可以改进；主要还是 isprime=1; 放错了地方，应该在 x 循环里的开头。

我纯新手刚学10天,不对别骂我0.0感觉i和x是不是刚开始都等于2for不太好用

isprime=1; 语句要放在 x 循环的首部吧，否则可能会被前次的 isprime=0; 给错了。

输出时 ％d 后面加个空格把各数据分开，否则全糊在一起看不清。

至少看上去缺少主函数结束的花括号。


Question: 简述学习编程遇到的问题，并求荐书！

这个思路有个问题就是，即使有这样的书，也会被抨击以偏概全。或者说适合您的思路的适合您的职业需求的，反而不适用于大多数人。就轮子来说，学机械的可能认为核心是轴承，学化工的可能认为重要的是橡胶优化，学材料的会说核心技术是滚珠的表面热处理。所以写书的人才会泛泛地说轮子。其实是留下空白，也留下无限的可能。  既然说到这儿了，再扯几句。预设过于明确的学习目标，然后围绕这个目标学习，固然看起来效率会提高，但是，我是说但是这正是现行的培养AI的思路！也就是说这样培养出来的“人材”迟早会被AI取代！！！——人类要维持自己对AI的优势，就不能走捷径，只能是广泛学习触类旁通，收敛成自己那棵与众不同的科技树。这就是人类的格。


Question: [Error] invalid conversion from 'char' to 'char*' [-fpermissive]，这是我写的冒泡程序的一部分，标记红色字体的部分都是着给错误，望解惑

字符是字符，字符串是字符串

strcpy()是字符串拷贝函数，代码里是要对单个字符操作吗，单个字符可以直接赋值操作：d[i] = sex[i]; sex[i] = sex[min]; sex[min] = d[i];


Question: 用c语言编程的时候出现了[Error] ld returned 1 exit status，求大佬帮助

函数声明：int getlen(char s[]);函数实现：int gatlen(char s[]){getlen() 写成 gatlen() ，e 写成 a  了。

好嘞，谢谢大佬

我刚接触c语言编程，还不怎么会哈哈哈，求大佬们指点哈哈


Question: 管理代码应该看什么书？

期待有启发的优质回答！

使用笔记相关软件使用everything软件

工具好说，方法呢？

无他，唯手熟尔。


Question: GetFileSize和FTell获取的大小与实际文件获取大小不同

是不应该，实际不是同一个文件，或，文件其时被修改了？


Question: c语言的基础，救救我！！！

前面输入的回车的残留吧，先用 fflush(stdin); 语句清理下试试？

这是一个历史悠久的错误，fflush是用来处理输出缓冲区的，不应用来处理输入。而且不是清除，而是催促输出不要再缓了。 四老师建议使用rewind(stdin)做这个事儿。

谢谢老师的建议，可是我还没学rewind(stdin)，不知道怎么样，我们老师说要加getchar（），但我不知道加哪里


Question: 新手小白学习C语言笔记

既然问题是无条件的，那么回答也是无条件且不负责任的：从全部学习C语言的人群的统计数据来看，学好的可能性不大。理智地回头吧，不要往坑里跳。

老哥稳

好家伙直接劝退


Question: 通过宏，怎么判断当前编译器是 gcc 还是 arm-linux-gnueabihf-gcc 呢

不用代码格式则连续的下划线被删除了，这个属于csdn特色？ #if defined(__GNUC__) && (defined(__arm__) || defined(__aarch64__)) // gcc ARM/ARM64 compiler #endif  #if defined(__GNUC__) && (defined(__i386) || defined(__x86_64__) || defined(__amd64__)) // gcc x86/x64 compiler #endif

多谢

#if defined(_ECLIPSE)||defined(__ANDROID__)||defined(__ARM_EABI__)

找不到的话自己制造一个宏就好。


Question: 关于在unix中建立C语言编译环境的问题

系统自带的，安装好就可以用，方便。

FreeBSD带有Linux兼容层，所以可以用大部分Linux下的软件，打开一个终端，输入命令：pkg install lang/gcc


Question: C语言中time.h的计时是从1970年开始的，这个怎么改变，比如改为2000年

非常感谢大家的回复，非常感谢！

定义一个偏移量常数，宏替换一下就行了。

谢谢

自己加偏移量改变一下

谢谢

这个是先天的设定，库函数本身并没有修改开始时间的功能，你只好自己写代码进行转换。

谢谢


Question: 大佬们帮忙看看C语言代码，vs2019可以跑，但是vc6反而报错

C不够地道，当然不行。改用C++，就行了。

代码不够ANSI，应该啥也没做之前声明所有变量，包括i，然后再干活。

明白了

源代码扩展名改为.cpp

VC6根本不给我出输出窗口

抱什么错？

vs6调试只给了errors（1） 要是知道哪有问题我就自己解决了

学校非要用vc6上课

我没有vc6,你把输出窗口的内容贴出来


Question: 做作业的时候遇到的问题，求大佬帮看看

要ANSI把变量c的声明提到前面去。

具体最后代码是什么样的呢，急！

行 7 类型前少了分号，看前面好像没少，那可能是误输入了汉字全角的分号？


这年头很难找到运行这个的硬件啊。所以我倾向于认为是系统或硬件不支持。

在dos下创建了软盘


Question: 大佬帮忙看看哪里出问题了，刚学编程的小白...

学会单步和设断点调试


Question: 为什么从txt文件读入的数据不能在其他功能上应用

学会单步和设断点调试程序


Question: 请问是在哪里添加分号呢

第二行末？不过这行完全可以不要，它是主程，无需什么声明或预定义的，毕竟其意义明确，也不会有哪个会引用到它。


Question: c语言帮忙帮忙！！！

Visual C++ 2010 Express简体中文版 ▼     http://pan.baidu.com/s/1bnwRVLt

好的谢谢！

还有其他的吗

你是要学习C语言的软件还是能编译C语言的软件

能编译c语言的软件 因为平时学的时候自己也想上手一下


Question: 初学者求解关于建立C程序的最基本问题

printf("a=%d(10)=%o(8)=%x(16)", a, a, a);

谢谢！


Question: 这个指针为什么无法输出元素，

最后一个 printf() 输出的是指针吧，不是指向的元素；要输出指向的元素的值，应加上取值的 * 如 printf(..., *p, *v, *u);

谢谢，大佬。那大佬怎么保存vs2019的对与处理器的修改。

什么是指针指向多维数组？ int a； p=a 那＊p=a是否相等？＊p改变了a改变吗？

多维数组，就是如 aArrp[6][8] 这样的有两个或以上下标的数组，指向这样数组的指针就是了。 不相等，应该是 p=&a; 吧，就是把 a 的地址给 p 即让 p 指向 a；这样，*p=b; 就会改变 a 的，使其和 b 内容一样。


Question: C语言求助一题，如何归并两个本就有序的文本文件

可以当cvs文件处理

好像是有些麻烦，不如分两步，首先简单合并如 A aaa\nA bbb\nA ccc\nB aaa\n... 然后再对其进行关键字同项合并。

好像就是这样，谢谢！但是怎么才能同项合并呢

同项合并简单吧，读入一行，分解为关键字和值，比较此关键字和前面是否一样，若一样，输出空格和本次值，若不一样输出回车换行、本次关键字、空格、本次值；继续读入下一行到文件末。


Question: x+z%3*(int)(x+y)%2/4这里的int 是什么意思？

(type)...将...强转为type类型

(int)(x+y) 将 x+y 得到的值取整。


Question: 求大神帮忙解答一下为什么程序有时候可以正常运行有时候会崩掉

MakeNode() 里的 malloc() 里的 sizeof(ElemType) 是不对的，应该是 sizeof(LNode)

好像确实是这个问题 不过那为什么总会在第二个循环出错

不是总的，我在 win7 32位下用 vc2008 生成，有时第一行就出错的，但在 Ollydbg 加载执行却又能正常，没去细究，大致就是堆内存管理上结构被破坏导致内存访问了错误的地方（malloc() 函数里重设内存块部分）。

哦哦 好的谢谢


for后面的；


Question: 输入a,b两个数字，求解n的取值范围（新人），求大佬帮忙解惑

int a = 2010, b = 2011;     int n = 1;     double tx = 1;     double lf = 1;     bool bf = false;     while (true) {         if (tx >= a && !bf) {             cout << n<<endl;             bf = true;         }         if (tx > b) {             cout << n - 1;             break;         }         n++;         lf = lf + 1.0 / n;         tx = tx + 1.0 / lf;     }


Question: 深度解析 Filebeat 工作原理，轻松玩转大数据！


Question: 贪吃蛇（队列实现）

#include <iostream> #include <iomanip> #include <vector> using namespace std; int main() {     int dir[4][2]{ {0,1},{1,0},{0,-1},{-1,0} };     int n;      std::cin >> n;     int r = n - 1;     int u = 1;     int d = n - 1;     int l = 0;     vector<vector<int>> board(n, vector<int>(n));     int x = 0, y = 0;     int dict = 0;     for (int i = 0; i < n * n; i++) {         board[x][y] = i;         if (y == r && dict == 0) {             dict=(dict+1)%4;             r--;         }         if (y == l && dict == 2) {             dict = (dict + 1) % 4;             l++;         }         if (x == u && dict == 3) {             dict = (dict + 1) % 4;             u++;         }         if (x == d && dict == 1) {             dict = (dict + 1) % 4;             d--;         }         x += dir[dict][0];         y += dir[dict][1];     }     for (int i = 0; i < n; i++) {         for (int j = 0; j < n; j++) {             cout <<setw(4) << board[i][j];         }            } }


Question: 多线程间的消息通知机制

你觉得会有这样的机制吗？

这个，好像不需要吧，线程1 写就是了，写完了给线程2 发个自定义消息让它去读；因为要隔段时间才设置一次，不会发生线程1 在写时，上次的线程2 还没读完，除非线程2 读一个字符处理半天再读下一个字符。

您没明白我的意思，线程2线程1操作共享内存，肯定是要有同步机制的， 但是我还不知道怎么设置同步机制，让他不阻塞，因为像互斥锁这样的同步机制得不到锁是不向下运行的

WaitForSingleObject() 这样的函数不是有 dTimeOut 参数吗，到点了即便没拿到所有权，也是会返回的，不会死锁。


Question: 低级问题。。。。。。。

按你的代码，输入的时候71.82和A之间不能留空格。或者按你的输入，最后一个scanf的第一个%c前面留个空格试试。

噢，是哦，我就说为什么从=c1没输出，原来是输出了空格

感谢感谢

scanf("a=%d b=%d", &a, &b)改为scanf(%d %d", &a, &b)scanf("%c,%c", &c1, &c2)改为scanf(%c %c", &c1, &c2)x,y的值小数点后那么多位是咋回事?在printf中，可以限定小数位的个数为2个，改x=%6.2f,y=%6.2f

感谢

两个%c中间不能用逗号隔开吗？


Question: 大佬们，为什么这个程序中第12行sum=sum+1.0/c;是对的，sum=sum+1/c;就错了呢？这个.0有什么讲究吗？

因为常量也有类型

sum=sum+1.0/c;算出来是浮点数，sum=sum+1/c;算出来是整数，而且，C语言的整数除法跟我们的算术除法是不同，它不会帮你四舍五入，它是直接不要小数部份，算出来的结果当然是不对了。


Question: 大佬们，这咋回事啊，什么意思啊

double后面是分号不是逗号这里printf拼写错误

请仔细校对标点符号和拼写。

%lf %16.7lf


Question: 学校让做一个词典，加载的时候出问题了，不报错，自动进调试页面 ，希望大佬给看看怎么回事

自己改过了 运行成功

希望大佬看看是哪里的错误，指正一下


Question: 1~4组成无重复数字的三位数

#include <iostream> #include <vector> using namespace std; void func(int nums[4],int pos,int len,int item[3]){     if (len == 0) {         for (int i = 0; i < 3; i++)             printf("%d ", item[i]);         printf("\n");         return;     }     for (int i = pos; i < 4; i++) {         item[pos]=nums[i];         swap(nums[pos], nums[i]);         func(nums, pos + 1, len - 1, item);         swap(nums[pos], nums[i]);              }  } void pailie(int nums[4], int len) {     int item[3]{ 0 };     func(nums, 0, len, item); }  int main() {     int nums[4]{ 1,2,3,4 };     pailie(nums, 3);     }

//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //   运行qplw 1234 3输出123124132134142143213214231234241243312314321324341342412413421423431432

同学，请参考： #include <stdio.h>  int main() {     int number[] = {1, 2, 3, 4};      for (int indexI = 0; indexI < 4; indexI++) {         for (int indexJ = 0; indexJ < 4; indexJ++) {             for(int indexK = 0; indexK < 4; indexK++) {                 // 保证不重复                 if (indexI!=indexJ && indexI !=indexK &&indexJ!=indexK) {                     printf("%d%d%d\t", number[indexI], number[indexJ], number[indexK]);                 }             }         }         printf("\n");     } }


Question: 问一下为什么LocateList里运行到L->length或L->data程序就会结束

同学，你这个 CreateList传入的是一个指向结构体的二级指针，在此函数内使用了malloc分配后，它的地址与你传入的地址是不同的，所以，CreateList返回后，L指向的一个空指针或野指针，所以，你应该传入L的一级指针。还有malloc分配的空间也借了。这个CreateList函数建议简单点，直接传入一个需要创建的元素个数即可，然后，返回创建好的指针，我将它改成这样： /*函数的声明*/ SeqList* CreateList(int n) {     // L = (SeqList *)malloc(ListSize * sizeof(int)); // 原式是错的，分配内存空间与实际的不符     SeqList *L = (SeqList *)malloc(sizeof(SeqList));         printf("要输入的元素:");     for (int i = 0; i < n; i++) {         int p;         scanf("%d", &p);         L->data[i] = p;     }     printf("顺序表创建成功:");     L->length = n - 1;     for (int j = 0; j < n; j++) {         printf("%d ", L->data[j]);     }     printf("\n");          return L; // 返回创建好的指针 }


Question: C语言写简单猜数游戏

前几天也有同学发了这个：     https://bbs.csdn.net/topics/601319902  呵呵，你们是不是同一学校？ #include <stdio.h> #include <time.h> #include <stdlib.h> #include <math.h>  int main() { srand(time(0)); int weishu; printf("请选择猜的位数【1为一位数 2为2位数 3为三位数】"); scanf("%d", &weishu); int a = 0; int n = 0; int number = rand() % ((int) pow(10, weishu)) + 1; printf("number = %d\n", number); printf("请输入%d以内的数字\n", (int) pow(10, weishu)); do { n++; printf("输入你认为的数是："); scanf("%d", &a); if (number > a) { printf("小了\n"); } else if (number < a) { printf("大了\n"); } } while (number != a); printf("对了，你用%d次了\n", n); system("pause");  return 0; }


Question: 要输出这样一个3*3的二维数组 1 2 3 4 5 6 7 8 9 为什么我这个只有123？

1、数组的下标是从0开始，你的2个for循环已经越界2、printf函数的数据类型也不对3、第2个for循环完了后就可以直接换行，为什么要if条件？我把它改了，应该这样就可以了： int main () {    float a[3][3] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}};    int i, j;    for (i = 0; i < 3; i++) {        for (j = 0; j < 3; j++) {            printf("%3.0f", a[i][j]);        }        printf("\n");    }    return 0;}

#include<stdio.h> int main() {     float a[3][3] = {{1,2,3},{4,5,6},{7,8,9}};     int i,j,n;     for(i=0;i<3;i++){     for(j=0;j<3;j++,n++)         { if(n%3==0) printf("\n");             printf("%3.f",a[i][j]);                     }     } }


Question: 为什么会出错代码本身并没有错

//scanf_s("%s", name,sizeof(name));    scanf_s("%s", name);好像这儿不对。

我没看到上面的C代码里面什么地方引用memset，所以无法理解两个图之间的联系。另外，忠告是关注一下两个warning，也许有什么线索呢。


Question: 如何学好C语言，个人认为不错的一篇文章

这个文章也许有部分说得有道理，但是有一个最大的问题：提出了问题，却没有给出解决问题的办法

学好C语言，关键是遇到一个会教C语言的老师。

写这些文章的人，只有两种可能：大牛，扯蛋。对号入座。。如：C语言，谭浩强的C，确实有很多瑕疵，但是适合入门。一个没编程基础的人，看K & R的C，无疑天书。。


Question: 统计一个排列中逆序对 的个数

如果用的是计算机而不是手机APP的话，往下方看。


Question: 跪求大神指导 安装fftw3时 ./configure --enable-mpi CC=mpicc CXX=mpiCC F77=mpif77，结果出来下面的错误

楼主解决了吗 我的也是了！求解

--with-compiler=/path/to/gcc

try sudo


Question: vc6代码正确，输入数值，不显示结果

好的好的谢谢谢谢

BTW:scanf的格式串里面，字符是不转义的。

如果你认定了代码没错的话，那就只能是输入的错了你得输入 11\n这样然后再敲回车，这样才能满足scanf的胃口。

代码是没有错，你错在scanf("%d\n",&x); 这里不应该多加一个换行符\n，去掉之后，输入数字，直接回车，就可以计算出来了。 但是你加了这个换行符，就相当于你一定要先换行，再输入，才可以。

代码是没有错，你错在        scanf("%d\n",&x);

scanf()里，把那个 \n 去掉试试？


Question: 求帮助！帮忙改下错误（萌新遇难）

前两个拼写错误吧，第一个是前面预定义时错写了个小写成 SearchPresentplan，第二个是前面预定义时多敲了个字母 t 成 Intput...第三个，就是定义和使用的类型上不一样，自己看着怎么改吧。


Question: 想做一个译码的题，除了把大写字母比如A就专程A+4的字母 ，但是大写字母可以了输入数字或者小写就乱码是什么问题呢，不知道怎么将数组中是数字的单个元素输出，查了百度说如果是用%c输出要将单个元素加''

主要问题在于关系运算符不能连着用。

同学，首先，你不能直接循环整个字符数组，如果输入小于10个字符你就出错了，所以，循环条件改用sizeof更好。大写字母那个条件改为：if (ch[i] >= 65 && ch[i] <=90)，小写字母的条件改为if(ch[i]>=97 && ch[i] <=122)，还要增加一个数字的条件：if(ch[i]>=30 && ch[i] <=39)

老师，请问一下在循环条件里面怎么用sizeof


Question: 求大佬们支个招呀！！！！

我用Dev C++可以跑起来

代码在哪里？

重新发了一下


Question: 刚大一，这个看不懂，希望老哥们帮忙看一下

此贴终结，输入的时候输入成10,10了，不能用逗号，要用空格


Question: ，大一新手。pta一个题目怎么都过不了。麻烦好心人看看哪里错了。

供参考： #include<stdio.h> int main() {     int T,n,k,s;     scanf("%d",&T);     while(T--)     {         scanf("%d",&n);         s = 0;         while(n--)         {             scanf("%d",&k);             s += k;         }         if(s%5==0 && s%7==0 && s%3==0)             printf("YES\n");         else             printf("NO\n");     }     return 0; }

感谢！感谢！

第一，你想的太多了。只要判断一组就输出一个结论就行了，不必煞费苦心地“一起输出”。因为OJ系统没有交互式输入，不会乱的。第二，你想的太少了。要是数据组数稍微多一点，你的a根本就不够用。第三，非必要不用浮点数，因为浮点数不精确。我的意思是不要用pow函数。 当然，落实了第一，后面就都是多余的了。

按照您的思路确实是对的！

我的代码再要输出十几组是就会出错

感谢！


Question: 第一次在csdn发帖，本人新手刚入门c语言

同学，提示你变量a和number重复定义了，而且，你写的也太复杂 了，我把它简化了：#include <stdio.h>#include <time.h>#include <stdlib.h>#include <math.h> int main() {    srand(time(0));    int weishu;    printf("请选择猜的位数【1为一位数 2为2位数 3为三位数】");    scanf("%d", &weishu);    int a = 0;    int n = 0;    int number = rand() % ((int) pow(10, weishu)) + 1;    printf("number = %d\n", number);    printf("请输入%d以内的数字\n", (int) pow(10, weishu));    do {        n++;        printf("输入你认为的数是：");        scanf("%d", &a);        if (number > a) {            printf("小了\n");        } else if (number < a) {            printf("大了\n");        }    } while (number != a);    printf("对了，你用%d次了\n", n);    system("pause"); return 0;  }

出错理由你的图片里已经说的很清楚了。你可以把三个case下面具体的内容分别用花括号括起来试试。


Question: realloc, 静态数组，扩容。为什么可行？

请明白什么是堆，什么是栈，堆是自由存储区，一般使用链表。栈是连续存储区，堆可以改变一个单元大小，但需要你自己去操作他的生死。栈是连续的，有系统自动创建和回收。也就是说一个单元大小确定了就不能更改。因为更改它会影响下一个单元。realloc，malloc free这些都是针对堆，而不能针对栈。

实践是检验真理的唯一标准。这句话经常有意无意地被误解或者曲解。这种追求易传易记的口号实际上要求简短，所以实际上省略了很多修饰语和限定词。至少不是随便什么行为都有资格称为实践，也不是所有的实践都有资格检验真理的。

如果这样运行是可以的，那么去掉里面realloc那行以后运行，结果将还是一样的。这就足以说明那句realloc实际上不起作用。  异想天开并非进取之道，还是要把思维调整回到C语言的规范轨道上来。

这个，应该不可以吧，应该检查一下 realloc() 的返回值。

既然realloc这么好用，就没有什么风险吗？


Question: c语言贪吃蛇游戏 网上找的代码，根据自己的编译环境作了修改

看看我跟老师学的雷霆战机，有文档、素材、源代码全套：     https://space.bilibili.com/1901488254


Question: 哪位大吓有C的题来刷一下

// 下面是我写的代码，使用了二维数组，没有使用结构体#include <stdio.h>#include <string.h> #define STUDENTS 5 // 宏定义学生的人数：5个#define SUBJECTS 5 // 宏定义每个学生的科目：英语、数学、语文、体育、音乐 char Name[STUDENTS][11]; // 定义学生的姓名字符数组：Name[0]="小明"，Name[1]="王一呜"float Score[STUDENTS][SUBJECTS + 1]; // 总成绩=英语+数学+语文+体育+音乐 // 函数的声明// 输入学生的姓名和它每科的成绩void inputDate();// 打印排序前的学生的姓名和成绩void printData();// 按学生的总成绩排序（从高到低：冒泡排序）void sortData(); int main() {    // 1、输入学生的姓名和它每科的成绩    inputDate();    // 2、打印排序前的学生的姓名和成绩    printf("排序前的学生的姓名和成绩：\n");    printData();    // 3、按学生的总成绩排序（从高到低）    sortData();    // 4、打印排序后的学生的姓名和成绩    printf("排序后的学生的姓名和成绩：\n");    printData();    return 0;} // 函数的定义// 输入学生的姓名和它每科的成绩void inputDate() {    // 使用for循环，输入每个学生的姓名和他们每科的成绩    for (int indexI = 0; indexI < STUDENTS; indexI++) {        // 1、输入学生的姓名        printf("请输入第%d个学生的姓名（一共%d个）：", indexI + 1, STUDENTS);        scanf("%s", Name[indexI]);        // 2、输入这个学生的每科成绩        printf("请输入%s的英语、数学、语文、体育、音乐成绩（使用逗号分隔它们）：", Name[indexI]);        scanf("%f,%f,%f,%f,%f", &Score[indexI][0], &Score[indexI][1], &Score[indexI][2], &Score[indexI][3], &Score[indexI][4]);        // 3、统计这个学生的总成绩        // Score[indexI][SUBJECTS] = Score[indexI][0] + Score[indexI][1] + Score[indexI][2] +Score[indexI][3] +Score[indexI][4];        Score[indexI][SUBJECTS] = 0.00; // 初始化总成绩为0.00        for (int indexJ = 0; indexJ < SUBJECTS; indexJ++) {            Score[indexI][SUBJECTS] += Score[indexI][indexJ];        }        // printf("%s的英语=%8.2f、数学=%8.2f、语文=%8.2f、体育=%8.2f、音乐=%8.2f、总成绩=%8.2f\n", Name[indexI], Score[indexI][0],        //       Score[indexI][1], Score[indexI][2], Score[indexI][3], Score[indexI][4], Score[indexI][5]);    }} // 打印排序前的学生的姓名和成绩void printData() {    // 1、打印标题    printf("+----------+--------+--------+--------+--------+--------+--------+\n");    printf("|   姓名   |  英语  |  数学  |  语文  |  体育  |  音乐  | 总成绩 |\n");    printf("+----------+--------+--------+--------+--------+--------+--------+\n");    // 2、使用for循环打印每个学生的姓名和成绩    for (int indexI = 0; indexI < STUDENTS; indexI++) {        printf("|%10s|", Name[indexI]); // 打印学生的姓名        for (int indexJ = 0; indexJ < SUBJECTS + 1; indexJ++) {            printf("%8.2f|", Score[indexI][indexJ]); // 打印学生每科的成绩（包括总成绩）        }        printf("\n" );        printf("+----------+--------+--------+--------+--------+--------+--------+\n");    }} // 按学生的总成绩排（从高到低：冒泡排序）void sortData() {    for (int indexI = 0; indexI < STUDENTS - 1; indexI++) {        for (int indexJ = 0; indexJ < STUDENTS - 1 - indexI; indexJ++) {            if (Score[indexJ][SUBJECTS] < Score[indexJ + 1][SUBJECTS]) {                // 1、交换他们的姓名                char tempName[11];                strcpy(tempName, Name[indexJ]); // 把当前位置学生的姓名拷贝到临时变量中                strcpy(Name[indexJ], Name[indexJ + 1]); // 把下一个位置的学生姓名拷贝到当前位置                strcpy(Name[indexJ + 1], tempName); // 把临时变量拷贝到下一个位置的学生姓名中                // 2、交换他们每一科的成绩                for (int indexK = 0; indexK < SUBJECTS + 1; indexK++) {                    float tempScore = Score[indexJ][indexK]; // 把当前位置学生的每一科成绩存放到临时变量中                    Score[indexJ][indexK] = Score[indexJ + 1][indexK]; // 把下一个位置的学生成绩存放到当前位置上                    Score[indexJ + 1][indexK] = tempScore; // 把临时变量存放到下一个位置的学生成绩中                }            }        }    }}

#include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) #define N 5 struct Student {     int name;     float chinese;     float mathematics;     float english;     float sports;     float music;     float total_score; }stu[N]; struct Student* p;    int main() {     printf("please enter the grades of Nstudents in each subject:\n");     int y;     for (y=0;y<N;y++)     {         scanf("%d,%f,%f,%f,%f,%f",&stu[y].name, &stu[y].chinese, &stu[y].mathematics, &stu[y].english, &stu[y].sports, &stu[y].music );         stu[y].total_score = (stu[y].chinese + stu[y].mathematics + stu[y].english + stu[y].sports + stu[y].music);     }            int i, j, k;     struct Student temp;     for (i = 0; i < N - 1; i++)     {         k = i;         for (j = i + 1; j < N; j++)         {             if (stu[j].total_score > stu[k].total_score) k = j;             temp = stu[k]; stu[k] = stu[i]; stu[i] = temp;         }      }      printf("Results of %d students in each subject : \n",N);     for (p = stu; p < stu + N; p++)     {         printf("name:%d,chinese:%0.2f,mathematics:%0.2f,english:%0.2f,sports:%0.2f,music%0.2f,totoal_socre:%0.2f", p->name, p->chinese,p->mathematics, p->english, p->sports, p->music,p->total_score);         printf("\n");     }                       return 0; }        ```c #include<stdio.h> #include<stdlib.h> #pragma warning(disable:4996) #define N 5 struct Student {     int name;     float chinese;     float mathematics;     float english;     float sports;     float music;     float total_score; }stu[N]; struct Student* p;    int main() {     printf("please enter the grades of Nstudents in each subject:\n");     int y;     for (y=0;y<N;y++)     {         scanf("%d,%f,%f,%f,%f,%f",&stu[y].name, &stu[y].chinese, &stu[y].mathematics, &stu[y].english, &stu[y].sports, &stu[y].music );         stu[y].total_score = (stu[y].chinese + stu[y].mathematics + stu[y].english + stu[y].sports + stu[y].music);     }            int i, j, k;     struct Student temp;     for (i = 0; i < N - 1; i++)     {         k = i;         for (j = i + 1; j < N; j++)         {             if (stu[j].total_score > stu[k].total_score) k = j;             temp = stu[k]; stu[k] = stu[i]; stu[i] = temp;         }      }      printf("Results of %d students in each subject : \n",N);     for (p = stu; p < stu + N; p++)     {         printf("name:%d,chinese:%0.2f,mathematics:%0.2f,english:%0.2f,sports:%0.2f,music%0.2f,totoal_socre:%0.2f", p->name, p->chinese,p->mathematics, p->english, p->sports, p->music,p->total_score);         printf("\n");     }                       return 0; }          ```

多复制了一份，只看一份就可以了。

我今天的作业要求：1、输入不少于5名学生的姓名和他们语文、数学、英语、体育、音乐的成绩（小数保留2位即可）2、按他们的总成绩从高到低进行排序（冒泡、选择、快速、希尔随便选一个）3、输出像如下形式的报表：    +----------+--------+--------+--------+--------+--------+--------+    |   姓名   |  语文  |  数学  |  英语  |  体育  |  音乐  | 总成绩 |    +----------+--------+--------+--------+--------+--------+--------


Question: 大一新生C++小白，程序错误百出，但是不知道哪里错了

同学，我帮你改好了，真的错了很多，最关键是C语言的case语句只能是整数（字符也是整数的特例）： #include #include #include using namespace std; int main() {    double a, b;    char ys;    cin >> a >> b >> ys;    switch (ys) {        case '+':            cout << a << ys << b << "=" << a + b;            break;        case '-':            cout << a << ys << b << "=" << a - b;            break;        case '*':            cout << a << ys << b << "=" << a *b;            break;        case '/': {            if (b == 0.00)                cout << "除数不能为0";            else                cout << a << ys << b << "=" << a / b;        }        break;     case '%':         cout << (int)a << ys << (int)b << "=" << ((int)a % (int)b);         break;     default:         cout << "error!"; } cout << endl;  return 0;  }

感谢感谢，我懂了


Question: 为什么gcc默认的char类型是有符号的？

既然C语言标准放任了这个问题存在于Implementation Defined，那就是公说公理，婆说婆理的事儿了，咱们就不要企图从理上理解他了，接受就好。也就是心中不做假设。如果语义上真的只需要字符，那就上char如果需要它来表达小整数，那就按自己的需要明确使用signed char或者unsigned char

与硬件架构相关，gcc也不总是默认char是signed char，在ARM、PPC平台上默认就是unsigned char


Question: 求助！！新手小白的疑问

while (scanf_s("%d", &x)!=EOF);这一句是啥意思

while (scanf_s("%d", &x)!=EOF);

你while语句的那行多写了一个 ;

谢谢！解决啦


Question: 高性能接收和处理消息问题

1、自己写吧，练练手，没啥难度。2、s2全局序号没任何意义。s1发送N个数据包，s2可能一次就接收完了。

自己顶一下


老师，转到定义之后呢，怎么操作

按照函数定义调用函数

刚刚解决了，在vs2019中已经取消了fopen，在头文件从新声明（加入）#pragma warning(disable:4996) 就可以了。

好像不太行啊大哥

已经解决：


Question: 对于计算函数的n次方该如何用c语言写出

double pow(double,double)declared in math.h


Question: 实在搞不懂了，救救。

我主要强调转义字符是一个编译期概念，编译结束以后就再也没有什么转义字符了。

感谢感谢。

同学，你这个小程序至少有2个地方有问题：1、char *st;这里你只定义了一个字符指针，没有为它分配空间，它在下面读取的时候会出现不可预料的错误。2、输入的“pro\ngrme"，每一个都是正常可显示的字符，不是换行符也不是回车符，所以，它不可能与'\n'或'\0’相等如果你非要将某个字符转换为换行符或回车符，建议使用反斜杠‘/’。

感谢感谢。


Question: 编写一个JavaScript脚本，在浏览器中输出3位整数中的所有对称数（个位和百位相同）。

最近刚好在折腾JS  帮你改了下 <html> <body> <script>      var str="3位整数中的所有对称数如下：<br />";      var g,s,b,i=100;                          for(var i=100;i<1000;i++){                 g=i%100;                 s=(i-i%10)/10;                 b=(i-i%100)/100;                 if(b==g){                 str+=" "+i+" ";                    }                         }     document.write(str);  </script> </body> </html>

想不出来啊，有没有大佬啊


Question: 不知道为什么Compilation Error。求大佬解答

int m,n,x=0,y=0,i,j,k,t; int a[j];  在这里j没有初始值，是不能定义数组a。还有一点，如果你的编译器不支持c99，数组的大小还不可以是变量。

太谢谢了，大佬强啊👏


Question: 分享一下写了N年的自用编辑器 -- EDX

使用了下，不错，功能强大，把python调试环境支持下就完美了。！

能undo,redo吗？ 支持键盘宏/脚本宏吗？


Question: 新人求解，刚入门，很简单的

int a;scanf("%d",&a);int b=a%10100+a/100+a%100/1010;printf("%d",b);  同学，这样才对。你a还没有初值，怎么可以使用它呢？

int main(){    int a;    scanf("%d",&a);printf("%d",a%10100+a/100+a%100/1010); 这个就是对的，那我原来那个错哪了

printf语句里面不要加&

还是不对

a初值没有赋初值，程序是依次执行的，你要使用a就要先赋值再使用，其次，printf不要加&


Question: 学生刚入门，求解问题

你的输出有问题printf("语文成绩为 %f\n数学成绩为 ：%f\n",y,s)

你的s有啥用吗？输入是不是得是%lf，倒数第二行差，&y，&s （我也不确定 我也是小白）

输入的话float是%f，double是%lf，printf里面不加&


Question: 四则运算计算器怎么才能让输出的负数带括号

1、输入第1个操作数2、输入四则中任一个运算符3、输入第2个操作数4、使用switch语句，根据运算符，进行四则运算。如果在除法中，除数为0，输出“除数不能为0”。否则，在printf中输出结果，如果操作数小于0，加括号。  这位哥哥好象是大学生，我还是小学生，打扰了！

so easy! 妈妈再也不用担心你的学习问题～


Question: 四则运算计算器怎么才能让输出的负数带括号

格式字符串那里是可以换成一个字符数组名或者字符指针的。


Question: 哪里错了或者是语法错误

因为当把一个字符串改为整形的时候，系统是以ASCII把来输出的，无需强制转换。

把a=int(x),修改为    a =x;

看着没什么问题啊。

又是你 哈哈

幸会  幸会

该代码就是将英文字母转化为序号1,2,3，——26


Question: 我不李姐 天哪 我认为的是p=5+6+7 q=6+7+8

我的是vs2019，运行的结果是15，24，懒得去研究得，反正后面一般用得最多的就只是一个递增或递减，不会无聊的用到这个。

特别安装了一个vs2019看看，果然与我用开的dev-c++是不同的，vs是遵从后置++当整行运算完成后，才改变自身的值！vs2019：15，22dev-c++：18，22

不同编译器不同结果，李不李姐无所谓。

1、后置++（--），是在整行运算完成后才改变自身的值，2、前置++（--），是先改变身的值，再参与整行的运算

我认为p=5+6+7 q=6+7+8是对的，但vs不这么认为，我也不理解，呵呵


Question: 这个问题怎么解决啊 球球了 大佬们

C 库函数 double pow(double x, double y) 返回 x 的 y 次幂，即 xy。

数据范围很重要，写个最简单的整数的次幂，提供大致的思路，供参考： #include<stdio.h> int fun(int n,int m) {      int  s=1;      while(m--) s *= n;      return s; } int main() {      int a,b,c;      scanf("%d%d%d",&a,&b,&c);      printf("%-9d%-9d%-9d\n%-9d%-9d%-9d\n%-9d%-9d%-9d\n",                               fun(a,1),fun(a,2),fun(a,3),                               fun(b,1),fun(b,2),fun(b,3),                               fun(c,1),fun(c,2),fun(c,3));            return 0; }

谢谢谢谢

数的大小没说  那可不是写个代码就能解决的问题啊


Question: 关于字符指针定义奇怪的地方

你发送是一个结构体，接收也应该是一个结构体。message = (struct tcp_msg *)buf;这句肯定是错的，buf是字符串数组，怎么能强转成message结构体？

这个是可以的，就将字符串按照结构体的类型划分空间

一般是这样用吧 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <syspes.h> #include <sys/socket.h> #include <arpa/inet.h> #include <string.h>  #include "proto.h"  #define DATASIZE    128  int main(int argc,char **argv) {     int sock_fd;     struct sockaddr_in s_addr;     uint8_t data[DATASIZE];     int res;      if(argc < 2)     {         fprintf(stderr,"error : %s + destip!\n",argv[1]);         exit(1);     }      if((sock_fd = socket(AF_INET,SOCK_STREAM,0)) < 0)     {         perror("socket");         exit(1);     }          s_addr.sin_family = AF_INET;     s_addr.sin_port = htons(PORT);     inet_pton(AF_INET,argv[1],&s_addr.sin_addr);     if(connect(sock_fd,(void *)&s_addr,sizeof(s_addr)) < 0)     {         perror("conne);ct");         exit(2);     }          while(1)     {         gets(data);         if(!strcmp(data,"exit"))             break;          if(write(sock_fd,data,DATASIZE) < 0)         {             perror("write");             break;         }          res = read(sock_fd,data,DATASIZE);         if(res < 0)         {             perror("read");             break;         }                      if(res == 0)         {             printf("server is shutdown!\n");             break;         }                  puts(data);     }      close(sock_fd);     exit(0); }

ssize_t send(int sockfd, const void *buf, size_t len, int flags); 这个应该传空类型的指针吧，也没见过传结构体的。

这个空指的是可以传任何类型的指针


a[2]={1,2,3,4};就是定义了一个num结构体数组，它的大小是2这样写可能有点费解，如果你把它改为这样：a[2] = {{1, 2}, {3, 4}};就很好理解了

谢谢您的回复，a[2]不是应该表示这个数组中的第三个元素吗？

同学，a[2]在这个位置上是定义，不是取值，而且，你这个数组的数据类型是结构体啊，每个结构体里面定义了2个整型。

就是这里有点糊涂，给您添麻烦了！那 *p=a;是不是表示指针指向了a数组的第一个位置呢


Question: gbk编码中怎么区分中文和英文？判断方式是什么？

转为Unicode，切分，转回GBK

IsDBCSLeadByte

大佬，这是什么意思？没有看懂

IsDBCSLeadByte只是判断一个指定字节是否为一个双字节字符的头一个字符，而汉字的高字节和低字节都是大于0x80的，所以没什么区别

方法，方法，方法... 从buffer[0]开始怎么判断到需要截取的位置


Question: 求求了 想一晚上了 if语句没生效

没事了没事了 我处理好了 谢谢大家

楼主的意思，是输入三个一位数，1--9 之间？

啥叫“当有0的时候消掉0”？

刚把if删了。。


Question: 为什么输出结果数据有问题？求教

是不是因为BMR是浮点数，而655和230都是整型

单步运行，看看各处的各相关值是否和预期一致，就象你这里好像没给 M 和 F 变量赋值就用上了，编译时不给 error 起码也是 warning 么？数据的输入，好像要和设定的格式完全一致的，否则可能有误。


Question: 代码看起来没有错，可是为什么不会停止

已解决，第一个for语句的括号位置不对：以下是正确的代码：#include <stdio.h>#include <string.h> struct Person{    char name[30];    int count; }leader[3] = { "li",0,"zhang",0,"ran",0 }; int main() { int i, j; for (i = 0; i < 10; i++) {     char leader_name[30];     printf_s("please enter the name of the elector:\n");     scanf_s("%s", leader_name, 30);     for (j = 0; j < 3; j++)     {         if (strcmp(leader_name, leader[j].name) == 0) leader[j].count++;      } } printf_s("\nResult:\n"); for (i = 0; i < 3; i++)     {         printf_s("%s,%d", leader[i].name, leader[i].count);     }            return 0;


Question: 老师们帮我看一下这个代码错在哪里。输入和输出不相符。

就是这个问题，非常感谢


Question: json-c库的浮点型存储问题

浮点数格式  ▼     http://bbs.csdn.net/topics/390676437

楼主您对标准的误会到今天就打住吧，这样的才是标准的，而不是您以为那样。

是吗？肤浅了

别只知道喷 那点资料让我这个菜鸟学习学习嘛， 你说这句话对你我都没啥益处对不对


Question: 为什么下面这段用c语言判断回文数的代码在vs2019上跑的出来，在vc++2010上跑不出来

#include <stdio.h> #include <string.h> #define N 80  int fun(char* str) {     int sz = strlen(str);     int i = 0, j = sz-1;     while (str[i] == str[j])     {         i++;         j--;         if (i >= j)             break;     }      return (i >= j); }   void main() {     char s[N];     FILE* out;     char* test[] = { "1234321","123421","123321","abcdCBA" };     int i;     printf("Enter a string : ");     gets(s);     printf("\n\n");     puts(s);          if (fun(s))         printf("YES\n");     else         printf("NO\n");     /************************************/     out = fopen("out.dat", "w");     for (i = 0; i < 4; i++)         if (fun(test[i]))             fprintf(out, "%s --> YES\n", test[i]);         else             fprintf(out, "%s --> NO\n", test[i]);     fclose(out);     /************************************/ }

你的“int sz = sizeof(str) / sizeof(str[0]);”这条语句错了，sizeof(str)返回的是指针的大小，32位程序是4，64位程序是8。如果要返回空终结字符数组中元素的个数，应该用strlen(str)。

嗯，我也不信这个代码能在vs任何版本上得到正确结果。

sz 的求取是错的，直接用求字符串长度减1 就是了。


Question: codeblock怎么打开dev c++的项目

为什么要打开其他软件的项目呢？作业这种东西只需要交源程序就可以了，基本和项目无关。就算有关，也只需要在codeblock中打开源程序，编写完成后使用dev c++编译调试。 最后，我感觉你应该是对老师的要求理解有误！这种要求最多就是上机考试时只提供dev c++环境，所以叫你们熟悉它


Question: 求大佬帮忙看看这是咋了

同学，你错误的地方就是scanf这句用错了！使用scanf时最好给输入者清析的提示，把它改成这样就更好啦： int main() {    float a, b, h, s; printf("请输入梯形的上、下底和高(请用,分隔它们)："); scanf("%f,%f,%f", &a, &b, &h); s = (a + b) * h / 2; printf("梯形上底=%8.2f, 下底=%8.2f, 高=%8.2f, 它的面积=%8.2f\n", a, b, h, s);  return 0;  }

ok,感谢，想这个想了好久

and cut '&' off from printf

typea=4,b=6,h=4then press enteras if your scanf format


Question: 急turboc的问题

应该是环境没设置好。另外没在dosbox下玩过，我在virtualbox下玩过。路径里有没有超过8个的文件名，空格等字符，dos都是不支持的  好久不见有人用这个了，你是什么学校的，竟然还在用tc？

图怎么换了。应该#include <graphics.h>

貌似程序在等输入。

代码内容帖上来

老师求你帮忙看看

哦，你是TC都没运行起来，可能是你下载的版本有问题

Alt+F，OS Shell，再运行你的程序

大神，不行唉 我能私信问你吗


Question: 调用函数的返回类别...

使用struct fa就是值传递，因为它是一个结构体，所以，传递进函数需要将原数据复制一份副本，而且，你在函数内修改的是这份复制的副本，对原数据是没有影响的， 这样降低效率又不是你想要的，因此，只能是使用struct fa *传结构体的指针。另外，因为函数传进来的是结构体指针，所以，也不需要返回值。

请不要碎片化学习，知识这玩意是有体系的，只有学习了前置内容，才能正确使用术语进行提问。

这是一道改错题，不懂为什么调用函数返回指针的地址，其类别为什么是struct fa *,不用’*‘可以吗


Question: 简单的题但却疑惑并且新人懵逼中

我经常说，学习汇编和C之前，要抛弃小时候的”自动“观念，机器不会自动做任何事。我是说，你输入一个数和输出一个数之间啥也没有，在那中间机器不会自动给你做任何事。

我懂了！谢谢！


Question: 这个错误怎么改呢，求大神

1、先声明函数：int insertSeqList(SeqList *L, int i);2、不能在函数里面，定义另一个函数。我刚学C语言时，最常犯的错误就是在main()函数里定义了另一个函数，呵呵。

直译一下：函数定义不能放在这里。所以和你贴出来的部分没啥关系，问题在你没贴出来的部分里面。


Question: 怎么将b链表中有的数但a链表中没有的数插进a链表中

同学，参考我在B站的分享：     https://space.bilibili.com/1901488254   循环A链表，遍历B链表查找，没有再插入。

复杂度有点高了，直接用一个数组进行提前记录可以更好


Question: 二级指针的问题。。。。

定义时： ... *p;表示p为指向...的指针 ... &r;表示r为...的引用，且只有c++才有引用  表达式中： *p表示取指针p指向的内容 &r表示取指向r的指针

同学，我举个简单的例子，你就明白了：int main() {    int **a;    int *p;    int data = 100;    p = &data;    a = &p;  printf("**a = %X, *a = %X, data = %d\n", a, p, **a);  return 0;  }


Question: 为什么我不能输出我的单链表

数据结构对单链表进行数据排序  ▼     http://bbs.csdn.net/topics/392201633

似乎是第38行并没有改变L，InitList对L的修改只停留在InitList内，当我在InitList内输出时就可以成功了 修改后，代码如下： #include <stdio.h> #include <stdlib.h>  typedef struct LNode {     int data;     struct LNode *next; } LNode, *LinkList;  void InitList(LinkList L) {     LNode *s, *p;                       //S指向新申请的结点，P指向后结点     L = (LNode *)malloc(sizeof(LNode)); //建立头结点     L->data = -1;     L->next = NULL;     p = L; //P指向头结点     int n;     scanf("%d", &n);     for (; n != 0;) {         s = (LinkList)malloc(sizeof(LNode)); //新建结点         s->data = n; //放入data         s->next = NULL;         p->next = s;                        //P结点指向新结点S         p = s;                        //p取代s结点         scanf("%d", &n);     }     p->next = NULL; //终端结点不指向     outlist(L); }  void outlist(LinkList L ) {     LNode *p;     for (p = L->next; p != NULL; p = p->next) {         printf("%d ", p->data);     }     printf("\n"); }  int main() {     LinkList L;     InitList(&L);     //相当于传入一个变量，而非地址？     //outlist(L);     return 0; }

修改如下，供参考： #include <stdio.h> #include <stdlib.h>  typedef struct LNode {     int data;     struct LNode *next; } LNode, *LinkList;  void InitList(LinkList * L) {     LNode *s, *p;                       //S指向新申请的结点，P指向后结点     (*L) = (LNode *)malloc(sizeof(LNode)); //建立头结点     (*L)->data = -1;     (*L)->next = NULL;     p = (*L); //P指向头结点     int n;     scanf("%d", &n);     for (; n != 0;) {         s = (LNode *)malloc(sizeof(LNode)); //新建结点         s->data = n;                        //放入data         p->next = s;                        //P结点指向新结点S         p = p->next;                        //p取代s结点         scanf("%d", &n);     }     p->next = NULL; //终端结点不指向 }  void outlist(LinkList L ) {     LinkList p = L->next;//LinkList p = L;                          //L = L->next;     while ( p != NULL ) {         printf("%d ", p->data);         p = p->next;     } }   int main() {     LinkList L;     InitList(&L);     outlist(L);          return 0; }

同学，你这个程序很多错误的地方，重复的语句，你可以从我分享的网盘中下载我关于链表的实现（增、删、改、查、排序）：     https://space.bilibili.com/1901488254


Question: 关于反序输出递归函数的疑问

试了一下，发现确实可以这样，谢谢大佬的建议

递归算法都比较烧脑，这个算法关键在于这句： reverse(&s[1]);它实质上就是每次都向右移动了字符串的首地址一个位置，你把 putchar(s[0]);换成这样：printf("s=%s, s[0]=%c\n", s, s[0]);就很容易看出，它是如何做的。

对，就是这句 reverse(&s[1]);我不理解它是如何运作以达到这个效果的，使用了后面的方法看到了怎么“归”，就是不知道怎么递出去的 谢谢大佬解惑


Question: sqrt的用法是怎样的。。。。。。

常量也有类型

因为sqrt的函数原型的参数就是double，而不是int。如果sqrt参数是Int，那么他计算double,必然会丢失参数的浮点部分，而如果是double，int转double，是不会丢失什么的

那是使用数学函数时，都要转换吗

查函数说明

原来你关心这个，那么检查一下你的代码里头文件写对写全了么？

不用强转吧，你什么IDE?

嗯，这是您应该做的。

k=sqrt((double(i)+100); m=sqrt((double(i)+268);同学，你粗心了，强转都写错了，应该是这样吧：k = sqrt((double)i + 100);m = sqrt((double)i + 268);

知道，但是为什么要强转后才能使用sqrt函数呢

虽然sqrt形参是double，但也不需要强转，除非你所用的编译器非常古老，否则，现在的编译器基本上都能帮你自己转换


Question: 数组传参，数组指针自加减，GCC编译报错

所以我们应该知道，在不同编译器上表现不同的写法应该规避。这个才是重要的。

强转之后就是右值了

void* my_memcpy(void* dest, const void* src, size_t count) {     char* ret = dest;     assert(dest != NULL);     assert(src != NULL);     //char* pd = dest;     //const char* ps = src;      while (count--)     {         *(char*)dest=*(char*)src;         ++dest;         ++src;     }     return ret; }  去掉(char*)强制转换后，GCC倒是编译通过了，但是Vistual studio 又报错了。。。

前面的(char *)是蛇足啊，不加它也能保证++是加1的。加上它以后gcc认为强制转换后的结果不是左值了，所以不能++

谢谢，但是去掉(char*) 强制转换后vs报错。。，GCC倒是编译通过了  严重性	代码	说明	项目	文件	行	禁止显示状态 错误(活动)	E0852	表达式必须是指向完整对象类型的指针	Project1	D:\Micsoft Visual Studio 2019\source\repos\Project1\struct.c	16

不喜欢下面的代码?while((*dest++ = *src++ )!= '\0');

楼主的意图不是复制字符串，所以无法使用空字符作为结束标准。

感谢，但是就像@forever74 所说，需求是内存拷贝，不是string拷贝。


Question: 有关if的问题。。。。。。。。

把continue去掉就好了，因为你只有一层循环，所以当第一次执行完if的printf之后continue到了下一次循环，跳过了printf（“%d，--x”）此时第一次循环完成后的x=6，进入循环后，x--得到5，以此类推，每次遇到continue就直接进入了下一次循环，所以得到的是8542

int main() {    int x = 8;    for (; x > 0; x--) {        if (x % 3) {            printf("3x!=%d,", x--);            continue;     }     printf("3x=%d,", --x); }  return 0;  }把它改为这样，你就会很容易看明白，它的结果是：3x!=8,3x=5,3x!=4,3x!=2,当最后一次x=2时，打印完后，它自减1，变成1，然后continue回到for循环，又自减1，此时，x=0，它已符合for循环的中止条件了，退出。

if(x%3)  相当于   if (x % 3 != 0) ，所以x=8 时，打印出 8 ，x-- =>7 ,countinue 跳到 for(;;x--)  x=7-1 = 6;    x=6%3==0 执行printf("%d",--x)；x=6先自减1  x=5 ,打印出 5 ，回到for(;;x--)   x=4 ,以此类推，输出了：8542 .


Question: 球球大神帮我看看这是为什么啊

可为什么我做的时候要将b=sqrt(a+100)变成b=sqrt((double)a+100)呢，不然显示错误，这是为什么呢

不用啊，你是不是代码打错了

将if(bb==a+100&&cc==b+268)改为 if(bb==a+100&&cc==a+268)

谢谢大哥

因为您打字马虎了混淆了两个变量。

谢谢大哥


另外，最后一个输入从参数上看应写为scanf_s("%c",&chr_d,1);

在printf_s("please chr a number:");之前加多一句fflush(stdin);这是因为，你在scanf_s("%lf", &dbe_c);输入时，按下了回车键确认，回车符还留在键盘输入缓冲区，所以，要把它清除掉。


Question: 字符指针值可以直接相减吗

p-'0'相当于49-48=1，q-'0'相当于53-48=5（对应的字符ASCII码相减）也就是将字符转为整数。

为什么不能直接用*p+*q得出结果为5呢

‘1’的ASCII码是49，‘5’的ASCII码是53，*p+*q就变成49+53。减去字符0相当于将字符转为数字。

感谢


Question: 关于16进制与内存地址的几个疑惑

首先地址在计算机中肯定是以2进制表示的。16进制只是在书写或源程序中出现。为什么书写中经常出现16进制（其实有些地方是8进制，效果和原理一样）而不是10进制，可以参考一下赵4老师的回复，原因就是：以小数点为基准，每4个2进制对应一个16进制，熟练后一眼就可以转换，10进制做不到这点。也许你要抬杠，说为什么不直接用2进制，原因是：2进制太长且一大堆0、1（对于人来说）容易搞错

二进制：1111 0101 1010 1000 16进制：F    5    A    8 十进制：62888

我觉得对这一块的理解到一定点就可以了，没有必要深究，再说也用不上。就像牛顿定理，已经告诉你这样可以实现或解决一些现象，那我们记住就可以了，没有必要再往下问，如果一直这样问下去，会影响学习，再者，老师都回答不上来。

有一点题外话。学校里的学习是循序的，每门课的大纲上都有先修课程一说，而互联网上的学习破坏了这一点。因此建议借助互联网学习的人士要自行循序，这样知识才能自洽，不至于碎片化。

1、书上应该提到，四位二进制的组合共有16种，与十六进制数字是一一对应的，这就是转换简单的意思。2、确切地说地址就是个整数，天生是二进制的，只不过由于上述理由转换容易，经常缩写为十六进制形式而已。地址本身不用保存，可以说它就是存储单元在存储芯片上的坐标，就像经纬度不需要刻在地面上一样。但是寻址的时候需要表达这个地址，前面说了，地址就是个整数，它占用的空间大小要分开来说：物理地址长度取决于硬件平台有多少根地址总线，经典的32位硬件经常带32位地址总线，所以使用32位地址；常见的64位平台经常支持48根地址总线，所以使用48位地址。逻辑地址长度看操作系统和程序语言的喜好，它们各有各的喜好。从逻辑到物理的映射不是一个一个的，而是一块一块的，因此只需要记录用得到的块的首地址。

1、书上应该提到，四位二进制的组合共有16种，与十六进制数字是一一对应的，这就是转换简单的意思。————书上教了。但是我觉得难易度和二进制与十进制转换方法差不多。故有此问。 2、还有什么讲这个问题比较好的书推荐么？

1、那么您心算一定很快，对于难易度的看法与普通人有一些分歧，而书本一般都假设读者是普通人。 2、有肯定是有，但因为我不记得哪件事是从哪里看到过的，所以无法推荐。前置课程大约硬的方面是数字电路和微机原理，软的方面是操作系统吧。

二进制到16进制转换只需要移位就可以了，二进制到十进制需要用到除法，怎么转换方法差不多呢？你写过这两种转换的C代码吗？