Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 输出字符串中某一字符的个数，哪里出错了？

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  int main() {      char str[1000];     char a;     int sum = 0, i;     while(1)     {         gets(str);         scanf("%c", &a);         getchar();    /*接收输入a之后的回车符*/         int n = strlen(str);         sum = 0;         for(i = 0; i < n; i++)         {             if(str[i] == a || str[i] + 32 == a|| str[i] - 32 == a)             {                 sum++;             }         }         printf("%d\n",sum);     }     return 0; } 这是一个小细节，不容易发现；在输入a字符之后，会有一个回车符在输入缓存里，下次在输入字符串时，gets遇到了这个回车符，然后就立即结束了，所以没有数据进入str中，即字符传str为空； 以上是加了一句getchar()可以将输入缓存里的回车符接收了，这样下次就可以正常输入字符串了。 为了验证上面的描述是正确的，可以用一下代码验证，第二次输入的字符串的长度是否为空： #include <stdio.h> #include <string.h>  int main() {      char str[1000];     char a;     int sum = 0, i;     while(1)     {         gets(str);         int n = strlen(str);         printf("n = %d\n", n);         scanf("%c", &a);         //getchar();         sum = 0;         for(i = 0; i < n; i++)         {             if(str[i] == a || str[i] + 32 == a|| str[i] - 32 == a)             {                 sum++;             }         }         printf("%d\n",sum);     }     return 0; } 该代码仅供验证不加getchar()的问题

user: user-0
content: 哦，不区分大小写字母

user: user-0
content: 引用 3 楼 user-2 的回复:scanf 输入时最后留在缓冲区中的换行符\n被下一次gets接收了  在scanf后加上getchar()接收了换行符即可 谢谢，受教了

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:#include <stdio.h> #include <string.h>  int main() {      char str[1000];     char a;     int sum = 0, i;     while(1)     {         gets(str);         scanf("%c", &a);         getchar();    /*接收输入a之后的回车符*/         int n = strlen(str);         sum = 0;         for(i = 0; i < n; i++)         {             if(str[i] == a || str[i] + 32 == a|| str[i] - 32 == a)             {                 sum++;             }         }         printf("%d\n",sum);     }     return 0; } 这是一个小细节，不容易发现；在输入a字符之后，会有一个回车符在输入缓存里，下次在输入字符串时，gets遇到了这个回车符，然后就立即结束了，所以没有数据进入str中，即字符传str为空； 以上是加了一句getchar()可以将输入缓存里的回车符接收了，这样下次就可以正常输入字符串了。 为了验证上面的描述是正确的，可以用一下代码验证，第二次输入的字符串的长度是否为空： #include <stdio.h> #include <string.h>  int main() {      char str[1000];     char a;     int sum = 0, i;     while(1)     {         gets(str);         int n = strlen(str);         printf("n = %d\n", n);         scanf("%c", &a);         //getchar();         sum = 0;         for(i = 0; i < n; i++)         {             if(str[i] == a || str[i] + 32 == a|| str[i] - 32 == a)             {                 sum++;             }         }         printf("%d\n",sum);     }     return 0; } 该代码仅供验证不加getchar()的问题谢谢，受教了

user: user-2
content: scanf 输入时最后留在缓冲区中的换行符\n被下一次gets接收了  在scanf后加上getchar()接收了换行符即可
user-0 提问: leetcode detect capital

回复:
user: user-1
content: bool detectCapitalUse(char* word) {     int tag = 0, i = 0, count = 0; /* tag, i, count should be initized. */     while(word[i]!='\0') {         count++;         i++;     }      if (word[0] >= 65 && word[0] <= 90) {         for(i=0;i<count;i++)             if(word[i]>=65&&word[i]<=90) 		tag++;         if(tag==0||tag==count)             return true;         else             return false;     }     else     {         for(i=0;i<count;i++)         {             if(word[i]<=90) return false;         }         return true;     } } 似乎是对的，实际上还是不对的。 tag， i, count都没有初始化，很容易导致数组越界，程序无法继续执行的。

user: user-0
content: 初始化了还不对...
user-0 提问: 想问一下这个关于返回值、数组名和指针的问题

回复:
user: user-0
content: 引用 6 楼 user-3 的回复:[quote=引用 3 楼 weixin_37836059 的回复:] 我写int*编译没通过，  前面声明也要改  改了还是不能过发你的编译错误信息来[/quote] 捂脸

user: user-1
content: 数组名可以理解为（指针常量，指针常量不能做左值，所以数组名不能作为左值）； #include <stdio.h>  int *statistics(void);  char string[20];  int main() {     int *p;     printf("输入字符串:");     gets(string);     p = statistics();     puts("字母:\t数字:\t其他符号:\t");     printf("%d\t%d\t%d\n", *p, *(p+1), *(p+2));     system("pause");     return 0; }  int *statistics(void) {     int i;     static int stat[3];     for(i=0;string[i];i++)     {         if((string[i]>='a'&&string[i]<='z')||(string[i]>='A'&&string[i]<='Z'))             stat[0]++;         else if(string[i]>='0'&&string[i]<='9')             stat[1]++;         else             stat[2]++;     }     return stat; } 函数名定义和声明时，都需要是int *类型； 另外，gets函数不安全，建议使用fgets

user: user-2
content: 引用 3 楼 weixin_37836059 的回复:我写int*编译没通过，前面的函数声明和后面的定义，两处都写

user: user-0
content: 我写int*编译没通过，

user: user-3
content: 引用 3 楼 weixin_37836059 的回复:我写int*编译没通过，  前面声明也要改  改了还是不能过发你的编译错误信息来

user: user-3
content: int statistics()  要改成：  int* statistics()  用 int 返回值是错的  数组类型作为返回值会退化为指针类型

user: user-2
content: 应该返回指针，带星号的 返回整数有隐患
user-0 提问: 求科普 word 类型

回复:
user: user-1
content: 在 Windows 开发中，大写的 WORD 等同于 unsigned short。但不代表 word 在哪都是这个意义。有的语言里 word 是 unsigned long 即 32 位整数。

user: user-2
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。   typedef typedef type-declaration synonym;  The typedef keyword defines a synonym for the specified type-declaration. The identifier in the type-declaration becomes another name for the type, instead of naming an instance of the type. You cannot use the typedef specifier inside a function definition.  A typedef declaration introduces a name that, within its scope, becomes a synonym for the type given by the decl-specifiers portion of the declaration. In contrast to the class, struct, union, and enum declarations, typedef declarations do not introduce new types — they introduce new names for existing types.  Example  // Example of the typedef keyword typedef unsigned long ulong;  ulong ul;     // Equivalent to "unsigned long ul;"  typedef struct mystructtag {    int   i;    float f;    char  c; } mystruct;  mystruct ms;   // Equivalent to "struct mystructtag ms;"  typedef int (*funcptr)();  // funcptr is synonym for "pointer                            //    to function returning int"  funcptr table[10];   // Equivalent to "int (*table[10])();"

user: user-3
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 1 楼 wang0635 的回复:] 哪有这个类型 都是 typedef的 比如 typedef    word    unsigned int; 它就跟unsigned int一样了 是不是应该这样：typedef unsigned int word;  另外，word是占两个字节[/quote] 谢谢，我写错了

user: user-4
content: 引用 1 楼 wang0635 的回复:哪有这个类型 都是 typedef的 比如 typedef    word    unsigned int; 它就跟unsigned int一样了 是不是应该这样：typedef unsigned int word;  另外，word是占两个字节

user: user-5
content: 一般来说 word 是 unsigned short dword 是 unsigned long

user: user-3
content: 哪有这个类型 都是 typedef的 比如 typedef    word    unsigned int; 它就跟unsigned int一样了
user-0 提问: 求助，关于一个魔方的代码出现编译错误

回复:
user: user-0
content: 多谢了，成功了

user: user-1
content: int check(int n);  int main(){

user: user-2
content: 前面声明是：int check();  后面实现是：int check(int n)   把前面的声明改成：int check(int n); 即可

user: user-0
content: 引用 1 楼 wang0635 的回复:#include"stdio.h" #include"math.h"   int a[256][256]; int sum; int check(); <<<<<====== 这里的声明与后面的参数个数不同。后面有一个参数，这里没有 void ins(int n);    还是没有成功，不知道该怎么修改，初学C ，不是太懂

user: user-1
content: #include"stdio.h" #include"math.h"   int a[256][256]; int sum; int check(); <<<<<====== 这里的声明与后面的参数个数不同。后面有一个参数，这里没有 void ins(int n);
user-0 提问: int型不能用指数形式输出吗？

回复:
user: user-1
content: printf("%22.15e\n", s*1.0); 转换一下即可。

user: user-2
content: printf("%22.15e\n",(double)s);

user: user-0
content: 哦哦

user: user-3
content: 当然了，指数输出的是实数（float或double）
user-0 提问: 一维数组赋值问题（为什么x[0]!=0）

回复:
user: user-1
content: x[i+1]和y[i+1]越界了，把循环次数变成5，这样就不越界了。 x[0] != 0是什么意思？ 浮点数等于0的判断是：  /*双精度*/ if( abs(f) <= 1e-15 )     printf("f == 0\n"); /*单精度*/ if( abs(f) <= 1e-6 )     printf("f == 0\n");  http://blog.csdn.net/gogokongyin/article/details/51105745

user: user-2
content: x[i+1],y[i+1]越界，可能导致系统把其他内存分配给了x[0]。

user: user-3
content: 越界了     for(i=0;i<6;i++) {     x[0]=0.0;     y[0]=1.0; x[i+1]=x[i]+h; y[i+1]=y[i]+(h/(2+4*x[i]))*(-0.9*y[i]-0.982*0.9*y[i]/(1+2*x[i+1]));  // 这里  i== 5 时 越界了，  没有 y[6] ， y[6] 正好是指向 x[0] ,所以改的是x[0] 的值   }    x[0]=0.0;  y[0]=1.0; for(i=0;i< 5 ;i++) {          x[i+1]=x[i]+h;          y[i+1]=y[i]+(h/(2+4*x[i]))*(-0.9*y[i]-0.982*0.9*y[i]/(1+2*x[i+1]));   }

user: user-4
content: 因为数组y共有6个元素，从y[0]到y[5]。y[6]在逻辑上不是合法的，给y[6]赋值时就把其他的东西改了，有可能改的就是x[0]

user: user-0
content: 我的意思是x[0]=0.0;已经给他初值了，但是结果却是

user: user-4
content: for循环中i为5时，x[i+1]，y[i+1]下标越界了
user-0 提问: C中函数指针问题 求大神指教

回复:
user: user-0
content: 引用 4 楼 HHfight 的回复:[quote=引用 楼主 HHfight 的回复:] /* 邻接表存储的图 - DFS */   void Visit( Vertex V ) {     printf("正在访问顶点%d\n", V); }   /* Visited[]为全局变量，已经初始化为false */ void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ) {   /* 以V为出发点对邻接表存储的图Graph进行DFS搜索 */     PtrToAdjVNode W;           Visit( V ); /* 访问第V个顶点 */     Visited[V] = true; /* 标记V已访问 */       for( W=Graph->G[V].FirstEdge; W; W=W->Next ) /* 对V的每个邻接点W->AdjV */         if ( !Visited[W->AdjV] )    /* 若W->AdjV未被访问 */             DFS( Graph, W->AdjV, Visit );    /* 则递归访问之 */ } 为何要把visit当参数传入？ 但感觉不用函数指针对代码也没什么影响吧？[/quote] 谢谢呀

user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-0
content: 引用 楼主 HHfight 的回复:/* 邻接表存储的图 - DFS */   void Visit( Vertex V ) {     printf("正在访问顶点%d\n", V); }   /* Visited[]为全局变量，已经初始化为false */ void DFS( LGraph Graph, Vertex V, void (*Visit)(Vertex) ) {   /* 以V为出发点对邻接表存储的图Graph进行DFS搜索 */     PtrToAdjVNode W;           Visit( V ); /* 访问第V个顶点 */     Visited[V] = true; /* 标记V已访问 */       for( W=Graph->G[V].FirstEdge; W; W=W->Next ) /* 对V的每个邻接点W->AdjV */         if ( !Visited[W->AdjV] )    /* 若W->AdjV未被访问 */             DFS( Graph, W->AdjV, Visit );    /* 则递归访问之 */ } 为何要把visit当参数传入？ 但感觉不用函数指针对代码也没什么影响吧？

user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-1
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义或查找所有引用。

user: user-2
content: 这个地方类似函数调用； 函数指针是表示一类函数的指针
user-0 提问: C语言实践

回复:
user: user-1
content: 认真看书、练习，一点一点就会了。  C Primer Plus  C语言程序设计：现代方法：第2版(被誉为"近10年来最好的一部C语言著作") C和指针 或者谭浩强《C程序设计》 以上任选一本就差不多了，以下为参考书： 《深入理解C指针》 《C语言点滴》 《C陷阱与缺陷》 《C专家编程》 《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例

user: user-2
content: 百度搜相关关键字。
user-0 提问: reverse words in a string

回复:
user: user-1
content: 可以啊，你输入的时候这样写，hello空格world空格

user: user-2
content: if(a[i]=='\0') break;  这一句有问题 遇到字符串尾不应该直接跳出循环 而是应该检查结束前是否存在最后一个单词  并反转它  否则最后一个单次是无法输出的

user: user-0
content: 谢谢楼上，我已经改好了。只是自己的代码不会提交到leetcode上，第一次用。只有一个char* reverseWords(char* s)函数，该怎么改呢？

user: user-3
content: 通过运用这个回车符，可以将最后一个单词反转

user: user-3
content: #include<stdio.h> #include<string.h>  int main() {     char a[128];      fgets(a, 128, stdin);     int l = strlen(a);     char b[l];     int i,j,c=-1,d=0;      for(i = 0; i < l; i++)     {         if(a[i] == '\0')             break;         c++;         if(a[i] == ' ' || a[i] == '\n') {             for(j = 0; j < c; j++) {                 b[d + j] = a[i-1-j];             }             d = d + c;             b[d++] = ' ';             c = -1;         }     }     printf("%s",b);      return 0; }  之所以只对第一个单词反转，因为第二个单词后面没有空格，因为你的程序里只有遇到了空格才会反转；所以，在输入时注意在最后一个单词后面加空格； 考虑gets不安全，我用fgets代替，但fgets在最后会有一个回车符加入到缓存（当输入的数据少于字符数组长度时）

user: user-4
content: 你应该最后再判断是否为\0，这样改：   #include<stdio.h> #include<string.h> int main() { 	char a[1000]; 	gets(a); 	int l=strlen(a); 	char b[l]; 	int i,m,c=-1,d=0; 	for(i=0;i<100;i++) 	{ 		c++; 		if(a[i]==' ' || a[i]=='\0') 		{ 			for(m=0;m<c;m++) 			{ 				b[d+m]=a[i-1-m]; 			} 			d=d+c; 			b[d++]=' '; 			c=-1; 			if(a[i]=='\0') 				break; 		} 	} 	printf("%s",b);  	return 0; }
user-0 提问: 指针问题

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  char *stract(char *s,char *t);  int main() {     char *s;     char *t;      s = (char *)malloc(sizeof(char) * 64);     if (!s) {         fprintf(stderr, "malloc error!\n");         exit(-1);     }     t = (char *)malloc(sizeof(char) * 32);     if (!t) {         fprintf(stderr, "malloc error!\n");         exit(-1);     }      printf("please input character S：");     scanf("%s", s);     printf("please input character t:");     scanf("%s", t);     printf("%s\n", stract(s, t));     puts(s);      free(s);     free(t);     return 0; }  char *stract(char *s, char *t) {     char *tmp = s;     while (*s)    /* '\0' is equal 0 */         s++;      while(*s++ = *t++)         ;      return tmp; } 在堆上申请空间，并释放。程序问题主要是： 1. 重定义指针，需要给野指针赋值一个可用的内存空间； 2. 自定义函数没有返回值（void），那么就没有返回值。

user: user-1
content: 引用 2 楼 user-3 的回复: char stract(char *s,char *t) {     while(s != '\0'){         s++;     }     while(*s++ == *t++){         ;     }     return s; } 函数要有返回值，因为main函数中用到了 注意指针s最后指向了那？是不是先要保存一下s的地址，然后返回s传进来的初始地址？另外，返回值也应该是指针。看来直接把程序写出来，没测试吧。

user: user-2
content: 这样改吧：   #include<stdio.h> void stract(char *s,char *t);  int main() { 	char s[100]; 	char t[100]; 	printf("please input character S："); 	scanf("%s", s); 	printf("please input character t:"); 	scanf("%s", t); 	stract(s,t); 	printf("%s",s); 	return 0; }  void stract(char *s,char *t) { 	while(s != '\0'){ 		s++; 	} 	while(*s++ == *t++){ 		; 	} }

user: user-3
content: char stract(char *s,char *t) {     while(s != '\0'){         s++;     }     while(*s++ == *t++){         ;     }     return s; } 函数要有返回值，因为main函数中用到了

user: user-3
content: int main() {     char s[100];     char t[100];     printf("please input character S：");     scanf("%s", s);     printf("please input character t:");     scanf("%s", t);     printf("%s",stract(s,t));     return 0; } 必须有字符串的存储空间
user-0 提问: EOF的问题

回复:
user: user-1
content: 引用 5 楼 to_flydream 的回复:我还是有点不清楚，你说的这个我知道。可是为什么这个程序不写！=EOF会超时？？这是什么道理 说明使用末尾多了一个换行回车的数据作为输入测试你的程序。

user: user-0
content: 我还是有点不清楚，你说的这个我知道。可是为什么这个程序不写！=EOF会超时？？这是什么道理

user: user-2
content: 引用 3 楼 to_flydream 的回复:[code=c ]#include <stdio.h> #include <string.h> int number[30]; int reserve[30]; int prime[40]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1, 0,1,0,0,0,0,0,1,0,0}; void print(int n) { 	printf("1"); 	for(int i=2;i<=n;i++) 	{ 		printf(" %d",reserve[i]); 	} 	printf("\n"); 	return; } void dfs(int num,int n) { 	if(num==n) 	{ 		if(prime[reserve[num]+1]) 		{  			print(n); 			return;  		} 		else 		{ 			return ; 		} 	} 	for(int i=2;i<=n;i++) 	{ 		if(prime[i+reserve[num]]) 		{ 			if(!number[i]) 			{ 				number[i]=1; 				reserve[num+1]=i; 				dfs(num+1,n); 				number[i]=0; 			} 		} 	}  } int main() { 	int c=0; 	int n; 	reserve[1]=1; 	while(scanf("%d",&n)!=EOF) 	{ 		c++; 		memset(number,0,sizeof(number)); 		reserve[0]=1; 		printf("Case %d:\n",c); 		if(n%2==0) 		{ 			dfs(1,n); 		}	 		printf("\n"); 	} 	return 0; } [/code]    这是杭电oj的1016素数环的题目，如果不写！=EOF的话就会超时，写了的话就ac了 EOF这儿是需要键盘输入ctrl +d或者ctrl+z，windows和Linux会有不同

user: user-0
content: [code=c ]#include <stdio.h> #include <string.h> int number[30]; int reserve[30]; int prime[40]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1, 0,1,0,0,0,0,0,1,0,0}; void print(int n) { 	printf("1"); 	for(int i=2;i<=n;i++) 	{ 		printf(" %d",reserve[i]); 	} 	printf("\n"); 	return; } void dfs(int num,int n) { 	if(num==n) 	{ 		if(prime[reserve[num]+1]) 		{  			print(n); 			return;  		} 		else 		{ 			return ; 		} 	} 	for(int i=2;i<=n;i++) 	{ 		if(prime[i+reserve[num]]) 		{ 			if(!number[i]) 			{ 				number[i]=1; 				reserve[num+1]=i; 				dfs(num+1,n); 				number[i]=0; 			} 		} 	}  } int main() { 	int c=0; 	int n; 	reserve[1]=1; 	while(scanf("%d",&n)!=EOF) 	{ 		c++; 		memset(number,0,sizeof(number)); 		reserve[0]=1; 		printf("Case %d:\n",c); 		if(n%2==0) 		{ 			dfs(1,n); 		}	 		printf("\n"); 	} 	return 0; } [/code]     这是杭电oj的1016素数环的题目，如果不写！=EOF的话就会超时，写了的话就ac了

user: user-1
content: 提前确定了数据长度就不用判断EOF

user: user-2
content: EOF是文件结束标识，在读文件时会用到。建议把你的使用需求和背景说一下吧
user-0 提问: 用过Matlab MEX的，编译时出现了一个错误，需求帮助

回复:
user: user-1
content: 将错误信息中出现的标识符放在百度里面搜一下，看其在哪个.lib中，然后在本地硬盘上搜索该.lib,如果没有，在网上搜索相关库或模块下载安装，然后将其所在目录填写到“附加依赖库所在目录”中，将其名字添加到“附加依赖库”中，重新连接。 VS20xx： 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-0
content: 非常感谢赵老师的回复，我根据你给的建议，用源文件和头文件生成了所需的LIb库，成功完成了编译，万分感谢陈老师！
user-0 提问: 编译的时候提示头文件中 syntax error before numeric constant

回复:
user: user-1
content: 先不说头文件的问题，看到这个函数的参数个数，是目前我看到最多的一个。数了数16个形参，参数建议不要超过5个。如果多余5个，建议使用结构体了。 其他问题，贴出代码吧

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

user: user-3
content: 仅此一点，看不出来
user-0 提问: 字符串中字符倒叙排列，麻烦各位帮我看下

回复:
user: user-1
content: #include <stdio.h> #include <string.h>  void convert(char *str, int len); void convert2(char *str, int len);  int main( void ) {     char str[32] = "Hello world";      convert(str, strlen(str));     //convert2(str, strlen(str));     puts(str);      return 0; }  void convert(char *str, int len) {     int i;     int tmp;      for (i = 0; i < len / 2; i++) {         tmp = str[i];         str[i] = str[len - 1 - i];         str[len - 1 - i] = tmp;     } } void convert2(char *str, int len) {     int i, j;     int tmp;      for (i = 0, j = len - 1; i < j; i++, j--) {         tmp = str[i];         str[i] = str[j];         str[j] = tmp;     } } 倒序输出，两种实现方式，其实是类似的。

user: user-2
content: for循环中 for (i = 0; i < (n / 2); i++) n随着循环体中的--n而变化了 可以改成  int    cnt = n / 2; for (i = 0; i < cnt; i++)

user: user-3
content: 程序片段较多不要放贴图，直接用代码的功能（帖子编辑菜单栏倒数第6个图标）

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:#include <stdio.h> #include <string.h>  void convert(char *str, int len); void convert2(char *str, int len);  int main( void ) {     char str[32] = "Hello world";      convert(str, strlen(str));     //convert2(str, strlen(str));     puts(str);      return 0; }  void convert(char *str, int len) {     int i;     int tmp;      for (i = 0; i < len / 2; i++) {         tmp = str[i];         str[i] = str[len - 1 - i];         str[len - 1 - i] = tmp;     } } void convert2(char *str, int len) {     int i, j;     int tmp;      for (i = 0, j = len - 1; i < j; i++, j--) {         tmp = str[i];         str[i] = str[j];         str[j] = tmp;     } } 倒序输出，两种实现方式，其实是类似的。 谢谢，在百忙之中抽空帮我解答问题。

user: user-0
content: 引用 2 楼 wang0635 的回复:for循环中 for (i = 0; i < (n / 2); i++) n随着循环体中的--n而变化了 可以改成  int    cnt = n / 2; for (i = 0; i < cnt; i++)  十分感谢，我明白我哪里想错了。

user: user-0
content: 引用 1 楼 jianwen0529 的回复:程序片段较多不要放贴图，直接用代码的功能（帖子编辑菜单栏倒数第6个图标）谢谢第一次发帖。买了一本C Primer Plus，还在努力的啃。
user-0 提问: AddConsoleAlias

回复:
user: user-1
content: BOOL flag=AddConsoleAlias(TEXT("test"), TEXT("E:\\test.exe"), NULL); 这样吧，如果是要在 a.exe 里调用 test.exe 的话。 也看了网上的些例子，拿个 cd 命令来说事，所以第三个参数需要是 cmd.exe，毕竟 cd 只是 cmd.exe 里的个子命令，不是个独立的可执行程序。

user: user-0
content: 引用 5 楼 user-1的回复:不可能的啊，我试了是可以的。提示的是 test 还是 e:\test.exe 不是.... ？更可能是后者吧，你没把 test.exe 放到 E:\ 下？ 第三个参数指定为NULL之后返回了FALSE... 大佬加我QQ：1766087360，我发截图给你

user: user-1
content: 不可能的啊，我试了是可以的。提示的是 test 还是 e:\test.exe 不是.... ？更可能是后者吧，你没把 test.exe 放到 E:\ 下？

user: user-0
content: 引用 3 楼 qq_38052375的回复:[quote=引用 1 楼 user-1的回复:]BOOL flag=AddConsoleAlias(TEXT("test"), TEXT("E:\\test.exe"), NULL); 这样吧，如果是要在 a.exe 里调用 test.exe 的话。 也看了网上的些例子，拿个 cd 命令来说事，所以第三个参数需要是 cmd.exe，毕竟 cd 只是 cmd.exe 里的个子命令，不是个独立的可执行程序。 也不是不能....[/quote] 'test’不是内部或外部命令,也不是可运行程序或批处理文件

user: user-0
content: 引用 1 楼 user-1的回复:BOOL flag=AddConsoleAlias(TEXT("test"), TEXT("E:\\test.exe"), NULL); 这样吧，如果是要在 a.exe 里调用 test.exe 的话。 也看了网上的些例子，拿个 cd 命令来说事，所以第三个参数需要是 cmd.exe，毕竟 cd 只是 cmd.exe 里的个子命令，不是个独立的可执行程序。 也不是不能....

user: user-0
content: 引用 1 楼 user-1的回复:BOOL flag=AddConsoleAlias(TEXT("test"), TEXT("E:\\test.exe"), NULL); 这样吧，如果是要在 a.exe 里调用 test.exe 的话。 也看了网上的些例子，拿个 cd 命令来说事，所以第三个参数需要是 cmd.exe，毕竟 cd 只是 cmd.exe 里的个子命令，不是个独立的可执行程序。 真好，有人来回复了，感谢感谢
user-0 提问: 求大神指教！！！vigenere密码程序无法输出结果

回复:
user: user-1
content: #include<stdlib.h> #include<stdio.h> #include<string.h>  void Encry() {     char key[100];     char ch, temp;     int L, i = 0, j = 0;     if (getchar() == '\n')         temp = ' ';     printf("请输入密钥:");     gets_s(key,100);     //gets(key);     L = strlen(key);      printf("请输入明文:");      while ((ch = getchar()) != '\n')     {         if (ch == ' ')         {             i++;             continue;         }         if (ch >= 'a'&&ch <= 'z')         {             printf("%c", (ch + key[j%L] - 'a' - 'a') % 26 + 'A');             j++;         }         if (ch >= 'A'&&ch <= 'Z')         {             printf("%c", (ch + key[j%L] - 'a' - 'A') % 26 + 'A');             j++;         }         if (j%L == 0)             printf(" ");         i++;     }     putchar(ch); }  void Decry() {     char key[100];     char ch, temp;     int L, i = 0, j = 0;     if (getchar() == '\n')         temp = ' ';     printf("请输入密钥:");     gets_s(key,100);     //gets(key);     L = strlen(key);      printf("请输入密文:");      while ((ch = getchar())!= '\n')     {         if (ch == ' ')    /*此处不是赋值，而是判断 == */         {             i++;             continue;         }         if (ch >= 'A'&&ch <= 'Z')         {             printf("%c", (ch - key[j%L] - 'A' + 'a' + 26) % 26 + 'a');             j++;         }         if (j%L == 0)             printf("");         i++;     }     putchar(ch); }  int Exit() {     exit(0); }  int main() {     char ch;     for (;;)     {         printf("请输入操作  e:加密 d:解密 q:退出 ");         ch = getchar();         if (ch == 'e' || ch == 'E')             Encry();         else if (ch == 'd' || ch == 'D')             Decry();         else if (ch == 'q' || ch == 'Q')             Exit();         else         {             printf("输入命令错误");             putchar(getchar());             continue;         }     }     return 0; } 有一处问题，比较容易出错误。详见代码注释；

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

回复:
user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-1
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-2
content: #include <stdio.h>  int main() {     int i;     int src[60016];      FILE *fp = fopen("1_new.txt","r");     if (!fp) {         printf("can't open 1_new.txt\n");     }      for(i = 0; i < 60016; i++) {         fread(&src[i], 4, 1, fp);    /*每个数据4个字节*/         printf("%u\n", src[i]);     }      return 0; }

user: user-2
content: 使用fread读，那么该文件是用fwrite写入的吗？ 如果文件是有格式的，建议使用fscanf/fprintf进行读写； 如果是二进制的读写，建议使用fread/fwrite 如果是按行的建议使用fgets/fputs 把你的文件格式截取片段看一下～

user: user-0
content: 引用 楼主 m0_37789286 的回复:各位路过的大神请帮忙解答一下，感激不尽！ 一个文件txt类型  里面存的是图像数据  在windows下打开就是乱码的，但是matlab用函数可以将其读出来。现在我将这个文件在linux系统中用c语言的fread读，一个一个的读出来  结果在最后的600多个数就开始不对了，输出的的数值很大 感觉像是输出的内存地址，还望明白的大神指点一下 #include<stdio.h> int main() {  int a,i;     int src[60016];        FILE *fp=fopen("1_new.txt","r");    if(!fp)      {        printf("can't open 1_new.txt\n");      }     for(i=0;i<60016;i++)     {       fread(&src[i],2,1,fp);       printf("%u\n",src[i]);       } }  这是输出的部分数据：       128 30 56 204 1835598096 1600061710 1869807754 1952776232 132 210 4194517 145 27 64 241 308 4194536 83 4194329 154 而应该输出的是： 128 30 56 204 272 270 138 40 132 210 213 145 27 64 241 308 232 83 25 154 而且用fscanf读根本就读不出来  不知道为什么。。 之前用的fscanf读出错 怎么改都不对  我才用的fread读的 fread读前面都是对的只有后面不对呢   这数据虽然放在txt里但是打开它是乱码的 所以我也不知道具体应该用什么读

user: user-0

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 m0_37789286 的回复:] [quote=引用 3 楼 cfjtaishan 的回复:] 使用fread读，那么该文件是用fwrite写入的吗？ 如果文件是有格式的，建议使用fscanf/fprintf进行读写； 如果是二进制的读写，建议使用fread/fwrite 如果是按行的建议使用fgets/fputs 把你的文件格式截取片段看一下～ 最愁的就是那个文件的类型，他是被装到txt里   windows用记事本打开就是乱码的 但是matlab里用fread函数可以打开   然后 linux下打开直接有不可读字符  打开错误了呢  今天问了一下说应该是二进制   不是用fwrite写的  就是给了我一个txt 文件   [/quote] 里面的数据是什么？一个一个整数吗？[/quote] 我希望将他们读成一个一个整数16位的   file:///home/yujiaxin/%E6%A1%8C%E9%9D%A2/2017-04-12%2014-35-35%E5%B1%8F%E5%B9%95%E6%88%AA%E5%9B%BE.png

user: user-2
content: 引用 6 楼 m0_37789286 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] 使用fread读，那么该文件是用fwrite写入的吗？ 如果文件是有格式的，建议使用fscanf/fprintf进行读写； 如果是二进制的读写，建议使用fread/fwrite 如果是按行的建议使用fgets/fputs 把你的文件格式截取片段看一下～ 最愁的就是那个文件的类型，他是被装到txt里   windows用记事本打开就是乱码的 但是matlab里用fread函数可以打开   然后 linux下打开直接有不可读字符  打开错误了呢  今天问了一下说应该是二进制   不是用fwrite写的  就是给了我一个txt 文件   [/quote] 里面的数据是什么？一个一个整数吗？

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:使用fread读，那么该文件是用fwrite写入的吗？ 如果文件是有格式的，建议使用fscanf/fprintf进行读写； 如果是二进制的读写，建议使用fread/fwrite 如果是按行的建议使用fgets/fputs 把你的文件格式截取片段看一下～ 最愁的就是那个文件的类型，他是被装到txt里   windows用记事本打开就是乱码的 但是matlab里用fread函数可以打开   然后 linux下打开直接有不可读字符  打开错误了呢  今天问了一下说应该是二进制   不是用fwrite写的  就是给了我一个txt 文件

user: user-3
content: txt类型文件你按二进制文件读肯定不对
user-0 提问: json_object_add()后的json_object对象怎么没有随父对象的释放而释放

回复:
user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:new、delete 对应 借、还 而不对应 创建、销毁。 赵老师，您的意思是，new_field内存可以访问，但是最后的访问不太安全，对吗？

user: user-1
content: new、delete 对应 借、还 而不对应 创建、销毁。

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

user: user-0
content: 引用 4 楼 u013910218 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] new、delete 对应 借、还 而不对应 创建、销毁。 赵老师，您的意思是，new_field内存可以访问，但是最后的访问不太安全，对吗？[/quote] 谢谢老师，分数稍后就给！

user: user-1
content: 你过去租住过的房子合同到期已经退租了，你现在拿着过去的钥匙开门进去，接下来会发生什么呢？

user: user-0
content: 自己顶一下。大神们来帮忙啊
user-0 提问: 大哥来看看

回复:
user: user-1
content: 引用 5 楼 yi19861209 的回复:我不会才问 我的意思是别用数组作为函数参数和返回值。

user: user-2
content: 引用 1 楼 zhao4zhong1 的回复:请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？ 赵4老师又调皮了

user: user-0
content: 我不会才问

user: user-3
content: float (*n)[]  改成：  float (*n)[5]  不能省略   #include<stdio.h> int main() { 	float ty(float (*n)[5]); 	float a[4][5]={{79,77,56,43,86},{47,87,99,75,45},{43,76,23,54,76},{86,90,85,99    }}; 	float (*p)[5],k;                                                   //(*p)[5]这里为什么不是“(*p)[4]”，a[4][5]不是4行吗？ 	p=a; 	k=ty(p); 	printf("%f\n",k); 	return 0; }  float ty(float (*n)[5]) { 	int i; 	float h; 	for(i=0;i<4;i++) 	{ 		printf("* %f\n",*(*(n+i)+0)); 		h=h+*(*(n+i)+0);                       //19:6: 错误：对未指定边界的数组的使用无效 	}   	h=h/5; 	return h; }

user: user-4
content: #include<stdio.h>   float ty(float (*n)[5]); int main(void) {     float a[4][5] = {         {79,77,56,43,86},         {47,87,99,75,45},         {43,76,23,54,76},         {86,90,85,99 }     };     float (*p)[5], k;     p = a;     k = ty(p);     printf("%f\n", k);     return 0; } float ty(float (*n)[5]) {     int i;     float h = 0.0;      for(i = 0; i < 4; i++) {         printf("* %f\n", *(*(n+i)+0));         printf("* %f\n", n[i][0]);         h = h + *(*(n+i)+0);     }     h = h / 5;      return h; } 参数是二维数组的传参，需要将形参的列数告知，不然对于一个数组其不知道应该分配多少列数据。列数可以不确定。 float (*p)[5]; 这个5是列数，即这个是一个数组指针，指向一个列数为5个数组指针。概念上和指针数组容易混淆（int *p[5]) ty函数里，h为初始化，那么它是一个随机值。 注意代码风格～

user: user-1
content: 请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？
user-0 提问: 求解分段函数问题

回复:
user: user-1
content: 代码风格很关键。

user: user-2
content: #include<stdio.h> main() { int x,y; scanf("%d",&x); if (x>0) { y=2*x+1; printf("y=%d",y); } else  if (x<0) { y=-x-1; printf("y=%d",y); } else { y=0; printf("y=0"); } }

user: user-3
content: #include<stdio.h>  int main(void) {     int x,y;      scanf("%d",&x);      if (x > 0) {         y = 2 * x + 1;         printf("y = %d\n",y);     } else if (x < 0){         y = -x - 1;         printf("y = %d\n", y);     } else {         y=0;         printf("y = %d\n", y);     }      return 0; }   原因是缺少括号，没有将y = 0;和输出y的值放在同一判断条件里。 以上是修改后的代码，注意代码风格；

user: user-4
content: 没有啊，是你最后的：printf("y=0"); 这句输出的0
user-0 提问: 关于三角形求面积的问题

回复:
user: user-1
content: 你的问题是程序的警告你不明白，还是三角形的计算你不明白

user: user-2
content: sqrt返回值类型是double，S类型是float，所以有警告。 因为可能造成有效数字位数的减少，也不能忽略它。 如果确定用不着那么多的有效数字，那就强制转换，S = (float)sqrt(....); 否则，S直接声明为double类型。

user: user-3
content: warning 而已啊
user-0 提问: 求助各位大佬，有关于xbmc播放器源码编译问题~~（C++）

回复:
user: user-1
content: https://sourceforge.net/projects/boost/files/boost/1.63.0/ 下载文件boost_1_63_0.7z，使用好压软件解压到C:\ 有shared_ptr.hpp文件： C:\boost_1_63_0\boost\shared_ptr.hpp

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:也许是因为你安装的不是boost源代码而是boost二进制包。 老师，我这个boost库是从网上下载下来的，所以不太清楚究竟是什么情况，什么状态的包包，我这个项目也是从网上下来的开源项目，出现配置的问题再正常不过了，所以才想跟您讨要解决的办法，虽然问题没什么进展，但是也是真的感谢您的热心帮助

user: user-1
content: 也许是因为你安装的不是boost源代码而是boost二进制包。

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:比如你将boost安装到 C:\boost_1_38_0文件夹下 shared_ptr.hpp文件的绝对路径： C:\boost_1_38_0\boost\shared_ptr.hpp 设置 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 为 原来内容;C:\boost_1_38_0 或 原来内容;C:\boost_1_38_0\您好老师，十分感谢您的回帖，根据您的提醒以及指导，我按照并且执行后，错误仍然存在，已经打扰您很多宝贵的时间，所以不好意思再多加打扰，万分感谢您对我的帮助，结贴

user: user-2

user: user-1
content: 比如你将boost安装到 C:\boost_1_38_0文件夹下 shared_ptr.hpp文件的绝对路径： C:\boost_1_38_0\boost\shared_ptr.hpp 设置 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 为 原来内容;C:\boost_1_38_0 或 原来内容;C:\boost_1_38_0\

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项 by the way，我在项目中已经搜索过了，确实不存在shared_prt.hpp文件，所以仍一头雾水

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项  十分感谢老师耐心的解答，本人小白一个，问的比较粗显，希望您能多担待，看到了您的答案，理解是肯定理解的，操作的步骤也都清楚，但是由于这个不是自己的项目，是一个下载的开源项目，所以对有关头文件以及附加库的所在目录都不是特别清楚，如果您能够在百忙之中抽出时间，更加细微的指导小生一二，小生将不胜感激，分值肯定是给您了，多谢

user: user-1
content: 项目、属性、C/C++、附加包含目录：填写附加头文件所在目录 分号间隔多项 项目、属性、链接器、常规、附加库目录：填写附加依赖库所在目录 分号间隔多项 项目、属性、链接器、输入、附加依赖项：填写附加依赖库的名字.lib 空格或分号间隔多项

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:安装boost大佬，我试过了，去网上新下载了一个boot库，并且也按照网上的知道进行路径设置，但是还是出现相同的错误 请大神费心指导一下~

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:安装boost好的~~我先来试一下，谢谢您咯~

user: user-1
content: 安装boost

user: user-0
content: 大佬们快来哦~~~大佬们快来哦~~~~~~
user-0 提问: C语言里面对二维数组的初始化

回复:
user: user-1
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组

user: user-2
content: 初始化赋值后，数组中其他的数会被赋值为0，如果是循环每个赋值的时候只是改变当前数组值。

user: user-3
content: int a[10][10]={{1},{1},{1},{1},{1},{1},{1},{1},{1},{1}}; //每行第一个元素初始化为1，其余为0 for(i=0;i<10;i++)  {  a[i][0]=1;  a[i][i]=1;  } //每行第一个元素和最后一个元素初始化为1，其余为未初始化，为随机的垃圾值

user: user-4
content: void YH() { 	int a[10][10]; 	int i,j,k; 	for(i=0;i<10;i++) 	{ 		a[i][0]=a[i][i]=1; 		for(j=1;j<=i-1;j++) 			a[i][j]=a[i-1][j-1]+a[i-1][j]; 	} 	for(i=0;i<10;i++) 	{ 		for(j=0;j<=i;j++) 			printf("%4d",a[i][j]); 		printf("\n"); 	}  } 可以直接在for里复制 只是在算具体列的值时，j循环要从1开始 i-1结束

user: user-0
content: 谢谢各位的解答~~ 刚才弄了一下~把下面代码 for(i=0;i<10;i++)  {  a[i][0]=1;  a[i][i]=1;  }    改成  for(i=0;i<10;i++)  {      for(j=0; j<10; j++)     {     	if(i==j)         a[i][j]=1;         else         a[i][j]=0;      }  } 这样子加上后面的语句就能跑出来了啦~ THX各位

user: user-5
content: a[i][0]=1; a[i][i]=1; 你只赋值了一列和一个对角线，其他都是未定义的

user: user-6
content: #include <stdio.h> #include <string.h> int main() {     int i,j,a[10][10];      memset(a, 0, sizeof(a));     /* 列的第一个元素*/     for (i = 0; i < 10; i++)         a[0][i] = 1;     /*     for(i=0;i<10;i++)     {         a[i][0]=1;         a[i][i]=1;     }     */      for(i = 1; i < 10; i++)         for(j = 1; j < 10; j++)             a[i][j] = a[i-1][j]+a[i-1][j-1];      for(i=0;i<10;i++)     {         for(j=0;j<10;j++)             if(a[i][j]!=0)                 printf("%4d",a[i][j]);         printf("\n\n");     }      return 0; } 数组若不对其初始化，里面的元素都是随机值，所以输出的内容有很多随机值。 对每列的第一个元素赋值为1，那么就是a[0][i] = 1;

user: user-7
content: 在初始化多维数组a的代码中 for(i=0;i<10;i++) { a[i][0]=1; a[i][i]=1; } 并没有把a中的所有元素都初始为1，改为 for(i=0;i<10;i++) {     for(j=0; j<10; j++)    {        a[i][j]=1;     } } 试试

user: user-8
content: 昨晚想了一宿，能想到的就是数组其他元素没有初始化，跟楼上大神回复一样

user: user-8
content: 插眼，同样不懂！                  来自萌新
user-0 提问: c语言释放内存不彻底问题

回复:
user: user-1
content: for（i=0;i<10;i++）    free( qtest[i].aa);//释放 free(qtest);

user: user-2
content: 两次动态分配的内存，需要分别两次释放。 再此种情况下，实现同样的功能，可以采用另一种方法，再结构体内使用0长度数组。 typedef struct {        int  num ;       char aa[0];      //char aa[] } TEST;  malloc(sizeof(TEST)+size_buff);用一个malloc将全部内存分配出来，之后一次释放解决问题。  size_buff  就是你所需要分配aa地址的内存大小

user: user-3
content: 跟租房子差不多。

user: user-4
content: 上面的描述有歧义的地方， 请看这段文字：释放空间并不能说明里面的数据就会跟着改变；申请空间和释放空间需要配合使用，否则可能会导致内存溢出 申请空间，申请之后的内存空间，那么该空间不能被其他使用。 释放空间，释放之后，只是说明别人可以再次申请这部分已经释放的空间，如果该空间没有被申请，那么里面的数据就不会改变。除非，其他程序或者变量申请了这部分空间，并且往这部分空间里写数据了，才会覆盖之前的数据。 所以，说释放了不能说明里面的数据就变化了，主要还看该内存是否被再次申请并用新的数据覆盖了。 对于释放之后，并想告知这部分空间不能用了，可以将其指针指向NULL，那么再次使用，比如查看里面的数据就会出错。

user: user-4
content: 释放空间并不能说明里面的数据就会跟着改变；申请空间和释放空间需要配合使用，否则可能会导致内存溢出 申请空间，申请之后的内存空间，那么该空间不能被其他使用。 释放空间，释放之后，只是说明别人可以再次申请这部分已经释放的空间，如果该空间没有被申请，那么里面的数据就不会改变。除非，其他程序或者变量申请了这部分空间，并且往这部分空间里写数据了，才会覆盖之前的空间。 所以，说释放了不能与里面的数据就变化了，主要还看是否被申请并用新的数据覆盖了。 对于释放之后，并想告知这部分空间不能用了，可以将其指针指向NULL，那么再次使用，比如查看里面的数据就会出错。

user: user-5
content: malloc多少次就free多少次，哪个指针malloc就free哪个。qtest[i].aa一个都没有释放，另外，也不能用打印能判断是否释放，能打印说明不了任何问题，没崩溃只是你运气好。

user: user-6
content: qtest[i].aa也要记得释放  还有你怎么判断qtest[1]-qtest[9]没被释放？
user-0 提问: 一个简单c语言程序问题

回复:
user: user-1
content: //    A //   ABA //  ABCBA // ABCDCBA //ABCDEDCBA #include <stdio.h> #include <conio.h> int n,h,s,i; int main() {     while (1) {         printf("Please input a character(A-Z):");         fflush(stdout);         rewind(stdin);         scanf("%c",&n);         if ('A'<=n && n<='Z') {             for (h=0;h<n-'A'+1;h++) {                 for (s=n-'A'-h;s>0    ;s--) printf(" "   );                 for (i='A'    ;i<'A'+h;i++) printf("%c",i);                 for (i='A'+h  ;i>='A' ;i--) printf("%c",i);                                             printf("\n"  );             }             getch();             break;         }     }     return 0; }

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int main(void) { 	int		lines; 	scanf("%d", &lines);  	for (int i = 0; i < lines; i++) 	{ 		int		j; 		for (j = 0; j < lines - i - 1; j++) 			printf(" "); 		for (j = 0; j < i; j++) 			printf("%c", 'A' + j); 		for (; j >= 0; j--) 			printf("%c", 'A' + j); 		printf("\n"); 	}  	return 0; }

user: user-3
content: 和杨辉三角形一样的写法

user: user-4
content: https://zhidao.baidu.com/question/1864262201889128547.html
user-0 提问: 求解点到曲线的垂直距离及垂足，类似于arcgis中的近邻分析

回复:
user: user-1
content: 引用 2 楼 yedasha 的回复:定义是 设曲线外一点P，曲线上有一点A，过点A做曲线的切线，能使切线与AP垂直，求解AP的长度及点A的坐标。  这样的点A可以不止一个吧？ 曲线公式未知，我觉得不可能。

user: user-2
content: 计算几何大牛:http://www.codeproject.com/KB/recipes/Wykobi.aspx

user: user-0
content: 定义是 设曲线外一点P，曲线上有一点A，过点A做曲线的切线，能使切线与AP垂直，求解AP的长度及点A的坐标。

user: user-1
content: 点到曲线的垂直距离，定义是什么？ 不会是点到曲线两个端点连线线段的垂直距离？
user-0 提问: 关于严蔚敏c数据结构的一些问题，请高人指教一下

回复:
user: user-1
content: 《数据结构（C语言描述）》

user: user-2
content: 引用 3 楼 qq_38007994 的回复:[quote=引用 1 楼 user-3的回复:]对，是另外一些函数。 另外这是伪代码，很多局部变量没有声明，还用了c++的引用 那你说我是懂里面的思想就好，好事把伪代码都弄透，并且编程实现的好。我的学习数据结构时间不是很多。[/quote] 首先应该理解它的思想，思路，也就是方法；这样我们在在写的时候才能有思路，但这也只是停留在想得基础上，编程不能只是思想家，更要是实战家，建议了解思路之后，用一种语言去实现一下，这样对思想会更深入的理解和记忆

user: user-0
content: 引用 1 楼 user-3的回复:对，是另外一些函数。 另外这是伪代码，很多局部变量没有声明，还用了c++的引用 那你说我是懂里面的思想就好，好事把伪代码都弄透，并且编程实现的好。我的学习数据结构时间不是很多。

user: user-0
content: 那你说我是懂里面的思想就好，好事把伪代码都弄透，并且编程实现的好。我的学习数据结构时间不是很多。

user: user-3
content: 对，是另外一些函数。 另外这是伪代码，很多局部变量没有声明，还用了c++的引用
user-0 提问: 找二叉树中序遍历最后一个结点

回复:
user: user-0
content: 代码如下 #include<stdio.h> #include<stdlib.h> typedef char datatype; typedef struct tnode { 	datatype data; 	struct tnode *lchild, *rchild; } BiTNode, *BiTree;  void visit(BiTree p);   /*输出p指针指向的结点*/ void Preorder(BiTree T);   /*前序遍历*/ void Inorder(BiTree T);   /*中序遍历*/ void Postorder(BiTree T);   /*后序遍历*/ BiTree  CreateTree();   /*以前序遍历的顺序建立二叉树*/ int deep(BiTree T);   /*求二叉树深度*/ int leaf(BiTree T);   /*求叶子结点数*/ int OneChild(BiTree T);   /*求1度结点数*/ int TwoChild(BiTree T);   /*求2度结点数*/ void Exchange(BiTree  T);   /*二叉树左右子树交换*/ BiTree InorderLastNode(BiTree T);  /*找二叉树中序遍历最后一个结点*/  void visit(BiTree p) {       /*输出p指针指向的结点*/ 	if (p->data != ' ') { 		printf("%c ", p->data); 	} }  void Preorder(BiTree T) {    /*前序遍历*/ 	if (T != NULL) {    		visit(T);            //访问根节点 		Preorder(T->lchild); //访问左子节点 		Preorder(T->rchild); //访问右子节点 	} }  void Inorder(BiTree T) {     /*中序遍历*/ 	if (T != NULL) { 		Inorder(T->lchild);  //访问左子节点 		visit(T);            //访问根节点 		Inorder(T->rchild);  //访问右子节点 	} }  void Postorder(BiTree T) {   /*后序遍历*/ 	if (T != NULL) { 		Postorder(T->lchild); //访问左子节点 		Postorder(T->rchild); //访问右子节点 		visit(T);             //访问根节点 	} }  BiTree CreateTree() {          /*以前序遍历的顺序建立二叉树*/ 	char ch; 	BiTree T; 	if ((ch = getchar()) == ' ') { 		return NULL; 	} 	else { 		T = (BiTree)malloc(sizeof(BiTNode));   //生成根节点 		T->data = ch;           		T->lchild = CreateTree();   //构造左子树 		T->rchild = CreateTree();   //构造右子树 		return T; 	} }  int deep(BiTree T) {           /*求二叉树深度*/ 	if (T) { 		int leftdeep = deep(T->lchild); 		int rightdeep = deep(T->rchild); 		return leftdeep >= rightdeep ? leftdeep + 1 : rightdeep + 1; 	} 	else { 		return 0; 	} }  int leaf(BiTree T) {           /*求叶子结点数*/ 	int m, n; 	if (!T) {   /*空树没有叶子*/ 		return 0; 	} 	else if(!T->lchild&&!T->rchild){   /*叶子结点*/ 		return 1; 	} 	else {   /*左子树的结点数加上右子树的结点数*/ 		m = leaf(T->lchild); 		n = leaf(T->rchild); 		return m + n; 	} }  int OneChild(BiTree T) {      /*求1度结点数*/ 	int n = 0; 	if (T == NULL) { 		return 0; 	} 	else if ((T->lchild == NULL&&T->rchild != NULL) || (T->lchild != NULL&&T->rchild == NULL)) { 			n = 1; 	} 	return OneChild(T->lchild) + OneChild(T->rchild) + n; }  int TwoChild(BiTree T) {      /*求2度结点数*/ 	int n = 0; 	if (T == NULL) { 		return 0; 	} 	else if ((T->lchild!=NULL&&T->rchild!=NULL)) 	{ 		n = 1; 	} 	return TwoChild(T->lchild) + TwoChild(T->rchild) + n; }  void Exchange(BiTree  T) {    /*二叉树左右子树交换*/ 	if (!T) { 		BiTree temp = T->lchild; 		T->lchild = T->rchild; 		T->rchild = temp; 		Exchange(T->lchild); 		Exchange(T->rchild); 	} }  BiTree InorderLastNode(BiTree T) {   /*找二叉树中序遍历最后一个结点*/  }  int main() { 	BiTree T; 	printf("\n以前序遍历的二叉树:"); 	T = CreateTree(); 	printf("\n先序遍历:"); 	Preorder(T); 	printf("\n"); 	printf("\n中序遍历:"); 	Inorder(T); 	printf("\n"); 	printf("\n后序遍历:"); 	Postorder(T); 	printf("\n"); 	printf("\n树的深度=%d\n", deep(T)); 	printf("1度结点数=%d\n", OneChild(T)); 	printf("2度结点数=%d\n", TwoChild(T)); 	Exchange(T); 	printf("\n"); 	Inorder(T); 	printf("二叉树中序遍历最后一个结点=%c\n", InorderLastNode(T)); 	return 0; }
user-0 提问: 帮我看看这个程序哪里有问题

回复:
user: user-1
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。 判断是否越界访问，可以在数组的最后一个元素之后对应的地址处设置数据读写断点。如果该地址对应其它变量干扰判断，可将数组多声明一个元素，并设置数据读写断点在该多出元素对应的地址上。 #include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

user: user-0
content: 引用 3楼自信男孩 的回复:游戏币变量名不是猴子(monkey)，应该是money吧； rewind(stdin);         scanf("%d", &i);         i--; 这句还有有问题的，若输入的是100，后面用到i的地方就会越界； 后面用到count的地方，它是一个全局变量，默认值是4，也是定义的数组长度。若，对其count++那么再次使用它做下标时，就会越界； 个人建议，不要用太多的全局变量。能用局部的尽量使用局部变量，通过参数传递来实现；这样一方面对数据来讲比较安全，另一方面阅读起来还比较好一些。为什么i输入100，之后会越界。count++，再做下标为什么也会越界

user: user-0
content: 引用 5楼我是你的主体 的回复:[quote=引用 2楼幻夢之葉 的回复:]            if (p == 0)             {                 strcpy(backpack[count].name, market[i].name);                 backpack[count].number = 1;                 count++;             }  1：数组越界 2：backpack[count].name 数组的大小是7个字符，而且指向的是常量区字串（三个中文字 + 一个结束符） 先不说能不能修改，那它也不够存储market[i].name里面的字符串啊多谢，加了句backpack[count].name =（char*)malloc(50);解决问题了[/quote]前面定义backpack数组大小定义为20

user: user-0
content: 引用 2楼幻夢之葉 的回复:if (p == 0)             {                 strcpy(backpack[count].name, market[i].name);                 backpack[count].number = 1;                 count++;             }  1：数组越界 2：backpack[count].name 数组的大小是7个字符，而且指向的是常量区字串（三个中文字 + 一个结束符） 先不说能不能修改，那它也不够存储market[i].name里面的字符串啊多谢，加了句backpack[count].name =（char*)malloc(50);解决问题了

user: user-2
content: 使用strcpy的地方都会出现段错误，因为定义全局变量的地方都是字符常量，没有在内存里申请有效的空间。如下： Market market[NUM] = {     {"双倍经验卡",20,5},     {"幸运宝石",15,5},     { "五行转换卡",10,5},     { "银两袋子",5,5},   };   Backpack backpack[] = {     {"蓝水晶",10},     { "红水晶",15 },     { "绿水晶",18 },     { "紫水晶",12 }, }; 建议你把自己的构思在重新梳理一遍，不能想到哪儿就写到哪儿。整体有一个框架

user: user-2
content: 游戏币变量名不是猴子(monkey)，应该是money吧； rewind(stdin);         scanf("%d", &i);         i--; 这句还有有问题的，若输入的是100，后面用到i的地方就会越界； 后面用到count的地方，它是一个全局变量，默认值是4，也是定义的数组长度。若，对其count++那么再次使用它做下标时，就会越界； 个人建议，不要用太多的全局变量。能用局部的尽量使用局部变量，通过参数传递来实现；这样一方面对数据来讲比较安全，另一方面阅读起来还比较好一些。

user: user-3
content: if (p == 0)             {                 strcpy(backpack[count].name, market[i].name);                 backpack[count].number = 1;                 count++;             }  1：数组越界 2：backpack[count].name 数组的大小是7个字符，而且指向的是常量区字串（三个中文字 + 一个结束符） 先不说能不能修改，那它也不够存储market[i].name里面的字符串啊

user: user-0
content: 头文件还有一个string，没复制进去
user-0 提问: 关于getchar()的用法

回复:
user: user-1
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 [code=c]//请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。 [/code]

user: user-2
content: 标准输入流中带有缓存，最后scanf只是把除了回车符之外的其他字符都吃了，scanf语句执行完之后，缓存里面还是有个回车符，随意要用getchar()来吃掉回车符。         你这样想，getchar()是阻塞的，这个库函数应该等着你在键盘输入字符后才会执行完，为什么你在终端值等到sancf这个语句让你输入字符，而getchar()这条语句就直接过去了。

user: user-3
content: (stdin)

user: user-3
content: fflush(sdin);

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

user: user-4
content: 这是关于scanf函数缓冲区的问题，当你从键盘输入完数据之后，敲下回车，结果换行符被放入了缓冲区中，只不过因为输入格式是以%某某，所以换行符 不起作用，所以这里的getchar可以说是多余的，不过当输入格式不是以%×××，那么回车符就当作一个字符，进行匹配，赋值，那么这里的getchar就是为了防止回车符匹配成功后造成的问题，就是相当于用getchar读取上一步输入的回车符，getchar也是有缓冲区的，若缓冲区没有数据会等待用户输入，而上一步留下来的回车符在缓冲区内，所以getchar直接读取它，最后说一句，因为再此程序中，回车符匹配不成功，所以getchar在这里同样没什么鸟用的哦哦。

user: user-5
content: 你除了输入需要的数据外还按了一个回车，这个回车如果是后续还有输入就会产生影响， getchar（）确实是来吃掉这个回车用的，注意 后续的输入如果是%c有影响，%d还是没有影响的，因为%d不可读取回车

user: user-6
content: 这里不需要用，因为你后续再也没有读取的操作了，所以那个回车键是否被清除出输入流无关紧要  但是你后续如果有读取 字符/字符串的操作 的时候需要注意这个问题。

user: user-7
content: 是吃掉最后输入的回车符。原因是这个输入你只输入一次，若需要输入多次（>=2)就会有问题，就能看出getchar()的需要了。 #include <stdio.h>   int main(void) {     char chA,chB;     int a,b;     int i = 0;      while (i < 3) {         scanf("%c%3d%c%2d",&chA,&a,&chB,&b);         //getchar();         b += a;         printf("%c%c",chA,chB);         printf("%d\n",b);         i++;     }      return 0; } 试一下这个，加上和不加的区别。
user-0 提问: 大神们，关于出栈的问题

回复:
user: user-0
content: 引用 7楼自信男孩 的回复:[quote=引用 6 楼 pkuzhx 的回复:] 你压根就没搞明白题目是啥意思。 如果e1~e6是连续入栈，中间没有出栈操作，那么出栈顺序当然就是e6~e1。 题目这么问了，那显然入栈、出栈的操作是混在一起的，不是全部都入栈了才出栈，可能先入两个，出一个，再入两个，再出三个等等。 说到这里，具体怎么分析你应该知道了 嗯，这位兄台分析的比较到位。需求里已经有体现，并不是中间没有出栈情况，所以这个出栈顺序还得看你的实际中有没有是出栈和入栈混合进行的。[/quote]哦，可以入宅接着出宅，题目看懂了，出宅的顺序题目已经给出来了，是我理解错了，最少只有三个的存储空间，

user: user-0
content: 引用 8楼angel6709 的回复:[quote=引用 4 楼 qq_36639412 的回复:] [quote=引用 3 楼 angel6709 的回复:] 这个要看代码的。。。 设栈S和队列Q的初始状态为空，元素E1,E2,E3,E4,E5,E6,依次通过栈S，一个元素出栈后即进入队列后Q，若6个元素出列的顺序为E2,E4,E3,E6,E5,E1,则栈的容量至少是多少，A，6，B，4，C，3，D，2，[/quote]  4，3，1或6,5,1 选c[/quote]嗯

user: user-0
content: 引用 10楼wedragon 的回复:入栈中夹杂着出栈，就会出现这种情况。哦

user: user-1
content: 引用 6 楼 pkuzhx 的回复:你压根就没搞明白题目是啥意思。 如果e1~e6是连续入栈，中间没有出栈操作，那么出栈顺序当然就是e6~e1。 题目这么问了，那显然入栈、出栈的操作是混在一起的，不是全部都入栈了才出栈，可能先入两个，出一个，再入两个，再出三个等等。 说到这里，具体怎么分析你应该知道了 嗯，这位兄台分析的比较到位。需求里已经有体现，并不是中间没有出栈情况，所以这个出栈顺序还得看你的实际中有没有是出栈和入栈混合进行的。

user: user-2
content: 你压根就没搞明白题目是啥意思。 如果e1~e6是连续入栈，中间没有出栈操作，那么出栈顺序当然就是e6~e1。 题目这么问了，那显然入栈、出栈的操作是混在一起的，不是全部都入栈了才出栈，可能先入两个，出一个，再入两个，再出三个等等。 说到这里，具体怎么分析你应该知道了

user: user-3
content: 入栈中夹杂着出栈，就会出现这种情况。

user: user-4
content: 引用 7 楼 cfjtaishan 的回复:[quote=引用 6 楼 pkuzhx 的回复:] 你压根就没搞明白题目是啥意思。 如果e1~e6是连续入栈，中间没有出栈操作，那么出栈顺序当然就是e6~e1。 题目这么问了，那显然入栈、出栈的操作是混在一起的，不是全部都入栈了才出栈，可能先入两个，出一个，再入两个，再出三个等等。 说到这里，具体怎么分析你应该知道了 嗯，这位兄台分析的比较到位。需求里已经有体现，并不是中间没有出栈情况，所以这个出栈顺序还得看你的实际中有没有是出栈和入栈混合进行的。[/quote]找一个最大递减序列。。

user: user-4
content: 引用 4 楼 qq_36639412 的回复:[quote=引用 3 楼 angel6709 的回复:] 这个要看代码的。。。 设栈S和队列Q的初始状态为空，元素E1,E2,E3,E4,E5,E6,依次通过栈S，一个元素出栈后即进入队列后Q，若6个元素出列的顺序为E2,E4,E3,E6,E5,E1,则栈的容量至少是多少，A，6，B，4，C，3，D，2，[/quote]  4，3，1或6,5,1 选c

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:要看你的实现了；贴一下代码吧设栈S和队列Q的初始状态为空，元素E1,E2,E3,E4,E5,E6,依次通过栈S，一个元素出栈后即进入队列后Q，若6个元素出列的顺序为E2,E4,E3,E6,E5,E1,则栈的容量至少是多少，A，6，B，4，C，3，D，2，

user: user-0
content: 引用 3 楼 angel6709 的回复:这个要看代码的。。。 设栈S和队列Q的初始状态为空，元素E1,E2,E3,E4,E5,E6,依次通过栈S，一个元素出栈后即进入队列后Q，若6个元素出列的顺序为E2,E4,E3,E6,E5,E1,则栈的容量至少是多少，A，6，B，4，C，3，D，2，

user: user-4
content: 这个要看代码的。。。

user: user-5
content: 百度搜相关关键字。

user: user-1
content: 要看你的实现了；贴一下代码吧
user-0 提问: 主函数和子函数调用printf()输出主函数的i和子函数的i

回复:
user: user-1
content: int main(void)  {  int i=99;    // i初始化为99 printf("%d\n", i);  //打印99  i=f(5);              //i=f(5); 5以形式参数传递进入函数，然后返回值5，相当于 i= 5;  printf("%d\n", i);   //打印i，值为5 printf("%d\n", f(i));  // 这里没有任何歧义，这里调用的i为main函数中的i， //注意1：子函数中的i只在子函数中有效，出了子函数的大括号，那个子函数中的i已经消亡了。 //注意2：主函数中调用 f(i) 实际工作是借用主函数中i的值进行运算。 //小结：主函数中的i比喻为 张三，子函数中的i恰巧也叫张三，这两个i只是重名。把衣服比作值的话，，就是主函数中的张三把 //衣服借给子函数中的张三，子函数中的张三借用主函数中张三的衣服参加完典礼【函数运算】后还是要把衣服 //还给主函数中的张三的。 //如果子函数中使用的是&i ，那么两个张三就是同一个人了【这个时候就不是借衣服了，而是把张三完完整整的借过来了】， return 0;   }

user: user-2
content: 不会有错，第二个和第三个的区别是，第二个把函数调用和打印结果分开。如果以后不想打印结果，那么只需要注释掉printf即可，而第三个注释掉printf以后会影响功能。代码维护方面肯定是第二个好。
user-0 提问: 求大神看一下这个CRC校验的实现原理

回复:
user: user-1
content: 仅供参考：/***** crc16.c *****/ #include <stdio.h>  #define CRC16_DNP   0x3D65u     // DNP, IEC 870, M-BUS, wM-BUS, ... #define CRC16_CCITT 0x1021u     // X.25, V.41, HDLC FCS, Bluetooth, ...  //Other polynoms not tested #define CRC16_IBM   0x8005u     // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ... #define CRC16_T10_DIF   0x8BB7u     // SCSI DIF #define CRC16_DECT  0x0589u     // Cordeless Telephones #define CRC16_ARINC 0xA02Bu     // ACARS Aplications  #define POLYNOM     CRC16_DNP   // Define the used polynom from one of the aboves  // Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0). unsigned short crc16(unsigned short crcValue, unsigned char newByte) {     int i;      for (i = 0; i < 8; i++) {         if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){             crcValue = (crcValue << 1)  ^ POLYNOM;         } else {             crcValue = (crcValue << 1);         }         newByte <<= 1;     }     return crcValue; }  unsigned short exampleOfUseCRC16(unsigned char *Data, int len){      unsigned short crc;     int aux = 0;      crc = 0x0000u; //Initialization of crc to 0x0000 for DNP     //crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT      while (aux < len){         crc = crc16(crc,Data[aux]);         aux++;     }      return (~crc); //The crc value for DNP it is obtained by NOT operation      //return crc; //The crc value for CCITT }  int main() {     unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};      printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078     return 0; }

user: user-2
content: 一般CRC16都是用CCITT,你这个很特殊啊。。 你这个表达式已经说得很清楚了啊关于你这种CRC，每个字节向右移动8位再求和：  >>8的意思是向右移动8位，就是说对应字节的二进制向右移动8位，比如： 如果AngleAcceleArry[0] = 256（10进制） 对应二进制：0000 0001 0000 0000 右移8位：0000 0000 0000 0001 所以256>>8  =  1
user-0 提问: 数据结构学习问题

回复:
user: user-1
content: //第一种：使用引用 int InitStack(SqStack &S) {     S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));     if (!S.base)exit(0);     S.top = S.base;     S.stacksize = STACK_INIT_SIZE;     return 1; } //... SqStack s; InitStack(s);  //第二种：使用指针 int InitStack(SqStack *ps) {     ps->base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType));     if (!ps->base)exit(0);     ps->top = ps->base;     ps->stacksize = STACK_INIT_SIZE;     return 1; } //... SqStack s; InitStack(&s);

user: user-0
content: [quote=引用 4 楼 zhao4zhong1 的回复: int InitStack(SqStack &S) { 	S.base = (ElemType *)malloc(STACK_INIT_SIZE * sizeof(ElemType)); 	if (!S.base)exit(0); 	S.top = S.base; 	S.stacksize = STACK_INIT_SIZE; 	return 1; }这是第一种的栈建立的例程，如果用第二种代码需要改变吗

user: user-2
content: 函数定义时，在C语言中，应该是第二种Status InitList(Sqtaack *S) 引用是C++中特殊的用法；

user: user-1
content: 指针即地址。 引用即别名。

user: user-1
content: 理解和讨论之前请先学会如何观察！  //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-3
content: 区别不大，一个是引用一个是指针，反正都是关于地址的

user: user-4
content: (Sqtaack &S) -> &表示参数是引用形式(C++语法，C不支持)，使用时，S是传过来的参数的别名，对S的操作就是对传过来的参数的操作，注意这里不需要*号 (Sqtaack *S) -> &表示参数是指针形式(C++和C都支持)，使用时，S是传过来的参数的地址，对*S的操作就是对传过来的参数的操作，注意这里需要*号