Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: C语言, 数组sizeof的问题, 懂的人, 一分钟搞定, 求帮忙解惑一下

回复:
user: user-1
content: 结果是4，也许是你看错结果了吧。

user: user-2
content: 2楼是对的，你的编译器有问题。

user: user-0
content: 引用 1 楼 kino_chen 的回复:a是数组地址，&a也是数组地址，编译器认为他们的类型是一样的，所以两者的sizeof输出是一样的。以上纯属自认为  我用的是VC6.0， 是编译器问题,

user: user-3
content: 对的，&a的类型是int(*)[100]，

user: user-4
content: 是4，编译器问题，我的是VisualStudio2010

user: user-5
content: a是数组地址，&a也是数组地址，编译器认为他们的类型是一样的，所以两者的sizeof输出是一样的。以上纯属自认为
user-0 提问: 用long long 定义为什么会出错

回复:
user: user-1
content: C++98/03标准不支持 long long类型，C99标准支持long long类型的，后来C++11 又将 long long类型吸收进来了，新版的Visual Studi 支持long long类型了。

user: user-2
content: 用11位整数保存电话号码是不可取的。

user: user-3
content: 用__int64 ，输出时写scanf("%I64d",&temp.phone );

user: user-4
content: 你直接用double类型就可以了，%.0f输出

user: user-5
content: VC里好像没有long long类型！long long最早由GCC扩展出来的，后来被纳入标准的；vc6.0比较早应该不支持此类型。新的VS估计支持。LZ可验证下

user: user-6
content: 是%I64d，大写的i，不是小写的L

user: user-0

user: user-0
content: 不好意思，刚刚打错，就是用_int64，然后出现了上面那个错误

user: user-7
content: 用__int64

user: user-0
content: 我用了_64int，用scanf("%l64d",&temp.phone );这个进行输入，调试的时候发现根本就没有录入进去，怎么办

user: user-6
content: 用__int64
user-0 提问: 二维数组列排序，代码测试总有问题，总有样例会出错，，求大神指导问题在哪？万分感谢

回复:
user: user-1
content: 没有很多人有那么多时间。自己慢慢调试。顺便说一下你的排版  #include <stdlib.h> #include <stdio.h> #include <string.h> #include <math.h> #include "oj.h"  // 功能：排列一个m行n列 大小的数组 // 输入： int * pArray 指向数组第一个元素的指针,m为行数， n为列数 ，请按第i列排列 // 输出：按第i, i+1, ..., n列优先级排序完成后的数组放到入参指定的地址中	(i的取值范围 1 - n)    void ArrCpy(int A[], int B[], int len); bool Arr1BiggerThanArr2(int *Arr1, int *Arr2, int len, int i);  void RangeArray(int * pArray, unsigned int  m, unsigned int  n,unsigned int  i) {	 unsigned int p,j; int Tmp[100] = {0};  if(NULL == pArray) return;  for(p = 1; p < m; p++)    // 插入排序法 { ArrCpy(Tmp, &pArray[p*n], n); for(j = p; j > 0 && Arr1BiggerThanArr2(&pArray[(j-1)*n], Tmp, n, i); j--) { ArrCpy(&pArray[j*n],&pArray[(j-1)*n],n); } ArrCpy(&pArray[j*n],Tmp,n); }  }  void ArrCpy(int *A, int *B, int len) { int i; for(i = 0; i < len; i++ ) { A[i] = B[i]; } }  //  判断Arr1从第i列开始是否大于Arr2 bool Arr1BiggerThanArr2(int *Arr1, int *Arr2, int len, int i) { int j; int EqCount = 0;  for(j = i-1; j < len; j++) { if(Arr1[j] < Arr2[j]) return false; else if(Arr1[j] == Arr2[j]) EqCount++; }  if(EqCount == (len+1-i)) return false;  return true; }

user: user-2
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。
user-0 提问: 求助这是怎么回事，请问代码是否有错，（素数判断，原创），百度上查不到跟我一样的

回复:
user: user-1
content: 而且没写跳出循环。。。

user: user-1
content: 我改一下，就是判断那你写错了，而且写弄跳出循环 #include<stdio.h> #include<Windows.h> int main() { 	long int a;//8位及以下 	long int d; 	printf("请输入一个正整数,如果不是素数会显示，如果是素数那么会发生/错误/提示，最大八位1不是素数，请不要输入1\n"); 	scanf_s("%d",&a);//输入 	d=a+2-3;//a-1 	while(1) 	{ 		if(a%d==0&&d!=1&&d<a)//判断 		{ 			printf("这不是素数\n");//a都能被d整除了，它就不是素数了啊 			break;  		} 		if(d==1) 		{ 			printf("这是素数\n");//d=1，它就是素数了啊 			break;  		} 		//else//如果不是 			   d--;//d一直减，每次都循环，直到除开，如果没除开那就不是素数 			 	} 	system("pause"); 	return 0; }

user: user-2
content: 你不加花括号，编译能通过？第一个if之后两条语句加花括号。亲，再说，你这个算法本身都有问题，素数你都没搞懂，除1和本身之外没有约数才是素数，你搞反了。。。

user: user-3
content: printf,d--,是不是应该加大括号

user: user-4
content: if(a%d==0&&d!=1&&d<a)//判断             printf("这是素数\n");             d--;//d一直减，每次都循环，直到除开，如果没除开那就不是素数         else//如果不是         printf("这不是素数");  这语法不死吗？

user: user-0
content: 帮忙回答一下，谢谢
user-0 提问: 模拟语言语法分析器，这要怎么做啊，各位帮帮忙，谢了

回复:
user: user-1
content: 看龙书，半年后，希望楼主有小成。

user: user-2
content: 你的简单错误指的后面列的那些错误，倒简单了，栈数据结构就能解决。如果简单错误涉及C类型，语法，语义错误。那就大了去喽！

user: user-3
content: 还可以参考Tiny C Compiler

user: user-3
content: 仅供参考#include<stdio.h> #include<malloc.h> #include<string.h> #define STACK_INIT_SIZE 10 #define STACK_GROW_SIZE 5 #define ELEMTYPE char #define OK 1 #define ERROR 0 typedef struct { /*建立一个栈的首结点*/     ELEMTYPE * base;     ELEMTYPE * top;     int stacksize; } SpStack; int InitStack(SpStack *s) { /*建立空的栈并返回首地址*/     s->base=((ELEMTYPE*)malloc(STACK_INIT_SIZE*sizeof(ELEMTYPE)));     if (!s->base) return ERROR;     s->top=s->base;     s->stacksize=STACK_INIT_SIZE;     return OK; } int StackEmpty(SpStack *s) { /*判断栈是否为空*/     if (s->top==s->base) return OK;     else                 return ERROR; } int Push(SpStack *s,ELEMTYPE e) { /*往栈顶插入元素即进栈*/     if (s->top-s->base>=s->stacksize) { /*判断是否栈满*/         s->base=((ELEMTYPE*)realloc(s->base,(s->stacksize+STACK_GROW_SIZE)*sizeof(ELEMTYPE)));         if (!s->base) return ERROR;         s->stacksize+=STACK_GROW_SIZE;         s->top=s->base+s->stacksize;     }     *s->top++=e;     return OK; } int Pop(SpStack *s,ELEMTYPE *e) { /*让栈顶元素依次输出即出栈*/     if (StackEmpty(s)) return ERROR;     *e=*(--s->top);     return OK; } int Comp(ELEMTYPE a,ELEMTYPE b) {     if ((a=='('&&b!=')')       ||(a=='['&&b!=']')       ||(a=='{'&&b!='}')) {         return ERROR;     } else return OK; } int Count(SpStack *s) {     ELEMTYPE e[STACK_INIT_SIZE*2];     ELEMTYPE e1;     int i;      InitStack(s);     fgets(e,STACK_INIT_SIZE*2,stdin);     if ('\n'==e[strlen(e)-1]) e[strlen(e)-1]=0;     printf("%s\n",e);     for (i=0;e[i]!='\0';i++) {         switch (e[i]) {         case '(':         case '[':         case '{':             Push(s,e[i]);             break;         case ')':         case ']':         case '}':             if (StackEmpty(s)) {                 printf("%*s↖右括号多余\n",i+1,"");                 return(ERROR);             } else Pop(s,&e1);             if (!Comp(e1,e[i])) {                 printf("%*s↖左右匹配出错\n",i+1,"");                 return(ERROR);             }         }     }     if (!StackEmpty(s)) {         printf("%*s↖左括号多余\n",i,"");         return(ERROR);     } else {         printf("匹配正确\n");         return(OK);     } } void main() {     SpStack s;     Count(&s);     free(s.base); }

user: user-4
content: lex/yacc可以检测词法文法，再依据错误内容定位高亮行就可以。

user: user-5
content: 汗，这个任务，恐怕一周都搞不完的东西啊。 楼主就糊弄糊弄就行啦。
user-0 提问: 实现库函数strncpy

回复:
user: user-1
content: 你的问题挺不错的，代码写的还可以。面试时有时候就会考strcpy之类的。我照着一位大牛的写了一遍，跑通了。不知道对你有帮助没有，你看一下。#include <stdio.h> #define NDEBUG #include <assert.h> char*  my_strncpy(char *strDest,const char *strSrc,int n){   assert((strDest!=NULL)&&(strSrc!=NULL));     char *address=strDest;     for(int i=0;i<n;i++) 	   *strDest++=*strSrc++;   *strDest='\0';     return address; } int main(void){   char array1[]="sdsad";   char array2[]="hello world";   char *strDest=array1;   char *strSrc=array2;   int n=5;   my_strncpy(strDest,strSrc,8);   printf("%s",strDest);   return 0; } 代码在GCC上面跑了一遍没问题的。 但有几个细节要注意：const char ×strSrc 源地址是一个常量。第二个考点：assert断言，程序的安全性。第三个考点：为了保证链式操作 可以返回一个指针。 你比我要聪明。。我这是前几天刚看到这个问题。 还有，要注意代码的精简性，没事多看一下源码，代码应追求短小精悍。

user: user-2
content: C:\Program Files\Microsoft Visual Studio 10.0\VC\crt\src\strncpy.c /*** *strncpy.c - copy at most n characters of string * *       Copyright (c) Microsoft Corporation. All rights reserved. * *Purpose: *       defines strncpy() - copy at most n characters of string * *******************************************************************************/  #include <cruntime.h> #include <string.h>  /*** *char *strncpy(dest, source, count) - copy at most n characters * *Purpose: *       Copies count characters from the source string to the *       destination.  If count is less than the length of source, *       NO NULL CHARACTER is put onto the end of the copied string. *       If count is greater than the length of sources, dest is padded *       with null characters to length count. * * *Entry: *       char *dest - pointer to destination *       char *source - source string for copy *       unsigned count - max number of characters to copy * *Exit: *       returns dest * *Exceptions: * *******************************************************************************/  char * __cdecl strncpy (         char * dest,         const char * source,         size_t count         ) {         char *start = dest;          while (count && (*dest++ = *source++))    /* copy string */                 count--;          if (count)                              /* pad out with zeroes */                 while (--count)                         *dest++ = '\0';          return(start); }

user: user-3
content: 照着源码多写几次你就记得了，我觉得源码的写的很好啊 下面几句是主要的。。 char *temp=dst; while((*dst++=*src++)!='\0'); *dst='\0'; return dst;

user: user-4
content: #include <stdio.h>    char *mystrncpy( char *des, const char *source, int n ) {     if( des == NULL || source == NULL )     return des;      char *tmp = des;      for( int i = 0; i < n; i++)     {         if( *source != '\0')         {             *tmp++ = *source++;         }     }     *tmp = '\0';     return des; }  int main() {     char s[] = "hello world!";     char *t = "boys";     printf( "%s\n", mystrncpy( s, t, 3 ) );     return 0; }

user: user-5
content: return tmp？ 你的tmp已经指向'\0'了吧？ char* tmp=s之后，不要动tmp，这个tmp只是记录s的初始位置而已，将s赋值为你想要的结果即可。

user: user-0
content: 这个哪里错了   为什么运行不聊？谢谢
user-0 提问: 局部变量定义后初值怎么会是0？是编译器的问题吗

回复:
user: user-1
content: 局部变量的初始化，语言标准里没规定编译器的行为，编译器的实现可以选择初始化或不初始化。一般都不会选初始化的，要做额外的工作。  另一方面，一个局部变量，在stack上分配了空间，这个空间就是个内存地址，不管编译器初始化还是不初始化，这个内存地址本身就有值，可能是0，可能不是0，依赖于之前被使用的情况。即使是0也不应该就理解成编译器初始化成0的，除非看到编译器确实生成了初始化局部变量的代码。

user: user-2
content: 跟编译器有关系，vs2008运行出错，count初始化随机值 变量定义最好都初始化

user: user-3
content: 初始值是随机的。。。 具体是多少，0？FF？还是乱码？看编译器心情
user-0 提问: 24点算法，大家都没有好的思路提点一下。。先谢谢了

回复:
user: user-1
content: 题目说的不够清楚啊

user: user-2
content: 不是一幅牌算24点吗?差不多都固定的

user: user-3
content: 4个数 2^4个循环。。。

user: user-4
content: 我说一个笨办法：先简化为2个数，四则运算遍历；那么三个数可以先选任意2个先四则，将结果和另一个数传入上述函数；四个数同理。

user: user-5
content: 引用 3 楼 zhao4zhong1 的回复:http://bbs.csdn.net/topics/380157851看到这个帖子我马上想到了赵老师的一个帖子

user: user-6
content: 上面算错了，重来： 第一个数a，有10种可能，第一运算符&，有4种可能，两个结合有40种可能。结合进第2个数b，就有400种可能（因为a和b这两个集合是一样的），结合进第二个运算符，就有1600种可能，再结合进第三个数，有(a&b)&c和c&(a&b)两种方式（(a&b)和c这两个集合不一样），就有128000种可能。再结合第三个运算符、第四个数，就有1024万种可能。 另外考虑到(a&b)&(c&d)的形式，有400*400*4=64万种可能（(a&b)和(c&d)这两个集合是一样的） 总共有1024万+128万=1152万种可能

user: user-6
content: 上面算错了，重来： 第一个数a，有10种可能，第一运算符&，有4种可能，两个结合有40种可能。结合进第2个数b，就有400种可能，结合进第二个运算符，就有1600种可能，再结合进第三个数，有(a&b)&c和c&(a&b)两种方式，就有128000种可能。再结合第三个运算符、第四个数，就有1024万种可能。 另外考虑到(a&b)&(c&d)的形式，有400*400*8=128万种可能 总共有1024万+128万=1152万种可能

user: user-6
content: 第一个数a，有10种可能，第一运算符&，有4种可能，两个结合有40种可能。结合进第2个数b，就有400种可能，结合进第二个运算符，就有1600种可能，再结合进第三个数，有(a&b)&c和c&(a&b)两种方式，就有32000种可能。再结合第三个运算符、第四个数，就有256万种可能。 另外考虑到(a&b)&(c&d)的形式，有400*400*8=128万种可能 总共有256万+128万=384万种可能

user: user-7
content: http://bbs.csdn.net/topics/380157851
user-0 提问: 刚学C就遇到这样的问题

回复:
user: user-1
content: 引用 11 楼 sholber 的回复:[quote=引用 10 楼 PhycoKnight 的回复:] [quote=引用 9 楼 sholber 的回复:] void main ????? 我的建议是不要学C了。这样又不是不可以，直接main(){}都可以的。[/quote]  是啊，可以，可以，一定可以。非常可以。完全可以滴……[/quote]

user: user-2
content: 引用 10 楼 PhycoKnight 的回复:[quote=引用 9 楼 sholber 的回复:] void main ????? 我的建议是不要学C了。这样又不是不可以，直接main(){}都可以的。[/quote]  是啊，可以，可以，一定可以。非常可以。完全可以滴……

user: user-1
content: 引用 9 楼 sholber 的回复:void main ????? 我的建议是不要学C了。这样又不是不可以，直接main(){}都可以的。

user: user-2
content: void main ????? 我的建议是不要学C了。

user: user-3
content: 没有初始化ch1和ch2的原因

user: user-4
content: 优先级没问题，只是ch1,ch2没有初始化的缘故，当你输入a时，第一个条件运算符满足，ch1=a，第二个条件运算符不满足，就变成了ch2=ch2-1，ch2没有初始化，所以才会显示？

user: user-5
content: 变量初始化，运算符优先级。这两个注意下，，再试一遍吧。

user: user-5
content: 引用 1 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。） 你除了会拿这个忽悠一下人还会干什么，貌似不是第一次这样 打太极了 引用 1 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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对应的汇编并单步执行观察相应内存和寄存器变化。） 引用 1 楼 zhao4zhong1 的回复:计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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-0
content: 我怎么回复不了你们呀？

user: user-6
content: 调试时，你输入的字符是什么？ 把ch1,ch2先初始化一下，再看看输出，如： char ch1 = 'f'; char ch2 = 'f';

user: user-7
content: #include <stdio.h> #include <conio.h> void main() { 	char ch,ch1,ch2; 	ch=getche(); 	putchar('\n');  	ch1 = (ch == 'a')?'z':ch - 1; 	ch2 = (ch == 'z')?'a':ch + 1; 	printf("ch1=%c,ch2=%c\n",ch1,ch2); }

user: user-8
content: 计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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-0 提问: C++大神求救课程设计

回复:
user: user-1
content: 什么叫管理？无非就是记录谁谁谁在什么时候打电话进来，咨询什么事情，然后回复的内容是什么，是否解决了问题，需不需要后续跟进。  把需求分析清楚，然后就是设计了呗。简单的数据库设计，用户表，管理用户资料，名字，电话，ID之类的；事件表，记录一次通话的相关信息，就是上面说的什么事件，谁，问了什么，给他答复了什么，后续需要做什么。  然后就是数据库的增删改查。。。  界面部分的功能，展示，管理，用户权限
user-0 提问: 求助linux下getch问题

回复:
user: user-1
content: 引用 7 楼 u013847126 的回复:[quote=引用 6 楼 zhao4zhong1 的回复:] 使用NCURSES库。 库我用过，不过我不太会，用的时候编译提示要向屏幕返回什么东西[/quote] 难道NCURSES库不自带例子代码或网上搜不到有例子代码的文章吗？

user: user-2
content: 需要注意事项:   gcc test.h -o t1 -lcurses 编译的时候 后面加上 lcurses curses.h的用法看这里 http://www.maomao365.com/?p=256

user: user-0
content: 引用 6 楼 zhao4zhong1 的回复:使用NCURSES库。 库我用过，不过我不太会，用的时候编译提示要向屏幕返回什么东西

user: user-1
content: 使用NCURSES库。

user: user-3
content: 支持1楼说的

user: user-0
content: 引用 1 楼 zhouchongzxc 的回复:把 13 变成 10 试一下 13换成10的话回车就不管用了呀，而且就一直输入无法结束

user: user-0
content: 13换成10的话回车就不管用了呀，而且就一直输入无法结束

user: user-4
content: 把 13 变成 10 试一下
user-0 提问: sizeof()函数问题

回复:
user: user-1
content: 很明显是把sizeof和strlen给混淆了，楼上各位都说得差不多了，我就来水水。。。

user: user-2
content: 楼上已经给出解释了，不需要解释太多。 要知道   void fun(char* s)   与  void fun(char  s[ ])  对于编译器来说是一样的东西。

user: user-3
content: 引用 15 楼 hxl199109 的回复: Quote: 引用 9 楼 Const_User 的回复:  函数定义中的数组参数，其实就是指针，就是一个存放地址的单元，我用的编译器定义的是4个字节。当你调用函数时，会自动创建参数列表中的变量，也就是函数定义中的参数列表，并不是在main函数里面的数组，调用时就会把main中的数组地址赋值给指针，这时指针就会指向数组，又不是复制数组，所以就会出现问题了。 +1  正解 +1

user: user-4
content: 参数为指针。。。

user: user-5
content: int mystrcat(char str[], char sub[], int len, int sizestr) 这是误导性的，看起来像数组，其实没有任何数组的特性， 既然楼主发现sizeof了，就应该想到这不是数组……

user: user-6
content: 引用 9 楼 Const_User 的回复:函数定义中的数组参数，其实就是指针，就是一个存放地址的单元，我用的编译器定义的是4个字节。当你调用函数时，会自动创建参数列表中的变量，也就是函数定义中的参数列表，并不是在main函数里面的数组，调用时就会把main中的数组地址赋值给指针，这时指针就会指向数组，又不是复制数组，所以就会出现问题了。+1

user: user-7
content: 引用 1 楼 u013163178 的回复:看到标题我就想进来说下,sizeof不是函数,是运算符,结果是在编译时候产生的,不是运行时候计算出来的,i所以楼主你该知道怎么错了的 吧 从C99开始变长数组的sizeof结果是在运行时计算的。

user: user-8
content: 引用 15 楼 hxl199109 的回复:引用 9 楼 Const_User 的回复:函数定义中的数组参数，其实就是指针，就是一个存放地址的单元，我用的编译器定义的是4个字节。当你调用函数时，会自动创建参数列表中的变量，也就是函数定义中的参数列表，并不是在main函数里面的数组，调用时就会把main中的数组地址赋值给指针，这时指针就会指向数组，又不是复制数组，所以就会出现问题了。+1  正解 +1

user: user-9
content: 以数组为参数，它会退化为指针

user: user-10

user: user-10
content: sizeof 好像是  501  而  strlen是500  因为  strlen  的长度不会包含  \0 而sizeof  会包含进去\0    楼主试试输出看看     sizeof是操作符而不是 函数

user: user-11
content: 用sizeof运算符测数组名，不就是相当于将其退化成指针了，相当于 char * str；。。。。

user: user-12
content: 楼主要要区分strlen和sizeof

user: user-13
content: 引用 1 楼 u013163178 的回复:看到标题我就想进来说下,sizeof不是函数,是运算符,结果是在编译时候产生的,不是运行时候计算出来的,i所以楼主你该知道怎么错了的 吧 void f (int n) {     char a [n]     size_t v = sizeof a; } 你告诉我在编译的时候怎么产生的。

user: user-14
content: 函数定义中的数组参数，其实就是指针，就是一个存放地址的单元，我用的编译器定义的是4个字节。当你调用函数时，会自动创建参数列表中的变量，也就是函数定义中的参数列表，并不是在main函数里面的数组，调用时就会把main中的数组地址赋值给指针，这时指针就会指向数组，又不是复制数组，所以就会出现问题了。

user: user-12
content: 看到标题我就想进来说下,sizeof不是函数,是运算符,结果是在编译时候产生的,不是运行时候计算出来的,i所以楼主你该知道怎么错了的 吧

user: user-15
content: if ((len + strlen(sub)) >= sizestr) //如将此处的sizestr形参改为sizeof(str) 结果就会出错 因为数组作为参数传递后，传进来的就只是一个指针 其实你这个函数里的str是这样子的 char *str = str; 你可以把函数参数设成char **str试试

user: user-16
content: 引用 1 楼 u013163178 的回复:看到标题我就想进来说下,sizeof不是函数,是运算符,结果是在编译时候产生的,不是运行时候计算出来的,i所以楼主你该知道怎么错了的 吧+1

user: user-17
content: 引用 3 楼 user-18 的回复:[quote=引用 2 楼 user-18 的回复:] sizeof(str) 求得是数组（指针）的大小，总是4  不对啊，应该是数组总字节数，为什么我跟踪的一直是4呀[/quote]----- 正常情况下对数组进行 sizeof运算得到的是数组总字节数，但数组做参数时退化成指针，例如 在这个函数中mystrcat(char str[], char sub[], int len, int sizestr)中的str和sub，32为下，指针的大小为4字节

user: user-18
content: 引用 2 楼 user-18 的回复:sizeof(str) 求得是数组（指针）的大小，总是4  不对啊，应该是数组总字节数，为什么我跟踪的一直是4呀
user-0 提问: c函数mkdir无法创建目录

回复:
user: user-1
content: 使用perror查看错误码提示什么错误

user: user-0
content: 引用 3 楼 u013163178 的回复:#include <sys/types.h> #include <sys/stat.h> #include <unistd.h>  struct stat st = {0};  if (stat("/some/directory", &st) == -1) {     mkdir("/some/directory", 0700); }  刚查了下，这个不能一次创建多级目录，是得循环创建的把。。。

user: user-2
content: You can see the manual of these functions with the man 2 stat and man 2 mkdir commands.

user: user-2
content: #include <sys/types.h> #include <sys/stat.h> #include <unistd.h>  struct stat st = {0};  if (stat("/some/directory", &st) == -1) {     mkdir("/some/directory", 0700); }

user: user-2
content: To use this function, your program should include the header file sys/stat.h.

user: user-3
content: if(IsHave<0)的话，用perror(”xxx")函数把错误信息打印出来，看看错误原因。  mkdir()可以直接创建多级目录？？忘了  也可以先看看path到底被sprintf成什么样子了      login_name = pwd->pw_name;        //获取当前用户名  这个写法不对，login_name之前malloc分配了内存了，这么一赋值，就内存泄露了，用strcpy
user-0 提问: 如何添加分数等级问题！

回复:
user: user-1
content: 做对几个，做错几个统计？？这有啥不会的？做对了a++,做错了b++，最后的a,b不就是了？

user: user-2
content: 从后面统计给分开始就不会了 什么意思？

user: user-3
content: 统计给分部分，无非添加一个得分变量和一个等级变量，每次提示答对了之前就累加得分，并判断新的分数是否达到晋级分，达到了就累加等级变量；每次提示答错了之前就得分减少，并判断新的分数是否达到降级分，达到了就等级变量较小。很简单，楼主加油
user-0 提问: 求助  c程序

回复:
user: user-1
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-2
content: char *s = "xxxxxx",不能修改常量字符串s,改成字符数组就可以了

user: user-3
content: http://bbs.csdn.net/topics/390965077 这个帖子中2楼的回答能很好的解释为啥char *s = "abcdefg";不可以~~~

user: user-3
content: #include <stdio.h> #include <iostream> using namespace std; int main() { 	void reverse(char *s); 	char s[] = "abcdefg";//改动了这里 	cout<<s<<endl; 	reverse(s); 	cout<<s<<endl; 	return 0; }  void reverse(char *s) {  	char *end = s; 	char temp; 	while(*end){ 		end++; 	} 	end--; 	while(s < end) 	{ 		temp = *s; 		*s++ = *end; 		*end-- = temp; 	} }
user-0 提问: 自定义函数执行完毕后弹框

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

user: user-2
content: 提示你了:发生溢出了

user: user-3
content: 额。。这个，建议你还是先学习一下如何使用vs的调试技术

user: user-0
content: 引用 3 楼 user-3 的回复:你在函数里面设断点进去看看  引用 2 楼 rct007 的回复:引用 1 楼 user-3 的回复:一般是访问地址除了问题。设断点调试，找出是那一句出的问题为什么他会运行完整段函数才会提示，而不是中途就弹窗提示呢设了断点之后，调试看什么

user: user-3
content: 你在函数里面设断点进去看看  引用 2 楼 rct007 的回复:引用 1 楼 user-3 的回复:一般是访问地址除了问题。设断点调试，找出是那一句出的问题为什么他会运行完整段函数才会提示，而不是中途就弹窗提示呢

user: user-0
content: 引用 1 楼 user-3 的回复:一般是访问地址除了问题。设断点调试，找出是那一句出的问题为什么他会运行完整段函数才会提示，而不是中途就弹窗提示呢

user: user-3
content: 一般是访问地址除了问题。设断点调试，找出是那一句出的问题

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

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

回复:
user: user-1
content: LZ问这个问题是要干啥？？？ n1==2,n2==4的情况各只有一次，当n1=0时，内循环执行了四次，使得n2=4，此后n1自增执行外循环，内循环就不再执行了。当n1子等到2时，外循环也就执行完，程序就结束了……

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

user: user-3
content: 其实这题目要看你说的外层循环是第几次了。 比如按你这个来： 外层第1次，内层循环就是4次。 接着外层第2次，内层不循环了（n2=4了）

user: user-4
content: 先假设n1！=x1，n2！=x2，那总循环次数是x1+x2. ps：抢到沙发了
user-0 提问: 定义多个函数，函数被分配到的空间是连续的吗？

回复:
user: user-1
content: 数组是一系列线性存储的相同类型元素的集合。无论数组中存储的是地址还是数值，它的大小都是确定的。如果想做个函数数组，那存储的元素就是地址了，如果想让它们连续，就必须知道每个函数的大小，即知道地址又知道大小，这样就可以使数组连续了，不过此时数组的类型最好是结构体了。如果这样分配的话，还有一个问题，如果你的函数足够多，又足够大，内存中是否存在这么一大块空间让你来存储连续函数，这样也不利于对内存的管理。总体来说看每个编译器的取舍了。

user: user-2
content: 是不是连续的，是看编译器怎么分配。用户代码一般都不会依赖这个，否则的话可移植性肯定不好。  如果要确认自己写的这个特定应用的某几个函数是不是在一起，就把这几个函数的地址打印出来看看呗。我的经验，如果想让几个函数地址在一起，用static修饰一下函数，一般会在一起。不保证啊，可以这么试。

user: user-3
content: 说穿了,函数不过是一些标号 函数调用,和函数返回,都是一种跳转 一个函数块 到底有多大, 和函数编译以后的指令 总长度有关系 至于函数会不会连续,简单的策略是会的 但是实际上,编译器因为种种原因, 并不一定会采取这种简单的办法. 高级语言的函数代码, 长度是不确定的 要在 C,C++中,通过标准C,C++行为, 直接生成,这种代码性质的数组,是不可能做到的 不过函数指针(函数地址)的长度, 很多时候是一致的,可以放到数组中

user: user-4
content: 可以试一下emacs中的GDB调试器 。。这个可以让你查看程序机器级别的运行状态。 我刚刚用GDB看了一下，地址不是连续的。 po图：  4和7是两个函数的起始地址 函数体： void f1(){   return; } void f2(){  return; } 关于函数数组 问题，你自己google下 不过 我也谈一下我的理解，C中的函数名本身是一个地址，如果有函数数组，那怎么函数体中的代码怎么办？我的意思是函数名本身应该是函数执行的起点，应该是做不到函数地址递增的。额，，个人YY，，纯属TX

user: user-4
content: 可以试一下emacs中的GDB调试器 。。这个可以让你查看程序额机器级别的运行状态。 关于函数数组 问题，你自己google下 不过 我也谈一下我的理解，C中的函数名本身是一个地址，如果有函数数组，那怎么函数体中的代码怎么办？我的意思是函数名本身应该是函数执行的起点，应该是做不到函数地址递增的。额，，个人YY，，纯属TX

user: user-5
content: 为什么要连续的呢？应该是看编译器的吧

user: user-6
content: 思索这个问题之前，你需要先弄搞清楚，你是如何确定它们是连续的，还是不连续的？ 还有连续有何好处，坏处 不连续有何好处，坏处
user-0 提问: 关于指针的问题

回复:
user: user-1
content: LinkList 是结构体指针定义吧，像下面这样你的代码就合理了。。。  struct stLinkList { ... stLinkList* next; }*LinkList;

user: user-2
content: 显然LinkList是指针类型（LinkLIst p, q;这段代码看出来的），L 是指向指针的指针，当然要加*

user: user-3
content: 说明LinkList是一个typedef类型，它也是指针类型

user: user-4
content: 你这里LinkList本来就是某个结构体的指针了吧 再加个*就是指针的指针了 所以后面用的时候要加*  其实感觉直接传这个指针就可以了，不用传指针的指针

user: user-5
content: *L->next那意思是指*L指针指向的结构体的next，这没什么问题吧

user: user-0
content: 帮帮我吧！！
user-0 提问: 【求助】结尾语法错误不知如何修改

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

user: user-2
content: 不需要那么多“return 0；”吧，建议一个函数就一个return。确实main函数最后一行少了一个“}”，不知道是不是你拷贝的时候漏掉了。

user: user-3
content: 引用 4 楼 ccnyou 的回复:最好换行再敲 } +1

user: user-4
content: 最好换行再敲 }

user: user-4
content: return 0;}  你试试

user: user-0
content: 请问具体在哪里呢？

user: user-5
content: main函数少了结尾的花括号
user-0 提问: centos下的一些c语言问题

回复:
user: user-0
content: 引用 5 楼 FightForProgrammer 的回复:hent = gethostbyname(si->host_ip_address);//这块崩溃了，为啥啊？ gethostbyname这个函数不该传入ip地址吧。应该是例如"www.google.cn"等等。 高手你知道为啥，codeblocks调试信息输不出来不？  就是我图片里显示的第一行，后面那些信息都是，程序卡一下才输出来的，啥情况啊

user: user-1
content: hent = gethostbyname(si->host_ip_address);//这块崩溃了，为啥啊？ gethostbyname这个函数不该传入ip地址吧。应该是例如"www.google.cn"等等。

user: user-0
content: 引用 2 楼 FightForProgrammer 的回复:先找到哪里除了问题吧。这个自己调试应该可以找出来啊      hent = gethostbyname(si->host_ip_address);//这块崩溃了，为啥啊？

user: user-0
content: 引用 1 楼 coding_hello 的回复:崩溃的地方仔细看各个指针是否指向正确的内存数据      hent = gethostbyname(si->host_ip_address);//这块崩溃了，为啥啊？

user: user-1
content: 先找到哪里除了问题吧。这个自己调试应该可以找出来啊

user: user-2
content: 崩溃的地方仔细看各个指针是否指向正确的内存数据

user: user-3
content: 进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’ 使用命令 gdb 运行程序名 core或core.数字 进入gdb然后使用bt命令 可以查看进程意外退出前函数调用的堆栈，内容为从上到下列出对应从里层到外层的函数调用历史。 如果进程意外退出不产生core文件，参考“ulimit -c core文件最大块大小”命令

user: user-1
content: codeblocks在linux下我也遇到很多奇怪的问题，这个应该是和软件相关，容易挂掉等。  怎么解决我也不知道，所以一般在linux下我就不用IDE了。直接vim+gcc+gdb
user-0 提问: 关于文件的一个问题

回复:
user: user-1
content: 楼主是读取一个不知道多大的文件么？那就判断EOF。要是创建一个不知道要写入多少数据的文件，那就随你了，最好是写入一定数据后，就分割文件。因为文件大小是有限制。

user: user-2
content: 文本方式打开用EOF，二进制打开用feof函数。。。

user: user-3
content: 没看懂LZ的意思。

user: user-4
content: 如何判断写入结束？？没得写了就结束了呗  判断数据读入结束，可以用feof()

user: user-5
content: EOF  字数字数

user: user-6
content: 只要磁盘还有可用空间，你高兴写到哪里结束就到哪里结束。

user: user-7
content: 到底是要读取还是写入啊
user-0 提问: 数据结构算法设计

回复:
user: user-0
content: 谢谢大家，我自己会试试的。

user: user-1
content: 引用 1 楼 user-4 的回复:明天有空来写写。题目不难。。。。 Agree,自己试一下。逻辑上不难实现，删除可能有点难度，也需要一些指针和结构的基础知识。

user: user-2
content: 当给出的结点值存在与二叉树时，删除该结点 //删除某个结点 int DeleteBST(BiTree *p) { 	BiTree q,s; 	if((*p)->rchild==NULL) //该结点右孩子为空时 	{ 		q=*p;*p=(*p)->lchild;free(q); 	} 	else if((*p)->lchild==NULL)//该结点左孩子为空时 	{ 		q=*p;*p=(*p)->rchild;free(q); 	} 	else  //该结点左右孩子都存在时 	{ 		q=*p;s=(*p)->lchild; 		while(s->rchild) 		{ 			q=s; 			s=s->rchild; 		} 		(*p)->data=s->data; 		if(q!=*p) 			q->rchild=s->lchild; 		else 			q->lchild=s->lchild; 		free(s); 	} 	return 1; } int Delete(BiTree *T,int key) { 	BiTree p; 	if(!*T) 		return 0; 	else 	{ 	 if(Search(*T,key,NULL,&p)) 	 {DeleteBST(&p);return 1;} 	 else return 0; 	} }

user: user-2
content: 这里先给出构造排序二叉树的过程 #include <stdio.h> #include <stdlib.h> #include <math.h> #include <time.h>  typedef struct BiTNode { 	int data; 	struct BiTNode *lchild,*rchild; }BiTNode,*BiTree; //查找二叉树是否存在与key相同的值，若存在，则返回1，不存在，则另*p为 //查找的最后节点的指针 int Search(BiTree T,int key,BiTree f,BiTree *p) { 	if(!T) 	{ 		*p=f; 		return 0; 	} 	else if(key==T->data) 	{ 		*p=T; 		return 1; 	} 	else if(key<T->data) 			return Search(T->lchild,key,T,p); 	else 			return Search(T->rchild,key,T,p); } //依据查找结果，逐个插入key，构造排序二叉树 int Insert(BiTree *T,int key) { 	BiTree p,s; 	if(!Search(*T,key,NULL,&p)) 	{ 		s=(BiTree)malloc(sizeof(BiTNode)); 		s->data=key; 		s->lchild=NULL; 		s->rchild=NULL; 		if(!p) 		*T=s; 		else if(key<p->data) 			p->lchild=s; 		else 			p->rchild=s; 	} 	else 		return 1; } void main() { 	int i,j; 	BiTree T=NULL; 	int d[10]={62,88,58,47,35,73,51,99,37,93}; 	for(i=0;i<10;i++) 	{ 		Insert(&T,d[i]); 	} }

user: user-0
content: 看着挺难的。好吧，我试试

user: user-3
content: 拒绝直接的伸手党 你可以自己搜二叉排序数，参考这类代码，自己写简单的排序数的数据结构与逻辑方法。

user: user-4
content: 明天有空来写写。题目不难。。。。
user-0 提问: 为什么说可能会导致内存访问错误

回复:
user: user-1
content: 引用 7 楼 coding_hello 的回复:char *p1="sdkfsdsdg"; p1[0]='g';  这里的"sdkfsdsdg"是在只读属性的内存区，按说正确写法应该是const char* p1 = "sdkfsdsdg"; 但是编译器兼容了这个常量字符串赋值的写法。  乱说

user: user-2
content: char *p1="sdkfsdsdg"; p1[0]='g';  这里的"sdkfsdsdg"是在只读属性的内存区，按说正确写法应该是const char* p1 = "sdkfsdsdg"; 但是编译器兼容了这个常量字符串赋值的写法。

user: user-3
content: "sdkfsdsdg"是字符串常量，在内存中的代码段，是不允许修改的，P[0]='g'是要改变‘S’，这样运行会产生段错误，

user: user-4
content: char *p1 = "sdkfsdsdg"; p1指向常量字符串，不允许修改。  char p2[] = "sdkfsdsdg"; p2[0] = 'g'; p2指向字符数组，可以通过指针或数组下标修改字符数组中的字符。 p2[0] = 'g';

user: user-5
content: #pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！

user: user-6
content: 指针p1指向的是一个常量字符串。你无法修改常量字符串的值。  若想修改，建议写如下代码： char p1[]="sdkfsdsdg";     p1[0]='g'; 这样会给p1在栈上分配内存，从而你可以修改其中的值。

user: user-1
content: char *p1="sdkfsdsdg";  p1[0]='g'; C语言是表达能力很强的语言，为什么写得这么傻？干嘛不这么写： "sdkfsdsdg" [0] = 'g'; 问题在于，不管怎么写，串字面值都被用于初始化一个静态数组，它可能位于一个受处理器硬件保护的只读页内。

user: user-7
content: 一个是字符串常量，一个是字符数组，注意区分

user: user-8
content: 内存是有属性的，读写，只读什么的。字符串常量保存的地方一般是只读，你往那写自然会引起段错误，内存是有保护机制的。

user: user-0
content: 不知道c primer plus 里举的例子，说原因是在于编译器可能选择内存中的同一个单个的拷贝，来表示所有相同的字符串文字

user: user-7
content: 直接这么写不会吧。除非你把p1指向了其他地方（比如null），然后又用p1【0】
user-0 提问: scanf为什么没有执行呢？

回复:
user: user-1
content: 引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉+1

user: user-0
content: 引用 6 楼 kino_chen 的回复:[quote=引用 5 楼 axiqia 的回复:] system("pause")有什么问题吗？不太懂，我单步调试的时候，按下一步直接就调过了scanf。 我的理解是进入del函数后，执行del到while。带用户选择继续删除Y，则递归调用del，知道用户选择删除完成N，跳出while，执行pause；如果用户选择删除完成N，执行pause。等待用户按下任意键时返回head。 是我错了- -，平时不用system("pause")，顾名思义了。1楼应该就是对的，你在scanf("%d",&num)时留下了一个'\n',被scanf("%c",&c)拿去了，你试试scanf(" %c",&c)，在%c前加个空格，使其能跳过空白符。[/quote] 和一楼的效果一样，单次调用可以，但是多次就会出错

user: user-0
content: 引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉不过还以有点问题， 第二次调用的时候会出错

user: user-0
content: 引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉有两个scanf，我没有表达清楚，导致也没有理解你的意思，楼主正解，在输入第一num是后getchar()，就可以了

user: user-2
content: 引用 5 楼 axiqia 的回复:system("pause")有什么问题吗？不太懂，我单步调试的时候，按下一步直接就调过了scanf。 我的理解是进入del函数后，执行del到while。带用户选择继续删除Y，则递归调用del，知道用户选择删除完成N，跳出while，执行pause；如果用户选择删除完成N，执行pause。等待用户按下任意键时返回head。 是我错了- -，平时不用system("pause")，顾名思义了。1楼应该就是对的，你在scanf("%d",&num)时留下了一个'\n',被scanf("%c",&c)拿去了，你试试scanf(" %c",&c)，在%c前加个空格，使其能跳过空白符。

user: user-0
content: system("pause")有什么问题吗？不太懂，我单步调试的时候，按下一步直接就调过了scanf。 我的理解是进入del函数后，执行del到while。带用户选择继续删除Y，则递归调用del，知道用户选择删除完成N，跳出while，执行pause；如果用户选择删除完成N，执行pause。等待用户按下任意键时返回head。

user: user-2
content: 递归调用。我就问一个问题，进入递归后，怎么返回....你都system("pause")了。单步调试一下，你就知道了，不是scanf()没执行

user: user-0
content: 引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉 引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉判断是否继续删除中输入Y,N。我试了，加个getchar()没有用

user: user-3
content: 引用 1 楼 coding_hello 的回复:里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉  直接fflush(stdin);清除键盘缓冲区不是更好吗？

user: user-4
content: 里面2个scanf,哪个没执行？  scanf要使用%c的时候，可能会受前一次scanf的回车的影响，所以建议scanf之后加个getchar()的调用，把scanf没处理的那个回车消耗掉
user-0 提问: 深度搜索结束问题

回复:
user: user-0
content: 已了解。。。

user: user-0
content: 楼上的说的我好羞愧。。这个是地址。http://blog.csdn.net/believe__dream/article/details/42270757

user: user-1
content: 引用 1 楼 coding_hello 的回复:回答你的疑问还需要大家去到处找你发的别的贴呢？+!......

user: user-2
content: 回答你的疑问还需要大家去到处找你发的别的贴呢？
user-0 提问: SelectObject使用有些疑问，求解答。

回复:
user: user-1
content: 是的，显然楼上没有回答你的问题

user: user-2
content: SelectObject The SelectObject function selects an object into the specified device context. The new object replaces the previous object of the same type.   HGDIOBJ SelectObject(   HDC hdc,          // handle to device context   HGDIOBJ hgdiobj   // handle to object );   Parameters hdc  Handle to the device context.  hgdiobj  Handle to the object to be selected. The specified object must have been created by using one of the following functions: Object Functions  Bitmap CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection   (Bitmaps can be selected for memory device contexts only, and for only one device context at a time.)  Brush CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush  Font CreateFont, CreateFontIndirect  Pen CreatePen, CreatePenIndirect  Region CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect    Return Values If the selected object is not a region and the function succeeds, the return value is the handle of the object being replaced. If the selected object is a region and the function succeeds, the return value is one of the following values:   Value Meaning  SIMPLEREGION Region consists of a single rectangle.  COMPLEXREGION Region consists of more than one rectangle.  NULLREGION Region is empty.    If an error occurs and the selected object is not a region, the return value is NULL. Otherwise, it is GDI_ERROR.   Remarks This function returns the previously selected object of the specified type. An application should always replace a new object with the original, default object after it has finished drawing with the new object.   An application cannot select a bitmap into more than one device context at a time.   ICM: If the object being selected is a brush or a pen color management is performed.   QuickInfo   Windows NT: Requires version 3.1 or later.   Windows: Requires Windows 95 or later.   Windows CE: Requires version 1.0 or later.   Header: Declared in wingdi.h.   Import Library: Use gdi32.lib.  See Also Device Contexts Overview, Device Context Functions, CombineRgn, CreateBitmap, CreateBitmapIndirect, CreateBrushIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBPatternBrush, CreateEllipticRgn, CreateEllipticRgnIndirect, CreateFont, CreateFontIndirect, CreateHatchBrush, CreatePatternBrush, CreatePen, CreatePenIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect, CreateSolidBrush, SelectClipRgn, SelectPalette

user: user-2
content: 引用 4 楼 fly_dragon_fly 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] [quote=引用 2 楼 fly_dragon_fly 的回复:] 是的，显然楼上没有回答你的问题 这是我回答问题的个人风格。[/quote] 只想回答2个字的， 论坛要6个字，没办法[/quote] 选中2个子，将其颜色设置为黑色。

user: user-1
content: 引用 3 楼 zhao4zhong1 的回复:[quote=引用 2 楼 fly_dragon_fly 的回复:] 是的，显然楼上没有回答你的问题 这是我回答问题的个人风格。[/quote] 只想回答2个字的， 论坛要6个字，没办法

user: user-2
content: 引用 2 楼 fly_dragon_fly 的回复:是的，显然楼上没有回答你的问题 这是我回答问题的个人风格。
user-0 提问: 关于C++调用C编写的动态链接库的问题

回复:
user: user-1
content: 不要吧！ HMODULE hModule=GetModuleHandle("***.dll"); //打开共享库， 获得句柄 if (hModule) { 　　typedef DWORD (CALLBACK *LPFNREGISTER)(DWORD,DWORD); 　　LPFNREGISTER lpfnRegister; 　　lpfnRegister=(LPFNREGISTER)GetProcAddress(hModule,"RegisterServiceProcess");          // hModule：共享库句柄， RegisterServiceProcess： 需要加载函数的函数名 　　if (lpfnRegister) 　   { 　　        (*lpfnRegister)(NULL,1L); 　　} }  这个需要你知道共享库中有什么函数和函数参数，   可以通过工具查看dll中的内容

user: user-2
content: 不需要。  参考MSDN98\SAMPLES\VC98\MFC\ADVANCED\DLLTRACE\*.* MSDN98_1.ISO http://pan.baidu.com/s/1dDF41ix,  MSDN98_2.ISO http://pan.baidu.com/s/1bnGo0Vl

user: user-0
content: 引用 2 楼 a30037338 的回复:不要吧！ HMODULE hModule=GetModuleHandle("***.dll"); //打开共享库， 获得句柄 if (hModule) { 　　typedef DWORD (CALLBACK *LPFNREGISTER)(DWORD,DWORD); 　　LPFNREGISTER lpfnRegister; 　　lpfnRegister=(LPFNREGISTER)GetProcAddress(hModule,"RegisterServiceProcess");          // hModule：共享库句柄， RegisterServiceProcess： 需要加载函数的函数名 　　if (lpfnRegister) 　   { 　　        (*lpfnRegister)(NULL,1L); 　　} }  这个需要你知道共享库中有什么函数和函数参数，   可以通过工具查看dll中的内容 恩，函数的接口是知道的，我也用dumpbin查看过； 其实GetProcAddress我也已经成功，就是调用的时候结果不知怎么的不对，看来是其他问题！ 总之谢谢ls几位

user: user-3
content: 使用def文件导出对应的函数

user: user-4
content: 不需要
user-0 提问: 在txt文件中根据关键词选择读取数据

回复:
user: user-1
content: 文件假设是d:\data.txt, 输出是D:\out.txt   #include <stdio.h> #include <string.h>  int main(){ 	FILE* fp = fopen("d:\\data.txt", "r"); 	FILE* fp_out = fopen("d:\\out.txt", "wb"); 	do{ 		char buf[1024]; 		fgets(buf, 1023, fp); 		if (strncmp(buf, "WIFI/", 5)==0) 		{ 			fprintf(fp_out, "%s\r\n", buf+5); 		} 	}while(!feof(fp));  	fclose(fp); 	fclose(fp_out);  	return 0; }

user: user-0
content: 能提供程序或者关键语句代码吗？

user: user-2
content: 一行一行读取getline() 然后，分析读到的一行数据。首先判断有没有WIFI，有就保存他后面的数据；如果没有就读取下一行

user: user-3
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: %32[^\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-0
content: 望编程大神求教
user-0 提问: 请问如何开发获取当前计算机cpu,内存,硬盘,进程，网络流量等使用率或传输情况，要参考什么类型的书或章节。谢谢各位！

回复:
user: user-1
content: Python，中psutil模块，可以

user: user-2
content: 这个和系统有关，你可以阅读一下sigar源码，相信对你有帮助

user: user-3
content: 这个和系统有关，你可以阅读一下sigar源码，相信对你有帮助

user: user-4
content: 系统调用有相关API

user: user-5
content: 在MSDN里面搜“PDH”

user: user-6
content: 这玩意人家肯定研究类很多。自己能找到啊

user: user-7
content: 百度一个一个去查，都很容易查到，就是分散点，不要嫌麻烦，连这个都要别人帮你去查好了汇总给你。
user-0 提问: C语言 命令行参数

回复:
user: user-1
content: http://bbs.csdn.net/topics/390469280

user: user-2
content: 参考 http://blog.csdn.net/xiaocainiaoshangxiao/article/details/13996459

user: user-3
content: 鸟哥的linux私房菜，这本书值得你看

user: user-4
content: 只是一个参数而已.理解了的话,该参数完全可以通过配置文件的读写替代

user: user-0
content: 我是做单片机嵌入式的，请问，我会用到这个东西吗？

user: user-5
content: 比如windows的ping、ipconfig/all 等命令后面都带了参数

user: user-6
content: 因为你的main函数从来都不带参数，否则你一定好奇，为什么main函数带2个参数，这2个参数那里来的。然后你什么都明白了

user: user-7
content: 一个程序运行时候,使可以给程序一个参数的,如果你如果你用过DOS或者linux,你会深有体会

user: user-8
content: 运行main带参数的控制台应用程序方法 http://blog.csdn.net/wangshiqilin_fjy/article/details/8177930 命令行参数和普通的函数参数其实是一个道理的。不要太纠结在这里。

user: user-9
content: 参考——http://wenku.baidu.com/view/ad407b1c650e52ea55189806.html
user-0 提问: 数组的传递问题   求解    在线等  

回复:
user: user-1
content: for(x=0;x<n;x++) { scanf("%d",&a[x]); } printf("最大整数为：%d,最小整数为：%d",max(n,a),mix(n,a));

user: user-2
content: 学会调试代码定位问题，一点点问题就问别人帮你，怎么提高啊。

user: user-3
content: 引用 3 楼 anshiny 的回复:int max(int n, int a[]) { 	int x; 	int the_max = a[0]; 	for(x=1; x<n; x++) { 		if(the_max < a[x]) 			the_max = a[x]; 	} 	return the_max; }  int mix(int n,int a[9]) { 	int x; 	int the_min = a[0]; 	for(x=1; x<n; x++) { 		if(the_min > a[x]) 			the_min = a[x]; 	} 	return the_min; }  int main(int argc, char *argv[]) { 	int a[9], x, n; 	printf("请输入n:\n"); 	scanf("%d", &n); 	for(x=0;x<n;x++) { 		scanf("%d", &a[x]); 	} 	printf("最大整数为：%d, 最小整数为：%d", max(n,a), mix(n,a)); 	return 0; }+!

user: user-4
content: [quote=引用 3 楼 anshiny 的回复:] [quote] 支持  int main(int argc, char *argv[]) { 	int a[9],x,n; 	printf("请输入n:\n"); 	scanf("%d",&n); 	for(x=0;x<n;x++) 	{ 		scanf("%d",&a[x]);// & 	} 	printf("最大整数为：%d,最小整数为：%d",max(n,a),mix(n,a));//用数组名 	return 0; }

user: user-5
content: 别等了。。。认真看书更实在！

user: user-6
content: int max(int n, int a[]) { 	int x; 	int the_max = a[0]; 	for(x=1; x<n; x++) { 		if(the_max < a[x]) 			the_max = a[x]; 	} 	return the_max; }  int mix(int n,int a[9]) { 	int x; 	int the_min = a[0]; 	for(x=1; x<n; x++) { 		if(the_min > a[x]) 			the_min = a[x]; 	} 	return the_min; }  int main(int argc, char *argv[]) { 	int a[9], x, n; 	printf("请输入n:\n"); 	scanf("%d", &n); 	for(x=0;x<n;x++) { 		scanf("%d", &a[x]); 	} 	printf("最大整数为：%d, 最小整数为：%d", max(n,a), mix(n,a)); 	return 0; }

user: user-7
content: scanf &a[] a-x max|min(n,a)

user: user-8
content: scanf &a[] a-x max|min(n,a)
user-0 提问: 海量优质电子书分享

回复:
user: user-1
content: 东西都分享了，投票这点小事还是做得来

user: user-2
content: 已投票，资源正在下载

user: user-3
content: 楼主，下了你的资源，只能投个票以表谢意啦。

user: user-4

user: user-5
content: 顶一个

user: user-6
content: 引用 2 楼 hitwhylz 的回复:[quote=引用 1 楼 zmszsh 的回复:] 谢谢楼主！ 另外问一句楼主都看完了吗？  移动开发多数看了。 算法部分看得少,  那些要比较用心看, 不然看不懂。 还有一些正在看， 比如iOS Games by Tutorials v2.2 这本, 原版12月14号刚在国外出版的。[/quote] 自惭形秽啊，一看书就没有精神，膜拜楼主！

user: user-7
content: 已投票，谢谢楼主！

user: user-8

user: user-0
content: 引用 1 楼 zmszsh 的回复:谢谢楼主！ 另外问一句楼主都看完了吗？  移动开发多数看了。 算法部分看得少,  那些要比较用心看, 不然看不懂。 还有一些正在看， 比如iOS Games by Tutorials v2.2 这本, 原版12月14号刚在国外出版的。

user: user-6
content: 谢谢楼主！ 另外问一句楼主都看完了吗？
user-0 提问: 怎样将指针的地址值作为函数返回值返回

回复:
user: user-1
content: int *test(int *p) {     int q;     return p; }

user: user-2
content: 引用 1 楼 user-11 的回复:你想说的是 return *p 吧？ 自古2楼出真相 引用 11 楼 wengdunliang 的回复:[quote=引用 1 楼 user-11 的回复:] 你想说的是 return *p 吧？ 自古2楼出真相[/quote] 3楼说的也对，我觉得你应该要的是3楼的答案

user: user-2
content: 引用 1 楼 user-11 的回复:你想说的是 return *p 吧？ 自古2楼出真相

user: user-3
content: q=(int)p为啥不行？？  #include<stdio.h> #include<time.h>  int test(int *p) {     int q;     return q=(int)p; }  int main(void) { 	int aa[3] = {1,2,3}; 	int c = test(aa); 	printf("c=%x, aa=%x\r\n", c, aa);  	return 0; }   输出： c=18ff3c, aa=18ff3c

user: user-4
content: return (int) p; 问题在于，结果是实现定义的。如果结果不能被整数类型表示，则行为还是未定义的哩。

user: user-5
content: 你的问题 有点问题  该怎么解释 “p的地址是100”  如果说 p的值是100（用 printf("%p",p) 输出的结果是100） 那么3楼是正确的  如果说p作为一个变量被存储在内存中的第100个字节处  那么6楼是正确的  你知道什么叫 “按值传递吗？”

user: user-6
content: return (int)&p;//请确定你的编译环境是32位。不然返回int，就会有截断，64位环境下地址是64位的。  p是个临时变量，你把临时变量的地址返回是要干什么- -，肯定有不可告人的秘密

user: user-7
content: #include <stdio.h> int* test(int **p) {     return *p+1; } int main() {  int d[2]={1,2};  int *p;    p=&d[0];  p=test(&p);   printf("%d\n",p[0]);//2  return 0; }

user: user-8
content: 楼主是要p指针指向的内存地址吧

user: user-9
content: 也试过q=(int)p  如果返回值那么 这个不该是q = (int *)p;吗 return q; 你传进来 又传出去 是在开玩笑吗。  如果返回的是地址 int *q = p; return q;  你何不直接不调用函数 直接 在外面打印p的地址 为什么要返回printf 格式化字符 %p

user: user-8
content: unsigned int GetPtrAddr(int* p) { 	return (unsigned int)p; }

user: user-10
content: 你返回的类型要匹配啊 int* test(int*p)

user: user-11
content: 你想说的是 return *p 吧？
user-0 提问: 类型转换问题

回复:
user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

user: user-2
content: 引用 7 楼 lm_whales 的回复:同一数据，内部二进制数据是相同的， unsigned 和 signed 表示不同数值 而高级语言，和汇编语言，都会使用十进制表示数据 对于 负数， 同一数值 的 unsigned 表示一个很大的正数 -1 对应的 unsigned， 距离数据溢出还差 1，即最大无符号数 如此而已  32 Bit   溢出值为 4294967296，(unsigned)-1 = 4294967295 signed 到unsigned  实际上并不存在转化动作， 只有类型本身需要转换一下 指针以外， 真正需要转换动作的转换， 的内置数据类型之间，有以下几种  1）在不同长度的整型之间（a符号或者无符号扩展，b数据截断） 2）在不同长度的浮点型之间（a有效数据和指数扩展，b直接截断） 3）在整型和浮点型之间，（a数据扩展，b直接截断，四舍五入，或者取可表示的最大值等等）  +1

user: user-3
content: C语言无符号数和有符号数之间的转换，转换的原则是底层的位表示保持不变。  当一种类型的表达式被赋值给另外一种类型的变量时，转换是隐式发生的： int tx, ty; unsigned ux, uy; tx = ux;//ux的值转换为signed uy = ty;//ty的值转换为unsigned

user: user-3
content: 《CSAPP》：信息的表示和处理

user: user-4
content: 已经声明的类型还会改变？silly boy.

user: user-5
content: 2）在不同长度的浮点型之间（a有效数据和指数扩展，b直接截断，四舍五入，等等）

user: user-1
content: 电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！  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-5
content: 同一数据，内部二进制数据是相同的， unsigned 和 signed 表示不同数值 而高级语言，和汇编语言，都会使用十进制表示数据 对于 负数， 同一数值 的 unsigned 表示一个很大的正数 -1 对应的 unsigned， 距离数据溢出还差 1，即最大无符号数 如此而已  32 Bit   溢出值为 4294967296，(unsigned)-1 = 4294967295 signed 到unsigned  实际上并不存在转化动作， 只有类型本身需要转换一下 指针以外， 真正需要转换动作的转换， 的内置数据类型之间，有以下几种  1）在不同长度的整型之间（a符号或者无符号扩展，b数据截断） 2）在不同长度的浮点型之间（a有效数据和指数扩展，b直接截断） 3）在整型和浮点型之间，（a数据扩展，b直接截断，四舍五入，或者取可表示的最大值等等）

user: user-6
content: 类型是不会改变的

user: user-7
content: 申明的类型是告诉编译器，不会改变

user: user-8
content: 不会的，楼主想一想char类型变量超过范围出现的情况，应该就知道了

user: user-9
content: max 永远都是 unsigned int 类型。

user: user-10
content: 不会的。仍是unsigned int 对16位机来说，4-5=65535，3-5=65534 对32位机来说，4-5=4294967295
user-0 提问: 有关C语言函数声明和include的问题

回复:
user: user-1
content: 建议楼主随便找个开源C项目的源代码参考一下人家是怎么做的。

user: user-0
content: 引用 6 楼 pengzhixi 的回复:不是的 如果函数是static那么你只能在定义的那个c文件里面使用。即使在头文件里面声明那也不行   谢谢您的解答我明白了

user: user-2
content: 不是的 如果函数是static那么你只能在定义的那个c文件里面使用。即使在头文件里面声明那也不行

user: user-0
content: 引用 1 楼 pengzhixi 的回复:首先不推荐在头文件实现一个全局函数。因为头文件可能会被很多其他的cpp文件包含，这样造成了编译器和连接器的负担，而且容易和其他cpp文件里面的函数定义起冲突。就你目前所说的情况来说，如果你main.c里面include了.h那么直接用都不需要声明该函数   谢谢您的解答我明白的，如果想要安全并且规范一点声明在.h函数定义在.c这样函数是static的时候它也会有意义。

user: user-0
content: 引用 1 楼 pengzhixi 的回复:首先不推荐在头文件实现一个全局函数。因为头文件可能会被很多其他的cpp文件包含，这样造成了编译器和连接器的负担，而且容易和其他cpp文件里面的函数定义起冲突。就你目前所说的情况来说，如果你main.c里面include了.h那么直接用都不需要声明该函数   请问您平时怎么做？

user: user-3
content: 我上面说包含两次会有编译错误的前提是你在.h里面定义了函数的实现。

user: user-3
content: 正确的做法是.h里面只包含声明，.c里面来定义。 检查一个.h文件是否包含定义的常用手段是同一个.c包含两次来测试。 比如你在main.c里面这样写肯定会有编译错误。 #include "test.h" #include "test.h" 也许你会说谁会这么无聊包含两次啊。不过这样做主要是保证多个.c文件包含同一个.h的时候不会报错。

user: user-2
content: 首先不推荐在头文件实现一个全局函数。因为头文件可能会被很多其他的cpp文件包含，这样造成了编译器和连接器的负担，而且容易和其他cpp文件里面的函数定义起冲突。就你目前所说的情况来说，如果你main.c里面include了.h那么直接用都不需要声明该函数
user-0 提问: codeblocks怎么警告都build不过去？

回复:
user: user-0
content: 引用 5 楼 user-4 的回复:警告啊，i 没有使用嘛，不理解？  关键是不能运行啊，难道还得配置一下。。。

user: user-1
content: 没准codeblocks在哪事先就这么配置的。

user: user-2
content: 是什么错误？

user: user-3
content: 不同作用域内有重名变量——当前作用域覆盖外面作用域的同名变量，警告相当于提示你是不是有错误！如果没有，忽视它即可！ 其次是函数声明有返回值，但是函数内没有发现return语句的警告！ 如果不想有任何警告提示，在配置选项里设置一下，可以屏蔽所有警告！

user: user-0

user: user-4
content: 警告啊，i 没有使用嘛，不理解？

user: user-0
content: 引用 2 楼 turingo 的回复:是什么错误？  未使用的变量啊，int i，后面没有用
user-0 提问: 关于结构体变量非定义时初始化问题

回复:
user: user-0
content: 引用 7 楼 zhao4zhong1 的回复:“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。 赵老师求教：如果说 sss = { 1, "Leonard" }; 是对变量赋值的话，那怎么才算对变量非定义时初始化？

user: user-1
content: 引用 7 楼 zhao4zhong1 的回复:“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-2
content: c语言不能这样做的。。。 还有用VS写出来的基本都是C/C++，而不是单纯的C

user: user-3
content: 非定义时初始化是语法糖。 语法糖越甜，编译调试查错越苦！ 把有限的生命浪费在品尝/品鉴无穷多种的语法糖中，我认为不值当。

user: user-4
content: 2013 遵循 C++11标准，允许用初始化表给类，结构赋值， 数组不清楚允不允许，应该不允许吧

user: user-5
content: 引用 8 楼 C0909 的回复:  为何很多人都把struct  写在函数里！  强迫症 = =！  刚开始就没养成好的习惯  不过小代码 无所谓了

user: user-3
content: “变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。

user: user-6
content: 是的  引用 2 楼 r55393344 的回复:引用 1 楼 turingo 的回复:在C++中不是叫初始化，而是结构体整体赋值吧。那么C语言确实不允许非定义时初始化的是吗？

user: user-7
content: sss = { 1, "Leonard" };会报错~ 我试了一下，结构体定义在main外，结构体没有赋值会有默认值：  #include <stdio.h> #include <string.h> struct stu { 	int num; 	char name[20]; } s, ss, sss; int main(void) { 	//sss = {1, "Leonard"}; //非定义时初始化 	s.num = 1; strcpy_s(s.name, "Tyler"); 	ss.num = 1; strcpy_s(ss.name, "Jason");  	printf("s.num = %d, s.name = %s\n", s.num, s.name); 	printf("ss.num = %d, ss.name = %s\n", ss.num, ss.name); 	printf("sss.num = %d, sss.name = %s\n", sss.num, sss.name);  	getchar(); 	return 0; }  像楼主将结构体定义放在main里面那样，运行结果就是这样：

user: user-0
content: 引用 1 楼 turingo 的回复:在C++中不是叫初始化，而是结构体整体赋值吧。那么C语言确实不允许非定义时初始化的是吗？

user: user-6
content: 在C++中不是叫初始化，而是结构体整体赋值吧。

user: user-8
content: 引用 7 楼 zhao4zhong1 的回复:“变量赋值”和“变量初始化”不是一回事！ “变量赋值”发生在运行期，其写法遵循赋值语法规定。 “变量初始化”发生在编译期或运行期，其写法遵循初始化列表语法规定。 赵老师讲的一针见血， 学习了。

user: user-9
content: 为何很多人都把struct  写在函数里！  强迫症 = =！
user-0 提问: 来人+++++++++++++++

回复:
user: user-1
content: 只有数组初始化的时候可以这么用，二维可以省掉第一个维度的值，但是你必须把所有元素写出来，编译器自动会计算出来，呵呵

user: user-2
content: 引用 2 楼 tenmenglin 的回复:[quote=引用 1 楼 user-2 的回复:] dxsz[wei[i]]用数字做下标取得该数字的大写数字 可是他定义的是二维数组啊[/quote] 你告诉我dxsz[0], dxsz[1]里面存放了什么

user: user-0
content: 引用 1 楼 user-2 的回复:dxsz[wei[i]]用数字做下标取得该数字的大写数字 可是他定义的是二维数组啊

user: user-2
content: dxsz[wei[i]]用数字做下标取得该数字的大写数字
user-0 提问: C内存地址访问报错：Access Violation

回复:
user: user-1
content: 引用 1 楼 wjl123 的回复:我找到原因了。因为我的工程项目文件里有一个同名的create_hash_table，系统调用的是那个函数，而不是这个函数，所以出现了异常。我明白了。 编译器没报错或给出警告？

user: user-0
content: 我找到原因了。因为我的工程项目文件里有一个同名的create_hash_table，系统调用的是那个函数，而不是这个函数，所以出现了异常。我明白了。
user-0 提问: 最右数字 求帮助 只有几行代码

回复:
user: user-0
content: 引用 5 楼 anshiny 的回复:int num[10][4]={{0,0,0,0},{1,1,1,1},{6,2,4,8},{1,3,9,7},{6,4,6,4},                     {5,5,5,5},{6,6,6,6},{1,7,9,3},{6,8,4,2},{1,9,1,9}};  ....这错误....谢啦!

user: user-1
content: int num[10][4]={{0,0,0,0},{1,1,1,1},{6,2,4,8},{1,3,9,7},{6,4,6,4},                     {5,5,5,5},{6,6,6,6},{1,7,9,3},{6,8,4,2},{1,9,1,9}};

user: user-1
content: int num[10][4]={{0,0,0,0},{1,1,1,1},{8,2,4,6},{1,3,9,7},{6,4,6,4},                     {5,5,5,5},{6,6,6,6},{1,7,9,3},{6,8,4,2},{1,9,1,9}};

user: user-1
content: int num[10][4]={{0,0,0,0},{1,1,1,1},{6,2,4,8},{1,3,9,7},{6,4,6,4},                     {5,5,5,5},{6,6,6,6},{1,7,9,3},{6,8,4,2},{1,9,1,9}};

user: user-0
content: 引用 1 楼 user-2 的回复:oj上面报的是什么错  Wrong Answer

user: user-2
content: oj上面报的是什么错