Question: 9从哪里来？

好像又说错了。。。。。还是参考6楼的哥们吧，我再查查

希望楼主勘误，我那里说错了，哈哈当时也不知咋的脑子一热就直接顺手写了。你的p和s都是char*型，相减结果是char*。对于char*的指针相减，结果就是地址值相减，而对于其他诸如int*、double*的指针就要注意了，这里就不另展开了，你有疑问的再问吧。

引用 6 楼 拥抱Linux 的回复:指针相减的结果，不是 指针的定义语句中的类型，而是 指针本身的数据类型， 一般是 int 型 或者 long 型， 跟 机器平台 的 位数 有关。具体的数据类型 是 ptrdiff_t ，此数据类型 定义在C99标准中。 抱歉抱歉，我说顺口了，都忘了楼主的代码了

引用 5 楼 六道佩恩 的回复:*p++等效于*p, ++p。在while的判断中，为0就退出循环，所以当*p的值为0时就结束循环。 然后"a string"，这是个字符串，也是个字符数组，它是每个数组元素都是由字符组成，字符嘛，就是个char型的整数，而这个字符串以0号字符结尾，也就是说，这个字符实际上是"a string\0"，一共9个字符，只是最后一个\0你看不到而已。 再看*p++，每循环一次，p就在自增，说白了，p所指的位置在逐渐后移，最开始它是指向a的，下一次指向空格，再下一次指向s，当最后指向0的时候，*p就是\0了，while发现判断为0后就退出循环，但此时别忘了，p在*p后还要自增1，也就是说，p指向了\0的后一个位置。 然后呢，s指向的a，相当于指向[0]，p指向的是\0的下一个位置，相当于指向[9]的位置，所以p-s就是两个位置相减，就得9。 然后，p和s都是int*型，相减的结果也是int*型，我们想要的是int型的整数结果，所以就把它强制转换为了int。  指针相减的结果，不是 指针的定义语句中的类型，而是 指针本身的数据类型， 一般是 int 型 或者 long 型， 跟 机器平台 的 位数 有关。具体的数据类型 是 ptrdiff_t ，此数据类型 定义在C99标准中。

详细解释，如下图：  顺便建议自己试试改改代码，把 char 改成 int 或者其它数据类型，把相关的代码也调整号，然后看看单个数据占据不同内存空间的结果是什么样子的。 欢迎及时结帖、给分。：）

8个有效字符，那么9就是'\0'

while这部分*p++，先调用先运算后++，对+之前的指针*取内容，也就是说*p，依次是'a',' ','s'....,'\0',0(null). 当*p++==0时，还执行了一次++，而p-s，是p相对于s的位置，有点像下标

这个其实就是计算字符串的长度 while(*p++);就是循环直到p指向的字符为0，最后p++ p-s就是计算p和s之间的距离 由于都是字符指针，相减后就是字符串长度（包括\0）


Question: 初学者求救！！

引用 6 楼 qq_16035059 的回复:[quote=引用 3 楼 拥抱Linux的回复:]无他，唯手熟尔。 练习，大量的练习；错误，大量的错误；纠误，大量的纠错。 另外，要认识到，有BUG是正常的，没有BUG才不正常。 老师讲太快了，半个学期讲完了c，我现在开始c++了，更难[/quote]  网上有很多轻量级的、优秀的C语言相关教学视频，相比于书本上的文字而言，视频更加直观，可以挑其中的与指针直接相关的内容看看，借此了解指针的本质——指针也不过是一种数据类型而已，了解数组的本质——同类型数据的并排而已，再敲代码练习练习、调试调试，一般的情况就差不多能对付了。稍微深入一点，还可以顺便了解数据在内存中的存储形式，也就七七八八了。 不用着急一下子把所有的东西都搞得很透彻，那样的要求也太高了！

可以自己参照网上的例子写一些代码，解决了很多的BUG，你的能力就增强喽

引用 3 楼 拥抱Linux的回复:无他，唯手熟尔。 练习，大量的练习；错误，大量的错误；纠误，大量的纠错。 另外，要认识到，有BUG是正常的，没有BUG才不正常。 老师讲太快了，半个学期讲完了c，我现在开始c++了，更难

引用 2 楼 赵4老师的回复:http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 炒鸡感谢啊啊啊啊啊！

引用 1 楼 自信男孩的回复:看别人写的代码，根据定义理解程序 背太多了容易忘还弄混了！

看别人写的代码，根据定义理解程序


Question: 为什么我在创造一个二叉排序树的时候，无法调用insert函数，导致t根函数和二叉树无法创建成功？

由于你insert函数中要修改t的值，你做的只是修改形参的值，并不能影响实参，出了这个函数就什么都没了，t还是原来的NULL，所以如果你要修改t(bstnode* t)的值,形参要用(bstnode** t)，用它的地址进行修改 可以看一下我刚写的一篇关于指针的文章https://blog.csdn.net/qq_40946921/article/details/90047918  #include<iostream> using namespace std; typedef char datatype; typedef int keytype; typedef struct node { 	keytype key; 	datatype other; 	struct node* lchild, * rchild; }bstnode; bstnode* t;  void insert(bstnode** t, bstnode* s)  //t为二叉排序树的根指针，s为插入的结点指针 { 	if (*t == NULL) *t = s;   //原树为空，返回s作为根指针 	else 	{ 		if (s->key < (*t)->key) insert(&(*t)->lchild, s);    //在左子树中查找插入位置 		else insert(&(*t)->rchild, s);  //在右子树中查找插入位置 	} }     //INSERTBST1   bstnode* CREATBST()  //生成二叉排序树 { 	bstnode* t, * s; 	keytype key, endflag = 0;   //endflag为结点结束标志 	int data; 	t = NULL;   //设置二叉排序树的初态为空树 	printf("\n请输入学生的学号：\n"); 	scanf("%d", &key);     //读入一个结点的关键字 	while (key != endflag)   //当输入非结束标志时，执行以下操作 	{ 		s = (bstnode*)malloc(sizeof(bstnode));   //申请新结点 		s->lchild = s->rchild = NULL;  //将新结点的指针域置空 		s->key = key; 		printf("\n请输入该学生的成绩：\n"); 		scanf("%d", &data);   //读入结点的其他数据项 		s->other = data; 		insert(&t, s);    //将新结点插入树t中，通过调用insert 		printf("\n请输入学生的学号：\n"); 		scanf("%d", &key);  //读入下一个结点的关键字 	}  	return t; }   //CREATEBST int main() { 	bstnode* k=CREATBST(); 	return 0; }


Question: 怎么回事？

写到文件里面，再对比，如何？

把printf放到花括号外面

你可以在循环里sleep了慢慢跑了看，太快了前面的数据刷没了啊

打印太快刷掉了

也可以把printf放到循环外，这样只输出一句了。

程序没问题，把999改成9试试

输出结果的行数太多了，屏幕上显示的是最后的若干行的结果而已。  要查看所有的输出结果的话，就用鼠标向上拖动控制台窗口右边的滚动条，就可以看到前面的了。  或者，把 循环 的次数减少， 比如 把 (i < 999) 改成 (i < 9) 就可以看到值很小的时候的输出结果了。  建议，及时结帖、给分啊！：）  ```

程序没有问题，只是因为你每个得到的sum占一行，dos界面就显示不出之前的结果了，你可以试着改为printf("%d  ",sum);就可以看到所有的结果！

你的245350 是 第701次求和

因为你打印了999次， 第一次的结果早就看不见了。 你试试把鼠标网上拖，能看见前面的。 或者你打印语句 变成 printf("【第%d次求和】= %d\n", i, sum);


Question: C语言的循环语句

usleep

引用 2 楼 weixin_43956598 的回复:程序框架没有问题，但sleep函数有点点问题。 不知道你是用的什么编译器，有的编译器sleep中的s是大写，有的是小写。一般情况下我们写成Sleep(1); 还有就是不要忘记头文件#include<windows.h> Linux下就是sleep

引用 3 楼 自信男孩 的回复：[quote=引用 2 楼 weixin_43956598 的回复:] 程序框架没有问题，但sleep函数有点点问题。 不知道你是用的什么编译器，有的编译器sleep中的s是大写，有的是小写。一般情况下我们写成Sleep(1); 还有就是不要忘记头文件#include<windows.h> Linux下就是sleep[/quote]是，回答中说了看编译器，有大写有小写，根据编译需要和环境

while (1) {     if (xx)         sleep(1); } 这样吗？


Question: 定长顺序串操作

#include<stdio.h> #include<stdlib.h> #include<string.h>  #define MAXSTRLEN 255 #define  ERROR 0 #define  OK 1  typedef int Status; typedef char SString[MAXSTRLEN+1];  //1.构建顺序串 Status StrAssign(SString T, char *chars) {     int i;     if(strlen(chars) > MAXSTRLEN)         return ERROR;     //else     //{     T[0]=strlen(chars);     for(i=1;i<=T[0];i++)         T[i]=chars[i-1];     return OK;     //} }  //2.复制串 Status StrCopy(SString T,SString S) {     int i;     //for(i=0;i<=S[0];i++)     //这个地方i是要从0开始吗？     for(i=1;i<=S[0];i++)     //这个地方i是要从0开始吗？         T[i]=S[i];     T[0] = S[0];    //赋值串的长度     return OK; } //3.是否空串 Status StrEmpty(SString S) {     if(S[0]==0)         return 1;     else         return 0; } //4.比较顺序串 int  StrCompare(SString S,SString T) {     int i;     for(i=1;i<=S[0] &&  i<=T[0];i++)     {         if(S[i] != T[i])             return S[i]-T[i];     }     return S[0]-T[0]; } //5.求串的长度 int StrLength(SString S) {     return S[0]; } //6.清空串 Status ClearString(SString S) {     S[0]=0;     return OK; } //7.联接串 Status Concat(SString T,SString S1,SString S2) {     int i;     if(S1[0]+S2[0]<=MAXSTRLEN)     {         for(i=1;i<=S1[0];i++)         {             T[i]=S1[i];         }         for(i=1;i<=S2[0];i++)         {             T[i+S1[0]]=S2[i];         }         T[0]=S1[0]+S2[0];         return OK;     }     else     {         for(i=1;i<=S1[0];i++)         {             T[i]=S1[i];         }         for(i=1;i<=MAXSTRLEN-S1[0];i++)         {             T[i+S1[0]]=S2[i];         }         //T[0]=StrLength(T);         T[0]= MAXSTRLEN;         return ERROR;     }  } //8.取子串 Status SubString(SString sub,SString S,int pos,int len) {     int i;     if(pos<1 || pos>S[0] ||len<0 ||len>S[0]-pos+1)         return ERROR;     for(i=1;i<=len;i++)         sub[i]=S[pos+i-1];     sub[0]=len;     return OK;  } //9.删除字串 Status StrDelete(SString S,int pos,int len) {     int i;     if(pos<1 || pos>S[0]-len+1 ||len<0 )///* 初始条件: 串S存在,1≤pos≤StrLength(S)-len+1         return ERROR;     for(i=pos+len;i<=S[0];i++)         S[i-len]=S[i];     S[0]=S[0]-len;     return OK;  } //10.打印顺序串 void StrPrint(SString T) {     int i;     for(i=1;i<=T[0];i++)         printf("%c",T[i]);     printf("\n"); }  供参考！  没有测试程序呢，  修改了StrCopy，StrAssign，Concat等函数，建议对比看一下


Question: 有两个字符串s，t判断t是否是s的子串，如果是输出子串的位置，如果不是输出0，再删除子串并且输出删除后的串。

我刚才试了一下，可以，谢谢了大神

我刚才试了一下，可以，谢谢了大神

我刚才试了一下，可以，谢谢了大神

引用 3 楼 weixin_44990738 的回复:运行了没有啊，大神，回复我 啥意思？你自己没试试吗？

运行了没有啊，大神，回复我

#include <stdio.h> #include <string.h>  int find_pos_str(const char *str, const char *substr); char *del_substr(char *str, int pos, int sub_len);  int main(void) {     char str[64], substr[32];     int pos;      scanf("%s", str);     scanf("%s", substr);      pos = find_pos_str(str, substr);     printf("%d\n", pos);     if (pos >= 0)         printf("%s\n", del_substr(str, pos, strlen(substr)));      return 0; }   int find_pos_str(const char *str, const char *substr) {     const char *tmp_str = str;     int len = strlen(substr), pos = 0;      while (*tmp_str) {         if (strncmp(tmp_str, substr, len) == 0)             break;         pos++;         tmp_str++;     }      if (!*tmp_str)         return -1;      return pos; }  //pos： the position of substr char *del_substr(char *str, int pos, int sub_len) {     int len = strlen(str);      if (pos + sub_len >= len ) {         *(str + pos) = 0;         return str;     }      strcpy(str + pos, str + pos + sub_len);      return str; }  供参考～

求解答啊，急，急，急，大神们


Question: 用自定义函数求n个正整数的最大值

谢谢您！！！我懂了！

1、如果没有学过动态分配，可以采用另一种方法，直接定义一个比题目中正数个数范围大的数组，假如个数不超过100，可以直接定义为a[110]，只要维度比100大就可以。 2、其次你的swot函数有逻辑问题，你是直接把相邻的两个数来进行比较从而得到max，这个是不对的，例如：3  5  2  4四个数，你得到的最大值是4。注意这里应该是数组中的每个元素依次和最新的max进行比较大小，然后再更新max的值。有什么其他问题可以多问！ 直接上代码：  #include<stdio.h> int swot(int c,int a[]){ 	for(int i=0;i<c;i++) 	scanf("%d",&a[i]); 	int max=0;//最好初始化 	for(int i=0;i<c;i++){ 		if(max<a[i]) 		max=a[i]; 	} 	printf("%d",max);  }  main(void){ 	int c,a[1000];//只需要保证a的维度比c大即可，这样既不需要动态申请空间 	scanf("%d",&c); 	swot(c,a);  }

引用 2 楼 mozhju的回复:动态申请内存 void main() { 	int c; 	int *b; 	scanf("%d", c); 	b = (int *)malloc(c * sizeof(int)); 	swot(c, b); 	free(b) } 请问还有别的办法吗？这个我还没学过。有点超纲了

引用 2 楼 mozhju 的回复:动态申请内存 void main() { 	int c; 	int *b; 	scanf("%d", c); 	b = (int *)malloc(c * sizeof(int)); 	swot(c, b); 	free(b) }  scanf("%d", &c);注意加上&

b[c]是数组的第c+1个元素，b才是数组名（首地址）


Question: Linux下不能在线程创建后设置优先级

打印返回值和errno看看 引用 2 楼 qq_38543601 的回复:[quote=引用 1 楼 赵4老师 的回复:] 优先级是相对而不是绝对的。 主线程pthread_setschedparam后，我在创建出的线程里用 pthread_getschedparam 打印线程状态和优先级，发现还是SCHED_OTHER，优先级为0，说明没有设置成功啊，为什么呢[/quote]

引用 1 楼 赵4老师 的回复:优先级是相对而不是绝对的。 主线程pthread_setschedparam后，我在创建出的线程里用 pthread_getschedparam 打印线程状态和优先级，发现还是SCHED_OTHER，优先级为0，说明没有设置成功啊，为什么呢

优先级是相对而不是绝对的。


Question: 求大佬帮解决这个c语言问题，为什么这个程序一运行到scanf就会崩溃

如果在VS中   csanf换成  casnf_s

name的类型改成char数组就好了

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

printf("%s %d %d\n",array[i].name,array[i].Arrive_Time,array[i].Serve_Time); name是char类型，这里用%s，那么很可能会出现程序崩溃，出现段错误（因为可能越界）。

&array[i].name，这个用%s，但是你的name是char类型哦。是不是应该用%c，或者把name定义成数组，然后再去掉&呢

单步调试是个很重要的技能！ 我测试了下，错误不是在scanf("%s %d %d",&array[i].name,&array[i].Arrive_Time,&array[i].Serve_Time); 而是在它下一行的：printf("%s %d %d\n",array[i].name,array[i].Arrive_Time,array[i].Serve_Time); 具体的原因是：PCB.name 是个 char 类型，你输出时用了%s，应该是%c。 但是我的理解，应该是你的name类型用错了，你的本意应该是想用字符串。那可以定义为 char name[20];  // 长度根据你的需要调整 这样name就是一个字符串，而不是单个字符。如果name用字符串数组的话，就可以用%s输出。


Question: rgb数值是怎么从最原始数据处理的？

与 R/G/B 三色 的定义（取值范围）有关，你必须搞懂 它们 组合。网上应该有不少相关资料。


Question: .\Obj\Template.axf: Error: L6218E: Undefined symbol SysTick_CLKSourceConfig (ref

引用 1 楼 user-2 的回复:出现这个错误的原因是未定义SysTick_CLKSourceConfig ，因为SysTick是嵌在内核里的，定义在misc.c/h文件里，所以别忘记添加这个文件。 万分感谢！！！！！

先在目录里添加misc.c这个文件


Question: 小白求教c语言干簧管问题

引用 1 楼 user-1 的回复：先搞清楚你的输入是什么，输出又是什么谢谢，问题已解决

先搞清楚你的输入是什么，输出又是什么


Question: open62541 OPC UA客户端如何遍历服务端所有结点

然后呢？

大佬会这个嘛 	学生基本信息管理系统应包括4个部分： 1、	学生基本信息的增加 2、	学生基本信息的修改 3、	学生基本信息的删除 4、	学生基本信息的查询 提示：4个部分分别设计4个函数来实现 要求：学生基本信息字段包括： 学号、姓名、性别、电话号码、出生日期、籍贯、所读专业


Question: swith语句中 case后面的表达式如果一致的话，可以叠在一起写吗？

引用 6 楼 whizer 的回复:[quote=引用 4 楼 lin5161678 的回复:] [quote=引用 3 楼 whizer 的回复:] 数字少的话：  case 1: case 2:     printf("A");     break;   数字多且连续的话：例如（1到9）  case 1 ... 9:     printf("A");     break; C/C++不行[/quote]运行一下，下面的看看行不行？  #include <stdio.h>  int main (void) {        int i;     for (i = 1; i < 10; i++) {         switch (i) {             case 1 ... 9:                 printf ("case test %d\n", i);                 break;             default:                 printf ("defalt\n");         }        }        return 0; } [/quote]不用试就知道不行了 这不是很简单吗 又是一个拿编译器扩展当普世语法用的人?

引用 4 楼 lin5161678 的回复:[quote=引用 3 楼 whizer 的回复:] 数字少的话：  case 1: case 2:     printf("A");     break;   数字多且连续的话：例如（1到9）  case 1 ... 9:     printf("A");     break; C/C++不行[/quote]运行一下，下面的看看行不行？  #include <stdio.h>  int main (void) {        int i;     for (i = 1; i < 10; i++) {         switch (i) {             case 1 ... 9:                 printf ("case test %d\n", i);                 break;             default:                 printf ("defalt\n");         }        }        return 0; }

可以叠在一起。而且case后面的常量标识符的先后顺序也不影响执行结果。  case 1: case 2:         printf("A");         break;  和  case 2: case 1:         printf("A");         break;  是一样的。  另外，你发的最上面的帖子了，没有把 case 关键字 和 后面的 常量标识符 分开 ，这样是不对的。 请注意一定要把 case 和后面的 常量标识符用空格分开，用tab也行，总之是要分开。  欢迎及时结帖、给分。：）

引用 3 楼 whizer 的回复:数字少的话：  case 1: case 2:     printf("A");     break;   数字多且连续的话：例如（1到9）  case 1 ... 9:     printf("A");     break; C/C++不行

可以，第一个case后不加break就行。 满足case条件后，程序一直执行到break为止。

case 1: case 2:         printf("A")        break;


Question: 这道题用指针怎么做啊？求指导

一个使用字符来处理的小代码，供参考。  #include <stdio.h>  #define LEN 100  int main(int argc, char const *argv[]) { 	// 因为题目要求用指针，所以下面的代码使用了一个数组a； 	// 如果不要求用指针的话，连数组也可以省略，只要一个char变量即可， 	// 在输入过程中输出结果数字。  	// 只处理了0和正整数，没有处理负整数。或者说，忽略了负号。  	char a[LEN], *b; 	b = a; 	int i = 0; 	int count = 0; // 有效数字的位数 	while ((*(b + i) = getchar()) != '\n' && i < LEN) { 		if (*(b + i) >= '0' && *(b + i) <= '9') { 			if (count == 0 && *(b + i) == '0') { 			} else { 				putchar(*(b + i)); 				count++; 			} 		} 		i++; 	} 	if (count == 0) { 		putchar('0'); 	} 	putchar('\n');  	return 0; }   欢迎讨论、以及及时结帖、给分。：）

引用 1 楼 自信男孩 的回复:#include <stdio.h> #include <ctype.h>  int rt_number(const char *str);  int main(void) {      char str[128];      scanf("%s", str);      printf("%d\n", rt_number(str));      return 0; }  int rt_number(const char *str) {     int num = 0;      while (*str) {         if (isdigit(*str))             num = num * 10 + *str - '0';         str++;     }      return num; }  供参考！  一个小小的建议：即使考虑输入数据在字符数组的长度范围内，但如果 数值结果超出 int 取值范围的话，结果也会因为被截断而失准。


Question: 设计一个算法RepChar(s,x,y)，将顺序串s中所有字符x替换成字符y。要求空间复杂度为O(1)。

这个不是很难吧，遍历并替换嘛

void RepChar(char s[], char x, char y) {   for (; *s; s++) *s == x ? *s = y : 0; }


Question: 用C语言写顺序表不是链表

建议贴出代码～


Question: 各位大佬，请教下

《C++中二维数组与指针》 希望能够帮到你！

先自己写写，遇到问题把代码贴出来，一起帮你解决，想要现成的不好吧


Question: 想调试一下，但是dev没反应

你需要将你输入得整数转换成你需要得精度范围，并且将输出得值也要进行转换得。比如你输入N，你需要将N*1.0来将其转换成浮点数，然后再去计算，这样才不会去掉精度，打印也是需要改得

卡了吧，而且double是使用%lf

用%lf输出一下试试，因为double是浮点数，浮点数和整型数在内存里的存放方式是不一样的。 所以，double类型的数据还需要用%lf输出

Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt


Question: 求大神详解

引用 2 楼 tongshou的回复:你这个主要是算法问题。不容易，到网上查查看，看是否有类似例子。 我在网上找到了这个：DP一定会超时，需要贪心。贪心的策略就是先选一个最小值，然后把这个最小值缩点。怎么缩呢？举个例子，-4 -5 -4；三个数，先取-5，然后把这个点变成-4+（-4）-（-5），然后把这个点-3放进去，再一次如果取到了-3，就相当于取了-8，即-4+（-4），相当于就是取了两边没取中间。这个咋理解呀

引用 8 楼 user-4的回复:说白点，DP就是把递归的参数存起来，不用堆栈 这个代码想好久  #include<iostream> #include<vector> #include<map> using namespace std; vector<int> vc{ 1,2,4,8,5,6,7 }; int n = 3; int find(int count, int index) { 	if (count == n) 		return 0; 	int min = 0; 	for (int j = index + 2; j < vc.size() - (n - count - 1) * 2; j++) { 		int t= vc[j] + find( count + 1,j); 		if (min == 0 || t < min) 			min = t; 	} 	return min; } int main() { 	cout <<"暴力:"<< find(0, -2) << endl; 	map<int, map<int, int>> dp;		//出现了负坐标，用map直观一点，但效率不高，你可以自己进行一个坐标转换 	for (int i = 1; i <= n; i++) { 		for (int j = -2; j<0||j < vc.size(); j++) { 			for (int k = j + 2; k < vc.size() - (i-1) * 2; k++) { 				int m = vc[k] + dp[i-1][k]; 				if ((dp[i][j] == 0 || dp[i][j] > m)) 					dp[i][j] = m; 			} 		} 	} 	cout <<"DP:"<< dp[n][-2] << endl; 	return 0; }   我在网上找到了这个：DP一定会超时，需要贪心。贪心的策略就是先选一个最小值，然后把这个最小值缩点。怎么缩呢？举个例子，-4 -5 -4；三个数，先取-5，然后把这个点变成-4+（-4）-（-5），然后把这个点-3放进去，再一次如果取到了-3，就相当于取了-8，即-4+（-4），相当于就是取了两边没取中间。这个咋理解呀

你这个主要是算法问题。不容易，到网上查查看，看是否有类似例子。

引用 3 楼 user-4的回复:暴力的话用深搜回溯就可以了 要性能的话动态规划dp算法 如果还没想到办法，我中午可以把代码给你 这道题有时间限制，可以给我讲讲那个dp算法的思想吗，感谢！

引用 4 楼 636f6c696e 的回复:没那么难吧，排序后分组，把相邻的数字放在一个组里 一个一个组取数字就行，暂时没想到有啥算法问题 排序之后是不是可能已经影响了之前的数据之间的位置关系？！

是分数太少了吗


Question: Dev-C++5.11版本的，在里面建一个项目，然后添加一个新的源文件，怎么重命名?

Dev不推荐使用。这东西基本没人用。 windows下首选vs2010以上版本。 其次codeblocks


Question: 急求大佬win10中C语言怎么读取控制台鼠标点击

找到问题了，这个函数不能和system指令混用

换旧版控制台模式再试试？

并没有开快速编辑模式


Question: 请问哪里错了？

在scanf后面加一条语句getchar()试试。

Message里name的数据类型定义错误。你用的是char，但是从你的输入里“bjk”来看，是字符串。建议用数组。比如，char name[20]。如果用数组的话，输入就要用%s了，不能用%c


Question: 求助关于类似旅行商问题

请输入顶总数3请输入坐标1 1 5 6  2 3 1061109567.00000 5.000000 2.000000 5. 000000 1061109567. 00000  3.000000 2.000000 3. 000000 1061 109567. 000000 访问顺序为:  021 总距离为: 5. 00000 代码输出，忘贴图了


Question: 链表的深度排序是怎么把他的i-1和i+1怎么想的，想不出来

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

加打印自己调试下就好理解了

引用 3 楼 user-3的回复:什么是深度排序。。。。。 插入排序。。。。。。。

什么是深度排序。。。。。


Question: 这段代码错在哪

所以你的问题到底是什么？有报错？还是结果不对？  如果没问题了，请结贴给分。

引用 3 楼 user-2的回复:代码都贴不全无力吐槽了 那是一个申请空间和赋值的函数。 void charu_list(pnext**head,pnext**till) { 	pnext*p = *head; 	pnext*s = NULL; 	 	pnext*new_list = pode(); 	 	if(!*head) 	{ 		*head = new_list; 		*till = new_list; 		printf("q"); 	} 	else if(new_list->data.id<(*head)->data.id) 	{ 		new_list->next = *head; 		*head = new_list; 		printf("w"); 	} 	else 	{ 		while(p) 		{ 			if(p->data.id<new_list->data.id) 			{ 				s->next = new_list; 				new_list->next = p; 				printf("e"); 				break; 			} 			s = p; 			p = p->next; 		} 		if(p==*till) 		{ 			(*till)->next = new_list; 			*till = new_list; 			printf("r"); 		} 	} }

引用 2 楼 jiamianshiye_16_com的回复: pnext*new_cet = (pnext*)malloc(sizeof(pnext)); new_cet = next();  先分配空间，然后再赋值？？ 分配空间干嘛? void charu_list(pnext**head,pnext**till) { 	pnext*p = *head; 	pnext*s = NULL; 	 	pnext*new_list = pode(); 	 	if(!*head) 	{ 		*head = new_list; 		*till = new_list; 		printf("q"); 	} 	else if(new_list->data.id<(*head)->data.id) 	{ 		new_list->next = *head; 		*head = new_list; 		printf("w"); 	} 	else 	{ 		while(p) 		{ 			if(p->data.id<new_list->data.id) 			{ 				s->next = new_list; 				new_list->next = p; 				printf("e"); 				break; 			} 			s = p; 			p = p->next; 		} 		if(p==*till) 		{ 			(*till)->next = new_list; 			*till = new_list; 			printf("r"); 		} 	} }

代码都贴不全无力吐槽了

引用 楼主 M_lty63的回复:void charu(pnext**head,pnext**till) { 	pnext*p = *head; 	pnext*d=NULL; 	 	pnext*new_cet = (pnext*)malloc(sizeof(pnext)); 	new_cet = next(); 	 	if(!*head) 	{ 		*head = new_cet; 		*till = new_cet; 	} 	else if((*head)->data.id<new_cet->data.id) 	{ 		new_cet->next = p; 		p = new_cet; 	} 	else 	{ 		while(p) 		{ 			if(p->data.id<new_cet->data.id) 			{ 				d->next = new_cet; 				new_cet->next = p; 				break; 			} 			d = p; 			p = p->next; 		} 		if(p==*till) 		{ 			(*till)->next = new_cet; 			 			*till = new_cet; 		} 	} } void charu(pnext**head,pnext**till) { 	pnext*p = *head; 	pnext*d=NULL; 	 	pnext*new_cet = (pnext*)malloc(sizeof(pnext)); 	new_cet = next(); 	 	if(!*head) 	{ 		*head = new_cet; 		*till = new_cet; 	} 	else if((*head)->data.id>new_cet->data.id) 	{ 		new_cet->next = *head; 		*head = new_cet; 	} 	else 	{ 		while(p) 		{ 			if(p->data.id>new_cet->data.id) 			{ 				d->next = new_cet; 				new_cet->next = p; 				break; 			} 			d = p; 			p = p->next; 		} 		if(p==*till) 		{ 			(*till)->next = new_cet; 			 			*till = new_cet; 		} 	} }


Question: 关于c语言赋值的问题，麻烦大佬给指点下

引用 11 楼 拥抱Linux 的回复:[quote=引用 10 楼 Primit_ 的回复:] 我试了下，还是不行，应该是我的编译器有问题吧，我用的code::blocks V16.01，不过还是万分感谢  不客气。随便百度一个在线编译器，把代码粘贴进去，也可以马上得到验证结果的。[/quote] 奥，这样啊，我去看看

引用 10 楼 Primit_ 的回复:我试了下，还是不行，应该是我的编译器有问题吧，我用的code::blocks V16.01，不过还是万分感谢  还有个事，光顾着直接跑你的代码了，没想到 头文件 的事情。 你把 malloc.h 加到代码最上面，再试试。 #include <malloc.h>

引用 10 楼 Primit_ 的回复:我试了下，还是不行，应该是我的编译器有问题吧，我用的code::blocks V16.01，不过还是万分感谢  不客气。随便百度一个在线编译器，把代码粘贴进去，也可以马上得到验证结果的。

引用 7 楼 拥抱Linux 的回复:[quote=引用 6 楼 Primit_ 的回复:] [quote=引用 5 楼 拥抱Linux 的回复:] [quote=引用 3 楼 Primit_ 的回复:] 那这个ch1怎么赋值给ch？我想要里面的每个值都进行赋值  不应该全是0啊！ 赋值的语句没问题，输出的时候，最后一句把指针的名字写错了，就按 1 楼 的改正过来就好了。[/quote] 是啊我也是这样想的可是我把输出格式改正后，还是一样，ch1是被成功赋值了，但ch还是没有[/quote]  下面的截图是在vscode里的输出结果，   该不会是，你电脑上，IDE窗口的输出结果里，最左边的整数部分的数字被挡住了吧？  要么调整一下输出格式，把输出结果往右边挪一个tab的位置： printf("\n\t%lf\t", ch[i]); [/quote] 我试了下，还是不行，应该是我的编译器有问题吧，我用的code::blocks V16.01，不过还是万分感谢

贴出你的调试结果，我本地能够转换正确输出的 引用 8 楼 Primit_ 的回复:[quote=引用 6 楼 Primit_ 的回复:] [quote=引用 5 楼 拥抱Linux 的回复:] [quote=引用 3 楼 Primit_ 的回复:] 那这个ch1怎么赋值给ch？我想要里面的每个值都进行赋值  不应该全是0啊！ 赋值的语句没问题，输出的时候，最后一句把指针的名字写错了，就按 1 楼 的改正过来就好了。[/quote] 是啊我也是这样想的可是我把输出格式改正后，还是一样，ch1是被成功赋值了，但ch还是没有[/quote] 我试了下发现int类型的指针给double类型的指针赋值不了，我后来把ch换成了int类型的数就好了，但我还是不明白为什么不知能这样赋值，是因为int类型的指针声明时的空间和double声明时所占用的空间不同所以才造成了这样的吗？我想输出的时候保留小数点，但是如果这样的话，那我之前声明的就必须使用浮点类型才可以[/quote]

引用 6 楼 Primit_ 的回复:[quote=引用 5 楼 拥抱Linux 的回复:] [quote=引用 3 楼 Primit_ 的回复:] 那这个ch1怎么赋值给ch？我想要里面的每个值都进行赋值  不应该全是0啊！ 赋值的语句没问题，输出的时候，最后一句把指针的名字写错了，就按 1 楼 的改正过来就好了。[/quote] 是啊我也是这样想的可是我把输出格式改正后，还是一样，ch1是被成功赋值了，但ch还是没有[/quote] 我试了下发现int类型的指针给double类型的指针赋值不了，我后来把ch换成了int类型的数就好了，但我还是不明白为什么不知能这样赋值，是因为int类型的指针声明时的空间和double声明时所占用的空间不同所以才造成了这样的吗？我想输出的时候保留小数点，但是如果这样的话，那我之前声明的就必须使用浮点类型才可以

引用 6 楼 Primit_ 的回复:[quote=引用 5 楼 拥抱Linux 的回复:] [quote=引用 3 楼 Primit_ 的回复:] 那这个ch1怎么赋值给ch？我想要里面的每个值都进行赋值  不应该全是0啊！ 赋值的语句没问题，输出的时候，最后一句把指针的名字写错了，就按 1 楼 的改正过来就好了。[/quote] 是啊我也是这样想的可是我把输出格式改正后，还是一样，ch1是被成功赋值了，但ch还是没有[/quote]  下面的截图是在vscode里的输出结果，   该不会是，你电脑上，IDE窗口的输出结果里，最左边的整数部分的数字被挡住了吧？  要么调整一下输出格式，把输出结果往右边挪一个tab的位置： printf("\n\t%lf\t", ch[i]);

引用 5 楼 拥抱Linux 的回复:[quote=引用 3 楼 Primit_ 的回复:] 那这个ch1怎么赋值给ch？我想要里面的每个值都进行赋值  不应该全是0啊！ 赋值的语句没问题，输出的时候，最后一句把指针的名字写错了，就按 1 楼 的改正过来就好了。[/quote] 是啊我也是这样想的可是我把输出格式改正后，还是一样，ch1是被成功赋值了，但ch还是没有

引用 3 楼 Primit_ 的回复:那这个ch1怎么赋值给ch？我想要里面的每个值都进行赋值  不应该全是0啊！ 赋值的语句没问题，输出的时候，最后一句把指针的名字写错了，就按 1 楼 的改正过来就好了。

引用 2 楼 自信男孩 的回复:楼主是什么问题？输出时用%d输出double类型的数据了，是这个问题导致的吗？ 不是，我向想问用int类型指针里的值赋给double类型指针里的值，是怎么实现的，而且我这个ch拿不到ch1里的值？

那这个ch1怎么赋值给ch？我想要里面的每个值都进行赋值

楼主是什么问题？输出时用%d输出double类型的数据了，是这个问题导致的吗？

用%d打印double类型当然不对了，你下面想打印的是ch1吧？ printf("\n%lf\t", ch[i]); printf("%d\t", ch1[i]);


Question: 16×16点阵从右往左最多能显示几个汉字。。

贴代码鸭

估计是平移8个汉字以后代码没有执行循环吧……

16x16你能显示8个汉字？？？？？？？？256个像素点可以显示8个汉字？？？


Question: 求解大佬

双引号用的有问题，我想编译器起码会给你一个警告，建议看一下警告，并把警告去掉。

应该是这种形式scanf("%d,%d"&a,&b)。

第八行，scanf的格式用错了。


Question: 求助这两个程序该怎么写，萌新一个

引用 2 楼 自信男孩 的回复:if(q < &buf[2000]) 这句没问题吗？是不是数组已经越界（或者内存越界了）  [quote=引用 1 楼 自学半天的大一麦克 的回复:] 逆置(另一题 应该差不多） int main(int argc, char**argv) {      int array[1000] = {0};     int arrayNum;     scanf("%u\n", &arrayNum);      char * buf = (char *)malloc(2000);     memset(buf, 0, 2000);     fgets(buf, 2000, stdin);      char *p = buf, *q = NULL;     int i;     for(i = 0; i < arrayNum; i++) {         array[i] = (int)strtol(p, &q, 10);         if(q < &buf[2000])             p = q + 1;     }      int *pp, *qq;     pp = &array[0]; qq = &array[arrayNum-1];     while(pp < qq) {         int tmp = *pp;         *pp = *qq;         *qq = tmp;         pp++;         qq--;     }      for(i = 0; i < arrayNum; i++) {         printf("%d ", array[i]);     }     printf("\n"); }  代码写的很随意，空间申请这么大，建议根据需要申请。[/quote]  你说越界了。越界在哪里呢？

引用 3 楼 自信男孩 的回复: scanf("%u\n", &arrayNum); 这句代码有问题，建议给楼主的代码，自己先测试一遍，没问题再发出来。 有问题请指出问题， 当然是测过才给楼主的。 另外你说申请空间这么大， 楼主题目说要1000个，麻烦提出意见前先审题

if(q < &buf[2000]) 这句没问题吗？是不是数组已经越界（或者内存越界了）  引用 1 楼 自学半天的大一麦克 的回复:逆置(另一题 应该差不多） int main(int argc, char**argv) {      int array[1000] = {0};     int arrayNum;     scanf("%u\n", &arrayNum);      char * buf = (char *)malloc(2000);     memset(buf, 0, 2000);     fgets(buf, 2000, stdin);      char *p = buf, *q = NULL;     int i;     for(i = 0; i < arrayNum; i++) {         array[i] = (int)strtol(p, &q, 10);         if(q < &buf[2000])             p = q + 1;     }      int *pp, *qq;     pp = &array[0]; qq = &array[arrayNum-1];     while(pp < qq) {         int tmp = *pp;         *pp = *qq;         *qq = tmp;         pp++;         qq--;     }      for(i = 0; i < arrayNum; i++) {         printf("%d ", array[i]);     }     printf("\n"); }  代码写的很随意，空间申请这么大，建议根据需要申请。


Question: 怎么变成64？

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

char是单字节 320取低八位就是64

char类型最大值是255，指针类型强转后 320转成二进制101000000保留低8位，就是1000000，64

引用 楼主 sweetswing的回复:what is the output of this  code? int a=320; char *ptr; ptr =(char*)&a; printf("%d",*ptr);   A 30 B 60 C 64 D 320  正确答案是C   我就郁闷了，难道不该是320么？ 注意一下类型转换，int是4个byte的，char是一个byte的，你只取了4个byte的其中一部分，这一部分具体是什么内容，跟cpu大小端模式相关


Question: 文件的读取数据出错

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

引用 10 楼 weixin_44603568的回复:我说两句哈!        第一  feof() 这函数你得先读取才能判断.当你读文件时读到了结束标志位.这函数才能给你返回非0值                 意思是啥呢?                 先判断,读文件,输出....判断上一个内容,读取并输出下一个内容,当你读出结束标志位了,你的判断是上一个内容                 你就把结束标志位也输出出去了.输出完了才判断到结束标志位.结束循环.                 问题也不是很大,只不过多输出了一个无用数据        第二  用哪种方式去读文件,你要去看文件格式,你觉得你看到的文件是 1 2 3 4 5就认为他是 1 2 3 4 5                 其实在程序看来 他是  0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 == "12345"                 拿你的程序举例子:比如说 文件中写着一行        "张三 1 99" , 你猜这是几个字节?                 汉子2个字节,其他1个字节,两个空格,3个数字......一共9个字节                 定义结构体为  char name[10]  ; int num  ; int score ;  你觉得合适吗?                 int看做4个字节, 一个结构体就是18个字节,你试着把这9个字节挨着从头到尾的码到你的结构体中试试?                 全码到name[10]里面了是不是?那num 和 score 是多少你能确定么?要么随机值,要么0....                 格式化输出一下试试? printf("%s %d %d\n",name , num , score); 你觉得这样对不对?                 先输出%s,name 里面放着什么? "张三 1 99"就是输出了对不对? 那剩下的呢? 要么0,要么随机值是不是?                 就成了       "张三 -18256788769556 -6897653287" 或者 "张三 0 0"后面这种情况算好的了                 知道为什么了吗? 你知道要怎么改了吗?                 给你一个思路,简单点的就是 fscanf(结构体名,"%s %d %d\n" , fp); 一行中有几个变量就有几个对应的格式转换符                 你要嫌弃太麻烦不智能,那就一个一个扫秒,配合if判断,自己写格式转换.明白了吧? 最后发现是在输出printf是发现用的是%d，但是定义的是float，用错了，然后成了那样一串数字

引用 10 楼 weixin_44603568的回复:我说两句哈!        第一  feof() 这函数你得先读取才能判断.当你读文件时读到了结束标志位.这函数才能给你返回非0值                 意思是啥呢?                 先判断,读文件,输出....判断上一个内容,读取并输出下一个内容,当你读出结束标志位了,你的判断是上一个内容                 你就把结束标志位也输出出去了.输出完了才判断到结束标志位.结束循环.                 问题也不是很大,只不过多输出了一个无用数据        第二  用哪种方式去读文件,你要去看文件格式,你觉得你看到的文件是 1 2 3 4 5就认为他是 1 2 3 4 5                 其实在程序看来 他是  0011 0001 0011 0010 0011 0011 0011 0100 0011 0101 == "12345"                 拿你的程序举例子:比如说 文件中写着一行        "张三 1 99" , 你猜这是几个字节?                 汉子2个字节,其他1个字节,两个空格,3个数字......一共9个字节                 定义结构体为  char name[10]  ; int num  ; int score ;  你觉得合适吗?                 int看做4个字节, 一个结构体就是18个字节,你试着把这9个字节挨着从头到尾的码到你的结构体中试试?                 全码到name[10]里面了是不是?那num 和 score 是多少你能确定么?要么随机值,要么0....                 格式化输出一下试试? printf("%s %d %d\n",name , num , score); 你觉得这样对不对?                 先输出%s,name 里面放着什么? "张三 1 99"就是输出了对不对? 那剩下的呢? 要么0,要么随机值是不是?                 就成了       "张三 -18256788769556 -6897653287" 或者 "张三 0 0"后面这种情况算好的了                 知道为什么了吗? 你知道要怎么改了吗?                 给你一个思路,简单点的就是 fscanf(结构体名,"%s %d %d\n" , fp); 一行中有几个变量就有几个对应的格式转换符                 你要嫌弃太麻烦不智能,那就一个一个扫秒,配合if判断,自己写格式转换.明白了吧? 好的好的，明白了，谢谢大神

引用 11 楼 northwesternwind的回复:[quote=引用 4 楼 ONE~ 的回复:] [quote=引用 2 楼 自信男孩的回复:]文件里的数据是你通过fwrite写入的吗？如果不是，那么使用fread是有可能读取的不正确。 是通过fwrite写入的，然后通过fread读取[/quote] 看了下错误的数据，是"@&"。感觉是你的fwrite写的不对吧? 把fwrite代码贴出来。 [/quote] 已经发现了错误，是输出类型错误，没有及时改正过来

引用 6 楼 赵4老师的回复:仅供参考：//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   好的好的，谢谢谢谢！！！

换了之后还是数据读取不行

引用 2 楼 自信男孩的回复:文件里的数据是你通过fwrite写入的吗？如果不是，那么使用fread是有可能读取的不正确。 是通过fwrite写入的，然后通过fread读取

引用 1 楼 northwesternwind的回复:问本文件里面的数据不能用fread这样子读取，只能用fscanf一个一个扫描。 感谢感谢，我一会儿去试一试

引用 4 楼 ONE~ 的回复:[quote=引用 2 楼 自信男孩的回复:]文件里的数据是你通过fwrite写入的吗？如果不是，那么使用fread是有可能读取的不正确。 是通过fwrite写入的，然后通过fread读取[/quote] 看了下错误的数据，是"@&"。感觉是你的fwrite写的不对吧? 把fwrite代码贴出来。

问本文件里面的数据不能用fread这样子读取，只能用fscanf一个一个扫描。


Question: C语言指针编写程序

引用 2 楼 yyy9lang 的回复:[quote=引用 1 楼 user-5的回复:]作业请自己动脑做，否则取消成绩。 我错了老师但是我头快秃了[/quote] 写出来这个程序，也不会让你变得更糟。

让我发现是谁在帮学生做作业  我就把学生许配给他

再让我发现我班上的同学不肯好好做作业的，你们这门考试别想过了

作业请自己动脑做，否则取消成绩。

引用 1 楼 user-5的回复:作业请自己动脑做，否则取消成绩。 我错了老师🙊🙊但是我头快秃了

作业请自己动脑做，否则取消成绩。


Question: 运行C语言出现异常

引用 2 楼 ping527963401 的回复:[quote=引用 1 楼 636f6c696e的回复:]直接贴代码不要贴图 代码没问题，编译通过了，运行时就出现了设置异常，下面显示引发时中断[/quote] 图片看不清楚，代码看不清怎么能理解你的描述

代码没问题怎么会出现异常？ 引用 2 楼 ping527963401 的回复:[quote=引用 1 楼 636f6c696e的回复:]直接贴代码不要贴图 代码没问题，编译通过了，运行时就出现了设置异常，下面显示引发时中断[/quote]

代码没问题怎么可能触发中断，那你觉得是上面有问题 电脑有问题还是IDE有问题 编译通过只能说明没有明显的语法错误

引用 1 楼 636f6c696e的回复:直接贴代码不要贴图 代码没问题，编译通过了，运行时就出现了设置异常，下面显示引发时中断

直接贴代码不要贴图


Question: 如何创建C语言.h头文件啊！

delay();

这类代码文件，只要新建文本文档，然后将文件名后缀改成想要的类型即可

不管是.c还是.h，就是就是个txt文件，改了后缀而已。 #include "xxx.h" 本质上就是把xxx.h这个文本里的文字拷贝进来，不信你换成.txt后缀也一样 你可以在.c文件的同目录下新建个1.h，然后#include "1.h" 就可以包含了 或者你得把.h文件放到编译器的默认搜索路径 如果要放在其他地方的话，比如 放到E:\ 目录下，那么可以写为 #include "E:\\1.h"

这个我已经弄出来了，谢谢啦！

文件.h怎么创建啊，是文档吗?

创个文件.h的 main.c 里面包含这个.h就行了


Question: 求大佬们那一点点时间帮助一下C语言初学者

最基本的排序啊。。

冒泡法找出最大值MAX和最小值MIN，最后用MAX-MIN即可

比较简单的做法： 1）设最小值min和最大值max都为第一个值。 2）然后遍历后面的数，如果大于max，就更新max值。如果小于min，就更新min的值。 3）遍历结束，max-min等于差值。

引用 1 楼 user-6 的回复:你就不能先搞啥排序法求最大值最小值，再算差值吗 也可以不用排序，直接遍历一遍找到最大值和最小值。

查一下冒泡法，把前后两个数弄出来相减就好了

你就不能先搞啥排序法求最大值最小值，再算差值吗


Question: why do we need typedef for enum  in c compiler?

使用typedef从某种角度上看有助于代码的阅读，提高代码的可读性

引用 8 楼 lin5161678 的回复:[quote=引用 7 楼 jiht594 的回复:] 新版c编译器应该也不需要了吧。 旧版如果不typedef 声明时需要加 enum day 现在应该不需要了吧、直接day就可以了吧都要[/quote] 受教了

引用 7 楼 jiht594 的回复:新版c编译器应该也不需要了吧。 旧版如果不typedef 声明时需要加 enum day 现在应该不需要了吧、直接day就可以了吧都要

别名只是使用上的方便，不然每次使用枚举都需要enum xxx

楼上的英文。。。。 不用typedef也没关系的吧。typedef跟#define一样，起个别名罢了

楼上的英文都很骚

This is only a code style for enum types. There are some similar styles, such as   typedef struct { ....  } MYSTRUCT;  These styles were often (only?) employed for classical C compilers. Prefix "struct/enum/union“ before variable definition has been made as redundancy in modern C/C++. Normal C++ grammar can be applied , so that we can directly know raw type name from variable definitions.

In C compiler?  Are you writing C code in compiler ? OK, leave it go. Maybe your question is ( why need typedef for enum ? ) , do you agree? As you can see,  it is convenient.  Enough or not ?


Question: 求大佬给个思路

using namespace std; map<string, list<YourType> > cache;  对整个List索引，还是对LIst的元素索引？ 如果是对整个List索引，则可以用一些手段，从整个List里计算出一个体现List唯一性的Key，作为cache的key。 如果是对List里的元素索引，则新建map:  map<string, vector<YourType *> > lidx;  选好key,把认为同样类型的指针放在一起。

可以学习一下C++的STL库，自己实现集合的话可以通过哈希或者构建一种搜索树

用一个链表的数组，每个元素都是各自链表的头。

只是索引的话，你可以创建一个指针数组，每个数组元素都是一条链表的头，这样元素个数就是链表条数，通过每个数组元素也可以访问链表里的每个元素。麻烦点的话，你可以把链表头连成一个链表，这样也有两种方式，第一种修改结构体，增加一个指针，这个指针只有链表头才会用到，通过这个指针一个链表头可以到达另一个链表头；或者不修改结构体，而是创造一个新的结构体，这个结构体有链表头变量或者指向链表头的指针，你可以通过新链表找到每个链表头，然后通过链表头进入每个链表。


Question: 逆序  要求程序每次读入一个正三位数，然后输出逆序的数字。注意，当输入的数字含有结尾的0时，输出不应带有前导的0。比如输入700，输出应该是7。  哥哥们看一下

#include<stdio.h> int main() { int a,b,c,d,e;  scanf("%d",&a); b=a/100; e=a%100; c=e/10; d=a%10; if (c>0 && d>0) { printf("%d%d%d\n",d,c,b); } if (c>0 && d==0) { printf("%d%d\n",c,b); } if (c==0 && d==0) { printf("%d\n",b); }  return 0; } 我修改了下楼主的代码，实测可行

两种方法  int main() { 	int a, b, c, d, e; 	scanf("%d", &a); 	////注释掉的代码可以，不限制数的大小，得到的y值即倒序后的数值 	//int x, y = 0; 	//while (a) { 	//	x = a % 10; 	//	y = y * 10 + x; 	//	a /= 10; 	//} 	b = a / 100;			//百位 	c = a  % 100 / 10;		//十位 	d = a % 10;				//各位 	printf("%d\n", d * 100 + c * 10 + b);  	return 0; }

能帮忙改一下吗，，，，不会我

b、c只有1个0的情况没考虑，比如405这种

#include<stdio.h>  int reverse_order_num(int num);  int main() {     int a,b,c,d,e;      scanf("%d",&a);     #if 0     b=a/100;     e=a%100;     c=e/10;     d=a%10;     if (c>0 && b>0)     {         printf("%d%d%d\n",d,c,b);     }     else     {         printf("%d\n",d);     } #endif     printf("%d\n", reverse_order_num(a));     return 0; }  int reverse_order_num(int num) {     int tmp = 0;      while (num) {         tmp = tmp * 10 + num % 10;         num /= 10;     }      return tmp; }  供参考！  满足小于2^31 - 1的数据


Question: C语言

建议用fscanf，因为你的文件是格式化的，   fscanf(fp, "%s %d %d\n", stud[i].name, &stud[i].num, &stud[i].age);

1、 首先 结构体里 name 应该是 char name[10] 而不是int 数组 2、 fread 不能这样读到结构体里， 先读到一个 char buf[30] 中（大小自己定义）, 然后 sscanf到结构体里


让窗口在显存中按字节对齐。

开发效率低。繁琐。不够美观。

引用 9 楼 真相重于对错 的回复:你的具体水平如何？我不可能知道，我只是就一般的win32如何入门泛泛而谈。主要是我觉得你纠缠这些东西有些浪费精力，因为现在很少有公司不用现成的gui库而直接用win32写界面。这些东西知道就可以，太过深入不值当。 win32 API是不好用还是？

引用 6 楼 六道佩恩 的回复:[quote=引用 5 楼 真相重于对错 的回复:] [quote=引用 4 楼 六道佩恩 的回复:] [quote=引用 1 楼 真相重于对错 的回复:] 个人感觉你路走偏了。 请问能具体说说吗？我也觉得有点走偏的感觉[/quote] 个人经历，不一定是正确。 看了你的几个帖子，似乎在专研c++ win32编程。且不说目前c++ win32是不是流行。就说你所问的那些问题，几乎都是那种“捅破窗户纸”的问题。具体我不知道如何用语言描述，就好比word,execl的操作，不看说明书，让你去试，那可能试半天也试不出来。但是如果有做过的一句话你就明白。 win32 api 有几千个，你要一个个去详细了解，我觉得太费时间。一个人的精力有限，扣这些细节，事倍功半。 我觉要学win32编程，先找本能够让你入门的书，写出第一个helloworld,然后msdn里面有很多例子。把他们能够运行起来，并知道来龙去脉。才是正道。至于一些旁枝末节不必太在意。完全可以网上去查。如果查不到，大概率是一般不会使用的。 [/quote] “说明书”我看了呀，就是MSDN上的嘛，就是那上面说“字节对齐”，搞不清楚什么意思，搜出来的结果有的说为了效率，有的说像素点对齐，搜到的结果本来就少，所以我只能自己试以及来问了呀。。。至于入门的书，我也想啊，可是不知道有什么书，貌似这方面的书不多，《windows核心编程》我实在看不下去，也没讲消息和窗口，没有我想要的，《windows程序设计第五版》看过几十页，感觉翻译得不好，，效率太低，还不如直接看MSDN。 我感觉我还不至于是helloworld的程度吧，学习过一些API诸如鼠标、键盘、控制台等，基本的框架大致了解了吧（也许），比如创建窗口也消息机制、回调函数，通过在窗口过程中判断消息然后进行相应的处理，，但还是有很多疑点不了解，这些地方是我查阅MSDN、百度后仍然不懂的（也可能是方法不对或翻译不好），就那么一个小知识点，，，它阻碍了我贯通这条知识线，所以很苦恼，的确如你所说，它对于老实而言就是那么一句话的事情。[/quote] 你的具体水平如何？我不可能知道，我只是就一般的win32如何入门泛泛而谈。主要是我觉得你纠缠这些东西有些浪费精力，因为现在很少有公司不用现成的gui库而直接用win32写界面。这些东西知道就可以，太过深入不值当。

引用 7 楼 赵4老师 的回复:遥想公瑾当年，显存一个字节对应两个16色像素的年代，…… 你懂的。 所以一个像素点占用几个完整字节的现在已经用不着了吗？

遥想公瑾当年，显存一个字节对应两个16色像素的年代，…… 你懂的。

引用 5 楼 真相重于对错 的回复:[quote=引用 4 楼 六道佩恩 的回复:] [quote=引用 1 楼 真相重于对错 的回复:] 个人感觉你路走偏了。 请问能具体说说吗？我也觉得有点走偏的感觉[/quote] 个人经历，不一定是正确。 看了你的几个帖子，似乎在专研c++ win32编程。且不说目前c++ win32是不是流行。就说你所问的那些问题，几乎都是那种“捅破窗户纸”的问题。具体我不知道如何用语言描述，就好比word,execl的操作，不看说明书，让你去试，那可能试半天也试不出来。但是如果有做过的一句话你就明白。 win32 api 有几千个，你要一个个去详细了解，我觉得太费时间。一个人的精力有限，扣这些细节，事倍功半。 我觉要学win32编程，先找本能够让你入门的书，写出第一个helloworld,然后msdn里面有很多例子。把他们能够运行起来，并知道来龙去脉。才是正道。至于一些旁枝末节不必太在意。完全可以网上去查。如果查不到，大概率是一般不会使用的。 [/quote] “说明书”我看了呀，就是MSDN上的嘛，就是那上面说“字节对齐”，搞不清楚什么意思，搜出来的结果有的说为了效率，有的说像素点对齐，搜到的结果本来就少，所以我只能自己试以及来问了呀。。。至于入门的书，我也想啊，可是不知道有什么书，貌似这方面的书不多，《windows核心编程》我实在看不下去，也没讲消息和窗口，没有我想要的，《windows程序设计第五版》看过几十页，感觉翻译得不好，，效率太低，还不如直接看MSDN。 我感觉我还不至于是helloworld的程度吧，学习过一些API诸如鼠标、键盘、控制台等，基本的框架大致了解了吧（也许），比如创建窗口也消息机制、回调函数，通过在窗口过程中判断消息然后进行相应的处理，，但还是有很多疑点不了解，这些地方是我查阅MSDN、百度后仍然不懂的（也可能是方法不对或翻译不好），就那么一个小知识点，，，它阻碍了我贯通这条知识线，所以很苦恼，的确如你所说，它对于老实而言就是那么一句话的事情。

引用 4 楼 六道佩恩 的回复:[quote=引用 1 楼 真相重于对错 的回复:] 个人感觉你路走偏了。 请问能具体说说吗？我也觉得有点走偏的感觉[/quote] 个人经历，不一定是正确。 看了你的几个帖子，似乎在专研c++ win32编程。且不说目前c++ win32是不是流行。就说你所问的那些问题，几乎都是那种“捅破窗户纸”的问题。具体我不知道如何用语言描述，就好比word,execl的操作，不看说明书，让你去试，那可能试半天也试不出来。但是如果有做过的一句话你就明白。 win32 api 有几千个，你要一个个去详细了解，我觉得太费时间。一个人的精力有限，扣这些细节，事倍功半。 我觉要学win32编程，先找本能够让你入门的书，写出第一个helloworld,然后msdn里面有很多例子。把他们能够运行起来，并知道来龙去脉。才是正道。至于一些旁枝末节不必太在意。完全可以网上去查。如果查不到，大概率是一般不会使用的。

引用 1 楼 真相重于对错 的回复:个人感觉你路走偏了。 请问能具体说说吗？我也觉得有点走偏的感觉

引用 2 楼 赵4老师 的回复:让窗口在显存中按字节对齐。 我知道翻译是写的按字节对齐，我问题中打错了，，，但具体不明白这是什么意思，求赵老师指点

个人感觉你路走偏了。


Question: 萌新指针求问

引用 8 楼 zyx6680599 的回复:哦.....那么大佬，"%c"对应的是什么呢？麻烦了。  在 printf 里 使用 %c ，意思 就是 以 单个 字符 的格式 输出 字符。

引用 7 楼 拥抱Linux 的回复:[quote=引用 6 楼 zyx6680599 的回复:] [quote=引用 5 楼 拥抱Linux 的回复:] [quote=引用 4 楼 zyx6680599 的回复:]  大佬我还是有些不明白，假设我输入的是汉字，显然不在ASCII 0-127之间，为什么还是一样的情况呢。。。。。  因为你定义的变量 p 是 char 型的指针啊，那它读取内存地址上的值的时候，就是按一个 char 的内存大小，也就是一个字节来读取的呀。 即使输入的是汉字，它最终在内存里面不还是得一个字节一个字节地存储吗？（当然了，真正是一个位一个位地存储的，但是这不影响分析问题原因。）[/quote] 大佬，那也就是说。。。存储时汉字拆分成GB2312编码，在对应到ASCII编码上吗？（我百度了一下。。。不明就里。。。）[/quote]  别纠结到底是汉字还是英文还是什么语言，也别纠结是什么编码，总而言之、言而总之，char 类型就是 字符类型， 在内存里面 一个 char 就是只占 一个字节（Byte）， 也就是 8 个字(bit)， 而 char *p 就只是 字符指针 ，  *p 就是去读取一个字符的值，说来说去只读 一个字节的数据而已，那不就是 一个字节（8个字）的 数值范围么？ [/quote] 哦.....那么大佬，"%c"对应的是什么呢？麻烦了。

引用 6 楼 zyx6680599 的回复:[quote=引用 5 楼 拥抱Linux 的回复:] [quote=引用 4 楼 zyx6680599 的回复:]  大佬我还是有些不明白，假设我输入的是汉字，显然不在ASCII 0-127之间，为什么还是一样的情况呢。。。。。  因为你定义的变量 p 是 char 型的指针啊，那它读取内存地址上的值的时候，就是按一个 char 的内存大小，也就是一个字节来读取的呀。 即使输入的是汉字，它最终在内存里面不还是得一个字节一个字节地存储吗？（当然了，真正是一个位一个位地存储的，但是这不影响分析问题原因。）[/quote] 大佬，那也就是说。。。存储时汉字拆分成GB2312编码，在对应到ASCII编码上吗？（我百度了一下。。。不明就里。。。）[/quote]  别纠结到底是汉字还是英文还是什么语言，也别纠结是什么编码，总而言之、言而总之，char 类型就是 字符类型， 在内存里面 一个 char 就是只占 一个字节（Byte）， 也就是 8 个字(bit)， 而 char *p 就只是 字符指针 ，  *p 就是去读取一个字符的值，说来说去只读 一个字节的数据而已，那不就是 一个字节（8个字）的 数值范围么？

引用 5 楼 拥抱Linux 的回复:[quote=引用 4 楼 zyx6680599 的回复:]  大佬我还是有些不明白，假设我输入的是汉字，显然不在ASCII 0-127之间，为什么还是一样的情况呢。。。。。  因为你定义的变量 p 是 char 型的指针啊，那它读取内存地址上的值的时候，就是按一个 char 的内存大小，也就是一个字节来读取的呀。 即使输入的是汉字，它最终在内存里面不还是得一个字节一个字节地存储吗？（当然了，真正是一个位一个位地存储的，但是这不影响分析问题原因。）[/quote] 大佬，那也就是说。。。存储时汉字拆分成GB2312编码，在对应到ASCII编码上吗？（我百度了一下。。。不明就里。。。）

printf("%s",*p++); 去掉*或者把%s改成%c

引用 4 楼 zyx6680599 的回复:大佬我还是有些不明白，假设我输入的是汉字，显然不在ASCII 0-127之间，为什么还是一样的情况呢。。。。。  因为你定义的变量 p 是 char 型的指针啊，那它读取内存地址上的值的时候，就是按一个 char 的内存大小，也就是一个字节来读取的呀。 即使输入的是汉字，它最终在内存里面不还是得一个字节一个字节地存储吗？（当然了，真正是一个位一个位地存储的，但是这不影响分析问题原因。）

引用 2 楼 拥抱Linux 的回复:把 printf("%s",*p++); 里的 * （星号）去掉，  把 printf("%s",as[i]); 里的 [i] （下标）去掉， 就可以正常运行了。  printf里，格式符是 %s 的话，对应的是一个字符串的首地址，反过来说，任何一个对应于 %s 的变量或常量，都会被当作是一个存储着内存地址的量来看待。  于是 第一个代码里， *p++ 的结果其实就是 *p ，也就是 某一个字符， 因为很明显这个字符的「数值」是在 ASCII 码表里面的，它的取值范围在 0 ～ 127 之间， 而 内存地址 在 0 ～ 127 之间的 内存空间 是 禁止 代码去读取访问的 ，所以就会出现错误了。 大佬我还是有些不明白，假设我输入的是汉字，显然不在ASCII 0-127之间，为什么还是一样的情况呢。。。。。

把循环都去掉，这里你都用了%s了


Question: 怎么回事

数学公式和编程语言不可以直接划等号的。  未定义Log吧

辛苦你了，居然能把那个符号搞来的=.=，厉害，但是没必要，函数log10，就是键盘输入 l o g


Question: 写入位置0xCCCCCCCC时发生访问冲突。

%d后面应该加&.不过后面的第三参数是8，前后有点矛盾。建议把结构体定义贴出来。

你的student指针没有分配内存吧


Question: 请问出现这样错误应该怎么改?求大神指点

复合语句，写错了

只有预处理命令不需要分号，因为那是写给编译器看的，告诉他编译前做这些处理，预处理命令不完全算C语法，这样看的话，C语法都是需要分号的，符合语句{}就当做另一种形式的分号。

全局变量也是需要分号;的

①第五行，最后面加分号 ②指针类型，在*之前加空格，比如Mgrap *p

先在第 5 行 的末尾 增加 一个 分号 再说。

int visted[MAXEX] 后面没有分号;


Question: 队列的基本程序操作

void EnterQueue(SeqQueue* SQ,DataType data) {     if (IsFull(SQ))     {         printf("队列已满\n");         //return 0;         return;     }     SQ->Queue[SQ->rear] = data;  //在队尾插入元素data     SQ->rear = SQ->rear + 1;     //队尾指针后移一位 } 这个地方需要改一下，不然编译不过

楼主是什么问题，建议贴出代码之后再把问题描述一下。不是大家都愿意去猜的。


Question: C primer Plus 第七章编程练习第十一题

引用 4 楼 m0_44999580 的回复:非常感谢指出我的错误所在！并且让你费时间给了更完美的答案。因为是自学，由于内容的限制，有些问题只能用我所能用到的知识去解决。譬如您提到的getBuff，我还没有接触到。感谢前辈的指导！！最后想问下该如何结帖给分  不用客气！俗话说，活到老、学到老，俺也是C语言的学习者一枚而已。大家一起共同学习提高吧！ 另外上面代码中的 getBuff 不是什么新鲜知识，只是一个普通的 变量名 而已，只是起了一个叫 getBuff 的容易识别的变量名而已，重点是 清空输入缓冲区 的那两行代码 的逻辑。  嗯，结帖的话，用「 浏览器 」 打开自己的帖子 ，就有 结帖、给分 的按钮了。可以根据页面提示操作。 手机app好像不能结帖。

引用 1 楼 user-3 的回复：一般好的题目都会明确说明保证输入的合法性，如果每道题都要考虑输入的异常，代码量会多不知道多少。的确如此，我也是闲的，就想着它会出点问题

引用 2 楼 自信男孩 的回复：while ((ch =getchar()) == 1, ch != ' ') 这条语句是想做什么呢？getchar()怎么能与1划等号呢？getchar()怎么也无法输入1呢。你是不是把getchar()和scanf的返回值闹混了。  建议查一下getchar();的返回值非常感谢指出我的毛病！！我还是太年轻了，由于程序执行没问题，根本没去看代码是否有问题，很感谢前辈的指导！

（1）确实可以考虑「输入的数据是否有效」，最好还要同时考虑「过滤掉无效输入」。 （2）另外，诚如2楼所言，getcha()的返回值不是得到了字符的个数，因为这没有意义——要么不输入，就是什么都没有，程序停在getchar()不往下走；要么无论输入什么，getchar()只获得一个字符。getchar()的返回值就是它得到的那个字符。 （3）俺把你上面的代码简单修改了一下，对 ch 的输入进行了判别和过滤，把程序的逻辑也修正了一下，你原来的代码在直接输入字符 q 的情况下，输出结果还需要 付包装费、运费，岂不是滑稽？ （4）如果，要针对 重量的输入数据 进行判别和过滤的话，也可以依葫芦画瓢。 （5）说明：俺没有读过你提到的这本书，也没有去翻看题目是什么，下面的代码全是基于你的帖子进行的调整。具体的数值计算的逻辑是否正确什么的，俺不负责哈。  代码如下：  #include <stdio.h>  #define Y 2.05 //洋蓟单价 #define T 1.15 //甜菜单价 #define H 1.09 //胡萝卜单价 #define Z 0.05 //折扣 #define F1 6.5 //第一阶段运费和包装费 #define F2 14 //第二阶段运费和包装费 #define B1 5 #define B2 20  int main(void) { 	char ch; 	float a, b, c; 	float z1 = 0, z2 = 0, z3 = 0; //各蔬菜的重量 	float zz = 0, sj = 0, yf = 0, zj = 0; //总重、蔬菜价、运费和总价 	z1 = z2 = z3 = 0;  	printf("请输入对应字母选择您要订购的蔬菜：\n"); 	printf(" a.洋蓟    b.甜菜    c.胡萝卜   q.退出\n");  	int flag = 1;  	while (flag == 1) { 		while ((ch = getchar()) != 'a' && ch != 'b' && ch != 'c' && ch != 'q') { 		}  		//清空输入缓冲区 		int getBuff; 		while ((getBuff = getchar() != '\n') && (getBuff != EOF)) 			;  		switch (ch) { 		case 'a': 			printf("请输入洋蓟的磅数：\n"); 			scanf("%f", &a); 			z1 += a; 			printf("您一共输入了%.2f磅洋蓟。\n", z1); 			break; 		case 'b': 			printf("请输入甜菜的磅数：\n"); 			scanf("%f", &b); 			z2 += b; 			printf("您一共输入了%.2f磅甜菜。\n", z2); 			break; 		case 'c': 			printf("请输入胡萝卜的磅数：\n"); 			scanf("%f", &c); 			z3 += c; 			printf("您一共输入了%.2f磅胡萝卜。\n", z3); 			break; 		case 'q': 			printf("您将退出订购！\n"); 			flag = 0; 			break; 		} 		if (flag == 1) { 			printf("请继续选择，选择完毕请摁空格键，退出请摁q：\n"); 			printf(" a.洋蓟    b.甜菜    c.胡萝卜   q.退出\n"); 		} 	}  	zz = z1 + z2 + z3;  	if (zz == 0) { 		yf = 0; 		sj = 0; 		zj = 0; 	} else if (zz <= B1) { 		yf = F1; 		sj = z1 * Y + z2 * T + z3 * H; 		zj = sj + yf; 	} else if (zz <= B2) { 		yf = F2; 		sj = z1 * Y + z2 * T + z3 * H; 		zj = sj + yf; 	} else { 		yf = F2 + 0.5 * (zz - B2); 		sj = z1 * Y + z2 * T + z3 * H; 		if (sj >= 100) 			zj = sj * (1 - Z) + yf; 		else 			zj = sj + yf; 	}  	printf("洋蓟单价：￥%.2f   甜菜单价：￥%.2f   胡萝卜单价：￥%.2f\n", Y, T, H); 	printf("您订购的总重是：%.2f磅.\n", zz); 	printf("蔬菜总费用为：$%.2f.\n", sj); 	printf("可享受折扣：%s.\n", sj >= 100 ? "95折" : "无折扣"); 	printf("运费及包装费为：%.2f.\n", yf); 	printf("您一共需要支付：%.2f.\n", zj);  	return 0; }   如有帮助，烦请及时结帖、给分。：）


Question: 程序运行错误 显示 “process exited with return value 3221225725”

仅供参考：//在堆中开辟一个4×5的二维int数组 #include <stdio.h> #include <malloc.h> int **p; int i,j; void main() {     p=(int **)malloc(4*sizeof(int *));     if (NULL==p) return;     for (i=0;i<4;i++) {         p[i]=(int *)malloc(5*sizeof(int));         if (NULL==p[i]) return;     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             p[i][j]=i*5+j;         }     }     for (i=0;i<4;i++) {         for (j=0;j<5;j++) {             printf(" %2d",p[i][j]);         }         printf("\n");     }     for (i=0;i<4;i++) {         free(p[i]);     }     free(p); } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19

二重指针，看到你的malloc只用了一次，也就是只申请了行数，那么列数呢？这样会导致段错误。

这种又不是啥错误，只是说你的程序返回值是3221225725，你检查下main函数有没有加返回值就好了吧

3221225725是程序抛出段错误（如栈溢出、非法指针等）

int **network;      比如这个你初始化就有问题  参考  #include <stdio.h>   #include <stdlib.h>   int main()   {       int** a = (int**)malloc(sizeof(int*)*3);       int i=0, j=0;           for (i=0; i<3; i++)       {           a[i] = (int*)malloc(sizeof(int)*5);           for (j=0; j<5; j++)           {               *(*(a+i)+j)=j;           }       }                   for (i=0; i<3; i++)       {           for (j=0; j<5; j++)           {               printf("%d\t", *(*(a+i)+j));           }           printf("\n");       }                   delete[] a;       return 0;   }

嗯~~贴一下我整个程序吧！ 调试好几天了，怎么都不能正常运行 #include<stdio.h> #include<time.h> #include<stdlib.h> #include <string.h> #include<math.h> #include<float.h> /*  *两层网络都为BA，Na=Nb=N/2=1000 *<ka>=<kb>=<k>=10 *C=5 *耦合强度β *intra—traffic 最短路                    1- P *inter—traffic global shortest           p *每层网络产生R个信息包  */  int INF=0;  int C=5,R,Size,Size2,Origin_packets=50000; int **network; int *node_array; /*节点信息包数目*/ int *node_move;  /*节点发送信息包数目*/  FILE *fp;  typedef struct {              /*信息包*/  	int node; 	int destination; 	int place_in_node; }Packet,Packetptr;  Packet *packet;  void initial(); void file(); void connect();  int main()  {  	 	int time_step; 	int sum_step=10000; 	int node,P_node; 	double min=0; 	int Sum_S=0; 	int i,j,k,n; 	int rand1,rand2,sum_packets=0;  	INF=Size2*Size2; 	printf("Size="); 	scanf("%d",&Size); 	printf("R="); 	scanf("%d",&R); 	Size2=2*Size; 	srand((unsigned)time(NULL)); 	 	initial();      file();     /*connect();     */     int **path = (int**)malloc(sizeof(int*)*Size2); 	for(i=0; i<Size2; i++){ 		for(j=0; j<Size2; j++){ 			path[i][j]=0; 		} 	} 	 	/*Djistra算法找路*/ 	    /*关键在于寻找前置节点*/  	    /*flag[i]=0说明点在集合S中，即该点与起点间的最短路径已找到*/  	    int *flag = (int*)malloc(sizeof(int)*Size2); 	    int *T_array = (int*)malloc(sizeof(int)*Size2); 	    int *tmp_T_array = (int*)malloc(sizeof(int)*Size2); 	    int *node_T_array = (int*)malloc(sizeof(int)*Size2);/*node_T_array为前置节点*/  	    int **weight=(int**)malloc(sizeof(int)*Size2); 	    /*对边赋权*/  		/*不相连的节点为INF，相连=1*/  		/*for(i=0; i<Size2; i++){                               			for(j=0; j<Size2; j++){ 				if(network[i][j] == 1)   				    weight[i][j] = 1; 				else  					weight[i][j] = INF; 			} 		} 		*/ 		/*初始化每个节点的数值*/ 		for(i=0; i<Size2; i++){ 			flag[i] = 0; 			T_array[i] = 0; 			tmp_T_array[i] = 0; 		    node_T_array[i]=0;	 		} 		/*寻找所有点为起点的最短路*/  		for(node=0; node<Size2; node++){            			/*每一次换起点，都重置数值*/ 			for(i=0; i<Size2; i++){                 				T_array[i]=(double)INF; 				tmp_T_array[i]=(double)INF; 				flag[i]=0; 			} 			/*起点T、tmp_T都为0，且在集合S中*/  			T_array[node]=0; 			tmp_T_array[node]=0; 			flag[node]=1; 			node_T_array[node]=node; 			 			P_node=node; 			/*Sum_S=Size2则说明所有节点的最短路已找到*/  			Sum_S=1; 			do{ 				/*确定相邻点的T标号*/  				for(i=0; i<Size2; i++){ 					if(flag[i] == 0 && network[P_node][i] == 1){ 						tmp_T_array[i] = T_array[P_node] + 1; 						if(tmp_T_array[i] < T_array[i]){ 							T_array[i] = tmp_T_array[i]; 							node_T_array[i] = P_node; 						} 					} 				} 				 				/*寻找所有T标号中最小的*/  				min = (double)INF; 				for(i=0; i<Size2; i++){ 					if(min > T_array[i] && flag[i] == 0){ 						min = T_array[i]; 						P_node = i; 					} 				} 				 				flag[P_node] = 1; 				path[P_node][node] = node_T_array[P_node]; 				 				Sum_S++; 			}while(Sum_S != Size2); 		} 		 	/*加包，找路， 传包*/  	for(time_step=0; time_step<sum_step; time_step++) {                    	    int i,j,k,n; 	    for(i=0; i<R; i++){ 	       do{                                /*随机选择出发点与到达点*/  	   	        rand1 = rand()%Size2; 	            rand2 = rand()%Size2; 	        }while(rand1 == rand2);  	       do{                                /*选一个信息包*/ 	   	        k= rand()%Origin_packets; 	         }while(packet[k].node>=0); 	        packet[k].node=rand1; 	        packet[k].destination=rand2; 	        node_array[rand1]++; 	        packet[k].place_in_node=node_array[rand1]; 	    }                                            	     	     	/*传包*/ 	    for(i=0; i<Origin_packets; i++){ 		   if(packet[i].node >= 0 && packet[i].place_in_node <= C) { 		   	    node_move[packet[i].node]++; 		   	    packet[i].node = path[packet[i].destination][packet[i].node]; 		   } 		   if(packet[i].node = packet[i].destination){         /*信息包到达目的地*/  	            packet[i].node = -1; 			} 		   if(packet[i].node != packet[i].destination){ 				node_array[packet[i].node]++; 				packet[i].place_in_node = node_array[packet[i].node]; 			} 	    } 		 		/*调整packet在node中的位置*/  		for(i=0; i<Origin_packets; i++){ 			if(packet[i].node >= 0){ 				packet[i].place_in_node = packet[i].place_in_node - node_move[packet[i].node]; 			} 		} 		 		/*调整node中的包数*/ 		for(i=0; i<Size2; i++){ 			node_array[i] -= node_move[i]; 			node_move[i] = 0; 		} 		 		if(time_step%10==0) 		{ 			sum_packets=0; 			for(i=0; i<Size2; i++) 			{ 				sum_packets += node_array[i]; 			} 			printf("%d %d\n",time_step,sum_packets); 			fprintf(fp,"sum_packet\n",sum_packets);	 		}		     }     return 0; }	    void initial() { 	int i,j; 	node_array=(int*)malloc(sizeof(int)*Size2); 	node_move=(int*)malloc(sizeof(int)*Size2); 	network=(int**)malloc(sizeof(int*)*Size2); 	for(i=0; i<Size2; i++){ 		node_array[i]=0;          		node_move[i]=0;          	} 	packet=(Packetptr*)malloc(sizeof(Packet)*Origin_packets); 	for(i=0; i<Origin_packets; i++){                                /*信息包在节点外*/  		packet[i].node=-1; 		packet[i].destination=-1; 		packet[i].place_in_node=0; 	}  	 }   void file() {                                        /*输入文件*/  	int i,j; 	for(i=0; i<Size2; i++){ 		for(j=0; j<Size2; j++){ 			network[i][j]=0; 		} 	} 	FILE *fp1, *fp2; 	if((fp1=fopen("BA1.txt","r"))==NULL){ 		printf("can open BA1 \n"); 		exit(0); 	} 	for(i=0; i<Size; i++){ 		for(j=0; j<Size; j++){ 			fscanf(fp1,"%d",&network[i][j]);        /*从文件中读取网络BA1       Upper_network*/   	    } 	    fscanf(fp1,"\n");     }     fclose(fp1);     if((fp2=fopen("BA2.txt","r"))==NULL){ 		printf("can open BA2 \n"); 		exit(0); 	} 	for(i=Size; i<Size2; i++){ 		for(j=Size; j<Size2; j++){ 			fscanf(fp2,"%d",&network[i][j]);        /*从文件中读取网络BA2       Lower_network*/  	    } 	    fscanf(fp2,"\n");     }     fclose(fp2);     /*for(i=0; i<Size; i++) {     	for(j=Size; j<Size2; j++) {     		network[i][j]=0;     		network[j][i]=0; 		}     }  	*/ }  /* void connect() { 	int i,j,a; 	double B; 	int *Upper_degree; 	int *Lower_degree; 	Upper_degree=(int*)malloc(sizeof(int)*Size); 	Lower_degree=(int*)malloc(sizeof(int)*Size); 	for(i=0; i<Size; i++){ 		Upper_degree[i] = 0; 		Lower_degree[i] = 0; 	} 	for(i=0; i<Size; i++){ 	    for(j=0; j<Size; j++) { 	    	Upper_degree[i] += network[i][j];  	    	Lower_degree[i] += network[i+Size][j+Size]; 		} 	} 	 	/////////////按度大小排序////////////// 	int *sort1; 	int *sort2; 	sort1=(int*)malloc(sizeof(int)*Size); 	sort2=(int*)malloc(sizeof(int)*Size); 	 	for(i=0; i<Size ;i++){ 		sort1[i]=0; 		sort2[i]=0; 	}      for(j=0; j<Size; j++){ 		for(i=j+1; i<Size; i++){ 			if(Upper_degree[j]<=Upper_degree[i]){ 			    sort1[j]=i; 			    a=Upper_degree[j]; 				Upper_degree[j]=Upper_degree[i]; 				Upper_degree[i]=a; 			} 		} 	}  	for(j=0; j<Size; j++){ 		for(i=j+1; i<Size; i++){ 			if(Lower_degree[j]<=Lower_degree[i]){ 			    sort2[j]=i+Size;                            /*上层为0~999，下层为1000~1999*/  /*			    a=Lower_degree[j]; 				Lower_degree[j]=Lower_degree[i]; 				Lower_degree[i]=a; 			} 		} 	}  	///////////////sort////////////////// 	 	//////////////connect///////////////协同耦合//////////////  	int Num_connect = B*Size; 	for(i=0; i<Num_connect; i++){ 		network[sort1[i]][sort2[i]]=network[sort2[i]][sort1[i]]=1; 	} } */


Question: 关于冒泡排序的程序该如何编写

好的，我去找找看，非常感谢你

冒泡排序和折半搜索网上随便搜一个都有源代码，自己找个学学吧


Question: 折半查找

折半查找的前提是，数据是已经排序好的，并且是按照从小到大排序的（根据你的折半查找的算法）


Question: 请求哪位大哥看看，十分急啊啊啊！为什么我的m没有初始化？？？

int Query_a_record(Bookinfo dictList[],int n) {     int i;     Bookinfo *m;      m = (Bookinfo *)malloc(sizeof(Bookinfo));     if (!m)         exit(0);     gets((*m).book);     if((i=Query(dictList,n,m))>0)         printf("Up to %d record(s)\n",i);     else         printf("No records\n");     free(m); }  供参考！  m是野指针，不能直接使用。可以考虑用malloc或者直接定义结构体变量。

Bookinfo *m; 这个语句并没有初始化，m指向一个野指针，要么new一个堆上的对象，要么就声明一个栈上创建对象Bookinfo m。


Question: 求助操作系统进程同步

算法解决？有现成的api或是类专门解决线程同步问题？难道你想自己写算法来实现那些控制同步的API或是类？那就得看他们的源码了


Question: 进制转换

void binary(int n) {     if (n / 2)         binary(n/2);     printf("%d", n % 2); }  二进制，供参考！

问题呢？你是来展示代码的吗？


Question: 使用C如何获取windows当前运行的应用程序(而非所有进程)

搜类似任务管理器的开源项目。

用现成的API或是当前系统的进程快照，进而获取每个进程的名称

cmd的tasklist命令不知道可不可以帮到你


Question: 窗口类样式中的重绘窗口是不是达到条件发送PAINT消息？

要想了解本质，最靠谱的办法是看对应源代码。


Question: 大神帮我看看问题出现在哪里？？

引用 4 楼 weixin_44702971 的回复:[quote=引用 3 楼 weixin_44702971的回复:]我想知道这个程序为什么输入非数字就会结束循环 哪个大佬帮忙解释一下 求回复 求回复 求回复[/quote]   scanf（） 所要获取得时 %d 也就是整数，输入错误自然会结束啦

引用 3 楼 weixin_44702971的回复:我想知道这个程序为什么输入非数字就会结束循环 哪个大佬帮忙解释一下 求回复 求回复 求回复

我想知道这个程序为什么输入非数字就会结束循环 哪个大佬帮忙解释一下

%ld和%1d的区别。如果是自己手动输入的代码，那么需要注意下是l而不是1

你两个scanf里是“%ld”写成了“%1d”，字母l变成了数字1，导致的后果是，你每次输入只取了1位数字，那么没读取完的下次循环时就会自动读取，所以你输入121，第一次只读取百位的1，剩下“21”没读，所以又自动循环了两次，所以你倒数第二行有出现3次。而最后是结果其实就是每个位的数相加：4+4+3+3+8+8+1+2+1=34。


Question: c语言如何后台起个服务偷偷倒计时，时间一到自动关机呢？

哇，100分，非常感谢呀

引用 7 楼 六道佩恩的回复:我给你写三个例子。 第一个例子是bat脚本，也就是你新建一个txt文本，写如下代码，然后保存，修改后缀为.bat，双击运行即可。  set /p time=分钟数： set /a t=%time%*60 shutdown -t %t% -s   第二个例子是C语言使用shutdown自己的延时功能：  #include "stdio.h" int main( void ) { 	char cmd[200]={0}; 	int t=0; 	printf("多少分钟后关机:"); 	scanf("%d",&t); 	sprintf( cmd, "shutdown -t %d -s", t*60 );  	system(cmd); 	return 0; }   第三个例子是用C语言延时：  #include "stdio.h" #include "windows.h" int main( void ) { 	int t=0; 	printf("多少分钟后关机:"); 	scanf("%d",&t); 	Sleep(t*60*1000); 	system("shutdown /s");	//前面说错了，/s才是关机，/a是取消关机  	return 0; }  好的，谢谢，晚点我试一下

引用 4 楼 636f6c696e 的回复:bat文件写个服务shutdown -s就好了 windows下当然用bat啊

引用 7 楼 六道佩恩 的回复:我给你写三个例子。 第一个例子是bat脚本，也就是你新建一个txt文本，写如下代码，然后保存，修改后缀为.bat，双击运行即可。  set /p time=分钟数： set /a t=%time%*60 shutdown -t %t% -s   第二个例子是C语言使用shutdown自己的延时功能：  #include "stdio.h" int main( void ) { 	char cmd[200]={0}; 	int t=0; 	printf("多少分钟后关机:"); 	scanf("%d",&t); 	sprintf( cmd, "shutdown -t %d -s", t*60 );  	system(cmd); 	return 0; }   第三个例子是用C语言延时：  #include "stdio.h" #include "windows.h" int main( void ) { 	int t=0; 	printf("多少分钟后关机:"); 	scanf("%d",&t); 	Sleep(t*60*1000); 	system("shutdown /s");	//前面说错了，/s才是关机，/a是取消关机  	return 0; }  我感觉还是第一个例子好一点

https://baijiahao.baidu.com/s?id=1610647687331441438&wfr=spider&for=pc 定时任务+shutdown就好了

bat文件写个服务shutdown -s就好了

sleep+shutdown?

要自己写？现在很多软件不都有家长控制的功能吗？

不如装个家长控制类的软件，类似的太多了

C语言的话，用system函数调用shutdown命令，如system("shutdown /a")      至于延时，shutdown本身就是设定多久后关机的功能，你也可以通过Sleep函数来延时，头文件windows.h，单位为毫秒，如Sleep(100)表示延时100毫秒


Question: 应该是42啊

printf("%d",41);又不是printf("%d",*p); 楼主赶紧别做这些题了，一堆垃圾题目，就像微博上很火的猴子+香蕉等于多少，有啥意义？

printf直接打印的41，没有用到p，玩的文字游戏而已


Question: 我咋就找不到正确候选项呢？

可以结贴了，楼上说的很明确。

楼上已经把过程说的很清楚了，arr[1]能++为啥a不能++了么？脑子要转得快一点哈

第一句：arr[1]自增后赋值给a，a是2，arr[1]成了2； 第二句：arr[1]赋值给b后自增，b是2，arr[1]成了3； 第三句：arr[a]赋值给c后，a自增，c是9，a成了3.  补充： ++x：先给x加一， x++：先计算x，然后给x加一


Question: 为什么不是world？

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

printf("%s %s", str1, str2); 这样才能打出hello world。 话说这种题目也是蛋疼，参数和格式化字符串不匹配是很容易出现问题的写法

只有一个%s，那么打印前面的str1，后面的str2被忽略了

因为只给了一个%s，而且匹配是从左往右

因为参数是从左边开始匹配不是从右边啊


Question: 创建窗口时指定实例句柄有什么用？

使用Spy++可以查看所有窗口的从属关系。

引用 1 楼 赵4老师 的回复:因为不同的实例句柄可以拥有同一个窗口？ 如果指定实例句柄为NULL，那么窗口是归注册该窗口类的实例所有吗？我用BUTTON类创建一个窗口，自己是仍然可以检测到窗口的消息的，请问这是怎么回事？

创建窗口的函数CreateWindow()的倒数第二个参数hInstance，其类型为HINSTANCE，即实例句柄类型。该参数的含义是 A handle to the instance of the module to be associated with the window. 与创建的窗口相关联的模块实例的句柄。该函数的参数实际上来自入口函数WinMain()的第一个参数，该参数的含义是 第一个参数hInstance表示该程序当前运行的实例的句柄，这是一个数值。当程序在Windows下运行时，它唯一标识运行中的实例（注意，只有运行中的程序实例，才有实例句柄）。一个应用程序可以运行多个实例，每运行一个实例，系统都会给该实例分配一个句柄值，并通过hInstance参数传递给WinMain函数。 hInstance是区分一个应用程序的多个实例的。

引用 3 楼 六道佩恩 的回复:[quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例

引用 12 楼 user-3 的回复:貌似win32下,这个值意义不大了,因为系统不需要用这个来区分一个应用程序的多个实例  也就是说平时设为NULL就可以了吗？ 也就是说，像创建BUTTON窗口这种，系统也是知道我们的我们的实例句柄的是吧？ 那么，其他实例注册的类，我们用的时候实例句柄设为NULL也没问题吗？ 抱歉，我的问题有点多，我主要就是想搞清楚

引用 11 楼 六道佩恩 的回复:[quote=引用 9 楼 user-3 的回复:] 可能只运行了你这个app的一个实例把 这里有篇文章 https://blog.csdn.net/ljabclj/article/details/42520065 这篇文章我看过，当时只注意到注册全局类哪里，现在看的话，好像跟我们说的有点出入啊，文章里说的指定实例句柄是用来找到窗口类，但刚才我们说的是窗口归哪个实例所有啊，，，，而且我刚刚的问题是，，这个BUTTON应该是系统的实例所注册的类，而我用BUTTON创建窗口未指定实例句柄的话，那这个窗口岂不是归系统实例所有？[/quote]  貌似win32下,这个值意义不大了,因为系统不需要用这个来区分一个应用程序的多个实例

引用 9 楼 user-3 的回复:可能只运行了你这个app的一个实例把 这里有篇文章 https://blog.csdn.net/ljabclj/article/details/42520065 这篇文章我看过，当时只注意到注册全局类哪里，现在看的话，好像跟我们说的有点出入啊，文章里说的指定实例句柄是用来找到窗口类，但刚才我们说的是窗口归哪个实例所有啊，，，，而且我刚刚的问题是，，这个BUTTON应该是系统的实例所注册的类，而我用BUTTON创建窗口未指定实例句柄的话，那这个窗口岂不是归系统实例所有？

也有这样的回答 引用HINSTANCE是exe映像的虚拟地址，HINSTANCE用于区分进程实例仅限于没有隔离进程地址空间的16位windows，现在的windows每个进程有自己的地址空间，两个进程的同一个地址可以是不同的东西，此时HINSTANCE不再具有唯一标识运行中的实例的功能

引用 8 楼 六道佩恩 的回复:[quote=引用 7 楼 user-3 的回复:] [quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例[/quote]  用系统控件类创建一个窗口，instance指定为NULL，为什么也能收到消息？按理说这是系统注册的呀[/quote]  你创建的是自己的窗口上的子窗口吗[/quote] 子窗口和非子窗口都试过 比如CreateWindow（“BUTTON”，“ABC”，0,0,0,0,0，NULL，NULL，NULL， NULL）这样直接创造一个只有按钮的重叠窗口，或者指定控制台窗口为父窗口，这样也都是可以获取到消息的，但是我没指定实例句柄[/quote]  可能只运行了你这个app的一个实例把 这里有篇文章 https://blog.csdn.net/ljabclj/article/details/42520065

引用 7 楼 user-3 的回复:[quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例[/quote]  用系统控件类创建一个窗口，instance指定为NULL，为什么也能收到消息？按理说这是系统注册的呀[/quote]  你创建的是自己的窗口上的子窗口吗[/quote] 子窗口和非子窗口都试过 比如CreateWindow（“BUTTON”，“ABC”，0,0,0,0,0，NULL，NULL，NULL， NULL）这样直接创造一个只有按钮的重叠窗口，或者指定控制台窗口为父窗口，这样也都是可以获取到消息的，但是我没指定实例句柄

引用 6 楼 六道佩恩 的回复:[quote=引用 4 楼 user-3 的回复:] [quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例[/quote]  用系统控件类创建一个窗口，instance指定为NULL，为什么也能收到消息？按理说这是系统注册的呀[/quote]  你创建的是自己的窗口上的子窗口吗

引用 4 楼 user-3 的回复:[quote=引用 3 楼 六道佩恩 的回复:] [quote=引用 2 楼 user-3 的回复:] 一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？[/quote]  是的,不然操作系统不知道要把消息派发给哪个实例[/quote]  用系统控件类创建一个窗口，instance指定为NULL，为什么也能收到消息？按理说这是系统注册的呀

因为不同的实例句柄可以拥有同一个窗口？

引用 2 楼 user-3 的回复:一般都是设为NULL吧,这样实例句柄默认是注册窗口类时用的实例句柄 但是如果这个窗口是别的地方注册的,你的代码内要创建这个窗口 那么要手动指定自己的实例句柄 也就是说指定实例句柄就是在说这个窗口归哪个实例是吧？


Question: 为什么这个编译没错，调试没错，就是当运行就出错， 求大佬解答，万分感谢

vs调试下看看出错在哪一行


Question: 程序运行两次，GetModuleHandle获取的实例句柄是哪一个的？

引用 7 楼 陆寻禹 的回复:[quote=引用 4 楼 棉猴 的回复:] Retrieves a module handle for the specified module. The module must have been loaded by the calling process. 这个模块必须是被调用进程所导入的模块。那如果存在不同路径的同名模块呢[/quote]完整路径相同才算同一模块，不同路径当然是不同模块了，此时还谈什么同名，没有意义。

引用 4 楼 棉猴 的回复:Retrieves a module handle for the specified module. The module must have been loaded by the calling process. 这个模块必须是被调用进程所导入的模块。那如果存在不同路径的同名模块呢

引用 3 楼 六道佩恩 的回复:这里并没有答案 资料均来自微软同一页面。两句话表达类似的意思，说法不同而已： https://technet.microsoft.com/en-us/ms683199.aspx引用The module must have been loaded by the calling process. 必须是调用进程已加载的模块引用The name is compared (case independently) to the names of modules currently mapped into the address space of the calling process. 该名称好比是映射到调用进程空间的模块名称（不区分大小写） 虽然这里的 compared to 有些难理解，不过能明白想表达的意思是说必须是当前进程的模块名。 多查 MSDN 就都知道了。

引用 4 楼 棉猴 的回复:Retrieves a module handle for the specified module. The module must have been loaded by the calling process. 这个模块必须是被调用进程所导入的模块。 哦哦，谢谢，你的回答很给力。

引用 2 楼 贾可 的回复:SyntaxHMODULE WINAPI GetModuleHandle(   __in_opt  LPCTSTR lpModuleName );Parameters lpModuleName The name of the loaded module (either a .dll or .exe file). If the file name extension is omitted, the default library extension .dll is appended. The file name string can include a trailing point character (.) to indicate that the module name has no extension. The string does not have to specify a path. When specifying a path, be sure to use backslashes (\), not forward slashes (/). The name is compared (case independently) to the names of modules currently mapped into the address space of the calling process. If this parameter is NULL, GetModuleHandle returns a handle to the file used to create the calling process (.exe file). 这里并没有答案

最后运行的那个，我猜。


Question: C语言编写程序加注释

C 语言里可以有两种注释方式：/* */ 和//。 注意：/*…*/这种形式的注释不能嵌套。

引用 1 楼 jsx_SEVEN的回复:我觉得程序就是把人做的过程写出来，先想一下人做的时候会怎么做，先写人的做法(注释)，再写代码。 比如第二题，首先肯定需要两个字符数组，然后是给数组s2赋值，然后复制到s1，然后打印一下s1. 文件名应该做到见名知义，可以起个Copy.c，想让第一次看到代码的人就能知道代码的功能，可以在前面加上题目。头文件、主函数这些的注释可以省略。   //编写程序，将字符数组s2中的全部字符复制到字符数组s1中。  //头文件 #include <stdio.h>  //主函数 int main() { 	//声明两个字符数组s2,s1 	char s2[100], s1[100];  	//给s2赋值 	gets(s2); 	 	//复制到s1 	strcpy(s1, s2);  	//打印s1 	puts(s1); 	 }  感谢🙏我会好好学习的

伸手党别吹牛逼了，从没听说只会写程序不会加注释的。 你如果真心不会加注释，把你的代码发出来，我们来帮你们加注释。


Question: 能麻烦你们帮我看眼为啥运行结果不对吗

引用 2 楼 北言净 的回复:嗯嗯好的，你们平时写程序是直接写还是在草稿纸上拟好思路再上机调试  像这种题目，边看题目就可以一边写代码了，写完运行一下，错了加断点调试马上就能找出，没必要打草稿，如果稍微比较复杂的问题，就需要首先有一个全局的思路，是需要提前拟好思路的，再难一点的，就需要问专业人士了

嗯嗯好的，你们平时写程序是直接写还是在草稿纸上拟好思路再上机调试

问题在于faHeight,moHeight是float类型，scanf时用%d接收 而且你的程序逻辑错误不少，好好检查下吧，比如M是代表男性，你的程序搞反了


Question: 小白求助

引用 2 楼 雨过丶天阴 的回复:[quote=引用 1 楼 user-1的回复:]最简单的，遍历一下就可以了呀 萌新刚学c语言数据结构，求源码[/quote] 就用一个循环，然后循环里面判断是x就换成y这样子，没有具体的题目还真不知道怎么编合适如果对循环也不太熟悉的话，建议先学一下C语言

引用 1 楼 user-1的回复:最简单的，遍历一下就可以了呀 萌新刚学c语言数据结构，求源码

最简单的，遍历一下就可以了呀


Question: VS2015下C语言如何导出动态链接库

VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

应该没有问题 那些是c++运行库,depends找不到它们路径而已 你可以创建个exe调用这个dll看看


Question: 简单的电梯模拟系统，哪位大佬能给提示啊？

C语言怎么创建.h文件啊，在线等

引用 5 楼 636f6c696e的回复:先自己写下状态机图 输入：电梯内按键、电梯外按键 状态：电梯运行状态（停止/开门/关门/上升/下降） 输出：当前所在楼层 我的C其实不好

引用 3 楼 傲梅虚竹 的回复:[quote=引用 1 楼 六道佩恩的回复:]电梯上升下降用输出文字来表示吧，关键在于在任何时候都有可能被按下电梯按钮，然后就看你怎么处理了。像电梯上升下降过程都不用管，到了楼层后，开启和关闭电梯门（显示文字）就不用说了，再开始运行时这时再判断一下按钮状态应该就差不多了，管它中间有没有新增或取消，判断这个时候的按钮状态就行了，按钮就用个数组表示吧。 怎么考虑捎带呢？比如第一次按的按钮是15楼，但是在上升的过程中，又加了一个新楼层10楼，怎样让电梯在10楼停了又继续向上[/quote] 你要考虑下减速过程大概有多长距离，比如从开始减速到完全停止需要1.5楼的距离，那么在8楼时检测到10楼被按就可以设定在10楼停，如果在8楼时检测到10楼没被按下，继续上升，而到9楼时发现10楼被按下了，那么就不管，因为现在刹车也来不及了，10楼就在下降过程中再停了。     简单点的话，你就可以像我说的这样每到一个楼层了再判断按钮的状态（每次循环一遍接收一次输入然后判断），，，，如果要写得好点的话，可以模拟个速度、加速度、高度，然后没0.1秒判断一次，，，大概这样

引用 1 楼 六道佩恩的回复:电梯上升下降用输出文字来表示吧，关键在于在任何时候都有可能被按下电梯按钮，然后就看你怎么处理了。像电梯上升下降过程都不用管，到了楼层后，开启和关闭电梯门（显示文字）就不用说了，再开始运行时这时再判断一下按钮状态应该就差不多了，管它中间有没有新增或取消，判断这个时候的按钮状态就行了，按钮就用个数组表示吧。 怎么考虑捎带呢？比如第一次按的按钮是15楼，但是在上升的过程中，又加了一个新楼层10楼，怎样让电梯在10楼停了又继续向上

int a   //电梯当前位置  input int b   //电梯外人按钮的位置 input int c  //想要去的楼层  a<b  那么  一个一个加1往上跳，到达位置，显示停止，当输入C的时候，由C和B比较，再跳数字。


Question: 建立线性表，时而成功，时而非正常退出Process exited with return value 3221225725

删除重复结点函数又出了问题，下面是该函数及测试代码 #include"stdio.h" #include"stdlib.h" #include"malloc.h" struct digit { 	int number; 	int type; 	struct digit *next; };  struct digit * Create() { 	int i, numb, ty = 0, n=20; 	printf("请输入顺序线性表的元素个数n："); //	scanf("%d", &n); 	printf("20\n"); 	struct digit *head = NULL;//生成头结点 ,用头指针head指向头结点  	if ((head = (struct digit *)malloc(sizeof(struct digit))) == NULL)	//分配了一个不存放有效数据的头结点  		{ 			printf("不能成功分配头结点!!\n"); 			exit(0); 		} 	struct digit *p2 = head;//永远指向尾结点 ，初始状态先赋头结点给它  	p2->next = NULL; //尾结点指针指向NULL  	struct digit *p1 = NULL; 	for (i = 1; i <= n; i++)	//循环一：建立n个结点的链表 	{	//开辟一个新结点 		if ((p1 = (struct digit *)malloc(sizeof(struct digit))) == NULL)	//分配n个int型储存块返回首地址 		{ 			printf("不能成功分配储存块!!\n"); 			exit(0); 		} 		numb=i%4+1; 		p1->next = NULL;	//令新结点指针域为NULL 		p1->number = numb;	//赋 		p1->type = ty; 		p2->next = p1;	//值，表尾链入新结点 		p1->next = NULL; 		p2 = p1;	//p2指向新的表尾结点 	} 	return head; }  struct digit * Deletesame(struct digit * head) { 	struct digit * p1=head,* p2=head,* p3=head; 	p1=p1->next; 	for(;p3->next!=NULL;) 	{ 		for(;p1!=NULL;) 		{ 			if(p3->number==p1->number)	//符合删除条件 			{ 				 				p2->next=p1->next; 				free(p1); 			//	p2=p2->next; 				p1=p2; 				p1=p1->next; 			} 			else 			{ 				p2=p1; 				p1=p1->next; 			} 		} /*		if(p3->number==p1->number)	//检测最后一个 		{ 			p2->next=NULL; 			free(p1); 			p1=NULL; 		}*/ 		p3=p3->next;	//完成一个数字的删除重复值，p3指向下一个数字 		p1=p3;p2=p3;	//p1、p2重新指向p3 		printf("ok\n");	 		p1=p1->next;	//p1往后移动1次，之后可以再次比较 	} 	return head; } void Print(struct digit * head) { 	struct digit * p = head;	//定义p指针指向链表第一个结点 	printf("	%-5s	  %-5s\n", "数值", "类型"); 	p = p->next; 	while (p != NULL) 	{ 		printf("	%-5d	 ",p->number); 		if(p->type==0)printf(" 素数\n"); 		else printf("非素数\n"); 		p = p->next;	//指向下一个节点 	} } void main() { 	struct digit * head; 	head = Create(); 	Print(head); 	head = Deletesame(head); 	printf("删除后：\n"); 	Print(head);  }  p3用于遍历链表；p1用于遍历p3后面的结点；p2用于追踪p1，方便删除结点。结果这个函数跳不出循环了。。。

引用 5 楼 weixin_45007129 的回复:在外面定义一次指针变量，后面在循环里面逐次分配新的内存空间，并不矛盾啊。对对对我就是这个意思，没表达好

在外面定义一次指针变量，后面在循环里面逐次分配新的内存空间，并不矛盾啊。

谢谢！我自己解决啦~因为代码不是我写的是同学有错误不懂来问我，我急着回复没仔细看，今天花了一个小时才找出错误~~就是要在循环外定义p2（尾结点指针），不过p1是新建结点，每建一个分配一次空间给它，所以还是在for循环内定义~~感谢大佬！！！

（1）没见过这样的素数判定条件，素数的定义说的就是只有1和它本身这两个因数而已，为啥还有 m * n == numb 呢？ （2）指针 p1 、p2 定义在循环一内部，也就是说，每次进入循环一，就重新定义了两个指针变量 p1 、p2，但是又只给 p1 分配了内存空间，而没有给 p2 分配内存空间，所以从第二次的循环一开始， p2->next 就是非法的了。所以，应该把 p1 、 p2 的定义 放到循环一的前面，就跟 head 的定义 放在一起就可以了。 （3）循环二的循环，理论上存在变量 j 超出 int 的取值范围而导致循环意外退出的可能， 所以 死循环的话，建议使用 while(1)。 具体内容详见注释，自己也调试一下，看看程序运行过程中各个变量的值的情况吧。  int is_prime(int p);  struct digit *create_link_table() { 	int i, numb, j, m, ty = 0, n, nx; 	printf("请输入顺序线性表的元素个数n："); 	scanf("%d", &n); 	struct digit *head = NULL;  	// 在循环一的外面定义p1、p2 	struct digit *p1 = NULL, *p2 = NULL;  	for (i = 1; i <= n; i++) //循环一：建立n个结点的链表 	{ //开辟一个新结点 		                 //struct digit *p1 = NULL, *p2 = NULL; 		                 if ((p1 = (struct digit *)malloc(sizeof(struct digit))) == NULL) //分配n个int型储存块返回首地址 		{ 			printf("不能成功分配储存块!!\n"); 			exit(0); 		} 		p1->next = NULL; //令新结点指针域为NULL 		                 // 要用死循环的话，建议使用while(1)， 		// 下面这样的for循环，变量 j 的值有可能溢出而导致意外退出循环 		//for (j = 1; j > 0; j++) //循环二：给链表随机赋值 		while (1) { 			srand(time(NULL)); 			numb = rand() % 100001; 			if (numb >= 100 && numb <= 100000 && numb % 2 == 1) //判断是否符合100~100000、奇数 			{ 				// 判断 numb 是否为素数                                 if (is_prime(numb)) { 					p1->number = numb; 					p1->type = 1; 				} else { 					continue; 				}  				/*                                 for (m = 3; m < numb; m += 2) //循环三：判断是否为素数 				{ 					// 把元素个数变量 n 改变了，影响了循环一的条件                                         // 定义新变量 nx 					for (nx = m; m < numb; nx += 2) //循环四 					{ 						// 这是素数么？！ 						if (m * nx == numb) //若为素数，保存ty为1，跳出循环四 						{ 							ty = 1; 							break; 						} 					} 					if (ty == 1) 						break; //跳出循环三 				}                                  				p1->number = numb; //赋 				p1->type = ty;                                 */  				if (i == 1) 					head = p1; 				else 					// 每次都在循环一内部重新定义p2，但是却没有给p2分配内存空间 					p2->next = p1; //值，表尾链入新结点 				p2 = p1; //p2指向新的表尾结点 				break; //赋值成功,重新进行循环一 			} else 				continue; //随机数不符合条件，重新赋值 		} 	} 	printf("建立顺序线性表成功！\n"); 	return head; }  // 检查 p 是否为素数 int is_prime(int p) { 	if (p < 2) 		return 0;  	if (p > 2 && p % 2 == 0) 		return 0;  	int i; 	for (i = 2; i < p; i++) { 		if (p % i == 0) 			break; 	} 	if (i == p) { 		return 1; 	} else { 		return 0; 	} }


Question: 编写简单的Arduino接收串口命令的函数，在PC端分别发送字符”A”,”B”,”C”能够控制LED显示三种不同亮度。

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

需要对abc进行清空

根据LED这种东西的伏安特性，惯例都是使用PWM调整亮度的，而不是调整电压。

打断点看下判断有没有进啊，实在不行printf 或者cout点信息也行啊。

不是字符，是字符对应的ASCII，a=97，b=98，c=99；abc=这三个值


Question: 大佬们，这个代码哪里有错，为啥生成不了

你这人怎么可以这么恶毒，居然噌我家坤坤热度，哇好恶心，goto这个关键字最好不要用吧，不安全，最好还是老老实实写成函数调用

我用的是VS2017，运行成功了，还把每个选项挨个输了一次，。

多定义几个变量吧，一个a不够用。。而且一堆goto真的晕。

报错信息是什么。。。你只给代码我怎么都知道，还有别用这么一大堆的goto跳来跳去

小心人家给你寄律师函。哈哈哈哈。

求大佬们帮帮，在线等


Question: C语言求最大值，哪里错了。急

引用 1 楼 weixin_45007129的回复:scanf的里面的格式化字符串是什么样子，输入的时候就怎么输入。 你应该输入的是【1,2】，框起来的内容，别漏掉了代码里的英文半角逗号。 好了＾０＾~，谢谢大佬。一直没发现这个错误


Question: 各位大神帮我看看这个程序哪有错（十六进制转八进制）

引用 3 楼 自信男孩的回复:#include<stdio.h> #include<math.h> #include<string.h> #include<stdlib.h>  typedef struct yu{     int data;     struct yu *next; }yu;  yu *Create_yu(int a,yu *head)//顺序存储八进制数 {     yu *p;     p = (yu *)malloc(sizeof(yu));     p->data = a;     p->next = head->next;     head->next = p;     return (head); } void output_yu(yu *head)//输出八进制数 {     yu *p;     //p=head;     p = head->next;     //while(p->next!=NULL)     while(p)     {         //printf("%d",p->next->data);         printf("%d",p->data);         p = p->next;     }     printf("\n"); } int main() {     int i,j,m;//循环变量     int n,l,L,shi/*十进制数*/,scm/*十进制幂*/,shang,a/*把十六进制每一位转换为整数*/;     //char str[100000];    //你确定要输入这么多字符吗？并且还在栈上申请     char str[128];     scanf("%d",&n);     for(i=0;i<n;i++)     {         shi=0;         scanf("%s",str);         l=strlen(str);         scm = l-1;         for(j=0;j<l;j++)         { //转换为十进制             if(str[j]>='A'&&str[j]<='F')                 a = str[j]-'A'+10;             else if(str[j]>='a'&&str[j]<='f')                 a=str[j]-'a'+10;             else if(str[j]>='0'&&str[j]<='9')                 a = str[j]-'0';             shi += a*pow(16,scm);             scm--;         }         //转换为八进制         yu *head;         int x;         shang=shi;         head=(yu *)malloc(sizeof(yu));         head->next=NULL;         do {    //解决输入0，而没有任何输出的问题             x = shang%8;             head = Create_yu(x,head);             shang = shang/8;         } while (shang);         /*         while(shang!=0)         {             x = shang%8;             head = Create_yu(x,head);             shang = shang/8;         }         */         output_yu(head);     }     return 0; }  供参考！ 对，好像就这个问题，谢了

引用 1 楼 user-2 的回复:我跑了一下，没错，唯一发现的问题是当输入0的时候，程序出现死循环了 不是死循环，而是没有输入。你继续输入还是有数据的

我跑了一下，没错，唯一发现的问题是当输入0的时候，程序出现死循环了


Question: virtual C艹 2010编译错误，这是什么原因？

题目打错了是visual


Question: 对十个整数按从大到小顺序进行选择法排序为什么结果会出现-858993460

if(i!=Pos) tmp=Num[i],Num[i]=Num[Pos];Num[Pos]=tmp;   第二个 表达式的后面 应该是 「逗号」 ， 写成了「 分号」， 那么 第三个 表达式 就不是 if 底下的 语句块的一部分了。   「强烈建议」还是 用 通常的 花括号 来 包括 语句块， 语句也写成用 分号 来 分隔的形式， 避免 这种 使用 逗号 取巧 反而 让人 看不清 代码的情况。  如有帮助，烦请及时 结帖 、 给分 ！ ：）

没有理解选择排序，下面漏了一个花括号，两个if应该是并列的  for (i = 0; i < SIZE - 1; i++) 	{ 		Pos = i; 		for (j = i + 1; j < SIZE; j++) { 			if (Num[j] < Num[Pos]) 				Pos = j; 			if (i != Pos) 				tmp = Num[i], Num[i] = Num[Pos]; Num[Pos] = tmp; 		} 	}


Question: 问一个C语言数组问题

最粗暴的方法，第一位和最后一位已经确定，嵌套6层for循环可以找到这样的数字，另外可以用搜索算法（回溯深搜）求解，但你得把你的题目再描述清楚一点


Question: 关于c语言 base64编码问题，求大佬们帮忙看看

Znh4a3lvdWJhc2U2N 是解不出来fxxkyoubase64,因为最后少了一个字符 至少也要Znh4a3lvdWJhc2U2NA 最后的==是填位用的,没有实际作用 你需要明白base64原理,就是把3字节的任何字节流,转化为4字节的可打印字符(256->64的映射,8位对应6位) 如果编码后,长度不是4字节的倍数,就用=填充


Question: 小白求助，多元不等式整数解求发

由于数据量不是很大（21^4），可以用暴力法  #include<stdio.h> int main() { 	int a, b, c, d; 	for (a = 120; a <= 140; a++) { 		for (b = 120; b <= 140; b++) { 			for (c = 120; c <= 140; c++)			{ 				for (d = 120; d <= 140; d++) 					if (a + b + c + d >= 550) { 						printf("a=%d b=%d c=%d d=%d\n", a, b, c, d); 					} 			} 		} 	} 	return 0; }


Question: 关于二维字符数组的使用，求大佬看看我的代码哪错了。

引用 3 楼   狂浪生 的回复:谢谢大佬，请问一下怎么给分我刚用csdn，没看到按钮  不用客气。顺便提一下，上面的代码没有针对输入的整数进行有效性检测，你可以自己加上，比如scanf 输入的数到底是不是整数、输入的整数是不是小于1。按道理，严密一点的话，还需要检测一下。除非题目本身确保了不会输入无效值。  电脑上，浏览器打开自己的帖子，可以结帖、给分，手机app不行。

引用 2 楼 拥抱Linux的回复:调试了一下，改了一个代码出来，如下：  #include <stdio.h> // 编译的时候要添加 -lm 参数，嫌麻烦，不用ceil函数 // #include <math.h> #include <string.h>  int main(void) { 	char str[1000]; 	int n, c, count, len, i = 0; 	// 从右到左、从上到下，每列n个字符，也就是n行 	scanf("%d", &n); 	getchar(); 	scanf("%[^\n]", str); 	len = strlen(str); 	// 计算出列数 	//c = ceil((double)len / n); 	if (len % n != 0) { 		c = len / n + 1; 	} else { 		c = len / n; 	}  	char Nstr[n][c];         // 后面输出需要用到列数 	int cj = c;  	while (c > 0) { 		for (count = 0; count < n; count++) { 			// 原始字符串不能填满数组时，末尾补空格                         if (str[i] != '\0') { 				Nstr[count][c - 1] = str[i]; 				i++; 			} else { 				Nstr[count][c - 1] = ' '; 			} 		} 		c--; 	}  	for (i = 0; i < n; i++) { 		//puts(Nstr[i]); 		for (int j = 0; j < cj; j++) { 			printf("%c", Nstr[i][j]); 		} 		printf("\n"); 	}  	return 0; }  Linux平台，编译，测试运行截图：   至于你上面的代码的问题，因为俺基本上不使用 gets 、 puts 函数，所以只能通过百度了解了一下 它们的用法。 问题主要是出在使用 puts 函数吧，它是按字符串来输出的，也就是 遇到 '\0' 这个字符串的结尾字符才停止输出。 当然，你上面的代码在为 Nstr 数组赋值的时候，末尾没有补空格也是一个遗漏。  上面的代码你先运行试试看看吧。并帮助的话，烦请及时结帖给分。：） 谢谢大佬，请问一下怎么给分我刚用csdn，没看到按钮

而且这个Nste[0]长度也不正常，我用strlen测出来的长度是错的


Question: MSG结构体里的时间是什么？

为何不查msdn而是自己试呢？

引用 10 楼 真相重于对错 的回复:先去找下 c 的关于时间的类型比如 time_t __time32_t 还有关于时间的函数 比如 time() localtime() asctime() 等。。。。  你说是这？这些都是库函数一类的吧，所得到的时间要么是1970年以来的，要么是运算以来的CPU时间，跟WIndows API的函数还是很不同的。。。。。。

引用 8 楼 真相重于对错 的回复:[quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 5 楼 真相重于对错 的回复:] 为何不查msdn而是自己试呢？ 你为什么不查查MSDN是怎么写的？关于time成员，MSDN是一笔带过的。[/quote] 还有只查msg struct 里面的time成员，说明你还不会查MSDN[/quote] 额，请说说怎么查，我觉得除非事先知道这种DOWRD时间所归类的文档，否则仅凭一个DOWRD类型和一个时间概念我觉得没啥头绪

引用 6 楼 六道佩恩 的回复:[quote=引用 5 楼 真相重于对错 的回复:] 为何不查msdn而是自己试呢？ 你为什么不查查MSDN是怎么写的？关于time成员，MSDN是一笔带过的。[/quote] 还有只查msg struct 里面的time成员，说明你还不会查MSDN

引用 6 楼 六道佩恩 的回复:[quote=引用 5 楼 真相重于对错 的回复:] 为何不查msdn而是自己试呢？ 你为什么不查查MSDN是怎么写的？关于time成员，MSDN是一笔带过的。[/quote] 又不是我要提问，为何我要查？

引用 5 楼 真相重于对错 的回复:为何不查msdn而是自己试呢？ 你为什么不查查MSDN是怎么写的？关于time成员，MSDN是一笔带过的。

引用 3 楼 zgl7903 的回复:就是系统启动的时间， 可以和GetTickCount对比下， 估计你测试的关机只是系统休眠了，而非正真意义上的关机  // 主消息循环: while (GetMessage(&msg, NULL, 0, 0)) {   TCHAR szMsg[128];   _stprintf_s(szMsg, _T("Msg.time=%u GetTickCount()=%u\r\n"),       msg.time,  GetTickCount());   OutputDebugString(szMsg);    if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))   {     TranslateMessage(&msg);     DispatchMessage(&msg);   } } 点的windows提供的“关机”，这不算真正的关机吗？

引用 1 楼 user-4 的回复:一般DWORD时间是1900年到当前的毫秒数 如果是1900年到现在，DWORD里只能存秒数，存毫秒早就超了，1000*3600*24*365*100=........已超万亿。。。。况且按试验的结果来看，跟1900貌似没有任何关系

一般DWORD时间是1900年到当前的毫秒数


Question: 是三目运算符么？

是 三目运算符 或者叫 三元条件运算符 。  以下内容摘引自百度百科三目运算符词条： <表达式1> ? <表达式2> : <表达式3>;  "?"运算符的含义是：先求表达式1的值，如果为真，则执行表达式2，并返回表达式2的结果；如果表达式1的值为假，则执行表达式3，并返回表达式3的结果。 可以理解为条件 ? 结果1 : 结果2 里面的？号是格式要求。也可以理解为条件是否成立，条件成立为结果1，否则为结果2。  所以，无论是对于 c=b>a? a:b 还是 c=b/a? a:b 按照三目运算符或者叫三元条件运算符的定义去套用就可以了。  说得再具体一点就是，对于表达式「 b > a」 来说，它的返回值 或者 结果 也不是直白地告诉程序 「b 大于 a」或者「b 不大于 a」，而是返回 「1」或者「0」，也就是「真」或「假」。同样地，对于表达式「 b / a 」，它的返回值也不是告诉程序 「 b 对 a 取余等于多少」，而是返回「非零的一个数」或者「0」，也就是「非假 == 真」或「假」。这就是从形式上看， 这里的条件表达式 无论是「 b > a」还是 「b / a 」都无所谓的原因。  如果喜欢的话，条件表达式 写一个比如 「 a 」或者 「 b 」或者 「 a + b 」 或者 「 a - b 」或者 「 a % b 」等等都可以，看表达式的返回值是什么就行了。万变不离其宗。

C语言中非0为真，0为假，而三目操作符？：的规则是这样的 result=a？b：c相当于 if(a) result=b;  else result=c; 只要a非0，结果result就等于表达式b的结果

A = B ? C : D；  当 B 非 0， A得 C，否则 A 得 D  你的题目 b/a  =>  20/10   =>   2  => 非 0 ， 。。。

以简单的角度来看，除法优先级高于三目运算符（选择运算符），三目高于赋值，所以先算b/a，值为2，问号前面是在判断真值，2为真，选择第一个，也就是选择了a，最后再运算c=a，c得10。printf输出的是c 的值，故选A。


Question: 用VC2010C语言写俄罗斯方块，该创建那个类型的项目？

进入了MSDN，找不到在线帮助

看MSDN在线帮助中相关章节。


Question: C++ 有关指针的强制类型转换的疑问

指针强转实质不会对指针有任何修改，只影响编译器结构体内成员计算偏移


Question: 新人请教

因为题目要求是输入一行，这一行里可能存在空格。而scanf会将空格之前的刷到内存，空格之后不会了。其实gets也不安全，建议使用fgets，但是也要注意fgets可能会把'\n'放到缓存里。

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.


Question: 关于c语言基础的问题

嗯嗯。谢谢

int s[4],下标可以是0,1,2,3,不能是4，你要用1-4（不用0的话）把s【4】改成s【5】

好像弄懂一些了，

似乎是最后两个循环 不能读取到 s[i]具体的值


Question: 关于调用函数的问题

引用 4 楼 自信男孩的回复:程序有问题呢，一个问题是strlen参数需要时字符串，而非字符。另一个，''是一个字符，而不能超过一个字符。超过一个字符应该用双引号"" 嗯嗯，好，我知道啦，谢谢你哈

引用 2 楼 user-2的回复:段错误，程序挂了 程序挂的原因是strlen只能输入字符串，而不是字符 strlen('a')非法 strlen("a")合法 哦~嗯嗯，可以啦，谢谢你

第一张图和第二张图选图的时候卡了，重复了，各位大佬忽略第一张图哈


如果你的程序32位、64位系统都要运行，可以用用size_t，可以提高程序的可移植性和有效性。

这是一个类型，size_t 可以理解为unsigned int

可以理解为unsigned int的别名 和int bool float一样用法

无符号长整型，在32位系统为32位，在64位系统上为64位

VS IDE中，在不明白的符号size_t上点鼠标右键，选转到定义。


Question: 请各位大佬看看，用链表模拟响应比高优先作业调度算法。输入数据有的结果正确，有的结果不对。到不知道代码错在哪里？

引用 1 楼 自信男孩的回复:      //scanf("%s",&p->name);         scanf("%s", p->name);    //去掉& 这个地方有问题，改一下再试试 这个点没问题，这个程序的问题在于有的数据输入进去，可以得到正确结果，但是有的数据输入进去结果就是错误的。但我没发现代码有啥问题，这是问题所在。谢谢您的回答哦

引用 2 楼 三层海水 的回复:[quote=引用 1 楼 自信男孩的回复:]      //scanf("%s",&p->name);         scanf("%s", p->name);    //去掉& 这个地方有问题，改一下再试试 这个点没问题，这个程序的问题在于有的数据输入进去，可以得到正确结果，但是有的数据输入进去结果就是错误的。但我没发现代码有啥问题，这是问题所在。谢谢您的回答哦[/quote]  你认为没必要去掉&是吗？还是你说去掉&还是有问题？建议试一下看看


Question: C gets

第二段应该是fscanf 吧╭(╯ε╰)╮

那谭浩强第五版  的第十章  的第一题   的代码  那个 fgets 的参数就不用加1了吧？


Question: 求问该题的解法，怎样将数字字母排序后还不改变原来的顺序谢谢！

#include<stdio.h> #include<string.h> #define MAX 1000 bool compare(char a, char b) { 	if (a >= '0'&&a <= '9'&&b >= '0'&&b <= '9')	//同是数字按升序 		return a>b; 	if (a >= 'a'&&a <= 'z'&&b >= 'a'&&b <= 'z')	//同是字母按降序 		return a<b; 	return false;		//其他不管 } int main() { 	char str[MAX],tmp; 	scanf("%s", &str); 	int len = strlen(str); 	for (int i = 0; i < len - 1; i++) { 		for (int j = i + 1; j < len; j++) { 			if (compare(str[i],str[j])) { 				tmp = str[i]; 				str[i] = str[j]; 				str[j] = tmp; 			} 		} 	} 	printf("%s", str); 	return 0; }

字母和字母对调、数字和数字对调就可以了。


Question: 二维数组

#include <stdio.h> #include <stdlib.h> #define ROW 3 #define COLUMN 4  int main() { 	// 定义一个三行四列的二维数组 	int a[ROW][COLUMN] = { 0 }; 	printf("输入12个数字，存入3*4的矩阵当中\n\n"); 	for (int r = 0; r < ROW; r++) 	{ 		for (int c = 0; c < COLUMN; c++) 		{ 			scanf_s("%d", &a[r][c]); 		} 	} 	printf("\n\n输入的数据为：\n\n"); 	for (int r = 0; r < ROW; r++) 	{ 		for (int c = 0; c < COLUMN; c++) 		{ 			printf("%d\t", a[r][c]); 		} 	}  	printf("\n");  	return 0; }

二维数组就用2层for循环，输入输出都是如此


Question: 哪错了啊  运行不出来  我是初学者

记得结贴，，，，，

输入不需要换行符，scanf里面写的除了%d是可以自己输入的变量，如果还有其他的代码，那么这些其他的代码都要原样输入

虽然是大一学的 感觉还是学到了

好吧能运行，，，需要两次输入没考虑

删了\n，也运行不了啊

scanf("%d\n", &i) 这种情况下，输入数字后，还需要输入一个 非（空格、制表符、回车）的内容，scanf才会停止。。 注意，输入的非（空格、制表符、回车）的内容，会留在输入流中。

- - 进来学学

\n 在C里是回车换行，所以无论你输入多少个回车，也不会进行下一步

好久没看C了 不翻评论竟然一遍没找出问题

高深，直接什么都看不懂，我也是初学

先来看看，了解下

scanf 中不能添加\n

看不出来 啦啦啦

为什么if 块里有个输出语句？

我来看看我来看看

输入不需要换行符、一般为了显示美观、输出才用换行的

我再跟你稍微仔细说下是scanf中的空白字符，空格、换行（\n）、回车（\r）、横制表（\t）、竖制表（\v）、换页符（\f）统称为空白字符，这些scanf对于这些空白字符的处理都是一样的，所以，你在\n处换成空格或\t也是一样的。然后就是，在scanf中，你连续敲多个空白字符和敲一个空白字符是一样的，比如scanf("%d       %d");等价于scanf("%d %d");   。而对于你的输入，非空白字符是一一匹配，而对于空白字符，有多少就匹配多少，比如scanf("%d %d")，双引号的规则里要求你输入“整数 空格 整数”，比如“2 3”，但实际上，你输入“2                    3”也是一样的，甚至中间敲回车、换行、Tab都一样，因为现在的情况是，你只要输入空白字符，都会被“%d %d”中间的这个空格一起匹配掉。

- - 进来学学


Question: 求解

建议自己先写写吧

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


Question: C语言控制台颜色控制代码

请参考《VS2015中修改控制台背景及输出字体颜色》  希望能够帮到你


Question: 求助

盲猜数组越界

图片多发了一样其实。。。


Question: 求助!C语言能debug回到上一步吗？

不能到上一步，但是能看上一层函数调用时的信息 linux下gdb f [数字]就能看到 引用 3 楼 qq_44996891 的回复:[quote=引用 2 楼 636f6c696e的回复:]不能，大侠请重头来过 好吧，那能查看上一步的数据吗？[/quote]

调用堆栈可以查看上一个函数的内容 拉动调试指示箭头可以拖到前面的行（VS IDE），但是前面变量的数据将会保留 比如vector你在上一步就push了一个，那这个数据还会在里面  这种办法一般只最不影响重要数据的情况下使用，否则得出的结果将可能不正确

引用 2 楼 636f6c696e的回复:不能，大侠请重头来过 好吧，那能查看上一步的数据吗？

不能，大侠请重头来过

不能，只能重新开始到上一步设置断点


Question: 6去哪里了？

引用 13 楼 qiuyeziyue的回复:眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步一行是什么意思？

眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！

有点儿搞不懂。。。

要把4转成字符串才行的哟

不要研究这种玩意儿，没用

表达式中出现"Hello world\n"，其值为该字符串常量的起始地址。6+"Hello world\n"，就是指针与整数的加法

理解和讨论之前请先学会如何观察！   计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

还可以用用这个形式： printf("%c\n", "hello world!\n"[6]); 看看输出的是不是'w'

你要先明白这是在干啥呀，你要输出6只要也要放到双引号里呀

"Hello world\n"这是一个字符串，也就是一个地址，地址值+6，就是向后偏移6个自己，然后输出，那和下面的代码是一样的：  const char *pstr = "hello world\n"; printf("%s", pstr+6);

6作用在了字符指针的，本来打印"Hello world\n"，加6之后像后偏移6个字符，输出world\n

printf(6+"Hello world\n"); =printf("Hello world\n" +6); =printf("world\n");  6可不是“6”，而且C语言也不支持直接两个字符串用+拼接

char s[]="Hello world\n"; printf(s+6);

明白了吗

我有点被吓到，刚刚试一下，在VC里居然支持： char   *sp = 6 + ＂hello world";  其效果与下面完全等效： char   *sp =  "hello world" + 6;  这是 C 风格? 还是 C++的？  用了多年的VC，但还是孤陋寡闻了，我这是第一次看到该格式。我只知道  6 + CString("hello world");


Question: 纯新手求问图中程序不是死循环吗？

注意continue不是向后继续执行，而是执行到continue之后向continue的前面（已经执行过的部分）继续执行。所以，你的图片里continue指向有问题。

引用 2 楼 六道佩恩 的回复：不会是死循环，当i增大到最大时，再增加1就是最小了，也就是负数，跳出循环上机运行结果确实是i=1，但是没看懂你的意思，i怎么会增加？

continue不应该是直接跳到while表达式的判断吗？不会执行下边的i- -和printf了吧？

不会是死循环，当i增大到最大时，再增加1就是最小了，也就是负数，跳出循环

switch的会一直执行,直到break; i=5时;     i%2==1    执行continue,    i-- i=4         i%2==0    执行break:         i-- 然后跳出switch语句 执行两次i--;   i=1 输出1 然后执行条件判断 1>0 条件成立.在运行一次就好了 i=1   i%2==1   continue;   i-- i=0  i%2 ==0  break;   i-- i=-1    i-- i=-2    i-- 输出-3 -3>0不成立 跳出循环 结果应该是:1-3


Question: 有80个学生，用数组保存学生学号和3门课成绩（例如1 87 78 90，学号和成绩均为整型数据）。编写程序统计各门课的不及格人数。

#include <stdio.h>  struct student{     int num;     int score1;     int score2;     int score3; }students[80];  int main() {     int i;     int course1=0,course2=0,course3=0;     for(i=0;i<80;i++)     {         scanf("%d%d%d%d",&students[i].num,&students[i].score1,&students[i].score2,&students[i].score3);         if(students[i].score1<60)             course1++;         if(students[i].score2<60)             course2++;         if(students[i].score3<60)             course3++;     }     printf("course1:%d\ncourse2:%d\ncourse3:%d",course1,course2,course3);     return 0; }


Question: c语言从文件第一列读取两个值,并写入同文件的第三列

引用 2 楼 赵4老师 的回复：所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224谢谢大佬

各位大佬，这是个很简单的问题，但我刚学c，看书还没看到这！实在写不出来


Question: 是位运算吧？

要求是执行多少次，而不是1024是11.即i= 1024， i>>1移动了11次变成了0. 建议看一下1024，用2进制表示是从右向左数第几个是1.

用Windows自带计算器，把十进制1024转换为二进制  一共11位

题目不是求打印CSDB的次数么？ 等价于while循环执行的个数 和1024变成11有啥关系。。

1024是2的10次方，每次右移等同于除以2，连续除10次就变成了1。而此时while（1）还是可以再次进入，打印一次csdn,然后右移。此时i=0，while(0)跳出。所以while一共执行11次，也就是会打印csdn11次。

二进制1024右移一位，等价于除以2


Question: 应该执行第一句呀

脑筋转得快一点，这个就等同于switch(func()) 判断的是func的返回值

printf("hi-") 要看这个返回值是几了，根据printf的返回值是指：输出的字节数，那么这个输出的字节数是3个，所以返回值应该是3.

MSDN里面对于printf()函数的返回值有如下描述 Returns the number of characters printed, or a negative value if an error occurs.  返回值是printf()函数打印出来的字符的个数。 switch语句中 printf("hi-") 打印的字符个数是3个，所以printf()函数的返回值是3，所以最后打印出来的信息是“hi-c”

这里用的是函数返回值，printf()返回值是整形，若成功则返回输出的字符数，输出出错则返回负值。也就是说switch(printf("hi-"))，等同于int len;  len = printf("hi-");    switch(len)…… 而此时len 表示的是printf打印的字符数，也就是3.所以执行case 3.


Question: 为什么文件格式化输出跟控制台格式化输出的结果不一致？

引用 5 楼 丁劲犇 的回复:楼上正解。不同的环境对TAB的定义不同。建议用空格得了。 用空格还是一样

楼上正解。不同的环境对TAB的定义不同。建议用空格得了。

说错了，不是txt中，是记事本中的显示方式

txt中一个\t貌似占4个中文符宽，控制台中只占两个中文符宽

不能用iomanip里面的函数吗？（萌新小声哔哔）

不清楚，不过，格式化输出的话，是否用空格会比较好点？？


Question: 怎么低成本高效地运行一个程序？

引用 2 楼 user-1 的回复：你咋不去想想怎么优化下你的程序内存呢。。。尽想提升硬件程序已经达到最优情况下讨论这个问题

你咋不去想想怎么优化下你的程序内存呢。。。尽想提升硬件

其实我的问题可以总结为，爬虫系统用哪个编程写或者哪些框架运行快。好像可以如此总结


Question: 一个村子，有N个人，选举村长，候选人有张、王、李、赵四人，输入1则选张，输入2则选王，输入3则选李，输入4则选赵，输入其他值为废票。当输入-1时，投票结束，统计

写个含有4个元素的数组，while(1)无限循环下 识别输入的是几，对数组相应的元素进行加一，当识别是-1的时候break.最后再写个循环，输出最大的元素。


Question: 如何获取有多个签名的文件的签名信息？

大佬 能不能说清楚，我这边也遇到这个问题了...

可以看看https://stackoverflow.com/questions/50976612/amended-code-to-retrieve-dual-signature-information-from-pe-executable-in-window

感谢大佬！

大佬，这个还有一个问题，就是只能获取两个数字签名，两个以上就获取不到了。这个怎么解决？

引用 2 楼 user-2 的回复:phCertStore A pointer to an HCERTSTORE value that receives a handle to a certificate store that includes all of the certificates, CRLs, and CTLs in the object.  确定么？我看MSDN上写着是会包含一个list啊，也就是不止一个 同事反汇编出来了。的确不是在phCertStore里面的，而是需要在unauth里面找的。

unauth 是在哪里？？

有没有大佬知道的，或者能提供点思路的？我找到的资料只是提到，第一个签名是写在pe的签名区的。后面的两个签名不是放在签名区的。

引用 2 楼 user-2 的回复:phCertStore A pointer to an HCERTSTORE value that receives a handle to a certificate store that includes all of the certificates, CRLs, and CTLs in the object.  确定么？我看MSDN上写着是会包含一个list啊，也就是不止一个 通过 fResult = CryptQueryObject(CERT_QUERY_OBJECT_FILE, 			szFileName, 			CERT_QUERY_CONTENT_FLAG_PKCS7_SIGNED_EMBED, 			CERT_QUERY_FORMAT_FLAG_BINARY, 			0, 			&dwEncoding, 			&dwContentType, 			&dwFormatType, 			&hStore, 			&hMsg, 			NULL); 获得hStore句柄后，我用CertEnumCertificatesInStore枚举里面的证书，得到的结果


Question: 为什么无法捕获控制台的消息？

学习HOOK不撸WinAPIOverride， 等于没学HOOK！

引用 29 楼 早打大打打核战争 的回复:忘了说了，如果先GetConsoleWindow获取控制台窗口句柄，然后SetWindowsHookEx安装一个WH_CALLWNDPROC、WH_CALLWNDPROCRET、或者WH_GETMESSAGE类型的钩子，然后在HOOK过程中检测传入的MSG结构（hwnd是否是本控制台窗口句柄），是可以获取到全部消息的，但这属于非标准用法 谢谢啊，真的非常谢谢，您的回答简明扼要直中靶心。我正好过些天要学习下HOOK，您给了我不错的思路。

引用 27 楼 早打大打打核战争 的回复:[quote=引用 17 楼 六道佩恩 的回复:] [quote=引用 1 楼 早打大打打核战争 的回复:] 不是CreateWindow/CreateWindowEx，而是AllocConsole，console窗口属于系统进程csrss.exe，所以你的程序接收不到窗口消息，如果在控制台应用中调用GetMessage会一直阻塞 那么控制台窗口的消息是完全没有还是只要少部分？[/quote]  简单说，完全没有，因为控制台窗口属于csrss.exe，消息都由它处理了，控制台应用程序获取不到 进一步说，用ReadConsoleInput，PeekConsoleInput可以获取一部分，但是非客户区消息获取不到 [/quote] 谢谢你啊，不过已经结贴了，我不知道怎么加分，，，抱歉哈。。。。

引用 17 楼 六道佩恩 的回复:[quote=引用 1 楼 早打大打打核战争 的回复:] 不是CreateWindow/CreateWindowEx，而是AllocConsole，console窗口属于系统进程csrss.exe，所以你的程序接收不到窗口消息，如果在控制台应用中调用GetMessage会一直阻塞 那么控制台窗口的消息是完全没有还是只要少部分？[/quote]  简单说，完全没有，因为控制台窗口属于csrss.exe，消息都由它处理了，控制台应用程序获取不到 进一步说，用ReadConsoleInput，PeekConsoleInput可以获取一部分，但是非客户区消息获取不到

引用 24 楼 六道佩恩 的回复:[quote=引用 23 楼 luj_1768 的回复:] 控制台输入输出是使用的系统缓冲机制，没有消息的事。输出是写入系统输出缓存，输入是读取系统输入缓存，相关调度由系统管理。基本上是这个样子的。 控制台本身也是窗口，那么是不产生消息还是系统得到消息后不作转发？[/quote] 前面六道的回复：the specified window cannot be spied upon. windows will not allow access to the message stream for this window.翻译：指定的窗口不能被窥视，Windows系统不允许获取这个窗口的消息流。 综合前面的大侠回复，理解：控制台的窗口自有按钮的消息是无法被直接获取的。  这样理解对不对？

引用 23 楼 luj_1768 的回复:控制台输入输出是使用的系统缓冲机制，没有消息的事。输出是写入系统输出缓存，输入是读取系统输入缓存，相关调度由系统管理。基本上是这个样子的。 控制台本身也是窗口，那么是不产生消息还是系统得到消息后不作转发？

引用 20 楼 赵4老师 的回复:WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/ 额，赵老师，我找了一圈，楞是没看到message这个词，获取到窗口句柄后，把上面的按钮都点了一遍也没找到哪里可以捕获message，帮助文档也看不懂，，，，，，要不，赵老师您直接告诉我结论吧，，，就是，我们捕获不到控制台窗口的普通消息，是因为根本没产生消息，还是因为产生的消息没有被系统发送到控制台，还是说发送到了控制台但我们无法接收？

引用 18 楼 赵4老师 的回复:难道用Spy++也捕获不到控制台窗口的消息？ 我刚刚去试了一下，我不太确定我的使用方法有没有错，在左边的“Find Window”里选中“Message”，将圆环拖放到目标窗口，其中有些窗口获取到了消息，有些没有，但放到控制台窗口的时候提示“the specified window cannot be spied upon. windows will not allow access to the message stream for this window.”，意思就是的确是捕获不到控制台消息，是吧？

难道用Spy++也捕获不到控制台窗口的消息？

引用 1 楼 早打大打打核战争 的回复:不是CreateWindow/CreateWindowEx，而是AllocConsole，console窗口属于系统进程csrss.exe，所以你的程序接收不到窗口消息，如果在控制台应用中调用GetMessage会一直阻塞 那么控制台窗口的消息是完全没有还是只要少部分？

引用 7 楼 六道佩恩 的回复:[quote=引用 4 楼 ForgetTomorrow 的回复:] 哈哈哈哈哈哈哈哈中 嘲笑别人有意思？[/quote] 兄弟我没有嘲笑你，我只是来看下我的github勋章有没有显示出来，乱打了几个字。 你这内心也太脆弱了吧

引用 13 楼 六道佩恩 的回复:[quote=引用 11 楼 早打大打打核战争 的回复:] [quote=引用 10 楼 六道佩恩 的回复:] [quote=引用 1 楼 早打大打打核战争 的回复:] 不是CreateWindow/CreateWindowEx，而是AllocConsole，console窗口属于系统进程csrss.exe，所以你的程序接收不到窗口消息，如果在控制台应用中调用GetMessage会一直阻塞 3楼的第二个链接里，在控制台窗口创建按钮，是可以捕获到按钮消息的呀[/quote]  那是因为他调用了CreateWindow创建按钮，实际上已经是GUI程序，只是按钮的parent设置为console窗口而已   [/quote] 那么，对于这个例子，消息传送的过程是不是这样：按下按钮——系统获知——传送消息给按钮窗口所在的线程——我们捕获消息。所以这相当于我们的线程捕获的子窗口的消息，而不是捕获的控制台窗口的消息，是这样吗？[/quote]  是的，console窗口属于csrss.exe，按钮属于自己的APP

有试过SetWindowsHookEx  来捕获消息么？

引用 11 楼 早打大打打核战争 的回复:[quote=引用 10 楼 六道佩恩 的回复:] [quote=引用 1 楼 早打大打打核战争 的回复:] 不是CreateWindow/CreateWindowEx，而是AllocConsole，console窗口属于系统进程csrss.exe，所以你的程序接收不到窗口消息，如果在控制台应用中调用GetMessage会一直阻塞 3楼的第二个链接里，在控制台窗口创建按钮，是可以捕获到按钮消息的呀[/quote]  那是因为他调用了CreateWindow创建按钮，实际上已经是GUI程序，只是按钮的parent设置为console窗口而已   [/quote] 那么，对于这个例子，消息传送的过程是不是这样：按下按钮——系统获知——传送消息给按钮窗口所在的线程——我们捕获消息。所以这相当于我们的线程捕获的子窗口的消息，而不是捕获的控制台窗口的消息，是这样吗？

引用 9 楼 赵4老师 的回复:仅供参考：#pragma comment(lib,"user32") #include <stdio.h> #include <string.h> #include <windows.h> int main() {     SECURITY_ATTRIBUTES sa          = {0};     STARTUPINFO         si          = {0};     PROCESS_INFORMATION pi          = {0};     HANDLE              hPipeOutputRead  = NULL;     HANDLE              hPipeOutputWrite = NULL;     HANDLE              hPipeInputRead   = NULL;     HANDLE              hPipeInputWrite  = NULL;     BOOL                bTest = 0;     DWORD               dwNumberOfBytesRead = 0;     DWORD               dwNumberOfBytesWrite = 0;     CHAR                szMsg[100];     CHAR                szBuffer[256];      sa.nLength = sizeof(sa);     sa.bInheritHandle = TRUE;     sa.lpSecurityDescriptor = NULL;      // Create pipe for standard output redirection.     CreatePipe(&hPipeOutputRead,  // read handle             &hPipeOutputWrite, // write handle             &sa,      // security attributes             0      // number of bytes reserved for pipe - 0 default             );      // Create pipe for standard input redirection.     CreatePipe(&hPipeInputRead,  // read handle             &hPipeInputWrite, // write handle             &sa,      // security attributes             0      // number of bytes reserved for pipe - 0 default             );      // Make child process use hPipeOutputWrite as standard out,     // and make sure it does not show on screen.     si.cb = sizeof(si);     si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;     si.wShowWindow = SW_HIDE;     si.hStdInput   = hPipeInputRead;     si.hStdOutput  = hPipeOutputWrite;     si.hStdError   = hPipeOutputWrite;      CreateProcess (           NULL, "cmd.exe",           NULL, NULL,           TRUE, 0,           NULL, NULL,           &si, &pi);      // Now that handles have been inherited, close it to be safe.     // You don't want to read or write to them accidentally.     CloseHandle(hPipeOutputWrite);     CloseHandle(hPipeInputRead);      // Now test to capture DOS application output by reading     // hPipeOutputRead.  Could also write to DOS application     // standard input by writing to hPipeInputWrite.     sprintf(szMsg, "ver\n");     WriteFile(           hPipeInputWrite,      // handle of the write end of our pipe           &szMsg,               // address of buffer that send data           strlen(szMsg),        // number of bytes to write           &dwNumberOfBytesWrite,// address of number of bytes read           NULL                  // non-overlapped.           );      while(TRUE)     {        bTest=ReadFile(           hPipeOutputRead,      // handle of the read end of our pipe           &szBuffer,            // address of buffer that receives data           256,                  // number of bytes to read           &dwNumberOfBytesRead, // address of number of bytes read           NULL                  // non-overlapped.           );        if (!bTest){           sprintf(szMsg, "Error #%d reading pipe.",GetLastError());           printf("%s",szMsg);           break;       }        // do something with data.       szBuffer[dwNumberOfBytesRead] = 0;  // null terminate       printf("%s",szBuffer);       if ('>'==szBuffer[dwNumberOfBytesRead-1]) break;     }      sprintf(szMsg, "chcp\nexit\n");     WriteFile(           hPipeInputWrite,      // handle of the write end of our pipe           &szMsg,               // address of buffer that send data           strlen(szMsg),        // number of bytes to write           &dwNumberOfBytesWrite,// address of number of bytes read           NULL                  // non-overlapped.           );      while(TRUE)     {        bTest=ReadFile(           hPipeOutputRead,      // handle of the read end of our pipe           &szBuffer,            // address of buffer that receives data           256,                  // number of bytes to read           &dwNumberOfBytesRead, // address of number of bytes read           NULL                  // non-overlapped.           );        if (!bTest){           sprintf(szMsg, "Error #%d reading pipe.",GetLastError());           printf("%s",szMsg);           break;       }        // do something with data.       szBuffer[dwNumberOfBytesRead] = 0;  // null terminate       printf("%s",szBuffer);     }      // Wait for CONSPAWN to finish.     WaitForSingleObject (pi.hProcess, INFINITE);      // Close all remaining handles     CloseHandle (pi.hProcess);     CloseHandle (hPipeOutputRead);     CloseHandle (hPipeInputWrite);      return 0; } //C:\test>test //Microsoft Windows [版本 5.2.3790] //(C) 版权所有 1985-2003 Microsoft Corp. // //C:\test>ver // //Microsoft Windows [版本 5.2.3790] // //C:\test>chcp //活动的代码页: 936 // //C:\test>exit //Error #109 reading pipe. //C:\test>  赵老师，额，虽然不是很懂这个代码，但大概好像是创建进程、管道，你这个好像是进程间通信吧，，，额，，您是不是误解了我的问题？

引用 10 楼 六道佩恩 的回复:[quote=引用 1 楼 早打大打打核战争 的回复:] 不是CreateWindow/CreateWindowEx，而是AllocConsole，console窗口属于系统进程csrss.exe，所以你的程序接收不到窗口消息，如果在控制台应用中调用GetMessage会一直阻塞 3楼的第二个链接里，在控制台窗口创建按钮，是可以捕获到按钮消息的呀[/quote]  那是因为他调用了CreateWindow创建按钮，实际上已经是GUI程序，只是按钮的parent设置为console窗口而已

引用 1 楼 早打大打打核战争 的回复:不是CreateWindow/CreateWindowEx，而是AllocConsole，console窗口属于系统进程csrss.exe，所以你的程序接收不到窗口消息，如果在控制台应用中调用GetMessage会一直阻塞 3楼的第二个链接里，在控制台窗口创建按钮，是可以捕获到按钮消息的呀


Question: c二维数组与指针访问关系

http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组


Question: fopen打开文件啊,为什么文件名设置为数组就出报错啊?

额 本来没有问题的,我用arr 的时候一直加了""然后内存报错,谢谢各位

不好意思，这几天出去玩了，明天才回家，没有看论坛。。我明天回去试试，完了就赶紧结算！

可能是字符的编码问题 可以试试 系统设置的区域中的非Unicode代码页修改为中文 或者程序先调用 setlocale( LC_ALL, "chs" ); 设置下进程字符集环境 或用UNICODE的 WCHAR  _wfopen_s 函数试试看，

应该不会有错，最多警告，警告的原因是这里需要的是一个char*指针，char数组是数组型，不想警告的话就强制转换为指针型。

会不会是 中文引起的问题？ 把文件名改成普通字母看看？

引用 楼主 空瞳里的余生的回复:long lsize;   //定义取文件长度 	char *ptr = NULL; 	FILE *head; 	char arr[] = { "D:\\单词火车2.exe" }; 	printf("%s", arr); 	errno_t err; //fopen_s需要定义的变量 	err = fopen_s(&head, "D:\\单词火车2.exe", "rb"); //以二进制可读方式打开文件 使用文件目录,文件打开正常,但是如果把D:\\单词火车2.exe替换为arr 编译器就会报错,我用的VS2015 请教各位大神 你把大括号去掉试试吧

理论上不会的，因为看到这两个字符串都是一样的。

编译器的报错贴出来

err = fopen_s(&head, arr, "rb"); 应该不会有问题


Question: 关于指针对齐/移位的操作一点疑问

哈哈，解答的好快，已经结贴了。软件基础还要多学。

该位对齐函数没有问题，它的意思是根据输入的ptr值，如果不是 align 的倍数，补齐它，让新的值 是 align的倍数。 例如(便于说明，特意用小的值，大的值也是一样）  当 align 为 8  如果 ptr 的值为  20 时，补4，函数返回值 24   (24 % 8 => 0) 如果 ptr 的值为  58 时，补6，函数返回值 64 （64 % 8 => 0） 如果 ptr 的值为  88 时，补0，函数返回值 88 （88 % 8 => 0）

就是把ptr向上取整到align倍数的值，比如ptr本来是0x40001001，align是8，则ptr变为0x40001008


Question: 求C语言大佬帮帮忙

请贴代码，谢谢

错误	LNK2019	无法解析的外部符号 __imp__fprintf，该符号在函数 _ShowError 中被引用	MHXY	C:\Users\asus\Desktop\MHXY\MHXY\SDL2main.lib(SDL_windows_main.obj)	1	  错误	LNK2019	无法解析的外部符号 __imp____iob_func，该符号在函数 _ShowError 中被引用	MHXY	C:\Users\asus\Desktop\MHXY\MHXY\SDL2main.lib(SDL_windows_main.obj)	1

#include "SDL.h" #include <stdio.h> #include <stdlib.h> int main(int argc, char* argv[]) { 	if (SDL_Init(SDL_INIT_VIDEO)) 	{ 		printf("Could not initialize SDL - %s\n", SDL_GetError()); 	} 	else 	{ 		printf("Success init SDL"); 	}  	system("pause");  	return 0; }  验证搭建是否成功的代码

为什么不把代码直接贴出来，也把编译的错误贴出来。


Question: 请求大佬们，谢谢

引用 6 楼 自信男孩 的回复：#include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <math.h>  int is_prime(int num);  int main(void) {     int num, add = 0, inc = 0, sign = 1;      printf("Please input a number: ");     scanf("%d", &num);      while (1) {         if (num + add >= 2 && is_prime(num + add) > 0)             break;         if (sign > 0)             inc++;         add = sign * inc;         sign = -sign;     }     printf("Prime is %d\n", num + add);      return 0; }  int is_prime(int num) {     int t, i;      if (num == 2)         return 1;      t = sqrt(num) + 1;     for (i = 2; i <= t; i++)         if (num % i == 0)             break;      if (i > t)         return 1;      return 0; }  供参考！谢谢大佬啦

1不是质数吧，找x内最大的质数，就是左最接近x的了 --------------------------------- int fun(int x) {     int i = 0;     int j = 0;     int i_falg = 1;     int i_maxnum = 2;     for (i=2;i<=x;i++)     {        i_falg = 1;        for (j=2;j<i;j++)        {            if (0 == i%j)            {               i_falg = 0;               break;            }        }        if ( 1 == i_flag)        {             /*此时i为质数*/             i_maxnum = i;        }     }     return i_maxnum; } 随手写的，差不多这个样子吧，自己改改

引用 2 楼 weixin_44330994 的回复:引用 1 楼 自信男孩 的回复：判断质数的函数网上有很多，如果输入的数不是质数，那么把这个数加1判断，减1判断，都不行，那么继续加2，减2一次类推我知道这思路啊，但写不出来 编程学过吧，没学过写不出来还是可以理解的。

你至少得尝试一下，然后把尝试的代码贴上来，这样才能更好的帮助你。


Question: c语言的题搞不明白

建议直接贴代码，图片看不清晰，建议自己先看一下图片是否清晰。


Question: c语言题，急用！

假设用一个数组a存储，用另一个大小足够的数组appear记录数字是否出现过 然后把数组a遍历一遍   对于每个元素，如果未出现过，则修改对应appear，表示已经出现过；如果出现过，则将元素改为-1


Question: c语言程序题

#include <stdio.h> #include <stdlib.h>  int main() {     int exist=0,a[100],i=0,j;     printf("请从小到大输入从小到大排列的、带有重复数字的整数列：\n");     while(scanf("%d",&a[i])!=EOF)     {         if(a[i]==exist)             a[i]=-1;         else             exist=a[i];         i++;     }     for(j=0;j<i;j++)     {         printf("%d",a[j]);         if(j<i-1)             putchar(',');     }     return 0; }   这个程序在windows下是输入ctrl+z结束输入的，如果要改成指定数目就在循环前面输入，然后用输入的数字来给循环限制个范围就行了


Question: 如何在一个已经定义好的数组，且空间足够，增加一行数，

动态长度用malloc和realloc吧，用法和数组是一样的，只不过最后要自己手动释放

建议用malloc/realloc来定义数组，因为这样可以做到数组伸缩。虽然是二维数组，但是也是可以伸缩的。  静态数组不可以伸缩，这也是动态分配空间和静态数组的主要区别吧

增加行数或者列数，只能通过malloc申请一块新内存，然后再把老的数据复制过去才行吧。像楼主这种问题，C语言比较好的解决方案是用链表，当然，C++提供了更多的解决方案，list，vector，map等等。

严格来说，已经定义好的数组是不能扩展的。  你可以考虑使用 C++ 中的 vector