Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于二维字符数组的使用，求大佬看看我的代码哪错了。

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

user: user-0
content: 引用 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，没看到按钮

user: user-1
content: 调试了一下，改了一个代码出来，如下：  #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 数组赋值的时候，末尾没有补空格也是一个遗漏。  上面的代码你先运行试试看看吧。并帮助的话，烦请及时结帖给分。：）

user: user-0
content: 而且这个Nste[0]长度也不正常，我用strlen测出来的长度是错的
user-0 提问: MSG结构体里的时间是什么？

回复:
user: user-1
content: https://devblogs.microsoft.com/oldnewthing/?p=2013

user: user-2
content: 为何不查msdn而是自己试呢？

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

user: user-2
content: 先去找下 c 的关于时间的类型比如 time_t __time32_t 还有关于时间的函数 比如 time() localtime() asctime() 等。。。。

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

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

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

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

user: user-0
content: 引用 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提供的“关机”，这不算真正的关机吗？

user: user-3
content: 就是系统启动的时间， 可以和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);   } }

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

user: user-4
content: 一般DWORD时间是1900年到当前的毫秒数
user-0 提问: 是三目运算符么？

回复:
user: user-1
content: 是 三目运算符 或者叫 三元条件运算符 。  以下内容摘引自百度百科三目运算符词条： <表达式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 」等等都可以，看表达式的返回值是什么就行了。万变不离其宗。

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

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

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

回复:
user: user-0
content: 嗯嗯。谢谢

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

user: user-0
content: 好像弄懂一些了，

user: user-0
content: 似乎是最后两个循环 不能读取到 s[i]具体的值
user-0 提问: 关于调用函数的问题

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

user: user-1
content: 程序有问题呢，一个问题是strlen参数需要时字符串，而非字符。另一个，''是一个字符，而不能超过一个字符。超过一个字符应该用双引号""

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

user: user-2
content: 段错误，程序挂了 程序挂的原因是strlen只能输入字符串，而不是字符 strlen('a')非法 strlen("a")合法

user: user-0
content: 第一张图和第二张图选图的时候卡了，重复了，各位大佬忽略第一张图哈
user-0 提问: size_t

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

user: user-2
content: 这是一个类型，size_t 可以理解为unsigned int

user: user-3
content: 可以理解为unsigned int的别名 和int bool float一样用法

user: user-4
content: 无符号长整型，在32位系统为32位，在64位系统上为64位

user: user-5
content: VS IDE中，在不明白的符号size_t上点鼠标右键，选转到定义。
user-0 提问: 请各位大佬看看，用链表模拟响应比高优先作业调度算法。输入数据有的结果正确，有的结果不对。到不知道代码错在哪里？

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

user: user-1
content: //scanf("%s",&p->name);         scanf("%s", p->name);    //去掉& 这个地方有问题，改一下再试试

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

回复:
user: user-1
content: #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; }

user: user-2
content: 字母和字母对调、数字和数字对调就可以了。
user-0 提问: 二维数组

回复:
user: user-1
content: #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; }

user: user-2
content: 二维数组就用2层for循环，输入输出都是如此
user-0 提问: 哪错了啊  运行不出来  我是初学者

回复:
user: user-1
content: 记得结贴，，，，，

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

user: user-3
content: 虽然是大一学的 感觉还是学到了

user: user-4
content: 好吧能运行，，，需要两次输入没考虑

user: user-4
content: 删了\n，也运行不了啊

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

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

user: user-6
content: - - 进来学学

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

user: user-8
content: 好久没看C了 不翻评论竟然一遍没找出问题

user: user-9
content: 高深，直接什么都看不懂，我也是初学

user: user-10
content: 先来看看，了解下

user: user-11
content: scanf 中不能添加\n

user: user-12
content: 看不出来 啦啦啦

user: user-13

user: user-14
content: 为什么if 块里有个输出语句？

user: user-15
content: 我来看看我来看看

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

user: user-1
content: 我再跟你稍微仔细说下是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”中间的这个空格一起匹配掉。

user: user-17
content: - - 进来学学
user-0 提问: 求解

回复:
user: user-1
content: 建议自己先写写吧

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

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

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

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

user: user-1
content: 不能，大侠请重头来过

user: user-3
content: 不能，只能重新开始到上一步设置断点
user-0 提问: 6去哪里了？

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

user: user-2
content: 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！

user: user-3
content: 有点儿搞不懂。。。

user: user-4
content: 要把4转成字符串才行的哟

user: user-5
content: 不要研究这种玩意儿，没用

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

user: user-7
content: 理解和讨论之前请先学会如何观察！   计算机组成原理→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执行停在该断点处的时候。

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

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

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

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

user: user-11

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

user: user-13
content: char s[]="Hello world\n"; printf(s+6);

user: user-14
content: 明白了吗

user: user-15
content: 我有点被吓到，刚刚试一下，在VC里居然支持： char   *sp = 6 + ＂hello world";  其效果与下面完全等效： char   *sp =  "hello world" + 6;  这是 C 风格? 还是 C++的？  用了多年的VC，但还是孤陋寡闻了，我这是第一次看到该格式。我只知道  6 + CString("hello world");
user-0 提问: 纯新手求问图中程序不是死循环吗？

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

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

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

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

user: user-3
content: 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
user-0 提问: 有80个学生，用数组保存学生学号和3门课成绩（例如1 87 78 90，学号和成绩均为整型数据）。编写程序统计各门课的不及格人数。

回复:
user: user-1
content: #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; }
user-0 提问: c语言从文件第一列读取两个值,并写入同文件的第三列

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

user: user-1
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224

user: user-0
content: 各位大佬，这是个很简单的问题，但我刚学c，看书还没看到这！实在写不出来
user-0 提问: 是位运算吧？

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

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

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

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

user: user-5
content: 二进制1024右移一位，等价于除以2
user-0 提问: 应该执行第一句呀

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

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

user: user-3
content: 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”

user: user-4
content: 这里用的是函数返回值，printf()返回值是整形，若成功则返回输出的字符数，输出出错则返回负值。也就是说switch(printf("hi-"))，等同于int len;  len = printf("hi-");    switch(len)…… 而此时len 表示的是printf打印的字符数，也就是3.所以执行case 3.
user-0 提问: 为什么文件格式化输出跟控制台格式化输出的结果不一致？

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

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

user: user-2
content: 说错了，不是txt中，是记事本中的显示方式

user: user-2
content: txt中一个\t貌似占4个中文符宽，控制台中只占两个中文符宽

user: user-3
content: 不能用iomanip里面的函数吗？（萌新小声哔哔）

user: user-4
content: 不清楚，不过，格式化输出的话，是否用空格会比较好点？？
user-0 提问: 怎么低成本高效地运行一个程序？

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

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

user: user-0
content: 其实我的问题可以总结为，爬虫系统用哪个编程写或者哪些框架运行快。好像可以如此总结
user-0 提问: 一个村子，有N个人，选举村长，候选人有张、王、李、赵四人，输入1则选张，输入2则选王，输入3则选李，输入4则选赵，输入其他值为废票。当输入-1时，投票结束，统计

回复:
user: user-1
content: 写个含有4个元素的数组，while(1)无限循环下 识别输入的是几，对数组相应的元素进行加一，当识别是-1的时候break.最后再写个循环，输出最大的元素。
user-0 提问: 如何获取有多个签名的文件的签名信息？

回复:
user: user-1
content: 大佬 能不能说清楚，我这边也遇到这个问题了...

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

user: user-1
content: 感谢大佬！

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

user: user-0
content: 引用 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里面找的。

user: user-1
content: unauth 是在哪里？？

user: user-2
content: 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啊，也就是不止一个

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

user: user-0
content: 引用 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枚举里面的证书，得到的结果
user-0 提问: fopen打开文件啊,为什么文件名设置为数组就出报错啊?

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

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

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

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

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

user: user-4
content: 引用 楼主 空瞳里的余生的回复: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 请教各位大神 你把大括号去掉试试吧

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

user: user-6
content: 编译器的报错贴出来

user: user-7
content: err = fopen_s(&head, arr, "rb"); 应该不会有问题
user-0 提问: 关于指针对齐/移位的操作一点疑问

回复:
user: user-0
content: 哈哈，解答的好快，已经结贴了。软件基础还要多学。

user: user-1
content: 该位对齐函数没有问题，它的意思是根据输入的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）

user: user-2
content: 就是把ptr向上取整到align倍数的值，比如ptr本来是0x40001001，align是8，则ptr变为0x40001008
user-0 提问: 求C语言大佬帮帮忙

回复:
user: user-1
content: 请贴代码，谢谢

user: user-0
content: 错误	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

user: user-0
content: #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; }  验证搭建是否成功的代码

user: user-2
content: 为什么不把代码直接贴出来，也把编译的错误贴出来。
user-0 提问: 请求大佬们，谢谢

回复:
user: user-1
content: 判断质数的函数网上有很多，如果输入的数不是质数，那么把这个数加1判断，减1判断，都不行，那么继续加2，减2一次类推

user: user-0
content: 引用 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; }  供参考！谢谢大佬啦

user: user-1
content: #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; }  供参考！

user: user-2
content: 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; } 随手写的，差不多这个样子吧，自己改改

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

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

user: user-0
content: 引用 1 楼 自信男孩 的回复：判断质数的函数网上有很多，如果输入的数不是质数，那么把这个数加1判断，减1判断，都不行，那么继续加2，减2一次类推我知道这思路啊，但写不出来
user-0 提问: c语言题，急用！

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

user: user-0
user-0 提问: c语言程序题

回复:
user: user-1
content: #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结束输入的，如果要改成指定数目就在循环前面输入，然后用输入的数字来给循环限制个范围就行了
user-0 提问: 如何在一个已经定义好的数组，且空间足够，增加一行数，

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

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

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

user: user-4
content: 严格来说，已经定义好的数组是不能扩展的。  你可以考虑使用 C++ 中的 vector
user-0 提问: 大佬们，帮帮大一的孩子，查个错

回复:
user: user-1
content: 这代码一看就是东拼西凑出来的，没有完整的思想

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

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

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

user: user-2
content: #include <iostream> #include <stack> #include <string.h>   using namespace std;  int main() { 	const char *pChar = "(((()()((())))))"; 	stack<char> stackMatch; 	for(size_t i = 0; i < strlen(pChar); i++) 	{ 		if (pChar[i] == '(') 		{ 			stackMatch.push(pChar[i]); 		} 		else if(pChar[i] == ')') 		{ 			stackMatch.pop(); 		} 		 	} 	if (stackMatch.empty()) 	{ 		cout << "true" << endl; 	} 	else 	{ 		cout << "false" << endl; 	} 	 	system("pause"); }
user-0 提问: 求问，浮点错误是什么？

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

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

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

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

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

user: user-2
content: 你的输入处理有问题 scanf("%d/%d %d%/%d",&a,&b,&c,&d);

user: user-3
content: 整型数取绝对值，建议用abs，而不是fabs

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

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

user: user-5
content: 加个断点调试一下，马上就能找出问题

user: user-5
content: gcd，lcm出问题，存在对0取余数的情况，调用的时候避免除数为0，另外gcd这样写对不对？ 另外有段错误，说明数组有非法访问
user-0 提问: 猴子吃桃数组解法

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

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

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

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

回复:
user: user-1
content: QueryFullProcessImageName需要vista+，可以用GetModuleFileNameEx或者GetProcessImageFileName替代

user: user-1
content: 有了进程ID，OpenProcess 然后 QueryFullProcessImageName

user: user-2
content: 简单点 有现成工具 spy++ 下载一个就行了

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

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

user: user-3
content: GetWindowThreadProcessId了解一下！
user-0 提问: 求大神帮忙解释一下这个程序 我知道这个是输出质数的 但是过程是什么意思？？

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

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

user: user-1
content: main就是输入一个区间,然后调用PrintPrimes打印这个区间的质数 PrintPrimes循环对区间内的所有整数进行IsPrime判断,如果是质数则输出这个数 IsPrime 判断一个数是否为质数,方法是用2到小于这个数的所有自然数去除它,如果余数全不为0,那么则是质数
user-0 提问: 求解：C语言中结构体与共用体的一道题

回复:
user: user-1
content: getchar吸收回车符，基本是个周经问题了

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

回复:
user: user-1
content: 要不试试用代码修改注册表？

user: user-0
content: 行，基本了解情况，感谢各位大佬

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

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

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

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

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

user: user-3
content: 这个需要写注册表 可以参考https://blog.csdn.net/zwc2xm/article/details/70140704
user-0 提问: 使用 libredwg 读取 .dwg 文件一直失败是什么原因？

回复:
user: user-1
content: 如何在VS下编译，编译发的32位程序可分享一下吗？

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

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

user: user-2
content: 我也试了发现不得行，我在windows中用C++调用libredwg，连dwg_read_file的方法都会报错，我在想会不会是因为编译的是linux系统下的问题，楼主解决了没？

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

user: user-3
content: 先用里面自带例子的例子测试下看看  http://ftp.gnu.org/gnu/libredwg/
user-0 提问: c语言

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

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

user: user-3

user: user-4
content: 楼上说得对，scanf的"和,位置反了，printf输出不需要地址
user-0 提问: 加速度计采集的加速度   怎么积分成速度位移

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 有人搞这个吗 ？有代码吗？

user: user-3
content: 楼主有代码吗?我现在也遇到这个问题了

user: user-4
content: 最简单的就是欧拉单步长法

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

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

user: user-1
content: CSDN被你当百度知道了  aver(a,N); void data(int);//使用前先声明

user: user-0
content: 11111求大哥啊啊啊啊啊啊啊啊
user-0 提问: keil 4显示激活已经成功，无法编译生成但是.H文件

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

user: user-1
content: 下面已经提示了2K代码限制， 说明激活没成功
user-0 提问: 是不是答案错了？

回复:
user: user-1
content: 这个和浮点数的精度有关。

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

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

user: user-2
content: int main() {     float a=0.7,b = 0.5;     if(0.7>a)         printf("Hi\n");     else         printf("Hello\n");      if(0.5==b)         printf("Ok\n");     else         printf("No\n");      printf("%.14lf,%.14lf\n",(double)a,(double)b);      getchar();      return 0; }    输出 Hi Ok 0.69999998807907,0.50000000000000
user-0 提问: 大神在哪里？帮忙解决一下问题

回复:
user: user-1
content: 仅供参考：//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

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

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

user: user-3
content: int i,j,n; float avg, a[4][2]=0; scanf(“%d”,&n); printf(“      课程1     课程2    课程3    平均分”); for(i=1;i<=n;i++)     printf(“学生%d\n”,i); for(i=0; i<4; i++)     for(j=0; j<2; j++)          printf(“6.1f”,a[i][j]);  大概一个思路，你可以参考下

user: user-0
content: 要求用数组解，谢谢了噢
user-0 提问: 写的程序出现问题，求助！！

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

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

user: user-2
content: 你问题没描述清楚啊

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

user: user-1
content: 什么问题，先描述一下吧
user-0 提问: 十个成绩

回复:
user: user-1
content: #include<stdio.h> int main() { printf("hallo"); }

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

user: user-3

user: user-4
content: 新手来看看。
user-0 提问: C语言用循环怎么写

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

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

user: user-0

user: user-1
content: 倒数第二个是那个测试点？
user-0 提问: 关于c语言

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

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

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

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

user: user-2
content: 话说你从来都不结贴的吗？

user: user-2
content: 定义一个int型数组，长为20 定义一个静态int型变量i并初始为0 定义一个名为flag的int型变量并初始为1 定义一个char型变量 l 屏幕清空 在屏幕输出这样一段文字：**************欢迎进入学员信息的录入！*****************         （末尾有个换行）

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

user: user-4
content: 变量声明不懂？ system清屏不懂？ printf打印不懂？
user-0 提问: 急求拼图游戏

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

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

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

user: user-2
content: 这就需要你的代码支持这个操作 比如你写的拼图游戏，移动方块调用函数move（x1，y1，x2，y2）,在调用的地方同时把x1，y1，x2，y2推到一个栈里面 如果要撤销，其实就是将栈顶的数据反过来调用move（x2，y2，x1，y1）
user-0 提问: C语言运行出现问题，得不到最大值

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

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

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

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

user: user-2
content: *temp = *b  // 第一个参数指向的值变成5 *b = *c//第一个参数指向的值变成3 *c = *temp//第三个参数指向的值变成3 第二个参数的值始终没变，所以是373
user-0 提问: c语言定义多个变量

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

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

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

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main() {     int num;     double number;     char ch;     scanf("%d%lf%c",&num,&number,&ch);     printf("%d,%.1f,%c",num,number,ch);     return 0; }
user-0 提问: 这句代码是什么意思？求解

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

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

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

user: user-1
content: j>=len-1说明到了数组的最后一个位置，就需要加长了
user-0 提问: c语言一道小题

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

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

user: user-3
content: while第一次i--成3,打印时--i成2, while第二次i--成1,打印时--i成0， while第三次i--成-1,没进去
user-0 提问: # endef有什么用？

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

user: user-2
content: 百度多快啊。。。。。。

user: user-3
content: 看书 或者 百度 吧
user-0 提问:   这里fun(--n); 怎么理解？起什么用

回复:
user: user-1
content: 等价于: n=n-1; fun( n )

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

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

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

user: user-5
content: 就是个简单的递归操作。

user: user-6
content: 想想printf放在 fun(--n);前面和后面有什么区别
user-0 提问: 二维数组指针使用的疑问

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

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

user: user-1
content: 应该是  *(*(p+a)+b)

user: user-2
content: 输出有问题吧，应该是p[a][b]
user-0 提问: windows下使用gcc出现一个警告怎么解决

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

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

user: user-3
content: 直接贴信息吧，图片看不清楚～
user-0 提问: 如何进行语言学习？

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