Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 大神求救！sos！

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

user: user-2
content: wl[nc]在是空格，tab键或者回车符时，这是对这些字符的前一个单词做的计数。当输入多个单词，若以空格隔开，那么每次遇到空格，都判定是一个单词的结束，那么他要对该单词进行计数。 程序有问题呢，wl数组没有初始化，并且没有对每隔单词机型计数，只是将单词的总数放在wl[1]里; 我想，你应该是想输入多个单词，然后将每隔单词出现的次数放到wl数组里

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

user: user-0
content: 引用 2 楼 zhao4zhong1 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  您好，我用devC++，设置了断点，单步执行的时候，shell界面好像是卡了的样子，输入什么都不显示，隔十几分钟才能把刚才的输入显示出来，这是为什么啊？难道是因为代码太多了吗？
user-0 提问: 定义和声明的区别？

回复:
user: user-1
content: Grammar Summary This appendix describes the formal grammar of the C++ language, as implemented in the Microsoft C++ compiler. It is loosely organized around the chapter organization of this book as follows:   The Keywords section describes keywords, covered in Chapter 1, Lexical Conventions.    The Expressions section describes the syntax of expressions, described in Chapter 4, Expressions.    The Declarations section describes the syntax of declarations, described in Chapter 6, Declarations.    The Declarators section describes the syntax of declarators, covered in Chapter 7, Declarators.    The Classes section covers the syntax used in declaring classes, as covered in Chapter 8, Classes.    The Statements section covers the syntax used in writing statements, as covered in Chapter 5, Statements.    The Microsoft Extensions section covers the syntax of features unique to Microsoft C++. Many of these features are covered in Appendix B, Microsoft-Specific Modifiers.

user: user-2
content: 这么说来，声明和定义的区别是是否为这个变量分配了存储空间

user: user-2
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 1 楼 a393062456 的回复:] 没有给他赋值的是声明，给了初始值就是定义。 比如int a；这是声明 而int a=0；这就是定义了 http://blog.csdn.net/qq_21411985/article/details/44082831[/quote] 受教了

user: user-3
content: 引用 1 楼 a393062456 的回复:没有给他赋值的是声明，给了初始值就是定义。 比如int a；这是声明 而int a=0；这就是定义了 http://blog.csdn.net/qq_21411985/article/details/44082831

user: user-3
content: 对于函数： 主要是看有没有函数体，函数体是指函数的内容。 在main函数前定义的函数，也是声明，这就是定义时声明。 对于变量：请看这位朋友的博客，上面介绍的比较详细 http://blog.csdn.net/qq_21411985/article/details/44082831

user: user-2
content: 没有给他赋值的是声明，给了初始值就是定义。 比如int a；这是声明 而int a=0；这就是定义了
user-0 提问: 有哪位大神来将这个有关链表的学生管理系统补全，求帮忙

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:对于学生成绩的类型，不建议使用double类型，建议使用float类型即可，因为不需要那么高的精度，用double会浪费些资源。 我输完“1”之后的信息它是显示“链表为空。将数据插入到链表头”，请问要怎么插入？

user: user-1
content: 对于学生成绩的类型，不建议使用double类型，建议使用float类型即可，因为不需要那么高的精度，用double会浪费些资源。
user-0 提问: 为什么我的VS不可以调试显示返回值为0就跳了出来

回复:
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-2
content: #include <stdio.h>  int main(int argc,char  *argv[]) {     int n = 0, i = 0, yu[16] = {0};      printf("请输入0-32767的数字:");     scanf("%d", &n);     for(i = 0; n > 0; i++)     {         yu[i] = n % 2;         n = n / 2;     }     for (i = 15; i >= 0; i--) {         printf("%d", yu[i]);         if(i%4==0) {             printf(" ");         }     }      return 0; } 去掉第二个for循环后面的;， 改一下第一个和第二个for循环的退出条件。 建议注意一下coding style.
user-0 提问: 指针问题

回复:
user: user-1
content: *(*t->course) 是悬垂指针，根本没有有效的指向

user: user-2
content: printf ("%s,%d"*(*t->course)->cName,*(*t->course)->grade);//这出错了，执行不了。 能编译通过吗？

user: user-3

user: user-0
content: 结构体声定放在另一个头文件里的，不方便在这里写上，应该怎么改呢

user: user-4
content: 应该是没有申请到有效的内存空间； 建议你修改一下代码风格，这样大家读起来不会太费劲。 很少看到有人把结构体声定放在main函数里，建议改掉这样的“陋习”。
user-0 提问: calloc函数的使用

回复:
user: user-1
content: 第一个问题，结构体可以直接赋值，即t[k] = b[j]；也可以分别赋值，但是对于字符数组num的赋值不能直接t[k].num = b[j].num; 需要借助字符串函数strncpy，既然结构体可以直接赋值，所以不用将结构体里的成员一一拷贝； 第二个问题，t[0],t[1]是可以，因为数组和指针可以互相用。即t[0] == *(t+0), t[1]就是*(t+1); 结构体你直接看成普通类型变量的操作即可，很多操作都是相近的，赋值，指针运用，数组运用。

user: user-2
content: t[k].num=b[j].num; 只是赋值num成员  t[k]=b[j] 是赋值整个对象  t[n] 等价于 *(t+n)
user-0 提问: 关于getchar();getchar();

回复:
user: user-0
content: 引用 1 楼 cfjtaishan 的回复:getchar()是等待用户输入一个字符，若不输入则程序不进行下面的执行； 之所以用两个getchar()，有可能因为上面还有输入的操作，第一个getchar()接收上次输入残留在输入缓存区里的回车符。第二个getchar()是需要输入一个字符（任意字符）才能继续进行。 刚才蠢了 没注意到程序上面还有操作 是接回车。。。谢谢

user: user-1
content: getchar()是等待用户输入一个字符，若不输入则程序不进行下面的执行； 之所以用两个getchar()，有可能因为上面还有输入的操作，第一个getchar()接收上次输入残留在输入缓存区里的回车符。第二个getchar()是需要输入一个字符（任意字符）才能继续进行。
user-0 提问: 在绝对地址0xXXXXXXXX上写入字符’a’的语句是？

回复:
user: user-1
content: Windows下没准还得参考WinIO.sys

user: user-1
content: 引用 4 楼 zhang_datong 的回复:这个逻辑我知道是啥意思，只是这个地址0Xf000ff00怎么出现的，题目也没有说啊 随便举个数字而已，我猜。 实际使用时，可以是比如0xB0000000、0xB8000000、0xA0000000、……，具体请参考相关BIOS、显卡、视频采集卡、……的相关手册。

user: user-0
content: 这个逻辑我知道是啥意思，只是这个地址0Xf000ff00怎么出现的，题目也没有说啊

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-1
content: ((unsigned char *)0xF000FF00)[0]='a';//这样写是不是更好理解呢？

user: user-2
content: 前一个是给指针赋值一个内存地址，然后将'a'字符放到这个内存地址中。 类似这样的， unsigned char ch; unsigned char *p = &ch;    /*类似是unsigned char *p = (unsigned char *)0xF000FF00; */ *p = 'a';
user-0 提问: c文件操作中的问题

回复:
user: user-1
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-2
content: 实际上也只读到了一个5，原因是t的值保存的上次读到的5，这次没读成功。你可以通过一下方式验证一下我的推测： #include<stdio.h> #include<stdlib.h>  int main() {     int a[5] = {1,2,3,4,5};     int i = 0, t, ret;     FILE *fp;      fp=fopen("c.txt","rb+");     if(!fp) {         printf("ERROR");         exit (0);     }     fwrite(&a[0], 4, 1, fp);     for (i = 1; i < 5; i++) {         fseek(fp, 0l, SEEK_SET);         fwrite(&a[i], 4, 1, fp);      }     fseek(fp, 0l, SEEK_SET);     while(!feof(fp)){         ret = fread(&t,4,1,fp);         printf("ret = %d, %d\t", ret, t);         t = 0;     }     fclose(fp);     return 0;  } 原因出在feof,参考一下这个文章： http://blog.csdn.net/qq_29350001/article/details/53100563

user: user-0
content: 引用 1 楼 自信男孩的回复:实际上也只读到了一个5，原因是t的值保存的上次读到的5，这次没读成功。你可以通过一下方式验证一下我的推测： #include<stdio.h> #include<stdlib.h>  int main() {     int a[5] = {1,2,3,4,5};     int i = 0, t, ret;     FILE *fp;      fp=fopen("c.txt","rb+");     if(!fp) {         printf("ERROR");         exit (0);     }     fwrite(&a[0], 4, 1, fp);     for (i = 1; i < 5; i++) {         fseek(fp, 0l, SEEK_SET);         fwrite(&a[i], 4, 1, fp);      }     fseek(fp, 0l, SEEK_SET);     while(!feof(fp)){         ret = fread(&t,4,1,fp);         printf("ret = %d, %d\t", ret, t);         t = 0;     }     fclose(fp);     return 0;  } 原因出在feof,参考一下这个文章： http://blog.csdn.net/qq_29350001/article/details/53100563 蟹蟹 很有用 我觉得书上的答案解析是错了 他说把数组的内容倒序保存在文件里 结果我后来用循环输出文件内容也没有啊？求解答

user: user-0
content: 引用 2 楼 赵4老师的回复:不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。  蟹蟹指导 知道问题在哪了
user-0 提问: 求大神帮助解决一下关于==和！=在代码中顺序的问题

回复:
user: user-1
content: not(A and B) 等价于 (not A) or (not B)  not(A or B) 等价于 (not A) and (not B)  这是什么定律来着？

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:#include <stdio.h>   int main() {     int c,lastc;     while ((c=getchar()) != EOF) {         if (c != ' '||c != '\t'){             putchar(c);         }         if(c == ' '|| c == '\t') {             putchar('\n');         }     }     return 0; } 因为if else是相反的。if的条件相反就是c == ' ' & c == '\t' 所以把else去掉就可以了。 上面的那个可以正常断开单词，道理是一样的。if else是两个相反的  谢谢啦

user: user-2
content: if (c != ' '||c != '\t') 这逻辑是什么鬼？这不相当于写了个 if (true)

user: user-3
content: #include <stdio.h>   int main() {     int c,lastc;     while ((c=getchar()) != EOF) {         if (c != ' '||c != '\t'){             putchar(c);         }         if(c == ' '|| c == '\t') {             putchar('\n');         }     }     return 0; } 因为if else是相反的。if的条件相反就是c == ' ' & c == '\t' 所以把else去掉就可以了。 上面的那个可以正常断开单词，道理是一样的。if else是两个相反的
user-0 提问: 求助C代码改错 

回复:
user: user-1
content: 应该是你把   static const char *months[] 定义在函数里面了，放到函数外面全局就可以用了。

user: user-0
content: 感谢回复   我改了一下translateForm 发现 temp->month=months[m]; 不能用诶 请问是怎么回事 应该怎么调用const char 好一些

user: user-1
content: static int cmp_dates(const void*a, const void*b) {     time first = *(time *)a;     time second = *(time *)b;  结构可以这样初始化吗？既然用到指针，就用指针吧，     time *first = (time *)a;     time *second = (time *)b; 以后用first->year..等来访问

user: user-1
content: translateForm可以这么写吧：  static time *translateForm(int y,int m,int d) {     time *temp = malloc(1*sizeof(time));     temp->month=months[m];     temp->year=y;     temp->day=d;     return temp; }

user: user-1
content: typedef struct {     char *month;     int day;     int year; }time;   一点小建议： 1、 结构名最好用time以外的名字，比如time_struct，系统里面有time.h。避免混淆，当然可能没有问题。 2、month也用int吧。既然你定义了char *months[]的静态数据，需要用到月份字符串时，用months[timeInstance.month]即可，尽量避免用指针，尽快指针看起来很酷。 3、orig_month函数里面exit退出程序不是好用法。return一个0或者负数都可以。调用程序判断返回值吧。
user-0 提问: for循环遍历条件大于数组长度

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

user: user-0
content: 那么用 while(*p) {    p++; } 这种方式也不会只正确遍历数组元素?

user: user-2
content: C语言是不处理的，要输出几个就输出几个，越界输出，越界的内存里有什么就输出什么。如果越界之后的内存是不可以访问的，那么就是报段错误。 所以，越界需要自己判定，编译器是不会告知的，因为运行时内存的情况编译器预判不了（是否越界之后的内存是否可读可写是不可知的）

user: user-3
content: 只有6个数据 ，你为什么要小于10？不直接<6呢？我是新手不知道叫什么机制。 只知道，c++里面未赋值的指针会是各种奇怪数据,,所以不要未赋值就使用它.
user-0 提问: 如何初始化结构体数组（内嵌结构体）

回复:
user: user-1
content: typedef struct _bag{ 	int playerId; 	int count; 	int max; 	Prop props[8]; }Bag;  typedef struct _player{ 	int id; 	char name[50]; 	char pass[50] ;	 	double gold; 	Bag bag;  //嵌套上一个结构体 	double sysee; }Player;   Player playerArray[] = {  	[0] = {  		.id = 1,  		.name = "张三",  		.pass = "123456",  		.gold = 50000,  		.bag = {  			.max = 8  		},  		.sysee = 1  	},  	{2,"李四","123456",15000,{0,0,8},2},  	{3,"王五","123456",25000,{.max=8},3},  	{4,"星河","123456",50000,0,0,8,} };

user: user-2
content: typedef struct _bag{ int playerId; int count; int max; //Prop props[8]; }Bag;  typedef struct _player{     int id;     char name[50];     char pass[50];	     double gold;     Bag bag;     double sysee; }Player;  Player playerArray[] = {     {1, "张三", "123456", 50000, {0, 0, .max = 8}, 0},     {2, "李四", "123456", 15000, {0, 0, .max = 8}, 0},     {3, "王五", "123456", 25000, {0}, 0},     {4, "星河", "123456", 50000, 0, 0} }; 试试这种形式

user: user-3
content: 上面写错了，应该是 {2,"李四","123456",15000,0,.bag={.max=8,}},//这样也应该可以的。  你不妨试试

user: user-3
content: 二楼是对的，结构体初始化和数组初始化是用{}，如果嵌套还是用{ ,,,{}}....多层，不想初始化的变量可以空着。还有一种方法是用小数点: {2,"李四","123456",15000,0,{Bag bag.max=8}},//这样也报错 改成 {2,"李四","123456",15000,0,{.max=8,}},//这样也报错

user: user-4
content: {2,"李四","123456",15000,0,{5, 3, 8, "HAHA"}} 这样子呢？
user-0 提问: c语言大神们求助

回复:
user: user-1
content: 浮点数是不精确的保存的

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

user: user-3
content: 引用 2 楼 qq_37873843 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 建议看一下浮点数的表示。它是分为小数部分和整数部分，每部分的占32位里的位数。 不懂。。。可以详细解释一下吗[/quote]http://blog.chinaunix.net/uid-26983295-id-3279324.html 看一下这个链接里解释的～

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:建议看一下浮点数的表示。它是分为小数部分和整数部分，每部分的占32位里的位数。 不懂。。。可以详细解释一下吗

user: user-3
content: 建议看一下浮点数的表示。它是分为小数部分和整数部分，每部分的占32位里的位数。
user-0 提问: 二维数组里的指针

回复:
user: user-1
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-2
content: a是一个二维数组，并且a 的列数是5； *(*(p+i)+j)=data++; /*equal: *(p[i]+j) = data++;*/ p[i]是指第i行的首地址。 通过下面的一行输出可以查看一下，三个地址值之间是否相差：5 * sizeof(int)个字节
user-0 提问: 一个小问题

回复:
user: user-1
content: 查MSDN是Windows程序员必须掌握的技能之一。    Preprocessor Directives Preprocessor directives, such as #define and #ifdef, are typically used to make source programs easy to change and easy to compile in different execution environments. Directives in the source file tell the preprocessor to perform specific actions. For example, the preprocessor can replace tokens in the text, insert the contents of other files into the source file, or suppress compilation of part of the file by removing sections of text. Preprocessor lines are recognized and carried out before macro expansion. Therefore, if a macro expands into something that looks like a preprocessor command, that command is not recognized by the preprocessor.  Preprocessor statements use the same character set as source file statements, with the exception that escape sequences are not supported. The character set used in preprocessor statements is the same as the execution character set. The preprocessor also recognizes negative character values.   The preprocessor recognizes the following directives:  #define #error #import #undef  #elif #if #include    #else #ifdef #line    #endif #ifndef #pragma      The number sign (#) must be the first nonwhite-space character on the line containing the directive; white-space characters can appear between the number sign and the first letter of the directive. Some directives include arguments or values. Any text that follows a directive (except an argument or value that is part of the directive) must be preceded by the single-line comment delimiter (//) or enclosed in comment delimiters (/*  */). Lines containing preprocessor directives can be continued by immediately preceding the end-of-line marker with a backslash (\).  Preprocessor directives can appear anywhere in a source file, but they apply only to the remainder of the source file.

user: user-2
content: 算！百度下你就了解了

user: user-3
content: 宏定义是指以#define，#ifdef ... #else ...#endif等等这样的;  #include不算是吧。
user-0 提问: 求解，看不出来错误

回复:
user: user-1
content: 第一个是输出，scanf换成printf; 最后printf("..... ",n);

user: user-2
content: 第一个scanf换成printf

user: user-3
content: 额，说错了，前面那句应该改成printf，把n的定义移动到它前面

user: user-3
content: 把n的定义移到scanf那句上面试试，c语言必须把定义放到语句块儿最前面

user: user-4
content: 1:行4 scanf换为printf，这才是打印  2:行7 8 9 a += b+= c+=全部换成 n +=  3:行8  * 6 改为 *8  4:最后一行 把右引号（“）提到逗号前面  等错误
user-0 提问:  谁能通俗一点说一下C语言！小白一个。新人报到！

回复:
user: user-1
content: 引用 3 楼 qq_37871430 的回复:什么是二级视频.. 二级视频就是C语言二级的视频啊，http://www.51zxw.net/list.aspx?cid=329

user: user-0
content: 那以后拜托各位大神提携小弟一下  小弟会努力学习的，书本这两天就到。希望我能成功！

user: user-2
content: 看着本书，建议将书上的程序都编译，测试一遍，并将后面的作业题都保质保量的完成；这样完全的看一本书，也差不多了。 但是遇到问题，要多上网查，多问问身边的老师或者同学。 多动手，多思考，多总结～

user: user-0
content: 什么是二级视频..

user: user-1
content: 如果没有任何基础，看看二级视频还是可以考虑一下的，入门嘛，最好走正道

user: user-3
content: 把书上的例子程序敲进去，调通。就行了。
user-0 提问: 【C】关于二维数组的指针

回复:
user: user-1

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

user: user-0
content: 谢谢大家不知道怎么回复各位，是因为没有回复对方的机制么

user: user-3
content: float (*z)[MONTHS];  z = rain;

user: user-3
content: int (*z)[MONTHS];  z = rain; 这样是可以的。你要定义数组指针，而不是指针数组。

user: user-4
content: 怎么一直乱码。。。 *(z)[MONTHS]--->(*z)[MONTHS]//指针数组与数组指针的区别

user: user-4
content: *(z)[MONTHS]--->(<span style="color: #FF0000;">*</span>z)[MONTHS]//指针数组与数组指针的区别

user: user-4
content: *(z)[MONTHS]--->(*z)[MONTHS]//指针数组与数组指针的区别
user-0 提问: 计算快乐值我不知哪里错了，求大神们教？

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h>  #define MAXPOW 1999  int gethappy[55]; int losepow[55]; int dp[55][MAXPOW];  int main(void) {     int i, j;     int n;      scanf("%d",&n);      for (i = 0; i < n; i++)         scanf("%d", &gethappy[i]);     for (i = 0; i < n; i++)         scanf("%d", &losepow[i]);      for (j = 0; j < MAXPOW; j++)         dp[0][j] = losepow[0] <= j ? gethappy[0] : 0;      for (i = 1; i < n; i++) {         for (j = 0; j < MAXPOW; j++) {             if (losepow[i]>j) {                 dp[i][j] = dp[i-1][j];             } else {                 if (dp[i-1][j]>dp[i-1][j-losepow[i]]+gethappy[i])                     dp[i][j] = dp[i-1][j];                 else                     dp[i][j] = dp[i-1][j-losepow[i]] + gethappy[i];             }         }     }     printf("%d", dp[n-1][MAXPOW-1]+1);      return 0; } 参考一下这个吧。 http://blog.csdn.net/timpcfan/article/details/52966493

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 qq_36338022 的回复:] 我的程序能正常运行，但是就是过不了题目 我用测试用例测试的，没有问题，能够输出77; 你说的过不了题目是什么题目？[/quote] 样例测的没错，但是换组数据就不符合题目要求了 例如： 输入 4 15 60 70 40 500 400 1500 500 正确的输出结果是 131 但是这个程序输出的是 116 我想问怎样修改才能正确，符合上面的题目要求。

user: user-1
content: 引用 2 楼 qq_36338022 的回复:我的程序能正常运行，但是就是过不了题目 我用测试用例测试的，没有问题，能够输出77; 你说的过不了题目是什么题目？

user: user-0
content: 我的程序能正常运行，但是就是过不了题目

user: user-1
content: #include <stdio.h>  #define     MAX_SIZE    32  int main() {     int n, i, e = 2000, h =1,j,m;     int happy[MAX_SIZE],low[MAX_SIZE];     double a[MAX_SIZE], t;      scanf("%d",&n);      for(i=0;i<n;i++)     {         scanf("%d",&happy[i]);     }      for(i=0;i<n;i++)     {         scanf("%d",&low[i]);     }     for(i=0;i<n;i++)     {         a[i]=happy[i]/low[i];      }     for(i=0;i<n-1;i++)     {         for(j=0;j<n-i-1;j++)         {             if(a[j] > a[j+1])             {                 t=a[j];a[j]=a[j+1];a[j+1]=t;                 m=low[j];low[j]=low[j+1];low[j+1]=m;                 m=happy[j];happy[j]=happy[j+1];happy[j+1]=m;             }         }     }     for(i=n-1;i>=0;i--)     {         h=happy[i]+h;         e=e-low[i];         if(e<0) {             e=e+low[i];             h=h-happy[i];         }     }     printf("%d\n", h);      return 0;  }  测试了你的程序，能够正常输出。提示的是什么问题？ 建议：在C语言中不支持可变数组，建议申请固定数组长度；也要注意下coding  style.
user-0 提问: printf的本质是什么？

回复:
user: user-1
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt  C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\output.c  源码面前，了无秘密。

user: user-2
content: 我觉得他就是一个格式化的输出吧，可以利用格式控制符输出字符%c，数字%d，字符串%s等,而且还能控制宽度，位数。格式化是他区别于其他输出字符的主要区别。

user: user-3
content: 建议看一下printf的实现，并不是简单的转成字符串；这部分是可变参数实现的。

user: user-4
content: printf的本质是啥，不同层次的程序员是有不同理解的，楼主的理解也是一种不错的解释

user: user-5
content: 格式化字符串，当然要考虑类型，它只对内置类型，字符串和指针进行有效的格式化
user-0 提问: 帮我看下这个程序哪里出错了 

回复:
user: user-1
content: 引用 1 楼 cfjtaishan 的回复:#include<stdio.h>  #define CHARS 10 #define ROWS 6  int main(void) {     int row;     char ch = 0;      for (row = 0; row < (ch + ROWS); row++)   /*ch未初始化*/     {         for (ch = 'A'; ch < ('A' + CHARS); ch++)    /*for循环里是分号;,此行末尾的分号去掉*/         printf("%c", ch);         printf("\n");     }     return 0; } 这活不细心的人 十个也顶不上一个细心的人.....有时候 一个x==1,写成x=1，能查一下午...

user: user-0

user: user-2
content: #include<stdio.h>  #define CHARS 10 #define ROWS 6  int main(void) {     int row;     char ch = 0;      for (row = 0; row < (ch + ROWS); row++)   /*ch未初始化*/     {         for (ch = 'A'; ch < ('A' + CHARS); ch++)    /*for循环里是分号;,此行末尾的分号去掉*/         printf("%c", ch);         printf("\n");     }     return 0; }

user: user-3
content: for (ch = 'A', ch < ('A' + CHARS); ch++);  改成：  for (ch = 'A'; ch < ('A' + CHARS); ch++);  其次，你的ch没有初始化就使用了

user: user-4
content: 一个ch未初始化，一个for()循环少一个分号。
user-0 提问: 一个小问题

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

user: user-2
content: 字符串中显示小数点？ 要是读取数据的话，内存存储都是一样的只是看如何读取。

user: user-3
content: 你想怎么判断 在纸上直接看能看出来 有小数点， 程序的话abs(f - (int)f）看看是否是零

user: user-4
content: 因为在内存中都是0101存储的，不分是什么类型的。

user: user-4
content: 这种需求很少遇到吧，一般都是确定其类型（基本类型），然后从该变量中获取值； 比如，知道浮点型数据a,得到其整数部分的值或者小数部分的值等等，很少遇到你这样的需求。

user: user-5
content: if（(int)a == a)

user: user-6
content: 不就是小数点的区别啊，做判断啊，再判断所有字符是否0到9

user: user-7
content: 一个字符串？  1： 有小数点 有 e字符 的是浮点数，这个判断主要是明面上的  2：这个判断方法主要是内存值方面的，假设不把诸如 1.0000 当做浮点数的情况 char str[16];//你的字符串 double f = atof(str); // 减去整数部分，看小数后面的数是不是在某个范围内来判断是不是整数 bool bInt = abs(f - (int)f) < 1e-6;  //bool bInt = abs(f - (int)f) < 1e-10
user-0 提问: 为什么第二个malloc执行时会错啊

回复:
user: user-1
content: transcript->course没有初始化，是NULL;  *transcript->course = (Course*)malloc(sizeof (Course));//就这没法执行  相当于： *NULL=  (Course*)malloc(sizeof (Course));  你需要先分配transcript->course;

user: user-2
content: 你那个类型不对的，课程用二级指针是说明有很多课程吗？如果是要这么写  transcript->course = (Course**)malloc(sizeof (Course)*numOfCourse);//就这没法执行  for(int i=0; i<numOfCourse; i++){ (transcript->course)[i] = (Course*)malloc(sizeof (Course)); }
user-0 提问: 一道作业题，帮忙看看哪里错了

回复:
user: user-0
content: 多谢多谢啦~长知识了，现在运行没问题了。

user: user-1
content: 我刚刚试了一下，好像scanf直接赋值给a也可以，两种写法结果竟然一样。

user: user-1
content: 问题1： scanf函数接受的是变量的地址，而不是变量。 你要把字符串赋值给字符数组，而不是把字符串中的字符赋给a中的元素，字符串本身是个指针，数组名其实也是个指针，所以是把指针的值赋给另外一个指针变量，所以应该是scanf("%s",&a);  问题2： 为什么while语句和大括号之间要加分号呢？  问题3： i的取值应该是从0开始吧，a[0]表示的才是第一个元素。

user: user-2
content: while(a[i]!='\0'); 后面多了一个分号  后面的那个while 也是  把分号去掉就可以了，否则你的while的循环部分是个空语句
user-0 提问: 两个小问题

回复:
user: user-1
content: 引用 2 楼 user-3 的回复:[quote=引用 1 楼 自信男孩的回复:]fun(x+y,(e1,e2),fun(xy,d,(a,b))); 参数是3个，不过挺诡异，因为函数调用中用本函数调用的返回值作为实参。 参数传递都是值传递，不过会有人迟疑，那么传递地址呢，其实也是值传递，因为这个值是地址值； 这么说后面的fun函数也是实参。[/quote] 是fun函数的返回值

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:fun(x+y,(e1,e2),fun(xy,d,(a,b))); 参数是3个，不过挺诡异，因为函数调用中用本函数调用的返回值作为实参。 参数传递都是值传递，不过会有人迟疑，那么传递地址呢，其实也是值传递，因为这个值是地址值； 为什么被调函数里的参数fun()里边的xy,d,(a,b)不算是参数呢，他们也是参数，只是不算是调用函数的参数而已呀。 这个个数计算为什么不算里边的那个函数的参数。

user: user-2
content: fun(x+y,(e1,e2),fun(xy,d,(a,b)));

user: user-3
content: 引用 1 楼 自信男孩的回复:fun(x+y,(e1,e2),fun(xy,d,(a,b))); 参数是3个，不过挺诡异，因为函数调用中用本函数调用的返回值作为实参。 参数传递都是值传递，不过会有人迟疑，那么传递地址呢，其实也是值传递，因为这个值是地址值； 这么说后面的fun函数也是实参。

user: user-1
content: fun(x+y,(e1,e2),fun(xy,d,(a,b))); 参数是3个，不过挺诡异，因为函数调用中用本函数调用的返回值作为实参。 参数传递都是值传递，不过会有人迟疑，那么传递地址呢，其实也是值传递，因为这个值是地址值；
user-0 提问: VS2015 基础问题  strcpy编译报错

回复:
user: user-1
content: #pragma warning(disable:4996) ……

user: user-2
content: 因为这个函数是不安全，可能造成缓冲区溢出，所以现在建议用strcpy_s来代替 如果仍想用可以选择以下任何一种方法： 1、新建项目时不要勾选安全开发生命周期检查 2、在项目属性C/C++命令行中加上 /D _CRT_SECURE_NO_WARNINGS

user: user-3
content: 我是按照Linux的函数来解释的，你可以按照windows的函数去处理。比如strcpy_s

user: user-3
content: 程序没问题，但是编译器提出了2点：gets的使用和strcpy的使用； gets的使用不安全，fgets的使用相对gets的使用是安全的，为什么呢，char *fgets(char *s, int size, FILE *stream); 主要在fgets的第二个参数上，它定义了缓存接收多少个字节；输入多了，没关系，它只将输入的size个字节放到缓存里，其他丢掉；gets不会，它是你输入多少个，它就往缓存里放多少个，越不越界它不管。 strcpy一样，如果str1的缓存如果小于str2字符串的长度，strcpy也不管，它只负责将str2的所有字符拷贝至str1中。 strncpy不一样，char *strncpy(char *dest, const char *src, size_t n);它有第三个参数，这个参数用来限制拷贝多少个至dest，如果dest只有30个字节的空间，第三个参数输入30，那么即使src有50个字符也没关系，只要29+1个，其他丢掉。  另外，注意fgets的输入可能会将回车符算作有效字符放到缓存里。

user: user-0
content: 新手小白  求教   具体步骤
user-0 提问: 关于外部文件中结构体内嵌后外部声明报错，及二级指针问题

回复:
user: user-1
content: int main() {         /*struct*/ mysql_pool mysql; //你定义变量不需要再用struct描述了         return 0; }  问题二： 我在test.h文件中使用了mysqlclient库的api  所以要用到msyql的头文件 为什么不能把头文件写在test.c中  而在test.c(test.h?)中加入的头文件可以直接在main.c中使用  你在main #include "test.h“了，那么main中也包含了test.h中包含的头文件 test.c作为一个编译单元，对main是不可见的

user: user-2
content: 问题1：需要你把定义的头文件test.h加到需要用到这两个结构体的源文件里； 问题2：应该是可以用的，在main.c中建议也引入api的头文件（如果在main.c中有用到api的函数接口）；  另外，test.h的头文件里#ifndef _MYSQL_H_ #define _MYSQL_H_ 这两行不好和mysql.h里的一样。避免出错，建议头文件名是什么，头文件里的避免重复包含的这两句宏也是用头文件的名字。 比如test.h头文件，建议宏是这样定义： #ifndef _TEST_H_ #define _TEST_H_ ... #endif
user-0 提问: 大神帮忙看看，主要问题错在什么地方

回复:
user: user-0
content: 谢谢！

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  void game(); int main(void) {     game();     return 0; }  void game() {      system("cls");     int gamer;  // 玩家出拳     int computer;  // 电脑出拳     int result;  // 比赛结果     int i = 1;      // 为了避免玩一次游戏就退出程序，可以将代码放在循环中     while (i){         printf("1:剪刀\n2:石头\n3:布\n0:不玩了\n");         printf("请输入你要出的拳头：\n");         scanf("%d", &gamer);         switch (gamer) {             case 1:                 gamer = 4;                 break;             case 2:                 gamer = 7;                 break;             case 3:                 gamer = 10;                 break;             case 0:                 {                     system("cls");                     //menu();                 }                 break;         }         srand((unsigned)time(NULL));  // 随机数种子         computer = rand() % 3;  // 产生随机数并取余，得到电脑出拳         result = gamer + computer;  // gamer 为 char 类型，数学运算时要强制转换类型          printf("电脑出了: ");         switch (computer)         {             case 0:printf("剪刀\n");break; //4    1             case 1:printf("石头\n");break; //7  2             case 2:printf("布\n");break;   //10 3         }         printf("你出了");         switch (gamer)         {             case 4:                 printf("剪刀\n");                 break;             case 7:                 printf("石头\n");                 break;             case 10:                 printf("布\n");                 break;         }         if (result == 6||result == 7||result == 11)             printf("你赢了!\n");         else if (result == 5 || result == 9 || result == 10)             printf("电脑赢了!\n");         else             printf("平手\n");         system("pause>nul&&cls");  // 暂停并清屏     } } 代码里i 没有初始化，其他没什么问题；除非赋值gamer为0，否则不会进入switch中case 0里的
user-0 提问: 九度oj 1100 一直wa，实在找不出错在哪，求大神指教（dijkstra算法）

回复:
user: user-1
content: 百度搜相关关键字。

user: user-0
content: 自己顶，求不沉

user: user-0
content: 好的，我再发一个

user: user-2
content: 建议： 1. 将代码细分，可以根据功能分成不同函数处理。把所有的操作写在一起，容易分不清逻辑； 2. 建议放到C++专栏里
user-0 提问: 用迭代法算x的n次方的代码

回复:
user: user-1
content: http://www.codeproject.com/Articles/418776/How-to-replace-recursive-functions-using-stack-and

user: user-2
content: #include <stdio.h>  int power(int x, int n) {   int i;   int result = 1;   if(n < 0){   	printf("指数必须大于0！\n");     return -1;   }   for(i=0; i<n; i++){   	result *= x;   }   return result;   } int main() {   printf("%d\n", power(2,3)); 	return 0; }

user: user-3
content: #include <stdio.h>  unsigned int get_power(int num, int n);  int main(void) {     int num, index;     printf("Please input two numbers: ");     scanf("%d%d", &num, &index);      printf("%d ^ %d = %u\n", num, index, get_power(num, index));      return 0; }  unsigned int get_power(int num, int n) {     int i;     unsigned int power = 1;      for (i = 0; i < n; i++) {         power *= num;     }      return power; }

user: user-4
content: http://blog.csdn.net/liuqiyao_01/article/details/8478402
user-0 提问: 单链表的实现中出现error: expected ';', ',' or ')' before '&' token的错误

回复:
user: user-0
content: 引用 2 楼 cfjtaishan 的回复:注意你的coding style. 谢谢！

user: user-1
content: 注意你的coding style.

user: user-1
content: 出现这样的错误，原因是C语言里不支持引用，这是C++才会有的语法功能；建议是用*； 你的代码除了这些error，以外，还有很多。建议你自己一一修改了。以下是改过的： #include <stdio.h> #include <stdlib.h>  typedef int ElemType;  typedef struct LNode{     ElemType data;//数据域     struct LNode *next; //指针域 }LNode, *LinkList;  //初始化线性表 void Init_LinkList(LinkList *L) {     *L = (LinkList)malloc(sizeof(LNode));     (*L)->next = NULL; }  //取元素 int GetElem_LinkList(LinkList *L, int i, ElemType *e) {     int j;     LinkList p;      //L是带头结点的链表的头指针，以e返回第i个元素     p = (*L)->next;//p指向第一个节点     j = 1;//j为记数量     while (p && j < 1) {//顺时针向后查找,直到p指向第i个元素         p = p->next;         ++j;     }     if(!p||j>i){//如果p不存在         return 0;     }     else{         *e = p->data;         return 1;     } }  //插入数组元素 int Insert_LinkList(LinkList *L, int i, ElemType e) {     int j;     LinkList p, s;      p = (*L)->next;     j = 0;     while (p && j < i-1) {         p = p->next;         ++j;     }     if (!p || j > i-1){//插入位置非法         return 0;     } else {         s=(LinkList)malloc(sizeof(LNode));         s->data = e;         s->next = p->next;         p->next = s;          return 1;     } }  //删除元素 int Delete_LinkList(LinkList *L, int i, ElemType *e) {     int j;     LinkList p, q;      p = (*L)->next;     j = 1;     while (p && j < i - 1) {         p = p->next;         ++j;     }     if (!p || j > i - 1) {         return 0;     } else {         q=p->next;         p->next = q->next;         *e = q->data;         free(q);         return 1;     } } //建立线性表 //头插法： void CreatLinkList(LinkList *L, int n) {     int i;     LinkList p;      L=(LinkList *)malloc(sizeof(LinkList));     //创建头结点     (*L)->next=NULL;     for(i = n; i > 0; i--) {         p = (LinkList)malloc(sizeof(LNode));         scanf("%d", &p->data);         p->next = (*L)->next;         (*L)->next = p;     } }  //线性表的合并 void Merge_L(LinkList La, LinkList Lb, LinkList *Lc) {     LinkList pa, pb, pc;      //按值排序的单链表La,Lb,归并为Lc后也按值排序     pa = La->next;     pb = Lb->next;     *Lc = pc = La;//初始化      while (pa&&pb) {//将pa,pa结点按大小依次插入c中         if(pa->data <= pb->data){             pc->next = pa;             pc = pa;             pa = pa->next;         }else{             pc->next = pb;             pc = pb;             pb = pb->next;         }         pc -> next =pa?pa:pb;//插入剩余值         free(Lb);     } }
user-0 提问: 利用getchar()实现输入多个字符串

回复:
user: user-1
content: 可以最多输入n个字符串，while循环读入字符串，for循环控制读入字符串的个数。 while()每次读入到‘\n’时就会结束一个字符串的读入，进而i++； for()循环一直到i=n时不满足i<n，结束循环。

user: user-2
content: 循环而已，每次输入一个字符，然后换个位置，继续输入

user: user-3
content: 首先n标识for循环可以执行几次，每一次都是将字符放在字符数组a[i]中，每次回车后，退出while的循环，并且对此次的输入结尾加上字符串结束标记'\0'

user: user-4
content: for (int i = 0; i<n; i++) {         j = 0;  //输入一行，回车键。这个是一行的结束标志，把前面的字符存入一个数组中，结束内循环 //继续读取下一行的字符         while ((c = getchar()) != '\n') {             a[i][j++] = c;         }         a[i][j] = '\0';     }
user-0 提问: do-while循环的问题

回复:
user: user-0
content: 引用 3 楼 qq_18888869 的回复:不会是死循环，每次除以10都会减少一位，直到为零。  谢谢您

user: user-0
content: 引用 4 楼 paschen 的回复:这是整数除法，不是浮点数除法，如9/10就等于0  谢谢您

user: user-0
content: 引用 1 楼 jianwen0529 的回复:n是整数呀，跟字符串有啥关系  n = n / 10 int 除以 int 最后还是int，结果是整数  11 / 10 = 1; // 两个整形数相除结果取整 10 / 10 = 1; 9 / 10 = 0; // 两个整形数相除结果取整  谢谢您

user: user-1
content: 这是整数除法，不是浮点数除法，如9/10就等于0

user: user-2
content: 不会是死循环，每次除以10都会减少一位，直到为零。

user: user-3
content: 不会死循环，因为每次n对10除之后，会把商赋值给n。比如101，101 /10， n = 10, 下次，n = 1,在下次，n = 0退出循环

user: user-4
content: n是整数呀，跟字符串有啥关系  n = n / 10 int 除以 int 最后还是int，结果是整数  11 / 10 = 1; // 两个整形数相除结果取整 10 / 10 = 1; 9 / 10 = 0; // 两个整形数相除结果取整
user-0 提问: 关于shell排序算法的一些不懂的地方求大神讲解

回复:
user: user-1
content: 各种排序算法动画演示http://www.webhek.com/misc/comparison-sort/

user: user-0
content: 引用 3 楼 qq_34574208 的回复:你先去看看什么是树，什么是堆 void shellsort(int v[],int n) 这个数组实际上是实现了一棵树，你先去看看吧，现在讲了也没用。 谢谢

user: user-2
content: 你先去看看什么是树，什么是堆 void shellsort(int v[],int n) 这个数组实际上是实现了一棵树，你先去看看吧，现在讲了也没用。

user: user-0
content: 引用 1 楼 user-3 的回复:http://baike.baidu.com/link?url=vMyMF52wGGd9wanrBQkXSM3tIhrOEteDEys_rvHqHUwpj3PuwDsls3eC_eO6QagJd-sNE-fv2VQoMSWP7WWAkeEB3nrzWvNMugV_TJpxFGO  大神，百度百科如果能给我解决，我就不会来这里问了，不知道具体是怎么实现这一过程是我的困惑

user: user-3
content: http://baike.baidu.com/link?url=vMyMF52wGGd9wanrBQkXSM3tIhrOEteDEys_rvHqHUwpj3PuwDsls3eC_eO6QagJd-sNE-fv2VQoMSWP7WWAkeEB3nrzWvNMugV_TJpxFGO
user-0 提问: 只有我觉得数据结构与算法分析c语言描述翻译的很烂吗

回复:
user: user-1
content: 百度搜相关关键字。

user: user-2
content: 宏定义替换，这什么兼容？

user: user-0
content: 你说的这个我知道，但是不清楚这和兼容性有什么关系

user: user-3
content: 宏定义，等价替换~

user: user-3
content: 引用 2 楼 m0_37590480 的回复:你说的这个我知道，但是不清楚这和兼容性有什么关系 宏定义可以提高兼容性，比如在嵌入式开发中，不同的平台CPU的位数可能不同，那么相同int类型，指针表示的值的范围和内存地址长度也不一样；通过宏定义可以做到兼容；即不同的平台使用宏去匹配。
user-0 提问: 大神来帮看看

回复:
user: user-1
content: if(i==3)     //这里i=1它也运行  在if语句里面 你如果写i=1 那就代表赋值语句了，就相当于if(true) i=1 和i==1 是有区别的 楼主注意一下 =是赋值 ==是判断两个数是否相等 相等则返回true 否则返回false

user: user-1
content: 请问一下，楼主写这代码是想做什么呢？ 你只给代码也不知道你要的是什么呀

user: user-0
content: 我是(i==3）的

user: user-0
content: 我用的是do...while，我去了“；”后报错啊。

user: user-2
content: #include<stdio.h>  int xn(int *x,int *m);  int main() {     int n=10, i;     int nx[10], *p, *z;      for(i = 0; i < n; i++)     {         nx[i] = i + 1;         printf("%3d", nx[i]);     }     printf("\n");     p = nx;     z = &nx[i-1];   /* replace i with i-1, i has overflowed.*/      printf("%5d\n", xn(p, z));     return 0; } int xn(int *x, int *m) {     int i = 1, j, y;     int *a;      a = x;     for(j = 0; x != m; x++)     {         j++;     }     x = a;     do     {         if(i == 3)         {             y = *x;             *x = 0;             j--;             i = 0;             printf("i = %d, *x = %d\n", i, *x);         }         else         {             i++;             x++;             if(x > m)                 x=a;             while(*x == 0)    /*del ;*/             {                 x++;             }             printf("+++i = %d, *x = %d\n", i, *x);         }     } while(j != 1);      printf("\n");     return *x; } 不是i为1的语句体里执行了，而是i确实等于了3才执行了。 另外，提出2点问题： 1. main函数里，z = &xn[i]其实数据已经越界了，因为i 的下标范围是0～9,经过循环后i是10了，所以越界； 2. xn函数里有while(*x == 0);去掉后面的分号； 最后提一点，注意coding style.

user: user-3
content: if(i==3)     //这里i=1它也运行  i = 1 跟 i == 1 可是不同的噢
user-0 提问: 文件和输出设备的关系

回复:
user: user-1
content: 输出设备你可以看成是文件，使用createfile可以打开设备，readfile和writefile可以对设备进行读写。

user: user-2
content: 在Linux下，一切都是文件。设备也是文件；不同的文件都有自己描述符，区分不同文件就是使用文件描述； 你的问题里，输出设备是指终端输出或者是显示器吧；显示器是标准输出设备，也是又对应的文件描述符； 0，1，2分别表示：标准输入（键盘等），标准输出（显示器等），标准错误输出（也一般是指显示器）
user-0 提问: 刚学c语言的小白

回复:
user: user-1
content: 把printf("%d\n", a+b) 改成 printf("\n%d\n", a+b) 试试

user: user-2
content: 我也是来学习的。

user: user-3
content: 输入两个整数，随便用啥间隔。 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-4
content: #include <stdio.h>  #define MAX_PAIR 10 int main() {     int a[MAX_PAIR], b[MAX_PAIR];     int i, n = 0;     //Ctrl + Z 结束输入     while (scanf("%d%d", &a[n], &b[n]) == 2)     {         n++;     }     for (i = 0; i < n; i++)     {         printf("%d\n", a[i] + b[i]);     }     return 0; }

user: user-5
content: 那你继续输入，2  5， 4  6等等；这样就可以多次输出了。每次也是新的一行。
user-0 提问: 帮我看看这段程序错在哪儿了，改了一处还是不行

回复:
user: user-1
content: 写得太糟糕了。重写一个吧，没有改的必要。

user: user-2
content: 什么错误，编译错误还是运行错误？ 错误提示是什么？
user-0 提问: 为什么使用GCC4.7.2用以下代码提交会报错

回复:
user: user-0
content: 主函数要用结构体名表示类型的时候，前面还要加个struct 。多谢各位大佬，此贴终结。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include<stdlib.h> struct Info{     double n;     int j;     int k; }; int main() {     int a, i, j, b;      scanf("%d", &a);     struct Info *H=(struct Info *)malloc(a * sizeof(struct Info));     for(i = 0; i < a; i++)         scanf("%lf%d%d", &H[i].n, &H[i].j, &H[i].k);      scanf("%d", &b);     int *c = (int *)malloc(b * sizeof(int));     for(i = 0; i < b; i++)         scanf("%d", &c[i]);     for(i = 0; i < a; i++) {         for(j = 0; j < b; j++) {             if(H[i].k == c[j])                 printf("%0.lf %d\n", H[i].n, H[i].j);         }     }     return 0; } 对于结构体，C语言不支持只用结构体名来表示类型的，前面需要加struct，除非用typedef；  谢谢，编译成功了。

user: user-0
content: 引用 1 楼 user-2 的回复:报什么错也不说一下

user: user-1
content: #include<stdio.h> #include<stdlib.h> struct Info{     double n;     int j;     int k; }; int main() {     int a, i, j, b;      scanf("%d", &a);     struct Info *H=(struct Info *)malloc(a * sizeof(struct Info));     for(i = 0; i < a; i++)         scanf("%lf%d%d", &H[i].n, &H[i].j, &H[i].k);      scanf("%d", &b);     int *c = (int *)malloc(b * sizeof(int));     for(i = 0; i < b; i++)         scanf("%d", &c[i]);     for(i = 0; i < a; i++) {         for(j = 0; j < b; j++) {             if(H[i].k == c[j])                 printf("%0.lf %d\n", H[i].n, H[i].j);         }     }     return 0; } 对于结构体，C语言不支持只用结构体名来表示类型的，前面需要加struct，除非用typedef；

user: user-2
content: 报什么错也不说一下
user-0 提问: 结构体和结构体指针

回复:
user: user-1
content: 因为你的结构体指针并没有指向一个有效的对象

user: user-2
content: 指针是野指针，没有分配空间，没有分配空间的野指针，然后在对野指针进行读写操作，很容易出现段错误； 要想一样，定义指针之后要malloc空间。
user-0 提问: c 语言小白求助  

回复:
user: user-0
content: 哦哦，好的，谢谢

user: user-1
content: 因为你输入完a以后按了一个回车键，这个回车键被ch接收了，你可以在scanf("%d",&a);后面加一句getchar();来接收那个回车，这样就正常了，但注意只能按一个回车 如有问题欢迎继续追问，没问题请及时结贴，谢谢
user-0 提问: 求教各位大虾！！关于两次free（） 没有出错问题  

回复:
user: user-1
content: 参考Linux源代码中free和malloc的实现。

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

user: user-0
content: @wizard_tiger 可是释放了这个指针意思是这个指针变量p里面存的地址还是之前的，但是这个指针已经和那块区域没有了联系，没有访问权了，可是大虾你看我后面定义在堆上的例子，，还可以打印出指针所指空间的值   是我哪里理解错了吗

user: user-2
content: 只是释放了指针的位置，表示这个位置可以使用，在没有再次使用前还是原数值。未定义行为。

user: user-0
content: 以上程序我申请了堆上的空间，然后将字符串拷贝在堆上的空间了，那么释放的时候应该也是释放的堆上的空间吧？ 但是两次释放仍然没有出错的现象，难道还是释放的栈上的空间？？  望大虾指点一番

user: user-0
content: 还有个疑问就是，有位大虾说：其实请不清空指针所指的空间内容要看编译器，但是指针已经没有对它的使用权了，但是我实验了一下在不将指针=NULL，此时指针仍保留当初地址的时候，仍然可以访问做指向的区域，两次free也可以运行？？？？？？

user: user-0
content: 大虾就是大虾  厉害  哈哈  你说的那个指针指向了栈中的内存言之有理！！！我想这样写应该就对了：

user: user-3
content: 第一次free和第二次free都没有将开始申请的空间释放掉，因为在堆上申请的空间存放在指针p变量里，但是后来你将栈上空间a赋值给了p，即指针变量p的值被覆盖了。所以，开始申请的空间找不回来，也释放不了，除非退出程序，系统自动释放； free两次没有出错，因为其释放的都不是堆上的空间，上面已有解释； 所以，free没有效果，那么*p是可以正常输出的，因为*p输出的就是变量a的值，a在栈上，生命周期是main函数退出，其周期结束。

user: user-4
content: 第一个问题，free必须释放堆内存使用的，你让p=&a的时候，p指向的那块儿堆内存已经泄露了，再也找不回来了，所以这么写是错的，然后现在p指向的是栈内存了，对栈指针调用free应该有个警告 但不存在释放两次会出错的问题 第二个也是一样，也存在内存泄漏问题，还有就是是堆上的内存，释放以后再引用也是未定义行为，就是结果不可预测，所以不要这么用就对了
user-0 提问: 帮忙看看为什么会出现这样的运行结果

回复:
user: user-1
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-2
content: #include <stdio.h>  int main (void) {     char number[50],rank;     float grade;      printf("输入学号：");     scanf("%s",number);     getchar();   //add getchar() here     printf("输入成绩等级：");     scanf("%c",&rank);     printf("输入入学平均成绩：");     scanf("%f",&grade);     printf("学号=%s\n"             "成绩等级=%c\n"             "入学平均成绩=%f",number,rank,grade);     return 0; } 建议，将rank变量输出，看一下接收了什么数据，然后分析一下； 更深入的了解，可以查一下输入缓存问题

user: user-3
content: scanf()作单字符输入时规定只接收一个字符，但它却把回车符也作为字符对待，第二个scanf会接收回车符，所以不会让你去输入！ 解决办法：scanf(" %c",&rank);%号前面空一格！ 或者： #include "stdafx.h" #include<stdio.h> int main (void) {     char number[50],rank;     float grade;     printf("输入学号：");     scanf("%s",number); 	fflush(stdin);     printf("输入成绩等级：");     scanf("%c",&rank);     printf("输入入学平均成绩：");	     scanf("%f",&grade);     printf("学号=%s\n"     "成绩等级=%c\n"     "入学平均成绩=%f",number,rank,grade);     return 0; }

user: user-0
content: 回忆了一下之前看过的资料，我好像自己明白了。。。
user-0 提问: 图片预处理

回复:
user: user-1
content: 熟悉MATLAB的调试手法。

user: user-0
content: 老师，您好。我是在MATLAB环境下进行运行，对图像利用中值滤波预处理，但是在帧差时获得效果不佳，我觉得是预处理的问题，请问老师该如何解决

user: user-1
content: 建议楼主先编译链接调试OpenCV自带的相关例子代码。
user-0 提问: while循环中无执行语句的情况

回复:
user: user-0
content: 引用 1 楼 cyfcsd 的回复:s[i++] = t[j++]这一句本身就会将t中的内容复制到s里，然后再去判断，这是写程序的一个小技巧 谢谢了

user: user-1
content: s[i++] = t[j++]这一句本身就会将t中的内容复制到s里，然后再去判断，这是写程序的一个小技巧
user-0 提问: linux中如何将动态链接库嵌入到可执行程序中一起发布

回复:
user: user-1
content: 自己写脚本啊，直接使用LD_LIBRARY_PATH变量添加你的路径，然后将这条信息写入/etc/profile或者/etc/bash.bashrc下，安装时就实调用脚本。

user: user-2
content: 要么全部用静态库； 要么全部用动态库。 不要混用！

user: user-3
content: I do not why to answer you.

user: user-4
content: 引用 4 楼 luoziluojun 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] [quote=引用 2 楼 luoziluojun 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 动态库是运行时加载，动态库有自己的加载路径；运行时会从固定路径加载； 即需要把动态库放到固定路径下； 比如linux的/lib/目录下也可以在链接的时候指定运行时动态库位置,有没有办法把动态库包含进可执行文件呢[/quote] 包含到可执行文件里，那就是静态库了。[/quote]并不是静态库,静态库调用之后就不在需要,我的意思是在程序运行的时候还是去调用动态库.只是动态库包含在可执行文件中,比如目标文件为1M 动态库文件为2M, 生成一个3M的可执行文件可以直接运行[/quote] 怕是做不到呀～

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:[quote=引用 2 楼 luoziluojun 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 动态库是运行时加载，动态库有自己的加载路径；运行时会从固定路径加载； 即需要把动态库放到固定路径下； 比如linux的/lib/目录下也可以在链接的时候指定运行时动态库位置,有没有办法把动态库包含进可执行文件呢[/quote] 包含到可执行文件里，那就是静态库了。[/quote]并不是静态库,静态库调用之后就不在需要,我的意思是在程序运行的时候还是去调用动态库.只是动态库包含在可执行文件中,比如目标文件为1M 动态库文件为2M, 生成一个3M的可执行文件可以直接运行

user: user-4
content: 引用 2 楼 luoziluojun 的回复:[quote=引用 1 楼 cfjtaishan 的回复:] 动态库是运行时加载，动态库有自己的加载路径；运行时会从固定路径加载； 即需要把动态库放到固定路径下； 比如linux的/lib/目录下也可以在链接的时候指定运行时动态库位置,有没有办法把动态库包含进可执行文件呢[/quote] 包含到可执行文件里，那就是静态库了。

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:动态库是运行时加载，动态库有自己的加载路径；运行时会从固定路径加载； 即需要把动态库放到固定路径下； 比如linux的/lib/目录下也可以在链接的时候指定运行时动态库位置,有没有办法把动态库包含进可执行文件呢

user: user-4
content: 动态库是运行时加载，动态库有自己的加载路径；运行时会从固定路径加载； 即需要把动态库放到固定路径下； 比如linux的/lib/目录下
user-0 提问: 为什么我用MATLAB和C语言计算图像信噪比PSRN结果不一样

回复:
user: user-0
content: 有人说是数据类型的问题。我测试图片为bmp格式的。

user: user-1
content: 你把中间的变量都输出一下，对比对比不就知道了吗
user-0 提问: 帮我看下这个程序

回复:
user: user-1
content: 引用 4 楼 pupilkk 的回复:[quote=引用 3楼自信男孩 的回复:]建议你把ptr和food的地址打印出来，在while之前；如下形式： printf("ptr = %p, food = %p\n", ptr, food); 另外，建议对于这样的问题，验证性的，自己敲一下，编译运行一下～然后再去分析结果；对于库函数或者系统函数，去分析其用法和返回值。把地址看成一个整型，比较它们的前后关系吗[/quote] 对于32位的CPU，地址是unsigned int类型的，地址是可以比较的，因为其都大小，相对于0地址的偏移不同；

user: user-0
content: 引用 3楼自信男孩 的回复:建议你把ptr和food的地址打印出来，在while之前；如下形式： printf("ptr = %p, food = %p\n", ptr, food); 另外，建议对于这样的问题，验证性的，自己敲一下，编译运行一下～然后再去分析结果；对于库函数或者系统函数，去分析其用法和返回值。把地址看成一个整型，比较它们的前后关系吗

user: user-1
content: 建议你把ptr和food的地址打印出来，在while之前；如下形式： printf("ptr = %p, food = %p\n", ptr, food); 另外，建议对于这样的问题，验证性的，自己敲一下，编译运行一下～然后再去分析结果；对于库函数或者系统函数，去分析其用法和返回值。

user: user-2
content: strlen函数有统计的长度是忽略了'\0'字符的长度的，比如存这个字符串“CHINA”进去实际上存的占了6个字节，而strlen函数统计会忽略‘\0’，所以是长度是5  第二个问题则是运算符运算的优先级问题，按照--ptr >= food ，实际是这样计算（--ptr）>=food，先括号在外面，这里具体就是ptr先自减1然后在拿ptr和food比较

user: user-3
content: 连打字也懒得动的懒癌患者建议趁早改行。
user-0 提问: C语言中可以调用C++编写的动态库吗（DLL），如果可以，应该如何操作？谢谢各位大神了！

回复:
user: user-1
content: 不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！
user-0 提问: bitblt画图，怎样擦除上一次画的图

回复:
user: user-1
content: 擦除上一次的内容  就是把上一次的内容，还原成上上一次的内容，  所以，如果有缓存上上一次的内容，则直接替换就可以  如果没有缓存，则需要重画一遍：  比如你画了一条直线，白色的，a到b，而画之前a-b之间是红色的，  你想擦除这条直线，  就是在a-b之间，用红色，再画一遍

user: user-0
content: dc = BeginPaint(hwnd, &ps);  dc2 = CreateCompatibleDC(dc); SelectObject(dc2, hbmp[14]); GetObject(hbmp[14], sizeof(BITMAP), &bit); //x = 0; //y = 6; po.x = (43 + (x * 69)); po.y = (41 + (y * 69));  //  wsprintf(str, TEXT("x:%d  y:%d"), po.x, po.y); //	MessageBox(NULL, str, TEXT("1"), 0); kuang(dc2, po); if (j == 0) { MoveToEx(dc2, 0, 0, NULL); LineTo(dc2, 100, 100); j++; } BitBlt(dc, 0, 0, bit.bmWidth, bit.bmHeight, dc2, 0, 0, SRCCOPY);
user-0 提问: 老是显示停止工作

回复:
user: user-1
content: #include<stdio.h> #include<malloc.h> #include<string.h>  typedef struct integ {     int data;     struct integ *prior;     struct integ *pnext; }stu, *pstu;  pstu create() {     struct integ *phead, *ptail, *pnew;     int i, n, a;      phead = (pstu)malloc(sizeof(stu));     ptail = phead;     phead->pnext = NULL; /* should init head's next node.*/     ptail->prior = phead;      printf("输入节点个数：\n");     scanf("%d",&n);      for (i = 0; i < n; i++) {         printf("第%d个节点的数值：",i+1);         scanf("%d", &a);          pnew = (pstu)malloc(sizeof(stu));         pnew->data = a;         pnew->pnext = NULL;         pnew->prior = ptail;         ptail->pnext = pnew;         ptail = pnew;     }     return phead; }  void show(stu *phead) {     pstu p = phead->pnext;     while (p) {         printf("%d ", p->data);         p = p->pnext;     }     printf("\n"); }    pstu search(stu *h, int c) {     stu *p;      p = h->pnext;     //y = p->data; /* type conflict */      while (p) {         if (p->data == c)             return p;           p = p->pnext;     }     printf("没有找到相同的数据\n");     return NULL;    /* if can't find it, then return NULL */ }  void del(stu *p) {     if (!p)    /* if not existed, then return */         return;      pstu a, b;     a = p->prior;     b = p->pnext;     a->pnext = b;     if (b)    /* if p is last node, b is NULL */         b->prior = a;     free(p); }  void destroy_dlink(pstu head) {     pstu p = head, q;      while (p) {         q = p->pnext;         free(p);         p = q;     } }  int main() {     int a;     pstu q;      pstu phead = NULL;     phead = create();     show(phead);      printf("请输入需要删除的数字\n");     scanf("%d",&a);     q = search(phead, a);      del(q);     show(phead);     destroy_dlink(phead);     return 0; } 改了几处我感觉不合适或者有问题的地方，修改的地方都加了注释； 建议几点：1）既然使用了typedef，建议就使用typedef之后的名字；2）注意代码风格； 另外，加了一个释放整个链表的函数。

user: user-2
content: 要学会自己调试程序  修改两个函数，修改后代码为  pstu search(stu *h, int c){     pstu p = h->pnext;     while (p != NULL){         if (p->data - c == 0){             return p;         }         else{             p = p->pnext;         }     }     printf("没有找到相同的数据\n");      return NULL; } void del(stu *p){     if (!p)         return;      stu *a, *b;     a = p->prior;     b = p->pnext;      a->pnext = b;     if (b) //b删除元素的下一个元素，判断是否存在         b->prior = a;          free(p); }
user-0 提问: 大神帮忙看看一看是哪里的问题~

回复:
user: user-1
content: 引用 2 楼 Billd_ 的回复:引用 1 楼 cyfcsd 的回复:你是要干什么求出100~200之间的素数 把k的定义移到第一个for循环里面，要不它一直在加，还有你可以看看别人求素数的程序，可以有很多优化的 如有问题欢迎继续追问，没问题请及时结贴，谢谢

user: user-2
content: #include<stdio.h> #include <stdlib.h>  void main() {     int i, n = 0, j, k = 0;      printf("100~200间所有素数为：\n");     for (j = 100;j <= 200;j++)     {         for (i = 2; i <= j - 1; i++)         {             if (j%i==0)                 k = k + 1;         }         if (k == 0)         {             printf("%d ", j);             n = n + 1;         }         if (n % 10 == 0)             printf("\n");         k = 0;    /* reinit 0*/     }     system("pause"); }  k没有重新初始化为0，建议把k变量改成flag，这样代码可读性会加1分。

user: user-0
content: 引用 1 楼 cyfcsd 的回复:你是要干什么求出100~200之间的素数

user: user-1
content: 你是要干什么
user-0 提问: 在图的邻接表中查找指定节点

回复:
user: user-1
content: 你说的第y个是从0开始还是从1开始，要是从1开始那就改为j<y-1，要是从0开始就是你的邻接表没有建好

user: user-0
content: 不行，还是一样中断了

user: user-1
content: j <= y改成j<y试试
user-0 提问: 程序的一部分

回复:
user: user-0
content: 执行的时候  you received 105.90 105.900000 11.000000 说明函数返回时w值变了不知道怎么回事

user: user-1
content: 什么问题？

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。
user-0 提问: 环状序列（UVa1584）  刘汝佳《算法竞赛入门经典2》p52，为什么要设置变量T？

回复:
user: user-1
content: 引用 4 楼 csdn_mr_l 的回复:引用 3 楼 cfjtaishan 的回复:T是执行次数，就是处理几个字符串；可以将main函数改成下面的形式，另外加上一条退出条件判断就好～也就是说和输入输出格式有关吧，谢谢了。 没关系，和退出的方式有关系；比如T输入的数据是3，那么你输入三个字符串之后，会自动退出循环；

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:T是执行次数，就是处理几个字符串；可以将main函数改成下面的形式，另外加上一条退出条件判断就好～也就是说和输入输出格式有关吧，谢谢了。

user: user-1
content: T是执行次数，就是处理几个字符串；可以将main函数改成下面的形式，另外加上一条退出条件判断就好～

user: user-0
content: 引用 1 楼 user-2 的回复:里面应该描述了输入是啥格式的。  你们这两个哪个能正确读入输入呢？两种方法读的东西是不一样的。你的意思是这与输入格式有关？我没找到这个例题的输入输出格式，新手见谅

user: user-2
content: 里面应该描述了输入是啥格式的。  你们这两个哪个能正确读入输入呢？两种方法读的东西是不一样的。