Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: keil开发

回复:
user: user-1
content: RX是什么？另一个线程会设置的变量？为啥不用信号量？

user: user-1
content: 比如sem_wait(X)，在设置RX变量的线程里，RX的TRUE和FALSE分别用sem_post发送不同的信号，这样在sem_wait的地方如果条件暂时不成立就会休眠，比你这样执行循环要少占用多少CPU资源啊！  具体用法请查阅资料，手头没有具体代码。

user: user-0
content: RX是超声波Echo引脚，TX是Trig脚。如果用信号量，那要怎么写？

user: user-2
content: while不符合条件才向下执行是为了等待  数码管频率太低了吧

user: user-0
content: 我在网上找的超声波的等待都是这种方式的，不知道有没有其他的

user: user-3
content: 难道用这种方式实现等待？ 这种方式实现等待真是无语了。。
user-0 提问: 代码

回复:
user: user-0
content: 引用 12 楼 hdt 的回复:[quote=引用 10 楼 qq_25201957 的回复:] 我是从C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src 中去打开puts.c的，并且这种情况下，该.c文件是只读的 甭管它是不是只读，他的代码是如何？如果有代码还不能清楚的了解，建议回炉重修[/quote]  关键就是我不知道怎么看，去找定义找不到,因为是只读模式

user: user-1
content: 引用 10 楼 qq_25201957 的回复:我是从C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src 中去打开puts.c的，并且这种情况下，该.c文件是只读的 甭管它是不是只读，他的代码是如何？如果有代码还不能清楚的了解，建议回炉重修

user: user-0
content: 那如果是这种情况，我想看方法的标准c代码的实现该怎么去看？？？？？

user: user-0
content: 我是从C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\crt\src 中去打开puts.c的，并且这种情况下，该.c文件是只读的

user: user-0
content: 引用 8 楼 hdt 的回复:[quote=引用 6 楼 hdt 的回复:] [quote=引用 4 楼 qq_25201957的回复:]1.首先我知道是宏， 2.检验参数是否合法，如果string为NULL，会进行什么动作？？？ 如果你用的vs，在哪个宏上面点击右键转到定义[/quote] 看来我抢台词了？？[/quote]  选择不了，f12没用，也不能右键转到定义

user: user-1
content: 引用 6 楼 hdt 的回复:[quote=引用 4 楼 qq_25201957的回复:]1.首先我知道是宏， 2.检验参数是否合法，如果string为NULL，会进行什么动作？？？ 如果你用的vs，在哪个宏上面点击右键转到定义[/quote] 看来我抢台词了？？

user: user-2
content: VS IDE中，在不明白的符号上点鼠标右键，选转到定义。

user: user-1
content: 引用 4 楼 qq_25201957的回复:1.首先我知道是宏， 2.检验参数是否合法，如果string为NULL，会进行什么动作？？？ 如果你用的vs，在哪个宏上面点击右键转到定义

user: user-0
content: 引用 3 楼 hou09tian 的回复:_VALIDATE_RETURN是宏， _VALIDATE_RETURN( (string != NULL), EINVAL, _TEOF ); 用来检查string是否是NULL _VALIDATE_RETURN( (format != NULL), EINVAL, -1); 用来检查format是否是NULL  检查完成之后执行什么动作喃?

user: user-0
content: 1.首先我知道是宏， 2.检验参数是否合法，如果string为NULL，会进行什么动作？？？

user: user-3
content: _VALIDATE_RETURN是宏， _VALIDATE_RETURN( (string != NULL), EINVAL, _TEOF ); 用来检查string是否是NULL _VALIDATE_RETURN( (format != NULL), EINVAL, -1); 用来检查format是否是NULL

user: user-1
content: 这是宏！！！

user: user-4
content: 调用_VALIDATE_RETURN验证参数是否合法
user-0 提问: 怎样执行生成的可执行程序呢？

回复:
user: user-1
content: 执行的方式是没错的，问题可能出在程序启动时，键盘缓冲区还有一个回车符，然后被getchar读到了，误以为已经EOF，所以并没有执行putchar，而是直接返回。

user: user-2
content: 没反应是什么意思？程序运行提示错误了吗？ 程序的逻辑是需要从终端输入数据的。 比如输入abcde 输出abcde linux下使用ctrl+d退出程序，Windows下使用ctrl+z退出程序（其实是退出循环）；
user-0 提问: 相同的程序在不同IDE运行结果不一样，

回复:
user: user-0
content: 输出的横线部分是在main函数里的CreateHead（h）函数下一行 CreateList函数的最后一行确实多余了，多谢指教

user: user-0
content: 谢谢各位的提醒 首先，编译器是相同的，那几个输出语句是开始我为了测试结果用的，正常的输出结果应该是codeblocks上显示的

user: user-1
content: 建议单步跟踪程序运行，观察变量变化情况，很容易分析得出原因

user: user-2
content: 你的代码和你的输出 不匹配  你的代码里 malloc success  指针 后面没有 ______________ 你的代码里输出了  _____ 你没保存吗

user: user-3
content: 首先如果不是程序问题，编译器不会改变运算顺序； 在不同的编译器上，输出的头结点地址不一样很正常（但是一次执行内输出的地址肯定是一样的，因为都是同一个头结点），因为及时是同一个编译器不同时间执行的结果，头结点的地址值可能也不一样。因为头结点的地址是有系统分配的，即malloc函数；  程序没什么问题，你看到的不同编译器编出来的程序输出地址值不一样这个是很正常的。  #include<stdio.h> #include<stdlib.h>  typedef int elemtype;  typedef struct node{     elemtype data;     struct node* next; }Node;  typedef Node* list;  Node* CreateHead(Node* head); void CreateList(Node* head , elemtype d); void PrintList (Node* head);  int main() {     Node* h = NULL;     h = CreateHead(h);     int m;     while(1){         scanf("%d",&m);         if(m==0)             break;         else{             CreateList(h , m);         }     }     PrintList(h);     return 0; }  list CreateHead(Node* head) {     head = (Node*)malloc(sizeof(Node));     if(!head){         printf("error");         exit(0);     }     head->data = 0;     head->next = NULL;     printf("malloc success\n");     printf("%p\n",head);      return head; }  void CreateList(Node* head , elemtype d ) {     Node *tail = head;     while(tail->next!=NULL){         tail = tail->next;     }     Node *p = NULL;     p = (Node*)malloc(sizeof(Node));     if(!p){         printf("error");     }     p->data = d;     tail->next = p;     p->next = NULL;     //tail = p;    /*这句没有意义，因此属于冗余代码*/ }  void PrintList (Node* head) {     printf("%p\n",head);     Node *p = head->next;     while(p!=NULL){         printf("%d\n",p->data);         p = p->next;     } }

user: user-4
content: 无论什么编译器也不存在改变程序的顺序结构吧。

user: user-0
content: 只是，，，，，想问为何执行顺序不同，相同的编译器... 而且我也知道头节点地址会不同，因为每执行一次程序，头节点就必须要重新申请一次...
user-0 提问: 请教一点传参的知识。求大手子解答

回复:
user: user-1
content: 可以传文件名进去。

user: user-2
content: char* Get_Filex_MD5(int x){ //获取1.sql的md5值   char capBuf[64] = {0};   static char tabBuf[64] = {0};   FILE *fp = NULL;   if (x == 0){     sprintf(capBuf,"md5sum /mnt/hd1/ud.sql");   } else{     sprintf(capBuf, "md5sum /mnt/hd1/%d.sql", x);   }   fp = popen(capBuf, "r");   while((fgets(tabBuf, sizeof(tabBuf), fp))!=NULL){   }   pclose(fp);   return tabBuf; }

user: user-0
content: 引用 1 楼 user-2 的回复: char* Get_Filex_MD5(int x){ //获取1.sql的md5值   char capBuf[64] = {0};   static char tabBuf[64] = {0};   FILE *fp = NULL;   if (x == 0){     sprintf(capBuf,"md5sum /mnt/hd1/ud.sql");   } else{     sprintf(capBuf, "md5sum /mnt/hd1/%d.sql", x);   }   fp = popen(capBuf, "r");   while((fgets(tabBuf, sizeof(tabBuf), fp))!=NULL){   }   pclose(fp);   return tabBuf; }    真的谢谢您，调试了一下没有问题，也学到了。感激不尽
user-0 提问: 为何字符串不能在其中某处赋值‘\0’结束字符串？

回复:
user: user-1
content: 字符串是以   ‘\0’  结束的，‘\0’ 前面是字符串，你赋完值后要在后面加上 ‘\0' 才可以，不然识别不了

user: user-2
content: 简单来说就是后面的字符程序都不管了

user: user-3

user: user-4
content: 可以赋值的。 不过这是结尾标志。 当你赋值 0 的话，字符串就在这里被截断了。 所以当你需要截断的话，可以这样设置。 比如，先在某个位置赋值 0，然后 strcpy，然后恢复之。  字符串和字符数组是两个概念。字符串是以 0 为结尾的，而字符数组需要长度的。 BSTR 就可以包含 0 的。

user: user-5
content: 字符数组在栈上，所以可以。 直接用引号是在常量区，改不了。 用malloc是在堆区，也可以改。 ‘\0'结束字符只是个协议，叫做“C风格的字符串”。

user: user-0
content: orz

user: user-6
content: 其余字符仍然存在于内存中，只是输出这个字符串时或使用大多数字符串API时，程序都只判断到\0位置，后面内容是什么已经无所谓了

user: user-7
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！   其实电脑开机后物理内存的每个字节中都有值且都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

user: user-8
content: 字符串不能随意某处赋值，是因为字符串是常量，不可以修改； 字符数组是可读可写，所以可以随意赋值'\0'，赋值之后，%s输出时，后面的字符不输出；因为遇到'\0'就已经停止输出了。 不理解的地方可以搜一下这方面的知识

user: user-9
content: 《深入理解C指针》
user-0 提问: 关于fastcall和stdcall

回复:
user: user-1
content: 找到原因了 https://stackoverflow.com/questions/13089752/why-should-i-not-use-fastcall-instead-the-standard-cdecl

user: user-2
content: 对，既然是调用约定就是两方的问题

user: user-3
content: 但是不省寄存器啊。 这些都是有历史渊源的。那时候资源紧张，所以在不同的场合才需要不同的约定。 现在 x64 的程序几乎都不需要了。

user: user-4
content: 同一个编译器下，完全可以替代。如果不同呢？比如vc，fastcall用到了两个寄存器，但bc，却用了3个 而且你如果查了资料，应该知道win32api,基本是stdcall的，为什么呢？ 想明白这一点，就应该清楚了。

user: user-0
content: 引用 8 楼 FancyMouse 的回复:[quote=引用 7 楼 baidu_20341663 的回复:] 但是为什么放着寄存器传值不用，用栈传值呢？相比于寄存器传值，栈传值速度慢而且占内存 只有寄存器本来不用的时候才快。寄存器在用的时候，你要先保存老数据，再把函数参数拷上去，函数调用完了再要把老数据拷回寄存器，这更慢。32位的时代通用寄存器本来就没几个，不可能因为你这个fastcall而让整个函数不用那两个寄存器的。[/quote]1.fastcall速度快是因为没那么多压栈出栈，少了一些寻址的过程，不是因为mov指令。2.就算是stdcall，也会把数据放到那几个寄存器里，编译器自己会平衡寄存器的使用。不管用不用fastcall那几个寄存器都会使用。所以我还是觉得fastcall可以取代stdcall/

user: user-5
content: 原始社会遗留下来的罢了， 那时候各种不同的语言， 用着各种不同的调用约定， x86 不幸的要兼容几十年前的代码， 就搞出各种飞机 ...

user: user-6
content: 引用 7 楼 baidu_20341663 的回复:但是为什么放着寄存器传值不用，用栈传值呢？相比于寄存器传值，栈传值速度慢而且占内存 只有寄存器本来不用的时候才快。寄存器在用的时候，你要先保存老数据，再把函数参数拷上去，函数调用完了再要把老数据拷回寄存器，这更慢。32位的时代通用寄存器本来就没几个，不可能因为你这个fastcall而让整个函数不用那两个寄存器的。

user: user-0
content: 引用 5 楼 hdt 的回复:引用 4 楼 baidu_20341663 的回复:[quote=引用 3 楼 hdt 的回复:] 不同的编译器的兼容性，如何考虑？几乎所有编译器都支持这3种调用规则吧？ 对，但是对寄存器解释是不一样的 [/quote]但是为什么放着寄存器传值不用，用栈传值呢？相比于寄存器传值，栈传值速度慢而且占内存

user: user-7
content: 调用约定 https://msdn.microsoft.com/zh-cn/magazine/9b372w95.aspx

user: user-4
content: 引用 4 楼 baidu_20341663 的回复:引用 3 楼 hdt 的回复:不同的编译器的兼容性，如何考虑？几乎所有编译器都支持这3种调用规则吧？ 对，但是对寄存器解释是不一样的

user: user-0
content: 引用 3 楼 hdt 的回复:不同的编译器的兼容性，如何考虑？几乎所有编译器都支持这3种调用规则吧？

user: user-4
content: 不同的编译器的兼容性，如何考虑？

user: user-0
content: 引用 1 楼 Saleayas 的回复:但是不省寄存器啊。 这些都是有历史渊源的。那时候资源紧张，所以在不同的场合才需要不同的约定。 现在 x64 的程序几乎都不需要了。 嵌入式程序不就是资源紧张吗？我只想知道为什么有fastcall了为什么还要有stdcall，为什么fastcall能代替stdcall?
user-0 提问: （++i）+（++i）为什么会多一个

回复:
user: user-1
content: 第一次 ++i 的时候 i=2了 第二次 ++i 的时候 i=3了 然后两个i相加，这个时候取的值就是改过之后的3， 3+3=6. 感觉有些编译器是不一样的

user: user-2
content: (++i)+(++i)  i= 2       i=    3   3 + 3

user: user-3
content: 先做括号里面的运算，最后变成3+3

user: user-4
content: 未定义顺序，先执行了两次++i！

user: user-5
content: 这个和编译器相关，不同编译器的结果都可能不同。属于未定义行为，不要再同一行代码中使用多次++

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

user: user-7
content: 顺序点问题，未定义行为  关于C,C++表达式求值顺序  http://bbs.csdn.net/topics/370153775

user: user-8
content: 有歧义性，类似这样的问题有很多，跟编译器有关系，不建议深究，也不建议写这样的代码。比如a = i+++i+++i++;

user: user-9
content: 先执行两次++ 再x2
user-0 提问: 我的最后一个定义函数为什么那个if总是为1啊  那个a不知道是不是指向了另外的地址啊

回复:
user: user-1
content: 建议单步跟踪你程序运行，观察变量变化情况，很容易分析出原因

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

user: user-3
content: 问题出在les函数里的这句： a+=(*(*p+i)+j); 注意，仔细分析这句代码； 是不是应该这样： a += *(*(p+i)+j); 前面都写对了，到这儿写错了。   代码中变量名定义建议做到见名知意： #include<stdio.h> #include<stdlib.h>  void ave(int (*p)[6],int n); void find(int (*p)[6]); void les(int (*p)[6]);  void print_all_info(int (*arr)[6], int size); int main() {     int a[4][6];     int i,j,n;     printf("请输入他们的学号和成绩：");     for(i=0;i<4;i++)     {         for(j=0;j<6;j++)             scanf("%d",&a[i][j]);     }     print_all_info(a, 4);     ave(a,1);     find(a);     les(a);     system("pause");      return 0; }  void print_all_info(int (*arr)[6], int size) {     int i, j;      for (i = 0; i < size; i++) {         for (j = 0; j < 6; j++)             printf("%d  ", arr[i][j]);         putchar(10);     }     putchar(10);  } void ave(int (*p)[6],int n) {     int b=0;     float t=0;     for(int i=0;i<4;i++)         b+=*(*(p+i)+n);     t=b/5;     printf("第一门的成绩为%.2f  \n",t); } void find(int (*p)[6]) {     int t=0;     for(int i=0;i<4;i++)     {for(int j=1;j<6;j++)         {if(*(*(p+i)+j)<60)             t++;         }         while(t>=2)         {             for(int j=0;j<6;j++)                 printf("%d ",*(*(p+i)+j));             putchar('\n');             t=0;         }     } } void les(int (*p)[6]) {     int sum = 0,cnt=0;     float ave = 0;     int i, j;      for(i=0;i<4;i++)     {         for(j=1;j<6;j++)         {             if(*(*(p+i)+j)>=85)             {                 cnt++;             }             sum += *(*(p+i)+j);         }         ave = sum/5;         if(cnt >= 5||(ave>=90))         {             printf("cnt = %d ", cnt);             printf("sum = %d ", sum);             printf("ave = %.2f \n", ave);             printf("这个学生是：%d \n",*(*(p+i)));         }         cnt = 0;         sum=0;     } }

user: user-0
content: 输出为什么是这样

user: user-0
content: 最后一个函数的作用是输出平均成绩在90分以上的学号或者是每门成绩在85分以上的学号
user-0 提问: 递归算法，C语言

回复:
user: user-1
content: for(j=0;j<N;j++) { scanf("%d",&A); }  我眼都看花了，才发现是这里的问题，应该是 for(j=0;j<N;j++) { scanf("%d",&A[j]); } 你的数组都没正确赋值，怎么可能找到最小值哪

user: user-2
content: 单步跟踪程序运行，看是哪一步与你期望的值不一致，分析原因

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

user: user-4
content: 希望你可以自己设置断点调试一下

user: user-5
content: 没啥毛病啊,你再看看
user-0 提问: 写一个函数，用“气泡法”对输入的10个字符按由小到大顺序排序

回复:
user: user-0
content: 嗯嗯，我已经改好了，谢谢你

user: user-1
content: 你都没在主函数调用sort函数，它怎么给你排序，而且你这串代码还有其它的一些问题

user: user-2
content: &a[10] ？
user-0 提问: 遇到一个文件的读写问题，希望大家能帮我看一下，困惑了好久了。

回复:
user: user-0
content: 明白了明白了

user: user-0
content: 谢谢谢谢，ctrl+d,文本已经写入了。还有一个小小的问题，就算printf怎么是执行了两次 打印了两个input出来呀？

user: user-1
content: #include <stdio.h> #include <string.h> #include <errno.h>  int main() {     FILE *fp;     int ch;     fp = fopen("/home/ckw/linuxc/text.txt","w");     if (!fp) {         fprintf(stderr, "%s\n", strerror(errno));         return -1;     }     ch = getchar();     while(ch!=EOF)     {         fputc(ch, fp);         printf("input:\n");         ch = getchar();     }     fclose(fp);     return 0; } 1. 确认文件开始是否成功 2. 输入EOF停止循环；（Linux输入ctrl+D,Windows下输入ctrl+Z)

user: user-2
content: #include<stdio.h>  int main() {     FILE *fp;     int ch;     fp = fopen("/home/ckw/linuxc/text.txt","w");     if (NULL==fp) {         printf("open /home/ckw/linuxc/text.txt for w error!\n");         return 1;     }     ch = getchar();     while(ch!=EOF)     {         fputc(ch,fp);         fflush(fp);         printf("input:\n");         ch=getchar();     }     fclose(fp);     return 0; }
user-0 提问: 新人求助，大婶们可以帮忙看看这个LeetCode上的Runtime Error吗

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

user: user-2
content: 递归层次太深了？注意递归的返回条件

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

user: user-0
content: 引用 2 楼 c464580613 的回复:逻辑上有问题。 1.你的第二层循环，没有每次都把count清零 2. k=dfs? 我觉得是k+=dfs  runtime error好像没看出来。。谢谢，我再调试着看看。第二点由于我传过去的是加了1的k，所以用=没问题。

user: user-0
content: 引用 1 楼 hefashion0190 的回复:这是完整的代码？这是leetcode里面我打进去的代码，main（）函数是题库自带并且没有显示，就没放进来。通过main（）传参数给maxAreaOfIsland(int** grid, int gridRowSize, int gridColSize) 来完成工作。

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

user: user-3
content: 逻辑上有问题。 1.你的第二层循环，没有每次都把count清零 2. k=dfs? 我觉得是k+=dfs  runtime error好像没看出来。。

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  使用命令editbin.exe /STACK:16777216 xxx.exe可以将xxx.exe的默认堆栈大小1MB改为16MB多谢老师的帮助，以前不会用debugger，感觉调试很费劲。今天学会了这个技能后，调试代码舒畅多了！

user: user-4
content: 这是完整的代码？
user-0 提问: 题目及代码如下，有测试点错误，求指出并修改一下代码，使之正确

回复:
user: user-1
content: //////////////////////////////////////////////////////////////////////////////// // 文件名： array_jose.c // 作者：   cfjtaishan // 版本：   1.0 // 日期：   2013-10-31 // 描述：   约瑟夫环, 数组实现； // 历史记录： /////////////////////////////////////////////////////////////////////////////// #include <stdio.h> #include <stdlib.h>  #define OUT_FLAG 7  /*初始化数组*/ int *init_arr(int *a, int len) { 	int i = 0;  	for(; i < len; i++) 		printf("%d ", a[i] = i+1); 	printf("\n");  	return a; }  /*约瑟夫环1*/ void print_out_order(int *a, int len) { 	/*      * num:队列中非0数字的个数      * mark:出列的标记数      * ret:最终剩下的数      * row:换行打印标记      */ 	int num = 0, row = 1, mark = 0, ret; 	int j;  	while(num != 1){ 		num = 0; 		for(j = 0; j < len; j++){ 			if(a[j] != 0){ 				num++; 				mark++; 				ret = a[j]; 			} 			if(mark == OUT_FLAG){ 				printf("%2d%c", a[j], !(row % 10) ? '\n' : ' '); 				a[j] = 0; 				mark = 0; 				row++; 			} 		} 	} 	printf("\n\n--------\"%d\" is the last one!\n", ret); }  /*约瑟夫环2*/ void print_out_order2(int *a, int len) { 	int i, count = 0, rem = len;  	for(i = 0; rem > 1; i++){ 		if(i > (len-1)) 			i = 0; 		if(a[i]){ 			count++; 			if(OUT_FLAG == count){ 				count = 0; 				printf("%d ", a[i]); 				a[i] = 0; 				rem--; 			} 		} 	} 	putchar('\n'); }  int main(void) { 	int len; 	printf("How many people in the queue?\n"); 	scanf("%d", &len);  	int *arr = (int *)malloc(sizeof(int) *len);     if (!arr) {         fprintf(stderr, "malloc error!\n");         return -1;     } 	init_arr(arr, len);  	printf("\nThe order of people quit queue is:\n"); 	print_out_order(arr, len); 	printf("---------proc 2-------------\n");  	int arr2[len]; 	init_arr(arr2, len);  	print_out_order2(arr2, len);      free(arr); 	return 0; } 参考一下吧

user: user-2
content: 搜索“约瑟夫问题”
user-0 提问: C语言在选择排序（由大到小）出现-858993460

回复:
user: user-1
content: 越界后就是随机数了

user: user-0
content: 对，j赋值后还要进行自加运算，谢谢各位大神指导

user: user-0
content: k与j应该相等呀，为什么想x[j]，x[k]表示会出现不同的结果。

user: user-2
content: #include <stdio.h> #include <stdlib.h>  void sort(int x[], int n);  int main(int argc,char *argv[]) {     system("color f0");     int i, *p, a[10];     p = a;     printf("please enter 10 interger numbers:");     for (i = 0; i < 10; i++)         scanf("%d", p++);     p = a;     sort(p, 10);     for (p = a, i = 0; i < 10; i++)     {         printf("%d", *p);         p++;     }     printf("\n");     system("pause");     return 0; }  void sort(int x[], int n) {     int i, j, k, t;     for (i = 0; i < n - 1; i++)     {         k = i;         for (j = i + 1; j < n;j++)             if (x[j] > x[k])                 k = j;         if (k != i)         {             t = x[i];             x[i] = x[k];    /*只需将x[j]改成x[k]就好了*/             x[k] = t;         }     }     return; }   要交换的是i和k下标对应的值

user: user-3
content: 你sort函数中，x[i] = x[j];这句的j已经越界，因为此时j是之前循环之后还加了1的变量，在你程序中为10，x[10]已经越界

user: user-4
content: 第二个for循环少了"{}" #include <stdio.h> #include <stdlib.h>  void sort(int x[], int n); int main(int argc,char *argv[]) { 	system("color f0"); 	int i, *p, a[10]; 	p = a; 	printf("please enter 10 interger numbers:"); 	for (i = 0; i < 10; i++) 		scanf("%d",p++); 	p = a; 	sort(p, 10); 	for (p = a, i = 0; i < 10; i++) 	{ 		printf("%d", *p); 		p++; 	} 	printf("\n"); 	system("pause"); 	return 0; }  void sort(int x[], int n) { 	int i, j, k, t; 	for (i = 0; i < n - 1; i++) 	{ 		k = i; 		for (j = i + 1; j < n;j++) 		{ 			if (x[j]>x[k]) 				k = j; 			if (k != i) 			{ 				t = x[i]; 				x[i] = x[j]; 				x[k] = t; 			} 		} 	} 	return; }

user: user-5
content: 自己设置断点调试一下吧
user-0 提问: 程序运行不出，只输出“please input the exression:”就停止工作，小白想问一下为什么？是中缀表达式求值的程序

回复:
user: user-0
content: 引用 1楼user-1 的回复: 调试的时候，41号这里退出的好的，我知道哪里了，谢谢你

user: user-1
content: 调试的时候，41号这里退出的
user-0 提问: 求问一个差了好半天没解决的问题。。。

回复:
user: user-0
content: 用算法模拟可以么，不用汇编

user: user-1
content: 百度搜索加法器

user: user-2
content: 自己设定变量模拟标志位 还是要用汇编写? 我感觉用c模拟一下就可以吧
user-0 提问: 新手求指教。

回复:
user: user-1
content: #include <stdio.h>   void Display(int n) {     int i;     if(n>0)         Display(n-1);     for(i=1;i<=n;i++)         printf("%d ", n);     printf("\n"); } int main(void) {     int n=4;     Display(n); }

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

user: user-3
content: 把打印放到递归的下面

user: user-4
content: 这样也可以 #include <stdio.h>  void Display(int n) {    int i;     if (n > 0) Display(n - 1);    else return;        for (i = 1; i <= n; i++)       printf("%d ",n);         printf("\n"); }  int main(void) {    int n = 4;    Display(n);    return 0; }

user: user-4
content: 将Display提前即可 #include <stdio.h>  void Display(int n) {    int i;     if (n > 0) Display(n - 1);        for (i = 1; i <= n; i++)       printf("%d ",n);         if (n) printf("\n"); //防止n为0时输出换行 }  int main(void) {    int n = 4;    Display(n);    return 0; }

user: user-0
content: 那for循环怎么用。 我们老师要求用递归

user: user-5
content: 你一定要用递归么。。。可以用俩for循环额
user-0 提问: C语言新手 求大神带

回复:
user: user-1
content: 引用 4 楼 cfjtaishan 的回复:#include<stdio.h> #include<math.h> #include<string.h>  int main() {     char kao[80], dst[80];     printf("请输入字符串\n");     //scanf("%s", kao);   /*去掉&,数组名即地址*/     fgets(kao, 80, stdin);     puts(kao);     int i, k = 0;     int len = strlen(kao);     for (i = 0; i < len; i++)     {         dst[k++] = kao[i];         if (kao[i] == '!')             dst[k++] = '!';              /*         if (kao[i] == '!')         { kao[i]='!!';}         else if (kao[i] == '.')         {kao[i] = '!';}         else if(kao[i] == '#')         {printf("%s\n",kao);break;}         */     }     dst[k] = 0;     puts(dst);     return 0; } 参考一下吧

user: user-2
content: #include<stdio.h> #include<math.h> #include<string.h>  int main() {     char kao[80], dst[80];     printf("请输入字符串\n");     //scanf("%s", kao);   /*去掉&,数组名即地址*/     fgets(kao, 80, stdin);     puts(kao);     int i, k = 0;     int len = strlen(kao);     for (i = 0; i < len; i++)     {         dst[k++] = kao[i];         if (kao[i] == '!')             dst[k++] = '!';              /*         if (kao[i] == '!')         { kao[i]='!!';}         else if (kao[i] == '.')         {kao[i] = '!';}         else if(kao[i] == '#')         {printf("%s\n",kao);break;}         */     }     dst[k] = 0;     puts(dst);     return 0; } 参考一下吧

user: user-0
content: 额  我试过另一个数组 但是不知道是我的方法不对还是怎么了 有错误

user: user-3
content: 找到! 再插入一个!就好了

user: user-4
content: 直接复制到另一个数组里不就好了？
user-0 提问: 浮点数不考虑精度的情况下到底能表达多少位小数点？我读出了1022位

回复:
user: user-1
content: 不考虑精度。。。那读它做什么

user: user-2
content: 引用 4 楼 wqte45 的回复:[quote=引用 1 楼 ckc 的回复:] 能输出这么多位并不代表精度达到了这么多位 你输出一个1+1e-1000试下是不是有这么高的精度  能精确表示的浮点是没有那么多位的  比如 0.5 0.25  1.0   输多少后面都是0    因为其二进制能准确存放在内存中  现在讨论的是  打印出 不能准确用二进制表达的浮点小数  在内存中的完整表达 不考虑精度  就是8字节内存里的数据 有多少打印多少位[/quote] 你似乎没仔细看我的帖子。 我的意思是你试下处理类似1.000000000000000000000000000000000000000000000000000000000000000000000001这样的数据 看看能不能正常处理，甚至把这个数再加上0.00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001这样，看看能不能正常输出，如果可以，那就是精度确实够了，如果不行，那就只是输出了这么多位，实际精度达不到

user: user-3
content: 引用 5 楼 那年那人的回复:[quote=引用 2 楼 paschen 的回复:] DBL_MIN和DBL_MAX只是double能表示的最小与最大浮点数，其次你输出看到的非0数字并不等于代表实际表示到了的位数，double通常能表示的有效位数大约是15位，因为double有52位用于存放尾数，加一个隐含位，共 53个二进制有效位位数，2^53次方有15个十进制位，超出这个范围后面的你看到的都是假的  我前提都说了  不说有效精度 有效精度是指有精确保障的位数， 浮点数本来就不是精确的， 既然能输出了这么多位  就证明在double的8字节内存里。存放的有数据  再次说明  不考虑什么有效无效  现在不是求有效精度 是说double最大能表达多少位  你说的15位那是可以准确表达 无失真的位数  后面的由于精度限制 可能就失真了。但只要有数值 就算是有  我的问题是不考虑精度  能表达的数字是多少位？ 反正是这个变量8字节里输出的  肯定不会输出到后面的字节     [/quote] 那取决于printf的具体实现，而不是double怎么存，你要研究可以单步跟踪到printf里一探究竟

user: user-3
content: 另可参看float.h中的DBL_DIG这个宏定义

user: user-3
content: DBL_MIN和DBL_MAX只是double能表示的最小与最大浮点数，其次你输出看到的非0数字并不等于代表实际表示到了的位数，double通常能表示的有效位数大约是15位，因为double有52位用于存放尾数，加一个隐含位，共 53个二进制有效位位数，2^53次方有15个十进制位，超出这个范围后面的你看到的都是假的

user: user-2
content: 能输出这么多位并不代表精度达到了这么多位 你输出一个1+1e-1000试下是不是有这么高的精度

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

user: user-0
content: 引用 2 楼 paschen 的回复:DBL_MIN和DBL_MAX只是double能表示的最小与最大浮点数，其次你输出看到的非0数字并不等于代表实际表示到了的位数，double通常能表示的有效位数大约是15位，因为double有52位用于存放尾数，加一个隐含位，共 53个二进制有效位位数，2^53次方有15个十进制位，超出这个范围后面的你看到的都是假的  我前提都说了  不说有效精度 有效精度是指有精确保障的位数， 浮点数本来就不是精确的， 既然能输出了这么多位  就证明在double的8字节内存里。存放的有数据  再次说明  不考虑什么有效无效  现在不是求有效精度 是说double最大能表达多少位  你说的15位那是可以准确表达 无失真的位数  后面的由于精度限制 可能就失真了。但只要有数值 就算是有  我的问题是不考虑精度  能表达的数字是多少位？ 反正是这个变量8字节里输出的  肯定不会输出到后面的字节

user: user-0
content: 引用 1 楼 ckc 的回复:能输出这么多位并不代表精度达到了这么多位 你输出一个1+1e-1000试下是不是有这么高的精度  能精确表示的浮点是没有那么多位的  比如 0.5 0.25  1.0   输多少后面都是0    因为其二进制能准确存放在内存中  现在讨论的是  打印出 不能准确用二进制表达的浮点小数  在内存中的完整表达 不考虑精度  就是8字节内存里的数据 有多少打印多少位
user-0 提问: 请问，两种结果为什么不一样？

回复:
user: user-1
content: scanf_s里输入double类型要用 %lf 格式， 而不是%f

user: user-0
content: 得到的i值为32，为什么？

user: user-0
content: 请问，如何让第一种输出我想要的第二中结果？

user: user-2
content: 第一个for循环后变量i为清0，且定义double a[20]未初始化操作，数组内容不确定； 第二个注释掉for循环i从0开始，double a[20]={0.2,0.4,0.3，0.1}这样定义编译器已经将后续数组内容清0.
user-0 提问: 程序改成多个c文件的程序（求指教）

回复:
user: user-1
content: 引用 2 楼 hongwenjun 的回复:小东西三个文件就够 myapp.h   myapp.c  和  main.c 把你的 main 函数，放  main.c 其他东西放 myapp.c    把结构体定义 和函数申明 放 myapp.h 2个 c 文件 include  myapp.h

user: user-2
content: 小东西三个文件就够 myapp.h   myapp.c  和  main.c 把你的 main 函数，放  main.c 其他东西放 myapp.c    把结构体定义 和函数申明 放 myapp.h 2个 c 文件 include  myapp.h

user: user-3
content: 结构体放在函数声明前,放在你这头文件里就行 如果要给结构体单独开个头文件,最好使用预编译头 不使用预编译头就要在头文件里包含头文件
user-0 提问: 51单片机实现电子琴功能为什么显示错误，求大神解答一下，我刚刚学单片机小萌新

回复:
user: user-0
content: 详细怎么做？

user: user-1
content: 循环的语法  do while  一般直接用while 方便

user: user-1
content: 函数没有声明? 或者写到main前面
user-0 提问: 请问一下这个问题。

回复:
user: user-1
content: #include<stdio.h>  static void print(const int *arr, int size); void block_exchange(int *arr, int n, int m);  int main() {     int num_list[20], n, m;     int i;      while (scanf("%d", &n) == 1 && (n < 10 || n > 20))         ;      printf("n = %d\n", n);     i = 0;     while (i < n)         scanf("%d", &num_list[i++]);     printf("i = %d\n", i);      printf("Num list: \n");     print(num_list, n);     printf("Please input a number:");     scanf("%d", &m);     block_exchange(num_list, n, m);     print(num_list, n);      return 0; }  void block_exchange(int *arr, int n, int m) {     if (m >= n / 2)         return;     int *pend, *pstart, *pdst;      pstart = arr;     pend = arr + m;     pdst = arr + n - m;     while (pstart < pend) {         int tmp = *pstart;         *pstart = *pdst;         *pdst = tmp;         pstart++;         pdst++;     } }  static void print(const int *arr, int size) {     int i;      for (i = 0; i < size; i++)         printf("%d  ", arr[i]);     putchar(10); }
user-0 提问: 求大神帮小弟解惑，c中的字符数组放入顺序串之后，顺序串的data数据变为乱码

回复:
user: user-0
content: 谢谢各位老铁答疑

user: user-1
content: 在StrAssign函数内部这样写 for(i=0;a[i]!='\0';++i) {    s.data[i]=a[i]; } s.data[i]='\0'; s.length=i;

user: user-2
content: A2.data不是不对，是你打断点的位置决定的，你打的断点为StrAssign(A2,B)，这行代码还没有执行，所以结果导致A1与A2不同。 此外，s.length的长度没错，但是最后的‘\0’应该需要添加，出现“烫”应该是没有控制好结束符。

user: user-0
content: 主要是A1.data没出错，但是A2.data就出乱码了

user: user-3
content: 应该是缺少字符串结束标记'\0'，看一下循环输入后有没有加上这个标记。
user-0 提问: 数据结构（C语言版）n*n的稀疏矩阵A采用三元组表示，设计一个程序实现如下功能：

回复:
user: user-1
content: CreatMat(A, a);与CreatMat(B, b);并没有起到任何作用，因为你的变量是按值传递的，函数中的形参只是实参的复制品，函数结束后实参并没有任何改变，你需要传递指针，如果是C++，可以按引用传递

user: user-0
content: 引用 1 楼 user-1的回复:CreatMat(A, a);与CreatMat(B, b);并没有起到任何作用，因为你的变量是按值传递的，函数中的形参只是实参的复制品，函数结束后实参并没有任何改变，你需要传递指针，如果是C++，可以按引用传递 全都改成指针吗 其实我不太懂这个，有时候程序里面要用“.”有时候又要用“–>”前面要用“*”定义，不知道为什么
user-0 提问: 如何得出此段运动的时间

回复:
user: user-1
content: 引用 3 楼 arpnet99 的回复:连个说明不都没有，这些变量是什么意思呢？  公式：t = （（Vt-V0））/ a 正确、代码这么改就行、结贴吧

user: user-2
content: 引用 3 楼 arpnet99 的回复:连个说明不都没有，这些变量是什么意思呢？  公式：t = （（Vt-V0））/ a 厉害了

user: user-3
content: 这主要是数学问题，不知你程序里的变量表示什么，时间就是速度除以加速度或者位移除以速度，复杂的需要自己推导下

user: user-4
content: 在该段程序开始是加 clock(),结束时加CLOCK()，用结束时间 - 开始时间   单位ms

user: user-5
content: 连个说明不都没有，这些变量是什么意思呢？  公式：t = （（Vt-V0））/ a

user: user-6
content: 没明白啥意思…

user: user-0
content: 坐等！！！！！！！
user-0 提问: 求一个算法，矩阵

回复:
user: user-1
content: 给你个c的 #include<stdio.h>  #define N 20  int main() { 	int i = 0, j = 0; 	int ary[N][N] = {0}; 	for (i = 0; i < N; i++) /*赋值*/ 	{ 		for (j = 0; j <= i + 1; j++) /*倒序*/ 		{ 			ary[i][j] = i - j + 1; 		}  		for (j = i + 1; j < N; j++)/*正序*/ 		{ 			ary[i][j] = j + 1; 		} 	}  	for (i = 0; i < N; i++) /*打印*/ 	{ 		printf("\n"); 		for (j = 0; j < N; j++) 		{ 			printf("%d ", ary[i][j]); 		} 	} 	getchar(); 	return 0; }

user: user-2
content: 提示 第N行的，前N个数倒序。。。

user: user-3
content: #include "stdafx.h" #include <iostream> #include <string>  using namespace std;  int _tmain(int argc, _TCHAR* argv[]) { 	int n, add = 0; 	int a[20][20]; 	cout << "输入方阵边长："; 	cin >> n; 	for (int i = 0; i < n; i++) 	{ 		for (int j = 0; j<n; j++) 		{ 			if (i == 0) 				a[i][j] = j + 1; 			else 			if (i - j>= 0) 				a[i][j] = i- j + 1; 			else 				a[i][j] = j + 1; 		} 	}  	for (int i = 0; i < n; i++) 	{ 		for (int j = 0; j < n; j++) 			cout << " " << a[i][j] << "\t"; 		cout << endl; 	} 	//cout << "********************\n"; 	for (int i = 0; i < n; i++) 		cout << "***\t"; 	cout << "\n\n" << "反对角线数字：\n";  	for (int i = 0; i <n ; i++) 	{ 		cout << a[i][n - i - 1] << "\t"; 		add += a[i][n - i - 1]; 	} 	cout << "\n\n" << "反对角线数字和："; 	cout << add << "\n\n"; 	system("pause"); 	return 0; }

user: user-4
content: =1+2+3....20
user-0 提问: 求大神帮忙看一下问题在哪里？

回复:
user: user-1
content: 楼主的代码不是C语言的吧，很明显不符合C语言的语法；C++也不是 这是什么语法？

user: user-2
content: 调试运行也是门最基本的IT技术
user-0 提问: 关于流缓冲区定位的问题。。。

回复:
user: user-1
content: 提醒：fseek是开源的，参考C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\fseek.c

user: user-2
content: 个人认为：fseek是修改FILE结构里的文件位置（地址偏移），而不是setvbuf设置的buf中的位置

user: user-3
content: 去掉这一句试试看  /*此时buf内容为 'xxxx', 一切正常*/     fputs(buf, stdout);
user-0 提问: 求教c语言的编程问题

回复:
user: user-1
content: #include <stdio.h> #include <math.h>  int is_prime(int n);  int main(void) {     int x, i;     //int judge;     int sum = 0;     int n, m;      scanf("%d %d", &n, &m);      if (n == 1)         sum += 2;     i = 1;     x = 3;     while (1) {         if (is_prime(x)) {             if (i >= n && i <= m)                 sum += x;             else if (i > m)                 break;             i++;         }         x += 2;     }      printf("%d\n", sum);      system("pause");      return 0; }  int is_prime(int n) {     int len = sqrt(n), i;      for (i = 2; i < len + 1; i++)         if (n % i == 0)             break;      if (i >= len + 1)         return 1;      return 0; } 参考一下吧

user: user-2
content: 初始化c = 0 n++逻辑错误  仅供参考  #include <stdio.h>  int main(void) {     int x, i;     int judge;     //int c = 1, sum = 0;     int c = 0, sum = 0;     int n, m;     x = 2;      scanf("%d %d", &n, &m);      if (0 < n && n <= m && m <= 200)     {         while (c <= 200)         {             judge = 1;             for (i = 2; i < x; i++)             {                 if (x % i == 0)                 {                     judge = 0;                 }                 break;             }             if (judge == 1)             {                 //if (c >= n && n <= m)                 if (c >= n && c <= m)                 {                     sum = sum + x;                     //n++;                 } 	        c++;              }             x++;         }     }     else     {         return 0;     }     printf("%d\n", sum);      system("pause");      return 0; }

user: user-3
content: if (c >= n && n <= m)                 {                     sum = sum + x;                     n++; //这里的n++是要干嘛                 }
user-0 提问: devc++出现的错误

回复:
user: user-1
content: #include<iostream> #include<vector> #define MAX 2 #include <limits> using namespace std;  int n = 3; const double dist[3][3]={0,1,2, 					     1,0,3, 					     2,3,0};   double shortestPath(vector<int>& path,vector<bool>& visited,double currentLength){ 	if(path.size() == n) 		return currentLength + dist[path[0]][path.back()]; 	double ret = 500; 	for(int next=0;next<n;next++){ 		if(visited[next]) 			continue; 		int here = path.back(); 		path.push_back(next); 		visited[next] = true; 		double cand = shortestPath(path,visited,currentLength+dist[here][next]); 		 		ret = min(ret,cand); 		visited[next] = false; 		path.pop_back();  	} 	return ret; }    int main() {	  	vector<int> path; 	vector<bool> visited(3,false); 	double currentLength = 0; 	double a = shortestPath(path,visited,currentLength); 	cout<<"最短距离为:"<<a<<endl;  	return 0; }  我的也有同样的问题

user: user-2
content: #include <stdio.h> #include <time.h> #include <stdlib.h>  int main(void) {    int face, roll, frequency[6000] = { 0 };    srand(time(NULL));        for (roll = 1; roll <= 6000; roll++)    {       face = rand() % 6000; //防止数组下标越界       frequency[face] += 1;    }     for (face = 1; face <= 6; face++)    {       printf("%d %d\n", face, frequency[face]);    }    return 0; }

user: user-2
content: #include <stdio.h> #include <time.h> #include <stdlib.h>  int main(void) {    int face, roll, frequency[6000] = { 0 };    srand(time(NULL));        for (roll = 1; roll <= 6000; roll++)    {       face = rand() % 6000; //防止数组下标越界     frequency[face] += 1;    }     for (face = 1; face <= 6; face++)    {       printf("%d %d\n", face, frequency[face]);    }    return 0; }

user: user-3
content: 引用 2 楼 das白的回复:roll 到6000一定会越界 楼上正解.. 可能会

user: user-3
content: roll 到6000一定会越界

user: user-4
content: 潜在frequency越界访问 frequency[face]+=1;
user-0 提问: 这个正则表达式怎么写

回复:
user: user-0
content: 引用 6 楼 user-2 的回复:我在网站上试的，http://tool.oschina.net/regex/ 串：SSSaaaaaaaaaaEEEaaaaaaaaaaaaEEEaaaaaaaaaaa 表达式：SSS.*?EEE 结果：SSSaaaaaaaaaaEEE  表达式：SSS.*EEE 结果：SSSaaaaaaaaaaEEEaaaaaaaaaaaaEEE ///////////////////////////////////////////////////// PS：你可以搜以下贪婪模式、我写的不一定对、网站的结果也不一定。 我弄出来了， /SSS.\{-}\zeEEE \{-}  -- 去掉贪婪模式 \ze	Matches at any position, and sets the end of the match there: The 	previous char is the last char of the whole match. |/zero-width| 	Can be used multiple times, the last one encountered in a matching 	branch is used. 	Example: "end\ze\(if\|for\)" matches the "end" in "endif" and 	"endfor"

user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549  VIM的一些正则表达式功能没有出现在这个文档里，对JavaScript还是不错的。

user: user-1
content: 正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549

user: user-2
content: 我在网站上试的，http://tool.oschina.net/regex/ 串：SSSaaaaaaaaaaEEEaaaaaaaaaaaaEEEaaaaaaaaaaa 表达式：SSS.*?EEE 结果：SSSaaaaaaaaaaEEE  表达式：SSS.*EEE 结果：SSSaaaaaaaaaaEEEaaaaaaaaaaaaEEE ///////////////////////////////////////////////////// PS：你可以搜以下贪婪模式、我写的不一定对、网站的结果也不一定。

user: user-0
content: 引用 4 楼 user-2 的回复:/SSS.*?EEE  正则学过，但是没啥机会用。 默认是“贪婪模式”，你可以搜以下，感觉是这个问题。加？试试。  没匹配上任何东西啊。

user: user-2
content: /SSS.*?EEE  正则学过，但是没啥机会用。 默认是“贪婪模式”，你可以搜以下，感觉是这个问题。加？试试。

user: user-0
content: 引用 2 楼 user-2 的回复:并不需要正则 分别查找http和rtmp，然后比较以下出现的位置就可以了  问题再简化一下： 下面这一行， 如何匹配住从SSS到第一个EEE之前的内容， SSSaaaaaaaaaaEEEaaaaaaaaaaaaEEEaaaaaaaaaaa 我用/SSS.*EEE 总是匹配住了开头到第二个EEE的内容。

user: user-2
content: 并不需要正则 分别查找http和rtmp，然后比较以下出现的位置就可以了

user: user-0
content: vim里想选定一些内容删除，半天搞不出来啊
user-0 提问: c语言指针地址问题

回复:
user: user-1
content: 是输出格式的问题么 %s  c

user: user-2
content: %s是输出或输入字符串，字符串那么就至少一个字符，即空串；输入或输出字符串，即需要提供字符串的首地址，即字符串开始的位置；%c是字符，即字符串中的字符，自然需要加*，加*只是表示第一个字符；若引用后面的字符需要加偏移。

user: user-3
content: %s要求参数是地址 %c要求参数是值

user: user-4
content: test是指针没错，但是它其实有两层含义：一个字符的内存地址，或一个字符串的首地址。所以关键在于输出格式，楼上都说了，%c是字符，此时要输出必须是*test，%s是字符串，则要求给出的是字符串首地址，即test。按整型数输出test的话则是地址的值。

user: user-5
content: 基础不扎实，再复习一下指针、字符串指针

user: user-6
content: 想要输出指针地址用%p

user: user-7
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

user: user-8
content: 楼主基础知识不扎实啊。 test是一个指针，在这里是字符串指针。 因此，test的值是字符串第一个字符的地址。 test直接输出它的值，是一个地址，字符串的地址。 *test，*是取值，取指针指向的内存地址中存储的值，所以运算结果是取到字符串的第一个字符 下面解答你的问题： 第一个：因为格式控制中用了%s，这是输出字符串用的，这时候printf函数需要你传递一个指向字符串的指针，你的test不正好就是么。其实它内部你可以这样理解， for(;*test!=0;test++)  putchar(*test); 第二个：前面也说，test是一个指针变量，它是储存内存地址的，然而我们要访问的是这个内存地址中的值，所以需要加星号。

user: user-0
content: 具体结果可以看图
user-0 提问: while循环的输出问题，之中可能是scanf_s的输入问题。有大神帮帮菜鸟新人吗

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

user: user-1
content: 将所有%1d都替换为%ld
user-0 提问: 关于字符数组的问题

回复:
user: user-1
content: 一起写表示的是判断b是否等于后面这些做||运算的结果

user: user-1
content: if(b[i]=='~'||'!'||'@'||'#'||'$'||'%'||'^') 不能这样写，你需要分成多个，if(b[i]=='~'|| b[i] == '!'|| b[i] == '@'|| b[i] == '#'|| b[i] == '$'|| b[i] == '%'|| b[i] == '^')

user: user-2
content: c = strlen(b);  for (i=0;i<c;i++) {      if (b[i] == '~'      || b[i] == '!'      || b[i] == '@'      || b[i] == '#'      || b[i] == '$'      || b[i] == '%'      || b[i] == '^') {          e = e+1;          break;     } }  //---------------------- c = strlen(b);  for (i=0;i<c;i++) {      if (strchr("~!@#$%^",b[i])) {         e = e+1;         break;     } }

user: user-3
content: c = strlen(b);  for(i=0;i<c;i++) {      if(b[i]=='~'|| b[i] == '!'|| b[i] == '@'|| b[i] == '#'|| b[i] == '$'|| b[i] == '%'|| b[i] == '^') {         e = e+1;         break;     } } C语言语法还需要加强学习呀

user: user-4
content: if(b[i]=='~'||'!'||'@'||'#'||'$'||'%'||'^')不能这样比较 应该if(b[i]=='~'||b[i]=='@'。。。。。)分开这样， 你写的比较只会判断第一个是否含有'~'然后因为'@'等的值肯定为真所以e都会+1；
user-0 提问: 安装codeblocks 出现Unexpected characters following option 'd'

回复:
user: user-1
content: CodeBlocks SVN 11112版闪亮登场 双11特别版...  百度网盘 https://pan.baidu.com/s/1nvqVAyd

user: user-2
content: 缺少codeblocks environment ，得下载安装
user-0 提问: 求助!  奇怪的C语言计算偏差  求大佬解决

回复:
user: user-0
content: 就是第一次循环结束时的x值时对的，，但是当这个x值进入第二次循环的时候，得出的就不对了。。 然而把第一次循环得到的x值手动赋值给x，得到的是正确的。。。可以理解为电脑自动循环时得到的是错的。。。人工手动一次次计算。。是对的。。。。

user: user-1
content: 设置断点调试一次啊 看那不一样

user: user-0
content: 可是为什么 赋初值就可以了呢

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

user: user-0
content: 好像是的  谢谢啦  看来以后要多注意。

user: user-3
content: 引用 10 楼 qq_34636559 的回复:但是直接用for 就不行了 你看看  那是你程序的问题，你看看fx的值运行中不是也发生变化了么，把fx=0和fx1=0初始化放在循环中你再试试，结果就一样了

user: user-0
content: 但是直接用for 就不行了

user: user-0
content: 对 其他的不变  只把第一次得到的x值 替代原来的0.08   这样可以的得到正确答案

user: user-3
content: 除了x的值变化其他的不变么？

user: user-3
content: 引用 6 楼 qq_34636559 的回复:那有没有什么办法解决呢 你所说的赋值是不是再把这行代码再执行一边呀？  int i,n;double fx=0;double x=0.08;//赋初值给x

user: user-0
content: 那有没有什么办法解决呢

user: user-3
content: 引用 4 楼 qq_34636559 的回复:就是第一次循环结束时的x值时对的，，但是当这个x值进入第二次循环的时候，得出的就不对了。。 然而把第一次循环得到的x值手动赋值给x，得到的是正确的。。。可以理解为电脑自动循环时得到的是错的。。。人工手动一次次计算。。是对的。。。。 不一样，因为精度问题，因为浮点类型的精度是最多能有7位有效数字，但绝对能保证的为6位，如果超过这个数据进行运算后，会自动进行省略小数点后的位数，所以导致第二遍循环的不准确。
user-0 提问: 如何读取不规则TXT数据

回复:
user: user-1
content: 仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8

user: user-2
content: 简单的说，不能。  看你的环境，如果有类似于getline的函数最好，读第一行后丢弃直接从第二行开始处理即可。取第几列，你要按一定格式来分割这一行，自己处理了。

user: user-3
content: fscanf("%d %d %d %d %lf\n", &frame, &near, &echo, &dbchange, &real);  参考一下吧

user: user-3
content: 可以使用fscanf/fprintf函数对文件进行读写；跳过首行，第一行可以考虑用fgets，下面的就是用fscanf读取，一次读一行

user: user-4
content: 挺规则的数据。 1.可以每次读一行，然后用正则去抓取数据，至于是所有列还是特定列，取决于你的正则表达式 2.还是每次读一行，然后自己撸代码抓取数据

user: user-3
content: 引用 6 楼 zhuimengdeluntai 的回复:[quote=引用 3 楼 cfjtaishan 的回复:] fscanf("%d %d %d %d %lf\n", &frame, &near, &echo, &dbchange, &real);  参考一下吧 没法做到每行之读前5个数[/quote] 怎么做不到？ 还有你的文件里有*吗？这些也是文件的内容吗？

user: user-0
content: 引用 1 楼 ColorfulCode 的回复:挺规则的数据。 1.可以每次读一行，然后用正则去抓取数据，至于是所有列还是特定列，取决于你的正则表达式 2.还是每次读一行，然后自己撸代码抓取数据 具体怎么写？没用过正则，求指导

user: user-0
content: 引用 3 楼 cfjtaishan 的回复:fscanf("%d %d %d %d %lf\n", &frame, &near, &echo, &dbchange, &real);  参考一下吧 没法做到每行之读前5个数
user-0 提问: 用来测试程序的一小段计时函数，没找到问题，可否帮忙一下？

回复:
user: user-1
content: 看括号的化可以选中括号，然后按ctrl+]键，这样就可以帮你找到配对的括号啦，如果找不到就说明没有配好，一个小方法。

user: user-2
content: 偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

user: user-3
content: printf语句括号不对称，改成：printf("time=%f\n", (double)(end - start) / CLK_TCK);

user: user-4
content: #include<stdio.h> #include<time.h>  void main() {     int i=100,sum=0;     clock_t start,end;     start = clock();     for(i=0;i<1000;i++)     {         sum=sum+i;     }     end = clock();     printf("time=%lf\n",(double)(end-start)/CLK_TCK); } 两个问题： 1. printf中缺少一个左括号； 2. double输出格式应该是%lf

user: user-5
content: 你括号都没配对啊

user: user-6
content: printf("time=%f\n",(double)end-start)/CLK_TCK);   少一个括号吧
user-0 提问: 错哪了

回复:
user: user-1
content: c没有初始化，是随机值，那么直接putchar();可能输出随机的字符； 另外，通过putchar(c)也能发现每次输入之后回车都会输出一个空白行，那是因为换行符也赋值给了c。

user: user-2
content: 初始化c 多加一个getchar吸收回车  	char c = '\0'; 	printf("\n Please input a string ended with $:\n"); 	do { 		putchar(c); 		c = getchar(); 		getchar(); 	} while (c != '$');

user: user-3
content: 同上，变量未初始化就使用，危害很大，注意编译告警。

user: user-4
content: 字符要赋初值

user: user-5
content: char c='k';类似于这种，给c赋一个初值，不然putchar(c);不知道输出什么呀

user: user-6
content: #include"stdio.h"改为#include<stdio.h>吧

user: user-7
content: 题目要求是什么，我这里把void变成int编译成功后结果是对的感觉
user-0 提问: 求助程序停止工作 C语言

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

user: user-0
content: 引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include<stdlib.h> typedef struct huftree{     int weight;     int Plink,Llink,Rlink; } *HFT,Tnode; typedef struct hufcode{     int star;     int symbol;     int bits[5]; } *HFC,Cnode;  void intilTree(int *w,int n,HFT ht,HFC hc){     int i;     for(i=1;i<n+1;i++){         ht[i].Llink=0;         ht[i].Plink=0;         ht[i].Rlink=0;         ht[i].weight=w[i];      }     for(;i<2*n;i++){         ht[i].Llink=0;         ht[i].Plink=0;         ht[i].Rlink=0;         ht[i].weight=0;     }  }//intil main(){     HFT ht;     HFC hc;     int n;     int *w;     int i=0;     int w0;     int m;     printf("shuru N\n");     scanf("%d",&n);     m=2*n-1;     w=(int*)malloc((n+1)*sizeof(int));     ht=(HFT)malloc((m+1)*sizeof(Tnode));     hc=(HFC)malloc((n+1)*sizeof(Cnode));      for(i=1;i<n+1;i++){         printf("第%d个权值\n",i);         scanf("%d",&w0);         w[i]=w0;     }     intilTree(w,n,ht,hc);     printf("helloworld!\n");     for(i=1;i<=m;i++){         printf("%d   %d   %d  %d\n",ht[i].weight,ht[i].Llink,ht[i].Rlink,ht[i].Plink);     } } 如上的代码； 主要改一下一条代码语句的位置即可。即     scanf("%d",&n);     m=2*n-1; m = 2 * n -1;需要放在scanf之后，不然，n是随机值（可能很大，导致输出时越界，出现楼主的停止运行），那么m = 2 * n -1也会变得很大； 所以，m = 2 * n -1需要放在scanf之后，这样n确定大小了，m的值也会确定大小了。  谢谢谢谢 牛逼牛逼！！！！！！ 找了好久好久   都快崩溃了，原来问题出在这

user: user-2
content: #include<stdio.h> #include<stdlib.h> typedef struct huftree{     int weight;     int Plink,Llink,Rlink; } *HFT,Tnode; typedef struct hufcode{     int star;     int symbol;     int bits[5]; } *HFC,Cnode;  void intilTree(int *w,int n,HFT ht,HFC hc){     int i;     for(i=1;i<n+1;i++){         ht[i].Llink=0;         ht[i].Plink=0;         ht[i].Rlink=0;         ht[i].weight=w[i];      }     for(;i<2*n;i++){         ht[i].Llink=0;         ht[i].Plink=0;         ht[i].Rlink=0;         ht[i].weight=0;     }  }//intil main(){     HFT ht;     HFC hc;     int n;     int *w;     int i=0;     int w0;     int m;     printf("shuru N\n");     scanf("%d",&n);     m=2*n-1;     w=(int*)malloc((n+1)*sizeof(int));     ht=(HFT)malloc((m+1)*sizeof(Tnode));     hc=(HFC)malloc((n+1)*sizeof(Cnode));      for(i=1;i<n+1;i++){         printf("第%d个权值\n",i);         scanf("%d",&w0);         w[i]=w0;     }     intilTree(w,n,ht,hc);     printf("helloworld!\n");     for(i=1;i<=m;i++){         printf("%d   %d   %d  %d\n",ht[i].weight,ht[i].Llink,ht[i].Rlink,ht[i].Plink);     } } 如上的代码； 主要改一下一条代码语句的位置即可。即     scanf("%d",&n);     m=2*n-1; m = 2 * n -1;需要放在scanf之后，不然，n是随机值（可能很大，导致输出时越界，出现楼主的停止运行），那么m = 2 * n -1也会变得很大； 所以，m = 2 * n -1需要放在scanf之后，这样n确定大小了，m的值也会确定大小了。
user-0 提问: 为什么这个程序可以在老电脑上运行，但在新的电脑就不行？

回复:
user: user-1
content: 感谢分享

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

user: user-3
content: 学习了

user: user-4
content: 具体是什么错？

user: user-0
content: 问题已经找出：getpixel太浪费时间。 我尝试循环二十次（一开始的两个for循环） 并用time去时间，文字台输出结果为：  也就是说，按照屏幕这个配置（1600*900）， 这两个for（第一二个）所循环的时间为： 1600*900/20*483/1000/60/60约为10 也就是这两个循环需要10分钟才可以结束。 这也是为什么程序思路、逻辑，语法都没错 但是却无法在新的电脑运行的原因：getpixel受设备影响。

user: user-5
content: COLOUR colour[2000][5000];              //为[y][x] 目测这行代码不爽,用new COLOUR[2000][5000] 测试之

user: user-2
content: http://www.easyx.cn

user: user-6
content: /* #include <graphics.h> initgraph 和 putpixel  两个函数 * 这个头文件 和 2个函数，vc编译器不代，应该是网上 从TC下移植过来的，要配置起来才行

user: user-0
content: 求大神帮忙！
user-0 提问: 如何整数转为指数形式

回复:
user: user-1
content: 2楼那样实现就可以的。

user: user-2
content: 其实就是float和double的存储规则，

user: user-3
content: 1楼的转成ｆｌｏａｔ最佳方案。。。话说ｆｌｏａｔ大概不就是这样存储的吗？

user: user-4
content: printf 也可以啊

user: user-5
content: 检查前三位是否>255吧，是取两位存第一个字节，不是则存三位。现在指数部分已确定，存第三个字节。小数部分要简单点的话，就像前面取整数一样取两位或三位当整数一样存第二个字节，读取的时候也当整数读取放小数点后面。

user: user-1
content: 大概思路就像2楼所说 先从10开始尝试去除，接着是100……到得数小于255就停止，这时候除数有几个0指数就是多少，整数除的得数就是整数部分 余数重复这个过程，得数就是小数部分

user: user-6
content: 代码就不给你了，有思路应该很好写。 先从10开始尝试去除，接着是100……到得数小于255就停止，这时候除数有几个0指数就是多少，整数除的得数就是整数部分 余数重复这个过程，得数就是小数部分

user: user-7
content: 将u32转成float类型，这是最简单的方法；
user-0 提问: 数据结构中的typedef问题

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

user: user-2
content: 楼上的高手永远这么犀利。

user: user-3
content: 实际定义了两个，一个是把struct LNode别名为LNode，另一个是把struct LNode*别名为LinkList，也就是说LinkList表示指针struct LNode*

user: user-4
content: 引用 2 楼 zihui0459 的回复:引用 1 楼 hefashion0190 的回复:LinkList代表struct LNode*也就是相当于LNode*这个吧？为什么要改成这样呢？还有把struct LNode 改成LNode不就相当于没改吗?  c语言中，如果没有使用typedef新定义一个类型的话，需要使用struct LNode和struct LNode*，而此时直接使用LNode和LNode *会语法报错。 C++中struct与class关键字一样定义一个类，只不过struct默认访问属性为public，class访问属性为private

user: user-5
content: 因为本来就是要讲链表。而简单的链表数据结构和Node没有什么区别。所以直接用typedef来重命名，这主要是让语义更清晰。

user: user-6
content: LNode 是  struct LNode LinkList 是 struct LNode * LinkList  是为了方便创建结构体指针，你也可以用LNode来创建指针  引用 5 楼 zihui0459 的回复:[quote=引用 4 楼 destory27 的回复:]   LNode 是  struct LNode？ LinkList 是 struct LNode * LinkList  是为了方便创建结构体指针，你也可以用LNode来创建指针用LNode创建结点，LNode*创建结点指针也是没问题的吧？[/quote]  没问题，又是必须写指针为了做复合结构，面试题常见。例子不记得了

user: user-0
content: 引用 4 楼 destory27 的回复:LNode 是  struct LNode？ LinkList 是 struct LNode * LinkList  是为了方便创建结构体指针，你也可以用LNode来创建指针用LNode创建结点，LNode*创建结点指针也是没问题的吧？

user: user-6
content: LNode 是  struct LNode LinkList 是 struct LNode * LinkList  是为了方便创建结构体指针，你也可以用LNode来创建指针

user: user-7
content: LNode是struct LNode的别名； 同理：LinkList是struct LNode *的别名； 别名，就是用别名就是用struct LNode或struct LNode *

user: user-0
content: 引用 1 楼 hefashion0190 的回复:LinkList代表struct LNode*也就是相当于LNode*这个吧？为什么要改成这样呢？还有把struct LNode 改成LNode不就相当于没改吗?

user: user-4
content: LinkList代表struct LNode*