Question: 数据结构中引用和指针的区别

引用必须赋初值，且不能改变，而指针可以。

而且引用这个概念就是编译期，也就是说是语言层面的  引用 6 楼 ctrigger 的回复:[quote=引用 5 楼 真相重于对错 的回复:]引用和指针不能完全互换。否则c++不会引入这个多余的盲肠 举个例子 class A{   public:     A& operator=(const A& rh);     A operator+(const A& rh); } A a,b,c,d,e; 如果用指针，怎么写出   a=b=c=d+e;  “C++中引用的本质，通过反汇编手段揭示了引用的底层实现机与指针实质是一样的。” 也就说明引用的底层实现用的就是指针。你觉得指针行不行呢？？？[/quote] 如果不考虑语言，只考虑最后编译的结果的，当然可以，但是那样，为何我们要发明高级语言，不直接用汇编，甚至用01呢。

引用 6 楼 ctrigger 的回复:[quote=引用 5 楼 真相重于对错 的回复:]引用和指针不能完全互换。否则c++不会引入这个多余的盲肠 举个例子 class A{   public:     A& operator=(const A& rh);     A operator+(const A& rh); } A a,b,c,d,e; 如果用指针，怎么写出   a=b=c=d+e;  “C++中引用的本质，通过反汇编手段揭示了引用的底层实现机与指针实质是一样的。” 也就说明引用的底层实现用的就是指针。你觉得指针行不行呢？？？[/quote] 我说的是语言，建议了解一下c++的重载操作符。

没有c/c++,汇编一样编程，没有汇编，扎纸带一样编程，不要太纠结这个

没有引用，只有指针的时候 也能编程，不要太纠结这个

引用 5 楼 真相重于对错 的回复:引用和指针不能完全互换。否则c++不会引入这个多余的盲肠 举个例子 class A{   public:     A& operator=(const A& rh);     A operator+(const A& rh); } A a,b,c,d,e; 如果用指针，怎么写出   a=b=c=d+e;  “C++中引用的本质，通过反汇编手段揭示了引用的底层实现机与指针实质是一样的。” 也就说明引用的底层实现用的就是指针。你觉得指针行不行呢？？？

引用 3 楼 Minikinfish 的回复:引用比指针快 是不是说反了啊？？？ 引用的底层实现也是靠指针。指针直接暴力，当然更高效益一点。

引用比指针快

楼上分析很棒。。 我个人觉得还是用指针醒目，看起来更自然一点。

能用引用的地方，都可以用指针。用指针的地方也可以用引用。 不过，引用是C++独特的（相对于C语言），C语言不支持这种语法。所以，你的讨论应该是在C++的范围内。  引用是丰富了指针的功能，可以用另一种形式来表达指针的作用。个人观点，供参考。 建议楼主详细的了解引用的定义，指针的定义以及在传递参数的区别与相同点，以及在内存中是否占用内存，占用多大内存等等这些信息


Question: Lua语言如何随机取文本内容

宿主语言中实现，给lua提供接口

用C/C++吧，很多人会告诉你的。


Question: 可能与static相关的一个问题

引用 7 楼 Daydream_realize 的回复:[quote=引用 4 楼 自信男孩 的回复:]这个问题跟有没有static没有关系，建议楼主试一下把ch改成unsigned int ch;再测试任何情况：1）加static和不加；2）加int i = 0;和不加int i = 0;（注释掉）；  个人认为（测试一样）是一样的，不会出现全是1的问题。  原因是%x是对unsigned int而言的，如果用unsigned char去接收这个输入的值，那么势必会越界呢，并且ch和len很近，所以越界先覆盖的就是len变量；  为了解决这个问题，把ch定义为unsigned int比较妥当，因为这样不会出现越界问题，也不会出现不可判定的问题。  当然，加不加int i = 0;和static的问题都是这个引起的。  unsigned int char ch;就是原来的代码，但是原来代码在赋值的时候又加了一个强制类型转换(unsigned char)ch，所以我很奇怪为什么不直接用unsigned char ch，才做了这些试验。 不太明白你说的势必会越界的问题，char有8bit位，%1x只有4bit位，怎么会越界呢？[/quote]  注意%x，先不要考虑前面的1,只是这个就要求是unsigned int，你的编译器不给你提示吗？

我前边已说了，你错误的使用了这函数，由于不同编译器的处理不一定相同，因此出现什么样的情况都是可能的。如果想具体了解为什么建议去学一下汇编。就好比闯红灯，你是使用错误的在马路上通行方式，那么被撞，或者不被撞都是可能的。  引用 14 楼 Daydream_realize 的回复:那么另一个问题来了，详见帖子最后一图， 当我把第二个变量定义语句： static unsigned char input[300]; 的static去掉，改为： unsigned char input[300]; 程序又能正常运行了，这是为什么呢？

应该是跟您的编译器有关系，VS2015 C++环境 int main() { 	int i = 0; 	static unsigned char input[300]; 	int len = 0; 	unsigned char ch;  	while (scanf("%1x", &ch) == 1) { 		input[len++] = ch; 		printf("%d ", len); 	} 	return 959; }

一个c/c++程序变量分别存储在栈，堆，以及全局数据区。不同的编译器做法并不一定完全一致。 比如你这个问题，其实是涉及到站  引用 12 楼 Daydream_realize 的回复:[quote=引用 9 楼 真相重于对错 的回复:]%1x 不代表只输入一个字节宽度，而代表只接受输入的第一个字符.但是它把输入变量当作一个整形来处理，而不是一个字符型。 做个简单例子就是 unsigned char ch[4]={0xff,0xff,0xff,0xff}; scanf("%1x",ch[0]); ======= 你输入3的时候，他会把后面的数据冲掉，ch变成{0x3,0x0,0x0,0x0}; 这样说来，scanf是一个特别危险的函数了吗？ 万一scanf("%d", ch);   ，而ch是一个char类型，那么程序甚至可能出现段错误？这也太危险了吧，那scanf这种函数就不应该存在啊！[/quote] scanf本来就是有漏洞啊现在一般都用scanf_s来避免出现问题，c语言对于计算机控制比较强大，就好比让一个小朋友拿把刀，因为容易把自己伤了，于是就不让刀出现？你的问题不是因为scanf危险而造成的，而是你错误的使用了scanf。

引用 11 楼 自信男孩 的回复:[quote=引用 7 楼 Daydream_realize 的回复:][quote=引用 4 楼 自信男孩 的回复:]这个问题跟有没有static没有关系，建议楼主试一下把ch改成unsigned int ch;再测试任何情况：1）加static和不加；2）加int i = 0;和不加int i = 0;（注释掉）；  个人认为（测试一样）是一样的，不会出现全是1的问题。  原因是%x是对unsigned int而言的，如果用unsigned char去接收这个输入的值，那么势必会越界呢，并且ch和len很近，所以越界先覆盖的就是len变量；  为了解决这个问题，把ch定义为unsigned int比较妥当，因为这样不会出现越界问题，也不会出现不可判定的问题。  当然，加不加int i = 0;和static的问题都是这个引起的。  unsigned int char ch;就是原来的代码，但是原来代码在赋值的时候又加了一个强制类型转换(unsigned char)ch，所以我很奇怪为什么不直接用unsigned char ch，才做了这些试验。 不太明白你说的势必会越界的问题，char有8bit位，%1x只有4bit位，怎么会越界呢？[/quote]  注意%x，先不要考虑前面的1,只是这个就要求是unsigned int，你的编译器不给你提示吗？[/quote] 编译器没有提示。 这样说来，scanf是一个特别危险的函数了吗？ 万一scanf("%d", ch);   ，而ch是一个char类型，那么程序甚至可能出现段错误？这也太危险了吧，那scanf这种函数就不应该存在啊！

引用 9 楼 真相重于对错 的回复:%1x 不代表只输入一个字节宽度，而代表只接受输入的第一个字符.但是它把输入变量当作一个整形来处理，而不是一个字符型。 做个简单例子就是 unsigned char ch[4]={0xff,0xff,0xff,0xff}; scanf("%1x",ch[0]); ======= 你输入3的时候，他会把后面的数据冲掉，ch变成{0x3,0x0,0x0,0x0}; 这样说来，scanf是一个特别危险的函数了吗？ 万一scanf("%d", ch);   ，而ch是一个char类型，那么程序甚至可能出现段错误？这也太危险了吧，那scanf这种函数就不应该存在啊！

引用 2 楼 Minikinfish 的回复:是的啥编译器？scanf 的%x格式，默认输入是int*参数，楼主传的是char*，怀疑内存被改坏了 gcc编译的

引用 4 楼 自信男孩 的回复:这个问题跟有没有static没有关系，建议楼主试一下把ch改成unsigned int ch;再测试任何情况：1）加static和不加；2）加int i = 0;和不加int i = 0;（注释掉）；  个人认为（测试一样）是一样的，不会出现全是1的问题。  原因是%x是对unsigned int而言的，如果用unsigned char去接收这个输入的值，那么势必会越界呢，并且ch和len很近，所以越界先覆盖的就是len变量；  为了解决这个问题，把ch定义为unsigned int比较妥当，因为这样不会出现越界问题，也不会出现不可判定的问题。  当然，加不加int i = 0;和static的问题都是这个引起的。  unsigned int char ch;就是原来的代码，但是原来代码在赋值的时候又加了一个强制类型转换(unsigned char)ch，所以我很奇怪为什么不直接用unsigned char ch，才做了这些试验。 不太明白你说的势必会越界的问题，char有8bit位，%1x只有4bit位，怎么会越界呢？

引用 5 楼 真相重于对错 的回复:你的ch是char,却按int输入（%1x)，出现什么样的情况都是可能 ch占1个字节，即8位。 输入（%1x)，表示读取输入流中的1位数据，并当做16进制的数字，存储在ch的低4位上。 不会出现你说的情况。

你的ch是char,却按int输入（%1x)，出现什么样的情况都是可能

或者clean以下，rebuild all


Question: 诸位大佬帮忙看看，这个1是哪里冒出来的？

printf("发放的奖金数为: %f万元\n",bonus);  => printf("发放的奖金数为: %.2f万元\n",bonus);

浮点数表示问题，是近似值。


Question: sockt http问题

自已动手学习学习

你是要实现HTTP请求？首先了解一下OSI7层网络协议。  socket工作在传输层，你要收发并解析HTTP包，要自己写封包和解包。  window有现成的API函数可以直接使用HTTP请求，CInternetSession，或者使用libcurl，也非常好用。


Question: 数据结构与算法

数据结构 清华严蔚敏老师的书不错，适合入门。 算法导论，第三版，经典中的经典。


Question: 求大佬帮我看看这道二叉树问题

isSubtree(s->left, t) //这里的递归没有判断s->left是不是null（null的情况是可能存在的），所以要在isSubtree里面做判断 isSubtree(s->right, t) //同理，这里也如此 如果改成 return isequal(s, t) || (s->left && isSubtree(s->left, t)) || (s->right && isSubtree(s->right, t)) 那么isSubtree函数内就不需要判断了 但是，从函数的设计来看，在isSubtree函数内判断s是合理的，因为用户在调用isSubtree，不一定会判断参数是否为null，所以函数内部要尽量保证能容错程序不崩溃。

if (!s) return false;  == 这是判断示例2的情况。。


Question: 新手求问，C语言中多个不加大括号的if语句连续使用该如何理解？

引用 8 楼 qzjhjxj 的回复：int main(int argc, char* argv[]) {     int i=1,j=3,k=5,m=4;     do{         if(i%j==0)            if(i%k==0)               if(i%m==0)//这三个if语句，等价于：if(i%j==0 && i%k==0 && i%m==0)                {                 printf("%d\n",i);                 break;                }         i++;        }while(i!=0);     system("pause");     return 0; }谢谢大佬，明白了

把第二个程序稍加修改，楼主去试验下，就明白了：int main(int argc, char* argv[]) {     int i=1,j=3,k=5,m=4;     do{         if(i%j==0)            if(i%k==0)               if(i%m==0)                {                 printf("%d\n",i);                 break;                }         i++;        }while(i!=0);     system("pause");     return 0; }

1的意思是if的条件成立，就执行一条if语句，所以最后那个大括号属于第三条（第三层）if语句的执行部分 2 i++不是if的执行语句，上面的情况和1类似 是if为true，则执行一个if语句，然后如果这第二层if为真，则执行下一条语句（或是下一个大括号内的所有语句）， 所以这两重if语句走到大括号结束就完了。判断方法就是if（xxx）之后只管一条语句，不用大括号的话 if （xx） s1;          // if到这儿就完了 s2;

第一题：这个语句是属于if语句中的，如果要执行，必须是前面三个if条件全满足才会执行到。 第二题：i++；不属于if语句中的。c是以“；”号表示一条语句的结束，所以前面两个if之间没有结束符号，就表示这是同一条并列语句。

从问题2的结果可以看出要所有的if语句满足条件才执行输出i，所以i一直累加到15,15可以整除j和k。

这个i++不是if语句中的， 那个大括号里面的是两个if语句的作用域, 看大括号啊， 其实第一个if语句最好也加上大括号，或者改写两个if语句为一个与的判断

C语言中语句是以分号;或者大括号{}结束，所以问题1中的语句不属于if语句中。问题2中的i最终结果是15

不属于。这语言等价的结构是这样的： #include<stdio.h> void main() { 	int i = 1, j = 3, k = 5; 	do { 		if (i % j == 0) 		{ 			if (i % k == 0) { 				printf("%d\n", i); 				break; 			} 		} 		i++; 	} while (i != 0); }


Question: 希望大神给讲解一下这道题

第一个for（i=0;i<10;i++）            scanf("%d",&a[i]);  它的作用域就在scanf("%d",&a[i]);这句就结束了，循环十次，完成十个数值输入。 第四个for（i=0；i<10;i++）                          printf("%d",a[i]); 它的作用域就在 printf("%d",a[i]);这句，循环十次，完成打印输出十次。以上两个都是一次循环就结束了，没有内外之分。 第二和第三个for()循环才是组合循环，第二个for是外循环，第三个for是第二个for的内循环,和第一、第四没有任何关联。

引用 3 楼 user-2的回复:[quote=引用 2 楼 m0_51795044 的回复:][quote=引用 1 楼 user-2的回复:]标准的冒泡排序算法。 每一次循环外层，一个最大数沉底。循环结束，排序完成。。。 那些for里面都是啥意思啊[/quote]  内层循环，每次沉底一个最大值。 外层循环，跑完结束，排序完成。[/quote] 第一个和第四个for是外层循环，第二个和第三个是内层循环？

引用 2 楼 m0_51795044 的回复:[quote=引用 1 楼 user-2的回复:]标准的冒泡排序算法。 每一次循环外层，一个最大数沉底。循环结束，排序完成。。。 那些for里面都是啥意思啊[/quote]  内层循环，每次沉底一个最大值。 外层循环，跑完结束，排序完成。

引用 1 楼 user-2的回复:标准的冒泡排序算法。 每一次循环外层，一个最大数沉底。循环结束，排序完成。。。 那些for里面都是啥意思啊

标准的冒泡排序算法。 每一次循环外层，一个最大数沉底。循环结束，排序完成。。。


Question: 有没有大佬能解答一下啊

整数字面量被自动编译为int，就好像浮点数字面量都被自动编译为double一样。 一般的32位/64位编译器的sizeof(int)是4（就是整形占4个字节32位），所以sizeof(int)+3=4+3=7

引用 1 楼 user-2的回复:这种题，纯属扯蛋的。没人定义int类型就一定是4位。  等于7的理解：sizeof 2 + 3；== sizeof（int) + 3 == 4 + 3 == 7 感谢！感谢！


Question: 字符串逆序输出

#include<stdio.h> #include<string.h> int main(int argc, char* argv[]) {     /*********Begin*********/     char s[100]="\0",x;     int i,n;     scanf("%s",&s);     n=strlen(s)-1;     for(i=0;i<=n/2;i++)//或者按楼上所说，循环条件改成：i<=n/2      {          x=s[i];          s[i]=s[n-i];          s[n-i]=x;      }    printf("%s\n",s);    system("pause");    return 0; }

修改如下，供参考：#include<stdio.h> #include<string.h> int main(int argc, char* argv[]) {     /*********Begin*********/     char s[100]="\0",x;     int i,b,n;     scanf("%s",&s);     n=strlen(s)-1;     for(i=0;i<n-i;i++)      {          x=s[i];          s[i]=s[n-i];          s[n-i]=x;      }    printf("%s\n",s);    system("pause");    return 0; }

用两个指针来输出也是一种方法

你赋值给x的值就是正序的，后面x又赋值给了字符串s，所以输出的还是正序的

另建议你把s定义成char型指针,再用malloc给它个空间会更好一些

求助

改完之后就可以运行了,帮你测试过了

for(i=0;i<=n;i++)   ==  》 for(i=0;i<=n/2;i++)

i  <= n  改成i <= n/2 因为如果是n的话倒序之后又改回去了


Question: 各位大佬，实在是做不出来，求各位大佬指导

引用 2 楼 user-1的回复:无比暴力，仅供参考： #include <stdio.h> #define MAXLEN 1024  int handler(int data[], int status[], int n, int len) {     int value1, value2, ret, i;      if (n < len-1)     {         status[n] = 0;         ret = handler(data, status, n + 1, len);         if (ret) return ret;          status[n] = 1;         ret = handler(data, status, n + 1, len);         if (ret) return ret;     }      status[n] = 0;     value1 = value2 = 0;     for (i = 0; i < len; i++)     {         if (status[i] == 0) value1 = value1 + data[i];         else value2 = value2 + data[i];     }     if (value1 == value2) return value1;      status[n] = 1;     value1 = value2 = 0;     for (i = 0; i < len; i++)     {         if (status[i] == 0) value1 = value1 + data[i];         else value2 = value2 + data[i];     }     if (value1 == value2) return value1;      return 0; }  int main(void) {     int data[MAXLEN], status[MAXLEN];     int d, ret, len = 0;      while(1)     {         scanf("%d", &d);         if (d == -1) break;         data[len++] = d;     }      ret = handler(data, status, 0, len);      if (ret > 0) printf("Yes\n%d\n", ret);     else printf("No\n");      return 0; }  谢谢你，谢谢你😊


Question: 求大神帮忙看看问题在哪？这题是将一个偶数拆成两个质数之和

感谢你啊，我大一刚开始学c语言，新手小白啥都不懂，犯一些蠢蠢的错误。。。。。

依楼主思路，修改如下：#include <stdio.h> #include <math.h> int prime(int n) {     int i;     for(i=2;i<=sqrt(n);i++)         if(n%i==0) return 0;     return 1; }  int main(int argc, char* argv[]) {    int a,b,c,d,n;    printf("请输入一个偶数(n>3):");    scanf("%d",&n);    if(n<3 || n%2!=0)         {           printf("该值不符合输入要求.\n");           //return 0;         }    else         {           for(a=2;a<=n/2;a++)            {              b=n-a;              c=prime(a);              d=prime(b);              if(c==1&&d==1)                 printf("%d=%d+%d\n",n,a,b);            }         }    system("pause");    return 0; }


Question: 穿的插入删除

#include <stdio.h> #include<stdlib.h> #include <string.h>  #define MAXSIZE 40  //结构体 typedef struct {     char ch[MAXSIZE];     int len; }sstring;  //插入 int strinsert(sstring *s,int pos,sstring t) {     int i;      printf("请输入你想要插入的位置:");     scanf("%d",&pos);      if(pos<0||pos>s->len)         return (0);      //if(s->len + t.len<=MAXSIZE){     if(s->len + t.len <= MAXSIZE-1){   //'\0' is 1         for(i=s->len+t.len-1; i>=t.len+pos; i--){             s->ch[i] = s->ch[i-t.len];         }         for(i=0;i<t.len;i++) {             s->ch[i+pos]=t.ch[i];         }         s->len=s->len+t.len;         s->ch[s->len] = 0;    //for '\0'     }     else if(pos+t.len<=MAXSIZE-1){         for(i=MAXSIZE-1;i>t.len+pos-1;i--)         {             s->ch[i]=s->ch[i-t.len];         }         for(i=0;i<t.len;i++)         {             s->ch[i]=s->ch[i-t.len];         }         s->len=MAXSIZE-1;         s->ch[s->len] = 0;     }     else     {         for(i=0;i<MAXSIZE-pos-1;i++)             s->ch[i+pos]=t.ch[i];         s->len=MAXSIZE-1;         s->ch[s->len] = 0;     }     return (1); } //删除 int strdelete(sstring *s,int pos,int len) {     int i;     printf("请输入你想要删除的位置:");     scanf("%d",&pos);     printf("请输入你想要删除的长度:");     scanf("%d",&len);     if(pos<0||pos>(s->len-len))     {         printf("删除的位置不合理!");         return (0);     }     for(i=pos+len;i<s->len;i++)         s->ch[i-len]=s->ch[i];     s->len=s->len-len;     s->ch[s->len] = 0;     return (1); }  //void main() int main() {     sstring s,t;     int pos=0,len=0;     //主串     printf("请输入主串s\n");     scanf("%s",s.ch);     s.len = strlen(s.ch);   //缺少更新len     printf("\n");     //子串     printf("请输入子串t\n");     scanf("%s",t.ch);     t.len = strlen(t.ch);   //缺少更新len     printf("\n");     //插入     strinsert(&s,pos,t);     //printf("%s",s);     printf("%s",s.ch);     //删除     strdelete(&s,pos,len);     //printf("%s",s);     printf("%s",s.ch); } 供参考～


Question: #C语言#递归

20的时候，算了 2^20遍，很快能够完成。 50的时候，要算 2^50遍，这个太多了，不是不行，是要等很久，甚至有可能内存爆掉  把 sum[n] = num(n-1) * n 改成 sum[n] = sum[n-1]*n，应该就可以了。

应该是时间复杂度太高了，递归50次的话耗时比20次多太多

引用现在的编译器太牛了，优化能力超乎想象。这种尾递归，编译器很好优化，非常块，不存在所谓的递归缺点。楼上说的没错，楼主的问题是递归的算法有问题，额外增加了一些不必要的开销。

引用 6 楼 glory@胖奇奇 的回复:应该是时间复杂度太高了，递归50次的话耗时比20次多太多  我用这个递归10000，都很快的，用时0.001秒。没任何问题。 #include <stdio.h>   int num(int n) {     if(n==0)     {         return 0;     }     else     {         return n + num(n-1);     } }   int main(void) {     int n = 10000;     printf("sum(%d) = %d\n", n, num(n));           return 0; }   运行结果如下： [root@localhost Workspace]# gcc -o demo demo.c [root@localhost Workspace]# time ./demo sum(10000) = 50005000  real	0m0.001s user	0m0.001s sys	0m0.000s

引用 4 楼 qzjhjxj 的回复:没什么错误，执行递归算法，特别是递归执行层数多的时候，结果极其的慢，而且递归层数达到一定的值，需要增加额外的堆栈处理，就有可能出现内存溢出的情况，这是递归算法的缺点。 现在的编译器太牛了，优化能力超乎想象。这种尾递归，编译器很好优化，非常块，不存在所谓的递归缺点。

仅供参考： #include <stdio.h>  int num(int n) { 	if(n==0) 	{ 		return 0; 	} 	else 	{ 		return n + num(n-1); 	} }  int main(void) { 	printf("%d", num(20)); 	 	return 0; }

引用 1 楼 的回复:一定要用递归 要计算从一加到n

一定要用递归


Question: 指针的值为何为0？

一楼的解释是有可能的和有道理的，建议楼主不用过分在意这个，对于指针的初始化，即char *ptr = NULL;

楼主打印的是ptr指向的内容，如果没有初始化，它是随机的值，即指向的内容不确定。楼主的0其实是一个特殊的位置0地址位置即(void *)0。 另外，打印地址的格式应该用%p或%x

这个要看编译器环境，未指定具体数值的野指针

可能是随机值吧。我用gcc 9.2，结果是16。  E:\Workspace>gcc --version gcc (tdm64-1) 9.2.0 Copyright (C) 2019 Free Software Foundation, Inc. This is free software; see the source for copying conditions.  There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   E:\Workspace>>demo ptr = 16  E:\Workspace>>demo ptr = 16  E:\Workspace>>demo ptr = 16

试了一下 centos8.2、g++ 8.3上 未初始化的指针确实被自动置空，应该是gcc做的一个保护机制吧 win下是没有这么做的（但vc2019 debug版就会在编译报错C4700， 并且强行关闭之后，debug版仍会弹出运行时错误，可以说两个平台都做了足够保护）

52，你第一行的;号打成中文符号了


Question: 单链表的就地逆置

H1=NULL ==>H1变成空链表 -- 以后每次循环一次，插入一个节点。 H1=q ==> H1始终是链表的头部。


Question: c语言求救：输出的时候少一个数

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

sum+=(int)round(pow(a[j],n));  加个round四舍五入再取整试试  好像是因为精度误差

你把数组a[10]=｛0｝；赋初值再试试。

引用 1 楼 user-4 的回复：没错啊，你的运行结果是什么少第一个数

可以这样改下，看看问题在哪：int hhh(int n) {     long a[10]={0}, i, j, x, y, t, sum;     x=pow(10, n-1);     y=pow(10, n);     //printf("X=%d,Y=%d\n",x,y);       for(i=x;i<y;i++)     {         printf("i=%d\n",i);//这里加一句打印出i         t=i;         sum=0;         for(j=0;j<n;j++)         {             a[j]=t%10;             t=t/10;         }         for(j=0;j<n;j++)         {             sum+=pow(a[j],n);             printf("sum+第(%d)次=%d\n",j,sum);//这里看看sum的值             system("pause");  //这里暂停下看的清楚         }         if(sum==i)         {             printf("%ld \t",sum);         }     } }  实际效果，如下图：

引用 9 楼 qzjhjxj 的回复:引用printf("x=d%,y=%d\",x,y);//这里增加看看x y 的值。或者干脆 x=150,y=155赋值，看看下面能不能输出153.这句打错了，应该这样的：printf("X=%d,Y=%d\n",x,y); 还是不可以，就153输出不了，把y=999之后，还是153出不来，只输出其他三个。

你可以把int hhh(int n)函数单独拿出来，在你的机器上单独调试下，int hhh(int n) {     long a[10], i, j, x, y, t, sum;     x=pow(10, n-1);     y=pow(10, n);     printf("x=d%,y=%d\",x,y);//这里增加看看x y 的值。或者干脆 x=150,y=155赋值，看看下面能不能输出153.     for(i=x;i<y;i++)     {         t=i;         sum=0;//把sum赋初值放在这里         for(j=0;j<n;j++)         {             a[j]=t%10;             t=t/10;         }         for(j=0;j<n;j++)         {             sum+=pow(a[j],n);         }         if(sum==i)         {             printf("%ld \t",sum);// “%ld\t"在间加入一空格.         }     } }

引用 6 楼 qzjhjxj 的回复：你把数组a[10]=｛0｝；赋初值再试试。还是不行

我刚刚在另一个电脑上运行了一下，是正确的， 但是在我的电脑上就是少一个数字

我的还是少一个数。。。不知道为什么。。。

没看到你的运行结果，我试运行了下，没有问题： 把int hhh()函数稍改了下：int hhh(int n) {     long a[10], i, j, x, y, t, sum;     x=pow(10, n-1);     y=pow(10, n);     for(i=x;i<y;i++)     {         t=i;         sum=0;//把sum赋初值放在这里         for(j=0;j<n;j++)         {             a[j]=t%10;             t=t/10;         }         for(j=0;j<n;j++)         {             sum+=pow(a[j],n);         }         if(sum==i)         {             printf("%ld \t",sum);// “%ld\t"在间加入一空格.         }     } }

没错啊，你的运行结果是什么


Question: 用c对文件指定内容进行扫描提取特定内容  求帮忙

引用 6 楼 ctrigger的回复:[quote=引用 5 楼 yxj3515001663 的回复:][quote=引用 4 楼 ctrigger的回复:][quote=引用 3 楼 yxj3515001663 的回复:]我有个问题，为什么我c语言打程序的时候声明结构体struct dirent里面没有d_type啊  man文档中的定义： struct dirent {     ino_t          d_ino;       /* inode number */     off_t          d_off;       /* offset to the next dirent */     unsigned short d_reclen;    /* length of this record */     unsigned char  d_type;      /* type of file; not supported                                    by all file system types */     char           d_name[256]; /* filename */ };[/quote] 这不是系统定义的结构体吗[/quote]  d_type 注释中，就是有些文件系统不支持。我的windows和fedora系统都有。[/quote] 要是不支持的话就用不了吗？还是说可以定义使用

引用 6 楼 ctrigger的回复:[quote=引用 5 楼 yxj3515001663 的回复:][quote=引用 4 楼 ctrigger的回复:][quote=引用 3 楼 yxj3515001663 的回复:]我有个问题，为什么我c语言打程序的时候声明结构体struct dirent里面没有d_type啊  man文档中的定义： struct dirent {     ino_t          d_ino;       /* inode number */     off_t          d_off;       /* offset to the next dirent */     unsigned short d_reclen;    /* length of this record */     unsigned char  d_type;      /* type of file; not supported                                    by all file system types */     char           d_name[256]; /* filename */ };[/quote] 这不是系统定义的结构体吗[/quote]  d_type 注释中，就是有些文件系统不支持。我的windows和fedora系统都有。[/quote] 不支持的话就没办法使用了吗

引用 5 楼 yxj3515001663 的回复:[quote=引用 4 楼 ctrigger的回复:][quote=引用 3 楼 yxj3515001663 的回复:]我有个问题，为什么我c语言打程序的时候声明结构体struct dirent里面没有d_type啊  man文档中的定义： struct dirent {     ino_t          d_ino;       /* inode number */     off_t          d_off;       /* offset to the next dirent */     unsigned short d_reclen;    /* length of this record */     unsigned char  d_type;      /* type of file; not supported                                    by all file system types */     char           d_name[256]; /* filename */ };[/quote] 这不是系统定义的结构体吗[/quote]  d_type 注释中，就是有些文件系统不支持。我的windows和fedora系统都有。

引用 4 楼 ctrigger的回复:[quote=引用 3 楼 yxj3515001663 的回复:]我有个问题，为什么我c语言打程序的时候声明结构体struct dirent里面没有d_type啊  man文档中的定义： struct dirent {     ino_t          d_ino;       /* inode number */     off_t          d_off;       /* offset to the next dirent */     unsigned short d_reclen;    /* length of this record */     unsigned char  d_type;      /* type of file; not supported                                    by all file system types */     char           d_name[256]; /* filename */ };[/quote] 这不是系统定义的结构体吗

引用 3 楼 yxj3515001663 的回复:我有个问题，为什么我c语言打程序的时候声明结构体struct dirent里面没有d_type啊  man文档中的定义： struct dirent {     ino_t          d_ino;       /* inode number */     off_t          d_off;       /* offset to the next dirent */     unsigned short d_reclen;    /* length of this record */     unsigned char  d_type;      /* type of file; not supported                                    by all file system types */     char           d_name[256]; /* filename */ };

引用 2 楼 ctrigger的回复:解决思路，仅供参考： 1. opendir 2. 循环readdir     a. 普通文件，比较文件名，扫描指定字符串 strstr函数。     c. 其他类型文件，忽略，continue。     b. 目录，递归opendir。 3. 结束 我有个问题，为什么我c语言打程序的时候声明结构体struct dirent里面没有d_type啊

首先要确定能访问这个文件，如果文件被程序互斥性打开，那后来的程序是打不开这个文件的。


Question: 如何创建richedit控件？（dev，用CreateWindow）

引用 5 楼 Intel0011 的回复:[quote=引用 4 楼 六道佩恩 的回复:] 怪了，确实创建成功了。 不应该呀，我把动态库换成链接静态库，就没成功，不应该呀，它这个一定要用动态库吗？ 这个没深究，应该是要DLL，使用DLL的话，操作系统易于升级RichEdit，而程序不变就可以使用新的版本[/quote]  你了解win32的MCI吗？关于它支持的格式的问题，它是只支持那么几种格式？还是随驱动程序而定？ https://bbs.csdn.net/topics/398377944

引用 4 楼 六道佩恩 的回复:怪了，确实创建成功了。 不应该呀，我把动态库换成链接静态库，就没成功，不应该呀，它这个一定要用动态库吗？ 这个没深究，应该是要DLL，使用DLL的话，操作系统易于升级RichEdit，而程序不变就可以使用新的版本

引用 2 楼 Intel0011 的回复:[quote=引用 楼主 六道佩恩 的回复:]创建失败，原因未知，用过MSFTEDIT_CLASS，仍然失败 RichEdit相对其他的控件来说，比较大，所以MS单独封装为一个DLL，使用时需要单独导入[/quote]  怪了，确实创建成功了。 不应该呀，我把动态库换成链接静态库，就没成功，不应该呀，它这个一定要用动态库吗？

引用 楼主 六道佩恩 的回复:创建失败，原因未知，用过MSFTEDIT_CLASS，仍然失败 RichEdit相对其他的控件来说，比较大，所以MS单独封装为一个DLL，使用时需要单独导入

InitCommonControls  In order to use common controls on a dialog box, you need to call InitCommonControlsEx or AFXInitCommonControls before you create the dialog box.

VC下的例子 主要是RichEdit控件比较大的控件，而且是有不同版本的 需要先载入 hRichEditDll = LoadLibrary(_T("RICHED20")); 才能使用 //* #define UNICODE #define _UNICODE //*/ #include <Windows.h> #include <tchar.h> #include <commctrl.h>  #pragma comment(lib, "gdi32") #pragma comment(lib, "user32") #pragma comment(lib, "comctl32")  #pragma comment(linker, "/subsystem:windows")  LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);  static HMODULE hRichEditDll = NULL; static HWND hRichEdit;  int WINAPI _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR szCmdLine, int iCmdShow) {    static TCHAR szAppName[] = TEXT("HelloWin");    HWND         hwnd;    MSG          msg;    WNDCLASS     wndclass;    HDC          hdc;           RtlZeroMemory(&wndclass, sizeof(wndclass));    wndclass.style         = CS_HREDRAW | CS_VREDRAW;    wndclass.lpfnWndProc   = WndProc;    wndclass.hInstance     = hInstance;    wndclass.hIcon         = LoadIcon(NULL, TEXT("#32512"));    wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);    wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);    wndclass.lpszMenuName  = NULL;    wndclass.lpszClassName = szAppName;     if (!RegisterClass(&wndclass))    {       MessageBox(NULL, TEXT("This program requires Windows NT series!"), szAppName, MB_ICONERROR);       return -1;    }        InitCommonControls();    hRichEditDll = LoadLibrary(_T("RICHED20"));              hwnd = CreateWindowEx(WS_EX_APPWINDOW,         // A tool window does not appear in the task bar or in the window that appears when the user presses ALT+TAB.                          szAppName,                  // window class name                          TEXT("The Hello Program"),  // window caption                          WS_OVERLAPPEDWINDOW,        // window style                          100,//CW_USEDEFAULT,              // initial x position                          200,//CW_USEDEFAULT,              // initial y position                          320,//CW_USEDEFAULT,              // initial x size                          320,//CW_USEDEFAULT,              // initial y size                          NULL,                       // parent window handle                          NULL,                       // window menu handle                          hInstance,                  // program instance handle                          NULL);                      // creation parameters     hdc = GetDC(hwnd);    SelectObject(hdc, GetStockObject(SYSTEM_FIXED_FONT));     ShowWindow(hwnd, SW_SHOW);    UpdateWindow(hwnd);        {       BOOL bRet;       while ((bRet = GetMessage(&msg, NULL, 0, 0)) != 0)       {          if (bRet == -1)          {             MessageBox(NULL, TEXT("GetMessage Error."), TEXT("Message"), MB_ICONERROR);             return -1;          }          else          {             TranslateMessage(&msg);             DispatchMessage(&msg);          }       }    }        SelectObject(hdc, GetStockObject(SYSTEM_FONT));    ReleaseDC(hwnd, hdc);        FreeLibrary(hRichEditDll);    hRichEditDll = NULL;     UnregisterClass(szAppName, hInstance);    return msg.wParam; }  LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) {    HDC         hdc;    PAINTSTRUCT ps;    RECT        rect;        switch (message)    {       case WM_CREATE:          #ifdef UNICODE          #define RICHEDIT L"RichEdit20W"          #else          #define RICHEDIT  "RichEdit20A"          #endif          hRichEdit = CreateWindowEx(WS_EX_CLIENTEDGE, RICHEDIT, TEXT(""),                                      WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_NOHIDESEL,                                     0, 0, 100, 100, hwnd, (HMENU)10, ((LPCREATESTRUCTA)lParam)->hInstance, NULL);                    return 0;       case WM_PAINT:          hdc = BeginPaint(hwnd, &ps);          GetClientRect(hwnd, &rect);          DrawText(ps.hdc, TEXT("Hello, Windows!"), -1, &rect, DT_SINGLELINE | DT_CENTER | DT_VCENTER);                 EndPaint(hwnd, &ps);          return 0;       case WM_DESTROY:          PostQuitMessage(0);          return 0;    }    return DefWindowProc(hwnd, message, wParam, lParam); }


Question: char类型的指针大小为4，为什么加1只加1呢

引用 5 楼 lotte198666的回复:[quote=引用 2 楼 真相重于对错 的回复:]T* p; p=p+1; 意思是把p移动一个sizeof(T)位置 如果char** p 无论p=p+1,还是p++, p往后移动一个sizeof(char*) 也就是移动4个字节（32位），8个字节（64位系统） char类型指针大小是4   p=p+1不应该是加4吗怎么是加1呢[/quote] 加sizeof T不是加sizeof T*

pc+1就是加一个字节（地址偏于一个字节） pc++才会加4个字节（地址前进一个指针单位） 这是有区别的，否则想地址偏移1个字节就没法实现了

引用 2 楼 真相重于对错 的回复:T* p; p=p+1; 意思是把p移动一个sizeof(T)位置 如果char** p 无论p=p+1,还是p++, p往后移动一个sizeof(char*) 也就是移动4个字节（32位），8个字节（64位系统） char类型指针大小是4   p=p+1不应该是加4吗怎么是加1呢

char类型指针大小是4   p=p+1不应该是加4吗怎么是加1呢

char类型指针大小是4加我1不是加4吗


Question: 新手求问，C语言中n++<=2中是n++还是n最终与2比较？会和优先级有冲突吗？

n++是先运算再++。

++n：是先加1后运算； n++：是先运算后加1；

n++<=2是个表达式，n++是求出表达式的值以后n才自增，所以<=的时候用的是n来比较


Question: 这个简单C程序的第二个scanf为什么不起作用？

起作用了，第二个scanf接收的是'\n'，%c匹配'\n'，这个上一个输入之后留在输入缓存里的'\n'

你想要的效果应该是下面的这个吧    int main() {     int a;     char z;     scanf("%d",&a);     printf("%d\n",a);     //printf("b");     //z=getchar();     fflush(stdin);     scanf("%c",&z);     printf("%c",z);     return 0; }

第一个scanf你把输入值赋给了a,然后打印字符b怎么可能会有结果的啊 无论你输入的是什么,打印的都是字符b啊,第二个scanf也一样,中间还没清空缓冲区


Question: C语言代码，输入n1 n2 m  三个数

大神，多谢，我看看我的哪里出问题惹

void Test(void) { 	int n1 = 0; 	int n2 = 0;  	int m = 0;  	scanf_s("%d", &n1); 	scanf_s("%d", &n2); 	scanf_s("%d", &m);  	if (m <= 1 || 9 <= m || n2 <= n1) 	{ 		printf("err\r\n"); 		return; 	}  	for (int i = n1, j = 0; i < n2 + 1; ++i, ++j) 	{ 		if (i % m == 0) 		{ 			printf("_ "); 		} 		else 		{ 			int bit = 0; 			int num = i; 			while (num != 0) 			{ 				bit = num % 10; 				num /= 10;  				if (bit == m) 					break; 			}  			if (bit == m) 				printf("_ "); 			else 				printf("%d ", i); 		}  		if ((j + 1) % 10 == 0) 			printf("\r\n"); 	}  	printf("\r\n"); }  12 210 5 12 13 14 _ 16 17 18 19 _ 21 22 23 24 _ 26 27 28 29 _ 31 32 33 34 _ 36 37 38 39 _ 41 42 43 44 _ 46 47 48 49 _ _ _ _ _ _ _ _ _ _ _ 61 62 63 64 _ 66 67 68 69 _ 71 72 73 74 _ 76 77 78 79 _ 81 82 83 84 _ 86 87 88 89 _ 91 92 93 94 _ 96 97 98 99 _ 101 102 103 104 _ 106 107 108 109 _ 111 112 113 114 _ 116 117 118 119 _ 121 122 123 124 _ 126 127 128 129 _ 131 132 133 134 _ 136 137 138 139 _ 141 142 143 144 _ 146 147 148 149 _ _ _ _ _ _ _ _ _ _ _ 161 162 163 164 _ 166 167 168 169 _ 171 172 173 174 _ 176 177 178 179 _ 181 182 183 184 _ 186 187 188 189 _ 191 192 193 194 _ 196 197 198 199 _ 201 202 203 204 _ 206 207 208 209 _ 请按任意键继续. . .


Question: C语言小项目出了点问题,求各位大佬指点

这里不是指向了这个定义出来的数组了吗

购买完后,再次打印出来,商品的部分没有出错啊,是玩家的金币出现了问题

Prop props[];  //道具数组  问题在这里，Init的时候没有对其申请空间不赋值，这里的props是一个指针，在Init里被赋值为NULL，没有指向什么内容。


Question: 请问这个报错怎么解决

至少得有个typedef int ElemType;这样的语句吧

想到了第一次学数据结构的自己，书上的是伪代码，直接拿过来编译是不行的。ElemType代表元素类型，是一个统称，具体的可以写成int char float等等，Status也是统称

第7行 ElemType 是用来说明的，使用的时候要换成具体类型，比如int char等等。还有*=elem把=去掉。 第11行字符打错了I换成小写i

Status未定义，ElemType未定义。楼主没有定义怎么可以直接使用呢?拷贝别人的代码吗？那也拷全了。


Question: 一根29cm长的尺子，只允许在它上面刻7个刻度。若要用它能量出1~ 29cm的各种整长度，刻度应如何选择？

2楼写得挺好的，就是暴力，思路很清晰啊，怒赞

如果是截成7段，那确实没段只能用一次，如果是划刻度，就没这个限制了，因为每次都是用同一把尺子先量一个刻度，再量一个刻度，这样的话，同一个刻度重复使用没问题。 如果是截段，那也没规定每次测量只用几段，所以任何一种能组合出1-10的组合就能满足需求 比如 1 3 5 10 10 （如果非要7段，把后两个10调成两段即可） 1=1 2=3-1 3=3 4=3+1 5=5 6=5+1 7=5+3-1 8=5+3 9=5+3+1 10=10 11=10+1 12=10+3-1 13=10+3 14=10+3+1 15=10+5 16=10+5+1 17=10+5+3-1 18=10+5+3 19=10+5+3+1 20=10+10 。。。 29=10+10+5+3+1  所以觉得本题有bug，题目需求不严谨

引用 4 楼 qybao 的回复:这道题我始终觉得有bug，如果说是截成7段，那可能ls都满足，但题目只要求划刻度，要是这样，我觉得划个1就够了 1=1 2=1+1 3=1+1+1 。。。 应该是只允许一次，其实按二进制位考虑即可，比29大且最小的2的n次幂是32 ，2^5 所以用1，2，4，8，16，29既可以量出所有的长度  1=1(b)=1 2=10(b)=2； 3=11(b)=2+1; 4=100(b)=4; 5=101(b)=4+1 6=110(b)=4+2 7=111(b)=1+2+4; 8=1000(b)=8; 9=1001(b)=8+1 10=1010(b)=8+2 11=1011(b)=8+2+1； 12=1100(b)=8+4 13=1101(b)=8+4+1 14=1110(b)=8+4+2 ..... 27=11011(b)=16+8+2+1 28=11100(b)=16+8+4; 29=11101(b)=29or16+8+4+1;

仅供参考。代码如下： #include <stdio.h>  int main(void) { 	int flag, mark[9]; 	int a, b, c, d, e, f, g; 	int i, j; 	int count = 0; 	 	mark[0] = 0; 	mark[8] = 29; 	 	for(a=1; a<23; a++) 	{ 		mark[1] = a; 		for(b=a+1; b<24; b++) 		{ 			mark[2] = b; 			for(c=b+1; c<25; c++) 			{ 				mark[3] = c; 				for(d=c+1; d<26; d++) 				{ 					mark[4] = d; 					for(e=d+1; e<27; e++) 					{ 						mark[5] = e; 						for(f=e+1; f<28; f++) 						{ 							mark[6] = f; 							for(g=f+1; g<29; g++) 							{ 								mark[7] = g; 								 								flag = 1; 								 								for(i=0; i<8; i++) 								{ 									for(j=i+1; j<9; j++) 									{ 										flag |= (1 << (mark[j] - mark[i])); 									} 								} 								 								if(flag == 0x3fffffff) 								{ 									printf("NO.%d:\t%d\t%d\t%d\t%d\t%d\t%d\t%d\t\n", ++count, a, b, c, d, e, f, g); 								} 							} 						} 					} 				} 			} 		} 	} 	 	return 0; }   运行结果如下： E:\Workspace>tcc -run demo.c NO.1:   1       2       14      18      21      24      27 NO.2:   1       3       6       13      20      24      28 NO.3:   1       4       10      16      22      24      27 NO.4:   1       5       9       16      23      26      28 NO.5:   2       5       7       13      19      25      28 NO.6:   2       5       8       11      15      27      28

0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 1 1 1                                  1          1       1       1       1    1   // 一根29cm长的尺子，只允许在它上面刻7个刻度。若要用它能量出1~29cm的各种整长度，刻度应如何选择？ void RulerResult(void) { 	struct 	{ 		bool test; 		int maxID; 		int minID; 	} 	result[29];  	int mark[9]; 	mark[0] = 0; 	mark[8] = 29;  	for (int a = 1; a < 23; ++a) 	{ 		for (int b = a + 1; b < 24; ++b) 		{ 			for (int c = b + 1; c < 25; ++c) 			{ 				for (int d = c + 1; d < 26; ++d) 				{ 					for (int e = d + 1; e < 27; ++e) 					{ 						for (int f = e + 1; f < 28; ++f) 						{ 							for (int g = f + 1; g < 29; ++g) 							{ 								mark[1] = a; 								mark[2] = b; 								mark[3] = c; 								mark[4] = d; 								mark[5] = e; 								mark[6] = f; 								mark[7] = g;  								memset(result, false, sizeof(result));  								for (int i = 0; i < 8; ++i) 								{ 									for (int j = i + 1; j < 9; ++j) 									{ 										int id = mark[j] - mark[i] - 1; 										result[id].test = true; 										result[id].maxID = mark[j]; 										result[id].minID = mark[i]; 									} 								}  								bool allTest = true; 								for (int i = 0; i < 29; ++i) 								{ 									if (result[i].test) 										continue;  									allTest = false; 									break; 								}  								if (allTest) 								{ 									for (int i = 0; i < 9; ++i) 									{ 										printf("%d ", mark[i]); 									}  									printf("\r\n");  									for (int i = 0; i < 29; ++i) 									{ 										printf("%d = %d - %d\r\n", i + 1, result[i].maxID, result[i].minID); 									}  									return; 								} 							} 						} 					} 				} 			} 		} 	} }   0 1 2 14 18 21 24 27 29 1 = 2 - 1 2 = 29 - 27 3 = 27 - 24 4 = 18 - 14 5 = 29 - 24 6 = 27 - 21 7 = 21 - 14 8 = 29 - 21 9 = 27 - 18 10 = 24 - 14 11 = 29 - 18 12 = 14 - 2 13 = 27 - 14 14 = 14 - 0 15 = 29 - 14 16 = 18 - 2 17 = 18 - 1 18 = 18 - 0 19 = 21 - 2 20 = 21 - 1 21 = 21 - 0 22 = 24 - 2 23 = 24 - 1 24 = 24 - 0 25 = 27 - 2 26 = 27 - 1 27 = 29 - 2 28 = 29 - 1 29 = 29 - 0 请按任意键继续. . .


Question: [求助]clion 无法debug

解决了吗请问，能告知一下怎么解决的吗

请问最后怎么解决的？

引用 2 楼 Ricardo_PAO 的回复:之前用PYcharm，挺喜欢这个公司出的东西的，然后用的clion。vs太大了  其实，VS只有一个缺点太大。其他都是优点。现在的电脑配置越来越牛，vs大一点也算不上缺点了。

这点我要反驳，它除了大还非要装C盘，我就看不惯它非要住C盘这点，其他都还好

之前用PYcharm，挺喜欢这个公司出的东西的，然后用的clion。vs太大了

visual studio 2019，号称宇宙第一IDE，功能强大，调试方便。


Question: [求助]关于稍复杂计算器

第二次输入时，menu函数里面way得到的值应该是个'\n'回车，所以就不正确了。


Question: C语言

这种题目，就自己做了，没必要发出来。

作业自己做

引用 2 楼 四斋的回复:输入天数用7求余，然后用if语句打印各个星期试试 或者直接打印结果

输入天数用7求余，然后用if语句打印各个星期试试

#include <stdio.h>  int main(void) { 	printf("%d\n", 2019%7); }


Question: C语言

#include <stdio.h>  int main(void) {     int i = 0;     int father_age, son_age;      father_age = 40;     son_age = 6;     while (1) {         father_age = 40 + i;         son_age = 6 + i;          if (father_age / son_age == 2 && father_age % son_age == 0) {             printf("%d, %d\n", father_age, son_age);             break;         }         i++;     }      printf("%d\n", i); #if 0     for(i=1; i<40; i++)     {         p = 40 +i;         s = 6 +i;          if(p == 2*s)         {             printf("Years:\t%d\n", i);         }     } #endif } 供参考～

运行结果，28年。仅供参考。  #include <stdio.h>  int main(void) { 	int i, p, s; 	 	for(i=1; i<40; i++) 	{ 		p = 40 + i; 		s = 6 + i; 		 		if(p == 2*s) 		{ 			printf("Years:\t%d\n", i); 			break; 		} 	} }


Question: socket 编程，何向客户端传送图片文件？

okay, I got it.  #define byte char Thanks.

引用 7 楼 火花20180731的回复:socket并不在乎你传递得内容是啥，因为对于计算机而言，所有的数据都是二进制流，使用char类型仅仅是因为内存读写的最小单位是字节，而sizeof(char)为1字节。 也就是说，图片文件、视频文件都是以byte为最小单位？

引用 7 楼 火花20180731 的回复:socket并不在乎你传递得内容是啥，因为对于计算机而言，所有的数据都是二进制流，使用char类型仅仅是因为内存读写的最小单位是字节，而sizeof(char)为1字节。 是的。都是二进制，而我们所谓说的各种类型是为了我们的方便，计算机不认识这些，只认识0101的二进制数

如果是linux系统的话，sendfile函数效率很高。  #include <sys/sendfile.h> ssize_t sendfile(int out_fd, int in_fd, off_t *offset, size_t count);

数据以二进制传递，不管字面意思。传文件你只管传数据就可以，文件表达了什么你不用解析。 一个char表示一个数值，就像‘@’编码是0x40，传到另一端也是0x40，对方是按照char来解释还是按照数值来解释你不必操心，你只负责传递正确的值就可以了。

二进制读取文件，放入buf，然后发送。char类型可以的。

引用 2 楼 陳錄生 的回复:好像这篇文章跟你说的方式一样，但是用char 字符似乎不合理，应该定义什么变量？     char buffer[BUF_SIZE] = {0};  //缓冲区     int nCount;     while( (nCount = fread(buffer, 1, BUF_SIZE, fp)) > 0 ){         send(clntSock, buffer, nCount, 0);     } 用u8 buffer[BUF_SIZE];也行  合不合理为什么不试试呢？别人怎么说不如自己亲自试试～

按照正常的传输文件即可，发送端打开文件，读取文件，最后发送数据到对端； 接收端把数据接收之后写入文件，接收完关闭文件。  视频和图片都可以采用这个方式


Question: C语言

引用 3 楼 ctrigger 的回复:仅供参考。代码如下： #include <stdio.h>  int main(void) { 	int i, j; 	 	for(i=1; i<=500; i++) 	{ 		/* 连续数为奇数 */ 		if(i%2 == 1) 		{ 			if(500%i != 0) continue; 			 			printf("%d:\t", i); 			for(j=500/i - i/2; j<=500/i + i/2; j++) 			{ 				printf("%5d", j); 			} 		} 		/* 连续数为奇数 */ 		else 		{ 			if(500%i != i/2) continue;  			printf("%d:\t", i); 			for(j=500/i - (i-1)/2; j<=500/i + i/2; j++) 			{ 				printf("%5d", j); 			} 		} 		printf("\n"); 	} }   运行结果 1:        500 5:         98   99  100  101  102 8:         59   60   61   62   63   64   65   66 25:         8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32 40:        -7   -6   -5   -4   -3   -2   -1    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32 125:      -58  -57  -56  -55  -54  -53  -52  -51  -50  -49  -48  -47  -46  -45  -44  -43  -42  -41  -40  -39  -38  -37  -36  -35  -34  -33  -32  -31  -30  -29  -28  -27  -26  -25  -24  -23  -22  -21  -20  -19  -18  -17  -16  -15  -14  -13  -12  -11  -10   -9   -8   -7   -6   -5   -4   -3   -2   -1    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66 200:      -97  -96  -95  -94  -93  -92  -91  -90  -89  -88  -87  -86  -85  -84  -83  -82  -81  -80  -79  -78  -77  -76  -75  -74  -73  -72  -71  -70  -69  -68  -67  -66  -65  -64  -63  -62  -61  -60  -59  -58  -57  -56  -55  -54  -53  -52  -51  -50  -49  -48  -47  -46  -45  -44  -43  -42  -41  -40  -39  -38  -37  -36  -35  -34  -33  -32  -31  -30  -29  -28  -27  -26  -25  -24  -23  -22  -21  -20  -19  -18  -17  -16  -15  -14  -13  -12  -11  -10   -9   -8   -7   -6   -5   -4   -3   -2   -1    0    1    2    3    4    5    6    7    8    9   10   11   12   13   14   15   16   17   18   19   20   21   22   23   24   25   26   27   28   29   30   31   32   33   34   35   36   37   38   39   40   41   42   43   44   45   46   47   48   49   50   51   52   53   54   55   56   57   58   59   60   61   62   63   64   65   66   67   68   69   70   71   72   73   74   75   76   77   78   79   80   81   82   83   84   85   86   87   88   89   90   91   92   93   94   95   96   97   98   99  100  101  102  如果一个整数不算连续数的话，我写的这个代码第7行的循环应该从2开始。 for(i=1; i<=500; i++) ——》for(i=2; i<=500; i++)

和为500，那么第一个数必须比250小  for (int first = 0; first < 250; first++) { ... } 然后对每个 first连续加，直到 >= 500 最后，判断和是不是500。 如果是，你成功了 如果不是，下一个first 这段代码就自己写吧  勤快些，有好处。

引用 楼主 weixin_52516354 的回复:编写程序，找出连续整数之和是500的所有整数序列。 没有什么限制，这样太多了啊

你好懒哦......


Question: C语言问题求解答

我自己做的也是感觉这四个选项全对，应该是题的问题了，感谢大佬们的解答

全对  出题人水平太低 没搞懂if而已 习惯就好了

楼主可以再提供更多信息，所谓的错误的if语句是什么错误；这些选项都没什么问题。 可以再细化一下这个错误的标准。 A是赋值不是比较，但是赋值之后就和D是一样的了。C也是一样，A是赋值，C是做差之后和D一样：判断一个值是否为真

A\B\C\D四项全对，都符合C语言语法，没毛病。。。

算数运算表达式 赋值运算表达式 逻辑运算表达式 都是表达式的一种，都可以当做if的条件


Question: 为什么有一个是错的，大佬帮帮忙

if(pattern[n]=='\0') { flag_1=1; index=k;//这里加一句 break; }  printf("%s",string+(index+1));这一句把index+1改成index 试试看对不对

#include<stdio.h>  char string[1000000],pattern[1000000];  int main() {     int n;     int i, j, k;  #if  1     scanf("%s",string);     scanf("%d",&n);      i = 0;     while (i < n) {          scanf("%s", pattern);          j = 0;         while (string[j]) {             if (string[j] == pattern[0]) {                 for (k = 0; string[j+k] && pattern[k]; k++)                     if (string[j+k] != pattern[k])                         break;                 if (pattern[k] == 0 && string[j+k] != 0) {                     puts(string+j);                     break;                 }                 if (string[j+k] == 0) {                     printf("Not found!\n");                     break;                 }             }             j++;         }         if (string[j] == 0)             printf("Not found!\n");         i++;     } #else     char string[1000000],pattern[1000000];     int n;     scanf("%s",string);     scanf("%d",&n);     for(int i=0; i<n; i++)     {         int m=0,n=0,index=0,flag=0,flag_1=0;         scanf("%s",pattern);         while(string[m]!='\0')         {             if(string[m]==pattern[0])             {                 for(int k=m+1,n=1;; k++,n++)                 {                     if(string[k]=='\0'&&pattern[n]!='\0')                     {                         flag=1;                         break;                     }                     if(pattern[n]=='\0')                     {                         flag_1=1;                         break;                     }                     if(string[k]==pattern[n])                         index=k;                     else                         break;                 }             }             m++;             if(flag||flag_1)                 break;         }         if(flag_1)         {             printf("%s",pattern);             printf("%s",string+(index+1));             printf("\n");         }         else             printf("Not Found\n");     } #endif     return 0; }  供参考～


Question: 请问字符串数组用scanf写入时提示访问冲突是什么原因？

引用 4 楼 自信男孩 的回复: scanf_s("%s", str, 6);  scanf_s和scanf的区别建议楼主搜一下，然后学习一下吧 haode!!

引用printf("%s", str[cnt]);这句输出因改为： printf("%c", str[cnt]);

引用 1 楼 赵4老师 的回复:scanf_s("%5s",str,6); https://docs.microsoft.com/en-us/cpp/c-runtime-library/reference/scanf-s-scanf-s-l-wscanf-s-wscanf-s-l?view=msvc-160&viewFallbackFrom=vs-2019 非常感谢！


Question: 为什么输出结果第一个不可以是1，2，3

1,2,3 1,2,4 1,2,5 1,3,2 1,3,4 1,3,5 1,4,2 1,4,3 1,4,5 1,5,2 1,5,3 1,5,4 2,3,4 2,3,5 2,4,3 2,4,5 2,5,3 2,5,4 3,2,4 3,2,5 3,4,2 3,4,5 3,5,2 3,5,4 4,2,3 4,2,5 4,3,2 4,3,5 4,5,2 4,5,3  这是输出结果～

虽然你的代码不太规范，但第一个肯定是1，2，3。。


同样的MFC工程，在自己电脑上编译运行都是ok的。换了台电脑，就显示很多未定义标识符，而且错误大多都是来自系统头文件。这台电脑一开始没装C++，难道是我没装完整?稍微对比了一下，也没发现那个是缺少的啊。电脑重启了一遍，也还是这样。    能不能帮帮忙，顺带也把这个问题也解决了啊。感谢各位了。

类型不匹配，传递指针，如果类型不一样，那么这个指针控制的内存区域是不一样的。

引用 1 楼 赵4老师 的回复:IB_POINT ibps1[9],ibps2[9]; for (int i=0;i<9;i++) {  ibps1[i].dX=pDlg->PixlPoint[i].x;  ibps1[i].dY=pDlg->PixlPoint[i].y;  ibps2[i].dX=pDlg->PhyPoint[i].x;  ibps2[i].dY=pDlg->PhyPoint[i].y; } 将第哦啊用函数中的参数 pDlg->PixlPoint替换为ibps1， pDlg->PhyPoint替换为ibps2     谢谢，我刚刚自己解决了。方法差不多就是您这样的。直接将一开始定义的POINTF修改为IB_POINT。就直接可以了。   后续稍做修改就跑通了。打断点也确实看到数据流通也没有问题。  不过还是谢谢你了哈。


Question: 字符转换

这一句 for(m=0;m<l;m++) { if(a[m]==a[i]) break;} 和这一句 if(a[i]!=a[m]) break; 有冲突，前一句a[m]==a[i]后跳出执行第二句，a[m]==a[i]，也就是第二句条件始终不会成立; 所以a[i]=97+k会一直循环到最后，也就是'z'。

你的代码要干什么？

引用 2 楼 自信男孩的回复:因为在第二个for循环里，一直在97+k，最后把97+25赋值给了a[i]。相当于执行了a[i] = 97+k;26次，a[i]只保存最后一次的修改，最后一次的修改就是97+25  这句下面的代码都是冗余的，没有意义的；  如果将第三个for循环外的 if (a[m] != a[i])     break; 改成： f (a[m] == a[i])     break; 还能提前退出第二个for的循环，而a[i] = 97+k;这个k可能是0~25之间的某个数； 我知道问题了，for语句的m是局部变量 怎么把它变成全局啊

引用 9 楼  的回复:[quote=引用 8 楼 的回复:]问一下for语句用了break后它的变量会怎么样？ 比如for(i=0;i<100;i++)  中途用了break 跳出循环后i是多少 #include<stdio.h> #include<string.h> int main() {     char english[2][20]={"red","white"};     char chinese[2][20]={"红色","白色"};     char a[20];     int i;     scanf("%s",a);     for(i=0;i<2;i++)     {         if(strcmp(a,english[i])==0)         break;         if(strcmp(a,chinese[i])==0)         break;            }     if(i<2)     {     printf("%s   ",english[i]);     printf("%s\n",chinese[i]);     }     if(i=2)     printf("not found"); }  为什么无论如何都会输出not found[/quote]   if(i=2) 这样的表达式怎么都会输出if后面的语句。因为这个是恒成立的。i=2，2是真。应该是i == 2吧，要细心一些哦～

if(i=2) 改成if(i==2)

引用 8 楼 的回复:问一下for语句用了break后它的变量会怎么样？ 比如for(i=0;i<100;i++)  中途用了break 跳出循环后i是多少 break之前的值，不会再自增

引用 8 楼 的回复:问一下for语句用了break后它的变量会怎么样？ 比如for(i=0;i<100;i++)  中途用了break 跳出循环后i是多少 #include<stdio.h> #include<string.h> int main() {     char english[2][20]={"red","white"};     char chinese[2][20]={"红色","白色"};     char a[20];     int i;     scanf("%s",a);     for(i=0;i<2;i++)     {         if(strcmp(a,english[i])==0)         break;         if(strcmp(a,chinese[i])==0)         break;            }     if(i<2)     {     printf("%s   ",english[i]);     printf("%s\n",chinese[i]);     }     if(i=2)     printf("not found"); }  为什么无论如何都会输出not found

没明白想要把‘?’换成什么， 试试把这一句 if(a[m]==a[i]) break; 改成 if((a[m]==a[i])&&(m!=i)) break; 你想要的结果是不是这个样子

引用 3 楼  的回复:我的想法是如果第一个break执行，第二个break就不会执行；如果第一个break不执行，第二个break就执行。感觉没毛病诶 外面再用m可能已经越界了。f (m < l && a[m] == a[i])     break;  确保m小于l，否则越界～


Question: 如何定义一个函数指针数组

你再想想函数指针怎么定义的？ int func(int,int); int (*ptr//函数指针名)(int,int); ptr=&func; 所以[] 必须放到ptr后面

(int (*)(int,int)) a[10] 这个为什么错的，因为 (int (*)(int,int))  他不是类型而是一个定义一个类型的指针

C++11 方便多了 int func(int ,int); decltype(func)* a[1]{func};

引用 1 楼 自信男孩 的回复:typedef int (*pfunc)(int, int); pfunc a[10]; 这样试试；  或者  int (*a[10])(int, int); 这样定义也是可以的。  以上都是定义指针数组。 定义函数指针数组～


Question: 数组

不难的题目吧，为啥不自己先尝试着写写呢？


Question: 求大佬帮忙

引用 2 楼 qybao的回复:动态申请内存 for example  int main( ) {     int n, i, *a;     printf("请输入n:");     scanf("%d", &n);     a = (int*)malloc(sizeof(int)*n);     printf("请输入n个变量的值:");     for (i=0; i<n; i++) {         scanf("%d", &a[i]);     }     //计算处理，LZ自己加吧          //打印结果     for (i=0; i<n; i++) {         printf("a[%d]=%d ", i, a[i]);     }          free(a);     return 0; } 多谢大佬！

引用 1 楼 自信男孩的回复:做什么计算？ 就是四则运算那种

做什么计算？


Question: 为什么我的电脑上system函数用不了

引用 4 楼 赵4老师的回复:现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 能详细点吗，管理员窗口我只用过cd改mysql目录进行登录≥﹏≤

引用 1 楼 自信男孩的回复:确定跟system有关吗？注释掉试试？ 没看出跟system这句有关系呢，不是有提示"按任意键关闭此窗口..."这句吗？这句不是针对system的吗？ 我在学校机房是没问题的，自己电脑就不行了

引用 1 楼 自信男孩的回复:确定跟system有关吗？注释掉试试？ 没看出跟system这句有关系呢，不是有提示"按任意键关闭此窗口..."这句吗？这句不是针对system的吗？ 首先第一个system是修改背景板和字体颜色，就已经没有生效了，其次第二个system是冻结屏幕，出现的提示是“请按任意键继续”也没有出现

mysql也有system命令


Question: c语言小白问题

#include <stdio.h>  int main(void) {     int x, y;     int a=2,b=4,c=6;     y= ((x=a+b), (b+c));     printf("y=%d，x=%d\n",y, x) ;      return 0; } 楼主这个值是y=10，但是对比一下你的表达式有什么不一样？  举个例子：  int x = 5, y; 请问x？y?  这样的表达式你可能比较理解，因为是对x初始化为5，y没有初始化；  你可能是理解为逗号表达式，但是楼主的y = (x=a+b), (b+c);y后面的表达式是一个整体吗？和上面的代码是不是相差一个()呢？


Question: 求教萌新，萌新依旧不知道自己错在了哪里，代码可以正常运行，但输出结果错误，全为-1

引用 5 楼 forlorn pedestrian 的回复:[quote=引用 4 楼 自信男孩的回复:][quote=引用 2 楼 forlorn pedestrian 的回复:][quote=引用 1 楼 自信男孩的回复:]#include<stdio.h>  //double fac(int m, int n) double fac(long int m, long int n) {     int i, j, k, l, q, t;     double s;      s = 0;     l = 1;     q = 1;     t = 1;      for (i = 1;i <= m;i++) {         l = l * i;     }     for (j = 1;j <= n;j++) {         q = q * j;     }     for (k = 1;k <= (m - n);k++) {         t = t * k;     }     s = l*1.0 / q / k;   //保证这个运算是double类型的      return s; } int main() {     long int m, n;     //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n);      if (m < n && m>0 && n > 0) {         printf("0");         return 0;     }     if (m == n && m > 0 && n > 0) {         printf("1");         return 0;     }      if (m > n && m > 0 && n > 0) {         printf("%lf", fac(m, n));         return 0;     }     else         printf("-1");     return 0; } 供参考～      //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n); 对比一下问题  注意事项： s = l*1.0 / q / k;   //保证这个运算是double类型的   //double fac(int m, int n) double fac(long int m, long int n) 可是我依然运行不对，结果全是-1,所以我想问问我哪错了[/quote] 那把你的测试用例发一下，就是你的测试数据～[/quote] 2 2 4 3[/quote]  请再用我的代码测试一下？我的测试结果是这样的： 2 2 1 4 3 2.000000

引用 4 楼 自信男孩的回复:[quote=引用 2 楼 forlorn pedestrian 的回复:][quote=引用 1 楼 自信男孩的回复:]#include<stdio.h>  //double fac(int m, int n) double fac(long int m, long int n) {     int i, j, k, l, q, t;     double s;      s = 0;     l = 1;     q = 1;     t = 1;      for (i = 1;i <= m;i++) {         l = l * i;     }     for (j = 1;j <= n;j++) {         q = q * j;     }     for (k = 1;k <= (m - n);k++) {         t = t * k;     }     s = l*1.0 / q / k;   //保证这个运算是double类型的      return s; } int main() {     long int m, n;     //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n);      if (m < n && m>0 && n > 0) {         printf("0");         return 0;     }     if (m == n && m > 0 && n > 0) {         printf("1");         return 0;     }      if (m > n && m > 0 && n > 0) {         printf("%lf", fac(m, n));         return 0;     }     else         printf("-1");     return 0; } 供参考～      //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n); 对比一下问题  注意事项： s = l*1.0 / q / k;   //保证这个运算是double类型的   //double fac(int m, int n) double fac(long int m, long int n) 可是我依然运行不对，结果全是-1,所以我想问问我哪错了[/quote] 那把你的测试用例发一下，就是你的测试数据～[/quote] 2 2 4 3

引用 2 楼 forlorn pedestrian 的回复:[quote=引用 1 楼 自信男孩的回复:]#include<stdio.h>  //double fac(int m, int n) double fac(long int m, long int n) {     int i, j, k, l, q, t;     double s;      s = 0;     l = 1;     q = 1;     t = 1;      for (i = 1;i <= m;i++) {         l = l * i;     }     for (j = 1;j <= n;j++) {         q = q * j;     }     for (k = 1;k <= (m - n);k++) {         t = t * k;     }     s = l*1.0 / q / k;   //保证这个运算是double类型的      return s; } int main() {     long int m, n;     //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n);      if (m < n && m>0 && n > 0) {         printf("0");         return 0;     }     if (m == n && m > 0 && n > 0) {         printf("1");         return 0;     }      if (m > n && m > 0 && n > 0) {         printf("%lf", fac(m, n));         return 0;     }     else         printf("-1");     return 0; } 供参考～      //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n); 对比一下问题  注意事项： s = l*1.0 / q / k;   //保证这个运算是double类型的   //double fac(int m, int n) double fac(long int m, long int n) 可是我依然运行不对，结果全是-1,所以我想问问我哪错了[/quote] 那把你的测试用例发一下，就是你的测试数据～

楼主主函数的逻辑判断有问题，修改如下：int main(int argc, char* argv[]) {     long int m, n;     //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n);      if(m>0 && n > 0)      {        if (m < n)           {             printf("0\n");             //return 0;  //这句多余           }        if (m == n )           {             printf("1\n");             //return 0;  //这句多余           }        if (m > n )           {             printf("%lf\n", fac(m, n));             //return 0;  //这句多余           }      }     else        printf("-1\n");     system("pause");     return 0; }

引用 1 楼 自信男孩的回复:#include<stdio.h>  //double fac(int m, int n) double fac(long int m, long int n) {     int i, j, k, l, q, t;     double s;      s = 0;     l = 1;     q = 1;     t = 1;      for (i = 1;i <= m;i++) {         l = l * i;     }     for (j = 1;j <= n;j++) {         q = q * j;     }     for (k = 1;k <= (m - n);k++) {         t = t * k;     }     s = l*1.0 / q / k;   //保证这个运算是double类型的      return s; } int main() {     long int m, n;     //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n);      if (m < n && m>0 && n > 0) {         printf("0");         return 0;     }     if (m == n && m > 0 && n > 0) {         printf("1");         return 0;     }      if (m > n && m > 0 && n > 0) {         printf("%lf", fac(m, n));         return 0;     }     else         printf("-1");     return 0; } 供参考～      //scanf_s("ld ld", &m, &n);     scanf_s("%ld %ld", &m, &n); 对比一下问题  注意事项： s = l*1.0 / q / k;   //保证这个运算是double类型的   //double fac(int m, int n) double fac(long int m, long int n) 可是我依然运行不对，结果全是-1,所以我想问问我哪错了


Question: 求指点顺序栈的出栈入栈操作

#include <stdio.h> #include <malloc.h>  #define maxsize 100  typedef struct node {     int stack[maxsize];     int top; }Seqstack;  Seqstack *initstack(Seqstack *s) {     s=(Seqstack *)malloc(sizeof(Seqstack));     if(!s) {         printf("空间不足\n");         return NULL;     }     else {    s->top=-1;         return s;     } } Seqstack *push(Seqstack *s,int x) {     if(s->top==maxsize-1)     {         printf("栈已满\n");         return NULL;   }     else   {         s->top++;         s->stack[s->top]=x;         return s;     } }  int pop(Seqstack *s) {   if(s->top==-1)     {         printf("栈空\n");         //return NULL;    //为啥要返回NULL？         return -1;     }     else         s->top--;     return s->stack[s->top+1]; } void display(Seqstack *s) {     int i = 0;      if(s->top==-1)     {         printf("栈空\n");     }     else {         while(i < s->top)         {             //s->top--;             printf("%d->",s->stack[i]);             i++;         }     } }  //void main() int main() {   Seqstack *s,*p;     int i;     int a[6]={3,5,7,2,9,16};     s=initstack(s);     printf("入栈:");     for(i=0;i<6;i++)         s = push(s,a[i]);     display(s);     printf("\n出栈:");     while(s->top!=-1)         printf("%4d", pop(s));     printf("\n"); } 供参考～  原因是在display函数，这个函数已经修改了top值，导致在出栈时top已经是-1了，所以没有出栈的数据了。 所以，在display函数里不要修改top的值，只是做一下遍历即可～


Question: ip address类型怎么定义?

u32（unsigned int）也可以存放IP地址。

socket.h里面不是有吗？直接用啊 如果不用socket，ipv4，不过是32位整形，直接unsigned int 就可以啊

看你的需要了，可以是字符串，也可以用无符号整数，也可以用结构


Question: 求助大佬解题，C语言

引用 1 楼 user-2 的回复:SHOW一个吧，看看符合要求不？  #include <string.h> #include <stdio.h> #include <ctype.h>  #define LEN 31   /* 去掉左空格 */ char *left_trim(char *str) {     char *beginp = str;     char *tmp = str;     while(isspace(*beginp)) beginp++;     while((*tmp++ = *beginp++));       return str; }  /* 去掉右空格 */ char *right_trim(char *str) {     char *endp;     size_t len = strlen(str);       if(len == 0) return str;       endp = str + strlen(str) - 1;     while(isspace(*endp)) endp--;     *(endp + 1) = '\0';       return str; }  /* 去掉空格 */ char *trim(char *str) {     str = left_trim(str);     str = right_trim(str);       return str; }   int main(void) {     char buf[LEN];     char result[LEN+2];          /* 循环读入字符串，并处理。 */     while(fgets(buf, LEN, stdin))     {         /* 去掉换行符 */         if(buf[strlen(buf)-1] == '\n')         {             buf[strlen(buf)-1] = '\0';         } 	         /* 输出结果 */         printf("[%s]\n", buf);         printf("[%s]\n", trim(buf));     }              return 0; }   换行符有可能不会加入到buf中，所以需要注意一下～

引用 10 楼 晨星永恒 的回复:[quote=引用 9 楼 自信男孩 的回复:]#include <stdio.h> #include <string.h>  #define MAX_STR_SIZE    31  char *del_front_tail_spaces(char *str, int len) {     int pos = len-1, i;      //deal with tail     while (str[pos] == ' ')         pos--;     str[pos+1] = 0;      //deal with front     pos = 0;     while (str[pos] == ' ')         pos++;     for (i = 0; str[pos+i]; i++)    //move data replace spaces         str[i] = str[pos+i];     str[i] = 0;      return str; }  int main(void) {     char str[MAX_STR_SIZE];     int len;      fgets(str, MAX_STR_SIZE, stdin);      len = strlen(str);     if (len < MAX_STR_SIZE - 1) {         str[len-1] = 0;   //'\0' replace '\n'         len--;     }       printf("[%s]\n", str);      del_front_tail_spaces(str, len);      printf("[%s]\n", str);     return 0; } 供参考～ 大佬，你这个是第一二个正确，第三个错误[/quote]  找一下对应的测试用例～

我改了一下，把前面3个函数变成1个函数，看看是不是函数调用问题，嵌套太大，影响效率了。。  #include <string.h> #include <stdio.h>   #define LEN 31    /* 去掉空格 */ char *trim(char *str) {     char *beginp, *endp, *tmp;     size_t len = strlen(str);      if(len == 0) return str;        endp = str + strlen(str) - 1;     while(*endp == ' ') endp--;     *(endp + 1) = '\0';          beginp = tmp = str;         while(*beginp == ' ') beginp++;     while((*tmp++ = *beginp++));          return str; }    int main(void) {     char buf[LEN];           /* 循环读入字符串，并处理。 */     if(fgets(buf, LEN, stdin))     {         /* 去掉换行符 */         if(buf[strlen(buf)-1] == '\n')         {             buf[strlen(buf)-1] = '\0';         }               /* 输出结果 */         printf("[%s]\n", buf);         printf("[%s]\n", trim(buf));     }               return 0; }

#include<stdio.h> #include<string.h> int main() {     char a[100];     int i=0,b;     gets(a);     printf("[%s]\n",a);     while(1)     {if(a[0]==' ')     {         for(i=0;i<strlen(a);i++)             a[i]=a[i+1];     }      else          break;     }      b=strlen(a)-1;     while(1)      {          if(a[b]==' ')          {              a[b]=0;              b--;          }         else             break;      }     printf("[%s]",a);          return 0; } 我这种是最后一个正确，前两个错误

引用 9 楼 自信男孩 的回复:#include <stdio.h> #include <string.h>  #define MAX_STR_SIZE    31  char *del_front_tail_spaces(char *str, int len) {     int pos = len-1, i;      //deal with tail     while (str[pos] == ' ')         pos--;     str[pos+1] = 0;      //deal with front     pos = 0;     while (str[pos] == ' ')         pos++;     for (i = 0; str[pos+i]; i++)    //move data replace spaces         str[i] = str[pos+i];     str[i] = 0;      return str; }  int main(void) {     char str[MAX_STR_SIZE];     int len;      fgets(str, MAX_STR_SIZE, stdin);      len = strlen(str);     if (len < MAX_STR_SIZE - 1) {         str[len-1] = 0;   //'\0' replace '\n'         len--;     }       printf("[%s]\n", str);      del_front_tail_spaces(str, len);      printf("[%s]\n", str);     return 0; } 供参考～ 大佬，你这个是第一二个正确，第三个错误

引用 7 楼 user-2的回复:[quote=引用 4 楼 晨星永恒 的回复:]大佬，感觉还是有点问题，三项判断，最后一项正确  我个人理解题目只有2个要求：1、去掉首尾空客；2、不超过30个字符。 可能是我语文不好，可能还有暗含潜规则，我没看出来。[/quote] 我感觉也是这，但他就是说错误，也想不出这个题能有什么特殊情况了

引用 4 楼 晨星永恒 的回复:大佬，感觉还是有点问题，三项判断，最后一项正确  我个人理解题目只有2个要求：1、去掉首尾空客；2、不超过30个字符。 可能是我语文不好，可能还有暗含潜规则，我没看出来。

引用 2 楼 自信男孩的回复:[quote=引用 1 楼 user-2 的回复:]SHOW一个吧，看看符合要求不？  #include <string.h> #include <stdio.h> #include <ctype.h>  #define LEN 31   /* 去掉左空格 */ char *left_trim(char *str) {     char *beginp = str;     char *tmp = str;     while(isspace(*beginp)) beginp++;     while((*tmp++ = *beginp++));       return str; }  /* 去掉右空格 */ char *right_trim(char *str) {     char *endp;     size_t len = strlen(str);       if(len == 0) return str;       endp = str + strlen(str) - 1;     while(isspace(*endp)) endp--;     *(endp + 1) = '\0';       return str; }  /* 去掉空格 */ char *trim(char *str) {     str = left_trim(str);     str = right_trim(str);       return str; }   int main(void) {     char buf[LEN];     char result[LEN+2];          /* 循环读入字符串，并处理。 */     while(fgets(buf, LEN, stdin))     {         /* 去掉换行符 */         if(buf[strlen(buf)-1] == '\n')         {             buf[strlen(buf)-1] = '\0';         } 	         /* 输出结果 */         printf("[%s]\n", buf);         printf("[%s]\n", trim(buf));     }              return 0; }   换行符有可能不会加入到buf中，所以需要注意一下～[/quote] 不太懂

引用 1 楼 user-2的回复:SHOW一个吧，看看符合要求不？  #include <string.h> #include <stdio.h> #include <ctype.h>  #define LEN 31   /* 去掉左空格 */ char *left_trim(char *str) {     char *beginp = str;     char *tmp = str;     while(isspace(*beginp)) beginp++;     while((*tmp++ = *beginp++));       return str; }  /* 去掉右空格 */ char *right_trim(char *str) {     char *endp;     size_t len = strlen(str);       if(len == 0) return str;       endp = str + strlen(str) - 1;     while(isspace(*endp)) endp--;     *(endp + 1) = '\0';       return str; }  /* 去掉空格 */ char *trim(char *str) {     str = left_trim(str);     str = right_trim(str);       return str; }   int main(void) {     char buf[LEN];     char result[LEN+2];          /* 循环读入字符串，并处理。 */     while(fgets(buf, LEN, stdin))     {         /* 去掉换行符 */         if(buf[strlen(buf)-1] == '\n')         {             buf[strlen(buf)-1] = '\0';         } 	         /* 输出结果 */         printf("[%s]\n", buf);         printf("[%s]\n", trim(buf));     }              return 0; }  大佬，感觉还是有点问题，三项判断，最后一项正确


Question: 新手求助 数据结构 二叉树

已自行修改，成功运行👌

C与C++大杂烩，乱成一锅粥，谁看谁难受。

你这叫新手，你好像在侮辱人


Question: PTA入门练习请教  整除光棍 /shuffling machine/黑洞数

大家可以不要管那个完数 今晚我脑子太乱了 明早起来再看一下 谢谢啦  然后里面肯定有很多错误 各位就不要客气  就直接指出吧  ，， （已经被小伙伴打击习惯了 哈哈哈 多么辛酸）   谢谢啦 各位晚安 （睡不了美容觉 保命觉也得睡啊，避免英年早逝）


Question: #C语言基础

if(a[i]=='?') {    a[i]='!'; }

引用 1 楼 阿麦的回复:不能。strcmp(const char*, const char*)，参数是字符指针  a[i]类型不对  如果要这样判断，可以用  a[i] == '?' 那怎么把a[i]替换成别的字符呢？

我傻了，用了双引号

引用 3 楼 棉猴的回复: if(a[i]=='?') {    a[i]='!'; }  cannot convert from 'char[2]' to 'char' 不行啊


Question: c语言vc2010可以运行的程序为什么Dev不可以运行

引用 2 楼 轻语2000的回复:你看你的报错提示啊“bianli” was not declared bianli那是之前的一个函数，我把他给删掉了，没删之前就有错误，说要return int

建议楼主把代码贴全，并把问题的内容贴全。

小错误要注意

你看你的报错提示啊“bianli” was not declared

因为你这代码不规范，vc2010太老了，新标准支持不到位。 最好用vs2019，或者Embarcadero_Dev-Cpp_6.1（gcc9.2）

原因很清楚了，严格来说， int func() {} 必须返回一个 int。如果没有返回值，定义成 void func() {}  引用 5 楼 m0_51316636 的回复:[quote=引用 2 楼 轻语2000的回复:]你看你的报错提示啊“bianli” was not declared bianli那是之前的一个函数，我把他给删掉了，没删之前就有错误，说要return int[/quote]

引用 5 楼 m0_51316636的回复:[quote=引用 2 楼 轻语2000的回复:]你看你的报错提示啊“bianli” was not declared bianli那是之前的一个函数，我把他给删掉了，没删之前就有错误，说要return int[/quote] 所以说嘛，应该把代码贴完整，不然要误会


Question: 小白在c语言中遇到的问题

1.0/3首先结果是一个浮点数(double），如果用%d输出，由于浮点数和整型数在内存里的表示是不一样的。同样是1和1.0f对于不同的类型（浮点数和整型数），虽然都是4字节，但是可以看一下对应的16进制是不一样的。      printf("%x\n", 1.0f);     printf("%x\n", 1); 这是结果： cff6c8 1

/是整数除，以%d输出，浮点除还是用%f吧

1.0/3是double类型，在内存中的值是  转换成int是1431655765 double类型的格式，请参考《C++浮点型变量的存储方式》 希望能够帮到您！

有趣。不知道是不是所有编译器都是这个结果。 不过，还是按照规矩来比较好，用 %f。 有时候，不规范或错误的事做多了，会变成习惯的。


Question: 键盘焦点，这是什么情况？？

BOOL WINAPI GetGUIThreadInfo(   _In_     DWORD idThread,   _Inout_  LPGUITHREADINFO lpgui );  BOOL WINAPI GetGUIThreadInfo(   _In_     DWORD idThread,   _Inout_  LPGUITHREADINFO lpgui );        Parameters idThread [in]  Type: DWORD  The identifier for the thread for which information is to be retrieved. To retrieve this value, use the GetWindowThreadProcessId function. If this parameter is NULL, the function returns information for the foreground thread.  lpgui [in, out]  Type: LPGUITHREADINFO  A pointer to a GUITHREADINFO structure that receives information describing the thread. Note that you must set the cbSize member to sizeof(GUITHREADINFO) before calling this function.  Return value Type:   Type: BOOL   If the function succeeds, the return value is nonzero.  If the function fails, the return value is zero. To get extended error information, call GetLastError.  Remarks This function succeeds even if the active window is not owned by the calling process. If the specified thread does not exist or have an input queue, the function will fail.  This function is useful for retrieving out-of-context information about a thread. The information retrieved is the same as if an application retrieved the information about itself.  For an edit control, the returned rcCaret rectangle contains the caret plus information on text direction and padding. Thus, it may not give the correct position of the cursor. The Sans Serif font uses four characters for the cursor:

多线程日志参考下面：//循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef _MSC_VER     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX; CRITICAL_SECTION cs_BBB; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             Log("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,struct FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef _MSC_VER     pthread_exit(NULL); #endif } int main() { #ifdef _MSC_VER     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX);     InitializeCriticalSection(&cs_BBB); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef _MSC_VER     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef _MSC_VER     DeleteCriticalSection(&cs_BBB);     DeleteCriticalSection(&cs_HEX);     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }

引用 8 楼 早打大打打核战争 的回复:你检查一下SetActiveWindow成功了没有 的确是设置失败（返回NULL），可是这个跟WM_ACTIVATE有关系吗？ 刚刚我把SetActiveWindow(hwnd); 注释了，保留SetForegroundWindow ( hwnd2 );，结果是这样的：    在我并没有设置激活的情况下，消息依然显示是先失去激活，之后又激活，但这时输入的字符都在记事本那里，这边窗口应该是失去激活的。 我也顺便确认了下，WM_ACTIVATE是非队列消息，那么应该就不存在因延迟而混乱的情况。

你检查一下SetActiveWindow成功了没有

引用 4 楼 赵4老师 的回复:估计是多道程序（包括多进程、多线程、……）输出日志信息时没有加锁。 引用 6 楼 早打大打打核战争 的回复:输出log时加上时间就能看出来了 你们说的日志、log是啥？？windows 日志吗？ 对于不同进程即便顺序混乱，但对于单个程序来说，不可能也不应该混乱吧？它这不是一个一个消息逐步处理的吗？顺序乱了的话，岂不就异常了？

引用 2 楼 赵4老师 的回复:帮结帖+蹭分 问题都还没解决呢

引用 4 楼 赵4老师 的回复:估计是多道程序（包括多进程、多线程、……）输出日志信息时没有加锁。 从而导致看上去日志信息的顺序和实际程序输出日志的顺序不完全一致。 我猜。

估计是多道程序（包括多进程、多线程、……）输出日志信息时没有加锁。

输出log时加上时间就能看出来了

帮结帖+蹭分

问题应该是找到了，GetActiveWindow和GetFocus都是只能获取当前线程相关的。  现在应该只剩一个问题，WM_ACTIVATE应该是先激活（1）再失去激活（0），但这里收到的消息顺序是相反的，而且实际的效果是先激活了，再由于调用了SetForegroundWindow而失去激活，先1再0才对呀


Question: 弱弱的猿C语言遇到大问题

推荐是看书，还是按看视频，本人看书感觉有点乏味

引用 3 楼 ctrigger 的回复:[quote=引用 2 楼 namedashadiao 的回复:]数据结构和算法有推荐的学习途径吗？ 大学不学数据结构和算法么？啥情况？？ 严蔚敏老师的数据结构不错，适合入门。[/quote] 不是不学，大二学，想提前学

写是最好的练习

引用 2 楼 namedashadiao 的回复:数据结构和算法有推荐的学习途径吗？ 大学不学数据结构和算法么？啥情况？？ 严蔚敏老师的数据结构不错，适合入门。

数据结构和算法有推荐的学习途径吗？

学完数据结构与算法再蓝桥吧


Question: 技术小白刚开始学c，能有大佬帮忙看下哪里有问题吗，谢谢大佬们了

谢谢大佬！不过还想问问我原来的为什么运行出来的结果很奇怪

#include<stdio.h> #include<string.h>  char s1[500],s2[20]; char substr[20];  void findshort(char str[]) {     int len, i, sub_len = 0;       len = strlen(str);      for (i = 0; str[i]; i++) {         if (sub_len == 0 && (str[i] == ' ' || str[i] == '\n'))             continue;         if (str[i] == ' ' || str[i] == '\n') {             if (sub_len < len && sub_len != 0) {                 len = sub_len;                 memcpy(substr, &str[i-sub_len], sub_len);                 substr[sub_len] = 0;             }             sub_len = 0;         } else if (str[i] != '\n') {             sub_len++;         }     }  #if 0     int c,i,j,min;     c=strlen(s);     min=0;     j=0;     for(i=0;i<c;i++)     {          if (s[i]>=((s[i]>='a'&&s[i]<='z')||(s[i]>='A'&&s[i]<='Z')))             j++;         else         {             if (min<j)                 for(int n=0;n<j;n++)                     s2[n]=s[i-j+n];             j=0;         }     } #endif }  int main() {     fgets(s1, 500, stdin);     findshort(s1);     printf("%s\n", substr);     return 0; } 供参考～


Question: 关于EOF

把while(scanf("%d %d ",&a,&b)!=EOF) 改成 while(scanf("%d%d ",&a,&b)!=0) 然后输入非数字退出循环。

不行不行，我用VC还是结束不了

linux: ctrl+d windows: ctrl+z 试试～

Linux是 ctrl + D windows 是ctrl + z


Question: 关于c语言数组的问题

引用if(i％5=0) printf("\n");这句有误，应该为if(i％5==0)

建议看看动态规划，你这个明显是有重叠子问题，这是状态转移方程，这个跟数组没冲突。

[i]表示的是地址门牌号为i f[i]表示的是那第i个门牌号里住了几个人

他的地址不变，也就是存放的空间不变，而不是他里面存放的东西不能变。

计算斐波那契数列 1,1,2,3,5,....

不是呀  数组元素你可以修改的  f[i]=f[i-1]+f[i-2]就是从数组的第三个元素开始 元素的值是前两个元素的和

一般来说，数组元素赋初值后是可以改变的。f［i］=f[i-2]+f［i-1］，这句话的意思就是从第三个元素开始，后面的每个元素等于前两个元素之和


Question: 这道数据结构是不是题有问题

同问楼主解决了吗

各位大佬写出来的把可能的中序排列写一下就行，这样比较简单，但是我觉得没有这课树我画出最接近的树前序序列为abcdfeg


Question: 波形图怎么求幅度？

如何过滤掉毛刺和抖动？？如何判断第一个波形，第一个波形的波幅要不要纳入计算？？？最后一个波形如何判断，如何处理？？题主是这还是一个比较规则的波形，现实采样的波形必定有毛刺，有些波形比如脉搏还会有抖动（就是上升过程中到部分人的都会中途抖一下）。请不要以纯数学的角度来考虑问题。。。我抖没百度到解决方法，估计波幅算法都是属于每个公司的核心资产。。。。

而且抖动那次有的时候比最终的那个波顶还要高，有的时候却比最终那个波顶低，而且不是每次都会抖那么一下。。请问各位怎么处理。。。。。

感觉你说的波幅和我的不一样，不属于核心算法，只是求一个正弦波的斜率

那就太简单了，最简单的方法就是找出最大最小值即可。复杂一点找出两个拐点就可以。。

引用 3 楼 顾染尘 的回复:[quote=引用 2 楼 ctrigger 的回复:]扫描点，找Y最大值，最小值。 （最大值-最小值）/ 2。。。 我理解就是峰值减去谷值除以2，对的吗？（我还以为幅度是要求角度或者是斜率）感谢！[/quote]  对，就是这样的。 方程应该类似这样的：y = Asin(ωx + φ)，复制是A。

引用 2 楼 ctrigger 的回复:扫描点，找Y最大值，最小值。 （最大值-最小值）/ 2。。。 我理解就是峰值减去谷值除以2，对的吗？（我还以为幅度是要求角度或者是斜率）感谢！

扫描点，找Y最大值，最小值。 （最大值-最小值）/ 2。。。

從圖形求幅度？掃描每個點的坐標不就出來了嗎


Question: 初学者关于随机数统计结果的的问题

void gen_random(int upper_bound) {         int i;          srand(time(NULL);    //生成一个种子～         for(i=0;i<N;i++)                 a[i]=rand()%upper_bound; }

可以的，蟹蟹。

伪随机数。设置一个seed吧。 看看这样是否可行。  #include <stdlib.h> #include <time.h> #define N 100000  int a[N]; void gen_random(int upper_bound) {         int i; 	 	srand((unsigned int)time(NULL)); 	         for(i=0;i<N;i++)                 a[i]=rand()%upper_bound; } int howmany(int value) {         int count=0,i;         for (i=0;i<N;i++)                 if(a[i]==value)                         ++count;         return count; } int main(void) {         int i;         gen_random(10);         printf("value\thow many\n");         for(i=0;i<10;i++)                 printf("%d\t%d\n",i,howmany(i));         return 0; }


Question: switch语句中数值导出运用下面编程

switch(s) {       case 1:printf("d=%d\n",d=a+b-c);break;       case 2:printf("d=%d\n",d=a+c-b);break;       case 3:printf("d=%d\n",d=b+c-a);break;       case 4:printf("d=%d\n",d=0);break;       case 5:printf("d=%d\n",d=c-b+a);break;       case 6:printf("d=%d\n",d=a-b+c);break;       case 7:printf("d=%d\n",d=b-a+c);break;       case 8:printf("d=%d\n",d=a+b);break;       case 9:printf("d=%d\n",d=a+c);break;       case 10:printf("d=%d\n",d=b+c);break;   default:printf("enter data error!\n");     }


Question: vscode编译头文件问题“undefined reference.....”

许多年过去了，赵4老师还是如此的独领风骚

靠猜是猜不出来或猜不全的。建议楼主贴全代码和对应的编译提示～

这是链接错误。  需要在链接选项中添加依赖的库文件。

上贴中红字应改为 “/link /LIBPATH:附加依赖库.lib所在目录"， “/link 附加依赖库.lib" //zhao4zhong1添加(^_^)

https://code.visualstudio.com/docs/cpp/config-msvc From the main menu, choose Terminal > Configure Default Build Task. In the dropdown, which will display a tasks dropdown listing various predefined build tasks for C++ compilers. Choose cl.exe build active file, which will build the file that is currently displayed (active) in the editor.  Tasks C++ build dropdown  This will create a tasks.json file in a .vscode folder and open it in the editor.  Your new tasks.json file should look similar to the JSON below:  {   "version": "2.0.0",   "tasks": [     {       "type": "shell",       "label": "cl.exe build active file",       "command": "cl.exe",       "args": [         "/Zi",         "/EHsc",         "/Fe:",         "${fileDirname}\\${fileBasenameNoExtension}.exe",         "${file}",       “/link /LIBPATH:附加依赖库.lib所在目录"，       “/link /IMPLIB:附加依赖库.lib" //zhao4zhong1添加(^_^)       ],       "problemMatcher": ["$msCompile"],       "group": {         "kind": "build",         "isDefault": true       }     }   ] } The command setting specifies the program to run; in this case that is "cl.exe". The args array specifies the command-line arguments that will be passed to cl.exe. These arguments must be specified in the order expected by the compiler. This task tells the C++ compiler to take the active file (${file}), compile it, and create an executable file (/Fe: switch) in the current directory (${fileDirname}) with the same name as the active file but with the .exe extension (${fileBasenameNoExtension}.exe), resulting in helloworld.exe for our example.


Question: c语言指针问题

他们在这两个例子中都是指针向后移一位是吗

应该说某种情况下，p++和p+1是一样的，*(p+1)是取值

p++是指针 *(p+1)是指针指向的值 p++和p+1也要看前后文才能确定是不是一样 *(p+1)和*(p++)在不同的前后文指向的值可能一样也可能不一样

不一样的。p++是p+1赋值给p，而*(p+1)是p+1的地址，但是不会赋值给p，即这两个的区别：p++和p+1是否修改p上是不一样的。

p++指针位置后移一位，再用*p取值取的就是下一个位置的值 （p+1）是取后一位指针，指针p指向的值*p还是原来位置的值

我想问一下在指针里面他们有什么不同，我看例子两个作用好像都是一样的，都是指针指向的对象向又偏移一个单位


Question: 数组

这样的题不难，最好自己写。

写个吧，你看看行不行？ #include <stdio.h> #define LEN 10  int main(void) { 	int a[LEN], n, i; 	int maxpos, minpos, sum; 	 	/* 输入n值 */ 	printf("input n:\n"); 	scanf("%d", &n); 	 	/* 输入n个数组值 */ 	printf("input n numbers:\n"); 	for(i=0; i<n; i++) 	{ 		scanf("%d", &a[i]); 	} 	 	/* 初始化 */ 	maxpos = minpos = 0; 	sum = a[0]; 	 	/* 扫描数组，找最大值、最小值位置，并计算和 */ 	for(i=1; i<n; i++) 	{ 		sum = sum + a[i]; 		if(a[i] > a[maxpos]) maxpos = i; 		if(a[i] < a[minpos]) minpos = i; 	} 	 	/* 输出结果 */ 	printf("max_value:\t%d\tmin_value:\t%d\n", a[maxpos], a[minpos]); 	printf("max_positon:\t%d\tmin_positon:\t%d\n", maxpos, minpos); 	printf("average_value:\t%.2f\n", 1.0*sum/n);  	return 0; }


Question: accept() 报错 “bad file descriptor"， 请问是什么原因？

引用 3 楼 user-1的回复:[quote=引用 2 楼 陳錄生 的回复:]It works, why? 我的电脑fedora 33，也正常工作。  我觉得应该是“bzero(&s_addr, sizeof(s_addr));”已经赋值0了。即使后面不执行if语句，效果是一样的。[/quote] freebsd handbook是if( INADDR_ANY),而且之前没有报错，太搞了。

引用 2 楼 陳錄生 的回复:It works, why? 我的电脑fedora 33，也正常工作。  我觉得应该是“bzero(&s_addr, sizeof(s_addr));”已经赋值0了。即使后面不执行if语句，效果是一样的。

It works, why?

引用if(INADDR_ANY)         s_addr.sin_addr.s_addr = htonl(INADDR_ANY);   INADDR_ANY的值就是0，是不是写反了？？？


Question: accept函数的addr参数是客户端address还是服务器的addres?

一般来说，服务器端调用accept函数，addr就是客户端地址信息。

这个是对端的地址，对端socket的地址：       The  argument  addr is a pointer to a sockaddr structure.  This structure is filled in with the address of the peer socket


Question: C语言数据结构问题

#define后面的分号去掉，因为define是等价替换，替换之后在malloc的括号里就会出现;分号；

#define最后的分号';'去掉试试

S.base = (StackData*)malloc(STACK_INIT_SIZE * sizeof(StackData)); 就这一句，一直报错。。。


Question: 组合框控件（combobox）

引用 19 楼 早打大打打核战争 的回复:54808041是十六进制还是十进制  十六进制

54808041是十六进制还是十进制

引用 14 楼 六道佩恩 的回复:1. 顶级窗口的父窗口真的是桌面窗口吗？毕竟GetParent得到的是NULL，凭借对桌面窗口调用GetWindow函数得到第一个顶层窗口的句柄这一点应该也无法说明所有顶级窗口的父窗口是桌面窗口吧？主要是我一直也没看到微软文档说过顶级窗口的父窗口是桌面窗口，不过就“SetParent指定父窗口为NULL时设置桌面窗口为父窗口”，测试结果是设置后GetWindow仍然得到NULL，应该算佐证了“顶级窗口的父窗口真的是桌面窗口”吧。  先说点其他的。。。 因为我又去看了下msdn上GetParent的说明，发现GetParent有了更详细的说明，微软确实一直在更新啊。 以前的版本（vs2008）： If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window, the return value is a handle to the owner window. If the window is a top-level unowned window or if the function fails, the return value is NULL  微软说了，这个函数可以获取owner窗口，但我实际测试时不行，我以前一直疑惑为什么这个函数获取不到我想要的owner窗口，直到我今天看到最新说明。。。  最新说明： If the window is a child window, the return value is a handle to the parent window. If the window is a top-level window with the WS_POPUP style, the return value is a handle to the owner window.  只有带了WS_POPUP风格后，对其GetParent，才能获取其owner  原来，我以前的窗口虽然不带WS_CHILD，但恰好也没有带WS_POPUP风格，而是WS_OVERLAPPED风格（0x00000000）。所以不行。 而且最新的说明还指明了这个函数返回NULL的情况：  This function typically fails for one of the following reasons:  1、The window is a top-level window that is unowned or does not have the WS_POPUP style. 2、The owner window has WS_POPUP style.  这又能看到另一个条件：owner 窗口还不能带WS_POPUP风格（当然也不能带WS_CHILD,必须是WS_OVERLAPPED）  当然，前面都说的是使用GetParent去获取owner的条件，言外之意是，即使获取失败，也并不代表它没有owner。 所以想要健壮的获取owner 窗口，还是用GW_OWNER 调用GetWindow比较好。 这在GetParent的Remark一节中，微软也是这么建议的，在Remark中，我还看到了微软建议的获取真正父窗口该用的函数！  To obtain a window's owner window, instead of using GetParent, use GetWindow with the GW_OWNER flag. To obtain the parent window and not the owner, instead of using GetParent, use GetAncestor with the GA_PARENT flag.  那么终于可以说回正题了，我说了那么多，其实就是想引出GetAncestor这个函数。。微软建议使用GA_PARENT调用GetAncestor来获取窗口的真正父窗口。我也实际测试了，确实可以：使用这个函数后，所有top-level窗口的父窗口确实都是桌面！ 我想这些应该就可以解答你的疑惑了。 但其实我觉得吧，没必要太纠结。毕竟在windows下开发，微软说什么就是什么。。。  引用 14 楼 六道佩恩 的回复:2. 我测试了下，只有子窗口获取父窗口时，才会显示桌面窗口的句柄。这个列表框为什么一定要设置为WS_CHILD？同为桌面窗口的子窗口的话，顶级窗口不行吗？  没太听懂你说的。你是不是说反了。  我说的明明是：下拉列表框必须是top-level的啊。。。因为它很可能需要超出它自己app的主窗口的范围。所以它只能是桌面的子窗口。  而它自己app的主窗口一般就只是它的owner。  引用 14 楼 六道佩恩 的回复:3. 你的4.1我觉得有个地方说错了，“当owner窗口最小化的时候，它所拥有的窗口都会被隐藏；但不影响它所拥有的窗口的可见状态”，可见与否不是看WS_VISIBLE吗，我测过了，拥有者窗口最小化后，拥有的窗口隐藏后，它已经没有WS_VISIBLE样式了，IsWindowVisible也返回0，这应该算是影响了其可见状态吧？  你说的对，可能我以前的印象有误， 我现在看了下，owner窗口有WS_MINIMIZE后（最小化），owned窗口就会被隐藏。而不是取决于owner的WS_VISIBLE。所以窗口C还是不会自动隐藏，因为窗口B只是隐藏了，而没有WS_MINIMIZE（最小化）。

引用 17 楼 user-2 的回复:[quote=引用 16 楼 六道佩恩 的回复:] 我是这样想的，它这样的设计是不是还牵涉到什么原因而使得这个列表框需要一个WS_CHILD  其他的先不讨论，你说的这个我先确定下： 你确定你这个下拉列表框带WS_CHILD？？  不会吧。。。创建桌面的child window 这种做法我自己还真没做过。。。 [/quote]  你对比下样式，WS_CHILD是0x40 00 00 00

引用 16 楼 六道佩恩 的回复:我是这样想的，它这样的设计是不是还牵涉到什么原因而使得这个列表框需要一个WS_CHILD  其他的先不讨论，你说的这个我先确定下： 你确定你这个下拉列表框带WS_CHILD？？  不会吧。。。创建桌面的child window 这种做法我自己还真没做过。。。

原来如此，总算能石锤顶级窗口的父窗口是桌面了 我又试了下IsChild，这个没效果，估计是跟GetParent配套的   引用 15 楼 user-2 的回复:[quote=引用 14 楼 六道佩恩 的回复:] 2. 我测试了下，只有子窗口获取父窗口时，才会显示桌面窗口的句柄。这个列表框为什么一定要设置为WS_CHILD？同为桌面窗口的子窗口的话，顶级窗口不行吗？  没太听懂你说的。你是不是说反了。  我说的明明是：下拉列表框必须是top-level的啊。。。因为它很可能需要超出它自己app的主窗口的范围。所以它只能是桌面的子窗口。  而它自己app的主窗口一般就只是它的owner。  [/quote] 关于这个，我的意思是，列表框的实现，它是创建为以桌面为父窗口的子窗口。然后作为子窗口处于Z序顶端，我的问题是，它为什么不实现为一个TOPMOST的顶级窗口呢，这样的效果感觉应该是一样的？我是这样想的，它这样的设计是不是还牵涉到什么原因而使得这个列表框需要一个WS_CHILD，毕竟我考虑的是由自己来实现类似效果的层面。如果没什么特别原因，那就当我没说

引用 8 楼 早打大打打核战争 的回复:实现很简单，就和组合框的下拉列表框一个套路就可以了，SetParent(LISTBOX_HWND, NULL); 然后显示的时候用SetWindowPos设置HWND_TOP标志把LISTBOX置顶即可 关键是移动窗口呢？窗口的Z序变化呢？

引用 10 楼 六道佩恩 的回复:不过有个问题，它为什么要设为桌面窗口的子窗口？设为顶级窗口不行吗？ 所有顶层窗口（我更愿意称“顶层“窗口为“弹出式”窗口）的父窗口都是桌面。  windows系统中的窗口之间的关系很容易理解错误，个人认为主要原因就在于它有两类窗口（带WS_CHILD风格和不带WS_CHILD风格），却用了同一套窗口之间父子关系建立的API（CreateWindow创建时指定父窗口、SetParent创建后修改父窗口等等）。  所以，你在调用任何有关父子关系的API时，要始终清楚你操作的窗口对象是“弹出式”窗口，还是“子”（带WS_CHILD风格）窗口（我更愿意称“子“窗口为“嵌入式”窗口）。 1.1、当CreateWindow创建“弹出式”窗口A并指定“父窗口”（hWndParent参数）也为“弹出式”窗口时，这个所谓的“父窗口”，在这时其实是指“拥有者”窗口（owner），窗口A的真正父窗口是桌面。  1.2、当CreateWindow创建“弹出式”窗口A并指定“父窗口”（hWndParent参数）为“嵌入式”窗口时，系统将找到容纳该“嵌入式”窗口的“弹出式”窗口，以该“弹出式”窗口作为owner窗口。  1.3、Owner窗口一旦指定不能更改。通过GetWindow函数（指定GW_OWNER标志）可获取owner窗口的句柄（如果存在的话）。  1.4、当CreateWindow创建“嵌入式”窗口B时，必须指定一个父窗口（hWndParent参数），父窗口类型不限。“嵌入式”窗口也可以作为其父窗口。   2.1、当调用SetParent修改“弹出式”窗口A的所谓“父窗口”（hWndNewParent）时，窗口A自动变为“嵌入式”窗口（也印证了1.3条所述），且程序员需要手动修正窗口A的风格（加上WS_CHILD,去掉WS_POPUP），否则窗口可能会表现不正常。  2.2、当调用SetParent修改“嵌入式”窗口B的父窗口（hWndNewParent）时，父窗口类型不限（参照1.4）。   拥有父子关系的窗口表现： 3.1、子窗口只能显示在它的父窗口的客户区中，超出父窗口客户区的部分将被裁减掉；父窗口被隐藏时，它的所有子窗口也被隐藏；最小化父窗口不影响子窗口的可见状态，子窗口会随着父窗口被最小化，但是它的WS_VISIBLE属性不变。父窗口被销毁的时候，它的所有子窗口都会被销毁。 由此可见，下拉列表框 必须不能 是程序主窗口的子窗口！ 因为它的显示区域很可能需要超出主窗口客户区！  3.2、桌面窗口与所有顶层窗口（“弹出式”窗口）也是父/子关系，但又有其特殊性：对桌面窗口调用GetWindow函数（指定GW_CHILD标志）可得到第一个顶层窗口的句柄，但对某一个顶层窗口调用GetParent却会返回NULL，不会返回桌面窗口的句柄。  额外说下 拥有/被拥有（owner-owned）关系的窗口表现： 4.1、顶层窗口（“弹出式”窗口）之间可以存在owner-owned关系。owner-owned关系对窗口可见性的影响为：owned窗口永远显示在owner窗口的前面；当owner窗口最小化的时候，它所拥有的窗口都会被隐藏；但不影响它所拥有的窗口的可见状态。（根据这一点，如果窗口A 拥有窗口B,窗口B拥有窗口C,则当窗口A最小化的时候，窗口B被隐藏，但是窗口 C还是可见的）；当owner窗口被销毁的时候，它所拥有的窗口都会被销毁。

引用 12 楼 user-2 的回复:[quote=引用 10 楼 六道佩恩 的回复:] 不过有个问题，它为什么要设为桌面窗口的子窗口？设为顶级窗口不行吗？ 所有顶层窗口（我更愿意称“顶层“窗口为“弹出式”窗口）的父窗口都是桌面。  windows系统中的窗口之间的关系很容易理解错误，个人认为主要原因就在于它有两类窗口（带WS_CHILD风格和不带WS_CHILD风格），却用了同一套窗口之间父子关系建立的API（CreateWindow创建时指定父窗口、SetParent创建后修改父窗口等等）。  所以，你在调用任何有关父子关系的API时，要始终清楚你操作的窗口对象是“弹出式”窗口，还是“子”（带WS_CHILD风格）窗口（我更愿意称“子“窗口为“嵌入式”窗口）。 1.1、当CreateWindow创建“弹出式”窗口A并指定“父窗口”（hWndParent参数）也为“弹出式”窗口时，这个所谓的“父窗口”，在这时其实是指“拥有者”窗口（owner），窗口A的真正父窗口是桌面。  1.2、当CreateWindow创建“弹出式”窗口A并指定“父窗口”（hWndParent参数）为“嵌入式”窗口时，系统将找到容纳该“嵌入式”窗口的“弹出式”窗口，以该“弹出式”窗口作为owner窗口。  1.3、Owner窗口一旦指定不能更改。通过GetWindow函数（指定GW_OWNER标志）可获取owner窗口的句柄（如果存在的话）。  1.4、当CreateWindow创建“嵌入式”窗口B时，必须指定一个父窗口（hWndParent参数），父窗口类型不限。“嵌入式”窗口也可以作为其父窗口。   2.1、当调用SetParent修改“弹出式”窗口A的所谓“父窗口”（hWndNewParent）时，窗口A自动变为“嵌入式”窗口（也印证了1.3条所述），且程序员需要手动修正窗口A的风格（加上WS_CHILD,去掉WS_POPUP），否则窗口可能会表现不正常。  2.2、当调用SetParent修改“嵌入式”窗口B的父窗口（hWndNewParent）时，父窗口类型不限（参照1.4）。   拥有父子关系的窗口表现： 3.1、子窗口只能显示在它的父窗口的客户区中，超出父窗口客户区的部分将被裁减掉；父窗口被隐藏时，它的所有子窗口也被隐藏；最小化父窗口不影响子窗口的可见状态，子窗口会随着父窗口被最小化，但是它的WS_VISIBLE属性不变。父窗口被销毁的时候，它的所有子窗口都会被销毁。 由此可见，下拉列表框 必须不能 是程序主窗口的子窗口！ 因为它的显示区域很可能需要超出主窗口客户区！  3.2、桌面窗口与所有顶层窗口（“弹出式”窗口）也是父/子关系，但又有其特殊性：对桌面窗口调用GetWindow函数（指定GW_CHILD标志）可得到第一个顶层窗口的句柄，但对某一个顶层窗口调用GetParent却会返回NULL，不会返回桌面窗口的句柄。  额外说下 拥有/被拥有（owner-owned）关系的窗口表现： 4.1、顶层窗口（“弹出式”窗口）之间可以存在owner-owned关系。owner-owned关系对窗口可见性的影响为：owned窗口永远显示在owner窗口的前面；当owner窗口最小化的时候，它所拥有的窗口都会被隐藏；但不影响它所拥有的窗口的可见状态。（根据这一点，如果窗口A 拥有窗口B,窗口B拥有窗口C,则当窗口A最小化的时候，窗口B被隐藏，但是窗口 C还是可见的）；当owner窗口被销毁的时候，它所拥有的窗口都会被销毁。 [/quote] 又见大佬你了  感谢你把这些完整地说了一遍，修正了我一些理解上的缺失  但是我还是有几个疑问： 1. 顶级窗口的父窗口真的是桌面窗口吗？毕竟GetParent得到的是NULL，凭借对桌面窗口调用GetWindow函数得到第一个顶层窗口的句柄这一点应该也无法说明所有顶级窗口的父窗口是桌面窗口吧？主要是我一直也没看到微软文档说过顶级窗口的父窗口是桌面窗口，不过就“SetParent指定父窗口为NULL时设置桌面窗口为父窗口”，测试结果是设置后GetWindow仍然得到NULL，应该算佐证了“顶级窗口的父窗口真的是桌面窗口”吧。 2. 我测试了下，只有子窗口获取父窗口时，才会显示桌面窗口的句柄。这个列表框为什么一定要设置为WS_CHILD？同为桌面窗口的子窗口的话，顶级窗口不行吗？ 3. 你的4.1我觉得有个地方说错了，“当owner窗口最小化的时候，它所拥有的窗口都会被隐藏；但不影响它所拥有的窗口的可见状态”，可见与否不是看WS_VISIBLE吗，我测过了，拥有者窗口最小化后，拥有的窗口隐藏后，它已经没有WS_VISIBLE样式了，IsWindowVisible也返回0，这应该算是影响了其可见状态吧？

引用 11 楼 早打大打打核战争 的回复:1. 所有顶级窗口都是桌面窗口的子窗口， 组合框的下拉列表框这样设计，就是为了能够不改变它所在的窗口Z序的情况下，让列表框能显示在置顶窗口之前，如果把它设计为所在窗口的子窗口，那么必须把列表框的父窗口置顶，列表框才能显示在置顶窗口之前  2. 组合框的下拉列表框能像你说的那样“当窗口移动时，列表框跟着动”吗，能“当窗口Z序变化时，列表框也跟着变化”吗（这个其实可以做到，只要设置为TOPMOST即可，但是没有必要），不能，因为它的设计是列表框显示之后，只要在它之外有鼠标点击或者按键事件，列表框就自动隐藏，所以避免了跟随所在窗口移动、动态改变Z序之类的操作 为什么你们都说顶级窗口是桌面窗口的子窗口？获取顶级窗口父窗口的句柄是NULL呀 还有就是，你还没说将列表框设计为顶级窗口这个方案，这个方案看起来应该也是可行的呀

引用 9 楼 六道佩恩 的回复:[quote=引用 8 楼 早打大打打核战争 的回复:]实现很简单，就和组合框的下拉列表框一个套路就可以了，SetParent(LISTBOX_HWND, NULL); 然后显示的时候用SetWindowPos设置HWND_TOP标志把LISTBOX置顶即可 关键是移动窗口呢？窗口的Z序变化呢？[/quote] 我测试了一下，当窗口移动时，列表框没有跟着动，当窗口Z序变化时，列表框也没有跟着变化，看来没我想的那么好。 不过有个问题，它为什么要设为桌面窗口的子窗口？设为顶级窗口不行吗？

引用 6 楼 早打大打打核战争 的回复:组合框中的那个LISTBOX的父窗口确实是桌面窗口，所以会有这种效果：  估计这么设计的原因就是为了让它能够在不改变顶级窗口位置关系的情况下完整显示出来  那么这种效果是我们自己无法实现的是吗？

引用 4 楼 早打大打打核战争 的回复:可以突破父窗口的范围有什么奇怪，只要建立的窗口风格不是child，比如overlapped、popup之类的，都可以突破父窗口的范围 至于列表框其父窗口是桌面窗口这个还有待确认        你看看这些证据够不够，前三张是根据鼠标位置获取窗口句柄和相关信息，后四张是spy++的，用来佐证这里的获得的确是父窗口而不是拥有者窗口，鼠标用来提示获取的是哪个窗口 这里明显能看到，这里的组合框就是大窗口的子窗口，但它的列表框已经超出了组合框的父窗口了；还有就是，这里列表框的父窗口句柄对比GetDeskWindow获得的桌面窗口句柄，是一样的，它的父窗口是桌面窗口

引用 1 楼 zgl7903 的回复:https://docs.microsoft.com/en-us/cpp/mfc/reference/ccombobox-class?view=msvc-160#remarks 组合框由与静态控件或编辑控件组合在一起的列表框组成 引用 2 楼 早打大打打核战争 的回复:顾名思义，名字都叫“组合框”啊，就是EDIT和LISTBOX组合呀~~~  你们没get到我的问题啊  组合框的列表框可以突破它（组合框）本身的窗口范围，甚至可以突破父窗口的范围，查该列表框发现其父窗口是桌面窗口  我的问题在于，它是怎么实现的（指该组合框的列表框）？如果由我们自己来实现的话，有办法实现吗？

顾名思义，名字都叫“组合框”啊，就是EDIT和LISTBOX组合呀~~~


Question: 二次方程的根

if(delta=0) 改成if(delta==0)


Question: 想问一下for循环中的一些问题

中间i，表示i==0时退出for循环。

中间那个变量忘记删了，只看n，i就行了

for循环结构：for(初始化变量；结束条件；每次执行操作) （具体的名词忘了） 所以i/=10每次除以10，中间的i是一个逻辑运算，i==0的时候退出

引用 2 楼 ctrigger的回复:中间i，表示i==0时退出for循环。 哦哦哦  懂了 谢谢


Question: non-class type'char[20]' 这个怎么改啊

看你的char[20] 你是不是想定义一个字符串一维数组； 如果是你应该给你想要定义的字符串取一个名字像str；所以你可以这样写char str[20]; 如过你仅仅是想要定义一个字符的话你可以这样写char a;

char是数据类型，要这么写 char s[20]才行

引用 1 楼 user-3的回复:贴出代码看看 谢谢你啊，我已经改好了

贴出代码看看


Question: 为啥出错啊

对弈变量的大小写，另外，引入头文件时也要注意大小写；从编译提示上应该没有正确引入头文件。

引用 4 楼 棉猴的回复:不是students，是student这个结构 结构写在student.h里面，在主函数(student_system.c)里又写了#include "student.h"。

不是students，是student这个结构

引用 2 楼 棉猴的回复: 从出错提示上看，应该是你的结构struct student没有定义完整。也就是说，在调用average()函数时，student可能只有声明没有定义 我在主函数那里声明了struct student students[50];

Count的C是小写


Question: C++怎么输出两个个字符串相加，求解

char str[100] = { 0 }; 	char *x = "abc"; 	char *y = "def"; 	strcpy(str, x); 	strcpy(str + strlen(x), y); 	printf("z=%s", str);

你是在用c++（而不是c），所以你的直觉是对的，我们当然可以写 z= a+b; #include <iostream> void foo()  { 	std::string a("c++:"); 	std::string b("z=a+b"); 	std::string z = a + b; 	std::cout << z.c_str() << std::endl; }

C++版： #include <iostream> using namespace std;  int main(void) { 	string x = "abc"; 	string y = "def"; 	string z; 	 	z = x + y; 	cout << "z = " << z << endl; 	 	return 0; }  C版： #include <stdio.h>  int main(void) { 	char str[100]; 	char *x = "abc"; 	char *y = "def"; 	char *z = str; 	 	while(*x) *z++ = *x++; 	while(*y) *z++ = *y++; 	 	z = str; 	printf("z = %s\n", z); 	 	return 0; }

可以通过strlen（）函数和for循环将两个字符串数组组合起来，将组合后的字符串输出便可以实现所谓的字符串相加了

改成 z=str; strcpy(z, a); strcat(z, b); printf(“z=%s”, z);


Question: C语言学习过程中的问题讨论

引用 3 楼 ctrigger的回复:先看书入门，再写代码巩固和提高。别无他法。。 高手自律，自学习惯，太多人不能坚持，遇到点问题直接放弃

先看书入门，再写代码巩固和提高。别无他法。。

引用 1 楼 自信男孩 的回复:建议针对具体问题来讨论～ 这个论坛的主要目的是为了给初学者提供一个讨论的地方，比如来看我视频教程的同学遇到问题，就可以在这里讨论 这里是我的视频教程 欢迎大家积极参与，所以没有设置具体的讨论问题，可能做得还不够完善，谢谢您的建议！

建议针对具体问题来讨论～


在stm32f10.h中首行添加这两段代码：#ifndef __stm32f10x_h#define __stm32f10x_h 末行添加这一行代码：#endif /__stm32f10x_h/


Question: 第七行的3是什么意思啊!搞不明白

引用 2 楼 Spectre Ghost 的回复:这是位运算呀 2*1=2 3左移两位然后取反

这是位运算呀

a&=~(3<<2*1)   a=a&(~(3<<2*1)) 3(0000 0000 0000 0011)左移两位就是12(0000 0000 0000 1100)，取反(1111 1111 1111 0011)，再按位与就是把低3、4位置0，其余保留。


Question: C语言 求大佬帮忙！！

引用 5 楼 ctrigger 的回复:用IF语句： int hahaha(int x, int y, int a, int b) {     int result = -1;          int ad = b - a*x;     int aa = y - x;          if(ad % aa == 0) result = ad / aa;      return result;     }感谢大佬

引用 1 楼 阿麦 的回复:这是数学题啊  int hahaha(int x, int y, int a, int b) {     int ad = b - a*x;     int aa = y - x;      return ad % aa == 0 ? ad / aa : -1; } 如果if 怎么写呢

引用 1 楼 阿麦 的回复:这是数学题啊  int hahaha(int x, int y, int a, int b) {     int ad = b - a*x;     int aa = y - x;      return ad % aa == 0 ? ad / aa : -1; } 感觉和鸡兔同笼的问题有那么一点点相似


Question: 请问这个问题出在哪里 谢谢大佬们

这个是题目

引用 6 楼 自信男孩 的回复:[quote=引用 2 楼 一颗白面馒头 的回复:]n没有初始化？你输入的数都没有按照你的想法保存在a数组里 对，主要问题在这里。  下面的循环也有问题，i >= 0这不就是一个死循环了吗？ 整个程序都感觉很奇怪～ [/quote] 哈哈哈，吃了炫迈的for循环？

引用 2 楼 一颗白面馒头 的回复:n没有初始化？你输入的数都没有按照你的想法保存在a数组里 对，主要问题在这里。  下面的循环也有问题，i >= 0这不就是一个死循环了吗？ 整个程序都感觉很奇怪～

有人说在 "%d"前加一个空格，即 " %d"，不知道灵不灵 另外： 第一、n 没有赋初值，危险，这样 n 可能会是任何值，导致 core dump 第二、for(int i=0; i>=0; i++) 这个循环不会结束的，会运行到天荒地老

n没有初始化？你输入的数都没有按照你的想法保存在a数组里


Question: 求教，这个连等式该如何理解？

引用 1 楼 自信男孩的回复:根据链式队列的特点：先进先出，从头出，从尾进的特点，因此入队跟队尾有关系，C和D都跟队头有关，因此不会选。  p->next  = rear->next;是把rear的next（一般是NULL）赋值给p->next；一般是NULL，但是不清楚链表创建，所以这样写p->next  = rear->next;比较保险； rear = rear->next = p;先从右向左计算，p赋值给rear->next;然后rear->next赋值给rear，因此最后是把p放到队尾，并且让rear指向p； 哇，谢谢大神，讲的非常清楚。


Question: c语言指针与结构体

引用 8 楼 棉猴的回复:printf()函数的%d和%s打印内容时要求的参数格式不同，%d打印时，后面直接跟变量名，而%s打印时需要跟变量地址。所以  int *a = &b; printf("%d\n", *a);//------*a是指针指向的内容------- char *pa = arr; printf("%s", pa);//---------pa是指针----------  所以您说的打印pc指向的内容时，因为pc本身就是指针，所以不需要加* 好的，明白了，非常感谢

引用 6 楼 棉猴的回复:	 printf("%s\n", t.pc);//--------打印t.pc指向的内容------------ printf("%p\n", t.pc);//--------打印t.pc本身的内容------------  VS2015 C++环境调试结果  其中，0x004ffb94就是t.pc本身的内容，0x004ffb94这个地址上的内容是"hello bit\n"  对于printf()函数的%p的详细用法，请参考 《C++中printf()函数的用法10-6》 希望能够帮到您！ 第二个打印地址懂了，但是第一个还是有点懵比如说int *a;int b=3;a=&b;打印*a就是就意味着打印b里面的值吗？相比那个题目*pc不是意味打印arr数组里面的值吗

引用 3 楼 qybao的回复:没有t.*pc，只有*t.pc //pc才是成员，char *pc只是说成员pc是个char*类型，并不是说成员是*pc，类型是char。好好理解一下区别。 我理解的是*p解析arr首元素地址，等于arr里面存放的变量

引用 3 楼 qybao的回复:没有t.*pc，只有*t.pc //pc才是成员，char *pc只是说成员pc是个char*类型，并不是说成员是*pc，类型是char。好好理解一下区别。 你如果是打印pc地址应该是什么呢

t. *pc要求pc是实例成员指针类型char *S::pc;参见《C++程序设计精要教程》各种指针混合的用法P131,P298: 包括C普通指针，实例成员指针，静态成员指针以及基于类模板的各种指针等。

引用char *pc  == (char *)(pc) char *pc  !=  (char)(* pc) 括号仅用于帮助理解。


Question: 小B的任务

去年11月21日的代码 #include<stdio.h> #include<string.h> int main() {     int T,n,s,sum=0,res=0,d;     scanf("%d%d",&T,&n);     d=n;     int a[n+5],b[n+5],i=1,j;     while(d>0)     {         scanf("%d %d",&a[i],&b[i]);         //printf("%d %d\n",a[i],b[i]);         i++;         d--;     }     for(i=1;i<n;i++)     {         for(j=i+1;j<=n;j++)         {             if(a[i]>a[j])             {                 s=a[i];                 a[i]=a[j];                 a[j]=s;                                  s=b[i];                 b[i]=b[j];                 b[j]=s;             }         }     }     for(i=1;i<=n;i++)     {         for(j=1;j<=b[i];j++)         {             sum=sum+a[i];              res++;             if(sum>=T)             {                 goto out;                              }         }     }     out:         printf("%d\n",res);     return 0; }


Question: 二进制数直接转float转不了，请问一下问题出在哪里？

前面的回答少写了个解引用，printf("%f\n",*(float*)&f.a); 另外看了下，发现你对浮点型的结构有误解  #include "stdio.h" int main( void ) { 	int a=0x3FC00000; 	printf("%f", *(float*)&a );  	return 0; }   另外，可变参数那里，具体会因编译器而有所不同，转8字节这个，gcc是这样的

把b的类型换成8字节的long long，然后你赋值的这个浮点二进制改为64位结构的。 原因是对于可变参数的处理，整型转8字节，浮点型转double，你这里它认为的是整型，所以按仅填了4字节，而%f要读8字节。、 第二种方法就是让编译器认为你传的是4字节float类型，帮你自动转，方法是，printf("%f\n",(float*)&f.a);

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

1.125转换成二进制是1.001，指数是0，而而指数位的起始值是127，所以指数值是0111 1111，符号位是0，尾数位是001 0000 0000 0000 0000 0000，所以合在一起的值是0011 1111 1001 0000 0000 0000 0000 0000，而变量使用主机字节序存储（大头big-endian），即低地址保存数值的低位，高地址保存数值的高位，所以1.125对应的二进制值是0x0000903f float f1 = 0.0f; 	int i1 = 0x3f900000;//---------注意，i1是主机字节序------- 	CopyMemory(&f1, &i1, sizeof(i1));//----f1的值变为1.125----------  请参考《C++浮点型变量的存储方式》 希望能够帮到您！

你算的不对 1.0125 ，转为2进制是1.0000001100110011...... 指数是1，尾数是0000001100110011..... 符号位0，指数是0。 16进制就是3f81999a

现在可以转了，但是问题是数据不对，  #include<stdio.h>   2 #include<stdlib.h>   3 union Ui{   4     float a;   5     int b;   6 }ui;   7    8 int main(){   9     union Ui f;  10    f.b=0x3d000009;  11     printf("%f\n",f.a);  12     return 0;  13 } ~     0x3d000009对应二进制的话 0为符号位 指数为为0x7c     表示的值应该是0x7c-0x7f=-3 尾数位为0x09 二进制为1001 二进制的小数为为三位则小数位的10进制应该为0.125其整数位的十进制为1 结果应该为 1.0125 实际给的值却是 0.031250 二进制为 00001 为什么会这样呢？

union U {  float f;  int d; } u; u.d=-0x3d800005; printf("%f\n",u.f);


Question: 为何未停在'='？

引用 9 楼 自信男孩的回复:[quote=引用 6 楼 陳錄生 的回复:][quote=引用 4 楼 NorZ的回复:][quote=引用 3 楼 陳錄生 的回复:][quote=引用 1 楼 NorZ的回复:]你这代码我看着就很不理解，你的 buf 和pkey为什么没有分配空间也可以直接用啊？ *( pkey+pos) = *( buf+pos); 一样结果。[/quote]  ...不是这个问题，我不理解的是你的 buf 是个指针，没有分配内存，pkey 也是，为啥能跑起来，是什么编译器和运行环境啊？你执行的 cfg 这个二进制程序，是你代码编译出来的吗？[/quote] buf 在fgets函数分配了内存，pkey 和buf指向同一字符串了？[/quote] 也没看到pkey指向buf的操作呢[/quote] FREEBSD CC

引用 6 楼 陳錄生 的回复:[quote=引用 4 楼 NorZ的回复:][quote=引用 3 楼 陳錄生 的回复:][quote=引用 1 楼 NorZ的回复:]你这代码我看着就很不理解，你的 buf 和pkey为什么没有分配空间也可以直接用啊？ *( pkey+pos) = *( buf+pos); 一样结果。[/quote]  ...不是这个问题，我不理解的是你的 buf 是个指针，没有分配内存，pkey 也是，为啥能跑起来，是什么编译器和运行环境啊？你执行的 cfg 这个二进制程序，是你代码编译出来的吗？[/quote] buf 在fgets函数分配了内存，pkey 和buf指向同一字符串了？[/quote] 也没看到pkey指向buf的操作呢

pkey是野指针，没看到它指向可以正常读写的内存区域，也没有malloc呢。怎么可以使用呢？ 即使能够用，但不能保证一直能用～  还有pkey即使指向了可以读写的内存，那么遇到'='没有加'\0'，%s输出的时候会继续向后输出，直到遇到'\0'

引用 6 楼 陳錄生 的回复:[quote=引用 4 楼 NorZ的回复:][quote=引用 3 楼 陳錄生 的回复:][quote=引用 1 楼 NorZ的回复:]你这代码我看着就很不理解，你的 buf 和pkey为什么没有分配空间也可以直接用啊？ *( pkey+pos) = *( buf+pos); 一样结果。[/quote]  ...不是这个问题，我不理解的是你的 buf 是个指针，没有分配内存，pkey 也是，为啥能跑起来，是什么编译器和运行环境啊？你执行的 cfg 这个二进制程序，是你代码编译出来的吗？[/quote] buf 在fgets函数分配了内存，pkey 和buf指向同一字符串了？[/quote]  关键你并没有这样的赋值操作呀...你不如循环结束后给 pkey[pos] 赋值 '\0' 再打印看看，或者循环结束后打印 pos 的值，才能确定是不是没有被 != '=' 卡住

引用 4 楼 NorZ的回复:[quote=引用 3 楼 陳錄生 的回复:][quote=引用 1 楼 NorZ的回复:]你这代码我看着就很不理解，你的 buf 和pkey为什么没有分配空间也可以直接用啊？ *( pkey+pos) = *( buf+pos); 一样结果。[/quote]  ...不是这个问题，我不理解的是你的 buf 是个指针，没有分配内存，pkey 也是，为啥能跑起来，是什么编译器和运行环境啊？你执行的 cfg 这个二进制程序，是你代码编译出来的吗？[/quote] buf 在fgets函数分配了内存，pkey 和buf指向同一字符串了？

本身代码的逻辑上，没有什么问题，pkey多赋值了一个空格，影响不大，就是为啥能执行，我很好奇

引用 3 楼 陳錄生 的回复:[quote=引用 1 楼 NorZ的回复:]你这代码我看着就很不理解，你的 buf 和pkey为什么没有分配空间也可以直接用啊？ *( pkey+pos) = *( buf+pos); 一样结果。[/quote]  ...不是这个问题，我不理解的是你的 buf 是个指针，没有分配内存，pkey 也是，为啥能跑起来，是什么编译器和运行环境啊？你执行的 cfg 这个二进制程序，是你代码编译出来的吗？

引用 1 楼 NorZ的回复:你这代码我看着就很不理解，你的 buf 和pkey为什么没有分配空间也可以直接用啊？ *( pkey+pos) = *( buf+pos); 一样结果。

你这个程序居然能跑起来。。。内存越界了啊，一个指针不能存东西的，要么定义成char数组，要么用malloc动态分配


Question: 求助C语言的feof

Thanks

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

修改一下，这样看看行不行？  #include <stdio.h>  int main(void) { 	FILE *fp; 	char buf[BUFSIZ]; 	 	if((fp = fopen(__FILE__, "r")) == NULL) 	{ 		perror("fopen"); 		return 1; 	} 	 	while(!feof(fp) && fgets(buf, BUFSIZ, fp)) 	{ 		printf("%s", buf); 	} 	 	return 0; }

先判断返回值再打印，再while判断 feof

判断一下fgets返回值，读到EOF时会返回NULL，然后break出循环就好了～


Question: 求助，switch ... case 语句用法

逗号分隔还是要写每个case的，case范围扩展可以只写区间两端，case 'a'...'z' 代表26个case，还是非常有用的

GCC的case范围扩展，从Pascal学来的，GCC和clang/llvm都支持

引用 4 楼 赵4老师 的回复:语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。说得对，算了，不纠结了

C/C++不支持switch case的这种写法。

哎呀，我还没用过 'a'...'z' 这种写法 真的可以吗

逗号分隔是可以的，不能用..., vs2019警告但还是可以编译的

你选的语言不是c/c++吧？

直接用if...else 判断ASCII码范围

写全了吗，写全了的话就是少了个结尾的花括号


Question: 大佬们求问哪里出了问题

看到缩进格式全无的代码，顿时毛骨悚然。。。

引用 1 楼 user-2的回复:标点符号没有进入这个if((str[i]>='a'&&str[i]<='z') || (str[i]>='A'&&str[i]<='Z') || (str[i]>='0'&&str[i]<='9')||(str[i]==32))，所以标点符号没有被做任何处理。 应该怎么修改呢


Question: 这个该怎么改啊，求大佬带

scanf("%s %d", &str[10], &a); 改成 scanf("%s %d", str, &a); //str数组名就是字符串首地址， &str[10]是下标为10的元素的地址，数组越界（数组下标只到9） strcmp(str[10], "triange") 改成 strcmp(str, "triange"); //str[10]是一个元素（只有1个字符，不是字符串，字符串用数组名就可以了）

引用 1 楼 自信男孩的回复:scanf中对于str有问题  scanf("%s%d", str, &a);  strcmp的第一个参数应该是str而不是str[10]  楼主需要复习一下数组，数组名，数组首地址等等，已经函数调用的参数的类型 现在通过啦，太感谢了*⸜( •ᴗ• )⸝*❤


Question: 求助again

#include<stdio.h> #include <math.h>  #define N 10 #define M 10   int is_prime(int n) {     int i, tm;      if (n < 2)         return 0;      tm = sqrt(n);     for (i = 2; i <= tm; i++)         if (n % i == 0)             return 0;      return 1; }  void sort(int *arr, int size) {     int i, j;     int tmp;      for (i = 0; i < size; i++)         for (j = 0; j < size - i -1; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } }  void show(int *arr, int size) {     int i;      for (i = 0; i < size; i++)         printf("%d ", arr[i]);     putchar(10); }  int main () {     int cnt, len, tmp;     int array[N];     int i, j, k;       scanf("%d", &cnt);      for (i = 0; i < cnt; i++) {         scanf("%d", &len);         if (len > N)             len = N;         k = 0;         for (j = 0; j < len; j++) {             scanf("%d", &tmp);             if (is_prime(tmp))                 array[k++] = tmp;         }         sort(array, k);         show(array, k);     }  #if 0     int a[M][N],b[M][N],s[M],n,i,j;     int c=0;     scanf("%d",&n);     for(i=0;i<n;i++)       {scanf("%d",&a[i][0]);         for(j=1;j<=a[i][0];j++)             {scanf("%d",&a[i][j]);              if (prime(a[i][j]))                  {b[i][c]=a[i][j];                  c++;                  }             }          s[i]=c;          c=0;       }     for(i=0;i<n;i++)         px(b[i],s[i]);     for(i=0;i<n;i++)         {for(j=0;j<s[i];j++)             printf("%-2d",b[i][j]);         printf("\n");} #endif     return 0; }  #if  0 int prime( int p ) {     int i,f;     if(p<=1)         f=0;     else        {f=1;       for(i=2;i<p;i++){          if(p%i==0)             f=0;}        }     return f; } void px(int a[],int n) {     int i,j,k,t;     for(i=0;i<n-1;i++)          for(j=0;j<n-i-1;j++)             if(a[j]>a[j+1])             {               t=a[j];               a[j]=a[j+1];               a[j+1]=t;             }  } #endif 供参考～  题目要求是输入的整数是<= 10，没说是输入的n（楼主定义的）也是10，如果n是大于10的，会出现数组越界，出现段错误；


Question: VS2019中数据结构线性表status未定义标识符应该怎么解决？求大神指点

引用 1 楼 自信男孩的回复:注意单词的大小写，status确实没有定义，楼主应该用Status？  从代码上看，完全可以typedef int Status; 试试，主要看一下OK是什么？ 解决了，三克油

解决了，三克油


Question: C语言一道题没报错为啥运行不出结果？？？

我直接打印一下a，你看这样觉得合理嘛，0*0*0

引用 2 楼 limeilu110的回复:如果！整段程序运行下来没有跟预期要输出的值相匹配的结果！！！那这段程序什么都不做也可以理解啊！       建议跟踪一下个个环节的变量值变化！！！看程序有没有按设计的运行！！ 我刚运行了下，也追踪了其中两个变量～～i,a的变化！运行过程中变量在按程序的设计走！但是没有匹配的结果！所以程序感觉上什么都没有做！！！！没有匹配的结果！！

那是因为printf所在if判断条件不满足，建议楼主把i++到if (i == xxx) {}之后，即while循环内的最后位置。  改一下位置再试试。


Question: 如何将此小程序从递归改成循环?

float proc(float f1, float f2, char m) {	 	switch (m) 	{ 	case '+': 		return f1 + f2; 		break; 	case '-': 		return f1 - f2; 		break; 	case '*': 		return f1 * f2; 		break; 	case '/': 		return f1 / f2; 		break;  	default: 		abort(); 		break; 	} }  float fun2(const char ch[100]) { 	float f[100];		// 参数 	int ifCnt = 0;		// 参数个数  	char m[100] = { 0 }; // 方法 	int imCnt = 0;  	char ch2[100]; 	if (!ch || !ch[0]) 		abort();	 	strncpy_s(ch2, 100, ch, 100);  	int iBegin = 0, iEnd = 0; 	int i = 0; 	for (; (i < 100) && (ch2[i] != '\0'); ++i) 	{ 		switch (ch2[i]) 		{ 		case '*': 		case '/': 		case '+': 		case '-': 			if (i == 0) 				abort();  			iEnd = i;	 			m[imCnt++] = ch2[iEnd]; 			ch2[iEnd] = '\0'; 			f[ifCnt++] = atof(&ch2[iBegin]); 			iBegin = iEnd + 1; 			break;  		case '0': 		case '1': 		case '2': 		case '3': 		case '4': 		case '5': 		case '6': 		case '7': 		case '8': 		case '9': 		case '.': 			break;  		default: 			abort(); 		} 	}  	f[ifCnt++] = atof(&ch2[iBegin]);  	{ 		float fResult = f[0]; 		int ifCur = 1; 		for (i = 0; i < imCnt; ++ifCur) 		{ 			fResult = proc(fResult, f[ifCur], m[i++]); 		}  		return fResult; 	} }