Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 结果不对，那错了。

回复:
user: user-1
content: #include <stdio.h> #include <ctype.h> #include <string.h> /* for strlen*/  #define MAX_LEN  4 /* 0: character, 1: digit, 2: space, 3:other*/ #define MAX_STR_LEN 128  int cnt[MAX_LEN];  void count(char *src, int cnt[]) {     int i;      for (i = 0; src[i]; i++) {         if (isalpha(src[i]))             cnt[0]++; /* charaters */         else if (isdigit(src[i]))             cnt[1]++; /* digits */         else if (isspace(src[i]))             cnt[2]++; /* space */         else             cnt[3]++; /* others */     } }  int main(void) {     char str[MAX_STR_LEN] = { 0 };      fgets(str, MAX_STR_LEN-1, stdin);     str[strlen(str)-1] = 0;      count(str, cnt);      printf("英文：%d, 数字：%d, 空格：%d, 其他: %d\n", cnt[0], cnt[1], cnt[2], cnt[3]);     return 0; }  循环调用计算函数这样效率不高，如果能调用一次而实现计算所有的字符，那么就一次实现。 以上是我的想法，可以参考一下。

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

user: user-3
content: for(int i  = 0; i < 4; i++){ //这的代码会循环 4 次 }  你的代码问题太多，多改改吧。比如 if(h>='a'&&h<='z'||h>='A'&&h<='Z') 或操作两边是不是该用括号括起来？ y=y++; 一般是写成y++;
user-0 提问: c语言中链表操作文件问题：修改或删除文件某一内容

回复:
user: user-1
content: 如果要提高效率，要用到类似数据库的逻辑删除好了 在数据记录上设置一个标记， 表示是否有效 如果删除了， 把这个标记比如0改成1， 文件大小不变， 不影响前后的内容 直接定位写就好了

user: user-2
content: 我现在遇到的情况和你一样    想通过链表实现对文件数据的修改

user: user-3
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224

user: user-4
content: 引用 7 楼 paschen 的回复:如果你要提高效率，需要定制合理的文件存储方案，使得可以直接移动文件指针，读取需要的部分并进行修改/删除，而不必重新  [quote=引用 5 楼 qq352642663 的回复:] [quote=引用 3 楼 paschen 的回复:] 如果你要提高效率，需要定制合理的文件存储方案，使得可以直接移动文件指针，读取需要的部分并进行修改/删除，而不必重新全部读入修改再保存 是不是使用fseek和ftell函数就可以实现？[/quote]  是的[/quote]  好牛的

user: user-5
content: 如果你要提高效率，需要定制合理的文件存储方案，使得可以直接移动文件指针，读取需要的部分并进行修改/删除，而不必重新  引用 5 楼 qq352642663 的回复:[quote=引用 3 楼 paschen 的回复:] 如果你要提高效率，需要定制合理的文件存储方案，使得可以直接移动文件指针，读取需要的部分并进行修改/删除，而不必重新全部读入修改再保存 是不是使用fseek和ftell函数就可以实现？[/quote]  是的

user: user-5
content: 如果你要提高效率，需要定制合理的文件存储方案，使得可以直接移动文件指针，读取需要的部分并进行修改/删除，而不必重新全部读入修改再保存

user: user-6
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224

user: user-7
content: 1 重新保存文件就行了； 2 （1）就是最好的办法，除非文件超级大，大到需要自己开发文件系统的程度，可以通过直接写硬盘的方式解决。比如 Oracle 数据库就可以直接访问硬盘分区，比访问数据库文件效率高些。

user: user-0
content: 引用 2 楼 Potato_Lyy 的回复:所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224谢谢，你分享的方法好像合适，

user: user-0
content: 引用 3 楼 paschen 的回复:如果你要提高效率，需要定制合理的文件存储方案，使得可以直接移动文件指针，读取需要的部分并进行修改/删除，而不必重新全部读入修改再保存 是不是使用fseek和ftell函数就可以实现？

user: user-0
content: 引用 1 楼 loneking2001 的回复:1 重新保存文件就行了； 2 （1）就是最好的办法，除非文件超级大，大到需要自己开发文件系统的程度，可以通过直接写硬盘的方式解决。比如 Oracle 数据库就可以直接访问硬盘分区，比访问数据库文件效率高些。 目前只是学了c语言然后想用结构体和文件操作等知识来实现一个管理系统而已。所以暂时不会用到数据库。 我的疑惑只是不知道如何使用文件操作函数来修改或者删除文件。 所以我想到了两种实现方式： 1.直接操作文件修改或者删除文件中的内容 2.将文件中的内容读入链表再进行修改删除，然后覆盖原文件。  请问哪种实现方式可行？具体思路是怎么样的呢
user-0 提问: 求教一下这个问题用c语言怎么实现的

回复:
user: user-1
content: 引用 1 楼 user-5 的回复:我没分了，怎么办 听说每天回帖可得10分。

user: user-1
content: 引用 5 楼 kellen_ 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 1 楼 user-5 的回复:] 我没分了，怎么办 听说每天回帖可得10分。[/quote] 我想问问题也没分。。。。都不可以用钱冲[/quote] 难道CSDN不欢迎富二代？ 打钱给CSDN的版主，让他给你充！

user: user-2
content: 引用 3 楼 zhao4zhong1 的回复:[quote=引用 1 楼 user-5 的回复:] 我没分了，怎么办 听说每天回帖可得10分。[/quote] 我想问问题也没分。。。。都不可以用钱冲

user: user-3
content: 引用 1 楼 user-5 的回复:我没分了，怎么办  每天回帖即可获得10分可用分！小技巧：教您如何更快获得可用分 你还可以输入10000个字符

user: user-4
content: 简单点的说就是：前行*后列再相加 int a[2][3];//矩阵1 int b[3][3];//矩阵2 int c[3][3];//新矩阵 c[0][0]=a[0][0]*b[0][0]+a[0][1]*b[1][0]+a[0][2]*b[2][0];//c矩阵的第一行第一列元素 c[0][1]=a[0][0]*b[0][1]+a[0][1]*b[1][1]+a[0][2]*b[2][1];//c矩阵的第一行第二列元素 //以此类推，即可得到A(2*3)*B(3*3)的结果C(3*3)

user: user-5
content: 我没分了，怎么办
user-0 提问: 对于这段代码，为什么只声明了一个一维数组，却能fgets输入多个字符串到该数组？程序运行时的内存、缓冲区是怎样使用的？

回复:
user: user-1
content: 如同记分牌，改变每个分数的值（这里是改变没 bit  的0和1）

user: user-2
content: 因为每一次输入都是存到同一个字符数组中，下一次的输入会覆盖上一次的

user: user-3
content: 就是那一块连续的内存，下一次的循环得到的字符串会覆盖上一次的内存。

user: user-4
content: 分时复用
user-0 提问: C语言快速排序

回复:
user: user-1
content: 引用 3 楼 Potato_Lyy的回复:快速排序可见: http://m.blog.csdn.net/article/details?id=6684558  http://developer.51cto.com/art/201403/430986.htm 这是两个网站注意分开一下

user: user-1
content: 快速排序可见: http://m.blog.csdn.net/article/details?id=6684558  http://developer.51cto.com/art/201403/430986.htm

user: user-2
content: int partition(int a[], int p, int r)就是把a数组下标范围为p到r的元素分成两部分，然后返回枢轴的下标，结果是枢轴前面的都小于枢轴元素，枢轴后面的都大于枢轴元素。这里用第一个元素（下标为p）作为枢轴，也就是比较标准， while(i<r && a[++i]<x);是找到从左边起第一个大于等于x的数（不能越界，所以有i<r）， while(a[--j]>x);是找到从右边儿起第一个小于等于x的数（最左边儿有x，不会越界），然后将这两个数交换，然后继续找，直到左边儿的都小于x右边儿的都大于x，然后通过swap(a,p,j);把x（还在第一个位置）放到中间来，最后返回x的下标 大概就是这个样子吧，你举个例子跑一遍就明白了，或者去找一篇关于快速排序的博客看看

user: user-3
content: http://blog.csdn.net/wolinxuebin/article/details/7456330
user-0 提问: 字符串输入停止工作，加上取地址符号就能跑了，求大神指导指导

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

user: user-2
content: 这是二维数组

user: user-3
content: 还可以写成你可以写成scanf("%s %s %c",a[i],b[i],&c[i]);  %s 和 %c 叫做格式控制符，需要和后面的变量一一对应

user: user-3
content: 因为c是一维数组，c[i]代表的是一个字符，不可以这么写，  而c是一个一维数组，c代表这个数组的首地址，所以你可以直接写c，  a，和b是二维数组，a[i],b[i],代表的还是数组，相当于是数组的首地址，所以不需要加&。  输入的语句应该是这样：  你可以写成scanf("%s %s %s",a[i],b[i],c);

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

user: user-4
content: 不管是%c还是%s都需要地址与其匹配 c[i]代表的是一个字符，必须取地址才行

user: user-5
content: scanf中性别的输入需要地址符，&c[i]或者c+i；

user: user-6
content: 这个问题要说明白比较费劲，跟C语言指针和数组的转化有关，如果是新手你会用就可以了 a和b是二维数组，所以a[i]是一个行指针char(*)[21]，而scanf函数%s对应的实参要求类型为char*，这两种类型是可以隐式转化的，所以没有问题，而且你加了取址符&也没有问题，因为这里无论取多少次地址其类型也不会改变 c是本身是一个数组，但%c对应的也是一个char*，c[i]是一个char类型，必须加取址符&才能转化为char*类型

user: user-7
content: 只有c[i]前需要取地址符号 因为a[i]、b[i]已经是能存放20个字符字符串的字符数组了 c本身才是字符数组，c[i]只能存单个字符

user: user-8
content: c[i] 改成 &c[i]  scanf要的是buffer的地址
user-0 提问: C语言实例资料

回复:
user: user-1
content: http://bbs.csdn.net/topics/350132261?locationNum=7&fps=1 楼主可以根据自己的需要自己进行选择。

user: user-0
content: 引用 5 楼 ck2333的回复:http://bbs.csdn.net/topics/350132261?locationNum=7&fps=1 楼主可以根据自己的需要自己进行选择。 感谢！看来c三本圣经是必读的啊。

user: user-2
content: 后三本实例，前面参考书一起发了。

user: user-0
content: 引用 1 楼 user-2的回复:C Primer Plus  C语言程序设计：现代方法：第2版(被誉为"近10年来最好的一部C语言著作") C和指针 或者谭浩强《C程序设计》 以上任选一本就差不多了，以下为参考书： 《深入理解C指针》 《C陷阱与缺陷》 《C专家编程》 《C语言点滴》 《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例 在看《C专家编程》,里面似乎并没有很多实例，不过还是值得一看，准备再去了解一下你说的其他书籍，感谢回复。

user: user-2
content: 引用 1 楼 u010165006 的回复:《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例  TC（Turbo C）老代码（小游戏）最好看懂了以后，理解了算法和过程，用VC改写成Windows平台的。   楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  下载一个EasyX包，里面有完整的函数手册EasyX_Help.chm，有示例。EasyX官网有很多网友上传的实例，包括游戏。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

user: user-2
content: C Primer Plus  C语言程序设计：现代方法：第2版(被誉为"近10年来最好的一部C语言著作") C和指针 或者谭浩强《C程序设计》 以上任选一本就差不多了，以下为参考书： 《深入理解C指针》 《C陷阱与缺陷》 《C专家编程》 《C语言点滴》 《C语言课程设计案例精编》 C语言程序开发范例宝典 C语言经典编程282例
user-0 提问: 大家好，在做一个小工具的时候遇到了麻烦。

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

user: user-2
content: 直接用sprintf+system调用ren

user: user-0
content: 引用 2 楼 u010165006 的回复:用sprintf加一个int变量构造文件名。  非常感谢！！！！我百度了好一会你说的那个sprintf，我也自己实验了几次，成功了！！！非常感谢

user: user-0
content: 引用 2 楼 u010165006 的回复:用sprintf加一个int变量构造文件名。  我好像理解你什么意思了，就是用你的放噶构造一个字符串出来，但是在那个rename里面的参数要怎么写呢？刚接触没多长时间，有点不懂。麻烦了。

user: user-0
content: 引用 2 楼 u010165006 的回复:用sprintf加一个int变量构造文件名。  ee，，不好意思哈，，没太看懂，，能把rename那句给写一下示范么？感激不尽

user: user-3
content: 用sprintf加一个int变量构造文件名。

user: user-0
content: 麻烦大家帮忙看一下  ，谢谢了
user-0 提问: 求教，怎么在窗口上显示一个网页！

回复:
user: user-0
content: 感谢感谢!!!

user: user-1
content: 你是用C++吗？要看你使用哪种框架，比如VCL、MFC，都有各自的控件，不是单一DLL的问题。  VCL是C++ Builder使用的框架，图形用户界面可以学习C++ Builder，架构先进，入门比较容易。  C++ Builder的较新版本——RAD Studio XE3以上版本添加对iOS和Android的支持工具包，让开发者编写的Delphi/C++应用可以同时在Windows、OS X、iOS和Android平台上运行。现在最新版本是RAD Studio 10.1。  仅供参考： 初学者学习C++ Builder第一个程序（模拟聊天室），经典！ http://blog.163.com/tab_98/blog/static/11924097201693033057497/ C++ Builder绘图示例（模拟时钟） http://blog.163.com/tab_98/blog/static/11924097201611324819376/ 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/  C++ Builder写的《ZEC 纸牌游戏21点》 http://blog.163.com/tab_98/blog/static/119240972016115113039304/ C++ Builder写的《ZEC 僵尸版打地鼠》 http://blog.163.com/tab_98/blog/static/11924097201601084117748/ C++ Builder写的《ZEC 推箱子》 http://blog.163.com/tab_98/blog/static/11924097201612011839642/  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社） 《C++Builder6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。

user: user-0
content: 浏览器控件 是哪个DLL  哪个函数，函数不知道我可以自己查，最重要是哪个DLL。

user: user-1
content: 除非你想自己写个浏览器内核来解析、渲染网页。

user: user-1
content: 用浏览器控件。字数。。
user-0 提问: 代码为何在慕课网上运行不了？

回复:
user: user-1
content: 你把有的分号用的都是中文的全角分号，要改成英文的分号就行了

user: user-2
content: 楼主的程序很简单，自己就错误提示就能知道哪里出错了~~~

user: user-3
content: 在printf函数中支持全角输出~但它的ASCII码明显不同于半角的ASCII码~编译器当然不支持全角输出咯~

user: user-4
content: 不要包含全角字符。一律用半角。

user: user-5
content: 冒号与分号用了全角了
user-0 提问: 不知道为啥子这编译器连C primer plus里的程序清单码进去都经常处问题，现在问题说不清楚，看图吧OTZ

回复:
user: user-0
content: 书上的代码是这样的 //praisel.c——使用不同类别的字符串 #include <stdio.h> #define PRAISE "What s super marvelous name!" int main(void) { char name[40];  printf("What's your name?\n"); scanf("%s",name); printf("Hello,%s,%s\n",name,PRAISE);  return 0; } 我只是将scanf()函数改为了scanf_s()函数，而且为了暂停看输出添加了getchar()函数（我只知道getchar()在之前的练习里能起到暂停的作用，具体的原理完全不知道，因为书上还没讲） 基于你上面的解释我想我应该理解了原因了，谢谢。

user: user-0
content: 用的WIN10系统，软件是VS2015.

user: user-1
content: 你是用Linux系统吗？Linux下好像fflush(stdin)无效，有另外办法。

user: user-1
content: 不是第一次输入跑到下面去了，而是scanf、getchar都是从键盘缓冲区读取，缓冲区有东西getchar直接就取走了，缓冲区为空的时候才会等待键盘输入。

user: user-0
content: 由于新人对ffulsh(stdin)的作用不懂，而且getchar()也只是经提点单纯想用来暂停运行中的程序而已，所以一旦按照书上的代码无法输出正确的结果就，懵逼了。

user: user-0
content: 上面代码的作用其实就是取代了getchar()函数用于暂停了运行中的程序而已吧，但是问题是在第一个scanf_s()函数输入的数据跑到了下面去了，在另外一个程序我用了两个scanf_s()函数，中间不管加不加上ffulsh(stdin)，第二个scnaf_s函数都会读取到第一个函数输入空格后的参数耶？望解答

user: user-1
content: 试试： printf("What's your name?\n");  scanf_s("%s",name,10); printf("Hello,%s,%s\n",name,PRAISE);  system("pause"); return 0;

user: user-0
content: 还是不行，用了下分析里的对解决方案运行代码分析（表示不知道这个是啥，但是好像能看出问题是什么 得出两个警告： 严重性	代码	说明	项目	文件	行	禁止显示状态 警告	C4566	character represented by universal-character-name '\u00A0' cannot be represented in the current code page (936)	4.2	c:\users\administrator\desktop\c语言\c primer plus\示例程序\第四章示例程序\4.2\4.2\4.2.cpp	8	  还有 严重性	代码	说明	项目	文件	行	禁止显示状态 警告	C6031	返回值被忽略: “getchar”。	4.2	c:\users\administrator\desktop\c语言\c primer plus\示例程序\第四章示例程序\4.2\4.2\4.2.cpp	12	活动  第一个我看不懂，不过第二个返回值被忽略，对这个很是在意，望解答

user: user-1
content: 试试： printf("What's your name?\n");  scanf_s("%s",name,10); printf("Hello,%s,%s\n",name,PRAISE);  fflush(stdin); getchar(); return 0;

user: user-0
content: 这样？ //praisel.c——使用不同类别的字符串 #include <stdio.h> #define PRAISE "What s super marvelous name!" int main(void) { 	char name[40];  	printf("What's your name?\n");  	scanf_s("%s",name,10); 	fflush(stdin); 	getchar(); 	printf("Hello,%s,%s\n",name,PRAISE);  	getchar(); 	return 0; } 还是不行啊，程序依旧会一闪而过OTZ不知道是不是我fflush(stdin);加的位置不对

user: user-1
content: 输入A B，A B连同回车符会进入键盘缓冲区，第一次scanf得到"A"，接着getchar();自动得到'B'，不需要再输入。 在getchar();之前fflush(stdin);清空键盘缓冲区试试。

user: user-0
content: 现在的程序代码 //praisel.c——使用不同类别的字符串 #include <stdio.h> #define PRAISE "What s super marvelous name!" int main(void) { 	char name[40];  	printf("What's your name?\n"); 	scanf_s("%s",name,10); 	getchar(); 	printf("Hello,%s,%s\n",name,PRAISE);  	getchar(); 	getchar(); 	getchar(); 	getchar();//这里用了四个getchar()函数 	return 0; }

user: user-0
content: 现在发现在pritnf()函数后面添加四个getchar()函数就就能正常运行，但是程序实际运行还是按一次回车键后才退出的，而不是四个。现在问题就是不知道前三个getchar()函数吞掉了什么。
user-0 提问: HDU1234 开门人和关门人，有看了下一其他些写法，但是实在不知道这样写为啥通不过 ，提交后显示的是wrong answer

回复:
user: user-0
content: 蟹蟹1楼的解答 确实是这里出了问题

user: user-1
content: 网上找下AC的代码吧。 1.看看你们的输入输出格式是不是一致 2.多测试一些样例

user: user-2
content: 两个cmp函数最外层的else，是不是应该比较的是xiaoshi？
user-0 提问: 有关连线图的问题

回复:
user: user-1
content: 在图中，a^ c^ d^ d* e^ e* 为一个ArraySingle[] = {0,4,6,7,8,9}; 每个数组的值都是一位hex数。 而组合的用ArrayDouble[] = { ... }, 每个数组的值都是两位hex数。例如 c^d*的组合在ArrayDouble中为0x45。  然后， 第一个选ArraySingle中的一个数X，再在ArrayDouble找低位数是X的2位数Y(=0xUX)，然后再获得Y的高位数U，在ArrayDouble继续找到相同高位为U的2位数，若找到则继续在ArrayDouble中找下一个，若没有找到则在ArraySingle中找最后一个2位数的低位。  以上简单说下思路，当然中间会有短路径和长路径。

user: user-2
content: a^中符号^表示什么意思呀
user-0 提问: 运行的时候没有输入字符，程序就结束了，但是程序里面有getchar函数

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

user: user-2
content: 当然不会输出了。因为  c !='\n' 。当你输入回车的时候，那么就不会再继续走循环里面啦。 lim-1 && (c = getchar()) !=EOF&& c !='\n' 当键入回车键， 那么 c 就==‘\n’ 那么久不满足循环的条件。然后就程序不会走循环体内部代码。  你得吧 if(c == '\n')         {             s[i] = c;             ++i;         }         s[i] = '\0';         if(i-1 > 80)         printf("%s",s); 挪到循环外面去。  你的 这代码也有问题：s[i] = '\0';           if(c == '\n')         {             s[i] = c;             ++i;         }         s[i] = '\0';   s[i] = c;  这里先把输入的字符赋值给了 s[i]， ' 然后下面又把  s[i] = '\0'; 给复制一遍。不就清空掉buffer串了么。  楼主需要学会使用 单步调试功能啊。

user: user-0
content: 确实是多了一个“=”号。但是运行的时候输入了超过80个的字符串，然而还是不输出，不知道咋回事

user: user-3
content: lim没有初始化，==是比较运算符
user-0 提问: 做C primer plus的练习遇到的问题

回复:
user: user-0
content: 是软件问题 现在好了

user: user-1
content: 测试没有问题

user: user-0
content: 5. 编写 一个 程序, 生成 以下 输出: Brazil, Russia,India, China  India, China,  Brazil, Russia 除了 main() 以外, 该 程序 还要 调用 两个 自定义 函数: 一个 名为 br(), 调用一次 打印 一次“ Brazil, Russia”; 另一个 名为 ic(), 调用 一次 打印 一次“ India, China”。 其他 内容 在 main() 函数中完成。

user: user-2
content: 没毛病啊。。

user: user-3
content: 题目是什么啊？
user-0 提问: C语言菜单

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

user: user-2
content: #include <stdio.h> #include <string.h> #include <windows.h>  static void menu(void);  void main() {     int select, ret = -1;     system("cls");  //清屏。     menu();      printf("                    请选择：（1/2/3/0）");     ret = scanf("%d",&select);     if (ret <= 0)         select = 1;     switch(select) {         case 1:             printf("选择：%d\n", select);             //system("pause");             // x();             break;         case 2:             printf("选择：%d\n", select);             // y();             break;         case 3:             printf("选择：%d\n", select);             // z();             break;         case 0:         default:             exit(0);             break;     } }  static void menu(void) {     printf(" \n");     printf("                    ======================================\n");     printf("                                   菜  单\n");     printf("                    ======================================\n");     printf(" \n");     printf("                                  1  录入\n");     printf("                                  2  处理\n");     printf("                                  3  打印\n");     printf(" \n");     printf("                                  0  退出\n");     printf(" \n");     printf("                    ======================================\n");      printf(" \n");  }  select为int类型，如果输入a,b,c等非数字字符，那么scanf就因类型匹配错误而返回0，根据这个返回值来确认select的值。

user: user-3
content: 楼主的程序因为初始化为1了。

user: user-4
content: 你应该把把case1放在default之前，两个共用一个执行语句块儿，把case0中的语句拿出来单独执行。
user-0 提问: fgets()函数

回复:
user: user-1
content: 上楼说错了~是stdio.h我汗~

user: user-1
content: fgets用stdin.h就可以了~ 如果想保险就加上stdlib.h 那个代码测试没有问题~能正常输入~如果不行就发完整版代码~ 正常应该是没有问题的~

user: user-0
content: 输入中间带空格的字符串包括数字也解决了。

user: user-0
content: 已经解决了。将 printf("请输入：\n");中的“\n”删除就可以了。 但还有一问题：代码原本是为了输入中间带空格的字符串，现在可以输入中间带空格的字符串了，例如 “a b”，但不能输入“1 2”,希望把1、2...当作字符对待。

user: user-2
content: 不会啊，你是不是前面还有代码，估计是接收了你之前输入完在缓冲区中留下的换行符  fets前加个getchar()看下
user-0 提问: 关于一道C语言编程题

回复:
user: user-1
content: 去重复可以用先把结果排序，然后去重，for循环，用一个临时变量=-1，和a（i）比较，相同，总数就减1，不同就把a（i）赋值给临时变量

user: user-0
content: 引用 5 楼 ooolinux的回复:内层循环和外层循环也可以反过来，1克的放在最内层循环，20克的放在最外层循环，这样计算就是从最小到最大。 做出来了，谢谢

user: user-2
content: 引用 6 楼 u010165006 的回复:计算出来的总克数，重复的去除，0也去除，就可以了。  我想问下到了这步 。。怎么剔除重复的？

user: user-3
content: 我也是初学者的思路：定义一个数组 int arr[20]; int *p = arr; 然后循环遍历数组，使用if     else if     else类型的 if(*p = 1)  *p++; num1++; else if(*p = 2) *p++; num2++; .... num+质量然后遍历时候就会找到

user: user-4
content: 这个应该是动态规划算法，看下背包算法九讲，或许可以找到答案

user: user-5
content: 引用 7 楼 hyzhanc 的回复:[quote=引用 6 楼 u010165006 的回复:] 计算出来的总克数，重复的去除，0也去除，就可以了。  我想问下到了这步 。。怎么剔除重复的？[/quote]  可以用一个动态数组，每次计算出来的总克数，在数组中搜索有无相同的，没有相同的就插入。

user: user-5
content: 计算出来的总克数，重复的去除，0也去除，就可以了。

user: user-5
content: 内层循环和外层循环也可以反过来，1克的放在最内层循环，20克的放在最外层循环，这样计算就是从最小到最大。

user: user-0
content: 引用 2 楼 user-6的回复:全组合问题~要把相同质量的砝码分开写~写成1 1 1 1 1 2 2 2 3 3 5 5 10 20来写~可参考排列组合算法~ 那还得自己写个排列组合算法吧

user: user-0
content: 引用 1 楼 ooolinux的回复:用6层for循环，第一层循环从0~5，第二层0~3（代表个数），第一层循环变量*1克，第二层循环变量*2克，全部相加。 还是不太懂，循环这么多层不太明白

user: user-6
content: 全组合问题~要把相同质量的砝码分开写~写成1 1 1 1 1 2 2 2 3 3 5 5 10 20来写~可参考排列组合算法~

user: user-5
content: 用6层for循环，第一层循环从0~5，第二层0~3（代表个数），第一层循环变量*1克，第二层循环变量*2克，全部相加。
user-0 提问: 字母排序的这串代码如何理解

回复:
user: user-1
content: 3楼说的没错，你少了len = strlen( a ); 典型的冒泡排序。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-2
content: 长度len个字符，需要排序len-1趟，所以i=0到len-2，共len-1 每一趟中需要比较的次数是不同的，是逐趟少一次

user: user-3
content: 引用 2 楼 m0_37403659 的回复:[quote=引用 1 楼 yangyangsnr 的回复:] 冒泡排序啊，每个字母根据ascii值比较大小  那个len-2跟len-1是啥意思？[/quote] 哦，那你这段代码应该少一句话，在gets(a)下面应该加上 len = strlen( a ); 然后，len就表示了字符串a的长度

user: user-0
content: 引用 1 楼 yangyangsnr 的回复:冒泡排序啊，每个字母根据ascii值比较大小  那个len-2跟len-1是啥意思？

user: user-3
content: 冒泡排序啊，每个字母根据ascii值比较大小
user-0 提问: 一个关于c语言程序的小问题，求教各位

回复:
user: user-0
content: 引用 11 楼 Grevi 的回复:#include <stdio.h> char genA[100][4],genB[100][4];	 int solution1(int munA); int solution2(int numA,int numB);  int main() { int i,j; int n;  int numA,numB; printf("请输入基因组A的基因数目\n"); scanf("%d",&numA); printf("请输入基因组B的基因数目\n"); scanf("%d",&numB); printf("请输入A的基因序列，\n格式为at  ahctchdt\n（没有字母的部分用空格代替即可）\n"); for(i=0;i<numA;i++) for(j=0;j<4;j++) scanf("%c",&genA[i][j]); printf("请输入B的基因序列\n（格式同上）\n"); for(i=0;i<numB;i++) for(j=0;j<4;j++) scanf("%c",&genB[i][j]);  printf("请选择计算方式，1或2\n");  fflush(stdin);//这里需要清除标准输入缓冲区，或者前面加个getchar();也可以，但是不推荐这么做  scanf("%d",&n); switch(n) { case 1: solution1(numA); break; case 2: solution2(numA,numB); break; } printf("感谢您的使用！\n"); return 0; } 解答的这么详细，真的谢谢你

user: user-1
content: #include <stdio.h> char genA[100][4],genB[100][4];	 int solution1(int munA); int solution2(int numA,int numB);  int main() { int i,j; int n;  int numA,numB; printf("请输入基因组A的基因数目\n"); scanf("%d",&numA); printf("请输入基因组B的基因数目\n"); scanf("%d",&numB); printf("请输入A的基因序列，\n格式为at  ahctchdt\n（没有字母的部分用空格代替即可）\n"); for(i=0;i<numA;i++) for(j=0;j<4;j++) scanf("%c",&genA[i][j]); printf("请输入B的基因序列\n（格式同上）\n"); for(i=0;i<numB;i++) for(j=0;j<4;j++) scanf("%c",&genB[i][j]);  printf("请选择计算方式，1或2\n");  fflush(stdin);//这里需要清除标准输入缓冲区，或者前面加个getchar();也可以，但是不推荐这么做  scanf("%d",&n); switch(n) { case 1: solution1(numA); break; case 2: solution2(numA,numB); break; } printf("感谢您的使用！\n"); return 0; }

user: user-2
content: //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0];

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

user: user-3
content: 两处scanf %c之前都加一句fflush(stdin)来清空输入缓冲区（因为%c会读取输入缓冲区遗留的回车符） 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

user: user-4
content: 加个循环结构以及退出菜单条件~

user: user-5
content: 引用 8 楼 rabbit_calm的回复:[quote=引用 1 楼 ai977313677 的回复:] 在scanf之前清除一下缓冲区fflush(stdin) 或者创建一个char变量，去读取回车之类的字符。 谢谢您，但是我不太明白为什么要这么做？[/quote] 大概就是说，你的所有输入都会保存在一个叫缓冲区的东西里，然后scanf会从缓冲区中读取字符，回车之类的字符都会保存进去，所有scanf的时候要注意把这些无用字符读取掉，防止后续操作出现误读。

user: user-0
content: 引用 4 楼 qq423399099 的回复:两处scanf %c之前都加一句fflush(stdin)来清空输入缓冲区（因为%c会读取输入缓冲区遗留的回车符） 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 您可以再说的详细一点吗？我的问题和缓冲区有什么关系啊？谢谢您

user: user-0
content: 引用 1 楼 ai977313677 的回复:在scanf之前清除一下缓冲区fflush(stdin) 或者创建一个char变量，去读取回车之类的字符。 谢谢您，但是我不太明白为什么要这么做？

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 int c; scanf("%c",&c); //时，都改为 char s[2]; int c; scanf("%1s",s); c=s[0]; 我是初学者，缓冲什么的海不太懂，您能大概告诉我一下为什么这么做吗？是因为我的缓冲区不够用了吗？

user: user-6
content: 你执行完switch之后就是打印那句话啊，不显示才奇怪吧 你应该去调试你那两个函数

user: user-5
content: 在scanf之前清除一下缓冲区fflush(stdin) 或者创建一个char变量，去读取回车之类的字符。
user-0 提问: 图的简单路径遍历

回复:
user: user-1
content: 楼主的程序有什么问题？？？只贴一段程序不易看出来啥问题。

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

user: user-0
content: 不懂哪一步错了！
user-0 提问: c语言bug

回复:
user: user-1
content: 根据scanf函数的返回值进行判断，scanf()函数返回成功赋值的数据项数

user: user-2
content: 引用 3 楼 yyyyzf的回复:while(scanf("%d",&row)!=1)     fflush(stdin); 试试用上面的代码~fflush(stdin)是用来清除缓冲区~如果是写一些正规大型的程序~则可以考虑调用自己写的输入函数~进行输入合法性判断~

user: user-2
content: while(scanf("%d",&row)!=1)     fflush(stdin);

user: user-3
content: 用gets和atoi代替scanf("%d",&row)

user: user-0
content: 各位大神，帮忙解决一下，一位c语言菜鸟
user-0 提问: C语言中的EOF

回复:
user: user-1
content: Linux：Ctrl+D Windows：Enter、Ctrl+Z、Enter

user: user-2
content: 例子说明吧： 遇到这个表达式：scanf("%d%d",&a,&b)!=EOF; 如果a和b都被成功读入，那么上面表达式的结果为2； 如果只有一个读入，那么上面表达式的结果为1； 如果a&&b都没有读入，那么上面表达式的结果为0（若a没有读入，则直接放弃b的读入）； 如果遇到错误或者文件结尾，那么上面表达式的结果为EOF，对应的有符号数时-1； 如果遇到Crrl+Z，那么上面表达式的结果为EOF，对应的有符号数时-1;

user: user-3
content: 一般情况下是这样的~ while(scanf("%d",&a)!=EOF) {} 退出循环条件一般是按ctrl+z 这可能是ac或者oj通过重定向对编译器输入文件的内容~而EOF的意义表示读入到文件的末尾~
user-0 提问: c语言 scanf()函数如何读入一个带空格的字符串

回复:
user: user-1
content: fgets(a,20,stdin);

user: user-0
content: fgets(a,20,stdin)函数还是不行！

user: user-2
content: 还不快快用上键盘事件。。。

user: user-3
content: 三楼正解  引用 3 楼 fjjfxz 的回复:scanf函数好象本身就是把空格作为数据分隔符 想读入带空格的字符串，得用如gets()之类的函数

user: user-4
content: 建议暂时使用gets()函数来完成功能 等入门后学习使用fgets()函数来完成  gets(char *string); fgets(char * s, int n,FILE *stream);  char a[20]={0}; printf("请输入： "); gets(a); printf("%s",a); system("pause");

user: user-5
content: scanf函数好象本身就是把空格作为数据分隔符 想读入带空格的字符串，得用如gets()之类的函数

user: user-0
content: 还是不行啊！ 如果是：scanf("%[^\n]%*c",a); 运行结果是： 请按任意键继续… 如果改为：scanf("%s%[^\n]%*c",a); 运行结果仍然是： 请输入：I love you  I请按任意键继续…

user: user-6
content: scanf("%[^\n]%*c",a);%*c是用来吸收末尾的'\n'~~这样就可以了~~
user-0 提问: 关于二维数组的赋值问题

回复:
user: user-0
content: 引用 3 楼 cfjtaishan 的回复:因为第一层循环之后就有了一个回车动作：printf("\n");  非常感谢三楼

user: user-1
content: 楼主认为应该在第几行呢。  int array2[3][2]={{4,2},{5},{6}};//按行初始化

user: user-0
content: 哈，没注意到换行啊

user: user-2
content: 因为第一层循环之后就有了一个回车动作：printf("\n");

user: user-3
content: 因为你用 {} 限定了，这是起始一行了

user: user-4
content: 为什么不呢？
user-0 提问: write()的返回值何时为0

回复:
user: user-1
content: 写不进去那么如果fd是阻塞 那么就会一直阻塞，否则返回EAGAIN。看库实现在你传递的第3个参数为0的时候会返回0.当然具体其他情况是否还会返回0需要看一些内核实现。至于steven这里的处理方式主要还是与作者写书时这个函数的实现有关。Where this volume of IEEE Std 1003.1-2001 requires -1 to be returned and errno set to [EAGAIN], most historical implementations return zero

user: user-2
content: On success, the number of bytes written is returned (zero indicates nothing was written).  On error, -1 is returned, and errno is set appropriately.         If count is zero and fd refers to a regular file, then write() may return a failure status if one of the errors below is detected.  If no errors are detected, 0 will be returned without  caus‐        ing any other effect.  If count is zero and fd refers to a file other than a regular file, the results are not specified. 这是write的返回值说明；

user: user-3
content: 我感觉是进不进去的时候

user: user-0
content: 谢谢各位～～

user: user-4
content: 写缓冲区满
user-0 提问: nginx 怎么在body过滤模块里发送content_length响应头 

回复:
user: user-0
content: 我看到nginx原生的 image_filter 可以将response 缓存起来，最后再发送响应头和响应体。但是不知道怎么实现的缓存response，正在调试源码。

user: user-1
content: 百度搜相关关键字。
user-0 提问: 在eclipse中编写c代码为什么有random（）报错，明明已经写了#include

回复:
user: user-1
content: 顶楼上。

user: user-2
content: srandom random函数是Unix下才有的。        #include <stdlib.h>         long int random(void);         void srandom(unsigned int seed);         char *initstate(unsigned int seed, char *state, size_t n);        char *setstate(char *state);     Feature Test Macro Requirements for glibc (see feature_test_macros(7)):         random(), srandom(), initstate(), setstate(): _SVID_SOURCE || _BSD_SOURCE || _XOPEN_SOURCE >= 500

user: user-3
content: #include <stdlib.h>  void srand( unsigned seed );   int rand( void );  #include <stdlib.h> #include <time.h>   srand( time(NULL) );    for( i = 0; i < 10; i++ )      printf( "Random number #%d: %d\n", i, rand() );

user: user-4
content: 随机函数应该是srand()和rand()，没有见过random呢。

user: user-5
content: ISO C的stdlib.h中只有srand与rand两个函数
user-0 提问: C语言小程序，不管输入几结果都是，*不是质数。代码哪里有错吗？

回复:
user: user-1
content: 我没有看到main函数的对应大括号，这是个错误，一楼说的也是个错误 运行错误时，编译器会提示错误的行数以及为何出错 学会看编译器的调试错误提示是一项必备且特别重要的技能 能自己独立完成的，尽量不用去请求别人，不会很难，要相信自己的能力呀  引用 2 楼 qq423399099 的回复:代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

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

user: user-0
content: 非常感谢各位，我粗心了，呜呜。。。。。

user: user-3
content: 1楼正解、你的for语句括号里的内容没有执行

user: user-4
content: for 语句后面多了一个分号
user-0 提问: c语言

回复:
user: user-1
content: 完全不明白楼上都在回答什么。。。 你这个跳过是因为你的scanf_s用法不对，scanf_s读取%s或者%c的时候必须多传入一个参数用来指定读取的字符的长度，否则会出错。 PS：要注意输入的姓名不要超过4个字符（因为你设的二维数组的第二维长度是5，最后还要放'\0'）  #include <iostream> using namespace std; int main() { 	char name_array[100][5] = { 0 }; 	char sex_array[100] = { 0 }; 	int age_array[100] = { 0 }; 	float att_array[100] = { 0 }; 	int operation = 0; 	int max_number = 0; 	int inc_number = max_number + 1; 	printf("请输入你想增加的学号为%d学生的姓名\n", inc_number); 	scanf_s("%s", &name_array[inc_number - 1], 5); 	fflush(stdin); 	printf("请输入你想增加的学号为%d学生的性别\n", inc_number); 	scanf_s("%c", &sex_array[inc_number - 1], 1); 	fflush(stdin); 	printf("请输入你想增加的学号为%d学生的年龄\n", inc_number); 	scanf_s("%d", &age_array[inc_number - 1]); 	system("pause");  	return 0; }

user: user-0
content: 进行的操作：（1.增加信息 2.修改信息 3.删除信息 4.查询信息 0.退出） 1 请输入你想增加的学号为1学生的姓名 fdffd 请输入你想增加的学号为1学生的性别 请输入你想增加的学号为1学生的年龄 请输入你想输入的学号为1学生的出勤率 增加信息成功！ 请输入你想增加的学号为2学生的姓名

user: user-0
content: 我赶快去试试

user: user-2
content: printf("请输入你想增加的学号为%d学生的姓名\n", inc_number); char ch; int i = 0; while (ch = getchar()!='\n') {     i++;     scanf("%c", &name_array[inc_number - 1][i]); }  //fflush(stdin); printf("请输入你想增加的学号为%d学生的性别\n", inc_number); scanf("%c", &sex_array[inc_number - 1]); //fflush(stdin); ch = getchar(); printf("请输入你想增加的学号为%d学生的年龄\n", inc_number); scanf("%d", &age_array[inc_number - 1]); 看看我改动了些什么，应该是你回车没有被下一个scanf读取掉了，然后你问的.....应该是第二个总是被跳过吧

user: user-0
content: 那该怎么办啊 最后一个scanf一直都是跳过的

user: user-3
content: fflush(stdin) 不是所有编译器都支持哦！这本来就不是标准里面的东西
user-0 提问: 这两个值相等吗？

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

user: user-2
content: 值是相等的，但是意义是不等的。给你打个注释自己看

user: user-3
content: 抛开编译错误的可能性，是相等的  int main(int argc, const char * argv[]) {     // insert code here...     int a;     int *p;          p = &a;     *p = 0x500;          printf("%p,%d\n%p,%d\n", p,*p, &a, a);     printf("1:%d,%d\n", p, *(&p));     printf("2:%d,%d\n", p, &(*p));         /*     a = (int )(*(&p));     if(a == (int)p)         printf("equal!\n");     else         printf("not equal!\n");          a = (int )(&(*p));     if(a == (int)p)         printf("equal!\n");     else         printf("not equal!\n");     */     return 0; } // 0x7fff5fbff6dc,1280 // 0x7fff5fbff6dc,1280 // 1606416092,1606416092 // 1606416092,1606416092

user: user-4
content: 都赋值了，当然相等了。 但是那个赋值是有问题的，为什么要把指针变成整数呢？

user: user-5
content: 相等撒 (int )(*(&p)) 和(int )(&(*p))，形式再怎么变来边去，其本质不都是p吗！！
user-0 提问: 怎么初始化结构体指针里面的结构体指针？

回复:
user: user-1
content: 在楼主分配一个字节大小为sizeof(struct A)之后 *paa只是一个指向分配后的内存块的结构体指针 要是想楼主标题所说 初始化结构体指针里面的结构体指针 似乎需要用到二级指针的把

user: user-2
content: 自己写个initial函数？

user: user-3
content: c++的话，可以通过创建一个结构体的构造函数在主函数中调用然后就能初始化了。

user: user-4
content: 直接memset(paa, 0, sizeof(struct A))

user: user-5
content: 指针初始话一般初始化为NULL
user-0 提问: 这什么这样定义一个数组报错

回复:
user: user-1
content: char c[] 定义一个数组c，数组的每个元素是char类型，就是一个字符 char *s[] 定义一个数组s，数组的每个元素是char *类型，可以指向一个C语言字符串（的首地址，结尾为'\0'字符）

user: user-2
content: 回去看汇编，汇编有对这方面的解释

user: user-3
content: 引用 11 楼 liuxingrui4p 的回复:[quote=引用 10 楼 ipqtjmqj 的回复:] [quote=引用 9 楼 qq_29648555 的回复:] 没想到有这么多人回答，谢谢大家。 看了大家的回答，我产生了这样的想法不知道对不对。  1是指针，其实这个指针不是指向的一唯数组，而是多唯的。 “sun”是装在一个数组里，“Mon”是装在另一个数组里，，依次等等。。 只是这些数组的地址有一定的关系。  2是一唯数组的赋值，一个一唯数组只能赋一个字符串，我这样就把多个 字符串赋给一个一唯数组，这样是赋不了的。  错误的重点：是我以为1指针指的是一唯数组，其实不是的。 你错了，1是一维数组，数组中元素类型是指针[/quote]  请问1的写法是不是有限制，个数太多会不会把栈撑爆[/quote] 现在的栈都很大的，爆不了，另外字符串常量存在静态区，1的写法只存储字符串的地址

user: user-4
content: 引用 10 楼 ipqtjmqj 的回复:[quote=引用 9 楼 qq_29648555 的回复:] 没想到有这么多人回答，谢谢大家。 看了大家的回答，我产生了这样的想法不知道对不对。  1是指针，其实这个指针不是指向的一唯数组，而是多唯的。 “sun”是装在一个数组里，“Mon”是装在另一个数组里，，依次等等。。 只是这些数组的地址有一定的关系。  2是一唯数组的赋值，一个一唯数组只能赋一个字符串，我这样就把多个 字符串赋给一个一唯数组，这样是赋不了的。  错误的重点：是我以为1指针指的是一唯数组，其实不是的。 你错了，1是一维数组，数组中元素类型是指针[/quote]  请问1的写法是不是有限制，个数太多会不会把栈撑爆

user: user-3
content: 引用 9 楼 qq_29648555 的回复:没想到有这么多人回答，谢谢大家。 看了大家的回答，我产生了这样的想法不知道对不对。  1是指针，其实这个指针不是指向的一唯数组，而是多唯的。 “sun”是装在一个数组里，“Mon”是装在另一个数组里，，依次等等。。 只是这些数组的地址有一定的关系。  2是一唯数组的赋值，一个一唯数组只能赋一个字符串，我这样就把多个 字符串赋给一个一唯数组，这样是赋不了的。  错误的重点：是我以为1指针指的是一唯数组，其实不是的。 你错了，1是一维数组，数组中元素类型是指针

user: user-5
content: 引用 7 楼 xsklld 的回复:理论上用字符串字面值初始化char*也是不规范的，见样例。 不过C语言里似乎是允许的。

user: user-5
content: 理论上用字符串字面值初始化char*也是不规范的，见样例。

user: user-0
content: 没想到有这么多人回答，谢谢大家。 看了大家的回答，我产生了这样的想法不知道对不对。  1是指针，其实这个指针不是指向的一唯数组，而是多唯的。 “sun”是装在一个数组里，“Mon”是装在另一个数组里，，依次等等。。 只是这些数组的地址有一定的关系。  2是一唯数组的赋值，一个一唯数组只能赋一个字符串，我这样就把多个 字符串赋给一个一唯数组，这样是赋不了的。  错误的重点：是我以为1指针指的是一唯数组，其实不是的。

user: user-6
content: 第二种写法只能存一个字符串，不能存多个

user: user-7
content: 字符指针组和字符数组的区别。第一个是指针数组，每个指针都可以存放一个字符串的地址。而第二个是字符数组，里面存放一个字符串。

user: user-8
content: 你是在定义数组，首先要明白数组里放的什么，也就是数组类型，第一个里放的是字符指针，“abcd”这种字符串常亮在这种情况下表示指向第一个字符的指针，所以可以正常复制，第二个里放的是字符，所以要用字符初始化，而上面也说了“abcd”在这种上下文环境中代表的是一个指针，而不是字符，所以就不对了

user: user-9
content: 用二维数组 char    www[][4] = {"Sun", "Mon"}; 就可以了

user: user-10
content: 1定义的是字符指针数组，将字符串赋值给字符指针是可以的 2定义的是字符数组，将字符串赋值存放字符是不可以的。

user: user-3
content: 因为char只有一个字节，存不了地址，char *是4个字节，可以存地址
user-0 提问: 关于c/c++模板的问题，涉及代码自动生成

回复:
user: user-1
content: 始终没明白题目描述跟模板有什么关系。模板本身就是C++代码，像我说的“样板”，编译的时候根据不同模板实参，生成不同的函数重载或类。但是模板不是一个工具，他是一种语法。生成代码，再经过编译，其实都是在编译的时候完成的，你可以理解为编译模板代码为常规C++代码，再编译C++代码，虽然都是在你单击编译之后自动完成的。

user: user-1
content: 没弄明白你的实际应用场景是什么。  1.为什么需要【工具】->【生成代码】->【再编译】->【程序完成1加到100】这个过程？直接写一个完成1加到100的程序不就好了  2.如果说你的目的不在于【完成1加到100】，这个功能只是个例子，你真正想要的是一个【自动生成代码】的工具，那你要这个工具它的能力到什么水平？是你给出一份用伪代码或者怎么样描述的样板，就能按配置生成出代码（像linux的configure生成makefile一样）？还是你说一个功能，这工具做语音识别，做自然语言理解，然后自动为你编写你需要的这个功能的代码（想想就好）？

user: user-2
content: #include <stdio.h> // 功能描述：输入求和的范围 a 和 b，生成c++代码，该代码计算a 累计到 b 的和 int main(int argc, char *argv[]) {     int a, b;     scanf("%d %d", &a, &b);          char file[] = "my.cpp";     FILE *fp = fopen(file, "w");     if (!fp)        printf("Cannot create or open the file: %s", file);          // include header      fprintf(fp, "#include <stdio.h>\n");     // function: int Sum(int nBegin, int nEnd)     fprintf(fp, "int Sum(int nBegin, int nEnd)\n");     fprintf(fp, "{\n");     fprintf(fp, "    if (nBegin >= nEnd) return nEnd;\n");     fprintf(fp, "    return nBegin + Sum(nBegin + 1, nEnd);\n");     fprintf(fp, "}\n\n");     // main      fprintf(fp, "void main()\n");     fprintf(fp, "{\n");     fprintf(fp, "    int a = %d, b = %d;\n", a, b);     fprintf(fp, "    printf(\"%%d\\n\", Sum(a, b));\n");     fprintf(fp, "}\n");          fclose(fp);          return 0; }

user: user-0
content: 引用 3 楼 chikey 的回复:[quote=引用 1 楼 user-4 的回复:] 运行后才能生成代码？那跟模板没关系了，模板是编译期的。 //求1加到100，并显示结果  #include <iostream> template <int N> struct SUM  {     static const int value = SUM<N - 1>::value + N; };  template <> struct SUM<1> {     static const int value = 1; };   int main() {     std::cout << SUM<100>::value << std::endl; }  跟您的思路类似，可是我提交之后说不符合要求，说没有生成代码，请问怎样可以使代码自动生成出来呢？ [/quote] 啊，不好意思，刚才回复错地方了，那请问有其他实现的方法吗？

user: user-0
content: 引用 2 楼 pengzhixi 的回复:template<int N> class Test { public: 	static const int m = N + Test<N - 1>::m; };   template<> class Test<1> { public: 	static const int m = 1; }; 你想这样？ //求1加到100，并显示结果  #include <iostream> template <int N> struct SUM  {     static const int value = SUM<N - 1>::value + N; };  template <> struct SUM<1> {     static const int value = 1; };   int main() {     std::cout << SUM<100>::value << std::endl; }  跟您的思路类似，可是我提交之后说不符合要求，说没有生成代码，请问怎样可以使代码自动生成出来呢？

user: user-0
content: 引用 1 楼 user-4 的回复:运行后才能生成代码？那跟模板没关系了，模板是编译期的。 //求1加到100，并显示结果  #include <iostream> template <int N> struct SUM  {     static const int value = SUM<N - 1>::value + N; };  template <> struct SUM<1> {     static const int value = 1; };   int main() {     std::cout << SUM<100>::value << std::endl; }  跟您的思路类似，可是我提交之后说不符合要求，说没有生成代码，请问怎样可以使代码自动生成出来呢？

user: user-3
content: template<int N> class Test { public: 	static const int m = N + Test<N - 1>::m; };   template<> class Test<1> { public: 	static const int m = 1; }; 你想这样？

user: user-4
content: 运行后才能生成代码？那跟模板没关系了，模板是编译期的。
user-0 提问: 帮我看下，为什么死循环，主要是fun函数

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

user: user-2
content: 指针S没改变

user: user-3
content: s的位置没变话，直到]遇到字符"*"改一下：   while (*s) {     if (*s == '*')         *s = *s++;     else         s++; }

user: user-4
content: 死在赋值哪里了~建议单步调试看看~自己亲眼看看死在哪里呢》》》

user: user-5
content: 第一个循环 如果不是*的话 ，永远是原地循环啊

user: user-6
content: *s == '*'才++，其他情况都不会前进啊。
user-0 提问: vs2010编译C代码的奇怪问题 error C2039： 不是成员

回复:
user: user-1
content: 名字冲突了，你改个名字试试

user: user-1
content: CreateMutex是个宏，没定义UNICODE宏时，会被替换成CreateMutexA

user: user-1
content: 引用 5 楼 zhaoxuefeng2180 的回复:[quote=引用 4 楼 user-1 的回复:] [quote=引用 3 楼 zhaoxuefeng2180 的回复:] [quote=引用 2 楼 user-1 的回复:] 名字冲突了，你改个名字试试  换名字不太方便，我定义了UNICODE试，报错变成 error C2039: “CreateMutexW”: 不是“INITIALIZE_ARGS”的成员  有办法不用改成员名来通过编译么？[/quote] 把宏删掉#undef CreateMutex[/quote]  我在头文件定义结构体之前undef了还是报错。 或者是源文件include的其它头文件又把windows定义的宏给弄进来了 我干脆改源文件吧，顺便把成员名字改了 [/quote] 不要改头文件，写在源文件里，所有的include最下面

user: user-0
content: 引用 4 楼 user-1 的回复:[quote=引用 3 楼 zhaoxuefeng2180 的回复:] [quote=引用 2 楼 user-1 的回复:] 名字冲突了，你改个名字试试  换名字不太方便，我定义了UNICODE试，报错变成 error C2039: “CreateMutexW”: 不是“INITIALIZE_ARGS”的成员  有办法不用改成员名来通过编译么？[/quote] 把宏删掉#undef CreateMutex[/quote]  我在头文件定义结构体之前undef了还是报错。 或者是源文件include的其它头文件又把windows定义的宏给弄进来了 我干脆改源文件吧，顺便把成员名字改了

user: user-1
content: 引用 3 楼 zhaoxuefeng2180 的回复:[quote=引用 2 楼 user-1 的回复:] 名字冲突了，你改个名字试试  换名字不太方便，我定义了UNICODE试，报错变成 error C2039: “CreateMutexW”: 不是“INITIALIZE_ARGS”的成员  有办法不用改成员名来通过编译么？[/quote] 把宏删掉#undef CreateMutex

user: user-0
content: 引用 2 楼 user-1 的回复:名字冲突了，你改个名字试试  换名字不太方便，我定义了UNICODE试，报错变成 error C2039: “CreateMutexW”: 不是“INITIALIZE_ARGS”的成员  有办法不用改成员名来通过编译么？
user-0 提问: y=1.5 f

回复:
user: user-1
content: 将1.5赋值给y而已，若y不是float或double型，将会丢失精度

user: user-2
content: 说明1.5为float型，默认为double

user: user-3
content: 1.5作为float型常量 因为不加后缀的小数形式常量，C语言都把它作为double型

user: user-4
content: 缺省是double，加f表示float

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

user: user-5
content: C++ Floating-Point Constants Floating-point constants specify values that must have a fractional part. These values contain decimal points (.) and can contain exponents.  Syntax  floating-constant :  fractional-constant exponent-partopt floating-suffixopt digit-sequence exponent-part floating-suffixopt  fractional-constant :  digit-sequenceopt . digit-sequence digit-sequence .  exponent-part :  e signopt digit-sequence E signopt digit-sequence  sign : one of  + –  digit-sequence :  digit digit-sequence digit  floating-suffix :one of  f l F L  Floating-point constants have a “mantissa,” which specifies the value of the number, an “exponent,” which specifies the magnitude of the number, and an optional suffix that specifies the constant’s type. The mantissa is specified as a sequence of digits followed by a period, followed by an optional sequence of digits representing the fractional part of the number. For example:  18.46 38.  The exponent, if present, specifies the magnitude of the number as a power of 10, as shown in the following example:  18.46e0      // 18.46 18.46e1      // 184.6  If an exponent is present, the trailing decimal point is unnecessary in whole numbers such as 18E0.  Floating-point constants default to type double. By using the suffixes f or l (or F or L — the suffix is not case sensitive), the constant can be specified as float or long double, respectively.  Although long double and double have the same representation, they are not the same type. For example, you can have overloaded functions like  void func( double );  and   void func( long double );
user-0 提问: 把C代码编为DLL使用VB调用

回复:
user: user-1
content: 那个VB代码用的多项式不一样，而且是查表法。  用楼主的代码创建DLL也很简单，保存为crc16.cpp：  #include <windows.h>  /*CRC-16效验函数 多项式为X^16+X^15+X^2+1  CRC_RESULT为全局变量，是计算结果结果，可能有上次计算的结果在 */ extern "C" _declspec(dllexport) unsigned int CRC_16(unsigned char *str, int lenth) {   unsigned char k;   unsigned long temp=0;   while(lenth--)   {     for(k = 0x80; k != 0; k = k>>1)     {       temp = temp * 2;       if((temp & 0x10000) != 0)       temp = temp ^ 0x18005;       if((*str & k) != 0)       temp = temp ^ (0x10000 ^ 0x18005);     }     str++;   }   return temp; }  BOOL APIENTRY DllMain(HANDLE hModule, DWORD dwReason, void* lpReserved) {   HANDLE g_hModule;    switch(dwReason)   {     case DLL_PROCESS_ATTACH:       break;      case DLL_PROCESS_DETACH:       break;   }    return true; }   编译，假设用VC++: cl /O2 /LD crc16.cpp

user: user-2
content: CRC16如果用 RAMDISK，估计会卡。  GOOGLE可以查到这个 http://www.tek-tips.com/viewthread.cfm?qid=1587721  修改一下应该可以。

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

user: user-4
content: 那为什么不用vb写，然后生成dll呢
user-0 提问: 蓝桥杯报纸页数问题

回复:
user: user-1
content: 引用 1 楼 adlay 的回复:假设报纸的总页数为 x, 则: 第一张的页码为:  1, 2, x-1, x 第二张的页码为:  3, 4, x-3, x-2 第三张的页码为:   5, 6, x-5, x-4 ... 第 N 张的页码为:  2N - 1, 2N, x - (2N -1), x - (2N - 2)  可见, 每张报纸的页码加起来 2N - 1 + 2N + x - (2N - 1) + x - (2N - 2)  = 2x + 2  于是就有 2x + 2 = 1125 + 1126 + 1727 + 1728 求解一下就得到 x = 2852 所以, 这份报纸一共有 2852 页   厉害了

user: user-2
content: 现在流行互相伤害，不流行互相吹捧。

user: user-3
content: 引用 2 楼 zhao4zhong1 的回复:[quote=引用 1 楼 adlay 的回复:] 假设报纸的总页数为 x, 则: 第一张的页码为:  1, 2, x-1, x 第二张的页码为:  3, 4, x-3, x-2 第三张的页码为:   5, 6, x-5, x-4 ... 第 N 张的页码为:  2N - 1, 2N, x - (2N -1), x - (2N - 2)  可见, 每张报纸的页码加起来 2N - 1 + 2N + x - (2N - 1) + x - (2N - 2)  = 2x + 2  于是就有 2x + 2 = 1125 + 1126 + 1727 + 1728 求解一下就得到 x = 2852 所以, 这份报纸一共有 2852 页 adlay当年在班上是学霸。我猜的没错吧。[/quote] 赵四老师当年肯定也是学霸吧。。

user: user-4
content: 引用 2 楼 zhao4zhong1 的回复:[quote=引用 1 楼 adlay 的回复:] 假设报纸的总页数为 x, 则: 第一张的页码为:  1, 2, x-1, x 第二张的页码为:  3, 4, x-3, x-2 第三张的页码为:   5, 6, x-5, x-4 ... 第 N 张的页码为:  2N - 1, 2N, x - (2N -1), x - (2N - 2)  可见, 每张报纸的页码加起来 2N - 1 + 2N + x - (2N - 1) + x - (2N - 2)  = 2x + 2  于是就有 2x + 2 = 1125 + 1126 + 1727 + 1728 求解一下就得到 x = 2852 所以, 这份报纸一共有 2852 页 adlay当年在班上是学霸。我猜的没错吧。[/quote] 高中还可以算是吧, 大学就成渣了

user: user-2
content: 引用 1 楼 adlay 的回复:假设报纸的总页数为 x, 则: 第一张的页码为:  1, 2, x-1, x 第二张的页码为:  3, 4, x-3, x-2 第三张的页码为:   5, 6, x-5, x-4 ... 第 N 张的页码为:  2N - 1, 2N, x - (2N -1), x - (2N - 2)  可见, 每张报纸的页码加起来 2N - 1 + 2N + x - (2N - 1) + x - (2N - 2)  = 2x + 2  于是就有 2x + 2 = 1125 + 1126 + 1727 + 1728 求解一下就得到 x = 2852 所以, 这份报纸一共有 2852 页 adlay当年在班上是学霸。我猜的没错吧。

user: user-4
content: 假设报纸的总页数为 x, 则: 第一张的页码为:  1, 2, x-1, x 第二张的页码为:  3, 4, x-3, x-2 第三张的页码为:   5, 6, x-5, x-4 ... 第 N 张的页码为:  2N - 1, 2N, x - (2N -1), x - (2N - 2)  可见, 每张报纸的页码加起来 2N - 1 + 2N + x - (2N - 1) + x - (2N - 2)  = 2x + 2  于是就有 2x + 2 = 1125 + 1126 + 1727 + 1728 求解一下就得到 x = 2852 所以, 这份报纸一共有 2852 页
user-0 提问: malloc函数，求解

回复:
user: user-1
content: http://blog.csdn.net/xw13106209/article/details/4962479

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

user: user-2
content: linux下的malloc是开源的。

user: user-3
content: 说了你别不信，网上有个叫搜索引擎的东西： https://www.baidu.com/s?wd=malloc

user: user-4
content: malloc全称memory allocate即内存分配 参数有一个，类型是size_t,即需要分配的内存大小 返回值为void *,即分配来的内存首地址。
user-0 提问: 一个十分简单的c语言程序。。。但是我不知道哪儿错了。已经生成了可执行文件。。

回复:
user: user-1
content: 如果你看过c plus你就明白了，里面讲得很详细

user: user-1
content: 因为sum没有初始化，所以sum的值是随机的，很多人都认为声明一个变量后变量值就为0，其实不是

user: user-2
content: 重新编译链接。

user: user-0
content: 嗯嗯恩，sum没有初始化，但是用gdb调试的时候为什么会跳到第28行去了呢？搞出了一堆完全不知所云的东西

user: user-3
content: int main() {    .........     return 0;  // 或者你就干脆 void main() }

user: user-3
content: sum不赋个初值，鬼知道会取个什么值。

user: user-4
content: add()里的sum没有初始化，sum=0;
user-0 提问: 初学小白有个问题搞不懂请教大神

回复:
user: user-1
content: while ((cho = get_choice())!='q') 每次循环都执行一次  如果你写成 int cho = get_choice();  while ( cho !='q') // 仅执行一次get_choice()，如果cho不为q，那么会造成死循环

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

user: user-3
content: 单步调试就很清楚程序怎么走的了

user: user-4
content: 不同之处在于，一个的值是循环一次刷新一次；另一个是仅刷新一次，也就是说while条件表达式为一个固定值。

user: user-5
content: 取值表达式在while里边时，它是循环取值的，每次都会判断； 取值表达式在while之前，它只会取一次，是个定值，所以还会死循环；
user-0 提问: 如何把结构体变量输出到磁盘

回复:
user: user-0
content: 谢谢，在你们的帮助下这个问题解决了。

user: user-1
content: 你这样子输出是一块内存啊，明文当然是很难读懂的 fprintf(fp, "%s %d %d %s\n", na, num, age, add); 这样子试试

user: user-2
content: 结构体输出到磁盘，结构体每个成员挨个输出就好了
user-0 提问: 小白疑问之对齐

回复:
user: user-1
content: 引用 3 楼 who18 的回复:那个小数点也算的吗 算

user: user-0
content: 那个小数点也算的吗

user: user-2
content: 100.0 一共５个字母了，超过了4

user: user-0
content: 说错了是像第一张图一样对齐不了 第一张是%4.1lf 第二张是%5.1lf 按理说我最大的100.0也只有4位啊为什么%4.1lf对齐不了 这个左右对齐是怎么计算宽度的
user-0 提问: 关于char的二维数组

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  int main() {    char **pt;    int num,i;    char k[40];      printf("How many words do you wish to enter?");    scanf("%d",&num);    printf("\nEnter %d words now :",num);    pt = (char **)malloc(sizeof(char*)*num);    for( i =0;i<num;i++)    {        scanf("%s",k); 		pt[i] = (char *)malloc(strlen(k)+1);        strcpy(pt[i],k);    }    printf("Here are your words:\n");    for(i=0;i<num;i++)    { 		   printf("%s\n",pt[i]); 		   free(pt[i]);    } 	free(pt);     return 0; }

user: user-2
content: pt[i]其实指向的都是同一个地址（k数组）

user: user-3
content: pt[i]存放的地址值总是k数组的首地址，你的输入都是放到了数组k中，即后面的输入是覆盖到了k之前存放的数据。而所有pt指针都指向k数组，所以你输出的结果都是一样的。

user: user-4
content: for(int i =0;i<num;i++)    {        scanf("%s",k);        pt[i]=k; //你让pt[i]全部指向k，当然是一样的    }  下面这样子，记得用完的时候free     pt = (char **)malloc(sizeof(char*)*num);    for(int i =0;i<num;i++)    {        pt[i] = (char *)malloc(sizeof(char)*40);        scanf("%s",pt[i] );    }
user-0 提问: strlen()函数使用的一个小疑问

回复:
user: user-1
content: 参考：《C和指针》  strlen()的方法签名中的返回值类型为size_t，size_t实际上是一个无符号整型。因此，下面的代码就会有问题：  if( strlen(x) - strlen(y) >= 0 ) ... ; if( strlen(x) - 10 >= 0) ... ; 这样，if语句永远都会执行，因为无符号数不存在负值。实际上，C中很多string相关函数返回值都是无符号数，在使用时要小心谨慎。

user: user-2
content: http://aoyouzi.iteye.com/blog/1914526 这里是一些算术操作中的隐式转换

user: user-2
content: strlen返回size_t，一般来说就是unsigned int。unsinged int和int比较，int提升为unsigned int，-1就成了unsigned int能表示的最大值。  这个和len = strlen(str);放哪没什么关系，len压根就没被用到过

user: user-3
content: 隐式转换，strlen返回的是size_t即unsigned int, 右边的lenest是int型的 unsigned int与int相比较时，int会转成unsigned int，所以-1变成了很大的数  解决办法，将左边显式转成int,即 if ((int)strlen(str) > lenest){

user: user-4
content: 请开启所有警告。编译器针对有符号无符号混合运算、变量类型范围导致的条件永为真或永为假判断都会给出警告。
user-0 提问: 关于字符串队列的奇怪问题

回复:
user: user-0
content: 我调用如下函数，又出现同样问题  LinkQueue testqueue; 在调用下面函数前做了队列初始化。  void printQuere(uint8_t *str) {   insertQueue(&testqueue, str);   traverQueue(testqueue); }

user: user-0
content: 谢谢赵老师，另外请教下，如果需要通过串口一条条接收字符串，然后每接收一条就入队，并且遍历一次，又该如何处理呢？也就是事先不知道有多少次入队。  谢谢

user: user-1
content: #include <stdio.h> #include <stdlib.h> typedef unsigned char uint8_t; typedef unsigned short uint16_t; #define QueueError 255  #define ElemType        uint8_t*  typedef struct QNode {   ElemType data;   struct QNode *next; }QNode, *Queue;  typedef struct LinkQueue {   Queue front;   Queue rear; }LinkQueue;  //队列初始化 uint8_t initQueue(LinkQueue *queue) {   queue->front = queue->rear = (Queue)malloc(sizeof(QNode));   if (NULL == queue->front)   {     return QueueError;   }   queue->front->next = NULL;   return 0; }  //入队 uint8_t insertQueue(LinkQueue *queue, ElemType data) {   Queue q = (Queue)malloc(sizeof(QNode));   if (NULL == q)   {     return QueueError;   }   //插入数据   q->data=data;   q->next=NULL;   //rear 总是指向队尾元素   queue->rear->next=q;   queue->rear=q;   return 0; }  //遍历 void traverQueue(LinkQueue queue)  {   uint16_t i = 1;   Queue q = queue.front->next;      while (q != NULL)   {     printf("队列第%d个元素是：%s\r\n", i, q->data);     q = q->next;     i++;   } }  void test1(void) {   uint8_t *str0=(uint8_t *)"node0";   uint8_t *str1=(uint8_t *)"node1";   uint8_t *str2=(uint8_t *)"node2";   uint8_t *str3=(uint8_t *)"node3";   uint8_t *str4=(uint8_t *)"node4";  //ElemType sdat;   LinkQueue testqueue;    printf("初始化队列 queue\r\n");   initQueue(&testqueue);   traverQueue(testqueue);    insertQueue(&testqueue, str0);   traverQueue(testqueue);   insertQueue(&testqueue, str1);   traverQueue(testqueue);   insertQueue(&testqueue, str2);   traverQueue(testqueue);   insertQueue(&testqueue, str3);   traverQueue(testqueue);   insertQueue(&testqueue, str4); }  void test2(void) { //ElemType sdat;   LinkQueue testqueue;   uint8_t strtemp[4][6];    printf("初始化队列 queue\r\n");   initQueue(&testqueue);   traverQueue(testqueue);    for(uint8_t i=0; i<4; i++)   {     sprintf((char *)(strtemp[i]),"node%d",i);     insertQueue(&testqueue, strtemp[i]);     traverQueue(testqueue);   } } int main() {     test1();     test2();     return 0; } //初始化队列 queue //队列第1个元素是：node0 //队列第1个元素是：node0 //队列第2个元素是：node1 //队列第1个元素是：node0 //队列第2个元素是：node1 //队列第3个元素是：node2 //队列第1个元素是：node0 //队列第2个元素是：node1 //队列第3个元素是：node2 //队列第4个元素是：node3 //初始化队列 queue //队列第1个元素是：node0 //队列第1个元素是：node0 //队列第2个元素是：node1 //队列第1个元素是：node0 //队列第2个元素是：node1 //队列第3个元素是：node2 //队列第1个元素是：node0 //队列第2个元素是：node1 //队列第3个元素是：node2 //队列第4个元素是：node3 //