Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言 短信pdu解码编码 USC2

回复:
user: user-1
content: 对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。啊 GBK:0xB0 0xA1,Unicode-16 LE:0x4A 0x55,Unicode-16 BE:0x55 0x4A,UTF-8:0xE5 0x95 0x8A  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-0 提问: 能否实现通过判断函数入参的值决定代码是否参与编译？

回复:
user: user-0
content: 引用 4 楼 DelphiGuy 的回复:如果你要不满足LOG级别的输出部分彻底不生成代码，可以把LogOutput用宏实现： #define LogOutput(LogLevel, Msg) LogLevel <= LOG_LEVEL ? printf("%s\n", Msg) : 0  多谢大神！简单查了一下，搞定了！多谢多谢！

user: user-0
content: 引用 4 楼 DelphiGuy 的回复:如果你要不满足LOG级别的输出部分彻底不生成代码，可以把LogOutput用宏实现： #define LogOutput(LogLevel, Msg) LogLevel <= LOG_LEVEL ? printf("%s\n", Msg) : 0  您提供的方法可行！ 我们的LogOutput函数入参要支持不定参数，请问#define的表达式该怎么写？ #define LogOutput(LogLevel, Msg,...) LogLevel <= LOG_LEVEL ? Output(LogLevel, Msg,...) : 0 Output函数中封装了printf，上边的宏定义编译报错，请问要怎么修改？

user: user-1
content: 如果你要不满足LOG级别的输出部分彻底不生成代码，可以把LogOutput用宏实现： #define LogOutput(LogLevel, Msg) LogLevel <= LOG_LEVEL ? printf("%s\n", Msg) : 0

user: user-0
content: 引用 1 楼 DelphiGuy 的回复:#define LOG_CRITICAL 0 #define LOG_ERROR    1 #define LOG_WARNING  2 #define LOG_INFO     3 #define LOG_DEBUG    4  #define LOG_LEVEL LOG_ERROR  void LogOutput(int LogLevel, const char *OutStr) {   if (LogLevel <= LOG_LEVEL) printf("%s\n", OutStr); } 这种方式还是会使所有打印的地方参与编译，所以不会减小代码的size，只是不满足条件的不输出而已，不会省多少空间 我想实现的是通过某种方式，使不满足一定level的输出不参与编译，这样才能节省非常可观的size

user: user-2
content: 一楼方法可以 不过也只是省了一个参数入栈/寄存器和函数调用的指令 你确定真的能省很多空间？

user: user-1
content: #define LOG_CRITICAL 0 #define LOG_ERROR    1 #define LOG_WARNING  2 #define LOG_INFO     3 #define LOG_DEBUG    4  #define LOG_LEVEL LOG_ERROR  void LogOutput(int LogLevel, const char *OutStr) {   if (LogLevel <= LOG_LEVEL) printf("%s\n", OutStr); }
user-0 提问: 请教c函数参数入栈的问题

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: 如果你测试的可以这么写，如果是项目代码，这样写是很危险的，不同的编译器会编译出不同的结果，vs的话可以显式的定义函数调用约定，gcc不是很清楚了

user: user-2
content: 看编译器不同，编译的方法不同，如果你用的gcc编译链接的，默认函数调用约定是stdcall，参数是从右至左压入栈的

user: user-3
content: 个人观点：感觉是Windows下的编译器跟linux下的编译器在处理函数参数时，在栈中的处理方式不一样了，导致这样的结果。。

user: user-3
content: 楼主，下面的是我在windows vs2013 控制台的输出： 你的第一个问题，add_normal2 和 add_normal3 输出如下(崩溃了)：  你的第二问题，这边输入的值如上：   可见是否你那边的linux编译器在代码中做了什么处理跟windows不一样，这样能不能认为是编译器不同导致的。

user: user-1
content: 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-4
content: 这个行为完全取决于平台、编译器。 一、最左边的参数，到底是在栈顶还是栈底，取决于环境。 二、栈元素之间的字节对齐，C标准里也没有规定。 还是建议用变参的辅助函数 va_list做，就安全了。 https://blog.csdn.net/dengzhilong_cpp/article/details/54944676
user-0 提问: 自定义函数声明时，形参为指针变量，指针变量名为什么可以为空？？

回复:
user: user-0
content: 我突然想起来声明中可以不写形参，ok啦

user: user-1
content: 聲明處只需要有類型，確實是這樣的。
user-0 提问: static STATUS_VAL ai是static的什么用法？

回复:
user: user-0
content: 感谢各位，明白了

user: user-1
content: 声明了一个名为 ai 的变量，该变量具有以下性质： ① 静态存储类型（在程序执行过程一直存在） 第一次进入到 ai() 函数时，定义一个类型为 STATUS_VAL 的变量 ai，并且在跳出 ai() 函数时不丢弃该变量。 第二次以及之后进入到 ai() 函数时不再定义变量 ai。STATUS_VAL 是定义的结构类型名，相当于 int，char，double 之类的。 ② 块作用域（从 ai() 函数的 左花括号{ 到 ai 函数的 右花括号} ）       只能在 ai() 函数的代码块中访问变量 ai。

user: user-2
content: 函数定义了两个静态变量，1个 unsigned char 类型，1个自定义的结构体类型

user: user-0

user: user-0
content: 引用 3 楼 user-3 的回复:静态变量 和局部变量不同 出了函数的定义域还是有效的中间的STATUS_VAL作用是什么呢？

user: user-3
content: 静态变量 和局部变量不同 出了函数的定义域还是有效的

user: user-0
content: 用的pic单片机

user: user-0
content: ai已定义为函数
user-0 提问: 请教大神为什么*p占用空间大小为8个字节，而*p+1 指向数组中第二个元素3

回复:
user: user-1
content: *p 指的是包含两个int的数组  你可以想象跟b 一样  所以两个int大小是8.   *p同时指向数组的[0]位置，它 + 1 指向的是[1] 所以 *（*p +1） 是 3  其实你把*p 当成整体去看 就相当于 int (*p)[2] 就跟申请了一个int 数组一样 c[2]  你sizeof(c) 不就得到8 么， 同时c + 1 指向的不就是数组的第二个值么。

user: user-2
content: int (*p)[2]                 类型 p     int ** *p   int*  所以sizeof(*p)    64位系统下 为8个字节，32位为4个字节 所以  *p+1  是下一个int的地址

user: user-3
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-4
content: 引用 6 楼 zhangchm2018 的回复:① 一维数组    int a[2]; 数组指针    int (*p)[2]； 所以，可以看成  a == *p，*p 就相当于一维数组的数组名，a[1] == a + 1 == *p + 1。  ② (*p)[2] 是数组指针， *p 指向的是一个含有 2 个 int 元素的数组，一个 int 占 4 个字节，两个占8个字节； 而理解上 * 和 [] 可以互换，所以 (*p)[2] 可以变成 p[][2]，当成一个二维数组，p = b，所以 p == b[0] == &b[、][0]，p 只占一个 int 字节，即 4。 输入错误，是 p == b[0] == &b[0][0]

user: user-4
content: ① 一维数组    int a[2]; 数组指针    int (*p)[2]； 所以，可以看成  a == *p，*p 就相当于一维数组的数组名，a[1] == a + 1 == *p + 1。  ② (*p)[2] 是数组指针， *p 指向的是一个含有 2 个 int 元素的数组，一个 int 占 4 个字节，两个占8个字节； 而理解上 * 和 [] 可以互换，所以 (*p)[2] 可以变成 p[][2]，当成一个二维数组，p = b，所以 p == b[0] == &b[、][0]，p 只占一个 int 字节，即 4。

user: user-5
content: 因为p里面保存着b[0]的地址，而b[0](也就是*p)里保存着b[0][0]的地址，所以*p的大小是两个int的大小，而因为*p里是b[0][0]的地址，所以*p+1也就保存了b[0][1]的地址，在经过间接运算符取出该地址保存的值，得出结果就是b[0][1]。

user: user-6
content: *解引用，*p指向数组首地址，为啥它大小是8，我也理解的不是很透彻

user: user-0
content: 引用 1 楼 user-6 的回复:因为P是数组指针，*p是数组首个元素，*p+1,相当于移向下一个地址。  既然是首个元素为什么占用空间为sizeof（int）*2

user: user-0

user: user-6
content: 因为P是数组指针，*p是数组首个元素，*p+1,相当于移向下一个地址。
user-0 提问: STM32系列芯片可以直接通过输入捕获正弦波来计算正弦波的频率吗？

回复:
user: user-0
content: 谢谢各位！问题我已经解决了，虽然测得频率不是非常准。对于前辈们说的FFT，因为我没用过FFT，不知道该怎么搞，所以这几天一直想通过其它方式来达到目的，最近才想用施密特触发器或者电压比较器来做，后来我发现我用的STM32F072CBT6这个芯片本身就自带比较器，所以我就尝试用比较器来转换成方波再来测频率，发现可行。之前一直不知道原来STM32芯片还有的自带比较器的，之前一直接触的是F1,F4，现在才知道F05,F07,F09这些系列的芯片自带比较器。

user: user-1
content: 引用 13 楼 wqq995的回复:我试一下，不知道是我配置的AD是不是有问题，0V和3.3V的电压可以准确采样输出，但是0V-3.3V之间的电压就一直输出0.1V-0.2V之间的电压值，用AD来采样正弦波的时候采到的数据一直是：我也不知道哪里出了问题 信号频率多少，采样率多少? 其实你可以使用MATLAB仿真一下，确定好合适的采样率，这样可以确定你的代码是不是有问题

user: user-1
content: 如果只是测频率，可以考虑使用adc采集信号，然后fft计算出频率。

user: user-2
content: 他这图方波频率3.35KHz，低电平那部分占比大约1/3，理论上来说用10KHz采样就可以了。

user: user-3
content: 刚才没看清楚，原来是要求底电平那些正弦啊，，这个频率太高了。应该像楼上说的， 不能在线分析。看你ADC能不能达到这么高的采样频率了。

user: user-4
content: 这个目测有300kHz以上了，STM32的话可用ADC模块采数据，然后离线分析，在线实时处理可能不太现实，毕竟运算能力有限。 建议UP换个示波器。

user: user-3
content: 电压比较已经把电压变成0，1状态，当然能捕获。当然正弦波型的offset不能变，幅度也不能变得太明显。 使用捕获就可以啊，计算两个高电平或者低电平开始点的间隙就是周期。基本上M3，M0 系列的都有这个功能。

user: user-0
content: 用·STM32系列芯片有什么办法捕获如下图所示的方波低电平时间段内的正弦波并计算出频率吗？

user: user-0
content: 这个正弦波已经是经过放大的了，把这个正弦波转化为方波之后幅值应该还是小吧？还能捕获到吗？

user: user-3
content: 幅值太小了。 可以外面加一个电压比较器转成方波。

user: user-0
content: 配置如下： 那个clock prescaler只有同步四分频和异步模式两种选择，已开启DMA中断，一直奇怪采样不到0V-3.3V之间的电压数据

user: user-0
content: 我试一下，不知道是我配置的AD是不是有问题，0V和3.3V的电压可以准确采样输出，但是0V-3.3V之间的电压就一直输出0.1V-0.2V之间的电压值，用AD来采样正弦波的时候采到的数据一直是：我也不知道哪里出了问题

user: user-3
content: 用DMA应该能达到 这个速率吧。

user: user-2
content: STM32不是普遍支持1MHz以上采样吗

user: user-0
content: 那个正弦波的频率大概在500K左右，用的是F0芯片，用ADC的话它的采样周期加上转化周期已经将近2us，差不多是这个正弦波的一个周期时间了，ADC应该搞不定，才接触这个STM32cubeMX,用的是HAL库，公司因为要与其它公司对接要求用这个cube来做，各位前辈有什么办法？

user: user-5
content: 底部波形的频率大概是多少，采样频率要满足奈奎斯特吧，你在用是stm32自带的dsp库，里面有fft算法，查看幅值，应该能求出大概的频率

user: user-3
content: 引用 7 楼 DelphiGuy 的回复:他这图方波频率3.35KHz，低电平那部分占比大约1/3，理论上来说用10KHz采样就可以了。他说的是低电平那个蜜蜜麻麻的。
user-0 提问:  HTTP/1.1 400 Bad Request   大神 救命啊

回复:
user: user-1
content: 建议学会使用wireshark抓包工具。

user: user-2
content: 发送数据的问题，用Fiddler等工具先找正确的数据！

user: user-3
content: 加上Host:，先试试主页。

user: user-4
content: bad request只是一个结果。如同上面回复的，你用fidder或者wireshark抓个包，学会看你那个请求，从你发出，到每个网关，到返回。看哪个环节出了问题。

user: user-5
content: 一个简单的排错方法就是把/api?q=happy&from=EN&to=zh_CHS&appKey=03890ba142bc8320&salt=5&sign=4c38fd44d0f62bc1cbd3e419881a87c0的前面补上服务器的地址，即http://host_or_ip/之类的东西，然后把完整的URL在浏览器中去访问。如果也是400，很好，你的请求就是错的；如果不是，打开浏览器的开发者工具，把你的HTTP请求头和浏览器发出的请求头拿来对比。

user: user-0
content: 引用 5 楼 focuslight 的回复:你截取一下发送数据分析一下， socket工具利用上啊..........  GET /api? q=happy&from=EN&to=zh_CHS&appKey=03890ba142bc8320&salt=5&sign=4c38fd44d0f62bc1cbd3e419881a87c0 HTTP/1.1 Content-Type: application/x-www-form-urlencoded Connection:close      这就是发送的数据。有不对的地方嘛

user: user-6
content: 你截取一下发送数据分析一下， socket工具利用上啊..........

user: user-0
content: 引用 3 楼 user-7 的回复:你也是牛，有现成的http客户端api 不用，自己socket实现客户端。  = =就是想写一个，这个不是重点。重点是该怎么解决啊

user: user-7
content: 你也是牛，有现成的http客户端api 不用，自己socket实现客户端。

user: user-0
content: 有没有大神来帮忙看看

user: user-0
content: 找了好久了。脑子都炸了
user-0 提问: C语言，有个问题没有琢磨清楚，请大神帮忙

回复:
user: user-1
content: 前面缓冲区没清干净，变成了 "后四位\n身份证18位" ，%d读数遇空白字符停止，所以%14d读了“后四位”

user: user-2
content: 需要清理缓存区，setbuf(stdin, NULL);或者在输入前面加getchar();

user: user-3
content: 是输入的缘由吧

user: user-4
content: 你的第二个scanf语句再看看

user: user-5
content: 还是输入问题吧

user: user-6
content: 第一个“scanf”这样样scanf("%*6%4d%2d%2d%*s",&year,&month,&day);

user: user-7
content: 你的第二个scanf语句再看看

user: user-8
content: 输入合法性校验的路很长，水很深。

user: user-0
content: 谢谢大神的解答，我看了之后，在原代码上又增加了一个字段，弄清楚了这个问题。 #include<stdio.h>  void main(void) {  int year,month,day,num,wrong; scanf("%*6d%4d%2d%2d",&year,&month,&day); printf("你的生日是:%4d-%02d-%02d\n",year,month,day);  scanf("%14d%4d",&wrong,&num); printf("%014d,%04d\n",wrong,num);  }  这个代码很清楚了显示了错误原因。wrong的输出内容是之前一次还在缓存区内的后四位，并且在这四位数前面补的全部为0，之后才开始显示第二次SCANF的内容。 所以有两种方式解决： 1、在第一次SCANF后清除缓存；（参考一楼） 2、在第一次SCANF时就把后四位*清除。（参考三楼）

user: user-9
content: 感觉好多道道啊

user: user-10
content: 你的第二个scanf语句再看看

user: user-11
content: 多学习，程序后面是不是缺少了结束语，返回

user: user-12
content: 输入输出还真是有很多门道啊。

user: user-13
content: 输入合法性校验的路很长，水很深。

user: user-14
content: 还是输入问题吧

user: user-8
content: 输入检验够程序员吃一辈子了。

user: user-15
content: 楼上正解，原因是你输入的内容是先传送到缓存区，然后再传送给程序，比如身份证号有23位，你在第一个scanf里只接收了16位，余下的位数就会作为第二个scanf的输入。我记得c标准库里有一个函数是自动抛弃余下的位数(好像是gets_s)。

user: user-16
content: 楼上正解  第一个输入的只有14位，不是一个完整的身份证号

user: user-17
content: 引用 3 楼 user-17 的回复:#include<stdio.h>  void main(void) {  	int year,month,day,num[4];	// num[4]考虑末尾带X的情况 	scanf("%*6d%4d%2d%2d%*4s",&year,&month,&day); 	printf("你的生日是:%4d-%02d-%02d\n",year,month,day);  	scanf("%*14d%4s",num); 	printf("%04s\n",num);   }第一次scanf的时候少读取了身份证后四位，导致它在第二个scanf被认为是%*14d的部分

user: user-17
content: #include<stdio.h>  void main(void) {  	int year,month,day,num[4];	// num[4]考虑末尾带X的情况 	scanf("%*6d%4d%2d%2d%*4s",&year,&month,&day); 	printf("你的生日是:%4d-%02d-%02d\n",year,month,day);  	scanf("%*14d%4s",num); 	printf("%04s\n",num);   }
user-0 提问: 请问微信PC段怎么快速发起联系人对话。QQ用下面的代码可以，微信是否能实现呢？

回复:
user: user-0
content: 引用 1 楼 user-2 的回复:楼主，可以试试参照QQ这种方式写注册表的方式，试试能不能放在微信上使用：可参考下面链接. https://www.cnblogs.com/phinecos/archive/2009/03/06/1404951.html  不过，感觉要实现楼主你说的问题，估计需要微信支持方式才行~~~ 你能可以实现先吗？可以有偿，麻烦了！

user: user-1
content: http://www.autohotkey.com

user: user-2
content: 楼主，可以试试参照QQ这种方式写注册表的方式，试试能不能放在微信上使用：可参考下面链接. https://www.cnblogs.com/phinecos/archive/2009/03/06/1404951.html  不过，感觉要实现楼主你说的问题，估计需要微信支持方式才行~~~
user-0 提问: 好像对最基本的if都理解有误了……

回复:
user: user-1
content: 写错一个true ——>false

user: user-1
content: 编程里面对这种公式的理解不一样 比如100000<n<=200000，在编程里实际是（100000<n）<=200000，先比较100000和n，如果n大，（100000<n）是true，计算机对true的解释是逻辑1，所以（100000<n）<=200000会变成1<=200000，if中就是判定成功；反之n小，（100000<n）是false，计算机对true的解释是逻辑0，所以（100000<n）<=200000会变成0<=200000，if还是判定成功。 下面那个也一样，恒真，都会执行，而如果你要表示100000<n<=200000的数学意义的话，就是上面大家说的100000<n && n<= 200000，用&&的写法，你可以&&很多个条件上去，一直往后&&，同样的你要表示“n<100000或n>200000”这样的条件，就用n<100000||n>200000，也可以用很多个||一直往后连条件

user: user-2
content: 这是代码，不是数学公式 if没有这样用的

user: user-3
content: 编程语言不是数学语言

user: user-4
content: 谁告诉你if可以这么用的

user: user-5
content: 基本语法没有掌握          double n, output = 0.0; 	scanf("%lf", &n); 	if (100000<n && n<= 200000) 		output += (n - 100000)*0.075; 	if (0<n && n<= 100000) 		output += n*0.1; 	printf("%lf", output);  lz写法从数学角度是对的， 但从c的角度来说是不对的
user-0 提问: 二维动态数组的内存分配错误

回复:
user: user-0
content: 当局者迷旁观者清。 引用 2 楼 user-2 的回复:在int **ApplyTwo( int row, int col)函数中的下面代码：  if ((array[i] = (DataType *)malloc(col * sizeof(DataType))) == NULL); 再最后面多了一个分号，把分号去掉试试~~~~~~~~~应该改为如下代码：  if ((array[i] = (DataType *)malloc(col * sizeof(DataType))) == NULL)

user: user-0
content: 学习而已，没必要用库函数。 引用 1 楼 Slzde_sub 的回复:   #include<vector> using std::vector;  vector<vector<int>> vecValueArray;   这不就完事了吗。。。你写了一大堆还怕错

user: user-1
content: if ((array[i] = (DataType *)malloc(col * sizeof(DataType))) == NULL); 注意这条语句的后面多一个分号

user: user-2
content: 在int **ApplyTwo( int row, int col)函数中的下面代码：  if ((array[i] = (DataType *)malloc(col * sizeof(DataType))) == NULL); 再最后面多了一个分号，把分号去掉试试~~~~~~~~~应该改为如下代码：  if ((array[i] = (DataType *)malloc(col * sizeof(DataType))) == NULL)
user-0 提问: openssl报错error:140A6041:SSL routines:ssl_create_cipher

回复:
user: user-1
content: 楼主，您好!     我也遇到该问题了，我的错误打印是： 4062180368:error:140A604[ 2483.884425@3] invalid toddr src 1:SSL routines:ssl_create_cipher_list:malloc failure:ssl/ssl_ciph.c:1334: 4062180368:error:140A90A1:SSL routines:SSL_CTX_new:library has no ciphers:ssl/ssl_lib.c:2583  请问您是怎么解决的，希望能得到你的回复，谢谢。

user: user-2
content: https://www.cnblogs.com/crunchyou/archive/2013/01/23/2872722.html 仅供参考
user-0 提问: 用C语言这样写哪里错了啊？？

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:内存不满足条件？C语言的版本很明显占用的内存比较大，建议使用动态申请空间的形式。 我发现，<br data-filtered="filtered">是浏览器问题。。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:内存不满足条件？C语言的版本很明显占用的内存比较大，建议使用动态申请空间的形式。  但是题目内存限制是64MB，测试结果内存是远远不到的，还有<br data-filtered="filtered">这个东西我没写过怎么会显示的？

user: user-1
content: 内存不满足条件？C语言的版本很明显占用的内存比较大，建议使用动态申请空间的形式。

user: user-0
content: 引用 4 楼 user-2 的回复:不是内存的问题，对比了一下你的两段代码，我觉得应该是你自己在写C版本的时候，一个条件写错了else if(t.de<H&&t.cai<H&&t.de>t.cai)这里应该是else if(t.de<H&&t.cai<H&&t.de>=t.cai)哇，厉害啊大神，膜拜膜拜，还是我自己不够仔细，非常感谢！

user: user-2
content: 不是内存的问题，对比了一下你的两段代码，我觉得应该是你自己在写C版本的时候，一个条件写错了else if(t.de<H&&t.cai<H&&t.de>t.cai)这里应该是else if(t.de<H&&t.cai<H&&t.de>=t.cai)
user-0 提问: 关于RC4加密抵御“已知明文攻击”的疑惑

回复:
user: user-1
content: rc4本来就弱, 用rc4就是不太在乎被解密, 只要成本高一点, 有能力解密的人不愿意去解密就行了.

user: user-1
content: 一般通信头部是不加密的, 可以附加crc校验.

user: user-2
content: 引用 3 楼 qq510015356 的回复:[quote=引用 1 楼 donjin9 的回复:] 看它密钥流生成的算法，确实是固定的。知道足够长的密钥流，就能解密了。  之前自己理解错了，以为每次加密前都要重新初始化S盒，现在看资料，应该是只在第一连接时初始化S盒，之后S盒不断往后滚动  但这又存在另一个问题，如果中间丢包怎么办，一旦丢包了，通信双方的S盒就不同步了，不就无法实现解密了吗？ 这样岂不是像UDP这样的协议就无法应用RC4了。[/quote] 中间丢包本来就是很严重的问题。所有的分组加密算法中间丢了包，组可能都混乱了，解密当然很麻烦。

user: user-3
content: 哦，是直接使用之前重排过的S啊。我也是理解不够。

user: user-0
content: 引用 1 楼 donjin9 的回复:看它密钥流生成的算法，确实是固定的。知道足够长的密钥流，就能解密了。  之前自己理解错了，以为每次加密前都要重新初始化S盒，现在看资料，应该是只在第一连接时初始化S盒，之后S盒不断往后滚动  但这又存在另一个问题，如果中间丢包怎么办，一旦丢包了，通信双方的S盒就不同步了，不就无法实现解密了吗？ 这样岂不是像UDP这样的协议就无法应用RC4了。

user: user-4
content: 奉劝楼主不要把有限的生命浪费在无限的加密解密死循环中！

user: user-3
content: 看它密钥流生成的算法，确实是固定的。知道足够长的密钥流，就能解密了。
user-0 提问: 数数并说——数据存储，内存分配问题

回复:
user: user-0
content: 但是这样以来，我分配的内存都没有释放。好吧，不知道咋搞了，先放着吧。记一下。

user: user-0
content: #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <string.h>  char* countAndSay(int n); int _tmain(int argc, _TCHAR* argv[]) { 	char * final_sa = countAndSay(21); 	printf("%s\n", final_sa);  	system("PAUSE"); 	//free(final_sa); 	return 0; } char* countAndSay(int n)  {	 	char *final_say;//可以把定义和初始化分配内存分开处理，这样就好了。还是怪自己基础太差了。。 	int length = 0; 	int count = 0, id = 0;	 	if (n > 1) 	{ 		char * before_say = countAndSay(n - 1); 		length = strlen(before_say); 		final_say = (char*)malloc((length * 2 + 1) * sizeof(char));//单独分配； 		char temp = before_say[0]; 		for (size_t i = 0; i < length; i++) 		{ 			if (before_say[i] == temp && i < length - 1) 			{ 				count++; 			} 			else if (before_say[i] != temp && i < length - 1) 			{ 				final_say[id] = count + '0'; 				id++; 				final_say[id] = temp; 				id++; 				temp = before_say[i];				 				count = 1; 			} 			if (before_say[i] == temp && i == length - 1) 			{ 				count++; 				final_say[id] = count + '0'; 				id++; 				final_say[id] = temp; 				id++; 			} 			else if(before_say[i] != temp && i == length - 1) 			{			 				final_say[id] = count + '0'; 				id++; 				final_say[id] = temp; 				id++; 				final_say[id] ='1'; 				id++; 				final_say[id] = before_say[i]; 				id++; 			} 		} 		final_say[id] = '\0'; 		//free(before_say); 	} 	else 	{ 		final_say = (char*)malloc(2 * sizeof(char));//单独分配； 		final_say[0] = '1'; 		final_say[1] = '\0'; 	} 	return final_say; }

user: user-1
content: 简单一点，char *final_say = new char; 这个是看你电脑里剩余多少内存去分配的，比较大，但是你用的太大可能会new失败或者奔溃，比如你在循环里一直new就容易出错

user: user-0
content: 参考输出： 1.     1 2.     11 3.     21 4.     1211 5.     111221 6.     312211 7.     13112221 8.     1113213211 9.     31131211131221 10.    13211311123113112211 11.    11131221133112132113212221 …… 2147483647

user: user-0
content: 题目： 报数序列是指一个整数序列，按照其中的整数的顺序进行报数，得到下一个数。其前五项如下：  1.     1 2.     11 3.     21 4.     1211 5.     111221 1 被读作  "one 1"  ("一个一") , 即 11。 11 被读作 "two 1s" ("两个一"）, 即 21。 21 被读作 "one 2",  "one 1" （"一个二" ,  "一个一") , 即 1211。  给定一个正整数 n ，输出报数序列的第 n 项。  注意：整数顺序将表示为一个字符串。  示例 1:  输入: 1 输出: "1" 示例 2:  输入: 4 输出: "1211"

user: user-0
content: 引用 4 楼 Slzde_sub 的回复:另外针对这个题，，  你用string多好呀。。。 他这个题目给的函数返回值就是char*。 另外，这个函数，输入的值越大，最后输出的字符串就越长。输入11就已经是27的长度了，最大输入值是2147483647，具体输出是多长我还没算出来。所以我想的是，长度的定义，可以根据输入判断，或者可以自行分配啥的。不然，如果所有的输入都被付这么大的空间，还用到递归，很浪费的。
user-0 提问: 求助，关于C语言字符串数组函数问题

回复:
user: user-1
content: 你可以想一下，在功能函数的内部 指针（st+1）到底是指向本行的下一个元素，还是下一行呢？如果按照你的逻辑，它指向下一行，那么它是如何知道指针+1的操作是指针偏移了多少个char?

user: user-0
content: 谢谢楼上各位，讲解得很细致，我已经明白了

user: user-2
content: 1.void print_string(char (*st)[256], int lim)； 2.void print_string(char [LIM][256], int lim); 3.void print_string(char [ ][256], int lim); 这三种方式均可以。 二维数组传参自然可以用二维数组来接收。所以2,3成立  print_string(input, LIM);中input指的是二维数组首元素的地址，二维数组首元素的地址为第一行的地址，但第一行为一个字符串数组，需要用数组指针来接收。所以1成立。

user: user-3
content: 楼主，可以查查“二维数组传参”相关字眼，有相应的文章说明二维数组传参的方法。下面是其中一种方法： #include <stdio.h> #include <string.h>  #define SIZE 256 #define LIM 2  void print_string(char st[][SIZE], int lim);  int main(void) { 	char input[LIM][SIZE] = { 		"my", 		"be" 	}; 	print_string(input, LIM);  	return 0; }  void print_string(char st[][SIZE], int lim) { 	int i; 	for (i = 0; i < lim; i++) 		puts(st[i]); }  而至于你上面说的为什么不能用char**str作为参数，因为当把这种二维数组的指针直接作为参数传递时，数组名退化为指针，函数并不知道数组的列数，SIZE对它来说是不可见的，所以第一层解引用会失败。这时，编译器可能会报warning，或者运行生成的文件会发生segment fault。引用网友在文章的图说明：(链接:http://www.cnblogs.com/wuyuegb2312/archive/2013/06/14/3135277.html)  栈上分配的二维数组数组名int array[3][3]的真实类型是int [ ][ ]，在作为右值时才被转化为(int *array)[N]，和int **是不同的。把前者进行强制转换为后者，在函数中对元素操作也会导致段错误，上图面用图来说明二者区别。

user: user-4
content: 正确的写法是void print_string(char (*st)[256], int lim)，你用char**也是不严谨的，因为你的input是个二维数组，char*只能表示一维数组  况且**叫指向指针数据的指针，char (*st)[256]叫数组指针，char *st[256]叫指针数组
user-0 提问: 初学C语言, 一个简单的问题求解.

回复:
user: user-1
content: 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-1
content: 引用 5 楼 kaixindzl 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素  谢谢!  看了几分钟提示要会员才能看了.[/quote] 怪CSDN为维持生存而利欲熏心喽。

user: user-0
content: 终于搞清楚了.  是C函数参数传递方式与delphi不同引起的.   printf 函数数值类型参数是一股脑压入栈中,  然后把控制权转移到printf, 但读取时是根据转换说明符指定的长度去栈中依次读取. 如果对应数据长度不对就会发生指针错位, 取错值.  还是一错到底..    随便说一下:  delphi参数一般不是压栈的方式传递. 很多时候是把参数指针传递给 EAX EDX ECX之类的寄存器, 调用时按指针值去内存地址中读取(除非用 stdcall 标明用C形式调用.)

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素  谢谢!  看了几分钟提示要会员才能看了.

user: user-0
content: 引用 2 楼 user-2 的回复: 上图为在内存中，t值的储存方式。 通过第一个printf语句可以推出，%#llx取8个字节的数据，然后倒序输出（我是这么理解的）。 通过第三个printf语句可以推出，%#x取4个字节的数据，然后倒序输出。 两个t值的全部内容：        88 77 66 55 44 33 22 11 88 77 66 55 44 33 22 11 第一个printf语句的解释方式：        88 77 66 55 44 33 22 11 | 88 77 66 55 44 33 22 11|（全部都已解释） 第二个printf语句的解释方式：        88 77 66 55 | 44 33 22 11 88 77 66 55 |（44 33 22 11 这部分不被解释） 第三个printf语句的解释方式：        88 77 66 55 | 44 33 22 11 | （88 77 66 55 44 33 22 11 这部分不被解释）  谢谢耐心解释, 不明白的是, printf取参数时, 难道不是按变量的对应指针地址来取的吗?  按理说 %#x取4个字节的数据时, 应该从t指针的低32位取值啊. 为啥在同一函数时第二次取值时取了高32位的值呢?

user: user-1
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-2
content: 上图为在内存中，t值的储存方式。 通过第一个printf语句可以推出，%#llx取8个字节的数据，然后倒序输出（我是这么理解的）。 通过第三个printf语句可以推出，%#x取4个字节的数据，然后倒序输出。 两个t值的全部内容：        88 77 66 55 44 33 22 11 88 77 66 55 44 33 22 11 第一个printf语句的解释方式：        88 77 66 55 44 33 22 11 | 88 77 66 55 44 33 22 11|（全部都已解释） 第二个printf语句的解释方式：        88 77 66 55 | 44 33 22 11 88 77 66 55 |（44 33 22 11 这部分不被解释） 第三个printf语句的解释方式：        88 77 66 55 | 44 33 22 11 | （88 77 66 55 44 33 22 11 这部分不被解释）

user: user-1
content: 提醒：printf是开源的。 参考crt\src\output.c
user-0 提问: free函数删除卡壳

回复:
user: user-1
content: 需要加判断是否为空后才 free

user: user-2
content: 既然是最后一个节点，那么是不是应该删除p，而不应该是q，需要确认下q是否为NULL

user: user-3
content: 如果你删除的是最后一个结点，那么p指向最后一个结点，，q=p->next q就为空 p->next=q->next就会崩溃

user: user-4
content: 分配内存要判断 是否为空 而释放内存依然要判断 并且确保该指针没有被 free 过 (如果该指针被 free 过，你就要看该指针是否为空 还要看它是否为野指针)

user: user-5
content: 在free()函数之前，加一个对q指针的判断  if(q != NULL) free(q);

user: user-6
content: 引用 楼主 qq_36358731 的回复: 我是删除链表的最后一个结点出的问题，删除其他地方的结点都是好的。 为什么在free这一行卡壳了，是free函数不能删除最后一个结点，还是什么问题，或者说free函数有什么使用条件  楼主，应该是free(q)导致的,而q这时值应该空值了，所以会崩溃。

user: user-7
content: 扯

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

user: user-8
content: 如果i是从0开始排位置的话，没看出什么问题呀
user-0 提问: C#求助

回复:
user: user-1
content: 你这等于要做一个连接数据库的小模块，emmmm我太懒了就说说吧，毕竟自己做的才能是自己的。 （1）.建立C#的窗口项目（winform还是WFP的自己定）。在textBox控件的属性上有个passwordchar选项，后边输入* （2）.创建一个对象类(user)专门接收"用户名"和“密码”。 （3）.创建一个数据库链接文件（可以是数据库连接池的，也可以是数据库执行流文件（用一次调用一次那种），还可以是vs自带的数据库连接方式）。 （4）.创建一个数据库操作的类，里面可以写上sql查询（用户名/密码）的方法。（用的时候直接调用，就会返回数据库里所有的用户名和密码）。 （5）.在登录按钮的方法中获取到用户名密码的数据，并调用（4）中写的方法（4中的方法会返回所有的用户名和密码，你只要写一个循环进行一一对比就好了）。 （6）.根据（5）中的对比就能判断出数据库中有没有你输入的用户名和密码，有的话就可以做一个弹出框显示“登陆成功”，没有就显示“登录失败”。  打字好累............求好评！！！

user: user-2
content: 推荐本书给你吧，夏敏捷 C#原理与实务，里面的实例作为教材的补充是很不错的，书里有个别的小错误问题不大，8.5~9分的书。

user: user-2
content: 用 OleDbConnection 类 OleDbCommand 类 ExecuteScalar 方法 随便百度个demo搞定。

user: user-3
content: 1、在textBox控件的属性上有个passwordchar选项，后边输入*，输入密码就显示为* 2、连接数据库，获取用户名（比如张三）和密码（比如123），select count(*) from U where UNAME = '张三' and UPWD = '123'，返回有数据即输入正确，否则不正确
user-0 提问: 请老师看看这个简单的程序哪里错了

回复:
user: user-1
content: while循环的 条件表达式 在完成一次循环后 没有改变

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

user: user-2
content: 抱歉，原来的那个程序是错的，修改后的代码如下 //*编写程序数一下 1到 100 的所有整数中出现多少次数字9 #include <stdio.h> int main() {     int i=1,temp=1,count=0;     for(;i<101;i++)      {          temp=i;    //启动while         while(temp)             {             //temp=temp%10;             if (temp%10==9) count++;             temp=temp/10;             }      }      printf("1到100出现%d次数字9\n",count);     return 0; } 引用 1 楼 zangfong 的回复:你的程序在i=10的时候，在以下的while循环中就死循环了，因为i=10时，那么temp = i/10也永远是1，while循环永远成立。         while(temp)             {             temp=i%10;             if (temp==9) count++;             temp=i/10;             }  只需要把你for循环里头的i改成temp，就ok了，以下代码供参考 //*编写程序数一下 1到 100 的所有整数中出现多少次数字9 #include <stdio.h> int main() {     int i=1,temp=1,count=0;     for(;i<101;i++)      {          temp=i;    //启动while         while(temp)             {             temp=temp%10;             if (temp==9) count++;             temp=temp/10;             }      }      printf("1到100出现%d次数字9\n",count); }

user: user-2
content: 你的程序在i=10的时候，在以下的while循环中就死循环了，因为i=10时，那么temp = i/10也永远是1，while循环永远成立。         while(temp)             {             temp=i%10;             if (temp==9) count++;             temp=i/10;             }  只需要把你for循环里头的i改成temp，就ok了，以下代码供参考 //*编写程序数一下 1到 100 的所有整数中出现多少次数字9 #include <stdio.h> int main() {     int i=1,temp=1,count=0;     for(;i<101;i++)      {          temp=i;    //启动while         while(temp)             {             temp=temp%10;             if (temp==9) count++;             temp=temp/10;             }      }      printf("1到100出现%d次数字9\n",count); }

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

user: user-0
content: [quote=引用 1 楼 zangfong 的回复:] 你的程序在i=10的时候，在以下的while循环中就死循环了，因为i=10时，那么temp = i/10也永远是1，while循环永远成立。         while(temp)             {             temp=i%10;             if (temp==9) count++;             temp=i/10;             }  谢谢老师解答，又犯了低级错误。
user-0 提问: 请问下windows标准控件一般继承了哪些接口，比如说idispatch等等

回复:
user: user-1
content: http://winprog.org/tutorial/controls.html

user: user-0
content: 可是标准控件都可以用函数得到一些接口的指针，比如说，idispatch,iaccessible,等的指针，如果标准控件不用接口，这些指针是在哪里定义和实现的呢，莫非是在creatwindows这类的api函数内部吗，请老师给我仔细讲讲。引用 1 楼 DelphiGuy 的回复:windows标准控制，是用C实现的，并不使用COM接口（IUnknown、IDispatch之类的）也不导出接口，而是通过C风格API使用（CreateWindow/CreateWindowEx、RegisterClass等等）。

user: user-0
content: 我网上找到的是下面一段简短的描述，但我需要更详细全面的内容， 以及全部的接口的内容，控件创作概述。     以下列表为实施者提供了全面的指南。    • 如果您的类使用外部资源但不用于设计图面，则实现 IDisposable，或者从直接或间接实现 IDisposable 的类派生。     • 如果您的类要用于设计图面（如 Windows 窗体或 Web 窗体设计器）上，则实现 IComponent，或者从直接或间接实现 IComponent 的类派生。  请注意，IComponent 扩展 IDisposable，因此 IComponent 类型始终是 IDisposable 类型。 与不是 IComponent 的 IDisposable 类型相比，IComponent 类型的性能系统开销要小。但这一不足通常可由在设计时和运行时安置 IComponent 的能力来弥补。 （在本主题的后面部分将对该安置功能进行说明）。    • 如果您需要一个可设计（可在设计图面上使用）并且可按引用封送的类，则可从 Component 派生。  Component 是按引用封送的 IComponent 类型的基实现。    • 如果您需要一个可按值封送的可设计类，则可从 MarshalByValueComponent 派生。  MarshalByValueComponent 是按值封送的 IComponent 类型的基实现。    • 如果希望向对象模型层次中引入 IComponent 类型，但由于单次继承的原因而不能从 Component 或 MarshalByValueComponent 之类的基派生，请实现 IComponent。     • 如果需要提供用户界面的可设计类，则该类是控件。  控件必须从以下基本控件类之一直接或间接派生：Control 或 Control。      说明 说明    如果您的类既不是可设计类，也不保存外部资源，则不需要 IComponent 或 IDisposable 类型。

user: user-1
content: windows标准控制，是用C实现的，并不使用COM接口（IUnknown、IDispatch之类的）也不导出接口，而是通过C风格API使用（CreateWindow/CreateWindowEx、RegisterClass等等）。
user-0 提问: 如何处理0x1A和0x34这样一组数？没有前缀时候

回复:
user: user-1
content: 1.存ASCII，不过相对数据量增加一倍，0A2C转存之后为字符串串30413243 2,按赵老师的建议直接%02X，之后拼接

user: user-2
content: 传过来的是字符串吗？“0A0123452C”形式的吗？如果是，而你需要整数，那就用 sscanf(&s[2*i], "%2x", &num[i]); 这样的方式。需要的时候再这样 sprintf(ss, "%#2x"， num[i]); 弄回去

user: user-0
content: 简单地说，就是想把一串输入内容，以字符串格式存储。这个输入内容包括数字，数字+字母。就是这样的

user: user-3
content: #include <stdio.h> #define MAXLEN 10 char hex[MAXLEN]; char str[MAXLEN*3]="0A 01 23 45 2C 88"; int i,v,n,r; char *p; int main() {     i=0;     p=(char *)str;     while (1) {         r=sscanf(p,"%2x%n",&v,&n);         if (r==1) {             hex[i]=(char)v;             i++;             if (i>=MAXLEN) {                 fprintf(stderr,"Too many bytes(>=%d)!\n",MAXLEN);                 break;             }             p+=n;         } else if (r==EOF) {             break;         } else {             p++;         }     }     n=i;     for (i=0;i<n;i++) printf("0x%02X ",(unsigned char)hex[i]);     printf("\n");     str[0]=0;     for (i=0;i<n;i++) {         if (i>=MAXLEN) break;         sprintf(str,"%s %02X",str,(unsigned char)hex[n-1-i]);     }     printf("str:[%s]\n",str);     return 0; } //0x0A 0x01 0x23 0x45 0x2C 0x88 //str:[ 88 2C 45 23 01 0A] //

user: user-3
content: 引用 4 楼 wang0635 的回复:传过来的是字符串吗？“0A0123452C”形式的吗？如果是，而你需要整数，那就用 sscanf(&s[2*i], "%2x", &num[i]); 这样的方式。需要的时候再这样 sprintf(ss, "%#2x"， num[i]); 弄回去 犯了典型的越界错误。

user: user-0
content: 我在考虑能不能自行添加0x给接收到的每一个数据，可是接收下来以什么样的格式存在？数字+字母的这种形式

user: user-4
content: sprintf(str, "%02X",  hex[i]);       //数字转字符串 c[i] = strtol(str, NULL, 16);    //字符串转数字
user-0 提问: 对字符串进行位运算，用C语言怎么写？

回复:
user: user-1
content: 楼主，可以试试下面代码~~只供参考。 #include <stdio.h> #include <string.h> #include <stdlib.h> /** * 打印数值二进制值的函数 **/ void printNumber(unsigned long n, int length) { 	char str[246] = { 0 }; 	_itoa(n, str, 2);//2即是代表转换为2进制 	//补足前面的0 	int count = length - strlen(str); 	int i; 	for (i = 0; i<count; ++i) 	{ 		printf("0"); 	} 	// 	printf("%s", str); }  /** * 打印字符串二进制值的函数 **/ void printString(char *s) { 	char c; 	size_t j = strlen(s); 	size_t i = 0; 	for (;  i < j; s++) 	{ 		c = *s; 		printNumber((unsigned long)c, 8); 		++i; 	} }  /** * 主函数 */ int main(int argc, char *argv[]) { 	unsigned int length = 8; 	char src[9] = "abcdefgh"; 	char dest[9] = "tttttttt";	//存放结果 	unsigned long* srcLong = (unsigned long*)src; 	unsigned long* destLong = (unsigned long*)dest; 	// 	unsigned long key1 = 0xaaaaaaaa;		//1010.... 	unsigned long n; 	// 	printNumber(key1, 32); puts(":key1"); 	printString(src); puts(":src"); 	  	unsigned int count = length / 4; 	unsigned int i; 	for (i = 0; i < count; i++) //srcLong < endLong 	{ 		n = (*srcLong) & key1; 		memcpy((void *)destLong, (void *)&n, 4); 		srcLong += 1; 		destLong += 1; 	} 	printString(dest); puts(":dest");  	return 0; }

user: user-2
content: 因为是long 指针，所以+1就可以了 srcLong++; //srcLong += 4; destLong++; //destLong +=4;  还要留意长度不能被4整除的情况
user-0 提问: 求基本控件源码

回复:
user: user-0
content: 层主说的极是，不过最好有教程，请层主或各位老师推荐一下，光看代码看不太懂引用 3 楼 sghcpt 的回复:楼主，也可以参考一下，vs版本的安装目录下，例如 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc，视你安装vs路径不同而不同，mfc目录有源代码，基本控件都有源码实现。。。。

user: user-1
content: 个人觉得SDK纯API方式编写GUI程序已经过时了，效率太低，了解一下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

user: user-0
content: 我要windows编程之c++的

user: user-0
content: 补充一下，是c语言的，开发教程的资料

user: user-0
content: 最好是带详细教程的书和资料，源代码肯定看不懂的

user: user-2
content: 楼主，也可以参考一下，vs版本的安装目录下，例如 C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\atlmfc\src\mfc，视你安装vs路径不同而不同，mfc目录有源代码，基本控件都有源码实现。。。。

user: user-1
content: Qt有源码，VCL也有源码。

user: user-3
content: 《windows程序设计 第5版》这本书讲Windows图形界面编程，第5版是C语言描述的，可以参考。
user-0 提问: 自己定义了一个函数，不知道哪里有问题，求助！！

回复:
user: user-1
content: 函數的定義和聲明，參數不同？

user: user-2
content: 是的，函数声明 void Sove(); 改为： void Sove(int x, int y); 或者 void Sove(int, int); 都可以  system("cls");  一般写成 system("pause"); -> 暂停 ？

user: user-3
content: 如上所说，void Sove(); 改为 void Sove(int x, int y); 或者你把后面的一大段void Sove(int x,int y) {   }全放到main前面，就不用申明了
user-0 提问: 利用jpeg库在lcd屏显示jpeg格式图片

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:你这个jpeg文件能用PS打开看吗？ 最近作业与点多，很不好意思； 错误找到了，是读取的操作有问题 针对图片像我的那种会读取垃圾信息 谢谢

user: user-1
content: 你这个jpeg文件能用PS打开看吗？
user-0 提问: 请问为何无法写入文件？

回复:
user: user-1
content: //要向文件写入东西，操作方式要选“w”，“r”是读，无法像文件写东西的 //height和weight是双精度，fprintf那里输出也要是双精度 #include<stdio.h> int main() {     FILE *fp;     int ninzu=0;     char name[2][100];     double height[2],weight[2];      if((fp=fopen("write.txt","w"))==NULL)         printf("\a文件打开失败。\n");     else          {             while(ninzu<2)             {                                        printf("请输入姓名：") ;scanf("%s",name[ninzu]);             printf("请输入身高：") ;scanf("%lf",&height[ninzu]);             printf("请输入体重：") ;scanf("%lf",&weight[ninzu]);             fprintf(fp,"%s:%lf %lf\n",name[ninzu],height[ninzu],weight[ninzu]);              ninzu++;             }          fclose(fp);                }          puts("");      }

user: user-0
content: 引用 2 楼 user-2 的回复:楼主，如果你想写文件，应该打开文件的时候，是写属性，下面代码可供参考： #include<stdio.h> int main() { 	FILE *fp; 	int ninzu = 0; 	char name[2][100]; 	double height[2], weight[2];  	if ((fp = fopen("write.txt", "w")) == NULL) 		printf("\a文件打开失败。\n"); 	else 	{ 		while (ninzu<2) 		{ 			printf("请输入姓名："); scanf("%s", name[ninzu]); 			printf("请输入身高："); scanf("%lf", &height[ninzu]); 			printf("请输入体重："); scanf("%lf", &weight[ninzu]); 			fprintf(fp, "%s:%lf %lf\n", name[ninzu], height[ninzu], weight[ninzu]);  			ninzu++; 		} 		fclose(fp); 	}  	puts(""); }  谢谢。改一下W就可以了。总是犯低级错误。

user: user-2
content: 楼主，如果你想写文件，应该打开文件的时候，是写属性，下面代码可供参考： #include<stdio.h> int main() { 	FILE *fp; 	int ninzu = 0; 	char name[2][100]; 	double height[2], weight[2];  	if ((fp = fopen("write.txt", "w")) == NULL) 		printf("\a文件打开失败。\n"); 	else 	{ 		while (ninzu<2) 		{ 			printf("请输入姓名："); scanf("%s", name[ninzu]); 			printf("请输入身高："); scanf("%lf", &height[ninzu]); 			printf("请输入体重："); scanf("%lf", &weight[ninzu]); 			fprintf(fp, "%s:%lf %lf\n", name[ninzu], height[ninzu], weight[ninzu]);  			ninzu++; 		} 		fclose(fp); 	}  	puts(""); }

user: user-0
content: #include<stdio.h> int main() { 	FILE *fp; 	int ninzu=0; 	char name[2][100]; 	double height[2],weight[2]; 	 	if((fp=fopen("write.txt","r"))==NULL) 		printf("\a文件打开失败。\n"); 	else  		{ 			while(ninzu<2) 			{							 			printf("请输入姓名：") ;scanf("%s",name[ninzu]); 			printf("请输入身高：") ;scanf("%lf",&height[ninzu]); 			printf("请输入体重：") ;scanf("%lf",&weight[ninzu]); 			fprintf(fp,"%s:%d %d\n",name[ninzu],height[ninzu],weight[ninzu]);  			ninzu++; 			} 	 	fclose(fp);		 		} 			  		puts("");	  }
user-0 提问: 简单的c语言问题，不知哪里有问题，vc云县机关不出来

回复:
user: user-0
content: 可以，                    吧v1

user: user-1
content: 程序结果出不来的原因： 1. 你声明了整形数组m和z，然后根据前面的这两个for循环，只计算到了m[19]和z[19]，m[20]和z[20]后的值均为0； 2. 你在第三个for循环计算公式的时候，算了k=20，然后程序就遇到了除零错误（SIGFPE），而因为除零属于异常，不可恢复，异常控制流还是会继续返回到除零那里继续执行，因此陷入死循环，估计是这样。（不过我在codeblocks下测试，2秒后程序异常退出了） 3. （跟程序结果出不来无关，但是跟程序结果是否正确有关）该表达式一看就不会是整数，所以你在计算时也不能简单地整数相除（z[k]/m[k]），要转换为float或者double类型，sum也要定义为float或者double，最后printf输出时也要注意格式。 x数组在你的程序中没啥用，我就去掉了，基于你的代码做了一下修改，供参考 #include<stdio.h>  main() {     int m[50]= {1,2},z[50]= {2,3},i,j,k,s=0,p=0;     float sum = 0;     for(i=2; i<20; i++)     {         z[i]=z[s]+z[s+1];         s++;      }     for(j=2; j<20; j++)     {         m[j]=m[p]+m[p+1];         p++;     }     for(k=0; k<20; k++)     {         sum += (float)z[k]/(float)m[k];     }     printf("前二十项之和为：%lf\n",sum);     return 0; }
user-0 提问: 关于i++和++i在不同平台测试结果不一样，希望有人能解释一下

回复:
user: user-1
content: 问题表达式，语法上都没有错误，没必要下功夫研究

user: user-2
content: vs 2446    dev c++  3456 改良代码 int i ,j;  	i = 1; 	printf("%d  + %d = ",i++,i++); 	i = 1; 	j = (i++) + (i++); 	printf("%d\n", j);  	i = 1; 	printf("%d  + %d = ", i++, ++i); 	i = 1;  	j = (i++) + (++i); 	printf("%d\n", j); 	 	i = 1; 	printf("%d  + %d = ", ++i, i++); 	i = 1; 	j = (++i) + (i++); 	printf("%d\n", j);  	i = 1; 	printf("%d  + %d = ", ++i, ++i); 	i = 1; 	j = (++i) + (++i); 	printf("%d\n", j); 可以看出直接printf，是从右往左算，根据左++右++不同，哪种编译器输出的都一样，但是一旦引入+，就不一样了，所以我猜测是+、++i、i++三个的优先级处理（只是猜测，真正的规律还得看反汇编才知道）

user: user-3
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

user: user-4
content: 答案 这是未定义行为  结果没有意义

user: user-5
content: 这种奇葩的标题，还是不要这么起，太危言耸听了

user: user-0
content: 引用 4 楼 ShanTUT 的回复:研究这个干嘛呢。。。在我们公司，如果哪个程序员写出这种代码，领导在审查时候肯定不过。 就算你的功能测试没毛病了，也不给过。受教了

user: user-6
content: 请自行搜索sequence point。 类似(i++)+(++i)这样的语句执行结果都是不可预期的。

user: user-7
content: 研究这个干嘛呢。。。在我们公司，如果哪个程序员写出这种代码，领导在审查时候肯定不过。 就算你的功能测试没毛病了，也不给过。

user: user-8
content: 这就证明了结果与编译器有关，应该是不同的编译器为了效率对代码进行的优化不一样，具体看一眼汇编代码就知道了。 前几天还有人考古了一个帖子，在讨论同样的问题，供参考 https://bbs.csdn.net/topics/391905934

user: user-9
content: i++和++i次序是不一样，前者是先完成运算后i自加一，后者是先i自加一然后做其他运算。

user: user-10
content: 我认为结果是3 4 4 5
user-0 提问: 简单的c语言求完数的问题，想请教下大佬，

回复:
user: user-0
content: 感谢各位！！！！！

user: user-0
content: 数组k[]也要置零的哦

user: user-1
content: 楼主，你某些代码写错了，下面代码可供参考： #include<stdio.h> int main() { 	int i, x = 1, k[50], sum, s, t;//k[]就是因子 	while (x <= 1000) 	{ 		sum = 0; 		s = 0; 		for (i = 1; i < x; i++) 		{ 			if (x % i == 0) 			{ 				k[s] = i; 				++s; 			} 		}  		for (t = 0; t < s; t++) 			sum = sum + k[t]; 		 		if (sum == x) 			printf("%5d\n", x); 		 		x++; 	} 	return 0; }

user: user-2
content: #include<stdio.h> #include<string.h> int main() { int i,s=0,x=1,k[100],sum=0,t;//k[]就是因子    有点小 while(x<=1000) {     s=0;     sum=0;                                        //s和sum用过之后要置零     memset(k,0,sizeof(k));  //置零 for(i=1;i<x;i++) { if(x%i==0) { ++s; k[s]=i; } } for(t=0;t<=s;t++) sum=sum+k[t]; if(sum==x) printf("%5d\n",x); x++; } return 0; }
user-0 提问: opencv内存泄漏问题

回复:
user: user-1
content: 换C++版的吧。类变量离开其作用域时，自动调用其析构函数。

user: user-2
content: 会不会是hough函数的第一个参数IplImage*orl指向的图片内存没有释放？又或者是opencv里面的实现的机制，缓存一些图片数据，暂时不释放导致内存泄漏？

user: user-0
content: 我把中间的都注释掉了然后运行还是不能释放内存void hough(IplImage*orl,  int clr) {     clr = clr - 1;     clr = clr * 2;     int flag = 0;     CvPoint cen;     int max_pix = 0;     IplImage *andl = cvCreateImage(cvGetSize(orl), 8, 3),         *srccopyl = cvCreateImage(cvGetSize(orl), 8, 3)；     IplImage *roil = cvCreateImage(cvGetSize(orl), 8, 1),         *maskl = cvCreateImage(cvGetSize(orl), 8, 1),         *smol = cvCreateImage(cvGetSize(orl), 8, 1),         *pixl = cvCreateImage(cvGetSize(orl), 8, 1)；  cvReleaseImage(&andl); cvReleaseImage(&srccopyl); cvReleaseImage(&roil); cvReleaseImage(&maskl); cvReleaseImage(&smol); cvReleaseImage(&pixl);      }
user-0 提问: 求助大神帮忙实现一个C函数格式化XML的函数

回复:
user: user-1
content: 簡單的，見到<，分析接下來的字母，無非?、r、f、o和/，該換行還是縮進就有了。雖然通用性不是很好，但處理你這個例子已經足夠。
user-0 提问: C如何直接操作指定的内存地址？

回复:
user: user-0
content: 谢谢各位大佬的解答

user: user-1
content: 如果是输入指定的话，可以这样：a=指定地址的数字；int *p=(int*)a；*p即可访问。或者scanf（“%d”,&p）

user: user-2
content: int *p = (int *)0xffff; 这样指针p就强制指向地址为 0xffff 这片地址 这样操作风险有点大，万一是系统内存就gg

user: user-2
content: int *p = (int *)0xffff; 这样指针p就强制指向地址为 0xffff 这片内存 这样操作风险有点大，万一是系统内存就gg

user: user-3
content: 4楼正解，如果操作虚拟地址则可以直接赋值地址的值。

user: user-4
content: MSDN98中的例子walker又名pwalk。 完整列出指定进程的内存使用情况，显示进程地址空间内容，装载哪些DLL，代码、数据、堆栈段分配在何处，可以用来检测内存泄漏，监测内存使用。http://download.csdn.net/detail/zhao4zhong1/3667896

user: user-5
content: 指针就是操作内存地址，如果跨进程，需要用 ReadProcessMemory 如果要直接操作任意的物理地址，需要自己写操作系统，或者在允许这么做的操作系统（比如说dos，比如说windows 9x下的vxd）去做。

user: user-6
content: 引用 3 楼 kwanson 的回复:[quote=引用 2 楼 kwanson 的回复:] 在linux系统上，地址分为物质地址和虚拟地址。应用使用的是虚拟地址。内核会使用建立页表，使用MMP映射到具体的物理地址。内核是不允许用户操作物理地址的，并非语言层次的问题。 抱歉，打错字了，是MMU[/quote] 吓一跳,一开始没看到你3楼的回帖,猜到了是mmu,但我还是百度了一下这个mmp,说是叫妈卖批.

user: user-7
content: 引用 2 楼 kwanson 的回复:在linux系统上，地址分为物质地址和虚拟地址。应用使用的是虚拟地址。内核会使用建立页表，使用MMP映射到具体的物理地址。内核是不允许用户操作物理地址的，并非语言层次的问题。 抱歉，打错字了，是MMU

user: user-7
content: 在linux系统上，地址分为物质地址和虚拟地址。应用使用的是虚拟地址。内核会使用建立页表，使用MMP映射到具体的物理地址。内核是不允许用户操作物理地址的，并非语言层次的问题。

user: user-8
content: c也是可以直接操作内存地址的。比如malloc之后系统给及分配的内存地址可以使用指针进行赋值等操作。如果不对分配的地址释放，就会出现内存泄漏的问题。其他的也又可以直接操作内存地址的，比如ARM中 #define rWTCON (*(volatile unsigned *)0x03000000)然后在函数调用中对这地址直接赋值，rWTCON = (PCLK / (100000-1)<<8 | (3<<3));
user-0 提问: 二进制转化为16进制不懂这个如何转化的

回复:
user: user-1
content: 可以把二进制先转成十进制，再转为16进制，，，而且2进制转16进制貌似有函数可以直接调用......

user: user-2
content: 对于三目表达式 ch + ((ch<10) ? '0' : '7'); 当ch的值是0-9时，则将其转换为'0'-'9'，所以就是ch+'0' 当ch的值是10-15时，则将其转换为'A'-'F'，所以就是ch+'7'，例如当ch=10时，10+'7'的值正好对应的是字符'A'，11+'7'的值正好对应字符'B’，以此类推

user: user-3
content: 静心看一下，如果功底稍弱，把表达式按照优先级分隔之后再调试查看变量

user: user-4
content: 查表法效率最高，代码最简洁。

user: user-5
content: 引用 5 楼 xiwangaoxiang 的回复:[quote=引用 4 楼 wang0635 的回复:] [quote=引用 2 楼 wang0635 的回复:] for(i=0;i<length;i++,xad--) {     ch = (*xad >> 4) & 0x0f;    =========> 取一个字节的高4位     dest[i<<1] = ch + ((ch<10) ? '0' : '7');     ========> 如果小于10，变成ascii码 '0'~'9'（+'0'实现），大于10则变成ascii码 'A'~'F'（-10+'A'=+'7'实现）。存入     ch = *xad & 0x0f;    =========> 取一个字节的高4位     dest[(i<<1)+1] = ch + ((ch<10) ? '0' : '7');    =========> 同上 } 应该是 ch = *xad & 0x0f;    =========> 取一个字节的低4位[/quote]   ch + ((ch<10) ? '0' : '7'); -----------是不是应该为ch + ((ch<10) ? '0' : '1');   (1)ch = 9 ch = 0; dest[0] = 0+'0'; ch = 9; dest[1] = 9+'0';(9+30=39='9')  (2)ch = 11 ch = 0; dest[0] = 0+'0'; ch = 11; dest[1] = 11+'1';(11+31=42='B');[/quote] dest[1] = 11+'1';(11+31=42='B'); ======> 0x11 + 0x31 = 0x42。11是十进制的，等于0x0B，只加0x31就不行了

user: user-5
content: 引用 2 楼 wang0635 的回复:for(i=0;i<length;i++,xad--) {     ch = (*xad >> 4) & 0x0f;    =========> 取一个字节的高4位     dest[i<<1] = ch + ((ch<10) ? '0' : '7');     ========> 如果小于10，变成ascii码 '0'~'9'（+'0'实现），大于10则变成ascii码 'A'~'F'（-10+'A'=+'7'实现）。存入     ch = *xad & 0x0f;    =========> 取一个字节的高4位     dest[(i<<1)+1] = ch + ((ch<10) ? '0' : '7');    =========> 同上 } 应该是 ch = *xad & 0x0f;    =========> 取一个字节的低4位

user: user-6
content: 引用 4 楼 wang0635 的回复:[quote=引用 2 楼 wang0635 的回复:] for(i=0;i<length;i++,xad--) {     ch = (*xad >> 4) & 0x0f;    =========> 取一个字节的高4位     dest[i<<1] = ch + ((ch<10) ? '0' : '7');     ========> 如果小于10，变成ascii码 '0'~'9'（+'0'实现），大于10则变成ascii码 'A'~'F'（-10+'A'=+'7'实现）。存入     ch = *xad & 0x0f;    =========> 取一个字节的高4位     dest[(i<<1)+1] = ch + ((ch<10) ? '0' : '7');    =========> 同上 } 应该是 ch = *xad & 0x0f;    =========> 取一个字节的低4位[/quote]   ch + ((ch<10) ? '0' : '7'); -----------是不是应该为ch + ((ch<10) ? '0' : '1');   (1)ch = 9 ch = 0; dest[0] = 0+'0'; ch = 9; dest[1] = 9+'0';(9+30=39='9')  (2)ch = 11 ch = 0; dest[0] = 0+'0'; ch = 11; dest[1] = 11+'1';(11+31=42='B');

user: user-5
content: for(i=0;i<length;i++,xad--) {     ch = (*xad >> 4) & 0x0f;    =========> 取一个字节的高4位     dest[i<<1] = ch + ((ch<10) ? '0' : '7');     ========> 如果小于10，变成ascii码 '0'~'9'（+'0'实现），大于10则变成ascii码 'A'~'F'（-10+'A'=+'7'实现）。存入     ch = *xad & 0x0f;    =========> 取一个字节的高4位     dest[(i<<1)+1] = ch + ((ch<10) ? '0' : '7');    =========> 同上 }

user: user-7
content: 还真没看懂，确认是二进制转化成16进制的代码？

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

回复:
user: user-1
content: 引用 3 楼 DelphiGuy 的回复:32位编译器，只要不是特别老的，通常都支持64位数据类型，long long、__int64之类的，常规运算都支持，直接用就是了 对呀。为什么不呢？

user: user-2
content: 单片机中经常有这种操作，注意运算关系，自己设计加减乘除就行了。

user: user-3
content: 位運算比較簡單了，自行存儲高32位數據，顯示什麽的都要另行處理。 損害硬件？不存在的。

user: user-4
content: 32位编译器，只要不是特别老的，通常都支持64位数据类型，long long、__int64之类的，常规运算都支持，直接用就是了
user-0 提问: 如何在easyhook的处理函数中调用原函数？？

回复:
user: user-1
content: 在hook之前你没保存原函数地址吗？ 比如在获取func1的地址，然后保存，再进行hook，在hook函数中调用

user: user-2
content: 只是在c#中运用了EasyHook，没有在c++中运用。 hook相应函数后执行原函数，此以CreateFileW为例，c#源码如下：  //导入原函数 [DllImport("kernel32.dll",         CharSet = CharSet.Unicode,         SetLastError = true, CallingConvention = CallingConvention.StdCall)]     static extern IntPtr CreateFileW(         String filename,         UInt32 desiredAccess,         UInt32 shareMode,         IntPtr securityAttributes,         UInt32 creationDisposition,         UInt32 flagsAndAttributes,         IntPtr templateFile); IntPtr CreateFile_Hook(String filename,         UInt32 desiredAccess,         UInt32 shareMode,         IntPtr securityAttributes,         UInt32 creationDisposition,         UInt32 flagsAndAttributes,         IntPtr templateFile)     {  //执行原函数 return CreateFileW(             filename,             desiredAccess,             shareMode,             securityAttributes,             creationDisposition,             flagsAndAttributes,             templateFile); } 在hook函数中设定返回值，此返回值为原函数执行结果。 相信c++也是相应的思想。 希望对楼主有帮助。

user: user-3
content: 我怀疑你没仔细研究这个软件。

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/ 您好， 我是想在自己的一个项目里来用代码实现 上面的功能 您给你的是个软件可能不太符合我的需要

user: user-0
content: 引用 1 楼 mjj1943 的回复:能帮上忙的大神，可 RMB  报答， 实在是比较着急 试验回复一下  是不是这样做的

user: user-3
content: WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/

user: user-0
content: 能帮上忙的大神，可 RMB  报答， 实在是比较着急
user-0 提问: 有没有一个能把一些差距很大的数据进行缩小差距的方法

回复:
user: user-1
content: 首先，信号处理领域，频谱一般都喜欢用对数轴。对数轴比较出来的dB数是准确的。用自然轴，高低差别超级剧烈。  其次，做显示的采样信号，建议用均值平滑一下。不过用对数就OK了。

user: user-0
content: 引用 8 楼 u011062336 的回复:第一个问题：滤波，或者设置阀值，高出或低于阀值，丢掉 第二个问题：采样第二个问题，现在就是单纯采样抽部分出来用，因为部分数据没用到导致效果不好。在想能用什么方法把没用的的用上？

user: user-2
content: 第一个问题：滤波，或者设置阀值，高出或低于阀值，丢掉 第二个问题：采样

user: user-3
content: 樓上都很專業

user: user-4
content: 求算术平均值 求标准方差 对每个数据，如果它与算术平均值的差的绝对值大于标准方差，则舍弃该数据 剩下的就是比较典型的数据

user: user-5
content: 集体取log运算。。或者其实缩小的运算。

user: user-3
content: 相差太大的本來就是有噪音吧，那保留下來才能不失真？ 如果僅僅是爲了曲綫圖/柱狀圖看起來比較平滑，統一加一個數就可以了，但你確認這是你要的東西？

user: user-0
content: 引用 3 楼 hzy_76 的回复:相差太大的本來就是有噪音吧，那保留下來才能不失真？ 如果僅僅是爲了曲綫圖/柱狀圖看起來比較平滑，統一加一個數就可以了，但你確認這是你要的東西？  引用 5 楼 DelphiGuy 的回复:求算术平均值 求标准方差 对每个数据，如果它与算术平均值的差的绝对值大于标准方差，则舍弃该数据 剩下的就是比较典型的数据对于第二个问题我看到一个方法是这么说的“采样点1024，转换后有1024个频率点，如果我们仅用到128个频率点，其它没用到的怎么办？ 不显示的话，完全表现不出真实的频谱，这个时候就得需要一种简单的加权算法，把其它没有用到的做一个加权处理，叠加到频率点上面”，这个怎么理解？

user: user-0
content: 引用 1 楼 hzy_76 的回复:不要抽取，假設每隔3個數做一個柱子，應該是這3個數做一個平均，曲綫就會更平滑和接近實際。是做算术平均还是加权平均？我看有些说要加权。还有幅值相差太大怎么解决呢？

user: user-3
content: 不要抽取，假設每隔3個數做一個柱子，應該是這3個數做一個平均，曲綫就會更平滑和接近實際。
user-0 提问: 请问怎么样才能让一个const数组全部初始化成一个固定值呢？

回复:
user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") #include <stdio.h> const int a[10]={99}; int main() {     int i;      for (i=0;i<10;i++) printf("%d ",a[i]);     printf("\n");      for (i=0;i<10;i++) ((int *)&a[0])[i]=99;      for (i=0;i<10;i++) printf("%d ",a[i]);     printf("\n");     return 0; } //99 0 0 0 0 0 0 0 0 0 //99 99 99 99 99 99 99 99 99 99 //

user: user-1
content: C++11 ？

user: user-2
content: #define data(num) num,num,num,num,num,num,num,num,num,num//10个 const int a[100] = { data(data(99)) };//递归，100个是10的2次方，递归两次

user: user-3
content: mark 关注一下，我也不知道，我做的话是直接写100个99。  另外，写100个99好像也没有意义，值都是一样的，用同一个变量就够了。  看看有没有人有好办法。

user: user-4
content: const int a[100] = { [0 ... 99] = 99 };同样的代码，ubuntu下GCC编译通过并运行，C在线编译器也OK，但是在windows下用codeblocks和vs编译均报错，跟编译器有关？

user: user-5
content: 或者写上一系列的宏函数用##来连接元素，最后再加上宏函数的连接和嵌套

user: user-1
content: 不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！
user-0 提问: 控制台打印出的月份时间排列顺序有点乱，有想用showInfo进行处理，但本人是名小白，方法还不知到怎么用，如果有哪位大侠知道的话麻烦请告知一下，小弟先行谢过了！

回复:
user: user-1
content: c语言还有showinfo这东西？你这就是考虑多种情况下的排版问题在for里的统一，一眼就能看出当一行打不满7天的时候，后面的半部分就会出错，可见你对else的处理不对，还有既然选择%4d那打印空格什么的时候最好别出现奇数
user-0 提问: 运行代码有时候会触发 exe出现断点，有时候不触发，这个是为什么

回复:
user: user-0
content: 找到问题了，数组越界了，我对rs实际分配了6个内存空间，但是实际我用了22乘以六个内存，，把rs分配的空间扩大，就没有问题了。

user: user-0
content: 引用 1 楼 u010399796 的回复:点中断  然后看一下堆栈  哪个函数报的错 发了图再看看我发了图你看下

user: user-0
content: 崩溃的时候总是停留在这个窗口

user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-2
content: 有时出现有时不出现，应该是遇到野指针了。

user: user-3
content: 点中断  然后看一下堆栈  哪个函数报的错 发了图再看看
user-0 提问: “segmentation fault”求助

回复:
user: user-1
content: 段错误，把小于等于改成小于试试

user: user-2
content: argv数组越界访问了。i <= argc改成i < argc；

user: user-3
content: 首先不知道你为什么直接去用main函数里的argv两个参数，这和你的输入并没有什么关系，输入用scanf就行了  其次你报的错误就是楼上说的，数组的问题，好比你创建了int a[5] 然后你去赋值或者累加等等，里面的元素是a[0] a[1] a[2] a[3] a[4]，而你的程序里累加用的a[1] a[2] a[3] a[4] a[5]，问题就在a[5]，你用这个就是越界了

user: user-4
content: i <= argc --> i <  argc  argv[argc]是第argc+1个元素

user: user-5
content: 通过一楼的回答可以看出，用简单有效的方式就可以完成您的目标，为啥要搞的那么复杂呢，就是个简单的累加求和搞出个段错误
user-0 提问: 关于c语言的几个问题？

回复:
user: user-1
content: 若数组是二维数组，比如int arr[4][4]; &arr是指整个数组的地址，类型即int (*arr)[4][4]; 若是&arr[0];表示第一行的首地址。 若是int arr[4]; &arr是指整个数组的地址，类型即int (*arr)[4];&arr[0]是指第一个元素的地址。 枚举的类型一般是整型的。 使用位段可以节省空间，不同系统（比如大小端不一样的系统）使用位段需要注意，不能直接移植。

user: user-2
content: 1、int char[10];      char *p = a;                     //p指向的内存是 1 个字节，故 p+1 向后移动 1 个字节      char *p = &a;                  //p指向的内存是 10 个字节，故 p+1 向后移动 10 个字节 2、枚举的实质是整型 3、0也是无符号数 4、不知道什么是位段 5、定义为 const 只是让程序不能改变它，但外部条件依旧可能会使 const 变量发生改变。volatile 是防优化。就是告诉编译器 我这片内存可能因为外部条件改变，不去优化它。

user: user-3
content: 1、指數組的第二個成員的地址 3、0也算無符號 5、我的理解，volatile并不能讓你可以修改const修飾的變量，它只是告訴編譯器，這塊内存可能被意外改變（比如別的進程），因此優化時可能要特別處理。但程序中如果對變量進行改變，依然會因爲const存在而報錯。
user-0 提问: break之使用

回复:
user: user-0
content: 引用 3 楼 qq_41985711 的回复:[quote=引用 2 楼 4oclhashcat的回复:][quote=引用 1 楼 qq_41985711 的回复:] 问题1:str_chr函数里面if为真时，str没有后移，循环陷入死循环。 问题2:char的实质是整型 谢谢解答。 else里的str++后移了呀[/quote] if为真那么永远不会进入else语句。所以在if语句里面str也要后移。if else 是互斥的，二者只有一个被执行。[/quote] 谢谢，犯了低级错误。

user: user-1
content: 引用 2 楼 4oclhashcat的回复:[quote=引用 1 楼 qq_41985711 的回复:] 问题1:str_chr函数里面if为真时，str没有后移，循环陷入死循环。 问题2:char的实质是整型 谢谢解答。 else里的str++后移了呀[/quote] if为真那么永远不会进入else语句。所以在if语句里面str也要后移。if else 是互斥的，二者只有一个被执行。

user: user-0
content: 引用 1 楼 qq_41985711 的回复:问题1:str_chr函数里面if为真时，str没有后移，循环陷入死循环。 问题2:char的实质是整型 谢谢解答。 else里的str++后移了呀

user: user-1
content: 问题1:str_chr函数里面if为真时，str没有后移，循环陷入死循环。 问题2:char的实质是整型
user-0 提问: c语言单向链表的一个小结

回复:
user: user-1
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

user: user-0
content: 引用 1 楼 colinfang2006 的回复:数据结构存下当前链表尾节点指针不就好了，实现简单代码也会简洁很多 node = malloc(...); if (node != NULL) {     node->data =data;     tail->next = node;     node->next = NULL;     tail = node; } 你这样写很简洁而且满足了需求。谢谢指教

user: user-2
content: 数据结构存下当前链表尾节点指针不就好了，实现简单代码也会简洁很多 node = malloc(...); if (node != NULL) {     node->data =data;     tail->next = node;     node->next = NULL;     tail = node; }