Question: 求大佬帮我看看这个程序哪错了

#include <stdio.h> #include <malloc.h>  #define ERROR 0 #define OK 1 #define INIT_SIZE 10   /*初始分配的顺序表长度 */ #define INCREM 5   /*溢出时，顺序表长度的增量*/  typedef int ElemType;   /*定义表元素的类型 */ typedef struct Sqlist{     ElemType *slist;   /*存储空间的基地址 */     int length;   /*顺序表的当前长度 */     int listsize;   /*当前分配的存储空间 */ }Sqlist;  int InitList_sq(Sqlist*L);   /*构建一个新的线性表 */ int CreateList_sq(Sqlist*L, int n);   /*输入顺序表数据元素 */ int ListInsert_sq(Sqlist*L, int i, ElemType e);   /*在顺序表中第i个位置插入新的元素 */ int PrintList_sq(Sqlist*L);   /*输出顺序表的元素 */ int ListDelete_sq(Sqlist*L, int i);   /*删除第i个元素 */ int ListLocate(Sqlist*L, ElemType e);   /*查找值为e的元素 */  /****************************************************/ /*               构造一个新的线性表                 */ /****************************************************/  int InitList_sq(Sqlist*L) {     L->slist=(ElemType*)malloc(INIT_SIZE*sizeof(ElemType));     if(!L->slist)         return ERROR;     L->length = 0;     L->listsize = INIT_SIZE;      return OK; }/*InitList */  /****************************************************/ /*           输入顺序表数据元素                     */ /****************************************************/  int CreateList_sq(Sqlist*L, int n) {     ElemType e;     int i;     for(i=0; i<n; i++)     {         printf("input data%d: ", i+1);         scanf("%d", &e);         if(!ListInsert_sq(L, i+1, e))             return ERROR;     }     return OK; }/*CreateList */  /****************************************************/ /*            输出顺序表中的元素                    */ /****************************************************/  int PrintList_sq(Sqlist*L){     int i;     for(i=1; i<=L->length; i++)         printf("%5d", L->slist[i-1]);     return OK; }/*PrintList */  /****************************************************/ /*             在顺序表中第i个位置插入新的元素      */ /****************************************************/  int ListInsert_sq(Sqlist*L, int i, ElemType e) {     int k;     if(i < 1 || i > L->length + 1)         return ERROR;      if(L->length >= L->listsize)     {         L->slist = (ElemType*)realloc(L->slist, (INIT_SIZE+INCREM)*sizeof(ElemType));         if(!L->slist)             return ERROR;         L->listsize += INCREM;     }     for(k = L->length-1; k>=i-1; k--)         L->slist[k+1] = L->slist[k];     L->slist[i-1] = e;     L->length++;      return OK; }/*ListInsert */  /****************************************************/ /*         在顺序表中删除第i个元素                  */ /****************************************************/  int ListDelete_sq(Sqlist*L, int i, ElemType *e){     int k;     if(L->length==0)          /*线性表为空*/         return ERROR;     if(i<1 || i>L->length)    /*删除位置不正确*/         return ERROR;     if(i<L->length)      /* 如果删除不是最后位置*/     {         for(k=i; k<L->length; k++)   /*将删除位置后继元素前移*/             L->slist[k-1]=L->slist[k];     }     L->length--;     return OK; }/*ListDelete*/  /****************************************************/ /*          在顺序表中查找指定元素，返回其序号      */ /****************************************************/  int ListLocate(Sqlist*L, ElemType e) {     printf("请输入查找的元素");     scanf("%d", &e);     for(int j=0; j<L->length; j++){         if(L->slist[j]==e) {             printf("%d在顺序表是第%d元素.\n", e, L->slist[j]);             return j;         }     }      return -1; } int main(void) {     Sqlist sl;     int n, m, k;     printf("please input n:"); /* 输入顺序表的元素个数*/     scanf("%d", &n);     if (n <= 0) {         printf("ERROR");         return -1;     }      InitList_sq(&sl);     //if(n>0){     printf("\n1-Create Sqlist:\n");     CreateList_sq(&sl, n);     printf("\n2-Print Sqlist:\n");     PrintList_sq(&sl);     printf("\nplease input insert location and data:(location, data)\n");     scanf("%d,%d", &m, &k);     ListInsert_sq(&sl, m, k);     printf("\n3-Printf Sqlist:\n");     PrintList_sq(&sl);     printf("\n");     //}     //else     //   printf("ERROR");     return 0; }  供参考！  注释不需要太多，有些注释完全可以去掉，多了反而负副作用，不利于代码的阅读。 建议对比代码找出自己的问题，希望你能学到东西


Question: 大佬们，帮帮大一的孩子，查个错

这代码一看就是东拼西凑出来的，没有完整的思想

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

#include<stdio.h> #include<stdlib.h> #include<time.h>  int main() {     int a,b,c,i,j,k,m,n,grade,sgrade,grade1;     int result;     int d,x,y;      x=a+b;    //有意义吗？     y=a-b;    //有意义吗？都是随机值      srand((int)time(NULL));     for(i=0;i<10;i++)     {         if(a+b<=50&&a-b>=0)         {             //stand((int)time(NULL));             a=rand()%50+1;             b=rand()%50+1;             printf("按回车答题\n");             getchar();             c=rand()%2+1;             if(c==1)             {                 printf("第%d题 %d+%d=",k,a,b);                 return x;             }             else             {                 printf("第%d题 %d-%d=",k,a,b);                 return y;             }         }         //for(j=1;j++;j<=3)    //这个循环是否写反了         for(j=1;j <= 3; j++)    //这个循环是否写反了         {             printf("输入结果\n");             scanf("%d",&d);             if(d!=result)  //result在哪里修改或者赋值了             {                 //srand((int)(time(NULL)));                 m=rand()%4+1;                 switch(m)                 {                      case 1:printf("Wrong.Try once more.\n");break;                     case 2:printf("No.Please try again.\n");break;                     case 3:printf("Not correct.Keep trying.\n");break;                     case 4:printf("NO.Don't give up!\n");break;                 }                 break;             }             else             {                 //srand((int)(time(NULL)));                 n=rand()%4+1;                 switch(n)                 {                     case 1:printf("Very good!\n");break;                     case 2:printf("Excellent!\n");break;                     case 3:printf("Nice work!\n");break;                     case 4:printf("Keep up the good work!\n");break;                 }                 switch(i)                 {                     case 1:grade+=10;break;                     case 2:grade+=7;break;                     case 3:grade+=5;break;                     default:grade+=0;                 }                 continue;             }             sgrade+=grade1;         }         printf("sgrade=%d\n",sgrade);         if (sgrade<60)             printf("TRY AGAIN\n");         else if (sgrade>=60&&sgrade<70)             printf("PASS\n");         else if (sgrade>=70&&sgrade<80)             printf("OK\n");         else if (sgrade>=80&&sgrade<90)             printf("GOOD\n");         else             printf("SMART\n");     }      return 0; }  供参考！  改了一下部分代码，多处加了注释。你的代码我改不出你想要的结果，你贴出需求，我可以考虑重新给你写一个。


Question: 求助栈个队列的应用

转成后缀表达式比较方便判断。  利用一个栈来实现。方法是： step1、利用又穷自动状态机构造一个词法分析器，改分析器可以将一个流或者一个串断开为不同的token，并且区分为两类：操作数和运算符。 step2、顺序读入token，如果是一个操作数，则立即输出，如果遇到操作符，则我们将其放入到栈中，（括号作为优先级最高的运算符），遇到左括号时我们也将其放入栈中。如果遇到一个右括号，则将栈元素弹出，将弹出的操作符输出直到遇到左括号为止。（括号只弹出但是并不输出）。如果遇到其他的操作符，从栈中弹出元素直到遇到发现更低优先级的元素(或者栈为空)为止。弹出完这些元素后，将遇到的操作符压入到栈中。  比如：输入  5  * （ 5 + 6 ） 则应该输出：     556+*  这个算法稍加修改，不仅能判断你括号是否配对，还能判断配对的合理性，甚至整个表达式的合理性。

#include <iostream> #include <stack> #include <string.h>   using namespace std;  int main() { 	const char *pChar = "(((()()((())))))"; 	stack<char> stackMatch; 	for(size_t i = 0; i < strlen(pChar); i++) 	{ 		if (pChar[i] == '(') 		{ 			stackMatch.push(pChar[i]); 		} 		else if(pChar[i] == ')') 		{ 			stackMatch.pop(); 		} 		 	} 	if (stackMatch.empty()) 	{ 		cout << "true" << endl; 	} 	else 	{ 		cout << "false" << endl; 	} 	 	system("pause"); }


Question: 求问，浮点错误是什么？

引用 9 楼 赵4老师的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 麻烦说和问题相关的东西

引用 5 楼 636f6c696e的回复:你的输入处理有问题 scanf("%d/%d %d%/%d",&a,&b,&c,&d); 把-1加了括号还是有一个测试点答案错误

引用 5 楼 636f6c696e的回复:你的输入处理有问题 scanf("%d/%d %d%/%d",&a,&b,&c,&d); 粗心了。。我改了，这下对了两个测试点，不过还有一个浮点错误，另一个答案错误

粗心了。。我改了，这下对了两个测试点，不过还有一个浮点错误，另一个答案错误

整型数取绝对值，建议用abs，而不是fabs

我上面说了可以运行出来，调试中间也没问题。所有类型都试过了，出来结果都是对的。提交后只有浮点错误，没有段错误

数值太大、除以0操作等，都会显示浮点数错误，不知道你要的是不是这个

加个断点调试一下，马上就能找出问题

gcd，lcm出问题，存在对0取余数的情况，调用的时候避免除数为0，另外gcd这样写对不对？ 另外有段错误，说明数组有非法访问


Question: 猴子吃桃数组解法

你有没有想过，像这类前项推后向的问题，只用两个变量就可以替代数组了？

引用 3 楼 user-1的回复:day不就等于10-i么？  [quote=引用 1 楼 我不会抽烟 的回复:] [quote=引用 1 楼 user-1的回复:]你有没有想过，像这类前项推后向的问题，只用两个变量就可以替代数组了？ 我现在还想不出来，我本来想不打day这个变量但是我不会用i来表示天数。[/quote][/quote] 我知道了其实我就是想用数组做这道题，当初。因为刚学习数组。

day不就等于10-i么？  引用 1 楼 我不会抽烟 的回复:[quote=引用 1 楼 user-1的回复:]你有没有想过，像这类前项推后向的问题，只用两个变量就可以替代数组了？ 我现在还想不出来，我本来想不打day这个变量但是我不会用i来表示天数。[/quote]

引用 1 楼 user-1的回复:你有没有想过，像这类前项推后向的问题，只用两个变量就可以替代数组了？ 我现在还想不出来，我本来想不打day这个变量但是我不会用i来表示天数。


Question: 能否查找出创建出某窗口的线程？

QueryFullProcessImageName需要vista+，可以用GetModuleFileNameEx或者GetProcessImageFileName替代

有了进程ID，OpenProcess 然后 QueryFullProcessImageName

简单点 有现成工具 spy++ 下载一个就行了

引用 2 楼 六道佩恩 的回复:[quote=引用 1 楼 Magic丶旭 的回复:] GetWindowThreadProcessId了解一下！ 请问能否根据得到的线程、进程ID获得原程序的名字？有相关的API吗？[/quote]  你说的是exe文件的名称还是窗口标题？如果是前者用GetModuleFileName，后者用GetWindowText。

引用 1 楼 Magic丶旭 的回复:GetWindowThreadProcessId了解一下！ 请问能否根据得到的线程、进程ID获得原程序的名字？有相关的API吗？

GetWindowThreadProcessId了解一下！


Question: 求大神帮忙解释一下这个程序 我知道这个是输出质数的 但是过程是什么意思？？

引用 2 楼 CR7LER 的回复:[quote=引用 1 楼 user-1的回复:]main就是输入一个区间,然后调用PrintPrimes打印这个区间的质数 PrintPrimes循环对区间内的所有整数进行IsPrime判断,如果是质数则输出这个数 IsPrime 判断一个数是否为质数,方法是用2到小于这个数的所有自然数去除它,如果余数全不为0,那么则是质数 我看说这个方法是什么穷举法 能帮忙解释一下吗？[/quote]  就是判断一个数比如11是不是质数 那么11除以2,11除以3,...11除以10 全部试一遍,这就是穷举,判断所有的可能性

引用 1 楼 user-1的回复:main就是输入一个区间,然后调用PrintPrimes打印这个区间的质数 PrintPrimes循环对区间内的所有整数进行IsPrime判断,如果是质数则输出这个数 IsPrime 判断一个数是否为质数,方法是用2到小于这个数的所有自然数去除它,如果余数全不为0,那么则是质数 我看说这个方法是什么穷举法 能帮忙解释一下吗？


Question: 求解：C语言中结构体与共用体的一道题

getchar吸收回车符，基本是个周经问题了

#include <stdio.h>  #define N 3  int main() {     int i,count=0;     struct worker     { int age;         union         {       int a;             char c;         } score;     } p[N];      for(i=0;i<N;i++)     {         printf("输入年龄:");         scanf("%d",&p[i].age);         if(p[i].age > 25)         {             printf("输入考评等级(A,B,C,D)：  \n");             getchar();    //for '\n' last input             scanf("%c",&p[i].score.c);             if(p[i].score.c!='D')                 count++;         }         else         { printf("输入分数：");             scanf("%d",&p[i].score.a);             if(p[i].score.a>60)  count++;         }     }     printf("\n统计结果：\n及格人数: %d\n",count);     for(i=0;i<N;i++)     { if(p[i].age>25)         printf("年龄： %d  成绩：%d\n",p[i].age,p[i].score.c);         else             printf("年龄： %d  成绩：%d\n",p[i].age,p[i].score.a);     } }  供参考！加了个一条语句getchar();这是一个经典的问题了。原因是终端是行缓冲，每次输入都会将回车符留在输入缓存里。


Question: C程序文件打开问题

要不试试用代码修改注册表？

行，基本了解情况，感谢各位大佬

要看怎么理解这个问题了。 单靠a.exe，如果你先运行一遍a.exe，让a.exe把自己的注册表环境写好，也是可以的。

引用 2 楼 公孙堂·字无怨 的回复:[quote=引用 1 楼 stherix的回复:]这个需要写注册表 可以参考https://blog.csdn.net/zwc2xm/article/details/70140704 功能上实现了，但适应性不好，如果a.exe搬到别的电脑上用，这个改注册表的程序也要搬过去，还得先运行。而VS，VC这类程序的这项功能就好多了，其实想要的是这个……不过还是谢谢了。[/quote]  你的vs,vc也不是先要安装吗 不安装也是没这个功能的,其实他就是在安装程序内写入了注册表实现了打开功能

引用 3 楼 user-4的回复:[quote=引用 2 楼 公孙堂·字无怨 的回复:] [quote=引用 1 楼 stherix的回复:]这个需要写注册表 可以参考https://blog.csdn.net/zwc2xm/article/details/70140704 功能上实现了，但适应性不好，如果a.exe搬到别的电脑上用，这个改注册表的程序也要搬过去，还得先运行。而VS，VC这类程序的这项功能就好多了，其实想要的是这个……不过还是谢谢了。[/quote]  一般程序都有安装包、安装时会写注册表、 没有安装包的绿色程序、可能会提供一个脚本写注册表。或者UI上可以设置[/quote] 也就是说，单靠a.exe是无法完成这项功能的吗？

引用 2 楼 公孙堂·字无怨 的回复:[quote=引用 1 楼 stherix的回复:]这个需要写注册表 可以参考https://blog.csdn.net/zwc2xm/article/details/70140704 功能上实现了，但适应性不好，如果a.exe搬到别的电脑上用，这个改注册表的程序也要搬过去，还得先运行。而VS，VC这类程序的这项功能就好多了，其实想要的是这个……不过还是谢谢了。[/quote]  一般程序都有安装包、安装时会写注册表、 没有安装包的绿色程序、可能会提供一个脚本写注册表。或者UI上可以设置

引用 1 楼 stherix的回复:这个需要写注册表 可以参考https://blog.csdn.net/zwc2xm/article/details/70140704 功能上实现了，但适应性不好，如果a.exe搬到别的电脑上用，这个改注册表的程序也要搬过去，还得先运行。而VS，VC这类程序的这项功能就好多了，其实想要的是这个……不过还是谢谢了。


Question: 使用 libredwg 读取 .dwg 文件一直失败是什么原因？

如何在VS下编译，编译发的32位程序可分享一下吗？

ODA不是收费了吗？你用的是C#的还是C++的？ 我现在用Teigha3.3，目前还不能写出可运行的程序

引用 3 楼 C井爆破 的回复:我也试了发现不得行，我在windows中用C++调用libredwg，连dwg_read_file的方法都会报错，我在想会不会是因为编译的是linux系统下的问题，楼主解决了没？ 后面发现， dwg_read_file() 返回的错误码分好几个等级，只有错误码不超过 DWG_ERR_CRITICAL 就可以，DWG_ERR_CRITICAL 定义在 dwg.h 里， 有个 typedef enum DWG_ERROR； 另外，这个库有很多 bug，而且读的话最高只能支持到 R2007 的版本（但是还是有很多 bug，需要手动修改），写的话只能支持 R2000。。。如果你是无聊想随便搞搞可以看一下这个库，然后自己改 bug（说不定最后可以自己写一个解析库出来），工作用的话，还是早点弃坑吧。。。楼主已弃疗，转 ODA 了，不过 ODA 貌似只能支持 vs2013 release 平台的开发，不过还是比 libredwg 好很多。 后面有时间我再看看 libredwg，现在工作有点赶时间，如果层主有兴趣可以一起探讨~

引用 1 楼 user-3 的回复:先用里面自带例子的例子测试下看看  http://ftp.gnu.org/gnu/libredwg/ 试了一下自带的例子，也是一样。 因为 linux 下完全不熟，（windows 下其实也不熟。。），拿了别人编译的 32 位的，自己配置（瞎搞） 64 位来做，不知道是不是哪里的配置有问题。。。


Question: c语言

代码有问题，输出x时加了&。从代码上看只有这个问题。如果除了这个还有其他问题，建议提供更多信息

printf("x=%d",&x) 你这里打印的是x的地址哈，所以不需要加&才正确

楼上说得对，scanf的"和,位置反了，printf输出不需要地址


Question: 加速度计采集的加速度   怎么积分成速度位移

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

有人搞这个吗 ？有代码吗？

楼主有代码吗?我现在也遇到这个问题了

最简单的就是欧拉单步长法

a = []; % 加速度值 x = 0; % 设置初始位移 T = 0.01; % 设置采样时间间隔 v0 = 0; % 设置初始速度  for i=2:length(a)     v = (a(i-1)+a(i))/2*T; % 速度变化量     v1 = v0 + v;     w(i) = v1;     x1 = (v1 + v0) * T/2;     x = x + x1;     v0 = v1; end


Question: 这两个填空

引用 2 楼 Mr_sandman1994的回复:CSDN被你当百度知道了  aver(a,N); void data(int);//使用前先声明  诶已经解决啦，太菜了。。。

11111求大哥啊啊啊啊啊啊啊啊


Question: keil 4显示激活已经成功，无法编译生成但是.H文件

引用 1 楼 user-1的回复:下面已经提示了2K代码限制， 说明激活没成功 你有其他激活软件吗 我在百度找过很多 试过很多都不行

下面已经提示了2K代码限制， 说明激活没成功


Question: 关于回文素数判断的优化问题

引用 5 楼 lin5161678 的回复:[quote=引用 1 楼 tongshou 的回复:]   BOOL isPrimeNo (int x) {     int  t= 2+ (int) sqrt(x);     int  k;      for (k=2; k < t; ++k) {         if (x % k == 0) {             return FALSE;         }     }      return TRUE; }     这个应该是比较优化的判断素数的函数看不懂你的操作 这样判断 2 不是素数了? 另外C/C++没有BOOL/TRUE/FALSE[/quote]  抱歉，您说得很对。该函数仅适用  >=3 的， 漏了 0-2数的判断。

[/quote]  但是你是否考虑到编译器会优化这个操作？不保证每个编译器都做优化，但是目前大部分的编译器都会对它做优化吧。可以反汇编看一下[/quote]  引用 8 楼 自信男孩 的回复:[quote=引用 3 楼 tongshou 的回复:] [quote=引用 2 楼 user-5 的回复:] 输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }   其中语句 for (int i = 2; i <= sqrt(n); ++i) 是一个严重的教科书式的大坑。大量教科书上出现这类 语句  函数 sqrt()的计算是非常消耗时间，每循环一次都要调用一样的函数、得到一样的结果，完全是浪费时间！使用该句子，会让程序运行慢10倍、或100倍！  编程不要为了简化句子 而不考虑运行效率问题。  [/quote]  但是你是否考虑到编译器会优化这个操作？不保证每个编译器都做优化，但是目前大部分的编译器都会对它做优化吧。可以反汇编看一下[/quote]  您也真敢想，让编译器优化是有时间代价的。要明确判断编译器是否优化不是一件容易、确定的事，能够依靠自己的，千万不要依靠他人，更不要迷信系统会做得更好（这方面本人有很深刻的体会），在很多具体、精细问题上，C/C++提供机会让 程序员可以比系统做得更好，这就是C/C++与众不同的地方！

引用 3 楼 tongshou 的回复:[quote=引用 2 楼 user-5 的回复:] 输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }   其中语句 for (int i = 2; i <= sqrt(n); ++i) 是一个严重的教科书式的大坑。大量教科书上出现这类 语句  函数 sqrt()的计算是非常消耗时间，每循环一次都要调用一样的函数、得到一样的结果，完全是浪费时间！使用该句子，会让程序运行慢10倍、或100倍！  编程不要为了简化句子 而不考虑运行效率问题。             [/quote]  但是你是否考虑到编译器会优化这个操作？不保证每个编译器都做优化，但是目前大部分的编译器都会对它做优化吧。可以反汇编看一下

最快的素数判断算法就是建立素数表~

判断素数不要用sqrt 精度低 强制转换到int 误差大 并且慢 可以考虑用 i*i<=n 代替 i<=sqrt(n)

引用 1 楼 tongshou 的回复:  BOOL isPrimeNo (int x) {     int  t= 2+ (int) sqrt(x);     int  k;      for (k=2; k < t; ++k) {         if (x % k == 0) {             return FALSE;         }     }      return TRUE; }     这个应该是比较优化的判断素数的函数看不懂你的操作 这样判断 2 不是素数了? 另外C/C++没有BOOL/TRUE/FALSE

引用 3 楼 tongshou 的回复:[quote=引用 2 楼 user-5 的回复:] 输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }   其中语句 for (int i = 2; i <= sqrt(n); ++i) 是一个严重的教科书式的大坑。大量教科书上出现这类 语句  函数 sqrt()的计算是非常消耗时间，每循环一次都要调用一样的函数、得到一样的结果，完全是浪费时间！使用该句子，会让程序运行慢10倍、或100倍！  编程不要为了简化句子 而不考虑运行效率问题。   [/quote] 记住了，下次一定注意

引用 2 楼 user-5 的回复:输入有问题，回文判断也有问题，C语言char->int ：atoi函数（不安全）  int isPalind(char str[]) { 	int len = strlen(str); 	for (int i = 0; i < len / 2; i++) 		if (str[i] != str[len - 1 - i]) 			return 0; 	return 1; } int isPrime(int n) { 	for (int i = 2; i <= sqrt(n); ++i) 		if (n%i == 0) 			return 0; 	return 1; }   其中语句 for (int i = 2; i <= sqrt(n); ++i) 是一个严重的教科书式的大坑。大量教科书上出现这类 语句  函数 sqrt()的计算是非常消耗时间，每循环一次都要调用一样的函数、得到一样的结果，完全是浪费时间！使用该句子，会让程序运行慢10倍、或100倍！  编程不要为了简化句子 而不考虑运行效率问题。


Question: 是不是答案错了？

这个和浮点数的精度有关。

看起来不是惰性的，估计要好好研究一下float的底数和指数形式的格式。

不是2的整次幂（无论正负次幂）的数字，都是近似的，而且采用了惰性舍入,即向0方向的摄入  int main() {     for (int i = -20;i<=20;++i)     {         float a = i/10.0f;         printf("%d/10=%.14lf\n",i,(double)a);     }     getchar();      return 0; }   输出  -20/10=-2.00000000000000 -19/10=-1.89999997615814 -18/10=-1.79999995231628 -17/10=-1.70000004768372 -16/10=-1.60000002384186 -15/10=-1.50000000000000 -14/10=-1.39999997615814 -13/10=-1.29999995231628 -12/10=-1.20000004768372 -11/10=-1.10000002384186 -10/10=-1.00000000000000 -9/10=-0.89999997615814 -8/10=-0.80000001192093 -7/10=-0.69999998807907 -6/10=-0.60000002384186 -5/10=-0.50000000000000 -4/10=-0.40000000596046 -3/10=-0.30000001192093 -2/10=-0.20000000298023 -1/10=-0.10000000149012 0/10=0.00000000000000 1/10=0.10000000149012 2/10=0.20000000298023 3/10=0.30000001192093 4/10=0.40000000596046 5/10=0.50000000000000 6/10=0.60000002384186 7/10=0.69999998807907 8/10=0.80000001192093 9/10=0.89999997615814 10/10=1.00000000000000 11/10=1.10000002384186 12/10=1.20000004768372 13/10=1.29999995231628 14/10=1.39999997615814 15/10=1.50000000000000 16/10=1.60000002384186 17/10=1.70000004768372 18/10=1.79999995231628 19/10=1.89999997615814 20/10=2.00000000000000

int main() {     float a=0.7,b = 0.5;     if(0.7>a)         printf("Hi\n");     else         printf("Hello\n");      if(0.5==b)         printf("Ok\n");     else         printf("No\n");      printf("%.14lf,%.14lf\n",(double)a,(double)b);      getchar();      return 0; }    输出 Hi Ok 0.69999998807907,0.50000000000000


Question: 大神在哪里？帮忙解决一下问题

仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

如果是商业性、实用性的软件开发，从用户便利角度考虑，如果是比较多的输入，使用scanf(）输入方式是非常糟糕的。因为用户很难校对、输入错误难以发现、补救，多错几次、重新再输入，会让用户抓狂。 最简单的方式是用文本编辑软件把要输入的东西 格式化 输入，然后存到一个普通 文本文件，软件编程要做的就是如何从该文本文件读出所有需要的数据。----这个不是一件困难的事。

引用 2 楼 おしまい。的回复:int i,j,n; float avg, a[4][2]=0; scanf(“%d”,&n); printf(“      课程1     课程2    课程3    平均分”); for(i=1;i<=n;i++)     printf(“学生%d\n”,i); for(i=0; i<4; i++)     for(j=0; j<2; j++)          printf(“6.1f”,a[i][j]);  大概一个思路，你可以参考下 你这也太。。。。思路我知道，但是不知道怎么表达我要的效果

要求用数组解，谢谢了噢


Question: 写的程序出现问题，求助！！

引用 4 楼 自信男孩的回复:[quote=引用 2 楼 weixin_44766876 的回复:] [quote=引用 1 楼 自信男孩的回复:]什么问题，先描述一下吧 你看图片里，我第一次输入s提示重新输入，第二次输入s就可以了[/quote] 你的意思想输入一次就可以，但是程序却要你输入两次吗？[/quote] 找到问题了，谢谢，麻烦了

引用 2 楼 weixin_44766876 的回复:[quote=引用 1 楼 自信男孩的回复:]什么问题，先描述一下吧 你看图片里，我第一次输入s提示重新输入，第二次输入s就可以了[/quote] 你的意思想输入一次就可以，但是程序却要你输入两次吗？

你问题没描述清楚啊

引用 1 楼 自信男孩的回复:什么问题，先描述一下吧 你看图片里，我第一次输入s提示重新输入，第二次输入s就可以了

什么问题，先描述一下吧


Question: 十个成绩

#include<stdio.h> int main() { printf("hallo"); }

#include <stdio.h> #include <stdlib.h>  int sum(int a[]) {     int i,sum=0;     for(i=0;i<10;i++)     {         sum+=a[i];     }     return sum; }  float evel(int sum) {     return sum*1.0/10; }  int ma(int a[]) {     int i,max=0;     for(i=0;i<10;i++)     {         max=max>a[i]?max:a[i];     }     return max; }  int num(int a[],float aver) {     int i,n=0;     for(i=0;i<10;i++)     {         if(a[i]>aver)             n++;     }     return n; }  int main() {     int i,a[10];     for(i=0;i<10;i++)     {         scanf("%d",&a[i]);     }     int s=sum(a);     float aver=evel(s);     int m=ma(a);     int n=num(a,aver);     printf("总分：%d",s);     printf("平均分：%.2f",aver);     printf("最高分：%d",m);     printf("高于平均分的人数：%d",n);     return 0; }

新手来看看。


Question: C语言用循环怎么写

#include <stdio.h>  int main() {     int i,n,sum=0,a[10]={1,2,3,4,5,6,7,8,9,10};     scanf("%d",&n);     for(i=0;i<n;i++)     {         sum+=a[i];     }     printf("%d\n",sum);     return 0; }


Question: c语言的字符串while退出

问题能再描述一下吗，没看懂

while的判断条件设成*ch ！=‘#’就行了


Question: PAT B1067

引用 1 楼 自信男孩的回复:倒数第二个是那个测试点？ 就是提交的时候 测试点4答案错误 请大佬看一下题目，（APP不能发图 谢谢啦

倒数第二个是那个测试点？


Question: 关于c语言

及时结帖、给分的话，啥都可以解释一遍。老是发帖不结嘛，那就不好说了。。。

引用 3 楼 六道佩恩的回复:定义一个int型数组，长为20 定义一个静态int型变量i并初始为0 定义一个名为flag的int型变量并初始为1 定义一个char型变量 l 屏幕清空 在屏幕输出这样一段文字：**************欢迎进入学员信息的录入！*****************         （末尾有个换行） 谢谢谢谢了，！！！！！！！

引用 4 楼 拥抱Linux的回复:及时结帖、给分的话，啥都可以解释一遍。老是发帖不结嘛，那就不好说了。。。 好的好的，我不经常在线，对不起了

引用 5 楼 六道佩恩的回复:话说你从来都不结贴的吗？ 没有没有，我之前没有看，我是新手，也不知道怎么结贴，不好意思了(T ^ T)，对不起

话说你从来都不结贴的吗？

楼上笑死我了，变量的声明和初始化不懂还是别学了，不适合你，至于那个函数自己百度函数名就知道了，楼上你说对吗？

变量声明不懂？ system清屏不懂？ printf打印不懂？


Question: 急求拼图游戏

引用 2 楼 user-2的回复:这就需要你的代码支持这个操作 比如你写的拼图游戏，移动方块调用函数move（x1，y1，x2，y2）,在调用的地方同时把x1，y1，x2，y2推到一个栈里面 如果要撤销，其实就是将栈顶的数据反过来调用move（x2，y2，x1，y1） 谢谢您的解答。我想请问一下您具体的代码该怎么编写

引用 1 楼 ooolinux的回复:用一个栈，存入操作步骤数据，撤回的时候弹出操作数据。 谢谢您的解答，我想请教一下您具体的代码该怎么编写

用一个栈，存入操作步骤数据，撤回的时候弹出操作数据。


Question: C语言运行出现问题，得不到最大值

局部变量的作用域是函数内，出了函数就不起作用了。因此，要想把值带出函数可以通过返回值或者传入传参数。

引用 1 楼 user-2的回复:改成这样就可以了，你得到的最大值都没有返回主函数，并且你的max变量都没定义，怎么可以输出呢，不知道你编译是怎么过的 这里给你提供一种更简洁的这个程序的编写方法，用三元操作符？：实现的，你这个把简单问题复杂化了，本来不需要用函数实现的  #include <stdio.h>  int max(int a,int b);  int main() {     int n1,n2;     printf("请输入两个实数：");     scanf("%d,%d",&n1,&n2);     printf("较大的是%d\n",max(n1,n2));     return 0; }  int max(int a,int b) {     int max=0;     if(a>b)         max=a;     else         max=b;     return max; }   第二种方法  #include <stdio.h>   int main() {     int n1,n2;     printf("请输入两个实数：");     scanf("%d,%d",&n1,&n2);     printf("较大的是%d\n",n1>n2?n1:n2);     return 0; }  谢谢解答，我继续努力


Question: 求解释

p1 = &a  对应形参a p2 = &b 对应形参b p3 = &c 对应形参c   执行 temp = a 后 temp = p1 =&a a = b 后  a = p1 = b = p2 = &b b = temp 后 b = p2 = temp = p1 = &a  *temp = *b 这句后面的逗号应该改成分号吧？执行完这句后 *(temp)  = *(&a) = *b = *(&a) 即 a = a =5  *b = *c //*(&a) = *c =*(&c)即a = c = 3   注意，到这一步，a = 3  如果确实是逗号，那就是一个逗号表达式，从左到右求值，取最后一个，也就是 *temp = （*b = * c）最后的结果还是 a = c = 3  *c = *temp //   *(&c) = *(&a) 即 c = a = 3 没有对b做过修改，因此b的值不变

*temp = *b  // 第一个参数指向的值变成5 *b = *c//第一个参数指向的值变成3 *c = *temp//第三个参数指向的值变成3 第二个参数的值始终没变，所以是373


Question: killed by signal 7，报错 Bus error，求助

贴代码找问题吧

确定要拷贝208K内存？


Question: c语言定义多个变量

#include <stdio.h>  int main(void) {     int num;     double number;     char ch;      scanf("%d %f %c", &num, &number, &ch);     printf("%d, %.1f, %c", num, number, ch);      return 0; }

引用 2 楼 拥抱Linux 的回复:[quote=引用 1 楼 marwi_study 的回复:]  #include <stdio.h> #include <stdlib.h>  int main() {     int num;     double number;     char ch;     scanf("%d%lf%c",&num,&number,&ch);     printf("%d,%.1f,%c",num,number,ch);     return 0; }   请教一下，（1）头文件<stdlib.h>在这里起的作用是什么呢？（2）输入的时候如何确保ch获得想要的字符呢？谢谢！[/quote] 这个头文件在这个程序里没什么作用，只是我的开发工具自动添加上去了，我也就没删掉。获取字符要求输入法在输入的时候是英文输入法，如果还是出错就建议使用ch=getchar();语句来获取字符

引用 1 楼 marwi_study 的回复: #include <stdio.h> #include <stdlib.h>  int main() {     int num;     double number;     char ch;     scanf("%d%lf%c",&num,&number,&ch);     printf("%d,%.1f,%c",num,number,ch);     return 0; }   请教一下，（1）头文件<stdlib.h>在这里起的作用是什么呢？（2）输入的时候如何确保ch获得想要的字符呢？谢谢！


Question: 这句代码是什么意思？求解

引用 3 楼 user-1的回复:[quote=引用 2 楼 追梦辰星 的回复:] [quote=引用 1 楼 user-1的回复:]j>=len-1说明到了数组的最后一个位置，就需要加长了 那为什么必须大于等于呢？ 上面循环是j<len 循环里面的j能大于len-1吗？ 最后一位不就是len-1吗？ 但是用j=len-1不对唉！ 希望给我说明一下，谢谢。[/quote] 达到等于就会进入len++了，直接j==len-1应该也是对的，判断等于是==不是=[/quote] 哦，谢谢谢谢，当时搞蒙了，没反应过来。初学者不太熟练。

引用 1 楼 user-1的回复:j>=len-1说明到了数组的最后一个位置，就需要加长了 那为什么必须大于等于呢？ 上面循环是j<len 循环里面的j能大于len-1吗？ 最后一位不就是len-1吗？ 但是用j=len-1不对唉！ 希望给我说明一下，谢谢。

引用 2 楼 追梦辰星 的回复:[quote=引用 1 楼 user-1的回复:]j>=len-1说明到了数组的最后一个位置，就需要加长了 那为什么必须大于等于呢？ 上面循环是j<len 循环里面的j能大于len-1吗？ 最后一位不就是len-1吗？ 但是用j=len-1不对唉！ 希望给我说明一下，谢谢。[/quote] 达到等于就会进入len++了，直接j==len-1应该也是对的，判断等于是==不是=

j>=len-1说明到了数组的最后一个位置，就需要加长了


Question: c语言一道小题

i--, 与--1的区别，是i--是先条件运算，再减1，上面讲得很清楚了。

这里要理解i--, 与--1的区别，是i--是先条件运算，再减1， 即 i-- 可理解为 i = 4, i = i _- 1; 而--i 是先计算 再做判断 第一次参与while判断i=4, i--为3， 打印为2； 第二次参与while判断i=2 , i-- 为1， 打印为0; 第三次参与while判断i= 0, 不成立， 退出while语句，// 0为假， 大于0为真； 所以答案为20；

while第一次i--成3,打印时--i成2, while第二次i--成1,打印时--i成0， while第三次i--成-1,没进去


Question: # endef有什么用？

是宏的用法，可以让一部分代码有效和不有效。详细的还是从网上搜一些例子来体会吧

百度多快啊。。。。。。

看书 或者 百度 吧


Question: 这里fun(--n); 怎么理解？起什么用

等价于: n=n-1; fun( n )

你把递归展开下就明白了 fun(2) printf(2) --> fun(1) printf(1) printf(2) --> fun(0) printf(0) printf(1) printf(2)

递归函数的原理了解了，就能了解为什么是输出0,1,2，而不是2 1 0. 递归函数是不停的在栈上申请自己的函数栈，copy self stack.再根据函数栈的特性：先进后出，所以最后的条件是n = 0，输出0，然后去执行当n为1时的函数栈，即输出1.因为前面判断if (n > 0) f(--n);已经执行过了，所以当n=1是，直接执行printf，当n=2时，同理

--n 减号在前，先减再赋给n 每次运行到fun(--n),就跳到最上边再往下运行， 第三次才执行打印，接着第二次的打印，第一次的打印

就是个简单的递归操作。

想想printf放在 fun(--n);前面和后面有什么区别


Question: c语言同时定义多个变量

建议直接贴代码吧


Question: 二维数组指针使用的疑问

引用 1 楼 自信男孩的回复:输出有问题吧，应该是p[a][b] 谢谢了，这个小地方没有注意到

引用 2 楼 yuanlai_的回复:应该是  *(*(p+a)+b)  谢谢了，明白了😊，小地方没有注意到

应该是  *(*(p+a)+b)

输出有问题吧，应该是p[a][b]


Question: 用c语言做一个类似dir

直接dir命令就可以  或者百度搜以下、遍历文件夹

_findfirst _findnext _findclose


Question: windows下使用gcc出现一个警告怎么解决

引用 2 楼 ForgetTomorrow 的回复:做为一名成熟的程序员你应该忽略warning这个单词 别人的warning只能忽略了。 自己的还是不要有的好

做为一名成熟的程序员你应该忽略warning这个单词

直接贴信息吧，图片看不清楚～


Question: 求各位大佬帮帮忙

什么垃圾题目，一般正常的题目都会给出示例


Question: 求解c语言问题

自己一点都不动手吗?建议你自己先写写～


Question: 如何进行语言学习？

C语言的基础打扎实，运算符号、循环、选择语句、数组、函数、指针、结构体、文件等知识必须系统的学一遍，之后再加强函数、指针和结构体的训练，为什么要把C语言学好呢？因为硬件结构知识都是一样的，你要想比比别人更牛逼，你要么在电路设计上下功夫，要么就得学会写出牛逼的代码出来。C语言学好的话，我建议先学51单片机，再学STM32芯片的开发！51单片机很基础但也很重要！像它的内部机构里的中断、定时器、UART串口通信等知识必须掌握，之后再转学STM32的时候，你会发现其实STM32只是比51单片机多了许多内部资源和接口，其他没多大区别，像STM32VET6这款芯片，有ADC、DAC、USART、WWDG、I2C、、I2S、SPI、FSMC、RTOG(实时时钟)、DMA等功能，等你做开发的时候你就发现了STM32芯片比51单片机的好用之处了！ 前面具体介绍了下ARM嵌入式前期的学习知识，再说说学习路线，与大家共勉。 1.高等数学、大学物理、大学英语数字电路、电路分析、模拟电子、电工电子、C程序设计、51单片机！这些电子专业的基础课程必须掌握扎实，像模电，最起码基本的信号放大电路、信号运算电路、信号分离电路要学会画电路图和分析电路原理！C语言的话要能独立做个贪吃蛇游戏，强烈建议初学者刚开始学的时候就把指针的知识打好基础，否则到时候回过头来再学指针费时费力！ 2.信号与系统、计算机网络、传感器原理与检测技术、数据结构与算法、STM32芯片开发、uc/os-ii等实时操作系统的知识、C++程序设计！还有些专业性比较明显的课如:电力电子技术、自动控制原理等课程，因为不清楚题主哪个专业的就不好回答了。(答主目前还停留在这个阶段的学习中) 3.学习ARM中更高端的处理器，如CORT-A9处理器系列的芯片，Linux系统下开发等！(答主能力有限就知道这么多了)  嵌入式入门并不难，我感觉嵌入式对编程语言要求是非常低的。嵌入式的本质就是通过寄存器操作CPU以及其外设，来实现自己的业务逻辑。C语言能明白怎么把一个常量强制转化为指针，然后对指针解引用，就可以操作寄存器了。比如一个32位的单片机，在寄存器地址0x80000000的低位写1，就可以让GPIO输出一个高电平，这些样写就可以。*(（volatile unsigned int *）0x80000000)|=0x00000001;这对C语言要求很低吧，更复杂的任务，本质是操作更多的寄存器，然后加一些逻辑组织起来。 先买一块单片机开发板作为入门，从点亮一个LED开始，然后逐个例程学起来。中途遇到问题就学什么，这样更有针对性，不要前期打太久的基础，比如先把模电数电都吃透，再开始搞，这样会很盲目，没有试验的辅助，很难理解的很深刻。前期可能会读了很多遍MCU的datasheet也不明白说的什么，但坚持多读几遍就明白了。入门阶段就要养成看英文datasheet的习惯，这个是基本素质。单片机能把GPIO，I2C，SPI，UART这四种最常用的接口以及ADC/DAC，定时器/计数器，数码管，按键、触摸屏，电机，LCD，蓝牙模块，GPS模块，WIFI模块等常用片上或者片外外设都能够学通，这基本算非常不错了。单片机可以作为一个过渡阶段也可以作为自己以后的工作方向，这个就看自己的职业理想了。再更进一步可以学习ARM，DSP，FPGA等。


Question: 嘻嘻?那个大佬帮我分析一下

引用 4 楼 棉猴 的回复：首先要清楚两点。 1 表达式类型 因为x的类型是int，所以x/2的类型也是int，所以当x=3时，x/2的值是1；当x=1时，x/2的值是0。 2 递归函数 如果一个函数调用了它本身，不管这种调用是直接的还是间接的，都称该函数为递归 函数(recursive function)。 在递归函数中，一定有某条路径是不包含递归调用的;否则，函数将“永远”递归下 去，换句话说，函数将不断地调用它自身直到程序控件栈耗尽为止。我们有时候会说这种函数含有递归循环(recursion loop)。 第一次调用 在fun()函数中，x的值首先是3，x/2的值是1，此时满足递归条件， 第二次调用，调用fun(x/2) 此时x的值是1，x/2的值是0，不满足递归条件，所以printf()函数输出1； 返回第一次调用，此时printf()函数输出3 返回主函数，printf回车。 谢谢🙏刚刚学递归...初学者，谢谢你

引用 3 楼 user-2 的回复：fun(3)进入函数,满足3/2>0 所以字啊次调用fun(3/2) 此时为fun(1),不满足1/2>0，输出1 然后退回到上层，在输出3 在调回到main输出\n 满意么，骚年嘻嘻🤭刚刚其实看书也懂了我一直觉的是31明白了这个叫递归

引用 1 楼 user-2 的回复：递归，打断点啊可不可以帮我分析一下过程

递归，打断点啊


Question: 统计个位数字    C语言

#include <stdio.h> int geshu(int M, int N); int main(void){ 	int M, N,A; 	scanf("%d %d", &M, &N); 	A=geshu(M,N); 	printf("%d这个数中有%d个%d\n", M, A, N); 	return 0; } int geshu(int M,int N) { 	int ret=0; 	int ge = 0; 	while (M > 0){ 		ret = M % 10; 		M = M / 10; 		if (ret == N){ 			ge++; 		} 	} 		return ge; }

引用 13 楼 早打大打打核战争 的回复:简单的方法：  #include <stdio.h>  int main() {   int n, d, x;    scanf("%d%d", &n, &d);   for (x = n < 0 ? n = ~n + 1, 0 : n | d ? 0 : 1; n; x += (n % 10) == d, n /= 10);   printf("%d\n", x);    return 0; }   求大佬教教我  方法真的很好

引用 14 楼 夜太美。 的回复:[quote=引用 13 楼 早打大打打核战争 的回复:] 简单的方法：  #include <stdio.h>  int main() {   int n, d, x;    scanf("%d%d", &n, &d);   for (x = n < 0 ? n = ~n + 1, 0 : n | d ? 0 : 1; n; x += (n % 10) == d, n /= 10);   printf("%d\n", x);    return 0; }   看不懂啥意思啊 [/quote]  for循环里什么意思啊

引用 13 楼 早打大打打核战争 的回复:简单的方法：  #include <stdio.h>  int main() {   int n, d, x;    scanf("%d%d", &n, &d);   for (x = n < 0 ? n = ~n + 1, 0 : n | d ? 0 : 1; n; x += (n % 10) == d, n /= 10);   printf("%d\n", x);    return 0; }   看不懂啥意思啊

N=0 D=0的时候特殊处理下不就行了。。。 引用 11 楼 夜太美。 的回复:[quote=引用 1 楼 自信男孩 的回复:] 注意若输入：-21252 2，那么-21252 % 10之后得到是-2，而不是2.  #include <stdio.h>  int Count_Digit (int N,int D);  int main() {     int N, D;      scanf("%d %d", &N, &D);     printf("%d\n", Count_Digit(N, D));     return 0; }  int Count_Digit (int num, int key ) { #if 1     int cnt = 0;      if (num < 0)         num = -num;     if (key < 0)         key = -key;      while (num) {         if (num % 10 == key)             cnt++;         num /= 10;     }      return cnt; #else     int a=1;     int D1=0;     D1=N;     for(;D!=D1;)     {         if(D1>0)         {             if(D==(D1%10))             {                 a++;             }             D=(D1/10);             D1=D;         }         else         {             if((-D)==(D1%10))             {                 a++;             }             D=-(D1/10);             D1=(-D);         }     }     return a; #endif }   供参考！    这个问题怎么解决？？  测试点2是错的   测试点	提示	结果	耗时	内存 0	sample, 数字<0且不连续出现	答案正确	2 ms	384 KB 1	数字>0，有连续出现	答案正确	2 ms	288 KB 2	N=0，且输出1	答案错误	1 ms	372 KB 3	输出为0	答案正确	1 ms	256 KB 4	统计0的次数，可能循环会多1	答案正确	1 ms	360 KB   代码这样写的 int Count_Digit (int num, int key ) {     int cnt = 0;     if (num < 0)         num = -num;     if (key < 0)         key = -key;     while (num) 	{         if (num % 10 == key)             cnt++;         num /= 10;     }     return cnt; }  引用 1 楼 自信男孩 的回复:注意若输入：-21252 2，那么-21252 % 10之后得到是-2，而不是2.  #include <stdio.h>  int Count_Digit (int N,int D);  int main() {     int N, D;      scanf("%d %d", &N, &D);     printf("%d\n", Count_Digit(N, D));     return 0; }  int Count_Digit (int num, int key ) { #if 1     int cnt = 0;      if (num < 0)         num = -num;     if (key < 0)         key = -key;      while (num) {         if (num % 10 == key)             cnt++;         num /= 10;     }      return cnt; #else     int a=1;     int D1=0;     D1=N;     for(;D!=D1;)     {         if(D1>0)         {             if(D==(D1%10))             {                 a++;             }             D=(D1/10);             D1=D;         }         else         {             if((-D)==(D1%10))             {                 a++;             }             D=-(D1/10);             D1=(-D);         }     }     return a; #endif }   供参考！   这个问题怎么解决？？  测试点2是错的   测试点	提示	结果	耗时	内存 0	sample, 数字<0且不连续出现	答案正确	2 ms	384 KB 1	数字>0，有连续出现	答案正确	2 ms	288 KB 2	N=0，且输出1	答案错误	1 ms	372 KB 3	输出为0	答案正确	1 ms	256 KB 4	统计0的次数，可能循环会多1	答案正确	1 ms	360 KB   代码这样写的 int Count_Digit (int num, int key ) {     int cnt = 0;     if (num < 0)         num = -num;     if (key < 0)         key = -key;     while (num) 	{         if (num % 10 == key)             cnt++;         num /= 10;     }     return cnt; }  引用 6 楼 夜太美。 的回复:[quote=引用 1 楼 自信男孩 的回复:] 注意若输入：-21252 2，那么-21252 % 10之后得到是-2，而不是2.  #include <stdio.h>  int Count_Digit (int N,int D);  int main() {     int N, D;      scanf("%d %d", &N, &D);     printf("%d\n", Count_Digit(N, D));     return 0; }  int Count_Digit (int num, int key ) { #if 1     int cnt = 0;      if (num < 0)         num = -num;     if (key < 0)         key = -key;      while (num) {         if (num % 10 == key)             cnt++;         num /= 10;     }      return cnt; #else     int a=1;     int D1=0;     D1=N;     for(;D!=D1;)     {         if(D1>0)         {             if(D==(D1%10))             {                 a++;             }             D=(D1/10);             D1=D;         }         else         {             if((-D)==(D1%10))             {                 a++;             }             D=-(D1/10);             D1=(-D);         }     }     return a; #endif }   供参考！   谢谢谢谢   虽然不懂那个 #if  #else #endif  啥意思[/quote]    这个问题怎么解决？？  测试点2是错的   测试点	提示	结果	耗时	内存 0	sample, 数字<0且不连续出现	答案正确	2 ms	384 KB 1	数字>0，有连续出现	答案正确	2 ms	288 KB 2	N=0，且输出1	答案错误	1 ms	372 KB 3	输出为0	答案正确	1 ms	256 KB 4	统计0的次数，可能循环会多1	答案正确	1 ms	360 KB   代码这样写的 int Count_Digit (int num, int key ) {     int cnt = 0;     if (num < 0)         num = -num;     if (key < 0)         key = -key;     while (num) 	{         if (num % 10 == key)             cnt++;         num /= 10;     }     return cnt; }[/quote]

引用 9 楼 jiamianshiye_16_com 的回复:0-9都给你统计了。  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_CHAR_TYPES	10  unsigned int g_charnum[MAX_CHAR_TYPES];   int main(int argc, char *argv[]) { 	int i = 0;  	if(argc <= 1) 	{ 		printf("Usage : ./a.out stringXXXXX\n");	 		return -1; 	}  	char *ptmp = argv[1];	 	int len = strlen(ptmp); 	for(i = 0; i < len; i++) 	{ 		if(ptmp[i] >= '0' && ptmp[i] <= '9')	 		{ 			g_charnum[ptmp[i] - '0']++; 			continue; 		} 	} 	for(i = 0; i < MAX_CHAR_TYPES; i++) 	{ 		printf("idx:%d--%d\n", i, g_charnum[i]);	 	}  	return 0; } ./a.out  0123456789987654321 idx:0--1 idx:1--2 idx:2--2 idx:3--2 idx:4--2 idx:5--2 idx:6--2 idx:7--2 idx:8--2 idx:9--   #include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_CHAR_TYPES	10  unsigned int g_charnum[MAX_CHAR_TYPES];   int main(int argc, char *argv[]) { 	int i = 0;  	if(argc <= 1) 	{ 		printf("Usage : ./a.out stringXXXXX\n");	 		return -1; 	}  	char *ptmp = argv[1];	 	int len = strlen(ptmp); 	for(i = 0; i < len; i++) 	{ 		if(ptmp[i] >= '0' && ptmp[i] <= '9')	 		{ 			g_charnum[ptmp[i] - '0']++; 		} 	} 	for(i = 0; i < MAX_CHAR_TYPES; i++) 	{ 		printf("idx:%d--%d\n", i, g_charnum[i]);	 	}  	return 0; } ./a.out  0123456789987654321 idx:0--1 idx:1--2 idx:2--2 idx:3--2 idx:4--2 idx:5--2 idx:6--2 idx:7--2 idx:8--2 idx:9--2    以这个代码为准。

引用 7 楼 636f6c696e的回复:因为转成字符串后，数字2变成字符'2'了，需要转换 [quote=引用 4 楼 夜太美。 的回复:] [quote=引用 2 楼 636f6c696e 的回复:] 直接转成字符串比较也挺方便的 #include <stdio.h>  int main() {     char str[100];     int num, digit, i, count = 0;     scanf("%d %d", &num, &digit);     sprintf(str, "%d", num);     for (i = 0; i < 100; i++)     {         if (str[i] == '\0')             break;         if (str[i] == digit + '0')             count++;      }     printf("count=%d\n", count);     return 0; }    这个if (str[i] == digit +'0')    digit  为啥要加‘0’？[/quote][/quote] 哦哦，只允许这样转换吗？有其他方法吗？

因为转成字符串后，数字2变成字符'2'了，需要转换 引用 4 楼 夜太美。 的回复:[quote=引用 2 楼 636f6c696e 的回复:] 直接转成字符串比较也挺方便的 #include <stdio.h>  int main() {     char str[100];     int num, digit, i, count = 0;     scanf("%d %d", &num, &digit);     sprintf(str, "%d", num);     for (i = 0; i < 100; i++)     {         if (str[i] == '\0')             break;         if (str[i] == digit + '0')             count++;      }     printf("count=%d\n", count);     return 0; }    这个if (str[i] == digit +'0')    digit  为啥要加‘0’？[/quote]

引用 1 楼 自信男孩 的回复:注意若输入：-21252 2，那么-21252 % 10之后得到是-2，而不是2.  #include <stdio.h>  int Count_Digit (int N,int D);  int main() {     int N, D;      scanf("%d %d", &N, &D);     printf("%d\n", Count_Digit(N, D));     return 0; }  int Count_Digit (int num, int key ) { #if 1     int cnt = 0;      if (num < 0)         num = -num;     if (key < 0)         key = -key;      while (num) {         if (num % 10 == key)             cnt++;         num /= 10;     }      return cnt; #else     int a=1;     int D1=0;     D1=N;     for(;D!=D1;)     {         if(D1>0)         {             if(D==(D1%10))             {                 a++;             }             D=(D1/10);             D1=D;         }         else         {             if((-D)==(D1%10))             {                 a++;             }             D=-(D1/10);             D1=(-D);         }     }     return a; #endif }   供参考！    这个问题怎么解决？？  测试点2是错的   测试点	提示	结果	耗时	内存 0	sample, 数字<0且不连续出现	答案正确	2 ms	384 KB 1	数字>0，有连续出现	答案正确	2 ms	288 KB 2	N=0，且输出1	答案错误	1 ms	372 KB 3	输出为0	答案正确	1 ms	256 KB 4	统计0的次数，可能循环会多1	答案正确	1 ms	360 KB   代码这样写的 int Count_Digit (int num, int key ) {     int cnt = 0;     if (num < 0)         num = -num;     if (key < 0)         key = -key;     while (num) 	{         if (num % 10 == key)             cnt++;         num /= 10;     }     return cnt; }  引用 1 楼 自信男孩 的回复:注意若输入：-21252 2，那么-21252 % 10之后得到是-2，而不是2.  #include <stdio.h>  int Count_Digit (int N,int D);  int main() {     int N, D;      scanf("%d %d", &N, &D);     printf("%d\n", Count_Digit(N, D));     return 0; }  int Count_Digit (int num, int key ) { #if 1     int cnt = 0;      if (num < 0)         num = -num;     if (key < 0)         key = -key;      while (num) {         if (num % 10 == key)             cnt++;         num /= 10;     }      return cnt; #else     int a=1;     int D1=0;     D1=N;     for(;D!=D1;)     {         if(D1>0)         {             if(D==(D1%10))             {                 a++;             }             D=(D1/10);             D1=D;         }         else         {             if((-D)==(D1%10))             {                 a++;             }             D=-(D1/10);             D1=(-D);         }     }     return a; #endif }   供参考！   这个问题怎么解决？？  测试点2是错的   测试点	提示	结果	耗时	内存 0	sample, 数字<0且不连续出现	答案正确	2 ms	384 KB 1	数字>0，有连续出现	答案正确	2 ms	288 KB 2	N=0，且输出1	答案错误	1 ms	372 KB 3	输出为0	答案正确	1 ms	256 KB 4	统计0的次数，可能循环会多1	答案正确	1 ms	360 KB   代码这样写的 int Count_Digit (int num, int key ) {     int cnt = 0;     if (num < 0)         num = -num;     if (key < 0)         key = -key;     while (num) 	{         if (num % 10 == key)             cnt++;         num /= 10;     }     return cnt; }  引用 6 楼 夜太美。 的回复:[quote=引用 1 楼 自信男孩 的回复:] 注意若输入：-21252 2，那么-21252 % 10之后得到是-2，而不是2.  #include <stdio.h>  int Count_Digit (int N,int D);  int main() {     int N, D;      scanf("%d %d", &N, &D);     printf("%d\n", Count_Digit(N, D));     return 0; }  int Count_Digit (int num, int key ) { #if 1     int cnt = 0;      if (num < 0)         num = -num;     if (key < 0)         key = -key;      while (num) {         if (num % 10 == key)             cnt++;         num /= 10;     }      return cnt; #else     int a=1;     int D1=0;     D1=N;     for(;D!=D1;)     {         if(D1>0)         {             if(D==(D1%10))             {                 a++;             }             D=(D1/10);             D1=D;         }         else         {             if((-D)==(D1%10))             {                 a++;             }             D=-(D1/10);             D1=(-D);         }     }     return a; #endif }   供参考！   谢谢谢谢   虽然不懂那个 #if  #else #endif  啥意思[/quote]    这个问题怎么解决？？  测试点2是错的   测试点	提示	结果	耗时	内存 0	sample, 数字<0且不连续出现	答案正确	2 ms	384 KB 1	数字>0，有连续出现	答案正确	2 ms	288 KB 2	N=0，且输出1	答案错误	1 ms	372 KB 3	输出为0	答案正确	1 ms	256 KB 4	统计0的次数，可能循环会多1	答案正确	1 ms	360 KB   代码这样写的 int Count_Digit (int num, int key ) {     int cnt = 0;     if (num < 0)         num = -num;     if (key < 0)         key = -key;     while (num) 	{         if (num % 10 == key)             cnt++;         num /= 10;     }     return cnt; }

引用 1 楼 自信男孩 的回复:注意若输入：-21252 2，那么-21252 % 10之后得到是-2，而不是2.  #include <stdio.h>  int Count_Digit (int N,int D);  int main() {     int N, D;      scanf("%d %d", &N, &D);     printf("%d\n", Count_Digit(N, D));     return 0; }  int Count_Digit (int num, int key ) { #if 1     int cnt = 0;      if (num < 0)         num = -num;     if (key < 0)         key = -key;      while (num) {         if (num % 10 == key)             cnt++;         num /= 10;     }      return cnt; #else     int a=1;     int D1=0;     D1=N;     for(;D!=D1;)     {         if(D1>0)         {             if(D==(D1%10))             {                 a++;             }             D=(D1/10);             D1=D;         }         else         {             if((-D)==(D1%10))             {                 a++;             }             D=-(D1/10);             D1=(-D);         }     }     return a; #endif }   供参考！   谢谢谢谢   虽然不懂那个 #if  #else #endif  啥意思

引用 3 楼 海鸥的泪眸 的回复:#include<stdio.h> int main() { 	char num[100]; 	char number[10]={0}; 	int scan_num; 	int i=0; 	int j=0; 	printf("请输如一个整数（小数部分自动忽略）："); 	scanf("%d",&scan_num); 	printf("\n输入的整数为：%d\n\n",scan_num); 	if(scan_num<0) 	{ 		scan_num=-scan_num; 	} 	while(scan_num/10>0) 	{ 		num[i]=scan_num%10; 		scan_num=scan_num/10; 		i++; 	} 	num[i]=scan_num; 	printf("输入整数的位数为：%d\n\n",i+1); 	for(j;j<=i;j++) 	{ 		switch(num[j]) 		{ 			case 0: 				number[0]++; 				break; 			case 1: 				number[1]++; 				break;    			case 2: 				number[2]++; 				break;    			case 3: 				number[3]++; 				break; 			case 4: 				number[4]++; 				break; 			case 5: 				number[5]++; 				break; 			case 6: 				number[6]++; 				break; 			case 7: 				number[7]++; 				break; 			case 8: 				number[8]++; 				break; 			case 9: 				number[9]++; 				break; 			default: 				break; 		} 	} 	j=0; 	for(i=0;i<10;i++) 	{ 		if(j<number[i]) 		{ 			j=number[i]; 		} 	} 	i=0; 	while(i<10) 	{ 		i++; 		if(j==number[i-1]) 		{ 			printf("出现最多的数字是：%d\t出现了%d次\n\n",i-1,number[i-1]); 		} 	} }  谢谢谢谢

引用 2 楼 636f6c696e 的回复:直接转成字符串比较也挺方便的 #include <stdio.h>  int main() {     char str[100];     int num, digit, i, count = 0;     scanf("%d %d", &num, &digit);     sprintf(str, "%d", num);     for (i = 0; i < 100; i++)     {         if (str[i] == '\0')             break;         if (str[i] == digit + '0')             count++;      }     printf("count=%d\n", count);     return 0; }    这个if (str[i] == digit +'0')    digit  为啥要加‘0’？


Question: 关于光标移动的一点问题

void GotoXY(short y, short x) {	 	HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);		//获取本程序标准输出的句柄 	COORD t;										//COORD为表示坐标的结构体 	t.X=x*2;										//方便汉字定位，一个汉字占两个字符宽 	t.Y=y; 	SetConsoleCursorPosition(a , t);					//设置控制台光标位置 }  调用此函数即可移动到指定坐标去，记得包含windows.h。如果想获得光标的位置，可以去查GetConsoleScreenBufferInfo函数


Question: 一道c语言选择题 求球大佬解释一下

执行了这句：c=！c，所以c=1

引用 3 楼 focuslight 的回复:a=b=c=0   if(a=b)等价于if (0)     所以执行 else 的代码   c=！c    逻辑非运算，就是把后面的表达式的值取反。比如你这里的，c=0；在逻辑里面，0被认为是false，所以，！c的值就是true, c=1 正解！

不管是c++和++c都没关系，因为根本执行不到 引用 2 楼 weixin_44972980 的回复:[quote=引用 1 楼 636f6c696e 的回复：]a=b 不是a==b if(a=b)等价于if (a)等价于if 0那个是不是 单用的时候 c++ 和++c没有区别 结果都是原来的c加上一[/quote]

引用 1 楼 636f6c696e 的回复：a=b 不是a==b if(a=b)等价于if (a)等价于if 0那个是不是 单用的时候 c++ 和++c没有区别 结果都是原来的c加上一

a=b 不是a==b if(a=b)等价于if (a)等价于if 0


Question: 变量交换,这种方法对吗？

你这个只是把两个变量的顺序交换了一下，但是它们的值并没有交换呀！要实现交换它们的值，我们需要一个临时变量来存储其中的一个值，就相当于我们要交换两个苹果的位置，需要借助一个空盘子一样； int temp;//定义一个临时变量 temp=a;//先把a的值赋给temp a=b;//把b的值赋给a,此时a的值为b的值 b=temp;//把原来a的值赋给b   ＃include<stdio.h> int main() {int a,b; scanf("%d%d",&a,&b); int temp;//定义一个临时变量 temp=a;//先把a的值赋给temp a=b;//把b的值赋给a,此时a的值为b的值 b=temp;//把原来a的值赋给b printf(%d %d\n",a,b); return 0; }

少侠这波操作还可以，内存上的值没有变，会造成段错误

交换其实是指交换内存里的数据，你这样交换只是输出时“交换”，而内存里的值没有变化。

a还是a， b还是b

少侠这波操作6啊,秀的我脑壳疼 int tmp=a; b=a; a=tmp;

......没有交换变量啊，只是逆序输出


Question: 明明有库，编译器却不自动链接，这是怎么回事？

引用 1 楼 user-1 的回复:#pragma comment(lib, "XXX.lib")  添加一下， 就一行代码的事 我已经提到过“手动链接”的方案，你并没有在回答我的问题。


Question: steam!=NULL

已解决，谢谢各位大佬

引用 3 楼 636f6c696e的回复:从assert看，fp是空，所以挂了，确定在程序运行位置有相应的文件么？ 我直接复制的路径，确定

fp = fopen(……); if(fp != NULL) //先判断下文件是否打开成功 {    }

从assert看，fp是空，所以挂了，确定在程序运行位置有相应的文件么？

还是不行，不是死循环的问题

NULL是void *类型的，为什么要和char类型的数据比较呢？ 程序一场了，很可能是死循环了。 修改三个个地方吧： 第一，把ch定义为int类型，然后 第二，while (ch != EOF); 第三，判断一下打开文件之后返回值，即判断一下fp是否为NULL  基础的C语言使用，建议多练习一下


Question: 整合两个代码

引用 3 楼 自信男孩 的回复:什么问题？可以把问题描述的更清晰一些～就是这个第一个是个月历查询年份>回车>月份>回车>日期>回车就能显示月历，第二个是个动态时间捕获的。想把两个合在一块QAQ

两个代码功能分别是啥，要整合成什么样子都不说，是让人去猜么？

什么问题？可以把问题描述的更清晰一些～

顶一哈= =


Question: 矩阵转置行指针

#include <stdio.h>  #define N 10  void f(int(*a)[N], int n) {     /**********  Begin  **********/     int i, j, tmp;      for (i = 0; i < n; i++)         for (j = i; j < n; j++) {             if (i != j) {                 tmp = a[i][j];                 a[i][j] = a[j][i];                 a[j][i] = tmp;             }             //printf("a[%d][%d] = %d\n", i, j, a[i][j]);         }      /**********   End  ***********/  }  int main() {     int a[N][N], n, i, j;     scanf("%d", &n);     if (n > N)   //防止n过大导致数组越界         n = N;     int cnt = 1;     for (i = 0; i<n; i++)         for (j = 0; j<n; j++)             a[i][j] = cnt++;             //scanf("%d", &a[i][j]);     for (i = 0; i<n; i++) {         for (j = 0; j<n; j++)             printf("%2d ", a[i][j]);         putchar(10);     }     putchar(10);     f(a, n);     for (i = 0; i<n; i++)     {         for (j = 0; j<n; j++)             printf("%2d ", a[i][j]);         printf("\n");     }     return 0; }  供参考！


Question: 如何将Int转为16进制数存放到Byte数组里面？

int a=12;int b=0x0b;byte b=0x0b; 三者一样

byte b = 0x0b;

楼上的人已经说了，内存里都是二进制，没有什么10进制 16进制之说。 如果你是要打印输出成0xb，可以通过printf("0x%X", b[0])进行输出 引用 3 楼 clwk 的回复:转换没问题，我的问题就是怎么把转换后的结果变成b[0] = 0XB

转换没问题，我的问题就是怎么把转换后的结果变成b[0] = 0XB

在内存里都是以二进制形式存储的，没有10进制，16进制等之说。所以，没有必要先转16进制再放到byte里，可以直接赋值 b[0]  = a;如果想看b[0]的16进制数据，可以用%x输出即可。

本质是10进制到256进制的转换，你想到这点怎么做就没啥难度了吧


Question: Byte 数组长度如何计算？

引用 2 楼 636f6c696e 的回复:看错了，数组长度都可以通过sizeof(a) / sizeof(a[0])来获取 这是求数组的长度，楼主的数据不确定正好放满数组吧

好的，多谢了。

引用 10 楼 clwk 的回复:[quote=引用 9 楼 自信男孩 的回复:] [quote=引用 2 楼 636f6c696e 的回复:] 看错了，数组长度都可以通过sizeof(a) / sizeof(a[0])来获取 这是求数组的长度，楼主的数据不确定正好放满数组吧[/quote] 是的，长度未知，所以需要计算。[/quote] 那就在存数据的地方顺便将长度带出来

引用 9 楼 自信男孩 的回复:[quote=引用 2 楼 636f6c696e 的回复:] 看错了，数组长度都可以通过sizeof(a) / sizeof(a[0])来获取 这是求数组的长度，楼主的数据不确定正好放满数组吧[/quote] 是的，长度未知，所以需要计算。

不存在的，既然你声明了byte b[10]，就算你没有主动赋值了，b[6]~b[9]都是有具体数值的，而且一般为0。 如果你想获取到赋值过的长度，也有两种方法： 1. 初始化为无效值，比如0xff 2. 加一个flag字段组装成一个结构体来使用 引用 6 楼 clwk 的回复:有个问题就是： byte b[10];  sizeof(b)/sizeof(b[0])=10; 我只想获取长度6

数组做形参的时候,要带上数组长度

函数传参数组退化成指针，要么用C++引用，要么在函数传参也传入数组长度 引用 3 楼 clwk 的回复:没错，这样是可以的，但是改成如下方式，就不灵了。  void _bytelength(BYTE* bInfo) { 	int ilen = sizeof(bInfo) / sizeof(bInfo[0]); 	 } 结果变成4了。

就你这样的数据规律，可以直接用strlen来获取


Question: C语言数组问题

for (i = 0; i < n - 1; i++)     b[i] = a[i + 1] - a[i]; 引用 2 楼 weixin_44859164 的回复:[quote=引用 1 楼 user-1的回复:]哪里不会问哪里，作业党还是自己试着写写吧 把a中所有的后项减前项至差存入数组b，这里不会表示[/quote]

引用 1 楼 user-1的回复:哪里不会问哪里，作业党还是自己试着写写吧 把a中所有的后项减前项至差存入数组b，这里不会表示

哪里不会问哪里，作业党还是自己试着写写吧


Question: Raptor

直接将需求一个字一个字的输入到帖子里吧，贴图片要么不清晰，要么不正。  另外，建议自己先写写，遇到具体问题再提出来。


Question: 大佬帮帮忙，改下C语言代码

替换所有 gets 为 scanf  推荐 scanf 使用格式  scanf("%d%*1024[^\r\n]%*c", &a);   排除不需要的输入和烦人的回车  ---  目前判断输入缓存问题

printf("\n\n\n\n\n\n\n"); 		printf("**************************************************************"); 		printf("\n南邮图书馆管理员功能系统\n"); 		printf("1.添加书籍信息\n"); 		printf("2.删除书籍信息\n"); 		printf("3.修改书籍信息\n"); 		printf("4.查询书籍信息\n"); 		printf("5.查询用户信息\n"); 		printf("0.退出\n"); 		printf("**************************************************************"); 		printf("\n\n\n\n\n\n\n"); 		printf("输入您需要进行的操作: "); 		scanf("%d", &cmd); 		getchar(); 		switch (cmd) 		{ 		case 1: 			addbook(); 			break; 		case 2: 			deletebook(); 			break; 		case 3: 			changebook(); 			break; 		case 4: 			searchbook(); 			break; 		case 5: 			searchuser(); 			break; 		case 0: 			end = 1; 			break; 		default: 			printf("错误的输入!\n"); 		} 		if (end == 1) 			break; 	} }   void adminregister() { 	struct adminstruct *p; 	char adminname[1000]; 	char adminscert[1000]; 	FILE *fp;   	system("cls"); 	if (admincount == 0)            //第一次添加 	{ 		adminhead = (struct adminstruct *)malloc(sizeof(struct adminstruct)); 		printf("adminname: "); 		while (gets(adminname)) 		{ 			if (strlen(adminname) < 10) 				break; 			else 				printf("too long"); 		} 		strcpy(adminhead->adminname, adminname); 		printf("adminscert: "); 		while (gets(adminscert)) 		{ 			if (strlen(adminscert) < 10) 				break; 			else 				printf("too long"); 		} 		strcpy(adminhead->scert, adminscert); 		adminend = adminhead; 		adminend->next = NULL; 	} 	else 	{ 		p = (struct adminstruct *)malloc(sizeof(struct adminstruct)); 		printf("adminname: "); 		while (gets(adminname)) 		{ 			if (strlen(adminname) < 10) 				break; 			else 				printf("too long"); 		} 		strcpy(p->adminname, adminname); 		printf("adminscert: "); 		while (gets(adminscert)) 		{ 			if (strlen(adminscert) < 10) 				break; 			else 				printf("too long"); 		} 		strcpy(p->scert, adminscert); 		adminend->next = p; 		adminend = p; 		adminend->next = NULL; 	} 	admincount++;   	fp = fopen("admin", "w"); 	p = adminhead; 	while (p != NULL) 	{ 		fwrite(p, sizeof(struct adminstruct), 1, fp); 		p = p->next; 	} 	fclose(fp);   	system("cls"); 	printf("管理员%s创建成功\n", adminend->adminname); 	printf("3秒后自动返回主界面....\n"); 	Sleep(3000); }   void borrowbook(struct userstruct *userp) { 	struct bookstruct *p; 	char bookname[100]; 	int exist = 0;   	system("cls"); 	p = bookhead; 	while (p != NULL) 	{ 		printf("bookname: %10s\tbookcount: %3d\n", p->bookname, p->count); 		p = p->next; 	} 	printf("输入您需要借阅的书籍名称: "); 	getchar(); 	gets(bookname);   	p = bookhead; 	while (p != NULL) 	{ 		if (strcmp(bookname, p->bookname) == 0) 		{ 			if (p->count == 0) 				printf("此书无余量..."); 			else 			{ 				p->count -= 1; 				userp->bookcount++; 				strcpy(userp->booklist[userp->bookcount - 1], p->bookname); 				writefile(0); 				writefile(2); 				exist = 1; 				break; 			} 		} 		p = p->next; 	}   	if (exist == 0) 		printf("不存在此书!\n"); 	else 		printf("%s借阅成功", p->bookname); 	printf("3秒后返回用户界面..."); 	Sleep(3000); }   void returnbook(struct userstruct *userp) { 	struct bookstruct *p; 	char bookname[100]; 	int count = userp->bookcount; 	int exist; 	int flag;     int i; 	system("cls"); 	p = bookhead; 	while (count--) 	{ 		printf("booklist:\n"); 		printf("%s\n", userp->booklist[count]); 	} 	printf("\n\n\n\n\n"); 	printf("**************************************************************"); 	printf("\n输入你需要归还的书籍名称: ");   	scanf("%s",&bookname[100]); 	while(bookname[100]) 	{ 		exist = 0; 		for (i = 0; i < userp->bookcount; i++) 		{ 			if (strcmp(bookname, userp->booklist[i]) == 0) 			{ 				flag = i; 				exist = 1; 				break; 			} 		} 		if (!exist) 		{ 			printf("你借阅的书籍中不存在此书籍...\n"); 			printf("请重新输入你需要归还的书籍名称: "); 		} 		else 			break; 	} 	printf("**************************************************************"); 	while (p != NULL) 	{ 		if (strcmp(p->bookname, bookname) == 0) 		{ 			p->count++; 			break; 		} 		p = p->next; 	}   	for (i = flag; i < userp->bookcount - 1; i++) 	{ 		strcpy(userp->booklist[i], userp->booklist[i + 1]); 	} 	userp->bookcount--; 	writefile(0); 	writefile(2); 	printf("\n%s归还成功...", bookname); 	printf("3秒后自动跳转回用户界面..."); 	Sleep(3000); }   void findbook(struct userstruct *userp) { 	int count = userp->bookcount; 	int n;   	system("cls"); 	printf("\n\n\n\n\n"); 	printf("**************************************************************"); 	printf("\nbooklist:\n"); 	while (count--) 	{ 		printf("%s\n", userp->booklist[count]); 	} 	printf("**************************************************************"); 	printf("\n输入0返回用户界面: "); 	while (1) 	{ 		scanf("%d", &n); 		if (n == 0) 			break; 		else 			printf("无效的输入，请重新输入: "); 	} }   void addbook() {    int isexist = 0; 	struct bookstruct *p; 	char bookname[100]; 	FILE *fp;   	system("cls"); 	if (bookcount == 0) 	{ 		printf("输入新增书籍的书名: "); 		while (gets(bookname)) 		{ 			if (strlen(bookname) > 10) 				printf("too long\n"); 			else 				break; 		} 		strcpy(bookhead->bookname, bookname); 		printf("id: "); 		scanf("%d", &bookhead->id); 		printf("author: "); 		scanf("%s", bookhead->author); 		printf("bookyear: "); 		scanf("%d", &bookhead->year); 		printf("bookmonth: "); 		scanf("%d", &bookhead->month); 		printf("bookday: "); 		scanf("%d", &bookhead->day); 		printf("bookcount: "); 		scanf("%d", &bookhead->count);   		bookend = bookhead; 		bookend->next = NULL; 	} 	else 	{ 		printf("输入新增书籍的书名: "); 		while (gets(bookname)) 		{ 			if (strlen(bookname) > 10) 				printf("too long\n"); 			else 				break; 		} 		 		p = bookhead; 		while (p != NULL) 		{ 			if (strcmp(bookname, p->bookname) == 0) 			{ 				isexist = 1; 				break; 			} 			p = p->next; 		} 		if (isexist == 1) 		{ 			int count;

void startsys() { 	int cmd; 	int end = 0;   	while (1) 	{ 		system("cls"); 		printf("\n\n\n\n\n\n\n"); 		printf("**************************************************************"); 		printf("\南邮图书馆管理系统\n"); 		printf("1.用户登陆\n"); 		printf("2.管理员登陆\n"); 		printf("3.用户注册\n"); 		printf("4.管理员注册\n"); 		printf("0.退出\n"); 		printf("**************************************************************"); 		printf("\n\n\n\n\n\n\n"); 		printf("输入你需要进行的操作: "); 		scanf("%d", &cmd); 		 		switch (cmd) 		{ 		case 1: 			userlogin(); 			break; 		case 2: 			adminlogin(); 			break; 		case 3: 			userregister(); 			break; 		case 4: 			adminregister(); 			break; 		case 0: 			end = 1; 			break; 		default: 			printf("错误输入!\n"); 		} 		if (end == 1) 			break; 	} }   void userlogin() { 	struct userstruct *p; 	char username[10]; 	char scert[10]; 	int exist = 0; 	   	p = head; 	system("cls"); 	printf("\n\n\n\n\n\n\n"); 	printf("**************************************************************"); 	printf("\n输入您的用户信息: \n"); 	printf("username: "); 	scanf("%s",&username[100]); 	printf("userscert: "); 	scanf("%s",&scert[100]); 	printf("**************************************************************"); 	printf("\n\n\n\n\n\n\n");   	while (p != NULL) 	{ 		if (strcmp(p->username, username) == 0) 		{ 			exist = 1; 			while(strcmp(p->scert, scert) != 0) 			{ 				printf("密码错误!请重新输入\n"); 				printf("userscert: "); 				gets(scert); 			} 			printf("用户%s登陆成功!3秒后自动跳转至用户界面...", p->username); 			Sleep(3000); 			userfunction(p); 		} 		p = p->next; 	} 	if (!exist) 	{ 		printf("不存在此用户名,请先前往注册...\n"); 		printf("3秒后自动跳转至主界面..."); 		Sleep(3000); 	} }   void userfunction(struct userstruct *p) { 	int cmd; 	int end = 0;   	while (1) 	{ 		system("cls"); 		printf("\n\n\n\n\n\n\n"); 		printf("**************************************************************"); 		printf("\n南邮图书馆用户功能系统\n"); 		printf("1.借阅书籍\n"); 		printf("2.归还书籍\n"); 		printf("3.已借阅书籍信息\n"); 		printf("0.退出\n"); 		printf("**************************************************************"); 		printf("\n\n\n\n\n\n\n"); 		printf("输入您需要进行的操作: "); 		scanf("%d", &cmd); 		switch (cmd) 		{ 		case 1: 			borrowbook(p); 			break; 		case 2: 			returnbook(p); 			break; 		case 3: 			findbook(p); 			break; 		case 0: 			end = 1; 			break; 		default: 			printf("错误的输入!\n"); 		} 		if (end == 1) 			break; 	} }   void userregister() { 	struct userstruct *p; 	char username[100]; 	char scert[100]; 	FILE *fp;   	system("cls"); 	if (usercount == 0)            //第一次添加 	{ 		printf("username: "); 		while (gets(username)) 		{ 			if (strlen(username) < 10 && !isexist(username, 0)) 				break; 			else if (isexist(username, 0)) 			{ 				printf("该用户名已经存在!\n"); 				printf("username: "); 			} 			else 			{ 				printf("too long\n"); 				printf("username: "); 			} 		} 		strcpy(head->username, username); 		printf("userscert: "); 		while (gets(scert)) 		{ 			if (strlen(scert) < 10) 				break; 			else 				printf("too long"); 		} 		strcpy(head->scert, scert); 		head->bookcount = 0; 		end = head; 		end->next = NULL;   	} 	else 	{ 		p = (struct userstruct *)malloc(sizeof(struct userstruct)); 		printf("username: "); 		while (gets(username)) 		{ 			if (strlen(username) < 10 && !isexist(username, 0)) 				break; 			else if (isexist(username, 0)) 			{ 				printf("该用户名已经存在!\n"); 				printf("username: "); 			} 			else 			{ 				printf("too long\n"); 				printf("username: "); 			} 		} 		strcpy(p->username, username); 		printf("userscert: "); 		while (gets(scert)) 		{ 			if (strlen(scert) < 10) 				break; 			else 				printf("too long"); 		} 		strcpy(p->scert, scert); 		p->bookcount = 0; 		end->next = p; 		end = p; 		end->next = NULL; 	} 	usercount++;     	fp = fopen("user", "w"); 	p = head; 	while (p != NULL) 	{ 		fwrite(p, sizeof(struct userstruct), 1, fp); 		p = p->next; 	} 	fclose(fp);   	system("cls"); 	printf("用户%s创建成功\n", end->username); 	printf("3秒后自动返回主界面....\n"); 	Sleep(3000); }   int isexist(char *name,int flag) { 	if (flag == 0) 	{ 		struct userstruct *p; 		p = head; 		while (p != NULL && usercount != 0) 		{ 			if (strcmp(name, p->username) == 0) 				return 1; 			p = p->next; 		} 	} 	else if (flag == 1) 	{ 		struct adminstruct *p; 		p = adminhead; 		while (p != NULL) 		{ 			if (strcmp(name, p->adminname) == 0) 				return 1; 			p = p->next; 		} 	} 	else if (flag == 2) 	{ 		struct bookstruct *p; 		p = bookhead; 		while (p != NULL) 		{ 			if (strcmp(name, p->bookname) == 0) 				return 1; 			p = p->next; 		} 	} 	return 0; }   void adminlogin() { 	struct adminstruct *p; 	char adminname[100]; 	char adminscert[100];   	p = adminhead; 	system("cls"); 	printf("\n\n\n\n\n\n\n"); 	printf("**************************************************************"); 	printf("\n输入您的管理员信息: \n"); 	printf("adminname: "); 	gets(adminname); 	printf("adminscert: "); 	gets(adminscert); 	printf("**************************************************************"); 	printf("\n\n\n\n\n\n\n");   	while (p != NULL) 	{ 		if (strcmp(p->adminname, adminname) == 0) 		{ 			while (strcmp(p->scert, adminscert) != 0) 			{ 				printf("密码错误!请重新输入\n"); 				printf("adminscert: "); 				gets(adminscert); 			} 			printf("管理员%s登陆成功!3秒后自动跳转至用户界面...", p->adminname); 			Sleep(3000); 			 		} 		p = p->next; 	} }   void adminfunction() { 	int cmd; 	int end = 0;   	while (1) 	{ 		system("cls");

#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<windows.h> #include<conio.h> struct userstruct        /*用户*/ { 	int bookcount; 	char username[100]; 	char scert[100]; 	char booklist[10][20]; 	struct userstruct *next; }; struct adminstruct       /*管理员*/ { 	char adminname[10]; 	char scert[10]; 	struct adminstruct *next; }; struct bookstruct { 	int id; 	char bookname[10]; 	char author[10]; 	int year; 	int month; 	int day; 	int count; 	struct bookstruct *next; }; struct userstruct *head = NULL, *end = NULL; struct adminstruct *adminhead = NULL, *adminend = NULL; struct bookstruct *bookhead = NULL, *bookend = NULL; int usercount, admincount, bookcount;   void startsys(); void readuserfile(); void readadminfile(); void readbookfile(); void userlogin(); void userfunction(struct userstruct *p); void userregister(); void adminlogin(); void adminregister(); void adminfunction(); void borrowbook(struct userstruct *userp); void findbook(struct userstruct *userp); void returnbook(struct userstruct *userp); void addbook(); void deletebook(); void searchbook(); void changebook(); void searchuser(); void writefile(int flag); void changuserbook(char *userbookname,char *bookname); void deleteuserbook(char *bookname); int isexist(char *name,int flag);  int main() { 	FILE *fp;   	head = (struct userstruct *)malloc(sizeof(struct userstruct)); 	adminhead = (struct adminstruct *)malloc(sizeof(struct adminstruct)); 	bookhead = (struct bookstruct *)malloc(sizeof(struct bookstruct));   	fp = fopen("user", "a+"); 	usercount = fread(head, sizeof(struct userstruct), 1, fp); 	fclose(fp); 	end = head; 	readuserfile();   	fp = fopen("admin", "a+"); 	admincount = fread(adminhead, sizeof(struct adminstruct), 1, fp); 	fclose(fp); 	adminend = adminhead; 	readadminfile();   	fp = fopen("book", "a+"); 	bookcount = fread(bookhead, sizeof(struct bookstruct), 1, fp); 	fclose(fp); 	bookend = bookhead; 	readbookfile();   	startsys(); 	return 0; }

建议直接贴出代码


Question: 想让线程退出时输出 Hello,world! 结果总是输出NULL， 哪里有问题？

5楼：但是线程退出函数pthread_exit(void *rval_ptr)返回的不是个指针吗？包括线程显式退出的返回值：return (void *)str. 我就是想利用pthread_join(pthread_t tid,void **rtval)的第二个2级指针参数达到目的，不知道这里这个参数能做什么

void *creat(void *arg){         char str[13]="hello! world!";         printf("new thread is created ... \n");         return (void *)str; }    这是返回局部变量的地址，有些问题

还是不行，感觉指针传递有问题

proyj@ubuntu1804:~$ gcc test.c -lpthread -o test test.c: In function ‘creat’: test.c:9:9: warning: function returns address of local variable [-Wreturn-local-addr]   return (void *)str;          ^~~~~~~~~~~ test.c: In function ‘main’: test.c:15:11: warning: initialization makes integer from pointer without a cast [-Wint-conversion]   int temp=(int *)malloc(sizeof(int));            ^ test.c:22:27: warning: passing argument 2 of ‘pthread_join’ from incompatible pointer type [-Wincompatible-pointer-types]   error = pthread_join(tid,&temp);                            ^ In file included from test.c:2:0: /usr/include/pthread.h:251:12: note: expected ‘void **’ but argument is of type ‘int *’  extern int pthread_join (pthread_t __th, void **__thread_return);             ^~~~~~~~~~~~ test.c:27:41: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]   printf("thread is exit! because %s\n", (char *)temp);                                          ^ proyj@ubuntu1804:~$ ./test main thread! new thread is created ... thread is exit! because (null) proyj@ubuntu1804:~$

void *temp是空指针，没申请内存

int *temp = (int *)malloc(sizeof(int));  error = pthread_join(tid,&temp);         if(error){                 printf("thread is not exit ... \n");                 return -2;         } printf("state  = %d\n", *temp);


Question: c语言中关于指针类型分辨问题

试试C11引入的_Generic  #include "stdio.h" int main( void) { 	char *p; 	_Generic( p, int*:printf("A"), char*:printf("B"), double*: printf("c")); 	return 0;  }

楼主可以说说看原始诉求是什么么？ 我觉得可以通过union来解决

做不到，里面的数据做不到识别类型。

重点是你如何知道void*指向的实际类型？ 有两个基本方案： 1）在编码的时候就清楚什么类型（静态） 2）运行时确定：由外部某些条件判断类型，然后进行转换。或者，指针（所有类型）指向的内存的固定位置携带类型信息

不能，C语言指针可以随意转换类型

不知道以下代码是否能帮到楼主？  int test(void *p) {     uint8_t *p8 = (uint8_t *)p;     uint16_t *p16 = (uint16_t *)p;     uint32_t *p32 = (uint32_t *)p;     ... }


Question: 萌新，求大神帮忙

这个很简单，就是三个变量，分别存储：第一个数字  运算符   第二个数字 然后按照运算符的多种情况来执行对应的运算即可。附上代码：   #include <stdio.h> #include <stdlib.h>  int main() {     int a,b,result;     char op;     scanf("%d %c %d",&a,&op,&b);     switch(op)     {     case '+':result=a+b;break;     case '-':result=a-b;break;     case '*':result=a*b;break;     case '/':result=a/b;break;     case '%':result=a%b;break;     default:printf("ERROR");return 1;     }     printf("%d",result);     return 0; }

引用 1 楼 user-2的回复: #include <stdio.h> #include <stdlib.h>  int main() {     int a,b,result;     char op;     scanf("%d %c %d",&a,&op,&b);     switch(op)     {     case '+':result=a+b;break;     case '-':result=a-b;break;     case '*':result=a*b;break;     case '/':result=a/b;break;     case '%':result=a%b;break;     default:printf("ERROR");return 1;     }     printf("%d",result);     return 0; }   谢谢了，真的帮到我了


Question: c语言问题

创建一个130空间的int数组，初值为1，对输入字符串遍历一遍，每个字符进行标记，比如出现字符“a”，用ASCII码做下标，把这个数组下标置为1，即保证这个字符出现过，然后，先从''A到Z，再从a到z，找到的第一个就是最大的


Question: 这个哪里错了有大佬知道吗

引用 4 楼 海鸥的泪眸的回复:把你的变量都定义为double类型，谁规定存钱都是整数，系统测试你程序的时候会输入小数的，兄弟！ 老铁。。。看题目要求啊

引用 3 楼 tianyingang的回复: 你的程序输出是多少？ 好啦谢谢！！！！！！！！！

引用 2 楼 user-3的回复:输出样例： sum=53844.53 看漏了！！谢谢！！！！！！！

你的程序输出是多少？

输出样例： sum=53844.53

求解答。。


Question: 掷骰子游戏，救救孩子吧

1，提示用户输入y就算准备好开始游戏，程序显示出三个骰子各自的数值，以及三个骰子加起来的总和数。结束后问用户还要不要再来，y再来，n退出。 2，如果筛子出现111,222,333,444,555,666的组合就打印花屏幕恭喜用户中彩。 3，每次扔骰子前邀请用户输入数值下注，如果用户博大小赢了就赚投注2倍的点数，如果碰到111,222,333之类的中彩组合则赢10倍的点数。 4，能够设计一个帮助用户显示所剩点数的机制，用户开始游戏时有300点，每次投注最少不能少于50点，每次投注额只能是50点的倍数。 系统记录用户还剩多少点。 5，每轮游戏前提示用户当前的点数以及用户游戏的次数，用户一共赢了多少次，输了多少次。


Question: 求大佬进来看一眼（关于循环数）

for(i = len - 1; i; i--) {             ans += (s[i] - '0') * (len + 1);             if(ans % BASE != 9) {flag = 0; break;}             ans /= BASE;         }这个for循环真的看不懂什么意思    大佬讲讲吧！

题目不是写得很清楚了么？ 循环数的定义就是n位数字乘1~n都是原数字的一种分割组合 引用 3 楼 程序员00h 的回复:[quote=引用 2 楼 Italink的回复:] /* Bailian2952 循环数 */  #include <stdio.h> #include <string.h>  #define BASE 10 #define N 60 char s[N + 1];  int main() { 	int len, i;  	while (~scanf("%s", s)) { 		len = strlen(s);  		int ans = 0, flag = 1; 		for (i = len - 1; i/*等价 i!=0 */; i--) {			//从字符串的最后，也就是数字的最低位开始 			ans += (s[i] - '0') * (len + 1);				//每一位数乘以（数字的长度+1）比如142857最低位就是7*（6+1）= 49 			if (ans % BASE != 9) { flag = 0; break; }		//查看最后一位ans是不是9,不是说明不是循环数，flag标记，结束循环 			ans /= BASE;									//去除低位49->4 		} 		if (flag) { 			len = (len + 1) / 2;							//将数字对半分开,查看每一组对应位置相加是否为9 			for (i = 0; i < len; i++) {						//比如142857—》142 and 857 ：1+8 4+2 2+7 				if (s[i] - '0' + s[i + len] - '0' != 9) {		//-'0'只是做一个类型转换 					flag = 0; 					break; 				} 			} 		}  		printf("%d\n", flag); 	}  	return 0; }   不是   这些能看懂    不好意思  我没说清楚   我不知道为什么要用for循环这样判断   是循环数的什么定理吗[/quote]

引用 2 楼 Italink的回复: /* Bailian2952 循环数 */  #include <stdio.h> #include <string.h>  #define BASE 10 #define N 60 char s[N + 1];  int main() { 	int len, i;  	while (~scanf("%s", s)) { 		len = strlen(s);  		int ans = 0, flag = 1; 		for (i = len - 1; i/*等价 i!=0 */; i--) {			//从字符串的最后，也就是数字的最低位开始 			ans += (s[i] - '0') * (len + 1);				//每一位数乘以（数字的长度+1）比如142857最低位就是7*（6+1）= 49 			if (ans % BASE != 9) { flag = 0; break; }		//查看最后一位ans是不是9,不是说明不是循环数，flag标记，结束循环 			ans /= BASE;									//去除低位49->4 		} 		if (flag) { 			len = (len + 1) / 2;							//将数字对半分开,查看每一组对应位置相加是否为9 			for (i = 0; i < len; i++) {						//比如142857—》142 and 857 ：1+8 4+2 2+7 				if (s[i] - '0' + s[i + len] - '0' != 9) {		//-'0'只是做一个类型转换 					flag = 0; 					break; 				} 			} 		}  		printf("%d\n", flag); 	}  	return 0; }   不是   这些能看懂    不好意思  我没说清楚   我不知道为什么要用for循环这样判断   是循环数的什么定理吗


Question: 线程等待函数 pthread_join(pthread_t tid, void **rval_ptr) 为什么第二个参数要定义成二级指针？

copies the exit status of the target thread (i.e., the value that the target thread supplied to pthread_exit(3)) into  the  location  pointed  to  by *retval.   本身pthread_exit(void *retval)函数参数就是个指针，pthread_exit(3)是什么用法？

If retval is not NULL, then pthread_join() copies the exit status of the target thread (i.e., the value that the target thread supplied to pthread_exit(3)) into  the  location  pointed  to  by        *retval.  If the target thread was canceled, then PTHREAD_CANCELED is placed in *retval  这是一个传入传出参数

网上大多数例子都是调用函数时将这个指针参数设置成了NULL

请问有没有例子可以加深理解？

二级指针就说明*rval_ptr会修改啊，猜测函数内部实现为： 会申请内存存取数据：mem = malloc(xxx) 最后*rval_ptr = mem


Question: 小白初学指针 有些问题

scanf的第二个参数是一个地址，表明输入转换后的数字写进这个地址里，而a[j][i]是个变量，相当于你是在用这个变量的值来作为地址。

表达式a[j][i]是一个整体。

我明白了 二位数组 数组名传递的是a[0]的地址 并非a[0][0] 所以为出现问题 感谢大佬！

引用 1 楼 user-3 的回复:&a[j][i] 谢谢大佬回答 能编译了 但是我想问题下 数组名不也是指针吗？为什么在scanf下也要加取址符号？

&a[j][i]


Question: 有大神能帮我看看 这个程序为什么查不出来吗？

引用 1 楼 user-2的回复: #include<stdio.h> #include<stdlib.h> #define N 10 void main() { 	int array[N] = { 98,87,81,79,52,49,33,21,18,6 }; 	int x = 81; 	int location; 	int bottom = 0; 	int top = N - 1; 	int mid; 	int flag = 0; 	while (bottom <= top) 	{ 		mid = (bottom + top) / 2; 		if (array[mid] == x) 		{ 			location = mid; 			flag = 1; 			break; 		} 		else if (bottom == top)	//未找到需要结束循环 			break; 		else if (array[mid] < x) //反了 			top = mid-1;			  		else 			bottom = mid+1 ; 	} 	if (flag == 0) 		printf("不存在!\n"); 	else 		printf("%d 在数组中的位置是：%d \n", x, location + 1); 	system("pause"); } 谢谢您了，我是一名刚学C语言的学生，感谢您在百忙之中对我做出的指导。这个程序调了好久，谢谢您的帮忙。

自己调试下呗，难道以后每个问题都要来论坛上问人么？ windows上vs linux上gdb都可以逐行调试，再不济自己加点printf总会吧


Question: PAT1028人口普查，求大佬看看BUG

引用 5 楼 Martin Morning 的回复:[quote=引用 4 楼 自信男孩的回复:]#include <stdio.h> #include <stdlib.h>  typedef struct man {     //char name[1000];     char name[64];     int y;     int m;     int d; }M; int main() {     int n,y,m,d;     int num=0;     //M p[100000];     M *p;     M old, young;     int i=0;     scanf("%d",&n);     p = (M *)malloc(sizeof(M));     if (!p)         exit(0);      //getchar();     for(;i<n;i++)     {         //gets(p[i].name);         scanf("%s", p[i].name);         scanf("%d/%d/%d", &p[i].y, &p[i].m, &p[i].d);         //printf("%d/%d/%d\n", p[i].y, p[i].m, p[i].d);         //if(p[i].y >2014 || p[i].y==2014 && p[i].m>9 ||p[i].y==2014&&p[i].m==9&&p[i].d>6 ||p[i].y<1814 ||p[i]. y==1814&&p[i].m<9 || p[i].y==1814&&p[i].m==9&& p[i].d<6)         if (p[i].y > 2014)             continue;         if (p[i].y == 2014 && p[i].m > 9)             continue;         if (p[i].y == 2014 && p[i].m == 9 && p[i].d > 6)             continue;          if (p[i].y < 1814)             continue;         if (p[i].y == 1814 && p[i].m < 9)             continue;         if (p[i].y == 1814 && p[i].m == 9 && p[i].d < 6)             continue;         //printf("i = %d\n", i);         //printf("%d/%d/%d\n", p[i].y, p[i].m, p[i].d);         //if(p[i].y >=2014 || p[i].y==2014 && p[i].m>9 ||p[i].y==2014&&p[i].m==9&&p[i].d>6 ||p[i].y<1814 ||p[i]. y==1814&&p[i].m<9 || p[i].y==1814&&p[i].m==9&& p[i].d<6)         //   continue;         //else         //{         num++;         if(i==0)         {             old = p[i];             young = p[i];         }         else         {             //if((p[i].y > young.y) || (p[i].y==young.y && p[i].m>young.m)              //       || (p[i].y==young.y && p[i].m == young.m && p[i].d>young.d))             if((p[i].y > young.y) || (p[i].y==young.y && p[i].m > young.m)                     || (p[i].y==young.y && p[i].m == young.m && p[i].d > young.d))                 young = p[i];             //if( (p[i].y < old.y) || p[i].y==old.y&&p[i].m<old.m  ||  p[i].y==old.y&&p[i].m==old.m&&p[i].d<old.d)             if( (p[i].y < old.y) || (p[i].y==old.y&&p[i].m < old.m)                 ||  (p[i].y==old.y&&p[i].m==old.m&&p[i].d  < old.d))                 old = p[i];          }          //}      }     printf("%d %s %s\n", num,old.name,young.name);     return 0; }  供参考～ 感谢大佬的回复，看见你很多次了。你改的代码除了name 和*p我能理解外，其他的好像和我的一样呀。是否在gets前才用getchar[/quote]  代码除了要实现功能，还要考虑代码的可读性。一行代码太长，不感觉看着不舒服吗？  如果用gets，一方面不安全，当然scanf %s也不安全，另外，gets可能没等你输入任何东西就直接返回了，因为上次输入放在输入缓存里还有一个'\n'，gets遇到它就直接返回了，就是没有任何东西进入name里。

引用 4 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h>  typedef struct man {     //char name[1000];     char name[64];     int y;     int m;     int d; }M; int main() {     int n,y,m,d;     int num=0;     //M p[100000];     M *p;     M old, young;     int i=0;     scanf("%d",&n);     p = (M *)malloc(sizeof(M));     if (!p)         exit(0);      //getchar();     for(;i<n;i++)     {         //gets(p[i].name);         scanf("%s", p[i].name);         scanf("%d/%d/%d", &p[i].y, &p[i].m, &p[i].d);         //printf("%d/%d/%d\n", p[i].y, p[i].m, p[i].d);         //if(p[i].y >2014 || p[i].y==2014 && p[i].m>9 ||p[i].y==2014&&p[i].m==9&&p[i].d>6 ||p[i].y<1814 ||p[i]. y==1814&&p[i].m<9 || p[i].y==1814&&p[i].m==9&& p[i].d<6)         if (p[i].y > 2014)             continue;         if (p[i].y == 2014 && p[i].m > 9)             continue;         if (p[i].y == 2014 && p[i].m == 9 && p[i].d > 6)             continue;          if (p[i].y < 1814)             continue;         if (p[i].y == 1814 && p[i].m < 9)             continue;         if (p[i].y == 1814 && p[i].m == 9 && p[i].d < 6)             continue;         //printf("i = %d\n", i);         //printf("%d/%d/%d\n", p[i].y, p[i].m, p[i].d);         //if(p[i].y >=2014 || p[i].y==2014 && p[i].m>9 ||p[i].y==2014&&p[i].m==9&&p[i].d>6 ||p[i].y<1814 ||p[i]. y==1814&&p[i].m<9 || p[i].y==1814&&p[i].m==9&& p[i].d<6)         //   continue;         //else         //{         num++;         if(i==0)         {             old = p[i];             young = p[i];         }         else         {             //if((p[i].y > young.y) || (p[i].y==young.y && p[i].m>young.m)              //       || (p[i].y==young.y && p[i].m == young.m && p[i].d>young.d))             if((p[i].y > young.y) || (p[i].y==young.y && p[i].m > young.m)                     || (p[i].y==young.y && p[i].m == young.m && p[i].d > young.d))                 young = p[i];             //if( (p[i].y < old.y) || p[i].y==old.y&&p[i].m<old.m  ||  p[i].y==old.y&&p[i].m==old.m&&p[i].d<old.d)             if( (p[i].y < old.y) || (p[i].y==old.y&&p[i].m < old.m)                 ||  (p[i].y==old.y&&p[i].m==old.m&&p[i].d  < old.d))                 old = p[i];          }          //}      }     printf("%d %s %s\n", num,old.name,young.name);     return 0; }  供参考～ 感谢大佬的回复，看见你很多次了。你改的代码除了name 和*p我能理解外，其他的好像和我的一样呀。是否在gets前才用getchar

引用 2 楼 Martin Morning 的回复:[quote=引用 1 楼 user-2的回复:]gets用作读取一行字符，改用scanf，另外，结构体name空间不要太大，逻辑也有错误  scanf("%s %d/%d/%d", &p[i].name, &p[i].y, &p[i].m, &p[i].d);  确实是gets的原因。为什么数组过大也会产生段错误，我一直以为只有数组越界了才会出错[/quote]  因为定义的是局部数组，是在栈上申请空间，栈上的空间是很少的，所以申请很大可能会栈溢出呢，再说你的PC上还有很多程序也是在栈上运行，留给你的程序用的栈空间就更少。

引用 1 楼 user-2的回复:gets用作读取一行字符，改用scanf，另外，结构体name空间不要太大，逻辑也有错误  scanf("%s %d/%d/%d", &p[i].name, &p[i].y, &p[i].m, &p[i].d);  确实是gets的原因。为什么数组过大也会产生段错误，我一直以为只有数组越界了才会出错


Question: 编写程序输入10个整数，查找并打印不同的数字的个数

引用 1 楼 user-2 的回复： #include <stdio.h> #include <stdlib.h>  int main() {     int a[10],i,j,n=0;     for(i=0;i<10;i++)     {         scanf("%d",&a[i]);         for(j=0;j<i;j++)         {             if(a[i]==a[j])                 break;         }         if(j>=i)    n++;     }     printf("%d",n);     return 0; }  谢谢谢

引用 1 楼 user-2的回复: #include <stdio.h> #include <stdlib.h>  int main() {     int a[10],i,j,n=0;     for(i=0;i<10;i++)     {         scanf("%d",&a[i]);         for(j=0;j<i;j++)         {             if(a[i]==a[j])                 break;         }         if(j>=i)    n++;     }     printf("%d",n);     return 0; }   奥，看明白了，没问题。

引用 1 楼 user-2的回复: #include <stdio.h> #include <stdlib.h>  int main() {     int a[10],i,j,n=0;     for(i=0;i<10;i++)     {         scanf("%d",&a[i]);         for(j=0;j<i;j++)         {             if(a[i]==a[j])                 break;         }         if(j>=i)    n++;     }     printf("%d",n);     return 0; }   输入那里的循环是不是有问题？刚输入一个值就进里面的循环开始判断了。


Question: 【求助】①error C2059: syntax error : 'type'    ② error C2065: 'result' : undeclared

char str[]="3642/-5*+#",        //测试数据 这一句错了，要用分号


Question: 我编了一个从小到大输出10个整数的函数但是却

这里有个花括号，if下面的三条语句是一起的


Question: 小白求救

你可以逐个字符获取，然后乘以百乘以千这样计算进一个整型变量，相当于把一个字符的数字转换为了一个整数的数字，当检测到非数字的时候，进行符号的判断，然后进行计算

先找到表达式中“+”的位置，根据这个位置截取加数和被加数，之后用atoi()函数将加数和被加数变为整型，相加之后，再用itoa()函数把和变为字符串。

atoi

引用 1 楼 user-4的回复:用字符数组，然后循环每个字符进行加法运算 哥们，我还是不懂，你可以用代码实现一下吗

用字符数组，然后循环每个字符进行加法运算


Question: 创建窗口的样式里，有几个宏的值大小相同是怎么回事？

引用 3 楼 user-1 的回复:不是吧 child貌似是窗体才会有 普通控件没有 控件不就是作为子窗体的吗？

不是吧 child貌似是窗体才会有 普通控件没有

引用 1 楼 user-1 的回复:因为是用在不同地方的，只有窗体才会有最大化按钮，控件没有。tabstop也是针对控件的，窗体没有这个特性 是不是设置了WS_CHILD才会认为0x00 01 00 00是控件，而没设置WS_CHILD就会认为0x00 01 00 00是最大化按钮？


Question: 求char转int 方法类似atoi函数的功能

引用 2 楼 六道佩恩 的回复： #include "stdio.h" int main( void) { 	char str[100]="42DC0000"; 	int a=0; 	sscanf(str, "%x", &a);	//以str所谓输入的内容，按%x规则提取到&a  	printf("%x",a); 	return 0;  }  万分感谢大佬在百忙之中解答我的问题，因为刚加完班所以这么晚回贴，谢谢大佬我亲测可行，比心

引用 1 楼 user-2 的回复：sscanf %x万分感谢大佬在百忙之中解答我的问题，因为刚加完班所以这么晚回贴，谢谢大佬我亲测可行，比心

sscanf %x


Question: 线程等待函数pthread_join(pthread_t tid,void **rval_ptr)怎样体现出来rval_ptr是线程退出返回值的指针？

找到原因了：https://blog.csdn.net/yuhan61659/article/details/81296111


Question: C语言  if嵌套

修改：switch 换成if 更容易实现 另外 需要考虑满一百两百 不同的换购情况 得另加if

编程思想 if 里嵌套 switch 用于换购产品 再写一条 printf用于 换购后总金额  在写printf 换购内容 最后else 不参加换购 思想告诉你 怎么实现自己思考

能先百度学习下吗

你要是基础都不会，写给你你也不知道，很简单的，自己看看，写出代码有问题再拿出来

很基础的题目，这应该是课本上的课后题吧，没有多难。建议你自己先写写，遇到问题再提出来

就是if和switch，看书吧，看完条件判断语句，就OK了，要是打算完成个作业，就直接百度一个

看书去，基础的东西看都没看


Question: C语言问题

引用 10 楼 六道佩恩的回复: #include "stdio.h" int main( void) { 	char str[100]; 	gets(str);			//建议用fgets  	int i=0; 	for( i=0 ; str[i]!='\0' ; i++ ) 		if( str[i]>='a' && str[i]<='z' ) 			str[i]-=('a'-'A'); 	printf("%s",str); 	return 0;  }   谢谢大佬！！！

引用 7 楼 elk.✨ 的回复:[quote=引用 4 楼 早打大打打核战争的回复:]呃，C的话把int c提出来单独定义即可（或者启用C99支持），putchar(10)可以写成putchar(c)，还可以省一个字符~~~  老铁，严格按照题目要求[/quote]  它只是传一个输入数据给程序，然后读程序的输出，根本不知道程序内部的实现~~~

引用 5 楼 elk.✨ 的回复:[quote=引用 1 楼 自信男孩的回复:]把%s改成%c就可以了。a[i]是char类型，为什么要用%s输出呢 看题目要求啊大哥[/quote]  你的程序没有问题吗？用%s输出char类型的数据，肯定是有问题呢

引用 4 楼 早打大打打核战争的回复:呃，C的话把int c提出来单独定义即可（或者启用C99支持），putchar(10)可以写成putchar(c)，还可以省一个字符~~~  老铁，严格按照题目要求

引用 2 楼 零点、的回复:#define MAX_LEN (64)     char str[MAX_LEN];     memset(str, '\0', sizeof(str));     scanf("%s", str);     printf("strlen(str) = %d\n", strlen(str));      if (strlen(str) > (MAX_LEN - 1)) {         printf("input str too long!\n");         return -1;     }     for (int i = 0; str[i] != '\0'; i++) {         if (str[i] >= 'a' && str[i] <= 'z') {             str[i] = str[i] - 'a' + 'A';         }     }     printf("%s\n", str);     return 0; 老铁，严格按照题目要求

引用 1 楼 自信男孩的回复:把%s改成%c就可以了。a[i]是char类型，为什么要用%s输出呢 看题目要求啊大哥

#include <stdio.h>  int main() {   for (int c; (c = getchar()) != 10 ? 1 : (putchar(10), 0);)     (c < 97) || (c > 122) ? putchar(c) : putchar(c - 32);    return 0; }

把%s改成%c就可以了。a[i]是char类型，为什么要用%s输出呢


Question: 初混c/c++板块，为什么多数人直接伸手要代码？

新手嘛，正常，我也一样。

因为来这的人并不都是专业的，有的只业余的,并不想研究太深入。还有的人是想要示例代码，方便理解

防坑指南——远离那些1级号并且发过多贴但结帖率低的 辛辛苦苦不就是为了个分吗

那些人只是要交作业又不是学要编程 只有秃者才学编程，像俺们这种头发飘逸的当然只要代码  像那种一上来就把题目扔上来的我回复都懒得回复 有些人只是求一些用法的，我偶尔会写些Demo

有的人就是混的

说得很对！不仅如此，好多还是拿了代码就跑的，不回复也不结帖。


Question: gets(str[i])语句只能得到输入的第一个值

引用 1 楼 user-2的回复:char *idNum[MAX]; 只是个字符指针的数组,你需要用手动申请内存等方法让数组里每一个指针都指向合法的内存区域 才能够在后面用gets接收多个字符串 确实是这个问题，搞定了，非常感谢

char *idNum[MAX]; for(int i=0;i<n;i++) {     idNum[i] = malloc(MAX_LEN); }


Question: SetPixel等函数检测到未定义

引用 3 楼 ooolinux 的回复:控制台项目还是win32项目？ 控制台呀，，，看main不就看出来了吗

控制台项目还是win32项目？

我测试手动包含静态库发现可以实现了 gcc hdc.c -o hdc.exe -lgdi32 那么，现在的问题是，，，为啥它有库却没有去包含？包含哪些库由什么决定？

#include "windows.h"换成#include <windows.h>试一下

引用 8 楼 六道佩恩 的回复:[quote=引用 6 楼 早打大打打核战争 的回复:] 这就是C++的一个缺陷（从C带来的），头文件和库之间没有对应关系，后来的语言都对这个问题做了改进，诸如Delphi的uses、C#的using、Java的import等等 这个是跟语言有关还是编译器有关？会不会是在哪里记录了头文件与库的索引？[/quote]  严格来说是实现相关的，比如MASM中就有个includelib，指出需要链接某个库，如果在头文件中增加一个预处理指令，比如叫#includelib就解决了

引用 7 楼 六道佩恩 的回复:[quote=引用 5 楼 stherix 的回复:] msvc和gcc用的头文件/库并不是同一套,它们都有各自的实现 msvc估计是会自动去lib配置里去找需要的库,并且链接进来,或者它的头文件里就有#pragma comment(lib,"xxxx")引入 gcc除了最基本的库,其他的都需要你手动包含 在gcc上用了许多windows的函数，鼠标模拟、键盘模拟、控制台函数、窗口移动与创建、消息的接收与发送等等，这些算常用吗？目前都正常使用不用包含，但同样身为windows api的画图函数却需要包含，，感觉有点怪，不知道是不是有哪里记录了头文件的与实现库的索引？[/quote]  msvc的头文件支持指示嵌入lib文件的写法,只要你引用了这个头文件,他一般会帮你导入lib 但是这不是c/c++标准,所以gcc必须自己写在编译连接命令里

引用 6 楼 早打大打打核战争 的回复:这就是C++的一个缺陷（从C带来的），头文件和库之间没有对应关系，后来的语言都对这个问题做了改进，诸如Delphi的uses、C#的using、Java的import等等 这个是跟语言有关还是编译器有关？会不会是在哪里记录了头文件与库的索引？

引用 5 楼 stherix 的回复:msvc和gcc用的头文件/库并不是同一套,它们都有各自的实现 msvc估计是会自动去lib配置里去找需要的库,并且链接进来,或者它的头文件里就有#pragma comment(lib,"xxxx")引入 gcc除了最基本的库,其他的都需要你手动包含 在gcc上用了许多windows的函数，鼠标模拟、键盘模拟、控制台函数、窗口移动与创建、消息的接收与发送等等，这些算常用吗？目前都正常使用不用包含，但同样身为windows api的画图函数却需要包含，，感觉有点怪，不知道是不是有哪里记录了头文件的与实现库的索引？


Question: 请教大佬

堆栈本来就是先进后出、放进去再拿出来就实现你的功能了。 首先你要有一个堆栈。如果不要求自己实现堆栈、用std::Stack就可以了。百度自己搜一下

用reverse的话应该怎么写啊，一直写不对

引用 3 楼 weixin_44963498 的回复:我搜了的，但是没搜到。我是真的不会，太笨了  希望你学会stack类的用法。学会使用搜索引擎  #include <iostream> #include <stack>  using namespace std;  int main() { 	stack<int> tempStack; 	tempStack.push(2); 	tempStack.push(4); 	tempStack.push(6); 	tempStack.push(8); 	tempStack.push(10); 	 	while (!tempStack.empty()) 	{ 		cout << tempStack.top() << endl; 		tempStack.pop(); 	} 	system("pause"); 	return 0; }

用一个std::stack把数组中的数push进去，然后在pop出来就可以了

另写一个Stack. java  包含出栈 入栈 取栈顶 非空否的函数 然后在另一个Java文件里调用出栈函数pop不就好了  设置循环输出 print(stack.pop()+ " ");

我搜了的，但是没搜到。我是真的不会，太笨了😢

我搜了的，但是没搜到。我是真的不会，太笨了😥


Question: 窗体程序

１取数字 ２比较 ３．设置颜色


Question: 函数返回导致 指针变成野指针?

我也遇到了相同的问题， 当方法按值返回对象的时候，对象有指针的时候，调用拷贝函数的时候，系统生成的临时对象的 指针成员函数就会变成野指针。  你找到解决办法了吗？

很有可能你函数 传的是 指针的值,而不是地址. 导致 在某个函数里面free了 ,但返回到函数 指针还是指向原来的

就是在關鍵位置輸出關鍵内容，可以是標準輸出，也可以寫到文件裏。

SwapOne里面的RKey只是个建立在栈上的局部变量 当函数返回的时候,局部变量都被自动释放了,所指向的内存也就是非法 无法在函数体外使用

这个有很多种可能，比如多线程其他线程操作了这个变量，还有是t的内存在LBTreeDelete已经释放了，只是暂时数据没有被更改，所以没看到出问题

引用 3 楼 老马何以识途 的回复:首先，你這段代碼裏的數據結構和部分函數還不清楚細節如何，很難去判斷。看地址好像是t被移位了，那麽正如樓上所説的，有沒有別的綫程對&t做了操作？  第二點，swapOne的返回值必須馬上使用，比如直接memcpy到一個本地變量，不能到下一個語句操作，會有不可預期的結果。  第三點，調試程序比較準確的是寫日志，單步執行有時候不太準確。 请教下写日志是什么意思?

1）如楼上所述，如果不是每次都出现并且用到多线程，可能是其他线程对这个内存修改了 2）LBTreeDelete这个函数的问题，先把这个句注释掉，如果问题不出现那就能确定是这个函数逻辑不对


Question: mtk6261的模组平台上，如果做蓝牙驱动开发

做的怎么样了？能否分享成果，我这里也遇到了这个一样的问题。开发板需要增加蓝牙模块。


Question: Fn键的键盘码是多少？

这是键盘的控制器自动处理的，Fn键不产生扫描码，Fn+其他键会被键盘控制器解释为特定的扫描码发出，这和control、alt、win之类的键不一样

估摸着是由键盘的驱动程序或者嵌入式硬件程序直接处理掉了，根本不转发给系统消息队列

Fn是特色功能，不是所有电脑都有，既然不是一个标准，当然没有对应的key code


Question: 在线等，急！！！

引用 4 楼 飞龙KO 的回复:#include <stdio.h> #include <malloc.h> #define MAXSIZE 10 typedef struct {     int Q[MAXSIZE];     int front; //队头指示器     int rear;  //队尾指示器 } SeqQueue;  void InitQueue(SeqQueue *Q_Seq);//初始化操作，将Q初始化为一个空的循环队列 int EnterQueue(SeqQueue *Q_Seq, int x); //入队，将元素x入队 int DeleteQueue(SeqQueue *Q_Seq, int *x); //出队，删除队列的队头元素，用x返回其值 int main(void) {     SeqQueue S;     SeqQueue *s = &S;     int x, i;     int *a = &x;     InitQueue(s);     for(i = 1; i < MAXSIZE; i++)         EnterQueue(s, i*(rand()%10));     for(i = 1; i < MAXSIZE; i++)     {         DeleteQueue(s, a);         printf("%d ", x);     }     printf("\n");     return 0; }  void InitQueue(SeqQueue *Q_Seq)//初始化操作，将Q初始化为一个空的循环队列 {     Q_Seq->front = Q_Seq->rear = 0; }  int EnterQueue(SeqQueue *Q_Seq, int x) //入队，将元素x入队 {     if((Q_Seq->rear + 1) % MAXSIZE == Q_Seq->front) //尾指针加一追上头指针，队列已满         return 0;     Q_Seq->Q[Q_Seq->rear] = x;     Q_Seq->rear = (Q_Seq->rear + 1) % MAXSIZE;     return 1; }  int DeleteQueue(SeqQueue *Q_Seq, int *x) //出队，删除队列的队头元素，用x返回其值 {     if((Q_Seq->front == Q_Seq->rear)) //队列为空         return 0;     *x = Q_Seq->Q[Q_Seq->front];     Q_Seq->front = (Q_Seq->front + 1) % MAXSIZE; //重新设置队头指针     return 1;//操作成功 }  MAXSIZE 换成MAX

编写队列的接口～入队，出队等函数接口

引用 1 楼 飞龙KO的回复:没明白，题目. 但是题目就是这个，我也没明白

没明白，题目.


Question: c语言问题

引用 10 楼 拥抱Linux的回复:[quote=引用 9 楼 elk.✨ 的回复:] 好像运行出错了诶，哪里有问题吗  你可以把你运行的代码贴上来，或者截图、拍照，发个清晰的图片上来啊，光这样说，没人知道你到底运行的代码是什么样子的呀！  人家给的代码是这个问题的解决办法的主体，但是C程序的框架还是要你自己把它补充完整的呀，比如 头文件 、 main 函数名等等，不能直接运行上面给的代码，那 连 main 函数都没有，怎么运行啊？  你看看吧：  #include <stdio.h> int main(int argc, char const *argv[]) { 	int i_count = 0; 	int i = 5; 	while (1) { 		if ((0 == (i + 5) % 9) && (0 == (i - 5) % 7)) { 			printf("%d\n", i); 			i_count++; 			if (3 == i_count) { 				break; 			} 		} 		i++; 	} 	return 0; }  [/quote] 好！谢谢，我函数头里面少加了些

引用 12 楼 Q446512799的回复:这就有点尴尬了，还得把头文件，main函数都写全了才满足骚年的要求啊 不好意思。。我太菜了

这就有点尴尬了，还得把头文件，main函数都写全了才满足骚年的要求啊

好像是软件的问题？我在线编译都可以运行。。。

程序没有问题，运行结果是： 40 103 166

引用 9 楼 elk.✨ 的回复:好像运行出错了诶，哪里有问题吗  你可以把你运行的代码贴上来，或者截图、拍照，发个清晰的图片上来啊，光这样说，没人知道你到底运行的代码是什么样子的呀！  人家给的代码是这个问题的解决办法的主体，但是C程序的框架还是要你自己把它补充完整的呀，比如 头文件 、 main 函数名等等，不能直接运行上面给的代码，那 连 main 函数都没有，怎么运行啊？  你看看吧：  #include <stdio.h> int main(int argc, char const *argv[]) { 	int i_count = 0; 	int i = 5; 	while (1) { 		if ((0 == (i + 5) % 9) && (0 == (i - 5) % 7)) { 			printf("%d\n", i); 			i_count++; 			if (3 == i_count) { 				break; 			} 		} 		i++; 	} 	return 0; }

引用 1 楼 Q446512799的回复:int i_count = 0; int i = 5; while ( 1 ) {     if ( ( 0 == (i+5)%9 ) && ( 0 == (i-5)%7 ) )     {         printf("%d\n",i);         i_count++;         if (3 == i_count)         {              break;         }     }     i++; } 是不是这样 好像运行出错了诶，哪里有问题吗

引用 6 楼 拥抱Linux的回复:[quote=引用 5 楼 elk.✨ 的回复:] [quote=引用 1 楼 Q446512799的回复:]int i_count = 0; int i = 5; while ( 1 ) {     if ( ( 0 == (i+5)%9 ) && ( 0 == (i-5)%7 ) )     {         printf("%d\n",i);         i_count++;         if (3 == i_count)         {              break;         }     }     i++; } 是不是这样 我还没学i count呢 这个是啥意思，前几个吗[/quote]  一个变量名而已。喜欢的话，改成 like 也没啥不可以的。。。[/quote] 好哒谢谢诶

引用 5 楼 elk.✨ 的回复:[quote=引用 1 楼 Q446512799的回复:]int i_count = 0; int i = 5; while ( 1 ) {     if ( ( 0 == (i+5)%9 ) && ( 0 == (i-5)%7 ) )     {         printf("%d\n",i);         i_count++;         if (3 == i_count)         {              break;         }     }     i++; } 是不是这样 我还没学i count呢 这个是啥意思，前几个吗[/quote]  一个变量名而已。喜欢的话，改成 like 也没啥不可以的。。。

引用 1 楼 Q446512799的回复:int i_count = 0; int i = 5; while ( 1 ) {     if ( ( 0 == (i+5)%9 ) && ( 0 == (i-5)%7 ) )     {         printf("%d\n",i);         i_count++;         if (3 == i_count)         {              break;         }     }     i++; } 是不是这样 我还没学i count呢 这个是啥意思，前几个吗

二楼的解法手机不知道怎么回复，避免尴尬

差不多，就是这样的

我是小白，不过这个不需要数组吧，直接用循环，算出7的倍数，然后加上10如果成立吗，如果成立7的倍数加上5就是玩的到的值，


Question: 请问  return （void *）8 这条语句是什么意思？

指针本身就是一串二进制啊，意思就是返回一个void指针类型，它的值是8

返回  void * 类型 的指针，值 是 8 。

void指针， 可以转成 int*

假如机器存储器地址是16位的，是否返回的值是0x0008？

那到底返回的是数值8还是指针？

指针是表示地址的，本质就是一个无符号整形数

将数字8转化为(void *)指针，作为函数的返回值

// 如： void* test() { int i = 8; return (void*)i;  // 意思就是你要返回的值是 i  但是 函数声明的返回值是 void*  所以要强制转换类型后 才能正确返回 }


Question: VC 串口发送数据包含0X00,该如何处理？

好的，我试一试。

发送字节长度不应该是由ilen控制的吗，增加4个字节试试?

int ilen = strlen( (char *)cCheckData); 这里有问题 因为strlen是计算到\0为止的长度 所以实际要发送的字符数量,必须传进来,不能用strlen来计算

int writecom(char* data, int len);  unsigned char HexCheckSum(unsigned char* cCheckData) { 	int ilen = strlen( (char *)cCheckData); 	unsigned char iChecksum = 0; 	for (int i=0; i< ilen; i++) 	{ 		iChecksum += (unsigned char)cCheckData[i]; 	} 	return iChecksum; }  BYTE nCmdData[] = {0x33,0x01,0x12,0x00,0x00,0x00,0x01}; HexCheckSum(nCmdData) 其实在这一步，就只能算到0X12了。 也可以忽略HexCheckSum  writecom（nCmdData， ilen）到这里也是一样，到0X12就结束了，后面的无法发送。

应该写出你的代码 让别人排错和修改


Question: 求教C语言小程序

#include <stdio.h> int main() {     int age;     float W=0.0;     float H=0.0;     char str,choice;      do     {         printf("请输入年龄：");         scanf("%d",&age);         printf("请输入性别(男m/女f):");         //scanf("%s",&str);         getchar();    //for '\n'         scanf("%c",&str);         printf("请输入身高：");         scanf("%f",&H);         printf("请输入体重：");         scanf("%f",&W);         if(age<18||age>40)             break;         else         {             if(str=='f'){                 if(W<H-112.0)                     printf("您的体型偏瘦，注意增肥！！！");                 else if(W>H-108.0)                     printf("您的体型偏胖，注意减肥！！！");                 else                     printf("您的体型完美，注意保持！！！");             }             if(str=='m'){                 if(W<H-102.0)                     printf("您的体型偏瘦，注意增肥！！！");                 else if(W>H-98.0)                     printf("您的体型偏胖，注意减肥！！！");                 else                     printf("您的体型完美，注意保持！！！");             }             printf("\n");         }         printf("是否继续(y/n):");         //scanf("%s",&choice);         getchar();    //for '\n'         scanf("%c",&choice);         printf("\n");     }while(choice=='y'||choice=='Y');     return 0; } 供参考！   引用 1 楼 小先生吖 的回复:emmmmm，我看了一下你的代码，然后，到了那个判断体重的范围的时候，我就有点晕了。 所以，我自己写了一下，你可以看看，其中那个判断体重的话，用了一下简单粗暴的计算方法，其中对age也进行了判断，不过我的那个break的话，就是直接结束程序了，如果你想提示用户重新输入一个符合标准的数的话，可以用一下continue，或者不用这么麻烦的话，直接在输入年龄的提示那里加一个（age>=18&&age<=40） 对于身高和体重的话，用int定义不太好吧，身高可能不一定是整数呀，当然，如果没有特殊要求的话，还是可以用int，毕竟简单粗暴！然后这个小程序的话，也就是用do-while循环，可能你出错的就是在这里？？？？因为我看了一下你的那个循环的话，while定义在循环里面？？？或者你可以再改改。再就是输入字符的时候，你用的是%d，虽然不是很大的问题，并且整型和字符也是可以互相转换，但是对于强迫症的我，还是提醒一下！ 如果有写错的地方，还请谅解呀！ #include <stdio.h> int main(){ 	int age; 	float W=0.0; 	float H=0.0; 	char str,choice; 	do 	{ 	printf("请输入年龄："); 	scanf("%d",&age); 	printf("请输入性别(男m/女f):"); 	scanf("%s",&str); 	printf("请输入身高："); 	scanf("%f",&H); 	printf("请输入体重："); 	scanf("%f",&W); 	if(age<18||age>40) 		break; 	else 	{ 		if(str=='f'){ 		if(W<H-112.0) 			printf("您的体型偏瘦，注意增肥！！！"); 		else if(W>H-108.0) 			printf("您的体型偏胖，注意减肥！！！"); 		else 			printf("您的体型完美，注意保持！！！"); 		} 		if(str=='m'){ 		if(W<H-102.0) 			printf("您的体型偏瘦，注意增肥！！！"); 	    else if(W>H-98.0) 			printf("您的体型偏胖，注意减肥！！！"); 		else 			printf("您的体型完美，注意保持！！！"); 		} 		printf("\n"); 	} 	printf("是否继续(y/n):"); 	scanf("%s",&choice); 	printf("\n"); 	}while(choice=='y'||choice=='Y'); return 0; }  代码有问题，已经修复，供参考！

中间的的判断太辣眼睛了 H - W >= 98 && H - W <= 102 最后的scanf应该是%c

引用 2 楼 拥抱Linux 的回复:「体型偏肥」？ 哈哈，太打击人了！  不要一次测试两个人么

引用 8 楼 小先生吖 的回复:不好意思，输入字符我用scanf函数不行吗？我也知道字符串输入函数getchar（），而％c本来就可以用来字符的输入，你大可给我改一下%c，强硬的语气谁都不喜欢的呦 没有强硬哦，自己写的代码别人指出来，发现问题并改正这才是重点吧，而不是对方的态度。别人的态度不好，就不解决问题了吗？  另外，输入用scanf没问题，但是这里有一个陷阱（%c)，需要注意下，建议你测试一下去掉getchar();的结果。

引用 6 楼 小先生吖 的回复:[quote=引用 5 楼 自信男孩 的回复:] #include <stdio.h> int main() {     int age;     float W=0.0;     float H=0.0;     char str,choice;      do     {         printf("请输入年龄：");         scanf("%d",&age);         printf("请输入性别(男m/女f):");         //scanf("%s",&str);         getchar();    //for '\n'         scanf("%c",&str);         printf("请输入身高：");         scanf("%f",&H);         printf("请输入体重：");         scanf("%f",&W);         if(age<18||age>40)             break;         else         {             if(str=='f'){                 if(W<H-112.0)                     printf("您的体型偏瘦，注意增肥！！！");                 else if(W>H-108.0)                     printf("您的体型偏胖，注意减肥！！！");                 else                     printf("您的体型完美，注意保持！！！");             }             if(str=='m'){                 if(W<H-102.0)                     printf("您的体型偏瘦，注意增肥！！！");                 else if(W>H-98.0)                     printf("您的体型偏胖，注意减肥！！！");                 else                     printf("您的体型完美，注意保持！！！");             }             printf("\n");         }         printf("是否继续(y/n):");         //scanf("%s",&choice);         getchar();    //for '\n'         scanf("%c",&choice);         printf("\n");     }while(choice=='y'||choice=='Y');     return 0; } 供参考！   [quote=引用 1 楼 小先生吖 的回复:] emmmmm，我看了一下你的代码，然后，到了那个判断体重的范围的时候，我就有点晕了。 所以，我自己写了一下，你可以看看，其中那个判断体重的话，用了一下简单粗暴的计算方法，其中对age也进行了判断，不过我的那个break的话，就是直接结束程序了，如果你想提示用户重新输入一个符合标准的数的话，可以用一下continue，或者不用这么麻烦的话，直接在输入年龄的提示那里加一个（age>=18&&age<=40） 对于身高和体重的话，用int定义不太好吧，身高可能不一定是整数呀，当然，如果没有特殊要求的话，还是可以用int，毕竟简单粗暴！然后这个小程序的话，也就是用do-while循环，可能你出错的就是在这里？？？？因为我看了一下你的那个循环的话，while定义在循环里面？？？或者你可以再改改。再就是输入字符的时候，你用的是%d，虽然不是很大的问题，并且整型和字符也是可以互相转换，但是对于强迫症的我，还是提醒一下！ 如果有写错的地方，还请谅解呀！ #include <stdio.h> int main(){ 	int age; 	float W=0.0; 	float H=0.0; 	char str,choice; 	do 	{ 	printf("请输入年龄："); 	scanf("%d",&age); 	printf("请输入性别(男m/女f):"); 	scanf("%s",&str); 	printf("请输入身高："); 	scanf("%f",&H); 	printf("请输入体重："); 	scanf("%f",&W); 	if(age<18||age>40) 		break; 	else 	{ 		if(str=='f'){ 		if(W<H-112.0) 			printf("您的体型偏瘦，注意增肥！！！"); 		else if(W>H-108.0) 			printf("您的体型偏胖，注意减肥！！！"); 		else 			printf("您的体型完美，注意保持！！！"); 		} 		if(str=='m'){ 		if(W<H-102.0) 			printf("您的体型偏瘦，注意增肥！！！"); 	    else if(W>H-98.0) 			printf("您的体型偏胖，注意减肥！！！"); 		else 			printf("您的体型完美，注意保持！！！"); 		} 		printf("\n"); 	} 	printf("是否继续(y/n):"); 	scanf("%s",&choice); 	printf("\n"); 	}while(choice=='y'||choice=='Y'); return 0; }  代码有问题，已经修复，供参考！[/quote]  代码不能说是有问题，你对我进行的是代码精简一点的改动！吓得我以为我写错了！[/quote]   这样的代码scanf("%s",&str);还没问题吗？ 注意str定义的是char类型，而你用的是%s格式输入，只要输入一个字符就已经越界了，因为字符串还要有'\0'，也算一个字符。

引用 5 楼 自信男孩 的回复:#include <stdio.h> int main() {     int age;     float W=0.0;     float H=0.0;     char str,choice;      do     {         printf("请输入年龄：");         scanf("%d",&age);         printf("请输入性别(男m/女f):");         //scanf("%s",&str);         getchar();    //for '\n'         scanf("%c",&str);         printf("请输入身高：");         scanf("%f",&H);         printf("请输入体重：");         scanf("%f",&W);         if(age<18||age>40)             break;         else         {             if(str=='f'){                 if(W<H-112.0)                     printf("您的体型偏瘦，注意增肥！！！");                 else if(W>H-108.0)                     printf("您的体型偏胖，注意减肥！！！");                 else                     printf("您的体型完美，注意保持！！！");             }             if(str=='m'){                 if(W<H-102.0)                     printf("您的体型偏瘦，注意增肥！！！");                 else if(W>H-98.0)                     printf("您的体型偏胖，注意减肥！！！");                 else                     printf("您的体型完美，注意保持！！！");             }             printf("\n");         }         printf("是否继续(y/n):");         //scanf("%s",&choice);         getchar();    //for '\n'         scanf("%c",&choice);         printf("\n");     }while(choice=='y'||choice=='Y');     return 0; } 供参考！   [quote=引用 1 楼 小先生吖 的回复:] emmmmm，我看了一下你的代码，然后，到了那个判断体重的范围的时候，我就有点晕了。 所以，我自己写了一下，你可以看看，其中那个判断体重的话，用了一下简单粗暴的计算方法，其中对age也进行了判断，不过我的那个break的话，就是直接结束程序了，如果你想提示用户重新输入一个符合标准的数的话，可以用一下continue，或者不用这么麻烦的话，直接在输入年龄的提示那里加一个（age>=18&&age<=40） 对于身高和体重的话，用int定义不太好吧，身高可能不一定是整数呀，当然，如果没有特殊要求的话，还是可以用int，毕竟简单粗暴！然后这个小程序的话，也就是用do-while循环，可能你出错的就是在这里？？？？因为我看了一下你的那个循环的话，while定义在循环里面？？？或者你可以再改改。再就是输入字符的时候，你用的是%d，虽然不是很大的问题，并且整型和字符也是可以互相转换，但是对于强迫症的我，还是提醒一下！ 如果有写错的地方，还请谅解呀！ #include <stdio.h> int main(){ 	int age; 	float W=0.0; 	float H=0.0; 	char str,choice; 	do 	{ 	printf("请输入年龄："); 	scanf("%d",&age); 	printf("请输入性别(男m/女f):"); 	scanf("%s",&str); 	printf("请输入身高："); 	scanf("%f",&H); 	printf("请输入体重："); 	scanf("%f",&W); 	if(age<18||age>40) 		break; 	else 	{ 		if(str=='f'){ 		if(W<H-112.0) 			printf("您的体型偏瘦，注意增肥！！！"); 		else if(W>H-108.0) 			printf("您的体型偏胖，注意减肥！！！"); 		else 			printf("您的体型完美，注意保持！！！"); 		} 		if(str=='m'){ 		if(W<H-102.0) 			printf("您的体型偏瘦，注意增肥！！！"); 	    else if(W>H-98.0) 			printf("您的体型偏胖，注意减肥！！！"); 		else 			printf("您的体型完美，注意保持！！！"); 		} 		printf("\n"); 	} 	printf("是否继续(y/n):"); 	scanf("%s",&choice); 	printf("\n"); 	}while(choice=='y'||choice=='Y'); return 0; }  代码有问题，已经修复，供参考！[/quote] 代码不能说是有问题，你对我进行的是代码精简一点的改动！吓得我以为我写错了！

「体型偏肥」？ 哈哈，太打击人了！


Question: 一些常见的编程

你说的确实很对，下次注意，谢谢

引用 5 楼 Jackie豪的回复:关注一波吧大神大神23333 关注啦，我才刚开始学习

引用 6 楼 636f6c696e的回复:分享类建议放在博客 好的👌明白了，谢谢指导

（1）第5个的 while 那句语句 的位置不对。 你看， main 函数名后面没有 紧跟 花括号 就知道有问题了。应该是下面这样：  #include <stdio.h> int main() { 	int m, n, r; 	printf("请输入两个数："); 	scanf("%d%d", &m, &n); 	r = m % n; 	while (r != 0) { 		m = n; 		n = r; 		r = m % n; 	} 	printf("最大公约数为%d\n", n); 	return 0; }  （2）考虑到C程序符合标准文档的要求，以及可移植性的话，一般推荐把 main 函数的参数表写为以下两种形式之一：  int main(void)  或者  int main(int argc, char const *argv[])   欢迎及时结帖、给分！：）

第五个程序编译能通过吗？r还没定义就是用了。

分享类建议放在博客

关注一波吧大神大神23333

嘻嘻，是大佬吗，多多指教

路过，打个酱油


Question: 大神们，求解答

素数的定义：在大于1的自然数中，除了1和它本身以外，不再有其他因数的数。

不能说是你的算法错了，应该是某些地方没有理解到位哈！ 素数的定义是除去1和本身能整除它以外，其他的数不能。 举个例子，求17是不是素数，那么就是求在2~16中有没有数能够整除它，按照定义的话就有思路写出程序了 #include <stdio.h> int main() { int i,j; for(i=1;i<=100;i++) { for(j=2;j<i;j++) if(i%j==0)//这里就相当于是在算举的例子中的2~16中有没有能够整除17的，如果有的话，那就说明不是素数，因为不满足素数的定义 { break； } if(j==i) printf("%d\n",i);//输出一个数然后换行可以写在一起的，减少代码嘛！ } printf("\n"); return 0; } 这里只是算1~100以内的素数的话就可以用2~N-1的方法循环判断，如果过大的话就是sqrt开方后求

算法错了~~   #include <stdio.h> int main() { 	int i,j; 	for(i=1; i<=100; i++) { 		for(j=2; j<i; j++) 			if(i%j==0) break; 		if(i==j) printf("%d  ",i); 	} 	return 0; }

输出"%d   " 打几个空格 把数字隔开

for(i=1;i<=100;i++) { for(j=2;j<=i;j++) { if(i/j!=0) continue; } printf("%d",i); }


Question: C#实现驱动级发送按键

C#区在这里：https://bbs.csdn.net/forums/CSharp


Question: 编程萌新求助，C primer plus第二章编程练习题第5题

引用 1 楼 user-2_16_com 的回复: cdp@cdp:~/pratise$ gcc br.c  cdp@cdp:~/pratise$ ls a.out  br.c  dayscalc.c cdp@cdp:~/pratise$ ./a.out  Brazil,Russia,India,China. Brazil,Russia. India,China. cdp@cdp:~/pratise$    #include<stdio.h>  void br(); void ic();  int main(void) {    	printf("Brazil,Russia,India,China.\n"); 	br(); 	ic(); 	return 0; }  void br()  { 	printf("Brazil,Russia.\n"); }  void ic() { 	printf("India,China.\n"); }    UBUNTU16， gcc5.4， 编译运行正常。  同学，以后别再用vc6了。都2019年了，建议换个新一点的开发环境，vs2015也行啊。 已正解！同意。


Question: 单片机125k门禁卡ID程序

好的，我想问一下，RFID怎么判断有卡进入或者没卡，然后有卡就开启读卡程序，这样可以节省电。  思路有，程序弄不来

额，谢邀,看了半天不知道你要问个啥， 具体描述下行不？    另外格式化一下你的代码嘛


Question: break被调函数

for循环后多了分号,break需要在循环体中~~

引用 2 楼 自信男孩 的回复:for循环后多个;分号，break需要在循环体里，加了分号就属于在循环体外了。所以提示错误。

引用 楼主 spoil666的回复:被调函数中break非法 解决了谢谢


Question: 为什么输入负数后结果是错的

mint19  设计没啥问题，就是	if (0<=x&&x<10 && (x!=2&&x!=3))   这里应该是这样的吧，不然输入只要大于0，，都是x*x-5+6.。 0<=x<10    0<=x只要大于等于0，结果就是1，1<10肯定是存在的，并且还不等于2和3.输入11， 后面的x!=2 || x!=3,,,这里，等于不参与判断，，你等于2的时候为真，等于3也为真，   应该是&&  ，，不等于2也不等于3 。

单步调试　　　。

引用 3 楼 拥抱Linux 的回复:（1）main里定义的变量x 、y 是 long int 型， 而 fun 的参数表里，传入参数是 Int 型， 那么 向 fun 传入 实参的时候， long int 型的的数据被截断了。但是，按道理 main 里面的 x 本身是没有被改变的呀，而你的输出里， main 里面的 x 的值也变了，这就奇怪了。 （2）在 C语言里没有连续不等式，也就是说，没有「0 <= x < 10」这样的表达式。——嗯，其实也可以这样写，但是这样写的意思和 连续不等式的意思 不是同一个意思， 而是 把 前半部分的不等式表达式的结果（返回值） 与 后面的值进行比较，具体比如， x 的值是 11， 那么 前半部分的 「 0  <= x 」的结果是真， 也就是 1 ， 然后 再用 这个 1 去和后面的 10 比较 ，就是 「 1 < 10 」，那么总的结果还是真， 但是这就和 真正的连续不等式 「 0 <= 11 < 10 」 的结果是完全不同的了。 （3）你先把 变量类型 对应好，然后再测试运行吧。不等式 可以 后面 再 修正。  补充一下，刚刚试运行了你的代码，没有出现你那样的输出结果，俺也纠正一下上面说的「把 long int 截断成 int 」的情况——在数值处于 int 的范围的时候，是没关系的，当数值 大于 int 的范围的时候 才有差异。所以，现在对于你的输出就觉得更加奇怪了！？不会是把代码和可执行程序搞岔了吧？


Question: c语言(初学者)问题

按顺序执行的、先执行先获得的值就不一样、t-值不一样，直到这个括号里的执行完成、才会再来一次循环

第一个先给s加上t，再给t重新赋值，第二个是先给t重新赋值后s再加上的赋值后的t，两次t不一样。

如果会调试，去调试一下，这样容易学习理解

本来就不会一样啊，把前后顺序换了怎么还会一样呢？

t被重新赋值了，s的式子里有t

程序的运行是从上往下依次的，所以算法的顺序对整个程序的运行结果有着很大的影响，所以要注意这些问题

一个在结束循环时加的是上一个循环中的t，一个加的是本次循环中的t

你记住c语言执行顺序是由上到下的，你前后移动位置，值已经发生了改变

因为它在for循环里面和for循环外边是不一样的

不分外面里面，都在循环内，答案不一样是因为s=s+t放在后面，t的值变了

楼主你好，因为s和t计算的顺序不同，所以第二种情况下，t的值会对s的值有影响。楼主可以打断点，或者带入一些简单的例子过一遍程序就知道了。祝楼主更上一层楼

S  放前面   T等于你输入的那个d     当时s等于0   运行后  s等于d       S放后面时，是先给t赋值，t等于10×t＋d，然后赋值给s Ps s在前面时    s＝0+d s在后面时    s＝d*10＋d

引用 11 楼 weixin_44858350 的回复:[quote=引用 10 楼 636f6c696e的回复:]真心想学，手机的时间可以读读编程书籍。 [quote=引用 9 楼 weixin_44858350 的回复:] [quote=引用 4 楼 636f6c696e的回复:]没理解为啥这么多用手机编程的，手机这输入速度，能靠谱么？ 因为电脑不可能每时每刻都带在身边，有时候无聊就用手机编呗，手机大部分还是可以编的，只有小部分编不了[/quote][/quote] 初学嘛，看了一些基础步骤，再动手实践，我感觉这样比较容易记住[/quote] 拿纸笔写都比手机强。写完用脑子跑跑。

t值发生了变化，语句加在前面，s=s+t里的t是原始的t，即未经本次循环处理的t，而加在后面，则是经过本次循环处理的t，发生了变化，因此会出现不同的结果！

什么手机软件啊

引用 10 楼 636f6c696e的回复:真心想学，手机的时间可以读读编程书籍。 [quote=引用 9 楼 weixin_44858350 的回复:] [quote=引用 4 楼 636f6c696e的回复:]没理解为啥这么多用手机编程的，手机这输入速度，能靠谱么？ 因为电脑不可能每时每刻都带在身边，有时候无聊就用手机编呗，手机大部分还是可以编的，只有小部分编不了[/quote][/quote] 初学嘛，看了一些基础步骤，再动手实践，我感觉这样比较容易记住

真心想学，手机的时间可以读读编程书籍。 引用 9 楼 weixin_44858350 的回复:[quote=引用 4 楼 636f6c696e的回复:]没理解为啥这么多用手机编程的，手机这输入速度，能靠谱么？ 因为电脑不可能每时每刻都带在身边，有时候无聊就用手机编呗，手机大部分还是可以编的，只有小部分编不了[/quote]

引用 4 楼 636f6c696e的回复:没理解为啥这么多用手机编程的，手机这输入速度，能靠谱么？ 因为电脑不可能每时每刻都带在身边，有时候无聊就用手机编呗，手机大部分还是可以编的，只有小部分编不了

因为t是变量s=s+t，那么s的值自然会随着t的值变化而变化。在程序中执行加载代码段到内存里进行运算跟你的代码先后顺序有一定的联系。

t的值不一样，放前面t的值是经过运算的，放后面t的值是初始的两个不同的值赋给s肯定不一样了


Question: 萌新求助

我试试看，谢谢

不清楚，在Linux下用gcc和clang编译、运行的结果都是0。 按理说，fscanf没有读取到%d格式（int型）的值，返回值应该是0，只有发生输入/读取错误 或者 读取到文件末尾的时候返回值才是-1。 另外，建议你试着用比较纯粹的文本编辑器或者就用代码编辑器重新把文本文件的内容复制、粘贴过去保存文件，不要用windows自带的记事本。