Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 自己写的3位数倒过来

回复:
user: user-1
content: 引用 3 楼 mstlq 的回复:字符串版本，长度1023之内都行，不限数字，末尾的0也能处理 #include<stdio.h> #include <string.h> int main() {     char a[1024];     scanf("%s", a);     strrev(a);     printf("%s\n",a);     return 0; } 如果是数字版本，不介意翻转后0被清掉，则可以用下面的，同样不限于3位数 #include<stdio.h> int main() {     unsigned int  a=0, b=0;     scanf("%u", &a);     for (b = 0; a; a /= 10)         b = b * 10 + (a % 10);     printf("%u\n",b);     return 0; } 目测这两个方法很全面，数字的可以，字母的都行

user: user-2
content: 一个偷鸡做法   #include<stdio.h> int main()  { int a,b,c; scanf("%1d%1d%1d",a,b,c); printf("%d%d%d",c,b,a); return 0; }

user: user-3
content: #include <stdio.h>  int main() {     int num, digit;     int new_num = 0;      scanf("%d", &num);      while (num) {         new_num *= 10;         digit = num % 10;         new_num += digit;         num /= 10;     }      printf("new number = %d\n", new_num);      return 0;  }  参考一下吧  可以实现3位数，甚至多位数的逆序；

user: user-4
content: int len=0; char *p=NULL,s[1024]={0}; p=s; gets(s); while(*p) {     len++; } while (len--) {     printf("%c",*p--) }

user: user-5
content: char a[21]; gets(a); int i,n=strlen(a); for(i=n-1;i>=0;i--) printf("%c",a[i]);

user: user-6
content: 字符串版本，长度1023之内都行，不限数字，末尾的0也能处理 #include<stdio.h> #include <string.h> int main() {     char a[1024];     scanf("%s", a);     strrev(a);     printf("%s\n",a);     return 0; } 如果是数字版本，不介意翻转后0被清掉，则可以用下面的，同样不限于3位数 #include<stdio.h> int main() {     unsigned int  a=0, b=0;     scanf("%u", &a);     for (b = 0; a; a /= 10)         b = b * 10 + (a % 10);     printf("%u\n",b);     return 0; }

user: user-7
content: 输入的时候a[0]，a[1]，a[2],输出倒着

user: user-8
content: 字符数组操作，   a[0]与a[2]互换  注意a[2]为‘0‘的特殊情况
user-0 提问: 求助，没学过msp430请帮忙转换成c51的程序代码

回复:
user: user-1
content: 这里的msp430的是用硬件SPI来通信的，51一般用IO模拟SPI通信， 直接看下面链接的C51的代码，SPI读和写会了的话，操作就简单了  高清晰AD9854中文资料附带51程序 https://wenku.baidu.com/view/0c19327bbe23482fb4da4ce6.html
user-0 提问: C语言练习求救

回复:
user: user-1
content: 看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-0
content: 赵4老师： 查看Call Stack，需要汇编知识才看懂吗？  汇编还没有学，我准备学完C语言才看看汇编

user: user-0
content: 谢谢大家的热心指教！   引用 5 楼 zhao4zhong1 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  刚刚入门，现在的水平只是在  codeblocks  编译程序，也就是简单的“build and run”，你说的感觉挺高大上啊？ 非常感兴趣，是什么编译工具？  学习C语言用什么IDE调试好呢？

user: user-2
content: #include <stdio.h> #include <stdlib.h>  int fun(int a[],int n) {     if(n>=1)         return fun(a, n-1) + a[n-1];     else         return 0; } int main() {     int x[7]={1,2,3,4,5,6,7},s;     s = fun(x,7);     printf("%d\n",s);     return 0; } 程序没什么问题  改程序func是递归函数，n-1是保证func去执行else，递归n-1最后能做到n < 1。

user: user-0
content: 引用 1 楼 user-4 的回复:这是递归调用，最终当n<1时递归返回 顿时彻悟！谢谢，马上去补

user: user-3
content: 你可以去看看递归函数的调用

user: user-4
content: 这是递归调用，最终当n<1时递归返回

user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
user-0 提问: 求大神帮忙。

回复:
user: user-1
content: #include <stdio.h>   union   test_t{     struct    test2_t{         unsigned char a[4];         int b;     }test2;     int c; }test;  int main(void) {      test.c=0x1234;      printf("a[0]: %x\n*",test.test2.a[0]);      printf("a[1]: %x\n*",test.test2.a[1]); } 以上参考一下吧  代码有错误，注意双引号的内容，test.test2.a[0]和test.test2.a[1]是在双引号外的，估计是手误； 输出结果是： a[0]: 34 a[1]: 12 低位0x34, 高位:0x12; 由于union的占内存的大小是有最大变量的长度决定的。即有test2决定，sizeof(test2)是8(32位系统），因此c是0x1234，等同于test2.a也是0x1234，因此a[0]是0x34, a[1]是0x12

user: user-2
content: c的内存位置和大小恰好是a的位置和大小，不同架构下只是大端和小端的问题 先求出这个int转换为4个字节，正序，逆序下取得a[0]，a[1]
user-0 提问: 求助C语言“老师分糖果问题”

回复:
user: user-1
content: 你的代码看起来好麻烦啊！ 我自己整理了下思路，后面附上用C和C++两种编写的代码，你可以参考一下。 解题思路： 第一步：  先用数学思维考虑本题，设总共有n份糖果，分别设第一个学生得到的份数为sum1，第二个学生得到的份数为sum2。  第二步： 第一个学生得到的份数为：sum1=1 + （n-1）*1/10； 化简后为 sum1=（n+9）/10;   此时，剩下的份数为：   n-(n+9)/10= (9n-9)/10.  第三步：第二个学生得到的份数为：sum2=2+ ((9n-9)/10-2)*1/10,化简后为sum2=(9n+171)/100。  第四步：只有当sum1=sum2的时候，满足题目条件，穷举出结果。 C代码如下： #include <stdio.h>               //引用头文件   int main( )                    {          int n;                       //定义整型变量n       float sum1,sum2;             //定义两个学生得到的份数为单精度浮点型        for(n=11; ; n++)             //糖果份的开始至少为11，依次增加       {            sum1=(n+9)/10.0;            //第一个学生得到的糖果份数           sum2=(9*n+171)/100.0;       //第两个学生得到的糖果份数            if(sum1 != (int)sum1) continue;       //得到的糖果份数必须为整数           if(sum2 != (int)sum2) continue;           if(sum1 == sum2) break;                //只有当sum1与sum2相等的时候，才能穷举出符合条件的结果       }       printf("一共有%d个学生\n将糖果分成了%d份\n",(int)(n/sum1),n);       //(n/sum1)即为学生个数    }   运行结果如下 下面这个是用C++编写的代码（思路类似）： #include<iostream> #include <string> using namespace std;  int     main(void){     float   n1,n2;     int n;      for(n=11;;n++){         n1 = (n+9)/10.0;         n2 = (9*n+171)/100.0;         if(n1 !=(int)n1) continue;         if(n2!=(int)n2)continue;         if(n1==n2) break;     }     cout<<n/n1<<'\t'<<n<<endl;     return(0); } 附上运行结果如图

user: user-2
content: 现象：candy函数一直返回0 m=100时 越界访问数组 程序直接崩溃 原因：逻辑问题

user: user-3
content: for(i=1;i<=m;i++)     {         //计算第i个小朋友拿走糖果的份数         if(i==1)             x[i]=1+(n-1)/10;         else             x[i]=4+(y[i]-i)/10;     } 第一个问题 x[i]=4+(y[i]-i)/10;  按你的逻辑  x[i]=i+(y[i]-i)/10;  第二个问题：计算过程中是会出现浮点数的，你都用int数组装了，意味着你可能得不到一个合适的解  另外 数组不从0下标开始 好别扭。。。
user-0 提问: 求大神指点C语言关于文件读取的问题 

回复:
user: user-1
content: 在楼主的环境中，一个int变量占4个字节…… 所以文件中前4个字节的内容都被放到了a[0]里面..... 如果是char a[10],那么a[0]中就只是文件中第一个字节的内容 两者当然不一样  建议楼主不要着急，找本基础教材先系统地学学这个

user: user-1
content: 因为printf看到"%c"之后，只解析了a[0]4个字节中的第一个，这是两个错误负负得正

user: user-0
content: 引用 1 楼 user-1 的回复:在楼主的环境中，一个int变量占4个字节…… 所以文件中前4个字节的内容都被放到了a[0]里面..... 如果是char a[10],那么a[0]中就只是文件中第一个字节的内容 两者当然不一样 建议楼主不要着急，找本基础教材先系统地学学这个  谢谢 还有一点不能理解的是那既然文件前4个字节的内容都被放到了a[0]里面 那为什么用%c输出的时候能准确得输出c？ 作为二进制存在内存里的时候感觉已经不是c的ascii码了。。
user-0 提问: 求求大神看看这个程序问题在哪

回复:
user: user-1
content: #include<stdio.h> #include<string.h> #include<locale.h>  #define max 100  int main() {     char a[max];     int i,j,k,len,f;      setlocale(LC_ALL,"chs");     printf("请输入一个英文句子：");     fgets(a,max,stdin);     if ('\n'==a[strlen(a)-1]) a[strlen(a)-1]=0;     len = strlen(a);     j=k=f=0;     for (i=0;i<len;i++) {         if (('A'<=a[i] && a[i] <= 'Z')           ||('a'<=a[i] && a[i] <= 'z')) {             j++;             f=1;         } else {             if (f==1) {                 k++;                 f=0;             }         }     }     if (f==1) k++;     printf("英文句子的字母个数为%d个\n", j);     printf("英文句子的单词个数为%d个\n", k);     return 0; } //请输入一个英文句子：_I'm sorry!  Very very sorry!!_ //英文句子的字母个数为20个 //英文句子的单词个数为6个 //

user: user-2
content: 引用 6 楼 自信男孩的回复:[quote=引用 5 楼 withraohu 的回复:] scanf的a不是要加&咩? 不能加&;加了就会有问题了。[/quote] 我是小白，勿怪

user: user-3
content: 引用 5 楼 withraohu 的回复:scanf的a不是要加&咩? 不能加&;加了就会有问题了。

user: user-4
content: #include <stdio.h> #include <string.h> #include <ctype.h> #include <stdlib.h> #define max 100 int main() { 	char a[max],*p=NULL; 	int chcnt=0, k=0, len; 	printf ( "请输入一个英文句子：\n" ); //	scanf ( "%s", a );        碰到空白会截断 	fgets(a,max,stdin); 	len = strlen ( a ); 	for ( int i = 0; i != len; i++ ) 	{ 		if ( isalnum ( a[i] ) ) 			chcnt++; 	} 	p=strtok(a," "); 	while(p) 	{ 		k++; 		p=strtok(NULL," "); 	} 	printf ( "英文句子的字母个数为%d个\n", chcnt ); 	printf ( "英文句子的单词个数为%d个\n", k ); 	return 0; }

user: user-5
content: 还有 j 和 k都没初始化吧

user: user-3
content: #include<stdio.h> #include<string.h>  #define max 100  int  main() {     char a[max];     int i,j,k,len;      printf("请输入一个英文句子：");     fgets(a, max, stdin);     len = strlen(a);     for(i=0;i<len;i++)     {         if((a[i]>= 'A' && a[i] <= 'Z')||(a[i] >= 'a' && a[i] <= 'z'))             j++;         if(a[i] == ' ')             k++;     }     k++;     printf("英文句子的字母个数为%d个\n", j);     printf("英文句子的单词个数为%d个\n", k); }  参考一下吧； 第一个问题：不能使用scanf输入一个带有空格的英文句子，因为scanf是格式化输入，遇到空格表示一个格式的输入结束，因此放在a中的单词不会存在空格。 建议改成fgets或者其他能够输入一行的函数。 第二个问题：统计字母时，缺少了边界，比如‘a', 'A', ’z', 'Z' 建议使用库函数isalpha(a[i]);判断字母

user: user-6
content: if((a[i]>'A'&&a[i]<'Z')||(a[i]>'a'&&a[i]<'z')) 改 if((a[i]>='A'&&a[i]<='Z')||(a[i]>='a'&&a[i]<='z'))  还有if(a[i]==' ')应该是if(a[i]=='  ')，注意空格，并且要注意首个单词前面的空格不能将k自增，如果前面一个已经是空格，那么当前是空格也不能给k自增

user: user-7
content: <=  >=
user-0 提问: Socket通信有个问题困扰了我快一天了  大佬快来救我~

回复:
user: user-1
content: void *server_requst(int cfd)  89     return;  90 }  91   92   93 void *server_requst(int cfd) 为什么要定义两个同名函数？ 不看你的代码还以为你使用的是管道机制呢。这不是读写socket吗？描述的时候怎么成管道呢？

user: user-2
content: 不知道有多少前人掉在TCP Socket send(人多)send(病少)send(财富) recv(人多病)recv(少财富) 陷阱里面啊！ http://bbs.csdn.net/topics/380167545

user: user-0
content: 服务器还有一段代码 int main(int argc,char *argv[]) 125 { 126  int sfd; 127  pusermsg p =(pusermsg)malloc(sizeof(usermsg)/sizeof(char)); 128                          if(p == NULL) 129                           { 130                             printf("malloc failed..."); 131                           } 132  p->next = p; 133  sfd = tcp_init(); 134  // signalhandler(); 135  char *errmsg = NULL; 136  137  ret = sqlite3_open("user.db",&db); 138                     if(ret != SQLITE_OK) 139                       { 140                         perror("open user.db error"); 141                         return -1; 142                       } 143  printf("建立用户数据库成功\n"); 144  146                    if(ret != SQLITE_OK) 147                      { 148                        printf("create fail :%d(%s)\n\n",ret,errmsg); 149                        return -1; 150                      } 151  153                     if(ret !=SQLITE_OK) 154                      { 155                       printf("creat fail:%d(%s)\n",ret,errmsg); 156                       return -1; 157                      } 158  159  pthread_t clientid; 160  161  while(1) 162  { 163     int cfd; 164     cfd = tcp_accept(sfd); 165                      if(cfd == -1) 166                        { 167                         perror("accept"); 168                         return -1; 169                        } 170     ret = pthread_create(&clientid, NULL, (void*)server_requst, (void*)cfd); 171                      if(ret == -1) 172                        { 173                         perror("pthread create"); 174                         return -1; 175                        } 176     pthread_detach(clientid); 177     pthread_join(clientid, NULL); 178   } 179 sqlite3_close(db); 180 return 0; 181 } 182  183
user-0 提问: 求助：定义可变字符串数组，还需要scanf读取输入的中文，printf输出中文

回复:
user: user-1
content: 个人建议的数据结构：  struct good {     char good_name[32];     float unit_price;     int num;     float discount; };  struct customer {     struct good *list;     int score;     float money; };

user: user-2
content: 想实现数量动态可变的话，使用  vector< goods,&goods  >   v_goods; 里面有各种添加，取得方法  面度下 vector怎么用

user: user-0
content: 引用 2 楼 zhouqt 的回复:结构体数组来实现  struct   goods {   char[20]     name;   float           price;   int               num;   float           sum; };  goods    gds[20 ];  商品名最后加 ‘/0’  结束符 即可！ 可以详细点吗？ 而且这个应该不可以实现可变的物品数量吧

user: user-2
content: 结构体数组来实现  struct   goods {   char[20]     name;   float           price;   int               num;   float           sum; };  goods    gds[20 ];  商品名最后加 ‘/0’  结束符 即可！

user: user-0
content: 没沉吧。。。
user-0 提问: 有懂c++和java的么？ 求翻译下c代码

回复:
user: user-0
content: @gspUser  你的翻译是正确的，我校验截取错了

user: user-1
content: 那是你的C函数代码错了，你的C函数的计算结果和工业上常用 Modbus A001 的CRC16计算结果对不上。 用你的说的数据用你的C函数计算出来的CRC校验码，也和你说的校验码不一样， 你给的测试数据与工业用的校验结果也对不上. 用楼上的CRC校验函数得到的校验码也和你给的数据的校验码不一样  unsigned char d[15]={0x7e,0xfe,0x10,0x02,0x21,0x04,0x0b,0x00,0x00,0x00,0x0a,0x24,0x00,0x00,0x00};  printf("0x%04hX\n",exampleOfUseCRC16(d,15));//0x11FB printf("0x%04hX\n",crc16l(d,15));//0x61C9  不知道你的CRC是用什么样的表达式， 也可能是你的数据需要的校验起始字节不是从第一个字节开始的 有没有协议

user: user-2
content: 仅供参考：/***** crc16.c *****/ #include <stdio.h>  #define CRC16_DNP   0x3D65u     // DNP, IEC 870, M-BUS, wM-BUS, ... #define CRC16_CCITT 0x1021u     // X.25, V.41, HDLC FCS, Bluetooth, ...  //Other polynoms not tested #define CRC16_IBM   0x8005u     // ModBus, USB, Bisync, CRC-16, CRC-16-ANSI, ... #define CRC16_T10_DIF   0x8BB7u     // SCSI DIF #define CRC16_DECT  0x0589u     // Cordeless Telephones #define CRC16_ARINC 0xA02Bu     // ACARS Aplications  #define POLYNOM     CRC16_DNP   // Define the used polynom from one of the aboves  // Calculates the new crc16 with the newByte. Variable crcValue is the actual or initial value (0). unsigned short crc16(unsigned short crcValue, unsigned char newByte) {     int i;      for (i = 0; i < 8; i++) {         if (((crcValue & 0x8000u) >> 8) ^ (newByte & 0x80u)){             crcValue = (crcValue << 1)  ^ POLYNOM;         } else {             crcValue = (crcValue << 1);         }         newByte <<= 1;     }     return crcValue; }  unsigned short exampleOfUseCRC16(unsigned char *Data, int len){      unsigned short crc;     int aux = 0;      crc = 0x0000u; //Initialization of crc to 0x0000 for DNP     //crc = 0xFFFFu; //Initialization of crc to 0xFFFF for CCITT      while (aux < len){         crc = crc16(crc,Data[aux]);         aux++;     }      return (~crc); //The crc value for DNP it is obtained by NOT operation      //return crc; //The crc value for CCITT }  int main() {     unsigned char d[10]={0,1,2,3,4,5,6,7,8,9};      printf("0x%04hX\n",exampleOfUseCRC16(d,10));//0x1078     return 0; }

user: user-0
content: 7efe100221040b0000000a24000000  ca05 05  crc校验和应该是 ca05,但是算出来的不对 啊 能帮忙看下么

user: user-1
content: java和C++的代码很相似，小小改动就可以了，运行结果和C++的是一样的  public static int CRC16(byte[] buf,int len) 	{ 	    int crc=0x0000;          short c,i;  		int mindex=0;         while(len!=0)          {           c=buf[mindex++];           for(i=0;i<8;i++)           {            if(((crc ^ c) & 1)>0)               crc=(crc>>1)^0xa001;            else                crc>>=1;           c>>=1;          }           len--;                  }        return crc;  	}
user-0 提问: 调用函数之前能够改变函数中的语句吗

回复:
user: user-1
content: 不能  因为这个函数编译后形成的二进制文件是固定的，指令都定型了 你没法改

user: user-2
content: 这个问题问得好啊！

user: user-3
content: 不能，编译后的二进制是固定的并且不能改变。除非是暴力的手段直接修改系统运行时候的内存，但是你想要的效果是可以实现的！  int nCompareLower = 0; int Func(int a,int b) {         if(nCompareLower  && a < b)return 1;         else if(!nCompareLower  && a > b) return 2; return 0; }

user: user-4
content: 能

user: user-5
content: 不能。上楼有正解。代码编译后就定了。

user: user-6
content: 笼统的说，硬要改变已编译好的写死的2进制文件， 也不是不可以， 参考hook  如果只讨论你这个例子，想直接改变你这行代码里的 这个 > 变 < ，代码是不能改的，但是你要的效果是可以实现的， 就是把这个比较运算符，抽象成变量，作为函数参数传进去，你传的是大于， 就按大于比较，你传的是小于， 就按小于比较  bool CmpGreater(int a, int b) { 	return a > b; } bool CmpLess(int a, int b) { 	return a < b; }  typedef bool (*CmpFun)(int, int);  int Func(int a, int b, CmpFun fun) { 	if (fun(a, b)) 		return 1; }  int main(int argc, char* argv[]) { 	CmpFun pGreater = CmpGreater; 	CmpFun pLess = CmpLess;  	Func(1, 2, pGreater); // 按a > b比较 	Func(1, 2, pLess); // 按a < b比较 }
user-0 提问: 求教，有个题不会

回复:
user: user-1
content: 这个是要知道结构体内各变量是如何占用内存的，c和c++中是按照变量声明的先后顺序，定义的结构体数组中，每个数组元素占int的4个字节和结构体指针的4个字节共8个字节 a指向结构体数组的首地址，那么a+1代表的就是从a向后跳8个字节，那么a+1指向的就是a[1]的位置，以此类推。就建立起了一个单链表。for循环中是输出单链表的前两个结点的x的值。

user: user-2
content: 百度：C 链表，学习相关知识点

user: user-3
content: 数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633
user-0 提问: 帮忙看一下

回复:
user: user-1
content: 代码相当于 b+=(c++)-d+(--e)/(-f); a=b;  不熟悉运算符优先级和结合顺序时可以自己钻钻牛角尖，实际写代码这么搞的话，就需要好好反省了

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

user: user-3
content: 如果依然在校，考试需要用到。可以在考前着重理解一下。如果是找工作，别人面试问道了这个问题，我觉得可以直接坦言，说这个表达式意义不大。自己实际一尝试就能得到答案。

user: user-4
content: 可以直接跳过类似这样的表达式，不给自己也不给别人找麻烦。平时项目中如果用这样的表达式，还会被批评。

user: user-5
content: 这种没必要去研究，用来考试的题， 编译能过说明语法正常的，然后把看起来连续的不合理符号拆成++，或者--，或者负号， 所以代码相当于 b+=(c++)-d+(--e)/(-f); a=b;

user: user-6
content: 实际项目中，敢这么写代码的人，会被拉出去弹jj弹到死的。

user: user-4
content: 个人认为这么复杂的运算，可读性很差，不建议去写。 根据实际逻辑，建议分开写。
user-0 提问: #32770类或CreateWindow创建不了不带标题条的窗口

回复:
user: user-0
content: 找到原因了,原来是窗口大小没设置好,我把它设置为100x100窗口就出来了.小弟新手,各位见笑了.

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

user: user-0
content: 用了这个风格后窗口就没了,是变全透明了还是根本没有我也不清楚

user: user-2
content: WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_POPUP 试试可行。  http://bbs.csdn.net/topics/90181689

user: user-0
content: 求教,在网上找了好久一无所获
user-0 提问: 投诉对回复者不尊重的提问者

回复:
user: user-1
content: 我个人习惯是对所有回复者都给不等的分数，我不喜欢那种一个人获得全部得分的提问者。

user: user-0
content: 引用 1 楼 ysclxl 的回复:大家一起谴责这种臭不要脸的，  可以去客服专区投诉，管理员有强制结贴权限的 哎，真是的，既然做了这个板块，不想继续开放了通知一下啊。我的损失谁来解决，只能说"丑的都不要脸了”。

user: user-2
content: 大家一起谴责这种臭不要脸的，  可以去客服专区投诉，管理员有强制结贴权限的
user-0 提问: 内存分配的疑问

回复:
user: user-1
content: 对，应该是这样，他这样弄也是为了内存好管理。  引用 5 楼 u013861540 的回复:[quote=引用 3 楼 wanggui2015 的回复:] 从你给的代码看，我猜测是WSARecv这个函数需要这样的结构体WSABUF接收数据，WSABUF里面的数据类型就是指针，所以把WSABUF和存储数据的buffer封装到一个结构体里了。  [quote=引用 2 楼 u013861540 的回复:] [quote=引用 1 楼 wanggui2015 的回复:]  ioInfo->buffer 是存储数据的内存空间啊，ioInfo->wsaBuf.buf 仅是一个指针，指向了上面的内存空间。 这个我懂，但是这么做有什么意义吗[/quote][/quote] 哦，那么，如果不指向 ioInfo->buffer而是用malloc分配同样大小的空间也是可以的喽？[/quote]

user: user-0
content: 引用 3 楼 wanggui2015 的回复:从你给的代码看，我猜测是WSARecv这个函数需要这样的结构体WSABUF接收数据，WSABUF里面的数据类型就是指针，所以把WSABUF和存储数据的buffer封装到一个结构体里了。  [quote=引用 2 楼 u013861540 的回复:] [quote=引用 1 楼 wanggui2015 的回复:]  ioInfo->buffer 是存储数据的内存空间啊，ioInfo->wsaBuf.buf 仅是一个指针，指向了上面的内存空间。 这个我懂，但是这么做有什么意义吗[/quote][/quote] 哦，那么，如果不指向 ioInfo->buffer而是用malloc分配同样大小的空间也是可以的喽？

user: user-2
content: ioInfo->wsaBuf.buf是一個指針，而且它可能會指向其他地方，衹是在這裏它直接指向了ioInfo->buffer。另有一個可能性是ioInfo->wsaBuf.buf是歷史遺留的，爲了兼容性才給保留，但後來的代碼都直接指向了ioInfo->buffer。

user: user-1
content: 从你给的代码看，我猜测是WSARecv这个函数需要这样的结构体WSABUF接收数据，WSABUF里面的数据类型就是指针，所以把WSABUF和存储数据的buffer封装到一个结构体里了。  引用 2 楼 u013861540 的回复:[quote=引用 1 楼 wanggui2015 的回复:]  ioInfo->buffer 是存储数据的内存空间啊，ioInfo->wsaBuf.buf 仅是一个指针，指向了上面的内存空间。 这个我懂，但是这么做有什么意义吗[/quote]

user: user-0
content: 引用 1 楼 wanggui2015 的回复:ioInfo->buffer 是存储数据的内存空间啊，ioInfo->wsaBuf.buf 仅是一个指针，指向了上面的内存空间。 这个我懂，但是这么做有什么意义吗

user: user-1
content: ioInfo->buffer 是存储数据的内存空间啊，ioInfo->wsaBuf.buf 仅是一个指针，指向了上面的内存空间。
user-0 提问: C多维数组指针相关

回复:
user: user-1
content: 引用 2 楼 INNATEKING的回复:一维数组的数组名是首地址，二维数组名指向二维数组的第一行，二维数组名[0]指向二维数组第一行的第一个元素，二维数组名+0指向二维数组的第二行，二维数组名[0]+1指向二维数组第二行的第一个元素，这个听起来有点烦，但是应该没错，二维数组分行地址，列地址，详细的你百度下吧，万一我有说错的，别笑话我啊 没错的。。。。。。。

user: user-2
content: //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-2
content: http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-3
content: int a[3][3]; 如果要用指针来指向它 正确的语法是 int (*p)[3]=a; 意思是 p 是一个指针他指向了一个包含3个元素的数组

user: user-4
content: 建议看看这个，对c+多维数组深入解析：https://blog.csdn.net/sinat_22991367/article/details/76408197

user: user-5
content: Str指的是str[0][0] str[0]指的是数组第一行

user: user-3
content: 引用 10 楼 qq_34994282 的回复:#include<stdio.h>  int main(){ int a[3][4]={1},*p; p=a; printf("%d",*p);   return 0; }  试了一下，，可以的啊，这个是对的，输出的是第一个元素 对，c的可以，c++不行

user: user-6
content: 类型不一样，虽然地址值一样的。 str是int (*)[10]; p是int *类型。

user: user-6
content: 引用 10 楼 qq_34994282 的回复:#include<stdio.h>  int main(){ int a[3][4]={1},*p; p=a; printf("%d",*p);   return 0; }  试了一下，，可以的啊，这个是对的，输出的是第一个元素 地址值一样，但是类型是不同的。 你用的编译器检查的不严格。另外，地址输出应该用%p或%u，而不是%d

user: user-1
content: #include<stdio.h>  int main(){ int a[3][4]={1},*p; p=a; printf("%d",*p);   return 0; }  试了一下，，可以的啊，这个是对的，输出的是第一个元素

user: user-7
content: str的类型是int**，str[1]的类型是int*，str[1][1]的类型是int。所以结果很明显。

user: user-8
content: 一维数组的数组名是首地址，二维数组名指向二维数组的第一行，二维数组名[0]指向二维数组第一行的第一个元素，二维数组名+0指向二维数组的第二行，二维数组名[0]+1指向二维数组第二行的第一个元素，这个听起来有点烦，但是应该没错，二维数组分行地址，列地址，详细的你百度下吧，万一我有说错的，别笑话我啊

user: user-9
content: 是类型不同  一个二维的 一个一维的
user-0 提问: 5重循环如何赋值？拿50分谢谢啦

回复:
user: user-1
content: 你定义数组的时候就初始化了，假设后面的所谓的循环正确的话 他所做的也就是你已经做过的初始化工作，反而现在你的循环将所有元素都变为了0 你后面又判断他们等不等于5，全是0 ，哪来的5，好好理顺一下逻辑吧。

user: user-2
content: sum = b1[a] + b2[b] + b3[c] + b4[d] + b5[e]; 这儿的sum的值是0，因为b1[a]。。。b5[e]都是0。因为下标是从0开始，而不是1开始。 所以上面的sum = b1[a] + b2[b] + b3[c] + b4[d] + b5[e];等价sum = b1[9] + b2[9] + ... + b5[9]; b1[9] ... b5[9]都是0。

user: user-2
content: for (a = 1; a <= 8; a++) { b1[a] = 1; b1[a] = 4; b1[a] = 3; b1[a] = 4; b1[a] = 5; b1[a] = 6; b1[a] = 7; b1[a] = 0; } 这个循环有很多冗余的操作 等价与下面的  for (a = 1; a <= 8; a++) { b1[a] = 0; } 所以要么你的循环写的有问题，要么就是逻辑考虑的有问题 下面的几个循环都是这样的问题

user: user-3
content: 比如int b1[9]; int a[9]={1,3,5,7,9,0,2,4,6}; for(int i=0;i<9;i++) {     b1[i]=a[i]; } 不过一般a[9]是其他表达式或函数获得

user: user-4
content: #include "stdafx.h" #include<stdio.h>  #define MAX 8  int main(void) { 	int a, b, c, d, e, i = 0; 	int sum = 0; 	int b1[MAX] = { 1,4,3,4,5,6,7,0 }; 	int b2[MAX] = { 1,1,3,4,5,3,7,0 }; 	int b3[MAX] = { 1,7,3,4,5,6,7,0 }; 	int b4[MAX] = { 1,1,3,4,5,4,7,0 }; 	int b5[MAX] = { 1,1,3,4,5,6,7,0 };  	for (a = 0; a < MAX; a++) { 		for (b = 0; b < MAX; b++) { 			for (c = 0; c < MAX; c++) { 				for (d = 0; d < MAX; d++) { 					for (e = 0; e < MAX; e++) { 						sum = b1[a] + b2[b] + b3[c] + b4[d] + b5[e]; 						if (5 == sum) { 							printf("A:%2d B:%2d C:%2d D:%2d E:%2d ", b1[a], b2[b], b3[c], b4[d], b5[e]); 							i++; 							if (i % 1 == 0) 								printf("\n"); 						} 					} 				} 			} 		} 	}  	printf("共有%d种办法\n", i);  return 0; }

user: user-1
content: 引用 5 楼 qq_35876885 的回复:数组赋值:如果是常量的话直接赋值就好了，而且你已经赋过了。非要用循环的话，要是变量。比如 for(int i=0;i<8;i++) {       b1[i]=变量; }很明显，他要得是每个数组元素里面有不同的值，怎么用循环赋值？

user: user-3
content: 数组赋值:如果是常量的话直接赋值就好了，而且你已经赋过了。非要用循环的话，要是变量。比如 for(int i=0;i<8;i++) {       b1[i]=变量; }

user: user-5
content: 你知道你这里计算的是什么 sum = b1[a] + b2[b] + b3[c] + b4[d] + b5[e];   在你的代码里这里算的是 sum = b1[9] + b2[9] + b3[9] + b4[9] + b5[9]=0，接着if循环判断为假，继续执行printf("共有%d种办法\n", i);  这里的i值为0.。。。。
user-0 提问: 杭电1002题目oj通不过为什么，两个代码只有一行位置不同，第一个却通不过

回复:
user: user-1
content: 因为第二个定义在for循环内，每次循环后， int a[1001]={0},b[1001]={0},total[1001]={0}; a, b, total变量都会被初始化为0， 但是第一个不会，每次循环后第一个的a, b, total还保留着上次计算（赋值给a, b, total)的值。
user-0 提问: C中的error：conflicting types for

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

user: user-2
content: 因为你前面的函数使用了后面的结构体，这时候应该前置声明或者直接把定义前置

user: user-3
content: 因为getgrade的定义涉及struct student，但是在此之前没有定义或说明struct student

user: user-0
content: 引用 1 楼 qq_30918465 的回复:使用vc++编译通过，楼主可以试着把结构体定义放在前面 感谢 把定义前置就好了 可是为什么呢……

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

user: user-5
content: 代码不全，但从目前贴出来的代码编译是没问题的。 建议贴出完整代码

user: user-2
content: 使用vc++编译通过，楼主可以试着把结构体定义放在前面

user: user-6
content: 不出意外的话，应该是student*p连在一起了，应该是student *p

user: user-7
content: 你应该是有什么结构体、变量什么的冲突吧
user-0 提问: c语言进阶书籍推荐

回复:
user: user-1
content: 《C和指针》应该够了，建议你去www.kernel.org下个linux内核代码看看

user: user-2
content: 谢谢~我去看看

user: user-3
content: http://download.csdn.net/download/cs_fzt/7765259下载这个去看看

user: user-4
content: C Primer Plus中文第六版，很厚，真的不错。。。

user: user-5
content: C primer plus 比较基础 当字典用不错

user: user-6
content: 学习编程语言是为了编程， 还是多看看大型的代码，体会其中的思想，我就是这么走过来的， 学习别人的代码理解别人的思想比啃书有用多了

user: user-7
content: C Primer Plus 很多人推荐，可惜我没有看过，不知道是讲得什么

user: user-8
content: <<C语言程序设计的现代方法>>

user: user-9
content: 楼主如果想用C玩玩图形、小游戏编程，可以了解一下EasyX，EasyX是Windows平台最简单的绘图函数库（名副其实），兼容BC和TC的绘图函数，在VC下用EasyX来编程跟在TC下编程绘图差不多是完全一样的。EasyX既可以绘图，也支持图像显示和处理。  下载一个EasyX包，里面有完整的函数手册EasyX_Help.chm，有示例。EasyX官网有很多网友上传的实例，包括游戏。  仅供参考： 用绘图语句画机器猫（初学C语言的同学必看） http://blog.163.com/tab_98/blog/static/1192409720150316223680/

user: user-9
content: C Primer Plus  C语言程序设计：现代方法：第2版(被誉为"近10年来最好的一部C语言著作") C和指针 或者谭浩强《C程序设计》 以上任选一本就差不多了，以下为参考书： 《深入理解C指针》 《C语言点滴》 《C陷阱与缺陷》 《C专家编程》

user: user-10
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

user: user-11
content: 当当网计算机类搜索排名，《C语言从入门到精通》， 《C Primer Puls》。。。

user: user-12
content: 个人建议多做一些习题，学习一些算法。 网上有一些编程练习网站（比赛之类）的。可以试试写写，如果遇到困难，写不出来。说明基础学习的还欠扎实，建议回归课本复习，这样学习起来获取更快些。不会写的，也建议从网上搜一搜，然后看看别人写的，自己试着改改，调试一下。

user: user-13
content: http://bbs.csdn.net/topics/390966354/
user-0 提问: C语言实训，要每一行注释，

回复:
user: user-1
content: 0.0慢慢看吧

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

user: user-3
content: 每一行加注释，没必要。如果真需要每行都加注释，那么不如翻开书本好好复习一下语法知识。  建议多运行几次（真是语法知识不牢固，建议翻课本复习一下），加一些调试打印了解程序的运行流程。

user: user-4
content: 将学生信息保存在类似的结构体数组中 struct  student {     int number;    char name[NAME_MAX];    int  score[M]; }student_array[N];  将学号作为索引， 通过学号可以查询输出学生的基本信息和各科成绩。

user: user-5
content: 有什么问题吗
user-0 提问: floating point exception 报错 gcc 编译通过

回复:
user: user-0
content: 引用 1 楼 steedhorse 的回复:问题可能不止一个。 但首先i应该从1开始。从0开始的话，第一步“a % i”就有问题。   厉害厉害    ，作为初学者，我走入误区了，只是在纠结程序本身，而没有去验证公式，多谢大神

user: user-1
content: 问题可能不止一个。 但首先i应该从1开始。从0开始的话，第一步“a % i”就有问题。
user-0 提问: 大神帮讲解一下上面代码可以吗？

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

user: user-2
content: 这里也有一个 http://blog.csdn.net/phunxm/article/details/5082744

user: user-2
content: 这是一个很基础的Win32 API窗口程序，《Windows程序设计 第5版》中有详细介绍，网上也有详细注解版 https://www.cnblogs.com/huhu0013/archive/2010/09/26/1836008.html 关于如何修改菜单，看看这句 wcex.lpszMenuName   = MAKEINTRESOURCEW(IDC_WIN20180202); 你看看.rc文件的相关内容即可 IDC_WIN20180202是菜单的标识

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

user: user-0
content: 我现就是在了解它
user-0 提问: 牛顿迭代法求多元方程近似根

回复:
user: user-1
content: 引用 4 楼 <span style="color:#4788C7">JL_Xie</span>的回复:应该会有四个解吧<br />三个，说错了

user: user-1
content: 应该会有四个解吧

user: user-2
content: 百度搜相关关键字。
user-0 提问: 关于一个特别简单的链表。。。

回复:
user: user-1
content: //#include "stdafx.h" #include <stdio.h> #include <stdlib.h>  typedef struct list {     int num;     struct list *next; }ty;  //链表的初始化 ty *creat_list() {     int u;     ty *i, *o, *p;     p = (ty *)malloc(sizeof(ty));     i = p;     printf("输入链表的值，输入-1以退出：");     scanf_s("%d", &u);     while (u != -1)     {         o = (ty *)malloc(sizeof(ty));         o->num = u;         i->next = o;         i = o;         scanf_s("%d", &u);     }     i->next = NULL;      return p; } //链表的打印 void print_list(ty *head) {     ty *p;     p = head->next;     if (!p)         return;     printf("head");     do {         printf("-->%d", p->num);         p = p->next; \     } while (p);     printf("-->end"); } //向链表插入数值 void add_list(ty *head, int key, int pos) {     ty *u, *p, *q,*s;      u = (ty *)malloc(sizeof(ty));//为u申请空间     u->num = key;      q = head;     p = head->next;      //s = (ty *)malloc(sizeof(ty));      while (p && p->num != pos) {         q = p;         p = p->next;     }      if (!p) {         q->next = u;         u->next = NULL;     } else if (p->num == pos) {         u->next = p;         q->next = u;     } } int main() {     ty *head;     int key, pos;     head = creat_list();     print_list(head);     printf("输入你想插入的值和位置");     scanf_s("%d %d", &key, &pos);     add_list(head, key, pos);     print_list(head);     return 0; } 参考一下吧  问题是出现了段错误，原因是：若要插入到链表末尾，那么p为NULL，那么p->num == o就会出现段错误，因为NULL->num导致段错误； 另外，程序有两处判断条件需要调换一下，否则会导致段错误； 比如其一： while ((p->num != o) && (p != '\0')) { 此处若p为NULL了，那么先判断p->num != o岂不是会导致段错误。上面的代码我已做了修改；  另外，建议注意下命名规则，一个函数里o命名位结构体指针，又在另一个函数里作为int类型。这样大大减少了代码的可读性，引起歧义性。 另外，next不是'\0'，而是NULL。'\0'是字符串结束符，虽然没问题，因为'\0'是数值0，数值0类型转换之后位(void *)0为NULL。不过这样赋值p->next = '\0'还会有误导性。 建议以后编程时注意。虽然是一个简单的链表编程，但是不是“特别”简单。如果特别简单，不会出现这样的问题哦。加油吧～～～

user: user-2
content: else if (p == '\0') { p->next = u; u->next = NULL; } 这里在对p这个空指针操作，应改为q->next=u;  while ((p->num != o) && (p != '\0'))   这个改成 while ((p != 'NULL)&&(p->num != o) )

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

user: user-0
content: 请大家忽略那个s指针。。。而且其他没问题的地方我没写注释。。。
user-0 提问: 求思路，怎样运费最少的问题

回复:
user: user-0
content: 结合业务加了一些分组等优化逻辑，终于OK了。 核心还是递归全组合，谢谢大家了！

user: user-0
content: 递归，在全组合里找最优解，代码是实现了，数据量稍微大一点结果都出不来。。。哭晕了

user: user-0
content: 递归，回溯，全遍历求最优解吗， 可能确实是没有什么好方法， 感觉没有什么规律性在里面来走捷径啊， 实际不像举例数据量这么少。。。

user: user-1
content: 仅供参考：//qplw.cpp #include <stdio.h> #include <string.h> #include <stdlib.h> int v=0; int w=0; int m;//记录字符串长度 int n;//记录字符串中的字符种类数 char map[256];//记录是哪几种字符 int count[256];//记录每种字符有多少个 int stack[1000];//递归用的栈，并记录当前生成的排列 void Make_Map(char *str) {//统计字符串的相关信息     int s[256];     int i;     memset(s,0,sizeof(s));     memset(count,0,sizeof(count));     m=strlen(str);     if (w<1 || m<w) w=m;     while(*str) {         s[*str]++;         str++;     }     n=0;     for (i=0;i<256;i++)         if (s[i]) {             map[n]=i;             count[n]=s[i];             n++;         } } void Find(int depth) {//递归式回溯法生成全排列     if (depth==w) {         int i;         for (i=0;i<depth;i++) putchar(map[stack[i]]);         putchar('\n');     } else {         int i;         if (v && depth>0) {             for (i=0;i<depth;i++) putchar(map[stack[i]]);             putchar('\n');         }         for (i=0;i<n;i++)             if (count[i]) {                 stack[depth]=i;                 count[i]--;                 Find(depth+1);                 count[i]++;             }     } } void main(int argc,char**argv) {     if (argc<2) {         printf("%s 要产生全排列的字符串 [限定长度|-1]\n",argv[0]);         return;     }     if (argc>=3) w=atoi(argv[2]);     if (-1==w) v=1;     Make_Map(argv[1]);     Find(0); } //C:\test>qplw //qplw 要产生全排列的字符串 [限定长度|-1] // //C:\test>qplw 123 //123 //132 //213 //231 //312 //321 // //C:\test>qplw 123 2 //12 //13 //21 //23 //31 //32 // //C:\test>qplw 122333 3 //122 //123 //132 //133 //212 //213 //221 //223 //231 //232 //233 //312 //313 //321 //322 //323 //331 //332 //333 // //C:\test>qplw 123 -1 //1 //12 //123 //13 //132 //2 //21 //213 //23 //231 //3 //31 //312 //32 //321 //

user: user-2
content: 你的思路都出来了，那么接下来就是 if else 了。

user: user-0
content: 解释一下，A,B,C,D是4批货物送往4个地点，单独配送的费用是     A ：  500      B ：  400      C ：  300      D ：  200  通过价格表计算可以知道下面几种合并运送的方式比单独送费用低，   A+B+C ：  1101  （比单独各自运输节省99）   A+B ：       840    （比单独各自运输节省60）   B+C ：       620    （比单独各自运输节省80）   C+D ：       460    （比单独各自运输节省40）  ×××这里上面写的360，算错了×××  单独看，A+B+C节省最多，如果作为最优方案保留的话，结果就是A+B+C和D单独，费用1101+200 = 1301 但是整体看，如果采用A+B和C+D费用是840+460= 1300，其实是最优的，   平时很少接触算法，这个问题的模型考虑不清楚，最短路？背包？线性规划？  真心有点懵，还请给个思路

user: user-3
content: 这种数据量少的，无非就是遍历所有可能情况，选取最优结果

user: user-4
content: 可以像赵老师中的C:\test>qplw 123 -1，把8种费用所有组合都检查一遍，再选个最小的。
user-0 提问: 求助 这个step怎么减少的

回复:
user: user-1
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出

user: user-2
content: 引用 2 楼 jacob_KK 的回复:引用 1 楼 jianwen0529 的回复:if (step == n + 1){ return; } 这个是递归的结束条件，step不是递减，而是递增dfs(step + 1);不是呀 你看他第一次将step加到n+1后 去输出数据 然后return回来 step不是还是n+1吗 但是运行又变小了 这是怎么回事呢 这是递归，step是参数，而且每次调用它们不是同一个值。最内层的调用是最大的，然后一层层退出，step依然还是step

user: user-0
content: 引用 1 楼 jianwen0529 的回复:if (step == n + 1){ return; } 这个是递归的结束条件，step不是递减，而是递增dfs(step + 1);不是呀 你看他第一次将step加到n+1后 去输出数据 然后return回来 step不是还是n+1吗 但是运行又变小了 这是怎么回事呢

user: user-2
content: if (step == n + 1){ return; } 这个是递归的结束条件，step不是递减，而是递增dfs(step + 1);
user-0 提问: 在VC6.0中可以AC但是在VS2015就会死循环（程序简单）

回复:
user: user-1
content: #include<stdio.h> #include<string.h> int main() {     char a[100];     int i, j, k, n, l;     while (scanf_s("%d", &n))     {         for (i = 0; i < n; i++)         {             scanf_s("%s", a, sizeof(a));             l = strlen(a);             k = 0;              for (j = 0; j < l; j++)             {                 if (a[j] != a[l - j - 1])                     k++;             }             if (k == 0)                 printf("yes\n");             else                 printf("no\n");         }      }     return 0; } 参考一下吧； scanf_s("%d", &n)的返回值若正常读取，返回1，读取失败返回0；所以，这场读取时，不会进入while循环，若非正常读取时，进入while循环，此时n还是随机值，不是死循环，而是n是一个很大的随机数，所以会出现看似死循环的操作;  另外，scanf_s("%s", a);缺少参数，需要第三个参数：scanf_s("%s", a, sizeof(a));

user: user-2
content: Enter、Ctrl+Z、Enter退出while循环。
user-0 提问: 为什么在循环内，内存映射文件的过程，只执行一次就结束了？怎样解决

回复:
user: user-1
content: 可能是被编译器优化掉了。

user: user-2
content: 你怎么判断只执行了一次，建议单步跟踪程序运行，观察程序执行流程，分析原因

user: user-3
content: 异常退出也是一种崩溃。

user: user-0
content: 感觉就是运行一次，就直接跳出循环了

user: user-0
content: 没有崩溃，直接程序运行结束，电脑也没有任何提示

user: user-3
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: 杭电2034题 提交的时候出现的Runtime Error (ACCESS_VIOLATION)  各位大佬给小弟看看，谢谢。。

回复:
user: user-1
content: 在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

user: user-2
content: int i,j,min,a[100],b[100],c[100],count=0; 数组开大些，a,b,c都改成a[110],b[110],c[110]试下

user: user-0
content: #include <stdio.h> int main() {     int m,n;     while(scanf("%d%d",&n,&m)!=EOF)     {         if(n>0&&n<=100&&m>0&&m<=100)         {             int i,j,min,a[100],b[100],c[100],count=0;         for(i=0;i<n;i++)             scanf("%d",&a[i]);             for(i=0;i<m;i++)                 scanf("%d",&b[i]);         for(i=0;i<n;i++)             for(j=0;j<m;j++)             if(a[i]==b[j])               {count++;a[i]=2000;j=m;}               else                 continue;                 i=0;                 if(count==n)                     printf("NULL\n");                 else                   {                     for(i=0,j=0;i<n;i++)                         if(a[i]!=2000)                     {                         c[j]=a[i];                         j++;                     }                     for(i=0;i<n-count;i++)                         for(j=i+1;j<n-count;j++)                         if(c[i]>c[j])                         {                             min=c[j];                             c[j]=c[i];                             c[i]=min;                         }                         for(i=0;i<n-count;i++)                             if(i!=n-count-1)                             printf("%d ",c[i]);                         else                             if(i==n-count-1)                             printf("%d\n",c[i]);                 }         }        else         if(m==0&&n==0)         break;        else         continue; }     return 0;  } 这是改过的代码    ，帮忙看下这个就行，提交还是错误，尴尬癌都出来了！！！
user-0 提问: Linux TCP 连接问题

回复:
user: user-1
content: 服务端回复 ack 之后， 说明客户端到服务器的链接建立好了， 客户端回复 ack 之后， 说明服务器到客户端的链接建立好了，  你可以看什么时候变成ESTABLISHED状态了，就是什么时候建立好了

user: user-0
content: 引用 2 楼 zilaishuichina 的回复:tcp3次握手成功后 就是 ESTABLISHED状态， 这个链接已经建立好了，放在全连接队列里了（lz可以去搜TCP 半连接队列和全连接队列，了解一下），  accept只是从这个队列里将建立好的链接取出来而已。   所以即使你上层逻辑在recv那阻塞了， TCP底层该接受链接还是接受链接，直到这个队列满了为止。  客户端向服务器发送一个SYN，服务器接收到后，这时候是不是说明了服务器到客户端的连接已经建立好了？ 客户端想服务器发送一个ACK，服务器接收到后，是否说明客户端到服务器的连接已经建立好了？

user: user-0
content: 引用 2 楼 zilaishuichina 的回复:tcp3次握手成功后 就是 ESTABLISHED状态， 这个链接已经建立好了，放在全连接队列里了（lz可以去搜TCP 半连接队列和全连接队列，了解一下），  accept只是从这个队列里将建立好的链接取出来而已。   所以即使你上层逻辑在recv那阻塞了， TCP底层该接受链接还是接受链接，直到这个队列满了为止。 谢谢！

user: user-1
content: tcp3次握手成功后 就是 ESTABLISHED状态， 这个链接已经建立好了，放在全连接队列里了（lz可以去搜TCP 半连接队列和全连接队列，了解一下），  accept只是从这个队列里将建立好的链接取出来而已。   所以即使你上层逻辑在recv那阻塞了， TCP底层该接受链接还是接受链接，直到这个队列满了为止。

user: user-2
content: 百度搜相关关键字。
user-0 提问: 动态分配数组之后，不能输出任何变量

回复:
user: user-1
content: 引用 4 楼 u013129143 的回复:[quote=引用 1 楼 sdghchj 的回复:] 数组的下标是0到n-1，而不是1到n  我的意思是无论将那个 输出的参数 改成什么变量都会崩溃程序。    而将参数改成常数的话能输出[/quote] 数组的下是0到n-1，循环终止条件是 <=n，那么f[n]已经越界。

user: user-2
content: 引用 5 楼 u013129143 的回复:引用 2 楼 user-4 的回复:测试过了 不报错 不知道你那边报什么错误 我用的是vs2012编译器不是语法问题，是程序执行的时候崩溃了   f[n] 已经越界了，越界操作是未定义行为，未定义行为表示可能崩溃，也可能不崩溃，就算不崩溃也说明不了什么问题

user: user-3
content: #include <stdio.h> #include <stdlib.h>  #define max 1000001 #define mod 10007  int main(int argc, char *argv[]) {     int i,n;     int *f;     scanf("%d",&n);     if (n < 2)         return 0;      f = (int *)malloc(sizeof(int)*n);     if (!f)         exit(0);     f[0] = 1;     f[1] = 1;     for(i = 2; i < n; i++)         f[i] = (f[i-1] + f[i-2]) % mod;     printf("%d\n",f[n-1]);     free(f);     return 0; } 参考一下吧  注意越界，若n输入的是1，则会导致越界； 另外，输入n是，下标应该是从0开始，并且是[0, n-1]

user: user-0
content: 引用 2 楼 user-4 的回复:测试过了 不报错 不知道你那边报什么错误 我用的是vs2012编译器 不是语法问题，是程序执行的时候崩溃了

user: user-0
content: 引用 1 楼 sdghchj 的回复:数组的下标是0到n-1，而不是1到n  我的意思是无论将那个 输出的参数 改成什么变量都会崩溃程序。    而将参数改成常数的话能输出

user: user-0
content: 引用 2 楼 user-4 的回复:测试过了 不报错 不知道你那边报什么错误 我用的是vs2012编译器 DEV C++

user: user-4
content: 用vs运行部崩溃

user: user-4
content: 测试过了 不报错 不知道你那边报什么错误 我用的是vs2012编译器

user: user-1
content: 数组的下标是0到n-1，而不是1到n
user-0 提问: 同一个程序，多次输出结果不同，请大佬帮忙

回复:
user: user-1
content: 没读懂你的逻辑，但语法上应该是queue分配的空间不够，多分配一些就可以保证语法没问题了，但不保证逻辑没问题

user: user-2
content: 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

user: user-3
content: 代码可读性很差，逻辑不明确。 建议将需求贴出来，以便对照需求看代码或许能看出问题所在。

user: user-4
content: 单步跟踪程序运行，观察变量变化情况，分析原因
user-0 提问: 求解 offsetof 宏

回复:
user: user-1
content: 我觉得应该跟编译器有关： typedef struct{     int b;     int c; }tmp;  int main(int argc, char *argv[]) {     int *a1 = (int*)0;     tmp *a2 = (tmp*)0; //    printf("%d\n",*a1);  //  报错     printf("%d\n",&(*a1)); //正常运行  输出0 //    printf("%d\n",a2->c); // 报错     printf("%d\n",&(a2->c)); //正常运行 输出4     return 0; } 感觉可以理解为执行&(a2->c)时并未去访问c的内容，而是编译器直接将取地址和按地址访问优化了直接得到 c的地址，也就是相对于0的偏移量

user: user-2
content: 是在编译阶段确定的，因为每个member的偏移量在编译期间就确定了，没崩溃是因为这样只是根据member的名字计算出它对于结构体起始地址的偏移量，并没有读写这块儿内存

user: user-3
content: 肯定编译期就可以得出，知道结构体起始位置，编译器肯定能知道对应成员的地址，而这个起始地址是0，得到的相当于是对于头的一个偏移量

user: user-4
content: 是在編譯時就展開了

user: user-3
content: 访问说的是要解引，这里只是获得这个成员的地址的值，并没有去访问这个成员
user-0 提问: 数据结构单链表，关于指针、引用的使用

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

user: user-2
content: 引用 3 楼 u012536120 的回复:[quote=引用 2 楼 cfjtaishan 的回复:] &引用用法是C++的用法，C语言编译器不识别该用法，因此建议形参用二重指针； 我试了下，编译能通过了。 那main里的&L，是指对L取地址，不是对L的引用？[/quote] 对，main函数里的&是取地址，而不是引用。

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:&引用用法是C++的用法，C语言编译器不识别该用法，因此建议形参用二重指针； 我试了下，编译能通过了。 那main里的&L，是指对L取地址，不是对L的引用？

user: user-2
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h>  #define OK 1 #define ERROW -1 #define OVERFLOW -2  #define LEN sizeof(struct Lnode) #define LN  LNode *  typedef int Status; typedef int ElemType;  typedef struct Lnode {     ElemType num;     struct Lnode *next; }LNode,*LinkList;  /*链表的初始构建函数*/ Status InitList(LinkList *L) {     *L = (LN)malloc(LEN);     if(*L == NULL)         exit(OVERFLOW);     (*L)->next = NULL;     return OK; }  int main() {     LinkList L = NULL;     InitList(&L);      return 0; } 参考一下吧  Status InitList(LinkList &L) &引用用法是C++的用法，C语言编译器不识别该用法，因此建议形参用二重指针；
user-0 提问: 想请教一下，输入法是英文没错，但还是编译不出来是为什么

回复:
user: user-1
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-2
content: 程序没问题，应该是环境配置问题。

user: user-3
content: 程序没有问题   1.一种情况是你工程没建队 2，另外一个就是vc编译器的问题，你先不管哪个错误，直接运行看结果能出来不 3.你换成vs环境把你代码放进去

user: user-4
content: cl.exe是VC使用真正的编译器（编译程序），其路径在“VC根目录/VC98/Bin”下面， 你可以到相应的路径下找到这个应用程序。   因此问题可以按照以下方法解决：打开vc界面 点击VC“TOOLS（工具）”—>“Option（选择）” —>“Directories（目录）”重新设置“Excutable Fils、Include Files、 Library Files、Source Files”的路径。很多情况可能就一个盘符的不同 （例如你的VC装在C，但是这些路径全部在D），改过来就OK了。  又：遇到问题应该先去网上搜一下。
user-0 提问: 简单数组问题

回复:
user: user-1
content: int *p[3] = a; 是错误的语法,应该是 int (*p)[3] = a;

user: user-2
content: https://zhidao.baidu.com/question/190369972.html 建议从网上搜关键字，可以找到很多这样的信息。

user: user-3
content: 压扁数组是针对多维数组说的：如二维数组 array[3][3] 1 2 3 4 5 6 7 8 9 要遍历这个数组一般用数组指针int *p[3] = array ;  *(*(p+i)+j)来表示二维数组里的元素，压扁数组是用一个一维指针q = &array[1][1] ,然后*(q++),这样来遍历二维数组，&array[1][1],虽然是一个二维数组元素地址，但说白了，也就是一个普通地址，普通地址个一个指针完全说的通。但这样就丢失了二维数组列宽的概念了，数据在内存里都是顺序存储的。这种现象成为压扁数组。
user-0 提问: 单链表的初始化函数为什么会影响单链表的删除函数

回复:
user: user-0
content: 引用 1 楼 hdt 的回复:传入一个函数的指针，在函数中改变了它的地址，函数结束后，这个指针还是原来的值！ 请问关于循环单链表的初始化(*head)->next = head;为什么是head而不是*head????

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

user: user-2
content: 用指针的指针（struct type **root）不就是为了记录链表的第一个节点么，当你要在链表第一个节点前插值的话不就要保存新的节点作为链表第一个元素，  不知道你说的运行不了是什么意思

user: user-3
content: void List_Initiate(SLNode **head)       //单链表的初始化 {      *head = malloc(sizeof(SLNode));   //申请头结点  (*head)->next = NULL;               //设置元素个数为0个 } 建议初始化函数改成二重指针，调用时注意在原来的实参基础上加上& 形参定义成二重指针的目的是能够获取初始化的头结点，否则不能获取头结点的malloc空间和对头结点的next初始化。

user: user-0
content: 引用 5 楼 hdt 的回复:[quote=引用 4 楼 qq_26602805 的回复:] [quote=引用 1 楼 hdt 的回复:] 传入一个函数的指针，在函数中改变了它的地址，函数结束后，这个指针还是原来的值！ 请问关于循环单链表的初始化(*head)->next = head;为什么是head而不是*head????[/quote] 你的代码有不少错误，我就不仔细讲了。 * 代表取的指针指向的值。[/quote] 恩恩，这个问题你一说大概明白问题了，还有个问题是：关于循环单链表的初始化(*head)->next = head;为什么是head（书上写的head）而不是*head????

user: user-4
content: 引用 4 楼 qq_26602805 的回复:[quote=引用 1 楼 hdt 的回复:] 传入一个函数的指针，在函数中改变了它的地址，函数结束后，这个指针还是原来的值！ 请问关于循环单链表的初始化(*head)->next = head;为什么是head而不是*head????[/quote] 你的代码有不少错误，我就不仔细讲了。 * 代表取的指针指向的值。

user: user-4
content: 传入一个函数的指针，在函数中改变了它的地址，函数结束后，这个指针还是原来的值！
user-0 提问: 一个简单的c程序，调试时候出现错误，求问是什么原因？

回复:
user: user-0
content: 好，懂了，谢谢上面两位大佬

user: user-1
content: #include <stdio.h> #include <string.h>        //提供strlen()函数的原型  #define DENSITY 62.4    //人的密度（单位是：英镑/每立方英尺）  int main() {     float weight, volume;    //重量，密度     int size, letters;     char name[40]; //name是一个有40个字符的数组      printf("Hi,what's your first name?\n");     scanf_s("%s", name, 40);     printf("%s,what's your weight in pounds?\n", name);     scanf_s("%f", &weight);     size = sizeof name;     letters = strlen(name);     volume = weight / DENSITY;     printf("well,%s,your volume is %2.2f cubic feet.\n", name, volume);     printf("Also,your first name has %d letters.\n", letters);     printf("and we have %d bytes to score it in\n", size);      getchar();      return 0; } 参考一下吧  注意name是字符数数组，%s输入时去掉name前的&，因为name是数组名，本身就是地址，因此不需要再加& 另外，scanf_s需要对于%s指定字符数组的长度

user: user-2
content: scanf_s输入字符串时还需要一个数组大小的参数    #include <stdio.h> #include <string.h>        //提供strlen()函数的原型 #define DENSITY 62.4    //人的密度（单位是：英镑/每立方英尺）  int main() { 	float weight, volume;    //重量，密度 	int size, letters; 	char name[40]; //name是一个有40个字符的数组  	printf("Hi,what's your first name?\n"); 	scanf_s("%s", name, 40); 	printf("%s,what's your weight in pounds?\n", name); 	scanf_s("%f", &weight); 	size = sizeof name; 	letters = strlen(name); 	volume = weight / DENSITY; 	printf("well,%s,your volume is %2.2f cubic feet.\n", name, volume); 	printf("Also,your first name has %d letters.\n", letters); 	printf("and we have %d bytes to score it in\n", size);  	getchar();  	return 0; }
user-0 提问: 求100以内的素数，且每5个为一行。 哪里错了，求指导。

回复:
user: user-0
content: #include<stdio.h> int i,j,n=0,a[101]; void main() { 	for(i=0;i<100;i++)		//将数组赋值 		a[i]=i+1; 	printf("输出素数:\n"); 	a[0]=0; 	for(i=1;i<100;i++) 	{ 		for(j=2;j<i;j++) 		{ 			if(a[i]%j==0) 				a[i]=0;		//将不是素数的变为零 		} 	} 	for(i=0;i<100;i++) 	{ 		if(a[i]!=0) 		{ 		printf("%d ",a[i]); 		n++;				//换行 		if(n%5==0) 			printf("\n"); 		} 	}  } 不好意思啊，前两天一直有事。我已经改好了，谢谢各位的帮忙。

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-1
content: “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？

user: user-2
content: #include<stdio.h>   int main() {     int i, j, n = 0,a[100];     for(i = 0; i < 100;i++)         a[i] = i + 1;      printf("输出素数:\n");     for(i = 0; i < 100;i++) {         if (a[i] == 1)             a[i] = 0;         for(j = 2;j<i;j++)         {             if(a[i] % j == 0)                 a[i] = 0;         }         if(a[i]!=0) {             printf("%2d ",a[i]);             n++; //换行             if(n%5==0)                 printf("\n");         }     }  } 参考一下吧，程序有多个逻辑错误。建议对比参考一下

user: user-2
content: 引用 3 楼 qq_41761210 的回复:啥边界条件？？？ 这个地方就是注意边界： for(i=1;i<=100;i++) //将数组赋值 a[i]=i; 应该改成：     for(i = 0; i < 100;i++) //将数组赋值         a[i] = i; 因为数组长度是100，下表应该从0开始，即[0, 99]，下表若为100，则属于越界访问

user: user-0
content: 啥边界条件？？？

user: user-3
content: printf("/n");   =====> printf("\n");      斜杠反了

user: user-1
content: 边界条件 输入输出格式 ……

user: user-0
content: 刚才在上课回复慢了
user-0 提问: 关于 数据结构 队 的结构体类型的问题

回复:
user: user-0

user: user-0

user: user-1
content: 1、节点类型是一样的啊，都是QNode，第二个只是一个结构体，装指向前和后的节点指针，具体没在你代码中看到有应用，当然链并不一定要求一写要是双链，你也可以只是一个单链，如第一个结构体，只有next指针  2、QNode是一个节点的指针，而LiQueue需要根据实际代码判断含义，也可能表示最前与最后的指针  3、如果没初始，这个值是一个随机值，只有上帝知道它指向哪。。

user: user-1
content: 2、data存的是该节点的数据信息  3、对整体没什么影响，只是影响各个节点存的数据的情况

user: user-1
content: 1、表示一个结点的，但这个节点除了记录自己的信息，还记录了前一个和后一个节点的地址

user: user-0
user-0 提问: 请问这段代码错在哪儿？

回复:
user: user-1
content: 引用 6 楼 flybird7070 的回复:不是的，写错了。  前面提问时，我写的 if(fangfa==atoi ((char  *)(strstr(buf, B)+6)))//这一句出错，编译通过，运行当掉 strstr(buf, B);这句若返回NULL没有去处理,atoi返回值肯定会导致程序异常退出。另外，buf是否给予分配空间？

user: user-0
content: 谢谢各位，问题解决了，是超出边界了。

user: user-2
content: strstr(buf, B)+6超出边界或者不是数字字符串

user: user-3
content: if(fangfa==atoi ((char  *)(strstr(buf, B)+6))) 改为 char* temp = strstr(buf, B)+6;这里加断点，调试 if( fangfa == atoi(tmp) ) {  // }

user: user-0
content: 不是的，写错了。  前面提问时，我写的 if(fangfa==atoi ((char  *)(strstr(buf, B)+6)))//这一句出错，编译通过，运行当掉

user: user-4
content: int fangfa=3; if (strcmp(B,B_文本)==0){//判断是否是相同字符串   if(atoi ((char  *)(strstr(buf, B)+6))==*fangfa)  int类型是这样子用的吗

user: user-3
content: 提醒一下 不要刻意的去隐藏中间变量

user: user-0
content: 我的目的是在文本文件中，读取一行  这行的内容是这样的：“================文本46”  一下代码我运行正常，结果也准确  int* weizhi_标记_文本; if (strcmp(B,B_文本)==0){//判断B中是否有字符串“==文本”   * weizhi_标记_文本=atoi ((char  *)(strstr(buf, B)+6))-1;//如果有“文本”字符串，就把“文本”后的数字存入* weizhi_标记_文本 }  然而，我想如果文本后的数字等于3，就把数字3存入* weizhi_标记_文本，修改如下：  int fangfa=3;  if (strcmp(B,B_文本)==0){//判断是否是相同字符串   if(atoi ((char  *)(strstr(buf, B)+6))==*fangfa){//这里出错，不能运行，请修正           * weizhi_标记_文本=atoi ((char  *)(strstr(buf, B)+6))-1;      } }

user: user-5
content: buf没有初始就使用，其次strstr查找不到返回的是NULL，此时传atoi也会导致崩溃

user: user-0
content: 前面是通过内存映射，得到lpbMapAddress  然后有const char* buf = lpbMapAddress;   省略了
user-0 提问: 怎么在头文件中定义一个在运行时确定的地址常量？

回复:
user: user-1
content: 定义成全局变量，初始化为一个地址值是可以的。怎么不可以呢？ 也可以定义一个函数，然后将地址值赋值给这个全局变量。运用该全局变量前就去调用一下该函数（建议定义成内敛函数inline）

user: user-2
content: xxx.h中写：  const char * GetAddr();   xxx.cpp中写  const char * GetAddr() {     return strcat((char*)getcwd(NULL,0),"/..."); }   需要用到addr的地方就include这个xxx.h，调用GetAddr()就可以了

user: user-3
content: 头文件声明，实现文件定义并且指向一个变量？
user-0 提问: C语言program received signal sigsegv是怎么回事

回复:
user: user-0
content: 引用 3 楼 user-1 的回复:scanf（%c）前要有getchar（）！ 已改  但还是不行

user: user-1
content: 仔细检查一下！应该没什么大问题！

user: user-1
content: scanf（%c）前要有getchar（）！

user: user-1
content: 最基础的错误:等于号是“＝＝”！

user: user-0