Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求解C语言制表符问题

回复:
user: user-0
content: 下面的数据两个\t是为了与上面的汉子对齐。上面也给两个的话，上面的字会分的更开

user: user-1
content: 既然表数据各列%d之间有两个\t 为什么表头各列之间不是两个\t而是一个\t ?

user: user-2
content: 引用 7 楼 qq_44857348 的回复:[quote=引用 4 楼 轻箬笠的回复:]尽量用%10d，%12.2lf之类的。制表符的宽度不好确定，不同的环境结果可能不一样。而空格占用的位置大小基本固定 题目要求用制表符，，，，[/quote] 如果必须用制表符，那把printf改成wprintf试试。我觉得问题应该出在中文上面。

user: user-3
content: 没看懂什么问题

user: user-0
content: 引用 4 楼 轻箬笠的回复:尽量用%10d，%12.2lf之类的。制表符的宽度不好确定，不同的环境结果可能不一样。而空格占用的位置大小基本固定 题目要求用制表符，，，，

user: user-4
content: 应该是你手机环境的问题，你可以试试%10d这样来调整宽度

user: user-5
content: printf函数采用标记（-   +  #等）和修饰符（数字  .数字  l  ll  h  hh 等等）可以控制输出的格式

user: user-2
content: 尽量用%10d，%12.2lf之类的。制表符的宽度不好确定，不同的环境结果可能不一样。而空格占用的位置大小基本固定

user: user-6
content: 引用 2 楼 qq_44857348 的回复:“平方”，“立方”没有和“整数”一样，靠在一起。你可以用 %10d 试试。制表符用的太少了。

user: user-0
content: 引用 1 楼 weixin_43925756的回复:没看懂什么问题 “平方”，“立方”没有和“整数”一样，靠在一起。
user-0 提问: 麻将拿好牌算法

回复:
user: user-1
content: 两个色子可能的拿牌顺序有6+5+4+3+2+1=21种 34和25加起来都是7 但拿牌的位置是不一样的

user: user-2
content: 1.随机洗牌。如果洗牌不是随机的，你这个作弊暴露的可能性太大了；  2.真正打色子之前，做一个模拟运算，测算出每个数字庄家对应的牌，通过估值函数评分，最后得到一个庄家得分最高的一个色子数字。将此数字作为最终打色子的数字。  3.做一个外部遥控器，分东南西北，按哪个，则按哪个方位评分最高来打色子。

user: user-3
content: 作弊机的关键是胡牌时候出假牌、诈胡什么的。开牌，什么价有什么牌，价小才会出天胡；这种牌，胡到头也不值钱，没必要理它。开牌又叫洗牌，打麻将关键就是开牌能否开出价来。至于麻将机作弊给某人发好牌，其实是逗不懂行的玩儿的，我同学打牌经常是一对三照赢，把对手逼到桌下传牌，然后就开始打架了。

user: user-0
content: 谢谢大家，结贴了！

user: user-4
content: 自动麻将机作弊还是有很高技术含量的，楼主的应该还是麻将软件

user: user-0
content: 谢谢众大神，我的想法是这样的：通过不同的色子组合从不同的位置拿牌（色子的组合方式可以算出来应该是21种），当我拿到一手牌，我用计分的方式来定义是否好牌，例如：两张牌相邻记1分，有一个对子计2分，一句话记3分，三个相同牌记5分，四个相同牌记8分，3连对记10分等等，比如我有一手牌包含8个万字，3个筒字，1个条子，剩余2个风，请问下如何分析这些牌并记分，例如如何分析8个万字中是否有对，多少对，是否有一句话存在，有几句话，有没有连对等等，麻烦各位给个思路，非常感谢！

user: user-4
content: 让某人拿好牌很简单的，好比让一部分人先富起来，只是你需要转换思路，胆子再大一点，步子再快一点~~~ 人生中能不能拿到好牌主要取决于你生活在什么圈子里，游戏里也一样，一个好牌队列，一个普通牌队列，你想照顾的某人拿到的牌来自于好牌队列，其他人的则来自于普通牌队列，所以你想让他拿到什么牌就有什么牌，起手一副大四喜不也很简单么

user: user-5
content: 首先一个色子就6种点数 2个色子就12种点数  只要将这12种可能的牌列出来  按照你认为是好牌的算法过一遍 取最大值就可以了 关键点  什么样的算是好牌 这个需要你自己去定义 是对子多 还是其他的什么

user: user-0
content: 引用 2 楼 user-10 的回复:没那么简单，杠或者碰都会打乱排序，比较简单的一个方法的就是上手的牌计算分数，分数高的发给庄家 比如同一色大于多少张是多少分，每有一对是多少分等等 请问下这位兄弟，按照你说的方法确实不错，就是根据一些牌型来算分，取最高的分，我想请教下，如何判断手里牌是怎样的，假设一手牌里我有8张万字（已按升序排好），我如何知道有几句话、几对、几个3张的、几个4张的，这似乎是个很复杂的事情，之前没有遇到过类似算法，麻烦可否提供个思路，谢谢！

user: user-6
content: 起手抓牌胡就完事了

user: user-7
content: 换个角度吧，可以把好牌当成数据，事先做好数据就是了。以前玩过一个dos下的麻将就是这样的

user: user-8
content: 引用 9 楼 名人堂再聚首 的回复:谢谢众大神，我的想法是这样的：通过不同的色子组合从不同的位置拿牌（色子的组合方式可以算出来应该是21种），当我拿到一手牌，我用计分的方式来定义是否好牌，例如：两张牌相邻记1分，有一个对子计2分，一句话记3分，三个相同牌记5分，四个相同牌记8分，3连对记10分等等，比如我有一手牌包含8个万字，3个筒字，1个条子，剩余2个风，请问下如何分析这些牌并记分，例如如何分析8个万字中是否有对，多少对，是否有一句话存在，有几句话，有没有连对等等，麻烦各位给个思路，非常感谢！ 楼主可以考虑用multimap，并对其排序。multimap使用和排序 遍历所有的key就可以很简单的得到对子，和三对，四对。 不过三连之类的，还是需要一个个前后比较。 另外，我觉得楼主做的时候不要拘泥于万字，筒子和条子。可以把万字当成1-9，筒子当成11-19，条子当成21-29，字当成31-37。这样排序比较会比较方便点。 如果有花，桌得之类的要另外处理。

user: user-9
content: 引用 3 楼 名人堂再聚首 的回复:楼上几位大神都说得很有道理，目前只管拿到好牌，后面的碰或杠现在都不用管，因为有的牌人家不碰也有可能，目前主要是根据牌的分布情况，尽量选最优的牌，后面怎么打就不管了，其实有时拿到好牌也不一定就能和牌，当然赢的概率会高些，关键还是要手气好。 能抓到好牌己经处理不败之地了，把把天和，还有人玩吗，按几种打点规则，能抓牌的起点位置没有多少种，算一次，取个最优的组合和必胜没什么区别了

user: user-0
content: 楼上几位大神都说得很有道理，目前只管拿到好牌，后面的碰或杠现在都不用管，因为有的牌人家不碰也有可能，目前主要是根据牌的分布情况，尽量选最优的牌，后面怎么打就不管了，其实有时拿到好牌也不一定就能和牌，当然赢的概率会高些，关键还是要手气好。

user: user-10
content: 没那么简单，杠或者碰都会打乱排序，比较简单的一个方法的就是上手的牌计算分数，分数高的发给庄家 比如同一色大于多少张是多少分，每有一对是多少分等等

user: user-9
content: 引用 楼主 名人堂再聚首 的回复:各位大神，有个问题要向大家请教下： 是这样的，我现在要负责一个单片机测试程序，主要用C语言，设计一个麻将的玩法，就是怎么样让庄家能拿到好牌，是136张的那种，传统的“万条点”加上“东南西北中发白”总共136张，假设是4个人玩，当牌洗好后，每方34张牌分两层摆放，并且我也知道每张牌的分布情况，我现在要设计一个算法：通过分析牌的分布情况，控制打色子的点数来拿到好牌，现在就说一般的胡牌，不说其他什么清一色、对对碰、七对等等，请教下大概的思路，万分感谢！ 这种东西做来害人啊，洗牌是随机的话，那就把所有打出的点数组合算一次，那个点拿到的牌最好就打多少点了

user: user-8
content: 我觉得给麻将算分就行。比如系统规定，一对红中是10分，一对9筒是5分，三四五连在一起的算6分。算出四家牌的总分，把总分高的给自己就好了。当然这样不一定每局都赢。至少每局都是最好的牌。
user-0 提问: error: expected ')' before numeric constant

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

user: user-2
content: 主要原因是函数调用和函数声明的区别。这应该是课本上的基本内容呢。  main函数里的函数调用都去掉函数返回值类型

user: user-3
content: 引用 5 楼 阿大古 古古古的回复:[quote=引用 4 楼 Spicy__Chicken 的回复:] [quote=引用 3 楼 阿大古 古古古 的回复：][quote=引用 2 楼 通信小卒 的回复:] main函数调用函数不需要加viod类型，另外把main里面调用的函数放在main函数的前面。 楼主改个名试过吗？调用函数在上面声明就可以了[/quote]换了几次名称还是不管用啊[/quote] main函数中 函数调用前的void去掉了？[/quote] 肯定要去掉，我没见过调用的时候还加返回类型的。另外再main函数里面调用的函数传递参数也不需要加数据类型。我有点疑惑楼主这是要做什么？在main函数里面是要执行函数，不是来声明函数的。

user: user-4
content: 新建一个源码文件，然后一行一行贴进去编译，看看在哪一行出现的问题

user: user-5
content: 引用 4 楼 Spicy__Chicken 的回复:[quote=引用 3 楼 阿大古 古古古 的回复：][quote=引用 2 楼 通信小卒 的回复:] main函数调用函数不需要加viod类型，另外把main里面调用的函数放在main函数的前面。 楼主改个名试过吗？调用函数在上面声明就可以了[/quote]换了几次名称还是不管用啊[/quote] main函数中 函数调用前的void去掉了？

user: user-0
content: 引用 3 楼 阿大古 古古古 的回复：[quote=引用 2 楼 通信小卒 的回复:] main函数调用函数不需要加viod类型，另外把main里面调用的函数放在main函数的前面。 楼主改个名试过吗？调用函数在上面声明就可以了[/quote]换了几次名称还是不管用啊

user: user-5
content: 引用 2 楼 通信小卒 的回复:main函数调用函数不需要加viod类型，另外把main里面调用的函数放在main函数的前面。 楼主改个名试过吗？调用函数在上面声明就可以了

user: user-3
content: main函数调用函数不需要加viod类型，另外把main里面调用的函数放在main函数的前面。

user: user-4
content: 该不会是名字有冲突吧？

user: user-0
content: 哦对，犯了个低级错误
user-0 提问: 小白备考C语言ing，求大神解答！

回复:
user: user-1
content: 引用 5 楼 qq_45607648 的回复:在此统一谢谢各位，我理解能力有限，每条评论都看了好多遍，自己想的话很难想出来这些思路，我决定还是记答案吧 记住答案是最不保险的方法，因为稍微改动一个表达式，结果可能就是不一样的，建议还是弄懂指针的使用，既然 要干这一行，那就弄明白原理；

user: user-0
content: 在此统一谢谢各位，我理解能力有限，每条评论都看了好多遍，自己想的话很难想出来这些思路，我决定还是记答案吧

user: user-1
content: 9题s指向了t，那么*s就是t，*s = &m;即t指向了m。因此，*t就是m的值。**s即也是m的值。

user: user-2
content: 关键点在于9.里面的s=&t语句，在9里面，s本来指向指针p的地址，s=&t之后变成指向指针t的地址了，*s=&m让t指向了m（*t=m=5,**s=t=5）,而指针p还是指向i，所以*p=i=3,**r=i=3； 然而10.里面s指向p的地址，*s=t之后，p重定向到k的地址，所以*p=k=7,**r=k=7；

user: user-3
content: 这种题目我都佩服出题人 我感觉这么说希望对你有帮助，指向i的指针就只有p一个，在第一个练习中，s = &t;*s = &m；执行完后，p任然是指向i的而r也是继续指向p的二级指针（注意形参和实参的问题，传给函数的参数，程序都在栈中做一份拷贝）。而第二个练习中，*s = t，相当于让p从指向i变成指向k了（因为*s就是p，而t指向的就是k），所以再打印*p时已经指向k了，而r依然指向p，p指向k，所以**r也是7

user: user-2
user-0 提问: 自闭大学生在线求帮助，急

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复：把%s的输入地方都去掉&，因为数组本身就是地址，无需再添加&取地址。  另外，以后建议直接贴代码，论坛支持直接贴代码并且还会自动缩进和对齐这可样改还是没法正常输出呀，还是只能输出最后输入的那一组数据

user: user-1
content: 把%s的输入地方都去掉&，因为数组本身就是地址，无需再添加&取地址。  另外，以后建议直接贴代码，论坛支持直接贴代码并且还会自动缩进和对齐

user: user-1
content: 引用 2 楼 I＇m Jason. 的回复:[quote=引用 1 楼 自信男孩 的回复：]把%s的输入地方都去掉&，因为数组本身就是地址，无需再添加&取地址。  另外，以后建议直接贴代码，论坛支持直接贴代码并且还会自动缩进和对齐这可样改还是没法正常输出呀，还是只能输出最后输入的那一组数据[/quote] 贴出你的代码，可以帮你调试一下～

user: user-2
content: 你输入是调你的add函数吗，那每调一次上一次的是不是被替换了，贴代码吧程序一个照片显示不完看起来真不舒服
user-0 提问: 时长复习两天半的在校大学生前来报道

回复:
user: user-0
content: 引用 5 楼 gouyanfen的回复:[quote=引用 2 楼 Azn2luv 的回复:] [quote=引用 1 楼 gouyanfen的回复:]指定课题就不说了，自己找东西做的话，建议找可以发挥C/C++强项的东西，做管理系统随便找个语言比C实现起来简单一百倍，简单高效，你做了一个月，别人三天,或许只要一天就完成了会打击你学C/C++的热情。 哥，我这是c语言的实训呀⊙∀⊙！[/quote] 实训做这个课题，不知道老师没水准还是对学生没信心。你实训你跑来要代码？那还训什么，直接花钱让人帮做就行了。[/quote] 哥，你说的太对了，我错了，我好好学习去了

user: user-1
content: 引用 2 楼 Azn2luv 的回复:[quote=引用 1 楼 gouyanfen的回复:]指定课题就不说了，自己找东西做的话，建议找可以发挥C/C++强项的东西，做管理系统随便找个语言比C实现起来简单一百倍，简单高效，你做了一个月，别人三天,或许只要一天就完成了会打击你学C/C++的热情。 哥，我这是c语言的实训呀⊙∀⊙！[/quote] 实训做这个课题，不知道老师没水准还是对学生没信心。你实训你跑来要代码？那还训什么，直接花钱让人帮做就行了。

user: user-0
content: 引用 3 楼 轻箬笠的回复:直接说给多少钱更实在 哥，你好像有点东西耶，能不能网上帮我找下啊，不用你编，我不太会找。我数组，链表，文件搞不太清楚，要用数组的，找下10r巨款，救救山沟沟里的穷苦孩子吧！😂😂

user: user-2
content: 直接说给多少钱更实在

user: user-0
content: 引用 1 楼 gouyanfen的回复:指定课题就不说了，自己找东西做的话，建议找可以发挥C/C++强项的东西，做管理系统随便找个语言比C实现起来简单一百倍，简单高效，你做了一个月，别人三天,或许只要一天就完成了会打击你学C/C++的热情。 哥，我这是c语言的实训呀⊙∀⊙！

user: user-1
content: 指定课题就不说了，自己找东西做的话，建议找可以发挥C/C++强项的东西，做管理系统随便找个语言比C实现起来简单一百倍，简单高效，你做了一个月，别人三天,或许只要一天就完成了会打击你学C/C++的热情。

user: user-3
content: 实训还要代码，楼主是打算不吃这行的饭吗

user: user-4
content: 加油，网上代码去仔细看看是能明白点东西的
user-0 提问: 比较字符串大小

回复:
user: user-0
content: 引用 1 楼 user-5 的回复：所有字符都要比较。比较字符串大小全部都要遍历吗？

user: user-1
content: 字符串比较大小原理是每个字符都进行比较，根据字符偏移，在偏移值相等的情况下比较对应的字符。  *s++ == *t++ 这个表达式就是比较每个字符，而不是之比较第一个。注意++自增号

user: user-2
content: 我个人感觉有个细节在于while语句后面有个；号，意味着第一个字符满足条件的话是不会返回的，而是一直遍历到两个字符中较小的那个的最后

user: user-0
content: 引用 4 楼 浮一大白开水 的回复：不要纠结比较字符串大小全部都要遍历这些，这个题知识点，敲黑板。。。 1、*s, *t, *s++, *t++都表示什么内容。 2、字符串是以结束符结束的。（*s）（*t） 3、*s-*t  是字符的ascii码值的运算。ok

user: user-3
content: 不要纠结比较字符串大小全部都要遍历这些，这个题知识点，敲黑板。。。 1、*s, *t, *s++, *t++都表示什么内容。 2、字符串是以结束符结束的。（*s）（*t） 3、*s-*t  是字符的ascii码值的运算。

user: user-4
content: *s和*t在这里不是第一个字符的意思，而是用来判断字符串是不是为空

user: user-5
content: 所有字符都要比较。
user-0 提问: 整数反转

回复:
user: user-1
content: 反转后无论是否溢出，永远都在-2147483648~2147483648之间，所以条件判断是无意义的 可以转字符串后操作，正数负数分别处理，最后用字符串比较判断是否越界

user: user-2
content: 没什么问题呀
user-0 提问: InvalidateRect（h, NULL, 1），第三个参数，除了BeginPaint，还有没有其他方法获取？

回复:
user: user-1
content: 参考一下MSDN98中相关例子代码。

user: user-2
content: 其他的不知道，只有WM_ERASEBKGND消息是相关的
user-0 提问: 求助大神

回复:
user: user-1
content: 你的问题是什么？%%d作为普通字符了。  建议自己输入到电脑编译一下试试，应该是会有警告～

user: user-2
content: 这个解析里面已经说得很清楚了呀

user: user-3
content: 在printf里，“%d”是一个格式控制符，表示输出整数，换言之，printf在遇到%符号后就会把它以及后一个（或多个）符号共同组成一个格式控制符，那么问题来了，如何输出一个%符号？所以，当初设计人员是这么设计的：每两个%表示一个%符号，比如printf（“%%”）就会输出一个%符号，printf（“%%%%”）就会输出%%，即2两个%符号。

user: user-4
content: 我们在输出是，需要用%d这样的东西来告诉程序我们输出什么格式（相当于告诉计算机怎么去“翻译”那一堆二进制），那么问题来了，要是我们需要输出一个%怎么办呢？程序会认为我们没有写后面的修饰符，这时候我们规定若要输出%，则采取%%的写法
user-0 提问: 给出一个 32 位的有符号整数，你需要将这个整数中每位上的数字进行反转

回复:
user: user-1
content: C和C++完整教程:https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程:https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: abs绝对值函数；  while( temp % 10 == 0 && temp != 0 )         temp /= 10 ; 针对1000,100， 500等这些数据，  但是这样一个程序，1000怎么翻转，翻转为0001，还是1?

user: user-3
content: 初学没太懂，希望能有点注释，感谢博主

user: user-4
content: 有什么问题嘛？
user-0 提问: C

回复:
user: user-0
content: 引用 楼主 qq_45541848的回复:int*float int+float  结果是什么类型 运算过程中有没有隐式转换为double 书上说所有的浮点数参与运算都转换为double 书上说“浮点数参与运算都转换为double类型，即使仅有单精度类型，也要转换为双精度参与运算” 是不是错了

user: user-0
content: 引用 楼主 qq_45541848的回复:int*float int+float  结果是什么类型 运算过程中有没有隐式转换为double 书上说所有的浮点数参与运算都转换为double 书上说“浮点数参与运算都转换为double类型，即使仅有单精度类型，也要转换为双精度参与运算” 是不是错了

user: user-0
content: 书上说“浮点数参与运算都转换为double类型，即使仅有单精度类型，也要转换为双精度参与运算” 是不是错了

user: user-1
content: 刚测试了下，应该是int转成float了。 测试方法。 int size = sizeof(1 + 1.0f); size = sizeof(1 * 1.0f); 结果为4  size = sizeof(1 + 1.0); size = sizeof(1 * 1.0); 结果为8
user-0 提问: 为什么是41而不是其他数

回复:
user: user-1
content: 随机数是用一个数反复计算得到的，你每次运行时，它是用的同一个数，进行相同的运算，因此也就得到了相同的数

user: user-2
content: 请参考《C++中产生随机整数的方法（srand()函数与rand()函数）》 希望能够帮到你

user: user-3
content: 可能楼主想象不到的是这是故意设计成这样的，其原因是为了方便调试，程序真正发布出去时则会加上上面说的随机化、种子，保证不再一样

user: user-4
content: 先生成随机根 srand

user: user-5
content: // Seed the random-number generator with the current time so that      // the numbers will be different every time we run.      srand( (unsigned)time( NULL ) );

user: user-6
content: 仅供参考：D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\rand.c /*** *rand.c - random number generator * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines rand(), srand() - random number generator * *******************************************************************************/  #include <cruntime.h> #include <mtdll.h> #include <stddef.h> #include <stdlib.h>  /*** *void srand(seed) - seed the random number generator * *Purpose: *       Seeds the random number generator with the int given.  Adapted from the *       BASIC random number generator. * *Entry: *       unsigned seed - seed to seed rand # generator with * *Exit: *       None. * *Exceptions: * *******************************************************************************/  void __cdecl srand (         unsigned int seed         ) {         _getptd()->_holdrand = (unsigned long)seed; }   /*** *int rand() - returns a random number * *Purpose: *       returns a pseudo-random number 0 through 32767. * *Entry: *       None. * *Exit: *       Returns a pseudo-random number 0 through 32767. * *Exceptions: * *******************************************************************************/  int __cdecl rand (         void         ) {         _ptiddata ptd = _getptd();          return( ((ptd->_holdrand = ptd->_holdrand * 214013L             + 2531011L) >> 16) & 0x7fff ); }

user: user-7
content: 随机数种子一样导致生成的随机数相同

user: user-8
content: 一般在调用rand之前，先调用srand(time(NULL));

user: user-9
content: 这种问题建议楼主百度一下

user: user-9
content: (4)因为rand()函数是按指定的顺序来产生整数，因此每次执行上面的语句都打印相同的两个值，所以说C语言的随机并不是真正意义上的随机，有时候也叫伪随机数。 (5)为了使程序在每次执行时都能生成一个新序列的随机值，我们通常通过为随机数生成器提供一粒新的随机种子。函数 srand()(来自stdlib.h)可以为随机数生成器播散种子。只要种子不同rand()函数就会产生不同的随机数序列。srand()称为随机数生成器的初始化器。
user-0 提问: c语言小游戏

回复:
user: user-1
content: 将图片整合的资源中。

user: user-2
content: 放到资源里面，或者做个服务端，用到的时候从服务端下载个图片（最简单就是http的服务器了，直接http下载即可，http下载可以用curl）
user-0 提问: PTA平台错误问题

回复:
user: user-1
content: 内存越界，申请了n个float类型的元素，再输入的时候为啥是i < n+1呢？并且i是从0开始的。  sum == *(a+n);这个有两个问题，第一个这个是赋值操作，为啥要用==，第二个是内存越界。

user: user-2
content: 看提示吧，代码有特殊情况没考虑
user-0 提问: 关于长流程的处理方法探索

回复:
user: user-1
content: 可以考虑用多态。

user: user-2
content: 请牢记：源代码本身的书写是否结构化或面向对象或符合设计模式或敏捷…并不重要，重要的是你是否使用结构化或面向对象或符合设计模式或敏捷…的方法命名标识符、阅读、修改、检查、测试源代码。  意思是你程序结构看上去再合理，再简洁，也不一定比看上去一团乱麻的程序结构在运行或修改时更不易出错，更方便修改，出错了更容易找到哪里出错和具体出错的原因，更容易改正错误。  试对比 图书馆（对图书的分类够结构化了吧） 和 搜索引擎（可看作是扁平化任何结构数据，仅支持全文检索） 哪个处理信息更方便、更高效。  所以 与其费劲去重构代码让其看上去更简洁、更合理 不如费劲学习grep、sed、awk、……这类全文搜索和批处理编辑的工具。  结构越复杂，越难修改，越难除错。 有时（甚至大多数时候），看上去越合理、越简洁的代码，运行起来性能越差，出错时查找原因越难，找到出错原因后改正越费劲。  程序员要做的不是尽力避免错误，而是聚焦在快速发现并改正错误。真正以快速方式轻易解决错误，“快速的失败”远胜过“预防错误”。Fred George  前微软C#编辑器的开发主管Jay Bazuzi列出的一些有助于找到正确方向的问题；他觉得前同事们应该用这些问题来问自己；实际上不管在哪里工作的开发者们都应该经常问问自己这些问题： ◆“要保证这个问题不会再出现，我该怎么做？” ◆“要想少出些Bug，我该怎么做？” ◆“要保证Bug容易被修复，我该怎么做？” ◆“要保持对变化的快速响应，我该怎么做？” ◆“要保证我的软件的运行速度，我该怎么做？” 如果大多数团队都能不时问一下自己，必定会从中得益，因为这些都是真正强而有力的问题。

user: user-3
content: 引用 楼主 a_moon_devin 的回复:平时我写流程的时候，比较常用switch，但随着case越多的时候，稍微中间有什么变动，基本就会影响到case顺序的排布。 现在我的解决方法是，用了好多个switch，相当于把流程分割出来… 有没有类似链表那种方法，无论我中间怎么删除或者添加，都不用去修改那个流程顺序 用链表把函数指针和参数，还有条件值设计成一个链表，不同的条件传入不同的参数调用对应的回调函数。可以动态添加删除。

user: user-4
content: 可以考虑把这个switch流程改成个结果树，可以基于linux内核红黑树实现，key的生成根据业务逻辑做字符串哈希啥的，如果有无break的特殊case情况，可以在树节点内添加一个标志位，1为终止节点，0为非终止节点，查询到且为0的话就便利大子树。除此之外，如果每个case的处理函数格式一样，就整个统一的函数指针，初始化节点的时候挂上，如果不一样，就参照printf封装可变参函数吧，好歹能整进去。核心问题是key的生成算法，业务相关，不好说。
user-0 提问: 谭浩强的5版c程序设计中的例题1.3两数比大小 我写的有问题但不知道原因 请大神帮我看看

回复:
user: user-0
content: 哦可以这样 受教了 谢谢

user: user-1
content: 引用 3 楼 qq_45275086的回复:果然 少了逗号 打字习惯不加标点了 谢谢你 你习惯了不加标点，你可以把scanf里面的逗号去掉，这样你就不用输入逗号了。

user: user-0
content: 果然 少了逗号 打字习惯不加标点了 谢谢你

user: user-2
content: 可以在输入之后先检查一下ab的值都是多少

user: user-2
content: 应该是要输入1,2吧

user: user-0
content: 明白了 谢谢各位

user: user-3
content: 输入少个逗号，看一下scanf的输入格式。  scanf是格式化输入，因此要根据你的格式来输入

user: user-4
content: 输入scanf里有逗号，应该加逗号的
user-0 提问: c语言结构体数组运用

回复:
user: user-0
content: 引用 1 楼 自信男孩的回复:#include<stdio.h> #include<string.h>  #define miun 99  struct stdio {     char str_miun[30];     int student; //} x[3] = {'李楠',0,'张强',0,'王东',0}; } x[3] = {"李楠",0, "张强",0, "王东",0};  int main() {     char str_miuns[miun];     int c, s;     for (c = 0; c < 10; c++)     {         //scanf_s("%s", str_miuns[c]);         scanf_s("%s", str_miuns, mium);         for(s=0;s<3;s++)         {             //if (strcmp(str_miuns[c], x[s].str_miun) == 0)             if (strcmp(str_miuns, x[s].str_miun) == 0)             {                 x[s].student++;             }         }     }     printf("投票结束");     int v;     for (v = 0; v < 3; v++)     {         printf("%s:\t%d\n", x[v].str_miun, x[v].student);     }     return 0; }   供参考～  ''和""的区别，字符串和字符的区别，建议重新梳理一下 还是没明白scanf_s

user: user-1
content: #include<stdio.h> #include<string.h>  #define miun 99  struct stdio {     char str_miun[30];     int student; //} x[3] = {'李楠',0,'张强',0,'王东',0}; } x[3] = {"李楠",0, "张强",0, "王东",0};  int main() {     char str_miuns[miun];     int c, s;     for (c = 0; c < 10; c++)     {         //scanf_s("%s", str_miuns[c]);         scanf_s("%s", str_miuns, mium);         for(s=0;s<3;s++)         {             //if (strcmp(str_miuns[c], x[s].str_miun) == 0)             if (strcmp(str_miuns, x[s].str_miun) == 0)             {                 x[s].student++;             }         }     }     printf("投票结束");     int v;     for (v = 0; v < 3; v++)     {         printf("%s:\t%d\n", x[v].str_miun, x[v].student);     }     return 0; }   供参考～  ''和""的区别，字符串和字符的区别，建议重新梳理一下

user: user-0
content: 引用 3 楼 轻箬笠的回复:[quote=引用 2 楼 Gnglas 的回复:] 还是没明白scanf_s scanf_s是scanf的安全形式。 比如 char buf[5]={'\0'}; scanf("%s", buf);//这句可以改成scanf_s("%s",buf,5)  ANSI C标准中没有scanf_s，楼主可以用scanf替换。[/quote] 为什么我改成scanf_s那个格式是错的，而且vs2019用不了scanf

user: user-2
content: 引用 2 楼 Gnglas 的回复:还是没明白scanf_s scanf_s是scanf的安全形式。 比如 char buf[5]={'\0'}; scanf("%s", buf);//这句可以改成scanf_s("%s",buf,5)  ANSI C标准中没有scanf_s，楼主可以用scanf替换。
user-0 提问: vs2017输出字符为乱码？

回复:
user: user-0
content: 控制台属性里改一下默认字符

user: user-1
content: 怎么解决的？大神，没看懂

user: user-2
content: system("chcp 437");

user: user-0
content: 问题已经解决，控制台默认值设置一下就可以了！
user-0 提问: 大佬来捞我吧

回复:
user: user-1
content: 把你定义的线接到模拟信号输入端口啊。

user: user-0
content: 引用 1 楼 user-1的回复:测电压值，那就是模拟信号输入啊，输出电压控制，那就是模拟信号输出啊。 咋测自己定义那四根线

user: user-1
content: 测电压值，那就是模拟信号输入啊，输出电压控制，那就是模拟信号输出啊。
user-0 提问: else悬挂 哪个哥哥救救我 我要疯了

回复:
user: user-1
content: {  }与那个对齐就是哪个？建议使用一个IDE编码，最次也可以用dourceinsught，一目了然

user: user-2
content: 你本来是想让ELSE和外层IF匹配，但是你的写没却与内层IF匹配了，一楼是一种解决办法，另外你可以把内层IF包裹在外层IF的一对｛｝中，在这个｛｝外写ELSE语句块就可以了

user: user-3
content: 楼主是啥问题，可否描述的更清晰一些？

user: user-4
content: #include<stdio.h>  int main()  { char isRani,isFree;  printf("是否有空? (Y/N)");  scanf("%c",&isFree);  getchar();  printf("是否下雨？(Y/N)");  scanf("%c",&isRani); getchar();  if(isFree == 'Y') { if(isRani == 'Y') { printf("记得带伞噢 (*∩_∩*)\n"); }  } else; else { printf("女神没空！\n");   }  return 0; }

user: user-5
content: 建议用个IDE写代码。
user-0 提问: 关于选择排序

回复:
user: user-0
content: 谢谢了，这个问题之前还真没留意过！

user: user-1
content: 不是，k的第一次被赋值为0。for循环的执行逻辑建议查一下。 初始值i = 0;此时先判断i < 10;是否为真，如果为真，则执行循环体，而不是执行i++; 当循环体执行完后，且再循环体里没有break操作，则执行i++;然后在判断i < 10;是否为真， 依次向下执行～
user-0 提问: 求大神解释一下

回复:
user: user-0
content: 引用 9 楼 liups 的回复：[quote=引用 8 楼 二马胖 的回复:] [quote=引用 7 楼 liups 的回复：][quote=引用 5 楼 二马胖 的回复:] 数组越界了，应该就是word2的结尾0写到数组word［0］里面了 按4楼输入，是越界了[/quote]越界了所以如果word1是低地址的话，那么输出应该是12345678##，所以word1只能是高地址才能得到这个结果，但是具体原因我也不懂 [/quote] 我前面就说了，你不能因为word1和word2是连续定义的，就认为他们一定在内存中是连续或紧挨着的，因这没有语言的标准中规定要连续！如果你在某种实现比如VC2013中发现是连续的，那也不能说明什么问题[/quote]谢谢，帮我看看下面的一个疑问吧😄

user: user-0
content: 那假如我定义了一个结构体，结构体里面有两个int类型的数据，它们的地址应该是连续的吧，那他们有没有谁高地址谁低地址的规定呢

user: user-1
content: 没规定 没限制 没要求 word1 可以高地址 可以低地址

user: user-2
content: 引用 8 楼 二马胖 的回复:[quote=引用 7 楼 liups 的回复：][quote=引用 5 楼 二马胖 的回复:] 数组越界了，应该就是word2的结尾0写到数组word［0］里面了 按4楼输入，是越界了[/quote]越界了所以如果word1是低地址的话，那么输出应该是12345678##，所以word1只能是高地址才能得到这个结果，但是具体原因我也不懂 [/quote] 我前面就说了，你不能因为word1和word2是连续定义的，就认为他们一定在内存中是连续或紧挨着的，因这没有语言的标准中规定要连续！如果你在某种实现比如VC2013中发现是连续的，那也不能说明什么问题

user: user-0
content: 引用 7 楼 liups 的回复：[quote=引用 5 楼 二马胖 的回复:] 数组越界了，应该就是word2的结尾0写到数组word［0］里面了 按4楼输入，是越界了[/quote]越界了所以如果word1是低地址的话，那么输出应该是12345678##，所以word1只能是高地址才能得到这个结果，但是具体原因我也不懂

user: user-2
content: 引用 5 楼 二马胖 的回复:数组越界了，应该就是word2的结尾0写到数组word［0］里面了 按4楼输入，是越界了

user: user-0
content: 引用 3 楼 肥仔亮 的回复：地址的分配遵从原则： 1：静态变量和全局变量在启动时就分配内存，局部变量在用到时再分配内存，这个大家都知道。 2：内存的分配地址，从低到高，也知道。 3：同时段定义的变量，变量类型占位大的先分配。        如，char c=3； int i=2；那么，i的地址比c低。  楼主，你两个数组，只是声明，没赋值，其实还没真正分配内存的。你试试赋值后再读地址看看。 这问题之前没多想，楼主验证后麻烦把结果告知一下，大家一起进步你看我楼下回复

user: user-0
content: 数组越界了，应该就是word2的结尾0写到数组word［0］里面了

user: user-0
content: 然后我scanf（%s,word） scanf（%s,word2） 输入的都是12345678 然后printf（"%s#％s#",word,word2） 然后输出是#12345678#

user: user-3
content: 地址的分配遵从原则： 1：静态变量和全局变量在启动时就分配内存，局部变量在用到时再分配内存，这个大家都知道。 2：内存的分配地址，从低到高，也知道。 3：同时段定义的变量，变量类型占位大的先分配。        如，char c=3； int i=2；那么，i的地址比c低。  楼主，你两个数组，只是声明，没赋值，其实还没真正分配内存的。你试试赋值后再读地址看看。 这问题之前没多想，楼主验证后麻烦把结果告知一下，大家一起进步

user: user-2
content: Char：不能大写！ 高地址这些是没有规定的，不能凭空认定

user: user-4
content: 高地址是什么?是说分配的栈的地址号的大小吗？
user-0 提问: C初学

回复:
user: user-1
content: scanf("d%", &age); 这样的代码应该是会给error或warning

user: user-2
content: d%改成%d，楼上已经说了。  关于精度的问题，可以参考IEEE 754浮点数标准详解 第一个函数3.156e7是double类型的，第二个函数3.156e7是float类型的

user: user-3
content: scanf("%d", &age);
user-0 提问: 用C怎么把汉字英语混合字符串逆置

回复:
user: user-1
content: 还有 L"Unicode字符串" L'Unicode字符'

user: user-1
content: 使用wchar_t和wstring

user: user-2
content: Unicode编码~ for循环，首尾字符交换~

user: user-3
content: 逆置是倒叙的意思？用libconv转成宽字节，再排序，如有必要，再转码一次
user-0 提问: 大家好，请教关于位域的一些问题！

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #pragma pack(push,1) union U {     unsigned char byte;     struct BF {         unsigned int b0:1;//a         unsigned int b1:1;//b         unsigned int b2:1;//c     } bf; } u; #pragma pack(pop) unsigned char bt; int a,b,c; int main() {     for (bt=0;bt<8;bt++) {         u.byte=(unsigned char)bt;         a=u.bf.b0;         b=u.bf.b1;         c=u.bf.b2;         printf("byte 0x%02x -- c:%d b:%d a:%d\n",bt,c,b,a);     }     for (c=0;c<2;c++)     for (b=0;b<2;b++)     for (a=0;a<2;a++) {         u.bf.b0=a;         u.bf.b1=b;         u.bf.b2=c;         bt=u.byte;         printf("c:%d b:%d a:%d -- byte 0x%02x\n",c,b,a,bt);     }     return 0; } //byte 0x00 -- c:0 b:0 a:0 //byte 0x01 -- c:0 b:0 a:1 //byte 0x02 -- c:0 b:1 a:0 //byte 0x03 -- c:0 b:1 a:1 //byte 0x04 -- c:1 b:0 a:0 //byte 0x05 -- c:1 b:0 a:1 //byte 0x06 -- c:1 b:1 a:0 //byte 0x07 -- c:1 b:1 a:1 //c:0 b:0 a:0 -- byte 0x00 //c:0 b:0 a:1 -- byte 0x01 //c:0 b:1 a:0 -- byte 0x02 //c:0 b:1 a:1 -- byte 0x03 //c:1 b:0 a:0 -- byte 0x04 //c:1 b:0 a:1 -- byte 0x05 //c:1 b:1 a:0 -- byte 0x06 //c:1 b:1 a:1 -- byte 0x07

user: user-2
content: 位域一般在结构体里面实用，结构体需要考虑字节对齐的问题，这个也是填充字节的目的，不清楚你说的失去位域效果指的是什么？

user: user-3
content: char和short有时候会扩展成4字节 未命名的字节起填充作用，控制后面位域的位置
user-0 提问: 求大佬们解答

回复:
user: user-1
content: for语句里面的三个参数 都是选择项，你像第一个参数初始化，你可以放到for语句之前，这个for里的三个参数的第一个你就可以不写。你这里个第三个参数没有，这个可以把他放到for语句体里面。第二个参数循环条件控制，也可以省，但在for语句里一定要做别的处理，不然就成死循环了。

user: user-2
content: 答案是5因为++的优先级在这里面最小，所以最后执行，但是整个语录执行完后。i已经等于5了

user: user-3
content: 3个参数都可以不填，但;不能省略

user: user-3
content: 出现i(4)++<4时结束循环，故最后i为5
user-0 提问: 基础运算求解

回复:
user: user-0
content: 引用 4 楼 赵4老师的回复:关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775 非常感谢！ ……………………

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

user: user-2
content: 不要做这种没意义的事了，记得用括号！！！！！！！！！

user: user-3
content: 不要在同一个式子里对同一个变量出现两次++就行了，因为具体怎么算可能因编译器而不同

user: user-4
content: 编译器对后置 ++ 的解释不同，一个是执行完语句才加 1，一个是执行完当前操作加 1。
user-0 提问: 菜鸟提问

回复:
user: user-1
content: #include "windows.h" LRESULT MyProc( HWND h , UINT msg , WPARAM wParam , LPARAM lParam ) { 	static PAINTSTRUCT ps; 	switch( msg ) 	{ 		case WM_PAINT: 		{	 			HDC hdc = BeginPaint( h , &ps ); 			MoveToEx( hdc , 50 ,50 , NULL ); 			LineTo( hdc , 50, 400 ); 			LineTo( hdc , 400, 400 ); 			Arc ( hdc , 100 , 100 , 300 , 300 , 0 , 0 , 0 , 0 ); 			EndPaint( h , &ps ); 			return 0; 		} 	 		case WM_DESTROY: 			PostQuitMessage(0); 			return 0; 	} 	return DefWindowProc( h , msg , wParam , lParam ); } void SetWNDCLASS( WNDCLASS* a, WNDPROC proc, LPCTSTR ClassName ) { 	a->style 			=CS_HREDRAW | CS_VREDRAW; 	a->lpfnWndProc		=proc;							 	a->cbClsExtra		=0;		 	a->cbWndExtra		=0;	 	a->hInstance		=GetModuleHandle(NULL); 	a->hIcon			=NULL; 	a->hCursor			=LoadCursor(NULL, IDC_ARROW);		 	a->hbrBackground	=(HBRUSH)GetStockObject(WHITE_BRUSH); 	a->lpszMenuName		=NULL;	 	a->lpszClassName	=ClassName;	 } ATOM  RegMyClass(  const char* name , WNDPROC  proc) { 	WNDCLASS MyClass; 	SetWNDCLASS ( &MyClass, proc, name ); 	return RegisterClass( &MyClass ); } int main( void ) { 	RegMyClass( "MyClass" , MyProc ); 	CreateWindow( "MyClass" , "绘图" ,WS_OVERLAPPEDWINDOW|WS_VISIBLE,  				300,400,500,500,NULL,NULL,NULL,NULL ); 	MSG msg; 	while( GetMessage( &msg , NULL, 0,0 ) ) 	{ 		DispatchMessage( &msg ); 	} 	return 0; }

user: user-1
content: 稍微复杂点的话，你还需要创建自己的窗口，总不能老用控制台绘图吧。嫌麻烦的话，可以去了解easyx库，他们的绘图函数简单许多，但貌似只有dll版。

user: user-1
content: 你说的坐标系是理论上的还是实际的线条？ 最简单的方法可以这样： #include "windows.h" int main( void ) { 	HWND h = GetConsoleWindow(); 	HDC hdc = GetDC( h );  	MoveToEx( hdc , 50 ,50 , NULL ); 	LineTo( hdc , 50, 400 ); 	LineTo( hdc , 400, 400 ); 	Arc ( hdc , 100 , 100 , 300 , 300 , 0 , 0 , 0 , 0 ); 	ReleaseDC( h , hdc ); 	return 0; }

user: user-2
content: 用turbo c, 有专门绘图的函数。
user-0 提问: csp考试 2019年3月的第二题 24点问题 为什么我的程序可以跑起来而且输出结果也正确，但系统老是显示错误

回复:
user: user-1
content: 把显示什么错误发出来？

user: user-0
content: 显示运行错误，然后得零分
user-0 提问: 哪里错了

回复:
user: user-1
content: 单步调试就知道了。

user: user-0
content: 引用 1 楼 你皮你自己 的回复：算法错了，小循环s还没有完成阶乘就加到sum上了，大循环sum在里面不停被更新为零，输出的位置也不对呀小声bb：希望我没说错s一直在累乘其实

user: user-2
content: 算法错了，小循环s还没有完成阶乘就加到sum上了，大循环sum在里面不停被更新为零，输出的位置也不对呀小声bb：希望我没说错
user-0 提问: hlog 定义带参宏替换hlog_format函数时，VS2015提示未找到用户定义的文本运算符

回复:
user: user-0
content: 引用 1 楼 user-1 的回复:这个没用过呢，能不能说清楚是什么环境？ XXXX(fmt, ...)         hlog_format(HLOG_LEVEL_DEBUG, "xxx", "<%d>\t<%s>,"fmt, __LINE__, __FUNCTION__, ##__VA_ARGS__)  就是这样定义的宏 然后一直报错 编译没问题 但是满屏的红点点

user: user-0
content: 引用 4 楼 weixin_36946549 的回复:[quote=引用 3 楼 user-1 的回复:] 能不能完整的截屏一下呢？代码都看不完整 代码中引用这个宏就会有红色波浪线 提示未找到用户定义的文本运算符 [/quote]编译运行是没问题的

user: user-0
content: 引用 3 楼 user-1 的回复:能不能完整的截屏一下呢？代码都看不完整 代码中引用这个宏就会有红色波浪线 提示未找到用户定义的文本运算符

user: user-1
content: 能不能完整的截屏一下呢？代码都看不完整

user: user-1
content: 这个没用过呢，能不能说清楚是什么环境？
user-0 提问: 大佬帮我康康

回复:
user: user-1
content: 哦哦，忘记了你这是C，不是C++

user: user-0
content: error C2275错误，是变量的定义位置不对，应该在函数块的最前面（自己解决了，棒棒）

user: user-1
content: 貌似没什么问题的，这就帮不上忙了

user: user-0
content: 引用 3 楼 user-2的回复:&去掉试试？我感觉右边本身就是地址啊。 去掉了也一样报错，数组元素不是地址吧，数组名才是地址

user: user-2
content: &去掉试试？我感觉右边本身就是地址啊。

user: user-0
content: 这是前面的定义哦，再帮我康康。

user: user-1
content: 查看一下头文件，或者直接查SqList定义，找到data域，这个就是DataType类型数组
user-0 提问: 循环嵌套c语言

回复:
user: user-1
content: 楼主应该是刚刚上手没多久吧，这种嵌套很基础，也很重要，建议自己研究，有问题贴码找人解决。

user: user-2
content: 楼主，来这里尽量带着代码，最好不要伸手。哪怕你代码写得再不好，纠正了、运行了，就会在这个过程中进步，如果总是别人帮你写好了，那你能得到什么呢？除非你只是想让人帮你做作业，当然也不排除坛子里有某些好心人能有求必应，不过私以为这不是在帮你。
user-0 提问: 求帮助

回复:
user: user-1
content: 引用 5 楼 sky.？的回复:我这是算一元2次方程，有2个解的 删除一个后面的参数就行，不影响你有两个解吧

user: user-2
content: 求一元二次方程的实数根：https://blog.csdn.net/pfdvnah/article/details/87460351

user: user-3
content: 有-b吗？应该改为-1*b

user: user-0
content: 我这是算一元2次方程，有2个解的

user: user-4
content: 感觉删除哪一个都可以！

user: user-4
content: 删除x1,你上一步不是已经让x2=x1了嘛，

user: user-0
content: 引用 1 楼 三山丶 的回复：你的printf那一栏(27栏)，你只有一个%d，但是你设置了两个参数(x1,x2)那要怎么解决

user: user-4
content: 你的printf那一栏(27栏)，你只有一个%d，但是你设置了两个参数(x1,x2)
user-0 提问: 文件输入输出的一道习题

回复:
user: user-1
content: 原因是：在 || &&等判断过程中，只要条件满足就不会进行下一步的判断。例如： A || B, 若A为真，则B并不会执行； A && B  若A为假，B同样不会执行。 因此，解决方法也就是将两个fget()放入到while循环体中，加入两个标志量进行循环条件判断即可。 将源代码中的while{}循环体替换为如下即可。  int flag1 = 0;     int flag2 = 0;     while(!flag2 || !flag1)     {         if(fgets(line1, 300, fptr1)){             fputs(line1, stdout);         }else{             flag1 = 1;         }          if(fgets(line2, 300, fptr2)){             fputs(line2, stdout);         }else{             flag2 = 1;         }     }
user-0 提问: 基础问题

回复:
user: user-1
content: 提醒：scanf是开源的。

user: user-2
content: 这个跟int是2字节还是4字节并没有多大关系，因为即便int是2字节，执行scanf("%d%d",&a,&b) ;语句时输入1234567890，变量b也得不到值，同时变量a也得不到1234567890！ 执行scanf("%d%d",&a,&b) ;时，输入a、b的值，只能由空白符分隔开。输入1234567890后，一定是试图将1234567890给变量a，然后再等待输入另一个整型值给b。假设int是2字节（当然只是假设），那其最大值为32767，输入的1234567890远远大于32767，此时变量a也就不可能等于1234567890！也不会是32767。 总之系统不可能因为输入的值大于a所能取的最大值，就只取输入的值的某一段，这是一种臆想。 当然，诚如楼上大家所说，还是在Turbo C的年代，int的值域是-32768至32767。

user: user-3
content: 引用 2 楼 qq_36005572 的回复:但是有符号基本整型的上限是32767吗 是否还停留在int为16bit的时代里。现在的主流编译器都是32bit的吧。

user: user-0
content: 哦，谢谢，跟不时代了

user: user-0
content: a的上限比它小也会直接全部读取吗？

user: user-3
content: 引用 2 楼 qq_36005572 的回复:但是有符号基本整型的上限是32767吗 那是16位的编译器，现在主流的都是32位的编译器

user: user-4
content: 引用 2 楼 qq_36005572 的回复:但是有符号基本整型的上限是32767吗 int的取值范围为: -2^31——2^31-1,即-2147483648——2147483647

user: user-5
content: %d是int型  1234567890全部输入到a了，并且要区分给a还是b输入值，必须输入一个后加个空格。

user: user-0
content: 但是有符号基本整型的上限是32767吗

user: user-6
content: a 会读取全部（连续的数字），b 什么都没读取到，并且程序还会等你继续输入。因为它认为你只输入了一个数。
user-0 提问: 各位神看一下

回复:
user: user-1
content: 引用 3 楼 覆陇黄 的回复：[quote=引用 2 楼 wowpH 的回复:] 第二个循环里面再套一层循环输出一定数量的空格，然后里层循环外面输出笑脸就可以了。 //such as： for (i=0;i<2;i++) {prinft("%c\n",2); for(j=0;j<9;j++) printf(" ");}  //楼主你的意思是....... 笑脸的ASCII码是2 吗，学到就是赚到[/quote].....这个毛病我得改了

user: user-2
content: 引用 8 楼 狂风乱吼 的回复:大神putchar（）是什么函数，本人菜鸟一枚，怎么用这个不是本题的重点，重点是中间的那个循环。  另外：putchar，从名字就可以看出来，put（输出）char（字符）。它就是一个输出单个字符的函数。你换成 printf("#"); 效果是一样的。

user: user-0
content: 引用 5 楼 wowpH 的回复: 大神putchar（）是什么函数，本人菜鸟一枚，怎么用

user: user-1
content: 引用 6 楼 狂风乱吼 的回复:[quote=引用 3 楼 覆陇黄 的回复:] [quote=引用 2 楼 wowpH 的回复:] 第二个循环里面再套一层循环输出一定数量的空格，然后里层循环外面输出笑脸就可以了。 //such as： for (i=0;i<2;i++) {prinft("%c\n",2); for(j=0;j<9;j++) printf(" ");}  //楼主你的意思是....... 笑脸的ASCII码是2 吗，学到就是赚到[/quote] 对是2，那大神把源码奉上[/quote]  啥？意思

user: user-0
content: 引用 3 楼 覆陇黄 的回复:[quote=引用 2 楼 wowpH 的回复:] 第二个循环里面再套一层循环输出一定数量的空格，然后里层循环外面输出笑脸就可以了。 //such as： for (i=0;i<2;i++) {prinft("%c\n",2); for(j=0;j<9;j++) printf(" ");}  //楼主你的意思是....... 笑脸的ASCII码是2 吗，学到就是赚到[/quote] 对是2，那大神把源码奉上

user: user-2

user: user-1
content: 数组的话，感觉数组麻烦了就。 定义一个数组a，包含首尾俩笑脸，中间一堆空格？然后循环输出吗。 楼主有什么想法，恳请指教，我没了、、

user: user-1
content: 引用 2 楼 wowpH 的回复:第二个循环里面再套一层循环输出一定数量的空格，然后里层循环外面输出笑脸就可以了。 //such as： for (i=0;i<2;i++) {prinft("%c\n",2); for(j=0;j<9;j++) printf(" ");}  //楼主你的意思是....... 笑脸的ASCII码是2 吗，学到就是赚到

user: user-2
content: 第二个循环里面再套一层循环输出一定数量的空格，然后里层循环外面输出笑脸就可以了。

user: user-3
content: 第一列的笑脸前面加上适当多的空格不就好了嘛。。。。。。
user-0 提问: 在驱动中测试函数？

回复:
user: user-1
content: 补充一下, 我记得教材上叫做“驱动模块"和"桩模块“，驱动模块指调用被测函数的模块，桩模块指的是提供被测函数调用的其他模块, 因为还没有开发出来, 可以先写一个简单的假的函数供被测模块调用。

user: user-1
content: 此"驱动程序“非彼“驱动程序”。这里的驱动程序是测试术语，简单地说就是写一个程序调用这个函数，测试各种情况下的输出是否正确。
user-0 提问: 一维数组冒泡排序法从小到大排列

回复:
user: user-1
content: 试着把项目属性→清单工具→输入输出→嵌入清单该成否试一下

user: user-2
content: 估计项目类型有问题

user: user-1
content: https://blog.csdn.net/weixin_39447690/article/details/86550162 参考这个，有源代码可以参考

user: user-1
content: 我用#CSDN#这个app发现了有技术含量的博客，小伙伴们求同去《第一（NUM_ONE）:冒泡排序(BubbleSort)》, 一起来围观吧 https://blog.csdn.net/weixin_39447690/article/details/86550162 可以参考这个，并且把原理说了

user: user-3
content: 引用 4 楼 覆陇黄 的回复:这个应该没问题，不知道加加for嵌套时的括号能不能运行成功。 还有它程序最后的两个getchar（）是干啥的，你知道吗抱歉，我弄错了。他的格式太乱了。

user: user-4
content: 引用 2 楼 wowpH 的回复:最里层的 for 循环的循环变量不能用 i 了。因为最外层已经用过了。  这个应该没问题，不知道加加for嵌套时的括号能不能运行成功。 还有它程序最后的两个getchar（）是干啥的，你知道吗

user: user-3
content: for 括号全部加上试试。

user: user-3
content: 最里层的 for 循环的循环变量不能用 i 了。因为最外层已经用过了。

user: user-0
content: 引用 楼主 jian995229的回复:新手上路，求大神指点，非常感谢 问下为什么运行不了了
user-0 提问: c

回复:
user: user-1
content: 这个是没有理解指针和内存的关系吧

user: user-2
content: 引用 4 楼 wowpH 的回复:将第10行替换成  p = a;  哎，经常用 Java，C的指针都快忘记了。  楼主（发帖的）的错误是“教科书式”的，一不小心就忘了。 不过以后应该就记牢了

user: user-3
content: 将第10行替换成  p = a;  哎，经常用 Java，C的指针都快忘记了。

user: user-3
content: 引用 2 楼 阿大古 古古古的回复:void main(void) { 	int *p; 	int i , a[10]; 	p = a; 	for (i = 0; i < 10; i++) 	{ 		scanf("%d", &a[i]); 	} 	printf("\n"); 	for (i = 0; i < 10; i++) 	{ 		printf("%d\t", *p++); 	} 	system("pause"); } 你第一个循环违背了他的初衷，他应该是想用指针操作数组，而不是直接输入到a中。

user: user-4
content: void main(void) { 	int *p; 	int i , a[10]; 	p = a; 	for (i = 0; i < 10; i++) 	{ 		scanf("%d", &a[i]); 	} 	printf("\n"); 	for (i = 0; i < 10; i++) 	{ 		printf("%d\t", *p++); 	} 	system("pause"); }

user: user-5
content: 你第一个循环结束后p就指向了11这个下标,越界了.
user-0 提问: 统计字符串的长度问题

回复:
user: user-1
content: 引用 4 楼 自信男孩 的回复:while (s != '\0') p++; 改成：  while (p++ != '\0') ;  上一个有误： while (*p++ != '\0') ;

user: user-1
content: while (s != '\0') p++; 改成：  while (p++ != '\0') ;

user: user-0
content: 已经改好了，谢谢二位

user: user-2
content: 引用 1 楼 真相重于对错 的回复:while (s != '\0') p++; 这段代码s并没有改变所以一直不等于‘\0’,死循环， 另外比较不是s!='\0'是*s!='\0'*p != 0

user: user-3
content: while (s != '\0') p++; 这段代码s并没有改变所以一直不等于‘\0’,死循环， 另外比较不是s!='\0'是*s!='\0'
user-0 提问: 这段代码输出结果是什么？每部分代码是什么意思？

回复:
user: user-1
content: a<<2这条代码语句没意义，什么事也没做。

user: user-0
content: 代码已经了解了  谢谢各位的评论

user: user-2
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

user: user-3
content: （math. pow（2,3））可能是宏定义   (int)是强制转换为整形   (0xff)是十六进制的数   &是位与操作 a<<2是左移两位
user-0 提问: 请问这个怎么搞

回复:
user: user-1
content: 你没给这俩函数写定义

user: user-2
content: C中的函必须先定义后使用，由于会存在相互调用，就可采用先声明后定义，声明要放在定义和调用之前，同时声明和定义时要求返回值相同，函数名相同（C是区分大小写的），形参类型和顺序相同

user: user-3
content: jolly和deny在哪定义的？编译提示已经很明确了。这两个也不是系统函数的

user: user-4
content: 1.main函数中调用jolly时，你使用的是jolly("For he's...."),jolly使用时时有参数的，而你在第二行声明的时候jolly()是没有参数的。 2.deny同上 3.jolly和deny只有声明没有实现 可以修改下：  #include <stdio.h> void jolly(char *pStr) {     return; }  void deny(char *pStr) {     return; }
user-0 提问: C语言二级程序设计题

回复:
user: user-1
content: 引用 4 楼 覆陇黄 的回复:学到了，我考虑的太少了 请教一下：那个while（*s！=0）可以吗 需不需要写成while（*s！=‘\0’） 效果应该是一样的。 *s!='\0' 更容易理解些。

user: user-2
content: 学到了，我考虑的太少了 请教一下：那个while（*s！=0）可以吗 需不需要写成while（*s！=‘\0’）

user: user-1
content: int func(char *s) {     int num=0;     /* s为空或者字符串长度为0，则单词数为0 */     if (s==null || *s==0) {          return num;     }    while (*s !=0) {  /* 循环直到字符串末尾 */         while (' ' !=*s ) s++ ；/* 找单词,  ；按照约定字符串第一个字母不应该是空格 */         num++;  /*单词数加1 */         while (' '==*s) s++ ; /*跳过空格到下一个单词*/    }    return num; }  题目没有规定遇到小写字母之外的怎么办，就简化处理认为输入只有小写字母和空格。 这是我现写的没有自己运行，不保证没问题。

user: user-2
content: s++！=‘\0’   时 num++

user: user-2
content: 不会就选C.....（开个玩笑）
user-0 提问: 不会用C语言编小游戏

回复:
user: user-0
content: 引用 4 楼 自信男孩的回复:由易到难，你这个跨度有点大。还不会走就要跑是不是有点超前？ 我还以为贪吃蛇是比较简单的程序，原来属于“跑”的吗，那我现在该练点啥呀

user: user-1
content: 由易到难，你这个跨度有点大。还不会走就要跑是不是有点超前？

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

user: user-3
content: 首先把那本谭浩强《C语言程序设计》学通，然后再做画面游戏吧。 贪吃蛇可以用贴图方式实现，这个我有贴图框架，只要你编程基础没问题，很容易实现 https://download.csdn.net/download/zsrmouse/4574138

user: user-2
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-4
content: 基础的语法学好之后，多看代码，多练习，然后你就会了

user: user-0
content: 要怎样才能看懂并且编程，求大佬
user-0 提问: CreateBitmap所使用的位图数组为什么是WORD型的？

回复:
user: user-1
content: 用来存储每行像素数据的字节数 和 每行多少个像素 不是一回事！

user: user-0
content: 引用 2 楼 user-2 的回复:MSND  lpBits A pointer to an array of color data used to set the colors in a rectangle of pixels. Each scan line in the rectangle must be word aligned (scan lines that are not word aligned must be padded with zeros).  说白了就是为了内存对齐，最终目的还是提高效率，如楼上所说 通过多次比对，总算得出结论了，每一行至少要2字节，超出2字节了以2字节自增，所以8x8及以下，每行都至少会空一个字节，9x9则不空，假如是20x20，每一行4字节，空1字节，25x25则不空，33x33，每一行6字节，空1字节。

user: user-1
content: 早期CPU读写显存不降低效率要求的。我猜。

user: user-0
content: 引用 2 楼 user-2 的回复:MSND  lpBits A pointer to an array of color data used to set the colors in a rectangle of pixels. Each scan line in the rectangle must be word aligned (scan lines that are not word aligned must be padded with zeros).  说白了就是为了内存对齐，最终目的还是提高效率，如楼上所说 我发现了一件奇怪的事，用CreateBitmap给CreatePatternBrush提高位图句柄时，如果8x8的图，数组需要是WORD，但我又测试了32x32的图，WORD却错了，用unsigned char反而对了？为什么会这样？

user: user-2
content: MSND  lpBits A pointer to an array of color data used to set the colors in a rectangle of pixels. Each scan line in the rectangle must be word aligned (scan lines that are not word aligned must be padded with zeros).  说白了就是为了内存对齐，最终目的还是提高效率，如楼上所说
user-0 提问: 求助，用c语言写出一个小学生速算训练的程序

回复:
user: user-1
content: 仅供参考：//运用C语言开发一个“小学生算术四则运算测试系统”。该系统是让计算机充当一位给小学生布置作业的算术老师，为学生出题并阅卷。该系统要求实现下列功能： //①为小学生出题（分别进行+、-、*、/等不同运算）。 //②学生做题后，进行评阅。学生每做一题后，评阅给出“答题正确，很好”或“答题错误，重做”等信息。 //③加、减、乘、除运算功能可以自由选择实现。 //④运算数值可控制在两位数的四则运算范围内。 #include <stdio.h> #include <stdlib.h> #include <time.h> int c,a,b,r,ri; void main() {     srand( (unsigned)time( NULL ) );     system("cls");     printf("小学生算术四则运算测试系统\n");     while (1) {         printf("1加法 2减法 3乘法 4除法 0退出:");fflush(stdout);         rewind(stdin);         scanf("%d",&c);         if (0==c) break;         switch (c) {         case 1:             a=rand()%100;             b=rand()%100;             r=a+b;             while (1) {                 printf("%d+%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 2:             a=1+rand()%99;             b=rand()%a;             r=a-b;             while (1) {                 printf("%d-%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 3:             a=rand()%99;             b=rand()%99;             r=a*b;             while (1) {                 printf("%d*%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         case 4:             a=2+rand()%998;             b=1+rand()%(a/2);             while (1) {                 if (0==a%b) break;                 b--;             }             r=a/b;             while (1) {                 printf("%d/%d=?",a,b);fflush(stdout);                 rewind(stdin);                 scanf("%d",&ri);                 if (ri==r) {                     printf("答题正确，很好！\n");                     break;                 } else {                     printf("答题错误，请重做。\n");                 }             }         break;         }     } }
user-0 提问: 一元二次方程的解  求指错

回复:
user: user-1
content: 引用 6 楼 菅田的古着与牛奶 的回复:[quote=引用 4 楼 自信男孩的回复:][quote=引用 2 楼 菅田的古着与牛奶 的回复:] [quote=引用 1 楼 自信男孩的回复:]	if(tr=0) 和 	if(c=0) 看出这两个地方的问题了吗？ 这里改了，可是还是提示 expected'}'before 'else '[/quote]  else if(tr<0); 这个问题看出来了吗？  代码格式注意一下[/quote] 这里有什么问题吗     。 [/quote] 没问题吗? 这儿的分号不是问题？

user: user-0
content: 引用 4 楼 自信男孩的回复:[quote=引用 2 楼 菅田的古着与牛奶 的回复:] [quote=引用 1 楼 自信男孩的回复:]	if(tr=0) 和 	if(c=0) 看出这两个地方的问题了吗？ 这里改了，可是还是提示 expected'}'before 'else '[/quote]  else if(tr<0); 这个问题看出来了吗？  代码格式注意一下[/quote] 这里有什么问题吗     。

user: user-1
content: 基本的编译问题如果不熟练解决，基础有点弱，需要加强

user: user-1
content: 引用 2 楼 菅田的古着与牛奶 的回复:[quote=引用 1 楼 自信男孩的回复:]	if(tr=0) 和 	if(c=0) 看出这两个地方的问题了吗？ 这里改了，可是还是提示 expected'}'before 'else '[/quote]  else if(tr<0); 这个问题看出来了吗？  代码格式注意一下

user: user-2
content: 最下面少了个  }  ,        养成习惯 括号缩进对齐不行嘛

user: user-0
content: 引用 1 楼 自信男孩的回复:	if(tr=0) 和 	if(c=0) 看出这两个地方的问题了吗？ 这里改了，可是还是提示 expected'}'before 'else '

user: user-1
content: if(tr=0) 和 	if(c=0) 看出这两个地方的问题了吗？
user-0 提问: CSP认证20190302二十四点，提交以后一直只有20分，求大佬解答！！！

回复:
user: user-1
content: 我的代码能得几分~~~

user: user-2
content: 我也是的，我提交上去只有30分。后来我将自己实现的数组stack结构，改为c++标准模板库STL里的stack，就没有任何问题了，100分。  可能是我们自己用数组实现的栈结构不够完美吧，虽然我到现在都没有发现自己实现的栈结构有什么逻辑问题。。（也有可能是效率问题）  总之听过来人说：要考这变态的CCF，必须改掉一切一切的哪怕稍微一丁点不好的编程习惯，以及方言，以及即便是一个无伤大雅的小瑕疵，也可能让你的100分变成10分或5分或0分。能用标准的，就用标准。能用库的，就用库。能不投机取巧，就坚决不能投机取巧。能用最好的算法，就用最好的算法。

user: user-1
content: 这题之前有人贴过：https://bbs.csdn.net/topics/393536105

user: user-0
content: 引用 3 楼 赵4老师 的回复:[quote=引用 2 楼 VD7407 的回复:] [quote=引用 1 楼 赵4老师 的回复:] https://bbs.csdn.net/topics/380157851  没看懂什么意思，望赵老师解惑[/quote] 这个链接里面的代码难道不是算24点用的？[/quote] 我想问的是我的代码里有什么问题，您的那个帖子是算二十四点的，但答非所问啊

user: user-0
content: 引用 5 楼 user-4 的回复:错了，不需要浮点，那应该是运算的次序问题，必须先乘除后加减 用了一个简易的逆波兰，确实是先乘除后加减的，问题应该不是这个

user: user-3
content: 引用 2 楼 VD7407 的回复:[quote=引用 1 楼 赵4老师 的回复:] https://bbs.csdn.net/topics/380157851  没看懂什么意思，望赵老师解惑[/quote] 这个链接里面的代码难道不是算24点用的？

user: user-4
content: 错了，不需要浮点，那应该是运算的次序问题，必须先乘除后加减

user: user-4
content: 多半是除法的时候没用浮点结果错了，有除法要用浮点，最后算结果是否24的时候 只要结果在23.99-24.01之间就可以了

user: user-3
content: https://bbs.csdn.net/topics/380157851

user: user-0
content: 引用 1 楼 赵4老师 的回复:https://bbs.csdn.net/topics/380157851  没看懂什么意思，望赵老师解惑
user-0 提问: 在Linux环境下用C语言编写一个命令行下的局域网p2p聊天程序

回复:
user: user-1
content: 我觉得没那么复杂。 楼主已经限定了是局域网模式，也就是不存在nat穿透的问题。 通知其他用户忙碌或者空闲状态，可以通过udp广播的形式，广播使用广播地址255.255.255.255，楼主可以百度下。 至于点对点聊天，应该用tcp就可以了。每个用户端都建一个客户端一个服务端，如果有用户连上来，或者连接到另一个用户，就拒绝其他连接就可以了。 至于聊天记录，楼主可以用sqlite3在本地保存下。

user: user-2
content: P2P 之 UDP穿透NAT的原理与实现（附源代码） 这个源码就可以p2p了。

user: user-0
content: 能说下具体做这个程序需要哪些知识吗？大佬
user-0 提问: 急，递归函数的困惑

回复:
user: user-0
content: 好的👌，明白了。但感觉自己用递归写函数好难像，不知道有什么技巧

user: user-1
content: 看一下递归函数里当n为0时还会继续递归吗？  当n为0时，返回ans = 1然后直接从函数里返回，不会继续递归了吧

user: user-2
content: if (n > 0)     {         printf("n=%d\n", n);         ans = n * rfact(n - 1);         printf("ans=%ld\n", ans);         printf("n=%d\n", n);     }     else         ans = 1;    ===================  else         ans = 1;

user: user-0
content: 后面的打错了，是rfact
user-0 提问: 数组名做实参

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

user: user-2
content: 图2也是两个指针，double x[];编译器也是按照double *x处理的。形参x也是地址，数组名本身就是表示数组开始的位置，也是 数组的首地址。
user-0 提问: 无法编译运行

回复:
user: user-1
content: 应该是文件没了，  如果文件存在的话，尝试移除再添加（小心源文件真的没了）  ---  我记不得了，应该是文件被移除的问题

user: user-0
content: 路径对的，木得错误（我重启就。。bug吗

user: user-2
content: 引用 2 楼 提及 的回复:文件没了 文件没了 路径不对吗？查一下路径是否是对的

user: user-1
content: 文件没了 文件没了

user: user-2
content: 提示什么错误？
user-0 提问: C语言程序

回复:
user: user-1
content: 就是一个4*4的矩阵，y就是斜线的值。0 0， 1 1 ，2 2， 3 3

user: user-2
content: 1070就是取数组中间的斜线值值（矩阵的什么，其实有个专业术语的，忘了，基础题）

user: user-3
content: 选A 本题关键语句在于：b[i]=a[i][i]； 即b[0]=a[0][0] ｛1，2，3｝中的第一个元素 同理 可得出答案：1070

user: user-4
content: x是一个4*4的数组  fun函数给数组b赋值  第一次循环x[0][0]  1 第二次循环x[1][1]  0 第三次循环x[2][2]  7 第三次循环x[3][3]  0  最后循环打印数组y 1 0 7 0
user-0 提问: 小白求解

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

user: user-2
content: 《the C programming language》看书，多练习和多做总结，也做做笔记，另外多看看之前的笔记～

user: user-3
content: 10年磨一C 入门推荐谭浩强教授的C语言系列，有专门的练习书，挨个理解，挨个打，多来论坛逛逛.....等等
user-0 提问: txt文档数据提取保存

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

user: user-1
content: 仅供参考：//将当前文件夹下的所有.txt文件的第R行第C列(空格间隔)显示出来 #include <stdio.h> #include <stdlib.h> #include <string.h> char ln[256]; char fpn[256]; char c[256]; char *p; FILE *af; FILE *f; int L,n,R,C,i,j,k; int main(int argc,char **argv) {     if (argc>=3) {         R=atoi(argv[1]);         C=atoi(argv[2]);     } else {         fprintf(stderr,"Input R C:");         fflush(stderr);         scanf("%d%d",&R,&C);     }     system("dir /b /a-d /on *.txt >d:\\allfn.txt");     af=fopen("d:\\allfn.txt","r");     if (NULL==af) {         fprintf(stderr,"Can not open file d:\\allfn.txt!\n");         return 1;     }     while (1) {         if (NULL==fgets(ln,256,af)) break;         L=strlen(ln);         if ('\n'==ln[L-1]) ln[L-1]=0;         fprintf(stderr,"\nread %s\n",ln);         strcpy(fpn,ln);         f=fopen(fpn,"r");         if (NULL==f) {             fprintf(stderr,"Can not open file %s!\n",fpn);             fclose(af);             return 3;         }         for (i=0;i<R;i++) {             if (NULL==fgets(ln,256,f)) break;         }         if (i>=R) {             p=ln;             for (j=0;j<C;j++) {                 k=sscanf(p,"%s%n",c,&n);                 if (1==k) {                     p+=n;                     if (j==C-1) printf("%s ",c);                 } else break;             }         }         fclose(f);     }     fclose(af);     return 0; }

user: user-2
content: #include<io.h> ... FILE *pf = fopen("data.txt", "wb"); for(int i = 0; i < 1024; i++) {     fprintf(pf, "%f\n",  1.0); } fclose(pf);
user-0 提问: 不允许使用不完整的类型？

回复:
user: user-0
content: 我知道了，我太蠢了...第五行和第12行不应该有void。太粗心了！刚发出来就意识到了问题

user: user-1
content: 函数调用和声明是不一样的，调用就要去掉void  另外，“main”和“mian”的区别可以仔细的看一下。

user: user-2
content: 函数声明参数列表 写1是什么意思?
user-0 提问: c语言的一个小问题

回复:
user: user-1
content: 引用 4 楼 weixin_39885009 的回复:[quote=引用 1 楼 自信男孩的回复:]1处：p[j] = s[i];  因为p是用于存放数字，而j是其下标； 2处：k; 因为这个地方是用于将非数字追加到p+j的后面，因此这个循环应该是k； 3处：p;因为调整之后的字符串存放到了p中，所以最后输出的应该是p的地址。  可以前面p[j+k] = 0;可以知道，应该是输出p。  这个程序有一个问题，就是只有malloc没有free. p的释放在main中，因为main还需要用它，当用完之后就应该free掉。 另一个t，应该在fun函数里，return之前free掉。  但又说过来了，程序运行完会系统会把他malloc的内存释放掉，但是还是建议养成malloc/free的习惯 for循环i会从0循环到n-1，也就是说j+k是等于n的,但是p只有n个内存空间，所以p[n-1]是p的结束符，那么p[j+k]不就不存在吗。[/quote] 你思考一下j+k会大于n-1吗？

user: user-1
content: 引用 6 楼 weixin_39885009 的回复:[quote=引用 5 楼 自信男孩的回复:][quote=引用 4 楼 weixin_39885009 的回复:] [quote=引用 1 楼 自信男孩的回复:]1处：p[j] = s[i];  因为p是用于存放数字，而j是其下标； 2处：k; 因为这个地方是用于将非数字追加到p+j的后面，因此这个循环应该是k； 3处：p;因为调整之后的字符串存放到了p中，所以最后输出的应该是p的地址。  可以前面p[j+k] = 0;可以知道，应该是输出p。  这个程序有一个问题，就是只有malloc没有free. p的释放在main中，因为main还需要用它，当用完之后就应该free掉。 另一个t，应该在fun函数里，return之前free掉。  但又说过来了，程序运行完会系统会把他malloc的内存释放掉，但是还是建议养成malloc/free的习惯 for循环i会从0循环到n-1，也就是说j+k是等于n的,但是p只有n个内存空间，所以p[n-1]是p的结束符，那么p[j+k]不就不存在吗。[/quote] 你思考一下j+k会大于n-1吗？[/quote] 你的坚持是对的，你的分析也是对的，最后执行了n次，这个n是在有效长度的基础上加了1，加1没问题， 但是在第一个循环的时候不应该是i < n;而应该是i < n-1;因为最后的'\0'不参与，也不应该放到p, t中。因为最后有一个p[j+k]= 0;来 填充字符串结束标记。你的理解是对的，赞一个。 我想出题的人没有考虑到这一点。  根据你的理解，第二个地方就不能直接传k这么简单了，可以考虑填这个表达式：  (k > n-j-1 ? k-- : k) 我想出题人也不是想要这个答案，但是出题人出题有问题，也没办法，填这个表达式可以补救一下，不然会内存溢出。  加油吧～

user: user-0
content: 引用 5 楼 自信男孩的回复:[quote=引用 4 楼 weixin_39885009 的回复:] [quote=引用 1 楼 自信男孩的回复:]1处：p[j] = s[i];  因为p是用于存放数字，而j是其下标； 2处：k; 因为这个地方是用于将非数字追加到p+j的后面，因此这个循环应该是k； 3处：p;因为调整之后的字符串存放到了p中，所以最后输出的应该是p的地址。  可以前面p[j+k] = 0;可以知道，应该是输出p。  这个程序有一个问题，就是只有malloc没有free. p的释放在main中，因为main还需要用它，当用完之后就应该free掉。 另一个t，应该在fun函数里，return之前free掉。  但又说过来了，程序运行完会系统会把他malloc的内存释放掉，但是还是建议养成malloc/free的习惯 for循环i会从0循环到n-1，也就是说j+k是等于n的,但是p只有n个内存空间，所以p[n-1]是p的结束符，那么p[j+k]不就不存在吗。[/quote] 你思考一下j+k会大于n-1吗？[/quote] 第一个for循环会循环n次，每次j和k会至少有一个＋1，那j+k不是等于n吗

user: user-0
content: 引用 1 楼 自信男孩的回复:1处：p[j] = s[i];  因为p是用于存放数字，而j是其下标； 2处：k; 因为这个地方是用于将非数字追加到p+j的后面，因此这个循环应该是k； 3处：p;因为调整之后的字符串存放到了p中，所以最后输出的应该是p的地址。  可以前面p[j+k] = 0;可以知道，应该是输出p。  这个程序有一个问题，就是只有malloc没有free. p的释放在main中，因为main还需要用它，当用完之后就应该free掉。 另一个t，应该在fun函数里，return之前free掉。  但又说过来了，程序运行完会系统会把他malloc的内存释放掉，但是还是建议养成malloc/free的习惯 for循环i会从0循环到n-1，也就是说j+k是等于n的,但是p只有n个内存空间，所以p[n-1]是p的结束符，那么p[j+k]不就不存在吗。

user: user-0
content: for循环i会从0循环到n-1，也就是说j+k是等于n的,但是p只有n个内存空间，所以p[n-1]是p的结束符，那么p[j+k]不就不存在吗。

user: user-2
content: 感觉逻辑是这样的：把你的字符串在函数里分成数字和字母，在分别用不同的char*来指向，分完以后在把指向字母的加到指向数字的后面，j和k分别是数字和字母的个数，那p[j+k]就是结尾啊，因为第一位是0嘛（比如数字一个，字母一个，那就是j=1，k=1，那数组就是[0][1][2],[2]就是结尾，放结束符）

user: user-1
content: 1处：p[j] = s[i];  因为p是用于存放数字，而j是其下标； 2处：k; 因为这个地方是用于将非数字追加到p+j的后面，因此这个循环应该是k； 3处：p;因为调整之后的字符串存放到了p中，所以最后输出的应该是p的地址。  可以前面p[j+k] = 0;可以知道，应该是输出p。  这个程序有一个问题，就是只有malloc没有free. p的释放在main中，因为main还需要用它，当用完之后就应该free掉。 另一个t，应该在fun函数里，return之前free掉。  但又说过来了，程序运行完会系统会把他malloc的内存释放掉，但是还是建议养成malloc/free的习惯
user-0 提问: 求解

回复:
user: user-1
content: 写一个交换函数就明白了，若是传你说的普通变量，那么在交换的时候交换的是你传入的变量的拷贝，实际上达不到交换的期望，传指针的话，相当于是直接交换内存中那个地址存放的值，这样才起到交换作用。传指针也可以实现参数的传入传出，就是在A在调用的函数中修改变量后，后面继续对该变量操作时，其值已经得到修改。感觉自己说的很乱......

user: user-2
content: 引用 楼主 qq_45370071 的回复:指针、指针变量做形参和普通变量有何异同？ 指针变量给我一种浓浓的谭浩强味道的感觉

user: user-2
content: 引用 楼主 qq_45370071 的回复:指针、指针变量做形参和普通变量有何异同？ 指针、指针变量分别是什么意思？有什么区别？

user: user-3
content: 指针变量里存放的是地址，而是普通变量里存放的一般是具体的值。
user-0 提问: 四行代码求圆周率

回复:
user: user-1
content: 仅供参考：#include <stdio.h> long a=10000; long b; long c=2800; long d; long e; long f[2801]; long g; int main() {     for(;b-c;) f[b++]=a/5; //  while (1) { //      if (0==b-c) break; //      f[b]=a/5; //      b++; //  }      //f[0 - 2800] = 10000/5     for(;d=0,g=c*2;c-=14,printf("%.4d",e+d/a),e=d%a)           for(b=c;d+=f[b]*a,f[b]=d%--g,d/=g--,--b;d*=b); //  while (1) { //      d=0; //      g=c*2; //      if (0==g) break; //      b=c; //      while (1) { //          d+=f[b]*a; //          f[b]=d%--g; //          d/=g--; //          --b; //          if (0==b) break; //          d*=b; //      } //      c-=14; //      printf("%.4d",e+d/a); //      e=d%a; //  }  	return 0; }
user-0 提问: 大神求教，小白求救

回复:
user: user-1
content: 楼上的都说了，hour1  minute1  hour2 minute2  这四个值

user: user-2
content: 需要输入四个值，每两个是一组

user: user-3
content: 有啥不对的呢？ 你输入完两个值之后，回车，再输入两个值，再按回车，结果不就出来了吗？

user: user-4
content: 不是要输入4个值吗？

user: user-5
content: 楼上说得对，注意空格和回车，输入格式要和你scanf函数写的格式一样

user: user-6
content: 第一行scanf中有两个待输入的变量hour1 minute1，第二行还有两个待输入的变量hour2，minute2. 所以正确操作方法应该是：     在运行程序后，     输入第一个数（空格）输入第二个数（回车）输入第三个数（空格）输入第四个数（回车）。

user: user-7
content: 需要输入4个值，等待输入
user-0 提问: C语言的++运算符是被编译器重载过么，它是如何分辨参数的数据类型的

回复:
user: user-1
content: 整型浮点为什么没疑问 你以为整型的++ 和 浮点的++是一回事? 别说整型的++和浮点的++ 就是浮点内部的++ 浮点数的数值不同 ++ 的效果都不一样  编译器当然知道分辨各种类型 这本来就是编译器工作的基本内容啊
user-0 提问: C语音编程(手机编辑器)

回复:
user: user-0
content: 引用 2 楼 赵4老师的回复:Enter，Ctrl+Z，Enter 手机编辑没有ctrl+z，也试过^z，都没反应

user: user-1
content: 引用 3 楼 qq_45594029 的回复:[quote=引用 2 楼 赵4老师的回复:]Enter，Ctrl+Z，Enter 手机编辑没有ctrl+z，也试过^z，都没反应[/quote] 由此可见，手机编程本来就是个鸡肋。

user: user-1
content: Enter，Ctrl+Z，Enter

user: user-1
content: Ctrl+Z，Enter
user-0 提问: 数据结构大神求助

回复:
user: user-0
content: 引用 2 楼 阿大古 古古古 的回复：是想把插入位置以前的全部往前移动一位吗？感觉好奇怪。想在什么位置插入，直接修改那个位置的值不就行了吗，为什么还要去腾位置？这个是线性表 如果链表的话可以直接插入 如果直接修改值的话原始值就被覆盖 就不是插入操作了

user: user-1
content: 是想把插入位置以前的全部往前移动一位吗？感觉好奇怪。想在什么位置插入，直接修改那个位置的值不就行了吗，为什么还要去腾位置？

user: user-2
content: t是last，本身就是偏移一个数据了，那么t+1是偏移两个数据了吧  把函数调用也贴出来吧。贴代码，不建议发图片