Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 有一个字符串，内有若干个字符，现输入一个字符，要求程序将字符串中该字符删去。用外部函数实现。

回复:
user: user-1
content: 1. file2.cpp: 应该先#include <stdio.h>，否则编译失败，从而无法生成enter_string符号，会导致最终链接失败。 2. file4.cpp: 应该先#include <stdio.h>，否则编译失败，从而无法生成print_string符号，会导致最终链接失败。 3. 设定project时是不是设置成Win32或Windows应用程序了？应该设置成Console或控制台应用程序，否则就会出现找不到WinMain函数的链接错误。

user: user-2
content: 几个文件必须全部编译成功后才能链接生成exe程序，你的第2 4个文件，由于没有头文件编译失败，这种去情况应先改正编译错误。

user: user-3
content: 引用 3 楼 weixin_58044954 的回复:已经用extern联了呀extern 只是在这个文件里声明了这几个函数是外部的，告知这几个函数不在本部门里，至于这个外部的范围它的也不知道呢。

user: user-0
content: 已经用extern联了呀

user: user-3
content: 几个文件之间得让他有关联，不然它不知道到哪去找这个声明为外部的函数，无路可走。

user: user-2
content: 链接错误，猜测一下，几个文件应先分别编译最后再构建，你可能没有编译其他的几个文件。
user-0 提问: 请教一个16进制问题

回复:
user: user-0
content: 不是 0x2710对应的是10000，除以10，对应的是3e8。舍弃的是10进制下的最后一位。

user: user-1
content: 你的意思 0x2710 转换到 0x3e 最后的8 忽略 对吗

user: user-2
content: int mmlen; struct oh {  unsigned int cm:12; } cmlen; mmlen=10000; cmlen.cm=mmlen/10;

user: user-3
content: 不就是x / 10吗
user-0 提问: 有一个字符串，内有若干个字符，现输入一个字符，要求程序将该字符串中该字符删去。用外部函数实现。

回复:
user: user-0
content: 重新发了个帖子，麻烦你看一下

user: user-1
content: 那你把代码和编译错误都发出来
user-0 提问: while的用法求助！！！！！！！

回复:
user: user-1
content: 第一个while里面不会更新ch，相当于只会从文件里读取到一个字节的数据；  第二个是循环读取文件内容的。

user: user-2
content: 不要使用 while (条件) 更不要使用 while (组合条件) 要使用 while (1) {  if (条件1) break;  //...  if (条件2) continue;  //...  if (条件3) return;  //... } 因为前两种写法在语言表达意思的层面上有二义性，只有第三种才忠实反映了程序流的实际情况。 典型如： 下面两段的语义都是当文件未结束时读字符 while (!feof(f)) {  a=fgetc(f);  //...  b=fgetc(f);//可能此时已经feof了！  //... } 而这样写就没有问题： while (1) {  a=fgetc(f);  if (feof(f)) break;  //...  b=fgetc(f);  if (feof(f)) break;  //... } 类似的例子还可以举很多。

user: user-3
content: 第一个ch = fgetc(fp); 在while（）循环体外，ch只从文件读入一次，只要这一次不在文件尾，在while(ch!=EOF)永远成真，死循环了。

user: user-4
content: 第一种写法，在while循环中，ch就没变化，当然会陷入死循环。 第二种写法，每次while循环，ch都会重新被fgetc(fp)赋值，总会读到EOF，所以就能跳出循环。
user-0 提问: 新手小白，想询问一下，哪里错了

回复:
user: user-1
content: 猜一猜，下面的程序片断将打印什么内容？ int m = 5;  switch (0) {     m ++;     default: printf ("%d\n", m); }

user: user-1
content: 引用 2 楼 user-2 的回复:case ' b>max':  这里的类型不对，'b>max' 是什么类型呢，不是 字符型，也不是 字符串，case 后面跟整形才对。 这种说法是不正确的。  首先，case 后面必须跟整型常量表达式（而不是通常意义上的整型）。  其次，'b>max' 是字符常量，它的类型是 int 。因此，'b>max' 的类型是 int 。根据整型常量表达式的定义，'b>max' 也是整型常量表达式。  所以 case 'b>max' 在语法上是没有问题的。  问题在哪里呢？对于单字符的字符常量，比如 'x'，在编译时转换为 int 类型的字符编码。但是，对于包含多个字符的字符常量，比如 'abcd'，在编译时如何打包成 int 类型的编码，由编译器（C实现）决定。有很多机器上，int 类型的长度是 4 个字节，正好可以编码4个字符，但超过4个字符就会出现警告。  来看下面这个例子，这个例子可以正常执行并打印 “Okay.”： switch ('b>ma') {     case 'b>ma' : printf ("Okay.\n"); } 在很多机器上，这个示例不会产生“字符太长”的警告，但有可能出现“字符常量由多个字符组成”的警告。但相对于字符太长的警告，后面一个警告是可以接受的。

user: user-0
content: 谢谢侬，嘿嘿

user: user-2
content: 供参考：#include<stdio.h>  int main() {    int a,b,c;    printf("请输入三个数:\n");    scanf("%d%d%d",&a,&b,&c);    printf("最大值:%d\n",a>b?(a>c?a:c):(b>c?b:c));        return 0; }

user: user-2
content: case ' b>max':  这里的类型不对，'b>max' 是什么类型呢，不是 字符型，也不是 字符串，case 后面跟整形才对。
user-0 提问: 看不懂指针，唉！

回复:
user: user-1
content: 编译不过与指针没关系 ，执行语句应放在函数定义中，你没写函数定义，啥编译器也通不过。

user: user-2
content: TC编译器是不是目前只有学校里教学会使用了。 建议使用VS编译调试工具；  代码没写在函数里呢？看着不符合语法规则～ p = a;只能出现在函数里。int *p, a[3];可以放在函数外，因为这是定义，定义的全局变量；

user: user-3
content: A[B] *(A+B) *(B+A) B[A] //以上四行等价  "abc"[1] *("abc"+1) *(1+"abc") 1["abc"] //以上四行等价  A[0] *(A) 0[A] //以上三行等价

user: user-4

user: user-4
content: 换一个编辑器吧

user: user-5
content: 应该用 #include <stdio.h> ... <>和""内的头文件查找路径不一样
user-0 提问: 哪位大神帮忙看一下哪点错了。

回复:
user: user-1
content: 引用 1 楼 自信男孩 的回复:struct studeng stud[n];这儿有问题呢。n是随机值，不确定大小；C语言不支持不确定的数组长度； 可以考虑用动态申请空间的方式来实现：  struct studeng *stud = NULL;  在scanf后面加上一句申请空间的语句：  stud = (struct student *)malloc(sizeof(struct student)); if (!stud)     exit(0);  后面对stud可以以数组的形式访问和操作；  最后注意不适用stud时，记得free(stud);释放；  stud = (struct student *)malloc(sizeof(struct student) * n); if (!stud)     exit(0); 用这个，上面那个有问题，忘了乘于n了。这个n是输入之后的n；

user: user-1
content: struct studeng stud[n];这儿有问题呢。n是随机值，不确定大小；C语言不支持不确定的数组长度； 可以考虑用动态申请空间的方式来实现：  struct studeng *stud = NULL;  在scanf后面加上一句申请空间的语句：  stud = (struct student *)malloc(sizeof(struct student)); if (!stud)     exit(0);  后面对stud可以以数组的形式访问和操作；  最后注意不适用stud时，记得free(stud);释放；
user-0 提问: 怎么调用随机四参数法生成多孔介质

回复:
user: user-1
content: 师兄，我也想问这个问题，怎么把随机四参数的代码和LBM的代码进行联动啊？您这个问题解决了么？

user: user-2
content: 老哥，现在会用了吗？方便加个QQ吗？1974595531
user-0 提问: srand((unsigned)time(NULL))；如何声明time

回复:
user: user-1
content: 缺少头文件吧，看看引入的头文件里有没time.h吧

user: user-0
content: 好了，谢谢各位

user: user-2
content: 在随机数里要用time的话，就要#include <time.h>

user: user-0
content: 还有上边的[M]我自己定义成了int型函数，不知道对不对
user-0 提问: 大佬，教教孩子吧

回复:
user: user-0
content: 引用 5 楼 qzjhjxj 的回复:[quote=引用 4 楼 qq_57019597 的回复:] 这种是什么情况呀 哭了 头文件：Windows下为--> windows.h，Sleep是区分大小写的，有的编译器是大写，有的是小写。  第2行改为：  #include<windows.h>     第19行：Sleep(1); 第16行改为：if(fabs(x-1)<1e-6){  [/quote] 懂了懂了，谢谢

user: user-1
content: 引用 4 楼 qq_57019597 的回复: 这种是什么情况呀 哭了 头文件：Windows下为--> windows.h，Sleep是区分大小写的，有的编译器是大写，有的是小写。  第2行改为：  #include<windows.h>     第19行：Sleep(1); 第16行改为：if(fabs(x-1)<1e-6){

user: user-0
content: 这种是什么情况呀 哭了

user: user-0
content: 谢谢你们啦

user: user-2
content: #include <stdio.h> #include <unistd.h> #include <math.h>  int main(void) {     int i, j, k, z;     float x;      for (i = 1; ;i++)         for (j = 1; j <= i;j++)             for (k = 1; k <= j; k++)                 for (z = 1; z <= k; z++) {                     x = 1.0/i + 1.0/j + 1.0/k + 1.0/z;                      if (fabsf(x - 1) < 1e-6) {                         printf("%d, %d, %d, %d\n", i, j, k, z);                         printf("%.2f+%.2f+%.2f+%.2f = %.2f\n", 1.0/i, 1.0/j, 1.0/k, 1.0/z, x);                         sleep(1);                         //return 0;                     }                 }      return 0; } 供参考～  sleep需要等待一个一个的输出～

user: user-3
content: float a = 4, b = 4, c = 4,d = 4; 写完手工
user-0 提问: 从大到小排序，为啥我的结果是错的

回复:
user: user-0
content: 万分感谢，嘿嘿

user: user-1
content: if (k != i)引用缺少大括号  for (i = 0; i < 7; i++) {     k = i;     for (j = i + 1; j < 7; j++)         if (a[j] > a[k])             k = j;     if (k != i)     {         t = a[k];         a[k] = a[i];         a[i] = t;     } }

user: user-2
content: 引用 2 楼 自信男孩 的回复:#include<stdio.h>   //void main() int main() {     int a[7]={15,34,6,27,48,4,20},i,j,k,t;     printf("排序前的数列：");     for(i=0;i<7;i++)         printf("%5d",a[i]);     for(i=0;i<7;i++)     {         k=i;         for(j=i+1;j<7;j++)             if(a[j]>a[k])                 k=j; #if 0         if(k!=i){             t=a[k];a[k]=a[i];a[i]=t;         } #else         if (k != j)             t = a[k], a[k] = a[i], a[i] = t; #endif     }     printf("\n从大到小排序后（选择法）\n");     for(i=0;i<7;i++)         printf("%5d",a[i]);      printf("\n");      return 0; } 供参考～  少一个大括号，或者用逗号代替分号; 把if (k != j)改成if (k != i)因为上面初始的是k = i;

user: user-3
content: 把你的内层for循环里第二个if后交换的部分，三个语句加上花括号，那是个整体  if(k!=i)  { t=a[k];a[k]=a[i];a[i]=t; }

user: user-2
content: #include<stdio.h>   //void main() int main() {     int a[7]={15,34,6,27,48,4,20},i,j,k,t;     printf("排序前的数列：");     for(i=0;i<7;i++)         printf("%5d",a[i]);     for(i=0;i<7;i++)     {         k=i;         for(j=i+1;j<7;j++)             if(a[j]>a[k])                 k=j; #if 0         if(k!=i){             t=a[k];a[k]=a[i];a[i]=t;         } #else         if (k != j)             t = a[k], a[k] = a[i], a[i] = t; #endif     }     printf("\n从大到小排序后（选择法）\n");     for(i=0;i<7;i++)         printf("%5d",a[i]);      printf("\n");      return 0; } 供参考～  少一个大括号，或者用逗号代替分号;

user: user-4
content: 修改如下，供对照：#include<stdio.h> void main() {     int a[7]={15,34,6,27,48,4,20},i,j,k,t;     printf("排序前的数列：");     for(i=0;i<7;i++)         printf("%5d",a[i]);     for(i=0;i<7-1;i++)     {         k=i;         for(j=i+1;j<7;j++)            if(a[j]>a[k]) k=j;         if(k!=i)         {            t   =a[k];            a[k]=a[i];            a[i]=t;         }     }     printf("\n从大到小排序后（选择法）\n");     for(i=0;i<7;i++)         printf("%5d",a[i]);     printf("\n");      }
user-0 提问: 请问这道题答案为什么是20？

回复:
user: user-1
content: 夜已深，上面的发言有一些手误的地方。  规则一：除非明确指定，否则，子表达式的值计算和副作用是无序的； 规则二：对运算符的操作数的值计算，前序于运算符本身的值计算（也就是整个表达式的值）。  对于表达式 p -> age = p -> age ++ 来说，子表达式 p -> age ++ 的值计算用 V++ 表示，而 S++ 代表它的副作用；整个赋值表达式的副作用记为 S=。那么，依据规则，这里有两种可能的顺序：  先 V++（20），再 S++ （21），最后 S= （20）  或者  先 V++（20），再 S=（20），最后 S++（21）。  给赵4老湿点赞吧，我是代替赵老湿回答问题的。

user: user-2
content: p->age = p->age++;自增是有副作用的。要么p->age++;要么p->age = p->age + 1;楼主题目里的写法不常见，结果不好理解和推理，因为有矛盾在里面；  如果是20，那么p->age++的++最终要计算的。如果是21，那么就是先以p->age++为整体，然后再算++，相当于写了2次的age。

user: user-1
content: 引用 1 楼 浪客 的回复:++在后面，先赋值再+1 我代表赵4老湿指出你的两点错误。  首先，表达式 p -> age = p -> age ++ 的行为是未定义的。最后输出的结果可能是 20，也可能是 21。  其次，说先 ++ ，再赋值，这是没有任何依据的。  后缀递增表达式的值是递增前的原值，同时还有修改操作数存储值的副作用。所以，从总体上，表达式 p -> age = p -> age ++ 有三个基本动作：  1，计算表达式 p -> age ++ 的值。这个值是结构成员 age 的原始值 20； 2，表达式 p -> age ++ 发起一个副作用，这会修改结构成员 age 的存储值，修改为 21； 3，表达式  p -> age = p -> age ++ 发起一个副作用，用子表达式 p -> age ++ 的值修改赋值运算符左边的 p -> page，修改为 20。 注意，表达式   p -> age = p -> age ++ 也要计算一个值，它是 p -> page 被赋值后的值，但被丢弃，所以不用管。  以上三个动作按什么顺序发生呢？按照规定，必须先计算运算符操作数的值。总体上，先计算子表达式 p -> age ++ 的值，这个值是 20。所以，这三个动作发生的次序可能是 2 -> 1 -> 3 也可能是 2 -> 3 -> 1 不管哪种顺序，成员 age 都会被写入两次，但最终结果不同。如果是第一种顺序，那么，成员 age 最终的值是 20；如果是第二种顺序，则成员 age 最终的值是 21。

user: user-3
content: ++在后面，先赋值再+1
user-0 提问: 求帮助

回复:
user: user-1
content: 你得贴运行图，才知道是向左错还是向上错的。

user: user-2
content: scanf("%d\n",&a[i]); 试试？

user: user-3
content: 从代码上看没什么问题的，不知道你的输入数据是怎么样的，结果不对又是什么内容，所以贴出你运行时的测试数据和结果～
user-0 提问: C语言程序设计题，帮帮忙。

回复:
user: user-1
content: 老赵比曹操跑的快~

user: user-2
content: 引用 4 楼 lin5161678 的回复:[quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h>  int count(int n);  int main() {     int m;      scanf("%d", &m);      printf("%d\n", count(m));     return 0; }  int count(int n) {     static int bit;     if (n == 0)         return 0;     bit++;     count(n/10);      return bit; }  供参考～不应该使用static 这样写 调用2次就错了[/quote] 考虑改进呀，没有不应该，只有做不好。   #include <stdio.h>  static int bit; int count(int n);  int main() {     int m, ret;      do {         ret = scanf("%d", &m);         printf("%d\n", count(m));         bit = 0;     } while (ret == 1);      return 0; }  int count(int n) {     if (n == 0)         return 0;     bit++;     count(n/10);      return bit; } 供参考～

user: user-3
content: 引用 1 楼 自信男孩 的回复:#include <stdio.h>  int count(int n);  int main() {     int m;      scanf("%d", &m);      printf("%d\n", count(m));     return 0; }  int count(int n) {     static int bit;     if (n == 0)         return 0;     bit++;     count(n/10);      return bit; }  供参考～不应该使用static 这样写 调用2次就错了

user: user-4
content: 引用 2 楼 早打大打打核战争 的回复:int count(int n) {   return n < 10 ? 1 : count(n / 10) + 1; } 你这是抄袭我已经想好的，但还没有发表出来的答案！我代表赵4老湿严肃滴批评你！

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

user: user-1
content: 引用 3 楼 均陵鼠侠 的回复:[quote=引用 2 楼 早打大打打核战争 的回复:]int count(int n) {   return n < 10 ? 1 : count(n / 10) + 1; } 你这是抄袭我已经想好的，但还没有发表出来的答案！我代表赵4老湿严肃滴批评你！[/quote]  那也应该跟老赵没关系吧~

user: user-1
content: int count(int n) {   return n < 10 ? 1 : count(n / 10) + 1; }

user: user-2
content: #include <stdio.h>  int count(int n);  int main() {     int m;      scanf("%d", &m);      printf("%d\n", count(m));     return 0; }  int count(int n) {     static int bit;     if (n == 0)         return 0;     bit++;     count(n/10);      return bit; }  供参考～
user-0 提问: 64位全FF左右移64位还是全FF是为什么？

回复:
user: user-0
content: 引用 2 楼 user-2 的回复:任何情况下，若 rhs 为负或大于或等于提升后的 lhs 中的位数，则行为未定义。  https://zh.cppreference.com/w/c/language/operator_arithmetic 引用 3 楼 自信男孩 的回复:https://blog.csdn.net/huqinwei987/article/details/70941199 供参考～  感谢两位的回答。结帖撒花。

user: user-1
content: https://blog.csdn.net/huqinwei987/article/details/70941199 供参考～

user: user-2
content: 任何情况下，若 rhs 为负或大于或等于提升后的 lhs 中的位数，则行为未定义。  https://zh.cppreference.com/w/c/language/operator_arithmetic

user: user-0
content: 上边是GDB调试打印信息，下边是源码，就这几行
user-0 提问: R7-7 找出数组中元素的最大数，并指出其位置 (10 分) 

回复:
user: user-1
content: #include<stdio.h> #include<string.h>  #define MAX_SIZE    10  int main(void) {     int array[MAX_SIZE];     int i, idx = 0;      for (i = 0; i < MAX_SIZE; i++) {         scanf("%d", &array[i]);         if (array[i] > array[idx])             idx = i;     }       printf("No.%d = %d\n", idx+1, array[idx]);     return 0; }   供参考～  如果在数组内有多个相同的最大值，那么需要特殊处理一下，楼主可以自己试着修改一下～
user-0 提问: Python：随机产生10个100以内的整数，找出差值相差最小的两个整数。

回复:
user: user-1
content: 这是C/C++的板块，你提用python？C语言可以实现一下

user: user-2
content: import random origin_list = [random.randint(0, 99) for i in range(10)] print("10个100以内的随机整数是：", origin_list) origin_list.sort() dif_list = [[origin_list[i] - origin_list[i-1], (origin_list[i], origin_list[i-1])] for i in range(1, len(origin_list))] dif_list.sort(key=lambda x: x[0]) result = [i[1] for i in dif_list if i[0] == dif_list[0][0]] print("差值最小的两个数是：", result, ",其差为：", dif_list[0][0])
user-0 提问: 求助！！！！使用c/c++读取16进制文件问题

回复:
user: user-0
content: 解决链接： Java实现将16进制转10进制浮点型输出到文件中： https://blog.csdn.net/weixin_43917334/article/details/117033747 c语言16进制转txt可读文件： https://blog.csdn.net/weixin_43917334/article/details/117033192

user: user-1
content: FILE *fp=fopen("d.txt","w"); fprintf(fp,"%g\n",f); fclose(fp);

user: user-1
content: 将起始地址对应的数强制类型转换为float *类型后，取其值即可。如果字节序反了，先颠倒一下。 float f; unsigend char b[4]={0xBA,0x12,0x2A,0x43}; f=*(float *)&b[0];

user: user-2
content: 先读取到缓存里（按照字符串），然后可以考虑调用sscanf，转换成对应数值，memcpy到int数据内（4个一组）

user: user-0
content: 已解决：方案  使用c语言把dat文件转txt文件然后使用Java按行读取txt，将每8个字符串进行一次转换
user-0 提问: 输入正整数n，计算s = 1/1! + 1/2! + 1/3! + ……+ 1/n!的值。

回复:
user: user-1
content: ???有毒

user: user-2
content: ???

user: user-3
content: 楼主什么问题？头文件写到函数内，没见过这么写的呢。

user: user-4
content: 供参考：#include<stdio.h>  int main() {     int    j,k,n;     double f,s;      scanf("%d",&n);     s=0.0;          //2分     for(k=1;k<=n;k++){         f=1.0;      //2分         for(j=1;j<=k;j++)//3分            f *= j;   //3分         s=s+1.0/f;     }     printf("sum=%f\n",s);          return 0; }

user: user-5
content: 厉害
user-0 提问: 程序运行时出现堆已损坏

回复:
user: user-1
content: 应该是文件路径问题吧，可以通过strerror(errno);看一下fopen打开失败的原因。

user: user-2
content: 蹭分的来了[face]emoji:019.png[/face]

user: user-0
content: 已经解决了，但是无满意结帖不退分，不想浪费分数，随便来几个人我把分散一下
user-0 提问: 大佬们求助

回复:
user: user-1
content: 供参考：//1.输出1~100之间 各位数的乘积 > 各位数的和 的数  #include<stdio.h>  int fun(int n) {     int sum=0,product=1,m;     while(n){           m = n%10;           product *= m;           sum += m;           n /= 10;     }     if(product > sum)        return 1;     else        return 0; }  int main() {     int i,j=0;     for(i=1;i<100;i++)         if(fun(i))printf("%d%c",i,++j%9!=0?' ':'\n');         return 0; } //2.哥德巴赫猜想  #include<stdio.h>  int  isPrime(int n) {     int i;     if(n<=3) return n>1;     for(i=2;i*i<=n;i++)        if(n%i == 0) return 0;     return 1; }  int main() {     int i,j;     for (i=4;i<=20;i+=2){         for(j = i/2; j >= 2; j--){             if(isPrime(j) && isPrime(i-j)){                printf("%2d = %2d + %2d\n",i,j,i-j);//输出                break;             }         }     }          return 0; }

user: user-2
content: 第一题   void test() {     int n,k,s;     for(n=11; n<100; n++)     {         k=(n%10)*(n/10);         s=n%10+n/10;         if(k>s)         {             printf("%d\n",n);         }     } }
user-0 提问: 单片机数码管显示万年历

回复:
user: user-1
content: 单片机也要说明是哪类的,万年历也要说明是否含农历.

user: user-2
content: 不会的时候，基础总要会的，上网找个别人做的例程，运行仿真，结合现象来看代码，理解一点后，尝试 修改代码仿真测试

user: user-0
content: proteus仿真和keil软件不会，

user: user-3
content: 1.设计个电路板，自己焊接一下。 2.业务逻辑，用单片机处理。 3.处理结果，送数码管显示出来即可。
user-0 提问: 求一元二次方程的解

回复:
user: user-1
content: 引用 2 楼 user-2 的回复:修改如下，供参考：#include <stdio.h> #include <math.h>  void Calculate(double a, double b, double c) {       double esp=pow(10,-6);//防止输出 -0.0000       if(a==0) return;       double m = b * b - 4 * a * c;       if (m == 0)       {           printf("该方程只有一个根:x=%.4f\n",(-b)/(a * 2)+esp);       }       if (m > 0)       {           printf("该方程有两个不同的实根\n");           double m0 = (-b + sqrt(m)) / (2 * a)+esp;           double n0 = (-b - sqrt(m)) / (2 * a)+esp;           printf("x1=%.4f x2=%.4f\n",m0,n0);       }       if (m < 0)       {           printf("该方程有两个不同的复数根\n");           if (b != 0)           {               double m1 = -b  / (2 * a)+esp;               double m2 = sqrt(-m) / (2 * a)+esp;               double n1 = -b  / (2 * a)+esp;               double n2 = - sqrt(-m) / (2 * a)+esp;               printf("x1=%.4f%c%.4fi x2=%.4f%c%.4fi\n",m1,(m2 > 0 ? '+' : '-'),fabs(m2),                                                        n1,(n2 > 0 ? '+' : '-'),fabs(n2));           }           else           {               double m3 = sqrt(-m) / (2 * a)+esp;               double n3 = -sqrt(-m)/ (2 * a)+esp;               printf("x1=%.4fi x2=%.4fi\n",m3,n3);           }       } }  int main() {       double a, b, c;        scanf("%lf%lf%lf",&a,&b,&c);       Calculate(a, b, c);              return 0; }  关于浮点数与0的比较，不能完全按照整型数与0直接进行比较；可以参考楼主的比较fabsf(m) < 1e-6（单精度），双精度:fabs(m) < 1e-16  https://blog.csdn.net/qq_40679299/article/details/79338570 https://www.cnblogs.com/youxin/p/3306136.html

user: user-2
content: 修改如下，供参考：#include <stdio.h> #include <math.h>  void Calculate(double a, double b, double c) {       double esp=pow(10,-6);//防止输出 -0.0000       if(a==0) return;       double m = b * b - 4 * a * c;       if (m == 0)       {           printf("该方程只有一个根:x=%.4f\n",(-b)/(a * 2)+esp);       }       if (m > 0)       {           printf("该方程有两个不同的实根\n");           double m0 = (-b + sqrt(m)) / (2 * a)+esp;           double n0 = (-b - sqrt(m)) / (2 * a)+esp;           printf("x1=%.4f x2=%.4f\n",m0,n0);       }       if (m < 0)       {           printf("该方程有两个不同的复数根\n");           if (b != 0)           {               double m1 = -b  / (2 * a)+esp;               double m2 = sqrt(-m) / (2 * a)+esp;               double n1 = -b  / (2 * a)+esp;               double n2 = - sqrt(-m) / (2 * a)+esp;               printf("x1=%.4f%c%.4fi x2=%.4f%c%.4fi\n",m1,(m2 > 0 ? '+' : '-'),fabs(m2),                                                        n1,(n2 > 0 ? '+' : '-'),fabs(n2));           }           else           {               double m3 = sqrt(-m) / (2 * a)+esp;               double n3 = -sqrt(-m)/ (2 * a)+esp;               printf("x1=%.4fi x2=%.4fi\n",m3,n3);           }       } }  int main() {       double a, b, c;        scanf("%lf%lf%lf",&a,&b,&c);       Calculate(a, b, c);              return 0; }
user-0 提问: c语言毕设看不太懂啊

回复:
user: user-1
content: 所有LED端口设置为推挽输出，且输出为低电平。

user: user-2
content: “将所有LED端口的模式设置为推拉模式，并将输出电平设置为低电平 ” 这是数模电相关的吧，
user-0 提问: 求大神解答一下

回复:
user: user-0
content: 非常感谢

user: user-1
content: 供参考：//输入十进制数，转换为 r进制 数输出。 #include<stdio.h> #include<string.h>  int n,r,count=0; void print( int x ) {      if( x <= 9 )          printf( "%d",x );      else          printf( "%c",x - 10 + 'A' );  } void change( int n,int r ) {      if( n )  //递归条件是：n/r != 0      {          change( n / r, r ); //递归调用          print( n % r );      }  } int main( ) {     scanf( "%d%d",&n,&r ) ;     change( n,r );    //递归函数          return 0; }

user: user-0
content: 引用 3 楼 自信男孩的回复:[quote=引用 2 楼 m0_58034981 的回复:]嗯，谢谢，同时请问一下chang(n / r,r)是什么意思 同样的道理嘛， n/r的结果给change的第一个形参n，r给第二个形参r，虽然是同名但是在内存中是相互独立的。[/quote] 非常感谢你。

user: user-2
content: 引用 2 楼 m0_58034981 的回复:嗯，谢谢，同时请问一下chang(n / r,r)是什么意思 同样的道理嘛， n/r的结果给change的第一个形参n，r给第二个形参r，虽然是同名但是在内存中是相互独立的。

user: user-0
content: 嗯，谢谢，同时请问一下chang(n / r,r)是什么意思

user: user-2
content: print( n % r );print是一个自定义函数，形参是int类型的，n%r就是把结果作为实参传递给形参；即n % r的结果赋值给x
user-0 提问: 为什么在 DLL 中 malloc() 的内存出现 access violation

回复:
user: user-0
content: 感谢各位的回复，经过了一段时间的尝试，我把这段代码挂到进程上去调试，最后找到问题的所在了，来此结帖，并感谢各位的热心回复。代码上各位看不出问题来，是因为有问题的地方其实没有体现出来，在第二个malloc()调用所处的文件中，我没有写 #include <stdlib.h>，我使用的编译器也没有报错 (C99 的话这里会报错)，导致了 malloc() 函数成为了隐式声明函数，隐式函数声明默认返回值是 int，所以返回值从 void* 被编译器改成了 int，机器现在都是 64 位的，指针的高 32 位地址由于返回值是 int 被截断，后续再尝试访问这个地址空间，肯定属于非法操作了，因此出现了 access violation。

user: user-0
content: 感谢各位的回复，经过了一段时间的尝试，我把这段代码挂到进程上去调试，最后找到问题的所在了，来此结帖，并感谢各位的热心回复。代码上各位看不出问题来，是因为有问题的地方其实没有体现出来，在第二个malloc()调用所处的文件中，我没有写 #include <stdlib.h>，我使用的编译器也没有报错 (C99 的话这里会报错)，导致了 malloc() 函数成为了隐式声明函数，隐式函数声明默认返回值是 int，所以返回值从 void* 被编译器改成了 int，机器现在都是 64 位的，指针的高 32 位地址由于返回值是 int 被截断，后续再尝试访问这个地址空间，肯定属于非法操作了，因此出现了 access violation。

user: user-1
content: 引用 7 楼 forever74 的回复:我觉得鼠侠的意思是，这段代码是在把油门当作刹车踩，因此不能以此为证据说明刹车有问题。 而我想刹车或许是好的，或许有问题，或许...好吧，我没见过那辆车。 是的。 而且单就已经公布的这部分代码来说，是没有任何问题的。毕竟你很难想象内存已经分配成功却无法用一个简单的表达式来访问，这是不可思议的。如果代码检查和调试的方法都已经用过了，那就试着从编写一个最简单的DLL，只包含以上功能（再添加一个释放内存的接口，在DLL中分配内存，也应该在DLL中释放，不然可能会出问题的），如果没有问题，再说。

user: user-2
content: 我一直觉得，论坛什么的只能解决领进门阶段的一些小问题，到了修行在个人的阶段，论坛就没啥用了。 四老师强调在入门阶段多锻炼调试，我想就是这个意思。

user: user-2
content: 我觉得鼠侠的意思是，这段代码是在把油门当作刹车踩，因此不能以此为证据说明刹车有问题。 而我想刹车或许是好的，或许有问题，或许...好吧，我没见过那辆车。

user: user-0
content: 引用 2 楼 赵4老师 的回复:C Run-Time Libraries https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx感谢回复，但是我感觉我这个问题和CRT没什么太大的关系，因为我在DLL的AMI_init()函数中也 malloc()了内存，都能正常访问，但是在AMI_Get()函数中的malloc()就不行了。

user: user-0
content: 引用 5 楼 均陵鼠侠 的回复:你给出的信息相对有限，而且程序也是错的，所以通常没有办法准确判断。 struct {     int data;     struct list* next; }list;   void init() {     struct list* n;     n = (struct list*)malloc(sizeof(struct list));     // access n->data caused memory access violation. } 就这，list 是一个变量，你确定 struct list 是合法的并且这段代码能通过编译？  感谢回复，抱歉造成疑惑，全部的代码很长，我怕误导大家，这是我自己随手写的一段主要的示意，我感觉上觉得和DLL被两次调用有关，第一次调用 AMI_Init()，第二次调用 AMI_Get()，但是似乎第二次调用和第一次调用之间的内存空间是两个导致越界无法访问。

user: user-1
content: 你给出的信息相对有限，而且程序也是错的，所以通常没有办法准确判断。 struct {     int data;     struct list* next; }list;   void init() {     struct list* n;     n = (struct list*)malloc(sizeof(struct list));     // access n->data caused memory access violation. } 就这，list 是一个变量，你确定 struct list 是合法的并且这段代码能通过编译？

user: user-0
content: 引用 1 楼 真相重于对错 的回复:调试，判断n是否为空？ 感谢回复，n 不为空，分配成功了，但是无法访问。

user: user-3
content: 调试，判断n是否为空？

user: user-4
content: C Run-Time Libraries https://msdn.microsoft.com/en-us/library/abx4dbyh.aspx
user-0 提问: const char *和char *的问题

回复:
user: user-1
content: const的作用用于限制该字符串在该函数内（比如strcmp）是不能被修改的，是只读的。  加了比不加更好，虽然不影响结果；比如自定义mystrcmp(char *s1, char *s2);这样自定义形参也是没问题的，从功能上考虑是比较，自然不需要修改s1, s2两个字符串；因此加上const更严谨；

user: user-0
content: 引用 1 楼 user-2 的回复：对，没错。 尤其是在一个人写代码的时候。  而在团队合作的环境下，函数原型里的一个const相比洋洋洒洒地用文字约定神马东西不能改就简洁多了，也明确多了。谢谢🙏

user: user-2
content: 对，没错。 尤其是在一个人写代码的时候。  而在团队合作的环境下，函数原型里的一个const相比洋洋洒洒地用文字约定神马东西不能改就简洁多了，也明确多了。
user-0 提问: 新手求助

回复:
user: user-1
content: main开始吧，既然是字符串，那么应该定义成char str[80];，形参也应该是char p[]; ， p[i]-'0'

user: user-2
content: 赵4老湿正在赶来的路上，但他不愿意回答这种简单问题，所以我代替他回答一下： # include <string.h>   int BinToDec (char p []) {     if (strlen (p) == 0) return 0;       return * p - '0' << strlen (p) - 1 | BinToDec (p + 1); } 我们采用了递归的方法，按照每个 0、1 的阶，将它移动到二进制数的指定位置，移完之后就是最终结果。

user: user-3
content: 可参https://bbs.csdn.net/topics/399167039
user-0 提问: C程里面这个看不懂了，求助！！！

回复:
user: user-1
content: clock() &(,<<8)比  (clock() >> 8) & 1更快吧.

user: user-2
content: clock()的返回值右移8位，然后最低位是不是1。这个返回值的第二个8位可能比较特殊；应该是多长时间会为1吧

user: user-3
content: The clock() function returns an approximation of processor time used by the program. The value returned is the CPU time used so far as a clock_t; to get the number of seconds used, divide by CLOCKS_PER_SEC.  If the processor time used is not available or its value cannot be represented, the function returns the value (clock_t) -1.  还有很多注意事项，建议搜索一下 clock 函数，你贴的这段函数应该是在循环代码块里边儿吧？轮循 clock 获取时间，满足条件就显示 _
user-0 提问: C语言两个数的最小公倍数

回复:
user: user-1
content: // 最大公约数 int greatest_common_divisor(int a, int b) {     if(b == 0) return a;     else return greatest_common_divisor(b, a % b); } // 最小公倍数 int least_common_multiple(int a, int b) {     return a * b / greatest_common_divisor(a, b); }

user: user-2
content: 供参考：#include <stdio.h>  int main() { 	int a,b; 	int yu; 	int m,n; 	printf("input two numbers:\n"); 	scanf("%d%d", &m, &n);     m>n?(a=m,b=n):(a=n,b=m); //大值放a，小值放b 	while (a%b != 0)//辗转相除法 ,得到最大公约数b 	{ 	      yu = a%b; 	      a = b;           b = yu;     } 	printf("最小公倍数为:%d\n",m*n/b);//最小公倍数=两数的乘积 ÷ 最大公约数          	return 0; }

user: user-0
content: 引用 1 楼 真相重于对错的回复:我去，先把基本语法搞清楚。 初学者，希望大佬可以指出

user: user-3
content: 我去，先把基本语法搞清楚。

user: user-4
content: ，望采纳，不懂的可以关注私信我。
user-0 提问: C入门代码

回复:
user: user-1
content: 引用#include<stdio.h> int main(){     int n[10];     int i;     int max = n[0];     printf("请输入10个数：");     for(int i = 0;i <= 10;++i)         scanf("%d",&n[i]);     for(int i = 0;i <= 10;++i)         max = n[i] > max ? n[i] : max;         printf("max = %d\n",max);     return 0; } for（）里对数组下标操作越界，应改为：for(int i=0; i<10 ;i++)

user: user-2
content: if(year % 4 == 0 && year % 100 != 0 || year % 400 == 0) 这句改一下： if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0) 逻辑更清晰一些～  #include<stdio.h> int main(){     int n[10];     //int i;     //int max = n[0]; //随机值，可能max也放不下的随机值     int max;      printf("请输入10个数：");     for(int i = 0;i <= 10;++i)         scanf("%d",&n[i]);     max = n[0]; //在这初始化     for(int i = 0;i <= 10;++i)         max = n[i] > max ? n[i] : max;     printf("max = %d\n",max);     return 0; } 供参考  max初始化有问题，可能导致程序结果异常；

user: user-0
content: 好的，谢谢
user-0 提问: 求解！！！

回复:
user: user-1
content: 你莫不是用了全角的小于号＜？

user: user-2
content: 没看出什么问题来。第一个else建议和后面的if写在一行。

user: user-3
content: 好像没啥问题，报错< 是非法的。望采纳，不懂的可以关注私信我。

user: user-4
content: ‘<'  是非法字符
user-0 提问: 【新手求助】二进制转十进制

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <locale.h> int main() {     int i,v;     char bs[33];     char b[33];     char hs[9];     char h[9];     char s[4];     char *e;  // 十进制整数转二进制串；     i=1024;     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("i=%d,bs=%s\n",i,bs); // 十进制整数转十六进制串；     i=1024;     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("i=%d,hs=%s\n",i,hs); // 十六进制字符串转成十进制数     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     printf("hs=%s,i=%d\n",hs,i); // 二进制字符串转化为十六进制字符串；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     ltoa(i,h,16);     sprintf(hs,"%08s",h);     printf("bs=%s,hs=%s\n",bs,hs); // 二进制字符串转化为十进制数；     strcpy(bs,"00000000000000000000010000000000");     i=strtol(bs,&e,2);     printf("bs=%s,i=%d\n",bs,i); // 十六进制字符串转成二进制串     strcpy(hs,"00000400");     sscanf(hs,"%x",&i);     ltoa(i,b,2);     sprintf(bs,"%032s",b);     printf("hs=%s,bs=%s\n",hs,bs); // ASC\GBK字符串转十六进制串     strcpy(s,"a汉");     i=0;     while (1) {         if (0==s[i]) break;         sprintf(hs+i*2,"%02X",(unsigned char)s[i]);         i++;     }     setlocale(LC_ALL,"chs");     printf("s=%s,hs=%s\n",s,hs); // 十六进制字符串转成汉字（GBK）及字符(ASC)     strcpy(hs,"61BABA");     i=0;     while (1) {         if (1!=sscanf(hs+i*2,"%2x",&v)) break;         s[i]=(char)v;         i++;     }     s[i]=0;     printf("hs=%s,s=%s\n",hs,s);      return 0;  } //i=1024,bs=00000000000000000000010000000000 //i=1024,hs=00000400 //hs=00000400,i=1024 //bs=00000000000000000000010000000000,hs=00000400 //bs=00000000000000000000010000000000,i=1024 //hs=00000400,bs=00000000000000000000010000000000 //s=a汉,hs=61BABA //hs=61BABA,s=a汉

user: user-2
content: #include <stdio.h>  int main() {     int remainder, number = 0, decimal_number = 0, temp = 1;     printf("\n Enter any binary number= ");     scanf("%d", &number);      // Iterate over the number until the end.     while (number > 0)     {         remainder = number % 10;         number = number / 10;         decimal_number += remainder * temp;         temp = temp * 2;  // used as power of 2     }      printf("%d\n", decimal_number); }    望采纳，不懂的可以关注私信我。

user: user-3
content: 可参https://bbs.csdn.net/topics/399167039

user: user-4
content: 供参考：#include<stdio.h>  int BinToDec(char p[]) {     int sum=0,i=0;     while(p[i]!='\0')     {         sum = sum*2 + p[i]-'0';         i++;     }     return sum;  }  int main() {     int  s;     char str[80];     printf("Enter only 0,1 string:");     scanf("%s",str);     s=BinToDec(str);     printf("Bin=%s<=>Dec=%d\n",str,s);          return 0; }
user-0 提问: 求助

回复:
user: user-1
content: return new int[]{i,j}; 返回的是 函数指针，return new int[2]; 返回的是函数，望采纳，不懂的可以关注私信我。

user: user-2
content: 实事求是地说，在这个版块内，这个问题还得赵老湿来。你@赵老湿。

user: user-3
content: public int[]  这是C++的语法吧，C语言没有public关键字；  int []这样作为返回值类型不常见，常见的是int *返回指针。从函数实现的返回值来看就是这样的，返回的是指针（地址值）  #include <stdio.h> int main() {     int num[10]={2,9,17,21,35,99,333,128,101,121,};      int i,j;     for(i=0;i<=9;i++)     {         for(j=0;j<=9;j++)         {             if(i != j && num[i]+num[j]==120)             {                 printf("%d %d ",i,j);                 //i=100;  //这里赋值会导致数组越界，因为第二层循环可能还没结束，if (num[i]这里就会出现数组越界了；                 break;             }         }         if (j <= 9)     //继续跳出循环             break;     } } 供参考～  代码有点问题修复一下，如上；

user: user-0
content: 另贴出我自己写的： #include <stdio.h> int main() { 	int num[10]={2,9,17,21,35,99,333,128,101,121,}; 	int i,j; 	for(i=0;i<=9;i++) 	{ 		for(j=0;j<=9;j++) 		{ 			if(num[i]+num[j]==120) 			{ 				printf("%d %d ",i,j); 				i=100; 			} 		} 	}  }
user-0 提问: 大佬，救命

回复:
user: user-1
content: 希望对您有帮助，盼采纳：https://blog.csdn.net/it_xiangqiang/category_10581430.html

user: user-2
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-3
content: 大学应该有课本吧，建议先把课程里的学习了再考虑扩展性的学习。
user-0 提问: 各路大神，帮帮孩子吧( •︠ˍ•︡ )

回复:
user: user-1
content: 希望对您有帮助，盼采纳：https://blog.csdn.net/it_xiangqiang/category_10581430.html

user: user-2
content: C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817

user: user-3
content: <<linux C prime plus>>可以找找，或者买一本～
user-0 提问: 求助，急需帮助，纯C语言

回复:
user: user-0
content: 引用 3 楼 自信男孩的回复:[quote=引用 2 楼 weixin_52677262 的回复:][quote=引用 1 楼 自信男孩的回复:]为什么不自己先试试呢？需求这么详细，总能自己写一个功能吧。 我当然写了几个功能[/quote] 那你只把需求发出来，你的代码一条也不贴。你是想让大家帮你写全，调试完，测试完，没问题的？还是其他要求？  需求不明确。  [/quote] 明白了，下次发问题时会写清楚需求

user: user-1
content: 希望对您有帮助，盼采纳：https://blog.csdn.net/it_xiangqiang/category_10581430.html

user: user-2
content: 引用 2 楼 weixin_52677262 的回复:[quote=引用 1 楼 自信男孩的回复:]为什么不自己先试试呢？需求这么详细，总能自己写一个功能吧。 我当然写了几个功能[/quote] 那你只把需求发出来，你的代码一条也不贴。你是想让大家帮你写全，调试完，测试完，没问题的？还是其他要求？  需求不明确。

user: user-0
content: 引用 1 楼 自信男孩的回复:为什么不自己先试试呢？需求这么详细，总能自己写一个功能吧。 我当然写了几个功能

user: user-2
content: 为什么不自己先试试呢？需求这么详细，总能自己写一个功能吧。
user-0 提问: 文件读取问题

回复:
user: user-0
content: 行吧，我在理解理解，谢谢你

user: user-1
content: 你还是没理解，有没有EOF字符不重要，指不指向EOF字符不重要，feof都不会因此而为真。 feof为真的理由只有一个，那就是刚才有别的函数曾经撞上文件尾，撞是个动词，生动表达了某函数企图跨越文件尾读取数据然而失败了的过程。  四老师给出的解决方案是 while(1) { fgets(...); if(feof(p))break; others... ... } ...

user: user-0
content: 谢谢耐心解答，我想问一下能将文件内容想成asd\nEOF吗，刚开始文件指针指向a，每读入一个字符往后移一位，如果这样的话，那第一次循环结束p不就是指向EOF吗，第二次循环判断feof返回1跳出循环

user: user-1
content: 函数又没长眼睛，它没法在撞到文件末尾之前就知道前方是文件末尾。 你的循环执行第一次，没到结尾，读入第一行，去掉末字符（当时是换行）剩下正常字符在str里面。 循环第二次，没撞上过文件尾，因此条件为真，进入循环体。fgets读取新行失败，有两个后果，第一是撞过了文件尾，下次feof会返回真；第二是str没有更新，还是原来的内容。接下去去掉末字符，按你的说法的话这时去掉的是'd'。文件指针说的是读取位置吧，它没有返回开头，还在末尾呢。 循环条件第三次，这次因为feof为真，所以循环条件为假，跳过循环。 综上。 这样写的代码总会在最后是空行的时候出问题，建议参考四老师在其他帖子的回复进行修改。
user-0 提问: c语言自定义输入一个数组，循环打出后数组改变了

回复:
user: user-1
content: 引用 3 楼 qq_34918605 的回复:[quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h>  int main() {     //int j = 1;     int j = 0;     int  arr[100] = { 0 };      printf("请输入你需要输入的数据 回车结束");     for (int i = 0; i < 100&&getchar()!='\n'; i++)     {         scanf("%d", &arr[i]);         j++;     }      for (int i = 0; i < j; i++)     {         printf("%d\n", arr[i]);     }      return 0; } 有什么办法解决前面应为getchar吞的元素从而直接输入数字，而且循环输出后莫名多了一个0 元素， 多以个0，已经给你解释了，因为j=1从1开始就出现，从0开始就没问题了。  解决getchar吞的问题，可以考虑用我下面的例子。

user: user-0
content: [quote=引用 2 楼 自信男孩 的回复:]#include <stdio.h>  int main() {     //int j = 1;     int j = 0, ret;     int  arr[100] = { 0 };      printf("请输入你需要输入的数据 回车结束");     for (int i = 0; i < 100; i++)     {         if ((ret = scanf("%d", &arr[i])) != 1)                 break;         j++;     }      for (int i = 0; i < j; i++)     {         printf("%d\n", arr[i]);     }      return 0; } 还是出现问题 直接打出了后面的空空间

user: user-0
content: [quote=引用 1 楼 自信男孩 的回复:]#include <stdio.h>  int main() {     //int j = 1;     int j = 0;     int  arr[100] = { 0 };      printf("请输入你需要输入的数据 回车结束");     for (int i = 0; i < 100&&getchar()!='\n'; i++)     {         scanf("%d", &arr[i]);         j++;     }      for (int i = 0; i < j; i++)     {         printf("%d\n", arr[i]);     }      return 0; } 有什么办法解决前面应为getchar吞的元素从而直接输入数字，而且循环输出后莫名多了一个0 元素，

user: user-1
content: #include <stdio.h>  int main() {     //int j = 1;     int j = 0, ret;     int  arr[100] = { 0 };      printf("请输入你需要输入的数据 回车结束");     for (int i = 0; i < 100; i++)     {         if ((ret = scanf("%d", &arr[i])) != 1)                 break;         j++;     }      for (int i = 0; i < j; i++)     {         printf("%d\n", arr[i]);     }      return 0; } 供参考～  退出输入使用ctrl+d(LINUX）或ctrl+z（Windows）

user: user-1
content: #include <stdio.h>  int main() {     //int j = 1;     int j = 0;     int  arr[100] = { 0 };      printf("请输入你需要输入的数据 回车结束");     for (int i = 0; i < 100&&getchar()!='\n'; i++)     {         scanf("%d", &arr[i]);         j++;     }      for (int i = 0; i < j; i++)     {         printf("%d\n", arr[i]);     }      return 0; } 供参考～  输入时需要注意下，在输入第一个数字之前先输入一个空格，用于匹配getchar();根据循环的执行顺序，首先执行int i=0;然后不是执行循环体，而是判断i < 100 && getchar() !='\n'，如果满足才会执行循环体。所以，如果输入的第一个字符是数字，那么这个数字的第一个数字就会被getchar()接收；  因此需要注意下，另外j应该从0开始。否则后面printf会多打印一个，甚至会导致越界，比如输入了100个，j=101；i<j，那么i=100是满足的，但是数组已经越界了。
user-0 提问: 实现pow()函数的源代码

回复:
user: user-1
content: 注意 pow 可以传入小数  比如 pow(100.0, 0.5); 表示 √100

user: user-2
content: 1.你定义的变量全是整型无法接受到你想要的小数。 2.如果想用小数来表示开根号的运算那么你现在的算法公式也是错误的。

user: user-0
content: 引用 5 楼 lin5161678的回复:注意 pow 可以传入小数  比如 pow(100.0, 0.5); 表示 √100 你好，我的代码运行传入小数，但运行的结果不正确，请问可以解惑吗？

user: user-3
content: 希望对您有帮助，盼采纳：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-4
content: 幂参数y可作已初始化的临时局部变量, 减少额外变量, 代码更紧凑: int pow(int x, int y) { 	int z; 	for (z = 1; y > 0; --y) 		z *= x; 	return z; }

user: user-0
content: 引用 1 楼 自信男孩的回复:注意x, y接收的实参值可能会导致z溢出。需要考虑溢出的情况～比如10^15，int类型数据无法装的下～ 嗯嗯好的，谢谢哈

user: user-5
content: 注意x, y接收的实参值可能会导致z溢出。需要考虑溢出的情况～比如10^15，int类型数据无法装的下～
user-0 提问: 这个地方哪里错误了，求大佬指点

回复:
user: user-1
content: if这行少一个右括号，需要注意一下

user: user-2
content: 引用 13 楼 赵4老师 的回复://是注释 ||才是或 楼主脖子歪了还是眼睛斜了或者楼主所处位置地心引力方向不是严格向下？  正解！

user: user-3
content: if((year -> if(year)

user: user-4
content: 想复杂了，后来又忘记了。不少人编程时都是这样子的。 一个Bug坑一天，找到后发现什么也没干，就崩溃了。

user: user-5
content: if 左边多一个（

user: user-6
content: 学代码要看注释啊，下面都说了（)的问题。

user: user-7
content: 第7行没错， 第6行错了，   if 语句的条件，多了一个左括号 ‘(‘ ， 删除一个 左括号即可。

user: user-8
content: 啊这个。。。。

user: user-9
content: 左括号和右括号数量不一样。。。

user: user-0
content: 引用 11 楼 qq_45773596的回复:[quote=引用 2 楼 赵4老师的回复:]前一句if后多一个（ 不是的if()     中间//是或，所以两个语句在()内。不是这个问题，我看了[/quote] 难道我的思路有问题吗，我再试试

user: user-0
content: 引用 2 楼 赵4老师的回复:前一句if后多一个（ 不是的if()     中间//是或，所以两个语句在()内。不是这个问题，我看了

user: user-10
content: 借楼，发一个小玩意儿。GNU C 扩展的功能，详情参见：https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Statement-Exprs.html # include <stdio.h>  int main (void) {     printf ("%d\n", ({int n = 1, sum = 0;                       for (; n <= 100;) sum += n ++;                       sum;})); }

user: user-0
content: 引用 2 楼 赵4老师的回复:前一句if后多一个（ 这个没问题，你再看看

user: user-0
content: 我看了，不是

user: user-11
content: 第6行，多了一个左括号

user: user-12
content: 说句重一点的话，你在代码的规范性上做的很差。按照规范你再写一遍代码，肯定就没问题。

user: user-10
content: 好象不够复杂，再合并一下。请用 GCC 编译运行。 # include <stdio.h>  int main (void) {     printf (({int year; scanf ("%d", & year); year % 400 == 0 ? "yes.\n" : "no.\n";})); }

user: user-10
content: 赵4老湿有理有据。建议用下面这段代码测试一下，如果能用 GNU C 一次性编译执行而没有问题，说明是个细心的银。 # include <stdio.h>  int main (void) {     int year;      printf (({scanf ("%d", & year); year % 400 == 0 ? "yes.\n" : "no.\n";})); }

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

user: user-2
content: //是注释 ||才是或 楼主脖子歪了还是眼睛斜了或者楼主所处位置地心引力方向不是严格向下？
user-0 提问: 关于单链表删除指定位置结点的问题

回复:
user: user-1
content: 这个代码删除除头结点外的节点是没问题的。但是如果删除头结点，这个就会有问题，需要额外处理一下～

user: user-2
content: 这个没问题：int ListDelete(LinkList *L,int i,ElemType *e) {     int j;     LinkList p,q;     p = *L;     j = 1;     while (p->next && j < i)     {         p = p->next;         ++j;     }     if (!(p->next) || j > i) return 0;     q = p->next;  //q指向i=3结点的头部     p->next = q->next; // p->next 指向i=3结点的尾部，即i=4结点的头部，                        //等同于 p->next = p->next->next,把i=2结点的尾部指针指向i=4结点的头部     *e = q->data;     free(q);   //释放q     return 1; }

user: user-3
content: 这里面有， 希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html。
user-0 提问: C语言程序设计题，帮帮忙。

回复:
user: user-1
content: 希望对您有帮助，盼采纳：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 调用prime函数求大于m的10最小素数之和？这题目没看懂呢。

user: user-0
content: 引用 1 楼 qzjhjxj的回复:调用prime函数求大于m的10最小素数之和？这题目没看懂呢。 10个最小素数之和

user: user-2
content: 供参考：#include<stdio.h>  int isPrime(int n) {     int i;     if(n<=3) return n>1;     for(i=2;i*i<=n;i++)         if(n%i==0)return 0;     return 1; }  int main() {     int m,i,j=0,sum=0;     scanf("%d",&m);     for(i=m+1;;i++){         if(isPrime(i)){            sum += i;            if(++j==10)break;         }     }     printf("sum=%d\n",sum);         return 0; }

user: user-3
content: 英语没有量词嘛。 求大于m的10个最小素数之和。

user: user-4
content: 判断质数可参
user-0 提问: 为什么第二个i++没有进行加1，而是直接等于上一个i++后的值?

回复:
user: user-1
content: 问题的根源是很多人没意识到，表达式是有值的，在一个大的表达式中，运算符操作的是子表达式的值。如果需要，任何表达式都有一个值，即使是 void 表达式，也会有一个（空）值。  表达式 i ++ 的值是左值 i 递增前的原值，同时，这个表达式还有一个将 i 的存储值加一的副作用。因此， x = i ++; 是将表达式 i ++ 的值赋给 x （同时 i 的存储值递增）。传统的解释是将 i 的值赋给 x ，然后 i 再递增，但它无法从逻辑上解释，i 是和 ++ 结合的，它凭什么，有什么义务要把自己的值赋给左边的 x 呢？毕竟，赋值运算符的右操作数是 i ++ 而不是 i  。  表达式 ++ i 的值是左值 i 递增后的新值，同时，这个表达式还有一个将 i 的存储值加一的副作用。因此， x =++ i; 是将表达式 ++ i 的值赋给 x （同时 i 的存储值递增）。传统的解释是先递增 i ，再把 i 赋给 x，但它同样无法从逻辑上解释，i 是和 ++ 结合的，它的义务是按照 ++ 的要求完成递增，它凭什么，有什么义务要把递增后的值赋给左边的 x 呢？毕竟，赋值运算符的右操作数是 ++ i 而不是 i  。

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

user: user-3
content: 因为s1[i++]是先以i++为整体的值作为s1的下表，然后在改变i的值，原因是这儿的自增是后增，如果是++i就是相反的。
user-0 提问: 求助：C语言程序在Linux系统下可以运行，在Windows系统里没有报错却无法运行该怎么解决

回复:
user: user-0
content: 引用 2 楼 it_xiangqiang的回复:希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 好的好的，我学习一下，谢谢你

user: user-0
content: 在windows下把路径改了，但是没有用，应该是null的问题，我上机试试，谢谢你

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

user: user-2
content: /home/cbp/score.c这个在windows有这个路径和文件吗？  if((fd = fopen("/home/cbp/score.c", "rw" ))<0){ perror("open:"); exit(1); } 这个有问题呢，fd应该是和NULL比较。 原因是这个地方没有执行到exit，其实是因为找不到文件fd是NULL了，但是NULL < 0又不满足，所以没有exit，后面直接用fd出现段错误了。  解决办法：  if((fd = fopen("/home/cbp/score.c", "rw" ))==  NULL){ perror("open:"); exit(1); } 在Windows下试试，看看能不能直接运行perror和exit（windows下没有/home/目录）  楼主需要了解windows 和LINUX系统的区别，不能拿到代码就用，因为会有移植的问题～
user-0 提问: 求100以内的素数

回复:
user: user-1
content: 修正11#楼的第19行：if(n%i==0) return 0;

user: user-0
content: 引用 9 楼 智者知已应修善业的回复:２楼的文字点击即可达例子，查看例子中代码。 好的，了解了，谢谢哈

user: user-1
content: 供参考：//方法1：  int f(int n) {     int i;     if(n<=1) return 0;     for(i=2;i<n;i++)         if(n%i==0) break;     if(i<n) return 0;     else    return 1; }  //方法2： int f(int n) {     int i;     if(n<=3) return n>1;     for(i=2;i*i<n;i++)         if(n%i==0) retrun 0;     return 1; }

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

user: user-3
content: ２楼的文字点击即可达例子，查看例子中代码。

user: user-3
content: 在２楼判断质数可参就是链接地址，难道这都不知？

user: user-0
content: 提供的网址？

user: user-0
content: 引用 5 楼 智者知已应修善业的回复:按提供的网址例子修改即可。 提供的网址？

user: user-3
content: 按提供的网址例子修改即可。

user: user-4
content: 函数f有问题呢，你的if (i < n)和else都应该放在循环外呢，而不是应该是循环内。  if (i < n) y=0; else y = 1; 这几条语句放到循环外应该就是没问题了。试试～

user: user-0
content: 引用 2 楼 智者知已应修善业的回复:判断质数可参 大神，请问有修改方案吗

user: user-3
content: 判断质数可参

user: user-3
content: 不用看，准是判断质数有问题。
user-0 提问: 这道题，中间那里出错了。运行没问题，输出错误

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

user: user-2
content: 程序没看出什么问题，输出是什么错误？输入又是什么内容，这些建议都贴出来吧。
user-0 提问: 求助 大一C语言课程设计

回复:
user: user-1
content: 引用 4 楼 weixin_52677262 的回复:[quote=引用 2 楼 it_xiangqiang的回复:] 希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 咋还要付钱[/quote] 你认为呢？这是推销个人付费博客的，几乎每个帖子都发，谁付钱给谁看，csdn也推荐这个很无语；

user: user-0
content: 引用 2 楼 it_xiangqiang的回复:希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 咋还要付钱🐶

user: user-0
content: 引用 2 楼 it_xiangqiang的回复:希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 咋还要付钱，而且没看见有什么与我的问题相关的啊😂

user: user-2
content: 希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html
user-0 提问: 大佬们，我这个哪里出问题了，我是个新手。

回复:
user: user-1
content: 计算机代码不允许使用中文符号

user: user-1
content: #include<stdio.h> int main(void) { 	int a=2,b=3; 	a=a+b; 	b=a-b; 	a=a-b; 	printf("%d,%d\n",a,b); 	return 0; } 注意细节问题，把结构背清楚 而且你这个运算意义不大，可以尝试四则运算

user: user-1
content: 好歹发一下源码啊！

user: user-2
content: 注意中英文和单词拼写错误～这是最基本的语法问题～

user: user-3
content: 这个教程适合你，希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html

user: user-0
content: 哪里错了呀，是空格还是啥出问题了

user: user-4
content: 是  printf  不是 prirtf        另外怀疑你的 " " 用的是中文字符， 关闭输入法

user: user-5
content: 第四行mint ,多打了m 呀，int a=2,b=3;
user-0 提问: 返回值是什么?为什么?

回复:
user: user-1
content: 忽视了, 应该设置变量保存初始地址

user: user-2
content: 引用 3 楼 aguang 的回复:char *mystrcpy(char *s,const char *t) { 	while (*s++=*t++); 	*s='\0'; 	return s; } 返回字符串末尾地址？

user: user-2
content: 返回值是目的串的地址，这个函数用于字符串拷贝，将源串拷贝到目的串（那个参数是目的串地址可以自由指定），可以通过两种方式获取目的串的地址，一个是参数，再一个就是这个返回值。  楼主写的不对，应该返回s1。另外，既然是所有都拷贝，因此，不需要用两个循环变量，用一个即可，或者一个也不用，如下供参考～  char *mystrcpy(char *dst, const char *src) {     char *tmp = dst;      while (*src)         *dst++ = *src++;     *dst = 0; //'\0'      return tmp; }

user: user-1
content: char *mystrcpy(char *s,const char *t) { 	while (*s++=*t++); 	*s='\0'; 	return s; }

user: user-3
content: 函数需要返回的是数组s1的第一个元素的指针，相当于返回&s1[0]，楼主的函数返回的是  return s2; ,  修改如下，供参考：char *mystrcpy(char *s1,char *s2) {     int i=0;     for(i=0;s2[i];i++)         s1[i] = s2[i];     s1[i] = '\0';     return s1;//返回的是s1的首地址 }

user: user-1
content: 根据C语言定义, 对于 'T s[常量表达式]' 即s是T类型的数组;   表达式s的值是指向数组中第1个对象的指针(表达式&/ziseof情形除外). 所以s的值是一个地址,而且 *s==s[0]

user: user-4
content: 这里面有，希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html
user-0 提问: 求帮助

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

user: user-2
content: scanf是一种方式输入，printf是一种方式输出，fprintf是不是也算一种  fgets，fputs也算一种输入输出？
user-0 提问: 不太清楚哪里错了，一直显示错误(๑´0`๑)

回复:
user: user-1
content: 这里面有，希望对您有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

user: user-2
content: 方法多 #include <stdio.h> int main() {   int n, b=0,s=0;   for (; (n=getchar())&&n!='\n'; b++, s += n-'0')   printf("%d %d\n", b, s);   return 0; } #include <stdio.h> int main (void) {     int a=0,b=0,c;     scanf("%d",&c);     for(;c>0;a++,b+=c%10,c/=10);     printf("%d %d",a,b); }

user: user-3
content: 引用 4 楼 早打大打打核战争 的回复:思路决定代码：  #include <stdio.h>  int main() {   int n, b, s;    for (b = s = 0; ~scanf("%1d", &n); b++, s += n);   printf("%d %d\n", b, s);    return 0; }  还需要提醒一句吧，怎么输出结果（终止循环）  ctrl+d(linux)或ctrl+z（Windows）

user: user-4
content: 思路决定代码：  #include <stdio.h>  int main() {   int n, b, s;    for (b = s = 0; ~scanf("%1d", &n); b++, s += n);   printf("%d %d\n", b, s);    return 0; }

user: user-5
content: 修改如下，供参考：#include<stdio.h>  int main()  {     int n,i=0,x=0,y;      scanf("%d",&n);      if(n<=1000000000&&n!=0)      {        while(n)//for(i=1;i<=9;i++)          {            y=n%10;            x+=y;            n=n/10;            i++;            //if(n==0)                          //    break;                          // else                          // i++;         }     printf("%d %d",i,x);    }          return 0; }

user: user-3
content: #include<stdio.h> #include <ctype.h> int main(void) {  #if 1     char digit[128], *pstr;     int cnt = 0, sum = 0;      fgets(digit, sizeof(digit), stdin);      if (digit[0] == '-') {         printf("Error input!\n");         return -1;     }     pstr = digit;     while (*pstr) {         if (isdigit(*pstr)) {             sum += *pstr - '0';             cnt++;         }         pstr++;     }      printf("%d %d\n", cnt, sum); #else     int n,i,x=0,y;      scanf("%d",&n);      if(n<=1000000000&&n!=0)     {         for(i=1;i<=9;i++)          {             n=n/10;             y=n%10;             x+=y;             if(n==0)                 break;             else                 i++;         }         printf("%d %d",i,x);     } #endif     return 0;  } 供参考～

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

回复:
user: user-1
content: 所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。http://bbs.csdn.net/topics/391975224
user-0 提问: 引发了未经处理的异常:读取访问权限冲突。 q 是 0xCCCCCCCC，求大佬解答

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  typedef int Elemtype; typedef struct link {     int elem;     struct  link* next; }link;  link * initLink() {     link *p = (link *)malloc(sizeof(link));//创建一个头结点     if (!p)         exit(0);     link* temp = p;//声明一个指针指向头结点，用于遍历链表     //生成链表     for (int i = 1; i < 5; i++) {         link* a = (link*)malloc(sizeof(link));         if (!a)             exit(0);         a->elem = i;         a->next = NULL;         temp->next = a;         temp = temp->next;     }      return p; } //void bianli(link* p) void bianli(link* phead) {     if (!phead)         return;     //link* q = phead;     link* q = phead->next;      //while (q->next)     while (q)     {         //q = q->next;         printf("%d",q->elem);         q = q->next;     }     printf("\n"); }  int main() {     link* p = initLink();     //bianli(&p); //visit     bianli(p); //visit      return 0; } 供参考～  参数类型不匹配，其他问题详见代码～

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

user: user-3
content: 供参考：#include<stdio.h> #include<stdlib.h> typedef int Elemtype;  typedef struct link {     int     elem;     struct  link* next; }link;  link * initLink() {     link* p = (link*)malloc(sizeof(link));//创建一个头结点     link* temp = p;//声明一个指针指向头结点，用于遍历链表      //生成链表     for (int i = 1; i < 5; i++) {          link* a = (link*)malloc(sizeof(link));          a->elem = i;          a->next = NULL;          temp->next = a;          temp = a; //  temp = temp->next;     }     return p; } void bianli(link* p) {     link* q = p;     while (q->next)     {           q = q->next;           printf("%d ",q->elem);     }     printf("\n"); }   int main() {     link* p = initLink();     bianli(p);           //bianli(&p);          return 0; }

user: user-0
content: 111求解啊
user-0 提问: c语言  表达式中连续多次自增运算相加为什么表达式会自加1

回复:
user: user-1
content: 求值顺序未定义，编译器可以自行决定，甚至同一编译器不同选项的情况下可以有不同的结果，第一个表达式，5+6+7、 6+6+7、7+7+7都有可能

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

user: user-3
content: 当着出这个题目的人面骂他是傻X。然后扔一份C++的标准到他脸上让他自己看
user-0 提问: 求助帖 这道C语言不知道错哪了

回复:
user: user-1
content: 小白写的，可以参考   #include<stdio.h>  int main() { 	const int length = 9; 	int numbers[length] = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };  	for (int i = 0; i < 9; i++) 	{ 		printf("%d ", numbers[i]); 	} 	printf("\n");  	printf("要移动的次数："); 	int moveCounts; 	scanf_s("%d", &moveCounts);  	int temp; 	for (int i = 0; i < moveCounts; i++) 	{ 		temp = numbers[length - 1]; 		for (int j = length - 1; j > 0; j--) 		{ 			numbers[j] = numbers[j - 1]; 		} 		numbers[0] = temp; 	}  	for (int i = 0; i < length; i++) 	{ 		printf("%d ", numbers[i]); 	}  	return 0; }

user: user-2
content: 把a[j]=b[9-i]下一行的k++改成j++

user: user-3
content: 供参考：#include<stdio.h> #define N 9 int main() {     int i,j,n,m;     int a[N]={12,54,85,39,51,76,90,14,20};     printf("请输入要移动的位数:");     scanf("%d",&n);     for(i=0;i<n;i++){         for(j=N-1,m=a[j];j>0;j--){             a[j] = a[j-1];         }         a[j]=m;     }     for(i=0;i<N;i++){         printf("%d ",a[i]);     }     printf("\n");          return 0; }