Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 大佬看看我，第一次写数据结构，有输入，没输出，不知道哪里错了

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> typedef struct list {     int data;     struct list *next; }link;  void initlist(link *&l,int a[],int n) {     link *p, *tail;//=l;     l = (link*)malloc(sizeof(link));     tail = p = l;     for(int i=0;i<n;i++)     {         p = (link *)malloc(sizeof(link));         if (!p)             exit(0);         p->data = a[i];         tail->next = p;         tail = p;     }     tail->next = NULL; }  int listempty(link *l) {     //return (l->next==NULL);     return (l->next==NULL); }//判断是否是空表 int listlength(link *l) {     int n=0;     link *p=l;     while(p->next!=NULL)     {         n++;         p=p->next;     }     return (n); }//求线性表的长度 void displist(link *l) {     link *p=l->next;     while(p!=NULL)     {         printf("%d",p->data);         p=p->next;     }     printf("\n"); }//输出线性表 int main() {     int n;     scanf("%d",&n);     link *l;     //int a[n];     int *a = (int *)malloc(sizeof(int) * n);     for(int i=0;i<n;i++)     {         scanf("%d",&a[i]);     }     initlist(l,a,n);     listempty(l);     printf("%d\n",listlength(l));     displist(l);     return 0; } 供参考～ 链表创建有问题，建议对比代码找一下自己的问题～

user: user-2
content: 学会单步调试。
user-0 提问: 请问为static 指针ar的分配内存是否被释放？

回复:
user: user-1
content: static没什么必要性，这里有没有不影响正确性。

user: user-0
content: 刚才查c primer plus 里面讲的比较明确，free 释放可以不是malloc 申请内存是的指针变量，只要free的参数指针是申请时的地址即可。然后做了猜想系统记录了malloc申请的地址及大小信息，刚刚又在网上找到一段话也验证了自己的猜想，“为什么可以正确的释放正确大小的地址，有的编译器会这样操作，malloc会在首地址前8个字节的高4存放page id,低4存放size，free可以从这里取到dao存的大小，依赖编译器的不同实现方法不同，仅供你参考。 ” 另外上面的程序 可以不用static 修饰，也可以正确执行。如果在test中用数组，必须使用static，但是static又不支持变长数组。这时候必须使用指针来分配内存的方式实现。

user: user-2
content: 程序运行期间不会释放，也就是它指代的地址不会再变了，内容可能会变，但指代的地址不会变

user: user-3
content: 楼主用static定义的是arr指针变量，这只是说明指针变量不会随着函数调用结束而释放，应arr变量是在数据段申请的，它的生命周期是从定义开始知道程序退出。但是这和malloc没关系哦。这个指针指向的内容是可以变化的。

user: user-4
content: 已经被释放了，你可以输出其内容看一下 #include <stdio.h> #include <malloc.h> int *test(int); int main() {    int *p = NULL;    int *d = NULL;    int b = 5;    printf("\n%d %d\n",d,p);    scanf("%d", &b);    d = p = test(b);    for (int i = 0; i < b; i++){       printf("%d ", *(p));    }    printf("\n%d %d %d %d\n",d,p,*d,*p);    free(d);    printf("\n%d %d %d %d\n",d,p,*d,*p);    return 0; }  int *test(int b) {    static int *ar;    ar = (int *)malloc(sizeof(int) * b);    for (int i = 0; i < b; i++)       ar[i] = i;    printf("%d %d\n",ar,*ar);    return ar; }   结果如下： 0 0 3 42604304 0 0 0 0 42604304 42604304 0 0  42604304 42604304 42603968 42603968

user: user-5
content: 引用 楼主 学码就是爱好 的回复:请问为static 指针ar的分配内存是否被释放？ #include <stdio.h> #include <malloc.h> int *test(int); int main() {     int *p=NULL;     int *d=NULL;     int b=5;     scanf("%d",&b);     d=p=test(b);     for(int i=0;i<b;i++)     printf("%d ",*p++);     free(d);     return 0; }  int *test(int b) {    static int *ar;    ar=(int *)malloc(sizeof(int)*b);     for(int i=0;i<b;i++)         ar[i]=i;     return ar; }  你在main中的free就是释放，虽然是在test函数中malloc，没毛病

user: user-6
content: 调试一下, 我觉得是被释放了..因为三个指针都是指向的都是同一个区域.

user: user-7
content: 会 main的d和test的ar指向同一块内存，释放d就等于释放ar

user: user-0
content: 引用 7 楼 自信男孩 的回复:楼主用static定义的是arr指针变量，这只是说明指针变量不会随着函数调用结束而释放，应arr变量是在数据段申请的，它的生命周期是从定义开始知道程序退出。但是这和malloc没关系哦。这个指针指向的内容是可以变化的。 提问时没主意static的必要性，后面我自己跟的帖子已经对相关问题进行了说明，另外关于释放也做了解释，c primer plus 的内容提问时还没看到，后来发现书上描写的很明确。不过还是感谢答疑
user-0 提问: VS2017显示触发一个断点，但并没有任何其他提示

回复:
user: user-0
content: 引用 3 楼 自信男孩的回复:conver *node = (conver *)malloc(sizeof(node)); 这儿的node指向的内容申请的空间长度是sizeof(conver *);改成这样：  conver *node = (conver *)malloc(sizeof(*node)); 但是不建议这样写，因为不很容易理解，不能一眼看出，可以改成这样  conver *node = (conver *)malloc(sizeof(conver)); 谢谢大佬

user: user-0
content: 引用 2 楼 user-2的回复:改成 covert *node = (covert*)malloc(sizeof(conver));  node是个指针，sizeof(node)只有4个字节（64位系统是8个字节），convert是个结构体，sizeof(convert)有8+4（或8）=12（或16）个字节。 显然，申请内存空间不足，就可能造成内存非法访问。 那为什么前面的那个main函数里的malloc没有出错呢

user: user-1
content: conver *node = (conver *)malloc(sizeof(node)); 这儿的node指向的内容申请的空间长度是sizeof(conver *);改成这样：  conver *node = (conver *)malloc(sizeof(*node)); 但是不建议这样写，因为不很容易理解，不能一眼看出，可以改成这样  conver *node = (conver *)malloc(sizeof(conver));

user: user-0
content: 引用 6 楼 user-2的回复:[quote=引用 4 楼 MancoCL 的回复:][quote=引用 2 楼 user-2的回复:]改成 covert *node = (covert*)malloc(sizeof(conver));  node是个指针，sizeof(node)只有4个字节（64位系统是8个字节），convert是个结构体，sizeof(convert)有8+4（或8）=12（或16）个字节。 显然，申请内存空间不足，就可能造成内存非法访问。 那为什么前面的那个main函数里的malloc没有出错呢[/quote] 我之所以用了可能这个词，就是说它未必就会运行出错，但一定是危险行为。指针指向的内存空间不够，就好比 数组越界 一样，越界出去的内存操作，会带来什么影响是不确定的，如果越界出去的内存是不允许读写的，就会造成非法访问；即使是可读写的，也会造成该内存的数据破话（不是你自己的东西你却修改了），这样是非常危险的。所以要按照正确的使用大小来分配内存。 [/quote] 明白了，谢谢大佬啊

user: user-2
content: 引用 4 楼 MancoCL 的回复:[quote=引用 2 楼 user-2的回复:]改成 covert *node = (covert*)malloc(sizeof(conver));  node是个指针，sizeof(node)只有4个字节（64位系统是8个字节），convert是个结构体，sizeof(convert)有8+4（或8）=12（或16）个字节。 显然，申请内存空间不足，就可能造成内存非法访问。 那为什么前面的那个main函数里的malloc没有出错呢[/quote] 我之所以用了可能这个词，就是说它未必就会运行出错，但一定是危险行为。指针指向的内存空间不够，就好比 数组越界 一样，越界出去的内存操作，会带来什么影响是不确定的，如果越界出去的内存是不允许读写的，就会造成非法访问；即使是可读写的，也会造成该内存的数据破话（不是你自己的东西你却修改了），这样是非常危险的。所以要按照正确的使用大小来分配内存。

user: user-2
content: 改成 covert *node = (covert*)malloc(sizeof(conver));  node是个指针，sizeof(node)只有4个字节（64位系统是8个字节），convert是个结构体，sizeof(convert)有8+4（或8）=12（或16）个字节。 显然，申请内存空间不足，就可能造成内存非法访问。

user: user-0
content: 补充：在点击继续后显示——0x76FAFA1D (ntdll.dll) (数据结构实验二.exe 中)处有未经处理的异常: 0xC0000374: 堆已损坏。 (参数: 0x76FEB960)。
user-0 提问: 找不到错误

回复:
user: user-0
content: 引用 1 楼 user-2 的回复:while (a > 0)     {         a = n;         b = a % m;         a = a / m;         s.push(b);     } n不变  则a不变  则a/m不变  则死循环  则无限push  则越界  则引发异常 引用 3 楼 自信男孩 的回复: while (a > 0)     {         a = n;   //这条语句为什么要在这里赋值，在while外已经赋值了。因为n没有做修改，因此每次a都会被赋值初始值，这样就会导致死循环。         b = a % m;         a = a / m;         s.push(b);     }  糊涂了，谢谢大佬

user: user-1
content: while (a > 0)     {         a = n;   //这条语句为什么要在这里赋值，在while外已经赋值了。因为n没有做修改，因此每次a都会被赋值初始值，这样就会导致死循环。         b = a % m;         a = a / m;         s.push(b);     }

user: user-2
content: 哦 漏了m不变

user: user-2
content: while (a > 0)     {         a = n;         b = a % m;         a = a / m;         s.push(b);     } n不变  则a不变  则a/m不变  则死循环  则无限push  则越界  则引发异常
user-0 提问: 本人初学者，两个问题求解答，谢谢。

回复:
user: user-0
content: #include <stdio.h> int main(int argc,char*argv[]) { 	float a,b,c; 	scanf("%f %f",&a,&b); 	b=b*10; 	b=(int)b/50; 	if(a<=3) 		c=10+b*1.8;     else 	{ 		a=(a-3)*10; 		a=(int)a/5; 		c=10+b*1.8+a*0.9; 	} 	    printf("%.2f\n",c); 	return 0; }

user: user-1
content: 引用 7 楼 自信男孩 的回复:[quote=引用 4 楼 千梦一生 的回复:] 要能解答就解答，不能说那么多无用的做啥？不明白的地方，可以做一下引导，不用把自己放在高高在上的位置上，总是俯视别人，先正视一下自己的位置吧[/quote]  引用 5 楼 gezi2333 的回复:看清楚再说好吗？初学者是才开始学习的人的意思，我是希望有人帮我解决问题的，不是要你来骂人的。 实际上我没有骂人，我就是这么想的这么说的。 论坛上这样的人太多了，仍一道题出来就走。布置作业呢？  我说这么多是仍楼主好好想想这个问题。 我没必要俯视谁。  楼主说的初学者意思我也认识到了仅仅是初学的意思。 我只是借学者这个个名词与楼主说说（我个人认为的）他的问题。  授人以渔不如授人以渔。这是一个普遍认可的观点。 ------------------------------------------------------------------ 不过说的话从结果上你确实是引起了两位的不适，那说明我的言论中确实是存在问题。以后应当在言辞说法上多计较、考量一番。 ------------------------------------------------------------------ 楼主回一句。1.我无意侮辱或骂你。2.像你这种帖子不少我过去都不愿回复的。但这次回复了你，其中有无道理你可选择自行参考。 回这楼上一句。我并无高高在上之意。我回头看了一下。那一楼回复中不扣否认参杂了两点：1.是经久以来对这种布置作业的贴的气郁。2.回复的字面意思就是让楼主说说学习上遇到了什么困难，而不是过来布置老师给他布置的作业的。

user: user-2
content: 帮你解决问题是因为你代码出现了bug,不知道如何解决，然后我们才可以帮你，直接给个题目，这是出题老师？

user: user-3
content: 引用 4 楼 千梦一生 的回复:既然是学者，那学到了什么？ 如果学习时有困难学不到。 学习上遇到的困难是什么？ 你这是出题老师，不是学者 不要侮辱学者这两个字。 要能解答就解答，不能说那么多无用的做啥？不明白的地方，可以做一下引导，不用把自己放在高高在上的位置上，总是俯视别人，先正视一下自己的位置吧

user: user-0
content: 看清楚再说好吗？初学者是才开始学习的人的意思，我是希望有人帮我解决问题的，不是要你来骂人的。

user: user-1
content: 既然是学者，那学到了什么？ 如果学习时有困难学不到。 学习上遇到的困难是什么？ 你这是出题老师，不是学者 不要侮辱学者这两个字。

user: user-3
content: 代码呢？一行代码都没有呢～

user: user-0
content: 问题就是将这个题目的要求用c语言写出来，能够满足题目要求

user: user-4
content: 然后呢，问题是啥，你这是题目啊
user-0 提问: 结构体定义

回复:
user: user-1
content: 请参考《C++中typedef与const、指针》 希望能够帮到您！

user: user-2
content: 引用 楼主 肥牛肉^*^ 的回复:typedef struct｛ int a； int b； ｝stu；这样为什么可以定义，struct后面没有结构体名呀，这个和struct｛int a；                                    int b；                                  ｝stu；有什么区别吗 struct后面的是结构体标号，是可以省略的 typedef struct｛ int a； int b； ｝stu；---> stu是结构体类型 stu abc; ---> abc是结构体变量名  struct｛int a；              int b； ｝stu；---> stu是结构体变量名 其类型为 struct｛int a；              int b； ｝;

user: user-3
content: typedef struct｛ int a； int b； ｝stu; //是自定义类型，红色部分是原来的类型（是一个匿名结构体），蓝色部分是新类型（是个类型名字），新类型（名字）等价于原来的（结构体）类型  struct｛ int a； int b； ｝stu; // 是变量声明，红色变量是类型（匿名结构体，也就是没名字的结构），蓝色部分是变量

user: user-4
content: 不建议这么定义，结构体不宜阅读～
user-0 提问: 构造线性表过程  有错误改不处  求指教

回复:
user: user-1
content: 楼主的编译器应该是C，而不是C++，因为&是C++的语法符号，C语言编译器不识别和支持。  可以考虑用指针代替&

user: user-2
content: 你这是c语言，还是c++呢？ 如果是c，他没有引用，因此Sqlist& 这句是错误的

user: user-3
content: 最好把你的代码贴出来 图片无法判断某些具体内容 比如L.length = 0 我瞅着分号像是中文的
user-0 提问: 数字可能出现重复了，但我没发现逻辑错误

回复:
user: user-1
content: 换个思路，先按元素循环，再查找该元素是否与另外两个不同元素的和相等，就可以避免重复了  int main() {     char testdata[]={"5 0 5 1 4 2 3"}, *p=testdata; //用于测试     int n, i, j, k, cnt=0, *a;     //scanf("%d", &n);     n = 7; //用于测试     a = (int*)malloc(sizeof(int)*n);     for(i=0; i<n; i++) { //输入数据         //scanf("%d", &a[i]);         sscanf(p, "%d", &a[i]); p=strstr(p, " ")+1;     }     for(i=0; i<n; i++) { //换一下处理位置，先按元素循环         for (j=0; j<n-1; j++) { //再判断该元素是否与另外两个不同元素的和相等             if(j==i) continue;             for (k=j+1; k<n; k++) {                  if (k==i) continue;                 if (a[j]+a[k]==a[i]) {                     printf("%d=%d+%d\n", a[i], a[j], a[k]);                     cnt++;                     break;                 }             }             if (k<n) break;         }     }     printf("total: %d\n", cnt);     free(a);     return 0; }

user: user-2
content: 有重复是因为上面程序， 在查找数字时， 比如，一个数， 可以有多种满足的数字， 例如： 5 = 2 + 3  也可以时 5 = 1+4 这样 count 会加两次， 但题目只要求计算5是否可以表示， 相当于只要求count+1

user: user-3
content: #include<stdio.h> #include <stdlib.h> #include<math.h>  int main() {     int n, sum, count=0;//,j,b,i;     int i, j, k;     int *arr;     scanf("%d",&n);      arr = (int *)malloc(sizeof(int) * n);     if (!arr)         return -1;      for(i=0;i < n; i++)         scanf("%d", &arr[i]);       for (i = 0; i < n; i++)         for (j = i+1; j < n; j++) {             sum = arr[i] + arr[j];              for (k = 0; k < n; k++) {                 if (sum == arr[k] && k != i && k != j) {                     printf("%d + %d = %d\n", arr[i], arr[j], arr[k]);                     count++;                 }             }         }  #if 0     for(i=0;i<n;i++)         for(j=0;j<n;j++)         {             if(j==i)                 continue;              for(b=j+1;b<n;b++)             {                 if(b==i)                     continue;                 if(a[i]==a[j]+a[b])                      count++;                }         } #endif     printf("%d\n",count);     free(arr);      return 0; } 供参考～
user-0 提问: C语言，为什么总是出现40

回复:
user: user-0
content: 引用 2 楼 user-1的回复:一般这种问题基本都是输入时用了中文逗号，而scanf格式却是英文逗号 谢谢你啊

user: user-1
content: 一般这种问题基本都是输入时用了中文逗号，而scanf格式却是英文逗号

user: user-0
content: 不好意思，已经解决了，谢谢
user-0 提问: 分别给两个数组输入值，然后打印，但是打印的值有一个不正确，哪位大佬帮忙看下，小弟感激不尽

回复:
user: user-1
content: 如下： int m, n,  i, j, count=0; //输入 scanf("%d", &m); int c[m]; for (i=0;i<m;i++){ scanf("%d", &c[i]); }  scanf("%d", &n); int d[n]; for (j=0;j<n;j++){ scanf("%d", &d[j]); } 原文中的定义实际上并没有给两个数组指定长度。有些IDE 执行的时候会报错告诉你哪的问题。

user: user-1
content: 把int c[m]和int d[n]放在两个scanf和for之间
user-0 提问: c语言数据结构：josephus环问题求助。

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h>  typedef  struct  Lnode {     int data;     struct  Lnode *next; }joseph;  void  Create_List(joseph *L,int n) {     int i;     joseph *p,*s;      p =s = L;      for(i=2;i<=n;i++){         s=(joseph*)malloc(sizeof(joseph));         s->data =i;         p->next=s;         p=s;     }     p->next = L;  }   void show_list(joseph *phead) {     joseph *p;     if (!phead)         return;     p = phead->next;     printf("%d\t", phead->data);     while (p != phead) {         printf("%d\t", p->data);         p = p->next;     }     putchar(10); }  void  Delete_List(joseph *p, joseph *q) {     q-> next = p-> next;     free(p); }   void josephus (joseph *L, const int total, const int s, const int m) {     joseph *p = L, *prev, *del_node;     int cnt = 0, del_val, pos;      while (p && ++cnt != s) {         p = p->next;     }     printf("***%d\\\n", p->data);      //printf("helloworld!\n");     pos = cnt = 0;     prev = p;     while (1) {         pos++;         if (pos == m) {             del_val = p->next->data;             pos = 1;             del_node = p->next;             printf("del: %d\n", del_node->data);             p->next = p->next->next;             free(del_node);             cnt++;             if (cnt == total-1) {                 break;             }         }         p = p->next;         printf("pos = %d\n", pos);         //prev = prev->next;     }      printf("%d\n", p->data);  #if 0     int length;     length= sizeof(L)-1;      int i,j;     static joseph *p,*q,*Y;      p = L;      for(i=1;i<length;i++){         if(i==1){             for(j=1;j<s-1;j++){                 p=p->next;             }             q=p->next;             p-> next= q-> next;             Y->data = q->data;             Y=Y->next;             free(q);         }else{             for(j=1;j<m;j++){                 p=p->next;             }             q=p->next;             p-> next= q-> next;             Y->data = q->data;             Y=Y->next;             free(q);         }      }      printf("\n");       printf("%4d\n",Y->data);     //return L; #endif }   //void main() int main() {     joseph *L=NULL;     int m,n,s;     L = (joseph*)malloc(sizeof(joseph));     L->data=1;     printf ("请输入人数、约定编号数，出列值：\n");     scanf ("%d%d%d", &n, &s, &m);     if ((m> 1000) || (n> 1000))         printf ("输入的人数m，n不合法\n");     else if (s>n)         printf ("输入数据不合法！\n");     else     {         n = 5;         Create_List(L, n);         show_list(L);         printf ("\n");         josephus(L, n, s, m);     } } 供参考～
user-0 提问: 小白紧急求助 

回复:
user: user-1
content: char str[] = "hello a123456"; int i; for(i = 0;i < strlen(str);i++){   if(str[i] >('a' - 1) && str[i] < ('z' +1) || str[i] >('A' - 1) && str[i] < ('Z' +1)){        str[i] + 'a' - 'A' + 1;   } } //z和Z自己再设置一下，输出就一个for循环，记得加头文件string.h

user: user-2
content: 根据字符串bai存储的变量的不同，方法不同，  参考代码： 存储在char数组中（支持C/C++) char str[]="hello" ; int i;for( i=0;str[i];i++ )     printf("%c\n", str[i] ); //以数组方式引用一个字符str[i]   for( i=0;*(str+i);i++ )     printf("%c\n", *(str+i) ); //以指针方式引用一个字符
user-0 提问: C语言

回复:
user: user-1
content: void printf_chr_exercise(void) { 	char c = 'a';//get a character 	char upper_c = toupper(c); 	{ 		printf("%c\n"\ 			"%c %c %c %c %c %c %c %c\n"\ 			" %c %c %c %c %c %c %c %c\n"\ 			"%c %c %c %c %c %c %c %c\n"\ 			" %c %c %c %c %c %c %c %c\n"\ 			"%c %c %c %c %c %c %c %c\n"\ 			" %c %c %c %c %c %c %c %c\n"\ 			"%c %c %c %c %c %c %c %c\n"\ 			" %c %c %c %c %c %c %c %c\n",\ 			c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,\ 			upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c,upper_c); 	} }

user: user-2
content: 小写字母转换为大写字母不会？ 还是 输出不会？

user: user-3
content: 更倾向于３ｌ循环打印的，如果我的话会用循环打，看着好看一点

user: user-4
content: #include<stdio.h> int main(){     char c;     scanf("%c", &c);     c += 26;    //将小写转换为大写     //循环输出     for(int i = 0; i < 8; i ++){         for(int j = 0; j < 8; j ++){             if(i % 2 == 1)                 printf("%c ", c);             else                 printf(" %c", c);         }         print("\n");     }     return  0; }  一个思路，可以参考
user-0 提问: c语言——转义字符问题

回复:
user: user-1
content: 我这边跑过都是正常对齐的，实在不行可以贴代码上来debug下。

user: user-2
content: https://blog.csdn.net/CSRAWD/article/details/104860862  这个博客讲的很详细，参考一下吧～

user: user-3
content: char s[200]; sprintf(s,"a[%2d]=%2d",i,a[i]);//输出到临时字符串变量s中 printf("%-20s",s);//将s左对齐占用20个字符宽度输出

user: user-3
content: 对终端来说，\t仅仅表示将光标向右移到下一个列位置为8*n+1的地方而已。n为非负整数
user-0 提问: 单链表的插入

回复:
user: user-1
content: 引用 3 楼 weixin_50718000 的回复:@自信男孩，那个你写的第90行为什么要写getchar（）呀，为什么不写那个就执行不出结果来呀 这个用于接收上面输入i之后输入的回车。如果楼主再输入这两个scanf对应的变量时中间不加回车就可以不加那句～

user: user-0
content: @自信男孩，那个你写的第90行为什么要写getchar（）呀，为什么不写那个就执行不出结果来呀

user: user-0
content: 嗯，好的，我知道了，谢谢

user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h>  #define  ERROR 0 #define  OK    1  //单链表的定义 typedef int elemtype; typedef struct Node { 	elemtype data; 	struct Node *next; }Node,*linklist;  //单链表的初始化 void init_linklist(linklist *l) { 	*l = (linklist)malloc(sizeof(Node)); 	(*l)->next=NULL; } //头插法建立单链表 void createfromhead(linklist l) { 	Node *s; 	char c; 	int flag=1; 	while(flag) 	{ 		c = getchar(); 		//fflush(stdin); 		getchar(); 		if(c!='0') 		{ 			s=(Node*)malloc(sizeof(Node)); 			s->data=c; 			s->next=l->next; 			l->next=s; 		} 		else  			flag=0; 	} } //单链表的插入 int inslist(linklist l,int i,elemtype e) 	//在带头结点的单链表l中第i个位置插入值为e的节点 {     	Node *pre,*s; 	int k; 	if(i<=0) 		return ERROR; 	pre=l;   k=0;//从头开始查找，查找第i-1个节点 	while(pre!=NULL&&k<i-1)    //标为查完且未查到第i-1个是重复，找到pre只想第i-1个 	{   		pre=pre->next; 		k=k+1; 	}//查找第i-1个节点 	if(pre==NULL)//如当前位置pre为空表表示一找完，但还为到第i个，说明插入位置不合理 	{   		printf("插入位置不合理"); 		return ERROR; 	} 	s=(Node*)malloc(sizeof(Node));  //申请一个新的节点 	s->data=e;  //值e放入s的数据与 	s->next=pre->next;  //修改指针，完成插入 	pre->next=s; 	return OK; } //void main() int main() {     	linklist l; 	Node *p; 	int i,r,j; 	//建立单链表 	init_linklist(&l); 	printf("用头插法建立单链表，请输入链表数据\n"); 	createfromhead(l); 	p = l->next; 	while(p!=NULL) 	{     		//printf("%c\n", *p ); 		printf("%c\n", p->data ); 		p=p->next; 	}  	//单链表的插入 	printf("请输入你要插入的位置:\n"); 	scanf("%d",&i); 	getchar(); 	printf("请输入你要插入的数字：\n"); 	//scanf("%d",&r); 	scanf("%c",&r); 	if (inslist(l,i,r) == ERROR) { 		printf("Insert error!\n"); 		return -1; 	} 	printf("结果为:\n"); 	p=l->next; 	while(p!=NULL) 	{     		//printf("%c\n", *p ); 		printf("%c\n", p->data ); 		p=p->next; 	} } 供参考～  插入算法没什么问题，问题在于main函数里用的r是%d格式的，注意'1'和1是不相等的。 如果按照楼主的写法，可以考虑输入51，这样插入的是'3'，
user-0 提问: 有关while循环的小问题

回复:
user: user-0
content: 引用 3 楼 Intel0011的回复:[quote=引用 楼主 若水ovo 的回复:]为什么输入数字不退出循环呀 另外，至少执行一次的时候，用do...while更好[/quote] 这个我自己还没看到

user: user-0
content: 引用 3 楼 Intel0011的回复:[quote=引用 楼主 若水ovo 的回复:]为什么输入数字不退出循环呀 另外，至少执行一次的时候，用do...while更好[/quote] 谢谢(*°∀°)=3

user: user-1
content: 2也是字符，是输入的'2'。  建议用ctrl+d（LINUX）或ctrl+z（windows）试试

user: user-2
content: 引用 楼主 若水ovo 的回复:为什么输入数字不退出循环呀 另外，至少执行一次的时候，用do...while更好

user: user-3
content: 数字也是字符啊，alp接收‘2’字符，有什么错？

user: user-2
content: cir = scanf("%c", &alp); 当你输入2时，alp为'2'，cir为1，当然继续循环啦
user-0 提问: 我这编译出来运行不来，出现d returned 1 exit status

回复:
user: user-0
content: 谢谢哈。不过我这个i 就是想要设定变的，为了单独输出 i的每一个数，进入选择。

user: user-1
content: #include<stdio.h> #include<math.h> #include<bits/stdc++.h>  int main() {     unsigned int m, n, i, boundary = 2 * (unsigned int)pow(10, 9);     int digits[10] = {0}, tmp;       scanf("%u%u", &m, &n);      if (m > n)         return -1;     if ((m <= 0 || m > boundary)         || (n <= 0 || n > boundary)) {             return -1;     }      for (i = m; i <= n; i++) {         tmp = i;          while (tmp) {             digits[tmp % 10]++;             tmp /= 10;         }     }     for(i=0;i<10;i++)         printf("%d ", digits[i]) ;      putchar(10);     return 0;    #if 0      int m,n,i,j,d,c;     int tmp;     scanf("%d %d",&m,&n);     int b[10]={0};      for(i=m;i<=n;i++) {                 tmp = i;                 while (tmp)                 {                     d = tmp%10;                     tmp = tmp/10;                     switch(d)                     {                         case 0:b[0]++;break;                         case 1:b[1]++;break;                         case 2:b[2]++;break;                         case 3:b[3]++;break;                         case 4:b[4]++;break;                         case 5:b[5]++;break;                         case 6:b[6]++;break;                         case 7:b[7]++;break;                         case 8:b[8]++;break;                         case 9:b[9]++;break;                     }                 }     }     for(i=0;i<10;i++)         printf("%d: %d\n", i, b[i]) ; #if 0         for(j=1;j<=10;j++)         {             if(i<pow(10,j))              {                 tmp = i;                  //for(c=j-1;c>0;c--)                 while (tmp)                 {                     d = tmp%10;                     tmp = tmp/10;                     switch(d)                     {                         case 0:b[0]++;break;                         case 1:b[1]++;break;                         case 2:b[2]++;break;                         case 3:b[3]++;break;                         case 4:b[4]++;break;                         case 5:b[5]++;break;                         case 6:b[6]++;break;                         case 7:b[7]++;break;                         case 8:b[8]++;break;                         case 9:b[9]++;break;                     }                 }             }         }     for(i=0;i<10;i++)         printf("%d: %d\n", i, b[i]) ;     return 0;  #endif  #endif  }  供参考～

user: user-1
content: 楼主的i在循环体里被修改了，修改的地方在这里：   d=i%10;    i=i/10; 主要是这句：i = i/10;修改了i，别忘了在最外层循环里i循环标量；
user-0 提问: c语言，可以麻烦你告诉我怎么去完成么？

回复:
user: user-1
content: 按图的方式，百度图最短路径算法

user: user-2
content: 这玩意好点绕啊，计价还是简单的，关键是线路站点的增删，用链表？结构体保存不同的信息，而且涉及到多条线交叉，应该是外部链表存了信息，然后有节点指向内部链表，分开存储，这样的话可能要好几个，一时半会我理不出来，还有怎么得到可行路径也是个问题
user-0 提问: 如何编写模块来实现将eht0端口上收到的包发送到eth1端口上？

回复:
user: user-0
content: 写一个内核模块，实现eth0和eth1之间相互转发？到eth0上的包直接扔给eth1，eth1上的包直接扔给eth0.

user: user-0
content: 假如应用层的数据到了eth0接口，我希望写一个内核模块，将这个报文交由eth1处理，然后转发出去

user: user-1
content: 折腾啥，把网线调换一下接口不就行了

user: user-2
content: 互相转发的意义不大吧？如果是单独拿得话可以用桥接，桥接之前看得是把几个口的包通过桥放到一个口，然后监听那一个口抓包，就可以抓到所有的，应该是一个道理

user: user-3
content: 两张网卡（两个ip）？两个端口？ 你所谓的转发是指程序转发还是让系统自动转发？系统自动转发好像两张网卡可以“桥接”（类似和虚拟机的桥接）；程序转发那实现方式很多，比如在路由转发到不同ip

user: user-4
content: 楼主的意思是不是指端口之间通信？ 那不就是进程之间通信吗？ 如果是两个网卡之间通信，使用脚本就可以了啊。 端口、eth0和eth1，先了解清楚。
user-0 提问: vs的C程序malloc分配的内存为什么会访问不了？

回复:
user: user-1
content: top->data=NULL;下面的波浪线提示是什么？看上去data像是int型，初始化最好用top->data=0;这样

user: user-0
content: 问题已经解决了，实际上是因为这个文件中头文件没有定义initList函数，vs编译也不报错运行出问题！

user: user-2
content: 但从这些信息看不出什么问题来，（对于top在malloc之后应该判断一下是否申请成功）建议提供更多代码吧～

user: user-0
content: 到上面这一步的时候内存已经分配并赋值了，  但就是错了，怎么回事，怎么解决？
user-0 提问: 求解创建双链表的问题

回复:
user: user-0
content: 引用 1 楼 user-1的回复:scanf("%d\n", &q->data);   改为 scanf("%d", &q->data); 谢谢谢谢谢谢

user: user-1
content: scanf("%d\n", &q->data);   改为 scanf("%d", &q->data);
user-0 提问: 隐式转换的问题

回复:
user: user-1
content: 会不会是你认为是UINT8是int类型？如果是编译器帮你转换了int，还会emit出来个error，那么所有的UINT8和UINT16赋值运算都会需要(type)强制转换了。

user: user-0
content: 引用 1 楼 自信男孩的回复:应该是隐式类型提升了：C语言中比int小的整型（包括short 、unsigned short 、 unsigned char和char）在运算中都要转换成int然后进行运算，至于为什么选择转换为int，应该是从效率上考虑的，因为通常情况下int的长度被定义为机器处理效率最高的长度，比如32位机上，一次处理4个字节效率是最高的，所以虽然short（我机器上占2个字节）更节省内存，但是在运算中的效率，是int更高。所以上面，无论是逻辑运算a>b还是算术运算a+b中a和b都默认转换成了int，所以算术运算的结果也是带符号的。   注意标红的前提条件 后面我把循环条件里的语句改为sum =(UINT16)(sum + data[10+i]); 这样就没问题了，估计就是你所说的原因。

user: user-0
content: 错误我是照抄的，所以没有我认为这个UINT8是int类型。

user: user-2
content: 不同的编译器可能对字面量的类型存储不一样，可以参考以下链接 https://zh.wikipedia.org/wiki/字面常量_(C语言) 对于你的代码，i < 39 的 39 编译器都当做是int，所以自动把 i 转成 int 来比较 对于上面链接的，如果 39 转成long，有另一种写法，即 39L（后面带个L表示long）能很容易做到，但是做成UINT16或UINT8好像没有专门的修饰，这种情况只能强行转换了，如 i < (UINT16)39

user: user-3
content: 引用 1 楼 自信男孩 的回复:应该是隐式类型提升了：C语言中比int小的整型（包括short 、unsigned short 、 unsigned char和char）在运算中都要转换成int然后进行运算，至于为什么选择转换为int，应该是从效率上考虑的，因为通常情况下int的长度被定义为机器处理效率最高的长度，比如32位机上，一次处理4个字节效率是最高的，所以虽然short（我机器上占2个字节）更节省内存，但是在运算中的效率，是int更高。所以上面，无论是逻辑运算a>b还是算术运算a+b中a和b都默认转换成了int，所以算术运算的结果也是带符号的。   注意标红的前提条件 但是还需要注意一个问题就是转换成int类型的时候，高位补齐的问题。  如果是unsigned的类型转换成int类型，高位补0.  如果是signed的类型转换成int类型，如果原来最高位是1则补1，如果是0则补0。

user: user-3
content: 应该是隐式类型提升了：C语言中比int小的整型（包括short 、unsigned short 、 unsigned char和char）在运算中都要转换成int然后进行运算，至于为什么选择转换为int，应该是从效率上考虑的，因为通常情况下int的长度被定义为机器处理效率最高的长度，比如32位机上，一次处理4个字节效率是最高的，所以虽然short（我机器上占2个字节）更节省内存，但是在运算中的效率，是int更高。所以上面，无论是逻辑运算a>b还是算术运算a+b中a和b都默认转换成了int，所以算术运算的结果也是带符号的。   注意标红的前提条件
user-0 提问: 用Dev_c++敲的程序输出的全是零

回复:
user: user-1
content: 首先a是整型数，把整型数用%f输出输出0是可能的。  另外，a = 1.0 / 3 * 3;由于a是整型数，1.0/3  *3得到的结果可能是0.999xxxx；这样再转成整型数就是0了。  修改方法：  float a;//定义a为float类型 试试～

user: user-2
content: 引用 3 楼 Cardistalive的回复:将第4行代码: int a; 修改成 float a; 这样就将，原先数据类型为整型的数据a，修改成，支持有效数字至少为6位小数的单精度浮点型数据a ,以容纳第5行的计算结果 支持有效数字至少为6位的单精度浮点型数据

user: user-2
content: 将第4行代码: int a; 修改成 float a; 这样就将，原先数据类型为整型的数据a，修改成，支持有效数字至少为6位小数的单精度浮点型数据a ,以容纳第5行的计算结果

user: user-3
content: double a；
user-0 提问: 调试过程中遇到的一个问题,不解..求 解答. 

回复:
user: user-1
content: 引用 4 楼 UIUI 的回复:这个函数是返回了局部变量的地址，是无意义的。因为局部变量在函数调用结束后会自动释放的，不能再次使用了。可以考虑加上static将其变成全局变量；  void* CheckRangeInit(void) { #define MaxArray 50     static int i = 0;     static long temp[MaxArray][2] = { 0 };     if (i < 49)         return (void*)temp[i++];     else         return (void*)-1; }    确实加上 static 就可以了..  找了半天问题, 就是没想到这儿的问题. 谢谢. 奇怪! 为什么原贴中不写打印函数就可以直接用,不会有问题呢.[/quote]  在函数外使用局部变量是未定义行为，结果可能是随机的～

user: user-0
content: 这个函数是返回了局部变量的地址，是无意义的。因为局部变量在函数调用结束后会自动释放的，不能再次使用了。可以考虑加上static将其变成全局变量；  void* CheckRangeInit(void) { #define MaxArray 50     static int i = 0;     static long temp[MaxArray][2] = { 0 };     if (i < 49)         return (void*)temp[i++];     else         return (void*)-1; }  [/quote]  确实加上 static 就可以了..  找了半天问题, 就是没想到这儿的问题. 谢谢. 奇怪! 为什么原贴中不写打印函数就可以直接用,不会有问题呢.

user: user-0
content: 啊平, 用VS2008 上述程序就没有问题.          用VS2019 就有问题......          如何避免.呀...

user: user-1
content: void* CheckRangeInit(void) { #define MaxArray 50     static int i = 0;     long temp[MaxArray][2] = { 0 };     if (i < 49)         return (void*)temp[i++];     else         return (void*)-1; }   这个函数是返回了局部变量的地址，是无意义的。因为局部变量在函数调用结束后会自动释放的，不能再次使用了。可以考虑加上static将其变成全局变量；  void* CheckRangeInit(void) { #define MaxArray 50     static int i = 0;     static long temp[MaxArray][2] = { 0 };     if (i < 49)         return (void*)temp[i++];     else         return (void*)-1; }

user: user-0
content: 如果用 printf_s( printf)  改成 puts(),  句柄里的值也不会发生变化 . 怎么这么奇怪?
user-0 提问: 求最大公约数

回复:
user: user-1
content: 引用 12 楼 m0_51348310 的回复:[quote=引用 11 楼 绿色盒子的回复:]报错？请贴出报错代码 default. c:1:4:error:stray'\302'in program int Maxcommomdivisor(int a,int b) default. c:1:5:error:stray'\240'in program int Maxcommomdivisor(int a,int b) default. c:1:26:error:stray'\302'in program int Maxcommomdivisor(int a,int b)  default. c:1:27:error:stray'\240'in program int Maxcommomdivisor(int a,int b)[/quote] 你这个是有非法字符，你可以尝试删除之后手打代码

user: user-0
content: 引用 11 楼 绿色盒子的回复:报错？请贴出报错代码 default. c:1:4:error:stray'\302'in program int Maxcommomdivisor(int a,int b) default. c:1:5:error:stray'\240'in program int Maxcommomdivisor(int a,int b) default. c:1:26:error:stray'\302'in program int Maxcommomdivisor(int a,int b)  default. c:1:27:error:stray'\240'in program int Maxcommomdivisor(int a,int b)

user: user-1
content: 报错？请贴出报错代码

user: user-0
content: 楼主复制了八楼、九楼的答案。虽然答案很厉害的样子，但运行时都显示错误。楼主只是个初学者啊，看不懂也改不了

user: user-1
content: int Maxcommomdivisor(int a, int b)  {     while(a%b){         int tmp = a;         a = b;         b = tmp%b;     }     return b; }

user: user-2
content: #include <iostream> using namespace std;  int Func(int a, int b) { 	int c = a%b; 	if (c == 0) 	{ 		return b; 	} 	else 	{ 		a = b; 		b = c; 		return Func(a,b); 	} }  int main() { 	int a, b; 	cout << "输入两个数："; 	cin >> a; 	cin >> b; 	cout << "接收到数据：" << a << "和" << b << endl; 	cout << "最大公约数为：" << Func(a,b);     return 0; }

user: user-0
content: min=(a<b)?a:b;

user: user-3
content: 楼主的min变量没初始化就直接使用，会有问题的～

user: user-4
content: 你想让大家帮你做啥呢

user: user-0
content: 引用 6 楼 一根烂笔头的回复:反过来计算，i值就是结果，省一次赋值         for(i=min;i>=1;i--)         {              if(a%i==0&&b%i==0)                break;         }  回六楼： 谢谢你的方法， 不过， 我的老师讲过这种从大到小的方法。 然而， 我需要的是从小到大的方法。

user: user-5
content: 反过来计算，i值就是结果，省一次赋值         for(i=min;i>=1;i--)         {              if(a%i==0&&b%i==0)                break;         }

user: user-0
content: 楼主写了一个程序（错的）。老师发现后，添加了一个变量使程序正确。然后老师要求楼主用另一种方法修正程序。 楼主写的程序： #include<stdio.h> int main() {       int a,b,min,i;       scanf("%d,%d",&a,&b);        min=(a<b)? a:b;        for(i=1;i<=min;i++)         {              if(a%i==0&&b%i==0)                continue;         }        printf("输出最大公约数%d",i-1); } 老师写的程序： #include<stdio.h> int main() {       int a,b,min,x,i;       scanf("%d,%d",&a,&b);        min=(a<b)? a:b;        for(i=1;i<=min;i++)         {              if(a%i==0&&b%i==0)                x=i;         }        printf("输出最大公约数%d",x); }

user: user-0
content: 楼主写了一个代码（可惜是错的），如下： #include<stdio.h> int main() {       int a,b,min,i;       scanf("%d,%d",&a,&b);        min=(a<b)? a:b;        for(i=1;i<=min;i++)         {              if(a%i==0&&b%i==0)                continue;         }        printf("输出最大公约数%d",i-1); } 老师发现后改为 #include<stdio.h> int main() {       int a,b,min,x,i;       scanf("%d,%d",&a,&b);        min=(a<b)? a:b;        for(i=1;i<=min;i++)         {              if(a%i==0&&b%i==0)                x=i;         }        printf("输出最大公约数%d",x); } 然后，老师要求我用另一种方法从小到大筛选最大公约数。
user-0 提问: 求大佬帮忙

回复:
user: user-0
content: 引用 1 楼 user-2的回复:for 后面的分号去掉 我昨晚解决了，原来的空格的内循环没效果

user: user-0
content: 引用 1 楼 user-2的回复:for 后面的分号去掉 不好使的我试了

user: user-1
content: 看逻辑上，可以再优化下 假设你的金子塔有n层，你需要输出n行，每行有两个东西 ：1.前面的空格，2.字母 第一行  前面是（n-1)/2个空格 1个字母  第二行  前面是  (n-2)/2个空格 2个字母  以此类推  第i行 前面输出(n-i)/个空格  i个字母  这样两层循环就可以了

user: user-2
content: for 后面的分号去掉
user-0 提问: 求求C语言大佬带带萌新

回复:
user: user-1
content: 你的循环里面 下面那个break多余了，会导致循环只执行以此就退出了，把它去掉

user: user-2
content: #include<stdio.h>  int main(void) {     int n,even=0,odd=0;     float sumeven=0,sumodd=0;     while(1)     {         scanf("%d",&n);         if(n==0){             break;         }          if(n%2==0)         {             sumeven+=n;             even++;         }         else         {             sumodd+=n;             odd++;         }         //break;     }     printf("Number of even:%d;Average of even:%.2f\n",even,sumeven/even);     printf("Number of odd:%d;Average of odd:%.2f\n",odd,sumodd/odd);      return 0; } 供参考～  多一个break；
user-0 提问: OJ练习题   C语言求解  输入N后输出1+1/2+1/3+…+1/N的和

回复:
user: user-0
content: 引用 1 楼 user-3的回复:i是int，所以1/i被转成int，i大于1时int结果就是0 所以改成 sum=sum+1.0/i //1.0是double，就算结果就不再是int了 谢谢！！！！！！知道哪里错了就舒服多了！

user: user-1
content: 1/i；由于i是int类型，因此1/i是按照整型数的除法来计算的，因此得到的是整型的结果，如果改成1.0/i，由于1.0编译器会认为其是double，所以1.0/i是按照浮点数来计算除法，因此得到的是double结果。

user: user-0
content: 是个好方法！谢谢

user: user-2
content: 逐步学会调试程序，是找到程序问题的关键。 在此题中，可以在循环中增加显示i/1的值的输出语句，观察输出结果，以判断问题出在何处，从而找出解决问题的方法

user: user-0
content: 引用 2 楼 自信男孩的回复:1/i；由于i是int类型，因此1/i是按照整型数的除法来计算的，因此得到的是整型的结果，如果改成1.0/i，由于1.0编译器会认为其是double，所以1.0/i是按照浮点数来计算除法，因此得到的是double结果。 嗯嗯，好的好的👌，谢谢

user: user-3
content: i是int，所以1/i被转成int，i大于1时int结果就是0 所以改成 sum=sum+1.0/i //1.0是double，就算结果就不再是int了
user-0 提问: 求一个编程技巧...

回复:
user: user-1
content: ptHandle 是void*，可以指向很多类型，比如数组（int *)，甚至结构体。所以，void * 可以存储N多东西的。

user: user-0
content: 主要问题是最后一个函数怎么实现的.

user: user-1
content: 不客气！学习愉快~~

user: user-0
content: 非常感谢你的回复.   谢谢呀. 真的谢谢.

user: user-1
content: #include <stdio.h> #include <stdlib.h> void* CheckRangeInit(void); void  CheckRangeExit(void *); void  CheckRangeSet(void* ptHandle, long ForOffset, long BackOffset, long Target, long Resolution); unsigned short CheckRangeDetect(void* ptHandle, long Current);   int main(void) {     void* test1 = 0;     test1 = CheckRangeInit();  //为每一个变量分配地址.  我猜的.     //实际数值在40 与 70 之单     CheckRangeSet(test1, 10, 20, 50, 360);  //设置 检测检测范围      // test1 当前值为60 在40与70之间, 所以打印. Yes!     if(CheckRangeDetect(test1, 60))         printf("Yes!\n");     else         printf("No!\n");      CheckRangeExit(test1);     return 0; } void* CheckRangeInit(void) //为每个变量分配一个地址, 如果是这样, 我可以实现. {     return (void *)malloc(sizeof(long)*4); } void  CheckRangeExit(void * r) {     long * rp = (long *)r;     free(rp); }  //这个函数,我不会实现, /* 参数1是 变量句柄 参数2是 最小, 参数3是 最大 参数4是 基准值 参数5是 最大范围值.只能在范围值内偏移.  */ void  CheckRangeSet(void* ptHandle, long ForOffset, long BackOffset, long Target, long Resolution) {     long * set = (long *) ptHandle;     set[0] = ForOffset;     set[1] = BackOffset;     set[2] = Target;     set[3] = Resolution; } /* 检测 当前值是否在设置的最小最大范围内. 我的主要疑问是这个函数. ptHandle 里面只能存一个数字, 然后,用当前值怎么去和两个数字(最小值,最大值) 比大小呢? */ unsigned short CheckRangeDetect(void* ptHandle, long Current) {     const long * set = (const long *) ptHandle;     return Current >= set[2] - set[0] && Current <=set[2] + set[1]; }

user: user-0
content: 也不知道我想的对不对，初始化函数中，可能有一个2维数组，返回值一个地址，该地址中指向的地方是一个2维数组，然后，那个设置函数，把最大值与最小值 计算后，存到相应句柄地址的数组中，这样，每一个句柄实际上有两个变量，所以最后一个比较大小的函数直接取出来用就可以。

user: user-0
content: 引用 2 楼 丁劲犇 的回复:ptHandle 是void*，可以指向很多类型，比如数组（int *)，甚至结构体。所以，void * 可以存储N多东西的。  void * 这个我明白.我主要是没明白  unsigned short CheckRangeDetect(void* ptHandle, long Current) 主要是这个我没明白, 他是怎么实现只用一个 pthandle 来与当前值对比的.  如果我做这个东西. 我只会一个简单的方法.  void  CheckRangeSet(void* ptHandle, long ForOffset, long BackOffset, long Target, long Resolution) {   } 在这个里面, 计算出,最大值,与最小值, 然后, 存放到 两个全局变量中.. 然后,用 CheckRangeDetect () 这个函数 读入当前值,来与 那两个全局变量作比较.,然后,返回 0 或1.  可是,我看别人的程序的时候, 是没有设置那两个全局变量呀.
user-0 提问: 关于stdout是行缓冲的问题

回复:
user: user-0
content: 能把你的程序出来看看吗？谢谢！

user: user-1
content: 因为程序退出了，那么行也结束了。stderr是无缓冲的，会直接输出； 楼主的程序，在我的代码里运行的是 World!Hello
user-0 提问: 请问这个题

回复:
user: user-0
content: 引用 3 楼 均陵鼠侠 的回复:[quote=引用 2 楼 我当时害怕极了QAQ 的回复:][quote=引用 1 楼 均陵鼠侠 的回复:]谢邀。 题目不是问CPU如何选择，是问CPU如何用地址线来访问模块板。第（5）回答已经明确了。  嗯，就是那个最高3位，次高3位是怎么得出来的呢？[/quote]  不管地址线几根，从中划出N根线，可以访问的模块板是2^N块，剩余的线访问模块板内的芯片。从剩余部分划出M根线，可访问的芯片数量是2^M。你用这个方法倒推一下。[/quote]  引用 5 楼 qybao 的回复:模板块总数=8=2^3，即用3位即可覆盖模板号代表的地址信息 因为是8位机，芯片只有4位，所以用两片芯片组合成8位，比如A芯片负责高4位，B芯片负责低4位，这样就能从8位换算的结果区分是A芯片B芯片（比如是0-127就是B，128-255就是A），这样32k/4k=8=2^3，用3位也能覆盖芯片号代表的地址信息  懂了懂了，谢谢大神

user: user-1
content: 剩下的就是18-3-3=12位，用来区分片内地址

user: user-1
content: 模板块总数=8=2^3，即用3位即可覆盖模板号代表的地址信息 因为是8位机，芯片只有4位，所以用两片芯片组合成8位，比如A芯片负责高4位，B芯片负责低4位，这样就能从8位换算的结果区分是A芯片B芯片（比如是0-127就是B，128-255就是A），这样32k/4k=8=2^3，用3位也能覆盖芯片号代表的地址信息

user: user-0
content: 引用 3 楼 均陵鼠侠 的回复:[quote=引用 2 楼 我当时害怕极了QAQ 的回复:][quote=引用 1 楼 均陵鼠侠 的回复:]谢邀。 题目不是问CPU如何选择，是问CPU如何用地址线来访问模块板。第（5）回答已经明确了。  嗯，就是那个最高3位，次高3位是怎么得出来的呢？[/quote]  不管地址线几根，从中划出N根线，可以访问的模块板是2^N块，剩余的线访问模块板内的芯片。从剩余部分划出M根线，可访问的芯片数量是2^M。你用这个方法倒推一下。[/quote]  嗯嗯，N=3我懂了，M不会求。。

user: user-2
content: 引用 2 楼 我当时害怕极了QAQ 的回复:[quote=引用 1 楼 均陵鼠侠 的回复:]谢邀。 题目不是问CPU如何选择，是问CPU如何用地址线来访问模块板。第（5）回答已经明确了。  嗯，就是那个最高3位，次高3位是怎么得出来的呢？[/quote]  不管地址线几根，从中划出N根线，可以访问的模块板是2^N块，剩余的线访问模块板内的芯片。从剩余部分划出M根线，可访问的芯片数量是2^M。你用这个方法倒推一下。

user: user-0
content: 引用 1 楼 均陵鼠侠 的回复:谢邀。 题目不是问CPU如何选择，是问CPU如何用地址线来访问模块板。第（5）回答已经明确了。  嗯，就是那个最高3位，次高3位是怎么得出来的呢？

user: user-2
content: 谢邀。 题目不是问CPU如何选择，是问CPU如何用地址线来访问模块板。第（5）回答已经明确了。
user-0 提问: 这么简单怎么不会呢？？？ 啊 我.. 我...不会[face]qq:9.gif[/face]

回复:
user: user-1
content: 输入会不会 判断奇数偶数会不会 其他会不会 都会 你已经能写出来了 都不会 看书去

user: user-2
content: 如果一点不会，那要找一下自己的问题～这个问题确实不难，动手写一下，遇到具体问题再发出来～

user: user-0
content: 我写出来了，写出来了！ 在此谢谢两位！

user: user-3
content: 自己的作业自己做。 你写完代码结果不对可以贴上来。相信有人可以帮你看看
user-0 提问: C语言编程加法运行后无法计算

回复:
user: user-1
content: 可以采用单步执行的方法，或者在scanf下增加printf("%lf,%lf",a,b)的输出语句，观察a，b的输出值，从而快速找到错误所在。实际上此题在编译时就会给出变量a,b没有使用的警告信息，从这个警告信息就可分析出问题所在

user: user-2
content: scanf的双引号的内容超出了，后面应该跟变量地址，楼主这样写导致scanf确实参数，%lf对应的参数；  	 scanf("%lf%lf", &a, &b); 这样试一下～

user: user-3
content: scanf("%lf%lf",&a,&b);

user: user-0
content: 求各位大佬帮我解答一下  跪求
user-0 提问: 如何生成从0-1亿之间的随机数，尽量不要循环和乘除法

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <time.h> unsigned long ulrand(void) {     return (      (((unsigned long)rand()<<24)&0xFF000000ul)     |(((unsigned long)rand()<<12)&0x00FFF000ul)     |(((unsigned long)rand()    )&0x00000FFFul)); } unsigned __int64 ullrand(void) {     return (      (((unsigned __int64)ulrand())<<32)     | ((unsigned __int64)ulrand())); } int i; unsigned long ul; unsigned __int64 ull; void main() {     srand(time(NULL));     for (i=0;i<10;i++) {         ul=ulrand();         printf("%010lu 0x%08x\n",ul,ul);     }     for (i=0;i<10;i++) {         ull=ullrand();         printf("%020I64u 0x%016I64x\n",ull,ull);     } } //3971076432 0xecb1d150 //2433428051 0x910b2a53 //1415415336 0x545d8628 //1312330759 0x4e389407 //1845758378 0x6e0409aa //0008069933 0x007b232d //4202720757 0xfa806df5 //2669855255 0x9f22c217 //0312068736 0x1299ca80 //2084555989 0x7c3fccd5 //03502077880857307931 0x3099e1472040ab1b //16884702393146816355 0xea52835e19b43763 //01877364819396611730 0x1a0dbd5b45f34e92 //07839440151924835771 0x6ccb4948756a05bb //09471412086917299176 0x8371371c820bfbe8 //04411255971577469925 0x3d37edef2f321be5 //13735846279546091130 0xbe9f876a65b7367a //04512980766520059820 0x3ea15418aa9927ac //15821377118299441610 0xdb90d2a9f1bb49ca //15512417228822200185 0xd7472d480398bf79
user-0 提问: 新手遇到的小问题

回复:
user: user-1
content: 函数运用啊

user: user-2
content: main()函数中对max函数进行了声明和调用， 但是你没有定义max函数， 图片中int max(int x,int y)的部分也要打全。

user: user-3
content: int max(int a,int b);是函数声明，c=max(a,b)是函数调用，这里缺少函数的定义。

user: user-4
content: 很显然这是代码没打全。。  书上的max函数定义也要打呀  就是下面的int max(int x, int y)的那部分

user: user-5
content: max函数的定义在哪里？如果需要用到库函数里的，建议引入math.h
user-0 提问: vc++(绿色版)，程序编译没有错误，但是运行只弹出窗口却不能输入

回复:
user: user-0
content: 好的，十分感谢

user: user-1
content: #include<stdio.h> #include<malloc.h> #include<stdlib.h>    typedef struct Node {     char data;     struct Node *next; }NODE,*PNODE; //NODE等价于struct Node，PNODE等价于struct Node *  PNODE creat_linklist(); //创建单链表 PNODE travel_link( PNODE phead); //遍历单链表  int main() {     PNODE phead=NULL;     //PNODE creat_linklist();     phead = creat_linklist();     //PNODE travel_link( PNODE phead);     travel_link(phead); }    PNODE creat_linklist() {     int len; //用来存放有效节点的个数     int i;     char val;     PNODE pnew;//先定义     PNODE phead=(PNODE)malloc(sizeof(NODE));//向系统申请空间，表示头节点     if(phead==NULL)     {         printf("空间分配失败\n");         exit(-1);     }     PNODE ptail = phead;//尾指针，开始指向头节点     ptail->next=NULL;     printf("请输入要生成的链表节点的个数：len=");     scanf("%d",&len); //输入len     getchar();    //for '\n'     for(i=0;i<len;i++)     {         printf("请输入第%d个节点的值：",i+1);         scanf("%c",&val);         getchar();    //for '\n'         pnew=(PNODE)malloc(sizeof(NODE));         if(pnew==NULL)         {             printf("空间分配失败\n");             exit(-1);         }         pnew->data=val;         ptail->next=pnew; //将新节点挂到ptail的next域（将新节点的地址传到上一个节点的next域中）         pnew->next=NULL;         ptail=pnew; //尾节点一直指向新元素，因为插入的新节点即为此刻的尾节点      }      return phead; }   PNODE travel_link( PNODE phead) //遍历单链表 {     PNODE p=phead->next; //指向首节点     while(p!=NULL)     {         printf("%c",p->data);         p=p->next;     }     printf("\n");     return 0; } 供参考～   函数调用有问题～
user-0 提问: hitSSE困难：统计字符

回复:
user: user-1
content: #include <stdio.h> #include <ctype.h> #define BUFFER_SIZE 80 #define COUNT_SIZE 26 int main( ) {     char str[BUFFER_SIZE+1];  //2     int count[COUNT_SIZE]={0}; //2     int i = 0;     gets(str); //2     for(i=0; str[i]!='\0'; i++)  //1     {         if(islower(str[i])) //2             count[str[i]-'a']++;  //4     }      for(i=0; i<COUNT_SIZE; i++) //1     {         if(count[i]>0) //1         {              printf("%c=%d\n", i+'a', count[i]); //2         }     } 	return 0; }

user: user-2
content: #include <stdio.h> #include <ctype.h>  #define BUFFER_SIZE 80 #define COUNT_SIZE 26  int main(void) {     char str[BUFFER_SIZE+1];  //2     int count[COUNT_SIZE]={0}; //2     int i = 0;     //gets(str); //2     fgets(str, sizeof(str), stdin); //2     //for(i=0; str[i]!='\0'; i++)  //1     for(i=0; str[i]; i++)  //1     {         //if ((str[i]>='a') && (str[i]<='z')) //2         if (islower(str[i])) //2             count[str[i]-'a']++;  //4     }      for(i=0; i<COUNT_SIZE; i++) //1     {         //if(count[i]>0) //1         if (count[i]) //1         //{             printf("%c=%d\n", i+'a', count[i]); //2         //}     } } 供参考～
user-0 提问: 图邻接矩阵删除顶点

回复:
user: user-1
content: 没有全部代码，说的都是瞎猜

user: user-2
content: 引用 2 楼 肥牛肉^*^ 的回复:如果这样改，v为3，i＜n-1，假设n为4，那这样for就不循环了，那怎样达到删除的效果？ n为4，v为3，v就是最后一个节点，删除最后一个节点，最后一行一列的关系也没必要往前移了，直接舍弃

user: user-0
content: 引用 1 楼 user-2的回复:代码有问题，像你理解的一样会越界 删除行应该是 for(i=v; i<n-1; i++)//数组删除元素，要把后续的元素往前移  同样的删除列应该是 for(j=v; j<n-1; j++) 如果这样改，v为3，i＜n-1，假设n为4，那这样for就不循环了，那怎样达到删除的效果？

user: user-2
content: 代码有问题，像你理解的一样会越界 删除行应该是 for(i=v; i<n-1; i++)//数组删除元素，要把后续的元素往前移  同样的删除列应该是 for(j=v; j<n-1; j++)
user-0 提问: 大佬求带

回复:
user: user-1
content: Grammar of C++ Statements statement:   labeled-statement  expression-statement  compound-statement  selection-statement  iteration-statement  jump-statement  declaration-statement asm-statement try-except-statement try-finally-statement   labeled-statement:   identifier : statement  case constant-expression : statement  default  : statement  expression-statement:   expressionopt ;  compound-statement:   { statement-listopt }  statement-list:   statement  statement-list  statement  selection-statement:   if  (  expression ) statement  if  ( expression  ) statement else statement  switch  ( expression ) statement  iteration-statement:   while  ( expression ) statement  do statement while  ( expression ) ;  for  ( for-init-statement  expressionopt ; expressionopt ) statement  for-init-statement:   expression-statement  declaration-statement  jump-statement:   break  ;  continue  ;  return  expressionopt ;  goto identifier ;  declaration-statement:   declaration  try-except-statement:   __try compound-statement __except ( expression ) compound-statement  try-finally-statement:   __try compound-statement __finally ( expression ) compound-statement

user: user-2
content: 语句是以;分号为标准的。变量声明需要是以;号结束，因此可以认为是语句；宏定义不一定，头文件还是以分号作为判断吧
user-0 提问: 顺序表的基本操作  ；顺序表的实现

回复:
user: user-1
content: #include <stdio.h> #include <stdlib.h> #include <malloc.h>   #define LIST_INIT_SIZE 100//顺序表存储空间的初始分配量 #define LISTINCREMENT 10//线性表存储空间的分配增量   typedef struct{     int *elem;//存储空间基址     int length;//当前长度     int listsize;//分配存储容量 }SqList;  int InitList_Sq(SqList&L) {     //构造一个空的线性表L     L.elem = (int*)malloc(LIST_INIT_SIZE*sizeof(int));     if (!L.elem)         exit (1);     L.length = 0;     L.listsize = LIST_INIT_SIZE;      return 1; }  int ListInsert_Sq (SqList&L,int i,int e) {     int *newbase;     //在顺序线性表的L中的第i个位置插入新的元素e     if(i<1||i>L.length +1 )         return 0;//i值不合法      if(L.length>=L.listsize ){ //当前储存空间已满，增加分配         newbase=(int*)realloc(L.elem, (L.listsize+LISTINCREMENT)*sizeof(int));         if(!newbase)exit(1);         L.elem  = newbase;         L.listsize += LISTINCREMENT;     }     int *p;     int *q=&(L.elem [i-1]);     for (p=&(L.elem [L.length -1]); p >= q; --p)         *(p+1) = *p;     *q=e;     ++L.length;      return 1; }  int ListDelete_Sq(SqList &L,int i,int &e)//删除第i个位置上的元素,并用e返回 {     if((i<1)||(i>L.length))         return 0;      int *p=&(L.elem[i-1]);     e = *p;     int *q = L.elem+L.length-1;     for (++p;p<=q;++p)         *(p-1)=*p;     --L.length ;     return 1; } int LocateElem_Sq(SqList L,int e,int (*compare)(int,int)) //定位满足compare函数的元素的下标 {     int i=1;     int *p=L.elem;     while(i<=L.length &&!(*compare)(*p++,e)) ++i;     if (i<=L.length) return i;     else return 0; }  int print(SqList L) //遍历打印顺序表中元素 {     for(int i=0;i<L.length ;i++)         printf("%d ", L.elem [i]);     printf("\n");     return 0; }  int main (){      SqList L;//声明一个顺序表     InitList_Sq(L);     //int e[10];     int e;     printf("请输入10位数学号:");      for (int i=0;i<10;i++)     {         //scanf("%d",&e[i]);         scanf("%d",&e); #if 0         L.elem[i] = e;         /*L.elem[i]=i;*/         L.length++; #else         ListInsert_Sq(L, i+1, e); #endif     }     print(L);      ListInsert_Sq (L,L.length+1,8); //在第二个位置插入8     //ListInsert_Sq (L,2,8); //在第二个位置插入8     print(L);      int g;     //ListDelete_Sq(L,2,g); //删除第2个位置上的元素 ，e返回其值     if (ListDelete_Sq(L, L.length,g)) //删除第2个位置上的元素 ，e返回其值         printf("%d\n", g);     print(L); } 做了部分修改，供参考～
user-0 提问: 新手请教大家一个问题：用指针方法，在一个一维数组int a[10]的元素中，查找给定的数，若找到则输出该数，若没找到，输出No

回复:
user: user-1
content: 建议换个程序或者环境，测试运行的时候会报哪里出错，什么错

user: user-0
content: 啊，第几次犯这个错误了每次都没找出来，谢谢了，以后会注意的。

user: user-1
content: scanf("%d",b); 加&号  scanf("%d",&b);
user-0 提问: 数据类型长度与sizeof

回复:
user: user-0
content: 我自己搞错了。确实是32位的。

user: user-1
content: 指针就要加倍，你试试

user: user-2
content: c++ 标准规定int 只保证大于等于32位，并没有说一定是64位。

user: user-3
content: 引用 楼主 无名D小兵的回复:为什么在64位机上，sizeof(int)的值是4而不是8？64位及上int型的长度不是64位吗？ int 长度都是4个字节，64和32位机器一样
user-0 提问: 利用π4=1−13+15−17+…，编程计算π的近似值，直到最后一项的绝对值小于10−4时为止，输出π的值并统计累加的项数

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

user: user-1
content: 供参考 #include<stdio.h> int main() {     double a=1,d=1;     int sign=1,count=1;     while(1)     {         a+=2;         sign*=(-1);         d+=1/a*sign;         count++;         if(1/a<0.0001) break;     }     printf("pi=%lf\ncount=%d\n",4*d,count);     return 0; }

user: user-1
content: a=1001,b=1003退出，但是题目要求最后一项是绝对值小于10-4,所以这个1/a还是要加进结果里面。

user: user-0
content: 但是计算出来的a最后一项是 997 b最后一项是999 c=1/997-1/999 然后 下一次就是 a+4=1001,b+4=1003  b<0.0001 就退出了呀  后面在弄这些不是多余？

user: user-1
content: for结束后加一句 if(1/a<0.0001) d+=1/a; else d=d+1/a-1/b;

user: user-1
content: 最后一项绝对值小于10-4，也就是要计算这一项，函数里面没有计算
user-0 提问: 自定义函数实现四舍五入

回复:
user: user-0
content: 引用 3 楼 自信男孩的回复:楼主想一下a - (int)a >5怎么大于5呢？这个判断就是一个一直假呢 不是应该大于0.5吗？ main函数里的scanf应该是%f，不是f 确实如此，谢谢你

user: user-1
content: 楼主想一下a - (int)a >5怎么大于5呢？这个判断就是一个一直假呢 不是应该大于0.5吗？ main函数里的scanf应该是%f，不是f

user: user-2
content: 恩， 你用的是vs2010吗？  可能要把abs换成fabs

user: user-2
content: 浮点数不是精确的数字吧， 用==或!=是有可能得不到想要的结果。 试试abs(a) < 0.0001这样

user: user-0
content: 引用 2 楼 user-2 的回复:恩， 你用的是vs2010吗？  可能要把abs换成fabs 谢谢你的回复，是vs2010 我看书上说用集成编程工具学不好c语言，是这么回事么？
user-0 提问: 链表储存的一元多项式计算器，进行乘法时，有时会超时，有时能运行出结果，原因可能是啥？救救孩子吧  求助！！！！

回复:
user: user-1
content: #include<stdio.h> #include<stdlib.h> #include<malloc.h>    typedef struct polynode {     int coef;     int exp;     struct polynode *next; }polynode, *polylist;  polylist poly_create(void) {     polynode *rear, *head, *s;      int c, e;      rear = head = (polynode *)malloc(sizeof(polynode));     scanf("%d%d", &c, &e);      while (c) {         s = (polynode*)malloc(sizeof(polynode));         s->coef = c;         s->exp = e;         rear->next = s;         rear = s;         scanf("%d%d", &c, &e);     }     rear->next=NULL;      return(head); }    static void insert_node(polylist phead, polylist new_node) {     polylist pcur, pprev;      pprev = phead;     pcur = phead->next;      while (pcur && pcur->exp != new_node->exp) {         pprev = pcur;         pcur = pcur->next;     }     if (!pcur) {         pprev->next = new_node;         return;     }      pcur->coef += new_node->coef;     free(new_node);     if (pcur->coef == 0) {         pprev->next = pcur->next;         free(pcur);     } }  polylist multyploy(polylist pa, polylist pb) {     polylist pa_node, pb_node, pc_node, pc;     int coef, exp;       pc = (polynode*)malloc(sizeof(polynode));     if (!pc)         return NULL;      pa_node = pa->next;     pb_node = pb->next;      if (!pa_node || !pb_node) {         pc = pa_node ? pa : pb;     }     while (pa_node) {         while (pb_node) {             coef = pa_node->coef * pb_node->coef;             exp = pa_node->exp + pb_node->exp;              pc_node = (polylist)malloc(sizeof(polynode));             if (!pc_node)                 exit(0);             pc_node->coef = coef;             pc_node->exp = exp;             pc_node->next = NULL;              insert_node(pc, pc_node);             pb_node = pb_node->next;         }         pa_node = pa_node->next;         pb_node = pb->next;     }      return pc; }  void free_polylist(polylist phead) {     polylist pdel, pcur;      pcur = phead;      while (pcur) {         pdel = pcur;         pcur = pcur->next;         free(pdel);     } }  static void show_polylist(polylist phead) {     if (!phead)         return;      polylist pcur = phead->next;      while(pcur) {         printf("%d", pcur->coef);         printf("*x^%d", pcur->exp);         if (pcur->next)             printf(" + ");         pcur = pcur->next;     }     printf("\n"); }  int main(void) {     polylist pa, pb, pc;      pa = poly_create();     //show_polylist(pa);     pb = poly_create();     //show_polylist(pb);     pc = multyploy(pa, pb);      show_polylist(pc);      free_polylist(pa);     pa = NULL;     free_polylist(pb);     pb = NULL;     free_polylist(pc);     pc = NULL;      return 0; }  供参考～

user: user-0
content: 谢谢 才看到