Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 求实数绝对值，哪里出问题了啊

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: double对应的应该是“%lf”兄弟，改过来就对了

user: user-0
content: 引用 7 楼 儿童节的回复:上面的大神说得对，变量num的数据类型是float还是double，在用scanf输入的时候，格式符要匹配，否则数据会被截断而出现非正常结果。 另外，运行异常的主要原因是while循环条件的设置不对。具体说明如下： scanf()是C标准库stdio.h里面定义的用于获取用户输入的函数。 scanf的返回值是已经「成功」赋值的变量个数，也就是说，比如在「scanf("%d %d",&a,&b);」这个语句里，当用户输入「1（空格）2」时返回值是2，如果用户输入的是「1（空格） b」，那么返回值为1，如果输入的是「a（空格）b」，那么返回的是0。  所以，你上面的循环条件完全没有必要做取反（~）嘛，也就是说当输入的值「没有成功」赋值的时候，scanf的返回值是0，再按位取反，变成了表达式的值成了-1，而只要while()括号里不是0（假），while()循环就会继续，那你这还怎么结束循环呢？只有用Ctrl + C了。  所以，直接用while(scanf())就可以了，输入正常的时候，它就继续循环，输入不正常的时候，就会结束循环。   #include<stdio.h> #include <math.h> int main() {     float num;     while(scanf("%f",&num))     {         printf("%.2f\n",fabs(num));     }     return 0; }  嗯，谢谢，我知道哪里问题了

user: user-3
content: 上面的大神说得对，变量num的数据类型是float还是double，在用scanf输入的时候，格式符要匹配，否则数据会被截断而出现非正常结果。 另外，运行异常的主要原因是while循环条件的设置不对。具体说明如下： scanf()是C标准库stdio.h里面定义的用于获取用户输入的函数。 scanf的返回值是已经「成功」赋值的变量个数，也就是说，比如在「scanf("%d %d",&a,&b);」这个语句里，当用户输入「1（空格）2」时返回值是2，如果用户输入的是「1（空格） b」，那么返回值为1，如果输入的是「a（空格）b」，那么返回的是0。  所以，你上面的循环条件完全没有必要做取反（~）嘛，也就是说当输入的值「没有成功」赋值的时候，scanf的返回值是0，再按位取反，变成了表达式的值成了-1，而只要while()括号里不是0（假），while()循环就会继续，那你这还怎么结束循环呢？只有用Ctrl + C了。  所以，直接用while(scanf())就可以了，输入正常的时候，它就继续循环，输入不正常的时候，就会结束循环。   #include<stdio.h> #include <math.h> int main() {     float num;     while(scanf("%f",&num))     {         printf("%.2f\n",fabs(num));     }     return 0; }

user: user-0
content: 引用 1 楼 qq_44738203的回复:请不要在程序里添加表情包 输出有问题

user: user-0
content: 引用 3 楼 @风轻云淡_的回复:#include<stdio.h> #include <math.h> int main() { 	float num;//float与%f对应  double与%lf对应，不要弄混了 	while(~scanf("%f",&num)) 	{ 		printf("%.2f\n",fabs(num)); 	} 	return 0; }  或者 #include<stdio.h> #include <math.h> int main() { 	double num;//float与%f对应  double与%lf对应，不要弄混了 	while(~scanf("%lf",&num)) 	{ 		printf("%.2lf\n",fabs(num)); 	} 	return 0; }  好的，谢谢

user: user-0
content: 引用 1 楼 qq_44738203的回复:请不要在程序里添加表情包

user: user-4
content: #include<stdio.h> #include <math.h> int main() { 	float num;//float与%f对应  double与%lf对应，不要弄混了 	while(~scanf("%f",&num)) 	{ 		printf("%.2f\n",fabs(num)); 	} 	return 0; }  或者 #include<stdio.h> #include <math.h> int main() { 	double num;//float与%f对应  double与%lf对应，不要弄混了 	while(~scanf("%lf",&num)) 	{ 		printf("%.2lf\n",fabs(num)); 	} 	return 0; }

user: user-5
content: 把具体问题贴出来

user: user-6
content: 请不要在程序里添加表情包
user-0 提问: 求各位大佬帮看一下

回复:
user: user-1
content: scanf("%c%d",&ch); 明显少了&i

user: user-2
content: 或者直接在return 0前面加while(1);切记一点要打分号

user: user-2
content: 加上一个头文件#include<stdlib.h> 再在return 0前面加一句system("pause");

user: user-3
content: 帮顶帮顶帮顶帮顶

user: user-4
content: scanf (“%c%d”,&ch,&i);

user: user-5
content: 引用 57 楼 赖卓成 的回复: gc和VC是不一样的.

user: user-5
content: 引用 42 楼 qq_44738203 的回复:[quote=引用 34 楼 足球中国的回复:] 首选编译会出错 第二个scanf("%c%d",&ch); 你要为两个变量付，实际你只提了一个接收地址。 我用的vc6.0，可以编译，我的目的就是让另一个没有地址，但是我输入两个字母可以，一个字母一个数字就不行[/quote] 可以编译不代表可以运行。

user: user-6
content: 你试一下 system（“pause”）

user: user-7
content: 还没学会啊，我要多学习了

user: user-8
content: win7系统加一个system(“pause”);

user: user-9
content: scanf("%c%d",&ch,&i);

user: user-10
content: 你这个程序应该是要输入ch的地址，然后输出的是这个地址里的值，没结果应该是你输入的地址是空的，还有你输入量只有一个，你可以考虑删掉一个。如果你只是想看到输出，只需要将取地址ch和ch互换，即可。

user: user-11
content: scanf (“%c%d”,&ch,&i); 你之前的是少了一个接收数：&i

user: user-12

user: user-13
content: scanf (“%c%d”,&ch,&i);

user: user-14
content: 我一般使用system("pause")

user: user-15
content: 用system("pause")就好用了

user: user-16
content: 这个程序的作用是让你输入 一个 字符和一个整数，然后他输出字符和数字。  1.运行空白是因为你本来就没有让他输出什么东西，你可以在scanf前面一句加个printf("请输入一个字符和一个数字\n");作为提示，2.一下就关闭是因为软件特性 你可以按ctrl+F5运行程序。 至于你说的什么-xxxxxxxx没有明白。:p

user: user-17
content: &ch后面少了&i

user: user-18
content: 不知道怎么可以有积分
user-0 提问: 求大神告知以下程序输入123456789，其输出的结果是什么

回复:
user: user-0
content: 引用 3 楼 自信男孩的回复:可以自己试一下就知道结果是什么了。 我是c语言初学者，看到这一串有点懵

user: user-1
content: 可以自己试一下就知道结果是什么了。

user: user-2
content: 自己用vc6.0或者vs 或者其他支持c的开发环境运行就知道了

user: user-3
content: 12,56,789.000000
user-0 提问: acm2005为什么提交是wrong answer

回复:
user: user-0
content: 引用 1 楼 早打大打打核战争的回复:闰年判断的问题 谢谢

user: user-1
content: 闰年判断的问题

user: user-0
content: 引用 3 楼 自信男孩的回复:闰年判断条件不全，建议搜一下闰年的判断条件。 嗯啊，了解了，谢谢啦

user: user-2
content: 闰年判断条件不全，建议搜一下闰年的判断条件。
user-0 提问: 大佬求解答，这是出了什么问题

回复:
user: user-1
content: 第14行，三个%d，只给了一个值。

user: user-0
content: 引用 3 楼 哎哟，我的小黑猫还不会说 的回复：第14行，三个%d，只给了一个值。谢谢啦

user: user-0
content: 引用 1 楼 user-2 的回复：你peintf有三个占位符%d，但是只有一个参数sum，另外两个应该是随机值谢谢，确实少写了

user: user-2
content: 引用 1 楼 user-2的回复:你peintf有三个占位符%d，但是只有一个参数sum，另外两个应该是随机值 printf打错了，手机输入不方便

user: user-2
content: 你peintf有三个占位符%d，但是只有一个参数sum，另外两个应该是随机值
user-0 提问: 求一表达式的正确写法！

回复:
user: user-1
content: 引用 3 楼 我是瓶起子 的回复:[quote=引用 1 楼 sdghchj 的回复:] C语言的数据是直接用大括号初始化  void* (*a[])(void) = { (void*(*)(void))(m2) };  -------------------------------------------------- 需要指针指向函数指针数组[/quote]  逗噢，数组指针是需要指定数组长度的吧。   void* (*a[1])(void) = { };  void* (*(*p)[1])(void) = &a;    void* (*a[1])(void) = { };  void* (**p)(void) = a;

user: user-0
content: 引用 5 楼 早打大打打核战争 的回复:你要什么效果 ------------------------------ void (*(* a)[])(void) //为其赋值

user: user-2
content: 你要什么效果

user: user-0
content: 引用 2 楼 sdghchj 的回复: typedef void*(*Func)(void);  typedef void*(*FuncArray[])(void);  FuncArray a = { (Func)(m2) };   ---------------------------------------- a依然是一个数组，并非指针； (void*){ (Func)(m2) };

user: user-0
content: 引用 1 楼 sdghchj 的回复:C语言的数据是直接用大括号初始化  void* (*a[])(void) = { (void*(*)(void))(m2) };  -------------------------------------------------- 需要指针指向函数指针数组

user: user-1
content: typedef void*(*Func)(void);  typedef void*(*FuncArray[])(void);  FuncArray a = { (Func)(m2) };

user: user-1
content: C语言的数据是直接用大括号初始化  void* (*a[])(void) = { (void*(*)(void))(m2) };

user: user-2
content: 有问题是因为你 需要指针指向函数指针数组 ，但实际上m2是函数，这样 void m2() {}  void *mp[] = {m2}; void (*(* a)[])()={(void (*(*)[])())mp};  (*a)[0](); 就好了

user: user-0
content: 引用 10 楼 早打大打打核战争 的回复:应该是void (*(* a)[])(void)={(void (*(*)[])())m2}; ---------------------------------- void (*(* a)[])(void)={(void (*(*)[])())m2}; (*a)[0]();//这样调用会有问题的。

user: user-2
content: 应该是void (*(* a)[])(void)={(void (*(*)[])())m2};

user: user-1
content: 引用 8 楼 我是瓶起子 的回复:搞定了，正确答案是：void (*(* a)[])(void)=(void*){(void(*)(void))m2}; 优秀，虽然不知道你说的正确性在哪，但感觉好牛逼的样子

user: user-0
content: 搞定了，正确答案是：void (*(* a)[])(void)=(void*){(void(*)(void))m2};
user-0 提问: c语言头文件显示没有，求帮助

回复:
user: user-0
content: 引用 2 楼 @风轻云淡_的回复:把.c和.h文件放到同一个文件夹里面试试。你现在的情况应该是.h文件和.c文件不在同一个文件夹里，或者.h文件根本不存在。 感谢感谢，文件夹里就是没有。 (手动另一朵花🌺)

user: user-0
content: 引用 1 楼 棉猴的回复:那就到文件夹里面看看这两个头文件还在不？ 感谢感谢，文件夹里就是没有。 (手动玫瑰🌹)

user: user-1
content: 把.c和.h文件放到同一个文件夹里面试试。你现在的情况应该是.h文件和.c文件不在同一个文件夹里，或者.h文件根本不存在。

user: user-2
content: 那就到文件夹里面看看这两个头文件还在不？
user-0 提问: 数据结构新人提问

回复:
user: user-1
content: C语言貌似并没有提供数据结构的标准库，C++中倒是给出了STL，所以C语言中顺序表这个轮子要自己造。 SeqList.h只是自己写的文件，Seq是顺序sequence的缩写。既然是自定义的，书上当然就不会有。 要制作一个C顺序表，首先要造一个顺序表的结构体类： typedef struct c_sequence_list {     int arr[100];     int last; }cseqlist； 这个cseqlist就是我自己自定义的顺序表数据类型，要用它就像用int char之类的关键字一样用 cseqlist mylist;  就是用我自己造的数据类型cseqlist 创建一个名为mylist对象 要写出一个顺序表除了要给出一个cseqlist类型，还要给出针对这个顺序表定制的接口 比如这个顺序表要不要初始化，要不要销毁，要不要判断当前是否是空的，要不要判断当前是否已经满了 我们把结构体类型声明以及接口的声明放在一个cseqlist.h的头文件里， 然后在一个cseqlist.c文件里面写上#include "cseqlist.h" 并在后面加上接口函数的实现 比如： cseqlist.h里面： #ifndef C_SEQ_LIST_H #define C_SEQ_LIST_H  typedef struct c_sequence_list {     int arr[100];     int last; }cseqlist；  /* 添加一条数据到末尾 */ int cseqlist_append(cseqlist*, int);  #endif /* C_SEQ_LIST_H */  cseqlist.c里面： #include "cseqlist.h"  /* 添加一条数据到末尾 */ int cseqlist_append(cseqlist* csl, int data) {     /* 数据满了就无法继续添加，返回0表示添加失败 */     if (csl->last >= 100)          return 0;     /* 添加完数据后数据增多，last加1 */     csl->arr[csl->last++] = data;     /* 返回1表示成功 */     return 1; }  有诸多接口我们就不一一实现了  接下来如何使用这个顺序表呢： 比如现在有一个test.c #include <stdio.h> #include "cseqlist.h"  int main() {     /* 创建顺序表对象 */     cseqlist mylist;     /* 调用自己写的cseqlist_init接口初始化这个顺序表对象 */     cseqlist_init(&mylist);     /* 添加数据 */     cseqlist_append(&mylist, 1);     cseqlist_append(&mylist, 3);     cseqlist_append(&mylist, 5);     /* 恢复初始状态(即销毁) */     cseqlist_deinit(&mylist);     return 0; }  我们通常写一段程序都是写在一个.c文件里面，像这样把公共接口提取出来，可以提高代码复用率，比如我再写个main.c只要在代码中#include "cseqlist.h"就可以用cseqlist了，用不着重复写一遍。

user: user-2
content: 一个类A需要用到别一个类或是结构 B 的时候，A 为了知道 B 的结构，就需要调用的 B 结构的 定义文件  xxx.h

user: user-3
content: 引用 楼主 彼岸的诗.的回复:最近在自学数据结构，看到顺序表里有#include< SeqList.h>对头文件的引用，还有函数体里有SeqList myList这样的语句，看不懂是啥意思啊。看了看之前相关的帖子说这个是自定义的结构体，可是书上貌似并没有对这个结构体定义。所以这个到底代表什么意思，希望大佬解答一下，感激不尽。 。。。。。。肯定有定义啊！不然谁晓得头文件里函数有什么？也不晓得结构体里的成员有什么？

user: user-0
content: 引用 2 楼 o荞麦o的回复:一个类A需要用到别一个类或是结构 B 的时候，A 为了知道 B 的结构，就需要调用的 B 结构的 定义文件  xxx.h 意思是我在一个项目里定义了seqlist这个结构体，如果要引用它就要像这样.h是吗？

user: user-4
content: 书上没有很正常，一本好书是抛砖引玉教给你触类旁通的方法，而不是把所有能用到的全写在书里。看你发的这个头文件的名字，这应该是个有序的链表结构。无非是个有增删改查功能的链表，不懂的部分摘出来，新建个项目，移进去，慢慢的就明白了。

user: user-5
content: 建议学习C++版的数据结构。
user-0 提问: 萌新，计算问题，a |= 0x0002和a |= 0x0001;分别代表什么意思啊。。

回复:
user: user-1
content: 引用 6 楼 karl_xy 的回复:[quote=引用 4 楼 儿童节 的回复:] （1）竖线「|」是按位（或）运算符，具体的运算结果是「哪个位与1做按位或的运算，那个位就会变成1。」 （2）回到你的提问里，语句「a |= 0x0002;」的右边是十六进制数，值是十进制里的2，它在内存里的二进制编码（补码）的最后一个字节是0000 0010，前面的3个字节都是0就不谈了。 （3）那么根据上面第1点说的，具体运算是「哪个位与1做按位或的运算，那个位就会变成1」，那我们就来看看变量a是多少吧。假设a的值是1（十进制），它在内存里的二进制编码（补码）的最后一个字节就是0000 0001，同样，前面的3个字节都是0也不谈了，那么它与0x0002做按位或（|）运算的话，很明显嘛，它的最后一个字节的倒数第2个0就变成1了，而其它位不变，所以假如变量a的值是1的话，a | 0x0002 的结果就是，a的值变成了 3，因为0000 0011就是十进制的3嘛。《内存里的二进制存储是没有空格的，这里每4位一个空格只是为了美观。》 （4）那么同样的道理，对于语句「a | 0x0001;」，变量 a 与 0x0001 做按位或运算，而0x0001在内存里的二进制编码的最后一个字节是0000 0001，也就是最后一位是1，所以语句的结果就是 a 的二进制编码的最后一位数变成1。 那么，假设a的值是1（十进制），它的二进制编码的最后一个字节是0000 0001，那么按位或运算之后和运算之前是一样的，还是1；假设a的值是4（十进制），它的二进制编码的最后一个字节是0000 0100，那么按位或运算后，就变成了0000 0101，转换回十进制就是5了，也就是a的值就变成5了。 666 谢谢啦[/quote] 不用客气。 另外，还有一点点小的补充，就是上面的回答是针对你提问的「a |= 0x0002;」与「a |= 0x0001;」的，变量a最后是被赋值了的。只不过刚刚回答的时候写得有点儿急，有几个地方把赋值符号（=）漏写了，请不要混淆哈。 换句话说，如果是「a | 0x0002;」的话，那么只是这个表达式的值是变量a与0x0002做按位或运算的结果，但是变量a本身并没有被赋值，那么变量a的值并没有变。 祝学习进步！

user: user-0
content: 引用 4 楼 儿童节 的回复:（1）竖线「|」是按位（或）运算符，具体的运算结果是「哪个位与1做按位或的运算，那个位就会变成1。」 （2）回到你的提问里，语句「a |= 0x0002;」的右边是十六进制数，值是十进制里的2，它在内存里的二进制编码（补码）的最后一个字节是0000 0010，前面的3个字节都是0就不谈了。 （3）那么根据上面第1点说的，具体运算是「哪个位与1做按位或的运算，那个位就会变成1」，那我们就来看看变量a是多少吧。假设a的值是1（十进制），它在内存里的二进制编码（补码）的最后一个字节就是0000 0001，同样，前面的3个字节都是0也不谈了，那么它与0x0002做按位或（|）运算的话，很明显嘛，它的最后一个字节的倒数第2个0就变成1了，而其它位不变，所以假如变量a的值是1的话，a | 0x0002 的结果就是，a的值变成了 3，因为0000 0011就是十进制的3嘛。《内存里的二进制存储是没有空格的，这里每4位一个空格只是为了美观。》 （4）那么同样的道理，对于语句「a | 0x0001;」，变量 a 与 0x0001 做按位或运算，而0x0001在内存里的二进制编码的最后一个字节是0000 0001，也就是最后一位是1，所以语句的结果就是 a 的二进制编码的最后一位数变成1。 那么，假设a的值是1（十进制），它的二进制编码的最后一个字节是0000 0001，那么按位或运算之后和运算之前是一样的，还是1；假设a的值是4（十进制），它的二进制编码的最后一个字节是0000 0100，那么按位或运算后，就变成了0000 0101，转换回十进制就是5了，也就是a的值就变成5了。 666 谢谢啦

user: user-0
content: 引用 1 楼 user-4 的回复:按位“与或”运算符 (|) 将第一个操作数的每个位与第二个操作数的对应位进行比较。如果其中一个位是 1，则将对应的结果位设置为 1。否则，将对应的结果位设置为 0。 为什么不直接赋值 是1就赋值1 是0就赋值0 这样做有什么好处啊

user: user-1
content: （1）竖线「|」是按位（或）运算符，具体的运算结果是「哪个位与1做按位或的运算，那个位就会变成1。」 （2）回到你的提问里，语句「a |= 0x0002;」的右边是十六进制数，值是十进制里的2，它在内存里的二进制编码（补码）的最后一个字节是0000 0010，前面的3个字节都是0就不谈了。 （3）那么根据上面第1点说的，具体运算是「哪个位与1做按位或的运算，那个位就会变成1」，那我们就来看看变量a是多少吧。假设a的值是1（十进制），它在内存里的二进制编码（补码）的最后一个字节就是0000 0001，同样，前面的3个字节都是0也不谈了，那么它与0x0002做按位或（|）运算的话，很明显嘛，它的最后一个字节的倒数第2个0就变成1了，而其它位不变，所以假如变量a的值是1的话，a | 0x0002 的结果就是，a的值变成了 3，因为0000 0011就是十进制的3嘛。《内存里的二进制存储是没有空格的，这里每4位一个空格只是为了美观。》 （4）那么同样的道理，对于语句「a | 0x0001;」，变量 a 与 0x0001 做按位或运算，而0x0001在内存里的二进制编码的最后一个字节是0000 0001，也就是最后一位是1，所以语句的结果就是 a 的二进制编码的最后一位数变成1。 那么，假设a的值是1（十进制），它的二进制编码的最后一个字节是0000 0001，那么按位或运算之后和运算之前是一样的，还是1；假设a的值是4（十进制），它的二进制编码的最后一个字节是0000 0100，那么按位或运算后，就变成了0000 0101，转换回十进制就是5了，也就是a的值就变成5了。

user: user-2
content: 不是判断 是修改  把a的第2个bit设置为1 即 原先是1 不变 原先是0 修改为1

user: user-3
content: 判断第几位有1  你把 2 换成2进制就是10

user: user-4
content: 按位“与或”运算符 (|) 将第一个操作数的每个位与第二个操作数的对应位进行比较。如果其中一个位是 1，则将对应的结果位设置为 1。否则，将对应的结果位设置为 0。
user-0 提问: C语言基础题，希望大神能解释一下，详细一点。

回复:
user: user-1
content: 1.搞清楚各运算符的含义 2.搞清楚运算顺序 （搜索C语言运算优先级）  然后详细步骤大概就是1+2=3
user-0 提问: c语言对结构数组进行选择性修改出现问题

回复:
user: user-1
content: scanf("%c",&sel);  这句前面注意加上一句getchar();用于吸收上次输入残留在输入缓冲区里的换行符

user: user-2
content: 描述问题不对啊，你说你希望实现怎么样的现象，而现在出现了什么与预期不符的现象
user-0 提问: c语言版数据结构中INITLIST(&L) 中&作用是什么

回复:
user: user-1
content: 应该是引用吧

user: user-0
content: 引用 3 楼 自信男孩的回复:传L的地址到INITLIST函数里。L参数就是一个传入传出参数了。即传入L的地址到INITLIST函数内，可以在INITLIST函数里对L进行修改，并能够将修改之后的L带到调用函数里。 嗯嗯，明白了，谢谢哦

user: user-0
content: 引用 2 楼 @风轻云淡_的回复:这是取地址的意思，INITLIST(&L)应该是个初始化链表的函数，或者是增加节点或者初始化头结点，你必须要传给他链表头的真实地址，而不是一个拷贝，不然你所做的操作在离开这个函数的时候就没用了。其他的函数或许只是打印查找之用，不需要改变链表头结点的位置，所以不需要传递地址。例：  #include <stdio.h>  void AddNumOne(int num) { 	num += 5; }  void AddNumTwo(int* num) { 	*num += 5; }  int main() { 	int num=0;//这里和定义链表是一样的 	AddNumOne(num); 	printf("%-5d\r\n",num); 	AddNumTwo(&num); 	printf("%-5d\r\n",num); 	return 0; } 嗯嗯，明白了，谢谢啦

user: user-2
content: 传L的地址到INITLIST函数里。L参数就是一个传入传出参数了。即传入L的地址到INITLIST函数内，可以在INITLIST函数里对L进行修改，并能够将修改之后的L带到调用函数里。

user: user-3
content: 这是取地址的意思，INITLIST(&L)应该是个初始化链表的函数，或者是增加节点或者初始化头结点，你必须要传给他链表头的真实地址，而不是一个拷贝，不然你所做的操作在离开这个函数的时候就没用了。其他的函数或许只是打印查找之用，不需要改变链表头结点的位置，所以不需要传递地址。例：  #include <stdio.h>  void AddNumOne(int num) { 	num += 5; }  void AddNumTwo(int* num) { 	*num += 5; }  int main() { 	int num=0;//这里和定义链表是一样的 	AddNumOne(num); 	printf("%-5d\r\n",num); 	AddNumTwo(&num); 	printf("%-5d\r\n",num); 	return 0; }
user-0 提问: 超级小白求助！！！quq为啥我的字符串拷贝完了之后是乱码

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h>  char yes[]={'y','e','s','\0'}; char no[]={'n','o','\0'};  char na[20]; char ge[3]; char nu[8][13]; char ad[50]; int da[3];  typedef struct information{     char name[20];     char gender[3];     char number[8][13];     char address[50];     int date[3];     struct information *next; } information;  void exchange(information *p,information *q) {     char na2[20];     char ge2[3];     char nu2[8][13];     char ad2[50];     int da2[3];     int i,j; #if 0     memcpy(na,q->name,sizeof(q->name));     memcpy(ge,q->gender,sizeof(q->gender));     memcpy(nu,q->number,sizeof(q->number));     memcpy(ad,q->address,sizeof(q->number));     memcpy(da,q->date,sizeof(q->date));     memcpy(na2,p->name,sizeof(p->name));     memcpy(ge2,p->gender,sizeof(p->gender));     memcpy(nu2,p->number,sizeof(p->number));     memcpy(ad2,p->address,sizeof(p->address));     memcpy(da2,p->date,sizeof(p->date));     memcpy(p->name,na,sizeof(na));     memcpy(p->gender,ge,sizeof(ge));     memcpy(p->number,nu,sizeof(nu));     strcpy(p->address,ad);//就是这一步出现错误，将ad的值赋给p->address结果链表内的值输出之后是乱码     memcpy(p->date,da,sizeof(da));     strcpy(q->name,na2);     strcpy(q->gender,ge2);     strcpy(q->address,ad2);     for(i=0;i<=7;i++){         for(j=0;j<=13;j++){             p->number[i][j]=nu2[i][j];         }     }     for(i=0;i<=2;i++){         p->date[i]=da2[i];     } #else     memcpy(p, q, sizeof(information)); #endif     //printf("%s\n",ad);//这个是用来检查错误的     printf("%s\n", p->address);//这个是用来检查错误的 }  试一下这种方法。

user: user-0
content: 好像就是字符串赋给数组的时候出问题啦！！！我该怎么办呀orz
user-0 提问: C语言标准库

回复:
user: user-1
content: msdn网站。旧版（不推荐）有vc6的、很小 cplusplus网站。cplusplus-2013-8-8.chm、离线版  自己去搜“c语言函数查询”、有一些小站有中文的、不推荐。
user-0 提问: 萌新求助！！写了一个纸牌游戏，有个地方一直出错，求大神指点！！

回复:
user: user-0
content: 引用 7 楼 单眼皮的小健的回复:[quote=引用 6 楼 五月天下第一 的回复：][quote=引用 5 楼 单眼皮的小健的回复:][quote=引用 3 楼 五月天下第一 的回复：]改过之后。。 scanf之后马上以字符形式输出看看是否输入成功[/quote] 十分感谢！清除缓冲区之后就可以了，谢谢大佬[/quote]要不要结题赚个积分？[/quote] emm怎么弄啊，第一次发帖不太会。。

user: user-1
content: 引用 6 楼 五月天下第一 的回复：[quote=引用 5 楼 单眼皮的小健的回复:][quote=引用 3 楼 五月天下第一 的回复：]改过之后。。 scanf之后马上以字符形式输出看看是否输入成功[/quote] 十分感谢！清除缓冲区之后就可以了，谢谢大佬[/quote]要不要结题赚个积分？

user: user-0
content: 引用 5 楼 单眼皮的小健的回复:[quote=引用 3 楼 五月天下第一 的回复：]改过之后。。 scanf之后马上以字符形式输出看看是否输入成功[/quote] 十分感谢！清除缓冲区之后就可以了，谢谢大佬

user: user-1
content: 引用 3 楼 五月天下第一 的回复：改过之后。。 scanf之后马上以字符形式输出看看是否输入成功

user: user-1
content: 引用 3 楼 五月天下第一 的回复：改过之后。。 强制转换可以删掉，不需要，另外，每次的scanf都涉及缓冲区问题，每次用完scanf，都清空缓冲区，目的的清除输入的enter键，清除缓冲区的方法自己搜一下

user: user-0
content: 改过之后。。

user: user-0
content: emm...试了一下这个地方确实不对，然而在这个程序里面改了之后还是会输出别的东西。。。下面贴一张改过之后的图吧。。

user: user-1
content: play1[i]那改为play1[i]=num[i]-‘0’，字符的1并不是十进制的1，你把一个字符1赋值给整型，结果不是你要的效果
user-0 提问: 请问这道题用C语言怎么写?

回复:
user: user-1
content: std::string contactString(std::string str1, std::string str2) { 	if (str2.length() == 0) return str1; 	std::string result, tmp; 	size_t npos = 0; 	do { 		npos = str1.find(str2[0], npos); 		if (npos == std::string::npos) { 			result = str1 + str2; 			break; 		} 		 		tmp = str1.substr(npos); 		if (strstr(str2, tmp) == &str2[0]) {//如果tmp是str2的子字符串,并且子字符串的首地址为str2的首地址 			result = str1.substr(0, npos) + str2; 			break; 		} 		 		npos++; 	} while(1); 	 	return result; } 只想到这个方法，不知道有没有更好的。

user: user-2
content: 在一个循环里遍历两个字符串，第一个从头向尾遍历，第二个从尾向头遍历，直到他们出现不同字符的时候，把第二个字符串遍历的字符添加到第一个字符串的尾部。

user: user-3
content: 參考看看囉:  #include "test.h" #include <stdio.h> #include <string.h> #include <stdlib.h>  char* concateSubstring(char* str1, char* str2) { 	int len1 = (int)strlen(str1); 	int len2 = (int)strlen(str2); 	 	int subStart = 0; 	int subLen = 0; 	 	// Find the shared substring in str1 and str2 	for (int j = subStart; j < len1; j++) 	{ 		for (int i = 0; i < len2; i++) 		{ 			if (subStart + i >= len1) 			{ 				// Reach the end of string 1 				break; 			} 			 			if (str1[subStart + i] != (str2[i])) 			{ 				subLen = 0; 				break; 			} 			subLen++; 		}  		if (subStart + subLen >= len1) 		{ 			// Reach the end of string 1 			break; 		} 		 		subStart++; 	} 	 	printf("Substring start: %d, length: %d\n", subStart, subLen);  	int resultLen = len1 + len2 - subLen + 1; 	char* result = (char*)malloc(resultLen); 	strncpy(result, str1, resultLen); 	strncat(result, str2 + subLen, resultLen); 	 	printf("Result string: %s\n", result); 	 	return result; }

user: user-4
content: 这里面还有BUG、有些地方没考虑完善、部分代码还需要优化，剩下的都交给你啦，加油。

user: user-4
content: //思路：判断B串首字符在A串中位置，匹配成功后，进入子循环，查看是否完全匹配。 //如果是，记录匹配位置，跳出循环，进行拼接；不是，继续下次循环，直至主串循环结束  char* ContactStr(const char* srcStr,const char* newStr,bool isOrder) { 	if(NULL == srcStr || NULL == newStr) 		return NULL;  	if(isOrder)//TODO:哪个字符串作为主字符串，暂定为true 	{ 		char first = newStr[0]; 		size_t startPos = strlen(srcStr);//默认为在主串尾进行拼接 		for(size_t len = 0;len < strlen(srcStr);++len) 		{ 			if(srcStr[len] == first)//找到首字符匹配位置，进入子循环 			{ 				bool isMatch = true; 				for(size_t tmpLen = len,newLen = 0;tmpLen < strlen(srcStr) && newLen < (strlen(newStr)-len);++tmpLen,++newLen) 				{ 					if(srcStr[tmpLen] != newStr[newLen]) 						isMatch = false; 				} 				if(true == isMatch) 				{ 					startPos = len; 					break; 				} 			} 		}  		//拼接新字符串 		size_t size = strlen(srcStr)+strlen(newStr)+5; 		char* str = new char[size]; 		memset(str,0,size); 		size_t len = 0; 		for(size_t i = 0;i < startPos && len < size;++i,++len) 		{ 			str[len] = srcStr[i]; 		}  		for(size_t i=0;i<strlen(newStr) && len < size;++i,++len) 		{ 			str[len] = newStr[i]; 		}  		str[len] = '\0';  		printf("%s",str);  		delete[] str; 		return NULL;//如返回str，不要忘记释放内存 	} }

user: user-5
content: 最简单的方法就是扫两遍，第一次循环确认重复字符串的长度，第二次循环拼接字符串，但效率不高
user-0 提问: 关于图像像素问题

回复:
user: user-1
content: 你这又是一点不写，等现成的啊。兄弟、以后的路还很长。

user: user-2
content: 引用 3 楼 l11513 的回复:不是我不想写，而是根本不会。我也想写但是看了很多代码还是不懂。 这个理由不错~~

user: user-0
content: 不是我不想写，而是根本不会。我也想写但是看了很多代码还是不懂。
user-0 提问: 求救C char返回值突然变了

回复:
user: user-1
content: #include <stdio.h>  char *aaa(char *s);  int main(void) {     char a[] = "ABCD";      printf("%s\n", aaa(a));     return 0; }  char *aaa(char *s) {     return (s); } 测试了，没有发现问题，正常输出。  建议贴出完整代码
user-0 提问: 刚学WM_PAINT，放大或缩小窗口后画面乱七八糟的

回复:
user: user-1
content: Win32 SDK方式编程已经过时了，了解下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder书籍下载： https://pan.baidu.com/s/13n9hxwVj9ai1p5L2rQC83Q

user: user-2
content: 绘制的时候 FillRect 先下填充背景色

user: user-0

user: user-0
user-0 提问: C语言并列成绩排序问题

回复:
user: user-1
content: 最简单的办法是先按名字排一次序，然后再用稳定的排序算法按成绩排一次序，这样就行了。稳定的排序算法在遇到两个值相等时不会改变两个值的位置关系。我没记错的话，冒泡排序就是稳定的，所以你先把名字排一次，再排分数就行了。

user: user-2
content: 在排序时遇到相等的，再按照名字交换顺序

user: user-3
content: 第一轮排序很简单的，你应该已经明白。第二轮排序应该是这样：扫描整个序列，遇到重复时记下重复部分的起止位置，在这两个位置之间再做一次排序，直到扫描完毕。
user-0 提问: 求助！C语言中求图的两个点a与b之间的最短路径，若存在多条最短路径，如何输出字典序最小的一条路径序列？

回复:
user: user-1
content: 我也遇到了，也不会。【问题描述】    给定一个含权的无向图，顶点编号为1~n，你的任务为找出顶点1到顶点 n 之间的最短路径。  【输入形式】    输入的第一行为两个整数 n 和 m (2 ≤ n ≤ 105,  0 ≤ m ≤ 105)，其中 n 为顶点数，m 是边数。     接下来的 m 行包含用形式 ai、bi 和 wi (1≤ai、bi ≤n，1≤ wi ≤ 106)，这里ai、bi 是边的端点，而 wi 是边的长度。     该图可能包括环，或者一对顶点之间包含多条边。  【输出形式】    如果无路径，输出-1，否则输出最短路径，如果有多个，则输出字典序最小的路径。     对于两个整数序列 A (a1、a2、...)和 B (b1、b2、...)，称序列 A 字典序小于序列 B 当且仅当，存在 k ≥ 1，i <k 时，ai = bi，i =k 时，ai < bi 。
user-0 提问: 奇数项求和

回复:
user: user-1
content: 引用 2 楼 ╰ 过客.☁的回复:引用 1 楼 user-6 的回复：2.51的答案是怎么来的？1+1/3+1/5+………+1/21 那我觉得是你的答案错了，程序应该没问题，你用计算器再算一遍看看。

user: user-2
content: 我算的结果也是这个2.180875 代码与计算结果

user: user-3
content: 引用 5 楼 niiiloc 的回复:我估计题目是计算前N个奇数倒数之和，而你的实现是1~N中的所有奇数倒数之和。 你的程序输入44的话，答案倒是2.51。  要修改的话也很简单，for 循环条件改下就好了。 厉害，竟然能够还原真题

user: user-4
content: 程序没发现什么问题。

user: user-5
content: 我估计题目是计算前N个奇数倒数之和，而你的实现是1~N中的所有奇数倒数之和。 你的程序输入44的话，答案倒是2.51。  要修改的话也很简单，for 循环条件改下就好了。

user: user-0
content: 引用 1 楼 user-6 的回复：2.51的答案是怎么来的？1+1/3+1/5+………+1/21

user: user-6
content: 2.51的答案是怎么来的？
user-0 提问: C语言新手关于共用体的疑惑

回复:
user: user-1
content: 引用 5 楼 自信男孩 的回复:共用体的占用内存大小是有成员中占用最多的内存。即不像结构体，结构体是所有成员占用内存之和。 两句话都说错了 共用体内存大小是保证足够存下最大成员 没限制是最大成员的大小 结构体内存大小是保证足够存下所有成员 没限制是所有成员之和

user: user-2
content: 共用体的占用内存大小是有成员中占用最多的内存。即不像结构体，结构体是所有成员占用内存之和。  由于是成员中最大的内存，因此共用体只要修改其中一个成员，都会修改他们公用的内存值。

user: user-3
content: 这段内存有且只有一个成员有真实意义

user: user-4
content: 就是説，按占用空間最大的成員分配内存，同一時間只有一個成員有效。

user: user-5
content: 一个盒子可以放核桃，苹果，西瓜，菠萝等，但同时只能放一种水果

user: user-6
content: union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员 假设一个union里有三个变量，并列排：（n short int，c[]字符数组，f float型变量） 第一字节 第二字节 第三字节 第四字节 …… n的低八位 n的高八位 c[0] c[1] c[2] c[4] …… f第一字节 f第二字节 f第三字节 f第四字节 float 占前四个 short int 占前两个 char 数组占前十个 都是从第一个字节开始的。也就是说，只要改变数组前四个元素的值，就能同时改变n和f的值。
user-0 提问: c语言

回复:
user: user-1
content: #include <stdio.h>   int main(void) {         int a,b,c;         printf("Please enter 3 numbers:");         scanf("%d,%d,%d",&a,&b,&c);         //ab=a+b；         //ac=a*c；         printf("a+b+c=%d\n",a+b+c);         //printf("a*b*c=%d\n",a+c*b);         printf("a*b*c=%d\n", a *c*b);          return 0; }  供参考！  测试时注意输入数据间加上逗号。
user-0 提问: 使用live555的testRTSPClient，打开流，收不到数据

回复:
user: user-1
content: 在调用sendDescribeCommand的时候可以加入鉴权信息 	Authenticator *pAuthenicator = NULL;  	if (!strUserName.empty() && !strPassword.empty()) 	{ 		pAuthenicator = new Authenticator(strUserName.c_str(), strPassword.c_str()); 	}  	pRtspClient->sendDescribeCommand(continueAfterDESCRIBE, pAuthenicator);  	if (pAuthenicator != NULL) 	{ 		delete pAuthenicator; 	}

user: user-0
content: 跟vlc的log做了对比，找到了问题原因  live555的testRTSPClient内，默认未对url的用户名密码做处理，在openURL时，sendDescribeCommand要带权限信息  至于怎么加，还在研究中，有处理过的朋友麻烦回复下
user-0 提问: c语言怎么求素数

回复:
user: user-1
content: 程序写错了吧，第一个for循环应该是m++

user: user-2
content: 引用 3 楼 @风轻云淡_ 的回复:m是表示100到300 的数，用来作为被除数，只要能被除了它自己和1之外的其他数整除，此数就不是素数。k作为最大因子（不知道为什么是开方，可以查查百度），提高效率之用，只要超过k还没有被整除，则无需再往下进行。i作为因子，m除以从2开始到它最大因子，在此之间，m能被i整除就跳出循环，m不是素数。此外，第一次循环时，i++可以改为i+=2，减少循环次数。 最后说错了，是第一层循环里， 不是i+=2，是k+=2.

user: user-2
content: m是表示100到300 的数，用来作为被除数，只要能被除了它自己和1之外的其他数整除，此数就不是素数。k作为最大因子（不知道为什么是开方，可以查查百度），提高效率之用，只要超过k还没有被整除，则无需再往下进行。i作为因子，m除以从2开始到它最大因子，在此之间，m能被i整除就跳出循环，m不是素数。此外，第一次循环时，i++可以改为i+=2，减少循环次数。

user: user-3
content: i不是循环变量吗？ 对于这个问题，需要了解素数的原理，所以建议先了解一下素数的定义和特性。

user: user-2
content: 引用 5 楼 niiiloc 的回复:程序写错了吧，第一个for循环应该是m++尴尬，我太马虎了，确实应该是m++    可以把m++ 改为m+=2

user: user-4
content: m是表示从101加1到300的数，k是m的开方（即如果m是144，k就是12），i表示从2开始加1到m。素数的性质就是除了1和它本身不再有其他因数，所以如果m处以i（2以上的数）能整除，m就不是素数。
user-0 提问: C语言

回复:
user: user-1
content: 引用 4 楼 自信男孩 的回复：printf中a++操作是a++的整体作为实参传入printf中，比如a=5；那么传入printf的值就是5，执行完printf后a的值是6;+1

user: user-2
content: printf中a++操作是a++的整体作为实参传入printf中，比如a=5；那么传入printf的值就是5，执行完printf后a的值是6;

user: user-3
content: 不知道怎么回答。printf只是把当前a的结果打印出来，但是a的值已经自增了1。所以绝对不能说是相当于不计算，只是你没把它最终的结果显示出来而已

user: user-4
content: 是呀，这都被你发现了

user: user-5
content: 我觉得应该这样理解，a++,先执行操作后再加一，所以说是先输出a，然后a再加一了
user-0 提问: 求各位大佬帮小弟改一下

回复:
user: user-0
content: 大哥们 我又重写了一下 还是错误 如果输入字符 就各种循环 #include<stdio.h> #include<stdlib.h> float weght; float height; float bmi; float a; void cal(); //计算 void prf(); //打印 void scf(); //输入 int s1; int s2;//判断是否输入正确 int main() { 	scf(); 	prf(); } void scf() { 	printf("请输入您的体重（kg）: "); 	s1=scanf_s("%f", &weght); 	if (s1!=1) 	{ 		printf("输入错误，请重新输入！"); 		scf(); 	} 	else 	{ 		printf("请输入您的身高(m):"); 		s2=scanf_s("%f", &height); 		if (s2!=1) 		{ 			printf("输入错误，请重新输入！"); 			scf(); 		} 		else 		{ 			cal(); 		} 	}  } void cal() { 	a = height * height; 	bmi = weght / a; 	prf(); } void prf() { 	if (bmi < 18.5) 	{ 		printf("您的BMI为%f,处于过轻（<18.5）注意您的饮食健康!\n", bmi); 		system("pause"); 	} 	else if (bmi <= 23.9) 	{ 		printf("您的BMI为%f,处于正常（18.5-23.9）注意保持体重!\n", bmi); 		system("pause"); 	} 	else if (bmi <= 27) 	{ 		printf("您的BMI为%f,处于过重（24-27）注意您的饮食健康!\n", bmi); 		system("pause"); 	} 	else if (bmi <= 32) 	{ 		printf("您的BMI为%f,处于肥胖（28-32）注意您的饮食健康!\n", bmi); 		system("pause");   	} 	else if (bmi > 32) 	{ 		printf("您的BMI为%f,处于非常肥胖（高于32）注意您的饮食健康!\n", bmi); 		system("pause"); 	} }

user: user-1
content: 判断scanf_s的返回值，如果输入的是数字，那么它应该返回1(因为只有一个%f)，否则表示输入的格式不对

user: user-2
content: 判断输入的类型，如果为字符型，执行报错，再次输入
user-0 提问: 时间复杂度

回复:
user: user-1
content: 时间复杂度主要跟循环次数有关，怎么可能跟i++相关呢

user: user-2
content: 执行次数和时间复杂度对象是算法，如果就这个i++而言，它只是一个语句，执行次数为1，时间复杂度为O（1）
user-0 提问: 输入年月日，输出的是该年的第几天

回复:
user: user-1
content: 楼上正解，加个=就行了

user: user-2
content: 写少了一个=，c语言比较是否相同用两个等号==，一个等号是赋值，所以提示出错了，加上=就行
user-0 提问: 救救孩子吧

回复:
user: user-0
content: 好的好的，我知道了，谢谢

user: user-1
content: 也就是说disc<0，无解  你可以叫一个判断，简单的if else 结构就行

user: user-1
content: 你输入的值不满足disc>0，的条件
user-0 提问: 求高手，前辈们指点迷津。

回复:
user: user-0
content: 引用 7 楼 单眼皮的小健 的回复：引用 6 楼 qq_44696912 的回复：引用 1 楼 单眼皮的小健 的回复：csdn很多这个代码，搜一搜就能找到搜不到，已经绝望。进入我博客主页加我联系方式，可以聊一下哥，联系方式多少？找不到啊？

user: user-0
content: 引用 13 楼 六道佩恩 的回复：1. 二分查找可以用有序数组或二叉搜索树（BST），前者的话，从中间开始判断，每次就可以缩小一半范围。 2. 学号、姓名、成绩都是数据，人多的话创建不同的数组即可，但不方便，所以你做一个结构体，容纳一个学生的各种数据。 3. 结构体就是个你自定义的类型，用它定义的变量就是结构体变量，这个变量可以存储多种数据。数组就是很多个挨着的变量。如果你是用数组的形式，假如这个数组是  ABCDE，你要删除C，只需把DE往左移动一个位置即可，就变成了ABDEE，由于你记录的5个数据，删了一个编程4个，所以对你来说只有ABDE四个数，相当于完成了删除。我不会增加，不会删除。删除后我怎么输出，还是个难题啊

user: user-1
content: 表示我学校也有这个大作业，已写完的我，不知道怎么回答，因为代码实在有点多…

user: user-2
content: 1. 二分查找可以用有序数组或二叉搜索树（BST），前者的话，从中间开始判断，每次就可以缩小一半范围。 2. 学号、姓名、成绩都是数据，人多的话创建不同的数组即可，但不方便，所以你做一个结构体，容纳一个学生的各种数据。 3. 结构体就是个你自定义的类型，用它定义的变量就是结构体变量，这个变量可以存储多种数据。数组就是很多个挨着的变量。如果你是用数组的形式，假如这个数组是  ABCDE，你要删除C，只需把DE往左移动一个位置即可，就变成了ABDEE，由于你记录的5个数据，删了一个编程4个，所以对你来说只有ABDE四个数，相当于完成了删除。

user: user-0
content: 引用 8 楼 weixin_44414105 的回复：去网上参考一下 再自己调试调试哎

user: user-0
content: 引用 9 楼 stone dream 的回复：表示我学校也有这个大作业，已写完的我，不知道怎么回答，因为代码实在有点多…崩溃…

user: user-0
content: 引用 1 楼 单眼皮的小健 的回复：csdn很多这个代码，搜一搜就能找到根本找不到

user: user-3
content: 去网上参考一下 再自己调试调试

user: user-4
content: 引用 6 楼 qq_44696912 的回复：引用 1 楼 单眼皮的小健 的回复：csdn很多这个代码，搜一搜就能找到搜不到，已经绝望。进入我博客主页加我联系方式，可以聊一下

user: user-0
content: 引用 1 楼 单眼皮的小健 的回复：csdn很多这个代码，搜一搜就能找到搜不到，已经绝望。

user: user-0
content: 引用 2 楼 focuslight 的回复：别忘了二分查找要先排序  百度 学生成绩管理 C代码我这个楼主心已死。

user: user-0
content: 引用 3 楼 自信男孩 的回复：建议自己先写写，要么在网上copy一下代码，先改改。不明白或者调试不好的可以把代码贴出来问。绝望

user: user-5
content: 建议自己先写写，要么在网上copy一下代码，先改改。不明白或者调试不好的可以把代码贴出来问。

user: user-6
content: 别忘了二分查找要先排序  百度 学生成绩管理 C代码

user: user-4
content: csdn很多这个代码，搜一搜就能找到
user-0 提问: C语言数数问题！

回复:
user: user-1
content: 引用 4 楼 自信男孩 的回复:[quote=引用 2 楼 gh_99 的回复:] 代码要自己花时间去学习。  #include<stdio.h> #include<stdlib.h> #include<time.h> int x,y; int main() { int guess(int num),a,b; //修改处  printf("请甲开始猜数"); guess (1); printf("甲猜了%d次",x); //修改处 printf("请乙开始猜数"); guess (2); printf("乙猜了%d次",y); //修改处 if(a>b) printf("乙获胜"); else printf("甲获胜"); return 0; } int guess(int num) { int magic,i,n; i=0; srand(time(0)); magic=rand()%10+1; while(1) { scanf("%d",&n); i++; if(magic==n) break; if(magic<n) printf("大了"); if(magic>n) printf("小了"); } if(num==1) //修改处 x=i; if(num==2) //修改处 y=i; return magic; }   判断最后的胜负跟a, b有关系吗？另外如果x和y相等呢[/quote] 对啊，还是你看的仔细。刚刚疏忽了。

user: user-2
content: 引用 2 楼 gh_99 的回复:代码要自己花时间去学习。  #include<stdio.h> #include<stdlib.h> #include<time.h> int x,y; int main() { int guess(int num),a,b; //修改处  printf("请甲开始猜数"); guess (1); printf("甲猜了%d次",x); //修改处 printf("请乙开始猜数"); guess (2); printf("乙猜了%d次",y); //修改处 if(a>b) printf("乙获胜"); else printf("甲获胜"); return 0; } int guess(int num) { int magic,i,n; i=0; srand(time(0)); magic=rand()%10+1; while(1) { scanf("%d",&n); i++; if(magic==n) break; if(magic<n) printf("大了"); if(magic>n) printf("小了"); } if(num==1) //修改处 x=i; if(num==2) //修改处 y=i; return magic; }   判断最后的胜负跟a, b有关系吗？另外如果x和y相等呢

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<time.h>  int guess(int num); int x,y; int main() {     //int a,b;      printf("请甲开始猜数");     guess (1);     //printf("甲猜了%d次",&x);     printf("甲猜了%d次\n", x);     printf("请乙开始猜数");     guess (2);     //printf("乙猜了%d次",&y);     printf("乙猜了%d次\n", y);     //if(a>b)     if(x > y)         printf("乙获胜\n");     else if (x == y)         printf("The same times!\n");     else         printf("甲获胜\n");     return 0; } int guess(int num) {     //int magic,i,n;     int magic, i = 0,n;     srand(time(0));     magic = rand()%10+1;     while(1)     {         scanf("%d",&n);         i++;         if(magic==n)             break;         if(magic<n)             printf("大了");         if(magic>n)             printf("小了");     }     //if(num=1)     if(num==1)         x = i;     //if(num=2)     if(num==2)         y = i;     return magic; }  供参考

user: user-1
content: 代码要自己花时间去学习。  #include<stdio.h> #include<stdlib.h> #include<time.h> int x,y; int main() { int guess(int num),a,b; //修改处  printf("请甲开始猜数"); guess (1); printf("甲猜了%d次",x); //修改处 printf("请乙开始猜数"); guess (2); printf("乙猜了%d次",y); //修改处 if(a>b) printf("乙获胜"); else printf("甲获胜"); return 0; } int guess(int num) { int magic,i,n; i=0; srand(time(0)); magic=rand()%10+1; while(1) { scanf("%d",&n); i++; if(magic==n) break; if(magic<n) printf("大了"); if(magic>n) printf("小了"); } if(num==1) //修改处 x=i; if(num==2) //修改处 y=i; return magic; }

user: user-3
content: printf中如果输出变量的值不需要&符号，&是取变量地址的意思，把&去掉
user-0 提问: 关于头插法建立链表的问题求解答

回复:
user: user-0
content: [quote=引用 2 楼 @风轻云淡_ 的回复:谢谢老哥   struct node*creatlist(void) { 	struct node*head,*p; 	int x; 	head=(struct node*)malloc(LEN);//这里你只申请了节点空间，没有给它赋值，打印的时候却把它打印了，可不就是随机值吗 	head->next=NULL; 	scanf("%d",&x); 	while(x!=0) 	{ 		p=(struct node*)malloc(LEN); 		p->data=x; 		p->next=head->next; 		head->next=p; 		scanf("%d",&x); 	} 	return head; } //两种解决办法：第一种给它赋值即可正常打印； //第二种打印的时候跳过头结点，让它作为不存储数据的头结点(你的插入方式更适合这一种)。 //两种你随便选一种就好了 [/quote]

user: user-1
content: struct node*creatlist(void) { 	struct node*head,*p; 	int x; 	head=(struct node*)malloc(LEN);//这里你只申请了节点空间，没有给它赋值，打印的时候却把它打印了，可不就是随机值吗 	head->next=NULL; 	scanf("%d",&x); 	while(x!=0) 	{ 		p=(struct node*)malloc(LEN); 		p->data=x; 		p->next=head->next; 		head->next=p; 		scanf("%d",&x); 	} 	return head; } //两种解决办法：第一种给它赋值即可正常打印； //第二种打印的时候跳过头结点，让它作为不存储数据的头结点(你的插入方式更适合这一种)。 //两种你随便选一种就好了

user: user-0
content: 还有这个尾插法建立链表的 头指针的data值也是乱的 怎么解决啊

user: user-2
content: 可以这样head=Null;(这个是在开始赋值的） p->next=head;然后这就是两步骤,此时的head   也就有data值 head=p;
user-0 提问: c语言新入行，不知道是一入c语言深似海，从此爱情是路人；还是从入行到放弃

回复:
user: user-1
content: c语言是编程入门必学的，深学是很有难度的。因为他不是面向对象的。如果不是特殊要求，我建议你c入门去学习c++,初学者通常是分不清语言到底有啥区别，也不知道该去学什么语言。很正常。不过你需要知道的就是，一旦你c++学的很好，你就会发现，有了c++的底子，你学其他任何语言入门只需要1天左右，但你如果你从别的语言在转到c++说实话，是很有难度的。时间久了你就会发现，有些语言是很带有一些风格的，这就好像go语言。合适的人特别合适，不合适的人用着贼难受。所以呢，如果你是新手的话，就别想别的了，c是必学的，不会指针，不懂内存就如同不会编程一样。
user-0 提问: c语言的一道题

回复:
user: user-1
content: 为什么不自己写写呢，不是很难呢    #include <stdio.h> #include <string.h> #include <ctype.h>  int main() {     char str[16], num_list[16];     unsigned int num, i, j=0;      scanf("%s", str);      for (i = 0; i < strlen(str); i++)         if (isdigit(str[i]))             num_list[j++] = str[i];     num_list[j] = 0;      sscanf(num_list, "%u", &num);      printf("%u\n", num);      return 0; }  供参考

user: user-2
content: 用ASCII码值能将作为字符的数字提取出来。将字符型变成整型可以用atoi()函数
user-0 提问: 高精度加法提问！

回复:
user: user-0
content: #include <stdio.h> #include <string.h> #define buffer 32767int main() { int i,len; char a[buffer]; char a1[buffer]; char b[buffer]; char b1[buffer]; gets(a); gets(b); for (i=0;i<=(int)strlen(a);i++) a1[i]=a[strlen(a)-i-1]; for (i=0;i<=(int)strlen(b);i++) b1[i]=b[strlen(b)-i-1]; if (strlen(a)<strlen(b)) { len=strlen(b)-strlen(a); for (i=strlen(a);i<=(int)strlen(a)+len;i++) a1[i]=0; for (i=0;i<=(int)strlen(b)-1;i++) b1[i]=b1[i]+a1[i]-96; for (i=0;i<=(int)strlen(b)-1;i++) if (b1[i]>10) { b1[i+1]+=b1[i]/10; b1[i]=b1[i]%10; } for (i=strlen(b1)-1;i>=0;i--) printf("%c",b1[i]+48); } else { len=strlen(a)-strlen(b); for (i=strlen(b);i<=(int)strlen(b)+len;i++) a1[i]=0; for (i=0;i<=(int)strlen(a)-1;i++) a1[i]=a1[i]+b1[i]-96; for (i=0;i<=(int)strlen(a)-1;i++) if (a1[i]>10) { a1[i+1]+=a1[i]/10; a1[i]=a1[i]%10; } for (i=strlen(a1)-1;i>=0;i--) printf("%c",a1[i]+48); } printf("\n"); return 0; } 代码就是这样，网上也有很多的c语言高精加，不想ctrl+c，同时大部分和我的思路有出入也不想多改了
user-0 提问: 求解答

回复:
user: user-1
content: 引用 2 楼 @trouble is a friend(๑• . •๑ 的回复：[quote=引用 1 楼 单眼皮的小健的回复:]最后的return 0写在大括号外面了，放回去里面 我把return 0;放回去它还是报这个错[/quote]main添加返回值int

user: user-0
content: 引用 1 楼 单眼皮的小健的回复:最后的return 0写在大括号外面了，放回去里面 我把return 0;放回去它还是报这个错

user: user-1
content: 最后的return 0写在大括号外面了，放回去里面
user-0 提问: 小白求助

回复:
user: user-1
content: 引用 7 楼 东南信风 的回复:不会，怎么结题啊？呜呜 在1楼的上面有结贴两字，别让上面答对问题的人白忙活

user: user-0
content: 引用 6 楼 单眼皮的小健的回复:[quote=引用 5 楼 东南信风 的回复：][quote=引用 4 楼 单眼皮的小健的回复:]main（）后面的分号以及max（）后面的分号去掉 原来如此，谢谢大佬！[/quote]结题呀，可以赚积分[/quote] 不会，怎么结题啊？呜呜

user: user-2
content: 引用 5 楼 东南信风 的回复：[quote=引用 4 楼 单眼皮的小健的回复:]main（）后面的分号以及max（）后面的分号去掉 原来如此，谢谢大佬！[/quote]结题呀，可以赚积分

user: user-0
content: 引用 4 楼 单眼皮的小健的回复:main（）后面的分号以及max（）后面的分号去掉 原来如此，谢谢大佬！

user: user-2
content: main（）后面的分号以及max（）后面的分号去掉

user: user-0
content: 楼上是鄙人的代码，目的是找三个数中最大的一个呜呜呜

user: user-0
content: #include <stdio.h> #include <stdlib.h> int main(); {     int a,b,c,d;     scanf("%d %d %d",&a,&b,&c);     d=max(a,b);     d=max(d,c);     printf("%d\n",d);     return 0; } int max(int x,int y); {     int z;     if(x>y)z=x;         else z=y;     return(z); }

user: user-0
content: 大一第一天学c语言，老师上来就开始介绍考试机制，紧接着就让我们下载软件开始编程，完全不会啊啊啊
user-0 提问: C语言，求助！

回复:
user: user-0
content: 引用 1 楼 单眼皮的小健的回复:把数组名传递给函数的时候，传递的是数组的首地址，只要有首地址，无论在哪个函数进行操作，都是对同一地址进行操作，意思都是直接操作原来的数组，因为数组地址是不变的，所以选择B，你选择A的原因我猜你认为数组传递的时候在另一个函数中开辟了新的数组，所以认为另一个函数的操作不会影响原来数组，但是事实并没有开辟新的数组 谢谢你呀，我计算机二级已经考完啦。这个问题我后来问了同学也解决了

user: user-1
content: 把数组名传递给函数的时候，传递的是数组的首地址，只要有首地址，无论在哪个函数进行操作，都是对同一地址进行操作，意思都是直接操作原来的数组，因为数组地址是不变的，所以选择B，你选择A的原因我猜你认为数组传递的时候在另一个函数中开辟了新的数组，所以认为另一个函数的操作不会影响原来数组，但是事实并没有开辟新的数组
user-0 提问: vc6.0可以运行，vs2010怎么运行不了

回复:
user: user-1
content: 错误信息？？

user: user-2
content: 贴出报错信息，不要养成饭来张口衣来伸手的习惯。

user: user-0
content: 引用 1 楼 轻箬笠的回复:vc6的程序转高版本的vs好像没碰到没问题的。针对问题改改呗。 嗯嗯嗯，，，，，，。。

user: user-0
content: 引用 3 楼 zhouqunhai的回复:错误信息？？ 解决了，谢谢          ，，，，，

user: user-0
content: 引用 2 楼 @风轻云淡_的回复:贴出报错信息，不要养成饭来张口衣来伸手的习惯。 解决了，谢谢，记住了

user: user-3
content: vc6的程序转高版本的vs好像没碰到没问题的。针对问题改改呗。
user-0 提问: 提问：xcode 里没有conio.h 怎么办呢？

回复:
user: user-1
content: conio.h这个是Windows VC库中才有的接口，只有用Windows下的编译器才有的，而MACOS是Unix系统，是没有conio.h的，解决你的问题的办法，可以是切换到Windows下去写代码学习。二是找可以能代替Windows下getch功能的库函数，若只是教科书上的getch只是录入一个字符，而不是控制键符的，直接就用stdio.h中的getcher就可以了。有一个可以代替的库是 curses库。#include <curses.h>也是需要去网上下，xcode 你可以先试下，带不带这个库。

user: user-2
content: mac写C++是真的难受，还是装双系统吧

user: user-3
content: 怎么下载conio。h呢

user: user-0
content: 引用 1 楼 J__Max的回复:xcode不支持这个头文件，你可以自己在网上下载，再放到对应的文件夹里 网上说下了放进去 报错了

user: user-4
content: 把这句注掉试试，如果不行去网上找找，我想不只你遇到了这个问题： https://bbs.codeaha.com/thread-8377-1-1.html

user: user-5
content: xcode不支持这个头文件，你可以自己在网上下载，再放到对应的文件夹里
user-0 提问: C语言小白 if问题求助

回复:
user: user-1
content: a==b==c的运算方式是先判断a==b，如果a与b相等值为1否则为0，所以表达式就变成了1==c或0==c

user: user-2
content: 知道人家看不清还不补发下？什么心态？ 引用 6 楼 weixin_44705587 的回复:[quote=引用 2 楼 轻箬笠的回复:]眼瞎"党"，建议楼主下次发帖后，自己看下帖子 感谢建议第一次发帖，下次会注意哒~[/quote]

user: user-3
content: 建议把代码图片重新拍清楚了再上传，或者直接贴代码。   a == b == c在C语言不支持。建议使用&&或者||

user: user-0
content: 引用 2 楼 轻箬笠的回复:眼瞎"党"，建议楼主下次发帖后，自己看下帖子 感谢建议第一次发帖，下次会注意哒~

user: user-4
content: 引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 lin5161678 的回复:] [quote=引用 1 楼 自信男孩 的回复:] 建议把代码图片重新拍清楚了再上传，或者直接贴代码。   a == b == c在C语言不支持。建议使用&&或者||语法上这样写没什么问题 没什么不支持[/quote] 你见过if (a==b==c)的语句?[/quote]没见过不代表错了

user: user-3
content: 引用 3 楼 lin5161678 的回复:[quote=引用 1 楼 自信男孩 的回复:] 建议把代码图片重新拍清楚了再上传，或者直接贴代码。   a == b == c在C语言不支持。建议使用&&或者||语法上这样写没什么问题 没什么不支持[/quote] 你见过if (a==b==c)的语句?

user: user-4
content: 引用 1 楼 自信男孩 的回复:建议把代码图片重新拍清楚了再上传，或者直接贴代码。   a == b == c在C语言不支持。建议使用&&或者||语法上这样写没什么问题 没什么不支持

user: user-5
content: 眼瞎"党"，建议楼主下次发帖后，自己看下帖子
user-0 提问: c语言编程   求解

回复:
user: user-1
content: #include<stdio.h> int main(){   int m,n,i;   int sum=0;    scanf("%d%d",&m,&n);   for(i=m;i<=n;++i){     if(i%3==0&&i%5==0) 		 continue; 	sum+=i;   }   printf("%d\n",sum);   return 0; }
user-0 提问: c语言编程错误出现expected;,identified or ( before void 求助大佬

回复:
user: user-1
content: 这个代码是拼凑的吧，没写全。并且代码的调用也有问题。Createlist()没有返回值。并且LinkList类型里有next成员吗？  建议贴出一个完整的代码出来。

user: user-2
content: struct class 后面的大括号 要接着 ; class cc{ public：  。。。。  };
user-0 提问: 求里面结果怎么来的   18fff3c?

回复:
user: user-1
content: 地址啊，你连地址都不知道的话那程序咋来的

user: user-2
content: 这个是栈的地址，即num变量的地址。这个地址是一个虚拟地址，而不是实际的物理地址。
user-0 提问: 求助大神编程问题！根据以下特定输入方式对树进行层次遍历并输出奇数层结点

回复:
user: user-0
content: 我自己写出来了，使用邻接表保存该树，从文件读取数据，并输出到文件上去。代码如下，供有同样问题的同志参考！ #include<stdio.h> #include<stdlib.h> #include<vector> #include<queue> using namespace std;  int level[100];           //标记每个结点所在层 char str[20];              //存储读入的一行结点 int node[20][50];         //以数字的形式存储每行的结点 int q_output[100];        //按顺序保存队列输出的结点  queue<int> Q;             //定义一个队列用于层次遍历； vector<int> edge[100];    //定义邻接表存储树的结点  int main(){ 	int len; 	int i,j,k; 	int line; 	FILE *fp1,*fp2; 	fp1=fopen("input.txt","r"); 	fp2=fopen("output.txt","w");  	if(fp1==NULL||fp2==NULL){ 		printf("cannot open file\n"); 		exit(0); 	}  	for(i=0;i<20;++i) 		for(j=0;j<50;++j) 			node[i][j]=0; 	for(i=0;i<100;++i){ 		edge[i].clear(); 		q_output[i]=0; 	}  	line=0; 	while(fgets(str,100,fp1)!=NULL){    //从input文件读入一行字符串 		k=0; 		len=strlen(str); 		for(i=0;i<len;++i){ 			if(str[i]>='A'&&str[i]<='Z') 				node[line][k++]=str[i]-'A'; 			node[line][k]=-1;          //以-1标记每行的结尾 		} 		line++; 	}   	//用node[i][j]数组保存输入的结点，i代表行从0开始，j代表每行第几个结点，j=0表示双亲结点 	level[node[0][0]]=1;                      //第一行第一个结点为根结点，在第一层 	for(i=0;i<line;++i) 		for(j=0;node[i][j]!=-1;++j){ 			if(j!=0){ 				edge[node[i][0]].push_back(node[i][j]); 				level[node[i][j]]=level[node[i][0]]+1;     //标记每个结点所在的层 			} 		} 	//用邻接表保存树 	 	Q.push(node[0][0]);                   //根结点入队 	int size=0; 	while(!Q.empty()){ 		int front=Q.front();              //取队首结点 		q_output[size++]=front;           //层次遍历的顺序将结点保存在数组q_output[]中 		Q.pop(); 		for(i=0;i<edge[front].size();++i){ 			Q.push(edge[front][i]);      //将front的孩子结点入队 		} 	} 	 	i=0; 	int flag,size_2; 	while(i<size){ 		flag=0; 		size_2=0; 		while(level[q_output[i]]%2==1&&i<size){ 				flag=1; 				k=level[q_output[i]]; 				str[size_2++]=(q_output[i]+'A'); 				++i; 		} 		if(flag==1){ 			--i; 			str[size_2]='\0'; 			fprintf(fp2,"第%d层：",k); 			for(j=0;j<size_2;++j){ 				if(j==0) 					fprintf(fp2,"%c",str[j]); 				else 					fprintf(fp2,",%c",str[j]); 			} 			char ch='\n'; 			fprintf(fp2,"%c",ch); 		} 		++i; 	} 	fclose(fp1); 	fclose(fp2); 	return 0; }
user-0 提问: 大一学生计算机小白求助

回复:
user: user-1
content: 这道题可以不用while，直接判断，当然，如果你问scanf这while里面，如果你while(x)，只要你x大于0或者里面没有break，循环就不会停。

user: user-2
content: 引用 2 楼 耕者走兔的回复:while（score< 0 || score >100）这句话的意思是；某位同学的成绩是 -1 才可以评级。我没见过有哪位同学会考出这样的成绩。 那个while是为了避免输入非法数据吧

user: user-3
content: 楼主，score你只定义了，没初始化，随机赋值，你可以把scanf("%d",score);写在while前面，还有后面的if语句加入while内，判断条件while应该是在0到100分内，你写反了。

user: user-0
content: 引用 9 楼 小学弟渣渣c的回复:执行顺序: 1.先是int score  因为score是局部变量，所以会随机赋值 2.执行printf输出 3.进行while判断，如果随机的score符合，就进循环，否则跳过while循环 4.假设进了while 会执行scanf和printf，如果输入不合格，就一直while循环 5.score输入合格，跳出循环。  修改建议:1把score改成全局变量(默认赋初值0) 2.在while之上加一个scanf，把while里的scanf放到最后 3.使用do  while循环 望采纳 多谢(o^^o)，您的回复帮助很大，谢谢耐心指导！！！

user: user-0
content: 引用 4 楼 2018年6月8日的回复:正常啊,你一直输入大于100 或小于0 的数,他肯定是一直在while循环里啊,你输入999 之后打印提示信息之后,又进入了while循环啊,然后停到了scanf函数里,等待你的输入啊.    还有你这个变量score 是没有赋初值的,好像是vc它自动给你赋初值为0了,要不然变量score 是未知的数.      这道题建议用do while循环来做 多谢(o^^o)多谢

user: user-4
content: 我觉得while循环里的if没必要

user: user-5
content: 此楼50，可以结贴了！

user: user-6
content: 当你输入的数字大小满足while循环条件，就继续执行接收字符，直到你输入1～100范围的数就会不符合while循环条件，跳出循环

user: user-7
content: 写成while (1)就行了

user: user-8
content: 首先判断while语句的对和错   对则执行内部语句 在执行while语句之前  score值默认为0   而0不大于100也不小于0  然后跳过while执行下面的if语句

user: user-9
content: 首先执行的是printf语句，随后执行while语句(这里在进行score判断的时候，由于你并没有给score赋初始值，或许系统自动给出了初始值0，所以就自动进入了while语句)，然后执行scanf(你输入了999之后，进行if语句判断，满足条件，所以执行printf)，到此循环体执行完毕;后面的if语句仍然继续执行，只是条件不满足，不做输出

user: user-10
content: 执行顺序: 1.先是int score  因为score是局部变量，所以会随机赋值 2.执行printf输出 3.进行while判断，如果随机的score符合，就进循环，否则跳过while循环 4.假设进了while 会执行scanf和printf，如果输入不合格，就一直while循环 5.score输入合格，跳出循环。  修改建议:1把score改成全局变量(默认赋初值0) 2.在while之上加一个scanf，把while里的scanf放到最后 3.使用do  while循环 望采纳

user: user-11
content: 引用 2 楼 耕者走兔的回复:while（score< 0 || score >100）这句话的意思是；某位同学的成绩是 -1 才可以评级。我没见过有哪位同学会考出这样的成绩。 While循环没学好，就来嘲笑别人

user: user-12
content: 楼主的代码那个score第一次进循环是随机值，建议不这样写。

user: user-11
content: 可以这么写 while(scanf("%d",&score)==0||score<0||score>100){ fflush(stdin);//清除缓冲区，如果输入的不是数字会留在缓冲区，造成死循环 printf("请输入评分范围以内的成绩！\n"); }

user: user-13
content: 1.score符合条件的每一次时，就会执行一次scanf。输入score后，又会重新进行一次判断是否进行循环。  2.因为执行scanf语句的时候，你给score的值不符合小于0或者大于0时就会退出while，不会造成死循环。

user: user-14
content: 你这程序不用改，这就是个评分的。只是我没有看到结尾的花括号

user: user-14
content: 当然不会陷入死循环，你只要输入0到100（包括0和100）,while循环就会结束，然后再参与评级。‖的意思是旁边两个逻辑表达式只要一个是真就是真。你只要使两个逻辑表达式都不为真，那么while循环就会结束

user: user-15
content: 引用 4 楼 2018年6月8日 的回复:正常啊,你一直输入大于100 或小于0 的数,他肯定是一直在while循环里啊,你输入999 之后打印提示信息之后,又进入了while循环啊,然后停到了scanf函数里,等待你的输入啊.    还有你这个变量score 是没有赋初值的,好像是vc它自动给你赋初值为0了,要不然变量score 是未知的数.      这道题建议用do while循环来做 使用do while这个方法不错。局部变量不会那个编译器就给赋值0吧。

user: user-0
content: 请注意，评级if嵌套不在while循环中，这个while循环就是为了避免输入0-100以外的数字
user-0 提问: 选择了软件工程的大一新生，已经崩溃了，前辈们求指点迷津！

回复:
user: user-1
content: 我也是今年刚读完大一的学生，我们也是上学期学的c语言，我认为你如果不喜欢就应该转专业，如果能坚持学就多练，书上的概念多看看，老师给的作业多写两遍，多改改，多写写，肯定能好的，祝你学习愉快！

user: user-2
content: 走非技术嘛 产品呀啥的 不要求你有多强的专业知识

user: user-3
content: 我现在自学C语言，对计算机编程了解不多，但是用自己编出小程序还是很开心的，兴趣是最好的老师

user: user-4
content: 等你写出的代码，能够带来成就感的时候，你就会慢慢的喜欢上代码了，我也是计算机入门新生，一起加油！

user: user-0
content: 引用 126 楼 A Moment To Remember 的回复：我现在自学C语言，对计算机编程了解不多，但是用自己编出小程序还是很开心的，兴趣是最好的老师

user: user-0
content: 引用 125 楼 stone dream 的回复：等你写出的代码，能够带来成就感的时候，你就会慢慢的喜欢上代码了，我也是计算机入门新生，一起加油！我已经属于漏油那一类人了

user: user-0
content: 引用 123 楼 qq_42225192 的回复：首先要学会完成，然后再完美哎

user: user-0
content: 引用 120 楼 smallwhite0_0 的回复：没事的，多练习一下，你就当他是一种语言，久了你会觉得它比英语友善我呸……英语更简单吧

user: user-0
content: 引用 119 楼 qq_18820125 的回复：建议转机械，简单好学，不打代码，生活安逸，好处非常之多。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。嗯，总而言之，适合你！ 不说了，我去植点儿头发，最近风大，头冷。真的吗？

user: user-5
content: 首先要学会完成，然后再完美

user: user-6
content: 我只是在网找视频看的，边看边打，因为觉得编写排序，求最值真的有点无聊，而且参加什么竞赛多是一道题没做出，只是对代码其他用处感点兴趣

user: user-6
content: 我也是软工大一学生，一开始也觉得有点乏味，但之后觉得代码还是挺有意思的，相当于一种能和机器沟通的语言，到后面学到java，web做小软件，网页会发现真的挺有趣的，而且书本上都会有代码实例，可以边打边理解，实在不行可以在网上找一些系列视频观看，有些老师会引用现实的例子。（同是被代码折磨的小白的个人观点）

user: user-0
content: 引用 111 楼 user-9 的回复：学弟，想想这个专业以后能挣好多钱，高兴的晚上也睡不着觉啊。……你来搞笑的吧

user: user-0
content: 引用 112 楼 smallwhite0_0 的回复：我也是软工大一学生，一开始也觉得有点乏味，但之后觉得代码还是挺有意思的，相当于一种能和机器沟通的语言，到后面学到java，web做小软件，网页会发现真的挺有趣的，而且书本上都会有代码实例，可以边打边理解，实在不行可以在网上找一些系列视频观看，有些老师会引用现实的例子。（同是被代码折磨的小白的个人观点）要死了，快点留个联系方式教我啊……

user: user-0
content: 引用 109 楼 qq_44672327 的回复：啊我是计算机科学与技术专业的，你可以去洛谷刷刷题，提升很快的洛谷是什么，我一脸懵啊

user: user-6
content: 没事的，多练习一下，你就当他是一种语言，久了你会觉得它比英语友善

user: user-7
content: 建议转机械，简单好学，不打代码，生活安逸，好处非常之多。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。嗯，总而言之，适合你！ 不说了，我去植点儿头发，最近风大，头冷。

user: user-8
content: 看着楼上 大一水平都这么高 我很惭愧 好像大一的时候就是简单的C程序 排序或者求最大最小值？ 下学期写简单的学生管理系统 很low

user: user-0
content: 引用 117 楼 smallwhite0_0 的回复：我只是在网找视频看的，边看边打，因为觉得编写排序，求最值真的有点无聊，而且参加什么竞赛多是一道题没做出，只是对代码其他用处感点兴趣你都去竞赛了，我还在迷茫

user: user-9
content: 学弟，想想这个专业以后能挣好多钱，高兴的晚上也睡不着觉啊。
user-0 提问: 本人萌新才开始在网上做题heapbufferflow

回复:
user: user-1
content: strsSize == 1 的时候，也就是只有一个字符串，会不会无限循环？      while(detect == 1)     {         c = strs[0][length];         for(i=1;i<numofstrs;i++)    // <== numofstrs是1，循环不执行         {             if(strs[i][length]!=c)                 detect = 0;         }         if(detect == 1)  // <== detect始终为1             length++;      }

user: user-2
content: 建议贴出完整的代码，主要是调用longestCommonPrefix的操作，还有就是实参的定义。

user: user-3
content: 每个strs[i]长度都是strsSize么？应该用strlen吧
user-0 提问: （C语言）？

回复:
user: user-1
content: s是个字符串，字符串用0结尾，这是在把i遍历到s结尾的位置

user: user-2
content: s应该是个字符串数组，然后一直循环到这个字符串结束

user: user-3
content: 引用 3 楼 流泪熊猫头 的回复：从数组第一个元素开始遍历，遇到值为0则退出循环+1

user: user-4
content: 每次执行循环体前都要判断一下s[i]是否为0.如果是0，就退出循环，否则执行循环体，执行完循环体将i++，然后在判断s[i]是否为0，因为i已经加1，所以第二次的判断是判断下一个元素是否等于0了。

user: user-5
content: 从数组第一个元素开始遍历，遇到值为0则退出循环

user: user-6
content: 引用 1 楼 user-6的回复:s应该是个数组，s的第i个数据为0则继续自增 打错字了，应该是不等于0

user: user-6
content: s应该是个数组，s的第i个数据为0则继续自增
user-0 提问: 小生大一，各位前辈指教。

回复:
user: user-0
content: 引用 1 楼 @风轻云淡_的回复:给你写了个小demo（简单的测了下自己需要花费多久），简单的测了下功能，可能还会存在问题，注释写的很详细，希望会对你有所帮助，提供思路为主： #include <stdio.h> #include <stdio.h>  int main(int argc, char *argv[]) {  	char old_buff[256] = {0};//原字符串 	char new_buff[256] = {0};//替换后字符串 	char old_str[32] = {0};//被替换子串 	char new_str[32] = {0};//替换子串 	int i = 0;//控制原字符串循环 	int j = 0;//控制局部的子串循环 	int k = 0;//控制局部的原字符串循环 	int l = 0;//控制替换子串追加到新总串 	int len = 0;//旧子字符串长度，用于跳过替换字符串 	int newlen = 0;//控制新的字符串长度 	gets(old_buff); 	gets(old_str); 	gets(new_str);  	//TODO:有需要可以对所有输入字符串做长度检测  	for(i=0;old_str[i] != '\0';++i) 	{ 		len++; 	}  	//思路就是循环原字符串，一旦匹配到子串首部，进入局部循环，查看是否完整匹配， 	//如果是，进行局部替换，不是则跳出局部循环，继续进行循环原字符串  	for(i=0,j=0;old_buff[i] != '\0';) 	{ 		if(old_buff[i] == old_str[j]) 		{ 			for(k=i;k<i+len;++k,++j) 			{ 				if(old_buff[k] != old_str[j]) 					break; 			} 			j=0;//不要忘了初始化旧字符串索引位置 			if(k >= i+len) 			{ 				l=0; 				while(new_str[l] != '\0') 				{ 					new_buff[newlen] = new_str[l]; 					++l; 					++newlen; 				} 				i = i+len; 				continue; 			} 		} 		new_buff[newlen] = old_buff[i]; 		++i; 		++newlen; 	}  //	new_buff[newlen] = '\0';  //此处最好加一个字符串结束符，因为我定义的时候已经初始化，所以此处可以不加  	puts(old_buff); 	puts(old_str); 	puts(new_buff); 	return 0; }   万分谢谢，我琢磨琢磨。

user: user-1
content: 给你写了个小demo（简单的测了下自己需要花费多久），简单的测了下功能，可能还会存在问题，注释写的很详细，希望会对你有所帮助，提供思路为主： #include <stdio.h> #include <stdio.h>  int main(int argc, char *argv[]) {  	char old_buff[256] = {0};//原字符串 	char new_buff[256] = {0};//替换后字符串 	char old_str[32] = {0};//被替换子串 	char new_str[32] = {0};//替换子串 	int i = 0;//控制原字符串循环 	int j = 0;//控制局部的子串循环 	int k = 0;//控制局部的原字符串循环 	int l = 0;//控制替换子串追加到新总串 	int len = 0;//旧子字符串长度，用于跳过替换字符串 	int newlen = 0;//控制新的字符串长度 	gets(old_buff); 	gets(old_str); 	gets(new_str);  	//TODO:有需要可以对所有输入字符串做长度检测  	for(i=0;old_str[i] != '\0';++i) 	{ 		len++; 	}  	//思路就是循环原字符串，一旦匹配到子串首部，进入局部循环，查看是否完整匹配， 	//如果是，进行局部替换，不是则跳出局部循环，继续进行循环原字符串  	for(i=0,j=0;old_buff[i] != '\0';) 	{ 		if(old_buff[i] == old_str[j]) 		{ 			for(k=i;k<i+len;++k,++j) 			{ 				if(old_buff[k] != old_str[j]) 					break; 			} 			j=0;//不要忘了初始化旧字符串索引位置 			if(k >= i+len) 			{ 				l=0; 				while(new_str[l] != '\0') 				{ 					new_buff[newlen] = new_str[l]; 					++l; 					++newlen; 				} 				i = i+len; 				continue; 			} 		} 		new_buff[newlen] = old_buff[i]; 		++i; 		++newlen; 	}  //	new_buff[newlen] = '\0';  //此处最好加一个字符串结束符，因为我定义的时候已经初始化，所以此处可以不加  	puts(old_buff); 	puts(old_str); 	puts(new_buff); 	return 0; }
user-0 提问: 求助论坛各位大佬我正在用VS2017以MFC为基础来做一个能支持整形浮点型和复数的四则运算的简易计算器，目前我就只学了C语言，我做好了界面然后就不知道该怎么办了

回复:
user: user-1
content: 建议你还是找些MFC编程的书籍先看看，例如《Visual C++MFC编程实例》。
user-0 提问: C语言  关于全局变量数组的使用

回复:
user: user-0
content: 我把这个写在一个.c文件中然后在其.h中用extern申明了，随后的文件直接调用了这个.h文件。刚刚编译了一下，可以了。我把const这个改成define了

user: user-1
content: 引用 2 楼 m0_37967554 的回复:如果只是在另外一个用，是可以的，但是文件太多，就报错了 如果文件太多，要么就没个用到的文件都引入。否则就是考虑修改函数接口，通过参数传递进去，这样不用每个文件都extern，可以大大减少extern的个数

user: user-0
content: 如果只是在另外一个用，是可以的，但是文件太多，就报错了

user: user-1
content: 在其他的源文件，加上extern一下就可以了。 比如int array0[N]，在其他的源文件里定义为extern int array0[N];