Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 大佬救命！1单链表中最后一个函数小黑窗运行失败

回复:
user: user-0
content: 大佬，这个系统回复好像有延迟，所以我都结贴了才看拿到你的回复，谢谢大佬，好人一生平安啊！  不过我按照你的改了之后，那两个奇数和偶数的链表还是无法显示到小黑窗上不知道为什么

user: user-1
content: 引用 4 楼 自信男孩 的回复://while(!DLList) {     while(DLList) { devide函数这句需要修改一下吧 另外，偶数和奇数的链表输出也有问题，a，b已经指向最后一个节点了，还怎么将所有的节点输出？  void devide(Node *DLList, Node *a, Node *b) { //将一个链表分成一个奇数表和一个偶数表     init(DLList);     display(DLList);     if(!DLList  || !DLList->next)         printf("null\n");      Node *tmpa = a, *tmpb = b;     //while(!DLList) {     while(DLList) {         if(DLList->data%2) //偶数         {             a ->next = DLList;             DLList = DLList->next;             a = a->next;             a->next  = NULL;         }         else //奇数         {             b ->next = DLList;             DLList = DLList->next;             b = b->next;             b->next  = NULL;         }     }      display(tmpa);     /*     a = tmpa->next;     while(a)     {         printf(" %d",a->data);         a=a->next;     }     printf("\n");     */     display(tmpb);     /*     b = tmpb->next;      while(b)     {         printf(" %d",b->data);         b=b->next;     }      printf("\n");     */ } 定义变量tmpa, tmpb，如上图输出。

user: user-0
content: 引用 1 楼 user-4 的回复:你在分奇偶的时候，a和b都移动了，即a=a->next, b=b->next 所有分好奇偶后的 while(a) //这里的a已经指向链表最后一个节点了。你要重新把a指向原来的链表头才行。就好像数组下标走到了数组的最后，你要遍历数组就要把下标重新置0。 所以 在while(!DLList)前追加 Node *pa = a; //记住链表头 Node *pb = b;  在while(a)前追加 a = pa; //重新指向链表头 b = pb;大佬万岁，你是最棒的

user: user-1
content: //while(!DLList) {     while(DLList) { devide函数这句需要修改一下吧

user: user-2
content: 没有运行过 但是似乎有些问题   void devide(Node *DLList, Node *a, Node *b) { //将一个链表分成一个奇数表和一个偶数表      init(DLList);         display(DLList);     if(!DLList  || !DLList->next)         printf("null\n");     while(!DLList) {         if(DLList->data%2) //偶数    为什么这里是偶数的判断条件？？%2=0的话 是偶数 但是if语句不成立 应该走else分支         {             a ->next = DLList;               //这里将DLList链接到a的后面             DLList = DLList->next;        //DLList指向下一个节点             a = a->next;                       //a指向下一个节点，此时a指向的就是DLList->next，你不觉得你循环完了之后a其实已经指向DLList链表的最后了吗？a已经不是a链表的头节点了。             a->next  = NULL;               //a的下一个节点设置为空         }         else //奇数          {             b ->next = DLList;             DLList = DLList->next;             b = b->next;             b->next  = NULL;         }     }      while(a)     {         printf(" %d",a->data);         a=a->next;     }     printf("\n");       while(b)     {         printf(" %d",b->data);         b=b->next;     }     printf("\n");  }

user: user-3
content: while(!DLList) 条件反了

user: user-4
content: 你在分奇偶的时候，a和b都移动了，即a=a->next, b=b->next 所有分好奇偶后的 while(a) //这里的a已经指向链表最后一个节点了。你要重新把a指向原来的链表头才行。就好像数组下标走到了数组的最后，你要遍历数组就要把下标重新置0。 所以 在while(!DLList)前追加 Node *pa = a; //记住链表头 Node *pb = b;  在while(a)前追加 a = pa; //重新指向链表头 b = pb;
user-0 提问: 利用代码程序求时间复杂度

回复:
user: user-1
content: 引用 7 楼 lin5161678 的回复:[quote=引用 2 楼 5250的回复:]很明显 每两项为-1，到N为止就是-n/2  时间复杂度O(1) 休息奇数偶数是不一样的[/quote]  没注意看 那就再判断最后一个是奇数或者偶数  偶数的话就如我之前说的 奇数的话加一个N

user: user-2
content: 引用 2 楼 5250的回复:很明显 每两项为-1，到N为止就是-n/2  时间复杂度O(1) 休息奇数偶数是不一样的

user: user-3
content: 看要循环的次数是O(n)；但是找到规律，用公式就是O (1); 算法的优势～

user: user-2
content: 直接通项公式 求结果  时间复杂度O(1) 完事

user: user-4
content: O(1) 直接导出公式 1-2 =-1； 3-4=-1； 。。。。  如果N是偶数 等于-1*N/2 奇数N+(N/2)*(-1)

user: user-5
content: 当然，如果你直接用公式，O(1)就可以 int main() {     int i, n, sum=0, flg=1;     scanf("%d", &n);     sum = (-1)*(n/2) + (n%2==0?0:n); //通过技巧，每两项的和是-1，判断n是不是偶数，如果是偶数则-1*n/2，否则再+n     printf("%d\n", sum);     return 0; }

user: user-1
content: 很明显 每两项为-1，到N为止就是-n/2  时间复杂度O(1)

user: user-5
content: 这不是O(N)就可以了吗？ int main() {     int i, n, sum=0, flg=1;     scanf("%d", &n);     for (i=1; i<=n; i++) {         sum += flg*i;         flg *= -1;     }     printf("%d\n", sum);     return 0; }
user-0 提问: i++++与++++i的区别（C/C++语言）

回复:
user: user-0
content: 引用 1 楼 user-4 的回复:因为i++是表达式运算结束后i才递增，i++++表达式还没运算结束又++了，所以不可。所以i++不可做左值（因为表达式运算没结束，i未定） 而++i是表达式运算前i就递增，所以++++i表达式没运算结束i也是可定的。所以++i可做左值。 觉得您说的有道理，这样想的话我就明白了，谢谢

user: user-1
content: 都是未定义 紫薯紫薯紫薯

user: user-0
content: 引用 3 楼 ggglivw的回复:为何有4个+？这样的代码没有研究意义，公司里面没人敢一个变量在同一行写2个++-- 今天算法导论的老师讲的，当时就一脸懵。。查了好多也没找到咋回事儿

user: user-2
content: 为何有4个+？这样的代码没有研究意义，公司里面没人敢一个变量在同一行写2个++--

user: user-3
content: 研究这个的意义不大，如果这样的代码带有歧义行，索性不要写这样的代码。

user: user-4
content: 因为i++是表达式运算结束后i才递增，i++++表达式还没运算结束又++了，所以不可。所以i++不可做左值（因为表达式运算没结束，i未定） 而++i是表达式运算前i就递增，所以++++i表达式没运算结束i也是可定的。所以++i可做左值。
user-0 提问: 为什么会这样

回复:
user: user-1
content: 你的代码有逻辑问题， *ppstr = _recalloc(*ppstr, pplen + nlen - olen + 1, 1);  因为。如果有两处要替换，且新字符串大于旧字符串 当你替换了第一个以后，这个pplen也要随之改变，否则recalloc后的字符串将放不下，新字符串

user: user-2
content: //#define  _CRT_SECURE_NO_WARNINGS //关闭安全 #include <stdio.h> #include <stdlib.h> #include <string.h>  #if 0 void tihu(char** ppstr, char* old, char* new_str) {     int pplen = strlen(*ppstr);//原字符串长度     int olen = strlen(old);//被替换的长度     int nlen = strlen(new_str);//替换的长度      char* p1 = *ppstr; //创建2个指针保存原字符串的地址     char* p2 = *ppstr;      while (*p1 != '\0')//循环     {         *p1 = *p2;// 2指针错位          int flag = 1; //假设找到 1          for (int i = 0; i < olen; i++)         {             if (p2[i] != old[i] || p2[i] == '\0')//寻找             {                 flag = 0;//找不到                 break;//跳出             }         }          if (flag == 0)         {             p1++;             p2++;         }         else         {             int n = p1 - *ppstr;//确认位置             int m = p2 - *ppstr;              *ppstr = recalloc(*ppstr, pplen + nlen - olen + 1, 1);//扩展内存+1处理'\0'              p1 = *ppstr + n;//找回位置             p2 = *ppstr + m;              for (char* p = p2 + strlen(p2); p >= p2; p--)//移动字符串             {                 *(p + nlen - olen) = *p;             }              for (int i = 0; i < nlen; i++)//拷贝             {                 p2[i] = new_str[i];             }          }     }  } #endif  void replace_str(char **str, const char *substr, const char *newstr) {     int i;     int src_len = strlen(*str);     int sub_len = strlen(substr);     int new_len = strlen(newstr);     char *pstr = *str;     unsigned int len, pos;      len = src_len;     while (*pstr) {          for (i = 0; i < sub_len; i++) {             if (*pstr && pstr[i] != substr[i])                 break;         }         if (src_len - (pstr-*str) < sub_len)             break;          if (i >= sub_len) {             pos = pstr - *str;             //if (sub_len < new_len) {             *str = (char *)realloc(*str, src_len + new_len - sub_len + 1);             if (!(*str))                 return;             pstr = *str + pos;             memmove(pstr + new_len, pstr+sub_len, src_len - pos);             src_len = src_len + new_len - sub_len;             memcpy(pstr, newstr, new_len);             pstr += new_len;             //}             continue;         }         pstr++;     }     (*str)[src_len] = 0; }   //void main() int main() {     int slen = strlen("aaaaaaaa  like  aaaaa  like aaaaaaaa"); //原字符串长度     char *p = (char *)malloc(slen + 1);// 分配内存空间      strcpy(p, "aaaaaaaa  CCCC  aaaaa  CCCC aaaaaaaa");//拷贝字符串     //tihu(&p, "CCCC", "bbbb bbbb bbbb bbbb");//替换     printf("Before replace: %s\n", p);     replace_str(&p, "CCCC", "bbbb bbbb bbbb bbbb");     //replace_str(&p, "CCCC", "abc");       printf("%s\n", p);        //system("pause");     //     return 0; } 供参考～  linux下编译测试～realloc可能不一样，可以参考一下～
user-0 提问: C语言用for循环对数组元素输入输出

回复:
user: user-0
content: 引用 3 楼 自信男孩的回复:把 scanf中""双引号里的空格去掉再试试应该就可以了。 问题已解决，谢谢你！

user: user-0
content: 引用 2 楼 lin5161678的回复:scanf 格式控制字符串%d后面的 空格 删掉 问题已解决，谢谢你！

user: user-0
content: 引用 1 楼 user-3的回复:把scanf中%d后面的空格删了就行了 scanf会默认过滤掉空格、回车、制表符，由于scanf()默认把空白作为分割多个输入的标志，所以当你输入空白的时候，scanf()会认为你将要进行下一个输入，从而停下来等你。但是，当参数字符串的处理已经来到结尾或者输入流来到末尾的时候，scanf()不会认为你将继续进行输入。所以参数为"%d"的时候直接输入然后按回车就结束了。但当参数为"%d "的时候，此时没有处理到结尾，scanf()会认为你要继续进行输入。然而你输入了空格或者回车，scanf()认为他们是分隔符，于是过滤掉了。换句话来说，scanf()依旧在等待你的输入，只有当你输入不是空白的字符以后，scanf()才会用它与参数字符串里面的空格比较。这就是为什么你需要再输入一个数字的原因了 懂了懂了，谢谢解答！！

user: user-1
content: 把 scanf中""双引号里的空格去掉再试试应该就可以了。

user: user-2
content: scanf 格式控制字符串%d后面的 空格 删掉

user: user-3
content: 把scanf中%d后面的空格删了就行了 scanf会默认过滤掉空格、回车、制表符，由于scanf()默认把空白作为分割多个输入的标志，所以当你输入空白的时候，scanf()会认为你将要进行下一个输入，从而停下来等你。但是，当参数字符串的处理已经来到结尾或者输入流来到末尾的时候，scanf()不会认为你将继续进行输入。所以参数为"%d"的时候直接输入然后按回车就结束了。但当参数为"%d "的时候，此时没有处理到结尾，scanf()会认为你要继续进行输入。然而你输入了空格或者回车，scanf()认为他们是分隔符，于是过滤掉了。换句话来说，scanf()依旧在等待你的输入，只有当你输入不是空白的字符以后，scanf()才会用它与参数字符串里面的空格比较。这就是为什么你需要再输入一个数字的原因了
user-0 提问: 关于++i的入栈问题

回复:
user: user-0
content: 引用 7 楼 ggglivw 的回复:这种是出书的人瞎搞，故意给你来这一个题目问你答案，他自己也不知道答案，用当时随便找的编译器执行结果当标准答案，不知道具体细节误人子弟。 哈哈哈

user: user-0
content: 引用 6 楼 自信男孩 的回复:i++和++i是有副作用的。对于这样的代码，不建议写，在同一个打印里，有多个++还是对于同一个变量的。 害~ 就是有这样的憨憨出题人出来玩人

user: user-0
content: 引用 5 楼 早打大打打核战争的回复:如果象java那样明确规定表达式求值顺序就好了，也就没有那么多孔乙己研究回字有几种写法~~~  哈哈 c语言内存分配就是烦人

user: user-1
content: 这种是出书的人瞎搞，故意给你来这一个题目问你答案，他自己也不知道答案，用当时随便找的编译器执行结果当标准答案，不知道具体细节误人子弟。

user: user-2
content: i++和++i是有副作用的。对于这样的代码，不建议写，在同一个打印里，有多个++还是对于同一个变量的。

user: user-3
content: 如果象java那样明确规定表达式求值顺序就好了，也就没有那么多孔乙己研究回字有几种写法~~~

user: user-4
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-5
content: 關鍵是++i運算與函數傳值的次序關係，因為智商的關係，一般來說我不會寫難以直觀理解的代碼，怕把自己搞糊塗。

user: user-6
content: 众所周知说错了 后面的内容都不用看 没有这个众所周知 那是错的 这里决定因素是求值顺序 和入栈顺序毫无关系 输出结果没意义 编译器有有多种不同理解

user: user-7
content: ++i返回值是递增后的i，i++返回值是临时变量（递增前的i的值） 所以f2相当于 printf(i, 最后一次递增前的i, i, i)
user-0 提问: 求助帖！

回复:
user: user-0
content: flag数组的值都不是很大，应该不会超过int.但我试了一下用longlong int也还是不行。 现在这个为什么还不对啊菜鸡求教#include <stdio.h> #include <stdlib.h> int main() {     int N,k,i,max=100000,flag[100001]={0};     scanf("%d%d",&N,&k);     int sum=0,count=0;     int *a = (int*)malloc(sizeof(int)*N);     int *s=(int*)malloc(sizeof(int)*N);     for(i=0;i<N;i++)        {            scanf("%d",&a[i]);            sum+=a[i];            s[i]=sum%k;            if(max<s[i]) max=s[i];        }     free(a);     for(i=0;i<N;i++) flag[s[i]]++;     free(s);     for(i=0;i<=max;i++)     {         if(i==0)  count+=flag[i]+flag[i]*(flag[i]-1)/2;         else count+=flag[i]*(flag[i]-1)/2;     }     printf("%d",count);     return 0; }

user: user-0
content: 问题描述 　　给定一个长度为N的数列，A1, A2, ... AN，如果其中一段连续的子序列Ai, Ai+1, ... Aj(i <= j)之和是K的倍数，我们就称这个区间[i, j]是K倍区间。   　　你能求出数列中总共有多少个K倍区间吗？ 输入格式 　　第一行包含两个整数N和K。(1 <= N, K <= 100000) 　　以下N行每行包含一个整数Ai。(1 <= Ai <= 100000) 输出格式 　　输出一个整数，代表K倍区间的数目。 样例输入 5 2 1 2 3 4 5 样例输出 6

user: user-1
content: 题目呢? 为了回答你的问题  难道还得去参赛?

user: user-2
content: 原题是什么？ 看你的代码，flag相乘（和阶乘有一拼），估计结果超出int范围了

user: user-3
content: a[100001],i,s[100001],max=100000,flag[100001]={0}; 栈上的空间没那么多，楼主这一下子定义了4个数组，并且每个数组都这么大，建议楼主用动态申请空间malloc/free。
user-0 提问: @C语言大神们，请分析下面程序运行流程，谢谢！

回复:
user: user-1
content: void sort(int arr[],int n) {     int i, j, k, t;     for(i=0;i<n-1;i++)     {         k = i;         for (j = i + 1; j < n; j++)             if (arr[j] < arr[k])                 k = j;         if (k != i) {             t = arr[k];             arr[k] = arr[i];             arr[i] = t;         }     } } 加上一个判断，提高一下效率，目的是减少无用的交换次数

user: user-2
content: 你是想分析整个main函数，还是想分析sort排序函数？ sort排序函数是选择排序，每次从 i 位置的后面选择最小的数a[k]，把它排在 i 位置。这样，就是最小的会排在0位置，第二小的会排在1位置，第三小的会排在2位置，依次类推，最终达到排序的目的。 main函数就是先打印排序前的数据，然后做排序处理，最后打印排序结果。
user-0 提问: C语言自己写的头文件运行不了

回复:
user: user-1
content: 引用 10 楼 肥牛肉^*^ 的回复:怎么修改，什么那些符号什么意思 就是修改你的makefile.win文件，把 INCS=XXX部分按上面说的，加个当前路径进入 这些符号相当于脚本的变量，$(CC)就是gcc.exe, $(CFLAGS)就是$(INCS)就是-Ixxx -Iyyy 这一串东西 连起来的编译命令 $(CC) -c main.c -o main.o $(CFLAGS) 就是 gcc.exe -c -c main.c -o main.o -Ixxx -Iyyy... 对于gcc命令来说，-I参数就是指定include的路径  具体你可以谷歌百度gcc的参数以及makefile文件  修改完makefile后，重新编译一下程序就好了（你之前怎么编译的就怎么编译）

user: user-2
content: INCS是你的Makefile中定義的，匯集到CFLAGS之後被gcc引用，也就是定義搜尋路徑。

user: user-3
content: makefile的第十行，十一行的内容贴全

user: user-0
content: 引用 9 楼 qybao的回复:[quote=引用 8 楼 肥牛肉^*^ 的回复：][quote=引用 4 楼 qybao的回复:]include的路径不全 你的makefile的 INCS 加上当前路径 . 试试 而且加了路径后呢[/quote]修改完makefile后重新编译试试[/quote] 怎么修改，什么那些符号什么意思

user: user-1
content: 引用 8 楼 肥牛肉^*^ 的回复：[quote=引用 4 楼 qybao的回复:]include的路径不全 你的makefile的 INCS 加上当前路径 . 试试 而且加了路径后呢[/quote]修改完makefile后重新编译试试

user: user-0
content: 引用 4 楼 qybao的回复:include的路径不全 你的makefile的 INCS 加上当前路径 . 试试 而且加了路径后呢

user: user-0
content: 引用 5 楼 qybao的回复:即 INCS = -I”./“ -I”C://xxx” 能具体点吗，怎样加

user: user-0
content: 引用 5 楼 qybao的回复:即 INCS = -I”./“ -I”C://xxx” 是在INCS=后面加吗

user: user-1
content: 即 INCS = -I”./“ -I”C://xxx”

user: user-1
content: include的路径不全 你的makefile的 INCS 加上当前路径 . 试试

user: user-0
content: 引用 2 楼 肥牛肉^*^的回复:#include"hell.h"这一行就报错 报错提示not such  file or directory

user: user-0
content: #include"hell.h"这一行就报错

user: user-0
content: 上面那一段代码#define那里是主函数，include什么的省略了
user-0 提问: C语言用写头文件错误

回复:
user: user-1
content: 引用 5 楼 肥牛肉^*^ 的回复：[quote=引用 2 楼 qybao的回复:]另外，头文件尽量不要有实现，声明一下就可以，实现部分尽量放在.c文件中 这样有什么影响吗[/quote]头文件定义函数的问题可以参考以下 https://blog.csdn.net/woxiaohahaa/article/details/78086109

user: user-0
content: 引用 2 楼 qybao的回复:另外，头文件尽量不要有实现，声明一下就可以，实现部分尽量放在.c文件中 这样有什么影响吗

user: user-2
content: 库文件的路径不对？

user: user-0
content: 好的。。。。。

user: user-1
content: 另外，头文件尽量不要有实现，声明一下就可以，实现部分尽量放在.c文件中

user: user-1
content: 你的main要include你的头文件  #include "SequencdList.h"
user-0 提问: 聪明的劳动力和苦逼的程序员

回复:
user: user-1
content: 代码没问题 不过可以不用每次把temp拷贝到result，可以用数组的方式，交替使用 int main() {     char a[2][6000]; //2行（当前行和前一行）     int n, i, j, k, m;     while (scanf("%d", &n)==1) { //输入n（输入非数字结束循环）         strcpy(a[0], "1"); //初始化第一行         for (i=1; i<n; i++) { //从第二行开始循环，随着i递增，i的奇偶性变化             for (j=1, k=0, m=1; a[(i-1)%2][j-1]!='\0'; j++) { //所以可以奇偶行交替使用                 if (a[(i-1)%2][j]==a[(i-1)%2][j-1]) { //当前数和前面位置的数相同                     m++; //则统计出现次数                 } else { //否则                     a[i%2][k++] = m+'0'; //记录次数                     a[i%2][k++] = a[(i-1)%2][j-1]; //记录数字                     m = 1; //统计次数初始化                 }             }             a[i%2][k] = '\0';         }         //打印结果         printf("\"%s\"\n", a[(n-1)%2]);     }          return 0; }

user: user-2
content: 如果n<30，并且没有多少数据，我觉得那么写没毛病。
user-0 提问: C语言结构体问题

回复:
user: user-1
content: C语言博大精深

user: user-0
content: 引用 1 楼 自信男孩的回复:结构体里的中括号是定义的数组。为什么要用数组，要看实际情况，比如name[20]；如果定义char name;那么一个字节装不下一个姓名呢，并且姓名是一个字符串，而不是一个字符。学号也是一样的。但是对于成绩，一般用int或float类型，定义一个变量就可以，不用数组。（当然想用数组定义多个成绩也是可以的）。 奥奥  谢谢

user: user-2
content: 结构体里的中括号是定义的数组。为什么要用数组，要看实际情况，比如name[20]；如果定义char name;那么一个字节装不下一个姓名呢，并且姓名是一个字符串，而不是一个字符。学号也是一样的。但是对于成绩，一般用int或float类型，定义一个变量就可以，不用数组。（当然想用数组定义多个成绩也是可以的）。
user-0 提问: 判断生肖年

回复:
user: user-1
content: 公元4年是鼠年，12年一轮回，所以(1900-4)%12=0，说明1900年也是鼠年。 年%12的余数是0到11，刚好是数组的索引。所以（年-1900）%12=0为鼠年，（年-1900）%12=1为牛年，依次类推。
user-0 提问: 数据结构时间复杂度计算

回复:
user: user-0
content: 引用 1 楼 user-1的回复:O(n^2) n+n-1+n-2+...+1=(n+1)*n/2 等差数列求和 所以是n平方 谢谢，懂了。。。。。

user: user-1
content: O(n^2) n+n-1+n-2+...+1=(n+1)*n/2 等差数列求和 所以是n平方
user-0 提问: 报错为：表达式必须是只想完整类型的指针

回复:
user: user-1
content: void input(struct sudent stu[]) 结构体名字错误，正确是 student

user: user-2
content: 拼写错误，函数参数里的 sudent   --->   student ......

user: user-3
content: 换一个结构体名字试试

user: user-0
content: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #define N 3 struct student { 	int num; 	char name[20]; 	double score[3]; }; int main(void) {  } void input(struct sudent stu[]) { 	int i; 	printf("请轮流输入每个学生的学号，姓名，三科成绩\n"); 	for (i = 0; i < N; i++) 	{ 		scanf("%d %s %lf %lf %lf", &stu[i].num, stu[i].name, &stu[i].score[0], &stu[i].score[1], &stu[i].score[2]); 	} }  这就是全部代码了，main函数还没写

user: user-4
content: 这样看没什么问题？能否把错误和所有的代码都贴出来呢

user: user-5
content: #pragma warning(disable:4996) #include <stdio.h>  struct student {     int num;     char name[20];     double score[3]; }; const int N=3; struct student stus[N];  void input(struct student stu[]) {     int i;     for (i=0;i<N;i++) {         printf("input %d (num name sc1 sc2 sc3):",i+1);         scanf("%d%s%lf%lf%lf",&stu[i].num,stu[i].name,&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);     } }  void print(struct student stu[]) {     int i;     for (i=0;i<N;i++) {         printf("%d ",i+1);         printf("%d %s %lg %lg %lg\n", stu[i].num,stu[i].name, stu[i].score[0], stu[i].score[1], stu[i].score[2]);     } }  int main() {     input(stus);     print(stus);     return 0; } // input 1 (num name sc1 sc2 sc3):11 a 81 82 83 // input 2 (num name sc1 sc2 sc3):22 b 91 92 93 // input 3 (num name sc1 sc2 sc3):33 c 71 72 73 // 1 11 a 81 82 83 // 2 22 b 91 92 93 // 3 33 c 71 72 73

user: user-0
content: struct student { 	int num; 	char name[20]; 	double score[3]; }; 结构体是这样定义的

user: user-4
content: 需要看一下你的结构体定义是什么样的～

user: user-6
content: 看一下你的结构体定义
user-0 提问: 令人绝望的顺序表，纠错纠了一天

回复:
user: user-0
content: 引用 1 楼 user-1的回复:编译错误是344行上面那个函数少了} 仔细检查就能发现 啊，我死了。大佬万岁

user: user-1
content: 编译错误是344行上面那个函数少了} 仔细检查就能发现
user-0 提问: 顺序表的初始化不知道错在哪

回复:
user: user-1
content: 改了之后有啥问题 你得告诉我啊  而且你也不贴完整代码  我也运行不了

user: user-0
content: 引用 1 楼 user-1的回复:首先你的scanf输入整数为啥不加& 我刚刚也发现了，但还是不对，大佬救我

user: user-1
content: 首先你的scanf输入整数为啥不加&
user-0 提问: CLion的IDE使用&符号报错的问题。。

回复:
user: user-1
content: &在形参定义里面叫做取别名，为同一个地址的变量的不同名字，更方便的操作变量，不用每次都*取元素，属于C++的特性，纯C是没有这个功能的

user: user-2
content: 楼主要说明的是vs2017比clion牛逼吧？？？

user: user-3
content: 楼主用的是C语言编译器吧，&引用是C++的语法，C的编译器不识别。 建议用用指针吧，和C++的引用有相同的作用，理解起来也差不多。

user: user-4
content: 你可以把&改为*试试

user: user-5
content: 参数 加 & 意思是引用，它是c++ 特有的 c 不能使用
user-0 提问: 求大佬帮我看一下这段代码

回复:
user: user-1
content: 说实话，这种算法属于技巧，不太适合初学者（没有一定的数学和逻辑运算基础就理解不了）。  首先，你要知道以下逻辑运算 a^b，即 a 异或 b，当a==b时，异或结果是 0，也就是一个数和自己本身(相同的数)做异或运算，结果是0。 a^0==a，即任意数和0做异或，结果是该数本身。 a^b^c==a^c^b==b^a^c==c^a^b==c^b^a，也就是异或本身满足交换律，即不管操作数字在前在后异或结果不变。   所以，先来理解 resOr 的结果是什么？以LZ的样例数据来说明 错误集合 ns = {1,2,2,4}，resUnLianxu是错误集合所有元素的异或 正确集合 as = {1,2,3,4}，resLianxu是正确集合所有元素的异或 resOr = resUnLianxu ^ resLianxu; 就是 错误集合所有元素的异或结果 和 正确集合所有元素的异或结果 再做异或 相当于 nums 集合 加 arrs 集合的并集的所有元素的做异或运算，即 1^2^2^4^1^2^3^4 上面说了，异或的交换律(重新调整一下异或的元素)，以及相同数的异或结果是0，任意数和0做异或结果是任意数本身，可知， resUnLianxu ^ resLianxu = 1^1(相同数)^2^2(相同数)^2^3(不同数)^4^4(相同数) = 0^0^2^3^0=2^3 所以 resOr 实际上就是错误集合和正确集合的差异元素的异或结果   接下来，我们把两个集合（错误集合和正确集合）的元素分组，如果我们刚好能把这两个有差异的元素分在不同的两个组， 按照上面相同的方式，我们再把分好组的元素再来做异或，就可以求出差异的元素，比如 错误集合分组 ns1 = {1}, ns2 = {2,2,4} //差异数2分在第二组 正确集合分组 as1 = {1,3}, as2 = {2,4} //差异数3分在第一组 那么上面我们知道，如果ns1和as1合起来取异或，就能得到差异元素3(1^1^3=0^3=3)， ns2和as2合起来取异或，就能得到差异元素2(2^2^4^2^4=2^2^4^4^2=0^0^2=2)  那么怎么能正确分成这样的组呢？很自然我们首先会想到奇偶性，奇数分一组，偶数分一组。 但是如果差异的两个数奇偶性相同，也就是两个数同为奇数或同为偶数（比如差异元素是3和5，或者2和6），还是不能正确分组，所以奇偶性行不通。 那么好了，我们再来看，首先我们知道任意相同的数a，和某个数b做运算，结果肯定相同，即 a？b，只要a相同，a？b的结果肯定相同。 所以两个集合相同的元素我们不用考虑，我们只需要关心差异的两个数，让它们和某个数经过某个操作后结果不同即可正确分组， 也就是，让差异数1和某个数操作后变为0，差异数2和某个数操作变为非0即可。 这时我们又想到了 resOr（因为resOr刚好是两个差异数异或的结果）。 那么怎么通过resOr来区分两个差异的数呢？这就是 resOr & (-resOr)。 从异或的概念可知a^b的结果为a和b的二进制位不相同的部分，把这二进制位不相同的部分抽出来，取反+1（二进制补码，也就是取负数）， 再和原来的抽出来的部分做与(&)运算，就会保留1位二进制位和a或b相同的数（因为是取反+1，取反部分&结果为0，+1部分被保留，具体可以自己手动用二进制推导）。 这样，如果该数的保留的二进制位和a相同，那它必然和b不同（因为异或就是取a和b不同的部分），这样与b做与(&)运算结果必为0。 反之，如果该数的保留的二进制位和b相同，那它必然和a不同，这样与a做与(&)运算结果必为0。 至此，我们就可把有差异的两个数正确分组了。能正确分组后，剩下的就是按上面分析的逻辑处理即可。 for循环的if ((nums[i]&lastbit)==0) 就是分组的意思。错误集合分成 if else 两个组，正确集合也分成 if else 两个组， 分成的这两个组刚好把有差异的两个数分在了不同的组，这样，通过上面分析的异或运算，即可找出有差异的两个数。
user-0 提问: 二维数组和双重指针问题 来自LeetCode 832 翻转图像

回复:
user: user-0
content: 内存非法访问

user: user-0
content: 原来自己连参数含义都没搞清楚就开始码字，下面的程序可以通过 /**  * Return an array of arrays of size *returnSize.  * The sizes of the arrays are returned as *returnColumnSizes array.  * Note: Both returned array and *columnSizes array must be malloced, assume caller calls free().  */ int** flipAndInvertImage(int** A, int ASize, int* AColSize, int* returnSize, int** returnColumnSizes){      //1 <= A.length = A[0].length <= 20 矩阵为方阵，行与列相等          int **retArray;     int i,j;      retArray = (int**)malloc(ASize*sizeof(int*));     for(i=0;i<ASize;i++)     {         //*retArray = (int *)malloc(ASize*sizeof(int));         retArray[i] = (int *)malloc(ASize*sizeof(int));         (*returnColumnSizes)[i]=ASize;          for(j=0;j<*AColSize;j++)         {             retArray[i][j] = A[i][ASize-1-j] == 0?1:0;         }     }      *AColSize = ASize;     *returnSize = ASize;     return retArray;  }
user-0 提问: c语言 结构体变量的引用

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

user: user-0
content: 引用 2 楼 qybao的回复:把std变量改个名字，系统自带一个名叫std的命名空间，和你的std变量重名了 谢谢

user: user-0
content: 引用 3 楼 whut_lcy的回复:2楼正解，std是c++标准库的命名空间，解决办法:  要么把std改为别的名字，要么把源码后缀的cpp改为.c 谢谢你了！

user: user-1
content: 2楼正解，std是c++标准库的命名空间，解决办法:  要么把std改为别的名字，要么把源码后缀的cpp改为.c

user: user-2
content: 把std变量改个名字，系统自带一个名叫std的命名空间，和你的std变量重名了

user: user-3
content: 首先，结构体对象在定义变量时如果不初始化，后面只能一个一个的赋值，你上面直接定义了std为变量，那么赋值操作只能是例如：std.name[0]  = 'a'这样，和数组是一个道理。 如果你想赋值简单点，就student std = {“123”，‘a'，{1，2，3}...}；这样就可以了
user-0 提问: 大佬们 帮忙看看栈和队列的类型定义问题

回复:
user: user-1
content: 栈是先进后出，只需要一个栈顶，都是从栈顶压栈和出栈；队列是先进先出，头部读出，尾部写入

user: user-2
content: 楼主看一下Linkqueue这个是结构体类型还是结构体指针类型。typedef的时候Linkqueue前面没有*. 所以Linkqueue q;定义的是结构体变量，因此用.不用->
user-0 提问: 尾插法建立单链表相关问题

回复:
user: user-1
content: NULL一般用于初始化结构体的指针部分。也用于链表尾部的结尾标识。

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

user: user-3
content: 红色②  当head为NULL时将p的地址赋给了head  即当head中没有容纳节点时 将新节点p放入head中   如果head已经容纳了节点  那么将p放入r中  r是链表的尾节点   在判断语句结束后  p节点放入r中  r和head在首次插入新节点是通过p链接

user: user-4
content: NULL就是0，一个无效值。
user-0 提问:  matlab c++ 混编动态链接库(DLL)初始化例程失败

回复:
user: user-1
content: 请问问题解决了吗

user: user-2
content: 请问问题解决了吗

user: user-3
content: C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-4
content: 请问你解决了吗，我也是这个问题

user: user-5
content: 请问你们解决了吗？我也是这个问题

user: user-6
content: 我之前用的matlab2019b没有问题 换成2020之后就有这个问题了
user-0 提问: 为什么第二个是对的，这个符号 & 有什么用

回复:
user: user-1
content: &是取地址符号。 建议看一下值传递和引用传递的区别。

user: user-2
content: swapByRef(int &x,int &y) { int temp =x; x = y; y = temp; }  功能等价：  swapByRef(int *x,int *y) { int temp = *x; *x = *y; *y = temp; }

user: user-3
content: 那是C++的基本语法，引用。本质上与指针是一样的，因此可以修改参数。  在c++ 里，扩展了&的含义，除了保留了取地址之外，还有就是引用。

user: user-4
content: &是引用 第二种是引用传递，函数内的变量就相当于函数外的变量（函数栈不同，但地址相同），所以函数内的改变，就等于函数外的改变 第一种是值传递，函数内的变量和函数外的变量毫无关系（函数栈不同，地址也不同），所以函数内的改变影响不了函数外的变量。
user-0 提问: 将二进制转换成十进制时数字长了就会出错不知道为什么

回复:
user: user-1
content: 用字符串的格式接收输入，或者用long long接收，因为16位长度超过了int范围 即  long long x; scanf(“%ld”, &x); 或者 char x[17]; scanf(“%s”, x);  另外，计算s的时候，a要倒过来遍历，因为x%10每次取x的最后一位存入a[i]，所以要改成for(i=n-1; i>=0; i--) s+=a[i]*pow(2, i)
user-0 提问: 函数声明和链接的问题

回复:
user: user-1
content: https://blog.csdn.net/qq_36965134/article/details/82190801

user: user-0
content: 引用 1 楼 user-2的回复:系统也提供了一个getline函数，同名冲突了，不知道要链接哪一个？你放在main里，自然就是取同一文件下的函数。 换了名字还是不行

user: user-0
content: 是我声明的问题吗？

user: user-0
content: 换了名字还是不行，链接缺失 undefined reference to `getLINE_N' collect2.exe: error: ld returned 1 exit status

user: user-2
content: 系统也提供了一个getline函数，同名冲突了，不知道要链接哪一个？你放在main里，自然就是取同一文件下的函数。
user-0 提问: 同一个变量单独用printf输出和几个变量一起用printf输出结果不一样

回复:
user: user-0
content: 引用 1 楼 user-2的回复:我觉得这跟你的 j 是 float 类型，但却用 %d 来打印有关。 print的参数是可变的，函数内部会通过打印格式来查找参数。单独打印 print(“%d\n, j); 时，只有1个参数 j，即使类型不匹配，也不会影响参数的查找（只是截取参数的长度不同）；而合在一起打印，print查找参数时，因为 %d 和 j 的类型不符，截取参数的长度不对，影响了下一个参数的查找。 打个比方，j 的内存信息为 01010111 按%d截取为 0101 后面还剩 0111 继续截取%c的k参数时，直接就把剩余的0111取了，所以k是错的 再继续取%c的m参数时，才真正取得了k的信息，所以m打印出了k的信息为a 再次求助大神，还是上例，删除最后一行printf，且直接赋值m=0，输出却是m=a 是怎么回事？赋值1、2、3等都能和ascii表对上，偏偏0不对

user: user-0
content: 引用 1 楼 user-2的回复:我觉得这跟你的 j 是 float 类型，但却用 %d 来打印有关。 print的参数是可变的，函数内部会通过打印格式来查找参数。单独打印 print(“%d\n, j); 时，只有1个参数 j，即使类型不匹配，也不会影响参数的查找（只是截取参数的长度不同）；而合在一起打印，print查找参数时，因为 %d 和 j 的类型不符，截取参数的长度不对，影响了下一个参数的查找。 打个比方，j 的内存信息为 01010111 按%d截取为 0101 后面还剩 0111 继续截取%c的k参数时，直接就把剩余的0111取了，所以k是错的 再继续取%c的m参数时，才真正取得了k的信息，所以m打印出了k的信息为a 谢谢解答 原来printf并没有那么简单啊

user: user-1
content: 数据类型问题 	printf("i=%f\n",i); 	printf("j=%d\n",(int)j); 	printf("k=%c\n",(char)k); 	printf("m=%c\n",m); 	printf("i=%f  j=%d  k=%c  m=%c\n",i,(int)j,(char)k,m);

user: user-2
content: 我觉得这跟你的 j 是 float 类型，但却用 %d 来打印有关。 print的参数是可变的，函数内部会通过打印格式来查找参数。单独打印 print(“%d\n, j); 时，只有1个参数 j，即使类型不匹配，也不会影响参数的查找（只是截取参数的长度不同）；而合在一起打印，print查找参数时，因为 %d 和 j 的类型不符，截取参数的长度不对，影响了下一个参数的查找。 打个比方，j 的内存信息为 01010111 按%d截取为 0101 后面还剩 0111 继续截取%c的k参数时，直接就把剩余的0111取了，所以k是错的 再继续取%c的m参数时，才真正取得了k的信息，所以m打印出了k的信息为a
user-0 提问: 求大佬帮我指出错误的地方

回复:
user: user-1
content: 顺便说一下，对于任何语言的程序，出问题了必须要学会自己调查，编译器的debug模式要会用，如果不会的话，程序中加一些printf语句总没有问题吧 比如就这个问题，很明显死循环了，你在while语句中加一个prinf输出，比如我刚才输出的，你可以很清楚的看到为什么4会停止，19会停止，而2会陷入死循了。遇到问题多思考，尽量自己解决，不要一有问题就直接问别人。思考的过程也很重要

user: user-1
content: 你while停止的的依据是             if (cnt==1) return break;            如果是1，是快乐数停止             if (temp==cnt) return false;       如果数重新计算成了自己，接下来会是无限循环了，所以不是快乐数，停止。 但是这儿就有一个问题了。你可以加输出语句看一下 对于数字4， n=0 a=4 cnt=16 temp=4 n=1 a=6 cnt=36 temp=4 n=0 a=1 cnt=37 temp=4 n=3 a=7 cnt=49 temp=4 n=0 a=3 cnt=58 temp=4 n=5 a=8 cnt=64 temp=4 n=0 a=5 cnt=89 temp=4 n=8 a=9 cnt=81 temp=4 n=0 a=8 cnt=145 temp=4 n=14 a=5 cnt=25 temp=4 n=1 a=4 cnt=41 temp=4 n=0 a=1 cnt=42 temp=4 n=4 a=2 cnt=4 temp=4 n=0 a=4 cnt=20 temp=4 n=2 a=0 cnt=0 temp=4 n=0 a=2 cnt=4 temp=4    //此时cnt==4了，所以停止了。 但是对于数字2，你可以看到第一步之后，cnt==4了， 之后的处理和4一模一样，但是之前4中停止的判断条件cnt == tmp不会成立，因为4!=2。之后就无限循环了。  你可以这样改一下。 #define MAXSIZE 4096 int isHappy(int n) {    int temp = n;    int cnt = 0;    int tmpV[MAXSIZE] = {0};  //创建一个用来保存每一次运算结果的数组    while (1)    {       int a = n % 10;       cnt = cnt + a * a;       n = n / 10;       printf("n=%d a=%d cnt=%d temp=%d\n", n, a, cnt, temp);       if (n == 0)       {          if (cnt == 1)             return 1;          if (temp == cnt)             return 0;          if (tmpV[cnt] == cnt)          //如果这次的计算是已经重复过的，也就是说此时是以前的某次的循环处理了，这次的n肯定不会是快乐数，停止计算。          {             printf("there is a endless loop\n");             return 0;          }          tmpV[cnt] = cnt;        //此时保存的每次的最终结果了。          n = cnt;          cnt = 0;       }    }    return 0; }

user: user-2
content: 你的if(temp==cnt)有问题。不是快乐数，它最终未必会变回自己，也可能是变到了中途的某个数后，某个数就一直死循环。所以你应该把中途的数保存下来，一旦再得到一个数在中途出现过，那就会死循环，则判断为非快乐数 所以代码改成用一个数组或（链表，集合）之类的保存中途结果，每次判断cnt在中途结果是否出现过 bool isHappy(int n) {     int temp[1024];     int cnt = 0, len = 0, i;     temp[len++]=n;     while (1) {         int a = n%10;         n /= 10;         cnt += a*a;         if (n==0) {             if (cnt==1) break;             for (i=0; i<len; i++) {//中途是否出现过                 if (temp[i]==cnt) return false;             }             temp[len++]=cnt; //保存中途结果             n = cnt;             cnt = 0;         }     }      return true; }
user-0 提问: 哈希表，哈希集合和哈希映射有什么区别吗？

回复:
user: user-0
content: 大佬解释地太清楚了

user: user-1
content: 哈希表（hashtable），又叫散列表，是根据关键码（key）来进行访问的数据结构，通过哈希函数把key转成哈希值来定位数据存储的位置。通常是键-值对（即key-value）的结构，即用key算出的哈希值来定位存储位置，在该位置上存储内容为value。  哈希集合（hashset），也是一种通过哈希值来定位存储位置的数据结构，只是它不是键-值对结构，而是储存key本身，相当于只有哈希表（hashtable）的key部分，即用key算出的哈希值来定位存储位置，在该位置上存储内容为key本身。 简单来说就是，哈希集合是不能存储重复元素的数据结构（集合），而哈希表是存储键-值对（key-value），其中键key不能重复。  哈希映射（hashmap）是和哈希表（hashtable）相似的数据结构，也是键-值对存储，只是哈希映射是线程安全的，而哈希表是非线程安全的。所谓线程安全，就是多线程同时操作数据的时候，能确保在同一时刻只能有一个线程能访问同一个数据（也就是会给数据操作加锁）；如果不能确保这个，就是非线程安全。
user-0 提问: C语言中关于结构体函数的声明定义和返回值

回复:
user: user-1
content: typedef 定义的结构体 在声明时不用加struct把 candidate inset(int a);

user: user-2
content: 5个问题： 1，数组名不能做左值，楼主用a去接收函数的返回值； 2. 返回局部变量结果是未定义的，结果不确定正确性；可以考虑加上static，这样在main函数里用结构体指针接收，也是可行的。 3. inset函数的返回值是结构体类型，而返回的是结构体数组，类型不匹配。 4. string类型的数据用%c输出，类型不对，应该用%s； 5. a是局部变量，在inset函数对其是不可见的；

user: user-3
content: insert函数的返回值也是一样的，看你的样子是要返回一个数组，所以返回值应该是用指针

user: user-3
content: 你的c是想声明为数组还是什么？c[a]这样声明是数组（动态数组也有问题），所以不能使用c=这样的方式赋值，要c[0]=这样的用数组元素的方式
user-0 提问: 【求助】大数二进制加法 数据类型改成long long 后无法出结果

回复:
user: user-0
content: 啊糟糕！刚刚手滑结帖结错了www不好意思

user: user-0
content: 谢谢啦 我最后还是全部推翻用字符串的方法重写了 这个帖子本来是想问一下为什么原本运行正常的程序 在更改了int为long long int 后出不了结果www

user: user-1
content: 可以理解为大数据相加，只不过这个大数据可以理解为都是01组成的。 #include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_NUM_LEN 2048  int cal_factorial(unsigned char *num_list, int num_size, int n);  int cal_val(unsigned char *num_list, int num_size, int base, int num) {     int i = 0, j;     int len = 1, tmp, carry_bit;      num_list[1] = 1;      while (i < num) {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * base + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size-1 < len) {/* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }         i++;     }      return len; }   int main(void) {     unsigned char num_list[MAX_NUM_LEN];     int num_len, i;     int base, power;      memset(num_list, 0, sizeof(num_list));     printf("Please input two numbers: ");     scanf("%d%d", &base, &power);      if (base < 0 && power % 2)         num_list[0] = 1; /* negative number */     else         num_list[0] = 0;     base = abs(base);      num_len = cal_val(num_list, MAX_NUM_LEN, base, power);     printf("len = %d\n", num_len);     if (num_list[0])         putchar('-');     for (i = num_len; i >= 1; i--)         printf("%d", num_list[i]);     printf("\n");     return 0; }   int cal_factorial(unsigned char *num_list, int num_size, int n) {     int carry_bit, i, j, len = 1;     int tmp;      num_list[1] = 1;     for (i = 2; i <= n; i++)     {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * i + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size -1 < len) { /* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }      }      /*     for (i = len; i >= 1; i--)//逆序输出数组就是结果         printf("%d", a[i]);     printf("\n");     */     return len; } 供参考～

user: user-0
content: 小声（或许有大佬愿意帮我看看嘛.....又改了一些小地方但还是出不来结果（似乎也没有bug?(只是似乎.jpg
user-0 提问: 请问如何将随机产生一个n位的二进制数转换为十六进制数?

回复:
user: user-1
content: 十六进制就是二进制的简写形式，所以不需要转换，如果要输出十六进制，可以printf用%x格式化

user: user-2
content: 二进制转16进制，按4位4位的计算即可 for example int main(void) {     int n, m, i, j, *a;     srand(time(NULL));     n = rand()%20 + 1; //这里控制随机生成的二进制不超过20位，根据需求自己修改吧     m = (n%4==0 ? n : n + (4-n%4)); //按4位4位补齐，不满4的倍数的在前面补0     a = (int*)malloc(sizeof(int)*m);     printf("随机生成%d位二进制数: ", n);     for (i=0; i<m-n; i++) {         a[i] = 0;     }     for (; i<m; i++) {         a[i] = rand()%2;         printf("%d", a[i]);     }     printf("\n");          printf("转十六进制结果: ");     for(i=0; i<m; i+=4) {         n = 0;         for (j=i; j<i+4; j++) {             n = n*2 + a[j];         }         printf("%c", n>9? 'a'+(n-10) : '0'+n);     }     printf("\n");          free(a);     return 0; }
user-0 提问: 一段C语言代码没看懂语法，基本的大学都学过，有一些嗯不常用或者高级点儿的求大佬帮我解释一下

回复:
user: user-0
content: t = time(NULL); Local = localtime(&t); year = Local->tm_year + 1900; month = Local->tm_mon + 1; day = Local-> tm_mday; 这里的time()和localtime()不是自定义函数，是C语言库函数？

user: user-1
content: printf("%d年%d月%d日\t",year,month,day);     if (year < 1901) {         fprintf(stderr, "Year is invalid!\n");         return -1;     } 建议在printf后面加上这个判断，否则会出现数组越界访问，程序出现异常，比如段错误～

user: user-1
content: t = time(NULL); Local = localtime(&t); year = Local->tm_year + 1900; month = Local->tm_mon + 1; day = Local-> tm_mday; 这部分是获取当前的年月日，即执行程序的时（或者系统的）当前的年月日；  上面的执行移位和&之类的，建议熟悉上面的那个数组，年和农历之间的关系就可以理解了～
user-0 提问: 小白鼠试毒酒问题求助  编译正确但是空白输出

回复:
user: user-0
content: 再次小声)所以那个scanf无效的引用是按照加if(scanf的方法就好了

user: user-0
content: 引用 1 楼 真相重于对错的回复:for(i=1;i<=t;i++)//上边的循环结束后t是-1，因此次循环不执行。    {printf("%lld\n",mice[i]);} 啊！谢谢谢谢！劳烦你啦！

user: user-1
content: for(i=1;i<=t;i++)//上边的循环结束后t是-1，因此次循环不执行。    {printf("%lld\n",mice[i]);}
user-0 提问: 为什么数组和数组指针写入文件得到的结果不同？

回复:
user: user-1
content: write(fd,buf2,sizeof(buf2)); 两个write写入的第三个参数长度不一样呢，第一个write写入的是strlen("Hello World!\n")+1个字符。 而第二个write写入的长度是sizeof(char *)个字符。

user: user-2
content: sizeof(buf)返回的是这个数组的长度  sizeof(buf2) 返回的是指针的长度，所以写入文件不对

user: user-3
content: 对 char* 取sizeof会返回一个指针变量占用的字节数  而不是这个指针指向的字符数组实际占了多少字节

user: user-4
content: sizeof(数组)得到的是一片连续的数组内存空间大小 sizeof(指针)得到的是指针的大小，这个大小是固定的（就是能存储一个有效内存地址的最大长度）。32位系统就是4个字节大小，64位系统就是8个字节大小。 这个是数组和指针的一个重要区别
user-0 提问: 有关c语言指针的问题

回复:
user: user-0
content: 感谢两位的回答，我搞明白了。万分感谢

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

user: user-0
content: 感谢感谢，说的很清楚了。

user: user-2
content: 指针就是地址的说法源自于指针变量保存的是一个地址，所以某种意义上指针就和地址划上等号了。 然而指针是有类型区别的，这个类型直接导致指针+1会移动不同的内存空间。而地址是没有类型之分的，就是一个无符号整形。所以，从这个角度来说，指针不等于地址。 其实没必要太在意这些说法，关键是自己理解就好。
user-0 提问: 卑微小白来取经了，写的模式匹配运行错误，希望大佬给予指正

回复:
user: user-1
content: 而且～～～if语句里j==-1;一定是真！后面的哪个判断没有实在意义，无论真假都是真！

user: user-1
content: void   get_next  (  char  form[],   int   next[]   ) {            int   i=0,    j=  -1;            next[0]  =  -1;                         ...              if  (  j==  -1   ||    form[i]  ==  form[j]  )                          ... 我有点不明白！！从C语言来理解的话～～～这里j=-1;那么怎么确定form[j]在访问时的正确性？form[-1]这个位置？？？

user: user-0
content: #include<stdio.h> #include<string.h> #define MAXSIZE 50 void get_next(char form[],int next[]){ 	int i = 0,j = -1; 	next[0] = -1; 	while(form[i] != '\0'){ 		if(j == -1 || form[i] == form[j]){ 			i++; 			j++; 			next[i] = j; 		} 		else j = next[j]; 	} }  int kmp(char form[],char main[],int next[]){ 	int i = 0,j = 0; 	while(form[j] != '\0' && main[i] != '\0'){ 	 		if(j == -1 || main[i] == form[j]){ 			i++; 			j++; 		} 		else j = next[j]; 	} 	 	if(form[j] == '\0'){ 		return i - j; 	} 	else return -1; } int main(){ 	char main[MAXSIZE]; 	char form[MAXSIZE];  	printf("输入主串\n"); 	gets(main); 	printf("输入模式串\n"); 	gets(form); 	int length = strlen(form); 	int next[length]; 	get_next(form,next); 	int x = kmp(form,main,next); 	if(x != -1){ 		printf("匹配成功\n匹配位置为%d",x); 	} 	else printf("匹配不成功\n"); } 这是我新粘贴的

user: user-0
content: 引用 1 楼 自信男孩的回复:void get_next(char form[],int next[]){     int i = 0,j = -1;     next[0] = -1;     while(form[i] != '\0'){         if(j == -1 || form[i] == form[j] )             i++;         j++;         next[i] = j;     }     else j = next[j]; } } 代码有语法错误，编译不会通过，所以运行更不可能。 else和那个if匹配，并且还多一个右大括号.先解决了编译错误再考虑运行的问题吧～ 谢谢指正，这可能是我复制粘贴时候不小心删了一个括号，原来的代码是有括号的，能够编译通过

user: user-2
content: void get_next(char form[],int next[]){     int i = 0,j = -1;     next[0] = -1;     while(form[i] != '\0'){         if(j == -1 || form[i] == form[j] )             i++;         j++;         next[i] = j;     }     else j = next[j]; } } 代码有语法错误，编译不会通过，所以运行更不可能。 else和那个if匹配，并且还多一个右大括号.先解决了编译错误再考虑运行的问题吧～
user-0 提问: 怎么声明一个指针，指向一个指针数组？

回复:
user: user-1
content: int array[10]; int *p = array;    //ｐ就是指向数组array的指针 char src[2][16];  int (*psrc)[16] = src;    //psrc就是指向二维数组src的指针;  char *str[16]; char **pstr = str;　　　//pstr就是指向指针数组str的指针

user: user-2
content: char *p; char *pa[2];
user-0 提问: C语言数据分组程序运行出错

回复:
user: user-0
content: 改完出不来结果了

user: user-0
content: 谢谢指出问题，报错的问题我也找到了，我countp[]定义成了double类型，改成int类型就好了

user: user-1
content: if(unum+i*(deta/a)<x<=unum+(i+1)*(deta/a)) 改成 if(unum+i*(deta/a)<x&&x<=unum+(i+1)*(deta/a)) 逻辑判断不能连起来写，要用&&或者||之类的做运算
user-0 提问: 为什么把scanf注释掉就可以用，不注释就运行不了

回复:
user: user-1
content: scanf("%d", &n); 因为少一个&

user: user-2
content: 应该是 scanf("%d",&n)   注意 &n

user: user-0
content: 求救 IT小白万分感谢
user-0 提问: c语言文件。。求助

回复:
user: user-1
content: 引用 4 楼 weixin_45780942 的回复:[quote=引用 1 楼 focuslight的回复:]11是一行最大字符数吧（包括最后的空字符） 你可以把11改成6，看看能不能输出完整数字图 改成6，输出的数字就不完整了[/quote] 如果fgets的第二个参数是6，那么在s中读取到的是5个有效字符，需要考虑到'\0'也要占一个字符位置； 不清楚是否是2个字符占一个位置，所以加上'\0'是11.建议用7,9这样的长度去读取，看看是否完整～

user: user-0
content: 引用 1 楼 focuslight的回复:11是一行最大字符数吧（包括最后的空字符） 你可以把11改成6，看看能不能输出完整数字图 改成6，输出的数字就不完整了

user: user-0
content: 。。。。。。

user: user-0
content: 大佬们，求助

user: user-2
content: 11是一行最大字符数吧（包括最后的空字符） 你可以把11改成6，看看能不能输出完整数字图
user-0 提问: 关于哈希表的查找函数，求大佬解惑

回复:
user: user-1
content: 刚开始不够自信可以理解。所以要学会有怀疑的时候用测试结果来证明自己的推测。就好像本题，你怀疑obj->elem[addr]==-1，你可以用你的样例数据来测试结果对不对，如果不对，怀疑正确；再用你的推测，把obj->elem[addr]==-1去掉再测试，如果结果正确，则说明自己的推断是正确的。

user: user-0
content: 引用 1 楼 user-1 的回复：有没有问题，你自己测试一下就知道了。按照现在的代码逻辑，的确存在你说的问题。 从理论上来说，真正的哈希数据结构要更复杂，通常是红黑树+数组。你这里，只能说是理解一下通过哈希值来定位数组位置的简单例子，所以哈希冲突时的考虑是不够充分的。谢谢，我接触数据结构不久，不太自信...还需要大佬们帮我确认一下

user: user-1
content: 有没有问题，你自己测试一下就知道了。按照现在的代码逻辑，的确存在你说的问题。 从理论上来说，真正的哈希数据结构要更复杂，通常是红黑树+数组。你这里，只能说是理解一下通过哈希值来定位数组位置的简单例子，所以哈希冲突时的考虑是不够充分的。
user-0 提问: 今天在学哈希表时发现一个疑惑

回复:
user: user-1
content: 引用 3 楼 weixin_45906870 的回复：我的意思是1，2，3，4，5是代指一段连续的数据，并不是它们的值是1，2，3，4，5，它们的值可以是2，9，16，23，30，而如果模是7，那么9，16，23，30不就会连续发生哈希冲突了吗？大概理解你说的意思了。如果这是这样，你的怀疑是对的。你可以自己测试一下代码来证实自己的怀疑。

user: user-0
content: 我的意思是1，2，3，4，5是代指一段连续的数据，并不是它们的值是1，2，3，4，5，它们的值可以是2，9，16，23，30，而如果模是7，那么9，16，23，30不就会连续发生哈希冲突了吗？

user: user-1
content: 为什么是10001？一是为了key%HASHSIZE的余数最大达到10000，二是数组下标从[1, 10000]不会越界，否则key%HASHSIZE=10000时，obj->elem[10000]就会数组越界  疑惑点？首先1，2，3，4，5都没有因为哈希冲突而线性探测，因为它们%HASHSIZE的结果都不同，Add函数的while(obj->elem[addr]!=-1)不会成立，所以不会进入while循环。同理，Remove函数的while(obj->elem[addr]!=key)也不成立，不会进入while循环，而是直接把obj->elem[addr]设成-1，所以彼此之间不存在冲突。

user: user-0
content: 没人知道吗

user: user-2
content: 因为C/c++数组计数是从0开始的，如果是10000的话，那么 存储的是10000，1，2，3，。。。。。。9999 移除2，只是第二个元素变成-1，3，4，5 它们的hash值又不和2一样，当然不会受到影响。
user-0 提问: 下面一段宏定义 求解释

回复:
user: user-1
content: #与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         return 0; } 宏展开时： 如果宏定义以#开头，不展开参数，直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"； 如果宏定义不以#开头，展开参数，直接替换，由外层向里层，如果碰到的是#开头的宏，不继续往里层展开，往外层展开。 由外层向里层，如果碰到的是以非#开头的宏，继续往里层走，直至最里层，开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS： ##在宏中定义，是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现，是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         char a = 'a';         cout<<g(a)<<endl; // a         cout<<g(g(a))<<endl; // a         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         printf("%s\n", g(h(f(1,2)))); // h(f(1,2))         printf("%s\n", h(g(f(1,2)))); // "f(1,2)"         printf("%s\n", h(h(f(1,2)))); // "12"         system("pause");         return 0; } 预处理后的：（在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E） int main() {         char a = 'a';         cout<<"a"<<endl;         cout<<"g(a)"<<endl;         printf("%s\n", "12");         printf("%s\n", "f(1,2)");         printf("%s\n", "h(f(1,2))");         printf("%s\n", "\"f(1,2)\"");         printf("%s\n", "\"12\"");         system("pause");         return 0; } --------------------------------------------------- 宏解析 1.       ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号，它不能出现于宏替代表的开端和末尾。 例： #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2.       重新扫描和替换 在替换列表中的所有参数替换过之后，预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时，就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换（防止递归）。 例： #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC

user: user-2
content: 谢邀。  这段代码不复杂，宏定义你也不陌生吧。重点在于__attribute__、#和##  #和##也不难，这是C语言的预处理器记号，你也应该知道。  因此，你的问题主要是__attribute__。这个记号并不是C语言的记号，而是GCC自行扩展的记号。翻一下GCC的手册：https://gcc.gnu.org/onlinedocs/10.2.0/ 或者上网搜索一下，这里就不再罗索了。
user-0 提问: 为什么不同C文件中的全局变量一定要extern才能可见，而函数却可以在不同c文件直接使用？

回复:
user: user-1
content: 有同样的困惑，楼主有答案了吗

user: user-2
content: 我觉得可以这么理解，就是程序在执行时，遇到的变量或者函数，必须在使用之前是做过声明的，就是知道类型 ，这样程序在执行时才知道如何分配内存，c语言的编译应该是主函数所在的文件，所以你要保证主函数文件执行过程中除了main函数外，其他所有的函数及变量 必须都在执行前有一个声明，而include 语句 或者define 语句 会定义或包含后面用的变量和函数。

user: user-3
content: 我也在学习的过程中有这个疑问，不使用static修饰的函数全局都可以调用吧，所以在b.c中调用a.c的fun1() 应该可以直接使用，在b.c中加入 extern fun1(),或者#include “a.h”-a.h中有extern fun1() 的声明，是为了方便代码阅读而形成的习惯吗，让代码阅读，维护起来更方便？

user: user-4
content: 《程序员的自我修养——链接、装载与库》

user: user-5
content: 另外函数的声明默认就是extern的，函数的声明加不加extern无所谓

user: user-5
content: 引用 楼主 CPLlearner 的回复:初学者，学到extern有点混乱。 1. 全局变量不是全局可见吗，为什么还需要extern关键字？但函数却可以不需要？ 2. 一个项目中的 .c 文件之间是什么关系？（有时候感觉像仅仅把一个长文件分隔成多个短文件） 1. 首先在标准C中是没有全局变量这个概念的，准确的说是外部变量；     如果你的整个程序中只有一个外部变量定义且没有初始化(所谓定义就是分配内存空间)，     其他的都使用extern，那其他的都是声明，编译器不分配内存空间，这样就相安无事     如果你的整个程序中只有一个外部变量定义且有初始化，则其他的即使没使用extern，     那其他的也都是声明(准确的说是试探性定义)，也不分配内存空间，这样也相安无事     如果你的整个程序中有一个外部变量定义且没有初始化，其他单元也有同名外部变量定义(没使用extern)     则会产生重复定义的错误 2. 一个项目中的 .c 文件都是一个模块，将项目分解为逻辑上独立的模块容易多人团队开发，项目中的各个模块相互协作完成任务。

user: user-6
content: 1、函数是不能在各个.c文件中调用的，也需要extern声明（或者直接写函数签名，默认extern） 2、为什么需要extern？因为模块化编程需要，模块化编程导致一个工程会有若干.c文件，各个c文件都可能依赖其他c文件的变量和函数，编译器编译生成代码时经过【预处理】-【汇编】-【编译】-【链接】完成，它没有那么聪明能知道A.c调用的变量和函数是从哪里来的，需要程序员显式声明exten，这个时候前3步都能在单个.c文件中完成，到最后的链接阶段就开始查找各个调用变量和函数

user: user-4
content: 《程序员的自我修养——链接、装载与库》

user: user-7
content: 具有文件作用域的标识符（即，你所说的全局变量）不需要使用存储类指定符extern，它默认就是extern的。  按照规定，如果在一个函数的声明中未使用任何存储类指定符，则被视为使用了存储类指定符extern。

user: user-8
content: 1.全局变量的生命周期是从定义到程序退出之前一直有效；不是全局可见；加extern用于标识引用外面定义的全局变量； 2. 多个源文件.c之间不一定有关系，多个具有相同功能的函数放在同一源文件里，这样便于管理和调用；

user: user-9
content: 而函数却可以在不同c文件直接使用？ ------- 谁说的，也要include头文件或者用extern啊

user: user-10
content: 如果你#include 那个文件也可以不用extern,但是多个文件都#include ，他们是同名的不同变量，因此会有冲突，所以一般是用一个文件定义 ，其余用 extern 函数也一样啊，想让别的可见，也需要提前声明啊
user-0 提问: c语言预处理问题

回复:
user: user-1
content: 引用 1 楼 自信男孩 的回复:宏定义就是等价替换呢 （M+1) * M == (N+1+1) * N+1==（2+1+1）*2+1=9 宏定义加括号很重要，不然不会按照你的预想去计算～

user: user-1
content: 宏定义就是等价替换呢 （M+1) * M == (N+1+1) * N+1==（2+1+1）*2+1=9

user: user-2
content: 这个一模一样的代码我都看过几十个帖子了

user: user-3
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898
user-0 提问: 数据结构顺序表插入操作失败 ，在windows环境和linux环境下执行结果不一致

回复:
user: user-0
content: 非常感谢之前一直在ListInsert_Sq()方法中找原因，原来一开始的初始化就错了。

user: user-1
content: 引用 1 楼 自信男孩 的回复://L->elem = (Elemtype *)(malloc(sizeof(LIST_INIT_SIZE)));     L->elem = (Elemtype *)(malloc(sizeof(LIST_INIT_SIZE) * sizeof(Elemtype))); 顺序表越界了，因为你的Elemtype不是char哦。而是int。所以按照你的申请方式其实是申请了3个字节。而一个int在32位系统上就是4个字节～ 所以只要往里面放一个元素就会导致内存溢出，内存溢出是未定义行为，即什么都有可能

user: user-1
content: //L->elem = (Elemtype *)(malloc(sizeof(LIST_INIT_SIZE)));     L->elem = (Elemtype *)(malloc(sizeof(LIST_INIT_SIZE) * sizeof(Elemtype))); 顺序表越界了，因为你的Elemtype不是char哦。而是int。所以按照你的申请方式其实是申请了3个字节。而一个int在32位系统上就是4个字节～
user-0 提问: nmake时遇到问题

回复:
user: user-0
content: 在一个结构体添加了两个成员变量 double mypth； double pthprev； 有时候我就算不添加这两个成员，仅仅把一个成员变量从float改成double都会运行时报错

user: user-1
content: 贴出你添加的代码～

user: user-1
content: 跟内存大小可能没关系，只是增加几个成员到不了突然内存不足的情况。所以还是程序里是不是非法地址访问了。

user: user-0
content: 是HTK，我自己在结构体增加几个成员，就报错了，我把电脑虚拟内存调大也不行

user: user-1
content: 你变异的是什么层的程序，程序里控制空间的大小吧，
user-0 提问: 个人业余想开个飞行器，有想一起搞的吗 ?

回复:
user: user-1
content: 谢邀。 难道是要写控制 程序 ？

user: user-2
content: 这图片看上去不太像螺旋桨，难道是要振翅高飞

user: user-3
content: 怎么一起搞？有什么想法和计划？

user: user-0
content: 引用 1 楼 自信男孩 的回复:怎么一起搞？有什么想法和计划？ 用c语言写个控制程序

user: user-0
content: 对的，用C语言写控制程序
user-0 提问: 请问下面的代码有什么问题吗？

回复:
user: user-1
content: 1）有越界嫌疑，这个不能避免数组越界。 2）多线程操作，该函数不是原子操作，多线程操作数据内容可能会乱；

user: user-2
content: 有可能，所以你的代码有问题  char* _strdup(const char* strSource) {     if(strSource==NULL)        return NULL;     int len = strlen(strSource);     char* result = (char*) malloc(sizeof(char)*(len+1));     strcpy(result,strSource);     result[len]='\0';     return result; }

user: user-0
content: 有没有可能是strSource的长度可能会大于MAX_STR_LEN，导致数组越界

user: user-2
content: str 内存中只有一份，多次调用会混乱
user-0 提问: 求助VS2013 开发人员命令提示无法打开kernel32.lib

回复:
user: user-1
content: LIB=D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\LIB;D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\ATLMFC\LIB;C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\lib; LIBPATH=C:\Windows\Microsoft.NET\Framework\v4.0.30319;C:\Windows\Microsoft.NET\Framework\v3.5;D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\LIB;D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\ATLMFC\LIB;  以上是我电脑上VS2010命令提示下有关lib的环境变量设置共参考

user: user-2
content: cl 1.c kernel32.lib libcmt.lib 回车 一开始还是直接用ide 吧，用命令行，虽然你使用 vs的命令行工具，但是cl不知道你到底要连接具体哪一个Lib ，他只是知道你那些lib 会在哪个文件夹下。

user: user-0
content: VS 2013开发人员fatal error c1104:无法打开源文件:"LIBCMT.lib"   算了我投降了不搞了,头蒙

user: user-2
content: cl 1.c kernel32.lib

user: user-0
content: 试过了 不行

user: user-1
content: 重新运行VS2013安装程序，选修复。

user: user-0
content: 我已经24小时没睡觉了还没弄好

user: user-3
content: https://blog.csdn.net/u013556057/article/details/49206157  https://www.cnblogs.com/VVingerfly/p/5456485.html  http://blog.sina.com.cn/s/blog_605f5b4f0100tvap.html  网上搜比在这里问效率要高的多，建议楼主遇到问题可以先自己尝试解决一下，解决方法包括说明书，相关说明文档，网上搜索等等～
user-0 提问: Type or namespace definition, or end-of-file expected怎么改正呢

回复:
user: user-1
content: #include <stdio.h>  int main() {     int choice;    //用户的选择     //打印游戏菜单     printf("性格测试:\n");     printf("如果您是一位君王，对于身旁的伴侣您希望？\n");     printf("1、只要有一位真爱的妻子\n");     printf("2、可以两位以上的爱人\n");     printf("3、拥有三千佳丽\n");     do{         printf("请选择：");         scanf("%d",&choice);         //if(choice <= 0 || choice > 3);    //这儿多一个分号         if(choice <= 0 || choice > 3)         {             printf("只能输入1-3之间的数字！请重新输入：\n");         }     }while(choice <= 0 || choice > 3);  //思考：choice什么时候，执行循环     switch(choice)     {         case 1:             printf("您选择了生命中的唯一");             break;          case 2:             printf("你个花心大萝卜");             break;         case 3:             printf("江浙沪包邮");             break;     }     return 0; } 供参考～  return 0应该放在大括号里，代码里多了一个分号
user-0 提问: 动态链表之插入结点的题目 补全插入函数 求助各位前辈QWQ

回复:
user: user-1
content: #include <stdio.h> #include <malloc.h>  #define LEN sizeof(struct Student)  struct Student {     int num;     float score;     struct Student *next; };  int n = 0; void print(struct Student * head);  struct Student * insert(struct Student * head, struct Student * stud) {     ///程序填空，请将该函数填写完整     //     //     struct Student *p;      if (head == NULL) {    //第一个节点         head = stud;         head->next = NULL;         return head;     }      p = head;      while (p->next) {    //后面的节点～         p = p->next;     }      p->next = stud;     stud->next = NULL;      return head;      /*     struct Student *p;     p=head;      if(p->next==NULL){             stud->next=NULL;         p->next=stud;     }     while(p){         if(p->next->num>stud->num){             stud->next=p->next;             p->next=stud;             break;         }         else{             p=p->next;         }         //        if(p->next==NULL){         //            stud->next=NULL;         //            p->next=stud; break;         //        }     }     //stud->next==NULL;   //注意是赋值不是判断==     stud->next=NULL;     */ }  int main() {     struct Student *head = NULL, *stud;     int num;     float score;     while(1)     {         scanf("%d %f", &num, &score);         if(num == 0)             break;         stud = (struct Student*)malloc(LEN);         stud->num = num;         stud->score = score;         head = insert(head, stud);     }     print(head);     return 0; }  void print(struct Student * head) {     struct Student * p;     p = head;     if(head != NULL)     {         do{             printf("%d %.1f\n", p->num, p->score);             p = p->next;         }while(p != NULL);     } }  供参考～

user: user-2
content: 但是这样运行出来的结果没有按顺序排列啊？（1234重新排列那种）

user: user-0
content: 拜托各位前辈了 刚上大二这快学了很久还是很差劲
user-0 提问: C代码中的一个计算问题，谁能帮忙看看？

回复:
user: user-1
content: 用double就行了，float从高位到低位最多有7位有效，后面的都是随机的，你可以用10000.0/3.0试一下就知道了

user: user-2
content: 用的什么编译器？按说不可能的，同样的数据,都是浮点，用%f两次显示必然是一样的

user: user-3
content: la->aclike=pth->kike-prlk; 之后马上就输出la->aclike试试呢？

user: user-4
content: 用double类型

user: user-0
content: 我用的是nmake方式，我看的代码估计有二十年左右了

user: user-0
content: 引用 11 楼 棉猴的回复:la->aclike=pth->kike-prlk; 之后马上就输出la->aclike试试呢？ 就是马上输出

user: user-0
content: 引用 4 楼 poetryTang的回复:再多定义几个变量，多打印几次，问题就更明显了，不一样才是合理的，因为float有6-7位有效数字，所以2971.956应该是准确的，后面的就随机了 我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《这个超级简单的代码，输出结果都不对》, 一起来围观吧 https://bbs.csdn.net/topics/397584709

user: user-0
content: 引用 5 楼 自信男孩的回复:建议直接贴全代码～ 我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《这个超级简单的代码，输出结果都不对》, 一起来围观吧 https://bbs.csdn.net/topics/397584709

user: user-5
content: 建议直接贴全代码～

user: user-6
content: 再多定义几个变量，多打印几次，问题就更明显了，不一样才是合理的，因为float有6-7位有效数字，所以2971.956应该是准确的，后面的就随机了

user: user-0
content: 顶顶顶顶顶顶顶顶顶顶

user: user-0
content: 引用 8 楼 nice_cxf的回复:类型应该不是都是float，不然肯定是相等的 贴定义看看 我还试了一下，同一个变量连续输出两次，结果不一样

user: user-0
content: 引用 8 楼 nice_cxf的回复:类型应该不是都是float，不然肯定是相等的 贴定义看看 确实都是float

user: user-0
content: 顶顶，谁帮帮忙，顶顶，顶顶

user: user-2
content: 类型应该不是都是float，不然肯定是相等的 贴定义看看

user: user-0
content: 自己顶顶，谁帮帮忙，谢谢