Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C怎么判断或者限制输入的字符串的类型？

回复:
user: user-1
content: asc码呗。

user: user-2
content: scanf的能力有限，你自己把输入的字符检测一下就ok http://www.cplusplus.com/reference/cctype/ type.h库里面常用的字符判断函数，可查阅

user: user-3
content: scanf()的返回值是输入成功的次数，输入的时候会检测类型，如果类型不匹配，就会把字符留在缓冲区里面啊

user: user-4
content: #include <stdio.h> #include <conio.h> int i = 0; char c; void main() {     while (1) {         printf("\nPlease input a number:");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%c",&i,&c)) {             if ('\n'==c) {                 printf("\nThe number is %d.\n", i);                 break;             }         }     }     printf("Press any key to end ...");     getch(); } // //Please input a number:12a // //Please input a number:a // //Please input a number:12 // //The number is 12. //Press any key to end ...

user: user-5
content: 判断输入的字符对应的ascii值是否在48-57之间

user: user-6
content: 这和你贴出来的代码有什么关系？
user-0 提问: double数组的赋值问题，0.2和int相乘赋值到double数值出问题

回复:
user: user-0
content: 引用 2 楼 mcmay 的回复:#include"stdio.h" void main() { int i; double x[21]; for (i = 0; i <= 20;i++) { x[i] = i*0.2; } for (i = 0;i<=20;i++) printf("%d ", x[i]); // 这里要用%f或%g，而不是%d，x[i]是double型的  } 厉害，大神谢谢你！！！！膜拜

user: user-1
content: #include"stdio.h" void main() { int i; double x[21]; for (i = 0; i <= 20;i++) { x[i] = i*0.2; } for (i = 0;i<=20;i++) printf("%d ", x[i]); // 这里要用%f或%g，而不是%d，x[i]是double型的  }

user: user-2
content: 应该是 0  0.2  0.4  0.6 0.8 1.0 依次类推 不知道楼主是否是这样的值
user-0 提问: 【视频资源】c语言全套高清视频打包下载，希望对正在学习c语言的朋友有帮助

回复:
user: user-1
content: 这么多视频没用，随便找个视频入个门，之后就是多看书，多写代码了

user: user-2
content: c语言还是多编程多联系吧
user-0 提问: 关于在VC中直接写内存的问题？？？？

回复:
user: user-1
content: 引用 9 楼 anewbies 的回复:[quote=引用 8 楼 zhao4zhong1 的回复:] MSDN98中的例子walker又名pwalk。完整列出指定进程的内存使用情况，显示进程地址空间内容，装载哪些DLL，代码、数据、堆栈段分配在何处，可以用来检测内存泄漏，监测内存使用。  http://download.csdn.net/detail/zhao4zhong1/3667896 大神，我做任务，绑手机终于弄够8个积份下下来了个这工具，这个工具确实好，但是打开资源管理器，有那么多进程，还有那么多系统进程，我没法一个一个查看倒底占了那些内存啊？ 我现在的问题是：1、在我写一个地址时是不是先要告诉内存管理机制我要改内存，用你提供的API获得相应的权限后才能写内存？2、在没有内存管理机制或者没有虚拟内存机制的情况下，例如一些没有操作系统的嵌入式系统中，我写的语句应该是能执行的？是这样的吗?[/quote] 完全正确。  推荐使用WinHex软件查看或修改硬盘或文件或内存中的原始字节内容，但后果自负。  VMMap 是进程虚拟和物理内存分析实用工具。http://technet.microsoft.com/zh-cn/sysinternals/dd535533

user: user-0
content: 引用 8 楼 zhao4zhong1 的回复:MSDN98中的例子walker又名pwalk。完整列出指定进程的内存使用情况，显示进程地址空间内容，装载哪些DLL，代码、数据、堆栈段分配在何处，可以用来检测内存泄漏，监测内存使用。  http://download.csdn.net/detail/zhao4zhong1/3667896 大神，我做任务，绑手机终于弄够8个积份下下来了个这工具，这个工具确实好，但是打开资源管理器，有那么多进程，还有那么多系统进程，我没法一个一个查看倒底占了那些内存啊？ 我现在的问题是：1、在我写一个地址时是不是先要告诉内存管理机制我要改内存，用你提供的API获得相应的权限后才能写内存？2、在没有内存管理机制或者没有虚拟内存机制的情况下，例如一些没有操作系统的嵌入式系统中，我写的语句应该是能执行的？是这样的吗?

user: user-1
content: MSDN98中的例子walker又名pwalk。完整列出指定进程的内存使用情况，显示进程地址空间内容，装载哪些DLL，代码、数据、堆栈段分配在何处，可以用来检测内存泄漏，监测内存使用。  http://download.csdn.net/detail/zhao4zhong1/3667896

user: user-0
content: 在没有内存管理机制或者没有虚拟内存机制的情况下，我写的语句是不是不会报错的啊？

user: user-0
content: 引用 4 楼 zhao4zhong1 的回复:其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges VirtualQueryEx VirtualProtectEx WriteProcessMemory 是不是先要告诉内存管理机制要改内存，获得相应的权限后才能写内存？

user: user-0
content: 引用 2 楼 majia2011 的回复:那是系统留给自己用的，不是给你的内存，不会让你访问的 那那那一段是可以给用户用用的呢？

user: user-1
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  OpenProcessToken LookupPrivilegeValue AdjustTokenPrivileges VirtualQueryEx VirtualProtectEx WriteProcessMemory

user: user-0
content: 引用 1 楼 u013410838 的回复:addr所指向的那块内存不能访问，不能写数据 可是我查看内存了，那个地址是空的啊，计算机内哪些内存可以改值啊？我试了好几个都不行啊

user: user-2
content: 那是系统留给自己用的，不是给你的内存，不会让你访问的

user: user-3
content: addr所指向的那块内存不能访问，不能写数据
user-0 提问: 二叉搜索树 奇葩错误 

回复:
user: user-0
content: 非常感谢,I see it

user: user-1
content: if(p->Left ==NULL&&p->Right ==NULL)    {             if(p->parent ==NULL){           free(p);           (*root) =NULL;     }  这里造成的结果就是整棵树都不再可以访问。 但是紧接着你后面就通过p访问（P已经被free掉了） 如果你加了else，那么这两部分的代码就不会同时执行，出错的可能就会降低。 不加else，就一定会出错，因为你使用了一个野指针

user: user-2
content: 你整个程序中对一个节点的parent域赋值的地方只有一个就是p->Left=p->parent=p->Right=NULL;  我可以理解你的所有节点的parent域全部都赋值是NULL  所以你代码里面这句 if(p->parent->Left == p) 相当于你访问一个空指针的left，即NULL->left，当然会出问题

user: user-3
content: 因此在else后面的第一个if那里设置断点，然后调试哈！

user: user-3
content: F9-> F5-> F10 == 答案  加了else不出现非法访问是因为 加上else之后后面的代码就不执行了， 所以不会出现错误，不加的话后面的if语句就会执行以下， 也许就是执行if语句的时候出现了非法访问， 因为在else后面的第一个if那里设置断点，然后调试哈！
user-0 提问: 编二叉搜索树 遇到个非凡的错误

回复:
user: user-1
content: void deleteNode(Pnode *root,KeyType key){       Pnode p =NULL,q = NULL;    p = (struct Node*)malloc(sizeof(struct Node));   p = search(*root,key);   if( p == NULL){        printf("不存在该结点 sorry!");   }         if(p->Left ==NULL&&p->Right ==NULL)//估计错误在这   {    //加            if(p->parent->Left == p){    p->parent->Left=NULL;   free(p);   }  else{            p->parent->Right=NULL;    free(p);   }   } }   删除节点的时候为什么还要malloc一个出来呢？

user: user-2
content: 代码错误是什么啊？贴出来看下
user-0 提问: 这个函数调用没有用到参数，那还传参数干什么？

回复:
user: user-1
content: 写代码的人初衷和结果不一致的表现！或者写成带参数接口，在不使用全局变量的情况下也能用一用

user: user-0
content: 谢谢楼上各位大侠的提点，看来学一门语言还会牵涉到语言之外的很多其他知识。学习的过程也就是个不断扩展的过程。

user: user-2
content: 引用 4 楼 supermegaboy 的回复:[quote=引用 3 楼 lm_whales 的回复:] [quote=引用 2 楼 supermegaboy 的回复:] bool ListIsFull(const List * plist) 应该是设计之初的想法，后来实现的时候没有使用，却忘了删掉。但这段代码废话很多，不够简洁，例如这个LitisFull，这样写就行了：   bool ListIsFull(const List * plist)  {     Node * pt = ( Node * )malloc( sizeof( Node ) );     free( pt );     return !pt; }  ++  LitisFull就是检查一下，还有没有内存可以分配，有的话就永远不会满，内存用完了就满了。 这个情况，几乎不会遇到满的情况，满了以后，估计程序啥也干不了了。  满了以后，任何其他分配内存的操作，都几乎不能执行，这样这个程序基本上也就跑不下去了。 对于链表，一般不用判满，除非限制节点数量。 [/quote]  这个ListisFull提不提供均可以，提供的话，遇到无内存可分配时，可通过自定义资源管理模块（C）或new_handler（C++）释放内存。[/quote] 哦，原来还可以这样处理，谢谢

user: user-3
content: 引用 3 楼 lm_whales 的回复:[quote=引用 2 楼 supermegaboy 的回复:] bool ListIsFull(const List * plist) 应该是设计之初的想法，后来实现的时候没有使用，却忘了删掉。但这段代码废话很多，不够简洁，例如这个LitisFull，这样写就行了：   bool ListIsFull(const List * plist)  {     Node * pt = ( Node * )malloc( sizeof( Node ) );     free( pt );     return !pt; }  ++  LitisFull就是检查一下，还有没有内存可以分配，有的话就永远不会满，内存用完了就满了。 这个情况，几乎不会遇到满的情况，满了以后，估计程序啥也干不了了。  满了以后，任何其他分配内存的操作，都几乎不能执行，这样这个程序基本上也就跑不下去了。 对于链表，一般不用判满，除非限制节点数量。 [/quote]  这个ListisFull提不提供均可以，提供的话，遇到无内存可分配时，可通过自定义资源管理模块（C）或new_handler（C++）释放内存。

user: user-2
content: 引用 2 楼 supermegaboy 的回复:bool ListIsFull(const List * plist) 应该是设计之初的想法，后来实现的时候没有使用，却忘了删掉。但这段代码废话很多，不够简洁，例如这个LitisFull，这样写就行了：   bool ListIsFull(const List * plist)  {     Node * pt = ( Node * )malloc( sizeof( Node ) );     free( pt );     return !pt; }  ++  LitisFull就是检查一下，还有没有内存可以分配，有的话就永远不会满，内存用完了就满了。 这个情况，几乎不会遇到满的情况，满了以后，估计程序啥也干不了了。  满了以后，任何其他分配内存的操作，都几乎不能执行，这样这个程序基本上也就跑不下去了。 对于链表，一般不用判满，除非限制节点数量。

user: user-3
content: bool ListIsFull(const List * plist) 应该是设计之初的想法，后来实现的时候没有使用，却忘了删掉。但这段代码废话很多，不够简洁，例如这个LitisFull，这样写就行了：   bool ListIsFull(const List * plist)  {     Node * pt = ( Node * )malloc( sizeof( Node ) );     free( pt );     return !pt; }

user: user-4
content: 写代码的人不知道怎么传参，我猜。
user-0 提问: PE文件头编程的一个错误，求解

回复:
user: user-1
content: 《Windows PE权威指南》

user: user-2
content: e_lfanew

user: user-2
content: 那是相对偏移，不是地址，直接访问，必然会错的

user: user-0
content: 文件能打开，但是加上printf()那句就出错，buffer数组我看过了就是PE文件头
user-0 提问: 如何理解typedef Node * List

回复:
user: user-1
content: 引用 6 楼 mcmay 的回复:谢谢楼上各位的解析。这就是说根据 typedef Node * List 这个定义， List实际上就是个 Node结构体的指针了是吗？但是我在后面的代码中又看到了这样的变量声明和函数参数传递。 List movies;  InitializeList(&movies); 既然根据前面的typedef定义List本来就是一个指针了，也就是说变量movies本身就是个Node结构体指针。那么，为何把它当做函数参数传递时还要用&movies的形式呢？谢谢！ 这种东西通常这么设计，glib里面用来代替throw catch机制：  return_type some_operation_that_may_cause_error(......, error_type** err);  // 调用时 error_type* err = 0; some_operation_that_may_cause_error(...， &err); if (err) {     fprintf(stderr, "error: %s\n", err->message);     exit(1); }

user: user-1
content: 引用 6 楼 mcmay 的回复:谢谢楼上各位的解析。这就是说根据 typedef Node * List 这个定义， List实际上就是个 Node结构体的指针了是吗？但是我在后面的代码中又看到了这样的变量声明和函数参数传递。 List movies;  InitializeList(&movies); 既然根据前面的typedef定义List本来就是一个指针了，也就是说变量movies本身就是个Node结构体指针。那么，为何把它当做函数参数传递时还要用&movies的形式呢？谢谢！ 在初始化函数里传递指针变量的地址，可以设计成这样：如果失败，指针赋0。 当然，这里我看不到设计成这样的必要性，因为返回值也可以。

user: user-2
content: typedef Node * List; //List 定义为指向结构体的指针

user: user-0
content: 谢谢楼上各位的解析。这就是说根据 typedef Node * List 这个定义， List实际上就是个 Node结构体的指针了是吗？但是我在后面的代码中又看到了这样的变量声明和函数参数传递。 List movies;  InitializeList(&movies); 既然根据前面的typedef定义List本来就是一个指针了，也就是说变量movies本身就是个Node结构体指针。那么，为何把它当做函数参数传递时还要用&movies的形式呢？谢谢！

user: user-3
content: 别名，便于修改，移植性好！

user: user-4
content: 类型重定义。有什么不好理解的？

user: user-5
content: 相当于别名

user: user-6
content: 就是 当你定义一个List时， 其实它实际是Node*类型的！ 图个方便

user: user-7
content: 这是定义Node* 为一个新的类型 List
user-0 提问: 函数返回值

回复:
user: user-1
content: int result(int a,int b) {      if(a==b)          return 1;      else          return 0; }

user: user-2
content: if (a == b) return 1; else return 0;  一个分支不给返回值...会被骂的

user: user-3
content: int result(int a,int b) {      if(a==b)          return 1;      else          return 0; }

user: user-4
content: 引用 楼主 u012908190 的回复:#include<stdio.h> int result(int a,int b) {      if(a==b)          return 1; } int main(void) {     int a=1,b=2;     int re=result(a,b);     printf("%d\n",re);     return 0; } 这个程序为什么结果是1？ 貌似返回的是程序里面if语句里面做判断的第一个变量的值 至于为什么

user: user-5
content: 你这个程序编译的时候应该会报一个warning，因为a!=b时你没给出return语句，因此返回值应该是一个随机整形数。你可以尝试把a值改为5，应该输出就会是5了。

user: user-4
content: 引用 7 楼 zgangz 的回复:if的另一个分支你没有指定返回值，此时的返回值行为是无定义的。我们可以通过反汇编来看看函数是怎么处理的，函数的返回值是通过EAX和EDX保存的，其中EAX存低位 result函数的反汇编： 0041BBF0  push        ebp   0041BBF1  mov         ebp,esp  0041BBF3  sub         esp,0C0h   0041BBF9  push        ebx   0041BBFA  push        esi   0041BBFB  push        edi   0041BBFC  lea         edi,[ebp-0C0h]  0041BC02  mov         ecx,30h  0041BC07  mov         eax,0CCCCCCCCh  0041BC0C  rep stos    dword ptr [edi]  0041BC0E  mov         eax,dword ptr [a]       //将变量a的值存入寄存器eax，a的值是1，所以eax的值是1 0041BC11  cmp         eax,dword ptr [b]       //将b和eax比较 0041BC14  jne         result+2Bh (41BC1Bh)  //如果b和eax不相等则跳到41BC1Bh,即往下的第二条指定pop edi 0041BC16  mov         eax,1                               //如果相等将eax的值赋为1,这里即是你指定的return 1 0041BC1B  pop         edi   通过反汇编可以看到，如果a和b不相等，eax并没有被赋值，它的值仍是在进行比较操作时变量a的值，即1，你可以改变变量a的值，会发现只要a和b不相等，函数的返回值总是等于a  上面是vs编译器debug版的结果，如果换成release，情况会不一样，因为编译器进行了优化 gcc编译器在不进行优化的情况下，结果和上述类似  为了代码的健壮性，所以要考虑到每个分支，每个分支都需要有返回值      if(a==b)          return 1;      else          return 0; 学习了！！！

user: user-6
content: if的另一个分支你没有指定返回值，此时的返回值行为是无定义的。我们可以通过反汇编来看看函数是怎么处理的，函数的返回值是通过EAX和EDX保存的，其中EAX存低位 result函数的反汇编： 0041BBF0  push        ebp   0041BBF1  mov         ebp,esp  0041BBF3  sub         esp,0C0h   0041BBF9  push        ebx   0041BBFA  push        esi   0041BBFB  push        edi   0041BBFC  lea         edi,[ebp-0C0h]  0041BC02  mov         ecx,30h  0041BC07  mov         eax,0CCCCCCCCh  0041BC0C  rep stos    dword ptr [edi]  0041BC0E  mov         eax,dword ptr [a]       //将变量a的值存入寄存器eax，a的值是1，所以eax的值是1 0041BC11  cmp         eax,dword ptr [b]       //将b和eax比较 0041BC14  jne         result+2Bh (41BC1Bh)  //如果b和eax不相等则跳到41BC1Bh,即往下的第二条指定pop edi 0041BC16  mov         eax,1                               //如果相等将eax的值赋为1,这里即是你指定的return 1 0041BC1B  pop         edi   通过反汇编可以看到，如果a和b不相等，eax并没有被赋值，它的值仍是在进行比较操作时变量a的值，即1，你可以改变变量a的值，会发现只要a和b不相等，函数的返回值总是等于a  上面是vs编译器debug版的结果，如果换成release，情况会不一样，因为编译器进行了优化 gcc编译器在不进行优化的情况下，结果和上述类似  为了代码的健壮性，所以要考虑到每个分支，每个分支都需要有返回值      if(a==b)          return 1;      else          return 0;

user: user-7
content: 引用 4 楼 tangfengray 的回复: if (a == b) return 1; else return 0;  一个分支不给返回值...会被骂的 我的手下任何if没有对应的else，都会被我骂。
user-0 提问: 关于c语言程序的问题，求好心人帮助

回复:
user: user-1
content: LZ我看不懂   p = DATA + (p-DATA+1)%2; 是什么意思

user: user-2
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-0
content: 谢谢，原来是输入和输出缓冲区的问题

user: user-3
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试是程序员必须掌握的技能之一。

user: user-1
content: 还有LZ不要调用本代码中不需要的头文件，去掉#include <stdlib.h> #include <malloc.h> ，这样将加快代码编译速度和减少生成文件的大小

user: user-1
content: LZ是否应该把_INDUSTRIAL_INFO_ DATA[5]={0}; 改为_INDUSTRIAL_INFO_ DATA[2]={0}; 这样将节省3个_INDUSTRIAL_INFO_空间

user: user-3
content: 引用 6 楼 u014724273 的回复:[quote=引用 1 楼 zhao4zhong1 的回复:] 在每个最后不带\n的printf后面加fflush(stdout); 为什么是不带\n[/quote] 带\nprintf底层会自动fflush(stdout);

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 为什么是不带\n

user: user-0
content: 指针对应的是一个数组，指向数组下一个元素，当指针在在数组末尾时，指向数组第一个元素； 因为是2个元素的数组，所以%2；
user-0 提问: 如何将很多文件封装成一个文件，扩展名任意，封装后的文件可供程序调用其中的资源，也就是原来文件夹内的文件是可用的。 

回复:
user: user-1
content: 为什么不WinExec("c:\\program files\winrar\rar.exe a -r d:\\mypack.mpk d:\\mydir\\*.*",SW_HIDE);呢

user: user-1
content: 提醒：指针在内存中是内存地址，在文件中是相对文件开头的偏移量。 fopen(...,"wb"),fwrite,fclose;fopen(...,"rb"),fseek,fread,fclose; _open,_lseeki64,_write,_read,_close;

user: user-1
content: 7z源代码中难道不提供目录相关功能？

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:为什么不WinExec("c:\\program files\winrar\rar.exe a -r d:\\mypack.mpk d:\\mydir\\*.*",SW_HIDE);呢我是用mfc中的7z源代码压缩的，但现在要写文件头+数据头+数据，然后再把两者合并起来。就是上面的。能不能这样做给个思路？
user-0 提问: c语言，求大神解答

回复:
user: user-1
content: 嗯！！！！！！！

user: user-0
content: 首地址就比如int a[][50],就可以吗？

user: user-0
content: 嗯嗯，这个知道，谢谢

user: user-1
content: 还有自定义的函数名不能用main哦，main 是系统识别的。

user: user-1
content: 就算这样写main(int a[][50])，函数传入的也并不是一个数组而是一个指针等价于 main(int (*a)[50])==main( int **a); 所以你可以传递数组的首地址 就可以访问该数组的成员。

user: user-0
content: 还应该怎么改？谢谢。比如自定义函数判断是不是素数，然后主函数输入数组数据?

user: user-1
content: 不能！！！！！！！！！！！！！！！！！
user-0 提问: 关于Labwiondows/cvi

回复:
user: user-1
content: labwiondows cvi可能用不了depends.exe 你先确认你的cvi及相关扩展库安装全了。

user: user-0
content: 用的软件是labwiondows cvi也可以吗，没有找到depends.exe啊

user: user-1
content: 少The analysis library DLL啊。 用depends.exe查看exe依赖的dll。
user-0 提问: 结构体指针的释放问题！

回复:
user: user-1
content: 没有malloc/alloc的时候调用free出错是可以预见的错误

user: user-2
content: 函数内部声明的变量都是在栈上的，不是在堆上，因此不用free，free是用来释放她丈夫malloc干出来的“孩子（动态分配的内存）”的！malloc，free是一夫一妻制！

user: user-3
content: 不要单独使用malloc和free

user: user-4
content: 首先, 在结构体struct B生成具体数据的时候, 需要初始化buf为NULL. 再有, 必需是要malloc申请, 才能使用free.  没看到你的initfunction是怎么写的,   如果有代码, 应该就能看到是什么问题了.

user: user-5
content: 引用 2 楼 xiaohuh421 的回复:首先, 在结构体struct B生成具体数据的时候, 需要初始化buf为NULL. 再有, 必需是要malloc申请, 才能使用free.  没看到你的initfunction是怎么写的,   如果有代码, 应该就能看到是什么问题了.   二楼正解！楼主的问题已经可以解决

user: user-6
content: 首先, 在结构体struct B生成具体数据的时候, 需要初始化buf为NULL. 再有, 必需是要malloc申请, 才能使用free.  没看到你的initfunction是怎么写的,   如果有代码, 应该就能看到是什么问题了.

user: user-7
content: 使用free的同时要用用malloc库函数创建的内存，不然会报错的
user-0 提问: 请问在c语言里面怎么计算递归的次数？

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

user: user-2
content: 定义一个全局变量，在递归的每一层加一不就行了！

user: user-0
content: 例如一个矩阵是 0 0 1 1 1 1 1 1 1 0 0 0 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 那最大的size应该是6，但是我这个程序出来的是7，而单行的情况应该要排除的

user: user-3
content: 用全局变量或静态变量。初值0，进入函数++
user-0 提问: 新人发帖，自己编写的同学信息管理程序，读取信息与查找的时候一直出错。

回复:
user: user-1
content: 我也是新手，最近刚好也编过学生信息管理程序，方式有点不一样。胡乱说点意见，不知道是不是你在保存信息的时候，（因为你用的是字符串形式输入的），系统后面自动加了‘\0’的缘故。所以你在查找的时候就对不上了。（我也没试过，不知道是不是这个原因）

user: user-2
content: 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-3
content: 可能是字节对齐的问题。可以参考这个看看http://blog.csdn.net/chenglibin1988/article/details/8882852

user: user-0
content: 引用 2 楼 user-3 的回复:这个要一步步调试，先确保输入的信息保存好了，然后查找的数据地址是对的。  我之前自己也调试了很多次，做了很多修改，发现了一些问题。  首先数据的写入都没有报错。 问题在后面，如果我写入了一个数据，然后读取的时候，首先读取一次，将文件中的数据放入stu[0]中，这个也没有报错，然后读取第二个数据放入stu[1]中报错了（这个当然会报错，因为只写入了一个数据），问题是我循环输出stu[]时，第一次循环，输出stu[0]，输出的是空格，第二次输出stu[1]就是之前写入的数据。  如果我写入两个数据，写入也是没有错，关键在循环读取的时候，循环两次没报错，但是在输出的时候，stu[0]输出的是空格，stu[1]输出的是写入的第二个数据。

user: user-3
content: 这个要一步步调试，先确保输入的信息保存好了，然后查找的数据地址是对的。

user: user-0
content: 求助各位大神。。。。
user-0 提问: 才学指针与数组的关系，有个问题不明白

回复:
user: user-1
content: 你的数组没有初始化  所以得到的结果也是不确定的

user: user-2
content: 之申明，未定义的变量出现的数字都是随机数。

user: user-0
content: 引用 3 楼 Gonefar 的回复:这是由于没有初始化a数组的问题。a由于没有初始化，所以刚好a[7]的ascii值为0，而a[7]以前都不为0。所以会出现你的结果，你可以把a[9]每个元素的ascii值打印出来。我运行的结果是这样的  -64 5 64 0 0 0 0 0 0  123 上面一行为a[9]的各元素的ascii值。下面一行为输出结果。 请问下像这种没初始化的数组，它里面的每个元素的值是怎么弄出来的了，我试了试，的确a[7]的值为0，但前面的值各异

user: user-3
content: 这是由于没有初始化a数组的问题。a由于没有初始化，所以刚好a[7]的ascii值为0，而a[7]以前都不为0。所以会出现你的结果，你可以把a[9]每个元素的ascii值打印出来。我运行的结果是这样的  -64 5 64 0 0 0 0 0 0  123 上面一行为a[9]的各元素的ascii值。下面一行为输出结果。

user: user-4
content: 引用 1 楼 neolyao 的回复: int n = 1; //这里改一下 ‘1’是字符不是int  ，转换为int 实际值是49  引用 1 楼 neolyao 的回复: int n = 1; //这里改一下 ‘1’是字符不是int  ，转换为int 实际值是49   看错提了不好意思 ，因为a[7]里面是'\0'啊，所一到7就停止循环了

user: user-4
content: int n = 1; //这里改一下 ‘1’是字符不是int  ，转换为int 实际值是49
user-0 提问: c代码实现单链表，可惜反转链表没写出来啊

回复:
user: user-1
content: 写成双向链表，就不用反转喽 如果非要单链表翻转，把现有的链表从头挨个取下，以头插入办法重新建表，就翻转成功！ 或者，对现有链表，从第二个结点开始（需要头结点），挨个调换next指针，使其指向前一个结点，不懂看下面示例  已有链表：H->A->B->C->D-H; 调整： r=H; p=B; q=A; q->next = r;  r=p; q=B; p=B->next; q->next = r; 。。。 H<-A<-B<-C<-D 最后调整H，H->D 实际上本质和头插入法重新建表一致的

user: user-2
content: 翻转的话，需要   前一个节点，后一个节点  以及当前节点 一个一个来！

user: user-3
content: 反转链表：   把链表的首节点取出，入栈，直到链表为空，然后出栈的节点尾插到链表，直到栈空

user: user-4
content: #include <stdio.h> #include <stdlib.h> #include <Windows.h> //头插入法创建链表 int main() {  typedef struct NODE  {   char date;   struct NODE * next;  }node;  node  *s, *p;  char  ch;  s =NULL;p=NULL;  while ((ch =getchar()) != '\n')  {   s = p;   p =(node *)malloc(sizeof(node));   p ->date =ch;   p ->next =s;  }  while (p !=NULL)  {   printf("%c",p ->date);   p =p ->next;  }  printf("\n");  Sleep(10000);  return 0; }
user-0 提问: C语言中字符串与十进制的互相转换

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

user: user-2
content: 上面搞错了， itoa 能够转换成16进制字符串表，从 2～36进制都没问题 不过atoi不能把16进制字符串，转换成二进制（内部表示）

user: user-2
content: 引用 3 楼 conanson 的回复:[quote=引用 1 楼 lovehuan54 的回复:] 两个字节？ 这个是要求？  如果没有字节限制可以直接用sprintf 是的，协议里要求两个字节，对于unsigned short十进制转字符串，我一个想法是先转成二进制，然后高八位一个字节，低八位一个字节。[/quote] unsigned short 内部表示就是两个字节， 但是不是字符串，要定长，就转换为16进制字符串4个字节。 否则直接转换为10进制大概5个字节以内不定长。 直接库函数的话，sprintf,sscanf 就可以满足要求了，如果需要更快一点 atoi 和itoa，不过itoa 不能转换成16进制字符串表示。

user: user-0
content: 引用 1 楼 lovehuan54 的回复:两个字节？ 这个是要求？  如果没有字节限制可以直接用sprintf 是的，协议里要求两个字节，对于unsigned short十进制转字符串，我一个想法是先转成二进制，然后高八位一个字节，低八位一个字节。

user: user-3
content: 调用atoi就行了，实现也很简单。< c programing language> 书上就有

user: user-4
content: 两个字节？ 这个是要求？  如果没有字节限制可以直接用sprintf #include "stdio.h"  int main(void) { 	int test = 6325; 	char result[5] = {0};  	sprintf(result, "%d", test);  	printf("result is %s\n", result); }
user-0 提问: 海康威视面试题（老早的08年的），不过没看懂这个结构是干嘛的，即使穿是串结构，但是这data类型搞不懂

回复:
user: user-0
content: 数据结构中有一章节讲的就是串结构

user: user-0
content: 引用 10 楼 xihu1364 的回复:用啥结构体 直接2个数组  for循环 就搞定  多此一举面试题要求用接结构体

user: user-1
content: 用啥结构体 直接2个数组  for循环 就搞定  多此一举

user: user-2
content: 遍历一次，加辅助空间，逆向链表

user: user-3
content: 是不是先遍历取出数据，再次遍历逆序替换值？代价是2次遍历加部分辅助内存

user: user-4
content: struct Node {                int   data;                Node* next; }  void reverse(Node* pInHead , Node* pOutHead) {   ...  链表倒序输出  }  递归，或者 链表反向

user: user-5
content: #include <stdio.h> #include <stdlib.h> #include <Windows.h> //头插入法创建链表 int main() {  typedef struct NODE  {   char date;   struct NODE * next;  }node;  node  *s, *p;  char  ch;  s =NULL;p=NULL;  while ((ch =getchar()) != '\n')  {   s = p;   p =(node *)malloc(sizeof(node));   p ->date =ch;   p ->next =s;  }  while (p !=NULL)  {   printf("%c",p ->date);   p =p ->next;  }  printf("\n");  Sleep(10000);  return 0; }

user: user-6
content: 难道是想要用递归逆序打印实现？？

user: user-7
content: 引用 2 楼 xiaomi163 的回复:[quote=引用 1 楼 My_ID_is_NULL 的回复:] 难道要用链表来表示字符串？这个也太不走寻常路了 应该是的，但是这已给的结构怎么表示，搞不清楚。[/quote] 如果是这样的话，应该是想用int型的data来表示char，感觉出这题目的人脑子进水了

user: user-8
content: 用ascii码来表示一个字符? 用结构体太不划算了

user: user-0
content: 引用 1 楼 My_ID_is_NULL 的回复:难道要用链表来表示字符串？这个也太不走寻常路了 应该是的，但是这已给的结构怎么表示，搞不清楚。

user: user-7
content: 难道要用链表来表示字符串？这个也太不走寻常路了
user-0 提问: 求教一个从一段内存区域读取数据的问题

回复:
user: user-0
content: 引用 5 楼 xihu1364 的回复:[quote=引用 4 楼 xihu1364 的回复:] BYTE* buff = buffer; int  _nData = *(int*)(buff + 4);//应该是4个字节  32个位 _nData = _nData <<4  //这里是不是应该想左移？   不能确定 一起学习  BYTE* buff = buffer; int  _nData = *(int*)(buff + 4);//应该是4个字节  32个位 _nData = _nData >>4  是这样了上面说错了  [/quote] 昨天去问老板了，他说的是补够32位再转换成int类型，即：先判断出第28位是0还是1，然后补的4位就是0或者1。再转换成int类型就行了

user: user-1
content: 以上所有回复，如何考虑符号位呢？

user: user-2
content: 引用 楼主 iloveiverson 的回复:有一段buffer共0-100位，其中从32位到59位共28位中存放着一个整数类型的数据，区分正负号。 请问我怎么把这个数据读取出来？  100bit ，12.5个字节，实际分配应该是>=13B，只需确定目标位在第几个字节，然后位运算。

user: user-3
content: 如果真是位的话，参考下面： //有一个二进制文件，要求每隔50bits，删除后面的12bits。 #include <stdio.h> #include <stdlib.h> #include <string.h> FILE *fi,*fo; char buf[31]; char obf[31]; int bn,n; void filter() {//对buf中前n个字节中的位，每隔50bits，忽略12bits，结果放在obf中,且将bn设置为obf中的字节数。     char bit[249];     char obt[249];     char b8[33];     char b88[33];     int i,j;     char *e;      for (i=0;i<n;i++) {         _itoa(buf[i],b8,2);         sprintf(b88,"%032s",b8);         sprintf(bit+i*8,"%s",b88+24);     }      j=0;     for (i=0;i<n*8;i++) {         if (i%62<50) {             obt[j]=bit[i];             j++;         }     }     if (j%8) {         bn=(j/8+1)*8;     } else {         bn=j;     }     for (i=j;i<bn;i++) obt[i]='0';     obt[bn]=0;     bn=bn/8;     for (i=0;i<bn;i++) {         strncpy(b8,obt+i*8,8);b8[8]=0;         obf[i]=(char)strtol(b8,&e,2);     } } int main() {     fi=fopen("in.bin","rb");     if (NULL==fi) {         printf("Can not open file in.bin!\n");         return 1;     }     fo=fopen("out.bin","wb");     if (NULL==fo) {         fclose(fi);         printf("Can not open file out.bin!\n");         return 2;     }     while (1) {         n=fread(buf,1,31,fi);         if (0==n) break;         filter();         fwrite(obf,1,bn,fo);     }     fclose(fo);     fclose(fi);     return 0; }

user: user-4
content: buffer是以字节为单位的吧！

user: user-5
content: 引用 4 楼 xihu1364 的回复:BYTE* buff = buffer; int  _nData = *(int*)(buff + 4);//应该是4个字节  32个位 _nData = _nData <<4  //这里是不是应该想左移？   不能确定 一起学习  BYTE* buff = buffer; int  _nData = *(int*)(buff + 4);//应该是4个字节  32个位 _nData = _nData >>4  是这样了上面说错了

user: user-5
content: BYTE* buff = buffer; int  _nData = *(int*)(buff + 4);//应该是4个字节  32个位 _nData = _nData <<4  //这里是不是应该想左移？   不能确定 一起学习

user: user-0
content: 引用 2 楼 xihu1364 的回复:楼主说的位，是指位还是字节？  如果是字节的话，pBuffer指针指向buffer，  char szNum[29] = {0};  memcpy(szNum,pBuffer + 32,28); //这样第32-59字节全部拷贝到szNum中  你所说的取出来是转换正整形吗？还是字符串？........ 100个bit，用第32个bit到第59个bit共28个bit存放一个有符号整数

user: user-5
content: 楼主说的位，是指位还是字节？  如果是字节的话，pBuffer指针指向buffer，  char szNum[29] = {0};  memcpy(szNum,pBuffer + 32,28); //这样第32-59字节全部拷贝到szNum中  你所说的取出来是转换正整形吗？还是字符串？........

user: user-0
content: 我是这样做的不知道有问题没 BYTE* buff = buffer; int  _nData = *(int*)(buffer + 7); _nData = _nData >>4
user-0 提问: makefile对头文件的依赖关系

回复:
user: user-1
content: 你的 Makefile 没有做更新 .d 文件的目标啊. 怎么也得弄一个 dep : $(DEPS) 啥的. 编译 .c 的时候可以自动更新对应的 .d 的, 这样就不用专门为 .d 弄个目标 比如 gcc -MMD -MT dep/1.d  1.c  啥的 ..

user: user-0
content: 大家的做法是不是头文件有改动 就需要make clean了？？？？？？

user: user-2
content: makefile最好还是别用啥模版，按照自己的风格来，出错了也好修改

user: user-3
content: 确保电脑时间没乱。

user: user-4
content: make clean;make  修改了头文件重新clean！

user: user-3
content: 搜“跟我一起写makefile”
user-0 提问: [SWU]linux中的ls目录如何实现？

回复:
user: user-1
content: opendir/readdir/closedir用于目录树的遍历 lstat用于查看文件属性 readlink用于查看符号链接的内容 都是Linux的库函数

user: user-2
content: 《unix环境高级编程》这本书可能对你有用

user: user-3
content: Linux不是号称开放源代码的吗？看ls命令相关源代码片断啊。

user: user-4
content: man opendir man readdir 要更详细的请参阅Unix系统编程
user-0 提问: 快速排序，请问这个程序有什么问题？

回复:
user: user-1
content: 主要是，函数使用的时候不用加上函数的返回值类型。

user: user-1
content: 改好了。  #include<stdio.h> void quick(int *a,int n,int m) { 	int temp,i,j; 	i=n; 	j=m-1; 	temp=a[i];     do 	{ 		for( ; a[j]>=temp && j>i; j--) 			; 		a[i]=a[j]; 		for( ; a[i]<temp && j>i; i++) 			; 		a[j]=a[i]; 	} 	while(j>i); 	a[i]=temp; 	if(n<i) 		quick(a, 0, i); 	if(m>i)   		quick(a, i+1, m);   } void main() {     int b[6]={5,9,1,3,2,4},t;     quick (b, 0, 6); 	for(t=0; t<6; t++) 		printf("%d\t",b[t]); }
user-0 提问: 关于字符串的输入问题

回复:
user: user-1
content: scanf函数遇到'\n'就结束，并且把'\n'留在缓冲区里面啊

user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 楼上有人提到的fflush(stdin)与fflush(stdout怎么区别 另外清除printf的缓存和不清除得到的输出结果都相同，清除缓存似乎没什么用处啊，新手表示不解

user: user-0
content: 引用 6 楼 zhenzhen_10 的回复:scanf输入与getchar输入的区别是是否识别enter键，即空格键。。。。上诉代码改成getchar就对了 可是要怎么改呢？用for循环？

user: user-2
content: 我无法理解scanf会把回车键赋给字符变量，scanf不可能会用回车啊

user: user-3
content: scanf输入与getchar输入的区别是是否识别enter键，即空格键。。。。上诉代码改成getchar就对了

user: user-4
content: 建议你用单步调试，查看b的ASC码

user: user-5
content: 引用 3 楼 zhao4zhong1 的回复:在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 ++

user: user-6
content: 在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。

user: user-7
content: 回车也是一个字符，被变量b接收了

user: user-8
content: 因为你没有清空缓冲区。  #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include <cmath> #include <stdlib.h> int main() { 	char a[10]; 	scanf("%s", a); 	char b; 	fflush(stdin);// 或者getchar() 把缓冲区里面的‘\n’回收 	scanf("%c", &b); 	printf("%c\n", b);     printf("%s\n", a);     return 0; }
user-0 提问: 下面这个问题应该有点难度，我想知道为什么，不是要找解决办法的

回复:
user: user-0
content: 引用 8 楼 angel_su 的回复:不用原型那就是4楼说的按隐式转换，调用方第一个参数会用double入栈，你得把函数首参改成double估计就匹配了... 恩    和4L说的差不多。

user: user-0
content: 引用 7 楼 Gonefar 的回复:把程序都贴出来看看。  程序就在题目中。

user: user-1
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）  想要从本质上理解C指针，必须学习汇编以及C和汇编的对应关系。 从汇编的角度理解和学习C语言的指针，原本看似复杂的东西就会变得非常简单！ 指针即地址。“地址又是啥？”“只能从汇编语言和计算机组成原理的角度去解释了。” 但我又不得不承认：  有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物；  而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。 而我本人属前者。  不要企图依赖输出指针相关表达式的值【比如printf("%p\n",...)】来理解指针的本质， 而要依赖调试时的反汇编窗口中的C/C++代码【比如void *p=...】及其对应汇编指令以及内存窗口中的内存地址和内存值来理解指针的本质。  这辈子不看内存地址和内存值；只画链表、指针示意图，画堆栈示意图，画各种示意图，甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗？本人深表怀疑！ 这辈子不种麦不收麦不将麦粒拿去磨面；只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头，压面条，烤面包，……能从本质上理解面粉、理解面食吗？本人深表怀疑！！  提醒： “学习用汇编语言写程序” 和 “VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 （Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。） 想要从本质上理解C指针，必须学习C和汇编的对应关系。” 不是一回事！  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！  电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  十字链表交换任意两个节点C源代码（C指针应用终极挑战）http://download.csdn.net/detail/zhao4zhong1/5532495

user: user-1
content: void banana_peel(float c,short b,char a) {         printf("float=%f,short=%hd,char=%d\n",c,b,a); }  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

user: user-2
content: 不用原型那就是4楼说的按隐式转换，调用方第一个参数会用double入栈，你得把函数首参改成double估计就匹配了...

user: user-3
content: 把程序都贴出来看看。

user: user-0
content: 这是C专家编程第177页的一个编程挑战，我把形参float提前了。 我问过我们老师，他从事嵌入式开发十多年，他并没有告知我这是为什么。

user: user-0
content: 引用 4 楼 truelance 的回复:因为你没有使用函数原型, 所以编译器不知道函数参数的类型, 只能使用缺省类型, 缺省情况下3.3会被当成double类型, 往栈里写了8个字节. 被调函数c读了前4个字节, b读2个字节(参数存放会按4字节对齐), 这样就把(double)3.3的内容读完. c读的就是之后放入栈的69 你打印形参地址看看，你再打印实参地址看看，  不管它们在主函数用怎样的顺序定义，最后输出值不变。 形参地址值告知了它们不存在覆盖的问题，实参的地址告知了同样的道理。

user: user-4
content: 因为你没有使用函数原型, 所以编译器不知道函数参数的类型, 只能使用缺省类型, 缺省情况下3.3会被当成double类型, 往栈里写了8个字节. 被调函数c读了前4个字节, b读2个字节(参数存放会按4字节对齐), 这样就把(double)3.3的内容读完. c读的就是之后放入栈的69

user: user-0
content: 引用 1 楼 zhao4zhong1 的回复:void banana_peel(float c,short b,char a) {         printf("float=%f,short=%hd,char=%d\n",c,b,a); }  printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。 不是对应关系的问题。对应关系的问题造成指令取值变化的问题我知道。
user-0 提问: 为什么1 << 31结果是负的，而（1<<31）-1结果却是正的呢?

回复:
user: user-1
content: 一般按补码解释，最左边一位是1就是负数，是0就是非负数

user: user-2
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步对应汇编一行！  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。 （Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。）

user: user-3
content: 在32位的机器中，1<<31=0x80000000，作为有符号整数，其最高位为1表示负数，其值正好为32位有符号整数的最小值- 2,147,483,648。  (1<<31)-1在机器中计算时转换为2个数相加，即(1<<31)+(-1)，其数学上的计算过程如下所示：     1000 0000 0000 0000 0000 0000 0000 0000 +  1111 1111 1111 1111 1111 1111 1111 1111 ------------------------------------------------------------  1 0111 1111 1111 1111 1111 1111 1111 1111  显然计算结果超过了32位，最高位的1溢出被舍弃，最终机器中的结果为0x7fffffff，即32为有符号整数的最大值2,147,483,647

user: user-4
content: 在32位的机器中，1<<31=0x80000000，作为有符号整数，其最高位为1表示负数，其值正好为32位有符号整数的最小值- 2,147,483,648。  (1<<31)-1在机器中计算时转换为2个数相加，即(1<<31)+(-1)，其数学上的计算过程如下所示：     1000 0000 0000 0000 0000 0000 0000 0000 +  1111 1111 1111 1111 1111 1111 1111 1111 ------------------------------------------------------------  1 0111 1111 1111 1111 1111 1111 1111 1111  显然计算结果超过了32位，最高位的1溢出被舍弃，最终机器中的结果为0x7fffffff，即32为有符号整数的最大值2,147,483,647
user-0 提问: 如何使用lib文件？

回复:
user: user-1
content: FILE *f; long offset; f=fopen("xxx.lib","rb"); fseek(f,offset,SEEK_SET); fread(…… fclose(f);

user: user-2
content: 引用 2 楼 u014691814 的回复:[quote=引用 1 楼 fengxuxing 的回复:] (1)头文件和库文件都放到vcproject同目录下 (2)引用 #include "xxx.h"   引入头文件 #pragma comment(lib, "xxx.lib") 引入库文件 然后你就可以开始编程了 那怎么用这个库文件呢？现在这个.lib里面全是解释。我可以通过.idx知道某个单词的解释在.lib中的位置。怎么调出来这部分解释呢？[/quote] lib是2进制文件，貌似是无查看其内容的

user: user-0
content: 引用 1 楼 fengxuxing 的回复:(1)头文件和库文件都放到vcproject同目录下 (2)引用 #include "xxx.h"   引入头文件 #pragma comment(lib, "xxx.lib") 引入库文件 然后你就可以开始编程了 那怎么用这个库文件呢？现在这个.lib里面全是解释。我可以通过.idx知道某个单词的解释在.lib中的位置。怎么调出来这部分解释呢？

user: user-3
content: (1)头文件和库文件都放到vcproject同目录下 (2)引用 #include "xxx.h"   引入头文件 #pragma comment(lib, "xxx.lib") 引入库文件 然后你就可以开始编程了
user-0 提问: 急求一道C语言 

回复:
user: user-1
content: 具体问题是什么？ main()函数要放在最后面。

user: user-2
content: 至少自己先要把格式调工整吧

user: user-0
content: #include <stdio.h> int InputData(unsigned __int64 *x); int InputYear(); int xxx(unsigned __int64 x,__int64 n); unsigned __int64 xxxx(unsigned __int64 x,__int64 n,__int64 z); int main() { unsigned __int64 x;   int n,i,j,y;   n=InputData(&x);   y=InputYear();   printf("\nOriginal Configuration: "); printf("%lld\n",x);   for ( j=0;j<y;j++ )   { for ( i=0;i<n-1;i++ ) if ( xxx(x,n-i-1)==1 && xxx(x,n-i-2)==2 ) x=xxxx(x,n-i-1,2);     for ( i=n-1;i>=0;i-- ) if ( xxx(x,n-i-1)==1 && xxx(x,n-i)==2 ) x=xxxx(x,n-i-1,2);     printf("Year:%3d Configuration: ",j+1); printf("%lld\n",x);   }   return(0); } int InputData(unsigned __int64 *x) { int b=1,n,y;   unsigned __int64 xx;   while ( b )   { n=b=0;     printf("Enter field configuration: "); scanf("%lld",x); xx=*x;     while ( xx ) { n++; y=xx%10; xx/=10; if ( y!=1 && y!=2 ) { b=1; break; }   }     if ( b ) printf("\nError!  Interger can contain 1 and 2 digits only!!\n");   }   return n; } int InputYear() { int y=-1;    while ( y<0 ) { printf("Enter desired number of years:"); scanf("%d",&y);   if ( y<0 ) printf("\nError! Non-negative years only!!\n"); }   return y;  } int xxx(unsigned __int64 x,__int64 n) { int i,y; for ( i=0;i<n;i++ ) x/=10; y=x%10; return y; } unsigned __int64 xxxx(unsigned __int64 x,__int64 n,__int64 z) { unsigned __int64 xx=0,yy=1;    int i;    for ( i=0;i<n+1;i++ ) yy*=10; xx=x/yy*10+z; yy/=10; xx*=yy; xx+=x%yy; return xx;  }  求高手指导改错
user-0 提问: 求大神   基于51单片机的温湿度检测与报警的编程

回复:
user: user-1
content: 你准备用何种温湿度检测器件？就先了解下它，51你要不会的话就得学一阵子了，这玩意不难。慢慢学吧 。也可以加我的q 到时候群里说也行 我之前做过一个DHT11的温湿度检测程序没什么特别感觉

user: user-2
content: 买个开发板 学学几个基本例子  很容易的。。。这个系统很容易就可以搞定了，只是涉及到一个传感器和一个驱动器  只是简单io 的操作。。。

user: user-3
content: 先看看51的书，不是特别难，但是要下功夫，能把51啃的精通了，也不容易。多看书吧

user: user-4
content: 自己慢慢来吧

user: user-5
content: 具体的应用，单片机的控制，程序的状态运转没有定式，要烤自己的。LZ既然要做，还是多学学吧。
user-0 提问: 关于gets的返回值问题

回复:
user: user-0
content: 引用 3 楼 zhao4zhong1 的回复:[quote=引用 1 楼 zjq9931 的回复:] char a[100]; 取超过100个，是溢出了，在vc6.0和vs2010没有报错，但程序大了之后就不好说了，指不定出什么烂七八糟的问题呢。。。 这种情况很危险。。。 所以可以用：fgets(a, 99, stdin);// 这个来代替。只读取99个，末尾留上结束位。 纠错： char a[100]; 取超过100个，是溢出了，在vc6.0和vs2010没有报错，但程序大了之后就不好说了，指不定出什么烂七八糟的问题呢。。。 这种情况很危险。。。 所以可以用：fgets(a, 100, stdin);// 这个来代替。只读取99个，末尾留上结束位。 [/quote]好细心，呵呵。

user: user-1
content: gets, _getws Get a line from the stdin stream.  char *gets( char *buffer );  wchar_t *_getws( wchar_t *buffer );  Routine Required Header Compatibility  gets <stdio.h> ANSI, Win 95, Win NT  _getws <stdio.h> or <wchar.h> ANSI, Win 95, Win NT    For additional compatibility information, see Compatibility in the Introduction.  Libraries  LIBC.LIB Single thread static library, retail version  LIBCMT.LIB Multithread static library, retail version  MSVCRT.LIB Import library for MSVCRT.DLL, retail version    Return Value  Each of these functions returns its argument if successful. A NULL pointer indicates an error or end-of-file condition. Use ferror or feof to determine which one has occurred.  Parameter  buffer  Storage location for input string  Remarks  The gets function reads a line from the standard input stream stdin and stores it in buffer. The line consists of all characters up to and including the first newline character ('\n'). gets then replaces the newline character with a null character ('\0') before returning the line. In contrast, the fgets function retains the newline character. _getws is a wide-character version of gets; its argument and return value are wide-character strings.  Generic-Text Routine Mappings  TCHAR.H Routine  _UNICODE & _MBCS Not Defined _MBCS Defined _UNICODE Defined  _getts gets gets _getws    Example  /* GETS.C */  #include <stdio.h>  void main( void ) {    char line[81];     printf( "Input a string: " );    gets( line );    printf( "The line entered was: %s\n", line ); }   Output  Input a string: Hello! The line entered was: Hello!   Stream I/O Routines  See Also   fgets, fputs, puts

user: user-1
content: 引用 1 楼 zjq9931 的回复:char a[100]; 取超过100个，是溢出了，在vc6.0和vs2010没有报错，但程序大了之后就不好说了，指不定出什么烂七八糟的问题呢。。。 这种情况很危险。。。 所以可以用：fgets(a, 99, stdin);// 这个来代替。只读取99个，末尾留上结束位。 纠错： char a[100]; 取超过100个，是溢出了，在vc6.0和vs2010没有报错，但程序大了之后就不好说了，指不定出什么烂七八糟的问题呢。。。 这种情况很危险。。。 所以可以用：fgets(a, 100, stdin);// 这个来代替。只读取99个，末尾留上结束位。

user: user-2
content: 啊 这个问题没想过，学习了。

user: user-3
content: char a[100]; 取超过100个，是溢出了，在vc6.0和vs2010没有报错，但程序大了之后就不好说了，指不定出什么烂七八糟的问题呢。。。 这种情况很危险。。。 所以可以用：fgets(a, 99, stdin);// 这个来代替。只读取99个，末尾留上结束位。
user-0 提问: hanoi 塔问题

回复:
user: user-1
content: 引用 4 楼 u012018399 的回复:我用的是vc++6.0按那个alt+7没反应啊，我是个初学者，能不能举个例子如何给定一个点单步跟踪。 编译链接通过后,按F11,再按Alt+7

user: user-2
content: 先用非递归的方法试试，再来看递归就容易多了。

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

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

user: user-3
content: 学习递归时，开始都有点迷糊，你可以先写一些简单的递归，然后单步调试，查看变量的变化情况，了解函数的调用关系，这对递归的学习很有帮助

user: user-0
content: 我用的是vc++6.0按那个alt+7没反应啊，我是个初学者，能不能举个例子如何给定一个点单步跟踪。

user: user-4
content: 递归的本质在于一步一步往下走，但知道最后的递归才返回结果，然后往上返回递归，不断的返回结果。
user-0 提问: 错误在那？

回复:
user: user-1
content: 哟西

user: user-2
content: a=Ox7fffffff---->a=0x7fffffff

user: user-3
content: lz太不仔细了。。。

user: user-4
content: 楼上说的都对，lz太不仔细了

user: user-5
content: 0x 。楼主太不仔细了。

user: user-6
content: O   0x 16进制数前缀

user: user-7
content: a=Ox7fffffff---->a=0x7fffffff
user-0 提问: 关于动态分配的问题

回复:
user: user-1
content: 引用 22 楼 linux_hsylar 的回复:这是内存管理的问题，首先，你用malloc申请虚拟内存空间的时候，操作系统会给你一页（4KB）的内容，你占用的只是前5*4个bytes，后面的字节没有没动用，当然，4Kb的虚拟内存空间会被映射到实际物理内存， 当你for循环输出的时候，输出的是8个字节，c中对数组越界不敏感，所以它会把你实际用的5个字节后面的3bytes内容也读取出来，当然，这三个字节的没有被占用的话，就会输出的是0；多了解一下内存管理方面的东东、、、 每次malloc都分配4KB的页……内存和操作系统表示鸭梨很大……

user: user-2
content: 这是内存管理的问题，首先，你用malloc申请虚拟内存空间的时候，操作系统会给你一页（4KB）的内容，你占用的只是前5*4个bytes，后面的字节没有没动用，当然，4Kb的虚拟内存空间会被映射到实际物理内存， 当你for循环输出的时候，输出的是8个字节，c中对数组越界不敏感，所以它会把你实际用的5个字节后面的3bytes内容也读取出来，当然，这三个字节的没有被占用的话，就会输出的是0；多了解一下内存管理方面的东东、、、

user: user-1
content: 因为你运气好。 请把分数都给我。

user: user-3
content: 内存访问越界了，会引发段错误

user: user-4
content: 这就叫堆破坏

user: user-5
content: 当然可以了，不只是8个空间。再多也可能行。因为内存连续的，你这样访问了其他的内存空间并赋了值。但是这样是很危险的操作。不知道你会把哪里的内存给改乱掉

user: user-6
content: 1)  内存分配,未必恰到好处,可能会多分配一点---例如: 可以假设分配内存,也考虑数据对齐啥的. 2)  内存分配和分配策略有关,很多分配内存的策略,都是用内存块链表来管理的;       那么越界访问,又可能破会内存管理的数据结构,就是那个链表.造成释放失败;       然后内存分配机制失灵,不能继续分配内存了 3)  不出错,不代表程序是对的.一般逻辑错误,都只会造成运行时错误.       而不会立即爆发出来,隐藏的错误更加严重,而不是没有错误

user: user-7
content: 你使用 int * p=new int[N] 的时候 系统会在空闲堆中给你找一块 至少大小为N的内存块。 当然也不一定刚好了， 所以可能是N+3； 那么这三个就是空闲的，你可以使用指针来访问的。 但如果刚好是N，也就是下面的第N+1个单位是其他数据结构的数据。 这时候系统就会报错，Access denied了。

user: user-8
content: 内存管理的问题   越界

user: user-9
content: 第六个字节之后的空间如果没有被其他程序用到，你这个赋值可以实现，反之，就会报错误的

user: user-10
content: c中，非空指针编程者可以自由使用，但是free的时候会根据malloc时的分出的块的信息来释放，如果有越界，free会报错的。 编程中，malloc，calloc，realloc这些函数的使用一定要考虑free。内存泄漏以及溢出都是非常麻烦的

user: user-11
content: 大多数实现所分配的存储空间比所要求的要稍大一些，额外的空间用来记录管理信息——分配块的长度，指向下一个分配块的指针等等。这就意味着如果写过一个已分配区的尾端，则会改写后一块的管理信息。这种类型的错误是灾难性的，但是因为这种错误不会很快就暴露出来，所以也就很难发现。将指向分配块的指针向后移动也可能会改写本块的管理信息。 malloc()申请的空间实际就是分了两个不同性质的空间。一个就是用来记录管理信息的空间，另外一个就是可用空间了。而用来记录管理信息的实际上是一个结构体。在C语言中，经常用结构来记录信息！ 不然的话free怎么知道到哪里结束呢

user: user-12
content: 其实电脑开机后物理内存的每个字节都是可读写的，区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。

user: user-13
content: 越界行为未定义

user: user-14
content: 编译成功，并不能说明程序就没有问题，会出现段错误的

user: user-15
content: C语言不做数组边界检查

user: user-16
content: 我从国家申请了五块土地来种菜 我也可以在第八块土地上种  不过种的菜不归你管

user: user-17
content: Debug模式下，一般会在分配内存后面多留点空白，所以你没崩掉，Release就没有这个好处了。当然，任何越界操作的行为都是流氓

user: user-18
content: 分配的5个可以任由你操作，但另外的3个本来不属于你，你对其操作，可能扰乱其它程序的运行（如果这3个空间正被其它程序占用）。所以这样越界操作内存是很危险的。

user: user-19
content: 越界，可以赋值
user-0 提问: 怎样用C语言读取txt文件中的二进制数据并转为一维数组

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

回复:
user: user-0
content: 引用 3 楼 zjq9931 的回复:[quote=引用 2 楼 IT_dreamer1993 的回复:] [quote=引用 1 楼 zjq9931 的回复:] 主函数中，这个没有经过初始化，就开始操作。。。   head=(struct linklist*)malloc             (sizeof(struct linklist));  我初始化了。。。[/quote] 你是分配了内存空间，但分配的那个空间没有初始化。。。我理解的是这样，一会儿调试一下。[/quote]  谢谢我发现了，是create(aboutarray[i],n);位置没有吧结果赋给head

user: user-1
content: 引用 2 楼 IT_dreamer1993 的回复:[quote=引用 1 楼 zjq9931 的回复:] 主函数中，这个没有经过初始化，就开始操作。。。   head=(struct linklist*)malloc             (sizeof(struct linklist));  我初始化了。。。[/quote] 你是分配了内存空间，但分配的那个空间没有初始化。。。我理解的是这样，一会儿调试一下。

user: user-1
content: 主函数中，这个没有经过初始化，就开始操作。。。   head=(struct linklist*)malloc             (sizeof(struct linklist));

user: user-0
content: 引用 1 楼 zjq9931 的回复:主函数中，这个没有经过初始化，就开始操作。。。   head=(struct linklist*)malloc             (sizeof(struct linklist));  我初始化了。。。
user-0 提问: pow的用法

回复:
user: user-1
content: 调试看一下，调用之前打印一下变量是否正常，然后再看看计算范围

user: user-2
content: 如果你的变量没初始化当然会出错，否则不会的。

user: user-3
content: 变量肯定没有问题，是不是你的变量值太在了，计算有问题
user-0 提问: 学了C语言后，可以用来设计哪些软件呢？

回复:
user: user-1
content: 比如回帖软件什么的

user: user-2
content: 这足以证明C++可以编写出一切软件（如果你将Bochs所用的ROM和硬盘镜像当成数据的话）。

user: user-2
content: 理论上可以写任意软件，任何一种图灵机等价的语言都可以实现任何别的语言实现的任意软件的功能。  所有图灵机等价的语言都没有区别。  一个极端的例子是Bochs，它是一个用C++编写的x86模拟器，它甚至可以在PC上运行一个模拟的PC出来。

user: user-3
content: 几乎所有软件。从驱动程序，到用户程序，从操作系统，到应用程序，从控制台程序，到GUI程序
user-0 提问: 刚学c语言，不懂来请教

回复:
user: user-0
content: 引用 12 楼 neolyao 的回复:分步骤可以显示  [quote=引用 11 楼 u014697646 的回复:] 显示方面可以了，但不懂为什么就是分步骤可以显示，写在一起就不行呢？ 将缓冲区高度改成500啊，我的就可以一次性全部显示[/quote]  好奇怪哦，我的就是不行

user: user-1
content: 分步骤可以显示  引用 11 楼 u014697646 的回复:显示方面可以了，但不懂为什么就是分步骤可以显示，写在一起就不行呢？ 将缓冲区高度改成500啊，我的就可以一次性全部显示

user: user-2
content: 楼上正解 呵呵

user: user-0
content: 显示方面可以了，但不懂为什么就是分步骤可以显示，写在一起就不行呢？

user: user-3
content: 你可以先输出一半，加一行 getchar(); 再输出后一半。这样中间会停一下，按任意键继续

user: user-0
content: 行数超过终端限制？但是我按照上述改了缓冲区，从最大到最小都试过了，结果还是从67开始显示，好像没多大变化。请问你们那里可以的吗？

user: user-4
content: 引用 4 楼 u014697646 的回复:#include<stdio.h> void main() { 	int n; 	for(n=33;n<=126;n++) 	{ 		printf("十进制：%d\n",n); 		printf("八进制：%o\n",n); 		printf("十六进制：%x\n",n); 		printf("字符形式：%c\n",n); 		printf("\n"); 	} } 这个是我的代码，不知哪里出了问题，显示结果不是从33开始的？将你的缓冲区调一下就好了，点击 右键--属性--布局，给你需要的高度的调下

user: user-1

user: user-1
content: 点击窗口右键 将缓冲区高度改大一点就可以了

user: user-1
content: 行数超过终端限制

user: user-0
content: #include<stdio.h> void main() { 	int n; 	for(n=33;n<=126;n++) 	{ 		printf("十进制：%d\n",n); 		printf("八进制：%o\n",n); 		printf("十六进制：%x\n",n); 		printf("字符形式：%c\n",n); 		printf("\n"); 	} } 这个是我的代码，不知哪里出了问题，显示结果不是从33开始的？

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

user: user-5
content: #include <stdio.h> #include <process.h> #include <conio.h> void main() {     int i;      system("chcp 437");     for (i=128;i<256;i++) {         printf("%d %c  ",i,i);         if (7==i%8) printf("\n");     }     getch(); }

user: user-6
content: 什么地方有错误？没看到啊
user-0 提问: c语言在读写二进制文件中遇到的问题，求大神解释

回复:
user: user-1
content: 引用 3 楼 zhao4zhong1 的回复:printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。   作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。 ++ 你应该学会设置断点、单步运行调试

user: user-2
content: printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。   作为一个C程序员，对  scanf,sscanf,fscanf  printf,sprintf,fprintf 这类函数的用法，还是要做到“拳不离手，曲不离口”的。

user: user-0
content: 对了，谢谢。。我一开始输入的程序就是使用%ld的，编译器报错。这是怎么回事？

user: user-3
content: %6l  --->  %6ld