Question: 初学动态链表一堆错误不知道是什么情况

引用 4 楼 自信男孩 的回复:#include<stdio.h> #include<stdlib.h> #include<string.h> #define len 20 struct student {     char* name;     struct student* next; }; struct student* ctrn() {     char max[len],a;     struct student * p, * hard, * next;      //p = (struct student*)malloc(sizeof(char));     p = (struct student*)malloc(sizeof(struct student));     if (!p)         exit(0);     p->name = (char *)malloc(sizeof(char) * len);     if (!p->name)         exit(0);     gets_s(max, len);     strcpy(p->name, max);      printf("是否继续输入(y/n):");     scanf_s("%c", &a);     //while (a = 'y')     while (a == 'y')     {         //next= (struct student*)malloc(sizeof(char));         next= (struct student*)malloc(sizeof(struct student));         if (!next)             exit(0);         next->name = (char *)malloc(sizeof(char) * len);         if (!next->name)             exit(0);         gets_s(max, len);         strcpy(next->name, max);         next= next->next;         if (a == 'n')         {             next->next= NULL;             break;         }     }     p->next = next;     hard = p;     while (1)     {         //printf("%d", p->name);         printf("%s", p->name);         p = p->next;         if (p->next != NULL)         {             break;         }     } }  供参考～ 大佬又是你啊，谢谢你了

引用 8 楼 自信男孩 的回复:[quote=引用 7 楼 Gnglas 的回复:] [quote=引用 4 楼 自信男孩的回复:]#include<stdio.h> #include<stdlib.h> #include<string.h> #define len 20 struct student {     char* name;     struct student* next; }; struct student* ctrn() {     char max[len],a;     struct student * p, * hard, * next;      //p = (struct student*)malloc(sizeof(char));     p = (struct student*)malloc(sizeof(struct student));     if (!p)         exit(0);     p->name = (char *)malloc(sizeof(char) * len);     if (!p->name)         exit(0);     gets_s(max, len);     strcpy(p->name, max);      printf("是否继续输入(y/n):");     scanf_s("%c", &a);     //while (a = 'y')     while (a == 'y')     {         //next= (struct student*)malloc(sizeof(char));         next= (struct student*)malloc(sizeof(struct student));         if (!next)             exit(0);         next->name = (char *)malloc(sizeof(char) * len);         if (!next->name)             exit(0);         gets_s(max, len);         strcpy(next->name, max);         next= next->next;         if (a == 'n')         {             next->next= NULL;             break;         }     }     p->next = next;     hard = p;     while (1)     {         //printf("%d", p->name);         printf("%s", p->name);         p = p->next;         if (p->next != NULL)         {             break;         }     } }  供参考～ if (!p) exit(0); p->name = (char*)malloc(sizeof(char) * len); if (!p->name) exit(0); 这个是什么情况没怎么见过[/quote]  判断内存是否申请成功～[/quote] 好像还是错的，严重性	代码	说明	项目	文件	行	禁止显示状态 警告	C6001	使用未初始化的内存“next”。	Project1	G:\C文件\PROJECT1\PROJECT1\源.C	93	 警告	C6064	缺少“scanf_s”的整型参数(对应于转换说明符“2”)。	Project1	G:\C文件\PROJECT1\PROJECT1\源.C	73	 警告	C28182	取消对 NULL 指针的引用。“p”包含与“p->next”相同的 NULL 值。查看第 100 行以找出可能会发生此情况的前一位置	Project1	G:\C文件\PROJECT1\PROJECT1\源.C	98	 警告	C4473	 “scanf_s”: 没有为格式字符串传递足够的参数	Project1	G:\c文件\Project1\Project1\源.c	73	 错误	C4996	 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.	Project1	G:\c文件\Project1\Project1\源.c	70	 错误	C4996	 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.	Project1	G:\c文件\Project1\Project1\源.c	85

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

你这大部分是警告，编译是能过去的，但是要注意一下，有可能会造成程序问题； 两个错误是strcpy不安全，给它换成安全版本就可以了

初学静态链表写的不怎么好，有不规范的都指出来我还能抗

引用 7 楼 Gnglas 的回复:[quote=引用 4 楼 自信男孩的回复:]#include<stdio.h> #include<stdlib.h> #include<string.h> #define len 20 struct student {     char* name;     struct student* next; }; struct student* ctrn() {     char max[len],a;     struct student * p, * hard, * next;      //p = (struct student*)malloc(sizeof(char));     p = (struct student*)malloc(sizeof(struct student));     if (!p)         exit(0);     p->name = (char *)malloc(sizeof(char) * len);     if (!p->name)         exit(0);     gets_s(max, len);     strcpy(p->name, max);      printf("是否继续输入(y/n):");     scanf_s("%c", &a);     //while (a = 'y')     while (a == 'y')     {         //next= (struct student*)malloc(sizeof(char));         next= (struct student*)malloc(sizeof(struct student));         if (!next)             exit(0);         next->name = (char *)malloc(sizeof(char) * len);         if (!next->name)             exit(0);         gets_s(max, len);         strcpy(next->name, max);         next= next->next;         if (a == 'n')         {             next->next= NULL;             break;         }     }     p->next = next;     hard = p;     while (1)     {         //printf("%d", p->name);         printf("%s", p->name);         p = p->next;         if (p->next != NULL)         {             break;         }     } }  供参考～ if (!p) exit(0); p->name = (char*)malloc(sizeof(char) * len); if (!p->name) exit(0); 这个是什么情况没怎么见过[/quote]  判断内存是否申请成功～

引用 4 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h> #include<string.h> #define len 20 struct student {     char* name;     struct student* next; }; struct student* ctrn() {     char max[len],a;     struct student * p, * hard, * next;      //p = (struct student*)malloc(sizeof(char));     p = (struct student*)malloc(sizeof(struct student));     if (!p)         exit(0);     p->name = (char *)malloc(sizeof(char) * len);     if (!p->name)         exit(0);     gets_s(max, len);     strcpy(p->name, max);      printf("是否继续输入(y/n):");     scanf_s("%c", &a);     //while (a = 'y')     while (a == 'y')     {         //next= (struct student*)malloc(sizeof(char));         next= (struct student*)malloc(sizeof(struct student));         if (!next)             exit(0);         next->name = (char *)malloc(sizeof(char) * len);         if (!next->name)             exit(0);         gets_s(max, len);         strcpy(next->name, max);         next= next->next;         if (a == 'n')         {             next->next= NULL;             break;         }     }     p->next = next;     hard = p;     while (1)     {         //printf("%d", p->name);         printf("%s", p->name);         p = p->next;         if (p->next != NULL)         {             break;         }     } }  供参考～ if (!p) exit(0); p->name = (char*)malloc(sizeof(char) * len); if (!p->name) exit(0); 这个是什么情况没怎么见过


Question: 关于C语言中，数组做函数参数的问题

请那些喜欢将数组作为函数参数传来传去或作为函数返回值的码农思考一下为什么不把整个互联网内容当作函数参数传来传去或作为函数返回值呢？

以数组为参数的函数，请格式为: int FindMax(int* array); int FindMax(int array[]); int FindMax(int array[10]); 所以你说的 void func(int *a) func()函数的参数是一维数组 而 void func(int a[10][10]) func()函数的参数是二维数组，这就是区别。 函数参数是数组的相关请参考《C++中函数的数组形参》 二维数组的相关知识，请参考《C++中二维数组与指针》  希望能够帮到你！

这个差别大了去了，第二个应该是void func(int *a[])吧？这样才符合题意

前者相当于int (*a)[10] 后者就是 int *a，数值作为形参，最高纬会退化为指针

引用 4 楼 qq_45671532的回复:就是只有一维数组传值的时候才可以 int fun(int *a); int fun(int a[]); int fun(int a[10]); 而二维数组传值的时候 int fun(int *a[]); int fun(int a[][]); int fun(int a[10][10]);才合法，对吧 就是只有一维数组传值的时候才可以 int fun(int *a); int fun(int a[]); int fun(int a[10]); 而二维数组传值的时候 int fun(int （*a）[]); int fun(int a[][]); int fun(int a[10][10]);这个才是


Question: 各位大神，通过c语言函数读取电脑txt文件，输出时，汉字因为两个占字节乱码怎么办？？求助各位大神。

引用 12 楼 赵4老师的回复:https://www.cnblogs.com/jetyi/articles/2741818.html 这个有点复杂，😂😂

引用 2 楼 weixin_44710192的回复:[quote=引用 1 楼 wowpH的回复:]buf太小了 我改成500了，结果还是一样。[/quote] 好吧~_~。我以为是太小的原因。

引用 1 楼 wowpH的回复:buf太小了 我改成500了，结果还是一样。

buf太小了

好的👌👌，我摸索摸索。

编码转换啊，文件是unicode，就在程序里转gbk输出，要是gbk就转unicode输出

哦哦，请问有什么好的办法吗？

引用 5 楼 user-4的回复:编译器不是vs ? 不是，是啊哈C编译器

引用 6 楼 wowpH的回复:应该是编码问题，我用VS测试一点问题没有。cmd就不行。 是吗？我用的是啊哈C编译器

应该是编码问题，我用VS测试一点问题没有。cmd就不行。

编译器不是vs ?

和%s没关系吧，应该是你读取的文件的编码和你打印环境的编码不一致


Question: 求大神救救孩子

强。。。(;´༎ຶД༎ຶ`）

引用 2 楼 qq_45659066 的回复:引用 1 楼 阿大古 古古古 的回复：你这个函数名不是write_va吗，是不是调用的地方写错成write_vs了？哈哈哈哈哈哈 我服了  这种错误出现了就不紧张，几乎都是哪里粗心了


Question: 4位补码为什么可以表示-8？

引用 2 楼 weixin_44855508 的回复:[quote=引用 1 楼 stherix的回复:]本来不就是这样的吗 1000和0000难道都代表0不成 从补码原理上来看也是  一个数的负数补码就是原码取反加1 那么128是1000,全取反 0111,再加1就是1000 4位其实表示不了-8，  1000表示8  要表示-8还需要一个符号位 1000是8的补码  也是-8的补码？[/quote]  补码将减法转为了加法：请问8位的情况  -5-2是怎么计算的？ -5原码1000 0101   补码是1111 1011 -2原码1000 0010   补码是1111 1110 -5+（-2）是直接把补码相加么？符号位要参与运算么？得到的结果要不要是原码还是补码？

计算机中以二进制补码方式存储时，如果存储的非负数，则按原码存放，如果为负数，则按其补码方式存储，所以不存在+0 和-0，只有0

引用 7 楼 weixin_44855508 的回复:[quote=引用 6 楼 lin5161678的回复:][quote=引用 2 楼 weixin_44855508 的回复:] [quote=引用 1 楼 stherix的回复:]本来不就是这样的吗 1000和0000难道都代表0不成 从补码原理上来看也是  一个数的负数补码就是原码取反加1 那么128是1000,全取反 0111,再加1就是1000 4位其实表示不了-8，  1000表示8  要表示-8还需要一个符号位 1000是8的补码  也是-8的补码？[/quote]4位有符号 无法表示 8[/quote] 0和-0的补码为啥是一样的 -0是1000吗？那补码就还是1000 0的补码是0000 不是不一样么。。。。[/quote]1000表示-8  根本不存在 -0  你有点语无伦次  问题一个一个列出来 一个一个弄清楚 别混在一起

引用 6 楼 lin5161678的回复:[quote=引用 2 楼 weixin_44855508 的回复:] [quote=引用 1 楼 stherix的回复:]本来不就是这样的吗 1000和0000难道都代表0不成 从补码原理上来看也是  一个数的负数补码就是原码取反加1 那么128是1000,全取反 0111,再加1就是1000 4位其实表示不了-8，  1000表示8  要表示-8还需要一个符号位 1000是8的补码  也是-8的补码？[/quote]4位有符号 无法表示 8[/quote] 0和-0的补码为啥是一样的 -0是1000吗？那补码就还是1000 0的补码是0000 不是不一样么。。。。

引用 2 楼 weixin_44855508 的回复:[quote=引用 1 楼 stherix的回复:]本来不就是这样的吗 1000和0000难道都代表0不成 从补码原理上来看也是  一个数的负数补码就是原码取反加1 那么128是1000,全取反 0111,再加1就是1000 4位其实表示不了-8，  1000表示8  要表示-8还需要一个符号位 1000是8的补码  也是-8的补码？[/quote]4位有符号 无法表示 8

引用 4 楼 user-4 的回复:[quote=引用 3 楼 stherix 的回复:] [quote=引用 2 楼 weixin_44855508 的回复:] [quote=引用 1 楼 stherix的回复:]本来不就是这样的吗 1000和0000难道都代表0不成 从补码原理上来看也是  一个数的负数补码就是原码取反加1 那么128是1000,全取反 0111,再加1就是1000 4位其实表示不了-8，  1000表示8  要表示-8还需要一个符号位 1000是8的补码  也是-8的补码？[/quote]  1000并不是8的补码啊 8已经溢出了...  毕竟只能表示   -2^n  -> 2^n - 1  范围的数 不过硬要说的话那也是的 对于4bit而言 加8就等于加-8[/quote] 没溢出，谢谢[/quote]  你说没溢出那就没溢出吧

引用 3 楼 stherix 的回复:[quote=引用 2 楼 weixin_44855508 的回复:] [quote=引用 1 楼 stherix的回复:]本来不就是这样的吗 1000和0000难道都代表0不成 从补码原理上来看也是  一个数的负数补码就是原码取反加1 那么128是1000,全取反 0111,再加1就是1000 4位其实表示不了-8，  1000表示8  要表示-8还需要一个符号位 1000是8的补码  也是-8的补码？[/quote]  1000并不是8的补码啊 8已经溢出了...  毕竟只能表示   -2^n  -> 2^n - 1  范围的数 不过硬要说的话那也是的 对于4bit而言 加8就等于加-8[/quote] 没溢出，谢谢

引用 2 楼 weixin_44855508 的回复:[quote=引用 1 楼 stherix的回复:]本来不就是这样的吗 1000和0000难道都代表0不成 从补码原理上来看也是  一个数的负数补码就是原码取反加1 那么128是1000,全取反 0111,再加1就是1000 4位其实表示不了-8，  1000表示8  要表示-8还需要一个符号位 1000是8的补码  也是-8的补码？[/quote]  1000并不是8的补码啊 8已经溢出了...  毕竟只能表示   -2^n  -> 2^n - 1  范围的数 不过硬要说的话那也是的 对于4bit而言 加8就等于加-8

引用 1 楼 stherix的回复:本来不就是这样的吗 1000和0000难道都代表0不成 从补码原理上来看也是  一个数的负数补码就是原码取反加1 那么128是1000,全取反 0111,再加1就是1000 4位其实表示不了-8，  1000表示8  要表示-8还需要一个符号位 1000是8的补码  也是-8的补码？


Question: 思维导图

支持楼主分享


Question: 关于dev c++5.1.1（问）

引用 7 楼 赵4老师 的回复：现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！我不是码农，我是小白的嗷

程序都是运行完就结束的，之所以在DEV（包括其他IDE）里运行没有结束，是因为IDE另外有程序管控你的程序，使得结束后窗口依然没有关闭，但对于exe来说，结束就关闭。所以，如果要留住窗口的话，让程序不结束就行了，比如可以在最后一个加上getchar，让程序等待用户输入，或者system("pause >nul"); 让程序等待用户按键，这样程序就没法退出了，你也就能看到之前的数据了。

一句话 程序执行完毕了，就会退出。 可以在你的代码return 前面加上一句getchar();  就达到你要的效果了

引用 1 楼 user-4 的回复：可以在最后加一句system("pause");什么意思

引用 2 楼 赵4老师 的回复：Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt我有2019但我不会用

可以在最后加一句system("pause");


Question: 小白问一个C语言问题

正如楼上几位大佬所说，要看b的类型，如果b的类型是int，则其值是5。除法和取余优先级别相同，从左向右计算即可

a/10得12345 12345%10得5 b为5

//C++ Operators //  Operators specify an evaluation to be performed on one of the following: //    One operand (unary operator) //    Two operands (binary operator) //    Three operands (ternary operator) //  The C++ language includes all C operators and adds several new operators. //  Table 1.1 lists the operators available in Microsoft C++. //  Operators follow a strict precedence which defines the evaluation order of //expressions containing these operators.  Operators associate with either the //expression on their left or the expression on their right;    this is called //“associativity.” Operators in the same group have equal precedence and are //evaluated left to right in an expression unless explicitly forced by a pair of //parentheses, ( ). //  Table 1.1 shows the precedence and associativity of C++ operators //  (from highest to lowest precedence). // //Table 1.1   C++ Operator Precedence and Associativity // The highest precedence level is at the top of the table. //+------------------+-----------------------------------------+---------------+ //| Operator         | Name or Meaning                         | Associativity | //+------------------+-----------------------------------------+---------------+ //| ::               | Scope resolution                        | None          | //| ::               | Global                                  | None          | //| [ ]              | Array subscript                         | Left to right | //| ( )              | Function call                           | Left to right | //| ( )              | Conversion                              | None          | //| .                | Member selection (object)               | Left to right | //| ->               | Member selection (pointer)              | Left to right | //| ++               | Postfix increment                       | None          | //| --               | Postfix decrement                       | None          | //| new              | Allocate object                         | None          | //| delete           | Deallocate object                       | None          | //| delete[ ]        | Deallocate object                       | None          | //| ++               | Prefix increment                        | None          | //| --               | Prefix decrement                        | None          | //| *                | Dereference                             | None          | //| &                | Address-of                              | None          | //| +                | Unary plus                              | None          | //| -                | Arithmetic negation (unary)             | None          | //| !                | Logical NOT                             | None          | //| ~                | Bitwise complement                      | None          | //| sizeof           | Size of object                          | None          | //| sizeof ( )       | Size of type                            | None          | //| typeid( )        | type name                               | None          | //| (type)           | Type cast (conversion)                  | Right to left | //| const_cast       | Type cast (conversion)                  | None          | //| dynamic_cast     | Type cast (conversion)                  | None          | //| reinterpret_cast | Type cast (conversion)                  | None          | //| static_cast      | Type cast (conversion)                  | None          | //| .*               | Apply pointer to class member (objects) | Left to right | //| ->*              | Dereference pointer to class member     | Left to right | //| *                | Multiplication                          | Left to right | //| /                | Division                                | Left to right | //| %                | Remainder (modulus)                     | Left to right | //| +                | Addition                                | Left to right | //| -                | Subtraction                             | Left to right | //| <<               | Left shift                              | Left to right | //| >>               | Right shift                             | Left to right | //| <                | Less than                               | Left to right | //| >                | Greater than                            | Left to right | //| <=               | Less than or equal to                   | Left to right | //| >=               | Greater than or equal to                | Left to right | //| ==               | Equality                                | Left to right | //| !=               | Inequality                              | Left to right | //| &                | Bitwise AND                             | Left to right | //| ^                | Bitwise exclusive OR                    | Left to right | //| |                | Bitwise OR                              | Left to right | //| &&               | Logical AND                             | Left to right | //| ||               | Logical OR                              | Left to right | //| e1?e2:e3         | Conditional                             | Right to left | //| =                | Assignment                              | Right to left | //| *=               | Multiplication assignment               | Right to left | //| /=               | Division assignment                     | Right to left | //| %=               | Modulus assignment                      | Right to left | //| +=               | Addition assignment                     | Right to left | //| -=               | Subtraction assignment                  | Right to left | //| <<=              | Left-shift assignment                   | Right to left | //| >>=              | Right-shift assignment                  | Right to left | //| &=               | Bitwise AND assignment                  | Right to left | //| |=               | Bitwise inclusive OR assignment         | Right to left | //| ^=               | Bitwise exclusive OR assignment         | Right to left | //| ,                | Comma                                   | Left to right | //+------------------+-----------------------------------------+---------------+

b是什么类型也不声明? 如果b变量默认int，那么b=5； 如果b在其它地方已声明为float，那就完全不同了。。。

值是多少的问题，建议自己动手写一下程序，然后编译运行一下。 如果是优先级的问题，也可以通过结果反向猜测它们的优先级～

除法和取余是一优先级的。结合方向是从左向右。所以结果是5

先÷再取余吧


Question: 小白求助，一个很简单的问题

引用 1 楼 user-2的回复:const int是常量，不能修改的 const char *copy是copy指向的字符串是不能修改的，但是指针本身可以修改，比如： const char *mesg="dasds"; mesg[0] = '\0';  // 这种操作不允许，它修改的是字符串的内容   如果是const char const *mesg="dasds"; const char const *copy; mesg[0] = '\0';  // 这种操作不允许，它修改的是字符串的内容 copy = mesg;  // 这个也不允许 还可以两个const。。这个有点厉害。


Question: 列主元高斯消元法，不知代码哪出错了，哪位大神帮忙看看，感激不尽

引用 3 楼 JISANSAN 的回复:[quote=引用 2 楼 SuperDay的回复:]编译没错吧，运行结果有吗? 编译没错，运行结果中有乱码[/quote]  运行结果贴出来啊

引用 2 楼 SuperDay的回复:编译没错吧，运行结果有吗? 编译没错，运行结果中有乱码

编译没错吧，运行结果有吗?

最次也要截图啊，拍照鬼看得清。  最好贴代码，至少别人也可以运行调试一下。


Question: 求大佬帮忙

pow(a, (a % 2) == 0 ? 5 : 6);

你都知道用什么了。


Question: 小白学习c

约球是由经研八信息科技（北京）有限公司于2013年7月13日正式出品的一款高尔夫交友应用，在应用中用户可以发起一个球局，也可以申请加入别人的球局，在能实现约球的同时还能结交很多球友，切磋球技、结交朋友、丰富精彩人生。  b是a的约球是什么梗？

一脸懵，你想怎么写都可以，我觉得你写的是对的

你好，用C语言就是那么写的。

我建议你先学会怎么提问再来吧，都不知道你这个问题什么意思

大家好，我是c语言两年半练习生，就那么写呗


Question: float x=9876.54321；printf("x=%f",x);

浮点数格式 http://bbs.csdn.net/topics/390676437

打开include\float.h瞜一眼。

引用 3 楼 user-2的回复:应该是精度不够吧，除此之外，想不出其它原因 好的 谢谢 我明白了

应该是精度不够吧，除此之外，想不出其它原因

double x = 9876.54321; printf("x=%lf", x);

编译的时候有个警告 warning C4305: “初始化”: 从“double”到“float”截断


Question: 关于文件读取与输出

关于fopen_s 在vs 2017中的使用问题，实在是不知道怎么使用了 就是open scanf close的顺序，楼主有什么疑惑吗？ 输出的格式，需要足够耐心一步一步调整


Question: 哪位大佬帮忙看一下

引用 8 楼 user-1的回复:像c>a>b这样的比较完全是没有意义的，比较表达式的结果跟整数比较，没有实际意义，一般这种写法，是一种把程序写错了 而c/b判断等不等于0，等于是c的绝对值≥b，因为只要c的绝对值小于b，-1<c/b<1，那么取整之后就是0 嗯嗯，谢谢，这只是出题人多做作怪，太难了

引用 8 楼 user-1 的回复:像c>a>b这样的比较完全是没有意义的，比较表达式的结果跟整数比较，没有实际意义，一般这种写法，是一种把程序写错了 而c/b判断等不等于0，等于是c的绝对值≥b，因为只要c的绝对值小于b，-1<c/b<1，那么取整之后就是0  但是如果程序写成abs(c)>=abc(b)，可读性就会好很多

引用 6 楼 user-1的回复:c是5，只要不是0，就是真 c/b等于1（取整），也是真 哦哦，懂了，一直没看懂，书上也没说，谢谢

c是5，只要不是0，就是真 c/b等于1（取整），也是真

后面那个没懂，c和c/b是怎么为真的

引用 3 楼 qq_45673225 的回复:[quote=引用 2 楼 user-1的回复:]“&&”“||”优先级应该是最低的 c>a>b：c>a为真，就是1，于是1>b为假，所以c>a>b为假； c=5，所以为真； c/b=1，也是真 所以“假&&真||真”结果为真，就是1 我编程二三十年的人，也不敢确定这个是对的，如果看到谁这么写程序，我想把他拍死 这题目真的是变态，硬要难我这个初学者[/quote]  嗯，你要是有个性的话，可以拒绝做题。如果我当老师的话，出这个题，拒绝做题的人，这道满分

引用 2 楼 user-1的回复:“&&”“||”优先级应该是最低的 c>a>b：c>a为真，就是1，于是1>b为假，所以c>a>b为假； c=5，所以为真； c/b=1，也是真 所以“假&&真||真”结果为真，就是1 我编程二三十年的人，也不敢确定这个是对的，如果看到谁这么写程序，我想把他拍死 这题目真的是变态，硬要难我这个初学者

晕啊……答案应该是1吧 尽出这种题目，无语


.....发出来的时候已经意识到了

ret_val=fgets(st,SIZE,stdin);这是从标准输入读取一行字符串，ret_val=st只是赋值，这二者根本不是一个东西好不好？


Question: 学C，小白请求支援

谢谢大佬的指点

虽然多余了一对的括号，但是增强了可读性，避免歧义。当别人看到这个代码的时候，不会受到干扰 而且，不建议写(year%100)这样的，就是(year % 100 != 0)，虽然效果一样，但后者看起来一目了然，同理!(year%4)也是不如(year % 4 == 0)。 代码要一看就知道是干嘛的

优先级最高的应该是括号，我习惯都是用括号，不要太自信于自己对优先级的了解，为了避免自己犯一些不该犯的错误，不要给自己挖坑，尽量用括号。这个逻辑表达式，等效的话我会这样写： ((year % 100 != 0) && (year % 4 == 0)) || (year % 400 == 0)

这里考查的是运算符优先级的知识

应该是这样吧：(year%100)  &&  !(year%4)  ||  !(year%400) “!”比“&&”和“||”优先级要高的


引用 5 楼 weixin_45479000 的回复:好了解决了，我TMD谢谢360安全卫士 程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。   关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 ……

好了解决了，我TMD谢谢360安全卫士

引用 2 楼 user-2的回复:[quote=引用 1 楼 weixin_45479000 的回复:] 不好意思说错了，是2010你还是说错了，应该是Visual Studio 2010。  在4行和5行中间加个return 0;试试？我也不确定是不是这个问题。[/quote] 我刚才已经试过了不行

引用 1 楼 weixin_45479000 的回复:不好意思说错了，是2010你还是说错了，应该是Visual Studio 2010。  在4行和5行中间加个return 0;试试？我也不确定是不是这个问题。

引用 楼主 weixin_45479000的回复:我用的VC++2019，我在调试时出现error MSB6006:cl.exe已退出代码为2的问题，各位大佬能不能帮我一哈 不好意思说错了，是2010


Question: css字体用text-align：center居中不了，求教

发错版块了吧，这里都是C语言

可能跟你写的左浮动有关，（不怎么会前端


Question: 【数据结构】c语言中Attach()意义

浙大陈越数据结构课 哈哈哈哈哈哈我也刚刷到这里

引用 4 楼 weixin_41580386 的回复:请问你知不知道Attach函数为什么不能这样定义？ void Attach(int c, int e, Polynomial  pRear){     Polynomial P;          P = (Polynomial)malloc(sizeof(struct PolyNode));     P->coef=c;     P->expon=e;     P->link = NULL;     pRear->link = P;     pRear=P; } 然后在主函数里引用Attach函数时这样写 Attach(P1->coef, P1->expon, rear); 这样为什么就是错的呢，很疑惑 你好，我的理解是： （1）首先明确`pRear`是一个指针，指向一个结点，那`pRear`本身就是一个地址变量； （2）其次，明确C中都是传值调用。 在你的Attach(P1->coef, P1->expon, rear)中：  pRear->link = P; // 这句话本身是没有问题的，可以对 link 进行赋值 pRear=P; // 但是这句话就不能起到赋值的效果，因为： // 0. 调用 Attach(P1->coef, P1->expon, rear) 时，将rear的值（因为`rear`是一个指针，所以其值是一个地址变量）赋值一份，给局部变量pRear赋上 // 1. 此时 pRear 中保存地址变量，但其本身并不是指向 *rear 的指针； // 2. 换句话说，如果 pRear 的值改变，那么不对 rear 造成影响。 // 3. 因此，想要改变 rear 的值，应该将 rear 的地址传入，而非将其本身。   总结起来就是：  A 是 B 的指针，B 是 C 的指针，在函数调用中，想改变C的值，需要将&C（即B）传入，想改变B的值，需要将&B（即A）传入。  函数调用中，改变变量的值，对其指针进行操作；改变指针的值，对指针的指针进行操作。

自带函数都是小写字母打头的

引用 1 楼 user-4 的回复:网上搜不到，那可能是自定义函数。。。。你没copy全？  您说对了，我以为Attach像Compare一样是自带函数，刚遇到就把课程暂停一个劲研究...  老师确实在下一页ppt马上讲了Attach()的定义。   void Attach(int c, int e, Polynomial *pRear){     Polynomial P;          P = (Polynomial)malloc(sizeof(struct PolyNode));     P->coef=c;     P->expon=e;     P->link = NULL;     (*pRear)->link = P;     *pRear=P; }

网上搜不到，那可能是自定义函数。。。。你没copy全？


Question: 【求助】使用malloc为数组分配内存，字符串输入时报错

引用 9 楼 SuperDay 的回复:[quote=引用 8 楼 RockyXRQ 的回复：][quote=引用 2 楼 棉猴 的回复:] 给Test1分配空间！  	struct Words_Malloc * Test1 = new Words_Malloc(); 	getName(Test1); 	getName_Free(Test1); 	delete Test1; VS2015调试结果 嗯呢！我用malloc直接分配内存可以用了，但是用new动态分配好像过不了编译诶 [/quote]new是C++操作符，malloc是C函数[/quote] 好的我懂了！

引用 8 楼 RockyXRQ 的回复：[quote=引用 2 楼 棉猴 的回复:] 给Test1分配空间！  	struct Words_Malloc * Test1 = new Words_Malloc(); 	getName(Test1); 	getName_Free(Test1); 	delete Test1; VS2015调试结果 嗯呢！我用malloc直接分配内存可以用了，但是用new动态分配好像过不了编译诶 [/quote]new是C++操作符，malloc是C函数

引用 2 楼 棉猴 的回复:给Test1分配空间！  	struct Words_Malloc * Test1 = new Words_Malloc(); 	getName(Test1); 	getName_Free(Test1); 	delete Test1; VS2015调试结果 嗯呢！我用malloc直接分配内存可以用了，但是用new动态分配好像过不了编译诶

引用 3 楼 这是一个正经昵称 的回复:指针都得指向一块内存，给你结构体指针分配 嗯嗯！手动用malloc分配内存了！解决啦！多谢多谢！

引用 11 楼 棉猴的回复:[quote=引用 9 楼 SuperDay 的回复:] [quote=引用 8 楼 RockyXRQ 的回复：][quote=引用 2 楼 棉猴 的回复:] 给Test1分配空间！  	struct Words_Malloc * Test1 = new Words_Malloc(); 	getName(Test1); 	getName_Free(Test1); 	delete Test1; VS2015调试结果 嗯呢！我用malloc直接分配内存可以用了，但是用new动态分配好像过不了编译诶 [/quote]new是C++操作符，malloc是C函数[/quote] 那就用malloc()和free()函数[/quote] 好der！多谢老哥！

引用 5 楼 SuperDay 的回复:[quote=引用 4 楼 RockyXRQ 的回复:] [quote=引用 1 楼 SuperDay 的回复:] 这个str1有没分配空间呢？调用getName的代码在哪里？ 调用 调用getName函数的文件在Main.cpp里 QWQ[/quote]  就像 楼上说的，你没给str1分配空间[/quote] 嗯嗯，我现在手动用malloc给结构体变量分配空间了，成功解决！多谢老哥！

引用 4 楼 RockyXRQ 的回复:[quote=引用 1 楼 SuperDay 的回复:] 这个str1有没分配空间呢？调用getName的代码在哪里？ 调用 调用getName函数的文件在Main.cpp里 QWQ[/quote]  就像 楼上说的，你没给str1分配空间

引用 1 楼 SuperDay 的回复:这个str1有没分配空间呢？调用getName的代码在哪里？ 调用 调用getName函数的文件在Main.cpp里 QWQ

指针都得指向一块内存，给你结构体指针分配

这个str1有没分配空间呢？调用getName的代码在哪里？

引用 9 楼 SuperDay 的回复:[quote=引用 8 楼 RockyXRQ 的回复：][quote=引用 2 楼 棉猴 的回复:] 给Test1分配空间！  	struct Words_Malloc * Test1 = new Words_Malloc(); 	getName(Test1); 	getName_Free(Test1); 	delete Test1; VS2015调试结果 嗯呢！我用malloc直接分配内存可以用了，但是用new动态分配好像过不了编译诶 [/quote]new是C++操作符，malloc是C函数[/quote] 那就用malloc()和free()函数


Question: 这个题的答案前为什么有四个空格

不光是空格啊，非字母的都是

引用 1 楼 user-2的回复:。。。。。。。。我只看到了三个空格。 😂我眼瞎看错了……

。。。。。。。。我只看到了三个空格。


Question: 新人求教

感谢大佬指点

简单说就是循环没有在我们想要的结果那儿结束。

此时w已经变成了我们想要的结果，但是p1依然在加1，因此指向了第4个下标即3的位置，同理p2减1指向了第3个位置即4。  然后又继续循环了，于是又变回原来的样子了。

我是说如果加*的话，就是指针p1和p2所指的字符比大小，'1'<'6'不也是真的吗？为什么加了*运行结果就变了？

不加星号是比较地址的大小，不是比值的大小，地址和值要分清啊

P1，P2是指针，初值分别指向了数组的第一个元素（下标为0），和最后一个元素。是指针那么就代表地址，就是第一个元素和最后一个元素的地址。P1<P2就是比较数组谁先谁后，循环体交换两个位置的数值，然后改变指针位置P1向后，P2向前，最终将数组反序

这里的p1,p2前为啥不加星号？ 这是比较字符串里面两个位置的先后（用指针），而不是比较字符串里面的字符（用星号，结果是char）


Question: 文件操作

不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

你外面用fscanf，内循环用fgetc然后fscanf，衔接的时候怕是会有差错

#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { 	char a[4]; 	char b[4]; 	int i; 	int num; 	int total; 	FILE*fp; 	fp=fopen("C:\\Users\\DELL\\Documents\\Tencent Files\\3100515163\\FileRecv\\数据库实验一.txt","r+"); 	if(fp==NULL) 	{ 		printf("This is error"); 		exit(0); 	} 	scanf("%s",a); 	while(feof(fp)==0) 	{ 		fscanf(fp,"%s",b); 		printf("%s ",b); 		while(strcmp(a,b)==0) 		{ 			if(fgetc(fp)!='\n') 			{ 				fscanf(fp,"%s",b); 				i++; 			    total=total+atoi(b); 			} 			num=total/i; 			sprintf(fp,"%d",num); 			break; 		} 	} } 这样好看点


Question: 求解

贴个代码瞧一瞧

没代码没真相


Question: 求大神解答

引用 4 楼 user-1的回复:C#版块应该比这边还有热闹，也容易得到解决，这个页面里面找到移动帖子的功能，直接可以移过去 好的，我去看看，谢谢你呢

在开发语言/框架这一层，上面几个，有个.NET技术，里面有个C#

引用 1 楼 user-1的回复:C#问题请移至C#版块中 就是没有找到C#版块

C#问题请移至C#版块中


Question: matlab 和 C语言 在矩阵运算时结果不一样

哦哦  漏了 还可以使用第三方库  比如 gun mpc

double 有限数据也就最多16位把 前面16个数字是准确的是 后面的数据不准确  如果你要精度更高的浮点操作 要么看编译器有没有额外扩展浮点类型 要么自己手动模拟浮点类型计算


Question: #C语言计时器，

歪楼歪成这样了？核心是计时器好吧？你这样做计时器是不准的：首先sleep个人觉得，不是特别精准；其次，在slepp之前，还有很多代码指令需要执行，你是无法精确控制其执行时间的。

引用 3 楼 [魂魄的回复:] [quote=引用 1 楼 wowpH的回复:]最近总是看到有人不用int main()的。。。我实在是想知道你们学的是哪位大神的书，教你们这么写的 我不知道那么int main()会多些什么东西么，求指点[/quote]  main函数返回给调用者（一般是shell，windows就是命令行或者bat命令），0表示正常退出

我记得最早谭浩强的书上都是这么写的，现在这么多年过去了，不知道怎样

引用 1 楼 wowpH的回复:最近总是看到有人不用int main()的。。。我实在是想知道你们学的是哪位大神的书，教你们这么写的 我不知道那么int main()会多些什么东西么，求指点

引用 1 楼 wowpH的回复:最近总是看到有人不用int main()的。。。我实在是想知道你们学的是哪位大神的书，教你们这么写的 我也想知道，不写函数类型的


Question: 想玩迷宫。。。编译错误，我快疯了在，怎么搞！

你的主函数呢

引用 2 楼 user-3的回复:main函数都没看到 一开始是写的int main()，后面说要调用 int getch()，然后我懵了

仅供参考：/**  * @Title  老鼠走迷宫的拓展探究  * @Author 孙琨  * @Date   2013-11-16  * @At     XUST  * @All Copyright by 孙琨  *  */  #include <iostream> using namespace std;  int maze[9][9] = { // 初始化迷宫，英文maze为“迷宫”     {2,2,2,2,2,2,2,2,2},     {2,0,0,0,0,0,0,0,2},     {2,0,2,2,0,2,2,0,2},     {2,0,2,0,0,2,0,0,2},     {2,0,2,0,2,0,2,0,2},     {2,0,0,0,0,0,2,0,2},     {2,2,0,2,2,0,2,2,2},     {2,0,0,0,0,0,0,0,2},     {2,2,2,2,2,2,2,2,2} };  int startI = 1,startJ = 1; // 入口行列坐标 int endI = 7,endJ = 7;     // 出口行列坐标  void visit(int i,int j)  // 自动搜寻路径 {     int m,n;      maze[i][j] = 1;      if((i == endI) && (j == endJ))     {         cout << endl << "显示路径:" << endl;         for(m=0; m<9; m++)         {             for(n=0; n<9; n++)             {                 if(maze[m][n] == 2)                     cout << "■";                 else if(maze[m][n] == 1)                     cout << "♀";                 else                     cout << "  ";             }             cout << endl;         }     }      if(maze[i][j+1] == 0)         visit(i,j+1);     if(maze[i+1][j] == 0)         visit(i+1,j);     if(maze[i][j-1] == 0)         visit(i,j-1);     if(maze[i-1][j] == 0)         visit(i-1,j);      maze[i][j] = 0;  }  int main(void) {     int i,j;      cout << "显示迷宫: " << endl;     for(i=0; i<9; i++)     {         for(j=0; j<9; j++)         {             if(maze[i][j] == 2)                 cout << "■" ;             else                 cout << "  " ;         }         cout << endl;     }      visit(startI,startJ);      return 0; }

main函数都没看到

身为小白的我太难了，电子版啊哈c上抄过来的，然后运行不了🙃🙃🙃


Question: 关于BMP图像处理（急求大佬解答）


Question: 二叉树的非递归后序遍历，为什么会一直崩溃，求助各位大神了

可是后序遍历的序列是bac，请问大神知道问题所在吗

程序审核：不合格，打回重写。

引用 6 楼 qq_41857189 的回复:我自己调试了一下发现  	while(p||!StackEmpty(S)){ 		if(p){ 			Push(S,*p); 			p=p->lchild; 		}else{ 			GetTop(S,e); 			if(e.rchild&&e.rchild!=r){ 				p=e.rchild; 				Push(S,*p); 				p=p->lchild; 			}else{ 				Pop(S,e); 				printf("%c",e.data); 				r=&e; 				p=NULL; 			}    		} 	} 返现p=NULL之后这一行会自动返回while循环，不是应该返回if(p)这一层吗，我的输入数据为 ab接着两个空格c接着两个空格,一个很简单的二叉树。最后运行会无限输出c.没出现你这种情况。

我的输入数据ab  c   运行截图：

引用 4 楼 wowpH 的回复:[quote=引用 1 楼 user-4 的回复:] 你确定你这个能跑么？我跑都跑不了啊可以跑，命名为.cpp就行。  楼主可不可以把你的输入数据发一下。[/quote]  我自己调试了一下发现  	while(p||!StackEmpty(S)){ 		if(p){ 			Push(S,*p); 			p=p->lchild; 		}else{ 			GetTop(S,e); 			if(e.rchild&&e.rchild!=r){ 				p=e.rchild; 				Push(S,*p); 				p=p->lchild; 			}else{ 				Pop(S,e); 				printf("%c",e.data); 				r=&e; 				p=NULL; 			}    		} 	} 返现p=NULL之后这一行会自动返回while循环，不是应该返回if(p)这一层吗，我的输入数据为 ab接着两个空格c接着两个空格,一个很简单的二叉树。最后运行会无限输出c.

引用 1 楼 user-4 的回复:你确定你这个能跑么？我跑都跑不了啊可以跑，命名为.cpp就行。  楼主可不可以把你的输入数据发一下。

引用 1 楼 user-4的回复:你确定你这个能跑么？我跑都跑不了啊 我用devc++，可以跑呀，你用的是什么编译器

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

你确定你这个能跑么？我跑都跑不了啊


Question: 萌新求助。

黄色方框的意思就是让你给出对应的数据类型 一般大概的形式就是  scanf("%d",&input); 其中根据你的需求可以改变百分号之后的字母，代表着不同的输入类型 最后的变量名也需要自己提前定义


Question: 72是从哪里冒出来的

我犯了低级错误

数组的下标初值是从0开始的。比如数组长度为3，实际只有a[0],a[1],a[2]。你在输入时没有对a[0]赋值

以下是VS2015调试结果  主要原因是 	for (i = 1; i <= n; ++i) 	{ 		scanf("%d", &a[i]);//i是从1开始的 	} 因为i是从1开始的，所以a[0]没有被赋值。所以应该修改为 	for (i = 0; i < n; ++i) 	{ 		scanf("%d", &a[i]); 	} 此时的输出为

a[0]没初始化

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


Question: 怎么输入日期并进行计算

输入时可以这样scanf("%d:%d",&hours,&mins) 这样就自动省略冒号了

格式有什么问题呢？麻烦把代码贴出来看看


Question: 能看看错误在哪里吗

引用 楼主 尔玉先生 的回复:#include<stdio.h> #include<stdlib.h> #define MAX 100 typedef int datatype; typedef struct{    int size;    datatype a[MAX]; }sequence_list; int main() { 	void display(sequence_list slt); 	sequence_list menu; 	menu.a[]={0,1,2,3,4,5,6,7,8,9}; 	menu.size=10; 	display(menu); } void display(sequence_list slt) { int i; for(i=0;i<slt.size;i++)   printf("%5d",slt.a[i]);  } 声明不要放在主函数中；放到main()前面


Question: 约瑟夫问题

//////////////////////////////////////////////////////////////////////////////// // 文件名： array_jose.c // 作者：   cfjtaishan // 版本：   1.0 // 日期：   2013-10-31 // 描述：   约瑟夫环, 数组实现； // 历史记录： /////////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <stdlib.h>  #define OUT_FLAG 7  /*初始化数组*/ int *init_arr(int *a, int len) { 	int i = 0;  	for(; i < len; i++) 		printf("%d ", a[i] = i+1); 	printf("\n");  	return a; }  /*约瑟夫环1*/ void print_out_order(int *a, int len) { 	/*      * num:队列中非0数字的个数      * mark:出列的标记数      * ret:最终剩下的数      * row:换行打印标记      */ 	int num = 0, row = 1, mark = 0, ret; 	int j;  	while(num != 1){ 		num = 0; 		for(j = 0; j < len; j++){ 			if(a[j] != 0){ 				num++; 				mark++; 				ret = a[j]; 			} 			if(mark == OUT_FLAG){ 				printf("%2d%c", a[j], !(row % 10) ? '\n' : ' '); 				a[j] = 0; 				mark = 0; 				row++; 			} 		} 	} 	printf("\n\n--------\"%d\" is the last one!\n", ret); }  /*约瑟夫环2*/ void print_out_order2(int *a, int len) { 	int i, count = 0, rem = len;  	for(i = 0; rem > 1; i++){ 		if(i > (len-1)) 			i = 0; 		if(a[i]){ 			count++; 			if(OUT_FLAG == count){ 				count = 0; 				printf("%d ", a[i]); 				a[i] = 0; 				rem--; 			} 		} 	} 	putchar('\n'); }  int main(void) { 	int len; 	printf("How many people in the queue?\n"); 	scanf("%d", &len);  	int *arr = (int *)malloc(sizeof(int) *len);     if (!arr) {         fprintf(stderr, "malloc error!\n");         return -1;     } 	init_arr(arr, len);  	printf("\nThe order of people quit queue is:\n"); 	print_out_order(arr, len); 	printf("---------proc 2-------------\n");  	int arr2[len]; 	init_arr(arr2, len);  	print_out_order2(arr2, len);      free(arr); 	return 0; } 供参考～

仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }


Question: 三目运算符求三个数的中值

比较长且不易理解的表达式可以分开来写～

这个有点长。。。。


Question: 三目运算符求三个数的中值

如果a＞b为真，执行第一个()，a和c比，如果a＞c为真，那么a是最大，只要再求出b和c谁更大，就得出第二大了,如果a＞c为假那么c是最大，a就是第二大了。  如果a＞b为假，执行第二个()，b＞c为真，那么b最大，输出a和c谁更大，就得出第二大，如果b＞c为假，那么c是最大，b就是第二大。

这些写没什么问题，只是比较长比较不易理解，我的意思一眼看不出这个三目运算符是做什么。

一次三目运算一行。你这样写，除了你自己，谁愿意看啊

有问题吗？这样写代码，看起来都费劲


Question: 为什么最后会停止运行？

引用 1 楼 user-3的回复:a[3]空间不够，你这都9个元素了 原来如此，谢谢你了啊

数组越界了，定义的是3个元素，输入9个元素。 数组越界是未定义行为，可能出现正常，也可能异常～

a[3]空间不够，你这都9个元素了


Question: 数据结构顺序表学生信息管理系统

这个是修改了你的一些明显的错误，能够运行了，你试试 #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAXSIZE 100 #define students elemtype #define error 0 #define ok 1 #define overflow -1 typedef char status; typedef struct { 	int id;  	char name[20]; 	int score;   }elemtype;   typedef struct  { 	elemtype *elem;/*顺序表中的元素*/  	int length;/*顺序表中的长度*/   }Sqlist;                                      status Initlist(Sqlist *L)  /*初始化顺序表函数，建立一个空表*/   { 	L->elem=(elemtype*)malloc(MAXSIZE*sizeof(elemtype)); 	if(!L->elem) 		exit(overflow); 	L->length=0; 	return ok; } status Getelem(Sqlist L,int i,elemtype e) /*顺序表的取值*/  { 	if(i<1||i>L.length) 		return error; 	e=L.elem[i-1]; 	return ok; }  int Locateelem(Sqlist L,elemtype e)/*顺序表的查找*/ { 	int i; 	for(i=0;i<L.length;i++) 	{ 		if(L.elem[i].id==e.id) 			return i+1; 	} 	return 0; } status Listinsert(Sqlist L,int i,elemtype e)/*顺序表的插入*/  { 	int j; 	if((i<1)||(i>L.length+1)) 		return error; 	if(L.length==MAXSIZE) 		return error; 	for(j=L.length-1;j>=i-1;j--) 	{ 		L.elem[j+1]=L.elem[j]; 	} 	L.elem[i-1]=e; 	++L.length; 	return ok; } status Listdelete(Sqlist L,int i)/*顺序表的删除*/  { 	int j; 	if((i<1)||(i>L.length)) 		return error; 	for(j=i;j<=L.length-1;j++) 		L.elem[j-1]=L.elem[j]; 	L.length--; 	return ok;  }  void printflist(Sqlist L)/*把顺序表L中的内容输出出来*/  { 	int i; 	printf("目前顺序表中的学生信息为:\n"); 	for(i=0;i<L.length;i++) 	{ 	 	printf("id；%d name；%s score；%d\n",L.elem[i].id,L.elem[i].name,L.elem[i].score); 	}  	printf("\n"); } void Insert(Sqlist L)/*新插入一个内容的插入函数使用了Listinsert函数*/  { 	int local; 	elemtype e; 	int news; 	printf("请输入要插入的地址及内容\n"); 	printf("地址；"); 	scanf("%d",&local); 	printf("id:"); 	scanf("%d",&e.id); /*输入插入的id号*/  	printf("name:"); 	scanf("%s",&e.name); /*输入插入的姓名*/  	printf("score:"); 	scanf("%d",&e.score); /*输入插入的成绩*/  	news=Listinsert(L,local,e); 	printf("插入成功！");  	printflist(L); } void deleted(Sqlist L)/*删除顺序表中的内容的函数使用了 Listdelete函数*/ { 	int local; 	int news; 	printf("请输入你要删除的地址:"); 	scanf("%d",&local); 	news=Listdelete(L,local); 	if(news) 	{ 		printf("删除成功！\n"); 		printflist(L); 	} 	else 		printf("删除失败！\n");  	printf("\n"); } void search(Sqlist L)/*通过输入id号码来查找顺序表中的学生的全部信息使用了Locateelem函数*/  { 	int news; 	elemtype e; 	printf("请输入你要查找的id学号；"); 	scanf("%d",&e.id); 	news=Locateelem(L,e); 	if(news)  		printf("查找成功！该元素位置为：%d\n",news); 	else 		printf("未找到该元素！\n"); 	printf("\n"); } int main()/*主函数*/  { 	Sqlist a;/*定义了一个新的顺序表*/  	int m,n,t; 	Initlist(&a);/*让这个顺序表a为空表*/  	printf("请输入要录入信息的学生的数量n:"); 	scanf("%d",&n); 	elemtype e; 	printf("请输入录入学生的基本信息\n");  	for(t=0;t<n;t++)/*使用for循环来控制第一次要输入程序中的学生信息人数*/  	{ 		printf("请输入第%d个学生的信息:\n",t+1); 		printf("id:"); 		scanf("%d",&a.elem[t].id); /*id信息*/  		printf("name:"); 		scanf("%s",&a.elem[t].name); /*姓名信息*/  		printf("score:"); 		scanf("%d",&a.elem[t].score);/*成绩信息*/  		a.length++; 		printf("\n"); 	} 	printflist(a);/*把输入到程序中的全部学生信息输出出来*/  	while(1)/*恒成立来进行循环*/  	{  		printf("1 is insert\n"); 		printf("2 is delete\n"); 		printf("3 is search\n"); 		printf("4 is break\n"); 		printf("请输入你要执行的操作序号m；"); 		scanf("%d",&m); 		if(4==m) break;/*输入4来让系统结束循环*/  		switch(m)/*选择要操作的内容*/  		{ 			case 1:Insert(a);break; 			case 2:deleted(a);break; 			case 3:search(a);break; 		} 	} }

这个程序什么问题啊


Question: 求大佬解释一下，这个题目什么意思。输入一个n(n<100)

引用 6 楼 自信男孩的回复:[quote=引用 5 楼 weixin_45661217 的回复:] [quote=引用 3 楼 飞奔的小强sky的回复:]对啊，圈越来越小，最后只剩下一个，这个问题算是数学问题，你用代码模拟实际情况算的太慢了，我记得可以推导出一个结果，一个公式直接得出。 可是我看题目的意思是只砍掉n啊[/quote] 砍掉第一个n后，再从1开始算，数到n再砍掉一个，依次类推[/quote] 哦，大佬就是大佬，明白了

引用 5 楼 weixin_45661217 的回复:[quote=引用 3 楼 飞奔的小强sky的回复:]对啊，圈越来越小，最后只剩下一个，这个问题算是数学问题，你用代码模拟实际情况算的太慢了，我记得可以推导出一个结果，一个公式直接得出。 可是我看题目的意思是只砍掉n啊[/quote] 砍掉第一个n后，再从1开始算，数到n再砍掉一个，依次类推

引用 3 楼 飞奔的小强sky的回复:对啊，圈越来越小，最后只剩下一个，这个问题算是数学问题，你用代码模拟实际情况算的太慢了，我记得可以推导出一个结果，一个公式直接得出。 可是我看题目的意思是只砍掉n啊

建议查一下约瑟夫环，原理就是这样的～

引用 1 楼 飞奔的小强sky的回复:比喻成一个圈，从一个点开始，走n步，砍掉一截，再围成圈 大佬你是说从1到n都砍掉吗

比喻成一个圈，从一个点开始，走n步，砍掉一截，再围成圈


Question: 大佬们，这道题怎么做，刚学C语言

……………………………………………………………………做出来啦！！

这个太简单了，你出50元找小学生帮你写就可以了~~~

可以定义数组，然后用数组来进行运算

引用 1 楼 自信男孩 的回复:这个不难呢，建议自己先写写，遇到问题再发出来。  定义一个数组，然后遍历数组，并分别定义一个个数和平均值。 没必要数组，每输入一个判断奇偶然后分别计数和累加就好了

支持楼上上上上


scanf_s("%c%c", &c1, 1, &c2, 1); 这样试试～

scanf_s()函数不能输出啊，所以代码修改为 	printf("a="); 	scanf_s("%d", &a); 	printf("b="); 	scanf_s("%d", &b); 运行效果为

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


Question: 那个大佬能给我解释解释值传递和引用传递指针传递啊

switch ... break是基本的语法，建议网上或课本上查一下～  再通过程序验证一下最好～

反正形参是临时创建的，并用传入的实参赋值。 这个理解吧？ 然后如果传入的是值，那么你怎么修改形参，外面的变量都受影响。 但是如果你传入的是一个指针，我们就可以根据了这个指针修改所指向的位置的变量值了。 理解吗？ 理解就采纳。

理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素


Question: 车站问题（栈），这代码一旦出现栈空的情况就不行，题目给出

这是自学成才呀

我已经明白啦，是while里面还要加上一个条件就是!s.empty()，而且还要放在条件中的最前面，不然s.top()就会发生错误！！！！ 教训：while（）是从左到右扫描的，如果扫描到一个不满足循环条件就会退出循环！！

对了还有一张图片


Question: 汉诺塔

汉诺塔是经典的递归，还是很好懂的

引用 1 楼 赵4老师的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出 谢谢，我知道了

引用 2 楼 仰望星空，脚踏实地111的回复:这个链接有代码，讲的比较详细：https://www.cnblogs.com/destiny1123/articles/4242398.html 谢谢我已经知道了，谢谢


Question: 链表问题

#include<stdio.h> #include<stdlib.h>  struct shoplist {     char Name[20];     int num;     float price;     float distance;     struct shoplist* pNext; };  int iCount;  struct shoplist* Create() {     struct shoplist* pHead = NULL;     struct shoplist* pEnd,*pNew;      iCount = 0;     pEnd = pNew =(struct shoplist*)malloc(sizeof(struct shoplist));     printf("Please enter the name:\n");     //scanf("%s",&pNew->Name);     scanf("%s", pNew->Name);     printf("Please enter the amount:\n");     scanf("%d", &pNew->num);     printf("Please enter the price:\n");     //scanf("%.2f", &pNew->price);     scanf("%f", &pNew->price);     printf("Please enter the distance/(km):\n");     //scanf("%.2f",&pNew->distance);     scanf("%f", &pNew->distance);     while(pNew->num != 0)     {         iCount ++;         if(iCount == 1)         {             pNew->pNext = pHead;             pEnd = pNew;             pHead = pNew;         }         else         {             pNew->pNext = NULL;             pEnd->pNext = pNew;             pEnd = pNew;         }         pNew = (struct shoplist*)malloc(sizeof(struct shoplist));         printf("Please enter the name:\n");         //scanf("%s",&pNew->Name);         scanf("%s", pNew->Name);         printf("Please enter the amount:\n");         scanf("%d", &pNew->num);         printf("Please enter the price:\n");         //scanf("%.2f",&pNew->price);         scanf("%f", &pNew->price);         printf("Please enter the distance/(km):\n");         //scanf("%.2f",&pNew->distance);         scanf("%f", &pNew->distance);     }      free(pNew);      return pHead;  }  void Print(struct shoplist* pHead) {     struct shoplist *pTemp;     int iIndex = 1;      printf("-----the list has %d classes:-----\n",iCount);     printf("\n");     pTemp = pHead;      while(pTemp != NULL)     {         printf("the NO%d class is:\n",iIndex);         printf("the name is:%s\n",pTemp->Name);         printf("the amount is:%d\n",pTemp->num);         printf("the price is:%.2f\n",pTemp->price);         printf("the distance is:%.2f\n",pTemp->distance);         printf("\n");         pTemp = pTemp->pNext;         iIndex ++;     } }  struct shoplist* Insert(struct shoplist* pHead) {     struct shoplist* pNew;     printf("---Insert new member at first---\n");     pNew = (struct shoplist*)malloc(sizeof(struct shoplist));      //scanf("%s",&pNew->Name);     scanf("%s", pNew->Name);     scanf("%d",&pNew->num);     //scanf("%.2f",&pNew->price);     scanf("%f",&pNew->price);     //scanf("%.2f",&pNew->distance);     scanf("%f", &pNew->distance);      pNew->pNext = pHead;     pHead = pNew;     iCount++;      return pHead; }  //void Delete(struct shoplist* pHead,int iIndex) struct shoplist *Delete(struct shoplist* pHead,int iIndex) {     int i;     struct shoplist* pTemp;     struct shoplist* pPre;     pTemp = pHead;     pPre = pTemp;      printf("---delete NO%d member---\n",iIndex);     if (iIndex == 1) {         pTemp = pHead;         pHead = pHead->pNext;         free(pTemp);         iCount--;         return pHead;     }     //for( i=1 ; i<iIndex ; i++ )     for( i = 1 ; i<iIndex ; i++ )     {          pPre = pTemp;         pTemp = pTemp->pNext;      }     pPre->pNext = pTemp->pNext;     free(pTemp);     iCount--;      return pHead; }  int main() {     struct shoplist* pHead;      pHead = Create();     Print(pHead);     pHead = Insert(pHead);     Print(pHead);     pHead = Delete(pHead,2);     Print(pHead);      return 0; } 供参考～  建议对比一下，找出自己的问题～

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633


Question: C语言

引用 3 楼 wowpH 的回复:嵌入式还要会汇编吧 可以了解，会看，看得懂，没必要做到要会写～

c的指针的深度理解是重点，另外需要对内存空间分配，中断，优先级，程序执行顺序，这些要理清楚。

嵌入式还要会汇编吧

好好计算手里的硬件 资源

友情支持，UP


Question: C语言不换行，不空格可以吗？

引用 3 楼 lin5161678 的回复:不行的  预编译指令需要换行 +1 其他部分可以

C语言编译器不是按找空格和换行来解析的，它是按照语法来解析；所以即使一个程序写成一行也没问题。  不过也不要较真，不要考虑把代码写成没有空格一行，这样编译器肯定不识别～

不行的  预编译指令需要换行

在我的资源里找”怪异代码大赛“

C 用;表示行，把代码写成一行也可以。没有缩进要求，空格数量大于等于1吧。void main(){int a     =  10;int b =1;}


Question: c语言求余数，输入了两个数，最后输出结果仍然是第一个数

16838  %  65536 = 16838，因为16838比65536小

那你认为是多少？ a < b时，a % b就是等于a，如果你理解不是a，说明你得重新去看看%的定义 引用 3 楼 Gnglas 的回复:[quote=引用 2 楼 user-5 的回复:] 16838  %  65536 = 16838 你的程序没有问题，结果也没有问题呀。我怎么感觉哪不对 [/quote]

也不能说是数学没学好，因为数学中%不是求余数的。

连这么严肃的地方也想笑死我吗

这是数学没学好，不是C语言没学好...

#include<stdio.h> extern unsigned int rand0(void); extern void srand1(unsigned int x); int main(void) { 	int count; 	for (count = 0; count < 5; count++) 		printf("%d\n", rand0()); 		return 0;  } static unsigned long int next = 1; unsigned int rand0(void) { 	next = next * 1103515245 + 12345; 	return (unsigned int)(next / 65536) % 32768; } void srand1(unsigned int seed) { 	next = seed; } 我只是想测试这段代码的运算过程

引用 2 楼 user-5 的回复:16838  %  65536 = 16838 你的程序没有问题，结果也没有问题呀。我怎么感觉哪不对

你这又没错。。。。。


Question: 求大佬帮小白看一下问题所在

void sort_list(pnode Phead,int len) {     pnode p = Phead->pnext;     pnode q;     q = p->pnext;     int t;     int i, j;     for (i = 0,p;i<len - 1;i++,p=p->pnext)     {         for (j=i+1,q;j<len;j++,q=q->pnext)         {             if(p->data > q->data)             {                 t = p->data;                 p->data = q->data;                 q->data = t;             }         }     } } 调试到这个程序的时候有问题，但是不知道问题所在，百度好像是说跟野指针的问腿。


Question: 数组下标为unsigned char时

int b[300];   9         for(i=0;i<300;i++){ 如果想验证下表（unsigned char)到255之后就变成0，可以这样测试一下～

我随便写了个测试程序： struct TEST{ int t_a[2]; int t_b; };  main里： struct TEST tt; tt.t_a[0] = 1; tt.t_a[1] = 2; tt.t_b = 3; printf("%d %d %d",tt.t_a[0],tt.t_a[1],tt.t_a[2]);  结果是 ： 1 2 3  越界什么规律？就是往后又读了一段长度呗。  首先我为什么用结构体测试： 在一个结构体的话,两个成员应该是挨着在内存上分配空间的。我们常把结构体指针转成 void* 类型又能再转回来结构体，应该就是因为这个。 然后为什么两个都是int： 越界之后应该是又读了一个int长度，长度不同应该会出错吧。 变量，应该就是拿着那个类型的长度，按首地址去内存上取数据吧。 你越界了是0，大概是后面的内存上没东西吧  我把tt_b注释掉之后的结果是 ：-1623938304 等等 一直在变化  另外我把代码改成： struct TEST{ int t_a[2]; };  struct TEST tt; int bb = 10; tt.t_a[0] = 1; tt.t_a[1] = 2; printf("%d %d %d",tt.t_a[0],tt.t_a[1],tt.t_a[2]);  得到的结果依旧是乱码。由此可见就算你是连续定义了俩变量，内存上也并不一定紧挨着。  以上全是我个人对代码和内存的理解。抱歉我没学过什么书，专业的话讲不来。

引用 8 楼 weixin_45528310 的回复:[quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote] 访问不可访问的内存时才会段错误,c/c++不会对越界进行检查.b和i的内存是连续的,b的内存访问越界后就会访问到i的地址去,具体的原理你还是去看下相关的书吧

引用 11 楼 user-4的回复:[quote=引用 10 楼 weixin_45528310 的回复:] [quote=引用 9 楼 user-4的回复:][quote=引用 8 楼 weixin_45528310 的回复:] [quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote]  选死循环和越界？肯定是越界  至于会不会死循环，这个是不能确定的，越界的后果可能是死循环，有可能是程序崩溃。但是我可以告诉你，我见过一个越界了的程序，平安无事的跑了很长一段时间吗？（实际情况是确实是越界了）[/quote] 曾经老师给我说你纠结他乱码规则干什么。但是这个越界确实有规律啊。只要一越界就会归零。而且测试是了很多次。[/quote]  建议你带着十万个为什么去学习编译原理和汇编程序[/quote] 可以我会好好去看的。thank you.

引用 10 楼 weixin_45528310 的回复:[quote=引用 9 楼 user-4的回复:][quote=引用 8 楼 weixin_45528310 的回复:] [quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote]  选死循环和越界？肯定是越界  至于会不会死循环，这个是不能确定的，越界的后果可能是死循环，有可能是程序崩溃。但是我可以告诉你，我见过一个越界了的程序，平安无事的跑了很长一段时间吗？（实际情况是确实是越界了）[/quote] 曾经老师给我说你纠结他乱码规则干什么。但是这个越界确实有规律啊。只要一越界就会归零。而且测试是了很多次。[/quote]  建议你带着十万个为什么去学习编译原理和汇编程序

引用 9 楼 user-4的回复:[quote=引用 8 楼 weixin_45528310 的回复:] [quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote]  选死循环和越界？肯定是越界  至于会不会死循环，这个是不能确定的，越界的后果可能是死循环，有可能是程序崩溃。但是我可以告诉你，我见过一个越界了的程序，平安无事的跑了很长一段时间吗？（实际情况是确实是越界了）[/quote] 曾经老师给我说你纠结他乱码规则干什么。但是这个越界确实有规律啊。只要一越界就会归零。而且测试是了很多次。

引用 8 楼 weixin_45528310 的回复:[quote=引用 7 楼 Mapleas的回复:]你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。[/quote]  选死循环和越界？肯定是越界  至于会不会死循环，这个是不能确定的，越界的后果可能是死循环，有可能是程序崩溃。但是我可以告诉你，我见过一个越界了的程序，平安无事的跑了很长一段时间吗？（实际情况是确实是越界了）

引用 7 楼 Mapleas的回复:你如果是想问为什么i=20的时候after i = 0,那是因为你数组越界了,内存中存放b[20]数据的时候以14 00 00 00的形式存放20这个数字,其中某个00把i的内存给改写了,i的内存被改为00. 我就是奇怪了为什么unsiged char 他越界会归零int 越界就段错误。 这个是那个面试题问什么错误。选死循环和越界。就是那道题的改编然后我来测试，就发现这个东西。  然后我就在哪儿铁头他是怎么个机制。为什么会呢是编译器的什么特性吗。

引用 2 楼 weixin_45528310 的回复:[quote=引用 1 楼 Mapleas的回复:]unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0 说清楚点你这些我都知道[/quote]  你数组b的空间是20，但是循环下标都到了29，数组越界了

引用 1 楼 Mapleas 的回复:unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0  unsigned char是0~255，char是-128~127，当累加到256的时候，都会回到0

引用 3 楼 weixin_45528310 的回复:[quote=引用 1 楼 Mapleas的回复:]unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0 还有你错了是0到255不是－255[/quote] 你要什么的解释,另外-255是打错

引用 1 楼 Mapleas的回复:unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0 还有你错了是0到255不是－255

引用 1 楼 Mapleas的回复:unsigned char取值范围是0~-255,对应二进制00000000~11111111共8位,256对应二进制100000000,取8位00000000=0 说清楚点你这些我都知道


Question: printf(“%-10s%-10.3s\n”，“computer”，“computer”)

引用 2 楼 user-2的回复:https://baike.baidu.com/item/printf%28%29/402521?fr=aladdin 多谢多谢！很清楚，很详细

引用 3 楼 45045399的回复:%-10s  左对齐，输出10位长度,以字符串方式打印，%-10.3s =>左对齐，输出10位长度，其中，有三位小数, \n换行符 太感谢你了大神太厉害了


Question: 写了一个C语言数据结构，信息的输入与输出，求帮忙看一下哪里的问题

引用 4 楼 wowpH的回复:[quote=引用 3 楼 qq_45661864 的回复:] 请问一下，那要怎么怎么改呢？我是在是没有头绪了 漏洞太多，先改了点明显的问题。还有一些你再看看。至少能运行了。  #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 80 typedef struct student { 	char no[11]; 	char name[10]; 	int math, computer; } student; student stu[N];// tu -> stu int n = 0; int menu() { 	int c; 	do { 		printf("\t==============学生管理系统==============\n\n"); 		printf("\t\t1.输入学生信息\n"); 		printf("\t\t2.输出学生信息\n"); 		printf("\t\t0:退出系统\n");// \\t -> \t 		scanf("%d", &c); 	} while (c < 0 || c > 2); 	return (c); } void Input() { 	char i; 	for (i = 0; i < 4; i++) { 		printf("输入学生学号:"); 		scanf("%s", stu[n].no); 		printf("输入学生姓名:"); 		scanf("%s", stu[n].name); 		printf("输入学生的数学成绩:"); 		scanf("%d", &stu[n].math);// %s -> %d， 加取地址符& 		printf("输入学生的计算机成绩:"); 		scanf("%d", &stu[n].computer);// %s -> %d    ，加取地址符& 		printf("请输入下一个?(Y\N)\n"); 	} } void Output() { 	int i; 	printf("--------------------------------------------------------------------------\n"); 	printf("学号 姓名 数学 计算机\n"); 	for (i = 0; i < n; i++) { 		printf("%-10s%-10s%-10d%-10d\n", stu[i].no, stu[i].name, stu[i].math, stu[i].computer); 		printf("--------------------------------------------------------------------------\n"); 	} } void main() { 	//struct student stu[N];// 这一行不要 	for (;;) { 		for (;;) { 			int n = 0; 			switch (menu()) { 			case 1: 				Input(); 				Output(); 				break; 			case 2: 				Output(); 				break; 			case 0: 				exit(0); 				break; 			deault: 				printf("*输入错误！*"); 				break; 			} 		} 	} }[/quote] 引用 3 楼 qq_45661864 的回复:请问一下，那要怎么怎么改呢？我是在是没有头绪了 漏洞太多，先改了点明显的问题。还有一些你再看看。至少能运行了。  #include <stdio.h> #include <string.h> #include <stdlib.h> #define N 80 typedef struct student { 	char no[11]; 	char name[10]; 	int math, computer; } student; student stu[N];// tu -> stu int n = 0; int menu() { 	int c; 	do { 		printf("\t==============学生管理系统==============\n\n"); 		printf("\t\t1.输入学生信息\n"); 		printf("\t\t2.输出学生信息\n"); 		printf("\t\t0:退出系统\n");// \\t -> \t 		scanf("%d", &c); 	} while (c < 0 || c > 2); 	return (c); } void Input() { 	char i; 	for (i = 0; i < 4; i++) { 		printf("输入学生学号:"); 		scanf("%s", stu[n].no); 		printf("输入学生姓名:"); 		scanf("%s", stu[n].name); 		printf("输入学生的数学成绩:"); 		scanf("%d", &stu[n].math);// %s -> %d， 加取地址符& 		printf("输入学生的计算机成绩:"); 		scanf("%d", &stu[n].computer);// %s -> %d    ，加取地址符& 		printf("请输入下一个?(Y\N)\n"); 	} } void Output() { 	int i; 	printf("--------------------------------------------------------------------------\n"); 	printf("学号 姓名 数学 计算机\n"); 	for (i = 0; i < n; i++) { 		printf("%-10s%-10s%-10d%-10d\n", stu[i].no, stu[i].name, stu[i].math, stu[i].computer); 		printf("--------------------------------------------------------------------------\n"); 	} } void main() { 	//struct student stu[N];// 这一行不要 	for (;;) { 		for (;;) { 			int n = 0; 			switch (menu()) { 			case 1: 				Input(); 				Output(); 				break; 			case 2: 				Output(); 				break; 			case 0: 				exit(0); 				break; 			deault: 				printf("*输入错误！*"); 				break; 			} 		} 	} }[/quote] 好的，非常非常感谢🌸🌸🌸

引用 2 楼 wowpH的回复:Output里面的printf里面用到的stu，不是全局变量，引用不了。 请问一下，那要怎么怎么改呢？我是在是没有头绪了

Output里面的printf里面用到的stu，不是全局变量，引用不了。

#include<stdio.h> #include<string.h> #include<stdlib.h> #define N 80 typedef struct student {   	char no[11]; 	char name[10]; 	int math,computer; }student; student stu[N]; int n=0; int menu() { 	int c; 	do{ 		printf("\t==============学生管理系统==============\n\n"); 		printf("\t\t1.输入学生信息\n"); 		printf("\t\t2.输出学生信息\n"); 		printf("\t\\t0:退出系统\n"); 		scanf("%d",&c); 	}while(c<0||c>2); 	return(c); } void Input() { 	char i; 	for(i=0;i<4;i++) 	{ 		printf("输入学生学号:"); 		scanf("%s",stu[i].no); 		 		printf("输入学生姓名:"); 		scanf("%s",stu[i].name); 		 		printf("输入学生的数学成绩:"); 		scanf("%d",&stu[i].math); 		 		printf("输入学生的计算机成绩:"); 		scanf("%d",&stu[i].computer); 		printf("请输入下一个?(Y\\N)\n"); 	} } void Output() { 	int i; 	printf("--------------------------------------------------------------------------\n"); 	printf("学号 姓名 数学 计算机\n"); 	for(i=0;i<n;i++) 	{ 		printf("%-10s%-10s%-10d%-10d\n",stu[i].no,stu[i].name,stu[i].math,stu[i].computer); 		printf("--------------------------------------------------------------------------\n"); 	} } int main() { 	struct student stu[N]; 	for(;;) 	{ 		for(;;) 		{ 			int n=0; 			switch(menu()) 			{ 				case 1:Input();Output();break; 				case 2:Output();break; 				case 0:exit(0);break; 				deault:printf("*输入错误！*");break; 			} 		} 	} }


Question: 请问各位大神，c语言两个字符串怎么产生关联

引用 7 楼 weixin_40290083的回复:如果是单纯的英文单词，那么6楼的方法就可以进行关联，但是大量的单词直接在程序中定义这么多的变量显然是不科学的，当单词有增加、删除、修改时需要重新编译程序，解决的办法是使用文本文件保存或者使用数据库，当需要时读取文本或者数据库，然后把读取到的数据（英文、中文）赋给Node变量的两个成员变量就可以了。 对对，我也觉得定义大量的变量来存放单词是有问题的，编程不应该这么费事费时，谢谢。

谢谢回复，这样就能把两个字符串关联在一起了吗？

typedef struct Node {     char english[50];     char chinse[100]; }Word;

引用 1 楼 weixin_40290083的回复:看不明白你的需求呀。 是我没说清楚，我是想编写一个测试英语单词的小程序，比如一个单词 和它的中文意思 ，怎么在c语言绑定起来，然后随机抽取一个单词，让你输入中文意思。或者抽取一个中文意思让你输入它的英文，然后在进行判断，看看是否正确。

既然实在看不明白需求，我就瞎蒙了啊～ char a[n][n],或者char **a，这样算吗？

看不明白你的需求呀。


Question: 毕设题目

怎么？毕设不是学校老师给题目，学生选吗


Question: 求助大佬C语言

首先要理解 s += *(t + i); C++中数组名可以作为数组的首地址使用。数组名是一个右值，不能对其进行自增或者自减处理，但是可以对其作为右值进行运算处理。对数组名进行运算处理可以看成是对数组地址进行了偏移。所以，*(t+i)实际上就是t[i] 对于for循环中， i += 2，可以看出i是以2作为步进的，即0，2，4，6，8 所以就是a[0]+a[2]+a[4]+a[6]+a[8]，最后等于25 请参考《C++数组地址偏》 希望能够帮到你

i++步长是1，i+=2步长是2 for循环内部 i = 0; s0=s+t[0+0]=0+t[0] = 0+1 = 1; i = 2; s1 = s0 +t[0+2] = 1+t[2] = 1+3 =4 i = 4; s2 = s1 +t[0+4] = 4+t[4] = 4+5 =9 	...

一个是步长要注意，二是输出最后一个值。 1  4  9 16 25  这是S经过循环的值。 那最后的答案就是25.

*（t+i）和t[i]都是对数组t和下标为i的元素的访问。所以 s +=*(t+i)和s+=t[i]的使用是相同的。

注意i += 2;并不是每个都遍历。  因此是：0 + 1 + 3 + 5 + 7 + 9


Question: c语言链表头结点的删除出了点毛病，小白求指点

#include<stdio.h> #include<stdlib.h>  struct node {     double s;     struct node *next; };  typedef struct node NODE;  NODE *creat(int n) {     NODE  *h,*p,*q;     int i;      h = p = q = (NODE*)malloc(sizeof(NODE));     h->next=NULL;      for(i=0;i<n;i++)     {         scanf("%lf", &q->s);         q=(NODE*)malloc(sizeof(NODE));         p->next=q;         p=q;     }     p->next=NULL;     return h; } void outlist(NODE *h) {     NODE* p=h;     while(p->next!=NULL)     {         printf("%-6.2f",p->s);         p = p->next;     }     putchar('\n'); } double fun(NODE *h,int n) {     NODE *p=h;     double ave=0.0;     while(p->next!=NULL)     {         ave+=p->s;         p=p->next;     }     return ave/n; } NODE* deletenode(NODE *h,int n,int m) {     NODE *p,*q,*s;     int i;     p=h;     if(m==1) {         //s = p;         //p = p->next;         s = h;         h = h->next;         free(s);         s = NULL;          return h;    //直接返回     }//这里代码出错了     q = p->next;     for(i = 2; i <= n && q->next!=NULL;i++)         {             if(i == m)             {                 p->next=q->next;                 s = q;                 //q=q->next;                 free(s);                 s=NULL;                 break;    //跳出循环             }             else             {                 p=p->next;                 q=q->next;             }         }      return h; } NODE* deletenode1(NODE *h,int x) {     NODE *p,*q,*s;     p=h;     q=p->next;     while(q)     {         if(x==q->s)         {             p->next=q->next;             s=q;             q=q->next;             free(s);             s=NULL;         }         else         {             p=p->next;             q=q->next;         }     }     return h; }  //void main() int main() {     NODE *h;     int n,m,x;     double ave;     printf("链表包含多少元素:\n");     scanf("%d",&n);     printf("请输入链表元素&enter:\n");     h=creat(n);     printf("下面输出链表元素:\n");     outlist(h);     ave=fun(h,n);     printf("链表元素平均值:ave=%-6.2f\n",ave);     printf("需要删除第几个链表元素:\n");     scanf("%d",&m);     //deletenode(h,n,m);     h = deletenode(h,n,m);     printf("下面输出删除后的链表元素:\n");     outlist(h);     printf("删除指定链表元素:\n");     scanf("%d",&x);     //deletenode1(h,x);     h = deletenode1(h,x);     printf("下面输出删除后的链表元素:\n");     outlist(h); }  供参考～  建议对比一下找出自己的问题。 另外，楼主的链表最后一个节点是无用的，建议优化一下链表把左后一个节点去掉～

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

结帖啦，谢谢各位啦,修改后代码如下  #include<stdio.h> #include<stdlib.h> struct node { 	double s; 	struct node *next; }; typedef struct node NODE; NODE *creat(int n) { 	NODE  *h,*p,*q; 	int i=0; 	h=p=(NODE*)malloc(sizeof(NODE)); 	h->next=NULL; 	while(i<n) 	{ 		q=(NODE*)malloc(sizeof(NODE)); 		scanf("%lf",&q->s); 		p->next=q; 		p=q; 		i++; 	} 	p->next=NULL; 	return h; } void outlist(NODE *h) { 	NODE* p=h; 	while(p->next!=NULL) 	{ 		p=p->next; 		printf("%-6.2f",p->s);	 	} 	putchar('\n'); } double fun(NODE *h,int n) { 	NODE *p=h; 	double ave=0.0; 	while(p->next!=NULL) 	{ 		p=p->next; 		ave+=p->s; 	} 	return ave/n; } int deletenode(NODE *h,int m) { 	NODE *p,*q; 	int i=0; 	double s; 	p=h; 	if((1>m) && (p->next==NULL)) 	{ 		printf("删除失败!\n"); 		return 0; 	} 	while(i<m-1) 	{ 		p=p->next; 		++i; 	} 	q=p->next; 	s=q->s; 	p->next=p->next->next; 	free(q); 	q=NULL; 	return s; } NODE* deletenode1(NODE *h,int x) { 	NODE *p,*q,*s; 	p=h; 	q=p->next; 	while(q) 	{ 		if(x==q->s) 		{ 			p->next=q->next; 			s=q; 			q=q->next; 			free(s); 			s=NULL; 		} 		else 		{ 			p=p->next; 			q=q->next; 		} 	} 	return h; } void main() { 	NODE *h; 	int n,m,x; 	double ave; 	printf("链表包含多少元素:\n"); 	scanf("%d",&n); 	printf("请输入链表元素&enter:\n"); 	h=creat(n); 	printf("下面输出链表元素:\n"); 	outlist(h); 	ave=fun(h,n); 	printf("链表元素平均值:ave=%-6.2f\n",ave); 	printf("删除指定链表元素:\n"); 	scanf("%d",&x); 	deletenode1(h,x); 	printf("下面输出删除后的链表元素:\n"); 	outlist(h); 	printf("需要删除第几个链表元素:\n"); 	scanf("%d",&m); 	deletenode(h,m); 	printf("下面输出删除后的链表元素:\n"); 	outlist(h); }

你得把编译结果贴出来呀

引用 1 楼 飞奔的小强sky的回复:我用脚丫子想都知道没人会闲的难受看你这么长的代码 我说了出错的地方，思路简单的小白，就是理解不了错误的地方该怎么改

我用脚丫子想都知道没人会闲的难受看你这么长的代码


Question: 关于反斜杠加上回车的效果的疑问

那个\是用来给代码中的字符串换行的，为了方便阅读，如果你会看预编译后的文件，你就能看到字符串变成了一行

程序不仅要实现功能，还要让其他人能读懂，写完代码不能保证没有错，要保证程序的可读性。

因为有时候要输出的东西很多的话，在写输出的东西时不换，一行写完的话，看的时候就要一直拉水平的那个东西就很烦

只是程序断行，实际和放在一行没有区别

哦哦，只是代码在下一行继续输入，但是编译还是在一行对吧

帮帮孩子，大一新生，我太难了


Question: C

现在没有直接打印二进制数据的接口，建议可以通过%x打印出16进制，然后再按照16进制转为2进制。对于%lf格式（双精度） 的数据，可以考虑%x %x，通过高32位和低32位分别打出。  对于浮点数，并不会像整型数那么简单的理解，建议从网上查一下浮点数在内存里的表示方式～

浮点数格式 http://bbs.csdn.net/topics/390676437


Question: c#

输出一个数字再输出一个空格。

引用 1 楼 user-2的回复:楼主说的是不是二维数组的变换，直接取数组的脚标【1~ n，0】，然后输入到【0，1~n】 不是，就是让数据由竖着显示，变成横着显示。


Question: 这个程序如何解

引用 6 楼 自信男孩的回复:[quote=引用 4 楼 听我的苹果包 的回复:] [quote=引用 1 楼 自信男孩的回复:]从2层循环上来看，就是把数组中的元素值相加，那不就是1+2+3+4+5吗？ 怎么会少个2呢？ 我不是计算机专业的，在为转专业做准备，没有老师教，所以有一些蠢的问题还请包含[/quote] 没有责备的意思啊，你别有心里压力～我只是反问一下；  如果想进入这个行业，类似你认为或者大家认为“愚蠢”的问题都可能出现，大家都是从菜鸟一步一步过来的， 好好努力就好了，千万不要畏缩不前和有心理负担～[/quote] 嗯嗯好的谢谢啦，我会努力的

引用 4 楼 听我的苹果包 的回复:[quote=引用 1 楼 自信男孩的回复:]从2层循环上来看，就是把数组中的元素值相加，那不就是1+2+3+4+5吗？ 怎么会少个2呢？ 我不是计算机专业的，在为转专业做准备，没有老师教，所以有一些蠢的问题还请包含[/quote] 没有责备的意思啊，你别有心里压力～我只是反问一下；  如果想进入这个行业，类似你认为或者大家认为“愚蠢”的问题都可能出现，大家都是从菜鸟一步一步过来的， 好好努力就好了，千万不要畏缩不前和有心理负担～

引用 3 楼 听我的苹果包 的回复:[quote=引用 1 楼 自信男孩的回复:]从2层循环上来看，就是把数组中的元素值相加，那不就是1+2+3+4+5吗？ 怎么会少个2呢？ 那有没有对于for循环，外循环结束，内循环要重置的这种说法呢?[/quote] 外循环结束，内循环就不会执行了～

引用 1 楼 自信男孩的回复:从2层循环上来看，就是把数组中的元素值相加，那不就是1+2+3+4+5吗？ 怎么会少个2呢？ 我不是计算机专业的，在为转专业做准备，没有老师教，所以有一些蠢的问题还请包含

引用 1 楼 自信男孩的回复:从2层循环上来看，就是把数组中的元素值相加，那不就是1+2+3+4+5吗？ 怎么会少个2呢？ 那有没有对于for循环，外循环结束，内循环要重置的这种说法呢?

这个就是s = s+a[0][0]+a[0][1] +a[1][0]+a[1][1]+a[2][0]+a[2][1],就是先加第一行（即j = 0，1；i= 0），再加第二行（j清零，i= 1）


Question: vs编辑c语言

可能典型安装默认没装C++

引用 3 楼 sm7 的回复:有安装SDK，而且在vs的文件下找得到stdlib文件的位置  看一下路径配置 有没问题

有安装SDK，而且在vs的文件下找得到stdlib文件的位置

软件配置有问题吧，建议检查一下配置，或者在网上把错误信息填进去搜一下～

打开安装器，修改安装SDK


Question: 求一份winform图书管理项目源代码和数据库

引用 3 楼 user-1的回复:CSDN论坛 > .NET技术 > C# 找到了，谢谢提醒昂，aaa

CSDN论坛 > .NET技术 > C#

引用 1 楼 user-1的回复:走错地方了，去C# 哎。c#没看到emmm

走错地方了，去C#


Question: 今天开始大一了

先照书抄到电脑上再说

感觉先看视频好一点

那些过来人都是从你这种状态过来的。

来csdn都5年了，难道以前一直是灌水的？

多看书，多敲代码试一试


Question: 计算这几个程序运行的时间，谁能写一个正确的完整的代码，我写的都是一堆错，从网上查的代码照搬也一堆错

建议查一下gettimeofday函数，这个可以很好的计算程序的运行时间～

我记得有的编译器运行能直接看时间。比如：codeblocks和devc++


Question: C语言计算数字个数

i是下标，不能将i与与’\0’进行比较 应该是i<strlen（s）

引用 2 楼 自信男孩的回复:for(i=0;i!='\0';i++) 这个i为什么要和'\0'比较；'\0'是字符串结束标记，数值是0。所以i != '\0'等价i != 0； 所以如果这样设计for循环的退出条件，那么这个循环是一次也不会执行的。 可以改成： for(i=0; s[i] !='\0';i++) 试了试，也不行会得一串随机的数字


Question: 求助

引用 1 楼 wowpH的回复:每次都是新分配的地址。不一样很正常。 你看看同样的代码运行两次，地址是一样吗？这个好像跟编译器也有点关系。

每次都是新分配的地址。不一样很正常。

每次运行加载到栈上的位置可能是不一样的，所以数组的基地址（或首地址）也不一样。这是正常现象～  关注点应该放在基于首地址后的偏移地址是否正确～

他不是每次编译运行都不一样，同一段每次编译运行都是一样的


Question: 卑微小白在线求助！！求大神指点

Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

设置只需改那一个呀，其次，调试是对程序调试，不是对代码调试，所以你要先把代码编译成程序


Question: double 除以 int

引用 2 楼 赵4老师 的回复:理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素我今天突然想一个问题：为什么要转化？这个算式的需求很明显，就是想把一个double类型的数分成两半。我觉得计算机应该有一种简便的方式来处理这类问题，没必要非得先把除数变为double型再去进行除法吧？

引用 3 楼 liups 的回复:[quote=引用 楼主 韩雷 的回复:] double dVal = 10.0; int i= 2;  double dRet = dVal / i; //请问在这里，i会被隐含的转换为double吗？ 我觉得没必要吧？ 会！ cpu就没有double/int的指令。早期cpu没有double，纯靠库实现，后来有fpu，是一单独的芯片，现在的cpu里面直接包含了fpu。所以这种转换是必然的，这也不是C、C++独有的[/quote]我今天突然想一个问题：为什么要转化？这个算式的需求很明显，就是想把一个double类型的数分成两半。我觉得计算机应该有一种简便的方式来处理这类问题，没必要非得先把除数变为double型再去进行除法吧？

引用 楼主 韩雷 的回复:double dVal = 10.0; int i= 2;  double dRet = dVal / i; //请问在这里，i会被隐含的转换为double吗？ 我觉得没必要吧？ 会！ cpu就没有double/int的指令。早期cpu没有double，纯靠库实现，后来有fpu，是一单独的芯片，现在的cpu里面直接包含了fpu。所以这种转换是必然的，这也不是C、C++独有的

这个好像跟底层汇编有关系。

这是实现相关的，不同的架构，不同的编译器，可能有不同的处理方式。一般x86下编译器不会转换的，除非这个除数被多次在浮点运算中使用，而是直接使用fidiv指令，这个支持浮点除以整数。x64下，编译器一般不使用x87指令，而是用SSE/AVX指令做浮点运算，后者没有浮点除以整数的指令，必须先把除数转换为浮点。


Question: 我是一个初学者，在数据结构（c语言版）中，怎样对在有头结点的单链表原表进行倒置。（不新建表）

初学者就要多敲代码，总想要想别人给是学不好的

遍历一遍啊，代码就不给了，你自己写，我们看看


Question: C语言Debug Errorl如何解决？

你这是运行的错误提示，还是编译的提示？ 如果是运行的，从你的代码里可以看到语法问题：  scanf("%d%d%d", &a, &b, &c);

scanf("%d%d%d", &a, &b, &c);


Question: 请用C语言编程！困扰很久的一道题，请大家帮忙，谢谢！

引用 3 楼 weixin_45654039 的回复:ans = new char(len+begin+1);   这个new char是从哪里突然冒出来的？  他写的是C++代码，而且格式有点不对。在C语言里面可以用malloc：ans = (char*)malloc(len+begin+1);

就地写了一个，您看行不   char *getShortest(char s[], int len) { 	char *ans; 	int begin = len; 	for(int i= len-1;i>0;--i){ 		if(s[0]==s[i]){ 			int j; 			for(j = i+1;j<len;++j){ 				if(s[j-i]!=s[j])break; 			} 			if(j==len)begin = i; 		} 	} 	ans = new char(len+begin+1); 	for(int i=0;i<begin;++i){ 		ans[i] = s[i]; 	} 	for(int i=0;i<len;++i){ 		ans[begin+i] = s[i]; 	} 	ans[len+begin]='\0';  	return ans; }

作业题不解释


Question: 请问一下，为什么复数虚部没有进入运算？

你这个是虚部根本就没输入成功的

scanf("%f+%fi",&vr,&vi); 你这个需要输入两个数，中间有加号，比如“3+4”

什么意思？你把结果发出来啊


Question:
C语言设计习题
C 语言入门
数组
C语言小白，考研要考，想知道在什么情况下要把定义数组写在int main 前面，如图所示?

全局变量  非静态局部变量     静态局部变量

引用 1 楼 自信男孩的回复:放在函数内，是局部变量，放在函数外是全局变量。位置不一样，变量的意义不一样，作用域和生命周期不一样～ 想知道如果考试时候，是把定义的数组放在全局变量的位置正确还是放main函数里，如图1中定义数组array[N][N]那句如果放在main函数里程序还是正确的功能和运行么


Question: c语言 for loop scanf（）

Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.  提醒：scanf是开源的。参考ucrt\stdio\input.cpp


Question: fwrite与fprintf有什么区别，可以互换吗？

不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了


Question: 求救

其实可以逆向求解。将排好的扑克牌（1_2_3_..joker）模拟一遍过程，最终得出来的扑克牌顺序反推。比如最终牌序 第6张牌是1，那么原牌序中第1张牌就放6

是底部拿一张放在上边，再抽一张放在上边这么循环吗？？？


Question: C语言中如何提取字符串中重复字母其中的一个字母

引用 7 楼 hslbloc的回复:给你一段C语言版的参考函数吧   /**   * 函数功能：提取字符串去重复字母后的内容（C语言版）   *   * 时间复杂度：O(n)   * 空间复杂度：O(1)   */ void dereplication(const char *src, char *dst) { 	char unique[30];  	while (*src) 	{ 		// 利用字符的ASCII码值作为unique下标（等于主键），可避免重复遍历unique。 		// ASCII码值-'a'偏移量的作用，可大幅减小数组unique的长度。 		if (unique[*src-'a']==0) 		{ 			unique[*src-'a']=1; 			*(dst++) = *src;  // 如果在调用该函数之前有宏定义(#define __DEBUG)，则打印输出			 #ifdef __DEBUG 			printf("%c", *src); #endif 		}  		// 遍历字符串，直到'\0'结束 		src++; 	}  	// 给提取后字符串添加结束符 	*dst='\0'; }   抱歉，代码有小缺陷（部分编译器不会对未初始化的数组置零）。因此函数代码第9行应该手动初始化，即： char unique[30]={0};

引用 1 楼 自信男孩的回复:比较出现的次数吧，int ch[26] = { 0 };然后计算每个字母出现的次数，次数大于1的就是重复的字母；  另外，楼主的例子有问题吧，重复的字母应该是:adsa 楼主的意思是去重后输出

遍历吧! 遍历“asddsfaa”（假定结果放在数组result中，初始化为空，为了简单起见可以再定义一个变量len记录当前长度，初始化0），源串中每取一个字符，去result中查找（没找到的话根据len加入其末尾并调整len，找到的则什么也不做）。  最后输出result  PS：查找也是遍历，当然为了快速查找可以考虑对result排序

引用 3 楼 weixin_44378872 的回复:[quote=引用 1 楼 自信男孩的回复:]比较出现的次数吧，int ch[26] = { 0 };然后计算每个字母出现的次数，次数大于1的就是重复的字母；  另外，楼主的例子有问题吧，重复的字母应该是:adsa 不是的，就是提取出其中出现的所有字母，但重复出现的只提取一个出来 同时将这些字母存放如另一个数组中 并不是只要统计次数的 例如asdfassa 我提取asdf 但如果遍历的话，第一循环循环的到了第2个a时第二循环循环到第三个a，第二个a也会放入这个数组。 如果要提取数中字母重复次数在两次以上就会在提取的字母中又出现重复[/quote]统称次数的数组里面 不是0 就直接continue 就行了

引用 1 楼 自信男孩的回复:比较出现的次数吧，int ch[26] = { 0 };然后计算每个字母出现的次数，次数大于1的就是重复的字母；  另外，楼主的例子有问题吧，重复的字母应该是:adsa 不是的，就是提取出其中出现的所有字母，但重复出现的只提取一个出来 同时将这些字母存放如另一个数组中 并不是只要统计次数的 例如asdfassa 我提取asdf 但如果遍历的话，第一循环循环的到了第2个a时第二循环循环到第三个a，第二个a也会放入这个数组。 如果要提取数中字母重复次数在两次以上就会在提取的字母中又出现重复

引用 1 楼 自信男孩 的回复:比较出现的次数吧，int ch[26] = { 0 };然后计算每个字母出现的次数，次数大于1的就是重复的字母；  另外，楼主的例子有问题吧，重复的字母应该是:adsa 楼主意思应该是重复的只取一个，如果只取重复的没有f，那就是asd


Question: 求大佬看下错误原因

引用 6 楼 pluminsnow的回复:这个，建议补一下英语，看懂报错信息问题就很清晰了。 我知道什么意思，但我不会改啊(๑˙ー˙๑)

这个，建议补一下英语，看懂报错信息问题就很清晰了。

引用 4 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h> #include<time.h>  typedef int datatype;  #define MAXLEN 100  typedef struct {     datatype data[MAXLEN];     int last; }SeqList;  SeqList *CreateSeqList()//新建 {     //char x;     int z = 1, i = 0;     SeqList *Lq;     Lq=(SeqList*)malloc(sizeof(SeqList));     Lq->last = 0;     //while(scanf("%d", &z))     while(scanf("%d", &z) && i < 20)     {         printf("请输入20个元素,输入x时结束：");         //if(z==x)             //break;         Lq->data[i++] = z;         Lq->last++;     }     return Lq; }  int InsertList(SeqList *Lq,int i, datatype x)//插入元素 {     int j;     if(Lq->last == MAXLEN-1)     {         printf("顺序表已满！");         return(-1);     }      if(i<1||i>Lq->last+1)     {         printf("位置出错！");         return(-1);     }     for(j=Lq->last;j>=i-1;j--)         Lq->data[j+1] = Lq->data[j];     Lq->data[i]=x;     Lq->last++;     return(1); } int DeleteList(SeqList *Lq,int i)//删除元素 {  int j;     if(i<1||i>Lq->last+1)     {  printf("不存在第i个元素!");         return(0);     }     for(j=i;j<=Lq->last;j++)         Lq->data[j-1]=Lq->data[j];     Lq->last--;     return(1); } int LocationSeqList(SeqList *Lq, datatype x)//查找元素x {     int i=0;     while(i<=Lq->last&&Lq->data[i]!=x)         i++;     if(i>Lq->last)         return -1;     else         return i; } int LocationSeqList2(SeqList *Lq,datatype x)//查找元素x的平方 {     int i=0;     while(i<=Lq->last&&Lq->data[i]!=x*x)  i++;     if(i>Lq->last)         return -1;     else         return i; }  //int ShowList(SeqList *Lq,int i)//显示所有元素 int ShowList(SeqList *Lq)//显示所有元素 {     int i;     if (!Lq)         return -1;     printf("显示线性表的所有元素：");     if(Lq->last<0)     {         printf("表内暂无元素!");         return(-3);     }     else     {  for(i=0;i<=Lq->last;i++)         {             printf("%d\n",Lq->data[i]);         }         return(1);     }      return 0; }  int GetList(SeqList *Lq,int i)//获取第i个元素 {     if(i<1||i>Lq->last)     {         printf("不存在此元素");         return(-4);}     else     {         printf("%d",Lq->data[i-1]);         return(1);     } }  int main() {     int choice,i,j, pos;     SeqList *L = NULL;     datatype x;     while(j)     {   printf("\n");         printf("\n\t\t          线性表子系统          ");         printf("\n\t\t********************************");         printf("\n\t\t*       1------建    表         ");         printf("\n\t\t*       2------显    示         ");         printf("\n\t\t*       3------查    找x        ");         printf("\n\t\t*       4------查  找x平方      ");         printf("\n\t\t*       5------获    取         ");         printf("\n\t\t*       6------插    入         ");         printf("\n\t\t*       7------删    除         ");         printf("\n\t\t*       8------退    出         ");         printf("\n\t\t********************************");         printf("\n\t\t请选择菜单号(0--6):");         scanf("%d",&choice);         if(choice==1)             L = CreateSeqList();//用if语句选择         else if(choice==2)             ShowList(L);         else if(choice==3)         {             printf("\n\t\t请输入想要查找的元素：");             scanf("%d", &x);             pos = LocationSeqList(L, x);             if (pos < 0)                 printf("Can't find it!\n");             else                 printf("Pos is %d\n", pos);         }         else if(choice==4)         {             printf("\n\t\t请输入想要查找的元素：");             scanf("%d",&x);             pos = LocationSeqList2(L, x);             if (pos < 0)                 printf("Can't find it!\n");             else                 printf("Pos is %d\n", pos);         }         else if(choice==5)         {             printf("\n\t\t请输入要获取的元素");             scanf("%d",&i);             GetList(L, i);         }         else if(choice==6)         {             printf("\n\t\t请选择插入的位置i和要插入的元素x：");             scanf("%d,%d", &i,&x);             InsertList(L, i, x);         }         else if(choice==7)         {             printf("\n\t\t请输入要删除的元素的位置：");             scanf("%d",&i);             DeleteList(L, i);         }         else if(choice==8) j=0;         else printf("\n\t\t输入错误！");     } }  供参考～ 对比一下找一下自己的问题～  建议多加强一下函数调用的使用 感谢回复，我会好好参考的

引用 1 楼 活在梦里吗的回复:。。。函数定义了参数不传实参过去吗 这个实参不知道怎么加，加了一直有错😭

这个实参不知道要怎么加，加了一直有错

。。。函数定义了参数不传实参过去吗


Question: 大二C语言课程设计

滴滴打车被你们一个课程设计 就能做出来，你们老师心真大！

指一条路：嘀嘀打车系统复杂的一批，但是作为课设来说的话，我觉得用到一个数据结构作为核心就稳了，那就是怎么样实现乘客排队，那么就要写好一个队列的数据结构，队列的数据结构和接口网上随便找，你也可以看我的博客。然后就是写边边角角的工作了。 把这个队列写好我觉得大概能及格吧。。。。哈哈

百度一些差不多的边了解边做把


Question: C语言中，怎样解决float转int导致的生成失败。(刚学习C语言)

int y = (int)h;应该是这样，而不是int y = (float)h;

改好了？好像c语言在某些编译器下，变量声明要放在最前面的

引用 1 楼 xueyu人生的回复:你应该是int y = (int)h; 不是，我已经试过了，生成失败。

你应该是int y = (int)h;

确定改好了?不见得哦。(float)(h)有什么用？h本身就是float型

引用 3 楼 user-5的回复:上面忘记加分号；了吧 是的，忘加分号了，已经改好了

上面忘记加分号；了吧


Question: 程序中变量的地址存在哪里？

描述的基本上是没问题的～exe文件描述的是栈空间的大小，偏移， 而起始地址是在加载到内存时来确定的，程序最终都需要放到内存 里去运行。

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素


Question: 数据结构一元多项式相加

仅供参考：//链表实现一元多项式的加法减法乘法 #include <stdio.h> #include <stdlib.h> typedef struct node {     float coef;   //系数     int expn;     //指数     struct node *next; } PolyNode;      //多项式节点 polynomial node typedef PolyNode* Polynomial; Polynomial createPolynomial() {  //创建多项式     PolyNode *p, *q, *head = (PolyNode *)malloc(sizeof(PolyNode));   //头节点     head->next = NULL;     float coef;     int expn;     printf("输入该多项式每一项的系数和指数，每项一行，输入0 0结束！\n");     while (scanf("%f %d", &coef, &expn) && coef) {   // 默认，按指数递减排列         if (head->next) {             p = head;             while (p->next && expn < p->next->expn)                 p = p->next;             if (p->next) {                 if (expn == p->next->expn) { //有相同指数的直接把系数加到原多项式                     p->next->coef += coef;                     if (p->next->coef > -0.000001 && p->next->coef < 0.000001) { //若是相加后系数为0，则舍弃该节点                         q = p->next;                         p->next = q->next;                         free(q);                     }                 } else {                     q = (PolyNode*)malloc(sizeof(PolyNode));                     q->coef = coef;                     q->expn = expn;                     q->next = p->next;                     p->next = q;                 }             } else {                 p->next = (PolyNode*)malloc(sizeof(PolyNode));                 p = p->next;                 p->coef = coef;                 p->expn = expn;                 p->next = NULL;             }         } else {             head->next = (PolyNode*)malloc(sizeof(PolyNode));             head->next->coef = coef;             head->next->expn = expn;             head->next->next = NULL;         }     }     return head; } Polynomial multiply(Polynomial poly, float coef, int expn) {  //多项式与指定单项式相乘，该单项式为 coefx^expn     PolyNode *p, *q, *Poly = (PolyNode*)malloc(sizeof(PolyNode));     p = Poly;     q = poly->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = (q->coef*coef);         p->expn = (q->expn + expn);         q = q->next;     }     p->next = NULL;     return Poly; } void add(Polynomial poly1, Polynomial poly2) {  //把 poly2 加到 poly1 上     PolyNode *p, *q, *r;     r = poly1;     p = poly1->next;  //指向第一个节点     q = poly2->next;     poly2->next = NULL;     while (p && q) {         if (p->expn > q->expn) {             r->next = p;             p = p->next;             r = r->next;         } else if (p->expn < q->expn) {             r->next = q;             q = q->next;             r = r->next;         } else {             PolyNode *t;             p->coef += q->coef;             if (!(p->coef > -0.000001 && p->coef < 0.000001)) //系数不为0             {                 r->next = p;                 r = r->next;                 p = p->next;             } else {                 t = p;                 p = p->next;                 free(t);             }             t = q;             q = q->next;             free(t);         }     }     if (p)         r->next = p;     if (q)         r->next = q; } Polynomial polySubtract(Polynomial poly1, Polynomial poly2) {  //多项式减法 poly1-poly2形成一个新的多项式     //把poly2的系数取相反数，形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode)); //构造头节点     PolyNode *p, *q;     p = poly;     q = poly2->next;     while (q) {         p->next = (PolyNode*)malloc(sizeof(PolyNode));         p = p->next;         p->coef = -(q->coef);  //系数取反         p->expn = q->expn;         q = q->next;     }     p->next = NULL;     add(poly, poly1);  //利用加法     return poly; } Polynomial polyAdd(Polynomial poly1, Polynomial poly2) { //多项式相加 poly1+poly2形成一个新的多项式     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //和多项式的头节点     poly->next = NULL;     PolyNode *p, *q, *r;     r = poly;     p = poly1->next;     q = poly2->next;     while (p&&q) {         if (p->expn > q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = p->coef;             r->expn = p->expn;             p = p->next;         } else if (p->expn < q->expn) {             r->next = (PolyNode*)malloc(sizeof(PolyNode));             r = r->next;             r->coef = q->coef;             r->expn = q->expn;             q = q->next;         } else {             float m = p->coef + q->coef;             if (!(m > -0.000001 && m < 0.000001)) {                 r->next = (PolyNode*)malloc(sizeof(PolyNode));                 r = r->next;                 r->coef = m;                 r->expn = p->expn;             }             q = q->next;             p = p->next;         }     }     while (p) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = p->coef;         r->expn = p->expn;         p = p->next;     }     while (q) {         r->next = (PolyNode*)malloc(sizeof(PolyNode));         r = r->next;         r->coef = q->coef;         r->expn = q->expn;         q = q->next;     }     r->next = NULL;     return poly; } Polynomial polyMultiply(Polynomial poly1, Polynomial poly2) {  //多项式相乘     Polynomial poly = (PolyNode*)malloc(sizeof(PolyNode));  //创建多项式和的头节点     poly->next = NULL;     PolyNode *p;     p = poly2->next;     while (p) {         add(poly, multiply(poly1, p->coef, p->expn));         p = p->next;     }     return poly; } void printPoly(Polynomial poly) {  //打印多项式     if (poly && poly->next) {         PolyNode *p = poly->next;  //p指向第一个节点         while (p->next) {             printf("%gx^%d", p->coef, p->expn);             p = p->next;             if (p && (p->coef > 0))                 printf("+");         }         if (p->expn == 0)             printf("%g", p->coef);   //打印常数项         else             printf("%gx^%d", p->coef, p->expn);         printf("\n");     } } void freePoly(Polynomial poly) {  //释放内存     if (poly && poly->next) {         PolyNode *p, *q;         p = poly;         while (p) {             q = p->next;             free(p);             p = q;         }     }     poly = NULL; } int main() {     printf("用链表实现多项式的加减法\n");     Polynomial poly1, poly2, poly3;     printf("创建多项式一\n");     poly1 = createPolynomial();     printf("多项式一：\n");     printPoly(poly1);     printf("创建多项式二\n");     poly2 = createPolynomial();     printf("多项式二：\n");     printPoly(poly2);     printf("两多项式相加，和为：\n");     poly3 = polyAdd(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两个多项式相乘，积为：\n");     poly3 = polyMultiply(poly1, poly2);     printPoly(poly3);     freePoly(poly3);     printf("两多项式相减，差为：\n");     poly3 = polySubtract(poly1, poly2);     printPoly(poly3);     freePoly(poly1);     freePoly(poly2);     freePoly(poly3);     system("pause");     return 0; }


Question: 求教，我写的交换两个结点的值为什么不行，返回时结点顺序还是没变

确定 while 的条件都满足吗？你是如何确认有没有交换成功的？[/quote]  因为调试过了，没返回好像一切都正常，但是返回后结点的值没有变

因为调试过了，没返回好像一切都正常，但是返回后结点的值没有变

引用 3 楼 weixin_42609156 的回复:抱歉，由于这个算法行不通，所以后期更改了，忽略掉while循环后面的语句就行了  typedef struct DNode{ ElemType data;//数据域  struct DNode *prior; struct DNode *next;//指针域  ElemType freq;  }DNode,*DoubleList;   void Locate(DoubleList &L,int x){ DNode *p = L->next; while(p!=null&&p->data!=x){ p=p->next; } if(p->data!=x){ printf("不存在其值为x的点");exit(0);  } p->freq++;  while(p->freq>=p->prior->freq&&p->prior!=L){ p->data=p->prior->data; p->prior->data=x;  }	 return; }  引用 2 楼 NorZ 的回复:q 是那儿来的？  确定 while 的条件都满足吗？你是如何确认有没有交换成功的？

q 是那儿来的？

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633


Question: C语言问题

将current节点加入链表。因为原链表尾部指向的后续节点是NULL，所以要让这个节点指向新节点，而新节点指向NULL


Question: C

浮点数精度超出编辑器

但我又写了一个程序，把3*f的值按float类型存储，用printf输出%. 40f 为1.00000…，所以1.0000…==1不对吗

是浮点数的精度问题，所以浮点数的比较运算不能用整型数那样直接比较，而是通过比较差值的绝对值小于 某个数来判断是否相等，比如小于1e-6

等于最好这样：      const   float   E   =   1e-6;      float   f1   ,   f2;       if(fabs(f1   -   f2)   <   E)      {……}    不可将浮点变量用“==”或“！=”与任何数字比较。     千万要留意，无论是float还是double类型的变量，都有精度限制。所以一定要避免将浮点变量用“==”或“！=”与数字比较，应该设法转化成“>=”或“<=”形式。 假设浮点变量的名字为x，应当将    if (x == 0.0)     // 隐含错误的比较 转化为  if ((x>=-EPSINON) && (x<=EPSINON)) 其中EPSINON是允许的误差（即精度）。

编译工具有关，有的编译器输出就是 1 不必深究

浮点型有数据精度，即有一些浮点数，用有限的二进制位是无法精确表达的


Question: C语言初学者

引用 4 楼 weixin_41010602的回复:区别是 关键字都有特定的功能，不能给它赋值，更改它的作用功能等  而标识符 只要不和关键字还有特定的函数，在程序中已经被特殊定义过的，代码雷同，就可以随意命名，但是好像有长度限制  我也是新手，这些都是我专门查到的资料 对了，标识符最标准的是，做到见名知义，就是看到他的名字，就知道他所标记的里面所代表的是什么

所谓标识符，就是你起的一个名字。c/c++中，是你用来标识变量名、符号常量名、函数名、数组名、文件名、类名、对象名等的。（就好像你父母有了你以后给你起的名字）~~ c/c++有效标识符的构成规则如下 （1）第一个字符必须是字母（不分大小写）或下划线（_）; （2）后跟字母（不分大小写）、下划线（_）或数字组成; （3）标识符中的大小写字母有区别。如，变量sum,sum,sum代表三个不同的变量； （4）不能与c编译系统已经预定义的、具有特殊用途的保留标识符（即关键字）同名。比如，不能将标识符命名为float,auto,break,case,this,try,for,while,int,char,short, unsigned,等等。   关键字，通俗点说，就是设计这个语言的人定义的标识符。（也就是他用了，你不能再用了）。具体哪些是关键字，用多了就知道了，反正常用的就那么些。

引用 2 楼 myxk_的回复:关键字的用处在于编辑数据，使得程序准确存储、识别、和编辑数据。32个确实多单常用的就是10几个，若遇上了现查就好了，学习驾车又不必学习引擎制造的不必深究 懂啦 谢啦就是套路对吧 不用死扣

所谓关键字，直白的理解就是C本身使用的词，有特殊的含义，你不能再用作它用。


Question: 求大佬帮忙，看看这是为什么？

# include<stdio.h> 这是预处理命令 int main() 这是主函数。备注程序就是个函数 printf（）函数，这是屏幕输出函数，圆括号内的是显示在屏幕上的内容。 \n这是换行符 return 0;这是返回函数必须带的


Question: C语言基础操作的问题。

应该在view菜单下面有

在open里面找 不给分吗？


Question: 求会C语言的大神帮助，只是一个编程小题目。

引用 1 楼 user-1的回复:printf(); ？这个是什么意思啊？

printf();


Question: 单链表的头插尾插

什么问题？链表最近刚写过


Question: 小白一个，求大神指导，这个程序哪里有问题啊

经常有人将printf、scanf的字符串搞混

引用 1 楼 uouo88 的回复:scanf中多了一个\n   int main() { 	printf("请输入北京时间:\n"); 	int BJT, UJT; 	scanf("%d", &BJT); 	if (0 <= BJT <= 2359) 	{ 		UJT = BJT - 800; 		if (UJT < 0) 			printf("世界协调时为：前一天的%d\n", BJT / (-1)); 		else 			printf("世界协调时为：%d\n"); 	} 	else 		printf("error!"); }  printf("世界协调时为：%d\n"); 这句少一个参数～

scanf("%d\n", &BJT); 中多了"\n" 改为 scanf("%d", &BJT); 为什么第一行代码多了\n之后，需要输入两次，程序才能向下继续执行呢？ scanf()函数的作用是从标准的输入流中读取数据，并将读取到的数据保存到指定的变量中。其格式为 int scanf( const char *format [, argument]... ); 其中，参数format指定了读取数据的方式；argument是一个参数列表，其类型是变量的地址，scanf()函数读取到的数据就保存到这些变量中。 所以，“%d\n”是scanf()函数中的format，而用户输入的格式也要和format的格式匹配。而scanf()函数只有遇到回车键时才会从输入缓冲区中读取数据，当用户在控制台窗口中输入"1回车"时，此时的回车按键只是匹配了format的格式，而不能让scanf()函数开始从缓冲区中读取数据。这时你可能会说，是不是再次按下回车键就可以让scanf()函数开始从缓冲区中读取数据了？实际上还是不行，因为遇到回车符时，该让scanf()函数会读取输入数据流中连续的回车符，但是不会存储这些字符，直到读取到输入数据流中非回车符为止。 所以，此时输入多少个回车符都不起作用，需要再次输入一个数字加上回车符才可以。 而修改之后的代码中，scanf()的format中不包含回车按键，当用户在控制台窗口中输入"1回车"时，这个回车按键就会使得scanf()开始读取输入数据流的数据。 请参考《scanf()函数的用法》 希望能够帮到你！


Question: 指针初始化赋值问题

指针赋值字符串，其实是把字符串的首地址赋值给了指针～

char *s1 = "OK";  	printf("%s", s1);         可以正常输出“OK”           char *s2 = s1；          printf("%s", s2);          也可以正常输出“OK”

这个是可以的

没问题的，放心用吧！


Question: 并发如何突破端口数65535的限制

引用 12 楼 stherix 的回复:一般都是负载均衡 集群配置  另外 你的服务器崩绝对不是端口数的问题 连接的客户端再多,你服务器也只要使用一个端口 肯定是代码里有错误,比如连接池大小用ushort等等 需要查看错误日志,看问题出在哪  我看楼主就不像是有心想跟我们讨论问题的。 另外，他所说的端口可能不是我们想的那个端口。现在有的人讨论问题呢，直接模糊专业术语，搞得讨论半天根本不在一个点上。就好比说端口这个术语吧，我以前跟人家讨论过，结果发现说了半天，他指的是连接。我觉得吧，专业性的问题，最好是用专业术语，你不能说一个西瓜是冬瓜，否则没办法讨论了

引用 10 楼 m0_37837425 的回复:大家都没有回答到我的核心问题，我的问题是写的并发高于6万/秒，进程就会挂，也就是超过了端口的数量，没超过不会有问题。  或许大家的回答没切中要害，但是楼主有没 想过一个问题，你这个问题本来就含有一个悖论，换句话说，当你提出这个问题的时候，不见得考虑过你所提出这个问题，实际上存在矛盾的。  首先，如果你这个服务器是一个TCP服务器的话，怎么可能会有你所说的端口数超6万的存在呢？一般我们TCP服务器都是绑定一个端口，然后不管连进来的客户端达到多少数量，它就一个端口而已，怎么会存在端口数超量的问题呢？  那么，难道你说的是UDP服务器，那么你这个服务器的响应机制是怎么样的呢？当一个客户端发数据报上来，服务器就创建一个socket与它通信吗？如果是这样，这个服务器的资源足够使用吗？当客户端不再活跃的时候，这个资源要释放吗？这里面有很多问题要解决了，而这些不是我们这些外人说几句话就能解决的了。

引用 6 楼 SuperDay 的回复:[quote=引用 楼主 m0_37837425 的回复:] 大家好，我在做IM系统测试的时候发现，连接数可以达到100万，但并发请求（即同时发送消息的QPS）超过65535的时候，系统就挂了。请问像腾讯这样的大型IM是如何解决这个问题的？  大型的IM服务器，是通过多台服务器的集群来解决连接数超多的问题[/quote] 你们的单台服务器可以到多少连接？理论上可以到百万吗？主要限制是在哪里

引用 5 楼 SuperDay 的回复:[quote=引用 1 楼 羽飞 的回复:] 那楼主知道超过65535就挂在哪里吗？知道现象找原因，把系统报错，或者out of memory，或者程序崩溃，都有原因。 发送消息使用的是TCP还是UDP。测试客户端是一台还是多台? TCP连接受限制于四元组(IP,PORT, IP,PORT),服务端的IP和PORT是固定的，但是客户端的IP和PORT还是很多的，所以如果客户端只有一台机器那受PORT个数限制。PORT的个数也不是65535，有一些是系统保留的不能用的。  虽然端口号不会上去，但是socket有可能达到上限的啊，如果连接数过多，就像linux系统，它有个最大打开文件数的设置[/quote] 是的，所以要看下报错的原因，可能就是自认为是这个错误，但实际不一定。

不频繁传输数据的服务器（一般用户只是登记到服务器，主要通信是用户间直接完成的，需要服务器中转的很少），连接用户数几十万上百万没有问题，参考电骡服务器，一般最大用户数限制是几万到几十万。

引用 楼主 m0_37837425 的回复:大家好，我在做IM系统测试的时候发现，连接数可以达到100万，但并发请求（即同时发送消息的QPS）超过65535的时候，系统就挂了。请问像腾讯这样的大型IM是如何解决这个问题的？  大型的IM服务器，是通过多台服务器的集群来解决连接数超多的问题

引用 1 楼 羽飞 的回复:那楼主知道超过65535就挂在哪里吗？知道现象找原因，把系统报错，或者out of memory，或者程序崩溃，都有原因。 发送消息使用的是TCP还是UDP。测试客户端是一台还是多台? TCP连接受限制于四元组(IP,PORT, IP,PORT),服务端的IP和PORT是固定的，但是客户端的IP和PORT还是很多的，所以如果客户端只有一台机器那受PORT个数限制。PORT的个数也不是65535，有一些是系统保留的不能用的。  虽然端口号不会上去，但是socket有可能达到上限的啊，如果连接数过多，就像linux系统，它有个最大打开文件数的设置

服务端  引用 1 楼 羽飞 的回复:那楼主知道超过65535就挂在哪里吗？知道现象找原因，把系统报错，或者out of memory，或者程序崩溃，都有原因。 发送消息使用的是TCP还是UDP。测试客户端是一台还是多台? TCP连接受限制于四元组(IP,PORT, IP,PORT),服务端的IP和PORT是固定的，但是客户端的IP和PORT还是很多的，所以如果客户端只有一台机器那受PORT个数限制。PORT的个数也不是65535，有一些是系统保留的不能用的。 这位兄弟说的很清楚了，不是端口数的限制问题。 从别的方面考虑，会不会是你的变量使用了16位数字做记录，达到65535会翻转。 上面也是随意想想可能出现问题的情况之一，还是得从问题具体现象作分析。

既然是这么大的量，没有做负载均衡吗？

客户端我有很多台，服务器端也绑定了很多个端口


同问。。。

第二天找到问题了，晶振频率没选对

F1似乎没这个问题，F4也遇到这个坑了，有脱坑的大佬或者早就看穿一切的大佬吗？欢迎发言


Question: 求助贴，这个c语言程序哪里出错了，怎么只运行当n＝111结果？程序题目如图。

代码本身没问题，只是写得效率太低，导致后面的结果需要很长时间才能输出

那就是其他两个数都是素数，然后的你main函数中已经有逻辑，只输出不是素数的情况，那只有111不是素数，所以只打印出111的结果。


Question: 求解，顺序表的销毁

free(L)肯定是不行的。 free(L.elem)应当是可以的。就是下面着这样：  Status DestroyList(SqList &L){     free(L.elem);     return OK; } //销毁

关键是顺序表是采用链表还是数组，从已有代码来看是链表，链表的话就得从最后一个开始一个个free

建议提供更多的代码，但从目前的信息上看free(L);肯定是不可以的，free(L.elem);还可以理解。因为上面是L.elem=malloc的


Question: 二维数组的有关问题

如果数组的元素又是数组，则称为二维数组。例如  int marbles[3][4] = { {0, 1, 2, 3} , {4, 5, 6, 7} , {8, 9 ,10 ,11} }; 可以将a看成一个数组，这个数组中有3个元素，每个元素又是一个包含4个int的数组。 a[0]表示二维数组中的第一个元素，a[1]表示二维数组中的第二个元素，而二维数组中的元素类型还是数组，所以a[0]表示数组{0, 1, 2, 3}的地址，a[1]表示数组{4, 5, 6, 7}的地址。a是指向其第一个元素，则a+1指向其第二个元素，a+2指向其第三个元素，所以 printf("%p\t%p\t%p\n", marbles, marbles + 1, marbles + 2); 	printf("%p\t%p\t%p\n", marbles[0], marbles[1], marbles[2]); 以上两行代码输出的地址应该是相同的。 printf("%p\t%p\t%p\n", marbles[0], marbles[0]+1, marbles[0]+2); 分别表示marbles第一个元素（数组）的第1-3个元素，即0， 1，2   请参考《C++二维数组》 《C++数组地址偏移》 希望能够帮到你！

引用 楼主 老犯錯誤 的回复:在学习二维数组的过程中（书是c primer plus 第六版第303面）发现书上的结论和我的实践结果不一样 假定一个二维数组 int zippo[][] 作者说数组名zippo是地址的地址，所以zippo指向一个8字节数据对象。因此zippo加1，它所指向的地址加8字节。 以下是我自己的实验结果 你得看你是编译为多少位的程序了32位程序寻址就是4字节地址 4*8=32


Question: 用C语言来编写程序

需要编译器开启对C++17的支持，我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《VS2019修改C++标准（支持C++17）》, 一起来围观吧 https://blog.csdn.net/qq_40946921/article/details/90645890?utm_source=app

引用 4 楼 user-1的回复: #include <iostream> #include <filesystem> #include <fstream> using namespace std; using namespace std::filesystem; void traverse() { 	 } void moveWav(string infile, string outfile) { 	if (!exists(infile)) { 		cout << "目录不存在" << endl; 		return; 	} 	if (!exists(outfile)&&!outfile.empty())	//输出目录不存在时，构建目录 		create_directories(outfile); 	directory_iterator trans(infile); 	char buffer[4]; 	int32_t sample_rate=0; 	int16_t bits_per_sample = 0; 	while (!trans._At_end()) { 		directory_iterator it = trans; 		++trans; 		if (it->path().extension().string() == ".wav") { 			ifstream in(it->path()); 			in.seekg(24); 			in.get((char *)&sample_rate, sizeof(sample_rate)); 			in.seekg(34); 			in.get((char*)& bits_per_sample, sizeof(bits_per_sample)); 			in.close(); 			if (sample_rate == 16000 && bits_per_sample == 16) {	//判断 				try {		 					copy_file(it->path(), path(outfile).append(it->path().filename().string())); 					cout << it->path().filename() << ":复制成功" << endl; 				} 				catch (filesystem_error& e) { 					std::cout << "复制失败！" << e.what() <<endl; 				} 			} 		} 	} } int main() { 	moveWav("C:/Users/Administrator/Desktop/","D:/");	//参数为输入输出目录，注意目录以分隔符结尾 	return 0; }   谢谢谢谢，非常有用，

引用 2 楼 user-1的回复:需要的话@一下_*# 需要需要，并且是急需，跪谢大佬

需要的话@一下_*#

C++的我倒是知道怎么操作，现在有点事，等回去我看一下哈


Question: python遍历数组

引用 3 楼 ctrigger的回复:仅供参考： #!/usr/bin/env python  def visit(lst):     print("[", end = " ")     for l in lst:         if isinstance(l, list):             visit(l)         else:             print(l, end = " ")     print("]", end = " ")  lst = [1,2,3,4,5,[60,61,62,63,64,65],7,8,[90,91]]   visit(lst)  很谢谢您嘿嘿

引用 1 楼 user-2的回复: def visit(list1):     for i in list1:         if isinstance(i,(list,set)):             print("%s------start"%(i))             visit(i)             print("%s------end"%(i))         else:             print(i)  list1 = [1,2,3,4,5,[60,61,62,63,64,65],7,8,[90,91]]  visit(list1)   特别谢谢您


Question: C

引用 楼主 qq_45541848的回复:书上说“所有的浮点运算都是以双精度进行的，即使仅含float单精度运算的表达式，也要先转换为double类型，再进行运算” 但用sizeof测试int+float和int*float结果都是float类型，和书上说的矛盾，求大神解释一下这是怎么回事 谭的书上解释int+float在编译器内部实际上是double+double=double，但sizeof判断的结果类型为float，我应该记哪一种版本呢？

《C++Primer第5版中文版》中提到 算术类型之间的隐式转换被设计的极可能避免精度损失。 所以int+float时，会将int隐式转换为float int+double时，会将int隐式转换为double 以下代码在VS2015中调试 	int size1 = sizeof(3.14 + 3); 	int size2 = sizeof(3.14f + 3);

引用 1 楼 liups的回复:sizeof测试int+float和int*float都是本身的类型，和如何运算无关 没看明白啥意思，刚学C，


Question: c语言 左移符号的问题

先PCLK进行1M分频 分频完-1（那么这个分频结果估计也是个十以内数）  接下来三个移位和三个或，我认为应该是看门狗的控制寄存器BIT流，你要查一下手册，分频结果、3、1、分别对应哪几个寄存器。

引用 1 楼 user-2 的回复:101<<3=101000 1<<2=100 101000|100=101100 (PCLK/1000000-1)<<8取决于PCLK是什么 3*2^3+2^2 弄错了， 3是11<<3=11000


Question: 数组

引用 3 楼 Vanessa盐 的回复:[quote=引用 2 楼 棉猴 的回复：]《C++Primer第五版中文版》P44中提到 （变量的）作用域能彼此包含，被包含的作用域称为内层作用域，包含着别的作用域的作用域叫做外层作用域。作用域中一旦声明了某个名字，它所嵌套的所有作用域中都能访问该名字。同时，允许在内层作用域中重新定义外层作用域已有的名字。 请注意“重新定义”这四个字，也就是说在内层作用域中，重新定义的名字会覆盖外层作用域的名字！ 所以 	int a[2] = { 1, 0 }; 	for (i = 0; a[i]; i++) 	{ 		printf("%4d", a[i]); 	}[/code] 中，a[i]处于内层作用域，此时a[0]的值是1，a[1]的值是0。 对于	for (i = 0; a[i]; i++) 	{ 		int a[3] = { 100, 200, 300 }; 		printf("%4d", a[i]); 	} for语句中的a[i]处于 int a[2] = { 1, 0 }; 的作用域中，即a[1] = 0，而 printf("%4d", a[i]); 处于int a[3] = { 100, 200, 300 };的作用域下，a[0]的值是100 以下是数中的一个例子，也许对你有帮助 厉害厉害酪[/quote] 不敢不敢，对你有帮助就好。互相学习，共同进步！

引用 2 楼 棉猴 的回复：《C++Primer第五版中文版》P44中提到 （变量的）作用域能彼此包含，被包含的作用域称为内层作用域，包含着别的作用域的作用域叫做外层作用域。作用域中一旦声明了某个名字，它所嵌套的所有作用域中都能访问该名字。同时，允许在内层作用域中重新定义外层作用域已有的名字。 请注意“重新定义”这四个字，也就是说在内层作用域中，重新定义的名字会覆盖外层作用域的名字！ 所以 	int a[2] = { 1, 0 }; 	for (i = 0; a[i]; i++) 	{ 		printf("%4d", a[i]); 	}[/code] 中，a[i]处于内层作用域，此时a[0]的值是1，a[1]的值是0。 对于	for (i = 0; a[i]; i++) 	{ 		int a[3] = { 100, 200, 300 }; 		printf("%4d", a[i]); 	} for语句中的a[i]处于 int a[2] = { 1, 0 }; 的作用域中，即a[1] = 0，而 printf("%4d", a[i]); 处于int a[3] = { 100, 200, 300 };的作用域下，a[0]的值是100 以下是数中的一个例子，也许对你有帮助 厉害厉害🤙

对


Question: c语言冒泡排序，可以这样写吗,帮纠错。

引用 6 楼 user-1的回复:for(int j = i + 1; j < n;  ++j) {     if (a[i] < a[j]) {         int temp = a[i];         a[i] = a[j];         a[j] = temp;     } } 谢谢，这样改是没问题了。

引用 1 楼 user-1的回复:运行一下就知道了。 我知道有什么出错了，如果进行a[i]=()的赋值，原来的值没有了。。。

我知道可能不是冒泡。

我也觉得是，冒泡的是把最大或最小的先放下面，我是把它放上面。

另外：你这个不是冒泡。

运行一下就知道了。


Question: c

通过遍历比较得到，比较通用的方法。

又是学生作业吧？ 最简单的做法：一个while循环下去，当值为空时结束，当值为X是，计数变量加1.即可。


Question: 局部静态变量

c的值怎么可能一直是2呢？肯定是2 3 4递增的呀，a一直是5，b一直是2，所以结果才是9 10 11呀。而且答案说是递归，我没看出来哪里用到递归了，只是循环调用同一个函数而已呀。

拿个编译器，自己是试一下就知道了 他的解释是错的

把你的fun()函数修改了一下 int fun(int a) { 	int b = 1; 	static int c = 1; 	a++; 	b++; 	++c; 	printf("%d+%d+%d=", a, b, c);//添加了如下代码，可以打印a，b,c的值 	return a + b + c; } VS2015调试的结果是  这样可能就好理解一些了

引用 1 楼 真相重于对错 的回复：拿个编译器，自己是试一下就知道了 他的解释是错的ok


Question: C语言

照着书上的抄，这样效果好一点。

这个帖子怎么还没结掉呀？楼主解决问题了，还是要结帖的，这样人家回答你的问题也会有积极性的，本来都是没什么好处，只是攒一点积分而已。

你这代码格式看的头疼

在两个scanf之间加一个getchar()函数试试

图片上看不清代码，你应该想办法弄清楚一点

我觉得输入那块需要改进一下。有点麻烦，说明也让人看不懂你觉得呢

额。。。 楼主，代码中的m是干什么的  输出UTC时为什么要赋 m 的值 是粗心打错了吗，这样写不知道代码是干啥的

引用 17 楼 LINZHONG21的回复:[quote=引用 15 楼 通信小卒的回复:][quote=引用 10 楼 LINZHONG21的回复:][quote=引用 8 楼 通信小卒的回复:]如果回答了你的问题，希望采纳，不明白的可以继续沟通 怎么采纳呀，我不知道[/quote] 你仔细找找有采纳的按钮[/quote] 还是，，，找不到采纳。。[/quote] 结帖，如果对我的结果满意，设置满意就行

就是结帖啊！！！

引用 15 楼 通信小卒的回复:[quote=引用 10 楼 LINZHONG21的回复:][quote=引用 8 楼 通信小卒的回复:]如果回答了你的问题，希望采纳，不明白的可以继续沟通 怎么采纳呀，我不知道[/quote] 你仔细找找有采纳的按钮[/quote] 还是，，，找不到采纳。。

有中文字符吧

引用 10 楼 LINZHONG21的回复:[quote=引用 8 楼 通信小卒的回复:]如果回答了你的问题，希望采纳，不明白的可以继续沟通 怎么采纳呀，我不知道[/quote] 你仔细找找有采纳的按钮

整个程序不清楚你的m值是做什么的？ 如果t是北京世间的话， printf("UTC=%d\n",UTC);就好了

引用 12 楼 通信小卒的回复:[quote=引用 9 楼 通信小卒的回复:][quote=引用 7 楼 LINZHONG21的回复:][quote=引用 6 楼 通信小卒的回复:]这个程序是将北京时间转化成UTC时间(通用协调时)，北京时间提前UTC时间8小时 是，但是我执行的时候就出问题了[/quote] 你说说出什么问题了？[/quote] 你想要达到什么样的结果，可以说一下[/quote] 输入北京时间，换算出UTC时间

引用 9 楼 通信小卒的回复:[quote=引用 7 楼 LINZHONG21的回复:][quote=引用 6 楼 通信小卒的回复:]这个程序是将北京时间转化成UTC时间(通用协调时)，北京时间提前UTC时间8小时 是，但是我执行的时候就出问题了[/quote] 你说说出什么问题了？[/quote] 你想要达到什么样的结果，可以说一下

引用 9 楼 通信小卒的回复:[quote=引用 7 楼 LINZHONG21的回复:][quote=引用 6 楼 通信小卒的回复:]这个程序是将北京时间转化成UTC时间(通用协调时)，北京时间提前UTC时间8小时 是，但是我执行的时候就出问题了[/quote] 你说说出什么问题了？[/quote] 就是没有按照我想象的执行，不会说，要不你复制，试一下

引用 8 楼 通信小卒的回复:如果回答了你的问题，希望采纳，不明白的可以继续沟通 怎么采纳呀，我不知道

引用 7 楼 LINZHONG21的回复:[quote=引用 6 楼 通信小卒的回复:]这个程序是将北京时间转化成UTC时间(通用协调时)，北京时间提前UTC时间8小时 是，但是我执行的时候就出问题了[/quote] 你说说出什么问题了？

如果回答了你的问题，希望采纳，不明白的可以继续沟通


Question: 这个for循环为什么没执行？

引用 2 楼 轻箬笠 的回复:for语句最后的分号去掉 谢谢，太感谢了！！！

for语句最后的分号去掉

for循环执行了，只是循环体是空语句。而后面的printf语句与for没有关系。


Question: 时间复杂度

O(n)


Question: 编译提示错误:expected '=', ',', ';', 'asm' or '__attribute__' before '{' token，

引用 1 楼 真相重于对错的回复:int max2(.....); //这里应该有个分号 已经找到了，谢谢老哥哈

引用 1 楼 真相重于对错的回复:int max2(.....); //这里应该有个分号 老哥你说的是第几张图呀

int max2(.....); //这里应该有个分号


Question: 时间复杂度O(m+n)和O(max(m,n))是否可以认为等同？

O(N) 代表这个时间复杂度是线性增长的，也就是输入数据规模和耗费时间是线性关系 O(max(m,n)) 和O(m+n) 其实一样

至少王道书上是这么说的。

其实这两种都是O(n)级别的复杂度。

要看m和n之间的关系，如果是线性的或者m是常数，可以认为等同，O(a*n+b)，如果a、b是常数，也是O(n)复杂度，所以O(n)算法不一定优于O(n^2)算法，要看n的规模

一个m+n，一个是max(m, n)即m, n中较大值。  举个例子，m = 8, n = 6;那么一个复杂度是14, 第二个复杂度是8。很明显了吧

一个是m+n，一个是m或者n，当然不等


Question: can't open include file:怎么改

工程、设置、C/C++、分类：Preprocessor、附加包含路径：填写附加头文件所在目录 逗号间隔多项

工程设置的问题 把头文件的路径没设对

建议确认下头文件路径和头文件有没有拼写错误，如大小写等

只能说你的include下面没这个文件。先找找呗

直接看不到你编译器提示的错误，建议提供更详细的相关信息～

这个应该是属于电脑使用习惯不当：直接打开压缩包中的源程序导致头文件不能正常操作，请解压后使用

你的工程目录下有这个Calc.h头文件吗？


Question: 学习编程

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817 Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

写项目练习，看大佬代码学习，再写项目复习，还有刷题

三个月要做到“熟练”，几乎不可能，你要不吃不喝吗？  要做熟练掌握，可能需要3年吧 需要你多练习，多努力～

刷题啊，PTA，力扣，牛客网，自己愿意花时间，提升就很快

急功近利很难掌握，但是有更快的办法就是可以阅读高手写的程序(或者参加培训)，无论怎样是练出来的，就是自己亲自动手，三个月你每天花费12个小时以上写代码，调试代码，会有很大的进步。

发帖时记得艾特 “赵4老师”哈， 据我观察，他长期埋伏于此，一旦你有风吹草动，他能立马杀粗来救你。

恭喜入坑，3个小建议： 少玩，看书，不懂多来发帖~

不断地练习，自己编的代码总共超过一万行，能构思写出两三百行，就入门的小项目，。


Question: C语言

以管理员身份运行IDE 关闭UAC、防火墙、杀毒软件、……

引用 2 楼 m0_45081612 的回复:[quote=引用 1 楼 user-3的回复:]红色翻译一下就知道了。 OK了，打开管理员模式就好了[/quote] 应该是权限的问题～

引用 1 楼 user-3的回复:红色翻译一下就知道了。 OK了，打开管理员模式就好了

红色翻译一下就知道了。


Question: 这个答案为什么是？c=>>3又是什么意思？？

妈也，看标题我还以为我的C语言是体育老师教的

c=>>3看不出是啥意思？但是再看你的图片，才知道是c = a>>3;这个是a右移3为赋值给c。 提问题的时候不要太雷人，细心一些～  a >>3，即8>>3，根据2进制8即1000，右移三位就是1了。

8在二进制中用1000表示 >>表示位移操作 8 >> 3表示将二进制数据全部左移3位 1000左移3位为0001 所以结果为1

二进制右移三位 比如 1000 右移3位后 变成 0001


Question: 求助！！！！！

#include <stdio.h> #include<stdlib.h>  #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 100  typedef int Elemtype; typedef struct{     Elemtype *elem;     int len; }SqList;  //初始化 int InitList(SqList *L) {     int n=0;     int i;      L->elem = new Elemtype[MAXSIZE];     if(!L->elem)         exit(0);     L->len=0;      //printf("输入表长度:\n",n);     printf("输入表长度:\n");     scanf("%d", &L->len);     printf("输入表的元素:\n");     for(i=0; i<(L->len); i++) {         int t;         scanf("%d", &t);         L->elem[i] = t;     }     return OK; }  //输出 void PrintList(SqList *L) {     int i;     //for(i=0;i<=L->len;i++)     for(i = 0; i < L->len; i++)         printf("%d",L->elem[i]);     printf("\n"); }  //判断是否为空 int IsEmpty(SqList *L) {     if(L->len==0)     return 1;     else         return 0; }  //取值 int GetElem(SqList *L,int i,Elemtype &e) {     if(i < 1 || i > L->len)         return ERROR;      e = L->elem[i-1];      return OK; }  //查找 int LocateElem(SqList *L,Elemtype e) {     int i;     for(i=0; i<(L->len); i++)         if(L->elem[i] == e)             return (i+1);         //else             //return 0;     return 0; }  //插入 int ListInsert(SqList *L,int i,Elemtype e) {     int j;     if(i<1||i>(L->len+1))         return ERROR;      if(L->len==MAXSIZE)         return ERROR;     for(j=(L->len-1); j >= i-1;j--)         L->elem[j+1] = L->elem[j];     L->elem[i-1] = e;     L->len++;      return OK; }  //删除 int DeleteList(SqList *L,int i) {     int j;     if(i < 1||i>L->len)         return ERROR;      //for(j=i;j<(L->len-1);j++)     for(j=i;j<(L->len);j++)         L->elem[j-1]=L->elem[j];     L->len--;      return OK; }  int main() {     SqList *L;     int e;     int t;     L = new SqList;     if (!L)         exit(0);      printf("初始化顺序表L:\n");     InitList(L);     printf("输出顺序表L:\n");     PrintList(L);      printf("第三个元素为:");     GetElem(L,3,e);     printf("%d\n", e);     int m=LocateElem(L,5);     //printf("元素5的序号为:\n",m);     printf("元素5的序号为:%d\n",m);     printf("在位置二处插入数字9后输出顺序表:\n");     ListInsert(L,2,9);     PrintList(L);     printf("删除第3个元素:\n");     DeleteList(L,3);     PrintList(L);      return 0; }  供参考～  建议对比上面的代码找一下自己的问题。  建议代码不要写的那么紧凑，看着不舒服，一般一条语句就占一行～

L是空指针。exit(0)直接结束程序了。 建议在exit()前面加上输出语句。


Question: 学生信息管理

引用 2 楼 自信男孩的回复:main函数里调用grod的实参应该是ch而不是*ch。 报错啊，大佬，一下子一堆错误

引用 2 楼 自信男孩的回复:main函数里调用grod的实参应该是ch而不是*ch。 没有你我真的可能要想很久了

引用 2 楼 自信男孩的回复:main函数里调用grod的实参应该是ch而不是*ch。 大佬，前几次谢谢你了

main函数里调用grod的实参应该是ch而不是*ch。

编译器还没检查出什么问题，但是运行就出错了


Question: 指定初始化器的问题

书上的是C99标准，可能你的编译器现在支持C11标准。C99的指定初始化器可读性本来就不太强，一般就用”=“依次赋值就行。

可以的，但为什么书上的写法会显示错误？

int days[MONTHS]={31,28,days[4]=31,30,31,days[1]=29};

int a[23]={a[1]=2}; 是可以这样吧

这是什么语法，即然是初始化，一次把12个月的都输进去不就行了


Question: C 语言 for嵌套循环怎么跳不出内层循环了？

老坑了都是。

引用 2 楼 zjq9931的回复:if((m=1))  应当是 if((m==1)) 感谢(❁´ω`❁)，被这个耽误了半天时间，感谢感谢

引用 3 楼 阿大古 古古古的回复:条件语句 == 和 =  谢谢，感谢，竟然没注意到

引用 1 楼 636f6c696e的回复:if判断比较相等是==而不是= =是赋值，==才是比较 谢谢，真是醉了，都没注意到这个问题

条件语句 == 和 =

if((m=1))  应当是 if((m==1))

if判断比较相等是==而不是= =是赋值，==才是比较

哈哈，下次可以把数值1放在 == 前面，这样万一少写了也会报错~