Question: 如何输出%d/n

20分平白多出了这么多啊

怎么又来一个

printf("\%d\n")   \是转义字符

引用 2 楼 weixin_45949073 的回复：引用 1 楼 遇见女神 的回复:printf(“%d”,n);//输出n不不，是在一个printf里输出%d然后再换行printf(“%%d\n”);

用转义符号"\%"解决%的输出就好了

printf("\%d/n")

引用 2 楼 weixin_45949073 的回复:引用 1 楼 遇见女神 的回复:printf(“%d”,n);//输出n不不，是在一个printf里输出%d然后再换行 直接printf("%d\n",你要输出的变量名)；就好了，%d是输出十进制数据\n是换行

printf(“%d”,n);//输出n


Question: PTA段错误，7-58 求整数序列中出现次数最多的数 (15分)

你的num有多大，太大了放到局部变量是不行的，会把程序撑爆 你看看num的范围，很大的就要做成全局变量来使用

变量idx没有初始化


Question: C++语言写的贪吃蛇小游戏，绝对原创！

太厉害了！！！！！！！！！！！！！！！！！！！！！！！

我先猜一个：不是用引擎写的

学习一下

引用 13 楼 千梦一生 的回复:我先猜一个：不是用引擎写的 我就是用引擎写的，哈哈哈。。。

其实有这种破坏性质的，都可以称之为病毒，广义的病毒。 我记得在很久以前，有一个超级简单的病毒，它就是在启动的批处理文件中，加了一行：DelTree  *.* /Y 那时候还是DOS时代，这条命令意味着什么就不用说了。  引用 6 楼 liups 的回复:[quote=引用 4 楼 gufeng1314520 的回复:] [quote=引用 3 楼 Logy_S 的回复:]   你以为我会从CSDN的百度云链接下载？？？   很久以前，下了个小游戏  然后来一句   shutdown -s -t 1    现在我还隐约记得，  当时 我在给硬盘分区。  系统也崩了，文件也丢了。。。我搞了半宿。自己写的小游戏，没有任何病毒，你太抬举我了，我还没有厉害到能写病毒的地步，我对病毒什么也不懂[/quote] 这个可不是病毒！[/quote]

不要以为人为传染就不算传染，要知道，黑客其实也会使用非计算机手段来破解。

定义： 计算机病毒（Computer Virus）是编制者在计算机程序中插入的破坏计算机功能或者数据的代码，能影响计算机使用，能自我复制的一组计算机指令或者程序代码。  引用 9 楼 liups 的回复:[quote=引用 8 楼 super_admi 的回复:] 其实有这种破坏性质的，都可以称之为病毒，广义的病毒。 我记得在很久以前，有一个超级简单的病毒，它就是在启动的批处理文件中，加了一行：DelTree  *.* /Y 那时候还是DOS时代，这条命令意味着什么就不用说了。  [quote=引用 6 楼 liups 的回复:] [quote=引用 4 楼 gufeng1314520 的回复:] [quote=引用 3 楼 Logy_S 的回复:]   你以为我会从CSDN的百度云链接下载？？？   很久以前，下了个小游戏  然后来一句   shutdown -s -t 1    现在我还隐约记得，  当时 我在给硬盘分区。  系统也崩了，文件也丢了。。。我搞了半宿。自己写的小游戏，没有任何病毒，你太抬举我了，我还没有厉害到能写病毒的地步，我对病毒什么也不懂[/quote] 这个可不是病毒！[/quote][/quote] 你怕是对病毒有什么误解！有破坏作用的都是病毒？那为什么会有蠕虫、木马这些称呼？[/quote]

引用 7 楼 super_admi 的回复:咋一看，像是控制台下的文本游戏，但细看一下，又不太像了。难道是用D3D或者OPENGL之类的写的？用了easy_x图形库

引用 8 楼 super_admi 的回复:其实有这种破坏性质的，都可以称之为病毒，广义的病毒。 我记得在很久以前，有一个超级简单的病毒，它就是在启动的批处理文件中，加了一行：DelTree  *.* /Y 那时候还是DOS时代，这条命令意味着什么就不用说了。  [quote=引用 6 楼 liups 的回复:] [quote=引用 4 楼 gufeng1314520 的回复:] [quote=引用 3 楼 Logy_S 的回复:]   你以为我会从CSDN的百度云链接下载？？？   很久以前，下了个小游戏  然后来一句   shutdown -s -t 1    现在我还隐约记得，  当时 我在给硬盘分区。  系统也崩了，文件也丢了。。。我搞了半宿。自己写的小游戏，没有任何病毒，你太抬举我了，我还没有厉害到能写病毒的地步，我对病毒什么也不懂[/quote] 这个可不是病毒！[/quote][/quote] 你怕是对病毒有什么误解！有破坏作用的都是病毒？那为什么会有蠕虫、木马这些称呼？

引用 3 楼 Logy_S 的回复:  你以为我会从CSDN的百度云链接下载？？？   很久以前，下了个小游戏  然后来一句   shutdown -s -t 1    现在我还隐约记得，  当时 我在给硬盘分区。  系统也崩了，文件也丢了。。。我搞了半宿。自己写的小游戏，没有任何病毒，你太抬举我了，我还没有厉害到能写病毒的地步，我对病毒什么也不懂

引用 4 楼 gufeng1314520 的回复:[quote=引用 3 楼 Logy_S 的回复:]   你以为我会从CSDN的百度云链接下载？？？   很久以前，下了个小游戏  然后来一句   shutdown -s -t 1    现在我还隐约记得，  当时 我在给硬盘分区。  系统也崩了，文件也丢了。。。我搞了半宿。自己写的小游戏，没有任何病毒，你太抬举我了，我还没有厉害到能写病毒的地步，我对病毒什么也不懂[/quote] 这个可不是病毒！

下载链接：https://download.csdn.net/download/gufeng1314520/12087735

引用 1 楼 user-7 的回复:厉害，给你点个赞谢谢，多提点意见哦

厉害，给你点个赞


Question: 第一个filename和第二个filename为什么不一样呢

引用 2 楼 自信男孩的回复:你没发现你的filename输入的越界了吗？你看看你输入的filename长度是多少个字符，而是filename数组的长度是多少？ 原来如此，谢谢你了

感谢各位哥哥姐姐帮我解决这个问题🙏🙏


Question: C语言

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

引用 4 楼 qq_1457346882的回复:[quote=引用 2 楼 寻开心 的回复:] 这是基础的练习题， 自己写代码，有问题再贴代码求助 题目已经很清楚告诉你如何实现了啊 scanf获得第一个行的n 循环n次，用gets获得每行的字符串，保存一个 char  buffer【100】数组里面 用strlen计算buffer里面字符串的长度，然后累加  这种基础的题目不自己动手练习，  还学个p开发啊 心累啊[/quote] 谢谢大佬，我是个菜鸟

谢谢大佬，我是个菜鸟

引用 2 楼 寻开心 的回复:这是基础的练习题， 自己写代码，有问题再贴代码求助 题目已经很清楚告诉你如何实现了啊 scanf获得第一个行的n 循环n次，用gets获得每行的字符串，保存一个 char  buffer【100】数组里面 用strlen计算buffer里面字符串的长度，然后累加  这种基础的题目不自己动手练习，  还学个p开发啊 心累啊

#include<stdio.h> #include<string.h> int main(){     int n,i=0;     char str[81];     scanf("%d",&n);     getchar();     while(i<n){         gets(str);         int x=strlen(str);         printf("%d\n",x);         memset(str,0,81);         i++;     }     return 0; } 思路给你了先去自己写一下啊，直接拿了你下次还是不会，一共也就这几行代码

n还是分开的？那不是更简单


Question: C语言的数据类型问题

格式化输出字符

%c 是输出字符， %d 是输出这个字符ASCII码的十进制值

%c输出字符数据，%d输出十进制的值

输出ascii字符和对应的ascii值。


Question: 这里不用到强转换会报错，视频里没有用到却编译过了，求指点

把文件后缀名 从.cpp 改为 .c

现代编译器都会要求 做强制类型转换的 ， 毕竟 int* 和 unsigned char * 类型是大不一样的， 应该是错误，而不是警告级别的

试了下没报错，好像有个警告闪过去了，可能编译器问题


Question: 无输出

还有， 知道了答案的帖子，都去结贴付分儿去 ，要不后面面没人愿意回答你的问题

double angle[] = {atan(1),atan(1/2),atan(1/4),atan(1/8),atan(1/16),                       atan(1/32),atan(1/64),atan(1/128),atan(1/256),atan(1/512),                       atan(1/1024),atan(1/2048),atan(1/4096),atan(1/9192)};      double tan1[]={1,1/2,1/4,1/8,1/16,1/32,1/64,1/128,1/256,                1/512,1/1024,1/2048,1/4096,1/9192};  你不考虑整数除法吗？  这些参数绝大多数都被你初始化为0了  1/2 ， 1/4 ， 。。。。。这些都是0


Question: 三数之和——貌似是内存分配和数组索引问题

引用 9 楼 Stranger_Green 的回复:[quote=引用 8 楼 u013962723 的回复:] 大兄弟，你觉得这个算法的瓶颈是在排序上？？？你有更好的算法？除去排序不谈，这已经是我找到的省时的方法了。 两个for处理。虽然里面还有两个while，但那也是为了去重，也是为了减少外面循环的次数。[/quote]  赌5毛，你传一个有序数列进去，把排序删掉一样超时 你可以自己想一下你核心算法的复杂度是多少，快排的复杂度是多少

引用 10 楼 遇见女神 的回复:1)排序可以用c语言提供的qsort函数； 2)去重不用while循环并且先去重再下一步骤，参考你自己的代码if(XXX)continue；后来是用的qsort过的超时。 去重开始是计划把j和k的两个for放在前面的。但是后来考虑到，如果有三个或以上连续的0，0,  0，会将这组结果排除掉。 所以后来改为在确认了一组数据后，排除相同的数。这样逻辑比较直观，也不会把可能的数据除掉。

大兄弟，你觉得这个算法的瓶颈是在排序上？？？

引用 8 楼 u013962723 的回复:大兄弟，你觉得这个算法的瓶颈是在排序上？？？你有更好的算法？除去排序不谈，这已经是我找到的省时的方法了。 两个for处理。虽然里面还有两个while，但那也是为了去重，也是为了减少外面循环的次数。

自己找到这个问题了，temp == 0后，赋值结束后，没有对j++和k--，以至于陷在循环里了。 但是代码改好后，竟然还是超时。郁闷啊，快排不够快吗？ void quickSort(int* nums, int left, int right); int** threeSum(int* nums, int numsSize, int* returnSize, int** returnColumnSizes){          if(numsSize < 3)     {         *returnSize = 0;         return NULL;     }       int **re = (int**)malloc(sizeof(int*) * numsSize * 2);     *returnColumnSizes = (int*)malloc(sizeof(int) * numsSize * 2);        quickSort(nums, 0, numsSize - 1);     int geshu = 0;     for(int i = 0; i < numsSize - 2 && nums[i] <= 0; i++)     {         if(i > 0 && nums[i] == nums[i-1])             continue;         for(int j = i + 1, k = numsSize - 1; j < k && nums[k] >= 0;)         {                                              long temp = nums[i] + nums[j] + nums[k];             if(temp == 0)             {                 re[geshu] = (int*)malloc(sizeof(int) * 3);                 re[geshu][0] = nums[i];                 re[geshu][1] = nums[j];                 re[geshu][2] = nums[k];                 (*returnColumnSizes)[geshu++] = 3;                 while(j < k && nums[j] == nums[j + 1])                     j++;                 while(j < k && nums[k] == nums[k - 1])                     k--;                 j++;                 k--;             }             else if(temp > 0)             {                 k--;             }             else             {                 j++;             }                              }             }         * returnSize = geshu;     return re; } void quickSort(int* nums, int left, int right) {     if(left >= right)         return;     int i = left, j = right, key = nums[left];     while(i < j)     {         while(i < j && nums[j] >= key)             j--;         nums[i] = nums[j];         while(i < j && nums[i] <= key)             i++;         nums[j] = nums[i];     }     nums[i] = key;     quickSort(nums, 0, i - 1);     quickSort(nums, i + 1, right); }

引用 4 楼 user-3 的回复:[quote=引用 3 楼 Stranger_Green 的回复:] [quote=引用 2 楼 user-3 的回复:]  int **re = (int**)malloc(sizeof(int*) * 1500);  这个是个什么操作？分配返回的是指针，你强转为二级指针他的值还是指向分配空间的一个指针地址 re存了一个地址A，A地址中存了一个指针B，这个操作是让B=分配的地址 你的固定是返回三个数字的， 直接分配 单个空间*3*总数量的一维来解决, struct num_struct {int num1; int num2; int num3; } num_struct * re=malloc(sizeof(num_struct)*1500; XX XX XX XX XX XX |          |     |          | ________     ________     re[0]       re[1] 二维数组一直都是那样分配内存的。1500那个，是因为事先不知道这个数组geshu多少行。只好先定一个一个大点儿的值。 re[geshu] = (int*)malloc(sizeof(int) * 3);  是为每一行re[geshu]的大小分配，确定是三个数字。re[geshu][0]，re[geshu][1]， re[geshu][2]。 如果按照你说的，只在第一次为re分配内存。每行不单独分配时，运行到下方re[geshu][0] 时，会报错的。[/quote] 只要你分配的够的话，怎么会出错呢，调用改一下re[geshu]->num1; 你目前的是 地址一->指针->指向三个数的地址 地址二->指针->指向三个数的地址 ... 地址N->指针->指向三个数的地址 数组加动态 你不确定的话就用结构体链表来解决动态的问题，需要一个就分配一个。[/quote]题目给的要求是，返回二维数组。并且要给出二维数组大小。 问题就是，我现在测试输入的nums，只是包含五个数的数组，上面的分配，肯定不会不够啊。但不知道为啥就是一直报错。找了一下午都没搞定。

引用 3 楼 Stranger_Green 的回复:[quote=引用 2 楼 user-3 的回复:]  int **re = (int**)malloc(sizeof(int*) * 1500);  这个是个什么操作？分配返回的是指针，你强转为二级指针他的值还是指向分配空间的一个指针地址 re存了一个地址A，A地址中存了一个指针B，这个操作是让B=分配的地址 你的固定是返回三个数字的， 直接分配 单个空间*3*总数量的一维来解决, struct num_struct {int num1; int num2; int num3; } num_struct * re=malloc(sizeof(num_struct)*1500; XX XX XX XX XX XX |          |     |          | ________     ________     re[0]       re[1] 二维数组一直都是那样分配内存的。1500那个，是因为事先不知道这个数组geshu多少行。只好先定一个一个大点儿的值。 re[geshu] = (int*)malloc(sizeof(int) * 3);  是为每一行re[geshu]的大小分配，确定是三个数字。re[geshu][0]，re[geshu][1]， re[geshu][2]。 如果按照你说的，只在第一次为re分配内存。每行不单独分配时，运行到下方re[geshu][0] 时，会报错的。[/quote] 只要你分配的够的话，怎么会出错呢，调用改一下re[geshu]->num1; 你目前的是 地址一->指针->指向三个数的地址 地址二->指针->指向三个数的地址 ... 地址N->指针->指向三个数的地址 数组加动态 你不确定的话就用结构体链表来解决动态的问题，需要一个就分配一个。

引用 2 楼 user-3 的回复:int **re = (int**)malloc(sizeof(int*) * 1500);  这个是个什么操作？分配返回的是指针，你强转为二级指针他的值还是指向分配空间的一个指针地址 re存了一个地址A，A地址中存了一个指针B，这个操作是让B=分配的地址 你的固定是返回三个数字的， 直接分配 单个空间*3*总数量的一维来解决, struct num_struct {int num1; int num2; int num3; } num_struct * re=malloc(sizeof(num_struct)*1500; XX XX XX XX XX XX |          |     |          | ________     ________     re[0]       re[1] 二维数组一直都是那样分配内存的。1500那个，是因为事先不知道这个数组geshu多少行。只好先定一个一个大点儿的值。 re[geshu] = (int*)malloc(sizeof(int) * 3);  是为每一行re[geshu]的大小分配，确定是三个数字。re[geshu][0]，re[geshu][1]， re[geshu][2]。 如果按照你说的，只在第一次为re分配内存。每行不单独分配时，运行到下方re[geshu][0] 时，会报错的。

如果把Line222和Line333处改为： int **re = (int**)malloc(sizeof(int*) * (numsSize + 1) * 6); *returnColumnSizes = (int*)malloc(sizeof(int) * (numsSize + 1) * 6);   报错信息就是： ================================================================= ==29==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x613000000190 at pc 0x00000040251a bp 0x7ffc37c0d980 sp 0x7ffc37c0d978 WRITE of size 8 at 0x613000000190 thread T0     #2 0x7f4b2a50c2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0) 0x613000000190 is located 0 bytes to the right of 336-byte region [0x613000000040,0x613000000190) allocated by thread T0 here:     #0 0x7f4b2bdbb2b0 in malloc (/usr/local/lib64/libasan.so.5+0xe82b0)     #3 0x7f4b2a50c2e0 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x202e0) Shadow bytes around the buggy address:   0x0c267fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   0x0c267fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   0x0c267fff8000: fa fa fa fa fa fa fa fa 00 00 00 00 00 00 00 00   0x0c267fff8010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00   0x0c267fff8020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 =>0x0c267fff8030: 00 00[fa]fa fa fa fa fa fa fa fa fa fa fa fa fa   0x0c267fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa   0x0c267fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa   0x0c267fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa   0x0c267fff8070: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa   0x0c267fff8080: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa Shadow byte legend (one shadow byte represents 8 application bytes):   Addressable:           00   Partially addressable: 01 02 03 04 05 06 07    Heap left redzone:       fa   Freed heap region:       fd   Stack left redzone:      f1   Stack mid redzone:       f2   Stack right redzone:     f3   Stack after return:      f5   Stack use after scope:   f8   Global redzone:          f9   Global init order:       f6   Poisoned by user:        f7   Container overflow:      fc   Array cookie:            ac   Intra object redzone:    bb   ASan internal:           fe   Left alloca redzone:     ca   Right alloca redzone:    cb ==29==ABORTING


Question: c语言求一个大佬帮我出一份答案

引用 9 楼 qq_46133362 的回复:[quote=引用 7 楼 自信男孩 的回复：]第一题，完全可以输入到机器上编译一下就好了。这个问题，标准答案自己就可以通过尝试找到。语法错误还要问的话，那基础知识需要加强了。  1. fopen第一个参数应该是字符串； 2。 B，97可以查一下是'a' 3. A 4. D 5. D 6. B最后一题，我认为选a啊[/quote] 选A没关系，试一下，试了再确定。这个问题好判断～

10道题6道在能力范围之外吗。那更应该自己写代码自己做了

引用 7 楼 自信男孩 的回复：第一题，完全可以输入到机器上编译一下就好了。这个问题，标准答案自己就可以通过尝试找到。语法错误还要问的话，那基础知识需要加强了。  1. fopen第一个参数应该是字符串； 2。 B，97可以查一下是'a' 3. A 4. D 5. D 6. B最后一题，我认为选a啊

给出的答案有出入，建议楼主自己验证一下那个答案是正确的。

引用 3 楼 m0_46102964 的回复：第一题fopen打开文件应该用双引号 第二题A,第二个形参时char型，调用时用单引号，C函数无返回值，所以不能用n=;D97虽然是单引号，但这里是字符串了 第三题A 第四题看不清 第五题2.0 第六题A谢谢

引用 4 楼 _肆 的回复：把题目写成小demo，用程序去校验，不要为了应试教育去学编程这些发的是我能力之外的

把题目写成小demo，用程序去校验，不要为了应试教育去学编程

引用 1 楼 一条不会飞的鱼 的回复：自己动手，丰衣足食我做了但是没有标准答案

自己动手，丰衣足食


Question: 求助C语言大神

你这不是问问题啊，你这是想要答案

可以写，但是不能白给，会害了你的，自己去写，碰到问题实在不会再来问

首先，不会免费给你写，付费也要看时间～  希望打击能让你用心去学习，而不是继续这样的大学生活～

要求是给你写程序吗？题目超纲了，还是自己写不出来，说明白一些吧


Question: c语言函数求解

引用 2 楼 weixin_46002165 的回复:[quote=引用 1 楼 不闻窗外事的回复:]因为形参a是指针，所以可以改变指针指向的内容 数组和指针等价吗?a[]可以等价于※a吗[/quote]可以的，int a[]等价于int *a

fun(int a[]) = fun(int *p) 相当余把数组传过去了，你在函数里面做操作都是对数组进行操作的，所以它的值会跟着变

引用 7 楼 寻开心的回复:  说了半天说的是： 指针没有变，指针指向的内容变了， 传参传的是指针 懂了，指针指向的内容变了。了解了，谢谢大神

说了半天说的是： 指针没有变，指针指向的内容变了， 传参传的是指针

引用 3 楼 寻开心的回复:a本身没有变， a是指针，a没有变是指a这个指针的数值（数组的地址）没有变 传参传入的是这个指针的值 变的是a指向的内容 大致明白了，值没有变，指针变了

引用 3 楼 寻开心的回复:a本身没有变， a是指针，a没有变是指a这个指针的数值（数组的地址）没有变 传参传入的是这个指针的值 变的是a指向的内容 明白了，谢谢大神

当然可以，你不会以为写一个a[]，就是把整个数组作为参数吧，当然只是数组的指针了

引用 1 楼 不闻窗外事的回复:因为形参a是指针，所以可以改变指针指向的内容 数组和指针等价吗?a[]可以等价于※a吗

因为形参a是指针，所以可以改变指针指向的内容


Question: c语言大佬帮我康康

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

引用 4 楼 柒贰伍玖 的回复：BCD CD D  s     ‘A’ s+1 ‘B’ s+2 ‘C’ s+3 ‘D’ s+4 ‘\0’  p  = s + 1，即p指向‘B’所以会循环3次   分别输出上面3个字符串谢谢

可以先确定一下循环次数，A是循环4次，很明显不对。 另外，s+1指向的是'B'的地址。%s是从p地址开始向后输出字符串，所以直到遇到'\0'停止输出。

引用 1 楼 user-4 的回复：bcd cd d 数组名是首地址，p=s+1，是取s地址的后一位，地址内的值是B，首地址是A，但是这里后移了，后面同理，循环依次后移一位 取移位后的地址开始到结束的值谢谢！


Question: C语言 关于switch case 语句执行顺序以及结果的问题

引用 8 楼 柒贰伍玖 的回复:[quote=引用 4 楼 懒笑翻 的回复:] [quote=引用 1 楼 柒贰伍玖 的回复:]  case 后面要加 break 跳出 case，要不然它会从进入的 case 开始 往后执行，直到碰到break，才结束switch 语句 你的程序 在printf 完之后，加上 break，像你的case 4 一样，每一case都一样，这样就会只执行某一个case就是测试不加break执行看会不会往回执行，但是我纠结的是2+=2之后，k=4,此时为什么不执行case 4[/quote]  进switch 的时候才做判断，后面不再判断了，进到case之后就顺序往后执行，碰到break或者到switch末尾处就结束。这个是switch语句，不会循环执行。[/quote]原来只判断一次case  ，我懂了，谢谢！！！

引用 9 楼 qq_1457346882 的回复:switch只会往后执行，不会跳回去的，除非结束switch外面有循环再进来，加了break会执行完跳出，如果没加break，会u先判断执行对应的case值的语句，然后就不会判断case值，而是直接往下依次执行，直到遇见break跳出或者执行完结束嗯嗯，谢谢大佬的指导，完全理解了

引用 10 楼 自信男孩 的回复:引用 5 楼 懒笑翻 的回复:[quote=引用 3 楼 自信男孩 的回复:] k是3，所以switch跳到case 3执行，因为case 3没有break，因此顺序执行case 4，直到break或执行完。但是为啥程序执行时，没有输出case 4 呢？ 执行了呢，因为case 3后面没有break,所以执行case 4了。不然怎么会有两个输出呢[/quote]明白了，谢谢大佬！！！就是说会直接往下执行，不会判断case的值了，直到break退出

引用 5 楼 懒笑翻 的回复:引用 3 楼 自信男孩 的回复:k是3，所以switch跳到case 3执行，因为case 3没有break，因此顺序执行case 4，直到break或执行完。但是为啥程序执行时，没有输出case 4 呢？ 执行了呢，因为case 3后面没有break,所以执行case 4了。不然怎么会有两个输出呢

引用 4 楼 懒笑翻 的回复:[quote=引用 1 楼 柒贰伍玖 的回复:]  case 后面要加 break 跳出 case，要不然它会从进入的 case 开始 往后执行，直到碰到break，才结束switch 语句 你的程序 在printf 完之后，加上 break，像你的case 4 一样，每一case都一样，这样就会只执行某一个case就是测试不加break执行看会不会往回执行，但是我纠结的是2+=2之后，k=4,此时为什么不执行case 4[/quote]  进switch 的时候才做判断，后面不再判断了，进到case之后就顺序往后执行，碰到break或者到switch末尾处就结束。这个是switch语句，不会循环执行。

输出的不就是case 3和4吗

引用 5 楼 懒笑翻 的回复:引用 3 楼 自信男孩 的回复:k是3，所以switch跳到case 3执行，因为case 3没有break，因此顺序执行case 4，直到break或执行完。但是为啥程序执行时，没有输出case 4 呢？  判断只在一开始做了一次，后面就等着退出了，就像你写个if语句，你在语句块里把条件改没了他还能立即退出不成

引用 1 楼 柒贰伍玖 的回复:case 后面要加 break 跳出 case，要不然它会从进入的 case 开始 往后执行，直到碰到break，才结束switch 语句 你的程序 在printf 完之后，加上 break，像你的case 4 一样，每一case都一样，这样就会只执行某一个case就是测试不加break执行看会不会往回执行，但是我纠结的是2+=2之后，k=4,此时为什么不执行case 4

只执行了两个printf，怎么会有三个值呢，应该是  3 2吧


Question: EC11旋转编码器程序

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


Question: 学生党员管理系统

做这个需要收费的，不要以为别人都能这么帮你～

党员这么有责任的人，会用不是你自己写的代码的系统吗[face]qq:13.gif[/] 自己写，贴代码来提问吧


Question: c语言程序

直接贴代码吧～

引用 2 楼 unjoker 的回复：#include"stdio.h"  int func(int y,int m,int d) {     int number=0,x;     if((y%4==0&&y%100!=0)||y%400==0){         for(x=1;x<m;x++)         {             if(x==1||x==3||x==5||x==7||x==8||x==10||x==12)                 number+=31;             else if(x==2)                 number+=29;             else                 number+=30;         }         number+=d;     }     else     {         for(x=1;x<m;x++)         {             if(x==1||x==3||x==5||x==7||x==8||x==10||x==12)                 number+=31;             else if(x==2)                 number+=28;             else                 number+=30;         }         number+=d;     }     return number; } int main() {     int y,m,d,number;     scanf("%4d/%2d/%2d",&y,&m,&d);     number=func(y,m,d);     printf("%d",number);     return 0; } PS：我自己也是刚学，刚刚写出来的，可能有的部分有点啰嗦，欢迎批评指正！#include <stdio.h> struct { 	int year,month,day; }date; int main(void) { 	int i,days=0; 	int day_tab[13]={0,31,28,31,30,31,30,31,31,30,31,30,31}; 	scanf("%d%d%d",&date.year,&date.month,&date.day); 	for(i=1;i<date.month;i++) 	{ 		days=days+day_tab[i];  	} 	days=days+date.day; 	if(date.year%400==0&&date.month>2) 	{ 		days+=1; 	} 	printf("%d\n",days); }


Question: 求问!

s++和t++为什么放到最后没有返回呢？还是贴出完整代码吧

你的s++，t++都改变指针的位置了，返回值就不是原来字符串的初始位置了。

char* fun(char *s, char* t) {     char *p = s, *q=t;     while (*p**q)  p++, q++;    if ( *p || *q )      return (*p) ? s : t;   else      return s; }


Question: 为什么程序没有语法错误却运行不了？

scanf输入需要给地址不是变量名，建议case排版排排好，没错 ，纯粹是为了美观和检查方便

scanf("%d",num);  输入 需要把变量的地址传过去，不穿地址的话 它会把变量的随机值当作地址，取访问这个地址 导致异常退出了，没往下运行 scanf("%d",&num);

有语法错误，编译不通过怎么可能运行呢，编译不过是不会生成可执行程序的。


Question: vc++6.0为什么会出现这种情况求大佬啊

引用 8 楼 柒贰伍玖的回复:代码问题的可能性比较大，把代码贴出来看看 我不会贴代码啊，错误我找到了谢谢

谢谢大佬解释，我发现了我scanf错了

代码问题的可能性比较大，把代码贴出来看看

0错误0警告只是代表没有编译的问题，不等于运行时正确。  #include <stdio.h> int main() { char * s = NULL; scanf("%s", s); } 这个程序就能通过编译，只要一运行，就出和你看到的一样的错误。

引用 2 楼 m0_45923086 的回复:[quote=引用 1 楼 liups的回复:]多半是程序错了，不是VC的锅 可是程序0错误0警告啊 到内一步执行就崩溃[/quote] 程序问题！具体两种可能： 1、代码有问题；2、运行时错误，比如输入了不恰当的内容

你的代码呢？问题还是出在代码逻辑上~

代码发出来看看

引用 1 楼 liups的回复:多半是程序错了，不是VC的锅 可是程序0错误0警告啊 到内一步执行就崩溃

多半是程序错了，不是VC的锅

有没有用到读文件，文件路径是不是正确，先用绝对路径试试，相对路径很麻烦


Question: 定义可选参数的函数，以及调用时的参数提示

引用 1 楼 user-2 的回复：咋可能边输入边有提示，那你输入输出都在一行了后面都没办法读进去，而且你输入不结束也没有输出啊我用过这种，不会写


Question: 一直输出0，不知道哪儿有问题

判断函数需要改一下 先判断 是不是7 的倍数，因为你再判断某位是7的时候，再改变number的值了，最后number为0，对7取余肯定是0,等于是是输入的所有数都是与7相关了  判断函数开始 if(!number)     return 0;  if(0 == (number%7))     return 1;  循环里面 if(digit == 7)     return 1;  最后函数返回 return 0;

#include<stdio.h> #include<math.h>  bool judgement(int number)//写一个判断是不是与7相关的函数。 {     int digit, tmp = number;      while (1) {         digit = tmp % 10;         if (digit == 7)             return true;         tmp /= 10;         if (tmp == 0)             break;     }     if (number / 7 == 0)         return true;      return false;     /*     int digit;     bool condition1=0,condition2=0;     while(1)     {         digit=number%10;         number/=10;         if(digit==7)         {             condition1=1;//1真0假。         }         if(number==0)         {             break;         }     } //判断是否符合条件1。     if(number%7==0)         condition2=1;//判断是否符合条件2。     if(condition1==1||condition2==1)         return 1;     else return 0;     */ } //满足其中一个就是与7相关。  int main() {     int n;     scanf("%d",&n);     long sum=0;     int i;     for(i=1;i<=n;i++)     {         if(judgement(i)==0)         {             sum += pow(i,2);         }//求与7无关的平方和。     }     printf("%ld\n",sum);     return 0; } 供参考～  楼主的这行代码：  if(number%7==0)         condition2=1;//判断是否符合条件2 有问题。因为number已经是0了，不然不会从while中跳出的。  自己好好想想这个问题～


Question: 将有序数组转换为二叉搜索树

struct TreeNode* fuzhi(int* nums, int left, int right); struct TreeNode* sortedArrayToBST(int* nums, int numsSize){      if(numsSize == 0)         return NULL;     return fuzhi(nums, 0, numsSize - 1); } struct TreeNode* fuzhi(int* nums, int left, int right) {     if(left > right || left < 0)         return NULL;     struct TreeNode* root = (struct TreeNode*)malloc(sizeof(struct TreeNode));     int mid = left + (right - left) / 2;     root->val = nums[mid];     root->left = fuzhi(nums, left, mid - 1);     root->right = fuzhi(nums, mid + 1, right);     return root; }

引用 1 楼 寻开心 的回复:贴代码， 谁知道你写的是啥啊   哈哈，他可能让你翻译翻译。哈哈哈

贴代码， 谁知道你写的是啥啊


Question: c语言

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

2楼正解，内存对齐，32位系统，默认是4字节，也可以自己自定对齐字节数

结构体对齐补齐，补前面一个数据字节的最小倍数超过4按4，指针在32位系统不管类型都是4

建议楼主查一下结构体对齐，为了读写内存效率高，编译器会对结构体补齐，按照结构体中占用内存最大的变量对齐（Linux默认是32位系统里4字节对齐），int是占4字节，month虽然是char，但是后面会补齐4字节，因此会填充3字节。最后是12字节。  指针，对于32为系统，占用4字节（所有的指针都是一样的）


Question: C语言编程  校园跳蚤市场信息管理

买瓶杀虫剂，自己喷一下，也许代码就自己出来了，就不用自己去搜了


Question: 大神求帮忙

自己写，有问题再提部


Question: 为啥  “for”那行有4个报错？

Excel写习惯了。。。。。。

for(i=0;(2i+1)<=max;i++) pi += 4*pow(-1,i)/(2i+1); 乘号不能省略 2*i+1

2i+1 是复数

for(i=0; (2*i+1)<=max; i++)     pi += 4*pow(-1,i)/(2*i+1);


Question: 运行没结果

引用 5 楼 自信男孩的回复:#include <stdio.h> #include <stdlib.h> #include <math.h>  #define pi 3.1415926535  double sinx(double a);  int main() {     double a;     scanf("%lf", &a);      printf("a = %lf\n", a);     printf("角a（弧度制）的正弦值为：%lf \n",sinx(a));     printf("角a（弧度制）的余弦值为：%lf \n",sqrt(1 - sinx(a)*sinx(a)));     printf("角a（弧度制）的正切值为：%lf \n",sinx(a) / sqrt(1 - sinx(a)*sinx(a)));      return 0; }  double sinx(double a) {     int i;     double angle[] = {pi/4,pi/8,pi/16,         pi/32,pi/64,pi/128,         pi/256,pi/512,pi/1024,         pi/2048,pi/4096,pi/8192,pi/16384     };      double tan1[]={1,0.4142135623731,0.19891236737966,         0.098491403357164,0.049126849769467,         0.024548622108925,0.012272462379566,         0.0061360001576234,0.0030679712014227,         0.0015339819910887,0.00076699054434309,         0.00038349521577144,0.00019174760083571};      if(a <= (pi/16384)) {         return a; //因为a的值太小，sin a 约等于 a     }else{          //开始 CORDIC 算法          int negitive = a < 0; // sin(-a) = -sin(a)          double x = 10;          double y = 0;          double theta = 0;          for(i = 0;i < 13;i ++){ //开始迭代              double orix,oriy;              while(theta < a){ //当前角度小于a                  orix = x;                  oriy = y;                  //坐标旋转                  x = orix - tan1[i] * oriy;                  y = tan1[i] * orix + oriy;                  theta += angle[i];              }              if(theta == a){                  if(negitive){                      return -(y/sqrt((x*x+y*y)));                  }else{                      return (y/sqrt((x*x+y*y)));                  }              }else{                  //旋转的弧度超过了a，退回原来增加的角度，同时进入下一次迭代                  theta -= angle[i];                  x = orix;                  y = oriy;              }          }          if(negitive){              return -(y/sqrt((x*x+y*y)));          }else{              return (y/sqrt((x*x+y*y)));          }      }  }  供参考～  代码有问题，函数内定义函数了。你确定是抄别人可以运行的代码～？ 这个好棒！蟹蟹🌹   (我从这儿搜的然后一个个瞎改error🌚)

嗯嗯然后最后的printf我也错了（没加%lf） 谢谢你们~

#include "stdio.h" #include "stdlib.h" //#include<windows.h>  int main() { 	double a; 	scanf("%f",&a); 	printf("%f\n",a); 	system("pause"); }  运行结果： 2.141592678971727 -92559604384177266000000000000000000000000000000000000000000000.000000 请按任意键继续. . .  -------------------------------------------------------------------------------------------------   #include "stdio.h" #include "stdlib.h" //#include<windows.h>  int main() { 	double a; 	scanf("%lf",&a); 	printf("%f\n",a); 	system("pause"); }  运行结果 2.141592678971727 2.141593 请按任意键继续. . .

int main() {	 double a; int i; scanf("%f",&a);  %lf是是正确的

在上一个帖子里面告诉你了  double要%lf格式在scanf里面输入 否则你输入什么都是0  你可以自己看看，scanf了a后，再输出printf 看看 a是不是0


Question: c的枚举题

把你们老师叫上来，让我们给他上上课    我们当老师的时候，估计他还在读书呢

枚举类型值默认从0开始依次加一，如果给了初始值，则从那个值开始加一（枚举变量从左往右）

c1最后被赋值white，根据枚举类型的值向后递增，应该是6.

#include "stdio.h" #include "stdlib.h" //#include<windows.h>  int main() { 	enum color{red, yellow, blue = 4, green, white}c1; 	c1 = yellow,c1 = white; 	printf("%d\n",c1); 	system("pause"); }    运行结果： 6 请按任意键继续. . .

写代码运行一下就可靠

对啊!但老师给我们这试卷答案选B我就懵了现在看应该是老师给错答案了

c1=yellow, c1=white; 逗号运算符，先执行做面的后执行右边的， 最后就是c1=white  按照定义。red=0， yellow=1， blue=4， green=5， white=6  最后c1就是6

D 6 从blue开始，后面每一个比前面的那个大一


Question: 输入输出有问题

double 对应 %lf float 对应 %f scanf函数 仔细看看

就是这个5555我是sb   蟹蟹蟹蟹蟹蟹蟹蟹蟹蟹蟹蟹蟹

int main( ) 排版问题还是漏了，按理说正常的缩进应该是可以在这个位置看到的

这个error已改（前面不小心删了一个“{”）谢谢 然后又有新问题了555555求........

a的定义发一下，最好把更多的代码发一下


Question: C语言制作简单计算器

c1还没初始化，是一个随机值。注意getchar()会把第一次输入的换行符获取到（前提是第一个输入就回车）

do while下应该是不需要先初始化的，当然不同的编译器可能不同 要么其他地方错了 一般变量声明最好立即初始化

引用 1 楼 user-3的回复:c1得先初始化值后再用于while循环 不对啊，我用do while试了一遍，还是无法通过编译啊，这怎么解释呢？

引用 1 楼 user-3的回复:c1得先初始化值后再用于while循环 哦哦，懂了，一语惊醒梦中人啊，刚刚咋也没看出来

c1得先初始化值后再用于while循环


Question: 啊啊啊啊啊求助大佬

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

哭也是没有用呢，自己先谢谢，要不把你的生活费贡献出现，让别人帮你写。  只提需求，一行代码不写的，这是让别人“做项目”，需要费用的～

自己写的，就是再烂，也值得鼓励，你可以把你写的程序贴出来，让人帮你提提建议，做一些修改

暴风式哭泣的楼主


Question: 指针问题

引用 7 楼 寻开心 的回复：根本就不是二维的 第一个【】返回了char* ， 第二个【】取字符串的元素 是两步【】合并到一起的，并不是二维数组 你可以认为是 (p[1])[1]懂了懂了谢谢了

看你自己的定义  char *p[]= ｛"one", "two", "three"｝  p[1] 就是 “two”这个字符互串的指针  对于字符串来说，【1】就是取第二个字符 所以 p【1】【1】 就是w

引用 2 楼 寻开心 的回复：printf("%c", p[1][1]); p[1] 是 two p【1】【1】就是w了为什么p.1.1就是w了。为啥是二维的

没有越界啊 这个不是char【】【】，尽管用了两个【】 p是一维的char*数组，内容是指针  p【1】返回的是指针， 内容是“two”

这个不会越界嘛？第三个字符串 指针与数组名本质一样，都是地址，p[][]就可以了第一个[]代表是第几个字符串，也就是二维数组的行，后面的是列

建议贴出代码，先在机器上运行一下，然后贴出代码。这样可以更好的帮你解决问题。图片你是方便了，解决问题的人不方便呢


Question: 数据结构


Question: 对单链表的就地逆转

三个指针 定义三个指针 Linklist pLast, pCur, pNext;   分别表示：     pLast：上一个， 已经逆转过的，next指针已经指向更前一个了     pCur： 当前要逆转的， next指针正常指向下一个     pLast： 下一个指针，接下来要逆转的  初始化：    if ( NULL = head ) return;    pLast = head;    if ( pHead->next ）       pCur = head->next;    else       return; // 就一个节点指针，不用逆转    pLast->next = NULL;    while （pCur） ｛          pNext = pCur->next；          pCur->next = pLast;          pLast = pCur;          pCur = pNext;   ｝   head = pCur; }


Question: c#编写一个应用程序

引用 1 楼 柒贰伍玖的回复:自己先写代码，不会的地方把代码贴出来，大家帮你， 会编写1-100能被7整除的数，和5个数相加的和 不会写这样的运行界面:7+14+21+28+35=105

自己先写代码，不会的地方把代码贴出来，大家帮你，

引用 4 楼 柒贰伍玖的回复:先算，后打印 把能被7整除的数依次放到一个数组里面，算完之后然后打印 5个5个的打 sum = 0; i = 0; while(i < 总数) {     printf(a[i]);     sum +=  a[i];     i++;          if(i < 总数)     {         printf("+%d",a[i]);         sum+= a[i];         i++;     }     if(i < 总数)     {         printf("+%d",a[i]);         sum+= a[i];         i++;     }     if(i < 总数)     {         printf("+%d",a[i]);         sum+= a[i];         i++;     }     if(i < 总数)     {         printf("+%d",a[i]);         sum+= a[i];         i++;     }     printf(sum+换行);     sum = 0; } 好的，已经解决了，谢谢

引用 2 楼 qq_45718830 的回复:[quote=引用 1 楼 柒贰伍玖的回复:]自己先写代码，不会的地方把代码贴出来，大家帮你， 会编写1-100能被7整除的数，和5个数相加的和 不会写这样的运行界面:7+14+21+28+35=105[/quote] 作一行输出就是了


Question: 将有序数组转换为二叉搜索树——runtime error

root->val = nums[mid]; -> root.val = nums[mid];试试

你的调用是错误的吧？ TreeNode* fuzhi(int* nums, int left, int right) 然而你调用 fuzhi(root->left, left, mid - 1);  第一个参数不对，人家要求的是整形指针（或者说是一个整形数组），你给的是struct TreeNode* ，怎么能对？

检测nums,是否调用正确


Question: 请问这两个程序有错吗？？

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

好像少了个分号。你可以打出来咯

为啥不在编译器上编译运行一下呢？要走程序员这条路，还是要注重实践的～

貌似莫的

都能跑

你倒是把代码文字方式贴上来啊 上图还歪着放， 这是知道成员都颈椎不好，要让大家多锻炼的节奏啊


Question: 求大神帮忙处理一下这个c语言课设


Question: 如何用fscanf函数读取多行txt文件

兄弟怎么解决的？

引用 2 楼 被偷走的时光 的回复: 空格分隔  多一个分号 while(fscanf(fp,"%s%s%s%s%d%d%d%f%d",             p->num,p->name,p->grade,p->major,             &p->mark[0],&p->mark[1],&p->mark[2],             &p->avemark,&p->totalmark)!=EOF); while后多一个分号，了解了吗？

空格分隔

循环读取不就可以读取多行了吗？ 另外，你把你的文件内容格式发一下～


Question: 期末了 课程设计！


Question: c语言怎么用vc++在运行的程序中添加背景音乐

没有帮助，打广告的不要点进去大家，会受骗的

引用 8 楼 菜鸡新手gsy的回复:[quote=引用 7 楼 user-3的回复:][quote=引用 6 楼 菜鸡新手gsy的回复:][quote=引用 5 楼 user-3的回复:][quote=引用 4 楼 菜鸡新手gsy的回复:][quote=引用 3 楼 user-3的回复:]你是拿什么界面库写的小游戏呢？一般都有音频播放函数 啥？界面库是什么？？？我脑子里好像没这个概念[/quote] 没有界面你写的什么游戏？[/quote] 就很简单的五子棋......用基础的c语言写的，没有很复杂......[/quote] 就是没有用画图api，一个控制台（黑框）程序吗？[/quote] 对啊刚学c语言，只懂一点点[/quote] 可以用一下easyX的函数，使用windowsAPI应该也能播放

引用 7 楼 user-3的回复:[quote=引用 6 楼 菜鸡新手gsy的回复:][quote=引用 5 楼 user-3的回复:][quote=引用 4 楼 菜鸡新手gsy的回复:][quote=引用 3 楼 user-3的回复:]你是拿什么界面库写的小游戏呢？一般都有音频播放函数 啥？界面库是什么？？？我脑子里好像没这个概念[/quote] 没有界面你写的什么游戏？[/quote] 就很简单的五子棋......用基础的c语言写的，没有很复杂......[/quote] 就是没有用画图api，一个控制台（黑框）程序吗？[/quote] 对啊刚学c语言，只懂一点点

引用 6 楼 菜鸡新手gsy的回复:[quote=引用 5 楼 user-3的回复:][quote=引用 4 楼 菜鸡新手gsy的回复:][quote=引用 3 楼 user-3的回复:]你是拿什么界面库写的小游戏呢？一般都有音频播放函数 啥？界面库是什么？？？我脑子里好像没这个概念[/quote] 没有界面你写的什么游戏？[/quote] 就很简单的五子棋......用基础的c语言写的，没有很复杂......[/quote] 就是没有用画图api，一个控制台（黑框）程序吗？

引用 5 楼 user-3的回复:[quote=引用 4 楼 菜鸡新手gsy的回复:][quote=引用 3 楼 user-3的回复:]你是拿什么界面库写的小游戏呢？一般都有音频播放函数 啥？界面库是什么？？？我脑子里好像没这个概念[/quote] 没有界面你写的什么游戏？[/quote] 就很简单的五子棋......用基础的c语言写的，没有很复杂......

引用 4 楼 菜鸡新手gsy的回复:[quote=引用 3 楼 user-3的回复:]你是拿什么界面库写的小游戏呢？一般都有音频播放函数 啥？界面库是什么？？？我脑子里好像没这个概念[/quote] 没有界面你写的什么游戏？

引用 3 楼 user-3的回复:你是拿什么界面库写的小游戏呢？一般都有音频播放函数 啥？界面库是什么？？？我脑子里好像没这个概念

你是拿什么界面库写的小游戏呢？一般都有音频播放函数

大佬们！！！！！！！！


Question: PTA出租车计价

你的变量类型 和 scanf指定的类型没有保持一致吧 double 对应 %lf float 对应 %f 他们没有匹配上，输入的内容就是不正确的， 你可以在scanf之后，加一句printf 把输入的内容再输出出来，看看是不是一样 比如， 你scanf指定%lf，而参数是float类型的时候， 你接下来的printf就会发现， 输出的结果和你输入的不是一样的啦   你可以把代码里面的double都改成float，同时把scanf里面的%lf改成%f，再运行看看， 不会有错的  flaot和double的区别有两个，一个是有效数字的长度，一个是可表示的范围 选择用哪种取决于数的范围 对于本题来说，float类型足够了


Question: 提问

结贴这个问题只能扔锅给CSDN，就像淘宝一样，买了东西收到没有问题买家就忘记这个事情了，是不是卖家都得饿死？

APP端好像不能结帖

引用 2 楼 寻开心的回复:对于这种提问了八个问题，重来不结贴的人，可以考虑拉黑了   什么是结贴啊？怎么样算结贴呢？

这代码真的是秀的我头皮发麻，写这样的代码不是高手，是傻X

对于这种提问了八个问题，重来不结贴的人，可以考虑拉黑了

a*=a  a=144 a-=a  a=0 a+=a a=0 所以最后结果为0


Question: 有人帮忙改一下课程设计吗

先自己写写，遇到问题再提出来吧～


Question: 求大佬教教我

strstr函数去了解下，应该能解决你的问题

strcat函数就可以了，判断存不存在，存在strcat（字符串首地址，字符地址）； 如char str【100】={],ch;判断...strcat(str,&ch);数组名是首地址，可以直接用。变量需要取地址


Question: C语言

引用 3 楼 qtwl666666 的回复:[quote=引用 2 楼 user-2的回复:]加string.h头文件 可以写完整代码给我吗[/quote] 思路告诉你了，加上写的，这基本都出来了，你要自己去写一下啊，你自己不去想不去写那你做这个训练题有什么意义呢？

引用 2 楼 user-2的回复:加string.h头文件 可以写完整代码给我吗

加string.h头文件

定义个存储长度的变量，然后strlen去获取字符串的长度累加 int sum=0;int i=0;char str[81]={}; scanf("%d",&n);//要加判断条件 getchar(); while(i<n) { gets(str)； sum+=（int）strlen（str）；//大概可以，不行的话就定义个变量接收返回值，然后在sum+这个变量的值 memset（str，'\0',81）；把str清空，方便下一次读，避免出错，也可以不用 } 再输出sum就可以了，大概思路就这样，你先自己写一下，写不出来我再给你代码，这样学的比较多 我代码里有中文输入的，不能直接复制，自己敲一下


Question: C语言

#include "stdio.h"  #include <string.h>  int main(int argc,char *argv[]){    char s[100][81];  int i,n;  printf("Enter n(int 0<n<101)...\nn=");  if(scanf("%d",&n)!=1 || n<1 || n>100){  printf("Input error, exit...\n");  return 0;  }  printf("Please enter %d strings...\n",n);  getchar();  for(i=0;i<n;i++)  fgets(s[i],81,stdin);//代替gets(s[i]);,能限制长度为80  for(i=0;i<n;i++)  printf("The string %d's length is %d.\n",i+1,strlen(s[i]));  return 0;  }  用fgets接收的字符串，最后把打入的回车也接收了，所以测出的长度看起来要多一个。改为gets就没有这事了，但gets不能限制长度，要人式控制长度不能越界。


Question: 大佬，求解释详细一点

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

真假对应int的值就是1和0.宏定义就是等价替换，并且是在预编译阶段，即生成可执行程序前就替换了～

宏替换是单纯的复制粘贴替换，不考虑语法 其他主要考虑符号优先级

楼上思路正解

1：1  比较1小于0不成立结果为0，再这个结果跟5比较结果成立为1 2：define先宏展开不运算，第一个展开是i+2<3？5:6-->(3+2)<3?5:6所以是6，而后面的加了括号就是i+(2<3?5:6)先运算括号，也就是5再加i的值也就是8 了


Question: C语言求教：这数字怎么处理

没错，是这样的，非常感谢

他没错啊，你求得就是跟平方根有关，只不过这个特殊在一开始就有个成立的，你输出平凡解会输出一遍，然后while循环会去找第二个，如果你只想输出一个的话 bool flog=false;//要加头文件stdbool.h，你也可以定义个int的值，反正只要可以判断就好了 if(n==t*t)  /*输出平凡解*/ { x=1;     printf("n=%2d  x=%3.0f  x*x=%6.0f",n,x,x*x); printf("  y=%3.0f  n*y*y+1=%6.0f\n",y,n*y*y+1); flog=true; } while循环前先判断flog是否为false，是则进入循环，否则不进 是这个意思吧？我的理解是这样


Question: 哪里错了，编程输入全班前51名同学的成绩，用冒泡法将成绩排序，并求出前25名同学的平均分比后25名同学的平均分高

#include<stdio.h> void sort(int arr[],int n){         int i,j,t;         for(i=0;i<n;i++){                 int flog=0;                 for(j=1;j<n-i;j++){                         if(arr[j-1]>arr[j]){                                 t=arr[j];                                 arr[j]=arr[j-1];                                 arr[j-1]=t;                                 flog=1;                         }                 }                 if(flog==0){                         break;                 }         } } int main() {         int arr[50]={},i,max_sum=0,min_sum=0;         for(i=0;i<50;i++){                 scanf("%d",&arr[i]);         }         sort(arr,50);         for(i=0;i<50;i++){                 if(i<25){                         max_sum+=arr[i];                 }                 else{                         min_sum+=arr[i];                 }         }         double higt=(max_sum-min_sum)*1.0/25;         printf("%.2f\n",higt);         return 0; } 程序不是最简，可以自己尝试简化，加强理解

你的排序呢？这程序看不出来跟你的题目关系在哪


Question: C语言谁会解

引用 5 楼 qq_1457346882的回复:你这个式子卷子打错了吧，第三个值应该是7/11，不然就这几项是没有办法推出规律的，得不到后面的值 对的，卷子错了，之后才改

3/4  4/7  7/11  11/15 .... 这样才有规律啊  构造一个序列 3， 4， 7， 11， 15， 26， ..... 斐波那契数列啊 奇数项目就是 3/4   7/11  15/26  先把这个数列做出来，放到数组里面，然后再循环一次计算， 注意转换成浮点数再做除法，很简单的  int ary[50] = {3, 4, }; int i=0;  for (i=2; i<50;i++)  ary[i] = ary[i-1] + ary[i-2]; float v=0; for (i=0; i<50/2; i++)     v = ary[2*i] * 1.0 / ary[2*i+1]; 输出v结束

你这个规律是啥？

引用 1 楼 user-3的回复:找出规律，自己动手写一下，用代码提问 #include<stdio.h> int main() { 	int i, a, b, t, f; 	float sum; 	sum = 0; 	f = 1; 	a = 3; 	b = 4; 	for(i=1; i<=50; i++) 	{ 		if(i%2 == 1) 		{ 			sum += 1.0*a/b;	 		} 		t = a+b; 		if(f == 1) 		{ 			a = b; 			f = 0; 		} 		if(f == 0) 		{ 			f == 1;	 		} 		b = t; 	}  	printf("%.2f", sum); 	return 0; }

引用 1 楼 user-3的回复:找出规律，自己动手写一下，用代码提问 额😓，不会，我不是学这个的

找出规律，自己动手写一下，用代码提问


Question: 用Dev-C++运行的，到第二次循环计算的时候1.	keep函数中，符号总是判断不正确； 2.	judge函数的运算次数有问题，不确定；跪求大佬解答！

谢谢大佬，这样正确了。 我还想请教一下，像这个程序，怎么加入三角函数的运算比较好？

float keep(float y)          //Y：继续； {     char t;     float x3; fflush(stdin);     printf("请继续输入\n");     scanf("%c%f",&t,&x3); y = analyze(y,t,x3);        //赋完值后进行:算式分析和计算；     printf("%5.2f",y);     return y; } void judge(float y)        //判断是否继续计算； {     fflush(stdin);     printf("    continue？\n");//输入Y/else；     char answer;     scanf("%s",&answer);     if(answer=='Y')     { y=keep(y);           //进行继续赋值；         return judge(y);     }     else         printf("按任意键结束结束！");  }

就算是改成 t= analyze(y,t,x3);  但在之后的运算中，运算符号还是没有被识别出来，结果就输出为0了

怎么可能保存啊，形参和实参的问题，y和t依然是老值，和传参之前相比不会变化的

前面的analyze函数是float型，最后的return语句可以返回得到的y值，应该是会保存的吧； 主要是这个程序在第二次执行时，没办法识别运算符号，eg：+，-，*，/。

应该是 t= analyze(y,t,x3); 或者y=analyze(y,t,x3); 没有保存返回的结果，后面的分析和printf输出就没有意义了

float keep(float y)          //Y：继续； { char t; float x3; printf("请继续输入\n"); scanf("%c%f",&t,&x3); analyze(y,t,x3);        // 这个计算结果你就木有保存啊，后面的分析的都不是这个返回值 /* switch(t) { case '+':y=y+x3;break; case '-':y=y-x3;break; case '*':y=y*x3;break; case '/':y=y/x3;break; case '%':y=(int)y%(int)x3;break; // case 'sin':y=sin(x2*3.1415926/180);break; // case 'cos':y=cos(x2*3.1415926/180);break; // case 'tan':y=tan(x2*3.1415926/180);break; default: printf("input have a error\n"); }      */ printf("%5.2f",y); return y; }


Question: 求助C语言程序解释

引用 楼主 山海路人不见经 的回复:程序中并没有详细注明具体怎么从A柱通过C柱到B柱，或者从B柱通过A柱到C柱，计算机是如何实现的？ 这些可能有点抽象，但是就是这样反复递归就实现了，你仔细想想

引用 2 楼 山海路人不见经 的回复:[quote=引用 1 楼 user-1的回复:][quote=引用 楼主 山海路人不见经 的回复:] 程序中并没有详细注明具体怎么从A柱通过C柱到B柱，或者从B柱通过A柱到C柱，计算机是如何实现的？ 这些可能有点抽象，但是就是这样反复递归就实现了，你仔细想想[/quote] 吃完饭递推了一下，是我愚钝了谢谢[/quote] 1、是递归！不是递推； 2、只是思想没有转过弯，你在书上划的4条红杠足以解决此问题，提示一句，每次盘子都在减少，最后盘子少到一定程度你就明白了

引用 1 楼 user-1的回复:[quote=引用 楼主 山海路人不见经 的回复:] 程序中并没有详细注明具体怎么从A柱通过C柱到B柱，或者从B柱通过A柱到C柱，计算机是如何实现的？ 这些可能有点抽象，但是就是这样反复递归就实现了，你仔细想想[/quote] 吃完饭递推了一下，是我愚钝了谢谢


Question: (以下几个变量都是指向int类型的指针)middle=end-(end-start)/2;

地址如果是指针， 那么也是同样的 两个指针的减法结果也是整数， 指针加减整数的结果是指针。  没有两个指针类型之间的+*/这种运算  所以，end start middle是指针也好， 是整数类型的下标也好， 都是统一的

引用 1 楼 寻开心的回复:就算法本身来说，是左边和右边都无所谓 按照你的这个公式则是右边 end =3， start=0 计算一下看看，  （end-start）/2 结果是1，因为是整数除法；    middle=2， 位于右侧了 好吧，谢谢，地址也是这样算的吗？我知道整除，但是不知道这个地址也是这样的

最好自己打印一下middle的值，这样可以验证自己想要的结果。


Question: c语言简单题

输出123 把sizeof(int)用4替换掉，就是 *((p+=4) - 4 ) p是char* a是int数组，p每次加4才能指向下一个整数，否则只是指向整数的从低位到高位的不同字节  p+=4的重点是p每次循环中， 指向的位置分别是a[1], a[2], a[3]， p的值变了。  如果没有等号是。p+sizieof（int） 那么每次循环都是同一个p  再减4后变成 a[0], a[1], a[2]  因为输出的格式是整数， 所以实际上三次循环输出的就是数组的头三项


Question: 求大神指教

引用 1 楼 等风、来的回复:可以自己写六个函数，每个函数实现一个需求，最后用主函数调用即可 老铁    这儿发不了文件    加我qq      帮我改一下行吗？    1844901229

我写了一个  但是运行不了

可以自己写六个函数，每个函数实现一个需求，最后用主函数调用即可


Question: 复习时遇到的问题

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

宏在编译时执行替换操作

同意4楼，括号！ 另外，使用函数或内联函数更好

宏定义在预编译阶段就等价替换了，所以运行时是这样的表达式：f(a) / f(b)，6 * 6 / 2 * 2 = 自己算一下

最终宏定义替换后是这样的    c=a*a/b*b = 36


Question: 颠倒五个数输出、为什么错了

#include <stdio.h>  int main( ) {     int  arr[ 5],i;     void reverse(int arr[ ] ,int n);     for(i=0;i<5;i++)     {         printf("input a number:\n");         //scanf("%d\n",&arr[i]);         scanf("%d",&arr[i]);     }     //void reverse(arr,5);     reverse(arr,5);     return 0; }   void reverse(int arr[ ],int n) {     int t,i;     //for(i=0;i<n/2;n++)     for(i=0;i<n/2;i++)     {         t=arr[i];         arr[i]=arr[n-1-i];         arr[n-1-i]=t;      }     for(i=0;i<n;i++)         printf("%d\n",arr[i]); } 供参考～

楼上正解。结贴吧

void reverse(int arr[ ] ,int n);  int main( ) {     int  arr[ 5],i;     for(i=0;i<5;i++)     {         printf("input a number:\n");         scanf("%d\n",&arr[i]);     }     reverse(arr,5);     return 0; } void reverse(int arr[ ],int n) {     int t,i;     for(i=0;i<n/2;i++)     {         t=arr[i];         arr[i]=arr[n-1-i];         arr[n-1-i]=t;     } for(i=0;i<n;i++) printf("%d\n",arr[i]); }


Question: 求过程，急

a=3, b=2, c=1 c-=++b; // b=3,c=-2; b*=a+c;   //b=3; //所以第二个printf中的b和c就是这里的b和c，b=3, c=-2  b=5,c=12 c/=b*2;   // c=1 a-=c; //  a=2  所以第一个printf中的a、b、c等于2,5,1  a += --c;  // c=0; a=2;  所以第二个printf的a也等于2


Question: 我这个程序为什么没有返回值？

引用 3 楼 寻开心 的回复：这样无论你输入几个字符（不超过19个， 因为字符串结束标记0也要占数组一个位置； 超过19个会让数组容纳不下而溢出） 然后回车， 就可以调用你的计数程序了 之前的一个一个字符的输入方法下，即便你输入了20个字符， 计数函数里面的循环也会因为数组里面没有0，所以循环会跑出数组外面继续循环，也会造成破坏性的后果。谢谢

谢谢谢谢谢谢大佬

你这个程序强制要求输入20个字符， 没有返回值恐怕是你一直没有输入够20个字符 改成字符串输入，不要for循环 scanf（“%s”， a）； 这样就可以了

代码应该没问题 #include<stdio.h> #include <string.h> int countlets(char str[]); int main() { 	 	char a[20]; 	int i; 	printf("input a string:\n"); 	for (i = 0; i < 20; i++) 	{ 		scanf("%c", &a[i]); 	} 	printf("%d", countlets(a)); 	return 0; }  int countlets(char a[]) { 	int i; 	int n = 0; 	for (i = 0; a[i]; i++) 	{ 		if ((a[i] >= 65 && a[i] <= 90) || (a[i] >= 97 && a[i] <= 122)) 		{ 			n++; 		} 	} 	return n; } VS2015 C++环境调试

楼主的字符数组并不是以'\0'结束的，因此不能成为字符串。而自定义函数里却要判断是不是'\0'，因此程序不能正常结束


Question: 求大佬告知我这段代码错在哪，我一运行就会崩溃

谢谢

while (s[idx] != '0'){  // 这里应该是 ！= 0          idx++;     }  你的字符串里面没有字符0， 所以会一直找下去并超过字符串的尾巴。 字符串结尾是'\0' 不是’0‘


Question: C语言

可否具体，，，，，，

好难的问题， 看不懂啊。 举例说明一下呗


Question: 为什么我的计算器实验程序有16处报错？

引用 11 楼 寻开心 的回复:main函数原型是什么就是什么啊 它只有两种：    int main（）    int main（int， char** ）   编译器自己支持，不代表编译器就是对的， 只有c/c++标准才是对的  就和现在一些汉字的读法类似（比如角色 呆板）， 因为一些无知的人习惯，把过去严格强调的字的读法给硬生生的改了， 这都是不负责任的行为！ 这个比喻不认同。 像我记得过去曝光，最早就应该是pu的标准读音。但后来读bao的人多了，字典后也做出更变，以符合大家的习惯。 事实>理论>规则 后者无论任何的改变都应该服从于前者。发生不可调和的矛盾时应该更正后者而非前者。 不过，就main这个事情来说，还没有到这样的程度。用int main的人也不少。且int main有返回值也符合实际上的情况

#include <stdio.h> int main() { float x,y; char op; printf("请输入算式：\n"); scanf("%f%c%f",&x,&op,&y); switch(op) { case '+': printf("%.2f%c%.2f=%.2f\n",x,op,y,x+y); break; case '-': printf("%.2f%c%.2f=%.2f\n",x,op,y,x-y); break; case '*': printf("%.2f%c%.2f=%.2f\n",x,op,y,x*y); break; case '/':  if(y==0.0) printf("ERROR\n");  else printf("%.2f%c%.2f=%.2f",x,op,y,x/y); } return 0;  }

引用 4 楼 Bill_Kwok 的回复:曾怡老师的培训课件上的代码用的就是void  main()。我一直不太明白这个返回值到底怎么控制程序的。改成 int   main()后问题确实解决了。  编译器不一样，老式的编译器都是这样的～不能怪老师，而是看你在什么编译器上开发～

管他张姨还是李姨， 错了就是错了  c/c++标准才是是唯一的标准

main函数的返回值不是给这个程序自身用的  而是给调用这个程序的程序用的  main函数的一般来说是表示程序以什么方式结束的， return 0表示正常结束 其他的数值也都有不同的意义，具体什么意义是写程序的人定义的 比如，你的程序负责生成一堆数据，然后写入磁盘。 这个事儿，可能做成了，也可能没有做成 你可以return 0表示成功， 1表示不成功  别人的程序调用你的程序来完成这个数据的生成， 通过你的返回值知道成功与否，再决定他自己的函数如何处理  就现在初学者来说，你就记住了， return 0就对了。其他的可以先不管，别闲的无聊随意返回别的值，这个习惯不好。

这是曾怡老师上课时候给的代码。

猪头老师多了去了。  误人子弟的不奇怪。

case '+':printf("%.2f%c%.2f=%.2f\n"，x,op,y,x+y);break;  告诉你啦。 这个逗号是中文全角的， 你要换成英文的逗号

#include <stdio.h> int main() { 	float x,y; 	char op; 	printf("Please enter x,operation, y："); 	scanf("%f%c%f",&x,&op,&y); 	switch(op) 	{ 	case '+':printf("%.2f%c%.2f=%.2f\n"，x,op,y,x+y);break; 	case '-':printf("%.2f%c%.2f=%.2f\n"，x,op,y,x-y);break; 	case '*':printf("%.2f%c%.2f=%.2f\n"，x,op,y,x*y);break; 	case '/': 		if(y==0.0) printf("ERROR\n");  		else printf("%.2f%c%.2f=%.2f"，x,op,y,x/y); 	} 	return 0; }  还是报错16个错误。多有的错误都在4个printf语句中。但是我的源程序和上课老师的源程序貌似完全相同啊。

#include <stdio.h> //void main() int main() {     float x,y;     char op;     printf("请输入算式：");     scanf("%f%c%f",&x,&op,&y);     switch(op)     {         case '+': printf("%.2f%c%.2f=%.2f\n", x,op,y,x+y); break;         case '-': printf("%.2f%c%.2f=%.2f\n", x,op,y,x-y); break;         case '*': printf("%.2f%c%.2f=%.2f\n", x,op,y,x*y); break;         case '/':                   if(y==0.0) printf("ERROR\n");                   else printf("%.2f%c%.2f=%.2f", x,op,y,x/y);     }      return 0; } 供参考～  输入的时候注意不要加空格，尤其是第一个x输入之后不要有空格，直接输入'+', '-'

1. int main() 2. 找到并把中文符号替换会英文符号去，  printf里面的逗号 3.最后补充个return 0；


Question: 怎么用MATLAB或者C实现33节点的遍历

C和C++完整教程：https://blog.csdn.net/it_xiangqiang/category_10581430.html C和C++算法完整教程：https://blog.csdn.net/it_xiangqiang/category_10768339.html

楼主找到了嘛？我也想求一个，quser-2，看到回复，万分感谢


Question: 请问C语言中ASCII码为2（十进制）即STX的字符（一个实心圆）怎么打印出来？

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

引用 7 楼 weixin_45949073 的回复：我的 你要在黑黑的这个东西里右击选择设置，把字体改为点阵字体就会出效果

我的

引用 5 楼 user-3 的回复：标准ascii实际上是7位的，所以是128个。IBM公司搞了扩充，到8位，所以是有256个。 具体的百度一下就知道了知道了，谢谢！

引用 3 楼 user-3 的回复：！！原来是这样！我知道了！

我是按照教材里面查看的，2是一个实心圆

ASCII码表再查一下吧


Question: 求答案

自己把9参数带进去，然后分别计算一下

f(9)=9-f(7) =9-(7-f(5)) =9-(7-(5-f(3))) =9-(7-(5-(3-f(1)))) =7


Question: 提问

逗号运算符，表达式的结果是逗号最后一个变量的值（或者最后一个逗号后的表达式的值）

所以结果就应该是输出m。

逗号操作符， 用来分隔多个表达式 先执行左边，再执行右边 返回的就是最后执行的，也就是右边的表达式的结果  所以对于两个数来说， （a1，a2） 就是 a2


Question: 提问

静态变量 函数里面的静态变量，在函数多次被调用的时候，每次都能保留上一次调用时候的值  自己看书吧， 这种基础概念， 看书， 书上讲的最明白

那static是什么意思呢

无非是考a的有效区域和static的知识点， 至于搞这么长的代码吗   main（）里面的a，就是第一个图的全局变量a 初始化为2，此后除了给s做初始化， 就没有它啥事儿了。 s初始值就是2 此后 s+=f（I）就是s = 2 + f（0） + f（1） + f（2）  关于f函数，为了说明方便， 这个函数里面先后顺序显示的三个static分别叫做a1，a2和a3吧，return部分的a也是a1 （直接把那三个变量自己改一下名字，就非常明显了） 计算f（0） 是第一次进入，结果是8    此时a1是3，n是0， t是0    走a3所在的分支， a3=5； t=a++后，t是5，a3是6    return的是t+a1=5+3=8；  此后a1是4 计算f（1）返回的也是8    a1=4， n=1， t=0    进入a2所在的分支 a2=4，  t=4后a2是5    return t+a1=4+4=8， 此后a1是5 计算f（2）返回 11    a1=5， n=2， t=0    进入a3分枝，此时a3是6了， t=a++后， t是6， a3是7    return的时候 t+a1 = 6 + 5 = 11 此后a1是6  所以，最终的s就是2+8+8+11 = 29


Question: 求助，关于函数调用和for循环

谢谢，太粗心了

int div(int x, int y) { int m, i; m = min(x, y); for (i = m; i >= 1; i--) if (x % m == 0 && y % m == 0) //这里应该是对m取模，不是对m { printf("%d和%d最大公约数是:%d\n", x, y, m); break; } }


Question: c语言字符串和字符

打开你的c语言的书 把范例的部分都撕掉 剩下的都是考点了


Question: 这个错误怎么回事

引用 8 楼 自信男孩 的回复:[quote=引用 7 楼 柒贰伍玖 的回复:] [quote=引用 6 楼 自信男孩 的回复:] [quote=引用 5 楼 柒贰伍玖 的回复:] 实现语句 要放在函数体里，不能放外面，这是C语言标准的 甲鱼臀部——规定 当然你可以自己搞一个语言出来，把它放外面  “gg[i]=&num[i];”  不需要取地址 直接赋值“gg[i]=num[i]；”就好 &是取地址符 那gg类型也不应该是int吧，应该是unsigned long[/quote]  两个数组 都是 int  看他的输出 没必要改类型 简单赋值就好  没必要取地址 32位平台，int就够了；  64位平台才需要long吧[/quote] int最高位是符号位，地址信息最高位也是符号位？并且，int不能显示出系统的位数，long是跟系统位数是匹配的。但是，地址没有符号之说，都是unsigned的[/quote]  只要位数够，什么类型都可以表示地址的吧，符不符号 看自己怎么用喽

引用 7 楼 柒贰伍玖 的回复:[quote=引用 6 楼 自信男孩 的回复:] [quote=引用 5 楼 柒贰伍玖 的回复:] 实现语句 要放在函数体里，不能放外面，这是C语言标准的 甲鱼臀部——规定 当然你可以自己搞一个语言出来，把它放外面  “gg[i]=&num[i];”  不需要取地址 直接赋值“gg[i]=num[i]；”就好 &是取地址符 那gg类型也不应该是int吧，应该是unsigned long[/quote]  两个数组 都是 int  看他的输出 没必要改类型 简单赋值就好  没必要取地址 32位平台，int就够了；  64位平台才需要long吧[/quote] int最高位是符号位，地址信息最高位也是符号位？并且，int不能显示出系统的位数，long是跟系统位数是匹配的。但是，地址没有符号之说，都是unsigned的

引用 6 楼 自信男孩 的回复:[quote=引用 5 楼 柒贰伍玖 的回复:] 实现语句 要放在函数体里，不能放外面，这是C语言标准的 甲鱼臀部——规定 当然你可以自己搞一个语言出来，把它放外面  “gg[i]=&num[i];”  不需要取地址 直接赋值“gg[i]=num[i]；”就好 &是取地址符 那gg类型也不应该是int吧，应该是unsigned long[/quote]  两个数组 都是 int  看他的输出 没必要改类型 简单赋值就好  没必要取地址 32位平台，int就够了；  64位平台才需要long吧

引用 5 楼 柒贰伍玖 的回复:实现语句 要放在函数体里，不能放外面，这是C语言标准的 甲鱼臀部——规定 当然你可以自己搞一个语言出来，把它放外面  “gg[i]=&num[i];”  不需要取地址 直接赋值“gg[i]=num[i]；”就好 &是取地址符 那gg类型也不应该是int吧，应该是unsigned long

#include <stdio.h> int num [4]={1,3,5,8}; int i; int *gg[4];  int main() {     for(i=0;i<=4;i++)     {         gg[i]=&num[i];     }     for(i=0;i<=4;i++)     {         //printf("%x",gg[i]);         printf("%p\t", gg[i]);     }     putchar(10); } 供参考～   表达式不能脱离函数而存在。

就不让用！ 不服气，你就找定义标准的人打一架去。  代码都是从main函数开始执行的，也是在main这儿结束返回 如果在main里面不调用，就永远没有机会执行

为什么不能用

在函数外不能使用基本语句


Question: 救救孩子吧，不理解呀

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

逗号运算符，先执行逗号前面的，后执行逗号后面的。 因为x%y没有改变x和y本身，所以当作无效结果  表达式等同于 z = x/y

引用 2 楼 寻开心的回复:属于未定义的行为  c语言没有规定 加法运算符的两个操作数的执行顺序  编译器可以自己定义 先算那一头，  所以结果在不同的编译器或者不同的版本的编译器上有不同的结果 那大佬你能帮我看看这个z=(x%y,x/y)是怎么个运行方式？？

理解这样的表达式没有意义吧，建议不要写这样的代码～

因为属于未定义的行为，所以不应该出这样的题目

这个问题没意义，这样的代码也不要写


Question: 有点问题，求助

引用 2 楼 weixin_46146701 的回复:[quote=引用 1 楼 user-2 的回复：]好好排版一下  #include<stdio.h> main() { 	int Allheadnum, Allfeetnum; int chick, rabbit;  	printf("Please Input Allheadnumber:"); 	scanf("%d", Allheadnum);  	scanf("%d", Allfeetnum);  	Allheadnum = chick + rabbit; 	4 * Allheadnum - 2 * chick = Allfeetnumber;		//你这是对谁进行赋值？ 	if (int(chick) != chick) printf("数值不合法"); 	if (int(chick) = chick) 	{ 		printf("Chicknumber=", chick); rabbit = Allheadnum - chick; printf("Rabbit number=", rabbit); 	} 	return 0; } 这是方程哈哈哈[/quote]  其实计算机本身是不会解方程的

引用 1 楼 user-2 的回复：好好排版一下  #include<stdio.h> main() { 	int Allheadnum, Allfeetnum; int chick, rabbit;  	printf("Please Input Allheadnumber:"); 	scanf("%d", Allheadnum);  	scanf("%d", Allfeetnum);  	Allheadnum = chick + rabbit; 	4 * Allheadnum - 2 * chick = Allfeetnumber;		//你这是对谁进行赋值？ 	if (int(chick) != chick) printf("数值不合法"); 	if (int(chick) = chick) 	{ 		printf("Chicknumber=", chick); rabbit = Allheadnum - chick; printf("Rabbit number=", rabbit); 	} 	return 0; } 这是方程哈哈哈😂


Question: 求助C语言！！

引用 1 楼 寻开心的回复:C. ++pt->x 因为->优先级比++还要高， 所以它就是 ++(pt->x)   也就是 c【0】.x  加1 [] () -> . 这种是最高优先级的运算符， 其次才是 ++ -- *  & ！ ～ 等  A  *p->y.  是。*(p[0].y) 也就是  a[0] = 2 B  pt->x  是 c[0].x.  = 10 D. (pt++)->x 是 c[1].x = 20; 啊我懂了，  谢谢！！


Question: 输入三位数 Ｎ, 求两位数 ＡＢ (个位数字为 Ｂ, 十位数字为 Ａ, 且有 ０ < Ａ < Ｂ < ９), 使６０ 下述等式成立: ＡＢ∗ＢＡ ＝ Ｎ .

笨办法： 因为       AB * BA  = 101*A*B + 10*A*A + 10 *B*B 所以 输入n for（A=0； A<=9; A++ )      for (B=A; B<=9; B++)          if ( n == 101*A*B+10*A*A + 10*B*B )               输出( "%d=%d%d*%d%d", n,A,B,B,A)  代码自己写


Question: 求助：如何提高速度

double f(int n,double a[],double x) {     int i;     double f  = a[0];     double xi = 1.0;     for(i=1;i<=n;i++)     {         xi *=x;         f += a[i] * xi;     }     return f; };


Question: 跪求C语言for语句中间结束条件有两个的话是满足其中一个条件就可以继续循环吗

我明白啦 谢谢各位大佬

少了大括号了吧   不建议这样做 for（；；） {         x/=2;         y+=2; } 建议使用大括号括起来

标题的提问和内容的提问不同啊   标题的问题和内容的问题都是关于逗号表达式的问题  逗号表达式，是把多个语句串联到一起了，多个语句之间是从左到右的顺序执行的，先逗号左边再逗号右边， 最右边的那个语句的返回值就是整个逗号表达式的返回值  所以，在for循环的终止条件语句里面， 用逗号分隔的两个语句， 真正有效的判断只是右侧的那个 y<10  起效果； 前面的 x>=10执行了 ，但是结果是不被采纳直接抛弃掉的， 完全可以删除掉这个判断而不会对整个代码产生任何影响，可以说是废代码  for循环体里面的逗号语句的作用只是节省了花括号一对儿而已。

应该用逻辑运算符在判断语句

逗号表达式，作用是把多个语句串联到一行里面 左右如同一楼所说， 节省了{ }  但是不推荐这么干， 即不提高运行效率， 也容易产生错误

应该是用分号的话只执行x/=2 分号是这个语句已经结束了  没有括号的情况下只执行for语句后的第一句 想让他们都执行就加大括号


Question: 关于输入函数puts的问题

fgets（word，stdin）这里把回车符号也接受了， puts的时候等同于字符串一个回车，puts命令自带一个回车 fputs只输出了字符串自带的回车，没有自己的回车

首先空行那里为什么会空行我就没搞懂


Question: 大佬们帮忙看个题

引用 3 楼 寻开心的回复:不是那样解释的 和有没有初值没有关系， 你可以自己做实验，给p1和p2赋予初值，依然会是报错的  p1 += 3； p1  -= 3； 这样的对整数的运算是可以的，但是不能对指针做这样的运算 p1 - p2 是可以的，但是结果是整数类型，不是指针类型  p1*p2， p1/p2 没有这样的定义 哦哦，了解，谢谢(*°∀°)=3

谢谢(*°∀°)=3

bcd不是赋值语句，是算术运算。 报错的原因是没有初始化变量。


Question: C语言子字符串个数

引用 2 楼 CSDNQVictor的回复:[quote=引用 1 楼 _NoBug_的回复:][quote=引用 楼主 CSDNQVictor的回复:]输入一个字符串和一个给定的子字符串，计算字符串中包含的连续给定的子字符串的个数。 求指教。 用栈解决，子字符串先入栈，再出栈与字符串匹配，若字符全部出栈则匹配成功，个数＋1，依次往复[/quote] 我是超级小白，不懂数据结构[/quote] 那就用数组也可以解决的

引用 1 楼 _NoBug_的回复:[quote=引用 楼主 CSDNQVictor的回复:]输入一个字符串和一个给定的子字符串，计算字符串中包含的连续给定的子字符串的个数。 求指教。 用栈解决，子字符串先入栈，再出栈与字符串匹配，若字符全部出栈则匹配成功，个数＋1，依次往复[/quote] 我是超级小白，不懂数据结构

引用 楼主 CSDNQVictor的回复:输入一个字符串和一个给定的子字符串，计算字符串中包含的连续给定的子字符串的个数。 求指教。 用栈解决，子字符串先入栈，再出栈与字符串匹配，若字符全部出栈则匹配成功，个数＋1，依次往复


Question: 好玩的C语言小程序有哪些

easyx很好用

easyx做小游戏还可以，全靠绘制，做界面不方便。

这个论坛里面， 带原码提问的小程序都很好玩儿 你要是分分钟都能看懂，找出问题所在并能解决， 就是大神了

easyX搞个贪吃蛇玩玩么  确实比较好上手

easyx 官网 字数字数


Question: 求解

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

引用 4 楼 user-2的回复:[quote=引用 3 楼 weixin_45798902 的回复:] [quote=引用 1 楼 user-2的回复:]6?z=()<x?():x,如果（）<x就取（），否则取x。prt=a0的地址，加y分别是a0到a2的值，都比x小,所以取*（prt+y）的值，循环到最后应该是a2 主要是z那一部分看不懂[/quote] z就是一个简单的左值，去接收你后面运算的结果而以，?:这两个组合用叫三目运算符，用法是  z=判断的式子？成立则取这个值：不成立则取这个值 就是判断问号前面的比较的式子成立不成立，如果成立，则z等于问号后面冒号前面的值。如果不成立则取冒号后面的值，这里显然成立，取问号后冒号前的值，也就是*(prt+y)prt是a0的地址，加y相当于后移y位。*是取值符号，是取这个地址存储的内容，这里就是你数组的值[/quote] 哈哈，谢谢辣，那天你讲完以后我就懂了，所以就没看了，谢谢小哥哥认真回答，嘻嘻

引用 3 楼 weixin_45798902 的回复:[quote=引用 1 楼 user-2的回复:]6?z=()<x?():x,如果（）<x就取（），否则取x。prt=a0的地址，加y分别是a0到a2的值，都比x小,所以取*（prt+y）的值，循环到最后应该是a2 主要是z那一部分看不懂[/quote] z就是一个简单的左值，去接收你后面运算的结果而以，?:这两个组合用叫三目运算符，用法是  z=判断的式子？成立则取这个值：不成立则取这个值 就是判断问号前面的比较的式子成立不成立，如果成立，则z等于问号后面冒号前面的值。如果不成立则取冒号后面的值，这里显然成立，取问号后冒号前的值，也就是*(prt+y)prt是a0的地址，加y相当于后移y位。*是取值符号，是取这个地址存储的内容，这里就是你数组的值

引用 1 楼 user-2的回复:6?z=()<x?():x,如果（）<x就取（），否则取x。prt=a0的地址，加y分别是a0到a2的值，都比x小,所以取*（prt+y）的值，循环到最后应该是a2 主要是z那一部分看不懂

引用 1 楼 user-2的回复:6?z=()<x?():x,如果（）<x就取（），否则取x。prt=a0的地址，加y分别是a0到a2的值，都比x小,所以取*（prt+y）的值，循环到最后应该是a2 对，答案是6，


Question: 大学刚学C语言遇到小问题

建议直接贴代码～

艾玛，忽略了……晓得了。谢谢！

输入性别哪儿也要取变量的地址， sex应该是char类型，输入也需要地址的，你传递的参数是个数值，不是个地址


Question: 数据结构C语言求大佬解答

总长度就是每个字符的个数 * 每个字符编码的长度啊， 统计结果都出来，算一下就知道了

引用 楼主 weixin_45903622的回复:一组字符(a,b,c,d)在文中出现的次数分别为(7，6，3，5)，字符＇d＇的哈夫曼编码的长度 会算总长度的长度怎么算 规定左0右1，左小右大，d编码为01，d编码长度为2

构造哈夫曼树，写出哈夫曼编码，就可以求出来了


Question: 求教

请问程序结束后，小数点后为什么多了几位呢？怎么得的呀？

float类型，有效数字6～7位， 不是只能表述6～7位多了就没有了； 多了也有，只是不一定精确了 有效数字从哪儿算的，不是小数点后，而是第一个非零的数字开始的，包括小数点前面的


Question: 输出是f和lf区别?

输出只要使用 %f，虽然 %lf 的功能和 %f 完全一样，但部分实现可能仍不支持 %lf，所以不推荐输出用 %lf。

引用 楼主 ??13?的回复:float和double类型 输入时，float对应％f；double对应％lf 输出时，f和lf不论是(float和double)哪个类型都可以用啊？ 标题中的 是 应该是 时，打错字了


Question: 求教

更正：第一种情况下，也就是楼主的定义情况下。SQR(k+m)/SQR(k+m) 的运算结果就是7。 16/7 = 2  记住#define 只是替换， 原文不变的替换

#define SQR（X）X*X  不同于 #define SQR(X) (X)*(X) 按照前者的定义，你的表达式被替换成 a/=k+m*k+m/k+m*k+m;  // 2+2+0+2+1=7.      a = 16/6 =2 b=k+m*k+m/k+m*k+m;  //   b =7 按照后者的定义的话 a/=(k+m)*(k+m)/(k+m)*(k+m);  // 3*3/3*3 = 9.   a/=9 b=(k+m)*(k+m)/(k+m)*(k+m);   // b=9  #define SQR(X) ((X)*(X)  结果就会又不同 a /= ((k+m)*(k+m))/((k+m)*(k+m)) ;  //. a/=1.


Question: 请帮忙编写出详细程序

int monkey_beach(void) { 	int total_beach; 	for (size_t j = 0; j < 1500; j++) 	{ 		total_beach = j; 		for (size_t i = 1; i < 10; i++) 		{ 			total_beach = total_beach - (total_beach / 2 + 1); 		} 		if (total_beach == 1) 		{ 			printf("%d\n", j); 			break; 		} 	} 	return 0; }

用递归理解 f(n+1) = f(n)/2 - 1; 所以 f(n) = (f(n+1) + 1)*2  int monkey(int n) {     if(n == 10)         return 1;          return 2*(monkey (n+1)+ 1); }  用循环就是 int main() {     int i;     int j;     int sum = 1;     for(i = 0; i < 10; i++)     {         sum = (sum+1)*2;     }     printf("%d",sum); }

#include <stdio.h> int main() { 	int day=9,peach=1,i;  	for(i=0;i<day;i++) 	{ 		peach=(peach+1)*2; 	} 	printf("猴子第一天摘的桃子个数为：%d\n",peach);  	return 0; }

应当是2的10次方-1吧，这猴子肚子真大

不知道对不对 int last = 1; 	int days = 9; 	int sum = 1; 	for (int i = days - 1; i >= 1; i--)  	{ 		sum = (last+1) * 2; 		last = sum; 	} printf("%d\n", sum);


Question: 新手入门：为啥输入90，结果是2*3*3*5而不是2*3*5*3？

i是递增的，怎么会是2*3*5*3呢  while循环内，第一次满足n%i==0之后n改变，i并没有改变，第二次n%i依旧成立则继续循环，否则退出while循环，for循环中i++才改变i

因为这段语句， 在n=45， i为3的时候进来，while循环体执行了两次，第一次是45， 第二次是15，在第三次n为5的时候while条件不满足才继续循环上层的for循环。  while(n!=i) {   if(n%i==0)  //  {   printf("%d*",i);      	n=n/i; }   else   break; } 最后一个5是倒数第二行的那个printf函数输出的


Question: 复习中遇到的问题

显然 (a>b)==c 是对的。

vs通过

没有错啊。 系统算出来的真通常是取1

引用 2 楼 柒贰伍玖的回复:布尔值 和 其他类型值得原因 真值不一定是 1， 非零值都可以是真值 哦，好像是这样子的

布尔值 和 其他类型值得原因 真值不一定是 1， 非零值都可以是真值

值是不是应该是“1”呀？


Question: 关于puts函数和fputs函数的问题

你把数组初始化成这样 char word[] = "123\n"; 然后puts(word); 两次。 就能知道字符串本身带了一个回车，puts又生成了一个回车 fgets（word， stdin）回来的字符串就有会车在里面的  再去看fpus（word），连续调用两次。它也生成了回车，但是它只输出了一个回车； 这个回车是字符串里面的，还是fputs生成的呢？ 你可以改造word为 char word[]="123\n\n";  再来测试fputs，发现这个时候多了空行。这说明回车是字符串里面带的。  对比可以看到puts和fputs对于回车处理是一样的，不同的是，在用stdout作为输出的时候， 转化不同 类似的gets和fgets也有一定差异，  gets获取回来的字符串尾巴没有回车， 而fgets是把回车带到数组尾巴上了。  遇到这样的问题， 多做几个测试就发现问题了。 而且，有些结论是和编译器/操作系统相关的， 不是c/c++标准所定义的， 实践的时候做好实验测试吧。


Question: c语言简单题

首先正常写代码，不会写这种阅读性这么差的代码，练练逻辑就行了，不要模仿这种代码风格 一个个字符来： 第一个字符 ‘0’ 这时 r = 0   进的 case 0， 执行完case  r = 0 第二个字符 ‘1’ 这时 r = 0   进的 case 0， c == ‘1’满足条件 r = 1 第三个字符 ‘0’ 这时 r = 1   进的 case 1， c == ‘0’满足条件三目运算符 返回2， r = 2 第四个字符 ‘1’ 这时 r = 2   进的 case 2， c == ‘1’if不满足条件 r还是2 字符串结束，退出循环 最终结果 r = 2

瞅准谁是关键，这里的r，是你要模拟运行跟紧的。


Question: 能不能帮我把这个详细运行过程写下。

在printf()函数调用fun()时，fun()的实参值分别是 c的值[0xcc, 0x43, 0x44, 0x45, 0x46,  0x47] a的值 'E' n的值是5 在fun()函数中，执行了 *s = a; 之后，c的值变为[0x45, 0x43, 0x44, 0x45, 0x46,  0x47] 执行while循环，第一次循环时*s的值是0x45，而s[j]即s[5]的值是0x47，条件成立，j自减后变为4； 第二次循环时*s的值是0x45，而s[j]即s[4]的值是0x46，条件成立，j自减后变为3； 时*s的值是0x45，而s[j]即s[3]的值是0x45，条件不成立成立，while循环退出； 此时j的值是3.

c[6] = {E, C, D, E, F, G},  所以 fun返回3


Question: C++ VS2019上的一些问题，请大神帮帮忙！！

if((fp=fopen(file,"rb"))==NULL) 打开模式改成“rt”  fread(&stu[i],sizeof(struct student),1,fp); 改成 fscanf(fp, "%d%s%d", &stu[i].nub, stu[i].name, &stu[i].math);


Question: c语言小白请教大佬，这个排序怎么运转的，我已绕晕，最好详细一点，谢谢

直接百度搜 插入排序 就有了。这个就是 直接插入排序


Question: 复习时，有点搞不懂，请教

引用 6 楼 鲁宇科 的回复:[quote=引用 3 楼 寻开心的回复:]int a[k];  k是变量的模式在dev，Xcode里面可以。 vs里面不行。和编译器相关的 谢谢，，，，，，，，，，  [/quote] 准确地说是C的新标准才可以

引用 3 楼 寻开心的回复:int a[k];  k是变量的模式在dev，Xcode里面可以。 vs里面不行。和编译器相关的 谢谢，，，，，，，，，，

引用 2 楼 柒贰伍玖的回复:C不支持这样定义 你可以用宏来实现你的目的 #define ARR_LEN 5  int k = ARR_LEN ; int a[ARR_LEN ]; 谢谢，，，，，，，，，，，

引用 1 楼 liups的回复:只有新版本的C才能这样定义！ 谢谢，，，，，，，，，，

只有新版本的C才能这样定义！


Question: 如何判断“x--”是否已减一呢（请大家赐教）

引用 7 楼 柒贰伍玖的回复:[quote=引用 5 楼 ziziwye 的回复:] 谢谢，那请问后面就算没有if，直接输出x，值是4吗  没有if 直接输出x 也是4，因为在执行完 x-- 这行x就已经变成 4 了[/quote] 好的，知道了，谢谢你

引用 8 楼 apkipa1 的回复:[quote=引用 4 楼 柒贰伍玖 的回复:] i--这个跟编译器有关，在C语言中属于未定义行为，有的编译器先依次执行，有的是在表达式是最后执行，没必要纠结这个 你对于 i-- 与未定义行为的理解有误，我这里引用 C 语言标准的一段对 UB 的规定: A side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object (6.5). 也就是说，只有 i * i++ 或者 i = i++ 这类表达式才会导致未定义行为。[/quote] 谢谢

引用 4 楼 柒贰伍玖 的回复:i--这个跟编译器有关，在C语言中属于未定义行为，有的编译器先依次执行，有的是在表达式是最后执行，没必要纠结这个 你对于 i-- 与未定义行为的理解有误，我这里引用 C 语言标准的一段对 UB 的规定: A side effect on a scalar object is unsequenced relative to either a different side effect on the same scalar object or a value computation using the value of the same scalar object (6.5). 也就是说，只有 i * i++ 或者 i = i++ 这类表达式才会导致未定义行为。

引用 5 楼 ziziwye 的回复:谢谢，那请问后面就算没有if，直接输出x，值是4吗  没有if 直接输出x 也是4，因为在执行完 x-- 这行x就已经变成 4 了

我会好好理解的，谢谢你哦

谢谢，那请问后面就算没有if，直接输出x，值是4吗

int i = 5; 	int s = 0; 	s += i--; 此时，i的值是4，s的值是5. 	int i = 5; 	int s = 0; 	i--; 	s += i; 此时，i和s的值都是4.

x--;是一个表达式，只不过计算这个表达式的时候，x--的值为x变化前的值，所以后面的s+=x肯定x是4啊 如果表达式是s+=(x--)，这样的话就是一个表达式，这其中（x--）的值为5，因此输出为5，这个是按表达式来计算的

结果是：4 定义的时候初始化：x = 5，s = 0； 第二行 x--，执行完这句 x = 4； 第三局判断 x 是大于0的，进入条件语句 s = s+x 即 s = 0 +4，s = 4； 最后打印s  结果为：4


Question: 运行程序时地址写入发生冲突，为什么

引用 4 楼 dajkhsdawe 的回复:[quote=引用 2 楼 自信男孩 的回复:] #include<stdio.h> //#include<stdlib.h> #include<conio.h> //#include<windows.h> #include<math.h> void geng(int a, int b, int c,int *p,int *q) { double m; m = sqrt(double(b*b-4*a*c)); if (m>=0) { *p = (-b + m) / 2 * a; *q = (-b - m) / 2 * a; } } int main(void) { int x1; int x2; int  a, b, c; printf("请输入一个值到a中："); scanf_s("%d", &a); printf("请输入一个值到b中："); scanf_s("%d", &b); printf("请输入一个值到c中："); scanf_s("%d", &c); geng(a, b, c, &x1, &x2); printf("方程的根为：%d,%d", x1, x2); _getch(); }  供参考～  建议把x1, x2定义为double类型  嗯嗯  这个我知道该  就是不知道变量改成指针变量为什么会错[/quote] 你定义的指针x1, x2指向NULL，这个地址是不能读写的，所以会出现段错误，用malloc申请的空间是在堆上，堆上的空间是可以读写的～

引用 8 楼 真相重于对错 的回复:[quote=引用 7 楼 dajkhsdawe 的回复:] [quote=引用 6 楼 真相重于对错 的回复:] int *x1=（int*）malloc(sizeof(int)); 一定要用malloc分配空间吗    不太理解这之间的区别  [/quote] 两种方式，一种是malloc 一种是把这个指针指向一个现有的变量的地址，就好比上边说的参数用&取址，否则这个指针指向的是空。对他进行访问，必然出错。[/quote] 原来如此  感谢感谢

引用 7 楼 dajkhsdawe 的回复:[quote=引用 6 楼 真相重于对错 的回复:] int *x1=（int*）malloc(sizeof(int)); 一定要用malloc分配空间吗    不太理解这之间的区别  [/quote] 两种方式，一种是malloc 一种是把这个指针指向一个现有的变量的地址，就好比上边说的参数用&取址，否则这个指针指向的是空。对他进行访问，必然出错。

引用 6 楼 真相重于对错 的回复:int *x1=（int*）malloc(sizeof(int)); 一定要用malloc分配空间吗    不太理解这之间的区别

int *x1=（int*）malloc(sizeof(int));

int main(void) { int *x1=（int*）malloc(szieof(int)); int *x2=(int*)malloc(sizeof(int)); int  a, b, c; printf("请输入一个值到a中："); scanf_s("%d", &a); printf("请输入一个值到b中："); scanf_s("%d", &b); printf("请输入一个值到c中："); scanf_s("%d", &c); geng(a, b, c, x1, x2); printf("方程的根为：%d,%d", *x1, *x2); _getch(); free(x1); free(x2); } 非要用指针的话

引用 2 楼 自信男孩 的回复:#include<stdio.h> //#include<stdlib.h> #include<conio.h> //#include<windows.h> #include<math.h> void geng(int a, int b, int c,int *p,int *q) { double m; m = sqrt(double(b*b-4*a*c)); if (m>=0) { *p = (-b + m) / 2 * a; *q = (-b - m) / 2 * a; } } int main(void) { int x1; int x2; int  a, b, c; printf("请输入一个值到a中："); scanf_s("%d", &a); printf("请输入一个值到b中："); scanf_s("%d", &b); printf("请输入一个值到c中："); scanf_s("%d", &c); geng(a, b, c, &x1, &x2); printf("方程的根为：%d,%d", x1, x2); _getch(); }  供参考～  建议把x1, x2定义为double类型  嗯嗯  这个我知道该  就是不知道变量改成指针变量为什么会错

引用 1 楼 真相重于对错 的回复:指针没有初始化  x1，x2没初始化吗  不太懂  能说详细一点吗

指针没有初始化


Question: 头文件重复包含

引用 1 楼 gouyanfen 的回复:#pragma once[/quote]  没有用啊

#pragma once  引用 楼主 wow334 的回复:b.h中需要用到a.h中的结构体，于是#include "a.h"   现在d.c中 就不能同时  #include "a.h"  #include "b.h"  这样就重复包含了a.h，这种重复包含要怎么解决？我只用#include "b.h"来解决了，  有没有别的办法可以同时包含上面两个头文件，让系统自动排除重复部分而正常通过编译？

a.h 头文件里面， 作如下的定义  #ifndef __A_H__ #define __A_H__ 你的函数，结构什么的定义在这里 #endif  b.h里面 #ifdef __B_H__ #define __A_H__ 你的函数定义等 #endif  这样就可以了， 相互#inlcude就不会影响了  按照道理#pragma once  是等效的，都是表示只能被包含一次

在 .h 文件中增加宏  #ifndefine   xxxxxxxxx #define xxxxxxxxx …… 你的头文件代码 …… #endif

难道你的C++编译器不支持这个语法？ 你可以用VC集成环境，新建两个类，会自动生成防止重复包含的代码。  引用 2 楼 wow334 的回复:引用 1 楼 gouyanfen 的回复:#pragma once  没有用啊[/quote]


Question: C语言中%s为什么可以把指针内的地址转化为字符串？

因为字符串都以'/0'结束，显示的时候从第一个开始显示遇到'/0'停止


Question: 跪求大佬，字符串中删除一个特定字符

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

复杂化了 定义SRC[]记录处理前的字符串 定义DST[]记录处理后的字符串 然后将不等于要删除的字符，依次copy到dst字符数组里就可以了

引用 9 楼 寻开心的回复: 好好看看代码好不。  看了半天理解你的代码，理解你的思路，沿着你的思路把解决问题了， 然后你还要把自己带沟里去  注释掉k=k+1， 是因为按照你的思路这样计数是无效的，理由前面已经给你解释了  补充上去的那三行代码， 解决了一个问题，就是当你已经把字符串互换到最后的若干个都是要删除的数据的时候，可互换的非要删除字符是字符串的结尾， 而p就是字符串结尾的序号， 所以p-b就是一共有一个要删除的字符串  直接计算得到了结果， 还循环计数个鬼啊   此外，倒数第二行的那个 c[v-k] = '\0' 那一行在这个修正的代码下也是多余的 因为字符串结尾已经被互换过去了。 大佬，彻底明白了，万分感谢，麻烦您了

引用 7 楼 寻开心的回复:  注释掉一行语句 /*   */  是注释掉一大段语句 // 注释掉一行语句 就是把计数器取消，然后可以交换完之后，在循环计数？这样理解？   不好意思，我以为双斜杠有什么新的用法

注释掉一行语句 /*   */  是注释掉一大段语句 // 注释掉一行语句

引用 4 楼 寻开心的回复:你这个算法的想法是把要删除的字符和后面第一个非删除字符交换  但是有两个问题 第一个， 你没有判断后面一串都是要删除的情况， 这个时候第一个非删除字符是字符串结尾'\0'                你会把当前的要删除字符和字符串结尾交换了， 然后去判断下一个字符了， 这就导致循环无限向后推移，最后内存越界错误  第二个， 举例说明  mya 三个字符的字符串，假如要删除m                第一次进来 发现m了k=1， 交换后，字符串是yma               再次进入循环，有一次发现m， k=2，....               再进来 k=3， .....    所以你的k计数器是无效的  修改办法，  for(b=0; c[b]!='\0'; b++)     {         if(c[b]==s)         {             // k = k + 1;             for(p=b;c[p]==s;p++)             {             }             f=c[b];             c[b]=c[p];             c[p]=f;        if ( c[b] == '\0') {                 k = p - b;                 break;             }         }     } 对了请问大佬，那两个//是什么用的？

引用 4 楼 寻开心的回复:你这个算法的想法是把要删除的字符和后面第一个非删除字符交换  但是有两个问题 第一个， 你没有判断后面一串都是要删除的情况， 这个时候第一个非删除字符是字符串结尾'\0'                你会把当前的要删除字符和字符串结尾交换了， 然后去判断下一个字符了， 这就导致循环无限向后推移，最后内存越界错误  第二个， 举例说明  mya 三个字符的字符串，假如要删除m                第一次进来 发现m了k=1， 交换后，字符串是yma               再次进入循环，有一次发现m， k=2，....               再进来 k=3， .....    所以你的k计数器是无效的  修改办法，  for(b=0; c[b]!='\0'; b++)     {         if(c[b]==s)         {             // k = k + 1;             for(p=b;c[p]==s;p++)             {             }             f=c[b];             c[b]=c[p];             c[p]=f;        if ( c[b] == '\0') {                 k = p - b;                 break;             }         }     } 感谢大佬，万分感谢，明白了

引用 2 楼 weixin_46140402的回复:[quote=引用 1 楼 weixin_46138835的回复:]删除字符的话只需要找到字符后从后往前覆盖就可以了，你中间把字符交换，其实没有必要 如果是几个相同的字符在一起的话，后边的往前覆盖会不会不行？[/quote] 可以啊，如果这个字符不是被删除字符的话，他们就都往前移动一格，如果是的话，会被for语句执行多次，每次删掉一个字符。

引用 1 楼 weixin_46138835的回复:删除字符的话只需要找到字符后从后往前覆盖就可以了，你中间把字符交换，其实没有必要 如果是几个相同的字符在一起的话，后边的往前覆盖会不会不行？


Question: 能帮我解决一下吗？怎么做啊

。。。这个不就是赋值输出么。。。

K那里要加个赋值符号=

就直接赋值输出就好了啊，这个好像没有隐含的点，只是让你看一下现象


Question: 帮忙看下

写一个素数判断函数就基本上解决问题了，网上也有很多代码，自己动动手查一下～


Question: c语言

baidu一下，什么都有


Question: c语言考试

#include<stdio.h> int main(void) { 	char a; 	scanf("%c",&a); 	if((a >= 'a'&&a <= 'z')||(a >= 'A'&&a <= 'Z')) 	{ 		printf("是字母"); 	} 	else 	{ 		printf("不是字母"); 	} 	return 0; }

自己写，  出错了贴代码上来提问


Question: 大佬们帮忙解答个小问题吧

这个是选择题  不能真的去一步一步的算x和y的值  二楼的排除法才是正解

y = ((...) , x++) 即 y 伪= (x++) , 即此时 y=x后，x=x+1; for(; y++ <8;) 即 先比后加，即break后，y = y+1; 所以 x ==y; 所以选B

选b， #include<stdio.h> int main(void) { 	int x = 1,y = 1; 	for(;y++<8;) 	y = ((x+=y,x++),x++); 	printf("x = %d,y = %d",x,y); 	return 0;  }


Question: 我的天哪，我的选择排序法哪里出现问题了啊。大佬求救

感谢昂，立马明白了，结帖了

不是内存溢出的问题 是你的有效数字范围的问题 你输入的n比如是10， 有效数字就是0到9，这样10个 可你的 j的范围，会让你访问 a【10】，这里不是有效数据了。 这就不是你前面的a【50】定义所能保护的了

引用 1 楼 寻开心的回复:你的j的范围怎么是到n呢， a【n】 溢出的   随便找 本书，看看 冒泡排序的两重循环各自的循环范围是怎么写的 我前面不是已经有一个限定要求输入的数有多少了个吗？并且将这个具体给到了n。所以不就可以这样了吗？我们老师给的版本是10个数，我是想弄多少个数都行的那种


Question: 这是为什么呀

可以兄弟

引用 3 楼 寻开心的回复:[quote=引用 2 楼 sdfszrsvs 的回复:] [quote=引用 1 楼 @矛盾综合体的回复:]变成double 谢谢你啊，改好了，谢谢哦，要十个字才能发[/quote] 你要谢，就给为你提供了帮助的人技术分儿 总是带着结帖率为0%的标记提问，会越来越少的人愿意帮助你[/quote] 不好意思啊我才看到，我刚用这个软件的我这就看看

我就没毛病。

引用 2 楼 sdfszrsvs 的回复:[quote=引用 1 楼 @矛盾综合体的回复:]变成double 谢谢你啊，改好了，谢谢哦，要十个字才能发[/quote] 你要谢，就给为你提供了帮助的人技术分儿 总是带着结帖率为0%的标记提问，会越来越少的人愿意帮助你

引用 1 楼 @矛盾综合体的回复:变成double 谢谢你啊，改好了，谢谢哦，要十个字才能发

变成double


Question: C/C++图形库实现鼠标悬浮到按钮上面播放一次声音

你用个变量 记录上一次鼠标的位置，然后和这次对比；如果上次在按钮外，这次在按钮里面，就播放，其他情况不播放

感谢提供了思路，用了你们的方法这个问题我也解决了，非常感谢！

引用 3 楼 gz_qmc 的回复:针对该按钮设一个全局变量BOOL  in_box=FALSE;  if(鼠标在框内) {       if( ! in_box)       {              in_box=TRUE;              StartShow();  //显示边框              PlanSond();   //播放声音       } } else {     in_box=FALSE; } 因为我的这个程序是在while(1)里面的，我想的是不断地接收鼠标消息，所以这个判断功能放在里面还是存在原来的问题  你看，我写的是像这样的，我太难了

给你出个馊主意： 做一个static 时间变量放这里， 进来这个函数后，获取一下时间，然后比较一下超时没有，没超过（比如1s），就直接返回，超过了就再响一次。 效果就是，鼠标放到这个区域，来回移动的时候，可以一秒钟一次的响个没完，

因为你这样写的话，只要在这个按钮区域移动就会触发这个事件，你可以借助一个bool标记，初始化为false，当进入这个区域移动时，如果标记为false，则播放声音且置为true，当离开这个区域时，再将标记置为false


Question: 三个整数排序

#include<stdio.h> int main() { 	int a,b,c; 	printf("\n enter 3 number. \n"); 	scanf("%d%d%d",&a,&b,&c); 	if(a<b) 	{ 		a^=b; 		b^=a; 		a^=b; 	} 	if(a<c) 	{ 		a^=c; 		c^=a; 		a^=c; 	} 	if(b<c) 	{ 		b^=c; 		c^=b; 		b^=c; 	} 	printf("%d %d %d\n",a,b,c); 	return 0; }

#include<stdio.h> int main() { 	int a,b,c; 	int temp; 	scanf("%d %d %d",&a,&b,&c); 	if(a>b){  		temp=a; 		a=b; 		b=temp; 	} 	temp=0; 	if(b>c){ 		temp=b; 		b=c; 		c=temp; 	} 	temp=0; 	if(a>c){ 		temp=a; 		a=c; 		c=temp; 	} 	printf("%d %d %d\n",a,b,c); 	return 0;  }

来个通俗易懂的 #include<stdio.h> #include<math.h> int main(void) { 	int a,b,c; 	scanf("%d%d%d",&a,&b,&c); 	if(a < b) 	{ 		a = b; 	} 	if(a < c) 	{ 		a = c; 	} 	printf("%d",a); 	return 0; }

你的第三个if内语句加“”号，会导致if判断时将其看成一个字符串，如果前面都没有执行，那么就肯定会执行第三个if

int a, b, c; 	int max, min; 	scanf("%d %d %d", &a, &b, &c); 	max = a > b ? a : b; 	min = a + b - max; 	max = max > c ? max : c; 	min = min < c ? min : c; 	printf("%d,%d,%d", min, a + b + c - min - max, max); 	return 0;


Question: 请问C语言循环语句

打错字，刚试验了下

引用 2 楼 weixin_46138835 的回复:[quote=引用 1 楼 datoulaile123的回复:]k的值如果大于1000了，那就是死循环了，可如果一开始没大于1000，那循环一次就跳出了 啊我忘记写了 k的初值是1000[/quote] 刚实现了确实不是死循环，int是有符号的整形，有取值范围-2^32～2^32-1，大于了2^32-1就会变成负数了，然后跳出了这个循环

k无符号类型 到最大值再加1 会变成0  结束循环

引用 1 楼 datoulaile123的回复:k的值如果大于1000了，那就是死循环了，可如果一开始没大于1000，那循环一次就跳出了 啊我忘记写了 k的初值是1000


Question: c语言 初学者请教，代码如图

一楼那位朋友，我不会看汇编。三楼讲的挺好的，，我已经找到问题所在了，谢谢大家，因为printf会做缓存，才出现那个结果，将第一行换到最后一行，就会输出预期中的结果，

对于变参函数，例如 printf，函数读取的数据类型与传入的数据类型不一致就是未定义行为。这里盲猜你编译的是 64 位程序，于是浮点数运算结果被存到寄存器里了，并且后面没有修改寄存器，所以 printf 每次输出寄存器的值都是 1.000000。

“/”运算符， 在运算之前会将表达式的数据类型向上统一，然后再做运算，char-int会全转int再运算，float-int会全部转换成float再运算，运算结果的类型跟大类型相同 所以 3/2会是整数运算，结果为1，在printf的时候格式是“%f”， printf将1 转换成浮点输出 其他情况同理  第一个输出应该是 1.000 0.000  第二个输出应该是 0.11111 1.00000 0.00000  你贴的这个结果又点诡异

就我看来，这玩意儿准是bug。 codeblocks能看汇编吗，看看，有啥区别不？


Question: 求大佬解答

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

i+2 进行了一个 加 运算，最后没有赋给任何变量， i 还是原来的i 如果想让i 加 2的话 可以写成 i += 2，相当于 i = i + 2

这里应该给正确的式子，你i+2没有左值成立不了，i++当中也是有左值的

常规用法这里会是i++，相当于 i = i+1,是一个表达式


Question: 数据结构广义表救救孩子，讲讲这个题吧

引用 1 楼 不闻窗外事的回复:因为c的话 好像tail(A) =(())   不是();tail后面必须加一个()； a的话同理 b是对的，因为head(A)=tail(A)=() 那么a呢那摸a选项呢，为什么不对


Question: C语言关于指针传输地址问题

div = &L[0]; 返回局部变量的地址是未定义的，建议L前加一个static就可以了。

2楼 3楼正解，变量有作用域，函数的局部变量在函数结束时就释放了，你再用指针去访问，访问的是无效的 你可以把它改成静态变量，或者像3楼那样用指针申请内存

二楼正解  局部变量是实现在函数栈里面的， 函数返回后，这些变量自动销毁了 虽然你返回了这个变量的地址，但是这个变量对应的内存已经被系统挪作他用了， 里面的数值自然也不可能继续有效了  你要想返回地址，只有一个办法， malloc一个动态地址返回  L = （int*) malloc( 100*sizeof(int)); 然后函数内容继续保持 返回L就好了。  &L【0】 和 L没有一样的，没有什么区别

局部变量使用后会消亡，你传指针应该改变指针地址的值，而不是去改变他的地址，你把地址改为局部变量以后，函数调用结束，变量消亡，里面的值自然就没了

传给函数一个指针，你只能修改这个指针指向的内容，但不能修改这个指针的地址。


Question: 哪位高手能帮我解释一下c语言素数题啊。

if(t) t = 1.表示为真， t = 0，表示假。 if（真）运行if包含的代码，if（假）不运行

if（t）里面的t呢？

t=1 表示还没有发现哪个数能整除i、  所以在对j循环结束后还没有发现能整除i的数的话，i就是素数 t=0 表示发现了某个数能整除i，

第一个t=1和第二个t=0，这里有点不明白？

#include<stdio.h> int main() { int i,j,t; for(i=2;i<=100;i++) {      t=1;     for(j=2;j<i;j++)          if(i%j==0)              t=0;   // 如果i能被比它小的某个数整除， i就不是素数  比如i是4，那么j=2的时候，就会到这里  if(t)  printf("%d\t",i);} return 0;  }


Question: C语言

unsigned a = 0356;   所以a的八进制是356,转为16进制就是EE， ~a|a<<2+1       ~a的16进制是FFFFFF11              a<<2+1加法优先级高，所以等于a<<3，EE<<3 = 0x770  FFFFFF11 | 770 = FFFFFF71


Question: C语言

g，strcpy把前四个字符改为ABCD，第五个位置为'\0'后面不变是fg，所以m【6】也就是第七个，是g


Question: 不知道为什么它老是把最后一个元素输出，没有完成交换

引用 3 楼 weixin_45949073的回复:不用指针就想交换？？ 痴心妄想 #include<stdio.h> int swap(int *x,int *y); int main(void) { 	int a,b; 	scanf("%d%d",&a,&b); 	swap(&a,&b); 	return 0; } int swap(int *x,int *y) { 	int s; 	s = *y; 	*y = *x; 	*x = s; 	printf("%d %d",*x,*y); }  我初学的。。看来还是要多看看书

int swap(int *x,int *y) {     int temp;     temp = *x;     *x = *y;     *y = temp; } 供参考～

int swap(int x,int y)这个子函数的问题，需要传递一个指针或者地址，这里传递一个实参是不会改变原有内容的。 过程分析：在你调用这个swap函数的时候，只是把a,b的值赋值给x和y，所以交换的时候是交换x，y的值，而不是a，b的值 应该是int swap(int *x,int *y)，调用时，传递a，b的地址，在函数中通过x,y（即a,b的地址找到a,b）从而改变其值


Question: Vc6.0:最后的零怎么处理

引用 2 楼 寻开心的回复:问题出在：     r = s =  i*i  这个操作上     i*i 是int * int 的运算，结果还是int， 当i>65535的时候i*i都是溢出的， i=65536的时候i*i就是0了  解决办法两种： 1    把i定义成 64位的 long longleixing 2    i*i 变成   double类型运算 i * 1.0* i; 也就是：   r=s=i*1.0*i; 我按照第二种方法改了，感谢

验证办法： for(j=0;j<=9;j++)             if(r==a[j]) printf("%d  %6.0f\n",i, s);  你就能看到 s输出是0的时候， i的值是65536  这也是找到输出0的原因的调试办法， 把输出0的时候的环境变量输出出来，然后分析就容易找到问题所在了

给出完整代码吧


Question: 链表无法输入问题

引用 4 楼 寻开心 的回复:闲得无聊，给你写了下， 剩下的自己玩儿吧好的，谢谢

请问为啥只能输出一组就停止运行了。  引用 1 楼 寻开心 的回复:srcj(） 这个函数是向文件里面写啊， 能输入个鬼   prin是从文件读取数据，问题还没有写全 #include<stdio.h> #include<stdlib.h> #include<string.h> struct cj{     char xh[10];     char name[10];     int gs;     int cx;     struct cj *next; }; typedef struct cj jj,*listlink; void srcj(listlink head); void prin(listlink head); int main(void) {     int n;     listlink head;     head = (listlink)malloc(sizeof(jj));     head->next = NULL;     while(scanf("%d",&n) != EOF)      {     	switch (n)     	{     		case 1:             srcj(head);             break;             case 2:             prin(head);             break; 		} 	}     return 0; } void srcj(listlink head) {     listlink p;     p = head->next;     FILE *fp = fopen("fl.txt","w");     if(fopen("fl.txt","w") == NULL)     {         printf("打开文件失败\n");         exit(1);     }     else     printf("文件已经打开,请输入数据\n");      int b = 3;     printf("请输入 学号 姓名 高数成绩 编程成绩\n要求输入3组\n");     while(b--)     {         p = (listlink)malloc(sizeof(jj));         scanf("%s%s%d%d",&p->xh,&p->name,&p->gs,&p->cx);         fprintf(fp,"%s%s%d%d",p->xh,p->name,p->gs,p->cx);         p->next=head->next;         head->next = p;     }     p->next = NULL;     fclose(fp);     printf("文件已关闭\n"); } void prin(listlink head) {     FILE *fp;     listlink o;     o = head->next;     if(fopen("fl.txt","r") == NULL)     {         printf("打开文件失败\n");         exit(1);     }     else     printf("文件已打开\n");     while(o != NULL)     {     	printf("正在输出\n");     	fscanf(fp,"%s%s%d%d",&o->xh,&o->name,&o->gs,&o->cx);         printf("%s %s %d %d\n",o->xh,o->name,o->gs,o->cx);         o = o->next;     }     fclose(fp);     printf("文件已关闭\n"); }

闲得无聊，给你写了下， 剩下的自己玩儿吧

#include<stdio.h> #include<stdlib.h> #include<string.h>  struct cj{     char xh[10];     char name[10];     int gs;     int cx;     struct cj *next; }; typedef struct cj jj,*listlink;; void srcj(listlink head); void prin(listlink head); void append(listlink head); void display(listlink head); int main(void) {     int n;     listlink head;     head = (listlink)malloc(sizeof(jj));     head->next = NULL;     while(1) {     	printf("0:Quit 1: 从文件读 2：写入文件  3：添加：");     	scanf("%d",&n);     	switch (n)     	{         	case 2:             	printf("把数据写入到fl.txt文件昂中\n");             	srcj(head);             	break;         	case 1:             	printf("从fl.txt文件当中读取数据\n");             	prin(head);             	break;         	case 3:             	append(head); 				break;	 			case 0: 				return 0;	 				break; 			case 4: 				display(head); 				break;      	} 	};     return 0; }  /* 把链表写入文件 */  void srcj(listlink head) { 	if ( head == NULL ) return;      listlink p = head->next;     FILE *fp;     if( (fp=fopen("fl.txt","wt") )== NULL)     {         printf("打开写入文件fl.txt失败\n");         return;     }     while(p)     {     	 printf(   "%s %s %d %d\n",p->xh, p->name, p->gs, p->cx);         fprintf(fp,"%s %s %d %d\n",p->xh, p->name, p->gs, p->cx);         p = p->next;     }     fclose(fp); }  /* 从文件读取内容 */  void prin(listlink head) { 	if ( NULL == head) return;     FILE *fp;     listlink p = head;     if((fp=fopen("fl.txt","r")) == NULL)     {         printf("打开fl.txt文件失败\n");         return ;     }     while(1)     {     	listlink q = (listlink)malloc(sizeof(jj));     	int nRead = fscanf(fp,"%s%s%d%d",q->xh,q->name, &q->gs,&q->cx);         if ( 4 == nRead ) {         	printf("%s\t%s\t%d\t%d\n",q->xh,q->name,q->gs,q->cx);         	p->next = q;         	p = q; 		} else { 			free(q); 			break; 		}     }     p->next = NULL;     fclose(fp); }  void append(listlink  head) { 	if ( NULL == head) return; 	listlink q = head; 	while(q->next ) q=q->next;  	listlink p = (listlink) malloc(sizeof(jj)); 	printf("input data"); 	scanf("%s%s%d%d", p->xh, p->name, &p->gs, &p->cx); 	q->next = p; 	p->next = NULL; }  void display(listlink head) { 	if ( NULL == head ) return; 	listlink p = head->next; 	while (p) { 		printf("%s\t%s\t%d\t%d\n", p->xh, p->name, p->gs, p->cx); 		p=p->next; 	} }


Question: 复习时遇到的一个小问题，求解

引用 2 楼 寻开心的回复:二维数组a【】【m】 a[j] 就是a[j][0]的地址，他前面有的元素个数是j*m个啊  a【i】【j】 前面的元素个数才是i*m+j个 感谢――――――――

引用 1 楼 林多的回复:数组a，有五列  1 2 3 4 5 6 7 8 9 10   a[0][2]，表示第一行，第三个元素。该元素前面的元素个数 0 * 5 + 2 = 2  若二维数组 a 有m列，索引从0开始。。则a[i][j]，前面的元素个数为   首先，求第0到i-1行，一共i行，包含的元素个数： i*m  然后，求第i行，第j个元素。在第i行里，改元素前面的元素个数： j  因此，求得 a[i][j]，前面的元素个数为 i*m+j 感谢――――――――


Question: c语言用文件排序？

文件内容需要加载到内存里排序，因此先把文件信息加载到内存排序，排序之后重新写入文件

和这个和我的代码有啥关系啊   帮助写这个代码，也是因为有了你自己写的基础，才帮助改改  自己一行不写代码，就要结果的 ，  我就当作没看见 ， 除非那个题目确实有点儿意思的

寻开心   大哥写的 #include<stdio.h> #include<stdlib.h> #include<string.h>  struct cj { 	char xh[10]; 	char name[10]; 	int gs; 	int cx; 	struct cj *next; }; typedef struct cj jj,*listlink; void srcj(listlink head); void prin(listlink head); void append(listlink head); void display(listlink head); int main(void)  { 	int n; 	listlink head; 	head = (listlink)malloc(sizeof(jj)); 	head->next = NULL; 	while(1)  	{ 		printf("0:Quit 1: 从文件读 2：写入文件  3：添加："); 		scanf("%d",&n); 		switch (n)  		{ 			case 2: 				printf("把数据写入到fle.txt文件昂中\n"); 				srcj(head); 				break; 			case 1: 				printf("从fle.txt文件当中读取数据\n"); 				prin(head); 				break; 			case 3: 				append(head); 				break; 			case 0: 				return 0; 				break; 			case 4: 				display(head); 				break; 		} 	}; 	return 0; }  /* 把链表写入文件 */ void srcj(listlink head) { 	if ( head == NULL ) return; 	listlink p = head->next; 	FILE *fp; 	if( (fp=fopen("fle.txt","wt") )== NULL)  	{ 		printf("打开写入文件fle.txt失败\n"); 		return; 	} 	while(p)  	{ 		fprintf(fp,"%s %s %d %d\n",p->xh, p->name, p->gs, p->cx); 		p = p->next; 	} 	fclose(fp); }  /* 从文件读取内容 */ void prin(listlink head) { 	if ( NULL == head) return; 	FILE *fp; 	listlink p = head; 	if((fp=fopen("fle.txt","r")) == NULL) 	{ 		printf("打开fle.txt文件失败\n"); 		return ; 	} 	while(1) 	{ 		listlink q = (listlink)malloc(sizeof(jj)); 		int nRead = fscanf(fp,"%s%s%d%d",q->xh,q->name, &q->gs,&q->cx); 		if ( 4 == nRead )  		{ 			printf("%s\t%s\t%d\t%d\n",q->xh,q->name,q->gs,q->cx); 			p->next = q; 			p = q; 		} 		else  		{ 			free(q); 			break; 		} 	} 	p->next = NULL; 	fclose(fp); }  void append(listlink  head)  { 	if ( NULL == head) return; 	listlink q = head; 	while(q->next ) q=q->next;  	listlink p = (listlink) malloc(sizeof(jj)); 	printf("input data\n"); 	scanf("%s%s%d%d", p->xh, p->name, &p->gs, &p->cx); 	q->next = p; 	p->next = NULL; }  void display(listlink head) { 	if ( NULL == head ) return; 	listlink p = head->next; 	while (p)  	{ 		printf("%s\t%s\t%d\t%d\n", p->xh, p->name, p->gs, p->cx); 		p=p->next; 	} }


Question: 求大佬们帮帮新手，不知道咋做（纯C语言）

为啥还扯到堆栈了，无脑递归硬干似乎也不太会栈溢出吧，这图够小了，先试试吧 1600格的A*没溢出，不过不是硬刚

dfs和bfs都可以，dfs可以找到一条路，bfs可以用来找最短的路 如果数据量大的话，可以做一个预先处理，真正的建立无向图的数据结构 图的节点只有起点，终点和所有的岔路，  连接用他们之间的单行线（岔路口之间，以及起点、终点之间的通道都是单行线） 上面的两个图都可以简化很多，每个岔路口不过10来个而已。 有了图结构再套用标准的dfs、bfs算法就好了。   问题这些都不是初学者可以玩儿的东西  谁觉得可以在这个论坛里面讲明白dfs，以及用到的堆栈， 邻接矩阵?

感觉深度优先比较好写点  至于怎么判断没有路，最简单的就是判断从起点开始走的所有方向是否都已经尝试过，也就是最后一次回到起点，发现没路可走，就可以退出了

哦 纠正 遇到入口表示从这个方向出发不能走通 需要换方向

沿着墙壁走 遇到出口就是能走通 输出路径 遇到入口就是不能走通

无向图的连通关系判断，DFS或者BFS都可以实现。  但是都需要有一定的算法和数据结构的基础才能解决。  这里面最好借助一些stl模板提供的堆栈或者队列的工具 否则全部自己写有难度

看你的算法的实现方式 dfs用到堆栈，当然你写递归也一样，用的系统堆栈。  bfs是用到队列。  你要是把图变成文本了，可以分享一下，拿来练手还是个不错的题目


Question: 小白提问！如何交换链表中两个节点的位置？

给你两个宏定义参考吧 /* struct must has element value and next compare func return int   0   equal   > 0 first large than second   < 0 first small than second */ #define _ADD_DATA_TO_LIST_DESC(_list_type, _node, _head, _compare_func) \     if (_compare_func(_head, _node) < 0)  {                             \     _node->next = _head;                                                \     _head = _node;                                                      \     } else {                                                            \     _list_type * _cur = _head;                                          \     while (_cur) {                                                      \     if (_compare_func(_node, _cur->next) > 0) {                         \     _node->next = _cur->next;                                           \     _cur->next = _node;                                                 \     break;                                                              \     }                                                                   \     _cur = _cur->next;                                                  \     } }  /* struct must has element value and next compare func return int   0   equal   > 0 first large than second   < 0 first small than second */ #define _ADD_DATA_TO_LIST_ASC(_list_type, _node, _head, _compare_func)  \     _list_type * _cur = _head;                                          \     if (!_cur || _compare_func(_cur, _node) > 0)  {                     \     _node->next = _head;                                                \     _head = _node;                                                      \     } else {                                                            \     while (_cur->next) {                                                \     if (_compare_func(_node, _cur->next) < 0) {                         \     _node->next = _cur->next;                                           \     _cur->next = _node;                                                 \     break;                                                              \     }                                                                   \     _cur = _cur->next;                                                  \     }                                                                   \     if(!_cur->next){ _cur->next = _node;}} _compare_func 是一个比较函数，例如定义一个结构体，根据value排序 struct ST_EXP {     int nValue;     ST_EXP * next; }; //_compare_func 需要写成 int compare(ST_EXP * first,ST_EXP* second) {     if (first && second)     return first->nValue - second->nValue;    if (first && !second)     return 1;    if (!first && second)     return - 1;    return 0; } //相应的list定义 struct ST_EXP_LIST {   ST_EXP * value;   ST_EXP_LIST * next; }


Question: C语言，求e的近似值

int a = 10000; 	double sum = 2, pred = 1;; 	for (int n = 2; n <= a; n++) 	{ 		double cur = pred * 1.0 / n; 		sum += cur; 		pred =cur  ; 	} //2.7182818284590455 double精度有限

n！很快就越界了， 用整数甚至长整数都做不了1000！ 用整数就必须用高精度计算 改成double类型试试吧


Question: 有人可以帮我解决吗

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

引用 2 楼 柒贰伍玖 的回复:输出宽度控制规则是：在实际宽度和指定宽度中，取大值输出。

输出宽度控制规则是：在实际宽度和指定宽度中，取大值输出。

%3o表示输出宽度最小为3个字节的宽度，如果实际宽度超过3，则按实际输出


Question: stdin指向的内容是什么

stdin 是指 C 语言内置的输入流，注意这个流是抽象的，你不需要知道它代表了什么具体的输入(实现可以是控制台输入或者文件输入等)。此外，C 语言的流默认内置缓冲区(并且用户可以更改)，stdin 也不例外。以在 Windows 中双击打开的一个控制台程序为例，键盘输入先进入 conhost.exe 的缓冲区，然后控制台程序从 conhost 下载键盘输入并放入 stdin 的缓冲区，最后才通过 scanf 等手段到达用户代码。

标准输入stdin，一般指向键盘等输入设备

引用 1 楼 lin5161678 的回复：stdin是一个FILE* FILE里面有一个成员保存了指向缓冲区的指针所以stdin指向的是缓冲区？那么缓冲区本身的位置在哪里呢？

stdin是一个FILE* FILE里面有一个成员保存了指向缓冲区的指针

stdin确实是对应的系统的一段内存，记录你刚才所有的输入按键  在dos的年代，因为没有多线程的概念， 内存访问也没有什么限制， 这个键盘缓冲的地址是可以直接访问的，自己插入修改内容都可以 windows年代下， 系统依然有自己的缓冲区，但是已经不让用户直接去访问了，是键盘驱动程序来负责管理的，必须通过系统的函数来获得对他的访问授权 而且有不同的访问方式，一种是缓冲区这种读写已经有的按键，还有一种的查询当前键盘的状态， 比如，你是否一直按着shift键呢  回到c语言里面， stdin就是标准的输入，常规指的就是键盘输入， 不是键盘， 是通过键盘输入的那一串还没有处理的字符 因为这种数据存储方式也是一个数组，一个字符挨着一个字符， 和文件保存的内容一个字节一个字节一样，所以他们都是被统称为输入流


Question: #没有指针的格式错误#

引用 2 楼 weixin_45949073的回复:这样写函数的吗？？ //要么  include<stdio.h> //函数1 //函数2  int main(void) { 	 } //函数1 { 	 } //函数2 { 	 }   //要么 include<stdio.h> 函数1 { 	 } 函数2 { 	 }  int main(void) { 	  }  那请问我得如何才能调用paixu这个函数，得怎么修改

void paixu(int a[], int n); void bijiao(int x, int y);  int main() { }  void paixu(int a[], int n) { }  void bijiao(int x, int y) { }  你的种用法不推荐， 如果你们的教材就那样写， 建议你换一本教材，如果是你们的老师那样教建议多看网上的东西吧 另外，看了你的程序是要对原来的数组进行排序， bijiao 这个函数改只是把自己的参数x、y的值交换了，并没有修改到数组的值 如果要改数组的值 要改成 bijiao(int *x, int *y)，用指针；或者不用bijiao这个函数了，直接在paixu里面交换值


Question: 为什么64位PC机上 long的高位不为0？

问题关闭，谢谢大家的回复，内容概要已经转到我的博客：https://mp.csdn.net/console/editor/html/103819937，大家还有什么回复可以到博客留言

二.可能原因  编译器的数据模型  Datetype  LP64   ILP64   LLP64   ILP32    LP32  char           8          8         8            8          8  short          16       16       16           16        16  int               32       64       32           32        16  long            64       64       32           32         32   long long    64  pointer        64       64        64           32        32  一般情况下windows64位一般使用LLP64模型  64位Unix,Linux使用的是LP64模型 ———————————————— 版权声明：本文为CSDN博主「编程吴彦祖」的原创文章，遵循 CC 4.0 BY-SA 版权协议，转载请附上原文出处链接及本声明。 原文链接：https://blog.csdn.net/akyj1021/article/details/81432758

windows上的64位编译器普遍使用LLP64模型（包括GCC的windows移植MinGW64），只有long long和指针是64位的，其他和32位编译器一致，是为了最大化兼容性的缘故。unix、linux上的64位编译器则主要使用LP64模型，long、long long和指针都是64位的，int保持32位，少部分使用ILP64模型，甚至SILP64，连short都是64位的，典型如CRAY的UNICOS系统上带的编译器。

引用 6 楼 寻开心 的回复:引用 5 楼 真相重于对错 的回复:vs long long 才是64 正解

引用 5 楼 真相重于对错 的回复:vs long long 才是64   windows系统，msdn下有一个页面 该信息也可用于各种Windows头文件中WinDef.h。我在这里列出了一些相关的类型：  类型| S / U | x86 | 64位 ----------------------------+-----+--------+------- BYTE，BOOLEAN | U | 8位| 8位 ----------------------------+-----+--------+------- SHORT | S | 16位| 16位 USHORT，WORD | U | 16位| 16位 ----------------------------+-----+--------+------- INT，LONG | S | 32位| 32位 UINT，ULONG，DWORD | U | 32位| 32位 ----------------------------+-----+--------+------- INT_PTR，LONG_PTR，LPARAM | S | 32位| 64位 UINT_PTR，ULONG_PTR，WPARAM | U | 32位| 64位 ----------------------------+-----+--------+------- LONGLONG | S | 64位| 64位 ULONGLONG，QWORD | U | 64位| 64位   而Linux或者Unix下面 针对64位平台的整数和指针的大小有一些可能的安排。其中最常用的两个是ILP64（实际上，这只是其中的一小部分例子，Cray就是这样）和LP64（几乎所有其他的）。首字母来自'int，long，指针是64位'和'long，指针是64位'。  Type           ILP64   LP64   LLP64 char              8      8       8 short            16     16      16 int              64     32      32 long             64     64      32 long long        64     64      64 pointer          64     64      64  看来还是不能假定这玩意儿的大小，还是实测为准啊

vs long long 才是64

引用 2 楼 寻开心 的回复:你这个long int到底是几啊 从你代码上看不出来它的值 从你的输出结果上开，这个long的低四位是710000， 就是16进制的0x00 01 15 58 高位4个字节，看不出来你给设置上了什么东西， 从输出结果上看是0x00 01 3c 68 ， 十进制的810000  估计你是弄错了10进制和16进制的区别 0x710000， 0x810000，合并起来long的高位才会是1  找到原因了，应该和VS的问题，VS我已经配置 X64，为什么还是32位？  （ 	printf("size is %d\n", sizeof(long int)); 	printf("size is %d\n", sizeof(long));  这两个打印出来的都是 4）


Question: 为什么这个程序输不出结果

引用 2 楼 qq_45744378的回复:[quote=引用 1 楼 寻开心的回复:]   if(t!=1)     {         max=0;        for(i=0;i<k;i++)        {            if(d[p[k]]>max)            {                max=d[p[k]];                v=p[k];            }        }        printf("%s",s[v]);     }  这里是对i做循环， 可是循环体内用一直是k参数， 这能对吗？  后面的v没有初始化过， 前面的循环有可能让v不更改， 这也是个潜在的漏洞 那么s[v]这里怎么改[/quote] 知道了，非常谢谢谢你！！

给v赋予初值啊 max=0，其实是不合理的   应该是max=d[p[0]], v=0; 这样来初始化

引用 1 楼 寻开心的回复:if(t!=1)     {         max=0;        for(i=0;i<k;i++)        {            if(d[p[k]]>max)            {                max=d[p[k]];                v=p[k];            }        }        printf("%s",s[v]);     }  这里是对i做循环， 可是循环体内用一直是k参数， 这能对吗？  后面的v没有初始化过， 前面的循环有可能让v不更改， 这也是个潜在的漏洞 那么s[v]这里怎么改


Question: 我在输入作者名的时候运行异常，麻烦看下哪里错了，顺便看看整体有没有错，谢谢大佬。

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

你不是输入作者出错，是输入书名就错了，你要输入的是字符串吧？但是你定义的是一个字符，，你要把char X变成char X【放你字节大小】字节大小要至少等于你最大字节，不然会越界，一般定的稍微大点，一个汉字两个字节，书名的话来个60，名字24，看着来，不用太大，但是要保证你输入以后不会越界，访问的时候变量用 . p1.num，数组名、指针用->。char x[]，p1->x，

char是单个字符，改为字符数组

typedef struct library { struct library *next; int num; char bookname【100】; char author【50】; char type【100】; char publish【50】; float sale; char publishing_house【100】; char publishing_time【100】; }library; 改成类似这样的，才可以用%s方式来输入对应的数据。


Question: 求助

引用 1 楼 柒贰伍玖 的回复:你 is 函数里面的 sum，没有初始化就直接用，会误判 count_sum最后的 return 语句是多余的 给你改了下   #include "stdio.h" #include "stdlib.h" #include "../../不被3整除的数/q1.h"  int is(int number); void count_sum(int a,int b);  int main() {  	int a,b;  	scanf("%d %d",&a,&b); 	if(is(a)) printf("%d is counted.\n",a); 	if(is(b)) printf("%d is counted.\n",b); 	count_sum(a,b); 	system("pause");  	return 0; }   int is(int number) { 	int i,a; 	int b[10]; 	int sum = 0;//加初始化 	a=number; 	while(a!=0) 	{  		for(i=0;i<10;i++) 		{ 			b[i]=a%10; 			a/=10; 		} 		for(i=0;i<10;i++) 		{ 			sum+=b[i]; 		} 	} 	if(sum==5) 		return 1; 	else 		return 0; }   void count_sum(int a,int b) { 	int i,sum=0,count=0;  	if(a>0&&b<=10000&&a<=b) 	{ 		i=a; 		while(i<=b) 		{ 			if(is(i)) 			{ 				printf("%d\r\n", i); 				count+=1; 				sum+=i; 			} 			i++; 		} 		printf("count=%d,sum=%d\n",count,sum); 	} }   谢谢大佬


Question: 急，在线等！

已经自己搞定了，把判断出的素数装进一个数组里面就可以解决了！#include<stdio.h> int main() { 	int i,j,k=0,leap,a[100],sum=0,len=0,num=0,h=0; 	for(i=2;i<50;i++)//判断一个数是不是素数  	{ 		for(j=2;j<i;j++) 		{ 			leap=1; 			if(i%j==0) 			{ 				leap=0; 				break; 			} 		} 		if(leap==1)//把素数放进一个数组里面 ，这样可以避免判断两个素数  		{ 			a[k++]=i; 			len++; 		} 	} 	for(i=0;i<len;i++)// 引用素数  	{ 		for(j=i;j<len;j++) 		{ 			sum=a[i]+a[j]; 			if(sum>=6&&sum%2==0&&sum<=50) 			{ 			printf("%2d = %2d + %2d   ",sum,a[i],a[j]); 			h++; 			if(h%5==0)//每行输出五个  			{ 			printf("\n"); 			} 			} 		} 	}printf("\n"); }

引用 1 楼 宾灬的回复:仅作参考：  #include<stdio.h>  // 3-50之间所有的素数 int arr_s[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49 };  //判断是否在素数数组中 int is_contain(int num){ 	int start = 0; 	int end = 15; 	int middle = (start+end)/2; 	while(start < end - 1){ 		if(arr_s[middle] == num){ 			return 1; 		}else if(arr_s[middle] < num){ 			start = middle; 			middle = (start+end)/2; 		}else{ 			end = middle; 			middle = (start+end)/2; 		} 	} 	 	return arr_s[middle] == num; 	 } int  main()  {     	int i,j,r,count = 0; 	j = 0; 	//把6-50之间的偶数列出 	int arr[23] = {0}; //23个偶数 	for( i = 6; i<=50; i++){ 		if(i%2 == 0){ 			arr[j] = i; 			//printf("%d,", arr[j]); 			j++; 		} 	} 	 	 	for(i = 0; i < 23; i++){ //23个偶数 		 		for(j=0; j < 16; j++){ //16个素数 			r = arr[i] - arr_s[j]; 			if(is_contain(r) && r >=arr_s[j]){ 				printf("%d + %d = %d\t", arr_s[j], r, arr[i]); 				count++; 				if(count % 5 == 0){ 					printf("\n"); 				} 			} 			 		} 	} 	return 0;  }  这个方法不实用，因为你列举素数，应该写代码来判断这个数是不是素数！我会判断一个数是不是素数，但是我不会怎么实现引用两个素数相加。

引用 1 楼 宾灬 的回复:仅作参考：  #include<stdio.h>  // 3-50之间所有的素数 int arr_s[16] = {2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 49 };  //判断是否在素数数组中 int is_contain(int num){ 	int start = 0; 	int end = 15; 	int middle = (start+end)/2; 	while(start < end - 1){ 		if(arr_s[middle] == num){ 			return 1; 		}else if(arr_s[middle] < num){ 			start = middle; 			middle = (start+end)/2; 		}else{ 			end = middle; 			middle = (start+end)/2; 		} 	} 	 	return arr_s[middle] == num; 	 } int  main()  {     	int i,j,r,count = 0; 	j = 0; 	//把6-50之间的偶数列出 	int arr[23] = {0}; //23个偶数 	for( i = 6; i<=50; i++){ 		if(i%2 == 0){ 			arr[j] = i; 			//printf("%d,", arr[j]); 			j++; 		} 	} 	 	 	for(i = 0; i < 23; i++){ //23个偶数 		 		for(j=0; j < 16; j++){ //16个素数 			r = arr[i] - arr_s[j]; 			if(is_contain(r) && r >=arr_s[j]){ 				printf("%d + %d = %d\t", arr_s[j], r, arr[i]); 				count++; 				if(count % 5 == 0){ 					printf("\n"); 				} 			} 			 		} 	} 	return 0;  }  49不是素数，7 x 7 = 49


Question: 这个警告是怎么回事？

谢谢

不是这样      sd(zxc[20],target,length);  应该这样       sd(zxc,target,length);


Question: 改错

引用 11 楼 柒贰伍玖 的回复:引用 9 楼 weixin_45949073 的回复:[quote=引用 7 楼 super_admi 的回复:] 我只能感叹一句：这年头，连手敲代码都懒得做了，居然直接上照片……这么多问题的也就个别这样，别太悲观。 还有更过分的，传的照片在电脑上 你还得歪着头看的[/quote]哈哈哈

引用 9 楼 weixin_45949073 的回复:引用 7 楼 super_admi 的回复:我只能感叹一句：这年头，连手敲代码都懒得做了，居然直接上照片……这么多问题的也就个别这样，别太悲观。 还有更过分的，传的照片在电脑上 你还得歪着头看的

引用 5 楼 寻开心 的回复:char fun(char * c) {         if () 不用改 return *c； }  int main（） {     ....    puts(*p) 改成 putchar（*p）；    。。。。。。 }putchar不是一个字符吗？这里应该是要输出字符串的。

fun函数 bool fun(char *c)          ->           char fun(char *) fun = c                         ->            return *c  main函数 p = s                           ->             *p = s while(*p)                     ->             while('\0' != *p) puts(*p)                      ->              putchar(*p)

我只能感叹一句：这年头，连手敲代码都懒得做了，居然直接上照片……

引用 1 楼 user-5的回复:char fun() 理论上指针要判断一下是不是NULL return *c; *p=s; puts(p)  不是很懂要怎么改，这些是语法的，逻辑的就没管了 这样改能运行不出结果

引用 3 楼 柒贰伍玖的回复:题目要求发下看看 图片里第一行文字就是啊

题目要求发下看看

好的谢谢，我去试一下看看


Question: 框出来的语句有什么用吗？

节点就是火车， 指针就是挂钩，自己想想一下，要摘掉一节车厢要怎么弄。  自己画图也好，拿实物示范也好。

是为了能够连接到后面的节点，这一句，假如p是头节点，要删除p->next,而p->next->next需要通过p->next这个节点才能获取，如果直接删除p->next后面的节点就不能再连接上了，现在q=p->next   =>  q->next=p->next->next ;p->next=q->next => p-next->=p->next->next这样就把后面连起来而把p->next这个节点独立出来了，这样再删除这个节点就不会影响到别的节点了

是为了找到q，后边好用e去除q里面的值吗？我不是很确定……希望大家能帮帮我，谢谢啦。


Question: 为什么将数组传入函数以后的sizeof算出来与主函数不一致？

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

建议使用宏定义计算数组长度： #define ARRAY_LEN(x) (sizeof(x)/sizeof(x[0]))

这隐含了一个道理，也是最不容易理解的道理，指针所占的空间大小与指针的类型无关，而与系统的数据总线位数有关

引用 6 楼 weixin_45949073的回复:[quote=引用 5 楼 ycy894zx的回复:]哦哦哦哦，谢谢大家！！我还没学指针 这样他们看不到的，最好的答谢就是结贴分配分数[/quote] 请问大佬手机怎么弄分配分数？

因为这里不是数组了，而是指针。

引用 5 楼 ycy894zx的回复:哦哦哦哦，谢谢大家！！我还没学指针 这样他们看不到的，最好的答谢就是结贴分配分数

哦哦哦哦，谢谢大家！！我还没学指针

一个是指针，一个是数组， 就是不一样了

因为你传入函数的形参已经从那一片地址变成了首地址的指针，而sizeof（指针）是4/8字节（看系统）

形参无法写数组 只能写指针

void f(int a[])  == void f(int* a)


Question: 单链表插入元素的代码中判断输入位置不合理的条件是否多余了？

所谓的应保护，就是不管前面怎么写代码， 反正我知道，到了这个就必须要达到某个条件 那么我就在这里加上对这个条件的判断， 以此来检验前面的成果。  如果前面有错了， 到了这里就可以发现， 从而确定错误的范围是在前面的代码里面发生的

引用 2 楼 寻开心的回复:while结束的时候， j最多是和i-1相等，不会出现大于的情况 那个判断是多余的 留在这里，也许是残留代码，或者是硬保护，防止某些意外吧 能讲讲关于硬保护是什么意思吗，？网上没搜到。

当链表当中只有4个，参数i是5的时候， 就会造成while循环退出的时候，p是NULL，而j依然是小于i-1的 否则while退出的时候，j就是i-1 j最多和i-1相等， 不会出现大于的情况的，那是无效的条件； 放在里面也不出错的， 因为那个逻辑判断是 或  也许是残留的代码，放在这里做一个硬保护


Question: 求助求解c语言


Question: Vc6.0求佩尔方程

第一次 x未初始化


Question: c语言编程求答案

把循环里面的return 0去掉，就可以得到所有满足a*b=716699的a和b  a=563 b=1273     a+b=1836     a*b=716699 a= 67  b=10697   a+b=10764   a*b=716699 a=19   b=37721   a+b=37740   a*b=716699 a=1    b=716699  a+b=716700 a*b=716699

#include <stdio.h> #include <math.h>  int main() { int a, b; int v = 716699; for (a=sqrt(v); a>0; a-- ) {       b = v / a;       if ( a * b  == v ) {                printf("a=%d b=%d a+b=%d a*b=%d",a, b, a+b, a*b);                return 0;       } } return 0; };

我不知道怎么编码，求编码

a*b为固定值， a+b最小值； 那么ab越接近，则和越小 所以上述的循环从sqrt（716699）开始向0循环就好，找到第一个满足a*b的整数解，计算出和就是答案了

大致代码 int min() {     int result=INT_MAX;     int index=1;     for(int A=1;A<sqrt(716699);A++)     {                              if(716699%A==0)               {                   int B=716699/A;                      int AB= A+B;                   if(AB<result)                   {                         result=AB;                         index=A;                    }             }         return result;      }

因为：A*B=716699 A+B=A+716699/A 也就是求 A+716699/A的极小值 且 A<716699/A


Question: 单链表尾插曲法

这个我不会 好久没发帖提问了，找不到管理和结贴入口了

引用 8 楼 李家湾王老汉的回复:[quote=引用 7 楼 寻开心的回复:]不是q=p q是新插入的，自然就是最后的节点 要让p始终是最后的节点， 所以是p=q （这样才能保证下次来的q依然插在p的后面成为最后的节点） 嗷，我好像懂了。……………[/quote] 怎么把分给你啊？？？？

引用 7 楼 寻开心的回复:不是q=p q是新插入的，自然就是最后的节点 要让p始终是最后的节点， 所以是p=q （这样才能保证下次来的q依然插在p的后面成为最后的节点） 嗷，我好像懂了。……………

引用 5 楼 寻开心的回复:这里的p=q，是让p始终是当前的尾巴节点 这样，每次新申请出来的q，都可以在他的后面继续插入 对呀，但是这样写不是很奇怪吗？要让每个q都等于p不应该是q=p吗？这样才是把p赋给q呀？ （额，我是个小白，对编程不是很懂。但是老师讲过说编程里面是把右边的赋给左边对吧？但根据这个思想就总是觉得最后一步写反了）

引用 1 楼 自信男孩的回复:贴代码吧。 不是p变成q，而是p指向q的位置。 图已经发了。只是手机没法回复图片。

贴代码吧。 不是p变成q，而是p指向q的位置。


Question: 大佬们，我这个哪里有问题吗，运行完最后一句话之后，数据都输出来了，然后就返回不了了，就崩溃了。

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

直接贴完整代码吧，从这个函数里看不出你的问题所在～其他函数也只能靠猜～


Question: 遇到一个问题！

第1种 : 1枚1分 2枚2分 19枚5分 第2种 : 1枚1分 7枚2分 17枚5分 第3种 : 1枚1分 12枚2分 15枚5分 第4种 : 1枚1分 17枚2分 13枚5分 第5种 : 1枚1分 22枚2分 11枚5分 第6种 : 1枚1分 27枚2分 9枚5分 第7种 : 1枚1分 32枚2分 7枚5分 第8种 : 1枚1分 37枚2分 5枚5分 . . . 第456种 : 86枚1分 2枚2分 2枚5分 第457种 : 87枚1分 4枚2分 1枚5分 第458种 : 88枚1分 1枚2分 2枚5分 第459种 : 89枚1分 3枚2分 1枚5分 第460种 : 91枚1分 2枚2分 1枚5分 第461种 : 93枚1分 1枚2分 1枚5分 我可以啊，逻辑和结果都没有问题啊

增加头文件  #include<windows.h> 加一条显示屏命令  system("mode con:cols=100 lines=1000");  //请包含头文件    #include "stdio.h" #include<windows.h>   int main () { 	  	int i,j,k,h=0; 	system("mode con:cols=100 lines=1000");  //请包含头文件   	for(i=1;i<100;i++) 	{ 		for(j=1;j<50;j++) 		{ 			for(k=1;k<20;k++) 			{ 				if((i+(2*j)+(5*k))==100) 				{ 				h++; 				printf("第%d种 : %d枚1分 %d枚2分 %d枚5分\n",h,i,j,k); 			    } 			} 		} 	} 	system("pause"); }

"为什么一开始直接166种了" 输出界面的限制只显示几百行  你函数太多 上面的输出就被刷掉了  正常现象 如果不放心 你可以用freopen 把stdout改到一个文件里面  打开文件看输出结果 就不会从166开始了

引用 1 楼 user-4 的回复:https://bbs.csdn.net/topics/394557285	 我的代码和他的一样，可是我输出的结果没有从零开始，直接从166开始了！

引用 3 楼 柒贰伍玖 的回复:if(i+(2*j)+(5*k)==100)  这个你少了括号，这个只要整个表达式不为0都会进到if里面去 应该是if((i+(2*j)+(5*k))==100)我按照你说的改了，还是一样！


Question: c控制台跨年小程序

哥们，代码排版下啊，这个一般没几个人能仔细去看的


Question: C语言题

别乱改代码  #include<stdio.h> void mima(char* a) {     int i;      for(i = 0; i < strlen(a); i++)         if(a[i] >= 'a' && a[i] <= 'z')             a[i] = 'z' + 'a' - a[I]; else     if(a[i] >= 'A' && a[i] <= 'Z')         a[i] = 'Z' + 'A' - a[i]; } int main() {     char a[1001];     gets(a);     mima(a);     puts(a);     return 0; }

引用 10 楼 weixin_46055651 的回复：[quote=引用 9 楼 寻开心 的回复：]把你改后的源代码再贴一下。 看起来是原文输出，根本就没有执行转换转化了，就个别没有[/quote]#include<stdio.h> void mima(char* a) {     int i;      for(i = 0; i < strlen(a); i++)         if(a[i] >= 'a' && a[i] <= 'z')             a[i] = 'z' + 'a' - a[i];;      if(a[i] >= 'A' && a[i] <= 'Z')         a[i] = 'Z' + 'A' - a[i]; } int main() {     char a[1000];     gets(a);     mima(a);     puts(a);     return 0; }

引用 9 楼 寻开心 的回复：把你改后的源代码再贴一下。 看起来是原文输出，根本就没有执行转换转化了，就个别没有

把你改后的源代码再贴一下。 看起来是原文输出，根本就没有执行转换

没有道理。 哪些不对?   把出问题的输入数据，和正确的输出数据贴一下 贴文字，不要贴图。

引用 4 楼 寻开心 的回复：#define LEN 1000  void mima(char * a) {     int i;     for ( i=0; i<strlen(a); i++) {         if ( a[i]>='A' && a[i] <= 'Z' )             a[i] = 'Z'+'A' - a[i];         else if ( a[i]>='a' && a[i] <= 'z' )         a[i] = 'z'+'a' - a[i];     } }  int main () {     char a[LEN+1];     gets(a);     mima(a);     puts(a);     return 0; }字符的数目是对的，就是有些字母转化的不对

不超过1000位，有可能就是1000位 数组大小定义为1001； gets之后，循环里面 i的范围是 0到 strlen（a）

引用 1 楼 寻开心 的回复：if  ( a[I] >= 'A' && a[o]<='Z' ) {       a[I]  = 'Z' - ( a[I] - 'A');     // 距离’Z'的距离的距离，是变换前距离‘A'的距离： z-newA = oldA-a   -->  newA = z - (oldA-a) } else if ( a[I] >= 'a' && a[I] <= 'z' ) {      a[I] = 'z' - (a[I] - 'a' ); }还是不行噢，跟上面结果差不多


Question: 关于c

你第二个%ld获取是不是需要&

抱歉，我知道哪儿错了😂

引用 2 楼 user-2的回复:你第二个%ld获取是不是需要& 谢谢！！ 😎😎😎😎😎😎😎😎😎😎😎😎


Question: VC6.0一直报错，打不开预编译头文件，救我

新建工程。控制台应用。

引用 2 楼 liups 的回复:从文件路径看是不对的，你那个cpp文件不应该在system32中！ 建议安装原版的VC6.0 果然是路径错了，我改成了C:\Users\lenovo\Desktop\Debug\妹啊    就好了

引用 2 楼 liups的回复:从文件路径看是不对的，你那个cpp文件不应该在system32中！ 建议安装原版的VC6.0 果然是路径错了，我改成了C:\Users\lenovo\Desktop\Debug\妹啊 就好了，

#include "stdafx.h" 或者 项目属性 中选择不使用预编译头


Question: VC6.0编译器频繁报错，大佬救我

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


Question: 有c语言的大佬帮忙看一看的吗，感谢

引用 楼主 weixin_44837630的回复:#include "stdafx.h" #include<stdio.h> #include<math.h> #include<iostream> using namespace std;   void quation() {/*求节点电位*/ 	FILE *fp=NULL; 	char ch; 	//打开文件 	fp = fopen("E:\\电路.docx","r"); 	//第一个双引号里面放的是文件具体路径，第二个是对文件进行的操作 	int i=0,j=0,m=0,n=0,o=0; 	char nam[100],typ[100],figure[100][100]; 	double r[100]={0},g[100]={0}; 	if(fp==NULL)//判断文件是否成功打开 	{ 		printf("文件打开失败"); 		return 0; 	} //如果文件能成功打开，函数返回值不为NULL 	while(!feof(fp))    //读取到文件尾    { 		fscanf(fp,"%c",nam[i]);														 		if(nam[i]!='*') 		{ 			fscanf(fp,"%s %f",typ[i],r[i]); 			if(typ[i]=='v') 			{ 				o++;//电源数o 			} 			else 			{ 				g[m]=1.0/r[m]; 				m++;//非电源原件数m 			} 			i++; 		} 		else  		{ 			//输入并转化成电导矩阵 			for(j=0;figure[n][j]=='*';j++) 			{ 			    fscanf(fp,"%c",figure[n][j]); 			} 			n++; 		}     }   	//关闭文件 	fclose(fp);  	//建立矩阵和增广矩阵  	int a[100]={0}; 	double b[100][100]={0},c[100][100]={0},d[100][100]={0}; 	double temp=0.0; 	int x=0,y=0,l;  	for(i=0;i<n;i++) 	{ 		l=0; 		for(x=0;x<n;x++) 		{ 			for(y=0;y<m+o;y++) 			{ 				if(nam[i]==figure[x][y]) 				{ 					a[l]=x; 					l++; 				} 			} 		} 		b[a[0]][a[1]]=g[i]; 		b[a[1]][a[0]]=g[i]; 		c[a[0]][a[1]]=1; 		c[a[1]][a[0]]=1; 		d[a[0]][a[1]]=g[i]; 		d[a[1]][a[0]]=g[i]; 	} 	for(i=0;i<n;i++) 	{ 		for(j=0;j<m+o;j++) 		{ 			if(i!=j) 			{ 				b[i][i]=b[i][i]+b[i][j]; 			} 		} 	} ////////////////////////////////////////////////////////////////////////// 	for(i=m;i<n;i++) 	{ 		for(x=0;x<n;x++) 		{ 			for(y=0;y<m+o;y++) 			{ 				if(nam[i]==figure[x][y]) 				{ 					a[l]=x; 					l++; 				} 			} 			for(j=0;j<n;j++) 			{ 				b[a[0]][j]=b[a[0]][j]+b[a[1]][j]; 			} 			b[a[1]][a[1]]=1; 			b[a[1]][a[0]]=-1; 			b[a[1]][n]=r[i]; 		} 	} ///////////////////////////////////////////////////////////////////// 	int p,q; 	double u[100]; 	for(j=0;j<n-1;j++) 	{ 		p=j; 		for( i=j+1;i<n;i++) /*找列主元*/ 		{ 			if( fabs(b[i][j])>fabs(b[p][j])) 			{ 				p=i; 			} 		} 		if(p!=i)  		{ 			for(q=j;q<n+1;q++) 			{ 				temp=b[p][q];/*换行*/ 				b[p][q]=b[j][q]; 				b[j][q]=temp; 			} 			for(i=j+1;i<n;i++)/*消元*/ 			{  				temp=b[i][j] ; 			} 			for(q=j;q<n+1;q++) 			{ 				b[i][q]=b[i][q]-b[j][q]*temp/b[j][j]; 			} 		} 	} 	for(i=n-1;i>=0;i--) /*回代*/ 	{ 		temp=0 ; 		for(j=n-1;j>i;j--) 		{ 			temp=temp+b[i][j]*u[j]; 		} 		u[i]=(b[i][n]-temp)/b[i][i]; 	} 	for(i=0;i<n;i++) 	{ 		printf("u[%d]=%7.3f\n",i+1,u[i]);/*打印 u*/ 	} ////////////////////////////////////////////////////////////////////// 	double v[100][100] ; 	for(i=0;i<m;i++) 	{ 		for(j=0;j<n;j++) 		{ 			v[i][j]=0; 			if(i<j && c[i][j]==1) 			v[i][j]=u[i]-u[j] ;/*计算支路电压*/ 			v[j][i]=-v[i][j]; 			printf("v[%d][%d]=%7.3f",i+1,j+1,v[i]) ;/*打印 v*/ 		} 	} ///////////////////////////////////////////////////////////////////// 	double I[100][100]; 	for(i=0;i<m+o;i++) 	{ 		for(j=0;j<m+o;j++) 		if(d[i][j]!=0) 		{ 			I[i][j]=v[i][j]/d[i][j]; 		}/*计算支路电流*/ 		printf("I[%d][%d]=%7.3f",i+1,j+1,I[i]);/*打印 I*/ 	}  /////////////////////////////////////////////////////////////////// 	double P[100][100]; 	for(i=0;i<m;i++) 	{ 		for(j=0;j<m;j++) 		{ 			P[i][j]=I[i][j]*v[i][j];/*计算功率*/ 			printf("P[%d][%d]=%7.3f",i+1,j+1,P[i][j]);/*打印 p*/ 	} } //////////////////////////////////////////////////////////////////// int	main( ) { 	quation(); 	return 0; } 哪里有问题啊，没有报错但是没有输出


Question: 学员小问题，在线等，急

1 fopen两次是不对的。 FILE * fp； 就可以了 2 你先试试fgets后puts看看，是否从文件当中正确的获得了字符串 3 把文本读入到a数组后，你用sscanf函数读取就不用那么多while语句判断    sscanf 和 scanf函数类似    sscanf（a, "%s%s%s%s",  name, id, cp, ....


Question: C语言：三维基本勾股数组

没注意 “基本” 你自己把结果过滤一下就好了。  只要判定i和j是否互质就可以了。

引用 1 楼 寻开心的回复:#define RANGE 100  int main() {     int nCount=0;     int i, j;     for ( i=2; i<RANGE; i++ ) {         for ( j=1; j<i; j++ )         {             int v = i*i + j*j;             int t = sqrt(v);             if (t*t == v && t<=RANGE) {                 nCount++;                 printf("%3d\t%3d\t%3d -> %5d %5d %5d\n", j, i, t, j*j, i*i, t*t);             }         }     };     printf("Total: %d\n", nCount);     return 0; } 你好，你上面的程序能够运行，是三维勾股数组，不过不是“基本”勾股数组吧？


Question: 新手求助

一楼正解，一个是全局变量，另外一个是函数传递的是值，如果要改变原来变量的值，就要用指针把变量的地址传过去

第一个你定义的是全局变量，同名改变了变量的值，第二个你是传参，局部变量里的值虽然一样，但是局部变量的地址与你需要改变的变量的地址不同，所以你所做的改变仅仅只在你f函数中局部变量上，不会改变你main函数里的值，如果要改，把f的参数改为地址，然后把main函数传递的时候传递对应变量的地址，改变的就是main函数的变量的值了f（int* a,int* b）{{int t;t=*a,*a=*b;*b=t}} main调用传参f(&x,&y);


Question: 求大佬赐教，表达的不太清楚，还请原谅！

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

MFC其实挺好的，从VC++6.0入手吧

不清楚，c的话在学校用不到界面吧？简单的字符界面就够了，我们都是后面学了c++用QT，然后vs软件自带控件 要是做什么系统之类的，简单的字符界面就够了吧，printf("*****图书管理系统*****\n");printf("1.XXX\n");printf("2.xxx\n");printf("请输入你的选择\n");printf("input:");写个函数单独用来显示这些就好了 *****图书管理系统***** 1.XXX 2.xxx 请输入你的选择 input: 显示出来就是这样的

你说的是图形化界面编程吧。这需要图形库。才大一啊，c++学了的话可以用qt。没学的话你可以找一下c语言的图形库，我知道有个叫easyx的图形库，但我没用过。我都是用qt.


Question: 第一次用C的结构体和链表写了个学生管理系统，调试的时候没有问题，但是运行的时候却无法正常工作，求各位大佬帮忙解惑！！！


Question: c语言，大神帮忙解释下

do-while后面的分号最好加上，这样比较规范，养成个好习惯。

谢谢，期末复习的题库，有点问题

7 怎么没有对的答案啊    a 循环体内可以有多条语句，不正确    b 可以不执行到while就跳出，但是没有while 语法就不成立了    c 可以把终止循环的操作放到while里面用逗号表达式处理结束条件，也不正确。 相比之下，c可以作为本题答案    d do ｛｝while（1）；分号可以加的啊。也可以不加。但是不是不能加。 13      a) *p数组的第一个元素值     b) a【10】越界。   这个是答案     c）*p++ 是数组的第二个元素值     d） a【p-a】  就是a【0】 也是对的


Question: 一个结构体声明中要包含另一个结构体指针，要怎么做？

struct people {      int age;     struct people *next;   //链表节点的定义方法。 }

这个对的阿，通常就是包含的结构体先声明，然后记得格式{}后的；别忘了

通常就是你这种做法，也可以用 void *p，用的时候强制转换

个人喜好，主要看你编码习惯

谢谢各位 ！

你自己写的那种方法就是常用的了

引用 1 楼 柒贰伍玖 的回复:  引用 2 楼 qq_1457346882 的回复:  引用 3 楼 自信男孩 的回复:  引用 4 楼 寻开心 的回复:  我的意思是    我用这种做法：  #include "hoteler_node.h"   。            然后在后面写新的结构体room(room包含另一结构体peopel的指针)声明

只要提前声明被包含的结构，不让它没有定义，就可以和常规类型一样使用了