Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C的一个题不知道哪出错了

回复:
user: user-0
content: 是个题库的题，就说我全部都错误0分....

user: user-1
content: 没发现什么问题，提示是什么错误？  #include<stdio.h> int main(void) {     int n, num = 0;      printf("请输入测试数据：");     scanf("%d", &n);      while (n != 1)     {         if (n % 2 == 0)         {             n = n / 2;             num++;         }         else         {             n = (3 * n + 1) / 2;             num++;         }         printf("n = %d, num  =%d\n", n, num);     }      printf("%d\n", num);      return 0; }  难道是去掉如下这句就好了？：  printf("请输入测试数据：");
user-0 提问: 麻烦大家看一下这道题，为什么我写的代码会超时呢？一直不输出。

回复:
user: user-1
content: #include<stdio.h> //#include <unistd.h>  int main() {     unsigned long int molecular, denominator;     int num = 3, i = 1, j;     double key, val, sum = 1.0;     scanf("%lf", &key);      val = i*1.0 / num;     while (val > key) {         sum += val;         i++;         molecular = 1;         for (j = 1; j <= i; j++)             molecular *= j;         denominator = 1;         for (j = 0; j < i; j++)             denominator = (num + j * 2) * denominator;         //printf("i = %d, molecular = %lu, denominator = %lu\n", i, molecular, denominator);         val = molecular * 1.0 / denominator;         //sleep(1);     }      printf("pi = %lf\n", (sum+val) * 2);     /*     double pi;double num=3;double tem=1;double sum=1;double k=(tem/num);double i=1;double j=3;     scanf("%lf",&a);     while(k>a)     {         sum=sum+k;         i++;         j=j+2;         num=num*j;         tem=tem*i;      }     pi=sum*2;     printf("%.6lf",pi);     */     return 0;  } 供参考～  楼主的代码逻辑有问题～其中一个是死循环了

user: user-0
content: 引用 2 楼 轻箬笠的回复:k值不会在while里面发生变化，死循环 我明白了 谢谢你

user: user-2
content: k值不会在while里面发生变化，死循环

user: user-0
content: 是不是我写的这个代码有什么错误呀？
user-0 提问: 我在输入scanf后的数据后，输入的year的数字仍然保留在编译器里，如图所示。请问如何在按回车后只显示printf后的东西而不保留scanf的东西

回复:
user: user-1
content: 可以用楼上所说的控制台清屏指令，C语言还有一个不回显输入函数   _getch()  作用同getchar()，区别与前者输入不会显示在控制台窗口中

user: user-2
content: #include<stdio.h> #include <stdlib.h>  int main() {     int year,i,x,out;     scanf("%d", &year);      system("clear");     x = (year-2000)/4;      if (year<=2000||year>2100) {         printf("Invalid year!\n");         return 0;     }     //else{     if (year-2000>4){         for(i=1;i<=x;i++){             out = 2000+i*4;             printf("%d\n",out);         }     }else if(year-2000<4){         printf("None\n");     }     //}      return 0; } vim编辑器使用clear命令就可以实现。 不过，你完全可以加一些换行或者加一些分隔符来区别你的输入和你的输出。
user-0 提问: c语言输出三角形

回复:
user: user-1
content: 每次循环比上次多4个* 你用4个变量存储需要加*的位置的下标  每次加好*之后 2个变量-- 2个变量++ 就可以找到下次需要加 * 的位置了

user: user-1
content: 一个比较简单的思路  你定义一个数组 一开始全部空格  然后每次循环在指定位置赋值为 * 然后输出 就可以了

user: user-2
content: 一个for循环足以，每次循环打印空格打印星打印空格打印星就好了

user: user-3
content: #include <stdio.h>  int main() { 	int N = 4;                                    //行数：4行，可自己定义  	for(int i = 0; i < N; i++) 	{ 		int k = N - i - 1 ;                     //空格控制  		for(int j = 0; j < k; j++)           //左侧空格  		    printf("%c",' '); 		for(int j = 0; j < 2*i+1; j++)    //第一个三角形  		    printf("%c", '*'); 		for(int j = 0; j < k; j++)           //中间偏左空格  		    printf("%c",' '); 		for(int j = 0; j < k; j++)           //中间偏右空格  		    printf("%c",' ');  		for(int j = 0; j < 2*i+1; j++)    //第二个三角形  		    printf("%c",'*'); 		printf("\n");                             //一行结束  	}  	return 0; }

user: user-4
content: 将上图看成星号和空格的组合，找星号数量与空格数量的规律，用for循环运算输出

user: user-5
content: 那就用四个for循环顺序一个嵌套三个分别表示星号和空格。

user: user-0
content: 引用 1 楼 北伊的回复:直接printf啊，没星号空格 题目是要求用for循环输出

user: user-6
content: 直接printf啊，没星号空格
user-0 提问: c 程序 不知道哪里错了！ 求帮看！

回复:
user: user-1
content: 输入格式，要和你代码scanf里面的一样，中英文符搞错了，最好区分的就是中文符号后面会比英文符号多出一段距离，我就是这个方法来区分。 在学校这种vc没有提示的时候的小技巧。

user: user-0
content: 引用 2 楼 636f6c696e 的回复：输入的问题，你输入的是中文逗号，导致b的值输入进来是0，所以必然输出第一个参数对 我也发现了

user: user-2
content: 代码没什么问题，应该是输入的问题，格式有问题，注意逗号中英文要和scanf引号里一致。  也可以用一条调试打印判断一下是不是输入的问题，通过printf在scanf之后把a,b打印一下看看和你的输入的数值是否一致。

user: user-3
content: 输入的问题，你输入的是中文逗号，导致b的值输入进来是0，所以必然输出第一个参数

user: user-4
content: 写成这样试。 if(x>y){     z=x; }else {     z=y; }   或者 z=x; if(y>x) z=y;  或者return x>=y?x:y
user-0 提问: 给大家推荐一个求自守数的小方法

回复:
user: user-0
content: 用求余的算法求10以内的都会余0

user: user-1
content: d初值应该是1吧，而且程序逻辑也有些问题，d=1应该放在循环内部 这程序根本不对吧

user: user-2
content: 引用 2 楼 梦:-千寻´▽; 的回复:[quote=引用 1 楼 自信男孩的回复:]http://c.biancheng.net/view/503.html  网上有一些例子，可以自行参考一下～ 我感觉我的方法更简单一点[/quote] 那为啥不能计算十以内自守数呢

user: user-3
content: 应该是a<d*10吧 这种只是数学上的简化，都谈不上优化了

user: user-4
content: for (long long i = 0, j = 10; i <= 1000000; ++i % j ? 0 : j *= 10)     if (i * i % j == i) printf("%lld\n", i);

user: user-0
content: 引用 1 楼 自信男孩的回复:http://c.biancheng.net/view/503.html  网上有一些例子，可以自行参考一下～ 我感觉我的方法更简单一点

user: user-2
content: http://c.biancheng.net/view/503.html  网上有一些例子，可以自行参考一下～
user-0 提问: 线程中的线程

回复:
user: user-1
content: 学习   学习

user: user-2
content: 如果不加控制，线程运行是随机的，你可以用事件、锁控制线程先后执行顺序

user: user-3
content: 如果不做同步或互斥，那么线程的执行是有调度决定的。对于锁，要看你的锁是做什么的，是放在那个线程里的。建议贴出代码分析问题～

user: user-4
content: 线程之间没有涵盖关系，它们都属于主进程的线程。 锁只对当前的线程起作用。
user-0 提问: Dev c++没有输出结果！各种方法试过 就是没有输出结果！ 求大神解！

回复:
user: user-1
content: 应该对的吧……╮(╯▽╰)╭今天调试代码心情有点急躁(；′⌒`)

user: user-2
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-3
content: 工程当中两个文件， main.c和1.c  项目 - 项目属性 - 文件 这里可以看到有两个文件1.c 和 main.c 这里面有个链接属性，如果不勾选，那么就不会编译链接这个文件    这属于项目下的多文件管理的问题 初学的还是老实的main.c函数里面修改吧。 把1.c的内容都复制到main.c里面去， 删除1.c文件

user: user-4
content: 程序没问题，编译器也应该没问题，可能是编译器与操作系统不兼容所致。解决办法：1.将release mode 改为debug mode;2.换一种编译器，如CodeLite

user: user-5
content: 重新下一个，程序没问题，你的DEV可能在扯拐

user: user-6
content: 引用 8 楼 weixin_45467834的回复:[quote=引用 6 楼 一剑天残 的回复：]一个项目里只能有一个main函数，你删除一个。 如果还是没输出，那个就是编译环境的问题了好的我试试！ 谢谢您！ [/quote] 用`你`吧，我才17岁

user: user-0
content: 引用 6 楼 一剑天残 的回复：一个项目里只能有一个main函数，你删除一个。 如果还是没输出，那个就是编译环境的问题了好的我试试！ 谢谢您！

user: user-0
content: 引用 5 楼 自信男孩 的回复：代码没发现什么问题，要么是环境有问题，要么在return之前加一句getchar();或这system("pause");这个我也加了 都没办法 编译环境我改过一个显示输出的那个 但还是这样

user: user-6
content: 一个项目里只能有一个main函数，你删除一个。 如果还是没输出，那个就是编译环境的问题了

user: user-7
content: 代码没发现什么问题，要么是环境有问题，要么在return之前加一句getchar();或这system("pause");

user: user-0
content: 引用 3 楼 一剑天残 的回复：你那个main.c里面写了什么这是main.c 里的内容！！  #include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) { 	return 0; }

user: user-6
content: 你那个main.c里面写了什么

user: user-8
content: 可以输出的，建议把 DEV C++ IDE 重新下载一遍

user: user-0
content: 引用 16 楼 我本无忧 的回复：那个…我用DEVc++写了和你一模一样的代码，有结果的我环境的问题

user: user-0
content: 引用 13 楼 赵4老师 的回复：Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt谢谢！ 我用虚拟器后能输出了

user: user-9
content: 那个…我用DEVc++写了和你一模一样的代码，有结果的

user: user-0
content: 引用 14 楼 我本无忧 的回复：或许你创建个文件试试？不要创建项目我发现了 环境问题 用虚拟器模拟win7 就能用了

user: user-9
content: 或许你创建个文件试试？不要创建项目

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

user: user-0
content: 引用 11 楼 一剑天残 的回复：抱歉，能力有限我也不知道了好吧 麻烦了
user-0 提问: c语言编译遇到的问题

回复:
user: user-1
content: 程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。  关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 ……

user: user-2
content: 这是环境问题，程序没什么问题。建议检查一下环境，也可以把错误信息在网上搜一下～

user: user-3
content: 程序没问题。环境没搞好

user: user-4
content: 可能是环境没搭好吧。

user: user-5
content: 项目--右键--重新生成. 确保生成成功后再执行.
user-0 提问: 请大佬帮忙看个问题

回复:
user: user-1
content: Testtwo1. C文件需要引用Testhead头文件

user: user-0
content: 引用 1 楼 user-2的回复:你这哪报“makefile.w？已经改变，重新从硬盘读取”了，你这报的不是找不到convert函数么 抱歉，眼花没看到

user: user-2
content: 你这哪报“makefile.w？已经改变，重新从硬盘读取”了，你这报的不是找不到convert函数么
user-0 提问: typedef  char a[10]; a *p; 请问这样p到底是个什么指针啊？p[0]是个啥呢

回复:
user: user-1
content: p是一个指向列数是10的char类型指针。建议通过比较p和p+1地址，已经sizeof(a)和sizeof(*p)来进一步了解p的类型

user: user-2
content: p是指向字符數組首地址的指針吧，我的理解。 這樣理解的話，p[0]就是一個字符數組，有10個元素。

user: user-3
content: 首先a被定义为char [10]类型 a* p；那么p的类型为char(*)[10]； 告诉你一个方法去查看数据的原始类型 需要头文件#include<typeindex> 使用方法如下  #include<iostream> #include<typeindex> using namespace std;  int main() {  	typedef  char a[10]; 	a* p; 	type_index tp(typeid(p)); 	cout<<tp.name(); 	return 0; }

user: user-4
content: a=char[10] 所以p是指向char[10]的指针

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

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

回复:
user: user-1
content: 数组下表是从0开始的，这是C语言的规定。如果下表从1开始，那么0空间要么用作他用，要么就浪费了。

user: user-2
content: 如果数组存储在[1，n]这块空间上（a[0]不用），可以把a[0]赋值为key，然后反向从a[n]开始查找，找到返回下标即可（返回0，说明不存在），很显然那人用的数组结构是将数据存到[1，n]，所以应该从什么地方开始，取决于你自己的结构，可能你的是[0，n)，那你就从0开始
user-0 提问: 用C写了一个简易的学生管理系统，之前运行没问题，不知怎的又一次打开不能运行了，而且也没有报错，这到底是怎么回事呀?求大神们指点迷津

回复:
user: user-1
content: 你一跑起来程序就崩了，设断点调试啊，你这样拍个部分代码的图片别人也不知道是什么呀

user: user-2
content: 建议贴出代码，不要截图，程序可能有问题～

user: user-3
content: 可以先注释掉一部分代码， 先从显示那个菜单入手， 也就是先运行interface 函数
user-0 提问: 请教 哪里有学习C语言的QQ群与微信群

回复:
user: user-1
content: 对，关键是自己去敲，gdb慢慢调，别一遇到问题就问，起码先自己想清楚了再问

user: user-2
content: 兄弟，C有点难操控，但也不难，买本书，随便一本，多写几个杂题，会基本用法就成，不急着往深里去。然后找个小项目小软件进行模仿，边敲边想边学，慢慢就上手的。如果加群了，有什么问题就问，没细心思考的过程，对自己反而不好
user-0 提问: 求大神指点，Windows的安装更新与卸载更新，如何用C语言实现？

回复:
user: user-1
content: SDK了解一下

user: user-2
content: 引用 楼主 MY19890103 的回复:之前一直用  kb.msu /insstall /quiet kb.msu /unistall /quiet 两条简单的批处理命令，但是最近想用C语言实现，但是看了Windows Update Agent API  函数，一头雾水呀？   求大神指点一下，这玩意咋调用呀？  会COM就会玩，也不是特别难
user-0 提问: 链表的逆置问题

回复:
user: user-1
content: 还是直接贴出代码吧，从结果上来看，肯定是链表倒置时有点小问题。

user: user-2
content: 总的来说你没把开始的头节点放在新链表的头部，而是把它留到了最后。

user: user-2
content: 就地倒置你把开始的head节点放在了最后，head节点你肯定没有指定值，所以说这个值是未知的。等你倒置完，打印却从现在开始节点的下一个打印，就漏掉了一个8，而原本的头节点在最后，打印了一个未知的值。
user-0 提问: 蓝桥杯基础题

回复:
user: user-1
content: 说不超过10，00，位是数字的位数比如你说的FFFFFF有6位，这样的数据longlong怎么够呢，要用字符串进行模拟（追根溯源，那些所谓的数值不就是一串符号吗）
user-0 提问: printf没反应！

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

user: user-1
content: 程序员的常识之一：不要将程序源代码或项目或exe放在桌面这种复杂（多半带空格和汉字且在防火墙或杀毒软件严密控制的C盘上）的目录下。

user: user-0
content: 引用 4 楼 赵4老师的回复:[quote=引用 2 楼 weixin_45454627 的回复:] [quote=引用 1 楼 赵4老师的回复:]现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 你好，你说的进入cmd执行我知道的，我不明白的是用Dev-C++或Visual执行程序后在Windows10上结果和Windows7上不一样[/quote] 当前文件夹不同 64位/32位不同 使用的编译器链接器不同 依赖的dll及其版本号不同 ……[/quote] 你好，那我应该怎么解决这个问题呢？

user: user-1
content: 引用 2 楼 weixin_45454627 的回复:[quote=引用 1 楼 赵4老师的回复:]现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 你好，你说的进入cmd执行我知道的，我不明白的是用Dev-C++或Visual执行程序后在Windows10上结果和Windows7上不一样[/quote] 当前文件夹不同 64位/32位不同 使用的编译器链接器不同 依赖的dll及其版本号不同 ……

user: user-2
content: 闪过  在printf后面加个 getchar  或者 system("pause")

user: user-0
content: 引用 1 楼 赵4老师的回复:现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 你好，你说的进入cmd执行我知道的，我不明白的是用Dev-C++或Visual执行程序后在Windows10上结果和Windows7上不一样

user: user-1
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！
user-0 提问: 被scanf折腾的死去活来！

回复:
user: user-1
content: printf("input Age%d\n",i+1"); 这种都多了个引号

user: user-1
content: 你这程序编译的过么？

user: user-0
content: 年过40，不转型不行了，电脑程序学起来真费劲。

user: user-0
content: 引用 3 楼 user-1的回复:printf("input Age%d\n",i+1"); 这种都多了个引号 已发现问题，谢谢啊！
user-0 提问: PAT1088三人行  测试点四答案错误  求大佬改正

回复:
user: user-1
content: compare函数的参数也需要用double https://blog.csdn.net/qq_40946921/article/details/82658295  #include<stdio.h>  #include<math.h> int compare(double a,double b)  { if(a==b) printf("Ping"); if(a<b)  printf("Cong"); if(a>b)  printf("Gai"); } int main() { int m,n,i,a,b,ni; double sum,c; scanf("%d%d%d",&ni,&m,&n); /*if(m==0||n==0)  {printf("No Solution\n");  return 0;      }*/  for(i=99;i>=10;i--) {     a=i%10; b=i/10; sum=a*10+b; if(m!=0)     c=(double)abs(i-sum)*1.0/m;     if(c!=0)      { if(sum/c==n)  {    //	printf("%d %f %d\n",i,sum,c);    printf("%d ",i);    compare(ni,i);    printf(" ");    compare(ni,sum);    printf(" ");    compare(ni,c); break; }     	} } if(i==9) printf("No Solution\n"); }

user: user-0
content: 引用 1 楼 user-1的回复:compare函数的参数也需要用double https://blog.csdn.net/qq_40946921/article/details/82658295  #include<stdio.h>  #include<math.h> int compare(double a,double b)  { if(a==b) printf("Ping"); if(a<b)  printf("Cong"); if(a>b)  printf("Gai"); } int main() { int m,n,i,a,b,ni; double sum,c; scanf("%d%d%d",&ni,&m,&n); /*if(m==0||n==0)  {printf("No Solution\n");  return 0;      }*/  for(i=99;i>=10;i--) {     a=i%10; b=i/10; sum=a*10+b; if(m!=0)     c=(double)abs(i-sum)*1.0/m;     if(c!=0)      { if(sum/c==n)  {    //	printf("%d %f %d\n",i,sum,c);    printf("%d ",i);    compare(ni,i);    printf(" ");    compare(ni,sum);    printf(" ");    compare(ni,c); break; }     	} } if(i==9) printf("No Solution\n"); }  感谢大佬
user-0 提问: 请问有人能解释为啥是b吗

回复:
user: user-1
content: 有时间和精力多研究和学习其他的知识，像这类习题建议可以抛弃了，研究这个是要学习怎么用吗？如果不是，也建议你不要写这样的代码，否则会被别人骂的。

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

user: user-3
content: 百度序列点你就能知道这种垃圾代码的结果未定义行为  或许题目的考点是printf参数从右到左计算，所以分割运算为： j--;   输出10，但j变为9 ++i+j++ 输出11 + 9 = 20 所以输出是20,10

user: user-4
content: 我认为应该抵制这种题目，真的没有意义。谁开发会这样写？

user: user-5
content: 你确认答案是b吗？ vs下运行你的代码得出  21, 10  j--  j++ 都在整条语句结束后才增减吧

user: user-6
content: 先算后面 j-- 了，j=9，然后++i+j++=20
user-0 提问: c语言表达式求值

回复:
user: user-0
content: 邀请大佬解答： https://bbs.csdn.net/topics/394784884

user: user-1
content: printf("%d\n", a=a+++1); 这样的代码写在工程里会被别人骂的

user: user-2
content: 一个序列点对同一变量多次赋值是未定义行为，结果不可预期 死钻牛角尖没有意义

user: user-3
content: 关于C,C++表达式求值顺序 http://blog.csdn.net/fefe82/article/details/37833767，http://bbs.csdn.net/topics/370153775
user-0 提问: 误删了点东西，就这样了，新写的不能执行，以前的就会出现第二张图的情况，该怎么办？

回复:
user: user-1
content: 修复一下编译器，如果你删的编译器的一些东西。

user: user-2
content: 改项目名称了吧，一个是Project4一个是Project16，建议新建个项目试试
user-0 提问: 关于Python2.7.13不能识别“（）“的问题，

回复:
user: user-0
content: 引用 3 楼 kuangbao9的回复:如果是英文括号，中间有没有空格或者有几个空格都不会有错的。 看着更像是输入的不是英文字符 我试了一下，就是中文括号的问题，

user: user-0
content: 引用 2 楼 insisted_search的回复:你写的括号是中文的吧？？？？？ 我试了一下，输入是中文的括号的问题

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

user: user-2
content: 如果是英文括号，中间有没有空格或者有几个空格都不会有错的。 看着更像是输入的不是英文字符

user: user-3
content: 你写的括号是中文的吧？？？？？

user: user-1
content: 多 了无谓的空格吧
user-0 提问: 求问这段全排列代码有问题吗？

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

回复:
user: user-0
content: OK ，调试成功

user: user-1
content: 1、函数要先定义再调用，或者先声明，后面再定义，调用时就无所谓定义的先后顺序，函数的声明要在main函数之外，但是你声明在main内部了。 2、你是要计算（a^2）! + (b^2)!,还是要调用a! + b!. 3、你的square没有使用return返回值。 4、main函数中调用square也没有将值赋给s

user: user-2
content: square()函数没有返回值，而且square()里调用的factorial()没有被声明 把main里面的两个函数声明提到main前面，square添加返回值

user: user-3
content: 你设个long 函数为什么不给返回值
user-0 提问: C语言中运行到fprintf函数就报程序已停止运行

回复:
user: user-1
content: 为了验证，你可以试试在结构里加一个short padding，其它代码保持原样，跑一下看看。   typedef struct {     short tiyu;     short padding; }

user: user-1
content: 引用 3 楼 SHI家的鱼 的回复:[quote=引用 1 楼 weixin_45444699 的回复:] short 类型对应的是 %hd。所以你在scanf 和sprintf 时都使用%hd 就行了。  我知道scanf 和sprintf 时都使用%hd 就行了，但是我想知道 scanf("%d",&stu.tiyu); 这样用会发生错误的原因是什么[/quote]  因为short的长度是两个字节，而一般情况下int是4个字节长度。所以student在结构体也是4个字节长度。 当你用%d时，scanf抓了一个4字节长度的int写到了2个字节长度的结构体student里，造成了2个字节的溢出。那这溢出的两个字节的溢出去哪里了呢？很有可能就写到了FP文件指针里。因为你这个文件指针就声明在student结构体变量的后面，编译器有极大可能把两个安排在紧挨着的内存位置里了。所以一旦结构体溢出了，文件结构体就会被复写，被污染了。造成了文件写入错误。  上述这些是建立在你编译器规定int长度是4字节的情况下，某些编译器会规定int为2字节（如很多arm单片机里），和short一样，就不会有这个问题了。

user: user-0
content: 引用 1 楼 weixin_45444699 的回复:short 类型对应的是 %hd。所以你在scanf 和sprintf 时都使用%hd 就行了。  我知道scanf 和sprintf 时都使用%hd 就行了，但是我想知道 scanf("%d",&stu.tiyu); 这样用会发生错误的原因是什么

user: user-2
content: 本地运行没有问题，理论上short用%d输入输出也不会出现异常

user: user-1
content: short 类型对应的是 %hd。所以你在scanf 和sprintf 时都使用%hd 就行了。

user: user-3
content: 要会单步调试，加断点调试，看看内存情况就知道了 应该是sscanf越界了，%d是4个字节，但是你结构体只有2个字节，把0复制给了fd，然后就出错了

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

user: user-5
content: 引用 3 楼 SHI家的鱼 的回复:[quote=引用 1 楼 weixin_45444699 的回复:] short 类型对应的是 %hd。所以你在scanf 和sprintf 时都使用%hd 就行了。  我知道scanf 和sprintf 时都使用%hd 就行了，但是我想知道 scanf("%d",&stu.tiyu); 这样用会发生错误的原因是什么[/quote] 只要输入的数据值不超过short的取值范围都不会有问题，如果超出了short的取值范围，会出现输入的值和存到stu.tiyu的值不一致， 其实相当于截断了。因为tiyu这个变量存不下这么大的值。  但是不论怎么样（超出范围和不超出范围）的输入都不会让程序崩了。并且fprintf而不会有问题，程序如果是崩了建议查查其他原因

user: user-4
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。
user-0 提问: 同样的程序在Windows下没出过问题，在Linux下偶发性崩溃，我自己也快崩溃了

回复:
user: user-0
content: 引用 2 楼 user-1 的回复：典型的踩内存问题 把linux的内存管理结构踩了，就会出现这个异常 windows不出不代表windows没问题越界了，导致后边的程序申请空间的时候发生崩溃。Windows 确实没有这个问题，是在不同平台基础类型大小不一样导致的。空间分大点就好了。

user: user-1
content: 典型的踩内存问题 把linux的内存管理结构踩了，就会出现这个异常 windows不出不代表windows没问题

user: user-0
content: 早就解决了，反正没人回帖，结了。
user-0 提问: 关于for嵌套

回复:
user: user-1
content: 引用 2 楼 user-4 的回复:别的不说这代码真的写的很垃圾，没有缩进可读性太差了，就会楼主这样的问题 要求太高了，谁没有写过垃圾代码的时候？可以先问问自己～

user: user-2
content: for循环还是带花括号吧  要不然 你都不知写了些什么

user: user-3
content: 求质数就是要用穷举法，在边界内a%b==0（非质数）则跳出循环，否则超出边界则认为这个数是质数。 第一个：b<(a/b)是穷举的边界；第二个：b>(a/b)是循环内第一个超出边界的情况，循环必定会自动跳出的。  穷举质数还是需要优化一下，比如：除了2，其他偶数都不可能是质数，所以没必要每个数都判断一遍，只要判断奇数就可以了。

user: user-4
content: 别的不说这代码真的写的很垃圾，没有缩进可读性太差了，就会楼主这样的问题

user: user-0
content: 已经知道了 谢谢大佬
user-0 提问: 算法

回复:
user: user-1
content: 先把每个数据集排序，使每个数据集都是有序数列。 然后再取其中一个数据集的数据与其他的比较，因为有序所有比大小就可以了，应该会快些。  应该还会有更好办法，暂时就想到这么多。
user-0 提问: 求助大佬，input函数怎么与后面函数联系，试了几次都出错了

回复:
user: user-1
content: input函数定义i后面几个逗号是啥意思？还有输入scanf里面用浮点型来输入int型？

user: user-0
content: 感谢大神的回复，非常感谢

user: user-2
content: #include<stdio.h>  void input(int m,int n); void average1(int str1[][5],int m,int n); void average2(int str1[][5],int m,int n); void average3(int str1[][5],int m,int n);  int str[3][5]; int main() {     input(3,5);     printf("每个学生的平均成绩\n");     average1(str,3,5);     printf("每门课的平均成绩\n");     average2(str,3,5);     average3(str,3,5);      return 0; }  void input(int m,int n) {     int i,j;      for(i=0;i<m;i++)         for(j=0;j<n;j++)             //scanf("%f",&str[i][j]);             scanf("%d", &str[i][j]); }  void average1(int str1[][5],int m,int n)//单个学生的平均成绩 {     int k, l;      for(k=0;k<m;k++)     {         float sum=0, a;         for(l=0;l<n;l++)             sum += str1[k][l];         a = sum / n;          printf("%f\n",a);     } } void average2(int str1[][5],int m,int n)//单门课的平均成绩 {     int i,j;     float average2;     for(j=0;j<n;j++)     {         float sum=0;         for(i=0;i<m;i++)             sum+=str1[i][j];         average2 = sum/m;         printf("%f\n", average2);     } }  void average3(int str1[][5],int m,int n) {     int max=str1[0][0];     int p,k,i,j;     for(i=0;i<10;i++)     {         for(j=0;j<5;j++)             if(str1[i][j]>max) {                 max=str1[i][j];                 k=i+1;                 p=j+1;             }     }     printf("最高分对应的学生和课程\n");     printf("max=%d,k=%d,p=%d\n",max,k,p); }  供参考～

user: user-0
content: 定义input第一行是int i,j;🙃
user-0 提问: 关于将非指针数据类型强制转换为指针类型

回复:
user: user-1
content: 浮点数格式 http://bbs.csdn.net/topics/390676437  电脑内存或文件内容或传输内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容或传输内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-2
content: 引用 8 楼 DiuDiuZ 的回复:[quote=引用 7 楼 gouyanfen的回复:]因为，char是一个字节，编译器强转为四字节的时候，会把char作为低位转换，有固定的规则，float比int 占字节数大，所以编译无法确定你的意图，只能报错。你这个问题没有实际意义，如果你float的数字确实为一个真实的指针地址，你可以先转为int再转为指针。 内存中都是二制进，但是得明确转换规则 int跟float都是占四个字节，我觉得应该是将int转换为int*那么地址值跟int变量的值一样，但将float转换为int*的话，地址值不为float变量的值，所以编译器会报错[/quote] 上面我说错了，32位系统中float和int占位一样，但是在内存中的表示方法是不一样的

user: user-0
content: 引用 7 楼 gouyanfen的回复:因为，char是一个字节，编译器强转为四字节的时候，会把char作为低位转换，有固定的规则，float比int 占字节数大，所以编译无法确定你的意图，只能报错。你这个问题没有实际意义，如果你float的数字确实为一个真实的指针地址，你可以先转为int再转为指针。 内存中都是二制进，但是得明确转换规则 int跟float都是占四个字节，我觉得应该是将int转换为int*那么地址值跟int变量的值一样，但将float转换为int*的话，地址值不为float变量的值，所以编译器会报错

user: user-2
content: 因为，char是一个字节，编译器强转为四字节的时候，会把char作为低位转换，有固定的规则，float比int 占字节数大，所以编译无法确定你的意图，只能报错。你这个问题没有实际意义，如果你float的数字确实为一个真实的指针地址，你可以先转为int再转为指针。 内存中都是二制进，但是得明确转换规则

user: user-3
content: 32位下,int和float虽然都是4个字节，但是其存放的二进制数据是不同的； char是1个字节，值内容：0~255，而int能够表示0-255的值； 在实际应用中Waring都要去除，否则程序运行起来会各种坑；

user: user-0
content: 引用 4 楼 636f6c696e的回复:因为指针本质上就是一个数字，所以int转编译器不会直接报错 那为啥将float类型转为int *会报错呢吗，数据本质在内存不都是以二进制形式存在吗。

user: user-4
content: 因为指针本质上就是一个数字，所以int转编译器不会直接报错

user: user-0
content: 引用 2 楼 niebo_bar的回复:浮点类型的数据长度和整形不同 32位下不都是四个字节吗，只是解析方式不一样 那为什么下面的char型转换时只是给了warning

user: user-5
content: 浮点类型的数据长度和整形不同

user: user-6
content: 后面已经给出错误的原因了
user-0 提问: 参数传递到函数后变了，请大神指点！

回复:
user: user-1
content: 字符数组作为函数入参退化成字符指针 引用 2 楼 yuford 的回复:我现在修改了一下，可还是一样，simccid的值是simccid，simcimi连在一起的。  void DHT11_Upload(char simccid[],char simcimi[],char flag) {         float tem,hum;  	update(simccid,simcimi,flag,tem,hum);			 } void update(char sim_ccid[],char sim_cimi[],char flag,float tem, float hum) {         sim_ccid的值是sim_ccid，sim_cimi连在一起的。 }

user: user-2
content: 另一种解决方法是在使用sprintf是限定死每个字符串的长度：      sprintf(upload, "update;%20.20s;%15.15s;%s;%.1f;%.1f", SIM_CCID, SIM_CIMI, flag, tem, hum);   如果每回这两个字符串都是长度固定的话。

user: user-2
content: 值得注意的是，C里面通过函数参数传递的不是字符串，而是字符串（数组）头的地址，它并不能传递这个字符串有多长。 根据题主提供的代码，你是想打印出这两个字符串的内容到upload里。当前你打印出来的就会和watch里显示的一样：  - SIM_CCID 会显示成SIM_CCID和SIM_CIMI合并的样子 - SIM_CIMI 则会正常显示  原因我上面刚解释过了。  现在说说解决办法，就是规定SIM_CCID和SIM_CIMI两个字符串是预留多一位长度给休止符，就是：  char SIM_CCID[21], SIM_CIMI[16]

user: user-2
content: 本身代码没问题，这个只是在debug时，watch栏里面显示的造成的误解。 上面的SIM_CCID是以char[20]格式，即限定了长度为20字节的数组显示的；而下面的SIM_CCID只是作为一个char的指针，在watch里就会显示出以此地址为头的字符串，它会一直显示到休止符0x00('\0')为止。 正好SIM_CIMI这个字符串的启示位置被分派到了SIM_CCID字符串末尾的后一位，正好衔接上了，不存在一个休止符分割分割两个字符串。所以从debugger的角度观察，从0x2000005C为头的这个字符串就是上述两个字符串合并的样子。

user: user-0
content: 我现在修改了一下，可还是一样，simccid的值是simccid，simcimi连在一起的。  void DHT11_Upload(char simccid[],char simcimi[],char flag) {         float tem,hum;  	update(simccid,simcimi,flag,tem,hum);			 } void update(char sim_ccid[],char sim_cimi[],char flag,float tem, float hum) {         sim_ccid的值是sim_ccid，sim_cimi连在一起的。 }

user: user-1
content: 你本来SIM_CCID定义的就不是字符串，没有截止符，只是字符数组。 所以char数组查看就是那数组长度的20个字节，如果用char*查看就是按照字符串的方式查看就会连接起来。
user-0 提问: (char *)&p在C语言里表示什么？

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

user: user-2
content: 这是强行转化，楼主自己已经知道 至于为什么要这样转化，没有上下文，不好说 但是，如果是用于通信，就比较好理解，因为通信都是按字节发送接收的，所以发送方把结构体都转成char*来送信，接收收到后再把char*转为相应的结构体。

user: user-3
content: 引用 楼主 qq_24830523 的回复:(char *)&p，哪位大佬解释一下原理，为什么要用char,为什么不用别的，这样强转后表示什么？ 没有前后逻辑就让别人为什么。
user-0 提问: 问一个简单的问题，刚学不太懂。谢谢。

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

user: user-2
content: 括号中的逗号运算符是从左到右，直到取最后结果，b++为5，加上a就是8了。

user: user-3
content: 逗号运算符是把最后一个表达式的值赋值给c，但是前面的表达式也是计算的。所以是a+b=3+5=8

user: user-0
content: 感谢各位的解答，谢谢。

user: user-4
content: 是的啊，取括号最右边结果

user: user-0
content: 引用 1 楼 北伊的回复:b++b的值就变成了5，a+b=3+5=8 不是b++先计算后加嘛

user: user-4
content: b++b的值就变成了5，a+b=3+5=8
user-0 提问: float参数的转换

回复:
user: user-1
content: 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 这是哪一本书上讲的？ 很少见有对这个事情做解释的啊！  c语言当中，传递到函数里面的都是具体数值，而不是变量的本身， 参数是放到栈里面进行传递的 那么每个参数在栈里面的位置和大小就是个问题 函数可以根据参数的类型来计算参数的位置 现在的问题是，如果参数的类型和传递的类型大小不一样会如何  在固定参数的函数当中，编译器会检查他，发现这种情况会报错 但是不固定长参数怎么办，这就是个问题 楼主的那个图很好的解释了float（32bits）和double（64bits）都是统一按照double类型来入栈，这样就能解决这个问题  举个例子，大家可以在自己的编译器里面测试一下 char ch='A'; int   n = 123; printf("float:%f   int:%d",  c,  n);  // 编译器会这里给出警告，%f和c的不匹配，忽略它去执行看看会发生什么 c没有正确输出这个可以理解，  但是，但是，你会发现n也没有正确输出 不同的编译器也许执行结果不一样 可以理解， 因为格式指定了参数之间的位置关系， 入栈的格式不匹配，后续的参数定位出了问题  scanf里面这个问题不会明显，因为参数都是指针， 只是在对指针指向的地址放数据的时候，会因为格式不同而破坏数据 但是对scanf函数的参数之间不会有影响  这样的问题在不固定长度的函数参数里面应该都会有体现

user: user-3
content: 这是规定的，scanf 之流 和 printf 之流就是不一样的。如果你觉得记起来比较烦，可以像 4 楼那样记，因为现在的 C 语言也接受 printf 给 %lf (与 %f 完全等价)。

user: user-4
content: 浮点数后面加话个f就可以了

user: user-5
content: printf 中参数float 会转换为double入栈  这句话的意思的 float 和 double 都是入栈 8 字节 printf 解析格式控制字符%f 会从栈里面读取8个字节的数据 作为一个double输出 所以 printf 没有针对 float的格式控制符  %f是针对double的  而scanf情况不一样  %f 还是 %lf 对应的参数都是指针 都是读取4个字节的数据  但是后面的处理有区别 %f 对应float 会向指定的内存写入 4个字节的数据  %lf 对应 double 回向指定的内存写入 8个字节的数据  因为写入字节不同 所以 %f 和 %lf 不能混用  备注 类型大小不固定 这个回答中的类型大小仅供参考

user: user-6
content: 小转大是可以的，大转小是不可以的

user: user-0
content: 引用 1 楼 自信男孩 的回复：%f也是可以的，可以看一下C标准，double也用%f。为何书中说float没有转换说明呢？难道不是%f？

user: user-7
content: float是f，double是lf.

user: user-8
content: %f也是可以的，可以看一下C标准，double也用%f。
user-0 提问: 我是初学者，请问为什么我写的这个代码当i=0时不输出呢？正确应输出40啊

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

user: user-0
content: 引用 1 楼 自信男孩的回复:#include<stdio.h>  int main() {     int i;int x,y;     int a[101]={};int b[101]={};      while(2 == scanf("%d %d",&x,&y))     {         a[x] = y;         if(x==0)         {             break;         }      }     while(2 == scanf("%d %d",&x,&y))     {         b[x] = y;         if(x==0)         {             break;         }      }     for(i=0;i<101;i++) {          a[i]=a[i]+b[i];      }     for(i=100;i>=0;i--)     {         if(i!=1&&i!=0)          {             if(a[i]>0)             {                 printf("%dx%d+",a[i],i);             }         }         if(i==1)         {             if(a[i]>0)             {                 printf("%dx+",a[i]);             }         }         if(i==0)         {             if(a[i]>0)             {                 printf("%d",a[i]);             }         }     }     putchar(10);       return 0; } 供参考～ 之所以不出现40，是因为输入的时候没有把20赋值给a, b，在判断x为0时已经break循环了。 上面的代码做了修改，改成先赋值后break，得到你想要的结果～ 谢谢！我明白啦！不过我这个程序还是缺少几种情况！我终于改好啦！

user: user-2
content: #include<stdio.h>  int main() {     int i;int x,y;     int a[101]={};int b[101]={};      while(2 == scanf("%d %d",&x,&y))     {         a[x] = y;         if(x==0)         {             break;         }      }     while(2 == scanf("%d %d",&x,&y))     {         b[x] = y;         if(x==0)         {             break;         }      }     for(i=0;i<101;i++) {          a[i]=a[i]+b[i];      }     for(i=100;i>=0;i--)     {         if(i!=1&&i!=0)          {             if(a[i]>0)             {                 printf("%dx%d+",a[i],i);             }         }         if(i==1)         {             if(a[i]>0)             {                 printf("%dx+",a[i]);             }         }         if(i==0)         {             if(a[i]>0)             {                 printf("%d",a[i]);             }         }     }     putchar(10);       return 0; } 供参考～ 之所以不出现40，是因为输入的时候没有把20赋值给a, b，在判断x为0时已经break循环了。 上面的代码做了修改，改成先赋值后break，得到你想要的结果～
user-0 提问: 第十天

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

user: user-2
content: 洗牌功能没写好

user: user-3
content: 这洗牌写得不够随机
user-0 提问: c语言编程练习题老是答案错误呜呜呜

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

user: user-0
content: 引用 1 楼 user-2的回复:直接开行列都多两行嘛，4行4列就开6行6列，存中间，边上一圈都存点就行了，这样判断的时候就不用分那么多类了，反正你输出的时候把*单独拎出来了，遇到*直接就9个格都加一，输出的时候从i=1;j=1开始就行了 终于正确啦，我明白了，这样我就不用考虑数组会不够用，也就不需要分情况了，简便很多啊，谢啦

user: user-2
content: emmm,应该只要换一行就行了吧，我也没看题目

user: user-2
content: 而且你\n多了个

user: user-2
content: 直接开行列都多两行嘛，4行4列就开6行6列，存中间，边上一圈都存点就行了，这样判断的时候就不用分那么多类了，反正你输出的时候把*单独拎出来了，遇到*直接就9个格都加一，输出的时候从i=1;j=1开始就行了
user-0 提问: 求解

回复:
user: user-1
content: 单词拼写错误是main，不是mian。看一下你用的是哪个？ 另外,scanf("%d", &num);不是scanf("%d,&num");  自己检查一下  看样子你写的代码不够多，像main函数基本上每次都写，这都能把单词拼写错误，问题很多呀 多练，多调试吧

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: 引用 3 楼 liujunyun_nj的回复:1. main函数拼写错误； 2. scanf参数错误； 3. if 语句的判断条件，算你是错的 书上是这样判断的，而且讲解的时候if右边写个判断的东西在用printf显示如果错直接进入else在的。

user: user-3
content: 之前运行的窗口没有关闭
user-0 提问: c语言的问题（输出时莫名其妙多了‘%’）

回复:
user: user-1
content: 通过查ascii码对应表，'#'对应的十进制是35，'%'对应的十进制是37，这样就可以理解为什么输出的是%了

user: user-2
content: %就是你输入的#啊 在while处判断已经晚了，因为你前面ch2=ch+2; 已经改变了字符了。 你需要在刚输入完成后判断。 并且ch2=ch+2;之前也要判断，是不是要转换的字母啊。
user-0 提问: 用spy++查看QQ窗口，为什么聊天窗口和QQ窗口没关系？

回复:
user: user-1
content: spy++是开源的。

user: user-2
content: 引用 15 楼 六道佩恩 的回复:[quote=引用 14 楼 gouyanfen 的回复:] DirectUI父窗口有消息处理线程的，取得消息之后，他会根据应用程序管理的自绘对象，再决定发什么消息给控件，这时己经改变了消息的结构和定义了 我仔细思考了你的方法，我说下我的理解，麻烦你看下是不是这样： 1. 自己拟定控件类只是把类名和对应的处理函数联系起来 2. 类似的创建窗口，其实只是在父窗口中画画 3. 父窗口捕获到鼠标的移动和点击后，根据计算得出当前鼠标所点击的区域属于哪个“控件”，然后调用对应的处理函数来处理 4. “控件”知道被点击后，通过计算自己的坐标和大小，于是在对应的区域重新绘画。[/quote] 3和4都一样，把对应转换的消息发给控件类，控件类自行回调

user: user-0
content: 引用 14 楼 gouyanfen 的回复:DirectUI父窗口有消息处理线程的，取得消息之后，他会根据应用程序管理的自绘对象，再决定发什么消息给控件，这时己经改变了消息的结构和定义了 我仔细思考了你的方法，我说下我的理解，麻烦你看下是不是这样： 1. 自己拟定控件类只是把类名和对应的处理函数联系起来 2. 类似的创建窗口，其实只是在父窗口中画画 3. 父窗口捕获到鼠标的移动和点击后，根据计算得出当前鼠标所点击的区域属于哪个“控件”，然后调用对应的处理函数来处理 4. “控件”知道被点击后，通过计算自己的坐标和大小，于是在对应的区域重新绘画。

user: user-2
content: DirectUI父窗口有消息处理线程的，取得消息之后，他会根据应用程序管理的自绘对象，再决定发什么消息给控件，这时己经改变了消息的结构和定义了

user: user-0
content: 引用 12 楼 gouyanfen 的回复:1.HWND是HANDLE,但HANDLE不是HWND 2.不需要 3.这个需要看自绘控件的消息处理 这方面的，你可以参考一下DuiLib的说明看一下 请问，它如何知道鼠标点击了它或鼠标悬停？不通过消息机制的话，是循环读取鼠标驱动反馈的坐标吗？

user: user-2
content: 1.HWND是HANDLE,但HANDLE不是HWND 2.不需要 3.这个需要看自绘控件的消息处理 这方面的，你可以参考一下DuiLib的说明看一下

user: user-0
content: 引用 9 楼 gouyanfen 的回复:消息机制你从那里看的是以窗口为单位的？是HWND,HWND是系统管理的句柄对象，只要是这个对象的都可以,就拿游戏来说，很多根本就不会处理你说的这些消息，像QQ这种软件，安全工作更是重中之重，所有用到的类重写又没有多难，窗口直接画在屏幕上的，当然windows的窗口类也是画在屏幕上的，只不过他是系统画的，有统一的接口，自绘控件也是控件，你得跳出原来的思维方式，windows消息机制也是建立在内核之上的，最终也是和硬件打交道的，如果你写的软件直接和硬件打交道，一样也可以跳过windows消息机制。 你可以再去研究研究消息机制，系统内核管理，然后分发，UI线取到属于自己的消息后，然后发给控件，控件自己有消息处理的回调，然后处理对应的消息。 我有几个问题能麻烦你确认下吗： 1. 你确定是HWND不是HANDLE吗？HWND不就是窗口句柄吗？ 2. 对于他们自制的控件类，需要注册吗？ 3. 它们的控件是独立的窗口过程来相应，还是在主窗口中根据鼠标的坐标和点击动作来做出相应的反应？

user: user-3
content: 现在很多软件都采用DirectUI开发理念，其主要的思想就是主窗口有句柄HWND，但是子控件Button List 等等都是无窗口句柄的，因为全是自绘的，使用Spy++无法抓取控件的HWND。 子窗口不以窗口句柄的形式创建，只是逻辑上的窗口，绘制在父窗口之上。 可以到网上看看，有开源的

user: user-2
content: 消息机制你从那里看的是以窗口为单位的？是HWND,HWND是系统管理的句柄对象，只要是这个对象的都可以,就拿游戏来说，很多根本就不会处理你说的这些消息，像QQ这种软件，安全工作更是重中之重，所有用到的类重写又没有多难，窗口直接画在屏幕上的，当然windows的窗口类也是画在屏幕上的，只不过他是系统画的，有统一的接口，自绘控件也是控件，你得跳出原来的思维方式，windows消息机制也是建立在内核之上的，最终也是和硬件打交道的，如果你写的软件直接和硬件打交道，一样也可以跳过windows消息机制。 你可以再去研究研究消息机制，系统内核管理，然后分发，UI线取到属于自己的消息后，然后发给控件，控件自己有消息处理的回调，然后处理对应的消息。

user: user-0
content: 引用 3 楼 gouyanfen 的回复:为什么一定要是窗口类？开个线程自建消息循环也是可以的 我可以详细问下吗，你说的这个“不是窗口类”是指那些？这个消息循环应该还是windows的消息机制吧，这个消息机制不是以窗口为单位发生事件的吗？我觉得打开的聊天窗口这种应该是窗口吧？你说是多个好友在一个聊天窗口里或者QQ窗口中的好友列表那种吗？

user: user-2
content: 检测工具也是根据预定的接口去判断的，接口不一样，怎么检测，只有你去手工检测了，分析接口，想用原来窗口管理的那套方法，子类超类化什么的，还有从消息去判断的，不用去想了,是不可能的，数据接口都不一样

user: user-0
content: 引用 5 楼 user-4 的回复:大公司一般都自己做的控件类，不会用MS提供的接口创建的 它们做的这些控件，能算窗口吗？能被检测出窗口吗？

user: user-4
content: 大公司一般都自己做的控件类，不会用MS提供的接口创建的

user: user-2
content: 引用 3 楼 gouyanfen 的回复:[quote=引用 2 楼 六道佩恩 的回复:] [quote=引用 1 楼 gouyanfen 的回复:] 因为他不是窗口控件，全自绘的 额，你确定跟全自绘有关系吗？它至少是窗口吧，是窗口的话，那么得注册窗口类吧，得CreateWindow创建窗口吧。。。[/quote] 为什么一定要是窗口类？开个线程自建消息循环也是可以的[/quote] 研究别人的软件，思维放开放一点，不要局限于MS给你的知识框架

user: user-2
content: 引用 2 楼 六道佩恩 的回复:[quote=引用 1 楼 gouyanfen 的回复:] 因为他不是窗口控件，全自绘的 额，你确定跟全自绘有关系吗？它至少是窗口吧，是窗口的话，那么得注册窗口类吧，得CreateWindow创建窗口吧。。。[/quote] 为什么一定要是窗口类？开个线程自建消息循环也是可以的

user: user-0
content: 引用 1 楼 gouyanfen 的回复:因为他不是窗口控件，全自绘的 额，你确定跟全自绘有关系吗？它至少是窗口吧，是窗口的话，那么得注册窗口类吧，得CreateWindow创建窗口吧。。。

user: user-2
content: 因为他不是窗口控件，全自绘的
user-0 提问: 怎样用c++来实现 printf("%.2X）这种类型的语句呢

回复:
user: user-1
content: 使用vsprintf来实现即可

user: user-2
content: printf("%.2X）  printf是C++函数 如假包换

user: user-3
content: 了解下iomanip库

user: user-0
content: 感谢！

user: user-0
content: cout<<setiosflags(ios::fixed)<<setprecision(2);         cout<<hex<<p[3]; 请问为什么我用这一类语句无法实现标题中代码的功能呢

user: user-4
content: 乍看起来c++的cin、cout、ifstream、ofstream、istringstream、ostringstream在输入、输出上比c的scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf简单，不用格式控制符！ 但是不用格式控制符，输入输出恰好是你期望的格式的时候好说；等到输入输出不是你期望的格式的时候，你就会觉得还是用格式控制符更方便、更靠谱。 摒弃cin、cout、ifstream、ofstream、istringstream、ostringstream！ 使用scanf、printf、fscanf、fprintf、fread、fwrite、sscanf、sprintf。

user: user-4
content: http://www.cplusplus.com/reference/ios/ios_base/fmtflags/
user-0 提问: float a[4]={1.2,2.4,3.7,-1.5};

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

user: user-2
content: p是指向列数是4个二维数组，而a是一位数组，所以

user: user-3
content: 百度搜索 数组指针
user-0 提问: 生成随机数放到数组的一个问题，如何让随机数不重复？

回复:
user: user-0
content: 引用 2 楼 待续_1006的回复:代码我没看，如果要做到你标题的这个要求 生成随机数放到数组的一个问题，如何让随机数不重复？ 第二次在生成随机数放到数组保存之前，先循环遍历这个随机数是否在数组中已经存在，如果存在则放弃，开始下一次循环，否则存入数据！ 嗯嗯 那个已经考虑到了，是srand种子的位置没写对，谢谢您！

user: user-0
content: 引用 1 楼 yunate的回复:尝试把srand((unsigned)(time(0)));放到循环外面。另外可以试试这个 bool GetRandNum(int min, int max, int & out) {     if (max < min)     {         return false;     }      unsigned int tmp = 0;      if (rand_s(&tmp) != 0)     {         return false;     }      out = tmp % (max - min + 1) + min;     return true; } 谢谢！为什么srand放在循环里不可以呢？然后的话，下面这个代码是啥意思啊...?

user: user-1
content: 随机必然有重复，所谓“不重复的随机”实际上是洗牌。洗牌算法参考下面： #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

user: user-2
content: 代码我没看，如果要做到你标题的这个要求 生成随机数放到数组的一个问题，如何让随机数不重复？ 第二次在生成随机数放到数组保存之前，先循环遍历这个随机数是否在数组中已经存在，如果存在则放弃，开始下一次循环，否则存入数据！

user: user-3
content: 尝试把srand((unsigned)(time(0)));放到循环外面。另外可以试试这个 bool GetRandNum(int min, int max, int & out) {     if (max < min)     {         return false;     }      unsigned int tmp = 0;      if (rand_s(&tmp) != 0)     {         return false;     }      out = tmp % (max - min + 1) + min;     return true; }

user: user-3
content: 引用 4 楼 qq_44383162 的回复:[quote=引用 1 楼 yunate的回复:]尝试把srand((unsigned)(time(0)));放到循环外面。另外可以试试这个 bool GetRandNum(int min, int max, int & out) {     if (max < min)     {         return false;     }      unsigned int tmp = 0;      if (rand_s(&tmp) != 0)     {         return false;     }      out = tmp % (max - min + 1) + min;     return true; } 谢谢！为什么srand放在循环里不可以呢？然后的话，下面这个代码是啥意思啊...?[/quote] 大致可以这样理解：随机数肯定是一个随机算法，可以认为内部维护了一个static的index根据index算出数值，算法中肯定有参数，srand这个函数可以认为是初始化这个参数并且将index重新赋值（比如0），所以放在循环里由于time(0)不变，所以每次的算法参数不变，并且index被重新赋值了，得出的结果就一样了。至于下面那个函数是用来生成min到max之间的随机数，对了如果要使用这个的话文件最上面要加上#define _CRT_RAND_S
user-0 提问: c语言求长方体体积的程序有什么错吗

回复:
user: user-1
content: 有两处问题：函数定义后用分号;，函数调用函数名拼写错误； 这两个错误编译器能给指出来的，因此建议贴出代码之前先把编译错误去掉。  #include<stdio.h>  #define Height 10  //int calculate(int Long, int Width); int calculate(int Long, int Width) {     int result;      result = Long * Width * Height;      return result; }  int main() {     int m_Long;     int m_Width;     int result;     printf("长方体的高度为：%d", Height);     printf("请输入长度\n");     scanf("%d", &m_Long);     printf("请输入宽度\n");     scanf("%d", &m_Width);     result = calculate(m_Long, m_Width);     printf("长方体的体积是：");     printf("%d\n", result);     return 0; }

user: user-2
content: 没看出有啥逻辑错误

user: user-3
content: #include<stdio.h> #define Height 10  int calculate(int Long, int Width)//; {     int result;     result = Long * Width * Height;     return result; }  int main() {     int m_Long;     int m_Width;     int result;     //printf("长方体的高度为：%d", Height);     printf("长方体的高度为：%d\n", Height);     printf("请输入长度\n");     scanf("%d", &m_Long);     printf("请输入宽度\n");     scanf("%d", &m_Width);     //result = calualate(m_Long, m_Width);     result = calculate(m_Long, m_Width);     printf("长方体的体积是：");     printf("%d\n", result);     return 0; } 看注释部分 另外，为什么要把高定义为一个宏？
user-0 提问: 运行程序出段错误，GBD调试确没有错误，求解

回复:
user: user-1
content: 帮结帖+蹭分

user: user-0
content: 已解决，需要给char *s 分配空间存放内容。

user: user-0
content: 是GDB 打错了
user-0 提问: PAT1013测试点零和测试点一格式错误  求解

回复:
user: user-0
content: 引用 2 楼 user-2的回复:无论怎样count%10都一定小于10，所以你每行都打印10个空格，修改为：  if (count % 10 != 0) 			printf(" ");  非常感谢  已经顺利通过

user: user-0
content: 非常感谢

user: user-1
content: #include<stdio.h>  int prime(int n) {     int i;      if(n < 2)         return 0;      for(i = 2; i*i <= n; i++)         if(n % i == 0)             return 0;      return 1; }  int main() {     int cnt = 0, idx = 0;      int m, n, num;      scanf("%d%d", &m, &n);      num = 3;     if (m == 1) {         printf("2 ");         idx++;         cnt++;     }     cnt = 1;     while (1) {         if (prime(num)) {             cnt++;             if (cnt > n)                 break;             if (cnt >= m) {                 idx++;                 printf("%d ", num);             }             if (idx % 10 == 0)                 printf("\n");         }         num += 2;     }     putchar(10);      return 0;     /*     int i=0,j,p=0,count=0;     //long long c[10001];     int c[10001];     int m,n;     scanf("%d%d", &m,&n);     for(j=2;i<=n;j++)     {         if(prime(j)==1)             c[i++]=j;     }     for(j=m-1;j<n-1;j++)     {         printf("%d",c[j]);         count++;         if(count%10<10)             printf(" ");         if(count%10==0)             printf("\n");     }     printf("%d",c[n-1]);     */ }  供参考～

user: user-1
content: 引用 1 楼 Möge alles zufriedenstellend 的回复:题目是令 P ​i ​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10 ​4 ​​，请输出 P ​M ​​ 到 P ​N ​​ 的所有素数。  输入格式：  输入在一行中给出 M 和 N，其间以空格分隔。  输出格式：  输出从 P ​M ​​ 到 P ​N ​​ 的所有素数，每 10 个数字占 1 行，其间以空格分隔，但行末不得有多余空格 建议你把题目的链接发出来吧，你的题目要求看不懂的。

user: user-2
content: 无论怎样count%10都一定小于10，所以你每行都打印10个空格，修改为：  if (count % 10 != 0) 			printf(" ");

user: user-0
content: 题目是令 P ​i ​​ 表示第 i 个素数。现任给两个正整数 M≤N≤10 ​4 ​​，请输出 P ​M ​​ 到 P ​N ​​ 的所有素数。  输入格式：  输入在一行中给出 M 和 N，其间以空格分隔。  输出格式：  输出从 P ​M ​​ 到 P ​N ​​ 的所有素数，每 10 个数字占 1 行，其间以空格分隔，但行末不得有多余空格
user-0 提问: C语言里结构指针那块的一道题

回复:
user: user-0
content: 引用 13 楼 自信男孩的回复:注意pt->y就是a, 用a去偏移2的地址就是a+1,所以去里面的值就是*(a+1);即*(pt->y+1) 哦对哦对，谢谢你们哈

user: user-1
content: 注意pt->y就是a, 用a去偏移2的地址就是a+1,所以去里面的值就是*(a+1);即*(pt->y+1)

user: user-1
content: 输出2，就用*(pt->y+1）

user: user-0
content: 引用 10 楼 user-2的回复:不应该是b数组吧，*(pt+1)->y才应该是b啊 哦对，那你那个是啥y+1啊？

user: user-2
content: 不应该是b数组吧，*(pt+1)->y才应该是b啊

user: user-0
content: 引用 7 楼 user-2的回复:说错了，你*在++前，所以也是对的 ok感谢，你那个是指到b数组了哈

user: user-0
content: 引用 6 楼 user-2的回复:你那样是数组元素+1，不是第二个数组元素的值 *pt->(y+1)才是第二个数组元素 不是，pt指向y然后加加不就是数组a的第二个元素吗？？

user: user-2
content: 说错了，你*在++前，所以也是对的

user: user-2
content: 你那样是数组元素+1，不是第二个数组元素的值 *pt->(y+1)才是第二个数组元素

user: user-0
content: 引用 4 楼 我不是的回复:[quote=引用 2 楼 user-2的回复:]前面有个*，所以应该a数组的第一个元素，1 ok，那怎么输出2呢[/quote] 我知道了，*++(pt-y>)是2

user: user-0
content: 引用 2 楼 user-2的回复:前面有个*，所以应该a数组的第一个元素，1 ok，那怎么输出2呢

user: user-0
content: 但是我在电脑上运行出来结果是1

user: user-2
content: 前面有个*，所以应该a数组的第一个元素，1

user: user-2
content: 是a数组的地址
user-0 提问: （新手）单链表删除异常，谢谢！！！

回复:
user: user-1
content: 多敲几边，了解每句话的意义，给每一句都加上注释。

user: user-0
content: 仔细对比了下，就是有一些自己没发现的错误，非常感谢！！！

user: user-2
content: #define _CRT_SECURE_NO_WARINGS #include <stdio.h> #include <stdlib.h> #include <string.h>   //定义链表结点结构体 typedef struct LINKNODE {     int* data;     struct LINKNODE* next; }LinkNode;  //定义链表结构体 typedef struct LINKLIST {     LinkNode* head;     int size;     //链表不需要容量的概念了 } LinkList;    //--------------------初始化-------------------- LinkList* Init_LinkList() {     LinkList *list = (LinkList*)malloc(sizeof(LinkList));     if (!list)         return NULL;     list->size = 0;     list->head = (LinkNode*)malloc(sizeof(LinkNode));     list->head->data = NULL;     list->head->next = NULL;      return list; }  //--------------------插入-------------------- //指定位置插入 void Insert_LinkList(LinkList* list, int* nums, int numsSize) {     if (list == NULL) {         return;     }     LinkNode* r = list->head;     for (int i = 0; i < numsSize; i++)     {         LinkNode *newnode = (LinkNode*)malloc(sizeof(LinkNode));         if (!newnode)             break;         newnode->data = &nums[i];         r->next = newnode;         r = newnode;         r->next = NULL;         list->size++;     } }   LinkList* deleteNode(LinkList* A,int val) {     LinkNode* p = A->head;     LinkNode* q;      while (p->next != NULL)     {         if (*(p->next->data) == val)             break;         p = p->next;     }     if (p->next == NULL)         return 0;      q = p->next;     p->next = p->next->next;     free(q);      return A;  }  int main() {      int arr1[3] = { 1,5,6 };     LinkList* list1 = Init_LinkList();     Insert_LinkList(list1, arr1, 3);       //辅助指针变量     LinkNode* p1 = list1->head->next;     LinkNode *p2;      printf("链表1：");     while (p1) {         printf("%d->", *(p1->data));         p1 = p1->next;     }     printf("\n");       list1 = deleteNode(list1, 5);     p2 = list1->head->next;     printf("删除链表：");     while (p2) {         printf("%d->", *(p2->data));         p2 = p2->next;     }     putchar(10);      return 0; }  供参考～  代码本身就有问题，我想应该编译不通过的，起码会有警告。
user-0 提问: 请助UART

回复:
user: user-1
content: 二楼,  你的文笔很细腻, 应该找个方向, 写写博客, 或教程, 这能让更多后人受惠~~

user: user-1
content: 二楼, 赞一个!!  女生就是细心, 说话也易懂! 我反履看了三遍, 自我检讨中!!

user: user-0
content: 好的，谢谢楼上两位，我最近在玩SC16C654，在想写控制它的代码，在网上找不到多少它的资料

user: user-1
content: 123为取位值，4应该是预设的宏，指定某IO为低电平，5应该也是宏，发送命令指令，67应该也是命令吖。 没上下文很难解读。 至于书: 有一本叫 C和指针，我读过N本C，这本感觉最好。

user: user-2
content: A0 是读取Reg值中bit0上的值，A1是读取Reg值bit1上的值，A2是读取Reg值bit2上的值。 这种“&”符号在C语言单片机中叫做位与，就是按位进行与操作。还有就是“|”符号。这些符号在C语言中是比较常见的。 还有就是你说的*((unsigned char pdata *)MCU_COMMAND) = Val; 这句话的意思就是把MCU_COMMAND的地址看成是unsigned char pdata类型，然后往这个地址写入数据Val。这是单片机C语言中常用的指针，很多情况下，单片机都是进行寄存器操作的。所以指针还是很重要的。