Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: OJ 队列题 求解 ！！！

回复:
user: user-0
content: [color=#FFFF00][quote=引用 10 楼 user-1 的回复:]   QueCut是怎么定义的 没懂...

user: user-1
content: int PRINT(SqQueue &Q) {     int index = Q.front;   for(int i=0; i<QueCnt; i++) {     printf("%c ",Q.base[index++]);     index %= 10000; } printf("\n");      return OK; }

user: user-1
content: 建议增加元素计数，否则不好判队列空和队列满 int ENTER(SqQueue &Q,char value) {     if (QueCnt >= 10000)         return;      Q.base[Q.rear++]=value;     Q.rear %= 10000;     QueCnt++;     return OK; }

user: user-1
content: 你想复杂了呀，举个函数修改例子（建议参考你初始代码） int ENTER(SqQueue &Q,char value) {      Q.base[Q.rear++]=value;    Q.rear %= 10000;    return OK; }

user: user-0
content: 引用 5 楼 user-1 的回复:1. 最好记录下队列中元素数目，防止front'/rear重叠后不知道是空队列还是满队列 2. 函数中front/rear在++后对10000求余 3. print函数考虑rear小于front的场景（要么分两段打印，要么同样对10000求余就行，只是循环条件写清楚，最好写成从0到队列数目。  以上改动主要就是加个求余，以实现“环形”队列操作  能再帮我看看代码吗 我看了你的建议修改了但是OJ还是不给通过 实在是不知道怎么办  #include <stdio.h> #include <stdlib.h> #include<string.h> #include<stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define MAXSIZE 10020  typedef char QElemType; typedef struct {     QElemType *base;//存储空间基地址     int front;//头指针     int rear;//尾指针  }SqQueue;  int INIT(SqQueue &Q) {     Q.base=new QElemType[MAXSIZE]; 	if(!Q.base)  exit(OVERFLOW); 	Q.front=Q.rear=0; 	return OK; }   int PRINT(SqQueue &Q) {      if(Q.front>=Q.rear%MAXSIZE) return ERROR;      else{     for(int i=Q.front;i<Q.rear;i++) 	{ 		printf("%c ",Q.base[i]); 	} 	printf("\n");      return OK;} }  int ENTER(SqQueue &Q,char value) {     if((Q.rear+1)%MAXSIZE==Q.front) return ERROR;     Q.base[Q.rear]=value;    Q.rear=(Q.rear+1)%MAXSIZE;    return OK; }  int OUT(SqQueue &Q,char &value) {     if(Q.front==Q.rear%MAXSIZE)  return ERROR; 	else{ 	value=Q.base[Q.front];     Q.front=(Q.front+1)%MAXSIZE; 	return OK;}  }  int LENGTH(SqQueue &Q) {     return (Q.rear-Q.front+MAXSIZE)%MAXSIZE; }      int main(){     SqQueue Q;     int i=0;     char value;     int choice;     char s[10000],ch;     scanf("%d",&choice);      while(i<choice)     {          scanf("%s",s);         if(strcmp("INIT",s)==0) INIT(Q);          else if(strcmp("ENTER",s)==0)         {             scanf("%s",&value);             ENTER(Q,value);         }           else if(strcmp("LENGTH",s)==0) printf("%d\n",LENGTH(Q));         else if(strcmp("PRINT",s)==0) PRINT(Q);         else if(strcmp("OUT",s)==0) OUT(Q,value);    i++;      }      return 0; }

user: user-0
content: 好的 十分感谢  引用 5 楼 user-1 的回复:1. 最好记录下队列中元素数目，防止front'/rear重叠后不知道是空队列还是满队列 2. 函数中front/rear在++后对10000求余 3. print函数考虑rear小于front的场景（要么分两段打印，要么同样对10000求余就行，只是循环条件写清楚，最好写成从0到队列数目。  以上改动主要就是加个求余，以实现“环形”队列操作

user: user-1
content: 1. 最好记录下队列中元素数目，防止front'/rear重叠后不知道是空队列还是满队列 2. 函数中front/rear在++后对10000求余 3. print函数考虑rear小于front的场景（要么分两段打印，要么同样对10000求余就行，只是循环条件写清楚，最好写成从0到队列数目。  以上改动主要就是加个求余，以实现“环形”队列操作

user: user-0
content: 引用 1 楼 user-1的回复:异常考虑不完善，你要把队列当一个环来处理。 假设塞满10000数据，弹出一个，再塞入一个，你的rear++不就越界了吗？  所以各个函数都要考虑求余，考虑rear反转的情况！ 那请问我得用什么办法解决比较合适，我对这方面也是刚在学，谢谢你的回答。

user: user-1
content: 异常考虑不完善，你要把队列当一个环来处理。 假设塞满10000数据，弹出一个，再塞入一个，你的rear++不就越界了吗？  所以各个函数都要考虑求余，考虑rear反转的情况！
user-0 提问: 求大佬们告知我getchar和scanf函数的区别

回复:
user: user-1
content: https://zhidao.baidu.com/question/63301588.html

user: user-1
content: 首先 getchar()，如果没错，是获取输入的一个字符，然后putchar是输出一个字符，1和2是可以换的吧，你自己改程序运行一下就知道了。 然后scanf也是输入，按两次enter是指？
user-0 提问: 程序出问题求解答

回复:
user: user-0
content: 引用 2 楼 N-n-N 的回复:把ave(a[5])改成ave(a)看看，因为a[5]是传递a数组中的第5位，而不是数组a感谢  成功了

user: user-0
content: 引用 2 楼 N-n-N 的回复:把ave(a[5])改成ave(a)看看，因为a[5]是传递a数组中的第5位，而不是数组a感谢 成功了

user: user-1
content: 把ave(a[5])改成ave(a)看看，因为a[5]是传递a数组中的第5位，而不是数组a

user: user-2
content: ave() 的参数 是 float*  你传的 a[5] 是float ； 改成 ave(a)
user-0 提问: C语言入门遇到个棘手的问题急求解决

回复:
user: user-1
content: x = x/2;  int类型会自动只保留前面的整数位，可能是这儿错了。（float）x = (float)x / 2;

user: user-2
content: VS 2015 下跑，没问题

user: user-3
content: 不应该用int类型，涉及除法了，用float吧。
user-0 提问: 为什么malloc申请的空间free后，指针变量的地址还存在？？而且还能再次使用？如果一直malloc，free，那岂不是最后内存也会用尽？？？

回复:
user: user-1
content: 1.free 和 delete 内存释放是释放的指针指向的内存, 指针本身不会被你释放，在这里指针本身属于自动变量，会在程序块执行完后释放内存； 2.释放只是那块内存可以用作其他，并不会主动给你清理内存的数据，所以每次申请内存后最好设置一下初始值来覆盖以前的值； 3.p 指向的内存被释放了，但是你还可以利用p来操作那块地址，虽然可行，但这是一个未定义的操作，危险的操作，即访问一块未分配的内存空间，这里没出问题因为你刚分配过，释放后接着访问，而且只访问int大小的空间，如果你执行 *(p++) 之类的操作就可能引发严重的问题；  所以一般 释放指针指向的内存后 需要 p = NULL; 来将指针指向NULL 表示以前那块内存不再可用。  野指针 百度百科: 野指针主要是因为这些疏忽而出现的删除或申请访问受限内存区域的指针。 指针变量未初始化 任何指针变量刚被创建时不会自动成为NULL指针，它的缺省值是随机的，它会乱指一气。所以，指针变量在创建的同时应当被初始化，要么将指针设置为NULL，要么让它指向合法的内存。如果没有初始化，编译器会报错“ ‘point’ may be uninitializedin the function ”。 指针释放后之后未置空 有时指针在free或delete后未赋值 NULL，便会使人以为是合法的。别看free和delete的名字（尤其是delete），它们只是把指针所指的内存给释放掉，但并没有把指针本身干掉。此时指针指向的就是“垃圾”内存。释放后的指针应立即将指针置为NULL，防止产生“野指针”。

user: user-2
content: 楼上正解，说得很详细了，释放之后逻辑地址依然在那，只是你不应该人为去修改它，应该交由操作系统管理，后续再malloc使用，但是不能保证下次malloc到的一定是这个地址，不过对于用户来说这个并不重要，毕竟是逻辑地址而不是物理地址。

user: user-3
content: 通常我们访问的逻辑地址，你申请或者不申请，地址都在那里，你就可以往里面放东西。  但是，你得知道该地址是个有效地址，否则就可能程序崩溃（比如，你往地址为1的内存写入东西）  内存释放后，当前没有别人在用它，所以你仍然用了，但是这算是非法访问。针对多线程的程序来说，可能别人把这个内存地址刚给申请了，而你改写了他的东西，就会导致他那边出异常。
user-0 提问: 一道数据结构的问题

回复:
user: user-0
content: 我用的是栈啊

user: user-1
content: 这是栈的基本应用

user: user-0
content: 可否在我的基础上进行修改呢？当然有更好的办法也可以请大佬们提出来，谢谢啦

user: user-2
content: 引用 1 楼 user-3 的回复:感觉好复杂的样子，我觉得定义个数组，一次判断符号就好了左边加右边减，最后判断是不是０，０就配对可能会交叉使用，如【（6+9】*6），这样就不是匹配的了

user: user-3
content: 感觉好复杂的样子，我觉得定义个数组，一次判断符号就好了左边加右边减，最后判断是不是０，０就配对
user-0 提问: 文本的读写位置问题

回复:
user: user-0
content: 引用 1 楼 棉猴 的回复：getc()函数的作用是从流中读取一个字符，如果读完这个字符后没有读到流的最后一个字符，此时调用其他读写数据流函数（例如fprintf()等函数）时，就会报错。只有当getc()函数读取了数据流中的所有元素后，getc()函数才会释放对流的占用。 如果您代码中的“123.txt”是空文件时，您使用getc()函数后，再使用fprintf()函数写入数据，此时就会写入成功，原因是调用一次getc()函数就已经把流中的所有数据都读完了（因为是空文件），此时getc()函数就释放了对流的占用。 如果“123.txt”中的内容大于1个字符，此时只调用一次getc()无法读取完流中的数据，可以考虑使用fseek()函数将流指针移动到最后位置，然后再次调用getc()，之后getc()函数就释放对流的占用，再次调用fprintf()函数就可以写入成功了。 	FILE * fp; 	long pos; 	int bytes;  	fp = fopen("123.txt", "r+"); 	if (fp == NULL) 	{ 		fprintf(stderr, "Can't open file 123.txt.\n"); 		exit(EXIT_FAILURE); 	} 	getc(fp); 	pos = ftell(fp); 	printf("当前文件位置:%ld\n", pos); 	fseek(fp, 0L, SEEK_END);//-------将流中光标位置移动到最后--------- 	getc(fp);//---------------再次读取，使得getc()释放流------------ 	bytes = fprintf_s(fp, "new words"); 	if (bytes>0) 		printf("测试数据写入成功!\n"); 	else 		printf("测试数据写入失败!\n");     return 0; VS2015 C++环境调试 你好，getc函数占用流，应该是输入流吧，和输出流应该没关系吧。

user: user-1
content: getc()函数的作用是从流中读取一个字符，如果读完这个字符后没有读到流的最后一个字符，此时调用其他读写数据流函数（例如fprintf()等函数）时，就会报错。只有当getc()函数读取了数据流中的所有元素后，getc()函数才会释放对流的占用。 如果您代码中的“123.txt”是空文件时，您使用getc()函数后，再使用fprintf()函数写入数据，此时就会写入成功，原因是调用一次getc()函数就已经把流中的所有数据都读完了（因为是空文件），此时getc()函数就释放了对流的占用。 如果“123.txt”中的内容大于1个字符，此时只调用一次getc()无法读取完流中的数据，可以考虑使用fseek()函数将流指针移动到最后位置，然后再次调用getc()，之后getc()函数就释放对流的占用，再次调用fprintf()函数就可以写入成功了。 	FILE * fp; 	long pos; 	int bytes;  	fp = fopen("123.txt", "r+"); 	if (fp == NULL) 	{ 		fprintf(stderr, "Can't open file 123.txt.\n"); 		exit(EXIT_FAILURE); 	} 	getc(fp); 	pos = ftell(fp); 	printf("当前文件位置:%ld\n", pos); 	fseek(fp, 0L, SEEK_END);//-------将流中光标位置移动到最后--------- 	getc(fp);//---------------再次读取，使得getc()释放流------------ 	bytes = fprintf_s(fp, "new words"); 	if (bytes>0) 		printf("测试数据写入成功!\n"); 	else 		printf("测试数据写入失败!\n");     return 0; VS2015 C++环境调试
user-0 提问: 结构体指针调用成员时vs2017总说不能指向不完整的类类型

回复:
user: user-1
content: 楼上正解，楼主对结构体概念不清

user: user-2
content: 创建一个指针,指向struct st类型.struct st*pst1;你的结构类型是struct st,哪里是struct st1呢? st表示结构模板,st1表示表示结构变量.
user-0 提问: 输出一个字符串中所有长度为5的子串

回复:
user: user-1
content: 引用 2 楼 折腾的小飞 的回复:引用 1 楼 N-n-N 的回复：for 循环每一位，然后开始计数i，空格截止，如果i=5，就从i-5开始到i输出能写个具体的代码吗？用数组实现  string a="xxxxxx xxxx xxxx xxxxx"; int each=0; for(int i=0;i<length(a);i++){ if(a[i]!=" ")each++; if(a[i]==" "){ if(each==5){ for(int x=5;x>=0;x++){  cout<<a[i-a]; } cout<<endl; } else{ each=0; } } }  大概是这样子，纯手打的，有可能有错

user: user-2
content: %.5s 跑一圈就完事了

user: user-0
content: 引用 1 楼 N-n-N 的回复：for 循环每一位，然后开始计数i，空格截止，如果i=5，就从i-5开始到i输出能写个具体的代码吗？用数组实现

user: user-1
content: for 循环每一位，然后开始计数i，空格截止，如果i=5，就从i-5开始到i输出
user-0 提问: c语言基础知识

回复:
user: user-0
content: 引用 18 楼 千面人像的回复:问问题要过脑子 ：尼玛的... 没毛病，兄弟加油，

user: user-0
content: 引用 5 楼 自信男孩的回复:注意输入格式里逗号的中英文。你输入的逗号好像是中文的，而代码里的是英文吧。 我还真没注意

user: user-0
content: 对的，我太难了哈哈谢谢

user: user-0
content: 引用 14 楼 bo_self_effacing的回复: 我这执行一切正常 ， 我就说没这么怪，我在linux上执行也对的，现在vs跑也对的，我只能想到你输入的符号不对了 检查下输入法吧，再奇怪一点难道是你控制台的输入编码有问题， 我没法拉  好的，谢谢你了，还真是符号不对，哈哈哈😬😬

user: user-1
content: 我这执行一切正常 ， 我就说没这么怪，我在linux上执行也对的，现在vs跑也对的，我只能想到你输入的符号不对了 检查下输入法吧，再奇怪一点难道是你控制台的输入编码有问题， 我没法拉

user: user-0
content: 引用 11 楼 bo_self_effacing的回复:[quote=引用 10 楼 加油编程 的回复:] [quote=引用 9 楼 bo_self_effacing的回复:][quote=引用 6 楼 加油编程 的回复:] [quote=引用 2 楼 bo_self_effacing的回复:]我怀疑你是不是输了中文逗号 不能吧老哥哈哈[/quote]  你2015后面输的啥 我看着怎么像 点 呢；确认一下是不是英文逗号。  确认后断点在 scanf 那里跟进去看看， 我怎么试都对的 ，除非中文逗号和不加逗号[/quote] 还是不行，换了英文逗号，或是直接不用逗号，结果都是一样的[/quote] 把你整个代码贴出来 我复制到vs里跑一下试试呢[/quote] 粘贴了，哈哈哈，太难了

user: user-0
content: include <stdio.h> int main() {     int day,month,year,sum,leap;     printf("\n请输入年、月、日，格式为：年,月,日（2015,12,10）\n");     scanf("%d,%d,%d",&year,&month,&day);  // 格式为：2015,12,10     switch(month) // 先计算某月以前月份的总天数     {         case 1:sum=0;break;         case 2:sum=31;break;         case 3:sum=59;break;         case 4:sum=90;break;         case 5:sum=120;break;         case 6:sum=151;break;         case 7:sum=181;break;         case 8:sum=212;break;         case 9:sum=243;break;         case 10:sum=273;break;         case 11:sum=304;break;         case 12:sum=334;break;         default:printf("data error");break;     }     sum=sum+day; // 再加上某天的天数     if(year%400==0||(year%4==0&&year%100!=0)) {// 判断是不是闰年         leap=1;     } else {        leap=0;     }     if(leap==1&&month>2) { // *如果是闰年且月份大于2,总天数应该加一天         sum++;     }     printf("这是这一年的第 %d 天。",sum);     printf("\n"); }

user: user-1
content: 引用 10 楼 加油编程 的回复:[quote=引用 9 楼 bo_self_effacing的回复:][quote=引用 6 楼 加油编程 的回复:] [quote=引用 2 楼 bo_self_effacing的回复:]我怀疑你是不是输了中文逗号 不能吧老哥哈哈[/quote]  你2015后面输的啥 我看着怎么像 点 呢；确认一下是不是英文逗号。  确认后断点在 scanf 那里跟进去看看， 我怎么试都对的 ，除非中文逗号和不加逗号[/quote] 还是不行，换了英文逗号，或是直接不用逗号，结果都是一样的[/quote] 把你整个代码贴出来 我复制到vs里跑一下试试呢

user: user-0
content: 引用 9 楼 bo_self_effacing的回复:[quote=引用 6 楼 加油编程 的回复:] [quote=引用 2 楼 bo_self_effacing的回复:]我怀疑你是不是输了中文逗号 不能吧老哥哈哈[/quote]  你2015后面输的啥 我看着怎么像 点 呢；确认一下是不是英文逗号。  确认后断点在 scanf 那里跟进去看看， 我怎么试都对的 ，除非中文逗号和不加逗号[/quote] 还是不行，换了英文逗号，或是直接不用逗号，结果都是一样的

user: user-1
content: 引用 6 楼 加油编程 的回复:[quote=引用 2 楼 bo_self_effacing的回复:]我怀疑你是不是输了中文逗号 不能吧老哥哈哈[/quote]  你2015后面输的啥 我看着怎么像 点 呢；确认一下是不是英文逗号。  确认后断点在 scanf 那里跟进去看看， 我怎么试都对的 ，除非中文逗号和不加逗号

user: user-0
content: 引用 1 楼 user-5的回复:sum垃圾值  所以sum+day 没意义 先给sum赋值就可以了 sum赋值后那个错误确实没了，但是输出结果报错

user: user-0
content: 引用 1 楼 user-5的回复:sum垃圾值  所以sum+day 没意义 先给sum赋值就可以了 sum赋初值了，没报错但是结果还是有错误

user: user-0
content: 引用 2 楼 bo_self_effacing的回复:我怀疑你是不是输了中文逗号 不能吧老哥哈哈

user: user-2
content: 注意输入格式里逗号的中英文。你输入的逗号好像是中文的，而代码里的是英文吧。

user: user-3
content: 你好，变量定义要养成初始化的好习惯哟

user: user-4
content: sum没有初始化

user: user-1
content: 我怀疑你是不是输了中文逗号

user: user-5
content: sum垃圾值  所以sum+day 没意义 先给sum赋值就可以了
user-0 提问: 求大佬拯救C语言萌新！！！

回复:
user: user-1
content: 一维数组去用二维数组的第一行填充。然后固定ｎ比较就好了  #include <stdio.h> #define M 5 #define N 6 void fun(int t[M][N],int p[N]){         int i=0,j=0;         for(i=0;i<N;i++){                 p[i]=t[0][i];         }//赋值，如果你会指针可以直接指向第一行         for(j=0;j<N;j++){             for(i=0;i<M;i++){                 if(p[j]>=t[i][j])                 {                     p[j]=t[i][j];                 }             }         } } int main(){     int i=0;int j=0;     int t[M][N]={};     int p[N]={};     for(i=0;i<M;i++){         for(j=0;j<N;j++){                 scanf("%d",&t[i][j]);         }     }     fun(t,p);     for(i=0;i<N;i++){         printf("%d ",p[i]);     }     printf("\n");     return 0; }   楼上直接定义ｍ也是一个原理，就是为的后面的比较

user: user-2
content: 随手写了一个，参考一下吧  #define M 5 #define N 6 void fun(int t[M][N], int p[N]) {     int r, c, m;     for (c=0; c<N; c++)     {         m = t[0][c];         for (r=1; r<M; r++)         {             if (t[r][c] < m)              {                  m=t[r][c];             }         }         p[c] = m;     } }   int main() {     int r, c, t[M][N]={0}, p[N]={0};     for (r=0; r<M; r++)      {         for (c=0; c<N; c++)          {             scanf("%d", &t[r][c]);         }     }     fun(t, p);     for (c=0; c<N; c++)         printf("%d ", p[c]);       return 0; }
user-0 提问: 求出二维数组每列中最小元素，并依次放入一维数组p中。

回复:
user: user-1
content: 一维数组去用二维数组的第一行填充。然后固定ｎ比较就好了  #include <stdio.h> #define M 5 #define N 6 void fun(int t[M][N],int p[N]){         int i=0,j=0;         for(i=0;i<N;i++){                 p[i]=t[0][i];         }//赋值，如果你会指针可以直接指向第一行         for(j=0;j<N;j++){             for(i=0;i<M;i++){                 if(p[j]>=t[i][j])                 {                     p[j]=t[i][j];                 }             }         } } int main(){     int i=0;int j=0;     int t[M][N]={};     int p[N]={};     for(i=0;i<M;i++){         for(j=0;j<N;j++){                 scanf("%d",&t[i][j]);         }     }     fun(t,p);     for(i=0;i<N;i++){         printf("%d ",p[i]);     }     printf("\n");     return 0; }  楼上直接定义ｍ也是一个原理，就是为的后面的比较

user: user-2
content: for example #define M 5 #define N 6 void fun(int t[M][N], int p[N]) {     int r, c, m;     for (c=0; c<N; c++)     {         m = t[0][c];         for (r=1; r<M; r++)         {             if (t[r][c] < m)              {                  m=t[r][c];             }         }         p[c] = m;     } }  int main() {     int r, c, t[M][N]={0}, p[N]={0};     for (r=0; r<M; r++)      {         for (c=0; c<N; c++)          {             scanf("%d", &t[r][c]);         }     }     fun(t, p);     for (c=0; c<N; c++)         printf("%d ", p[c]);      return 0; }
user-0 提问: 为什么我线程池5个线程，打印ready ,weakup总有时候只有3,4次，然而执行print任务函数却5个线程都执行？？？

回复:
user: user-0
content: 引用 5 楼 bo_self_effacing 的回复:[quote=引用 4 楼 adlatereturn 的回复:] [quote=引用 3 楼 bo_self_effacing 的回复:] while( trdpool->whead==NULL&& trdpool->status==0) 要是addwork先拿到锁 把状态改了 你这里不就进不去了吗 怎么打印 你说的对，线程还没进来。那还有别的好的处理方式吗？？？[/quote]  阻塞肯定得阻塞的， 就算你用锁也是阻塞的，我的话可能会在 init 后面加： void prdpool_init(int num) {     trdpool=malloc(sizeof(trdpool_t));     pthread_mutex_init(& trdpool->mutex,NULL);     pthread_cond_init(& trdpool->cond,NULL);           trdpool->status=0;     trdpool->phead=malloc(sizeof(pthread_t)*num);     trdpool->num=num;     for(int i=0;i<num;i++)         pthread_create( trdpool->phead+i,NULL,start_routine,NULL);    lblready:     遍历检查封装的 线程结构 { pthread_t a, char state } 就不只是你现在的 pthread_t *phead   在线程拿到锁后就可以state = 1 表示准备好了     {        if(state == 0)            //usleep(...) 要不要sleep看你             goto lblready;        } }[/quote]懂了谢谢！

user: user-1
content: 引用 4 楼 adlatereturn 的回复:[quote=引用 3 楼 bo_self_effacing 的回复:] while( trdpool->whead==NULL&& trdpool->status==0) 要是addwork先拿到锁 把状态改了 你这里不就进不去了吗 怎么打印 你说的对，线程还没进来。那还有别的好的处理方式吗？？？[/quote]  阻塞肯定得阻塞的， 就算你用锁也是阻塞的，我的话可能会在 init 后面加： void prdpool_init(int num) {     trdpool=malloc(sizeof(trdpool_t));     pthread_mutex_init(& trdpool->mutex,NULL);     pthread_cond_init(& trdpool->cond,NULL);           trdpool->status=0;     trdpool->phead=malloc(sizeof(pthread_t)*num);     trdpool->num=num;     for(int i=0;i<num;i++)         pthread_create( trdpool->phead+i,NULL,start_routine,NULL);    lblready:     遍历检查封装的 线程结构 { pthread_t a, char state } 就不只是你现在的 pthread_t *phead   在线程拿到锁后就可以state = 1 表示准备好了     {        if(state == 0)            //usleep(...) 要不要sleep看你             goto lblready;        } }

user: user-0
content: 引用 3 楼 bo_self_effacing 的回复:while( trdpool->whead==NULL&& trdpool->status==0) 要是addwork先拿到锁 把状态改了 你这里不就进不去了吗 怎么打印 你说的对，线程还没进来。那还有别的好的处理方式吗？？？

user: user-1
content: while( trdpool->whead==NULL&& trdpool->status==0) 要是addwork先拿到锁 把状态改了 你这里不就进不去了吗 怎么打印

user: user-0
content: 引用 1 楼 bo_self_effacing 的回复:prdpool_init(5);  //这里sleep(1) 暂停一下 等 线程全部趴在cond_wait那里了 再执行下面的 addwork也会和他们抢锁  for(int i=0;i<200;i++)         add_work(); 争锁是一回事 打印是另一回事，那个sleep(1)的确可以打印出5条，但是没有sleep的情况下这些线程也是去执行了work却没有打印ready和weakup!!!岂不怪哉！！！

user: user-1
content: prdpool_init(5);  //这里sleep(1) 暂停一下 等 线程全部趴在cond_wait那里了 再执行下面的 addwork也会和他们抢锁  for(int i=0;i<200;i++)         add_work();
user-0 提问: 求求大佬们告诉我I/O的原理

回复:
user: user-1
content: 刚翻了下书 <<UNIX 环境高级编程>> 第三版 讲的很详细啦，你这里写入文件应该是全缓冲模式了，不是行缓冲所以只是加换行符没用的。

user: user-1
content: 引用 7 楼 lin5161678 的回复：[quote=引用 6 楼 bo_self_effacing 的回复:] 避免行缓冲: a.setvbuf(文件描述符[例如 stdout 标准输出],NULL,_IONBF,0) 禁止缓冲区的使用 b.调用 fflush(stdout) 刷新缓冲区 c.行尾添加换行符 首先 fputs不是行缓冲  就算是 看清楚代码是带\n的[/quote]嗯，没看仔细，这里换行符是不能解决问题，我试了一下，前两种方法是可行的。

user: user-2
content: 引用 6 楼 bo_self_effacing 的回复:避免行缓冲: a.setvbuf(文件描述符[例如 stdout 标准输出],NULL,_IONBF,0) 禁止缓冲区的使用 b.调用 fflush(stdout) 刷新缓冲区 c.行尾添加换行符 首先 fputs不是行缓冲  就算是 看清楚代码是带\n的

user: user-1
content: 避免行缓冲: a.setvbuf(文件描述符[例如 stdout 标准输出],NULL,_IONBF,0) 禁止缓冲区的使用 b.调用 fflush(stdout) 刷新缓冲区 c.行尾添加换行符

user: user-3
content: 引用 3 楼 weixin_45906870 的回复:为什么按了enter键就能运行下去？难道enter键可以刷新缓冲区吗？ 这个不一定要按enter键，按任意键都可与你 getchar会阻塞程序（也就是程序停止往下执行），等待用户一个键盘输入

user: user-0
content: 引用 2 楼 丁劲犇 的回复：文件不关闭的时候，是要缓存一定量在内存后，才真的写盘的。 改成  //... fputs("I love FishC.com!\n", fp); fflush(fp); getchar(); //...  就好了。不过这样在写入大量细碎数据时，性能很糟糕。为什么按了enter键可以运行下去？难道enter键可以刷新缓冲区吗？

user: user-0
content: 引用 1 楼 chxchxkkk 的回复：getchar();等你按键才运行下去，否则卡在这里为什么按了enter键就能运行下去？难道enter键可以刷新缓冲区吗？

user: user-4
content: getchar();等你按键才运行下去，否则卡在这里

user: user-5
content: 文件不关闭的时候，是要缓存一定量在内存后，才真的写盘的。 改成  //... fputs("I love FishC.com!\n", fp); fflush(fp); getchar(); //...  就好了。不过这样在写入大量细碎数据时，性能很糟糕。
user-0 提问: 《C Primer Plus》中的一个问题：为什么应使用long类型而不是int类型？

回复:
user: user-1
content: 为什么用32位，都64位了，long8字节，int4字节，

user: user-2
content: 引用 楼主 zaixiankaifa 的回复:在<<C Primer Plus>> P48：“如果在long类型和int类型占用空间相同的机器上编写代码，当确实需要32位的整数时，应使用long类型而不是int类型，以便把程序移植到16位机后仍然可以正常工作。”  难道使用了int类型之后，程序移植到16位机后就不可以正常工作了？对呀 16位机器的int不是32bit的

user: user-3
content: 看这个链接 int 标准中 至少保证16位 而 long 至少保证32位

user: user-3
content: 请试一下再这么说

user: user-4
content: 一般公司代码，都要封装数据类型int、long为其他的，比如uint32, uint64等  这样就不用了考虑整体替换了，最多在重定义的时候修改下uint32/uint64

user: user-4
content: 这已经不适用了，在当前64位机器上，long就是8字节，明确指定short才是2字节(16位)
user-0 提问: 链表怎么实现先输入先输出

回复:
user: user-1
content: 恭喜恭喜，是否结贴送分呢？

user: user-2
content: 恭喜恭喜！！！

user: user-0
content: void CreateList_L(LinkList &L,int n){ 	LinkList p,tail; 	L=(LinkList)malloc(sizeof(LinkList)); 	tail=L; 	for(int i=1;i<=n;i++){ 		p=(LinkList)malloc(sizeof(LNode)); 		printf("请输入数据元素:"); 		scanf("%d",&p->data); 		tail->next=p; 		tail=p; 	} 	tail->next=NULL; }摸索出来了
user-0 提问: 结构体相关程序

回复:
user: user-1
content: 是不是scanf输出函数的问题，应该为都加&

user: user-2
content: 职务，年份  输反了

user: user-0
content: 引用 1 楼 ?Victor.?? 的回复:53行怎么用了逗号分隔  应该是分号吧不是这个问题。。改了也一样

user: user-3
content: 把sex[]调大点试试，或者输入时输入不超过2字符，留出结束符位置

user: user-2
content: 53行怎么用了逗号分隔  应该是分号吧
user-0 提问: 文本读写写不进去

回复:
user: user-0
content: 引用 10 楼 arfi 的回复：你写之前，是不是得先 fseek到文件末尾呀不到文件尾写不进去是吗？那我想在某处位置写文本怎么办呢？

user: user-1
content: 你写之前，是不是得先 fseek到文件末尾呀

user: user-0
content: 引用 7 楼 ?Victor.?? 的回复：有空格，回车时  需要循环输入，输出没太理解你的意思，意思是要写入两次才能正常写入吗，fscanf()后，此时读写位置在回车处。

user: user-2
content: https://www.cnblogs.com/wurenzhong/p/7435846.html

user: user-2
content: 有空格，回车时  需要循环输入，输出

user: user-0
content: 引用 3 楼 m0_46108109 的回复：不是不是，我说错了。r+可以写。听听其他人意见。我猜是文件流标记出现了问题。读写位置在换行符的位置，似乎写不进去

user: user-0
content: 引用 4 楼 ?Victor.?? 的回复：操作是正确的呀 就是写不进去

user: user-2
content: 操作是正确的呀

user: user-3
content: 不是不是，我说错了。r+可以写。听听其他人意见。我猜是文件流标记出现了问题。

user: user-0
content: 引用 1 楼 m0_46108109 的回复：你好像理解错r+的含义了。这块挺乱的，自己看函数手册。 大致是r是读，w是写，a是追加，加号的含义好像是对前面三个字母的增强。很奇怪，如果不读取文本中数据，直接写，能写的进去。

user: user-3
content: 你好像理解错r+的含义了。这块挺乱的，自己看函数手册。 大致是r是读，w是写，a是追加，加号的含义好像是对前面三个字母的增强。
user-0 提问: C语言程序设计问题

回复:
user: user-1
content: 字符串结尾加上\0

user: user-0
content: 引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:p=c -> strcpy(p,c)改过后两个平台运行后都有问题。。

user: user-1
content: p=c -> strcpy(p,c)
user-0 提问: 时间复杂度

回复:
user: user-0
content: 引用 楼主 user-0的回复:给定问题，给定平台，对于解决同一问题的两个算法A和B 1、如果A的时间复杂度比B的大，执行时间一定比B长？ 2、如果时间复杂度相同，执行时间相同吗？ 刚学，求大神讲一下 感觉没有可比性，算法A的一步的执行时间和算法B的一步的执行时间可能不同，比较大O，只能比出来增长率，比不出来不同算法的执行时间吧？
user-0 提问: OJ的SIGSEGV错误（Dev C++正常运行）

回复:
user: user-1
content: void AddNode(List &list, int dt){     Node *pNode = create_Node();     pNode->data = dt;      if (list.head == NULL){         list.head = create_Node();        //无用代码，导致内存泄漏         list.head = pNode;         list.length = 1;     }     else{         Node *pt = create_Node();        //无用代码，导致内存泄漏         pt = list.head;         while (pt->next != NULL)             pt = pt->next;         pt->next = create_Node();        //无用代码，导致内存泄漏         pt->next = pNode;         list.length++;     } }

user: user-2
content: 我现在的电脑没有编译器, 不好调试。不过这个代码有明显问题      List** node_lists = new List*[n + 1];         for (int i = 1; i <= n; i++){         node_lists[i]->head = NULL;         node_lists[i]->length = 0;         AddNode(*node_lists[i], i);     }  node_lists[i]是一个List*指针，本身是不是没有分配啊。可以仔细看看。另外，这个代码AddNode存在多次create，以及内存泄漏。
user-0 提问: c程序设计问题

回复:
user: user-0
content: 引用 5 楼 TorresFans 的回复: 你对指针的理解有问题，不是p的地址会自动移动。 p存的是int型地址，p+1 表示p指向的地址向后移动4个字节。 但是图中没看到有对p进行移位的语句啊

user: user-1
content: #include<stdio.h>  void main() { 	int a[15],i,*p; 	for(i=0;i<15;i++) 	{ 		scanf("%d",&a[i]);		 	} 	for(i=0;i<15;i++) 	{ 		p = (a+14-i);	 		printf("%d\n",*p);	 	} 	 }

user: user-2
content: 加上头文件  <stdlib.h>  15行之后加上  p=(int*)malloc(15*sizeof(int));  最后加上free(p);

user: user-3
content: 需要给指针p分配内存

user: user-1
content: 你对指针的理解有问题，不是p的地址会自动移动。 p存的是int型地址，p+1 表示p指向的地址向后移动4个字节。

user: user-0
content: 引用 3 楼 TorresFans 的回复:#include<stdio.h>  void main() { 	int a[15],i,*p; 	for(i=0;i<15;i++) 	{ 		scanf("%d",&a[i]);		 	} 	for(i=0;i<15;i++) 	{ 		p = (a+14-i);	 		printf("%d\n",*p);	 	} 	 }为啥p = (a+14-i)中指针p的地址会自动移动？
user-0 提问: C语言：PlaySound函数为什么编译不正确

回复:
user: user-1
content: 用的是devc++吗，换个编译器试试看

user: user-0
content: 引用 1 楼 user-2的回复:指定winmm.lib路径了吗？例如gcc xx -lwinmm 貌似没有，能说具体一点吗

user: user-2
content: 指定winmm.lib路径了吗？例如gcc xx -lwinmm
user-0 提问: c语言指针问题（大二菜鸟）

回复:
user: user-1
content: 后置++是先运算再++，也就是说下次调用的时候才++。

user: user-2
content: 引用 1 楼 贵阳老马马善福专业维修游泳池堵漏防水工程 的回复:a=(++(*p)); 这样写 引用a=(*p)++; 在C语言里面都是未定义行为 结果没意义

user: user-3
content: VS2017也跑11。可能GCC编译器结果是00。 后置++运算符优先级高于=，所以最后一步才应该是给a赋值为0，按理说结果是00。 https://c.runoob.com/compile/11 在线编译，结果是00。 年轻人别浪费时间研究这些，尽量避免这种写法（不同编译器结果不同）。

user: user-4
content: 什么编译环境？VS2015跑11

user: user-5
content: a=(++(*p)); 这样写
user-0 提问: 一个有点懵的问题

回复:
user: user-1
content: 同学记得结贴给分

user: user-0
content: 引用 5 楼 user-2的回复:extern这个关键字是告诉编译器：我这个东西是在别的地方定义，请不要给我再分配空间了。 但是，你得告诉它定义时的完整信息。你定义的是 float variable; 则就需要告诉它类型。 编译器不同，默认的数据类型可能就不同，比如extern g;这个g有可能就会默认成int类型。 学了编译原理可能你就知道了，类型不同，将可能导致编译器无法找到符号。 一些弱的编译器，会直接报错。 不好意思这么晚结

user: user-0
content: 引用 7 楼 TorresFans 的回复:同学记得结贴给分抱歉抱歉，刚玩没多久还不知道这个功能

user: user-0
content: 将程序模块化真是打开了新世界

user: user-0
content: 成功了，真的非常感谢！Emmmm,请问一下为什么要加上float呢？extern不是已经告诉编译器这个heg是什么东西了吗？

user: user-1
content: extern heg;改为extern float heg;

user: user-0
content: 引用 5 楼 user-2的回复:extern这个关键字是告诉编译器：我这个东西是在别的地方定义，请不要给我再分配空间了。 但是，你得告诉它定义时的完整信息。你定义的是 float variable; 则就需要告诉它类型。 编译器不同，默认的数据类型可能就不同，比如extern g;这个g有可能就会默认成int类型。 学了编译原理可能你就知道了，类型不同，将可能导致编译器无法找到符号。 一些弱的编译器，会直接报错。 谢谢，知道了

user: user-2
content: extern这个关键字是告诉编译器：我这个东西是在别的地方定义，请不要给我再分配空间了。 但是，你得告诉它定义时的完整信息。你定义的是 float variable; 则就需要告诉它类型。 编译器不同，默认的数据类型可能就不同，比如extern g;这个g有可能就会默认成int类型。 学了编译原理可能你就知道了，类型不同，将可能导致编译器无法找到符号。 一些弱的编译器，会直接报错。
user-0 提问: 请问该截取子串函数为什么不能运行

回复:
user: user-0
content: 引用 1 楼 user-2的回复:其实，你的代码在输入处理时就出现问题了。 for (i=0;s[i]!='\0';i++);  这一句就好几处问题。 1.  s这个数组你如果定义的是全局变量的话，编译器一般会给初始化为0，即数组的每个元素都是0。如果定义的是局部变量的话，则不会被初始化，也就是所分配的栈空间里的脏数据。关于堆和栈的概念，全局和局部的概念，如果不明白的话，可以找找书看看，这些是基础。 也就是说，你写的代码中，i=0时，s[i]就已经是0了('\0'这个字符就是0的意思) 2。 分号(;)不可以乱用，分号表示语句结束的意思。 你在for语句后面直接写分号，表示for语句执行循环条件判断和i++，直到条件结束，不做其他的事情。 这个for结束时，i=0。（你的例子里） 3. 上面的for彻底结束后，才会去执行scanf("%c",&s[i]);而且它是跟你的for语句是同一个层次的，因为你把for用分号结束了。 这一句执行后，s数组的第i=0个元素被设置了一个字符。s数组其实就是长度为1的字符串了。 所以，你想从index=3开始，取得length=5的子串，按照你的代码处理，自然没有结果了。  我想，你是想： 1. 先输入一段字符串。这个应该是 scanf("%s", s);  %s是表示输入的是字符串    如果使用%c一个字符一个字符的话，就需要结束条件了，比如代码要变成类似下面这样：   int i;   char c;   i = 0;    scanf("%c", &c);    while( c != 'e' && i < MAX-1) { /* 输入字母e就结束。这个字母你随便指定，但不能是'\0'，因为这个需要按组合键输入，系统不同，没准输入不了 */      s[i++] = c;      scanf("%c", &c);    }   s[i] = 0; /* 字符串末尾加上0 */  2. 剩下就是调用你的代码去处理字符串了。  作为学生，练习题怎么写都可以，在实际的商业开发中，你的这些代码写法是完全不可以的。 那么，学生该学什么呢？ 其实，就是 “原理”二字，知道每种语言的它的内部处理机制，这也是编译器的最基本功能。 了解了基本原理之后，再掌握这样语言的书写特性，最后，结合不断的经验，就能写出好的代码了。  现在，语言繁多，每种都有其优缺点，要学会抽取其精髓，就是"原理"，然后，就可以快速写出代码了。 十分感谢，感觉懂了很多

user: user-1
content: 楼上点评精辟

user: user-2
content: 其实，你的代码在输入处理时就出现问题了。 for (i=0;s[i]!='\0';i++);  这一句就好几处问题。 1.  s这个数组你如果定义的是全局变量的话，编译器一般会给初始化为0，即数组的每个元素都是0。如果定义的是局部变量的话，则不会被初始化，也就是所分配的栈空间里的脏数据。关于堆和栈的概念，全局和局部的概念，如果不明白的话，可以找找书看看，这些是基础。 也就是说，你写的代码中，i=0时，s[i]就已经是0了('\0'这个字符就是0的意思) 2。 分号(;)不可以乱用，分号表示语句结束的意思。 你在for语句后面直接写分号，表示for语句执行循环条件判断和i++，直到条件结束，不做其他的事情。 这个for结束时，i=0。（你的例子里） 3. 上面的for彻底结束后，才会去执行scanf("%c",&s[i]);而且它是跟你的for语句是同一个层次的，因为你把for用分号结束了。 这一句执行后，s数组的第i=0个元素被设置了一个字符。s数组其实就是长度为1的字符串了。 所以，你想从index=3开始，取得length=5的子串，按照你的代码处理，自然没有结果了。  我想，你是想： 1. 先输入一段字符串。这个应该是 scanf("%s", s);  %s是表示输入的是字符串    如果使用%c一个字符一个字符的话，就需要结束条件了，比如代码要变成类似下面这样：   int i;   char c;   i = 0;    scanf("%c", &c);    while( c != 'e' && i < MAX-1) { /* 输入字母e就结束。这个字母你随便指定，但不能是'\0'，因为这个需要按组合键输入，系统不同，没准输入不了 */      s[i++] = c;      scanf("%c", &c);    }   s[i] = 0; /* 字符串末尾加上0 */  2. 剩下就是调用你的代码去处理字符串了。  作为学生，练习题怎么写都可以，在实际的商业开发中，你的这些代码写法是完全不可以的。 那么，学生该学什么呢？ 其实，就是 “原理”二字，知道每种语言的它的内部处理机制，这也是编译器的最基本功能。 了解了基本原理之后，再掌握这样语言的书写特性，最后，结合不断的经验，就能写出好的代码了。  现在，语言繁多，每种都有其优缺点，要学会抽取其精髓，就是"原理"，然后，就可以快速写出代码了。
user-0 提问: zint源码怎么进行交叉编译？

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复：看一下readme和config配置文件。里面会提到编译器解压文件里没有config配置文件，它是用cmake进行编译的，我在cmakelists.txt里面也没看到提到编译器

user: user-1
content: 看一下readme和config配置文件。里面会提到编译器
user-0 提问: C 时间复杂度

回复:
user: user-1
content: https://blog.csdn.net/qq_42475711/article/details/105171662

user: user-1
content: 你好，推荐阅读我这篇博客，将会让你成为班上最靓的仔。

user: user-2
content: 时间复杂度，其实是根据你的代码执行的次数决定的 次数一般随着规模增大而增大，这种增大的过程可以用一个方程表示 一般是 A*N^a+B*N^b+......+常数项，这样的多项式。 那么只取最高次的数据来确定时间的复杂度，并把他的常数项去掉 比如 3n^2+2n+3 那么这个多项式的复杂度是O(n^2)

user: user-3
content: 引用 2 楼 m0_463737261616 的回复:[quote=引用 1 楼 自信男孩的回复:]for(i=0;i<n;i++ 一共执行了n次呢？楼主怎么算的？时间复杂度就是O(n)呢 i=0一次  i<n执行了n+1次 i++执行了n次 我把他们都加起来了是2n+2 刚学，还很迷糊[/quote]  时间复杂度大致分为 O(1)   O(logn)  O(n)   O(nlogn)   O(n^2)   O(n^3)   O(2^n)几种。 你所说的 2n+2 属于N的常数倍，也归入 O（N）中

user: user-3
content: 大多数情况下，问题基本操作的原操作是指最深层循环内的语句中的原操作，它的执行次数和包含它的语句的频度相同。语句的频度指的是该语句重复执行的次数，   原操作是指固有的数据类型的操作，可以理解为变量类型所支持的基本运算，比如算数预算 +，-，*，/；赋值运算，逻辑运算等 题中原操作为 ：sum += i;

user: user-0
content: 引用 1 楼 自信男孩的回复:for(i=0;i<n;i++ 一共执行了n次呢？楼主怎么算的？时间复杂度就是O(n)呢 i=0一次  i<n执行了n+1次 i++执行了n次 我把他们都加起来了是2n+2 刚学，还很迷糊

user: user-4
content: for(i=0;i<n;i++ 一共执行了n次呢？楼主怎么算的？时间复杂度就是O(n)呢
user-0 提问: 一个问题

回复:
user: user-0
content: 引用 10 楼 大娱乐家cpy的回复:你好。getchar() !=b条件在getchar() ==b时判为假，因为b是ASCII码为6的字符，所以getchar() 拿到ASCII码为6的字符是循环终止。 但是        他没有终止 一直在执行 用什么样的方式输入才可以让他判定为假呢？

user: user-0
content: 引用 10 楼 大娱乐家cpy的回复:你好。getchar() !=b条件在getchar() ==b时判为假，因为b是ASCII码为6的字符，所以getchar() 拿到ASCII码为6的字符是循环终止。 但是        他没有终止 一直在执行 用什么样的方式输入才可以让他判定为假呢？

user: user-0
content: 引用 10 楼 大娱乐家cpy的回复:你好。getchar() !=b条件在getchar() ==b时判为假，因为b是ASCII码为6的字符，所以getchar() 拿到ASCII码为6的字符是循环终止。 但是        他没有终止 一直在执行 用什么样的方式输入才可以让他判定为假呢？

user: user-1
content: 引用 8 楼 weixin_44930231 的回复:[quote=引用 7 楼 N-n-N的回复:][quote=引用 6 楼 weixin_44930231 的回复:] [quote=引用 4 楼 N-n-N的回复:]把b值换一个就好了，为什么一定要特殊字符 挺有趣的所以想了解一下[/quote]特殊字符好像是可以输入的，或者像楼上那样/006那种试一下[/quote] 不行，还是判定为真。[/quote]可以在百度上搜asciii码6代表什么，然后复制进去“”（这个是我找的）这个应该有用吧

user: user-2
content: 你好。getchar() !=b条件在getchar() ==b时判为假，因为b是ASCII码为6的字符，所以getchar() 拿到ASCII码为6的字符是循环终止。

user: user-0
content: 引用 7 楼 N-n-N的回复:[quote=引用 6 楼 weixin_44930231 的回复:] [quote=引用 4 楼 N-n-N的回复:]把b值换一个就好了，为什么一定要特殊字符 挺有趣的所以想了解一下[/quote]特殊字符好像是可以输入的，或者像楼上那样/006那种试一下[/quote] 不行，还是判定为真。

user: user-1
content: 引用 6 楼 weixin_44930231 的回复:[quote=引用 4 楼 N-n-N的回复:]把b值换一个就好了，为什么一定要特殊字符 挺有趣的所以想了解一下[/quote]特殊字符好像是可以输入的，或者像楼上那样/006那种试一下

user: user-0
content: 引用 4 楼 N-n-N的回复:把b值换一个就好了，为什么一定要特殊字符 挺有趣的所以想了解一下

user: user-0
content: 挺有趣的所以想了解一下

user: user-1
content: 把b值换一个就好了，为什么一定要特殊字符

user: user-3
content: 你可以试试用转义8进制输入试试 即输入 \006 试试看 那你为啥非要用一个不可显示的字符作为输入结束判断呢？

user: user-0
content: 引用 1 楼 user-3的回复:你查查看ascii码为6的字符是什么？ https://wk.baidu.com/view/07394e1b52d380eb62946d59?pcf=2 这个是非显示字符，要特殊方法输入的 你好，可否说明一下是用什么样的方法输入

user: user-3
content: 你查查看ascii码为6的字符是什么？ https://wk.baidu.com/view/07394e1b52d380eb62946d59?pcf=2 这个是非显示字符，要特殊方法输入的
user-0 提问: fputs的第一个参数是字符型地址吗？为什么可以是字符串？

回复:
user: user-0
content: 引用 1 楼 user-3 的回复：你表面看是个常量字符串，实际上是个指向常量字符串的指针，就好像下面的代码 char *str = ”test” 等号左边是个指针，等号右边是个字符串，字符串为啥能赋给指针？这和你的问题是一样的。所以其实你看到的字符串，是一个指向该字符串的指针而已。那只向该字符串的这个指针是不是没有名字？

user: user-1
content: 字符串是首字符的地址,跟数组名一个道理.

user: user-2
content: 一个经常被挂在嘴边却很容易忽视的常识 C没有字符串类型 C风格字符串指的是0结尾的char数组 根据这一点 其实  "123456789\n"是一个数组 fputs(数组,....) 常见操作了

user: user-0
content: 引用 1 楼 user-3 的回复：你表面看是个常量字符串，实际上是个指向常量字符串的指针，就好像下面的代码 char *str = ”test” 等号左边是个指针，等号右边是个字符串，字符串为啥能赋给指针？这和你的问题是一样的。所以其实你看到的字符串，是一个指向该字符串的指针而已。非常感谢

user: user-3
content: 你表面看是个常量字符串，实际上是个指向常量字符串的指针，就好像下面的代码 char *str = ”test” 等号左边是个指针，等号右边是个字符串，字符串为啥能赋给指针？这和你的问题是一样的。所以其实你看到的字符串，是一个指向该字符串的指针而已。
user-0 提问: C语言编程题

回复:
user: user-1
content: 我写过一篇博客专门写有这类问题

user: user-1
content: 我写过一篇博客专门写有这类问题

user: user-2
content: #include <stdio.h>   int main()  {  	char a[10];  	for(int i=0,j=0;i<10;i++,j++)  	a[i]=65+j;//数组赋值A到J    	int n;  	scanf("%d",&n);//输入n   	int m,k;  	for(m=0;m<n;m++)  	{ 	 for(k=0;k<m;k++) 	 printf(" "); 	 int b=0; 	 for(k=m;k<n;k++,b++) 	 printf("%c",a[b]); 	 printf("\n");}//输出上三角形    }
user-0 提问: 请问我这个判断回文的程序哪里有问题，为什么输入12321也会输出不是回文。

回复:
user: user-1
content: #include<stdio.h> #include<string.h> int main() {     char a[100];     int i,j,n,m=0;      fgets(a, 100, stdin);     n = strlen(a);     if (n < 100)    //for '\n'         n = n - 1;     for(i=0;i<n/2;i++)     {         if(a[i] != a[n-1-i])         {             m=1;             break;         }     }     //if(m=1)     if(m==1)         printf("不是回文");     else         printf("是回文");     return 0; } 供参考～

user: user-2
content: 兄嘚，书写格式要注意哦

user: user-3

user: user-4
content: m==1 m=1是赋值，基础还要看看吧..

user: user-5
content: 1、m的初始值和你判断不是回文的值一样，那么不管是不是回文，都会输出“不是回文”，m的初始值可以改成m=0或者其他； 2、格式还是要多注意，if(m==1)。
user-0 提问: PAT 人口普查测试点 测试点0，1，4为啥错误

回复:
user: user-1
content: 测试点0的错误原因是啥啊？我的就是测试点0通不过  #include<iostream> using namespace std; #include<string>  struct xinxi{     string name;     string time; }s[100010],s1,s2;  int main(){     int N;     cin>>N;     for (int i=0;i<N;i++){cin>>s[i].name>>s[i].time;}          int count=0;     s1=s[0];s2=s[0];//s2表示年长者，s1表示年轻者     for (int i=0;i<N;i++){         if (s[i].time>="1814/09/06"&&s[i].time<="2014/09/06"){             count++;             if (s1.time<=s[i].time){s1=s[i];}             if (s2.time>=s[i].time){s2=s[i];}         }     }          cout<<count;     if (count!=0){cout<<" "<<s2.name<<" "<<s1.name;}          return 0; }

user: user-2
content: 建议直接贴源码～
user-0 提问: c[警告]不兼容指针类型的赋值不知道为什么

回复:
user: user-1
content: #include<stdio.h> #include<string.h> #include<stdlib.h>  struct answer{      int number;      //struct anwser *next;     struct answer *next;  };  struct answer *first,*second,*mid;  int main(){      int m,n,q,i,z=1;      scanf("%d %d %d",&n,&m,&q);      first=(struct answer *)malloc(sizeof(struct answer));      first->number=1;      mid=first;      for(i=2;i<=q;i++){          second=(struct answer *)malloc(sizeof(struct answer));          second->number=i;          mid->next=second;       //这句报错我感觉没什么问题啊   报c[警告]不兼容指针类型的赋值          mid=second;      }      return 0; } 供参考～  单词拼写错误～另外函数缺少大括号～

user: user-2
content: struct answer{  int number;  struct r anwse*next; 注意红字

user: user-3
content: 感觉没啥问题，用的什么编译器
user-0 提问: matlab新手求助  程序如下 单个带进去的结果N和程序计算不一样 不知道哪里出错了 求大神帮忙解答

回复:
user: user-1
content: 你这是不是少了个R变量

user: user-2
content: 引用 1 楼 user-3 的回复:直接上代码吧，这伪代码看不明白 。。。。。。。。。。

user: user-3
content: 直接上代码吧，这伪代码看不明白
user-0 提问: 求助！！！c语言使用变长的数组来实现逆序输出

回复:
user: user-1
content: 思路要理清楚   #include <stdio.h> #include <malloc.h>  int _tmain(int argc, _TCHAR* argv[]) {   const long iInc = 10; //缓冲区增量   long *p = NULL, *pn; //缓冲区指针   long iItem=0; //数据个数   long iBufLen=0; //缓冲区个数   long tmp;    printf("Please input value, -1 for exit\n");   while(scanf_s("%ld", &tmp) == 1  && tmp != -1)   {     //个数超过缓冲区大小     if(iItem >= iBufLen)     {        //分配缓冲区       if((pn = (long*)realloc(p, (iBufLen+iInc) * sizeof(long))) != NULL)       {         //记录缓冲区个数         iBufLen += iInc;         //更新数据指针         p = pn;       }       else       {         //分配缓冲区失败         printf("alloc memory failed\n");         break;       }     }      //追加数据     p[iItem++] = tmp;   }    //逆序输出   if(p && iItem > 0)   {     printf("Reverse order output is:\n");      //pn指向最后一个数据     pn = p + (iItem-1);      for(tmp=0; tmp<iItem; tmp++, pn--)     {       //1行10个数据       if(tmp && (tmp%10==0)){ printf("\n"); }        //输出数据       printf("%ld ", *pn);     }   }    //结束清理   if(p)   {     free(p);     p = NULL;   }    return 0; }

user: user-2
content: for(i=n+10-1;i >= 0;i--)           printf("%d\t",*(p+i));   逆序输出
user-0 提问: 关于使用VC6调用openssl遇到的问题

回复:
user: user-0
content: 自己顶一下，求求大佬解惑

user: user-1
content: 你查查，根据你的编译器

user: user-0
content: 引用 3 楼 自信男孩 的回复:应该是缺少动态库，你看看你的openssl库在哪？ C:\OpenSSL-Win32\lib\VC 这应该就是动态库的路径吧

user: user-0
content: 已解决，手动添加了 #pragma comment(lib,"libcrypto32MD.lib")  #pragma comment(lib,"libcrypto32MDd.lib")  #pragma comment(lib,"libcrypto32MT.lib")  #pragma comment(lib,"libcrypto32MTd.lib")  #pragma comment(lib,"libssl32MD.lib")  #pragma comment(lib,"libssl32MDd.lib")  #pragma comment(lib,"libssl32MT.lib")  #pragma comment(lib,"libssl32MTd.lib") 但为什么在目录中添加了相关lib路径还是需要自己手动添加呢

user: user-1
content: 应该是缺少动态库，你看看你的openssl库在哪？

user: user-0
content: 再来顶一下
user-0 提问: 关于数组问题

回复:
user: user-1
content: 1.  nums[3] = temp; 为什么会第0到1位会是1     从程序看，程序里数组数据移位时，并没有对nums[0]进行赋值操作，所以nums[0]的数据仍然是之前的输入值1  2. nums[i] = nums[i-2];  数组访问越界     for循环i == 1 时，nums[i-2] >> nums[-1] 访问越界，访问到nums数组前一段内存，这段内存的数据是不确定的，可能是16，也可能是其他值，你换个时间段运行，或者做一通其他操作，运行出来的数据也可能会不一样的。     你可以调试看一下内存数据，或者定义一个指针，指向nums数组前一个地址（int），获取一下该内存地址的数据就清楚了  PS：一定要万分注意数组的访问越界问题，一定要避免，以免出现不必要的错误。数组可以通过下标取余的方法来访问：数组名[ 下标值 % 数组长度]

user: user-2
content: 你也知道是越界了   至于为什么是16 这是一个多余的问题 输出17一样问为什么17 没为什么 没必要讨论  别越界就没这破事了

user: user-3
content: 最好贴代码出来

user: user-0
content: nums[3] = temp; 为什么会第0到1位会是1 nums[i] = nums[i-2]; 越界是，第一位为什么会输出个16而不是其他的数
user-0 提问: 萌新想问这是递归嘛？看不懂，害。

回复:
user: user-0
content: 刚刚问大佬们了，说是什么二层链表。还告诉俺是用define定义的，此贴终结，撒花。源代码来自linux内核

user: user-0
content: 自己踩自己一下
user-0 提问: 求教！自定义函数 不提前声明时

回复:
user: user-1
content: 是不是调用了自带的max函数

user: user-0
content: 引用 4 楼 akari10032 的回复：隐式声明默认返回值是int，这个特性已经在c99中被废弃了啥意思 麻烦解释一下

user: user-2
content: 隐式声明默认返回值是int，这个特性已经在c99中被废弃了

user: user-3
content: 引用 2 楼 m0_46351125 的回复:[quote=引用 1 楼 ?Victor.?? 的回复：]所以应该提前声明  或者把main函数放到后面嗯 谢谢 但是我想知道为啥出现一个能用一个不能[/quote]  编译器的问题，vc++应该是比较老的  正常编译器直接报错不给过

user: user-0
content: 引用 1 楼 ?Victor.?? 的回复：所以应该提前声明  或者把main函数放到后面嗯 谢谢 但是我想知道为啥出现一个能用一个不能

user: user-3
content: 所以应该提前声明  或者把main函数放到后面
user-0 提问: 新手创建单链表的时候，后面的结果都输出不出来了，没有报错。求助大神。

回复:
user: user-0
content: 引用 1 楼 自信男孩 的回复：#include <stdio.h> #include <malloc.h>  #define MAXSIZE 100  typedef struct LNode {     int data;     struct LNode *next; }LNode,C,*head;  void createlianbiao(LNode *&C) {     int a[3];     int i,j,k;     printf("请输入：\n");     for(j=0;j<3;j++)     {         scanf("%d",&k);         a[j]=k;     }     printf("a[3]=");     for(j=0;j<3;j++)     {         printf("%d",a[j]);     }     printf("\n");      LNode *s,*r,*z;     //到这里程序就停止了     C=(LNode *)malloc(sizeof(LNode));     r=C;     C->next=NULL;     for(i=0;i<3;i++)     {         s=(LNode*)malloc(sizeof(LNode));         s->data=a[i];         r->next=s;         r=r->next;     }     r->next=NULL;     //z=(LNode *)malloc(sizeof(LNode));     z = C->next;     printf("输出为=");     for(int i=0;i<3;i++)     {         printf("%d",z->data);         z=z->next;     } } //void main(LNode *&C) int main() {     LNode *C;     createlianbiao(C);     printf("结束\n"); } 供参考～ 建议注意下main函数的定义。另外自定义函数里，z不需要申请空间～谢谢大佬！我自己弄了很久都不知道错在哪里，现在终于可以了！感谢🙏！

user: user-1
content: #include <stdio.h> #include <malloc.h>  #define MAXSIZE 100  typedef struct LNode {     int data;     struct LNode *next; }LNode,C,*head;  void createlianbiao(LNode *&C) {     int a[3];     int i,j,k;     printf("请输入：\n");     for(j=0;j<3;j++)     {         scanf("%d",&k);         a[j]=k;     }     printf("a[3]=");     for(j=0;j<3;j++)     {         printf("%d",a[j]);     }     printf("\n");      LNode *s,*r,*z;     //到这里程序就停止了     C=(LNode *)malloc(sizeof(LNode));     r=C;     C->next=NULL;     for(i=0;i<3;i++)     {         s=(LNode*)malloc(sizeof(LNode));         s->data=a[i];         r->next=s;         r=r->next;     }     r->next=NULL;     //z=(LNode *)malloc(sizeof(LNode));     z = C->next;     printf("输出为=");     for(int i=0;i<3;i++)     {         printf("%d",z->data);         z=z->next;     } } //void main(LNode *&C) int main() {     LNode *C;     createlianbiao(C);     printf("结束\n"); } 供参考～ 建议注意下main函数的定义。另外自定义函数里，z不需要申请空间～
user-0 提问: 求助大佬，编译ntp源码时报错的问题,CCLD sntp 是什么意思，CCLD 是哪个命令？

回复:
user: user-1
content: 不知道哪里有问题，能否告知怎么解决？

user: user-1
content: 楼主问题解决了没，碰到同样的问题，

user: user-2
content: 不用客气，可以关注我的博客，咱们随时交流。

user: user-0
content: 感谢大佬

user: user-2
content: 从你发送的信息来看，CCLD sntp是makefile打印出来的跟踪语句，CCLD是编译器的link指令，生成可执行文件，sntp应该是目标或者伪目标。 从整个图片看，就是链接过程，有些函数的引用，找不到实现，可以用编译器nm指令查看。
user-0 提问: 能帮我看一下问题出在哪里吗 实在找不出谢谢

回复:
user: user-0
content: 引用 8 楼 qq_46905382的回复:[quote=引用 4 楼 棉猴的回复:]VC++6.0我的最爱，没有之一 #include<stdio.h>  int main(int argc, char* argv[]) {  	void sort(int x[], int n); 	int a[10], i, *p; 	p = a; 	printf("enter 10 numbers:\n"); 	for(i=0; i<10; i++)//-----去掉分号--------- 		scanf("%d", p++); 	p = a; 	sort(p, 10); 	for(p=a, i=0; i<10; i++)//-----去掉分号--------- 		printf("%d ", *p++); 	printf("\n"); 	return 0; }  void sort(int x[], int n)//--------把int*x改为int[]------------ { 	int i, j, k, t; 	for(i=0; i<n-1; i++) 	{ 		k = i; 		for(j=i+1; j<n; j++) 		{ 			if(*(x+j)<*(x+k)) 				k=j; 			if(k!=i) 			{ 				t =*(x+i); 				*(x+i) = *(x+k); 				*(x+k) = t; 			} 		} 	} } VC++6.0调试  我的for后面多了分号 谢谢！[/quote] 不好意思 我看了的  谢谢

user: user-0
content: 引用 4 楼 棉猴的回复:VC++6.0我的最爱，没有之一 #include<stdio.h>  int main(int argc, char* argv[]) {  	void sort(int x[], int n); 	int a[10], i, *p; 	p = a; 	printf("enter 10 numbers:\n"); 	for(i=0; i<10; i++)//-----去掉分号--------- 		scanf("%d", p++); 	p = a; 	sort(p, 10); 	for(p=a, i=0; i<10; i++)//-----去掉分号--------- 		printf("%d ", *p++); 	printf("\n"); 	return 0; }  void sort(int x[], int n)//--------把int*x改为int[]------------ { 	int i, j, k, t; 	for(i=0; i<n-1; i++) 	{ 		k = i; 		for(j=i+1; j<n; j++) 		{ 			if(*(x+j)<*(x+k)) 				k=j; 			if(k!=i) 			{ 				t =*(x+i); 				*(x+i) = *(x+k); 				*(x+k) = t; 			} 		} 	} } VC++6.0调试  我的for后面多了分号 谢谢！

user: user-0
content: for后面多了分号 谢谢！

user: user-1
content: 引用 4 楼 棉猴 的回复:VC++6.0我的最爱，没有之一 #include<stdio.h>  int main(int argc, char* argv[]) {  	void sort(int x[], int n); 	int a[10], i, *p; 	p = a; 	printf("enter 10 numbers:\n"); 	for(i=0; i<10; i++)//-----去掉分号--------- 		scanf("%d", p++); 	p = a; 	sort(p, 10); 	for(p=a, i=0; i<10; i++)//-----去掉分号--------- 		printf("%d ", *p++); 	printf("\n"); 	return 0; }  void sort(int x[], int n)//--------把int*x改为int[]------------ { 	int i, j, k, t; 	for(i=0; i<n-1; i++) 	{ 		k = i; 		for(j=i+1; j<n; j++) 		{ 			if(*(x+j)<*(x+k)) 				k=j; 			if(k!=i) 			{ 				t =*(x+i); 				*(x+i) = *(x+k); 				*(x+k) = t; 			} 		} 	} } VC++6.0调试   int*x和int x[]有什么不同吗? 但数据名做为形参时自动退化成指针吧。

user: user-2
content: 循环多分号了。

user: user-3
content: VC++6.0我的最爱，没有之一 #include<stdio.h>  int main(int argc, char* argv[]) {  	void sort(int x[], int n); 	int a[10], i, *p; 	p = a; 	printf("enter 10 numbers:\n"); 	for(i=0; i<10; i++)//-----去掉分号--------- 		scanf("%d", p++); 	p = a; 	sort(p, 10); 	for(p=a, i=0; i<10; i++)//-----去掉分号--------- 		printf("%d ", *p++); 	printf("\n"); 	return 0; }  void sort(int x[], int n)//--------把int*x改为int[]------------ { 	int i, j, k, t; 	for(i=0; i<n-1; i++) 	{ 		k = i; 		for(j=i+1; j<n; j++) 		{ 			if(*(x+j)<*(x+k)) 				k=j; 			if(k!=i) 			{ 				t =*(x+i); 				*(x+i) = *(x+k); 				*(x+k) = t; 			} 		} 	} } VC++6.0调试

user: user-0
content: 。。。谢谢！

user: user-4
content: 第一个for循环后面也多了个分号

user: user-4
content: 第二个for循环后面多了个分号
user-0 提问: 请问这是什么意思？

回复:
user: user-0
content: 引用 2 楼 qybao的回复:char s1="I am a student." //应该是这里警告，把字符串的地址赋给了字符（也就是把地址转成整形赋给了char类型） 另外，copy_partstr(p1,p2,a,b); //a，b哪来的？ 谢谢 ！# define a 8

user: user-0
content: 引用 2 楼 qybao的回复:char s1="I am a student." //应该是这里警告，把字符串的地址赋给了字符（也就是把地址转成整形赋给了char类型） 另外，copy_partstr(p1,p2,a,b); //a，b哪来的？ 谢谢 ！# define a 8

user: user-0
content: 引用 1 楼 與蘤舊縐的回复:char s1="I am a student."  看看少了什么 可以了 谢谢！

user: user-1
content: char s1="I am a student." //应该是这里警告，把字符串的地址赋给了字符（也就是把地址转成整形赋给了char类型） 另外，copy_partstr(p1,p2,a,b); //a，b哪来的？

user: user-2
content: char s1="I am a student."  看看少了什么
user-0 提问: 学生管理系统,双向链表结构,在最后进行字符串比较时出了一点小问题

回复:
user: user-1
content: 楼主，他们类型不同啊，num[IDLen]类型是char，而p->stu.id类型是char*，你不能这么判断是否相等。
user-0 提问: C语言素数判定（二维数组，自定义函数）求改错

回复:
user: user-0
content: 引用 1 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h> #include <time.h>  int ss(int num) {     int flag=0,i;     for(i=2;i<num;i++)     {  if(num%i==0)         {  flag=1;             break;         }     }     return flag; }  int main(void) {     //int   i=0,j,a[100][2],count=0;     int   i=0,j,a[100],count=0;     int ret;      srand(time(0));     for(;i<100;i++)     {         a[i] = 50 + rand()%151;         if ((ret = ss(a[i])) == 0)                 count++;         printf("a[%d]=%d %d\n", i, a[i], ret);     }     printf("\n这组数据中共有%d个素数。",count);     return 0; } 供参考～  不用考虑的那么麻烦，另外，函数参数建议楼主多去了解一下 好的，谢谢你

user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <time.h>  int ss(int num) {     int flag=0,i;     for(i=2;i<num;i++)     {  if(num%i==0)         {  flag=1;             break;         }     }     return flag; }  int main(void) {     //int   i=0,j,a[100][2],count=0;     int   i=0,j,a[100],count=0;     int ret;      srand(time(0));     for(;i<100;i++)     {         a[i] = 50 + rand()%151;         if ((ret = ss(a[i])) == 0)                 count++;         printf("a[%d]=%d %d\n", i, a[i], ret);     }     printf("\n这组数据中共有%d个素数。",count);     return 0; } 供参考～  不用考虑的那么麻烦，另外，函数参数建议楼主多去了解一下
user-0 提问: 求大佬

回复:
user: user-1
content: 我一般管理系统，做了有几百个了，类数组的，链表的，vector的，从来没见过还要用二叉树来做管理系统的，这玩意根本不搭。 二叉树一般不是要搞个什么前序中序后序吗，你们老师脑子咋想的。

user: user-0
content: 就是需要一个二叉树算法的实例，就是个可视化的东西

user: user-2
content: 图书管理系统为什么要用二叉树，完全扯不上边。或者你想用bst来做搜索？
user-0 提问: C\C++文件边读边写

回复:
user: user-0
content: 我知道首先要用读写分离区操作这个文件

user: user-0
content: 引用 3 楼 真相重于对错 的回复:你可以使用内存映射文件，把文件当内存来使用 大佬，我刚网上搜了一下文件当做内存映射使用机制，有点复杂

user: user-0
content: [quote=引用 2 楼 user-2 的回复:] 同一文件指针可行，读取和写入都会改变位置偏移量，写入时移动位置偏移量到最后，写完后进行刷新立即保存到文件，读取时保存文件读取的位置偏移量，下次读取时从该位置偏移量进行读取。 不同文件指针自行测试（应该必须加锁）。[/quo  有代码么，老哥

user: user-1
content: 你可以使用内存映射文件，把文件当内存来使用

user: user-2
content: 同一文件指针可行，读取和写入都会改变位置偏移量，写入时移动位置偏移量到最后，写完后进行刷新立即保存到文件，读取时保存文件读取的位置偏移量，下次读取时从该位置偏移量进行读取。 不同文件指针自行测试（应该必须加锁）。
user-0 提问: 文件新建失败的问题

回复:
user: user-1
content: char* pstrs = NULL;     gets(pstrs); 还没到打开文件的那步就会段错误了。因为pstrs指向了NULL，对于指向NULL的理解还是有问题的。NULL的位置是不可读不可写的，那么gets是往pstrs里写，所以一定会出现段错误。 所以，不是文件打开的问题，而是指针的使用错误。

user: user-2
content: 引用 4 楼 m0_46196884 的回复:[quote=引用 1 楼 yukint的回复:]头文件没包含？ 你一定要学会看编译报错说明。 编译报错invalid arguement,我理解成语法错误，不知道对不对[/quote] ============所谓 invalid arguement,翻译过来是什么，非法的参数， 那就是参数的问题，编译器一般还会告诉你是第几行出这样的问题，你没仔细去看罢了 你的代码中充斥着这类问题。  char* pstrs = NULL;     gets(pstrs);//gets的原型是什么?===>char *gets(char *s);，//这个参数类型对了，可是你的ptrs是NULL，空指针，你没有内存来容纳gets取出来的字符；，你可以把ptrs定义成数组，比如char ptrs[1024];       FILE* ptest = NULL;          if((ptest = fopen(ptest,"w")) == NULL){//ptest是文件指针，fopen是打开文件，不是打开文件指针 //函数原型FILE *fopen(const char *path, const char *mode); ，第一个参数是char *， 你却传给他FILE *，所以错误了          printf("打开文件失败\n");         perror("");   再解释下去有些繁琐，，好多东西需要解释，比如文件操作的这些库函数， 你应该怎么去理解他们，他们为你提供什么？你要告诉他们一些基本信息，以便让这些函数完成你交代下去的任务。。。

user: user-1
content: 引用 6 楼 m0_46196884 的回复:[quote=引用 3 楼 自信男孩的回复:]char* pstrs = NULL;     gets(pstrs); 还没到打开文件的那步就会段错误了。因为pstrs指向了NULL，对于指向NULL的理解还是有问题的。NULL的位置是不可读不可写的，那么gets是往pstrs里写，所以一定会出现段错误。 所以，不是文件打开的问题，而是指针的使用错误。 那我初始化指针前，是不是应该定义NULL为0？[/quote] 不需要。NULL是(void *)0.

user: user-0
content: 引用 3 楼 自信男孩的回复:char* pstrs = NULL;     gets(pstrs); 还没到打开文件的那步就会段错误了。因为pstrs指向了NULL，对于指向NULL的理解还是有问题的。NULL的位置是不可读不可写的，那么gets是往pstrs里写，所以一定会出现段错误。 所以，不是文件打开的问题，而是指针的使用错误。 那我初始化指针前，是不是应该定义NULL为0？

user: user-0
content: 那我初始化指针前，是不是应该定义NULL为0？

user: user-0
content: 引用 1 楼 yukint的回复:头文件没包含？ 你一定要学会看编译报错说明。 编译报错invalid arguement,我理解成语法错误，不知道对不对

user: user-3
content: 首先把  char *pstrs = NULL  改成  char pstrs[256];  否则gets(pstrs)的参数是空指针，会发生非法内存操作错误  其次把 if((ptest=fopen(ptest, “w”))!=NULL) 改成 if((ptest=fopen(”文件路径字符串”, “w”))!=NULL)  否则fopen的参数同样是空指针，肯定找不到路径，就会打开文件失败

user: user-2
content: 头文件没包含？ 你一定要学会看编译报错说明。
user-0 提问: 各位大佬耽误你们一分钟时间！为什么给变量赋了0值，变量不是0.

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:你把代码发全不行么应该是数组空间分配不足导致的

user: user-0
content: 引用 2 楼 user-1 的回复:你把代码发全不行么我已经断点了，就在初始化后面，总之谢了，兄弟，问题解决了

user: user-1
content: 你把代码发全不行么

user: user-0
content: 自顶！！！！！！
user-0 提问: C语言基础知识

回复:
user: user-0
content: 引用 1 楼 user-2的回复:在第一个scanf_s后面加个getchar()，去掉暂留在输入缓存区的换行符 第二个scanf_s的最后一个参数改成1 好的，懂了哈哈

user: user-0
content: 引用 3 楼 user-2的回复:因为%s的scanf不会接收换行符，也就是你虽然按了回车，但str并没有能把回车读进来，所以回车符就还留在输入缓存里。而%c会任意字符，所以刚好把残留在缓存区的换行符的读进来了。所以要用getchar来清空残留的换行符，否则%c读进来的数据就不对了。 懂了，谢了老哥

user: user-0
content: 引用 1 楼 user-2的回复:在第一个scanf_s后面加个getchar()，去掉暂留在输入缓存区的换行符 第二个scanf_s的最后一个参数改成1 ok，好的谢谢

user: user-1
content: 标准输入流，是行缓冲，就是你调用scanf，虽然你可以通过格式串去吸取你要的字符， 但是底层实现上，没办法严格限制用户按照你所需要的格式，精确的控制用户输入。 用户可以随意输入，行缓冲的意思是，你按回车之前的一整行，都会读入到一个缓冲区。 你可以把缓冲区看成一个文件，回想下你读文件的时候，有一个什么？位置，你当前的文件指针的附属信息。 ------------------------ 而scanf函数就类似于fread（fd，。。。）函数，scanf也有一个潜在的位置指针，在缓冲区（类比文件）中移动， 指示读到哪里了，（具体看scanf的帮助文档，你需要了解这个函数的机制，才知道你指定的格式串，在特定的输入串中， 以怎样的方式推进这个位置指针）！！！！特别是一些格式串对空白符（空格，tab，换行）的处理， 特别地：比如%c，一次就析取一个字符出来，不管是什么字符，然后指针向前推进1 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 假如你两次调用scanf，他一定会触发（弹出）两次用户输入界面吗？ 不一定的，这取决于第一次的scanf，是否把缓冲区的内容析取完了，类似于文件指针，读到文件尾。 ---------------------------------- 在有限的范围内，至少在你初步学习C语言的时候，你的输入都是小心翼翼的按照你的需求进行的 这种时候scanf确实是很强大的，，但是前提你要弄懂他，很仔细的去了解。 1.看文档，2.写程序验证你的猜测。 ----------------------------------- https://linux.die.net/man/3/scanf 如果你是在linux或者类似的环境里 直接man scanf就可以获得。 windows应该也有一套相关的开发帮助文档 你可以搜索scanf msdn https://docs.microsoft.com/en-us/previous-versions/windows/embedded/ms860361(v=msdn.10) 这个相对简陋些就是了，没有写那么详细

user: user-2
content: 因为%s的scanf不会接收换行符，也就是你虽然按了回车，但str并没有能把回车读进来，所以回车符就还留在输入缓存里。而%c会任意字符，所以刚好把残留在缓存区的换行符的读进来了。所以要用getchar来清空残留的换行符，否则%c读进来的数据就不对了。

user: user-0
content: 引用 1 楼 user-2的回复:在第一个scanf_s后面加个getchar()，去掉暂留在输入缓存区的换行符 第二个scanf_s的最后一个参数改成1 为什么得加一个，getchar（），能再解释一下吗大哥😂😂

user: user-2
content: 在第一个scanf_s后面加个getchar()，去掉暂留在输入缓存区的换行符 第二个scanf_s的最后一个参数改成1
user-0 提问: C语言scanf循环赋值进入死循环了

回复:
user: user-0
content: 哦，我懂了，谢谢各位！

user: user-1
content: 引用 2 楼 自信男孩 的回复:因为除了第一个m[0]之外，for循环判断都是i+1的值，所以即使输入的是m[i]是大于等于16的，m[i] < 16判断的i是i+1了，不是输入的第i个值。理解了吗？  #include<stdio.h> int main() { int i; int m[17]={0}; printf("请输入m项的值");  for(i=0;m[i]<16;i++)    {    scanf("%d",&m[i]);   }    } 供参考～  发错代码了，应该是下面的： #include<stdio.h> int main() {     int i;     int m[17]={0};     printf("请输入m项的值");      //for(i=0;m[i]<16;i++)     for(i=0;;i++)     {         scanf("%d",&m[i]);         if (m[i] >= 16)             break;     } }

user: user-1
content: 因为除了第一个m[0]之外，for循环判断都是i+1的值，所以即使输入的是m[i]是大于等于16的，m[i] < 16判断的i是i+1了，不是输入的第i个值。理解了吗？  #include<stdio.h> int main() { int i; int m[17]={0}; printf("请输入m项的值");  for(i=0;m[i]<16;i++)    {    scanf("%d",&m[i]);   }    } 供参考～

user: user-2
content: 你给前一个元素赋值但是后一个元素没有值你就判断是不是小于16了