Question: 一道初级ACM的题目，求帮助

int main() {     int x = 0;     int y = 0;     char dir = 'N';     char str[101] = {0};     int times = 0;     scanf("%d", ×);     if (times <= 0)     {         return 1;     }     int *px = new int[times];     int *py = new int[times];     char *pdir = new char[times];     int i;     for (i = 0; i < times; i++)     {         x = 0;         y = 0;         dir = 'N';         scanf("%s", str);         get_coord(str, x, y, dir);         *(px + i) = x;         *(py + i) = y;         *(pdir + i) = dir;     };      for (i = 0; i < times; i++)     {         printf("%d %d %c\n", *(px + i), *(py + i), *(pdir + i));     }      delete []px;     delete []py;     delete []pdir;      return 0; }

函数不认识吗。。。

引用 4 楼 michael2988 的回复: #define COUNT 4 char dirs[COUNT] = {'N', 'E', 'S', 'W'};  void get_coord(char *str, int &x, int &y, char &dir) {     x = 0;     y = 0;     dir = dirs[0];     int dir_index = 0;     int size = strlen(str);      int i;     for (i = 0; i < size; i++)     {         if ('L' == str[i])         {             dir_index--;             dir_index  = (dir_index >= COUNT) ? (dir_index % COUNT) : dir_index;             dir_index = (dir_index < 0) ? (dir_index + COUNT) : dir_index;         }         else if ('R' == str[i])         {             dir_index++;             dir_index  = (dir_index >= COUNT) ? (dir_index % COUNT) : dir_index;             dir_index = (dir_index < 0) ? (dir_index + COUNT) : dir_index;         }         else if ('M' == str[i])         {             switch (dirs[dir_index])             {             case 'N':                 y++;                 break;             case 'E':                 x++;                 break;             case 'S':                 y--;                 break;             case 'W':                 x--;                 break;             default:                 break;             }         }     }      dir = dirs[dir_index]; }  这个用的是C++?刚学C语言还不太懂。怎么都没有int main了

#include <stdio.h>  int main() {    char input[101]={'\0'},dire='\0',ch;    int x=0,y=0;    int i,n,times;    int j=0;    int op,dir=0;    scanf("%d",×);    for(i=0;i<=times;i++)    {        ch=getchar();        while(ch!='\0')        {            input[j]=ch;            ch=getchar();            j++;        }        for(n=0;n<=j-1;n++)        {            if(input[n]=='L')            {              dir--;            }            else if(input[n]=='R')            {              dir++;            }            else if(input[n]=='M')            {                 if(dir>=0)                 {                     op=dir%4;                     switch(op)                     {                         case 0:                             dire='N';break;                         case 1:                             dire='E';break;                         case 2:                             dire='S';break;                         case 3:                             dire='W';break;                         default:                             break;                     }                 }                 else if(dir<0)                 {                     op=dir&4;                     switch(op)                     {                         case 0:                             dire='N';break;                         case -1:                             dire='W';break;                         case -2:                             dire='S';break;                         case -3:                             dire='E';break;                         default:                             break;                      }                 }                     switch(dire)                     {                         case 'N':                             y++;break;                         case 'S':                             y--;break;                         case 'E':                             x++;break;                         case 'W':                             x--;break;                         default:                             break;                }            }         }        printf("%d %d",x,y);    } }  你们看看我这个哪里不对了，能够运行的

struct RobotStatus 	 { 		 int x; 		 int y; 		 int dir_idx; 	 }; 	void robotControl() 	{ 		string sControl; 		cin>>sControl; 		int len = sControl.length(); 		RobotStatus rs; 		rs.x = 0; 		rs.y = 0; 		rs.dir_idx =0; 		char FourDirections[4] = {'N','W','S','E'}; 		for(int i=0;i<len;++i) 		{ 			char chCom = sControl[i]; 			switch (chCom) 			{ 			case 'L': 				rs.dir_idx = (rs.dir_idx+1)%4;  				break; 			case 'R': 				if(rs.dir_idx==0) rs.dir_idx = 3; 				else 					rs.dir_idx = rs.dir_idx-1; 			break; 			case 'M': 				switch (rs.dir_idx) 				{ 				case 0: 					rs.y++; 					break; 				case 1: 					rs.x--; 					break; 				case 2: 					rs.y--; 					break; 				case 3: 					rs.x++; 					break; 				default: 					break; 				} 					break; 			default: 				break; 			} 			 		} 		cout<<"当前机器人的状态是："<<endl; 		cout<<"x: "<<rs.x<<endl; 		cout<<"y: "<<rs.y<<endl; 		cout<<"方向: "<<FourDirections[rs.dir_idx]<<endl; 	}

参考代码链接： http://tieba.baidu.com/p/3350535618

可以建一个双向循环链表表示“转向”

引用 2 楼 whm546877424 的回复:[quote=引用 1 楼 user-7 的回复:] 模拟。 你把输入的方向或者前进一格一个一个解析出来，一步一步知道处理完所有的步骤不就行了 对的，这个应该用数组吧，可是不知道怎么弄[/quote] 也可以不用数组吧，你可以用enum direction{北(N),西(W),东(E),南(S)};direction m_dirt 表方向; int X，int Y;表示坐标； switch(m_dirt) {   //在每个北(N),西(W),东(E),南(S)里面分别处理'L','R'字符时设置m_dirt值，'M'字符时根据得到的m_dirt设置int X或int Y加1减1；  //最后得到的不就是了。这不是最容易想的么？ }

引用 1 楼 user-7 的回复:模拟。 你把输入的方向或者前进一格一个一个解析出来，一步一步知道处理完所有的步骤不就行了  对的，这个应该用数组吧，可是不知道怎么弄


Question: 安装Visual Studio 2013(vs2013 Update4 RC)正式版出现错误提示

http://www.codeblocks.org/  引用 2 楼 TLKooo 的回复:我还是用vs2012吧,你说的code::block是指啥???

何必这么高级，用code::block不也挺好


Question: 指针 文件读出范围的，看不懂代码，求赐教 。

这是C函数？

引用 3 楼 tpnndhqc 的回复:这都小事，楼上的说的很好，具体函数干嘛的你慢慢看代码。 来楼主，我们讨论个大事，你这半边头像是本人不！！！    这才是 小事好不好 ，

程序媛？0.0

typedef struct stu STU;//将struct stu结构体类型化名为STU typedef STU*       STUPTR;//将STU 指针化名为STUPTR  STUPTR insert(STUPTR head, int id, char* name);//将字符串的数据插入链表中 void print_st(STUPTR head);//打印链表中的数据 void save_to_file(FILE* fp, STUPTR head);//将链表中的数据保存在文件中 FILE* crt_file( void ); STUPTR  read_to_link(STUPTR head);

前两行是定义结构体类型别名，还有指针类型名 下边就是一些函数的声明了。看不懂哪些东西呢


Question: 简单的求三角形面积 请大家帮忙找下错 我真的 找不到

引用 4 楼 user-1 的回复:float a,b,c,s=(a+b+c)/2;scanf("%f,%f,%f",&a,&b,&c); 你的s有问题，放在scanf之后定义就可以了，因为这时候你的边长还没有输入。 ps:浮点数最好不要直接用 == 来进行判断是否相等，因为浮点数有精度问题，所以最好用两数之差的绝对值在某个很小的数(比如0.000001)之内来判断是否相等.     谢谢了 以前一直没注意这个问题 谢了

就是2楼 判断都是对了 就是面积不对

谢谢了 大神 快来 要疯了

#include<stdio.h> #include<math.h> main() { float a,b,c,s=(a+b+c)/2; scanf("%f,%f,%f",&a,&b,&c); if((a+b>c)&&(a-b<c)) { 	if(a==c&&b==c) 	 		printf("等边三角形面积为%f\n",sqrt(s*(s-a)*(s-b)*(s-c))); 	else if(a==b||a==c||c==b) 	 		printf("等腰三角形面积为%f\n",sqrt(s*(s-a)*(s-b)*(s-c))); 	else if(a*a+b*b==c*c||a*a+c*c==b*b||b*b+c*c==a*a) 		 	{ 		printf("直角三角形面积为%f\n",sqrt(s*(s-a)*(s-b)*(s-c))); 	} 		 	else	printf("一般三角形面积为%f\n",sqrt(s*(s-a)*(s-b)*(s-c))); 	 	 } else printf("不是三角形\n"); }


Question: ~~hook 网页请求

英语也是一门计算机语言的说。

引用 4 楼 zhao4zhong1 的回复:http://jacquelin.potier.free.fr/winapioverride32/ ....这。。看说明好像很牛逼。。慢慢试试，话说有中文的这种工具么，google翻译看着真难受。。。。。。

高兴了你还可以hook WebBrowser控件： http://jacquelin.potier.free.fr/index.php

引用 1 楼 zhao4zhong1 的回复:没必要hook，用WebBrowser控件应该足够了。 不成，我显示网页时用的webbrowser, 但是webbrowser直接就打开网页了,我要过滤掉有些内容，而且我想查看有些封包发送接收过程； 通过完全依赖webbrowser处理有些我的需求，要去看js代码烦人。。。。  另外，就当是个兴趣尝试尝试

没必要hook，用WebBrowser控件应该足够了。


Question: 怎样对二维数组动态内存分配？

引用 2 楼 turingo 的回复:++，修改设计才是正道。  [quote=引用 1 楼 layershow 的回复:] // 分配 T * p = (T *)malloc(sizeof(T) * N * (2*N-1)); // 释放 free(p);  你搞这么大的数组，就是方案设计问题了，所以建议你别沿这条路往下走了 物理内存 4G 与程序能用的内存是两码事[/quote]++++

百度 MapViewOfFile 映射大文件

4G?   为什么要这么大  修改设计方案吧

动态数组在小数据量的情况下可以的，但数据量大时，一般采用链表存储成文件的方式，在输入的同时，也保存成文件存到硬盘中，使用的时候在从文件中读取，可以使用ini，cvs等

仅供参考#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 //  如果还不够用的话，用文件读写模拟内存读写，参考_lseeki64函数。

++，修改设计才是正道。  引用 1 楼 layershow 的回复:// 分配 T * p = (T *)malloc(sizeof(T) * N * (2*N-1)); // 释放 free(p);  你搞这么大的数组，就是方案设计问题了，所以建议你别沿这条路往下走了 物理内存 4G 与程序能用的内存是两码事


Question: 求教一个关于二维数组的问题

line[y++][0];  你这里应该是 y++; x=0; 你的 x 没有清零

在占用内存空间较大的局部数组声明的前面加static，将其从堆栈数据段挪到全局数据段，即可避开因局部数组大小超过默认堆栈大小1MB，造成程序不能正常运行的问题。

#include <iostream> #include <stdio.h> #define MAX_X 100 #define MAX_Y 100 using namespace std; //我的问题：为什么把上面的两行改为1000，程序就不执行了？？？ int main() { 	int c; 	int x = 0; 	int y = 0; 	int line[MAX_Y][MAX_X]; 	int a; 	int b; 	while((c = getchar()) != EOF) 	{ 		if(c == '1') 			break; 		line[y][x++] = c; 		if(c == '\n') 		{ 			y++; 			x=0; 		} 	} 	y++;//y是从0开始的，所以要加1 	for(b = 0; b < y; b++) 	{ 		for(a = 0; a < x; a++) 		{ 			printf("%c", line[b][a]); 		} 		printf("\n"); 	}  	cout<<"x="<<x<<endl<<"y="<<y<<endl; 	printf("一共有%d个字符\n", x*y); 	return 0; }  我稍微修改了一下楼主的程序，希望能够对楼主有用 我的问题是：为什么程序写成下面的样子：  #define MAX_X 1000 #define MAX_Y 1000  程序就没执行就结束了，是因为数字太大了么？？？

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


Question: 行指针   一维数组

修正：  int (*p)[3]; //这是一个指针变量，不是一个数组  “不能对p算术运算”这句话意思只针对此语句。离开这个上下文，就不再有意义！如果后文给p赋值了，那么可以对指针做算术加减！提醒这么一点！

#include <stdio.h>  void main() { 	int a[3][3]={{1,2,3},{4,5,6},{7,8,9}}; 	int (*p)[3]; //这是一个指针变量，不是一个数组，不能对p算术运算 	 	p = a + 2; //第3行 	printf("%d\n", (*p)[0]); //7 	p = a + 1; //第2行 	printf("%d\n", (*p)[2]);//6  }

好像写混了。。。尼玛~敢不敢别指针都写成p！！！ void output(int *pout,int n) {     for(int j = 0;j!=n;j++)         printf("%d",*(pout+j)); } output里面*(pout+j)也就是对应的二维数组指针里的p[x][0],p[x][1],p[x][2]。 p[x]是你传进来的二维指针的第一个元素地址，上面说过了~

引用 2 楼 u012804783 的回复:[quote=引用 1 楼 tpnndhqc 的回复:] 请问一下写法一中的参数传递仅仅是值传递吧？[/quote] 传递的是二维指针的首地址，也就是一个普通指针了，指向二维指针int (*p)[3]的第一个元素，也就是p[0][0]; 因为你用了p = &a[i];    所以这个传进去的p二维指针实际传进去的也就是 ： 第一次传入：{11,23,25},第二次传入：{2,31,52},第三次传入：{73,568,79} 后面output里面*(p+j)也就是对应的二维数组指针里的p[0],p[1],p[2]了。 试着编译运行跟踪看，会清楚很多。

引用 1 楼 tpnndhqc 的回复: void output(int *p,int n) { 	for(int j = 0;j!=n;j++) 		printf("%d",*(p+j)); } void test() {  	int a[3][3]={{11,23,25},{2,31,52},{73,568,79}}; 	int (*p)[3]; 	int ida  = 0; 	for(int i=0;i<3;i++) 	{ 		p = &a[i]; //如何将行指针赋给一个该类型的一维指针呢 		output(*p,3);	//写法一  		//for(int j = 0;j!=3;j++)	//写法二 		//	ida = *(*p+j); 	} }  请问一下写法一中的参数传递仅仅是值传递吧？


Question: C语言数组问题

/*************************************************************************     > File Name: mygetchar.c     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月21日 星期五 21时54分52秒  ************************************************************************/ //#include<string.h> #include<stdio.h> int main() { 	char a[100]; 	int ch; 	int i=0; 	//memset(a,'\0',sizeof(a)); 	while((ch = getchar()) != '\n' && i <100) 	{ 		a[i++] = ch; 	} 	printf("%s\n",a); 	return 0; }

那用scanf试试？还是其他什么的，就是我输入回车，就停止输入了，我想得到这个，然后呢用下面这个好像是行的 #include <stdio.h> #include <stdlib.h> //#include <ctype.h>  int main() {     char ch,word[100];     int i=0,n;     ch=getchar();     while(ch!='\n')     {         word[i++]=ch;         ch=getchar();     }     n=i-1;     for(i=0;i<=n;i++)         printf("%c",word[i]);     return 0; } 怎么回事呢

/* Copyright (C) 1993-2014 Free Software Foundation, Inc.    This file is part of the GNU C Library.     The GNU C Library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public    License as published by the Free Software Foundation; either    version 2.1 of the License, or (at your option) any later version.     The GNU C Library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Lesser General Public License for more details.     You should have received a copy of the GNU Lesser General Public    License along with the GNU C Library; if not, see    <http://www.gnu.org/licenses/>.     As a special exception, if you link the code in this file with    files compiled with a GNU compiler to produce an executable,    that does not cause the resulting executable to be covered by    the GNU Lesser General Public License.  This exception does not    however invalidate any other reasons why the executable file    might be covered by the GNU Lesser General Public License.    This exception applies to code released by its copyright holders    in files containing the exception.  */  #include "libioP.h" #include "stdio.h"  #undef getchar  int getchar (void) {   int result;   _IO_acquire_lock (_IO_stdin);   result = _IO_getc_unlocked (_IO_stdin);   _IO_release_lock (_IO_stdin);   return result; }  #if defined weak_alias && !defined _IO_MTSAFE_IO #undef getchar_unlocked weak_alias (getchar, getchar_unlocked) #endif

１.getchar()返回值是int 2.数组容会越界，除非你数组足够的


Question: 我刚学习了链栈，请大神帮我看下下面代码为什么实现不了呢

眼花了。


Question: 求助 c的三角形

引用 2 楼 zhouqinghe24 的回复:   #include <stdio.h>  int main (void) {     int i=0,j,k=1,l=0;     while(k<=15)     {         j=i+1;         l=0;         printf("%3d",k);         while(l+k+j+1<=15)         {             l+= ++j;             printf("%3d",l+k);         }        k+=++i;         printf("\n");     }     return 0; }    谢谢！ 能不能解释一下变量的含义，为什么那么写。

引用 楼主 xiachulml 的回复:请用C语言编写一个程序实现 1 3 6 10 15 2 5 9  14 4 8 13 7 12 11 void main() { 	int i =1,a = 2, b= 0, n = 0;  	for (int j = 0;i+b<=15;j++) 	{ 		n = i; 		printf("%-3d",n); 		for (int k = 0;n+a+k<=15;k++) 		{	 			n =n+a+k;			 			printf("%-3d",n);			 		} 		printf("\n"); 		b++; 		i = i+b; 		a++; 	} }

printf中还是都改成%-3d吧 楼主注意好好看看代码的流程，不要只要答案而不认真看

求助呀大神们


Question: 程序在acm网站上出现Runtime Error，请求解决原因

引用 4 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。回答的好详细，学到了，太感谢了！

试试static sHeapElement sPriorityQ[100001];

溢出，访问异常

代码太长倒也懒得看了，觉得这代码一开始就申请这么大空间。要栈溢出的


Question: 求助

这个就是自加和返回值两个动作，若++在前，则先进行+1，再返回值；++在后，则先返回值，后执行+1操作。我是这样理解的，你的理解跟我一样哈。

建议不要写这种自己无法掌控的代码，不清楚计算机制的最好勤快些，分几步来以明确的意图实现

前自增：++i 表示i已经被刷新为自增后的值，同时返回的是i的值； 后自增：i++ 返回i的值，"随后"i才自增。


Question: c语言二维数组地址问题，求大神帮忙解答！(*^__^*)

指针减指针，得到的是该类型指针的步长的倍数   比如     0x30 -0x10      如果是32位int 类型指针运算， 得到的就是有几个  sizeof(int)    的个数  8

引用 6 楼 konglong0416 的回复:[quote=引用 3 楼 u013163178 的回复:] #include<stdio.h>  int main() {     int a[3][4] = {      {1,2,3,4},     {5,6,7,8},      {11,12,13,14}     };         printf("addr(a[1]-a[0]):%d\n", (int)a[1]-(int)a[0]);  //打印a[1]和a[2]地址之差     printf("addr(a[1]-a[0]):%d\n", a[1]-a[0]);//打印指针之差      return 0; }  好像有点明白，又不是特别明。。。 a[1]和a[0]不是第二维数组的首地址吗，既然地址，那两者相减的时候应该是地址相减呀 为什么必须强制转换为int类型，结果才正确。。。[/quote] a[0]是指针，不是地址，指针和地址是有很微妙的区别的

引用 7 楼 starytx 的回复:[quote=引用 5 楼 konglong0416 的回复:] [quote=引用 2 楼 starytx 的回复:] 这样操作本来就是“个数”  呃，不明白。。能详细点说明吗。。[/quote]指针的相减有特殊的意义，不是简单的数值计算，就表示两个位置元素个数差（一般需要这样的机制，因为这样的需求比较多，没有人在意地址的实际差值，更多的是他们之间差几个元素，而且你不必根据地址的差值和每个元素的类型所占空间大小来自己计算个数）。如果将指针强制转化为数值（地址值）相减，那就是你预料的结果，地址的差值。[/quote]  3Q,明白啦^_^

引用 5 楼 konglong0416 的回复:[quote=引用 2 楼 starytx 的回复:] 这样操作本来就是“个数”  呃，不明白。。能详细点说明吗。。[/quote]指针的相减有特殊的意义，不是简单的数值计算，就表示两个位置元素个数差（一般需要这样的机制，因为这样的需求比较多，没有人在意地址的实际差值，更多的是他们之间差几个元素，而且你不必根据地址的差值和每个元素的类型所占空间大小来自己计算个数）。如果将指针强制转化为数值（地址值）相减，那就是你预料的结果，地址的差值。

引用 3 楼 u013163178 的回复:#include<stdio.h>  int main() {     int a[3][4] = {      {1,2,3,4},     {5,6,7,8},      {11,12,13,14}     };         printf("addr(a[1]-a[0]):%d\n", (int)a[1]-(int)a[0]);  //打印a[1]和a[2]地址之差     printf("addr(a[1]-a[0]):%d\n", a[1]-a[0]);//打印指针之差      return 0; }  好像有点明白，又不是特别明。。。 a[1]和a[0]不是第二维数组的首地址吗，既然地址，那两者相减的时候应该是地址相减呀 为什么必须强制转换为int类型，结果才正确。。。

引用 2 楼 starytx 的回复:这样操作本来就是“个数”  呃，不明白。。能详细点说明吗。。

引用 1 楼 user-4 的回复:a[1]=5,a[0]=1...a[1]-a[0]=4.这是正确的呀  a[1],a[0]只是第二维数据的首地址呀， a[1]不等于5，a[0]也不等于1，*a[1]才为5，*a[0]才为1, 就算我将a[1][0]改成6，a[1]-a[0]的结果还是4

这样操作本来就是“个数”


Question: 关于C语言程序的问题？

VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

谢谢各位的答复。那是我网上看到的，应该是写错了，最后也没运行起来。还是谢谢各位！

英文缩写很难理解,不合中国人习惯,可以试用中文名称  #?定义 _头文件包含标志_      #定义 _头文件包含标志_      #包含 "接口.h"  #结束

你看这个，还恶心些，晕死 /* Checking macros for stdlib functions.    Copyright (C) 2005-2014 Free Software Foundation, Inc.    This file is part of the GNU C Library.     The GNU C Library is free software; you can redistribute it and/or    modify it under the terms of the GNU Lesser General Public    License as published by the Free Software Foundation; either    version 2.1 of the License, or (at your option) any later version.     The GNU C Library is distributed in the hope that it will be useful,    but WITHOUT ANY WARRANTY; without even the implied warranty of    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU    Lesser General Public License for more details.     You should have received a copy of the GNU Lesser General Public    License along with the GNU C Library; if not, see    <http://www.gnu.org/licenses/>.  */  #ifndef _STDLIB_H # error "Never include <bits/stdlib.h> directly; use <stdlib.h> instead." #endif  extern char *__realpath_chk (const char *__restrict __name, 			     char *__restrict __resolved, 			     size_t __resolvedlen) __THROW __wur; extern char *__REDIRECT_NTH (__realpath_alias, 			     (const char *__restrict __name, 			      char *__restrict __resolved), realpath) __wur; extern char *__REDIRECT_NTH (__realpath_chk_warn, 			     (const char *__restrict __name, 			      char *__restrict __resolved, 			      size_t __resolvedlen), __realpath_chk) __wur      __warnattr ("second argument of realpath must be either NULL or at " 		 "least PATH_MAX bytes long buffer");  __fortify_function __wur char * __NTH (realpath (const char *__restrict __name, char *__restrict __resolved)) {   if (__bos (__resolved) != (size_t) -1)     { #if defined _LIBC_LIMITS_H_ && defined PATH_MAX       if (__bos (__resolved) < PATH_MAX) 	return __realpath_chk_warn (__name, __resolved, __bos (__resolved)); #endif       return __realpath_chk (__name, __resolved, __bos (__resolved));     }    return __realpath_alias (__name, __resolved); }   extern int __ptsname_r_chk (int __fd, char *__buf, size_t __buflen, 			    size_t __nreal) __THROW __nonnull ((2)); extern int __REDIRECT_NTH (__ptsname_r_alias, (int __fd, char *__buf, 					       size_t __buflen), ptsname_r)      __nonnull ((2)); extern int __REDIRECT_NTH (__ptsname_r_chk_warn, 			   (int __fd, char *__buf, size_t __buflen, 			    size_t __nreal), __ptsname_r_chk)      __nonnull ((2)) __warnattr ("ptsname_r called with buflen bigger than " 				 "size of buf");  __fortify_function int __NTH (ptsname_r (int __fd, char *__buf, size_t __buflen)) {   if (__bos (__buf) != (size_t) -1)     {       if (!__builtin_constant_p (__buflen)) 	return __ptsname_r_chk (__fd, __buf, __buflen, __bos (__buf));       if (__buflen > __bos (__buf)) 	return __ptsname_r_chk_warn (__fd, __buf, __buflen, __bos (__buf));     }   return __ptsname_r_alias (__fd, __buf, __buflen); }   extern int __wctomb_chk (char *__s, wchar_t __wchar, size_t __buflen)   __THROW __wur; extern int __REDIRECT_NTH (__wctomb_alias, (char *__s, wchar_t __wchar), 			   wctomb) __wur;  __fortify_function __wur int __NTH (wctomb (char *__s, wchar_t __wchar)) {   /* We would have to include <limits.h> to get a definition of MB_LEN_MAX.      But this would only disturb the namespace.  So we define our own      version here.  */ #define __STDLIB_MB_LEN_MAX	16 #if defined MB_LEN_MAX && MB_LEN_MAX != __STDLIB_MB_LEN_MAX # error "Assumed value of MB_LEN_MAX wrong" #endif   if (__bos (__s) != (size_t) -1 && __STDLIB_MB_LEN_MAX > __bos (__s))     return __wctomb_chk (__s, __wchar, __bos (__s));   return __wctomb_alias (__s, __wchar); }   extern size_t __mbstowcs_chk (wchar_t *__restrict __dst, 			      const char *__restrict __src, 			      size_t __len, size_t __dstlen) __THROW; extern size_t __REDIRECT_NTH (__mbstowcs_alias, 			      (wchar_t *__restrict __dst, 			       const char *__restrict __src, 			       size_t __len), mbstowcs); extern size_t __REDIRECT_NTH (__mbstowcs_chk_warn, 			      (wchar_t *__restrict __dst, 			       const char *__restrict __src, 			       size_t __len, size_t __dstlen), __mbstowcs_chk)      __warnattr ("mbstowcs called with dst buffer smaller than len " 		 "* sizeof (wchar_t)");  __fortify_function size_t __NTH (mbstowcs (wchar_t *__restrict __dst, const char *__restrict __src, 		 size_t __len)) {   if (__bos (__dst) != (size_t) -1)     {       if (!__builtin_constant_p (__len)) 	return __mbstowcs_chk (__dst, __src, __len, 			       __bos (__dst) / sizeof (wchar_t));        if (__len > __bos (__dst) / sizeof (wchar_t)) 	return __mbstowcs_chk_warn (__dst, __src, __len, 				     __bos (__dst) / sizeof (wchar_t));     }   return __mbstowcs_alias (__dst, __src, __len); }   extern size_t __wcstombs_chk (char *__restrict __dst, 			      const wchar_t *__restrict __src, 			      size_t __len, size_t __dstlen) __THROW; extern size_t __REDIRECT_NTH (__wcstombs_alias, 			      (char *__restrict __dst, 			       const wchar_t *__restrict __src, 			       size_t __len), wcstombs); extern size_t __REDIRECT_NTH (__wcstombs_chk_warn, 			      (char *__restrict __dst, 			       const wchar_t *__restrict __src, 			       size_t __len, size_t __dstlen), __wcstombs_chk)      __warnattr ("wcstombs called with dst buffer smaller than len");  __fortify_function size_t __NTH (wcstombs (char *__restrict __dst, const wchar_t *__restrict __src, 		 size_t __len)) {   if (__bos (__dst) != (size_t) -1)     {       if (!__builtin_constant_p (__len)) 	return __wcstombs_chk (__dst, __src, __len, __bos (__dst));       if (__len > __bos (__dst)) 	return __wcstombs_chk_warn (__dst, __src, __len, __bos (__dst));     }   return __wcstombs_alias (__dst, __src, __len); }

这个就是随便取的，但是好的编码风格都是用文件名，甚至是路径名+文件名，以防止不同路径下的文件名相同引起的问题。

星哥正解

自己随便写，你这是纠结名字 像命名变量 int i = 0,int sd_i = 0,非要纠结SD干嘛

这是预编译命令代码，一般在头文件首尾加，防止重复包含。 大概意思可以这样理解：如果没有定义宏 xxxx(这个名字可以自己定义，只要别和项目中其他头文件的重复就行了)，那就定义它，接下来东西就是这个宏对应的东西

防重不包含， 只是一个取名！


Question: c语言ini的使用

有给代码的吗？

这个就是文件操作。 用二进制将链表挨个写入文件。     改的话，直接将读写指针seek到要改的元素 将要修改的节点重新写入覆盖即可   其实都是对读写指针操作，然后读写文件

是作业，但如果用其他的方法也可以，但我是个初学者，所以。。。。。。

作业题吗？不是的话，建议使用csv文件格式


Question: 二叉树题目

用递归, 伪码如下  int get_depth(int root, int depth) {     left = get_left(root);     left_depth = (left == '#') ? depth: get_depth(left, depth+1);     right= get_right(root);     right_depth = (right == '#') ? depth: get_depth(right, depth+1);     return max(left_depth, right_depth); }


Question: 看c和指针课后习题疑问

引用 3 楼 u014041540 的回复:改过就OK了，谢谢。但是我想弄明白我的原程序是什么问题造成结果缺失呢？  while(str<last_char) { char temp; temp=*str; *str++=*last_char; //这里移动了str *last_char--=temp; } printf("%s",str); //这里输出 就不是你想要的结果了

scanf是手误，明白了。谢谢

void reverse_string(char* pStr) { 	if (pStr == NULL) 	{ 		return; 	} 	char* pTempStr = pStr;  	int nLen = 0;  	while (*pTempStr != '\0') 	{ 		pTempStr++;  		nLen++; 	} 	for (int i = 0;i < nLen/2;i++) 	{ 		char temp;  		temp = pStr[i];  		pStr[i] = *(pTempStr - i - 1);  		*(pTempStr - i - 1) = temp; 	} 	printf("%s\n",pStr);  	return; }

改过就OK了，谢谢。但是我想弄明白我的原程序是什么问题造成结果缺失呢？

代码写得不错，问题是reverse_string到了最后printf的时候，str已经被移到字符串中间去了，已经不是开始的str了。 还有 scanf("%s",&a); // 把&去掉

把这一行删掉 printf("%s",str); 在main里面return之前 printf("%s",a);


Question: 为什么这个程序不能执行

++ 引用 11 楼 qq_21327741 的回复:还是有疑惑，就是数组是从a[0]开始的，一直到a[49]，那我在循环语句中使 i  和  j   初始化为1，那数组中数字的输入是不是就a[1]开始，一直到a[50]，还是说是只到a[49]，如果是只到a[49]，那么那个循环中的i=1;i<=50，不就没作用了吗？ 希望高手能够详细说明一下，感激不尽。谢谢。

引用 2 楼 zhouqinghe24 的回复:#include <stdio.h> int main (void)  { int i,j,temp,a[6]; printf("请输入六个不为零整数的值：\n"); for (i=1;i<=6;i++)    //数组下标从0 到n-1       scanf("%d",&a[i]); for (i=1;i<=5;i++){       // 这里也要从0开始     for (j=1;j<=6-1-i;j)    // 这里 最后的j需要++     if (a[i]>a[i+1])            //这里 用a[i+1]  会越界，用a[i-1]  并把大于号改成小于号     temp=a[i]; a[i]=a[i+1];     a[i+1]=temp;  printf("六个不为零整数的排序为a[i]=%d:\n",a[i]);    //打印最好 重新循环，解除耦合 }   } 请问你用得是什么软件，可否发给我，邮箱895007098@qq.com，谢谢

仅供参考 /*************************************************************************     > File Name: qsort_1.c     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月21日 星期五 19时25分47秒  ************************************************************************/  #include<stdio.h> int comp(void *a,void* b) { 	return *(int *)a - *(int *)b; } int main() { 	int a[6]; 	int i; 	for(i = 0; i < 6; ++i) 		scanf("%d",&a[i]);     //使用快速排序 	qsort(a,6,sizeof(int),comp); 	for(i = 0 ; i < 6; ++i) 		printf("%d\t",a[i]); 	return 0; }

引用 5 楼 qq_21327741 的回复:[quote=引用 2 楼 zhouqinghe24 的回复:] #include <stdio.h> int main (void)  { int i,j,temp,a[6]; printf("请输入六个不为零整数的值：\n"); for (i=1;i<=6;i++)    //数组下标从0 到n-1       scanf("%d",&a[i]); for (i=1;i<=5;i++){       // 这里也要从0开始     for (j=1;j<=6-1-i;j)    // 这里 最后的j需要++     if (a[i]>a[i+1])            //这里 用a[i+1]  会越界，用a[i-1]  并把大于号改成小于号     temp=a[i]; a[i]=a[i+1];     a[i+1]=temp;  printf("六个不为零整数的排序为a[i]=%d:\n",a[i]);    //打印最好 重新循环，解除耦合 }   } 请问你用得是什么软件，可否发给我，邮箱895007098@qq.com，谢谢[/quote]  编辑器吗？ 用的vim   windows下用vs吧

那如果是i=1;j=1;这样开始呢？数组是按照a[1]~a[5]这样来的吗？还是怎么的，可否说明一下令i=1;j=1;的话，数组的量是怎么分配的。，也就是程序是怎么运行的。谢谢

难道都没有人觉得if后面的三条语句应该用{ }括起来嘛？

数组下标是从0开始的，对于a[6]，合法的下标是0到5

数组下标是从0开始的。

引用 2 楼 zhouqinghe24 的回复:#include <stdio.h> int main (void)  { int i,j,temp,a[6]; printf("请输入六个不为零整数的值：\n"); for (i=1;i<=6;i++)    //数组下标从0 到n-1       scanf("%d",&a[i]); for (i=1;i<=5;i++){       // 这里也要从0开始     for (j=1;j<=6-1-i;j)    // 这里 最后的j需要++     if (a[i]>a[i+1])            //这里 用a[i+1]  会越界，用a[i-1]  并把大于号改成小于号     temp=a[i]; a[i]=a[i+1];     a[i+1]=temp;  printf("六个不为零整数的排序为a[i]=%d:\n",a[i]);    //打印最好 重新循环，解除耦合 }   }  完全正确，楼主该看看数组相关的知识了，数组下标是从0开始的


Question: 菜鸟求助C语言

输出结果是： x = 0, y = -1, z = 0, w = 0

也就是 ++ x  =0                      ++ y  ++  z  都没有执行。

w= ++x&& ++y || ++z  && 运算符  左边已经为0时，再&& 任意值 还是为0  所以  语言在实现时，只要 && 左边为0 则后面的 都不再执行，直接返回表达式的值  0

引用 5 楼 SuperRancho 的回复:[quote=引用 4 楼 baijiaheizhiganmao 的回复:] ++Z执行了一次。 相当于w = (++x && ++y) || ++z. &&求解了括号左边的，括号右边的没有求解。||接着执行右边的。  理解了，计算机也会偷懒。&&运算，左边为0，就不计算右边了。[/quote] 计算机不会偷懒，这是C语言的规则。也有为了提高响应速度的考虑。

引用 4 楼 baijiaheizhiganmao 的回复:++Z执行了一次。 相当于w = (++x && ++y) || ++z. &&求解了括号左边的，括号右边的没有求解。||接着执行右边的。  理解了，计算机也会偷懒。&&运算，左边为0，就不计算右边了。

引用 2 楼 zhouqinghe24 的回复:也就是 ++ x  =0                      ++ y  ++  z  都没有执行。 ++Z执行了一次。 相当于w = (++x && ++y) || ++z. &&求解了括号左边的，括号右边的没有求解。||接着执行右边的。


Question: C语言定时器的使用  计算质点运动的位移

我还是用的我那个方法，把定时器放在V S中设置，不断给程序发时间t。编写的程序不用C了，改用C++,不知道为什么scanf不能实现我想要的功能，只能用c++中的输入函数

参考下面：#pragma comment(lib,"user32") #include <stdio.h> #include <time.h> #include <sys/timeb.h> #include <windows.h> char datestr[16]; char timestr[16]; char mss[4]; void log(char *s) {     struct tm *now;     struct timeb tb;      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,s); } VOID CALLBACK myTimerProc1(   HWND hwnd, // handle of window for timer messages   UINT uMsg, // WM_TIMER message   UINT idEvent, // timer identifier   DWORD dwTime // current system time ) {  log("In myTimerProc1\n"); } VOID CALLBACK myTimerProc2(   HWND hwnd, // handle of window for timer messages   UINT uMsg, // WM_TIMER message   UINT idEvent, // timer identifier   DWORD dwTime // current system time ) {  log("In myTimerProc2\n"); } int main() {     int i;     MSG msg;      SetTimer(NULL,0,1000,myTimerProc1);     SetTimer(NULL,0,2000,myTimerProc2);     for (i=0;i<20;i++) {         Sleep(500);         log("In main\n");         if (GetMessage(&msg,NULL,0,0)) {             TranslateMessage(&msg);             DispatchMessage(&msg);         }      }     return 0; } //2012-07-26 17:29:06.375 In main //2012-07-26 17:29:06.875 In myTimerProc1 //2012-07-26 17:29:07.375 In main //2012-07-26 17:29:07.875 In myTimerProc2 //2012-07-26 17:29:08.375 In main //2012-07-26 17:29:08.375 In myTimerProc1 //2012-07-26 17:29:08.875 In main //2012-07-26 17:29:08.875 In myTimerProc1 //2012-07-26 17:29:09.375 In main //2012-07-26 17:29:09.890 In myTimerProc2 //2012-07-26 17:29:10.390 In main //2012-07-26 17:29:10.390 In myTimerProc1 //2012-07-26 17:29:10.890 In main //2012-07-26 17:29:10.890 In myTimerProc1 //2012-07-26 17:29:11.390 In main //2012-07-26 17:29:11.890 In myTimerProc2 //2012-07-26 17:29:12.390 In main //2012-07-26 17:29:12.390 In myTimerProc1 //2012-07-26 17:29:12.890 In main //2012-07-26 17:29:12.890 In myTimerProc1 //2012-07-26 17:29:13.390 In main //2012-07-26 17:29:13.890 In myTimerProc2 //2012-07-26 17:29:14.390 In main //2012-07-26 17:29:14.390 In myTimerProc1 //2012-07-26 17:29:14.890 In main //2012-07-26 17:29:14.890 In myTimerProc1 //2012-07-26 17:29:15.390 In main //2012-07-26 17:29:15.890 In myTimerProc2 //2012-07-26 17:29:16.390 In main //2012-07-26 17:29:16.390 In myTimerProc1 //2012-07-26 17:29:16.890 In main //2012-07-26 17:29:16.890 In myTimerProc1 //2012-07-26 17:29:17.390 In main //2012-07-26 17:29:17.890 In myTimerProc2 //2012-07-26 17:29:18.390 In main //2012-07-26 17:29:18.390 In myTimerProc1 //2012-07-26 17:29:18.890 In main //2012-07-26 17:29:18.890 In myTimerProc1 //2012-07-26 17:29:19.390 In main //2012-07-26 17:29:19.890 In myTimerProc2  和下面：#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h>     #include <process.h>     #define  MYVOID             void #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define ARRSIZE(x) (sizeof(x)/sizeof(x[0])) #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; char logstr[16000]; 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;     if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;     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);             }             flog=fopen(logfilename1,"a");             if (NULL==flog) return;         }         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} int No_Loop=0; MYVOID testThread(void *pcn) {     int n,i;      n=(int)pcn;     i=0;     while (1) {         sleep_ms(1000);         Log("in testThread %d:i==%ds\n",n,++i);         if (i>=5) No_Loop=1;     } } int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL);     pthread_t threads[1];     int threadsN;     int rc; #endif     Log("=========BEGIN==================\n"); #ifdef WIN32     _beginthread((void(__cdecl *)(void *))testThread,0,(void *)1); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,testThread,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif     i=0;     while (1) {         sleep_ms(100);         Log("in main:i==%d\n",++i);         if (No_Loop==1) break;//     }     Log("=========END====================\n"); #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //2012-06-14 16:27:21.500 =========BEGIN================== //2012-06-14 16:27:21.609 in main:i==1 //2012-06-14 16:27:21.718 in main:i==2 //2012-06-14 16:27:21.828 in main:i==3 //2012-06-14 16:27:21.937 in main:i==4 //2012-06-14 16:27:22.046 in main:i==5 //2012-06-14 16:27:22.156 in main:i==6 //2012-06-14 16:27:22.265 in main:i==7 //2012-06-14 16:27:22.375 in main:i==8 //2012-06-14 16:27:22.484 in main:i==9 //2012-06-14 16:27:22.500 in testThread 1:i==1s //2012-06-14 16:27:22.593 in main:i==10 //2012-06-14 16:27:22.703 in main:i==11 //2012-06-14 16:27:22.812 in main:i==12 //2012-06-14 16:27:22.921 in main:i==13 //2012-06-14 16:27:23.031 in main:i==14 //2012-06-14 16:27:23.140 in main:i==15 //2012-06-14 16:27:23.250 in main:i==16 //2012-06-14 16:27:23.359 in main:i==17 //2012-06-14 16:27:23.468 in main:i==18 //2012-06-14 16:27:23.500 in testThread 1:i==2s //2012-06-14 16:27:23.578 in main:i==19 //2012-06-14 16:27:23.687 in main:i==20 //2012-06-14 16:27:23.796 in main:i==21 //2012-06-14 16:27:23.906 in main:i==22 //2012-06-14 16:27:24.015 in main:i==23 //2012-06-14 16:27:24.125 in main:i==24 //2012-06-14 16:27:24.234 in main:i==25 //2012-06-14 16:27:24.343 in main:i==26 //2012-06-14 16:27:24.453 in main:i==27 //2012-06-14 16:27:24.500 in testThread 1:i==3s //2012-06-14 16:27:24.562 in main:i==28 //2012-06-14 16:27:24.671 in main:i==29 //2012-06-14 16:27:24.781 in main:i==30 //2012-06-14 16:27:24.890 in main:i==31 //2012-06-14 16:27:25.000 in main:i==32 //2012-06-14 16:27:25.109 in main:i==33 //2012-06-14 16:27:25.218 in main:i==34 //2012-06-14 16:27:25.328 in main:i==35 //2012-06-14 16:27:25.437 in main:i==36 //2012-06-14 16:27:25.500 in testThread 1:i==4s //2012-06-14 16:27:25.546 in main:i==37 //2012-06-14 16:27:25.656 in main:i==38 //2012-06-14 16:27:25.765 in main:i==39 //2012-06-14 16:27:25.875 in main:i==40 //2012-06-14 16:27:25.984 in main:i==41 //2012-06-14 16:27:26.093 in main:i==42 //2012-06-14 16:27:26.203 in main:i==43 //2012-06-14 16:27:26.312 in main:i==44 //2012-06-14 16:27:26.421 in main:i==45 //2012-06-14 16:27:26.500 in testThread 1:i==5s //2012-06-14 16:27:26.531 in main:i==46 //2012-06-14 16:27:26.531 =========END====================

我在VS2012开发环境下做了一个IDE，该IDE内核是MinGW编译器，也就是我在VS平台下运行出来另外一个编译器的IDE。用过MinGW的人应该知道，需要在CMD窗口中输入命令开关，例如编译命令：gcc -o test test.c。我使用了匿名管道来实现与后台MinGW（其实就是CMD）进程的通信，将编译、调试的命令发送过去，然后通过输出管道ReadFile，然后将读出的结果显示在IDE中就可以了。      现在我想在这个IDE下编写一段可以模拟质点运动的。首先，我需要给它输入一个字符串数组，比如01 06 1.00 1.00 3.00 3.00 0.00 2.00，01是命令标识，06代表我后面传了6个数，后面分别是x1,y1,x2,y2,a,v。通过字符串处理的子函数char * mid(char *dst,char *src, int n,int m)，我可以提取这个数组中的坐标值和加速度和速度，接下来我要进行质点运动的模拟。由于时间t是位置的，这里便需要在循环中输入时间t，得到输出，直到质点到达目标点。我写了一段C程序如下： #include <string.h> #include<stdlib.h>  #include<stdio.h> #include<math.h>  typedef struct { 	float x; 	float y;  }PointStruct;  PointStruct* PointList; float a,v,X,Y;  float r[20],r1[20],T[20]; float Tan[20],Sin[20],Cos[20]; int t; int main() {     char * mid(char *dst,char *src, int n,int m);         char strData[100]={"0"};     scanf("%s",strData);//输入字符串     char destData0[100]={"0"};     char destData1[100]={"0"};     char destData2[100]={"0"};     int d=atoi(mid(destData0,strData,2,3));     int p=(d-2)/2;     a=atof(mid(destData1,strData,4,(6+p*10)));     v=atof(mid(destData2,strData,4,(11+p*10)));      PointList=(PointStruct *)calloc(p,sizeof(PointStruct));     int j;     for(j=0;j<p;j++)     { 	 char destData3[35]={"0"};          char destData4[35]={"0"};          PointList[j].x=atof(mid(destData2,strData,4,(2*j+1)*5+1));          PointList[j].y=atof(mid(destData3,strData,4,(2*j+2)*5+1));     }       int k;     for(k=0;k<p;k++)     { 	 Tan[k]=(PointList[k+1].y-PointList[k].y)/(PointList[k+1].x-PointList[k].x);          r1[k]=atan(Tan[k]);          Sin[k]=sin(r[k]);          r[k]=sin(r1[k]);          Cos[k]=cos(r[k]);          T[k]=(PointList[k+1].y-PointList[k].y)/(v*Sin[k]);     }              int m,n;     for(m=0;m<p-1;m++)    {       for(n=1;n<=T[m]/0.1;n++)      {             scanf("%d",&t);//输入时间              X=v*0.1*t+PointList[0].x;              Y=v*0.1*t+PointList[0].y;               printf("%.2f",X);              printf("%.2f",Y);              printf("%.2f",r[m]);              printf("%.2f",a);              printf("%.2f",v);      }    }   }  char * mid(char *dst,char *src, int n,int m) {       char *p = src;       char *q = dst;       int len = strlen(src);       if(n>len)      n = len-m;    /*从第m个到最后*/       if(m<0)      m=0;    /*从第一个开始*/       if(m>len)      return NULL;       p += m;       while(n--)     *(q++) = *(p++);       *(q++)='\0';      return dst;   }        该程序在编译器IDE中编译成功后，运行，此时需要输入字符串数组，则把01 06 1.00 1.00 3.00 3.00 0.00 2.00传给运行中的程序，传的方式和MinGW命令的传送方式一样，也是在VS中向管道中写命令，将该数组作为字符串传到管道中。接下来应该输入时间，由于要模拟质点运动，我在VS设置了一个定时器，每隔一定时间是t++，并将该时间同样输入管道中，程序获得时间t后将输出，这样就能按照定时器设置的时间间隔输出坐标值，角度，加速度和速度。       这是我的整理思路，C程序在MinGW中运行没问题，输入字符串后，在输入时间t，就可以不断得到输出。。但是当把该程序放到编译器IDE（MinGW内核）中便没有我想的这么简单了，字符串可以输入，但scanf("%d",t)却不起作用，也就是没办法由定时器不断将给C程序输入时间t从而得到输出值。。。而且在运行过程中，明显感觉编译器IDE很容易崩溃。。。。不知道为什么啊，调试了好多天了，程序太大也不好给大家看，大神们先评判下我的思路哪里出了问题。。。然后，大家有没有用管道调用MinGW的经验，有可能是什么问题导致IDE崩溃？管道在使用的时候会导致什么问题？

写了一段简单的累加程序，需要用定时器不停的给输入下一个值，一个C++ 的，一个C的，没想到C++的就能按照预想的进行累加，C的就不行         是因为C程序里面的scanf不能这样用吗？还是因为平台是C++语言，有冲突什么的？

我就是想问一下，C语言里面有没有自己写的时钟中断函数？不是基于单片机的

直线段：起始点坐标(x1,y1)和终止点坐标(x2,y2) 上的每一点的坐标可用公式 Xa=X1+a*(X2-X1) Ya=Y1+a*(Y2-Y1) 表示，其中a在0..1之间

引用 7 楼 zhao4zhong1 的回复:你在回调函数中通过延时或计算，可以选择发或不发啊。  这个是VC里面的函数吗？我要用C语言来编

你在回调函数中通过延时或计算，可以选择发或不发啊。

引用 5 楼 zhao4zhong1 的回复:为什么不用 BOOL LineDDA(   int nXStart,             // x-coordinate of line's starting point   int nYStart,             // y-coordinate of line's starting point   int nXEnd,               // x-coordinate of line's ending point   int nYEnd,               // y-coordinate of line's ending point   LINEDDAPROC lpLineFunc,  // pointer to callback function   LPARAM lpData            // pointer to application-defined data ); 呢？      查了一下LineDDA，它的功能就是计算出连接两点的线段上的每一个屏幕像素的坐标，这两个点的坐标已经在函数的前四个参数中给出，每计算出一个坐标，该函数就会调用第五个参数所指的回调函数，我们可以在回调函数中完成一些简单的操作，以实现动画效果。。       但是我并不是想在这两点的直线上完成什么操作，而是模拟质点运动，每隔时间 t 质点运动到哪里了，我会把这个时刻的坐标发给仿真环境那里，控制质点的运动。后面仿真的部分不需要我做，我的任务是发给他当前质点运动的坐标，以时间 t 为间隔的发

到处都看到C++里面的写法，比如SetTimer（），TimeSetEvent（），但就是查不到标准C里面是怎么做的。我希望可以像SetTimer，每隔一定时间就可以得到这个时间间隔，并进行对位移计算

程序开始运行时定时器一直工作，知道得到的坐标值是终止点坐标，停止

引用 1 楼 zhouqinghe24 的回复:你可以使用 alarm（）  ualarm（）  的信号机制。 在SIGALRM 信号捕捉函数中处理你的逻辑你好  能通过一小段代码说详细点吗


Question: 关于C语言中指针数组的问题.

不要想的那么复杂，就跟平常的.和->一样的……只不过外面包装了一个数组而已， 你可以这样理解 book* tmpa = a[g]; 	(*tmpa).title;	// (*a)[g].title; 	tmpa->title;	//a[g]->title;


Question: 打开FIFO管道失败？？新手。。

然后拿来给我看看

你在 fd ==-1的条件里 打印一下 错误信息   perror ("open");


Question: c语言处理http报文中中文字符编码\uXXXX无法正常打印

仅供参考//将文件1中所有'\uAABB'替换为'\xBB'+'\xAA','C'替换为'C\x00',且文件头加'\xFF\xFE',结果保存到文件2中。 #include <stdio.h> FILE *f1,*f2; int c,s,n,i; char fuAABB[7]; int AA,BB; void main(int argc,char **argv) {     if (argc<3) {         printf("%s 文件1 文件2\n将文件1中所有\"\\uAABB\"替换为\"\\xBB\\xAA\",\'C\'替换为\"C\\x00\",且文件头加\"\\xFF\\xFE\",结果保存到文件2中。\n",argv[0]);         return;     }     f1=fopen(argv[1],"rb");     if (NULL==f1) {         printf("找不到文件[%s]!\n",argv[1]);         return;     }     f2=fopen(argv[2],"wb");     if (NULL==f2) {         fclose(f1);         printf("创建文件[%s]出错!\n",argv[2]);         return;     }     fuAABB[6]=0;     fputc(0xFF,f2);fputc(0xFE,f2);     s=0;     while (1) {         c=fgetc(f1);         if (EOF==c) {             for (i=0;i<s;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}             break;//         }         switch (s) {         case 0:             if ('\\'==c) {                 n=0;                 fuAABB[n++]=c;                 s=1;             } else {                 fputc(c,f2);fputc(0,f2);             }         break;         case 1:             if ('u'==c) {                 fuAABB[n++]=c;                 s=2;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         case 2:             if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {                 fuAABB[n++]=c;                 s=3;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         case 3:             if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {                 fuAABB[n++]=c;                 s=4;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         case 4:             if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {                 fuAABB[n++]=c;                 s=5;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         case 5:             if (('0'<=c&&c<='9')||('A'<=c&&c<='F')||('a'<=c&&c<='f')) {                 fuAABB[n++]=c;                 sscanf(fuAABB+2,"%02x%02x",&AA,&BB);                 fputc(BB,f2);fputc(AA,f2);                 s=0;             } else {                 for (i=0;i<n;i++) {fputc(fuAABB[i],f2);fputc(0,f2);}                 fputc(c,f2);fputc(0,f2);                 s=0;             }         break;         }     }     fclose(f2);     fclose(f1);     printf("%s %s %s OK.\n",argv[0],argv[1],argv[2]); }

仿造printf，重新写个打印函数即可。这个函数很简单的  只不过printf格式串是用%来转义,你改用\作转义符


Question: CCS3.3 ，DSP28335无法Load Program

Trouble Writing Memory Block at 0x9000 on Page 0 of Length 0x1480: Cannot access memory address0xA000    上面的提示很明显了: 0xA000 不能访问, 我猜要访问地址 0x9000+0x1480 = 0xa480,由于0xa000之后不能访问,所以访问0xa480出错.  确认一下你的硬件地址的起始地址,以及你代码的长度.然后再做修改.


Question: 编程计算九宫格解锁个数

题目能不能描述清楚一点，如果说数字不能跳跃那不就是只有连续数字的几种组合而已了么

能否说的详细点呢

搜索树...

二位数组 计算


Question: 想在音频WAV文件播放时能显示字幕，主要是显示一些状态参数，请问如何处理？不用专业软件，最好编码实现

显示的状态参数其实不是音频文件本身的，是一些外部的，比如采集时间，采集地点之类的，是后期添加的，由于wav文件好像不能标记标签属性，有没有解决的思路？

这个好办，wav无压缩格式，网上有它头文件格式结构（自行搜索），读取文件的头格式，把其中的信息输出就是你想要的。


Question: 求大神看看

再加个#include <cstdlib> 或者把system函数换成gethcar()；


Question: C语言，初学函数，大神帮忙看看哪里错了

哥们，这不关函数的事情，先弄清楚全局变量跟局部变量的作用域！

#include <stdio.h> double fee(double pl, double k) {      if (pl == -1) { 	if (k <= 2) 	    return 6; 	else if (k > 2 && k <= 7) 	    return 6 + (k - 2) * 1.6; 	else if (k > 7) 	    return 5 * 1.6 + (k - 7) * 1.8 + 6;     }     if (pl == -2) {  	if (k <= 2) 	    return 6; 	else if (k > 2 && k <= 7) 	    return 6 + (k - 2) * 1.8; 	else if (k > 7) 	    return 5 * 1.8 + (k - 7) * 2.0 + 6;     } }  int main(void) {     int T, i;     double pl, k, sum;     scanf("%d", &T);     for (i = 1; i <= T; i++) { 	scanf("%lf %lf", &pl, &k); 	printf("Case %d:%f\n", i, fee(pl, k));     }     return 0; }

pl,k完全没有传递到函数里面去。。。讲清楚确实很麻烦，初学者，还是看看谭浩强的C程序设计吧。。。。。

朋友，虽然我很能理解你想要在fee这个函数中进行各种判断，计算，并能够改变pl，k，sum的值，但是你的fee函数的写法，实际上会完全没有用到pl，k的值，但要是直接讲给你也挺麻烦的，你从简单的函数开始练练吧~

引用 1 楼 u010030181 的回复:不是这样使用参赛的，你在翻书看看如何传参及局部变量的使用……参数

不是这样使用参赛的，你在翻书看看如何传参及局部变量的使用……


Question: 求助 用vs2013写括号的匹配检查时候出的问题

崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。  仅供参考#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }


Question: 画初始迷宫


Question: 关于网络流量监控软件

学习使用winpcap

主要是对本级发出去和接收回来的数据包进行分析，类似于一个抓包软件一样

如果某类应用的流量 ，这个要看这个软件的端口啥的，要过滤统计

你是监控网卡上的所有流量，还是某类应用的软件应用。


Question: Linux c语言 epoll怎么监听一个队列？ 或一块内存？

eventfd 有用过的没，   用他实现异步队列， 会有一个文件描述符，   可不可以加入 epoll,  我看到的这个代码是用select做的  不是特别好，  在这：  http://www.tuicool.com/articles/NJjmaq， 我不是特别了解select，  不知道用epoll可以不 ，

你肯定理解错了，epoll只能监听描述符吧，可读、可写这些事件能够触发epoll_wait返回。

epoll 主要作用是用作网络链接的高并发。    尤其是对于 链接数很多，活跃数很少的情况下。


Question: linux下c fork出来的子进程中 execlp调用gcc编译问题

引用 1 楼 user-1 的回复:你是用了管道来通信吗？ 重定向子进程的标准输出，父进程读对应的管道恩，已经解决了，谢谢了

你是用了管道来通信吗？ 重定向子进程的标准输出，父进程读对应的管道


Question: 请教数组升序排序后原来的索引

仅供参考 /*************************************************************************     > File Name: qsort_2.c     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月22日 星期六 10时24分16秒  ************************************************************************/  #include<stdio.h> struct node { 	int date; 	int No; }; int comp(void *a,void *b) { 	return (*(struct node *)a).date - (*(struct node *)b).date; } int main() { 	int a[] = {3,4,2,5,7,6,1,8,4,2}; 	int n = sizeof(a)/sizeof(int); 	struct node arry[n]; 	int i; 	for(i = 0; i < n;++i) 	{ 		arry[i].date = a[i]; 		arry[i].No = i; 	} 	qsort(arry,n,sizeof(struct node),comp); 	printf("(当前值，原索引)\n"); 	for(i = 0; i < n;++i) 	{ 		printf("(%4d  , %4d )\n",arry[i].date,arry[i].No); 	} 	return 0; }

引用 7 楼 xionggch 的回复: void psort(int a[],int n, int b[] ) {     int i,j,temp;     for(j = 0;j<n-1;j++) 	{ 		b[j] = j;         for(i = j+1;i<n;i++)         {             if(a[j] > a[i])             {                 temp = a[j];                 a[j] = a[i];                 a[i] = temp; 				b[j] = i;             }         } 	} }   这个代码想法差不多，但是结果不对。 我自己已经写出来了，发出来看看吧：   int Sort_index(float * pInArray, int * pOutIndex, int nLen) //ascending sequence { 	int **pAr; 	int first_address; 	int i, j;   	int *ptemp;  	pAr = (int **)malloc(sizeof(int*)*nLen); 	for(i=0;i<nLen;i++) 		pAr[i] = (int *)(&pInArray[i]);  	first_address = (int)pAr[0];  	for (i = 0; i < nLen; i++)   	{   	    for (j = 0; j < nLen - i - 1; j++) 		{ 			if (*pAr[j] > *pAr[j + 1])   	        {   	            ptemp = pAr[j]; 				pAr[j] = pAr[j+1]; 				pAr[j+1] = ptemp; 	        }  		} 	}    	for(i=0;i<nLen;i++) 		pOutIndex[i] = ((int)pAr[i] - first_address)/sizeof(float);  	free(pAr); 	return 1;    }

引用 4 楼 dpstill 的回复:[quote=引用 2 楼 ri_aje 的回复:] 直接排序索引就行了。   高手，有c代码吗？贴一下代码看看。。[/quote] 没有。c++ 的要吗

#include"stdafx.h" #include <iostream> #include <vector> #include <map> using namespace std; map<int,int> indexvalue; map<int,int> valuecount; map<int,int>::iterator it; void psort(int a[],int n) { 	int i,j,temp; 	for(j = 0;j<n-1;j++) 		for(i = 0;i<n-1-j;i++) 		{ 			if(a[i] > a[i+1]) 			{ 				temp = a[i]; 				a[i] = a[i+1]; 				a[i+1] = temp; 			} 		} }  int main() { 	int a[] = {3,4,2,5,7,6,1,8,4,2};	 	for(int i = 0 ;i < sizeof(a)/sizeof(a[0]);i++) 	{	 		indexvalue.insert(make_pair(i,a[i])); 		it = valuecount.find(a[i]); 		if(it != valuecount.end()) 			valuecount[a[i]]++; 		else 		{ 			valuecount.insert(make_pair(a[i],i)); 			valuecount[a[i]]=1; 		} 	} 	psort(a,10); 	int icount; 	for(int i = 0 ;i < sizeof(a)/sizeof(a[0]);) 	{ 		for(it = indexvalue.begin();it!=indexvalue.end();it++) 		{ 			if(it->second == a[i]) 			{ 				icount = valuecount[a[i]]; 				cout<<it->second<<" "<<it->first<<endl; 			} 			 		}i+=icount; 	} 	return 0;	 }

引用 2 楼 ri_aje 的回复:直接排序索引就行了。   高手，有c代码吗？贴一下代码看看。。

引用 1 楼 user-4 的回复:排序前 对a数组做个备份  排序后在备份数组找新数组元素 记录位置  如果数组中有些数相等，用这个方法就不是很好。

直接排序索引就行了。

排序前 对a数组做个备份  排序后在备份数组找新数组元素 记录位置


Question: c语言数组元素交换问题，请高手过来看看

在SWAP调用那里打断点，看下交换的两个指针位置是否有误。SWAP函数是没有问题的

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

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

引用 13 楼 zhao4zhong1 的回复:地址不变正常，Binary[j][M]和Binary[j][M+1]的值不在[0,511]范围内就不正常了。 Binary[j][M+1]的值不在[0,511]范围内,但是在上一段代码里： 	for (int k = 0; k < M + 2; k++) 		{ 			printf("%d", Binary[j][k]); 		} 		printf("\n");得到的结果却是正常的，这是为什么呢？？

引用 4 楼 zhao4zhong1 的回复:printf("before SWAP ARRAYR+%d==%lg,ARRAYR+%d==%lg\n",Binary[j][M],ARRAYR+Binary[j][M],Binary[j][M + 1],ARRAYR+Binary[j][M + 1]); SWAP(ARRAYR+Binary[j][M],ARRAYR+Binary[j][M + 1]);   //运行发现交换结果不符合预期 printf("after SWAP ARRAYR+%d==%lg,ARRAYR+%d==%lg\n",Binary[j][M],ARRAYR+Binary[j][M],Binary[j][M + 1],ARRAYR+Binary[j][M + 1]);  printf("before SWAP ARRAYI+%d==%lg,ARRAYI+%d==%lg\n",Binary[j][M],ARRAYI+Binary[j][M],Binary[j][M + 1],ARRAYI+Binary[j][M + 1]); SWAP(ARRAYI+Binary[j][M],ARRAYI+Binary[j][M + 1]);     //运行发现交换结果不符合预期 printf("after SWAP ARRAYI+%d==%lg,ARRAYI+%d==%lg\n",Binary[j][M],ARRAYI+Binary[j][M],Binary[j][M + 1],ARRAYI+Binary[j][M + 1]); getchar();  交换前后的地址没有改变，这应该是正常的吧

引用 8 楼 qq_22556259 的回复:[quote=引用 7 楼 qq_22556259 的回复:] [quote=引用 6 楼 u012421456 的回复:] [quote=引用 5 楼 u012421456 的回复:] 楼主是想交换ARRAYR和ARRAYI这两个数组的值吗？ 那在调用SWAP函数时，其中的参数不对吧[/quote]  实参不应该是指向数组元素的值吗？？[/quote] 我是要交换同一个数组两个元素的位置[/quote] 那我理解错了

SWAP(ARRAYR+Binary[j][M],ARRAYR+Binary[j][M + 1]);  如果是交换两个数组的元素，那不是该ARRAYR和ARRAYI吗

引用 6 楼 u012421456 的回复:[quote=引用 5 楼 u012421456 的回复:] 楼主是想交换ARRAYR和ARRAYI这两个数组的值吗？ 那在调用SWAP函数时，其中的参数不对吧[/quote] 不是交换两个数组的值，而是交换同一个数组指定的两个元素的位置，两个数组都要这么做

引用 7 楼 qq_22556259 的回复:[quote=引用 6 楼 u012421456 的回复:] [quote=引用 5 楼 u012421456 的回复:] 楼主是想交换ARRAYR和ARRAYI这两个数组的值吗？ 那在调用SWAP函数时，其中的参数不对吧[/quote]  实参不应该是指向数组元素的值吗？？[/quote] 我是要交换同一个数组两个元素的位置

引用 6 楼 u012421456 的回复:[quote=引用 5 楼 u012421456 的回复:] 楼主是想交换ARRAYR和ARRAYI这两个数组的值吗？ 那在调用SWAP函数时，其中的参数不对吧[/quote]  实参不应该是指向数组元素的值吗？？

引用 5 楼 u012421456 的回复:楼主是想交换ARRAYR和ARRAYI这两个数组的值吗？ 那在调用SWAP函数时，其中的参数不对吧

楼主是想交换ARRAYR和ARRAYI这两个数组的值吗？ 那在SWAP函数中串的参数不对吧

2楼。。。。。我已经看了整整一早上了，就是因为要做别的事情才上来发帖子的


Question: C语言printf的问题

真的是使用的VC6.  那我应该用什么编译器好点。还有问题懂了，谢谢大家。

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

*  3.863e+03*是符合ANSI C标准的输出。你使用的编译器不符合标准(不会是臭名昭著的VC6吧?) 按照标准定义 %10.3e 10表示整个输出有10个字符，不足10个时前面用空格补齐补齐(7.19.6.1.4 If the converted value has fewer characters than the field width, it is padded with spaces (by default) on the left) 3表示小数点后面有3位(7.19.6.1.4 An optional precision that gives the minimum number of digits to appear) e的指数部分一般是2位，只有指数值大于99时才会占3位(7.19.6.1.8 The exponent always contains at least two digits, and only as many more digits as necessary to represent the exponent.)  你用的编译器在指数值等于3时占了3位与标准不一致。

书上说的也没错，Linux下输出确实是 * 3.853e+03*

http://bbs.csdn.net/topics/380151308 上面是类似问题，没必要纠结这个

首先，不要太迷信书，古时候不是“有尽信书不如无书”吗？ 其次，不同的编译器，不同的系统，c语音输出结果可能会不同的。 最后，楼主通过自己的实际运行结果和书上的比对，可以得出疑惑，从而寻找问题的答案，这个得向楼主学习。

书上错了。什么书？


Question: 初学者的编程问题求助~~~

引用 11 楼 hitxingkong 的回复:引用 6 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。全局数据段的大小是多大呢？ 一共有100000个数据的说。是不是因为数据太大的原因QAQ，我参考了大家的意见改了还是不行

引用 11 楼 hitxingkong 的回复:引用 6 楼 zhao4zhong1 的回复:在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。全局数据段的大小是多大呢？ 自己定义越来越大的char数组试验看结果。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？

引用 9 楼 u013163178 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] 纠正7楼： static long double num[100001];赵老师咋自己夸自己[/quote] 这是纠正拼写错误，不是自顶。

纠正7楼： static long double num[100001];

staitc long double num[100001];

1‘调试 2、num[100001]静态数组空间太大，考虑用malloc动态分配

fp和fp2为什么会重复打开?

#include<stdio.h> #include<stdlib.h> #include<conio.h> int main(void) { 	long double num; 	FILE *fp,*fp2; 	fp=fopen("C:/datah.txt","r"); 	if (fp==NULL) 	{ 		printf("cannot open fp!\n"); 		exit(1); 	} 	fp2=fopen("C:/outputh.txt","w"); 	if (fp2==NULL) 	{ 		printf("cannot open fp2!\n"); 		exit(1); 	} 	while( (fscanf(fp,"%.16lf",&num)) == 1 ) 	{ 		if(num<=0.2019607843137) 			fprintf(fp2,"0\n"); 		else  			fprintf(fp2,"1\n"); 	} 	 	fclose (fp); 	fclose (fp2); 	_getch(); 	return 0; } 刚发完才发现还可以做个优化，不能编辑自己的发贴，只好重发一次了。

#include<stdio.h> #include<stdlib.h> #include<conio.h> int main(void) { 	long double num[100001]; 	int i=0; 	FILE *fp,*fp2; 	fp=fopen("C:/datah.txt","r"); 	if (fp==NULL) 	{ 		printf("cannot open fp!\n"); 		exit(1); 	} 	fp2=fopen("C:/outputh.txt","w"); 	if (fp2==NULL) 	{ 		printf("cannot open fp2!\n"); 		exit(1); 	} 	for(i=0;i<100001;i++) 	{ 		fscanf(fp,"%.16lf",&num[i]);     } 	for(i=0;i<=99999;i++) 	{ 		if(num[i]<=0.2019607843137) 			fprintf(fp2,"0\n"); 		else  			fprintf(fp2,"1\n");     } 	 	fclose (fp); 	fclose (fp2); 	_getch(); 	return 0; }

fp=fopen("C:/datah.txt","r"); fp2=fopen("C:/outputh.txt","w"); fscanf(fp,"%.16lf",&num); 向#2楼一样检查你的fp是否正确指向了打开的文件，否则调用fscanf就会触发assert。

引用 8 楼 zhao4zhong1 的回复:纠正7楼： static long double num[100001];赵老师咋自己夸自己


Question: C++安装 Error spawning cl.exe

重新安装，关闭UAC和杀毒软件，以管理员身份运行setup.exe 如果还是不行，从别的网址下载一个不一样的安装包再试。


Question: 解决这个OJ上的题目我哪里有问题

#include <stdio.h>  #include <stdlib.h>  #include <string.h>  #include <math.h>  int main()  {  int i,j,n;scanf("%d",&n);      char t[80];char(*a)[80]=malloc(n*sizeof(80)),(*b)[80]=malloc(n*sizeof(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]);  free(a);free(b);  system("pause");  return 0;  }

题目是这个：  小乐同学学会了用程序做进制转换，异常高兴。小鹏为了不让他骄傲自满，决定出道难点的题目考考他。字母集A到Z，依次表示26到1，26个数字。也就是A=26，B=25...Z=1。他用这些字符来构建了一个26进制的计数方式。比如（ZZ）26进制=（27）10进制。   输入   第一行数字N，表示接下来会有N行输入数据。（N<1000）  接下来的N行，每行一个长度不超过100的字符串。   输出   输出排序(从小到大)之后的字符串，一行一个。   样例输入 2 CA BA  样例输出 CA BA    PS:不知道哪里又问题,应该怎么改..麻烦各位找出一下错误,谢谢了


Question: 读取单色bmp的问题

引用 6 楼 zhao4zhong1 的回复:关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 赵4老师： 那个bmp宽度按4B对齐的问题，按4B对齐不是模4吗？怎么不同的位数，模的数也不一样？我只能模糊的知道原因，老师能不能稍微说一下？下面是改过的 if (bmpInfoHead.biBitCount < 24) 			width = (width % (32 / bmpInfoHead.biBitCount) == 0) ? width : (width / (32 / bmpInfoHead.biBitCount) + 1) * (32 / bmpInfoHead.biBitCount);//宽度调整为4B 32的倍数 		else 			width = (width % 4 == 0) ? width : (width / 4 + 1) * 4;

推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

引用 6 楼 zhao4zhong1 的回复:关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 对了，是4字节，我一直是按4取，long类型的宽度代表像素的位数，我一直是/4了，应该/32的

引用 8 楼 fztfztfzt 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 另外读取4位，8位，24位的bmp都没问题，只有1位会出问题[/quote] “像素宽度”和“每行像素数据所占字节数”不是一回事！

引用 6 楼 zhao4zhong1 的回复:关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 另外读取4位，8位，24位的bmp都没问题，只有1位会出问题

引用 6 楼 zhao4zhong1 的回复:关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。 我在4L已经说了。。。

关键是楼主不知道bmp文件的每行数据所占字节数必须是4的倍数。我猜。

我开始也认为是宽度问题，可现在发现，宽度为288的都可以正确读取，但宽度为272的却无法成功读取

引用 1 楼 user-3 的回复:1. SetPixel那一行要不要考虑换行的情况？我不懂bmp格式，它会不会在同一个字节里保存不同行的像素？ 比如，如果是一个7*7的bmp，那么第一个字节的8位里面有7位是第一行的，剩下1位是不是下一行的？ 2. 我没看懂为什么要i--，可能和其余的代码相关吧。 3. 这一行没必要  else c = 0; c的取值只有0x80和0两个可能。不过这个不会造成错误，就是浪费一点时间而已。 bmp的宽度在读取后要把调整为4的倍数，7*7读取后会按7*8处理。i--是因为setPixel里i++了8次，而我外面还有个for循环，里面有个i++，多加了一次

引用 2 楼 turingo 的回复:应该是坐标的计算问题，SetPixel(hdc, x + i++, y + height - j, c); 中都没有出现过k，这很不合理。 k其实在i++里了。

//先根据每个像素多少位，算出一行像素需要多少个字节， int bitWidth=width*bmpInfoHead.biBitCount; int bytesPerLine=(bitWidth-1)/8+1;  //再将这个字节数向上补为4的倍数。 int bytesPerLine4=((bytesPerLine-1)/4+1)*4;


Question: 关于等长字符串比较的问题

引用 4 楼 starytx 的回复:关键在于“相似度”的定义问题。这样理解相似度对不对：长度相等的情况下，字符相同的的位置个数/字符总个数 ？ 就是就是，怎么定义是个很重要的问题 ABCDEFGHIJKLMN NABCDEFGHIJKLM 这算相似吗？

相似度比较 是最长子串，还是 包含单个字符就可以，这些都是问题！

逐字符比较，并统计相同字符占比。

没看懂，难道是我智商有问题？


Question: 初学者气泡法遇问题，求大神指导一下！

这个不是冒泡排序吧 引用 4 楼 zhao4zhong1 的回复:#include <stdio.h> #include <locale.h> int main() {     int t,i,j,a[15];      setlocale(LC_ALL,"chs");     while (1) {         printf("\n请输入十五个整数，用空格间隔:");         fflush(stdout);         rewind(stdin);         for (i=0;i<15;i++) {             if (1!=scanf("%d",&a[i])) break;         }         if (i>=15) break;     }     for (i=0;i<14;i++) {         for (j=i+1;j<15;j++) {             if (a[i]>a[j]) {t=a[i];a[i]=a[j];a[j]=t;}         }     }     printf("从小到大的顺序为:");     for (i=0;i<15;i++) {         if (i<14) printf("%d," ,a[i]);         else      printf("%d\n",a[i]);     }     return 0; }

给你改了一下，你冒泡冒错了。 你的内层循环（j作为循环变量的循环）是把大的数据冒泡到数组的尾部，那么数组的尾部一次被放上最大的、次大的等数据，那么i就应该从尾部向头部变化。 下面代码是对的，当然还有很多等价的做法。 #include<stdio.h> int main() { int t,i,j,a[15]; printf("请输入十五个整数:\n"); scanf("%d%d%d%d%d%d%d%d%d%d%d%d%d%d%d",&a[0],&a[1],&a[2],&a[3],&a[4],&a[5],&a[6],&a[7],&a[8],&a[9],&a[10],&a[11],&a[12],&a[13],&a[14]);    //这部就是输入15个数（我只会这么写。。。） for(i=14;i>=0;i--) { for(j=0;j<i;j++)    //就是让a[0]和a[1]比，然后a[1]和a[2]比，谁大谁就换后面去 { if(a[j]>a[j + 1]) { t=a[j]; a[j]=a[j+1]; a[j+1]=t;   //这步是交换啦！~~~ } } } printf("从小到大的顺序为:%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d\n",a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9],a[10],a[11],a[12],a[13],a[14]);   //这部其实就是输出结果，我不会高端的>写法。。~~ return 0; }

for里面已经有i++了……既然是练习，你一口气输入15个不累啊？？？

i = i+ 1  这步多余了。


Question: C语言里字符串的复制问题，求解，谢谢！

//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

运算符优先级问题。先运算的关系运算符（!=），产生的结果是1，也就是from前四个字节保存的值是1，打印出来是个笑脸值。扩住的话就先将to的值赋给from，然后将from的值和结束符作比较，才是正确的。

如果记不住优先级(我就是)，那就尽量加括号

注意运算符优先级。 编译器会把from[i] = to[i] != '\0'理解为from[i] = (to[i] != '\0')

不等于号的优先级是要略高于等于号的

不等运算符高于赋值运算符， bug代码的while条件测试就变为 1、 to[i] != '\0' 为真，值为1 from[i] = 1 2、 最后一次循环测试条件 to[i] != '\0' 为假，值为0 最后一个from元素 = 0


Question: c#贪婪法找零钱

如何写zhaoling的函数？

zhaoling这个函数是你写的么?你这个函数就没实现

请问楼主你的这个函数在哪里

写一个zhaoling的函数


Question: %d到底在输出些什么

引用 2 楼 duke56 的回复:1819044162  --->6C 6C 69 42  6C-->l ... 42-->B  倒过来  谢谢你

%d  表示要从你给的地址 取 4 个字节出来 当做整型输出 %c 。。。。 只取一字节

引用 3 楼 duke56 的回复:char一般编译器是1字节,而int是4字节 你强制把char开头的数据拿过来,因为要补齐4字节,就会往后取了!!  还有一点关于数据在内存的排序!!!!  连接供参考一下 http://blog.csdn.net/duke56/article/details/5812726  ARM框架的处理器则这x86的相反...就是(正序)

要输出首字母，当然应该使用  %c,表示单个字符。。。。%d跟你输出的类型  **pptr  不匹配


Question: 关于数组和指针的几个小问题，请教下

变长数组是语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。  老老实实使用malloc,realloc,free不够吗？

我看了下你两个问题，简单回答一下： 1、第一个我觉得两个都不行，数组在编译的时候就要确定长度，但是这个好像确实和编译器有关；不建议像你这样定义数组，如果你想随时改变数组长度，建议#define sizeint 5这种写法，在编译的时候就确定数组的长度。不过好像有的编译器可以支持变长数组。建议还是不要这么用。 2、定义指针的时候，不能直接赋值。举个简单的例子。int *p=5;这种赋值是不行的。不能直接将数赋值给指针。同理，你那种声明指针的时候就赋值，当然是不行的。

1.数组长度在程序编译时，必须确定！这明显跟编译器有关； 2.指针数组：int *intpp_2[ ]={{0},{0}};

第一种情况：const unsigned int sizeint_2 = length_2 ; 错误             因为const类型的变量，不允许改变。 第二种情况：引用int ** intpp_2 =             {                         {0},                         {0}             } ;                        指针需要申请空间才能够初始化或赋值

运用变量来构造数组得看编译器的,看支持C99的程度有多少了   问题1的代码OK,要不参考一下这里: http://blog.csdn.net/duke56/article/details/5825065

gcc 两种都没通过。 g++ 第一种能通过，第二种不能

引用 1 楼 u010030181 的回复:第一个情况下，你确定你的第一个能通过?反正我的是两个都编译不过，不过这个跟编译器有关系！ 第二个问题，你使用指针没有开辟空间，怎么能对呢？  1、我用的是mac，编译器是 LLVM5.0 ；  2、那么，int ** p ，我要分配一个[3][5]大小的内存空间，用malloc该怎么写呢？请教下，谢谢


Question: 大家调试的时候都怎么打log的?

#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #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); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #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} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中

引用 3 楼 shenchenman 的回复:1 第一种很明显没问题,但是之所以编译不过是因为续行符 \ 之后不能存在任何字符,空格也不行 2 第二种,你自己写的那个肯定也没问题,可能你没包含头文件会提示错误吧  Thank You 的确是包含头问题,我把宏函数写到#include之前了,所以提示错误.

#define LOGI(fmt, arg...)   do{printf("[%s:%d[INFO]]: ",__FILE__,__LINE__);printf(fmt,##arg);}while(0) #define LOGE(fmt, arg...)   do{printf("[%s:%d[ERRO]]: ",__FILE__,__LINE__);printf(fmt,##arg);}while(0) #define LOGD(fmt, arg...)   do{printf("[%s:%d[DBUG]]: ",__FILE__,__LINE__);printf(fmt,##arg);}while(0)

看你调试什么，一般，直接打印到显示器就好，没有必要记录下来。


Question: DOS下使用win-tc读取PCI端口，其中32位的端口如何处理？

用TC的原因是编写DOS界面的时候比较好用，因为这些程序都是以一个小工具形式呈现出来的，所以除了小部分核心程序以外，多数代码都是在编译一个可以让用户可操作的界面。                我在写这个PCI读取工具的时候，放弃了使用IO端口 0cf8 0cfc，改用了BIOS中断。其中终端号为0x1a,ax入口参数为0xb109。              不过我还是会参考借鉴大家的资源继续研究使用16位，32位汇编去尝试编译32位，64位程式。     最后感谢各位大神的指点，谢谢你们的资源，感谢大家的热心帮助。

引用 3 楼 zhao4zhong1 的回复:这个问题比较高大上。我也不会。楼主参考下面？ 《The Intel 64 and IA-32 Architectures Software Developer's Manual》 记得WATCOM C可以在纯DOS环境下使用32位程序。

单独写一个小汇编文件实现这个功能

引用 楼主 u013519169 的回复:现在使用Win-TC编写一段程式，实现在DOS下面遍历该电脑的PCI。PCI的控制端口和数据端口为0cf8、0cfc，都是32位字节的端口，而Win-TC（TC2.0）下面不支持对32位端口的直接操作，请问有什么办法可以实现16位编译环境完成32位端口的读写吗？  //这是一段32位环境下C中嵌入汇编语言，实现0cf8H 0cfcH端口读取的程序。 #define pci  (unsigned long) 0x80000000             address1=(pci+(bus<<16)+(dev<<11)+(fun<<8)+reg);         __asm{               mov eax,address1               mov dx,0cf8h               out dx,eax                 mov dx,0cfch               in  eax,dx                  mov result,ax                }   typedef unsigned char DWORD; //16位编译环境实现读32位端口 DWORD inpd(int portid) {                  DWORD  dwRet;                  asm mov dx,portid;                  asm lea bx,dwRet;                           /*接下来这一段是使用插入机器码，在16位环境下实现对32位的操作。（问题就在这，我的编译环境中emit不识别,请问我该如何插入这段机器码？？）*/                  __emit__(                              0x66,0x55,            //push  EAX                              0x66,0xED,           //in EAX,DX                              0x66,0x89,0x07    //mov [BX],EAX                              0x66,0x58             //pop EAX                     return  dwRet; }   //16位编译环境实现写32位端口 void outpd(int portid,DWORD dwVal) {               ......... }  你的思路已经很清晰了，既然你的C编译器不支持emit，那只有单独写一个小文件实现这个功能。你用TC，我有与之配套的TASM汇编器，建议你用我资源中的Turbo C 3.0http://download.csdn.net/detail/binaryhead/2987356，我特意把Tasm.exe、Tlink.exe、Make.exe集成进去了

试试： 1、在Windows下安装VirtualBox； 2、在VirtualBox下安装DOS6.22； 3、在DOS6.22安装Turbo C 2.0； 然后就在TC中编译程序，把整个当成是DOS环境下。

32位的机器中的16位程序只能做16位的操作 为什么还用TC呢

挤一挤


Question: 等车问题

引用 9 楼 binaryhead 的回复:引用 8 楼 binaryhead 的回复:[quote=引用 4 楼 u013163178 的回复:] [quote=引用 1 楼 zxhuser-9 的回复:] 5分钟？好久没做这种题了---自从高考后。。。网上也有些这个问题讨论的方法，不过没人说出此类问题的数学模型。         据说哲学家们研究问题的第一步是研究问题本身是否成其为问题——来自《围城》。实际中，地铁比公交车更容易达到固定间隔班次。假定这两趟车都是小明想要的。         我是这么分析的，首先这是一个很大程度上的随机事件。随机的意思是说：就算两趟公交车发车时间有确定规律，但由于各自路线上的红绿灯情况不同以及各自路线上站点的上、下客时间的不确定性，很容易抹平两趟车发车时间的规律性。当然，实际情况中，同一站点的公交车紧邻的前后两个交通灯相同的概率也不小，所以前述随机性会因为这一情况而有所削弱，不过这不影响我们讨论问题本身。         既然是随机事件，就要考虑概率，而概率的前提是统计，也就是多次赶公交车后的期望值。单次等待时间显然介于0分钟到5分钟        根据统计的思路，不妨取两个（n个类似）时间的最小公倍数10分钟为一个基本单位。先假定统计一个100个基本单位时间，即1000分钟，这1000分钟内，10分钟班次的公交车来了100次，5分钟班次的公交车来了200次，如果前面的随机性假设足够理想，则两趟车交叠（同时达到）的次数应很少，1000分钟内两趟公交车总共来了300次，则平均是3.3分钟一次。3.3分钟是小明平均等车的期望时间。         实际中，公交车夜间停驶并不影响我们的讨论，因为小明明知夜间公交停驶的情况下不会去赶公交。 最后需要说明的是，推论过程的逻辑谬误很容易被高手察觉，但这种实际问题理论解决的背后，需要的实际验证方法或许更有挑战性。        相关疑问，大城市的公交系统中公交线路的设计，是否进行过图论的建模，使得：一段时间内，搭乘总人数*每个人转车次数的总和最优？ [/quote] 修正：小明是均匀地到达两次车间隙中间的，所以期望值还要是3.3次除以2，即约1.7分钟[/quote]

引用 14 楼 adusuccessfully 的回复:[quote=引用 13 楼 zhuzeji 的回复:] [quote=引用 12 楼 jacksonfan 的回复:] 10分钟内肯定有3趟车，平均 就是10/3 [0,10)这个区间内，A车一定有一辆，B车也一定有两辆， 平均时间为10/3 你这个说的挺有道理的[/quote]  刚到车站（0时刻）就刚好有A,B车，过5分钟等来了另一辆B车，在过5分钟再等来了一辆B，一辆A，这样算的话，就是有10分钟内有5辆车。平均时间是2分钟。[/quote] 你这样考虑不对， 不信你按照一个小时算算 ， 我说是【0,10）是可以每隔10分钟都一样的，即【10,20） 与【0,10）效果一样 你想的是【0,10】 但是 【10,20】的话 就会出现重复现象  所以包含了0时刻就不能包含10 时刻

10分钟内肯定有3趟车，平均 就是10/3

引用 13 楼 zhuzeji 的回复:[quote=引用 12 楼 jacksonfan 的回复:] 10分钟内肯定有3趟车，平均 就是10/3 [0,10)这个区间内，A车一定有一辆，B车也一定有两辆， 平均时间为10/3 你这个说的挺有道理的[/quote]  刚到车站（0时刻）就刚好有A,B车，过5分钟等来了另一辆B车，在过5分钟再等来了一辆B，一辆A，这样算的话，就是有10分钟内有5辆车。平均时间是2分钟。

引用 12 楼 jacksonfan 的回复:10分钟内肯定有3趟车，平均 就是10/3 [0,10)这个区间内，A车一定有一辆，B车也一定有两辆， 平均时间为10/3 你这个说的挺有道理的

引用 7 楼 jack_guanggong 的回复:假如A路，B路都是8点发车，那么小明每次等到A路的时候，B路车也到了，小明每次可以都上B路车。所以小明每次等车是以B路车为标准的，小明等车的平均时间为5/2=2.5分钟。例如：A（8：10   8:20） B（8:05  8：10 8:15  8:20），对吗？ 应该不是吧，为什么不是 A 8:00 B 8:02 B 8:07 A 8:10 B 8:12 间隔是 2 5 3 2 5 3 这样子

下一步就是如何用计算机随机数产生来验证的问题了，哪位童鞋来做一下。

引用 8 楼 binaryhead 的回复:引用 4 楼 u013163178 的回复:[quote=引用 1 楼 zxhuser-9 的回复:] 5分钟？好久没做这种题了---自从高考后。。。网上也有些这个问题讨论的方法，不过没人说出此类问题的数学模型。         据说哲学家们研究问题的第一步是研究问题本身是否成其为问题——来自《围城》。实际中，地铁比公交车更容易达到固定间隔班次。假定这两趟车都是小明想要的。         我是这么分析的，首先这是一个很大程度上的随机事件。随机的意思是说：就算两趟公交车发车时间有确定规律，但由于各自路线上的红绿灯情况不同以及各自路线上站点的上、下客时间的不确定性，很容易抹平两趟车发车时间的规律性。当然，实际情况中，同一站点的公交车紧邻的前后两个交通灯相同的概率也不小，所以前述随机性会因为这一情况而有所削弱，不过这不影响我们讨论问题本身。         既然是随机事件，就要考虑概率，而概率的前提是统计，也就是多次赶公交车后的期望值。单次等待时间显然介于0分钟到5分钟        根据统计的思路，不妨取两个（n个类似）时间的最小公倍数10分钟为一个基本单位。先假定统计一个100个基本单位时间，即1000分钟，这1000分钟内，10分钟班次的公交车来了100次，5分钟班次的公交车来了200次，如果前面的随机性假设足够理想，则两趟车交叠（同时达到）的次数应很少，1000分钟内两趟公交车总共来了300次，则平均是3.3分钟一次。3.3分钟是小明平均等车的期望时间。         实际中，公交车夜间停驶并不影响我们的讨论，因为小明明知夜间公交停驶的情况下不会去赶公交。 最后需要说明的是，推论过程的逻辑谬误很容易被高手察觉，但这种实际问题理论解决的背后，需要的实际验证方法或许更有挑战性。        相关疑问，大城市的公交系统中公交线路的设计，是否进行过图论的建模，使得：一段时间内，搭乘总人数*每个人转车次数的总和最优？ [/quote] 修正：小明是均匀地到达两次车间隙中间的，所以期望值还要是3.3次除以2，即约1.7分钟

引用 4 楼 u013163178 的回复:引用 1 楼 zxhuser-9 的回复:5分钟？好久没做这种题了---自从高考后。。。网上也有些这个问题讨论的方法，不过没人说出此类问题的数学模型。         据说哲学家们研究问题的第一步是研究问题本身是否成其为问题——来自《围城》。实际中，地铁比公交车更容易达到固定间隔班次。假定这两趟车都是小明想要的。         我是这么分析的，首先这是一个很大程度上的随机事件。随机的意思是说：就算两趟公交车发车时间有确定规律，但由于各自路线上的红绿灯情况不同以及各自路线上站点的上、下客时间的不确定性，很容易抹平两趟车发车时间的规律性。当然，实际情况中，同一站点的公交车紧邻的前后两个交通灯相同的概率也不小，所以前述随机性会因为这一情况而有所削弱，不过这不影响我们讨论问题本身。         既然是随机事件，就要考虑概率，而概率的前提是统计，也就是多次赶公交车后的期望值。单次等待时间显然介于0分钟到5分钟        根据统计的思路，不妨取两个（n个类似）时间的最小公倍数10分钟为一个基本单位。先假定统计一个100个基本单位时间，即1000分钟，这1000分钟内，10分钟班次的公交车来了100次，5分钟班次的公交车来了200次，如果前面的随机性假设足够理想，则两趟车交叠（同时达到）的次数应很少，1000分钟内两趟公交车总共来了300次，则平均是3.3分钟一次。3.3分钟是小明平均等车的期望时间。         实际中，公交车夜间停驶并不影响我们的讨论，因为小明明知夜间公交停驶的情况下不会去赶公交。 最后需要说明的是，推论过程的逻辑谬误很容易被高手察觉，但这种实际问题理论解决的背后，需要的实际验证方法或许更有挑战性。        相关疑问，大城市的公交系统中公交线路的设计，是否进行过图论的建模，使得：一段时间内，搭乘总人数*每个人转车次数的总和最优？

引用 2 楼 hnwyllmm 的回复:这不是概率题吗，不会了....我也不会

引用 3 楼 zhuzeji 的回复:B路才五分钟，不论怎么等，5分钟内肯定有一辆B路车，平均时间肯定要小于5min了好吧。。。

这不是概率题吗，不会了....

5分钟？好久没做这种题了---自从高考后。。。


Question: 51单片机动态数组开辟问题

仅供参考： //使用动态分配 #include <stdio.h> #include <stdlib.h> #include <malloc.h> int i,L; char *p; void main() {     for (i=0;i<20000;i++) {         L=rand();         p=malloc(L);         if (NULL==p) {             printf("malloc error!\n");             continue;         }         memset(p,0,L);         free(p);     } } //不使用动态分配 #include <stdio.h> #include <stdlib.h> #include <memory.h> #define MAXLEN 30000 int i,L; char buf[MAXLEN]; char *p; void main() {     p=&buf[0];     for (i=0;i<20000;i++) {         L=rand();         if (L>MAXLEN) {             printf("L>MAXLEN==%d, ignore spilth.\n",MAXLEN);             L=MAXLEN;         }         memset(p,0,L);     } }  个人意见：不使用动态分配。

引用 12 楼 jennyvenus 的回复:引用 11 楼 wenlongcai1995 的回复:[quote=引用 7 楼 jennyvenus 的回复:] space = null; null就是0啊，51的ram里面，0地址肯定是有内容的。 请看九楼我的调试图 释放malloc的数组，当然用free 清除malloc的内容，当然用memset [/quote]恩 是的 不过在51里面如果要用到free()和malloc（）函数的话还要给init_meepool()函数初始化 麻烦你解释解释下

引用 11 楼 wenlongcai1995 的回复:引用 7 楼 jennyvenus 的回复:space = null; null就是0啊，51的ram里面，0地址肯定是有内容的。 请看九楼我的调试图 释放malloc的数组，当然用free 清除malloc的内容，当然用memset

在单片机那么有限的内存里面玩动态申请，是难以保证可靠性的。 程序首先应该考虑可靠性，如果分配失败就可能是灾难性的后果。其实在PC机或者移动设备上编程也是类似的。只是我们有足够大的内存可用，所以可以放心的让操作系统来动态分配。另一方面，也是最主要的原因，大家都觉得分配失败不是个什么问题，程序重启也是用户可以容忍的。事实上，低可靠性损失的是用户体验，那比功能缺失更加可怕。

引用 13 楼 wenlongcai1995 的回复:引用 12 楼 jennyvenus 的回复:[quote=引用 11 楼 wenlongcai1995 的回复:] [quote=引用 7 楼 jennyvenus 的回复:] space = null; null就是0啊，51的ram里面，0地址肯定是有内容的。 请看九楼我的调试图 释放malloc的数组，当然用free 清除malloc的内容，当然用memset [/quote]恩 是的 不过在51里面如果要用到free()和malloc（）函数的话还要给init_meepool()函数初始化 麻烦你解释解释下[/quote] 不懂，51里面我们从来不动态申请，有时候内存复用，也是自己写.

引用 5 楼 airelf 的回复:free(space);   //所谓释放space内存，表示这块内存以后不能再被使用了，但不表示这块内存的内容被清零 space=NULL;   //让space指向空地址，表示space这个指针指向的地址设置为null ,即这个变量自身的值被清零 那51里面有什么库函数能够实现对数组的内容和内存进行清零而保持内存能够继续使用吗 或者能给个建议能实现开辟一个长度可以改变的内存

在调试SPACE=null这段语句时 内存没被释放可是至少space[0]和space[3]应该 等于0吧？我是这么理解的 可是我用keil调试发现space[0]和space[3]都是1，也就是上一次的赋值没被释放 麻烦大家再帮我看看 或者能给个建议能显示开辟一个长度可以改变的内存

内容是NULL不是释放内存

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

数组的长度每次都会改变 可以用realloc

指针消亡了，并不表示它所指的内存会被自动释放。同样，内存被释放了，并不表示指针会消亡或者成了 NULL 指针。

发现上一次的首元素的内存一直无法释放，于是本人通过调试测试每一次数组各元素的值来判断哪里出错，发现程序到space=NULL,space[0]还是没有被清零，  好久没玩51了，首元素的内存无法释放是什么意思？程序执行完space = NULL后，也即是space = NULL的下一条语句才执行了space = NULL,这个时候才是查看是否有问题，你既然释放了这个内存，51单片机有保证释放的内存会清零么？

引用 楼主 wenlongcai1995 的回复:我想要达到的效果是开辟一个动态数组，数组的长度每次都会改变。遇到的问题是，发现上一次的首元素的内存一直无法释放，于是本人通过调试测试每一次数组各元素的值来判断哪里出错，发现程序到space=NULL,space[0]还是没有被清零，以下是我的测试程序 告诉我你的51单片机编译器名字，以及工程的内存模型（比如Keil就区分small,compact,large几种内存模型）。以及你是如何测试的？即你的测试程序是纯软件模拟，还是实际硬件仿真器上运行？


Question: 关于程序启动参数输入任意ASCII码

作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

引用 14 楼 zhao4zhong1 的回复:char buffer[9]; char a[4]; int i,v; sscanf(argv[1], “%8s”， buffer);"01020304" for (i=0;i<4;i++) {  sscanf(buffer+i*2,"%2x",&v);  a[i]=(char)v; } 多谢大神，涨知识了~非常感谢~~

这种事情都来问，直接看楼上代码

你的参数有什么规则  就把解析方式自己写一套， 去解析argv 里面的内容。

引用 1 楼 zhouqinghe24 的回复:自己写解析吧。 什么意思老大？写啥解析？

if ('\'==buffer[j] && 'x'==buffer[j+1]) { 改为 if ('\\'==buffer[j] && 'x'==buffer[j+1]) {

上贴char buffer[9];改为char buffer[17];

char buffer[9]; char a[17]; int i,v,j; sscanf(argv[1], “%16s”， buffer);//"AB\x01C" j=0; for (i=0;i<4;i++) {  if ('\'==buffer[j] && 'x'==buffer[j+1]) {   sscanf(buffer+j+2,"%2x",&v);   a[i]=(char)v;   j+=4; } else   a[i]=buffer[j];j++; }

引用 13 楼 dnfiexiao 的回复:[quote=引用 11 楼 user-4 的回复:] [quote=引用 9 楼 dnfiexiao 的回复:] [quote=引用 6 楼 user-4 的回复:] 你是不是搞错参数了？vendor 和 vendorclassid 不是一个参数 字符串中的十六进制跟 C 是一样的 加入 \x 前缀 "\x0f\x0e\x0a" 不行亲~ 还是怎么输入怎么输出[/quote] 加引号啊？ 我也不知道你这个 test 是什么东西了 --param1="\x0f" 这种是针对要求字符串的 --param2=0x0f   这种是针对要求数字的  也可以是10进制 --param2=15  另外你是在test里面调用了其他的东西么？引号还有'\' 的嵌套你要搞清楚哦[/quote] test我就是这样写的： 最后的结果是这样的： 因为我要重新写dhcpcd~难道要自己重新写一个函数，解析\x01\x02这样的输入吗？[/quote] int main(int argc, char** argv) 对程序而言，参数就是字符串，字符串的格式？你自己定义 如果你要写 test，那么是的，你要自己解析所有的参数

引用 11 楼 user-4 的回复:[quote=引用 9 楼 dnfiexiao 的回复:] [quote=引用 6 楼 user-4 的回复:] 你是不是搞错参数了？vendor 和 vendorclassid 不是一个参数 字符串中的十六进制跟 C 是一样的 加入 \x 前缀 "\x0f\x0e\x0a" 不行亲~ 还是怎么输入怎么输出[/quote] 加引号啊？ 我也不知道你这个 test 是什么东西了 --param1="\x0f" 这种是针对要求字符串的 --param2=0x0f   这种是针对要求数字的  也可以是10进制 --param2=15  另外你是在test里面调用了其他的东西么？引号还有'\' 的嵌套你要搞清楚哦[/quote] test我就是这样写的： 最后的结果是这样的： 因为我要重新写dhcpcd~难道要自己重新写一个函数，解析\x01\x02这样的输入吗？

引用 10 楼 zhao4zhong1 的回复:你命令行输入 xxx.exe --vendor=0x01 看输出是不是vendor==1 #include <stdio.h> char s[]="0x123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%i%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,291,3 //k,v,n=0,291,3 //skip char[ ] //k,v,n=0,291,3 //skip char[a] //k,v,n=0,291,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.  嗯，你这个没问题的~但如果我想用0x01 0x02 0x03 0x04将char[0:3]同时初始化，命令行调用的时候该怎么样呢？ sscanf(argv[1], “%s”， buffer) 谢谢大神~

引用 9 楼 dnfiexiao 的回复:[quote=引用 6 楼 user-4 的回复:] 你是不是搞错参数了？vendor 和 vendorclassid 不是一个参数 字符串中的十六进制跟 C 是一样的 加入 \x 前缀 "\x0f\x0e\x0a" 不行亲~ 还是怎么输入怎么输出[/quote] 加引号啊？ 我也不知道你这个 test 是什么东西了 --param1="\x0f" 这种是针对要求字符串的 --param2=0x0f   这种是针对要求数字的  也可以是10进制 --param2=15  另外你是在test里面调用了其他的东西么？引号还有'\' 的嵌套你要搞清楚哦

引用 6 楼 user-4 的回复:你是不是搞错参数了？vendor 和 vendorclassid 不是一个参数 字符串中的十六进制跟 C 是一样的 加入 \x 前缀 "\x0f\x0e\x0a" 不行亲~ 还是怎么输入怎么输出

引用 6 楼 user-4 的回复:你是不是搞错参数了？vendor 和 vendorclassid 不是一个参数 字符串中的十六进制跟 C 是一样的 加入 \x 前缀 "\x0f\x0e\x0a" 对，我就是问这个~我试试哈，谢谢了大神！

引用 4 楼 zhao4zhong1 的回复:int v; if (argc>=2) if (1==sscanf(argv[1],"--vendor=%i",&v)) printf("vendor==%d\n",v); 老板，我说的不是这个意思~我说的是，怎么输入非字母和数字，比如，我想初始化char a[10] 为0x01, 0x02, 0x03,0x04，这四个参数都是用键盘是没法输入的，咋办？

自己写解析吧。


Question: C语言 十进制矩阵转换二进制

这个问题已经解决了  谢谢大家  后续要解决的是关于迷宫的问题 需要根据矩阵先画出图，不太明白怎么在矩阵格子里画墙，因为格子里是数值（数值和四周围墙是有关系的） 可不可以重新定义一个矩阵，在每个格子里画上下左右的墙？ 具体怎么做呢？

仅供参考#include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

引用 2 楼 etmkndmpl 的回复:我已经做出了如何转换成二进制形式  但是怎么把他们按照十进制的矩阵格式大小显示出来？  谢谢  而且因为我后面要用到这些二进制形式的数 做判断 所以是不是要申请一个数组把他们存下来 malloc?

void show( int iNum ) {     for( int i=0; i<4; i++ )    {        printf( "%d", iNum&(0x08>>i) );    } }

（1）如果已经转换成十进制存储了，那么不用转换二进制了，直接采用二进制操作即可，计算机存储的就是二进制 （2）如果还没有转换，即从文件中读取了数字字符，那么用它减去字符'0'就是十进制值，比如 ’2‘ - ‘0’ = 2。然后转换成上面（1）

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

文件的存储方式本来就是二进制方式，只是打印出来是十进制而已，所以你要进行二进制运算根本不需要转换啊，十进制树也是可以做位运算的


Question: 判断回文数，多次输入多次判断。可是为什么循环下来的多次输入有错误呢？VC6

图没传上去吗。。。。。

这个就是在递归中把数反过来写。比如123，分别得出3，32，321

判断回文，仅供参考 bool IsHuiWen(int nNum) { 	int m = nNum; 	int nTmp = 0; 	while (m > 0) 	{ 		nTmp = nTmp*10+m%10; 		m = m/10; 	} 	 	if (nTmp == nNum) 	{ 		return true; 	}  	return false;  }

引用 6 楼 u013163178 的回复:判断回文数，支持大数，仅供参考 /*************************************************************************     > File Name: IsHuiwen.c     > Author: 傻李     > Mail: hellojukay@gmail.com      > Created Time: 2014年11月18日 星期二 14时59分09秒  ************************************************************************/ #include<string.h> #include<stdio.h> int IsHuiWen(int n) { 	char buffer[1000]; 	memset(buffer,'\0',20); 	sprintf(buffer,"%d",n); 	int i; 	int state =1; 	int len = strlen(buffer); 	for(i = 0; i < len; ++i) 	{ 		if(buffer[i] != buffer[len-i - 1]) 		{ 			state = 0; 			break; 		} 	} 	return state; }  int main() { 	int i; 	int n; 	for(i = 0;i < 5; ++i) 	{ 		scanf("%d",&n); 		if(IsHuiWen(n)) 			printf("YES\n"); 		else 			printf("NO\n"); 	} 	return 0; }   初学者，有的函数还看不懂。但是还是谢谢

引用 3 楼 fireofsun 的回复:那是因为你的int numpal(int);里面定义了一个static的数据，在第一次的时候没问题，但是在调用第二遍int numpal(int)的时候，那个数本来应该清零后再用，但是static的不会自己清零，试试看我这个成不成 int OriNum;   //全局变量，储存用户输入的最初值 int main() { 	int numpal(int Num,int SedNum=0);       //定义一个递归函数，来求这个数字的回文数 	int i,Num,c; 	for(i=1;i<=5;i++) 	{ 		printf("Please input a integer to check it:"); 		scanf("%d",&Num); 		OriNum=Num; 		//int SedNum=0; 		c=numpal(Num);  		if(c==1) 		printf("Congratulations!You get the palindromic number.\n");    //返回值是1，就说明是回文数，否则不是 		else  		printf("Sorry.The number you input is not a palindromic number.\n"); 	}  	return 0; } int numpal(int Num,int SedNum=0) { 	int Chek(int,int);  //定义一个函数，来检测原数和倒过来后的数字是否相等 	int a,b; 	//static int SedNum=0;  	a=Num%10; 	Num=Num/10; 	SedNum=SedNum*10+a;  	if(Num==0) 		return Chek(OriNum,SedNum); 	else 		return numpal(Num,SedNum); } int Chek(int a,int b) { 	if(a==b) 	return 1;   //原数和反序数相等返回1，否则返回0 	else 	return 0; }   哦哦，这样就可以了。。原来在函数首部行能初始化变量啊，这样用就特别舒服。

引用 2 楼 longburulin 的回复:什么叫做你第一个能判断正确？我输入121的时候 压根就判断错误不是回文数，只能输入个位数就说是回文数 只能说你的算法有问题了a=Num%10; Num=Num/10; SedNum=SedNum*10+a;没看懂你写的是什么意思   这个就是在递归中把数反过来写。比如123，分别得出3，32，321


Question: 程序调试时遇到access violation的问题

单步调试跟踪，看看指针哪里异常了。

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


Question: 新手的一点提问。。。这里为何要用static

引用 10 楼 filia2014 的回复:   这是错误提示，如果加上static就没有。。。。 这就是跟你的编译环境有关系！呵呵

main只调用一次，在其中变量使用static的和不使用的唯一区别就是数据放在不同的段里喽！

引用 10 楼 filia2014 的回复:   这是错误提示，如果加上static就没有。。。。我可以说你这个也太老了吧？现在不是很多的编程软件……如果只喜欢敲命令行的话，可以用装个linux系统……

这是错误提示，如果加上static就没有。。。。

我是 turo C2 真的会出错。。。所有的指针数组地址都显示错误。。。。。。。试了好几次了。。。。我还以为是不是指针数组的地址不定义静态变量就全部是会变化的。。。。。。

你看的书太老了

在main函数中就是让static定义成静态全局变量存储在全局数据区，如果没有static的话，其实也是在这里，但是有的话就是说在定义的文件有效，不是整个工程文件内都有效。在main函数中确实比较特殊，可以不要的。

从语法角度来看, 你这程序, 用不用static都没有错.

我试过，没出错。 你用的什么编译器？不会是臭名昭著的VC6吧

引用 2 楼 filia2014 的回复:引用 1 楼 u010030181 的回复:这里使不使用都没有关系…… 不使用会出错！ 会出错？ 出什么错啊？ 从程序看不会出错的。

鉴定 不出错。

这里使不使用都没有关系……


Question: 关于局部变量数组初始化的问题，求助~~~

必须初始化字符数组： char buffer[34]="\0";

你的打印 buffer 的函数有错误，打印到 buffer 以外去了，

引用 3 楼 xydp1987108 的回复:char buffer[34] = {0}  ++1  临时变量就这样初始化了，new的变量 可以menset()    也可以想你那样for去赋值

char buffer[34] = {0}; 初始化一下试试

char buffer[34] = {0}

'\0'的值是0, '0'的值是32 两个是不一样的

应该初始化成 buffer[i] = '\0';

char buffer[34] = {0}; 初始化一下试试

void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

引用 17 楼 binaryhead 的回复:[quote=引用 15 楼 puj2003 的回复:]         char buffer[34]; 	for(int i = 0; i < 34; i++) 	{ 		buffer[i] = '0'; 	} 	buffer[0] = 'C'; 	buffer[13] = 'V'; 	buffer[14] = 'I'; 	buffer[17] = '1'; 	buffer[18] = '2'; 	buffer[19] = ch_timeStamp[0]; 	buffer[20] = ch_timeStamp[1]; 	buffer[21] = ch_timeStamp[2]; 	buffer[22] = ch_timeStamp[3]; 	buffer[23] = ch_timeStamp[4]; 	buffer[24] = ch_timeStamp[5]; 	buffer[25] = ch_timeStamp[6]; 	buffer[26] = ch_timeStamp[7]; 	buffer[27] = ch_timeStamp[8]; 	buffer[28] = ch_timeStamp[9]; 	buffer[32] = '1';  // 只提取一条视频 	buffer[33] = 'E'; 	 	this->SetShowEditText("提取时间为" + strTrafficEventTime + "的视频！"); 	int result = this->SendDateToClient(buffer, 34);   //在这里buffer的值就已经是：C000000000000VI001214077505480001E烫烫烫烫烫1407750548C000000000000VI001214077505480001E难道不是34字节吗，后面的乱码是因为你声明的是char数组，VS开发环境在显示的时候：认为是一个可显示字符串，显示直到’\0’结束，这只是VS显示的问题。[/quote]  恩，你说的对，按照你的方法解决了，多谢，结贴给分

引用 14 楼 user-10 的回复:楼主首先搞清楚的是buffer是用来存字符串的还是用来存字符数组的。 如果是存字符串就用printf("%s", buffer)输出， 如果是字符数组就应该用 for (i = 0; i < 34; i++)     printf("%c", buffer[i]); 你说的对，我在调log打印的时候用的是"%s"，将buffer所有内容都打出来了，现在改成循环打字符，至少不正确的字符是不会被打出来的。不过还是不明白buffer为什么会多出20个字节。

引用 15 楼 puj2003 的回复:char buffer[34]; 	for(int i = 0; i < 34; i++) 	{ 		buffer[i] = '0'; 	} 	buffer[0] = 'C'; 	buffer[13] = 'V'; 	buffer[14] = 'I'; 	buffer[17] = '1'; 	buffer[18] = '2'; 	buffer[19] = ch_timeStamp[0]; 	buffer[20] = ch_timeStamp[1]; 	buffer[21] = ch_timeStamp[2]; 	buffer[22] = ch_timeStamp[3]; 	buffer[23] = ch_timeStamp[4]; 	buffer[24] = ch_timeStamp[5]; 	buffer[25] = ch_timeStamp[6]; 	buffer[26] = ch_timeStamp[7]; 	buffer[27] = ch_timeStamp[8]; 	buffer[28] = ch_timeStamp[9]; 	buffer[32] = '1';  // 只提取一条视频 	buffer[33] = 'E'; 	 	this->SetShowEditText("提取时间为" + strTrafficEventTime + "的视频！"); 	int result = this->SendDateToClient(buffer, 34);   //在这里buffer的值就已经是：C000000000000VI001214077505480001E烫烫烫烫烫1407750548C000000000000VI001214077505480001E难道不是34字节吗，后面的乱码是因为你声明的是char数组，VS开发环境在显示的时候：认为是一个可显示字符串，显示直到’\0’结束，这只是VS显示的问题。

引用 15 楼 puj2003 的回复:char buffer[34]; 	for(int i = 0; i < 34; i++) 	{ 		buffer[i] = '0'; 	} 	buffer[0] = 'C'; 	buffer[13] = 'V'; 	buffer[14] = 'I'; 	buffer[17] = '1'; 	buffer[18] = '2'; 	buffer[19] = ch_timeStamp[0]; 	buffer[20] = ch_timeStamp[1]; 	buffer[21] = ch_timeStamp[2]; 	buffer[22] = ch_timeStamp[3]; 	buffer[23] = ch_timeStamp[4]; 	buffer[24] = ch_timeStamp[5]; 	buffer[25] = ch_timeStamp[6]; 	buffer[26] = ch_timeStamp[7]; 	buffer[27] = ch_timeStamp[8]; 	buffer[28] = ch_timeStamp[9]; 	buffer[32] = '1';  // 只提取一条视频 	buffer[33] = 'E'; 	 	this->SetShowEditText("提取时间为" + strTrafficEventTime + "的视频！"); 	int result = this->SendDateToClient(buffer, 34);   //在这里buffer的值就已经是：C000000000000VI001214077505480001E烫烫烫烫烫1407750548buffer[33] = 0;最后一个字节应该是结束符才对

我的意思是：明明buffer开的34个字节，怎么会把乱码也带进去了？而且我在终端也抓到了包：2014-11-18 13:22:01 服务器发送的消息：C000000000000VI001214077505480001E烫烫烫烫烫1407750548  困惑啊

引用 10 楼 puj2003 的回复:不行。我开始就这样做的，断住后看buffer里面元素都是超过34，即"烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫1407750548"什么叫“元素都是超过34”？难道你越界写入了？

引用 10 楼 puj2003 的回复:[quote=引用 4 楼 starytx 的回复:] char buffer[34] = {0}; 初始化一下试试 不行。我开始就这样做的，断住后看buffer里面元素都是超过34，即"烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫1407750548"[/quote]        问题出在你的发送程序而不是初始化程序。你只声明了34个字节的数组，你发送的字节就不能超过34字节，你需要的是调试你的发送程序。特别注意前面网友提到的：如果你的发送程序是判断’\0’作为发送结束条件的话，则你需要在34字节数组的内部的实际内容尾部添加’\0’，如果你本身就要发送34个字节有效信息，在前面的发送程序逻辑不修改的情况下，数组应该声明为35个字节，以便容纳有效信息刚好是34字节情形下的末尾’\0’。

引用 4 楼 starytx 的回复:char buffer[34] = {0}; 初始化一下试试 不行。我开始就这样做的，断住后看buffer里面元素都是超过34，即"烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫烫1407750548"


Question: C语言 KMP 这个代码没看懂，大神帮忙看一下！

引用 1 楼 zhouxiaofeng1021 的回复:字符串匹配问题，看一下算法说明 有公式的 请参考 http://blog.csdn.net/yaochunnian/article/details/7059486 做个沙发嘻嘻！  我知道求next数组有公式，但这个程序里为什么没有用求next数组，就直接用了？

引用 2 楼 baiyz27 的回复:[quote=引用 1 楼 zhouxiaofeng1021 的回复:] 字符串匹配问题，看一下算法说明 有公式的 请参考 http://blog.csdn.net/yaochunnian/article/details/7059486 做个沙发嘻嘻！  我知道求next数组有公式，但这个程序里为什么没有用求next数组，就直接用了？[/quote] 没有初始化就用next那就是写这个程序的人的问题，C编译器不会强制阻止编程人员访问未初始化数组的元素，所以这个程序能编译通过。但这个程序能实际工作吗？试试就知道了。


Question: 关于C语言中文件输入与输出的问题

原因是你fprintf（）函数用完了以后没有fclose文件，数据根本没有写到文件里面，你可以单步调试，文件里面是空的。根本就没有数据。

有三个明显的错误 1.  fopen(name, "w") 只能写不能读 用读写方式打开用fopen(name, "w+b"); 2. fread和fwrite之间要加上fseek之类的定位操作 3. int 类型的printf格式为%d

引用 6 楼 hwx342840456 的回复:说的简单一点，就是fprintf()函数用了以后函数指针是指向的文件末尾，用关掉文件，和rewind都可以将指针指向开头，这时候才写进了文件。我是这么理解的，其它大神可以帮忙给你解释一下。 受教了~~

另外遇到问题多F9,F10,F11调试一下，一下就能看出问题处在哪儿了。多调试，多百度。其实答案 还是满好找的。我也是新手，才入门C，互相学习。

引用 4 楼 ikuovbs 的回复:[quote=引用 2 楼 hwx342840456 的回复:] 给你贴上代码，在你的基础上修改了一下： #include <stdio.h> #include <stdlib.h> void main(void) { char filename[20]; int ch; FILE *fp; long count=0;	 printf("请输入文件的名称:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("Cant open %s\n",filename); exit(1); } fprintf(fp,"%s",filename);                     fclose(fp);                                   //-------fprint函数是将缓存写到文件里，用它需要关闭文件。 fp=fopen(filename,"r");						// 打开该文件只读。							 while((ch=getc(fp))!=EOF)                  {                                          putc(ch,stdout); count++; } fclose(fp); printf("File %s has %lf characters\n",filename,(float)count);//另外，你count定义的是int型，你输出确实lf型，所以给你强制转换（float）count }  大哥，可以解释一下为何fprintf将缓冲写入了文件之后，用它需要关闭文件的原因吗?[/quote]  因为你上面的打开文件是只写啊，就输出以后，就关掉，再打开，后面才能读。你也可以像楼上说的这样改，将文件该文读写，然后fprintf（）；注意这里fp已经指到文件末尾了，需要指到开头，所以需要rewind一下。 代码如下： void main(void) { char filename[20]; int ch; FILE *fp; long count=0;	 printf("请输入文件的名称:"); scanf("%s",filename); if((fp=fopen(filename,"w+"))==NULL)//修改为读写。 { printf("Cant open %s\n",filename); exit(1); } fprintf(fp,"%s",filename);  rewind(fp);                                      //这里是关键，需要将fp指针指向文件开头;                   //fclose(fp);           修改                         //fp=fopen(filename,"r");	修改 	 while((ch=getc(fp))!=EOF)                  {                                          putc(ch,stdout); count++; } fclose(fp); printf("File %s has %lf characters\n",filename,(float)count);//另外，你count定义的是int型，你输出确实lf型，所以给你强制转换（float）count }

引用 2 楼 hwx342840456 的回复:给你贴上代码，在你的基础上修改了一下： #include <stdio.h> #include <stdlib.h> void main(void) { char filename[20]; int ch; FILE *fp; long count=0;	 printf("请输入文件的名称:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("Cant open %s\n",filename); exit(1); } fprintf(fp,"%s",filename);                     fclose(fp);                                   //-------fprint函数是将缓存写到文件里，用它需要关闭文件。 fp=fopen(filename,"r");						// 打开该文件只读。							 while((ch=getc(fp))!=EOF)                  {                                          putc(ch,stdout); count++; } fclose(fp); printf("File %s has %lf characters\n",filename,(float)count);//另外，你count定义的是int型，你输出确实lf型，所以给你强制转换（float）count }  大哥，可以解释一下为何fprintf将缓冲写入了文件之后，用它需要关闭文件的原因吗?