Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 如何打印出一个结构体数组中的二位字符串数组组员中的一个元素？

回复:
user: user-1
content: 引用 5 楼 hzy_76 的回复:另外，习惯上都把UNIT8定义为unsigned short，char是1字节，应给是UNIT4才对。 注意不要误导人. UINT8 中的8是指bit数, 也就是8bit的无符号整型, 正好占一字节.  一般都是unsigned char 对应也有UINT16  === unsigned short UINT32  UINT64

user: user-0
content: 好像初始化的时候就错了。初始化结构体应该是用常量去初始化，但是我在那个结构体数组中却用了两个变量。是不是这样呢？

user: user-0
content: 引用 10 楼 hzy_76 的回复:不好意思，刚才思维混乱了，UNIT8没错。但是你这个定义还是有问题吧：   UINT8 *hubei_province[][6] = {     {"Wuhan",     "Jiangan",    "Jianghan"  },     {"Xiangyang", "Xiangcheng", "Fancheng"  },     {"Yichang",   "Xiling",     "Wujiagang" }, };  三维数组？6是每个字符串长度？ 第一个[]是行吧，第二[]不是列吗？6表示一个数组中最多有6个字符串。

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:typedef struct _AREA_SUBAREA_ {     ABV_EAD_UInt8* area;     ABV_EAD_UInt8* sub_area;   }AREA_SUBAREA;   类型不匹配呢，sub_area和hubei_province类型不匹配。怎么直接赋值呢？ 里面的一些类型都是unsigned char类型的。如果是UINT8**的话，改如何打印呢？

user: user-0
content: 引用 7 楼 cfjtaishan 的回复:typedef struct _AREA_SUBAREA_ {     ABV_EAD_UInt8* area;     ABV_EAD_UInt8* sub_area;   }AREA_SUBAREA;   类型不匹配呢，sub_area和hubei_province类型不匹配。怎么直接赋值呢？  哦，对对，应该是UINT8**吧，之前写的是UINT8**，改来改去掉了个*号。

user: user-2
content: typedef struct _AREA_SUBAREA_ {     ABV_EAD_UInt8* area;     ABV_EAD_UInt8* sub_area;   }AREA_SUBAREA;   类型不匹配呢，sub_area和hubei_province类型不匹配。怎么直接赋值呢？

user: user-0
content: 引用 4 楼 hzy_76 的回复:还是没看懂，那你这二维数组的定义怎么设计的？比如hubei_province，按unsigned char的思路，这样保存不了二维字符串数组，只能保存字符串数组。 我用的编译器char类型带符号的，一个char类型的可能占用16位，所以加了个unsigned去掉符号位，就是8位了。  hubei_province这个如果不这样写，该怎么写？这样应该没问题吧。UINT8* 的一个二维指针数组，里面每一个元素都是一个指针。应该没问题啊

user: user-0
content: 说明一下，UINT8是unsigned char类型

user: user-0
content: 引用 1 楼 hzy_76 的回复:UINT8是unsigned short？你用来保存字符串？好像从定义就开始错了嘛！ UINT8是unsigned char

user: user-3
content: 不好意思，刚才思维混乱了，UNIT8没错。但是你这个定义还是有问题吧：   UINT8 *hubei_province[][6] = {     {"Wuhan",     "Jiangan",    "Jianghan"  },     {"Xiangyang", "Xiangcheng", "Fancheng"  },     {"Yichang",   "Xiling",     "Wujiagang" }, };  三维数组？6是每个字符串长度？

user: user-3
content: 另外，习惯上都把UNIT8定义为unsigned short，char是1字节，应给是UNIT4才对。

user: user-3
content: 还是没看懂，那你这二维数组的定义怎么设计的？比如hubei_province，按unsigned char的思路，这样保存不了二维字符串数组，只能保存字符串数组。

user: user-3
content: UINT8是unsigned short？你用来保存字符串？好像从定义就开始错了嘛！
user-0 提问: iostrom.h的头文件找不到该怎么办

回复:
user: user-1
content: iostream.h是老的C++头文件，标准以后的是 #include <iostream>  using namespace std;

user: user-2
content: iostrom.h也许是iostream.h？

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

回复:
user: user-0
content: 谢谢各位！已解决

user: user-1
content: 对于系统库文件，建议用<>，对于自定义头文件，建议用""

user: user-1
content: 少一个的原因是创建的时候就少创建一个，最后输入的节点其实并没有加入链表；只需要将最后输入的节点加入链表即可：如下， //#include"stdafx.h" #include <stdio.h> #include <stdlib.h> //#include "malloc.h"  #define LEN sizeof(struct student)   /* 注意单词的大小写*/  struct student {     int num;     int score;     struct student *next; };  int n;  struct student *creat(void) {     struct student *ptr,*p1,*p2;     int t;     printf("please input number of students:\n");     scanf("%d", &t);     printf("please input student data:\n");     p1 = p2 = (struct student *)malloc(sizeof(struct student));     scanf("%d,%d", &p1->num,&p1->score);     ptr = NULL;     t = t-1;     n = 0;     do {         n = n + 1;         if(n==1)             ptr = p1;         else             p2->next=p1;         p2=p1;         p1 = (struct student *)malloc(sizeof(struct student));         scanf("%d,%d", &p1->num,&p1->score);     }while(n < t);     /*将最后一个节点加入链表*/     p2->next = p1;     p1->next = NULL;     //p2->next=NULL;     printf("\n");     return(ptr); }      int main() {     struct student *ptr, *phead;     int i = 1;     phead = creat();     printf("please output linklist data:\n");     ptr = phead;     while(ptr)     {         printf("student%d:num=%d,score=%d\n",i++,ptr->num,ptr->score);         ptr = ptr->next;     }     return 0; }

user: user-0

user: user-2
content: 在自己觉得有问题的地方, 用printf将存疑的变量打印输出,  直到发现问题

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

user: user-3
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。   “多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？
user-0 提问: 各位看看我编的代码，为啥就不能动呢？？？

回复:
user: user-1
content: 路过

user: user-2
content: 引用 1 楼 zhang_hao1949 的回复:while(1)这个语句后面多了和个分号 支持，写的时候建议细心些。

user: user-3
content: while(1)这个语句后面多了和个分号
user-0 提问: 请问有哪里有gcc的官方论坛？

回复:
user: user-1
content: tolower

user: user-1
content: 百度搜相关关键字。

user: user-2
content: gcc有官网，但是支持方式应该是邮件列表，没有论坛。 即使是邮件列表，也不会解决这样的问题的。  貌似strlwr不是标准函数吧。

user: user-0
content: 引用 2 楼 xsklld 的回复:strlwr是什么？没听过这个函数。 这是将大写字母转换成小写字母的函数，在string.h里。

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:百度搜相关关键字。 您好赵老师，只能找到一个gcc的官方网站gcc.gnu.org，仔细看了一下，里面好像没有forum字眼，但是有一个gcc-help@gcc.gnu.org邮件地址，我发信过去，但是遭退信了。还有百度的gcc吧，很冷清。

user: user-3
content: strlwr是什么？没听过这个函数。
user-0 提问: 用int a[3][3],和int a[3][3]={0}为什么结果会不一样

回复:
user: user-1
content: a和b是scanf输入赋值，不初始化也没事。c没有初始化。里面是垃圾值，不是0

user: user-2
content: a和b数组可以不初始化，但是c数组必须要初始化。数组不初始化就是随机值，随机值加上a和b的值，就是不确定了。 a和b数组从终端输入，即使不初始化，是随机值，但是会被终端输入的数据覆盖。

user: user-3
content: 2楼   +1

user: user-4
content: 若若的说一句不管你怎么换都行，不会影响结果！只要你的输入正确就行了！你的a，b数组都是有赋值操作的；我刚刚试了你说的问题，int a[3][3];与int a[3][3]={0}是一样的输出。

user: user-5
content: 局部动态变量要赋值，否则为随机数

user: user-6
content: 应该是没有初始化。单步运行一下看一下拿到的都是什么值

user: user-7
content: 2楼   +2

user: user-8
content: 其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-9
content: c数据 += 要赋初值吧
user-0 提问: 判断是否为回文字符

回复:
user: user-0
content: 引用 1 楼 qq_38204686 的回复:我不认为这个程序可以实现判断回文 是的，我有些地方错误较多，重新改正了下。 #include<stdio.h> #include<string.h> #define N 100 main() {     char ch[N];     gets(ch);     int len=strlen(ch),i,j;     printf("请输入一串字符:\n");          for(i=0,j=len-1;i<=j;i++,j--)         {             if(ch[i]==ch[j])             printf("是回文数\n");             else             printf("不是回文数\n");             break;              //为什么这里if语句判断与常识相反，第一个元素与最后一个比较不相等时，应该判定为不是回文，但是那样写却会判定为是回文，如果颠倒就会判定正确！这是为什么？？？//          } } 这是正确的！ 更多 0

user: user-1
content: 我不认为这个程序可以实现判断回文
user-0 提问: C语言 循环结构卡住问题

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 单精度浮点数(float)总共用32位来表示浮点数，其中尾数用23位存储，加上小数点前有一位隐藏的1(IEEE754规约数表示法)，2^(23+1) = 16777216。因为 10^7 < 16777216 < 10^8，所以说单精度浮点数的有效位数是7位。考虑到第7位可能的四舍五入问题，所以单精度最少有6位有效数字（最小尺寸）。  #include <stdio.h> int main() {     float a=1,password;     printf("输入你的数字:\n");     scanf("%f",&password);     printf("%f\n", password);     while(a<password) {         printf("%f\n", a);         a=a+1;     }     printf("\n\n我猜数字是:%.0f\n",a);      return 0; } a增加到16777216已经不增加了。其实就是到最大值了。建议用double类型定义a

user: user-3
content: 你的数据是while 叠加，应该是溢出了
user-0 提问: 老谭的C语言 算利息的问题 小白求教

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437

user: user-2
content: 这是浮点数精度的问题，float精度是小数点后6位，double类型比float精度长

user: user-3
content: float的能保证的精度也就是6位
user-0 提问: 关于C4996警告怎么处理？

回复:
user: user-0
content: 谢谢各位！！！！！！！！！

user: user-1
content: 引用 4 楼 ckc 的回复:我都是在最前面加上 #pragma warning(disable:4996)

user: user-2
content: 看你的代码上面没有加啊。

user: user-3
content: 引用 4 楼 ckc 的回复:我都是在最前面加上 #pragma warning(disable:4996) 支持

user: user-4
content: 在安装路径中加入那句话 我的在C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\vcprojectitems

user: user-5
content: 我都是在最前面加上 #pragma warning(disable:4996)

user: user-6
content: 必须要加入英文符号的分号，不知道你加了没有？

user: user-7
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 4 楼 ckc 的回复:] 我都是在最前面加上 #pragma warning(disable:4996) [/quote]

user: user-8
content: 因为这个函数是不安全，可能造成缓冲区溢出，所以现在建议用scanf_s来代替如果仍想用可以选择以下任何一种方法： 1、新建项目时不要勾选安全开发生命周期检查 2、在项目属性的C/C++命令行中加上 /D _CRT_SECURE_NO_WARNINGS
user-0 提问: 在写代码的时候出现这样的问题 不知道哪里错了

回复:
user: user-1
content: 定义指针的时候顺带赋值NULL。

user: user-2
content: # include <stdio.h> # include <stdlib.h> # include <string.h>  typedef struct student {     char name[32];     float score;     struct student *next; }STU;  STU *myCreatelist(STU *head) {     STU *q,*p;     char temp[10];     int flag=1;     float t=0;     head=(STU*)malloc(sizeof(STU));     head->next = NULL;     q=head;     while(flag)     {         p = (STU*)malloc(sizeof (STU));         p->next = NULL;         printf("input name\n");         scanf("%s", temp);         printf("input score\n");         strcpy(p->name,temp);         scanf("%f", &t);         p->score = t;         q->next=p;         q = p;         printf("inpuut flag\n");         scanf("%d",&flag);     }     p=head->next;     while(p)     {         printf("name is :%s\n",p->name);         printf("score is :%.2f\n",p->score);         p=p->next;     }     printf("\n");     return head; } int main () {     STU *head = NULL,*p,*q;     head = myCreatelist(head);     q = head->next;     while (q)     {         if(!strcmp (q->name,"x6")) {             p=q->next;             q->next=p;             break;         } else {             q = q->next;         }     }     p = head->next;     while (p)     {         printf("name is :%s\n",p->name);         printf("score is :%f\n",p->score);         p = p->next;     }      return 0; } 结构体定义有问题，name定义的长度太短，只要输入一个字符就会导致溢出，score若是一个成绩，建议定义成变量而非数组。

user: user-3
content: 《C++Primer第四版中文版》中提到 除了使用数值 0 或在编译时值为 0 的 const 量外，还可以使用 C++ 语言从 C 语言中继承下来的预处理器变量 NULL，该变量在 cstdlib头文件中定义，其值为 0。如果在代码中使用了这个预处理器变量，则编译时会自动被数值 0 替换。因此，把指针初始化为 NULL 等效于初始化为 0 值： // cstdlib #defines NULL to 0 STU *head = NULL; // ok: equivalent to int *pi = 0;

user: user-0
content: 引用 1 楼 赵4老师的回复:局部变量head没赋初值就用 可是指针如何附初值，设为全局变量吗

user: user-4
content: 局部变量head没赋初值就用
user-0 提问: 定义pow函数,编译出错。

回复:
user: user-1
content: 先把多余的main删了， 看看你的错误行号。 5、11、3、19  代码一行一行写。 错误太多就把代码都删掉。 写一行、编译一次。

user: user-0
content: 引用 13 楼 jiht594 的回复:先把多余的main删了， 看看你的错误行号。 5、11、3、19  代码一行一行写。 错误太多就把代码都删掉。 写一行、编译一次。 好

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

user: user-0
content: 引用 5 楼 SoFii 的回复:第7行最后一个逗号是中文的。。。我把所有符号都换了。还是不行~

user: user-0
content: 引用 10 楼 qq_40158211 的回复:#include <stdio.h> double power(double x, double y); void main(void) { 	double x = 3.0, y = 3.0, z; 	z = power(x, y); 	printf("%.1f to the power of %.1f is %.1f\n", x, y, z); } double power(double x, double y) { 	double z = 1; 	while (y) 	{ 		z *= x; 		y--; 	} 	return z; }                           //   第7行y后面   改英文逗号 3.0 to the power of 3.0 is 27.0 请按任意键继续. . .

user: user-3
content: 对于double类型，不能直接while(y)，建议使用while (fabs(y - 0.0) < 1e-6) 另外，double数据输出，要用%lf，而不能用%f。

user: user-4
content: #include <stdio.h> double power(double x, double y); void main(void) { 	double x = 3.0, y = 3.0, z; 	z = power(x, y); 	printf("%.1f to the power of %.1f is %.1f\n", x, y,z); } double power(double x, double y) { 	double z = 1; 	while (y) 	{ 		z *= x; 		y--; 	} 	return z; } 虽然这么改就可以输出答案！但我还是要说的是，你这个逻辑还是有问题的哟！如果你输入的x，y是真的浮点数怎么办哟！

user: user-5
content: #include <stdio.h> double power(double x, double y); void main(void) { 	double x = 3.0, y = 3.0, z; 	z = power(x, y); 	printf("%.1f to the power of %.1f is %.1f\n", x, y, z); } double power(double x, double y) { 	double z = 1; 	while (y) 	{ 		z *= x; 		y--; 	} 	return z; }                           //   第7行y后面   改英文逗号 3.0 to the power of 3.0 is 27.0 请按任意键继续. . .

user: user-6
content: 贴上你的报错；看了下语法没问题，有可能是楼上说的中文标点符号的问题

user: user-7
content: 第7行最后一个逗号是中文的。。。

user: user-8
content: int main(); 说实话，计算机科学只能算工科

user: user-8
content: <img src="https://img-bbs.csdn.net/upload/201710/15/1508045216_181093.png" alt="">

user: user-0
content: 一个main和两个main都是不行。

user: user-9
content: 也许是因为你有两个main函数？
user-0 提问: while （函数）的问题

回复:
user: user-1
content: 建议你看看 while的条件 特别是isalnum 的具体用法 它不会读到结尾 而是读到空格就不读了

user: user-0
content: 啊，是的，刚想到isalnum，起床就看到你回复了。

user: user-0
content: 在试了，但有点不太明白，为什么会那样运行， 它没有一次读完，而是读着读着就执行一次  循环里的 内容

user: user-1
content: 这样猜测不如单步调试
user-0 提问: (signed char)~0在vs2017上为什么是-1呢？

回复:
user: user-1
content: 无符号数(~0)0的求反运算11111111  有符号数(~0)0的求反运算在补码000000000的基础上操作11111111不过它是负数所以11111111的原码为结果即10000001

user: user-2
content: 理解和讨论之前请先学会如何观察！  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-3
content: 如果全二进制各位全为1（0取~），表示有符号数就是-1，最高位的1是符号位（表示负数），具体网上搜索负数的表示方法

user: user-4
content: ~ 表示取一个数的二进制的反码

user: user-5
content: 负数在内存中是如何存的
user-0 提问: 新手c语言，求助break问题

回复:
user: user-1
content: if (a[i]=='\0')    /*或判断a[i] == 0*/     break;

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

user: user-3
content: for循环里面的if语句错了，是判断a[i]=='\0'时，break

user: user-4
content: 注意赋值语句＝，和关系判断＝＝区别

user: user-5
content: a[i] == '\0'

user: user-6
content: 这种函数内部产生的值没有变量名，会存储在未知的地址。 你不能在后面来一段 for (i=1;i<=5;i++)               sum=sum+f(i); f（i）是进入递归，不是存储数字，也就是说，你这么写，结合上面一段，会不断产生形参，直到堆栈区溢出，程序崩溃 递归产生的值要立刻使用，即使定义其他变量名比如一个数组也很容易数据溢出（即使你能做到，也最好不要这么干，纯粹增加修改麻烦）

user: user-0
content: 引用 1 楼 baidu_37097818 的回复:a[i] == '\0' 能不能在给我解决一个问题，在应用递归函数后，不是按照递归，递归中的每一个值都是已知？我在利用for语句进行总和运算，这样为什么就程序自动瓦解了?具体函数如下： #include <stdio.h>          int main ()          {             int f(int n);           printf(" sum  :%d ",f(5));            return 0;          }          int f(int n)          {             int c;             if(n==1)              c=10;              else              { c=f(n-1)+2;}             int i,sum=0;             for (i=1;i<=5;i++)               sum=sum+f(i);               return (sum);          }
user-0 提问: 函数的指针传递问题

回复:
user: user-1
content: 是的，你参数是按值传递的，也就是说函数中的形参只是实参的一个复制品，函数中只是修改了一个复制品，并不影响原件

user: user-2
content: 没有变化，因为p是函数fac上的局部变量，p = p+1;只是修改了fac函数上的局部变量，而没有修改调用函数里的head； head是调用函数的里的变量（或者全局变量）

user: user-3
content: [b]没有变呢，举个例子,p=&f , 就是把变量   f   的地址给p，*p里为f的值

user: user-4
content: http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-5
content: p是局部变量，只会影响到本函数fac栈内的内存。 但*p就不是局部变量了，它和*head一样，都指向head所指的内存，该内存并不在函数fac的栈内。 所以head和*head都没有变化，但在函数fac栈内p有变化。

user: user-6
content: 是啊  关于值传递和引用传递
user-0 提问: 请问我这个链表创建代码哪里错了

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

user: user-2
content: 完整的链表操作是少不了链表的释放的，建议加上。

user: user-2
content: #include <stdio.h> #include <stdlib.h>  typedef struct TNode{     int data1;     int data2;     struct TNode *next; }List;    int main(void) {     int n;     int i;     scanf("%d", &n);     List *L, *p;     L = (List *) malloc (sizeof(struct TNode));     L->next = NULL;     for( i = 0; i < n; i++){   /* 从0开始，就应该i < n*/         p = (List *)malloc (sizeof(struct TNode));         scanf("%d",&p->data1);         scanf("%d",&p->data2);         p->next = L->next;         L->next=p;     }      p = L->next;     while (p) {         printf("%d\t%d\n", p->data1, p->data2);         p = p->next;     }      return 0;  } List定义的是结构体变量，而不是结构体别名，所以要定义结构体别名，应该typedef； 上面的代码是修改后的，参考一下吧

user: user-3
content: //需要添加关键字typedef //不然就是申明一个结构体，并定义了一个对象List typedef struct TNode{ int data1; int data2; struct TNode *next; }List;  void main(){     int n; int i; scanf("%d",&n); List *L,*p; L=(List *) malloc (sizeof(TNode)); L->next=null; //i<n循环次数才正确 for( i = 0;i<n;i++){ //修改类型为List* p=(List*) malloc (sizeof(TNode)); scanf("%d",&p->data1); scanf("%d",&p->data2); p->next=L->next; L->next=p; }  }
user-0 提问: 新手跪求大神解释代码问题

回复:
user: user-1
content: int a[12] = {0,1,2,3,4,5,6,7,8,9}, //有两个元素未初始化 a既是一个指针，也是一个类型int[12]的变量。 cout<<a 和cout<<&a的值是一样的 ,说明此处&a中的a不是作指针来用，而是做变量来用。这个变量a的类型是int[12],所以&a的类型是int (*) [12] 改成   int *p = a;  //此处a作指针用 或者改成   int (*p) [12] = &a;    cout << *( (int*)p+2 ) <<endl; //打印第3个数据

user: user-2
content: 抱歉：2、int a[12];     int *p=&a[0];//指针指向数组第一单元，也是默认为数组头地址，需要&符号的；  int *p=a;与int *p=&a[0];指针赋值表达式是不一样的O(∩_∩)O  谢谢楼主

user: user-2
content: vs2015也要报错的O(∩_∩)O

user: user-2
content: 楼主：c语言，指针数组的赋值是这样的： 1、int a[12];     int *p=a;//指针指向数组，默认为数组头地址，不需&符号；  2、int a[12];     int *p=a[0];//指针指向数组第一单元，也是默认为数组头地址，也不需&符号；
user-0 提问: sqlite3执行命令时占用大量内存用到哪去了？

回复:
user: user-1
content: 引用 2 楼 xiang90721 的回复:[quote=引用 1 楼 zjq9931 的回复:] 用来缓存数据的啊。 可以加快查询速度啊。  如果是为了缓存数据，这个内存大小是否可以设置呢？因为测试过程中发现，这个内存增长达到一定值后就稳定不再增长了[/quote] 抱歉，详细的我并不了解。 个人感觉应当是可以设定的，但是怎么设定我不知道，也许不能，是软件已经定义好的。

user: user-0
content: 引用 1 楼 zjq9931 的回复:用来缓存数据的啊。 可以加快查询速度啊。  如果是为了缓存数据，这个内存大小是否可以设置呢？因为测试过程中发现，这个内存增长达到一定值后就稳定不再增长了

user: user-1
content: 用来缓存数据的啊。 可以加快查询速度啊。
user-0 提问: c语言，如图输出5行7列数组数据，我只想要第一行，怎么输出呢？

回复:
user: user-1
content: 加一个标志flag，先将flag置为1，当输出第一行时，将flag置为0，即可。

user: user-2
content: 用一个全局变量计数，比如int cnt = 0;   之后在那个循环里一开始cnt++; 再判断if(cnt == 1).......;之后在合适的地方再把cnt = 0；

user: user-0
content: 这是输出部分，我想要输出它可能输出多行的第一行，请指教 /********************************************/ 				if (fabs((c[2] - c[0]) - c2) <= 1.0e-6 && fabs((c[3] - c[1]) - c3) <= 1.0e-4) 				{ 					if (m1 > 300) 					{ 						fprintf(fp0, "%lf\t%lf\t%d\t%d\t%d\t%d\t%d\n", w1, ls, m1 - 300, ms1, ms2, s1, s2); 						printf("%lf\t%lf\t%d\t%d\t%d\t%d\t%d\n", w1, ls, m1 - 300, ms1, ms2, s1, s2); 					} 				} 				if (m1 == 310) 				{ 					fprintf(fp1, "%lf\t%lf\t%d\t%d\t%d\t%d\t%d\n", w1, ls, m1 - 300, ms1, ms2, s1, s2); 					printf("%lf\t%lf\t%d\t%d\t%d\t%d\t%d\n", w1, ls, m1 - 300, ms1, ms2, s1, s2); 					break; 				} 				/********************************************/

user: user-3
content: 把源代码贴出来，不然怎么看？
user-0 提问: 消去编译出现的strlwr警告

回复:
user: user-0
content: 引用 2 楼 user-1 的回复:http://blog.sina.com.cn/s/blog_77f90afc0100wu3n.html 今天在练习谭浩强书（第四版）的180页例7.4时，我将函数声明去掉，出现了跟本帖类似的警告。 于是我就想，要是把string.h文件里的strlwr函数声明拷贝到main函数前，会不会消除警告呢？ 一试果然没有警告了。 这个警告真的莫名其妙。

user: user-0
content: 引用 2 楼 user-1 的回复:http://blog.sina.com.cn/s/blog_77f90afc0100wu3n.html 您好，我打开string.h，发现里面有strlwr()的定义，那么编译器为何还发出warnning呢？

user: user-1
content: http://blog.sina.com.cn/s/blog_77f90afc0100wu3n.html

user: user-1
content: 这个函数确实不是标准库中的函数，有些编译器会自己实现
user-0 提问: 菜鸟学PE结构遇到一个很有趣的问题

回复:
user: user-0
content: 引用 4 楼 paschen 的回复:你文件打开方式是什么，ODOA实际是换行\r\n，读进来的时候有可能被处理成了一个\n  你也可以直接用原始的API函数去读，ReadFile  谢谢版主大大，按照你提供的知识我已经找到问题并解决了问题， 再次谢谢版主大大。

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了   谢谢赵老师， 按照您说的， 我已经明白并解决了疑惑。 非常感谢。

user: user-1
content: 你文件打开方式是什么，ODOA实际是换行\r\n，读进来的时候有可能被处理成了一个\n  你也可以直接用原始的API函数去读，ReadFile

user: user-2
content: 输出的ch为a，因为是%x，小写，所以输出a。注意不是OD，而是0D，前面是零而不是字母O； 注意一下，fseek让文件指针偏移了0x76个字节，建议再次确认一下偏移的0x76个字节后的数值是否为0D

user: user-3
content: 不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了

user: user-3
content: 《Windows PE权威指南》
user-0 提问: cJson源码中，头文件里函数前面都加extern作用

回复:
user: user-1
content: 声明，该函数可能在别的文件里面

user: user-2
content: 如果函数的声明中带有关键字extern，仅仅是暗示这个函数可能在别的源文件里定义，没有其它作用  http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html

user: user-2
content: 对于函数，加与不加都是可以。但是对于全局变量而言是不行的

user: user-3
content: 引用 6 楼 xiaotian_lishu 的回复:[quote=引用 5 楼 zhao4zhong1 的回复:] 万一 #define cJSON "C" 呢？  额，看不太懂；跟宏定义有啥关系，没关系的吧[/quote] 我只是狡辩而已。

user: user-0
content: 引用 5 楼 zhao4zhong1 的回复:万一 #define cJSON "C" 呢？  额，看不太懂；跟宏定义有啥关系，没关系的吧

user: user-3
content: 万一 #define cJSON "C" 呢？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:extern 和 extern "C" 不是一回事。 我说的是类似下面这种： extern cJSON *cJSON_Parse(const char *value); 前面加extern是多余的吧cJson源码中 extern "c" {     代码块 } 是说代码块里面的内容按照c的方式进行编译的吧

user: user-3
content: extern 和 extern "C" 不是一回事。
user-0 提问: 这是一个容器，请老师们帮我看下这个奇怪的输出结果

回复:
user: user-1
content: 因为st2中并没有133这个元素，所以结果就是*(st2.end())，结果是未定义的

user: user-2
content: 引用 4 楼 paschen 的回复:for (int i = 0; i <= 10; i++)  改成  for (int i = 0; i < 10; i++)  否则越界了  应该是越界了

user: user-3
content: for (int i = 0; i <= 10; i++)  改成  for (int i = 0; i < 10; i++)  否则越界了

user: user-4
content: for(int i=0;i<=10;i++)             st2.insert(a[i]);  看这里，数组a的长度只有10，for循环里却要取11个值，越界了。

user: user-5
content: 应该是一个随机值，建议查看一下该值对应的空间是否被初始化或者赋值

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

回复:
user: user-1
content: 有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core或dmp文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef _MSC_VER     #pragma warning(disable:4996)     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef _MSC_VER void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef _MSC_VER     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef _MSC_VER     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-79行添加到你带main的.c或.cpp的那个文件的最前面 //81-86行添加到你的main函数开头 //90-94行添加到你的main函数结束前 //在要写LOG的地方仿照第88行的写法写LOG到文件MyLog1.log中

user: user-2
content: 不知道楼主最后有没有搞清楚。刚刚开始研究国密算法，请赐教。
user-0 提问: 求助大佬，不知道怎么回事双重循环内循环只在外循环第一次时进行

回复:
user: user-1
content: 你是说这句吗？ for(H=a;i<=0;H=N+H) 这里有至少2个问题，1、这个循环的条件是i<=0，经过第一次运算后，条件不成立了，所以只有外层循环的第一次才执行；2、i是一个double类型，不能判断是否等于0，整数才能这么做。

user: user-2
content: 第一次执行，i是未初始化的。i是一个随机值。所以第一次执行也是随机的
user-0 提问: c语言中如何有技巧地替换goto 语句

回复:
user: user-1
content: 引用 3 楼 xiaowangzi666 的回复:我要的是二维数组中可以被赋给15个不同的值，楼上的代码只能赋给一个相同的值，一旦n得到了一个值，则跳出while循环，然后将相同的n赋给二维数组，循环15次。我想要的是输入15个不同的值，赋给15个不同的值 int count=0;       while (count < 15) //筛选输入的数据是否为数值数据  count为输入的浮点数个数     {         printf("Please enter 15 numbers:\n");           while (scanf("%lf", &n) != 1) {             printf("your enter is error,please enter again:");          }         p[i][j++] = n;   //赋值给二维数组         count++;         if (j > 4)         {             j = 0;      //列下标大于4，则重新开始赋值新的一行             i++;             if (i > 2)  //行下标大于2，则跳出循环                 break;         }     } 既然能看出不是15个不同的值，为什么就想不到把输入的while循环放到第二个while里面去呢？

user: user-0
content: 我要的是二维数组中可以被赋给15个不同的值，楼上的代码只能赋给一个相同的值，一旦n得到了一个值，则跳出while循环，然后将相同的n赋给二维数组，循环15次。我想要的是输入15个不同的值，赋给15个不同的值

user: user-1
content: int count=0;     printf("Please enter 15 numbers:\n"); //将15个浮点数输入到一个3行5列的二维数组中     while (scanf("%lf", &n) != 1) {         printf("your enter is error,please enter again:");     }      while (count < 15) //筛选输入的数据是否为数值数据  count为输入的浮点数个数     {         p[i][j++] = n;   //赋值给二维数组         count++;         if (j > 4)         {             j = 0;      //列下标大于4，则重新开始赋值新的一行             i++;             if (i > 2)  //行下标大于2，则跳出循环                 break;         }     }  先判断输入的n是否正确输入

user: user-0
content: 明白了，感谢！

user: user-0
content: 大神快来
user-0 提问: 很急 求哪错了

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

user: user-2
content: #include <stdio.h> #include <malloc.h>  typedef  char ElemType;  typedef struct LNode      //定义单链表节点类型 {     ElemType data;     struct LNode *next;  }LinkList;  void InitList(LinkList *&L) {     L = (LinkList *)malloc(sizeof(LinkList));     L->next = NULL;  }  void DestroyList(LinkList *&L) {     LinkList *p = L, *q = p->next;     while (q)     {         free(p);         p = q;         q = p->next;     }     free(p); }  int ListEmpty(LinkList *L) {     return(L->next == NULL); }  int ListLength(LinkList *L) {     LinkList *p = L; int i = 0;     while (p->next != NULL)     {         i++;         p = p->next;     }     return (i); }  void DispList(LinkList *L) {     LinkList  *p = L->next;     while (p != NULL)     {         printf("%c", p->data);         p = p->next;     }     printf("\n"); }  int GetElem(LinkList  *L, int i, ElemType  &e) {     int j = 0;     LinkList  *p = L;     while (j<i && p != NULL)     {         j++;         p = p->next;     }     if (p == NULL)         return 0;     else     {         e = p->data;         return 1;     } } int LocateElem(LinkList *L, ElemType  e) {     LinkList *p = L->next;     int n = 1;     while (p != NULL && p->data != e)     {         p = p->next;         n++;     }     if (p == NULL)         return (0);     else         return (n); } int ListInsert(LinkList  *&L, int i, ElemType  e) {     int j = 0;     LinkList *p = L, *s;     while (j <i - 1 && p != NULL)     {         j++;         p = p->next;     }     if (p == NULL)  //未找到第i-1个节点         return 0;     else        //找到第i-1个节点*p     {         s = (LinkList *)malloc(sizeof(LinkList));//创建新节点*s         s->data = e;         s->next = p->next; //将*s插入到*p之后         p->next = s;         return 1;     } } int ListDelete(LinkList  *&L, int i, ElemType &e) {     int j = 0;     LinkList *p = L, *q;      int j = 0;     LinkList *p = L, *q;     while (j < i - 1 && p != NULL)     {         j++;         p = p->next;     }     if (p == NULL)  //未找到第i-1个结点         return 0;     else     {         q = p->next;         if (q == NULL)             return 0;         e = q->data;         p->next = q->next;  //c从单链表中删除*q结点         free(q);         return 0;     }      return 0; }  int main(void) {     return 0; } ListDelete函数有问题，循环应该是多了一层。建议对比一下你的代码；

user: user-3
content: 具体说明什么问题，我们看代码才有针对性
user-0 提问: 有关动态重定位的一点疑问

回复:
user: user-1
content: 没调进来，只是建立了一个数据的映射。只不过是在虚拟内存中的的映射，因为一个进程的整个逻辑地址和操作系统管理的整个虚拟内存的逻辑地址是相互独立的。所以还需要进行第二次的重定位，推荐看《深入理解计算机系统》

user: user-2
content: 建议搜Linux内存管理相关源代码分析博文。
user-0 提问: while（1）如何解决无限循环，输入数据组数未知情况下

回复:
user: user-1
content: 设置一个判断标志，用于退出while(1)的循环。

user: user-2
content: 设置一个输入值，判断当输入值为这个值时，跳槽死循环，结束程序运行

user: user-3
content: 设置一个信号，做出什么动作时，退出循环。

user: user-4
content: 按Ctrl+C或Ctrl+Break

user: user-5
content: #include<stdio.h>  int main() {     float a[7];     int i;     float money = 0.0;      while (1)     {         for (i = 0; i <7; i++)         {             scanf_s("%f", &a[i]);             if (a[i] == xxx)    /*xxx是指某个值*/                 return 0;         }         for (i = 0; i < 4; i++)         {             if (a[i] != 0.0)             {                 money+= a[4]/a[i];             }         }         money += 5 * a[5];         if (a[6]<= 3)         {             money += 7 - 2 * a[6];         }         printf("%.2f\n", money);     }     return 0; } 退出循环有多种方法，一种是使用goto语句，即输入某个值判断该值是否等于xxx，根据这个判断goto到while(1)外； 第二种，就是直接return退出程序或者退出函数； 注意，对于浮点数判断相等不能像整型数据判断相等，而是根据相差值的绝对值是否小于1e-6 比如判断浮点数a, b是否相等；  float a, b; if (fabs(a-b) < 1e-6)     printf("a == b\n"); else     printf("a != b\n");

user: user-6
content: 在while中增加，结束条件，如： int a[9] = {0}; while(1) {     ...          for(int i=0; i<9; ++i)         scanf("%d", &a[0])              if(0==a[0])         break; // break while          ... }
user-0 提问: 新人求教数组

回复:
user: user-1
content: 仅供参考：#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-2
content: 建议是用指针，然后通过malloc，realloc等方式获取空间，并且空间可以伸缩，可增大可减少； 指针和数组在使用上有基本上相近，有一点数组名不能做左值。

user: user-3
content: #include <iostream>  int main(int argc, char *argv) {     char *arr1 = NULL;     char **arr2 = NULL;      int n = 100;      arr1 = new char[n]; // 动态申请一维数组      int x = 100, y = 99;      // 动态申请二维数组     arr2 = new char*[x];     for(int i=0; i<x; ++i)         arr2[i] = new char[y];      delete []arr1;      for(int i=0; i<x; ++i)         delete []arr2[i];     delete []arr2; }   动态数组用起来不是很方便，如果要存放动态的数据，还是使用容器（vector, list...）好。

user: user-4
content: 百度 定义未知长度的数据 百度 动态数组 百度 柔性数组

user: user-4
content: 百度 定义未知长度的数组 百度 动态数组 百度 柔性数组
user-0 提问: C语言CRC校验的问题

回复:
user: user-1
content: http://www.21ic.com/tools/HotPower/HotWC3_V1.23.html

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:http://blog.csdn.net/u012993936/article/details/45339983 CRC校验不是新的技术了，为什么不去网上搜一搜，然后学习一下呢？！ 学了，就是不怎么会吸收啊，其他的知识点不会上网搜一下写一下代码一般也就会用了，但是CRC这个就是不怎么会，我都看了很多的资料了，就是学的不清不楚的，代码自己写的不清不楚，甚至拿网上的代码下来还是不怎么会用，有的时候回钻牛角尖，就像这次的任务一样，我怎么都算不出公司给我的那个答案

user: user-2
content: crc是一种算法类型，实际实现有很多种 公司给了你什么样的资料？应该有输入，有输出结果，还应该有实际算法吧 实际算法是什么样的？是代码形式还是仅仅文字、公式描述？ 你要把这些详细的资料都放出来给大家看看，甚至把你的代码也贴出来 越详细，别人才越容易看出来哪里有问题

user: user-3
content: http://blog.csdn.net/u012993936/article/details/45339983

user: user-4
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-5
content: http://blog.csdn.net/u012993936/article/details/45339983 CRC校验不是新的技术了，为什么不去网上搜一搜，然后学习一下呢？！
user-0 提问: 新人求助

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

user: user-2
content: 编译期已经告知了printf的问题； printf缺少一个%d,其他没问题； printf("max: %d\n", c);

user: user-3
content: 贴代码，把问题说清啊，截图看不清

user: user-4
content: 看不清          建议调试
user-0 提问: 新人求教

回复:
user: user-1
content: 看看head->next; 是什么类型

user: user-2
content: 你的定义应该是node和Node混用了，仔细找一下，或者贴上完整代码

user: user-0
content: [Error] cannot convert 'node*' to 'Node*' in assignment

user: user-2
content: 程序没看出什么问题啊，“一直是错误的”具体什么情况？

user: user-3
content: 注意源码里是不是将list定义成了node *list？

user: user-4
content: 引用 2 楼 qq_38628693 的回复:[Error] cannot convert 'node*' to 'Node*' in assignment 报错node  Node?？？ 你看一下结构体定义。free(head)肯定在最后面的。
user-0 提问: C调用WIN32 API如何控制鼠标？

回复:
user: user-1
content: 引用 2 楼 zhao4zhong1 的回复:http://www.autohotkey.com 参考autohotkey源代码中实现模拟鼠标的命令Click和MouseClick对应相关片断。

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:[quote=引用 6 楼 SXJIAKE 的回复:] 左键按下和弹起同时传？ MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP 而且两句代码还一样？ 改为 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ); 再试试？[/quote] 试过了，结果一样。

user: user-2
content: 左键按下和弹起同时传？ MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP 而且两句代码还一样？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:改用SendInput再试试？ 谢谢指点，但应该不是这个问题。 这个问题只在WIN7下才出现，WIN XP下正常，另外，解释执行也正常，只在编译后执行才会这样。实在是想不明白。

user: user-0
content: 引用 3 楼 user-3 的回复:试下：https://msdn.microsoft.com/en-us/library/ms646310(v=vs.85).aspx 谢谢指点，但应该不是这个问题。 这个问题只在WIN7下才出现，WIN XP下正常，另外，解释执行也正常，只在编译后执行才会这样。实在是想不明白。

user: user-1
content: 引用 6 楼 SXJIAKE 的回复:左键按下和弹起同时传？ MOUSEEVENTF_LEFTDOWN | MOUSEEVENTF_LEFTUP 而且两句代码还一样？ 改为 mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ); mouse_event(MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0 ); mouse_event(MOUSEEVENTF_LEFTUP, 0, 0, 0, 0 ); 再试试？

user: user-3
content: 试下：https://msdn.microsoft.com/en-us/library/ms646310(v=vs.85).aspx

user: user-1
content: http://www.autohotkey.com

user: user-1
content: 改用SendInput再试试？
user-0 提问: 为什么说使用命令行参数的程序依赖于用户的内存如何正确地使用它们？

回复:
user: user-1
content: 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  http://bbs.csdn.net/topics/390469280
user-0 提问: C语言递归函数问题求解~

回复:
user: user-1
content: 只改一处就好。  #include <stdio.h> #include <iostream> using namespace std;  struct ll { 	int *a; 	int *b; 	int n; };  void tt(ll *&a, int *n) // 直接传*是不行的，里面重新分配后指针地址已经变化了，变化后的地址无法传回去，所以传指针的引用 { 	int i; 	a = (ll *)realloc(a, (*n + 1) * sizeof(ll)); 	a[*n].n = *n + 1; 	*n = *n + 1; 	for (i = 0;i < *n;i++) 	{ 		printf("%d\n", a[i].n); 	} 	printf("I'm here %d\n", *n); 	if (*n < 20) 	{ 		tt(a, n); 	} }  void  main() { 	int i; 	ll *pp; 	int n = 0; 	pp = new ll[n]; 	tt(pp, &n); 	printf("----%d\n", n); 	for (i = 0;i < n;i++) 	{ 		printf("%d\n", pp[i].n); 	} }

user: user-2
content: 问题在于递归函数tt中，第一个参数不应该是个已分配的指针地址，因为这个地址可能随着每次的realloc变化，所以这里传递的应该是指针变量的地址，即传递pp的地址，函数修改如下：   void tt(ll **a,int *n) { 	int i; 	*a=(ll *) realloc(*a,(*n+1)*sizeof(ll)); 	(*a)[*n].n=*n+1; 	*n=*n+1; 	for(i=0;i<*n;i++) 	{ 		printf("%d\n",(*a)[i].n); 	} 	printf("I'm here %d\n",*n); 	if(*n<20) 	{ 		tt(a,n); 	} }   main函数中的调用也应该改为   tt(&pp,&n);

user: user-0
content: 感谢各位大神的指导，谢谢！

user: user-3
content: 因为tt函数里修改了pp的地址值，所以需要每次更新a（参数）都要修改pp的地址值，所以应该传&pp；或者tt函数里a使用引用void tt(ll *&a, int *n);引用&是C++的一种用法，C语言建议使用二重指针，这样每次都能把上次realloc申请的新地址拿到；  #include <cstdio> #include <cstdlib> #include <iostream>  struct ll{     int *a;     int *b;     int n; };  void tt(ll **a,int *n) {     int i;     *a = (ll *) realloc(*a,(*n+1)*sizeof(ll));     (*a)[*n].n = *n+1;     *n = *n+1;     for(i = 0;i < *n;i++)         printf("%d\n", (*a)[i].n);      printf("I'm here %d\n",*n);     if(*n < 20)     {         tt(a, n);     } }  int  main() {     int i;     ll *pp;     int n = 0;     pp = new ll[n];     tt(&pp, &n);     printf("----%d\n", n);     for(i=0;i<n;i++)     {         printf("%d\n",pp[i].n);     }      return 0; } 改程序里只有new是属于C++的关键字，没有用到cin/cout，所以不用using namespace std;命名空间
user-0 提问: 想将D盘文件file1中的字符复制到file2中，程序一个劲儿的写值，哪里有错？大神们帮帮忙~

回复:
user: user-0
content: 厉害，学习了~~

user: user-1
content: # include <stdio.h> # include <stdlib.h>  int main(void) {     FILE *fp1, *fp2;     char ch1, ch2, ch3;      if ((fp1 = fopen("D:\\file1.dat","w+")) == NULL)     {         printf("您要找的文件file1.dat不存在！");         exit(0);     }     printf("请输入file1.dat中的字符：");     ch1 = getchar();     while (ch1 != '\n')     {         fputc(ch1, fp1);         putchar(ch1);         ch1 = getchar();     }     printf("\n");      if ((fp2 = fopen("E:\\file2.bat","w")) == NULL)     {         printf("您要找的文件file2.dat不存在");         exit(0);     }     printf("请输入file2.dat中的字符：");     ch2 = getchar();     while (ch2 != '\n')     {         fputc(ch2, fp2);         putchar(ch2);         ch2 = getchar();     }      //rewind(fp1);    /* 修改文件指针位置；*/     fseek(fp1, 0, SEEK_SET);     while (!feof(fp1))     {         ch3 = fgetc(fp1);         fputc(ch3, fp2);         putchar(ch3);     }     putchar(10);     fclose(fp1);     fclose(fp2);      return 0; }  文件1需要修改其文件指针的位置，因为开始对fp1进行写时，文件指针已经指向了文件末尾，所以若想读取文件1的内容，需要让fp1指向文件开头；因此需要fseek或者rewind都可以更改文件的位置

user: user-2
content: fp1写入，关闭，再读取
user-0 提问: 求哪里出错了

回复:
user: user-1
content: #include<stdio.h> #include <stdlib.h>  #define N 30 #define C_LEN_ID 10  typedef struct _ST_STUDENT {     char szId[C_LEN_ID];     float fScore;     struct _ST_STUDENT *pNext; }ST_STUDENT, *P_ST_STUDENT;  int main() {     float fAvg;     int i,j,n;      P_ST_STUDENT pllHead = NULL;     P_ST_STUDENT pllCur = NULL;     P_ST_STUDENT pstStu;      printf("请输入有多少个学生信息:");     scanf("%d",&n);     pllHead = (ST_STUDENT*)malloc(sizeof(ST_STUDENT));     pllHead->pNext = NULL;     pllCur = pllHead;     fAvg = 0;     for(i = 0;i < n;i++)     {         pstStu = (P_ST_STUDENT)malloc(sizeof(ST_STUDENT));         pllCur->pNext = pstStu;         pllCur = pllCur->pNext;         pllCur->pNext = NULL;         printf("请输入第%d 位学生的学号：",i+1);         scanf("%s", pllCur->szId);         printf("请输入课程成绩：" );         scanf("%f", &(pllCur->fScore));         fAvg += pllCur->fScore;     }      pllCur = pllHead->pNext;     while (pllCur) {         printf("ID: %s, Score: %0.1lf\n", pllCur->szId, pllCur->fScore);         pllCur = pllCur->pNext;     }     fAvg /= n;     printf("该班平均成绩为%.1f\n", fAvg);      return 0; } 暂未发现这部分代码有问题，或者说问题可能不出在这部分代码里。 也可能是你的输入格式有问题。

user: user-2
content: 请说明错误现象, 另外注意内存管理
user-0 提问: OJ ACM的题目给定一个日期，输出这个日期是该年的第几天。

回复:
user: user-1
content: while(scanf("%d/%d/%d",&years,&months,&days)) 你这句是打算无限循环吗

user: user-2
content: #include<stdio.h>  int main() {     int years,months,days,i;     int sum=0,a[12]={31,28,31,30,31,30,31,31,30,31,30,31};     while(3 == scanf("%d/%d/%d", &years,&months,&days))     {         if (months > 12 || days > 31)             continue;         sum = 0;         if((years%4==0 && years%100!=0) || years%400) {             if (months > 2)                 sum = 1; /*1: leap year */         }         for(i=0;i<months-1;i++)             sum += a[i];         sum = sum + days;         printf("%d\n",sum);     }     return 0; } 年月日的范围需要做一下判断； 代码冗余太多，可以做进一步简化，详见上面修改的部分。 如果还有问题，可以进一步对年月日的范围做检测

user: user-3
content: 超时            。
user-0 提问: 内存有没有释放

回复:
user: user-1
content: 你这个涉及操作系统底层管理虚拟内存时使用的“实际使用时再实际申请的延迟申请策略”。  int main() {         sleep(15);         int i =0;         for(; i< 10; i++)         {                 void * buf = (void *) malloc(20*1024*1024);                 printf("== mal == %p\n", buf);                 memset(buf,1,20*1024*1024);//加上这句再试试                 sleep(3);                 printf("** fre ** %p\n", buf);                 free(buf);                 sleep(3);         }         getchar();  }

user: user-0
content: 谢谢 @paschen and @赵4老师 , 查阅了一下glibc相关以及OS内存管理策略，确实是这样的。在调用 free时，操作系统不会马上把内存回收，而是放在一个free block list里，下次再malloc时，如果命中等大小的free block， 则直接反给malloc，如果命中值稍大点也可以切出用户想要的大小然后返回，这样一是可以提高性能，二是为了避免有太多的内存碎片。 参考： https://www.zhihu.com/question/29161424 http://blog.csdn.net/hylongsuny/article/details/7742995

user: user-2
content: 系统资源也是会占用内存，此外系统未必会在你释放内存后立即回收掉所有内存

user: user-0
content: 怀疑libc造成的，写了个小程序测试free，如下： int main() {         sleep(15);         int i =0;         for(; i< 10; i++)         {                 void * buf = (void *) malloc(20*1024*1024);                 printf("== mal == %p\n", buf);                 sleep(3);                 printf("** fre ** %p\n", buf);                 free(buf);                 sleep(3);         }         getchar();  } 观察top下内存状况：发现一直没什么变化，最后循环全部执行完后观察结果，也没有20M释放：  VIRT    RES    SHR                                                                                                                             24828   1364   1276   why???

user: user-3
content: 你malloc申请的空间大吗?

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:也许人家库使用了内存池管理中的延迟释放策略。 恩，这个有查，像glib库就会有这种情况，不过我把glib库全部注释掉了，另外也使用了这个帖子中用到的环境变量： http://bbs.chinaunix.net/archiver/tid-4164035.html but, 还是不行。另外，我在是系统函数free和malloc(还有realloc, zalloc)下加的日志，完全匹配。。。 挺奇怪的，top以及htop都显示内存一点不变，是不是linux底层tcp socket释放需要一定时间 ？

user: user-1
content: 也许人家库使用了内存池管理中的延迟释放策略。

user: user-1
content: 搜“内存延迟释放”？

user: user-0
content: 引用 1 楼 cfjtaishan 的回复:你malloc申请的空间大吗?  最大的一块是5152，是在每次发消息时申请，不过我将malloc以及free 地址打印出来了，每次都有释放。
user-0 提问: 包含指针的结构数组，初始化问题

回复:
user: user-1
content: 引用 4 楼 weixin_40525837 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] #include <stdio.h>  struct entry {     int value;     struct entry *next; };   int main(void) {     struct entry list[3] = { {0,&list[1]},{1,&list[2]},{3,0} };      struct entry *p = &list[0];      while (p) {         printf("value = %d\n", p->value);         p = p->next;     }     return  0; } 值已经被赋值上了。 上面的代码可以打印出0, 1, 3   这个可以啊！ 关键是为啥通过list[0].value的形式，打印不出来呢~ 能不能具体解析一下这里面的工作原理~   [/quote] #include <stdio.h>  struct entry {     int value;     struct entry *next; };   int main(void) {     struct entry list[3] = { {0,&list[1]},{1,&list[2]},{3,0} };      struct entry *p = &list[0];      while (p) {         printf("value = %d\n", p->value);         p = p->next;     }      int i;     for (i = 0; i < 3; i++)         printf("value = %d\n", list[i].value);     return  0; } 这样也是可以打出来0, 1, 3呢

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:#include <stdio.h>  struct entry {     int value;     struct entry *next; };   int main(void) {     struct entry list[3] = { {0,&list[1]},{1,&list[2]},{3,0} };      struct entry *p = &list[0];      while (p) {         printf("value = %d\n", p->value);         p = p->next;     }     return  0; } 值已经被赋值上了。 上面的代码可以打印出0, 1, 3   这个可以啊！ 关键是为啥通过list[0].value的形式，打印不出来呢~ 能不能具体解析一下这里面的工作原理~

user: user-1
content: #include <stdio.h>  struct entry {     int value;     struct entry *next; };   int main(void) {     struct entry list[3] = { {0,&list[1]},{1,&list[2]},{3,0} };      struct entry *p = &list[0];      while (p) {         printf("value = %d\n", p->value);         p = p->next;     }     return  0; } 值已经被赋值上了。 上面的代码可以打印出0, 1, 3

user: user-2
content: 你这样初始化，就是想一口气吃成个胖子，请将数组的各个元素分开来，一个一个赋值

user: user-3
content: #include <stdio.h> struct entry {     int value;     struct entry *next; }; int main() {     struct entry list[3] = { {0,&list[1]},{1,&list[2]},{3,0} };      printf("list[0].next:%p,&list[1]:%p\n",list[0].next,&list[1]);     printf("list[1].next:%p,&list[2]:%p\n",list[1].next,&list[2]);     return 0; } //list[0].next:1043FF38,&list[1]:1043FF38 //list[1].next:1043FF40,&list[2]:1043FF40 //  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！
user-0 提问: 在eclipse CDT 上编写的C程序编译成功但不能运行是怎么回事？

回复:
user: user-1
content: 将 项目、属性、C/C++、附加包含目录：附加头文件所在目录 分号间隔多项 中实际不存在的目录删掉。

user: user-0
content: 虽然有那个警告但是在hello.c上是可以运行的

user: user-0

user: user-0
user-0 提问: 单链表问题

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

user: user-2
content: #include<stdio.h> #include<stdlib.h> //#include<malloc.h> #include<string.h>  typedef struct {     int num;     char name[10];     int score; }student;  typedef struct l_node {     student data;     struct l_node* next; }l_node;  l_node* init(); void outputl_node();  l_node *l = NULL; int main() {     init();     outputl_node(); }  l_node* init() {     l_node* p;     int n;      l = (l_node*)malloc(sizeof(l_node));     l->next = NULL;     printf("输入初始化的人数：\n");     scanf("%d", &n);     for(int i=0;i<n;i++)     {         p = (l_node*)malloc(sizeof(l_node));         printf("请输入第%d位学号:\n", i+1);         scanf("%d",&p->data.num);         printf("请输入第%d位姓名\n", i+1);         scanf("%s", p->data.name);         printf("请输入第%d位分数\n", i+1);         scanf("%d", &p->data.score);         p->next = l->next;         l->next = p;     }     return l; }  void outputl_node() {     l_node* p;     p = l->next;     while (p)     {         printf("学号：");         printf("%d\t",p->data.num);         printf("姓名:");         printf("%s\t",p->data.name);         printf("分数：");         printf("%d\n",p->data.score);         p = p->next;     } }  代码有多处语法错误，如果楼主的编译器不能提示这些错误，建议使用更高版本的编译器。 该单链表是带哨兵的链表，链表建立是采用头插法（相对的是尾插法），即每次新创建的节点都插入链表头前（哨兵后）

user: user-3
content: 因为l这个指针是属于main函数的，在init函数中不可见。请将它改为全局变量，也就是在main函数声明这个l. 另外，init函数请不要在main函数里面声明

user: user-4
content: 引用 2 楼 das白的回复:全局变量 局部变量  函数传递参数 分清全局变量和局部变量 你的l是局部变量 只能在一定范围内用 可以通过函数参数传递 也可以设成全局变量

user: user-4
content: 全局变量 局部变量  函数传递参数

user: user-0
content: 新手，不太懂