Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: c语言为啥第二次调用函数,,会出现第一次的值，第一次调用会出现乱码，用c++6.0编写的

回复:
user: user-1
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-2
content: // main函数改成这样吧 //这个结果是和编译器有关系，printf函数不同的编译器参数入栈的顺序是不同的！ #include <stdio.h> int main() {     float average(float array[],int n,float a[2]);     float a[2];     float score1[]={98.5,97,91.5,60,55}, score2[]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5};     printf("The average of class A is %6.2f \n",average(score1,5,a));     printf("the largest is %6.2f the smallest is %6.2f\n",a[0],a[1]);     printf("The average of class B is %6.2f \n",average(score2,10,a));     printf("the largest is %6.2f the smallest is %6.2f\n",a[0],a[1]);     return 0; }

user: user-3
content: 根据C语言标准6.5.2.2.10 The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.  average(), a[0], a[1]都是printf()的参数, 它们之间的计算顺序是不能假定的,也就是说你不能因为a[0], a[1]写在了后面就认为是在调用average()后的结果.

user: user-4
content: http://digital.cs.usu.edu/~allanv/cs2420/debugger_intro.pdf

user: user-5
content: 可能没说明白 就是第一次调用函数average()的时候 a[0],a[1] 里面没有值；他是先输出a[1],然后a[0]，在调用函数average()，乱码是因为你的数组没有初始化；同理第二次调用函数average()的时候，存的是前面的a[1]与a[0]，所以是第一次调用的值。

user: user-5
content: #include <stdio.h> int main(){ 	float average(float array[],int n,float a[2]); 	float a[2] = {0}; 	float score1[]={98.5,97,91.5,60,55}, score2[]={67.5,89.5,99,69.5,77,89.5,76.5,54,60,99.5}; 	float aver; 	aver = average(score1,5,a); 	printf("The average of class A is %6.2f the largest is %6.2f the smallest is %6.2f\n",aver,a[0],a[1]); 	aver = average(score2,10,a); 	printf("The average of class B is %6.2f the largest is %6.2f the smallest is %6.2f\n",aver,a[0],a[1]); 	return 0; }   float average(float array[],int n,float a[2]){ 	int i; 	float aver,sum=array[0]; 	a[0]=array[0]; 	a[1]=array[0]; 	for(i=1;i<n;i++) 	{ 		if(a[0]<array[i]) 			a[0]=array[i]; 		if(a[1]>array[i]) 			a[1]=array[i]; 		sum=sum+array[i]; 	} 	aver=sum/n; 	return (aver); } 首先定义的数组最好初始化，之所以出现你说的那种情况是由于函数printf()带来的，它是从后面就是a[2]向前进栈，所以之前没有执行你的函数average()故没有值；第二次输出的是第一次的值。代码个人觉得写的有点冗余，我也没改这样修改应该是对的！
user-0 提问: 内存驻留程序（TSR）问题

回复:
user: user-0
content: 引用 1 楼 supermegaboy 的回复:不行，TSR是实模式时代的东西，而VS产生的代码是保护模式的。  你应该用tc写TSR  可以用vs环境编写类似tsr程序的么？

user: user-1
content: 引用 3 楼 lpcads 的回复:[quote=引用 2 楼 u010165006 的回复:] TSR是DOS时代的东西吧，Windows是多任务。记得以前学微机原理的时候学汇编语言，想把一个动态显示时钟的程序改成TSR，结果没有成功，没有研究下去了。 你是不是使用 int 21h 显示字符串了，改用 int 10h 就可以了。[/quote] 也可能是，以前没有网络，有问题也不一定能找到帮助，现在DOS和BIOS中断向量这些我都忘光了。

user: user-2
content: 使用 masm 编译，32位系统cmd下可以运行（相当于虚拟8086模式）。如果是64位系统，那只能安装虚拟机了（xp）。

user: user-2
content: 引用 2 楼 u010165006 的回复:TSR是DOS时代的东西吧，Windows是多任务。记得以前学微机原理的时候学汇编语言，想把一个动态显示时钟的程序改成TSR，结果没有成功，没有研究下去了。 你是不是使用 int 21h 显示字符串了，改用 int 10h 就可以了。

user: user-1
content: TSR是DOS时代的东西吧，Windows是多任务。记得以前学微机原理的时候学汇编语言，想把一个动态显示时钟的程序改成TSR，结果没有成功，没有研究下去了。

user: user-3
content: 不行，TSR是实模式时代的东西，而VS产生的代码是保护模式的。  你应该用tc写TSR
user-0 提问: ‘#’的意思

回复:
user: user-1
content: 一个#是替换为字符串。比如： #define PRINT(NO) printf("Timer_"#NO" is over\n") 如果程序中有： PRINTF(1),会替换为printf("Timer_1 is over\n"),即#NO把NO转化为了字符串（1转为"1")。

user: user-2
content: 引用 1 楼 truelance 的回复:http://blog.csdn.net/blackbillow/article/details/3850587+1

user: user-3
content: 编译选项加/EP /P，重新编译，查看宏展开后对应的.i文件。gcc加-E

user: user-4
content: http://blog.csdn.net/blackbillow/article/details/3850587
user-0 提问: 两个不一样的结构为什么会一样大？

回复:
user: user-1
content: 我们改变下顺序： typedef struct _SS {     	ULONG PrivateUsage; 	LARGE_INTEGER   CreateTime;     VM_COUNTERS     VmCounters;     } SS; 就是64了。你看到，它总是8的倍数。说明它按照8字节（64bit）对齐的。

user: user-1
content: 因为有对齐  http://pppboy.blog.163.com/blog/static/30203796201082494026399/
user-0 提问: 求大神帮我看下一条改错题

回复:
user: user-1
content: while (*s) {         ch = *s;         if (('A' <= ch && ch <= 'Z'))//这里判断的逻辑有问题，大写字母转成小写字母             sp[k++] = ch - 'A' + 'a';         else if ('a' <= ch && ch <= 'z')             sp[k++] = ch;         s++;  } 这部分代码的作用是处理字符串，具体是： 1.大写字母->小写字母 2.过滤掉非字母的特殊符号 3.小写字母不做处理  所以，"Madam, I'm Adam. "会被处理成“madamimadam”

user: user-1
content: 仅供参考：  #include <stdio.h> #include <string.h> #include <stdlib.h>  int palin(char *s) { 	int i, j, k, ok; 	char *sp, ch; 	k = strlen(s); 	sp = (char *) malloc(k + 1); 	if (sp == NULL) { 		printf("error!\n"); 		exit(0); 	} 	k = 0; 	while (*s) { 		ch = *s; 		if (('A' <= ch && ch <= 'Z'))//这里判断的逻辑有问题，大写字母转成小写字母 			sp[k++] = ch - 'A' + 'a'; 		else if ('a' <= ch && ch <= 'z') 			sp[k++] = ch; 		s++; 	} 	sp[k] = '\0'; 	ok = 1; 	for (i = 0, j = k - 1; i < j; i++, j--) 		if (sp[i] != sp[j]) { 			ok = 0; 			break; 		} 	free(sp); 	return ok; } int  main() { 	char s[2][80] = { "Madam, I'm Adam. ", "aba." }; 	int i, ok; 	for (i = 0; i < 2; i++) { 		ok = palin(s[i]); 		printf(ok ? "%s: Yes.\n" : "%s: No.\n", s[i]); 	}  	return 0; }

user: user-2
content: {   ch=*s;     if(!('A'<=ch && ch<='Z'))       sp[k++]=ch-'A'+'a';     else if('a'<=ch && ch<='z')            sp[k++]=ch;     s++; } 对大写字母没有做处理
user-0 提问: 宏替换，交换数组元素后，数组为空，请大家帮忙看看

回复:
user: user-1
content: 这是一个经典问题, 不经过中间变量交换两个变量的值, 没有一种写法是正确的.

user: user-1
content: 因为你写的那个SP(A, B)的宏, 只有在&A != &B的情况下才会成立. 而你调用的代码SP(s[b],s[i]), 当b==i时, 就会出现错误.

user: user-0
content: 引用 楼主 xiaolanghh 的回复:下面是一个全排列函数，发现此函数只打印输出数组的最后一个值，我用GDB调试，发现是用宏替换交换元素后，打印s的值为空，但是不知道是问题在哪里，请大家帮忙看看，先谢谢了，下面是部位代码   4 #define SP(A,B) {(A)=(A)+(B);(B)=(A)-(B);(A)=(A)-(B);}    13   void recursion(char *s,int b,int e)  14 {  15     int i;//作为输出循环控制  16     if(b>=e)  17     {  18         for(i=0;i<=e;i++)  19         {  20             printf("%c",s[i]);  21         }  22         printf("\n");  23     }  24     else  25     {  26         for(i=b;i<=e;i++)  27         {  28             SP(s[b],s[i]);  29             recursion(s,b+1,e);  30             SP(s[b],s[i]);  31         }  32     }  33 } 下面是GDB单步执行前后 s的值 用指针传值没有问题，能正常输出，我是想知道用宏替换为什么会出错？到底问题是出在什么地方

user: user-2
content: 应该是传值问题吧  用引用or指针传值？  不用#define 用inline再整泛型不好些吗

user: user-1
content: [quote=引用 6 楼 zhao4zhong1 的回复:] quote]  char * const s1 = new char[10]; char * const s2 = new char[10]; strcpy(s1, "aa"); strcpy(s2, "bbbb"); SWAP(s1, s2);

user: user-3
content: 引用 4 楼 truelance 的回复:这是一个经典问题, 不经过中间变量交换两个变量的值, 没有一种写法是正确的. #include <stdio.h> #define SWAP(a,b) do ((&(a))!=(&(b)))?((a)^=(b)^=(a)^=(b)):((a)=(a)); while (0) char   *p1="1" ,*p2="2" ; char    c1=1   , c2=2   ; short   s1=1   , s2=2   ; int     i1=1   , i2=2   ; __int64 I1=1i64, I2=2i64; float   f1=1.0f, f2=2.0f; double  d1=1.0 , d2=2.0 ; void main() {     SWAP((int)p1,(int)p2);                printf("char *     %5s,   %5s\n",p1,p2);     SWAP(c1,c2);                          printf("char       %5d,   %5d\n",c1,c2);     SWAP(s1,s2);                          printf("short      %5d,   %5d\n",s1,s2);     SWAP(i1,i2);                          printf("int        %5d,   %5d\n",i1,i2);     SWAP(I1,I2);                          printf("__int64 %5I64d,%5I64d\n",I1,I2);     SWAP(*(int     *)&f1,*(int     *)&f2);printf("float      %5g,   %5g\n",f1,f2);     SWAP(*(__int64 *)&d1,*(__int64 *)&d2);printf("double    %5lg,  %5lg\n",d1,d2);      SWAP(c1,c1);     printf("%d\n",c1); } //char *         2,       1 //char           2,       1 //short          2,       1 //int            2,       1 //__int64     2,    1 //float          2,       1 //double        2,      1 //2

user: user-0
content: 引用 2 楼 xiaolanghh 的回复:[quote=引用 楼主 xiaolanghh 的回复:] 下面是一个全排列函数，发现此函数只打印输出数组的最后一个值，我用GDB调试，发现是用宏替换交换元素后，打印s的值为空，但是不知道是问题在哪里，请大家帮忙看看，先谢谢了，下面是部位代码   4 #define SP(A,B) {(A)=(A)+(B);(B)=(A)-(B);(A)=(A)-(B);}    13   void recursion(char *s,int b,int e)  14 {  15     int i;//作为输出循环控制  16     if(b>=e)  17     {  18         for(i=0;i<=e;i++)  19         {  20             printf("%c",s[i]);  21         }  22         printf("\n");  23     }  24     else  25     {  26         for(i=b;i<=e;i++)  27         {  28             SP(s[b],s[i]);  29             recursion(s,b+1,e);  30             SP(s[b],s[i]);  31         }  32     }  33 } 下面是GDB单步执行前后 s的值 用指针传值没有问题，能正常输出，我是想知道用宏替换为什么会出错？到底问题是出在什么地方[/quote]谢谢解答，请问你是怎么知道的，有相关资料吗？我想学习下
user-0 提问: 为什么这两个C程序例子输出的结果不一样？

回复:
user: user-1
content: 引用 1 楼 KenZhang1031 的回复:C语言函数调用时，参数是按照从右到左入栈的，因此printf("%d,%d\n",b=a+b,a=2*b)函数调用时，a=2*b先入栈，即先计算2*b，那么 a=0，0入栈，然后b=a+b算出b=0，0再入栈。因此参数是两个0。+0.5 其实也是要看具体的编译环境的。

user: user-2
content: 压入堆栈的方式决定，如LS几位说的一样，但是没有多大意义。 其实我是来骗分的。

user: user-3
content: 可以参见C99标准6.5.2.2.10 The order of evaluation of the function designator, the actual arguments, and subexpressions within the actual arguments is unspecified, but there is a sequence point before the actual call.

user: user-3
content: Example 2中, 多个表达式计算出现在一个函数调用的参数中, 计算顺序按标准规定是由编译器自由决定的, 所以结果在不同编译器下不同, 不能期望有确定的结果.

user: user-4
content: 函数参数入栈的顺序导致的！这个也是和环境有关系的！ 不必深究！

user: user-5
content: C语言函数调用时，参数是按照从右到左入栈的，因此printf("%d,%d\n",b=a+b,a=2*b)函数调用时，a=2*b先入栈，即先计算2*b，那么 a=0，0入栈，然后b=a+b算出b=0，0再入栈。因此参数是两个0。
user-0 提问: 数组为什么又叫做向量呢？

回复:
user: user-1
content: 引用 21 楼 u012967319 的回复:就好像浮點數又叫實數一樣  但我偏向喜歡浮點數更準確,更貼切,更易理解 雖然第一次聽到時覺得怪怪得,但到了了解浮點數在內存內是以什麼樣的存法時 就覺得很有趣又適合 简单来说就是错的。 通常意义上的浮点数就是有理数的某个真子集。有理数是实数的真子集。两者的补集的势比起本身的来说还都更大。 就算是只针对C，浮点数也有浮点实数和浮点复数的区别。

user: user-1
content: 广义来说向量是数组的一种。 “关联数组”一般就不会当作向量，因为没法保证适应上下标/索引的定义域是自然数的习惯。 有些其它的数组实现，如Iliffe vector，还是会叫做向量，因为这种数据结构的确可以用经典的向量表示。

user: user-2
content: 就好像浮點數又叫實數一樣  但我偏向喜歡浮點數更準確,更貼切,更易理解 雖然第一次聽到時覺得怪怪得,但到了了解浮點數在內存內是以什麼樣的存法時 就覺得很有趣又適合

user: user-0
content: 引用 19 楼 wusuopuBUPT 的回复:In typical usage, an "array" can mean either a single-dimensional array, or a multidimensional array. Also, in mathematics, a matrix is a 2-dimensional array while a vector is a 1-dimensional array.  ---------------- 一维数组->向量 二维数组->矩阵嗯，嗯，已经理解啦。

user: user-3
content: In typical usage, an "array" can mean either a single-dimensional array, or a multidimensional array. Also, in mathematics, a matrix is a 2-dimensional array while a vector is a 1-dimensional array.  ---------------- 一维数组->向量 二维数组->矩阵

user: user-0
content: 引用 17 楼 lm_whales 的回复:向量用若干元素，表示各个维度的坐标，正好和计算机中的数组相似。 于是就用动态数组，实现向量类，可以表示一维数组和向量。 不过向量和数组维度的概念，是不同的。  向量的维度表示坐标分量个数，数组的维度表示下标个数. N维向量只需要一维数组表示。嗯，明白啦。。。。

user: user-4
content: 向量用若干元素，表示各个维度的坐标，正好和计算机中的数组相似。 于是就用动态数组，实现向量类，可以表示一维数组和向量。 不过向量和数组维度的概念，是不同的。  向量的维度表示坐标分量个数，数组的维度表示下标个数. N维向量只需要一维数组表示。

user: user-4
content: 计算机的出现，最初就是解决计算问题，也就是数学问题的。 所以里面，会有很多概念来自数学。 比如 ，函数，比如向量。

user: user-5
content: 你说的是vector把？

user: user-6
content: 向量可以用数组来表达，向量是一个数学概念，而数组是一种用于描述它的数据结构，就像矩阵一般也用数组来表达一样。  引用 楼主 zhang5476499 的回复:一些书上把数组称呼为向量？数组与向量有关联么？

user: user-7
content: 我觉得应该是数学领域带过来的，数学里面都叫向量，矩阵，然后呢数学计算机不分家嘛。

user: user-8
content: 向量？带方向的？ 围观...

user: user-9
content: 向量是数学（线性代数）中的概念，带过来了。 如果很好奇，可以考虑重新学线代。

user: user-0
content: 引用 8 楼 czarten 的回复:[quote=引用 7 楼 czarten 的回复:] 因为本质是一样的 n维向量就是n个数的有序组，比如三维向量，就是(x,y,z)，任何一个(x,y,z)组唯一对应一个三维向量，这里把x，y，z改名为a0，a1，a2，就是int a[3]数组了  再说清楚点，对数组int a[3]的任何一种赋值，都唯一对应三维空间上的一个向量(a0,a1,a2)，所以数组和向量是等价的，当然int是离散值向量是连续值，这个是计算机和数学的区别[/quote]还是没有理解啊。

user: user-0
content: 引用 12 楼 cheng7068 的回复:这是一组线性代数里面的概念，只是数组可以对应的表示相应的向量，楼主可以看看线性代数里面的一些基础理论线性代数考了60多分，可是什么都没有学到。。。。

user: user-10
content: 这是一组线性代数里面的概念，只是数组可以对应的表示相应的向量，楼主可以看看线性代数里面的一些基础理论

user: user-11
content: 维基百科搜搜看。

user: user-4
content: 数学上的向量，可以用一维数组表示。 所以C++把动态数组的实现，称为向量。

user: user-12
content: 引用 7 楼 czarten 的回复:因为本质是一样的 n维向量就是n个数的有序组，比如三维向量，就是(x,y,z)，任何一个(x,y,z)组唯一对应一个三维向量，这里把x，y，z改名为a0，a1，a2，就是int a[3]数组了  再说清楚点，对数组int a[3]的任何一种赋值，都唯一对应三维空间上的一个向量(a0,a1,a2)，所以数组和向量是等价的，当然int是离散值向量是连续值，这个是计算机和数学的区别

user: user-12
content: 因为本质是一样的 n维向量就是n个数的有序组，比如三维向量，就是(x,y,z)，任何一个(x,y,z)组唯一对应一个三维向量，这里把x，y，z改名为a0，a1，a2，就是int a[3]数组了
user-0 提问: gprof

回复:
user: user-1
content: 引用 5 楼 mujiok2003 的回复:需要编译选项支持： i. 使用gcc/cc编译和链接时需要加入-pg选项 ii. 使用ld链接时需要用/lib/gcrt0.o代替crt0.o作为第一个input文件 iii. 如果要调试libc库需要使用-lc_p代替-lc参数 b) 调试多线程程序只能统计主线程的信息（所以不能用于kingbase）。  http://baike.baidu.com/view/2100555.htm

user: user-1
content: 需要编译选项支持： i. 使用gcc/cc编译和链接时需要加入-pg选项 ii. 使用ld链接时需要用/lib/gcrt0.o代替crt0.o作为第一个input文件 iii. 如果要调试libc库需要使用-lc_p代替-lc参数 b) 调试多线程程序只能统计主线程的信息（所以不能用于kingbase）。

user: user-1
content: 多运行几次吧。  int main (void) {  int i = 0;         while(i++ < 1024) 	try1(); 	return 0; }

user: user-0
content: 具体用法我知道，但是我的结果全是0，明显不对啊，求解

user: user-0
content: 抱歉结帖的时候太急了楼上没给分

user: user-2
content: 可能是SIZE太小，时间太短，gprof精度测不出来。把SIZE改大应该能看到，用法是没错。

user: user-2
content: -g是调试的参数，如果只是用gprof的话，这个参数可以不加。gprof的用法，你可以参照： http://www.cnblogs.com/kenzhang1031/p/3407630.html 里面6. 简档器gprof用法。
user-0 提问: 这个程序为什么没有结果？

回复:
user: user-1
content: 引用 7 楼 u012967319 的回复:number=5*(1+n1,5);分析 先拆(1+n1,5) 1+n1; number=5*5;  正常來說1+n1就等於2+2; 這不是什麼處理都不做嗎??  然後再5*5 給NUMBER嗎??  攪什麼???別欺負我不會匯編!!! 为什么不直接写5*5呢，不解。。。

user: user-2
content: 引用 10 楼 yulitingfeng 的回复:[quote=引用 9 楼 jmppok 的回复:] [quote=引用 8 楼 bijiaoben 的回复:] [quote=引用 6 楼 u012967319 的回复:] number=5*(1+n1,5);  這種寫法...看不懂 同问，这是什么意思？想函数调用却少写了函数名只留下括号吗？[/quote]  (,)逗号语法，会计算所有表达式，但使用的是第一个值。[/quote]应该是最后一个吧[/quote]  可能是我记错了,记得上学时C语言考试考到过. 单工作后一直没这么用过.

user: user-3
content: 引用 9 楼 jmppok 的回复:[quote=引用 8 楼 bijiaoben 的回复:] [quote=引用 6 楼 u012967319 的回复:] number=5*(1+n1,5);  這種寫法...看不懂 同问，这是什么意思？想函数调用却少写了函数名只留下括号吗？[/quote]  (,)逗号语法，会计算所有表达式，但使用的是第一个值。[/quote]应该是最后一个吧

user: user-2
content: 引用 8 楼 bijiaoben 的回复:[quote=引用 6 楼 u012967319 的回复:] number=5*(1+n1,5);  這種寫法...看不懂 同问，这是什么意思？想函数调用却少写了函数名只留下括号吗？[/quote]  (,)逗号语法，会计算所有表达式，但使用的是第一个值。

user: user-4
content: 引用 6 楼 u012967319 的回复:number=5*(1+n1,5);  這種寫法...看不懂 同问，这是什么意思？想函数调用却少写了函数名只留下括号吗？

user: user-5
content: number=5*(1+n1,5);分析 先拆(1+n1,5) 1+n1; number=5*5;  正常來說1+n1就等於2+2; 這不是什麼處理都不做嗎??  然後再5*5 給NUMBER嗎??  攪什麼???別欺負我不會匯編!!!

user: user-6
content: 下断点, 单步调试, 光看代码没用. 学会自己解决问题.

user: user-5
content: number=5*(1+n1,5);  這種寫法...看不懂

user: user-7
content: 你正常输入了么？

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

user: user-9
content: 用的什么编译器？

user: user-10
content: // tt.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include <stdlib.h> #include<stdio.h> #include<math.h> #define n1 0.0414 #define n2 0.0468 #define n3 0.054 #define n4 0.0072 #define n5 0.0585 void Fangan1(double number) {    number=5*(1+n1,5);    printf("%lf\n",number); } void Fangan2(double number) {    number=2*(1+n2,2);    number=3*(1+n3,3);    printf("%lf\n",number); } void Fangan3(double number) {    number=3*(1+n3,3);    number=2*(1+n2,2);    printf("%lf\n",number); } void Fangan4(double number) { 	number=number*pow(1+n1,5);    printf("%lf\n",number); }  void Fangan5(double number) {     number=number*pow(1+n4/4,4*5);  	printf("%lf\n",number);  }  int _tmain(int argc, _TCHAR* argv[]) { 	// double n1,n2,n3,n4;    char ch;    double number;    printf("请输入你所要存储的钱(q退出):");    scanf("%d",&number);    printf("请选择你要的储存类型:");    while(1)    { 	   while('\n'==(ch=getchar())) 		continue;     	   switch(ch) 	  { 	  case 'a': 	  Fangan1(number); 	  break; 	  case 'b': 	  Fangan2(number); 	  break; 	  case 'c': 	  Fangan3(number); 	  break; 	  case 'd': 	  Fangan4(number); 	  break; 	  case 'e': 	  Fangan5(number); 	  break; 	  } 	   if('q'==ch) 		   break; 	   printf("请输入你所要存储的钱:"); 	   scanf("%d",&number); 	   printf("请选择你要的储存类型:");    } 	  system("pause"); 	  return 0; }
user-0 提问: C语言关于结构的一个问题

回复:
user: user-0
content: .... 我好悲剧啊。连看本书都不好，我看的是c primer plus ....

user: user-1
content: 首先要明白gets()的返回值是什么. gets()只有在什么也不输入的情况下直接按ctrl-z才会返回NULL, 其他情况都不会(空字符串不是NULL). 和你说的那个内存分配完全无关. 这个程序的逻辑应该是书名是关键字不能为空, 所以检查了输入的不是NULL也不是空字符串; 而作者不是关键字, 可以为空, 所以不用检查.  btw: 你看的这本书够烂的, 换一本看吧. gets()是c语言里臭名昭著的函数, 现代软件里都是明令禁用的.

user: user-2
content: gets(library[i].book_name)!= NULL的意思是确实有收到字符串； library[i].book_name[0] != '\0'的意思是收到的不是空串。  引用 楼主 u012804737 的回复:#include "stdio.h" #define MAX 10 #define LAG 5 struct book { 		char name [MAX]; // name 代表作者名字 		char book_name[MAX]; 	 }; int main () { 	struct book library[LAG]; 	int i,j; 	i = 0; 	puts("请输入书本的名字:"); 	while(i < LAG && gets(library[i].book_name) != NULL  &&library[i].book_name[0] != '\0') 	{ 		puts("请输入作者名字:"); 		gets(library[i].name); 		i++; 	puts("请输入下一本:"); 		while(getchar() != '\n') 			continue; 		 	 }类似这么一个程序，我想问的是，book结构中，有两个数组。那么在输入的时候也就是gets（）函数的时候，while的判断中，为什么只对第一个library[lag].book_name 的指针返回值进行了判断，那个library[lag].name 这个数组在输入的时候，不用判断他的指针是否为NULL嘛？ 如果问的不清楚可以告诉我，我在线等

user: user-0
content: 哦，好像明白了。数据结构，library[lag].name_book 排在library[lag].name 的前面。结构的内存分配都是连续的。只要第一个不是指向的不是NULL,那么接下去的都不会是指向NULL、
user-0 提问: 编写一个求水仙花数的函数，求3位正整数的全部水仙花数中的次大值。

回复:
user: user-1
content: 引用引用 3 楼 KenZhang1031 的回复: 而且从999开始往100求，求到第二个水仙花数就是你要的次大数。比从100到999查效率好吧？ 这个应该没什么关系吧。反正就4个数。 不是4个数的问题，从100算到999,要算满900次。反过来，如果371是你要的次大数，那么你可以少算272次。

user: user-0
content: 引用 2 楼 KenZhang1031 的回复:超明显错误的地方，你的getbaby(nums)函数要有返回值，如果nums是水仙花数，返回true，然后你才能给max2=max,max=nums。如果是false，就不该赋值。你的程序每次都赋值，得到的次大数当然是998了。 做出来了，谢啦

user: user-1
content: #include <STDIO.H>    #include <MATH.H>                               //预处理 \\获得水仙花数 bool getbaby(int nums) {	  int number1,number10,number100,max=0; number100=nums/100; number10=nums/10%10; number1=nums%10;  if (nums==pow(number1,3)+pow(number10,3)+pow(number100,3))  { printf("%d\t",nums); return true; } else { return false; } } //主函数 main() {	int nums=100,max2,max=0; printf("100到999的次大 水仙花数:   "); for (;nums<1000;nums++) { if(getbaby(nums)) { if (max<nums) {	 max2=max; max=nums; } } } printf("%d ",max2); printf("\n ");  }

user: user-0
content: 引用 3 楼 KenZhang1031 的回复:而且从999开始往100求，求到第二个水仙花数就是你要的次大数。比从100到999查效率好吧？ 这个应该没什么关系吧。反正就4个数。

user: user-0
content: 引用 2 楼 KenZhang1031 的回复:超明显错误的地方，你的getbaby(nums)函数要有返回值，如果nums是水仙花数，返回true，然后你才能给max2=max,max=nums。如果是false，就不该赋值。你的程序每次都赋值，得到的次大数当然是998了。 具体要怎么改？我大一新生。。。。研究一个晚上了。。。

user: user-1
content: 而且从999开始往100求，求到第二个水仙花数就是你要的次大数。比从100到999查效率好吧？

user: user-1
content: 超明显错误的地方，你的getbaby(nums)函数要有返回值，如果nums是水仙花数，返回true，然后你才能给max2=max,max=nums。如果是false，就不该赋值。你的程序每次都赋值，得到的次大数当然是998了。

user: user-0
content: 定一个，求救
user-0 提问: 求解：改变数组元素排序的问题

回复:
user: user-1
content: 引用 4 楼 hbc0602 的回复:[quote=引用 2 楼 zcg1041 的回复:] void trans（int b[], int a[], int n, int c） {      int i = 0;      for(i=0; i<n; i++)     {           b[i] = a[(c+i)%n];     } } 求解：(c+i)%n的原理？谢谢！ 求(c+i)除以n的余数，判断应该把a中那个值放在b[i]里

user: user-0
content: [quote=引用 2 楼 zcg1041 的回复:] void trans（int b[], int a[], int n, int c） {      int i = 0;      for(i=0; i<n; i++)     {           b[i] = a[(c+i)%n];     } } 求解：(c+i)%n的原理？谢谢！

user: user-0
content: #include "stdio.h" #define P printf #define S scanf int a[8]={1,2,3,4,5,6,7,8}; int b[8]; int *pa,*pb,c;  void main() {      int i,j;     pa=a;     pb=b;      c=3;       for(i=c;i<8;i++)       *(pb+i-c)=*(pa+i);        for(j=0;j<c;j++)       *(pb+i-c+j)=*(pa+j);       P("c=%d\n",c);      for(i=0;i<8;i++)     P("a[%d]=%d\n",i,*(pa+i));     P("\n\n\n");      for(i=0;i<8;i++)     P("b[%d]=%d\n",i,*(pb+i));     getch();  } 我试着用指针写了下，好像结果没有错。但是我的写法我自己看着都费劲...

user: user-2
content: void trans（int b[], int a[], int n, int c） {      int i = 0;      for(i=0; i<n; i++)     {           b[i] = a[(c+i)%n];     } } int main() {      int a[8] = {1,2,3,4,5,6,7,8};      int b[8] = {0};      int step = 0;      step = 1;      trans(b, a, sizeof(a), step);     step = 2;      trans(b, a, sizeof(a), step); }

user: user-3
content: #include <iostream> using namespace std;  void circular(int a[],int n,int b[],int c) { 	for(int i=0;i<n;++i) 	{ 		b[(i-c+n)%n]=a[i]; 	} }  void print(int a[],int n) { 	for(int i=0;i<n;++i) 	{ 		printf("%d\t",a[i]); 	} 	printf("\n"); }  int main() { 	int a[8]={1,2,3,4,5,6,7,8}; 	int b[8]; 	int n=sizeof(a)/sizeof(a[0]); 	print(a,n); 	circular(a,n,b,0); 	print(b,n); 	circular(a,n,b,1); 	print(b,n); 	circular(a,n,b,2); 	print(b,n);  	return 0; }
user-0 提问: 【求助大神·在线等】c语言 数据结构 链表 Access Violation问题

回复:
user: user-0
content: 引用 4 楼 user-1 的回复:[quote=引用 3 楼 u013095718 的回复:] [quote=引用 2 楼 user-1 的回复:] 第二段既然没有问题，你就逐步向第一段还原，看是哪一句导致的，再分析下 已经看了，第二段单独使用没问题，放到第一段里就出现问题了； 问题是那一句：head = (pstu)malloc(SIZE);[/quote] 给你的第一段代码直接加了一个return，在linux环境下执行没有问题[/quote]  3q，你的测试让我知道错误在哪里了，malloc内存申请是没错的，被编译器骗了，就一直在纠结那一个语句，你的测试让我转而去测试其他部分才找到的错误。

user: user-1
content: malloc完需判断是否申请成功

user: user-1
content: 引用 3 楼 u013095718 的回复:[quote=引用 2 楼 user-1 的回复:] 第二段既然没有问题，你就逐步向第一段还原，看是哪一句导致的，再分析下 已经看了，第二段单独使用没问题，放到第一段里就出现问题了； 问题是那一句：head = (pstu)malloc(SIZE);[/quote] 给你的第一段代码直接加了一个return，在linux环境下执行没有问题

user: user-0
content: 引用 2 楼 user-1 的回复:第二段既然没有问题，你就逐步向第一段还原，看是哪一句导致的，再分析下 已经看了，第二段单独使用没问题，放到第一段里就出现问题了； 问题是那一句：head = (pstu)malloc(SIZE);

user: user-1
content: 第二段既然没有问题，你就逐步向第一段还原，看是哪一句导致的，再分析下

user: user-0
content: 第一次发帖，不太会，为了便于查看，重发代码： 第一段  #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct subjects { char name[20]; float score; }sub;  typedef struct student { int num; char name[20]; sub  subject[3]; struct student* next; }stu,*pstu;  #define SIZE sizeof(stu)  //函数申明 void PrintMenu(); pstu AddStu(pstu ); pstu DeleStu(pstu ); pstu RwrStu(pstu ); void FindStu(pstu , char ); void Count(pstu ,char * ,float ,float ); pstu Rank(pstu ,char *,int ); void SaveQuit(pstu );   int main() { char filename[] = "D:\\编程学习\\编程实践\\c语言课程设计1 学生信息管理\\data.txt";  FILE *fp;  char StrLine[50];              char *p[9];                   char n,j; char *str,*psubname,subname[20]; pstu head,ptr; float score1,score2; int LenLink=0;  //创建带表头结点的空单链表head，用来存放载入信息 head = (pstu)malloc(SIZE); ptr = head; ptr->next = NULL;     第二段：  typedef struct subjects { char name[20]; float score; }sub;  typedef struct student { int num; char name[20]; sub  subject[3]; struct student* next; }stu,*pstu;  #define SIZE sizeof(stu)  int main() { pstu head,ptr;  //创建带表头结点的空单链表head，用来存放载入信息 head = (pstu)malloc(SIZE); ptr = head; ptr->next = NULL;  free(head); }   各位看看啊，指点下
user-0 提问: 递归法求n阶勒让德多项式的值

回复:
user: user-1
content: 1.include<iostream> using namespace std;  int main()  {  int x,n;  float polya(int ,int );  cout<<"please input x and n:";  cin>>x>>n;   cout<<polya(x,n)<<endl;  return 0;  }   float polya(int x,int n)  {  if(n==0) return 1;  else if(1==n) return x;  else return ( (2*n-1)*x*polya(n-1,x) - (n-1)*polya(n-2,x) )/n;  }
user-0 提问: if(i<> 1) 什么意思 

回复:
user: user-1
content: 规范里本来就没有这种写法，何必让自己头疼呢

user: user-2
content: 引用 4 楼 yulinlang 的回复:[quote=引用 1 楼 user-13 的回复:]   if(i != 1) // 类似非的意思 你那个是python里的写法吧！  Python和C的运算符基本一致，用<>表示不等于运算符的是BASIC。[/quote] 见识了

user: user-3
content: C这样写我记得不会报错的，只是这写法大家都不喜欢不习惯

user: user-4
content: C语言不支持这种写法，编译器会报错的。 ..\main.c:4:8: error: expected expression before '>' token  mysql里到时有种写法。 参考：http://stackoverflow.com/questions/8994408/query-not-equal-doesnt-work

user: user-5
content: 我在用Exel的时候就碰过这个符号，他是不等于的意思，至于在C语言里，我没有见过这种表达啊

user: user-6
content: 1、本身要表达的应该是不等于的意思； 2、C语言没有这样的语法。  引用 楼主 lam888888908 的回复:求指点，and 还是or ,新手。

user: user-7
content: C语言中没有这个写法，怎么会通过编译？

user: user-8
content: 这个是小于大于，也就是不等于，只知道basic这么写，c应该没有

user: user-9
content: 如果 i 不等于1；

user: user-10
content: 引用 1 楼 user-13 的回复:  if(i != 1) // 类似非的意思 你那个是python里的写法吧！  Python和C的运算符基本一致，用<>表示不等于运算符的是BASIC。

user: user-11
content: c没这写法

user: user-12
content: 不等于吧，没这么用过。

user: user-13
content: if(i != 1) // 类似非的意思 你那个是python里的写法吧！
user-0 提问: 如何将长整型数据转换为字符串数组

回复:
user: user-1
content: 十进制unsigned long（0～4294967295）转为字符串最多10个字符＋1个'\0'结束符＋用8位ASCII码即一个字节表示一个字符＝11个字节 #include <stdio.h> int main() {     char szBuffer[11];     unsigned long a = 4294967295UL;      sprintf(szBuffer,"%lu",a);     printf("%s\n",szBuffer);      return 0; }

user: user-2
content: 引用 7 楼 wusuopuBUPT 的回复:[quote=引用 楼主 wintooth 的回复:] 各位好，请问如何将unsigned long的一个数据转换为 unsigned char 型的数组？ 如：unsigned long a = 123456 则转换为字符串数组为 unsigned char b[6]="123456"  仅供参考： #include <stdio.h>  int main() { 	unsigned long a = 123456; 	int i = 0, len = 6; 	unsigned char b[len];  	while(a) { 		b[len-1-i] = a % 10 + '0'; //long -> char 		a = a / 10; 		//printf("a=%ld,b[%d]=%c\n", a, len-1-i,b[len-1-i]); 		i++; 	} 	b[len] = '\0'; //字符串末尾的'\0' 	printf("b: %s", b); 	return 0; } [/quote]  修改一下： unsigned char b[len+1];//size为7

user: user-2
content: 引用 楼主 wintooth 的回复:各位好，请问如何将unsigned long的一个数据转换为 unsigned char 型的数组？ 如：unsigned long a = 123456 则转换为字符串数组为 unsigned char b[6]="123456"  仅供参考： #include <stdio.h>  int main() { 	unsigned long a = 123456; 	int i = 0, len = 6; 	unsigned char b[len];  	while(a) { 		b[len-1-i] = a % 10 + '0'; //long -> char 		a = a / 10; 		//printf("a=%ld,b[%d]=%c\n", a, len-1-i,b[len-1-i]); 		i++; 	} 	b[len] = '\0'; //字符串末尾的'\0' 	printf("b: %s", b); 	return 0; }

user: user-3
content: int a=12345678; unsigned char*p=(unsigned char*)&a;//原封不动的将a作为char对待

user: user-4
content: 引用 2 楼 wintooth 的回复:呵呵，多谢，最好不要用库函数，直接用C语言实现 sprintf这么好用为什么不能用呢？

user: user-5
content: #include <iostream>  int main() { 	char szBuffer[1024] = {'\0'}; 	unsigned long a = 123456;  	sprintf_s(szBuffer,1024,"%lu",a); 	printf("%s\n",szBuffer);  	return 0; }

user: user-1
content: unsigned char b[7]="123456"; “多一少一”问题占程序员常犯错误的10%以上！

user: user-0
content: 呵呵，多谢，最好不要用库函数，直接用C语言实现

user: user-6
content: sprintf(b, "%ul", a);
user-0 提问: 怎样提取二进制文件中的实数

回复:
user: user-0
content: 谢谢各位，搞定了，我一开始竟然写成了这个样子： double d = (double)(data[index]); 应该这样： double d = *(double*)(data+index);

user: user-1
content: 通过地址取值呗

user: user-2
content: B5 9D B4 2C 3D B0 43 C0 double a; char * p = &a; p[0] = 0xb5; p[1] = 0x9d; ... p[7] = 0xc0; // a is there

user: user-3
content: char s[8]; 读取8个字节 double d = *( ( double * )( s ) );

user: user-4
content: 纠正上帖： double d; FILE *f; f=fopen(...,"rb"); ... fread(&d,8,1,f); ... fclose(f);

user: user-4
content: double d; FILE *f; f=fopen(...,"rb"); ... fread(&d,8,1,f); ... fclsoe(f);

user: user-0
content: 不好意思，刚刚上面的例子破腚百出，其实我只想表达明白我的意思。
user-0 提问: 求推荐讲程序架构的书籍

回复:
user: user-1
content: 看看代码大全，重构 这些吧！

user: user-2
content: 作为入门，可以看看设计模式。

user: user-3
content: C++ API 设计 POSA 系列

user: user-3
content: 见过猪跑, 吃过猪肉

user: user-4
content: 程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George
user-0 提问: 请帮忙计算计算几串数字之间的关联性

回复:
user: user-1
content: hash 函数是密码学里相当健壮的领域，针对它的攻击目前为止，成功的几率极低  你要是真想弄，试试 Linear cryptanalysis and differential cryptanalysis 吧，不过基本别抱希望。除非搞定这问题有巨大的利益，  并且还得有强大的财力支持，比如政府或军方...

user: user-0
content: 還有別的可能嗎?

user: user-2
content: hash? 模运算？ salt+MD5？ 和某个（某几个数）进行四则运算？  都有可能

user: user-3
content: 什么程序生成的，逆了它不就结了

user: user-4
content: 根据秘钥来推算法都有点难度 这秘钥都没有 难度可不是一般的大。。。。

user: user-0
content: 其實這個問題我也只是抱著試試看的態度來問而已,大家不要有壓力,能解決最好,不能解決也沒關係.

user: user-5
content: 不知道key 考人脑不找不出来其中的规律的！ 得找到对应key 才能生成的！  不过比较困难了！除非别人提供了！

user: user-6
content: 除非有人告诉算法，一般无解。

user: user-7
content: 这种问题有无穷多个答案 楼主

user: user-8
content: 随便加点盐的MD5的话，你猜到世界末日估计也猜不出来。

user: user-9
content: 大牛都出来提问了，要超级大牛才可以回复这个问题
user-0 提问: 新人求教DirectX里的D3DXLoadMeshFromX函数

回复:
user: user-0
content: 就像上面的代码一样，如果filepath用的是绝对路径就可以成功，但是相对路径就不行！求指教啊！

user: user-1
content: “怎么用都不成功”  你都怎么用了
user-0 提问: 求问如果多行输入数据，输入一次回车换行，输入两次回车结束

回复:
user: user-1
content: #define MAXL 1000 char str[MAXL]; while (1) {  fgets(str,1000,stdin);  if ('\n'==str[0]) break;  //... }

user: user-2
content: 楼上正解，顶起。

user: user-3
content: int main() { 	int p = 0, c = 0; 	while (true) 	{ 		c = getchar(); 		if (c == 10 && p == 10) break;                 ... 		p = c; 	} 	return 0; }
user-0 提问: 各位大牛谁有《C语言借口与实现 创建可重用软件的技术》这本书的课后习题答案啊？

回复:
user: user-1
content: 怎么只有2楼，一楼和三楼的哪去了...被和谐了,

user: user-2
content: 我虽然没有答案，但是你如果有问题，可以问我，QQ 1641577267
user-0 提问: 新手提问

回复:
user: user-1
content: 建议先继续学C，linux环境，主要还是C语言

user: user-2
content: 看你以后想用C还是C++写程序，如果时间多的话，C多巩固也是不错的。

user: user-3
content: C语言是保值语言，值得深入学习。

user: user-4
content: C用不到这也太夸张了，C++的基础部分也都是C，linux下大家不都还在用C 建议lz先巩固好基础，把指针先搞明白
user-0 提问: 基于AVR的16*64音乐频谱点阵显示系统的程序

回复:
user: user-0
content: 引用 2 楼 turingo 的回复:自己写吧，就是控制译码器和串转并寄存器而已。  引用 楼主 gnorniq 的回复:各位大神，谁有基于AVR的16*64音乐频谱点阵显示的程序，求种，最好是行驱动用的是74HC154，列是用74H595的 看了两天FFT的相关程序，还是不太了解

user: user-1
content: 自己写吧，就是控制译码器和串转并寄存器而已。  引用 楼主 gnorniq 的回复:各位大神，谁有基于AVR的16*64音乐频谱点阵显示的程序，求种，最好是行驱动用的是74HC154，列是用74H595的

user: user-2
content: http://dl.21ic.com/download/-3264-rar-ic-114060.html  http://download.csdn.net/detail/riisa_naka/4061781
user-0 提问: C语言指针刚学，有个问题想请教。上图。书上也没有解释。

回复:
user: user-1
content: 引用 9 楼 zhao4zhong1 的回复:能否别发这个。

user: user-2
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-3
content: 引用 11 楼 zhao4zhong1 的回复:引用 10 楼 ytlcainiao 的回复:[quote=引用 9 楼 zhao4zhong1 的回复:]能否别发这个。 你要先替我发了的话，可以考虑。[/quote]

user: user-2
content: 引用 10 楼 ytlcainiao 的回复:引用 9 楼 zhao4zhong1 的回复:能否别发这个。 你要先替我发了的话，可以考虑。

user: user-4
content: 首先，我也是个菜鸟。 我的看法是这样的： 拿int i=108,*pi=&i为例： 你的电脑中一个int型数据占有4bytes的内存。 通过语句*pi=&i，指针pi指向了i。pi是int型指针，那么pi+1的值就是指向下一个地址，也就是1638212+4。 但是*（pi+1）,也就是1638216地址里是什么值呢？我没无从得知。 虽然，总能发现pi+1和*(pi+1)之间总是相差64，但是引入pi+2和*（pi+2），我得不到规律。。。 而且一旦将*（pi+1）赋值，程序会出错，所以说明这个数和内部有关。 这个程序说明了，除了你能确定的，否则我们不能预测一个随机的内存地址里会存储什么值。 不要太纠结它。希望对你有帮助。

user: user-5
content: 注意：你在一个语句里多次修改一个变量（多次pf++），结果是未定义的。看置顶贴。

user: user-6
content: 就是乱码 可能....

user: user-3
content: %p打印地址！其他就是压栈而已！ 看看内存管理的知识

user: user-7
content: int mx() { 	int i;//1638212			定义在最前面的变量被压到最底下 	int *pi;//1638208       往前4B，保存一个指针+4-->i 	double f;//1638200		往前8B，保存一个都报了+8-->pi 	double*pf;//1638196		往前4B，保存一个指针 +4-->f 	long k;//1638192		往前4B，保存一个聋 +4-->pf 	long *pk;//1638188		往前4B，保存一个指针+4-->k }

user: user-8
content: 打印地址（指针）使用 %p

user: user-0

user: user-0
user-0 提问: 输入10个数排序，然后输入1个数，在10个数中找到和这是数相同的数

回复:
user: user-0
content: 引用 1 楼 u012964794 的回复:#include<stdio.h> void main() { 	int a[10]; 	int i,j,t; 	printf("input 10 numbers :\n"); 	for(i=0;i<10;i++) 		scanf("%d",&a[i]); 	printf("\n"); 	for(j=0;j<=9;j++) 		for(i=0;i<=9-j;i++) 			if(a[i]>a[i+1])/////冒泡排序 			{ 				t=a[i]; 				a[i]=a[i+1]; 				a[i+1]=t; 			} 	printf("the sorted numbers :\n"); 	for(i=0;i<10;i++) 		printf(" %d\t",a[i]); 	printf("\n");  	int key,mid,top=9,bottom=0; 	printf("输入要查找的字\n"); 	scanf("%d",&key); 	for(;bottom<top;)//这里的两个标针逻辑关系你弄反了 	{ 		mid=(top+bottom)/2; 		if(a[mid]==key) 		{ 			printf("%d",mid); 			break; 		} 	else if(a[mid]<key) 		bottom=mid+1; 	else  		top=mid-1; 	} 	if(top<bottom) 		printf("not find\n"); }   //楼主有两个错误，一个是将小于号写成大于号，另一个是将大于号写成小于号可是程序还是无法运行，老师布置的作业是首先输入10个数，进行排序之后，在输入一个数，在这十个数中采用折半查找，将与最后一个输入数相同的数的下标输出。

user: user-0
content: 引用 4 楼 max_min_ 的回复:先把你代码重新写一下吧！ 排序一个函数接口，　查找一个函数接口！ 一个一个的来！main函数尽量小！不懂！刚刚接触C语言，请多多指教~~

user: user-1
content: 先把你代码重新写一下吧！ 排序一个函数接口，　查找一个函数接口！ 一个一个的来！main函数尽量小！

user: user-2
content: 二分？？？？

user: user-3
content: std::find

user: user-4
content: #include<stdio.h> void main() { 	int a[10]; 	int i,j,t; 	printf("input 10 numbers :\n"); 	for(i=0;i<10;i++) 		scanf("%d",&a[i]); 	printf("\n"); 	for(j=0;j<=9;j++) 		for(i=0;i<=9-j;i++) 			if(a[i]>a[i+1])/////冒泡排序 			{ 				t=a[i]; 				a[i]=a[i+1]; 				a[i+1]=t; 			} 	printf("the sorted numbers :\n"); 	for(i=0;i<10;i++) 		printf(" %d\t",a[i]); 	printf("\n");  	int key,mid,top=9,bottom=0; 	printf("输入要查找的字\n"); 	scanf("%d",&key); 	for(;bottom<top;)//这里的两个标针逻辑关系你弄反了 	{ 		mid=(top+bottom)/2; 		if(a[mid]==key) 		{ 			printf("%d",mid); 			break; 		} 	else if(a[mid]<key) 		bottom=mid+1; 	else  		top=mid-1; 	} 	if(top<bottom) 		printf("not find\n"); }   //楼主有两个错误，一个是将小于号写成大于号，另一个是将大于号写成小于号
user-0 提问: 关于类型转换的~不是说int会自动向上double转换的吗，可是结果为什么不一样

回复:
user: user-0
content: O(∩_∩)O谢谢~

user: user-1
content: 引用 2 楼 derekrose 的回复:9/5 =》 1 如他所说，关键在f=9/5*c+32;这句话上。 因为C/C++里的'*'和'/'运算符的优先级是一样的，并且结合方向都是从左到右，所以先算9/5。 所以这句话相当于是f=(9/5)*c+32； 由于9和5都是普通的整形常量，结果得1。接下来才是1*c+32。这时候c是double类型，所以会转型。 你也可以这么写f=((double)9)/5*c+32；这样的话结果就和前一个一样了。  其实，你只要拿编译后的汇编代码来看看就明白了。也许你会发现，经过了编译器的优化，系统甚至都不会求9/5这一步。。。。

user: user-2
content: 9/5 =》 1

user: user-3
content: 坚决消灭另恢复
user-0 提问: 关于数学家高斯的问题

回复:
user: user-1
content: 引用 4 楼 qq695181966 的回复:我已经自己找出问题了！ - -好不想给分啊！ 引用 4 楼 qq695181966 的回复:我已经自己找出问题了！ - -好不想给分啊！那何必来此发问！

user: user-0
content: 引用 7 楼 jianqiu000 的回复:散分再说，不然你来这干嘛的好讨厌！！看来下次得动脑子了！！我的分都快被我散没了- -

user: user-2
content: 还是给点建议吧： 把有意义的操作封装成函数，然后组合调用之，出问题的时候更容易定位问题。

user: user-3
content: 引用 4 楼 qq695181966 的回复:我已经自己找出问题了！ - -好不想给分啊！  给了分还能回收50%, 不给就都没了.

user: user-4
content: 散分再说，不然你来这干嘛的

user: user-0
content: 引用 2 楼 abc594986308 的回复:算法错了，嗯算法是没有错的！

user: user-0
content: 我已经自己找出问题了！ - -好不想给分啊！

user: user-5
content: 参考下这里吧：http://bbs.csdn.net/topics/390459916  至于问题的话，目测大概是10月份写错位置了吧！你试试看。

user: user-6
content: 算法错了，嗯

user: user-0
content: 木有人发表一下意见吗？
user-0 提问: 求vc2008

回复:
user: user-0
content: 已经搞到vc6.0了，谢谢各位

user: user-1
content: 引用 3 楼 ztzi321 的回复:vs 2010行吧？我有2008的也有，你要哪个？

user: user-1
content: vs 2010行吧？我有

user: user-2
content: 你下个VC6的精简版安装看看，如果只是学C的话，没有必要装2008，太慢，或者直接下载code::blocks这个用。

user: user-3
content: 直接用VS2013吧
user-0 提问: 求帮忙解决一个有关婚礼对象的c语言推理问题

回复:
user: user-1
content: http://cplus.about.com/od/learningc/ss/vc6compile.htm

user: user-0
content: 引用 1 楼 user-2 的回复:有个前提吧？？？ 我随便改了一个地方，结果对了，不知道原因。。

user: user-2
content: 有个前提吧？？？
user-0 提问: 链表练习问题请教。

回复:
user: user-1
content: 楼上说的很对。 你在deletenode里面对指针进行操作实际上相当于对指针的"副本"进行的操作。 你在deletenode函数里面对head进行操作，是不会影响函数外面的head的位置。

user: user-2
content: deleteNode 函数写错了。 到底是返回指针，还是返回布尔值？？？  返回指针，如果所有节点删除了，返回NULL；  如果删除头结点，返回头结点的下一个节点。  也可以传递指针的指针，以便修改头结点指针； C++传递指针的引用。  返回指针，的删除方式； 函数的调用方式，会让人有点受不了。 要写成 head = deleteNode(head,x);

user: user-0
content: 附图：
user-0 提问: 菜鸟向大神求助

回复:
user: user-0
content: 换了台电脑同样编译器可以通过编译，谢啦！

user: user-1
content: 是不是分号打成中文了

user: user-2
content: 拷贝你的代码编译完，没有错误。。。

user: user-3
content: 什么编译器。
user-0 提问: C语言二维数组

回复:
user: user-0
content: 之后要从键盘上写入另外一个名字呢？要怎么办？

user: user-1
content: char name[4][20] = {"Mary", "Jone", "Rebort", "Jack"}; //初始化的时候  //赋值的话 char name[4][20] = {0}; strcpy(name[0], "Mary"); strcpy(name[1], "Jone"); ...

user: user-2
content: char name[][20] = {"Mary","John","Robert","Jack"};

user: user-0
content: 老师规定不能用指针，文件，结构体，共用体。有没有别的办法

user: user-3
content: 二维char数组，其中的每个一维char数组放一个名字啊 你就分别找出指向每个名字开头的指针，以及该名字的长度，然后依次拷贝放到name[0],name[1],name[2]...  注意一下字符串结尾的'\0'问题，如果你是来直接要代码的，那就等楼下高人吧。。。
user-0 提问: 将结构体的内容写入到文件中出现Bus error:10这个错误,如何解决?

回复:
user: user-0
content: 引用 2 楼 max_min_ 的回复: struct st* s[4]; //没有必要定义成指针数组！ // 这样就行了 struct st s[4]； p = s; //或者 p = &s[0];     的确,就在这里修改就OK了

user: user-1
content: struct st* s[4]; //没有必要定义成指针数组！ // 这样就行了 struct st s[4]； p = s; //或者 p = &s[0];

user: user-2
content: 引用 楼主 zaixiankaifa 的回复:编译代码没有问题,但是运行的时候出现: Bus error 10这个错误,请牛人指导........... 代码有野指针，完毕。
user-0 提问: 一点区别

回复:
user: user-1
content: 首先“\xAB\xCD\xEF”这样的数据就不应该存放在txt文件中。txt文件类型应该是text，就是文本格式。AscII码只有小于128的那些字符是文本，其余的人类不可读。你放在txt文件里面就误导了。 你手工编辑“\xAB\xCD\xEF”放在文本文件中，实际上放入的是'\' 'x' 'A' 等这些字符的AscII码，而不是'\xAB'字符码。 你要将二进制数据写到文件中，要么在程序中用二进制方式打开文件，然后写入。 要么用UltraEdit之类的软件，在二进制编辑模式来写。

user: user-2
content: 计算机只懂2进制，而人就很多了8进制，10进制，16进制...

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

user: user-4
content: 文件中你看到的结果是文本格式显示的结果，内存中是二进制格式。

user: user-5
content: 引用 楼主 baobaodediaozhui 的回复:一：请解释下为什么是这种？ 二：如果我想在文本文件中也达到p1中的那种效果，该如何处理?  [/code]]  1. Read.txt中是文本 2.   char p1[] = "\xAB\xCD\xEF"; FILE * fs = fopen("Read.txt", "wb"); if(fs){ fwrite(p1,sizeof(p1),1, fs); fclose(fs); }

user: user-6
content: 引用 2 楼 baobaodediaozhui 的回复:[quote=引用 1 楼 user-6 的回复:] 一切都是0-1  你是我哥....[/quote] 男人是1 女人是0

user: user-0
content: 引用 1 楼 user-6 的回复:一切都是0-1  你是我哥....

user: user-6
content: 一切都是0-1
user-0 提问: 建立一个GLUT工程，用codeblock12.11，默认的是C++文件，如何把默认改成C文件

回复:
user: user-1
content: 建立工程的时候可以选择用C还是C++的。  引用 楼主 lelieven 的回复:  如图，请各位大神指点一下！
user-0 提问: ++操作是原子操作吗

回复:
user: user-1
content: 需要锁

user: user-2
content: 多核CPU，应该是需要锁，或者用Windows Native API InterlockedIncrement()

user: user-3
content: 从逻辑上来说不是原子操作。  引用 楼主 hello_world_2012 的回复:2个线程对一个int变量进行++操作，不用锁，有问题吗？

user: user-4
content: 看处理器. 如果想做成可移植的, 不能假设是原子操作.

user: user-5
content: 看汇编指令了，现在很多处理器大概都是可以作为原子操作处理的

user: user-6
content: 有问题  windows 可以用 InterlockedIncrement 来保证原子操作的 ++

user: user-7
content: mov eax,xxx inc eax mov xxx,eax

user: user-8
content: 必须要锁

user: user-9
content: 不是
user-0 提问: 关于快速排序，以前的代码，现在居然看不懂了，求解

回复:
user: user-1
content: 引用 5 楼 caozhy 的回复:1 0 这个划分忘记排序了 0 1 2 3 3 4 5 6 7 7 8 9 9 11懂了 ，这要考虑几种状态     谢谢```

user: user-2
content: 1 0 这个划分忘记排序了 0 1 2 3 3 4 5 6 7 7 8 9 9 11

user: user-2
content: 引用 2 楼 u011959714 的回复:[quote=引用 1 楼 caozhy 的回复:] 快速排序的思路就是分而治之。  首先在待排序数据中找一个“标兵”，我们选第一个元素好了，然后扫描整个数据，将比它小的放到它的左边（不论顺序），比它大的全部放到右边。之后得到两个部分，标兵的左右两边，然后递归这个过程，再把每一部分分成大小两部分。  可以想象，最后当每个部分都只有一个元素不需要排了，整个数据就排好了。不论顺序吗？我在试试[/quote] 我的意思是，不管每一部分本身的顺序，只要保证比它小的都在左边，比它大的都在右边。  我们看一个例子 排序 4 3 9 2 1 6 7 9 3 8 0 5 7 11 首先我们选择4作为标兵，得到 3 2 1 3 0 4 9 6 7 9 8 5 7 11 然后分别选择3 9作为标兵 2 1 0 3 3 4 6 7 8 5 7 9 9 11 然后我们选择2 6 作为标兵 1 0 2 3 3 4 5 6 7 8 7 9 9 11 选择 7 作为标兵 1 0 2 3 3 4 5 6 7[color=#FF0000] 7 8 9[/color] 9 11 然后选择8作为标兵，最后排序完成 1 0 2 3 3 4 5 6 7 7 8 9 9 11

user: user-1
content: 引用 1 楼 caozhy 的回复:快速排序的思路就是分而治之。  首先在待排序数据中找一个“标兵”，我们选第一个元素好了，然后扫描整个数据，将比它小的放到它的左边（不论顺序），比它大的全部放到右边。之后得到两个部分，标兵的左右两边，然后递归这个过程，再把每一部分分成大小两部分。  可以想象，最后当每个部分都只有一个元素不需要排了，整个数据就排好了。主要是这里面要移除一个空间出来，每次到这里 arr[pivot_idx] = arr[l];这个arr[l]的值是3呢还是它的下一个9呢？我就不明白？然后后面走了两步就糊涂了

user: user-1
content: 引用 1 楼 caozhy 的回复:快速排序的思路就是分而治之。  首先在待排序数据中找一个“标兵”，我们选第一个元素好了，然后扫描整个数据，将比它小的放到它的左边（不论顺序），比它大的全部放到右边。之后得到两个部分，标兵的左右两边，然后递归这个过程，再把每一部分分成大小两部分。  可以想象，最后当每个部分都只有一个元素不需要排了，整个数据就排好了。不论顺序吗？我在试试

user: user-2
content: 快速排序的思路就是分而治之。  首先在待排序数据中找一个“标兵”，我们选第一个元素好了，然后扫描整个数据，将比它小的放到它的左边（不论顺序），比它大的全部放到右边。之后得到两个部分，标兵的左右两边，然后递归这个过程，再把每一部分分成大小两部分。  可以想象，最后当每个部分都只有一个元素不需要排了，整个数据就排好了。
user-0 提问: 是jsp页面中 js监听按某个健 调用c使光标隐藏

回复:
user: user-0
content: 在jsp页面中 按f11后，调用c++把光标隐藏和显示

user: user-0
content: 好像不行，调用c代码的话，是要在客户端执行吧！有其它办法吗， 本人没学习c 但知道c有这个功能......... 等待高人出现

user: user-0
content: 人呢??????????
user-0 提问: 这样答应不对么？ 打印不出来讷？

回复:
user: user-1
content: GDB是什么？ 你这个是否是控制台应用？

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout);

user: user-3
content: 是不是在缓冲区，用flush(stdout)试下

user: user-4
content: 引用 2 楼 xihu1364 的回复:[quote=引用 1 楼 derekrose 的回复:] 字符串你用%X输出？不应该是%s吗  人家输出十六进制 %x  %X[/quote]  故意的？

user: user-5
content: 引用 1 楼 derekrose 的回复:字符串你用%X输出？不应该是%s吗  人家输出十六进制 %x  %X

user: user-4
content: 字符串你用%X输出？不应该是%s吗
user-0 提问: 关于变量定义在main函数外边和里面的区别有哪些不同?

回复:
user: user-0
content: 引用 8 楼 a345485527 的回复:[quote=引用 7 楼 zaixiankaifa 的回复:] 这么多人回答都没详细告解具体原因是什么,对这个论坛好失望 汗，lz看一下这个代码可以不？  int a=0;		//全局变量a int main() { 	int a=9999;	//局部变量a，在这里把全局变量a屏蔽了 	printf("%d\n",a); 	return 0; }  这个是变量作用域问题，随便找一本书就有讲，[/quote] 好吧,谢谢你的讲解.

user: user-1
content: 引用 7 楼 zaixiankaifa 的回复:这么多人回答都没详细告解具体原因是什么,对这个论坛好失望 汗，lz看一下这个代码可以不？  int a=0;		//全局变量a int main() { 	int a=9999;	//局部变量a，在这里把全局变量a屏蔽了 	printf("%d\n",a); 	return 0; }  这个是变量作用域问题，随便找一本书就有讲，

user: user-0
content: 这么多人回答都没详细告解具体原因是什么,对这个论坛好失望

user: user-2
content: 楼主看完书再写代码  不然这样摸索学习进展很慢

user: user-3
content: 引用 4 楼 zaixiankaifa 的回复:[quote=引用 2 楼 u013055228 的回复:] 1.如果你定义在里面就重复定义了啊。 int main() {   int a;   int a;//错误   return 0; } /////  int a;//正确 int main() {   int a;   return 0; }  定义在外面就是全局的，如果你在main()函数里面使用，调用的都是main()函数里面那个局部的a 如果要用全局的a要这样 ::a   2.  int a[0]; int *p; p = a;//1 p = &a[0];//2 //1,2应该就是一样的。  为什么在main函数外部定义之后,成为全局变量,然后再main函数里面再定义一次,却不会说重复定义?[/quote] 作用域不一样的！

user: user-0
content: 引用 2 楼 u013055228 的回复:1.如果你定义在里面就重复定义了啊。 int main() {   int a;   int a;//错误   return 0; } /////  int a;//正确 int main() {   int a;   return 0; }  定义在外面就是全局的，如果你在main()函数里面使用，调用的都是main()函数里面那个局部的a 如果要用全局的a要这样 ::a   2.  int a[0]; int *p; p = a;//1 p = &a[0];//2 //1,2应该就是一样的。  为什么在main函数外部定义之后,成为全局变量,然后再main函数里面再定义一次,却不会说重复定义?

user: user-4
content: 定义在main里面，应该这样写： struct st{ int year; int month; int day; }test[3]={{1,2,3},{4,5,6},{7,8,9}};

user: user-5
content: 1.如果你定义在里面就重复定义了啊。 int main() {   int a;   int a;//错误   return 0; } /////  int a;//正确 int main() {   int a;   return 0; }  定义在外面就是全局的，如果你在main()函数里面使用，调用的都是main()函数里面那个局部的a 如果要用全局的a要这样 ::a   2.  int a[0]; int *p; p = a;//1 p = &a[0];//2 //1,2应该就是一样的。

user: user-6
content: 引用 楼主 zaixiankaifa 的回复:#include <stdio.h>   struct st{ 		int year; 		int month; 		int day; 	}test[3];  int main(() { 		struct st test[3]={{1,2,3},{4,5,6},{7,8,9}};  	struct st* p; 	p=&test; 	int i; 		for(i=0;i<3;i++){ 			printf("p->year=%d,p->month=%d,p->day=%d\n",p->year,p->month,p->day); 			p++;				 		}  	 return 0; }  问题1:            红色代码如果放在main函数里面,会提示说重复定义结构体数组,但是放在外面为什么就不会的呢? 问题2:            p=&test;编译的时候会出现警告,但是如果这样p=&test[0]则不会了,为什么? 难道p=&test这样有错误? 1）这个问题，不存在。 2）指针和数组类型兼容，和数组地址不兼容。 p=&test 本来就是错误的 p的类型是struct st* ；test 的类型是struct st[3] 和p的类型兼容。 &test的类型是struct st (*)[3];
user-0 提问: 请教，关于C语言指针的问题。

回复:
user: user-0
content: 引用 2 楼 turingo 的回复:while(*result++ = *cptr++);之后result已经指向字符串的末尾，这样printf当然打印不正确，你应该设置一个临时变量来保存之前的指针，例如： char* p = result; while(*p++ = *cptr++); printf("%s\n",result);是这个原因，对我很有帮助，谢谢！

user: user-1
content: char* p=result; while(*p = *cptr) {p++;cptr++;}

user: user-1
content: while(*(result++) = *(cptr++)); 不知道是否可以，感觉行为不太确定，还是要老实点  char* p=result; while(*p = *cptr++) {p++;cptr++;}

user: user-2
content: 一楼正解，楼主出问题有没有想过调试呀？调试的话，自己发现了印象会很深可的。

user: user-1
content: while(*(result++) = *(cptr++));

user: user-3
content: while(*result++ = *cptr++);之后result已经指向字符串的末尾，这样printf当然打印不正确，你应该设置一个临时变量来保存之前的指针，例如： char* p = result; while(*p++ = *cptr++); printf("%s\n",result);

user: user-4
content: 因为result++，while循环结束后，result已指向字符串之后的地址。
user-0 提问: 字符串的完美度 求解

回复:
user: user-1
content: if((s[i]-p->letter)==0||(s[i]-p->letter)==32||(s[i]-p->letter)==-32)   这个条件是错误的.  1)'a' = 97 2)'a'+ 32 =129 这是个图形字符，属于扩展ASCII。 3)'A' = 65 4)'!' = 'A' - 32 = 33   s[i] = 'a' 则 2）满足(s[i]-p->letter)== -32 s[i] = 'A' 则 4）满足(s[i]-p->letter)== 32  这就造成误判了。
user-0 提问: 怎么老是WA。。。菜鸟求帮助啊

回复:
user: user-1
content: LZ程序在循环中对b[i][k-i]赋值时，下标i将超出合法范围0..n-1，但未找到反例。 以下修改试图保证下标不超界： #include<iostream> using namespace std; int a[25][25],b[25][25]; int main() {   int t;   cin>>t;   while(t--)   {     int i,j,n,m,k,p;     cin>>n>>m;     p = m+n-2;     for(i=0;i<n;i++)       for(j = 0;j <m;j++)       {         cin>>a[i][j];         b[i][j] = 0;       }       b[0][0] =1;       for(k = 0;k<m;k++)//for(k = 1;k<=p;k++)       {         for(i=0;i<n;i++)//for(i=0;i<=k;i++)         {           if(i == 0)           {             if (k == 0) continue;             b[i][k] = (1-a[i][k])*b[i][k-1];//b[i][k-i] = (1-a[i][k-i])*b[i][k-i-1];           }           else if (k == 0) //if(k == i)             b[i][k] = (1-a[i][k])*b[i-1][k];//b[i][k-i] = (1-a[i][k-i])*b[i-1][k-i];           else //if(i!=0&&i!=k)             b[i][k] = (1-a[i][k])*(b[i-1][k] +b[i][k-1]);//b[i][k-i] = (1-a[i][k-i])*(b[i-1][k-i] +b[i][k-i-1]);         }       }       cout<<b[n-1][m-1]<<endl;   }   return 0; }

user: user-0
content: 我的思路是，每个点的路径数目等于左边节点的路径数目加上上边节点的路径数目，如果遇到蘑菇就置零。。。 输出似乎和sample一样。。。 求极端测试数据。。。 菜鸟求教

user: user-0
content: 没有人吗5555
user-0 提问: 数组第一个数被冲掉，什么情况？

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:楼主你知道8个字符需要9个字节来存储吗？  。。。擦，还真是。因为里面是数字，所以忘记字符数组最后需要‘\0’了，我记得在C语言缺陷那里有看到过，没想到还是犯错了。  谢谢！

user: user-1
content: 楼主你知道8个字符需要9个字节来存储吗？
user-0 提问: for(i=0;i<=300;i+20)……编译时出现关于“+”的警告~

回复:
user: user-1
content: i+20毫无意义, 这种运算需要先赋值才可以....比如 for(int i=0;i<=300;i+=20)

user: user-2
content: i+20 的结果被抛弃   i+=20;

user: user-3
content: 死循环的原因是i+20；for(;;)第三段是更新循环变量表达式，也就是说i如何变化i+20并没有改变i的值，i永远是0；而且i你定义的是int调用的时候进入的定义为double用一个强制转化符讲int变化为double 应该就没问题了。

user: user-4
content: ;i+20不会改变i值，i+20是一个没有意思的操作，循环将是一个死循环

user: user-5
content: #include<stdio.h> double tempinter(double m);/*celsius to fahr*/ main(){ int i; for(i=0;i<=300;i+=20){ printf("%3.0lf %6.1lf\n",(double)i,tempinter(i));  } return 0; } double tempinter(double c){ double f; f=(9/5)*c+32; return f; }  引用 楼主 u012983643 的回复:#include<stdio.h> double tempinter(double m);/*celsius to fahr*/ main(){ 	int i; 	for(i=0;i<=300;i+20){ 		printf("%3.0f %6.1f\n",i,tempinter(i)); 		 	} 	return 0; } double tempinter(double c){ 	double f; 	f=(9/5)*c+32; 	return f; } 编译后出现D:\MSDev98\MyProjects\tfunctiontem\tfunctiontem.cpp(5) : warning C4552: '+' : operator has no effect; expected operator with side-effect  tfunctiontem.obj - 0 error(s), 1 warning(s)  然后把i+20变为(i+20)就没有警告咯，什么情况  而且这段代码有问题，运行后死循环……  新手求解~

user: user-0
content: 哦哦~感谢！那运行结果怎么都是0呀

user: user-6
content: 每次循环i值不会变化，所以会无限循环 i需要赋值，i += 20;

user: user-7
content: for(i=0;i<=300;i+20){  //换成 for(i=0;i<=300;i = i+20){ // i++的意思是 i = i +1
user-0 提问: C语言数组 求大大帮我解答下

回复:
user: user-1
content: scanf("%lf",&str1[i]);

user: user-2
content: 引用 8 楼 buyong 的回复:scanf("%lf",&str1[i]); 可以的！

user: user-3
content: 引用 7 楼 u013084973 的回复:scanf("%lf", str1+i); 这样行不行？可以的，str1+i 和&str1[i]是一个意思。

user: user-4
content: scanf("%lf", str1+i); 这样行不行？

user: user-5
content: #include<stdio.h> int main(void) { 	double str1[5];  	for(int i = 0; i <= 4; i++) 	{ 		printf("\nEnter digit group str1[%d]: ",i); 		scanf("%lf",&str1[i]); 	} 	for(i = 0; i <= 4; i++) 	{ 		printf("%lf \n",str1[i]); 	} 	return 0; }

user: user-6
content: 学习学习学习！

user: user-7
content: scanf reads from stream under control of format, and assigns converted values through subsequent arguments, each of which must be a pointer.

user: user-2
content: #include<stdio.h> int main(void) {    double str1[5];     for(int i=0;i< 5;i++) //     {       printf("\nEnter digit group str1[%d]: ",i);       scanf("%lf",&str1[i]);       getchar(); //每次的回车符     }    printf("%lf, %lf, %lf, %lf, %lf",str1[0], str1[1], str1[2], str1[3], str1[4]);    return 0;   }

user: user-3
content: 楼主可以参考： #include<stdio.h> int main(void) { 	double str1[5]; 	int i; //这里要在外面声明，C99的特性 	for (i = 0; i <= 4; i++) { 		printf("\nEnter digit group str1[%d]: ", i); 		scanf("%lf", &str1[i]); //这里要用& 		printf("%lf", str1[i]); //分别打印 	} 	return 0;  }

user: user-8
content: scanf("%lf",str1[i]);改成scanf("%lf", &str1[i]);
user-0 提问: 共享内存，shmat函数出错！

回复:
user: user-1
content: 然后把错误信息打印出来看看！ 应该不是get的问题吧！一楼说的也有道理！ 应该试试把你的 MYKEY增大一点！后面加几个零，试试！

user: user-2
content: MYKEY标识的共享内存是不是系统使用的？ lz换个大点的数字试试
user-0 提问: while (getchar() != EOF)循环怎么结束？

回复:
user: user-1
content: linux: Ctrl+D   windows: Ctrl+Z  一般不都是用回车结束么? while ((ch=getchar()) != '\n') {    //... }

user: user-2
content: ctrl+d

user: user-3
content: 参考：http://bbs.chinaunix.net/thread-2093108-1-1.html

user: user-3
content: 因为scanf函数是有返回值的，他的返回值是读入数据的个数，操作系统里EOF默认是int的1，所以可以这样判断：  while(scanf("%c", &c)==1){  }  也可这样判断： while(scanf("%c", &c) != EOF){ }  都是一个道理。  怎样让操作系统知道你已经输入完毕了呢？ --通过向OS发送控制信号：  SIGINT   ^C   (default action: terminate the process) SIGQUIT  ^\   (default action: terminate the process and dump to a core file) SIGSUSP  ^Z   (default action: suspend the process)   OS会捕获信号，然后判断并作出处理。

user: user-4
content: 引用 2 楼 mujiok2003 的回复:linux: ctrl + D  windows: ctrl + Z

user: user-4
content: linux: ctrl + D

user: user-5
content: Windows和Linux下的EOF的字符输入不一样，反正你就试试CTRL-C／CTRL-D/CTRL-Z等组合键。  引用 楼主 kxteb0cc 的回复: 百度EOF解释为程序结束标示符，他的值我在本机中打印出是-1，getchar != EOF就是说输入字符不等于-1吧？为嘛我输入-1程序还是不能结束呢？或者我的理解不对，请高手指点下，谢谢