Question: scanf()多个占位符之间到底可不可以加东西？

非格式化的字符应该对应的出现于输入流中，即 scanf("%d,%d", &a, &b); 那么输入的时候就应该输入 1[b],[/b]2

尽量不要把多个输入写在一个scanf里面，因为别人用你的程序的时候，不知道你用的是逗号还是空格。所以你还是分开写计较好，如果你需要多个输入，可以把scanf放在一个循环里面

原样输入。scanf中间加了逗号，输入时也要加逗号，中间加了字母，输入时也要加。

按格式输入。。。

引用 3 楼 duoyidu981617019 的回复:恩，懂了，不知道为什么我用VC6.0运行后，非运算控制符后后显示：烫烫烫烫烫烫烫。。。 检查检查，看是哪里不对了 建议不要使用VC6了，太老了，推荐dev c++、c-free、vs2010及以上版本等

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

http://blog.csdn.net/u012421456/article/details/18501309 非输入控制符原样的输入


Question: 请大家帮帮忙，我在主程序里面要调用的一个16进制转换2进制的程序，可是我不懂得怎么将这个转换后的2进制返回到我的主程序里面

谢谢你啊，我现在把问题解决了，多谢！

谢谢了，我会好好学习一下，楼上能不能再帮我看一下，把程序帮我改改，我是新手，指针学的不怎么好。

在你的程序中进行的改写……其中你可以利用函数的返回值也可以把要赋值的东西传进去赋值……只是这个数组不知道要定义多大，大了浪费空间，小了肯定放不下……仅供参考！！！ #include <stdio.h>  char arrayLage[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; char arrayLittle[16] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};  int chartohex(char num) { 	for (int i =0; i< 16; i++) 	{ 		if (arrayLage[i] == num || arrayLittle[i] == num) 			return i;			 	} 	return -1; }  int sixten_two(char change[10],int number, int outarry[], int arryindex) {		 	int i,j; 	int result=0;  	int b[50]; 	static int p[30]; 	for(i=0;i<number;i++) 	{ 		int returnvalue = chartohex(change[i]); 		if (returnvalue != -1) 		{ 			b[i] = returnvalue; 		} 		else 		{ 			printf("传入的十六进制数有误"); 			return -1; 		} 	} 	 	for(j=number-1,i=1;j>=0;j--,i*=16) 	{ 		result +=b[j]*i; 	} 	 	for(j=0;result!=0;j++) 	{ 		outarry[j]=result%2; 		result=result/2;  	} 	return --j;	//记得减1  	/* 	for(i=j-1;i>=0;i--) 	{ 		printf("%d\t",outarry[i]); 		 	} 	*/ }  int main(void) { 	int array[30]= {0};	//定义你在程序要调用的数组，也就是你所谓的返回值  	  	int numbit = sixten_two("a",1, array, 30);//没有排除返回值为-1的情况  	for (int i = numbit; i >= 0; i--) 		printf("%d\t", array[i]);  	return 0; }

没必要用那么多的case语句，方法用二楼的就行。至于C/C++的函数是不能返回一个数组的，只能返回一个数组的指针，你可以在主程序定义一个数组binary，然后传进这个数组来存储计算得来的二进制数，如：int sixten_two(char change[10],int number, char* binary);这样你把二进制数存到binary这个数组就好了。还有一个，记住计算得来的二进制数是倒序的。。。。 PS：初学的时候就养成良好命名各种变量名和函数名，如代表长度就用length，用number还以为是数字的意思。。。可以看一下google编程规范~

引用 5 楼 lucczyn 的回复:谢谢3楼的u010030181 ，可以这么热心的帮助我，但是我把程序运行了一下，发现有错误 这一行printf("%d\t", array[i]);  错误说是“ error C2109: 下标要求数组或指针类型” 这个错误时你自己的程序中的吧？我在C-Free5和VC6均测试过，除了如果是.c程序要把for循环中的声明移到外面外（C++是可以直接在for里面声明定义的），你把自己写的程序贴上来就知道什么问题了……

int sixten_two(char change[10],int number) 增加输出参数 int sixten_two(char change[10],int number, char *pOut, int &iOut )

个人觉得..if(change[i]<='9'&&change[i]>='0')    b[i]=change[i]-'0';   else if(change[i]<='F'&&change[i]>='A')   b[i]=change[i]-55;这样就可以了  如果  for(i=j-1;i>=0;i--)   {    printf("%d",p[number]);    return(p[i]);   } 在这个循环里面有一个return 则，for只执行一次，如果想要返回数组，p数组只是个局部数组，这个是行不通滴~~你可以搜一下  数组返回 ，希望对你有用


Question: 华为面试~~

引用 3 楼 jiangbianxiumu 的回复:[quote=引用 2 楼 jiangbianxiumu 的回复:] 没这么复杂吧，直接模拟小时候学的除法的过程不就行了吗？ void fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; } 返回值改成int ； int fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; }[/quote]  嗯 是的 你的更简洁~~~

看4楼。。。

4楼的方法最简单直观。++

vs2010  num = (*input - '0') * 10 + (*++input - '0'); 我这里是先计算(*++input - '0')，然后才计算(*input - '0') * 10

引用 1 楼 nickwu1220 的回复:函数错了。 你输入721试试。

引用 3 楼 jiangbianxiumu 的回复:[quote=引用 2 楼 jiangbianxiumu 的回复:] 没这么复杂吧，直接模拟小时候学的除法的过程不就行了吗？ void fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; } 返回值改成int ； int fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; }[/quote]  看错了，对7取余数。 int fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%7;       }       if(tmp==0) return 1;       else return 0; }

引用 2 楼 jiangbianxiumu 的回复:没这么复杂吧，直接模拟小时候学的除法的过程不就行了吗？ void fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; } 返回值改成int ； int fun(char *a){       int tmp=0;       while(*a!='\0'){              tmp=(tmp*10+(*a++)-'0')%10;       }       if(tmp==0) return 1;       else return 0; }

函数错了。 你输入721试试。


Question: 求助！c语言二位动态数组读取图像

这里补充一下，虽然&pointdatabuf[0][0]与pointdatabuf[0]造价，但如果pointdatabuf只是一级指针的话，pointdatabuf[0][0]是非法的，而pointdatabuf[0]是合法的。如果pointdatabuf是二级及以上的指针，那么这两个都是合法的。

引用 6 楼 lei___lei 的回复:引用 3 楼 hhhhhhhhhhkkkkkkkkkk 的回复:你这样申请出来的内存每一行可能是不连续的，所以你在写的时候要一行一行的写，否则就是在写入了第一行，其他行都没有写。要不然你就用一维数组，然后申请sizof(char)*宽*高 的空间，写入时就可以一次全写入了。我试过按你的说法，直接使用一位数组，确实可以正确读取。可本意还是想通过分配好二位数组空间，以后就直接按pointdatabuf[i][j]的形式直接对图像的每一个像素点进行操作！还有一个问题啊：我测试过地址pointdatabuf与&pointdatabuf[0]的值是相同的，这是合理的。但是下面在分配完pointdatabuf[i]的内存空间后，我又测试了&pointdatabuf[0][0],按分析这个值应该和上面两个值相同才对，但测试结果显示不同，不知这是什么问题，能否给解释一下。非常感谢！ 晕，你那个pointdatabuf是这个内存区域的首地址，也就是pointdatabuf[0]处的地址。你对pointdatabuf[0]取地址(就是那个&号)，得到的地址就是pointdatabuf+0=pointdatabuf。所以pointdatabuf与&pointdatabuf[0]是等价的。相似的，pointdatabuf+n与&pointdatabuf[n]是等价的。 &pointdatabuf[0][0]=(pointdatabuf+0)[0]=pointdatabuf[0]。可以看出这个是地址上的值了，不再是地址了，所以与pointdatabuf、&pointdatabuf[0]不等价啊，从推导来看他是和pointdatabuf[0]等价。 另外，如果你非得用二维数组来读取，那么你把 fread(pointdatabuf,1,picturedatalength,fp_in); //将图像数据区数据暂存入缓冲区pointdatabuf中 改成  for(i=0;i<图像高;i++)    fread(pointdatabuf[i],1,图像宽,fp_in);  这个是伪代码，你把高和宽改一下就行了。

引用 2 楼 xpdavis 的回复:pointdatabuf=(char**)malloc( sizeof(char*)*bmpinfoheader.biHeight); 他这个是先按照高度来分配第一维，这样并没有什么问题的  非常感谢能够回答哈，但后来我又测试过，得到地址pointdatabuf与&pointdatabuf[0]的值是相同的，这是合理的。但是下面在分配完pointdatabuf[i]的内存空间后，我又测试了&pointdatabuf[0][0],按分析这个值应该和上面两个值相同才对，但测试结果显示不同，不知这是什么问题，能否给解释一下。非常感谢！

pointdatabuf的大小应该是  一个像素占的字节数*图像长度*图像宽度   sizeof(char*)你这个是指针占的字节数，和像素没有什么关系。  你还是找个现成的读写bmp的c 代码来看吧，csdn上面很多。

而且bmp的格式有点限制，你最好去网上看一下。


Question: 《c primer plus》里面第11章的课后练习题第2题，自己编的感觉没错啊，为什么没有效果！！

引用 5 楼 xiaodongnannan 的回复:按照你的题目要求，应该要先判断i<n吧 while(i<n||isspace(*(str+i-1))==NULL)  {         *(str+i)=getchar();         i++;   }不是~~关系运算符也用错了~~但是还是上面的大侠说的对~~

引用 3 楼 user-2 的回复:[quote=引用 2 楼 pokerLee 的回复:] [quote=引用 1 楼 user-2 的回复:] 你判断的时候，i已经不是输入的那个位置了， 已经到下一个位置了。能详细些么？*str是首地址啊，i也从0开始的啊！求指点~~[/quote]          *(str+i)=getchar();         i++; ------ 你放在 第i个位置， 但是判断的时候，却去判断第i+1个[/quote]恩~~谢谢~~的确是~~我想再请教一下~~当第i-1为空白符的前一个字符时为什么没有判断出第i个是空白符~~求指教~~

引用 2 楼 pokerLee 的回复:[quote=引用 1 楼 user-2 的回复:] 你判断的时候，i已经不是输入的那个位置了， 已经到下一个位置了。能详细些么？*str是首地址啊，i也从0开始的啊！求指点~~[/quote]          *(str+i)=getchar();         i++; ------ 你放在 第i个位置， 但是判断的时候，却去判断第i+1个

引用 1 楼 user-2 的回复:你判断的时候，i已经不是输入的那个位置了， 已经到下一个位置了。能详细些么？*str是首地址啊，i也从0开始的啊！求指点~~

你判断的时候，i已经不是输入的那个位置了， 已经到下一个位置了。


Question: 求助！用C语言定义动态二维数组读取图像问题

引用 1 楼 user-1 的回复:这个会爆掉吧， 而且这个貌似叫 二维指针吧 你为每一行 分配一个内存，你得每行按行 分别读一次啊。  为什么不一次 分配所有行的内存呢可以这样做的！只不过是问题有点特殊了，地址空间不连续，导致后面的数据读取出错！感谢答疑，分已给！！！

引用 1 楼 user-1 的回复:这个会爆掉吧， 而且这个貌似叫 二维指针吧 你为每一行 分配一个内存，你得每行按行 分别读一次啊。  为什么不一次 分配所有行的内存呢 没有理解你的解释啊！我的本意是，这样分配的话，可以方便下面的处理直接按二维数组a[i][j]的形式直接对各像素点进行操作


Question: 程序设计

仅供参考： #include"stdafx.h" #include<string> #include<iostream> using namespace std;  typedef int Status; #define ERROR 0 #define OK 1  typedef int DataType; //定义结点 template <typename DataType> struct linkNode { 	DataType data; 	struct linkNode *next; };  #define MyLinkNode struct linkNode<DataType> #define MyPLinkNode struct linkNode<DataType>*  //定义头结点 template <typename DataType> struct linkList { 	MyPLinkNode head; 	int length; };  #define MyLinkList struct linkList<DataType> #define MyPLinkList struct linkList<DataType>*  //线性表初始化 template <typename DataType> void InitList(MyLinkList &L) { 	L.length=0; 	L.head=NULL; 	cout<<"Successful Initialization!!!"<<endl; }  //线性表插入 template <typename DataType> Status ListInsert(MyLinkList &L,int i,DataType e) { 	if(i>L.length+1||i<0) 	{ 		cout<<"the postion is error!!!"<<endl; 		return ERROR; 	} 	MyPLinkNode p=new MyLinkNode; 	if(!p) 		return ERROR; 	p->next=NULL; 	p->data=e; 	//表头插入 	if(i==1) 	{ 		p->next=L.head; 		L.head=p; 	} 	//不在表头插入 	else 	{ 		MyPLinkNode q=L.head; 		for(int k=1;k<i-1;k++)//找到i-1位置 			q=q->next; 		p=q->next; 		q->next=p; 	} 	L.length++; 	return OK; }  //在表头位置插入 template <typename DataType> Status InsertFirst(MyLinkList &L,DataType e) { 	return ListInsert(L,1,e); }  //在表尾位置插入 template <typename DataType> Status InsertLast(MyLinkList &L,DataType e) { 	return ListInsert(L,L.length+1,e); }  //删除链表 template <typename DataType> Status ClearList(MyLinkList &L) { 	MyPLinkNode p=L.head; 	while(p) 	{ 		L.head=p->next; 		delete p; 		p=L.head; 	} 	return OK; }  //返回值e的结点位置 template <typename DataType> Status LocateElem(MyLinkList L,DataType e,bool(*compare)(DataType,DataType)) { 	MyPLinkNode p=L.head; 	int k=1; 	while(p) 	{ 		if((*compare)(p->data,e)) 			return k; 		else  			{ 				k++; 				p=p->next; 		} 	} 	return 0; }  //删除表中的某个结点 template <typename DataType> Status ListDelete(MyLinkList &L,int i,DataType &e) { 	if(i>L.length+1||i<0) 	{ 		return ERROR; 		cout<<"the postion is error!!!"<<endl; 	} 	//删除表头元素 	if(i==1) 	{ 		MyPLinkNode p=L.head; 		L.head=p->next; 		e=p->data; 		delete p; 	} 	else 	{ 		MyPLinkNode p=L.head; 		for(int k=0;k<i-1;k++) 			p=p->next; 		MyPLinkNode q=p->next; 		p->next=q->next; 		//上面两个语句也可以用p->next=p->next->next;代替 		delete q; 	} 	return OK; }  //遍历链表 template <typename DataType> void ListTraverse(MyLinkList L) { 	MyPLinkNode p=L.head; 	while(p) 	{ 		cout<<p->data<<endl; 		p=p->next; 	} }  //返回第i个位置的元素 template <typename DataType> Status GetElem(MyLinkList L,int i,DataType &e) { 	if(i<0||i>L.length+1) 	{ 		return ERROR; 		cout<<"the postion is error!!!"<<endl; 	} 	MyPLinkNode p=L.head; 	for(int k=1;k<i;k++) 		p=p->next; 	e=p->data; 	return OK; }  //返回链表的长度 template <typename DataType> Status ListLength(MyLinkList L) { 	return L.length; }

引用 1 楼 zxhuser-4 的回复:尼玛，最讨厌图片了。。。 人家用QQ截图再贴上来，是不是比复制代码贴到高亮代码区里省事？

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

这个一看就像二级考试题啊，删了删了

尼玛，最讨厌图片了。。。


Question: 编译不通过.VC6.求大神

函数名max和函数中变量max的问题，参数上，ab是可以这样定义的

引用 14 楼 u014485390 的回复:感觉a，b不算重复吧，形参实参怎能算重复？就是max函数里面又有max变量，这里错了吧 max这样定义可以的，只是这样风格不好，但是a b这样定义是不行的 早先C函数是这么定义的： int max(a, b) int a, b { ... } 后来都改成现在这样子 int max(int a, int b) { ... } 既然这里已经定义a b，那么函数体（花括号{}里面就不能再定义a b了）   引用 15 楼 u014485390 的回复:看来我也需要学习了 “也”字不妥，每个人都需要不断地学习，谢谢！

看来我也需要学习了

把MAX里的a,b去掉就好了

去掉MAX函数里面定义的a和b就行了，关于变量命名的，楼主要自己注意了    你可以把函数名大写啊，或者里面max换成maxab，这样看名字就大概知道这个变量是干什么的

去掉a、b，并且还要把那个void换成int。

楼上已给正确解释，去掉函数体里面的a,b。否则从main函数传递过来的参数值 没有作用

在int max（int，int）中重定义a b

max函数内定义的a，b删掉就好了，LZ还得多加联系啊~

回楼上，表这么激动，初学者嘛。不过这个可以这么用，编译没问题

第一,     函数定义了a,b.函数中又定义一次a,b,自然重复了 第二,    函数名用max,函数中又定义一个变量名叫max   能不能用我没时间试.但我想不通的是,26个字母能组合数不清的串    你丫非要这么2B吗.不2B就彰显不出你的弱智吗?不2B你会死吗?

在max函数中又重复定义了变量a和b,删除就可以了

函数体内又定义了ab #include<stdio.h> #include<stdlib.h> int max(int a,int b) { int max; if(a>=b) max=a; else max=b; return (max); } void main() { int a,b,c; scanf("%d,%d",&a,&b); c=max(a,b); printf("%d",c); }

二楼。。。。

引用 4 楼 xpdavis 的回复:回楼上，表这么激动，初学者嘛。不过这个可以这么用，编译没问题  我知道他是初学,但你看见了,我是分开来回答的  因为初学所犯的问题,耐心回答是没关系的 可是,人的品行所犯的问题,不骂是改不过来的  因为同名可用就连最起码的避讳心态都没有的人 为人好不到那里去的 平时就是啥都无所谓的 也是不配学技术的 他们会用他们的作死态度来耽误你的时间.

楼主这样定义变量时没有想过一样了会怎么样吗？最起码不该正常运行吧！函数内部定义的同名变量把传进函数的参数覆盖了 楼主认真看书啊！要找本好书看。


Question: error LNK2019: 无法解析的外部符号 _

链接不到相关的库文件

二楼。。。。

引用 1 楼 user-4 的回复:设置库目录和库文件  support

设置库目录和库文件


Question: 新人求解释。。。

差别在有无返回值。

函数返回值问题！看实际需求定义那种方式 多用下面，可以通过返回值确认函数是否调用成功

二楼或三楼。。。

第一个函数结束的时候不写return或者return; 第二个函数结束的时候需要 return一个int类型的值，比如return 0;

第二个函数需要给出明确的返回值，第一个不需要


Question: 小白求问，从文件中读取数据并运算，按值传递或按引用传递（c语言）

计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解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

感觉LZ把printf当成scanf的样子。从文件获取数字的方法有很多，可以多尝试下

void swap(int *c, int *d) { int temp; printf("%d\t%d\n",*c,*d); temp=*c; *c=*d; *d=temp; printf("%d\t%d\n",*c,*d); }


Question: win7驱动的一个小问题

感谢您的热心解答，我之前用WDK中的devcon工具安装驱动，解决了上述问题。

用调试器(OD,WINDBG等)调试服务程序 To debug the initialization code of a service application, the debugger must be attached when the service is started. This is accomplished by creating a registry key:  HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\ProgramName   The ProgramName is the image file for the service application you are debugging. Do not specify a path. For example, the ProgramName might look like MyService.exe.  Under this key create a string data value called Debugger. The value of this string should be set to the full path of the debugger that will be used. For example,  c:\Debuggers\windbg.exe    In addition to setting this registry key, the service application must be marked as "interactive". This allows your service to interact with the desktop, and allows the debugger window to appear on your desktop.  This again requires modifying a registry key: you must bitwise-or the type entry for your service with 0x100 (this is the value for SERVICE_INTERACTIVE_PROCESS according to Winnt.h). The exact location and name of this registry entry varies. For example:  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MyServiceKey   Finally, you need to adjust the service application timeout. Otherwise, the service application will kill the debugger within 20 seconds after starting. Adjusting the timeout involves setting an entry in the following registry key:  HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control   Under this key, create a DWORD data value called ServicesPipeTimeout. Set this entry to the amount of time in milliseconds that you want the service to wait before timing out. For example, 60,000 is one minute, while 86,400,000 is 24 hours.  设置ServicesPipeTimeout后需要重启系统才生效  Now, when the service is started, the debugger will also start. When the debugger starts, it will stop at the initial process breakpoint, before the service has begun running. This allows you to set breakpoints or otherwise configure your debugging session to let you monitor the startup of your service. Another option is to place calls to the DebugBreak function in your service from the point at which you would like to break into the debugger. (For more information, see DebugBreak in the Platform SDK documentation.)  If your service is running with other services in a Service Host Process, you may need to isolate the service into its own Service Host Process.


Question: 完全没有思路，恳请高手指点。（C语言）

对于全球的人在输入时可能会带上音节。举例子， Zürich转化成Zurich，Köln转化成Koln。  做个字符串替换不行吗？当然你得知道都哪些会带上音节？

最主要是不清楚如何把那些欧洲语言上带音节的转化成英文并且识别 恳请指点，感激不尽！ 引用 6 楼 zhao4zhong1 的回复:C:\《算法精解C语言实现》例子代码\examples_pc\include\geodist.h /***************************************************************************** *                                                                            * *  ------------------------------- geodist.h ------------------------------  * *                                                                            * *****************************************************************************/  #ifndef GEODIST_H #define GEODIST_H  /***************************************************************************** *                                                                            * *  Define the radius of the earth in nautical miles.                         * *                                                                            * *****************************************************************************/  #define            EARTH_RADIUS          3440.065  /***************************************************************************** *                                                                            * *  --------------------------- Public Interface ---------------------------  * *                                                                            * *****************************************************************************/  int geodist(double lat1, double lon1, double lat2, double lon2, double *d);  #endif

计算距离的我知道的，主要是前面的不懂呢。恳请指点啊。 引用 6 楼 zhao4zhong1 的回复:C:\《算法精解C语言实现》例子代码\examples_pc\include\geodist.h /***************************************************************************** *                                                                            * *  ------------------------------- geodist.h ------------------------------  * *                                                                            * *****************************************************************************/  #ifndef GEODIST_H #define GEODIST_H  /***************************************************************************** *                                                                            * *  Define the radius of the earth in nautical miles.                         * *                                                                            * *****************************************************************************/  #define            EARTH_RADIUS          3440.065  /***************************************************************************** *                                                                            * *  --------------------------- Public Interface ---------------------------  * *                                                                            * *****************************************************************************/  int geodist(double lat1, double lon1, double lat2, double lon2, double *d);  #endif

C:\《算法精解C语言实现》例子代码\examples_pc\include\list.h /***************************************************************************** *                                                                            * *  -------------------------------- list.h --------------------------------  * *                                                                            * *****************************************************************************/  #ifndef LIST_H #define LIST_H  #include <stdlib.h>  /***************************************************************************** *                                                                            * *  Define a structure for linked list elements.                              * *                                                                            * *****************************************************************************/  typedef struct ListElmt_ {  void               *data; struct ListElmt_   *next;  } ListElmt;  /***************************************************************************** *                                                                            * *  Define a structure for linked lists.                                      * *                                                                            * *****************************************************************************/  typedef struct List_ {  int                size;  int                (*match)(const void *key1, const void *key2); void               (*destroy)(void *data);  ListElmt           *head; ListElmt           *tail;  } List;  /***************************************************************************** *                                                                            * *  --------------------------- Public Interface ---------------------------  * *                                                                            * *****************************************************************************/  void list_init(List *list, void (*destroy)(void *data));  void list_destroy(List *list);  int list_ins_next(List *list, ListElmt *element, const void *data);  int list_rem_next(List *list, ListElmt *element, void **data);  #define list_size(list) ((list)->size)  #define list_head(list) ((list)->head)  #define list_tail(list) ((list)->tail)  #define list_is_head(list, element) ((element) == (list)->head ? 1 : 0)  #define list_is_tail(element) ((element)->next == NULL ? 1 : 0)  #define list_data(element) ((element)->data)  #define list_next(element) ((element)->next)  #endif

C:\《算法精解C语言实现》例子代码\examples_pc\source\geodist.c /***************************************************************************** *                                                                            * *  ------------------------------- geodist.c ------------------------------  * *                                                                            * *****************************************************************************/  #include "geodist.h" #include "geometry.h"  /***************************************************************************** *                                                                            * *  -------------------------------- geodist -------------------------------  * *                                                                            * *****************************************************************************/  int geodist(double lat1, double lon1, double lat2, double lon2, double *d) {  SPoint             p1,                    p2;  /***************************************************************************** *                                                                            * *  Validate the coordinates.                                                 * *                                                                            * *****************************************************************************/  if (lat1 <  -90.0 || lat1 >  90.0 || lat2 <  -90.0 || lat2 >  90.0)    return -1;  if (lon1 < -180.0 || lon1 > 180.0 || lon2 < -180.0 || lon2 > 180.0)    return -1;  /***************************************************************************** *                                                                            * *  Convert each latitude and longitude to spherical coordinates in radians   * *  using the earth's radius for rho.                                         * *                                                                            * *****************************************************************************/  p1.rho = EARTH_RADIUS; p1.theta = -1.0 * DEGTORAD(lon1); p1.phi = (DEGTORAD(-1.0 * lat1)) + DEGTORAD(90.0);  p2.rho = EARTH_RADIUS; p2.theta = -1.0 * DEGTORAD(lon2); p2.phi = (DEGTORAD(-1.0 * lat2)) + DEGTORAD(90.0);  /***************************************************************************** *                                                                            * *  Compute the distance between the points.                                  * *                                                                            * *****************************************************************************/  arclen(p1, p2, d);  return 0;  }  C:\《算法精解C语言实现》例子代码\examples_pc\source\arclen.c /***************************************************************************** *                                                                            * *  ------------------------------- arclen.c -------------------------------  * *                                                                            * *****************************************************************************/  #include <math.h>  #include "geometry.h"  /***************************************************************************** *                                                                            * *  -------------------------------- arclen --------------------------------  * *                                                                            * *****************************************************************************/  void arclen(SPoint p1, SPoint p2, double *length) {  Point              p1_rct,                    p2_rct;  double             alpha,                    dot;  /***************************************************************************** *                                                                            * *  Convert the spherical coordinates to rectilinear coordinates.             * *                                                                            * *****************************************************************************/  p1_rct.x = p1.rho * sin(p1.phi) * cos(p1.theta); p1_rct.y = p1.rho * sin(p1.phi) * sin(p1.theta); p1_rct.z = p1.rho * cos(p1.phi);  p2_rct.x = p2.rho * sin(p2.phi) * cos(p2.theta); p2_rct.y = p2.rho * sin(p2.phi) * sin(p2.theta); p2_rct.z = p2.rho * cos(p2.phi);  /***************************************************************************** *                                                                            * *  Get the angle between the line segments from the origin to each point.    * *                                                                            * *****************************************************************************/  dot = (p1_rct.x * p2_rct.x) + (p1_rct.y * p2_rct.y) + (p1_rct.z * p2_rct.z); alpha = acos(dot / pow(p1.rho, 2.0));  /***************************************************************************** *                                                                            * *  Compute the length of the arc along the spherical surface.                * *                                                                            * *****************************************************************************/  *length = alpha * p1.rho;  return;  }  C:\《算法精解C语言实现》例子代码\examples_pc\include\geometry.h /***************************************************************************** *                                                                            * *  ------------------------------ geometry.h ------------------------------  * *                                                                            * *****************************************************************************/  #ifndef GEOMETRY_H #define GEOMETRY_H  #include "list.h"  /***************************************************************************** *                                                                            * *  Define an approximation for Pi.                                           * *                                                                            * *****************************************************************************/  #ifndef PI #define            PI                    3.14159 #endif  /***************************************************************************** *                                                                            * *  Define macros for comparisons.                                            * *                                                                            * *****************************************************************************/  #define            MIN(x, y)             (((x) < (y)) ? (x) : (y)) #define            MAX(x, y)             (((x) > (y)) ? (x) : (y))  /***************************************************************************** *                                                                            * *  Define macros for converting between degrees and radians.                 * *                                                                            * *****************************************************************************/  #define            DEGTORAD(deg)         (((deg) * 2.0 * PI) / 360.0) #define            RADTODEG(rad)         (((rad) * 360.0) / (2.0 * PI))  /***************************************************************************** *                                                                            * *  Define a structure for points in rectilinear coordinates.                 * *                                                                            * *****************************************************************************/  typedef struct Point_ {  double             x,                    y,                    z;  } Point;  /***************************************************************************** *                                                                            * *  Define a structure for points in spherical coordinates.                   * *                                                                            * *****************************************************************************/  typedef struct SPoint_ {  double             rho,                    theta,                    phi;  } SPoint;  /***************************************************************************** *                                                                            * *  --------------------------- Public Interface ---------------------------  * *                                                                            * *****************************************************************************/  int lint(Point p1, Point p2, Point p3, Point p4);  int cvxhull(const List *P, List *polygon);  void arclen(SPoint p1, SPoint p2, double *length);  #endif

恳请大神指点一二，小弟感激不尽！！！

{"Newcastle-on-Tyne,England",54.97,-1.62},           {"Nome,AK,USA",64.42,-165.5},           {"Oakland,CA,USA",37.8,-122.27},           {"Odessa,Ukraine",46.45,30.8},           {"Oklahoma City,OK,USA",35.43,-97.47},           {"Omaha,NE,USA",41.25,-95.93},           {"Osaka,Japan",34.53,135.5},           {"Oslo,Norway",59.95,10.7},           {"Ottawa,ON,Canada",45.4,-75.72},           {"Panama City,Panama",8.97,-79.53},           {"Paramaribo,Suriname",5.75,-55.25},           {"Paris,France",48.8,2.33},           {"Perth,Australia",-31.95,115.87},           {"Philadelphia,PA,USA",39.95,-75.17},           {"Phoenix,AZ,USA",33.48,-112.07},           {"Pierre,SD,USA",44.37,-100.35},           {"Pittsburgh,PA,USA",40.45,-79.95},           {"Plymouth,England",50.42,-4.08},           {"Port Moresby,Papua New Guinea",-9.42,147.13},           {"Portland,ME,USA",43.67,-70.25},           {"Portland,OR,USA",45.52,-122.68},           {"Prague,Czech Republic",50.08,14.43},           {"Providence,RI,USA",41.83,-71.4},           {"Quebec,QC,Canada",46.82,-71.18},           {"Raleigh,NC,USA",35.77,-78.65},           {"Rangoon,Myanmar",16.83,96.0},           {"Reno,NV,USA",39.5,-119.82},           {"Reykjavik,Iceland",64.07,-21.97},           {"Richfield,UT,USA",38.77,-112.08},           {"Richmond,VA,USA",37.55,-77.48},           {"Rio de Janeiro,Brazil",-22.95,-43.2},           {"Roanoke,VA,USA",37.28,-79.95},           {"Rome,Italy",41.9,12.45},           {"Sacramento,CA,USA",38.58,-121.5},           {"Salt Lake City,UT,USA",40.77,-111.9},           {"Salvador,Brazil",-12.93,-38.45},           {"San Antonio,TX,USA",29.38,-98.55},           {"San Diego,CA,USA",32.7,-117.17},           {"San Francisco,CA,USA",37.78,-122.43},           {"San Jose,CA,USA",37.33,-121.88},           {"San Juan,PR,USA",18.5,-66.17},           {"Santa Fe,NM,USA",35.68,-105.95},           {"Santiago,Chile",-33.47,-70.75},           {"Savannah,GA,USA",32.08,-81.08},           {"Seattle,WA,USA",47.62,-122.33},           {"Shanghai,China",31.17,121.47},           {"Shreveport,LA,USA",32.47,-93.7},           {"Singapore,Singapore",1.23,103.92},           {"Sioux Falls,SD,USA",43.55,-96.73},           {"Sitka,AK,USA",57.17,-135.25},           {"Sofia,Bulgaria",42.67,23.33},           {"Spokane,WA,USA",47.67,-117.43},           {"Springfield,IL,USA",39.8,-89.63},           {"Springfield,MA,USA",42.1,-72.57},           {"Springfield,MO,USA",37.22,-93.28},           {"St John's,NL,Canada",45.3,-66.17},           {"St Louis,MO,USA",38.58,-90.2},           {"St. Petersburg,Russia",59.93,30.3},           {"Stockholm,Sweden",59.28,18.05},           {"Sydney,Australia",-34.0,151.0},           {"Syracuse,NY,USA",43.03,-76.13},           {"Sao Paulo,Brazil",-23.52,-46.52},           {"Tampa,FL,USA",27.95,-82.45},           {"Tananarive,Madagascar",-18.83,47.55},           {"Teheran,Iran",35.75,51.75},           {"Tokyo,Japan",35.67,139.75},           {"Toledo,OH,USA",41.65,-83.55},           {"Toronto,ON,Canada",43.67,-79.4},           {"Tripoli,Libya",32.95,13.2},           {"Tulsa,OK,USA",36.15,-95.98},           {"Vancouver,BC,Canada",49.22,-123.1},           {"Venice,Italy",45.43,12.33},           {"Veracruz,Mexico",19.17,-96.17},           {"Victoria,BC,Canada",48.42,-123.35},           {"Vienna,Austria",48.23,16.33},           {"Virginia Beach,VA,USA",36.85,-75.97},           {"Vladivostok,Russia",43.17,132.0},           {"Warsaw,Poland",52.23,21.0},           {"Washington,DC,USA",38.88,-77.03},           {"Wellington,New Zealand",-41.28,174.78},           {"Wichita,KS,USA",37.72,-97.28},           {"Wilmington,NC,USA",34.23,-77.95},           {"Winnipeg,MB,Canada",49.9,-97.12},           {"Zurich,Switzerland",47.35,8.52},           {"",999,999}};

数据库如下：  #define MAX_CITY_LEN   35  typedef struct {                  char  name[MAX_CITY_LEN];                 float latitude;                 float longitude;                } PLACE_T;  PLACE_T places[] =          {{"Aberdeen,Scotland",57.15,-2.15},           {"Adelaide,Australia",-34.92,138.6},           {"Albany,NY,USA",42.67,-73.75},           {"Albuquerque,NM,USA",35.08,-106.65},           {"Algiers,Algeria",36.83,3.0},           {"Amarillo,TX,USA",35.18,-101.83},           {"Amsterdam,Netherlands",52.37,4.88},           {"Anchorage,AK,USA",61.22,-149.9},           {"Ankara,Turkey",39.92,32.92},           {"Asuncion,Paraguay",-25.25,-57.67},           {"Athens,Greece",37.97,23.72},           {"Atlanta,GA,USA",33.75,-84.38},           {"Auckland,New Zealand",-36.87,174.75},           {"Austin,TX,USA",30.27,-97.73},           {"Baker,OR,USA",44.78,-117.83},           {"Baltimore,MD,USA",39.3,-76.63},           {"Bangkok,Thailand",13.75,100.5},           {"Bangor,ME,USA",44.8,-68.78},           {"Barcelona,Spain",41.38,2.15},           {"Beijing,China",39.92,116.42},           {"Belfast,Northern Ireland",54.62,-5.93},           {"Belgrade,Serbia",44.87,20.53},           {"Belem,Brazil",-1.47,-48.48},           {"Berlin,Germany",52.5,13.42},           {"Birmingham,AL,USA",33.5,-86.83},           {"Birmingham,England",52.42,-1.92},           {"Bismarck,ND,USA",46.8,-100.78},           {"Bogota,Colombia",4.53,-74.25},           {"Boise,ID,USA",43.6,-116.22},           {"Bombay,India",19.0,72.8},           {"Bordeaux,France",44.83,-0.52},           {"Boston,MA,USA",42.35,-71.08},           {"Bremen,Germany",53.08,8.82},           {"Brisbane,Australia",-27.48,153.13},           {"Bristol,England",51.47,-2.58},           {"Brussels,Belgium",50.87,4.37},           {"Bucharest,Romania",44.42,26.12},           {"Budapest,Hungary",47.5,19.08},           {"Buenos Aires,Argentina",-34.58,-58.37},           {"Buffalo,NY,USA",42.92,-78.83},           {"Cairo,Egypt",30.03,31.35},           {"Calcutta,India",22.57,88.4},           {"Calgary,AB,Canada",51.02,-114.02},           {"Canton,China",23.12,113.25},           {"Cape Town,South Africa",-33.92,18.37},           {"Caracas,Venezuela",10.47,-67.03},           {"Carlsbad,NM,USA",32.43,-104.25},           {"Cayenne,French Guiana",4.82,-52.3},           {"Charleston,SC,USA",32.78,-79.93},           {"Charleston,WV,USA",38.35,-81.63},           {"Charlotte,NC,USA",35.23,-80.83},           {"Cheyenne,WY,USA",41.15,-104.87},           {"Chicago,IL,USA",41.83,-87.62},           {"Chihuahua,Mexico",28.62,-106.08},           {"Chongqing,China",29.77,106.57},           {"Cincinnati,OH,USA",39.13,-84.5},           {"Cleveland,OH,USA",41.47,-81.62},           {"Columbia,SC,USA",34.0,-81.03},           {"Columbus,OH,USA",40.0,-83.02},           {"Copenhagen,Denmark",55.67,12.57},           {"Cordoba,Argentina",-31.47,-64.17},           {"Dakar,Senegal",14.67,-17.47},           {"Dallas,TX,USA",32.77,-96.77},           {"Darwin,Australia",-12.47,130.85},           {"Denver,CO,USA",39.75,-105.0},           {"Des Moines,IA,USA",41.58,-93.62},           {"Detroit,MI,USA",42.33,-83.05},           {"Djibouti,Djibouti",11.5,43.05},           {"Dublin,Ireland",53.33,-6.25},           {"Dubuque,IA,USA",42.52,-90.67},           {"Duluth,MN,USA",46.82,-92.08},           {"Durban,South Africa",-29.88,30.88},           {"Eastport,ME,USA",44.9,-67.0},           {"Edinburgh,Scotland",55.92,-3.17},           {"Edmonton,AB,Canada",53.57,-113.47},           {"El Centro,CA,USA",32.63,-115.55},           {"El Paso,TX,USA",31.77,-106.48},           {"Eugene,OR,USA",44.05,-123.08},           {"Fargo,ND,USA",46.87,-96.8},           {"Flagstaff,AZ,USA",35.22,-111.68},           {"Fort Worth,TX,USA",32.72,-97.32},           {"Frankfurt,Germany",50.12,8.68},           {"Fresno,CA,USA",36.73,-119.8},           {"Georgetown,Guyana",6.75,-58.25},           {"Glasgow,Scotland",55.83,-4.25},           {"Grand Junction,CO,USA",39.08,-108.55},           {"Grand Rapids,MI,USA",42.97,-85.67},           {"Guatemala City,Guatemala",14.62,-90.52},           {"Guayaquil,Ecuador",-2.17,-79.93},           {"Hamburg,Germany",53.55,10.03},           {"Hammerfest,Norway",70.63,23.63},           {"Havana,Cuba",23.13,-82.38},           {"Havre,MT,USA",48.55,-109.72},           {"Helena,MT,USA",46.58,-112.03},           {"Helsinki,Finland",60.17,25.0},           {"Hobart,Tasmania",-42.87,147.32},           {"Hong Kong,China",22.33,114.18},           {"Honolulu,HI,USA",21.3,-157.83},           {"Hot Springs,AR,USA",34.52,-93.05},           {"Houston,TX,USA",29.75,-95.35},           {"Idaho Falls,ID,USA",43.5,-112.02},           {"Indianapolis,IN,USA",39.77,-86.17},           {"Iquique,Chile",-20.17,-70.12},           {"Irkutsk,Russia",52.5,104.33},           {"Jackson,MS,USA",32.33,-90.2},           {"Jacksonville,FL,USA",30.37,-81.67},           {"Jakarta,Indonesia",-6.27,106.8},           {"Johannesburg,South Africa",-26.2,28.07},           {"Juneau,AK,USA",58.3,-134.4},           {"Kansas City,MO,USA",39.1,-94.58},           {"Key West,FL,USA",24.55,-81.8},           {"Kingston,Jamaica",17.98,-76.82},           {"Kingston,ON,Canada",44.25,-76.5},           {"Kinshasa,Congo",-4.3,15.28},           {"Klamath Falls,OR,USA",42.17,-121.73},           {"Knoxville,TN,USA",35.95,-83.93},           {"Kuala Lumpur,Malaysia",3.13,101.7},           {"La Paz,Bolivia",-16.45,-68.37},           {"Las Vegas,NV,USA",36.17,-115.2},           {"Leeds,England",53.75,-1.5},           {"Lewiston,ID,USA",46.4,-117.03},           {"Lima,Peru",-12.0,-77.03},           {"Lincoln,NE,USA",40.83,-96.67},           {"Lisbon,Portugal",38.73,-9.15},           {"Liverpool,England",53.42,-3.0},           {"London,England",51.53,-0.08},           {"London,ON,Canada",43.03,-81.57},           {"Long Beach,CA,USA",33.77,-118.18},           {"Los Angeles,CA,USA",34.05,-118.25},           {"Louisville,KY,USA",38.25,-85.77},           {"Lyons,France",45.75,4.83},           {"Madrid,Spain",40.43,-3.7},           {"Manchester,England",53.5,-2.25},           {"Manchester,NH,USA",43.0,-71.5},           {"Manila,Philippines",14.58,120.95},           {"Marseilles,France",43.33,5.33},           {"Mazatlan,Mexico",23.2,-106.42},           {"Mecca,Saudi Arabia",21.48,39.75},           {"Melbourne,Australia",-37.78,144.97},           {"Memphis,TN,USA",35.15,-90.05},           {"Mexico City,Mexico",19.43,-99.12},           {"Miami,FL,USA",25.77,-80.2},           {"Milan,Italy",45.45,9.17},           {"Milwaukee,WI,USA",43.03,-87.92},           {"Minneapolis,MN,USA",44.98,-93.23},           {"Mobile,AL,USA",30.7,-88.05},           {"Montevideo,Uruguay",-34.88,-56.17},           {"Montgomery,AL,USA",32.35,-86.3},           {"Montpelier,VT,USA",44.25,-72.53},           {"Montreal,QC,Canada",45.5,-73.58},           {"Moose Jaw,SK,Canada",50.62,-105.52},           {"Moscow,Russia",55.75,37.6},           {"Munich,Germany",48.13,11.58},           {"Nagasaki,Japan",32.8,129.95},           {"Nagoya,Japan",35.12,136.93},           {"Nairobi,Kenya",-1.42,36.92},           {"Nanjing,China",32.05,118.88},           {"Naples,Italy",40.83,14.25},           {"Nashville,TN,USA",36.17,-86.78},           {"Nelson,BC,Canada",49.5,-117.28},           {"New Delhi,India",28.58,77.2},           {"New Haven,CT,USA",41.32,-72.92},           {"New Orleans,LA,USA",29.95,-90.07},           {"New York,NY,USA",40.78,-73.97},           {"Newark,NJ,USA",40.73,-74.17},


Question: 有关自定义函数的c语言程序设计问题

二楼。。。。

#include <stdio.h>  #define M 3 #define N 3  void fun(int (*p)[3], int* n) { 	int i = 0; 	int a[M*N]; 	for(i=0; i<(M*N); i++) 	{ 		a[i] = *((int *)p +i); 		printf("%d\n", a[i]);	 	} 	*n = M*N; 	 	return; } int main(void) { 	int a[M][N]={{1,2,3}, {4,5,6}, {7,8,9}}; 	int n; 	fun(a, &n); 	 	return 0; }

我没看到一位数组啊

//自定义函数fan，该函数的功能是，将M行N列的二维数组中的数据，按行的顺序依次放到一维数组中，一维数组中数据的个数存放在形参n所指的存储单元中。 //例如：若二维数组中的数据是 //33 33 33 //44 44 44 //55 55 55 //则输出33 33 33 44 44 44 55 55 55 #include <stdio.h> #define MAXM 100 #define MAXN 100 int D2[MAXM][MAXN]; int D1[MAXM*MAXN]; int M,N,y,x; void fan(int *n) {//将M行N列的二维数组D2中的数据，按行的顺序依次放到一维数组D1中，一维数组中数据的个数存放在形参n所指的存储单元中     for (y=0;y<M;y++) {         for (x=0;x<N;x++) {             D1[y*N+x]=D2[y][x];         }     }     *n=M*N; } int main() {     int i,t;      while (1) {         printf("\nInput M(1..%d) N(1..%d):",MAXM,MAXN);fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&M,&N)) {             if (1<=M && M<MAXM              && 1<=N && N<MAXN) break;         }     }     for (y=0;y<M;y++) {         for (x=0;x<N;x++) {             scanf("%d",&D2[y][x]);         }     }     fan(&t);     for (i=0;i<t;i++) printf("%d ",D1[i]);     printf("\n");     return 0; } // //Input M(1..100) N(1..100):3 3 //33 33 33 //44 44 44 //55 55 55 //33 33 33 44 44 44 55 55 55 //


Question: 数据结构！！！大问题

谢谢……这个已经解决了

1、C语言区分大小写 2、代码很多拼写错误 =================

那个头文件要是删除了就出现很多错误，一楼的前面加了//不是变成了注释了吗？不好意思，刚刚才开始学线性表，不懂的地方请各位指教

这个头文件要不要无所谓的

问题解决了？

#include "stdafx.h"  是vc建的项目自带的预处理文件，你要是没有这个文件，就把它屏了。

#include "stdafx.h" 改为 //#include "stdafx.h"


Question: 数据结构中无向图的邻接矩阵表示

楼上。。。。

无向图包含顶点集和边集， vexs存的就是顶点集 arcs是二元组，存放顶点集中各点的关系


Question: ASCII BCD BIN转码通用函数

仅供参考#include <stdio.h> #include <stdlib.h> #include <conio.h> unsigned int iv,i; unsigned char BCD[5];//定长10位BCD码 unsigned char sv[11]; void main() {     iv=123456789;//最大10位无符号正整数     //INT2BCD     sprintf(sv,"%010u",iv);     for (i=0;i<10;i+=2) {         BCD[i/2]=(sv[i]<<4)|(sv[i+1]&0x0F);     }     printf("BCD=%02x%02x%02x%02x%02x\n",BCD[0],BCD[1],BCD[2],BCD[3],BCD[4]);     //BCD2INT     for (i=0;i<10;i+=2) {         sv[i]='0'|(BCD[i/2]>>4);         sv[i+1]='0'|(BCD[i/2]&0x0F);     }     sscanf(sv,"%010u",&iv);     printf("iv=%010u\n",iv);     getch(); }


Question: 缓冲区溢出的问题，只能来这里问了

sizeof(code)==25 strlen(code)==24 要搞清楚二者的差别，因为字符串结束有个'\0' 复制的时候可以memcpy(a,code,25); 也可以strcpy(a,code) 或者 strncpy(sizeof(a),a,code)

问题应该再这里，strcpy();如果我没搞错strcpy是遇到\0才结束的，你整个a里面没有\0自然就拷贝到a的外面去了。 建议以后尽量用strncpy，除非你能确保不会越界。  顺便吐槽下你这代码看的真难受……

进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

http://security.stackexchange.com/questions/10404/why-do-i-get-cannot-find-bound-of-current-function-when-i-overwrite-the-ret-ad 这里有解释，我能力有限，看的不是很明白。

cout <<sizeof(code);  加上这句看看，你就知道code的size是25.

我不是很明白 为什么要用 0x9090 这个特殊值呢？  从你的 ebp 寄存器中的值是：0xbfffedb8 而你的 shellcode 的地址是：0xbfffed30 两个地址相差 128+8 个字节，怎么去执行 shell code ?


Question: 这是一个16进制转2进制的程序，显示有错误，请各位大神帮忙看一下

引用 3 楼 lucczyn 的回复:问题已经解决了，是我自己太粗心了，谢谢了 编译器的提示要仔细看啊，写的很清楚了

新手写成这样也就算不错了。不过有些地方可以改进一下         for(number=0;;number++)         {          if(change[number]=='\0')          break;         } 这个循环我喜欢写成这样，仅供参考： for(number=0; change[number]!='\0';number++)      ; 其实直接用 number = strlen(change); 最省事。而且变量名用length可能比number更合适。    if(change[i]<='9'&&change[i]>='1') 我一般是把先写大于号再小于号，可能是习惯问题吧。   if(change[i]>='0'&&change[i]<='9')    b[i]=change[i]-'0';  用'0'比48可读性好一些，而且也不用去查ascii码表  那个巨大的switch可以改成这样   if(change[i]>='A'&&change[i]<='F')     b[i] = change[i] - 'A' + 10;   else if(change[i]>='a'&&change[i]<='f')     b[i] = change[i] - 'a' + 10;

问题已经解决了，是我自己太粗心了，谢谢了

if(change[i]<='9'&&change[i]>='1')  应该是'0'不是'1'

void mian() 拼写错误 应该是main不是mian


Question: 苍穹建库软件

百度一下，网上应该能找资源。


Question: 这是野指针？

第一个，指针是NULL，地址都没有，咋个赋值呀

普通的对象变量比作装东西的抽屉，那么指针就是开某个抽屉的钥匙。 int *a=NULL;      // 这个只是拿出一个准备做钥匙的母版，比如只是一段金属条 你的意思是想通过这个还没成型的钥匙母版，来打开某个抽屉，换掉抽屉里的东西，这怎么可能呢？  int b;      //  一个装东西的抽屉   8     int *a=NULL;        // 同样只是一个钥匙母版，不能开任何抽屉  a=&b;                      // 这就好了，将钥匙母版做成了b抽屉的钥匙，可以打开b抽屉从而存取里边的东西了。

LZ只声明了一个指针变量，并没分配内存。

int *a = NULL; 既然指向NULL，NULL是定义的一个0地址，该地址不允许读写。  int *a = (int *)malloc(sizeof(int)); //该指针指向一个分配的地址 int *a = b; //该指针指向一个变量

围观。。。。

值传递,malloc个int变量赋值给a

int *a = (int *)calloc(sizeof(int));

引用 2 楼 user-8 的回复:第一个指针穿进去，没有地址的 为NULL 第二个是指向了有效的地址 那要怎么写，现在每次都要写一个我不想要的b

引用 1 楼 xpdavis 的回复:NULL就是0地址，不允许读写的 那怎么写好呢？怎么改变一个数字

第一个指针穿进去，没有地址的 为NULL 第二个是指向了有效的地址

NULL就是0地址，不允许读写的


Question: 结构体里的string字符串赋值问题

或者 char buf[1024]; scanf("%s", buf); employ[i].id = buf;

引用 3 楼 xpdavis 的回复:cin>>employ[i].id;  试了，这样不行

cin>>employ[i].id;

引用 1 楼 xpdavis 的回复:%s格式只能接受char *指针  结构体里的字符串怎么读终端呢？用cin也不行

%s格式只能接受char *指针


Question: 一道编程题没有思路，有急用，请大神帮帮忙

3个循环，每个循环执行4次，必须4个字符都不一样方可输出，否则不输出，其实就是穷举

引用 3 楼 amoyman 的回复:按题意，不是组合问题，而是排列了。 那就是这样：  char *p[4] =  {"HA","SQ","DJ","C10"}; for (int a = 0; a < 4; a++) {     for (int b = 0; b < 4; b++)     {         if (a == b) continue;         for (int c = 0; c < 4; c++)         {             if (a == c || b == c) continue;             printf("%s,%s,%s\n",p[a],p[b],p[c]);         }     } }  谢谢！

P(4, 3)的一个排列问题，不是组合问题。

这不就是 0，1，2，3四个数的组合问题吗 自己写的，别说我重复制造轮子哦  char *p[4] = {"HA","SQ","DJ","C10"}; for(int a = 0; a < 2; a++) {    for (int b = a + 1; b < 3; b++)   {     for (int c = b + 1; c < 4; c++)     {       printf("%s,%s,%s\n",p[a],p[b],p[c]);     }   } }

你的问题就是求排列组合，把“红桃A、黑桃Q、方块J、草花10” 抽象为{A,Q,J,10} 然后参考如下算法: http://blog.csdn.net/jfcat/article/details/8785865


Question: 编辑课堂作业的失误啊

引用 10 楼 kamenriderdrive 的回复:引用 3 楼 hulifangjiayou 的回复:if（）{}else{}结构有点混乱呐，是要做什么的，题目发一下。 #include<stdio.h>  void main() { 	double p,w,s,d,f;  //p为每km每吨基本运费，w为货物重，s为距离，d为折扣，f为总运费 	printf("请依次输入基本运费、货物重、距离（每个中间空一格）："); 	scanf("%lf %lf %lf",&p,&w,&s); 	 //if/else方式 	if(s < 0) 		printf("距离不能为负数！\n"); 	else if(s >= 0 && s < 250)  //没折扣 		d = 0; 	else if(s >= 250 && s < 500) 		d = 0.02; 	else if(s >= 500 && s < 1000) 		d = 0.05; 	else if(s >= 1000 && s < 2000) 		d = 0.08; 	else if(s >= 2000 && s < 3000) 		d = 0.10; 	else 		d = 0.15; 	f = p * w * s * (1 - d); 	printf("总运费为：%lf\n",f); /* //switch方式 	switch (int(s / 250.0)) 	{ 	case 0: d = 0;break; 	case 1: d = 0.02;break; 	case 2: 	case 3: d = 0.05;break; 	case 4: 	case 5: 	case 6: 	case 7: d = 0.08;break; 	case 8: 	case 9: 	case 10: 	case 11: d = 0.10;break; 	case 12: d = .015;break; 	default: printf("输入的数据有误！\n"); 	} 	f = p * w * s * (1 - d); 	printf("总运费为：%lf\n",f); */ }

干啥的？？？

引用 12 楼 u012421456 的回复:[quote=引用 2 楼 kamenriderdrive 的回复:] 大神,括号怎么加呢，还是说加什么括号，我加了之后更多错误了 楼主你看的什么书啊？还是没有看书？基础性知识，还是看书比较好[/quote] 额，C程序设计这本书

引用 2 楼 kamenriderdrive 的回复:大神,括号怎么加呢，还是说加什么括号，我加了之后更多错误了 楼主你看的什么书啊？还是没有看书？基础性知识，还是看书比较好

引用 9 楼 kamenriderdrive 的回复:引用 1 楼 xpdavis 的回复:if后面要加上括号！！！大神,括号怎么加呢，还是说加什么括号，我加了之后更多错误了 请翻开课本XXX页，if语句这一节

@zhao4zhong1 ,不用给我答案，教会我就行了

6楼够“高大上”了吧！

#include <stdio.h> int main() {     double s,w,p,f;      p=1.0;     w=2.0;     printf("请输入路程：");fflush(stdout);     scanf("%lf",&s);          if (   0.0< s && s< 250.0) {f=p*s*w            ;}     else if ( 250.0<=s && s< 500.0) {f=p*s*w*(1.00-0.02);}     else if ( 500.0<=s && s<1000.0) {f=p*s*w*(1.00-0.05);}     else if (1000.0<=s && s<2000.0) {f=p*s*w*(1.00-0.08);}     else if (2000.0<=s && s<3000.0) {f=p*s*w*(1.00-0.10);}     else if (3000.0<=s            ) {f=p*s*w*(1.00-0.15);}     printf("%lg\n",f);     return 0; }  http://bbs.csdn.net/topics/380157851

if 0 <s && s <250 ,//最好把括号全加然后if完后应该有语句，如果没有则写｛｝  else f=p*s*w ; }// if {    if 250 <= s && s <500,

上传了一张图片，能看到吗

if（）{}else{}结构有点混乱呐，是要做什么的，题目发一下。

大神,括号怎么加呢，还是说加什么括号，我加了之后更多错误了

if后面要加上括号！！！


Question: 【求助】C语言扫描 白底铺黑芝麻的手机图片并得出芝麻的总数

刚学图像处理？  1图片读取问题要解决，先学bmp格式的  2你的问题需要二值化图像，再求闭区间，一个芝麻的像素是一个闭区间。  http://download.csdn.net/detail/lovesmiles/1326376 这是一本比较老的书，vc图像处理，或者对你有用。

这个应该用opencv。不过光编译opencv这个东东就跔足够头疼了。

《学习OpenCV（中文版）》 编译链接调试OpenCV自带的相关例子代码。

二值化，然后查找黑色连通域并计数


Question: C语言中指针和字符串输出问题

VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

理解和讨论之前请先学会如何观察！  计算机组成原理→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

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

1.你申请了一亩地，但是你却种了2亩的东西，从法理上讲你这是非法的，但实际上你超范围种的东西不会因为超范围自然死亡，有可能村委会在给别人划分土地时直接就把你越界种的东西给你刨了。因为人家只保证分给你的地的合法使用权限，你越界的他不保证。 2.printf的打印机制就是从你给出的字符指针的位置开始，知道遇见结束符。知道了这个，其他的就不用再纠结了

首先感谢楼上各位大神对我问题的解答. 小弟对于printf字符串的输出问题已经是理解了→对于字符串的输出，我的理解是这样的: printf输出字符串时，会从所传递给printf的指针所指向的内存开始，依次读取，直至遇到'\0'停止. 这里的话再次感谢 5 楼starytx的举例,这个举例我也就明白了为什么可以输出成功. (因为小弟刚上大一，学习C语言没有多久，对于内存的方面不是很了解，也不知道自己接下来的话是否正确，欢迎各位指正） 首先我申请了 2 个字节的内存,并将指针ch指向了这个内存块的首地址:  注意到，malloc函数只给我分配了内存2和3，假设我现在执行如下代码 *ch = 'a',  *(ch+1) = '\0' 那么现在我执行printf("%s\n",ch);那么就会显示出a,这毫无疑问是一次正确的用法. 因为我一没有越界，二保证了内存的全部使用（没有多，也没有少）   但是如果我这样搞 *ch = 'a',  *(ch+1) = 'b' 那么现在我执行printf("%s\n",ch); 那么根据我上面的理解 会从所传递给printf的指针所指向的内存开始，依次读取，直至遇到'\0'停止. 那么程序在读取完 （程序员所规定的 2 和 3内存之后），由于没有遇到'\0',就会非法的访问可能没有初始化的内存(后面的3,4,5....等等）,虽然最后可能还是能够显示出ab，甚至于ab后面还有些乱七八糟的东西,但这已经超出了程序员的控制范围，应该制止这种不正确的用法. 这里的话我也知道自己的例子可能有些问题，但是char型我查书是 1 个字节,可能int型就不是了，这里的话我的一个疑问是：假如int 型的数字需要 4 个字节，那么是不是需要上面那个图中的4个"块"进行读取,例如将int a = 1,存储在内存1,2,3,4,中.   第二的话就是迎刃而解了，修改了没有经过malloc函数所指定的内存块，那么系统也就无法保存那些被非法修改的安全.根据我们的讲的，计算机存储这些数据好想是放在不用的地方，那么非法访问可以就会造成系统崩溃，比如上图的内存块的3开始就是存储int型的了，你强制给他搞个char的，就可能崩溃，当然，这也只是可能. 下面的是我自己的深入理解（欢迎指正） 那么按照这样的理解的话，这种经过非法修改的内存甚至于也无法保存其位置.当我下次malloc函数的时候，可能就会移走这些内存块,但系统是否会新移动一个内存来填补这个位置我就不知道了...（可能我从开始就错了）

建议用不同的编译器去验证

1.printf打印字符串，从指针的首地址开始一直到"\0"符； 2.溢出的部分只是会造成溢出部分内存被破坏，如果这部分内存没有被使用，也就不会出问题

c语言编译器没有越界检查的功能。。。

显示是正确，但有很大的不安全性。

使用malloc()分配的内存空间长度是参数指定的，但并不是说超出长度的内存就不能使用，可能是可以使用的，但是会引入内存泄露等问题，而且如果分配的内存超过一定长度会覆盖掉程序运行的汇编代码，也即是黑客使用的溢出攻击。 我试了试这个程序，输入了长度为20的字符串，还是可以正常运行。因为字符串结构是正确的(字符+‘\0’)，但当我把输入加长到一百或者更长时，程序就崩了，说明汇编代码驻留的内存已经被复写了，程序运行失败。

用gcc看的话，如果你去掉*(UserName + i)= '\0'; 这一行，那么输出会有乱码且多次运行结果不一样，行为不可预料。  至于只分配2个字节而却可以越界写，大致的原理应该是Heap Manager首先向操作系统申请一个固定单位比如4K整数倍的内存A，然后A后面的4K大小页面会被标记为不可访问。你的malloc等请求的内存将从A中分配，那只要你的读写操作在A的范围内，那都不会造成非法访问，只是可能破坏了其它数据和Heap Manager维护的统计信息。当你读写A后面的不可访问的页面时则程序会崩溃掉。  至于这里的A的大小，你可以试试写一个循环向UserName后的位置写入，看写到什么位置的时候会异常崩溃……  说得不准确，但是大概是这么个意思吧。


Question: 请教 uint64_t  64位下编译如何修改下面这个函数的 警告信息？

这个文件有问题？ Makefile: CC=gcc RM=rm -f CFLAGS_COMMON=-Wall -pedantic CFLAGS_OPTI=-O3 -fomit-frame-pointer -ffast-math CFLAGS_DEBUG=-ggdb3 ifeq "$(ARG)" "opti"     export CFLAGS=$(CFLAGS_COMMON) $(CFLAGS_OPTI) else     export CFLAGS=$(CFLAGS_COMMON) $(CFLAGS_DEBUG) endif  NAME=dm-merge  LIBS= OBJS=dm-merge.o  $(NAME): $(OBJS) $(LIBS)         $(CC) $(CFLAGS) -o $@ $^  %.o: %.c %.h         $(CC) -c $(CFLAGS) -o $@ $<  clean:         $(RM) *.o $(NAME) core

gcc -pedantic -Wformat -std=c99 -o demo demo.c -std=c99

int main(int argc, char ** argv) {     int c;      atexit(cleanup);      while( (c = getopt(argc, argv, "fdi:o:Dvhx")) != -1 )     {         switch(c)         {             case 'x': relaxed = 1; break;             case 'f': dry = 0; break;             case 'd': print_dds = 1; break;             case 'D': do_direct_io = 1; break;             case 'v': verbose++; break;             case 'i': input_filename = strdup(optarg); break;             case 'o': output_filename = strdup(optarg); break;             case 'h': help(); exit(0);             default: help(); exit(1);         } /* switch argument */     } /* while getopt() */       if(!input_filename)     {         fputs("Error: input filename not specified\n\n", stderr);         help();         exit(1);     }      if(!dry && !output_filename)     {         fputs("Error: no dry run and no output filename\n\n", stderr);         help();         exit(1);     }       /* better safe than sorry */     sync();      /* check and open snapshot */      flags = O_RDONLY;      err = stat(input_filename, &st);     if(-1 == err)     {         perror("stat(snapshot)");         exit(1);     }          /* block device; will set O_DIRECT */         if(S_ISBLK(st.st_mode) && do_direct_io)         flags |= O_DIRECT;      inputfd = open(input_filename, flags);     if(-1 == inputfd)     {         perror("open(snapshot)");         exit(1);     }      /* determine size & flush buffers */     if(S_ISBLK(st.st_mode))     {         err = ioctl(inputfd, BLKGETSIZE64, &input_length);         if(-1 == err)         {             perror("ioctl(snapshot, BLKGETSIZE64)");             exit(1);         }          err = ioctl(inputfd, BLKFLSBUF, 0);         if(-1 == err)         {             perror("ioctl(snapshot, BLKFLSBUF)");             if(!relaxed) exit(1);             else fputs("relaxed mode, will continue ...\n", stderr);         }     }     else         input_length = st.st_size;      /* now the same for the output */     if(!dry)     {         flags = O_WRONLY;          err = stat(output_filename, &st);         if(-1 == err)         {             perror("stat(output)");             exit(1);         }                  /* block device; will set O_DIRECT */             if(S_ISBLK(st.st_mode) && do_direct_io)             flags |= O_DIRECT;          outputfd = open(output_filename, flags);         if(-1 == outputfd)         {             perror("open(output)");             exit(1);         }          /* determine size & flush buffers */         if(S_ISBLK(st.st_mode))         {             err = ioctl(outputfd, BLKGETSIZE64, &output_length);             if(-1 == err)             {                 perror("ioctl(output, BLKGETSIZE64)");                 exit(1);             }              err = ioctl(outputfd, BLKFLSBUF, 0);             if(-1 == err)             {                 perror("ioctl(output, BLKFLSBUF)");                 if(!relaxed) exit(1);                 else fputs("relaxed mode, will continue ...\n", stderr);             }         }         else             output_length = st.st_size;     }       /* FIXME perhaps add an override option? */     if(input_length < 4096 || (!dry && output_length < (4 * 1024 * 1024)))     {         fputs("Error: suspicious file/device sizes\n", stderr);         exit(1);     }       /* the allocations; special care for O_DIRECT */     if(do_direct_io)     {         header_orig = malloc(512 + PAGE_SIZE);         if(!header_orig)         {             perror("malloc()");             exit(1);         }         header = (unsigned char *) PAGE_ALIGN((ptrdiff_t) header_orig);         if(verbose)             fprintf(stdout, "header_orig = %p (%lu), header = %p (%lu)\n", header_orig, (unsigned long) header_orig % PAGE_SIZE, header, (unsigned long) header % PAGE_SIZE);     }     else     {         header_orig = header = malloc(512);         if(!header_orig)         {             perror("malloc()");             exit(1);         }     }      /* Not sure if BLKFLSBUF waits for the flushing to finish; better safe than sorry */     fputs("Artificial sleep (1 second)\n", stdout);     sleep(1);       /* FIXME: do retries here as well? */     err = pread(inputfd, header, 512, 0);     if(-1 == err)     {         perror("read(snapshot, header)");         exit(1);     }      magic = (uint32_t *) header;     *magic = __le32_to_cpu(*magic);     if(SNAP_MAGIC != *magic)     {         fputs("Invalid header MAGIC\n", stderr);         fprintf(stderr, "%#x != %#x\n", *magic, SNAP_MAGIC);         exit(1);     }     fprintf(stdout, "Found a proper MAGIC header: %#x\n", *magic);          valid = (uint32_t *) (header+4);     *valid = __le32_to_cpu(*valid);     if(0 == *valid)     {         fputs("valid == 0\n", stderr);         exit(1);     }     fprintf(stdout, "valid = %u\n", *valid);          version = (uint32_t *) (header+8);     *version = __le32_to_cpu(*version);     if(*version != SNAPSHOT_DISK_VERSION)     {         fputs("version != 1\n", stderr);         exit(1);     }     fprintf(stdout, "version = %u\n", *version);      cs = (uint32_t *) (header+12);     *cs =  __le32_to_cpu(*cs);     chunk_size = *cs;     if(chunk_size < 1 || chunk_size > 1024 || (0 != (chunk_size & (chunk_size-1))))     {         fputs("chunk size has to be >=1 and <=1024 and a power of 2\n", stderr);         exit(1);     }     fprintf(stdout, "chunk_size = %u (%u bytes)\n", chunk_size, chunk_size*512);      chunk_size *= 512;      /* the allocations; special care for O_DIRECT */     if(do_direct_io)     {         buf_orig = buf = malloc(chunk_size + PAGE_SIZE);         chunk_orig = chunk = malloc(chunk_size + PAGE_SIZE);         if(!buf_orig || !chunk_orig)         {             perror("malloc()");             exit(1);         }         buf = (unsigned char *) PAGE_ALIGN((ptrdiff_t) buf_orig);         if(verbose)             fprintf(stdout, "buf_orig = %p (%lu), buf = %p (%lu)\n", buf_orig, (unsigned long) buf_orig % PAGE_SIZE, buf, (unsigned long) buf % PAGE_SIZE);         chunk = (unsigned char *) PAGE_ALIGN((ptrdiff_t) chunk_orig);         if(verbose)             fprintf(stdout, "chunk_orig = %p (%lu), chunk = %p (%lu)\n", chunk_orig, (unsigned long) chunk_orig % PAGE_SIZE, chunk, (unsigned long) chunk % PAGE_SIZE);     }     else     {         buf_orig = buf = malloc(chunk_size);         chunk_orig = chunk = malloc(chunk_size);         if(!buf_orig || !chunk_orig)         {             perror("malloc()");             exit(1);         }     }       /*       * do the work       */     do     {         retries=0;          do {             if(0 != retries)                 fprintf(stderr, "Warning: retrying pread() on exception area %llu at %llu\n", chunk_now, chunk_now*chunk_size);              err = pread(inputfd, buf, chunk_size, chunk_now*chunk_size);             if(-1 == err)             {                 if(EINTR == errno)                      continue;                 perror("pread(inputfd)");                 exit(1);             }             else if(0 == err)             {                 fputs("pread(inputfd): early EOF!\n", stderr);                 exit(1);             }             else if(err != chunk_size)             {                 if(retries++ < 2)                     continue;                 fputs("pread(inputfd): incomplete read!\n", stderr);                 exit(1);             }              break;         } while(1);          /* process the exception area */         for(i=0; i < chunk_size/16; i++)         {             temp_u64 = (uint64_t *)(buf+(i*16));             de.old_chunk = __le64_to_cpu(*temp_u64);             temp_u64 = (uint64_t *)(buf+(i*16)+8);             de.new_chunk = __le64_to_cpu(*temp_u64);              if(verbose >= 2)                 fprintf(stdout, "... chunk_now = %llu, i = %u, de.old_chunk = %llu, de.new_chunk = %llu, old %p, new %p\n", chunk_now, i, de.old_chunk, de.new_chunk, buf+(i*16), buf+(i*16)+8);              /* 0 as a new chunk means "we've reached the end" */             if(0 == de.new_chunk)             {                 go = 0;                 break;             }             else if((1 == chunk_now && 0 == i && de.new_chunk != 2) || (de.new_chunk < 2))             {                 fputs("(1 == chunk_now && 0 == i && de.new_chunk != 2) || (de.new_chunk < 2), perhaps not a snapshot?\n", stderr);                 exit(1);             }              total_count++;              /* the data transfer */             read_write_chunk();         } /* for i */          /* next hop */         chunk_now += chunk_size/16 + 1;         if(verbose && go)             fprintf(stdout, "Seeking into exception area in chunk %llu\n", chunk_now);      } while(go);      /* flush buffers again (no error handling this time as there's nothing to do anyway) */     if(S_ISBLK(st.st_mode)) err = ioctl(outputfd, BLKFLSBUF, 0);      /* better safe than sorry */     sync();      fprintf(stdout, "Found %llu exceptions of chunksize %u, total size %llu bytes (%llu KiB, %.3Lf MiB, %.3Lf GiB).\n", total_count, chunk_size, total_count*chunk_size, (total_count*chunk_size)/1024, ((long double)(total_count*chunk_size))/(1024*1024), ((long double)(total_count*chunk_size))/(1024*1024*1024));      close(inputfd);     if(-1 != outputfd) close(outputfd);      memset(buf, 0, chunk_size);     memset(chunk, 0, chunk_size);      /* cleanup() will do the rest */      return 0; } /* main() */      谢谢  [/code]

由于代码太长了接上面的函数:   int main(int argc, char ** argv) {     int c;      atexit(cleanup);      while( (c = getopt(argc, argv, "fdi:o:Dvhx")) != -1 )     {         switch(c)         {             case 'x': relaxed = 1; break;             case 'f': dry = 0; break;             case 'd': print_dds = 1; break;             case 'D': do_direct_io = 1; break;             case 'v': verbose++; break;             case 'i': input_filename = strdup(optarg); break;             case 'o': output_filename = strdup(optarg); break;             case 'h': help(); exit(0);             default: help(); exit(1);         } /* switch argument */     } /* while getopt() */       if(!input_filename)     {         fputs("Error: input filename not specified\n\n", stderr);         help();         exit(1);     }      if(!dry && !output_filename)     {         fputs("Error: no dry run and no output filename\n\n", stderr);         help();         exit(1);     }       /* better safe than sorry */     sync();      /* check and open snapshot */      flags = O_RDONLY;      err = stat(input_filename, &st);     if(-1 == err)     {         perror("stat(snapshot)");         exit(1);     }          /* block device; will set O_DIRECT */         if(S_ISBLK(st.st_mode) && do_direct_io)         flags |= O_DIRECT;      inputfd = open(input_filename, flags);     if(-1 == inputfd)     {         perror("open(snapshot)");         exit(1);     }      /* determine size & flush buffers */     if(S_ISBLK(st.st_mode))     {         err = ioctl(inputfd, BLKGETSIZE64, &input_length);         if(-1 == err)         {             perror("ioctl(snapshot, BLKGETSIZE64)");             exit(1);         }          err = ioctl(inputfd, BLKFLSBUF, 0);         if(-1 == err)         {             perror("ioctl(snapshot, BLKFLSBUF)");             if(!relaxed) exit(1);             else fputs("relaxed mode, will continue ...\n", stderr);         }     }     else         input_length = st.st_size;      /* now the same for the output */     if(!dry)     {         flags = O_WRONLY;          err = stat(output_filename, &st);         if(-1 == err)         {             perror("stat(output)");             exit(1);         }                  /* block device; will set O_DIRECT */             if(S_ISBLK(st.st_mode) && do_direct_io)             flags |= O_DIRECT;          outputfd = open(output_filename, flags);         if(-1 == outputfd)         {             perror("open(output)");             exit(1);         }          /* determine size & flush buffers */         if(S_ISBLK(st.st_mode))         {             err = ioctl(outputfd, BLKGETSIZE64, &output_length);             if(-1 == err)             {                 perror("ioctl(output, BLKGETSIZE64)");                 exit(1);             }              err = ioctl(outputfd, BLKFLSBUF, 0);             if(-1 == err)             {                 perror("ioctl(output, BLKFLSBUF)");                 if(!relaxed) exit(1);                 else fputs("relaxed mode, will continue ...\n", stderr);             }         }         else             output_length = st.st_size;     }       /* FIXME perhaps add an override option? */     if(input_length < 4096 || (!dry && output_length < (4 * 1024 * 1024)))     {         fputs("Error: suspicious file/device sizes\n", stderr);         exit(1);     }       /* the allocations; special care for O_DIRECT */     if(do_direct_io)     {         header_orig = malloc(512 + PAGE_SIZE);         if(!header_orig)         {             perror("malloc()");             exit(1);         }         header = (unsigned char *) PAGE_ALIGN((ptrdiff_t) header_orig);         if(verbose)             fprintf(stdout, "header_orig = %p (%lu), header = %p (%lu)\n", header_orig, (unsigned long) header_orig % PAGE_SIZE, header, (unsigned long) header % PAGE_SIZE);     }     else     {         header_orig = header = malloc(512);         if(!header_orig)         {             perror("malloc()");             exit(1);         }     }      /* Not sure if BLKFLSBUF waits for the flushing to finish; better safe than sorry */     fputs("Artificial sleep (1 second)\n", stdout);     sleep(1);       /* FIXME: do retries here as well? */     err = pread(inputfd, header, 512, 0);     if(-1 == err)     {         perror("read(snapshot, header)");         exit(1);     }      magic = (uint32_t *) header;     *magic = __le32_to_cpu(*magic);     if(SNAP_MAGIC != *magic)     {         fputs("Invalid header MAGIC\n", stderr);         fprintf(stderr, "%#x != %#x\n", *magic, SNAP_MAGIC);         exit(1);     }     fprintf(stdout, "Found a proper MAGIC header: %#x\n", *magic);          valid = (uint32_t *) (header+4);     *valid = __le32_to_cpu(*valid);     if(0 == *valid)     {         fputs("valid == 0\n", stderr);         exit(1);     }     fprintf(stdout, "valid = %u\n", *valid);          version = (uint32_t *) (header+8);     *version = __le32_to_cpu(*version);     if(*version != SNAPSHOT_DISK_VERSION)     {         fputs("version != 1\n", stderr);         exit(1);     }     fprintf(stdout, "version = %u\n", *version);      cs = (uint32_t *) (header+12);     *cs =  __le32_to_cpu(*cs);     chunk_size = *cs;     if(chunk_size < 1 || chunk_size > 1024 || (0 != (chunk_size & (chunk_size-1))))     {         fputs("chunk size has to be >=1 and <=1024 and a power of 2\n", stderr);         exit(1);     }     fprintf(stdout, "chunk_size = %u (%u bytes)\n", chunk_size, chunk_size*512);      chunk_size *= 512;      /* the allocations; special care for O_DIRECT */     if(do_direct_io)     {         buf_orig = buf = malloc(chunk_size + PAGE_SIZE);         chunk_orig = chunk = malloc(chunk_size + PAGE_SIZE);         if(!buf_orig || !chunk_orig)         {             perror("malloc()");             exit(1);         }         buf = (unsigned char *) PAGE_ALIGN((ptrdiff_t) buf_orig);         if(verbose)             fprintf(stdout, "buf_orig = %p (%lu), buf = %p (%lu)\n", buf_orig, (unsigned long) buf_orig % PAGE_SIZE, buf, (unsigned long) buf % PAGE_SIZE);         chunk = (unsigned char *) PAGE_ALIGN((ptrdiff_t) chunk_orig);         if(verbose)             fprintf(stdout, "chunk_orig = %p (%lu), chunk = %p (%lu)\n", chunk_orig, (unsigned long) chunk_orig % PAGE_SIZE, chunk, (unsigned long) chunk % PAGE_SIZE);     }     else     {         buf_orig = buf = malloc(chunk_size);         chunk_orig = chunk = malloc(chunk_size);         if(!buf_orig || !chunk_orig)         {             perror("malloc()");             exit(1);         }     }       /*       * do the work       */     do     {         retries=0;          do {             if(0 != retries)                 fprintf(stderr, "Warning: retrying pread() on exception area %llu at %llu\n", chunk_now, chunk_now*chunk_size);              err = pread(inputfd, buf, chunk_size, chunk_now*chunk_size);             if(-1 == err)             {                 if(EINTR == errno)                      continue;                 perror("pread(inputfd)");                 exit(1);             }             else if(0 == err)             {                 fputs("pread(inputfd): early EOF!\n", stderr);                 exit(1);             }             else if(err != chunk_size)             {                 if(retries++ < 2)                     continue;                 fputs("pread(inputfd): incomplete read!\n", stderr);                 exit(1);             }              break;         } while(1);          /* process the exception area */         for(i=0; i < chunk_size/16; i++)         {             temp_u64 = (uint64_t *)(buf+(i*16));             de.old_chunk = __le64_to_cpu(*temp_u64);             temp_u64 = (uint64_t *)(buf+(i*16)+8);             de.new_chunk = __le64_to_cpu(*temp_u64);              if(verbose >= 2)                 fprintf(stdout, "... chunk_now = %llu, i = %u, de.old_chunk = %llu, de.new_chunk = %llu, old %p, new %p\n", chunk_now, i, de.old_chunk, de.new_chunk, buf+(i*16), buf+(i*16)+8);              /* 0 as a new chunk means "we've reached the end" */             if(0 == de.new_chunk)             {                 go = 0;                 break;             }             else if((1 == chunk_now && 0 == i && de.new_chunk != 2) || (de.new_chunk < 2))             {                 fputs("(1 == chunk_now && 0 == i && de.new_chunk != 2) || (de.new_chunk < 2), perhaps not a snapshot?\n", stderr);                 exit(1);             }              total_count++;              /* the data transfer */             read_write_chunk();         } /* for i */          /* next hop */         chunk_now += chunk_size/16 + 1;         if(verbose && go)             fprintf(stdout, "Seeking into exception area in chunk %llu\n", chunk_now);      } while(go);      /* flush buffers again (no error handling this time as there's nothing to do anyway) */     if(S_ISBLK(st.st_mode)) err = ioctl(outputfd, BLKFLSBUF, 0);      /* better safe than sorry */     sync();      fprintf(stdout, "Found %llu exceptions of chunksize %u, total size %llu bytes (%llu KiB, %.3Lf MiB, %.3Lf GiB).\n", total_count, chunk_size, total_count*chunk_size, (total_count*chunk_size)/1024, ((long double)(total_count*chunk_size))/(1024*1024), ((long double)(total_count*chunk_size))/(1024*1024*1024));      close(inputfd);     if(-1 != outputfd) close(outputfd);      memset(buf, 0, chunk_size);     memset(chunk, 0, chunk_size);      /* cleanup() will do the rest */      return 0; } /* main() */  [/code]    谢谢

[code=c]/******************************************************************************  * dm-merge.c  *  *****************************************************************************/  #define _FILE_OFFSET_BITS 64 #define _GNU_SOURCE  #include <stdio.h> #include <string.h> #include <stdlib.h>  #include <stddef.h> /* ptrdiff_t */  #include <stdint.h> /* uint64_t */  #include <errno.h>  #include <getopt.h>  #include <unistd.h> #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h>  #include <sys/ioctl.h> #include <linux/fs.h> /* BLKGETSIZE64, BLKFLSBUF */  #include <endian.h>   /* endian stuff */ #if __BYTE_ORDER == __BIG_ENDIAN #include <linux/byteorder/big_endian.h> #else #include <linux/byteorder/little_endian.h> #endif   #define SNAP_MAGIC 0x70416e53 /* 'SnAp' */ #define SNAPSHOT_DISK_VERSION 1   /* doubtful stuff; only used with O_DIRECT */ #define MAX_CHUNKSIZE 524288 #define PAGE_SIZE 4096 #define PAGE_ALIGN(addr) ALIGN(addr, PAGE_SIZE) #define ALIGN(x,a)      __ALIGN_MASK(x,(typeof(x))(a)-1) #define __ALIGN_MASK(x,mask)    (((x)+(mask))&~(mask))   uint32_t *magic; uint32_t *valid; uint32_t *version; uint32_t chunk_size=512, *cs;   struct disk_exception {     uint64_t old_chunk;     uint64_t new_chunk; };   unsigned char *header=NULL, *header_orig=NULL, *buf=NULL, *buf_orig=NULL, *chunk=NULL, *chunk_orig=NULL; char *input_filename=NULL, *output_filename=NULL; int inputfd=-1, outputfd=-1, dry=1, print_dds=0, do_direct_io = 0, verbose = 0, err=-1, err2=-1, flags=0, go=1, relaxed=0; unsigned int i=0, retries=0; struct stat st; uint64_t input_length=0, output_length=0; off_t chunk_now=1; struct disk_exception de; uint64_t *temp_u64; uint64_t total_count=0;   /* taken from libtomcrypt */ void burn_stack(unsigned long len) {    unsigned char buf[32];    memset(buf, 0, sizeof(buf));    if (len > (unsigned long)sizeof(buf))       burn_stack(len - sizeof(buf)); }   /* atexit calls it */ void cleanup() {     if(input_filename) free(input_filename);     if(output_filename) free(output_filename);     if(buf) memset(buf, 0, chunk_size);      if(buf_orig) free(buf_orig);     if(chunk) memset(chunk, 0, chunk_size);     if(chunk_orig) free(chunk_orig);     if(header) memset(header, 0, 512);     if(header_orig) free(header_orig);     /* obfuscate it a little */     burn_stack(10*4096); } /* cleanup */   /* called for each exception */ inline void read_write_chunk() {     retries=0;      if(print_dds) fprintf(stdout, "dd of=\"%s\" seek=%llu if='%s' iflag=direct skip=%llu count=1 bs=%db\n", output_filename ? output_filename : "${origin}", de.old_chunk, input_filename, de.new_chunk, chunk_size/512);      if(dry) return;      /* read */     do {         if(0 != retries)             fprintf(stderr, "Warning: retrying pread() on exception chunk at %llu\n", de.new_chunk*chunk_size);          err = pread(inputfd, chunk, chunk_size, de.new_chunk*chunk_size);         if(-1 == err)         {             if(EINTR == errno)                  continue;             perror("pread(inputfd)");             exit(1);         }         else if(0 == err)         {             fputs("pread(inputfd): early EOF!\n", stderr);             exit(1);         }         else if(err != chunk_size)         {             if(retries++ < 2)                 continue;             fputs("pread(inputfd): incomplete read!\n", stderr);             exit(1);         }          break;     } while(1);       /* write */     retries = 0;     do {         if(0 != retries)             fprintf(stderr, "Warning: retrying pwrite() at %llu\n", de.old_chunk*chunk_size);          err = pwrite(outputfd, chunk, chunk_size, de.old_chunk*chunk_size);         if(-1 == err)         {             if(EINTR == errno)                  continue;             perror("pwrite(outputfd)");             exit(1);         }         else if(err != chunk_size)         {             if(retries++ < 2)                 continue;             fputs("pwrite(outputfd): incomplete write!\n", stderr);             exit(1);         }          break;     } while(1);  } /* read_write_chunk() */    void help() {     fputs("Usage: dm-merge [options] -i <snapshot_device> [ -o <output_device> ]\n\n", stderr);     fputs("Options:\n", stderr);     fputs("-f\t\tREALLY do it (no dry run)\n", stderr);     fputs("-x\t\tRelaxed mode; allow some things (namely ioctl) to fail\n", stderr);     fputs("-d\t\tPrint dd lines as list_exception_chunks.pl would\n", stderr);     fputs("-D\t\tTry to use O_DIRECT\n", stderr);     fputs("-v\t\tBe verbose (more '-v's increase verbosity)\n", stderr);     fputs("-i <file>\tInput (snapshot) COW (copy-on-write) filename\n", stderr);     fputs("-o <file>\tOutput (the device being snapshoted) filename\n\n", stderr);     fputs("This program is still experimental. USE WITH CARE! Read the README!\n\n", stderr); } /* help() */


Question: 求助齿轮转动惯量的计算公式？？？

那这个公式对么？？？

引用 1 楼 zhao4zhong1 的回复:http://www.baidu.com/s?ie=utf-8&f=8&rsv_bp=1&ch=&tn=baiduhome_pg&bar=&wd=%E9%BD%BF%E8%BD%AE%E8%BD%AC%E5%8A%A8%E6%83%AF%E9%87%8F%E7%9A%84%E8%AE%A1%E7%AE%97%E5%85%AC%E5%BC%8F&rsv_spt=1    这样的问题居然不去百度，来这里问？

用积分求啊，对于质点 I = m*r^2


Question: 求助，我这个排序，程序怎么写啊，谢谢！

编译提示：  1>c:\paix2\paix2.cpp(71) : error C2784: “bool std::operator >=(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)”: 无法从“重载函数类型”为“const std::reverse_iterator<_RanIt> &”推导 <未知> 参数 1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2286) : 参见“std::operator >=”的声明 1>c:\paix2\paix2.cpp(71) : error C2784: “bool std::operator >=(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)”: 无法从“重载函数类型”为“const std::_Revranit<_RanIt,_Base> &”推导 <未知> 参数 1>        c:\program files\microsoft visual studio 9.0\vc\include\xutility(2105) : 参见“std::operator >=”的声明 1>c:\paix2\paix2.cpp(71) : error C2784: “bool std::operator >=(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)”: 无法从“重载函数类型”为“const std::pair<_Ty1,_Ty2> &”推导 <未知> 参数 1>        c:\program files\microsoft visual studio 9.0\vc\include\utility(124) : 参见“std::operator >=”的声明 1>c:\paix2\paix2.cpp(71) : error C2676: 二进制“>=”: “Ranking”不定义该运算符或到预定义运算符可接收的类型的转换 1>c:\paix2\paix2.cpp(101) : error C2679: 二进制“<<”: 没有找到接受“std::string”类型的右操作数的运算符(或没有可接受的转换)

谢谢， 我就试！

仅供参考//字母优先级是  d, f, e, c, a .  然后字符数组是str=｛"deec","dac","ceef","fee"｝;输出的是"deec","dac","fee","ceef" #include <stdio.h> #include <string.h> int od(char c) {     char *p;     char order[6]="dfeca";      if (0==c) return -1;     p=strchr(order,c);     if (NULL==p) return -1;     return p-order; } int cmp(char *s1,char *s2) {     int od1,od2;      while (1) {         od1=od(*s1);         od2=od(*s2);         if (od1<od2) return -1;         if (od1>od2) return  1;         if (-1==od1 && -1==od2) return 0;         s1++;         s2++;     } } int main() {     char *str[4]={"deec","dac","ceef","fee"};     char *t;     int i,j;      for (i=0;i<4-1;i++) {         for (j=i+1;j<4;j++) {             if (1==cmp(str[i],str[j])) {                 t=str[i];str[i]=str[j];str[j]=t;             }         }     }      for (i=0;i<4-1;i++) printf("\"%s\",",str[i]);     printf("\"%s\"",str[i]);     return 0; } //"deec","dac","fee","ceef"

引用 4 楼 lshlsh2009 的回复:temp.name = a[j].name;  temp.loops = a[j].loops;  temp.point = a[j].point;  temp.distance = a[j].distance;   a[j].name = a[j+1].name;  a[j].loops = a[j+1].loops;  a[j].point = a[j+1].point;  a[j].distance = a[j+1].distance;     a[j+1].name = temp.name;  a[j+1].loops = temp.loops;  a[j+1].point = temp.point;  a[j+1].distance = temp.distance;  这些 = 可以重载不啊？ 如果重载 要怎么写？ 内嵌的变量类型不能重载=，也不需要重载=。


Question: C语言初学者，一个问题我感觉是对的总是不通过啊！！！

引用 5 楼 wax14111205058 的回复:按你的结果输入还是wrong answer。根本不知道是什么情况啊，而且我这个例子转换成整数后结果还是6啊。 刚才类型转换的时候忘了，浮点数转换成整数的时候最好加上0.5再转。 比如，如果x=0.9999999，x==1.0不成立。如果转换成int，(int)x会转换成0，那就更不对了。加上0.5可以四舍五入，(int)(x+0.5)==1这样就成立了。 楼主如果有兴趣可以加上0.5再试试，我也很想知道库函数pow的解法为什么不行。

我不用pow函数 自己编了个函数终于accept了,本来我是没学到如何调用函数才用pow的……总之谢谢大家了。

引用 8 楼 wax14111205058 的回复:我们校园网就是这样 我都懒得吐槽了，估计不是自己编那个函数就不让对吧。竟然连个提示或说明都没有我也是醉了。 据我所知，ACM都没有任何提示的，只能自己猜。而且一般的ACM只会对比输出，还没有智能到检查代码的程度。比如这个题，如果直接printf("6\n");可能也就过了

也可以试试不用pow这个库函数，自己写个函数计算整数乘方很容易。

pow的返回值是浮点数。理论上浮点数用"=="做比较的时候可能有问题，通常的正确做法是两个浮点数相减结果很接近0(比如小于1e-6)就认为他们相等。不过具体到这个例子，不知道是不是这个造成的问题。 试试把结果转换成整数再比较： while((int)(pow(1,n) + pow(6,n) + pow(7,n) + pow(17,n) + pow(18,n) + pow(23,n)) == (int)(pow(2,n) + pow(3,n) + pow(11,n) + pow(13,n) + pow(21,n) + pow(22,n)))

在校园网做题的,不应该不会让我用math函数啊。我看别人最短的Code Length 0.02k 我要郁闷死了。

可能是math.h的问题，你在哪里做题的？


Question: 函数

看输出。。。

这是学习递归的一个经典的例子。 /*************************************************************************     > File Name: fb.cpp     > Author: Jukay     > Mail: hellojukay@gmail.com      > Created Time: 2014年10月17日 星期五 18时00分28秒  ************************************************************************/ #include<vector> #include<iostream> using namespace std; int main() { 	long fib(int,vector<int>&); 	vector<int> v1; 	for(int i=0;i<=20;i++) 	{ 		v1.push_back(fib(i,v1)); 	} 	for(auto s:v1) 		cout<< s <<endl; 	return 0; } long fib(int n,vector<int> &v) { 	if(n==0 || n==1) 		return 1; 	else 		return v[n-2] + v[n-1]; }

你跟踪一遍差不多就明白了

斐波那契数列

/*输出斐波那契数列的前40个，输出格式要求为每行四个数字，每个数字域宽为12个字符*/ #include<iostream>   #include<cmath> #include<iomanip> using namespace std; int main() { 	long f1,f2; 	int i; 	f1=f2=1;  //数列的头两个数字为1、1 	for(i=1;i<=20;i++) 	{ 		cout<<setw(12)<<f1<<setw(12)<<f2; //每次输出两个数字 		if(i%2==0) cout<<endl;  //当输出4个后换行 		f1=f1+f2;  //斐波那契数列的规则，第三个数是前两个数之和 		f2=f2+f1; 		 	}     return 0; }

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

1  1  2  3 5   8......


Question: 新手。c语言的一些语句不懂，请指教

还有int fun2(int *x, int n) int fun2(int *x, int n) {  int t; if(n==1) return; t=x[0];x[0]=x[n-1]; x[n-1]=t;       fun2(x+1,n-2); }红色这句什么意思 ========================== fun2（）自己调用自己，递归，每次讲x数组的后一个传给自己，数组个数减2  楼主应加强c的基础知识

#include <stdio.h> #include <string.h> void fun(int a[3][3], int c1,int c2) {  int i,t;    for(i=0;i<3;i++)    {  t=a[c1][i];       a[c1][i]= a[c2][i];       a[c2][i]=t;    } } void main() {   int i,j,k;     int a[3][3]={2,3,4,1,3,2,1,2,3};     for(k=0;k<3;k++)     {  for(j=0;j<3;j++)           printf("%3d",a[k][j]);         printf("\n"); 	}        for(i=0;i<3;i++)        {  k=i;            for(j=0;j<3;j++)              if(a[j][0]<a[k][0]) k=j;              else if(a[j][0]==a[k][0]&& a[j][1]==a[k][1])  k=j;            if(i!=k) fun(a,i,k); 	}        for(k=0;k<3;k++)        {  for(j=0;j<3;j++) printf("%3d",a[k][j]);            printf("\n"); 	} }第一个整个是这样的

递归调用，后面是想写个实现逆序的子函数，无非就是调用了。代码有点小问题，比如return之类的。不过没必要用递归。直接一个循环不就好了么。

不出意外  你的代码 应该有问题吧  能编译过？

fun2(x+1,n-2); 这是递归调用自身的函数，就是int fun2(int *x, int n)

n=strlen(a)<strlen(b)? strlen(a): strlen(b); 比较字符串a与b的长度，将长度最长的长度值赋给变量n，  红色这句是调用自身函数，也说是常说的递归。  前面3行，不全吧


Question: c语言用哪个编程软件比较好

网上有cfree的注册码。。。 用qt的路过。。。

推荐Dev-C++的编程环境。比vc6.0简单，也比较适合初学者。此IDE使用的编译器就是gcc，linux下最常见的编译器。而且有一定的智能识别功能。

并且学如何使用cl.exe编译代码  学习编程够用了

装这个吧， 没有IDE的VS 2008

Visual  c++ 6.0  很好的  我们上学就用这个

初学的,CodeBlocks也不错

个人推荐你用VS2010，因为他的即时错误检查非常方便，还有最好同时在装个VC6


Question: mango[i++] += y;为什么被编译成mango[i]  = mango[i] + y; i++

引用 13 楼 mujiok2003 的回复:[quote=引用 10 楼 yzl1992yzl 的回复:] [quote=引用 8 楼 mujiok2003 的回复:] 看看运算符的优先级和结合性运算符的优先级看了，就是有不理解的地方，对于arr[i++]来说[]操作符是在i的左边还是右边？还有arr[i++] += 1;这个语句中+=运算符的优先级最低，那不就等价于下面吗？(arr[i++]) += 1; 对于上面的这句为什么不是(arr[i++]) = (arr[i++])  + 1;[/quote]  这个又不是宏替换， 干嘛要换到右边。 += 本身就是一个运算符。 [/quote]+1

不对，第一次和第二次地址不一样，帖子怎么不能编辑啊

晕，为什么都说是优先级的问题，刚才看了看C标准，里面有一句对复合赋值操作 a op= b 表达式a只求值一次，就是对于arr[i++] += 1;只对arr[i++]求值一次，要对他求值必须先取得他的地址，因此取地址就是一次，赋值的时候使用的是第一次求值时使用的对应元素的地址，如下：  00A57234 8B 45 E0             mov         eax,dword ptr [ebp-20h]   00A57237 8B 4C 85 EC          mov         ecx,dword ptr [ebp+eax*4-14h]   00A5723B 83 C1 0A             add         ecx,0Ah   00A5723E 8B 55 E0             mov         edx,dword ptr [ebp-20h]   00A57241 89 4C 95 EC          mov         dword ptr [ebp+edx*4-14h],ecx   00A57245 8B 45 E0             mov         eax,dword ptr [ebp-20h]   00A57248 83 C0 01             add         eax,1   00A5724B 89 45 E0             mov         dword ptr [ebp-20h],eax 所以i增加了一次而不是i增加了两次

引用 10 楼 yzl1992yzl 的回复:[quote=引用 8 楼 mujiok2003 的回复:] 看看运算符的优先级和结合性运算符的优先级看了，就是有不理解的地方，对于arr[i++]来说[]操作符是在i的左边还是右边？还有arr[i++] += 1;这个语句中+=运算符的优先级最低，那不就等价于下面吗？(arr[i++]) += 1; 对于上面的这句为什么不是(arr[i++]) = (arr[i++])  + 1;[/quote]  这个又不是宏替换， 干嘛要换到右边。 += 本身就是一个运算符。

C是一门很灵活的语言，语言灵活，人也得灵活，就这样，不然就用不好这门语言

[]  (下标运算符)　优先级比    ++   (自增运算符) 　　要高，所以arr[i++]实际上会先执行arr[i]，然后执行i++。  说到底还是运算符优先级问题，C语言运算符优先级表http://wenku.baidu.com/view/302b9e89a0116c175f0e48f0.html，你弄不明白运算符优先级问题，永远也不会明白你提出的问题。先弄明白再来讨论吧。

引用 8 楼 mujiok2003 的回复:看看运算符的优先级和结合性运算符的优先级看了，就是有不理解的地方，对于arr[i++]来说[]操作符是在i的左边还是右边？还有arr[i++] += 1;这个语句中+=运算符的优先级最低，那不就等价于下面吗？(arr[i++]) += 1; 对于上面的这句为什么不是(arr[i++]) = (arr[i++])  + 1;

引用 6 楼 CS1024 的回复:忘了，[]也"优先"++ 对于arr[i++]来说[]操作符是在i的左边还是右边？

看看运算符的优先级和结合性

引用 5 楼 CS1024 的回复:=优先到++  i++与 x += 1完全不一样 对于x += 1，+优先于=，所以， x += 1等价于 x = x+1  同理，mango[i++] += y; +优先于=优先于++，因此mango[i]  = mango[i] + y;i++;  再不明白，去看运算优先符问题#include <stdio.h> int main(void) { 	int arr[3] = {0,0,0}, i = 0;  	(arr[i++]) += 1;  	printf("%d %d %d\n", arr[0], arr[1], arr[2]);  	return 0; } 好，那你看这个，(arr[i++])不是一个整体吗，既然 x += 1等价于 x = x+1那么为什么(arr[i++]) += 1;不是(arr[i++]) = (arr[i++]) +1;

忘了，[]也"优先"++

引用 3 楼 CS1024 的回复:运算优先符问题， mango[i]  = mango[i] + y;//先加  i++;//后自增这句正是我问的为什么和这样等价，我不知道的是为什么不是mango[i++] = mango[i++] + y;而是mango[i]  = mango[i] + y;i++； 运算符 x += 1 不是等价于 x = x+1 吗

引用 1 楼 lovesmiles 的回复:看一下置顶贴子吧，c++版块的置顶贴是专治你的问题的。  我简单回答一下你，i++这个行为++是要到一句语句结束了才会执行的，你上述的代码，不管中间有=号，有+号还是有什么号运算，都要语句结束了，才执行i++。  具体你还是看置顶贴子。你说的是http://bbs.csdn.net/topics/370153775这个吧，这个我看了，i++的副作用++不是要在序点之前完成吗？


Question: 字符串中单词的个数

引用 8 楼 Gloomy00my 的回复:[quote=引用 5 楼 u014444402 的回复:]  int GetWordNum( char str[] ) {     int num = 0; 	unsigned char space = 1;      	while ( *str ) 	{ 		if ( *str == ' ' ) 		{             space = 1; 		} 		else 		{ 			if ( space ) 			{                num++; 		       space = 0; 			} 		}  		str++; 	} 	return num;  }   如果单词与单词之间有多个空格  这个代码是不是就不对。。。[/quote] 提问没有错，可是你问这个代码对不对就错了，你不会试试啊？

你只用一个num来统计，当然不行了，字符串也是有长度的啊 参考一下别人的吧——http://blog.csdn.net/sxhelijian/article/details/7307580

引用 7 楼 Gloomy00my 的回复:[quote=引用 1 楼 xpdavis 的回复:] 一个循环搞定的事情呀，如果你是来求代码的话，那就很无语了。 不想动脑筋亲自写代码的话，怎么可能进步呢？或者考虑放弃做点别的吧 #include<stdio.h> int main() {char a[100]; int i,num=0; gets(a); for(i=0;*(a+i)!='\0';i++) {   	if(*(a+i)==' ')  	continue;  	else  	num++; } printf("单词的个数为：%d\n",num); }   这是我的代码   但它不对  [/quote] 用一个状态来记录单词状态，每次非单词状态（包括初始状态）进入单词状态的时候加1

引用 18 楼 mymtom 的回复:[quote=引用 17 楼 xpdavis 的回复:] 这么点小东西，居然惊动版主，楼主面子不小啊。这么简单的程序，还是建议初学者自己编写，每个人大牛都是从菜鸟开始的 其实我只是想推荐"The C Programing Language" 如果英语还凑合，这时最好的C语言入门书[/quote] 嗯嗯，强推 初学者要尽量自己写代码，这样进步才会看快

引用 17 楼 xpdavis 的回复:这么点小东西，居然惊动版主，楼主面子不小啊。这么简单的程序，还是建议初学者自己编写，每个人大牛都是从菜鸟开始的 其实我只是想推荐"The C Programing Language" 如果英语还凑合，这时最好的C语言入门书

只需要尽心三行改动，就可以得到一个wc函数  /**  * @file    wc.c  * @brief   count lines, words, and characters in input.  */  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define IN  1   /* inside a word */ #define OUT 0   /* outside a word  */   int wc(const char *s)                       /* TODO: 1 */ {     int c, nl, nw, nc, state;     const char *p = s;                  /* TODO: 2*/      state = OUT;     nl = nw = nc = 0;     while ( (c = *(p++)) != '\0') {     /* TODO: */         ++nc;         if (c == '\n')             ++nl;         if (c == ' ' || c == '\n' || c == '\t')             state = OUT;         else if (state == OUT) {             state = IN;             ++nw;         }     }     printf("%d %d %d\n", nl, nw, nc);      return 0; }   int main(int argc, char *argv[]) {     char *ptr;     char *buf;     char  line[128];      ptr = buf = malloc(1024 * 1024);     while (fgets(line, sizeof(line), stdin) != NULL) {         ptr += sprintf(ptr, "%s", line);     }      wc(buf);      free(buf);      return 0; }

参考 "The C Programing Language" 的例子吧！  /**  * @file    wc.c  * @brief   count lines, words, and characters in input.  */  #include <stdio.h>  #define IN  1   /* inside a word */ #define OUT 0   /* outside a word  */  int main(void) {     int c, nl, nw, nc, state;      state = OUT;     nl = nw = nc = 0;     while ( (c = getchar()) != EOF) {         ++nc;         if (c == '\n')             ++nl;         if (c == ' ' || c == '\n' || c == '\t')             state = OUT;         else if (state == OUT) {             state = IN;             ++nw;         }     }     printf("%d %d %d\n", nl, nw, nc);      return 0; }

参考《编译原理》中的词法分析和有限状态自动机。

在《c程序设计语言》上面有这个问题的讲解。我就给出我自己的代码。 /*************************************************************************     > File Name: nword.c     > Author: Jukay     > Mail: iloveyouljxcc@163.com      > Created Time: 2014年10月17日 星期五 12时33分29秒  ************************************************************************/ #define IN 1 #define OUT 0 #include<stdio.h> #include<string.h> int main() { 	char string[] = " Hi guys, Do you like programing by c"; 	int nword(const char *); 	printf("%d\n",nword(string)); 	return 0; }  int nword(const char *str) { 	int state =OUT; 	int nword=0; 	int i=0; 	for(;i < strlen(str);i++ ) 	{ 		if(state == OUT) 		{ 			if(str[i] !=' ') 			{ 				nword++; 				state =IN; 			} 		} 		if(state == IN) 		{ 			if(str[i] ==' ') 			{ 				state =OUT; 			} 		} 	} 	return nword; }

思路：用一个状态标记上一个字符是否是英文字符，如果如果当前字符为空格并且上个字符是字符，则单词数加一，状态改为假；如果当前字符不是空格，则状态改为真。 至于具体的代码就自己好好写一下啦~不懂再问吧~

引用 5 楼 u014444402 的回复: int GetWordNum( char str[] ) {     int num = 0; 	unsigned char space = 1;      	while ( *str ) 	{ 		if ( *str == ' ' ) 		{             space = 1; 		} 		else 		{ 			if ( space ) 			{                num++; 		       space = 0; 			} 		}  		str++; 	} 	return num;  }   如果单词与单词之间有多个空格  这个代码是不是就不对。。。

引用 1 楼 xpdavis 的回复:一个循环搞定的事情呀，如果你是来求代码的话，那就很无语了。 不想动脑筋亲自写代码的话，怎么可能进步呢？或者考虑放弃做点别的吧 #include<stdio.h> int main() {char a[100]; int i,num=0; gets(a); for(i=0;*(a+i)!='\0';i++) {   	if(*(a+i)==' ')  	continue;  	else  	num++; } printf("单词的个数为：%d\n",num); }   这是我的代码   但它不对

你看可以么。  #include <stdio.h> #include <string.h>  int main() { 	char chInfor[256] = "I'm  a     good student!"; 	char* p = strtok(chInfor, " "); 	int counter = 0; 	while (p != NULL) 	{ 		counter++; 		printf("%s\n", p); 		p = strtok(NULL, " "); 	} 	printf("%d\n", counter); 	return 0; }

对于初学者，不建议strtok LS的意思让他还没学会走，就要学会飞？

strtok就搞定了.  搜索msdn例子

大部分的做法都通过循环来实现的


Question: 请教关于自定义的类型大小问题

引用 2 楼 lovesmiles 的回复:类型里面的成员函数是不是不占大小？ 函数不占类的大小  函数名算指针的话是不是应该有4个字节大小？ 这句话是什么意思？所有的函数都不占空间，只有变量才点空间。 虚函数也不占空间，但是c++要实现虚函数的功能，隐藏了一个叫虚函数表指针的成员变量，也就是说只有带有虚函数的类都会多一个4字节的隐藏成员变量。   this指针怎么算？ 你想怎么算？指针的大小都是4字节，不管是什么指针 。一个类内部并没有this指针这种成员，所以计算类的大小也不用理它。  决定一个类的大小由下面几个因素：  1成员变量（包括继承来的） 2隐藏的虚函数表成员 3内存对齐方式瞬间明白了。

虚函数是要占空间的，在32位系统里面要占用四个字节 普通函数不占空间，this指针不是类成员


Question: 销毁链表时出现DAMAGE after narmal

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

引用 1 楼 lovesmiles 的回复:InitList(L);  MakeNode(tmp,i+1);         InsFirst(L.head,tmp);  有内存销毁二次了。检查上面这几个函数，自己断点看看就行了。 就是free  和 malloc没有对应上这样的问题。 2 3 4 5 6 我忘了说了，我用了引用，不是指针   Status MakeNode(Link &p,ElemType e); void FreeNode(Link &p); Status InitList(LinkList &L); Status DestroyList(LinkList &L);