Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 如何用C语言实现自定义弹窗与选项

回复:
user: user-1
content: windows 平台： 使用MFC / Qt等，很容易实现。 C#的话应该也比较容易，直接创建对话框项目就行，类似MFC。 或者直接调用Windows API MessageBox相关接口，也可以。 更复杂 更自定义的，可以往显存写数据的方式做窗口。  网页： 这不是C语言了。当然也可以弹窗，alert、confirm  其他比如嵌入式，比如海思： 用Qt跨平台。 或者用C语言 从在FrameBuffer上画点线面等基础函数开始做起一步步搭窗口。

user: user-2
content: 用c可以实现，但要调用windows api比较麻烦

user: user-3
content: 使用C语言绘制UI窗口比较麻烦，建议可以使用C++ 的 MFC, 创建弹框 so easy.

user: user-4
content: c 当然可以，只是麻烦。 不同的平台有不同的方式。 windows 平台建议了解一下win32，gui编程。

user: user-5
content: 单独的C语言恐怕不行，建议使用C++ MFC库～
user-0 提问: LeetCode 802.找到最终的安全状态。内存越界？我看了半天没问题啊...

回复:
user: user-0
content: 引用 1 楼 遇见女神 的回复:a[*(returnSize)++]=i ; 这行代码可能发生数组越界 为什么呢，我重新写了个变量从0开始就过了，但我前面已经*returnSize=0;了呀，为什么也会越界。

user: user-1
content: a[*(returnSize)++]=i ; 这行代码可能发生数组越界
user-0 提问: 新手求助，问了几个身边的人都得不到满意的解释

回复:
user: user-1
content: int *p = 0;等价p指向0地址位置。p += 6;等价p 偏移了6 * sizeof(int*)。再看一下sizeof(int*)是多少就知道输出p是多少了。

user: user-0
content: 自己想明白了……
user-0 提问: C语言

回复:
user: user-0
content: 引用 5 楼 月凉西厢的回复:一般认为是从常量区拷贝过去的。具体的话需要看到反汇编代码 也就是说可能是从常量区copy过去的，可能是直接嵌入到指令中的，具体那种不好说

user: user-1
content: 一般认为是从常量区拷贝过去的。具体的话需要看到反汇编代码

user: user-2
content: 这个不一定，它和编译是否优化，数据量的大小有关。

user: user-3
content: 首先代码在编译时，编译器看到这个"abcd"字符串后，就给你把他放到一个固定的地方【你程序中所有出现的这种直接"字符串abc..."都是如此】。这个地方叫静态常量区。 此时，程序中，那个exe【或者dll...】中。存在一个"abcd" ---------------------------------- 接着程序执行时，cpu依据这条指令的意思，在栈上开辟一段char[]数组空间。开辟的长度依据面常量区的"abcd\0"为准。然后从常量区将字符串复制过来 此时，程序中，这个进程上。存在一个"abcd"【静态常量区】，这个线程栈上，有一段空间对应该数组b。其内容为"abcd\0"【复制而来的】

user: user-4
content: 编译个exe.用od载入。查看字符串。我觉得在text段里。

user: user-5
content: 个人认为是copy到b数组中。  "abcd"不是一个字符，如果是一个字符，可以考虑是直接存储到b数组中。
user-0 提问: 各位大佬们能给我讲一讲KMP算法吗？

回复:
user: user-1
content: 该算法重点就在于理解PMT和next 不要想那么复杂，简单地理解next为该位置的前一个位置的匹配长度即可

user: user-2
content: 上边说的不清楚，应该是最后一个c的。。。

user: user-2
content: next 数组是这样的，模式串，每一位的Next的值是 最大的从左往右与从右向左相等的长度 比如  abcxxxxxabc那么c的next值就是3

user: user-0
content: 我主要是next数组不懂，代码完全看不懂

user: user-3
content: 这个算法的思路主要在于在已匹配的字符串当中确认最长可匹配后缀子串和最长可匹配前缀子串， 然后下一轮循环的时候直接跳到最长可匹配后缀子串的位子  从而实现减少循环  我觉得这个算法就是在BF算法基础上面做了这个操作 去掉了一些不必要的循环对比 具体的解释真的没法说清  你可以看看下面的链接 https://baijiahao.baidu.com/s?id=1659735837100760934&wfr=spider&for=pc https://baijiahao.baidu.com/s?id=1659735837100760934&wfr=spider&for=pc

user: user-2
content: 这个真不是一两句能讲明白,你先把你的具体不明白的地方说出来...
user-0 提问: 谁能帮我看看哪里错了

回复:
user: user-0
content: 引用 1 楼 user-3的回复:你的期待结果是什么？ 单纯从语法上来说 case 0: //后面是冒号 另外，如果希望每个case做不同的处理，应该在case 语句结束后加break，即 case 0: break; case 1: s += 1; break; //如果没有break，那么case 1执行后会继续执行case 2，当然如果你的本意就是case 1和case 2都执行，那么另当别论 case 2: s += 2; break; case 3: s += 3; break; case 4: s += 4; break; 谢谢你们，我太粗心了

user: user-0
content: 引用 2 楼 chxchxkkk的回复:如果把case 后面的 分号写对成 冒号，程序可以正常运行。 谢谢你们，我太粗心了

user: user-1
content: 没有break，那么从case 0会执行到case 4.

user: user-2
content: 如果把case 后面的 分号写对成 冒号，程序可以正常运行。

user: user-3
content: 你的期待结果是什么？ 单纯从语法上来说 case 0: //后面是冒号 另外，如果希望每个case做不同的处理，应该在case 语句结束后加break，即 case 0: break; case 1: s += 1; break; //如果没有break，那么case 1执行后会继续执行case 2，当然如果你的本意就是case 1和case 2都执行，那么另当别论 case 2: s += 2; break; case 3: s += 3; break; case 4: s += 4; break;
user-0 提问: 求大佬指导，用下列公式求cos(x)的近似值，精确到最后一项的绝对值小于e

回复:
user: user-1
content: 你好好检查sum阶乘对不对，每次计算阶乘重新初始化了吗？ 要么你就把for里的 j=1 去掉，放到外面初始化j；要么就每次for j循环前初始化sum 另外，while(k>=e)也有问题，假设 k=s/sum小于e，后面的totle=totle+k*flag还是执行了，也就是会多计算一项。

user: user-0
content: double funcos( double e, double x ) {     double k=1.0 ;     double s ;     double total = 1 ;     int j ;     double i = 2 ;     int falg = -1 ;     int sum = 1 ;             while( k >= e )     {         s = pow ( x , i) ;                  for ( j = 1 ; j <= i ; j++  )         {               sum *= j ;                      }         k = s / sum ;         total = total + k*falg  ;          falg = -falg;          i += 2 ;     }     return total ; }  改了还是不对

user: user-1
content: 引用 楼主 深山旧梦还惊觉 的回复:题目如下：   代码如下  #include <stdio.h> #include <math.h>  double funcos( double e, double x );  int main() {         double e, x;      scanf("%lf %lf", &e, &x);     printf("cos(%.2f) = %.6f\n", x, funcos(e, x));      return 0; } double funcos( double e, double x ) {     double t = 1.0 ;     double l = 1.0 ;     int i  ;     int j = 2 ;     double total ;     double sum ;     while (  (t / l ) > e  )                       //当精度不满足时候循环     {                    t = pow (x , j) ;                                          for( i = 1 ; i <= j ; i++ )                           {                     l *= i ;                         //求分子             }                           total += -(t / l) ;                         //单项                           sum += total ;                         j += 2 ;                                  //递增指数 +2     }     return sum + 1 ; }   我这觉得思路没问题，但是代码不对，自己看不出来哪里出错了。  你这单项注释的一行啥意义？ 你看你的问题，正负项都没控制好，答案怎么可能对？ 正负项用 *= -1（也就是乘-1）来控制，所以改成 total = -1.0(初始值)，sum = 0 然后 for 循环里的 total += -(t / l) ; sum += total ; 改成 sum += total * (t / l) ; total *= -1; //total当作正负符号的flag，每运算一次改变一次符号

user: user-2
content: 你的自定义函数里，total和sum没有初始化吧。  另外，double的输出应该用%lf，楼主的应该是 %.2lf
user-0 提问: PTA上的最大子列和问题，涉及动态数组的赋值，写了几次提交都显示运行时错误，但是在vs上能过，请问是哪里出了问题呢

回复:
user: user-1
content: 还有那个scanf_s 改成scanf  ,麻烦你先把语法写对了。 再看分配空间，new int数组时，k是0，没有分配空间，怎么给a[]赋值呢？应该把 scanf_s("%d", &K);写到new之前

user: user-1
content: MaxSubseqSum的参数也不能用传数组啊

user: user-0
content: 引用 1 楼 逸卍辰的回复:这是哪个题啊 数据结构的第一题啊，7-1

user: user-0
content: 啊忘了说！我开始是用c＋＋写的，然后PTA一直过不去就想改成c语言看看，new和delete什么的是忘改了 总之就还是数组的问题

user: user-1
content: 也没有delete ,别和c++用混了

user: user-1
content: c语言没有new关键字吧

user: user-2
content: 这是哪个题啊

user: user-0
content: 我会了！蟹蟹你哦！

user: user-0
content: scanf也不让用啊，怎么就“麻烦我先把语法写对了”

user: user-1
content: #include <stdio.h> #include <stdlib.h>  int MaxSubseqSum(int *A, int N) {     int ThisSum = 0, MaxSum = 0;     for (int i = 0; i < N; i++) {         ThisSum += A[i];         if (ThisSum > MaxSum)             MaxSum = ThisSum;         else if (ThisSum < 0)             ThisSum = 0;     }     return MaxSum; }  int main() {     int K = 0, t; int temp = 0;     scanf("%d", &K);     int* a = malloc(sizeof(int)*K);          for (int i = 0; i < K; i++) {         scanf("%d", &temp);         a[i] = temp;     }     t = MaxSubseqSum(a, K);     printf("%d", t);     free(a);     return 0; }
user-0 提问: c语言 error: expected '; '. '.' or ')'before 'char'    怎么解决？？？

回复:
user: user-1
content: int show_report(Product p[], int num_of_product char *pr_ordinal ); 第二个参数和第三个直接是不是少一个逗号呢？  switch的参数只能是int，整形数，你用字符串是不支持的。 建议楼主重新了解一下switch case的用法～

user: user-0
content: 加","了case 也改成case 1了还是有这个报错

user: user-2
content: 1.检查是否用了中文标点符号 2.	case "已完成": case 不支持这种写法吧

user: user-3
content: int num_of_product 和 char *pr_ordinal 之间加个逗号，也就是参数之间用逗号分开。

user: user-4
content: 你这.....switch case用的真牛啊。。。不知道该怎么说你了

user: user-5
content: product 大小写也关注一下
user-0 提问: C#源代码如何用VS软件生成exe文件

回复:
user: user-0
content: 那就是点F5生成exe文件的方法没错咯？我还以为这种方法不对，那生成的exe文件在哪能找到，你知道吗

user: user-1
content: 这个是已经生成exe了吧，看着像是程序运行报的错。
user-0 提问: 发生了什么？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  struct film {     char title[45];     int rating;     struct file* next; };  char* s_gets(char* st, int n);  int main(void) {     struct film* head = NULL;     struct film* prev, * current;     char input[45];      puts("enter first name");     while (s_gets(input, 45) && input[0] != '\0') {         current = (struct  film*)malloc(sizeof(struct film));         //prev= (struct  film*)malloc(sizeof(struct film));         if (head == NULL)             head = current;         else             prev->next = current;         current->next = NULL;         strcpy(current->title,input);         puts("enter first rating");         scanf("%d", ¤t->rating);         while (getchar() != '\n')             continue;         puts("enter next");         prev = current;     }     if (head == NULL)         puts("there is no moive");     else         puts("there is a movie list");     current = head;     while (current != NULL) {         printf("%s   ,%d\n", current->title, current->rating);         current = current->next;     }     current = head;     while (current != NULL) {         free(current);         current = current->next;     }     return 0; }   char* s_gets(char* st, int n) {     char* ret_val;     char* find;      int i = 0;      ret_val = fgets( st, n, stdin);//下文所出现的都是已经输入完成的内容     if (ret_val) {//fgets没有读取到文件结尾或者读取错误         find = strchr(st, '\n');         if (find)         {             *find = '\0';         }         else             while (getchar() != '\n')                 continue;     }     return ret_val; }

user: user-1
content: 而且pre指针也不用分配空间,应该注释掉 //prev= (struct  film*)malloc(sizeof(struct film));

user: user-1
content: 内存泄露: while (current != NULL) {         free(current);         current = current->next;     }
user-0 提问: 不同的地方放入 str[1000] = '\0'; 这条代码，返回的值就发生变化了

回复:
user: user-1
content: 引用 8 楼 九月qkq92 的回复:引用 5 楼 qq_1457346882 的回复:奥，你加这个是想把数组清空还是？我看你这是一次ｗｈｉｌｅ调用一次，如果清空的话用memset就好了    是的我是想清空。不过我觉得直接赋值空比较方便。 str[0] = '\0'也可以吧。 那不是，现在通用的就是用memset，这个函数很方便啊，都是一句语句，怎么直接赋值就比较方便，而且这是代码规范，虽说你这里把第一个赋值为\０可以，那是因为你这里是数组一样的判断，而且代码简短，工程文件里很多都是直接取一部分，那这一部分你这么赋值取出来不就是错的了。 我的理解是此时str的值应该为efcde，但是实际的值是ef　　　这个说的也是有问题的　不止是这一个函数，大多数获取函数都会在结束加\0 你这里ｓｔｒ的值不是ｅｆｃｄｅ而是ｅｆ'\0'de，你的输出判断都是判断是不是\0，是这个就截止，这也是同样的道理为什么直接赋值给第一个地址不好

user: user-0
content: 引用 9 楼 qq_1457346882 的回复:引用 8 楼 九月qkq92 的回复:[quote=引用 5 楼 qq_1457346882 的回复:]奥，你加这个是想把数组清空还是？我看你这是一次ｗｈｉｌｅ调用一次，如果清空的话用memset就好了    是的我是想清空。不过我觉得直接赋值空比较方便。 str[0] = '\0'也可以吧。 那不是，现在通用的就是用memset，这个函数很方便啊，都是一句语句，怎么直接赋值就比较方便，而且这是代码规范，虽说你这里把第一个赋值为\０可以，那是因为你这里是数组一样的判断，而且代码简短，工程文件里很多都是直接取一部分，那这一部分你这么赋值取出来不就是错的了。 我的理解是此时str的值应该为efcde，但是实际的值是ef　　　这个说的也是有问题的　不止是这一个函数，大多数获取函数都会在结束加\0 你这里ｓｔｒ的值不是ｅｆｃｄｅ而是ｅｆ'\0'de，你的输出判断都是判断是不是\0，是这个就截止，这也是同样的道理为什么直接赋值给第一个地址不好[/quote]  因为赋值完后会在数组后面自动加‘\0’，我输出时到‘\0’结束，所以才只会打印ef。而实际上数组在我后一次赋值后变成了ef'\0'de,  它覆盖了前一个字符串的前3位。  是这样理解吗？

user: user-0
content: 因为赋值完后会在数组后面自动加‘\0’，我输出时到‘\0’结束，所以才只会打印ef。而实际上数组在我后一次赋值后变成了ef'\0'de,  它覆盖了前一个字符串的前3位。  是这样理解吗？

user: user-1
content: 奥，你加这个是想把数组清空还是？我看你这是一次ｗｈｉｌｅ调用一次，如果清空的话用memset就好了

user: user-1
content: 数组越界就不说了，你这个判断，运行都是正确的嘛？这个数组越界不会影响你的ｆｌａｇ值，影响的地方在你每次循环都把他初始化为０，然后下面判断改为一之后没有跳出全部的循环吧，你这样跳出最里层循环那还是会执行外循环的下一次，就又把ｆｌａｇ重置了，那两个不等于的时候就到ｆｌａｇ等于０退出了，所以你这个除了某些特定情况，比如你外循环是最后一次，不然都会ｆｌａｇ等于０吧 其次你这个为什么要在最后给赋值\0呢？完全用不到这两个啊，就算要初始化也是最开始定义的时候初始化为{}啊

user: user-2
content: //str[1000] = '\0'; 这条语句越界了，越界访问的结果是未定义的。     str[1000] = '\0';     //请问在这里加这条代码 和在上面有什么不一样？         str1[1000] = '\0'; 这两条语句一样是越界了。下表的范围是[0, 999]

user: user-3
content: 越界的问题，楼上已经说了。楼主应该知道，数组(array)、map、list等等，都是从0开始的，最后一个值是ARRAYSIZE(arr) - 1

user: user-0
content: 引用 5 楼 qq_1457346882 的回复:奥，你加这个是想把数组清空还是？我看你这是一次ｗｈｉｌｅ调用一次，如果清空的话用memset就好了    是的我是想清空。不过我觉得直接赋值空比较方便。 str[0] = '\0'也可以吧。

user: user-0
content: 第二条我说错了， 应该是我每次重新给str和str1赋值的时候就会将之前的值覆盖掉吧？ 比如我第一次给str = “abcde” 第二次str = “ef”，我的理解是此时str的值应该为efcde，但是实际的值是ef。 是应为gets函数的缘故吗？

user: user-0
content: 1、你的意思我明白了  我越界赋值为‘\0’了。  2、我的本意是想每一次循环前将str置为空。其实不用这样吧，每次循环完之后会str和str 就已经是空了吧？ 3、如果我要将一个字符串赋值为空除了一楼说的memset函数清空，str[0] = '\0'也可以吧？

user: user-4
content: str[1000] = '\0'; 这个是越界操作，你的临时变量都存在栈中，flag变成0说明str之后就是flag的保存地址，str[1000]='\0',相当于flag=0; 你只可以str[999]='\0';
user-0 提问: 求助，按英文反向输出浮点数

回复:
user: user-1
content: 你需要把 inum 定义为float 或者double 啊 scanf("%lf",&inum);

user: user-0
content: 引用 1 楼 真相重于对错 的回复:第一浮点数不能用%运算 第二浮点数不能精确表示一个数  取巧的方法  char arr[80];     sprintf(arr, "%2lf", 4.6); 然后对 arr 取反 对了，我想还是我没表达清楚。 比如一个终端输入一个浮点数123.456，如何输出成six five foru.three two one；

user: user-0
content: 引用 1 楼 真相重于对错 的回复:第一浮点数不能用%运算 第二浮点数不能精确表示一个数  取巧的方法  char arr[80];     sprintf(arr, "%2lf", 4.6); 然后对 arr 取反 额，超纲了。。。我才开始看到数组，我过两天熟悉了验证一下。 对了，顺便厚着脸皮问个事，刚刚试了一下条件表达式： 		inum/10!=0?(renum=inum%10,inum=inum/10):(renum=inum,nsign=false); 		/*if(inum/10!=0) 		{ 			renum=inum%10; 			inum=inum/10; 		} 		else 		{ 			renum=inum; 			nsign=false; 		}*/ 实现效果是一样的，第一种看着美观点。问个对我来说很超纲的问题，对于C语言，条件表达式和IF语句哪种更效率更好一点？

user: user-1
content: 第一浮点数不能用%运算 第二浮点数不能精确表示一个数  取巧的方法  char arr[80];     sprintf(arr, "%2lf", 4.6); 然后对 arr 取反
user-0 提问: [求助]如何在pe文件中插入section，并使得新节执行，执行时安装一个自己的一个handle函数到seh中

回复:
user: user-0
content: 利用seh问题是不就转换成怎么把一段汇编代码注入到程序中了？这么做可以吗

user: user-0
content: 引用 1 楼 user-1 的回复: 插入病笃的节奏。 以前c/c++搞过，尾部插入section.然后修改入口点为新section.运行完了自己代码再跳到原oep. 一般没加壳的exe插入，但加壳的一些插不了代码。无法运行 强！但是我主要是想利用seh，不想修改入口点，这样太明显了

user: user-1
content: 插入病笃的节奏。 以前c/c++搞过，尾部插入section.然后修改入口点为新section.运行完了自己代码再跳到原oep. 一般没加壳的exe插入，但加壳的一些插不了代码。无法运行
user-0 提问: 大佬救命，这段代码我看了2小时都没看懂

回复:
user: user-0
content: 非常感谢

user: user-1
content: 找奇数回文从第二个元素到倒数第二个元素查找没问题，出现编译错误肯定是你的代码有问题。 一般来说奇数回文和偶数回文长度不可能一样长（奇数不可能等于偶数）。如果真出现回文一样长，那按现在的代码是奇数优先，因为if是判断是大于len才会交换，也就是等于len不交换，所以即使偶数回文长度和奇数回文一样也是奇数回文优先 一个字符算不算回文，这就看回文怎么定义了。顺着输出是该字符自己，逆着输出也是该字符自己，所以顺着和逆着一样，从这个角度看一个字符也算回文

user: user-2
content: 楼上说的很详细了，我补充下最后两句的意思 s[start + len] = '\0';           return s + start; start是回文字符串在原字符串s的起始位置，len是回文字符串的长度，s[start + len] = '\0'; 把s字符串截断在start + len的位置上了， return s + start;返回了原始字符串s中回文字符串的起始位置地址

user: user-0
content: 我还发现一个问题，当数组中没有回文字符串时，函数最后会返回数组中的第一个字符，难道一个字符也算回文字符串？

user: user-0
content: 引用 2 楼 user-2 的回复：楼上说的很详细了，我补充下最后两句的意思 s[start + len] = '\0';           return s + start; start是回文字符串在原字符串s的起始位置，len是回文字符串的长度，s[start + len] = '\0'; 把s字符串截断在start + len的位置上了， return s + start;返回了原始字符串s中回文字符串的起始位置地址如果目标数组中既然奇数回文又有偶数回文，再连续经过两个for循环最后return的回文是奇数还是偶数呢？上面的代码好像没有判断啊？

user: user-0
content: 引用 1 楼 qybao 的回复：i从0位置开始不断右移，然后以i位置为中心，分别循环比较left和right的字符是否相等，如果不等，则while循环结束，然后判断left和right相等的字符的长度，如果长度大于最大值len，则说明以i为中心的回文更长，所以重新更新len以及回文的开始位置 举个例子 xabababa 当i移到第一个b位置，left和right字符都是a，是回文（aba），长度为3个字符，大于len0，所以更新len为3，start为1 当i移到第二个a位置，left和right的两个字符是ba，长度一共为5个字符（ababa），大于之前的len3，所以更新len为5，start为1 当i移动到第二个b位置，left和right的三个字符是aba，长度一共是7个字符（abababa），大于之前的len5，所以更新len为7，start为1 当i移动到第三个a位置，left和right的两个字符为ba，长度一共是五个字符（ababa），不大于之前的len7，所以不用更新len和start 后面依次类推  至于为什么用两次for i 循环 因为第一次for是为了找 abcba这种回文，也就是中心位和左右两边的字符不同，所以第一次for循环的left是从i-1开始算的 第二个for是为了找 abba这种回文，也就是没有中心位，就是直接左右对称的回文，所以第二次for的left是从i开始算的第一个for循环的条件为什么不能改成for（int i=1；i小于N-1；i++）？既然是找奇数长度的回文，那么从第二个元素开始右移到倒数第二个元素不可以吗？可是我改成这样却会编译错误，错在哪？

user: user-1
content: i从0位置开始不断右移，然后以i位置为中心，分别循环比较left和right的字符是否相等，如果不等，则while循环结束，然后判断left和right相等的字符的长度，如果长度大于最大值len，则说明以i为中心的回文更长，所以重新更新len以及回文的开始位置 举个例子 xabababa 当i移到第一个b位置，left和right字符都是a，是回文（aba），长度为3个字符，大于len0，所以更新len为3，start为1 当i移到第二个a位置，left和right的两个字符是ba，长度一共为5个字符（ababa），大于之前的len3，所以更新len为5，start为1 当i移动到第二个b位置，left和right的三个字符是aba，长度一共是7个字符（abababa），大于之前的len5，所以更新len为7，start为1 当i移动到第三个a位置，left和right的两个字符为ba，长度一共是五个字符（ababa），不大于之前的len7，所以不用更新len和start 后面依次类推  至于为什么用两次for i 循环 因为第一次for是为了找 abcba这种回文，也就是中心位和左右两边的字符不同，所以第一次for循环的left是从i-1开始算的 第二个for是为了找 abba这种回文，也就是没有中心位，就是直接左右对称的回文，所以第二次for的left是从i开始算的
user-0 提问: ubuntu系统中gcc的环境变量问题

回复:
user: user-0
content: 引用 5 楼 自信男孩 的回复:不是你的问题莫名其妙，而是这个问题莫名其妙。你装的是什么系统？Ubuntu吗？如果是Ubuntu那么应该不需要修改环境变量的。直接可以用，并且是在用户目录下的任何目录里都可以使用。 其实就是我想偷懒。 自建了一个文件夹专门放.c的文件，本来想偷懒在任何位置不用带路径，直接gcc这些的，于是在$PATH中添加了自建文件夹的路径，结果发现gcc不会管$PATH的。 其实看了你的回复，我想了半天，发现我这问题真的就是脱了裤子放屁。

user: user-1
content: 不是你的问题莫名其妙，而是这个问题莫名其妙。你装的是什么系统？Ubuntu吗？如果是Ubuntu那么应该不需要修改环境变量的。直接可以用，并且是在用户目录下的任何目录里都可以使用。

user: user-0
content: 引用 1 楼 自信男孩 的回复:装好系统之后，不需要配置任何环境呢，直接就可以使用gcc。如果需要更高版本的，可以直接用命令安装，安装之后也可以直接使用，也不需要配置环境变量呢。你的问题很奇怪 谢谢谢谢，我是才学习的C语言，包括linux系统也是才接触，很多东西都是在网上面边看边学的，有很多问题可能对于熟悉的人来说莫名其妙的，其实这也是初学者最头疼的地方，以后我会尽量将问题描述清楚的。再次感谢你关注回复这个问题。

user: user-0
content: 引用 2 楼 二进制脑袋 的回复：[quote=引用 楼主 Stariamer 的回复:]初学C语言，正好电脑装了双系统，听网友说linux和C语言最搭配。只是有个小问题一直没有得到解决，希望各位朋友能帮帮忙。  我在电脑里新建了一个“Practice”文件夹，这个路径也加入了linux的$PATH中。现在的问题就是，如果我在此文件夹中打开终端，然后运行gcc hello.c -o hello，可以正确输出一个可执行的hello文件，在终端运行hello，也会正确的输出“hello world!”(毕竟我也是个会用多种语言写“hello world”程序的高手)。如果我从其他位置运行gcc hello.c -o hello，则会提示gcc: fatal error: no input files ，可是我在任意位置运行hello，却能正确的输出“hello world!”。我特意echo $PATH看了一下，Practice”文件夹的位置也的确在$PATH中。对此我感到很迷惑，ubuntu中的$PATH对gcc没有效果吗？  不光ubuntu的$PATH对gcc的输入文件无效，Windows也一样。gcc是不搜索$PATH路径来寻找输入源文件的。你在任意位置运行hello可以运行，那是因为你输入hello时，Shell程序会根据$PATH搜索可执行文件的。[/quote]原来如此，我昨天头疼了一晚上呢，本来打算偷个懒的，看来还是老老实实的在源代码的文件夹里开终端编译吧。谢谢🙏

user: user-2
content: 引用 楼主 Stariamer 的回复:初学C语言，正好电脑装了双系统，听网友说linux和C语言最搭配。只是有个小问题一直没有得到解决，希望各位朋友能帮帮忙。  我在电脑里新建了一个“Practice”文件夹，这个路径也加入了linux的$PATH中。现在的问题就是，如果我在此文件夹中打开终端，然后运行gcc hello.c -o hello，可以正确输出一个可执行的hello文件，在终端运行hello，也会正确的输出“hello world!”(毕竟我也是个会用多种语言写“hello world”程序的高手)。如果我从其他位置运行gcc hello.c -o hello，则会提示gcc: fatal error: no input files ，可是我在任意位置运行hello，却能正确的输出“hello world!”。我特意echo $PATH看了一下，Practice”文件夹的位置也的确在$PATH中。对此我感到很迷惑，ubuntu中的$PATH对gcc没有效果吗？  不光ubuntu的$PATH对gcc的输入文件无效，Windows也一样。gcc是不搜索$PATH路径来寻找输入源文件的。你在任意位置运行hello可以运行，那是因为你输入hello时，Shell程序会根据$PATH搜索可执行文件的。

user: user-1
content: 装好系统之后，不需要配置任何环境呢，直接就可以使用gcc。如果需要更高版本的，可以直接用命令安装，安装之后也可以直接使用，也不需要配置环境变量呢。你的问题很奇怪
user-0 提问: 求大佬帮我看看这段代码

回复:
user: user-1
content: 完全有可能啊，strsSize是传入的参数，和strs没有直接必然联系，所以strsSize的值可以和strs的长度不同，但是为了运算结果的正确，strsSize和strs的长度要确保一致

user: user-0
content: 我举个例子：当strsSize等于1时，是不是可能存在这种情况strs=｛“abcdefg”，“”，“”｝，即除了第一行字符串，其他行都是空字符串？

user: user-1
content: strsSize是代表输入的字符串个数（换句话说也是二维数组strs的长度） strsSize为0表示输入的字符串个数为0，也就是没有输入，所以没有共通前缀，即前缀为空 strsSize为1表示输入字符串的个数为1，也就是只有一个输入，所以共通前缀就是字符串本身（相当于字符串自己跟自己比） 不管strsSize是什么，都不会改变strs是二维数组，所以不存在strsSize为1，strs就变成一维数组之说。strsSize为一只是说这个二维数组只有一个元素，也就是只有一个字符串。
user-0 提问: 我的代码不知道为什么出现错误

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  int CountDigit( int number, int digit );  int main() {     int number, digit;      scanf("%d %d", &number, &digit);     printf("Number of digit %d in %d: %d\n", digit, number, CountDigit(number, digit));      return 0; } int CountDigit( int number, int digit ) {      int m = number  ;     int total = 0 ;     if( m == 0)     {         return 1 ;     }     while(m != 0)     {         /*         if( m % 10 == digit || m % 10 == -digit )         {             total += 1 ;              m /= 10 ;         }         */         if (abs(m % 10) == digit)             total++;         m /= 10;     }      return total; } 供参考～

user: user-2
content: 把m /= 10 移到if 外面

user: user-3
content: 后面函数有问题  int CountDight(int number, int dight)  {  	int m = munber;  	int total = 0;  	if(!m)  		return 1;  	else  		while(m)  			if(m % 10 == dight || m%10 == -dight)  			{  				total++;  				m /= 10; 			 } 	return total;  }

user: user-0
content: 真的强！！！

user: user-0
content: 引用int CountDigit( int number, int digit ) {      int m = number  ;     int total = 0 ;     if( m == 0 )     {         if(digit == 0)         {              return 1 ;         }        return total;     }     else     {         while(m != 0)         {           if( m % 10 == digit || m % 10 == -digit )           {               total += 1 ;                  m /= 10 ;           }         }      }     return total;  }  我也发现了，但是改完以后在运行会出现运行超时

user: user-2
content: 代码本身就不对 return total要放到while循环的外面，否则循环一次就return了，结果肯定不对 另外，m==0时不应该return 1，要判断digit是否也为0，是才返回1，否则返回0
user-0 提问: 《C程序设计教程》中的一道关于switch的题目

回复:
user: user-1
content: case 1没有break，因此继续执行外层switch的case 2

user: user-0
content: 哦我明白了。case1后面没有break，所以case1的语句执行完了，继续执行case2中的n++，所以n总共自加了2次，最后值就等于2了。

user: user-0
content: 1、switch(1)，进case1， 2、子句里，switch(2)，进case2，n++，n变成1，break退出switch(2)的循环， 3、这时候要判断的这个值是2，所以再进case2，n++，n变成2，再break退出外层的switch循环， 4、所以最后打印出来n=2，  过程是这样吧？

user: user-2
content: 跟switch里面常不常量无关，它是多少就case多少

user: user-0
content: switch(1) 当switch()里面的参数是常量时，后续的case是怎么选择的？

user: user-2
content: case 1:  没有 break
user-0 提问: c语言，新手求大神指点

回复:
user: user-1
content: scanf,strcmp

user: user-2
content: getchar()只能获取单个字符

user: user-3
content: 输入语句的话，那就是字符串处理了。字符串处理可以参考：fgets, strcmp,strcpy等等函数  else if (c == 'name') 这儿的name应该是字符串，'name'是非法的，字符串比较应该用strcmp

user: user-4
content: chat c[256]; //用字符串 while(gets(c)!=NULL) { //接收字符串     if(strcmp(c, “hi”)==0) //字符串比较         printf(xxx)     ... }
user-0 提问: VC6的Visual Assistant的自动补全怎么用？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:你设置一下VA  多谢，设置界面点不开，跑到他们官方论坛查了一下，发现这个是老兼容性问题。现在项目取消用VC6的界面了，仅仅用他们的命令行来编译。

user: user-1
content: 你设置一下VA
user-0 提问: 大佬们，帮我看一下

回复:
user: user-1
content: 麻烦问一下有答案了吗

user: user-2
content: 求代码还是求解决代码问题的，建议楼主可以先自己尝试实现，遇到问题再提出来，这样能学到东西。

user: user-3
content: 同问！！你有1、4题的答案了嘛小姐姐

user: user-4
content: 面试题吗

user: user-5
content: 好好写作业，期末考试不愁

user: user-6
content: 都是基础 = = 而且一看就知道是布置的作业  自己琢磨吧   把不懂得代码拿上来问还差不多
user-0 提问: 为什么visualC++6.0不能输出长整型啊？

回复:
user: user-1
content: VC 6.0  unsigned __int64 test = 123456789123456789; printf("%I64u\n", test);

user: user-2
content: 64位整型定义 __int64 a; or unsigned __int64 a;

user: user-3
content: 溢出了，a的内存是long类型，存不下这么大的数据的。用long long或long double存放。用long double存放，要用%Lf输出

user: user-4
content: long是32位的，截断了，可以定义long long
user-0 提问: 求大佬帮忙看一下这段代码

回复:
user: user-1
content: 第二个问题，不能改成等于，要是没有相等的元素那岂不是就不能二分了

user: user-0
content: 引用 3 楼 李牧大将军 的回复：int searchInsert(int* nums, int numsSize, int target){   //你要理解这里的两个变量 left right 这代表了数组的最左边（即最低值）与最右边（即最高值）的数组下标       int left = 0, right = numsSize, mid;    //=numsSize你可以理解为加上你输入的值 比如{1,3,5,6}加一个你输入的7  最右的下标为4  如果你将值等于numsSize-1那么会导致这个返回值为3 而不是 4     while (left < right) {            mid = left + (right - left) / 2;         if (target <= nums[mid]) {    //上一步将mid赋值 是取数组中间的值 即 nums[mid]   这里<=nums[mid] 是直接将你输入的即将插入的target值与中间的值对比               right = mid;   //如果你插入的值小于中间值  就将数组的最右边right （即最高值）的下标赋值成中间值的mid  即实现二分         }else{             left = mid+1;//如果你插入的值大于中间值  就将数组的最左边left （即最低值）的下标赋值成中间值的mid  即实现二分         }     }   经过上面left与right值的重新赋值 也就是说 以前长度为4的数组变成长度2了  也就可以while循环取中间的值      return left; } 二分的理解 举个例子：     猜数字： 要猜中猜100以内的某个值 你会先猜 50（即target ）                   -》小于-》 你就直接丢掉 50以下的值 （即在（ left = mid+1）51 -100 之间继续猜 ）                   -》大于或等于-》你就直接丢掉 50以上的值（即在（right = mid）0-50 之间继续猜 ） 一直循环                   -》小于-》 你就直接丢掉 75以下的值 （即在（ left = mid+1）76-100 之间继续猜 ）                   -》大于或等于-》你就直接丢掉 25以上的值（即在（right = mid）0-25之间继续猜 ） ......循环直到猜中那最后为什么是return left而不是return right？

user: user-2
content: 这种算法题，最好自己单步调试一下。理解才会深刻。

user: user-3
content: int searchInsert(int* nums, int numsSize, int target){   //你要理解这里的两个变量 left right 这代表了数组的最左边（即最低值）与最右边（即最高值）的数组下标       int left = 0, right = numsSize, mid;    //=numsSize你可以理解为加上你输入的值 比如{1,3,5,6}加一个你输入的7  最右的下标为4  如果你将值等于numsSize-1那么会导致这个返回值为3 而不是 4     while (left < right) {            mid = left + (right - left) / 2;         if (target <= nums[mid]) {    //上一步将mid赋值 是取数组中间的值 即 nums[mid]   这里<=nums[mid] 是直接将你输入的即将插入的target值与中间的值对比               right = mid;   //如果你插入的值小于中间值  就将数组的最右边right （即最高值）的下标赋值成中间值的mid  即实现二分         }else{             left = mid+1;//如果你插入的值大于中间值  就将数组的最左边left （即最低值）的下标赋值成中间值的mid  即实现二分         }     }   经过上面left与right值的重新赋值 也就是说 以前长度为4的数组变成长度2了  也就可以while循环取中间的值      return left; } 二分的理解 举个例子：     猜数字： 要猜中猜100以内的某个值 你会先猜 50（即target ）                   -》小于-》 你就直接丢掉 50以下的值 （即在（ left = mid+1）51 -100 之间继续猜 ）                   -》大于或等于-》你就直接丢掉 50以上的值（即在（right = mid）0-50 之间继续猜 ） 一直循环                   -》小于-》 你就直接丢掉 75以下的值 （即在（ left = mid+1）76-100 之间继续猜 ）                   -》大于或等于-》你就直接丢掉 25以上的值（即在（right = mid）0-25之间继续猜 ） ......循环直到猜中
user-0 提问: 请大佬看看c语言这个是哪里出问题了呢？谢谢大家

回复:
user: user-0
content: 应该是哈，我去安装，谢谢你

user: user-0
content: 应该是哈，我去安装，谢谢你

user: user-1
content: 没有找到graphics.h这个头文件。你是没有安装这个图形库吧？
user-0 提问: C语言，请大神看看到底错在哪里

回复:
user: user-1
content: 我想您是不是要求2000-2100年中的闰年啊？ #include<stdio.h> #define lower 2000 #define upper 2100 int main() { 	int year; 	bool r; 	year = lower; 	do { 		r = ((year % 4==0) && (year%100!=0))||(year%400==0); 		if (r) 			printf("%d Yes\n", year); 		else 			printf("%d No\n", year); 		year = year + 1; 	} while (year <= upper); 	return 0; }

user: user-2
content: 引用 1 楼 自信男孩 的回复:判断if (r=0)改成if (r == 0) 除了这个你还要把r = year % 4放在do-while循环里面

user: user-3
content: = 和 == 的概念不清

user: user-4
content: 判断if (r=0)改成if (r == 0)
user-0 提问: 子函数的printf为什么没有在main里调用输出成功？

回复:
user: user-1
content: printf("参数: \np: %s\na: %s\nb: %s\nn %s\nGx %s\nGy %s\n", p, a, b, n, Gx, Gy); 肯定是变量与格式符的匹配问题

user: user-2
content: 调试一下看看，就明白了

user: user-0
content: 匹配，用到一个第三方密码学库

user: user-3
content: 格式是否匹配，从代码里看不出来～
user-0 提问: 求解

回复:
user: user-1
content: #include <iostream> int main() { 	while(true) 	{ 	   int a,int b; 	   cin>>a; 	   b = 300 - a; 	   std::cout<<b<<std::endl; 	} 	return 0; }

user: user-2
content: 搞个线程  在里面按1楼输的B = 300 - A; 执行代码   可以加延迟睡眠啥的

user: user-3
content: 写成A+B=300;是个不合法的语句。A+B是一个表达式，表达式是个右值，是不允许写在等号左边的。

user: user-4
content: 这是什么问题？

user: user-5
content: 你这种写法是错误的，A+B得到是常量，不能做左值。

user: user-6
content: B = 300 - A;
user-0 提问: 求大佬帮我看看这段代码是什么意思？

回复:
user: user-1
content: 第一问 因为最左的索引是0，假设中心索引是最左的索引0，那么它的右边元素的和是从位置1开始算的 第二问 原因和第一问相同，假设中心索引在0位置，那么右边元素的和是从位置1开始算的，也就是右边的和最大就是从位置1开始到数组最后的元素相加 第三问 上面第一第二问是假设中心索引在0位置时求出的right，那么这个中心索引不断往右移动是什么情况？i++表示中心索引右移，left+=nums[i]表示中心索引右移后，中心索引的左边多了一个元素，要加到左边的总和left里，right-=nums[i]表示中心索引右移后，右边少了一个元素，要从right减出来。至于执行顺序，你自己推算一下就可以，假设当前位置i是中心索引，中心索引右移，那么原来的i位置就成了左边的元素，所以先执行left加和，然后移动中心索引到i++位置，移动过来的i++原来是右边的元素，现在变成中心索引了，所以要从ringt里减出来

user: user-2
content: 你好好想想。 right代表是中心点右侧的数的和。 所以不用算第0个元素，因为左侧至少要包括一个元素，否则不叫对称。
user-0 提问: 程序编写

回复:
user: user-1
content: 文件读写参考  我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《C语言文件读写（1）-文本文件读操作》, 一起来围观吧 https://blog.csdn.net/zhanghaiyang9999/article/details/107032563?utm_source=app

user: user-2
content: 供参考  #include <stdio.h> #include <stdlib.h> #include <string.h> #define N 256  int main(void) { 	int temp[N] = { 0 }; 	char a[N] = { 0 }, c[N] = { 0 }, ch; 	int i = 0, j = 0, k = 0, count = 0; 	FILE *fp = fopen("test2-2.in", "r"); 	if ( !fp ) 	{ 		printf("文件读取失败！\n"); 		exit(1); 	}  	fscanf(fp, "%s", a); 	count = strlen(a); 	printf("原字符串：%s\n", a);  	for ( i = 0; i < count; i++ ) 	{ 		if ( i % 2 == 0 ) 		{ 			temp[j] = i; 			c[j] = a[i];			 			j++; 		}			 	} 	printf("下标为偶数的元素：%s\n", c);  	 	for ( i = 0; i < j-1; i++ ) 	{ 		for ( k = 0; k < j - 1 - i; k++ ) 		{ 			if (c[k] > c[k+1]) 			{ 				ch = c[k]; 				c[k] = c[k + 1]; 				c[k + 1] = ch;				 			} 		}		 	}  	for (i=0; i<j; i++) 	{ 		a[temp[i]] = c[i]; 	} 	printf("排序后字符串：%s\n", a);  	fclose(fp); 	getchar();     return 0; }
user-0 提问: 编写程序

回复:
user: user-1
content: 不贴代码，说一下思路，先调用C语言里按行读取文件的api（没有这种api就一个字符一个字符的读取知道碰到\n），到了所在行数，就一个字符一个字符的读取，以空格分割

user: user-2
content: #include <stdio.h> void disp( int );  void disp(int n) { 	int line=0;		//line：行计数器  	char ch; 	FILE*fp; 	fp = fopen("test1-2.dat","r");		//打开文本文件  	while ( line<n && (ch=fgetc(fp))!=EOF ) { 		putchar(ch);		//显示读入的字符  		if (ch=='\n')		//若读入\n则对line计数  			line++; 	} 	fclose(fp); }  int main(int argc, char** argv) { 	int i,j,k,n; 	FILE*fp; 	if ( (fp = fopen("test1-2.dat","w")) == NULL ) { //采用文本文件保存原始数据 		printf("Open file error."); 		return 0; 	} 	for (i=0; i<10; i++) {		//俺指定格式生成文件  		for (j=0; j<=i; j++) { 			k = i*4+1+j*2; 			fprintf(fp, "%4d", k); 		} 		fprintf(fp, "\n"); 	} 	fclose(fp); 	scanf("%d", &n); 	disp(n); 	return 0; } 请看看以上程序是否满足你的题目要求。

user: user-3
content: #include<stdio.h> void disp(int n) {	int i,j,k; 	FILE*fp; 	fp=fopen("test1-2.dat","rb"); 	for(i=0;i<n;i++) 	{ 		for(j=0;j<=i;j++) 		{ 			k=getw(fp); 			printf("%d\t",k); 		} 		printf("\n"); 	} 	fclose(fp); }   void main() {  	int i,j,k,n; 	FILE*fp; 	fp=fopen("test1-2.dat","wb"); 	for(i=0;i<10;i++) 	{ 		for(j=0;j<=i;j++) 		{k=i*4+1+j*2; 		putw(k,fp); 		} 	} 	fclose(fp); 	scanf("%d",&n); 	disp(n); }
user-0 提问: 一个刚学C语言的人求助

回复:
user: user-1
content: VC++6.0个人感觉挺好用的，我一直用着呢，加油！

user: user-2
content: #include <stdio.h> int mian() { 	int price = 0; //定义放在所有函数前面   	int change = 0;   //定义放在所有函数前面   	printf("请输入金额（元）:   "); 	scanf("%d",&price); 	change = 100 - price; 	printf("找您%d元\n",change); 	return 0; }

user: user-3
content: 变量先定义，请不要再使用VC++6.0了，推荐使用vs或者vscode，退而求其次用Dev-C++

user: user-4
content: 引用 6 楼 千梦一生 的回复:长见识了。原来C语言这种声明和定义必须要分开 刚去学习了一下。C99之前的标准。变量要在开头声明定义，期间不允许声明定义

user: user-4
content: 长见识了。原来C语言这种声明和定义必须要分开

user: user-5
content: 这个跟编译器版本有关，用新的编译环境试试，应该就不会报错了。

user: user-1
content: 你用的是C语言，所有变量必须在程序开始时定义。而使用C++就不存在这个问题了

user: user-6
content: 要先声明再使用

user: user-7
content: vc6.0必须把变量声明放在前面;

user: user-8
content: 因为是c语言，change需要放到前面，放到price后面就可以 int change=0;
user-0 提问: 求大神帮忙，编辑一个程序

回复:
user: user-1
content: 先试着写写，遇到问题再提出来吧～

user: user-2
content: 这些都是基础的内容吧

user: user-3
content: 排序参考一下这个 我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《C语言基础排序算法-冒泡排序》, 一起来围观吧 https://blog.csdn.net/zhanghaiyang9999/article/details/107102728?utm_source=app

user: user-0
content: 引用 1 楼 user-3 的回复:考察内容还挺多，还有排序嗯，确实不少，唉……就这个排序不知道怎么往里面加……

user: user-3
content: 考察内容还挺多，还有排序
user-0 提问: 单循环链表建立和打印有什么问题吗

回复:
user: user-1
content: 代码太多 我也没仔细看 就看了你的插入   没看见你哪里分配了内存  你只是在main函数开头分配了一个节点的结构体内存    你要在每次插入的时候都malloc分配一个内存

user: user-1
content: 现在链表插入的时候 都不用malloc 分配内存  删除的时候free 释放内存了吗 --- -- --

user: user-2
content: 为什么代码会这么多？就实现输入和打印

user: user-3
content: 代码太多太乱，没细看，但从 node*Set(node*head,node*p) //在尾部插入p节点 void Print(node*head)  这两个子函数中看到逻辑应该是有问题的。 单链表的尾结点必须指向NULL，否则你不知道单链表何时到尾。

user: user-4
content: 支持楼上。 第20行改成：node *p; 在case 1:   后面增加一行  p = (node*)malloc(sizeof(node));
user-0 提问: mysql_real_connect连接缓慢（大约需要3秒钟）

回复:
user: user-0
content: 引用 2 楼 浴火_凤凰 的回复:链接的本地数据库还是远程数据库？本地和远程，都一样慢

user: user-0
content: 连接的是同一个服务器  引用 1 楼 user-2 的回复:你俩MySQL版本一样吗？有的MySQL版本就是连接慢

user: user-1
content: 链接的本地数据库还是远程数据库？

user: user-2
content: 你俩MySQL版本一样吗？有的MySQL版本就是连接慢
user-0 提问: 经常运行c文件后.exe程序就要权限才能运行操作

回复:
user: user-1
content: 你这个应该是上一个运行的程序没关闭   打开任务管理器 看看有没有ld的进程   有的话杀掉就好了

user: user-2
content: 不过好好的Windows程序，为什么不使用vc这样的开发工具呢？

user: user-2
content: 有可能是你说的问题，你可以查看一下，另一个可能是需要administer运行程序

user: user-3
content: win下用gcc编译器，貌似编译信息无法正常显示中文阿。

user: user-0
content: 引用 3 楼 Army_Adviser_ 的回复:你这个应该是上一个运行的程序没关闭   打开任务管理器 看看有没有ld的进程   有的话杀掉就好了问题就在这里。。。。也找不到id进程，按道理应该是这问题，关机后清理进程就正常了

user: user-0
content: 引用 1 楼 Simple-Soft 的回复:有可能是你说的问题，你可以查看一下，另一个可能是需要administer运行程序 用的vs code，已经是administer账户了，感觉是进程在后台运行着。但是任务管理里边也没找到相应进程，头疼哈哈
user-0 提问: 平衡二叉树左平衡程序函数的疑惑

回复:
user: user-0
content: 我引用的这张图片，不是我上面复制的那段代码，这个其实是右平衡里的变化，我拿过来只是想说一下我当时画的时候画出来了T->bf=lc->bf=EH就这一种情况，后来发现T和lc双旋后变了位置，应该看得是变化后的那个位置的RH,EH,LH里的哪一个符合，还是谢谢您，帮助了我那么久

user: user-0
content: 现在明白这段代码的意思了，我一直当做是根节点的高度修改，却发现根节点最终被其他节点替代，应该是研究根节点变化后的高度，谢谢啦

user: user-1
content: 兄弟你那个是右旋转，并且左树的右树相等

user: user-0
content: 引用 6 楼 真相重于对错的回复:这个代码是严老师的？ 中间大多数关键函数都是严老师的，除了结构体和主函数

user: user-0
content: 这是我引用的一个博主的图片，我最终的效果就是这样的，左右子树高度相等，不知道如何出来的switch(rd->bf){ case LH:lc->bf=EH;T->bf=RH;break;

user: user-1
content: 这个代码是严老师的？

user: user-0
content: 大佬可以给画一个这段代码的变化演示图吗？我可能理解有点问题，画出来的最终都是左右一样高

user: user-1
content: 首先说一下结论，这段代码，没问题。 case RH:rd=lc->rchild; switch(rd->bf){ case LH:lc->bf=EH;T->bf=RH;break;   他的意思是，一个节点左树比右树高2，且这个节点的左子树的右子树比左子树的左节点高。 一般称之为双旋转。 旋转后节点的右部肯定要比他左部高

user: user-0
content: 嗯嗯，第一次编写，还没来得及修改，一直在纠结那个LeftBalance函数里的根节点的左子树的右子树的高度为什么这样修改，希望能得到解释

user: user-1
content: 嗯，有很多错误

user: user-0
content: 这是全部代码

user: user-0
content: //平衡二叉树 #include <stdio.h> #include <stdlib.h> #define MAXV 25 #define EH 0 #define LH 1 #dedfine RH -1 typedef char infotype; typedef int keytype; typedef struct A{ 	keytype key; 	infotype data;	//其他数据 	int bf;	//记录左右高度信息  	struct A *lchild,*rchild;  }BSTnode,*BSTtree;  //创建平衡树  BSTnode* Create(keytype *k,int n){ 	BSTnode *T;int i; 	for(i=0;i<n;i++) 		InsertBST(T,k[i],taller); 	return T; }   //RR型左旋  void L.rotate(BSTnode *&T){ 	BSTnode *rc; 	rc=T->rchild; 	T->rchild=rc->lchild; 	rc->lchild=T; 	T=rc; }  //LL型右旋  void R.rotate(BSTnode *&T){ 	BSTtree lc; 	lc=T->lchild; 	T->lchild=lc->rchild； 	lc->rchild=T; 	T=lc;  }   //左平衡 void LeftBalance(BSTnode *&T){ 	BSTnode *lc,*rd; 	lc=T->lchild; 	switch(lc->bf){ 		case LH:T->bf=lc->bf=EH;R.rotate(T);break; 		case RH:rd=lc->rchild; 			switch(rd->bf){ 				case LH:lc->bf=EH;T->bf=RH;break;  				case RH:lc->bf=LH;T->bf=EH;break; 				case EH:T->bf=lc->bf=EH;break; 			} 			rd->bf=EH;  			L.rotate(T->lchild); 			R.rotate(T);  	} }   void RightBalance(BSTnode *&T){ 	//暂时未填  } int InsertBST(BSTtree T,keytype k,int &taller){ 	if(T==NULL){ 		T=(BSTtree)malloc(sizeof(BSTnode)); 		T->lchild=T->rchild=NULL; 		T->bf=EH;T->key=k;  		taller=1;	//1表示变高  	} 	else{ 		if(k==T->key){ 			return 0; 			taller=0; 		}  		else if(k<T->key){	//插入左子树  			if(!InsertBST(T->lchild,k,taller))	return 0; 	//插入失败  			if(taller){	//树变高  				switch(T->bf){ 					case EH:taller=1;T->bf=LH;break;	//原本左右子树等高，现在左子树高  					case LH:taller=0;LeftBalance(T);break;			//左平衡  					case RH:taller=0;T->bf=EH;break;				 				} 			} 		} 		else{	//插入右子树  			if(!InsertBST(T->rchild,k,taller))	return 0; 	//插入失败  			if(taller){	//树变高  				switch(T->bf){ 					case EH:taller=1;T->bf=RH;break;	  					case LH:taller=0;T->bf=EH;break;			  					case RH:taller=0;T->bf=EH;RightBalance(T);break;	//右平衡			 				} 			}			 		} 	} 	return 1; }   int main(){ 	int taller;	//记录树是否长高，1为长高 	keytype k[MAXV];int i,n;  	printf("请输入插入的数的个数\n"); 	scanf("%d",&n);  	for(i=0;i<n;i++){ 		printf("请输入第%d个数\n",i+1); 		scanf("%d",&k[i]);  	} 	BSTtree T; 	T=Create(k,n);  	return 0; }

user: user-1
content: 具体没看到你的全部代码，无法回答。

user: user-0
content: 就是我注释的地方，为什么要将T的左子树高度赋值成EH（左右子树相等），然后T的高度为RH（右子树高）。

user: user-1
content: 没看懂你在说啥，
user-0 提问: unresolved external symbol

回复:
user: user-0
content: 我有点弄晕了，这个简单的函数我后来又试了一下是没问题的，因为我一开始在函数里面有参数，我记得声明时可以只写类型不写参数名称，编译时遇到问题，检查了几遍不知道啥问题，后来才发现是声明时没写参数名，可能我用的编译器版本太老标准太老，总之我记得现在大多数在声明时可以只写类型的，可能早期标准必须声明和定义一模一样吧，谢谢大家了，调来调去有时候真想不到问题出在哪里

user: user-0
content: 我有点弄晕了，这个简单的函数我后来又试了一下是没问题的，因为我一开始在函数里面有参数，我记得声明时可以只写类型不写参数名称，编译时遇到问题，检查了几遍不知道啥问题，后来才发现是声明时没写参数名，可能我用的编译器版本太老标准太老，总之我记得现在大多数在声明时可以只写类型的，可能早期标准必须声明和定义一模一样吧，谢谢大家了，调来调去有时候真想不到问题出在哪里

user: user-1
content: 你都可以用hrec的其他函数了  那应该是没有问题的    是不是你修改的了文件没有编译到  你要不把文件删除再编译  报错后再恢复 重新编译  这样确保编译器识别了你的修改

user: user-2
content: 对编译和链接的理解还是很成问题的。学校里好象不教这些东西吧？ 引用头文件只是帮助编译器识别函数的“样子”并顺利产生目标文件，这一阶段只是决定如何调用函数，不需要知道函数的实际位置和内容。 但是在链接阶段，链接器需要找到函数的定义。 想一想，这两步，卡在哪一步了。

user: user-3
content: make编译得包含实现文件

user: user-0
content: 我自己建了个工程试了一下也没问题，我觉得只要找到了函数声明，工程会在整个工程内部自己找定义，不知道为啥这里不行。可是hrec.c的其他函数能调用啊，我读的这套程序比较老了，而且还是用nmake编译，头大

user: user-0
content: 我自己建了个工程试了一下也没问题，我觉得只要找到了函数声明，工程会在整个工程内部自己找定义，不知道为啥这里不行。可是hrec.c的其他函数能调用啊，我读的这套程序比较老了，而且还是用nmake编译，头大

user: user-4
content: //h 文件  #include "stdio.h" void teset(void);  //c文件  #include "text.h" void teset(void) {     printf("AA"); }   //主程序  #include "stdio.h" #include "text.h"  int main() { 	while(1) 	{ 		teset(); 	} }    测试没有问题.
user-0 提问: 请问用C语言四则计算，怎么同时得到商数和余数？

回复:
user: user-0
content: 引用 10 楼 chxchxkkk的回复:被除数下面的 scanf("%d", &a); 你把&a也写到双引号里了 大哥，括号后面都要;吗

user: user-1
content: 被除数下面的 scanf("%d", &a); 你把&a也写到双引号里了

user: user-0
content: 引用 7 楼 宇来风满楼的回复:[quote=引用 6 楼 luoquxin的回复:][quote=引用 1 楼 宇来风满楼 的回复:]建议百度啊 兄die，帮我看下哪错了 [/quote] 第7行吧啊啊啊[/quote] 咋改？？？？？？

user: user-0
content: 引用 7 楼 宇来风满楼的回复:[quote=引用 6 楼 luoquxin的回复:][quote=引用 1 楼 宇来风满楼 的回复:]建议百度啊 兄die，帮我看下哪错了 [/quote] 第7行吧啊啊啊[/quote] 咋改？？？？？

user: user-2
content: 引用 6 楼 luoquxin的回复:[quote=引用 1 楼 宇来风满楼 的回复:]建议百度啊 兄die，帮我看下哪错了 [/quote] 第7行吧啊啊啊

user: user-0
content: 引用 1 楼 宇来风满楼 的回复:建议百度啊 兄die，帮我看下哪错了

user: user-0
content: 引用 3 楼 chxchxkkk的回复:43 % 3 余数 这只是求余，还要求商

user: user-0
content: 这只是求余，还要求商

user: user-1
content: 43 % 3 余数
user-0 提问: 为什么2020年了C语言教材还用VC6.0

回复:
user: user-1
content: 最大的不同是for语句里的变量的生存周期。VC6的是外部的，VC2003以上就是for 块内了。这导致了不兼容性

user: user-0
content: 引用 8 楼 江南蜡笔小新 的回复:现在还用VC6，谭老师的教材吧？明日科技

user: user-2
content: 因为VC6教学用比较合适，内容少，对电脑配置要求也低，不过就是标准比较老，还是用的C++98的标准。不过一般来说现在的新的也基本兼容老的，学习来说还是勉强可以用的。

user: user-3
content: 交的是基础是原理

user: user-4
content: 知识点是最基础的，入门再说

user: user-5
content: 我敢说如果让你用命令行敲gcc，你还不一定会用，而且会打击你继续学习C语言的信心

user: user-0
content: 也有很多适合新手的比如DevC++，或者主流的visual studio，设置起来不麻烦啊

user: user-6
content: 其实应该改革下的，仅就操作而言，vc6和vs蛮多地方还是不一样的。不求最新的vs2019，升级到vs2010还是可以的。只是某些人太懒了，另外就是操作起来比较麻烦（体制原因）。

user: user-7
content: 至少现在自己在教研室做项目用的visual studio 2017，周围没有人用VC6.0之类的

user: user-8
content: 没用过vc6，最开始用dev，后来就用vs

user: user-9
content: 不少高校教师照本宣科，学习新的成本他们不想负担，毕竟还要批改作业。

user: user-10
content: vc6挺好，简单小巧，轻量级。学习够用即可。 哪天感觉vc6用着没对了，就可以换了，那时候就不是老师们教了。  vs呀什么什么的，写代码很好 啊。但跟学C语言又有什么关系

user: user-11
content: vc++6.0绿色免安装版，占用内存小，界面简单，我一直用她

user: user-12
content: 高版本的VC应该也支持低版本的吧

user: user-13
content: 楼上那些说VC6只是工具，用什么都可以的，应该不是老师就是学生吧。 如果是学生，以后你要是参加了工作，执意要在公司里用VC6，说是你习惯这个，看公司的项目经理能容得下你不； 如果是老师，自己不行就算了，还要耽误学生前途，其心可诛。

user: user-14
content: 都是工具而已，编写过程只有些许差别，看个人习惯或者企业需求

user: user-15
content: 代码就算过不了也只是小改动  一些格式定义啥的变动吧   我觉得 你学的好  随便改改就能用了  原理一直都没变

user: user-16
content: 我自己感觉可能有下边几个原因： 1、学校的教材，注重的是稳定性、正确性等，而不是追求新；学校教的知识，是需要经过很多次沉淀的。 2、第二点我认为老师教的知识基础、方法等，如果掌握了这些，后边再怎么变化，也能应对自如；如果说什么东西有新的出来，就立马当做教材，一方面是教学客观上不太现实，因为教材的编著、审核什么的，本身周期就很长，可能这本教材还没出来，下一个新的版本就又出来了。这样的话，只能以某一版本作为教学的基础，等后边如果时间太长了，再次进行升级替换。 3、我不反对楼上说的几点，只是提出我自己另外的思考。  就这么多了，纯属自己的个人观点~，希望对你有帮助！

user: user-17
content: 因为vc6可以用

user: user-18
content: 只有人去适应知识，哪有知识来适应人呢？你用的工具是vc2019，它用的是gcc，还有人用devc，千奇百怪，知识还是那些知识，遇到通不过的，稍微调整一下就好

user: user-13
content: 引用 3 楼 user-18 的回复:有什么关系呢？知识还是那些知识 说得对极了。不管是用原始的镰刀收割，还是用现代化的大型联合收割机，都是将庄稼从地里收回来，脱粒，变成粮食。
user-0 提问: 指针题目-这个题目是怎么算的？

回复:
user: user-1
content: int k=7,m=5; void f(int **s) {     int *t,t=&k;             t指向k     s=&t;                     二级指针s重新指向一级指针t      *s=&m;                 *解引用降级即二级指针s 变为1级指针t 然后将一级指针t指向了m 同时 二级指针s仍然指向的t     printf("%d,%d,%d\n",k,*t,**s);   统计以上 s->t, t->m,  k没有被改变  所以是755 } int main(int argc, char **argv) {     int i=3,*p=&i, **r= &p;     f(r);       要改变2级指针r的指向只能去使用3级指针（但本可以改变i的值 因为**r存储了i的地址  可是f函数中将传入的s重新指向了也就丢掉了i的地址） 所以f函数运行完 指针r仍然是指向指针p的      printf("%d,%d,%d\n", i,*p,**r);     所以最终结果仍然是 333     return 0; }

user: user-2
content: 首先r传给s之后，s和r是两个相互独立的指针。s就是f函数里的局部变量。因此f中对s的修改不影响main函数里的r  t = &k; t里存放了k的首地址。s = &t;那么s 里存放了t的首地址。到这一步，把k, *t, **s打印出来，应该是7, 7, 7; *s = &m;此时*s即t。即t里存放了m的首地址。这样，k, *t, **s打印为7,5，5
user-0 提问: for语句问题求解

回复:
user: user-0
content: 搞懂了 nice!

user: user-1
content: 按照你的思路设计应该是想这样吧 int main() { int i,j,k; k=0; for(i=1,j=100;i<=50;i++,j--) { k+=i+j; } printf("%d\n",k); return 0;	 }

user: user-2
content: 你上面的K每次循环的值都为i+j=101，而下面的是累加，看得出来效果，你把j--改成j++，就看得出来效果了

user: user-3
content: k=i+j; 注意一下，循环体是赋值，不是k += i + j; 另外，你怎么知道循环体只执行了一次。如果只执行一次，就因为是k的输出值应该是101吗？因为i为100时，j正好为1了吧。 所以，不是只执行了一次，而是执行了100次，不信，可以在循环体里多加一条打印语句，比如加一条 printf("helloworld!\n"); 看输出几次。

user: user-0
content: 那我是不是要得出5050还得来个变量累加50次k

user: user-1
content: 想啥呢  上面的也循环了100次啊  你不信可以把pritf加到循环里面去  只是你一个加一个减 所以得出了的结果只会是101 int main() { int i,j,k; for(i=1,j=100;i<=100;i++,j--) { k=i+j; printf("%d\n",k); } return 0;	 } 这样你就能看到100条输出了
user-0 提问: 求解 哪里错了 。。

回复:
user: user-1
content: p1 = &a; p2 = &b; p3 = &b;  确实是上面这个地方没改成c，刚才该多来测试了一下就是对的，输出为3 2 1

user: user-2
content: 引用 5 楼 Army_Adviser_ 的回复:exchage函数写错了  void exchage(int* c1, int* c2) { int *t = NULL; t = c1; c1 = c2; c2 = t; } 楼主的没有把c地址赋值给p3。 如果按照你的修改，输出的结果是1 2 3，顺序没变。建议测试一下

user: user-3
content: p3改成取c的地址，我这里用楼主代码运行结果是3  2  1

user: user-4
content: p1 = &a; p2 = &b; p3 = &b; 还有你p3没取c的地址诶

user: user-0
content: 引用 1 楼 qiu_shaofeng的回复:这是什么疑惑呢 按 大小顺序输出  想知道哪来错了  抱歉没表述完整

user: user-0
content: 引用 1 楼 qiu_shaofeng的回复:这是什么疑惑呢 按 大小顺序输出  想知道哪来错了  抱歉没表述完整

user: user-0
content: 引用 1 楼 qiu_shaofeng的回复:这是什么疑惑呢 按 大小顺序输出

user: user-3
content: 这是什么疑惑呢
user-0 提问: CENTOS7.4  环境中的C语言程序中  如何将一个int型变量的最低字节的值赋值给一个byte型变量

回复:
user: user-1
content: 1楼说的强制char赋值也能实现的   16位强转8位 系统会自动丢掉8位 至于是高八位丢掉还是低8位丢掉就要看系统是大端模式还是小端模式

user: user-2
content: 1、确定平台的大小端问题。有些是大端，有些是小端。 2、确定平台中字节的位数问题。历史上极个别平台一个字节7位，不过现在基本没有了。 3、确定平台中int是多少位的。有些平台int是16位的，有些是32位，说不准还有64位的。

user: user-3
content: a & 0xff;就是a高位全0，低8位（低字节）保留。  跟进制没关系，内存中存放的都是二进制，随意跟16进制没关系。

user: user-1
content: 如果要取前8位可以这样  int   a = 0x1234 ; byte b = (a>>8)&0xFF ;

user: user-1
content: int   a = 0x1234 ; byte b = a&0xFF ;  这样位操作不就好了

user: user-4
content: 不知道题目是不是有问题。  我的思路是这样的：变量a是int型，如果是十进制的，可以在转成十六进制的过程中将每位的字符存到数组中，比如，十进制4660对应十六进制0x1234，存到数组中的数据就是a[4]={4,3,2,1}，接着再去给b赋值。  我疑问的是，你说b是byte型，也就是char型，将一个十六进制数强行赋值给它，本身就会发生强制类型转换。  看看楼下怎么说。。。
user-0 提问: 算法题求解

回复:
user: user-1
content: k=*(a+M-1);                          //把数组最后一个元素赋值给变量k   for (j=M - 1; j >=0; j--) {    *(a + j +1)= *(a + j);          //循环把数组元素向后移动一位   }   *a = k;                                //数组首元素的值现在是原数组最后一位了

user: user-2
content: *（a+j+1）=*（a+j）  好像越界了，出现了*(a+4)    *(a+m)相当于a[m]  意思是打印a[0],a[1],a[2],a[3]  *(a+......)可以用a[......]代替  这样应该会好理解一点
user-0 提问: 取消对NULL指针xxx的引用

回复:
user: user-1
content: inputpart1指向了局部变量，因为局部变量的生命周期是从定义开始到函数返回结束，因此输出已经无效的局部变量是未定义性行为～

user: user-2
content: 楼上说得对。代码稍微修改了一下。 #include<stdio.h>  void splitfloat(float x, int *intpart, float *fracpart) {     int count = 0;     while (x >= 1) {         count++;         x -= 1;     }     *intpart = count;     *fracpart = x; } int main(void) {     float x, fracpart1;     int intpart1;     printf("Enter a number: ");     scanf_s("%f", &x);     splitfloat(x, &intpart1, &fracpart1);     printf("intpart is %d, fracpart is %f\n", intpart1, fracpart1);     return 0; }

user: user-3
content: 临时变量地址赋给了指针
user-0 提问: 指针数组做main函数参数的问题

回复:
user: user-1
content: argv相当于&argv[i]，要实现楼上结果，需要 printf（“%s\n”，*argv）;

user: user-0
content: 也就是说系统调用的时候不会把argv的首地址传给main函数是吧，还是得在程序中定义一个指针指向argv的首地址对吧

user: user-2
content: 需要分析一下argv的类型，类型是char *[];即指针数组，从楼主的用例上看，楼主的argv数组长度是5. 那么需要了解一下argv++;是偏移多少个字节，楼主想实现argv[0]->argv[1]->argv[2]。。。这样偏移吧，偏移的量是sizeof(argv[0]); 但是argv++;那就是偏移5 * sizeof(argv[0]);已经越界了。所以显示乱码是应为越界是未定义行为；   char *p = argv[0]; while (argc > 0) {     p++;     printf("%s\n", p); //这儿也不应该是argv呢，也应该是argv[0]orargv[i]呢     argc--; }       int i = 0;      while (i < argc) {         printf("%s\n", argv[i]);         i++;     } 供参考～
user-0 提问: Leetcode 5.最大回文，运行成功，但却提交错误

回复:
user: user-0
content: 很抱歉，我经验不足，忘记贴上题目了，现在补一下。 空字符串确实没没考虑到，感谢指导，我去试试。

user: user-1
content: 没考虑空字符串的情况。

user: user-2
content: 你的第5题的需求在哪呢？那儿的第5题？
user-0 提问: 向CMD窗口发送CTRL+C（按下CTRL+C没有执行回调函数就退出了）？

回复:
user: user-0
content: 谢谢回复。 我按下ctrl+c后，出现异常，如图, 这是怎么回事？

user: user-1
content: void main( void ) {  if( SetConsoleCtrlHandler( (PHANDLER_ROUTINE) ConsoleHandler, TRUE ) )  {   printf( "\nThe Control Handler is installed.\n" );   printf( "\n -- Now try pressing Ctrl+C or Ctrl+Break, or" );   printf( "\n    try logging off or closing the console...\n" );   printf( "\n(...waiting in a loop for events...)\n\n" );    while( 1 ){ }  }  else   printf( "\nERROR: Could not set control handler"); } SetConsoleCtrlHandler的使用  换成上面这样就可以了。另外别在vs上面用debug调试，直接编译好，然后双击exe运行。
user-0 提问: 关于奇偶链表的问题

回复:
user: user-1
content: 如果你的链表是偶数个，那么在用q来判断的话，q指向倒数第二个的时候，p其实已经指向了倒数第一个，q指向倒数第二个它不是NULL，它的next也不是NULL，所以满足while的条件，这时候对p执行p->next=p->next->next,则出错

user: user-1
content: 我说的有问题。。。。忽视

user: user-1
content: 如果改成q!=NULL.... 那么你的代码逻辑错误 到了最后一个节点他依然不是空 q->next=q->next->next就会出错。。。因为q->next是NULL，

user: user-2
content: p和q一样吗？不一样
user-0 提问: C语言-单个字符转ASCII值输出问题

回复:
user: user-1
content: 你已经输入了2次了   第一次是2  第二次是回车键 也就是换行 ascii值就是10

user: user-2
content: 键盘输入2回车，变量a读到回车。 char a；后面加一句getchar（）；

user: user-0
content: 引用 1 楼 user-2 的回复:读到了一个换行符 什么意思？说细一点，谢谢啦

user: user-2
content: 读到了一个换行符
user-0 提问: 求助，scanf无效

回复:
user: user-1
content: i改变了，abc没有改变 可以参考这份代码: #include <stdio.h>  int main() {     int i = 0;     for (;;) {          scanf("%d", &i);         int a = i / 100;         int b = i % 100 / 10;         int c = i % 10;         getchar();         if (i == a * a * a + b * b * b + c * c * c) {             printf("%d是水仙花数\n", i);         }         else {             printf("%d不是水仙花数\n", i);         }     }     getchar();     return 0; }

user: user-2
content: 在scanf前加一句rewind(stdin);
user-0 提问: 程序改错

回复:
user: user-1
content: //#include "stdio.h" #include <stdio.h>   int sort(char *p,int m ) {     int i;     char change , *p1, *p2;     for(i=0;i<=m/2;i++)     {         p1=p+i;         p2=p+(m-1-i);         change=*p1;         *p1=*p2;         *p2=change;     }      return 0; } //main( ) int main() {     int i,n;     char *p,num[20],temp;      printf("Enter n:");     scanf("%d",&n);     temp=getchar();     printf("Enter num[0] num[1] ... num[%d]:",n-1);     for (i=0;i<n;i++)         //scanf("%s",&num[i]);         scanf("%c", &num[i]);     p=num;     sort(p, n);     printf("Result is:\n");     for(i=0;i<n;i++)         //printf("%s ",num[i]);         printf("%c ",num[i]);     return 0; } 供参考～

user: user-2
content: 引用 楼主 Fqxxh的回复:#include "stdio.h" int sort(char *p,int m ) {      int i;     char change , *p1, *p2;     for(i=0;i<=m/2;i++)    {          p1=p+i;         p2=p+(m-1-i);         change=*p1;         *p1=*p2;         *p2=change;    } } main( ) {     int i,n;     char *p,num[20],temp;     printf("Enter n:"); 	scanf("%d",&n);     temp=getchar();     printf("Enter num[0] num[1] ... num[%d]:",n-1);     for (i=0;i<n;i++)         scanf("%s",&num[i]);     p=num;     sort();     printf("Result is:\n");     for(i=0;i<n;i++)         printf("%s ",num[i]); } 学习一下调试技术

user: user-3
content: sort没传参
user-0 提问: 重定义为什么不报错

回复:
user: user-1
content: 加上extern，那就不是定义了，而是声明。  如果全局变量不在文件的开头定义，有效的作用范围将只限于其定义处到文件结束。如果在定义点之前的函数想引用该全局变量，则应该在引用之前用关键字 extern 对该变量作“外部变量声明”，表示该变量是一个已经定义的外部变量。有了此声明，就可以从“声明”处起，合法地使用该外部变量

user: user-2
content: 大佬牛啊！

user: user-3
content: 你试一下这样的代码都不会报错 int bbb; int main(){   int bbb;   {     int bbb; } } 因为c++变量作用域在他最近的大括号下

user: user-4
content: 这个extern不是没有生效吗？

user: user-3
content: 作用域不一样，不是同一个变量，不会抱错

user: user-4
content: 没必要纠结这些     这是编译器严谨的问题    有些编译器不会包容  有些则会     你这个只是重复声明    你在.h文件中将bbbb赋值自然会报错    当然 只能说你这个编译器不够严谨  包容了这个小问题

user: user-0
content: VS是extern了但是我在KEIL里还是定义

user: user-0
content: extern  没有生效

user: user-5
content: 因为是extern了

user: user-0
content: .c 文件  #define	_RTC_APP_C_  #include "pch.h" #include <iostream>  int bbbb; //这里定义了    pch.h也定义了  为什么不报重定义  int main() {      	bbbb = 9999; 	std::cout << bbbb; 	system("pause"); }  .h文件 #ifndef PCH_H #define PCH_H #ifdef	_RTC_APP_C_ //在.c里定义 #define	_RTC_APP_E_ #else #define	_RTC_APP_E_	extern #endif //为什么这个不会报重定义错 _RTC_APP_E_  int bbbb;  #endif

user: user-0
content: 重定义为什么不报错
user-0 提问: 在ARM上和DSP上做memcpy的速度问题

回复:
user: user-0
content: 引用 3 楼 早打大打打核战争 的回复:总线带宽、内存频率考虑了吗  ARM DSP 在同一块芯片上，总线带宽和内存是一样的。 怀疑1 memcpy库针对arm有优化，但是对于DSP没有。        2 DSP 是dma 没有打开cache，无法cache预读取。

user: user-1
content: 总线带宽、内存频率考虑了吗

user: user-2
content: 你確定性能在同一級別？

user: user-3
content: 会不会可能跟其他的硬件差异有关系，比如cpu，内存等等
user-0 提问: 求助  为何会出现这种情况  要咋搞得  急急急！！！

回复:
user: user-1
content: 程序中最好不使用“fflush(stdin);”这样的函数调用。

user: user-2
content: 嗯，，，，兄弟你倒是要问清楚到底是什么问题

user: user-3
content: 代码发全吧，问题描述清楚一些吧～
user-0 提问: 关于使用pthread_detach后出现Segmentation fault的问题

回复:
user: user-1
content: #include <stdio.h> #include <unistd.h> #include <pthread.h>  void *mythread1(void *) {     int i;     pthread_detach(pthread_self());     for(i=0;i<10;i++)     {         printf("this is the 1 pthread,created by zhouzheng!\n");         sleep(1);     }     pthread_exit(NULL); }  void *mythread2(void *) {     int i;     pthread_detach(pthread_self());     for(i=0;i<10;i++)     {         printf("this is the 2 pthread,created by zhouzheng!\n");         sleep(1);     }     pthread_exit(NULL); }  int main() {     int i=0;     int ret =0;     pthread_t id1,id2;     //ret = pthread_create(&id1,NULL,(void*)mythread1,NULL);     ret = pthread_create(&id1,NULL,mythread1,NULL);     if(ret) {         printf("Create pthread error!\n");         return 1;     }     //ret = pthread_create(&id2, NULL, (void*)mythread2,NULL);     ret = pthread_create(&id2, NULL, mythread2,NULL);     if(ret) {         printf("Create pthread error!\n");         return 1;     }     // pthread_join(id1,NULL);     // pthread_join(id2,NULL);     for(;;)     {         printf("this is main pthread\n");         sleep(1);     }     printf("Programme is end!\n");     return 0; }  供参考～  用这个代码试试

user: user-2
content: 把detach放到main里面
user-0 提问: C语言读写文件

回复:
user: user-0
content: 感谢，数组长度不对

user: user-1
content: 为什么两次输出的d[i]会不一样呢？

user: user-2
content: 1、d数组长度为nb_input，而循环中使用值为nb_output，请核实是否两个数值相同。 2、数组未初始化，不能直接输出结果，请留意是否有初始化语句。
user-0 提问: 关于LeetCode相交链表的问题

回复:
user: user-1
content: 代码有逻辑问题， 例如：两个链表都有5个元素 a的第三个元素和b的第四个元素相交； 你的循环从头开始，每次移动一个，那么他们两个永远不会相比较，因为每次都是1节点和1节点比，2和2，3和3

user: user-2
content: 这个代码太不科学了，得遍历多少次才能找到啊
user-0 提问: LeetCode上好多题都不会咋整啊

回复:
user: user-1
content: 加油

user: user-2
content: 刚开始照着敲就好了，开始有思路就行，后面在慢慢自己写，然后对比差距和思路，写多了，就好了

user: user-3
content: 复习好基础知识，从easy题开始做。

user: user-4
content: 题和书本差距挺大的

user: user-5
content: 努力的不够，写的不够，基础不够夯实。所以，努力吧～
user-0 提问: 链表删除尾节点

回复:
user: user-1
content: 学习了一下，发现确实是O（n）。有个人回答的非常有理。  🤔确实单循环链表删除队尾元素都是O（n），因为均需要找到队尾的前驱结点，而找到队尾前驱结点一步是做不到的，均需要遍历。🤔另外好像有一个容易混淆的地方。就是仅设置头指针的循环单链表，查找表尾结点是O（1），删除表尾结点是O（n）。（删除需要找前驱并改变其next域指向，而查找不需要找前驱）

user: user-0
content: 引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 user-3 的回复:]因为删除以后，还要把被删除节点的上一个节点执行被删除节点的下一个节点，不能直接删除。必须遍历，因为是单循环 有理～[/quote] 比较有道理

user: user-2
content: 引用 3 楼 user-3 的回复:因为删除以后，还要把被删除节点的上一个节点执行被删除节点的下一个节点，不能直接删除。必须遍历，因为是单循环 有理～

user: user-3
content: 因为删除以后，还要把被删除节点的上一个节点执行被删除节点的下一个节点，不能直接删除。必须遍历，因为是单循环

user: user-2
content: 知道头，知道尾，并且是一个循环链表，那么删除尾节点不很好处理吗？直接删除不就好了吗？还需要循环遍历一次链表吗？  引用 1 楼 user-3 的回复:单循环应该都是N，因为删除任意一个都要遍历

user: user-3
content: 单循环应该都是N，因为删除任意一个都要遍历
user-0 提问: 链表

回复:
user: user-1
content: 楼主的问题好像从上面的代码看不出来什么。m是指向初始的链表，p已经是指向了下一个节点了。如果不是这个原因，那么楼主需要提供更多的代码～

user: user-2
content: 因为z 和 p 指向同一地址

user: user-0
content: 引用 1 楼 user-3的回复:因为p=p->next 哦，那为啥p里面没有1呢

user: user-3
content: 因为p=p->next