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

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

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

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

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

user: user-1
content: 头文件是扩展名为 .h 的文件，包含了 C 函数声明和宏定义，被多个源文件中引用共享。有两种类型的头文件：程序员编写的头文件和编译器自带的头文件。  在程序中要使用头文件，需要使用 C 预处理指令 #include 来引用它。前面我们已经看过 stdio.h 头文件，它是编译器自带的头文件。  引用头文件相当于复制头文件的内容，但是我们不会直接在源文件中复制头文件的内容，因为这么做很容易出错，特别在程序是由多个源文件组成的时候。  A simple practice in C 或 C++ 程序中，建议把所有的常量、宏、系统全局变量和函数原型写在头文件中，在需要的时候随时引用这些头文件。https://www.runoob.com/cprogramming/c-header-files.html   头文件这里你看了就知道了，会考不会打是什么意思我不明白。。。
user-0 提问: 每隔3个字符复制字符串的第二种方法未实现功能，大家帮忙看一下哦~~

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

user: user-0
content: c语言二级里的题目 需要寻找错误 修改一行 其他不用改~~ #include<stdio.h> #include<string.h> void str_cpy(char *stra,char *strb) {      int i = 0;      while(*stra){         /******found****** */           int p=1;          while( p<=3 && *stra ){         /*******found********/                   *(strb+i)=*(stra+i);              p++;              i++;          }           /*******found********/                 *strb=' ';                }           *strb++='\0';    } int main(int argc, char const *argv[]) {      char a[128]="ABCDEFGHIJKLMNOPQRSTUVW";     char b[128];     puts(a);     str_cpy(a,b);        puts(b);       getchar();          return 0; }

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

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

user: user-2
content: char *strcpy3(char *dest, const char *src) {   char *p = dest;   for (int i = 0; *src; src++) if (!(i++ & 3)) *p++ = *src;    return *p = 0, dest; }
user-0 提问: 关于初始化字符串数组时，栈空间存放的是字符串吗？

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

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

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

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

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

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

user: user-5
content: 这个还真没注意过 把地址打印出来看看 char *arr = "abcd"; char array[ ] = "abcd"; char a2[] = {'a', 'b', 'c', 'd', '\0'}; char *p = arr; printf("%p\n", p); printf("%p\n", (p+1)); p = array; printf("%p\n", p); printf("%p\n", (p+1)); p = a2; printf("%p\n", p); printf("%p\n", (p+1));
user-0 提问: float类型数值的下溢

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

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

user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437
user-0 提问: 如何使用c语言实现txt文件不可被用户操作

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

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

user: user-0
content: 没有用到数据库呀，我是小白来着

user: user-3
content: 加密算哈希，用户修改后哈希值肯定不一致，直接清空数据库
user-0 提问: C需要指针问题，请大佬解答

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

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

user: user-2
content: 类型不匹配好像已经多人帮你指出来，你看一下类型不匹配的问题
user-0 提问: linux 关于netlink的一个奇怪问题

回复:
user: user-1
content: 卸载模块没有写析构函数啊，内核没有释放这个协议号

user: user-0
content: 谢谢大佬，我找到问题了，netlinkclose函数里的判断错了

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

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

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

user: user-2
content: 你p1赋的值直接是数组a的首地址，用%s的格式控制符直接输出p1就好了跟你直接输出a是一样的，如果你*p1相当于取了数组a第一个字符的值，单个字符输出你用%c就好了，是能够输出字符H的。
user-0 提问: 求助贴  关于c中isspace()函数

回复:
user: user-0
content: 那为啥会出现4呢。。

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

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

user: user-0
content: 一开始想说的是，我是萌新。。分数太少，没办法多给，大佬们见谅
user-0 提问: 问一下大佬们哪里错了

回复:
user: user-1
content: 怎么放大？？为啥我不能放大，点击图片也没用

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

user: user-2
content: 代码没看出有啥问题？难道是中文字符的问题？

user: user-3
content: 代码没有问题,建议你重新建一个项目,有时候是编译器 的问题
user-0 提问: 异常日志输出时，怎样包含文件名和行号

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

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

user: user-0
content: 引用 1 楼 user-3 的回复:THIS_FILE   __LINE__ 您好，感谢答复，日志是ntpd输出的（ntp-4.2.6p5-22.el7.centos.x86_64），刚过滤了下源码，么有找到LINE或THIS_FILE

user: user-2
content: __FILE__ __LINE__ 这两个宏

user: user-3
content: THIS_FILE   __LINE__
user-0 提问: 输入之后没有反应

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

回复:
user: user-0
content: 谢谢各位的解答

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

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

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

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

user: user-3
content: 写这段代码的人 不了解C语言 不是没越界 实际情况的确越界了  只是没修改 变量 i

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

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

user: user-6
content: 楼主没吃过这种问题的亏，所以没有感触。
user-0 提问: c 语言 指针问题，请大佬解答

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

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

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

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

回复:
user: user-1
content: 另外，说一下，你的问题跟指针函数没关系，而是函数返回指针的问题。

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

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

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

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

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

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

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

user: user-4
content: p指向的是c的地址，所以直接输出p输出的是p的内容也就是c的地址，只有*p才表示着c的内容，希望你能看懂
user-0 提问: windows下，用clion怎么看printf的源码

回复:
user: user-1
content: D:\Program Files (x86)\Windows Kits\10\Source\10.0.10150.0\ucrt\stdio\output.cpp D:\Program Files (x86)\Windows Kits\10\Source\10.0.10240.0\ucrt\stdio\output.cpp D:\Program Files (x86)\Microsoft Visual Studio\VC98\CRT\SRC\OUTPUT.C D:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\crt\src\output.c
user-0 提问: 输出数据类型自动转换的问题

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

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

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

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

user: user-3
content: 因为你写的printf里面输出类型是整数，0.5输出就会被强制转化为整数，小数部分就直接去掉了，不会四舍五入的。如果改成%f输出类型就是浮点数，可以正常输出0.5

user: user-2
content: float 类型计算时会自动转为double，小数的存储可以看一下这篇https://blog.csdn.net/acdreamers/article/details/19012279 float 存储的32位和 double的存储的高32位是一样的，%d只取了double的低32位，全是零，

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

user: user-5
content: a+b得到的是float类型，你用%d输出float所以输出0
user-0 提问: 编写一个c语言程序

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

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

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

user: user-1
content: #include "pch.h" #include <iostream> #include "time.h"  using namespace std;  int main() { 	int a[10] = { 0 }; 	srand(time(NULL)); 	cout << "随机数分别为：" << endl; 	for (int i = 0; i < 10; i++) 	{ 		a[i] = rand() % 101; 		cout << a[i] << " "; 	} 	cout << endl; 	int tmp = a[0]; 	int max_num = 0; 	for (int i = 1; i < 10; i++) 	{ 		if (a[i] >= tmp)//当最大数有多个时，大于等于是取最后一个下标，大于是取第一个最大数的下标 		{ 			tmp = a[i]; 			max_num = i + 1; 		} 	} 	cout << "最大的数：" << tmp << endl; 	cout << "下 标 为：" << max_num << endl;  	system("pause"); }
user-0 提问: 请问大家有没有检测输入数据产生跳变的好方法

回复:
user: user-1
content: 如果间距不是太大，你可以保存上次读到值，将这次读到的值与上次读到的值进行比较，若上次的值大于这次读到的值，就说明产生了跳变
user-0 提问: 将一个C 语言源程序文件中所有注释去掉后，存入另一个文件

回复:
user: user-1
content: #include "stdafx.h" #include<stdio.h>  #include<string.h>  #include<stdlib.h>  int _tmain(int argc, _TCHAR* argv[]) {   FILE* fp1, * fp2;  errno_t err1, err2;  char ch, ch1, ch2;   if ((err1 = fopen_s(&fp1, "test.txt", "r")) != 0) {  printf("Open 1 fail!\n");  exit(0);  }   if ((err2 = fopen_s(&fp2, "test2.txt", "w")) != 0) {  printf("Open 1 fail!\n");  exit(0);  }  /*  */ while (!feof(fp1))  {  ch = fgetc(fp1); 	 if (ch == '/')  	 { 		ch1 = fgetc(fp1); 			 if (( ch1== '*')) 			 { 				 while (fgetc(fp1) != '*' && (ch2=fgetc(fp1)) != '/'&&ch2!=EOF);  			 } 			 else if (ch1 == '/')  			 { 				 while ((ch2 = fgetc(fp1)) != '\n'&&ch2!=EOF); 			 } 	 } 	 else if(ch!=EOF) 		   fputc(ch,fp2);  } if (fclose(fp1)) {  printf("Close Fail!\n");  exit(0);  }  if (fclose(fp2)) {  printf("Close Fail!\n");  exit(0);  }   return 0;  } 这样处理有问题的 假如有个printf("/*"); 直接后面的都没了，非常不严谨
user-0 提问: 创建窗口时指定父窗口句柄，但没有WS_CHILD样式，会怎样？

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

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

user: user-1
content: Owner Window

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

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

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

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

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

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

user: user-1
content: 你创建的不是子窗口吗

user: user-0
content: 引用 1 楼 user-1 的回复:啥关系都不是，因为会创建失败，你可以检查一下返回的句柄值看看是不是为NULL 没有创建失败呀，正常运作，句柄值也不是NULL。官方文档不是写了说可以指定拥有者窗口吗？
user-0 提问: 复制字符串~每隔3个字符复制一个空格~~if条件没有实现功能~~

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

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

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

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

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

user: user-2
content: [code=c]if(i%4==0) *sc=' ';[/code] 这次是反过来了，你的空格被后面*sc = *s;覆盖了。改成：  if(i%4==0) *sc++=' '; 试试

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

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

user: user-1
content: 栈的存储区间为[1,m]（不妨当做一个横向数组），初始时栈顶指针top指向右边界的下一个地址，也就是m+1（表示栈顶为空），由于栈的低部在右边界，入栈指针往左移，也就是（top--），相反，出栈往右移，也就是（top++），所以当top==m时，再出一个元素（top++），故top=m+1

user: user-0
content: 忘了补充了……由于分数有限，所以给的比较少，希望各路大神仗义相助
user-0 提问: 关于c语言小游戏的问题 *easyX库

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

user: user-1
content: 按下：启动定时器，控制匀速移动 释放：关闭定时器
user-0 提问: qdebug输出中文字符为乱码，要不没有输出，各位大佬为什么呢？

回复:
user: user-0
content: 谢谢各位，问题已经解决。

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

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

user: user-1
content: QString::fromLocal8Bit("中文")

user: user-2
content: Qt控制台输出显示乱码

user: user-0
content: 这个要怎么转啊，小白不太懂

user: user-2
content: qtcreator默认字符是utf8的。vs默认是ansi的。 console输出默认也是ansi的。输出前先转码
user-0 提问: C 语言增加功能，限制输出信息个数 的奇葩事件，求大神解答

回复:
user: user-1
content: scanf是要求你输入"输入组数:10" 这样才行，scanf是输入的不是输出的。 可以改成:  printf("输入组数："); scanf("%d", &s); 拆成两句
user-0 提问: PAT 1030 完美数列测试点5答案错误

回复:
user: user-1
content: left=search(a,i,N-1,(long long)(a[i]*p));  a[i]*p，两个int相乘，溢出了~再转成long long 没啥意义了。可以改成比如：(long long)a[i]*p。  search函数弄得有点复杂了~~~  #include <stdio.h> #include <stdlib.h> int cmp(const void* a, const void* b) { 	return *(int*)a > * (int*)b; }  int main() { 	int* arr, N, P, ans = 0; 	long int T; 	scanf("%d%d", &N, &P); 	arr = (int*)malloc(sizeof(int) * N); 	for (int i = 0; i < N; i++) 		scanf("%d", &arr[i]);  	qsort(arr, N, sizeof(int), cmp);  	for (int i = 0; i < N; i++) { 		T = (long int)arr[i] * P; 		for (int j = i + ans; j < N; j++) 			if (arr[j] <= T) { 				ans++; 			} 			else 				break; 	} 	printf("%d\n", ans); 	free(arr); 	return 0; }

user: user-0
content: 引用 3 楼 coo135 的回复:left=search(a,i,N-1,(long long)(a[i]*p));  a[i]*p，两个int相乘，溢出了~再转成long long 没啥意义了。可以改成比如：(long long)a[i]*p。  search函数弄得有点复杂了~~~  #include <stdio.h> #include <stdlib.h> int cmp(const void* a, const void* b) { 	return *(int*)a > * (int*)b; }  int main() { 	int* arr, N, P, ans = 0; 	long int T; 	scanf("%d%d", &N, &P); 	arr = (int*)malloc(sizeof(int) * N); 	for (int i = 0; i < N; i++) 		scanf("%d", &arr[i]);  	qsort(arr, N, sizeof(int), cmp);  	for (int i = 0; i < N; i++) { 		T = (long int)arr[i] * P; 		for (int j = i + ans; j < N; j++) 			if (arr[j] <= T) { 				ans++; 			} 			else 				break; 	} 	printf("%d\n", ans); 	free(arr); 	return 0; }  谢谢高手的回答，回去试了一下解决了

user: user-0
content: 引用 1 楼 自信男孩 的回复:这个没那么复杂吧，直接遍历套公式就好了吧 找到最大值，然后遍历M<= p * m;得到最大数是8个。 不用二分法的话复杂度是O(n^2)，会超时

user: user-2
content: 这个没那么复杂吧，直接遍历套公式就好了吧 找到最大值，然后遍历M<= p * m;得到最大数是8个。
user-0 提问: 文件传输中断，残损了，如何让别人看不到残损文件的内容

回复:
user: user-1
content: web是采取temp目录的办法。 如果文件小可以考虑内存模式

user: user-2
content: 引用 楼主 gewenbingg 的回复:向服务器上传一个.txt文件，网络断了，服务器只接收到文件的一半。在这中情况下不想让服务器打开能看到这个残损的文件内容（让他打不开），请问有什么办法？？ 看文件大小了，没接收完先存在内存中，接收完成，再写文件。接收失败，销毁对象。
user-0 提问: 求救求救被困了2h愣是没看出有什么区别

回复:
user: user-0
content: 引用 1 楼 自信男孩的回复:区别在if (j == i)是在第二个for循环里还是循环外。 从逻辑上看，应该放在循环外，因为放在循环里无意义，因为循环里不会出现j == i wok 秒懂 原来是这样子的  谢谢啊

user: user-1
content: 错误提示不是有吗，i重复定义了，第20行和第41行

user: user-2
content: 区别在if (j == i)是在第二个for循环里还是循环外。 从逻辑上看，应该放在循环外，因为放在循环里无意义，因为循环里不会出现j == i
user-0 提问: 关于循环的的问题

回复:
user: user-1
content: 建议从实际出发，如果对浮点数不确定能不能判断，那么可以改成自己熟悉的方式，比如整型数。

user: user-2
content: 引用 8 楼 LandY和C 的回复:[quote=引用 7 楼 WNs_ACE 的回复:] [quote=引用 6 楼 LandY和C 的回复:] [quote=引用 4 楼 WNs_ACE 的回复:] 我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）  说的很详细  ,  那意思就是 这个代码在不同的机器上会有不同的结果喽.  也就是间接的告诉我不能这么用.  证实 非0即为真 不包括小数[/quote] 基本上来说，在PC和一般的高端平台，我觉得基本上你上面这样写没有问题，while (0.000001)为真，while (0.00000)为假，但是如果是低端嵌入式平台，可能就不可以了。[/quote]  换个方式问这个问题(核心没变) 如何将浮点数转字符串. 假设 x = 0.00123 ; 我的具体代码  while ((x *= 10) - (int)x) {      printf("%d\n" , (int)x % 10); }  有什么更好的方法吗 ?[/quote] char str[20]; double f=14.309948; sprintf(str,"%f",f); 查一下sprintf函数，有现成的函数，不需要自己这样子转

user: user-0
content: 引用 7 楼 WNs_ACE 的回复:[quote=引用 6 楼 LandY和C 的回复:] [quote=引用 4 楼 WNs_ACE 的回复:] 我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）  说的很详细  ,  那意思就是 这个代码在不同的机器上会有不同的结果喽.  也就是间接的告诉我不能这么用.  证实 非0即为真 不包括小数[/quote] 基本上来说，在PC和一般的高端平台，我觉得基本上你上面这样写没有问题，while (0.000001)为真，while (0.00000)为假，但是如果是低端嵌入式平台，可能就不可以了。[/quote]  换个方式问这个问题(核心没变) 如何将浮点数转字符串. 假设 x = 0.00123 ; 我的具体代码  while ((x *= 10) - (int)x) {      printf("%d\n" , (int)x % 10); }  有什么更好的方法吗 ?

user: user-2
content: 引用 6 楼 LandY和C 的回复:[quote=引用 4 楼 WNs_ACE 的回复:] 我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）  说的很详细  ,  那意思就是 这个代码在不同的机器上会有不同的结果喽.  也就是间接的告诉我不能这么用.  证实 非0即为真 不包括小数[/quote] 基本上来说，在PC和一般的高端平台，我觉得基本上你上面这样写没有问题，while (0.000001)为真，while (0.00000)为假，但是如果是低端嵌入式平台，可能就不可以了。

user: user-0
content: 引用 4 楼 WNs_ACE 的回复:我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）  说的很详细  ,  那意思就是 这个代码在不同的机器上会有不同的结果喽.  也就是间接的告诉我不能这么用.  证实 非0即为真 不包括小数

user: user-0
content: 引用 1 楼 user-4 的回复:我觉得是可以的.  .随便写个程序运行试试就知道了  那我问你  while (2.00000000123 - 2.00000000123) {表达式} ; 会执行吗 ?    这样移植性好嘛 ?

user: user-2
content: 我觉得这类问题就应该看汇编，你看一下汇编就懂了，while的那个判断，在汇编中就是test，然后根据test修改的寄存器来决定是否跳转，而0.000001的话，在底层应该是先通过movsd指令移动到浮点数的寄存器中，然后再通过ucomisd指令比较0（这个0是浮点数来的），最后通过test来决定是否跳转。当然具体的可能还需要看编译器来决定对应的汇编指令和汇编逻辑（因为还一些编译没有浮点数的寄存器什么的）

user: user-3
content: 不管用的语言的语法怎样规定，编程时有几个原则应该遵守的：1、避免大数吃小数；2、避免除极小数；3、避免判断两个浮点数是否相等（楼主的问题其实也属于这种情况——在判断一个极小数与0.0是否相等）......

user: user-1
content: 可以这样用。测试来看是包括小数的

user: user-4
content: 我觉得是可以的.  .随便写个程序运行试试就知道了
user-0 提问: c 语言结构体【学生管理系统】的3个问题，求解答

回复:
user: user-1
content: 在add函数里，for循环从sdtNum开始（;sdtNum<MAX_SDT;sdtNum++） 你的addup 函数有点混乱，应该可以简化一下

user: user-0
content: 引用 3 楼 user-1的回复:函数外面定义一个int sdtNum; 每增加一个学生，sdtNum++; 在print(里)，for循环条件由i<101变成i<sdtNum. 谢谢，那怎么实现信息的再增加呀？而不是增加后，就覆盖上次的信息

user: user-1
content: 函数外面定义一个int sdtNum; 每增加一个学生，sdtNum++; 在print(里)，for循环条件由i<101变成i<sdtNum.

user: user-0
content: 引用 1 楼 user-1的回复:加个学生数量变量就可以消除无用的排列了 怎么加？请大神明示，我不太会

user: user-1
content: 加个学生数量变量就可以消除无用的排列了
user-0 提问: 数据交集

回复:
user: user-1
content: 这题只要一排序，你就不要想“运行速度最优”~~~

user: user-0
content: 引用 8 楼 六道佩恩 的回复:[quote=引用 7 楼 德意志战车 的回复:] [quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 5 楼 德意志战车 的回复:]  [quote=引用 4 楼 六道佩恩 的回复:] 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？[/quote] 临时为你想的算法，是不是最优我不知道。 数组合并后以及遍历相同的数，这部分都是O(n)，终点在排序，就看你怎么排，数据范围小，推荐计数排序，最终时间复杂度为O(n)，空间复杂度在拷贝数组时用得多，O(n)，如果数的范围稍大，推荐基数排序，时间复杂度也是O(n)，消耗内存是数组的十倍，空间复杂度O(n)；如果希望消耗内存小，那就用希尔排序，时间复杂度O(n^1.3)，空间仅消耗一个数组，空间复杂度O(n)。[/quote] 文件里有几百万个数据，数组能放进去吗？[/quote] 打算你有500万个数据，每个数据占一个int，那么占不过2000万字节，不过区区20MB，直接申请数组的话可能不行，用malloc的话，只要你是家用计算机，申请个1GB都是可以的，何况区区20MB。如果你是微机，内存不够，当然，前提得闪存够大，总不可能你本来的数据都存不下吧，这种情况的微机下，你就分段处理，写进闪存，当然，速度就很慢了。如果20MB你都不够，那么前面大佬提议的512MB你就更不够了。[/quote] 明白了，我原先不知道用malloc申请

user: user-2
content: 引用 7 楼 德意志战车 的回复:[quote=引用 6 楼 六道佩恩 的回复:] [quote=引用 5 楼 德意志战车 的回复:]  [quote=引用 4 楼 六道佩恩 的回复:] 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？[/quote] 临时为你想的算法，是不是最优我不知道。 数组合并后以及遍历相同的数，这部分都是O(n)，终点在排序，就看你怎么排，数据范围小，推荐计数排序，最终时间复杂度为O(n)，空间复杂度在拷贝数组时用得多，O(n)，如果数的范围稍大，推荐基数排序，时间复杂度也是O(n)，消耗内存是数组的十倍，空间复杂度O(n)；如果希望消耗内存小，那就用希尔排序，时间复杂度O(n^1.3)，空间仅消耗一个数组，空间复杂度O(n)。[/quote] 文件里有几百万个数据，数组能放进去吗？[/quote] 打算你有500万个数据，每个数据占一个int，那么占不过2000万字节，不过区区20MB，直接申请数组的话可能不行，用malloc的话，只要你是家用计算机，申请个1GB都是可以的，何况区区20MB。如果你是微机，内存不够，当然，前提得闪存够大，总不可能你本来的数据都存不下吧，这种情况的微机下，你就分段处理，写进闪存，当然，速度就很慢了。如果20MB你都不够，那么前面大佬提议的512MB你就更不够了。

user: user-0
content: 引用 6 楼 六道佩恩 的回复:[quote=引用 5 楼 德意志战车 的回复:]  [quote=引用 4 楼 六道佩恩 的回复:] 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？[/quote] 临时为你想的算法，是不是最优我不知道。 数组合并后以及遍历相同的数，这部分都是O(n)，终点在排序，就看你怎么排，数据范围小，推荐计数排序，最终时间复杂度为O(n)，空间复杂度在拷贝数组时用得多，O(n)，如果数的范围稍大，推荐基数排序，时间复杂度也是O(n)，消耗内存是数组的十倍，空间复杂度O(n)；如果希望消耗内存小，那就用希尔排序，时间复杂度O(n^1.3)，空间仅消耗一个数组，空间复杂度O(n)。[/quote] 文件里有几百万个数据，数组能放进去吗？

user: user-2
content: 引用 5 楼 德意志战车 的回复:[quote=引用 4 楼 六道佩恩 的回复:] 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？[/quote] 临时为你想的算法，是不是最优我不知道。 数组合并后以及遍历相同的数，这部分都是O(n)，终点在排序，就看你怎么排，数据范围小，推荐计数排序，最终时间复杂度为O(n)，空间复杂度在拷贝数组时用得多，O(n)，如果数的范围稍大，推荐基数排序，时间复杂度也是O(n)，消耗内存是数组的十倍，空间复杂度O(n)；如果希望消耗内存小，那就用希尔排序，时间复杂度O(n^1.3)，空间仅消耗一个数组，空间复杂度O(n)。

user: user-0
content: 引用 4 楼 六道佩恩 的回复:你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的 这是什么算法，是最优的吗?时间复杂度是多少？

user: user-2
content: 你这样：把两个数组拷贝一份，然后合并，然后排序，然后遍历，如果一个数出现两次，那就是交集的

user: user-1
content: 建立一个512MB的数组，共4G bits代表数字0~4294967295，初始置0 顺序读文件1，把每一个数字对应的数组位置1 顺序读文件2，如果数字对应的数组位是1，把该数字写入输出文件

user: user-0
content: 引用 1 楼 早打大打打核战争 的回复:位图法直接索引整个int32范围，需要消耗512MB内存 我可以理解成这个程序想要写出来需要位图法吗？

user: user-1
content: 位图法直接索引整个int32范围，需要消耗512MB内存
user-0 提问: 初学者，请教字段是什么意思？字段宽度是什么意思？

回复:
user: user-1
content: 表的基础知识  表是包含数据库中所有数据的数据库对象。表定义是一个列集合。数据在表中的组织方式与在电子表格中相似，都是按行和列的格式组织的。每一行代表一条唯一的记录，每一列代表记录中的一个字段。例如，在包含公司雇员数据的表中，每一行代表一名雇员，各列分别代表该雇员的信息，如雇员编号、姓名、地址、职位以及家庭电话号码等。

user: user-1
content: struct struct [tag] { member-list } [declarators];  [struct] tag declarators;  The struct keyword defines a structure type and/or a variable of a structure type. See Anonymous Structures and Unsized Array in a Structure for more information.  A structure type is a user-defined composite type. It is composed of "fields" or "members" that can have different types.  In C++, a structure is the same as a class except that its members are public by default.  Using a Structure  In C, you must explicitly use the struct keyword to declare a structure. In C++, this is unnecessary once the type has been defined.  You have the option of declaring variables when the structure type is defined by placing one or more comma-separated variable names between the closing brace and the semicolon.  For related information, see class, union, and enum.  Example 1  struct PERSON              // Declare PERSON struct type {    int   age;              // Declare member types    long  ss;    float weight;    char  name[25]; } family_member;           // Define object of type PERSON     struct PERSON sister;   // C style structure declaration    PERSON brother;         // C++ style structure declaration     sister.age  = 13;       // assign values to members    brother.age =  7; Structure variables can be initialized. The initialization for each variable must be enclosed in braces.  Example 2  struct POINT            // Declare POINT structure {    int x;               // Define members x and y    int y; } spot = { 20, 40 };    // Variable spot has                         //     values x = 20, y = 40 struct POINT there;     // Variable there has POINT type struct CELL             // Declare CELL bit field {    unsigned character  : 8;  // 00000000 ????????    unsigned foreground : 3;  // 00000??? 00000000    unsigned intensity  : 1;  // 0000?000 00000000    unsigned background : 3;  // 0???0000 00000000    unsigned blink      : 1;  // ?0000000 00000000 } screen[25][80];       // Array of bit fields
user-0 提问: C语言大佬求教 哪里错了

回复:
user: user-0
content: 引用 2 楼 user-4的回复:有些比较旧的编译器要求把变量声明都放在函数最前面 谢谢 可以了。。。。。。。。。

user: user-0
content: 引用 4 楼 Cokie℡的回复:你试试把change的声明放到开头去，单独写一个int change； 可以了 谢谢。。。。。。。。

user: user-0
content: 引用 3 楼 csucxy的回复:将change的声明提前。 老的C要求局部变量的声明在块的开头，如果你用的是高版本的VS应该没有这个问题， 好了😁谢谢你。。。。。。。。

user: user-1
content: “错误.c”改名为“错误.cpp”再试试。

user: user-2
content: 你试试把change的声明放到开头去，单独写一个int change；

user: user-3
content: 将change的声明提前。 老的C要求局部变量的声明在块的开头，如果你用的是高版本的VS应该没有这个问题，

user: user-4
content: 有些比较旧的编译器要求把变量声明都放在函数最前面

user: user-0
content: 救命头疼 哪位大佬帮帮忙
user-0 提问: 萌新求助——关于c语言的疑问

回复:
user: user-0
content: 谢谢(*°∀°)=3果然是这个问题，你们棒棒棒棒哒

user: user-1
content: scanf()和puts()函数都是在头文件<stdio.h>里面的，加上#include<stdio.h>就行了，下面报错基本都是这个原因

user: user-2
content: 加一下<stdio.h>头文件试一下

user: user-3
content: 引入c语言标准io头文件 stdio.h
user-0 提问: 求大佬帮忙看下

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

user: user-0
content: 谢谢各位已经解决，是名字错了

user: user-2
content: 你的结构体在哪。。

user: user-3
content: 估计是data

user: user-4
content: 关键的代码没贴出来，你的结构体定义里有没有date呢？还是定义的是data但是函数里引用的是date

user: user-1
content: data和date不是一回事！

user: user-5
content: typedef struct student{int date, struct student * next} link;
user-0 提问: C语言BC31问题：Linker Error: Undefined symbol _main in module c0.ASM

回复:
user: user-1
content: bc++3.1 帮助里面对每个函数都有一小段能拷贝出来运行看效果的例子程序。非常适合初学C语言。相比较而言VC带的帮助MSDN就没有。http://download.csdn.net/source/2805028
user-0 提问: c 语言结构体系统，【学生管理系统】信息增加重叠，如何改正

回复:
user: user-1
content: 你需要了解一下堆栈，你就知道为什么每次只能存一组数据了。 还有你的思路我认为不太好，如果存一个结构体数据的话，就算用一个单链表也是很简单很方便的，你这种思路我不是很理解。。

user: user-0
content: 引用 2 楼 weixin_42911598的回复:你需求都没写清楚，你增加信息是增加什么信息，直接遍历你的链表做判断，不管是显示信息还是重叠什么的判断直接操作链表指针不就行了。。 我事想来写一个，没有只有指针，链表结构体【数组】的程序，增加信息的话。现在我输入第一个信息，可以查询到第一组信息，但输入第二个信息的话，查询只能查询到第二组信息，没有第一组信息了。这就让我头疼的地方了。大神可以帮我解答一下吗？，

user: user-1
content: 你需求都没写清楚，你增加信息是增加什么信息，直接遍历你的链表做判断，不管是显示信息还是重叠什么的判断直接操作链表指针不就行了。。

user: user-2
content: 每次的输入先放到一个临时变量里，每次输入之后都去已经输入过得信息查找，如果查找到则不想student[]里存放并给予提示。 另外，信息重叠是指那个信息重叠不行，查找功能里就去比较那个信息。
user-0 提问: MODBUS协议

回复:
user: user-1
content: https://download.csdn.net/download/charliecha1982/9623230

user: user-0
content: 引用 3 楼 轻箬笠的回复:http://blog.gkong.com/freshair_64760.ashx是不是这种啊 可以可以，非常的流批，感谢

user: user-2
content: http://blog.gkong.com/freshair_64760.ashx是不是这种啊

user: user-0
content: 引用 1 楼 636f6c696e的回复:https://download.csdn.net/download/charliecha1982/9623230 大佬，有没有免费的，这一个再让我开个会员，要不我给你转现金，
user-0 提问: 输入3个科目4个人的得分，写出得分、和、平均分，再求出各科目的平均分

回复:
user: user-1
content: #include<stdio. h> void print (int [][3]) ; int main(void){     int mem[4][3];     for (int i=0;i<4;i++){         printf("*** Member%d ***\n",i+1) ;         for (int j=0;j<3;j++) {               printf("Input point of subject%d :", j+1) ;               scanf("%d", mem[i+]j);               if (mem[i][j]<0 || mem [i][j]>100) {                        printf("\nInput point 0-100. \n") ;                        j--;                  }          }     }    print(mem;      return 0; } void print( int m[][3]) {          ..... .  . }e;

user: user-2
content: 你要我们看啥。。

user: user-3
content: 那改什么？你的代码为啥补贴出来呢？

user: user-0
content: 这是要求最后实行的结果，但不会写代码
user-0 提问: 为什么运行程序后只有输入，没有输出

回复:
user: user-1
content: #include <stdio.h>  int main(void) {    int i, n, a[50], t;    scanf("%d", &n);     for (i = 0; i < n; i++)    {       scanf("%d", &a[i]);    }     for (i = 0; i < n / 2; i++)    {       t = a[i];       a[i] = a[n-i-1];       a[n-i-1] = t;    }     for (i = 0; i < n; i++)       printf("%d ", a[i]);     return 0; }

user: user-2
content: 后面有明确赋值的情况下不需要初始化，核心问题有两个： 1. 最后一个for循环误加分号：for(i=0;i<=n;i++); 2.一般n个元素最后一个的索引是n-1而不是n，建议你所有for循环中的i<=n改成i<n，不然你的程序结果是和预期不符的 引用 1 楼  的回复:1.数组a[50]没有初始化； 2.这个程序是想要交换数组内元素的位置？ a[3] = {1, 2, 3} ==》 a[3] = {3, 2, 1}

user: user-2
content: 后面有明确赋值的情况下不需要初始化，核心问题有两个： 1. 最后一个for循环误加分号：for(i=0;i<=n;i++); 2.一般n个元素最后一个的索引是n-1而不是n，建议你所有for循环中的i<=n改成i<n，不然你的程序结果是和预期不符的 引用 1 楼  的回复:1.数组a[50]没有初始化； 2.这个程序是想要交换数组内元素的位置？ a[3] = {1, 2, 3} ==》 a[3] = {3, 2, 1}

user: user-2
content: 后面有明确赋值的情况下不需要初始化，核心问题有两个： 1. 最后一个for循环误加分号：for(i=0;i<=n;i++); 2.一般n个元素最后一个的索引是n-1而不是n，建议你所有for循环中的i<=n改成i<n 引用 1 楼  的回复:1.数组a[50]没有初始化； 2.这个程序是想要交换数组内元素的位置？ a[3] = {1, 2, 3} ==》 a[3] = {3, 2, 1}

user: user-3
content: 1.数组a[50]没有初始化； 2.这个程序是想要交换数组内元素的位置？ a[3] = {1, 2, 3} ==》 a[3] = {3, 2, 1}

user: user-4
content: #include<stdio.h> int main() {     int i,n,a[50],t;     scanf("%d",&n);     if (n >= 50)    //防止数组越界         return 0;     printf("\n");     for(i=0;i<=n;i++)         scanf("%d",&a[i]);     for(i=0;i<=n/2;i++)     {         t=a[i];         a[i]=a[n-i-1];         a[n-i-1]=t;     }     for(i=0;i<=n;i++)    //去掉;,否则这里只会循环执行不到printf语句         printf("%d",a[i]);      return 0; } 供参考～
user-0 提问: 通过bpf收发数据，用write函数发送数据，发现此函数有时候会耗时较大

回复:
user: user-1
content: 開綫程做咯，這樣主綫程就可以繼續計時

user: user-2
content: 不太清楚你这是要干嘛，通信的方式不是有很多吗，写文件是在写闪存或磁盘了，速度比较慢，你完全可以定义一个数组来交互数据啊，或者用管道

user: user-0
content: 只是在4000多次周期中会出现3到4次耗时达到6ms，其他都是小于1ms的
user-0 提问: 求大神帮帮忙啊――只有思路也可以啊

回复:
user: user-1
content: 这道题水很深滴： ●行尾到底是\r\n,\r,\n? ●一行最多多少个字符？ ●遇到汉字怎么办？ ●遇到阿拉伯文怎么办？ ●遇到纯二进制文件怎么办？ ●文件中字符编码到底是啥？ ●……  参考：https://blog.csdn.net/Peak1949/article/details/7179298

user: user-0
content: 就是要做一个简单的排版 要求每行18个字符 首行缩进两个字符 然后在统计行数

user: user-0
content: 就是要做一个简单的段落排版

user: user-2
content: 引用 4 楼  的回复:请问每行18个字符，遇到回车换行，首行缩进怎么实现 没懂你意思，这个程序的逻辑主要是，复制一个文字到新文件，如果它是\n，就说明该换行了，此时写入一个行号到新文件。如果有没明白的，把你要处理的数据贴出来。

user: user-0
content: 引用 2 楼 六道佩恩的回复: #include "stdio.h" int main( int argc, char* argv[] ) { 	if( argc != 3 ) 		return 0; 	 	FILE *p= fopen(argv[1], "r"); 	FILE *q= fopen(argv[2], "w"); 	int c=0,i=1; 	fprintf(q,"%d\t",i++); 	while( (c=fgetc(p)) != EOF ) 	{	 		fputc(c, q); 		if( c=='\n' ) 			fprintf(q,"%d\t",i++); 	} 	 	fclose(p); 	fclose(q); 	return 0; }  使用方式是：程序名  原文件名  新文件名 请问每行18个字符，遇到回车换行，首行缩进怎么实现

user: user-0
content: 请问每行18个字符，遇到回车换行，首行缩进怎么实现

user: user-2
content: #include "stdio.h" int main( int argc, char* argv[] ) { 	if( argc != 3 ) 		return 0; 	 	FILE *p= fopen(argv[1], "r"); 	FILE *q= fopen(argv[2], "w"); 	int c=0,i=1; 	fprintf(q,"%d\t",i++); 	while( (c=fgetc(p)) != EOF ) 	{	 		fputc(c, q); 		if( c=='\n' ) 			fprintf(q,"%d\t",i++); 	} 	 	fclose(p); 	fclose(q); 	return 0; }  使用方式是：程序名  原文件名  新文件名

user: user-3
content: 利用getLine() 读取data.txt到二维数组中，然后给数组中的每一行数据加上行号，重新写入到这个文件里面
user-0 提问: C语言链表

回复:
user: user-0
content: 谢谢赵老师，这个过程我明白，就是因为现在存放在数据域的是指针，那么它的操作是不是和存放数据的结构体有些差异。

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

user: user-0
content: Node * head   这是用来遍历链表定义的临时量，就是一个链表指针，next存指向下一个元素的地址

user: user-2
content: 一层循环做什么排序？  p->data =head->data;      head->data =tmp->data;      tmp->data=head; 这几句看不懂，data是保存数据的，怎么连到head上去呢，next做什么用呢？

user: user-0
content: 是不是这个冒泡差点东西
user-0 提问: c语言小白，用xcode写了几行代码，总是运行不出结果。

回复:
user: user-1
content: 贴出你的代码，按照楼上说的改绝对不会有问题 引用 3 楼 qq_45401357 的回复:[quote=引用 1 楼 自信男孩的回复:]两处问题： 1.输入改成： scanf("%f%f", &a, &b); 2. max函数里z定义成float类型； 然后在试一下  另外，为了更好的比较浮点数，建议参考如下链接内容： https://blog.csdn.net/kingdom54/article/details/86566925 谢谢，还是不行，变成一堆❓❓[/quote]

user: user-2
content: 他们说的没错，就是scanf的问题，是你自己没改对，你之所以敲回车没反应，是因为你敲的回车都被scanf里的"\n"全部匹配掉了，所以你要注意三点： 1. scanf后面的双引号里，最后不要加空格或\t、\n，即写为"%f\n%f"或"%f%f"或"%f %f" 2. scanf后面的双引号里，空格、\t、\n等效，你的"%f\n%f"等价于"%f %f" 3. scanf后面的双引号怎么写，你就要怎么输入，在"%f %f"的情况下，你应该输入“数 空格 数” 如果还有问题，粘贴代码

user: user-0
content: 试了，还是不行 谢谢…

user: user-0
content: 引用 1 楼 自信男孩的回复:两处问题： 1.输入改成： scanf("%f%f", &a, &b); 2. max函数里z定义成float类型； 然后在试一下  另外，为了更好的比较浮点数，建议参考如下链接内容： https://blog.csdn.net/kingdom54/article/details/86566925 谢谢，还是不行，变成一堆❓❓

user: user-3
content: 改成scanf("%f %f", &a, &b);试试

user: user-4
content: 两处问题： 1.输入改成： scanf("%f%f", &a, &b); 2. max函数里z定义成float类型； 然后在试一下  另外，为了更好的比较浮点数，建议参考如下链接内容： https://blog.csdn.net/kingdom54/article/details/86566925
user-0 提问: 请教一个关于free()函数的问题

回复:
user: user-0
content: 引用 9 楼 六道佩恩 的回复:[quote=引用 8 楼 牧牛童子 的回复:] [quote=引用 3 楼 六道佩恩 的回复:] 不管怎样，只要你free的时候给的是申请的内存的首地址即可，你的程序运行结果是，那么就可行  也就是说，free是首地址，至于是什么变量名，无所谓，是么？（两个指针指向同一个地址，free其中一个，就可以？）[/quote] 是的，你用malloc申请地址时，系统为了知道这块内存是你用的，会标记这块内容是吧，标记使用的程序、首地址、长度等等（猜的），是吧，那么free的参数就是一个首地址，告诉系统你要释放这块地址，系统根据这个首地址就知道是哪块内存、多长，解除后，又可以给其他程序用了。 何止是变量名，变量名有什么区别？你只要给它这个首地址值就行，唯一要注意的就是参数的类型，因为free函数内部是用一个void*类型的形参来接收的这个参数，你要传指针型，或者强制转为指针型，比如你已经知道首地址是0x010100，那么你甚至可以写free( (void*)0x010100 )[/quote]  非常感谢！

user: user-0
content: 引用 3 楼 六道佩恩 的回复:不管怎样，只要你free的时候给的是申请的内存的首地址即可，你的程序运行结果是，那么就可行  也就是说，free是首地址，至于是什么变量名，无所谓，是么？（两个指针指向同一个地址，free其中一个，就可以？）

user: user-1
content: 引用 8 楼 牧牛童子 的回复:[quote=引用 3 楼 六道佩恩 的回复:] 不管怎样，只要你free的时候给的是申请的内存的首地址即可，你的程序运行结果是，那么就可行  也就是说，free是首地址，至于是什么变量名，无所谓，是么？（两个指针指向同一个地址，free其中一个，就可以？）[/quote] 是的，你用malloc申请地址时，系统为了知道这块内存是你用的，会标记这块内容是吧，标记使用的程序、首地址、长度等等（猜的），是吧，那么free的参数就是一个首地址，告诉系统你要释放这块地址，系统根据这个首地址就知道是哪块内存、多长，解除后，又可以给其他程序用了。 何止是变量名，变量名有什么区别？你只要给它这个首地址值就行，唯一要注意的就是参数的类型，因为free函数内部是用一个void*类型的形参来接收的这个参数，你要传指针型，或者强制转为指针型，比如你已经知道首地址是0x010100，那么你甚至可以写free( (void*)0x010100 )

user: user-0
content: 谢谢各位热心帮助解惑！！！

user: user-0
content: 引用 5 楼 nice_cxf 的回复:这样写没问题，但是一般来说，在那里申请就应该在那里释放，最好是在main函数先malloc，然后把指针传给函数，然后main函数free，这样查问题比较容易，如果你这个函数封装在库里面，别人调用了，但是没free就内存泄漏了，这种问题很难检查的  我从github下载了个3DES的源码，就是在函数里面malloc()，要我在外面调用时free();。夸函数体的玩法，心里没底。

user: user-2
content: 这样写没问题，但是一般来说，在那里申请就应该在那里释放，最好是在main函数先malloc，然后把指针传给函数，然后main函数free，这样查问题比较容易，如果你这个函数封装在库里面，别人调用了，但是没free就内存泄漏了，这种问题很难检查的

user: user-3
content: 可以这么写，没问题

user: user-1
content: 不管怎样，只要你free的时候给的是申请的内存的首地址即可，你的程序运行结果是，那么就可行

user: user-4
content: 可以这么写，只要申请的地址不变，即free的参数（指针）是申请的地址值，free都是没问题的

user: user-5
content: 通常情况下，可以这么写。 特殊情况，比如dll调用，这种写法会有问题
user-0 提问: 求大神给看看为什么我的代码运行不了？？敲回车以后只换行不运行

回复:
user: user-1
content: 你的问题是死循环，while每次循环下需要将p的值还原成1 #include<stdio.h> int main() { int n;int m;int sum=0;int count=0;int t=2;int a; scanf("%d %d",&n,&m); int i=2;int p=1; while(count<m) { p = 1; for(t=2;t<i;t++) { a=i%t; if(a==0) { p=0; break; } } if(p==1) { count++; if(count>=n) { sum=sum+i; } }  i++; } printf("%d\n",sum);  return 0; } 引用 5 楼 Na2So4_ 的回复:[quote=引用 2 楼 weixin_40290083的回复:]i被初始化为2，t在for循环中初始化为2，循环条件t<2，所以for循环没有运行。 另外也不知道你的程序要实现什么功能，如果代码有逻辑很难读懂，建议你文字描述功能 可是for循环没有运行 while循环也要运行的啊，[/quote]

user: user-0
content: 引用 2 楼 weixin_40290083的回复:i被初始化为2，t在for循环中初始化为2，循环条件t<2，所以for循环没有运行。 另外也不知道你的程序要实现什么功能，如果代码有逻辑很难读懂，建议你文字描述功能 可是for循环没有运行 while循环也要运行的啊，

user: user-0
content: 引用 2 楼 weixin_40290083的回复:i被初始化为2，t在for循环中初始化为2，循环条件t<2，所以for循环没有运行。 另外也不知道你的程序要实现什么功能，如果代码有逻辑很难读懂，建议你文字描述功能 我们认为2是第一个素数，3是第二个素数，5是第三个素数，依次类推。 现在，给定两个整数n和m，0<n<=m<=200，你的程序要计算第n个素数到第m个素数之间所有的素数的和，包括第n个素数和第m个素数。  这个是题目

user: user-0
content: 我们认为2是第一个素数，3是第二个素数，5是第三个素数，依次类推。 现在，给定两个整数n和m，0<n<=m<=200，你的程序要计算第n个素数到第m个素数之间所有的素数的和，包括第n个素数和第m个素数。  这个是题目

user: user-2
content: i被初始化为2，t在for循环中初始化为2，循环条件t<2，所以for循环没有运行。 另外也不知道你的程序要实现什么功能，如果代码有逻辑很难读懂，建议你文字描述功能

user: user-3
content: 可以运行啊。 你输入1 2，然后回车就有输出了。 如果console一闪而过，可以在最后面加几个getchar();
user-0 提问: PTA上的买火车票问题，总是通不过

回复:
user: user-0
content: 因为刚刚开始用，大的效果还不是很清楚。就目前而言在上面练习会让自己更注意细节和算法的优化吧（因为会运行限制时间和内存）

user: user-1
content: 类似pta这样的网站，刷题之后，效果如何啊？

user: user-0
content: 已经解决了，居然就因为大小写！！！
user-0 提问: 求教大佬，c语言switch语句的一个疑问

回复:
user: user-1
content: 怪不得，你default写错了，写成了dafault。

user: user-1
content: 输入缓冲区的问题，表面上你输入的是A，其实你输入是A和\n，第二次循环时，还有这个\n没接收，于是scanf就把它接收掉了，然后继续执行下面的代码，因此就有了那个输出。不过奇怪的是，按理说应该会执行一次default才对

user: user-2
content: 只是跳出了switch,但还在while循环里面。

user: user-0
content: 明白了，非常感谢大佬😊

user: user-3
content: 调试运行，追踪一下程序

user: user-3
content: 第一次输入A回车后，其实是输入了两个字符'A'、'\n'，第一次循环时gread获得了'A'，第二次循环它获得'\n'。  另外，default错成了dafault

user: user-4
content: #include<stdio.h> int main() {     char gread;     while(1)     {         scanf("%c",&gread);         getchar();         printf("Your score:");         switch(gread)         {             case'A':printf("85~100\n");break;             case'B':printf("70~84\n");break;             case'C':printf("60~69\n");break;             case'D':printf("<60\n");break;             //dafault:printf("enter data error!\n");             default:printf("enter data error!\n");         }     }     return 0; }  供参考~  default写成dafault，单词拼写错误； 第二个问题，也是你问的问题，输入'A'之后，'\n'还在输入缓存里，被第二次scanf接收，走了default分支。 解决办法是加getchar();如上的代码～

user: user-5
content: 楼主的问题在于没有加getchar()吸收回车字符 当然default分支没有加break也是问题，但不是楼主遇到问题的原因 引用 2 楼 weixin_44822001 的回复:[quote=引用 1 楼 莲生fly的回复:]break只跳出了switch语句，没有跳出while语句，应该在switch语句后面，再加一个break 没明白，哪儿加break[/quote]

user: user-6
content: {case'A':printf("85~100\n"); continue; case'B':printf("70~84\n");continue; case'C':printf("60~69\n");continue; case'D':printf("<60\n");continue; dafault: break!} break;}  这样改会不会更符合你的要求？\n");

user: user-6
content: case'A':printf("85~100\n"); continue; case'B':printf("70~84\n");continue; case'C':printf("60~69\n");continue; case'D':printf("<60\n");continue; dafault: break!b break;}  这样改会不会更符合你的要求？\n");

user: user-6
content: while里面，执行完switch之后

user: user-0
content: 引用 1 楼 莲生fly的回复:break只跳出了switch语句，没有跳出while语句，应该在switch语句后面，再加一个break 没明白，哪儿加break

user: user-6
content: break只跳出了switch语句，没有跳出while语句，应该在switch语句后面，再加一个break