Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 我有点懵了，这么做会被卡住吗？线程玩的熟的帮忙看看。

回复:
user: user-1
content: 在析构函数中，线程pool在等待所有子线程退出时一直持有taskQueMtx_的锁，这会导致在子线程尝试获取任务时无法获取到锁，从而导致互锁的情况。为了避免这种情况，可以使用线程安全的等待所有子线程退出的方式，例如使用std:🧵:join_all()函数等待所有子线程退出。这样可以避免在等待过程中一直持有锁的情况，从而避免互锁问题。

user: user-0
content: 谢谢回复 我理解也是会卡住 关键这段代码一直在生产环境使用 从没有卡过。。。

user: user-0
content: 谢谢回复 我理解也是会卡住 关键这段代码一直在生产环境使用 从没有卡过。。。

user: user-2
content: 常在c用多线程处理数据，没在c++用过，但原理应该差不多。看你的程序只有一个锁，在一个线程上锁后其他线程无法使用这个锁，所以应该不会有冲突。

user: user-0
content: 谢谢回答 冲突到没发生 析构的线程和任务的线程肯定不同 但是析构的阻塞掉了 我感觉任务线程有可能卡在④上啊，这块是不是应该会有风险，即使是运气最差的情况下

user: user-2
content: 4这个位置不会卡，它会等1这个位置的锁解锁后才可以对锁进行操作，即使它们属于不同线程也会等待。

user: user-0
content: 但是有可能出现互锁呢 1等4 4等1
user-0 提问: 力扣：11. 盛最多水的容器

回复:
user: user-2
content: 要让p2指向传入数组的最后一个元素，可以将p2的初始值设置为height + heightSize - 1，即&height[heightSize - 1]。这样，在循环中每次移动指针时，p2就会指向数组的最后一个元素。

user: user-3
content: 数量这玩意只能传进来，不传进来谁知道有几个

user: user-3
content: 第二参数难道不是做这个的么？

user: user-0
content: int *p2 = &height[heightSize-1];我之前这样写打错了，
user-0 提问: vsc怎样配置调用外部函数的那个参数

回复:
user: user-2
content: 在当前项目中有实现GetAngle的.c/.cpp源代码或附加连接库里有GetAngle的实现。

user: user-0
content: 我在同一目录下命名了两个文件：Test1.c和Test2.c，这是1里面的，我也在2里面定义了GetAngle函数

user: user-0
content: 还请大佬说的详细点

user: user-2
content: 同一目录下不一定有用，得在makefile（使用nmake生成）或当前项目中添加现有项选Test2.c（使用VS20xx生成）

user: user-0
content: 大佬，求解
user-0 提问: 为什么函数里第二行int nums[len];会报错

回复:
user: user-2
content: 数组的大小使用变量len来指定，而len的值是在运行时计算得到的，编译器无法确定数组大小，所以会报错。

user: user-3
content: int *nums=new int[len]; delete [] nums;//nums用完后

user: user-0
content: 感谢

user: user-4
content: len是变量

user: user-0
content: 哦哦，我知道了，不能在运行时才知道数组的大小，我以为java

user: user-5
content: 你的编译器应该已经告诉你了，它不支持动态大小的数组。

user: user-0
content: 啊？len不是定义的吗

user: user-0
content: 我在vsc调式的时候到这里要点好多次下一步，也可以正常出结果

user: user-0
content: 抱歉，我知道了，不能在运行时才知道数组的大小，我以为java
user-0 提问: 程序语言设计基础的课程设计【大哭】，C语言小白表示太难了，题目是会员卡计费系统，想问问有没有C语言大佬帮我解答一下疑问，我的消费总额和充值总额算不出来【大哭】，代码如有雷同他人的，我就是借鉴的那个。

回复:
user: user-1
content: 加油，继续努力！！

user: user-2
content: 你add（）函数里打开文件进行追加时（fp=fopen（“emploee_list”，“a”）；），文件名有拼写错误。它应该是“employee_list”，

user: user-0
content: 谢谢

user: user-3
content: 大哥教教我我新手.网课大学生现在啥也不会求带

user: user-0
content: 您可以帮我解答一下消费总额和充值总额为什么算不出来吗？【大哭】

user: user-2
content: 建议使用charGPT

user: user-0
content: 希望有大佬能为我解答，急！
user-0 提问: c语言学生成绩系统课程设计

回复:
user: user-1
content: 我也小白，首先我感觉int n 完全没必要传参，sort函数里t没有初始化

user: user-1
content: 174   应该定义一个指针，把满足条件的保存         char *p = (char*)malloc( N * sizeof(char));        好吧我也不知道这能不能行

user: user-0
content: 感谢我去试试
user-0 提问: void *形参，传参时候的用法

回复:
user: user-2
content: 实参传给形参时类型需要匹配，有几种情况是特例：1.实参类型可以自动转换为形参类型，例如char->int，float-double.2.形参的权限比实参的权限小，如char*->const char*.100字面量是int，传参时不会自动转换为指针类型，所以需要强制转换

user: user-3
content: 调用函数时使用的实参表达式的值的类型必须与形参类型一致，或者能够自动转换为形参类型，或者强制转换为形参类型。
user-0 提问: 流水灯怎么中断循环执行下个语句

回复:
user: user-2
content: 在最后main函数里的死循环里，建议改成四个判断，不要再嵌入while while(1)     {         keynum=key();         if(keynum == 1){           led1(); } else if(keynum == 2 ){    led2(); }     }   类似这样

user: user-2
content: 你点灯的函数中也嵌入了一个死循环while(1)
user-0 提问: 进程recv卡住，怎么办？

回复:
user: user-1
content: "recv卡住": 你的socket fd是设置成非阻塞了吗？如果是非阻塞的，recv的返回值有正确处理吗？（比如特殊判断EAGAIN）还有看你描述用的是UDP，UDP本身就是不可靠的，假如某个UDP包丢了，那么对方就收不到了，项目里有针对UDP做可靠性的开发吗

user: user-0
content: 我这不是“某个UDP包丢了”，"recv卡住"是recv长时间卡住

user: user-1
content: 你没把socket fd设置成非阻塞吧？

user: user-1
content: fd默认是阻塞的，如果调用recv，但此时缓冲区没有内容就会卡住

user: user-2
content: 对方不send了，或网络临时断开或拥塞了，同步recv当然也就卡住了。
user-0 提问: getchar相关的，清除缓存不懂

回复:
user: user-1
content: printf一个不以\n结尾的字符串，要想确保字符串真正显示出来，别缓存在标准输出缓冲区中，需要紧跟一句fflush(stdout);rewind(stdin);//这才是C清标准输入缓存的正确方式cin.clear();cin.sync();//这才是C++清标准输入缓存的正确方式

user: user-1
content: 输入密码参考下面： #include <conio.h> #include <stdio.h> char pw[40]; int i,ch; FILE *f; void main() {     cprintf("\r\nPassword:");     i=0;pw[i]=0;     while (1) {         ch=getch();         if (ch==13 || i>=39) break;         switch (ch) {         case 27:             cprintf("\rPassword: %40s"," ");             cprintf("\rPassword: ");             i=0;pw[i]=0;             break;         case 8:             if (i>0) {                 i--;                 pw[i]=0;                 cprintf("\b \b");             }             break;         default:             pw[i]=ch;             i++;             pw[i]=0;             cprintf("*");             break;         }     }     cprintf("\r\n");     f=fopen("password.txt","w");     fprintf(f,"%s\n",pw);     fclose(f); }
user-0 提问: 大佬们帮我看看代码，C++代码返回值3221226356，谢谢了

回复:
user: user-1
content: 这个返回值 3221226356 在 Windows 平台上通常是由于程序发生了访问非法内存的错误，也就是所谓的“段错误”（Segmentation Fault）。 经过查看代码，可能存在以下问题： 在函数 List_HeadInsert 中，你已经为头结点 L 分配了空间，却又在循环内部重新分配结点空间并且没有释放。这会导致内存泄漏和无法预料的错误。建议将头结点初始化放到 InitList 函数中。 在函数 display 中，当 L 为空链表时，循环内部会出现对 NULL 指针的访问，这也会导致非法访问内存的问题。可以添加判断语句来避免这种情况。 在输入数据时，没有判断是否已经读入完毕，如果输入完最后一个结点后没有及时退出，会进入死循环，导致程序崩溃。  根据以上问题，下面给出修改后的代码： #include <iostream> #include <cstring>  using namespace std;  typedef int ElemType; typedef struct LNode {     ElemType sn;     ElemType sc;     string name;     struct LNode *next; } *LinkList, LNode;  void InitList(LinkList &L); LinkList List_HeadInsert(LinkList &L); void InsertLink(LinkList &L1, LinkList &L2); void display(LinkList L);  int main() {     LinkList L1;     InitList(L1);     List_HeadInsert(L1);     display(L1);     return 0; // 程序结束 }  void InitList(LinkList &L) {     L = (LNode *)malloc(sizeof(LNode));     L->next = NULL; }  LinkList List_HeadInsert(LinkList &L) {     ElemType tsn, tsc;     string tname;     LNode *s, *r = L;     while (cin >> tsn >> tname >> tsc) { // 添加输入判断条件，如果输入完毕就退出循环         s = (LinkList)malloc(sizeof(LNode));         s->name = tname;         s->sc = tsc;         s->sn = tsn;         r->next = s;         r = s;     }     r->next = NULL;     return L; }  void InsertLink(LinkList &L1, LinkList &L2) {     L2->next = L1->next;     L1->next = L2; }  void display(LinkList L) {     if (L == NULL || L->next == NULL) { // 当链表为空或只有头结点时退出函数         return;     }     for (LNode *p = L->next; p != NULL; p = p->next)         cout << p->sn << " " << p->name << " " << p->sc << endl;     cout << endl; }  希望这些修改能够帮助你解决问题。

user: user-2
content: 数据结构对单链表进行数据排序  http://bbs.csdn.net/topics/392201633
user-0 提问: 请帮我看看scanf_s输入结束后就没有下文了

回复:
user: user-1
content: 应该改为scanf_s("%s"，&name，sizeof（name）)；第二个参数要加上&，第三个参数是长度。

user: user-2
content: name前面加&

user: user-3
content: 输入姓名那里：scanf_s("%s", name); 修改为：scanf_s("%s", name, 40);

user: user-4
content: scanf_s() 的参数不对吧，看看帮助，好像对字符和字符串类参数，要有可许空间大小参数的。
user-0 提问: 稀疏矩阵；找不到这个矩阵相加哪里错了，怎么改啊？

回复:
user: user-1
content: 在稀疏矩阵相加的函数 add() 中，判断 A 和 B 矩阵当前位置非零元素相加后是否为 0 的语句有误。应该是： if (sum != 0) {    D.data[D.terms].i = A.data[apos].i;    D.data[D.terms].j = A.data[apos].j;    D.data[D.terms++].v = sum; }  即如果相加后不为 0，才将结果添加到 D 矩阵中。 完整的修改代码如下： #include<stdio.h> #include<stdlib.h>   #define SMAX 100 //三元组非零元素的最大个数  struct SPNode //三元组非零元素的行、列和值 {     int i,j,v; };  typedef struct sparmatrix //定义稀疏矩阵(三元组顺序表类型) {     int rows,cols,terms;//稀疏矩阵的行、列和非零元素的个数      struct SPNode data[SMAX]; //三元组表  } sparmatrix;   sparmatrix CreateSparmatrix()//创建稀疏矩阵 {     sparmatrix A;     printf("请输入列表的行数 列数 非零元的个数 \n");     scanf("%d%d%d", &A.rows, &A.cols, &A.terms);     for (int n = 1; n <= A.terms; n++)     {         printf("请依次输入元素行数 列数 值\n");         scanf("%d%d%d", &A.data[n].i, &A.data[n].j, &A.data[n].v);     }     return A; }   sparmatrix Trans(sparmatrix  A)//转置稀疏矩阵  {     sparmatrix C;     C.rows = A.cols;     C.cols = A.rows;     C.terms = A.terms;     for (int n = 1; n <= A.terms; n++)     {         C.data[n].i = A.data[n].j;         C.data[n].j = A.data[n].i;         C.data[n].v = A.data[n].v;     }     return C; }  void ShowSparmatrixA(sparmatrix A)  //显示稀疏矩阵A   {          printf("矩阵A的元素为：\n");     int k,x,y,n;     for(x = 1; x <= A.rows; x++)     {         for(y = 1; y <= A.cols; y++)         {             k = 0;             for(n = 1; n <= A.terms; n++)             {                 if ((A.data[n].i == x) && (A.data[n].j == y))                 {                     printf("%5d", A.data[n].v);                     k = 1;                     break;                 }             }             if (k == 0)              {                 printf("%5d", 0);             }         }         printf("\n");     } }  void ShowSparmatrixB(sparmatrix B)  //显示稀疏矩阵B   {          printf("矩阵B的元素为：\n");     int k,x,y,n;     for(x = 1; x <= B.rows; x++)     {         for(y = 1; y <= B.cols; y++)         {                k = 0;             for(n = 1; n <= B.terms; n++)             {                 if ((B.data[n].i == x) && (B.data[n].j == y))                 {                     printf("%5d", B.data[n].v);                     k = 1;                     break;                 }             }             if (k == 0)              {                 printf("%5d", 0);             }         }         printf("\n");     } }  sparmatrix add(sparmatrix A, sparmatrix B) {        sparmatrix D;      // 初始化结果矩阵 D 的行、列和非零元素个数     D.rows = A.rows;     D.cols = A.cols;     D.terms = 0;

user: user-2
content: 数组下标这玩意，您有时是从0开始用的，有时是从1开始用的，不乱才怪。
user-0 提问: 求 矩阵LUP分解 为什么直接赋值，得到结果正确，语句计算赋值，得到结果错误，请帮看下为什么

回复:
user: user-1
content: tmp_matrix_d[ik] = sum;你这里的 sum是float，计算结果已经损失精度了

user: user-0
content: REAL  原始是double，我这里也更改成double过，一样是不正确的结果，很诧异的是这个东西就是损失精度，得到结果是颠覆的。

user: user-1
content: 换个编译器试试，或者关闭优化选项试试

user: user-0
content: 应该是如 user-2所说，基本是tmp_matrix_d 计算得到输出和tmp_a有细小的差别， 矩阵求逆 就出现颠覆性的值

user: user-2
content: tmp_matrix_d 是怎么计算来的吧，这意味着由于浮点的表示限制，和 tmp_a 还是有误差的。将提及的那个贴里的 matrix.c 中 solve_matrix_equation_by_lup_decomposition() 每一步都对涉及到刚才变化了的 matrix 进行输出，对比了两个的结果，发现，好像是有细微的误差慢慢累积起来的，很是奇怪，怎么最后会有如此的大不同。

user: user-0
content: 就这个问题，你也没找到为什么是吧，直接赋值就OK，计算得到就出现很大的偏差

user: user-2
content: 好像就是这样的，在“数字帝国”站上，用它的矩阵求逆功能，从你的数据里取了前 4x4 如： 15.27 15.48 13.79 10.44 15.48 17.42 17.09 14.54 13.79 17.09 18.17 16.83 10.44 14.54 16.83 16.95 求逆的结果： 12.063130	-29.127886	24.652281	-6.921387 -29.127886	78.401900	-74.196654	24.357593 24.652281	-74.196654	77.738316	-28.724857 -6.921387	24.357593	-28.724857	11.949217 将最右下的数据由 16.95 改为 16.96，再算，结果是： 11.635207	-27.62195	22.876335	-6.182613 -27.62195	73.102244	-67.946782	21.757716 22.876335	-67.946782	70.367855	-25.658828 -6.182613	21.757716	-25.658828	10.673783 两次的结果差异甚大；所以，细微的误差，可能会引发巨震。

user: user-0
content: 看来就是数据的细小差异导致的，
user-0 提问: 我在写计时器用system("cls")清屏但是它跳过了

回复:
user: user-2
content: #define _CRT_SECURE_NO_WARNIGS #include<stdio.h> #include<conio.h> #include<stdlib.h> #include<math.h> #include<string.h> #include<time.h> #include<Windows.h> int main() {     for (int  i = 0; i < 24; i++)     {         for (int j = 0; j < 60; j++)         {             for (int k = 0; k < 60; k++)             {                 cprintf("\r%02d:%02d:%02d", i, j, k);                 Sleep (950);                          }         }     }     return  EXIT_SUCCESS; }

user: user-3
content: win7 x64 + vc2008 好像是执行了的；其实，无须这个调用，输出的把 \n 改为 \r 试试。
user-0 提问: 请问高手指针做参数的问题

回复:
user: user-1
content: 指针作参数要传递什么取决于参数本身存在的意义，即 “这个参数是什么？以及它要用来干什么？”函数调用时，系统为函数分配栈区内存，函数的返回值、参数、局部变量、临时变量等都会在函数的栈内存中占据一席之地。普通变量传参的时候，是把实参的数据拷贝了一份到函数参数的所在栈内存中。指针变量传参的时候，也是把一个地址作为数据拷贝到了函数参数所在的栈内存中，不同之处在于，指针支持( * 解引用 )、( -> 结构体/联合体的成员访问)、( [ ] 数组下标访问 )等操作，可以通过传入的目标内存地址去访问以及读写目标内存的数据。当然上述这些操作的前提是传入的地址是有效的，即地址指向的确实是一个已存在的内存实例，或者说内存里确实已经有了这么个东西。传入的内容可以是一个局部变量的地址，也可以是一个已经malloc分配过得堆内存地址。 SPI_HandleTypeDef hspi; memset(&hspi, 0, sizeof(SPI_HandleTypeDef)); uint6_t buf[1024] = { 0 }; HAL_StatusTypeDef status = HAL_SPI_Receive(&hspi, buf, sizeof(buf), 100); //----------------------------------------------------- SPI_HandleTypeDef *hspi = (SPI_HandleTypeDef *)malloc(sizeof(SPI_HandleTypeDef)); memset(&hspi, 0, sizeof(SPI_HandleTypeDef)); uint8_t *buf = (uint8_t *)malloc(sizeof(uint8_t) * 1024); memset(buf, 0, sizeof(uint8_t) * 1024); HAL_StatusTypeDef status = HAL_SPI_Receive(hspi, buf, sizeof(uint8_t) * 1024, 100); // ... free(hspi); free(buf);

user: user-0
content: 谢谢！

user: user-2
content: SPI_HandleTypeDef *hspi; uint8_t buf[1024];  HAL_StatusTypeDef rtn=HAL_SPI_Receive(hspi, buf,1024, 100);

user: user-0
content: 谢谢赵4老师

user: user-0
content: 谢谢！我试试。

user: user-3
content: 习惯上定义一个够大的数组作为接收缓冲区即可，把数组名当作实参传给它即可。
user-0 提问: C 语言问题   输入n行ASCII字符，计算每一行字符的个数（不包括换行符），并找出最大的字符

回复:
user: user-1
content: 以下是一个用C语言实现的程序，可以计算输入的n行ASCII字符中每一行字符的个数，并找出最大的字符。 #include <stdio.h>      int main() {       int n, i, max_char, max_count = 0;       char c;          printf("请输入行数n: ");       scanf("%d", &n);          printf("请输入%d行ASCII字符：\n", n);          // 初始化最大字符和行数计数器       max_char = 0;       max_count = 0;          // 逐行读取输入       for (i = 0; i < n; i++) {           scanf(" %c", &c);              // 如果这是第一个字符，则更新最大字符和行数计数器           if (i == 0) {               if (c > max_char) {                   max_char = c;                   max_count = 1;               }           } else {               // 否则，将这一行字符的个数和行数计数器加1               if (c > max_char) {                   max_char = c;                   max_count++;               }           }       }          // 找出最大字符并输出       if (max_count > max_char) {           printf("最大字符为：%c\n", max_char);       } else {           printf("最大字符为：%c\n", max_char);           printf("该行字符的个数为：%d\n", max_count);       }          return 0;   }  这个程序首先提示用户输入行数n，然后逐行读取输入的ASCII字符，并计算每一行字符的个数和行数计数器。当读取到第一个字符时，程序会更新最大字符和行数计数器。最后，程序会找出最大字符并输出该行字符的个数和行数计数器，如果两个计数器中有一个比最大字符还要大，则程序会输出最大字符和行数计数器，但不输出该行字符的个数。 请注意，这个程序假设输入的每一行字符都是合法的ASCII字符，即不包含空格、制表符或换行符。如果输入的字符不合法，程序可能会出现错误。

user: user-2
content: 写个循环n次的循环即可。
user-0 提问: 题目合并两个有序数组

回复:
user: user-1
content: 没仔细看您的代码，初步判断是函数 fun 中 else 后面的 for 语句缺少了大括号。 下面给出我的合并方法： int merge(int array1[], const int length1, int array2[], const int length2) {     int ind1 = length1 - 1;     int ind2 = length2 - 1;     int indMerged = length1 + length2 - 1;     while (ind1 >= 0 && ind2 >= 0)     {         if (array1[ind1] > array2[ind2])         {             array2[indMerged] = array1[ind1];             --ind1;         }         else         {             array2[indMerged] = array2[ind2];             --ind2;         }         --indMerged;     }     while (ind1 >= 0)     {         array2[indMerged] = array1[ind1];         --indMerged;         --ind1;     }     return length1 + length2; }
user-0 提问: 求助大佬们，c语言学习有什么系统好学的资料吗

回复:
user: user-1
content: C Primer Plus 第六版

user: user-2
content: 推荐先看《啊哈C》，因为我刚看过了。 入门级别的

user: user-0
content: 已买，我也用用入门，谢谢🙏
user-0 提问: [求助]nt!KiApcInterrupt蓝屏原因

回复:
user: user-1
content: 这个错误消息通常表明您的驱动程序在处理异常时出现了问题。KMODE_EXCEPTION_NOT_HANDLED是一个常见的错误消息，通常指向引起问题的驱动程序或函数。 在这种情况下，您应该记录异常的地址和包含该地址的驱动程序/库的链接日期。您还应该记录异常的参数，以便在未来的调试和分析中使用。 在这个错误消息中，有一些寄存器的值可能为零或不正确。rax、rbx、rcx、rdx、rsi、rdi、rip、rsp、r8、r9、r10、r11、r12、r13、r14、r15和iopl都是可能的值。请注意，这些值可能会被修改或不正确，因此在分析代码时请务必小心。

user: user-0
content: ChatGPT?
user-0 提问: vs code调试c语言为啥不行，这是咋回事啊，搞了3，4个小时了，求助大佬们

回复:
user: user-1
content: .c文件的的路径中不要带中文字符

user: user-2
content: VS Code本身并不支持C语言调试，因为它是一个基于JavaScript的编辑器，而不是一个完整的集成开发环境（IDE）。 如果您需要在C语言中进行调试，您需要使用一个集成开发环境（IDE），例如Visual Studio或Eclipse。这些IDE通常都有内置的调试器，可以帮助您在代码中设置断点，并在运行时跟踪变量和函数的值。 如果您使用的是Visual Studio Code，您可以安装一个名为“C/C++ Intellisense”的扩展程序，它可以帮助您在编辑器中显示C/C++代码的语法高亮和自动完成。但是，这并不能完全替代使用IDE进行调试

user: user-0
content: 用run code运行是可以的，但就是调试不了，直接运行也不行
user-0 提问: 用C语言做简易公交车查询系统

回复:
user: user-1
content: 以下是一个简单的C语言实现公交车查询系统的示例代码： #include <stdio.h>   #include <string.h>      #define MAX_LINES 100   #define MAX_LINE_LEN 3      typedef struct {       char line[MAX_LINE_LEN];   } Line;      int compare_lines(const void *a, const void *b) {       Line *l = (Line*) a;       Line *r = (Line*) b;       return l->line[0] - r->line[0];   }      int main() {       Line lines[MAX_LINES];       int num_lines = 0;          // 添加公交车路线记录       strcpy(lines[num_lines].line, "N10");       num_lines++;       strcpy(lines[num_lines].line, "北京市");       num_lines++;       strcpy(lines[num_lines].line, "1号线");       num_lines++;       strcpy(lines[num_lines].line, "天安门");       num_lines++;       strcpy(lines[num_lines].line, "5号线");       num_lines++;       strcpy(lines[num_lines].line, "国家博物馆");       num_lines++;          // 显示所有公交车信息       printf("\n公交车信息如下：\n");       for (int i = 0; i < num_lines; i++) {           printf("%s\n", lines[i].line);       }          // 修改公交车路线信息       strcpy(lines[2].line, "N10");       num_lines--;       strcpy(lines[2].line, "北京市");          // 显示所有公交车信息       printf("\n修改后的公交车信息如下：\n");       for (int i = 0; i < num_lines; i++) {           printf("%s\n", lines[i].line);       }          // 删除公交车路线记录       strcpy(lines[1].line, "N10");       num_lines--;       num\n");           return 1;       }          strcpy(fp->ptr, "\n公交车信息如下：\n");       for (int i = 0; i < num_lines; i++) {           strcpy(fp->ptr + strlen(fp->ptr), lines[i].line);       }          fclose(fp);          return 0;   }  这个示例代码实现了一个简单的公交车查询系统，包括添加、显示、修改、删除和保存公交车路线信息等功能。你可以根据自己的需求进行修改和扩展。
user-0 提问: 求大佬解惑，c语言作业题

回复:
user: user-1
content: 很遗憾，one function one x 。你的代码里只有一个变量x，你把它浪费了x=x/10之后，回过头去x<=y意义就不大了，x++就没意思了。

user: user-2
content: 🔗ChatGPT、AI绘图在线体验🔗Admin、Vue、Vite、Node、Midway、uniapp、Iot、外包、小程序🔗Cool-Admin、快速开发、CRUD、权限管理系统

user: user-3
content: if (n==3)
user-0 提问: 求回答     C语言中输入%s 最后的输出结果出现乱码

回复:
user: user-1
content: printf里面的%和变量的一一对应关系scanf里面的%和变量以及变量前加不加&的一一对应关系是C代码中非常容易出错的地方，而且通常编译还不出错。所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: 那里应该是%c而不是%s

user: user-0
content: %c的话  就该设清除缓冲区
user-0 提问: 程序可以编译成功就是运行后显示Press any key to continue,一按回车就直接退出来

回复:
user: user-1
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！scanf的格式字符串中不要包含空格和\n

user: user-0
content: 您说的应该是以前码农做的操作，我没有学过计算机操作系统和lunix只知道一些简单的dos命令，用cmd窗口运行代码就见过郝斌的视频操作过，C语言具体怎么做真不知道
user-0 提问: 关于vscode，C++问题

回复:
user: user-1
content: text.c这个名字暗示着里面是C语言代码，所以C++不好使。你可以查一下该环境下应该使用的扩展名。

user: user-0
content: 配置了还是不行，文件名字后缀也换成c++了

user: user-2
content: text.cpp
user-0 提问: 想知道主函数里输入的参数怎么用到自定义的以二维数组作参数的函数中二维数组的维度啊（截图里的程序是错误的，下边是高清版）

回复:
user: user-1
content: 了解一下OpenCV中的Mat

user: user-2
content: 语法性的错误太多。但是就标题提出的问题而言，简单地说，在相当多版本的C编译器下，根本不支持动态尺寸的数组。所以你首先要确定你的编译器支持，然后再说怎么写，以及修正其他错误。
user-0 提问: C语言新手入门，老师写的这个代码输出是2，3，4，5，6，7，8，9，10，11
我的输出什么都没有，哪位大佬找下原因

回复:
user: user-1
content: 题主的问题在于while循环那块，下面给上代码： #include<stdio.h>void test(){    static int a=1;    a++;    printf("%d",a);}int main(){    int i=0;    while(i<10)//题主这里加了分号，陷入while死循环且没有输出    {        test();            i++;    }    return 0;} 运行结果为：234567891011

user: user-0
content: 感谢！！

user: user-0
content: 放到while外面也不行

user: user-2
content: return 0放外面 删了分号

user: user-3
content: return 0放在while循环里面了

user: user-4
content: 关键原因是while行末有个多余的分号，这个分号篡夺了循环体的地位，构成了死循环。

user: user-5
content: 把return 0；放while外，return 0；会结束while的操作

user: user-6
content: 把 return 0; 放到while外面

user: user-0
content: 放到while外面了还是不行，也不报错就是无输出
user-0 提问: C语言外卖订餐管理系统求助：折扣数据无法读入

回复:
user: user-1
content: 在scanf系列函数里，我是说包括fscanf对应double类型的变量的格式符需要使用%lf而不是%f

user: user-0

user: user-1
content: 您是认真的么？编译能成功的话，起码得有含有错误的运行截图吧？还有无法读入的数据文件，你得确认它存在，位置正确，名字正确，权限正确，内容正确呀。
user-0 提问: 求键盘输入的一组数据的极值和均值

回复:
user: user-1
content: 你不妨想一想为什么你输出的最小值是正确的，在和要求的最大值对比一下

user: user-0
content: 感谢啊，找到问题了。能再问一下为什么这个题目里引用函数一定要用到指针啊。

user: user-2
content: 你不妨琢磨一下，为什么scanf引用变量要用指针（取地址），而printf一般不用。

user: user-0
content: 我这学期刚学，没有接触过scanf和printf。
user-0 提问: linux纯C下，调用excel或system函数启动外部程序，全路径中名含中文则会卡死（使用Qt 5.14.2环境编译)

回复:
user: user-0
content: 已解决。PCB利用好就OK

user: user-0
content: 我在ubuntu,fedora下测试都是如此，哎，基础知识不过关啊
user-0 提问: 为什么我的数码管一直闪啊？

回复:
user: user-1
content: 那玩意是显示部件，你得保证它每秒刷新25次以上，才能看不出来闪。我的意思是说，它实际上就应该一直闪，只不过弄好了就看不出来而已。
user-0 提问: 求解！C语言基础问题

回复:
user: user-0
content: OK了搞定

user: user-1
content: 在 C 语言中，可以使用scanf函数读取用户输入的数字，并通过判断来限制其大小。以下是一些实现方式： 使用循环和条件语句 int num;printf("请输入一个小于100的整数：");while (scanf("%d", &num) == 1 && num >= 100) {    printf("输入错误，请重新输入：");    while (getchar() != '\n') ; //清空输入缓冲区}printf("您输入的数字是：%d\n", num);

user: user-0
content: 这个有问题

user: user-2
content: 你判断一下不就好了嘛，设置一个最大值和最小值。不在范围内你返回重新输入

user: user-3
content: 输入不在限定范围内，提示并重新输入
user-0 提问: 请问怎么把这个数值转化成 十六进制显示

回复:
user: user-1
content: 数字不对吧~

user: user-2
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址；人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-0
content: union hex_value{    char buf[8];    long long value;};  union hex_value fv_hex; fv_hex.value = amplitude_balue;        tx_Setbuffer[0] = fv_hex.buf[0];        tx_Setbuffer[1] = fv_hex.buf[1];        tx_Setbuffer[2] = fv_hex.buf[2];        tx_Setbuffer[3] = fv_hex.buf[3];        tx_Setbuffer[4] = fv_hex.buf[4];        tx_Setbuffer[5] = fv_hex.buf[5];        tx_Setbuffer[6] = fv_hex.buf[6];        tx_Setbuffer[7] = fv_hex.buf[7]; 是可以的，当时写的是short  ，范围小了，导致是00
user-0 提问: 求大佬解决 为啥其所占字节大小不随参数改变而改变

回复:
user: user-1
content: sizeof是编译期运算；不是运行时运算。

user: user-2
content: 因为形参数组名的实质是一个指向首元素的指针。

user: user-0
content: 哦哦哦  谢谢
user-0 提问: C语言小白，设计了一个“输入一个整型数据，判断其是奇数还是偶数”的C语言程序，但输入除了0之外的数结果都是奇数，我自己找不出来哪里出了问题，有没有大佬帮我看一下程序哪里出错了

回复:
user: user-1
content: 有什么特殊环境限制吗，C语言的求模运算是编译器自带的，不依赖库的，因该可以直接用求模看余数是否为0来判断啊。你是用加减2趋近0来判断奇数偶数，那你的两个do while 的判断正负的条件弄反了。

user: user-2
content: 你这个算法，有些费事。while() 里的判断条件不对吧，m>0 时，应该是 while(m>0) 吧，否则也不能循环了；下面的 while() 类似。
user-0 提问: 请教一个指针的问题 @赵四老板@各路老板。

回复:
user: user-1
content: 计算机组成原理→Shell命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 对学习编程者的忠告：多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！眼过千遍不如手过一遍！书看千行不如手敲一行！手敲千行不如单步一行！单步源代码千行不如单步Debug版对应汇编一行！单步Debug版对应汇编千行不如单步Release版对应汇编一行！不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！） 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 栈中的变量通常包括函数参数和函数里声明的临时变量。栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。而栈中的类变量退出其作用域时，会自动执行其析构函数，……所谓在栈中“申请”N字节的空间，其实只是将栈指针寄存器（16位sp，32位esp，64位rsp）的值多减N而已。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。（Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。”但我又不得不承认： 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物； 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。而我本人属前者。 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质，而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！ 提醒：“学习用汇编语言写程序”和“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。（Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）想要从本质上理解C指针，必须学习C和汇编的对应关系。”不是一回事！ 不要迷信书、考题、老师、回帖；要迷信CPU、编译器、调试器、运行结果。并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-0
content: 多谢!

user: user-2
content: 写一行，调试一行，行行出BUG

user: user-1
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: 例2的a一样能得到num的地址，没问题。只不过离开这个函数也就是a的作用域以后a本身就不在了。

user: user-0
content: 见过大佬N次。例2，用在实际情况里，我的程序没有正常运行。而且，指针 一般不都是要  malloc 的吗？

user: user-3
content: 所以说您把实际存在问题的部分当作无关紧要的内容，从而简化掉了。 指针变量首先是个变量，变量肯定是对应着一小块存储空间的，这个不需要另外申请。 一般要malloc的是目标空间，也就是把自己的首地址送去给指针变量保存的那个空间。而您这里的目标已经有了，就是num，所以不存在什么空间问题。 问题就是局部变量a离开作用域以后失去了定义。

user: user-0
content: 待验证！谢谢大佬！
user-0 提问: C 语言 关于清空缓存 while (getchar() != '\n') continue;

回复:
user: user-1
content: 另外这样写（无论前者后者）严谨地说不算是清空，因为它只清到行末。

user: user-1
content: 功能上没有区别。效率上前者不可能高于后者，现代编译器中大概率编译成一样的。至于为什么，恐怕您得问编者了。
user-0 提问: 循环队列，求助大佬：为什么显示的运行结果不对

回复:
user: user-1
content: 调式噻，一步步运行看哪里不对噻；加数据函数里，应该先放数据，在调 rear 吧；其它，显示数据，你显示的是下标，数据应该是 q->data[q->rear] 吧，而且显示过程把数据清空了，对还是不对。
user-0 提问: 请教大佬一下，为什么这个程序不能得出想要的结果？（我编写的这个函数好像失效了）

回复:
user: user-1
content: 帮你改了两个地方。  #include <stdio.h> #define SIZE_ONE 7 #define SIZE_TWO 3 void copy_fun(double array_ar[],double source_ar[]); int main(void) {     int index;     double source[SIZE_TWO];     double array[SIZE_ONE] = { 1.2, 2.3, 4.2, 7.9, 6.3, 9.3, 9.3 };     copy_fun(array,source);//删去void      printf("source's value as following:\n");     for (index = 0; index < SIZE_TWO; index++)         printf("%.1f ", source[index]);     return 0; }   void copy_fun(double array_ar[],double source_ar[]) {     int i, index;      for (index = 0, i = 2; index < SIZE_ONE- 4; index++, i++)//SIZE改为SIZE_ONE          source_ar[index] = array_ar[i]; }

user: user-2
content: #include <stdio.h>  #define SRC_ARR_LENGTH 7 #define DST_ARR_LENGTH 3  void copy_fun(double src_ar[], double dst_ar[]) {     int j = 0;     for (int i = 0; i < SRC_ARR_LENGTH; i++)     {         if ((i>=2) && (i<=4))         {             dst_ar[j++] = src_ar[i];         }     } }  int main() {     double dstArray[DST_ARR_LENGTH] = {0, 0};     double srcArray[SRC_ARR_LENGTH] = { 1.2, 2.3, 4.2, 7.9, 6.3, 9.3, 9.3 };      copy_fun(srcArray, dstArray);      printf("source's value as following:\n");     for (int i = 0; i < DST_ARR_LENGTH; i++)     {         printf("%.1f ", dstArray[i]);     }     printf("\n");      return 0; }

user: user-3
content: 函数调用语句不能带前面的void，带着那玩意就被编译器理解为函数原型声明了。另外，啥地方定义了SIZE了？你的函数里SIZE-4没法解释啊。

user: user-0
content: 十分感谢，我已经对代码进行了修改，可以输出想要的结果了。

user: user-4
content: 失效，什么阶段什么表现；编译时，照着提示的错误信息和错误所在行，去修改；若运行结果不对，调试，在复制语句上断点，看每次复制时的状况，有错误，看错哪里，改。
user-0 提问: 大神们，帮帮忙，新人学习，找找出什么问题了，谢谢了。

回复:
user: user-1
content: scanf("%d,&gread"); 注意引号位置scanf("%d",&gread);

user: user-2
content: #include <stdio.h> int main() {     int grade;     scanf("%d", &grade);      if(grade >= 90)     {         printf("成绩为优秀\n");     }     else if((grade >= 70) && (grade <90))     {         printf("成绩为良好\n");     }     else if((grade >= 30) && (grade < 70))     {         printf("成绩为合格\n");     }     else     {         printf("成绩为差\n");     }      return 0;  }

user: user-3
content: #include <stdio.h> int main() {     int gread;     scanf("%d",&gread);          if (90<=gread            ) printf("成绩为优秀\n");     else if (70<=gread && gread<90) printf("成绩为合格\n");     else if (30<=gread && gread<70) printf("成绩为良好\n");     else if ( 0<=gread && gread<30) printf("成绩为差\n");     return 0; }

user: user-4
content: 码的漂亮，应该效仿！

user: user-3
content: https://bbs.csdn.net/topics/380157851

user: user-5
content: 子曾经说过，思而不学则die所以咱得学，而不是想当然地随便写。

user: user-6
content: scanf() 语句的后双引号放哪里去了

user: user-0
content: 兄弟，我改完了以后，还是不行。 运行是不能正常运行，就无论输入什么数值，它都是只有一个输出（成绩为优秀和成绩为差）一起输出的
user-0 提问: 问下各位大神，我这个代码怎么t输入18.6-18.9，结果都是错的，输入18.6  s1应该等于1，怎么等于0
18.5结果是对的

回复:
user: user-1
content: 随意敲数据类型的后果。

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

user: user-3
content: 不调试么，走一边大概就能知道问题在哪里吧；好像数据类型有不对

user: user-3
content: Coe() 里的 s ，最前面的声明是 int 但看函数里的使用，又是 float

user: user-4
content: 这个问题可能与浮点数精度有关，因为浮点数在计算机中的表示方式可能存在精度损失。在程序中，你将浮点数输入到s变量中，但在Coe函数中，你将其与18.5进行比较。由于在计算机内部存储和表示浮点数时的精度限制，可能会导致s变量与18.5进行比较时的结果不是你期望的。因此，建议你可以将s变量与一个非常接近的整数进行比较，而不是浮点数18.5。例如，你可以定义一个整数常量，如下所示： #define BASE_S 185  然后，将s与BASE_S进行比较，如下所示： if (s <= BASE_S) {     s1 = 0; } else if (s - BASE_S <= 5) {     s1 = 1; } else if (s - BASE_S > 5) {     s1 = (s - BASE_S) / 5 + 1; }  这样，你就可以将浮点数s转换为整数进行比较，避免了由于精度误差导致的计算结果错误的问题。

user: user-0
content: 谢谢🙏，懂

user: user-0
content: t输入16     s输入18.6      ch选择211  结果应该是525，输出的却是450.
user-0 提问: 新手入门求大佬教一下

回复:
user: user-0
content: 还请麻烦您细讲一下什么是定义标识符  现在我只是跟着翁恺老师的视频跟着敲代码  当然老师的代码是输出了出来

user: user-1
content: 标识符，identifier，指的是程序代码里的那些“名字”，各种东西的名字。 变量名是标识符的重要子集。 C中一个变量使用之前需要定义/声明，定义和声明当然还有自己的差别。 变量声明是一个说明，清晰表达这个名字的变量是什么类型的，这将会决定以后什么样的操作才是合法的，因为不同类型的操作集是有区别的。 而变量定义除了具有声明类型的功能，还向编译器要求在计算机内存里分配一块空间来存放这个变量。 综上，您敲代码时跳过的 int price; （在这个程序里简约形式可以这样写，也就是省略初始化，=0字样）就是一个承担了定义任务的声明。 上面最后这行内容再笼统一下就表达为  标识符price未定义。

user: user-1
content: 教材还是要看的，细看，尤其不要主观上觉得哪部分没用或者“聪明地发现”内容重复，于是就忽略一些内容。

user: user-0
content: 哦哦好的谢谢您  教材现在在看谭浩强老师的版本  当然只是粗看  之后我定会细看  感谢你提出的意见

user: user-1
content: 我一直说，初学者排错只看第一个错，改之，重新编译。

user: user-0
content: 意思是未定义标识符的问题吗？我的理解是；如果正确了应该就可以定义了不知道我的理解是否正确   还请指正

user: user-1
content: 当然不正确，因为您的确没有定义标识符price。

user: user-0
content: 您看看上面的那个回复   这里回复我发不了图片给您
user-0 提问: 链表求助：为什么建表不对啊，怎么改？

回复:
user: user-1
content: 数据结构对单链表进行数据排序  http://bbs.csdn.net/topics/392201633

user: user-2
content: 你的第一个函数，init...忘记调用了。

user: user-3
content: 看 ShowList() 里，你的表链有个起始的空表头项，那 Linklist L; 就不对了，应该是 linnode L; 吧，这样的话，那些函数调用参数也要改下变成 &L 了。
user-0 提问: 新手求助大佬， 如图

回复:
user: user-1
content: logged in被翻译为登录然后误作登陆然后再翻回去成了landed这种事会被人笑的

user: user-1
content: 另外数组名就是地址，所以这个scanf里面就不要对数组名取地址了。

user: user-2
content: arr2 数组溢出了，你就定义了一个字符的空间，输入字符串，起码得两个吧，一个字符，一个字符串结束标记字节 0x00；所以，把 arr2 定义得大些试试，如 arr2[64]

user: user-0
content: 懂了懂了，谢谢
user-0 提问: 新手求助，求各位大佬看看

回复:
user: user-1
content: %lf%lf%lf

user: user-0

user: user-2
content: 另外我眼神不行，认不出%和f中间是数字1还是小写L，请确保用小写L 。

user: user-0
content: 是小写l，感谢您的回答

user: user-2
content: 格式串里的非格式符，例如逗号，是需要你精确地原样输入的。

user: user-0
content: 好像还真是逗号的问题，把逗号换成空格就正常了。
user-0 提问: 三个程序员批斗JS.JPG

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。即可很方便地让A、B两种语言之间协调工作。比如：A将请求数据写到文件a.txt，写完后改名为aa.txtB发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txtA发现bb.txt存在时，读取其内容，读完后删除bb.txt以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。除非A或B不支持判断文件是否存在、文件读写和文件更名。但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？可以将临时文件放在RamDisk上提高效率减少磨损磁盘。数据的结构很复杂的话，文本文件的格式问题可参考json或xml 共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的：·进程之间松耦合·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。·方便在线开关服务，只需删除或创建该临时文本文件即可。·方便实现分布式和负载均衡。·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满）·…… “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边，回头是“使用共享纯文本文件进行信息交流”的岸！
user-0 提问: 没有报错但是输出时没有结果

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。提醒：再牛×的老师也无法代替学生自己领悟和上厕所！单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。不要依赖调试器输出复杂数据结构！而要将复杂数据结构的整个内容在处理它的每一步使用一小段代码按自己很容易理解的格式输出，非常有助于调试！或者可以说是“基础设施”数据结构对单链表进行数据排序  http://bbs.csdn.net/topics/392201633

user: user-2
content: initlist; 没有带入 l 指针，应该是 initlist(l); 吧；listinsert() 里最后没有填入数据；交换部分，没看懂，也不知道对不对。
user-0 提问: C语言斜上抛运动 的仿真

回复:
user: user-1
content: https://xege.org/

user: user-2
content: easyx.cn

user: user-0
content: 能不能详细说一说，我们书上没这个内容，现在束手无策了，谢谢谢谢

user: user-2
content: 绘图用easyx库，算法参考 https://blog.csdn.net/liuyuan_jq/article/details/6314261 中的python代码： from visual import *  scene.width = 400 scene.height = 300  scene.autoscale = 0 scene.range = (100,100,100) scene.center = (50,40,0)  ball = sphere(pos=(0,2,0),radius=2, color=color.green) ground = box(pos=(50,-1,0),size=(100,2,10))   gravity = 9.8  # m/s**2 velocity = 25   # m/s angle = 45     # degrees angle = angle * (pi/180) # converted to radians  VelocityY = velocity * sin(angle) VelocityX = velocity * cos(angle)  seconds = 0 dt = .01  finished = False while not finished:     rate(100) # go thru the loop no more than 100 times/s     seconds += dt      # position equation: y(t) = y0 + v0*t + .5 * a * t**2     ballY = 2 + VelocityY * seconds - .5 * gravity * seconds**2     ballX = VelocityX * seconds      ball.pos = vector(ballX,ballY,0)      if ballY - 2 &lt;= 0:         finished = True         print "initial velocity: " + str(velocity)         print "angle thrown: " + str(angle)         print "seconds in flight: " + str(seconds)         print "distance in the x direction: " + str(ballX)

user: user-0
content: 有没有用C语言写的那种呢？

user: user-0
content: 谢谢各位朋友了，帮帮孩子
user-0 提问: 统计输入字符，结果没有输出，各位大老请帮忙看下。

回复:
user: user-1
content: 用 EOF 来判别，最后得按个 Ctrl+Z 组合键吧

user: user-0
content: 放话了     已经好了

user: user-0
content: 谢谢
user-0 提问: 求助，需求就是输出所有特定的是三位数，三位数个位十位百位相应数字，分别立方后相加等于这个三位数

回复:
user: user-1
content: /* 快来抄作业 */ #include <stdio.h> int main(){    int i, j, m, n, sum; for (i=100; i<1000; i++) {     m = i;     sum = 0;      for (j=0; j<3; j++)     {         n = m%10;         m /= 10;         sum += n*n*n;     }      if (sum == i)     {         printf("%d\n", i);     } }  return 0;  }
user-0 提问: 求问这里为什么会输出3个乱码？指针数组这里第四个元素不是NULL吗，*p=NULL后为什么还会输出？后来我多加了一个整型变量i，并赋值为1后乱码消失了，但printf不了任何东西。

回复:
user: user-1
content: 所以是概念性错误，数组没有第四元素。

user: user-2
content: 数组越界你的修改只是瞎猫碰上死耗子罢了 char *a[]={"asd","asda","sx",NULL};

user: user-0
content: 谢谢
user-0 提问: vs报错，实参与形参不兼容

回复:
user: user-1
content: 有两个问题： 1.在函数printHero的参数列表中，struct hero heroArray[]应该改为struct Hero heroArray[]，大小写不匹配导致编译错误。 2.在函数bubbleSort的实现中，应该包含头文件#include，以便在比较字符串时使用string类型，否则将无法编译程序

user: user-0
content: 谢谢你！研究了好久都没发现自己写错了orz
user-0 提问: 大一小白提问C语言问题

回复:
user: user-1
content: b是静态变量，也就是说每次调用b，都是在上一个b的基础上进行调用。

user: user-2
content: 第二第三次调用fun的时候，进去以后b就不是2了，上次结束时b是多少现在还是多少。这就是static的用处。
user-0 提问: 程序被异常情况关闭掉，该程序自己重新开启，导致再次写文件时候发现，在上次文件尾部会出现不可见的@@@，该如何解决。

回复:
user: user-0
content: 目前是别的异常导致开发板出现断电重启，只能是在重启后，自己在遍历一次该文件，去掉这些不可见字符，在继续写了。

user: user-1
content: 这个没办法。就好象头疼，如果不找到原因，你没办法直接避免头疼。同样的道理。
user-0 提问: 大一c语言题目期末练习题

回复:
user: user-1
content: 学会在IDE中调试时看每句C对应的汇编指令

user: user-2
content: 184#include <stdio.h>int d=1;void fun(int p){int d=15;            /* 这里定义个局部变量d，且初始化等于15 /d+=p++;             / 这个d是局部变量d, p++没啥意义，结果不会传出函数外面 /printf("%d",d);    / p=3 时 d=18 注意这里没换行 /}int main( ){int a=3;fun(a);d+=a++;           / 这个d是全局变量d，所以d等于4 */printf("%d",d);return 0;} /* 所以最终结果输出184 */

user: user-0
content: 求解析 越详细越好
user-0 提问: 请大佬帮忙看一下此题，百思不能完成全部要求

回复:
user: user-1
content: 灰常灰常简单滴啦，当然你非要什么函数的话就要增加几行代码~ #include <stdio.h>   int main() {   int b[1024], n = 0;     for (int c; (c = getchar()) != 10;)     if (c == '+' || c == '-' || (c > 47 && c < 58))     {       ungetc(c, stdin);       if (scanf("%d", &b[n]) == 1) n++;     }   for (int i = 0; i < n; i++) printf("%d ", b[i]); puts("");     return 0; }

user: user-0
content: 非常感谢大佬

user: user-2
content: int flg = 0; // 标记是否已经执行atoiint n = 0;  // b数组下标char * str = "abc456sd78fd123s 789df";char * p = NULL; for (p = str; *p; ++p){    if (*p >= '0' && *p <= '9' && 0 == flg)    {        b[n++] = atoi(p);        flg = 1;    }    if (*p < '0' || *p > '9' && 1 == flg)    {        flg = 0;    }}

user: user-0
content: 非常感谢，懂了！那要是随意输入一个字符串，去判断呢？

user: user-0
content: 百思不能写出稍微完美的程序
user-0 提问: C语言中的数组的比较

回复:
user: user-1
content: 你知道，回字有四种写法。什么时候用哪一种呢？仅仅这样问是不是挺扯？ 上下文都是简体字的时候，你自然写简体标准。上下文都是繁体字的时候，你就要写繁体写法。搞书法的时候尤其是写对联的时候呢，一般用繁体字，但是上下联用到同一个字的时候一般需要变体，于是变体也有用的地方了。 而楼主的问题就失之于表面，你不要背代码，你得理解进去，然后知该从0开始就从0开始，该从1开始就从1开始，该从2开始就从2开始...

user: user-2
content: 这得看后续是什么功能和实现的方法吧；如排序，由于是两两比较，所以 10 个数 9 次比较就可实现一遍；如输出，就得是 10 次了。

user: user-0
content: 1！
user-0 提问: C++递归,什么情况会栈溢出？？

回复:
user: user-1
content: step-- 的缘故吧，后自减，即语句执行后再减，那就是始终是 return(func2(1000));  了，所以，就溢出了。换 --step 试试？

user: user-0
content: 对，是因为这个
user-0 提问: 有用Linux下c 读写spi从机，该如何操作，我下面是spi 主机模式，我想知道从机模式怎么写，谢谢了

回复:
user: user-1
content: spi从机是个外设，站在楼主的代码的角度看，外设那边一般没有处理器，也就没有代码，应该是靠芯片实现的功能。就好象U盘，U盘端本身一般是不运行软件代码的。
user-0 提问: C语言新手求助帖子，求大佬解答疑惑

回复:
user: user-1
content: 1、输入的时候敲 a=7 b=9 2、3、一样的，等号左右的表达式评估过程不分先后，所以像 *b++= *b*2; 这样写不对。 4、级别不同不好相容，所以应该写 int *p=a[0];
user-0 提问: 求代码急需，在线等，快快快！！！

回复:
user: user-1
content: 呃，前面的代码确实有考虑不全的地方。但是简洁呢，还是要的，很多年以前，在我开始学习编程的时候，一位师兄告诉我：代码不是old二，越长越好，从那之后，我一直记着这句话，作为代码的基本要求~修改一下： #include <stdio.h>  int main() {   int n, k, x = 0;    for (int i = (scanf("%d%d", &n, &k), 1); n; n /= 10, i *= k + 1)     x += (n % 10 < k ? n % 10 : k) * i;   printf("%d\n", x);    return 0; }

user: user-1
content: 老赵的代码写得太繁琐，须知代码不是小二，越长越好~ #include <stdio.h>  int main() {   char n[8];   int k, x = 1;    for (int i = (scanf("%s%d", n, &k), 0), j; n[i]; i++)     x *= (n[i] - '0' > k ? k : n[i] - '0') + 1;   printf("%d\n", x - 1);    return 0; }

user: user-2
content: xs，自己代码都是错的 来说别人繁琐？

user: user-3
content: #include <stdio.h> int main() {     int n,k,i,t,f;     char s[8],*p;     scanf("%d%d",&n,&k);     t=0;     for (i=1;i<=n;i++) {         sprintf(s,"%d",i);         f=1;         p=&s[0];         while (1) {             if (*p==0) break;             if (*p>'0'+k) {                 f=0;                 break;             }             p++;         }         if (f) t++;     }     printf("%d\n",t);     return 0; }

user: user-1
content: 灰常灰常简单滴啦～
user-0 提问: qsort对动态内存排序问题

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <malloc.h> struct PC {     int a;     char b; } *pc; int i; int compare( const void *arg1, const void *arg2 ) {     return ((struct PC *)arg1)->b - ((struct PC *)arg2)->b; } int main() {     pc=(struct PC *)malloc(3*sizeof(struct PC));     pc[0].a=1;     pc[0].b='z';     pc[1].a=2;     pc[1].b='y';     pc[2].a=3;     pc[2].b='x';     qsort( (void *)pc, 3, sizeof(struct PC), compare );     for (i=0;i<3;i++) {         printf("pc[%d].a:%d, pc[%d].b:'%c'\n",i,pc[i].a,i,pc[i].b);     }     free(pc);     return 0; } //pc[0].a:3, pc[0].b:'x' //pc[1].a:2, pc[1].b:'y' //pc[2].a:1, pc[2].b:'z' //
user-0 提问: 再问数据类型转化的问题

回复:
user: user-0
content: 不明白你什么意思。

user: user-1
content: 如果你熟悉MarkDown语法，在代码的前后加 ``` 可以让代码有语法高亮效果。例如： #include <stdio.h> int main(int argc,char** argv){   print("hello,wolrd!");   return 0; }

user: user-0
content: 谢谢

user: user-2
content: 错误不在调用上，在于你的指针没有目标空间，你得给它目标空间然后才好干活。

user: user-0
content: 谢谢！得怎么给它目标空间呢？我比较愚钝，还请明示。
user-0 提问: 完全懵逼了，不符合小学数学啊

回复:
user: user-1
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E  http://bbs.csdn.net/topics/391003898

user: user-2
content: #define square(x) ((x) * (x))

user: user-3
content: 1+1*1+1=3 (1+1)*(1+1)=4
user-0 提问: 怎么不是16呢？木天理

回复:
user: user-1
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-Ehttp://bbs.csdn.net/topics/391003898

user: user-2
content: 3+1*3+1當然等於7啦。 #define sqr(x) (x* x)

user: user-2
content: ( (x) * (x))
user-0 提问: 难道*i = *i * *i 运行了两次？

回复:
user: user-1
content: 我一运行，他输出4,9毫无破绽啊

user: user-2
content: 对学习编程者的忠告：多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！眼过千遍不如手过一遍！书看千行不如手敲一行！手敲千行不如单步一行！单步源代码千行不如单步Debug版对应汇编一行！单步Debug版对应汇编千行不如单步Release版对应汇编一行！不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！

user: user-3
content: 用個中間變量過度下，不要直接*i=*i**i
user-0 提问: 求助 改错(C语言_数据结构单链表删除，学生管理系统)

回复:
user: user-1
content: 数据结构对单链表进行数据排序  http://bbs.csdn.net/topics/392201633

user: user-2
content: 86行造成结点自循环了嘛，所以后面的结点就都丢了。

user: user-0
content: 那请问要改成啥压，，这里我改了好几遍，例如p=phead->next,pre->next=phead-next,等等，要么就是循环了，要么就是段错误 绕不出来 请帮忙做出改正和更加详细的解释谢谢谢谢谢谢

user: user-3
content: p 和 pre 的 next 不应该再设置的，你只是给 p 和 pre 初始化下，表里 next 成员这时又不应该发生变动。

user: user-0
content: 也就是在这里将pre和p初始化成为一个在前一个在后的指针，然后并排跑是嘛
user-0 提问: 求助，有关结构体指针的初始化

回复:
user: user-1
content: fat* fat1 = (fat*)(v_addr0 + BLOCKSIZE);这个不是初始化，是指向v_addr0 + BLOCKSIZE 这个偏移地址。猜测BLOCKSIZE是fat结构体的大小，那么这个偏移就是指向下一个结构体。fat1当然可以当做数组了。

user: user-2
content: 不是初始化结构体，只是让那指针指向已有的数据某部分；指针当数组，全看编译器是否支持了，指针类型确定了，作为数组指向某单元，偏移是可以确定的

user: user-3
content: 不懂的部分就去溯源，不去找的话，大佬们也一样不懂。
user-0 提问: 请问怎么修改代码，能让输出的结果既能输出“没有与别人生日相同的人”，也能输出“生日相同的人”？

回复:
user: user-1
content: 输入a 2000:1:3b 2000:1:2c 2000:1:2则输出1:2 b c1:3 a 以上本来就已经实现了既能输出“没有与别人生日相同的人”，也能输出“生日相同的人”呀？
user-0 提问: keil遇到问题了，真心求解。main.c（350）：错误 C141：语法错误接近“void”，预期为“__asm”

回复:
user: user-1
content: void nao_zhong(); 这个后面的分号是否多余？

user: user-0
content: 好像，没有太大关系
user-0 提问: 自学了x86汇编，说一下我对内存的理解，如有错误请大家指正。

回复:
user: user-1
content: 比较新的处理器通常是56位物理地址了，当然内存控制器一般只能支持几百GB的内存~

user: user-2
content: 对于裸内存来说，您理解的都对。只是现有的硬件一般实现地址总线时不会搞64根，典型值是48根。所以理论上那么长的那根绳子在现阶段的实践中可能只有65536分之一的长度是实际可用的。

user: user-3
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址；人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 栈中的变量通常包括函数参数和函数里声明的临时变量。栈中的基本变量退出其作用域时，没有谁执行一段代码去释放/销毁/析构它所占用的内存，仅仅是没人再去理会的留在当前栈顶上方的若干遗留下来可被后续压栈操作覆盖的无用数据而已。而栈中的类变量退出其作用域时，会自动执行其析构函数，……所谓在栈中“申请”N字节的空间，其实只是将栈指针寄存器（16位sp，32位esp，64位rsp）的值多减N而已。 计算机组成原理→Shell命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 对学习编程者的忠告：多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！眼过千遍不如手过一遍！书看千行不如手敲一行！手敲千行不如单步一行！单步源代码千行不如单步Debug版对应汇编一行！单步Debug版对应汇编千行不如单步Release版对应汇编一行！不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！） 单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。（Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。”但我又不得不承认： 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物； 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。而我本人属前者。 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质，而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！ 提醒：“学习用汇编语言写程序”和“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。（Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）想要从本质上理解C指针，必须学习C和汇编的对应关系。”不是一回事！ 不要迷信书、考题、老师、回帖；要迷信CPU、编译器、调试器、运行结果。并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-0
content: 很欣慰，一年前你这段话还完全不理解，现在已经理解了至少80%。是你把我带进汇编这个坑里的。

user: user-3
content: 我都说了：【 提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！ 】 为什么你还认为是我把你带“坑”里了呢？ (^_^)

user: user-3
content: 《深度探索C++对象模型》 《C++反汇编与逆向分析技术揭秘》
user-0 提问: 请教大佬C++编译后Windows Defender和360报毒怎么解决

回复:
user: user-1
content: 使用360杀毒杀一杀你的电脑

user: user-0
content: 虚拟机里面跑的，主机没用360，其他杀毒软件（金山毒霸，腾讯电脑管家，火绒）都没报毒，只有360和Windows Defender报毒。

user: user-1
content: 那就虚拟机里面杀毒
user-0 提问: 有一道非常简单的循环我实在搞不懂

回复:
user: user-1
content: 原因是scanf会默认读取末尾空白字符并跳过，你输入的数字（比如1  2 3     4   6 7     8）后面有几个空格都无所谓，scanf会读取并抛弃，直到遇到一个非空白字符。也就是说你输入1 2之后，“1”才会被真正读取，"2"进入缓冲区。同理，你输入“8”之后，必须有一个非空白字符才会读取到“8”。

user: user-2
content: 你的scanf的%d后面有空格，意味着你敲完8以后也得带个空格，然后再敲回车。而不是直接敲回车。所以，%d为什么要带空格呢？

user: user-1
content: 并不是这个原因。scanf 不会读取空格。
user-0 提问: 先学完汇编基础，是否C语言的学习就不成问题了？

回复:
user: user-1
content: 汇编更底层吧，C语言和汇编差别还是挺大的，语法也差很多，就当做一门新课程学了。

user: user-2
content: 计算机组成原理→Shell命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构…… 对学习编程者的忠告：多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！眼过千遍不如手过一遍！书看千行不如手敲一行！手敲千行不如单步一行！单步源代码千行不如单步Debug版对应汇编一行！单步Debug版对应汇编千行不如单步Release版对应汇编一行！不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！） 想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。”但我又不得不承认： 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物； 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。而我本人属前者。 不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质，而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。 这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！ 提醒：“学习用汇编语言写程序”和“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。（Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）想要从本质上理解C指针，必须学习C和汇编的对应关系。”不是一回事！

user: user-3
content: 汇编只对于理解高级语言生成的二进制代码有所帮助，对于高级语言编程并没有什么作用（几乎没有，如果你不使用嵌入汇编的话），二者并非楼房一层和二层之间的关系，只能说类似手工业和工业化大生产之间的关系~

user: user-0
content: 也不是全无作用，比如没学汇编之前对C的指针和数组理解不透彻，所有文章都试图用printf解释，越解释越乱。学过汇编就能明白内存长什么样子，数组和指针就自然理解了。

user: user-4
content: 不能理解，走路之前为什么一定要先砍一条腿呢？

user: user-0
content: 每天只有1个小时学习，研究C的汇编代码就没空看书，看书就没空研究汇编。

user: user-4
content: 问题是一个人只能有一棵技能树，独立于其他人，独特于其他人。 培养树是一辈子的事。 如果你坚持认为浇水施肥捉虫等等事情只能挑着做一件，那是没法培养树的。

user: user-0
content: 家里养花吗，你真的有时间天天浇水施肥捉虫？大多数时候有浇水就不错了。等退休并且没子女拖累时，才能天天养花。 实际上我们每个人都是偏科的，因为人的精力和时间有限。我40岁，学编程只在坚持活到老学到老的最求。
user-0 提问: 求助！不知道代码哪里出错了，运行不了，求求各位大佬帮忙看看

回复:
user: user-1
content: 错误挺多的，首要的问题是，您没写输出有效信息的printf，运行它就不会有可见的结果啊。

user: user-2
content: 接收輸入&a[i].s改爲a[i].s或&a[i].s[0]
user-0 提问: 编写一个函数，输入n为偶数时，调用函数求1/2+1/4+...+1/n,当输入n为奇数时，调用函数1/1+1/3+...+1/n(利用指针函数)。

回复:
user: user-1
content: sum+=(float)1/x;
user-0 提问: 如何实现跨平台、跨硬件读取CPUID等信息？

回复:
user: user-1
content: 这个是无法做到硬件无关的，好比你要测量每个人老二的大小~

user: user-0
content: 可能我的表达有误，我的意思其实是想说，因为不同的架构所以需要不同的指令，应该有代码可以判断或者读取的，只是我似乎搜索不到这样的代码，网上已有的代码千篇一律，只能查INTEL系列的，我只想看哪里能找得到，是LINUX的内核源码吗？

user: user-2
content: CPUID这个词本来就是Intel的私有术语，您不能凭想象把它推广到其他硬件啊。

user: user-2
content: 这么说吧，如果能实现的话，Java还会这么滋润么？
user-0 提问: 救命啊！！为什么链表尾插数据无法退出循环，不知道哪里出问题，大佬救命！！！

回复:
user: user-0
content: while (y != NULL && strcmp(y->bookid, p->bookid) <= 0) {                             yf = y; y = y->next;                         }                         if (y == NULL) { yf->next = p; }                         else { p->next = y; yf->next = p; }  谢谢谢大佬，已解决。y = null 时， y->bookid 已经没有值无法比较while条件前后互换一下&&
user-0 提问: 请问有哪些书介绍C语言和汇编之间的对应关系？

回复:
user: user-1
content: C编译器都支持生成lst汇编代码并且带对应C源代码注释

user: user-2
content: 没这样的书，高级语言和低级语言之间不是一对一的关系，而是多对多的干系~

user: user-0
content: 我学习了一段时间x86汇编，visual studio的C语言反汇编可以看懂部分。 想要看懂全部，苦于网上资料零碎，希望有书全方位介绍。

user: user-3
content: 我觉得作为司机没必要学习发动机制造过程中的金属表面热处理工艺。

user: user-3
content: 如果您写一本的话，我买一本表示一下支持。
user-0 提问: 求助！这代码循环结构那里出问题了，但是不知道怎么改,感谢大佬！！！

回复:
user: user-1
content: for(i=1;i<n;i++) {   for(j=i+1;j<=n;j++)     {    if((p[i].a==p[j].a&&p[i].b==p[j].b) || (p[i].a==p[j].a&&p[i].c==p[j].c) || (p[i].b==p[j].b&&p[i].c==p[j].c))         ans++;     } }

user: user-0
content: 谢谢大佬！！！！！
user-0 提问: #求助 fread函数总会读进一些意料之外的字符

回复:
user: user-1
content: Line 47把info当作字符串输出，但是从文件读出的info的内容是没有'\0'结尾的，所以，printf函数会越过info的边界继续输出字符，直到遇到'\0‘。而内存中info后面的内容是随机的。

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

user: user-3
content: fread本来是用来读二进制文件的，整个读结构体数组什么的很方便。你偏要用他读文本文件当然是各种别扭了。

user: user-3
content: 想象一下给汽车去掉方向盘装上自行车车把的效果。

user: user-0
content: 确实，很不方便

user: user-4
content: 有可能是文件编码的一些问题，或者是out.txt末尾有不可见字符。如果在out.txt随便加入一些中文字符，程序的输出是？

user: user-0
content: 我另起一行加了个“你好“，输出结果里没有中文字符，但是有更多的乱码 具体结果是这样的： Sum is: 33 Sum is: 45 浣犲ソ LOGONSERVERn?萬

user: user-4
content: 首先确定out.txt的编码是Windows的缺省编码。notepad点击另存为，它显示的编码是Ansi吗？ 如果是其他编码，就会出现中文打印乱码的情况。 另外，在get_info()里面，建议里面的代码改成： char* get_info(FILE*fp) { 	int size=tell_len(fp); 	char*info= (char*)malloc(sizeof(char) *size + 1); 	.....  	fread(info,size,1,fp); 	// print %s 打印时， 字符串需要0结尾 	info[size] = 0;      rewind(fp); 	return info; }

user: user-0
content: out 的编码是utf-8不是ANSI
user-0 提问: 我正在参加年度博客之星评选，请大家帮我投票打分，您的每一分都是对我的支持与鼓励。
https://bbs.csdn.net/topics/611386885?spm=1001.2014.3001.69

回复:
user: user-1
content: 已5星，欢迎回访！诚信互评⭐⭐⭐⭐⭐http://t.csdn.cn/KMfwt已5星，欢迎回访！诚信互评⭐⭐⭐⭐⭐http://t.csdn.cn/KMfwt已5星，欢迎回访！诚信互评⭐⭐⭐⭐⭐http://t.csdn.cn/KMfwt