Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 我写了一个CCF的题，但只有80分，希望哪位大神可以给我看看，指出我的错误 

回复:
user: user-0
content: 引用 4 楼 user-4 的回复:少年  你这个程序有很大问题啊 我的问题已经解决了

user: user-0
content: 我考虑了闰年的情况  引用 5 楼 cqlhj 的回复:[quote=引用 3 楼 qq_36267149 的回复:] 我考虑了闰年的情况 主循环改为:  	for( i = 0; i < 12; i++ ) 	{ 		if ( d <= a[i] ) 		{ 			b = d; 			break; 		} 		else 		{ 			d -= a[i]; 		} 	}   应该可以.[/quote] 谢谢，可以了

user: user-1
content: 引用 1楼CaptainHarryChen 的回复:给你组数据 2012 60 正确答案为 2 29 你的程序为 3 0 很明显你没有把2月29天的情况算进去他考虑闰年的情况了，只是d和sum比较的时候需要判等

user: user-2
content: 给你组数据 2012 60 正确答案为 2 29 你的程序为 3 0 很明显你没有把2月29天的情况算进去

user: user-3
content: 引用 3 楼 qq_36267149 的回复:我考虑了闰年的情况 主循环改为:  	for( i = 0; i < 12; i++ ) 	{ 		if ( d <= a[i] ) 		{ 			b = d; 			break; 		} 		else 		{ 			d -= a[i]; 		} 	}   应该可以.

user: user-4
content: 少年  你这个程序有很大问题啊

user: user-0
content: 我考虑了闰年的情况
user-0 提问: 指针问题

回复:
user: user-1
content: *（ptr++）+=123;做了一次++，printf("%d,%d",*ptr,*(ptr++));也做了一次++，所以会是8.

user: user-2
content: 在printf里面，你既使用了ptr++，又使用了ptr，这种会产生混淆的情况是C语言没有定义的，不同的编译器可能有不同的实现，需要尽力避免这种情况，现实中有人这么写，我就会把那个人打一顿

user: user-3
content: 不知道你想做什么

user: user-4
content: 引用数组名是常量不能进行自增运算 int main() { 	int ptr[] = { 6,7,8,9 }; 	int *arr = ptr; 	*(arr++) += 123; //arr有自增操作，这行执行完毕，arr = ptr + 1，指向数组第2个元素7 	printf("%d,%d", *arr, *(arr + 1)); //输出7，8 	return 0; }

user: user-0
content: 对    数组名是常量不能进行自增运算     那你帮忙看看  int *arr=ptr； *（arr++）+=123；

user: user-5
content: int main() { 	int ptr[] = { 6, 7, 8, 9 }; 	*(ptr++) += 123; 	printf("%d,%d", *ptr, *(ptr++));     return 0; }  这样会报错吧？ 是不是该改成  int main() { 	int ptr[] = { 6, 7, 8, 9 }; 	*(ptr+1) += 123; 	printf("%d,%d", *ptr, *(ptr+1));     return 0; }  这样的输出是
user-0 提问: c语言下如何使用system()同时执行多条cmd指令

回复:
user: user-1
content: ShellExecute(NULL,"open","C:\\Program Files\\Internet Explorer\\iexplore.exe",NULL,NULL,SW_SHOWNORMAL); 不能搞恶作剧

user: user-2
content: 引用这段代码应该怎么修改才能达到不断打开ie的效果？ system("cd C:\\Program Files\\Internet Explorer && iexplore.exe"); 这行代码可以打开ie，报错原因不清楚，有可能是拼写的问题？  但这个问题的要害是用这种方式更换的工作目录，仅仅是依附在Console窗口进程下，而不是真正的改变工作目录。 听起来有点不好理解，直观的运行结果是这样的：  每次只能打开一个IE窗口，关闭IE后，才会打开另一个IE窗口。  如果想达到楼主想要的效果，可以用下面的代码：  #include <Windows.h> //必须包含这两个头文件 #include <shellapi.h>  int main(void) {     while(1)     {             ShellExecute(NULL, "open", "C:\\Program Files\\Internet Explorer\\iexplore.exe",  			NULL, NULL, SW_SHOWNORMAL);     }     return 0; }

user: user-3
content: system("cd /d C:\\Program Files\\Internet Explorer&&iexplore.exe");

user: user-4
content: 楼主, 我用你的代码是可以正常打开IE浏览器的
user-0 提问: 求大神帮我解决一个C语言CAN总线的问题

回复:
user: user-1
content: 引用除了0和1,还有了很多的赋值 can->SendType = gTxType;         // 发送帧类型                                                      // =0时为正常发送（发送失败会自动重发，重发最长时间为1.5-3秒）；                                                      //=1时为单次发送（只发送一次，不自动重发）；                                                      //其它值无效。 这里的注释可能是某个代码作者写的，权威的解释还得看 接口文档 。 楼主手头应该有类似"CAN-bus接口函数库使用手册"这样的文档，以上面的说明为准。 如果没有这样的文档，可以上网搜。
user-0 提问: 刚解决输入问题，发现输出又出问题了，求各位大佬指点一下！

回复:
user: user-0
content: 非常感谢两位回答！！！问题解决的，以后会注意。

user: user-0
content: 上面是程序和结果，不知道为什么score会输出一堆数字，明明也输入了数字的。

user: user-0

user: user-0

user: user-1
content: 错了，可以有逗号。但是你输入的逗号是中文的，改成英文逗号结果就正确了

user: user-2
content: 引用你好那个是我为了找问题打印出来的不是我输入的   while (p1->num != 0)  //循环的结束条件是第一个数输入0 注意下图标红处：  从目前看，输入如果符合正确的格式，结果是正常的。

user: user-1
content: scanf()格式化字符串不能有逗号 删除或者不加就没错了

user: user-0
content: #include"stdio.h" #include"malloc.h" #define LEN sizeof(struct Student) struct Student { 	long num; 	float score; 	struct Student *next; }; int n; struct Student *creat() { 	struct Student *head; 	struct Student *p1, *p2; 	n = 0; 	p1 = p2 = (struct Student *)malloc(LEN); 	scanf_s("%ld,%f", &p1->num, &p1->score); 	head = NULL; 	while (p1->num != 0) 	{ 		n = n + 1; 		if (n == 1) { head = p1; } 		else { p2->next = p1; } 		p2 = p1; 		p1 = (struct Student *)malloc(LEN); 		rewind(stdin);scanf_s("%ld,%f", &p1->num, &p1->score); 	} 	p2->next = NULL; 	return(head);  } void print(struct Student *head) { 	struct Student *p; 	printf("\nNow,These %d records are:\n",n); 	p = head; 	if (head != NULL) 		do 		{ 			printf("%d %f\n", p->num, p->score); 			p = p->next; 		} while (p != NULL); } void main() { 	struct Student *head; 	head = creat(); 	print(head); 	rewind(stdin);getchar(); }

user: user-1
content: 建议把代码贴上来  方便别人帮你调试

user: user-0
content: 引用 4 楼 fight_in_dl 的回复:scanf_s(%ld,%f",&p1->num,&p1->score)   在终端输入时必须同格式字符串匹配。  1001，67 //正确的输入格式 we1002,68 //错误的输入格式  g0,0 //错误的输入格式  当输入格式错误时，num和score接收不到正确的值。你好那个是我为了找问题打印出来的不是我输入的

user: user-0
content: 那个we和g不是我输入的，是打印出来的哦，所以说应该没有什么问题把。

user: user-2
content: scanf_s(%ld,%f",&p1->num,&p1->score)   在终端输入时必须同格式字符串匹配。  1001，67 //正确的输入格式 we1002,68 //错误的输入格式  g0,0 //错误的输入格式  当输入格式错误时，num和score接收不到正确的值。
user-0 提问: 求一个二维数组的鞍点，其中的for循环内去掉一行为什么不对？跪求大神解答

回复:
user: user-1
content: if (a[i][j]>max)  //如果这个条件不满足呢?  {     max=a[i][j];             maxj=j;      //如果进不到if分支，这行就不会被执行。 }  所以需要之前红色的那行。
user-0 提问: 求组！！层次遍历二叉树

回复:
user: user-0
content: # include<stdio.h> # include<stdlib.h>  //二叉树结点类型定义 typedef struct btNode { 	char data;     struct btNode * lchild; 	struct btNode * rchild; }BiTree,*Tree;  //队列结点类型定义 typedef struct Node { 	Tree data; 	struct Node * next; }Node,*pNode;  typedef struct Queue { 	pNode front; 	pNode rear; }QUEUE; /*==========队列函数定义==========*/ void InitQueue(QUEUE &); void EnQueue(QUEUE &, Tree); void DeQueue(QUEUE &); bool EmptyQueue(QUEUE); void GetHead(QUEUE, Tree&); /*==========队列函数定义==========*/  /*==========二叉树函数定义==========*/ void CreateTree(Tree &); void Visit(Tree); int Height(Tree); void LevelOrder(Tree); /*==========二叉树函数定义==========*/   int main(void) { 	Tree T;     printf("\n按先序序列输入结点序列，'#'代表空:");     CreateTree(T);      printf("二叉树的高度为%d\n",Height(T)); 	printf("二叉树的层次遍历结果为:"); 	LevelOrder(T); 	printf("\n");  	return 0; }  void init(QUEUE & Q) { 	Q.front = (pNode)malloc(sizeof(Node)); 	if(NULL == Q.front) 	{ 		printf("动态分配内存失败\n"); 		exit(-1); 	} 	Q.rear = Q.front; }  //入队 void EnQueue(QUEUE & Q, Tree e) { 	pNode pNew = (pNode)malloc(sizeof(Node)); 	if(NULL == pNew) 	{ 		printf("动态分配内存失败\n"); 		exit(-1); 	} 	pNew->data = e; 	pNew->next = NULL; 	Q.rear->next = pNew; 	Q.rear = pNew; }  //出队 void DeQueue(QUEUE & Q) { 	if(Q.front == Q.rear) 		return; 	else 	{ 		pNode p = Q.front->next; 		Q.front = p->next; 		if(Q.rear == p) 			Q.rear = Q.front; 		free(p); 	} }  //判断队列是否为空 bool EmptyQueue(QUEUE Q) { 	if(Q.rear == Q.front) 		return true; 	else 		return false; }  //获得对首元素 void GetHead(QUEUE Q, Tree & e) { 	if(EmptyQueue(Q)) 	{ 		 return; 	} 	else 	{ 		 e = Q.front->next->data; 	} }  //创建二叉树 void CreateTree(Tree &T) { 	char ch; 	scanf("%c", &ch); 	if('#' == ch) 		T = NULL; 	else 	{ 		T = (Tree)malloc(sizeof(BiTree)); 		if(NULL == T) 		{ 			printf("动态分配内存失败"); 			exit(-1); 		} 		else 		{ 			T->data = ch;             CreateTree(T->lchild); 			CreateTree(T->rchild); 		} 	} }  //访问节点 void Visit(Tree T) { 	printf("%c", T->data); }  //求树的高度 int Height(Tree T) { 	int ld = 0; 	int rd = 0; 	if(NULL == T) 		return 0; 	else 	{ 		ld = Height(T->lchild); 		rd = Height(T->rchild); 		return 1 + (ld>rd?ld:rd); 	} }  //层次遍历 void LevelOrder(Tree T) { 	QUEUE Q; 	init(Q); 	Tree p;  	if(NULL != T) 	{ 		EnQueue(Q, T); 		while(!EmptyQueue(Q)) 		{ 			GetHead(Q, p); 			DeQueue(Q); 			Visit(p); 			if(NULL != p->lchild)             EnQueue(Q, p->lchild); 			if(NULL != p->rchild)             EnQueue(Q, p->rchild); 		} 	}   }  输入A##能行输入AB##C##错误
user-0 提问: return问题

回复:
user: user-1
content: 引用 4 楼 fight_in_dl 的回复:应该是英文状态下的分号。  对返回值类型为void的函数，可以使用return; void DoSomething() {    //其它代码    return; // 如果在结尾，这行可以写，也可以不写。 } 上面这种情况，return;没有太大意义。它在下面这种情况下有用： void DoSomething() {    //其它代码     if(满足某个条件)           return;  //函数返回，下面的代码就不用执行了。    //其它代码 }  你回复的质量很高，不错

user: user-2
content: 是分号用的不对吧。  如果是中文的分号，编译器会提示：“；”是未生命的标识符。 楼主具体看看编译问题就知道了。

user: user-3
content: 我觉得这个分号是中文里的，请使用半角分号试试。

user: user-4
content: 应该是英文状态下的分号。  对返回值类型为void的函数，可以使用return; void DoSomething() {    //其它代码    return; // 如果在结尾，这行可以写，也可以不写。 } 上面这种情况，return;没有太大意义。它在下面这种情况下有用： void DoSomething() {    //其它代码     if(满足某个条件)           return;  //函数返回，下面的代码就不用执行了。    //其它代码 }

user: user-5
content: 引用 2 楼 guohanma 的回复:中文冒号问题.... 错了是分号

user: user-5
content: 中文冒号问题....

user: user-0
content: 补充一下 ，如果没有问题的话 。那返回的是什么呢？
user-0 提问: 实现数字输出，在线等

回复:
user: user-0
content: 引用 4 楼 adusuccessfully 的回复:2楼对楼主的问题进行了分析。 1楼和3楼是两种不同的实现方式。1楼的实现主要靠itoa函数生成字符串  3楼使用的递归不是很好理解。 楼主可以参考下。  我自己想了下也实现了，当时有点短路。谢谢大家

user: user-1
content: 2楼对楼主的问题进行了分析。 1楼和3楼是两种不同的实现方式。1楼的实现主要靠itoa函数生成字符串  3楼使用的递归不是很好理解。 楼主可以参考下。

user: user-2
content: #include <stdio.h> void func(int *p,int n,int m) {     if(n==0)     {           for(int i=m-1;i>=0;i--)                printf("%-3d",p[i]);           printf("\n");     }else     {     	p[n-1]=0;     	func(p,n-1,m);     	p[n-1]=1;     	func(p,n-1,m);     } } void main() { 	int n; 	int *p; 	printf("输入n\n"); 	scanf("%d",&n); 	p=(int *)malloc(sizeof(int)*n); 	func(p,n,n); }

user: user-3
content: 引用求输入任意x  先看一下规律。 x = 1， 输出为2行(2的1次方)1列。 x = 2 ，输出为4行(2的2次方)2列。 x = 3 ，输出为8行(2的3次方)3列。 ... x =n， 输出为2的n次方行n列。  那么各行的值有什么规律呢： 第一行都是0 从第二行开始，都是前一行的值加1，注意是二进制加法。  我们以8行3列的为例:    第一行-------->0   0   0                  0 0 0 + 1-------->0   0   1  0 0 1 + 1-------->0   1   0 0 1 0 + 1-------->0   1   1  0 1 1 + 1-------->1   0   0 1 0 0 + 1-------->1   0   1 1 0 1 + 1-------->1   1   0 1 1 0 + 1-------->1   1   1  规律就是这样，至于如何用代码实现，就得再花时间了。 虽然没有完全解决您的问题，但应该也指出了问题的关键。 希望在结帖给分的时候给予考虑，谢谢！！

user: user-4
content: #include <iostream> #include <stdlib.h> #include <string.h> #include <math.h> using namespace std; int main() {     int i,len,temp;     char res[1000];     while(cin>>i&&i<=10&&i>=1){          temp=pow(2,i);          for(int j=0;j<temp;j++)          {              itoa(j,res,2);              if(strlen(res)<i)              {                  for(int k=0;k<i-strlen(res);k++)                  cout<<0<<' ';                   for(int k=0;k<strlen(res);k++)                     cout<<res[k]<<' ';                  cout<<endl;              }              else              {                  for(int k=0;k<strlen(res);k++)                     cout<<res[k]<<' ';                  cout<<endl;              }          }     } }
user-0 提问: 编写一个将输入复制到输出的程序，并将其中连续的多个空格用一个空格代替

回复:
user: user-1
content: 引用 4 楼 Jayson_Lin 的回复:我想问：NONBLANK在C语言中是有特殊定义的吗？如果不是，我可以换成其他的字母什么的进行代替吗？ NONBLANK是你的程序自己#define的..在第三行#define NONBLANK 'a', 只是初始化lastc,这里lastc只要不初始化为空格键“ ”就行。

user: user-0
content: 引用 1 楼 guohanma 的回复:getchar()是从输入获取一个字符，putchar是输出一个字符。这个程序是每次从输入获取一个字符，如果该字符不是空格就直接输出，是空格就判断在这之前的字符是否也为空格，如果不是就输出。也就是如果有连续多个空格，就只输出第一个。重复直到遇到文件结尾符  我想问：NONBLANK在C语言中是有特殊定义的吗？如果不是，我可以换成其他的字母什么的进行代替吗？

user: user-2
content: 引用NONBLANK在C语言中是有特殊定义的吗  #define是C语言中的预处理命令，它用于宏定义，可以提高源代码的可读性，为编程提供方便。 #define NONBLANK  'a' 之后，编译器在遇到NONBLANK，会将其替换为'a'。  这个题目中用这个宏意义不大，只要保证在while循环前lastc有一个不等于空格的值就行。 lastc = NONBLANK;  //lastc = 'b'; 这样也可以 //lastc = 'c'; 这样写也行 while((c = getchar())!= EOF){

user: user-2
content: 不好意思，示例中，输入应该是： cㄩㄩb

user: user-2
content: 引用其实我并不懂题目的意思。 输入时字符先放到缓冲区，当按下回车键时，发送EOF，清除缓冲区，此时才开始逐个读取字符。 以上这行是理解这个题的关键，相关内容如果不是太理解，可以百度下。  举例，假设输入为： aㄩㄩb  (ㄩ代表空格) 当按下回车后，开始逐个读取字符，并进行处理。 while((c = getchar())!= EOF){         if(c != ' ')             //第一次读到'c'             putchar(c);//输出'c'         if(c == ' ')            //第二次读到空格             if(lastc != ' ')   //第一次结束后lastc = 'c' ,满足条件                 putchar(c); //打印空格         lastc = c; //第二次结束后lastc等于空格     } while((c = getchar())!= EOF){         if(c != ' ')             //第三次读到空格             putchar(c);             if(c == ' ')            //满足条件             if(lastc != ' ')   //第二次结束后lastc等于空格，不满足条件                 putchar(c); //不打印         lastc = c; //lastc等于空格 while((c = getchar())!= EOF){         if(c != ' ')             //第四次读到‘b'             putchar(c);    //输出'b'         if(c == ' ')                        if(lastc != ' ')                    putchar(c);         lastc = c;   可能不是特别清楚，不行拿张纸，每次循环记一下各变量值。

user: user-1
content: getchar()是从输入获取一个字符，putchar是输出一个字符。这个程序是每次从输入获取一个字符，如果该字符不是空格就直接输出，是空格就判断在这之前的字符是否也为空格，如果不是就输出。也就是如果有连续多个空格，就只输出第一个。重复直到遇到文件结尾符
user-0 提问: 输入不同的字母 最后按字母表的顺序输出（因为刚学malloc这个方法，想利用这个来储存输入的值）

回复:
user: user-0
content: 谢谢老师 我去试一下

user: user-1
content: 修改后的代码如下，关键处有注释：  #include <stdio.h> #include <stdlib.h> void array(char*p, int i) { 	int m; 	int n; 	int temp; 	for (m = 0; m < i-1; m++) { 		for (n = m+1; n < i ;n++) {  			if (*(p + n) < *(p + m)) { //要真正的交换，而不是交换函数内的局部变量。 				temp = *(p + m); 				*(p + m) = *(p + n); 				*(p + n) = temp; 			} 		} 	} } 	 int main() { 	int i, n; 	char*p; 	scanf("%d", &i); //注意：回车后缓冲区还有一个字符'\n' 	p = (char*)malloc(i*sizeof(char)); 	if (p == NULL)exit(1); 	getchar(); //接收之前缓冲区的字符'\n' ，保证下面的输入正确 	for (n = 0; n < i; n++) { 		scanf("%c", (p + n)); 	} 	array(p, i); 	for (n = 0; n < i; n++) 		printf("%c", *(p + n));  	return 0; }  运行范例如图：
user-0 提问: C语言 windows socket编程 遇到一个变量问题

回复:
user: user-0
content: 问题已经找到了，谢谢user-1的回复。 问题在于函数的参数传递时，形参传递有问题，虽然参数名称是和全局变了一致，但是，函数在内部执行时，只是按局部变量来执行，所以在函数返回时，变了就被清零了。正确的做饭时，将形参取引用&，这样，问题就解决了。 谢谢user-1的回复。结贴。

user: user-1
content: 没有看到代码前是不知道问题出在什么地方， 仅凭借你给出的信息来猜测，应该是以下几种可能： 1.变量的生命周期结束。 2.变量在其他地方再次被初始化
user-0 提问: 如何用C实现文件的加载，有人做过吗

回复:
user: user-1
content: 难道是PE文件？

user: user-2
content: 文件加载可以理解成将文件内容读到内存，对于文件读写有很多接口可以选择～

user: user-3
content: fopen,fscanf，fgetc，fgets等就好了。

user: user-0
content: 引用 3楼春风醉 的回复:LZ，你要加载什么文件？要达到什么效果？ 你的问题没说明白，没法回答你。是想实现软件文件的更新吧

user: user-4
content: 百度搜相关关键字。

user: user-5
content: 路过看看111

user: user-6
content: LZ，你要加载什么文件？要达到什么效果？ 你的问题没说明白，没法回答你。

user: user-7
content: 楼主的意思是把可执行文件的映像加载到内存中？

user: user-8
content: 不是很明白你的需求，如果仅仅是把文件加载到内存，不就是fopen,  fread就完事了吗？
user-0 提问:  C语言初学者  求助帖   

回复:
user: user-1
content: Checkchar没有初始值

user: user-2
content: 你好。 Windows版： 1.Enter 2.Ctrl+Z Linux版： Ctrl+D

user: user-3
content: Windows：Enter、Ctrl+Z、Enter Linux：Ctrl+D

user: user-4
content: 没有eof所以循环一直循环

user: user-5
content: 引用键盘上的enter就是从里面的\n  是的。

user: user-6
content: Checkchar没有初始值

user: user-7
content: 你输入EOF了吗

user: user-0
content: 谢谢大家的回答，4楼很给力，差不多明白啦，小白顺便再问一下，键盘上的enter就是从里面的\n对吧

user: user-0
content: 回复1楼：getchar函数从标准输入读取一个字符并返回它的值；如果输入中不存在任何字符，函数就会返回常量EOF（在stdio.h中定义），用于提示文件的结尾。这个是摘自《C和指针》上的，我不是很懂，请问要怎么输入EOF呢？是因为这个导致printf("Checkchar=%d\n",Checkchar);  没办法输出吗？

user: user-5
content: 不是初始值的问题。 仅仅按下回车，并没有退出循环，仍然在等待输入。 解决办法是按下ctrl + z，这样才发送EOF，从而循环终止，显示结果。 看一下图就更清楚了：

user: user-0
content: 没有赋初值不是默认初始化零吗
user-0 提问: 用C编写多线程的客户端和服务器，实现一对一对话。两者可以不按顺序发言。

回复:
user: user-0
content: 好的，我去看看。

user: user-1
content: 网络通信网上有好多成熟的第三方库的，直接下载调用就好了
user-0 提问: C语言课程设计 判断星期几，不使用time.h

回复:
user: user-1
content: 引用第二个我的想法是，建立一个循环，判断一次以后，输入0退出 答案中的代码主要解决输入，星期的算法挺好，应该没问题。

user: user-1
content: 修改后的代码如下，关键处有注释：  #include<stdio.h> #include<stdlib.h> #include<conio.h>  void JudgementWeekday(int year, int month, int day) {//week是输出值 ，不用放在参数列表中  	int week; 	if (month == 1 || month == 2) { 		month += 12; 		year--; 	} 	week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7; 	switch (week) 	{ 	case 0: 		printf("Sunday!\n"); 		break; 	case 1: 		printf("Monday!\n"); 		break; 	case 2: 		printf("Tuesday!\n"); 		break; 	case 3: 		printf("Wednesday!\n"); 		break; 	case 4: 		printf("Thursday!\n"); 		break; 	case 5: 		printf("Friday!\n"); 		break; 	case 6: 		printf("Saturday!\n"); 		break; 	} } int main() { 	int year, month, day; 	char ch; 	while (true) { 		printf("Please enter year,month,day:\n"); 		scanf("%d,%d,%d", &year, &month, &day); 		JudgementWeekday(year, month, day); 		printf("\nType 0 exit, press any key to continue!\n"); 		if ((ch = getch()) == '0'){ //输出一次week结果后，判断输入字符是否为0，再进行不同处理。 			break; 		} 		else{ 			continue; 		} 	} } 运行效果如下图：
user-0 提问: 请教大家，一道面试题。谢谢！

回复:
user: user-1
content: 图片太小不能看，你就把语法特性去除就是伪代码了，通用的一个描述。

user: user-1
content: 引用 4 楼 jianwen0529 的回复:伪代码其实很随意的啊，说实话我也是第一次写 for i:=1 to 100     if i%3=0 and  i%5=0         print "FizzBuzz"     elseif  i%3=0         print "Fizz"     else if   i%5=0         print "Buzz"  用中文都可以。 大概就算一个流程罢了 反正就那么个意思，相当于程序的草稿

user: user-1
content: integer  引用 2 楼 qq_29448025 的回复:[quote=引用 1 楼 jianwen0529 的回复:] 图片太小不能看，你就把语法特性去除就是伪代码了，通用的一个描述。 谢谢，题目如下，请帮忙再看看：  [/quote] 伪代码其实很随意的啊，说实话我也是第一次写 for i:=1 to 100     if i%3=0 and  i%5=0         print "FizzBuzz"     elseif  i%3=0         print "Buzz"     else if   i%5=0         print "Buzz"  用中文都可以。 大概就算一个流程罢了

user: user-2
content: 这不是要求不能用C语言,伪码一般是为了简单快速地写完逻辑.

user: user-0
content: 引用 1 楼 jianwen0529 的回复:图片太小不能看，你就把语法特性去除就是伪代码了，通用的一个描述。 谢谢，题目如下，请帮忙再看看：
user-0 提问: C语言结构体问题

回复:
user: user-1
content: typedef struct user { char number[CARD_NUMBER_LENGTH + 1]; char password[CARD_PASSWORD_LENGTH + 1]; char name[CARD_NAME_LENGTH]; int balance; time_t lastLoginTime; int attempts; user *next;//链表 } *puser  相当于  struct user { char number[CARD_NUMBER_LENGTH + 1]; char password[CARD_PASSWORD_LENGTH + 1]; char name[CARD_NAME_LENGTH]; int balance; time_t lastLoginTime; int attempts; user *next;//链表 };  typedef struct user *  puser;  于是puser就是一个类型，是struct user *类型的别名，这也就是typedef的作用，一般是简化类型名的长度方便敲码，还有是维护的时候增加修改类型的方便性。

user: user-2
content: 楼上解释正解。  typedef 功能就是给类型起别名，是为了简化表达。     举个例子： typedef int *p; //给 int * 这种类型起个别名，叫做p p a;  //等同于 int  *a p *a; //等同于int  **a;
user-0 提问: 求助

回复:
user: user-0
content: 这应该是16进制的ascii码

user: user-0
content: 二进制。。。。

user: user-1
content: 你这是明文还是二进制？ 明文就读取如何判断三个连续出现如何提取后面的N个项 二进制类似，提取后面的N个字节
user-0 提问: 为什么case2有问题？求大神

回复:
user: user-1
content: 又是给了一堆代码然后说有问题的帖子。  你倒是描述下遇到的是什么问题： 编译错误（错误提示）？运行错误（崩溃还是什么）？结果跟预期不符（给测试数据或者运行截图）？其他……
user-0 提问: 因数分解的一些小问题

回复:
user: user-0
content: 引用 4 楼 kugeniha的回复:那你就加个判断，n是否等于1，再决定要不要再输出个n 是的，这样也可以，就解决了问题  但是我想搞清楚，为什么出现上面所说的原因

user: user-0
content: 引用 5 楼 user-2的回复:代码的严谨性是决定代码好坏的一个标准。 嗯嗯，说得对，谢谢指点哈。

user: user-1
content: 那你就加个判断，n是否等于1，再决定要不要再输出个n

user: user-2
content: 代码的严谨性是决定代码好坏的一个标准。

user: user-0
content: 1.如果按照这里所写代码来运行那么，当输入9，8，之类有相同因数的情况下会多输出一个1 2.去掉打注释的那个printf语句后，当输入9，8之类的数，正常输出，但是输入其他类型的数，在输出因数的结果上会少输出最后一个因数。  求大佬来看看，试运行一下，分析分析。

user: user-0
content: 嗯嗯，那个scanf里面是多余了个等号，不过实际情况没影响，刚才我又试验了几遍

user: user-2
content: 代码有一定的问题。scanf里面不需要加=,i的值在你n变了以后也要变。   想不清楚这个过程。你可以尝试的去用一些例子一步一步分析。   其实也就是一步一步求因数的过程。最后剩下的数无因数可求了。但是这个数也会是它的因数。
user-0 提问: 关于结构体

回复:
user: user-1
content: 强烈BS一下不结贴不散分的人。。。。。

user: user-0
content: 谢谢大家,已经找到问题了

user: user-2
content: 定义前面加上typedef，或者在使用前面加上struct就可以了！

user: user-3
content: 假设main.c包含xxx.h。 xxx.h文件中应该有struct的完整定义，而不能只是声明。  struct是C语言的关键词，使用不需要包含什么头文件。

user: user-4
content: 你是不是在结构体中定义了一个指向此结构的指针？ 如果是这样，需要先声明结构名字。 struct xxx; struct {     ...     struct xxx *ptr; } Mystru;  或者这样 struct xxx {     ....     sttuct xxx *ptr; }Mystru;

user: user-1
content: 定义的位置有问题， 遵从的原则是先定义后使用， 建议在编译时增加断点  结构体里面和调用定义的地方，
user-0 提问: 对于单链表存储结构及尾插法的几点懂

回复:
user: user-1
content: 引用 楼主 qq_27322991 的回复:代码如下： void CreateListTail(LinkList *L,int n) {         LinkList p,r;//关键还要看  LinkList 是什么类型，是否为地址。 //代码执行到这里，p、r在内存中分配了对应的空间了么 //初始化两个链表元素，内容不定         int i;         *L = (LinkList)malloc(sizeof(Node));         r = *L; //代码执行到这里，r=*L，这条赋值语句，是将*L中的值赋值给r了，还是此时r已经与L指向相同的地址块，为什么？ //你可以查看  &r  和 L 值是否相同，如果相同，则为相同地址。         for (i=0 ; i<n ; i++)         {                 p = (Node*)malloc( sizeof( Node ) );                 p->data = i;                 r->next = p;                 r = p;         }         r -> next = NULL; }  这个程序存在的问题： 1.内存空间分配完毕后，不知道链表的首地址是哪个。 2.由问题1引发的第二个问题，malloc 之后，必须有free对相应的空间进行释放操作。【当然，如果使用new创建对象，要使用delete进行内存回收】

user: user-2
content: p、r、*L都是指针。 函数中声明了p、r，它们都分配了空间，只不过是指针，它们所指向的内存不确定，可以说，它们所指向的对象不确定。给它们赋值后，就能确定指向谁了。 L作为函数的形式参数，一旦调用该函数，L就已经分配了空间，并且它的值（指针值）就是实参的值。 r = *L; 后，把*L的值赋值给r了，r所指向的对象与*L所指向的对象在同一位置，即指向同一对象了。
user-0 提问: 为什么链表最后插入一个节点要吧头节点给出去

回复:
user: user-1
content: //以下三行作用是到达最后一个节点     node *last = head;     while(last ->next != NULL) //最后一个节点next == NULL，此时跳出循环         last = last ->next;     last->next = new_node; //然后在最后一个节点后面添加一个新节点

user: user-0
content: 引用 1 楼 fight_in_dl 的回复:首先需要说明，链表可以没有头结点，但必须有头指针（这是另外一个问题） 为了使空链表与非空链表处理一致，我们通常设一个头结点。以下讨论都是基于有头结点的情况。   如果阅读Link list的完整代码，会发现不仅是insert_last，在其它位置插入节点、删除节点、倒序排列节点等操作都返回头节点。 这是由链表的数据结构决定的，只有从头节点出发，通过指针域next，才能找到(遍历)链表节点。 头节点不确定，链表的存取操作就无法进行。  因此，进行了改变链表的操作后，都需要返回头结点。   node *last = head;那这一步的head 的作用是什么呐

user: user-0
content: node *last = head;那这一步的head 的作用是什么呐

user: user-1
content: 首先需要说明，链表可以没有头结点，但必须有头指针（这是另外一个问题） 为了使空链表与非空链表处理一致，我们通常设一个头结点。以下讨论都是基于有头结点的情况。   如果阅读Link list的完整代码，会发现不仅是insert_last，在其它位置插入节点、删除节点、倒序排列节点等操作都返回头节点。 这是由链表的数据结构决定的，只有从头节点出发，通过指针域next，才能找到(遍历)链表节点。 头节点不确定，链表的存取操作就无法进行。  因此，进行了改变链表的操作后，都需要返回头结点。
user-0 提问: 请教如何使用global全局的struct指针

回复:
user: user-1
content: 把指针的指针赋给指针，所以错误

user: user-2
content: 两个地方需要修改：         init->message = NULL; //空指针 	ptr_running = init;  //去掉& 	printf("%s\n", ptr_running->message);

user: user-3
content: ptr_running = &init; 改成 ptr_running = init;
user-0 提问: 编译器中提到的int型是不是指实参1“abc”的类型为int型？仅仅出现"abc",也没声明它的类型。为何是int型？

回复:
user: user-1
content: 理解和讨论之前请先学会如何观察！  //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-0
content: 那参数2"abc"是什么类型？ 还有关于char*看到网上有种说法char*占4个字节所以也可以看作int型。 get(m)的放回值是数组首地址，这个地址是一个char*,也可以看作int型，都占4字节，可以这样理解吗？

user: user-2
content: get(m )的返回值是int，所以用他作为参数！

user: user-3
content: 首先，"abc"是参数2，gets(m)才是参数1。  出现警告的原因是新的C标准认为gets函数不安全、过时的函数。 在stdio.h中不再有该函数的声明(关于这点，你可以打开stdio.h文件查找验证)。  而C中对无明确返回值类型的函数，默认为int类型，题目中的main主函数也是这种情况。 解决办法： 1  这只是警告，不影响运行，保持原代码不变。 2  改用fgets函数，可以百度搜索fgets的用法。
user-0 提问: 解析文件内容

回复:
user: user-1
content: GetPrivateProfileString 和 GetPrivateProfileInt, 以及 SetPrivateProfileString

user: user-2
content: 这个要怎么解决？使用文件IO函数吧

user: user-0
content: 引用 4楼倦怠 的回复:msdn，百度，google 查读取ini文件嗯，谢谢

user: user-3
content: msdn，百度，google 查读取ini文件

user: user-0
content: 引用 1楼user-4 的回复:意思就是让你写一个函数  传入2个参数 一个指定Section 另一个指定Key 返回对应的 Value那我懂了，那就是根据条件查找内容，是用链表做吗，能不能指点一下思路

user: user-0
content: 哦，那我懂了，那就是根据条件查找内容了，那就用链表做吗？

user: user-4
content: 意思就是让你写一个函数  传入2个参数 一个指定Section 另一个指定Key 返回对应的 Value
user-0 提问: 关于C语言不通编译器运行结果不同的问题

回复:
user: user-1
content: 将int改为long long int 将pow函数改为连乘

user: user-2
content: pow函数的返回值为double类型。 因为存储精度的原因，计算机中不能用 == 符号比较两个浮点数是否相等。 通常的解决方法是：当两个浮点数的差的绝对值小于一个很小的数时，认为它们相等。 代码如下： double epsilon = 0.000000001; if (abs(a - b) < epsilon)  //认为a和b相等

user: user-3
content: 自己写函数肯定要好一些
user-0 提问: C语言枚举遍历问题为甚会出现下面的情况啊，求大神们解答~

回复:
user: user-1
content: 引用 3 楼 hkangj 的回复:[quote=引用 2 楼 wang0635 的回复:] 你确定是在学C++？还是C语言？[/quote在学C语言的 源程序扩展名改成 .c .cpp 的是C++源程序

user: user-0
content: [quote=引用 7 楼 jianwen0529 的回复:] 修改为 int s;[/quote可以具体点吗，我不是很懂，s不是定义成了枚举变量了吗，要怎样修改为int s?

user: user-2
content: 修改为 int s;

user: user-0
content: 引用 5 楼 jha334201553 的回复:引用 4 楼 hkangj 的回复:[quote=引用 1 楼 jha334201553 的回复:] enum 对象 s 怎么++，编译器跟你说不能++可是这是教材的例子，书上都是这么说的，可是编译就是会出错，不理解 编译器不一样，有些有强校验[/quote]那应该怎么处理这个问题，我用的是cfree5

user: user-3
content: 引用 4 楼 hkangj 的回复:引用 1 楼 jha334201553 的回复:enum 对象 s 怎么++，编译器跟你说不能++可是这是教材的例子，书上都是这么说的，可是编译就是会出错，不理解 编译器不一样，有些有强校验

user: user-0
content: 引用 1 楼 jha334201553 的回复:enum 对象 s 怎么++，编译器跟你说不能++可是这是教材的例子，书上都是这么说的，可是编译就是会出错，不理解

user: user-0
content: [quote=引用 2 楼 wang0635 的回复:] 你确定是在学C++？还是C语言？[/quote在学C语言的

user: user-1
content: 你确定是在学C++？还是C语言？

user: user-3
content: enum 对象 s 怎么++，编译器跟你说不能++

user: user-0
content: 引用 10 楼 user-4 的回复:枚举, 实际上跟c的宏是差不多的东西.  但比宏要高级一点. 用int更好一点, 但前提是你的 枚举值是自增+1的.  在你的程序中, 已经明显提示你了, 不能用后缀的++, 要使用前缀的++  所以for这里修改成这样  for(s=man; s<=woman; ++s) { // }修改了之后还是发现还是出现问题，可能是我的拓展名搞错了，在c++的枚举里面是没有定义++的运算符的所以才出错，经楼上的大佬提醒我修改回.c发现可以成功运行了

user: user-0
content: 引用 9 楼 wang0635 的回复:[quote=引用 3 楼 hkangj 的回复:] [quote=引用 2 楼 wang0635 的回复:] 你确定是在学C++？还是C语言？[/quote在学C语言的 源程序扩展名改成 .c .cpp 的是C++源程序[/quote]可能是我搞混了c和c++的拓展名了，修改了之后就可以运行了，谢谢大佬帮助

user: user-4
content: 枚举, 实际上跟c的宏是差不多的东西.  但比宏要高级一点. 用int更好一点, 但前提是你的 枚举值是自增+1的.  在你的程序中, 已经明显提示你了, 不能用后缀的++, 要使用前缀的++  所以for这里修改成这样  for(s=man; s<=woman; ++s) { // }
user-0 提问: 写一个删除多个空格个函数

回复:
user: user-1
content: 程序里面, p的下标应该是 j  ,  即p[j]=s[i];

user: user-1
content: 因为在你的程序中, 目标字符串p的下标是跟源字符串s的下标同步增长时, 如果s有连续空格, 则p的对应于这些连续空格的下标的字符没有赋值.  void del(char s[],char p[]) {     int i = 0, j= 0, state = 0;//state:状态,表面上一个字符是不是空格      while(s[i]!='\0')     {             if(s[i]==' ')//如果此字符是空格             {                 if(state ==0)//如果state是0,说明上一个字符不是空格,从而不是连续空格,可以向p的字符赋值                 {                     state = 1;//将state设为1,表示上一个字符是空格                     p[i]=s[i];                         ++j;//p的下标递增1                 }                  else{ //如果state不是0,说明上一个字符是空格,从而是连续空格,不可以向p的字符赋值,即不做任何操作                 }             }             else//如果此字符不是空格,则可以向p的字符赋值             {                 state = 0;//则将state设为0                 p[i]=s[i];                 ++j;//p的下标递增1             }             ++i;//s的下标递增1     } }
user-0 提问: c语言写串口数据0a变成0d 0a问题

回复:
user: user-1
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-0
content: 引用 7 楼 jha334201553 的回复:PC端看见数据0a变成0d0a，这个怎么看见的？用串口调试工具？还是自己处理了，相信POS数据是正确的，是PC处理问题 出现超时现象再使用串口调试工具。出现超时现象代码goto回去再写入数据，只要超时就会一直循环。没出现超时现象POS与PC调试发送相同的数据就没有多出来0D

user: user-0
content: 引用 5 楼 jha334201553 的回复:打开串口是怎么打开的，打开以后数据接收到你从哪里看到数据0A变成0D0A的（是写了日志吗）？ POS与PC直接相连，发送的数据与PC上调试工具收到的数据是一致的。

user: user-2
content: PC端看见数据0a变成0d0a，这个怎么看见的？用串口调试工具？还是自己处理了，相信POS数据是正确的，是PC处理问题

user: user-0
content: 引用 5 楼 jha334201553 的回复:打开串口是怎么打开的，打开以后数据接收到你从哪里看到数据0A变成0D0A的（是写了日志吗）？ 调用NDK：int PortOpen(EM_PORT_NUM emPort, const char *pszAttr); /**  *@brief	关闭串口  *@param	emPort	指定的串口  *@return  *@li	NDK_OK				操作成功  *@li	其它EM_NDK_ERR		操作失败 硬件那边按照我们的要求做了块板子，POS终端与板子通过串口通信(压力测试)。POS写串口数据之后，每次读串口数据超时了，便把POS与PC相连接在PC端看见数据0a变成0d0a，而在POS上显示的发送数据还是0a...

user: user-2
content: 打开串口是怎么打开的，打开以后数据接收到你从哪里看到数据0A变成0D0A的（是写了日志吗）？

user: user-0
content: 引用 1 楼 jha334201553 的回复:又碰到一个，是C函数库问题，你用fopen，open等函数的之后指定b、_O_BINARY 操作不就没事了 我是做应用层的，写串口数据之后然后就读串口数据了。“你用fopen，open等函数的之后指定b、_O_BINARY 操作不就没事了”这个能麻烦解释一下吗？如何操作。我这现象是偶尔出现。求指教~~~

user: user-2
content: \n  在windows上变成  \r\n ， 在Linux下还是 \n ,在macOS 上编程 \r   写错了

user: user-2
content: \n  在windows上变成  \r\n ， 在Linux下还是 \r ,在macOS 上编程 \n  因为C语言只是说\n是换行，并没有说\n一定是 0A，然后不同系统对换行概念定义不一致

user: user-2
content: 又碰到一个，是C函数库问题，你用fopen，open等函数的之后指定b、_O_BINARY 操作不就没事了

user: user-1
content: 推荐使用portmon软件辅助调试串口通讯程序。

user: user-1
content: 他山之石，可以攻玉。

user: user-3
content: 串口读写问题跟fopen，open有关系吗？？  POS和PC通信的时候，开个串口监控软件，监控一下就可以看到到底是哪边出的问题。  如果监控软件看到POS上发的数据是对的，那就是PC出现的问题。 如果监控软件看到POS上发的数据是不对的，那就是POS出现的问题。

user: user-0
content: 引用 10 楼 zhao4zhong1 的回复:不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了我是应用层的，底层的东西我也看不到。而且这套NDK用了好多年了，应该不会犯这种错误的吧。我的源码已贴出，凭着经验能看出问题来？还是说着就是底层的问题？
user-0 提问: c语言如何使窗口大小固定不可改变

回复:
user: user-1
content: 不一定对，仅供参考： SetWindowLong(hWnd,GWL_STYLE,GetWindowLong(hWnd)&~WS_SIZEBOX);

user: user-2
content: 这例子是改变cmd窗口，用了GetConsoleWindow函数。 通常用FindWindow函数  nHwnd = FindWindow ("NotePAD", ""); //找到记事本窗口 具体可查询： https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx  如何知道窗口类的名称呢？ 在visual studio 的 Tools菜单下有一项：Spy++。运行这个工具，打开其Search菜单，把Finder Tool图标拖到记事本标题栏上。 就可以得到窗口类信息。如下图：

user: user-2
content: 以前写的(测试通过)，希望有帮助： #include <Windows.h>   int main() {     printf("hello\n");     HWND hWnd = GetConsoleWindow(); //获得cmd窗口句柄     RECT rc;     GetWindowRect(hWnd, &rc); //获得cmd窗口对应矩形       //改变cmd窗口风格     SetWindowLongPtr(hWnd,          GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);     //因为风格涉及到边框改变，必须调用SetWindowPos，否则无效果     SetWindowPos(hWnd,         NULL,         rc.left,         rc.top,         rc.right - rc.left, rc.bottom - rc.top,         NULL);       return 0; } 如果对您有帮助，请采纳答案好吗，谢谢！
user-0 提问: 请教在C语言中，如何将struct存入在一个void* 空类型里

回复:
user: user-1
content: pcb b1={....}; node->item=&b1;

user: user-2
content: //-------------------------------     //现在需要在此处将新创建的proc 存入nd_arr的void* item中     // 但用nd_arr[0].item = &proc;      // 当用nd_arr[0].item->p_id   在这里会报错   此处主要是类型转换，void* 指针先指向proc结构体，此时不能直接使用nd_arr[0].item->p_id，因为item是void*的，而p_id是结构体的变量，不能访问，需要转换回来才可以访问。 改成这样试一下： pcb *ptmp = (pcb *)nd_arr[0].item; 此时使用ptmp->p_id就不会报错了。

user: user-3
content: //只要void*p所指向的内存已经分配且其大小装得下struct s： *(struct *)p=s;
user-0 提问: opencv里面我想将mat里面的数据变成复数

回复:
user: user-1
content: 为什么要直接将mat的数据类型改为复数呢 用mat存储要存储的复数的实部和虚部，计算时按复数运算规则不就行了？望楼主采纳

user: user-2
content: using CPX = cv::Complex<double> ;  int main () { 	const auto r1x = std::vector<CPX> {CPX {1 ,1} ,CPX {2 ,1} ,CPX {3 ,2} ,CPX {4 ,2}} ; 	auto rbx = cv::Mat (r1x ,true) ; 	CPX item2 = rbx.at<CPX> (2) ; 	return 0 ; }

user: user-3
content: Mat不支持复数元素类型。
user-0 提问: 定义一个时间函数，如何在main函数中判断是否到02:00

回复:
user: user-0
content: 引用 6 楼 jianwen0529 的回复:[quote=引用 5 楼 jianwen0529 的回复:] [quote=引用 4 楼 m0_38117705 的回复:] 背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了  到达或第一次超过指定时间执行一次然后退出循环，怎么会多次执行？[/quote] break;这个关键字总应该知道什么作用的[/quote] 是这样子的，这个监听进程也是在一个while循环中，每十秒循环一次，我怕影响到别的事情，我照着这位大手子的改了改，已经可以正常使用了，谢谢您

user: user-1
content: 引用背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了  主程序中当过了2点，就不再调用check_time函数，应该不会执行几次。  while (1)     {         if (check_time() == 1) //超过2点退出循环         {             printf("当前时间已经超过02点\n");             //执行你想要执行的语句             break;         }     }     return 0;

user: user-2
content: 引用 5 楼 jianwen0529 的回复:[quote=引用 4 楼 m0_38117705 的回复:] 背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了  到达或第一次超过指定时间执行一次然后退出循环，怎么会多次执行？[/quote] break;这个关键字总应该知道什么作用的

user: user-2
content: 引用 4 楼 m0_38117705 的回复:背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了  到达或第一次超过指定时间执行一次然后退出循环，怎么会多次执行？

user: user-0
content: 引用 2 楼 fight_in_dl 的回复:代码如下，关键处有注释： int check_time(void) { 	int day,hour, second; 	struct tm *ptr; 	time_t it;  	it = time(NULL); 	ptr = localtime(&it); 	hour = ptr->tm_hour; 	second = ptr->tm_sec;  	if (hour - 2 >= 0 && second>0) //02:00:01即认为已经过02点 	{ 		return 1; 	} 	else 	{ 		return 0; 	} }   int main() { 	while (1) 	{ 		if (check_time() == 1) //超过2点退出循环 		{ 			printf("当前时间已经超过02点\n"); 			break; 		} 	} 	return 0; } 背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了

user: user-3
content: #include <windows.h> //...     while (1)     {         if (check_time() == 1) //超过2点退出循环         {             printf("当前时间已经超过02点\n");             break;         }          Sleep(60000);     }     return 0;

user: user-1
content: 代码如下，关键处有注释： int check_time(void) { 	int day,hour, second; 	struct tm *ptr; 	time_t it;  	it = time(NULL); 	ptr = localtime(&it); 	hour = ptr->tm_hour; 	second = ptr->tm_sec;  	if (hour - 2 >= 0 && second>0) //02:00:01即认为已经过02点 	{ 		return 1; 	} 	else 	{ 		return 0; 	} }   int main() { 	while (1) 	{ 		if (check_time() == 1) //超过2点退出循环 		{ 			printf("当前时间已经超过02点\n"); 			break; 		} 	} 	return 0; }

user: user-0
content: 谢谢大手子，感激不尽
user-0 提问: 帮忙看一下错在哪里呗~谢谢！

回复:
user: user-1
content: 最好自己先反复调试

user: user-2
content: fprintf(fp,"\n%s %c %.1f",p->name,p->sex,p->score); 应改为      fprintf(fp,"%s,%c,%.1f\n",p->name,p->sex,p->score);

user: user-2
content: 请判断fscanf函数的返回值。

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

回复:
user: user-1
content: 引用 3 楼 a24027 的回复:[quote=引用 2 楼 a24027 的回复:] 你好,我改过了,这个问题没有了,但是读取文件之后为什么不显示呢 引用 1 楼 zjq9931 的回复: if (pfData=NULL)  应当是：  if (pfData==NULL)   你好,这个我改过了,但是fread之后为什么不显示文件内容呢[/quote] 你这个代码里面根本就没有显示内容的代码啊。 直接就free掉了啊。 如果要显示的话用这个吧：puts(buffer); 提醒一下哈，你这个打开的是mp4文件，有可能显示一堆乱码，还有就是，上面那个函数遇到0会结束，由于mp4是二进制文件，里面有很多的0，所以，内容只是显示一部分哈。

user: user-2
content: fclose前加一句HexDump(buffer, lSize,0); void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

user: user-0
content: 引用 2 楼 a24027 的回复:你好,我改过了,这个问题没有了,但是读取文件之后为什么不显示呢  引用 1 楼 zjq9931 的回复: if (pfData=NULL)  应当是：  if (pfData==NULL)   你好,这个我改过了,但是fread之后为什么不显示文件内容呢

user: user-0
content: 你好,我改过了,这个问题没有了,但是读取文件之后为什么不显示呢

user: user-1
content: if (pfData=NULL)  应当是：  if (pfData==NULL)
user-0 提问: shell脚本命令错误后继续执行

回复:
user: user-1
content: if cd$somepath > /dev/null 2>&1; then    echo "error" fi

user: user-2
content: 可以换个思路，先判断目录是否存在， 如果存在，再调用cd命令。 如果不存在，不处理或者给出提示信息。
user-0 提问: 有关C语言中字符串模糊化的问题及思考

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <string.h> char s[256]; char *p; int r,n,i; int main() {     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //

user: user-2
content: 你举的例子都含混不清，什么叫"后两位不转换"？这个""位"是什么意思在ANSI字符串中，一个英文字母占1个字节，而一个汉字占两个字节，中英文混输后果不堪设想，建议你先了解C语言中的字符串，以及你可能需要的UNICODE(宽字符)字符串
user-0 提问: 关于for循环中的if条件满足时该怎么退出整个循环

回复:
user: user-0
content: 我明白了= = #include<stdio.h> void main() { 	int i,j,a[5][7],flag=0; 	for(i=0;i<=4;i++) 	{ 		for(j=0;j<=6;j++) 			scanf("%d",&a[i][j]); 	} 	for(i=0;i<=4;i++) 	{ 		for(j=0;j<=6;j++) 		{ 			if(a[i][j]<0) 			{ 				flag=1; 				printf("查找到的数为%d\n",a[i][j]); 				break; 			} 		} 		if(flag==1) 			break; 	} }
user-0 提问: 求大神帮忙

回复:
user: user-1
content: 百度搜相关关键字。

user: user-1
content: https://www.baidu.com/s?wd=登录系统%20注册%20登录%20私信%20公告%20DES%20RSA%20MD5

user: user-0
content: 引用 1 楼 赵4老师的回复:百度搜相关关键字。 百度上面搜不出来，没有
user-0 提问: 我写的CCF的编程，只有10分，想问下如何改代码呢，改成100分，还写了其他几个问题，在编译器上都能运行，但都是0分

回复:
user: user-1
content: 结果好像都是错的吧

user: user-2
content: 百度搜相关关键字。

user: user-0
content: 谢谢，我看了你编的代码，对我很有用，我的代码里面没有构造函数，这些我还不是很熟练所以不敢写在里面，构造函数的时候，我还对形参和实参不知道怎么弄

user: user-3
content: #include<stdio.h>  #define MAX 1000  void bubble_sort(int *arr, int len); int distribute_cake(int *arr, int len, int key_val); void print_cake(int *arr, int len);  int main() {     int a[MAX], i;     int n, k, count;      scanf("%d",&n);      if(n!=0){         scanf("%d",&k);     }     if(n == 0)         return 0;      for(i=0;i<n;i++)         scanf("%d",a+i);      bubble_sort(a, n);     //print_cake(a, n);     count = distribute_cake(a, n, k);      printf("%d\n",count);      return 0; }  void print_cake(int *arr, int len) {     int i;      for (i = 0; i < len; i++)         printf("%d\t", arr[i]);     putchar(10);  }  int distribute_cake(int *arr, int len, int key_val) {     int i, weight = 0, cnt = 0;     for (i = 0; i < len; i++) {         weight += arr[i];         if (weight >= key_val) {             printf("weight = %d\n", weight);             weight = 0;             cnt++;         }     }     if(weight > 0)         cnt++;      return cnt; }   void bubble_sort(int *arr, int len) {     int i, j;      int tmp;     for (i = 0; i < len; i++)         for (j = 0; j < len - 1 -i; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } } 题目中有一点，就是将最小的发出去。每次都是将剩下的最小的发出去。那么，就要对输入的数据进行一个排序； 上面的程序作为一个参考吧
user-0 提问: visual studio 2017,threads.h, thrd_sleep无效

回复:
user: user-1
content: 请问你include <thr/threads.h>，这个文件是在哪个目录下，我遇到VS2017下include <thr/threads.h>报找不到文件。

user: user-2
content: 《Windows核心编程》

user: user-0
content: 首先，感谢 @赵4老师 的回答,让我意识到我对线程睡眠的理解可能错误。  进一步查询资料，参考http://blog.csdn.net/horstlinux/article/details/7911457文章后，我意识到对函数参数理解错误, int thrd_sleep(const struct timespec *duration, struct timespec *remaining); 按上面的文章使用timespec_get函数,获取当前时间后,再加上睡眠的秒数,测试成功. int timespec_get(struct timespec *ts, int base); 更改后的函数如下: int func(char * msg2) { 	struct timespec ts; 	struct timespec te;  	timespec_get(&ts,TIME_UTC); 	te.tv_sec = ts.tv_sec + 3;  	thrd_sleep(&te,NULL); 	printf("%s\n", msg2); 	return 0; }
user-0 提问: 求个问题，，，，，，

回复:
user: user-1
content: 你看一下select的用法

user: user-1
content: 你把这两句 selectcount+=1;     select(selectcount+1,&rfd,NULL,NULL,NULL); 改成select(socketid+1,&rfd,NULL,NULL,NULL);

user: user-2
content: WSAStartup The Windows Sockets WSAStartup function initiates use of WS2_32.DLL by a process.  int WSAStartup (   WORD wVersionRequested,     LPWSADATA lpWSAData   );   Parameters wVersionRequested  [in] The highest version of Windows Sockets support that the caller can use. The high order byte specifies the minor version (revision) number; the low-order byte specifies the major version number.  lpWSAData  [out] A pointer to the WSADATA data structure that is to receive details of the Windows Sockets implementation.  Remarks The WSAStartup function must be the first Windows Sockets function called by an application or DLL. It allows an application or DLL to specify the version of Windows Sockets required and to retrieve details of the specific Windows Sockets implementation. The application or DLL can only issue further Windows Sockets functions after a successfully calling WSAStartup.  In order to support future Windows Sockets implementations and applications that can have functionality differences from current version of Windows Sockets, a negotiation takes place in WSAStartup. The caller of WSAStartup and the WS2_32.DLL indicate to each other the highest version that they can support, and each confirms that the other's highest version is acceptable. Upon entry to WSAStartup, the WS2_32.DLL examines the version requested by the application. If this version is equal to or higher than the lowest version supported by the DLL, the call succeeds and the DLL returns in wHighVersion the highest version it supports and in wVersion the minimum of its high version and wVersionRequested. The WS2_32.DLL then assumes that the application will use wVersion. If the wVersion field of the WSADATA structure is unacceptable to the caller, it should call WSACleanup and either search for another WS2_32.DLL or fail to initialize.
user-0 提问: UNIX信号量

回复:
user: user-1
content: 百度搜相关关键字。

user: user-0
content: 引用 2 楼 user-2 的回复:pthread_create(&tid1,NULL,fun1,(void*)y);     pthread_create(&tid2,NULL,fun2,(void*)y);  //其实这里创建两个线程时，并不确保tid1线程先执行的。这个由系统的进程调度算法来决定。 我执行了你的程序几次，结果并不是完全一样的。  [root@localhost tmp]# ./a.out  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]#好的，蟹蟹你啊

user: user-2
content: pthread_create(&tid1,NULL,fun1,(void*)y);     pthread_create(&tid2,NULL,fun2,(void*)y);  //其实这里创建两个线程时，并不确保tid1线程先执行的。这个由系统的进程调度算法来决定。 我执行了你的程序几次，结果并不是完全一样的。  [root@localhost tmp]# ./a.out  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]#
user-0 提问: 上手一天新人敲代码时遇到的问题，求各位dalao帮助

回复:
user: user-1
content: scanf("%1f", &x);  //字母l打成数字1了 应该是： scanf("%lf", &x);  输入拼写错误，小心一些就好了。  如果对您有帮助，请采纳答案好吗，谢谢！

user: user-0
content: 但我输入的是30

user: user-2
content: 正确啊，sin0就是0
user-0 提问: 链表信息怎么输入文件

回复:
user: user-1
content: 两种思路： ①next不写入文件，仅将数据按next顺序写入文件。读取时重建next ②next写入文件时，翻译为文件偏移量。读取时按照文件中的偏移量随机读取每个数据。 以楼主的程度，选择①

user: user-0
content: 引用 5 楼 cfjtaishan 的回复:写文件是二进制的，打开文件时，自然是乱码；若是用fscanf/fprintf读写文件，打开就不应该是乱码了。 楼主你的逻辑有问题呢，首先，开户的时候已经将用户信息写到文件里，并且开户信息已经在内存里了，head头节点。为什么还要在登录的函数里再从文件里读呢。head链表已经有用户的开户信息了。操作重复了，建议开户只是向文件里写，不创建链表，登录从文件里读。 正常的逻辑是，开户写文件和创建链表（或插入节点），登录用开户创建的链表进行比较。当程序再次启动时，建立一个函数专门是从文件里读用户的开户信息，创建链表。这个链表头传给登录操作，用于匹配用户信息。 那next怎么写入文件呢，对链表不是特别熟，能教教我吗

user: user-0
content: 那next怎么写入文件呢，对链表不是特别熟，能教教我吗

user: user-2
content: 写文件是二进制的，打开文件时，自然是乱码；若是用fscanf/fprintf读写文件，打开就不应该是乱码了。 楼主你的逻辑有问题呢，首先，开户的时候已经将用户信息写到文件里，并且开户信息已经在内存里了，head头节点。为什么还要在登录的函数里再从文件里读呢。head链表已经有用户的开户信息了。操作重复了，建议开户只是向文件里写，不创建链表，登录从文件里读。 正常的逻辑是，开户写文件和创建链表（或插入节点），登录用开户创建的链表进行比较。当程序再次启动时，建立一个函数专门是从文件里读用户的开户信息，创建链表。这个链表头传给登录操作，用于匹配用户信息。

user: user-0
content: 我把开户文件改了一下，数据存入没问题了，但后面文件完全不能运行了 void kaihu(struct per *head)//开户函数  { 	head=NULL; 	FILE *fp;   //定义文件指针 	struct per *p1=NULL,*p2=NULL;   //p1,p2为定义链表指针 	p1=(struct per*)malloc(sizeof(struct per));  //开辟内存单元 	      printf("请输入您的姓名：\n");  //请数据输入链表中 		  scanf("%s",p1->name); 		  printf("请设置您的卡号：\n"); 		  scanf("%s",p1->ID); 		  printf("请设置您银行卡密码：\n");  		  scanf("%s",p1->code); 		  p1->money=0; 		  p1->next=NULL; 		  printf("您的个人信息为"); 		     printf("姓名：%s \n卡号：%s \n余额：%d\n",p1->name,p1->ID,p1->money); 		     if(NULL==head)           //为新用户开辟内存单元 		  { 			  head=(struct per *)malloc(sizeof(struct per)); 			  head->next=p1;    //进行头插法，将其作为第一个节点 		  } 		  else    //为新增客户开辟内存单元 		  { 			  for(p2=head;p2->next!=NULL;p2=p2->next); //进行尾插 			  p2->next=p1; 		  } 		  if((fp=fopen("infor.txt","w+"))==NULL) //为读写打开一个文本文件 		  { 			  printf("cannot open file\n"); 			  return; 		  } 		  fprintf(fp,"%s %s %d %s %d",p1->name,p1->ID,p1->money,p1->code,p1->next);  		      fclose(fp); 			  printf("\n"); 			  printf("恭喜您开户成功，请登录\n"); 			  system("pause"); 			  system("cls"); 			  denglu(head); } 怎么肥四啊

user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。

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

user: user-1
content: next的值在内存中是内存地址，在文件中是文件偏移量。
user-0 提问: hdu1459

回复:
user: user-0
content: 引用 2 楼 FancyMouse 的回复:if ((f.x == f.y&&f.z == 0) || (f.x == f.z&&f.y == 0)) 第三种情况呢 s=m+n，你要是m和n各裝一半，那就是s 1/2s 1/2s，那结果还是一步到1/2s 1/2s 0，第三种情况根本就不存在

user: user-1
content: 样例输入输出正确，并不一定能够通过。 样例的输入只是一种情形，程序应该考虑到其它可能的情况。

user: user-2
content: if ((f.x == f.y&&f.z == 0) || (f.x == f.z&&f.y == 0)) 第三种情况呢

user: user-3
user-0 提问: mingw32-make编译curl的时候出现no rule to make target 'mingw32-ssl-zlib'

回复:
user: user-1
content: 检查一下makefile。 如果有类似 xxx,mingw32-ssl-zlib,xxx 的地方，去掉逗号。

user: user-2
content: 建议改在Windows下的虚拟机（比如Hyper-V、VMWarw、VirtualBox、……）中的Linux下编译。
user-0 提问: 哪位大神可以帮忙看看为什么读取1位bmp图片出现乱图，用的c++和opengl

回复:
user: user-1
content: 引用 7 楼 limtyty 的回复:谢谢赵老师~ 应该顺带谢谢李彦宏。

user: user-0
content: 谢谢赵老师~

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 limtyty 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 用PS手动生成一幅1位bmp试试？ zhao4zhong1老师您好，以前经常看您给别的网友回复的帖子，深受启发，非常感谢您能回帖~ 我隐约觉得是glDrawPixels的格式不支持1bit 数据的关系[/quote] 百度搜“glDrawPixels的格式不支持单色位图” [/quote] 额，好吧，以后用图的时候还是先转24位咯

user: user-1
content: 引用 4 楼 limtyty 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 用PS手动生成一幅1位bmp试试？ zhao4zhong1老师您好，以前经常看您给别的网友回复的帖子，深受启发，非常感谢您能回帖~ 我隐约觉得是glDrawPixels的格式不支持1bit 数据的关系[/quote] 百度搜“glDrawPixels的格式不支持单色位图”

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:用PS手动生成一幅1位bmp试试？ zhao4zhong1老师您好，以前经常看您给别的网友回复的帖子，深受启发，非常感谢您能回帖~ 我隐约觉得是glDrawPixels的格式不支持1bit 数据的关系

user: user-1
content: 用PS手动生成一幅1位bmp试试？

user: user-0
content: 引用 1 楼 user-2 的回复:BMP文件头（14字节），位图信息头（40字节），定义如下： typedef struct tagBITMAPFILEHEADER {     WORD bfType;//位图文件的类型，必须为BM(1-2字节）     DWORD bfSize;//位图文件的大小，以字节为单位（3-6字节，低位在前）     WORD bfReserved1;//位图文件保留字，必须为0(7-8字节）     WORD bfReserved2;//位图文件保留字，必须为0(9-10字节）     DWORD bfOffBits;//位图数据的起始位置，以相对于位图（11-14字节，低位在前）     //文件头的偏移量表示，以字节为单位 }BITMAPFILEHEADER;   typedef struct tagBITMAPINFOHEADER{ DWORD biSize;//本结构所占用字节数（15-18字节） LONG biWidth;//位图的宽度，以像素为单位（19-22字节） LONG biHeight;//位图的高度，以像素为单位（23-26字节） WORD biPlanes;//目标设备的级别，必须为1(27-28字节） WORD biBitCount;//每个像素所需的位数，必须是1（双色），（29-30字节） //4(16色），8(256色）16(高彩色)或24（真彩色）之一 DWORD biCompression;//位图压缩类型，必须是0（不压缩），（31-34字节） //1(BI_RLE8压缩类型）或2(BI_RLE4压缩类型）之一 DWORD biSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节)，以字节为单位（35-38字节） LONG biXPelsPerMeter;//位图水平分辨率，每米像素数（39-42字节） LONG biYPelsPerMeter;//位图垂直分辨率，每米像素数（43-46字节) DWORD biClrUsed;//位图实际使用的颜色表中的颜色数（47-50字节） DWORD biClrImportant;//位图显示过程中重要的颜色数（51-54字节） }BITMAPINFOHEADER;  你的代码中只偏移0x12（14个字节） fseek(fp, 0x0012, SEEK_SET);//跳过bmp文件头和信息头的大小信息，指针fp指向信息头文件中的宽度数据处。  第40行，写了跳过调色板之前的信息，之后读取图片数据呀    fseek(fp, 62, SEEK_SET);  fread(pixeldata, picutredata, 1, fp);

user: user-2
content: BMP文件头（14字节），位图信息头（40字节），定义如下： typedef struct tagBITMAPFILEHEADER {     WORD bfType;//位图文件的类型，必须为BM(1-2字节）     DWORD bfSize;//位图文件的大小，以字节为单位（3-6字节，低位在前）     WORD bfReserved1;//位图文件保留字，必须为0(7-8字节）     WORD bfReserved2;//位图文件保留字，必须为0(9-10字节）     DWORD bfOffBits;//位图数据的起始位置，以相对于位图（11-14字节，低位在前）     //文件头的偏移量表示，以字节为单位 }BITMAPFILEHEADER;   typedef struct tagBITMAPINFOHEADER{ DWORD biSize;//本结构所占用字节数（15-18字节） LONG biWidth;//位图的宽度，以像素为单位（19-22字节） LONG biHeight;//位图的高度，以像素为单位（23-26字节） WORD biPlanes;//目标设备的级别，必须为1(27-28字节） WORD biBitCount;//每个像素所需的位数，必须是1（双色），（29-30字节） //4(16色），8(256色）16(高彩色)或24（真彩色）之一 DWORD biCompression;//位图压缩类型，必须是0（不压缩），（31-34字节） //1(BI_RLE8压缩类型）或2(BI_RLE4压缩类型）之一 DWORD biSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节)，以字节为单位（35-38字节） LONG biXPelsPerMeter;//位图水平分辨率，每米像素数（39-42字节） LONG biYPelsPerMeter;//位图垂直分辨率，每米像素数（43-46字节) DWORD biClrUsed;//位图实际使用的颜色表中的颜色数（47-50字节） DWORD biClrImportant;//位图显示过程中重要的颜色数（51-54字节） }BITMAPINFOHEADER;  你的代码中只偏移0x12（14个字节） fseek(fp, 0x0012, SEEK_SET);//跳过bmp文件头和信息头的大小信息，指针fp指向信息头文件中的宽度数据处。