Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 帮忙看看是哪里有问题

回复:
user: user-1
content: 仅供参考：#include <afxdisp.h> #include <stdio.h> #include <stdlib.h> int main(int argc, TCHAR* argv[]) {     COleDateTime t;     COleDateTimeSpan ts;     CString s,fmt;     int nYear;     int nMonth;     int nDay;     int nHour;     int nMin;     int nSec;     int lDays;     int nHours;     int nMins;     int nSecs;     int i,N;     // initialize MFC and print and error on failure     if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) {         printf("Fatal Error: MFC initialization failed\n");         return 1;     }     if (argc<13) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 2;     }     if (stricmp(argv[12],"SQL")==0) fmt="%Y-%m-%d %H:%M:%S";     else if (stricmp(argv[12],"YYYY")==0) fmt="%Y%m%d %H%M%S";     else if (stricmp(argv[12],"YY")==0) fmt="%y%m%d %H%M%S";     else {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 3;     }     nYear =atoi(argv[ 1]);     nMonth=atoi(argv[ 2]);     nDay  =atoi(argv[ 3]);     nHour =atoi(argv[ 4]);     nMin  =atoi(argv[ 5]);     nSec  =atoi(argv[ 6]);     lDays =atoi(argv[ 7]);     nHours=atoi(argv[ 8]);     nMins =atoi(argv[ 9]);     nSecs =atoi(argv[10]);     N     =atoi(argv[11]);     if (N<=0) {         printf("Usage:%s sYYYY sMM sDD shh smm sss pDD phh pmm pss n {SQL|YYYY|YY}\n",argv[0]);         return 4;     }     t=COleDateTime( nYear, nMonth, nDay, nHour, nMin, nSec);     ts=COleDateTimeSpan( lDays, nHours, nMins, nSecs );     for (i=1;i<=N;i++) {         s=t.Format(fmt);         printf("%08d %s\n",i,s);         t=t+ts;     }     return 0; }

user: user-0
content: 重新看了下  知道问题在哪了  date_judge(b).day 这里错误，书上的公式没给正确  导致n_value计算出的数据不对。  谢谢热心的各位

user: user-0
content: 抱歉 忘记说了  这是计算两个日期间的天数  但是我输入2004 8 8  和2005 2 22后 所计算出来的天数不对

user: user-2
content: 不清楚问题是什么

user: user-3
content: 都不知道你要干什么，你的代码能过编译器，哪里知道你的问题出在哪里呢？ 难道因为我是新手？大神都能看懂？有潜规则？
user-0 提问: 文件指针

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

user: user-2
content: #include<stdio.h> #include<stdlib.h>   int main(int argc,char *argv[]) {     char in[10];     FILE *pf1,*pf2;       printf("enter in file:");     if((pf1=fopen(argv[1],"rb"))==NULL) /*去掉""*/     {         printf("cant open %s",argv[1]);         exit(1);     }     fgets(in,10,pf1);     if((pf2=fopen(argv[2],"wb"))==NULL) /*去掉""*/     {         printf("cant open %s",argv[2]);         exit(1);     }     fputs(in,pf2);     return 0; } argv[1]和argv[2]本身就是字符串指针，所以不需要再加双引号，并且，即使不是字符串指针，加了双引号也不会称为字符串。

user: user-3
content: 路径不对，试试用绝对路径

user: user-0
content: 我已经找到错误啦 pf1=fopen("argv[1]","rb")  argv[1]不应该用双引号引起来。
user-0 提问: 嵌入式系统内存分配的若干问题

回复:
user: user-0
content: 代码烧录在ROM里没错，但是程序运行时，是不是需要加载到RAM里面才能运行呀？没听说过直接在ROM里面跑程序的

user: user-1
content: 代码可以烧到ROM中，变量才需要RAM

user: user-0
content: 感谢大侠的解答。关于1-3点的解答和我设想的是一致的。 关于第四点：深入一点讨论，在最初的内存规划时，系统应该是设定了几块固定好的区域分别用来作为存储代码段、静态和全局变量段、堆栈段的。而系统在上电运行时，代码必须拷贝到内存中并且使指针指向代码的第一条指令，程序才可以正确运行。 如果是被注释的代码，有可能由于链接的关系，最终不会被放入内存，这个没问题。但是...真正要运行的代码段毫无疑问是要放入内存的，所以，严格意义上来说，精简代码，然后手动缩小代码空间，是可以节约运行时内存的，当然了，这是我想当然，仅仅是推断，我自己没有这么做过。 恳请各位有经验的人士来不吝赐教。

user: user-2
content: 1. 程序能够编译通过并正常运行的情况下，（尤其是大的数组赋值时）为什么会篡改其他的全局变量？ 答：应该是嵌入式的内存不足，申请大的空间，导致变量空间重叠； 2. 程序能够通过编译，运行时为什么会触发写到ROM的保护？ 答：编译通过，只是用来检查语法，简单的逻辑问题，不会检查申请空间过大的问题，编译器也不会去做这些事情； 3. 被注释掉的代码会占用系统运行时内存吗？（考虑后续开发的兼容性，代码段比较大，有许多扩展模式） 答：被注释掉的代码，在编译时就不会进入目标文件和可执行程序里，所以也不会占用内存； 4. 节省代码段的长度可以提高内存使用率吗？ 答：代码段长度与内存使用率没关系，建议申请大内存时，要小心，根据需要来，如果数据用不了那么大的空间，反而会降低内存使用率； 嵌入式对内存的使用是宝贵的，所以在定义数据结构时就应该注意

user: user-3
content: 按自己的理解答复下，请参考： 1. 程序能够编译通过并正常运行的情况下，（尤其是大的数组赋值时）为什么会篡改其他的全局变量？ ——数组应该是全局的，可能是数组越界，检查下下标 2. 程序能够通过编译，运行时为什么会触发写到ROM的保护？ ——运行和编译没关系，触发到写rom保护可能是使用了非法指针（指向保护内存） 3. 被注释掉的代码会占用系统运行时内存吗？（考虑后续开发的兼容性，代码段比较大，有许多扩展模式） ——注释掉无影响 4. 节省代码段的长度可以提高内存使用率吗？ ——不可以，或者说意义非常有限，程序使用的内存与其大小无关（不考虑程序本身占用的内存）
user-0 提问: 0x775598C1 (ntdll.dll) (ConsoleApplication4.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (

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

user: user-2
content: 下断点跟吧 堆已损坏大多是由于越界操作引起的
user-0 提问: 循环问题？

回复:
user: user-1
content: 引用 8 楼 w1610scanf 的回复:[quote=引用 7 楼 lilimite 的回复:] scanf(" %c",&a);还可以在%前面加一个空格 这是什么原理？[/quote] 变量类型的问题，char型是一个字节的，每次输入之后敲的回车ASCII码会缓存，下次scanf的时候就输入回车键了，加个空格就相当于是回车了。

user: user-0
content: 引用 7 楼 lilimite 的回复:scanf(" %c",&a);还可以在%前面加一个空格 这是什么原理？

user: user-2
content: scanf("%c",&a);前面增加fflush(stdin);清空缓冲区，程序就没问题了，如下：  #include "stdafx.h"  #include<stdlib.h> #include<stdio.h> #include<math.h>  int main() { //下面进行简单的加减乘除算法。 while(1) {  printf("请输入你要进行的算法，加法请输入+，减法请输入-，乘法请输入*，除法请输入/\n"); char a; int b,c,d;     fflush(stdin);     scanf("%c",&a); 	 switch(a)    { case('+'):printf("请输入要相加的两个整数\n"); scanf("%d %d",&b,&c); d=b+c; printf("%d+%d=%d\n",b,c,d); break;  case('-'):printf("请输入要相减的两个整数\n"); scanf("%d %d",&b,&c); d=b-c; printf("%d-%d=%d\n",b,c,d); break;  case('*'):printf("请输入要相乘的两个整数\n"); scanf("%d %d",&b,&c); d=b*c; printf("%d*%d=%d\n",b,c,d); break;  case('/'):printf("请输入要相除的两个整数\n"); scanf("%d %d",&b,&c); d=b/c; printf("%d/%d=%d\n",b,c,d); break;  case('\r'):printf("\n");  default:printf("我只会加减乘除啊，不要难为小学生\n"); break; } }   }

user: user-3
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

user: user-1
content: scanf(" %c",&a);还可以在%前面加一个空格

user: user-4
content: 请参考以下文章  使用Qt和Interpreter设计模式开发计算器（附源码）

user: user-0
content: 那请问一下，如何做到像计算器那样，可以不限计算的个数呢？

user: user-5
content: #include<stdio.h> #include<math.h>  int main() {     //下面进行简单的加减乘除算法。     while(1)     {          printf("请输入你要进行的算法，加法请输入+，减法请输入-，乘法请输入*，除法请输入/\n");         char a;         int b,c,d;         scanf("%c", &a);         switch(a)         {             case('+'):                 printf("请输入要相加的两个整数\n");                 scanf("%d %d",&b,&c);                 d=b+c;                 printf("%d+%d=%d\n",b,c,d);                 break;              case('-'):                 printf("请输入要相减的两个整数\n");                 scanf("%d %d",&b,&c);                 d=b-c;                 printf("%d-%d=%d\n",b,c,d);                 break;              case('*'):                 printf("请输入要相乘的两个整数\n");                 scanf("%d %d",&b,&c);                 d=b*c;                 printf("%d*%d=%d\n",b,c,d);                 break;              case('/'):                 printf("请输入要相除的两个整数\n");                 scanf("%d %d",&b,&c);                 d=b/c;                 printf("%d/%d=%d\n",b,c,d);                 break;              case('\r'):                 printf("\n");                 break;              default:                 printf("我只会加减乘除啊，不要难为小学生\n");                 break;         }         getchar();    /*add to  recv '\n' (linux)*/     }  }  加一句getchar(); 原因是输入整数之后会有回车留在输入缓冲区里

user: user-6
content: scanf("%c",&a);  改为：   while((a=getchar()) == '\n'){  }
user-0 提问: 求助帖,求看看是哪个位置问题

回复:
user: user-1
content: scanf("%d\n", &sec); 去掉后面的\n  否则它是不会立即显示的，要等再接收到一个非（空格、制表符、回车）的输入scanf语句才结束

user: user-2
content: 把两个地方的 scanf("%d\n", &sec); 修改为 scanf("%d", &sec);

user: user-0
content: 引用 2 楼 paschen 的回复:scanf("%d\n", &sec); 去掉后面的\n  否则它是不会立即显示的，要等再接收到一个非（空格、制表符、回车）的输入scanf语句才结束 感谢了

user: user-0
content: 引用 1 楼 jianwen0529 的回复:把两个地方的 scanf("%d\n", &sec); 修改为 scanf("%d", &sec);  感谢了
user-0 提问: main函数的参数

回复:
user: user-1
content: int main(int argc, char* argv[]) { 	for (int i = 0; i < argc; i++) 	{ 		std::cout << argv[i] << std::endl; 	}  	return 0; }   生成一个1.exe  在控制台执行1.exe  如下图

user: user-2
content: #include <stdio.h>  int main(int argc, char *argv[]) {     int i;      for (i = 0; i < argc; i++)         puts(argv[1]);     return 0; } 把上面的程序编译一下，生成一个可执行程序，比如a.out; 然后如下执行（在终端上执行）./a.out hello world,然后看一下输出结果。

user: user-3
content: http://blog.csdn.net/htyurencaotang/article/details/16947855

user: user-4
content: 首先，你的参数列表写错了，应该是 int argc, char *argv[]   传进来的参数都是char*类型 那么你就需要根据char*转换成你需要的类型，诸如int double等 参考 atoi atof 等函数  argv[0] 保存的是执行程序的路径，所以参数是从argv[1]开始的   #include <stdio.h> #include <stdlib.h> // 执行程序的时候，附加一个int类型的参数，那么程序会打印改值 int main(int argc, char *argv[]) {     int n = 0;     if (argc > 1)     {         n = atoi(argv[1]);     }      printf("%d", n);     return 0; }
user-0 提问: 为什么a[3] 等价于 *(a+3)     a不是第一个数组的地址吗，怎么能直接加3？          

回复:
user: user-1
content: Pointer Arithmetic Additive operations involving a pointer and an integer give meaningful results only if the pointer operand addresses an array member and the integer value produces an offset within the bounds of the same array. When the integer value is converted to an address offset, the compiler assumes that only memory positions of the same size lie between the original address and the address plus the offset.  This assumption is valid for array members. By definition, an array is a series of values of the same type; its elements reside in contiguous memory locations. However, storage for any types except array elements is not guaranteed to be filled by the same type of identifiers. That is, blanks can appear between memory positions, even positions of the same type. Therefore, the results of adding to or subtracting from the addresses of any values but array elements are undefined.  Similarly, when two pointer values are subtracted, the conversion assumes that only values of the same type, with no blanks, lie between the addresses given by the operands.

user: user-2
content: 这里a+3表示的是地址向后移了3个

user: user-3
content: 这个甲鱼的臀部——规定，一个地址值加减一个数表示移动到相应个数的位置，具体位置视你指向的对象的类型

user: user-4
content: 不是地址加了3，而是地址偏移了sizeof(a[0])个字节。数组名a是数组的首地址，a[3]是指从首地址向后偏移3  * sizeof(a[0])个字节的地址里取出其中的数值。*(a+3)也是这个意思，只是后一种表达的更形象。 另，若a是int类型数据，基于a向后偏移了：3 * sizeof(int)

user: user-5
content: 楼主你要理解一下数据类型的概念，数据都是有类型的，一个int变量和一个double变量都加3，虽然效果看起来都是多了3，但里面的二进制变化规则是不同的，所以运算符的运算过程要根据它作用的数据类型来决定 当一个指针类型的变量加上一个整数n时，它实际加的是n*siezof(指针所指对象的类型)

user: user-1
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-6
content: 引用a不是第一个数组的地址吗 你并没有告诉我们 a 是啊 ...  ========================== 指针可以和整数做加减法。建议去看一下书。

user: user-7
content: 楼主这个问题还是看书比较清楚，参考以下任一本相关章节： 《深入理解C指针》 《C语言点滴》 C和指针

user: user-8
content: 地址 +- 一个整数，得出来的还是地址 表示移动了几步，步长是该指针的基本类型的大小  int p[10]; (a+3) == a[3] == a的地址值 + 3 * sizeof(int)
user-0 提问: 关于调用函数求数组和和平均数的问题（内含指针）

回复:
user: user-1
content: 引用 4 楼 qq_37120435 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] #include <stdio.h>   #define MAX_LEN 3 void avg_sum(double a[],int n,double *avg,double *sum);  int main() {     double a[MAX_LEN], av, su;     int i;      for (i = 0; i < MAX_LEN; i++)         scanf("%lf", &a[i]);      avg_sum(a, MAX_LEN, &av, &su);      printf("ave = %.2lf, sum = %.2lf\n", av, su);      return 0; } void avg_sum(double a[], int n, double *avg,double *sum) {     int i;     *sum = 0.0;      for(i = 0; i < n; i++)         *sum += a[i];     *avg = *sum/n; } 第一点，C语言不支持可变数组，n是一个随机值，可能是很大导致数组申请的超过栈的大小（猜的）； 第二点，double使用%lf格式输入，因为%lf与%f大小不一样，你可以试一下，用%f格式输入（较小的值），最后的结果都是0.000，因为输入的数据都变成了double的小数部分，但是输出时一般都是输出小数点后6位，输入的数值又小，不到输出的精度，所以都是0了。 那么怎么样才能输入可变数组呢？我也不知道会输入多少个，没办法给n一个准确的值[/quote] C语言不支持，所以没办法，但是可以通过malloc，每次你要求多少个即n是多少就可以申请相应的空间。

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:#include <stdio.h>   #define MAX_LEN 3 void avg_sum(double a[],int n,double *avg,double *sum);  int main() {     double a[MAX_LEN], av, su;     int i;      for (i = 0; i < MAX_LEN; i++)         scanf("%lf", &a[i]);      avg_sum(a, MAX_LEN, &av, &su);      printf("ave = %.2lf, sum = %.2lf\n", av, su);      return 0; } void avg_sum(double a[], int n, double *avg,double *sum) {     int i;     *sum = 0.0;      for(i = 0; i < n; i++)         *sum += a[i];     *avg = *sum/n; } 第一点，C语言不支持可变数组，n是一个随机值，可能是很大导致数组申请的超过栈的大小（猜的）； 第二点，double使用%lf格式输入，因为%lf与%f大小不一样，你可以试一下，用%f格式输入（较小的值），最后的结果都是0.000，因为输入的数据都变成了double的小数部分，但是输出时一般都是输出小数点后6位，输入的数值又小，不到输出的精度，所以都是0了。 那么怎么样才能输入可变数组呢？我也不知道会输入多少个，没办法给n一个准确的值

user: user-1
content: #include <stdio.h>   #define MAX_LEN 3 void avg_sum(double a[],int n,double *avg,double *sum);  int main() {     double a[MAX_LEN], av, su;     int i;      for (i = 0; i < MAX_LEN; i++)         scanf("%lf", &a[i]);      avg_sum(a, MAX_LEN, &av, &su);      printf("ave = %.2lf, sum = %.2lf\n", av, su);      return 0; } void avg_sum(double a[], int n, double *avg,double *sum) {     int i;     *sum = 0.0;      for(i = 0; i < n; i++)         *sum += a[i];     *avg = *sum/n; } 第一点，C语言不支持可变数组，n是一个随机值，可能是很大导致数组申请的超过栈的大小（猜的）； 第二点，double使用%lf格式输入，因为%lf与%f大小不一样，你可以试一下，用%f格式输入（较小的值），最后的结果都是0.000，因为输入的数据都变成了double的小数部分，但是输出时一般都是输出小数点后6位，输入的数值又小，不到输出的精度，所以都是0了。

user: user-2
content: 定义a[n]的时候，n为随机值吧

user: user-3
content: scanf("%lf",&a[i]); // double类型使用 %lf 格式
user-0 提问: IntelliSense:  无法打开 源 文件 "X11/Xlib.h"	

回复:
user: user-0
content: 在网上查 有人说要用gcc for Win编译 可不知道如何做

user: user-0
content: 需要装这个X11库，却不知道从哪里来

user: user-0
content: 系统好像不带着两个文件

user: user-1
content: Xlib.h Xutil.h  你要先找到这两个文件，然后放在C++的include路径中，或者include时指定绝对路径

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

user: user-3
content: 这两个头文件不是 linux 系统的嘛？
user-0 提问: 斐波那契数列取余问题

回复:
user: user-1
content: 余数相加再取余=原数相加取余

user: user-1
content: [quote=引用 1 楼 自信男孩 的回复:] “如果计算出n之后对10007取余会导致越界，如果对每次的运算都取余10007，就永远不会数值越界；即类似：(1+1+2+3+5+8+13)%10，和1%10+1%10+2%10+3%10+5%10+ 8%10+13%10结果应该是一样的”这个不对，应该是余数相加之后再取余才对，（1%10+1%10+2%10+3%10+5%10+ 8%10+13%10）%10才对

user: user-2
content: 如果计算出n之后对10007取余会导致越界，如果对每次的运算都取余10007，就永远不会数值越界；即类似：(1+1+2+3+5+8+13)%10，和1%10+1%10+2%10+3%10+5%10+ 8%10+13%10结果应该是一样的。所以，可以如下实现吧： #include <stdio.h>  #define     KEY     10007  int main(void) {     int n, tmp, reminder;     int i;     int last = 1 % KEY;     int sum = 2 % KEY;      scanf("%d", &n);     if (n == 1 || n == 2) {         printf("1\n");     } else if (n == 3) {         printf("2\n");     } else {         for (i = 3; i < n; ++i)         {             tmp = sum % KEY;             sum = (sum + last) % KEY;             last = tmp % KEY;         }         printf("循环求出斐波那契序列值:%d\n", sum);     }     reminder = sum % KEY;     printf("reminder = %d\n", reminder);     return 0; } 有问题可以继续沟通～
user-0 提问: 自学C语言 遇到段错误  为什么  怎么解决啊！

回复:
user: user-1
content: 字符串是使用gets或者fgets得到的。getchar得到的是字符，是字符串的子集。字符没有\0，所以在找\0时会越界访问，导致段错误。 建议先申请字符数组，然后使用scanf, %s或者fgets(gets不安全，不建议使用）从终端得到一个字符串。

user: user-1
content: 字符串是使用gets或者fgets得到的。getchar得到的是字符，是字符串的子集。字符没有\0，所以在找\0时会越界访问，导致段错误。 建议先申请字符数组，然后使用scanf, %s或者fgets(gets不安全，不建议使用）从终端得到一个字符串。

user: user-2
content: getchar()得到的是字符，不是字符串。

user: user-0
content: 谢谢哈 懂了

user: user-3
content: strlen 接受的参数类型是char* 不是int  还有strlen换个名字，跟标准库的名字冲突了
user-0 提问: 冒泡排序法求解

回复:
user: user-1
content: #include<stdio.h>  /* 冒泡排序*/ void bubble_sort(int *arr, int len); /*选择排序*/ void select_sort(int *arr, int len);  int main(void) {     int a[] = {11,33,55,88,99,44,66,77,22,0};     int n = sizeof(a) / sizeof(a[0]);     int i;      //bubble_sort(a, n);     select_sort(a, n);      for (i = 0; i < n; i++)         printf("%4d",a[i]);     printf("\n");      return 0; }  void bubble_sort(int *arr, int len) {     int i, j;     int tmp;      for (i = 0; i < len - 1; i++)         for (j = 0; j < len - 1 - i; j++)             if (arr[j] < arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } }  void select_sort(int *arr, int len) {     int i, j, max_i;     int tmp;      for (i = 0; i < len - 1; i++) {         max_i = i;         for (j = i+1; j < len; j++)             if (arr[j] > arr[max_i])                 max_i = j;         if (max_i != i) {                 tmp = arr[max_i];                 arr[max_i] = arr[i];                 arr[i] = tmp;         }     } } 你的程序像选择排序，是不是搞混了？！ 以上是我的demo，有选择有冒泡，作为一个参考吧；

user: user-2
content: 手动debug一下吧，你就知道哪里错了。

user: user-3
content: 你这整个逻辑都有问题，你排序没有元素的交换，区间的错误等等 这不是单纯的一两处小的错误，是大方面和小方面均有不少问题  你去搜索下冒泡排序的算法和它的c语音实现代码，参考别人的之后再试着自己写一个

user: user-4
content: 我也是初学者，感觉这个算法不论不类，简单选择和冒泡混了貌似…两个for循环不断使数组元素和max比较没有意义…这是我的看法。
user-0 提问: 求教帖-一个简单但是我不会的循环问题

回复:
user: user-1
content: 关于自己是否适合编程的很简单的测试： 在报纸或杂志上随便找一段约1000字的文章，在Word中输入一遍。输完后再参考下面答案：  A里面有10处以上文字或标点错误 B里面没有文字或标点错误并敢为此跟人打赌 C里面没有文字或标点错误并且字体和排版完全与原稿一致 D打印在半透明的纸上和原稿重叠在一起检查一模一样，且自我感觉很有成就感  A不适合编程（理由：打字准确度偏低、粗心大意） B初级程序员（理由：打字准确度很高、认真细致、自信、理解全角半角概念） C高级程序员（理由：在B的基础上理解字体和排版也是电脑打印的重要因素、但相比D还不够偏执、精益求精、结果可验证） D软件项目经理（理由：能针对项目给出令人信服的细致到极点的需求说明和典型测试用例。用户几乎挑不出毛病。专业！）  如果想从A变成B的话，到我的资源http://download.csdn.net/detail/zhao4zhong1/4084259里面下载“适合程序员的键盘练习”

user: user-0
content: oo,谢谢各位，看出来了。不仅没写对，题目也看错了.......

user: user-2
content: 题目要求的是用迭代法，你这用的是递归啊，老兄

user: user-3
content: 你的代码里面 当n=1时候 直接就求出平方根了...那还算个什么呢？ 所以 直接 n=1时候 y=a；n>1再按公式算； 然后 题目 里面 都说了 俩值差的绝对值<e ，而你直接让差值<e(我试了几次，应该你现在 这么算的第一个差值 直接是负数，然后x根本就没赋值....所以就出现你现在的这个情况了。  你再想想吧。

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

user: user-4
content: #include <stdio.h> #include <math.h>  #define MIN_DIFF    (1e-5) #define FZERO       (1e-6)  int main(void) {     float a, prev, cur;     int i;      printf("Please input a number: ");     scanf("%f", &a);      if (fabsf(a) <= FZERO) {         printf("%f sqrt is %.5f\n", a, 0.0);         return 0;     }     prev = 1.0;     cur = (prev + a / prev) / 2;     for (i = 0; fabsf(cur - prev) >= MIN_DIFF; i++) {         prev = cur;         cur = (prev + a / prev) / 2;     }      printf("%.2f sqrt is %.5f\n", a, cur);     return 0; }   循环求平方根。 以上的代码测试通过，作为一个参考吧～

user: user-5
content: 你这是递归吧..
user-0 提问: 宏定义用##组合标识符

回复:
user: user-1
content: 宏替换 是在预处理阶段就要展开的，  也就是说是在编译代码之前，宏替换就已经完成了  而在编译之前，编译器怎么能知道你的 一个变量‘j’ 到底是几呢？

user: user-1
content: 你需要 NNAME(0) NNAME(1) NNAME(2) NNAME(3) ...

user: user-2
content: #与##在宏定义中的--宏展开 #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         return 0; } 宏展开时： 如果宏定义以#开头，不展开参数，直接替换。 故g(f(1,2))--->#f(1,2)--->"f(1,2)"； 如果宏定义不以#开头，展开参数，直接替换，由外层向里层，如果碰到的是#开头的宏，不继续往里层展开，往外层展开。 由外层向里层，如果碰到的是以非#开头的宏，继续往里层走，直至最里层，开始一层层往外层展开。 故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。 PS： ##在宏中定义，是字符连接符 如a##b##c 等同于 "abc" #在宏开头出现，是表示宏展开的方式不同 #a 等同于"a" #abc 等同于 "abc" 复杂的: #include <stdio.h> #define f(a,b) a##b #define g(a)   #a #define h(a) g(a) int main() {         char a = 'a';         cout<<g(a)<<endl; // a         cout<<g(g(a))<<endl; // a         printf("%s\n", h(f(1,2)));   // 12         printf("%s\n", g(f(1,2))); // f(1,2)         printf("%s\n", g(h(f(1,2)))); // h(f(1,2))         printf("%s\n", h(g(f(1,2)))); // "f(1,2)"         printf("%s\n", h(h(f(1,2)))); // "12"         system("pause");         return 0; } 预处理后的：（在编译选项中添加/EP /P后编译生成的.i文件。gcc加-E） int main() {         char a = 'a';         cout<<"a"<<endl;         cout<<"g(a)"<<endl;         printf("%s\n", "12");         printf("%s\n", "f(1,2)");         printf("%s\n", "h(f(1,2))");         printf("%s\n", "\"f(1,2)\"");         printf("%s\n", "\"12\"");         system("pause");         return 0; } --------------------------------------------------- 宏解析 1.       ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号，它不能出现于宏替代表的开端和末尾。 例： #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC 2.       重新扫描和替换 在替换列表中的所有参数替换过之后，预处理器将对结果token序列重新扫描以便对其中的宏再次替换。 当正在替换的宏在其替换列表中发现自身时，就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替换的宏就对其不再进行替换（防止递归）。 例： #define ROOT AAA CCC #define AAA ROOT ROOT 将被替换成 ROOT CCC

user: user-3
content: 定义数组不好么？

user: user-4
content: for(j=0;j<10;j++)     printf("%d ",nj);     //这是预处理后的代码，肯定不能执行啊
user-0 提问: C语言选择排序

回复:
user: user-1
content: //n为数组大小，m为从第几个开始排序 void selectsort(char (*a)[23], int n, int m) {     char swap[23]; /* 建议大小为23个字节*/     int min;     int i,j;     for (i = m; i < n - 1; i++) {         min = i;         for (j = i + 1; j < n; j++) {             if (strcmp(a[min], a[j]) > 0)                 min=j;         if (min > i) {             strcpy(swap, a[min]);             strcpy(a[min], a[i]);             strcpy(a[i], swap);         }     } } 从你的选择排序处理上看是字符串排序； 另外，你说从11个开始，是指从第11行（二维数组）开始，还是从每行的11字符开始？ 过从第11行开始，如果数组总共是1行，那肯定是越界了。如果是从11个字符开始，前面的字符会影响排序结果。

user: user-2
content: 引用 2 楼 Butterfly_lily1204 的回复:[quote=引用 1 楼 cyfcsd 的回复:] 代码没问题，是不是你传入的实参有问题  #include <stdio.h> #include <string.h>   void selectsort(char a[][23],int n,int m){//n为数组大小，m为从第几个开始排序     int min;     char swap[10];     int i,j;     for(i=m;i<n-1;i++){         min=i;        	for(j=i+1;j<n;j++){      	    if (strcmp(a[min], a[j]) > 0)                 min=j;         }         if(min>i){      	    strcpy(swap, a[min]);                                                                  strcpy(a[min], a[i]);             strcpy(a[i], swap);        	}     } } int main() {      char arr[5][23] = {"abc", "bac", "cab", "cba", "acb"};     selectsort(arr,5,0);     for(int i=0; i<5; i++){         printf("%s ", arr[i]);     }     return 0; }  如有问题欢迎继续追问，没问题请及时结贴，谢谢  实参是没问题的，我不知是不是数组在进行字母排序前遇到了'\0'，所以不往后操作了，因为我的数组定义为num[10][23]，并且经过了处理，前10个都是空的，从第11 个开始才有数据。[/quote] 字母排序？你说的是字符串排序吧，字母排序这个程序就不对了，这是字符串排序的，也就是排序的单位是字符串，不是字母 前面是空的是每个字符串前面都是'\0'吗，是“\0\0\0\0\0\0\0abc\0”这种格式的吗？这种字符串也可以操作，strcmp的时候跳过前面的空就可以了，strcpy的时候也要对应改一下，但这样太不方便了，所有字符串函数都要改动

user: user-0
content: 引用 1 楼 cyfcsd 的回复:代码没问题，是不是你传入的实参有问题  #include <stdio.h> #include <string.h>   void selectsort(char a[][23],int n,int m){//n为数组大小，m为从第几个开始排序     int min;     char swap[10];     int i,j;     for(i=m;i<n-1;i++){         min=i;        	for(j=i+1;j<n;j++){      	    if (strcmp(a[min], a[j]) > 0)                 min=j;         }         if(min>i){      	    strcpy(swap, a[min]);                                                                  strcpy(a[min], a[i]);             strcpy(a[i], swap);        	}     } } int main() {      char arr[5][23] = {"abc", "bac", "cab", "cba", "acb"};     selectsort(arr,5,0);     for(int i=0; i<5; i++){         printf("%s ", arr[i]);     }     return 0; }  如有问题欢迎继续追问，没问题请及时结贴，谢谢  实参是没问题的，我不知是不是数组在进行字母排序前遇到了'\0'，所以不往后操作了，因为我的数组定义为num[10][23]，并且经过了处理，前10个都是空的，从第11 个开始才有数据。

user: user-2
content: 代码没问题，是不是你传入的实参有问题  #include <stdio.h> #include <string.h>   void selectsort(char a[][23],int n,int m){//n为数组大小，m为从第几个开始排序     int min;     char swap[10];     int i,j;     for(i=m;i<n-1;i++){         min=i;        	for(j=i+1;j<n;j++){      	    if (strcmp(a[min], a[j]) > 0)                 min=j;         }         if(min>i){      	    strcpy(swap, a[min]);                                                                  strcpy(a[min], a[i]);             strcpy(a[i], swap);        	}     } } int main() {      char arr[5][23] = {"abc", "bac", "cab", "cba", "acb"};     selectsort(arr,5,0);     for(int i=0; i<5; i++){         printf("%s ", arr[i]);     }     return 0; }  如有问题欢迎继续追问，没问题请及时结贴，谢谢
user-0 提问: 求大佬们帮个忙，帮我编写下一个小程序。

回复:
user: user-0
content: 引用 4 楼 cyfcsd 的回复:[quote=引用 2 楼 ylkanke 的回复:] [quote=引用 1 楼 cyfcsd 的回复:]  #include <iostream>  using namespace std;   int main() {     int i = 2147483647;     cout<<i<<endl;     i = 2147483647 + 1;     cout<<i<<endl;     double d = 1.79E+308;     cout<<d<<endl;     d = 1.79E+308 + 0.01E+308;     cout<<d<<endl;     d = -1.79E+308;     cout<<d<<endl;     d = -1.79E+308 - 0.01E+308;     cout<<d<<endl;     return 0; }  大佬，在下愚钝，虽然程序可以运行，可是您写的程序可以让我借鉴去理解的地方太少了，主要都太深奥了，我看不懂！！！！！[/quote] 这个原理说来话长啊，可以写一章了，你得了解数字在机器内部的表示方法，原码、补码这些，浮点数还要知道指数和尾数等等 简单可以这么理解，整数上溢就是超过了它的表示范围，比如四位二级制，一位符号位，那么它能表示的数是-8到7，每一个数都对应一个唯一的四位二进制编码，7对应0111，当把数字8装进去的时候，相当于把1000放了进去，但这个数肯定不是8了，对应-7到8的另一个数了。浮点数也差不多，但不会出现“循环”，一般超出范围后编译器会报错[/quote] 要学习的东西还有很多啊，要加把劲了，谢谢大佬。

user: user-1
content: 亲自打开include\float.h一眼。

user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 引用 2 楼 ylkanke 的回复:[quote=引用 1 楼 cyfcsd 的回复:]  #include <iostream>  using namespace std;   int main() {     int i = 2147483647;     cout<<i<<endl;     i = 2147483647 + 1;     cout<<i<<endl;     double d = 1.79E+308;     cout<<d<<endl;     d = 1.79E+308 + 0.01E+308;     cout<<d<<endl;     d = -1.79E+308;     cout<<d<<endl;     d = -1.79E+308 - 0.01E+308;     cout<<d<<endl;     return 0; }  大佬，在下愚钝，虽然程序可以运行，可是您写的程序可以让我借鉴去理解的地方太少了，主要都太深奥了，我看不懂！！！！！[/quote] 这个原理说来话长啊，可以写一章了，你得了解数字在机器内部的表示方法，原码、补码这些，浮点数还要知道指数和尾数等等 简单可以这么理解，整数上溢就是超过了它的表示范围，比如四位二级制，一位符号位，那么它能表示的数是-8到7，每一个数都对应一个唯一的四位二进制编码，7对应0111，当把数字8装进去的时候，相当于把1000放了进去，但这个数肯定不是8了，对应-7到8的另一个数了。浮点数也差不多，但不会出现“循环”，一般超出范围后编译器会报错

user: user-0
content: 小弟到处询问之后，有一位和我是看同一本书的大佬给我这个答案参考，希望大佬能解答下我的疑惑。 #include<stdio.h> int main(void) { 	int i = 2147483647;     这些和我的答案都差不多下面我就比较疑惑。 	float a = 3.4e38*100.0f;    为什么要*100.0f  后面的.0f是什么 	float b = -0.1234e-10 / 10.0f;  这里的/10.f我也很费解 	printf("%d %d %d\n", i, i + 1, i + 2);  这里的 i+1 i+2 我也搞不懂，可能我的确比较笨， 希望有个有耐心的大佬解答下。 	printf("%f\n", a); 	printf("%f\n", b); 	return 0; } 小弟到处询问之后，有一位和我是看同一本书的大佬给我这个答案参考，希望

user: user-0
content: 引用 1 楼 cyfcsd 的回复: #include <iostream>  using namespace std;   int main() {     int i = 2147483647;     cout<<i<<endl;     i = 2147483647 + 1;     cout<<i<<endl;     double d = 1.79E+308;     cout<<d<<endl;     d = 1.79E+308 + 0.01E+308;     cout<<d<<endl;     d = -1.79E+308;     cout<<d<<endl;     d = -1.79E+308 - 0.01E+308;     cout<<d<<endl;     return 0; }  大佬，在下愚钝，虽然程序可以运行，可是您写的程序可以让我借鉴去理解的地方太少了，主要都太深奥了，我看不懂！！！！！

user: user-2
content: #include <iostream>  using namespace std;   int main() {     int i = 2147483647;     cout<<i<<endl;     i = 2147483647 + 1;     cout<<i<<endl;     double d = 1.79E+308;     cout<<d<<endl;     d = 1.79E+308 + 0.01E+308;     cout<<d<<endl;     d = -1.79E+308;     cout<<d<<endl;     d = -1.79E+308 - 0.01E+308;     cout<<d<<endl;     return 0; }
user-0 提问: 求出二维数组每行的最大数

回复:
user: user-1
content: 既然是二维数组就应该是a[i][j];这样来表示吧？  然后：按你现在这么写，user_row  =3没错，但是 user_col 它等于3，那么j就可以取值2，j+1就会等于3，你这个数据中数组没有a[i][3]， 这里会出错，我用vs2013过不了编译器, 需要把两个if 语句块的顺序颠倒下  #define user_row 3 #define user_col 3 	int a[3][3] = { { 8, 6, 4 }, { 5, 9, 3 }, { 2, 10, 7 } };  	int t, max; 	for(int i = 0; i < user_row; i++)    //judge max number,select min number 	{ 		for (int j = 0; j < user_col; j++) 		{  			if (j == (user_col - 1)) 			{ 			max = a[i][j];	 			printf("%d  \n", max);             continue; 			} 			if (a[i][j] > a[i][j + 1]) 			{ 				t = a[i][j]; 				a[i][j] = a[i][j + 1]; 				a[i][j + 1] = t; 				 			}  			 		} 	}

user: user-2
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  void malloc_arr(int ***arr, int row, int col); void init_arr(int ***arr, int row, int col); void  get_max_list(int *max_list, int **arr, int row, int col); void destroy_arr(int **arr, int row); void print_arr(int **arr, int row, int col);  int main(void) {     int row, col, i;     int **arr = NULL, *max_list;      printf("Please input your row number: ");     scanf("%d", &row);     printf("Please input your col number: ");     scanf("%d", &col);     malloc_arr(&arr, row, col);     max_list = (int *)malloc(row * sizeof(int));     if (!max_list) {         fprintf(stderr, "malloc error!\n");         exit(0);     }      init_arr(&arr, row, col);     print_arr(arr, row, col);     get_max_list(max_list, arr, row, col);      for (i = 0; i < row; i++)         printf("No.%d: max is %d\n", i+1, max_list[i]);      destroy_arr(arr, row);     free(max_list);       return 0; }   void malloc_arr(int ***arr, int row, int col) {     int i;      *arr = (int **)malloc(row * sizeof(int *));     if (!(*arr)) {         fprintf(stderr, "malloc error!\n");         exit(0);     }     for (i = 0; i < row; i++) {         (*arr)[i] = (int *)malloc(col * sizeof(int));         if (!(*arr)[i]) {             fprintf(stderr, "malloc error!\n");             exit(0);         }     } }  void destroy_arr(int **arr, int row) {     int i;      for (i = 0; i < row; i++)         free(arr[i]);     free(arr); }  void init_arr(int ***arr, int row, int col) {     int i, j;      srand(time(NULL));     for (i = 0; i < row; i++)         for (j = 0; j < col; j++)             (*arr)[i][j] = rand() % 200; }  void  get_max_list(int *max_list, int **arr, int row, int col) {     int i, j, max = 0;      for (i = 0; i < row; i++) {         max = arr[i][0];         for (j = 1; j < col; j++) {             if (max < arr[i][j])                 max = arr[i][j];         }         max_list[i] = max;     } }  void print_arr(int **arr, int row, int col) {     int i, j;      for (i = 0; i < row; i++) {         printf("No.%d\n", i+1);         for (j = 0; j < col; j++)             printf("%d ", arr[i][j]);         putchar(10);     } } 作为一个参考吧～
user-0 提问: 用二分法求根的问题

回复:
user: user-1
content: The upstairs is niubility.

user: user-2
content: 仅供参考：//用C语言编程，求出2^x=x^10这个方程的解。 #include <math.h> #include <stdio.h> double x,e; void main () {     x=-1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x);      x=1.0;     e=0.001;     while (1) {         while (1) {             if (pow(2.0,x)>pow(x,10.0)) {                 x+=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;         while (1) {             if (pow(2.0,x)<pow(x,10.0)) {                 x-=e;             } else {                 break;             }         }         e/=10.0;         if (e<1e-15) break;     }     printf("%+.14g\n",x); }
user-0 提问: 帮忙看看是哪个位置问题呢?

回复:
user: user-1
content: 引用 3 楼 weixin_37671669 的回复:[quote=引用 1 楼 jianwen0529 的回复:] int main(void)  ; //多了个分号  还有你源.cpp是不是也有一个main函数？ 一个工程只能有一个入口main函数，你把其中一个不要的删除或者注释掉 是不是我源1.cpp里面带了main导致没法运行吗?一个源文件里面只能有一个源.cpp么?[/quote]  不是一个源文件只能有一个main函数，是一个程序只能有一个main  你把main（）后面的分号去掉，然后删除一个cpp就可以了

user: user-0
content: 引用 1 楼 jianwen0529 的回复:int main(void)  ; //多了个分号  还有你源.cpp是不是也有一个main函数？ 一个工程只能有一个入口main函数，你把其中一个不要的删除或者注释掉 是不是我源1.cpp里面带了main导致没法运行吗?一个源文件里面只能有一个源.cpp么?

user: user-2
content: int main() { } 或者 int main(void) { }

user: user-1
content: int main(void)  ; //多了个分号  还有你源.cpp是不是也有一个main函数？ 一个工程只能有一个入口main函数，你把其中一个不要的删除或者注释掉
user-0 提问: 新人求解答~指针问题

回复:
user: user-1
content: 按照scanf的格式来输入。逗号后面不要加空格。

user: user-0
content: 引用 6 楼 jianwen0529 的回复:scanf("%d,%d",&a,&b); 你的问题，你格式用的是 , （英文逗号），你输入的时候用的是中文逗号，不匹配导致b的输入失败 确实是这样！！懂了，谢谢~~~

user: user-2
content: 引用 6 楼 jianwen0529 的回复:scanf("%d,%d",&a,&b); 你的问题，你格式用的是 , （英文逗号），你输入的时候用的是中文逗号，不匹配导致b的输入失败  够仔细........

user: user-3
content: scanf("%d,%d",&a,&b); 你的问题，你格式用的是 , （英文逗号），你输入的时候用的是中文逗号，不匹配导致b的输入失败

user: user-0
content: 引用 2 楼 eit520 的回复:没有问题。你再试下啊   void test() { 	int a, b; 	int *p, *q; 	scanf_s("%d,%d", &a, &b); 	p = &a; 	q = &b; 	printf_s("%d,%d\n", *p, *q); } int main() { 	test(); 	system("pause");//此函数是运行了一个系统命令，让命令行窗体暂停，此函数在stdlib.h  	return 0;  }   我是用codeblock，那么是编辑器的问题吗？

user: user-0
content: 引用 1 楼 baidu_36581798 的回复: 我也是新手，看了下你的代码没发现问题...我复制过来 自己用也没发现你说的问题啊? scanf改scanf_s 是vs要求的，难道与这个有关系？还是你输入的时候 不小心没输入逗号啊？ 跟我的第二组数据一样？  我是用codeblock，那么是编辑器的问题吗？

user: user-0
content: 我是用codeblock,那么是编辑器的问题吗？

user: user-4
content: 没有问题。你再试下啊   void test() { 	int a, b; 	int *p, *q; 	scanf_s("%d,%d", &a, &b); 	p = &a; 	q = &b; 	printf_s("%d,%d\n", *p, *q); } int main() { 	test(); 	system("pause");//此函数是运行了一个系统命令，让命令行窗体暂停，此函数在stdlib.h  	return 0;  }

user: user-2
content: 我也是新手，看了下你的代码没发现问题...我复制过来 自己用也没发现你说的问题啊? scanf改scanf_s 是vs要求的，难道与这个有关系？还是你输入的时候 不小心没输入逗号啊？ 跟我的第二组数据一样？
user-0 提问: 两个小问题C语言

回复:
user: user-0
content: 引用 4 楼 cfjtaishan 的回复:数组下标是从0开始，所以第0个就是我们平时所说的第一个。 第二个问题，我的方法比较直接： #include <stdio.h>  #define MAX_PEOPLE_NUM   30 #define MAX_MONEY   50  int main(void) {     int m, w, c;      for (m = 0; m <= (int)MAX_PEOPLE_NUM/3; m++) {         for (w = 0; w < MAX_PEOPLE_NUM/2; w++) {             for (c = 0; c <= MAX_PEOPLE_NUM/1; c++) {                 if (m + w + c == MAX_PEOPLE_NUM &&                         3 * m + 2 * w + c == MAX_MONEY)                     printf("Men: %2d, Women: %2d, Children: %2d\n",                             m, w, c);             }         }     }     return 0; }m,w,c应该分别小于等于MONEY/3   /2   /1,同时满足小于30，去最先小的一个。别的是正确的谢谢

user: user-1
content: 数组下标是从0开始，所以第0个就是我们平时所说的第一个。 第二个问题，我的方法比较直接： #include <stdio.h>  #define MAX_PEOPLE_NUM   30 #define MAX_MONEY   50  int main(void) {     int m, w, c;      for (m = 0; m <= (int)MAX_PEOPLE_NUM/3; m++) {         for (w = 0; w < MAX_PEOPLE_NUM/2; w++) {             for (c = 0; c <= MAX_PEOPLE_NUM/1; c++) {                 if (m + w + c == MAX_PEOPLE_NUM &&                         3 * m + 2 * w + c == MAX_MONEY)                     printf("Men: %2d, Women: %2d, Children: %2d\n",                             m, w, c);             }         }     }     return 0; }

user: user-2
content: [1] X = 0; Y = 20; Z = 10  X + Y + Z = 30 3X + 2Y + Z = 50  [2] X = 1; Y = 18; Z = 11  X + Y + Z = 30 3X + 2Y + Z = 50  [3] X = 2; Y = 16; Z = 12  X + Y + Z = 30 3X + 2Y + Z = 50  [4] X = 3; Y = 14; Z = 13  X + Y + Z = 30 3X + 2Y + Z = 50  [5] X = 4; Y = 12; Z = 14  X + Y + Z = 30 3X + 2Y + Z = 50  [6] X = 5; Y = 10; Z = 15  X + Y + Z = 30 3X + 2Y + Z = 50  [7] X = 6; Y = 8; Z = 16  X + Y + Z = 30 3X + 2Y + Z = 50  [8] X = 7; Y = 6; Z = 17  X + Y + Z = 30 3X + 2Y + Z = 50  [9] X = 8; Y = 4; Z = 18  X + Y + Z = 30 3X + 2Y + Z = 50  [10] X = 9; Y = 2; Z = 19  X + Y + Z = 30 3X + 2Y + Z = 50  [11] X = 10; Y = 0; Z = 20  X + Y + Z = 30 3X + 2Y + Z = 50

user: user-3
content: 1： *(score+i)  等同于 score[i]  2： x + y + z = 30; 3x + 2y + z = 50; 得 2x + y = 20; 那么有多个解 又 x <= 10, y <= 15, z <= 30  int main() {     int x, y, z;     for (x = 0; x <= 10; x++)     {         for (y = 0; y <= 15; y++)         {             if (2 * x + y == 20)             {                 z = 30 - x - y;                 printf("Men = %d, Women = %d, Children: %d\n", x, y, z);             }         }     }      return 0; }

user: user-4
content: *(score+i) 表示第i个元素，不过是从0开始，第0个、第1个.....  如果要从1数，那就是第i+1个

user: user-5
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-6
content: 第0个元素，第1个元素……对，我们就是这么数数的。  三重循环。
user-0 提问: 结构体指针问题

回复:
user: user-1
content: *s是对结构体指针的引用；因为s->data=0；即结构体第一个元素的值为0，%d输出，s是结构体的地址，那么就是输出*s就是第一个元素的值，所以结果就是0； (*s).data, (*s).data2; s->data, s->data2 都是表示结构体成员的两个元素。

user: user-2
content: *s 是解引用操作，得出来的是 s 指针指向的内存  printf("%d\n", *s);//你把整个结构体当做int输出了，那么解析出来的只是最前边 int 大小的内存，然后当做int值了  正确写法应该类似下面的：  printf("%d %f\n", s->data, s->data2);
user-0 提问: 关于函数的数组形参以及define的参数和函数参数之间的关系

回复:
user: user-1
content: #include <stdio.h>  #define N   12  float average(float *a, int len);  int main(void) {     float a[N], ave;     int i;      for(i = 0; i < N; i++)         scanf("%f",&a[i]);     ave = average(a, N);     printf("$%.2f\n", ave);      return 0; }  float average(float *a, int len) /* equals a[]*/ {     float sum = 0, ave;     int i;      for(i = 0; i < len; i++)         sum += a[i];     ave = sum / len;      return ave; } 建议如上定义和调用函数。

user: user-2
content: float average(a); 调用的时候不要再 写float 了。。可以定义一个变量来接收返回的avg= average(a);  #include <stdio.h> #define N 12 float average(float a[]);//这个叫申明 int main() {     float a[N];//a[]为输入数组     int i; float avg;     for(i=0;i<N;i++)//浮点数不能作为数组下标     {         scanf("%f",&a[i]);     }     avg=average(a); printf("$%.2f",avg)     return 0;  } float average(float a[])//这个叫定义也叫实现 {     float sum=0,avg;//名称不要重了     int i;      for(i=0;i<N;i++)     {         sum+=a[i];     }     avg=sum/N; return avg; }

user: user-3
content: 主函数里面的float average(a);应该改为average(a); 前者是函数声明，后者才是正确的调用函数。
user-0 提问: 关于对一个变量取址后强制转化再解引的意义

回复:
user: user-1
content: 1.  你可以通过这种转换,  传递不同类型的数据(只要字节数相同). 比如CListCtrl类中有一个SetItemData函数, 它只接收PTR_DWORD类型,  你想保存float类型, 怎么办.  你就可以用这种方式转换  2.  数据传送.  比如蓝牙, TCP  UDP,  串口  等.     比如TCP吧.  有一个send函数, 接收一个char*缓冲区, 要发送一个double类型的数据. char buf[0x10];  *(double*)buf = 123.0f;  //快速的把double类型数据填充到缓冲区中  send(sock, buf, sizeof(double), 0);

user: user-2
content: 用int类型指针来解释float变量的内容  这与float转成int是不同的

user: user-3
content: 以整数去解读这段内存.

user: user-0
content: 各位，像那样做的意义是什么，如何理解呢？

user: user-4
content: 电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-0
content: 谢谢上面回答的人了，按照你们说的我自己算了测试了一下，现在明白了，谢谢！！

user: user-5
content: 用不同的类型来解读地址对应的内存。

user: user-6
content: 没什么意义。 (signed/unsigned) char*和T*之间还可以转转，其他大多都是未定义行为。 这么喜欢操纵底层，何不去写汇编呢？
user-0 提问: 求用C语言写出2048这个游戏的源代码

回复:
user: user-1
content: https://www.codeproject.com/Article.aspx?tag=198374995443426321&

user: user-2
content: 2048没有，别的游戏有，参考： 《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例   TC（Turbo C）老代码（小游戏）最好看懂了以后，理解了算法和过程，用VC改写成Windows平台的。

user: user-3
content: 神马2048啊？？不懂讲清楚一点，把规则讲讲
user-0 提问: 结构体调用，可以访问成员变量但是不能访问成员函数

回复:
user: user-1
content: 结构体中定义的是函数指针， 需要struct创建后赋值， 否则不能用

user: user-2
content: 1： int (*FontInit)(char *pcFontFile,unsigned int dwFontSize); int (*GetFontBitMap)(unsigned int dwcode, PT_FontBitMap ptFontBitMap);  以上两个都是一个定义函数指针变量啊 FontInit 的类型是 int (*)(char *pcFontFile,unsigned int dwFontSize) 你使用之前需要赋值吧？  int func(char *pcFontFile,unsigned int dwFontSize){ return 1; }   ptFontOpr->FontInit = func; // 把func赋值给FontInit  ptFontOpr->FontInit(...); // 调用函数  2： 如果你只是声明函数，如下就好了 int FontInit(char *pcFontFile,unsigned int dwFontSize); int GetFontBitMap(unsigned int dwcode, PT_FontBitMap ptFontBitMap);

user: user-3
content: static int AsciiFontInit(char *pcFontFile,unsigned int dwFontSize) 这个函数的定义应该在结构体static T_FontOpr g_tAsciiOpr = {     .name          = "ascii", /* 前面根据名字可以判断是指向的这个结构体 */     .FontInit      = AsciiFontInit, }; 之后； 或者在初始化结构体时，把AsciiFontInit的声明在结构体初始化之后。
user-0 提问: vs2013编写的程序无法启动，小白求救

回复:
user: user-1
content: 小白，都要仔细些，楼主都说成这样，举一反三啦！

user: user-2
content: 这个程序编译通不过吧，for语法有问题，应该是两个分号;

user: user-3
content: 先去看下教材，for循环怎么写的吧

user: user-3
content: 你的for表达式里面不需要有逗号， for(j=1;j<=i;j++)这样

user: user-4
content: 引用 6 楼 lz941008 的回复:   那您再看一下我这个呢？  麻烦了 认真看我的回复 for表达式是里面的i后面的逗号是什么鬼?

user: user-0
content: 那您再看一下我这个呢？  麻烦了

user: user-4
content: 引用 4 楼 lz941008 的回复: for循环 要清除for表达式的格式 逗号什么意思 分号什么含义      for (j = 1; j <= i; j++)  // 分号

user: user-0

user: user-4
content: 引用 2 楼 lz941008 的回复:  我的是这种情况。 计算器的启动命令是 start calc

user: user-0
content: 我的是这种情况。

user: user-4
content: int main() {     int i, j;     printf("请输入你想要的计算器个数");     scanf("%d", &i);     for (j = 1; j <= i; j++){ // 分号          system("start calc"); // calc      }      return 0;  }
user-0 提问: 为什么程序显示没错误但是一运行就会无响应啊

回复:
user: user-1
content: #include <iostream>  using namespace std;  void input(int *hour,int *minute); void ouput(int *hour,int *minute);  int main() {     int a = 1;     int *hour,*minute;      hour = new (int);     minute = new (int);     while(a == 1)     {         input(hour, minute);         ouput(hour,minute);         cout<<"是否需要继续，是请输入1，否请输入0"<<endl;         cin>>a;     }     return 0; } void input(int *hour,int *minute) {     cin>>*hour>>*minute; } void ouput(int *hour,int *minute) {     if(*hour>=12)     {         cout<<*hour-12<<":"<<*minute<<"PM"<<endl;     }     if(*hour<12)     {         cout<<*hour<<":"<<*minute<<"AM"<<endl;     } } 这是我改过之后的代码，我在Linux下修改和测试的。 主要问题如下： 1. 野指针，hour和minute都是野指针，没有对其申请空间； 2. a未初始化，并且while判断语句是错误的 a=1改成a == 1，是判断语句不是赋值语句； 3. AM和PM表示的意思颠倒，AM是指上午，PM是指下午吧

user: user-2
content: int *hour,*minute; 没有分配内存  你可以写成 int hour, minute;  调用的时候用  input(&hour,&minute);  ouput(&hour,&minute);
user-0 提问: 指针指向字符串数组

回复:
user: user-1
content: char*ptr1[]={"love","you"};  一级指针本身是一个数组，内存在栈上分配，两个指针均指向常量区的字符串  char**ptr2={"love","you"};  错误用法，char**ptr2 是一个二级指针，但没有对里面的第一级指针分配内存

user: user-2
content: #include <stdio.h>  #define ROW     3 #define COL     3 int main(void) {     int i, j, num = 0;     char*ptr1[]={"love","you"};    /* 指针数组 */     char**ptr2= NULL;     int arr1[ROW][COL];     int **arr;     int (*p)[COL];     int *array;      size_t len = sizeof(ptr1) / sizeof(ptr1[0]);     for (i = 0; i < len; i++)         printf("ptr1[%d] = %s\n", i, ptr1[i]);     ptr2 = ptr1; /* 二重指针*/     for (i = 0; i < len; i++)         printf("ptr2[%d] = %s\n", i, ptr2[i]);      for (i = 0; i < len; i++)         printf("ptr2[%d] = %s\n", i, *(ptr2+i));      for (i = 0; i < ROW; i++)         for (j = 0; j < COL; j++)             arr1[i][j] = num++;      p = arr1; /* 数组指针*/     for (i = 0; i < ROW; i++) {         for (j = 0; j < COL; j++)             printf("%d ", p[i][j]);     }         putchar(10);      array = &arr1[0][0];     for (i = 0; i < ROW * COL; i++)             printf("%d ", array[i]);     putchar(10);      arr = &array;     for (i = 0; i < ROW * COL; i++)             printf("%d ", arr[0][i]);     putchar(10);      return 0; } 一个demo，验证自己的理解。

user: user-3
content: 第一个是二维数组，也就是数组中的数组，是连续的一块内存，是明确空间大小了的  第二个是指向指针的指针，但是并不能说是二维数组 只是其中一种用法，可以存储数学意义上的二位数组  int **p = new int*[10]; //分配10个int*大小的空间，存储的类型是int*指针 for(int i = 0; i < 10; i++) {     p[i] = new int[5]; //分配5个空间，然后返回给 p[i] }

user: user-4
content: char*ptr1[]={"love","you"}; 你这里的ptr1是个指针数组，这个数组有两个元素也就是两个指针，分别指向“love”和“you”  char**ptr2={"love","you"}; 这里的char**ptr2的意思是你定义了一个指针，这个指针指向指针ptr2，ptr2指向一个字符串数组，这个数组里有两个元素"love"和"you"
user-0 提问: c语言里面写入位置时发生访问冲突是怎么一回事啊？

回复:
user: user-1
content: void CompressRLE_(char* input, char* output1_letter,int* output1_times) {     int i=0, j=0, k = 0;     for (i = 0; i < strlen(input); i++)     {         //直到找到和当前字符不相等的下个字符为止           for (j = i; input[j] == input[i]; j++) 		;         /*存放重复计数*/         output1_times[k] = j - i;         /*存放重复的字符*/         output1_letter[k++] = input[i];         i = j - 1;     } } 要保持重复的字符和计数是同一个位置，即下标相同。

user: user-2
content: output1_letter刚开始为全０，在函数里面k刚开始为０，记录time后k为１，所以这里output1_letter的第０，１元素全是０，你打印当时没有输出了。  output1_times[k] = j - i;         /*存放重复的字符*/         output1_letter[k++] = input[i];

user: user-3
content: char* output1_letter,int* output1_times 两个参数都需要预先分配足够的内存空间

user: user-4
content: output1_letter[k++] = input[i];这是错误的用法； 你的output1_letter只是一个int类型的指针，不是一个指针数组；  你把函数改为void CompressRLE_(char* input, char* output1_letter[512],int* output1_times)实验一下
user-0 提问: 共用体使用的时候共用体内存地址特殊情况  求解

回复:
user: user-0
content: 引用 1 楼 Jay_Won的回复:给你举个例子： int main() {     int nTag = 10;     int *pTag = &nTag ;      printf("%p\n",&nTag );//输出：002AF744  输出的是nTag 变量的地址     printf("%p\n",pTag );//输出：002AF744  通过指针变量pTag 输出nTag 变量的地址     printf("%p\n",nTag );//输出：0000000A 输出nTag在内存中存储的值     printf("%p\n",&pTag );//输出：002AF738  指针变量pTag 本身自己的地址     printf("%d\n",*pTag );//输出：10      return 0; }  所以你输出的不是地址，而是X.i,X.d,X.c在内存中的值，之所以是0000000A是因为你把它赋值为int型的10了，你要是换成11，输出的肯定是00000000B 嗯嗯  我懂了  谢谢您

user: user-1
content: %p 需要的是一个指针（32位程序是4字节），如果你传递的参数是一个char（1字节），行为是不确定的

user: user-1
content: 你输出的是值，而不是地址

user: user-2
content: 仅供参考：#include <stdio.h> #include <stdlib.h> char buf[17]; union U {   unsigned short int aa;   struct {     unsigned int bb:7;//(bit 0-6)     unsigned int cc:6;//(bit 7-12)     unsigned int dd:3;//(bit 13-15)   }; } u; void main() {                 //bbbbbbbbbbbbbbbb                 //iiiiiiiiiiiiiiii                 //tttttttttttttttt                 //111111                 //5432109876543210                 //::::::::::::::::     u.aa=0xE07F;//1110000001111111     printf("bb==%d,cc==%d,dd==%d\n",u.bb,u.cc,u.dd);     u.bb=0x41;     u.cc=0x21;//dddccccccbbbbbbb     u.dd=5;   //1011000011000001     printf("aa==0x%04X==%016s(2)\n",u.aa,itoa(u.aa,buf,2)); } //bb==127,cc==0,dd==7 //aa==0xB0C1==1011000011000001(2)

user: user-3
content: #include<stdio.h> #include<stdlib.h>  union A {     int i;     char c;     double d; };  int main() {     union A X;     X.i=10;     printf("%p %p %p\n", &X.i, &X.d, &X.c);     printf("%d %lf %d\n", X.i, X.d, X.c);     return 0; } %p是地址输出，是需要在前面加&符，通过验证可以看出地址是相同的，因为三个联合体使用同一片内存空间，并且大小以最大元素占用的为准。 通过输出他们各自的值，也会发现c和i都是10，但是d是0.00000，这个要看一下double数据在内存中存储方式了。

user: user-4
content: 给你举个例子： int main() {     int nTag = 10;     int *pTag = &nTag ;      printf("%p\n",&nTag );//输出：002AF744  输出的是nTag 变量的地址     printf("%p\n",pTag );//输出：002AF744  通过指针变量pTag 输出nTag 变量的地址     printf("%p\n",nTag );//输出：0000000A 输出nTag在内存中存储的值     printf("%p\n",&pTag );//输出：002AF738  指针变量pTag 本身自己的地址     printf("%d\n",*pTag );//输出：10      return 0; }  所以你输出的不是地址，而是X.i,X.d,X.c在内存中的值，之所以是0000000A是因为你把它赋值为int型的10了，你要是换成11，输出的肯定是00000000B
user-0 提问: c语言 清理输入缓存的疑问？

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

user: user-0
content: 3楼，是在什么环境下认为不需要呢？我在Centos Linux的gcc下是必须的。如果不清除的话，输出完全不对头。

user: user-2
content: void main(void) {     int num;     char a,b[10],c;      scanf("%c",&a);     //scanf( "%*[^\n]%*c" );//有效清理输入缓冲，包括回车符\n,其实不需要！！！      scanf("%d",&num);     //scanf( "%*[^\n]%*c" );//有效清理输入缓冲，包括回车符\n，其实不需要！！！      scanf("%s",b);     //scanf( "%*[^\n]" );     //scanf( "%*[^\n]");//必须分开，如果用scanf( "%*[^\n]%*c" )无法清理回车\n     scanf( "%*c");    /*等同于getchar()*/      scanf("%c",&c);     printf("%c %d %s %c\n",a,num,b,c); } 前两个不需要，因为第一个输入”残留“输入缓存里的回车符不会与%d匹配的。第二个也是，第二个的回车符不会与%s匹配的。 最后一个只需scanf("%*c");即可，就能将缓存里的回车符吸收，用getchar也可以实现。第一次输入的残留数据，会在第二次输入整形数据时清除，不会带向下面的输入。第三次的输入需要考虑第二的输入缓存里的”垃圾数据“

user: user-3
content: 等一个解答，马一下

user: user-4
content: 回车键也是字符吧
user-0 提问: 求大神帮忙改错

回复:
user: user-1
content: missing ';',你可以在附近找找是不是丢失了分号

user: user-2
content: 语法错误，应该是在提示行号的上一语句缺少分号“;"

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

user: user-4
content: 提示错误那里的代码贴出来
user-0 提问: 一个简单的合并排序小程序，奇怪的是我在断点调试的时候没有点击下一步，位置变量i，j之类的变量仍然一直在变，求大神帮我看看是怎么回事

回复:
user: user-1
content: 一些下标的临界情况要考虑清楚  #include<iostream> using namespace std; template <class T> void MergeSort(T a[],int left,int right); template <class T> void Merge(T a[],T b[],int left,int middle,int right); template<class T> void Copy(T a[],T b[],int left,int right);   template<class T> void MergeSort(T a[],int left,int right) {     if(right>left+1){         int middle=(left+right)/2;         MergeSort(a,left,middle);         MergeSort(a,middle,right);         T b[right-left];         Merge(a,b,left,middle,right);         Copy(a,b,left,right);     } }   template <class T> void Merge(T a[],T b[],int left,int middle,int right) {     int k=0,i=left,j=middle;     while(i<middle&&j<right){         if(a[i]<a[j]){             b[k++]=a[i++];         }         else{             b[k++]=a[j++];         }     }     if(i<middle){         while(i<middle)         b[k++]=a[i++];     }     if(j<right){         while(j<right)         b[k++]=a[j++];     } }   template<class T> void Copy(T a[],T b[],int left,int right){     int tmp=left, i = 0;     while(tmp<right){         a[tmp]=b[i];         tmp++;         i++;     } }   int main() {     int a[]={8,7,6,5,4,3,2,1};     MergeSort(a,0,8) ;     for(int i=0;i<8;i++){         cout<<a[i]<<"  "<<endl;     } }  如有问题欢迎继续追问，没问题请及时结贴，谢谢

user: user-0
content: 引用 2 楼 zgl7903 的回复:C/C++ 数组访问 最需要注意越界的问题能麻烦您详细说说到底是哪里越界了吗，我分开用这几个函数都没问题，调试了很长时间也没有找到问题在哪里。。。

user: user-2
content: C/C++ 数组访问 最需要注意越界的问题

user: user-0
content: 木有人吗？？？大神在哪里？！

user: user-3
content: 仅供参考：#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }