Mxode/CSDN-C_Language-2013_2023 huggingface dataset:
user-0 提问: 小白求助

回复:
user: user-0
content: 明白了，谢谢！

user: user-1
content: 好像链表最后next 不是NULL

user: user-2
content: 问题主要有两个： 1.ListInsert里的strncpy(s->hobby,c,sizeof(c)); 不能这样用，因为数组做实参传递，自动退化为指针 所以你sizeof(c)永远都是4，要改成strncpy(s->hobby,c,strlen(c) + 1); 不改的话可能会输出垃圾值，但崩溃的地方不在这 2.崩溃的地方在ListTraverse函数内，如果遍历到最后一个结点p=p->next直接崩 （因为你之前insert的时候没有将新插入结点的next指针置成NULL）所以访问p->next会报异常 所以要在之前的ListInsert函数内填上s->next=NULL; //我已经在代码里注释了  #include<stdio.h> #include<stdlib.h>  #include<string.h>  //所需状态语句 #define N 10  #define TURE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE -1   //infesible 不可实行的 #define OVERFLOW -2    //overflow 溢出  typedef int status; typedef int ElemType;   typedef struct Per  { 	char name[N]; 	status age; 	char hobby[N]; 	struct Per *next;   }per; typedef struct Per *LinkList;   status INitList(LinkList *L) { 	*L=(LinkList)malloc(sizeof(per)); 	if(!(*L)) 		return ERROR; 	(*L)->next=NULL; //因为 “先申请产生一个头结点” 其实就是建立一个带头结点的 空 单 	//链表，而一个带头结点的 空 单链表，其头结点也就是尾结点。因此，以后插入新结点（p） 	//就简单了：p->next = (*L)->next; (*L)->next = p;  //插入到表头 	return OK;  } int ListLength(LinkList L) { 	int i = 0; 	LinkList p = L->next;        /* p指向第一个结点 */ 	while (p) 	{ 		i++; 		p=p->next; 	}  	return i; } status ListInsert(LinkList *L,int i,ElemType e,char c[N],char h[N]) { 	/* 初始条件：单链表L已存在， 1<= i <= ListLength(L) */ 	/* 操作结果：在L中第i个位置之前插入新的数据元素e，L的长度加1 */ 	int j; 	LinkList s,p;  	p=*L; 	j=1; 	while(p&&j<i)   //p链表不为空成立  	{ 		p=p->next; 		j++;  	} 	if(!p||j>i) 		return ERROR;  	s=(LinkList)malloc(sizeof(per)); 	s->age=e;  	//strncpy(s->hobby,c,sizeof(c));   //s->hobby=*c;  	//strncpy(s->name,h,sizeof(h));    //s->name=*h;  	strncpy(s->hobby,c,strlen(c) + 1); 	strncpy(s->name,h,strlen(h) + 1);   	p->next=s; 	s->next=NULL; //这里要置成NULL！！！！！！！！！！！！！！！！！！！！！！！！！！！！！ 	return OK; 	 }  status visit(ElemType e,char c[N], char h[N]) { 	printf("%s        %s         %d",h,c,e); 	return OK;   }  status ListTraverse(LinkList L) { 	LinkList p=L->next; 	while(p) 	{ 		visit(p->age,p->name,p->hobby); 		p=p->next;  		printf("\n");  	}  	printf("是这里错了么？"); 	return OK;  } void main() { 	LinkList into;  	int i,k; 	int e; 	char c[N],h[N];  	printf("请问您统计了多少同学:"); 	scanf("%d",&i); 	getchar();  	status j; 	j= INitList(&into);  	for(k=1;k<=i;k++) 	{ 		scanf("%d",&e); 		scanf("%s",c); 		scanf("%s",h); 		j=ListInsert(&into,k,e,c,h);   	} 	ListTraverse(into);  	printf("验证是否为空：ListLength(L) = %d \n",ListLength(into)); }

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

回复:
user: user-1
content: else(judge_type[i]==2)这句不对，应该是else if(judge_type[i]==2)  #include<stdio.h> #include<string.h>  int cal_score(int score[],int judge_type[],int n) { 	int i,total_score; 	int e_sum=0; 	int p_sum=0; 	int e_num=0; 	int p_num=0; 	for(i=0;i<n;i++) 	{ 		if(judge_type[i]==1) 		{ 			e_sum+=score[i]; 			e_num++; 		} 		else if(judge_type[i]==2) 		{ 			p_sum+=score[i]; 			p_num++; 		} 	} 	if(p_num==0) 		total_score=e_sum/e_num; 	else 		total_score=(e_sum/e_num)*0.6+(p_sum/p_num)*0.4; 	printf("The score is:%d\n",total_score); }  int main() { 	int n=10; 	int score[10]={7,8,6,7,8,9,6,7,9,8.5}; 	int judge_type[10]={1,1,1,2,2,1,1,2,1,2}; 	cal_score( score,judge_type,n); }

user: user-0
content: 嗯，明白了，感谢
user-0 提问: 一个递归问题

回复:
user: user-1
content: 赵老师总是这么精妙

user: user-2
content: 加else,putchar就会只在i <= 0时才执行, 否则无论i为几都会执行. return;不是必要的

user: user-3
content: 不加else，任何时候均会执行putchar('0'+r);，否则仅在不满足if时执行 最后的return可以不需要

user: user-4
content: “给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出
user-0 提问: 本人是小白，自己对着视频编了一个贪吃蛇能编译但是运行出错，求大神帮忙修改一下代码

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

user: user-2
content: 在哪里出问题 找到相应的代码 打断点看
user-0 提问: curl 使用的疑惑 回调接口 数据为空

回复:
user: user-1
content: 仅供参考：void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }
user-0 提问: turbo c 项目编译提示未定义符号

回复:
user: user-1
content: TC有几种配置，分别对应不同模式 tiny ,small .... 每种模式需要一个对应的初始化代码模块，如果你的初始化代码没编译出来，可以调用 bld 编译一下

user: user-2
content: Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

user: user-3
content: 实现方法找不到，要连接库一起编译

user: user-4
content: 现在还用Turbo C，建议直接用VS上手！

user: user-5
content: 几个C文件都加入项目了吗？ 不过现在除了学习老代码，不推荐用TC了，至少也要用VC6

user: user-0
content: 还是不明白，那单一文件编译的环境设置没有改变，怎么用项目编译就找不到库文件。那要怎么设置呢，或者如何处理？谢谢指点！

user: user-6
content: 有头文件，没有链接对应的库
user-0 提问: 定义了全局变量，在input中list不为空，为什么print中list为空

回复:
user: user-1
content: 改为如下可以得出结果：  #include<iostream> #include<stdio.h> using namespace std; #define N 4 struct node{     int score;     struct node*link; }; struct node node; struct node*list,*p,*r,*q; void input() {     int i;     int ch;     list = NULL;     for(i=0;i < N; i++)     {         p=(struct node*)malloc(sizeof(struct node));         printf("please input the score of %d\t",i+1);         scanf("%d",&p->score);         p->link=NULL;         if(list==NULL)             list=p;         else             r->link=p;         r=p;         printf("数据为%d",p->score);     } } void average() {     int s=0,i;     double average2;      if(list==NULL)         printf("链表为空");     for(i=0;i < N; i++)     {         s+=list->score;         list=list->link;     }     average2=(double)s/N;     printf("平均值为:%lf\n",average2); } void print() {     int i;     printf("顺利进入\n");     if(list==NULL)         printf("这是空链表");     else     {         q=list;         while(q!=NULL)//这里只需要判断q就行         {             printf("%d\n",q->score);             q=q->link;         }     }} int main() {     void input();     void average();     void print();     int ah;     system("cls");     while(1){         printf("链表操作系统:");         printf("\n1.建立链表\n2.输出数据\n3.求平均数\n");         scanf("%d",&ah);         switch(ah){         case 1:input();break;         case 2:print();break;         case 3:average();break;         default:printf("wrong!");break;         }     } }  有几个问题： 1.既然list指针已经变成全局的了，就不要传参了，楼主那样传一级指针是没有用的，操作的都是list的一个副本，所以就算插入的代码没错，也会输出是空链表（传二级指针可以解决） 2.输出的函数里while循环只要判断while(q!=NULL)就行了

user: user-2
content: //申请的是指针的空间 p=(struct node*)malloc(sizeof(struct node*)); //应该申请结构体的空间 p=(struct node*)malloc(sizeof(struct node));
user-0 提问: 我是C语言菜鸟，这是一个跟整型、字符型相关的基础问题……

回复:
user: user-1
content: 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }  #include <stdio.h> char s[]="123 ab 4"; char *p; int v,n,k; void main() {     p=s;     while (1) {         k=sscanf(p,"%d%n",&v,&n);         printf("k,v,n=%d,%d,%d\n",k,v,n);         if (1==k) {             p+=n;         } else if (0==k) {             printf("skip char[%c]\n",p[0]);             p++;         } else {//EOF==k             break;         }     }     printf("End.\n"); } //k,v,n=1,123,3 //k,v,n=0,123,3 //skip char[ ] //k,v,n=0,123,3 //skip char[a] //k,v,n=0,123,3 //skip char[b] //k,v,n=1,4,2 //k,v,n=-1,4,2 //End.

user: user-2
content: 建议楼主看下c库函数，基本的还是要知道的

user: user-3
content: case 'd':     break; case 'x':     break;

user: user-4
content: 控制台输入的都是ASCII码，包括输入的数字其实也是ASCII码，然后根据scanf中的%d再转化为整型 如果你输入格式是%d，但你输入的不是一串'0'~'9'的字符，那么就会转换失败，所以a的值没有变 建议深入了解一下scanf的原理

user: user-5
content: if (1 == scanf( "%d", &a )) { //a成功赋值。 }
user-0 提问: 该C程序，显示结果为什么为0？？

回复:
user: user-0
content: 不知道怎么针对每一楼的回复进行相应的回复。再次统一感谢！ 对于一楼所说：其实调试过程已经单步追踪过了，因为不细心愣是没发现数据类型不匹配的问题。。。不过还是谢谢您的回答。 如二楼、三楼，进行了改正，再此不胜感激。谢谢！

user: user-1
content: printf("i=%f\n",i); printf("j=%f\n",j);

user: user-2
content: %d 改成 %.0f

user: user-3
content: 为何不单步跟踪程序运行，观察每一步变量的值的变化情况，然后分析出原因
user-0 提问: 填字游戏

回复:
user: user-1
content: 循环遍历就行，如果乘数与被乘数都变就两重循环，否则就一重

user: user-2
content: 穷举法吧。但好象无解：//      12345 //         *1 //----------- //     555555 #include <stdio.h> int main() {     int a,i;      a=555555/12345+1;     for (i=1;i<a;i+=10) {         if (i*12345==555555) {             printf("12345*%d==555555\n",i);             break;         }     }     return 0; }

user: user-0
content: 谁会？？？？？
user-0 提问: 初学者long double 在win10上输出的问题

回复:
user: user-1
content: 在Win10下编程，就用VS2017.

user: user-2
content: 我跟楼主一样的问题，输出也一样。用的编译器是gcc 4.9.2，后来升级成gcc 5.3.0都还是一样，至今没找到原因。

user: user-3
content: http://en.cppreference.com/w/c/io/fprintf

user: user-4
content: 编译器位数不同吧 32和64输出不一样

user: user-0
content: 编译器是C-free5.0 书上是VC7.1 显示的

user: user-5
content: 不说什么编译器别人基本上也帮不了你。
user-0 提问: 帮我看看程序哪儿写得不行

回复:
user: user-1
content: 代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。  有时不将“调用函数名字＋各参数值，进入函数后各参数值，中间变量值，退出函数前准备返回的值，返回函数到调用处后函数名字＋各参数值＋返回值”这些信息写日志到文件中是无论如何也发现不了问题在哪里的，包括捕获各种异常、写日志到屏幕、单步或设断点或生成core文件、……这些方法都不行！ 写日志到文件参考下面： #include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h> #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf #endif //Log{ #define MAXLOGSIZE 20000000 #define MAXLINSIZE 16000 #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; static char logstr[MAXLINSIZE+1]; char datestr[16]; char timestr[16]; char mss[4]; CRITICAL_SECTION cs_log; FILE *flog; #ifdef WIN32 void Lock(CRITICAL_SECTION *l) {     EnterCriticalSection(l); } void Unlock(CRITICAL_SECTION *l) {     LeaveCriticalSection(l); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;      if (NULL==pszFmt||0==pszFmt[0]) return;     _vsnprintf(logstr,MAXLINSIZE,pszFmt,argp);     ftime(&tb);     now=localtime(&tb.time);     sprintf(datestr,"%04d-%02d-%02d",now->tm_year+1900,now->tm_mon+1,now->tm_mday);     sprintf(timestr,"%02d:%02d:%02d",now->tm_hour     ,now->tm_min  ,now->tm_sec );     sprintf(mss,"%03d",tb.millitm);     printf("%s %s.%s %s",datestr,timestr,mss,logstr);     flog=fopen(logfilename1,"a");     if (NULL!=flog) {         fprintf(flog,"%s %s.%s %s",datestr,timestr,mss,logstr);         if (ftell(flog)>MAXLOGSIZE) {             fclose(flog);             if (rename(logfilename1,logfilename2)) {                 remove(logfilename2);                 rename(logfilename1,logfilename2);             }         } else {             fclose(flog);         }     } } void Log(const char *pszFmt,...) {     va_list argp;      Lock(&cs_log);     va_start(argp,pszFmt);     LogV(pszFmt,argp);     va_end(argp);     Unlock(&cs_log); } //Log} int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL); #endif     for (i=0;i<10000;i++) {         Log("This is a Log %04d from FILE:%s LINE:%d\n",i, __FILE__, __LINE__);     } #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //1-78行添加到你带main的.c或.cpp的那个文件的最前面 //81-85行添加到你的main函数开头 //89-93行添加到你的main函数结束前 //在要写LOG的地方仿照第87行的写法写LOG到文件MyLog1.log中

user: user-0
content: 对啊，这只是对应的执行积分操作的程序，还有控制系统和控制端口的程序，太多了这里就没写。 这儿直说控制积分的部分出现了什么问题。

user: user-2
content: 代码不全啊，运行不了
user-0 提问: 控制台窗口显示图片

回复:
user: user-1
content: #pragma comment(lib,"user32") #pragma comment(lib,"gdi32") #include <stdlib.h> #include <conio.h> #include <windows.h> HWND WINAPI GetConsoleWindow(); void HideTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = FALSE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } void ShowTheCursor() {     CONSOLE_CURSOR_INFO cciCursor;     HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);     if (GetConsoleCursorInfo(hStdOut, &cciCursor)) {         cciCursor.bVisible = TRUE;         SetConsoleCursorInfo(hStdOut, &cciCursor);     } } int main() {     HWND  hwnd;     HDC   hdc;     HFONT hfont;     HBITMAP hbm;     HDC hdcBits;     BITMAP bm;      system("color F0");     system("cls");     HideTheCursor();     hwnd  = GetConsoleWindow();     hdc   = GetDC(hwnd);     hbm=LoadImage(0,"C:\\Windows\\Soap Bubbles.bmp",IMAGE_BITMAP,0,0,LR_DEFAULTSIZE|LR_LOADFROMFILE);     if (hbm) {         hdcBits = CreateCompatibleDC(hdc);         GetObject (hbm, sizeof(BITMAP), &bm);         SelectObject(hdcBits,hbm);         BitBlt(hdc,200,10,bm.bmWidth, bm.bmHeight,hdcBits,0,0,SRCCOPY);         DeleteDC(hdcBits);         DeleteObject(hbm);     }     hfont = CreateFont(24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, "华文楷体");     SelectObject(hdc,hfont);     SetTextColor(hdc,RGB(255,255,255));     SetBkMode(hdc,TRANSPARENT);     TextOut(hdc,210,30,"这个背景是泡泡",14);     DeleteObject(hfont);     ReleaseDC(hwnd,hdc);     getch();     system("color 07");     system("cls");     ShowTheCursor();     return 0; }

user: user-2
content: >>>完善一下，只可惜覆盖后不会自画  EasyX好

user: user-3
content: 完善一下，只可惜覆盖后不会自画 #define _WIN32_WINNT 0x0500 #include <Windows.h> #include <stdio.h>  #pragma comment(lib, "kernel32")  int main(void) {        HWND hWnd = GetConsoleWindow();    HDC hdc = GetDC(hWnd);    HDC memhDc = CreateCompatibleDC(hdc);    HBITMAP hBitmap = (HBITMAP)LoadImage(NULL, "1.bmp", IMAGE_BITMAP, 0, 0, LR_LOADFROMFILE|LR_CREATEDIBSECTION);    SelectObject(memhDc, hBitmap);    {       BITMAP bmp;       int i;       GetObject(hBitmap, sizeof(BITMAP), &bmp);       for (i = 0; i < bmp.bmHeight / 15; ++i)       {          putchar('\n');       }       BitBlt(hdc, 0, 0, bmp.bmWidth, bmp.bmHeight, memhDc, 0, 0, SRCCOPY);    }    DeleteObject(hBitmap);    DeleteDC(memhDc);    ReleaseDC(hWnd, hdc);    return 0; }
user-0 提问: 求教！如何上界面。

回复:
user: user-1
content: VB6

user: user-1
content: 引用 5 楼 zhao4zhong1 的回复:VB6 VB6可视化程序设计(无锡职业技术学院)http://download.csdn.net/detail/zhao4zhong1/6824713

user: user-2
content: 关于上界面，仅供参考： 从C语言的菜单界面管理系统到C++ Builder的图形用户界面，一个简单的电话簿Demo例子 http://blog.163.com/tab_98/blog/static/1192409720158673337998/

user: user-3
content: 推荐个很老的游戏库，SDL，很多之前的游戏就是用这做的，像象棋，仙剑，坦克大战等，完全要用c语言写，界面都是代码实现的。

user: user-4
content: 据说c++可以编写上位机，用VC的MFC

user: user-5
content: vc写点小程序蛮好的
user-0 提问: 菜鸟求助一个关于C语言循环输入字符串的问题，我相信大神们肯定也被问过好多次！

回复:
user: user-1
content: EOF 文件结束

user: user-2
content: 引用 2 楼 xusongge 的回复:引用 1 楼 user-5 的回复:放在while循环里面不行吗，跳出的条件是 输入结束 ，至于其中输入的字符串保存起来不就行了吗，循环结束输出不知道循环次数啊兄弟，而且题目也没说什么时候结束，可能输入3行结束，可能4行，可能5行...  放在while(1)循环里，循环中生成一个随机数，当这个数满足某种条件时退出循环

user: user-3
content: Linux：Ctrl+D Windows：Enter、Ctrl+Z、Enter

user: user-4
content: 引用 2 楼 xusongge 的回复:引用 1 楼 user-5 的回复:放在while循环里面不行吗，跳出的条件是 输入结束 ，至于其中输入的字符串保存起来不就行了吗，循环结束输出不知道循环次数啊兄弟，而且题目也没说什么时候结束，可能输入3行结束，可能4行，可能5行... 不用考虑循环次数啊，不等于EOF不就行了。(c = getchar() != EOF)

user: user-0
content: 引用 1 楼 user-5 的回复:放在while循环里面不行吗，跳出的条件是 输入结束 ，至于其中输入的字符串保存起来不就行了吗，循环结束输出不知道循环次数啊兄弟，而且题目也没说什么时候结束，可能输入3行结束，可能4行，可能5行...

user: user-5
content: 放在while循环里面不行吗，跳出的条件是 输入结束 ，至于其中输入的字符串保存起来不就行了吗，循环结束输出
user-0 提问: 求助！vs2010下winpcap环境设置问题！

回复:
user: user-1
content: 引用 2 楼 aiur233 的回复:[quote=引用 1 楼 lianshaohua 的回复:] 1、怀疑是他的lib库编译的工具不是vs2010导致的 2、有可能是你工程编码与他的编码不一致 我重新下了一遍winpcap开发者包，从头配置了一下，现在好了，我还是不知道为什么[/quote] 有可能是包的问题

user: user-0
content: 引用 1 楼 lianshaohua 的回复:1、怀疑是他的lib库编译的工具不是vs2010导致的 2、有可能是你工程编码与他的编码不一致 我重新下了一遍winpcap开发者包，从头配置了一下，现在好了，我还是不知道为什么

user: user-1
content: 1、怀疑是他的lib库编译的工具不是vs2010导致的 2、有可能是你工程编码与他的编码不一致
user-0 提问: c语言中删除字符串中的特定字符的问题

回复:
user: user-1
content: %c int c？？？

user: user-2
content: 层主 这个问题我也不明白啊 你解释的我也没明白 能再给我详细讲讲吗

user: user-0
content: 有点不踏实感，刚梳理一下，现在清晰了。谢楼上

user: user-3
content: 引用 6 楼 qq_28840093 的回复:再回三楼。dev c++对于字符的类型没有特别要求，用int 和char一样。c-free里更改成char，就可以了。都是试验，不敢相信，需要权威哎--。 所以是OK了么？

user: user-0
content: 再回三楼。dev c++对于字符的类型没有特别要求，用int 和char一样。c-free里更改成char，就可以了。都是试验，不敢相信，需要权威哎--。

user: user-3
content: 引用 4 楼 qq_28840093 的回复:弄不来调试。手写步骤，明白楼上这句话【str1的下标不应该变，否则str1这个位置也同样跳过了】的意思了。那第三个应该是对的呀。比如：are you all right? 输入r。第一步：str[0]->str1[0] = a ,j++为1,i++为1. 第二步：str[1]=r,跳过，i++为2，j仍然为1.第三步。这样试数，好像没什么地方不对。在dev c++中确实实现了。可是在c-free中没有变动。还是迷糊.. 楼主的你的int c改为char c没，如果是int c的话我这里VS也得不到正确结果

user: user-0
content: 弄不来调试。手写步骤，明白楼上这句话【str1的下标不应该变，否则str1这个位置也同样跳过了】的意思了。那第三个应该是对的呀。比如：are you all right? 输入r。第一步：str[0]->str1[0] = a ,j++为1,i++为1. 第二步：str[1]=r,跳过，i++为2，j仍然为1.第三步。这样试数，好像没什么地方不对。在dev c++中确实实现了。可是在c-free中没有变动。还是迷糊..

user: user-3
content: 楼主的第一和第二个是一样的效果，i和j的值在每次循环里都是一样的值。。。。换汤不换药啊。。。 第三个可以是因为，你应该跳过str里等于c的字符，而此时str1的下标不应该变，否则str1这个位置也同样跳过了（之前存着什么就是什么，如果没有清零那么将会是垃圾值） 楼主这里第三个运行是正确的么？我这里VC编译器是不行的 应该要将int c;改成char c; 而且char str1[100];改为char str1[100] = {0};否则数组没有\0结尾会输出很多个垃圾字符来

user: user-0
content: .................dev c++单步调试用不了，在下其他编译器。等下试试吧

user: user-4
content: 建议单步跟踪程序运行，每一步观察各变量怎么变化的
user-0 提问: C语言中遇到了一个小的疑问

回复:
user: user-0
content: 谢谢大家的回复，受益匪浅

user: user-1
content: 引用 5 楼 u014472726 的回复:[quote=引用 2 楼 qq423399099 的回复:] 数组名是个常量，指针才是变量。 char str[] ="helloworld"; 这是编译器事先界定了的，它是一个常量指针变量，初始化后，无法再变更。  str++，机器侦测到你有意图变更它，立刻报警，机器天生明白。谢谢你的回答，我只是有点疑问 不是数组名就是指向数组的指针，所以我有点晕[/quote] 哈哈，刚学是有点晕的，楼主加油

user: user-0
content: 引用 2 楼 qq423399099 的回复:数组名是个常量，指针才是变量。 char str[] ="helloworld"; 这是编译器事先界定了的，它是一个常量指针变量，初始化后，无法再变更。  str++，机器侦测到你有意图变更它，立刻报警，机器天生明白。谢谢你的回答，我只是有点疑问 不是数组名就是指向数组的指针，所以我有点晕

user: user-2
content: 你定义的是str，下面用的又是src  假设你是打错了，但src是字符数组，而不是指针，不能进行++运算

user: user-3
content: 修改如下：  #include<stdio.h> #include<string.h> int main() { 	char str[] = "helloworld"; 	//这里的赋值，不就是为了日后的使用吗！ 	char *p = str; 	int i; 	for (i = 0; i <= 10; i++) 	{ 		//if (strncmp(src, "l", 1) == 0) 		if (strncmp(p, "l", 1) == 0) 		{ 			printf("p =%s\n", p); 		} 		p++; 	} 	return 0; }

user: user-1
content: 数组名是个常量，指针才是变量。 char str[] ="helloworld"; 这是编译器事先界定了的，它是一个常量指针变量，初始化后，无法再变更。  str++，机器侦测到你有意图变更它，立刻报警，机器天生明白。

user: user-4
content: src是数组类型, 不可以++
user-0 提问: 一个dbx小问题

回复:
user: user-1
content: 引用 3 楼 lovebelobe 的回复:[quote=引用 1 楼 qq423399099 的回复:] 应该是if(no == 1) 少了个=吧 请大神看看下面这样写是否正确~ stop if(no == 1)[/quote] 可以这样用的，还有stop in和stop at

user: user-2
content: if(no = =1){ return; }

user: user-0
content: 引用 1 楼 qq423399099 的回复:应该是if(no == 1) 少了个=吧 请大神看看下面这样写是否正确~ stop if(no == 1)

user: user-0
content: 引用 楼主 lovebelobe 的回复:关于下面的代码，调试的时候只想要在no=1的时候停下来，应该用when命令吗？ if(no = 1){ var = ok; } 请大神看看下面这样写是否正确~ stop if(no = 1)

user: user-1
content: 应该是if(no == 1) 少了个=吧
user-0 提问: 给无参函数传参，没有return的函数返回值

回复:
user: user-1
content: 1) int func(); 与 int func(void); 在 C 语言里得含义是不同的。 前者指声明 func 是一个函数，对参数未做任何约定。后者则表示该函数不接受任何参数。 [ 不适用于 C++ ] [ 这里说的是函数声明，不是定义 ]  2) 有返回值的函数，没有使用 return xxx; 返回一个值就结束运行，调用者又使用了这个返回值，那么这是一个未定义行为。 未定义行为可能产生任何结果，包括但不限于：产生期望的结果，产生未期望的结果，产生随机的结果，产生无法解释的结果，运行错误，随机的运行时错误，编译错误，等等

user: user-2
content: 这种行为是未定义的，如果你想知道具体的可以看生成的汇编代码，通常是返回EAX的值，看当时EAX的值是多少函数很可能就返回多少

user: user-3
content: 楼主一定要研究就看下汇编呗（这样没有返回值的VS都编译不过，楼主也不必太纠结结果） 第一个图标注的三行是调用int a = func(3);这句的  func函数：

user: user-4
content: 特别强调下楼上的答案。不要写这种代码 Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function

user: user-5
content: 未定义行为，别这么干。费半天劲折腾明白了，换个编译器可能结果又不一样了。

user: user-4
content: 在于func里面的printf的返回值引起的。里面的printf的返回值 被当成了func的返回值了。如果一个函数没有返回值，那么狠可能就直接用eax里面的值作为返回值，而eax存放的是func里面printf的返回值

user: user-4
content: 至于printf的返回值是写入多少个字符，注意是多少个字符，所以你可以算下你写入的整数是多少个字符 加上换行符就答案了
user-0 提问: typedef     #ifdef    定义结构体成员变量

回复:
user: user-0
content: 谢谢您的回答，目前已经解决了，按照您给我讲的最后一种方法。

user: user-1
content: 这应该根据不同情况（硬件平台或者软件环境）， 做的不同处理  有些编译器，会根据平台选择，编译选项的选择，自动定义一些宏 这时候，TVREG_USEZ 就自动有了定义了，不需要手动定义 TVREG_USEZ 如果编译器本身，没有这个功能，可以在写makefile 的时候，定义宏  也可以把一些需要的宏定义写在单独的头文件中，需要的时候,#include 包含进去

user: user-1
content: ////大约可以这么处理，前提是TVREG_USEZ的定义，有机会用到，不然代码写了，不编译，很难说这段代码是可用的 #ifdef TVREG_USEZ //定义了的处理代码     num *z = S->z;     num *ztilde = S->ztilde; .......................... #else  //没定义如何处理 ....................... #endif

user: user-2
content: 想要 访问z， ztilde，结构体中要有定义，那就要定义TVREG_USEZ这个宏： #define TVREG_USEZ 在头文件开头加上这条宏

user: user-3
content: #ifdef TVREG_USEZ     num *z;                     /**< Current solution of z              */     num *ztilde;                /**< Bregman variable for z constraint  */ #endif  这样用意味着如果定义了TVREG_USEZ，那么有以下两个变量，显然没有定义过TVREG_USEZ 一般用都是 #ifndef #define #endif

user: user-4
content: #ifdef TVREG_USEZ     num *z;                     /**< Current solution of z              */     num *ztilde;                /**< Bregman variable for z constraint  */ #endif 看一下这个宏哪里定义的，定义了这个宏才会包含这两个成员变量，报错是说该成员变量未定义

user: user-5
content: 根据这个.h和.c文件判断，我估计写出这个结构体（含有#if)的程序员很可能是打算实现一种C方式的模板。  要想使用该模板，可能项目中会有其他.c文件（或是需要你自己写出一个.c文件），其中的内容只有几行，大致为：  /* reg_usez_f1.c   */ #define TVREG_USEZ #define _FIDELITY 1    #include reg_resolver.c  // （假设模板文件是这个名字）注意是".c"的代码实现文件 #undef _FIDLITY  #undef TVREG_USEZ  注意不要编译作为模板的那个reg_resolver.c文件（IDE环境下，需要在工程设置中把该文件在编译选项中排除）
user-0 提问: 函数的局部变量释放问题

回复:
user: user-1
content: 引用 楼主 s609727454 的回复:有如下代码: 1. int A(int a,int b)                       2. void A(int a,int b)                       3. int A(int &a,int &b)                       4. void A(int &a,int &b) 调用函数  A(c,d)后,上面四个函数的形参哪些会释放,哪些不会?(上面的1,3调用后不赋值给变量) 1,2会，34不会

user: user-2
content: 其实电脑开机后物理内存的每个字节都是可读写的，从来不会因为所谓的new、delete或malloc、free而被创建、销毁。区别仅在于操作系统内存管理模块在你读写时是否能发现并是否采取相应动作而已。操作系统管理内存的粒度不是字节而是页，一页通常为4KB。

user: user-3
content: 你不觉得程序读写的是虚地址么... _(:3」∠)_

user: user-4
content: 不要考虑那么多，只要了解参数传递方式，和引用 的含义就可以了 函数形参在函数结束，总是会解除内存占用的 然而引用 参数是所谓别名，他只是一个对象的替身。 对他执行的操作，都作用在那个对象上。 因此，引用参数解除内存占用，不影响对象的生命周期，以及操作结果。

user: user-2
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  单步类的实例“构造”或“复制”或“作为函数参数”或“作为函数返回值返回”或“参加各种运算”或“退出作用域”的语句对应的汇编代码几步后，就会来到该类的“构造函数”或“复制构造函数”或“运算符重载”或“析构函数”对应的C/C++源代码处。  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！  有人说一套做一套，你相信他说的还是相信他做的？ 其实严格来说这个世界上古往今来所有人都是说一套做一套，不是吗？  不要写连自己也预测不了结果的代码！

user: user-5
content: 你这个释放的概念太模糊了， 怎么样叫释放？   如果是把释放定义为：把内存还给系统 那么，参数由于都是栈上的变量，函数调用完之后就是恢复现场，那都会释放  如果是把释放定义为：参数所对应的内存数据不再可用 那么对于1和2，由于是值传递，函数内对参数的修改不影响c，d的值，参数是释放掉了，不再可用 对于3和4，是引用传递，函数内对参数的修改是会影响c，d的值，参数是释放掉了，但是值是保留下来的

user: user-6
content: 对于自动储存变量，并不会“释放”内存。 C++引入了对象概念后，自动储存变量“生命结束”后，会调用其析构函数
user-0 提问: 双基回文数问题

回复:
user: user-1
content: return 0;             break; ///这个是多余的，return 和 break 只需要一个即可 别的，没看出来有何问题，你是说别人都错了么？ 别人的代码 也贴过来看看才知道

user: user-2
content: a[i]!=a[n-i-1]; i=0时 a[n]就没了
user-0 提问: 指针运用问题，不知错误在哪里？

回复:
user: user-1
content: void findm(int *prow,int *qcol,int brray[][9],int *arrmax,int m,int n) { 	for (m=0; m<5; m++) 	{ 		for (n=0; n<9; n++) 		{ if(*arrmax<brray[m][n]) 		{ 			*arrmax=brray[m][n]; 			*prow=m; 			*qcol=n; 		}  		} 	} 	return; }

user: user-0
content: #include <stdio.h>  /* userCode(<80字符): 自定义函数之原型声明 */ void findm(int *prow,int *qcol,int brray[][9],int *arrmax,int i,int j);  int main(void) { 	int array[5][9], i, j, max, maxRow, maxCol;  	printf("Input matrix:\n"); 	for (i=0; i<5; i++) 	{ 		for (j=0; j<9; j++) 		{ 			scanf("%d", &array[i][j]); 		} 	}  	/* userCode(<80字符): 调用函数查找数组中最大元素及其所在位置的行下标、列下标 */ 	 findm(&i,&j,array,&array[0][0],i=0,j=0); 	printf("\nThe max is %d, row-sub is %d, col-sub is %d\n", max, maxRow, maxCol);  	return 0; }  /* User Code Begin：考生在此后完成自定义函数的设计，行数不限 */ void findm(int *prow,int *qcol,int brray[][9],int *arrmax,int i,int j) { 	for (i=0; i<5; i++) 	{ 		for (j=0; j<9; j++) 		{ if(*arrmax<*(arrmax+1)) 			{ 				*arrmax=*(arrmax+1); 				*prow=i; 				*qcol=j; 			}			 		} 	} 	return; }
user-0 提问: 新人求教

回复:
user: user-1
content: 因为n=3时，由于是后++所以while(n++<=3)满足这个判断，之后执行循环体（此时n=4了，循环体为空） 然后此时再判断n++<=3（此时不满足），结束while循环（判断的时候又++了一次，n=5了，想必楼主是这里忽略了）

user: user-2
content: n++ 先用再加 n=3时，条件为true，此时n为4 n=4时，条件为false，此时n为5了，跳出while

user: user-3
content: ++n 和 n++ 的区别
user-0 提问: 指针与局部变量生命周期的问题

回复:
user: user-1
content: 内存释放并不会对内存清零。它只是说该段内存可以被其它地方使用了。如果该段内存被其它使用并改写，你打印的值就变了。（野指针也是指针，只是说他指向的内容有可能被其它地方改变）

user: user-2
content: 楼主要验证应该改为(楼主之前这种i的作用域并不仅仅限于for循环)  int *a = NULL; for (int i=1; i<2; i++) {     int j = i;     a=&j; } printf("%d",*a);  说明： 指针指着一个生命周期结束的变量不仅可以访问，还可以修改，只不过这种访问是不确定的 局部变量的地址都是在程序自己的堆栈中，当局部变量结束后，只要没有将该局部变量的内存地址给别的变量，其值仍然存在。但如果修改的话，是比较危险的，因为这个内存地址可能给了程序的其它变量，通过指针强行修改的话，可能会引起程序崩溃
user-0 提问: 求助！为什么用double类型会出现这种问题，而用float就不会？

回复:
user: user-1
content: 首先，你声明的是double型的变量a用来存放浮点类型的数据（也就是带有小数点的数据）。 但是呢，标准规定带小数点的字面值数据（就是你输入的数据）在缺省状况下都是double型的。 所以，你用%f的类型去存储你输入的double型数据就会出错误！(在这里，声明的变量类型和scanf里面的存储类型还有输入的数据类型三者要保持一致性)，应该把scanf里面的%f改为%lf，但是printf里面的%f就不用改也可以，也是行的。

user: user-2
content: 输出的时候用%lf试试！！！
user-0 提问: c语言判断上三角矩阵和下三角矩阵

回复:
user: user-0
content: 可以编写出来不？拜托

user: user-1
content: 设行为i列为j判断i=j时是否都为0，然后判断i<j时有没有不是0的,有的话则为上三角，反之为下三角，只要2种情况都有的跳出，判断不是三角
user-0 提问: 新人求问，在做例题，不懂为什么答案好像有点问题

回复:
user: user-0
content: 还是不行，答案还是那样子

user: user-1
content: scnaf不要有其他东西   只要scanf("%f%f=%f",&a,&b,&c);就行了输入的时候一个一个回车就行或者空格

user: user-0
content: 可以了，谢谢

user: user-1
content: #include <stdio.h> #include <math.h> void main() { 	double a, b, c, x1, x2, p, q, disc; 	scanf("%lf%lf%lf",&a, &b,&c); 	disc = b*b - 4 * a*c; 	q = sqrt(disc) / (2 * a); 	p = -b / (2 * a); 	x1 = p + q; 	x2 = p - q; 	printf("\nx1=%5.2f\nx2=%5.2f\n", x1, x2);  }

user: user-1
content: 首先别加逗号输入的时候
user-0 提问: 数据结构，二进制转换到十进制，求高手帮看，谢谢

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

user: user-1
content: main函数的while循环后面多了一个分号，去掉就对了  while(c!='#'); //这里多了一个分号！！！！！！！！！！！！！！ { Push(&s,c); scanf("%c",&c); }
user-0 提问: 麻烦帮我分析下，我创建的链表不完整还是输出的问题

回复:
user: user-0
content: 谢谢，知道了

user: user-1
content: h->next=p 改为 p=h。 不过我感觉你这样循环给链表加元素有点奇怪，我一般是创建个临时p指针移动到链表末尾，再创建新元素，添加到p指针的next域。

user: user-2
content: 应当把s=(lnode*)malloc(sizeof(lnode));放到for循环里去

user: user-0
content: 我知道是没有申请空间的缘故，但是现在我想问一下，输出时为什么总会输出头节点的数据
user-0 提问: PAT c语言简单编程错误求助

回复:
user: user-1
content: 不同的oj不同，一般来说和你在控制台又输入又输出不同，一些oj平台，stdin和stdout是分开的。 可能题目想让你这样输入和输出： 4 1 2 3 Case #1: false 2 3 4 Case #2: true 2147483647 0 2147483646 Case #3: true 0 -2147483648 -2147483647 Case #4: false

user: user-2
content: for里面的i换成j试试
user-0 提问: 语法错误

回复:
user: user-1
content: 引用 1 楼 merry_zsp 的回复:原来是一个宏定义错了o(╯□╰)o 哈哈，怪不得在楼主的代码里找不到>也找不到<

user: user-0
content: 原来是一个宏定义错了o(╯□╰)o
user-0 提问: scanf的值作为循环条件,while语句造成死循环

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

user: user-2
content: 如果输入整数 + - 是数的一部分 ，而字符不是  如果输入浮点数 e 也可能会读走

user: user-3
content: 因为你要读取的是数字，输入一个字符时， scanf函数会失败，但是这个字符还在流里面没有被读出来，所以就死循环动不了了；而getchar（）函数是读字符的，scanf函数失败，但是字符会被getchar（）函数从流里面读出来 scanf它要跳过所有非数字的字符专接收数字。那么输入了字符它就一直留在输入缓冲区；只要缓冲区有字符，scanf就要去读，一读不是数字，它就跳过，试图等到输入缓冲区没有字符了才等待你输入……如此反复，当然就“死循环”了。 至于输入+-号，我试了下，哈哈真的被读走了，但是并没有被读到a,b,c变量里，但确实真的从输入缓冲区里消失了 当使用scanf函数时，如果遇到一些匪夷所思的问题，在scanf函数后正确使用fflush(stdin);，清空输入缓冲区，可以解决很多问题。
user-0 提问: 一个关于简单实验数据处理的程序，求助！

回复:
user: user-1
content: 楼主创建一个数组保存每个输入的数字就好了，我这里是用malloc加上int *指针来保存的  #include<stdio.h> #include<iostream> using namespace std;  void main(int argc, char *argv[]) { 	double a,sum,average; 	int i,n,*m; 	printf("个数："); 	scanf("%d", &n); 	m = (int *)malloc(sizeof(int)*n); 	for(i=1,sum=0; i <=n; i++) 	{ 		printf("请输入第%d个数据:", i); 		scanf("%lf", &a); 		sum=sum+a; 		*(m+i-1) = a; 	} 	average=sum/(i-1); 	printf("Sum:=%.3f\n",sum); 	printf("Average=%.3f\n",average); 	for(i=0;i<n;i++) 		printf("第%d个数与平均数的差值为:%lf\n", i+1, *(m+i)-average); }
user-0 提问: 求大神！！！！！！！！！！！！！！新人

回复:
user: user-1
content: 楼主最后面printf("% c\n",b);改为printf("%c\n",b[0]);就能输出i了 不要用%c去输出一个字符数组

user: user-0

user: user-0
content: #include<stdio.h> void main() {     int i=0,a[12],m=0,n,j=0;     char b[100];     printf("请你输入12个整数：\n");//提示信息     for(i=0;i<12;i++)//循环输入     {         scanf("%d",&a[i]);     }     for(i=0;i<12;i++)     {         if(a[i]>a[m])         {              m=i;         }     }     printf("最大的数为%d\n",a[m]);     for(i=0;i<12;i++)     {         if(a[i]==a[m])         {             for(j=0;j<100;j++)             {                b[j]='i';                break;             }         }     }     printf("其下标为:");     printf("% c\n",b); }
user-0 提问: 指针问题

回复:
user: user-1
content: 如果a是int*类型，b要指向他，那么b需要是int**，a如果要指向b，a应该是int***，除非强制类型转换

user: user-2
content: 类型错误, int *a,*b. &b类型是int**, 不能赋予a,换成void*即可, 但是void*类型不能使用*单目运算符
user-0 提问: 出队列函数

回复:
user: user-0
content: 谢谢，可能dequeue函数在其他地方已经定义了，且在函数里面w被赋值为队头元素

user: user-1
content: 因为队列结构中一般有以下两个变量 int head, tail;  //队列的头和尾下标 head的数值表示当前队首元素的编号，自然能够通过w带出来啊。。。。

user: user-2
content: 参数是指针，可以修改函数外的变量，所以结果能带出来。 话说这接口设计的真费劲啊，直接 return int 更方便。
user-0 提问: const void* 赋值给void*的问题

回复:
user: user-0
content: 没人给答案，算了，自己摸索把。

user: user-0
content: 刚才网页特别卡，写的也不太明确。 类似char* 我对const char×的处理是： int len = strlen(str); char* newstr = (char*)malloc(sizeof(char) * len); strcpy(newstr,str); 这是我对常量字符串的赋值做的复制赋值， 但是对const void×如何做类似处理不太知道。 我知道对常量是不能改变的，但复制出来后，就是可变的了。 void*如何做呢？

user: user-1
content: 引用 4 楼 tommir3 的回复:[quote=引用 3 楼 adusuccessfully 的回复:] [quote=引用 2 楼 tommir3 的回复:] 其实可以转换一下， void* value = (void*)val; 可以使用的，但是如果向修改值是不可以的？  我还向问的是，如果向改变成可修改的，如何把val复制出一份给value  如果想修改就将int myFunction(const void* val)声明为int myFunction(void* val)   [/quote]   改动函数传入参数和Node结构的前提下，如何修改/？[/quote]  楼主问得是不改动函数传入参数和Node结构的前提下，如何修改把？  const int * p表示const修饰*p，指针p指向的内容（既*p）不能改变； int * const p表示const修饰p， 指针p的地址不能改变，但指向的内容可以改变；

user: user-0
content: 引用 3 楼 adusuccessfully 的回复:[quote=引用 2 楼 tommir3 的回复:] 其实可以转换一下， void* value = (void*)val; 可以使用的，但是如果向修改值是不可以的？  我还向问的是，如果向改变成可修改的，如何把val复制出一份给value  如果想修改就将int myFunction(const void* val)声明为int myFunction(void* val)   [/quote]   改动函数传入参数和Node结构的前提下，如何修改/？

user: user-1
content: 引用 2 楼 tommir3 的回复:其实可以转换一下， void* value = (void*)val; 可以使用的，但是如果向修改值是不可以的？  我还向问的是，如果向改变成可修改的，如何把val复制出一份给value  如果想修改就将int myFunction(const void* val)声明为int myFunction(void* val)

user: user-0
content: 其实可以转换一下， void* value = (void*)val; 可以使用的，但是如果向修改值是不可以的？  我还向问的是，如果向改变成可修改的，如何把val复制出一份给value

user: user-2
content: 看void* value;会不会修改它所指向的内存，如果不会就声明为const void* value; 如果会，就把int myFunction(const void* val)声明为int myFunction(void* val)
user-0 提问: C语言结构体和返回值问题

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

user: user-2
content: 出错时点中断，通过调用堆栈、变量窗口等观察分析原因
user-0 提问: 大家好，有个软件里面的文本信息，只能用鼠标框选后右键，然后点击跳出的复制选项，但不能用快捷键Ctrl+C复制,经常用..这样很麻烦,请问...

回复:
user: user-0
content: 引用 4 楼 u010165006 的回复:要编写代码，判断这个信息窗口当按下Ctrl+C时，复制文本到剪贴板。   求大神给个方向

user: user-0
content: 是不是不能额...

user: user-1
content: 要编写代码，判断这个信息窗口当按下Ctrl+C时，复制文本到剪贴板。

user: user-0
content: 我是不是该结贴了...来个大神拯救我..

user: user-0
content: 果然没办法吗...
user-0 提问: 想问下，if语句里的下标是如何变化的，我的想法是当p=0时*k=0，这样的话就没法比较啦？

回复:
user: user-1
content: 建议单步跟踪程序运行，每一步看各变量的值，这样你的收获会更大

user: user-2
content: 不清楚你的代码要做什么

user: user-3
content: for循环，第一次循环确实不用比，因为两者是相等的，但是它之后只执行p++ （我猜楼主是理解成指针一直指着p了对吧，它是*k=p,所以仅仅只是改变k原来所指向的空间内的值使其值等于p，k指针并不是指着p的）
user-0 提问: 右边的是什么窗口？window系统下哪里下载？名字？

回复:
user: user-1
content: 引用 6 楼 zhao4zhong1 的回复:现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！ 要不老赵写个简单的教程？

user: user-2
content: 现在的码农竟然99%都不会在cmd窗口中输入cd命令设置当前目录为程序所在目录，输入程序名运行程序了！

user: user-0
content: 引用 3楼ooolinux 的回复:引用 2 楼 labuboco 的回复:[quote=引用 1楼user-3 的回复:]窗口是terminal.app，运行的是bash。如果想在windows下获得类似的体验，可以使用MinGW或者Cygwin可以用自带运行cmd解决argv的调用问题么 在Win7下假如你用VC，假如你的程序目录在D:\C\151023_t2，可执行文件在D:\C\151023_t2\Debug，你在资源管理器窗口里打开D:\C\151023_t2文件夹，按住Shift键然后右键点击Debug文件夹，出现右键菜单，选择【在此处打开命令窗口】，就出现一个黑色的命令行窗口，输入：dir【回车】可以看到 151023_t2.exe ，输入：151023_t2【回车】可以运行这个程序，输入：151023_t2  aa  bbb【回车】可以带参数运行这个程序，aa和bbb就是两个参数。[/quote]谢谢哥们儿，互加个好友吧

user: user-1
content: 引用 4 楼 labuboco 的回复:引用 3楼ooolinux 的回复:[quote=引用 2 楼 labuboco 的回复:] [quote=引用 1楼user-3 的回复:]窗口是terminal.app，运行的是bash。如果想在windows下获得类似的体验，可以使用MinGW或者Cygwin可以用自带运行cmd解决argv的调用问题么 在Win7下假如你用VC，假如你的程序目录在D:\C\151023_t2，可执行文件在D:\C\151023_t2\Debug，你在资源管理器窗口里打开D:\C\151023_t2文件夹，按住Shift键然后右键点击Debug文件夹，出现右键菜单，选择【在此处打开命令窗口】，就出现一个黑色的命令行窗口，输入：dir【回车】可以看到 151023_t2.exe ，输入：151023_t2【回车】可以运行这个程序，输入：151023_t2  aa  bbb【回车】可以带参数运行这个程序，aa和bbb就是两个参数。[/quote]谢谢哥们儿，互加个好友吧[/quote]  我不经常在线，有问题来论坛是最好的。

user: user-0
content: 引用 1楼user-3 的回复:窗口是terminal.app，运行的是bash。如果想在windows下获得类似的体验，可以使用MinGW或者Cygwin可以用自带运行cmd解决argv的调用问题么

user: user-1
content: 引用 2 楼 labuboco 的回复:引用 1楼user-3 的回复:窗口是terminal.app，运行的是bash。如果想在windows下获得类似的体验，可以使用MinGW或者Cygwin可以用自带运行cmd解决argv的调用问题么 在Win7下假如你用VC，假如你的程序目录在D:\C\151023_t2，可执行文件在D:\C\151023_t2\Debug，你在资源管理器窗口里打开D:\C\151023_t2文件夹，按住Shift键然后右键点击Debug文件夹，出现右键菜单，选择【在此处打开命令窗口】，就出现一个黑色的命令行窗口，输入：dir【回车】可以看到 151023_t2.exe ，输入：151023_t2【回车】可以运行这个程序，输入：151023_t2  aa  bbb【回车】可以带参数运行这个程序，aa和bbb就是两个参数。

user: user-3
content: 窗口是terminal.app，运行的是bash。如果想在windows下获得类似的体验，可以使用MinGW或者Cygwin
user-0 提问: 在VC中研究C语言库函数

回复:
user: user-1
content: alloc.h 是C语言标准库中的,在VC的自带库中不包含这个头文件库  但是在VC下用 malloc.h 或者stdlib.h就能用了  因为stdlib.h是包含alloc.h的全部功能

user: user-2
content: http://www.cplusplus.com/search.do?q=allocmem  标准库没有搜到这个函数
user-0 提问: 如何在写入含有特殊符号的多行字符串时，对其进行分割

回复:
user: user-1
content: 先使用 strrpl 替换掉不需要的字符 再使用 strtok 分割

user: user-2
content: '\x1a'

user: user-3
content: 多行的自然按照‘\n’分割， ascii码随便用什么分
user-0 提问: 求大神讲解两个循环的差异  运行结果完全不同啊

回复:
user: user-1
content: 区别在于for循环先判断是否为'\0'然后再复制，while循环先复制然后再判断，这样for循环就无法复制最后的'\0'，造成字符串没有正确的结束。
user-0 提问: C语言printf奇葩问题

回复:
user: user-1
content: 引用 11 楼 lm_whales 的回复:这种函数，有两个方法较常用 1）传递两个指针a，b（表示两个字符串），实际是字符数组 把 结果放入中返回 2）直接把结果放入 a中，只传递一个字符串，要求不能使常量串，操作时注意别删错了，设计好算法，别出错了 注意结束符的处理 PS： C返回字符串的函数，一般都是返回形参指针 也可以返回动态分配的字符数组指针，这要求用毕释放之 也可以返回静态数组（内容为字符串，有时可以返回常量字符串）； 有时候，返回外部变量数组也可以，但是不是很好 1） 传递两个指针a，b（表示两个字符串），实际是字符数组 把 结果放入b中返回

user: user-1
content: 这种函数，有两个方法较常用 1）传递两个指针a，b（表示两个字符串），实际是字符数组 把 结果放入中返回 2）直接把结果放入 a中，只传递一个字符串，要求不能使常量串，操作时注意别删错了，设计好算法，别出错了 注意结束符的处理 PS： C返回字符串的函数，一般都是返回形参指针 也可以返回动态分配的字符数组指针，这要求用毕释放之 也可以返回静态数组（内容为字符串，有时可以返回常量字符串）； 有时候，返回外部变量数组也可以，但是不是很好

user: user-1
content: 野指针，造成的

user: user-2
content: 引用 8 楼 zhao4zhong1 的回复:理解和讨论之前请先学会如何观察！  说的好，这个问题完全可以自己搞明白的，楼主要加强分析问题的能力。

user: user-3
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  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: 引用 3 楼 liehu232的回复:b为栈上分配，函数返回后被回收，应该用char *b=(char *)malloc(20*sizeof(char))改为堆上分配 为什么主函数里把注释去掉而子函数不动就可以了，

user: user-4
content: 引用 6 楼 qq_20218109 的回复:[quote=引用 3 楼 liehu232的回复:]b为栈上分配，函数返回后被回收，应该用char *b=(char *)malloc(20*sizeof(char))改为堆上分配 为什么主函数里把注释去掉而子函数不动就可以了，[/quote]  我上面说的不确定包括：结果是你想要的 与 结果不是你想要的

user: user-4
content: 不要返回局部变量的地址，因为函数结束完变量生命周期就结束了，之后的行为是不确定的

user: user-5
content: 返回的是局部变量，那么其结果是未知的，存在不确定性；

user: user-6
content: 因为你返回了一个局部变量指针的地址（位于栈区），楼主应该new或者malloc出一个空间，然后返回 应该改为如下这样：  char *spcpy(char *a,char c) {     int i=0;     int j=0;     char b[20]={'\0'};     for(;i<strlen(a);++i)     {         if(a[i]!=c)         {             b[j]=a[i];             ++j;         }     } //    printf("%d",i);    // printf("修改后的字符串为：%s\n",b);     char *p=(char *)malloc(20); 	strcpy(p, b);     return p; }

user: user-7
content: b为栈上分配，函数返回后被回收，应该用char *b=(char *)malloc(20*sizeof(char))改为堆上分配

user: user-8
content: 局部变量退出作用域即失效，永远不要返回指向自动局部变量的指针。
user-0 提问: extern C语言中外部变量和的一些疑惑

回复:
user: user-0
content: 另外图2可能是错误的

user: user-0
content: 经过一段时间的学习，觉得自己似乎知道了问题的答案。 答案就在2#、3#； 再次感谢各位！！！

user: user-0
content: 楼上只看到了void main()，却没有看到我具体的问题，是否因为你心里只有void main呢？我的原问题也不是出在上图上，只不过我觉得我只需要把我的症结提取出来，明确自己的问题所在，才能让喜欢分享知识的人对我的问题一目了然，而不是花更多的无用的时间在理解我的其他代码上，谢谢

user: user-1
content: 看到void main我就知道一切白说。

user: user-0
content: 大神的眼界果然不同凡响，小白有点懂但似乎又不太懂，能否通过上图细讲一二？

user: user-2
content: 全部是弱符号，任取一个作为定义 多个强符号，重复定义错误

user: user-2
content: 另外，编译器还有强符号与弱符号的分别，来区分声明和定义 有初始化的，是强符号 无初始化的，是弱符号

user: user-2
content: 纯粹的声明，好处是只有一处定义，不会出现定义不一致之处  声明 和定义写在一起，好处是 看到声明就知道定义 坏处是 ，可能出现定义不一致，特别是不同文件，都这样写的时候  至于编译器，如果见到定义，那就会忽略声明 如果有两处不同定义，那就会报错 如果相同，可能回都接受吧， 最多也就是报错 其实任取一处 ，作为定义即可。
user-0 提问: 这个程序输出有问题

回复:
user: user-1
content: 楼主你那句scanf_s不能这样用，直接用%s读会读到输入的字符串末尾的，并不会读到那个逗号而停下来，其实你的&a[i].score根本没有赋上值。 逗号以及score值全部读到name数组里了，可以改成以下这样（%[^,]意思是匹配字符串直到遇见逗号)  scanf_s("%d,%[^,],%d", &a[i].num, a[i].name,10, &a[i].score);
user-0 提问: 对称数问题

回复:
user: user-0
content: 嗷嗷嗷，忘了打了，题目有限制，就是最多6位，所以才这么写 引用 3 楼 qq423399099 的回复:楼主你这里定义int a[6]; 一旦输入进来的数大于6位，下面判断a[--n]!=a[i]就会造成越界

user: user-1
content: 楼主你这里定义int a[6]; 一旦输入进来的数大于6位，下面判断a[--n]!=a[i]就会造成越界

user: user-0
content: 代码有的用例不通过，所以想知道问题在哪，我也知道其他类型的正确代码，所以不用贴自己写的代码了谢谢大家

user: user-0
content: bool isdc(int init){     int temp=init;     int a[6];     int n=0;     while(temp/10!=0){       a[n]=temp%10;       n++;       temp=temp/10;     }        a[n]=temp%10;       n++;      for(int i=0;i<n;i++){printf("%d",a[i]);}      printf(" %d\n",n/2);      for(int i=0;i<n/2;i++){       if(a[--n]!=a[i]) return 0;    }         return 1;   }
user-0 提问: 照着课本打的却编译不了，求助!

回复:
user: user-1
content: 错的离谱，哪有函数写在主函数里面的

user: user-0
content: 但是我想知道什么问题？

user: user-2
content: 这种教科书让人心寒，这是什么编程习惯？！
user-0 提问: 如何在链表中输入元素？

回复:
user: user-0
content: 谢谢你的帮助，我知道怎么做了

user: user-1
content: 仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }

user: user-0
content: ………你没懂我的意思…

user: user-2
content: 引用 2 楼 xd15010130025 的回复:那应该怎么循环输入呢…  for   while

user: user-2
content: int a; 	scanf("%d", &a);

user: user-0
content: 那应该怎么循环输入呢…
user-0 提问: 字符串数组是怎么分配存储空间的？

回复:
user: user-0
content: 引用 2楼小灸舞 的回复:常量字符串是放在常量区的，该区是只读，你不能通过指针企图修改该区域的字符串内容 如"abcdefg"，字符串中是7个字符，但默认都会在末尾加一个'\0'来表示结束，所以一共占的空间就是8个字节 楼主可以用sizeof验证每个字符串的存储空间多大

user: user-1
content: 常量字符串是放在常量区的，该区是只读，你不能通过指针企图修改该区域的字符串内容 如"abcdefg"，字符串中是7个字符，但默认都会在末尾加一个'\0'来表示结束，所以一共占的空间就是8个字节 楼主可以用sizeof验证

user: user-2
content: 默认后面再加一个0，他们的内存都放在只读区域
user-0 提问: 关于字符型读入的问题

回复:
user: user-1
content: 以下这种方式读入的话：  scanf("%c%c%c", &a ,&b, &c);  如果输入了a b n (那么a会读到a,b会读到空格，c会读到b) 要正确读入的话要输入abn(中间不要加空格)

user: user-2
content: 你按回车时的换行符\n会被接收为一个字符，导致结果不对

user: user-3
content: 因为%c不会跳过起始的空白字符，所以不带空格的实际读入的a,b,c是a，空格，b，最大值就是b

user: user-4
content: 你在scanf后面加一条输出a,b,c语句试一下
user-0 提问: 心好累啊

回复:
user: user-1
content: 楼主的两个scanf_s函数写的不一样，第二个少“&”

user: user-2
content: 写程序要保证基本的输入是正确的，scand()的参数是指针，取的是地址，所以while循环中scanf()函数的参数&day，错误应该解决，这是初学经常犯的错误，希望能帮到你
user-0 提问: 数组就是在内存中开辟一块连续的、大小相同的空间，用来存储数

回复:
user: user-1
content: 引用 7 楼 labuboco 的回复:[quote=引用 6楼sdghchj 的回复:][quote=引用 4 楼 labuboco 的回复:] [quote=引用 3楼sdghchj 的回复:]这个问题我竟无言以对。 int a[10]难道不是10个相同空间大小的int类型变量么？我想问的是字符串数组是怎么分配存储空间的例如"123445","12","12344667"[/quote] 字符串数组一般是用二维的字符数组来装，如char[5][10]表示是5个最多能存储10个字符的字符串，各字符串都是10个字节，只不过print出来的时候遇到终止符就不打印了而已，但内存依旧是那么多。 即便是标准库的string类型，也是内部有一个字符指针指向申请的其它地址上的字节，string本身的大小依然是固定的。总之，相同类型的变量所占字节数就是一样的。[/quote]可是有的书上写的[][]代表行和列？什么情况[/quote] 是行和列，但你要深层次理解c\c++里所谓的字符串，本质上就是字符数组，以终止符‘\0’来默认表示字符串结束。

user: user-0
content: 引用 9楼sdghchj 的回复:[quote=引用 7 楼 labuboco 的回复:] [quote=引用 6楼sdghchj 的回复:][quote=引用 4 楼 labuboco 的回复:] [quote=引用 3楼sdghchj 的回复:]这个问题我竟无言以对。 int a[10]难道不是10个相同空间大小的int类型变量么？我想问的是字符串数组是怎么分配存储空间的例如"123445","12","12344667"[/quote] 字符串数组一般是用二维的字符数组来装，如char[5][10]表示是5个最多能存储10个字符的字符串，各字符串都是10个字节，只不过print出来的时候遇到终止符就不打印了而已，但内存依旧是那么多。 即便是标准库的string类型，也是内部有一个字符指针指向申请的其它地址上的字节，string本身的大小依然是固定的。总之，相同类型的变量所占字节数就是一样的。[/quote]可是有的书上写的[][]代表行和列？什么情况[/quote] 是行和列，但你要深层次理解c\c++里所谓的字符串，本质上就是字符数组，以终止符‘\0’来默认表示字符串结束。[/quote]可是\0又不是换行符，为什么要换行啊，

user: user-0
content: 引用 6楼sdghchj 的回复:[quote=引用 4 楼 labuboco 的回复:] [quote=引用 3楼sdghchj 的回复:]这个问题我竟无言以对。 int a[10]难道不是10个相同空间大小的int类型变量么？我想问的是字符串数组是怎么分配存储空间的例如"123445","12","12344667"[/quote] 字符串数组一般是用二维的字符数组来装，如char[5][10]表示是5个最多能存储10个字符的字符串，各字符串都是10个字节，只不过print出来的时候遇到终止符就不打印了而已，但内存依旧是那么多。 即便是标准库的string类型，也是内部有一个字符指针指向申请的其它地址上的字节，string本身的大小依然是固定的。总之，相同类型的变量所占字节数就是一样的。[/quote]谢谢你！

user: user-0
content: 引用 6楼sdghchj 的回复:[quote=引用 4 楼 labuboco 的回复:] [quote=引用 3楼sdghchj 的回复:]这个问题我竟无言以对。 int a[10]难道不是10个相同空间大小的int类型变量么？我想问的是字符串数组是怎么分配存储空间的例如"123445","12","12344667"[/quote] 字符串数组一般是用二维的字符数组来装，如char[5][10]表示是5个最多能存储10个字符的字符串，各字符串都是10个字节，只不过print出来的时候遇到终止符就不打印了而已，但内存依旧是那么多。 即便是标准库的string类型，也是内部有一个字符指针指向申请的其它地址上的字节，string本身的大小依然是固定的。总之，相同类型的变量所占字节数就是一样的。[/quote]可是有的书上写的[][]代表行和列？什么情况

user: user-1
content: 引用 4 楼 labuboco 的回复:[quote=引用 3楼sdghchj 的回复:]这个问题我竟无言以对。 int a[10]难道不是10个相同空间大小的int类型变量么？我想问的是字符串数组是怎么分配存储空间的例如"123445","12","12344667"[/quote] 字符串数组一般是用二维的字符数组来装，如char[5][10]表示是5个最多能存储10个字符的字符串，各字符串都是10个字节，只不过print出来的时候遇到终止符就不打印了而已，但内存依旧是那么多。 即便是标准库的string类型，也是内部有一个字符指针指向申请的其它地址上的字节，string本身的大小依然是固定的。总之，相同类型的变量所占字节数就是一样的。

user: user-2
content: 字符串看编码,不同编码分配的空间不一样的,不过都会多加一个\0来表示结束字符串

user: user-0
content: 引用 3楼sdghchj 的回复:这个问题我竟无言以对。 int a[10]难道不是10个相同空间大小的int类型变量么？我想问的是字符串数组是怎么分配存储空间的例如"123445","12","12344667"

user: user-1
content: 这个问题我竟无言以对。 int a[10]难道不是10个相同空间大小的int类型变量么？

user: user-3
content: 大小相同指存储单元内存储相同类型元素

user: user-4
content: 大小相同的空间 －》大小即存放的数据的数据类型的大小，总空间大小即存放的数据个数＊数据类型大小
user-0 提问: 用double定义函数，返回类型为float

回复:
user: user-1
content: 引用 6 楼 paschen 的回复:再强调一下，楼主这种不会丢失精度！楼主的是float转double！  中间的运算精度损失了。

user: user-2
content: 引用 11 楼 butters10 的回复:%f 强转成float了，其实你函数还是返回的double的 %f是double

user: user-3
content: 这种函数，返回 double 基本上是误导大家。 计算本身，精度低，返回值精度高 纯粹胡闹， 改为返回 double 并不能提高 计算的精度。 如果函数都这么写，干脆只保留一种浮点数好了。

user: user-4
content: %f 强转成float了，其实你函数还是返回的double的

user: user-5
content: 理解和讨论之前请先学会如何观察！  计算机组成原理→DOS命令→汇编语言→C语言（不包括C++）、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言（包括C++）、架构……  对学习编程者的忠告： 多用小脑和手，少用大脑、眼睛和嘴，会更快地学会编程！ 眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步源代码千行不如单步Debug版对应汇编一行！ 单步Debug版对应汇编千行不如单步Release版对应汇编一行！ 不会单步Release版对应汇编？在你想单步Release版C/C++代码片断的前面临时加一句DebugBreak();重建所有，然后在IDE中运行。（一般人我不告诉他！）  VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 对VC来说，所谓‘调试时’就是编译连接通过以后，按F10或F11键单步执行一步以后的时候，或者在某行按F9设了断点后按F5执行停在该断点处的时候。

user: user-6
content: 引用 7 楼 qq_34438761 的回复:如果fun函数是float行，变量定义成double型呢？会出错吗？如果在全国二级考试里会不会被扣分？ double转float编译器会发出警告，但是可以通过编译，考试的话可能会扣分。 这种情况一般要求都是“所需类型”或者“能转换成需要的类型”，楼主提出情况是float转double，可以默认转换，而且不会丢失精度，所以一般连警告都不会有，实际情况是无所谓的，但是考试就不一定了。

user: user-7
content: 再强调一下，楼主这种不会丢失精度！楼主的是float转double！

user: user-8
content: 如果fun函数是float行，变量定义成double型呢？会出错吗？如果在全国二级考试里会不会被扣分？

user: user-9
content: 会丢失精度，其实返回值内存块还是double ，只不过显示float 所占用到的内存块

user: user-10
content: 这样是语法上是可以的，只不过有可能数据丢失，因为double的精度比float高

user: user-11
content: 理论上可以，但会丢失精度，最好不要这么干，可以强制转换

user: user-12
content: 编译器会把双精度转化为单精度返回，所以会损失掉一位小数，所以最好也用double返回

user: user-7
content: 返回时会时行隐式转换，所以编译不会报错  另外float转换为double并不会丢失精度
user-0 提问: 数据结构单链表

回复:
user: user-0
content: 恩 我搞明白了 谢谢

user: user-1
content: 第一你要明白头节点的作用，它与首节点的区别。你这么提取数据是对的，只是你如果在头节点没放入自己数据，取出来的数据你也看不懂
user-0 提问: 关于C语言,调试到文件关闭时时出现了debug assertion failed

回复:
user: user-1
content: 这是出错的地方，提示和楼主时一样的

user: user-1
content: 可是我的在将内存数据往外写的时候报错，但是我打开文件的方式应该时对的呀，我是以“rb”打开的

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

user: user-3
content: 一般来说 异常情况的处理， 应该比较直接一些,不和正常逻辑掺杂在一起  if(e){ ............. return ; ///或者 exit(0);  }  。。。。。。。。。。 这样的话 fclose(fp); 也不会出问题

user: user-3
content: if else 是很好 但是有点分不出主次的感觉。 干扰正常逻辑的表达。

user: user-0
content: 引用 7 楼 qq423399099 的回复:[quote=引用 6 楼 Ackerman_lu 的回复:] [quote=引用 4 楼 qq423399099 的回复:] 你肯定是fopen失败了，所以fid 是NULL VC++的fclose如果参数是NULL将会造成程序报错退出，因为M$的fclose不检查指针的有效性，而NULL可以被默认转换成任何类型的指针，而fopen失败的时候将会返回a NULL pointer，所以再调用fclose就会咔嚓一下，系统BK了  对的，懂了！我确实是fid为NULL时会出错，不是NULL时可以正常运行. 可我的这段的思路是这样的。分两种情况 （1）如果存在这个文件的话，对这个文件执行一种操作。 （2）如果不存在的话，执行另外一种。 可我这里如果我把fclose那部删掉的话。当我fid不为null时，文件就没有关闭，导致我之后的步骤出现问题。 我应该怎么解决呢？求指导！ [/quote] 要不这样，加个else分支？  if ((fid = fopen(fname, "rt+")) == NULL) { printf("the new dxf file has been built\n"); err = 1; } else { //对该文件操作XXXXXXXXXXXXXXXXXX ........... fclose(fid); } [/quote]   是的，果然小白，蠢成狗了。。 之前加了else的，但是后面一个模块有几个调用量没改。。结果不成功、还以为是bug。。现在可以了，谢谢

user: user-4
content: 引用 6 楼 Ackerman_lu 的回复:[quote=引用 4 楼 qq423399099 的回复:] 你肯定是fopen失败了，所以fid 是NULL VC++的fclose如果参数是NULL将会造成程序报错退出，因为M$的fclose不检查指针的有效性，而NULL可以被默认转换成任何类型的指针，而fopen失败的时候将会返回a NULL pointer，所以再调用fclose就会咔嚓一下，系统BK了  对的，懂了！我确实是fid为NULL时会出错，不是NULL时可以正常运行. 可我的这段的思路是这样的。分两种情况 （1）如果存在这个文件的话，对这个文件执行一种操作。 （2）如果不存在的话，执行另外一种。 可我这里如果我把fclose那部删掉的话。当我fid不为null时，文件就没有关闭，导致我之后的步骤出现问题。 我应该怎么解决呢？求指导！ [/quote] 要不这样，加个else分支？  if ((fid = fopen(fname, "rt+")) == NULL) { printf("the new dxf file has been built\n"); err = 1; } else { //对该文件操作XXXXXXXXXXXXXXXXXX ........... fclose(fid); }

user: user-0
content: 引用 4 楼 qq423399099 的回复:你肯定是fopen失败了，所以fid 是NULL VC++的fclose如果参数是NULL将会造成程序报错退出，因为M$的fclose不检查指针的有效性，而NULL可以被默认转换成任何类型的指针，而fopen失败的时候将会返回a NULL pointer，所以再调用fclose就会咔嚓一下，系统BK了  对的，懂了！我确实是fid为NULL时会出错，不是NULL时可以正常运行. 可我的这段的思路是这样的。分两种情况 （1）如果存在这个文件的话，对这个文件执行一种操作。 （2）如果不存在的话，执行另外一种。 可我这里如果我把fclose那部删掉的话。当我fid不为null时，文件就没有关闭，导致我之后的步骤出现问题。 我应该怎么解决呢？求指导！

user: user-0
content: 那问题是我dxf_header的函数块？

user: user-0
content: 引用 1 楼 Ackerman_lu 的回复:自顶~~求指导~~那问题是我的dxf_header的函数块的引用部分吗？求指导  #include <stdio.h> #include<stdlib.h>  void DXF_head(char filename[20]) { 	FILE *fid; 	//if ((fid = fopen(filename, "wt+")) == NULL) 	//{ 		//printf("can't open\r\n"); 		//exit(1); 	//}  	fid = fopen(filename, "wt+");  那个我是这么写的，红字那行开始没用，是用上面注释掉的那部分写的。。不过两种都不行

user: user-4
content: 你肯定是fopen失败了，所以fid 是NULL VC++的fclose如果参数是NULL将会造成程序报错退出，因为M$的fclose不检查指针的有效性，而NULL可以被默认转换成任何类型的指针，而fopen失败的时候将会返回a NULL pointer，所以再调用fclose就会咔嚓一下，系统BK了

user: user-5
content: 问题不在这儿~

user: user-0
content: 自顶~~求指导~~
user-0 提问: 帮忙看看什么问题，我想输出三个数的中间值

回复:
user: user-1

user: user-1
content: 1.函数mid返回 值K没有没有初始化,所有他是一个随机值; 2.控制台输入的1 2 3  在函数mid中涉及到的3个if条件都不满足,所有K值没有改变    返回最开始的随机值;