Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 万能的C板块，哥又来了！有大问题，快进！

回复:
user: user-1
content: 引用 16 楼 nadleeh123 的回复:[quote=引用 12 楼 u014497038 的回复:] IOS的文档里面肯定有啊！ 其实我只需要看到有硬件中断仲裁器 就ok了  没心情去翻，被sdk的代码搞烦了[/quote] 你也没说问题是什么？鬼畜的是啥？

user: user-0
content: 引用 12 楼 u014497038 的回复:IOS的文档里面肯定有啊！ 其实我只需要看到有硬件中断仲裁器 就ok了  没心情去翻，被sdk的代码搞烦了

user: user-2
content: 不会耶，帮顶一个

user: user-3
content: http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0440b/Cacgfedh.html

user: user-3
content: 4.13. Generic Interrupt Controller, GIC - ARM Information Center http://infocenter.arm.com/help/topic/com.arm.doc.../Cacgfedh.html 是这个么?

user: user-4
content: 帮顶一下吧，不懂哎

user: user-0
content: 引用 2 楼 osoon 的回复:找不到资源, 你觉得可能吗? 耐心一点.  w3.myexception.cn/software-architecture-design/1593861.html  等的就是这样的高人阿

user: user-5
content: 找不到资源, 你觉得可能吗? 耐心一点.  w3.myexception.cn/software-architecture-design/1593861.html

user: user-6
content: 呵呵，没有接触过，友情帮你顶贴

user: user-7
content: 不懂，友情帮顶 http://www.chinaaet.com/article/182481 http://blog.csdn.net/ajq1987/article/details/8770712 http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0416b/Cacddhga.html http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.ddi0375a/Cegbfjhf.html

user: user-1
content: IOS的文档里面肯定有啊！

user: user-8
content: 鬼畜。。。lz肯定看里番

user: user-9
content: 百度都玩不好？

user: user-10
content: 说的都是些什么

user: user-0
content: 引用 6 楼 truelance 的回复:4.13. Generic Interrupt Controller, GIC - ARM Information Center http://infocenter.arm.com/help/topic/com.arm.doc.../Cacgfedh.html 是这个么?  差不多了
user-0 提问: 请问c语言头文件.h中函数的参数怎嘛申明

回复:
user: user-0
content: @mymtom 如你所说，问题解决！ @lovesmiles   我开始的想法是在.h文件中重新定义一个变量，来解决函数参数没有申明问题，但是我查了下资料，都说在头文件中定义变量会出现占用内存问题。这个变量，应该是只能在被引用文件范围内使用，这算是局部变量？ 关于用extern申明变量，然后再定义使用，这个我待会试试。

user: user-1
content: 引用 6 楼 shenwansan_gz 的回复:@cs290473786，貌似是我想错了  在头文件中定义局部变量，如果有多个文件引用，可能出现的是冗余变量，  你说的局部变量是什么意思？你可以用extern来声明，然后只在一个地方定义这个变量变可以了

user: user-0
content: @cs290473786，貌似是我想错了  在头文件中定义局部变量，如果有多个文件引用，可能出现的是冗余变量，

user: user-2
content: 原因是结构体没有声明就使用呀 #include <pcap/pcap.h> 即可！  #include <sys/types.h> #include <stdio.h>  #ifdef USE_PCAP #include <pcap/pcap.h> #endif  typedef void (*wifi_pcap_callback)(u_char *, const struct pcap_pkthdr *,const u_char *);  int main(int argc, char *argv[]) {     ;      return 0; }   $ gcc -o demo015 demo015.c            demo015.c:8: warning: 'struct pcap_pkthdr' declared inside parameter list demo015.c:8: warning: its scope is only this definition or declaration, which is probably not what you want $ gcc -DUSE_PCAP -o demo015 demo015.c $

user: user-0
content: @user-4 因为其他两个都是基本类型，第二个是自己定义的结构体，这个可以编译过去，但是有waring，现在要解决这个waring

user: user-3
content: 楼主申明和定义概念貌似不是满清晰。申明为局部类型，还是定义局部类型的变量啊。怎么会重定义呢

user: user-4
content: 你想想，三个参数的声明其实都是一样的，编译器为什么不喜欢第二个，而对两外两个都没有意见？

user: user-4
content: 这个好像不是声明变量的问题，我觉得编译器是说找不到struct pcap_pkthdr这个类型。楼主看看struct pcap_pkthdr是在哪里定义的？
user-0 提问: 请问高手关于调用16位的dll的问题？

回复:
user: user-1
content: 32位的.exe不能直接调用16位的.dll，要通过中间DLL做thunk，这样说你能懂了吧。

user: user-2
content: 什么乱七八糟 人家要问的是， 首先如何把16位dll调用起来。  我也想很好奇。

user: user-3
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  请自行将上面的“A语言”替换为“32位APP和32位DLL”，“B语言”替换为“16位APP和16位DLL”

user: user-0
content: 引用 4 楼 DelphiGuy 的回复:win32中确实可以16-bit DLL和32-bit DLL互相调用，ms称之为thunk，你要从32-bit DLL调用16-bit DLL，你首先要写一个脚本.thk文件，里面包括被调用的16-bit DLL中的函数描述（C风格），然后用thunk编译器编译成两个.obj文件，分别连接到32-bit和16-bit DLLs中，每个DLL的入口部分要调用一个特定函数做初始化，具体怎么写我忘记了，你搜索一下msdn。注意，如果是没做过thunk的16-bit DLL，你也没有源码，是调用不了的（至少我印象如此）。请问阁下，我的问题是一个win下调用api 的32位的.exe文件调用16位的.dll文件？，你看懂了吗？至于你说的这些，我会认真研究的，不过没有这方面的实例的话，我做起来好像很迷茫啊！

user: user-0
content: 是这样的，如果编写一个调用win32 api的32位应用程序，调用16位的dll话，好像是有点空难的。请教下高手，我好麻烦啊！

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  请自行将上面的“A语言”替换为“32位APP和32位DLL”，“B语言”替换为“16位APP和16位DLL”你说的这些只是两种编程语言之间数据交换的一种编写方式，也可以用xml这种方式。你跟我说的问题，不是一回事。

user: user-4
content: 噗。。。。。

user: user-1
content: win32中确实可以16-bit DLL和32-bit DLL互相调用，ms称之为thunk，你要从32-bit DLL调用16-bit DLL，你首先要写一个脚本.thk文件，里面包括被调用的16-bit DLL中的函数描述（C风格），然后用thunk编译器编译成两个.obj文件，分别连接到32-bit和16-bit DLLs中，每个DLL的入口部分要调用一个特定函数做初始化，具体怎么写我忘记了，你搜索一下msdn。注意，如果是没做过thunk的16-bit DLL，你也没有源码，是调用不了的（至少我印象如此）。

user: user-5
content: 什么年代了，还有16位的dll ...  我好像在哪里看到过说16位的dll是可以直接在32位的进程空间里用的。但是32位与64位是不能在同一个进程的。
user-0 提问: 字符串问题请教

回复:
user: user-0
content: 找到问题了，乌龙。

user: user-1
content: 因为 Mcu_Mode==1

user: user-0
content: 这是用IAR编译的。  刚刚换成WINTC就正常了。  是不是写法一不够严谨？
user-0 提问: 求助：关于ShellExecuteEx函数调用cmd并输入一条指令的应用

回复:
user: user-1
content: 将要执行的命令放在一个tmp.bat文件中，open这个tmp.bat

user: user-0
content: 还有没有人来帮忙看下  还是没有成功调用   在cmd输入相同的指令是可以执行的

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:if (0 != CallEXE(_T(""), _T("open"),_T("cmd.exe /c cd /d D:\\bios&w32_flashrom0.9.7.exe -p internal -r bios_read.ROM"), _T("D:\\bios"))) 谢谢了  刚试了下  还是没有执行   &连接符是并执行的意思吗？

user: user-0
content: 引用 2 楼 user-2 的回复:看看那个w32_flashrom0.9.7.exe 的工作路径有问题没 路径肯定是对的   没有问题

user: user-1
content: if (0 != CallEXE(_T(""), _T("open"),_T("cmd.exe /c cd /d D:\\bios&w32_flashrom0.9.7.exe -p internal -r bios_read.ROM"), _T("D:\\bios")))

user: user-2
content: 看看那个w32_flashrom0.9.7.exe 的工作路径有问题没

user: user-0
content: 目的是调用cmd  并且输入一条指令执行     看了msdn的关于lpParameters和lpDirectory参数的说明   不是很明白  不知道到底为题在哪    谢谢大家了
user-0 提问: 二进制位运算和大小端题目，达人分析下

回复:
user: user-1
content: The order of allocation of bit-fields within a unit (high-order to low-order or low-order to high-order) is implementation-defined.

user: user-2
content: struct   bit      {        unsigned int   a:3;         unsigned int   b:2;          unsigned int   c:3;    };

user: user-3
content: 引用 3 楼 yejie1111 的回复:[quote=引用 2 楼 user-3 的回复:] aix输出比较奇怪，按说应该是-4，-1，1 aix下，a占高3位，最高位为1，应该是-4，b占中间2位11，应该-1，C占低三位，结果1 x86下相反，应该是1 ， -1 ，-4   赵老师的就没看懂了。。。你说的这个-1 我能理解 是11，，，-4是怎么看的100怎么会解析为-4？[/quote] 最高位符号位，因此是负数，取的补码，还是100，因此是-4，不清楚为什么aix下边这里都不一样

user: user-0
content: 引用 2 楼 user-3 的回复:aix输出比较奇怪，按说应该是-4，-1，1 aix下，a占高3位，最高位为1，应该是-4，b占中间2位11，应该-1，C占低三位，结果1 x86下相反，应该是1 ， -1 ，-4   赵老师的就没看懂了。。。你说的这个-1 我能理解 是11，，，-4是怎么看的100怎么会解析为-4？

user: user-3
content: aix输出比较奇怪，按说应该是-4，-1，1 aix下，a占高3位，最高位为1，应该是-4，b占中间2位11，应该-1，C占低三位，结果1 x86下相反，应该是1 ， -1 ，-4

user: user-2
content: #include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   }; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);     u.bb=0x41;     u.cc=0x21;//dddccccccbbbbbbb     u.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)
user-0 提问: ffmpeg教程的编译问题

回复:
user: user-1
content: 楼主   什么环境变量？ 我也遇到了相同问题

user: user-0
content: 应该不是这个原因，我编译安装成功了，用gcc -o tutorial01 tutorial01.c -lavutil -lavformat -lavcodec -lz -lavutil -lz执行教程的时候找不到头文件，所以您在回答我的问题的时候请慎重

user: user-2
content: ./configure         make         su         输入root用户的密码         make install

user: user-0
content: 在此谢谢的各位，虽然没有让我解决直接问题，但是给了我提示，我的是环境变量没有设好的原因。

user: user-3
content: 不是很了解，关注，学习。

user: user-0
content: libavcodec下面有相应的头文件就是找不到阿，

user: user-4
content: tutorial01.c是ffmpeg提供的一个基于命令行的视频播放器 如果是要使用库的话，编译生成已经成功了，不需理会这个问题。 如果是为了验证代码的话，估计是路径不对

user: user-5
content: 我前段时间刚好用过，不过只是限于命令，你可以先用ffmpeg的命令转码一个视频格式试试，ffmpeg -iout1.mp4 -s 1920*1080 -vcodec mpeg4 video.avi，看看你的av编解码库能不能用。另外库的环境变量你要看一下有没有导入

user: user-6
content: libavcodec 到这目录下看看有木有头文件，路径不对？

user: user-0
content: 这不是忽悠人吗，那么在意积分，随便回帖不会招举报吗，我个人觉得信誉很重要，不懂不会帖就好了
user-0 提问: 定义一个宏，连接字符串用的

回复:
user: user-1
content: #define MADE_WORD(word) TEXT("ABCDEFG") TEXT(#word)

user: user-2
content: 我不知道lz想要什么我写了这个 #include<stdio.h> #define STRING_HEAD "StringHead_" #define TEXT(x) STRING_HEAD#x #define JONNE(x) TEXT(Head_##x)  int main() { 	printf("%s\n",JONNE(aaa)); 	return 0; }

user: user-0
content: 引用 1 楼 user-3 的回复:试试这个 #define MADE_WORD(word)        TEXT("ABCDEFG"#word) MADE_WORD( abc )  就能得到：  TEXT("ABCDEFG""abc");  和楼主的要求不是很一样，不过编译器应该会把这两个字符串合并成一个  谢谢！

user: user-3
content: 再试试这个 #define MADE_TMP(word)         TEXT(#word) #define MADE_WORD(word)        MADE_TMP(ABCDEFG##word)

user: user-3
content: 试试这个 #define MADE_WORD(word)        TEXT("ABCDEFG"#word) MADE_WORD( abc )  就能得到：  TEXT("ABCDEFG""abc");  和楼主的要求不是很一样，不过编译器应该会把这两个字符串合并成一个
user-0 提问: 求助各位大神。。。。。。。。

回复:
user: user-1
content: ……这个，大小写转换函数只要百度一下就可以找到

user: user-0
content: # include <stdio.h> # include <ctype.h>   int main(void) { 	char buffer[20]; 	int i = 0;  	printf("请任意输入20个字符:\n"); 	gets(buffer);  	while(buffer[i] != '\0') 	{ 		buffer[i] = toupper(buffer[i]); 	    i++; 	}  	puts(buffer);  	return 0; }  哈哈，终于搞定了。。加油！！！
user-0 提问: Linux系统下关于环境变量的问题

回复:
user: user-1
content: 环境变量每个进行都有，可能会改变。想一直改变要修改一个文件。

user: user-2
content: getenv()返回的指针指向的地方被strtok改了，strtok 不安全，建议楼主换成strtok_r，如果期望getenv()不被改，需要另外 给strtok_r提供两个buffer来分割，一个是目标buffer存拷贝的env，另外一个buffer给strok_r内部使用

user: user-0
content: 对函数getenv()的调用一直在一个进程中呀

user: user-3
content: 环境变量在每个进程数据中都保存一份。
user-0 提问: 我要排出这个成绩表的名次，但是为什么会这样？

回复:
user: user-0
content: 引用 9 楼 lovesmiles 的回复:你的文件里面有没有名次这个数据，如果有，在输入时应该加上 fscanf(fp,"%s\t%d\t%d\t%d\t%d\t%d\t%d",StudentName[Cur],&StudentScores[Cur][0],&StudentScores[Cur][1], &StudentScores[Cur][2],&StudentScores[Cur][3],&StudentScores[Cur][4],&StudentScores[Cur][5]);  打印时也加上 printf("%s\t%2d\t%2d\t%2d\t%d\t%d\t%d \r\n", StudentName[Cur],StudentScores[Cur][0],StudentScores[Cur][1], StudentScores[Cur][2],StudentScores[Cur][3],StudentScores[Cur][4],StudentScores[Cur][5]); 如果没有就只有这样可以得出正确名次吗？ 这是刚才的第一段表名次好像不行

user: user-1
content: 你的文件里面有没有名次这个数据，如果有，在输入时应该加上 fscanf(fp,"%s\t%d\t%d\t%d\t%d\t%d\t%d",StudentName[Cur],&StudentScores[Cur][0],&StudentScores[Cur][1], &StudentScores[Cur][2],&StudentScores[Cur][3],&StudentScores[Cur][4],&StudentScores[Cur][5]);  打印时也加上 printf("%s\t%2d\t%2d\t%2d\t%d\t%d\t%d \r\n", StudentName[Cur],StudentScores[Cur][0],StudentScores[Cur][1], StudentScores[Cur][2],StudentScores[Cur][3],StudentScores[Cur][4],StudentScores[Cur][5]);

user: user-0
content: 引用 7 楼 lovesmiles 的回复:那就加1，自己改一下都不会？ printf("%s\t%2d\t%2d\t%2d\t%d\t%d\t%d \r\n", StudentName[Cur],StudentScores[Cur][0],StudentScores[Cur][1], StudentScores[Cur][2],StudentScores[Cur][3],StudentScores[Cur][4],Cu+1r); 不是，这两段表是一样的，上面一段是乱序同时把名称打出来；下面一段是把上面的排了名次和分数！！现在是要把下面的表顺序还原，名次也要正确的意思

user: user-1
content: 那就加1，自己改一下都不会？ printf("%s\t%2d\t%2d\t%2d\t%d\t%d\t%d \r\n", StudentName[Cur],StudentScores[Cur][0],StudentScores[Cur][1], StudentScores[Cur][2],StudentScores[Cur][3],StudentScores[Cur][4],Cu+1r);

user: user-0
content: 引用 4 楼 lovesmiles 的回复:printf("%s\t%2d\t%2d\t%2d\t%d\t%d\t%d \r\n", StudentName[Cur],StudentScores[Cur][0],StudentScores[Cur][1], StudentScores[Cur][2],StudentScores[Cur][3],StudentScores[Cur][4],Cur);   打印时少了一个参数 名次变这样也不对

user: user-0
content: 引用 2 楼 slx_391987 的回复:麻烦楼主详细说下遇到的问题。 我觉得排序结果是正确的，没什么问题。 但是名次好像有点问题啊

user: user-1
content: printf("%s\t%2d\t%2d\t%2d\t%d\t%d\t%d \r\n", StudentName[Cur],StudentScores[Cur][0],StudentScores[Cur][1], StudentScores[Cur][2],StudentScores[Cur][3],StudentScores[Cur][4],Cur);   打印时少了一个参数

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

user: user-3
content: 麻烦楼主详细说下遇到的问题。 我觉得排序结果是正确的，没什么问题。

user: user-0
user-0 提问: bios build 报错，希望高手指点，谢谢

回复:
user: user-0
content: @zhao4zhong1 请问你是在帮我翻译错误信息吗？

user: user-0
content: 谢谢。我是有一个从外设读data的函数，主函数会从那取值，我有点混乱，在bios的C程序中，函数调用到底怎么用？是不是在主函数里，还是要去定义一个相似的变量，或者可以直接拿来用？

user: user-1
content: 有一个链接错误，某变量没有被找到，你确实变量定义的文件已经加入编译项里了吗？

user: user-2
content: 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项
user-0 提问: 关于暴力破解XLS文件加密密码

回复:
user: user-1
content: 引用 楼主 u012735433 的回复:excel中有一个功能是加密文件，需输入密码才能进行文件的修改等操作，需要用C语言编程实现破解EXCEL的密码，采用的是暴力解密的思想，有哪位大神能帮忙分析一下 似乎不用暴力破解，改一下文件中的某一处就好了。 xls里面的VBA源码加密就是这样的。 真正文件里面倒是不知道。。。

user: user-2
content: 这要看加密使用的是什么算法了，对于AES或者 3DES之类的著名加密算法的话，只要密钥足够复杂，你就破解不了。 当然，如果密码比较弱，正好在你暴力破解所使用的字典里的话，还是能破解的。

user: user-3
content: 搜搜看，有现成的破解软件。
user-0 提问: SHRD高精度移位如何转换成C语言?

回复:
user: user-1
content: #include <stdio.h> int main () {     int v=0x12345678;     __asm {         mov eax,v         mov eax,0x12345678         rol eax,16         mov v,eax     }     printf("0x%08x\n",v);//0x56781234     return 0; }

user: user-2
content: int main (int argc, char argv[]) { int dest = 0x12345678; int src = 0x13572468; 	__asm { 		pushad 			mov eax,dest 			mov edx,src		 			shrd eax,edx,16 			mov dest,eax 			popad 	} 	printf("%d",dest); }
user-0 提问: 有关大小端问题

回复:
user: user-1
content: 把内存想象成楼房，每层有八间房（一个字节）每四位一个十六进制数 存储顺序是这样的（上面的地址大）： 7  8                            对应的2进制    0111  1000 5  6                                                      0101  0110 3  4                                                      0011  0100 1  2                                                      0001  0010

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 在联合体中，各元素共用同一块内存，这些元素的地址是一样的，都是整个联合体的低地址（联合体的起始位置）。 如果是小端，那么a/b的内存如下： 低地址-------->高地址 78     56     34     12 |<-------a------------>| |<---b--->| 如果是大端，那么a/b的内存如下： 低地址-------->高地址 12     34     56     78 |<-------a------------>| |<---b--->|  所以，可以根据给a赋值后看b的值是多少，就可以看出大小端。

user: user-4
content: 因为short也是小端    int 0x12345678 存储为： 地址：11       12     13     14 存储 ：0x78  0x56 0x34 0x12  short取低2位  11和12 地址：11       12      存储 ：0x78  0x56  这不就是 0x5678的存储吗

user: user-5
content: 在纸上画画内存分布。自己再写个程序调试下。

user: user-6
content: 数据的高/低位 与 内存的高/低地址。 0x12345678 小端下的内存存储模式是 78|56|34|12 , 取低位2个字节变为数据模式为0x5678

user: user-7
content: 规定。。。。

user: user-8
content: 大小端只是电脑记录方式而已，它表达出来的东西还是按正常的思路去想的。  5678存到电脑里面，不管它是大端还是小端，你叫电脑输出给我们看时，它永远是输出5678。它内部怎么表示没影响。
user-0 提问: 关于链表的问题，问题很简单，只是我搞不掂，所以来送分啦！

回复:
user: user-1
content: 你的head不是一个指针，而是一个变量，看清楚没有？不存在野指针的问题，因为你声明它时都没有加上*号，它是一个变量

user: user-1
content: 引用 6 楼 zhaozhaohelu 的回复:[quote=引用 4 楼 lovesmiles 的回复:] CreatNodeList  That is not Right, you can remove it.是因为我NODE head={0};了之后就没必要再开空间给他的缘故么？可是我不给他赋值的话又在担心野指针。[/quote] 你这个操作已经是给它赋值了。让它的num和next的值都为0了。你的ctreat函数完全不起作用。因为参数只能改变指针指的值，不能改变指针本身。 这个函数运行结束后反而引起了内存泄漏。head还是指向了原来的{0}。 好好思考一下你的代码吧。

user: user-0
content: 引用 4 楼 lovesmiles 的回复:CreatNodeList  That is not Right, you can remove it.是因为我NODE head={0};了之后就没必要再开空间给他的缘故么？可是我不给他赋值的话又在担心野指针。

user: user-0
content: 引用 2 楼 Evankaka 的回复:/创建链表的数据结构 typedef struct NODE { int num; NODE * pNext; }; //生成表头 void CreatNodeList(NODE * head) { if (NULL != head) return; head = (NODE *)malloc(sizeof(NODE)); head->pNext = NULL; }  //插入节点 void InsertNodeList(NODE * head) { NODE * InserNode = (NODE *)malloc(sizeof(NODE)); if (InserNode == NULL) { return ; } InserNode->num = rand()%11; InserNode->pNext = head->pNext; head->pNext = InserNode;  } //显示节点信息 void ShowNodeList(NODE * head) { while (head->pNext != NULL) { head = head->pNext;////你的头节点NUM没赋值，为0,所以你每次都会输出0.,把这句提前就可以了 cout<<head->num<<" ";  } cout<<endl; } int main() { srand(time(0)); NODE head={0}; CreatNodeList(&head); for (int i=0;i<10;i++) { InsertNodeList(&head); } ShowNodeList(&head); return 0; }我这应该算是找到了问题，找不到方法吧，呵呵。

user: user-1
content: CreatNodeList  That is not Right, you can remove it.

user: user-0
content: 引用 1 楼 orangeholic 的回复:head节点被打印出来了   而且还漏掉一个节点  用下面这个  //显示节点信息 void ShowNodeList(NODE * head) { 	head=head->pNext; 	while (head) 	{ 		cout<<head->num<<" "; 		head = head->pNext; 	} 	cout<<endl; }NICE。

user: user-2
content: /创建链表的数据结构 typedef struct NODE { int num; NODE * pNext; }; //生成表头 void CreatNodeList(NODE * head) { if (NULL != head) return; head = (NODE *)malloc(sizeof(NODE)); head->pNext = NULL; }  //插入节点 void InsertNodeList(NODE * head) { NODE * InserNode = (NODE *)malloc(sizeof(NODE)); if (InserNode == NULL) { return ; } InserNode->num = rand()%11; InserNode->pNext = head->pNext; head->pNext = InserNode;  } //显示节点信息 void ShowNodeList(NODE * head) { while (head->pNext != NULL) { head = head->pNext;////你的头节点NUM没赋值，为0,所以你每次都会输出0.,把这句提前就可以了 cout<<head->num<<" ";  } cout<<endl; } int main() { srand(time(0)); NODE head={0}; CreatNodeList(&head); for (int i=0;i<10;i++) { InsertNodeList(&head); } ShowNodeList(&head); return 0; }

user: user-3
content: head节点被打印出来了   而且还漏掉一个节点  用下面这个  //显示节点信息 void ShowNodeList(NODE * head) { 	head=head->pNext; 	while (head) 	{ 		cout<<head->num<<" "; 		head = head->pNext; 	} 	cout<<endl; }
user-0 提问: C语言操作数据库文件

回复:
user: user-0
content: 引用 2 楼 lovesmiles 的回复:XLS文件转为.DBF文件之后，格式根本就不是数据库的格式  这一步你是怎么做的？你确定转换了？ 可能当时是不太了解数据库文件格式，不好意思，现已成功转换。格式应该是正确的，不过还没有实际去读取。希望能告知C语言读写access数据库方法？谢谢！

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:建议楼主学习ADO和SQL Server 你好！我想使用access数据库，如果使用C语言操作ACCESS数据库的话，具体需要向哪方面了解？

user: user-1
content: 建议楼主学习ADO和SQL Server

user: user-2
content: 使用COM读写.xls文件， 使用visual fox的ODBC/ADO/Ado.net等来操作.dbf文件  不要企图理解xls.dbf格式。

user: user-3
content: 我不想开帖，求ODBC API封装的数据库类，最近工作要用这个东西。百度的东西我都看过了，不要COPY啊。

user: user-4
content: 是否可以使用EPPLUS插件来操作 xls,

user: user-5
content: XLS文件转为.DBF文件之后，格式根本就不是数据库的格式  这一步你是怎么做的？你确定转换了？
user-0 提问: 函数指针疑问

回复:
user: user-1
content: 不要纠结是书上的哪些，写代码时，函数直接调用，或者是使用指向函数的指针直接调用就行，加不加*都一样，记住这一点即可。      最后，结贴吧！

user: user-2
content: 不太明白你意思。按照猜测，你可能是觉得1.书本上讲会对指针进行解引用（编译器去做），2. 帖子上讲不需要解引用，编译器需要的是指针。1和2矛盾 是这样的吗？  没看出来前后矛盾啊。 编译器拿函数指针去做解引用的工作，你需要做的只是使用函数指针直接调用就可以了。 这不是很合情合理吗？

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式...的值【比如printf("%p\n",...);或者cout<<...】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=(void *)(...);】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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

user: user-4
content: 把下面代码跑一遍你就明白了： #include <iostream>  void func()  { 	 printf("func\n");  } int main() { 	func();    (*func)();    (**func)();    (***func)();    getchar();     return 0; }  在vc2008测试通过。对函数指针做* 操作,做100 次也没有意义，完全没有意义.....

user: user-5
content: 不明白你想要解释什么啊 你的前后表述没有矛盾啊  函数指针， 可以跟别的指针一样 取地址或者解引用 但是也可以不需要，  因为函数不同于别的变量， 他本身就可以是一个地址
user-0 提问: 函数形参定义和初始化是否是在第一次被调用时进行的？

回复:
user: user-1
content: 围观。。。。

user: user-2
content: 函数参数。 在函数调用时，初始化（这就是参数传递） 函数调用结束的时候，参数结束生命周期。  函数执行过程大概如下  函数每次调用，先对参数初始化（完成参数传递）， 然后（把下一条指令的地址存入堆栈，这个地址就是函数的返回地址），跳入函数内部执行， 执行完毕，函数返回调用处，  ret 指令 通过堆栈中保存的函数返回地址， 跳回调用函数的地方， 继续执行---执行地址被保存到的那条指令。  此时函数参数，结束历史使命，他的生命周期，也就结束了。 函数 int fun(int a,int b,int c，int d);  fun(x,y,z,w) 【 push w push z push y push x   call  fun           //== push nextcode                            //       jump fun nextcode: sub esp, 8        】  fun  【  ret // <===> jump esp 【nextcode_addr】 <===>jum nextcode 】  C 调用约定 : 调用者清栈， 清栈语句是 sub  esp,n;  返回语句是 ret ;  标准调用约定:  被调函数清栈， 清栈和返回语句是 ret  n;

user: user-3
content: 看下反汇编就知道了，就是一个push

user: user-4
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的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对应的汇编并单步执行观察相应内存和寄存器变化。）  指针即地址 引用即别名

user: user-5
content: 同意楼上的回答

user: user-6
content: 应该说是“每次”调用的时候吧。 函数的参数，只在这个函数运行的时候有效，函数返回之后就失效了，每次进入这个函数都要从头再来一遍。 int a = 9; test( a);   /*   函数是在这时被调用的，才给b赋值 */ int c = 90; test( c);   /*   再次给b赋值 */
user-0 提问: 定义的位数   在结构体中  unit32_t a:5  这样a是32位还是5位？

回复:
user: user-0
content: 引用 5 楼 slx_391987 的回复:回答4楼问题：  假如再来一个unsigned int ee， 是隔16位再算32位。 因为是32位，4字节对齐，int(unsigned int) 的开始地址是4字节的倍数。  再请教一下。如果我定义成 short ee； 如果short是16位。 他会占用32位剩下的16位，还是为了字节对齐重新在一个32位中使用16位？  我的理解应该是后者。 因为字节对齐对系统操作比较简单一些。

user: user-1
content: 回答4楼问题：  假如再来一个unsigned int ee， 是隔16位再算32位。 因为是32位，4字节对齐，int(unsigned int) 的开始地址是4字节的倍数。

user: user-0
content: 假设int是32位。 假如再来一个unsigned int ee; 这个ee会接着dd 再算32位吗，还是隔16位再算32位。 （之所以说隔16位是因为bb cc dd加起来是16位，如果为了int对齐的话，就要再隔16位）  引用 3 楼 zhao4zhong1 的回复:#include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   }; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);     u.bb=0x41;     u.cc=0x21;//dddccccccbbbbbbb     u.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

user: user-1
content: short 会占用32位剩下的16位.

user: user-2
content: #include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   }; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);     u.bb=0x41;     u.cc=0x21;//dddccccccbbbbbbb     u.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

user: user-3
content: 二楼正解，我就不多说了

user: user-4
content: 1 a是5位， 但是内存分配了32位， 他后面的类似变量可以 使用32位中的后续内存  2 根据成员的定义顺序 从一个int的低位开始使用  3 节省内存， 比如你有 32个开关， 只需要一个int，不需要32个int  4 非结构体 应该不能用吧 关键是 用了也没意义啊， 不能达到多个变量共用一个 int内存的 目的
user-0 提问: 《计算机组成原理》----对内存对齐的理解

回复:
user: user-0
content: 引用 2 楼 truelance 的回复:LZ你的问题是什么?求帮忙找错

user: user-0
content: 引用 2 楼 truelance 的回复:LZ你的问题是什么?求帮忙找错

user: user-0
content: 引用 2 楼 truelance 的回复:LZ你的问题是什么?求帮忙找错

user: user-0
content: 引用 7 楼 misskissC 的回复:[quote=引用 6 楼 truelance 的回复:] 4个这样的存储器，要么4位地址线32位数据线，要么16位地址线8位数据线。没法支持16位地址线32位数据线。  是的。4 x (2^4  x 8 )  !=  2^16 x 32[/quote] 将其M改为4地址线32位数据线。

user: user-0
content: 引用 6 楼 truelance 的回复:4个这样的存储器，要么4位地址线32位数据线，要么16位地址线8位数据线。没法支持16位地址线32位数据线。  是的。4 x (2^4  x 8 )  !=  2^16 x 32

user: user-1
content: 4个这样的存储器，要么4位地址线32位数据线，要么16位地址线8位数据线。没法支持16位地址线32位数据线。

user: user-0
content: 引用 9 楼 lovesmiles 的回复:[quote=引用 6 楼 truelance 的回复:] 4个这样的存储器，要么4位地址线32位数据线，要么16位地址线8位数据线。没法支持16位地址线32位数据线。  应该也没有到16位地址线，4片内存块只需要加2条线就可以确那片被选中了。 所以应该是6条位地址线就可以确定8位的数据。   如果是要一次读出32位的数据，地址线不用增加，片选中默认打开，只要4条就可以了。   观察存储器M的结构（第一行地址为0），只要将变量的地址分配到此变量所占内存大小（以字节为单位）的整数倍上  这句也有点问题，应该是分配到以字为单位(32bit)的地址上才合理。  [/quote] 1. 应该也没有到16位地址线，4片内存块只需要加2条线就可以确那片被选中了。 所以应该是6条位地址线就可以确定8位，16位，32位的数据。  2. 观察存储器M的结构（第一行地址为0），只要将变量的地址分配到此变量所占内存大小（以字节为单位）的整数倍上  这句也有点问题，应该是分配到以字为单位(32bit)的地址上才合理。  如占16位的变量只需要分配到以半字（16位）的地址上即可。

user: user-2
content: 引用 6 楼 truelance 的回复:4个这样的存储器，要么4位地址线32位数据线，要么16位地址线8位数据线。没法支持16位地址线32位数据线。  应该也没有到16位地址线，4片内存块只需要加2条线就可以确那片被选中了。 所以应该是6条位地址线就可以确定8位的数据。   如果是要一次读出32位的数据，地址线不用增加，片选中默认打开，只要4条就可以了。   观察存储器M的结构（第一行地址为0），只要将变量的地址分配到此变量所占内存大小（以字节为单位）的整数倍上  这句也有点问题，应该是分配到以字为单位(32bit)的地址上才合理。

user: user-1
content: LZ你的问题是什么?

user: user-3
content: 从物理结构上理解对齐。
user-0 提问: 思维程序化了，肿么办？

回复:
user: user-1
content: 人类一思考，上帝就发笑。

user: user-2
content: 多看书，多向大家请教，多跟身边人交流，跨领域交流！

user: user-3
content: 引用 2 楼 lovesmiles 的回复:后来，写多了，看多了别人的代码，  我不太认同你的这些说话，记得有句话说的，“如果你觉得自己是因为看的书太多而变得肤浅，那是因为你看的书还不够多。”   王国维说到的为学的三种境界是:  1.昨夜西风凋碧树,独上高楼,望尽天涯路  2.衣带渐宽终不悔,为伊人消得人憔悴  3.众里寻她千百度,莫然回首,那人却在灯火阑珊处.   一个人如果真正到了独上高楼，望尽天下路（掌握自己领域内的所有知识）的境界时，应该是很孤独的感觉的。  别浮燥，多看点书，再深入一点，你就会得到莫大的快乐。

user: user-4
content: 后来，写多了，看多了别人的代码，  我不太认同你的这些说话，记得有句话说的，“如果你觉得自己是因为看的书太多而变得肤浅，那是因为你看的书还不够多。”   王国维说到的为学的三种境界是:  1.昨夜西风凋碧树,独上高楼,望尽天涯路  2.衣带渐宽终不悔,为伊人消得人憔悴  3.众里寻她千百度,莫然回首,那人却在灯火阑珊处.   一个人如果真正到了独上高楼，望尽天下路（掌握自己领域内的所有知识）的境界时，应该是很孤独的感觉的。  别浮燥，多看点书，再深入一点，你就会得到莫大的快乐。

user: user-5
content: 我觉得交个女朋友，可以解决这个问题。
user-0 提问: 有关共用体的内容，通过一个程序来确定长变量的存储顺序

回复:
user: user-1
content: 2. char类型是有符号的8位，0x88是负数，符号位为1，按%p输出是扩展为32位，按符号位扩展，前面全都填充符号位 5. 现在的主流编译器，int都是4个字节了。

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

user: user-0
content: 引用 5 楼 hustcyb 的回复:大哥，%p是用来输入指针地址的，你后面三个输出相当于将联合体的内容转成指针了，对目前大多数机器（32位机）而言，指定是占四个字节的  基础太差了，感谢指教

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:#include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct S {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   } s; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.s.bb,u.s.cc,u.s.dd);     u.s.bb=0x41;     u.s.cc=0x21;//dddccccccbbbbbbb     u.s.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)   姜是老的辣！受教了！感谢赵老师的参考代码

user: user-0
content: 引用 3 楼 user-4 的回复:关于第3，4点，你可以搜下什么是大端（big-endian）/小端(little-endian), 这个取决于你的机器  嗯，仔细看过存储顺序的有关资料，我的机器是intel i3，所以是小端存储，也就是低位字节存入低地址，其实我是不确定我这个程序是否能满足题目的要求，有些不明白这个题目到底想表达什么

user: user-3
content: 大哥，%p是用来输入指针地址的，你后面三个输出相当于将联合体的内容转成指针了，对目前大多数机器（32位机）而言，指定是占四个字节的

user: user-2
content: #include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct S {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   } s; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.s.bb,u.s.cc,u.s.dd);     u.s.bb=0x41;     u.s.cc=0x21;//dddccccccbbbbbbb     u.s.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

user: user-4
content: 关于第3，4点，你可以搜下什么是大端（big-endian）/小端(little-endian), 这个取决于你的机器
user-0 提问: 我做的是ArcGis的shape文件导入到MDB库,出现Access文件共享锁数溢出的情况

回复:
user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:先导出到纯文本.csv文件，再从.csv文件导出到.mdb   谢谢谢你的帮助，问题已经解决，修改注册表即可。。。。。。

user: user-1
content: 先导出到纯文本.csv文件，再从.csv文件导出到.mdb
user-0 提问: 大一新手求教c语言

回复:
user: user-1
content: 引用 5 楼 ws_54321 的回复:我试过改float 和double,不过输入输出都用的%f。用double输100得-17.000，用float输什么都是0.000 用float和%f应该也是可以的。 如果要求输入和输出都是整数，那么3楼和4楼的方法比较好，建议楼主也试试。

user: user-0
content: 引用 2 楼 brookmill 的回复:类型改了之后,scanf和printf的格式也都要改： int -- %d float -- %f double -- %lf 只上了3节课，代码写成这样真的很不错了 @brookmill 用了double 和%lf，现在成功啦！

user: user-0
content: 我刚又试了下double 和%lf的方法，成功了！谢谢你啊！

user: user-0
content: 我试过改float 和double,不过输入输出都用的%f。用double输100得-17.000，用float输什么都是0.000

user: user-2
content: 使用c语言自动（隐藏）转化， celsius=5*1.0 * ((float)fahr - 32) / 9; fahr= 1.0*celsius / 5 *9 +32;

user: user-1
content: 还有一个办法，不改动变量类型，但是强制他做浮点运算。 其他地方都不动，改这两处： celsius=5 * (fahr - 32.0) / 9; fahr= celsius / 5.0 *9 +32; 或者 celsius=5 * ((float)fahr - 32) / 9; fahr= (float)celsius / 5.0 *9 +32;

user: user-1
content: 类型改了之后,scanf和printf的格式也都要改： int -- %d float -- %f double -- %lf 只上了3节课，代码写成这样真的很不错了

user: user-1
content: int celsius,fahr; 把int改成float或者double int类型是整数，整数的各种运算包括除法也都是整数，比如3/2=1
user-0 提问: TURBO C/C++3.0设置选项问题

回复:
user: user-1
content: Options、Environmemt、Editor...、Default Extension：CPP Options、Compiler、C++ options...、Use C++ Compiler： CPP extension/C++ always

user: user-2
content: C是C语音（unix下c++用c和C区分） CPP是C++语言
user-0 提问: 枚举类型

回复:
user: user-1
content: 研究了一下，c语言允许int和enum自动转换，c++不行。

user: user-1
content: gcc4.8.2和VS2013编译通过，输出32、48 楼主什么编译器？

user: user-2
content: 不要这么弄 要知道 enum的值的范围很可能小于int所以当将一个int类型的值强制赋给enum时可能会有问题

user: user-0
content: jar = ( enum liquid ) ( jar+pint );强制类型转换可以解决问题。

user: user-2
content: 额 是因为  jar + pint的结果是一个int  枚举常量可以当int用但是反过来int赋给enum就不行

user: user-0
content: 我知道换成int jar可以，但是enum liquid jar按道理也是没有问题，编译却出错，这是什么问题？

user: user-3
content: 枚举类型可以当做常量用，所以enum liquid jar换成int jar这样也是可以的
user-0 提问: 关于ODBC

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-0
content: 自己test去了谢谢各位！

user: user-2
content: 百分百没有。参数要是指针的指针，才能改变指针所指的值。这个参数显然不是。

user: user-0
content: 想偷个懒，不用自己做个小测试了期待有木有一个确定的答案。

user: user-3
content: 其实很简单，调用完SQLFreeStmt函数之后，打印一下hstmt的值，就知道有没有置空了。

user: user-3
content: 按照C语言的习惯，free之类的函数一般都没有置空。  所以我也觉得没有。

user: user-1
content: 没有。我猜。
user-0 提问: 看下最精简的strlen的实现（顺便也散分）

回复:
user: user-1
content: 学东西还能拿分。我看行

user: user-2
content: 学习了

user: user-3
content: 这不可移植啊，而且又不是C语言

user: user-4

user: user-5
content: 汇编不行，唉！  赵老师的看起来似乎不错啊

user: user-6
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\intel\strlen.asm 		page	,132 		title	strlen - return	the	length of a	null-terminated	string ;*** ;strlen.asm	- contains strlen()	routine ; ;		Copyright (c) Microsoft	Corporation. All rights	reserved. ; ;Purpose: ;		strlen returns the length of a null-terminated string, ;		not	including the null byte	itself. ; ;*******************************************************************************  		.xlist 		include	cruntime.inc 		.list  page ;*** ;strlen	- return the length	of a null-terminated string ; ;Purpose: ;		Finds the length in	bytes of the given string, not including ;		the	final null character. ; ;		Algorithm: ;		int	strlen (const char * str) ;		{ ;			int	length = 0; ; ;			while( *str++ ) ;					++length; ; ;			return(	length ); ;		} ; ;Entry: ;		const char * str - string whose	length is to be	computed ; ;Exit: ;		EAX	= length of	the	string "str", exclusive of the final null byte ; ;Uses: ;		EAX, ECX, EDX ; ;Exceptions: ; ;*******************************************************************************  		CODESEG  		public	strlen  strlen	proc \ 		buf:ptr	byte  		OPTION PROLOGUE:NONE, EPILOGUE:NONE  		.FPO	( 0, 1,	0, 0, 0, 0 )  string	equ		[esp + 4]  		mov		ecx,string				; ecx -> string 		test	ecx,3					; test if string is	aligned	on 32 bits 		je		short main_loop  str_misaligned: 		; simple byte loop until string	is aligned 		mov		al,byte	ptr	[ecx] 		add		ecx,1 		test	al,al 		je		short byte_3 		test	ecx,3 		jne		short str_misaligned  		add		eax,dword ptr 0			; 5	byte nop to	align label	below  		align	16						; should be	redundant  main_loop: 		mov		eax,dword ptr [ecx]		; read 4 bytes 		mov		edx,7efefeffh 		add		edx,eax 		xor		eax,-1 		xor		eax,edx 		add		ecx,4 		test	eax,81010100h 		je		short main_loop 		; found	zero byte in the loop 		mov		eax,[ecx - 4] 		test	al,al					; is it	byte 0 		je		short byte_0 		test	ah,ah					; is it	byte 1 		je		short byte_1 		test	eax,00ff0000h			; is it	byte 2 		je		short byte_2 		test	eax,0ff000000h			; is it	byte 3 		je		short byte_3 		jmp		short main_loop			; taken	if bits	24-30 are clear	and	bit 										; 31 is	set  byte_3: 		lea		eax,[ecx - 1] 		mov		ecx,string 		sub		eax,ecx 		ret byte_2: 		lea		eax,[ecx - 2] 		mov		ecx,string 		sub		eax,ecx 		ret byte_1: 		lea		eax,[ecx - 3] 		mov		ecx,string 		sub		eax,ecx 		ret byte_0: 		lea		eax,[ecx - 4] 		mov		ecx,string 		sub		eax,ecx 		ret  strlen	endp  		end

user: user-7
content: long len; 	__asm 	{ 		mov ecx, -1;//字符串长度(这里楼主整成所能表示的最大长度） 		mov edi, p;//字符串首地址 		mov al, 0;//要查找的字符(c字符串是以'\0'结尾的） 		repnz scasb;//在字符串里重复想找，直到查到 		not ecx;//取反，得到字符串长度 		dec ecx;//这就是传说中的--len;（楼主得到的是连'\0'算在一起的字符串长度，这里自减得到我们看到的字符串长度） 		mov len, ecx;//把ecx传给外面的长度变量len; 	}

user: user-8
content: 汇编啊，看不太懂，能稍微注释下就更好了！

user: user-9
content: 没关系 剩下的4oo私底下打给我就是了

user: user-10
content: 精简的都慢, 正常的都不精简..

user: user-11
content: 要是有谁带带我学汇编就好了

user: user-12
content: 只给分，不分享点东西，没意思
user-0 提问: memset()函数可以清空数组吗?

回复:
user: user-0
content: 我试过了是这个问题，谢谢楼上的回复，不过我结贴的时候说不符合分数，结贴没有成功，这个我不是很熟，请谅解！以后不会出现结贴不给分的清空了，再次感谢楼上各位的回复，谢谢！

user: user-0
content: 好的，那我试试看，今天写的一个程序运行不正常，以前也用过memset()    先谢谢你

user: user-1
content: 这样更简单 int a[10]; memset(a, 0, sizeof(a));

user: user-1
content: memset(a, 0, 5 * sizeof(a[0])); memset最后一个参数的单位是字节，如果是int a[]，那么5个int相当于20字节
user-0 提问: 如何结束这个循环while（gets（name）!=NULL）

回复:
user: user-1
content: 引用 3 楼 liu545454 的回复:除了  ctrl+z   没有其他更好的方式了吗？ 除非改代码。gets只有两种情况返回NULL，出错或者EOF。 比如可以这样改代码，输入end就可以结束循环：        while(gets(name)!=NULL && !strcmp(name, "end"))              printf("***%s***\n",name);

user: user-2
content: Ctrl+C

user: user-2
content: Enter，Ctrl+Z，Enter

user: user-0
content: 除了  ctrl+z   没有其他更好的方式了吗？

user: user-1
content: gets在遇到文件结束(EOF)的时候返回NULL 输入EOF的方法： windows: ctrl+z linux: ctrl+D

user: user-0
content: 无论我输入什么  这个程序会一直运行    不会结束    除了ctrl+z ctrl+c
user-0 提问: 一个程序需要读取几十万次文件，如何提高读文件效率

回复:
user: user-1
content: 引用 27 楼 qin_lin_sb 的回复:[quote=引用 3 楼 BeanJoy 的回复:] 所有要读的文件只读取一次，然后把内容保存到内存中，下一次再需要读取的时候，直接从内存中取，不要每次都去读文件。 要知道，进行I/O操作，对于程序中进行的其他操作来说，可以算得上是相当耗时的操作。每次都是读不同的文件，而且只读一次就行了，不存在下次再读的问题[/quote]  意思是有一百多万个文件？这规模实在是很了不起。 从硬件方面来说，换好的硬盘，提高打开关闭读取的效率； 从软件方面来说，把多个文件合并成一个文件，打开关闭一次即可获取到多个文件的内容，减少打开关闭文件的次数。

user: user-2
content: 使用ramDisk

user: user-3
content: 如果只是打开，读取的话，可以考虑把所有文件合并成一个大文件，前面自己加上文件数，文件名，文件开始和结束地址。 对于这个大文件，可以使用内存映射文件 前提是不写入，写入的话(改变文件长度的写入)，就惨了，嘿嘿

user: user-4
content: 异步IO 处理的同时做读取 考虑磁盘阵列

user: user-5
content: 楼主这个场景貌似用hadoop比较合适吧，分布存储再计算，map-reduce

user: user-6
content: 再来句“废话”：（我这最多的就是“废话”） 无profiler不要谈效率！！尤其在这个云计算、虚拟机、模拟器、CUDA、多核 、多级cache、指令流水线、多种存储介质、……满天飞的时代！

user: user-7
content: 为何不用数据库

user: user-8
content: 文件存储格式不修改，没法加速；因为读写文件次数就在没法减少，代码再怎么写，磁盘io都降不来。

user: user-8
content: 引用 4 楼 zhao4zhong1 的回复:在文件大小相同的前提下：  读刚读过的文件比头次读没读过的文件快  读转速快的硬盘上的文件比读转速慢的硬盘上的文件快  读没有磁盘碎片的文件比读有磁盘碎片的文件快  读文件不处理比边读边处理快  单线程从头到尾一次读文件比多线程分别读文件各部分快（非固态硬盘上）  读固态硬盘上的文件比读普通硬盘上的文件快  这不全是废话啊？就这条还有点也用：“读刚读过的文件比头次读没读过的文件快”

user: user-9
content: 你这种读写有些像CPU哎，CPU读写RAM也像这种，可以看看CPU的cashe机制？

user: user-10
content: 读取几十万次（少的时候一、二十万，多的时候一百万）文件，每次读取不同的文件，每个文件也不是很大，大的几百KB，小的就几KB，  这个数据量比较大，能说说你的操作算法及所需时间

user: user-11
content: 最省钱的办法是买个ssd

user: user-12
content: 把数据保存到数据库里，索引什么的数据库系统会帮你搞定

user: user-0
content: 引用 3 楼 BeanJoy 的回复:所有要读的文件只读取一次，然后把内容保存到内存中，下一次再需要读取的时候，直接从内存中取，不要每次都去读文件。 要知道，进行I/O操作，对于程序中进行的其他操作来说，可以算得上是相当耗时的操作。每次都是读不同的文件，而且只读一次就行了，不存在下次再读的问题

user: user-0
content: 引用 11 楼 cheng7068 的回复:多线程内存写入处理应该会提升一些效率吧，我觉得还是要从算法优化上下工夫算法并不复杂，只是读个文件，获取里面的一些数据，做一些简单运算，运算量也不大，还是IO操作过多导致程序执行很慢

user: user-0
content: 引用 5 楼 zmlovelx 的回复:就不能把需要的数据都整合到一个文件中？不能啊，所有文件都是独立存在的

user: user-13
content: 1.把几万个文件生成一个临时文件 2.对这个临时文件做上面所说的处理。 你会发现，大量的程序执行都浪费在打开和关闭文件了。 之前写过类似的东西，效率基本上可以提高百倍以上

user: user-14
content: 引用 4 楼 zhao4zhong1 的回复:在文件大小相同的前提下：  读刚读过的文件比头次读没读过的文件快  读转速快的硬盘上的文件比读转速慢的硬盘上的文件快  读没有磁盘碎片的文件比读有磁盘碎片的文件快  读文件不处理比边读边处理快  单线程从头到尾一次读文件比多线程分别读文件各部分快（非固态硬盘上）  读固态硬盘上的文件比读普通硬盘上的文件快+1

user: user-15
content: 内存映射用于大文件才有比较明显的速度优势，对于这样的零散的小文件，肯定没什么效果。 这种小文件，用什么都没戏，和5楼说的，你为什么不把它们合在一起？

user: user-6
content: 您是否希望迅速对您频繁使用的文件进行碎片整理？使用 Contig 优化单个的文件，或者创建连续的新文件。http://technet.microsoft.com/zh-cn/sysinternals/bb897428
user-0 提问: 请问为什么不能写入？vs2010

回复:
user: user-1
content: 引用 12 楼 SFangtao2012 的回复:[quote=引用 11 楼 Falleyes 的回复:] [quote=引用 4 楼 wangyaninglm 的回复:] [quote=引用 3 楼 Falleyes 的回复:] char s[] = "abcdef";   //char *s="abcdef";  咦，为啥这样写就不是常量了？[/quote]这相当于分配了一个数组，然后把后面的字符一个一个赋值到数组中，并紧接着字符串给数组下一位赋值'\0'字符。 如果用char* s="abcdef"，是吧“abcdef”存储在常量区，然后把s指针指向这个常量区的地址。[/quote]分析的很有道理。s是指向常量区的地址。[/quote] 好吧我承认我错了，我承认小赵说的是对的，常在河边走，今天终于湿手了。 把  char*s="abcdef";  改成  char *s = new char[50];  memcpy(s,"abcdef",7);  这样s指向的就不是常量“abcdef"指向的常量数据区，而是自己的土地，可以随便收菜了。

user: user-0
content: 引用 11 楼 Falleyes 的回复:[quote=引用 4 楼 wangyaninglm 的回复:] [quote=引用 3 楼 Falleyes 的回复:] char s[] = "abcdef";   //char *s="abcdef";  咦，为啥这样写就不是常量了？[/quote]这相当于分配了一个数组，然后把后面的字符一个一个赋值到数组中，并紧接着字符串给数组下一位赋值'\0'字符。 如果用char* s="abcdef"，是吧“abcdef”存储在常量区，然后把s指针指向这个常量区的地址。[/quote]  对，以前接触过这个概念，赵老师那个代码给力。

user: user-0
content: 引用 7 楼 hhhhhhhhhhkkkkkkkkkk 的回复:这个错误和s[]="abcdef";没关系，如果和这个有关系的话在代码检查时就会出错了，不会让你进调试的。应该是你while条件没给好导致访问数组越界了。  哥们，你这个回答有误。。。

user: user-2
content: 引用 11 楼 Falleyes 的回复:[quote=引用 4 楼 wangyaninglm 的回复:] [quote=引用 3 楼 Falleyes 的回复:] char s[] = "abcdef";   //char *s="abcdef";  咦，为啥这样写就不是常量了？[/quote]这相当于分配了一个数组，然后把后面的字符一个一个赋值到数组中，并紧接着字符串给数组下一位赋值'\0'字符。 如果用char* s="abcdef"，是吧“abcdef”存储在常量区，然后把s指针指向这个常量区的地址。[/quote]分析的很有道理。s是指向常量区的地址。

user: user-3
content: 引用 4 楼 wangyaninglm 的回复:[quote=引用 3 楼 Falleyes 的回复:] char s[] = "abcdef";   //char *s="abcdef";  咦，为啥这样写就不是常量了？[/quote]这相当于分配了一个数组，然后把后面的字符一个一个赋值到数组中，并紧接着字符串给数组下一位赋值'\0'字符。 如果用char* s="abcdef"，是吧“abcdef”存储在常量区，然后把s指针指向这个常量区的地址。

user: user-4
content: 由编译器决定。 #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-0
content: 引用 3 楼 Falleyes 的回复:char s[] = "abcdef";   //char *s="abcdef";  咦，为啥这样写就不是常量了？

user: user-3
content: char s[] = "abcdef";   //char *s="abcdef";

user: user-3
content: 你的char指针指向常量区内存，怎么能够赋值修改呢？

user: user-0

user: user-5
content: 你没有定义变量接受left函数返回的值啊，而且返回的值应该返回start，用ptmp进行++,可以得到s被修改后的值

user: user-6
content: 常量字符串不可修改。

user: user-5
content: char* s = "abcdef"; 这样定义其实是常量字符串，不可以修改的，可以换成char s[] = "abcdef";

user: user-1
content: 这个错误和s[]="abcdef";没关系，如果和这个有关系的话在代码检查时就会出错了，不会让你进调试的。应该是你while条件没给好导致访问数组越界了。

user: user-1
content: 楼主你这个看着像是数组访问越界的问题，代码没给全不知道你那start和end是怎么样的，如果是将这两个地方的值比较大小的话在while那里应该写成*start<*end.
user-0 提问: c: 关于字符串转换问题？

回复:
user: user-1
content: ch的值是字符指针变量的地址是大于1的，c语言中的逻辑判断非0即为1，所以会一直输出True

user: user-2
content: 嗯

user: user-3

user: user-4
content: "5>6"是个字符串，表示指向首元素的指针（非NULL）,所以if(ch)一直为真

user: user-5
content: 你吓着我了，赔钱！

user: user-6
content: 字符串怎么比较   你弄错了吧

user: user-7
content: 字符串的值为真，当然输出TRUE了

user: user-8
content: "5<6"作为右值是个地址。

user: user-9
content: 直接引语、间接引语

user: user-10
content: ch是一个字符指针，如果这个指针不指向NULL(0)，那么他就是成立的，所以会进入true。和字符串里的内容没有任何关系

user: user-11
content: "5<6"是个字符串，不是数学表达式啊老兄。

user: user-12
content: unix/linux中有一个bc 语言可以用来计算表达式的值。   bc <<! print 5 < 6 !  会输出 1  bc 配合管道就可以在C中动态计算表达的值。  #include <stdio.h>  int main(int argc, char* argv[]) {   char  cmd[1024];   char const* fmt=     "bc <<!\n"     "%s\n"     "!";   sprintf(cmd, fmt, argv[1]);   FILE* pipe  = popen(cmd,"r");   if(pipe)   {     int ch;     while((ch = fgetc(pipe)) != EOF){         fputc(ch, stdout);     }     pclose(pipe);   }   return 0; }    用法:  ./eval "5 < 6" ./eval " 100 * 5 + 7"

user: user-13
content: char * ch="5>6"; 是个字符串。ch是个指针，永远大于0的！（NULL指针不考虑）

user: user-14
content: bool  s = 5 < 6
user-0 提问: 诚心询问一个关于C语言pow用法的问题

回复:
user: user-1
content: #include <stdio.h> __int64 mypow(int b,int e) {     int i;     __int64 v;      v=1i64;     for (i=0;i<e;i++) v*=b;     return v; } int main () {     __int64 UPC;     __int64 upc1,upc2,upc3,upc4,upc5,upc6,upc7,upc8,upc9,upc10,upc11,upc12;      printf("UPC Validator\n"            "=============\n"            "UPC (0 to quit): ");     scanf("%I64d",&UPC);      upc1 = (UPC - UPC % mypow(10,11))/mypow(10,12);     upc2 = (UPC % mypow(10,11) - UPC % mypow(10,10))/mypow(10,11);     upc3 = (UPC % mypow(10,10) - UPC % mypow(10,9))/mypow(10,10);     upc4 = (UPC % mypow(10,9) - UPC % mypow(10,8))/mypow(10,9);     upc5 = (UPC % mypow(10,8) - UPC % mypow(10,7))/mypow(10,8);     upc6 = (UPC % mypow(10,7) - UPC % mypow(10,6))/mypow(10,7);     upc7 = (UPC % mypow(10,6) - UPC % mypow(10,5))/mypow(10,6);     upc8 = (UPC % mypow(10,5) - UPC % mypow(10,4))/mypow(10,5);     upc9 = (UPC % mypow(10,4) - UPC % mypow(10,3))/mypow(10,4);     upc10 =(UPC % mypow(10,3) - UPC % mypow(10,2))/mypow(10,3);     upc11 = (UPC % 100i64 - UPC % 10i64) / 100i64;     upc12 = UPC % 10i64;      printf("this is a valid UPC.\n The company code is %I64d%I64d%I64d%I64d%I64d%I64d\n The product code is %I64d%I64d%I64d%I64d%I64d\n",upc1,upc2,upc3,upc4,upc5,upc6,upc7,upc8,upc10,upc11);       return 0; }

user: user-1
content: #include <stdio.h> __int64 mypow(int b,int e) {     int i;     __int64 v;      v=1i64;     for (i=0;i<e;i++) v*=b;     return v; } int main () {     __int64 UPC;     __int64 upc1,upc2,upc3,upc4,upc5,upc6,upc7,upc8,upc9,upc10,upc11,upc12;      printf("UPC Validator\n"            "=============\n"            "UPC (0 to quit): ");     scanf("%I64d",&UPC);      upc1 = (UPC - UPC % mypow(10,11))/mypow(10,12);     upc2 = (UPC % mypow(10,11) - UPC % mypow(10,10))/mypow(10,11);     upc3 = (UPC % mypow(10,10) - UPC % mypow(10,9))/mypow(10,10);     upc4 = (UPC % mypow(10,9) - UPC % mypow(10,8))/mypow(10,9);     upc5 = (UPC % mypow(10,8) - UPC % mypow(10,7))/mypow(10,8);     upc6 = (UPC % mypow(10,7) - UPC % mypow(10,6))/mypow(10,7);     upc7 = (UPC % mypow(10,6) - UPC % mypow(10,5))/mypow(10,6);     upc8 = (UPC % mypow(10,5) - UPC % mypow(10,4))/mypow(10,5);     upc9 = (UPC % mypow(10,4) - UPC % mypow(10,3))/mypow(10,4);     upc10 =(UPC % mypow(10,3) - UPC % mypow(10,2))/mypow(10,3);     upc11 = (UPC % 100i64 - UPC % 10i64) / 100i64;     upc12 = UPC % 10i64;      printf("this is a valid UPC.\n The company code is %i64d%i64d%i64d%i64d%i64d%i64d\n The product code is %i64d%i64d%i64d%i64d%i64d\n",upc1,upc2,upc3,upc4,upc5,upc6,upc7,upc8,upc10,upc11);       return 0; }

user: user-2
content: pow(10,11) 超出int范围了， UPC % (long long)pow(10,11)

user: user-2
content: 如果一定要用%，要转换成整数 UPC % (int)pow(10,11)

user: user-2
content: 取模运算符(%)只能用于整数。pow的返回值是浮点数。

user: user-2
content: int    i;     long long temp;     int    upc[12];       temp = UPC;      for (i = 11; i >= 0; i--) {          upc[i] = temp % 10;          temp /= 10;      }  更简单的办法是直接把UPC定义成字符串，然后依次处理每个字符
user-0 提问: MAC字符转换问题

回复:
user: user-1
content: 引用 3 楼 xiadun 的回复:[quote=引用 2 楼 user-1 的回复:] int char_to_hex(char c) {   if (c >= '0' && c <= '9') {     return c - '0';   } else if (c >= 'a' && c <= 'f') {     return c - 'a' + 10;   } else if (c >= 'A' && c <= 'F') {     return c - 'A' + 10;   } else {     printf("invalid input!");     return -1;   } }  for (i = 0; i < 6; i++) {   mac[i] = (char)(char_to_hex(tmp[2*i]) * 16 + char_to_hex(tmp[2*i+1])); }     #include "stdio.h"  int char_to_hex(char c) { 	if (c >= '0' && c <= '9'){ 		return c - '0'; 	} 	else if (c >= 'a' && c <= 'f'){ 		return c - 'a' + 10; 	} 	else if (c >= 'A' && c <= 'F'){ 		return c - 'A' + 10; 	} 	else{ 		printf("invalid input!"); 		return -1; 	} }  int main() { 	char tmp[13]={"abcdef123456"}; 	char mac[6]={0}; 	int i = 0; 	for(i=0; i<6; i++){ 		mac[i] = (char)(char_to_hex(tmp[2*i]) * 16 + char_to_hex(tmp[2*i+1])); 		printf("%x\n",mac[i]); 	} 	return 0; } 输出： ffffffab ffffffcd ffffffef 12 34 56 Press any key to continue [/quote] 注意输出的ffffffab，这是因为char是有符号的，按%d输出扩展为int的时候前面就会填充符号位(1)。用unsigned char就不会有这个问题。而且MAC地址也不应该有正负的概念，所以定义成无符号数比较合理。

user: user-0
content: 引用 2 楼 user-1 的回复:int char_to_hex(char c) {   if (c >= '0' && c <= '9') {     return c - '0';   } else if (c >= 'a' && c <= 'f') {     return c - 'a' + 10;   } else if (c >= 'A' && c <= 'F') {     return c - 'A' + 10;   } else {     printf("invalid input!");     return -1;   } }  for (i = 0; i < 6; i++) {   mac[i] = (char)(char_to_hex(tmp[2*i]) * 16 + char_to_hex(tmp[2*i+1])); }   谢谢，已经解决！ 待结贴

user: user-0
content: 引用 2 楼 user-1 的回复:int char_to_hex(char c) {   if (c >= '0' && c <= '9') {     return c - '0';   } else if (c >= 'a' && c <= 'f') {     return c - 'a' + 10;   } else if (c >= 'A' && c <= 'F') {     return c - 'A' + 10;   } else {     printf("invalid input!");     return -1;   } }  for (i = 0; i < 6; i++) {   mac[i] = (char)(char_to_hex(tmp[2*i]) * 16 + char_to_hex(tmp[2*i+1])); }     #include "stdio.h"  int char_to_hex(char c) { 	if (c >= '0' && c <= '9'){ 		return c - '0'; 	} 	else if (c >= 'a' && c <= 'f'){ 		return c - 'a' + 10; 	} 	else if (c >= 'A' && c <= 'F'){ 		return c - 'A' + 10; 	} 	else{ 		printf("invalid input!"); 		return -1; 	} }  int main() { 	char tmp[13]={"abcdef123456"}; 	char mac[6]={0}; 	int i = 0; 	for(i=0; i<6; i++){ 		mac[i] = (char)(char_to_hex(tmp[2*i]) * 16 + char_to_hex(tmp[2*i+1])); 		printf("%x\n",mac[i]); 	} 	return 0; } 输出： ffffffab ffffffcd ffffffef 12 34 56 Press any key to continue

user: user-1
content: int char_to_hex(char c) {   if (c >= '0' && c <= '9') {     return c - '0';   } else if (c >= 'a' && c <= 'f') {     return c - 'a' + 10;   } else if (c >= 'A' && c <= 'F') {     return c - 'A' + 10;   } else {     printf("invalid input!");     return -1;   } }  for (i = 0; i < 6; i++) {   mac[i] = (char)(char_to_hex(tmp[2*i]) * 16 + char_to_hex(tmp[2*i+1])); }

user: user-1
content: 建议mac[]不要用char，用unsigned char比较好 int  n, i; char str[3]; str[2] = '\0'; for (i = 0; i < 6; i++) {   str[0] = tmp[i*2];   str[1] = tmp[i*2+1];   if (sscanf(str, "%x", &n) != 1) {     printf("invalid input!");   }   mac[i] = (char)n; }
user-0 提问: 初学者请教一段代码

回复:
user: user-0
content: 引用 1 楼 user-2 的回复:%d对应的应该是个整数，*structtest是个结构体，这里不一致导致printf取不到正确的值。 printf是通过可变参数实现的，当格式字符串里的格式(“%d")和后面对应的参数类型不一致的时候，会出现各种莫名其妙的现象。既然楼主是初学者，建议不要深究，记住前后一定要一致就行了。 // 这里有个错误 structtest = (struct MyStruct*)malloc(sizeof(struct MyStruct/*这个*要去掉*/));  了解了，非常感谢

user: user-1
content: 楼上正解已经出现。

user: user-2
content: %d对应的应该是个整数，*structtest是个结构体，这里不一致导致printf取不到正确的值。 printf是通过可变参数实现的，当格式字符串里的格式(“%d")和后面对应的参数类型不一致的时候，会出现各种莫名其妙的现象。既然楼主是初学者，建议不要深究，记住前后一定要一致就行了。 // 这里有个错误 structtest = (struct MyStruct*)malloc(sizeof(struct MyStruct/*这个*要去掉*/));