Question: 指定字符串逆序

void reverseN( std::string &str, int n ) {     int nSize = str.length();     for (int i = 0; i < n; i++)     {         char c = str[i];         str[i] = str[nSize - n + i];         str[nSize - n + i] = c;     } }

仅供参考，如果n大于字符串长度的一半，lz自行修改处理 void reverse(char *str,int n) { 	char *pLeft = str; 	char *pRight = str+strlen(str)-n; 	while (*pRight) 	{ 		char c = *pLeft; 		*pLeft = *pRight; 		*pRight = c; 		pLeft++; 		pRight++; 	} }

#include <iostream> #include<string> using namespace std; string reverse(string str,int n) { 	int len=str.length(); 	if(n>len/2) 	{ 		return str; 	}    for(int i=0;i<n;i++) 	{ 		char tmp; 		tmp=str[i]; 		str[i]=str[len-n+i]; 		str[len-n+i]=tmp; 	} 	return str; } void main() { 	string str="abcdef"; 	cout<<reverse(str,2)<<endl; }

仅供参考 /*************************************************************************     > File Name: reverse.cpp     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月18日 星期二 14时41分32秒  ************************************************************************/  #include<iostream> #include<string> using namespace std; string & reverse(string &str, int n) { 	int i; 	int len = str.size(); 	for( i = 0; i < n ;++i) 		swap(str[i],str[len -n + i]); 	return str; }  void swap(char &a, char &b) { 	char tmp; 	tmp = a; 	a = b; 	b =tmp; }  int main() { 	int n; 	string s; 	cin >> s >> n; 	s = reverse(s, n); 	cout << s << endl; 	return 0; }


Question: 关于for循环的循环变量值的问题

引用 4 楼 love0918 的回复:[quote=引用 3 楼 zhouqinghe24 的回复:] i 先加再 判断 for循环  三段代码的执行顺序  第一段 只开始执行一次，然后每次第三段 先执行，然后判断第二段。  第二段是true ，进入循环。 当i<10 为false 时，i已经赋值为10了  朋友这样解释应该不对吧。如果先执行第三段的 那么i就应该从1开始啦，不应该从0开始。 我在《C程序设计语言》找到关于for循环的解释如下： for循环语句：  for(表达式1;表达式2;表达式3）      语句  等价于下列while语句：  表达式1 while(表达式2）{        语句         表达式3; }  就这个看来，for循环语句执行过程应该是： step1.先执行表达式1,并且之执行一次 step2.然后判断表达式2,                  如果判断为真，则执行setp3;                  如果判断为假，则跳出循环; step3.执行语句 step4.执行表达式3，执行setp2.  朋友，我这样解释不知道你认不认同？[/quote]  嗯 是我搞错了。 脑子没转。。。

引用 4 楼 love0918 的回复:朋友，我这样解释不知道你认不认同？ 有一点错误： 就这个看来，for循环语句执行过程应该是： step1.先执行表达式1,并且之执行一次 step2.然后判断表达式2, //把这句删掉才对                 如果判断为真，则执行setp3;                  如果判断为假，则跳出循环; step3.执行语句 step4.执行表达式3，执行setp2.

引用 3 楼 zhouqinghe24 的回复:i 先加再 判断 for循环  三段代码的执行顺序  第一段 只开始执行一次，然后每次第三段 先执行，然后判断第二段。  第二段是true ，进入循环。 当i<10 为false 时，i已经赋值为10了  朋友这样解释应该不对吧。如果先执行第三段的 那么i就应该从1开始啦，不应该从0开始。 我在《C程序设计语言》找到关于for循环的解释如下： for循环语句：  for(表达式1;表达式2;表达式3）      语句  等价于下列while语句：  表达式1 while(表达式2）{        语句         表达式3; }  就这个看来，for循环语句执行过程应该是： step1.先执行表达式1,并且之执行一次 step2.然后判断表达式2,                  如果判断为真，则执行setp3;                  如果判断为假，则跳出循环; step3.执行语句 step4.执行表达式3，执行setp2.  朋友，我这样解释不知道你认不认同？

更简单的情况：     for (i=0; i<10; i++){         printf("%d\n", i);     } 循环结束之后，i是10而不是9

for (1; 2; 3) {   4; } for循环的执行次序：1--2--4--3--2--4--3--2……跳出循环是2的条件不满足跳出来的。 就这个例子来说，打印"u 9"的时候i是9，然后要执行i++，然后才是getchar收到空行并结束循环，所以跳出循环后i已经是10了


Question: 这个代码哪里错了？请你来找错

26进制，ZZ=27(10进制）？ 开玩笑吧。

引用 20 楼 ForestDB 的回复: # include <stdio.h> # include <stdlib.h> # include <string.h>  int cmp(const void * a, const void * b) {     const char* ca = *(const char* *)a;     const char* cb = *(const char* *)b;     int la = strlen(ca);     int lb = strlen(cb);      if (la == lb)         return - strcmp(ca, cb);     else         return la - lb; }  int main() {     int n;     char* *a;     int i;      scanf("%d", &n);     a = malloc(sizeof(char*) * n);      for (i = 0; i < n; i++)     {         a[i] = calloc(101, sizeof(char));         scanf("%100s", a[i]);     }      qsort(a, n, sizeof(char*), cmp);      for (i = 0; i < n; i++)         printf("%s\n", a[i]);      for (i = 0; i < n; i++)         free(a[i]);      free(a);      return 0; }  谢谢你啊,码代码辛苦了,虽然有些看不懂,但我一定要把它看懂,谢谢!!!

引用 14 楼 myzts 的回复:我的问题就是如何自己控制一个二维字符串的行数（列数因为不超过一行,所以我直接规定列数为80） 比如我输入 2 CAQFQ AGAGGE 如何控制行数,请各位大神解释一下malloc 为什么这个代码执行完成后会报错 #include <stdio.h> #include <stdlib.h> int main() { 	int nr,nc;     int *Array;     int i,j;     scanf("%d %d",&nr,&nc);     Array=(int *)malloc(nr*nc*sizeof(char *));     for(i=0;i<nr;i++) 		for(j=0;j<nc;j++) 		{Array[i*nr+j]=1; 		printf("%d\n",Array[i*nr+j]);} 	free(Array);     system("pause"); 	return 0; }不知道你用的什么编译器，我的c-free和dev-c都能完美编译，没错啊。（注意写程序的风格，就是注意缩进什么的 ，不然看起来很费劲）。。malloc函数给你返回一片内存的地址。具体你可以在这个上找到。http://blog.csdn.net/xw13106209/article/details/4962479

我的目的是想自己输入行数让后输入n行字符

引用 12 楼 u011337306 的回复:C++   vector 不懂啊

C++   vector

引用 6 楼 zhouqinghe24 的回复:做成堆上的数组。 用的时候malloc 就可以了  [quote=引用 5 楼 myzts 的回复:] [quote=引用 4 楼 zhouqinghe24 的回复:] c99 支持这样定义的。 没有C99，在普通编译器里面可以实现吗?[/quote][/quote] 可以把代码发给我吗?我是新手,不懂malloc,,,麻烦了,谢谢

引用 8 楼 hnwyllmm 的回复:我运行了一下，是没有问题的： [wangyl11@rhel149 ~]$ ./a.out  123 3 344532 6 谢谢你,我也测试成功了,可是我还是想知道怎么才能自己输入n,来控制输入的个数,在这个代码里面我应该怎么改? #include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define  n 2 int main() { 	int	i,j;     char a[n][80],b[n][80],t[80];     int len[n+1],sum[n+1]; 	memset(sum,0,sizeof(sum));     for(i=1;i<=n;i++) 	{	gets(a[i]); 		len[i]=strlen(a[i]);         strcpy(b[i],a[i]);     }     for(i=1;i<=n;i++) 		for(j=0;j<=79;j++) 				{a[i][j]=-a[i][j]+91; 				sum[i]+=a[i][j]*pow(26,len[i]-j-1); 				}          	for(i=1;i<=n-1;i++) 		for(j=1;j<=n-i;j++) 			if(sum[j]>sum[j+1])             {strcpy(t,b[j+1]);strcpy(b[j+1],b[j]);strcpy(b[j],t);} 	for(i=1;i<=n;i++) 		puts(b[i]); 	system("pause"); 	return 0; }

对了，我实在Linux上运行的，GCC编译器， 执行的时候只有system("pause");出错了，因为Linux没有pause命令

引用 18 楼 myzts 的回复:引用 17 楼 chi_chen 的回复:[quote=引用 15 楼 myzts 的回复:] 我的目的是想自己输入行数让后输入n行字符那就将原代码中的arra[]=1改为 getchar（）读取，然后赋值就行了，注意放在for，for循环之中。。 麻烦告诉我如何控制字符数组的行数,我不是很了解malloc,可以把代码给我看看嘛?你可以举一个简单的例子,万分谢谢了!!![/quote] scanf("%d", &n) ; char (*p)[80] =  malloc(n * sizeof(80) ) ; 这样就由n个 char [80]了 用完了要释放：free (p)

引用 17 楼 chi_chen 的回复:引用 15 楼 myzts 的回复:我的目的是想自己输入行数让后输入n行字符那就将原代码中的arra[]=1改为 getchar（）读取，然后赋值就行了，注意放在for，for循环之中。。 麻烦告诉我如何控制字符数组的行数,我不是很了解malloc,可以把代码给我看看嘛?你可以举一个简单的例子,万分谢谢了!!!

#include <stdio.h> #include <stdlib.h> int main() { 	char a[2][80];     int i,len[3];     for(i=1;i<=2;i++) 		{gets(a[i]); 		len[i]=strlen(a[i]); 		printf("%d\n",len[i]);         } 	system("pause"); 	return 0; } 想问一个问题,问什么for循环的时候第一次strlen可以正常运行,第二次输入a【1】时候就出错了呢?这是为什么

做成堆上的数组。 用的时候malloc 就可以了  引用 5 楼 myzts 的回复:[quote=引用 4 楼 zhouqinghe24 的回复:] c99 支持这样定义的。 没有C99，在普通编译器里面可以实现吗?[/quote]

引用 4 楼 zhouqinghe24 的回复:c99 支持这样定义的。 没有C99，在普通编译器里面可以实现吗?

c99 支持这样定义的。

引用 2 楼 hnwyllmm 的回复:char a[n+1][80],b[n+1] 这样定义的,n不能是在运行时才能确定的值，一定要是在编译的时候就可以确定的值，比如 #define n 900 char a[n+1][80],b[n+1]; 可是如果我想让n的值由我来控制应该怎么办?


Question: A mysterious error reported by gcc

引用 1 楼 brookmill 的回复:gcc  4.8.2 编译通过。 楼主把MAX_INPUT改个名字再试试吧，我的/usr/include/limits.h里面有个宏定义也叫MAX_INPUT 楼主还可以试试用gcc -E test.c来看看预处理器到底把它弄成什么样了。 谢谢brookmill！我也怀疑就是这个MAX_INPUT宏名在捣鬼，难怪换到VC6编译就不会有事了。而且奇怪的是，我将源文件放到VC6的工程里编译之后再用CodeBlocks编译，竟然通过了！呵呵，编译器的内幕很深啊！

内幕再深，gcc是开源的。


Question: 一个C语言数据类型内部机制的问题

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。

所谓的数据类型就是人为规定的对一串二进制的解释标准

#include <stdio.h> int main() { union { double f; int        a[20]; }u; scanf("%lf",&u.a); printf("%lf",u.f);//看看是不是输出 一个接近 4.94 的数据了  return 0; } int  和 “%lf” 要求的类型不一致， 很多编译器实际上，不检查 格式串 "%lf"， 和 后面的参数类型是否一致。  所以，编译是没有问题的，输入输出结果，就未必正确了 某些时候，还会产生运行时错误

你能看懂我现在说的这句话，是因为你以中文的角度来看中文，如果让一个不懂中文的老外看这句话，那就是乱码。

C语言浮点数在内存中的存储方式和整数是截然不同的，具体资料自行搜索。

int d ； scanf("%lf",&d)  因为  将你输入的值以阶码的形式存进了 d变量的内存中， 阶码直接以int 类型  即补码解析，得到的结果就是你运行出来的结果

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

引用 1 楼 user-8 的回复:数据对于计算机来说都是一系列的01串，但对于人来说这显然无法阅读和理解，所以就形成了各种各样的所谓的数据“类型”这些类型可能有不同的长度，我们只有遵循对应的操作规则才能让计算机对此进行正确的计算，并将结果呈献给我们+1


Question: 关于指针指向函数在vs2013上的错误，求各位大大帮忙

楼主上代码啊

对错误的检查更严了。应该是你原来的代码就有问题，但没触发异常，所以2010下可以运行；2013在debug模式增加了内存检测，检测到有错误，就主动触发异常了。


Question: 求教大虾，Visual Assist(VA)自动填充的头文件全部是大写 怎么办？

用LeCase 批量把文件名改成小写

我的意思是让你对照下面的VS20XX和版本号看前面四个文件分别属于哪个VS20XX。 可以看出：VC6的大写STDIO.H，VS2005、VS2008、VS2010的都是小写stdio.h

引用 14 楼 zhao4zhong1 的回复:C:\Program Files\Microsoft Visual Studio\VC98\Include\STDIO.H C:\Program Files\Microsoft Visual Studio 8\VC\include\stdio.h C:\Program Files\Microsoft Visual Studio 9.0\VC\include\stdio.h C:\Program Files\Microsoft Visual Studio 10.0\VC\include\stdio.h   VS      VS version  .NET Framework     Default in Windows ------  ----------  -----------------  ----------------------------------- -       -           1.0(1.0.3705.0)    - VS2003  7.x         1.1(1.0.3705.0)    Windows Server 2003 VS2005  8.x         2.0(2.0.50727.42)  - -       -           3.0(3.0.4506.30)   Windows Vista | Windows Server 2008 VS2008  9.x         3.5(3.5.21022.8)   Windows 7 | Windows Server 2008 R2 VS2010  10.x        4.0(4.0.30319.1)   - VS2012  12.x        -                  -  赵老师的功夫已入化境，博大精深，小弟见识浅薄，除了知道各个VS版本应该装那种.net Framework外，就不知道赵老师想表达啥了  小弟的电脑上用的是VC++6.0和VS.net2003,电脑上已经安装了赵老师所列的1.1到4的所有版本.net Framework  不过，还是谢谢赵老师了！ 那个头文件如果不能再变成小写，我也任命了。

引用 11 楼 zhao4zhong1 的回复:VC6： 工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项 VS20xx： 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项赵老师，你好！“填写附加头文件所在目录” 怎么填？ 我在VC6.0的 tool -> option -> directory中找到 然后，我根据那4个文件目录一一查看，悲剧的事情发生了：前三个include文件里包含的文件命名都是大写的，后一个是小写的。 虽然知道把那四个文件填到“附加包含路径”里凶多吉少，但我还是抱着侥幸心理填了。结果，奇迹木有发生。。赵老师，我该怎么办？

我的也是大写啊，好像没什么影响 一样可以编译的

引用 7 楼 call_from_dream 的回复:如果能用新的版本，并且新版本智能给出的头文件不是大写就好了！那你就下最新版试试了，我觉得够用好用就行了，不一定追求最新版本，很多东西新版本比旧版本问题多，稳定性差

引用 6 楼 user-4 的回复:引用 4 楼 call_from_dream 的回复:用了那个版本，不过，过了段时间就要求收费。还有，每次启动编译器，都要手动去点击一下“Try”,不然编译器都用不了我从这里下的，http://www.cnblogs.com/liuweijian/archive/2011/05/10/2041781.html 1833版本，里边有破解DLL 引用 6 楼 user-4 的回复:引用 4 楼 call_from_dream 的回复:用了那个版本，不过，过了段时间就要求收费。还有，每次启动编译器，都要手动去点击一下“Try”,不然编译器都用不了我从这里下的，http://www.cnblogs.com/liuweijian/archive/2011/05/10/2041781.html 1833版本，里边有破解DLL 如果能用新的版本，并且新版本智能给出的头文件不是大写就好了！

引用 4 楼 call_from_dream 的回复:[quote=引用 3 楼 user-4 的回复:] [quote=引用 2 楼 call_from_dream 的回复:] [quote=引用 1 楼 user-4 的回复:] 我用的10.6.1833，没发现你说的这种问题，列出的都是小写的 求！ bef2014@163.com //记得把相关的破解文件和方法给我 谢谢了，大侠！[/quote]公司有墙，发不出去的。你可以去搜一下，这个很好找的吧[/quote] 用了那个版本，不过，过了段时间就要求收费。还有，每次启动编译器，都要手动去点击一下“Try”,不然编译器都用不了[/quote] 原先我用得就是那个10.6，不过可能跟你不是一个版本。用得不是太爽才换更高级的版本的。

引用 3 楼 user-4 的回复:[quote=引用 2 楼 call_from_dream 的回复:] [quote=引用 1 楼 user-4 的回复:] 我用的10.6.1833，没发现你说的这种问题，列出的都是小写的 求！ bef2014@163.com //记得把相关的破解文件和方法给我 谢谢了，大侠！[/quote]公司有墙，发不出去的。你可以去搜一下，这个很好找的吧[/quote] 用了那个版本，不过，过了段时间就要求收费。还有，每次启动编译器，都要手动去点击一下“Try”,不然编译器都用不了

引用 2 楼 call_from_dream 的回复:[quote=引用 1 楼 user-4 的回复:] 我用的10.6.1833，没发现你说的这种问题，列出的都是小写的 求！ bef2014@163.com //记得把相关的破解文件和方法给我 谢谢了，大侠！[/quote]公司有墙，发不出去的。你可以去搜一下，这个很好找的吧

引用 1 楼 user-4 的回复:我用的10.6.1833，没发现你说的这种问题，列出的都是小写的 求！ bef2014@163.com //记得把相关的破解文件和方法给我 谢谢了，大侠！

我用的10.6.1833，没发现你说的这种问题，列出的都是小写的


Question: 关于文件复制的问题，非常疑惑，附代码。

feof Tests for end-of-file on a stream.  int feof( FILE *stream );  Function Required Header Compatibility  feof <stdio.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  The feof function returns a nonzero value after the first read operation that attempts to read past the end of the file. It returns 0 if the current position is not end of file. There is no error return.  Parameter  stream  Pointer to FILE structure  Remarks  The feof routine (implemented both as a function and as a macro) determines whether the end of stream has been reached. When end of file is reached, read operations return an end-of-file indicator until the stream is closed or until rewind, fsetpos, fseek, or clearerr is called against it.  Example  /* FEOF.C: This program uses feof to indicate when  * it reaches the end of the file FEOF.C. It also  * checks for errors with ferror.  */  #include <stdio.h> #include <stdlib.h>  void main( void ) {    int  count, total = 0;    char buffer[100];    FILE *stream;     if( (stream = fopen( "feof.c", "r" )) == NULL )       exit( 1 );     /* Cycle until end of file reached: */    while( !feof( stream ) )    {       /* Attempt to read in 10 bytes: */       count = fread( buffer, sizeof( char ), 100, stream );       if( ferror( stream ) )      {          perror( "Read error" );          break;       }        /* Total up actual bytes read */       total += count;    }    printf( "Number of bytes read = %d\n", total );    fclose( stream ); }   Output  Number of bytes read = 745   Error Handling Routines |  Stream I/O Routines  See Also   clearerr, _eof, ferror, perror

feof只有在fgetc之后才会为真。

此贴结贴，答案看三楼解释。谢谢。

引用 3 楼 zhao4zhong1 的回复:不要使用 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;  //... } 类似的例子还可以举很多。   确实是这样，大神真是牛啊，可能就是最后一次已经判定了feof(in)结束了，但是由于后面还有一句fputc(ch,out)这一句也执行了，所以如果在之前加一个if判定条件，那就可以避免这种情况发生。谢谢。

引用 2 楼 u012421456 的回复:我这儿没问题，楼主什么编译器 要不从新新建文件再试试？ VC++6.0

按3楼的改法，多出来的乱码不见了，太感谢了～

帮顶，gdb打进去，看到多一次循环，不知道为什么。陪楼主一起等大神解答～  附带以前记的关于EOF的两条我自己不理解的笔记。 1.从缓冲区读取文件内容时，缓冲区中文件的末尾会添加EOF标志，这个EOF标志只会出现在缓冲区内，而不会出现在硬盘的文件中。 2.文件位置指针指向末尾的EOF是feof返回真的充分必要条件。

#include<stdio.h>  void main()  {  FILE *in,*out; // char ch; int ch;  in=fopen("hong.txt","r");  out=fopen("hong1.txt","w");  if(in==NULL)  printf("open in Fail");  if(out==NULL)  printf("open out Fail");  //while(!feof(in)) for(;;)  {  ch=fgetc(in);  if(eof(in)) break;  fputc(ch,out);  }  fclose(in);  fclose(out);  printf("Finish");  }

不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,fread,fwrite,fgetc,fclose  //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

我这儿没问题，楼主什么编译器 要不从新新建文件再试试？

ch=fgetc(in); 	while(!feof(in)) 	{ 		fputc(ch,out); 		ch=fgetc(in); 	} 在循环外先读一下，在内部先写文件，再读才可以。结束边界没处理好。


Question: 求助一个关于结构体指针做函数参数的疑惑

楼主说的那个 s->base 是指向char型的指针。 楼主说的栈结构是这样 typedef struct {     int stackSize;//栈容量     char *base;//栈底指针     char *top;//栈顶指针 } SqStack;  而楼主的链表结构也许类似于是这样 typedef struct node { 	int data; 	struct node *next;//结构体指针 }TT;//  TT就表示一个结构体，用TT就相当于定义整数的int一样定义一个结构体或结构体指

在s已经分配内存的情况下，就不需要用二级指针。

引用 3 楼 truelance 的回复:修改的是s指向的内容，所以s->base, s->top都被修改了。s是一个指针，s->base也是一个指针，别搞混了。 你传入s，那么s本身的值不变，而s指向的区域都可以修改，跟s->base是不是指针没有关系。 谢谢

引用 7 楼 turingo 的回复:是的  [quote=引用 5 楼 sharp_Allen 的回复:] [quote=引用 2 楼 turingo 的回复:] 在s已经分配内存的情况下，就不需要用二级指针。 是不是，在主调函数里，是 SqStack s；此时 s 是被自动分配内存了（栈区），然后把&s 做参数传入初始化函数里，这就是在 s 已经分配内存的情况下……[/quote][/quote] 谢谢

是的  引用 5 楼 sharp_Allen 的回复:[quote=引用 2 楼 turingo 的回复:] 在s已经分配内存的情况下，就不需要用二级指针。 是不是，在主调函数里，是 SqStack s；此时 s 是被自动分配内存了（栈区），然后把&s 做参数传入初始化函数里，这就是在 s 已经分配内存的情况下……[/quote]

引用 3 楼 truelance 的回复:修改的是s指向的内容，所以s->base, s->top都被修改了。s是一个指针，s->base也是一个指针，别搞混了。 你传入s，那么s本身的值不变，而s指向的区域都可以修改，跟s->base是不是指针没有关系。 对，s 是没有变，是s 指向的内容被修改了，但是 在函数里，是把堆分配的内存，让 s->base 指向了，那么 base 这个指针没有改变，改变的是base它指向的内容，函数里不是让 s = malloc……。我还是拧在这里

引用 2 楼 turingo 的回复:在s已经分配内存的情况下，就不需要用二级指针。 是不是，在主调函数里，是 SqStack s；此时 s 是被自动分配内存了（栈区），然后把&s 做参数传入初始化函数里，这就是在 s 已经分配内存的情况下……

自己顶顶，没人啊？


Question: 要整一段数据的header，需要用到几个字节，用uint8 还是uint8_t ?

uint8_t 是stdint.h中的标准类型。

VS IDE中，在不明白的符号上点鼠标右键，选转到定义。  不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545


引用 1 楼 zhao4zhong1 的回复:盲目升级是码农之殇！  啥意思呢

win8 下需要安装ms sdk7.1+，DirectShow 已经打包在ms sdk的\Samples\multimedia下了

盲目升级是码农之殇！


Question: 希望大家能提c的问题能把我考住

引用 83 楼 bluesen 的回复:“你只不过是dos年代的老家伙”，贴主这口气有点大，牛皮哄哄，我看也就是个笑话。  让大家看笑话了。本来技术论技术，没必要扯其它的，告诉他的程序运行不起来，而且原理也分析了，他要说我无知者无畏、有眼无珠等，我还能有什么好的口气，他的代码如果能在windows或linux上成功实现改代码跑起来，欢迎大家告诉我

引用 78 楼 williamhong 的回复:[quote=引用 77 楼 zhao4zhong1 的回复:] [quote=引用 74 楼 williamhong 的回复:] [quote=引用 73 楼 zhao4zhong1 的回复:] [quote=引用 54 楼 williamhong 的回复:] [quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！[/quote] 你什么东西吗，有本事把你成功的代码贴出了！[/quote] 我那个帖子里贴的就是成功的代码。可惜你有眼无珠。[/quote]  引用 77 楼 zhao4zhong1 的回复:[quote=引用 74 楼 williamhong 的回复:] [quote=引用 73 楼 zhao4zhong1 的回复:] [quote=引用 54 楼 williamhong 的回复:] [quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！[/quote] 你什么东西吗，有本事把你成功的代码贴出了！[/quote] 我那个帖子里贴的就是成功的代码。可惜你有眼无珠。[/quote] 你的代码是在windows底下可以运行还是可以在linux底下运行？告诉你出来dos，不可能！你只不过是dos年代的老家伙，讲过了，不再说。 [/quote] 道不同不相为谋。别了不再见了此贴以及此人。

牛逼，膜拜！

引用 88 楼 arthuryangsh 的回复:[quote=引用 39 楼 williamhong 的回复:] [quote=引用 30 楼 arthuryangsh 的回复:] 试试这个：用C来实现对象的封装，封装对象的变量和方法。进一步的，可以考虑继承的实现。 面向对象其实是个利器，但C也可以实现类似的操作，就是繁琐一点。 或者，在4KB的内存上实现线程调度和内存分配。  继承、封装、多态本身就是垃圾，这个应该在10年内会有定了的，这些东西无非多了张指针表而已，软件的所有问题都用间接方式实现[/quote]  其实我心中是赞成你这个观点的。但在实践中，继承封装和多态确实提高了劳动效率，这不是能不能实现的问题。这论坛上很多人都是纸上谈兵，看起来都没试过一个比较庞大的程序如何架构、维护和进化的。即使没有这些垃圾，我们自己还是会制造类似的封装，只是没他们这样精巧。[/quote]  继承是破坏封装的，更倾向于面向组件技术而不是面向对象技术

引用 39 楼 williamhong 的回复:[quote=引用 30 楼 arthuryangsh 的回复:] 试试这个：用C来实现对象的封装，封装对象的变量和方法。进一步的，可以考虑继承的实现。 面向对象其实是个利器，但C也可以实现类似的操作，就是繁琐一点。 或者，在4KB的内存上实现线程调度和内存分配。  继承、封装、多态本身就是垃圾，这个应该在10年内会有定了的，这些东西无非多了张指针表而已，软件的所有问题都用间接方式实现[/quote]  其实我心中是赞成你这个观点的。但在实践中，继承封装和多态确实提高了劳动效率，这不是能不能实现的问题。这论坛上很多人都是纸上谈兵，看起来都没试过一个比较庞大的程序如何架构、维护和进化的。即使没有这些垃圾，我们自己还是会制造类似的封装，只是没他们这样精巧。

引用 85 楼 layershow 的回复:[quote=引用 84 楼 williamhong 的回复:] 让大家看笑话了。本来技术论技术，没必要扯其它的，告诉他的程序运行不起来，而且原理也分析了，他要说我无知者无畏、有眼无珠等，我还能有什么好的口气，他的代码如果能在windows或linux上成功实现改代码跑起来，欢迎大家告诉我  OK，我就是来捣蛋的， 原帖我去看了，里面的代码主要的意思就是通过设置 .text 段可写来操作， 现如今操作系统都运行于保护模式，实际上任何物理内存可以被重复映射，因此段页式的管理也只是属性问题 Linux 有一个函数叫 mprotect 看名字大概也了解其意思  mprotect 要求页对齐的地址 p 根据 PAGE_SIZE 可以获得页对齐的地址，Linux 通常是 4k  int page_size = sysconf(_SC_PAGE_SIZE); char * page_addr = (char *)((int)p & (~page_size - 1));  设置其可读写、可执行 mprotect(page_addr, page_size, PROT_WRITE | PROT_READ | PROT_EXEC);  mprotect 成功之后，地址所在页可写[/quote]  用这个应该可以，可以写个例子试试

好像写错了，(~page_size - 1) 应该是先 - 1 (~(page_size - 1)) 手敲的，对不住了

引用 84 楼 williamhong 的回复:让大家看笑话了。本来技术论技术，没必要扯其它的，告诉他的程序运行不起来，而且原理也分析了，他要说我无知者无畏、有眼无珠等，我还能有什么好的口气，他的代码如果能在windows或linux上成功实现改代码跑起来，欢迎大家告诉我  OK，我就是来捣蛋的， 原帖我去看了，里面的代码主要的意思就是通过设置 .text 段可写来操作， 现如今操作系统都运行于保护模式，实际上任何物理内存可以被重复映射，因此段页式的管理也只是属性问题 Linux 有一个函数叫 mprotect 看名字大概也了解其意思  mprotect 要求页对齐的地址 p 根据 PAGE_SIZE 可以获得页对齐的地址，Linux 通常是 4k  int page_size = sysconf(_SC_PAGE_SIZE); char * page_addr = (char *)((int)p & (~page_size - 1));  设置其可读写、可执行 mprotect(page_addr, page_size, PROT_WRITE | PROT_READ | PROT_EXEC);  mprotect 成功之后，地址所在页可写

引用 54 楼 williamhong 的回复:[quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！

引用 77 楼 zhao4zhong1 的回复:[quote=引用 74 楼 williamhong 的回复:] [quote=引用 73 楼 zhao4zhong1 的回复:] [quote=引用 54 楼 williamhong 的回复:] [quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！[/quote] 你什么东西吗，有本事把你成功的代码贴出了！[/quote] 我那个帖子里贴的就是成功的代码。可惜你有眼无珠。[/quote]  你和我这样的高手说话才是自取其辱呢

引用 79 楼 super_admi 的回复:我提的问题是：哪些C的问题能把你考住呢？  c specification

好吧，加油！！

我提的问题是：哪些C的问题能把你考住呢？

引用 77 楼 zhao4zhong1 的回复:[quote=引用 74 楼 williamhong 的回复:] [quote=引用 73 楼 zhao4zhong1 的回复:] [quote=引用 54 楼 williamhong 的回复:] [quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！[/quote] 你什么东西吗，有本事把你成功的代码贴出了！[/quote] 我那个帖子里贴的就是成功的代码。可惜你有眼无珠。[/quote]  引用 77 楼 zhao4zhong1 的回复:[quote=引用 74 楼 williamhong 的回复:] [quote=引用 73 楼 zhao4zhong1 的回复:] [quote=引用 54 楼 williamhong 的回复:] [quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！[/quote] 你什么东西吗，有本事把你成功的代码贴出了！[/quote] 我那个帖子里贴的就是成功的代码。可惜你有眼无珠。[/quote] 你的代码是在windows底下可以运行还是可以在linux底下运行？告诉你出来dos，不可能！你只不过是dos年代的老家伙，讲过了，不再说。

引用 74 楼 williamhong 的回复:[quote=引用 73 楼 zhao4zhong1 的回复:] [quote=引用 54 楼 williamhong 的回复:] [quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！[/quote] 你什么东西吗，有本事把你成功的代码贴出了！[/quote] 我那个帖子里贴的就是成功的代码。可惜你有眼无珠。

大家继续，不要因为有些人打岔

引用 73 楼 zhao4zhong1 的回复:[quote=引用 54 楼 williamhong 的回复:] [quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！[/quote]  我无畏啥，你只不过是dos年代的老家伙，早就被淘汰了

引用 73 楼 zhao4zhong1 的回复:[quote=引用 54 楼 williamhong 的回复:] [quote=引用 53 楼 zhao4zhong1 的回复:] [quote=引用 42 楼 williamhong 的回复:] [quote=引用 40 楼 zhao4zhong1 的回复:] [quote=引用 33 楼 williamhong 的回复:] [quote=引用 13 楼 zhao4zhong1 的回复:] 楼主确定不是riwei的马甲？ http://bbs.csdn.net/topics/390627329 http://bbs.csdn.net/topics/390084943 不是马甲 改代码没有意义，而且你改的也不是代码[/quote] 你知道“代码”和“代码段内代码对应汇编指令”的区别吗？[/quote]  机器只认机器指令，也就我们说的汇编，编译之后就不再存在所谓的源程序级的代码了，也没有改代码的概念，我只能认为你想改机器指令，大多数高级操作系统不允许改的，所以改没有意义，而且你改的也不是，如果真改成功了，也许你还活在dos年代或者在用某些单片机之类的[/quote] 说到底你连我改没改成功都吃不准啊！[/quote] 失败是肯定的，除非用dos[/quote] 无知者无畏！[/quote] 你什么东西吗，有本事把你成功的代码贴出了！

引用 70 楼 williamhong 的回复:[quote=引用 69 楼 user-8 的回复:] [quote=引用 67 楼 williamhong 的回复:] [quote=引用 66 楼 user-8 的回复:] [quote=引用 62 楼 williamhong 的回复:] [quote=引用 61 楼 user-8 的回复:] #include<stdio.h> #include<malloc.h> #define LEN sizeof(struct student) #define NULL 0 struct student {   int number;   struct student *next; };   int n=0;  struct student *creat(void) { 	struct student *head,*p1,*p2; 	head=NULL; 	p1=p2=(struct student *)malloc(LEN); 	scanf("%d",&p1->number); 	while(p1->number!=0) 	{ 		n++; 		if(n==1) head=p2; 		else p2->next=p1; 		p2=p1; 	    p1=(struct student *)malloc(LEN); 		scanf("%d",&p1->number); 	} 	p2->next=NULL;     return head; }   struct student *cha(struct student *head,struct student p0) {     struct student *p1=head,*p2; 	if(p0.number<=p1->number) 	{ 		head=&p0; 		p0.next=p1; 		return head; 	} 	else 		while(p1->next!=NULL) 		{ 			p2=p1; 			p1=p1->next; 			if(p0.number<=p1->number) 			{ 				p2->next=&p0; 		        p0.next=p1; 				return head; 			} 		} 		p1->next=&p0; 		p0.next=NULL; 		return head; }   void print(struct student *p) { 	if(p==NULL) 	printf("0");     else 	while(p!=NULL) 	{ 		printf("%d",p->number); 	    p=p->next; 	}  }  void main() { 	int x;     struct student *p; 	p=creat();     struct student p0; 	scanf("%d",&x); 	p0.number=x;     p0.next=NULL; 	p=cha(p,p0); 	print(p); }  谭浩强的一道题。插入一个链表结点（按number，由大到小）。插入程序正确，但是输出程序有误。无限循环。一直找不到原因  目测malloc之后没有把next置为NULL[/quote] 我用单步调试看了一下。倒数第二行printf（p）之前都没问题。到了执行printf时，出错。大神求助。我已经卡了一个下午了[/quote]  我不能帮你调程序，不过按我说的，malloc语句之后竟跟着加一条p1->next=NULL; [/quote] 那最后问你一个问题。 建立一个链表结点stuct student A； 如果单独的A。代表什么含义？[/quote] stuct student A; 定义一块内存，里面有两个元素[/quote]谢谢


Question: 帮我看看这个去除字符串中多余空格的程序 为什么输出的是错的

引用 9 楼 starytx 的回复:定义变量避免和标准库的库名等重复。 仅供参考 void deblank(char *str) { 	if (NULL == str || 0 == strlen(str)) 	{ 		return; 	} 	char *p1 = str; 	char *p2 = str; 	while (*p1 && *p2 ) 	{ 		while (*p2 == ' ') 		{ 			p2++; 		} 		*p1++ = *p2++; 	} 	*p1 = 0; } 星哥不只是会灌水啊！！

我给你调试了，检查到最后一个3的时候，string还是12       3，j是2，然后就往string[j]的地方写了个3，其他的都没管，结果当然是这样。

引用 4 楼 greatkafka 的回复:[quote=引用 2 楼 fengswd 的回复:] 自己调试下再来发帖好不好？ 调试过了[/quote]  多调试 跟踪看看啊，看看你的i，j，string string[i] = '\0';有问题，i改成j

string[i] = '\0'; i  写成 j 才是你最初想法吧

你这本来就是这个结果  你只是把第一个空格替换成了最后一个非空格字符 3 所以 123     3 就是你程序的结果

引用 2 楼 fengswd 的回复:自己调试下再来发帖好不好？ 调试过了

引用 1 楼 modyaj 的回复:怎么个错误 大家省得自己运行！ 我输入 12空空空空空空3回车 输出的是 123空空空空空3

自己调试下再来发帖好不好？

怎么个错误 大家省得自己运行！

void deblank(char string[]) {     char temp[MAX_LEN] = "\0";  //MAX_LEN 自己根据需要定义     char *string_temp = string;     int i;     while(*string_temp !=0 && i<strlen(string))     {        if(*string_temp != ' ')       {         temp[i] = *string_temp ;         i++;         string_temp ++;       }       else      {         string_temp ++;      }    }    strcpy(string,temp);     puts(string); }  没问题的！！

#include <stdio.h> #include <string.h>  char * deblank(char s[]) {     int i, j;      if (s[0] == '\0')         return s;      i = 0;     for (j = 1; s[j] != '\0'; j++)     {         if (s[i] == ' ')         {             if (s[j] != ' ')             {                 s[i++] = s[j];                 s[j] = ' ';             }         }         else         {             i++;         }     }     s[i] = '\0';      return s; }  int main(int argc, char *argv[]) {     char s[1024];          strcpy(s, "abc 123");     printf("[%s]\n", rmspace(s));      strcpy(s, "abc 123 456");     printf("[%s]\n", rmspace(s));      strcpy(s, "abc 123 456 ");     printf("[%s]\n", rmspace(s));      strcpy(s, " abc 123 456 ");     printf("[%s]\n", rmspace(s));      strcpy(s, "");     printf("[%s]\n", rmspace(s));      strcpy(s, " ");     printf("[%s]\n", rmspace(s));      strcpy(s, " a");     printf("[%s]\n", rmspace(s));      strcpy(s, "a ");     printf("[%s]\n", rmspace(s));      return 0; }


Question: 关于互斥量mutex共享疑问

PTHREAD_MUTEXATTR_GETPSHARED Section: POSIX Programmer's Manual (P) Updated: 2003  --------------------------------------------------------------------------------    NAME pthread_mutexattr_getpshared, pthread_mutexattr_setpshared - get and set the process-shared attribute    SYNOPSIS #include <pthread.h>    int pthread_mutexattr_getpshared(const pthread_mutexattr_t *         restrict attr, int *restrict pshared);  int pthread_mutexattr_setpshared(pthread_mutexattr_t *attr,         int pshared);      DESCRIPTION The pthread_mutexattr_getpshared() function shall obtain the value of the process-shared attribute from the attributes object referenced by attr. The pthread_mutexattr_setpshared() function shall set the process-shared attribute in an initialized attributes object referenced by attr.   The process-shared attribute is set to PTHREAD_PROCESS_SHARED to permit a mutex to be operated upon by any thread that has access to the memory where the mutex is allocated, even if the mutex is allocated in memory that is shared by multiple processes. If the process-shared attribute is PTHREAD_PROCESS_PRIVATE, the mutex shall only be operated upon by threads created within the same process as the thread that initialized the mutex; if threads of differing processes attempt to operate on such a mutex, the behavior is undefined. The default value of the attribute shall be PTHREAD_PROCESS_PRIVATE.     RETURN VALUE Upon successful completion, pthread_mutexattr_setpshared() shall return zero; otherwise, an error number shall be returned to indicate the error.   Upon successful completion, pthread_mutexattr_getpshared() shall return zero and store the value of the process-shared attribute of attr into the object referenced by the pshared parameter. Otherwise, an error number shall be returned to indicate the error.     ERRORS The pthread_mutexattr_getpshared() and pthread_mutexattr_setpshared() functions may fail if:   EINVAL  The value specified by attr is invalid.   The pthread_mutexattr_setpshared() function may fail if:   EINVAL  The new value specified for the attribute is outside the range of legal values for that attribute.   These functions shall not return an error code of [EINTR].   The following sections are informative.     EXAMPLES None.     APPLICATION USAGE None.     RATIONALE None.     FUTURE DIRECTIONS None.     SEE ALSO pthread_cond_destroy() , pthread_create() , pthread_mutex_destroy() , pthread_mutexattr_destroy() , the Base Definitions volume of IEEE Std 1003.1-2001, <pthread.h>     COPYRIGHT Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1, 2003 Edition, Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open Group Base Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics Engineers, Inc and The Open Group. In the event of any discrepancy between this version and the original IEEE and The Open Group Standard, the original IEEE and The Open Group Standard is the referee document. The original Standard can be obtained online at http://www.opengroup.org/unix/online.html .  --------------------------------------------------------------------------------

搞定了，1是互斥量要用mmap使用共享内存空间，2是在printf之后使用fflush刷新输出


Question: 关于C语言realloc的问题

引用 2 楼 zhangyuemessi 的回复:搞懂了，不过C的内存指针问题有点复杂，我想问一下，为什么我先用malloc分配一部分内存，再用realloc追加内存就不行呢？记得大学教材里的代码结构就是如此。 不是不可以，是你自己的在result++的时候把指针搞乱了……还有用realloc的时候最好进行错误判断，可能会分配失败……


Question: C程序调用C++程序中的函数

这种需求，通常都是直接将C++中的函数转化为C的函数，否则很麻烦的！！！

C调用C++中C++专有特性的函数，这意味着什么？意味着你在维护一个C源代码（注意是源码不是二进制可执行映像），增加其兼容C++的能力。这个思路我认为并不值得提倡。C++提供extern “C”来兼容C的源码或静态库，这叫向后兼容。你要实现的却是向前方兼容，这样往往会伤筋动骨的——不是你的源码伤筋动骨就是编译器伤筋动骨。

namespace sig {    extern "C" double A(const double &t);   //这里是声明 }

使用extern "C"，表示一C的方式编译，而不是使用C++编译器

这里有两个问题：一个是namespace，一个是引用t，c代码都不支持吧？ 如果是简单的函数，比如void f(int i); 那就好办了，把这个函数声明加上extern "C"就行： #ifdef __cplusplus   extern "C" {   #endif   void f(int i); #ifdef __cplusplus   }   #endif  为了实现函数重载，c++编译器会把函数的名字加上一些前缀后缀，extern "C"的作用就是告诉编译器不要这么做。


Question: RSA算法用辗转相除法求私钥d,用C实现

学习学习，

引用 3 楼 fetag 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] 需要使用GIMP库进行大整数计算。 又漏底裤了，那是GMP，不是GIMP！GIMP是处理图形的~~[/quote] 在您老面前露（不是漏）底裤，是我的荣幸！

引用 2 楼 zhao4zhong1 的回复:需要使用GIMP库进行大整数计算。 又漏底裤了，那是GMP，不是GIMP！GIMP是处理图形的~~

需要使用GIMP库进行大整数计算。


Question: 关于随机数 求大神指导

改成功了，谢谢大神。

int a[3];//定义3个随机数 char cOperator;//定义运算符号。 int nResult,nTrue;//定义计算结果、真实结果 srand(time(NULL)); // 让每次产生的随机数都不一样   for(int i=1;i<=3;i++)  //产生10个随机数  -------------- 先发现了这个错误。定义了3个元素的数组，循环里越界访问了

改后试了下，还是不行啊

srand(time(NULL)); 放在main开始试试


Question: 求大神加一下注释！！！关于用C语言实现linux文件处理的

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


Question: 求人教任意数目的矩阵乘法，甚至是文件都可以。

int MatrixProduct(double** pResult, double** pA, int iAr, int iAc , double** pB, int iBr, int iBc) {      if( pResult == NULL) return 10000;      if( pA == NULL) return 20000;      if( pB == NULL) return 20000;      if(iAc != iBr) return 30000;     /*可以开始写矩阵乘法中每个元素的计算了*/     /*注意要使用指针访问二维数组，特别是double要占几个字节，需要用sizeof函数实际计算每个元素的偏移量，还有行列序号的对应关系*/     return 0; /*计算正确时返回零*/ }   这是老师给我的提示

#include<stdio.h> int main() { 	int q,w,e,r; 	printf("请输入A矩阵行数:");scanf("%d",&q);printf("请输入A矩阵列数:");scanf("%d",&w);printf("\n"); 	printf("请输入B矩阵行数:");scanf("%d",&e);printf("请输入B矩阵列数:");scanf("%d",&r);printf("\n"); //	scanf("%d,%d,%d,%d",&q,&w,&e,&r); 	if(w==e){ 	q++;w++;e++;r++; 	int a[q][w],b[e][r],c[q][r]; 	printf("\n"); 	int i,j,m,n,x=0; 	for(i=1;i<=q-1;i++){ 		for(j=1;j<=r-1;j++){ 			c[i][j]=0; 		} 	}printf("请输入A矩阵:\n"); 	for(i=1;i<=q-1;i++){ 		for(j=1;j<=w-1;j++){ 			scanf("%d",&a[i][j]); //		a[i][j]=1; 		} 	}printf("\n请输入B矩阵:\n"); 	for(m=1;m<=e-1;m++){ 		for(n=1;n<=r-1;n++){ 			scanf("%d",&b[m][n]); //			b[m][n]=1; 		} 	} 	for(i=1;i<=q-1;i++){ 		for(n=1;n<=r-1;n++){ 			for(j=1,m=1;j<=w-1;j++,m++){ 				c[i][n]=c[i][n]+a[i][j]*b[m][n]; 			} 		} 	} 	printf("\n矩阵相乘结果为：\n"); 	for(i=1;i<=q-1;i++){ 		for(n=1;n<=r-1;n++){ 			printf("%d\t",c[i][n]); 			x=x+1; 			if(x%(r-1)==0){ 				printf("\n"); 			} 			 			} 		} 	} 	else printf("矩阵相乘无意义"); 			return 0; 	}

#include <stdio.h> #define NUM 2000  int a[NUM][NUM], b[NUM][NUM]; int c[NUM][NUM] = {0};  void init_matrix(void) { 	int i, j;  	for(i = 0; i < NUM; i++) 		for(j = 0; j < NUM; j++) 			a[i][j] = b[i][j] = 1;  }  void matrix_low() { 	int i, j, k; 	for (i = 0; i < NUM; i++) { 		for (j = 0; j < NUM; j++) { 			for (k = 0; k < NUM; k++) { 				c[i][j] = c[i][j] + a[i][k] * b[k][j]; 			} 		} 	} }  void matrix_high() { 	int i, j, k; 	for (i = 0; i < NUM; i++) { 		for (k = 0; k < NUM; k++) { 			for (j = 0; j < NUM; j++) { 				c[i][j] = c[i][j] + a[i][k] * b[k][j]; 			} 		} 	} }   推荐使用void matrix_high()，矩阵大的时候它运行更快！这里只是最基本的乘法实现，不是lz要求的实现，供参考

我试过了  不行的啊

- -  好难懂啊

仅供参考#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //


Question: 实时抓取网页数据

有类似例子吗

使用 WebBrowser控件 或 libcurl 或 GetWord


Question: 新手链表问题

引用 4 楼 csdn_xlb 的回复:问题已经解决， 方案：改掉函数参数的*，例如：InitList(LinkList L)即可通过编译，原因尚未清楚编译通过只是第一步，只说明符合语法要求，还要看运行结果是否正确。

谢谢你的回答，但是好像还是不行

LinkList代表结构体指针类型，在函数中所有形参是LinkList*类型的变量前都加上*

错误：request for member 'next' in something not a structure or union 请教怎么解决


Question: C语言如何判断跳转的网页？

引用 楼主 qq_23396955 的回复:比如我现在已知一个网站 比如www.xxx.com\login.axpx?username=xxx&password=xxx 这样即可得到验证，无需验证码，当密码或用户名错误，则有alert提示用户或密码错误，我如何用c编一个程序，使其遍历username为syyk的用户和密码，使其暴力破解。 用什么函数？ 1.这个网站能这样绕开也够傻的。。 2.不过楼主别开心，一般你尝试个三五次就会把你ban掉的 3.不过你可以尝试下用curl之类的写个代码，构造http头尝试。如你的问题，状态码是301的话就是跳转 4.用chrome可以直接构造http包测试。我们要学会用工具而不是什么都用代码再去实现一遍 5.不过其实不用这么麻烦，你可以找找相应的http测试工具，填入一个范式自动帮你弄 6.别整这些乱七八糟的所谓黑客的玩意了，太low了

用键盘助手就行了。一般的网站都会有这点基础的安全防范。这样的东西想暴力破解基本不可能。

使用libcurl库？


Question: 关于定于float和double的输出问题

你的那个只要把 s=(a+b+c)/(1.0/2);改为 s=(a+b+c)/2；就可以了，，

引用 4 楼 baiwei12 的回复:#include <stdio.h> #include <math.h> double Area(float a,float b,float c) { 	double s; 	double p; 	if (a+b>c&&a+c>b&&b+c>a)    //判断3边是否构成三角形 	{ 		p=(a+b+c)/2; 		s=sqrt(p*(p-a)*(p-b)*(p-c));   //调用库函数求三角形面积 		return s; 	} 	else  	{ 		return 0;             //无法构成三角形返回0 	} } int main(void) { 	float a,b,c; 	double ar; 	printf("input three numbers: \n"); 	scanf("%f %f %f",&a,&b,&c);    //输入三角形三边长 	ar=Area(a,b,c); 	if(ar) 	{ 		printf("area=%f\n",ar);      //输入三角形面积 	} 	else 	{ 		printf("it is false!"); 	} 	return 0; } 大神，正确答案固然重要，可是我还是想知道我的问题所在。。

[quote=引用 7 楼 baiwei12 的回复:] 将 s=(a+b+c)/(1.0/2);改成 s=(a+b+c)/2；就可以了，，[/quote 这样改的话，输出的值就变成-0.00000了

引用 3 楼 wangjun403 的回复:scanf函数都写错了，这能编译通过？  你居然还能搞出结果 ---------------------------------- 我是用手机软件编程的，，来提问的时候输入错了。。

谭老师的编程 #include<stdio.h> #include<math.h> main() { double a,b,c,s,area; a=3.67; b=5.43; c=6.21; s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); printf("a=%f\tb=%f\tc=%f\n",a,b,c); printf("are=%f\n",area); return 0; }

先回复1下3楼，我是用手机软件编程的，，来提问的时候输入错了。。

scanf函数都写错了，这能编译通过？  你居然还能搞出结果

当我把 s=(a+b+c)/(1.0/2);改成s=(a+b+c)/2.0时。输出的值是-0.000000 囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧囧

..我自己试了一下。。自己定义abc的值。为3.0 4.0 5.0 还是输出437.629981。。


Question: 看了好久都没发现问题，大神帮帮忙。。

新手，大神多多包涵。。

原来是这样，谢谢大神

楼上正解，楼主太粗心了 PS：scanf中最好用空格分隔

if底下那三行要括起来吧

大神来帮帮忙。。


Question: 关于这段程序中，aver存进的数字为0，为何？

引用 1 楼 user-2 的回复:输入成绩为 float 所以，  scanf("%d", &p->score[j]);  改为  scanf("%f", &p->score[j]); 对哦，我没看到这个错 ！

给47行打上断点，看看sum的值


Question: 提问：定义指针数组，想由用户输入字符串，怎么实现。

引用 7 楼 starytx 的回复:[quote=引用 4 楼 guicaisa 的回复:] size_t是什么作用，，我还没学到这部分。。逐个free掉，是不是这样:  for (i=0; i<3; i++) free(p[i]);size_t是一种自定义的类型，相当于无符号int，不必过多纠结。是这样free的[/quote]  恩，了解了，谢谢你的解答。

引用 6 楼 u012421456 的回复:char * 型变量存储在静态存储区 char [] 型变量存储在堆栈中 所以不能直接输入 一楼的做法可以  谢谢你的解答。

引用 4 楼 guicaisa 的回复:size_t是什么作用，，我还没学到这部分。。逐个free掉，是不是这样:  for (i=0; i<3; i++) free(p[i]);size_t是一种自定义的类型，相当于无符号int，不必过多纠结。是这样free的

引用 4 楼 guicaisa 的回复:[quote=引用 1 楼 starytx 的回复:] 仅供参考，记得用完要逐个free	char *p[3]; 	for (size_t i = 0; i != 3; i++) 	{ 		p[i] = (char*)malloc(sizeof(char)*100);		// 假设每个串不超过100 		scanf("%s" ,p[i]); 	}   size_t是什么作用，，我还没学到这部分。。逐个free掉，是不是这样:  for (i=0; i<3; i++) free(p[i]);[/quote] 楼主写的是对的

引用 1 楼 starytx 的回复:仅供参考，记得用完要逐个free	char *p[3]; 	for (size_t i = 0; i != 3; i++) 	{ 		p[i] = (char*)malloc(sizeof(char)*100);		// 假设每个串不超过100 		scanf("%s" ,p[i]); 	}   size_t是什么作用，，我还没学到这部分。。逐个free掉，是不是这样:  for (i=0; i<3; i++) free(p[i]);

引用 2 楼 u012421456 的回复:你的代码什么样的，贴上来看看，总是报错？什么错，楼主啥也不说，怎么帮忙？难道楼主想帮忙直接给个程序？  我的意思是输入3个字符串，由用户输入，所以我想了，正好刚学了指针数组的方法，就自己写了个char * p[3].然后想输入3个字符串给这个指针数组，但是无论是用scanf还是gets好像不行，不知道该如何正确输入。


Question: 关于sizeof和strlen的用法

引用 9 楼 adusuccessfully 的回复:在《程序员面试宝典》（第4版）第55到57业对sizeof和strlen有详细的分析：（共有11条之多）  （1）sizeof操作符的结果类型是size_t，它在头文件中的typedef为unsigned int类型。该类型保证能容纳实现所建立的最大对象的字节大小。  （2）sizeof是运算符，strlen是函数。  （3）sizeof可以用类型作参数，strlen只能用char*作参数，且必须是以'\0'结尾的。sizeof还可以用函数做参数，比如：  short f(); printf("%d\n",sizeof(f()));   (4)数组作sizeof的参数不退化，传递给strlen就退化为指针。  （5）大部分编译程序在编译的时候就把sizeof计算过了，是类型或者是变量的长度。这就是sizeof(x)可以用来定义数组维数的原因：  char str[20] = "0123456789"; int a = strlen(str); //a=10; int b = sizeof(str);//而b=20;   (6)strlen的结果要在运行的时候才能计算出来，用来计算字符串的长度，而不是类型占内存的大小。  未完~~~~ 请说完撒 说的不错啊

一个是关键字，一个是函数

1、两者是不同的东西，sizeof用法更广 2、sizeof和strlen只有在处理字符串时会有相似点。

我给楼主的建议是：这辈子永远都不要用sizeof！

引用 5 楼 JAFFRYKEE 的回复:[quote=引用 4 楼 lovesmiles 的回复:] 这个问题太多人总结过了。 1sizeof是关键字，strlen是函数 2sizeof是在编译时决定的，strlen是运行时计算的 3sizeof是编译器分配给变量的大小，strlen是遇到'\n'时的长度。 4sizeof可以对类型操作，strlen只能对数组或者指针名操作。 strlen好像是遇到'\0'结束[/quote]  笔误，笔误

引用 4 楼 lovesmiles 的回复:3sizeof是编译器分配给变量的大小，strlen是遇到'\n'时的长度。 你确定是遇到 \n ?? 引用 4 楼 lovesmiles 的回复:4sizeof可以对类型操作，strlen只能对数组或者指针名操作。 准确的说 strlen 参数只能是指针 [其他类型也得转换为指针 才可以做参数]

引用 4 楼 lovesmiles 的回复:这个问题太多人总结过了。 1sizeof是关键字，strlen是函数 2sizeof是在编译时决定的，strlen是运行时计算的 3sizeof是编译器分配给变量的大小，strlen是遇到'\n'时的长度。 4sizeof可以对类型操作，strlen只能对数组或者指针名操作。 strlen好像是遇到'\0'结束

参考 http://www.cnblogs.com/carekee/articles/1630789.html

完全不同的两个东西

这两个其实没有多大的联系。sizeof操作符一般用来计算某个类型或对象的大小，比如结构体，类或内置类型。 strlen是函数，专门用来计算字符串的长度，计算方法是从你提供的字符指针开始计算字符个数，直到遇见结束符'\0'。计算字符串长度就用strlen


Question: 阶乘数列的和

引用 14 楼 mr_chenping 的回复:[quote=引用 楼主 myzts 的回复:] 比如1！+2！+............+30!=? 代码怎么编写?谢谢大家了,考虑了好长时间 #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; /*  * File: 4.cpp  * Create Date: 2014-11-17 18:16:36  *  */  int main(int argc, char* argv[]) { 	long sum = 0; 	long temp = 1;  	for(int i=1; i <= atoi(argv[1]); ++i) 	{ 		temp *= i; 		sum += temp; 	} 	printf("sum=%ld\n", sum); 	return 0; }  把atoi(argv[1]) 换成30，听你说思考了好久好久。。我压力 好大[/quote] 你确定long可以存这个东西?

引用 4 楼 myzts 的回复:[quote=引用 2 楼 magicskytt 的回复:] #include <stdio.h>  int main(void) { 	long long sum = 0; 	long long i = 1; 	 	for (int j = 1; j <= 20; ++j) 	{ 		 		i = i * j; 		sum = sum + i; 	}  	printf("1+2!+3!+....+20!=%lld\n", sum); 	return 0; }  /*在VS2010中运行的结果是： ————————————— 1+2!+3!+....+20!=2561327494111820313 请按任意键继续. . .  ————————————— */  1-20的阶乘和 可是我要求得是30,当把j改为30的时候输出结果为负数[/quote]  超出了取之范围

long类型最大能计算到20的阶乘

引用 2 楼 magicskytt 的回复:#include <stdio.h>  int main(void) { 	long long sum = 0; 	long long i = 1; 	 	for (int j = 1; j <= 20; ++j) 	{ 		 		i = i * j; 		sum = sum + i; 	}  	printf("1+2!+3!+....+20!=%lld\n", sum); 	return 0; }  /*在VS2010中运行的结果是： ————————————— 1+2!+3!+....+20!=2561327494111820313 请按任意键继续. . .  ————————————— */  1-20的阶乘和 可是我要求得是30,当把j改为30的时候输出结果为负数

int型的取值范围小了，所以用long long代替

#include<stdio.h> void main() { float i,sum=0,f=1; for (i = 1;i<=30;i++) { f*=i; sum+=f; } printf("%e",sum); }

引用 楼主 myzts 的回复:比如1！+2！+............+30!=? 代码怎么编写?谢谢大家了,考虑了好长时间 #include <iostream> #include <stdio.h> #include <stdlib.h> using namespace std; /*  * File: 4.cpp  * Create Date: 2014-11-17 18:16:36  *  */  int main(int argc, char* argv[]) { 	long sum = 0; 	long temp = 1;  	for(int i=1; i <= atoi(argv[1]); ++i) 	{ 		temp *= i; 		sum += temp; 	} 	printf("sum=%ld\n", sum); 	return 0; }  把atoi(argv[1]) 换成30，听你说思考了好久好久。。我压力 好大

引用 12 楼 zhao4zhong1 的回复:《为学》中的名句“天下事有难易乎？为之，则难者亦易矣；不为，则易者亦难矣。” 谢谢老师教诲,我要为之!

《为学》中的名句“天下事有难易乎？为之，则难者亦易矣；不为，则易者亦难矣。”

引用 10 楼 zhao4zhong1 的回复:仅供参考#include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商; flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     char ch;     string s1,s2,res;      while (cin>>s1>>ch>>s2) {         switch (ch) {             case '+':res=ADD_INT(s1,s2);break;             case '-':res=SUB_INT(s1,s2);break;             case '*':res=MUL_INT(s1,s2);break;             case '/':res=DIV_INT(s1,s2);break;             case '%':res=MOD_INT(s1,s2);break;             default :                   break;         }         cout<<res<<endl;     }     return(0); }  老师这代码对我有难度涅,有简单一些的代码吗?

unsigned long long定义都没用 1-30的阶乘和太大了，显示不了这个数字 可以参考http://blog.csdn.net/sunlylorn/article/details/7610770 也可以用 int i,k; float j; for(i=1;i<=30;i++) { j=1; for(k=1;k<=i;k++) j*=k; printf("%d!=%e\n",i,j); } 转换成几次方的形式

引用 4 楼 myzts 的回复:[quote=引用 2 楼 magicskytt 的回复:] #include <stdio.h>  int main(void) { 	long long sum = 0; 	long long i = 1; 	 	for (int j = 1; j <= 20; ++j) 	{ 		 		i = i * j; 		sum = sum + i; 	}  	printf("1+2!+3!+....+20!=%lld\n", sum); 	return 0; }  /*在VS2010中运行的结果是： ————————————— 1+2!+3!+....+20!=2561327494111820313 请按任意键继续. . .  ————————————— */  1-20的阶乘和 可是我要求得是30,当把j改为30的时候输出结果为负数[/quote] 问题是要求1到30阶乘的和,不过float好像也会溢出把?

用C语言哦,麻烦各位大大代码不要太难,新手看起来有点吃力,谢谢大家了!!!


Question: 交换函数

仅供参考#include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

//或者 void swap(int& ref1,int& ref2) {     int temp = 0;       temp = ref1;       ref1 = ref2;       ref2 = temp; }   int _tmain(int argc, _TCHAR* argv[]) {     int a = 3;       int b = 4;       swap(a,b);       printf("a = %d,b = %d\n",a,b);       return 0; }

void swap(int* p1,int* p2) { 	int temp = 0;  	temp = *p1;  	*p1 = *p2;  	*p2 = temp; }  int _tmain(int argc, _TCHAR* argv[]) { 	int a = 3;  	int b = 4;  	swap(&a,&b);      printf("a = %d,b = %d\n",a,b);      return 0; }

temp要用对象，要不谈你这个编译不通过的吧

应该是  void swap(int *p1,int *p2) {     int temp;     temp=*p1;     *p1=*p2;     *p2=temp; }

指针的基本概念，骚年还不太理解啊， tmp是指针，*p1, *p2是int型数据

引用 2 楼 user-7 的回复:void swap(int *p1,int *p2) {     int *temp;     temp=p1;     p1=p2;     p2=temp; } 恩，这种错误用法是很常见的。

不对，把两个temp前面那个*去掉


Question: 谁有《数据结构C语言版》的电子书，清华严蔚敏的,Word或txt的,请大家帮下忙

是doc的么？麻烦请发我邮箱吧，谢谢

我有你要不？

pdf转word会乱码的

用pdf转成word可以吧啊

pdf格式的要么。。。。


Question: 局部变量是什么东西？

在代码块{}里重新定义n并赋值，这是一个局部变量，离开代码块后，n的值回复到这个代码块之前的值... 这样子....

只在这段代码内有效的变量

变量的作用域。 一般不要写同名变量


Question: 急，求帮忙看看这段程序是什么意思

$ cat a.c  # include <stdio.h>  int main() {     int x, i;     for (i = 1; i <= 100; i++)     {         x = i;         if (++x % 2 == 0)             if (++x % 3 == 0)                 if (++x % 7 == 0)         printf("%d\n", x);     }     printf("\n");     return 0; }  $ ./a 28 70  28能被7整除 28 - 1能被3整除 28 - 2能被2整除


Question: field xxx could not be resolved

引用 3 楼 wang0635 的回复:[quote=引用 楼主 qin_lin_sb 的回复:] 我用eclipse+gcc打开一个C工程，代码可以编译连接运行，但eclipse依然报错，error：field "buf_cycle" could not be resolved.  struct inp_par {     ...     int   buf_cycle;             ...          }  buf_cycle变量已经在结构体中定义了, 但是每个引用这个变量的地方都出现上述error。代码的编译连接运行都是正常的。 感觉很奇怪啊，请问这是怎么回事？网上有人说这是eclipse的bug?  大括号后面没有分号吗[/quote]有，我写漏了

引用 楼主 qin_lin_sb 的回复:我用eclipse+gcc打开一个C工程，代码可以编译连接运行，但eclipse依然报错，error：field "buf_cycle" could not be resolved.  struct inp_par {     ...     int   buf_cycle;             ...          }  buf_cycle变量已经在结构体中定义了, 但是每个引用这个变量的地方都出现上述error。代码的编译连接运行都是正常的。 感觉很奇怪啊，请问这是怎么回事？网上有人说这是eclipse的bug?  大括号后面没有分号吗

引用 1 楼 user-2 的回复:是不是符号库没有更新？符号库？怎么更新？

是不是符号库没有更新？


Question: 请教输出结果的解决方法

传指针到函数里即可改变参数所指向的空间了。

引用 3 楼 u010030181 的回复:如果仅仅是ABCD的话，仅供参考！！！注：如果输入有误，将得不到正确的结果，这个自己可以再进行判断…… #include <stdio.h>  typedef struct Combination { 	int counter; 	char ch; }Combin;  int sequence_size(Combin sequence_array[],int length);  Combin arryCombin[] = {{0, 'A'}, {0, 'B'}, {0, 'C'}, {0, 'D'}};  int main(void) {     //定义一个字符变量     char ch;     while ((ch = getchar()) != '\n' && ch >= 'A' && ch <= 'D')     {  		++arryCombin[ch -'A'].counter;       }      int length = sizeof(arryCombin)/sizeof(Combin);     //定义一个新的函数，使用冒泡算法对数组元素的大小值进行排序     sequence_size(arryCombin,length);     //遍历数组所有元素     for (int count = 0;count < length;count++)     {         printf ("%c = %d\n",arryCombin[count].ch ,arryCombin[count].counter);     }     return 0;      }   //使用冒泡算法对数组元素进行比较并按照从小到大进行排序 int sequence_size(Combin sequence_array[],int length) {     int i,j;     Combin k;     //根据main函数里定义的数组：遍历遍历数组     for (j = 1;j < length;j++)     {         //逐个循环遍历相邻的两个数         for (i = 0;i < length - j;i++)         {             //比较相邻两个数值的大小并进行交换             if (sequence_array[i].counter > sequence_array[i + 1].counter)             {                 k = sequence_array[i];                 sequence_array[i] = sequence_array[i + 1];                 sequence_array[i + 1] = k;             }         }     }            }     非常谢谢，目前输入ABCD可以统计并且排序了，但是我想实现的是AAABCDDKKLLLafbdjfs，就是可能是任意字符，结果只对ABCD进行排序，目前程序如果出现其它字符，就会出错了！但是很感谢您提供的思想，我还没学到这块，所以暂时没有办法举一反三

引用 2 楼 user-3 的回复:建议定义一个结构体映射，比如 typedef struct LetterMap { 	char c; 	int n; }LM; 然后在mian中定义一个结构体数组，可以固定个数的，也可以动态malloc。然后根据输入的字符在此数组中查找（可以做成函数），找到了就给对应的n++，否则就保存进数组中，然后给这个结构体数组排序，排序可以使用qsort系统函数，也可以改改你的排序函数，最后就可以输出c，也就是每个n对应的是哪个字符了。  感谢版主提供思路，我还没学到结构体映射相关知识。不过我会学到以后再回来解决这个问题的

有朋友帮看看程序么。


Question: 我手上有一个传感器的DLL文件和C HeaderFile，要写一个程序读取传感器的数据

要有DLL接口函数原型，然后就动态加载DLL，调用接口函数

这个只要工程配置好 DLL加载你这个可以动态加载 使用方法和你自己写的c预言代码一样使用 不用担心

参考 http://www.vckbase.com/index.php/wv/1449.html


Question: 函数定义的bug无法修复，不知道是什么问题！麻烦老师帮看看，谢谢

int sequence_size(sequence_array,length);  这个调用是个错误   int sequence_size(int sequence_array[],int length) {     int i,j,k;     //根据main函数里定义的数组：遍历遍历数组     for (j = 1;j < length;j++)     {         //逐个循环遍历相邻的两个数         for (i = 0;i < length - j;i++)         {             //比较相邻两个数值的大小并进行交换             if (sequence_array[i] > sequence_array[i + 1])             {                 k = sequence_array[i];                 sequence_array[i] = sequence_array[i + 1];                 sequence_array[i + 1] = k;             }         }     }                 } 这个定义了int类型返回值, 却不返回, 严格语法检查时, 也是错的, 你没有返回任何值.

引用 1 楼 zhouqinghe24 的回复:29行  的int 去掉就好了  好了，谢谢！  我粗心了

引用 2 楼 u012061345 的回复:错误提示写的很清楚。  参数列表不指明类型，只能用在函数定义处。  29行是函数声明。所有应该写成：  int sequence_size(int sequence_array[],int length);  呃，看错了，按1楼的办。

29行  的int 去掉就好了


Question: 指针求教。。。

引用 1 楼 zhouqinghe24 的回复:读取一个字符，但忽略它。不给任何变量赋值  http://bbs.csdn.net/topics/30002899我知道了，谢谢

因为每次读取时会读取到回车 \n  所以这个字符应该是 忽略回车的


Question: 关于数组元素命名

我觉得可以这样：枚举变量来表示下标 比如 jack是0 mike是1等等 还有引用是C++中的 map表也可以一个名字对应一个值key-value模式

#include<stdio.h> void main() { float i,sum=0,f=1; 	for (i = 1;i<=30;i++) 	{ 		f*=i; 		sum+=f; 	} 	printf("%e",sum); }

数组元素可以通过下标操作来引用，下标就是 [索引]，为什么有这种以字符串做索引的需求？c++标准库的map容器，如果以字符串作为key，就可以采用这种索引来操作，如mp["xxx"] = yyy;

首先你要这样是为了干嘛？要的话也可以的，#define jack 5    arr[jack]，但这样大部分来说就给人一种摸不着头脑的感觉……

7楼说的就是我的意思，多半不可行吧，在C里？也是我异想天开的

引用 1 楼 u013163178 的回复:在c++中是可以的，因为c++中有引用类型 #include<iostream> using namespace std; int main() {   int a[10];   int &jack = a[2];   cin >> jack;   cout << a[2];   return 0; }你没看懂 楼主想要什么  楼主要做的是  arr[jack] = 15;

引用 3 楼 beiguonanjiang 的回复:C中不可以吗？不可以

加下标不是命名，下标是一种运算

LZ说的是map吧？

C中不可以吗？

楼上说的有道理


Question: 由差集求原集的C语言算法实现！

3 楼分析的不错 由于 0 的存在，确定了最大数 7，也说明所有数字一定在 A 集合中出现 考虑其他数都在 0 ~ 7 之间的话 那么任何一个点将产生两个值( x - 0, 7 - x) 也就是说，集合内必有数据对相加为 7，且必有 N - 2 对（N 是 B 集合数字个数，） A 集合由于排好序了，从两侧找这样的数据对应该很容易 这个我大概想了一下，没有推导论证，但是我感觉找到的数据对不等于 N - 2 的话，集合无解 0 - {2 或5} - {3 或 4} - 7

顶3楼和4楼。

帮顶，可以参考一下摔砝码问题的代码

以下是我遇到这个问题 我会这样来想:特殊情况先不考虑 考虑大致情况   首先观察集合A 你会发现它会是n的平方  这样你就可以确定A是由多少个数组成。（由每个数与自身和其它俩俩相减）    得出由X个数字组成,程序实现很好得出。     之后不难观察出答案是在0点对称。假设取正数，如上例子就是 2 2 3 3 4 5 7   你会发现一定存在一个数大于等于7    题目给出 B的形式最小数是0   得出最大的数字一定为7  得出一定存在数字7 最小的数字一定存在0(题目给出)   根据b1<b2<b3<。。。。。。 得出7会减去其他会出现 X-2个不同的数字，测试数据位X为4则减出的除（0和7）之外设为X1和X2(X1<X2)  观察 2出现2次 3出现俩次推理出  7- X2  7 - X1  X2 -X1  X1-0 必然出现俩个2和俩个3 解方程讨论 程序就是遍历  剩下的就是把一步一步想法变成程序的过程。

帮顶

没人吗？自顶一下！


Question: C语言如何做到txt文件按空格按顺序读取两个文件并把结果生成另一个txt文件

把2个文件数据读到数组，然后循环取出所需的数据 不就可以


Question: 如何求一个大数的阶乘

补充一句，他们所谓的数组大概指的是高精度运算，自行百度即可，简单来说就是手动模拟列竖式运算

#include<stdio.h> #include<string.h> int a[100000]; int main(){     int i,j,t;     int n;     int m;     while(~scanf("%d",&n))     {         t=1;         memset(a,0,sizeof(a));         a[0]=1;         for(i=1;i<=n;i++){             m=0;             for(j=0;j<t;j++){                 a[j]=a[j]*i+m;                 m=a[j]/10;                 a[j]=a[j]%10;                 if(m&&t<=j+1)                    t++;             }         }         for(i=t-1;i>=0;i--)            printf("%d",a[i]);         printf("\n");     }     return 0; }

大数会超过数据类型所能表示的最大范围，使用字符数组保存数据 搜大数乘法算法

int不能保存的数字，就用字符串来表示他。 要理解大数阶乘，首先要知道大数加法。举个例子 求100!? 要求100的阶乘，那么就要就要求99的阶乘，让后把99的阶乘累加100 次就可以了，问题转化到了求99的阶乘了，求99的阶乘就需要知道98的阶乘，把98的阶乘累加99次就可以了。。。。。 最终问题转化为求１的阶乘，１的阶乘是１.通过这个方法我们就把乘法运算转化为加法了，不是吗。


Question: 筛选法求素数，请问这第十行代码是什么意思啊?

这么乱的代码，你这第十行指的是哪行？别忘了你有这个操作a[j]=0;

在VS2008里面编译正常运行啊，没有错误啊

ubuntu 14.04 gcc 编译测试  正常运行了


Question: 关于c语言中字符串指针赋值的问题

引用 3 楼 Vanquish_self 的回复:谢谢啊   不过我刚刚改了一下   发现只是那个小于号的问题  改成赋值就可以了    那个传地址不用改，改了反而错了。因为我在函数定义的时候传递是指针，最后返回了，所有形参的值是变了的。   至于那个初始化的问题我一开始也有想到，不过可能是编程习惯不好（惭愧中），一直没有改。但是这里不用初始化也可以通过。 不过还是谢谢啊   那个小于号的问题不是语法错误编译都检查不出来   自己粗心也是醉了 -，-   再次说声谢谢 不过这个符号&  在c语言中的作用  说实话除了或运算我真的不怎么会用  虽然知道在c++中是引用的含义   可是一直也没有搞清楚如果大神了解的话   还请大神多指点指点  嘿嘿  谢啦听人劝吃饱饭。你的问题不仅仅是你发现的小于号改成=号的问题。main里要定义成对象而不是指针（如果是指针就要malloc或者让其指向有效的对象，否则就是野指针），然后通过&取地址传给StrAssign方法。free后要记得将指针置为0，以便之后对指针的判断是有效的。

引用 2 楼 dizuo 的回复:问题很多啊。 int main(){ char*s="i love chian."; HString T; // 定义对象，初始化 T.ch  = 0; T.length = 0;  StrAssign(&T,s); // 传地址 printf("%s\n",T->ch); }   StrAssign中 for(i=0;i<T->length;i++){     	T->ch[i]<c[i]; // 这里时复制，T->ch[i] = c[i];     }  最后记得释放T.ch指针。。。 引用 2 楼 dizuo 的回复:问题很多啊。 int main(){ char*s="i love chian."; HString T; // 定义对象，初始化 T.ch  = 0; T.length = 0;  StrAssign(&T,s); // 传地址 printf("%s\n",T->ch); }   StrAssign中 for(i=0;i<T->length;i++){     	T->ch[i]<c[i]; // 这里时复制，T->ch[i] = c[i];     }  最后记得释放T.ch指针。。。谢谢啊   不过我刚刚改了一下   发现只是那个小于号的问题  改成赋值就可以了    那个传地址不用改，改了反而错了。因为我在函数定义的时候传递是指针，最后返回了，所有形参的值是变了的。   至于那个初始化的问题我一开始也有想到，不过可能是编程习惯不好（惭愧中），一直没有改。但是这里不用初始化也可以通过。 不过还是谢谢啊   那个小于号的问题不是语法错误编译都检查不出来   自己粗心也是醉了 -，-   再次说声谢谢 不过这个符号&  在c语言中的作用  说实话除了或运算我真的不怎么会用  虽然知道在c++中是引用的含义   可是一直也没有搞清楚如果大神了解的话   还请大神多指点指点  嘿嘿  谢啦

char*s="i love chian."; 改成char s[]="i love chian."


Question: 实在没办法了

引用 2 楼 zhao4zhong1 的回复:删掉#include <WinUser.h> 或改为#include <winuser.h> 不行，但我找到解决办法了，我不直接新建dll工程，而是建win32控制台工程，然后选择dll，这样就不会出现这个问题了，也不知是不是vs的bug啊

引用 1 楼 u010005508 的回复:函数名前面加个全局作用越标示符(：：）试一下 不行，但我找到解决办法了，我不直接新建dll工程，而是建win32控制台工程，然后选择dll，这样就不会出现这个问题了

函数名前面加个全局作用越标示符(：：）试一下


Question: 求助！！！

这个程序本身不是比较输入的数之间的比较吗？我就想弄清楚具体是怎么比较的。。。由i和j的初始值为0，到i=j经过了怎样的过程？

整体一个大循环，输入单个字符，然后j从0开始循环，输入过的字符跟当前的字符比较，如果之前没有这个字符，将这个字符数出来，如果之前已经有这个字符，直接跳出，输入下一个字符进行判断，不知道对你有没有帮助。。。。。

能不能详细解释一下那个for循环，，，刚刚学，，，对循环感到很困惑。。。

if(j = i)//这是一个赋值语句，只要i不是０，if就是真 if(j == i)//这是一个逻辑判断，只有当j和i的值相等时候才为真


Question: db2 bind问题

版主在吗？您有办法解决吗？

论坛有哪位朋友能指点下吗？找了很多资料无法解决

貌似这是软件生成的，就算改了感觉以后还会有其他问题


Question: C语言中序线索化！我知道我的代码错了但不知道怎么改。。

楼主想问什么问题呢？？ 赵四老师的回复挺有用的，谢谢！学习了~~~

仅供参考#include <iostream> #include <stack> #include <queue> #include <locale.h> using namespace std; typedef struct BiTNode {//二叉树结点     char data;                      //数据     struct BiTNode *lchild,*rchild; //左右孩子指针 } BiTNode,*BiTree; int CreateBiTree(BiTree &T) {//按先序序列创建二叉树     char data;     scanf("%c",&data);//按先序次序输入二叉树中结点的值（一个字符），‘#’表示空树     if (data == '#') {         T = NULL;     } else {         T = (BiTree)malloc(sizeof(BiTNode));         T->data = data;         //生成根结点         CreateBiTree(T->lchild);//构造左子树         CreateBiTree(T->rchild);//构造右子树     }     return 0; } void Visit(BiTree T) {//输出     if (T->data != '#') {         printf("%c ",T->data);     } } void PreOrder(BiTree T) {//先序遍历     if (T != NULL) {         Visit(T);               //访问根节点         PreOrder(T->lchild);    //访问左子结点         PreOrder(T->rchild);    //访问右子结点     } } void InOrder(BiTree T) {//中序遍历     if (T != NULL) {         InOrder(T->lchild);     //访问左子结点         Visit(T);               //访问根节点         InOrder(T->rchild);     //访问右子结点     } } void PostOrder(BiTree T) {//后序遍历     if (T != NULL) {         PostOrder(T->lchild);   //访问左子结点         PostOrder(T->rchild);   //访问右子结点         Visit(T);               //访问根节点     } } void PreOrder2(BiTree T) {//先序遍历(非递归) //访问T->data后，将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，再先序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             printf("%c ",p->data);  //访问根节点             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈             stack.pop();             p = p->rchild;          //访问右子树         }     } } void InOrder2(BiTree T) {//中序遍历(非递归) //T是要遍历树的根指针，中序遍历要求在遍历完左子树后，访问根，再遍历右子树。 //先将T入栈，遍历左子树；遍历完左子树返回时，栈顶元素应为T，出栈，访问T->data，再中序遍历T的右子树。     stack<BiTree> stack;     BiTree p = T;//p是遍历指针     while (p || !stack.empty()) {   //栈不空或者p不空时循环         if (p != NULL) {             stack.push(p);          //存入栈中             p = p->lchild;          //遍历左子树         } else {             p = stack.top();        //退栈，访问根节点             printf("%c ",p->data);             stack.pop();             p = p->rchild;          //访问右子树         }     } }  typedef struct BiTNodePost{     BiTree biTree;     char tag; } BiTNodePost,*BiTreePost; void PostOrder2(BiTree T) {//后序遍历(非递归)     stack<BiTreePost> stack;     BiTree p = T;//p是遍历指针     BiTreePost BT;     while (p != NULL || !stack.empty()) {//栈不空或者p不空时循环         while (p != NULL) {//遍历左子树             BT = (BiTreePost)malloc(sizeof(BiTNodePost));             BT->biTree = p;             BT->tag = 'L';//访问过左子树             stack.push(BT);             p = p->lchild;         }         while (!stack.empty() && (stack.top())->tag == 'R') {//左右子树访问完毕访问根节点             BT = stack.top();             stack.pop();//退栈             printf("%c ",BT->biTree->data);         }         if (!stack.empty()) {//遍历右子树             BT = stack.top();             BT->tag = 'R';//访问过右子树             p = BT->biTree;             p = p->rchild;         }     } }  void LevelOrder(BiTree T) {//层次遍历     if (T == NULL) return;     BiTree p = T;     queue<BiTree> queue;//队列     queue.push(p);//根节点入队     while (!queue.empty()) {    //队列不空循环         p = queue.front();      //对头元素出队         printf("%c ",p->data);  //访问p指向的结点         queue.pop();            //退出队列         if (p->lchild != NULL) {//左子树不空，将左子树入队             queue.push(p->lchild);         }         if (p->rchild != NULL) {//右子树不空，将右子树入队             queue.push(p->rchild);         }     } } int main() {     BiTree T;      setlocale(LC_ALL,"chs");     CreateBiTree(T);      printf("先序遍历        ：");PreOrder  (T);printf("\n");     printf("先序遍历(非递归)：");PreOrder2 (T);printf("\n");                                                printf("\n");     printf("中序遍历        ：");InOrder   (T);printf("\n");     printf("中序遍历(非递归)：");InOrder2  (T);printf("\n");                                                printf("\n");     printf("后序遍历        ：");PostOrder (T);printf("\n");     printf("后序遍历(非递归)：");PostOrder2(T);printf("\n");                                                printf("\n");     printf("层次遍历        ：");LevelOrder(T);printf("\n");      return 0; } //ABC##DE#G##F### //先序遍历        ：A B C D E G F //先序遍历(非递归)：A B C D E G F // //中序遍历        ：C B E G D F A //中序遍历(非递归)：C B E G D F A // //后序遍历        ：C G E F D B A //后序遍历(非递归)：C G E F D B A // //层次遍历        ：A B C D E F G //  ///       A ///      / ///     B ///    / \ ///   C   D ///      / \ ///     E   F ///      \ ///       G


Question: C语言编译问题

第一种可执行文件我们一般叫应用程序，第二个你说的操作系统自身的文件一般叫内核映像（Image）。两个文件中真正的执行部分内容——机器码集合，都是由同一个CPU指令集的指令构成的（不考虑交叉编译情形）。两者之间的不同： 1、但正如你自己提到的，应用程序要调用操作系统接口函数，意味着：应用程序依赖内核映像，内核映像是为应用程序服务的，虽然应用程序需要的一些服务并不一定非要转入到内核来完成。 2、在Windows上，内核映像（一般是ntoskrnl.exe）和应用程序在格式上都遵循PE标准，只是真正执行的机器码集合不一样。

引用 1 楼 binaryhead 的回复:[quote=引用 楼主 gscaiyucheng 的回复:] Windows操作系统下，一个简单的C源代码经过编译后生成可执行文件，这个可执行文件是运行在操作系统上的，要调用操作系统提供的接口函数。  我的问题： 拿操作系统来说，无论windows系统还是linux，都是由C语言、汇编或者C++编写的(这里先不管具体用什么语言编写的)，这些操作系统源代码经过编译后就是操作系统文件。 1.那么这些经过编译的操作系统文件里面都是机器码，是cpu指令集吗？ 2.和之前在操作系统环境下编译生成的可执行文件不同是因为编译器的原因吗？  希望有大侠指点一下，非常感谢 我来试图回答高手们不太愿意回答的问题。 1、这些经过编译的操作系统文件里面实际可执行部分内容的确是机器码，但文件还包含其它辅助内容。是CPU指令构成的集合，但不能说是CPU指令集，一般CPU指令集是指CPU所有支持指令的集合。打个比方，汉字集指所有汉字的集合，一个操作系统文件中的机器码的集合对应为一本实际由汉字构成的书。 2、不太明白你第二个问题的意思，倒是有一个相关的问题，我已经在我的博文中做了回答，可参考：http://blog.csdn.net/binaryhead/article/details/41083927[/quote]  第二个问题的意思是： 现在有两种编译后的文件 第一种是在windows操作系统中经过编译的c源代码像.exe文件，也就是可执行文件，它的运行要调用操作系统接口函数 第二种就是用C语言、汇编等编写的操作系统自身，它们也要经过编译 那么这两个编译后的文件有什么不同吗？

引用 楼主 gscaiyucheng 的回复:Windows操作系统下，一个简单的C源代码经过编译后生成可执行文件，这个可执行文件是运行在操作系统上的，要调用操作系统提供的接口函数。  我的问题： 拿操作系统来说，无论windows系统还是linux，都是由C语言、汇编或者C++编写的(这里先不管具体用什么语言编写的)，这些操作系统源代码经过编译后就是操作系统文件。 1.那么这些经过编译的操作系统文件里面都是机器码，是cpu指令集吗？ 2.和之前在操作系统环境下编译生成的可执行文件不同是因为编译器的原因吗？  希望有大侠指点一下，非常感谢 我来试图回答高手们不太愿意回答的问题。 1、这些经过编译的操作系统文件里面实际可执行部分内容的确是机器码，但文件还包含其它辅助内容。是CPU指令构成的集合，但不能说是CPU指令集，一般CPU指令集是指CPU所有支持指令的集合。打个比方，汉字集指所有汉字的集合，一个操作系统文件中的机器码的集合对应为一本实际由汉字构成的书。 2、不太明白你第二个问题的意思，倒是有一个相关的问题，我已经在我的博文中做了回答，可参考：http://blog.csdn.net/binaryhead/article/details/41083927


Question: 怎样把结构数组初始化为0？

bzero memset

用结构体，定义一个变量，用变量来初始化

赞同九楼的方法

引用 2 楼 snowmagic 的回复:cand[10] = {0} 这个我试了一下，还是只能把第一个结构（各个字段）初始化为0，其他9个结构仍然没有初始化。

干脆设成全局变量好了。 像这么“巨大”的数组栈不一定能装得下

引用 1 楼 runner90 的回复:memset(&cand, 0, sizeof(CAND)); 这个是可以，但我希望在定义的时候初始化。

数组使用memset比较好。其实初始化使用{0}也是使用的memset

cand[10] = {0}

memset(&cand, 0, sizeof(CAND));

1. 定义成全局的或者static的 2. 用0初始化第一个内部为0，再用这个变量初始化其它的， 类似int aa[2] = {0,aa[0]};

你以后就会在血泪经验中明白调试器就是一个垃圾

引用 10 楼 taodm 的回复:printf/cout看到的才是真实，别太相信调试器。 [quote=引用 8 楼 screen12 的回复:] [quote=引用 7 楼 taodm 的回复:] 楼主用的什么编译器？怎么确认的没有初始化？ VS2008，我是调试的方法确定没有初始化的。因为调试状态下，查看发现cand[0]里面各个变量全部被清为0，但从cand[1]到cand[9]，里面的变量是各种各样的值。因为本来定义的就是局部变量，其值是不确定的。  按照道理讲，初始化第一个结构，后面的都应该清0，结果却不是，令人郁闷。[/quote][/quote] 什么？调试显示的变量值都不一定对？我有点震惊了。

printf/cout看到的才是真实，别太相信调试器。 引用 8 楼 screen12 的回复:[quote=引用 7 楼 taodm 的回复:] 楼主用的什么编译器？怎么确认的没有初始化？ VS2008，我是调试的方法确定没有初始化的。因为调试状态下，查看发现cand[0]里面各个变量全部被清为0，但从cand[1]到cand[9]，里面的变量是各种各样的值。因为本来定义的就是局部变量，其值是不确定的。  按照道理讲，初始化第一个结构，后面的都应该清0，结果却不是，令人郁闷。[/quote]

struct a {   int a;   int b[10]; } struct a tmp[10]; memset(tmp,0 ,10 * sizeof(struct a));

引用 7 楼 taodm 的回复:楼主用的什么编译器？怎么确认的没有初始化？ VS2008，我是调试的方法确定没有初始化的。因为调试状态下，查看发现cand[0]里面各个变量全部被清为0，但从cand[1]到cand[9]，里面的变量是各种各样的值。因为本来定义的就是局部变量，其值是不确定的。  按照道理讲，初始化第一个结构，后面的都应该清0，结果却不是，令人郁闷。

楼主用的什么编译器？怎么确认的没有初始化？


Question: C里允许数组动态声明？

To: user-2 多谢多谢！搜了一下果然是允许的。C99新实现的特性。  To: focuslight 是可以的，你可以用新一点的gcc编译一下我那个程序。

应该会报错/..........

gcc支持变长数组。楼主自己搜一下”gcc 变长数组“看看


Question: 总是会出现“error C2144: syntax error : missing ';' before type 'int'”，求大神帮忙

这是我的部分代码 #include<stdio.h> #include<stdlib.h> #include<string.h> typedef SElemType int;//在这里 #define STACK_INIT_SIZE 100; #define STACKINCREMENT 10; typedef sturct  { SElemType *base; SElemType *top; int stacksize; }SqStack;

谢谢大家热心的回答我这初学数据结构的渣渣

把你的 #define 后面的分号去了！！！

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

引用 2 楼 amber_17 的回复:改了，还是不行，还是出现同样的错误 typedef int  SElemType; 加个分号

typedef SElemType int      缺分号 #define STACK_INIT_SIZE 100;    多了分号 #define STACKINCREMENT 10;   多了分号

啧 typedef int SElemType;

改了，还是不行，还是出现同样的错误

typedef SElemType int 改成 typedef int  SElemType   自己看错误提示不会么啊？


Question: 请教链表释放内存问题

引用 3 楼 mcmay 的回复:不过不知为何C Primer Plus的最后一章中却是按照那种错误的方法释放内存却没有出现运行时的问题。 内存的问题经常是这样的，所谓的“不可预料的结果”，时好时坏，不好复现，最怕的就是这种问题。

引用 2 楼 user-1 的回复:一个小问题： getchar()的返回值是int类型，所以dummy也应该是int，特别是要和EOF比较的时候。具体的原因楼主可以自己搜一下"EOF 类型"或者"EOF int“ 是的，我这一点是忽略了，习惯char了。

引用 1 楼 user-1 的回复:free (temp_ch);             temp_ch = temp_ch->next; temp_ch被free了之后就不能再用了，它所在的内存有可能被操作系统分配给别人然后被修改。 应该这样： next = temp_ch->next; free (temp_ch); temp_ch = next; 我也是这么想的，后来我也改成你建议的办法。谢谢！不过不知为何C Primer Plus的最后一章中却是按照那种错误的方法释放内存却没有出现运行时的问题。


Question: Linux下通过上下方向键实现查看命令历史

bash是开源的，参考其源代码。

readline库是现成的。

历史命令其实就是一个双向链表。  保存每个命令就可以了。 根据你自己的业务需求来做就可以

UP


Question: X:\X\X\x.exe 文件没有找到

引用 3 楼 user-2 的回复:你把软件关了，然后打开1.h所在的位置，右键，生命名，1.cpp..再用VC打开这错别字。。。 你把软件关了，然后打开1.h所在的位置，右键，重命名为1.c..再用VC打开

引用 1 楼 zxh707wk 的回复:.h文件？把后缀名改成.c的 不太懂..求怎么改...

.h文件？把后缀名改成.c的


Question: 大一新生，遇到个小问题

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

试过输入数字的，但输入数字后没反应，换成输入字符的就可以，不知道哪错了 #include "stdio.h" void main() { int i,n=10,a[10];   float av=0.00000; for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) { printf("%d",a[i]); if (i%3==0) printf("\n"); } for(i=0;i!=n;i++) av+=(float)a[i]; printf("av=%f\n",av); }

你直接输入数字不就得了，干嘛输入字符啊，这不是多此一举嘛~

运行得了啊。我用的是vc++6.0

大哥，调试过吗？程序都运行不了，void去掉，或改成int

考lz基本语法。。。


Question: 基于tcp socket双向传输 多线程编程

仅供参考//循环向a函数每次发送200个字节长度（这个是固定的）的buffer, //a函数中需要将循环传进来的buffer，组成240字节（也是固定的）的新buffer进行处理， //在处理的时候每次从新buffer中取两个字节打印 #ifdef WIN32     #pragma warning(disable:4996) #endif #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <process.h>     #include <io.h>     #define  MYVOID             void     #define  vsnprintf          _vsnprintf #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} #define ASIZE    200 #define BSIZE    240 #define CSIZE      2 char Abuf[ASIZE]; char Cbuf[CSIZE]; CRITICAL_SECTION cs_HEX ; CRITICAL_SECTION cs_BBB ; struct FIFO_BUFFER {     int  head;     int  tail;     int  size;     char data[BSIZE]; } BBB; int No_Loop=0; void HexDump(int cn,char *buf,int len) {     int i,j,k;     char binstr[80];      Lock(&cs_HEX);     for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%03d %04x -",cn,i);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             Log("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         Log("%s\n",binstr);     }     Unlock(&cs_HEX); } int GetFromRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      lent=0;     Lock(cs);     if (fbuf->size>=len) {         lent=len;         if (fbuf->head+lent>BSIZE) {             len1=BSIZE-fbuf->head;             memcpy(buf     ,fbuf->data+fbuf->head,len1);             len2=lent-len1;             memcpy(buf+len1,fbuf->data           ,len2);             fbuf->head=len2;         } else {             memcpy(buf     ,fbuf->data+fbuf->head,lent);             fbuf->head+=lent;         }         fbuf->size-=lent;     }     Unlock(cs);     return lent; } MYVOID thdB(void *pcn) {     char        *recv_buf;     int          recv_nbytes;     int          cn;     int          wc;     int          pb;      cn=(int)pcn;     Log("%03d thdB              thread begin...\n",cn);     while (1) {         sleep_ms(10);         recv_buf=(char *)Cbuf;         recv_nbytes=CSIZE;         wc=0;         while (1) {             pb=GetFromRBuf(cn,&cs_BBB,&BBB,recv_buf,recv_nbytes);             if (pb) {                 Log("%03d recv %d bytes\n",cn,pb);                 HexDump(cn,recv_buf,pb);                 sleep_ms(1);             } else {                 sleep_ms(1000);             }             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef WIN32     pthread_exit(NULL); #endif } int PutToRBuf(int cn,CRITICAL_SECTION *cs,FIFO_BUFFER *fbuf,char *buf,int len) {     int lent,len1,len2;      Lock(cs);     lent=len;     if (fbuf->size+lent>BSIZE) {         lent=BSIZE-fbuf->size;     }     if (fbuf->tail+lent>BSIZE) {         len1=BSIZE-fbuf->tail;         memcpy(fbuf->data+fbuf->tail,buf     ,len1);         len2=lent-len1;         memcpy(fbuf->data           ,buf+len1,len2);         fbuf->tail=len2;     } else {         memcpy(fbuf->data+fbuf->tail,buf     ,lent);         fbuf->tail+=lent;     }     fbuf->size+=lent;     Unlock(cs);     return lent; } MYVOID thdA(void *pcn) {     char        *send_buf;     int          send_nbytes;     int          cn;     int          wc;     int           a;     int          pa;      cn=(int)pcn;     Log("%03d thdA              thread begin...\n",cn);     a=0;     while (1) {         sleep_ms(100);         memset(Abuf,a,ASIZE);         a=(a+1)%256;         if (16==a) {No_Loop=1;break;}//去掉这句可以让程序一直循环直到按Ctrl+C或Ctrl+Break或当前目录下存在文件No_Loop         send_buf=(char *)Abuf;         send_nbytes=ASIZE;         Log("%03d sending %d bytes\n",cn,send_nbytes);         HexDump(cn,send_buf,send_nbytes);         wc=0;         while (1) {             pa=PutToRBuf(cn,&cs_BBB,&BBB,send_buf,send_nbytes);             Log("%03d sent %d bytes\n",cn,pa);             HexDump(cn,send_buf,pa);             send_buf+=pa;             send_nbytes-=pa;             if (send_nbytes<=0) break;//             sleep_ms(1000);             if (No_Loop) break;//             wc++;             if (wc>3600) Log("%03d %d==wc>3600!\n",cn,wc);         }         if (No_Loop) break;//     } #ifndef WIN32     pthread_exit(NULL); #endif } int main() { #ifdef WIN32     InitializeCriticalSection(&cs_log);     InitializeCriticalSection(&cs_HEX );     InitializeCriticalSection(&cs_BBB ); #else     pthread_t threads[2];     int threadsN;     int rc;     pthread_mutex_init(&cs_log,NULL);     pthread_mutex_init(&cs_HEX,NULL);     pthread_mutex_init(&cs_BBB,NULL); #endif     Log("Start===========================================================\n");      BBB.head=0;     BBB.tail=0;     BBB.size=0;  #ifdef WIN32     _beginthread((void(__cdecl *)(void *))thdA,0,(void *)1);     _beginthread((void(__cdecl *)(void *))thdB,0,(void *)2); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,thdA,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1);     rc=pthread_create(&(threads[threadsN++]),NULL,thdB,(void *)2);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif      if (!access("No_Loop",0)) {         remove("No_Loop");         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     while (1) {         sleep_ms(1000);         if (No_Loop) break;//         if (!access("No_Loop",0)) {             No_Loop=1;         }     }     sleep_ms(3000);     Log("End=============================================================\n"); #ifdef WIN32     DeleteCriticalSection(&cs_BBB );     DeleteCriticalSection(&cs_HEX );     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_BBB);     pthread_mutex_destroy(&cs_HEX);     pthread_mutex_destroy(&cs_log); #endif     return 0; }

引用 3 楼 u013150633 的回复:[quote=引用 1 楼 zxh707wk 的回复:] 客户端：发送 服务器：接收，发送 客户端：接收，发送 服务器：接收，发送 。。。 太抽象了，能具体点吗？[/quote] 线程应该如何建立，如何使用？

引用 1 楼 zxh707wk 的回复:客户端：发送 服务器：接收，发送 客户端：接收，发送 服务器：接收，发送 。。。 太抽象了，能具体点吗？

引用 3 楼 u013150633 的回复:太抽象了，能具体点吗？ 客户端：向服务器发送连接请求建立连接，然后发送数据 服务器：接收客户端数据，发送给客户端相对应的数据 客户端：接收服务器端返回的数据，发送给服务器端相对应的数据 服务器：接收客户端数据，发送给客户端相对应的数据 。。。

没用过，马克


Question: 如何写一个函数，开辟内存，并返回首地址；

malloc最终也是调用了windows的 分配堆的函数的，如何你自己实现也是调用平台API在自己管理，所以没意义的

引用 28 楼 lin5161678 的回复:[quote=引用 27 楼 hwx342840456 的回复:] [quote=引用 21 楼 lin5161678 的回复:] [quote=引用 20 楼 u013163178 的回复:] [quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组[/quote]   我用的VC++ 6.0。编译无法通过。[/quote] 1 你回复错人了  2 别用 VC6.0[/quote]  不用VC6.0那用什么？求推荐哎？VC6.0是无法编译通过可变长数组的

引用 27 楼 hwx342840456 的回复:[quote=引用 21 楼 lin5161678 的回复:] [quote=引用 20 楼 u013163178 的回复:] [quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组[/quote]   我用的VC++ 6.0。编译无法通过。[/quote] 1 你回复错人了  2 别用 VC6.0

引用 21 楼 lin5161678 的回复:[quote=引用 20 楼 u013163178 的回复:] [quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组[/quote]   我用的VC++ 6.0。编译无法通过。

malloc,realloc,free

引用 21 楼 lin5161678 的回复:[quote=引用 20 楼 u013163178 的回复:] [quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组[/quote] 学习了

引用 19 楼 liu_lakers 的回复:出这种题的都是变态吗？？ 什么情况下会用到你自己去写这种函数？  真尼玛恶心。很多人学编程都钻牛角尖，殊不知，真正工作中基本都是用最朴实无华的代码。工作中越是高手，写的代码越朴实。还是用得到的，比如在管理共享内存的时候，就可以按照堆的方式先申请一大片连续的内存然后来分配

这一定是老谭干的，我被他坑过 于是我就用了VirtualAlloc……

引用 20 楼 u013163178 的回复:[quote=引用 10 楼 hwx342840456 的回复:] [quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */[/quote]你才应该去百度 变长数组  变长数组定义有限制 不是你随便写写就出来的  static 不能做变长数组

引用 10 楼 hwx342840456 的回复:[quote=引用 8 楼 u013163178 的回复:]  void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。[/quote]你为什么不编译呢，你知道只要你的编译器不太老，他就能编译通过，还能运行呢,如果不知道为什么，请百度c99变长数组 #include <stdio.h>  int main(void) { 	// your code goes here 	int n; 	scanf("%d",&n); 	char a[n]; 	scanf("%s",a); 	printf("%s\n",a); 	return 0; } /* Input: 20 helloworld  Output: helloworld */

引用 13 楼 liulianglin 的回复:[quote=引用 9 楼 hwx342840456 的回复:] [quote=引用 7 楼 liulianglin 的回复:] [quote=引用 4 楼 hwx342840456 的回复:] [quote=引用 3 楼 liulianglin 的回复:] ”动态的控制字符数组的长度“   是几个意思   字符数组的长度是通过你自己传进去的参数来控制的，最后你只是返回一个指向n个字符的指针而已。。。  你传个代码上来看看行不行？如何开辟一段连续的n个字节的内存。另外，字符数组的长度如何通过我穿进去的参数来控制？[/quote]  static void *buf = 0x10000000; static int pos = 0; void *alloc(int n) {     if ( (pos + n) >1000 )      {         return NULL;     }     else     {         pos += n;         return  (buf + pos - n);     } } free(void *p) {     pos -= (p - buf); }[/quote]  我看明白了，你这个是最先就指定好了再某个地址开始开辟空间，但是这样有风险啊，假设这个地址里面是有数据的，岂不是就破坏了？[/quote]     malloc函数的实质体现在它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时，它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后，将该内存块一分为二（一块的大小与用户请求的大小相等，另一块的大小就是剩下的字节）。接下来，将分配给用户的那块内存传给用户，并将剩下的那块（如果有的话）返回到连接表上。[/quote]你对 malloc 的解释是对的 但是和你的错误 毫无关系  你的做法会破坏程序堆栈 依然是错的

引用 8 楼 u013163178 的回复: void * f(int n) { static char a[n]; return a; } 这是错的  VLA 不可以是 static 或者 全局

难度毛线  标准C做不到  平台相关而已

mmap应该可以

直接看malloc函数原型。。。 http://blog.csdn.net/hzhzh007/article/details/6424638

引用 9 楼 hwx342840456 的回复:[quote=引用 7 楼 liulianglin 的回复:] [quote=引用 4 楼 hwx342840456 的回复:] [quote=引用 3 楼 liulianglin 的回复:] ”动态的控制字符数组的长度“   是几个意思   字符数组的长度是通过你自己传进去的参数来控制的，最后你只是返回一个指向n个字符的指针而已。。。  你传个代码上来看看行不行？如何开辟一段连续的n个字节的内存。另外，字符数组的长度如何通过我穿进去的参数来控制？[/quote]  static void *buf = 0x10000000; static int pos = 0; void *alloc(int n) {     if ( (pos + n) >1000 )      {         return NULL;     }     else     {         pos += n;         return  (buf + pos - n);     } } free(void *p) {     pos -= (p - buf); }[/quote]  我看明白了，你这个是最先就指定好了再某个地址开始开辟空间，但是这样有风险啊，假设这个地址里面是有数据的，岂不是就破坏了？[/quote]     malloc函数的实质体现在它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表。调用malloc函数时，它沿连接表寻找一个大到足以满足用户请求所需要的内存块。然后，将该内存块一分为二（一块的大小与用户请求的大小相等，另一块的大小就是剩下的字节）。接下来，将分配给用户的那块内存传给用户，并将剩下的那块（如果有的话）返回到连接表上。

引用 7 楼 liulianglin 的回复:[quote=引用 4 楼 hwx342840456 的回复:] [quote=引用 3 楼 liulianglin 的回复:] ”动态的控制字符数组的长度“   是几个意思   字符数组的长度是通过你自己传进去的参数来控制的，最后你只是返回一个指向n个字符的指针而已。。。  你传个代码上来看看行不行？如何开辟一段连续的n个字节的内存。另外，字符数组的长度如何通过我穿进去的参数来控制？[/quote]  static void *buf = 0x10000000; static int pos = 0; void *alloc(int n) {     if ( (pos + n) >1000 )      {         return NULL;     }     else     {         pos += n;         return  (buf + pos - n);     } } free(void *p) {     pos -= (p - buf); }[/quote]   1、return(buf + pos -n);和return buf没区别吧，为何用前者？ 2、以及指定了内存起始地址，直接让char *p=buf；然后P++就可以访问后面的字节了，alloc函数里面的操作感觉没有意义。

malloc    free的内部实现远不像想象的那么简单---”只是简单的分配一段内存“，感兴趣的话可以看一看malloc 源码  http://blog.csdn.net/zdl1016/article/details/8696514  人家写的挺仔细。。。

引用 8 楼 u013163178 的回复: void * f(int n) { static char a[n]; return a; }   你这个肯定不行的，怎么能动态开辟数组呢，a[n]，n不确定，系统不会给你开辟数组的。请先编译，通过了再贴代码，谢谢啦。


Question: 数据结构二叉树的问题

传指针是一种恶习 应该传引用。 传指针，需要检查是否为空，传引用就不用了

在栈里就这样写  BiTreePtr  T = (BiTreePtr ) malloc(sizeof(*BiTreePtr)); 然后给两个根子针NULL。这样树根节点就做好了，传给函数子节点想怎么搞就怎么搞。

struct node T 就可以传T了，你这传的是变量指针的变量指针，没那个必要。

传指针是一种恶习 应该传引用。 传指针，需要检查是否为空，传引用就不用了

楼上的两位似乎没看明白问题  typedef struct node  {  int data;       struct node *plChild;   struct node *prChild;   }*BiTreePtr;  这里已经出现了一次*，代表已经定义Bitree为指针类型了，但是为什么要再弄个*T呢？ 这是因为如果不写*T，而写T的话，T指向的内容虽然可以改变，但是T不能再指向别的了，也就是指向的位置不可改变 说得明白点，就是101号房间可以住很多人，但是不能变成102房。 所以传入*T，就能修改指向的位置了，使T指向新开辟的内存，不然的话： 0x8a7f614a指令使用的0x08a56de4内存，其值不能为"written" ……

传指针好，你可以修改内容，还可以修改它的指向。按值传递灵活性就没这么好了，我是这么想的

因为我们从来没有定义果一个节点变量，但是我们申请了很多快内存，大小干好符合节点，于是我们认为那写内存就是树的节点，我们操作树的节点就只有用指针，不然用什么


Question: C语言函数返回值输出乱码

static char str[100]="string-testing";

char temp[100];  strcpy( temp, str_catch_test() );

看标题我就知道是返回临时变量。。

干嘛返回局部变量，作死

那怎么解决啊？？？

搞明白了，str为局部变量，返回后被销毁了


Question: 字符串结尾

\0就是0的转译字符，就是null的转译字符。要问null从哪来的？c库函数在运行开始前都要初始化buff的，用memset将buff清零。除去你填充的字符，剩下都是这东西了。

编译器自带的结束符。

、\0就是自带的啊。。。

scanf自己会加上结束符'\0' scanf        s      Matches  a sequence of non-white-space characters; the next pointer must be a pointer to character array               that is long enough to hold the input sequence and the terminating null character ('\0'), which is added               automatically.   The  input  string stops at white space or at the maximum field width, whichever occurs               first.

#include<stdio.h>  #include<string.h> int main() {     int i;     // your code goes here     char str[100]={'h','e','l','l','\0','o'};     //scanf("%s",str); printf ("%u,%u\n",strlen(str),sizeof str);     return 0; } 若是不想把'\0'打印出来就先计算长度，strlen函数可以计算字符串长度，不包括'\0'在内，如上的程序输出为 4，100

读入的是字符串，在数组中进行存储就是以‘\0’表示字符串结束，你可以试一个对对一个字符数组进行初使化，多加几个‘\0’,用字符串输出，程序是会输出第一个‘\0’之前的数据，因为已经表示字符串结束，如：#include <stdio.h>  int main() {  char a[10] = {'t','e','s','\0','t'};  printf("%s\n",a);  return 0; } 只会输出tes

http://www.microsoft.com/visualstudio/chs/downloads#d-2010-express 点开Visual C++ 2010 Express下面的语言选‘简体中文’，再点立即安装  scanf的源代码在C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\input.c

你逗把，，编译器自己就会加啊

当然是自己加的，而且是编译器干的，不是scanf等干的，比如这个被gcc编译后有一段： .LC0: db "%s\n", 0 （好像是则个样子吧……）

看下scanf的汇编，

scanf("%s",str);   "%s"本身的意思就是表示读字符串，那字符串以什么结尾？'\0'！！！后面的倒是的确都是乱码值，因为是在函数内的内置类型。


Question: 这个代码哪有问题输出结果为什么一直是0

while(a) { a=a/10; count++; } //这个循环出来后a的值就是0

递归就是简单,可以如果我加一个条件输入的这个数字超过了int的范围,怎么办比如我输入100000000000，如果改成double的话就不能取整了,强制转换也会溢出

仅供参考 #include <stdio.h>  void funiction(int num) { 	if(!num)return ; 	printf("%d",num%10); 	funiction(num/10); }  int main() { 	int num; 	scanf("%d",&num); 	funiction(num); 	return 0; }

写代码 请注意缩进排版  养成好习惯   你贴的这些代码看着太费劲  代码出问题自己查找问题看着都费劲   别人就更没有帮你看然后去帮你的欲望了。。。  PS：倒序可以这么做 PS：提供一个思路:利用数组  #include   <stdio.h> int main() {       int   i,val;       int   a[5];       for(i=0;i<5;i++)       {             scanf("%d",&val);             a[i] = val;       }      for(i=4;i>=0;i--)      {            printf("%d",a[i]);      }      printf("\r\n*************  ^_^ 好好学习 越来越强***************\n");      return 0; }  LZ代码我是实在提不起兴趣看    这里就为你提供了一个新思路吧    代码测试正常。。。。

m=a/b; 这个时候a已经不是你输入的a了

就是找出一个数字的倒排数（比如123，输出321,103，输出301）  为什么我的代码一直输出结果是0啊


Question: 大神帮我看看这个程序

把        printf("请输入姓名：\n\n");   修改为    printf("请输入姓名：");

fflush(stdin)  刷新输入缓冲区  在两个输入之间调用

int number=0,sum=0,i=1,count=0; 	float average; 	char name[10]; 	char choice,choice1;  	printf("这个简单的程序可以计算出你们班学生的平均成绩\n你需要先输入姓名的拼写，然后输入分数！！\n\n请问你要继续吗？（y或者n）"); 	scanf("%c",&choice); 	if(toupper(choice)=='N') 		return 0; 	else 	{ 		printf("请输入你要求平均数的人数："); 		scanf("%d",&count) ;  		for(;i<=count;++i) 		{ 			printf("请输入姓名：\n\n");  			scanf("%s",name);  			printf("请输入该学生对应的分数："); 			scanf("%d",&number); 			printf("%s的分数是%d吗？请确认！！(y或者n)\n",name,number); 			scanf("%c",&choice1); 			if(toupper(choice1)=='N') 			{ 				printf("请再次输入姓名："); 				scanf("%s",name); 				printf("请再次输入该学生对应的分数："); 				scanf("%d",&number); 			}  			else 				sum+=number; 			printf("%s的分数是%d.",name,number); 		} 	} 	average=sum/i; 	printf("\n\n平均成绩是%f",average);

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。


Question: [提問]一段小代碼輸出不正確

引用 5 楼 jack_guanggong 的回复:两种解决方案： 第一种：正确使用scanf_s [quote=引用 1 楼 user-3 的回复:] scanf_s("%c",&ch,1); scanf_s()的写法格式错误 在调用时，必须提供一个数字以表明最多读取多少位字符。 用scanf应该就没事了 第二种： scanf_s不是标准C的内容，是微软为了防止缓冲区溢出漏洞对C标准库的扩展，不想看到警告就加一个 #define _CRT_SECURE_NO_WARNINGS 放在程序最前头  [/quote]謝謝指教!

两种解决方案： 第一种：正确使用scanf_s 引用 1 楼 user-3 的回复:scanf_s("%c",&ch,1); scanf_s()的写法格式错误 在调用时，必须提供一个数字以表明最多读取多少位字符。 用scanf应该就没事了 第二种： scanf_s不是标准C的内容，是微软为了防止缓冲区溢出漏洞对C标准库的扩展，不想看到警告就加一个 #define _CRT_SECURE_NO_WARNINGS 放在程序最前头

引用 3 楼 turingo 的回复:++  [quote=引用 1 楼 user-3 的回复:] scanf_s("%c",&ch,1); scanf_s()的写法格式错误 在调用时，必须提供一个数字以表明最多读取多少位字符。 用scanf应该就没事了[/quote] 你好,如果我使用scanf的話會有警告,無法編譯.,我用的編譯軟件是vs2013

++  引用 1 楼 user-3 的回复:scanf_s("%c",&ch,1); scanf_s()的写法格式错误 在调用时，必须提供一个数字以表明最多读取多少位字符。 用scanf应该就没事了

Visual studio2013版中,使用scanf程序無法編譯 ------------------------------------------------------------------------- 错误	1	error C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.


Question: 图的深度优先搜索求解答

图的深度优先遍历啊

看熟了以后这个顺序就跟物理学家眼里的场一样明显。

结合代码看看。

图中的说明不是写得很明白嘛。深度优先遍历。


Question: C中该怎么把游戏的得分写进文件，下次游戏开始是显示上次的分数，求大神指教！谢谢

最简单的，像这样a.out<score,输入重定向，

楼上能否说详细点，谢谢

fopen fread fclose

fopen fread fclose

打开游戏时fopen，游戏中时更新file

可以搜下资料，关于操作文件的。  也就是上面的各种file open。应该能搜索到文件的。


Question: 各位看看这个程序有什么错？？怎么一运行电脑重启

原因很简单。 LPTSTR suff=new TCHAR[1024]; 在不断申请内存，但是你没有释放，导致内存耗尽，改起来也很简单，可以在WM_TIMER开始的时候 用TCHAR * suff=new TCHAR[1024]; 在WM_TIMER消息return前使用delete suff[]；


Question: 问下，这个小白问题，还有微软开源的问题

引用问下，visual studio 。net开源的问题，对这些c++程序员有啥好处？  是不是得学学那个。net框架了。 asp跟asp。net有啥联系跟区别啊。  .net开源的话， 可以自己定制.net. 需不需就看你需不需定制了，有时间精力的话，可以研究研究。   asp vs asp.net

引用这个可以：int* next = new int[pLen]; 这个到底new出来的是数组么？  new [] 叫array new,  不是数组。

引用int plen = strlen(p);  int next[plen];//这就不行了  C99支持的， 变长数组。

指针就是地址，数组名是一个首地址，相当于常指针，分配一段连续的内存给指针，就相当于数组，只不过这个数组不是常指针而已。这些都是很基础的概念

.net和C++没什么关系，除非你打算玩C++/CLI。但学C++/CLI，还不如去学C#。CLI一般就用在C++和C#之间的粘合上

动态数组没有int next[plen]这样的写法，编译器不支持，你可以：  int* next = new int[pLen];   int* next = (int*)malloc(sizeof(int) * pLen);


Question: 由差集求原集的C语言算法实现

引用#1  可能是我开始题目没说明白，题目的意思是： A是由B中任意挑选两个数（同一个数可以选两次）做差得到的，且B的形式是（0，b1，b2，b3。。。）而且b1<b2<b3<...。求B集合。比如，A=（-7，-5，-4，-3，-2，-2，0,0,0,0,2,2,3,4,5,7），那么我们求得的B就可以是（0,2,4,7）或（0,3,5,7） 现在要求的是根据给定的一个A集合，求B集合。

仅供参考#include <algorithm> #include <iostream> #include <functional> #include <cstring> using namespace std; int main() {     char *Alphabet = "abcdefghijklmnopqrstuvwxyz" ;     char *Vowels   = "aeiou" ;     char *AlphaNum = "0123456789abcdef" ;     char result[45] ;     char *last ;      int lenA  = strlen(Alphabet) ;     int lenV  = strlen(Vowels  ) ;     int lenAN = strlen(AlphaNum) ;      cout << "Alphabet = " << Alphabet << endl ;     cout << "Vowels   = " << Vowels   << endl ;     cout << "AlphaNum = " << AlphaNum << endl ;      cout << "\nusing non-predicate versions" << endl ;      //non-predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //non-predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //non-predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      cout << "\nusing predicate versions" << endl ;      //predicate set_difference     last = set_difference(Alphabet, Alphabet+lenA,                           AlphaNum, AlphaNum+lenAN,                           result  , less<char>()) ;     *last = 0 ;     cout << "set_difference(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_intersection     last = set_intersection(Alphabet, Alphabet+lenA,                             AlphaNum, AlphaNum+lenAN,                             result  , less<char>()) ;     *last = 0 ;     cout << "set_intersection(Alphabet, AlphaNum) =  " << result << endl ;      //predicate set_symmetric_difference     last = set_symmetric_difference(Alphabet, Alphabet+lenA,                                     Vowels  , Vowels  +lenV,                                     result  , less<char>()) ;     *last = 0 ;     cout << "set_symmetric_difference(Alphabet, Vowels) =  " << result << endl ;      //predicate set_union     last = set_union(Alphabet, Alphabet+lenA,                      AlphaNum, AlphaNum+lenAN,                      result  , less<char>()) ;     *last = 0 ;     cout << "set_union(Alphabet, AlphaNum) =  " << result << endl ;      return 0 ; }

A是由B中任意挑选两个数（同一个数可以选两次）做差得到的，且B的形式是（0，b1，b2，b3。。。）而且b1<b2<b3<...。求B集合。比如，A=（-7，-5，-4，-3，-2，-2，0,0,0,0,2,2,3,4,5,7），那么我们求得的B就可以是（0,2,4,7）或（0,3,5,7） 现在要求的是根据给定的一个A集合，求B集合。 你这个是这个题目的答案吗？


Question: signed char的问题请教

关于无符号数和有符号数，楼主可以搜一下“原码、反码、补码”

checksum就是“校验和”，自己搜一下应该能找到很多详细的介绍。 这里的算法很简单，就是把所有输入加起来，结果只保留最低的一个字节。这个字节如果按无符号数来解释就是unsigned char，取值在0~255，0~0xFF。如果按有符号数来解释，就是-128~127，其中最高位是符号位。 无符号 -- 有符号 0 -- 0 1 -- 1 ... 127 -- 127 128 -- -128 129 -- -127 ... 254 -- -2 255 -- -1


Question: 关于栈与队列的主函数解释

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

引用 1 楼 user-4 的回复:每句？ 定义一个栈 定义一个队列 为栈分配空间 为队列分配空间 清空栈 清空队列 输出：enter train serious: 获取一串字符 输出换行 循环处理每一个字符：如果是 'H' 就入栈，如果不是就入栈再取出来放入队列 循环处理：如果栈中还有东西，取出来放到队列里 输出：new train serious: 循环处理队列：输出队列中的字符 输出换行 厉害！！！

void main(void) {     seqstack* st;     sequeue* trainsq;     char ch, trains[MAXSIZE], *p=trains;          /* 为st栈分配足够的空间 */     st = (seqstack*) malloc(sizeof(seqstack));     /* 为trainsq队列分配足够的空间*/     trainsq = (sequeue*)malloc(sizeof(sequeue));     /* 初始化st为空栈 */     setstacknull(st);     /* 初始化trainsq为空队列 */     setseqnull(trainsq);          /* 输入字符串并存放在trains数组中 */     printf("enter train serious:\n");     gets(trains);     putchar('\n');          /* 遍历trains字符串 */     while(ch = *p)     {         /* 如果字符是H，则压入st栈 */            if(ch == 'H')         {             push(st, ch);         }         /* 其它字符放到trainsq队列中，这三条语句的顺序可能是错的 */            else         {             push(st, ch);             ch = pop(st);             encyque(trainsq, ch);         }         p = p + 1;     }          /* 把st栈中剩下的字符依次弹出放到trainsq队列中 */     while(!empty(st))     {         ch = pop(st);         encyque(trainsq, ch);     }          /* 依次打印trainsq队列中的所有字符 */     printf("new train serious:\n");     while(ch = delcyque(trainsq))     {         putchar(ch);     }     putchar('\n'); }


Question: 题目意思

这个题，意思是从矩阵里的任意一个数字开始移动，每次只能移动到相邻位置且必须比当前位置数值低的位置里，这样移动到移无可移为止。选出最长的那条路径，就是输出路径长度。上面实例从25降到1，路径长度24


Question: 基类引用派生类的函数

第二个编译不过的原因是：实现了带参数构造函数，编译器就不会自动增加无参构造函数，实例化C类，就必须带一个int参数。

第一个应该编译不过，A类没有print这个函数 第二个应该也编译不过，编译器分辨不出ntest 到底是C的还是C::A的


Question: 通过指针移动给某个字符赋值

你的指针赋值的是一个 复合文字，是一个非符号常量，所以你是不能对这个常量时行修改的，但是你可以创建一个数组，进行赋值，这样得到一个拷贝，对拷贝进行操作再输出就不存在这个问题了，这就是你上面的问题，可能能加C语言复合文字一章

引用 2 楼 turingo 的回复:char *p = "hello"这样声明相当于p是常量指针，其内容不能被修改，改为char p[] = "hello"就好了。 学习了~

学习受教了！

char *p="hello"中，hello是常字符串，只可读取，不能进行修改。如果需要修改，需要用字符数组。

谢谢各位的回答，自己又查了一下资料，总结一下：  解决方法1  #pragma comment(linker,"/SECTION:.rdata,RW")，可以使常量区可写，否则，无法修改常量。  解决方法2  char *p = (char *）malloc(10 *sizeof(char)); 解决方法3  char p [] = "hello", 此时在数组p在栈上，然后把hello赋值到栈上，可以读写。  这个问题的原因是没有明白c语言中，指针和数组的区别，以及变量的存储。 char * p = "hello", 右边"hello"，是个字符串常量，存在于常量区，只读不可写，左边指针p，指向字符串常量的地址，可以改变指针的指向。 char p[ ]  = "hello "  ，右边也是个字符串常量，存在于内存常量区，也是只读的。左边是数组，赋值的时候，把字符串hell所在的常量区中的内容，复制到字符数组str中，每复制一个字符，就在栈上分配空间，该空间可以读写。 另外，数组名一个指针常量，不能作自增、自减等操作，不能被修改。

引用 6 楼 liulianglin 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！   这样做会不会很危险啊[/quote] 当然危险了！要不然我为啥要说“后果自负”呢？ 比如修改超过原始长度后面的位置时会覆盖后面的其它常量字符串。

引用 5 楼 zhao4zhong1 的回复:#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！   这样做会不会很危险啊

int main() { 	char *p = "hello"; 	char * cp; 	cp = p; 	*(cp + 3) = 'k'; 	printf("%s\n",p); 	return 0; }  如果char *p = "hello"; p是常量指针的话，那么重新定义一个指针cp，char * cp;让cp指向p，cp = p;然后	*(cp + 3) = 'k'; 也是不行的啊

常量字符串的值是不允许被修改的

"hello"的结果是常量指针，不能更改其内容的。而定义的数组则不是。


Question: 紧急求助各位大神一个问题！！

引用 2 楼 zhao4zhong1 的回复:#include <stdio.h>  int  i; FILE *fp;   Slice *currSlice = currMB->p_Slice;     int  i_last = currSlice->idr_flag? 1:cs->no_part;  //<slice的partition,对于IDR是不进行分割的，因此为1，    //########################test################   fp = fopen("E:\\data.txt","w");   fprintf(fp,"%d ",i_last);   fclose(fp);  //########################test################    DataPartition *partArr = &currSlice->partArr[0];   谢谢您的帮助，问题已经解决了~~

引用 1 楼 wwwwpppp628 的回复:从提示信息来看，分明指的是 这句有问题啊。 DataPartition *partArr = &currSlice->partArr[0];  有些语言或者编译器，变量必须要定义在函数开头，不能在中间再定义变量。不知道是不是这个原因，你可以将这句移到你新加的语句钱试试。  非常感谢您的提醒，正如您所说，变量的定义必须在函数开头，我把它提到了前面就可以了~~太感谢了~~