Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: sqrt的用法是怎样的。。。。。。 

回复:
user: user-1
content: 常量也有类型

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

user: user-0
content: 那是使用数学函数时，都要转换吗

user: user-2
content: 查函数说明

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

user: user-4
content: 不用强转吧，你什么IDE?

user: user-3
content: 嗯，这是您应该做的。

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

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

user: user-5
content: 虽然sqrt形参是double，但也不需要强转，除非你所用的编译器非常古老，否则，现在的编译器基本上都能帮你自己转换
user-0 提问: 数组传参，数组指针自加减，GCC编译报错

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

user: user-2
content: 强转之后就是右值了

user: user-0
content: 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 又报错了。。。

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

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

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

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

user: user-0
content: 感谢，但是就像@forever74 所说，需求是内存拷贝，不是string拷贝。
user-0 提问: 有关if的问题。。。。。。。。

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

user: user-2
content: 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循环的中止条件了，退出。

user: user-3
content: 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 .
user-0 提问: 球球大神帮我看看这是为什么啊

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

user: user-0
content: 不用啊，你是不是代码打错了

user: user-2
content: 将if(bb==a+100&&cc==b+268)改为 if(bb==a+100&&cc==a+268)

user: user-0
content: 谢谢大哥

user: user-3
content: 因为您打字马虎了混淆了两个变量。

user: user-0
content: 谢谢大哥
user-0 提问: 大家好，请帮我看一下，为什么最后的字符输不出来。（chr_d）

回复:
user: user-1
content: 另外，最后一个输入从参数上看应写为scanf_s("%c",&chr_d,1);

user: user-2
content: 在printf_s("please chr a number:");之前加多一句fflush(stdin);这是因为，你在scanf_s("%lf", &dbe_c);输入时，按下了回车键确认，回车符还留在键盘输入缓冲区，所以，要把它清除掉。
user-0 提问: 字符指针值可以直接相减吗

回复:
user: user-1
content: p-'0'相当于49-48=1，q-'0'相当于53-48=5（对应的字符ASCII码相减）也就是将字符转为整数。

user: user-0
content: 为什么不能直接用*p+*q得出结果为5呢

user: user-1
content: ‘1’的ASCII码是49，‘5’的ASCII码是53，*p+*q就变成49+53。减去字符0相当于将字符转为数字。

user: user-0
content: 感谢
user-0 提问: 关于16进制与内存地址的几个疑惑

回复:
user: user-1
content: 首先地址在计算机中肯定是以2进制表示的。16进制只是在书写或源程序中出现。为什么书写中经常出现16进制（其实有些地方是8进制，效果和原理一样）而不是10进制，可以参考一下赵4老师的回复，原因就是：以小数点为基准，每4个2进制对应一个16进制，熟练后一眼就可以转换，10进制做不到这点。也许你要抬杠，说为什么不直接用2进制，原因是：2进制太长且一大堆0、1（对于人来说）容易搞错

user: user-2
content: 二进制：1111 0101 1010 1000 16进制：F    5    A    8 十进制：62888

user: user-3
content: 我觉得对这一块的理解到一定点就可以了，没有必要深究，再说也用不上。就像牛顿定理，已经告诉你这样可以实现或解决一些现象，那我们记住就可以了，没有必要再往下问，如果一直这样问下去，会影响学习，再者，老师都回答不上来。

user: user-4
content: 有一点题外话。学校里的学习是循序的，每门课的大纲上都有先修课程一说，而互联网上的学习破坏了这一点。因此建议借助互联网学习的人士要自行循序，这样知识才能自洽，不至于碎片化。

user: user-4
content: 1、书上应该提到，四位二进制的组合共有16种，与十六进制数字是一一对应的，这就是转换简单的意思。2、确切地说地址就是个整数，天生是二进制的，只不过由于上述理由转换容易，经常缩写为十六进制形式而已。地址本身不用保存，可以说它就是存储单元在存储芯片上的坐标，就像经纬度不需要刻在地面上一样。但是寻址的时候需要表达这个地址，前面说了，地址就是个整数，它占用的空间大小要分开来说：物理地址长度取决于硬件平台有多少根地址总线，经典的32位硬件经常带32位地址总线，所以使用32位地址；常见的64位平台经常支持48根地址总线，所以使用48位地址。逻辑地址长度看操作系统和程序语言的喜好，它们各有各的喜好。从逻辑到物理的映射不是一个一个的，而是一块一块的，因此只需要记录用得到的块的首地址。

user: user-0
content: 1、书上应该提到，四位二进制的组合共有16种，与十六进制数字是一一对应的，这就是转换简单的意思。————书上教了。但是我觉得难易度和二进制与十进制转换方法差不多。故有此问。 2、还有什么讲这个问题比较好的书推荐么？

user: user-4
content: 1、那么您心算一定很快，对于难易度的看法与普通人有一些分歧，而书本一般都假设读者是普通人。 2、有肯定是有，但因为我不记得哪件事是从哪里看到过的，所以无法推荐。前置课程大约硬的方面是数字电路和微机原理，软的方面是操作系统吧。

user: user-5
content: 二进制到16进制转换只需要移位就可以了，二进制到十进制需要用到除法，怎么转换方法差不多呢？你写过这两种转换的C代码吗？
user-0 提问: 关于C语言的向上取整

回复:
user: user-1
content: 按照 你自己的代码，我运行了一次，在我的计算机上是可以运行并计算的。并且采用了两种输入试了一下都是可以正常计算，并且按整数输出。第一次输入 ，，10，2 第二次输入，，7，3 一次输出没有小数，和一次输出有小数都呆以正常取整

user: user-2
content: 这跟C没啥关系吧？如果i/j正好能整除呢？

user: user-0
content: 正好整除向上取整也得加一吧，我是做题用到后者AC了，但是前者WA了，搞不懂i/j+1为什么不行

user: user-2
content: 那一定是我对向上取整有误解，抱歉。
user-0 提问: 关于递归调用的理解？？？？？？？

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

user: user-2
content: 递归这里我老是肯不动。学习中

user: user-3
content: 你起床后打算吃米饭，于是你开始递归：要吃总得先盛到碗里吧，先调用盛饭函数。锅里居然是空的，先调用做饭函数。然而上次用完后锅还没刷，先调用刷锅函数。注意你的输出，1010是这样产生的：你刷了锅然后淘了米放了水点了火煮好了以后打开锅盖挖一勺到碗里开始......递归做菜

user: user-0
content: 感谢，瞬间懂了
user-0 提问: 51单片机函数声明和函数传参的问题。

回复:
user: user-1
content: 楼主您的代码段没有表现出和两个问题的联系，这就很难回答了。

user: user-0
content: 您好 就是 能不能把SMG1 传到函数里呢？

user: user-1
content: 首先肯定是能。 但是传进来干嘛？你的函数都不使用它，直接就重新赋值，也就扔掉传进来的值了。

user: user-0
content: 我明白了，他传进来，替换smg，然后又被赋值了，对吧？实际上P0,P1并没有被传进来。我应该做的是吧P0或者P1传进来，而不是把SMG1SMG2传进来。。。是这样理解吗？
user-0 提问: {已解决}C Primer Plus初学，请教第四章的一道编程题目

回复:
user: user-1
content: int main() {    char first_name[40];    char last_name[40];    char* p1;    char* p2;    p1 = first_name;    p2 = last_name; printf_s("Please input your first name:\n"); gets(p1); printf_s("Please input your last_name:\n"); gets(p2); printf_s("%s %s", p1, p2); return 0;  }
user-0 提问: 指针，，，，，，， 

回复:
user: user-1
content: 给p赋值，是修改p的指向，并不能修改p的目标里面的内容。尤其需要这样理解的是p="sffd";这句。是在内存另外的位置保存了sffd这样的内容，然后用p指向那里的意思。

user: user-0
content: 感谢
user-0 提问: void 类型的指针可以存储任何类型的数据吗 

回复:
user: user-1
content: 感觉最好声明清楚比较好，否则后面容易混淆 void * p;    int a = 3;    p = &a;    printf("%d", *p);    return 0;

user: user-2
content: 是可以的，但是在你取回原来的类型值时，就需要强转了。比如，你要拿回p指向的值（也就是整型3），就需要这样做：*(int *)p

user: user-0
content: 也就是void 指针可以存储任何类似的数据，但要使用的时候，就要用*(int*)p进行强转后取值吗
user-0 提问: 帮我看看编译错哪了？

回复:
user: user-1
content: 试一了下，还是在中文下面输入符号的问题引起。

user: user-0
content: 感谢，问题已解决

user: user-2
content: printf("math = %d, eng = %d, comp = %d, average = %d"，（这个逗号，你用了纯中文符号）87,72,93,（（这个括号，你用了纯中文符号）87+72+93）（这个括号，你用了纯中文符号）/3)；（这个分号，你用了纯中文符号） return 0；（这个分号，你用了纯中文符号） 我不知道你用的是什么IDE，但最好能选择一种在纯中文与英文符号有明显区别的字体。

user: user-3
content: 计算的结果不是整数，跟%d不匹配

user: user-0
content: ......是分号的问题可以直接输出

user: user-4
content: 不能直接在输出函数中直接输入数据进行输出
user-0 提问: 求教：同样的功能，一个main()实现vs几个函数实现，哪种情况效率高？

回复:
user: user-1
content: 最明显的一条定律：同样的函数，能用宏定义实现，优先使用宏定义，它比online函数的效率更高。

user: user-0
content: 谢谢指点

user: user-2
content: 啥叫效率？实现同样功能的代码简短叫效率；代码被编译的过程占用的时间短叫效率；代码执行的时候用的总时间短叫效率；代码执行的CPU时间短叫效率；代码执行时占用的存储空间小叫效率；代码执行时的IO次数少也叫效率；......偏偏这些效率往往是互相矛盾的，压下葫芦起来瓢。

user: user-0
content: 谢谢指点

user: user-3
content: 基本没区别。 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-0
content: 谢谢指点
user-0 提问: 。。。。。。。。。。。。。。

回复:
user: user-1
content: 你先说你的理解，为什么你觉得不起作用

user: user-0
content: p=s+a表示指向c[9]的位置，s=s+b表示指向c[6]的位置，c[6]&gt;c[9],while条件为假，所以没运行

user: user-0
content: c[6]大于c[9]

user: user-1
content: 但是你while条件里面的指针没有解引用，比较的其实是地址值呀
user-0 提问: typedef的作用。。 

回复:
user: user-1
content: typedef typedef type-declaration synonym;  The typedef keyword defines a synonym for the specified type-declaration. The identifier in the type-declaration becomes another name for the type, instead of naming an instance of the type. You cannot use the typedef specifier inside a function definition.  A typedef declaration introduces a name that, within its scope, becomes a synonym for the type given by the decl-specifiers portion of the declaration. In contrast to the class, struct, union, and enum declarations, typedef declarations do not introduce new types — they introduce new names for existing types.  Example  // Example of the typedef keyword typedef unsigned long ulong;  ulong ul;     // Equivalent to "unsigned long ul;"  typedef struct mystructtag {    int   i;    float f;    char  c; } mystruct;  mystruct ms;   // Equivalent to "struct mystructtag ms;"  typedef int (*funcptr)();  // funcptr is synonym for "pointer                            //    to function returning int"  funcptr table[10];   // Equivalent to "int (*table[10])();"   typedef 要定义的类型 类型的别名; typedef int *T;//定义T为int *  T a[20];//声明一个数组a，包含20个元素，元素的类型是T，也就是int *
user-0 提问: 关于calloc的问题

回复:
user: user-1
content: 1、如果你在函数内要为传进来的指针重新分配空间，要传它的一级地址，也就是指向指针的指针。2、在fun(int *p1,int *p2,int *s)你分配了空间，又将它释放了，这个操作很让人费解！3、直接将fun(int *p1,int *p2,int *s)改为这样就行了：void fun(int *p1,int *p2,int *s) {  *s=*p1+*p2;}

user: user-2
content: 说实话，这个不是calloc什么的问题。而是楼主您对参数传递的理解有问题；也许对变量生存周期的理解也有一定问题？

user: user-3
content: 程序结束前，你已经释放了，就算不释放，你也得不到
user-0 提问: 为啥编译后运行不了啊

回复:
user: user-1
content: 1、不要直接编译单一的CPP文件，要先创建一个项目，然后，根据你的代码是C还是C++选择对应的项目类型，再创建源代码文件。2、关键词：cuot也打错了，应该是cout3、根据编译器返回的信息，你的Dev-C++没有正确安装好。安装Dev-C++之前一定要将旧版本的完全卸载掉才可以。4、关于如何安装Dev-C++可以参考我在B站的视频：      https://www.bilibili.com/video/BV1eq4y1M7XY?

user: user-2
content: cuot和cout不是一回事！关于自己是否适合编程的很简单的测试：在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案： A里面有10处以上文字或标点错误B里面没有文字或标点错误并敢为此跟人打赌C里面没有文字或标点错误并且字体和排版完全与原稿一致D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感 A不适合编程（理由：打字准确度偏低、粗心大意）B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念）C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证）D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！） 如果想从A变成B的话，到我的资源 ▼     http://download.csdn.net/detail/zhao4zhong1/4084259  里面下载“适合程序员的键盘练习”

user: user-3
content: "<<"不是左移符号吗，只能用于二进制中

user: user-4
content: 他写的应该是c++ ，然后输出语句要用&lt;&lt;

user: user-5
content: 疑似安装过程有问题，所以没有编译，而不是编译后如何。

user: user-0
content: 安装过程？

user: user-0
content: 我重新安装了还是这
user-0 提问: 有关i++的问题，求请教 

回复:
user: user-1
content: C语言中序号是从0开始的。

user: user-2
content: 你的问题跟昨天这位同学一样，可以参考我的回答：      https://bbs.csdn.net/topics/600693833

user: user-3
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-4
content: 如果没有猜错你的问题的话，应该可以这么回答。先使用再++是对于它所在的那个唯一语句来说的，i++在while语句中，而不在下面的循环体中，所以是对于i++来说，先使用是拿去判断真假，之后，判断完了即使用完了，进行++。i++跟你while下面的不管啥玩意都没关系，它只负责while这一个语句。

user: user-5
content: i%2 == 0 假  跳转
user-0 提问:  在C语言中，SUM / M 与 1 / M * SUM 表示的含义不一样吗

回复:
user: user-1
content: 注意：◆常量也有类型。1是整型，1.0f是float型，1.0是double型◆按照（）、*/、+-的运算符优先级计算，◆整型除整型只能得到整型而不会自动转为浮点型，比如1/2得到0而不会得到0.5f或0.5

user: user-2
content: 抛开电脑编程中的精度，数据类型，就这个式子，最明显的区别下面这个t = 1 / M * SUM - (sumx / M) * (sumx / M)中M * SUM有可能为0，除数为0是没有意义的！如果你能保证不为0，那就是数据类型的精度差别了。

user: user-3
content: 理由大约是M是某种整数类型而sum不是。
user-0 提问: 这个为啥错了，大佬教教我~~

回复:
user: user-1
content: sanf输入的时候不存在顶格（如：5.2f）只有输出的时候才有这种说法。int main() {    int a, b;    float c;    double d;    printf_s("please input int nums:\n");    scanf_s("%d,%d", &a, &b); printf_s("please input float nums:\n"); scanf_s("%f", &c);  printf_s("please input double nums:\n"); scanf_s("%lf", &d);  printf_s("%d,%d,%f,%lf", a, b, c, d); return 0;      }

user: user-2
content: 重新看一下scanf和printf的差别，就明白了。

user: user-3
content: %5.2f改为%f%1f改为%lf
user-0 提问: 怎么提取" "中的字符串？

回复:
user: user-1
content: BTW:楼主您的sscanf操作从buf到buf这个挺不好的，严重建议像四老师举例那样写入另一个数组。

user: user-0
content: 我只是举个例子，代表俩缓存区

user: user-2
content: char buf[] = "\"192.168.3.201\""; char ip[16]; if (1==sscanf(buf,"\"%15[0-9.]")) printf("ip:[%s]\n",ip);

user: user-2
content: char buf[] = "\"192.168.3.201\""; char ip[16]; if (1==sscanf(buf,"\"%15[0-9.]",ip)) printf("ip:[%s]\n",ip);

user: user-0
content: 谢谢您的回复 感谢
user-0 提问: 为什么我的codeblocks不能反编译？

回复:
user: user-1
content: 请问解决了吗 我也遇到了这个问题

user: user-2
content: 需要配置gdb，我猜。

user: user-3
content: 不用试探了，我们没有站在你身后偷看。 所以没有看到你的现场，所以无法回答这个问题。

user: user-0
content: emmm
user-0 提问: （数据结构）不知道哪里出错了，程序无法执行

回复:
user: user-1
content: 参考我现在学习的游戏编程：     https://space.bilibili.com/1901488254  里面有个独立的MyLinkedList（单链表），已实现了增、删、改、查功能，其中还有一个函数是关于冒泡使用链表排序的。我老师写的代码，每一行都有注解，请参考。

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

回复:
user: user-1
content: C不支持到处定义变量。

user: user-2
content: C99+就可以了

user: user-0
content: 您好 那么P0 在while里开始处初始化为什么也会报错呀

user: user-1
content: keil u4 可能不支持C99+

user: user-0
content: n定义在外面，keil u4 确实会报错不知道咋回事

user: user-3
content: 你的P0 在哪儿定义了？ 是没有定义报警吧? 我试了一下，放哪儿都不会报警。。。

user: user-0
content: P0 应该是reg52.h里定义的吧  然后我太粗心了 下面应该用LED 但写的P0 可能是因此产生的错误。

user: user-3
content: 就报错而言：放在while 外定义不会有问题。
user-0 提问: 求教哇，C语言编程习题

回复:
user: user-1
content: 如果用指针的话，比较好理解：int main() {    int a, b, c,num,twosum; char q[40]; char* p; p = q;  printf_s("please,input str num:\n"); gets(p);  printf_s("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n"); printf_s("输入的三位数是:"); puts(p); printf_s("\n"); a = *(p + 2); b = *(p + 1); c = *p; printf_s("%c,%c,%c", a, b, c); printf_s("\n");  num = a * 100 + b * 10 + c; printf_s("逆数为：%d",num);  printf_s("逆数两倍为：%d", num * 2);   return 0;      }

user: user-2
content: 差个&      scanf("%d", &sum);

user: user-0
content: 看到了，谢谢大佬，已经好了

user: user-2
content: 不用客气
user-0 提问: 字符变量与字符常量的比较问题

回复:
user: user-0
content: @AQ_No_Happy 明白了，谢谢。题目(6.14)： test.c #include <stdio.h> #include <Windows.h>   int main(void) {     char ch1, ch2;     int i=0;       while (ch1 = (ch2=getchar()) == 'A')     {         printf("ch1 = %d\n", ch1);         printf("ch2 = %d\n", ch2);         i++;     }       printf("=============================\n");     printf("ch1 = %d\n", ch1);     printf("ch2 = %d\n", ch2);     printf("\'\\n\'=%d\n", '\n');     printf("i = %d\n", i);      system("pause");     return 0; }  结果：

user: user-1
content: \n 的 ASCII码对应 10

user: user-1
content: 没有搞错，当开始打A的时候，A在缓冲区，当按下回车的时候，第一个getchar()才获取到A这个值 顺利存到ch里 但回车既是确定又是字符，回车'\n'它也跟着进了缓冲区，并且和A一起被释放，A到了程序里 回车（'\n'）也到了程序里，并且被第2个循环的 getchar（）获取，获取后与常量字符A进行比较，结果是0，循环终止，输出0。

user: user-2
content: 其次，从语义上看，似乎不该用while，这里应该是个if吧？

user: user-2
content: 首先，去掉while行末的分号。

user: user-0
content: 这是一道填空题。  **6.14** 若变量已正确定义，在执行以下 `while` 语句时，输入字符 `A` 后，`ch` 的值是______。 ```c     while (ch = getchar() == 'A'); ```
user-0 提问: 通过指针函数找出二维数组中不符合要求的元素所在的行，并打印出来。

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  #define printf_s printf  int main() {     float score[][4] = { {60,70,80,90},{56,89,67,88},{34,78,90,66} };     float* search(float(*pointer)[4]);     float* p;     int i;     int j;     for (i = 0; i < 3; i++)     {         p = search(score + i);         if (!p)             continue;         //if (p == *(score + i))         //{             printf_s("第%d个学生成绩有不及格\n", i);             for (j = 0; j < 4; j++)             {                 printf_s("%2.1f ", *(p + j));             }             printf_s("\n");         //}     }        return 0;  }  float* search(float(*pointer)[4]) {     int i;     float * pt;     pt = NULL;     for (i = 0; i < 4; i++)     {         if (*(*pointer + i) < 60) pt = *pointer;     }       return (pt); }   供参考～
user-0 提问: 【求解答】switch 的用法

回复:
user: user-0
content: 刚才我试着将代码敲到电脑里运行看看时，发现D选项中 case10 : 空格的位置不对，应该是 case 和 常量表达式(10) 之间有一个空格，而 常量表达式(10) 和冒号 : 之间不能加空格，正确的写法应该是 case 10:。看这几个选项太考验眼力👀和细心😯了
user-0 提问: c语言难题，好难呀，，，， 

回复:
user: user-1
content: 我是按循环队列算的。如果不是循环队列，就是count=rear-front;到题中front>rear,怪了。

user: user-0
content: 你好，请问一下 void fun() { char a; a=getchar(); if(a!='c')  fun(); putchar(a); } int main() { fun(); }  当输入‘abc'时，为什么输出的结果不是c呢？？？？？？？

user: user-1
content: 单步调试一下就知道了。

user: user-1
content: if (rear>=front) count=rear-front; else count=rear+a-front;

user: user-0
content: 怎么别人说是加初始状态的值呀
user-0 提问: 关于C语言基本数据类型float的困惑

回复:
user: user-1
content: 改成 double

user: user-2
content: 精度有限，也就是有效数字位数有限，它只能记住7位呀。当你有100亿入账的时候，你忘记了自己原本还有的两元三角四分，不是很正常么？
user-0 提问: 巨难的问题，通俗易懂的讲解一下static 定义的变量是什么意思 

回复:
user: user-1
content: 就是你在哪个文件里面定义了一个函数为static 那么就只能在这个文件里面引用这个函数。其他的文件想调用这个static函数会编译报错。就这个意思。 对于变量一样的。

user: user-1
content: 就是你在哪个文件里面定义了一个函数为static 那么就只能在这个文件里面引用这个函数。其他的文件想调用这个static函数会编译报错。就这个意思。

user: user-2
content: static主要就是限定作用域： #include <stdio.h> #include <unistd.h>  static float p = 3.1415;  static int test(void);  int main(int argc, char **argv) { while(1) { test(); sleep(1); } }  static int test(void) { static int time = 0; time ++; printf("test times: %d\n", time); }  1.`p`本身是个全局变量，然后添加`static`，意思就是将这个全局变量只在这个文件中使用，如果其他文件中有相同名字的全局变量，在这个文件也就只用这个变量的值。 2. `test`是个函数，但是添加了`static`表示为只在文件中调用，在生成库文件的时候不会生成这个函数的符号，就是外部不可见。 3. `time`是个局部变量，添加`static`修饰后，那么你就可以将他看作一个全局变量，但是作用域只在这个函数里面，`static int time = 0;`这个语句呢在调用函数的时候也不会运行，所以每次调用test函数，这个变量的值都会继续加一。

user: user-3
content: 局部变量：我们知道，不写static的局部变量默认是auto的（这里是ANSIＣ的auto语义），定义它的块或函数结束的时候，这样的变量会失去定义从而“消失”，如果有机会再来，那会重新产生一个新的变量。——它“转世”了自然没有“前世”的记忆。所以有static的局部变量从现象上看是全局的生命周期，不会随着某块代码或函数的结束而消失，会一直存在直到程序结束。当然其可见性仍然是局部的。 全局变量：前面加static的唯一作用是把这个变量的可见性局限在当前源文件，不准在其他源文件通过extern引用这个变量。

user: user-0
content: 这个讲解真牛呀，瞬间就懂了
user-0 提问: tcp服务器怎么判断客户端是否断开连接？或者异常中断？释放线程？

回复:
user: user-1
content: 如果TCP链接被对方断开,协议栈会发送挥手包。这时候,你去读取TCP包的时候就会报错。这种情况下,你就可以认为断开,还有一种情况就是中间的路由或者网络出问题了。那么这种情况下你就需要心跳包来检测。

user: user-2
content: 超时，再超时，又超时，失去耐心。不管是显式表达，还是底层释放，统统是这个原理。

user: user-3
content: 心跳包了解一下

user: user-0
content: 谢谢您的回复 已经解决，使用getsockopt检测连接状态即可

user: user-3
content: 比不上用心跳包可靠且自主可控
user-0 提问: 在计算机编程中，网络可谓是主心骨之一，扛起了网络互通，连接万物的重任！其互通的关键 “ HTTP 连接 ” 是重中之重！那么征服 “ 三次握手、四次挥手 " ，是踏入计算机编程行业的敲门砖！

回复:
user: user-0
content: 1
user-0 提问: 求助求助，求两个数组之间的交集并集和差集

回复:
user: user-1
content: 仅供参考： #include <algorithm> #include <iostream> #include <functional> #include <cstring> using namespace std; int main() {     char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;     char *Vowels   = "aeiou" ;     char *AlphaNum = "0123456789abcdef" ;     char result[45] ;     char *last ;      int lenA  = strlen(Alphabet) ;     int lenV  = strlen(Vowels  ) ;     int lenAN = strlen(AlphaNum) ;      cout << "Alphabet = " << Alphabet << endl ;     cout << "Vowels   = " << Vowels   << endl ;     cout << "AlphaNum = " << AlphaNum << endl ;      cout << "\nusing non-predicate versions" << endl ;      //non-predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //non-predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      cout << "\nusing predicate versions" << endl ;      //predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result  , less<char>()) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result  , less<char>()) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result  , less<char>()) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result  , less<char>()) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      return 0 ; }

user: user-1
content: 建议直接调用std::set的相应方法
user-0 提问: 问题求教，谢谢，感激不尽

回复:
user: user-1
content: 楼主的代码修改如下，问题见注释处： #include <stdio.h>     #include <stdlib.h>     #include <math.h>   int main() {     int x, y, t;     double z;     scanf("%d %d", &x, &y);     t = x;     x = x % 12;   //这里少了24小时制的转换            y = y % 60;     z = 5.5 * y - 30 * x;     if (z < -180)// ; 这里多了 ’; '号         z = 360 + z;     else if (z >= -180 && z <= 0)//这里少了 else ，>=  <=         z = -z;     else if (z > 180)      //这里少了 else         z = 360 - z;     else         z = z;     printf("At %d:%02d the angle is %0.1lf degrees.\n", t, y, z);     return 0; }

user: user-2
content: 感谢分享
user-0 提问: TCP协议socket在子线程向缓冲区写数据出现 段错误 (核心已转储) 问题

回复:
user: user-1
content: 需要加mutex锁

user: user-2
content: AnswerThread::AnswerThread(ros::NodeHandle& _nh,TCPClient _client)这里_client只是一个临时对象，    client2 = &_client; 指向它，出了构造函数就无效了
user-0 提问: 请问学生用什么软件写C语言比较好，谢谢谢谢谢谢

回复:
user: user-1
content: windows 用visual studio 比较方便,如果在Linux上的话用vs code +  GCC

user: user-2
content: 用Visual stdio 2019版本，这个挺好用的！链接： https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&rel=16这个是社区版，免费的，完全够用！！！     https://visualstudio.microsoft.com/zh-hans/thank-you-downloading-visual-studio/?sku=Community&rel=16%E8%BF%99%E4%B8%AA%E6%98%AF%E7%A4%BE%E5%8C%BA%E7%89%88%EF%BC%8C%E5%85%8D%E8%B4%B9%E7%9A%84%EF%BC%8C%E5%AE%8C%E5%85%A8%E5%A4%9F%E7%94%A8%EF%BC%81%EF%BC%81%EF%BC%81

user: user-0
content: 谢谢

user: user-3
content: 业界写C都用sourceinsight, 然后工具链编译运行

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

user: user-0
content: 谢谢

user: user-5
content: 免费的就用dev-c++:      https://github.com/Embarcadero/Dev-Cpp/

user: user-0
content: 谢谢

user: user-6
content: vs 2013

user: user-0
content: 谢谢

user: user-7
content: codeblocks比较好一些 而且工具自带有gcc  不需要额外的下载，链接如下：     https://blog.csdn.net/baolibin528/article/details/53709602/

user: user-0
content: 谢谢
user-0 提问: 用指针把a字符串数组复制到b字符串数组。

回复:
user: user-1
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价
user-0 提问: MSVC如何用命令行编译出64位程序

回复:
user: user-1
content: 私信只能发三句，我在这里回你。setvbuf的第二个参数，是给流（stdin/stdout/文件等）的缓冲区（我们叫它buffer）。因为是测试stdin，所以用scanf函数，它的第二个参数是被读入变量的地址（字符数组，因为是数组，直接，写字符数组名，我们叫他string）。这两个量，是两个独立的内存，不应该，把string传入到setvbuf做它的第二个参数。如果，把string作为参数传入到setvbuf中，那么就会出现，你当时提出的问题。你要是还感兴趣，可以看一下，我这个回答。关于setvbuf(stdin，......)的问题？ - 觉渺的回答 - 知乎https://www.zhihu.com/question/54681443/answer/2378633586

user: user-2
content: 仅供参考：C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64\cl.exeC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64_arm\cl.exeC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\amd64_x86\cl.exeC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\cl.exeC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_amd64\cl.exeC:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin\x86_arm\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x64\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2017\BuildTools\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x86\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x64\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\VC\Tools\MSVC\14.16.27023\bin\Hostx86\x86\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30037\bin\Hostx64\x64\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30037\bin\Hostx64\x86\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30037\bin\Hostx86\x64\cl.exeC:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\VC\Tools\MSVC\14.29.30037\bin\Hostx86\x86\cl.exe

user: user-3
content: VC++2005就支持64位了，否则xp和vista的64位版本是怎么编译出来的呢VC++的设计是不同版本（x86、x64、ARM、ARM64等等）的编译器独立存在，不是gcc那种一个编译器生成不同平台可执行文件的设计，安装好之后，只需要在命令行运行vcvars32.bat、vcvars64.bat... 就可以使用对应的命令行工具

user: user-0
content: 我用的VC2010学习版，只有vcvars32.bat，没有vcvars64.bat，是安装错了还是？vcvars32.bat运行出来是什么样子，我运行了好像没啥结果

user: user-2
content: VC2010是不是不支持编译生成64位程序？ 如果是VS2015，参考下面：生成Release|x64"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" d:\test\test.sln /rebuild "Release|x64" /out d:\test\c.log或生成Debug|x64"C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe" d:\test\test.sln /rebuild "Debug|x64" /out d:\test\c.log

user: user-0
content: CL不可以吗？VC2010好像没devenv.exe
user-0 提问: C语言#define预处理宏定义详细解说 

回复:
user: user-1
content: 理解和讨论之前，请先学会如何观察！

user: user-1
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E  ▼     http://bbs.csdn.net/topics/391003898
user-0 提问: 这是书本上的得用指针输出多维数组各元素的值，简单，但感觉不好理解。逻辑性不强。

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> int main() {     int a[3][4] = {         {1, 2, 3, 4},         {5, 6, 7, 8},         {9,10,11,12}};     int* p;     int y,x;     for (y=0;y<3;y++) {         for (x=0;x<4;x++) {             printf("%p ",&a[y][x]);         }         printf("\n");     }     for (p = a[0];p < a[0] + 12; p++) {         printf("%8d ", *p);         if ((p-a[0])%4==3) {             printf("\n");         }     }     system("pause");     return 0;  } //00EFFC48 00EFFC4C 00EFFC50 00EFFC54 //00EFFC58 00EFFC5C 00EFFC60 00EFFC64 //00EFFC68 00EFFC6C 00EFFC70 00EFFC74 //       1        2        3        4 //       5        6        7        8 //       9       10       11       12 //请按任意键继续. . . //   这是zhao4zhong1改写的输出多维数组各元素的地址和用指针输出多维数组各元素的值，简单，且感觉好理解。逻辑性强。
user-0 提问: 求一个简单计算的方式。一列数值，想统计各列的总数，最大值，最小值

回复:
user: user-1
content: 可以使用SSE/AVX指令maxps、minps、addps，#include <intrin.h>

user: user-0
content: 能不能详细点，我这个是在开发板上的Linux 的 要通用点的
user-0 提问: 求助：C语言Windows程序设计-编译工具和使用函数

回复:
user: user-1
content: 学习一下里面的例子代码：MSDN98_1.ISO  ▼     http://pan.baidu.com/s/1dDF41ix  ,MSDN98_2.ISO  ▼     http://pan.baidu.com/s/1bnGo0Vl

user: user-0
content: 好的，谢谢老师，我会努力学习的~希望下次再上来我就是不一样的我了~ 我昨天发的代码本身就有问题后来问题找出来了。然后我昨天也算是把功能简单弄出来了。 感谢~
user-0 提问: 又来求大佬们解题了~~

回复:
user: user-1
content: 重启系统，重启大法好

user: user-2
content: 楼主的代码修改，供参考： #include<stdio.h> #include<math.h> //int flag; int present(int x) {      int i,k,flag=0;      k = (int)sqrt((double)x);       if(x <= 1)   return flag;      for (i = 2; i <= k; i++)           if (x % i == 0)           {                 flag = 0;                 break;           }      if (i > k) flag = 1;      return flag; } int main() {      int n, a, b;      int t = 0;      for (n = 10; n < 100; n++)      {          if (present(n) != 0)                              //if (flag == 0)                              //    continue;                              //else          {              t = 0;              a = n;              while(a)              {                  t = t*10 + a%10;                  a /= 10;              }                            //b = n - a * 10;                            //t = b * 10 - a;              if(present(t))                            //if (flag == 1)                  printf("%d是绝对素数\n", n);          }      }      return 0; }

user: user-0
content: 感谢大佬

user: user-0
content: /tmp/ccGpTL9R.o：在函数‘present’中： 1.c:(.text+0x1c)：对‘sqrt’未定义的引用 collect2: error: ld returned 1 exit status 大佬，为啥会出现这个报错呢

user: user-2
content: math.h   这个头文件有没有加

user: user-3
content: /找出无暇素数.所谓无暇素数是指本身为素数,且其逆序数也是素数的数,这例计算全逆序,如107=>701/     https://blog.csdn.net/xianfajushi/article/details/25125133?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522162988560716780265447767%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=162988560716780265447767&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-1-25125133.pc_v2_rank_blog_default&utm_term=%E8%B4%A8%E6%95%B0&spm=1018.2226.3001.4450
user-0 提问: 求问大佬代码，到底哪里有问题？

回复:
user: user-1
content: 不能用库函数？请考虑使用scanf从控制台输入整数字符串并得到整数变量，或是使用sscanf从字符串指针进行格式行输入。

user: user-2
content: 了解一下 ASCII 码简单来说，char类型 8bits，无符号数范围 0~255ASCII 码把常用的字符转成数值，因此你需要转换才能得到或者你可以简单的写代码看看 char s[11] = "0123456789"; for(int i = 0; i < 5; ++i) {     if (s[i] != '\0') {         printf("%d ", s[i]);     } }

user: user-2
content: 以及 ```c for(int i = 0; i &lt;= 0xFF; ++i) {         printf("%c ", i); ```

user: user-0
content: 懂了，感谢

user: user-3
content: 供参考: #include<stdio.h> int main() {     long int i, num;     char s[10];     gets_s(s,10);     num = 0;     i = 0;     while (s[i] != '\0'){                 num = num * 10 + s[i]-'0';         i++;     }     printf("%d", num);     return 0; }
user-0 提问: 这种警告如何处理！！！！！大佬帮帮忙

回复:
user: user-1
content: 销毁动态顺序表 的逻辑有问题，在检查一下

user: user-2
content: 用一个临时指针变量接收realloc返回值，判断非空后，再赋值给 sq->data#define INIT_SIZE 10L #define EXPAND_SIZE 5L

user: user-2
content: 这是什么IDE...warning提示都这么智能，解决方法都写出来的吗？

user: user-3
content: VS
user-0 提问: 关于选择排序的问题，不知道错在哪里

回复:
user: user-0
content: 找到原因了，少了一段判断语句：if (array[j] < array[k]) 完整个代码如下：#include<stdio.h>int main(){    void sort(int array[], int n);    int i;    int a[10] = { 6,7,4,3,8,9,44,1,2,3 }; /* printf("请输入需要排序的整数：\n"); for (i = 0; i < 10; i++) {     scanf_s("%d", &a[i]);  } */      sort(a, 10); printf("\n"); for (i = 0; i < 10; i++) {     printf_s("%d,", a[i]); }  return 0;  }void sort(int array[], int n){    int i, j, k, t;    for (i = 0; i < n - 1; i++)    {        k = i;        for (j = i + 1; j < n; j++)         {         if(array[j]<array[k])               k = j;         }           t = array[k]; array[k] = array[i]; array[i] = t;      }  }

user: user-0
content: 把段落注释的符号去掉
user-0 提问: 一维数组作为函数参数

回复:
user: user-1
content: #include<stdio.h> #pragma warning(disable : 4996) int main() {     float arry(float num[]);     float a[3];     int i;     float aver;     for (i = 0; i < 3; i++)     {         printf("请输入第%d个学生的成绩:",i+1);         scanf("%f", &a[i]);     }     aver = arry(a);     printf("平均成绩是：%5.2f", aver);          return 0; }  float arry(float num[]) {     float sum = 0;     float aver = 0;     int i;     for (i = 1; i < 3; i++)     {         sum = sum + num[i];     }     aver = sum / 3;     return aver; }
user-0 提问: 关于 lame pcm转化MP3 音频 发现声音和原始的pcm比较变小了，请高手指点下

回复:
user: user-1
content: lame_set_brate(lame, 32);这个函数不是设置位深度的, 而是设置比特率的, 取值128~320(kbps)

user: user-2
content: 哦，原来是这样啊，我没用过，看着注释里面说得有鼻子有眼的我就信了。

user: user-1
content: 我也不太清楚哦, 百度好像是这样的

user: user-2
content: 降低一下比特率试试？16位就够了。
user-0 提问: C语言逻辑运算符(&&和||)的短路求值知识

回复:
user: user-1
content: 第一个逻辑与判断第一个表达式为假了，后面的就不会执行

user: user-2
content: 不错，长知识了。

user: user-3
content: 了解短路机制就好了...短路求值这种，debug都不好找问题的写法，最好不要出现在代码里

user: user-4
content: 我就想问(a=0)&&(b=4);写的意义何在？

user: user-0
content: 短路求值是个知识点
user-0 提问: 来个大佬指点下，卡了个下午，还是没搞懂

回复:
user: user-1
content: i是你得到的字符串长度啊，返回它用来下面进行比较，不是很舒适么？你得区分表达式和声明，这个printf后面的括号里的是表达式，如果带着方括号，就是在表示单个字符了。

user: user-0
content: 多谢指教，不过还是有点没搞懂，字符串长度不是保存在s[i]里面吗，他返回 i 的话不是只返回了第几行吗？

user: user-0
content: 仔细看了下，是我理解错了，懂了，谢谢大佬

user: user-2
content: 还有printf为啥不加【】啊?这是C语言 字符串基础，longest在这里代表字符串首地址，%s打印算从首地址到结束符的内容。另外longest使用前最好memset,置空。

user: user-0
content: 我现在还写不出这么简洁的程序，这是C程序语言设计里面的一道例题所以说为啥返回 i 啊，还有printf为啥不加【】啊

user: user-3
content: MAXLINE应设为32767比较保险，因为超过1000太容易了

user: user-2
content: Hi，这不是你自己写的吗？  循环扫描文件时max在记录最长那行的字符数，longest记录最长的行内容。
user-0 提问: 碰到一个指针方面的问题，求解答。

回复:
user: user-1
content: printf("*b = %d\n", *b);   //9975 printf("*b++ = %d\n", *b++);    //== *(b++) 中++优先级高于* 但是b++是后计算 所以是 9975 然后指针+1指向未知空间 printf("(*b)++ = %d\n", (*b)++);  //上一步 *(b++) 已经计算 指向未知空间 乱码 printf("*(b++) = %d\n", *(b++));   //同上乱码  // printf("*b = %d\n", *b);   //9975     // printf("*b++ = %d\n", *b++);    //== *(b++) ++优先级高于* 但是b++是后计算 所以是 9975     printf("(*b)++ = %d\n", (*b)++);  //9975 *b先输出9975 然后 *b = 9976     printf("*(b++) = %d\n", *(b++));   //9976  *b指向值为9976

user: user-0
content: 感谢解答

user: user-2
content: printf("*b = %d\n", *b);// *b = 取值 9975     printf("*b++ = %d\n",*b++);//先取值：*b = 9975 ,再b地址加1, b++,这条执行完 b就不指向a了      printf("(*b)++ = %d\n", (*b)++);//取值*b , 然后值加 1 ，b 已经不指向a 了，所以就是一个乱值     printf("*(b++) = %d\n", *(b++));//这里和上一条相同，看不懂的一个值

user: user-0
content: 感谢解答。
user-0 提问: Creating new notebook in Bad file descriptor (bundled\zeromq\src\epoll.cpp:100)创建文件错误问题

回复:
user: user-1
content: 请问你现在输入jupyter notebook能直接跳转到网页吗

user: user-2
content: 请问你现在解决了吗？我也遇到了这个问题

user: user-0
content: 解决了，原来是我的C盘用户名设置成中文导致的，改成英文就好了

user: user-3
content: 请问如何更改？急
user-0 提问: 求助 为什么突然出现断点了

回复:
user: user-1
content: realloc后还应assert(p1);

user: user-2
content: The  realloc()  function changes the size of the memory block pointed to by ptr to size bytes.  The contents will be unchanged in the range from the start of the region up to the minimum of the old and new sizes.  If the new size is larger than the old size, the added memory will not be  initialized.   If ptr is NULL, then the call is equivalent to malloc(size), for all values of size; if size is equal to zero, and ptr is not NULL, then the call is equivalent to free(ptr).  Unless ptr is NULL, it must have been returned by an earlier call to malloc(), calloc(),  or  realloc().   If  the area pointed to was moved, a free(ptr) is done.The  realloc()  function  returns a pointer to the newly allocated memory, which is suitably aligned for any built-in type and may be different from ptr, or NULL if the request fails.  If size was equal to 0, either NULL or a pointer suitable to be passed to  free()  is  returned.   If  realloc()  fails, the original block is left untouched; it is not freed or moved. realloc 之后，你应该free的是 p1，而不是 p 了

user: user-0
content: 太感谢了
user-0 提问: 求助，找子序列的算法

回复:
user: user-1
content: //用C语言实现：给定SJPDMFLJDDMFLJPDMFJNDMKL序列。查找JPDMFL（六个字符中最多只能有一个不同） #include <stdio.h> #include <string.h> int main() {     char *s="SJPDMFLJDDMFLJPDMFJNDMKL";     char *f="JPDMFL";     int L=strlen(s);     int M=strlen(f);     int i;     int j;     int c;      printf("%s\n",s);     for (i=0;i<L-M;i++) {         c=0;         for (j=0;j<M;j++) {             if (f[j]==s[i+j]) c++;         }         if (c>=M-1) {             for (j=0;j<i;j++) printf(" ");             printf("%s\n",f);         }     }     return 0; } //SJPDMFLJDDMFLJPDMFJNDMKL // JPDMFL //       JPDMFL //             JPDMFL //

user: user-0
content: 感谢大佬，一下就懂了
user-0 提问: 小白求解.

回复:
user: user-1
content: 因为编译器不知道你前面有strstr(buf, flag) != NULL的判断，怕运行出错，所以给出了警告，既然你前面已经有了判断，就可以忽略这个警告了如果有强迫症，可以按楼上的改一下

user: user-2
content: 改成这样试试：     char* s;     if ((s=strstr(buf, flag)) != NULL) {          fputs(s, out);      }
user-0 提问: 自定义函数指针传参，数值传参

回复:
user: user-0
content: 看了半天终于发现错误，定义时 /** 将串str中的oldStr替换成newStr */ Status Replace_HeapString(Hstring * str, Hstring oldStr, Hstring newStr);  而调用时 Replace_HeapString(str1, &str5, &str4);  调用错误，改成Replace_HeapString(str1, str5,str4)即可，原定义的参数2和参数3要求的是传入Hstring类型的值，而我错误的传入了它们的地址，该死

user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！ #include <stdio.h> #include <malloc.h> #include <string.h> enum Status {OK,ERROR}; /** 串的堆式顺序存储结构（heap）*/ typedef struct hstring {     char * ch;     int length; }Hstring; int Index_HeapString(Hstring *str,Hstring *findstr,int start) {     int i;     for (i=start-1;i<str->length - findstr->length;i++) {         if (0==strncmp(str->ch+i,findstr->ch,findstr->length)) return i+1;     }     return 0; } /** 将串str中的oldStr替换成newStr */ Status Replace_HeapString(Hstring * str, Hstring oldStr, Hstring newStr) {     int i,index;     if(!str || oldStr.length!=newStr.length)         return ERROR;     index = Index_HeapString(str, &oldStr, 1);     if(index && index <= str->length)     {         for(i = 0; i < newStr.length; i++)         {             str->ch[index - 1 + i] = newStr.ch[i];         }         return OK;     }     return ERROR; } void StrAssign(Hstring *str,const char *val) {     str->ch=(char *)val;     str->length=strlen(val); } void PrintString(Hstring *str) {     printf("%.*s\n",str->length,str->ch); } int main() {     Hstring * str1 = NULL;     Hstring str4;     Hstring str5;     str1 = (Hstring*)malloc(sizeof(Hstring));     //为str1赋值     StrAssign(str1, "helloword");     //为str4赋值     StrAssign(&str4, "eee");     //为str5赋值     StrAssign(&str5, "llo");     //将串str1中的"llo"替换成"eee"     Replace_HeapString(str1, str5, str4);     PrintString(str1); //heeeeword     free(str1);     return 0; }
user-0 提问: 求大神帮我看下printf函数有什么问题？

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖；要迷信CPU、编译器、调试器、运行结果。并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-2
content: 供参考：C语言中，char 和 int 的区别？

user: user-3
content: char型取值范围-128~127
user-0 提问: 一个严肃的问题

回复:
user: user-1
content: 不要老是加夜班，长发短发都无所谓

user: user-2
content: 脱发不都是肾的错,脾胃不好也会脱发,用白纸贴头上看看是否有很多油可判断.

user: user-3
content: 我自觉出去

user: user-4
content: 短发，天天洗头，保证有效果

user: user-5
content: 多吃枸杞少熬夜

user: user-2
content: 南辕北辙？舍本逐末？舍弃自家宝贝不用，怨天尤人何益！发为血之余。

user: user-0
content: 何为自家宝贝

user: user-2
content: 自家宝贝分2说，1为中华瑰宝中医中药2为自身五脏六腑健康，可笑的是有些论调程序员要打字飞快才算是程序员？未知打字打得飞快能产生几何效益？以至于挖空心思加班加点损伤血气，不知劳逸结合及顾护身心健康，受尽苦难皆属咎由自取。

user: user-2
content: 说实在的，不喜欢严肃，更喜欢严谨，因为中医就是以配伍严谨为特色从慈悲情怀，所谓医者父母心。

user: user-6
content: 半秃的长发，参考banana大师～～～

user: user-7
content: 作为程序猿，想必数学都不错，那么就好说了，每个抽样行为都是独立的，整体的概率对于个体的预测其实并没有什么用。脱了就是脱了，不脱就是不脱。就像彩票一样。
user-0 提问: 蓝桥杯汉诺塔问题 求大佬帮忙看看

回复:
user: user-1
content: 汉诺塔问题为什么不用递归程序做呢。 #include <stdio.h>  void move(int n, char src, char tmp, char dst){     if(n == 1){         printf("%c -> %c\r\n", src, dst);         return;     }else{         move(n-1,src,dst,tmp);         move(1,src,tmp,dst);         move(n-1,tmp,src,dst);     } }  int main(){          int n = 6;     char src = 'a', tmp = 'b', dst = 'c';          move(n,src,tmp,dst);          return 0; }
user-0 提问: 取结构体中数组中的数值

回复:
user: user-1
content: 什么原因？

user: user-0
content: 好的，谢谢您，已经找到相关资料啦

user: user-2
content: 敢为题主解决了吗

user: user-3
content: 可以搜索一下总线错误或者对齐错误，学习一下。字数较多，就不贴了。
user-0 提问: 有人愿意做Linux嵌入式系统下C/C++的兼职开发吗？

回复:
user: user-0
content: 均已私信联系~顺便补充一下，我们研发团队坐标北京。希望开发者前期有时间到北京交流，并且有些项目需要在北京常驻1-2月~

user: user-1
content: 怎么联系？

user: user-2
content: 拿来吧你

user: user-3
content: 怎么联系？

user: user-0
content: 已私信
user-0 提问: Socket错误

回复:
user: user-1
content: 服务器端没有bind 地址信息，也listen端口，设置监听队列，客户端如何connect服务器？ Linux C for TCP服务器参考     int listenfd = socket(AF_INET, SOCK_STREAM, 0);      struct sockaddr_in sin;     bzero(&sin, sizeof(sin));     sin.sin_family = AF_INET;     sin.sin_addr.s_addr = INADDR_ANY; /* 本地所有IP地址 */     sin.sin_port = htons(port);      if (bind(listenfd, (struct sockaddr *)&sin, sizeof(sin)) < 0) {         perror("bind error");         exit(1);     }      if (listen(listenfd, 10) < 0) {         perror("listen error");         exit(1);     }  while (1) {   struct sockaddr_in cliaddr;   socklen_t clilen = sizeof(cliaddr);   int connfd = accept(listenfd, (struct sockaddr *)&cliaddr, &clilen); ... }

user: user-0
content: SOCKADDR_IN clientAddr  改为 struct sockaddr_in clientAddr;
user-0 提问: 大佬们 c语言单行文本输入咋搞啊

回复:
user: user-0
content: 链接标题谢谢啊  不过可以有可视化的文本输入框 就类似于qt那种控件吗？ 谢谢大佬们

user: user-1
content: #include <stdio.h> #include <string.h> int main() {   char ln[1024];   fgets(ln,1024,stdin);   if (ln[strlen(ln)-1]=='\n') ln[strlen(ln)-1]=0;   printf("[%s]\n",ln);   return 0; }

user: user-2
content: char a[1024];    gets_s(a,1024);    puts(a);
user-0 提问: 有没有大佬有C语言的练习题，跪求！

回复:
user: user-1
content: 有不少刷题网站什么PTA计蒜客一大堆高级一点的leetcode牛客

user: user-2
content: C语言教程（附带C语言100例）▼

user: user-3
content: 在本网站下载里搜  C语言的练习题  啊
user-0 提问: scanf混合输入问题

回复:
user: user-1
content: 原来你month输入的是三个英文字母的缩写JAN,FEB,MAR,...，我原以为是01,02,03,... 那你改成 char month[4]; ...-%3[^-]-... 另外，scanf是给char[]用的，cin是给string用的。你要想用scanf输入string,可以先输入到char[],再将char[]转换为string

user: user-0
content: 老师你太强了，等于说用scanf的话必须先规定长度，太猛了老师

user: user-0
content: 我还有个问题就是，数组长度为啥要有4位

user: user-1
content: 要留末尾0的存储空间

user: user-2
content: 供参考： #include<iostream> #include<map> #include<string> using namespace std;  int main() {     int    year=0,day=0;     string month(11,0);//string类的构造函数     scanf("%d-%[^-]-%d",&year,month,&day);     cout<<year<<endl;     cout<<month<<endl;     cout<<day<<endl;     return 0; }

user: user-0
content: 试了一下，这样布星啊哥哥

user: user-1
content: char month[3]; scanf("%d-%2[^-]-%d",...

user: user-0
content: 谢谢老师！我尝试了可以，但是想用string可以吗？

user: user-0
content: 而且%2会漏掉一个字符，如果去掉2的话会多一个框框，老师这是咋回事

user: user-3
content: scanf("%d-%[^-]-%d", &year, month, &day);   试试这样，month是string类型，本身就是地址了，因此不需要再加&了。

user: user-0
content: 我试了一下，这样布星，同学
user-0 提问: 求求大神帮我看下3个数比大小有什么问题？

回复:
user: user-1
content: 供参考： #include<stdio.h> int main() {     int a,b,c;     void sort(int *x,int *y,int *z);     printf("Please enter three numbers:\n");     scanf("%d%d%d",&a,&b,&c);     sort(&a,&b,&c);     printf("%d %d %d\n",a,b,c);     return 0; }  void sort(int *x,int *y,int *z) { int temp;     if(*x<*y)     {     temp=*x;     *x=*y;     *y=temp;     }     if(*x<*z)     {     temp=*x;     *x=*z;     *z=temp;     }     if(*y<*z)     {     temp=*y;     *y=*z;     *z=temp;     } }

user: user-0
content: 请问我的错在哪儿？

user: user-1
content: sort()函数里，交换位置，不能是对值的操作，对值的操作作用范围就在函数体内，函数运行结束返回主函数后，a b c 的值并没有被改变。必须是对地址的操作才能起作用。

user: user-0
content: 好的，谢谢大神！
user-0 提问: 今天尝鲜CLion 2021.2 ，结果。。。。

回复:
user: user-1
content: 改成c++的cout试试？

user: user-0
content: 不会C++，刚接触C，小白一枚

user: user-0
content: 原因：printf使用了缓存buffer 解决方案： fflush(stdout);：强制刷新（建议）setbuf(stdout, NULL);：禁用缓存（不建议）

user: user-2
content: 有其他解决办法吗？每次加一行代码好麻烦啊
user-0 提问: code blocks 调试器结束，其状态码是1 

回复:
user: user-1
content: 你用的codeblocks没有调用栈信息吗？我用codelite，按F5开始调试，如果报错就会有调用栈的错误信息，基本上都能定位到报错的一行，除非很诡异的https://codelite.org/,有黑色主题
user-0 提问: C语言编译生成的可执行文件自动退出，怎么排查问题呢？

回复:
user: user-1
content: 应该写个日志文件，这样才能通过日志文件查找问题。

user: user-2
content: 用codelite，按F5运行如果报错有调用栈直接定位到报错行，

user: user-3
content: StackWalker

user: user-3
content: 自己加尽量详细的日志
user-0 提问: 利用红外扫描实现循迹的小车，遇到这种情况的直角转弯，该如何编写程序

回复:
user: user-1
content: 传感器的前探测距离肯定不会刚好大于与出头的那点黑胶带的长短。增加一个保存转弯点的转向选择的变量，继续按直线前进，没路了再退回来，再根据前面转弯选项转弯，继续探路，只能这样。三岔口、五岔口、多岔口，都只能挨个探索，不行了退回来。

user: user-2
content: 为什么黑胶带要出头？改为圆角是不是好走一些

user: user-0
content: 老师设的卡

user: user-2
content: 那就问老师。解铃还须系铃人。
user-0 提问: 各位大佬大家好,入门小弟有一个不会的程序请大佬,帮忙解答

回复:
user: user-1
content: #include<stdio.h>int main(){  int sum=0;  for(i=1;i<=100;i++)  {    sum+=i;  }  return 0;}

user: user-2
content: #include<stdio.h>int main(void){    int n, sum;    sum = 0;    n = 100; while (n> 0) {     sum = sum + n;     n--; } printf("1+....+100=%d", sum);  return 0;  }

user: user-0
content: 谢谢

user: user-3
content: #include<stdio.h>  int main() {     int i,s=0;     for(i=1;i<=100;i++)s+=i;     printf("s(1+2+3+4+5+6.......+100)=%d\n",s);     return 0; }

user: user-4
content: 学习的书上没代码例子？int a=0,aa=1;while(aa<=100)a+=aa++;std::cout<<a<<std::endl;

user: user-5
content: printf(5050);
user-0 提问: C语言printf打印指针地址疑惑-运行环境win10 64位系统

回复:
user: user-1
content: 实际中一般不这么搞，你只要知道这种情况和具体的编译器有关即可。

user: user-2
content: 关于C,C++表达式求值顺序(转)关于C,C++表达式求值顺序

user: user-3
content: 不同的编译器，不同的结果。 (int *)p + 1  强制类型转换了。
user-0 提问: pta的一道题，有点不明白，最后一个测试点发生浮点错误

回复:
user: user-1
content: 这个题目是什么？

user: user-2
content: 一个可能是在特定平台上的测试用例中，累成溢出，但是每一步进行公约后可以保证中间结果没有溢出
user-0 提问: MacOS平台中，获取执行文件目录路径错误，该如何正确获取路径呢？

回复:
user: user-1
content: char path[256] = { 0 }; getcwd(path, sizeof(path)); strcat(path  , "/a.txt");

user: user-2
content: a.txt改成./a.txt 看看

user: user-0
content: 试过了，不行
user-0 提问: 相同的数据，Int 强转 Byte 竟然出现了不同的结果！这背后到底隐藏了什么秘密 —— 数据大小端存储》, 一起来围观吧 https://blog.csdn.net/qq_34417408/article/details/118877959?utm_so

回复:
user: user-1
content: 原来是付费专栏的广告。

user: user-0
content: 付费？不存在的
user-0 提问: C语言编写的程序，编译生成的可执行程序无法双击运行

回复:
user: user-0
content: 在CentOS平台中，可使用desktop文件实现双击执行

user: user-1
content: https://blog.csdn.net/weixin_34160277/article/details/94180772

user: user-2
content: 一般都是从控制台启动

user: user-3
content: 我都是点右键，选运行
user-0 提问: DEV C++下古怪的二维堆数组

回复:
user: user-0
content: 再次对这个问题进行研究,发现是我理解错误.语句:TYPE (Array)[x]=(TYPE ()[Array[x]])malloc(y*z);可以正常使用.语句中的x值是二维数组的第二个下标,而我理解成了第一个下标了.惭愧!

user: user-1
content: TYPE为unsigned char,z为1
user-0 提问: C Primer 第十章 图10.4关于指针递增的图，那地址位数是不是错了？

回复:
user: user-1
content: 图的右侧明确了指针ptr1占用0c00  0c01共2个地址，所以它是个2字节指针。鉴定完毕。 但指针本身占几个字节和指针目标占几个字节确实不相关。

user: user-0
content: 但原书上明确说了这是一个int数组

user: user-1
content: 关注一下作者写这个的年代，若是1995年以前提起int大概率都是2字节的。

user: user-2
content: ptr1虽然是个占用了4字节空间的指针，但*ptr1存储的数据不见得是4字节数据，可能只是2字节short数据，亦可能是8字节double数据。ptr1++之后的ptr1值视其所指向空间的数据类型而定。若是ptr1是short *类型，那么ptr1++之后，就会是从00dc变为00de。

user: user-0
content: 不是吧，指向空间的大小在指针定义的时候应该就是确定好的，不可能根据里面的数据类型改变，那还不乱了套了

user: user-2
content: “指向空间的大小在指针定义的时候应该就是确定好的”，这句话是没错的，所以我说“ptr1++之后的ptr1值视其所指向空间的数据类型而定”。但是这不等于说指针本身是4个字节就意味着指针指向的空间也是4字节数据类型。你的问题并没有描述ptr1是哪种类型的指针，如果是short类型，那么指针指向的数据就是只有2字节，所以ptr1++之后的结果是新的ptr1只变化了2字节。

user: user-3
content: 16进制中，两个字符是一个字节，一个字符的话，是一个字节。 例如：A是一个字节，AA是一个字节，AAA是两个字节，AAAA是两个字节  AAAA AAAA 四字节

user: user-0
content: 明白了，这是一种简化的地址表示方法，谢谢！
user-0 提问: 求帮助，习题7-2 求一批整数中出现最多的个位数字 (20 分)

回复:
user: user-1
content: 用0-9的10个数字数组统计是个好方法，统计方面可参https://ask.csdn.net/questions/912419最后遍历一下数组求最大值，再用最大值输出是那些数即可。

user: user-2
content: 换种思路，供参考： #include<stdio.h>  int main() {     int  a[10]={0},n,m,i;     scanf("%d",&n);     while(n){             scanf("%d",&m);             while(m){                     a[m%10]++;                     m /= 10;             }             n--;     }     m = a[0];     for(i=0;i<10;i++)         if(m<a[i]) m=a[i];     printf("%d:",m);     for(i=0;i<10;i++)         if(a[i] == m)            printf(" %d",i);     return 0; }

user: user-3
content: 至少你的a数组不够大。
user-0 提问: 我想问一下程序运行后只输出个0

回复:
user: user-1
content: 这个函数有问题： bool initlist(linklist l) {     l=(lnode *)malloc(sizeof(lnode));     if(l==NULL){         return false;     }     l->next=NULL;     return true; }  你的本意是初始化链表头节点，为头节点分配空间，但是C/C++语言函数是传值的，在函数内部对形参赋值并不会改变形参的值，所以l=(lnode *)malloc(sizeof(lnode));这条语句并没有真正影响l的值，而是修改了l在栈中的副本。当你调用bool res = initlist(l);试图初始化l时，l的值其实并未被改变。可以改成这样： bool initlist(linklist *l) {     *l=(lnode *)malloc(sizeof(lnode));     if((*l)==NULL){         return false;     }     (*l)->next=NULL;     return true; }  bool oinitlist(linklist *l) {     *l=NULL;     return true; }  然后：bool res = initlist(&l);

user: user-2
content: 没有问题呀。
user-0 提问: 怎么打开浏览器，访问指定网页？

回复:
user: user-1
content: firefoxsafari

user: user-2
content: system是执行命令行的工具，你在命令行怎么敲，在这儿就怎么敲。我的意思是，具体的文件名你不说别人也不知道，你得自己找。
user-0 提问: 各位大佬们，这是为啥运行不出结果呢？

回复:
user: user-1
content: 要把自己写的代码当作别人写的代码，然后开始读。这样你才能发挥好挑剔的目光这个天赋----我们都是这么干的。

user: user-0
content: 嗯嗯

user: user-2
content: 问题见注释，供参考： #include<stdio.h> int main() {     int i,j,n,sum=1,all=0;     scanf("%d",&n);     for(i=1;i<=n;i++){//for(i=1;1<n;i++){          sum=1;         for(j=1;j<=i;j++){              sum *= j;         }         all+=sum;     }     printf("%d",all);     return 0; }

user: user-0
content: 谢谢