Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 关于位运算的问题：条件运算符第一个操作数是个按位与的表达式，我不太明白机器是怎么执行这句语句的？

回复:
user: user-1
content: 如果是我写的话，肯定是移动掩码变量，而这里取巧移动待测量变量。 这样掩码是一个常量，方便优化。  待测试变量与掩码相对移动即可

user: user-2
content: 因为要显示的数字顺序一般都是从高到低、从左往右的，所以第一次判断最高位，第二次无符号数据左移一位，判断的就是次高位了，以此类推，直到处理完32位。顺便提一句，这个程序只能在int为32位的环境中正确运行，绝对是学校里编的

user: user-3
content: 掩码是为了选出一个数中的特定位。 比如你的例子中displayMask值为1<<31，即为0x8000，只有左数第一位是1，其余全部是0。 其余位为0的作用在于做&运算，不管另一个操作数在这个位的值是0还是1，运算完该位均为0,； 反之，左数第一位的值做&运算，另一个操作数在左数第一位的值就是结果位的值。  /* 8位长度的例子 */   1 0 1 1 0 0 1 0  测试数 &1 0 0 0 0 0 0 0  displayMask ---------------------  1 0 0 0 0 0 0 0  结果为非0   0 1 0 0 1 1 1 0  测试数 &1 0 0 0 0 0 0 0  displayMask ---------------------  0 0 0 0 0 0 0 0  结果为0  value & displayMask ? '1' : '0'。 意思是说value和displayMask做&运算，得到结果非0，返回字符‘1’；得到结果0，返回字符‘0’
user-0 提问: C语言，简单的一小题

回复:
user: user-0
content: 非常感谢楼上个各位，一楼的正解 这是我后面用，快速排序写出来的，通过了   /*             ,%%%%%%%%,            ,%%/\%%%%/\%%           ,%%%\c "" J/%%%  %.       %%%%/ o  o \%%%  `%%.     %%%%    _  |%%%   `%%     `%%%%(__Y__)%%'   //       ;%%%%`\-/%%%'  ((       /  `%%%%%%%'   \\    .'          |    \\  /       \  | |     \\/         ) | |      \         /_ | |__      (___________)))))))   */ #include<stdio.h> #include<stdlib.h>  void quiksort(unsigned long int a[],int low,int high) {      int i = low;     int j = high;       unsigned long int temp = a[i];         if( low < high)     {                   while(i < j)          {             while((a[j] >= temp) && (i < j))             {                  j--;              }             a[i] = a[j];             while((a[i] <= temp) && (i < j))             {                 i++;              }               a[j]= a[i];         }         a[i] = temp;         quiksort(a,low,i-1);         quiksort(a,j+1,high);     }     else     {         return;     } }  int main() { 	unsigned long int i,n,*str; 	scanf("%d",&n); 	str = (unsigned long int*)malloc(sizeof(unsigned long int)*n); 	for(i = 0;i<n;i++) 		scanf("%d",&str[i]); 	quiksort(str,0,n-1); 	for( i = 0;i<n;i++) 		printf("%d ",str[i]); 	return 0; }

user: user-1
content: #include <iostream> #include <vector> #include <algorithm>  using namespace std;  int main() { 	int num; 	cin >> num; 	vector<int> ivec; 	ivec.reserve(num);  	int temp; 	for (int i = 0; i != num; ++i) 	{ 		cin >> temp; 		ivec.push_back(temp); 	}  	sort(ivec.begin(), ivec.end());  	for (auto &i : ivec) 	{ 		cout << i << " "; 	} 	cout << endl; }

user: user-2
content: 明显希望你做个快速排序
user-0 提问: 大家帮我看看这个c程序到底错哪了啊

回复:
user: user-1
content: 少了个大括号 }  ， 改成；   #include<stdio.h> int main() { 	int n,sum,i,a,k; 	while(scanf("%d",&n)!=0) 	{ 		for(i=0;i<n;i++) 		{ 			sum=0; 			scanf("%d",&k); 			while(k--) 			{ 				scanf("%d",&a); 				sum+=a; 			} 			printf("%d\n",sum); 			if(i!=n-1)       				printf("\n"); 		} 		return 0; 	} }

user: user-2
content: 末尾加一个}貌似不够十个字

user: user-3
content: 你匹配的大括号少了一个，少了一个}
user-0 提问: 为什么数组越界后能够输出hello？

回复:
user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-2
content: 你这也就在 x86 这种用栈保存返回地址的机器上玩， 你覆盖了栈中保存的返回地址， 从 fun 中返回的时候就返回到 hello 中去了， 你这代码完全破坏了栈帧， 基本上就只能是 crash 了, 好点的办法还是从参数的地址计算出返回地址去修改。 并且现在的编译器好多都带 堆栈检查， 很可能没跑到 hello 的时候就 GP 了， M$ 的编译器缺省应该就 _chkstk （/Ge),   gcc  用 -fstack-check。 在其他处理很多RISC的处理器上， 比如 ARM， 它是用 寄存器 LR 保存返回地址， 你这样的代码就没用了。

user: user-3
content: Intel调用模型是栈结构的，调用fun的时候，调用fun下一条命令地址入栈，而fun里面你又写入hello地址越界，把这个fun下一条命令地址覆盖了，当程序要返回的时候得到的不是main里面的地址，而是你写进去的hello地址

user: user-0
content: 引用 2 楼 qq423399099 的回复:C++中越界操作在编译时期是不检测的，只有在运行中才能检测出，你上面的那段代码的确发生了越界，但并没有超出该进程中的内存地址空间，所以不会报错。最好不要这样操作，因为不同编译器对程序的优化方式不一样，同时，变量内存的分配也跟操作系统有关，你无法确定其是否会超出进程地址空间，而且会影响各变量数据的独立性。 他确实越界了，只是看似正确，他把不属于他的地方给定了数据，这可能在某些时候才出现灾难，而通常这种错误一般很难发现，新版的VS都有strcpy_s来确保安全地复制。 C++程序在编译期和运行期都是不对数据越界做任何检查的.，只有当内存错误了, 才会通知程序崩溃. 楼主的内存操作是在栈中, 并且越界不多, 正好都是自己申请的临时变量内,  虽然程序没有报错, 但是执行效果已经不正确了.  实际上已经是错了. 如果你越界多一点, 比如char d[3]="12";     strcpy(d,"这里填充1000个字符");  // 填充多点, 即让越界更远. 影响了调用栈, 这时程序估计立马闪退或者崩溃. 还有就是new申请的堆空间, 越界一般都会造成崩溃, 提示堆被破坏.能讲一下为什么会调用hello函数吗？

user: user-4
content: 运气好，抢银行没被抓住

user: user-5
content: C++中越界操作在编译时期是不检测的，只有在运行中才能检测出，你上面的那段代码的确发生了越界，但并没有超出该进程中的内存地址空间，所以不会报错。最好不要这样操作，因为不同编译器对程序的优化方式不一样，同时，变量内存的分配也跟操作系统有关，你无法确定其是否会超出进程地址空间，而且会影响各变量数据的独立性。 他确实越界了，只是看似正确，他把不属于他的地方给定了数据，这可能在某些时候才出现灾难，而通常这种错误一般很难发现，新版的VS都有strcpy_s来确保安全地复制。 C++程序在编译期和运行期都是不对数据越界做任何检查的.，只有当内存错误了, 才会通知程序崩溃. 楼主的内存操作是在栈中, 并且越界不多, 正好都是自己申请的临时变量内,  虽然程序没有报错, 但是执行效果已经不正确了.  实际上已经是错了. 如果你越界多一点, 比如char d[3]="12";     strcpy(d,"这里填充1000个字符");  // 填充多点, 即让越界更远. 影响了调用栈, 这时程序估计立马闪退或者崩溃. 还有就是new申请的堆空间, 越界一般都会造成崩溃, 提示堆被破坏.

user: user-6
content: 这个跟编译器有关，如果越界的地方指向的还是普通数据区程序就不会崩溃 所写的代码最好用chkcpp扫描一遍，这样安全点。
user-0 提问: 请问这个链表的建立存在什么问题？

回复:
user: user-1
content: 链表一定要做好初始化，next必须要为空，否则就会出现异常

user: user-2
content: q = (Club*)malloc(sizeof(Club)); q->next = NULL;         //添加  fscanf(fp, "%s\t%s\n", q->ID, q->Name);

user: user-3
content: 每次malloc一个club后，记得将它的next设为NULL
user-0 提问: C语言求助

回复:
user: user-1
content: 查MSDN是Windows程序员必须掌握的技能之一。  console屏幕处理例子程序。终端窗口屏幕处理相关API使用例子。来自MSVC20\SAMPLES\win32\console\ http://download.csdn.net/detail/zhao4zhong1/3461309

user: user-2
content: 引用 2 楼 coder__H 的回复:能够具体解释每一行代码一下吗，初学，第一次接触这个 第三行：COORD是Windows API中定义的一种结构，表示一个字符在控制台屏幕上的坐标。 定义为： typedef struct _COORD { SHORT X; // horizontal coordinate SHORT Y; // vertical coordinate } COORD; 第五行：GetStdHandle也是一个Windows API函数。它用于从一个特定的标准设备（标准输入、标准输出或标准错误）中取得一个句柄（用来标识不同设备的数值）。这里是标准输出的句柄 第七行：将传入的坐标值赋给结构体变量中的坐标值 第九行：SetConsoleCursorPosition是API中定位光标位置的函数，如果用户定义了 COORD pos，那么pos其实是一个结构体变量，其中X和Y是它的成员，通过修改pos.X和pos.Y的值就可以实现光标的位置控制。

user: user-3
content: 查这三个类型/函数的意思：COORD，GetStdHandle，SetConsoleCursorPosition

user: user-0
content: 能够具体解释每一行代码一下吗，初学，第一次接触这个

user: user-2
content: 这是将光标移动到指定坐标位置
user-0 提问: 大家好，我想用纯C编写一个代码编辑器，可是目前我只会写控制台,不会做界面,请问高手能不能给我一个思路,谢谢!

回复:
user: user-1
content: 引用 40 楼 ynsenyu 的回复:老赵的蹭分计划完败于楼主 你知道得太多了！啪——！啊——！

user: user-0
content: 引用 31 楼 qq1134993111 的回复:会不会C++啊，会的话用Qt写界面很简单的。   不会...

user: user-0
content: 引用 30 楼 galiniur0u 的回复:楼主可以MFC或者Win32程序，基本上都是拖拽控件，需要你写的部分很少涉及到C++的知识。如果楼主完全用C实现例如楼主距离的Directx，写起来比较费时而已。   谢谢指导

user: user-2
content: 老赵的蹭分计划完败于楼主

user: user-1
content: 推荐使用Source Insight软件查看大型项目的源代码。

user: user-1
content: 师傅领进门，以后修行得咋样，就得看徒弟的主观能动性了。

user: user-0
content: 引用 36 楼 zhao4zhong1 的回复:[quote=引用 35 楼 yyxgs 的回复:] [quote=引用 34 楼 zhao4zhong1 的回复:] 我觉得楼主听#6楼说的就够了。   是吗?我觉得还是34楼的好... 好像源代码是java的吧?[/quote] 睁眼说瞎话！ https://notepad-plus-plus.org/zh/[/quote]   不好意思，从没下载过源码，我在你给的官网地址上下载了一隔压缩包，源代码在哪额。。

user: user-1
content: 引用 35 楼 yyxgs 的回复:[quote=引用 34 楼 zhao4zhong1 的回复:] 我觉得楼主听#6楼说的就够了。   是吗?我觉得还是34楼的好... 好像源代码是java的吧?[/quote] 睁眼说瞎话！ https://notepad-plus-plus.org/zh/

user: user-0
content: 引用 34 楼 zhao4zhong1 的回复:我觉得楼主听#6楼说的就够了。   是吗?我觉得还是34楼的好... 好像源代码是java的吧?

user: user-1
content: 我觉得楼主听#6楼说的就够了。

user: user-3
content: 楼主可以MFC或者Win32程序，基本上都是拖拽控件，需要你写的部分很少涉及到C++的知识。如果楼主完全用C实现例如楼主距离的Directx，写起来比较费时而已。

user: user-4
content: 会不会C++啊，会的话用Qt写界面很简单的。

user: user-5
content: 引用 27 楼 yyxgs 的回复:[quote=引用 25 楼 u010165006 的回复:] [quote=引用 24 楼 user-7 的回复:] 我大学的时候一个NB师兄用纯C写了一个DOS下的编辑器，类似于TC那样，非常漂亮，支持自定义的汇编代码格式整理。非常N B。那时还是win98的时代。 DOS下写个下拉菜单界面都很不容易。[/quote]   转眼就到Windows时代了，我是Windows时代的时候出生了，不了解DOS，但是磁盘操作系统应该很强大吧？[/quote] DOS现在看来很简陋了。

user: user-6
content: 只会写控制台,不会做界面,

user: user-0
content: 引用 25 楼 u010165006 的回复:[quote=引用 24 楼 user-7 的回复:] 我大学的时候一个NB师兄用纯C写了一个DOS下的编辑器，类似于TC那样，非常漂亮，支持自定义的汇编代码格式整理。非常N B。那时还是win98的时代。 DOS下写个下拉菜单界面都很不容易。[/quote]   转眼就到Windows时代了，我是Windows时代的时候出生了，不了解DOS，但是磁盘操作系统应该很强大吧？

user: user-0
content: 引用 24 楼 user-7 的回复:我大学的时候一个NB师兄用纯C写了一个DOS下的编辑器，类似于TC那样，非常漂亮，支持自定义的汇编代码格式整理。非常N B。那时还是win98的时代。   那确实厉害！

user: user-7
content: 我大学的时候一个NB师兄用纯C写了一个DOS下的编辑器，类似于TC那样，非常漂亮，支持自定义的汇编代码格式整理。非常N B。那时还是win98的时代。

user: user-5
content: 引用 24 楼 user-7 的回复:我大学的时候一个NB师兄用纯C写了一个DOS下的编辑器，类似于TC那样，非常漂亮，支持自定义的汇编代码格式整理。非常N B。那时还是win98的时代。 DOS下写个下拉菜单界面都很不容易。

user: user-5
content: 引用 21 楼 yyxgs 的回复:[quote=引用 19 楼 u010165006 的回复:] [quote=引用 17 楼 yyxgs 的回复:]  刚看了下Windows程序设计(第5版),给跪了，请问要用MFC是不是要先学C++呢? C++ Builder的VCL、Visual C++的MFC、QT都是一种类库，是基于C++的，是面向对象的。C语言没有类。 [/quote]   好吧，那也就是说要想用QT，前提也要会C++?[/quote]  对的，C++是一个必攻的中途岛，然后可以分支。

user: user-0
content: 引用 22 楼 u010165006 的回复:[quote=引用 21 楼 yyxgs 的回复:] [quote=引用 19 楼 u010165006 的回复:] [quote=引用 17 楼 yyxgs 的回复:]  刚看了下Windows程序设计(第5版),给跪了，请问要用MFC是不是要先学C++呢? C++ Builder的VCL、Visual C++的MFC、QT都是一种类库，是基于C++的，是面向对象的。C语言没有类。 [/quote]   好吧，那也就是说要想用QT，前提也要会C++?[/quote]  对的，C++是一个必攻的中途岛，然后可以分支。[/quote]   明白了。
user-0 提问:   遇到[Linker error] undefined reference to `WinMain@16' 怎么破啊？谢谢

回复:
user: user-1
content: 每本教材的第一个程序， hello, World  都有一个main函数啊

user: user-2
content: 新建控制台项目，将你的代码加进去。

user: user-3
content: 没有main函数啊， int WinMain(void) { }
user-0 提问: 关于linux下 调用fork的问题 

回复:
user: user-1
content: 父进程先于子进程运行完成。如果希望控制顺序可参考wait、waitpid函数

user: user-2
content: 不管是父进程还是子进程，在终端输出的时候都是在光标的当前位置输出。  当你按下回车键执行命令时，光标位置就在下一行的开始位置。父进程执行时，在光标所在位置输出了“I am father\n”，最后一个字符换行，所以光标移到下一行的开始位置。父进程结束后，shell进程获得资源首先执行，在光标所在位置输出提示符，并等待终端输入，光标移到提示符之后。最后子进程获得资源执行，在光标所在位置输出“im am Son\n”，最后一个字符换行，光标移到下一行的开始位置。

user: user-3
content: 首先你为什么会认为是同时打印呢？ 这取决于哪个进程先执行。所以打印的顺序取决调度顺序。在这里多说一句就是考虑到缓存命中一般父进程都会先执行。

user: user-4
content: 主进程先结束，所以就有系统提示符啦。child == 0 这个是子进程
user-0 提问: 利用scanf向数组传数据，发现无法终止输入，求解~~~

回复:
user: user-0
content: @zhangxiangDavaid  是真的可以！！谢谢~~~问题解决了~~~

user: user-0
content: 我就是输了10次啊，然而它并没有终止@user-6

user: user-1
content: scanf的问题，建议楼主使用从文件读取的方式再试试。

user: user-2
content: scanf("%d ",&Arr[i]);  后面多了一个空格，scanf会去匹配空白符导致你说的情况

user: user-3
content: 楼主刚才运行了下代码，发现scanf里面%d后面多了一个空格，所以你的代码实际每次带入的都是一个数字+N个空格（scanf里面一个空格可以匹配一个或多个空格/换行）的模式，而回车键一次会发送一个换行所以当你第10个数字输完，回车后（不管回车几次）都被数字后面的空格匹配了，所以要么把空格去掉，要么输完第十个数字空格后面跟一个非空格符就可以了,表达不是很清楚，大体就这么个意思

user: user-4
content: 建议楼主看一下 《The C Programming Language》  了解了scanf()函数的工作原理，自己再多实验，会有比较深刻的理解。  scanf()在遇到一个非空的字符时才会返回，假如第一次输入为 “1 ” 此时scanf()并不会返回，而是等待后面的非空字符输入时，才会将之前匹配的字符返回，多余的部分会被丢掉。

user: user-5
content: scanf("%d",&Arr[i]);  //此处不需用空格，输入一个，就回车 再试试！

user: user-6
content: while一直在循环输入，输入10次后就终止了
user-0 提问: 请问大家，用C在Windows下编写GUI程序用什么图形库比较好呢?DirectX是什么?算是一种图形库吗?

回复:
user: user-1
content: 引用 4 楼 yyxgs 的回复:[quote=引用 3 楼 u010165006 的回复:] 推荐C++ Builder C++ Builder（BCB）从初学到入门 http://blog.163.com/tab_98/blog/static/119240972016157466626/ 学C++还是C#、Java？ http://blog.163.com/tab_98/blog/static/11924097201511274543737/ 用C++ Builder写个最简单的记事本不超过50行代码，但要写个代码编辑器不是那么容易，看看EditPlus之类的就明白了。   的确,难怪别人说学了GUI后,才发现控制台是多么的人性化...[/quote] 你是不是理解错了，代码编辑器需要支持语法高亮，单是C语言就有多少关键字，多种语言都要解析。。 比如：Notepad2的功能介绍  1、自定义语法高亮方案，支持HTML, XML, CSS, JavaScript, VBScript, ASP,  PHP, CSS, Perl/CGI,C/C++, C#, Java, VB, Pascal, 汇编, SQL, Python, NSIS,INI, REG, INF, BAT,DIFF等众多脚本文件。  2、支持ANSI，Unicode，UTF-8等编码互换  3、可以设置无限个书签（9种图标可换）轻松定位  4、空格，制表符彩色显示，并可互相转换  5、可以对任意的文本块进行操作，ALT键＋鼠标  6、对括号｛｝〔〕（）可以高亮配对显示，方便查看(仅对英文符号有效)  7、可以自定义代码页和字符集，对中文支持良好  8、使用标准的正则表达式搜索和替换  10、快速放大、缩小页面，不用再设定字体大小  11、可以指定ESC键最小化Notepad2到系统托盘或者关闭Notepad2。  12、支持透明模式  13、支持窗口前端显示（TOP）

user: user-0
content: 引用 5 楼 u010165006 的回复:[quote=引用 4 楼 yyxgs 的回复:] [quote=引用 3 楼 u010165006 的回复:] 推荐C++ Builder C++ Builder（BCB）从初学到入门 http://blog.163.com/tab_98/blog/static/119240972016157466626/ 学C++还是C#、Java？ http://blog.163.com/tab_98/blog/static/11924097201511274543737/ 用C++ Builder写个最简单的记事本不超过50行代码，但要写个代码编辑器不是那么容易，看看EditPlus之类的就明白了。   的确,难怪别人说学了GUI后,才发现控制台是多么的人性化...[/quote] 你是不是理解错了，代码编辑器需要支持语法高亮，单是C语言就有多少关键字，多种语言都要解析。。 比如：Notepad2的功能介绍  1、自定义语法高亮方案，支持HTML, XML, CSS, JavaScript, VBScript, ASP,  PHP, CSS, Perl/CGI,C/C++, C#, Java, VB, Pascal, 汇编, SQL, Python, NSIS,INI, REG, INF, BAT,DIFF等众多脚本文件。  2、支持ANSI，Unicode，UTF-8等编码互换  3、可以设置无限个书签（9种图标可换）轻松定位  4、空格，制表符彩色显示，并可互相转换  5、可以对任意的文本块进行操作，ALT键＋鼠标  6、对括号｛｝〔〕（）可以高亮配对显示，方便查看(仅对英文符号有效)  7、可以自定义代码页和字符集，对中文支持良好  8、使用标准的正则表达式搜索和替换  10、快速放大、缩小页面，不用再设定字体大小  11、可以指定ESC键最小化Notepad2到系统托盘或者关闭Notepad2。  12、支持透明模式  13、支持窗口前端显示（TOP）[/quote]   我不用功能这么丰富，很简单的编辑器就行了。

user: user-0
content: 引用 3 楼 u010165006 的回复:推荐C++ Builder C++ Builder（BCB）从初学到入门 http://blog.163.com/tab_98/blog/static/119240972016157466626/ 学C++还是C#、Java？ http://blog.163.com/tab_98/blog/static/11924097201511274543737/ 用C++ Builder写个最简单的记事本不超过50行代码，但要写个代码编辑器不是那么容易，看看EditPlus之类的就明白了。   的确,难怪别人说学了GUI后,才发现控制台是多么的人性化...

user: user-1
content: 推荐C++ Builder C++ Builder（BCB）从初学到入门 http://blog.163.com/tab_98/blog/static/119240972016157466626/ 学C++还是C#、Java？ http://blog.163.com/tab_98/blog/static/11924097201511274543737/ 用C++ Builder写个最简单的记事本不超过50行代码，但要写个代码编辑器不是那么容易，看看EditPlus之类的就明白了。

user: user-0
content: 引用 1 楼 user-2 的回复:找自己合适的，看lz弄了这么久还在这个阶段，要是我都学完一个API了。 DirectX是本来是微软的游戏开发的API, 不过由于写得“太好了”, 基本API包含在Windows API里面了。 扩展API还是需要DX运行时。Direct3D, Direct2D, DirectWrite等等等等Direct"X"。 像是XAudio2.7是属于DX的，能在XP这种老系统运行，到了XAudio2.8就是Window8自带的API了。  没用过C来使用COM组件，我问过别人用C开发COM程序是不是有点麻烦，毕竟参数啊，函数名，语法糖啊什么的， 那人说不麻烦╮（￣▽￣）╭ 。  做为D2D的拥护者当然推荐Direct2D   谢谢指点，我是想用C写一个代码编辑器,不知道该用什么图形库比较好

user: user-2
content: 找自己合适的，看lz弄了这么久还在这个阶段，要是我都学完一个API了。 DirectX是本来是微软的游戏开发的API, 不过由于写得“太好了”, 基本API包含在Windows API里面了。 扩展API还是需要DX运行时。Direct3D, Direct2D, DirectWrite等等等等Direct"X"。 像是XAudio2.7是属于DX的，能在XP这种老系统运行，到了XAudio2.8就是Window8自带的API了。  没用过C来使用COM组件，我问过别人用C开发COM程序是不是有点麻烦，毕竟参数啊，函数名，语法糖啊什么的， 那人说不麻烦╮（￣▽￣）╭ 。  做为D2D的拥护者当然推荐Direct2D
user-0 提问: 双链表不特别指明时，循环不？

回复:
user: user-1
content: 双向链表只是因为任何节点都可以找到其上一节点以及下一节点，可以从前向后访问，也可以从后往前访问所以叫双向链表，也就是图1所示。

user: user-2
content: 一般分成普通的双向链表和双向循环链表 如果你要把数据集合看成一个环，可以顺时针走，也可以逆时针走，那你就可以用双向循环链表来描述 如果你要把数据集合看成一条链，可以双向遍历，那你就可以用双向链表来描述

user: user-3
content: 不循环，循环的话叫做循环双链表

user: user-4
content: 不循环
user-0 提问: scanf问题

回复:
user: user-1
content: 楼主把第34行改成：scanf("%c%*c", &ch); （%*c匹配任意一个字符，可以把输入缓冲区内剩下的的回车读掉） 解决了回车的问题，不过你只能输入0-9之间的数字才会得到正确的结果(因为你是用%c 读的)  因为字符'2'的ASCII码是50，所以结果是对的

user: user-0
content: 引用 1 楼 starytx 的回复:scanf前加上fflush(stdin);试试，清除一下输入缓冲区  还是不行啊

user: user-2
content: scanf前加上fflush(stdin);试试，清除一下输入缓冲区

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];  谢谢！

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0];
user-0 提问: C语言 计算字符串有几个单词 出错

回复:
user: user-1
content: 是13 不是 ‘13’ 是== 不是 =

user: user-2
content: Raw console 不能用 标准库里面的 流式IO C FILE* 流的 stdin,stdout,stderr C++ iostream 之类的 cin,cout,.cerr.clog 等等 不是建立在 Raw console 上的 二是建立在 cook 控制台上的

user: user-3
content: 仅供参考：#include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-0
content: 引用 1 楼 lgbxyz 的回复:这是因为gets()的工作原理，其从标准输入读取数据，直到遇到换行符或者EOF才停止读取， 换行符会被忽略并且gets()会在最后一个字符的后面加上‘\0’。   str[0]='13' 这是什么东东? str[0] == 0x13 str[0] == '\x13'  我想引用“回车符”，就直接写了str[0]='13',回车的ASCII码值不是13吗，这样写不行？

user: user-1
content: 这是因为gets()的工作原理，其从标准输入读取数据，直到遇到换行符或者EOF才停止读取， 换行符会被忽略并且gets()会在最后一个字符的后面加上‘\0’。   str[0]='13' 这是什么东东? str[0] == 0x13 str[0] == '\x13'
user-0 提问: 统计数字，算法设计

回复:
user: user-1
content: 楼主可以参考二叉树排序，跟楼主的要求很像，不过创建时间貌似是n*O(logn)吧。

user: user-2
content: 用链表的话，数据多了肯定效率低下再加上还要排序更加麻烦， 最快的就是hash表了吧  #include <stdio.h> #include <stdlib.h>  #define MAX (1.5e9)  int main(void) { 	int i; //loop 	int num; // 10000 	int value; 	unsigned int* arr = NULL; 	 	arr = (unsigned int*)calloc(sizeof(unsigned int), MAX + 1); 	if (NULL == arr) 	{ 		printf("calloc failed\n"); 	} 	 	scanf("%d", &num); 	for (i = 0; i < num; i++) 	{ 		scanf("%d", &value); 		arr[value]++; 	} 	 	for (i = 1; i < MAX; i++) 	{ 		if (arr[i] != 0) 		{ 			printf("%d %d\n", i, arr[i]); 		} 	} 	 	return 0; }

user: user-3
content: 不想排序可以考虑平衡树或者critbit树

user: user-4
content: 这个不需要排序，一个 map 就可以了吧。

user: user-4
content: 引用 3 楼 fefe82 的回复:这个不需要排序，一个 map 就可以了吧。 C 语言没有map ，可能需要自己写个哈希表 ...

user: user-5
content: n范围是多少? 已经说明最多10000个,一定要用链表建议直接用数组模拟链表

user: user-6
content: 使用链表排序，超时的可能性非常大。 实现简单些的，用两个数组，一个装数字，一个装次数，按照索引，两个数组的元素是一一对应的。对次数数组排序的时候，发生交换的，对数字数组的相同索引交换即可。

user: user-7
content: 使用插入排序和折半查找
user-0 提问: VC++6.0出现停止工作怎么回事啊？求解

回复:
user: user-1
content: fun()函数中的i没有初始化 初始化下就好了

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

user: user-3
content: 虽然不知道你们在说些什么，但感觉好厉害的样子。

user: user-4
content: 那是程序运行时错误，和你VC6没什么关系，检查你程序

user: user-5
content: 不知道楼主这段程序的最终目的是什么？感觉好几个地方都没理解什么意义 1、这段代码上来就判断p是不是空的么？还是要验证其他的，反正是直接就跳过去了，因为传入的参数s如果是你输入的就不会是空的。还是你想覆盖其他字符？  	while (*p == '\0') 	{ 		n++; p++; 	}  2、既然上面这段代码没运行那么下面这个也不会运行了，因为n一直是0. while(n!=0)  {  	a[i]='*';  	i++;  	n--;   } 3、建议用vs，因为  直接在编译的过程中就告诉你了，i没有赋初值。

user: user-6
content: win7及以后的版本对VC6.0的支持都不好，这种问题很常见， 不是windows编程就用Dev-C++吧，windows编程还是得用VS

user: user-7
content: 如上，声明变量并初始化是个好的习惯

user: user-0
content: #include <stdio.h> #include <conio.h> void fun(char *a) {  int i,n=0;  char *p;  p=a;  while(*p=='\0')  {  	n++;p++;  }  while(*p)  {  	a[i]=*p;  	i++;  	p++;  }  while(n!=0)  {  	a[i]='*';  	i++;  	n--; 	  } }  main() { 	char s[81],*p; 	char test[4][80]={"*********A*BC*DEF*G*****","A********B*CD*EF*G*","*****A*****G*","*d**b**a**e*"}; 	int i; 	printf("please enter a string:\n"); 	gets(s); 	fun(s); 	printf("the string after moving :\n"); 	puts(s); 	 }
user-0 提问: 请教大家一个关于三角函数的计算问题

回复:
user: user-0
content: 真的没有解法吗，呼唤数学高手啊！

user: user-1
content: 好神奇的提问

user: user-2
content: 这个方程用matlab帮你求解了，是没有解的

user: user-3
content: 不能直接求出来的话，可以用数值解法 如果非要精确解，用matlab 符号演算功能　计算

user: user-2
content: 这其实是数学问题，一种就自己解出来，然后用程序带公式，或者用程序去逼近  C/C++你要写出可以自己去解这种方程的程序很难的，不然你可以考虑用matlab，直接把方程输入进去，就可以帮你求解出来

user: user-4
content: 引用 3 楼 yuelengdihai 的回复:y=log((1+sin(a))/(1-sin(a))) - x*log((1+x*sin(a))/(1-x*sin(a))) 有问题 x、y都等于1时等式不成立啊 好像没限定y值

user: user-4
content: y=log((1+sin(a))/(1-sin(a))) - x*log((1+x*sin(a))/(1-x*sin(a))) 有问题 x、y都等于1时等式不成立啊

user: user-0
content: 引用 1 楼 user-5 的回复:这得发到数学版吧，如果有的话。 先把 sin(a) 看作整体，解方程求出 sin(a) 后再用反三角求 a。 是啊,这个sin(a)我实在求不出来

user: user-5
content: 这得发到数学版吧，如果有的话。 先把 sin(a) 看作整体，解方程求出 sin(a) 后再用反三角求 a。
user-0 提问: 关于 volatile  ，进来看看

回复:
user: user-1
content: volatile修饰的变量，只是保证一个线程修改后，其余的线程访问时能，马上得到修改后的值(也就是能立刻感知到)。如果没有volatile修饰，编译器优化的时候，很可能只是读取修改前的内存数据，不能立刻读取到改变后的值。

user: user-2
content: volatile不是用来保证线程安全的，要保证线程安全得自己加锁

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

user: user-4
content: volatile并不保证线程安全
user-0 提问: 一个程序题，麻烦帮我看下

回复:
user: user-1
content: n+(n-7)/13*7+((n-7)%13+7)/2;

user: user-2
content: 上边贴的有bug，先得算完优惠的，再算普通的 int bottle(int n) { 	int nCount = n;   // 首先可以喝n瓶饮料 	while (n > 19)   // 大于19个空瓶子有优惠 	{ 		nCount += 7*n/20;	  // 优惠条件可兑换的饮料数 		n = 7*n/20 + n%20;    // 优惠条件后的空瓶子数 	} 	while (n > 2)     // 大于2个空瓶子可以兑换 	{ 		nCount += n/3;            // 非优惠条件可兑换的饮料数 		n = n/3+n%3;			  // 喝剩的空瓶数  	} 	if (n == 2)   // 如果剩两个可以借老板一瓶，喝掉后，三个空瓶再换一个还给老板，所以喝掉的饮料数再加1 	{ 		nCount++; 	} 	return nCount; }

user: user-2
content: 仅供参考 int bottle(int n) { 	int nCount = n;   // 首先可以喝n瓶饮料 	while (n > 2)     // 大于2个空瓶子可以兑换 	{ 		if (n > 19)   // 大于19哥空瓶子有优惠 		{ 			nCount += 7*n/20;	  // 优惠条件可兑换的饮料数 			n = 7*n/20 + n%20;    // 优惠条件后的空瓶子数 		} 		nCount += n/3;            // 非优惠条件可兑换的饮料数 		n = n/3+n%3;			  // 喝剩的空瓶数  	} 	if (n == 2)   // 如果剩两个可以借老板一瓶，喝掉后，三个空瓶再换一个还给老板，所以喝掉的饮料数再加1 	{ 		nCount++; 	} 	return nCount; }
user-0 提问: 怎样识别U盘中的数据是否更换过

回复:
user: user-0
content: 顶起来，哪位大神知道啊。。。。。

user: user-1
content: 计算文件md5即可，  md5有雪崩效应，文件的一个bit被篡改，那么新的md5值不一样！！

user: user-2
content: Fwatch Sample: Using ReadDirectoryChangesW API  Click to open or copy the Fwatch project files.  The Fwatch sample displays changes to watched directories and files in the command window. The directories and files to be watched are specified in the Fwatch.ini file, which you can leave in the application directory.   Building SDK Samples   This sample uses the following keywords:  checkchangedfile; closehandle; createdirectory; createfile; createiocompletionport; createthread; exit; filetimetolocalfiletime; filetimetosystemtime; getch; getcurrentdirectory; getfileinformationbyhandle; getlasterror; getprivateprofilestring; getqueuedcompletionstatus; handledirectorychange; lstrcat; lstrcmpi; lstrcpy; lstrlen; postqueuedcompletionstatus; readdirectorychangesw; waitforsingleobject; watchdirectories; wprintf

user: user-3
content: 主要是先确定思路，到具体的功能实现比如如何获取文件时间，如何计算md5，如果不知道怎么做，完全可以用百度去搜搜。

user: user-3
content: http://blog.csdn.net/liuyan4794/article/details/8788069 讲了如何计算文件的md5值，也是用的VC，可以参考着改成C语言班的。

user: user-3
content: 引用 4 楼 chengnan5603 的回复:[quote=引用 1 楼 piaobotudou 的回复:] 判断文件属性中的文件修改日期时间，甚至还可以比较md5 能再说的具体些吗？比如方法或API之类的。谢谢~ [/quote]  看看这个http://blog.csdn.net/awu999328/article/details/24470621 里面讲了如何获取文件创建、修改时间的，因为你用的是C语言可以忽略里面的路径获取结果显示部分，关注如何用CreateFile打开文件GetFileTime获取相关时间的功能。

user: user-0
content: 能再说的具体些吗？比如方法或API之类的。谢谢~

user: user-0
content: 引用 楼主 chengnan5603 的回复:正在使用C语言做U盘数据媒体解析工作，并把解析出的数据存入DB。 现在希望同一U盘在数据不变的前提下，不再重复解析，而是复用之前解析好的数据。 请问，该如何判断U盘中的数据是否更换过？ 能再说的具体些吗？比如方法或API之类的。谢谢~

user: user-0
content: 引用 1 楼 piaobotudou 的回复:判断文件属性中的文件修改日期时间，甚至还可以比较md5 能再说的具体些吗？比如方法或API之类的。谢谢~

user: user-2
content: linux下有没有和windows下的ReadDirectoryChangesW功能类似的函数我还真不知道。

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:Fwatch Sample: Using ReadDirectoryChangesW API  Click to open or copy the Fwatch project files.  The Fwatch sample displays changes to watched directories and files in the command window. The directories and files to be watched are specified in the Fwatch.ini file, which you can leave in the application directory.   Building SDK Samples   This sample uses the following keywords:  checkchangedfile; closehandle; createdirectory; createfile; createiocompletionport; createthread; exit; filetimetolocalfiletime; filetimetosystemtime; getch; getcurrentdirectory; getfileinformationbyhandle; getlasterror; getprivateprofilestring; getqueuedcompletionstatus; handledirectorychange; lstrcat; lstrcmpi; lstrcpy; lstrlen; postqueuedcompletionstatus; readdirectorychangesw; waitforsingleobject; watchdirectories; wprintf 大神，这个是windows下用的API吧？请问有linux下能用的吗？

user: user-0
content: 引用 7 楼 piaobotudou 的回复:主要是先确定思路，到具体的功能实现比如如何获取文件时间，如何计算md5，如果不知道怎么做，完全可以用百度去搜搜。 谢谢，你的意思我明白了。感谢！

user: user-3
content: 判断文件属性中的文件修改日期时间，甚至还可以比较md5
user-0 提问: 问一个关于结构体排序的问题

回复:
user: user-1
content: 楼主首先要理解strcmp的作用： strcmp 编辑 C/C++函数，比较两个字符串 设这两个字符串为str1，str2， 若str1==str2，则返回零； 若str1>str2，则返回正数； 若str1<str2，则返回负数。 也就是说这个cmp比较了两个结构体中str的大小，然后返回一个值，外面调用这个函数，根据返回值判断是否需要将两个结构体互换。  然后再说内部的return strcmp( (*(Sample *)a).str , (*(Sample *)b).str ); a、b是两个void*，当传入的参数将地址传给a、b，而a、b本身就是Sample结构体，因此就可以通过类型转换将a、b转成Sample结构体。然后取这两个结构体中的str字符串进行比较。 当然楼主也可以少几个*，通过->来调用结构体中的str。 printf("%s %s\n", ((struct Sample *)a)->str , ((struct Sample *)b)->str);

user: user-2
content: 来晚了，基本按照1楼的方法就可以了，先比较字符串，如果相同了再比较int元素，比较的方法都是把形参的void*强制转化为对应的结构体，然后取其中要比较的元素来比较，返回比较的差值就行了，如果是降序那就是b-a

user: user-3
content: 1、 (*(Sample *)a).str ： (Sample *)a —— 将void强制转换为Sample* (*(Sample *)a) —— 取得Sample*指向的内容 (*(Sample *)a).str —— 取得Sample*内容（结构体）的字符串 2、 Strcmp比较的是字符串按照字典排序的大小，比较整型大小直接减就好了

user: user-4
content: 估计cmp这个函数是作为qsort()函数的参数的，所以cmp的参数是void *类型。但是在cmp函数体中，把它们转换成了Sample *类型，再用*找到它们所指向的对象，然后取得对象的str成员，作为strcmp的参数。 如果在字符数组成员相同的情况下按照整型成员排序，可以这样 int cmp ( const void *a , const void *b ) { 	int		res = strcmp((*(Sample *)a).str, (*(Sample *)b).str); 	if (res == 0) 		res = (*(Sample *)a).data - (*(Sample *)b).data; 	return res; }
user-0 提问: 结构数组的问题

回复:
user: user-1
content: 引用 10 楼 JackyRao 的回复:中文应该是w_开头的函数 不一定

user: user-2
content: 中文应该是w_开头的函数

user: user-3
content: 另外 char  不够输入一个汉字

user: user-4
content: num 和 name 前面不需要&

user: user-3
content: &stu[i].name 你是打算输入指针？

user: user-5
content: 把scanf里边参数地址&后边的各项用括号括起来

user: user-0
content: 引用 1 楼 user-6的回复:输入的各项之间用逗号隔开——因为你的scanf函数中要求输入逗号 我试过了，还是有问题

user: user-0
content: 引用 5 楼 paschen的回复:num 和 name 前面不需要& 但书上说要加&符号。。。。。

user: user-0
content: 引用 4 楼 lm_whales的回复:&stu[i].name 你是打算输入指针？ 。。。。。。。。。。

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

user: user-6
content: 输入的各项之间用逗号隔开——因为你的scanf函数中要求输入逗号
user-0 提问: void* a = &a; 求指教！

回复:
user: user-1
content: 3.3.2 Point of declaration [basic.scope.pdecl] 1 The point of declaration for a name is immediately after its complete declarator (Clause 8) and before its initializer (if any), except as noted below. [ Example: int x = 12; { int x = x; } Here the second x is initialized with its own (indeterminate) value. — end example ]  标准必须明确定义从源程序的哪一点开始一个变量就变得可用。 现在这一点选在了初始化(initializer)出现之前，也就是说，在 initializer 里，这个变量就已经定义了。

user: user-2
content: 引用 1 楼 qq423399099 的回复:一般来说，变量总是先声明然后初始化的,其中初始化是可选的。所以当编译器看到void* a的时候就可以认为是已经分配好了a的空间，这时a的地址也就有效了。 #include <stdlib.h> #include <stdio.h>  int main() {     void *a = &a;     printf("%p %p \n", a, &a);     return 0; }

user: user-3
content: 一般来说，变量总是先声明然后初始化的,其中初始化是可选的。所以当编译器看到void* a的时候就可以认为是已经分配好了a的空间，这时a的地址也就有效了。
user-0 提问: freopen函数只读入文件得一部分

回复:
user: user-1
content: 没有考虑空行的情况  #include <stdio.h>  int main(void) { 	int n, m; 	int ret = 0; 	FILE* fp = NULL; 	 	fp = freopen("1.txt", "r", stdin); 	if (NULL == fp) 	{ 		printf("freopen failed.\n"); 		return -1; 	} 	 	while (1) 	{ 		ret = scanf("%d %d", &n, &m); 		if (EOF == ret) 		{ 			break; 		} 		else if (ret != 2) 		{ 			continue; 		} 		 		printf("n = %d, m = %d\n", n, m); 	}  	fclose(fp); 	return 0; }

user: user-2
content: 第二次循环时, head没有清零
user-0 提问: 编写斐波那契数列，出现该内存不能为“read”，这是为什么？

回复:
user: user-0
content: 谢谢，知道了

user: user-1
content: int a[21];

user: user-2
content: 声明时int a[20] a[0 --- 19]是可用的。所以for 里面应该是i<20不是i<21
user-0 提问: 读取文件内容生成对应的文件夹

回复:
user: user-0
content: 引用 1 楼 qq423399099 的回复: #include<iostream> #include<iomanip>  #include<fstream> #include<string> using namespace std;  int main() { 	char buffer[256] = {0}; 	string original_path = "e:"; 	string path_name[5] = {"", "", "", "", ""};//创建一个string数组用来存放每层文件夹的名字,假定最多只有5层 	ifstream myfile ("e:\\data.txt"); 	if(!myfile) 		cout << "Unable to open myfile";   	else 	{ 		while (!myfile.eof())   		{   			string cur_path = "md " + original_path; 			myfile.getline(buffer,10); 			string data(buffer); 			for(int i = 0; i < 10; i++) 			{ 				if(data[i] != '\t') 				{ 					path_name[i] = data.substr(i); 					cur_path = cur_path + "\\" + path_name[i]; 					break; 				} 				cur_path = cur_path + "\\" + path_name[i]; 			} 			cout << cur_path << endl; 			system(cur_path.c_str()); 		}   	} 	system("pause"); }    还有问题，能加你个QQ，细问吗

user: user-1
content: #include<iostream> #include<iomanip>  #include<fstream> #include<string> using namespace std;  int main() { 	char buffer[256] = {0}; 	string original_path = "e:"; 	string path_name[5] = {"", "", "", "", ""};//创建一个string数组用来存放每层文件夹的名字,假定最多只有5层 	ifstream myfile ("e:\\data.txt"); 	if(!myfile) 		cout << "Unable to open myfile";   	else 	{ 		while (!myfile.eof())   		{   			string cur_path = "md " + original_path; 			myfile.getline(buffer,10); 			string data(buffer); 			for(int i = 0; i < 10; i++) 			{ 				if(data[i] != '\t') 				{ 					path_name[i] = data.substr(i); 					cur_path = cur_path + "\\" + path_name[i]; 					break; 				} 				cur_path = cur_path + "\\" + path_name[i]; 			} 			cout << cur_path << endl; 			system(cur_path.c_str()); 		}   	} 	system("pause"); }
user-0 提问: typedef定义类型

回复:
user: user-1
content: typedef typedef type-declaration synonym;  The typedef keyword defines a synonym for the specified type-declaration. The identifier in the type-declaration becomes another name for the type, instead of naming an instance of the type. You cannot use the typedef specifier inside a function definition.  A typedef declaration introduces a name that, within its scope, becomes a synonym for the type given by the decl-specifiers portion of the declaration. In contrast to the class, struct, union, and enum declarations, typedef declarations do not introduce new types — they introduce new names for existing types.  Example  // Example of the typedef keyword typedef unsigned long ulong;  ulong ul;     // Equivalent to "unsigned long ul;"  typedef struct mystructtag {    int   i;    float f;    char  c; } mystruct;  mystruct ms;   // Equivalent to "struct mystructtag ms;"  typedef int (*funcptr)();  // funcptr is synonym for "pointer                            //    to function returning int"  funcptr table[10];   // Equivalent to "int (*table[10])();"

user: user-2
content: 用List作为void的别名  关键要明白typedef的用法，自然就明白了

user: user-3
content: C,C++ void 类型，只是个方便的类型 不具有一般类型的特性 例如，不能定义 void 类型变量 这里把 List 定义为 void 估计只是想使用 void *,而不是 void 根据望名知意原则，标识符，特别是类型名，应该一看就知道是做什么的 List 显然是个表类型，个人认为，这样定义，可能是打算使用 void * 当然这只是猜测，必须看到源代码，才知道为何这么做

user: user-4
content: List只是void的别名而已，就像一个人的大名叫张三，而他的小名叫小张，这里的张三就是void，小张就是List。 引用 3 楼 lm_whales 的回复:要看源码，不然 List 就是 void 这个答案，估计很难令人满意 大神，求问还有别的解释，可以举几个例子么？

user: user-5
content: typedef void List  就是给void定义一个list这样的名字。就想你叫void，然后给你又起了个名字List。  void是一种无类型的数据结构，

user: user-3
content: 要看源码，不然 List 就是 void 这个答案，估计很难令人满意

user: user-6
content: 见http://baike.baidu.com/link?url=jtD-QeAfVCOhSchQdQmKEKBXhW5SVuvAyLSc-sw80l4WEnkJzQ0Ux0opJKcvvRw3MG7KysiHcPlvhI7HfxnPDK

user: user-7
content: List 就是void  List是void的别名.
user-0 提问: 杭电ACM OJ问题

回复:
user: user-1
content: 3楼正解

user: user-2
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，搬手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-3
content: 用了pow,这是为浮点数用的, 改成sum+=i*i, sum2+=i*i*i,另外感觉没判断a,b大小,

user: user-4
content: 哪里少一了？
user-0 提问: 新手学习《自制编程语言》关于yacc的疑惑

回复:
user: user-1
content: 你好，可以看一下你的yacc代码吗，打到一半不知道怎么解析自定义的函数

user: user-2
content: 不可省略  Expression上右键——转到定义

user: user-3
content: 不可以省略。  换名字应该是在什么地方有 typedef ，你找找 ...（得在 yacc 编译之后的文件里找）
user-0 提问: 用两个int表示一个int实现定点数加减乘除

回复:
user: user-1
content: 高精度计算字符才是王道，楼主这种方式小数部分相乘的时候也会溢出的吧？ 按照楼主这种方式，小数部分也拆成几个整数，假如int最多能表示3位，那就要把前面的乘数两位一拆，后面的乘数一位一拆，然后算乘法，乘法完成后再加到一起，加的时候还得判断每个位是否需要进位。

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:仅供参考：#include <stdio.h> #include <locale.h> #define M 10000 int main() {     unsigned a[M];     //以无符号整形存，每10000为一进位，即数组每个元素最大9999     unsigned long k;   //k用来保存每次乘积     int i,j,m,t,n=1,r; //n是数组长度，r是进位      setlocale(LC_ALL,"chs");     a[0]=1;     while (1) {         printf("\n输入m t(用万进制方法求m的t次方):");fflush(stdout);         rewind(stdin);         if (2==scanf("%d %d",&m,&t)) {             if (m>1 && t>1) break;             else printf("要求m>1且t>1");         }     }     for (j=0;j<t;j++) {         r=0;         for (i=0;i<n;i++) {             k=a[i]*m+r;             a[i]=k%10000;             r=k/10000;         }         while (r>0) {             a[n++]=r%10000;             if (n>=M-1) {                 printf("%d的%d次方超过万进制%d位,无法计算!\n",m,t,M);                 return 1;             }             r/=10000;         }     }     printf("%d的%d次方=",m,t);     for (i=n-1;i>=0;i--) {         if(i==n-1) printf("%d"  ,a[i]);         else       printf("%04d",a[i]);     }     return 0; }   谢谢！实际上我的需求可能与这个还有出入，就是不想让它转成字符数组。因为是浮点转定点，比如1.01234567*1.01234567，我要把它转成两个定点数（int）相乘，由于精度要求比较高，可能需要20bit精度，即1.01234567*(1<<20)，这样，两个int相乘就溢出了，所以我就想把1.01234567变成两个int，一个表示整数部分，一个表示小数部分，这样相乘，可能会解决溢出问题。

user: user-2
content: 算法参考小学算数中的竖式实现加减乘除。

user: user-3
content: 搜“大整数加减乘除”

user: user-2
content: 仅供参考：#include <stdio.h> #include <locale.h> #define M 10000 int main() {     unsigned a[M];     //以无符号整形存，每10000为一进位，即数组每个元素最大9999     unsigned long k;   //k用来保存每次乘积     int i,j,m,t,n=1,r; //n是数组长度，r是进位      setlocale(LC_ALL,"chs");     a[0]=1;     while (1) {         printf("\n输入m t(用万进制方法求m的t次方):");fflush(stdout);         rewind(stdin);         if (2==scanf("%d %d",&m,&t)) {             if (m>1 && t>1) break;             else printf("要求m>1且t>1");         }     }     for (j=0;j<t;j++) {         r=0;         for (i=0;i<n;i++) {             k=a[i]*m+r;             a[i]=k%10000;             r=k/10000;         }         while (r>0) {             a[n++]=r%10000;             if (n>=M-1) {                 printf("%d的%d次方超过万进制%d位,无法计算!\n",m,t,M);                 return 1;             }             r/=10000;         }     }     printf("%d的%d次方=",m,t);     for (i=n-1;i>=0;i--) {         if(i==n-1) printf("%d"  ,a[i]);         else       printf("%04d",a[i]);     }     return 0; }

user: user-4
content: 拆成4个short

user: user-0
content: 引用 2 楼 user-5 的回复:按你的假设,int只能留3个数字,2个int最多6位, 123456*78得到7位数字,本来就溢出  那我就用3个int表示乘法结果9629568.意思就是这个样子。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:算法参考小学算数中的竖式实现加减乘除。 123456*78，第一个乘数拆成两个int，123和456，我先用456*8，此时已经溢出了啊，我怎么把结果转到另一个int，然后另一个int和该int表示456*78的结果？ 我不能用类似大数乘法的策略，开一个int数组每个int只表示一位数，内存不允许。谢谢！

user: user-5
content: 按你的假设,int只能留3个数字,2个int最多6位, 123456*78得到7位数字,本来就溢出
user-0 提问: 求助！ffmpeg里联合(union)的c代码如何移植到Windows

回复:
user: user-0
content: 楼上解决了我的问题，也就是说vc++不支持union定义时初始化

user: user-0
content: typedef union { 	int64_t i64; 	double dbl; } default_val; default_val options[2]; options[0].i64 = 2; options[1].dbl = 1.0;

user: user-1
content: typedef union {         int64_t i64;         double dbl;     } default_val; default_val options[] = { {.i64 = 2}, {.dbl = 1.0} };
user-0 提问: 总线同步通信这张图各位，能不能形象的解释一下。不是很理解

回复:
user: user-1
content: 引用 15 楼 hfxujing1 的回复:[quote=引用 13 楼 zhao4zhong1 的回复:] 数字逻辑电路→计算机组成原理→DOS命令→ 没办法，我还在说3月底之前搞定 计算机组成原理这 本书 。看来有点麻烦啊[/quote] 带着一个确定的问题去看书，在书中只挑能帮你理解或解决这个问题的知识点。速度应该比你想象的快至少10倍。 意思是比如你估计看完这本书需要10天，但你带着一个问题在这本书中找答案的话，最多也就1天。 个人经验。

user: user-1
content: 数字逻辑电路→计算机组成原理→DOS命令→

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  楼主要想真正理解透彻总线相关技术，可能得学会使用逻辑分析仪了。 。。一个知识关联到另外的知识。基础啊。。。。底子太薄了

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  楼主要想真正理解透彻总线相关技术，可能得学会使用逻辑分析仪了。

user: user-2
content: 同步传输是说，用同一个时钟，处理不同（或者相同）频率的器件，传输一致性问题 通常一个传输周期，是一个或者几个时钟周期。 如果仅仅是这样，也难以同步不同频率的器件 现在，采用同一个时钟。确定下，地址信号，读/写信号，数据信号的时序 即 那个信号先到，那个信号先结束的这个顺序 另外信号还包括是电平信号，还是沿信号，上升沿，还是下降沿 等等 通常 同步读写，在频率不一致时候，一方需要等待另一方，这会插入若干等待时钟周期。 插入的时钟周期，是按照同步时钟计数的 如果没有统一的时钟，同步会更复杂

user: user-3
content: 怎么让我想起了大学里的《计算机组成原理》，都忘干净了。。。。

user: user-2
content: 存储器现在都是模块化的了 一般原来1Bits的存储器， 都会集成为   8Bits(1*9 )  9个（1*1024，1*2048，1*1M，等等大小的1Bit）存储块  或者  16Bits（1*18） 18 个个（1*1024，1*2048，1*1M，等等大小的1Bit）存储块  可能还有更大 位数的，更大地址单元的存储块 应该没有 单独 1Bits 的了（某些专用存储器可能还有，主流存储块，都不再是1Bits的了） PC一般采用 内存条， 是把 许多存储块焊接在一块PCB板上，主流都是8GBytes了 而 PC上的显卡上，都集成速度更快的 显存， 目前主流也已经4G Bytes了 例如  主流级 影驰GTX 960名人堂4G  显存容量： 4096MB  入门级 影驰GT710冰鳞2G 显存容量： 2048MB

user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:数字逻辑电路→计算机组成原理→DOS命令→ 没办法，我还在说3月底之前搞定 计算机组成原理这 本书 。看来有点麻烦啊

user: user-0
content: 引用 3 楼 wang0635 的回复:总线工作频率为33MHZ说的是一秒钟有33M个总线传输周期（不是时钟周期） 32位宽度指的是数据线有32条 一个传输周期传送32位数据，4字节 数据传输速度就是一秒钟4*33字节 你好，我在看计算机组成原理，第三张的总线还好。但到了第四章 存储器哪里，里面的电路图给我搞晕了。  首先，我一个地方一个地方的来。  行地址译码器 右边 0 ，0到31 ，31中间的0到31，一共有32根线（加上0这根),也就说 这个存储器是32位的？ 对吗

user: user-4
content: 1k x 1位，指的是1k个单元，每一个单元是1位的 所以，需要10条地址线，用来选择区分每一个单元；1条数据线，对选择的那个单元进行数据读写

user: user-0
content: 引用 3 楼 wang0635 的回复:总线工作频率为33MHZ说的是一秒钟有33M个总线传输周期（不是时钟周期） 32位宽度指的是数据线有32条 一个传输周期传送32位数据，4字节 数据传输速度就是一秒钟4*33字节 我没找到微机原理的版块，所以就在这个区域提的问。 关于 这是一个1k x 1位的存储芯片这句话。 意思说 一块存储芯片它的总量是1KB 也就是1024字节， 但是它存取数据的格式必须是1位1位的存。 也就是说它能存取 1024字节 x 每字节8位=8192位 0或者1 ？ 对吗？

user: user-5
content: 引用 4 楼 zhao4zhong1 的回复:我确定一定以及肯定，这不是C语言知识。 微机原理有这些知识。

user: user-0
content: 引用 楼主 hfxujing1 的回复: 大哥在问一个，总线的。 总线工作频率 为33MHZ.意思就是说这组总线每秒钟能够传输数据33次吗？33MHz是震荡了33次？ 总线宽度是32位，我记得教材上好像说过总线是有一根根的信号线组成的1位就是一根信号线。 也就是说1根信号线传输1位数据？  总线工作频率是33MHz，总线宽度是32位它的传输速度是33 x 32/8=132MB/s.

user: user-1
content: 我确定一定以及肯定，这不是C语言知识。

user: user-4
content: 总线工作频率为33MHZ说的是一秒钟有33M个总线传输周期（不是时钟周期） 32位宽度指的是数据线有32条 一个传输周期传送32位数据，4字节 数据传输速度就是一秒钟4*33字节

user: user-4
content: 首先发出地址，让被寻址的部件做好准备 随后是读信号 T3结束时，采样数据线上的数据 不管对方是否把数据送出来了，都采样一下子 硬件上应事先算好了，到时候不会出问题 这就是同步，二者步调一致
user-0 提问: dos下C语言打印二维码图片,100分

回复:
user: user-0
content: 生成没问题，就是DOS下用热敏打印

user: user-1
content: 参考 https://github.com/fukuchi/libqrencode 源码

user: user-0
content: 引用 4 楼 赵4老师的回复:找一个可在DOS下工作的热敏打印的例子程序参考之。 没有啊，你有没有啊，多谢了

user: user-2
content: 找一个可在DOS下工作的热敏打印的例子程序参考之。

user: user-3
content: 参考EasyX，仿Turbo C的BGI的绘图库，有完整函数手册。
user-0 提问: C语言连续读取连续命名的文本文件内容的程序

回复:
user: user-1
content: 有了答案 就赶紧给分结贴

user: user-0
content: 是的，通过sprintf实现了，多谢二楼

user: user-2
content: 2楼正解，在循环中使用sprintf就可以格式化生成字符串。

user: user-3
content: 你要的是这个：  int main(void) { 	int i; 	char filename[20]; 	for (i = 1; i < 12; i++) { 		sprintf(filename, "%d.txt", i); 		printf("%s\n", filename); 	} 	return 0; } //1.txt //2.txt //3.txt //4.txt //5.txt //6.txt //7.txt //8.txt //9.txt //10.txt //11.txt

user: user-0
content: 为什么没有人回复我呢？
user-0 提问: 关于可变参数va_list

回复:
user: user-1
content: 难道在传进来之前就不能用va_start初始化过了。你可以看看这个函数使用的上下文。

user: user-2
content: 在64位系统下，写个使用va_xxxx的一小段代码，然后查看其对应的64位汇编指令，看看和在32位系统下对应的32位汇编指令在具体实现机制上是不是没啥本质区别。  声明不是我懒啊，我手边没64位系统。（只为失败找理由，不为成功找方法。）

user: user-3
content: 引用 6 楼 zhao4zhong1 的回复:调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx 在以上约定下，实现va_list，va_start，va_arg，va_end应该更复杂了吧。 va_list，va_start，va_arg，va_end 等宏 是C方式的 可变参数函数使用的 这些函数是 C 调用约定函数 所有参数 按照C调用约定 入栈传递 所以，C,C++ 实现起来，不用考虑 函数调用约定 所有比 int 短的整型（包括指针），一律按照整形处理 也就是整型参数 只有 int ,long ,long long 三种长度的整型 float ,double 按照 double 长度处理 long double 类型，由于种种原因，标准没有统一长度，因此不再考虑之列  至于其他调用约定，会被忽视的 除非编译器有更好的办法，不会实现为其他调用约定。  估计C++成员函数，定义为C式参数可变函数（不是C++那种模板参数可变函数）， 除了 this 指针的传递外，其它参数也是C调用约定的传递方式。

user: user-3
content: va_list 本身并不复杂，通常的实现只是个指针类型。 真正复杂的是  va_start, va_arg, 而 va_end  也很简单，大部分实现都是什么都不做， 但是考虑到，某些系统可能会需要做收尾处理， 所以这个 宏 的存在和调用，也是必要的， 。  实际上，char ,short  等类型 va_arg 实现起来，没有难度， 但是某些编译器比如 GCC 考虑的太过奇葩了一点 于是 va_arg 就只能取 指针，int,long ,以及 更新的 long long ,double 等类型了 float 是唯一的 va_arg 难以处理的类型，因为不论从对齐还是别的方面来考虑， 不从语言上想办法， 仅仅靠宏，和C 现有语法语义， 难以实现   va_arg 对 float 的处理。

user: user-4
content: 不知道楼主是否自己尝试编写一个可变参数程序 #include <stdlib.h> #include <stdio.h> #include <stdarg.h>  void print(va_list args) {     int i;     for(i = 0; i < 5; i ++)     {         printf("%d ", va_arg(args, int));     }     va_end(args);  }  int forVaArg(int x, ...) {     va_list args;     int i;     va_start(args, x);     print(args);     return 0; }  int main(int argc, char *argv[]) {     forVaArg(4, 5, 5, 2, 1, 8, 9);     return 0; }  如果注释掉va_start就会打印出错误的数据，因为找不到参数起始地址。书中估计因为篇幅的原因有部分代码省略掉了。

user: user-2
content: 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx 在以上约定下，实现va_list，va_start，va_arg，va_end应该更复杂了吧。

user: user-5
content: va_list 也是一个变量啊，当然可以做参数使用。

user: user-6
content: 应该在函数CreatePoint中调用了吧。              #include <varargs.h>             void            foo(va_alist)                va_dcl            {                va_list ap;                 va_start(ap);                while (...) {                    ...                    x = va_arg(ap, type);                    ...                }                va_end(ap);            }

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  VS IDE中，在不明白的符号上点鼠标右键，选转到定义或转到参考。
user-0 提问: 关于C语言读写文件的问题

回复:
user: user-0
content: 没有空行 我看过了  如果是空行 就会多出2个0  之后空行被我删除之后  还是多出一个 0   必须在 读完 将count-- 才能读出正确的数值

user: user-1
content: 因为文件的结尾是空行，你结尾有多少个空行 就能读多少个0出来。  atoi返回0便是是一次无效的转换，转换回车符为数字当然无效。

user: user-0
content: 补充一点  是在linux 环境下

user: user-0
content: 代码如下 在最后一个数读完后 总会读到一个0 for (count=0; (!(feof(p))); count++) 	{ 		memset(tembuf,0,sizeof(tembuf)); 		fgets(tembuf, sizeof(tembuf), p);  		num[count] = (int )atoi(tembuf); 	}

user: user-2
content: 正常的文件读写都不会读出与源文件不符的内容，估计楼主的写法不合理导致，方便的话可以贴个代码来瞧瞧。 可以网上搜索，很多文件操作的标准例子。  #include <stdio.h> void main(int argc,char *argv[]) //命令行参数 {     int ch;//定义文件类型指针     FILE *fp;//判断命令行是否正确     if(argc!=2)     {         printf("Error format,Usage: display filename1\n");         return; //键入了错误的命令行，结束程序的执行     }     //按读方式打开由argv[1]指出的文件     if((fp=fopen(argv[1],"r"))==NULL)     {         printf("The file <%s> can not be opened.\n",argv[1]);//打开操作不成功         return;//结束程序的执行     }     //成功打开了argv[1]所指文件     ch=fgetc(fp); //从fp所指文件的当前指针位置读取一个字符     while(ch!=EOF) //判断刚读取的字符是否是文件结束符     {         putchar(ch); //若不是结束符，将它输出到屏幕上显示         ch=fgetc(fp); //继续从fp所指文件中读取下一个字符     } //完成将fp所指文件的内容输出到屏幕上显示     fclose(fp); //关闭fp所指文件 }

user: user-3
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-1
content: 没有，你是用fscanf/fgets函数吧，他们文件的换行变成字符串结尾‘\0’
user-0 提问: 数组初始化的问题

回复:
user: user-1
content: []里不注明大小，那么久根据初始化的元素个数自动计算，其他没多大区别

user: user-2
content: 除了定义方法不同，数组大小不同，其他并没有什么不同吧。 char num[] = {0}; //这种也明确了数组大小，其为初始化数据的大小

user: user-3
content: 除了数组大小不一样，别的没什么区别吧。

user: user-4
content: 第二个 明确了数组的大小，就是后面你的数据个数，也就是 1  第一个 和 第二个 完全不是一回事。
user-0 提问: unicode是什么东西?

回复:
user: user-1
content: 网上搜索“Unicode”，遇到不懂的学会到网上搜索

user: user-0
content: 引用 5 楼 mymhj 的回复:unicode是一个字符标准，简单理解就是一个定义字符的规定。是为了解决传统的字符编码方案的局限而产生的，它为每种语言中的每个字符设定了统一并且唯一的二进制编码，以满足跨语言、跨平台进行文本转换、处理的要求。  估计楼主是在使用vs进行c++编程时，遇到的疑问吧。你最好再了解一下，什么是utf-8,utf-16,以及他们之间的关系 。然后再查看一下什么是多字节等。按照这个思路走，应该会理解vs下的字符集选项的含义。 能不能介绍比较系统的资料看看?

user: user-2
content: 这么简单的问题 不用不着看书 问度娘就成嘞

user: user-3
content: unicode是一个字符标准，简单理解就是一个定义字符的规定。是为了解决传统的字符编码方案的局限而产生的，它为每种语言中的每个字符设定了统一并且唯一的二进制编码，以满足跨语言、跨平台进行文本转换、处理的要求。  估计楼主是在使用vs进行c++编程时，遇到的疑问吧。你最好再了解一下，什么是utf-8,utf-16,以及他们之间的关系 。然后再查看一下什么是多字节等。按照这个思路走，应该会理解vs下的字符集选项的含义。

user: user-4
content: 王八的屁股——龟腚（规定）

user: user-5
content: 字符集，看看 Windows核心编程第二章

user: user-6
content: 基本上，计算机只是处理数字。它们指定一个数字，来储存字母或其他字符。在创造Unicode之前，有数百种指定这些数字的编码系统。没有一个编码可以包含足够的字符，例如：单单欧洲共同体就需要好几种不同的编码来包括所有的语言。即使是单一种语言，例如英语，也没有哪一个编码可以适用于所有的字母、标点符号，和常用的技术符号。  这些编码系统也会互相冲突。也就是说，两种编码可能使用相同的数字代表两个不同的字符，或使用不同的数字代表相同的字符。任何一台特定的计算机(特别是服务器)都需要支持许多不同的编码，但是，不论什么时候数据通过不同的编码或平台之间，那些数据总会有损坏的危险。  Unicode正在改变所有这一切！  Unicode给每个字符提供了一个唯一的数字，不论是什么平台、不论是什么程序、不论什么语言。Unicode标准已经被这些工业界的领导们所采用，例 如：Apple, HP, IBM, JustSystem, Microsoft, Oracle, SAP, Sun, Sybase, Unisys和其他许多公司。 最新的标准都需要Unicode，例如XML, Java, ECMAScript (JavaScript), LDAP, CORBA 3.0, WML等等，并且，Unicode是实现ISO/IEC 10646的正规方式。许多操作系统、所有最新的浏览器和许多其他产品都支持它。 Unicode标准的出现和支持它工具的存在，是近来全球软件技术最重要的发展趋势。  将Unicode与客户服务器或多层应用程序和网站结合，比使用传统字符集节省费用。Unicode使单一软件产品或单一网站能够贯穿多个平台、语言和国 家，而不需要重建。它可将数据传输到许多不同的系统，而无损坏。  http://www.unicode.org/standard/translations/s-chinese.html
user-0 提问: C 语言 为什么 不能访问ODBC

回复:
user: user-1
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不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

user: user-2
content: C语言是可以访问的。但不建议你使用Turbo C去访问，我估计那已经超过了你的能力。因为ODBC，是Windows下的东西，而Turbo C是DOS下的东西。  你可以使用VC来访问ODBC。  如果你是基于Basic对比的，那你咋不说Turbo Basic为啥不能访问ODBC？

user: user-3
content: 引用 楼主 fxp49 的回复:vc6.0 可以通过ODBC访问数据库。但是C语言（指的是Turbo c）却不能，为什么？ 楼主要分开理解，Turbo c和vc6.0都是编译工具，能不能连接上数据库，就看你的C语音怎么写。这是两回事，不能混淆。

user: user-4
content: 参考   http://www.cnblogs.com/techstone/archive/2012/09/07/2761863.html   希望对你有帮助

user: user-5
content: 怎么就不能访问了？ http://wenku.baidu.com/link?url=8mfFh_4q9ogDns1FvM8eh7x4dMvUoewMeAlELibiooKblcAJ4DKeEpw_VA3MBbWIp0mKvFhYaC_0Tz2dzJZifJ-Hf8BOTC-BPNaHfQvSkBC

user: user-6
content: 这个好比问单车为什么没有变速箱一样
user-0 提问: 谁说进程crash， 则对端收不到fin?

回复:
user: user-0
content: 可能操作系统帮该socket发送了fin吧，

user: user-1
content: 此crash和彼crash不是一样的crash，我猜。 这个世界上过去从来就没发生过两次完全一样的crash，未来也不会发生。

user: user-0
user-0 提问: 求解释一段宏定义

回复:
user: user-1
content: _out,_block ----> 代表参数啊， 估计是 文件句柄，fp 和 要 计算时间  的 代码 ？

user: user-2
content: 按照你给的代码，直接宏展开不就好了吗？ 还有什么不理解的地方。  _block 替换的是语句块 就是TimeBlock(stdout, 后面大括号里的所有语句，就是一次socket通信。  在socket通信前去一下时间，在socket通信后再去一下时间，然后使用函数timersub 计算时间差， 最后使用printf把时间差打印出来。

user: user-3
content: 那就直接查看宏展开后的代码  VS可以这样查看：http://blog.csdn.net/qyee16/article/details/9322281

user: user-4
content: _block 是一段代码块，或者一条语句 _out 是一个文件指针 作用大体上是：把 _block 的执行时间记录到 _out 中去

user: user-0
content: 引用 1 楼 lgbxyz 的回复:这是纯C的吗 还是OC ？ 是C的话， _block  和 _out 还是宏定义， 另外代码贴全了吗，通常有变量定义的宏都是应该有{}限定的， 否则在C99以下标准编译不通过的。 是纯C，这是应用宏定义的代码 TimeBlock(stdout, {         if ((socketfd = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {             LogFatal("socket() failed");         }          memset(&serverAddress, 0, sizeof(serverAddress));         serverAddress.sin_family = AF_INET;         serverAddress.sin_addr.s_addr = inet_addr(serverIPAddress);         serverAddress.sin_port = htons(serverPort);          int on = 1;         if (setsockopt(socketfd, SOL_SOCKET, SO_REUSEADDR, (const char *) &on, sizeof(on)) < 0) {             LogFatal("setsockopt() failed");         }          if (connect(socketfd, (struct sockaddr *) &serverAddress, sizeof(serverAddress)) < 0) {             LogFatal("connect() failed");         }          fileNameLen = strlen(fileName);          if (send(socketfd, fileName, fileNameLen, 0) != fileNameLen) {             LogFatal("send() sent a different number of bytes than expected");         }          totalBytesRcvd = 0; #if DEBUG         fprintf(stderr, "Received: \n"); #endif         for (;;) {              bytesReceived = recv(socketfd, serverResponseBuffer, RCVBUFSIZE, 0);             totalBytesRcvd += bytesReceived;              // printf("%.*s", bytesReceived, serverResponseBuffer);              if (bytesReceived < RCVBUFSIZE) {                 break;             }         }  #if DEBUG         fprintf(stderr, "\n"); #endif          close(sock);     });

user: user-1
content: 比如  FILE *fp = ...;  TimeBlock(fp, func();)

user: user-2
content: 这是纯C的吗 还是OC ？ 是C的话， _block  和 _out 还是宏定义， 另外代码贴全了吗，通常有变量定义的宏都是应该有{}限定的， 否则在C99以下标准编译不通过的。