Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 如果一次只能读一个16位寄存器，如果读浮点数？

回复:
user: user-1
content: 函数ReadHoldingRegister是否能返回地址？或者通过其它方式取得。。。 你可以取得前16位的地址，然后再在地址上+1,就能得到后16位值，然后你再把两个值整理成一个值就行了
user-0 提问: 开源库代码的官网，如何保证文件的没有被篡改？

回复:
user: user-1
content: 楼上的这么牛B， 伪造个 Linus Torvalds 的 Key 给大家看看， 上面只有 100+ 个人签过名 .  给这个KEY签上不可导出的签名的人应该至少有几万吧。  从值得信任的渠道获得 他的 GPG KEY、指纹， 比如给项目 mail list 上的几个人发邮件要 ，并细验证指纹。 信任几个值得信任的 KEY， 按 GPG 的规则， 被你信任的几个 KEY 签过名的 KEY 会被信任。 如果你认识 某个人并能确认他的 KEY， 你应该给他签上可导出的签名， 并上传到 key server， 这样可以帮助别人验证。  重要的 KEY 总是有很多重要的人的签名， 不重要的也不会有啥人无聊的去伪造。

user: user-2
content: 木马面前，没有安全。

user: user-0
content: up up

user: user-2
content: 《黑客帝国》完全解析_知识库_博客园 《黑客帝国》里的锡安是不是虚拟世界_知识库_博客园
user-0 提问: 请问C语言的结构体像这样初始化可以吗?

回复:
user: user-1
content: struct total a; memset((char *)&a,0,sizeof(a));

user: user-2
content: 要让结构体初始为0，可以用memset函数

user: user-3
content: 如果全零的话，可以 memset 。

user: user-4
content: #include <stdio.h> struct total { char name[20]; int money; char ch; }; int main() {     struct total a={0};      printf("%d\n",a.money);     return 0; }

user: user-5
content: 定义对象，为每个成员分别赋值。

user: user-0
content: 引用 3 楼 Kenier 的回复:定义对象，为每个成员分别赋值。   在定义结构的时候，不能初始化吗？

user: user-0
content: 引用 1 楼 fefe82 的回复:在 C 语言里，这是不可以的。 引用 1 楼 fefe82 的回复:在 C 语言里，这是不可以的。   那应该怎样初始化呢?

user: user-3
content: 在 C 语言里，这是不可以的。
user-0 提问: C语言编译遇到window.h问题

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

user: user-2
content: 是windows.h，不是window.h，另试下改变windows.h这个头文件包含顺序，放到所有包含文件的最前或者最后试一下

user: user-2
content: 引用 3 楼 ytpvip 的回复:[quote=引用 1 楼 paschen 的回复:] 是windows.h，不是window.h，另试下改变windows.h这个头文件包含顺序，放到所有包含文件的最前或者最后试一下    可是我头文件就没有#include “Windows.h”[/quote]  #include <Windows.h>

user: user-3
content: 还有winnt.h。我用13的，选中输入的词就可以转到定义，10的我不太熟悉。

user: user-3
content: 你打开编译器查看 driverspecs.h里面具体宏定义，根据行号找就可以了。

user: user-0
content: c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(142): error C2008: “$”: 宏定义中的意外 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(294): error C2008: “$”: 宏定义中的意外 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(295): warning C4005: “__”: 宏重定义 1>          c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(142) : 参见“__”的前一个定义 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(308): error C2008: “$”: 宏定义中的意外 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(309): warning C4005: “__”: 宏重定义 1>          c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(295) : 参见“__”的前一个定义 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(312): error C2008: “$”: 宏定义中的意外 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(313): warning C4005: “__”: 宏重定义 1>          c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(309) : 参见“__”的前一个定义 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(316): error C2008: “$”: 宏定义中的意外 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(317): warning C4005: “__”: 宏重定义 1>          c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(313) : 参见“__”的前一个定义 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(320): error C2008: “$”: 宏定义中的意外 1>c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(321): warning C4005: “__”: 宏重定义 1>          c:\program files\microsoft sdks\windows\v7.0a\include\driverspecs.h(317) : 参见“__”的前一个定义 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(1202): error C2018: 未知字符“0x24” 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(1202): error C2061: 语法错误: 标识符“drv_group” 1>c:\program files\microsoft sdks\windows\v7.0a\include\winnt.h(1202): error C2059: 语法错误:“;”     错误警告如上

user: user-0
content: 引用 1 楼 paschen 的回复:是windows.h，不是window.h，另试下改变windows.h这个头文件包含顺序，放到所有包含文件的最前或者最后试一下    可是我头文件就没有#include “Windows.h”
user-0 提问: 【C语言】VC6.0显示*****.exe已停止工作

回复:
user: user-1
content: char *str="ABCDEFG";     char *substr="CDE"; /*返回指针的函数*/  字符存储在常量区，不可以被修改

user: user-2
content: 指针不要这样初始化，因为常量存放在程序的一块常量区域，用字符串初始化指针会让指针指向常量区域，一修改就会导致内存错误，改用数组

user: user-3
content: char *str="ABCDEFG";  改成  char str[100]="ABCDEFG";
user-0 提问: 新人求助，C语言用malloc出现读取位置冲突，一直找不到原因，求大神，我把代码贴出来，二楼说一下题目

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

user: user-2
content: 这一中：pResult[i][0] = pResult[i - 1][0] + i;   在第一次循环的时候，i 是0 ，那么会访问到i-1项数组当然出错了

user: user-3
content: 引用 2 楼 xusongge 的回复:55555555，我自己居然会犯这么傻 的问题，单步调试发现原因是i=0的原因 哈哈，这种问题谁也免不了的，可以养成写0==i的习惯，这样会直接报错，不用再单步找原因了

user: user-0
content: 55555555，我自己居然会犯这么傻 的问题，单步调试发现原因是i=0的原因

user: user-0
content: 题目是输入一个数字，比如5，输出结果是 1 3 6 10 15 2 5 9 14 4 8 13 7 12 11 是华为在线软件测试平台上的一个题目，叫蛇形矩阵，我用malloc做，不用固定数组大小的方法，求大神解决问题
user-0 提问: 动态分配内存的指针释放的问题。不明白，能给解释下吗？

回复:
user: user-1
content: 了解一下操作系统的进程管理吧。

user: user-2
content: 主函数结束自动释放了，zu指向的地址就是申请的内存地址，所以也可以在主函数用完了zu就把zu释放掉

user: user-3
content: 确实没有释放！ 可以在主函数最后释放 不过这不是一个好的方式，你可以考虑用类封装或者使用智能指针 通常应该是谁分配内存，谁就负责释放
user-0 提问: C语言文件与二进制

回复:
user: user-1
content: 可以使用位移还有位运算来实现！  每次右移一个 然后 使用 位运算  得出1或者0   然后在右移一位  然后在算

user: user-2
content: 仅供参考：//有一个二进制文件，要求每隔50bits，删除后面的12bits。 #include <stdio.h> #include <stdlib.h> #include <string.h> FILE *fi,*fo; char buf[31]; char obf[31]; int bn,n; void filter() {//对buf中前n个字节中的位，每隔50bits，忽略12bits，结果放在obf中,且将bn设置为obf中的字节数。     char bit[249];     char obt[249];     char b8[33];     char b88[33];     int i,j;     char *e;      for (i=0;i<n;i++) {         _itoa(buf[i],b8,2);         sprintf(b88,"%032s",b8);         sprintf(bit+i*8,"%s",b88+24);     }      j=0;     for (i=0;i<n*8;i++) {         if (i%62<50) {             obt[j]=bit[i];             j++;         }     }     if (j%8) {         bn=(j/8+1)*8;     } else {         bn=j;     }     for (i=j;i<bn;i++) obt[i]='0';     obt[bn]=0;     bn=bn/8;     for (i=0;i<bn;i++) {         strncpy(b8,obt+i*8,8);b8[8]=0;         obf[i]=(char)strtol(b8,&e,2);     } } int main() {     fi=fopen("in.bin","rb");     if (NULL==fi) {         printf("Can not open file in.bin!\n");         return 1;     }     fo=fopen("out.bin","wb");     if (NULL==fo) {         fclose(fi);         printf("Can not open file out.bin!\n");         return 2;     }     while (1) {         n=fread(buf,1,31,fi);         if (0==n) break;         filter();         fwrite(obf,1,bn,fo);     }     fclose(fo);     fclose(fi);     return 0; }

user: user-3
content: 参考代码： #include <stdio.h> #include <stdlib.h>  int main(int argc, char *argv[]) {     FILE *fp;     unsigned char buf[1024];     unsigned char dst[sizeof buf * 8];     int readSize, index;      fp = fopen(argv[1], "rb"); // argv[1]存放文件名字     readSize = fread(buf, 1, 1024, fp);      for (int i = 0; i < readSize; ++i)     { 		for (int j = 0; j < 8; ++j)         {             index = i * 8 + j;             dst[index] = buf[i] >> (7 - j) & 1;             printf("B[%d]=%d\n", index, dst[index]);         }     }     return 0; }

user: user-0
content: 引用 3 楼 ddyyuan 的回复:借个帖问个问题,为什么我发帖子总是说文章内容不能含有特殊字符。！！！  那要看你有没有输入什么啦~

user: user-4
content: 思路：定义变量，赋初值0，写一个循环逐位判断，如果第i位是字符1，让一个临时变量为1，然后左移i位，然后让先前的那个变量与这个临时变量做 |= 运算

user: user-5
content: 借个帖问个问题,为什么我发帖子总是说文章内容不能含有特殊字符。！！！

user: user-6
content: 读文件就不说了，转化可用个笨方法方法，仅供参考  	char c = '0'; 	bool b0,b1,b2,b3,b4,b5,b6,b7; 	b0=c & 0x01; 	b1=c & 0x02; 	b2=c & 0x04; 	b3=c & 0x08; 	b4=c & 0x10; 	b5=c & 0x20; 	b6=c & 0x40; 	b7=c & 0x80;

user: user-0
content: 顶一个~大神们，求教啊！
user-0 提问: C语言vc6.0运行程序过程中提示***.EXE已停止工作

回复:
user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-2
content: 因为你字符串是在常量区，不能修改 如果要修改，就用字符数组在栈上分配   #include<stdio.h>       #define NUL '\0' /*'\0'不好打*/      char *match( char *str, char *substr);   int del_substr( char *str, char  *substr);     int main()   {   	char str[20]="ABCDEFG";     char *substr="CDE"; /*返回指针的函数*/      del_substr(str,substr);     puts(str); }    /*  **为了清楚，单独写一个子函数实现判断两个字符串匹配  */   char *match(char *str,char *substr)   {       while(*substr!=NUL) if(*str++!=*substr++)               return NUL; return str; }      /*  **删除子串函数  */   int del_substr(char *str,char *substr )   {   char *next;         /*      **保证被操作字符串不为空      **      */      while(*str!= NUL)     {           next=match(str,substr);           if(next!= NULL)             break;           str++;       }       /*      **到达源字符串文件尾的时候，说明没有子串      */       if(*str==NUL)           return 0;        /*      **被删除子串之后的字符复制操作      */       while(*str++=*next++);/*字符串拷贝*/     return 1;   }

user: user-3
content: *str指向的是内存中的ro区（只读）不能改变上面的东西的，不过你可以把str指向别的地方

user: user-4
content: C没有为字符串定义专门的变量类型，而是把它储存在char数组中。

user: user-5
content: str[]之所以可以是因为，程序在被编译时分配了内存区给str的，而且str不是常量类型，其内部值固然可以改变。 但是char *str="CDE"中的字符串被编译后是存放在静态常量区的，然后首地址返回给str，其内容是不可以改变的，只能读不能写。
user-0 提问: 编写一个返回数组的函数，帮忙看看哪出错了！

回复:
user: user-0
content: 我没主函数，晕！

user: user-1
content: 这样？  #include<stdio.h> #include<stdlib.h> #define STRLEN 10 int* qudu_shuzu(void) {     int *pzu=NULL; 	int count=0,shu=0,str_len=STRLEN; 	int *P=NULL;      pzu=(int*)malloc(10*sizeof(int)+1);     if(!pzu)     {         printf("fen pei nei cun shibai!\n");         exit(1);     }          printf("qing shu ru yi xi lie zheng shu(hui che jieshu):\n");     fflush(stdin);     while(scanf("%d",&shu))       {           ++count;           if(count==str_len)           {               str_len+=STRLEN;                              pzu=(int*)realloc(pzu,str_len*sizeof(int)+1);               if(!pzu)               {                   printf("dong tai fen pei shibai!");                   exit(1);               }           }           *(pzu+count)=shu;       }     *pzu=count;     *(pzu+count+1)='\0';      return pzu;  }
user-0 提问: 关于字符串的一个题目

回复:
user: user-0
content: 引用 4楼LLW059 的回复:while（s[i-1]==‘’&&i-->0）； while循环先判断字符串结束标记前的字符是否为空格且i>0是否满足，都满足则i=i-1，接着循环判断前一个字符是否为空格等等；直到字符不为空格或者i = 0为止。接着将第一个空格改成字符串结束标记，即将尾部空格去掉。注意while没有循环体，结束循环才执行下一步s[i]=‘\0’；明了，谢谢

user: user-1
content: while（s[i-1]==‘’&&i-->0）； while循环先判断字符串结束标记前的字符是否为空格且i>0是否满足，都满足则i=i-1，接着循环判断前一个字符是否为空格等等；直到字符不为空格或者i = 0为止。接着将第一个空格改成字符串结束标记，即将尾部空格去掉。注意while没有循环体，结束循环才执行下一步s[i]=‘\0’；

user: user-2
content: 这样写：   void str1(char s[])  { 	int i = strlen(s); 	auto a = s[i]; 	while(s[--i] == ' '); 	s[i+1] = '\0'; }

user: user-3
content: i--是先判断i>0然后再减1，你调试一下就好了

user: user-4
content: while（）｛｝的含义是，当字符串数组S 的第i-1个字符为空格时，都在第i个字符位置插入终止符，直到i-1非空为止。
user-0 提问: for循环

回复:
user: user-1
content: 因为先判断在i自增，到最后1=9的时候，做循环体，做完上来i++变成10了 然后在判断条件是否成立！

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

user: user-3
content: 1,2,3,4,5,6,7,8,9 然后10不满足条件 <10 ，不会printf

user: user-4
content: 判断循环条件十次，执行循环体九次

user: user-5
content: 你的问题太模糊了，最好把代码附上。
user-0 提问: #define的问题

回复:
user: user-0
content: 我用的是xilinx sdk，只是想知道 #define 后面加那么多东西是什么意思。

user: user-0
content: 谢谢！ 略懂！

user: user-1
content: 首先要了解#define定义 #define A B A 表示即将调用的，B 是对A 的执行。 A的形式 可以是 A， 也可以是A(x), 当然也可以是A（x，y）。 B的形式 可以是 B，也可以是一条赋值或运算语句，也可以是函数调用，甚至可以是一段语句（函数+运算+赋值+判断都可以）  然后再来你的问题。 分割一条结构复杂的语句，以便清晰理解。 XAxiDma_IntrEnable(InstancePtr, Mask, Direction)  就是A（x，y，z）的形式。剩下的一堆就是B 我们看B内，有\符号，表示换行，连接，没有其他意思。 XAxiDma_WriteReg（）是一个函数，再跟据，符号就知道他有4个参数（用abcd表示）。 那么你问题就是： #define A（x，y，z）    B（a, b, c, d） 现在能看懂吧。

user: user-2
content: VC编译选项加/EP /P（项目、属性、配置属性、C/C++、预处理器、预处理到文件：是，预处理取消显示行号：是），重新编译，查看宏展开后对应的.i文件。gcc加-E http://bbs.csdn.net/topics/391003898

user: user-3
content: VS下可以这样查看宏展开后的代码：http://blog.csdn.net/qyee16/article/details/9322281

user: user-4
content: 与下面的大概等价:  #define  XAxiDma_IntrEnable(InstancePtr, Mask, Direction)  XAxiDma_WriteReg((InstancePtr)->RegBase + (XAXIDMA_RX_OFFSET * Direction), XAXIDMA_CR_OFFSET, (XAxiDma_ReadReg((InstancePtr)->RegBase + (XAXIDMA_RX_OFFSET * Direction), XAXIDMA_CR_OFFSET)) | (Mask & XAXIDMA_IRQ_ALL_MASK))
user-0 提问: 用c语言实现10个字符的插入排序

回复:
user: user-1
content: 引用 2 楼 cyfcsd 的回复: void insert_sort(int A[],const size_t n) { 	size_t i,j,min; 	int temp; 	for(i=0;i<n-1;i++){ 		min=i; 		for(j=i+1;j<n;j++){ 		if(A[min]>A[j]) min = j; 		} 		temp = A[i]; 		A[i] = A[min]; 		A[min] = temp; 	} }  抱歉，写成选择了，版主正解

user: user-1
content: void insert_sort(int A[],const size_t n) { 	size_t i,j,min; 	int temp; 	for(i=0;i<n-1;i++){ 		min=i; 		for(j=i+1;j<n;j++){ 		if(A[min]>A[j]) min = j; 		} 		temp = A[i]; 		A[i] = A[min]; 		A[min] = temp; 	} }

user: user-2
content: #include <stdio.h>   #include <stdlib.h>      void insertSort(char *, int);      int main()   {       int i;       char ch[10];      	printf("输入10个字符：\n");     for(i = 0; i < 10; i ++)       {           scanf("%c",ch + i);       }          //快速排序       insertSort(ch, 10);          //打印输出       for(i = 0; i < 10; i ++)       {           printf("%c ",ch[i]);       }       printf("\n");        return 0;   }      void insertSort(char *array, int len)   {       int i, j, temp;          for(i = 1; i < len; i ++)       {           temp = array[i];           for(j = i - 1; j >= 0; j --)           {               if(array[j] > temp)               {                   array[j + 1] = array[j];                   }else               {                   break;               }           }           array[j + 1] = temp;       }   }
user-0 提问: 下面几道题包括了各种算法思想，懂算法的大神请来指导一二

回复:
user: user-1
content: 1) 三四相同,五六相同, 就二重循环了, 判断是不是完全平方数, 0不知道算不算了, 完全平方数好像%3不会等于2, 最多1到100枚举了 2) 优先队列, 取小 3) 直接dfs就可, 我以前应该回过代码, 你找找看吧 4) 类似约瑟夫环, 用数组做个简单的循环链表 5) 跟3差不多思想 6) 7.11 扩大100倍是711, 分解成因数为3*3*79,显然不可能是整数解, 那么就肯定是浮点误差造成的假象了,反正就四个数, 商店最小单位就是0.01, 三重循环枚举一下,为了避免过多重复 假设a<=b<=c, d=7.11-a-b-c, d>=c, 答案就一组

user: user-2
content: 1.枚举 4.感觉和约瑟夫环挺像的……

user: user-3
content: 2.ti排序,小的先服务. 3.带羊过河，第二次带狼（菜)过河，同时把羊运到对岸，第三次运菜（狼)过河，第四次运羊过河。
user-0 提问: 入栈中的 *S.top=e;究竟错在了什么地方？？

回复:
user: user-1
content: 因为在传递给函数参数时使用结构体变量传递，而这样的话malloc等操作对原来结构体变量没有作用。传递函数参数应该使用结构体指针，将结构体变量的地址传递给函数，这样在函数里就可以修改原来的结构体变量。举个例子如下： #include <stdio.h> void interchange(int x, int y);  int main(void) { 	int x=5, y=10; 	printf("Originally x = %d and y = %d.\n", x, y); 	interchange(x, y); 	printf("Now x = %d and y = %d.\n", x, y); 	return 0; }  void interchange(int u, int v) { 	int temp; 	temp = u; 	u = v; 	v = temp; }  interchange（）使用的变量独立于函数main（），交换u和v的数值对x和y的数值没有任何影响。

user: user-2
content: chushihua(SqStack S)没加引用导致的 所有函数都变成这样的就可以了chushihua(SqStack &S）
user-0 提问: c结构体申明问题

回复:
user: user-1
content: 应该是LinkListNode *header; sizeof(TLinkList)为8因为4字节存放指针指向地址，4字节存放整型数值。

user: user-2
content: 引用 3 楼 merry_zsp 的回复:typedef struct _tag_LinkList { LinkListNode header; int length; }TLinkList; printf("%d\n%d\n",sizeof(TLinkList),sizeof(int) );  我发现sizeof(TLinkList)为8    sizeof(int) 为 4 那就是默认为结构体分配的大小是4咯？这是默认情况下为LinkListNode结构体分配的最小内存吗（因为定义只有一个指向本类型的指针  并没有指明大小）？ 还有一个问题就是  为什么指向下一个结点类型的指针是LinkListNode类型的而不是TLinkList类型的？这样有什么好处？ 新手不懂的比较多....  sizeof(TLinkList)为8 因为里面两个成员，header4字节，length4字节，  TLinkList你可以理解成是_tag_LinkList结体体别名，他是结体体类型，不是指针

user: user-0
content: typedef struct _tag_LinkList { LinkListNode header; int length; }TLinkList; printf("%d\n%d\n",sizeof(TLinkList),sizeof(int) );  我发现sizeof(TLinkList)为8    sizeof(int) 为 4 那就是默认为结构体分配的大小是4咯？这是默认情况下为LinkListNode结构体分配的最小内存吗（因为定义只有一个指向本类型的指针  并没有指明大小）？ 还有一个问题就是  为什么指向下一个结点类型的指针是LinkListNode类型的而不是TLinkList类型的？这样有什么好处？ 新手不懂的比较多....

user: user-3
content: LinkListNode是_tag_LinkListNode的一个别名，他们俩是一个意思 _tag_LinkListNode是一个结构体类型，注意这是个类型而不是变量，所以是不需要分配内存的，只有在_tag_LinkListNode a（或 LinkListNode a)时才会为变量a分配内存 后面一段是把起别名和定义放在一起了，可以分开理解：首先是定义一个结构体类型_tag_LinkList，然后给其起一个别名TLinkList，还是上面说的，这两个都是类型名，不涉及分配内存 header是上面定义的_tag_LinkListNode类型的变量，也就说header是一个结构体变量，它不是指针，而是结构体里有一个指针，可以理解为header内包含一个指针，结构体类型本身就是一个复合类型，只是这个只含一个指针罢了。这个指针指向的是_tag_LinkListNode的结构体

user: user-4
content: header不是指针，只是一个LinkListNode结构体，LinkListNode是_tag_LinkListNode的别名，所以第一个结构体声明里面成员是一个指向该结构体的指针，这就是链表的基本思想。
user-0 提问: 函数实现对10个排好序的元素进行折半法查找

回复:
user: user-1
content: 你一定要从大到小找，就用这个。   #include<stdio.h> void print_s(int *p,int n); int sort(int a[],int n) {     int i,j;     for(i=1;i<n;i++)     {         for(j=0;j<n-i;j++)         {             if(a[j]<a[j+1])             {                 int temp=a[j];                 a[j]=a[j+1];                 a[j+1]=temp;             }         }     }     }  /*折半查找***************************/ int  find(int a[], int n, int x) { 	int low,high,mid; 	low = 0; 	high = n-1; 	while (low <= high) 	{ 		mid = (low+high)/2; 			 		if (a[mid]>x) 			low = mid+1; 		else if(a[mid]<x) 			high = mid-1; 		else 		return mid; 		 	} 	return -1;     /*****************************/ }  int main() { 	int ret;     int a[10]={11,12,13,14,15,16,17,18,19,20};     print_s(a,10); 	sort(a,10); 	print_s(a,10); 	ret = find(a,10,17); 	if (ret==-1) 		printf("没找到\n"); 	else 		printf("下标是：%d\n",ret); //    int i; //    for(i=0;i<10;i++) //    { //        printf("%d\n",a[i]); //    }     return 0; }  void print_s(int *p,int n) { 	int i; 	for (i = 0;i<n;i++) 	{ 		printf("%d ",*(p+i)); 	} 	printf("\n"); }

user: user-1
content: 折半查找本来就是要在一个排序好的序列里找。为什么你要改成从大到小排序。初学的话，从小到大更好理解些。

user: user-1
content: 你要在你的子函数里，排序后，再加一个循环，就是把你看的书上的代码加进去。 你的排序是实现的从大到小的排序，要改成从小到大的排序。 下面星号之间的，就是书上的代码。子函数参数要加一个要查找的关键字，要有返回下标的值。  #include<stdio.h> void print_s(int *p,int n); int sort(int a[],int n,int key) {     int i,j;     for(i=1;i<n;i++)     {         for(j=0;j<n-i;j++)         {             if(a[j]>a[j+1])             {                 int temp=a[j];                 a[j]=a[j+1];                 a[j+1]=temp;             }         }     }      print_s(a,10);      	/*折半查找***************************/      	int low,high,mid; 	low = 0; 	high = n-1; 	while (low <= high) 	{ 		mid = (low+high)/2; 			 		if (a[mid]<key) 			low = mid+1; 		else if(a[mid]>key) 			high = mid-1; 		else 		return mid; 		 	} 	return -1;     /*****************************/      } int main() { 	int ret;     int a[10]={11,12,13,14,15,16,17,18,19,20};     print_s(a,10); 	ret = sort(a,10,17); 	if (ret==-1) 		printf("没找到\n"); 	else 		printf("下标是：%d\n",ret); //    int i; //    for(i=0;i<10;i++) //    { //        printf("%d\n",a[i]); //    }     return 0; }  void print_s(int *p,int n) { 	int i; 	for (i = 0;i<n;i++) 	{ 		printf("%d ",*(p+i)); 	} 	printf("\n"); }

user: user-2
content: 折半查找可参考 VC\crt\src\bsearch.c
user-0 提问: 请教高手一个C语言运算(可能是数据类型)的问题

回复:
user: user-1
content: 引用 14 楼 chehw_1 的回复:检查一下sizeof(long)是否是4个字节。  在不同的操作系统和CPU架构下，long的长度是不同的 引用sizeof(long) =    OS           arch                            size Windows       IA-32                            4 bytes Windows       Intel® 64 or IA-64        4 bytes Linux              IA-32                           4 bytes Linux              Intel® 64 or IA-64       8 bytes Mac OS X       IA-32                          4 bytes Mac OS X      Intel® 64 or IA-64       8 bytes  答错地方了，请忽略吧

user: user-1
content: 检查一下sizeof(long)是否是4个字节。  在不同的操作系统和CPU架构下，long的长度是不同的 引用sizeof(long) =    OS           arch                            size Windows       IA-32                            4 bytes Windows       Intel® 64 or IA-64        4 bytes Linux              IA-32                           4 bytes Linux              Intel® 64 or IA-64       8 bytes Mac OS X       IA-32                          4 bytes Mac OS X      Intel® 64 or IA-64       8 bytes

user: user-2
content: 引用 11 楼 lanpad的回复:[quote=引用 10 楼 qq_29465155 的回复:] long是有符号的，61380对应efd4，高位填充出现bug了  long不是4个字节32bit的长度么？ 应该是“0000EFD4”吧？[/quote] 两个字节的无符号数，扩充到四个字节有符号数，不强转编译器可能忽略符号位是否有效的问题。在int 类型的符号位出现1，无符号数不强转会被当作整型数据负数的标志位。还有本来计算结果就有溢出，你用最大无符号数加1，加2，等等，试试它溢出是否有规律。

user: user-3
content: 这里不应该用long类型，64位系统是8字节而32位系统是4字节的，这让你的算法（按位）出现不稳定的结果。同时既然是有移位操作，就不得使用带符号的类型，要用无符号的，例如u_int32_t，否则负数在移位过程中，高位是补1而不是补0

user: user-0
content: 引用 10 楼 qq_29465155 的回复:long是有符号的，61380对应efd4，高位填充出现bug了  long不是4个字节32bit的长度么？ 应该是“0000EFD4”吧？

user: user-2
content: long是有符号的，61380对应efd4，高位填充出现bug了

user: user-2
content: 你的是16位unsigned，计算结果超出类型范围，你每次调试结果可能都不一样。而立即数存放在代码区常量表，没有类型限制，执行时根据表达式调用2个寄存器（16位的）完成计算和赋值。

user: user-0
content: 引用 7 楼 jinlu1990 的回复:  是不是跟编译器有关？有人说我的编译器有bug：  “你的编译器有bug C_sum_test = 10*61380 时，直接使得 C_sum_test 等于 613800，这是不正确的。因为 int * unsigned int的结果类型应该是 unsigned int，而 613800 已经是 long 型了。  如果你用符合标准的编译器（还要这鸟编译器的int是16位的），那么两段代码结果应该一致 即，低16位是 0x5DA8，高16位是 0x0000（既不是9也不是-11）”  我又试了几次，加一个强制类型转换就可以了  将“ C_sum  = A_cnt *61380;        //正确结果应为613800或0x95DA8”  改为  “ C_sum  = （unsigned long）A_cnt *61380;”或 “ C_sum  = A_cnt *（unsigned long）61380;”  就正确了  必须是“（unsigned long）” “（long）”都不对  不知道怎么回事？   ps：开发环境：ZSP IDE (integrated development environment) 基于GCC3.0编译器， 根据软件中提供的文档，该版本的GCC(GNU Compiler Collection)主要支持C89标准。

user: user-4

user: user-4
content: 看代码，并不会出现LZ说的现象. 然后实际测试，也并没有出现错误。

user: user-0
content: 试过 无效…… 引用 3 楼 shangyu0801 的回复:long C_sum_test;与long C_sum; 都改为unsigned long类型。long类型的如果高位时1，右移时高位是补1的。

user: user-5
content: 请给出完整的程序。

user: user-6
content: long C_sum_test;与long C_sum; 都改为unsigned long类型。long类型的如果高位时1，右移时高位是补1的。

user: user-0
content: 跪求解决问题

user: user-7
content: 没有分了，跪求给点吧
user-0 提问: 单片机c语言

回复:
user: user-1
content: 阿拉伯数字、字母

user: user-2
content: 可以用来传递任何信息。

user: user-3
content: 广告牌  显示屏等，自己也可以弄一些小东西 LED显示屏就是集成的点阵
user-0 提问: 与calloc和strcpy_s有关的一个问题

回复:
user: user-1
content: 根据你的意思，我觉得你应该要用strcat_s，这样会自动连接到上一个字符串的后面，不用像你写那么麻烦

user: user-2
content: debug调试

user: user-3
content: 你的程序能编译吗？大括号不匹配啊

user: user-4
content: 你的子函数没有贴出来。
user-0 提问: LINUX下 char打印字符的问题

回复:
user: user-0
content: 上面的是我写的各种测试，看现象的，谢谢大家  现在都明白了

user: user-1
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: 引用 1 楼 u010158109 的回复:注意下我是在ubuntu，eclipse环境下运行的 这一句话就显得楼主特没水平，还特地强调！！！！  printf("data[] = %s\n", *data); 会在这句出错，%s表示打印字符串，你的data不是字符串

user: user-3
content: printf("data[] = %s\n", *data);  本句 printf 需要一个（合法的）字符串(char *) ，你提供了一个 char （ *data 是一个 char）。 自此程序的结果再也无法预知。  ==== 另外这里 memset(data2, 0, sizeof(data)); 后面应该是 data2 吧。

user: user-0
content: 引用 2 楼 fefe82 的回复:请提供完整的程序    int main(void) { 	//puts("!!!Hello World!!!"); /* prints !!!Hello World!!! */ //	unsigned char str[16] ; //	unsigned char str1[8] ; //	sprintf(str, "0fbc400200000000"); //    CharToHex( str1, str, 16); //    printf("%02x %02x %02x %02x %02x %02x %02x %02x\n", str1[0],str1[1],str1[2],str1[3],str1[4],str1[5],str1[6],str1[7]); //	unsigned long a = 100; //	printf("0x%03x", a); // //	char a[100] = "yhx"; //	      printf("siziof = %d\n",sizeof(a)); //	      printf("strlen = %d\n",strlen(a)); 	unsigned int id; 	unsigned char data[8]; 	int i, j, k; 	char data2[200]; 	memset(data, 0, sizeof(data)); 	memset(data2, 0, sizeof(data)); 	srand((unsigned)time(NULL)); //	{0,0,0x702,"0",0,"1a 2a 3a 4a 5a 6a 7a 8a"}, 	for(i = 0; i < 10; i++) 	{ 		switch(rand()%3+1) 		{ 		case 1 : 				id = 0x701; 				break; 		case 2 : 				id = 0x201; 				break; 		case 3 : 				id = 0x702; 				break; 		} 		printf("0x%x,", id); 	} 	puts("\n"); 	for(j = 0; j < 8; j++) 	{ 		data[j] = 1; 	} //	int a = 15; 	char *aa = "abc"; 	char b = 'a'; //	b = (char)a; 	printf("b = %c\n", b);  	printf("data[] = %s\n", *data); 	for(i = 0; i < sizeof(data); i++) 	{ 		printf("data[%d] = %d\n", i, data[i]); 	} //		printf("%d\n", id); //		for(j = 0; j < 8; j++) //		{ //			data[i] = (unsigned char)(rand()%4); //			printf("%c\n", data[i]); //		} //		sprintf(data2,"{0,0,0x%03x,""0"",0,"" %02x %02x %02x %02x %02x %02x %02x %02x""}""",\ //				id,data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7]); //	} //		printf("%s\n", data2);  	return EXIT_SUCCESS; }

user: user-4
content: 每天回帖即可获得10分可用分！  四楼、五楼正解， 再说如果楼主把j换成其它整数，搞不好会在data[j]里面放入了不可打印字符，输出的时候当然就可能看不到了。。。

user: user-3
content: 请提供完整的程序

user: user-0
content: 注意下我是在ubuntu，eclipse环境下运行的
user-0 提问: 基于RTP的前向纠错（FEC）功能的编码输出

回复:
user: user-1
content: http://blog.csdn.net/mediapro/article/details/50393685  使用FEC改善UDP（RTP）音视频传输效果 www.mediapro.cc

user: user-2
content: 板块发错，太专业

user: user-0
content: 看来真的是没有人回复了
user-0 提问: c语言中switch语句，随便怎么输入都是显示的没有资格= =菜鸟求解释

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

user: user-1
content: switch(age)

user: user-2
content: switch(age）就可以了，不要放式子，你放个表达式相当于拿ture或者false去和下面的23456对比
user-0 提问: 求学生管理系统代码，谢谢了

回复:
user: user-1
content: 这个也不是很难啊，作业自己做嘛。

user: user-2
content: 这样的作业好像很简单爱！新手入门都可以写出来！这么简单的作业也不思考下自己做做啊？

user: user-3
content: 引用 1 楼 u010165006 的回复:自己动手，心里多轻松 把功课补补吧，还来得及，每天看几页书，敲点代码验证一下，贵在坚持，坚持一个月就习惯了 自己写了有问题再上论坛比较好 坚持一段时间逐渐会有get的感觉，心里会充实

user: user-3
content: 自己动手，心里多轻松 把功课补补吧，还来得及，每天看几页书，敲点代码验证一下，贵在坚持，坚持一个月就习惯了 自己写了有问题再上论坛比较好
user-0 提问: C语言，帮忙看看哪错了！

回复:
user: user-1
content: #include<stdio.h>  char toup(char ch) { 	ch=ch+'A'-'a'; 	return ch; }  char tolow(char ch) { 	ch=ch+'a'-'A'; 	return ch; }  int main(){ 	int choice;  	for(;;) { 		printf("请选择：1.将小写转化为大写   2.将大写转化为小写   3.   退出程序\n"); 		scanf("%d",&choice); 		getchar();  		if (choice==1) { 			char ch = 0; 			printf("请输入：º\n");  			while (ch!='\n'){ 				ch=getchar(); 				if (ch<'a'||ch>'z') 					break; 				ch=toup(ch); 				putchar(ch); 			} 		}  		else if (choice==2) { 			char ch = 0;  			printf("请输入：\n");  			while (ch!='\n'){ 				ch=getchar(); 				if (ch<'A'||ch>'Z') 					break; 				ch=tolow(ch); 				putchar(ch); 			} 		} 		else if (choice==3) 			return 0;  		printf("输入错误，请重新输入\n\n"); 	}  }

user: user-0
content: 引用 2 楼 qq_33176571 的回复:[quote=引用 1 楼 user-2 的回复:] 你在获取choice的值时，有一个enter留在缓存区中 ，被getchar（）得到，所以中断循环。我刚新手的时候也总是发生这种情况，等你学到输入输出函数，了解多些就能理解了  那该如何清除这个enter呢？[/quote]  我懂了，用这个char ch;while((ch = getchar()) != '\n' && ch != EOF); 谢谢

user: user-0
content: 引用 1 楼 user-2 的回复:你在获取choice的值时，有一个enter留在缓存区中 ，被getchar（）得到，所以中断循环。我刚新手的时候也总是发生这种情况，等你学到输入输出函数，了解多些就能理解了  那该如何清除这个enter呢？

user: user-2
content: 你在获取choice的值时，有一个enter留在缓存区中 ，被getchar（）得到，所以中断循环。我刚新手的时候也总是发生这种情况，等你学到输入输出函数，了解多些就能理解了
user-0 提问: C语言编写素数伴侣的问题！！

回复:
user: user-0
content: 引用 1楼lm_whales 的回复:把数据分成奇偶两组，奇数只能找偶数，偶数只能找奇数 或者先求出。 素数，然后 拆分素数，去重分组很有必要，然后还是需要穷举？

user: user-0
content: 引用 2楼user-2 的回复:这个规模并不大啊，穷举就好了。  一共才 100 个数，不到 5000 个组合。筛一个 60000 以内的素数表出来，逐个尝试就行。  关键问题在于如何求出最多的对数。假设奇偶各50个且各不相同，组合就有50！种组合，你说5000个是怎么计算的？

user: user-1
content: 最大系数的拆分方案，包含了所有素数的拆分方案 你需要的是在这些拆分方案里面，找到其他所有素数的拆分方法。

user: user-1
content: 每个素数，都可以拆分成比他小的奇数和一个偶数之和 这些奇数，包含比他小的素数。 我感觉这个关系，是可以利用的。 至于如何利用，只能耐心的分析了

user: user-2
content: 这个规模并不大啊，穷举就好了。  一共才 100 个数，不到 5000 个组合。筛一个 60000 以内的素数表出来，逐个尝试就行。  关键问题在于如何求出最多的对数。

user: user-1
content: 把数据分成奇偶两组，奇数只能找偶数，偶数只能找奇数 或者先求出。 素数，然后 拆分素数，去重
user-0 提问: 测试时，出现的错误改不来，大神求帮助

回复:
user: user-1
content: for(int i=0,mid=0;i<3;i++) 这种把i定义在前面 int i,mid; for(i=0,mid=0;i<3;i++)

user: user-2
content: 编译时加选项 -std=c99

user: user-3
content: #include<stdio.h> void Max(int a[3][4],int b[3]){     for(int i=0,mid=0;i<3;i++)     {         for(int j=1;j<4;j++)         {             if(a[i][j-1]>a[i][j])                 mid=a[i][j-1];             else mid=a[i][j];         }         printf("%d ",mid);      }  } int main() {     int a[3][4],b[3];     printf("请输入一个3*4的矩阵\n");     for(int i=0;i<3;i++)     for(int j=0;j<4;j++)     scanf("%d",&a[i][j]);     Max(a,b);     return 0; } 用C++

user: user-4
content: #include<stdio.h> void Max(int a[3][4],int b[3]) {     int i;     for(i=0;i<3;i++)     {         int j; 		b[i] = a[i][0];         for(j=1;j<4;j++)             if(a[i][j]>b[i])                 b[i] = a[i][j];     } } int main() {     int a[3][4],b[3];     int i;     printf("请输入一个3*4的矩阵\n");        for(i=0;i<3;i++)     {         int j;         for(j=0;j<4;j++)             scanf("%d",&a[i][j]);     }     Max(a,b); 	for(i=0;i<3;i++) 		printf("%d\n", b[i]);      return 0; }

user: user-5
content: 引用'for' loop initial declarations are only allowed in C99 mode 仅C99模式下允许for循环的初值声明  标准C下，所有声明必须放在最前，把i和j的声明放到函数的最前面就行了。

user: user-5
content: 把源文件的扩展名改为.cpp也行

user: user-4
content: C++下没有问题，可能C语言不允许，你把for语句中的变量放到外面定义   #include<stdio.h> void Max(int a[3][4],int b[3]) { 	int i, mid; 	for(i=0,mid=0;i<3;i++) 	{ 		int j; 		for(j=1;j<4;j++) 		{ 			if(a[i][j-1]>a[i][j]) 				mid=a[i][j-1]; 			else mid=a[i][j]; 		} 	} 	printf("%d",b); } int main() { 	int a[3][4],b[3]; 	int i = 0; 	printf("请输入一个3*4的矩阵\n");	 	for(i=0;i<3;i++) 	{ 		int j; 		for(j=0;j<4;j++) 			scanf("%d",&a[i][j]); 	} 	Max(a,b); 	return 0; }
user-0 提问: 这个哪里错了？应该怎么改？

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

user: user-2
content: 第二个for循环内的复合语句打{}，否则执行到if语句的时候j=4了

user: user-2
content: if(k!=x)  //k已经为4

user: user-0
content: 引用 1楼user-4 的回复:第一次执行if(a[j]<a[k]) 这句时 j = 5了，也就是说越界了第一次j不应该为1吗？

user: user-0
content: 引用 2楼chehw_1 的回复:引用for(j=x+1;j<n;j++); 多了个“;”复制出错啦看看过程

user: user-3
content: 引用for(j=x+1;j<n;j++); 多了个“;”

user: user-4
content: 第一次执行if(a[j]<a[k]) 这句时 j = 5了，也就是说越界了
user-0 提问: 一道C语言的问题，，求大神帮忙解答。。。谢谢，帮帮忙吧

回复:
user: user-1
content: #include<stdio.h> void Max(int a[3][4],int b[3]) {     int i;     for(i=0;i<3;i++)     {         int j; 		b[i] = a[i][0];         for(j=1;j<4;j++)             if(a[i][j]>b[i])                 b[i] = a[i][j];     } } int main() {     int a[3][4],b[3];     int i;     printf("请输入一个3*4的矩阵\n");        for(i=0;i<3;i++)     {         int j;         for(j=0;j<4;j++)             scanf("%d",&a[i][j]);     }     Max(a,b); 	for(i=0;i<3;i++) 		printf("%d\n", b[i]);      return 0; }

user: user-2
content: 引用 5 楼 qq_26347849 的回复:[quote=引用 3 楼 baidu_33185996 的回复:] 测试时出现这个错误 D:\CB-Irellia\1.12\main.c:21:5: error: 'for' loop initial declarations are only allowed in C99 mode  这个错误怎么改啊？ 没见过这个错误的类型，他说你的for循环有问题。这个。。。[/quote] 楼主的编译器不支持C99语法，把i的定义单独些出来吧。

user: user-3
content: 引用 3 楼 baidu_33185996 的回复:测试时出现这个错误 D:\CB-Irellia\1.12\main.c:21:5: error: 'for' loop initial declarations are only allowed in C99 mode  这个错误怎么改啊？ 没见过这个错误的类型，他说你的for循环有问题。这个。。。

user: user-1
content: http://bbs.csdn.net/topics/391866596  此贴处已帮你改好

user: user-0
content: 测试时出现这个错误 D:\CB-Irellia\1.12\main.c:21:5: error: 'for' loop initial declarations are only allowed in C99 mode  这个错误怎么改啊？

user: user-3
content: 你很急，我就在这里直接写的，没有调试。你自己再小修一下就好了

user: user-3
content: void Max(int a[3][],  int b[]){     for(int i=0,mid=0;i<3;i++){           for(int j=1;j<4;j++){                  if(a[i][j-1]>a[i][j])mid=a[i][j-1];                  else mid=a[i][j];            }            b[i]=mid;      }      printf("%d",b); }  int main() {     int a[3][4],b[3];     printf("请输入一个3*4的矩阵\n");     for(int i=0;i<3;i++)        for(int j=0;j<4;j++)             scanf("%d",&a[i][j]);     Max(a,b);     return 0; }
user-0 提问: 结构体成员又是结构体的问题。

回复:
user: user-0
content: 已经解决啦。。

user: user-1
content: scanf("%d",&a.date.n);     scanf("%s",a.date.name);     scanf("%d",&a.date.age);

user: user-0
content: 再加一句，重点是指针引用的方法为啥错。
user-0 提问: C语言 问一个有关文件的问题

回复:
user: user-1
content: 引用 6 楼 songxinjianqwe 的回复:[quote=引用 5 楼 paschen 的回复:] 你写文件时，结构体中是char name[10];  读的时候那个结构体变成了char name[20]; 恩改成一样的就可以了 请问是什么原因呢[/quote]  你怎么存的就要怎么读，不然就读错位了显示出来当然不对了。。你错写之后sizeof(struct Student)的值就不同了

user: user-0
content: 引用 5 楼 paschen 的回复:你写文件时，结构体中是char name[10];  读的时候那个结构体变成了char name[20]; 恩改成一样的就可以了 请问是什么原因呢

user: user-2
content: 目测楼主在控制台输入数据时格式有误

user: user-1
content: 你写文件时，结构体中是char name[10];  读的时候那个结构体变成了char name[20];

user: user-0
content: 引用 2 楼 paschen 的回复:结构体中变量一个个保存 ...木有看懂

user: user-1
content: 结构体中变量一个个保存

user: user-0
content: 附上两张图
user-0 提问: 急！C语言的一个小问题，关于跳出循环

回复:
user: user-1
content: 这是C,C++ 设计的一个bug 循环和switch 不应该共享这个关键字。

user: user-0
content: 引用 4 楼 Jammg 的回复:if((check1==1&&check2==1)&&(check3==1&&check4==1)) break;  }       <----- 这里这个括号对应的是switch的，不会跳出for循环  。。。我好傻，太谢谢你了！！！

user: user-2
content: if((check1==1&&check2==1)&&(check3==1&&check4==1)) break;  }       <----- 这里这个括号对应的是switch的，不会跳出for循环

user: user-0
content: #include<stdio.h> #include<stdlib.h> #include<time.h>  #define ASPECT 4  int main() { 	char map[10][10]; 	int i,j,check1=0,check2=0,check3=0,check4=0; 	int direction; 	 	for(i=0;i<10;i++) 		for(j=0;j<10;j++) 			map[i][j]='.';  	i=0; 	j=0; 	map[i][j]='A'; 	 	srand((unsigned) time(NULL)); 	 	for(;;){	 		direction=rand() %ASPECT; 		switch (direction) { 			case 0:  			{ 				if (map[i-1][j]=='.'&&(1<=i&&i<=9)){ 					i-=1; 					map[i][j]=map[i+1][j]+'B'-'A'; 					check1=0; 					check2=0; 					check3=0; 					check4=0; 					} 				else 					check1=1;	 				break;		 			} 			case 1:  			{ 				if (map[i+1][j]=='.'&&(0<=i&&i<=8)){ 					i+=1; 					map[i][j]=map[i-1][j]+'B'-'A'; 					check1=0; 					check2=0; 					check3=0; 					check4=0; 					} 				else 					check2=1;	 				break;		 			} 			case 2:  			{ 				if (map[i][j-1]=='.'&&(1<=j&&j<=9)){ 					j-=1; 					map[i][j]=map[i][j+1]+'B'-'A'; 					check1=0; 					check2=0; 					check3=0; 					check4=0; 					} 				else 					check3=1;	 				break;		 			} 			case 3:  			{ 				if (map[i][j+1]=='.'&&(0<=j&&j<=8)){ 					j+=1; 					map[i][j]=map[i][j-1]+'B'-'A'; 					check1=0; 					check2=0; 					check3=0; 					check4=0; 					} 				else 					check4=1;	 				break;		 			}  			if(map[i][j]=='Z')  				break; 			 			if((check1==1&&check2==1)&&(check3==1&&check4==1)) 				break;	 		} 	} 			 	for(i=0;i<10;i++){ 		for(j=0;j<10;j++) 			printf("%c",map[i][j]); 		printf("\n"); 	} 	 	return 0;	 	 }  重发一下

user: user-0
content: 引用 1 楼 HQ1356466973 的回复:看你写的代码我就蛋疼了，格式好乱啊  不好意思，c-free复制黏贴过来空格都没了，你主要看看 if(map[i][j]=='Z')  break;  if((check1==1&&check2==1)&&(check3==1&&check4==1)) break;	 这 为什么跳不出来，我调试出来的结果满足if的条件啊

user: user-3
content: 看你写的代码我就蛋疼了，格式好乱啊
user-0 提问: 关于strcpy与二级指针的问题

回复:
user: user-1
content: 必然错。二级指针你可以看成指针型的数组。你现在只给数组里面的指针自身分配了空间，但是指针全是野指针。

user: user-2
content: char **oldlist = (char **)malloc(sizeof(char *) * 1024);  你只是给指针分配了内存，但是并没有给指针指向的字符串分配空间，oldlist指针数组里全是野指针 并且strlen返回长度不包含'\0'，分配内存时需注意。  oldlist[n] = (char *)malloc(sizeof(char *) * (len + 1);

user: user-3
content: 二维数组分配内存不是像你这样分配的吧：char **oldlist = (char **)malloc(sizeof(char **) * 1024);

user: user-0
content: 59         int len = strlen(dir->d_name);  60         char *ptmp = (char *)malloc(sizeof(char *) * len);  61         strcpy(ptmp, dir->d_name);  62         *oldlist = (char *)malloc(sizeof(char *) * len);  63         strcpy(*(oldlist + n++), ptmp);  64     //  oldlist[n++] = ptmp;  依然出错

user: user-0
content: 难道 二级指针取×号后，不能用strcpy 进行赋值吗。

user: user-0
content: 以上不管如果 ，编译 都 是通过的。

user: user-2
content: 上面复制的时候没注意，sizeof里应该是char，char *是另一回事了 oldlist[n] = (char *)malloc(sizeof(char) * (len + 1);
user-0 提问: C语言字符串求解

回复:
user: user-1
content: 引用 3 楼 tnl159753 的回复:[quote=引用 1 楼 user-2的回复:]while(*--t != 'I')  用*t--来判断时会多减一次。 谢谢，我懂了，这个怎么给分，第一次用[/quote]  结帖可以给分

user: user-0
content: 引用 1 楼 user-2的回复:while(*--t != 'I')  用*t--来判断时会多减一次。 谢谢，我懂了，这个怎么给分，第一次用

user: user-1
content: 最后还会多减一次，可以最后给i的值加1

user: user-2
content: while(*--t != 'I')  用*t--来判断时会多减一次。
user-0 提问: 新手求助 c语言 选择排序问题

回复:
user: user-1
content: /* **选择排序 ,每轮循环，把最大值放在第一位，第二大值放在最后  */ #include <stdio.h>  void print_s(int *p,int n); void selectionsort(int *p,int n); int main() { 	//int arr[]={1,2,3,4,5,6};	 	int arr[] = {21,48,29,12,34};	 	int num = sizeof(arr)/sizeof(*arr); 	print_s(arr,num); 	selectionsort(arr,num); 	print_s(arr,num);	 	return 0;  }    void selectionsort(int *p,int n) { 	int i,j,tmp; 	int max,smax; 	for (i=0;i<n-1-i;i++) 	{ 		max = i; 		smax = n-1-i; 		//开始时，将第1位设为最大，最后1位设置为次最大。 		//如果smax大于max，则交换。  		if (p[smax]>p[max]) 		{ 			tmp = p[smax]; 			p[smax] = p[max]; 			p[max] = tmp; 		} 		for (j=i+1;j<=n-1-i;j++) 		{	 			//如果j大于max，先将max放在次最大smax上，再将j放到max上。  			if (p[j] > p[max]) 			{ 				tmp = p[smax]; 				p[smax] = p[max]; 				p[max] = tmp; 							 				tmp =p [max]; 				p[max] = p[j]; 				p[j] = tmp; 			}  			//如果j在max 和smax之间，则是为次最大，交换 j与smax即可  			else if (p[max] > p[j] && p[j] > p[smax]) 			{ 				tmp = p[smax]; 				p[smax] = p[j]; 				p[j] = tmp; 			} 		} 	}	 }   void print_s(int *p,int n) { 	int i; 	for (i = 0;i<n;i++) 	{ 		printf("%d ",*(p+i)); 	} 	printf("\n"); }

user: user-2
content: 引用 1 楼 陈年风楼的回复:放一个i从0到n-1跑，放一个j从i+1到n-1跑，两层循环，非降序排的话，如果i指的元素大于j指的元素，就交换。输出自己加 抱歉看错问题╭(°A°`)╮（尴尬～

user: user-2
content: 放一个i从0到n-1跑，放一个j从i+1到n-1跑，两层循环，非降序排的话，如果i指的元素大于j指的元素，就交换。输出自己加
user-0 提问: 经过哈夫曼编码后的文章，如何控制每一个bit输出到二进制文件

回复:
user: user-1
content: 可以移位 哈夫曼编码，第一步 把码表写入文件 接着才是文件的哈夫曼 编码 码表写入后，  读取原文，按表读取编码c和位数b。 剩余编码r，移位b 位， 把编码c 或到r上  够8bits 则取走8 bit  剩余位数保留在r上 哈夫曼编码是前缀码，每个原文代码（通常为一个字符），被编成一定位数的，一定编码的哈夫曼码。 所以可以用原文作索引，查找哈夫曼表，一一对译。 哈夫曼表的生成，才是哈夫曼编码，最精致，最核心，最关键的内容。 关系到压缩率的大小。

user: user-0
content: 引用 5 楼 lm_whales 的回复:待编码数据 a[N]; 编码余项 r 逐次取a[i] 编码到r后面，r够 8Bits储存之不够继续下一轮处理 如此即可 最后剩下 r 补齐输出 我也想过这个方法，但是要读出原文，能一个一个bit读吗？ 还有，能不能麻烦给出实现这个操作bit的方法代码？谢谢

user: user-1
content: 待编码数据 a[N]; 编码余项 r 逐次取a[i] 编码到r后面，r够 8Bits储存之不够继续下一轮处理 如此即可 最后剩下 r 补齐输出

user: user-1
content: 够8Bit就输出，不够就继续处理下一批数据， 最后一个数据，补齐即可

user: user-0
content: 我的主要问题是如何控制bit的输出到文件中，比如二进制码是100，没有到8位，我也不想补齐8位成为char类型输出。就想只是输出二进制码100到二进制文件中。为的是节约内存空间（相当于压缩文件）。就这个怎么实现。求大神帮忙解决

user: user-2
content: 你需要哪几个位上的值， 就让该数与 需要的位为1、其他位为0的一个数做AND运算，然后将结果移位后就是你需要的数了

user: user-1
content: 查表就可以了
user-0 提问: 关于C语言结构体中的指针问题

回复:
user: user-0
content: 谢谢你了！学习了！

user: user-1
content: if(tmp[i].name == NULL)	return -1; tmp[i].name = "hjs"; 字符串不能这么赋值，改成 strcpy 即可，并且要注意不要越界。 指针不带这么玩的，这么玩，分配的内存，丢失了，无从释放，标准的内存泄露 而 free 指向常量（串字面值） "hjs" 的指针tmp[i].name 是个错误，所以  if(stu[i].name != NULL){ free(stu[i].name); printf("%d\n", i);  }这段程序，会出错也很正常。
user-0 提问: 求救！！！编写程序对表达式求值（从左向右运算，不计符号优先级）

回复:
user: user-1
content: 引用 2 楼 paschen 的回复:你处理过程写的是对的，关键是跳不出循环，帮你改成这样：   #include<stdio.h>  float arithmetic(float x,char ch,float y) { switch (ch) {     case '+' : return (x+y); break;   case '-' : return (x-y); break;     case '*' : return (x*y); break;    case '/' : return (x/y); break;    }  }  int main() { 	float a[20]; 	float n=1; 	char ch='*'; 	int i=0;   	printf("Enter an expression:");  	while (ch!='\n') { 		if (i==0) 			scanf("%f",&a[i]); 		else  		{ 			scanf("%c",&ch); 			if(ch=='\n') 				break; 			scanf("%f",&a[i]); 		}  		n=arithmetic(n,ch,a[i]);  		i++;  	}  	printf("Value of expression:%.1f",n);  	return 0;  } 建议把printf("Value of expression:%.1f",n);中的%.1f改成%g，这样不止一位小数的也能准确输出而且没有多余的0

user: user-2
content: 楼上的n=1有点问题，只能算1开头的算式。。 改成这样就对了 #include<stdio.h> float cal(float x,char ch,float y){   switch (ch) {   case '+':return(x+y);break;   case'-':return(x-y);break;   case'*':return(x*y);break;   case'/':return(x/y);break; } }  int main() { 	float a[50]; 	float n; 	char ch; 	int i=0;  	printf("Enter an expression:");  	while (ch!='\n'){ 		if(i==0){ 			scanf("%f",&n); 			scanf("%c",&ch); 			scanf("%f",&a[i]); 			n=cal(n,ch,a[i]); 			i++; 		} 		else 		   scanf("%c",&ch); 			if(ch=='\n') 				break; 			scanf("%f",&a[i]); 			n=cal(n,ch,a[i]); 			i++; 		  	 	}  	printf("Value of expression:%.1f",n);  	return 0; }

user: user-0
content: 引用 2 楼 paschen 的回复:你处理过程写的是对的，关键是跳不出循环，帮你改成这样：   #include<stdio.h>  float arithmetic(float x,char ch,float y) { switch (ch) {     case '+' : return (x+y); break;   case '-' : return (x-y); break;     case '*' : return (x*y); break;    case '/' : return (x/y); break;    }  }  int main() { 	float a[20]; 	float n=1; 	char ch='*'; 	int i=0;   	printf("Enter an expression:");  	while (ch!='\n') { 		if (i==0) 			scanf("%f",&a[i]); 		else  		{ 			scanf("%c",&ch); 			if(ch=='\n') 				break; 			scanf("%f",&a[i]); 		}  		n=arithmetic(n,ch,a[i]);  		i++;  	}  	printf("Value of expression:%.1f",n);  	return 0;  }   太感谢了！！！完美的解决了我的问题！！！

user: user-0
content: 引用 1 楼 Gdreamlend 的回复:给下建议或者思路吧：  if (i==0)	这个判断可以换掉  1.先把整个表达式输入进来， 2.然后判断字符串中的每个字符是不是数字， 3.如果是数字赋值给a, 4.否则赋值给c, 5.然后如果是数字赋值给b  6.这时应该去调用你的计算函数，得到中间结果d 7.然后这时的a=d,  8如果输入的字符串并没有读完 循环上面的 5及后面步骤  虽然和我想的不一样，但提供了不一样的思路还是谢谢你！

user: user-3
content: 你处理过程写的是对的，关键是跳不出循环，帮你改成这样：   #include<stdio.h>  float arithmetic(float x,char ch,float y) { switch (ch) {     case '+' : return (x+y); break;   case '-' : return (x-y); break;     case '*' : return (x*y); break;    case '/' : return (x/y); break;    }  }  int main() { 	float a[20]; 	float n=1; 	char ch='*'; 	int i=0;   	printf("Enter an expression:");  	while (ch!='\n') { 		if (i==0) 			scanf("%f",&a[i]); 		else  		{ 			scanf("%c",&ch); 			if(ch=='\n') 				break; 			scanf("%f",&a[i]); 		}  		n=arithmetic(n,ch,a[i]);  		i++;  	}  	printf("Value of expression:%.1f",n);  	return 0;  }

user: user-4
content: 给下建议或者思路吧：  if (i==0)	这个判断可以换掉  1.先把整个表达式输入进来， 2.然后判断字符串中的每个字符是不是数字， 3.如果是数字赋值给a, 4.否则赋值给c, 5.然后如果是数字赋值给b  6.这时应该去调用你的计算函数，得到中间结果d 7.然后这时的a=d,  8如果输入的字符串并没有读完 循环上面的 5及后面步骤
user-0 提问: C语言闪之轨迹卡牌Blade游戏AI求教

回复:
user: user-1
content: c语言？醒醒吧，c语言你写个界面都麻烦的要死，还要先学习win APi编程，建议lz考虑别的编程语言

user: user-1
content: 首先，我决定游戏里面那个ai感觉很一般啊，基本就是先手的话出最小的牌，然后你出稍大一点的他有雷就放雷，再大就镜子，基本达不到玩家的水平吧，不过感觉这游戏还是很靠手气的，毕竟到最后就是大牌的较量了

user: user-2
content: 你这lab么。。。
user-0 提问: 杨辉三角

回复:
user: user-1
content: 不知道你是否记得这一道题  用for输出                                    *                                ***                              *****                            *******                              *****                                ***                                  *                          本质上基本一样在输出的时候再加一个for就行了

user: user-2
content: 仅供参考：#include <stdio.h> #define MAXN 10 unsigned __int64 y[MAXN][MAXN]; int i,j; char s[60]; void main() {     printf("%30s\n","1  ");     printf("%33s\n","1     1  ");     y[1][0]=1ui64;y[1][1]=1ui64;     for (i=2;i<MAXN;i++) {         y[i][0]=1ui64;sprintf(s,"1  ");         for (j=1;j<=i-1;j++) {             y[i][j]=y[i-1][j-1]+y[i-1][j];             sprintf(s,"%s   %-3I64u",s,y[i][j]);         }         y[i][i]=1ui64;sprintf(s,"%s   1  ",s);         printf("%*s\n",30+i*3,s);     } } //                           1 //                        1     1 //                     1     2     1 //                  1     3     3     1 //               1     4     6     4     1 //            1     5     10    10    5     1 //         1     6     15    20    15    6     1 //      1     7     21    35    35    21    7     1 //   1     8     28    56    70    56    28    8     1 //1     9     36    84    126   126   84    36    9     1

user: user-3
content: 把它当作4*7的矩阵,除数字部分,其余都为空格.

user: user-4
content: 你首先要知道你会输出多少行，然后做一个for递减或者while递减的，从第一行开始打印空格就行了
user-0 提问: 初学指针，求助逆序输出字符串

回复:
user: user-0
content: 懂了 谢谢!

user: user-1
content: while(*p)p++;   //这个循环后， p在字符串末尾 p--;   //往前一位，指向/0前面一位 while(p>=s)   //只要p在s后就循环（s是字符串首地址） { printf("%c",*p);  //输出p当前字符 p--;   //递减p         }  }

user: user-2
content: 意思就是到最后一个字符后再倒叙输出直到第一个  但是s【】没有初始化你确定这个程序能正常运行么？ 超出输入字符数范围后能正确返回0或false么？
user-0 提问: 求解。。。为什么求不出鞍点

回复:
user: user-1
content: 你的代码有点乱，使用的变量太多，变量名称也不易分辨含义。 稍微改写了一下（为了简化代码并便于测试，在示例中直接给a赋值）：   #include<stdio.h>  int main(int argc, char ** argv) { 	int a[3][3] = {	{2, 4, 1}, 				{3, 5, 7}, 				{1, 6, 9} 					}; 	 	int row, col, i; 	int max; 	int saddles_count = 0;  	row = 0; 	while(row < 3) 	{ 		max = a[row][0]; 		col = 0; 		 		// 找出当前行（row）中的最大值所在的列(col) 		for(i = 1; i < 3; i++) 		{ 			if(a[row][i] > max)  			{ 				max = a[row][i]; 				col = i; 			} 		} 		 		// 判断此值是否为该列上的最小值 		for(i = 0; i < 3; i++) 		{ 			if(a[i][col] < max) break;  		} 		 		// 不是最小值时，i 必小于3 		if(i == 3)  		{ 			saddles_count++; 			printf("saddle point @(%d, %d) = %d\n", row, col, a[row][col]); 		} 		row++; 	} 	 	printf("saddle points count = %d\n", saddles_count);	 	 	return 0; }

user: user-1
content: ... max=a[i][0]; n = 0; //此处为新添加行 for(j=0;j<3;j++) ...   printf("鞍点数为%d",a[i][n]); // 把“j" 改为 "n"

user: user-0
content: 所以我应该怎么修改呢，，，而且[3][n]是没有的，只有a[2][n]

user: user-2
content: z=1; for(k=0;k<3;k++){ if(max>a[k][n])         z=0;          }       你的结果跟你最后max和a［3］［n］有关系，跟之前的没关系。所以不出
user-0 提问: 八皇后的问题

回复:
user: user-1
content: LZ程序第108行i--将导致i<1.

user: user-2
content: 不知道你的思路，代码很难看懂啊，这是以前学的时候写的，有循环和递归两个版本，你可以对照看一下，没有画图，只生成了结果数组 #include <iostream>  using namespace std;   bool place(int *x, int k) { 	for(int i=1;i<k;i++) 	{ 		if((x[i]==x[k]) || (abs(x[i]-x[k])==abs(i-k))) 			return false; 	} 	return true; }  void n_queens(int n) { 	int *x = new int[n+1]; 	for(int i=0;i<n+1;++i) x[i]=0;  	int k=1;//k表示当前搜索的行数，从第1行开始 	x[1]=0;//x[1]是解向量第一个元素，为跟以后的循环匹配，先赋值给0，其实是从1开始的 	while(k>0)//控制行，只要大于0，证明搜索在第0行以下进行 	{ 		//start 找到符合条件的列 		x[k]=x[k]+1;//从下一列开始，因为不能同列 		while((x[k]<=n)&&(!place(x,k)))//找到下一个满足条件的列 			x[k]=x[k]+1;//后移一列 		//end 找到符合条件的列 		if(x[k]<=n)//有符合条件的列 		{ 			if(k==n)break;//搜索完成，跳出循环 			else//搜索没有完成(得到的是部分解) 			{ 				k=k+1;//搜索下一行 				x[k]=0;//下一行的x[k]初始化为0 			} 		} 		else//没有符合条件的列了 		{ 			x[k]=0;//恢复x[k]为0 			k=k-1;//回溯到上一行 		}  	}  	for(int i=1;i<n+1;++i) 		cout<<x[i]<<" "; 	cout<<endl; 	delete[] x; } //每个函数的功能是处理一行，也就是填写x[i]，然后决定是继续填写x[i+1]还是 //回溯填写x[i-1] bool r_n_q(int* x,int i,int n) { 	if(i<1)return false;//回溯到根节点了，证明无解 	x[i]=x[i]+1;//因为上一个x[i]是死节点了，所以查询下一个 	while((x[i]<=n) && (!place(x,i))) 		x[i]=x[i]+1;//找到下一个满足条件的节点，或者扫描完整个行 	if(x[i]<=n)//找到符合条件的节点了 	{ 		if(i==n)return true;//已经是第n行了，也就是x数组填充成功了 		else//还没填充完，得到的是部分解，继续填写下一行 		{ 			x[i+1]=0;//下一行从0开始，因为后面要加1 			r_n_q(x,i+1,n);//调用函数填写第i+1行 		} 	} 	else//没有找到符合条件的节点，也就是这一行扫描完了，要回溯到上一行了 	{ 		r_n_q(x,i-1,n);//回溯，搜索上一行 	} } void recursive_n_queens(int n) { 	int *x = new int[n+1]; 	for(int i=0;i<n+1;++i) x[i]=0;  	if(r_n_q(x,1,n)) 	{ 		for(int i=1;i<n+1;++i) 			cout<<x[i]<<" "; 		cout<<endl; 	} 	else  		cout<<n<<"皇后问题无解！"<<endl; 	delete[] x; } int main() {  	for(int i=1;i<15;++i) 	{ 		n_queens(i); 		recursive_n_queens(i); 	} 	system("pause"); 	return 0; }
user-0 提问: 问一个很简单有关scanf的问题

回复:
user: user-1
content: 简单的说，一般情况下scanf遇到空格符或回车符时自动跳过，但如果是要求输入一个字符型数据%c时，空格符或回车符都将作为一个字符被读入

user: user-2
content: 其实，你需要了解一下计算机输入缓冲区的机制！自己查查资料，或许理解得深一些！

user: user-0
content: 加了20分，可以解释的全给了...

user: user-0
content: 看不懂 试了一下第一个代码 只有第二种好使 第二个代码 第一二中都好使  实在不明白为啥是这样 楼上发的英文实在看不懂 百度搜了一下  如果scanf中%d是连着写的如“%d%d%d”,在输入数据时，数据之间不可以加逗号，只能是空格或tab键或者回车键——“2 3 4” 或 “2（按tab）3（按tab）4（按tab）”。若是“%d，%d，%d”，则在输入数据时需要加“，”，如“2，3，4”.  其中没有包含之间有空格的，而有的时候连着写也是无法输入的

user: user-3
content: 4 The fscanf function executes each directive of the format in turn. When all directives have been executed, or if a directive fails (as detailed below), the function returns. Failures are described as input failures (due to the occurrence of an encoding error or the unavailability of input characters), or matching failures (due to inappropriate input). 5 A directive composed of white-space character(s) is executed by reading input up to the first non-white-space character (which remains unread), or until no more characters can be read. The directive nev er fails. 6 A directive that is an ordinary multibyte character is executed by reading the next characters of the stream. If any of those characters differ from the ones composing the directive, the directive fails and the differing and subsequent characters remain unread. Similarly, if end-of-file, an encoding error, or a read error prevents a character from being read, the directive fails.