Question: 大神解释下c语言中的引号如何被编译器解释的。

引用 5 楼 u011416173 的回复:[quote=引用 3 楼 Bokutake 的回复:] C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。 没太清除额： 1.填充？是什么意思？ 2.‘abc’肯定是解释成一个字符对吧？那你的意思是说解释成其中哪个字符是不确定的么？还望多多赐教 啊。谢了。 3.如果不确定那你的case语句不是有可能无法对应了，因为存在不同的解释结果？[/quote]  引用 5 楼 u011416173 的回复:[quote=引用 3 楼 Bokutake 的回复:] C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。 没太清除额： 1.填充？是什么意思？ 2.‘abc’肯定是解释成一个字符对吧？那你的意思是说解释成其中哪个字符是不确定的么？还望多多赐教 啊。谢了。 3.如果不确定那你的case语句不是有可能无法对应了，因为存在不同的解释结果？[/quote]  填充的意思是如果你的字符不够4个字节（int宽度）那么，在前面加0还是后面加0，是编译器自己决定的。 'abc'其实是当做一个整数用，值有可能是0x616263，也可能是0x61626300。也可能顺序倒过来，按照x86的int那种小端字节序。 意思是在同一个编译器下是确定的，但是不同编译器的规则可能不同。如果你只用一个编译器，或者不在不同库的接口中使用这种多字节字面量，而是在模块内部使用的话，基本是没问题的。

引用 13 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！学习了

引用 5 楼 u011416173 的回复:[quote=引用 3 楼 Bokutake 的回复:] C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。 没太清除额： 1.填充？是什么意思？ 2.‘abc’肯定是解释成一个字符对吧？那你的意思是说解释成其中哪个字符是不确定的么？还望多多赐教 啊。谢了。 3.如果不确定那你的case语句不是有可能无法对应了，因为存在不同的解释结果？[/quote] 看了一下 如果int a='abc'这样定义 vs编译器是a=0x616263 这样的

引用 3 楼 Bokutake 的回复:C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。 学习了～

引用 9 楼 AnYidan 的回复:[quote=引用 5 楼 u011416173 的回复:] [quote=引用 3 楼 Bokutake 的回复:] C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。 没太清除额： 1.填充？是什么意思？ 2.‘abc’肯定是解释成一个字符对吧？那你的意思是说解释成其中哪个字符是不确定的么？还望多多赐教 啊。谢了。 3.如果不确定那你的case语句不是有可能无法对应了，因为存在不同的解释结果？[/quote]  一种不推荐使用、不可移植的写法[/quote] 谢了！

引用 5 楼 u011416173 的回复:[quote=引用 3 楼 Bokutake 的回复:] C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。 没太清除额： 1.填充？是什么意思？ 2.‘abc’肯定是解释成一个字符对吧？那你的意思是说解释成其中哪个字符是不确定的么？还望多多赐教 啊。谢了。 3.如果不确定那你的case语句不是有可能无法对应了，因为存在不同的解释结果？[/quote]  一种不推荐使用、不可移植的写法

引用 7 楼 u011416173 的回复:[quote=引用 6 楼 mujiok2003 的回复:] [quote=引用 3 楼 Bokutake 的回复:] C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。  ++[/quote] 大神你肯定也知道了其中意思，那能推荐个链接让我看看么，我想要详细点的说明额。[/quote]  C++也是这么说的，  引用An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.  它的值由编译器（的实现）决定，没有确定结果。 也就说，避免使用它。 你就不必深究了。  关于字节序：搜索byte order 关于内存对齐方式(填充方式）：搜索memory alignment

引用 6 楼 mujiok2003 的回复:[quote=引用 3 楼 Bokutake 的回复:] C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。  ++[/quote] 大神你肯定也知道了其中意思，那能推荐个链接让我看看么，我想要详细点的说明额。

引用 3 楼 Bokutake 的回复:C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。  ++

引用 3 楼 Bokutake 的回复:C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。 没太清除额： 1.填充？是什么意思？ 2.‘abc’肯定是解释成一个字符对吧？那你的意思是说解释成其中哪个字符是不确定的么？还望多多赐教 啊。谢了。 3.如果不确定那你的case语句不是有可能无法对应了，因为存在不同的解释结果？

引用 3 楼 Bokutake 的回复:C99标准：6.4.4.4p10:   "The value of an integer character constant containing more than one character (e.g., 'ab'), or containing a character or escape sequence that does not map to a single-byte execution character, is implementation-defined."  这种multicharacter literal（多字符字面量）是合法的，但是编译器以那种字节序和填充方式安排字符是由它自己决定的。不推荐使用它。但是有的时候可以利用它优化代码可读性。比如用4个字符的字面量代表一个UINT常量，可以用在switch里：case 'TAG1'这样。  赞一个,VS会编译为4个连续的字节

‘abc’这样编译能通过吗？我也很想知道，

如何被解释。。好 高端 。。。的问题。。   微观


Question: 关于linux sem_wait/sem_post的疑问.

这里： if (data < 3)         {         printf("%x, wait thread\n", tid);         pthread_mutex_lock(&lock);   读取data时候没有加锁。 假设data==2，线程1看到data==2，进入(data < 3)分支； 线程2看到data==2，也进入(data < 3)分支。 最终data == 4。


Question: 一条嵌入c语言的汇编语句

要问什么


Question: 一条嵌入c语言的汇编语句

呵呵，我说这个问题是我用手机发的，而且发出了两遍，结果哥写的10来行代码和数百文字就这么在发帖的瞬间消失了，就剩这么几个自己都看不懂的字符了，不过没关系，给你们出一个更有挑战的问题吧。

引用 楼主 moon779527421 的回复:unsigned char in(unsigned short _port){ unsigned char result unsigned char in(unsigned short _port); //declare a func unsigned char result; //declare a var

没看明白 ！

这是什么啊？

要问什么

你这是在测试发帖功能吗

这个世界上 不是喜欢问问题的孩子 就是聪明的孩子 而是把简单的问题问的有水平 明确自己想要知道什么 了解自己懂什么的人 最终才会成功 你太不专业了 这问题问的  得出结论 你要先学习问问题在学习去解决问题


Question: ioctl(fd, HDIO_GET_IDENTITY, &id)时出错

引用 4 楼 yulitingfeng 的回复:文件已经打开了的，就是ioctl时出错sda驱动ioctl函数没有这个参数处理项； ioctl不支持HDIO_GET_IDENTITY参数，请确定该参数是否正确。可以查下sda驱动的的实现[/quote]  现在知道为什么会出错了，因为我的是SATA硬盘，SATA硬盘不支持HDIO_GET_IDENTITY参数，而要用BLKGETSIZE参数，多谢了

引用 2 楼 tdy353021560 的回复:文件已经打开了的，就是ioctl时出错sda驱动ioctl函数没有这个参数处理项； ioctl不支持HDIO_GET_IDENTITY参数，请确定该参数是否正确。可以查下sda驱动的的实现

man 3p ioctl

文件已经打开了的，就是ioctl时出错

确定你的文件是否正确打开，检查下fd； 提示错误是无效参数，该设备驱动不支持此参数。


Question: opengl 如何在多个物体中一个物体不动,另一个物体自由下落

谢谢了，我试一下

搜网络教程“学OpenGL编3D游戏”。


Question: 10输入10输出矩阵算法

位域和这个算法有什么关系？

PLA

位域


Question: 为什么我之前都没听说过stdint.h ， C语言的书上都没讲

引用 14 楼 z542858367 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:] C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdint.h /* stdint.h standard header */ #pragma once #ifndef _STDINT #define _STDINT #ifndef RC_INVOKED #include <yvals.h>  /* NB: assumes     byte has 8 bits     long is 32 bits     pointer can convert to and from long long     long long is longest type  */  _C_STD_BEGIN         /* TYPE DEFINITIONS */ typedef signed char int8_t; typedef short int16_t; typedef int int32_t;  typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t;  typedef signed char int_least8_t; typedef short int_least16_t; typedef int int_least32_t;  typedef unsigned char uint_least8_t; typedef unsigned short uint_least16_t; typedef unsigned int uint_least32_t;  typedef char int_fast8_t; typedef int int_fast16_t; typedef int int_fast32_t;  typedef unsigned char uint_fast8_t; typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t;  #ifndef _INTPTR_T_DEFINED  #define _INTPTR_T_DEFINED  #ifdef _WIN64 typedef __int64 intptr_t;  #else /* _WIN64 */ typedef _W64 int intptr_t;  #endif /* _WIN64 */ #endif /* _INTPTR_T_DEFINED */  #ifndef _UINTPTR_T_DEFINED  #define _UINTPTR_T_DEFINED  #ifdef _WIN64 typedef unsigned __int64 uintptr_t;  #else /* _WIN64 */ typedef _W64 unsigned int uintptr_t;  #endif /* _WIN64 */ #endif /* _UINTPTR_T_DEFINED */  typedef _Longlong int64_t; typedef _ULonglong uint64_t;  typedef _Longlong int_least64_t; typedef _ULonglong uint_least64_t;  typedef _Longlong int_fast64_t; typedef _ULonglong uint_fast64_t;  typedef _Longlong intmax_t; typedef _ULonglong uintmax_t;  		/* LIMIT MACROS */ #define INT8_MIN	(-0x7f - _C2) #define INT16_MIN	(-0x7fff - _C2) #define INT32_MIN	(-0x7fffffff - _C2)  #define INT8_MAX	0x7f #define INT16_MAX	0x7fff #define INT32_MAX	0x7fffffff #define UINT8_MAX	0xff #define UINT16_MAX	0xffff #define UINT32_MAX	0xffffffff  #define INT_LEAST8_MIN		(-0x7f - _C2) #define INT_LEAST16_MIN		(-0x7fff - _C2) #define INT_LEAST32_MIN		(-0x7fffffff - _C2)  #define INT_LEAST8_MAX		0x7f #define INT_LEAST16_MAX		0x7fff #define INT_LEAST32_MAX		0x7fffffff #define UINT_LEAST8_MAX		0xff #define UINT_LEAST16_MAX	0xffff #define UINT_LEAST32_MAX	0xffffffff  #define INT_FAST8_MIN		(-0x7f - _C2) #define INT_FAST16_MIN		(-0x7fff - _C2) #define INT_FAST32_MIN		(-0x7fffffff - _C2)  #define INT_FAST8_MAX		0x7f #define INT_FAST16_MAX		0x7fff #define INT_FAST32_MAX		0x7fffffff #define UINT_FAST8_MAX		0xff #define UINT_FAST16_MAX		0xffff #define UINT_FAST32_MAX		0xffffffff   #if _INTPTR == 0 || _INTPTR == 1 #define INTPTR_MAX			0x7fffffff #define INTPTR_MIN			(-INTPTR_MAX - _C2) #define UINTPTR_MAX			0xffffffff   #else /* _INTPTR == 2 */ #define INTPTR_MIN			(-_LLONG_MAX - _C2) #define INTPTR_MAX			_LLONG_MAX #define UINTPTR_MAX			_ULLONG_MAX #endif /* _INTPTR */  #define INT8_C(x)	(x) #define INT16_C(x)	(x) #define INT32_C(x)	((x) + (INT32_MAX - INT32_MAX))  #define UINT8_C(x)	(x) #define UINT16_C(x)	(x) #define UINT32_C(x)	((x) + (UINT32_MAX - UINT32_MAX))  #ifdef _WIN64  #define PTRDIFF_MIN		INT64_MIN  #define PTRDIFF_MAX		INT64_MAX #else /* _WIN64 */  #define PTRDIFF_MIN		INT32_MIN  #define PTRDIFF_MAX		INT32_MAX #endif /* _WIN64 */  #define SIG_ATOMIC_MIN	INT32_MIN #define SIG_ATOMIC_MAX	INT32_MAX  #ifndef SIZE_MAX  #ifdef _WIN64   #define SIZE_MAX		UINT64_MAX  #else /* _WIN64 */   #define SIZE_MAX		UINT32_MAX  #endif /* _WIN64 */ #endif /* SIZE_MAX */  #define WCHAR_MIN   0x0000 #define WCHAR_MAX   0xffff  #define WINT_MIN    0x0000 #define WINT_MAX    0xffff   #define INT64_MIN  (-0x7fffffffffffffff - _C2)  #define INT64_MAX  0x7fffffffffffffff  #define UINT64_MAX 0xffffffffffffffffU   #define INT_LEAST64_MIN    (-0x7fffffffffffffff - _C2)  #define INT_LEAST64_MAX    0x7fffffffffffffff  #define UINT_LEAST64_MAX   0xffffffffffffffffU   #define INT_FAST64_MIN     (-0x7fffffffffffffff - _C2)  #define INT_FAST64_MAX     0x7fffffffffffffff  #define UINT_FAST64_MAX    0xffffffffffffffffU   #define INTMAX_MIN     (-0x7fffffffffffffff - _C2)  #define INTMAX_MAX     0x7fffffffffffffff  #define UINTMAX_MAX    0xffffffffffffffffU  #define INT64_C(x)      ((x) + (INT64_MAX - INT64_MAX)) #define UINT64_C(x)     ((x) + (UINT64_MAX - UINT64_MAX)) #define INTMAX_C(x)     INT64_C(x) #define UINTMAX_C(x)    UINT64_C(x) _C_STD_END #endif /* RC_INVOKED */ #endif /* _STDINT */   #if defined(_STD_USING) using _CSTD int8_t; using _CSTD int16_t; using _CSTD int32_t; using _CSTD int64_t;  using _CSTD uint8_t; using _CSTD uint16_t; using _CSTD uint32_t; using _CSTD uint64_t;  using _CSTD int_least8_t; using _CSTD int_least16_t; using _CSTD int_least32_t;  using _CSTD int_least64_t; using _CSTD uint_least8_t; using _CSTD uint_least16_t; using _CSTD uint_least32_t; using _CSTD uint_least64_t;  using _CSTD intmax_t; using _CSTD uintmax_t;  using _CSTD uintptr_t; using _CSTD intptr_t;  using _CSTD int_fast8_t; using _CSTD int_fast16_t; using _CSTD int_fast32_t; using _CSTD int_fast64_t; using _CSTD uint_fast8_t; using _CSTD uint_fast16_t; using _CSTD uint_fast32_t; using _CSTD uint_fast64_t;  #endif /* defined(_STD_USING) */  /*  * Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED.  * Consult your license regarding permissions and restrictions. V5.20:0009 */  看不懂啊，老师[/quote]  就是一个头文件C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdint.h

引用 9 楼 zhao4zhong1 的回复:C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdint.h /* stdint.h standard header */ #pragma once #ifndef _STDINT #define _STDINT #ifndef RC_INVOKED #include <yvals.h>  /* NB: assumes     byte has 8 bits     long is 32 bits     pointer can convert to and from long long     long long is longest type  */  _C_STD_BEGIN         /* TYPE DEFINITIONS */ typedef signed char int8_t; typedef short int16_t; typedef int int32_t;  typedef unsigned char uint8_t; typedef unsigned short uint16_t; typedef unsigned int uint32_t;  typedef signed char int_least8_t; typedef short int_least16_t; typedef int int_least32_t;  typedef unsigned char uint_least8_t; typedef unsigned short uint_least16_t; typedef unsigned int uint_least32_t;  typedef char int_fast8_t; typedef int int_fast16_t; typedef int int_fast32_t;  typedef unsigned char uint_fast8_t; typedef unsigned int uint_fast16_t; typedef unsigned int uint_fast32_t;  #ifndef _INTPTR_T_DEFINED  #define _INTPTR_T_DEFINED  #ifdef _WIN64 typedef __int64 intptr_t;  #else /* _WIN64 */ typedef _W64 int intptr_t;  #endif /* _WIN64 */ #endif /* _INTPTR_T_DEFINED */  #ifndef _UINTPTR_T_DEFINED  #define _UINTPTR_T_DEFINED  #ifdef _WIN64 typedef unsigned __int64 uintptr_t;  #else /* _WIN64 */ typedef _W64 unsigned int uintptr_t;  #endif /* _WIN64 */ #endif /* _UINTPTR_T_DEFINED */  typedef _Longlong int64_t; typedef _ULonglong uint64_t;  typedef _Longlong int_least64_t; typedef _ULonglong uint_least64_t;  typedef _Longlong int_fast64_t; typedef _ULonglong uint_fast64_t;  typedef _Longlong intmax_t; typedef _ULonglong uintmax_t;  		/* LIMIT MACROS */ #define INT8_MIN	(-0x7f - _C2) #define INT16_MIN	(-0x7fff - _C2) #define INT32_MIN	(-0x7fffffff - _C2)  #define INT8_MAX	0x7f #define INT16_MAX	0x7fff #define INT32_MAX	0x7fffffff #define UINT8_MAX	0xff #define UINT16_MAX	0xffff #define UINT32_MAX	0xffffffff  #define INT_LEAST8_MIN		(-0x7f - _C2) #define INT_LEAST16_MIN		(-0x7fff - _C2) #define INT_LEAST32_MIN		(-0x7fffffff - _C2)  #define INT_LEAST8_MAX		0x7f #define INT_LEAST16_MAX		0x7fff #define INT_LEAST32_MAX		0x7fffffff #define UINT_LEAST8_MAX		0xff #define UINT_LEAST16_MAX	0xffff #define UINT_LEAST32_MAX	0xffffffff  #define INT_FAST8_MIN		(-0x7f - _C2) #define INT_FAST16_MIN		(-0x7fff - _C2) #define INT_FAST32_MIN		(-0x7fffffff - _C2)  #define INT_FAST8_MAX		0x7f #define INT_FAST16_MAX		0x7fff #define INT_FAST32_MAX		0x7fffffff #define UINT_FAST8_MAX		0xff #define UINT_FAST16_MAX		0xffff #define UINT_FAST32_MAX		0xffffffff   #if _INTPTR == 0 || _INTPTR == 1 #define INTPTR_MAX			0x7fffffff #define INTPTR_MIN			(-INTPTR_MAX - _C2) #define UINTPTR_MAX			0xffffffff   #else /* _INTPTR == 2 */ #define INTPTR_MIN			(-_LLONG_MAX - _C2) #define INTPTR_MAX			_LLONG_MAX #define UINTPTR_MAX			_ULLONG_MAX #endif /* _INTPTR */  #define INT8_C(x)	(x) #define INT16_C(x)	(x) #define INT32_C(x)	((x) + (INT32_MAX - INT32_MAX))  #define UINT8_C(x)	(x) #define UINT16_C(x)	(x) #define UINT32_C(x)	((x) + (UINT32_MAX - UINT32_MAX))  #ifdef _WIN64  #define PTRDIFF_MIN		INT64_MIN  #define PTRDIFF_MAX		INT64_MAX #else /* _WIN64 */  #define PTRDIFF_MIN		INT32_MIN  #define PTRDIFF_MAX		INT32_MAX #endif /* _WIN64 */  #define SIG_ATOMIC_MIN	INT32_MIN #define SIG_ATOMIC_MAX	INT32_MAX  #ifndef SIZE_MAX  #ifdef _WIN64   #define SIZE_MAX		UINT64_MAX  #else /* _WIN64 */   #define SIZE_MAX		UINT32_MAX  #endif /* _WIN64 */ #endif /* SIZE_MAX */  #define WCHAR_MIN   0x0000 #define WCHAR_MAX   0xffff  #define WINT_MIN    0x0000 #define WINT_MAX    0xffff   #define INT64_MIN  (-0x7fffffffffffffff - _C2)  #define INT64_MAX  0x7fffffffffffffff  #define UINT64_MAX 0xffffffffffffffffU   #define INT_LEAST64_MIN    (-0x7fffffffffffffff - _C2)  #define INT_LEAST64_MAX    0x7fffffffffffffff  #define UINT_LEAST64_MAX   0xffffffffffffffffU   #define INT_FAST64_MIN     (-0x7fffffffffffffff - _C2)  #define INT_FAST64_MAX     0x7fffffffffffffff  #define UINT_FAST64_MAX    0xffffffffffffffffU   #define INTMAX_MIN     (-0x7fffffffffffffff - _C2)  #define INTMAX_MAX     0x7fffffffffffffff  #define UINTMAX_MAX    0xffffffffffffffffU  #define INT64_C(x)      ((x) + (INT64_MAX - INT64_MAX)) #define UINT64_C(x)     ((x) + (UINT64_MAX - UINT64_MAX)) #define INTMAX_C(x)     INT64_C(x) #define UINTMAX_C(x)    UINT64_C(x) _C_STD_END #endif /* RC_INVOKED */ #endif /* _STDINT */   #if defined(_STD_USING) using _CSTD int8_t; using _CSTD int16_t; using _CSTD int32_t; using _CSTD int64_t;  using _CSTD uint8_t; using _CSTD uint16_t; using _CSTD uint32_t; using _CSTD uint64_t;  using _CSTD int_least8_t; using _CSTD int_least16_t; using _CSTD int_least32_t;  using _CSTD int_least64_t; using _CSTD uint_least8_t; using _CSTD uint_least16_t; using _CSTD uint_least32_t; using _CSTD uint_least64_t;  using _CSTD intmax_t; using _CSTD uintmax_t;  using _CSTD uintptr_t; using _CSTD intptr_t;  using _CSTD int_fast8_t; using _CSTD int_fast16_t; using _CSTD int_fast32_t; using _CSTD int_fast64_t; using _CSTD uint_fast8_t; using _CSTD uint_fast16_t; using _CSTD uint_fast32_t; using _CSTD uint_fast64_t;  #endif /* defined(_STD_USING) */  /*  * Copyright (c) 1992-2009 by P.J. Plauger.  ALL RIGHTS RESERVED.  * Consult your license regarding permissions and restrictions. V5.20:0009 */  看不懂啊，老师

引用 12 楼 inurlcn 的回复:[quote=引用 11 楼 jha334201553 的回复:] 没听过再正常 不过了，你看include文件夹里面几百个.h，你听过几个？  C库就那几个头文件吧，哪有的几百个？[/quote]标准的当然也就20多个，当时如果真的做开发应用的话还是会加很多系统相关的头呀

引用 11 楼 jha334201553 的回复:没听过再正常 不过了，你看include文件夹里面几百个.h，你听过几个？  C库就那几个头文件吧，哪有的几百个？

没听过再正常 不过了，你看include文件夹里面几百个.h，你听过几个？

微软对 c99 支持拖拖拉拉的, 直到 vc 2010 才开始有个这个标准头文件.

引用 6 楼 inurlcn 的回复:[quote=引用 2 楼 mujiok2003 的回复:] 1.stdint.h引入比较晚(c99) 2.教科书不可能面面俱到。  关于C语言的知识，我现在只看MSDN里面关于RTL的章节， 可惜这个上面也没提到stdint.h[/quote]  http://www.cplusplus.com/reference/cstdint/

up

引用 2 楼 mujiok2003 的回复:1.stdint.h引入比较晚(c99) 2.教科书不可能面面俱到。  关于C语言的知识，我现在只看MSDN里面关于RTL的章节， 可惜这个上面也没提到stdint.h

引用 3 楼 user-7 的回复:没听说很正常！可能是你看到书上没有提到或者涉及到这些！  多看点书！多接触点这方面相关的知识面就好了！  关于C语言的知识，我现在只看MSDN里面关于RTL的章节， 可惜这个上面也没提到stdint.h

我也没听过

1.stdint.h引入比较晚(c99) 2.教科书不可能面面俱到。

up


Question: strlen计算长度	char b[]={'1'},a[]="123";

ret <===>  pop EFLAGS call esp 这里 call 搞错了 应该是： ret <===>  pop EFLAGS jmp esp

引用 13 楼 lm_whales 的回复:X86，32Bits  call fun <===>  push Next_instruction, push EFLAGS jmp fun   ret <===>  pop EFLAGS call esp  函数 cdecl: int fun(int x,int y){return x+y;} <===>     push ebp          // 保存 ebp   mov  ebp,esp      // esp 的值复制到 ebp      mov eax ,x[ebp]  // x 相对esp的偏移量 为_x,复制到eax   add eax,y[ebp]   // x+y 结果存到 eax 。。。返回值在eax    pop ebp           //恢复ebp    ret               //返回，执行  call _fun的下一条指令 ，即执行 add esp 8 fun(a,b) <===>   push b          //参数压栈，左右边的开始压栈。   push a          //最左边的最后压栈                     call _fun       //调用指令     add esp 8       //调整堆栈     大约如此：  你这个我看得懂，谢谢你敲了这么多。我感觉自己就是钻牛角尖了，一直在纠结他那个内存里面的数据，他是四个字节对齐的（这个和系统有关系吗？），四个不够，它会自动补充，但是宽字符不是两个字节吗？

引用 17 楼 lm_whales 的回复:对齐，和CPU，操作系统，编译器都有关系，并且还是可选的，也可以通过预编译指令控制。 CPU 决定不对齐，有没有问题，有什么问题。  操作系统，决定如何处理，CPU的运行和编程模式； 比如Windows 32 Bits， 只有flat 一种模式，除非CPU 对不对齐，产生异常， Windows 并不是很关心对齐的问题；  但是一般还是要求，32 Bits对齐。 而对有些特殊数据，则有一些特殊的对齐要求。  VC编译器 ，有一个对齐选项，可以决定一般数据，如何对齐，缺省是 32Bits，是可选的。 另外 有一条预编译指令，可以确定当前采取那种对齐方式。  VC还定义了一些非标准关键字，用于数据对齐。  其他编译器，应该也有类似的设置，以及对齐指令，或关键字。  恩恩，现在看来自己虽然对一些规则懂点，但是不能把这些东西与编译器环境这些东西联系不起来，还是知识面太窄了，要学的东西还很多，大四了找工作呢，边找边学习吧，谢谢你多次的帮助了

对b调用strlen有点bug喽！strlen测量长度至它遇到的第一个0为止， b是一个单个元素，无0结尾的字符数组

他后边哪些数据是根据什么规则加上去的，除非是象VC debug 一样，否则，根本没加数据，  只是输出时，根据数据内存分配的位置输出，直到找到结束符为止。 串长计算，同样是，一直找到结束符为止。  VC debug版程序会在，数据前后加入一些0xCC 这样的数据，如果这个数据被改变了，说明写操作越界了。    引用 楼主 wangyudong211 的回复:char b[]={'1'},a[]="123"; 	int c=strlen(a),d=strlen(b);  	printf("%d    %d\n",c,d); b={'1'} 反汇编窗口 b的地址里面存的是：0x0012ff44每次都一样的 //串在前   1  2  3 \0  1 0012FF40  31 32 33 00 31 CC CC CC 88  123.1烫虉 0012FF49  FF 12 00 19 13 40 00 01 00  .....@... 输出结果： 3  7 3个字节的对其数据用 0xCC0xCC0xCC 补足 后面的8个字节是函数返回地址，和标志寄存器的备份，用于保存现场，以利于函数返回   88FF1200    ===> 就是0x 0012FF88 ，是函数返回地址，就是函数返回后，执行的第一条指令的地址。 00 19 13 40 ===> 就是0x40131900是调用函数前，标志寄存器的值。函数调用返回后，自动恢复。  b={'1','2'};            1  2  3 \0  1  2 CC CC   0012FF40  31 32 33 00 31 32 CC CC 88  123.12烫. 0012FF49  FF 12 00 19 13 40 00 01 00  .....@... 输出结果： 3  7   b={'1','2','3'}; 0012FF40  31 32 33 00 31 32 33 CC 88  123.123虉 0012FF49  FF 12 00 19 13 40 00 01 00  .....@... 输出结果： 3  7  b={'1','2','3','4'}; 0012FF40  31 32 33 00 31 32 33 34 88  123.1234. 0012FF49  FF 12 00 19 13 40 00 01 00  .....@... 输出结果： 3  7  b={'1','2','3','4','5'}; 0012FF40  31 32 33 34 35 CC CC CC 88  12345烫虉 0012FF49  FF 12 00 19 13 40 00 01 00  .....@... 输出结果： 3  11  后序增加元素的话又是好几个11  以上都是VC6.0下， 这个到底是怎么一回事，不能理解这种现象，希望知道的可以解说下，谢谢了

strlen, wcslen, _mbslen, _mbstrlen Get the length of a string.  size_t strlen( const char *string );  size_t wcslen( const wchar_t *string );  size_t _mbslen( const unsigned char *string );  size_t _mbstrlen( const char *string );  Routine Required Header Compatibility  strlen <string.h> ANSI, Win 95, Win NT  wcslen <string.h> or <wchar.h> ANSI, Win 95, Win NT  _mbslen <mbstring.h> Win 95, Win NT  _mbstrlen <stdlib.h> Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns the number of characters in string, excluding the terminal NULL. No return value is reserved to indicate an error.  Parameter  string  Null-terminated string  Remarks  Each of these functions returns the number of characters in string, not including the terminating null character. wcslen is a wide-character version of strlen; the argument of wcslen is a wide-character string. wcslen and strlen behave identically otherwise.   Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _tcslen strlen strlen wcslen  _tcsclen strlen _mbslen wcslen    _mbslen and _mbstrlen return the number of multibyte characters in a multibyte-character string. _mbslen recognizes multibyte-character sequences according to the multibyte code page currently in use; it does not test for multibyte-character validity. _mbstrlen tests for multibyte-character validity and recognizes multibyte-character sequences according to the LC_CTYPE category setting of the current locale. For more information about the LC_CTYPE category, see setlocale.  Example  /*  STRLEN.C */  #include <string.h> #include <stdio.h> #include <conio.h> #include <dos.h>  void main( void ) {    char buffer[61] = "How long am I?";    int  len;    len = strlen( buffer );    printf( "'%s' is %d characters long\n", buffer, len ); }   Output  'How long am I?' is 14 characters long   String Manipulation Routines |  Locale Routines  See Also   setlocale, strcat, strcmp, strcoll Functions, strcpy, strrchr, _strset, strspn

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

引用 8 楼 lm_whales 的回复:比较好理解的是，函数内部，数组在后，串在前，数据顺序存放的话（有很大可能是顺序的）， 数组地址，可能会比较低。 这样串长可能就是，从数组第一个元素，到串的结束符之间的，字符个数。  数组在前，除非数据反序存放，否则可能没有规律--VC有时会打乱顺序，有些编译器，则无任何顺序可言。   如果数据在函数外部，数组在前，串在后，如果数据顺序存放--可能性非常高，数组地址，可能会比较低。  如果输出字符串，或者求串长。 会从第一个元素开始查找字符。  如果串地址，在数组地址的后面，则输出时，可能会连串一起输出。 求串长，则可能会从数组找到串的结束符为止。 主要是数组b的长度是怎么一回事，他后边哪些数据是根据什么规则加上去的

引用 6 楼 zhaokai115 的回复:b没有\0结束符，strlen会一直往后搜索直到有\0，所以结果依赖于当时内存中的内容。 是这么一回事，但是他是有规律的啊并不是随便找\0的

char b[]={'1','2','3','4','5'},a[]="123"; 	int c=strlen(a),d=strlen(b);  	printf("%d    %d\n",c,d); 	getchar();   VS2012输出结果是：3 19

引用 1 楼 focuslight 的回复:设置的是宽字符这个之前没接触过，看了半天资料还是很迷糊。。。  能针对这个题给我具体解释下不？

多字节字符集和Unicode的区别是什么？

在VC6中，默认使用MBCS编码，即多字节字符集；而VC7、VC8以及VS默认的都是Unicode编码

设置的是宽字符


Question: 插入函数运行不起，求救

/*----------------插入函数------------*/ void Insert(int list[],int n,int m,int elem)  {  int j;  if(m<1||m>n)  {printf("ERROR!\n"); }  else   for(j=n-1;j>=m-1;i--)  //i--是不是应该改成j--呢？ //还有是不是应该改成下面这样呢？ //for(j=n;j>=m;j--) //你自己再仔细看一下吧！  {list[j]=list[j-1];}  list[m-1]=elem;  n=n+1;  printf("The new list are:" );  Print(list,n);  }   //还有就是 /*----------------插入函数------------*/ void Insert(int list[],int n,int m,int elem) /*---------------删除函数-----------*/ void Delete(int list[],int n,int m) 这两个函数的第二个参数int n是不是应该改成int *n呢？ n应该要做为形参返回的吧？要不然你在函数外面怎么知道 list插入或删除后全局变量n的变化呢？ 自己在仔细看一下代码，运行看看结果就知道了！

已经帮你修改过来了！oK了  void Insert(int list[],int n,int m,int elem) {     int j;     if(m<1||m>n)     {            printf("ERROR!\n");      }        else         for(j = n-1; j>=m-1;j--)  // 这里是j --         {                list[j]=list[j-1];         }        list[m-1]=elem;     n= n+1;     printf("The new list are:" );     Print(list,n);  }

引用 3 楼 u012539475 的回复:这个函数就是让我们修改错误，我不晓得还有哪些错误 你用编译器编译下就知道了

这个函数就是让我们修改错误，我不晓得还有哪些错误

你这goto用的 加一个while循环下不就OK了，用那么多goto做什么 目测可以运行，最好附上错误，我就不运行了

感觉你的gato用的太多


Question: C语言内存管理问题

引用 楼主 xey_csu 的回复:多个指针指向同一块内存区，在释放的时候怎么避免被多次释放的错误？ 单进程、线程： free（p); p = NULL; 多进程、线程： 先让别的进程或者线程暂停，然后 free（p); p = NULL;

引用 17 楼 yulitingfeng 的回复:[quote=引用 15 楼 shangyu0801 的回复:] [quote=引用 8 楼 max_min_ 的回复:] 释放后指针置NULL，在释放的时候添加是否为NULL的判断 人家是多指针指向同一堆区 so... 标志一个指针值为空，没有用吧。其它指针值不会变哦。。[/quote] 那就free其中的一个指针，并将所有的指针都置空。下次使用指针时比较NULL就行了。 每次释放时： if(ptr!=null) {    free(ptr);    ptr=null; }  [/quote] 恩，可行。不过，如果说一处释放，其它地方也能得知，到是实际中挺有用的。这样如果能把所有指针都置为空的情况，用一个指针就可以解决。

申请到的内存  就做一条记录，标志地址 和指针 指向该地址的个数， 在释放的时候判断当前的记录中的个数是否为1， 如果不为1就不释放，然后个数减一 当为1的时候就释放，个数减一，删除记录

引用 15 楼 shangyu0801 的回复:[quote=引用 8 楼 max_min_ 的回复:] 释放后指针置NULL，在释放的时候添加是否为NULL的判断 人家是多指针指向同一堆区 so... 标志一个指针值为空，没有用吧。其它指针值不会变哦。。[/quote] 那就free其中的一个指针，并将所有的指针都置空。下次使用指针时比较NULL就行了。 每次释放时： if(ptr!=null) {    free(ptr);    ptr=null; }

用智能指针比较好

置NULL根本不是楼主的意思，也解决不了楼主的问题，比如：  char* a = malloc(100); char* b = a; char* c = a;  free(a); a = NULL; free(b); // 这里会崩溃 free(c); // 同上  因为，a,b,c作为指针，虽然指向同一个东西，但是它们却都是独立的变量。 也就是，把a值为NULL，并不会对b,c有任何影响，它们仍然指向malloc申请的内存。 所以free同一块内存导致崩溃。  解决办法可以用引用计数，以下代码仅供参考：  char* new_char(int* c, int n) { *c = 1; return malloc(n); } char* use_char(int* c, char* p) { ++*c; return p; } void delete_char(int* c, char** p) { if(--*c == 0) { free(*p); } *p = 0; }  int ref = 0; char* a = new_char(&ref, 100); char* b = use_char(&ref, a); char* c = use_char(&ref, a);  delete_char(&ref, &a); delete_char(&ref, &b); delete_char(&ref, &c);

引用 8 楼 max_min_ 的回复:释放后指针置NULL，在释放的时候添加是否为NULL的判断我看到这问题，大脑就想到的这个方法。

引用 楼主 xey_csu 的回复:多个指针指向同一块内存区，在释放的时候怎么避免被多次释放的错误？  实际上，多个指针指向同一内存区，你还可以使用指针的指针

引用 8 楼 max_min_ 的回复:释放后指针置NULL，在释放的时候添加是否为NULL的判断 人家是多指针指向同一堆区 so... 标志一个指针值为空，没有用吧。其它指针值不会变哦。。

free(ptr); ptr=null;  下次使用时： if(ptr==NULL)  下次释放时： if(ptr!=NULL)

包装一下，然后计数，前面的释放不作操作，最后一个释放才真正释放

用基于计数信号量来进行保护吧，一个指针指向时加一，一个指针释放时减一，直至最后一个释放时计数为零然后再释放，这样就避免了

引用 8 楼 max_min_ 的回复:释放后指针置NULL，在释放的时候添加是否为NULL的判断  感觉这个最简单

谢谢各位的解答

还有一个方法，弄个manager类，或者把某个容纳者当成manager用。这些对象的删除由manager负责。

骚年，用引用计数、智能指针吧。详见boost的shared_ptr或者intrusive_ptr。

这种场合我都是使用全局变量，或者使用一个类进行封装

分步调试查看内存的使用情况

引用 8 楼 max_min_ 的回复:释放后指针置NULL，在释放的时候添加是否为NULL的判断 学习了

引用 8 楼 max_min_ 的回复:释放后指针置NULL，在释放的时候添加是否为NULL的判断  ++


Question: 奇怪的问题啊

引用 3 楼 worldy 的回复:#include <stdio.h> #include <termios.h> #include <stdlib.h> #include <unistd.h> struct flaginfo {     int fl_value;     char* fl_name; }; struct flaginfo local_flags[]= {     {ISIG, "Enble signal"},//每个数据单元必须使用大括号     {ICANON, "Cannonical input (erase and kill)"},     {ECHO, "Enable echo"};     {ECHOE, "Echo ERASE as BS-SPACE-BS"},     {ECHOK, "Echo KILL by starting new line"},     {0, NULL} }; .... 原来是这问题，那个分号错误不是主要问题

{ECHO, "Enable echo"};  如果;是你要的内容的话  需要写成  {ECHO, "Enable echo"}\;

呵 呵。。。

这个应该应该蛮简单的，看错误信息就知道了； showtty.c:14:24: error: expected ‘}’ before ‘;’ token 很明显应该是“，”。

另外， {ECHO, "Enable echo"}; 后面应该是,

这个错误很明显啊 4个警告，1个错误 showtty.c:14:24: error: expected ‘}’ before ‘;’ token 表示14行第24字符有错 你回头看看，这里确实不应该是";"号，而应该是","

14行最后的；应该改为，号吧


Question: 一道华三笔试题， 100分求解！给出思路即可，有代码更好！

使用排序插入，二分法查找位置，即插入后保证是按索引值排序的 对插入位置的断开链表，将新节点加人  分别对两个索引量执行相同的操作

写了一个 ，不知道对不对。。。    typedef struct tagData  {  int index1;  int index2;  int iData;  struct tagData *pstNext1;  struct tagData *pstNext2;  }NODE_S;    #include <stdlib.h> #include <stdio.h> #include <string.h> #include "head.h" NODE_S *pHead1,*pHead2; //链表初始化 void init() { 	pHead1=(NODE_S*)malloc(sizeof(NODE_S)); 	memset(pHead1,0,sizeof(NODE_S)); 	pHead1->next1=NULL; 	pHead1->next2=NULL; 	pHead1->index1=0;  	pHead2=(NODE_S*)malloc(sizeof(NODE_S)); 	memset(pHead2,0,sizeof(NODE_S)); 	pHead2->next1=NULL; 	pHead2->next2=NULL; 	pHead2->index2=0; } void destory(NODE_S *Head,int iNum) { 	NODE_S *tHead=Head; 	if (1==iNum) 	{ 		Head=Head->next1; 	} 	else 	{ 		Head=Head->next2; 	} 	while ( Head->next1!=NULL ) 	{ 		free(tHead); 		tHead=Head; 		if (1==iNum ) 		{ 			Head=Head->next1; 		} 		else 		{ 			Head=Head->next2; 		} 	} 	tHead=NULL; } //节点插入 void Add(int index1,int index2,int iData) { 	//排序插入pHead1; 	NODE_S *tHead1,*tHead2,*tNode1,*tNode2; 	int Count=0; 	tHead1=pHead1; 	tHead2=pHead2; 	if (0==tHead1->index1) 	{ 		tHead1->iData=iData; 		tHead1->index1=index1; 		tHead1->index2=index2; 		tHead1->next2=NULL; 		tHead1->next1=NULL; 	} 	else 	{ 		if (tHead1->index1>index1) 		{ 			tNode1=(NODE_S*)malloc(sizeof(NODE_S)); 			tNode1->iData=iData; 			tNode1->index1=index1; 			tNode1->next1=tHead1; 			tNode1->index2=index2; 			tNode1->next2=NULL; 			pHead1=tNode1; 		} 		else 		{ 			while (tHead1->next1!=NULL &&index1>=tHead1->next1->index1 ) 			{ 				tHead1=tHead1->next1; 			} 			tNode1=(NODE_S*)malloc(sizeof(NODE_S)); 			tNode1->iData=iData; 			tNode1->index1=index1;  			tNode1->next1=tHead1->next1; 			tHead1->next1=tNode1; 			tNode1->next2=NULL; 			tNode1->index2=index2; 		} 		 	} 	 	if (0==tHead2->index2) 	{ 		tHead2->iData=iData; 		tHead2->index2=index2; 		tHead2->index1=index1; 		tHead2->next1=NULL; 		tHead2->next2=NULL; 	} 	else 	{ 		if (tHead2->index2>index2) 		{ 			tNode2=(NODE_S*)malloc(sizeof(NODE_S)); 			tNode2->iData=iData; 			tNode2->index2=index2; 			tNode2->next2=tHead2; 			tNode2->index1=index1; 			tNode2->next1=NULL; 			pHead2=tNode2; 		} 		else 		{ 			while ( tHead2->next2!=NULL && index2>=tHead2->next2->index2) 			{ 				tHead2=tHead2->next2; 			} 			tNode2=(NODE_S*)malloc(sizeof(NODE_S)); 			tNode2->iData=iData; 			tNode2->index2=index2;  			tNode2->next2=tHead2->next2; 			tHead2->next2=tNode2; 			tNode2->next1=NULL; 			tNode2->index1=index1; 		} 		 	} } void ShowList(NODE_S* pHead,int iNum) { 	NODE_S *tHead=pHead; 	while (NULL!=tHead) 	{ 		if (1==iNum) 		{ 			//printf(" %d-%d ",tHead->iData,tHead->index1); 			printf(" %d ",tHead->index1); 			tHead=tHead->next1; 		} 		else 		{ 			//printf(" %d-%d ",tHead->iData,tHead->index2); 			printf(" %d ",tHead->index2); 			tHead=tHead->next2; 		}	 	} } void Delete(int index2) { 	NODE_S *tHead1=pHead1->next1,*tHead2=pHead2->next2; 	NODE_S *f_tHead1=pHead1,*f_tHead2=pHead2; 	int count=0; 	if (tHead1->index2==index2) 	{ 		free(pHead1); 		pHead1=tHead1; 	} 	if (tHead2->index2==index2) 	{ 		free(pHead2); 		pHead2=tHead2; 	} 	while (tHead1!=NULL &&tHead1->index2!=index2) 	{ 		f_tHead1=tHead1; 		tHead1=tHead1->next1; 	} 	while (tHead2!=NULL && tHead2->index2!=index2) 	{ 		f_tHead2=tHead2; 		tHead2=tHead2->next2; 	} 	if (tHead1!=NULL) 	{ 		f_tHead1->next1=tHead1->next1; 		free(tHead1); 		count++; 	} 	if (tHead2!=NULL) 	{ 		f_tHead2->next2=tHead2->next2; 		free(tHead2); 		count++; 	} 	if (count==2)//去除重复节点 	{ 		Delete(index2); 	} } int main(int argc,char *argv[]) { 	init(); 	Add(5,5,10); 	Add(2,2,11); 	Add(4,4,12); 	Add(6,9,13); 	Add(3,1,14); 	Add(8,5,15); 	Add(99,8,16); 	Add(6,3,17); 	ShowList(pHead1,1); 	printf("\n\n"); 	ShowList(pHead2,2); 	printf("\n\n"); 	Delete(5); 	ShowList(pHead1,1); 	printf("\n\n"); 	ShowList(pHead2,2); 	destory(pHead1,1); 	destory(pHead2,2); 	return 0; }

看来我的理解能力真差

void add(int index1,int index2,int iData);  这个里面 的 index1和index2 是插入链表的索引哦？


Question: 单链表的插入删除及合并  我这个怎么改

仅供参考//假设带表头结点的单向链表头指针为head，试编写一个算法将值为5的结点插入到连接表的第k个结点前，删除第k个节点，并对该链表进行排序。 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //18->94->58->17->27->20->43->57->75->78-> //18->94->05->58->17->27->20->43->57->75->78-> //18->94->05->58->27->20->43->57->75->78-> //05->18->20->27->43->57->58->75->78->94-> //43->57->58->75->78->94->05->18->20->27-> //


Question: 《C专家编程》里关于总线错误的一个例子

引用 2 楼 derekrose 的回复:当然啦。。 bus error 你用vs2012肯定编译不出来。。 你用gcc试试 gcc 编译也没有错，我在scientificlinux6.2的虚拟机下做了测试。

gcc 编译的u的地址是4对齐的。 vs可能在编译时进行了一些处理。

我在linux上使用gcc 编译，使用gdb调试，发现地址确实是不对齐的，但是运行没有问题。看来在我的电脑上cpu是可以不对齐的。

现代CPU的健壮性大大提高了，哪这么容易出总线错误。

这个和编译器以及CPU体系都有关系. 部分CPU, 一次读取4字节数据, 必须从4字节对齐的地址开始; 而另一些不必须. 对前者, 编译器可以将一条"从非对齐地址读取4字节数据的指令"转换成17条读取单字节数据和移位指令从而在功能上达到相同的效果, 但性能可能下降. 对后者, 这类CPU通常功耗会高一些, 从而约束了在某些场景(如移动手持终端)上的使用.  在新的程序中,直接出现总线错误已经很少了. 但明白这个道理, 在编程时避免这种用法还是有必要的.

试试用gcc 3.3或者更早的版本编译，可能会提示错误。

引用 1 楼 steedhorse 的回复:这个应该是跟体系结构有关，不应该说“一定会出现总线错误”。 有的处理器上会出现总线错误，有的处理器可能性能低一些，有的处理器上则可能完全感觉不到异样。 正解！

如此在意这些细节这是要写编译器的节奏，人才啊！

《C专家编程》有点老，计算机技术日新月异，而且有一些新技术很少看到介绍，有些知识了解一下就好

好奇在啥u上会出事，有的请报上来参考...

引用 5 楼 yulitingfeng 的回复:#include "stdio.h" union {      	char a[10];      	int  i;  }u; int main(int argc, char* argv[]) {  int *p = (int *)u.a[1];  *p = 17;  return 0; } gcc也没提示错误，只是给了个警告：warning: cast to pointer from integer of different size 运行给个段错误。这里是我的错误。int *p = (int *)u.a[1];应该是int *p = (int *)&u.a[1];。gcc并没有给出总线错误提示，也没警告。

#include "stdio.h" union test{      	char a[10];      	int  i;  }; int main(int argc, char* argv[]) {  union test u;  int *p = (int *)u.a[1];  *p = 17;  return 0; } 来，试试我这个。。。


Question: 应该用哪个IHTML接口

能具体说说不

查询特别接口之前先检查IHTMLElement的Tagname属性


Question: c语言程序 合并数据 取反加一 二维数组

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fread,fwrite,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

我用的Mac OS系统，抱歉fopen("/Users/Scottie/Desktop/1.txt", "wb"); 这句没改就回帖了 fopen这句还是改成这样：　     FILE *fp =fopen("D:\\1.txt", "wb");

改成下面这样试试看：  #include<stdio.h>  int i,j,t; int b[8]; int a[24]={     0x1     ,     0x63     ,     0x0     ,     0x2C     ,     0x10     ,     0xAB     ,     0xFF     ,     0xF7     ,     0x0     ,     0x40     ,     0xFF     ,     0xF1     ,     0x1     ,     0x58     ,     0x0     ,     0x37     ,     0x10     ,     0xBF     ,     0xFF     ,     0xF7     ,     0x0     ,     0x40     ,     0xFF     ,     0xF2 };  int main(void) {     FILE *fp =fopen("/Users/Scottie/Desktop/1.txt", "wb");     if (NULL == fp)     {         return 0;     }          for(i=0;i<344;i++)     {         for(j=0;j<12;j++)         {             if(j==0)             {                 b[0] =(a[0]<<8)|a[1];                 if(a[0]==0xff)                 {                     b[0]=~b[0]+1;                 }                 t=b[0];             }                          if(j>1)             {                 b[j-1] =(a[j-1]<<8)|a[j];                                  if((j%2==0)&&(a[j]==0xff))                 {                                          b[j-1]=~b[j-1]+1;                     t=b[j-1];                 }                 else                 {                     t=b[j-1];                 }             }                          fprintf(fp,"%x",t);         }         fprintf(fp,"\n");     }      return 0; }


Question: 教职工管理系统总有一个错！！求改正

而且没有 使用代码高亮 的插件，看上去很蛋疼

要学会 Debug

楼主，你最起码也说说你那里错了，以及错误的地方正确的应该是怎么样的吧？

版主对于这种情况能不能管理一下？


Question: TC中initgraph()函数图形不能初始化怎么办，就指教？

把BGI复制到你输出路径的文件夹中

引用 6 楼 u011873193 的回复:引用 2 楼 zhao4zhong1 的回复:http://www.easyx.cn还是有错显示EasyX is only for C++ 把源程序扩展名改成CPP，void main()改成int main()，最后加一行return 0；

最近我重温了下tc，然后发现最好在dosbox下运行。

换这个？#include <windows.h> LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) {     PAINTSTRUCT ps;     HDC hdc;     HFONT hfont,ohfont;     RECT r;     COLORREF oc;      switch(message) {     case WM_CLOSE://按Alt+F4退出         PostQuitMessage(0);         break;     case WM_PAINT:         BeginPaint(hWnd, &ps);         hdc = ps.hdc; // the device context to draw in         GetClientRect(hWnd, &r); // Obtain the window's client rectangle         hfont = CreateFont(240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");         ohfont=SelectObject(hdc,hfont);         oc=SetTextColor(hdc,0x00C080FF);         SetBkMode(hdc, TRANSPARENT);         TextOut(hdc,r.left+r.right/2-720, r.top+r.bottom/2-120,"最短画图程序",12);         SelectObject(hdc,ohfont);         SetTextColor(hdc,oc);         DeleteObject(hfont);         EndPaint(hWnd, &ps);         break;     default:         return DefWindowProc(hWnd, message, wParam, lParam);     }     return 0; } int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) {     MSG msg             = {0};     WNDCLASS wc         = {0};     HBRUSH hbrh;     hbrh=CreateSolidBrush(0x00000000);     wc.lpfnWndProc      = WndProc;     wc.hInstance        = hInstance;     wc.hbrBackground    = hbrh;     wc.lpszClassName    = "minwindowsapp";     wc.hCursor          = LoadCursor(NULL,IDC_ARROW);     if( FAILED(RegisterClass(&wc)) ) return 1;      if(FAILED(CreateWindow(wc.lpszClassName,                         "Minimal Windows Application",                         WS_POPUP|WS_VISIBLE,                         0,                         0,                         GetSystemMetrics(SM_CXSCREEN),                         GetSystemMetrics(SM_CYSCREEN),                         0,                         0,                         hInstance,                         NULL)))         return 2;      while( GetMessage( &msg, NULL, 0, 0 ) > 0 ) {         DispatchMessage( &msg );     }     DeleteObject(hbrh);     return 0; }

恩，不用了，就是不好用！

不要在TC的图形界面编程花太多时间，淘汰很多年的东西，除非你用DOS。XP下编好的程序需要在dosbox下才能运行。

把 TC\BGI\目录下的所有文件(*.BGI）拷贝到你的源程序保存的目录（也许一个EGAVGA.BGI就可以了） initgraph(&gdriver,&gmode,"");  //""表示当前目录

也试了，不行

是不是你目录里少了个\\呢？比如D:\\TC2.0

我还是不懂啊，能详细解说下吗？我都快纠结死了…… 我在网上找下面办法，改不了啊！！！在C:TC子目录下输入命令:BGIOBJ EGAVGA  　　 此命令将驱动程序EGAVGA.BGI转换成EGAVGA.OBJ的目标文件。  　　 在C:TC子目录下输入命令:TLIB LIBGRAPHICS.LIB+EGAVGA  　　 此命令的意思是将EGAVGA.OBJ的目标模块装到GRAPHICS.LIB库文件中。  　　 在程序中initgraph()函数调用之前加上一句:  　　 registerbgidriver(EGAVGA_driver):


Question: 数据结构学完之后

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……

引用 12 楼 u011779875 的回复:学完数据结构后用汇编语言 一一实现 这样的话 天下的对手 已经寥寥无几 犹如九阳神功  学什么都很快 之后学乾坤大挪移 疯狂扩展知识面 好的，感觉汇编好难啊！

知行合一，学以致用

引用 8 楼 lelieven 的回复:[quote=引用 6 楼 jerry_dqh 的回复:] [quote=引用 5 楼 wangdahu888 的回复:] 无量天尊，在你下山之前，先把那本数据结构给烧掉，那么凭着你记忆，还能把哪些招式，重新再写出来的话，到了山下，可以保证不吃亏。。。。 如果是做Windows桌面应用，那还得学习一下c#,c++等语言[/quote]  学C++开始用那本书比较好？[/quote] c++ primer

引用 6 楼 jerry_dqh 的回复:[quote=引用 5 楼 wangdahu888 的回复:] 无量天尊，在你下山之前，先把那本数据结构给烧掉，那么凭着你记忆，还能把哪些招式，重新再写出来的话，到了山下，可以保证不吃亏。。。。 如果是做Windows桌面应用，那还得学习一下c#,c++等语言[/quote]  学C++开始用那本书比较好？

引用 5 楼 wangdahu888 的回复:无量天尊，在你下山之前，先把那本数据结构给烧掉，那么凭着你记忆，还能把哪些招式，重新再写出来的话，到了山下，可以保证不吃亏。。。。 好的！

引用 5 楼 wangdahu888 的回复:无量天尊，在你下山之前，先把那本数据结构给烧掉，那么凭着你记忆，还能把哪些招式，重新再写出来的话，到了山下，可以保证不吃亏。。。。 如果是做Windows桌面应用，那还得学习一下c#,c++等语言

引用 1 楼 jerry_dqh 的回复:语言只是个工具，你下面想做什么方面的，比如游戏，一般应用，==。想出想做什么，才考虑下面看什么，学习什么。 偏于应用！

引用 2 楼 wangdahu888 的回复:无量天尊，数据结构学完之后，可以下山了，到山脚上找些人来比试下，练练手。。。。 有道理，找个人练练手！

无量天尊，数据结构学完之后，可以下山了，到山脚上找些人来比试下，练练手。。。。


Question: 求教 C语言 问题

仅供参考/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console)程序由 yu_hua 于2007-07-27设计完成 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数∧ 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab=0x9; const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int pcs=15; double fun(double x,char op[],int *iop) {     while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop-1]) {         case  7: x=sin(x);  (*iop)--;break;         case  8: x=cos(x);  (*iop)--;break;         case  9: x=tan(x);  (*iop)--;break;         case 10: x=sqrt(x); (*iop)--;break;         case 11: x=asin(x); (*iop)--;break;         case 12: x=acos(x); (*iop)--;break;         case 13: x=atan(x); (*iop)--;break;         case 14: x=log10(x);(*iop)--;break;         case 15: x=log(x);  (*iop)--;break;         case 16: x=exp(x);  (*iop)--;break;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={ "sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp",NULL};     double ST[10]={0.0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*rexp,*pp,*pf;     int ist=1,iop=1,last,i;     if (!deep) {         pp=pf=expr;         do {             c = *pp++;             if (c!=' '&& c!=Tab)                 *pf++ = c;         } while (c!='\0');     }     pp=expr;     if ((c=*pp)=='-'||c=='+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c=*pp)!='\0') {         if (c=='(') {//左圆括弧             deep++;             ST[ist++]=calc(++pp,addr);             deep--;             ST[ist-1]=fun(ST[ist-1],op,&iop);             pp = *addr;             last = DIGIT;             if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }         else if (c==')') {//右圆括弧             pp++;             break;         } else if (isalpha(c)) {             if (!strnicmp(pp,"Pi",2)) {                 if (last==DIGIT) {                     cout<< "π左侧遇）" <<endl;exit(1);                 }                 ST[ist++]=3.14159265358979323846264338328;                 ST[ist-1]=fun(ST[ist-1],op,&iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp,"Pi",2)) {                     cout<< "两个π相连" <<endl;exit(2);                 }                 if (*pp=='(') {                     cout<< "π右侧遇（" <<endl;exit(3);                 }             } else {                 for (i=0; (pf=fname[i])!=NULL; i++)                     if (!strnicmp(pp,pf,strlen(pf))) break;                 if (pf!=NULL) {                     op[iop++] = 07+i;                     pp += strlen(pf);                 } else {                     cout<< "陌生函数名" <<endl;exit(4);                 }             }         } else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='^') {             char cc;             if (last != DIGIT) {                 cout<< "运算符粘连" <<endl;exit(5);             }             pp++;             if (c=='+'||c=='-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] += ST[ist];break;                     case '-':  ST[ist-1] -= ST[ist];break;                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*'||c=='/') { operate:        cc = op[iop-1];                 if (cc=='+'||cc=='-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 }             } else {                 cc = op[iop-1];                 if (cc=='^') {                     cout<< "乘幂符连用" <<endl;exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 cout<< "两数字粘连" <<endl;exit(7);             }             ST[ist++]=strtod(pp,&rexp);             ST[ist-1]=fun(ST[ist-1],op,&iop);             if (pp == rexp) {                 cout<< "非法字符" <<endl;exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '('||isalpha(*pp)) {                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }     }     *addr=pp;     if (iop>=ist) {         cout<< "表达式有误" <<endl;exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] += ST[ist];break;         case '-':  ST[ist-1] -= ST[ist];break;         case '*':  ST[ist-1] *= ST[ist];break;         case '/':  ST[ist-1] /= ST[ist];break;         case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     if (argc<=1) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>=3) {             pcs=atoi(argv[2]);             if (pcs<0||15<pcs) pcs=15;             printf("%.*lf\n",pcs,calc(s,&endss));         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     return 0; }

引用 4 楼 u012590118 的回复:还是没人来 急 啊。。  自己要学会 Debug

引用 4 楼 u012590118 的回复:还是没人来 急 啊。。  网上google下别人实现的源码，对比下！

还是没人来 急 啊。。

"("直接进  ")"不进  直接判断然后弹出前面的几个运算符的= =  那你能不能稍微在这部分该一点发段码我试试。。

程序没有做括号匹配的进出栈啊。

没高手来答下么


Question: 怎么用C语言实现两个线程在Linux环境下打印1~100

引用 7 楼 dkhghj 的回复:[quote=引用 4 楼 angel_su 的回复:] 整个线程从头到尾几乎锁住，貌似再开线程没啥意思了吧。多线程场景应该是只要任务不重复即可，print耗时不一，先后也不咋要求，那么锁住n一下立即释放，类似：  pthread_mutex_lock(&mutex); int val = n++; pthread_mutex_unlock(&mutex); if (val > N)     break; //your print routine... 完全正确，怎么就没想到临时变量的方法，谢谢！[/quote] 怎么搞的，好像没怎么理解

你的锁根本就没锁住，你想想，线程一获得锁-打印-释放锁；此时如果线程二未获得时间片，还是线程一。那又是线程一获得锁-打印-释放锁。。。直到线程二获得时间片。 由此，应该叫个条件#include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h>  int n = 1; int N = 100; pthread_mutex_t mutex; pthread_mutex_init(&mutex);  int pv=1;//条件 void *func1() {         while(n < N+1)         {                if(pv==1)//              {                 pthread_mutex_lock(&mutex);                 printf("%d 1\n",n);                 n++;                pv=2;//                 pthread_mutex_unlock(&mutex);             }         }         if(n == N+1)                 pthread_exit(NULL); }  void *func2() {         while(n < N+1)         {           if(pv==2)        {                 pthread_mutex_lock(&mutex);                 printf("%d 2\n",n);                 n++;            pv=1;                 pthread_mutex_unlock(&mutex);        }         }         if(n == N+1)                 pthread_exit(NULL); }   int main(int argc, char** argv) {         pthread_t pid1,pid2;          if((pthread_create(&pid1,NULL,func1,NULL)) != 0)                 printf("pthread create error\n");         if((pthread_create(&pid2,NULL,func2,NULL)) != 0)                 printf("pthread create error\n");          pthread_join(pid1,NULL);         pthread_join(pid2,NULL);          return 0; } 你可以看看 线程的条件锁和互斥锁

引用 4 楼 angel_su 的回复:整个线程从头到尾几乎锁住，貌似再开线程没啥意思了吧。多线程场景应该是只要任务不重复即可，print耗时不一，先后也不咋要求，那么锁住n一下立即释放，类似：  pthread_mutex_lock(&mutex); int val = n++; pthread_mutex_unlock(&mutex); if (val > N)     break; //your print routine... 完全正确，怎么就没想到临时变量的方法，谢谢！

引用 5 楼 wangliangffaflgh 的回复: #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <pthread.h>  int n = 1; int N = 100;  pthread_mutex_t mutex;  void *func1() {     while(n<=N)     {         printf("%d 1\n", n);         pthread_mutex_lock(&mutex);         n++;         pthread_mutex_unlock(&mutex);     }          if(n==N)         pthread_exit(NULL);     return NULL; }  void *func2() {     while(n<=N)     {         printf("%d 2\n", n);         pthread_mutex_lock(&mutex);         n++;         pthread_mutex_unlock(&mutex);     }     if(n==N)         pthread_exit(NULL);     return NULL; }  int main(int argc, char** argv) {     pthread_t pid1,pid2;      pthread_mutex_init(&mutex, NULL);          if((pthread_create(&pid1,NULL,func1,NULL)) != 0)         printf("pthread create error\n");     if((pthread_create(&pid2,NULL,func2,NULL)) != 0)         printf("pthread create error\n");          pthread_join(pid1,NULL);     pthread_join(pid2,NULL);          return 0; }   基本上是一个线程在打印，另外结果有误，谢谢你的答复

引用 2 楼 user-5 的回复:可能跟操作系统时间片分配有关吧，可能一下子就执行完了，还没来得及线程切换呢，加个sleep试试加sleep确实可以轮流打印，不过会出现重复的数

第101个数是另外一个线程打印的


Question: 求住，关于结构体的，学生的一些信息，输入量10组 数据，得不到结果，score 和average 都没值，求大神！！

请检查scanf的返回值。

#include <stdio.h> #include <stdlib.h> #include <time.h>  struct card{ 	char *face; 	char *suit; }; typedef struct card Card; void fillDeck(Card *,char *[],char *[]); void shuffle(Card *); void deal(Card *);  int main() { 	Card deck[52]; 	char *face[]={"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; 	char *suit[]={"Hearts","Diamonds","Clubs","Spades"}; 	srand(time(NULL));  	//fillDeck(deck,face,suit); 	//shuffle(deck); 	//deal(deck); 	return 0;  } void fillDeck(Card *wDeck,char *wFace[],char *wSuit[]) { 	int i; 	for(i=0;i<52;i++) 	{ 		wDeck[i].face=wFace[i%13]; 		wDeck[i].suit=wSuit[i/13]; 	}  } void shuffle(Card *wDeck) { 	int i=0,j; 	Card temp; 	while(i<52) 	{ 		i++; 		j=rand()%52; 		temp=wDeck[i]; 		wDeck[i]=wDeck[j]; 		wDeck[j]=temp; 	} }  void deal(Card *wDeck) { 	int i; 	for(i=0;i<52;i++) 	{ 		printf("%5s of %-8s\t\n",wDeck[i].face,wDeck[i].suit); 	} }

注意scanf。。输出参数时，要加 ','严格按照scanf里面的格式串。

please input the data: s  +++++++++++++++++++++++++++++++++++++++++++++ name=,average=0.000000 name=,average=0.000000 name=,average=0.000000 *******************************  +++++++++++++++++++++++++++++++++++++++++++++ name=,average=0.000000 name=,average=0.000000 name=,average=0.000000 你想要这个模式吗？

你得函数写错了吧！ 到底是fb函数，还是fa函数，仔细看看

输入时%s最好放在最后，否则后面的数据都会被认为是字符串

再补充2点 fa函数 是对 学生的3门课程成绩 排序，fb函数 是输出 成绩表


Question: 为什么for循环第一个条件置空就会有错

for (A;B;C) D; //等价于 {  A;  while (1) {   if (!(B)) break;   D;   C;  } }

小引用 10 楼 yyyangyy 的回复:[quote=引用 7 楼 AnYidan 的回复:] [quote=引用 6 楼 AnYidan 的回复:] for循环第一个条件置空也要保证循环起始点是正确的  尤其是再次进入循环时[/quote] i=strlen(a)-1; j=strlen(b)-1; 这2个语句已经在for循环前声明了，也就是跟i=lena-1,j=lenb-1等价了吧。。那起始点应该正确吧？[/quote]   如果前面获取的值没有问题的话 ，，看上去  没有 错

注意进入for循环时i的初始值。

引用 10 楼 yyyangyy 的回复:[quote=引用 7 楼 AnYidan 的回复:] [quote=引用 6 楼 AnYidan 的回复:] for循环第一个条件置空也要保证循环起始点是正确的  尤其是再次进入循环时[/quote] i=strlen(a)-1; j=strlen(b)-1; 这2个语句已经在for循环前声明了，也就是跟i=lena-1,j=lenb-1等价了吧。。那起始点应该正确吧？[/quote]  第二次进入内层循环哪？

可以去掉，但是分号得加，不过可能结果就会有问题了，因为内层用到i和j

引用 7 楼 AnYidan 的回复:[quote=引用 6 楼 AnYidan 的回复:] for循环第一个条件置空也要保证循环起始点是正确的  尤其是再次进入循环时[/quote] i=strlen(a)-1; j=strlen(b)-1; 这2个语句已经在for循环前声明了，也就是跟i=lena-1,j=lenb-1等价了吧。。那起始点应该正确吧？

可以这样写 for(;;) //内容可以没有，但是分号一定要 { }

这是基本的语法规则,记住就行了

引用 6 楼 AnYidan 的回复:for循环第一个条件置空也要保证循环起始点是正确的  尤其是再次进入循环时

for循环第一个条件置空也要保证循环起始点是正确的

可以去掉外层for里面的，内层的不行，因为j的值在第一次循环结束后已经变成-1了

就是可以运行，输入数据后计算有错误

去掉后运算有错误！！！！

去掉也得加个分号的。

要价格分号= =  for（;i>=0;i--） {}


Question: k路归并问题，要求用c语言（急，分好商量）

你给的c++程序修改cin>>n为scanf cout修改为printf； 修改下头文件，其他地方不需要改动。

这里有个是C++版本的，可是我没学过C++，看不懂 #include <iostream> #include<fstream> #include<cstdlib> #define maxn 100010 using namespace std; int n; int a[maxn],b[maxn],c[maxn],a0[maxn],b0[maxn]; int cmp(const void *a,const void *b) {     return *(int *)a-*(int *)b; } void hsort(int l,int r) {      int i=l,j;      while ((i<<1)<r)      {            j=i*2;            if (j<r&&c[j]>c[j+1])j++;            if (c[i]>c[j]) {swap(c[i],c[j]);swap(a[i],a[j]);swap(b[i],b[j]);i=j;}else break;      } } int main() {     int i,j;     cin>>n;     for (i=1;i<=n;i++) cin>>a0[i];     for (i=1;i<=n;i++) cin>>b0[i];     qsort(a0+1,n,sizeof(int),cmp);     qsort(b0+1,n,sizeof(int),cmp);     for (i=1;i<=n;i++)     {         c[i]=a0[i]+b0[1];         a[i]=i;         b[i]=1;     }     for (i=n/2;i>0;i--) hsort(i,n);     for (i=1;i<=n;i++)     {         if (i>1) cout<<" ";         cout<<c[1];         c[1]=a0[a[1]]+b0[++b[1]];         hsort(1,n);     }     return 0; }


Question: in_suspend :1后面这个1是啥意思？

http://en.wikipedia.org/wiki/Bit_field  http://baike.baidu.com/link?url=Fo1JQsVRi6e2RDBYap4mUh3qRWHfcG4mVS4S6nTPX8Gyga4-OGKBho1SRSBfUDn9jEcq8TTFy3QCC76eq4vSc_


Question: 求大神！！图像文本识别的主要步骤都有什么？？？？

请原谅我才疏学浅，你给的公式我没有看过 详细一下你阅读的论文  你找出eigen value的目的是什么？ 如果你要找的是eigen value opencv有提供（cornerEigenValsAndVecs）  我之前接触harris corners的主要是靠eigen values 来判断那是edges,smooth regions或corners 可以参照这两篇  http://qtandopencv.blogspot.com/2013/10/harris-corners-00-principle.html http://qtandopencv.blogspot.com/2013/10/harris-corners-01-implement-by-opencv2.html  第一篇解释harris corners的原理，如何利用sobel求出hessian matrix 以及如何简化eigen values的推导过程 第二篇分析openCV如何实作harris corners  希望这可以帮到你

openCV全面停止开发c的api很久了 最好别继续使用这些已经被deprecated(不建议使用，停止开发)的api 改用c++的api会让你的人生轻松很多 而且新功能也只提供c++的api而已  官方声明 引用Will drop C API support soon. C++ is much better 连接 http://answers.opencv.org/question/17546/opencv-will-drop-c-api-support-soon/  c  double calcGradients(const IplImage *src,                       int aperture_size = 7) {     CvSize sz = cvGetSize(src);          IplImage* img16_x = cvCreateImage(sz, IPL_DEPTH_16S, 1);      IplImage* img16_y = cvCreateImage(sz, IPL_DEPTH_16S, 1);      cvSobel(src, img16_x, 1, 0, aperture_size);     cvSobel(src, img16_y, 0, 1, aperture_size);          IplImage* imgF_x = cvCreateImage(sz, IPL_DEPTH_32F, 1);     IplImage* imgF_y = cvCreateImage(sz, IPL_DEPTH_32F, 1);     cvScale(img16_x, imgF_x);     cvScale(img16_y, imgF_y);          IplImage* magnitude = cvCreateImage(sz, IPL_DEPTH_32F, 1);     cvCartToPolar(imgF_x, imgF_y, magnitude);     double res = cvSum(magnitude).val[0];          cvReleaseImage(&magnitude );     cvReleaseImage(&imgF_x);     cvReleaseImage(&imgF_y);     cvReleaseImage(&img16_x);     cvReleaseImage(&img16_y);          return res; }   c++  double contrast_measure(Mat& img) {     Mat dx, dy;     Sobel(img, dx, 1, 0, 3, CV_32F);     Sobel(img, dy, 0, 1, 3, CV_32F);     magnitude(dx, dy, dx);          return sum(dx)[0]; }   那些还在怂恿你使用c的api的人应该被唾弃  引用unless you are targeting embedded platforms,  there’s no point to using  the old methods (unless you’re a masochist  programmer and you’re asking for trouble). 连接 http://docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html  c的api,big projects，embedded devices会逐渐被c++取代不是没有道理的

这个length是已知的，还有c1和c2在不同角度取不同的值，一共4个方向：0,45,135,180


Question: 不相邻随机数问题

每次生成随机数的时候 判断与前一个数的绝对值是否大于1  大于就加入记录表 不大于就直接丢弃 重新获取随机数

多一次判断条件再取一次随机数就好了！

只有10个用排除法也可以。 或者，每次把选取的数据，相邻的数据抽去，再随机抽取。

to wangliangffaflgh: 先谢谢你的回复， 这个算法能保证一定不相邻吗》

#include <stdio.h> #include <stdlib.h> #include <time.h>  int myrandom() {         srand(time(NULL));         return (rand() % 100) + (rand() % 50); }  int main(void) {         int i;         for(i=1; i<=10; i++)         {                 printf("%d\n", (i *  myrandom()) + (i+ myrandom()));         }         return 0; }


Question: VC6.0好多头文件找不到路径怎么办啊？？？

环境变量啊，你要明白编译器找头文件的方式。

tc，BC3.1，BC4.5 都可以。 MS C++ 7.0 也可以。 MS quick C,C++ 也可以。 再不然 Watcom C也可以。

安装有问题, 重装

是找不到路径还是找不到这个头文件？找不到路径把库文件设置到include那个文件夹下，没有这个头文件就从其他的地方拷贝一下，vc6太老了，有好多不支持的

设置一下项目的头文件路径呗，在属性里面 用vs2012呗，超好用

tc不能用鼠标，还不能输入汉字……忒不习惯！

引用 7 楼 u011873193 的回复:引用 6 楼 user-7 的回复:bios.h在vc下编译不过的还有好多其他的也是这样！  试试tc编译

bios.h在vc下编译不过的

引用 1 楼 wangdahu888 的回复:设置一下项目的头文件路径呗，在属性里面 用vs2012呗，超好用 提示为坏的路径（Cannot open file.坏的路径）

是坏的路径


Question: 一元多项式的小问题

这样子还是outputPoly函数有问题啊。。。 //一元多项式的表示与相加运算  #include<stdio.h> #include<stdlib.h>   typedef struct polyNode { 	float coef;          //系数项        	int exp;            //指数项  	struct polyNode *next; }polyNode, *Poly;  void outputPoly(Poly A) { 	Poly p = A;    while(p->next){      printf("%.1f*x^%d",p->coef,p->exp);      p = p->next;      printf("+");    }    printf("\n"); }  void PolyAdd(Poly A, Poly B) { 	Poly pa = A->next, pb = B->next,rear = A, q; 	while(pa&&pb){ 		if(pa->exp<pb->exp){ 			rear->next = pa; 			rear = pa; 			pa = pa->next; 		} 		else if(pa->exp>pb->exp){ 			rear->next = pb; 			rear = pb; 			pb = pb->next; 		} 		else{ 			pa->coef+=pb->coef; 			if(pa->coef!=0.0){ 				rear->next = pa; 				rear = pa; 				pa = pa->next; 				q = pb; pb = pb->next; free(q); 			} 			else{ 				q=pa; pa=pa->next; free(q); 				q=pb; pb=pb->next; free(q); 			} 		} 	} 	if(pa) rear->next = pa; 	else   rear->next = pb; 	free(B); }  void creatPoly(Poly *q, int n) { 	Poly p,r;                            //p要加入的结点  	int i = 0; 	//printf("请输入%d组项数系数项和指针项（逗号隔开）",n); 	*q = (Poly)malloc(sizeof(polyNode)); 	//(*q)->next = NULL; 	r = *q; 	while(i<n){ 		p = (Poly)malloc(sizeof(polyNode)); 	    printf("输入第%d项的系数和指数(以 , 分隔):",i+1); 		scanf("%d,%d",&p->coef,&p->exp); 		r->next = p; 		r = p; 		i++; 	} 	r->next = NULL; }  void main() { 	int i, j; 	Poly p, q; 	     printf("输入多项式的项数:");     scanf("%d",&i); 	creatPoly(&p, i); 	outputPoly(p); 	printf("输入多项式的项数:");     scanf("%d",&j); 	creatPoly(&q, j); 	outputPoly(q); 	PolyAdd(p, q); 	outputPoly(p); }

我的源代码就是这样子的，还是不行的。。。

void outputPoly(Poly A) {    Poly p = A;    while(p->next){    printf("%.1f*x^%d",(*p)->coef,(*p)->exp);//改为printf("%.1f*x^%d",p->coef,p->exp);    p = p->next;    printf("+");    }    printf("\n"); }

if (p->next) 		{ 			printf("+");   // 这里是下一个不为空时才打印+ 上面错了 		}

typedef struct polyNode { 	float coef;          //系数项        	int exp;            //指数项  	struct polyNode *next; }polyNode;  typedef struct polyNode* Poly;      // 定义结构的指针  void outputPoly(Poly A) { 	Poly p = A; 	while(p->next){ 		printf("%.1f*x^%d",p->next->coef,p->next->exp); // 不能打印p的值 从p的next开始 		p = p->next; 		if (p) 		{ 			printf("+");          // 最后一项不打印+ 		} 	} 	printf("\n"); } void creatPoly(Poly *q, int n) { 	Poly p,r;                            //p要加入的结点  	int i = 0; 	//printf("请输入%d组项数系数项和指针项（逗号隔开）",n); 	*q = (Poly)malloc(sizeof(polyNode)); 	//(*q)->next = NULL; 	r = *q; 	while(i<n){ 		p = (Poly)malloc(sizeof(polyNode)); 		printf("输入第%d项的系数和指数(以 , 分隔):",i+1); 		scanf("%.1f,%d",&p->coef, &p->exp);     // float 用%f 		printf("%.1f,%d\n",p->coef,p->exp);     // float 用%f 		r->next = p; 		r = p; 		i++; 	} 	r->next = NULL; }


Question: 一个jquery选择动态创建元素的问题，急求！！

这个似乎应该发到Java板块，会更有效率点


Question: 求教----关于fgets得到乱码的问题

引用 8 楼 lilin_colin 的回复:[quote=引用 3 楼 JiMoKuangXiangQu 的回复:] 晕，还是错了。 //fflush(fp1); // 如果想同时保持文件1的内容，也许应该再加上这句。 fclose(fp2); fp2 = fopen(filename2, 'r'); 这样的确解决了乱码问题。 我的主要目的是 把文本2的内容复制到文本1中去，用fseek控制它追加在哪个位置！ 借鉴你的方法，会吧文本1的内容覆盖，fflush（fp1）这句没看懂，我试过好像也不行....[/quote] 把fseek调用注释掉，把fflush调用打开。 fflush的作用是把当前缓冲中的内容写到文件1中去。

大神都吃饭了么·········

引用 12 楼 xia597289162 的回复:fseek只是一个文件定位指针，如果你任意添加 ，后面的字符就会被覆盖  那只能从两个文本读出来，然后经过处理后再重新写入文本1吗？  还有其他方法么？T_T

fseek只是一个文件定位指针，如果你任意添加 ，后面的字符就会被覆盖

引用 10 楼 xia597289162 的回复:printf("现在把文本2的内容复制到文本1的内容!\n");          fclose(fp1);     fclose(fp2);      //fseek(fp1,0L,2);       fp1=fopen(filename1,"a+")     fp2=fopen(filename2,"r")     while((ch=fgetc(fp2))!=EOF)     {         fputc(ch,fp1);     } 这样固然可以解决，这种方法我也知道。但是a只能在末尾追加数据。 我想要用fseek()控制它可以在任意位置追加数据！

引用 7 楼 focuslight 的回复:[quote=引用 6 楼 lilin_colin 的回复:] [quote=引用 5 楼 focuslight 的回复:] 一个以追加方式打开， 第二个以读和追加方式打开。  fopen（filename，“a”） fopen（filename，“ra”） 这样固然可以解决，这种方法我也知道。但是a只能在末尾追加数据。 我想要用fseek()控制它可以在任意位置追加数据！ [/quote]读出到buffer，处理后再重新写入文件[/quote]  你的意思是从两个文本读出来，然后经过处理后再重新写入文本1吗？ 那fseek函数到底有啥用呢? 书上写着fseek可以完成随机读写操作，但是我感觉好像没用啊？是不是我用的方法错了...

引用 3 楼 JiMoKuangXiangQu 的回复:晕，还是错了。 //fflush(fp1); // 如果想同时保持文件1的内容，也许应该再加上这句。 fclose(fp2); fp2 = fopen(filename2, 'r'); 这样的确解决了乱码问题。 我的主要目的是 把文本2的内容复制到文本1中去，用fseek控制它追加在哪个位置！ 借鉴你的方法，会吧文本1的内容覆盖，fflush（fp1）这句没看懂，我试过好像也不行....

引用 6 楼 lilin_colin 的回复:[quote=引用 5 楼 focuslight 的回复:] 一个以追加方式打开， 第二个以读和追加方式打开。  fopen（filename，“a”） fopen（filename，“ra”） 这样固然可以解决，这种方法我也知道。但是a只能在末尾追加数据。 我想要用fseek()控制它可以在任意位置追加数据！ [/quote]读出到buffer，处理后再重新写入文件

引用 5 楼 focuslight 的回复:一个以追加方式打开， 第二个以读和追加方式打开。  fopen（filename，“a”） fopen（filename，“ra”） 这样固然可以解决，这种方法我也知道。但是a只能在末尾追加数据。 我想要用fseek()控制它可以在任意位置追加数据！

这样确实解决了乱码问题，但是文件1的内容被覆盖了。 除非我第二次打开的时候用 fp1=fopen（filename，“a+”）;打开 但是这样fseek就没有起作用。

不好意思，写错了，呵呵，应该是： //fflush(fp1); // 如果想同时保持文件1的内容，也许应该再加上这句。 fclose(fp2); fp1 = fopen(filename2, 'r');

原因应该是写入文件1的内容仍然在内存中，而且目前是以写方式打开文件1，所以对它的读取不成功。 可能的解决方式1： 在语句： fseek(fp1,0L,2); 加入： fclose(fp1); fp1 = fopen(filename1, 'r');

fp1本就在末尾写，你要刷的是fp2...  //fseek(fp1,0L,2); rewind(fp2);  或者： fflush(fp2); fseek(fp2, 0, 0);


Question: 为什么getchar()不让我输入字符，而我调试的时候，看到select自动为‘10’了，求大神解答？？

getchar可能取得输入缓冲里的回车空格符号

我添加了getchar(),然后输入1,2,3数字中的一个数字，还是不能进入对应的case ,而是进入default 语句中，这是怎么回事呢？

int main() {     int i=0,a[MAXSIZE+1];     printf("请输入您要排序的数字：");     for(i=1;i<=MAXSIZE;i++)         scanf("%d",&a[i]);//这里按回车会有一个回车符，没有被吸收掉         Choice_Sort(a,MAXSIZE);         for(i=1;i<=MAXSIZE;i++)         printf("%2d",a[i]);     return 0; }     printf("########1、直接插入排序#########\n");     printf("########2、冒泡排序#############\n");     printf("########3、直接选择排序#########\n");     printf("请选择您所需要的排序方式：(按Q(q)退出)");     getchar();//再加一句getchar()吸收回车符     select=getchar();


Question: 如何用C语言读取txt的3列数据，并重新排列？

读入3个数组 ，然后对3个数组排序！

用2楼的方法把数存入double型数组里，之后要插入什么直接sprintf组成字符串就行了

试试 fscanf(fp, "%f %f %f", &a, &b, &c);


Question: 关于c语言中整型的分类：有符号数和无符号数

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

主要是为了让计算机做数学运算的时候 更具有数学意义 说到底都是一些数据 就看你怎么来解释这些数据了 是按有符号的还是按无符号的

1个数比如有8位  那么有符号就是要区分正数和负数,无符号就是不区分 那么要区分总他妈得设个标记对不对,要不然区分个鸡巴毛啊?  于是就牺牲1位来表示符号,1表示负数,0表示正数 去掉这1位之后实际表示数据的不就只有7位了吗  8位能表示到255,7位就能表示到127  所以,无符号的8位能表示0~255 而有符号的8位能表示-128~127  该懂?

大致来讲，计算机用某长度的内存表示整数。如果要分正负，其中一个位就要用来当符号，比不分正负的类型少了一位的空间，正数的最大值只有大约一半。 另外，在左右移位操作的时候，有符号类型有时会有特别的问题。所以在用来操作单个位的时候，最好用无符号类型。 详细自己看书。

同样的字节数，只表示正数肯定比同时表示正数和负数的正数个数多

语法书

数字当然分有符号和无符号。  百度搜 << C语言中的无符号数和有符号数 >>

无符号数可以表达更大的正数值


Question: 有一个关于浮点型数据的问题

引用 3 楼 xinruodingshui 的回复:引用 1 楼 jiandingzhe 的回复:转int好像是直接截取，不是四舍五入吧？是啊 哦，加了0.5，没注意到

引用 2 楼 user-2 的回复:应该是 f=（int）（f*1000+0.5）/1000 吧  google 整数除法好吧   解决了

转int好像是直接截取，不是四舍五入吧？


Question: 有什么简单的方法操作位？

#include <stdio.h>  #define WIRTE_UINT(des ,x ,pos ,len)  (                                   \     (des)                                                                 \     &                                                                     \        ~(                                /* 除要修改的位为0，其余都为1 */ \             (                                                             \                 (1<<(len))-1             /* 长度为len位的1             */ \             )                                                             \             <<(32-(pos)-(len))           /* 左移32-(pos)-(len)位       */ \         )                                                                 \     |                                                                     \         (                                                                 \             (x)                                                           \             <<(32-(pos)-(len))                                            \         )                                                                 \ ) #define READ_UINT(src ,pos ,len)      (                                   \     (                                                                     \         (                                                                 \             (unsigned)(src)                                               \         )                                                                 \         >>(32-(pos)-(len))               /* 逻辑右移32-(pos)-(len)位   */ \     )                                                                     \     &                                                                     \     (                                                                     \         (1<<(len))-1                     /* 长度为len位的1             */ \     )                                                                     \ )  int main()                              //                1111111111222222222233 {                                       //bit   01234567890123456789012345678901     unsigned int des = 0x661;           //      00000000000000000000011001100001     unsigned int r;      des = WIRTE_UINT(des ,3 ,28 ,2);    //      00000000000000000000011001101101     printf("des==0x%08X\n",des);     r = READ_UINT(des ,28 ,2);     printf("r==%d\n",r);     return 0; } //des==0x0000066D //r==3

位逻辑是最好的方法，LZ还要追求什么？  置位：| 00010000 复位：& 11101111 取反：^ 00010000

C语言麻烦点，C++可以用标准库的vector<bool>类型

引用 4 楼 AnYidan 的回复:也可以用mask, 比如你想读第一位  #define MASK_1 (1 << 1)  if (n & MASK != 0)  { 第一位是1}  大姐,楼主说了,读不是问题,写才是问题

引用 7 楼 gz_qmc 的回复:[quote=引用 4 楼 AnYidan 的回复:] 也可以用mask, 比如你想读第一位  #define MASK_1 (1 << 1)  if (n & MASK != 0)  { 第一位是1}  大姐,楼主说了,读不是问题,写才是问题[/quote]  一样可以用 mask,  置位： n |= MASK; 复位： n &= ~MASK;

一般来说，将某一位置为0或者1或者取反，用的是与、或、异或这三种操作。

如果楼主真要另类的访求,我可以说一下 用一下标准库的中bitset吧,像操作数组一样,操作二进制位

定义个数组 int bit[] = {1, 2, 4, 8, 16, 32, 64, .... }; 然后用bit[0~32]去与就好啦

如果你细心,你还可以发现 N1~N8不需要记  因为: N1=~Y1;(按位取反)  所以,第三位置0还可表示为 n&=~Y3

首先你要知道你的数据是多少位的 比如char n=52; 是8位的 00110100   =52;  00000001   =1=0x01; 00000010   =2=0x02; 00000100   =4=0x04; 00001000   =8=0x08; 11111011   =251=0xFB; 那么第四位置为1的表达方式就是 n=n|0x08;优化成n|=0x08; 那么第三位置为0的表达方式就是 n&=0xFB;  如果你不熟悉进制转换 并且你已经懒到连背这几个特殊数据都不愿意的程度了  那么你自己写个.h程序 #define  Y1 0x01 #define  Y2 0x02 ........ #define  N3 0xFB 然后用的时候就简单了 那么第四位置为1的表达方式就是 n|=Y4; 那么第三位置为0的表达方式就是 n&=N3;


Question: 代码中被调用的子函数是什么意思？？？？

Finding prime numbers - Kenneth Haugland Different schemas for finding prime numbers explained with code http://www.codeproject.com/Article.aspx?tag=198374988322054872&

引用 7 楼 u012350586 的回复:j*j<=n;这个判断条件是什么意思啊  改成j<=根号n懂了吗？

引用 7 楼 u012350586 的回复:j*j<=n;这个判断条件是什么意思啊 看n有没有因子

f函数里就是在做是否素数的判断：指在一个大于1的自然数中，除了1和此整数自身外，不能被其他自然数整除的数为素数

引用 4 楼 z1179675084 的回复:又是void main()谭浩强那个书是不对的，你查一下，正确的main函数写法！  谭浩强太老了，早期的编译器那样写法是对的

质数又称素数。指在一个大于1的自然数中，除了1和此整数自身外，不能被其他自然数整除的数。  int f(int n) { if(n==1) return 0;   -----------------  1不是素数 for(int j=2;j*j<=n;j++)   ------------  此循环排除所有非素数 if(n%j==0) return 0;  ----------------  如n=4, 这循环可在 4%2 退出返回0，  return 1;            -----------------  为素数则不会在循环里退出，在这里返回1 }

判断一个数是不是素数啊。

j*j<=n;这个判断条件是什么意思啊

函数名f改成isPrimeNumber


Question: c语言多文件编译

多个文件编译，建议使用make做批处理。否则，当你需要重新编译的时候，反复敲一堆同样的字符，烦不烦躁啊？

g++   -o   outFileName   file1.cpp   file2.cpp

光说不行很模糊，直接贴出错误信息不是比较好吗...

那说说对于我的程序，我该具体怎么编译呢?详细指导下啊

cc相对于编译+链接, 不能直接对2个c文件直接写 , 具体的看看makefile的写法

引用 1 楼 jerry_dqh 的回复:如何编译出一个完整的程序，楼主要重新看一下书了。 书上并没有讲得很清楚

如何编译出一个完整的程序，楼主要重新看一下书了。


Question: 关于C语言读取txt文件数据

用二进制方式打开：fopen（name，“b”）；就方便多了

#include <stdio.h> #include <string.h> #include <conio.h> FILE *fi,*fo; int r; unsigned int n,c; //------------------------------------------------------- void main(int argc,char *argv[]) {     if (argc<3) {         cprintf("Hex2Bin srcfile desfile");         return;     }     if ((fi=fopen(argv[1],"r"))==NULL) {         cprintf("Can not find file %s",argv[1]);         return;     }     if ((fo=fopen(argv[2],"wb"))==NULL) {         fclose(fi);         cprintf("Can not create file %s",argv[2]);         return;     }     n=0;     while (1) {         r=fscanf(fi,"%2x",&c);         if (EOF==r) break;//         if (1==r) {             fputc(c,fo);             n++;         } else {             r=fgetc(fi);             if (EOF==r) break;//         }     }     fcloseall();     cprintf("OK to Hex2Bin %d bytes.",n); }

# cat input  13 12 AA  # hexdump -C output  00000000  13 12 aa                                          |...| 00000003

# include <stdio.h>  int main() {     FILE * input_file = fopen("input", "r");     FILE * output_file = fopen("output", "wb");     int i;     char c;      while (fscanf(input_file, "%x", &i) != EOF)     {         c = i;         fwrite(&c, 1, 1, output_file);     }      fclose(input_file);     fclose(output_file);      return 0; }

引用 17 楼 ForestDB 的回复:就是这个意思。太菜伤不起啊。

就是这个意思。

引用 13 楼 tanqiyingk 的回复:[quote=引用 8 楼 u011729265 的回复:] [quote=引用 7 楼 tanqiyingk 的回复:] 我txt文件里面的数据是这样：  while (1) {         if (1!=fscanf(fp_data,"%x",&v)) break;         fwrite(&v,1,1,fp_txt);	     } 单步跟踪直接就跳出while循环了 当我帮TXT文件中的AA 改成100 这样的数据就是正常的 请懂的指点下，我要把AA这样的十六进制的数据读出来，是哪里的问题呢  如果文件里的数据是16进制保存的，你这样打开看到的数据，就不是这样的。 你这样应该是按字符串保存，读来后转换一下。  [/quote]嗯，应该是你说的这样，我要先把字符转换成我想要的数，然后在把这些数转换我想要的十六进制对吧！[/quote]  是这样的。

引用 11 楼 ForestDB 的回复:理解不够深啊  你读的是0x30 0x31 希望写的是0x0D  有什么不同么？刚学习C，不要见笑哈，我明白你的意思了。我读出来的是1 和3 的ASCII值，而我却要写的是0x13这个数，所以我要进行转换对吧，然后把转换好的数，才能变成我想要的格式

我觉得我并没有误会你的意思 你是想读入"13"，但是写入13 还对？

引用 8 楼 u011729265 的回复:[quote=引用 7 楼 tanqiyingk 的回复:] 我txt文件里面的数据是这样：  while (1) {         if (1!=fscanf(fp_data,"%x",&v)) break;         fwrite(&v,1,1,fp_txt);	     } 单步跟踪直接就跳出while循环了 当我帮TXT文件中的AA 改成100 这样的数据就是正常的 请懂的指点下，我要把AA这样的十六进制的数据读出来，是哪里的问题呢  如果文件里的数据是16进制保存的，你这样打开看到的数据，就不是这样的。 你这样应该是按字符串保存，读来后转换一下。  [/quote]嗯，应该是你说的这样，我要先把字符转换成我想要的数，然后在把这些数转换我想要的十六进制对吧！

引用 11 楼 ForestDB 的回复:理解不够深啊  你读的是0x30 0x31 希望写的是0x0D  有什么不同么？你误会我的意思了，我的13是指0x13这样，并不是指0x0D

理解不够深啊  你读的是0x30 0x31 希望写的是0x0D  有什么不同么？

引用 9 楼 ForestDB 的回复:先弄清楚"13" 和0x0D有什么不同ASCII的值

先弄清楚"13" 和0x0D有什么不同

引用 7 楼 tanqiyingk 的回复:我txt文件里面的数据是这样：  while (1) {         if (1!=fscanf(fp_data,"%x",&v)) break;         fwrite(&v,1,1,fp_txt);	     } 单步跟踪直接就跳出while循环了 当我帮TXT文件中的AA 改成100 这样的数据就是正常的 请懂的指点下，我要把AA这样的十六进制的数据读出来，是哪里的问题呢  如果文件里的数据是16进制保存的，你这样打开看到的数据，就不是这样的。 你这样应该是按字符串保存，读来后转换一下。

引用 5 楼 mujiok2003 的回复:[quote=引用 4 楼 tanqiyingk 的回复:] [quote=引用 2 楼 mujiok2003 的回复:] 代码没有问题吧。  #include <stdio.h>  int main() {   //13 12 AA   char const* p = "13 12 AA";   unsigned int a, b,c;   sscanf(p, "%x%x%x", &a, &b,&c);   printf("%x %x %x\n",a, b, c);   return 0; }这样是没错，但是要问的是怎样讲TXT文件中的16进制的数据读出来，存放到一个指针里面呢[/quote]  sscanf换fscanf就可以了， 没有本质区别。 [/quote]我现在用的就是这样啊  fscanf(fp_data,"%x",&v))

引用 4 楼 tanqiyingk 的回复:[quote=引用 2 楼 mujiok2003 的回复:] 代码没有问题吧。  #include <stdio.h>  int main() {   //13 12 AA   char const* p = "13 12 AA";   unsigned int a, b,c;   sscanf(p, "%x%x%x", &a, &b,&c);   printf("%x %x %x\n",a, b, c);   return 0; }这样是没错，但是要问的是怎样讲TXT文件中的16进制的数据读出来，存放到一个指针里面呢[/quote]  sscanf换fscanf就可以了， 没有本质区别。

引用 2 楼 mujiok2003 的回复:代码没有问题吧。  #include <stdio.h>  int main() {   //13 12 AA   char const* p = "13 12 AA";   unsigned int a, b,c;   sscanf(p, "%x%x%x", &a, &b,&c);   printf("%x %x %x\n",a, b, c);   return 0; }这样是没错，但是要问的是怎样讲TXT文件中的16进制的数据读出来，存放到一个指针里面呢


Question: 请问 timeSetEvent 指定的那个回调函数，这个回调函数的各个参数是什么含义？

UINT uID,        // Timer identifier UINT uMsg,       // Not currently used DWORD_PTR dwUser,// User information DWORD_PTR dw1,   // Windows reserved DWORD_PTR dw2,   // is also reserved

typedef void ( CALLBACK *LPTIMECALLBACK)(   UINT uTimerID,   UINT uMsg,   DWORD_PTR dwUser,   DWORD_PTR dw1,   DWORD_PTR dw2 );

uTimerID The identifier of the timer. The identifier is returned by the timeSetEvent function. uMsg Reserved. dwUser The value that was specified for the dwUser parameter of the timeSetEvent function. dw1 Reserved. dw2 Reserved.

http://msdn.microsoft.com/en-us/library/windows/desktop/dd757634(v=vs.85).aspx http://msdn.microsoft.com/en-us/library/windows/desktop/ff728861(v=vs.85).aspx

坚决消灭领会副.


Question: 求教一道c语言字符串的练习

给你写个 stringLength(）的例子吧，开始容易些 size_t stringLength(const char *str) {     size_t i=0;     if(str==NULL)    //return 0 if pointer is NULL         return i;     while（str[i] != '!') i++;      //search for the ending charactor "!'     i++;                            //To count the ending '!' in the length     return i; }

引用 15 楼 derekrose 的回复:[quote=引用 12 楼 levelwheat 的回复:] [quote=引用 10 楼 derekrose 的回复:] 你是分不清文件之间的关系 还是调用之间的关系 还是题意？ 分不清文件之间的关系，调用我知道，题意我也知道[/quote]  你看到include了吗 知道什么意思吗[/quote] 将string.h头文件中的所有标准函数包含到所写的程序中，这个我知道，但是stringsmain.c是用来做什么的？

引用 25 楼 levelwheat 的回复:[quote=引用 24 楼 derekrose 的回复:] [quote=引用 22 楼 levelwheat 的回复:] [quote=引用 19 楼 derekrose 的回复:] [quote=引用 16 楼 levelwheat 的回复:] [quote=引用 15 楼 derekrose 的回复:] [quote=引用 12 楼 levelwheat 的回复:] [quote=引用 10 楼 derekrose 的回复:] 你是分不清文件之间的关系 还是调用之间的关系 还是题意？ 分不清文件之间的关系，调用我知道，题意我也知道[/quote]  你看到include了吗 知道什么意思吗[/quote] 将string.h头文件中的所有标准函数包含到所写的程序中，这个我知道，但是stringsmain.c是用来做什么的？[/quote]  看来你是不知道main函数是干什么的，他是计算机进入你的程序的入口[/quote] 文件里面main函数给出的是一个字符串数组啊，我其实想问的就是stringsmain.c这个文件跟题目有什么关系？跟我们要写的string.c有什么关系而已，谢谢[/quote]  题目我没看，但是main函数里给出的肯定不只是一个字符串数组，那样说吗也做不了[/quote] 很抱歉打扰你这么长时间，17楼已经把题意说明白了，我知道怎么写了[/quote]  其实你也可以把main写在string.c里面的，给计算机知道什么时候去进入你的code这是很重要的

引用 24 楼 derekrose 的回复:[quote=引用 22 楼 levelwheat 的回复:] [quote=引用 19 楼 derekrose 的回复:] [quote=引用 16 楼 levelwheat 的回复:] [quote=引用 15 楼 derekrose 的回复:] [quote=引用 12 楼 levelwheat 的回复:] [quote=引用 10 楼 derekrose 的回复:] 你是分不清文件之间的关系 还是调用之间的关系 还是题意？ 分不清文件之间的关系，调用我知道，题意我也知道[/quote]  你看到include了吗 知道什么意思吗[/quote] 将string.h头文件中的所有标准函数包含到所写的程序中，这个我知道，但是stringsmain.c是用来做什么的？[/quote]  看来你是不知道main函数是干什么的，他是计算机进入你的程序的入口[/quote] 文件里面main函数给出的是一个字符串数组啊，我其实想问的就是stringsmain.c这个文件跟题目有什么关系？跟我们要写的string.c有什么关系而已，谢谢[/quote]  题目我没看，但是main函数里给出的肯定不只是一个字符串数组，那样说吗也做不了[/quote] 很抱歉打扰你这么长时间，17楼已经把题意说明白了，我知道怎么写了

引用 22 楼 levelwheat 的回复:[quote=引用 19 楼 derekrose 的回复:] [quote=引用 16 楼 levelwheat 的回复:] [quote=引用 15 楼 derekrose 的回复:] [quote=引用 12 楼 levelwheat 的回复:] [quote=引用 10 楼 derekrose 的回复:] 你是分不清文件之间的关系 还是调用之间的关系 还是题意？ 分不清文件之间的关系，调用我知道，题意我也知道[/quote]  你看到include了吗 知道什么意思吗[/quote] 将string.h头文件中的所有标准函数包含到所写的程序中，这个我知道，但是stringsmain.c是用来做什么的？[/quote]  看来你是不知道main函数是干什么的，他是计算机进入你的程序的入口[/quote] 文件里面main函数给出的是一个字符串数组啊，我其实想问的就是stringsmain.c这个文件跟题目有什么关系？跟我们要写的string.c有什么关系而已，谢谢[/quote]  题目我没看，但是main函数里给出的肯定不只是一个字符串数组，那样说吗也做不了

引用 17 楼 u012586257 的回复:简单解释一下，题目要求是让你自己实现一个字符串处理的函数库，库里的函数原型在strings.h头文件里。你主要的任务是写一个strings.c 文件来实际实现这些函数功能（stringCopy(),stringLength() 等等）。那么你写好 strings.c 之后呢，为了测试你的代码，必须有一个main（）函数来调用这些函数，所以你需要 stringMain.c, 这其中包含了C程序的执行入口main(),以及字符串和缓冲区的声明。这样说清楚吗 谢谢你说的很清楚，我知道了，非常感谢

引用 19 楼 derekrose 的回复:[quote=引用 16 楼 levelwheat 的回复:] [quote=引用 15 楼 derekrose 的回复:] [quote=引用 12 楼 levelwheat 的回复:] [quote=引用 10 楼 derekrose 的回复:] 你是分不清文件之间的关系 还是调用之间的关系 还是题意？ 分不清文件之间的关系，调用我知道，题意我也知道[/quote]  你看到include了吗 知道什么意思吗[/quote] 将string.h头文件中的所有标准函数包含到所写的程序中，这个我知道，但是stringsmain.c是用来做什么的？[/quote]  看来你是不知道main函数是干什么的，他是计算机进入你的程序的入口[/quote] 文件里面main函数给出的是一个字符串数组啊，我其实想问的就是stringsmain.c这个文件跟题目有什么关系？跟我们要写的string.c有什么关系而已，谢谢

引用 20 楼 wangdahu888 的回复:求教一道c语言字符串的练习？？？ 那我给你出个题，写个trim吧 跟这道题有关系吗？这道题它在头文件中已经声明了函数，trim函数不能用吧？ 还有我不知道你的语气是怎么回事，暗藏机锋吗？如果觉得我问的太白痴，你可以一笑而过

求教一道c语言字符串的练习？？？ 那我给你出个题，写个trim吧

引用 16 楼 levelwheat 的回复:[quote=引用 15 楼 derekrose 的回复:] [quote=引用 12 楼 levelwheat 的回复:] [quote=引用 10 楼 derekrose 的回复:] 你是分不清文件之间的关系 还是调用之间的关系 还是题意？ 分不清文件之间的关系，调用我知道，题意我也知道[/quote]  你看到include了吗 知道什么意思吗[/quote] 将string.h头文件中的所有标准函数包含到所写的程序中，这个我知道，但是stringsmain.c是用来做什么的？[/quote]  看来你是不知道main函数是干什么的，他是计算机进入你的程序的入口

哎...是太简单了大神不屑去做么

引用 11 楼 z1179675084 的回复:要一步登天啊! 怎么个说法...一步登天？

引用 10 楼 derekrose 的回复:你是分不清文件之间的关系 还是调用之间的关系 还是题意？ 分不清文件之间的关系，调用我知道，题意我也知道

引用 7 楼 derekrose 的回复:知道main函数是干什么用的吗 stringsmain.c里面的main定义了一个string的字符串组

引用 7 楼 derekrose 的回复:知道main函数是干什么用的吗 main是主函数啊，stringsmain.c我怎么看就是题目要求的答案么....难道stringsmain.c是用来调用的？可是题目说了他给的stringsmain.c是用来测试的，还说可以改进它神马的

知道main函数是干什么用的吗

要一步登天啊!

你是分不清文件之间的关系 还是调用之间的关系 还是题意？

引用 12 楼 levelwheat 的回复:[quote=引用 10 楼 derekrose 的回复:] 你是分不清文件之间的关系 还是调用之间的关系 还是题意？ 分不清文件之间的关系，调用我知道，题意我也知道[/quote]  你看到include了吗 知道什么意思吗


Question: 为什么这个程序输出的不是3.15，而是3.14(我用的是codeblocks编译器）

引用 4 楼 Polarislee 的回复:二进制浮点数的精度问题。  简单点说，就是算完了3.145*100+0.5不等于315，而是314.9999999，结果赋值给m之后就变成314了。  楼主按照这个理解就是了。

会对表示2进制的3.15进行4舍5入计算，所以值有变大或变小.

引用 5 楼 jk19941122 的回复:[quote=引用 4 楼 Polarislee 的回复:] 二进制浮点数的精度问题。  简单点说，就是算完了3.145*100+0.5不等于315，而是314.9999999，结果赋值给m之后就变成314了。 那我的vs2012编译器为什么结果还是315呢[/quote]  浮点数寄存器的精度更高，或许vs2012用到了吧

引用 9 楼 buyong 的回复:我也用code::blocks,怎么结果是：3.150000 你是高级黑？  code block只是个IDE，不是编译器，出现楼主的结果是正常的 浮点数的精度问题

还是故意出个错题来看笑话。怎么可能是3.14?

我也用code::blocks,怎么结果是：3.150000 你是高级黑？

把程序改下吧。 #include<stdio.h> int main() {     int m;     float n=3.145;     m=n*100+0.5+0.01,n=m/100.0;     printf("%f",n);     return 0; } 浮点和整型之间最好不要隐形转换，

不要纠结这些，编译器的问题干嘛要去管他

编译器不同的原因把

引用 4 楼 Polarislee 的回复:二进制浮点数的精度问题。  简单点说，就是算完了3.145*100+0.5不等于315，而是314.9999999，结果赋值给m之后就变成314了。 那我的vs2012编译器为什么结果还是315呢

我就是不能理解为什么是这个结果，打印出来为什么是哪个结果，能不能解释一

别和编译器闹了，他最讨厌了还惹他？

打印一下就知道了 printf("%f\n", n*100.0+0.5);


Question: 通讯录管理系统 为什么只能录进去信息 其它功能都用不了

debug啊  这么长的程序啊 我敢打赌一定不是你自己写的吧   要不然 怎么会这么问 写程序是一个一个函数测试 在往下写的 你不会是一气呵成写成的吧

刚开始学都是一个功能一个功能实现的，自己设断点单步调试，看程序运行情况是否能达到自己预期的结果，然后找原因，碰到实在不能解决的问题再问，这种问题csdn上很少有人乐意为你回答的。  要习惯单步调试。

#include "stdio.h" #include "stdlib.h" #include "string.h"  struct yhxx {  	char name[20]; 	char email[20]; 	char tele[20]; 	char address[20]; }yh[1000];  void add()                               /*添加数据*/ { 	int i,j,n=0; FILE *fp;char ch;    do    {   		i=n;      		printf("请输入第%d条数据:姓名,电话,手机\n",n+1); 		scanf("%s%s%s%s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address); 		n++; 		getchar(); 		printf("请继续添加数据(y/n?)"); 		ch=getchar();      } while(ch=='y'||ch=='Y');      	if((fp=fopen("c:\\vc\\a2.txt","a"))==NULL) 	{ 		printf("不能打开文件\n"); 		exit(0);  	} 	 	for(j=0;j<n;j++) 	fprintf(fp,"%15s%15s%15s%15s\n",yh[j].name,yh[j].email,yh[j].tele,yh[j].address);//你知道这里存入的值是多少吗？ 	fclose(fp); }  void chaxing(char nam[])     /*按姓名查询：*/ {     FILE *fp;     int i; 	if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)    {         printf("不能打开文件\n");         exit(0);     }    do    {          fread(&yh[i],sizeof(struct yhxx),1,fp);          if(strcmp(nam,yh[i].name)==0)//i是不是要初始化，这里再i++？你知道你输入的nam和yh[i].name的值是多少吗？分别打印对比下吧，以下几项同理 		{ 			puts(yh[i].name); 			puts(yh[i].email); 			puts(yh[i].tele);  			puts(yh[i].address); 			printf("\n"); 			break;  		}    }while(!feof(fp));                       /*是否到文件夹末尾*/     if(feof(fp)) 		printf("查无此人\n"); }   void chaemail(char nam[])                 /*按email查询*/ {       FILE *fp; 	int i; 	if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     { 		printf("不能打开文件\n");         exit(0);      } 	i=0;  	do 	{ 		fread(&yh[i],sizeof(struct yhxx),1,fp); 		if(strcmp(nam,yh[i].email)==0) 		{    			puts(yh[i].name); 			puts(yh[i].email); 			puts(yh[i].tele);  			puts(yh[i].address); 			printf("\n");break; 		} 	}while(!feof(fp));     if(feof(fp))   		printf("查无此人\n"); }   void chashou(char nam[])      /*按手机号查询*/ {      	FILE *fp;  	int i; 	if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     { 		printf("不能打开文件\n"); 		exit(0);      } 		i=0; 	do     {    		fread(&yh[i],sizeof(struct yhxx),1,fp); 		if(strcmp(nam,yh[i].address)==0) 		{ 			puts(yh[i].name); 			puts(yh[i].email); 			puts(yh[i].tele);  			puts(yh[i].address); 			printf("\n");             break; 		}      }while(!feof(fp));                         /*是否到文件夹末尾*/ 	if(feof(fp))  		printf("查无此人\n"); }   void xxcx()                                            /*信息查询*/ {                     char nam[20];        int sel;      do 	{            printf("----------信息查询----------\n");          printf("----------------------------\n");          printf("1:按姓名查询  \n");          printf("2:按email查询  \n");          printf("3:按手机查询  \n");          printf("0:退出        \n");          printf("  请选择0-3\n"       );          printf("----------------------------\n"); 		 scanf("%d",&sel); 		getchar(); 		switch(sel) 		{              case 1:  				printf("请输入姓名\n"); 				gets(nam);                 chaxing(nam); 				break;              case 2:  				printf("请输入email\n"); 				gets(nam); 				chaemail(nam); 				break;              case 3:  				printf("请输入手机\n"); 				gets(nam);                 chashou(nam); 				break;              case 0:    				exit(0); 			default:   			printf("请输入0-4\n");        		} 	}while(1); }   void edits(char nam[])                             /*信息修改*/ {   	FILE *fp; 	int i=0,n; 	char yhdh[20],yhm[20],eml[20],ad[20];     printf("输入修改后的姓名、email、电话和地址"); 	gets(yhm); 	gets(eml); 	gets(yhdh); 	gets(ad);     if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     {         printf("不能打开文件\n");         exit(0);      } 	while(!feof(fp)) 	{    		fscanf(fp,"%s%s%s%s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address); 		if(strcmp(nam,yh[i].name)==0) 		{   			strcpy(yh[i].name,yhm);strcpy(yh[i].email,eml); strcpy(yh[i].tele,yhdh);strcpy(yh[i].address,ad); 		} 		i++; 	}   	fclose(fp); 	if((fp=fopen("c:\\vc\\a2.txt","w"))==NULL)     {         printf("不能打开文件\n");         exit(0);      } 	for(n=0;n<i-1;n++) 		fprintf(fp,"%15s%15s%15s%15s\n",yh[i].name,yh[i].email,yh[i].tele,yh[i].address); 	fclose(fp); }   void del(char nam[])                              /*删除信息*/ {          FILE *fp;int i=0,n; 	if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     {         printf("不能打开文件\n");         exit(0);      } 	while(! feof(fp)) 	{ 		fscanf(fp,"%s%s%s%s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address); 		if(strcmp(nam,yh[i].name)!=0) i++; 	} 	fclose(fp);     if((fp=fopen("c:\\vc\\a2.txt","w"))==NULL)     {         printf("不能打开文件\n");         exit(0);      } 	for(n=0;n< i-1;n++) 		fprintf(fp,"%15s%15s%15s%15s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address); 	fclose(fp); }  void sort1()                                      /*排序*/ {     	struct yhpx 	{  		char name[20]; 		char email[20]; 		char tele[20]; 		char address[20]; 	}yhp[100];  	FILE *fp;     int i,j,n;     char s[20];     if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL) 	{ 		printf("不能打开文件\n"); 		exit(0);  	} 	while(! feof(fp)) 		fscanf(fp,"%s%s%s%s\n",yhp[i].name,yhp[i].email,yhp[i].tele,yhp[i].address);     fclose(fp); 	n=i; 	for  (i=0;i<n-1;i++)     for(j=0;j<-1-i;j++) 		if(yhp[j].tele<yhp[j+1].tele) 		{            strcpy(s,yhp[j].name);strcpy(yhp[j].name,yhp[j+1].name);strcpy(yhp[j+1].name,s);            strcpy(s,yhp[j].email);strcpy(yhp[j].email,yhp[j+1].email);strcpy(yhp[j+1].email,s);            strcpy(s,yhp[j].tele);strcpy(yhp[j].tele,yhp[j+1].tele);strcpy(yhp[j+1].tele,s); 			strcpy(s,yhp[j].address);strcpy(yhp[j].address,yhp[j+1].address);strcpy(yhp[j+1].address,s); 		} 	if((fp=fopen("c:\\vc\\a2.txt","w"))==NULL) 	{ 		printf("不能打开文件\n"); 		exit(0);  	} 	j=0; 	while(! feof(fp)) 		fprintf(fp,"%15s%15s%15s%15s\n",yhp[j].name,yhp[j].email,yhp[j].tele,yhp[j].address); 		fclose(fp); } void print ()                         /*输出数据*/ {     FILE *fp;     int i=0,n;     if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     {         printf("不能打开文件\n");         exit(0);      } 	while(! feof(fp)) 		fscanf(fp,"%s%s%s%s\n",yh[i].name,yh[i].email,yh[i].tele,yh[i].address); 	fclose(fp); 	n=i; 	for(i=0;i<n;i++) 	{ 		printf("%15s%15s%15s%15s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address); 		printf("\n"); 	} }       int main() {       	int  select,sel; 	char nam[20]; 	do   	{  		printf("==========通讯录管理系统==========\n"); 		printf("==================================\n"); 		printf("       添加数据 请安1\n");  		printf("       电话查询 请安2\n"); 		printf("       数据修改 请安3\n"); 		printf("       数据删除 请安4\n"); 		printf("       数据排序 请安5\n"); 		printf("       数据输出 请安6\n"); 		printf("       退出程序 请安0\n"); 		printf("==================================\n"); 		scanf("%d",&select); 		switch(select) 		{             case 1:  				add(); 				break;             case 2:  				xxcx();  				break;             case 3:  				printf("请输入姓名"); 				getchar();                 gets(nam); 				edits(nam); 				break;             case 4:  				printf("请输入姓名"); 				getchar();                 gets(nam);                 del(nam); 				break; 			case 5:  				sort1; 				break;             case 6:  				print(); 				break;             case 0:  				exit(0); 		}  	}while(1); 	return 0; }

自己调试吧。

我相信这是你自己写的。。。 #include "stdio.h" #include "stdlib.h" #include "string.h"   struct yhxx   {        char name[20];       char email[20];       char tele[20];   char address[20];   }yh[1000]; void add()                               /*添加数据*/ {   int i,j,n=0; FILE *fp;char ch;    do    {  i=n;              printf("请输入第%d条数据:姓名,电话,手机\n",n+1);         scanf("%s%s%s%s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address);          n++;          getchar();          printf("请继续添加数据(y/n?)");          ch=getchar();      }    while(ch=='y'||ch=='Y');          if((fp=fopen("c:\\vc\\a2.txt","a"))==NULL) {         printf("不能打开文件\n");         exit(0);  }        for(j=0;j<n;j++)         fprintf(fp,"%15s%15s%15s%15s\n",yh[j].name,yh[j].email,yh[j].tele,yh[j].address);          fclose(fp); }   void chaxing(char nam[])     /*按姓名查询：*/ {     FILE *fp;     int i;       if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)    {         printf("不能打开文件\n");         exit(0);     }    do    {          fread(&yh[i],sizeof(struct yhxx),1,fp);          if(strcmp(nam,yh[i].name)==0)    {               puts(yh[i].name);               puts(yh[i].email);               puts(yh[i].tele);          puts(yh[i].address);               printf("\n");              break;     }    }while(!feof(fp));                       /*是否到文件夹末尾*/            if(feof(fp))           printf("查无此人\n"); }   void chaemail(char nam[])                 /*按email查询*/ {       FILE *fp;       int i;        if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     {         printf("不能打开文件\n");         exit(0);      }           i=0;   do  {          fread(&yh[i],sizeof(struct yhxx),1,fp);              if(strcmp(nam,yh[i].email)==0)     {              puts(yh[i].name);           puts(yh[i].email);           puts(yh[i].tele);    puts(yh[i].address);           printf("\n");break;     }  } while(!feof(fp));        if(feof(fp))  printf("查无此人\n"); }   void chashou(char nam[])      /*按手机号查询*/ {         FILE *fp; int i;        if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     {         printf("不能打开文件\n");         exit(0);      }        i=0;        do     {   fread(&yh[i],sizeof(struct yhxx),1,fp);            if(strcmp(nam,yh[i].address)==0)      {                puts(yh[i].name);                puts(yh[i].email);                puts(yh[i].tele);         puts(yh[i].address);                printf("\n");                   break;      }      }while(!feof(fp));                         /*是否到文件夹末尾*/       if(feof(fp)) printf("查无此人\n"); }   void xxcx()                                            /*信息查询*/ {                     char nam[20];        int sel;      do   {            printf("----------信息查询----------\n");          printf("----------------------------\n");          printf("1:按姓名查询  \n");          printf("2:按email查询  \n");          printf("3:按手机查询  \n");          printf("0:退出        \n");          printf("  请选择0-3\n"       );          printf("----------------------------\n");             scanf("%d",&sel);             getchar();           switch(sel)     {              case 1: printf("请输入姓名\n");gets(nam);                      chaxing(nam);break;              case 2: printf("请输入email\n");gets(nam);                      chaemail(nam);break;              case 3: printf("请输入手机\n");gets(nam);                      chashou(nam);break;              case 0:   exit(0);     default:  printf("请输入0-4\n");            }   }while(1); }   void edits(char nam[])                             /*信息修改*/ {   FILE *fp; int i=0,n; char yhdh[20],yhm[20],eml[20],ad[20];     printf("输入修改后的姓名、email、电话和地址");      gets(yhm);      gets(eml);      gets(yhdh);  gets(ad);     if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     {         printf("不能打开文件\n");         exit(0);      } while(!feof(fp)) {   fscanf(fp,"%s%s%s%s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address);      if(strcmp(nam,yh[i].name)==0)   {  strcpy(yh[i].name,yhm);strcpy(yh[i].email,eml); strcpy(yh[i].tele,yhdh);strcpy(yh[i].address,ad);   }     i++; }   fclose(fp);    if((fp=fopen("c:\\vc\\a2.txt","w"))==NULL)     {         printf("不能打开文件\n");         exit(0);      }    for(n=0;n<i-1;n++)     fprintf(fp,"%15s%15s%15s%15s\n",yh[i].name,yh[i].email,yh[i].tele,yh[i].address);    fclose(fp); }   void del(char nam[])                              /*删除信息*/ {          FILE *fp;int i=0,n;      if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     {         printf("不能打开文件\n");         exit(0);      }      while(! feof(fp))   {        fscanf(fp,"%s%s%s%s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address);        if(strcmp(nam,yh[i].name)!=0) i++;   }      fclose(fp);     if((fp=fopen("c:\\vc\\a2.txt","w"))==NULL)     {         printf("不能打开文件\n");         exit(0);      }      for(n=0;n< i-1;n++)       fprintf(fp,"%15s%15s%15s%15s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address);       fclose(fp); }  void sort1()                                      /*排序*/ {    struct yhpx   {        char name[20];       char email[20];       char tele[20];   char address[20];   }yhp[100]; FILE *fp;     int i,j,n;     char s[20];      if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)  {         printf("不能打开文件\n");         exit(0);   }  while(! feof(fp))      fscanf(fp,"%s%s%s%s\n",yhp[i].name,yhp[i].email,yhp[i].tele,yhp[i].address);        fclose(fp);    n=i; for  (i=0;i<n-1;i++)     for(j=0;j<-1-i;j++)       if(yhp[j].tele<yhp[j+1].tele)   {            strcpy(s,yhp[j].name);strcpy(yhp[j].name,yhp[j+1].name);strcpy(yhp[j+1].name,s);            strcpy(s,yhp[j].email);strcpy(yhp[j].email,yhp[j+1].email);strcpy(yhp[j+1].email,s);            strcpy(s,yhp[j].tele);strcpy(yhp[j].tele,yhp[j+1].tele);strcpy(yhp[j+1].tele,s);    strcpy(s,yhp[j].address);strcpy(yhp[j].address,yhp[j+1].address);strcpy(yhp[j+1].address,s);   }   if((fp=fopen("c:\\vc\\a2.txt","w"))==NULL)   {         printf("不能打开文件\n");         exit(0);    }   j=0;  while(! feof(fp))      fprintf(fp,"%15s%15s%15s%15s\n",yhp[j].name,yhp[j].email,yhp[j].tele,yhp[j].address);        fclose(fp); } void print ()                         /*输出数据*/ {     FILE *fp;     int i=0,n;     if((fp=fopen("c:\\vc\\a2.txt","r"))==NULL)     {         printf("不能打开文件\n");         exit(0);      } while(! feof(fp))      fscanf(fp,"%s%s%s%s\n",yh[i].name,yh[i].email,yh[i].tele,yh[i].address);        fclose(fp); n=i;      for(i=0;i<n;i++)   {    printf("%15s%15s%15s%15s",yh[i].name,yh[i].email,yh[i].tele,yh[i].address);          printf("\n");   } }          main()   {      int  select,sel;         char nam[20];      do    {                   printf("==========通讯录管理系统==========\n");                 printf("==================================\n");                 printf("       添加数据 请安1\n");                  printf("       电话查询 请安2\n");                 printf("       数据修改 请安3\n");                 printf("       数据删除 请安4\n");                 printf("       数据排序 请安5\n"); printf("       数据输出 请安6\n");                 printf("       退出程序 请安0\n");                 printf("==================================\n");              scanf("%d",&select);        switch(select)    {             case 1: add();break;             case 2: xxcx(); break;             case 3: printf("请输入姓名");getchar();                     gets(nam);edits(nam);break;             case 4: printf("请输入姓名");getchar();                     gets(nam);                     del(nam);break; case 5: sort1;break;             case 6: print();break;             case 0: exit(0);    }   }while(1);   }

代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。


Question: 请教一个多线程问题。

引用 2 楼 max_min_ 的回复:每个线程再额外添加一个标志位吧，当开启线程的时候，标志位为真，当线程结束的时候，标志位为假， 后面通过判断此标志位来确认是否重用此线程ID  ++

引用 2 楼 max_min_ 的回复:每个线程再额外添加一个标志位吧，当开启线程的时候，标志位为真，当线程结束的时候，标志位为假， 后面通过判断此标志位来确认是否重用此线程ID 对呀！我怎么就没想到呢，多谢指导哈。

听着有点threadpool的感觉


Question: xerces xml开源库求赐教啊

LZ没有自己查API么？

< >是特殊字符，都被转义了呀

引用 4 楼 ForestDB 的回复:觉得应该先把buf转成xml元素先，然后才能调用此API。   没有别的办法吗？  因为我现在是有三个层次的关系、 1、组建xml 2、对xml进行数字签名 3、对签名的xml处理 发送之类的  本来我是打算将xml组建放在第二步里面一起做，但是这样业务xml 与签名的就耦合了。我想业务跟签名分开所以直接想传入创建好的xml    但是貌似不行啊！！！       或者怎么把buf  xml转换元素呢 只能一个个增加吗？ 有其他的api吗？

觉得应该先把buf转成xml元素先，然后才能调用此API。

引用 2 楼 KuaiPengFei_ 的回复:[quote=引用 1 楼 wangdahu888 的回复:] < >是特殊字符，都被转义了呀   我就是要问有什么方法不被转义，直接可以加xml进去[/quote] 用<  > 代替< >

引用 1 楼 wangdahu888 的回复:< >是特殊字符，都被转义了呀   我就是要问有什么方法不被转义，直接可以加xml进去