Question: Dev c++没有输出结果！各种方法试过 就是没有输出结果！ 求大神解！

应该对的吧……╮(╯▽╰)╭今天调试代码心情有点急躁(；′⌒`)

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

工程当中两个文件， main.c和1.c  项目 - 项目属性 - 文件 这里可以看到有两个文件1.c 和 main.c 这里面有个链接属性，如果不勾选，那么就不会编译链接这个文件    这属于项目下的多文件管理的问题 初学的还是老实的main.c函数里面修改吧。 把1.c的内容都复制到main.c里面去， 删除1.c文件

程序没问题，编译器也应该没问题，可能是编译器与操作系统不兼容所致。解决办法：1.将release mode 改为debug mode;2.换一种编译器，如CodeLite

重新下一个，程序没问题，你的DEV可能在扯拐

引用 8 楼 weixin_45467834的回复:[quote=引用 6 楼 一剑天残 的回复：]一个项目里只能有一个main函数，你删除一个。 如果还是没输出，那个就是编译环境的问题了好的我试试！ 谢谢您！ [/quote] 用`你`吧，我才17岁

引用 6 楼 一剑天残 的回复：一个项目里只能有一个main函数，你删除一个。 如果还是没输出，那个就是编译环境的问题了好的我试试！ 谢谢您！

引用 5 楼 自信男孩 的回复：代码没发现什么问题，要么是环境有问题，要么在return之前加一句getchar();或这system("pause");这个我也加了 都没办法 编译环境我改过一个显示输出的那个 但还是这样

引用 3 楼 一剑天残 的回复：你那个main.c里面写了什么这是main.c 里的内容！！  #include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) { 	return 0; }

你那个main.c里面写了什么

可以输出的，建议把 DEV C++ IDE 重新下载一遍

引用 16 楼 我本无忧 的回复：那个…我用DEVc++写了和你一模一样的代码，有结果的我环境的问题

引用 13 楼 赵4老师 的回复：Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt谢谢！ 我用虚拟器后能输出了

那个…我用DEVc++写了和你一模一样的代码，有结果的

引用 14 楼 我本无忧 的回复：或许你创建个文件试试？不要创建项目我发现了 环境问题 用虚拟器模拟win7 就能用了

或许你创建个文件试试？不要创建项目

引用 11 楼 一剑天残 的回复：抱歉，能力有限我也不知道了好吧 麻烦了


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: c语言编译遇到的问题

程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。  关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 ……

这是环境问题，程序没什么问题。建议检查一下环境，也可以把错误信息在网上搜一下～

程序没问题。环境没搞好

可能是环境没搭好吧。

项目--右键--重新生成. 确保生成成功后再执行.


Question: c语言怎么遍历目录下的子目录在tc环境下

引用 14 楼 赵4老师 的回复:[quote=引用 13 楼 ooolinux 的回复:]  这些都是Win32 API的例子吧，和BC的C函数的例子不是一回事。 不然我怎么会说“凑合”呢？[/quote]  该凑合凑合~

引用 13 楼 ooolinux 的回复:[quote=引用 11 楼 赵4老师 的回复:] [quote=引用 10 楼 ooolinux 的回复:] [quote=引用 9 楼 赵4老师 的回复:] bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028  现在用bc学习已经不方便了，需要dosbox，还好bc支持鼠标。 老赵应该把bc帮助里面的例子程序都提取出来，变成Windows下可查看，方便初学者。 或者搞一个程序读取它的帮助文件格式。[/quote] 凑合用MSDN98里的例子VC入门吧。 https://bbs.csdn.net/topics/390374955[/quote]  这些都是Win32 API的例子吧，和BC的C函数的例子不是一回事。[/quote] 不然我怎么会说“凑合”呢？

引用 11 楼 赵4老师 的回复:[quote=引用 10 楼 ooolinux 的回复:] [quote=引用 9 楼 赵4老师 的回复:] bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028  现在用bc学习已经不方便了，需要dosbox，还好bc支持鼠标。 老赵应该把bc帮助里面的例子程序都提取出来，变成Windows下可查看，方便初学者。 或者搞一个程序读取它的帮助文件格式。[/quote] 凑合用MSDN98里的例子VC入门吧。 https://bbs.csdn.net/topics/390374955[/quote]  这些都是Win32 API的例子吧，和BC的C函数的例子不是一回事。

C入门用这个： C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

引用 10 楼 ooolinux 的回复:[quote=引用 9 楼 赵4老师 的回复:] bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028  现在用bc学习已经不方便了，需要dosbox，还好bc支持鼠标。 老赵应该把bc帮助里面的例子程序都提取出来，变成Windows下可查看，方便初学者。 或者搞一个程序读取它的帮助文件格式。[/quote] 凑合用MSDN98里的例子VC入门吧。 https://bbs.csdn.net/topics/390374955

引用 7 楼 轻箬笠 的回复:[quote=引用 4 楼 轻箬笠 的回复:] _findfirst,_findnext  findfirst,findnext[，borlandc是有提供这个的，在include/dir.h里面。这个我用过。 另外，borlandc在inlcude/dos.h中还提供了_dos_findfirst,_dos_findnext。这两个我还没用过。[/quote]  Borland的开发工具还是很方便的，那时候转到微软的Microsoft C++就会不便了，不过大家基本都是用TC和Borland C++。

引用 4 楼 轻箬笠 的回复:_findfirst,_findnext  findfirst,findnext[，borlandc是有提供这个的，在include/dir.h里面。这个我用过。 另外，borlandc在inlcude/dos.h中还提供了_dos_findfirst,_dos_findnext。这两个我还没用过。

引用 5 楼 ooolinux 的回复:[quote=引用 4 楼 轻箬笠 的回复:] _findfirst,_findnext  DOS下好像没有这个API，要自编函数实现。[/quote] tc不知道，不过borlandc是有提供这个的，在include/dir.h里面

引用 4 楼 轻箬笠 的回复:_findfirst,_findnext  DOS下好像没有这个API，要自编函数实现。

引用 9 楼 赵4老师 的回复:bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028  现在用bc学习已经不方便了，需要dosbox，还好bc支持鼠标。 老赵应该把bc帮助里面的例子程序都提取出来，变成Windows下可查看，方便初学者。 或者搞一个程序读取它的帮助文件格式。

system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE);

TC？！未必有什么特别特别特别的特殊需求？

TC环境没有意义了，以前DOS平台的硬盘文件系统，API都不同了。


Question: 请大佬帮忙看个问题

Testtwo1. C文件需要引用Testhead头文件

引用 1 楼 user-2的回复:你这哪报“makefile.w？已经改变，重新从硬盘读取”了，你这报的不是找不到convert函数么 抱歉，眼花没看到


Question: LELE的RPG难题解析

基本的递推问题，有啥疑问


Question: typedef  char a[10]; a *p; 请问这样p到底是个什么指针啊？p[0]是个啥呢

p是一个指向列数是10的char类型指针。建议通过比较p和p+1地址，已经sizeof(a)和sizeof(*p)来进一步了解p的类型

p是指向字符數組首地址的指針吧，我的理解。 這樣理解的話，p[0]就是一個字符數組，有10個元素。

首先a被定义为char [10]类型 a* p；那么p的类型为char(*)[10]； 告诉你一个方法去查看数据的原始类型 需要头文件#include<typeindex> 使用方法如下  #include<iostream> #include<typeindex> using namespace std;  int main() {  	typedef  char a[10]; 	a* p; 	type_index tp(typeid(p)); 	cout<<tp.name(); 	return 0; }

a=char[10] 所以p是指向char[10]的指针

理解和讨论之前请先学会如何观察！ //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]


Question: 求助大佬，运行时没有错误，咋就运行结果不对

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


Question: 顺序查找的下标从哪里开始

数组下表是从0开始的，这是C语言的规定。如果下表从1开始，那么0空间要么用作他用，要么就浪费了。

如果数组存储在[1，n]这块空间上（a[0]不用），可以把a[0]赋值为key，然后反向从a[n]开始查找，找到返回下标即可（返回0，说明不存在），很显然那人用的数组结构是将数据存到[1，n]，所以应该从什么地方开始，取决于你自己的结构，可能你的是[0，n)，那你就从0开始


Question: 用C写了一个简易的学生管理系统，之前运行没问题，不知怎的又一次打开不能运行了，而且也没有报错，这到底是怎么回事呀?求大神们指点迷津

你一跑起来程序就崩了，设断点调试啊，你这样拍个部分代码的图片别人也不知道是什么呀

建议贴出代码，不要截图，程序可能有问题～

可以先注释掉一部分代码， 先从显示那个菜单入手， 也就是先运行interface 函数


Question: 请教 哪里有学习C语言的QQ群与微信群

对，关键是自己去敲，gdb慢慢调，别一遇到问题就问，起码先自己想清楚了再问

兄弟，C有点难操控，但也不难，买本书，随便一本，多写几个杂题，会基本用法就成，不急着往深里去。然后找个小项目小软件进行模仿，边敲边想边学，慢慢就上手的。如果加群了，有什么问题就问，没细心思考的过程，对自己反而不好


Question: 求大神指点，Windows的安装更新与卸载更新，如何用C语言实现？

SDK了解一下

引用 楼主 MY19890103 的回复:之前一直用  kb.msu /insstall /quiet kb.msu /unistall /quiet 两条简单的批处理命令，但是最近想用C语言实现，但是看了Windows Update Agent API  函数，一头雾水呀？   求大神指点一下，这玩意咋调用呀？  会COM就会玩，也不是特别难


Question: 字符串分割，请问我错在哪里，这样运行结果不对

建议楼主贴出测试用例

仅供参考：#include <stdio.h> #include <string.h> char string[80]; char seps1[3]; char seps2[3]; char *token; char *zzstrtok (     char *string,     const char *control1,//连续出现时视为中间夹空token     const char *control2 //连续出现时视为中间无空token     ) {     unsigned char *str;     const unsigned char *ctrl1 = (const unsigned char *)control1;     const unsigned char *ctrl2 = (const unsigned char *)control2;     unsigned char map1[32],map2[32];     static char *nextoken;     static char flag=0;     unsigned char c;     int L;      memset(map1,0,32);     memset(map2,0,32);     do {         map1[*ctrl1 >> 3] |= (1 << (*ctrl1 & 7));     } while (*ctrl1++);     do {         map2[*ctrl2 >> 3] |= (1 << (*ctrl2 & 7));     } while (*ctrl2++);      if (string) {         if (control2[0]) {             L=strlen(string);             while (1) {                 c=string[L-1];                 if (map2[c >> 3] & (1 << (c & 7))) {                     L--;                     string[L]=0;                 } else break;             }         }         if (control1[0]) {             L=strlen(string);             c=string[L-1];             if (map1[c >> 3] & (1 << (c & 7))) {                 string[L]=control1[0];                 string[L+1]=0;             }         }         str=(unsigned char *)string;     }     else str=(unsigned char *)nextoken;      string=(char *)str;     while (1) {         if (0==flag) {             if (!*str) break;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 break;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 string++;                 str++;             } else {                 flag=1;                 str++;             }         } else if (1==flag) {             if (!*str) break;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 flag=0;                 break;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 *str=0;                 str++;                 flag=2;                 break;             } else str++;         } else {//2==flag             if (!*str) return NULL;             if (map1[*str >> 3] & (1 << (*str & 7))) {                 str++;                 string=(char *)str;                 flag=0;             } else if (map2[*str >> 3] & (1 << (*str & 7))) {                 str++;                 string=(char *)str;             } else {                 string=(char *)str;                 str++;                 flag=1;             }         }     }     nextoken=(char *)str;      if (string==(char *)str) return NULL;     else                     return string; } void main() {     strcpy(string,"A \tstring\t\tof ,,tokens\n\nand some  more tokens, ");     strcpy(seps1,",\n");strcpy(seps2," \t");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"1234| LIYI|China | 010 |201110260000|OK");     strcpy(seps1,"|");strcpy(seps2," ");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"1234|LIYI||010|201110260000|OK");     strcpy(seps1,"");strcpy(seps2,"|");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"1234|LIYI||010|201110260000|OK");     strcpy(seps1,"|");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"a");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"a,b");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"a,,b");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",a");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,"a,");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",a,,b");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",,a,,b,,");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",,");     strcpy(seps1,",");strcpy(seps2,"");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     }      strcpy(string,",,,");     strcpy(seps1,",");strcpy(seps2," ");     printf("\n[%s]\nTokens:\n",string);     token=zzstrtok(string,seps1,seps2);     while (token!=NULL) {         printf(" <%s>",token);         token=zzstrtok(NULL,seps1,seps2);     } } // //[A      string          of ,,tokens // //and some  more tokens, ] //Tokens: // <A> <string> <of> <> <tokens> <> <and> <some> <more> <tokens> <> //[1234| LIYI|China | 010 |201110260000|OK] //Tokens: // <1234> <LIYI> <China> <010> <201110260000> <OK> //[1234|LIYI||010|201110260000|OK] //Tokens: // <1234> <LIYI> <010> <201110260000> <OK> //[1234|LIYI||010|201110260000|OK] //Tokens: // <1234> <LIYI> <> <010> <201110260000> <OK> //[a] //Tokens: // <a> //[a,b] //Tokens: // <a> <b> //[a,,b] //Tokens: // <a> <> <b> //[,a] //Tokens: // <> <a> //[a,] //Tokens: // <a> <> //[,a,,b] //Tokens: // <> <a> <> <b> //[,,a,,b,,] //Tokens: // <> <> <a> <> <b> <> <> //[,] //Tokens: // <> <> //[,,] //Tokens: // <> <> <> //[,,,] //Tokens: // <> <> <> <>

没看出啥错，啥问题

你这样是不是掉了了个字符

引用 7 楼 user-5的回复:[quote=引用 6 楼 weixin_44775375 的回复:] 测试用例： 输入形式 abc,DE , 输出形式 abc                  DE   你只是输出达到了要求，但是拆分后应当是字符串数组，然，你没有保存这些字符串数组，也就是你你的拆分结果无法重复使用。[/quote] 噢噢，知道了😊谢谢

引用 6 楼 weixin_44775375 的回复:测试用例： 输入形式 abc,DE , 输出形式 abc                  DE   你只是输出达到了要求，但是拆分后应当是字符串数组，然，你没有保存这些字符串数组，也就是你你的拆分结果无法重复使用。

测试用例： 输入形式 abc,DE , 输出形式 abc                  DE

引用 1 楼 mhysmile888的回复:你这样是不是掉了了个字符 掉了哪个字符？我的测试结果看上去是正确的，但提交作业就错了


Question: c 语言链表问题，求大神解答

引用 2 楼 自信男孩的回复:#include<stdio.h> #include<stdlib.h> #include <string.h> #include<math.h>  //struct ticket    //后面的需要加typedef typedef struct ticket {     char nam[40];     //long int num[40];     long int num;     char depart[40];     char arrive[40];     char seat[40];     char money[40];     struct ticket *next; }TIC;  void landing() {     system("cls");     printf("\t\t\t火车票后台管理系统\t\t\t\n");     printf("=======*******1.增加学生信息********========");     printf("=======*******2.修改学生信息********========");     printf("=======*******3.删除学生信息********========");     printf("=======*******4.显示学生信息********========");     printf("=======*******5.保存学生信息********========");     printf("=======*******6.读取学生信息********========");     system("pause"); }  void select() {     int a;     system("cls");     printf("请输入数字，以便您选择:\n输入：");     scanf("%d",&a);     for(int i=0;i<=5;i++)     {         if(strcmp(a,i)==0)         {             switch(a)             {                 case 1: addup();                         break;                 case 2: amaned();                         break;                 case 3: Delete();                         break;                 case 4: show();                         break;                 case 5:save();                        break;                 case 6:read();                        break;             }         }         else {             printf("您输入的数字错误");             break;         }     }     system("pause");  }  //struct TIC *addup() TIC *addup() {     TIC *head,*p,*q;      head=(TIC*)malloc(sizeof(TIC));     head->next=NULL;     p=head;     q = (TIC*)malloc(sizeof(TIC));      setdata(q);      while((q->nam)>0)     {         p->next=q;         p=q;         q=(TIC*)malloc(sizeof(TIC));         setdata(q);     }     p->next=NULL;      return head }  void amaned(TIC *p) {     TIC *q;     int s;     long int a;      system("cls");     printf("输出关于需修改有关旅客信息的列车编号：");     scanf("%ld", &a);     for(p=head->next;p!=NULL;p=p->next)     {         //while(strcmp(p->num,a)==0)    //a 为long int类型，怎么能用strcmp比较呢？         //while(strcmp(p->num, a)==0)         while(p->num == a)         {             printf("旅客信息显示\n");             printf("乘客姓名：\t");             puts(p->nam);             printf("\n");             printf("列车编号：\t");             //printf("%ld\n",&p->num);             printf("%ld\n", p->num);             printf("起始站：\t");             puts(p->depart);             printf("终点站: \t");             puts(p->arrive);             printf("\n");             printf("座位号：\t");             puts(p->seat);             printf("\n");             printf("车票金额：\t");             puts(p->money);             //p = q;             q = p;             break;         }     }      printf("请选择：1.乘客姓名，2.列车编号,3.起始站,4.终点站，5.座位号，6.车票金额");      scanf("%d", &s);      if (s < 1 || s > 6) {         printf("您输入的数字错误");         return;     }      //if(s>=1&&s<=6)     //{     switch(s)     {         case 1:printf("输入乘客姓名：");                gets(q->nam);                break;          case 2:printf("输入列车编号：");                scanf("%ld",&q->num);                break;          case 3:printf("输入起始站：");                gets(q->depart);                break;          case 4:printf("输入终点站：");                gets(q->arrive);                break;          case 5:printf("输入座位号：");                gets(q->seat);                break;          case 6:printf("输入车票金额：");                gets(q->money);                break;     }      //}      //else     //   printf("您输入的数字错误");      system("pause"); }  void setdata() {      TIC *p;     printf("*******旅客信息增加*******\n\n");     printf("名字：\t");     gets(p->nam);     printf("\n");     printf("列车编号：\t");     //scanf("%ld\n",&p->num);    //看好自己定义的类型     scanf("%ld", p->num);     printf("起始站：\t");     gets(p->depart);     printf("终点站: \t");     gets(p->arrive);     printf("\n");     printf("座位号：\t");     gets(p->seat);     printf("\n");     printf("花费金额：\t");     gets(p->money); }  void Delete() {     TIC *head,*p,*q;     char i[10];      p = head;      printf("请输入待删旅客的名字：");     //scanf("%s",&i[10]);   //用法有问题     scanf("%s", i);      //while((p!=0)&&(p->nam!=i[10]))     //前面还知道用strcmp，这儿怎么突然直接比较呢？     while((p!= NULL)&&strcmp(p->nam, i) != 0)     {         q=p;         p=p->next;     }      if(p==NULL)         printf("该信息没有找到");     else     {         q->next=p->next;         free(p);     } }  void show(TIC *head) {     TIC *p;     p = head;      for(p=head->next;p!=NULL;p=p->next)     {         printf("旅客信息显示\n");         printf("乘客姓名：\t");         puts(p->nam);         printf("\n");         printf("列车编号：\t");         //printf("%ld\n",&p->num);    //printf是不是和scanf搞混了 ?         printf("%ld\n", p->num);         printf("起始站：\t");         puts(p->depart);         printf("终点站: \t");         puts(p->arrive);         printf("\n");         printf("座位号：\t");         puts(p->seat);         printf("\n");         printf("车票金额：\t");         puts(p->money);     }      system("pause");  }  #if 0 void save() {     FILE *fp;      //if((fp=fopen("c.txt","wb")==NULL);    //这儿的逗号做啥子？,是不是还缺少一个小括号?     if ((fp=fopen("c.txt","wb"))==NULL) {         printf("不能打开文件");         exit(0);     }      //if(fscanf(fp,"%s, %ld", landing, select)!=1)   //这是读2个参数为啥比较是否等于1呢？     //if(fscanf(fp,"%s, %ld", landing, select) != 2)     if(fscanf(fp, "%s, %ld", &landing, &select) != 2)  //这是什么操作，没见过         printf("不能管理文件");      fclose(fp); }  void write() {      FILE *fp;     //if((fp=fopen("c.txt","rb")==NULL);    //还有这儿为啥用分号呢？     if((fp=fopen("c.txt","rb"))==NULL) {         printf("不能打开文件");         exit(0);     }      //if(fprintf(fp,"%s,%ld",&landing,&select)!=1)     //if(fprintf(fp,"%s,%ld",&landing,&select)!=2)     if(fprintf(fp,"%s,%ld", landing, select)!=2)    //这是什么操作，没见过         printf("不能管理文件");      fclose(fp); } #endif  int main() {      TIC *head;     head=addup();     show(head);      return 0; }  楼主的问题不是链表问题，链表太高深，你的问题是基本的语言基础问题，错误太多，还有文件读写的操作没见过这么写的，我都修改不下去了。基础太差了，书上的东西没看仔细吧。 建议好好补补基础的东西，书上的习题和例题好好练练，模仿一下，不能自己想当然的去写。 好的好的，谢谢学长。因为我一个人看书，有时候理解不太到位

大部分的错误已经修改，建议把剩下的错误再改改，读写文件的部分再翻开书看看

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


Question: 链表的逆置问题

还是直接贴出代码吧，从结果上来看，肯定是链表倒置时有点小问题。

总的来说你没把开始的头节点放在新链表的头部，而是把它留到了最后。

就地倒置你把开始的head节点放在了最后，head节点你肯定没有指定值，所以说这个值是未知的。等你倒置完，打印却从现在开始节点的下一个打印，就漏掉了一个8，而原本的头节点在最后，打印了一个未知的值。


Question: 蓝桥杯基础题

说不超过10，00，位是数字的位数比如你说的FFFFFF有6位，这样的数据longlong怎么够呢，要用字符串进行模拟（追根溯源，那些所谓的数值不就是一串符号吗）


Question: printf没反应！

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

程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。

引用 4 楼 赵4老师的回复:[quote=引用 2 楼 weixin_45454627 的回复:] [quote=引用 1 楼 赵4老师的回复:]现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 你好，你说的进入cmd执行我知道的，我不明白的是用Dev-C++或Visual执行程序后在Windows10上结果和Windows7上不一样[/quote] 当前文件夹不同 64位/32位不同 使用的编译器链接器不同 依赖的dll及其版本号不同 ……[/quote] 你好，那我应该怎么解决这个问题呢？

引用 2 楼 weixin_45454627 的回复:[quote=引用 1 楼 赵4老师的回复:]现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 你好，你说的进入cmd执行我知道的，我不明白的是用Dev-C++或Visual执行程序后在Windows10上结果和Windows7上不一样[/quote] 当前文件夹不同 64位/32位不同 使用的编译器链接器不同 依赖的dll及其版本号不同 ……

闪过  在printf后面加个 getchar  或者 system("pause")

引用 1 楼 赵4老师的回复:现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 你好，你说的进入cmd执行我知道的，我不明白的是用Dev-C++或Visual执行程序后在Windows10上结果和Windows7上不一样


Question: 被scanf折腾的死去活来！

printf("input Age%d\n",i+1"); 这种都多了个引号

你这程序编译的过么？

年过40，不转型不行了，电脑程序学起来真费劲。

引用 3 楼 user-1的回复:printf("input Age%d\n",i+1"); 这种都多了个引号 已发现问题，谢谢啊！


Question: PAT1088三人行  测试点四答案错误  求大佬改正

引用 1 楼 user-1的回复:compare函数的参数也需要用double https://blog.csdn.net/qq_40946921/article/details/82658295  #include<stdio.h>  #include<math.h> int compare(double a,double b)  { if(a==b) printf("Ping"); if(a<b)  printf("Cong"); if(a>b)  printf("Gai"); } int main() { int m,n,i,a,b,ni; double sum,c; scanf("%d%d%d",&ni,&m,&n); /*if(m==0||n==0)  {printf("No Solution\n");  return 0;      }*/  for(i=99;i>=10;i--) {     a=i%10; b=i/10; sum=a*10+b; if(m!=0)     c=(double)abs(i-sum)*1.0/m;     if(c!=0)      { if(sum/c==n)  {    //	printf("%d %f %d\n",i,sum,c);    printf("%d ",i);    compare(ni,i);    printf(" ");    compare(ni,sum);    printf(" ");    compare(ni,c); break; }     	} } if(i==9) printf("No Solution\n"); }  感谢大佬


Question: 请问有人能解释为啥是b吗

有时间和精力多研究和学习其他的知识，像这类习题建议可以抛弃了，研究这个是要学习怎么用吗？如果不是，也建议你不要写这样的代码，否则会被别人骂的。

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

百度序列点你就能知道这种垃圾代码的结果未定义行为  或许题目的考点是printf参数从右到左计算，所以分割运算为： j--;   输出10，但j变为9 ++i+j++ 输出11 + 9 = 20 所以输出是20,10

我认为应该抵制这种题目，真的没有意义。谁开发会这样写？

你确认答案是b吗？ vs下运行你的代码得出  21, 10  j--  j++ 都在整条语句结束后才增减吧

先算后面 j-- 了，j=9，然后++i+j++=20


Question: c语言表达式求值

邀请大佬解答： https://bbs.csdn.net/topics/394784884

printf("%d\n", a=a+++1); 这样的代码写在工程里会被别人骂的

一个序列点对同一变量多次赋值是未定义行为，结果不可预期 死钻牛角尖没有意义


Question: 结构体的问题

引用 楼主 qq_34010404 的回复:struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 把unsigned改成char就是1了。

结构体对齐、指针强转概念不清 引用 4 楼 qq_34010404 的回复:[quote=引用 1 楼 user-6的回复:][quote=引用 楼主 qq_34010404 的回复:] struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 结构体在编译之后会调整内存对齐，也就是硬件寻址的基本单位，比如32位电脑,那就是四字节对齐，这样的目的是为了更快的寻址，提高读取数据的效率，这个可以在编译时修改参数来调整，如果不调整的情况下，32位应用程序结构中的默认为4字节对齐，不过看你这个编码应该不是32位的，应该是单片机的[/quote] BYTE*p; char a=100; p=(BYTE*)&a; p-b>it1......这样为什么能把a的八个位都取出来?[/quote]

unsigned char不行吗？ 一位的话，signed char取值-1，0 unsigned char取值0，1

unsigned即unsigned int，无论在32位机器或是64位机器，都是占用4字节。 结构体BYTE用了8个位域，每个位域分别占用1位，总共占用1个字节，但是结构体内存对齐会使BYTE占用4个字节

unsigned大小是4，在怎么用位域，大小还是4

引用 7 楼 轻箬笠的回复:[quote=引用 楼主 qq_34010404 的回复:] struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 把unsigned改成char就是1了。 [/quote] 改成char真变成1了

引用 6 楼 636f6c696e的回复:结构体对齐、指针强转概念不清 [quote=引用 4 楼 qq_34010404 的回复:] [quote=引用 1 楼 user-6的回复:][quote=引用 楼主 qq_34010404 的回复:] struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 结构体在编译之后会调整内存对齐，也就是硬件寻址的基本单位，比如32位电脑,那就是四字节对齐，这样的目的是为了更快的寻址，提高读取数据的效率，这个可以在编译时修改参数来调整，如果不调整的情况下，32位应用程序结构中的默认为4字节对齐，不过看你这个编码应该不是32位的，应该是单片机的[/quote] BYTE*p; char a=100; p=(BYTE*)&a; p-b>it1......这样为什么能把a的八个位都取出来?[/quote][/quote] BYTE大小是4，为什么能指向一个一字节大小的变量，而且每个成员都对应一字节变量的每一位

unsigned默认是unsigned int类型，所以得到的结果应该是sizeof(unsigned int)的值。

仅供参考：#include <stdio.h> #define field_offset(s,f) (int)(&(((struct s *)(0))->f)) struct AD  { int a; char b[13]; double c;}; #pragma pack(push) #pragma pack(1) struct A1  { int a; char b[13]; double c;}; #pragma pack(2) struct A2  { int a; char b[13]; double c;}; #pragma pack(4) struct A4  { int a; char b[13]; double c;}; #pragma pack(8) struct A8  { int a; char b[13]; double c;}; #pragma pack(16) struct A16 { int a; char b[13]; double c;}; #pragma pack(pop) int main() {     printf("AD.a %d\n",field_offset(AD,a));     printf("AD.b %d\n",field_offset(AD,b));     printf("AD.c %d\n",field_offset(AD,c));     printf("AD sizeof %d\n", sizeof(AD));     printf("\n");     printf("A1.a %d\n",field_offset(A1,a));     printf("A1.b %d\n",field_offset(A1,b));     printf("A1.c %d\n",field_offset(A1,c));     printf("A1 sizeof %d\n", sizeof(A1));     printf("\n");     printf("A2.a %d\n",field_offset(A2,a));     printf("A2.b %d\n",field_offset(A2,b));     printf("A2.c %d\n",field_offset(A2,c));     printf("A2 sizeof %d\n", sizeof(A2));     printf("\n");     printf("A4.a %d\n",field_offset(A4,a));     printf("A4.b %d\n",field_offset(A4,b));     printf("A4.c %d\n",field_offset(A4,c));     printf("A4 sizeof %d\n", sizeof(A4));     printf("\n");     printf("A8.a %d\n",field_offset(A8,a));     printf("A8.b %d\n",field_offset(A8,b));     printf("A8.c %d\n",field_offset(A8,c));     printf("A8 sizeof %d\n", sizeof(A8));     printf("\n");     printf("A16.a %d\n",field_offset(A16,a));     printf("A16.b %d\n",field_offset(A16,b));     printf("A16.c %d\n",field_offset(A16,c));     printf("A16 sizeof %d\n", sizeof(A16));     printf("\n");     return 0; } //AD.a 0 //AD.b 4 //AD.c 24 //AD sizeof 32 // //A1.a 0 //A1.b 4 //A1.c 17 //A1 sizeof 25 // //A2.a 0 //A2.b 4 //A2.c 18 //A2 sizeof 26 // //A4.a 0 //A4.b 4 //A4.c 20 //A4 sizeof 28 // //A8.a 0 //A8.b 4 //A8.c 24 //A8 sizeof 32 // //A16.a 0 //A16.b 4 //A16.c 24 //A16 sizeof 32 // //

结构体指针 ->就代表指向成员的偏移，有指针，有偏移，有成员类型，肯定可以取出来了

引用 1 楼 user-6的回复:[quote=引用 楼主 qq_34010404 的回复:] struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 结构体在编译之后会调整内存对齐，也就是硬件寻址的基本单位，比如32位电脑,那就是四字节对齐，这样的目的是为了更快的寻址，提高读取数据的效率，这个可以在编译时修改参数来调整，如果不调整的情况下，32位应用程序结构中的默认为4字节对齐，不过看你这个编码应该不是32位的，应该是单片机的[/quote] BYTE*p; char a=100; p=(BYTE*)&a; p-b>it1......这样为什么能把a的八个位都取出来?

引用 楼主 qq_34010404 的回复:struct BYTE {  unsigned bit1:1;  unsigned bit2:1;  unsigned bit3:1;  unsigned bit4:1;  unsigned bit5:1;  unsigned bit6:1;  unsigned bit7:1;  unsigned bit8:1; };  这个BYTE的大小为什么不是1] 结构体在编译之后会调整内存对齐，也就是硬件寻址的基本单位，比如32位电脑,那就是四字节对齐，这样的目的是为了更快的寻址，提高读取数据的效率，这个可以在编译时修改参数来调整，如果不调整的情况下，32位应用程序结构中的默认为4字节对齐，不过看你这个编码应该不是32位的，应该是单片机的


Question: 误删了点东西，就这样了，新写的不能执行，以前的就会出现第二张图的情况，该怎么办？

修复一下编译器，如果你删的编译器的一些东西。

改项目名称了吧，一个是Project4一个是Project16，建议新建个项目试试


Question: 关于Python2.7.13不能识别“（）“的问题，

引用 3 楼 kuangbao9的回复:如果是英文括号，中间有没有空格或者有几个空格都不会有错的。 看着更像是输入的不是英文字符 我试了一下，就是中文括号的问题，

引用 2 楼 insisted_search的回复:你写的括号是中文的吧？？？？？ 我试了一下，输入是中文的括号的问题

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

你写的括号是中文的吧？？？？？

多 了无谓的空格吧


Question: 求问这段全排列代码有问题吗？

仅供参考：//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //


Question: 道题是算 3！+2！的值，为什么出现不兼容

OK ，调试成功

1、函数要先定义再调用，或者先声明，后面再定义，调用时就无所谓定义的先后顺序，函数的声明要在main函数之外，但是你声明在main内部了。 2、你是要计算（a^2）! + (b^2)!,还是要调用a! + b!. 3、你的square没有使用return返回值。 4、main函数中调用square也没有将值赋给s

square()函数没有返回值，而且square()里调用的factorial()没有被声明 把main里面的两个函数声明提到main前面，square添加返回值

你设个long 函数为什么不给返回值


Question: C语言中运行到fprintf函数就报程序已停止运行

为了验证，你可以试试在结构里加一个short padding，其它代码保持原样，跑一下看看。   typedef struct {     short tiyu;     short padding; }

引用 3 楼 SHI家的鱼 的回复:[quote=引用 1 楼 weixin_45444699 的回复:] short 类型对应的是 %hd。所以你在scanf 和sprintf 时都使用%hd 就行了。  我知道scanf 和sprintf 时都使用%hd 就行了，但是我想知道 scanf("%d",&stu.tiyu); 这样用会发生错误的原因是什么[/quote]  因为short的长度是两个字节，而一般情况下int是4个字节长度。所以student在结构体也是4个字节长度。 当你用%d时，scanf抓了一个4字节长度的int写到了2个字节长度的结构体student里，造成了2个字节的溢出。那这溢出的两个字节的溢出去哪里了呢？很有可能就写到了FP文件指针里。因为你这个文件指针就声明在student结构体变量的后面，编译器有极大可能把两个安排在紧挨着的内存位置里了。所以一旦结构体溢出了，文件结构体就会被复写，被污染了。造成了文件写入错误。  上述这些是建立在你编译器规定int长度是4字节的情况下，某些编译器会规定int为2字节（如很多arm单片机里），和short一样，就不会有这个问题了。

引用 1 楼 weixin_45444699 的回复:short 类型对应的是 %hd。所以你在scanf 和sprintf 时都使用%hd 就行了。  我知道scanf 和sprintf 时都使用%hd 就行了，但是我想知道 scanf("%d",&stu.tiyu); 这样用会发生错误的原因是什么

本地运行没有问题，理论上short用%d输入输出也不会出现异常

要会单步调试，加断点调试，看看内存情况就知道了 应该是sscanf越界了，%d是4个字节，但是你结构体只有2个字节，把0复制给了fd，然后就出错了

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

引用 3 楼 SHI家的鱼 的回复:[quote=引用 1 楼 weixin_45444699 的回复:] short 类型对应的是 %hd。所以你在scanf 和sprintf 时都使用%hd 就行了。  我知道scanf 和sprintf 时都使用%hd 就行了，但是我想知道 scanf("%d",&stu.tiyu); 这样用会发生错误的原因是什么[/quote] 只要输入的数据值不超过short的取值范围都不会有问题，如果超出了short的取值范围，会出现输入的值和存到stu.tiyu的值不一致， 其实相当于截断了。因为tiyu这个变量存不下这么大的值。  但是不论怎么样（超出范围和不超出范围）的输入都不会让程序崩了。并且fprintf而不会有问题，程序如果是崩了建议查查其他原因

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。


Question: 同样的程序在Windows下没出过问题，在Linux下偶发性崩溃，我自己也快崩溃了

引用 2 楼 user-1 的回复：典型的踩内存问题 把linux的内存管理结构踩了，就会出现这个异常 windows不出不代表windows没问题越界了，导致后边的程序申请空间的时候发生崩溃。Windows 确实没有这个问题，是在不同平台基础类型大小不一样导致的。空间分大点就好了。

早就解决了，反正没人回帖，结了。


Question: 关于for嵌套

引用 2 楼 user-4 的回复:别的不说这代码真的写的很垃圾，没有缩进可读性太差了，就会楼主这样的问题 要求太高了，谁没有写过垃圾代码的时候？可以先问问自己～

for循环还是带花括号吧  要不然 你都不知写了些什么

求质数就是要用穷举法，在边界内a%b==0（非质数）则跳出循环，否则超出边界则认为这个数是质数。 第一个：b<(a/b)是穷举的边界；第二个：b>(a/b)是循环内第一个超出边界的情况，循环必定会自动跳出的。  穷举质数还是需要优化一下，比如：除了2，其他偶数都不可能是质数，所以没必要每个数都判断一遍，只要判断奇数就可以了。

别的不说这代码真的写的很垃圾，没有缩进可读性太差了，就会楼主这样的问题

已经知道了 谢谢大佬


Question: 小白希望大佬们能帮帮忙看看程序错误

#include<stdlib.h> #include<string.h> #include<stdio.h>  #define length_of_number 20 #define length_of_name 15 #define length_of_caozuo 30  #define false 0 #define true 1  typedef struct Stumath {     char number[length_of_number];     char name[length_of_name];     int math;     struct Stumath *Next; }Stu;  struct Stumath *pstheadnod=NULL;  Stu *Find_student_by_number(char *pcnumber) {     Stu *Current=NULL;      //if(Current==NULL)     if (pstheadnod == NULL)     {         return false;     }      Current=pstheadnod;     while (Current)     {         if(0==strncmp(pcnumber,Current->number,length_of_number))         {             break;         }         Current = Current->Next;     }      return Current; }  int check_insert_student(Stu *Stnumber) {     Stu *pNow;     if(Stnumber==NULL)     {         printf("学生信息为空\n");         return false;     }     if(pstheadnod==NULL) {         pstheadnod=Stnumber;         return true;     }        pNow=pstheadnod;         while (pNow->Next)         {             pNow = pNow->Next;         }         pNow->Next=Stnumber;     return true; }  int insert_data() {     Stu Studata;     Stu *pstdata=NULL;     memset(&Studata,0,sizeof(Stu));     printf("请输入学生信息:\n");     scanf("%s %s %d",Studata.number,Studata.name,&Studata.math);     if(NULL != Find_student_by_number(Studata.number))     {         printf("已经有人使用学生信息，请重新输入:\n");         return false;     }     pstdata=(Stu *)malloc(sizeof(Stu));     if(pstdata==NULL)     {         printf("系统内存不足\n");         return false;     }     memset(pstdata,0,sizeof(Stu));     strncpy(pstdata->number,Studata.number,length_of_number);     strncpy(pstdata->name,Studata.name,length_of_name);     pstdata->math=Studata.math;     if(false==check_insert_student(pstdata))     {         free(pstdata);         printf("插入数据错误\n");         return false;     }     printf("插入成功\n");     return true; } int delete_by_name(char *pcname) {     Stu *before=NULL;     Stu *Dangqian=NULL;     if(pcname==NULL)     {         printf("名字为空\n");         return false;     }     if(pstheadnod==NULL)     {         printf("系统为空，无法删除\n");         return false;     }     if(0==strncmp(pstheadnod->name,pcname,length_of_name))     {         Dangqian=pstheadnod;         pstheadnod=pstheadnod->Next;         free(Dangqian);         return true;     }     Dangqian=pstheadnod->Next;     before=pstheadnod;     while(Dangqian)     {         if(0==strncmp(Dangqian->name,pcname,length_of_name))         {             before->Next=Dangqian->Next;             free(Dangqian);             return true;         }         else         {             before=Dangqian;             Dangqian=Dangqian->Next;         }     }     return false; } int delete_student() {     char Stname[length_of_name];     memset(Stname,0,length_of_name);     printf("请输入要删除的学生姓名:\n");     scanf("%s",Stname);     if(false==delete_by_name(Stname))     {         printf("删除失败\n");         return false;     }     printf("删除成功，名字是:%s\n",Stname);     return true; } int print_data() {     Stu *present=NULL;     present = pstheadnod;     if (!present) {         printf("系统为空\n");         return 0;     }     while(present) {         printf("%s,%s,%d\n",present->number,present->name,present->math);         present=present->Next;         printf("打印成功\r\n");     }      return 1; } /*int input_test()   {   Stu stEmInfor;   Stu *pstEmInfor=NULL;   memset(&stEmInfor,0,sizeof(Stu));   scanf("%s %s %d",stEmInfor.number,stEmInfor.name,&stEmInfor.math);   printf("%s%s%d",stEmInfor.number,stEmInfor.name,stEmInfor.math);   return true;   }*/ int main() {     char caozuo[length_of_caozuo];     while(1)     {         printf("请输入操作命令:\n");         memset(caozuo,0,length_of_caozuo);         //gets(caozuo);         scanf("%s", caozuo);         if(0==strncmp(caozuo,"add",strlen("add")))         {             insert_data();         }         else if(0==strncmp(caozuo,"delete",strlen("delete")))         {             delete_student();         }         else if(0==strncmp(caozuo,"print",strlen("print")))         {             print_data();         }         else if(0==strncmp(caozuo,"quit",strlen("quit")))         {             break;         }         else if(0==strncmp(caozuo,"exit",strlen("exit")))         {             break;         }         else             printf("输入命令错误\n");     }     return 0; }   供参考～

这是由于scanf会取换行符之前的内容保存下来，但这个换行符依旧留在输入的队列里。也就是说运行至下一次scanf或gets时，它就直接识别到了了这个换行符，并读取了一个空的字符串，这就造成你碰到的错误。  解决方法就是在scanf 后面加一个getchar 抓取走着个换行符就行了。       scanf("%s %s %d", Studata.number, Studata.name, &Studata.math);     getchar();


Question: 算法

先把每个数据集排序，使每个数据集都是有序数列。 然后再取其中一个数据集的数据与其他的比较，因为有序所有比大小就可以了，应该会快些。  应该还会有更好办法，暂时就想到这么多。


Question: 求助大佬，input函数怎么与后面函数联系，试了几次都出错了

input函数定义i后面几个逗号是啥意思？还有输入scanf里面用浮点型来输入int型？

感谢大神的回复，非常感谢

#include<stdio.h>  void input(int m,int n); void average1(int str1[][5],int m,int n); void average2(int str1[][5],int m,int n); void average3(int str1[][5],int m,int n);  int str[3][5]; int main() {     input(3,5);     printf("每个学生的平均成绩\n");     average1(str,3,5);     printf("每门课的平均成绩\n");     average2(str,3,5);     average3(str,3,5);      return 0; }  void input(int m,int n) {     int i,j;      for(i=0;i<m;i++)         for(j=0;j<n;j++)             //scanf("%f",&str[i][j]);             scanf("%d", &str[i][j]); }  void average1(int str1[][5],int m,int n)//单个学生的平均成绩 {     int k, l;      for(k=0;k<m;k++)     {         float sum=0, a;         for(l=0;l<n;l++)             sum += str1[k][l];         a = sum / n;          printf("%f\n",a);     } } void average2(int str1[][5],int m,int n)//单门课的平均成绩 {     int i,j;     float average2;     for(j=0;j<n;j++)     {         float sum=0;         for(i=0;i<m;i++)             sum+=str1[i][j];         average2 = sum/m;         printf("%f\n", average2);     } }  void average3(int str1[][5],int m,int n) {     int max=str1[0][0];     int p,k,i,j;     for(i=0;i<10;i++)     {         for(j=0;j<5;j++)             if(str1[i][j]>max) {                 max=str1[i][j];                 k=i+1;                 p=j+1;             }     }     printf("最高分对应的学生和课程\n");     printf("max=%d,k=%d,p=%d\n",max,k,p); }  供参考～

定义input第一行是int i,j;🙃


Question: 关于将非指针数据类型强制转换为指针类型

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

引用 8 楼 DiuDiuZ 的回复:[quote=引用 7 楼 gouyanfen的回复:]因为，char是一个字节，编译器强转为四字节的时候，会把char作为低位转换，有固定的规则，float比int 占字节数大，所以编译无法确定你的意图，只能报错。你这个问题没有实际意义，如果你float的数字确实为一个真实的指针地址，你可以先转为int再转为指针。 内存中都是二制进，但是得明确转换规则 int跟float都是占四个字节，我觉得应该是将int转换为int*那么地址值跟int变量的值一样，但将float转换为int*的话，地址值不为float变量的值，所以编译器会报错[/quote] 上面我说错了，32位系统中float和int占位一样，但是在内存中的表示方法是不一样的

引用 7 楼 gouyanfen的回复:因为，char是一个字节，编译器强转为四字节的时候，会把char作为低位转换，有固定的规则，float比int 占字节数大，所以编译无法确定你的意图，只能报错。你这个问题没有实际意义，如果你float的数字确实为一个真实的指针地址，你可以先转为int再转为指针。 内存中都是二制进，但是得明确转换规则 int跟float都是占四个字节，我觉得应该是将int转换为int*那么地址值跟int变量的值一样，但将float转换为int*的话，地址值不为float变量的值，所以编译器会报错

32位下,int和float虽然都是4个字节，但是其存放的二进制数据是不同的； char是1个字节，值内容：0~255，而int能够表示0-255的值； 在实际应用中Waring都要去除，否则程序运行起来会各种坑；

引用 4 楼 636f6c696e的回复:因为指针本质上就是一个数字，所以int转编译器不会直接报错 那为啥将float类型转为int *会报错呢吗，数据本质在内存不都是以二进制形式存在吗。

因为指针本质上就是一个数字，所以int转编译器不会直接报错

引用 2 楼 niebo_bar的回复:浮点类型的数据长度和整形不同 32位下不都是四个字节吗，只是解析方式不一样 那为什么下面的char型转换时只是给了warning

浮点类型的数据长度和整形不同

后面已经给出错误的原因了


Question: 参数传递到函数后变了，请大神指点！

字符数组作为函数入参退化成字符指针 引用 2 楼 yuford 的回复:我现在修改了一下，可还是一样，simccid的值是simccid，simcimi连在一起的。  void DHT11_Upload(char simccid[],char simcimi[],char flag) {         float tem,hum;  	update(simccid,simcimi,flag,tem,hum);			 } void update(char sim_ccid[],char sim_cimi[],char flag,float tem, float hum) {         sim_ccid的值是sim_ccid，sim_cimi连在一起的。 }

另一种解决方法是在使用sprintf是限定死每个字符串的长度：      sprintf(upload, "update;%20.20s;%15.15s;%s;%.1f;%.1f", SIM_CCID, SIM_CIMI, flag, tem, hum);   如果每回这两个字符串都是长度固定的话。

值得注意的是，C里面通过函数参数传递的不是字符串，而是字符串（数组）头的地址，它并不能传递这个字符串有多长。 根据题主提供的代码，你是想打印出这两个字符串的内容到upload里。当前你打印出来的就会和watch里显示的一样：  - SIM_CCID 会显示成SIM_CCID和SIM_CIMI合并的样子 - SIM_CIMI 则会正常显示  原因我上面刚解释过了。  现在说说解决办法，就是规定SIM_CCID和SIM_CIMI两个字符串是预留多一位长度给休止符，就是：  char SIM_CCID[21], SIM_CIMI[16]

本身代码没问题，这个只是在debug时，watch栏里面显示的造成的误解。 上面的SIM_CCID是以char[20]格式，即限定了长度为20字节的数组显示的；而下面的SIM_CCID只是作为一个char的指针，在watch里就会显示出以此地址为头的字符串，它会一直显示到休止符0x00('\0')为止。 正好SIM_CIMI这个字符串的启示位置被分派到了SIM_CCID字符串末尾的后一位，正好衔接上了，不存在一个休止符分割分割两个字符串。所以从debugger的角度观察，从0x2000005C为头的这个字符串就是上述两个字符串合并的样子。

你本来SIM_CCID定义的就不是字符串，没有截止符，只是字符数组。 所以char数组查看就是那数组长度的20个字节，如果用char*查看就是按照字符串的方式查看就会连接起来。


Question: (char *)&p在C语言里表示什么？

//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

这是强行转化，楼主自己已经知道 至于为什么要这样转化，没有上下文，不好说 但是，如果是用于通信，就比较好理解，因为通信都是按字节发送接收的，所以发送方把结构体都转成char*来送信，接收收到后再把char*转为相应的结构体。

引用 楼主 qq_24830523 的回复:(char *)&p，哪位大佬解释一下原理，为什么要用char,为什么不用别的，这样强转后表示什么？ 没有前后逻辑就让别人为什么。


Question: 问一个简单的问题，刚学不太懂。谢谢。

关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775

括号中的逗号运算符是从左到右，直到取最后结果，b++为5，加上a就是8了。

逗号运算符是把最后一个表达式的值赋值给c，但是前面的表达式也是计算的。所以是a+b=3+5=8

感谢各位的解答，谢谢。

是的啊，取括号最右边结果

引用 1 楼 北伊的回复:b++b的值就变成了5，a+b=3+5=8 不是b++先计算后加嘛


Question: float参数的转换

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

这是哪一本书上讲的？ 很少见有对这个事情做解释的啊！  c语言当中，传递到函数里面的都是具体数值，而不是变量的本身， 参数是放到栈里面进行传递的 那么每个参数在栈里面的位置和大小就是个问题 函数可以根据参数的类型来计算参数的位置 现在的问题是，如果参数的类型和传递的类型大小不一样会如何  在固定参数的函数当中，编译器会检查他，发现这种情况会报错 但是不固定长参数怎么办，这就是个问题 楼主的那个图很好的解释了float（32bits）和double（64bits）都是统一按照double类型来入栈，这样就能解决这个问题  举个例子，大家可以在自己的编译器里面测试一下 char ch='A'; int   n = 123; printf("float:%f   int:%d",  c,  n);  // 编译器会这里给出警告，%f和c的不匹配，忽略它去执行看看会发生什么 c没有正确输出这个可以理解，  但是，但是，你会发现n也没有正确输出 不同的编译器也许执行结果不一样 可以理解， 因为格式指定了参数之间的位置关系， 入栈的格式不匹配，后续的参数定位出了问题  scanf里面这个问题不会明显，因为参数都是指针， 只是在对指针指向的地址放数据的时候，会因为格式不同而破坏数据 但是对scanf函数的参数之间不会有影响  这样的问题在不固定长度的函数参数里面应该都会有体现

这是规定的，scanf 之流 和 printf 之流就是不一样的。如果你觉得记起来比较烦，可以像 4 楼那样记，因为现在的 C 语言也接受 printf 给 %lf (与 %f 完全等价)。

浮点数后面加话个f就可以了

printf 中参数float 会转换为double入栈  这句话的意思的 float 和 double 都是入栈 8 字节 printf 解析格式控制字符%f 会从栈里面读取8个字节的数据 作为一个double输出 所以 printf 没有针对 float的格式控制符  %f是针对double的  而scanf情况不一样  %f 还是 %lf 对应的参数都是指针 都是读取4个字节的数据  但是后面的处理有区别 %f 对应float 会向指定的内存写入 4个字节的数据  %lf 对应 double 回向指定的内存写入 8个字节的数据  因为写入字节不同 所以 %f 和 %lf 不能混用  备注 类型大小不固定 这个回答中的类型大小仅供参考

小转大是可以的，大转小是不可以的

引用 1 楼 自信男孩 的回复：%f也是可以的，可以看一下C标准，double也用%f。为何书中说float没有转换说明呢？难道不是%f？

float是f，double是lf.

%f也是可以的，可以看一下C标准，double也用%f。


Question: 我是初学者，请问为什么我写的这个代码当i=0时不输出呢？正确应输出40啊

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

引用 1 楼 自信男孩的回复:#include<stdio.h>  int main() {     int i;int x,y;     int a[101]={};int b[101]={};      while(2 == scanf("%d %d",&x,&y))     {         a[x] = y;         if(x==0)         {             break;         }      }     while(2 == scanf("%d %d",&x,&y))     {         b[x] = y;         if(x==0)         {             break;         }      }     for(i=0;i<101;i++) {          a[i]=a[i]+b[i];      }     for(i=100;i>=0;i--)     {         if(i!=1&&i!=0)          {             if(a[i]>0)             {                 printf("%dx%d+",a[i],i);             }         }         if(i==1)         {             if(a[i]>0)             {                 printf("%dx+",a[i]);             }         }         if(i==0)         {             if(a[i]>0)             {                 printf("%d",a[i]);             }         }     }     putchar(10);       return 0; } 供参考～ 之所以不出现40，是因为输入的时候没有把20赋值给a, b，在判断x为0时已经break循环了。 上面的代码做了修改，改成先赋值后break，得到你想要的结果～ 谢谢！我明白啦！不过我这个程序还是缺少几种情况！我终于改好啦！


Question: 第十天

#include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

洗牌功能没写好

这洗牌写得不够随机


Question: c语言编程练习题老是答案错误呜呜呜

输入输出格式 边界条件 ……

引用 1 楼 user-2的回复:直接开行列都多两行嘛，4行4列就开6行6列，存中间，边上一圈都存点就行了，这样判断的时候就不用分那么多类了，反正你输出的时候把*单独拎出来了，遇到*直接就9个格都加一，输出的时候从i=1;j=1开始就行了 终于正确啦，我明白了，这样我就不用考虑数组会不够用，也就不需要分情况了，简便很多啊，谢啦

emmm,应该只要换一行就行了吧，我也没看题目

而且你\n多了个


Question: 求解

单词拼写错误是main，不是mian。看一下你用的是哪个？ 另外,scanf("%d", &num);不是scanf("%d,&num");  自己检查一下  看样子你写的代码不够多，像main函数基本上每次都写，这都能把单词拼写错误，问题很多呀 多练，多调试吧

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

引用 3 楼 liujunyun_nj的回复:1. main函数拼写错误； 2. scanf参数错误； 3. if 语句的判断条件，算你是错的 书上是这样判断的，而且讲解的时候if右边写个判断的东西在用printf显示如果错直接进入else在的。

之前运行的窗口没有关闭


Question: c语言的问题（输出时莫名其妙多了‘%’）

通过查ascii码对应表，'#'对应的十进制是35，'%'对应的十进制是37，这样就可以理解为什么输出的是%了

%就是你输入的#啊 在while处判断已经晚了，因为你前面ch2=ch+2; 已经改变了字符了。 你需要在刚输入完成后判断。 并且ch2=ch+2;之前也要判断，是不是要转换的字母啊。


Question: 用spy++查看QQ窗口，为什么聊天窗口和QQ窗口没关系？

spy++是开源的。

引用 15 楼 六道佩恩 的回复:[quote=引用 14 楼 gouyanfen 的回复:] DirectUI父窗口有消息处理线程的，取得消息之后，他会根据应用程序管理的自绘对象，再决定发什么消息给控件，这时己经改变了消息的结构和定义了 我仔细思考了你的方法，我说下我的理解，麻烦你看下是不是这样： 1. 自己拟定控件类只是把类名和对应的处理函数联系起来 2. 类似的创建窗口，其实只是在父窗口中画画 3. 父窗口捕获到鼠标的移动和点击后，根据计算得出当前鼠标所点击的区域属于哪个“控件”，然后调用对应的处理函数来处理 4. “控件”知道被点击后，通过计算自己的坐标和大小，于是在对应的区域重新绘画。[/quote] 3和4都一样，把对应转换的消息发给控件类，控件类自行回调

引用 14 楼 gouyanfen 的回复:DirectUI父窗口有消息处理线程的，取得消息之后，他会根据应用程序管理的自绘对象，再决定发什么消息给控件，这时己经改变了消息的结构和定义了 我仔细思考了你的方法，我说下我的理解，麻烦你看下是不是这样： 1. 自己拟定控件类只是把类名和对应的处理函数联系起来 2. 类似的创建窗口，其实只是在父窗口中画画 3. 父窗口捕获到鼠标的移动和点击后，根据计算得出当前鼠标所点击的区域属于哪个“控件”，然后调用对应的处理函数来处理 4. “控件”知道被点击后，通过计算自己的坐标和大小，于是在对应的区域重新绘画。

引用 12 楼 gouyanfen 的回复:1.HWND是HANDLE,但HANDLE不是HWND 2.不需要 3.这个需要看自绘控件的消息处理 这方面的，你可以参考一下DuiLib的说明看一下 请问，它如何知道鼠标点击了它或鼠标悬停？不通过消息机制的话，是循环读取鼠标驱动反馈的坐标吗？

引用 9 楼 gouyanfen 的回复:消息机制你从那里看的是以窗口为单位的？是HWND,HWND是系统管理的句柄对象，只要是这个对象的都可以,就拿游戏来说，很多根本就不会处理你说的这些消息，像QQ这种软件，安全工作更是重中之重，所有用到的类重写又没有多难，窗口直接画在屏幕上的，当然windows的窗口类也是画在屏幕上的，只不过他是系统画的，有统一的接口，自绘控件也是控件，你得跳出原来的思维方式，windows消息机制也是建立在内核之上的，最终也是和硬件打交道的，如果你写的软件直接和硬件打交道，一样也可以跳过windows消息机制。 你可以再去研究研究消息机制，系统内核管理，然后分发，UI线取到属于自己的消息后，然后发给控件，控件自己有消息处理的回调，然后处理对应的消息。 我有几个问题能麻烦你确认下吗： 1. 你确定是HWND不是HANDLE吗？HWND不就是窗口句柄吗？ 2. 对于他们自制的控件类，需要注册吗？ 3. 它们的控件是独立的窗口过程来相应，还是在主窗口中根据鼠标的坐标和点击动作来做出相应的反应？

现在很多软件都采用DirectUI开发理念，其主要的思想就是主窗口有句柄HWND，但是子控件Button List 等等都是无窗口句柄的，因为全是自绘的，使用Spy++无法抓取控件的HWND。 子窗口不以窗口句柄的形式创建，只是逻辑上的窗口，绘制在父窗口之上。 可以到网上看看，有开源的

引用 3 楼 gouyanfen 的回复:为什么一定要是窗口类？开个线程自建消息循环也是可以的 我可以详细问下吗，你说的这个“不是窗口类”是指那些？这个消息循环应该还是windows的消息机制吧，这个消息机制不是以窗口为单位发生事件的吗？我觉得打开的聊天窗口这种应该是窗口吧？你说是多个好友在一个聊天窗口里或者QQ窗口中的好友列表那种吗？

检测工具也是根据预定的接口去判断的，接口不一样，怎么检测，只有你去手工检测了，分析接口，想用原来窗口管理的那套方法，子类超类化什么的，还有从消息去判断的，不用去想了,是不可能的，数据接口都不一样

引用 5 楼 user-4 的回复:大公司一般都自己做的控件类，不会用MS提供的接口创建的 它们做的这些控件，能算窗口吗？能被检测出窗口吗？

大公司一般都自己做的控件类，不会用MS提供的接口创建的

引用 3 楼 gouyanfen 的回复:[quote=引用 2 楼 六道佩恩 的回复:] [quote=引用 1 楼 gouyanfen 的回复:] 因为他不是窗口控件，全自绘的 额，你确定跟全自绘有关系吗？它至少是窗口吧，是窗口的话，那么得注册窗口类吧，得CreateWindow创建窗口吧。。。[/quote] 为什么一定要是窗口类？开个线程自建消息循环也是可以的[/quote] 研究别人的软件，思维放开放一点，不要局限于MS给你的知识框架

引用 2 楼 六道佩恩 的回复:[quote=引用 1 楼 gouyanfen 的回复:] 因为他不是窗口控件，全自绘的 额，你确定跟全自绘有关系吗？它至少是窗口吧，是窗口的话，那么得注册窗口类吧，得CreateWindow创建窗口吧。。。[/quote] 为什么一定要是窗口类？开个线程自建消息循环也是可以的

引用 1 楼 gouyanfen 的回复:因为他不是窗口控件，全自绘的 额，你确定跟全自绘有关系吗？它至少是窗口吧，是窗口的话，那么得注册窗口类吧，得CreateWindow创建窗口吧。。。

因为他不是窗口控件，全自绘的


Question: vs2015community版的比较两个整数的大小的程序为什么会这样？？？大神求解！！

你可以加这句 system(“pause”) 在return上面，也可去百度一下vs写c/c++弹窗关闭问题，里面有解决方法。

作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

你的程序运行很正常啊。 输入 8,5回车就可以得到结果。不明白你的问题是什么。

引用 1 楼 qq_41357834 的回复:这个逗号自己输入的？别输逗号 用空格隔开试试 scanf_s中要求输入逗号，不输入逗号还不行，注意逗号的中英文，要和scanf_s中的逗号的中英文保持一致

我明白你的问题了，你在你程序return 前面加一行 system(“pause”) 再试试

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.

引用 2 楼 bsnow 的回复: 你的程序运行很正常啊。 输入 8,5回车就可以得到结果。不明白你的问题是什么。 我按了回车就会自己消失 用的是vs2015的版本，好像max的话不能用，换成c就可以用累，这个是三个数比大小 #include<stdio.h> #include<stdlib.h> int main() { 	int a, b, c, d; 	printf("please input a,b,c:\n"); 	scanf_s("%d,%d,%d",&a,&b,&c);  	d = a; 	if (d< b) d=b; 	if (d< c) d=c; 	printf("The largest number is %d\n", d); 	system("pause"); 	return 0; }

这个逗号自己输入的？别输逗号 用空格隔开试试


Question: 怎样用c++来实现 printf("%.2X）这种类型的语句呢

使用vsprintf来实现即可

printf("%.2X）  printf是C++函数 如假包换

了解下iomanip库

感谢！

cout<<setiosflags(ios::fixed)<<setprecision(2);         cout<<hex<<p[3]; 请问为什么我用这一类语句无法实现标题中代码的功能呢


Question: float a[4]={1.2,2.4,3.7,-1.5};

//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

p是指向列数是4个二维数组，而a是一位数组，所以

百度搜索 数组指针


Question: 生成随机数放到数组的一个问题，如何让随机数不重复？

引用 2 楼 待续_1006的回复:代码我没看，如果要做到你标题的这个要求 生成随机数放到数组的一个问题，如何让随机数不重复？ 第二次在生成随机数放到数组保存之前，先循环遍历这个随机数是否在数组中已经存在，如果存在则放弃，开始下一次循环，否则存入数据！ 嗯嗯 那个已经考虑到了，是srand种子的位置没写对，谢谢您！

引用 1 楼 yunate的回复:尝试把srand((unsigned)(time(0)));放到循环外面。另外可以试试这个 bool GetRandNum(int min, int max, int & out) {     if (max < min)     {         return false;     }      unsigned int tmp = 0;      if (rand_s(&tmp) != 0)     {         return false;     }      out = tmp % (max - min + 1) + min;     return true; } 谢谢！为什么srand放在循环里不可以呢？然后的话，下面这个代码是啥意思啊...?

随机必然有重复，所谓“不重复的随机”实际上是洗牌。洗牌算法参考下面： #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

引用 4 楼 qq_44383162 的回复:[quote=引用 1 楼 yunate的回复:]尝试把srand((unsigned)(time(0)));放到循环外面。另外可以试试这个 bool GetRandNum(int min, int max, int & out) {     if (max < min)     {         return false;     }      unsigned int tmp = 0;      if (rand_s(&tmp) != 0)     {         return false;     }      out = tmp % (max - min + 1) + min;     return true; } 谢谢！为什么srand放在循环里不可以呢？然后的话，下面这个代码是啥意思啊...?[/quote] 大致可以这样理解：随机数肯定是一个随机算法，可以认为内部维护了一个static的index根据index算出数值，算法中肯定有参数，srand这个函数可以认为是初始化这个参数并且将index重新赋值（比如0），所以放在循环里由于time(0)不变，所以每次的算法参数不变，并且index被重新赋值了，得出的结果就一样了。至于下面那个函数是用来生成min到max之间的随机数，对了如果要使用这个的话文件最上面要加上#define _CRT_RAND_S


Question: c语言求长方体体积的程序有什么错吗

有两处问题：函数定义后用分号;，函数调用函数名拼写错误； 这两个错误编译器能给指出来的，因此建议贴出代码之前先把编译错误去掉。  #include<stdio.h>  #define Height 10  //int calculate(int Long, int Width); int calculate(int Long, int Width) {     int result;      result = Long * Width * Height;      return result; }  int main() {     int m_Long;     int m_Width;     int result;     printf("长方体的高度为：%d", Height);     printf("请输入长度\n");     scanf("%d", &m_Long);     printf("请输入宽度\n");     scanf("%d", &m_Width);     result = calculate(m_Long, m_Width);     printf("长方体的体积是：");     printf("%d\n", result);     return 0; }

没看出有啥逻辑错误

#include<stdio.h> #define Height 10  int calculate(int Long, int Width)//; {     int result;     result = Long * Width * Height;     return result; }  int main() {     int m_Long;     int m_Width;     int result;     //printf("长方体的高度为：%d", Height);     printf("长方体的高度为：%d\n", Height);     printf("请输入长度\n");     scanf("%d", &m_Long);     printf("请输入宽度\n");     scanf("%d", &m_Width);     //result = calualate(m_Long, m_Width);     result = calculate(m_Long, m_Width);     printf("长方体的体积是：");     printf("%d\n", result);     return 0; } 看注释部分 另外，为什么要把高定义为一个宏？


Question: 用vs2015运行冒泡排序哪里不对吗？

引用 9 楼 csucxy 的回复：难道现在的C语言教材会不讲注释吗？尽管//注释形式来源于C++，但C标准早就接过去了啊。 6.4.9 Comments 1 Except within a character constant, a string literal, or a comment, the characters /* introduce a comment. The contents of such a comment are examined only to identify multibyte characters and to find the characters */ that terminate it.83) 2 Except within a character constant, a string literal, or a comment, the characters // introduce a comment that includes all multibyte characters up to, but not including, the next new-line character. The contents of such a comment are examined only to identify multibyte characters and to find the terminating new-line character.感谢，已经可以了

去掉for后面不该有的分号；后依然是一样的编译结果

引用 9 楼 csucxy 的回复：难道现在的C语言教材会不讲注释吗？尽管//注释形式来源于C++，但C标准早就接过去了啊。 6.4.9 Comments 1 Except within a character constant, a string literal, or a comment, the characters /* introduce a comment. The contents of such a comment are examined only to identify multibyte characters and to find the characters */ that terminate it.83) 2 Except within a character constant, a string literal, or a comment, the characters // introduce a comment that includes all multibyte characters up to, but not including, the next new-line character. The contents of such a comment are examined only to identify multibyte characters and to find the terminating new-line character.去掉分号了也是不行。我用的vs2015

别人帮你注释掉不该有的;，是为了让你看更清楚哪有不对。注释一般是作用是注释说明程序，由于被注释的内容将不参与编译，从编译的角度上来说就相当于删除了它。

//后面跟；是用来解释什么

#include <stdio.h>  int main() {     int a[10];     int i, j, t;     printf("input 10 numbers:\n");      for (i = 0; i < 10; i++)     {         scanf_s("%d", &a[i]);     }      printf("\n");      for (j = 0; j < 9; j++)     {         for (i = 0; i < 9 - j; i++)         {             if (a[i] < a[i + 1])             {                 t = a[i], a[i] = a[i + 1], a[i + 1] = t;             }         }     }     printf("number:\n");      for (i = 0; i < 10; i++)     {         printf("%d ", a[i]);     }     printf("\n");      system("pause");      return 0; } 你确定会一样？

将for后面的分号去掉了也是一样的结果

for循环后的分号都去掉就好了

你为什么在for后面加分号？

引用 7 楼 自信男孩 的回复:#include <stdio.h> int main(void) {     int a[10];     int i, j, t;     printf("input 10 numbers:\n");     for (i = 0; i < 10; i++)//;         scanf_s("%d", &a[i]);     printf("\n");     for (j = 0; j < 9; j++)//;     for (i = 0; i < 9 - j; i++)//;     if (a[i]<a[i+1])     {         t = a[i], a[i] = a[i + 1], a[i + 1] = t;     }     printf("number:\n");     for (i = 0; i < 10; i++)         printf("%d", a[i]);     printf("\n");     system("pause");     return 0; }   供参考～ 加//是用来做什么的？

for后面的分号改括号

在每个for和if后面加上{}就好了。谢谢


Question: 运行程序出段错误，GBD调试确没有错误，求解

帮结帖+蹭分

已解决，需要给char *s 分配空间存放内容。

是GDB 打错了


Question: PAT1013测试点零和测试点一格式错误  求解

引用 2 楼 user-2的回复:无论怎样count%10都一定小于10，所以你每行都打印10个空格，修改为：  if (count % 10 != 0) 			printf(" ");  非常感谢  已经顺利通过

非常感谢

#include<stdio.h>  int prime(int n) {     int i;      if(n < 2)         return 0;      for(i = 2; i*i <= n; i++)         if(n % i == 0)             return 0;      return 1; }  int main() {     int cnt = 0, idx = 0;      int m, n, num;      scanf("%d%d", &m, &n);      num = 3;     if (m == 1) {         printf("2 ");         idx++;         cnt++;     }     cnt = 1;     while (1) {         if (prime(num)) {             cnt++;             if (cnt > n)                 break;             if (cnt >= m) {                 idx++;                 printf("%d ", num);             }             if (idx % 10 == 0)                 printf("\n");         }         num += 2;     }     putchar(10);      return 0;     /*     int i=0,j,p=0,count=0;     //long long c[10001];     int c[10001];     int m,n;     scanf("%d%d", &m,&n);     for(j=2;i<=n;j++)     {         if(prime(j)==1)             c[i++]=j;     }     for(j=m-1;j<n-1;j++)     {         printf("%d",c[j]);         count++;         if(count%10<10)             printf(" ");         if(count%10==0)             printf("\n");     }     printf("%d",c[n-1]);     */ }  供参考～

引用 1 楼 Möge alles zufriedenstellend 的回复:题目是令 P i  表示第 i 个素数。现任给两个正整数 M≤N≤10 4 ，请输出 P M  到 P N  的所有素数。  输入格式：  输入在一行中给出 M 和 N，其间以空格分隔。  输出格式：  输出从 P M  到 P N  的所有素数，每 10 个数字占 1 行，其间以空格分隔，但行末不得有多余空格 建议你把题目的链接发出来吧，你的题目要求看不懂的。


Question: 求解

这个问题完全可以百度一下，这样得到的信息或许更全面一些～

puts是输出一行字符串，puts(str);作用同printf("%s\n",str);一样


Question: C语言里结构指针那块的一道题

引用 13 楼 自信男孩的回复:注意pt->y就是a, 用a去偏移2的地址就是a+1,所以去里面的值就是*(a+1);即*(pt->y+1) 哦对哦对，谢谢你们哈

引用 10 楼 user-2的回复:不应该是b数组吧，*(pt+1)->y才应该是b啊 哦对，那你那个是啥y+1啊？

不应该是b数组吧，*(pt+1)->y才应该是b啊

引用 7 楼 user-2的回复:说错了，你*在++前，所以也是对的 ok感谢，你那个是指到b数组了哈

引用 6 楼 user-2的回复:你那样是数组元素+1，不是第二个数组元素的值 *pt->(y+1)才是第二个数组元素 不是，pt指向y然后加加不就是数组a的第二个元素吗？？

说错了，你*在++前，所以也是对的

引用 4 楼 我不是的回复:[quote=引用 2 楼 user-2的回复:]前面有个*，所以应该a数组的第一个元素，1 ok，那怎么输出2呢[/quote] 我知道了，*++(pt-y>)是2

引用 2 楼 user-2的回复:前面有个*，所以应该a数组的第一个元素，1 ok，那怎么输出2呢

但是我在电脑上运行出来结果是1

前面有个*，所以应该a数组的第一个元素，1

是a数组的地址


Question: （新手）单链表删除异常，谢谢！！！

多敲几边，了解每句话的意义，给每一句都加上注释。

仔细对比了下，就是有一些自己没发现的错误，非常感谢！！！

#define _CRT_SECURE_NO_WARINGS #include <stdio.h> #include <stdlib.h> #include <string.h>   //定义链表结点结构体 typedef struct LINKNODE {     int* data;     struct LINKNODE* next; }LinkNode;  //定义链表结构体 typedef struct LINKLIST {     LinkNode* head;     int size;     //链表不需要容量的概念了 } LinkList;    //--------------------初始化-------------------- LinkList* Init_LinkList() {     LinkList *list = (LinkList*)malloc(sizeof(LinkList));     if (!list)         return NULL;     list->size = 0;     list->head = (LinkNode*)malloc(sizeof(LinkNode));     list->head->data = NULL;     list->head->next = NULL;      return list; }  //--------------------插入-------------------- //指定位置插入 void Insert_LinkList(LinkList* list, int* nums, int numsSize) {     if (list == NULL) {         return;     }     LinkNode* r = list->head;     for (int i = 0; i < numsSize; i++)     {         LinkNode *newnode = (LinkNode*)malloc(sizeof(LinkNode));         if (!newnode)             break;         newnode->data = &nums[i];         r->next = newnode;         r = newnode;         r->next = NULL;         list->size++;     } }   LinkList* deleteNode(LinkList* A,int val) {     LinkNode* p = A->head;     LinkNode* q;      while (p->next != NULL)     {         if (*(p->next->data) == val)             break;         p = p->next;     }     if (p->next == NULL)         return 0;      q = p->next;     p->next = p->next->next;     free(q);      return A;  }  int main() {      int arr1[3] = { 1,5,6 };     LinkList* list1 = Init_LinkList();     Insert_LinkList(list1, arr1, 3);       //辅助指针变量     LinkNode* p1 = list1->head->next;     LinkNode *p2;      printf("链表1：");     while (p1) {         printf("%d->", *(p1->data));         p1 = p1->next;     }     printf("\n");       list1 = deleteNode(list1, 5);     p2 = list1->head->next;     printf("删除链表：");     while (p2) {         printf("%d->", *(p2->data));         p2 = p2->next;     }     putchar(10);      return 0; }  供参考～  代码本身就有问题，我想应该编译不通过的，起码会有警告。


Question: 请助UART

二楼,  你的文笔很细腻, 应该找个方向, 写写博客, 或教程, 这能让更多后人受惠~~

二楼, 赞一个!!  女生就是细心, 说话也易懂! 我反履看了三遍, 自我检讨中!!

好的，谢谢楼上两位，我最近在玩SC16C654，在想写控制它的代码，在网上找不到多少它的资料

123为取位值，4应该是预设的宏，指定某IO为低电平，5应该也是宏，发送命令指令，67应该也是命令吖。 没上下文很难解读。 至于书: 有一本叫 C和指针，我读过N本C，这本感觉最好。

A0 是读取Reg值中bit0上的值，A1是读取Reg值bit1上的值，A2是读取Reg值bit2上的值。 这种“&”符号在C语言单片机中叫做位与，就是按位进行与操作。还有就是“|”符号。这些符号在C语言中是比较常见的。 还有就是你说的*((unsigned char pdata *)MCU_COMMAND) = Val; 这句话的意思就是把MCU_COMMAND的地址看成是unsigned char pdata类型，然后往这个地址写入数据Val。这是单片机C语言中常用的指针，很多情况下，单片机都是进行寄存器操作的。所以指针还是很重要的。


Question: C语言求解

引用 2 楼 自信男孩的回复:头文件的使用能让你的代码更有条理性，能让让别人知道你的接口以及部分数据结构。 就是不知道怎么打怎么样去打

学习C语言看懂是一回事，会写又是另外一回事，你想会写代码，你首先得知道它的过程是什么样的，换句话说就是它原理是什么，在写代码前，明确要求，简单的画一个流程图，根据流程图来写代码，你就会知道，你差什么不了解，应该去学习什么对应的知识才能完成你这个功能。

引用 1 楼 weixin_42911598的回复:头文件是扩展名为 .h 的文件，包含了 C 函数声明和宏定义，被多个源文件中引用共享。有两种类型的头文件：程序员编写的头文件和编译器自带的头文件。  在程序中要使用头文件，需要使用 C 预处理指令 #include 来引用它。前面我们已经看过 stdio.h 头文件，它是编译器自带的头文件。  引用头文件相当于复制头文件的内容，但是我们不会直接在源文件中复制头文件的内容，因为这么做很容易出错，特别在程序是由多个源文件组成的时候。  A simple practice in C 或 C++ 程序中，建议把所有的常量、宏、系统全局变量和函数原型写在头文件中，在需要的时候随时引用这些头文件。https://www.runoob.com/cprogramming/c-header-files.html   头文件这里你看了就知道了，会考不会打是什么意思我不明白。。。 就是我的懂最简单的程序 ，但是打我却不知道怎么打

头文件的使用能让你的代码更有条理性，能让让别人知道你的接口以及部分数据结构。


Question: c语言

#include <math.h>  pow() 函数用来求 x 的 y 次幂（次方），x、y及函数值都是double型 ，其原型为：  double pow(double x, double y);


Question: 每隔3个字符复制字符串的第二种方法未实现功能，大家帮忙看一下哦~~

引用 3 楼 weixin_42810814 的回复:c语言二级里的题目 需要寻找错误 修改一行 其他不用改~~ #include<stdio.h> #include<string.h> void str_cpy(char *stra,char *strb) {      int i = 0;      while(*stra){         /******found****** */           int p=1;          while( p<=3 && *stra ){         /*******found********/                   *(strb+i)=*(stra+i);              p++;              i++;          }           /*******found********/                 *strb=' ';                }           *strb++='\0';    } int main(int argc, char const *argv[]) {      char a[128]="ABCDEFGHIJKLMNOPQRSTUVW";     char b[128];     puts(a);     str_cpy(a,b);        puts(b);       getchar();          return 0; } 只改一行就能解决这个代码的问题？做不到，或许你提供的代码有问题

不好意思，应该是found底下的有问题，可以改found底下的一行

#include<stdio.h> #include<string.h>  void str_cpy(char *stra, char *strb) {     int i = 0;     while(*stra){         *strb++ = *stra++;         i++;         if (i % 3 == 0)             *strb++ = ' ';         /*         int p=1;         while( p<=3 && *stra ){             *(strb+i)=*(stra+i);             p++;             i++;         }         if(*stra)             *(strb++)=' ';         */     }      //*strb++='\0';     *strb = 0;   //等价'\0' }  int main(int argc, char const *argv[]) {      char a[128]="ABCDEFGHIJKLMNOPQRSTUVW";     char b[128];     puts(a);     str_cpy(a,b);     puts(b);       getchar();      return 0; }  供参考～

char *strcpy3(char *dest, const char *src) {   char *p = dest;   for (int i = 0; *src; src++) if (!(i++ & 3)) *p++ = *src;    return *p = 0, dest; }


Question: 关于初始化字符串数组时，栈空间存放的是字符串吗？

放的就是"abcd"（注意'\0'也会放进去）； "abcd"虽然是字符串常量，但是array数组，所以会拷贝一份到array中。

引用 5 楼 DiuDiuZ 的回复:[quote=引用 3 楼 lin5161678的回复:]也是 abcd\0 内存里面有2个一样的信息而已 不用大惊小怪吧 是我想多了，栈里面存的也是字符常量[/quote]不是字符常量

引用 3 楼 lin5161678的回复:也是 abcd\0 内存里面有2个一样的信息而已 不用大惊小怪吧 是我想多了，栈里面存的也是字符常量

char arr[]="abcd";  //将常量区的abcd赋值给arr数组。arr[]里的元素在栈区

也是 abcd\0 内存里面有2个一样的信息而已 不用大惊小怪吧

char arr[]="abcd"; 使用常量字符串初始化数组变量arr ，arr 在栈内

这个还真没注意过 把地址打印出来看看 char *arr = "abcd"; char array[ ] = "abcd"; char a2[] = {'a', 'b', 'c', 'd', '\0'}; char *p = arr; printf("%p\n", p); printf("%p\n", (p+1)); p = array; printf("%p\n", p); printf("%p\n", (p+1)); p = a2; printf("%p\n", p); printf("%p\n", (p+1));


Question: float类型数值的下溢

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

引用 1 楼 赵4老师 的回复:浮点数格式 http://bbs.csdn.net/topics/390676437 刚接触c不久好多函数看不懂.


Question: 如何使用c语言实现txt文件不可被用户操作

做一个只有你知道的秘钥来对数据进行加密在写入配置文件，如果配置文件中的数据用你的秘钥解析失败，则证明文件被人工修改过

比如txt文件内容为： data=1 hash=bf068ad93313b4688371dc3e32b1c854  你把 data=1 改成 data=2 文件内容变成 data=2 hash=bf068ad93313b4688371dc3e32b1c854 我用只有我知道的hash算法计算data=2对应的 hash=031edfa805e27814bfb8470f16b2a3d5 和从txt文件中读出的hash不一样，就知道data被篡改了。  偷偷告诉你，我的hash算法是MD5("data=1password")

没有用到数据库呀，我是小白来着

加密算哈希，用户修改后哈希值肯定不一致，直接清空数据库


Question: C需要指针问题，请大佬解答

引用 1 楼 qybao的回复:指针类型都对不上，不知道你本意是什么？ struct addup *createlink() 改成 struct ticket *createlink() //返回指针类型要一致，如果不一致，根据需要做相应的强行转换 struct student *head 改成 struct ticket *head //指针类型要一致 createlink(head)带参数的方法没有定义，改成 further(head) 另外，createlink()方法里的head=p改成p=head //p一开始是空指针，new的是head，head保持不变，只是p改变 谢谢学长，我已经修改出来了，谢谢

类型不匹配好像已经多人帮你指出来，你看一下类型不匹配的问题


Question: c语言

输入二进制是以字符串的形式输入的吧，用strcmp函数就可以像数字一样比大小了，strcmp是以字典序排序的


Question: linux 关于netlink的一个奇怪问题

卸载模块没有写析构函数啊，内核没有释放这个协议号

谢谢大佬，我找到问题了，netlinkclose函数里的判断错了

引用 1 楼 user-1的回复:卸载模块没有写析构函数啊，内核没有释放这个协议号 //close socket  void netlinkClose(struct sock* sk_nl_k){      if(!sk_nl_k){                    //sock_release(sk_nl_k->sk_socket);           netlink_kernel_release(sk_nl_k);          //sk_nl_k = NULL;      }     调用自己写的这个函数，行不行？


Question: 使用指针输出数据的问题

因为你用%s输出的是字符串，字符数组的东西都输出了啊，不信你 用*P1，然后用%c试下。

引用 1 楼 user-2 的回复:你p1赋的值直接是数组a的首地址，用%s的格式控制符直接输出p1就好了跟你直接输出a是一样的，如果你*p1相当于取了数组a第一个字符的值，单个字符输出你用%c就好了，是能够输出字符H的。谢谢大佬。


Question: 求助贴  关于c中isspace()函数

那为啥会出现4呢。。

引用 1 楼 一张珠帘 的回复:一开始想说的是，我是萌新。。分数太少，没办法多给，大佬们见谅 你得到的3是abc三个字符计数，因为isspace返回0，当ch为'a', 'b', 'c'

#include <stdio.h> #include <ctype.h>  int main() {     int ch,i=0;      while ((ch=getchar())!=EOF)     {         if (isspace(ch))             i++;     }     printf("%d", i);      return 0; } 供参考～ 如果输入abc回车，然后再输入ctr+z，得到的结果是1(回车）  这个问题其实就是isspace();函数的返回值问题，  函数原型： int isspace(int c); 返回值： The values returned are nonzero if the character c falls into the tested class, and zero if not. 翻译一下就是，如果c是属于测试的分类里，则返回非0，否则返回0.

一开始想说的是，我是萌新。。分数太少，没办法多给，大佬们见谅


Question: 问一下大佬们哪里错了

怎么放大？？为啥我不能放大，点击图片也没用

引用 2 楼 自信男孩的回复:代码没看出有啥问题？难道是中文字符的问题？ 还是不行中文字符我检查了

代码没看出有啥问题？难道是中文字符的问题？

代码没有问题,建议你重新建一个项目,有时候是编译器 的问题


Question: 异常日志输出时，怎样包含文件名和行号

引用 1 楼 user-3 的回复:THIS_FILE   __LINE__ 您好，感谢答复，日志是ntpd输出的（ntp-4.2.6p5-22.el7.centos.x86_64），刚过滤了下源码，么有找到LINE或THIS_FILE  引用 4 楼 赵4老师 的回复:[quote=引用 3 楼 ccjsj1 的回复:] [quote=引用 1 楼 user-3 的回复:] THIS_FILE   __LINE__ 您好，感谢答复，日志是ntpd输出的（ntp-4.2.6p5-22.el7.centos.x86_64），刚过滤了下源码，么有找到LINE或THIS_FILE[/quote] 调用了使用__FILE__和__LINE__的库。我猜。[/quote] ntpd报错日志输出的，看是用c，不是c++，在.c和.h没搜到LINE和THIS_FILE，估计没用这个

引用 3 楼 ccjsj1 的回复:[quote=引用 1 楼 user-3 的回复:] THIS_FILE   __LINE__ 您好，感谢答复，日志是ntpd输出的（ntp-4.2.6p5-22.el7.centos.x86_64），刚过滤了下源码，么有找到LINE或THIS_FILE[/quote] 调用了使用__FILE__和__LINE__的库。我猜。

__FILE__ __LINE__ 这两个宏

THIS_FILE   __LINE__


Question: 数组

所以你的问题在哪里啊？

全错

所以，你的问题是什么？


Question: 输入之后没有反应

#include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct student {     char score[100];     struct student *next; }link,*linklist;  linklist creat(int n) {     linklist head,node,end;     head=(linklist)malloc(sizeof(link));     end=head;     for(int i=0;i<n;i++)     {         node = (linklist)malloc(sizeof(link));         //scanf("%s", &node->score);         scanf("%s", node->score);         end->next = node;         end=node;     }      end->next = NULL;      return head; }  linklist paixu(linklist head) {     linklist p,t;     char a[100];     //t = NULL;     t = head->next;     while(t)     {         for(p=head->next;p->next; p = p->next)         {             if(strcmp(p->score, p->next->score) > 0)             {                 strcpy(a,p->score);                 strcpy(p->score,p->next->score);                 strcpy(p->next->score,a);             }         }         t = t->next;     }      return head; }  void traverse_list(linklist head) {     linklist pcur = head->next;      while (pcur) {         printf("%s \n", pcur->score);         pcur = pcur->next;     } }  int main() {     int n;     linklist list;     printf("请输入个数：");     scanf("%d",&n);     list=creat(n);     list = paixu(list);     traverse_list(list); #if 0     while(list->next != NULL);     {         list = list->next;         printf("%s ",list->score);     } #endif     return 0; }  供参考～  排序函数算法有问题，可以参考一下；


Question: C语言的scanf安全输入问题

谢谢各位的解答

很明显越界了，越界访问结果是未知的，即可能正确输出结果，也可能给不能正确输出结果。

连续定义的变量“一般”内存连续，没有任何标准或者规范定义是必须连续的 所以楼主发的例子，内存越界是必然的，但是是否越界修改i的范围，是未定义的

引用 2 楼 风不喧嚣 的回复:[quote=引用 1 楼 lin5161678 的回复:] 写这段代码的人 不了解C语言 不是没越界 实际情况的确越界了  只是没修改 变量 i 老哥这怎么说[/quote] 有没有越界只看写入数据占用的内存有没有超过数组大小 仅此而已

引用 1 楼 lin5161678 的回复:写这段代码的人 不了解C语言 不是没越界 实际情况的确越界了  只是没修改 变量 i 老哥这怎么说

示例上说的是有问题的，堆栈临时变量的地址分配 i要定义在name之后,而且i的name的地址的i的分配地址刚好差相4，就是示例的结果

这种你想知道有没有改变到，可以先打印出来变量的指针，看分配的内存地址是不是相临的 printf("%08X,%08X",&i,name);

楼主没吃过这种问题的亏，所以没有感触。


Question: 求大神帮我看看呢

大家一起猜谜吧

你是希望我们去猜 103行 104行是哪一行么？


Question: 随机生成一个矩阵，得到他的转置矩阵

问题是啥，没看出啥问题


Question: c 语言 指针问题，请大佬解答

第一个错误： 这里你将head强制转换成了ticket* ，createlink（）最后返回head与addup*类型不符  第二个错误：同样的，main函数中，你定义head类型为student*，然后你将createlink（）的返回值赋予head，返回值类型是addip*   第三个错误：你定义的createlink（）是没有参数的，你在main（）中写一个createlink（head），什么意思....

类型不匹配，看一下head定义的类型和函数返回值的类型是不一样的。

不知道你这个addup和ticket 怎么定义，但是报错了，说明不是同一类型，如果内容相同，可以进行强制转换

creatlink函数，返回值为addup*类型，但你返回了一个tciket*类型的head，主函数中你又赋值给一个student*，如果是有继承关系，需要对指针进行强制转换


Question: 关于指针函数的使用

另外，说一下，你的问题跟指针函数没关系，而是函数返回指针的问题。

返回局部变量的地址，输出的结果是未知的，即可能得到预想的结果也可能得到错误的。局部变量在函数调用结束后就会被释放。

引用 4 楼 csucxy 的回复:补充2：你还可以再看看如下修改后的运行结果： #include<stdio.h>  int* add(int a, int b) { 	int c = a + b; 	return &c; } int main() { 	int a, b; 	a = 1; 	b = 2; 	int* p = add(a, b); 	for (int i = 0; i < 10; ++i) 	{ 		printf("%p,%d\n", p, *p); 	}  	return 0; } 应该能发现*p的值其实是不可控的。其原因应该就是add返回的是局部变量的地址。谢谢大佬，我懂了。

引用 7 楼 自信男孩 的回复:另外，说一下，你的问题跟指针函数没关系，而是函数返回指针的问题。指针函数是一个函数。函数都有返回类型（如果不返回值，则为无值型），只不过指针函数返回类型是某一类型的指针。 这个是我在百度百科上查询到的指针函数的说明，我这个问题应该也不属于函数返回指针吧？只是函数的返回值是一个地址，这样理解对吗。

楼上三连答说了指出你问题所在了。 其实你这个程序是有问题的，return 指针是不对的，因为局部变量会在函数执行完释放，p变成野指针了，至于他为什么会输出3，应该是系统缓存的，不要纠结这个问题，因为你写的就不对。

补充：如果你的中断放在printf前，你可能会发现*p的值与程序运行printf输出的*p值是一致的。

你这个程序是存在问题的，编译时应该会有警告。add函数返回的是它的局部变量的地址，而add调用结束后这个局部变量将被销毁，其内存空间将被回收。编程时应该避免这种写法。 你看到这个现象可能是因为这个原因导致的。当然，我说的是可能。如果你将程序改为如下形式，应该不会看到那个现象。 #include<stdio.h> #include<stdlib.h>  int* add(int a, int b, int* pc) {     *pc = a + b;     return pc; } int main() {     int a, b;     a = 1;     b = 2;     int cc;     int* p = add(a, b, &cc);     printf("%p,%d", p, *p);      return 0; }

p指向的是c的地址，所以直接输出p输出的是p的内容也就是c的地址，只有*p才表示着c的内容，希望你能看懂


Question: windows下，用clion怎么看printf的源码

D:\Program Files (x86)\Windows Kits\10\Source\10.0.10150.0\ucrt\stdio\output.cpp D:\Program Files (x86)\Windows Kits\10\Source\10.0.10240.0\ucrt\stdio\output.cpp D:\Program Files (x86)\Microsoft Visual Studio\VC98\CRT\SRC\OUTPUT.C D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\output.c


Question: 输出数据类型自动转换的问题

主要原因是double和int类型在内存中的存储方式不一样，int类型比较好理解，但是double因为有小数，所以表示方式不一样。 int + float会转double，1.5的double类型如果用int类型解析，那么就是0了。 建议查一下double/float浮点数在内存中的表示。

引用 5 楼 qq_38690998 的回复:[quote=引用 3 楼 jsx_SEVEN 的回复:] float 类型计算时会自动转为double，小数的存储可以看一下这篇https://blog.csdn.net/acdreamers/article/details/19012279 float 存储的32位和 double的存储的高32位是一样的，%d只取了double的低32位，全是零，大佬你说的，“%d只取了double的低32位，全是零”这句话我有点没看明白。我定义的应该是float类型，4字节的变量。a+b应该是自动转换成float类型吧？%d解析的时候，按照小数存储规则的话应该不是全部为零吧?[/quote] float类型在计算时会自动转换为double，int也会转为double，关于自动类型转换你可以看这篇https://blog.csdn.net/cherish_2012/article/details/21243047 float和double的存储可以看这篇https://blog.csdn.net/acdreamers/article/details/19012279

引用 4 楼 Na2So4_ 的回复:因为你写的printf里面输出类型是整数，0.5输出就会被强制转化为整数，小数部分就直接去掉了，不会四舍五入的。如果改成%f输出类型就是浮点数，可以正常输出0.5a+b等于1.5，int + float应该是转换成4字节的float类型吗？

引用 3 楼 jsx_SEVEN 的回复:float 类型计算时会自动转为double，小数的存储可以看一下这篇https://blog.csdn.net/acdreamers/article/details/19012279 float 存储的32位和 double的存储的高32位是一样的，%d只取了double的低32位，全是零，大佬你说的，“%d只取了double的低32位，全是零”这句话我有点没看明白。我定义的应该是float类型，4字节的变量。a+b应该是自动转换成float类型吧？%d解析的时候，按照小数存储规则的话应该不是全部为零吧?

a为int类型，b为float类型，所以a+b为float类型，因此需要用%f输出，不能使用%d输出，两者类型不匹配


Question: 编写一个c语言程序

引用 2 楼 自信男孩 的回复:[quote=引用 1 楼 爱吃鱼的橙子 的回复:] #include "pch.h" #include <iostream> #include "time.h"  using namespace std;  int main() { 	int a[10] = { 0 }; 	srand(time(NULL)); 	cout << "随机数分别为：" << endl; 	for (int i = 0; i < 10; i++) 	{ 		a[i] = rand() % 101; 		cout << a[i] << " "; 	} 	cout << endl; 	int tmp = a[0]; 	int max_num = 0; 	for (int i = 1; i < 10; i++) 	{ 		if (a[i] >= tmp)//当最大数有多个时，大于等于是取最后一个下标，大于是取第一个最大数的下标 		{ 			tmp = a[i]; 			max_num = i + 1; 		} 	} 	cout << "最大的数：" << tmp << endl; 	cout << "下 标 为：" << max_num << endl;  	system("pause"); }  既然要求是下表，那就不要i+1了，数组下表是从0开始的。[/quote]  引用 2 楼 自信男孩 的回复:[quote=引用 1 楼 爱吃鱼的橙子 的回复:] #include "pch.h" #include <iostream> #include "time.h"  using namespace std;  int main() { 	int a[10] = { 0 }; 	srand(time(NULL)); 	cout << "随机数分别为：" << endl; 	for (int i = 0; i < 10; i++) 	{ 		a[i] = rand() % 101; 		cout << a[i] << " "; 	} 	cout << endl; 	int tmp = a[0]; 	int max_num = 0; 	for (int i = 1; i < 10; i++) 	{ 		if (a[i] >= tmp)//当最大数有多个时，大于等于是取最后一个下标，大于是取第一个最大数的下标 		{ 			tmp = a[i]; 			max_num = i + 1; 		} 	} 	cout << "最大的数：" << tmp << endl; 	cout << "下 标 为：" << max_num << endl;  	system("pause"); }  既然要求是下表，那就不要i+1了，数组下表是从0开始的。[/quote]  如果要第几个数用i+1，下标的话用i，刚刚没太注意。

#include <iostream> #include <cstdlib> #include <ctime.h>  using namespace std;  int main() {     int a[10] = { 0 };     srand(time(NULL));     cout << "随机数分别为：" << endl;     for (int i = 0; i < 10; i++)     {         a[i] = rand() % 101;         cout << a[i] << " ";     }     cout << endl;     int max_idx = 0;     for (int i = 1; i < 10; i++)     {         if (a[i] >= a[max_idx])             max_idx = i;     }     cout << "最大的数：" << a[max_idx] << endl;     cout << "下 标 为：" << max_idx << endl;      system("pause");      return 0; }  供参考～

引用 1 楼 爱吃鱼的橙子 的回复:#include "pch.h" #include <iostream> #include "time.h"  using namespace std;  int main() { 	int a[10] = { 0 }; 	srand(time(NULL)); 	cout << "随机数分别为：" << endl; 	for (int i = 0; i < 10; i++) 	{ 		a[i] = rand() % 101; 		cout << a[i] << " "; 	} 	cout << endl; 	int tmp = a[0]; 	int max_num = 0; 	for (int i = 1; i < 10; i++) 	{ 		if (a[i] >= tmp)//当最大数有多个时，大于等于是取最后一个下标，大于是取第一个最大数的下标 		{ 			tmp = a[i]; 			max_num = i + 1; 		} 	} 	cout << "最大的数：" << tmp << endl; 	cout << "下 标 为：" << max_num << endl;  	system("pause"); }  既然要求是下表，那就不要i+1了，数组下表是从0开始的。


Question: 请问大家有没有检测输入数据产生跳变的好方法

如果间距不是太大，你可以保存上次读到值，将这次读到的值与上次读到的值进行比较，若上次的值大于这次读到的值，就说明产生了跳变


Question: 将一个C 语言源程序文件中所有注释去掉后，存入另一个文件

#include "stdafx.h" #include<stdio.h>  #include<string.h>  #include<stdlib.h>  int _tmain(int argc, _TCHAR* argv[]) {   FILE* fp1, * fp2;  errno_t err1, err2;  char ch, ch1, ch2;   if ((err1 = fopen_s(&fp1, "test.txt", "r")) != 0) {  printf("Open 1 fail!\n");  exit(0);  }   if ((err2 = fopen_s(&fp2, "test2.txt", "w")) != 0) {  printf("Open 1 fail!\n");  exit(0);  }  /*  */ while (!feof(fp1))  {  ch = fgetc(fp1); 	 if (ch == '/')  	 { 		ch1 = fgetc(fp1); 			 if (( ch1== '*')) 			 { 				 while (fgetc(fp1) != '*' && (ch2=fgetc(fp1)) != '/'&&ch2!=EOF);  			 } 			 else if (ch1 == '/')  			 { 				 while ((ch2 = fgetc(fp1)) != '\n'&&ch2!=EOF); 			 } 	 } 	 else if(ch!=EOF) 		   fputc(ch,fp2);  } if (fclose(fp1)) {  printf("Close Fail!\n");  exit(0);  }  if (fclose(fp2)) {  printf("Close Fail!\n");  exit(0);  }   return 0;  } 这样处理有问题的 假如有个printf("/*"); 直接后面的都没了，非常不严谨


引用 4 楼 六道佩恩 的回复:我没指定WS_CHILD应该就不算子窗口吧，我试了直接指定样式值为0，但指定一个父窗口句柄，窗口是照样创建成功的。所以，这两个窗口是什么关系？没有关系？父子关系？拥有者关系？我觉得第三个的可能性最大，因为官方文档说的指定父窗口或拥有者窗口的句柄，如果这都不算指定拥有者窗口的话，那怎样才算是指定拥有者窗口？ 拿完整的代码来看一下

引用 10 楼 user-1 的回复:Owner Window 试了下，确实是

Owner Window

引用 7 楼 user-1 的回复:h2窗口的Parent Window就是h1 写错了 是h2窗口的Ower Window就是h1

引用 7 楼 user-1 的回复:对于子窗口，你可能理解有误 实际上，带有WS_CHILD样式的才是子窗口，不带WS_CHILD样式的不是子窗口 你这里的h2窗口没有带WS_CHILD样式，所以不是子窗口，我之前说的创建失败就是这种情况 代码中你给h2指定了h1，这实际上是指定拥有者，你可以用Spy++工具查看你生成的程序，h2窗口的Parent Window就是h1 你确定是Parent Window吗？Parent Window不是父窗口吗？你才刚刚说这是拥有者窗口。。。

引用 5 楼 user-1 的回复:拿完整的代码来看一下  #include "stdio.h" #include "windows.h" void SetWNDCLASS( WNDCLASS* a, WNDPROC proc, LPCTSTR ClassName ) { 	a->style 			=0;			 	a->lpfnWndProc		=proc;							 	a->cbClsExtra		=0;		 	a->cbWndExtra		=0;	 	a->hInstance		=NULL;		 	a->hIcon			=NULL;			 	a->hCursor			=NULL;		 	a->hbrBackground	=(HBRUSH)GetStockObject(WHITE_BRUSH);	 	a->lpszMenuName	=NULL;	 	a->lpszClassName	=ClassName;	 } LRESULT MyProc1( HWND h, UINT msg, WPARAM wParam, LPARAM lParam) { 	switch( msg ) 	{			 		case WM_DESTROY: 		//	PostQuitMessage(0); 			return 0; 	} 	return DefWindowProc( h, msg, wParam, lParam);  } LRESULT MyProc2( HWND h, UINT msg, WPARAM wParam, LPARAM lParam) { 	return DefWindowProc( h, msg, wParam, lParam);  } int main( void ) { 	WNDCLASS MyClass1, MyClass2; 	SetWNDCLASS ( &MyClass1,   MyProc1, "FClass" ); 	SetWNDCLASS ( &MyClass2,   MyProc2, "CClass" ); 	RegisterClass( &MyClass1 );				 	RegisterClass( &MyClass2 );	 	 	HWND h1 = CreateWindow( "FClass", "ABC", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 100, 100, 300, 200, NULL, NULL, NULL, NULL);  	UpdateWindow(h1); 	 	HWND h2 = CreateWindow( "CClass", "DEF", WS_OVERLAPPEDWINDOW | WS_VISIBLE, 50, 50, 150, 150, h1, NULL, NULL, NULL);  	 						 	MSG msg; 	while( GetMessage(&msg, NULL , 0, 0) ) 	{ 		TranslateMessage(&msg);  		DispatchMessage ( &msg ); 	} 	return 0; }  两个窗口正常创建，而且我特意注释了父窗口过程中的PostQuitMessage，当父窗口关闭时，子窗口也关闭了，是不是说明这个父窗口已经成了子窗口的拥有窗口，或者可以有这种两个窗口坐标互不相关的父子窗口关系？

啥关系都不是，因为会创建失败，你可以检查一下返回的句柄值看看是不是为NULL

引用 3 楼 user-1 的回复:你创建的不是子窗口吗 我没指定WS_CHILD应该就不算子窗口吧，我试了直接指定样式值为0，但指定一个父窗口句柄，窗口是照样创建成功的。所以，这两个窗口是什么关系？没有关系？父子关系？拥有者关系？我觉得第三个的可能性最大，因为官方文档说的指定父窗口或拥有者窗口的句柄，如果这都不算指定拥有者窗口的话，那怎样才算是指定拥有者窗口？

你创建的不是子窗口吗

引用 1 楼 user-1 的回复:啥关系都不是，因为会创建失败，你可以检查一下返回的句柄值看看是不是为NULL 没有创建失败呀，正常运作，句柄值也不是NULL。官方文档不是写了说可以指定拥有者窗口吗？


Question: fscanf的一个用法例子

建议你还是贴代码吧


Question: C语言【分数化小数】

发一下题目链接


Question: 复制字符串~每隔3个字符复制一个空格~~if条件没有实现功能~~

引用 5 楼 自信男孩 的回复:[quote=引用 3 楼 weixin_42810814 的回复:] [quote=引用 2 楼 自信男孩 的回复:] [code=c]if(i%4==0) *sc=' ';[/code] 这次是反过来了，你的空格被后面*sc = *s;覆盖了。改成：  if(i%4==0) *sc++=' '; 试试 结果是这样呢 还是不太对[/quote] if (i % 3 == 0) *(sc++) = ' '; 为什么用4呢？[/quote] 当时是那样想的，在第四个位置插入一个空格~~就能实现每隔三个字符中间空一格空格..   而且前四次循环也确实实现了目的~~

引用 4 楼 weixin_42810814 的回复:只有前7次循环是对的 第8次循环位置的空格就被覆盖了。。。 #include<stdio.h> #include<stdlib.h> #include<string.h> void stringcpy3(char s[], char sc[]) {       int i = 1;       while (*s) {            // 我设置了在第四个字符 第八个字符 第十二字符等等放入空格，可最后输出结果却是原样输出！请问下是什么原因？         *sc = *s;         sc++;         s++; 		if (i %3 == 0) {*sc = ' ';sc++;} 		 i++;     }     *sc = '\0'; }   int main(int argc, char const *argv[]) {     char str[88];     char strc[88];     gets(str);     stringcpy3(str, strc);     puts(strc);     system("pause");     return 0; }

引用 3 楼 weixin_42810814 的回复:[quote=引用 2 楼 自信男孩 的回复:] [code=c]if(i%4==0) *sc=' ';[/code] 这次是反过来了，你的空格被后面*sc = *s;覆盖了。改成：  if(i%4==0) *sc++=' '; 试试 结果是这样呢 还是不太对[/quote] if (i % 3 == 0) *(sc++) = ' '; 为什么用4呢？

只有前7次循环是对的 第8次循环位置的空格就被覆盖了。。。

引用 2 楼 自信男孩 的回复:[code=c]if(i%4==0) *sc=' ';[/code] 这次是反过来了，你的空格被后面*sc = *s;覆盖了。改成：  if(i%4==0) *sc++=' '; 试试 结果是这样呢 还是不太对

因为你sc=' '后，sc没有++，又被后面赋值给覆盖了，修改如下  #include<stdio.h> #include<stdlib.h> #include<string.h> void stringcpy3(char s[], char sc[]) {  	int i = 1;  	while (*s) {  		if (i % 4 == 0) *sc++ = ' ';  // 我设置了在第四个字符 第八个字符 第十二字符等等放入空格，可最后输出结果却是原样输出！请问下是什么原因？ 		*sc = *s; 		sc++; 		s++; 		i++; 	} 	*sc = '\0'; }  int main(int argc, char const *argv[]) { 	char str[88]; 	char strc[88]; 	gets(str); 	stringcpy3(str, strc); 	puts(strc); 	system("pause"); 	return 0; }


Question: 非计算机专业小白求助

引用 2 楼 user-1的回复:栈的存储区间为[1,m]（不妨当做一个横向数组），初始时栈顶指针top指向右边界的下一个地址，也就是m+1（表示栈顶为空），由于栈的低部在右边界，入栈指针往左移，也就是（top--），相反，出栈往右移，也就是（top++），所以当top==m时，再出一个元素（top++），故top=m+1 感谢！请问一下，top--，top++怎样判断的呢？还有我附上的那张解析说栈是开口向下的，这怎么理解呢

忘了补充了……由于分数有限，所以给的比较少，希望各路大神仗义相助


Question: 代码未实现功能>_<#复制字符串每隔3个字符中间有一个空格~~

引用 9 楼 akari10032 的回复:[quote=引用 8 楼 自信男孩的回复:][quote=引用 6 楼 akari10032 的回复:] 赋空格时指针没++， 改成if (i % 4 == 0)  *sc++ = ' '; 你的改动可以先试一下：是否真的可以实现你想要的～[/quote] 你直接改了跑一下吧，我手上没有编译器，如果没有解决我等下午摸到电脑再试试[/quote] 没有实现。。  #include<stdio.h> #include<stdlib.h> #include<string.h> void stringcpy3(char s[],char sc[]){  int i=1;  while(*s){   if(i%4==0) *sc=' ';   //我改成这样也不行。。。 *sc=*s; sc++; s++;  i++; }  *sc='\0'; }  int main(int argc, char const *argv[]) { char str[88]="afdsjklajfkljaslkjfdslaafls"; char strc[88];  // gets(str); stringcpy3(str,strc); puts(strc); system("pause"); return 0; }

引用 8 楼 自信男孩的回复:[quote=引用 6 楼 akari10032 的回复:] 赋空格时指针没++， 改成if (i % 4 == 0)  *sc++ = ' '; 你的改动可以先试一下：是否真的可以实现你想要的～[/quote] 你直接改了跑一下吧，我手上没有编译器，如果没有解决我等下午摸到电脑再试试

引用 6 楼 akari10032 的回复:赋空格时指针没++， 改成if (i % 4 == 0)  *sc++ = ' '; 你的改动可以先试一下：是否真的可以实现你想要的～

引用 5 楼 weixin_42810814 的回复:[quote=引用 4 楼 自信男孩 的回复:] [quote=引用 3 楼 weixin_42810814 的回复:] [quote=引用 2 楼 自信男孩 的回复:] while(*s){         *sc=*s;         if(i%4 == 0)             *(sc++) = ' ';         sc++;         s++;         i++;     } 楼主这样操作，会把刚复制给sc的字符用' '（空格）吃掉。 这里不是只有满足if条件才会放空格吗？[/quote] 是呢，放空格地方没问题，你有没有注意，*(sc++) = ' ';这句，是先赋值再让sc++；[/quote] 改成*sc=' ';好像也不行！[/quote] 试试*(++sc) = ' ';

引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 weixin_42810814 的回复:] [quote=引用 2 楼 自信男孩 的回复:] while(*s){         *sc=*s;         if(i%4 == 0)             *(sc++) = ' ';         sc++;         s++;         i++;     } 楼主这样操作，会把刚复制给sc的字符用' '（空格）吃掉。 这里不是只有满足if条件才会放空格吗？[/quote] 是呢，放空格地方没问题，你有没有注意，*(sc++) = ' ';这句，是先赋值再让sc++；[/quote] 改成*sc=' ';好像也不行！

引用 3 楼 weixin_42810814 的回复:[quote=引用 2 楼 自信男孩 的回复:] while(*s){         *sc=*s;         if(i%4 == 0)             *(sc++) = ' ';         sc++;         s++;         i++;     } 楼主这样操作，会把刚复制给sc的字符用' '（空格）吃掉。 这里不是只有满足if条件才会放空格吗？[/quote] 是呢，放空格地方没问题，你有没有注意，*(sc++) = ' ';这句，是先赋值再让sc++；

引用 2 楼 自信男孩 的回复:while(*s){         *sc=*s;         if(i%4 == 0)             *(sc++) = ' ';         sc++;         s++;         i++;     } 楼主这样操作，会把刚复制给sc的字符用' '（空格）吃掉。 这里不是只有满足if条件才会放空格吗？

#include<stdio.h> #include<stdlib.h> #include<string.h>  void stringcpy3(char s[],char sc[]) {     int i=1;  #if 0     while(*s){         *sc=*s;         if(i%4 == 0)             *(sc++) = ' ';         sc++;         s++;         i++;     }     *sc = '\0'; #else     while(*s){         *sc++ = *s++;         if(i % 3 == 0)             *(sc++) = ' ';         i++;     }     *sc = 0;  #endif }  int main(int argc, char const *argv[]) {     char str[88];     char strc[88];     gets(str);     puts(str);     stringcpy3(str,strc);     puts(strc);     system("pause");     return 0; } 供参考～

字符串复制：为什么只有前4次的循环实现了效果在第四个位置复制了空格，而第八个位置却没有复制空格而是在第9个位置复制了空格呢？

引用 13 楼 akari10032 的回复:跑一下试试， 因为从1到4需要3次循环，但从4到8就需要四次了，之后每次i到8的倍数有需要四次循环  我不明白的也就是在这里： 因为设置了int i=1;  if(i%4==0) *(sc++)='  ';  为什么只有前4次的循环实现了效果在第四个复制了空格，而第八个位置却没有复制空格 而是在第9个位置复制了空格呢？ 9%4==1并不满足条件呀！

引用 12 楼 weixin_42810814的回复:[quote=引用 11 楼 akari10032 的回复:] void stringcpy3(char s[],char sc[]){  int i=0;  while(*s){   if(i%3==0) *sc++=' ';   //我改成这样也不行。。。 *sc=*s; sc++; s++;  i++; }  *sc='\0'; } 算了  在你代码上直接改吧， 有两个错误点，一个是i对4取模，这会导致每隔4字符才会添加一个空格；二是你赋空格时没对指向目标数组的指针加加，导致拷贝下一个字符时空格被覆盖 引用 11 楼 akari10032 的回复:void stringcpy3(char s[],char sc[]){  int i=0;  while(*s){   if(i%3==0) *sc++=' ';   //我改成这样也不行。。。 *sc=*s; sc++; s++;  i++; }  *sc='\0'; } 算了  在你代码上直接改吧， 有两个错误点，一个是i对4取模，这会导致每隔4字符才会添加一个空格；二是你赋空格时没对指向目标数组的指针加加，导致拷贝下一个字符时空格被覆盖 我用的是 i=1; 怎么可能每隔4个字符加一个空格呢？[/quote] 跑一下试试， 因为从1到4需要3次循环，但从4到8就需要四次了，之后每次i到8的倍数有需要四次循环

引用 11 楼 akari10032 的回复:void stringcpy3(char s[],char sc[]){  int i=0;  while(*s){   if(i%3==0) *sc++=' ';   //我改成这样也不行。。。 *sc=*s; sc++; s++;  i++; }  *sc='\0'; } 算了  在你代码上直接改吧， 有两个错误点，一个是i对4取模，这会导致每隔4字符才会添加一个空格；二是你赋空格时没对指向目标数组的指针加加，导致拷贝下一个字符时空格被覆盖 引用 11 楼 akari10032 的回复:void stringcpy3(char s[],char sc[]){  int i=0;  while(*s){   if(i%3==0) *sc++=' ';   //我改成这样也不行。。。 *sc=*s; sc++; s++;  i++; }  *sc='\0'; } 算了  在你代码上直接改吧， 有两个错误点，一个是i对4取模，这会导致每隔4字符才会添加一个空格；二是你赋空格时没对指向目标数组的指针加加，导致拷贝下一个字符时空格被覆盖 我用的是 i=1; 怎么可能每隔4个字符加一个空格呢？


Question: 关于c语言小游戏的问题 *easyX库

引用 1 楼 user-1的回复:按下：启动定时器，控制匀速移动 释放：关闭定时器 关于这个计时器，是要从摁下开始getlocaltime然后在一个循环里新变量不断地再getlocaltime然后和先前的时间做对比然后计算位置刷新画面嘛☒

按下：启动定时器，控制匀速移动 释放：关闭定时器


Question: RegisterWindowMessageA注册的字符串消息怎么使用？

如果需要和其他应用程序通信，推荐使用RegisterWindowMessage 进程内使用WM_USER + X

引用 13 楼 Intel0011 的回复:如果你知道对字符串处理的算法且算法可逆的话，就可以，MS貌似没有提供获取这个字符串的方法，不知道内核的那个结构中可以获取到 换言之就是不能了。。。。那平时对于这种字符串消息用得多吗？

引用 3 楼 user-2 的回复:注册消息只是告诉操作系统，我需要注册这个消息编号，有这个编号的发给我，至于叫什么并不重要 系统不保存这个字符串吗？

0x0400                     WM_USER 0x0400----0x7FFF    应用程序内自定义私有窗口类消息 0x8000                     WM_APP(WINVER>=4.0) 0x8000----0xBFFF    用户自定义的消息和其他应用程序通信 --------------------------------- 0xC000----0xFFFF    保留给RegisterWindowMessage,用来和其他应用程序通信  根据微软的建议，WM_APP类消息用于程序之间的消息通信，而WM_USER类消息则最好用于某个特定的窗口类。 微软自己遵循这一惯例，所以，公用控件的消息，如TVM_DELETEITEM，基本都是WM_USER类属。 从0xC000开始，到0xFFFF，这个区段的消息值保留给RegisterWindowMessage这个API，此API可以接受一个字符串，把它变换成一个唯一的消息值。  (1)WM_USER through 0x7FFF Integer messages for use by private window classes. WM_APP through 0xBFFF Messages available for use by applications. (2)默认规则是以WM_USER+X(WM_USER---0x7FFF)用于窗口级的消息，WM_APP+X(WM_APP---0xBFFF)用于进程级的消息 (3)我的理解：第一种定义用于进程内消息，第二种定义用于进程间消息 (4)约定俗成的一种规则 WM_USER through 0x7FFF: 仅在自己预定义的窗口内部使用 WM_APP through 0xBFFF: 在应用程序的其他地方均可使用  如果程序的所有窗口和所有控件完全由你一个人实现，你完全可以不遵守这一规则。 但若有其他人写的代码或加载了外来的控件，如果你不遵守这一规则，发生冲突的概率会明显加大，可能会出现意想不到的结果。

引用 11 楼 Intel0011 的回复:RegisterWindowMessage内部有一套算法用字符串来生成一个唯一的消息值，其他字符串生成其他消息值 消息值怎么使用是你的事，RegisterWindowMessage的作用就是将不同的字符串映射为一个唯一的消息值 字符串有助于人理解，消息值是供系统内部来使用的，唯一的要求是：只要与其他消息值不冲突即可 关键是这个字符串还能获取到吗？

引用 9 楼 Intel0011 的回复:The RegisterWindowMessage function is typically used to register messages for communicating between two cooperating applications.  If two different applications register the same message string, the applications return the same message value. The message remains registered until the session ends.  Only use RegisterWindowMessage when more than one application must process the same message. For sending private messages within a window class, an application can use any integer in the range WM_USER through 0x7FFF. (Messages in this range are private to a window class, not to an application. For example, predefined control classes such as BUTTON, EDIT, LISTBOX, and COMBOBOX may use values in this range.) 感觉对于这个字符串消息还是没怎么解释

引用 5 楼 user-2 的回复:字符串只是为了人能看懂理解的，系统并不需要这个东西，编号就是系统要的，有的话也有可能保存在注册表中，再进一步，你就算跟到字符串有什么作用吗？为什么要这个字符串呢 如果不要这个字符串的话，那跟WM_USER、WM_APP都完全没有区别了，反正都是一种约定，完全也可以用WM_USER消息对应一个字符串，收到消息就默认知道了这个信息；再进一步讲，哪个消息不是一个信息？那还分什么字符串消息和WM_USER、WM_APP消息？

引用 5 楼 user-2 的回复:字符串只是为了人能看懂理解的，系统并不需要这个东西，编号就是系统要的，有的话也有可能保存在注册表中，再进一步，你就算跟到字符串有什么作用吗？为什么要这个字符串呢、 可以用于程序对用户的提示啊

引用 1 楼 user-2 的回复:消息怎么使用只有定义者可以指定，你想要知道就需要看代码，不是看编号就可以查到的 也就是说，真的只能知道这个编号，知道这个编号代表的字符串吗？

消息怎么使用只有定义者可以指定，你想要知道就需要看代码，不是看编号就可以查到的


Question: qdebug输出中文字符为乱码，要不没有输出，各位大佬为什么呢？

谢谢各位，问题已经解决。

引用 5 楼 qq_38287018 的回复:[quote=引用 4 楼 赵4老师的回复:]QString::fromLocal8Bit("中文") 是把这段代码加进去吗[/quote] 将带中文的字符串用 QString::fromLocal8Bit( 和 ) 括住。

引用 4 楼 赵4老师的回复:QString::fromLocal8Bit("中文") 是把这段代码加进去吗

Qt控制台输出显示乱码

这个要怎么转啊，小白不太懂

qtcreator默认字符是utf8的。vs默认是ansi的。 console输出默认也是ansi的。输出前先转码


Question: C语言图形界面

提示Buffer too small.. 建议检查程序中是否有死循环.


Question: C 语言增加功能，限制输出信息个数 的奇葩事件，求大神解答

scanf是要求你输入"输入组数:10" 这样才行，scanf是输入的不是输出的。 可以改成:  printf("输入组数："); scanf("%d", &s); 拆成两句


Question: 数据结构

学习C/C++还有学完这一说法，敢写精通的也没几个，应该只是上课上完一本书