Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求解几道题数据结构

回复:
user: user-1
content: 1.D A B 2.C C C 3.错 4.B 5.C 6.O（n） O（1） 7.c 8.52 9.2的i-1次方 （n+1）/2 （n-1）/2 10.D 11.N/2 12.O（n） O（log2（n）） O（n的0.5次方）

user: user-2
content: 引用 5 楼 a156435646 的回复:第5题还会选A。。。。我选的是C看错了，A是线性链表，选C

user: user-0
content: 谢谢楼上的。。我是由于大一没学习，现在大四补考。。特地从公司回去补考的。。。自己做的有些题目跟书上不一样。。。不知道还有木有童靴再提供一份自己做的呢？

user: user-3
content: 全是数据结构的题 1,2目前都是行优先存储，没啥意思，不答！ 3，错，二叉树不是树的特殊形式。它倒是很像有序树^_^ 4.B 5.C,循环，非空单链表 6.O（n）,O(n),因为顺序表需要移动后面的数据，最好是删除最后一个元素O(1),最坏删除第一个元素，移动n-1个元素,O(n);同理链表需要查找第i个数据，最好是删除第一个O(1),最坏删除最后一个O(n)。所以二者故都是O(n) 7.D，要考虑f-r为负值的情况，所以需要+n进行正数调整 8.9个，这个要区分子串和子序列；子串是空串或者主串中连续的一段字符（至少一个）,子字符序列则不一定是主串中连续的字符。不知道题目什么目的。如果确切是求子串：则9个，分别是t, tu, tut, tuti, tutio, tution, ti, tio, tion，如果是子序列，则2^5(不用单独考虑第二t了) 9,2^(n-1),分别是1,2， 4， 8， 16.。。。 (n+1)/2个叶子，(n-1)/2个分支，注意是满二叉树。只有叶子和度2的结点。n0=n2+1;2n2+1=n即可推出 10.套公式，2000开平方，向上取整，45 11.树的深度log2N向上取整或者log2(n+1)向下取整 12，O(n), O(log2n),O(n开方)  over！

user: user-1
content: 还是多听赵老师的，毕竟大牛啊

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

user: user-1
content: 7.我觉得还是选c 9.叶子比非终端永远多一个（对于满二叉树），当然你写的相减也是对的，你可以试试我的应该也对。 11.个人觉得应该和9的第二问差不多，如果非要公式化 我偏向你的写法。

user: user-0
content: up。。先谢谢楼上几位的回答，不过，还想看下其他人的看法

user: user-0
content: 第7题选C吗？我选的是D。。(r-f+n) mod n 第9题 10 11我的答案是

user: user-0
content: 第5题还会选A。。。。我选的是C

user: user-2
content: 4、B 5、A 其他的不知道，没学过数据结构，就学C语言时涉及链表的知识

user: user-0
content: UP，加分了，以表诚意，分虽少，但是希望大家可以把自己答案写上去。。

user: user-5
content: 1，(1) D

user: user-0
content: UP,在线等。。。。  以上是 我在书本上做的跟参考答案不同的题目，希望大家做下，看下我的答案是否是跟大家一样
user-0 提问: 求证：输出字母位置

回复:
user: user-1
content: 要使用逻辑连接词来连接。C语言不能直接识别你的数学表达。。 'a'<=m&&m<='z'

user: user-2
content: 引用 4 楼 buyong 的回复:if('a'<=m<='z')  编译能通过么？ 'a'<=m<='z'是合法表达式？ 能,只是达不到目的而已; 该表达式本身是合法的. 值为     ('a' <= m  ) <= 'z'    ==> true==>1; 'a'<= m 非 0即1 0 <'z' 1<'z' 所以 ('a' <= m  ) <= 'z'   为1 所以'a'<=m<='z' 为1  C 用int 当作bool 使用. C++虽然有bool ,不过C的方式,依然可用.

user: user-3
content: if('a'<=m<='z')  编译能通过么？ 'a'<=m<='z'是合法表达式？

user: user-4
content: if('a'<=m<='z')；显然这样写不行啊，得m>=a&&m<=z，这样写

user: user-5
content: 不要用数学的区间不等式

user: user-6
content: if('a'<=m<='z')-----> if('a'<=m&&m<='z')
user-0 提问: [swu ]求解啊！输入25竟然是yes!!!!!!!!!!!!!!!!!!!!!!

回复:
user: user-1
content: 引用 1 楼 mcmay 的回复:不好意思，恕我眼拙，没看出有什么问题。比如，你输入25，当i = 2时，j%i != 0，然后就打印yes，然后就break;跳出for循环了。你输入4或者其他2的倍数，你试试看，应该会打印no。+1

user: user-2
content: 不好意思，恕我眼拙，没看出有什么问题。比如，你输入25，当i = 2时，j%i != 0，然后就打印yes，然后就break;跳出for循环了。你输入4或者其他2的倍数，你试试看，应该会打印no。

user: user-3
content: 错误的根源在于第15行的break

user: user-4
content: 多看看这代码，你必须要知道你自己写代码的真正的含义，自己用拿笔在纸上执行一次试试看

user: user-5
content: 不用改，是对的

user: user-0
content: oh on!!!我只是个新手 能把改过的代码贴出来吗？

user: user-6
content: 如果i==5不就输出yes了吗

user: user-7
content: 引用 3 楼 u012271055 的回复:引用 2 楼 Adol1111 的回复:[quote=引用 1 楼 mcmay 的回复:] 不好意思，恕我眼拙，没看出有什么问题。比如，你输入25，当i = 2时，j%i != 0，然后就打印yes，然后就break;跳出for循环了。你输入4或者其他2的倍数，你试试看，应该会打印no。+1 +1[/quote] 再+1

user: user-8
content: 看代码，不是一个循环，因为break是在第一次不论打印yes或者no都会退出的。 另外，25 % 2也不是0，所以，打印“yes"也是代码逻辑的结果。

user: user-0
content: 不用break  它会执行很多次 怎么会这样？

user: user-9
content: for循环里的break完全破坏了循环啊，不管如何都只能指向一次啊

user: user-10
content: 这段代码，看着太不舒服了。 for循环完全不需要（进去做个判断就break出来的循环有存在的必要么？） 如果去掉循环，那么输入25打印yes不是很明了的结果么？

user: user-11
content: 引用 2 楼 Adol1111 的回复:引用 1 楼 mcmay 的回复:不好意思，恕我眼拙，没看出有什么问题。比如，你输入25，当i = 2时，j%i != 0，然后就打印yes，然后就break;跳出for循环了。你输入4或者其他2的倍数，你试试看，应该会打印no。+1 +1
user-0 提问: 好吧……调试的时候说已停止工作是什么情况= =

回复:
user: user-0
content: 引用 5 楼 user-1 的回复:题目中说要用从n1的形式输出，你可以用 for(k = 0; k < l; k++)     printf("%d    ",  odd[k+1]);的形式即可。  嗯……但是输出结果还是和上面两个运行框一样

user: user-1
content: 请不要用图片上传代码，不方便这里的网友们帮你测试。你先试试将所有循环中的 x = 1; x <=N （这里x代表你所定义的变量），换成x = 0; x < N。如果你用x = 1的形式，数组的第一个元素即ar[0]（这里的ar代表你所定义的数组名称）就被忽略掉了，而用x <= N的形式，则又超过了数组下表的最大值，是越界了。一个数组，例如，ar[6]，其元素个数为6，其元素下标的范围为0~5。另外，不明白，你为什么要在声明数组时用n[N+1]，odd[N+1]和even[N+1]的形式呢？那个+1起什么作用？是怕后面的x<=N造成数组下标越界吗？也许这个办法可以解决这个问题，但始终数组的第一个元素，即ar[0]由于你在for循环中用了x=1这样的表达式而被跳过去了，即ar[0]是未被赋值的，它的值是不确定的，你的程序也许会在运行时因此而崩溃。

user: user-1
content: 题目中说要用从n1的形式输出，你可以用 for(k = 0; k < l; k++)     printf("%d    ",  odd[k+1]);的形式即可。

user: user-1
content: 用变量定义数组的大小是在C99标准下可以接受的，你找个兼容C99标准的编译器试试，或者打开编译器的C99支持开关（如果有这项设置的话）。

user: user-0
content: #include <stdio.h> int main() { 	int i,j,N,k,m,l,temp,a; 	k=1; 	j=1; 	printf("请输入数字个数N（小于20）="); 	scanf("%d",&N); 	printf("N=%d\n",N); 	int n[N+1]; 	int odd[N+1]; 	int even[N+1]; 	for(i=1;i<=N;i++) 	{ 		printf("n[%d]=",i); 		scanf("%d",&n[i]); 	} 	for(i=1;i<=N;i++) 	{ 		if(n[i]%2==0) 		{ 			even[j]=n[i]; 		    j++; 		} 		else 		{ 			odd[k]=n[i]; 		    k++; 		} 		m=j; 		l=k; 	} 	for(a=1;a<=m;a++) 	{ 		for(j=1;j<=m;j++) 		{ 			if(even[j]<even[j+1]) 			temp=even[j]; 			even[j]=even[j+1]; 			even[j+1]=temp; 		} 	} 	for(a=1;a<=l;a++) 	{ 		for(k=1;k<=l;k++) 		{ 			if(odd[k]>odd[k+1]) 			temp=odd[k]; 			odd[k]=odd[k+1]; 			odd[k+1]=temp; 		} 	} 	printf("odd="); 	for(k=1;k<=l;k++) 	{ 		printf("%d  ",odd[k]); 	} 	printf("\n"); 	printf("even="); 	for(j=1;j<=m;j++) 	{ 		printf("%d  ",even[j]); 	} return 0; }

user: user-0
content: 引用 1 楼 user-1 的回复:请不要用图片上传代码，不方便这里的网友们帮你测试。你先试试将所有循环中的 x = 1; x <=N （这里x代表你所定义的变量），换成x = 0; x < N。如果你用x = 1的形式，数组的第一个元素即ar[0]（这里的ar代表你所定义的数组名称）就被忽略掉了，而用x <= N的形式，则又超过了数组下表的最大值，是越界了。一个数组，例如，ar[6]，其元素个数为6，其元素下标的范围为0~5。另外，不明白，你为什么要在声明数组时用n[N+1]，odd[N+1]和even[N+1]的形式呢？那个+1起什么作用？是怕后面的x<=N造成数组下标越界吗？也许这个办法可以解决这个问题，但始终数组的第一个元素，即ar[0]由于你在for循环中用了x=1这样的表达式而被跳过去了，即ar[0]是未被赋值的，它的值是不确定的，你的程序也许会在运行时因此而崩溃。  #include <stdio.h> int main() { 	int i,j,N,k,m,l,temp,a; 	k=1; 	j=1; 	printf("请输入数字个数N（小于20）="); 	scanf("%d",&N); 	printf("N=%d\n",N); 	int n[N+1]; 	int odd[N+1]; 	int even[N+1]; 	for(i=1;i<=N;i++) 	{ 		printf("n[%d]=",i); 		scanf("%d",&n[i]); 	} 	for(i=1;i<=N;i++) 	{ 		if(n[i]%2==0) 		{ 			even[j]=n[i]; 		    j++; 		} 		else 		{ 			odd[k]=n[i]; 		    k++; 		} 		m=j; 		l=k; 	} 	for(a=1;a<=m;a++) 	{ 		for(j=1;j<=m;j++) 		{ 			if(even[j]<even[j+1]) 			temp=even[j]; 			even[j]=even[j+1]; 			even[j+1]=temp; 		} 	} 	for(a=1;a<=l;a++) 	{ 		for(k=1;k<=l;k++) 		{ 			if(odd[k]>odd[k+1]) 			temp=odd[k]; 			odd[k]=odd[k+1]; 			odd[k+1]=temp; 		} 	} 	printf("odd="); 	for(k=1;k<=l;k++) 	{ 		printf("%d  ",odd[k]); 	} 	printf("\n"); 	printf("even="); 	for(j=1;j<=m;j++) 	{ 		printf("%d  ",even[j]); 	} return 0; }    谢谢大神……我稍微修改了一下可以执行…… 但是运算结果是错的…………我也不知道错哪里了……麻烦大神帮忙看一下……  这个是按照=0 <N的方式改过后的结果   这个是我原来的测试结果……  = = 我那个+1是为了防止越界的……还有数组定义似乎是不能用变量的……我在VS2013里输入一遍似乎是说int [N+1],或者int [N]这种形式是错的……不知道为什么在C-FREE 5中可以使用   老师要求是输出结果和题目完全一致……由于题目中第一个是n[1]……所以我只能想办法跳过n[0]了
user-0 提问: 为什么这个程序运行后，就弹出窗口“程序已停止运行”

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

user: user-0
content: 3# 最后一个输出应该是p/n吧！非常有用，谢谢大神们了！

user: user-2
content: 引用 楼主 u014619754 的回复:**************************************************************** 我想用这个程序求任意两个数的最大公约数，和最小公倍数，求大神指教，勿喷 ********************************************************************  #include <stdio.h> int main() { 	int m,n,t,r,p; 	printf("请输入任意两个整数： "); 	scanf("m=%d,n=%d\n",&m,&n);  	if(m<n) 	{	t=m;m=n;n=t;  } 	p=m*n; 	while(n!=0) 	{r=m%n; 	 m=n; 	 n=r; 	} 	printf("最大公约数为:%d\n",n); 	printf("最小公倍数为:%d\n",p/n);     return 0; } 首先，这个scanf("m=%d,n=%d\n",&m,&n); 不是一种恰当的写法，恰当的写法当中最简单的是scanf("%d%d", &m, &n); 然后，你那个while循环的运算，最终导致n = 0，然后最后的那句printf("最小公倍数为:%d\n",p/n);就会成为除数为零的情况。 下面的代码测试可知： #include <stdio.h> int main() { int m,n,t,r,p; printf("请输入任意两个整数： "); scanf("%d%d",&m,&n); printf("m = %d, n = %d\n", m, n); if(m<n) { t=m;m=n;n=t;  } p=m*n; printf("m = %d, n = %d\n", m, n); while(n!=0) {r=m%n;  m=n;  n=r;  printf("w: m = %d, n = %d, r = %d\n", m, n, r); } printf("最大公约数为:%d\n",n); printf("最小公倍数为:%d\n",p/n);     return 0; } 测试结果： 请输入任意两个整数： 3 5 m = 3, n = 5 m = 5, n = 3 w: m = 3, n = 2, r = 2 w: m = 2, n = 1, r = 1 w: m = 1, n = 0, r = 0 最大公约数为:0  修改了一下，包括写代码的格式都改了： #include <stdio.h>  int main(void) {     int m, n, t, r, p, q;  //这里多加个q表示最小公倍数      printf("请输入任意两个整数： ");     scanf("%d%d",&m,&n);  //scanf修正     if(m<n)     {         t=m;         m=n;         n=t;     }     if(m % n == 0)  //当其中较大的数是另一个数的倍数时     {         p = m;         q = n;     }     else     {         p = m*n;         while(n != 0)   //辗转相除法         {             r = m%n;             if(r == 0)                 break;    //当余数为0时，跳出循环             m=n;             n=r;         }         q = n;   //记录最大公约数     }     printf("最大公约数为:%d\n",q);     printf("最小公倍数为:%d\n",p);      return 0; }

user: user-3
content: while(n!=0)//当n == 0 时才跳出循环,这时n已经为零了 {r=m%n;  m=n;  n=r; } printf("最大公约数为:%d\n",n); printf("最小公倍数为:%d\n",p/n);//零是不能当作分母的

user: user-4
content: 应该是你输入的问题，还有这句输入最好不要这样写\n的匹配会有问题 scanf("m=%d,n=%d\n",&m,&n); 改成 scanf("%d%d",&m,&n);
user-0 提问: win32编程

回复:
user: user-0
content: 引用 3 楼 jerry_dqh 的回复:wndclass.cbClsExtra  你没有设置好。你设置了两个cbWndExtra 阿里嘎多，我看到了，80分收好

user: user-1
content: wndclass.cbClsExtra  你没有设置好。你设置了两个cbWndExtra

user: user-0
content: 引用 1 楼 my3439955 的回复:WNDCLASS wndclass = {sizeof(wndclass)};不懂事什么意思

user: user-2
content: WNDCLASS wndclass = {sizeof(wndclass)};
user-0 提问: 一个数组问题（函数调用，递归求回文数）--新手

回复:
user: user-1
content: #include <stdio.h>  int hui_wen(const char *str) {     int m;     int i;      m = strlen(str);      for(i = 0; i < m; ++i)         if(str[i] != str[m - 1 - i])             return 0;     return 1;  }  int main(int argc, char *argv[]) {     char *test = "12344321";     printf("%d\n", hui_wen(test));     return 0; }

user: user-1
content: 从中心对称比对就可以了
user-0 提问: 定义一个新的指针变量的作用是什么？ 不定义行不行？

回复:
user: user-1
content: 主要还是void *类型的变量不能+ - 等运算。  对于保护vptr的值，这里倒是谈不上。

user: user-2
content: 首先vptr是一个void*的指针，使用ptr(是char *类型指针）也是转换一下，void类型的数据是不可以进行加减运算的吧。 其次，也可以保护vptr的值吧，不过这个是我的个人见解。
user-0 提问: 传结构体数组的首地址给函数，在函数中 x[i] = 结构体数组[i].x 该怎么做

回复:
user: user-1
content: 这种时候可以用引用类型 struct Bubble{ 	COLORREF	color; 	double		x; };  Bubble bubble[N];  void Func(struct Bubble (&arry)[N]) { 	double x[N]; 	for(int i=0; i<N; i++){ 		x[i] = arry[i].x; 	} }  void main() { 	Func(bubble); }

user: user-0
content: 引用 1 楼 a515360208 的回复:学了C++的类和对象的概念你就会清楚一点，你只是传入了第一个对象的地址，你无法访问访问其他对象的成员的 struct Bubble{ 	COLORREF	color; 	double		x; };  Bubble bubble[N];  void Func(Bubble (*p)[N]) { 	double x[N]; 	for(int i=0; i<N; i++){ 		x[i] = p[i]->x; 	} }  void main() { 	Func(&bubble); }  谢谢了

user: user-2
content: 学了C++的类和对象的概念你就会清楚一点，你只是传入了第一个对象的地址，你无法访问访问其他对象的成员的 struct Bubble{ 	COLORREF	color; 	double		x; };  Bubble bubble[N];  void Func(Bubble (*p)[N]) { 	double x[N]; 	for(int i=0; i<N; i++){ 		x[i] = p[i]->x; 	} }  void main() { 	Func(&bubble); }
user-0 提问: 关于free函数

回复:
user: user-1
content: 引用 楼主 cs_huster 的回复:看c专家编程里面说free释放的内存块并没有直接交给操作系统，还是在进程空间内部，那么这么说free后，其他进程无法malloc这块内存？那么通过神马方法可以把这块内存从进程交换给操作系统呢、？  通常无需关心这个问题，而且完全没有必要。 真的需要的话，自己实现好了。

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  int main() {    char *p;    p =(char *)malloc(sizeof(char) * 8);    strcpy(p,"asdfgh");    printf("%s\n",p);    p++;    printf("%s\n",p);    free(p);    printf("%s\n",p-1);    printf("%s\n",p);    //printf("%s\n",p+1);     return 0; }

user: user-3
content: http://www.chinaunix.net/old_jh/4/677609.html 希望这个链接能够帮你解决这个问题。
user-0 提问: 字符串以单词为单位倒序输出

回复:
user: user-1
content: http://bbs.csdn.net/topics/390768436

user: user-1
content: http://blog.csdn.net/mujiok2003/article/details/24458497

user: user-2
content: 最容易出错的地方是+1，-1错误

user: user-2
content: 逆序输出，或者转换到另一个数组（串），可以自后向前，逐个单词输出（复制）。 原地反转，需要2步反转，1步反转每个单词，1步反转整个字符串。

user: user-3
content: 有限自动机

user: user-4
content: char* fun(char* s,int len)  {      int i = 0;      char s1;      int len1 = len-1;      if(s == NULL)          return 0;      while((*s != '\0') &&( i<(len/2)))      {           s1 = s[i];          s[i]=s[len1];          s[len1] = s1;            i++;          len1--;      }      return s;  } 测试可用

user: user-5
content: 可以用字符串指针数组来实现

user: user-6
content: 把字符串压入栈中就可以了

user: user-7
content: 用递归写了一个，有一个小问题，多输出了一个空格[code=c]# include <iostream> # include <string> using namespace std;  void reverseString(char *head, char *tail);  int main() { 	char str[] = "hello word boy baby lili";  	reverseString(str, str); 	 	return 0; }  void reverseString(char *head, char *tail) { 	while (*tail != ' ' && *tail != '\0') 	{ 		tail++; 	} 	if (*tail == '\0') 	{ 		cout << head << " "; 		return; 	} 	else 	{ 		reverseString(tail + 1, tail + 1); 		*tail = '\0'; 		cout << head << " "; 	}	 }[/code]

user: user-8
content: void fun(char *strSrc, int lenSrc, char *strDest, int lenDest) { 	for(int index=lenSrc-1; index>0; index--) 	{ 		strDest[lenDest-index-1] = strSrc[index]; 	} } //没有编译验证，不知道可否

user: user-2
content: 每个单词倒序，然后整个字符串倒序，转换完成。。

user: user-0
content: 引用 1 楼 oYinGui1 的回复:Hello World变成World Hello这种的话。。string+vector就可以很轻松完成了。 要求不能用STL。。。忘记说了

user: user-9
content: Hello World变成World Hello这种的话。。string+vector就可以很轻松完成了。
user-0 提问: struct对齐疑问

回复:
user: user-0
content: 好吧 我sb了，错吧cc 的union写成struct 了，眼睛啊

user: user-1
content: 你的bb是结构体类型啊，sizeof(bb) = sizeof(cc) + sizeof(LUAI_USER_ALIGNMENT_T) = 16 + 8 = 24

user: user-2
content: 数学没有学好吧，8 + 16 = 24不是很简单么 你的cc是struct而不是union
user-0 提问: 有关用C实现密码学中的平方乘算法。

回复:
user: user-1
content: 因为你用的是c语言所以你在使用printf后，还要给a赋值编译肯定出问题 ，你可以在写个试试

user: user-2
content: 可以用字符串来存储运算结果

user: user-0
content: 引用 1 楼 u013163178 的回复:什么？不支持long long就是一种数据类型啊  呵呵   重点其实也不再那啦

user: user-3
content: 什么？不支持long long
user-0 提问: C Primer Plus 问题求解

回复:
user: user-1
content: 返回了一个copy哈

user: user-2
content: 这是结构体赋值，没有问题。

user: user-3
content: #include<stdio.h> char function1() { 	char a='o'; 	return a; } char *function2() { 	char a[]="asdf"; 	return a;//warning C4172: returning address of local variable or temporary } int main() { 	printf("%c\n",function1()); 	return 0; }

user: user-4
content: 你连最基本的函数传递和返回都没弄清楚，举个简单的例子 int f() { 	int i; 	i = 2; 	return i; }  int main() { 	int a; 	a = f();  	return 0; }函数调用后返回了一个i的副本给a, 而你的函数不就是返回了一个struct test类型的副本么，虽然临时变量的内存释放了，但副本传出来了

user: user-5
content: 引用 3 楼 u013163178 的回复:struct test val变量临死前值传给了val_m精辟

user: user-3
content: struct test val变量临死前值传给了val_m

user: user-6
content: 是一个返回值的操作。应该就像返回整型数，函数调用结束后，虽然该整型数的内存释放了，但是可以把返回值传递出来。

user: user-7
content: 把val当返回值传回给main()中的val_m，这是一个拷贝结构体的操作。虽然un()中的结构体val所占内存空间被收回，但main()中的val_m通过赋值操作保存了一份val的值，所以就可以将ch和i的值打印出来了。

user: user-8
content: 是被释放了，系统自动回收了，但是在函数fun调用结束后它将值传给了你在main函数申请的局部变量val，所以，你在main函数能够打印在fun函数里的赋值。

user: user-9
content: 临时对象。。
user-0 提问: 进程间如何传递数据？

回复:
user: user-1
content: 文件或全局变量

user: user-2
content: 共享内存和信号量结合使用

user: user-3
content: IPC有很多方式

user: user-4
content: 你可以使用各种进程间通信机制（IPC）。Perl的文档里描述了很多种，主要包括： 最简单的：一个进程写一个文件，另一个进程读。注意锁好。 古典的：SysV IPC机制，包括共享内存、semaphore信号量等。 常用的：管道文件（这个好像只有Unix有），Socket和网络协议（同样可以用于本地的进程间）。
user-0 提问: 求windows下通过MinGW编译使用OCILIB的C程序的详细步骤

回复:
user: user-0
content: angel_su ,非常感谢你的提醒，我看了一下OCILIB的Readme.txt文件：      - add ocilib/include folder to your compiler includes path      - add ocilib/lib folder to your linker library path      - For MinGW only, rename/copy ocilib[x].lib to libocilib[x].a      - add ocilib[x].lib (or -locilib[x] from MinGw) to your linking options      - add OCI_CHARSET_XXX macro to your preprocessor options      - add OCI_API macro definition to your preprocessor options (set it to __stdcall) 上面有提到添加函数调用约定，但是我对这个不理解，所以忽略了这点，就出现了上述问题，现在我修改程序如下： #define OCI_API __stdcall #define OCI_CHARSET_ANSI UTF-8 #include "ocilib.h" int main(int argc, char *argv[]){     OCI_Connection * cn;     OCI_Statement * st;     OCI_Resultset * rs;     OCI_Initialize(NULL, NULL, OCI_ENV_DEFAULT);     cn = OCI_ConnectionCreate("test", "hanlin", "hanlin", OCI_SESSION_DEFAULT);     st = OCI_StatementCreate(cn);     OCI_ExecuteStmt(st, "select * from stars");     rs = OCI_GetResultset(st);     while (OCI_FetchNext(rs)){         printf("%i - %s\n", OCI_GetInt(rs, 1), OCI_GetString(rs,2));     }     OCI_Cleanup();     return EXIT_SUCCESS; } 使用相同的编译命令，已经编译通过，并且也执行成功，在此非常感谢angel_su，同时也感谢zhao4zhong1 的帮助，现在我的解决方法贴在这里，希望对你有帮助！谢谢。

user: user-1
content: * To use OCILIB in a project :  *  * - include "ocilib.h" in your application  * - define call convention (OCI_API) to __stdcall  * - define charset mode (OCI_CHARSET_ANSI | OCI_CHARSET_MIXED| OCI_CHARSET_WIDE | OCI_CHARSET_UFT8)  *  * Note for MinGW users:  * - Precompiled 32bits static libraries libocilib[x].a are provided  * - To use OCILIB dll's, copy/rename import libraries ocilib[x].lib to libocilib[x].lib  * - Add the desired version (static/shared + charset) of the library to the linker options

user: user-2
content: 将源代码的后缀改改再试试。 .c改为.cpp或.cpp改为.c
user-0 提问: 用C/C++做个简单的APP

回复:
user: user-0
content: 引用 10 楼 guodongxiaren 的回复:你是不会连接数据库？还不不会开单导出Excel？或者是不会发送到邮箱？ EXCEL和邮箱都没试过

user: user-1
content: 你是不会连接数据库？还不不会开单导出Excel？或者是不会发送到邮箱？

user: user-0
content: APP我好像不会，想先做成动态链接库，由JAVA调用吧

user: user-0
content: 不行的话，就发到邮箱再说吧

user: user-2
content: 引用 4 楼 shimachao 的回复:QQ官方给接口了吗？你觉得麻花藤会给吗

user: user-3
content: 在线传QQ文件或微信

user: user-4
content: 你需要找人付费帮你做喽

user: user-5
content: QQ官方给接口了吗？

user: user-6
content: 我擦，你要用你的app向QQ传文件？

user: user-0
content: 说说思路也可以，朋友叫帮忙的，我不会。

user: user-7
content: 这东西就是在公司里头做也得给领导算一星期的工时吧？凭什么帮你做？
user-0 提问: c 中带返回值的宏怎么理解？

回复:
user: user-1
content: 这是GCC编译器的特性，使用GCC编译

user: user-0
content: 引用 1 楼 my_live_123 的回复:宏中的最后一个语句，作为整个语句的值。这个和语句块有关系，{}内所有语句对{}外都认为是一条语句，{}的值就是最后一条语句的值。 2.交换16位无符号整数的高低字节！AB->BA  感谢讲解，这个在VS里编译不通过，有木有什么设置可以让它在VS里通过的？

user: user-1
content: 宏中的最后一个语句，作为整个语句的值。这个和语句块有关系，{}内所有语句对{}外都认为是一条语句，{}的值就是最后一条语句的值。 2.交换16位无符号整数的高低字节！AB->BA
user-0 提问: c语言小问题

回复:
user: user-0
content: 一楼正解透彻！！

user: user-1
content: 你的程序不能达到统计输入一段字符中空格的个数，为什么呢？首先你得看看你循环中的判定，要是一个非‘\n’且为空格才能进入循环体，自然不对了，程序改一下就行了# include <stdio.h> # include <ctype.h> int main() { 	int nspace = 0; 	char c;  	while ((c = getchar()) != '\n') 	{  		if (isspace(c)) 			++nspace; 	} 	printf("%d",nspace);  	return 0; }

user: user-2
content: what's your question?

user: user-3
content: [code=c#include<stdio.h> #include<ctype.h> int main() { char c; //int i; int nspace=0; while((c=getchar())!= '\n') //如果你用while((c=getchar())!='\n'&&(isspace(c)))这样的判断                                            //除非你只输入空格，否则只要一有非空格字符出现                                          //你的循环就跳出了 {     if(isspace(c))         ++nspace; }  printf("%d",nspace);  return 0; } [/code] 不知你所说的程序问题是什么，不过以上的修改似乎可以让程序健壮一点。
user-0 提问: ++(a++)这句为什么不对呢？

回复:
user: user-1
content: 强烈要求CSDN在凡是提问帖标题或内容中出现≥两次++、--时，自动在一楼回复以下内容：  http://bbs.csdn.net/topics/370153775 http://bbs.csdn.net/topics/370153775

user: user-2
content: a++返回的是一个临时变量不可以作为左值的

user: user-3
content: 引用 1 楼 oYinGui1 的回复:a++得到的是一个右值，++操作需要的是一个左值。 ++++

user: user-3
content: 引用 楼主 guodongxiaren 的回复:++(a++)这句为什么不对呢？ 不是先执行a++，再++a的意思么。。 ++

user: user-4
content: 问这个意思嘛,项目中写这个,老大立马拍死你................

user: user-5
content: 有来月经了,真是月月有啊

user: user-6
content: 一楼和二楼说的都很有道理，这样的语句完全是可以避免的

user: user-7
content: N1570，6.5.2.4： The result of the postfix ++ operator is the value of the operand.

user: user-8
content: 引用 3 楼 BeanJoy 的回复: C,C++表达式求值顺序 裘老的解释。 这和求值顺序关系不大，就是左值右值的问题。

user: user-9
content: 楼上都回答的很清楚了。

user: user-10
content: C,C++表达式求值顺序 裘老的解释。

user: user-11
content: a++返回的是一个右值，不对再++了，可以写成 ++(++a)

user: user-8
content: a++得到的是一个右值，++操作需要的是一个左值。
user-0 提问: 麻烦看下这个为什么段错误 该怎样改 这块我总是晕 多谢

回复:
user: user-0
content: 非常感谢您的回答, 可还是有点地方不明白, 如下面代码, 为什么传一级指针就可以了, 有什么区别么?  int fun(void *p) { 	char *ptr = (char *)p; 	strcpy_s(ptr, 128, "hello");  	return 0; }  int main() { 	char *p = new char[128]; 	fun(p);  	cout<<p<<endl;  	delete p;  	return 0; }

user: user-0
content: to: tuzhutuzhu  您说的 create_list中使用的是head1的一个拷贝 是说 比如: main中的head1 的地址是 0xAEFD0 , 那么接收参数hptr 指针变量的地址也是  0xAEFD0 还是说 , 他们head1 和 hptr本身都是不同的地址,  他们只想的值相同呢?

user: user-1
content: 段错误，也即是访问内存错误！常见的有空指针，内存访问越界！

user: user-2
content: 引用 2 楼 power0811 的回复:非常感谢您的回答, 可还是有点地方不明白, 如下面代码, 为什么传一级指针就可以了, 有什么区别么?  int fun(void *p) { 	char *ptr = (char *)p; 	strcpy_s(ptr, 128, "hello");  	return 0; }  int main() { 	char *p = new char[128]; 	fun(p);  	cout<<p<<endl;  	delete p;  	return 0; }  首先需要理解函数参数的值传递与指针传递之间的区别 主楼的例子的中，虽然传递的是一个指针，但是你的这个操作： PNODE head1 = NULL; 所以head1的值为NULL，没有地方可指。把head1传给create_list，create_list中使用的是head1的一个拷贝。但是main函数中的head1不会变，一直是NULL。所以使用head1->操作，肯定会segment fault。 但是上面的这个例子，指针p已经分配了内存，指向了字符指针。然后将p传给fun函数。虽然fun函数中不会改变p的值，但是p指向的内存的值在fun函数中已经变了。

user: user-3
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括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",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “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

user: user-4
content: main()中的head1 是Node类型的结构体指针，而void create_list(void *hptr)的参数需要的是指向结构体指针的指针（Node **），即 *hptr = &head1，所以传参数要传&head1。这样做是为了能够通过传递一个变量的地址来改变那个变量的值。 而create_list(void *hptr)中void类型的*hptr 通过NODE *head1 = (PNODE)hptr;语句中的强制类型转换，转变成了一个PNODE类型的指针，它所指向的是一个Node类型的结构体。
user-0 提问: codeblock 很简单的一个小程序 运行的时候说是停止运行，不知道为什么

回复:
user: user-1
content: 看一半天，居然就是多了一个分号。

user: user-2
content: 多了个分号都看到了,眼神真好

user: user-3
content: 引用 2 楼 zhangyonghui2117 的回复:[quote=引用 楼主 u014787492 的回复:] #include<stdio.h> void main() {     int a[10],i,minv;     int *p;     p=a;     for (i=0;i<10;i++);     {         scanf("%d",p+i);      }     minv=*p;     for(i=1;i<10;i++)     {         if (minv>*(p+i))             minv=*(p+i);     }     printf("%d",minv); } 很简单的一个程序，而且程序也是对的，但是在运行的时候显示停止运行，无法输出结果，求解答  ///////  for (i=0;i<10;i++);多了个分号[/quote] 正解

user: user-4
content: 引用 楼主 u014787492 的回复:#include<stdio.h> void main() {     int a[10],i,minv;     int *p;     p=a;     for (i=0;i<10;i++);     {         scanf("%d",p+i);      }     minv=*p;     for(i=1;i<10;i++)     {         if (minv>*(p+i))             minv=*(p+i);     }     printf("%d",minv); } 很简单的一个程序，而且程序也是对的，但是在运行的时候显示停止运行，无法输出结果，求解答  ///////  for (i=0;i<10;i++);多了个分号

user: user-4
content: /// 求最小数   #include<stdio.h> void main() {     int a[10],i,minv=1;     int *p;     p=a;     for (i=0;i<10;i++)     {         scanf("%d",p+i);      }     minv=*p;     for(i=1;i<10;i++)     {         if (minv>*(p+i))             minv=*(p+i);     }     printf("the min digit is:%d",minv); }  /* 5 89 1 236 956 65 23 85 3 2 the min digit is:1 Process returned 18 (0x12)   execution time : 14.446 s Press any key to continue. */
user-0 提问: 求c/c++大神  帮忙教一下怎么样调用子程序

回复:
user: user-1
content: lz找函数的说明书啊，   这种问题只有说明书能帮你

user: user-0
content: 我只是个菜鸟 对程序一窍不通  而且都是英文 看不懂啊

user: user-2
content: http://www.cplusplus.com/doc/tutorial/functions/
user-0 提问: 关于gcc分别编译失败的问题

回复:
user: user-0
content: 引用 5 楼 mcmay 的回复:[quote=引用 4 楼 cs_huster 的回复:] [quote=引用 1 楼 xuweiwei1860 的回复:] 文件关联了啊    找个。h  公用的放里面就好了 我这个目的是测试extern变量的，放入.h就失去了测试extern 变量的意义了。。为什么放在一块编译可以通过，而分别编译就不行呢？[/quote] 你在test2.c中用了extern，但你是单独编译这个test2.c文件，编译器这时不知道有个test1.c的存在，对它的内容更是一无所知。比如，你和你的女朋友去找一个画家给你们两人画肖像画，你们一起去，画家就可以画出你们俩的肖像画。但是你和你的女朋友分别去，你去时跟画家说，我的女朋友叫XXX，你给她也画一幅肖像画吧。但画家说，你说了你女朋友的名字，但我没有见到你女朋友的人，我不知道她是什么模样，我没法画。[/quote] 找到错误原因了，gcc -o test1.o test2.o -o testt 这条命令里面多了一个“-o"选项，所以出错了，去掉第一个-o后，正常编译和运行

user: user-1
content: 引用 4 楼 cs_huster 的回复:[quote=引用 1 楼 xuweiwei1860 的回复:] 文件关联了啊    找个。h  公用的放里面就好了 我这个目的是测试extern变量的，放入.h就失去了测试extern 变量的意义了。。为什么放在一块编译可以通过，而分别编译就不行呢？[/quote] 你在test2.c中用了extern，但你是单独编译这个test2.c文件，编译器这时不知道有个test1.c的存在，对它的内容更是一无所知。比如，你和你的女朋友去找一个画家给你们两人画肖像画，你们一起去，画家就可以画出你们俩的肖像画。但是你和你的女朋友分别去，你去时跟画家说，我的女朋友叫XXX，你给她也画一幅肖像画吧。但画家说，你说了你女朋友的名字，但我没有见到你女朋友的人，我不知道她是什么模样，我没法画。

user: user-0
content: 引用 1 楼 xuweiwei1860 的回复:文件关联了啊    找个。h  公用的放里面就好了 我这个目的是测试extern变量的，放入.h就失去了测试extern 变量的意义了。。为什么放在一块编译可以通过，而分别编译就不行呢？

user: user-0
content: 引用 2 楼 CarlXie 的回复:错误很明显，你分别编译的时候没有找到相应的声明。 为什么放一块编译的时候可以找到相应的声明，分别编译就不行了呢？

user: user-2
content: 错误很明显，你分别编译的时候没有找到相应的声明。

user: user-3
content: 文件关联了啊    找个。h  公用的放里面就好了
user-0 提问: 求助:怎么读取文件里面的内容,谢谢2!

回复:
user: user-1
content: if (strlen(ff)>=3 && 0==strncmp(ff+strlen(ff)-3,"jkl",3))//最后 3 位是否为 jkl

user: user-1
content: 引用 10 楼 lshlsh2008 的回复:谢谢各位大哥! 还有个问题 char ff[100];  ff 赋值为 "asd21344gh6jkl"  我希望判断 ff  的前3 位是否为 asd , 第 5和6位是否为 13  最后 3 位是否为 jkl  这个程序要怎么写? 谢谢! char ff[100];  strcpy(ff,"asd21344gh6jkl");//ff 赋值为 "asd21344gh6jkl"  if (0==strncmp(ff,"asd",3))//判断 ff  的前3 位是否为 asd , if (0==strncmp(ff+4,"13",2))//第 5和6位是否为 13 if (strlen(ff)>3 && 0==strncmp(ff+strlen(ff)-3,"jkl",3))//最后 3 位是否为 jkl

user: user-0
content: 谢谢各位大哥! 还有个问题 char ff[100];  ff 赋值为 "asd21344gh6jkl"  我希望判断 ff  的前3 位是否为 asd , 第 5和6位是否为 13  最后 3 位是否为 jkl  这个程序要怎么写? 谢谢!

user: user-2
content: 除了 fopen第二个参数有问题外, 读的方式也要注意,fread是读二进制的,如果是读的是文本文件那就不成了

user: user-3
content: 有时候一个很明显的错误，但是自己就是看不出来，别人一眼就发现了。

user: user-4

user: user-5
content: fopen fwrite fread fclose 一体的操作，多看看哈

user: user-6
content: 引用 4 楼 CarlXie 的回复:大神，您这是读文件，还是写文件？ w表示写文件，每次调用都会把文件清空，当然你读出来的就是空了。  +1

user: user-7
content: 大神，您这是读文件，还是写文件？ w表示写文件，每次调用都会把文件清空，当然你读出来的就是空了。

user: user-1
content: fopen第2个参数不能瞎写！

user: user-8
content: .......... 这个写的吧

user: user-9
content: 读文件，不应该是用SS =  fopen("c:\\1.txt","r")吗？
user-0 提问: DOS下 troboc3如何将两个.C文件连接成工程文件，求教

回复:
user: user-0
content: 引用 13 楼 zhao4zhong1 的回复:试试Complie\Build all 还是那个linker error： bad object file record in module C:\bc\lib\cs.lib  源文件是.c文件，不知道BCB打开.c文件要改部分代码？

user: user-1
content: 试试Complie\Build all

user: user-0
content: 引用 11 楼 zhao4zhong1 的回复:[quote=引用 10 楼 dxwsdosdo 的回复:] make的时候遇到了bad object file record in module C:\bc\lib\cs.lib ,这是个什么错误呢 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。  或者请改用BC++3.1[/quote] 您好，后来就是采用的BC++3.1出现的那个问题，不知道您以前有没有遇到过，求助。

user: user-1
content: 引用 10 楼 dxwsdosdo 的回复:make的时候遇到了bad object file record in module C:\bc\lib\cs.lib ,这是个什么错误呢 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。  或者请改用BC++3.1

user: user-0
content: make的时候遇到了bad object file record in module C:\bc\lib\cs.lib ,这是个什么错误呢

user: user-0
content: 按照楼上说的这个问题已经好了，现在又有了bad object file record in module C:\bc\lib\cs.lib ,这是个什么错误呢

user: user-2

user: user-3
content: 楼上这个试试。。

user: user-2
content: 先在一个目录下建立一个工程文件(.prj），例如：E:\test.prj，然后打开在里面写上你要编译的各个文件（包括其所在目录），例如：E:\test1.c E:\test2.c E:\test3.c E:\test.h 菜单（Menu）-->工程（Project）-->工程名称（Project Name），写下工程名称，例如，test.prj 然后，菜单（Menu）-->编译（Compile）-->主要的C文件（Primary  C file），填写你的主要C文件（即含有main()的那个文件） 编译成功，再菜单（Menu）-->编译（Compile）-->制作EXE文件（Make EXE file），通过后再菜单（Menu）-->编译（Compile）-->连接EXE文件(Link EXE file），这样就应该可以了。

user: user-4
content: 是不是有个Build菜单项？

user: user-0
content: 现在有两个C文件，但是不知道怎么链接到一个工程下面。。。

user: user-1
content: TurboC3不知道和BC++3.1是否一样。 Project菜单看一下。  bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028

user: user-5
content: 需要链结   光编译不行吧

user: user-0
content: 现在知道在TC3下可以open project  但是不知道怎么连接两个.C文件
user-0 提问: 为什么双击debug里的exe文件一闪就没了？

回复:
user: user-1
content: 因为程序执行完了就退出了

user: user-2
content: 在 return 前面加一个getchar 函数就欧克了

user: user-3
content: 双击是在windows下开一个窗口来运行，所有的输出都是输出到这个窗口的。程序运行结束后窗口句柄释放，所有的输出就一起销毁了。 如果想查看程序输出的话，可以通过cmd命令启动一个窗口，然后在里面通过命令行来启动可执行程序，那么输出就会输出到当前窗口。因为这个窗口并不是执行程序创建，所以不会随着程序的结束而销毁，可以保留之前的输出。

user: user-4
content: 加个暂停语句吧，在return前，system("pause");

user: user-5
content: 建议在cmd窗口中执行以下命令： cd /d "exe文件所在盘符和目录" "exe文件名"

user: user-6
content: cmd,然后在命令窗口看

user: user-7
content: 加  getchar()   不然肯定运行完就要结束的

user: user-8
content: 估计是Consol 的exe文件， 简单的在main()函数最后加getchar(); 来等待输入，让程序停住！~

user: user-9
content: 运行完毕了当然要关闭了，你有没有设置断点或者让它停下来的语句

user: user-0
content: 引用 1 楼 user-10 的回复:楼主别卖萌，是cli吗 不是，就是VC++6.0的debug文件里的exe

user: user-10
content: 楼主别卖萌，是cli吗
user-0 提问: 求一个MPI简单C或者C++代码，对二维数组进行quicksort排序

回复:
user: user-0
content: amazon这个太高级了，我只想写个简单的MPI的C程序。  [ quote=引用 1 楼 gigglesun 的回复:] 可以考虑使用这个： http://aws.amazon.com/developertools/Elastic-MapReduce?browse=1[/quote]

user: user-1
content: 可以考虑使用这个： http://aws.amazon.com/developertools/Elastic-MapReduce?browse=1
user-0 提问: 我是新手，不懂来问问题来了

回复:
user: user-1
content: 自学成才的典范

user: user-2
content: 你这么学太要命了，找本书，跟着系统学一下基础吧先

user: user-3
content: #include <stdio.h> double power(double x,int n) { double y=1;//记得初始化啊，兄弟 for(;n>0;n--)//是大于号 y=y*x; return(y); } int main() { double a,m; int b; while(1) { printf("请输入数值:\n"); scanf("%lf",&a); getchar(); scanf("%d",&b); getchar(); m=power(a,b); printf("结果为:%lf\n",m); } }  加油

user: user-4
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-5
content: 楼主瞎搞什么呢，从哪里贴的，都不看就上来问，，，

user: user-6
content: for条件写错了，应该是 n>0。其他没看

user: user-7
content: double y; 都没有赋初始值，如果系统自动赋值是0，那你的结果永远都是0  for循环循环控制条件需要检查一下

user: user-8
content: lz你上面的函数里怎么多个左括号，打错了吧 # include <stdio.h>  double power(double x, int n) { 	double y = 1;    ///////这里 	for(; n>0; n--)  //////这里该n>0 	{ 		y *= x; 	} 	return y; }	   int main(void) { 	double a, m; 	int b; 	//	while(1) 	//	{  	printf("请输入数值: "); 	scanf("%lf %d",&a, &b); 	m = power(a, b); 	printf("结果为:%lf\n", m); 	//	} 	return 0; }

user: user-9
content: #include <math.h>  return pow<double>(x,n);
user-0 提问: 求助 vc6.0没有新建源文件的选项 如图

回复:
user: user-1
content: 重装或重新下载安装包吧，

user: user-2
content: 楼主下的应该不是完整版的。

user: user-3
content: 不清楚lz什么情况，，，你的VC6.0是不是没下载完啊？     http://zhidao.baidu.com/link?url=sTACf0YM2XwoAujKb62Lzew3oTJ4VqqRgdI73vwv_qlng44wIn23IfwYReFt_XT9c_uZL8J1OOdLk0UBHT-BYa  http://zhidao.baidu.com/question/144791410.html?qbl=relate_question_0&word=%CE%AA%CA%B2%C3%B4VC6.0%C3%BB%D3%D0%D0%C2%BD%A8%D4%B4%CE%C4%BC%FE%B5%C4%D1%A1%CF%EE  学会使用百度谷歌

user: user-4
content: 没有安装完全。
user-0 提问: 关于程序基址的问题

回复:
user: user-0
content: 引用 10 楼 buyong 的回复:这个问题如果就用应用层的知识，估计是很难解释清楚的。 必须对操作系统内核机制深入研究。 使用虚拟地址是肯定的。噢，既然大家言尽于此，后面的我自己看看操作系统的书来自己理解吧

user: user-1
content: 这个问题如果就用应用层的知识，估计是很难解释清楚的。 必须对操作系统内核机制深入研究。 使用虚拟地址是肯定的。

user: user-0
content: 引用 8 楼 xiaohuh421 的回复:各种进程空间, 虚拟地址是隔离的. 基址, 即是程序代码被编译成二进制码时就已经规定好的一个绝对地址值. 一般反汇编后为: mov xxx  [XXXXXX]    //XXXXX就是16进制数字代表的值, 除非程序被破坏,或者被重新编译生成,否则是不会改变的.噢，比如基址epx（是一个虚拟地址），某程序向操作系统发出对epx+7A读或写2个字节的请求，那么操作系统会查找类似于地址转换表之类的东西，找到epx+7A对应的内存地址进行操作（读、写），那么是不是说系统分配给该程序的数据区的内存是连续的？假设我前面设想的正确：当我开了两个一样的程序时，则它们基址相同（物理内存不同？），那么我对操作系统发出对epx+7A读或写2个字节的请求时，这时候系统又该怎么找对应的物理内存地址呢？（现在是一个基址对应两块物理内存），还是说发送请求时要附加其它条件？

user: user-2
content: 各种进程空间, 虚拟地址是隔离的. 基址, 即是程序代码被编译成二进制码时就已经规定好的一个绝对地址值. 一般反汇编后为: mov xxx  [XXXXXX]    //XXXXX就是16进制数字代表的值, 除非程序被破坏,或者被重新编译生成,否则是不会改变的.

user: user-0
content: 引用 1 楼 u012033027 的回复:程序运行时，编译器生成的可执行码中的地址都是虚地址。操作系统负责把虚拟地址转换为物理地址。 至于你说的虚地址相同的问题，可能他们处于不同的进程，所以操作系统能够区分。噢，那么是不是：以同一个基址或基址+偏移量向操作系统发送读写请求,操作系统返回的是同一个物理内存地址？

user: user-0
content: 引用 3 楼 fengzizhuang 的回复:-------问题1，“假设当关闭程序重启之前有其它程序占据了那个程序的基址不就不可能不变了吗？” 程序的逻辑地址是不变的，编译的时候已经决定了，当程序启动时，即加载的内存中，操作系统会映射一定的内存给改程序，但程序的寻址任然是按自己的逻辑地址进行，映射过程由操作系统决定，是透明的 -------问题2，“好像有一点懂就是基址不是物理地址而是虚拟地址（不知道是不是？）？” 没错，基址的确不是物理地址，一个程序在寻址是，都是相对于基址的偏移量。基址与偏移量进行运算得到逻辑地址，操作系统会将逻辑地址转为为内存的物理地址。详细的原理可以参见《计算机操作系统》这本书 你可以看看，操作系统中内存管理这一块，应该能够帮助你理解程序调用过程，及地址换行法则谢谢你的解答，那么基地址是逻辑地址，操作系统给程序分配内存是是一块连续的内存吗？如果不是，基址+偏移量不就不是某个属性的动态地址了吗？既然基址是逻辑地址那CE又是怎么找到某程序的基址对应的内存地址的呢（比如我开了两个一模一样的程序，它们基址相同，CE不就不能分别是哪个了吗？）？

user: user-0
content: 引用 4 楼 sd530842780 的回复:你还是没有找到 基址吧，ce不是有tutor么，多级寻址看一下。不是，已经找到了，我是按教程找的，而且做了测试是基地址。主要就是不明白基地址为什么不变等问题。

user: user-3
content: 你还是没有找到 基址吧，ce不是有tutor么，多级寻址看一下。

user: user-4
content: -------问题1，“假设当关闭程序重启之前有其它程序占据了那个程序的基址不就不可能不变了吗？” 程序的逻辑地址是不变的，编译的时候已经决定了，当程序启动时，即加载的内存中，操作系统会映射一定的内存给改程序，但程序的寻址任然是按自己的逻辑地址进行，映射过程由操作系统决定，是透明的 -------问题2，“好像有一点懂就是基址不是物理地址而是虚拟地址（不知道是不是？）？” 没错，基址的确不是物理地址，一个程序在寻址是，都是相对于基址的偏移量。基址与偏移量进行运算得到逻辑地址，操作系统会将逻辑地址转为为内存的物理地址。详细的原理可以参见《计算机操作系统》这本书 你可以看看，操作系统中内存管理这一块，应该能够帮助你理解程序调用过程，及地址换行法则

user: user-5
content: 如果你对这个感兴趣，可以看看《深入理解计算机系统》这本书。

user: user-5
content: 程序运行时，编译器生成的可执行码中的地址都是虚地址。操作系统负责把虚拟地址转换为物理地址。 至于你说的虚地址相同的问题，可能他们处于不同的进程，所以操作系统能够区分。
user-0 提问: 初始化种群怎么，不是随机数，而是一样的？程序如下，求告诉错误原因在哪？

回复:
user: user-1
content: 引用 4 楼 u014774381 的回复:试了，不是随机函数种子问题，把断点设在for(k=0;k<5;++k) 此处就能生成随机的数  不知道你怎么式的，从代码看，你不要把srand放在函数内。

user: user-0
content: 试了，不是随机函数种子问题，把断点设在for(k=0;k<5;++k) 此处就能生成随机的数

user: user-2
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

user: user-3
content: srand丢到main的开头而不是里面init的开头。

user: user-4
content: 随机函数种子的事！
user-0 提问: ACM与编程的关系

回复:
user: user-1
content: 不要被那些华丽的界面蒙蔽了双眼，要知道程序是怎么运行的，怎么用编程解决问题，那些界面的只是程序运行时的一种假象。 程序 =  数据结构 + 算法

user: user-2
content: ACM好，多锻炼，有的职位还是需要ACM编程经验的

user: user-3
content: MapReduce是可视化的吗？

user: user-4
content: 算法还算不上底层，但固然重要，确实ACM很费时间，看你怎么权衡了

user: user-5
content: 可视化的东西很屌吗？

user: user-6
content: 其实，你说的可能会忽略的问题，那只是小问题，你花一小段时间就能赶上，而算法方面你远超别人了

user: user-7
content: 不会，我觉得。

user: user-8
content: 练内功总是要时间的。耽误不耽误看你怎么看了。

user: user-9
content: 深入底层挺好的

user: user-10
content: GUI 可做demo, 可以演示。 需求变更多也能对应，表示适应性强。 开发时间短，表示效率高。 而且这样的人要的工资还不高，也容易招募。

user: user-10
content: 引用 8 楼 zhao4zhong1 的回复:好程序 ≈ 合适的数据结构 + 巧妙的算法 + 严格的输入合法性校验 + 输出到可读性极佳的纯文本文件 - 华而不实的GUI - 改来改去的需求   中国多数老板喜欢的： 华而不实的GUI + 改来改去的需求 + 及其有限的时间内实现功能（means:  合适的数据结构 + 巧妙的算法 + 严格的输入合法性校验 + 输出到可读性极佳的纯文本文件 都不重要）

user: user-3
content: 好程序 ≈ 合适的数据结构 + 巧妙的算法 + 严格的输入合法性校验 + 输出到可读性极佳的纯文本文件 - 华而不实的GUI - 改来改去的需求
user-0 提问: 函数多次调  声明部分是否再次执行

回复:
user: user-1
content: 因为他是static变量，只初始化一次，存储区域和普通的局部变量不同

user: user-2
content: static int c=3; static就是干这个效果用的

user: user-3
content: 在函数里打个断点，然后F11单步执行，可以看到static int c = 3会被跳过

user: user-4
content: 因为c是静态变量。

user: user-5
content: static 不在函数栈分配内存， 首次调用时初始化。

user: user-6
content: 静态变量，局部变量，全局变量的区别而已。 静态变量只有第一次调用的时候初始化。 局部非静态变量每次都要初始化

user: user-7
content: 静态变量声明的问题

user: user-8
content: google C static！

user: user-9
content: static局部变量在所处模块在初次运行时进行初始化工作, 且只操作一次

user: user-10
content: 因为c是static变量，static变量只初始化一次。
user-0 提问: 哪位大哥用过linux下的工具curl啊？

回复:
user: user-1
content: linux 下man curl不就是手册嘛

user: user-0
content: 引用 1 楼 user-2 的回复:很明显校验了你的cookie或者referer 查了一下说是需要在搭建的nginx，在编译./configure时要加入 --with-http_sub_module 这个模块。。。。在nginx.conf中配置加入PUT, GET POST方法。 我们头让我实现的功能是用curl这个工具向https服务器发送一个json格式的字符串，但是查了半天只发现了能传送文件的方法。大哥有没有办法啊？？？急求啊。。。

user: user-2
content: 很明显校验了你的cookie或者referer
user-0 提问: 数据结构原理与分析跟C语言没关系么？

回复:
user: user-1
content: 为什么要有数据结构这个东东？ 因为要将现实世界或者抽象理论中的各种数据保存在计算机外存（光盘、硬盘、U盘……）或内存（ROM、RAM、SRAM……）里面的二进制字节数组中。 然后让CPU这个只会执行预先保存好的加减乘除移位条件转移……等机器指令的家伙按照人的意志去处理这些数据。至于具体如何处理就是所谓算法。

user: user-2
content: 数据结构和算法只是用计算机解决问题时的数据化形式和实现的方法，和语言基本没有特定关系

user: user-0
content: 自考数据结构原理与分析还有算法设计与分析看哪本书好呢？？？

user: user-3
content: 没有关系啊，只是你可以用C语言或者c++来数据结构或者算法。如果你觉得有关系，那是什么关系呢

user: user-4
content: 数据结构，算法这些和语言都没什么关系，
user-0 提问: 如何将jobject转换成float呢？其中jobject对应的是Float对象类型

回复:
user: user-1
content: FindClass  jfieldID fieldId   = (*env)->GetFieldID(env, objectClass, "value", "F");   jobject myobject   = score;          jmethodID methodID = (*env)->GetMethodID(env,objectClass,"floatValue","()F");   SetFloatField  大概这样

user: user-0
content: 引用 1 楼 user-2 的回复:[quote=引用 楼主 lgmsyy 的回复:] JAVA ： Float x = new Float(x);  C： JNIEXPORT jint JNICALL Java_com_test(JNIEnv * env, jobject obj, ...,jobject score){ // jobject对应的是JAVA的 Float对象 请问如何将jobject的值赋值给C语言的float float fs = score;//这个地方应该如何转换呢  } jobject fScore  JNI 找到对应class，取值，再赋值，JNI API接口有对应函数。[/quote]  主要是取值，赋值那个地方如何做？

user: user-0
content: 引用 1 楼 user-2 的回复:[quote=引用 楼主 lgmsyy 的回复:] JAVA ： Float x = new Float(x);  C： JNIEXPORT jint JNICALL Java_com_test(JNIEnv * env, jobject obj, ...,jobject score){ // jobject对应的是JAVA的 Float对象 请问如何将jobject的值赋值给C语言的float float fs = score;//这个地方应该如何转换呢  } jobject fScore  JNI 找到对应class，取值，再赋值，JNI API接口有对应函数。[/quote]  具体的怎么编写呢

user: user-2
content: 引用 楼主 lgmsyy 的回复:JAVA ： Float x = new Float(x);  C： JNIEXPORT jint JNICALL Java_com_test(JNIEnv * env, jobject obj, ...,jobject score){ // jobject对应的是JAVA的 Float对象 请问如何将jobject的值赋值给C语言的float float fs = score;//这个地方应该如何转换呢  } jobject fScore  JNI 找到对应class，取值，再赋值，JNI API接口有对应函数。
user-0 提问: 为何需要自己管理内存

回复:
user: user-1
content: 减少向系统申请和释放内存的次数。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:搜“内存池” 先谢谢啦，我去看看。csdn到处都有你的身影，大神~~

user: user-2
content: 搜“内存池”
user-0 提问: 自定义函数问题，求解释

回复:
user: user-1
content: 引用 楼主 u014687239 的回复: #define _STDC_WANT_LIB_EXT1_1 #include <stdio.h> #include <stdlib.h> #define MAX_COUNT 50  double Sum (double x[],size_t n) { 	double dsum=0; 	for(size_t i=0;i<n;i++) 	{ 		dsum=dsum+x[i]; 	} 	return dsum; } double average (double x[],size_t n) { 	return Sum(&x[0],n)/n; } size_t Getdata(double *data,size_t max_count) { 	size_t nvalues=0; 	printf("How many values do you want to enter(Maximum 50)?"); 	scanf("%d",&nvalues); 	if(nvalues>max_count) 	{ 		printf("maximum count exceeded . %zd items will be read.",max_count); 		nvalues=max_count; 	} 	for(size_t i=0;i<nvalues;i++) 	{ 		scanf("%d",&data[i]);//这步改为 scanf("%lf",&data[i])即可 	} 	return nvalues; }  int main () { 	double samples[MAX_COUNT]={0.0}; 	size_t samplecount=Getdata(samples,50); 	double aaverage =average(samples,samplecount); 	printf("%f",aaverage); 	system("pause"); 	return 0; }   运行结果总是0.000000，这是为什么，求解释。 看代码注释，你用double型数据来保存输入的数据，因为用%d来接收是不行的！将scanf("%d",&data[i])改为scanf("%lf",&data[i])即可

user: user-2
content: 跟踪看下是哪步有问题啊，估计是求和那有问题
user-0 提问: C语言小端法排序的问题

回复:
user: user-0
content: 引用 5 楼 lm_whales 的回复:87654321  本来就存储错数据了。  应该存储，0x12345678,或者0x78563412; //16  进制常量，每两个数字字符，表示一个自己的二进制 这两个是，不同字节顺序存储同一个数的结果。 不过编译器会自动调整的，只有在不同字节顺序的系统上才能看出字节顺序的区别，其实存入文件的数据最容易辨别了 一个整型存储 0x12345678在文件里，按照字符顺序读出来，在不同系统上显示，顺序是不同的。 如果真的想存储字符，这么存储。 unsigned char a[]="0x12345678"; 我明白了。 87654321  倒过来可不是就取出字节 可不就是21 2143

user: user-1
content: 87654321  本来就存储错数据了。  应该存储，0x12345678,或者0x78563412; //16  进制常量，每两个数字字符，表示一个自己的二进制 这两个是，不同字节顺序存储同一个数的结果。 不过编译器会自动调整的，只有在不同字节顺序的系统上才能看出字节顺序的区别，其实存入文件的数据最容易辨别了 一个整型存储 0x12345678在文件里，按照字符顺序读出来，在不同系统上显示，顺序是不同的。 如果真的想存储字符，这么存储。 unsigned char a[]="0x12345678";

user: user-2
content: 1.首先intel架构采用的小端存储法，故(21排在最前)低字节位排前 2.理解字节存储，21为一个字节，1存低四位，2存高四位。 不知这样能解释的通不

user: user-0
content: 引用 2 楼 u012586257 的回复:你那书是错的 单字节不存在大小端，数据是21，内存里也是21，打出来还是21 我存进去的是87654321  为什么到内存里就变成这样了

user: user-3
content: 你那书是错的 单字节不存在大小端，数据是21，内存里也是21，打出来还是21

user: user-0
content: 我是64位的  WIN7系统
user-0 提问: 才学指针，想用指针实现一个字符串复制的函数

回复:
user: user-1
content: 字符串指针不能拆开，在自定义函数中，写入s=t就行了.

user: user-2
content: 移步 http://stackoverflow.com/questions/8716714/bus-error-10-error?answertab=votes#tab-top

user: user-3
content: char *s = "123456"; char *t = "111111";  这个时候，指针指向的是常量，数组的时候是变量。 常量是不能修改的。如果修改常量的值，就会有问题。

user: user-4
content: char *s =new char [10]; strcpy(s,"123456"); delete [] s;
user-0 提问: 关于指针的问题，*p和**p，实在没有理解，求教！

回复:
user: user-0
content: 引用 3 楼 mcmay 的回复:[quote=引用 楼主 u014496787 的回复:] 有两段代码，都是正确的，如下： NO.1  main(){ int x,*p,**pp; x=10; p=&x; pp=&p; printf("x=%d\n",**pp); }  NO.2  main(){ static char *ps[]={ "BASIC","DBASE","C","FORTRAN", "PASCAL"}; char **pps; int i; for(i=0;i<5;i++){ pps=ps+i; printf("%s\n",*pps); } } l两段代码中最后一句分别用了**pp和*pps，明显意义不同，为何输出却又是正确的，我自己在分别修改**pp为*pp和*pps为**pps之后没有得到合理结果，求知道的解释下，万分感激！ NO1 pp = &p; p = & x; int x = 10;  ** pp = **(&p) = *p = *&x = x 而将 **pp 改为 *p后 *pp = *(&p) = p = &x != x  NO 2 char **pps pps =  ps + i *pps = *(ps + i) = ps[i]，即字符串二维数组当中的每个字符串的首地址，用%s输出，则是相应的字符串 **pps = **(ps + i) = *(ps[i]) 而ps[i] = &ps[i][0] 所以*(ps[i]) = *(&ps[i][0]) = ps[i][0] ps[i][0]是个字母，后面没跟'\0'，但用%s输出，因此结果不可预测。[/quote] 原来指针是用这样的方法分析的呀，受教了，谢谢！

user: user-1
content: 引用 1 楼 bbs2241 的回复:1 我自己在分别修改**pp为*pp  *pp是什么，这是个指针，printf("x=%d\n",*pp);  %d将指针的内容打印出来了，这个指针的内容是指向x的地址的  2 和*pps为**pps之后没有得到合理结果，求知道的解释下，万分感激！  **pps是什么，是字符，printf("%s\n",**pps); %s是将字符串打印出来，而你传给print的是字符，结果是什么，oh no......... access violation有个问题，想要打印一个地址的类容使用%p,而不是%d

user: user-0
content: 引用 2 楼 u014496787 的回复:[quote=引用 1 楼 bbs2241 的回复:] 1 我自己在分别修改**pp为*pp  *pp是什么，这是个指针，printf("x=%d\n",*pp);  %d将指针的内容打印出来了，这个指针的内容是指向x的地址的  2 和*pps为**pps之后没有得到合理结果，求知道的解释下，万分感激！  **pps是什么，是字符，printf("%s\n",**pps); %s是将字符串打印出来，而你传给print的是字符，结果是什么，oh no......... access violation 谢谢热心帮助，按照你的解释我理解了这样的修改是不对的，另外我也知道第一种情形是要以指针变量的方式输出数据，但是对第二种还不甚理解，*pps不是char型没错，可是难道是指针变量吗？[/quote] 刚发出去，我再看了下代码，大神帮我看下是不是这样的：“ps返回指针，ps+i返回i行即第i+1个字符串的首地址，即pps返回第i+1个字符串的地址，*pps成为指针变量型，返回地i+1个字符串。”

user: user-2
content: 引用 楼主 u014496787 的回复:有两段代码，都是正确的，如下： NO.1  main(){ int x,*p,**pp; x=10; p=&x; pp=&p; printf("x=%d\n",**pp); }  NO.2  main(){ static char *ps[]={ "BASIC","DBASE","C","FORTRAN", "PASCAL"}; char **pps; int i; for(i=0;i<5;i++){ pps=ps+i; printf("%s\n",*pps); } } l两段代码中最后一句分别用了**pp和*pps，明显意义不同，为何输出却又是正确的，我自己在分别修改**pp为*pp和*pps为**pps之后没有得到合理结果，求知道的解释下，万分感激！ NO1 pp = &p; p = & x; int x = 10;  ** pp = **(&p) = *p = *&x = x 而将 **pp 改为 *p后 *pp = *(&p) = p = &x != x  NO 2 char **pps pps =  ps + i *pps = *(ps + i) = ps[i]，即字符串二维数组当中的每个字符串的首地址，用%s输出，则是相应的字符串 **pps = **(ps + i) = *(ps[i]) 而ps[i] = &ps[i][0] 所以*(ps[i]) = *(&ps[i][0]) = ps[i][0] ps[i][0]是个字母，后面没跟'\0'，但用%s输出，因此结果不可预测。

user: user-0
content: 引用 1 楼 bbs2241 的回复:1 我自己在分别修改**pp为*pp  *pp是什么，这是个指针，printf("x=%d\n",*pp);  %d将指针的内容打印出来了，这个指针的内容是指向x的地址的  2 和*pps为**pps之后没有得到合理结果，求知道的解释下，万分感激！  **pps是什么，是字符，printf("%s\n",**pps); %s是将字符串打印出来，而你传给print的是字符，结果是什么，oh no......... access violation 谢谢热心帮助，按照你的解释我理解了这样的修改是不对的，另外我也知道第一种情形是要以指针变量的方式输出数据，但是对第二种还不甚理解，*pps不是char型没错，可是难道是指针变量吗？

user: user-3
content: 1 我自己在分别修改**pp为*pp  *pp是什么，这是个指针，printf("x=%d\n",*pp);  %d将指针的内容打印出来了，这个指针的内容是指向x的地址的  2 和*pps为**pps之后没有得到合理结果，求知道的解释下，万分感激！  **pps是什么，是字符，printf("%s\n",**pps); %s是将字符串打印出来，而你传给print的是字符，结果是什么，oh no......... access violation
user-0 提问: 关于getch和getchar用法求助

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:for( ; i <= 20; i++) i == 20 时，数组ch[i] 下标越界，*(ch + i)指向了*(ch + i)（当i == 19）时的下一个地址，而这个地址是不确定的，因此*(ch + i) (i == 20时）所指向的内存单元的内容也就不确定了，方括号内的字符就是不确定的。 至于i为什么会等于53（或者再一次运行程序，这个值还会发生变化），这是因为*(ch + i)（i == 20时）所指向的地址，例如在我的电脑上编译运行时ch + i 是 0x0022ff09，它与ch（例如在我的电脑上：ch是 0x0022fed8）所指向的地址（即数组的地址）之差，即 *(ch + i)（请当成一个整体地址看待）- ch = 两个地址之间的距离，即*(ch + i)之中的i（此i非for循环当中的那个i（这个i是int变量））。例如；当ch = 0x0022fed8，而(ch + i) = 0x0022ff09时，0x0022ff09 - 0x0022fed8 = 0x31（等于10进制的49）。  ch = 0022fed8 0       0 = [1] 0022fed8 1       1 = [1] 0022fed9 2       2 = [1] 0022feda 3       3 = [1] 0022fedb 4       4 = [1] 0022fedc 5       5 = [1] 0022fedd 6       6 = [1] 0022fede 7       7 = [1] 0022fedf 8       8 = [1] 0022fee0 9       9 = [1] 0022fee1 10      10 = [1]        0022fee2 11      11 = [1]        0022fee3 12      12 = [1]        0022fee4 13      13 = [1]        0022fee5 14      14 = [1]        0022fee6 15      15 = [1]        0022fee7 16      16 = [1]        0022fee8 17      17 = [1]        0022fee9 18      18 = [1]        0022feea 19      19 = [1]        0022feeb 20      49 = [_]        0022ff09  Process returned 0 (0x0)   execution time : 7.763 s Press any key to continue. 谢谢哈，我发现越界了但是还是不懂为什么是53，，原来是因为地址的不确定

user: user-1
content: for( ; i <= 20; i++) i == 20 时，数组ch[i] 下标越界，*(ch + i)指向了*(ch + i)（当i == 19）时的下一个地址，而这个地址是不确定的，因此*(ch + i) (i == 20时）所指向的内存单元的内容也就不确定了，方括号内的字符就是不确定的。 至于i为什么会等于53（或者再一次运行程序，这个值还会发生变化），这是因为*(ch + i)（i == 20时）所指向的地址，例如在我的电脑上编译运行时ch + i 是 0x0022ff09，它与ch（例如在我的电脑上：ch是 0x0022fed8）所指向的地址（即数组的地址）之差，即 *(ch + i)（请当成一个整体地址看待）- ch = 两个地址之间的距离，即*(ch + i)之中的i（此i非for循环当中的那个i（这个i是int变量））。例如；当ch = 0x0022fed8，而(ch + i) = 0x0022ff09时，0x0022ff09 - 0x0022fed8 = 0x31（等于10进制的49）。  ch = 0022fed8 0       0 = [1] 0022fed8 1       1 = [1] 0022fed9 2       2 = [1] 0022feda 3       3 = [1] 0022fedb 4       4 = [1] 0022fedc 5       5 = [1] 0022fedd 6       6 = [1] 0022fede 7       7 = [1] 0022fedf 8       8 = [1] 0022fee0 9       9 = [1] 0022fee1 10      10 = [1]        0022fee2 11      11 = [1]        0022fee3 12      12 = [1]        0022fee4 13      13 = [1]        0022fee5 14      14 = [1]        0022fee6 15      15 = [1]        0022fee7 16      16 = [1]        0022fee8 17      17 = [1]        0022fee9 18      18 = [1]        0022feea 19      19 = [1]        0022feeb 20      49 = [_]        0022ff09  Process returned 0 (0x0)   execution time : 7.763 s Press any key to continue.

user: user-0
user-0 提问: 小问题

回复:
user: user-1
content: 楼上说的对

user: user-2
content: 引用 楼主 huang514469 的回复:#include<stdio.h> void main() { 	char c; 	if((c=getchar())=EOF) 	{ 		printf("13"); 	} 	 } 本人测试代码如上，但我在控制台输入完字符按enter键时输出13，但是输完字符按ctrl+z时显示^z并不是文件结束标志，求解释！！！  1. if((c=getchar())=EOF), 这编译都过不了，应该是== 2. 按ctrl+c, linux按ctrl+d

user: user-3
content: 请养成在if语句中将常量写在==左边的好习惯！

user: user-4
content: 引用 1 楼 user-6 的回复:if((c=getchar())=EOF) 改成 if((c=getchar())==EOF)

user: user-5
content: 注意=与==的区别，前者是赋值符号，后者是判断符号

user: user-6
content: if((c=getchar())=EOF) 改成 if((c=getchar())==EOF)
user-0 提问: 底层数据的写入

回复:
user: user-1
content: 假设你使用的是SATA的硬盘，要实现这个目的需要用到ATA协议中的指令，去看看ATA的协议标准文档。但另一方面，在windows系统中，处在用户层是没有办法对硬盘实现这种底层操作的。你可以从这两方面着手。
user-0 提问: 这段伸展树代码，我用错了吗？

回复:
user: user-0
content: compare(struct my_entry *a, struct my_entry *b) {         return (a->key<b->key); }  改成  compare(struct my_entry *a, struct my_entry *b) {         return (a->key-b->key); }

user: user-1
content: 引用 1 楼 user-2 的回复:找了一段？不如自己写啊。 +1，看过不如做过，做过不如错过。

user: user-2
content: 找了一段？不如自己写啊。
user-0 提问: 菜鸟求问。C语言字符指针问题

回复:
user: user-1
content: 字符串常量是放在只读数据段中的。不具有写的能力，不能修改！

user: user-2
content: 引用 1 楼 a156435646 的回复:UPUPUPUPUPUP  char s[] ="xxx";  char *s = "xxx"; //指向静态区，可读不可改

user: user-3
content: 5楼的方法是正解  你用char * 是把s指向一个常量字符串，对常量字符串的内容是不能修改的， 在定义时char s[]，是一个字符数组，数组的内容是可以修改的。

user: user-4
content: 引用 4 楼 HiSoldier__ 的回复:char *S = abcdef"; 是常量，不能S[2] = '\0'这样操作 你也可以这样理解（不太正规） char *S = abcdef";这一语句中的S只是一个字符型指针而非字符型数组，所以S是有值的，它的值是字符串的首地址，又应为S并非是常指针，所以S的值是可以变的，即可以进行S++，s+1·····这一类的改变地址的操作。

user: user-5
content: #include<stdio.h> int main() { 	char s[]="abcdef"; 	// u see 	printf("%s\n",s);     s[1] = '\0'; 	//u see again 	printf("%s\n",s); 	return 0; }

user: user-6
content: char *S = abcdef"; 是常量，不能S[2] = '\0'这样操作

user: user-7
content: S=(char*)malloc(6); strcpy(S, "abcdef\0"); S[2] = '\0';

user: user-8
content: char *S="abcdef"; //1 这个语句里的字符串“abcdef“是字符串常量，存放在静态区，不能被 S[2]='\0'; 这样的语句修改其中的值。*S只是个指针而已，并不分配内存空间，对它所指向的字符串常量无法加以修改。

user: user-0
content: UPUPUPUPUPUP
user-0 提问: 求解释，在vc6.0上运行是a=3，b=17。但我算的是b=19啊。求大神指点一下

回复:
user: user-1
content: C,C++表达式求值顺序 裘老的解释。

user: user-2
content: 没必要考虑这种情况，这种情况下c标准本来就没有规范的结果是未定义的，具体结果看各个编译器厂家自己的实现，你可能在cfree中运行又不一样了

user: user-3
content: 为什么要纠结这个呢，这样的结果是未定义的。一个编译器一个结果。