Question: 如何在c中实现倒计时

#include "stdio.h" #include "windows.h" int main( void ) { 	int t=0,i=0; 	printf("输入倒计时秒数："); 	scanf("%d", &t ); 	for( i=t ; i>0 ; i-- ) 	{ 		printf("%d ", i ); 		Sleep(1000); 	} 	return 0; }

引用 4 楼 赵4老师的回复:仅供参考：#include <stdio.h> #include <stdlib.h> #include <string.h> #ifdef WIN32     #include <windows.h>     #include <io.h>     #include <process.h>     #define  MYVOID             void #else     #include <unistd.h>     #include <sys/time.h>     #include <pthread.h>     #define  CRITICAL_SECTION   pthread_mutex_t     #define  _vsnprintf         vsnprintf     #define  MYVOID             void * #endif //Log{ #define MAXLOGSIZE 20000000 #define ARRSIZE(x) (sizeof(x)/sizeof(x[0])) #include <time.h> #include <sys/timeb.h> #include <stdarg.h> char logfilename1[]="MyLog1.log"; char logfilename2[]="MyLog2.log"; char logstr[16000]; 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); } void sleep_ms(int ms) {     Sleep(ms); } #else void Lock(CRITICAL_SECTION *l) {     pthread_mutex_lock(l); } void Unlock(CRITICAL_SECTION *l) {     pthread_mutex_unlock(l); } void sleep_ms(int ms) {     usleep(ms*1000); } #endif void LogV(const char *pszFmt,va_list argp) {     struct tm *now;     struct timeb tb;       if (NULL==pszFmt||0==pszFmt[0]) return;     if (-1==_vsnprintf(logstr,ARRSIZE(logstr),pszFmt,argp)) logstr[ARRSIZE(logstr)-1]=0;     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);             }             flog=fopen(logfilename1,"a");             if (NULL==flog) return;         }         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 No_Loop=0; MYVOID testThread(void *pcn) {     int n,i;      n=(int)pcn;     i=0;     while (1) {         sleep_ms(1000);         Log("in testThread %d:i==%ds\n",n,++i);         if (i>=5) No_Loop=1;     } } int main(int argc,char * argv[]) {     int i; #ifdef WIN32     InitializeCriticalSection(&cs_log); #else     pthread_mutex_init(&cs_log,NULL);     pthread_t threads[1];     int threadsN;     int rc; #endif     Log("=========BEGIN==================\n"); #ifdef WIN32     _beginthread((void(__cdecl *)(void *))testThread,0,(void *)1); #else     threadsN=0;     rc=pthread_create(&(threads[threadsN++]),NULL,testThread,(void *)1);if (rc) Log("%d=pthread_create %d error!\n",rc,threadsN-1); #endif     i=0;     while (1) {         sleep_ms(100);         Log("in main:i==%d\n",++i);         if (No_Loop==1) break;//     }     Log("=========END====================\n"); #ifdef WIN32     DeleteCriticalSection(&cs_log); #else     pthread_mutex_destroy(&cs_log); #endif     return 0; } //2012-06-14 16:27:21.500 =========BEGIN================== //2012-06-14 16:27:21.609 in main:i==1 //2012-06-14 16:27:21.718 in main:i==2 //2012-06-14 16:27:21.828 in main:i==3 //2012-06-14 16:27:21.937 in main:i==4 //2012-06-14 16:27:22.046 in main:i==5 //2012-06-14 16:27:22.156 in main:i==6 //2012-06-14 16:27:22.265 in main:i==7 //2012-06-14 16:27:22.375 in main:i==8 //2012-06-14 16:27:22.484 in main:i==9 //2012-06-14 16:27:22.500 in testThread 1:i==1s //2012-06-14 16:27:22.593 in main:i==10 //2012-06-14 16:27:22.703 in main:i==11 //2012-06-14 16:27:22.812 in main:i==12 //2012-06-14 16:27:22.921 in main:i==13 //2012-06-14 16:27:23.031 in main:i==14 //2012-06-14 16:27:23.140 in main:i==15 //2012-06-14 16:27:23.250 in main:i==16 //2012-06-14 16:27:23.359 in main:i==17 //2012-06-14 16:27:23.468 in main:i==18 //2012-06-14 16:27:23.500 in testThread 1:i==2s //2012-06-14 16:27:23.578 in main:i==19 //2012-06-14 16:27:23.687 in main:i==20 //2012-06-14 16:27:23.796 in main:i==21 //2012-06-14 16:27:23.906 in main:i==22 //2012-06-14 16:27:24.015 in main:i==23 //2012-06-14 16:27:24.125 in main:i==24 //2012-06-14 16:27:24.234 in main:i==25 //2012-06-14 16:27:24.343 in main:i==26 //2012-06-14 16:27:24.453 in main:i==27 //2012-06-14 16:27:24.500 in testThread 1:i==3s //2012-06-14 16:27:24.562 in main:i==28 //2012-06-14 16:27:24.671 in main:i==29 //2012-06-14 16:27:24.781 in main:i==30 //2012-06-14 16:27:24.890 in main:i==31 //2012-06-14 16:27:25.000 in main:i==32 //2012-06-14 16:27:25.109 in main:i==33 //2012-06-14 16:27:25.218 in main:i==34 //2012-06-14 16:27:25.328 in main:i==35 //2012-06-14 16:27:25.437 in main:i==36 //2012-06-14 16:27:25.500 in testThread 1:i==4s //2012-06-14 16:27:25.546 in main:i==37 //2012-06-14 16:27:25.656 in main:i==38 //2012-06-14 16:27:25.765 in main:i==39 //2012-06-14 16:27:25.875 in main:i==40 //2012-06-14 16:27:25.984 in main:i==41 //2012-06-14 16:27:26.093 in main:i==42 //2012-06-14 16:27:26.203 in main:i==43 //2012-06-14 16:27:26.312 in main:i==44 //2012-06-14 16:27:26.421 in main:i==45 //2012-06-14 16:27:26.500 in testThread 1:i==5s //2012-06-14 16:27:26.531 in main:i==46 //2012-06-14 16:27:26.531 =========END====================  太过于复杂了，没有看懂(>﹏<)

太过于复杂，我没有看懂(;｀O´)o

引用 2 楼 qq_44744787 的回复：[quote=引用 1 楼 单眼皮的小健的回复:]1、单纯的C语言可以用<time.h>库的time()获取当前时间进行定时 2、Windows下可以使用<windows.h>的sleep()进行睡眠定时 3、Linux下就更多了，可以使用alarm()、sleep()、usleep()等等 可以吧内容具体一下吗？[/quote]....再具体就是我帮你写代码了，我大概说出time的过程，假如你要定时10s，把参数10传递给一个定时函数set time，里面的工作是，用time（）记录当前时间，然后死循环等待，死循环里面一直再用time（）得到的时间减去第一次记录的时候，如果大于等于函数参数（需要定时的时间）就跳出死循环，函数返回，定时完毕，另外如果你想要类似闹钟的功能，需要多线程操作

引用 1 楼 单眼皮的小健的回复:1、单纯的C语言可以用<time.h>库的time()获取当前时间进行定时 2、Windows下可以使用<windows.h>的sleep()进行睡眠定时 3、Linux下就更多了，可以使用alarm()、sleep()、usleep()等等 可以吧内容具体一下吗？


Question: 各位大佬求救呀……

引用 2 楼 qq_42307333的回复:贴完图片自己看了吗？？？ 很抱歉，没有看

贴完图片自己看了吗？？？

图片几乎看不清楚 但是写文件也就一个套路 1. 打开或者创建文件 2. 输入数据 3.关闭文件 要处理高效，使用结构体 看个例子  #include<stdio.h> #include<string.h> #include<stdlib.h> #define N 20 #define M 3 typedef struct { char name[20]; int score[M]; double avg; }stu; void swap(stu*m,stu*n) { stu t=*m; *m=*n; *n=t; } void input(stu*s,int n) { int i,j; double sum=0; for(i=0;i<n;i++) { printf("请输入姓名："); scanf("%s",s[i].name); printf("请输入分数（英语数C）："); for(j=0;j<M;j++) scanf("%d",&s[i].score[j]); printf("\n"); } } void sort(stu*s,int n) { int i,j; double sum=0; for(i=0;i<n;i++) { for(j=0;j<M;j++) sum+=s[i].score[j]; s[i].avg=sum/M; sum=0; } for(i=1;i<n;i++) for(j=0;j<n-i;j++) { if(s[j].avg<s[j+1].avg) swap(&s[j],&s[j+1]); else if((s[j].avg==s[j+1].avg)&&(strcmp(s[j].name,s[j+1].name)<0)) swap(&s[j],&s[j+1]); } } void save(stu*s,int n) { FILE*fp; int i, j; fp=fopen("d:\\data.dat","w"); for(i=0;i<n;i++) { //fwrite(&s[i],sizeof(stu),1,fp); fprintf(fp,"%s\t", s[i].name); for(j=0;j < M;j++) fprintf(fp,"%d\t", s[i].score[j]); fprintf(fp,"%f\n", s[i].avg); } fclose(fp); } void output(stu*s,int n) { int i=0,j; FILE*fp; if((fp=fopen("d:\\data.dat","r"))==NULL) { printf("fail\n"); exit(0); } while(!feof(fp)) { //fread(&s[i],sizeof(stu),1,fp); fscanf(fp, "%s",s[i].name); for(j=0;j<M; j++) fscanf(fp,"%d", &s[i].score[j]); fscanf(fp, "%f",&s[i].avg); i++; } fclose(fp); for(i=0;i<n;i++) { printf("%s\t",s[i].name); for(j=0;j<M;j++) printf("%d   ",s[i].score[j]); printf("%.1lf",s[i].avg); printf("\n"); } } void main() { int n; stu s[N]; printf("input n:"); scanf("%d",&n); input(s,n); sort(s,n); save(s,n); output(s,n); }


Question: 求助：输入10个整数，将其中最小的数与第一个数对换，把最大的数与最后一个数对换。写三个函数； ①输入10个数；②进行处理；③输出10个数。

边界场景考虑不足，maxval和minval没有初始化，导致a[0]是最大值a或最小值场景下出现异常

函数没有返回值，调用函数结束了就没有用了


Question: 迷茫了 求大佬指点下

去leetcode上刷刷c语言easy级别的题目，打打小怪物。 然后看看网上看看数据结构的课程，再随后是看看简单的算法。 语言的细节以后会慢慢忘记，这个是很正常的，不必深究，用的时候再捡起来就可以。 如果是往软件工程方向走，还可以看看邹欣老师的《构建之法》，里面理论实践结合。

先做下课后练习题，然后试着做下C语言考级的机实题目（比如实现输出几排***，结构体打印之类的 网上应该可以找到）

你想写啥就写啥。  语言方面，C语言继续学《C陷阱与缺陷》、《C与指针》、《C专家编程》、《C标准库》、《C语言接口与实现》这五本书，大概三年时间，你就能完全掌握C语言了。  库/平台方面，学一下写GUI，建议学一点简单的C++，然后学用Qt库。  等你C语言那五本书都读懂了，然后Qt也写过一些很简单的程序，你应该就有一种感觉，【自己知道】自己懂了。这个时候你可以去学《Windows程序设计》，学最底层的Windows API。

有zl卖吗🤫

有zl卖吗🤫

引用 23 楼 If Me 的回复:我也觉得看c++ primer plus更好，不只是详细而且你会对c的机制和结构有一个更加全面和详细的了解，不用急着去写程序，把基础打好了，最重要是培养兴趣呀，看完之后，可以去看一些简单的案例或者深入学习一下c指针我刚开始学c++。用的也是这本书

可以用链表和文件写个管理系统啥的 写大点尽量各个模块都涉及一下

当年我学完的时候是做了命令行的学生管理系统，然后做了个吃金豆游戏

随便看随便学

看看C prime再看看数据结构。可以写个订票系统。

您的程序需要多反复修改，调试后即可通过，耐心点，加油

引用 23 楼 If Me 的回复：我也觉得看c++ primer plus更好，不只是详细而且你会对c的机制和结构有一个更加全面和详细的了解，不用急着去写程序，把基础打好了，最重要是培养兴趣呀，看完之后，可以去看一些简单的案例或者深入学习一下c指针我想先把c学好了再学c++的

建议去找一些题先练练语法，等都熟悉了再开始打项目，当然要全部了解是不太可能的，只是不要在基础部分出问题，这样看其他大神的代码也不会迷糊

贪吃蛇吧，给你两个函数 //---------到指定坐标去------------- void GotoXY(short y, short x) {	 	HANDLE a=GetStdHandle(STD_OUTPUT_HANDLE);		//获取本程序标准输出的句柄 	COORD t;										//COORD为表示坐标的结构体 	t.X=x*2;										//方便汉字定位，一个汉字占两个字符宽 	t.Y=y; 	SetConsoleCursorPosition(a , t);					//设置控制台光标位置 } //---------隐藏光标------------- void hide( void ) { 	HANDLE a =GetStdHandle(STD_OUTPUT_HANDLE); 	CONSOLE_CURSOR_INFO cursor_info={1,0};	 		//设置光标的结构体，前者设置厚度，后者设置可见 	SetConsoleCursorInfo(a , &cursor_info);				//设置控制台光标信息（样式） }  头文件的话是windows.h，可能还需要stdlib.h和conio.h

经典的机房收费系统可以了解了解

给你推荐本书，C语言项目开发实战入门

。。。不会

有必要刷oj吗 ....

引用 19 楼 stone dream 的回复：引用 2 楼 福尔摩斯天才渊的回复:[quote=引用 1 楼 w__dong_123 的回复：]尝试写一个学生信息管理系统好的 过会儿我试试 学生信息管理系统，要写具体，比如说包括年龄，学校 ，姓名，学号，住址，电话，宿舍号，成绩等等，然后自己从成绩那里扩展知识，增加自己的程序设计能力[/quote]谢谢了

引用 2 楼 福尔摩斯天才渊的回复:引用 1 楼 w__dong_123 的回复：尝试写一个学生信息管理系统好的 过会儿我试试 学生信息管理系统，要写具体，比如说包括年龄，学校 ，姓名，学号，住址，电话，宿舍号，成绩等等，然后自己从成绩那里扩展知识，增加自己的程序设计能力


Question: 跪求大家能不能用c语言写出来

仅供参考：#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); }

栈数据结构来做很简单的


Question: 【链表】在devc++上输入数据之后运行怎么一直无法输出；

struct ListNode *createlist() {   int num;   struct ListNode *head=NULL,*tail=NULL,*ptr=NULL;   scanf("%d",&num);   while(num!=-1)   {     ptr=(struct ListNode *)malloc(sizeof(struct ListNode));     ptr->data=num;     ptr->next=NULL;     if(head==NULL) head=ptr;     else tail->next=ptr;     tail=ptr;     scanf("%d",&num);   }   return head; } 你这里好像根本就没有连起来，虽然你返回了head，但是你head->next一直为null

数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633

引用 3 楼 放心去飞勇敢去追 的回复:在这个基础之上如何改正确？ else tail->next=ptr;这句应该是有问题的 else head->next=ptr;改成这样，不知道还有没有其他错误

在这个基础之上如何改正确？


Question: 小白求教  为什么用pow函数输出的结果总是0

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

#include<stdio.h> #include<math.h>  void main() {     double x,y,z;  scanf("%lf,%lf",&x,&y); z=pow(x,y);  printf("%lf,%lf,%lf\n", x, y, z); }  好好练练打字和眼力吧，这程序一看就是抄的，还抄不对。 是lf不是1f，scanf多了个%


Question: 怎么进行字符串的拷贝，求大神>o<

不让用strcpy，不让用指针，那就一个字符一个字符赋值呗！  #include <stdio.h>  int main() {     //接收的字符数组的长度不小于原数组     char a[10] = "abc";     char b[10] = "abcdefg";     //逐个字符的拷贝     int i;     for (i = 0; '\0' != a[i]; i++)     {         b[i] = a[i];     }     //拷贝完之后，加上字符串的尾巴     b[i] = '\0';     printf("%s\n", b);     return 0; }

字符串就是一个有0结尾的char数组，数组怎么拷贝你就可以怎么拷贝，只不过不要忘记最后的0，没有0的话字符串就不知道在哪里结尾了。

void StrCopy(const char* src, char* dest) {     while ((*dest++ = *src++));  }

void  Mystrcpy(char *str1,char*str2)  {         int i;         for(i=0;*(str2+i)!='\0';i++)         {               *(str1+i)=*(str2+i);         }              *(str1+i)='\0';  } ---------------------  作者：tt758695  来源：CSDN  原文：https://blog.csdn.net/tt758695/article/details/78691753  版权声明：本文为博主原创文章，转载请附上博文链接！

当字符串当数组，逐字拷贝

无非是一对一按字符拷贝，可以不用指针的，当作数组操作咯。

引用 6 楼 qq_42898932 的回复: 你是想进行字符串拷贝还是字符串拼接。想进行字符串拷贝，拷贝之前把原串清一下，就不会出现这种情况；你想要进行字符串拼接，需要先判断原串的长度，在原串长度的基础上进行增加。

引用 6 楼 qq_42898932 的回复:我输入的一个字符串abcdefg.另一个是123，最后出来结果是456efg     表示很懵啊看得我也懵了，把代码贴出来瞅瞅？

引用 1 楼 老马何以识途的回复:无非是一对一按字符拷贝，可以不用指针的，当作数组操作咯。 求代码，想不出来了


Question: 小萌新求教啊这个用C语言怎么写啊顺序表和栈没学太懂啊

cseqstack.h ------------------------------------- #ifndef C_SEQ_STACK_H #define C_SEQ_STACK_H  /* 结构体：基于顺序表的栈 */ typedef struct c_sequence_stack {     // 数据容器     void** arr;     // 数据大小     int dsize;     // 数据容量     int cap;     // 当前栈顶     int top; }cseqstack;  /* 顺序表栈初始化 */ void cseqstack_init(cseqstack*, int, int); /* 顺序表栈是否为空 */ int cseqstack_empty(cseqstack*); /* 顺序表栈是否已满 */ int cseqstack_full(cseqstack*); /* 顺序表栈栈顶访问 */ int cseqstack_top(cseqstack*, void*); /* 顺序表栈压入数据 */ int cseqstack_push(cseqstack*, void*); /* 顺序表栈弹出数据 */ int cseqstack_pop(cseqstack*, void*); /* 顺序表栈清空 */ void cseqstack_clear(cseqstack*); /* 顺序表栈数据量 */ int cseqstack_length(cseqstack*); /* 顺序表栈销毁 */ void cseqstack_deinit(cseqstack*);  #endif /* C_SEQ_STACK_H */  cseqstack.c ------------------------------------------- #include "cseqstack.h" #include <stdio.h> #include <string.h> #include <stdlib.h>  /* 顺序表栈初始化 */ void cseqstack_init(cseqstack* css, int dsize, int cap) { 	css->dsize = dsize;     css->cap = cap;     css->top = 0;     css->arr = (void**)malloc(sizeof(void*) * cap);     memset(css->arr, 0 ,sizeof(void*) * cap); }  /* 顺序表栈是否为空 */ int cseqstack_empty(cseqstack* css) {     return !css->top; }  /* 顺序表栈是否已满 */ int cseqstack_full(cseqstack* css) {     return (css->top == css->cap); }  /* 顺序表栈栈顶访问 */ int cseqstack_top(cseqstack* css, void* data) {     if (!css->top)         return 0;     memcpy(data, css->arr[css->top - 1], css->dsize);     return 1; }  /* 顺序表栈压入数据 */ int cseqstack_push(cseqstack* css, void* data) {     if (css->top == css->cap)         return 0;     css->arr[css->top] = malloc(css->dsize);     memcpy(css->arr[css->top++], data, css->dsize);     return 1; }   /* 顺序表栈弹出数据 */ int cseqstack_pop(cseqstack* css, void* data) {     if (!css->top)         return 0; 	if (data)     	memcpy(data, css->arr[--css->top], css->dsize);     free(css->arr[css->top]);     return 1; }  /* 顺序表栈清空 */ void cseqstack_clear(cseqstack* css) { 	while (css->top)     	free(css->arr[--css->top]); }  /* 顺序表栈数据量 */ int cseqstack_length(cseqstack* css) {     return css->top; }  /* 顺序表栈销毁 */ void cseqstack_deinit(cseqstack* css) { 	while (css->top)     	free(css->arr[--css->top]);     free(css->arr);     css->dsize = 0;     css->cap = 0; }  main.c 测试程序 ---------------------------------------- #include <stdio.h> #include "cseqstack.h"  #define STACK_CAP 5  int main(void) {     int i = 0;     /* 创建顺序表栈对象 */     cseqstack css; 	/* 初始化顺序表栈对象，设置数据大小，数据容量 */     cseqstack_init(&css, sizeof(int), STACK_CAP);     if (cseqstack_empty(&css))     { 		printf("current stack is empty!\n");     }     printf("push data into stack...\n");     for (i = 0; i < STACK_CAP; ++i)     { 		cseqstack_push(&css, &i);         int data = 0;         cseqstack_top(&css, &data);         printf("current top: %d\n", data);     } 	if (cseqstack_full(&css))     { 		printf("current stack is full!\n");     }     printf("pop data from stack...\n");     for (i = 0; i < STACK_CAP; ++i)     {         int data = 0;         cseqstack_pop(&css, &data);         printf("current data: %d\n", data);     } 	if (cseqstack_empty(&css))     { 		printf("current stack is empty!\n");     } 	printf("push data into stack...\n");     for (i = 0; i < STACK_CAP; ++i)     { 		cseqstack_push(&css, &i);         int data = 0;         cseqstack_top(&css, &data);         printf("current top: %d\n", data);     } 	int length = cseqstack_length(&css);     printf("stack have %d data.\n", length);     printf("stack clear...\n");     cseqstack_clear(&css);     length = cseqstack_length(&css);     printf("stack have %d data.\n", length);     if (cseqstack_empty(&css))     { 		printf("current stack is empty!\n");     }     /* 销毁顺序表栈 */     cseqstack_deinit(&css);     return 0; }


Question: 求实数绝对值，哪里出问题了啊

希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10581430.html 希望对你有帮助：https://blog.csdn.net/it_xiangqiang/category_10768339.html

double对应的应该是“%lf”兄弟，改过来就对了

引用 7 楼 儿童节的回复:上面的大神说得对，变量num的数据类型是float还是double，在用scanf输入的时候，格式符要匹配，否则数据会被截断而出现非正常结果。 另外，运行异常的主要原因是while循环条件的设置不对。具体说明如下： scanf()是C标准库stdio.h里面定义的用于获取用户输入的函数。 scanf的返回值是已经「成功」赋值的变量个数，也就是说，比如在「scanf("%d %d",&a,&b);」这个语句里，当用户输入「1（空格）2」时返回值是2，如果用户输入的是「1（空格） b」，那么返回值为1，如果输入的是「a（空格）b」，那么返回的是0。  所以，你上面的循环条件完全没有必要做取反（~）嘛，也就是说当输入的值「没有成功」赋值的时候，scanf的返回值是0，再按位取反，变成了表达式的值成了-1，而只要while()括号里不是0（假），while()循环就会继续，那你这还怎么结束循环呢？只有用Ctrl + C了。  所以，直接用while(scanf())就可以了，输入正常的时候，它就继续循环，输入不正常的时候，就会结束循环。   #include<stdio.h> #include <math.h> int main() {     float num;     while(scanf("%f",&num))     {         printf("%.2f\n",fabs(num));     }     return 0; }  嗯，谢谢，我知道哪里问题了

引用 1 楼 qq_44738203的回复:请不要在程序里添加表情包 输出有问题

引用 3 楼 @风轻云淡_的回复:#include<stdio.h> #include <math.h> int main() { 	float num;//float与%f对应  double与%lf对应，不要弄混了 	while(~scanf("%f",&num)) 	{ 		printf("%.2f\n",fabs(num)); 	} 	return 0; }  或者 #include<stdio.h> #include <math.h> int main() { 	double num;//float与%f对应  double与%lf对应，不要弄混了 	while(~scanf("%lf",&num)) 	{ 		printf("%.2lf\n",fabs(num)); 	} 	return 0; }  好的，谢谢

引用 1 楼 qq_44738203的回复:请不要在程序里添加表情包

把具体问题贴出来

请不要在程序里添加表情包


Question: 求各位大佬帮看一下

scanf("%c%d",&ch); 明显少了&i

或者直接在return 0前面加while(1);切记一点要打分号

加上一个头文件#include<stdlib.h> 再在return 0前面加一句system("pause");

帮顶帮顶帮顶帮顶

scanf (“%c%d”,&ch,&i);

引用 57 楼 赖卓成 的回复: gc和VC是不一样的.

引用 42 楼 qq_44738203 的回复:[quote=引用 34 楼 足球中国的回复:] 首选编译会出错 第二个scanf("%c%d",&ch); 你要为两个变量付，实际你只提了一个接收地址。 我用的vc6.0，可以编译，我的目的就是让另一个没有地址，但是我输入两个字母可以，一个字母一个数字就不行[/quote] 可以编译不代表可以运行。

你试一下 system（“pause”）

还没学会啊，我要多学习了

scanf("%c%d",&ch,&i);

你这个程序应该是要输入ch的地址，然后输出的是这个地址里的值，没结果应该是你输入的地址是空的，还有你输入量只有一个，你可以考虑删掉一个。如果你只是想看到输出，只需要将取地址ch和ch互换，即可。

scanf (“%c%d”,&ch,&i); 你之前的是少了一个接收数：&i

scanf (“%c%d”,&ch,&i);

我一般使用system("pause")

用system("pause")就好用了

这个程序的作用是让你输入 一个 字符和一个整数，然后他输出字符和数字。  1.运行空白是因为你本来就没有让他输出什么东西，你可以在scanf前面一句加个printf("请输入一个字符和一个数字\n");作为提示，2.一下就关闭是因为软件特性 你可以按ctrl+F5运行程序。 至于你说的什么-xxxxxxxx没有明白。:p

&ch后面少了&i

不知道怎么可以有积分


Question: 求大神告知以下程序输入123456789，其输出的结果是什么

引用 3 楼 自信男孩的回复:可以自己试一下就知道结果是什么了。 我是c语言初学者，看到这一串有点懵

可以自己试一下就知道结果是什么了。

自己用vc6.0或者vs 或者其他支持c的开发环境运行就知道了


Question: 求大佬看下，确实莫法了，找不出了

有什么问题也不说，直接贴一大段代码


Question: acm2005为什么提交是wrong answer

引用 1 楼 早打大打打核战争的回复:闰年判断的问题 谢谢

闰年判断的问题

引用 3 楼 自信男孩的回复:闰年判断条件不全，建议搜一下闰年的判断条件。 嗯啊，了解了，谢谢啦

闰年判断条件不全，建议搜一下闰年的判断条件。


Question: 求解一道题


Question: 大佬求解答，这是出了什么问题

第14行，三个%d，只给了一个值。

引用 3 楼 哎哟，我的小黑猫还不会说 的回复：第14行，三个%d，只给了一个值。谢谢啦

引用 1 楼 user-2 的回复：你peintf有三个占位符%d，但是只有一个参数sum，另外两个应该是随机值谢谢，确实少写了

引用 1 楼 user-2的回复:你peintf有三个占位符%d，但是只有一个参数sum，另外两个应该是随机值 printf打错了，手机输入不方便

你peintf有三个占位符%d，但是只有一个参数sum，另外两个应该是随机值


Question: 求一表达式的正确写法！

引用 3 楼 我是瓶起子 的回复:[quote=引用 1 楼 sdghchj 的回复:] C语言的数据是直接用大括号初始化  void* (*a[])(void) = { (void*(*)(void))(m2) };  -------------------------------------------------- 需要指针指向函数指针数组[/quote]  逗噢，数组指针是需要指定数组长度的吧。   void* (*a[1])(void) = { };  void* (*(*p)[1])(void) = &a;    void* (*a[1])(void) = { };  void* (**p)(void) = a;

引用 5 楼 早打大打打核战争 的回复:你要什么效果 ------------------------------ void (*(* a)[])(void) //为其赋值

你要什么效果

引用 2 楼 sdghchj 的回复: typedef void*(*Func)(void);  typedef void*(*FuncArray[])(void);  FuncArray a = { (Func)(m2) };   ---------------------------------------- a依然是一个数组，并非指针； (void*){ (Func)(m2) };

引用 1 楼 sdghchj 的回复:C语言的数据是直接用大括号初始化  void* (*a[])(void) = { (void*(*)(void))(m2) };  -------------------------------------------------- 需要指针指向函数指针数组

有问题是因为你 需要指针指向函数指针数组 ，但实际上m2是函数，这样 void m2() {}  void *mp[] = {m2}; void (*(* a)[])()={(void (*(*)[])())mp};  (*a)[0](); 就好了

引用 10 楼 早打大打打核战争 的回复:应该是void (*(* a)[])(void)={(void (*(*)[])())m2}; ---------------------------------- void (*(* a)[])(void)={(void (*(*)[])())m2}; (*a)[0]();//这样调用会有问题的。

引用 8 楼 我是瓶起子 的回复:搞定了，正确答案是：void (*(* a)[])(void)=(void*){(void(*)(void))m2}; 优秀，虽然不知道你说的正确性在哪，但感觉好牛逼的样子


Question: c语言头文件显示没有，求帮助

引用 2 楼 @风轻云淡_的回复:把.c和.h文件放到同一个文件夹里面试试。你现在的情况应该是.h文件和.c文件不在同一个文件夹里，或者.h文件根本不存在。 感谢感谢，文件夹里就是没有。 (手动另一朵花🌺)

引用 1 楼 棉猴的回复:那就到文件夹里面看看这两个头文件还在不？ 感谢感谢，文件夹里就是没有。 (手动玫瑰🌹)

那就到文件夹里面看看这两个头文件还在不？


Question: 数据结构新人提问

C语言貌似并没有提供数据结构的标准库，C++中倒是给出了STL，所以C语言中顺序表这个轮子要自己造。 SeqList.h只是自己写的文件，Seq是顺序sequence的缩写。既然是自定义的，书上当然就不会有。 要制作一个C顺序表，首先要造一个顺序表的结构体类： typedef struct c_sequence_list {     int arr[100];     int last; }cseqlist； 这个cseqlist就是我自己自定义的顺序表数据类型，要用它就像用int char之类的关键字一样用 cseqlist mylist;  就是用我自己造的数据类型cseqlist 创建一个名为mylist对象 要写出一个顺序表除了要给出一个cseqlist类型，还要给出针对这个顺序表定制的接口 比如这个顺序表要不要初始化，要不要销毁，要不要判断当前是否是空的，要不要判断当前是否已经满了 我们把结构体类型声明以及接口的声明放在一个cseqlist.h的头文件里， 然后在一个cseqlist.c文件里面写上#include "cseqlist.h" 并在后面加上接口函数的实现 比如： cseqlist.h里面： #ifndef C_SEQ_LIST_H #define C_SEQ_LIST_H  typedef struct c_sequence_list {     int arr[100];     int last; }cseqlist；  /* 添加一条数据到末尾 */ int cseqlist_append(cseqlist*, int);  #endif /* C_SEQ_LIST_H */  cseqlist.c里面： #include "cseqlist.h"  /* 添加一条数据到末尾 */ int cseqlist_append(cseqlist* csl, int data) {     /* 数据满了就无法继续添加，返回0表示添加失败 */     if (csl->last >= 100)          return 0;     /* 添加完数据后数据增多，last加1 */     csl->arr[csl->last++] = data;     /* 返回1表示成功 */     return 1; }  有诸多接口我们就不一一实现了  接下来如何使用这个顺序表呢： 比如现在有一个test.c #include <stdio.h> #include "cseqlist.h"  int main() {     /* 创建顺序表对象 */     cseqlist mylist;     /* 调用自己写的cseqlist_init接口初始化这个顺序表对象 */     cseqlist_init(&mylist);     /* 添加数据 */     cseqlist_append(&mylist, 1);     cseqlist_append(&mylist, 3);     cseqlist_append(&mylist, 5);     /* 恢复初始状态(即销毁) */     cseqlist_deinit(&mylist);     return 0; }  我们通常写一段程序都是写在一个.c文件里面，像这样把公共接口提取出来，可以提高代码复用率，比如我再写个main.c只要在代码中#include "cseqlist.h"就可以用cseqlist了，用不着重复写一遍。

引用 楼主 彼岸的诗.的回复:最近在自学数据结构，看到顺序表里有#include< SeqList.h>对头文件的引用，还有函数体里有SeqList myList这样的语句，看不懂是啥意思啊。看了看之前相关的帖子说这个是自定义的结构体，可是书上貌似并没有对这个结构体定义。所以这个到底代表什么意思，希望大佬解答一下，感激不尽。 。。。。。。肯定有定义啊！不然谁晓得头文件里函数有什么？也不晓得结构体里的成员有什么？

引用 2 楼 o荞麦o的回复:一个类A需要用到别一个类或是结构 B 的时候，A 为了知道 B 的结构，就需要调用的 B 结构的 定义文件  xxx.h 意思是我在一个项目里定义了seqlist这个结构体，如果要引用它就要像这样.h是吗？

书上没有很正常，一本好书是抛砖引玉教给你触类旁通的方法，而不是把所有能用到的全写在书里。看你发的这个头文件的名字，这应该是个有序的链表结构。无非是个有增删改查功能的链表，不懂的部分摘出来，新建个项目，移进去，慢慢的就明白了。

建议学习C++版的数据结构。


Question: 关于梵塔问题中的hanio(x,a,c,b)和hanio(x,b,a,c)什么意思

感谢大家帮忙，真的很难受


Question: 萌新，计算问题，a |= 0x0002和a |= 0x0001;分别代表什么意思啊。。

引用 6 楼 karl_xy 的回复:[quote=引用 4 楼 儿童节 的回复:] （1）竖线「|」是按位（或）运算符，具体的运算结果是「哪个位与1做按位或的运算，那个位就会变成1。」 （2）回到你的提问里，语句「a |= 0x0002;」的右边是十六进制数，值是十进制里的2，它在内存里的二进制编码（补码）的最后一个字节是0000 0010，前面的3个字节都是0就不谈了。 （3）那么根据上面第1点说的，具体运算是「哪个位与1做按位或的运算，那个位就会变成1」，那我们就来看看变量a是多少吧。假设a的值是1（十进制），它在内存里的二进制编码（补码）的最后一个字节就是0000 0001，同样，前面的3个字节都是0也不谈了，那么它与0x0002做按位或（|）运算的话，很明显嘛，它的最后一个字节的倒数第2个0就变成1了，而其它位不变，所以假如变量a的值是1的话，a | 0x0002 的结果就是，a的值变成了 3，因为0000 0011就是十进制的3嘛。《内存里的二进制存储是没有空格的，这里每4位一个空格只是为了美观。》 （4）那么同样的道理，对于语句「a | 0x0001;」，变量 a 与 0x0001 做按位或运算，而0x0001在内存里的二进制编码的最后一个字节是0000 0001，也就是最后一位是1，所以语句的结果就是 a 的二进制编码的最后一位数变成1。 那么，假设a的值是1（十进制），它的二进制编码的最后一个字节是0000 0001，那么按位或运算之后和运算之前是一样的，还是1；假设a的值是4（十进制），它的二进制编码的最后一个字节是0000 0100，那么按位或运算后，就变成了0000 0101，转换回十进制就是5了，也就是a的值就变成5了。 666 谢谢啦[/quote] 不用客气。 另外，还有一点点小的补充，就是上面的回答是针对你提问的「a |= 0x0002;」与「a |= 0x0001;」的，变量a最后是被赋值了的。只不过刚刚回答的时候写得有点儿急，有几个地方把赋值符号（=）漏写了，请不要混淆哈。 换句话说，如果是「a | 0x0002;」的话，那么只是这个表达式的值是变量a与0x0002做按位或运算的结果，但是变量a本身并没有被赋值，那么变量a的值并没有变。 祝学习进步！

引用 4 楼 儿童节 的回复:（1）竖线「|」是按位（或）运算符，具体的运算结果是「哪个位与1做按位或的运算，那个位就会变成1。」 （2）回到你的提问里，语句「a |= 0x0002;」的右边是十六进制数，值是十进制里的2，它在内存里的二进制编码（补码）的最后一个字节是0000 0010，前面的3个字节都是0就不谈了。 （3）那么根据上面第1点说的，具体运算是「哪个位与1做按位或的运算，那个位就会变成1」，那我们就来看看变量a是多少吧。假设a的值是1（十进制），它在内存里的二进制编码（补码）的最后一个字节就是0000 0001，同样，前面的3个字节都是0也不谈了，那么它与0x0002做按位或（|）运算的话，很明显嘛，它的最后一个字节的倒数第2个0就变成1了，而其它位不变，所以假如变量a的值是1的话，a | 0x0002 的结果就是，a的值变成了 3，因为0000 0011就是十进制的3嘛。《内存里的二进制存储是没有空格的，这里每4位一个空格只是为了美观。》 （4）那么同样的道理，对于语句「a | 0x0001;」，变量 a 与 0x0001 做按位或运算，而0x0001在内存里的二进制编码的最后一个字节是0000 0001，也就是最后一位是1，所以语句的结果就是 a 的二进制编码的最后一位数变成1。 那么，假设a的值是1（十进制），它的二进制编码的最后一个字节是0000 0001，那么按位或运算之后和运算之前是一样的，还是1；假设a的值是4（十进制），它的二进制编码的最后一个字节是0000 0100，那么按位或运算后，就变成了0000 0101，转换回十进制就是5了，也就是a的值就变成5了。 666 谢谢啦

引用 1 楼 user-4 的回复:按位“与或”运算符 (|) 将第一个操作数的每个位与第二个操作数的对应位进行比较。如果其中一个位是 1，则将对应的结果位设置为 1。否则，将对应的结果位设置为 0。 为什么不直接赋值 是1就赋值1 是0就赋值0 这样做有什么好处啊

不是判断 是修改  把a的第2个bit设置为1 即 原先是1 不变 原先是0 修改为1

判断第几位有1  你把 2 换成2进制就是10


Question: C语言基础题，希望大神能解释一下，详细一点。

1.搞清楚各运算符的含义 2.搞清楚运算顺序 （搜索C语言运算优先级）  然后详细步骤大概就是1+2=3


Question: c语言对结构数组进行选择性修改出现问题

scanf("%c",&sel);  这句前面注意加上一句getchar();用于吸收上次输入残留在输入缓冲区里的换行符

描述问题不对啊，你说你希望实现怎么样的现象，而现在出现了什么与预期不符的现象


Question: c语言版数据结构中INITLIST(&L) 中&作用是什么

应该是引用吧

引用 3 楼 自信男孩的回复:传L的地址到INITLIST函数里。L参数就是一个传入传出参数了。即传入L的地址到INITLIST函数内，可以在INITLIST函数里对L进行修改，并能够将修改之后的L带到调用函数里。 嗯嗯，明白了，谢谢哦

引用 2 楼 @风轻云淡_的回复:这是取地址的意思，INITLIST(&L)应该是个初始化链表的函数，或者是增加节点或者初始化头结点，你必须要传给他链表头的真实地址，而不是一个拷贝，不然你所做的操作在离开这个函数的时候就没用了。其他的函数或许只是打印查找之用，不需要改变链表头结点的位置，所以不需要传递地址。例：  #include <stdio.h>  void AddNumOne(int num) { 	num += 5; }  void AddNumTwo(int* num) { 	*num += 5; }  int main() { 	int num=0;//这里和定义链表是一样的 	AddNumOne(num); 	printf("%-5d\r\n",num); 	AddNumTwo(&num); 	printf("%-5d\r\n",num); 	return 0; } 嗯嗯，明白了，谢谢啦


Question: 超级小白求助！！！quq为啥我的字符串拷贝完了之后是乱码

#include <stdio.h> #include <stdlib.h> #include <string.h>  char yes[]={'y','e','s','\0'}; char no[]={'n','o','\0'};  char na[20]; char ge[3]; char nu[8][13]; char ad[50]; int da[3];  typedef struct information{     char name[20];     char gender[3];     char number[8][13];     char address[50];     int date[3];     struct information *next; } information;  void exchange(information *p,information *q) {     char na2[20];     char ge2[3];     char nu2[8][13];     char ad2[50];     int da2[3];     int i,j; #if 0     memcpy(na,q->name,sizeof(q->name));     memcpy(ge,q->gender,sizeof(q->gender));     memcpy(nu,q->number,sizeof(q->number));     memcpy(ad,q->address,sizeof(q->number));     memcpy(da,q->date,sizeof(q->date));     memcpy(na2,p->name,sizeof(p->name));     memcpy(ge2,p->gender,sizeof(p->gender));     memcpy(nu2,p->number,sizeof(p->number));     memcpy(ad2,p->address,sizeof(p->address));     memcpy(da2,p->date,sizeof(p->date));     memcpy(p->name,na,sizeof(na));     memcpy(p->gender,ge,sizeof(ge));     memcpy(p->number,nu,sizeof(nu));     strcpy(p->address,ad);//就是这一步出现错误，将ad的值赋给p->address结果链表内的值输出之后是乱码     memcpy(p->date,da,sizeof(da));     strcpy(q->name,na2);     strcpy(q->gender,ge2);     strcpy(q->address,ad2);     for(i=0;i<=7;i++){         for(j=0;j<=13;j++){             p->number[i][j]=nu2[i][j];         }     }     for(i=0;i<=2;i++){         p->date[i]=da2[i];     } #else     memcpy(p, q, sizeof(information)); #endif     //printf("%s\n",ad);//这个是用来检查错误的     printf("%s\n", p->address);//这个是用来检查错误的 }  试一下这种方法。

好像就是字符串赋给数组的时候出问题啦！！！我该怎么办呀orz


Question: C语言标准库

msdn网站。旧版（不推荐）有vc6的、很小 cplusplus网站。cplusplus-2013-8-8.chm、离线版  自己去搜“c语言函数查询”、有一些小站有中文的、不推荐。


Question: 萌新求助！！写了一个纸牌游戏，有个地方一直出错，求大神指点！！

引用 7 楼 单眼皮的小健的回复:[quote=引用 6 楼 五月天下第一 的回复：][quote=引用 5 楼 单眼皮的小健的回复:][quote=引用 3 楼 五月天下第一 的回复：]改过之后。。 scanf之后马上以字符形式输出看看是否输入成功[/quote] 十分感谢！清除缓冲区之后就可以了，谢谢大佬[/quote]要不要结题赚个积分？[/quote] emm怎么弄啊，第一次发帖不太会。。

引用 6 楼 五月天下第一 的回复：[quote=引用 5 楼 单眼皮的小健的回复:][quote=引用 3 楼 五月天下第一 的回复：]改过之后。。 scanf之后马上以字符形式输出看看是否输入成功[/quote] 十分感谢！清除缓冲区之后就可以了，谢谢大佬[/quote]要不要结题赚个积分？

引用 5 楼 单眼皮的小健的回复:[quote=引用 3 楼 五月天下第一 的回复：]改过之后。。 scanf之后马上以字符形式输出看看是否输入成功[/quote] 十分感谢！清除缓冲区之后就可以了，谢谢大佬

引用 3 楼 五月天下第一 的回复：改过之后。。 scanf之后马上以字符形式输出看看是否输入成功

引用 3 楼 五月天下第一 的回复：改过之后。。 强制转换可以删掉，不需要，另外，每次的scanf都涉及缓冲区问题，每次用完scanf，都清空缓冲区，目的的清除输入的enter键，清除缓冲区的方法自己搜一下

改过之后。。

emm...试了一下这个地方确实不对，然而在这个程序里面改了之后还是会输出别的东西。。。下面贴一张改过之后的图吧。。

play1[i]那改为play1[i]=num[i]-‘0’，字符的1并不是十进制的1，你把一个字符1赋值给整型，结果不是你要的效果


Question: 请问这道题用C语言怎么写?

std::string contactString(std::string str1, std::string str2) { 	if (str2.length() == 0) return str1; 	std::string result, tmp; 	size_t npos = 0; 	do { 		npos = str1.find(str2[0], npos); 		if (npos == std::string::npos) { 			result = str1 + str2; 			break; 		} 		 		tmp = str1.substr(npos); 		if (strstr(str2, tmp) == &str2[0]) {//如果tmp是str2的子字符串,并且子字符串的首地址为str2的首地址 			result = str1.substr(0, npos) + str2; 			break; 		} 		 		npos++; 	} while(1); 	 	return result; } 只想到这个方法，不知道有没有更好的。

在一个循环里遍历两个字符串，第一个从头向尾遍历，第二个从尾向头遍历，直到他们出现不同字符的时候，把第二个字符串遍历的字符添加到第一个字符串的尾部。

參考看看囉:  #include "test.h" #include <stdio.h> #include <string.h> #include <stdlib.h>  char* concateSubstring(char* str1, char* str2) { 	int len1 = (int)strlen(str1); 	int len2 = (int)strlen(str2); 	 	int subStart = 0; 	int subLen = 0; 	 	// Find the shared substring in str1 and str2 	for (int j = subStart; j < len1; j++) 	{ 		for (int i = 0; i < len2; i++) 		{ 			if (subStart + i >= len1) 			{ 				// Reach the end of string 1 				break; 			} 			 			if (str1[subStart + i] != (str2[i])) 			{ 				subLen = 0; 				break; 			} 			subLen++; 		}  		if (subStart + subLen >= len1) 		{ 			// Reach the end of string 1 			break; 		} 		 		subStart++; 	} 	 	printf("Substring start: %d, length: %d\n", subStart, subLen);  	int resultLen = len1 + len2 - subLen + 1; 	char* result = (char*)malloc(resultLen); 	strncpy(result, str1, resultLen); 	strncat(result, str2 + subLen, resultLen); 	 	printf("Result string: %s\n", result); 	 	return result; }

这里面还有BUG、有些地方没考虑完善、部分代码还需要优化，剩下的都交给你啦，加油。

//思路：判断B串首字符在A串中位置，匹配成功后，进入子循环，查看是否完全匹配。 //如果是，记录匹配位置，跳出循环，进行拼接；不是，继续下次循环，直至主串循环结束  char* ContactStr(const char* srcStr,const char* newStr,bool isOrder) { 	if(NULL == srcStr || NULL == newStr) 		return NULL;  	if(isOrder)//TODO:哪个字符串作为主字符串，暂定为true 	{ 		char first = newStr[0]; 		size_t startPos = strlen(srcStr);//默认为在主串尾进行拼接 		for(size_t len = 0;len < strlen(srcStr);++len) 		{ 			if(srcStr[len] == first)//找到首字符匹配位置，进入子循环 			{ 				bool isMatch = true; 				for(size_t tmpLen = len,newLen = 0;tmpLen < strlen(srcStr) && newLen < (strlen(newStr)-len);++tmpLen,++newLen) 				{ 					if(srcStr[tmpLen] != newStr[newLen]) 						isMatch = false; 				} 				if(true == isMatch) 				{ 					startPos = len; 					break; 				} 			} 		}  		//拼接新字符串 		size_t size = strlen(srcStr)+strlen(newStr)+5; 		char* str = new char[size]; 		memset(str,0,size); 		size_t len = 0; 		for(size_t i = 0;i < startPos && len < size;++i,++len) 		{ 			str[len] = srcStr[i]; 		}  		for(size_t i=0;i<strlen(newStr) && len < size;++i,++len) 		{ 			str[len] = newStr[i]; 		}  		str[len] = '\0';  		printf("%s",str);  		delete[] str; 		return NULL;//如返回str，不要忘记释放内存 	} }

最简单的方法就是扫两遍，第一次循环确认重复字符串的长度，第二次循环拼接字符串，但效率不高


Question: 关于图像像素问题

你这又是一点不写，等现成的啊。兄弟、以后的路还很长。

引用 3 楼 l11513 的回复:不是我不想写，而是根本不会。我也想写但是看了很多代码还是不懂。 这个理由不错~~

不是我不想写，而是根本不会。我也想写但是看了很多代码还是不懂。


Question: VS2017 C语言随机数问题

可能是rand（）的问题，先另外保存rand（）的值，再计算year，调试的时候两个同时输出，看看year等于1的时候rand（）有没有出错


Question: 求救C char返回值突然变了

#include <stdio.h>  char *aaa(char *s);  int main(void) {     char a[] = "ABCD";      printf("%s\n", aaa(a));     return 0; }  char *aaa(char *s) {     return (s); } 测试了，没有发现问题，正常输出。  建议贴出完整代码


Win32 SDK方式编程已经过时了，了解下原理就可以了，主要是消息机制。  图形用户界面（GUI）编程可以学习C++ Builder，架构先进（和C#一样拖控件），入门比较容易。  　　C++ Builder是真正的可视化的开发工具。C++ Builder可以用鼠标拖拉控件加上设置属性轻松的“设计”出一个程序的图形用户界面，利用可视的组件/控件像“搭积木”一样，以“所见即所得”的方式搭建应用程序的界面，这也是C++ Builder这个名字中Builder的概念。这样，只需要用C++语言编写业务逻辑代码，类似于DOS下文本界面编程，只要专注于实现业务逻辑功能就可以了，代码非常简洁。数据的输入和表现，都在图形用户界面，非常直观、易用。这就是RAD开发（Rapid Application Development，快速应用程序开发）。  书籍推荐： 《C++Builder 6程序设计教程（第二版）》 （陆卫忠，刘文亮　等编著 /2011-04-01 /科学出版社）（当当网） 《C++Builder 6编程实例精解》（赵明现），PDF，是数字版的，非扫描版的，里面还有一个俄罗斯方块游戏的完整实现。 《精彩C++Builder 6程序设计》（台湾 吴逸贤），里面有10几个简单小游戏的实现，可以自己看懂以后再重写，才是自己掌握的。 《C++ Builder 5高级编程实例精解》（刘滨 编著）都是较大的实用的程序。  C++ Builder书籍下载： https://pan.baidu.com/s/13n9hxwVj9ai1p5L2rQC83Q

绘制的时候 FillRect 先下填充背景色


Question: Typedef

what's your questions?


Question: C语言并列成绩排序问题

最简单的办法是先按名字排一次序，然后再用稳定的排序算法按成绩排一次序，这样就行了。稳定的排序算法在遇到两个值相等时不会改变两个值的位置关系。我没记错的话，冒泡排序就是稳定的，所以你先把名字排一次，再排分数就行了。

在排序时遇到相等的，再按照名字交换顺序

第一轮排序很简单的，你应该已经明白。第二轮排序应该是这样：扫描整个序列，遇到重复时记下重复部分的起止位置，在这两个位置之间再做一次排序，直到扫描完毕。


Question: C语言中的数组和指针到底啥关系啊

讨论很热烈。。。。。。

先学汇编，再学C 。

数组是数组  指针是指针 数组用来暂时存储数据的 指针跟地址有关系

作为一个新手，我表示看不懂啊啊啊

引用 89 楼 Red_Strings 的回复:打起来了怎么还， 楼主刚开始学千万别太深入地研究，到后来你就算明白了，循序渐进地学， 说实话谭浩强那本c语言书讲这方面讲的挺好，最起码我这种智商都看懂了。谭C错误太多 不值得推荐  自己看就好 不要宣传 会误人子弟

引用 88 楼 _Saoke 的回复:不同之处:在某些特定情况下，指针的引用操作要比数组的引用操作效率更高一些 目测你说反了  数组效率更高  某些特定情况 指针能达到数组的效率

引用 95 楼 lin5161678的回复:[quote=引用 94 楼 _Saoke 的回复:] [quote=引用 91 楼 lin5161678的回复:][quote=引用 88 楼 _Saoke 的回复:] 不同之处:在某些特定情况下，指针的引用操作要比数组的引用操作效率更高一些 目测你说反了  数组效率更高  某些特定情况 指针能达到数组的效率  [/quote] 建议你看一下c和指针中，指针与下标这一小节的内容[/quote] 建议你看看汇编 简单介绍一下可能的实现  int arr[10], *p = arr; arr[5]=5 求出偏移4*5 存到寄存器 对 数组地址+寄存器 进行赋值   p[5]=5 一样会有计算偏移的操作 存到寄存器 然后把p保存的数据从内存读取到另一个寄存器 最后通过2个寄存器保存的数据 计算出地址 进行赋值操作  当然会有各种不同的实现方式  这里仅通过某种可能的实现方式 进行分析 可以看到  p[5] 会比 arr[5] 多一步 读取p的数据到寄存器的操作 为什么会认为 p[5] 效率优于 arr[5] 呢? [/quote] 好的，我会去阅读的，谢谢

字符串应该是数组吧， C89 里的描述是这样的 3.1.4 String literals  Syntax            string-literal:                   " s-char-sequence<opt>"                   L" s-char-sequence<opt>"            s-char-sequence:                   s-char                   s-char-sequence s-char            s-char:                   any member of the source character set except                    the double-quote ", backslash \, or new-line character                    escape-sequence  Description     A character string literal is a sequence of zero or more multibyte characters enclosed in double-quotes, as in xyz.  A wide string literal is the same, except prefixed by the letter L.     The same considerations apply to each element of the sequence in a character string literal or a wide string literal as if it were in an integer character constant or a wide character constant, except that the single-quote ' is representable either by itself or by the escape sequence \', but the double-quote shall be represented by the escape sequence \.  Semantics     A character string literal has static storage duration and type ``array of char ,'' and is initialized with the given characters.  A wide string literal has static storage duration and type ``array of wchar_t,'' and is initialized with the wide characters corresponding to the given multibyte characters.  Character string literals that are adjacent tokens are concatenated into a single character string literal.  A null character is then appended. /19/ Likewise, adjacent wide string literal tokens are concatenated into a single wide string literal to which a code with value zero is then appended.  If a character string literal token is adjacent to a wide string literal token, the behavior is undefined.

理论上数组效率更高 ，数组名直接代表一个地址，所以对数组元素的访问可以直接生成mov [xxxx+index], value这样的指令，而指针访问需要做一次解引用 mov reg,[ptr]; mov [reg],value; 但是如果编译器优化把数组首地址或者指针值缓存到寄存器中（在一段代码中保持不变），则两者生成同样效率的代码

引用 94 楼 _Saoke 的回复:[quote=引用 91 楼 lin5161678的回复:][quote=引用 88 楼 _Saoke 的回复:] 不同之处:在某些特定情况下，指针的引用操作要比数组的引用操作效率更高一些 目测你说反了  数组效率更高  某些特定情况 指针能达到数组的效率  [/quote] 建议你看一下c和指针中，指针与下标这一小节的内容[/quote] 建议你看看汇编 简单介绍一下可能的实现  int arr[10], *p = arr; arr[5]=5 求出偏移4*5 存到寄存器 对 数组地址+寄存器 进行赋值   p[5]=5 一样会有计算偏移的操作 存到寄存器 然后把p保存的数据从内存读取到另一个寄存器 最后通过2个寄存器保存的数据 计算出地址 进行赋值操作  当然会有各种不同的实现方式  这里仅通过某种可能的实现方式 进行分析 可以看到  p[5] 会比 arr[5] 多一步 读取p的数据到寄存器的操作 为什么会认为 p[5] 效率优于 arr[5] 呢?

引用 91 楼 lin5161678的回复:[quote=引用 88 楼 _Saoke 的回复:] 不同之处:在某些特定情况下，指针的引用操作要比数组的引用操作效率更高一些 目测你说反了  数组效率更高  某些特定情况 指针能达到数组的效率  [/quote] 建议你看一下c和指针中，指针与下标这一小节的内容

要了解指针和数组，首先要先对内存管理有所了解。  系统用一个以字节为单位的虚拟的地址表来描述和管理整个物理内存，分配内存的过程就是给定某个空闲的地址区间，将这块地址区间与相应字节数的某小块空闲的物理内存建立映射。这段地址区间的首地址就是CPU定位这块内存的凭据，或者说是“门牌号”。那么相对的，从这个首地址开始向后偏移若干字节的偏移地址，就可以定位到这小块内存空间的局部。  内存并没有数据类型之分，内存只会存储二进制数据流。举个简单的例子：一个字符占一个字节，一个字节有8个二进制位，所以字符在内存中存储的实体是一段8位的二进制流0000 0000，每一位上只可能是0或1，于是乎8个二进制位可以表示2的8次方个不同的内容，字符只是这段二进制流参照ASCII编码后在人类眼中的表现形式。我们在源代码中设定数据类型决定了我们从给定的首地址向后读取多少字节的内容，比如一个int类型占4个字节，也就是4*8=32个二进制位：0000 0000 0000 0000 0000 0000 0000 0000，我们如果用int来读取就会从首地址向后读取4个字节的内容，但是如果我们强行用char类型来读取这段内存，我们只会从首地址开始向后读取一个字节的内容，也就是只读到0000 0000。  我们源代码中的变量名可以指代一小块内存，编译器会按照固定的结构帮我们把源代码编译成一个“内存模板”，程序运行的时候会产生一个进程，系统根据这个模板为进程分配一整块内存。然后按照模板往内部不同区块塞入初始数据。变量名会被翻译成相对整个进程内存内部某个区块的偏移地址。比如已初始化的全局变量和static静态变量存在进程的全局区；未初始化的全局变量和static静态变量存在BSS段；普通局部变量则存储于栈区。它们都是一个相对地址。  数组名也是一种变量名，也会被翻译成某个相对地址，虽然数组比单个的变量内存要大，但是由于数据类型的限制，数组每次只能读取一个数据类型单位的长度，比如：int arr[10]，一共占据4*10=40个字节的长度，但是每次按int类型只会读取4个字节。C/C++提供了两种访问方式，一种是下标访问，如：arr[3];一种是地址偏移访问,如：arr + 3。arr是整个数组的起始地址，整个数组的地址当然也就是第一个元素的地址，或者说是“首地址”，arr[3]或者arr + 3就是在arr的基础上再向后累加3个int的跨度，以这个地址为起点向后访问一个int长度的内存。  只要有地址就可以找到对应的内存。  指针类型是一种特殊的类型，它通常被用来备份地址值。和数组名不同的是，数组名本身就代表了自己，而指针则支持充当了中介的工作，指针变量在自己的内存空间里存储了别的空间的地址，我们可以通过它存的地址找到与之对应的内存。从语言习惯上来讲，我们可以说指针指向了xxx，实际上是指针把xxx的地址备份了起来。  通过地址访问空间的原理都是一样的，所以指针和数组名在很多情况下操作是非常类似的。比如指针也支持下标访问，以及通过偏移地址来访问的方式。在传递参数的时候，如果参数类型是数组类型，也会默认当做指针来处理。比如： void fun(int arr[10]); 这个函数似乎规定了arr最多有10个，但是编译器并不加以理会，而是纯粹把它当做void fun(int* arr)来解释。

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素 http://edu.csdn.net/course/detail/2455 C语言指针与汇编内存地址-二.函数 http://edu.csdn.net/course/detail/2516 C语言指针与汇编内存地址-三.数组和二维数组 http://edu.csdn.net/course/detail/2517 C语言指针与汇编内存地址-四.三维数组

简单的总结一下，一定会有一定的缺陷，希望大家谅解: 关系:数组名在进行运算操作的时候会隐式转化为指针；相似之处:数组名和指针可以以不同的方式对数据进行相同的引用；不同之处:在某些特定情况下，指针的引用操作要比数组的引用操作效率更高一些

引用 9 楼 xx1959590935的回复:既然你这么说我就不说啥了。你开心就好。我不解释太多，你可以怼我。但我只想说，连数组和指针都不明白的人还说理解字节和内存。。真是美美哒。你开心就好。祝你在c语言这条路上越走越远。 刚接触c  学的一点皮毛而已

引用 86 楼 sololie 的回复:学习编程不能跳过基本的计算机原理，如果你懂得内存原理，和数据结构的话，这根本不存在任何理解问题。数组是一种链表结构，表头首地址就是这种数据类型变量的地址，操作数组跟操作指针没有什么区别有点离谱了 你说线性结构没问题  链表结构是认真的?

引用 3 楼 xx1959590935的回复:纠正几个错误，第一，你说的那个1234它不是数组，它是字符串，你往后学习就知道了，你会学到更多容器，然后回头看数组就会明白数组也是个容器，肯定是有名字的。 而且作为数组的名字，它指向的的肯定是数据的第一个元素，如果不是这样，那数组就没人敢用了。第二，我说它的名字是const类型不是说它能不能被赋值，而是它作为一个指向一串数据的指针，它的值是不能被改变的，严谨的说，我也不知道他是什么类型，不过这是新手最容易理解的解释，我试过了，确实不是const类型。既然知道的多那就多说点。我特意对数组和指针做过大量的测试，得出的结论简单点说就是，除了数组的名字不能被改变，数组功能的实现是完全可以用指针代替的，相反，指针也可以通过数组的方式访问。具体原理我就不说明太多了，仁者见仁 智者见智。(不考虑内存分配，下面会说道).  你可以通过指针访问数组的任何成员，你可以把数组作为指针参数传递。在容器方面数组和指针有一个绝对的相同点，他们储存数据都是有序的。再说说不同的。他们也有绝对的不同点，要不就不会出现数组这个东西了。数组的内存分配是固定的。你可以去理解下动态数组这个概念，你看看他的实现方法，说白了他的实现就是为一个指针开辟了一个某个类型特定数量的空间，你完全可以用malloc开辟同样的空间，在使用时和动态动态数组的使用不会有任何不一样，前提是你用的对。。。我这里没说关于内存的知识，手机要没电了，不继续码字了。有啥问题可以继续提。你去了解下字节和内存这个概念。深深的理解这两个概念，你就会发现新大陆。 能不能 用具体的程序  解释一下   我们小白 表示看不懂

指针变量用来存储地址，数组划分了一整块存储空间，而数组名一般就是该数组首地址(一维)，所以很多教材把他们放在一块讲，你可以把一维数组名当成一个指针，然后利用他和其他变量一起可以实现数组的调用


Question: 求助！C语言中求图的两个点a与b之间的最短路径，若存在多条最短路径，如何输出字典序最小的一条路径序列？

我也遇到了，也不会。【问题描述】    给定一个含权的无向图，顶点编号为1~n，你的任务为找出顶点1到顶点 n 之间的最短路径。  【输入形式】    输入的第一行为两个整数 n 和 m (2 ≤ n ≤ 105,  0 ≤ m ≤ 105)，其中 n 为顶点数，m 是边数。     接下来的 m 行包含用形式 ai、bi 和 wi (1≤ai、bi ≤n，1≤ wi ≤ 106)，这里ai、bi 是边的端点，而 wi 是边的长度。     该图可能包括环，或者一对顶点之间包含多条边。  【输出形式】    如果无路径，输出-1，否则输出最短路径，如果有多个，则输出字典序最小的路径。     对于两个整数序列 A (a1、a2、...)和 B (b1、b2、...)，称序列 A 字典序小于序列 B 当且仅当，存在 k ≥ 1，i <k 时，ai = bi，i =k 时，ai < bi 。


Question: 求一个C语言程序

引用 7 楼 jishengruofou的回复: #include <stdio.h> #include <stdlib.h> #include <time.h>  void welcome(void); 	 int main() { 	srand((int)time(NULL));  	int key,num,a,b, all_num = 0, right_num = 0; 	char c; 	 	welcome(); 	scanf("%d",&key); 	 	do 	{ 		switch(key) 		{ 		case 1:{ 			a=rand()%10;b=rand()%10; 			printf("%d+%d=?",a,b); 			 			scanf("%d",&num); 			 			all_num ++; 			 			if(num==a+b) 			{ 				right_num ++; 				printf("你答对了");   			} 			else 			{ 				printf("你答错了"); 			} 			 			break; 		} 		case 2: 		{ 			a=rand()%10;b=rand()%10; 			printf("%d-%d=?",a,b);scanf("%d",&num); 			 			all_num ++; 			 			if(num==a-b) 			{ 				right_num ++; 				printf("你答对了");  			} 			else 			{ 				printf("你答错了");  			} 			break; 		} 		case 3: 		{ 			a=rand()%10; 			b=rand()%10; 			printf("%d*%d=?",a,b);scanf("%d",&num); 			 			all_num ++; 			 			if(num==a*b) 			{ 				right_num ++; 				printf("你答对了"); 			} 			else 			{ 				printf("你答错了");  			} 			break; 		} 		case 4:{ 			a=rand()%10;b=rand()%10; 			printf("%d/%d=?",a,b);scanf("%d",&num); 			 			all_num ++; 			 			if(num==a/b) 			{ 				right_num ++; 				printf("你答对了"); 			} 			else 			{ 				printf("你答错了"); 			} 			break; 		} 		default: 		{ 			printf("没有这种功能！！！！"); 			break; 		} 		} 		printf("输入Y继续游戏，输入N结束游戏"); 		scanf("%c",&c); 		scanf("%c",&c); 		 	}while((c=='Y'||c=='y') && (all_num < 6)); 	 	printf("你的分数为:%d", (right_num * 10)); 	return 0; }  void welcome(void) { 	printf("************************\n");  	printf("请选择运算符：\n");  	printf("加法运算请按1\n");  	printf("减法运算请按2\n");  	printf("乘法运算请按3\n");  	printf("除法运算请按4\n");  	printf("************************\n");  }   大体就这么个意思，但是需要完善的地方还很多，其他的你自己研究吧。 好的，谢谢谢谢谢谢，十分感谢

引用 4 楼 失落的蓝 的回复:这是C没错啊。哪里不对应了需要注意下，函数内不能再次实现函数。

3楼是这个意思，让你这样发出来，给你原样格式化了一下，补全了部分符号括号，未修改其他内容：  #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { 	srand((int)time(NULL)); 	void welcome(); 	welcome(); 	int key,num,a,b; 	char c; 	do 	{ 		scanf("%d",&key); 		switch(key) 		{ 		case 1:{ 			a=rand()%10;b=rand()%10; 			printf("%d+%d=?",a,b);scanf("%d",&num); 			if(num==a+b) 			{ 				printf("你答对了"); break;  			} 			else 			{ 				printf("你答错了"); break; 			} 			break; 		} 		case 2: 		{ 			a=rand()%10;b=rand()%10; 			printf("%d-%d=?",a,b);scanf("%d",&num); 			if(num==a-b) 			{ 				printf("你答对了"); break; 			} 			else 			{ 				printf("你答错了"); break; 			} 			break; 		} 		case 3: 		{ 			a=rand()%10; 			b=rand()%10; 			printf("%d*%d=?",a,b);scanf("%d",&num); 			if(num==a*b) 			{ 				printf("你答对了");break; 			} 			else 			{ 				printf("你答错了"); break; 			} 			break; 		} 		case 4:{ 			a=rand()%10;b=rand()%10; 			printf("%d/%d=?",a,b);scanf("%d",&num); 			if(num==a/b) 			{ 				printf("你答对了"); break; 			} 			else 			{ 				printf("你答错了"); break; 			} 			break; 		} 		default:printf("没有这种功能！！！！"); 		} 		printf("输入Y继续游戏，输入N结束游戏"); 		scanf("%c",&c); 		scanf("%c",&c); 	} 	while(c=='Y'||c=='y'); 	return 0; }  void welcome() { 	printf("************************\n");  	printf("请选择运算符：\n");  	printf("加法运算请按1\n");  	printf("减法运算请按2\n");  	printf("乘法运算请按3\n");  	printf("除法运算请按4\n");  	printf("************************\n");  }

这是C没错啊。哪里不对应了

代码编译都编不过，此外发代码请贴到对应的语言中

emmmm，没有学C的人了吗？

#include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand((int)time(NULL)); void welcome(); welcome(); int key,num,a,b; char c; do	 { scanf("%d",&key); switch(key) { case 1:{ a=rand()%10;b=rand()%10; printf("%d+%d=?",a,b);scanf("%d",&num); if(num==a+b) { printf("你答对了"); break;  } else { printf("你答错了"); break; } break;	 } case 2: { a=rand()%10;b=rand()%10; printf("%d-%d=?",a,b);scanf("%d",&num); if(num==a-b) { printf("你答对了"); break; } else { printf("你答错了"); break; } break;  } case 3:{ a=rand()10;b=rand()%10; printf("%d*%d=?",a,b);scanf("%d",&num); if(num==a*b) { printf("你答对了");break;  } else { printf("你答错了"); break; } break; }  case 4:{ a=rand()%10;b=rand()%10; printf("%d/%d=?",a,b);scanf("%d",&num); if(num==a/b) { printf("你答对了"); break; } else { printf("你答错了"); break; } break; } default:printf("没有这种功能！！！！");	 } printf("输入Y继续游戏，输入N结束游戏"); scanf("%c",&c); scanf("%c",&c); ｝ while(c=='Y'||c=='y'); } void welcome() { printf("************************\n");  printf("请选择运算符：\n");  printf("加法运算请按1\n");  printf("减法运算请按2\n");  printf("乘法运算请按3\n");  printf("除法运算请按4\n");  printf("************************\n");  }


Question: 奇数项求和

引用 2 楼 ╰ 过客.☁的回复:引用 1 楼 user-6 的回复：2.51的答案是怎么来的？1+1/3+1/5+………+1/21 那我觉得是你的答案错了，程序应该没问题，你用计算器再算一遍看看。

我算的结果也是这个2.180875 代码与计算结果

引用 5 楼 niiiloc 的回复:我估计题目是计算前N个奇数倒数之和，而你的实现是1~N中的所有奇数倒数之和。 你的程序输入44的话，答案倒是2.51。  要修改的话也很简单，for 循环条件改下就好了。 厉害，竟然能够还原真题

程序没发现什么问题。

2.51的答案是怎么来的？


Question: C语言新手关于共用体的疑惑

引用 5 楼 自信男孩 的回复:共用体的占用内存大小是有成员中占用最多的内存。即不像结构体，结构体是所有成员占用内存之和。 两句话都说错了 共用体内存大小是保证足够存下最大成员 没限制是最大成员的大小 结构体内存大小是保证足够存下所有成员 没限制是所有成员之和

共用体的占用内存大小是有成员中占用最多的内存。即不像结构体，结构体是所有成员占用内存之和。  由于是成员中最大的内存，因此共用体只要修改其中一个成员，都会修改他们公用的内存值。

这段内存有且只有一个成员有真实意义

就是説，按占用空間最大的成員分配内存，同一時間只有一個成員有效。

一个盒子可以放核桃，苹果，西瓜，菠萝等，但同时只能放一种水果

union(共用体)的各个成员是以同一个地址开始存放的,每一个时刻只可以存储一个成员 假设一个union里有三个变量，并列排：（n short int，c[]字符数组，f float型变量） 第一字节 第二字节 第三字节 第四字节 …… n的低八位 n的高八位 c[0] c[1] c[2] c[4] …… f第一字节 f第二字节 f第三字节 f第四字节 float 占前四个 short int 占前两个 char 数组占前十个 都是从第一个字节开始的。也就是说，只要改变数组前四个元素的值，就能同时改变n和f的值。


Question: c语言

#include <stdio.h>   int main(void) {         int a,b,c;         printf("Please enter 3 numbers:");         scanf("%d,%d,%d",&a,&b,&c);         //ab=a+b；         //ac=a*c；         printf("a+b+c=%d\n",a+b+c);         //printf("a*b*c=%d\n",a+c*b);         printf("a*b*c=%d\n", a *c*b);          return 0; }  供参考！  测试时注意输入数据间加上逗号。


在调用sendDescribeCommand的时候可以加入鉴权信息 	Authenticator *pAuthenicator = NULL;  	if (!strUserName.empty() && !strPassword.empty()) 	{ 		pAuthenicator = new Authenticator(strUserName.c_str(), strPassword.c_str()); 	}  	pRtspClient->sendDescribeCommand(continueAfterDESCRIBE, pAuthenicator);  	if (pAuthenicator != NULL) 	{ 		delete pAuthenicator; 	}

跟vlc的log做了对比，找到了问题原因  live555的testRTSPClient内，默认未对url的用户名密码做处理，在openURL时，sendDescribeCommand要带权限信息  至于怎么加，还在研究中，有处理过的朋友麻烦回复下


Question: 求大神

printf中的输出表列是由右向左计算的， VS下运行是  3 3 2


Question: c语言怎么求素数

程序写错了吧，第一个for循环应该是m++

引用 3 楼 @风轻云淡_ 的回复:m是表示100到300 的数，用来作为被除数，只要能被除了它自己和1之外的其他数整除，此数就不是素数。k作为最大因子（不知道为什么是开方，可以查查百度），提高效率之用，只要超过k还没有被整除，则无需再往下进行。i作为因子，m除以从2开始到它最大因子，在此之间，m能被i整除就跳出循环，m不是素数。此外，第一次循环时，i++可以改为i+=2，减少循环次数。 最后说错了，是第一层循环里， 不是i+=2，是k+=2.

i不是循环变量吗？ 对于这个问题，需要了解素数的原理，所以建议先了解一下素数的定义和特性。

引用 5 楼 niiiloc 的回复:程序写错了吧，第一个for循环应该是m++尴尬，我太马虎了，确实应该是m++    可以把m++ 改为m+=2

m是表示从101加1到300的数，k是m的开方（即如果m是144，k就是12），i表示从2开始加1到m。素数的性质就是除了1和它本身不再有其他因数，所以如果m处以i（2以上的数）能整除，m就不是素数。


Question: C语言

引用 4 楼 自信男孩 的回复：printf中a++操作是a++的整体作为实参传入printf中，比如a=5；那么传入printf的值就是5，执行完printf后a的值是6;+1

不知道怎么回答。printf只是把当前a的结果打印出来，但是a的值已经自增了1。所以绝对不能说是相当于不计算，只是你没把它最终的结果显示出来而已

是呀，这都被你发现了

我觉得应该这样理解，a++,先执行操作后再加一，所以说是先输出a，然后a再加一了


Question: 求各位大佬帮小弟改一下

大哥们 我又重写了一下 还是错误 如果输入字符 就各种循环 #include<stdio.h> #include<stdlib.h> float weght; float height; float bmi; float a; void cal(); //计算 void prf(); //打印 void scf(); //输入 int s1; int s2;//判断是否输入正确 int main() { 	scf(); 	prf(); } void scf() { 	printf("请输入您的体重（kg）: "); 	s1=scanf_s("%f", &weght); 	if (s1!=1) 	{ 		printf("输入错误，请重新输入！"); 		scf(); 	} 	else 	{ 		printf("请输入您的身高(m):"); 		s2=scanf_s("%f", &height); 		if (s2!=1) 		{ 			printf("输入错误，请重新输入！"); 			scf(); 		} 		else 		{ 			cal(); 		} 	}  } void cal() { 	a = height * height; 	bmi = weght / a; 	prf(); } void prf() { 	if (bmi < 18.5) 	{ 		printf("您的BMI为%f,处于过轻（<18.5）注意您的饮食健康!\n", bmi); 		system("pause"); 	} 	else if (bmi <= 23.9) 	{ 		printf("您的BMI为%f,处于正常（18.5-23.9）注意保持体重!\n", bmi); 		system("pause"); 	} 	else if (bmi <= 27) 	{ 		printf("您的BMI为%f,处于过重（24-27）注意您的饮食健康!\n", bmi); 		system("pause"); 	} 	else if (bmi <= 32) 	{ 		printf("您的BMI为%f,处于肥胖（28-32）注意您的饮食健康!\n", bmi); 		system("pause");   	} 	else if (bmi > 32) 	{ 		printf("您的BMI为%f,处于非常肥胖（高于32）注意您的饮食健康!\n", bmi); 		system("pause"); 	} }

判断scanf_s的返回值，如果输入的是数字，那么它应该返回1(因为只有一个%f)，否则表示输入的格式不对

判断输入的类型，如果为字符型，执行报错，再次输入


Question: 时间复杂度

时间复杂度主要跟循环次数有关，怎么可能跟i++相关呢

执行次数和时间复杂度对象是算法，如果就这个i++而言，它只是一个语句，执行次数为1，时间复杂度为O（1）


Question: 输入年月日，输出的是该年的第几天

楼上正解，加个=就行了

写少了一个=，c语言比较是否相同用两个等号==，一个等号是赋值，所以提示出错了，加上=就行


Question: 救救孩子吧

好的好的，我知道了，谢谢

也就是说disc<0，无解  你可以叫一个判断，简单的if else 结构就行

你输入的值不满足disc>0，的条件


Question: 求高手，前辈们指点迷津。

引用 7 楼 单眼皮的小健 的回复：引用 6 楼 qq_44696912 的回复：引用 1 楼 单眼皮的小健 的回复：csdn很多这个代码，搜一搜就能找到搜不到，已经绝望。进入我博客主页加我联系方式，可以聊一下哥，联系方式多少？找不到啊？

引用 13 楼 六道佩恩 的回复：1. 二分查找可以用有序数组或二叉搜索树（BST），前者的话，从中间开始判断，每次就可以缩小一半范围。 2. 学号、姓名、成绩都是数据，人多的话创建不同的数组即可，但不方便，所以你做一个结构体，容纳一个学生的各种数据。 3. 结构体就是个你自定义的类型，用它定义的变量就是结构体变量，这个变量可以存储多种数据。数组就是很多个挨着的变量。如果你是用数组的形式，假如这个数组是  ABCDE，你要删除C，只需把DE往左移动一个位置即可，就变成了ABDEE，由于你记录的5个数据，删了一个编程4个，所以对你来说只有ABDE四个数，相当于完成了删除。我不会增加，不会删除。删除后我怎么输出，还是个难题啊

表示我学校也有这个大作业，已写完的我，不知道怎么回答，因为代码实在有点多…

引用 8 楼 weixin_44414105 的回复：去网上参考一下 再自己调试调试哎

引用 9 楼 stone dream 的回复：表示我学校也有这个大作业，已写完的我，不知道怎么回答，因为代码实在有点多…崩溃…

引用 1 楼 单眼皮的小健 的回复：csdn很多这个代码，搜一搜就能找到根本找不到

去网上参考一下 再自己调试调试

引用 2 楼 focuslight 的回复：别忘了二分查找要先排序  百度 学生成绩管理 C代码我这个楼主心已死。

引用 3 楼 自信男孩 的回复：建议自己先写写，要么在网上copy一下代码，先改改。不明白或者调试不好的可以把代码贴出来问。绝望

别忘了二分查找要先排序  百度 学生成绩管理 C代码

csdn很多这个代码，搜一搜就能找到


Question: C语言数数问题！

引用 4 楼 自信男孩 的回复:[quote=引用 2 楼 gh_99 的回复:] 代码要自己花时间去学习。  #include<stdio.h> #include<stdlib.h> #include<time.h> int x,y; int main() { int guess(int num),a,b; //修改处  printf("请甲开始猜数"); guess (1); printf("甲猜了%d次",x); //修改处 printf("请乙开始猜数"); guess (2); printf("乙猜了%d次",y); //修改处 if(a>b) printf("乙获胜"); else printf("甲获胜"); return 0; } int guess(int num) { int magic,i,n; i=0; srand(time(0)); magic=rand()%10+1; while(1) { scanf("%d",&n); i++; if(magic==n) break; if(magic<n) printf("大了"); if(magic>n) printf("小了"); } if(num==1) //修改处 x=i; if(num==2) //修改处 y=i; return magic; }   判断最后的胜负跟a, b有关系吗？另外如果x和y相等呢[/quote] 对啊，还是你看的仔细。刚刚疏忽了。

引用 2 楼 gh_99 的回复:代码要自己花时间去学习。  #include<stdio.h> #include<stdlib.h> #include<time.h> int x,y; int main() { int guess(int num),a,b; //修改处  printf("请甲开始猜数"); guess (1); printf("甲猜了%d次",x); //修改处 printf("请乙开始猜数"); guess (2); printf("乙猜了%d次",y); //修改处 if(a>b) printf("乙获胜"); else printf("甲获胜"); return 0; } int guess(int num) { int magic,i,n; i=0; srand(time(0)); magic=rand()%10+1; while(1) { scanf("%d",&n); i++; if(magic==n) break; if(magic<n) printf("大了"); if(magic>n) printf("小了"); } if(num==1) //修改处 x=i; if(num==2) //修改处 y=i; return magic; }   判断最后的胜负跟a, b有关系吗？另外如果x和y相等呢

#include<stdio.h> #include<stdlib.h> #include<time.h>  int guess(int num); int x,y; int main() {     //int a,b;      printf("请甲开始猜数");     guess (1);     //printf("甲猜了%d次",&x);     printf("甲猜了%d次\n", x);     printf("请乙开始猜数");     guess (2);     //printf("乙猜了%d次",&y);     printf("乙猜了%d次\n", y);     //if(a>b)     if(x > y)         printf("乙获胜\n");     else if (x == y)         printf("The same times!\n");     else         printf("甲获胜\n");     return 0; } int guess(int num) {     //int magic,i,n;     int magic, i = 0,n;     srand(time(0));     magic = rand()%10+1;     while(1)     {         scanf("%d",&n);         i++;         if(magic==n)             break;         if(magic<n)             printf("大了");         if(magic>n)             printf("小了");     }     //if(num=1)     if(num==1)         x = i;     //if(num=2)     if(num==2)         y = i;     return magic; }  供参考

printf中如果输出变量的值不需要&符号，&是取变量地址的意思，把&去掉


Question: 关于头插法建立链表的问题求解答

[quote=引用 2 楼 @风轻云淡_ 的回复:谢谢老哥   struct node*creatlist(void) { 	struct node*head,*p; 	int x; 	head=(struct node*)malloc(LEN);//这里你只申请了节点空间，没有给它赋值，打印的时候却把它打印了，可不就是随机值吗 	head->next=NULL; 	scanf("%d",&x); 	while(x!=0) 	{ 		p=(struct node*)malloc(LEN); 		p->data=x; 		p->next=head->next; 		head->next=p; 		scanf("%d",&x); 	} 	return head; } //两种解决办法：第一种给它赋值即可正常打印； //第二种打印的时候跳过头结点，让它作为不存储数据的头结点(你的插入方式更适合这一种)。 //两种你随便选一种就好了 [/quote]

还有这个尾插法建立链表的 头指针的data值也是乱的 怎么解决啊

可以这样head=Null;(这个是在开始赋值的） p->next=head;然后这就是两步骤,此时的head   也就有data值 head=p;


Question: c语言新入行，不知道是一入c语言深似海，从此爱情是路人；还是从入行到放弃

c语言是编程入门必学的，深学是很有难度的。因为他不是面向对象的。如果不是特殊要求，我建议你c入门去学习c++,初学者通常是分不清语言到底有啥区别，也不知道该去学什么语言。很正常。不过你需要知道的就是，一旦你c++学的很好，你就会发现，有了c++的底子，你学其他任何语言入门只需要1天左右，但你如果你从别的语言在转到c++说实话，是很有难度的。时间久了你就会发现，有些语言是很带有一些风格的，这就好像go语言。合适的人特别合适，不合适的人用着贼难受。所以呢，如果你是新手的话，就别想别的了，c是必学的，不会指针，不懂内存就如同不会编程一样。


Question: c语言的一道题

为什么不自己写写呢，不是很难呢    #include <stdio.h> #include <string.h> #include <ctype.h>  int main() {     char str[16], num_list[16];     unsigned int num, i, j=0;      scanf("%s", str);      for (i = 0; i < strlen(str); i++)         if (isdigit(str[i]))             num_list[j++] = str[i];     num_list[j] = 0;      sscanf(num_list, "%u", &num);      printf("%u\n", num);      return 0; }  供参考

用ASCII码值能将作为字符的数字提取出来。将字符型变成整型可以用atoi()函数


Question: 高精度加法提问！

#include <stdio.h> #include <string.h> #define buffer 32767int main() { int i,len; char a[buffer]; char a1[buffer]; char b[buffer]; char b1[buffer]; gets(a); gets(b); for (i=0;i<=(int)strlen(a);i++) a1[i]=a[strlen(a)-i-1]; for (i=0;i<=(int)strlen(b);i++) b1[i]=b[strlen(b)-i-1]; if (strlen(a)<strlen(b)) { len=strlen(b)-strlen(a); for (i=strlen(a);i<=(int)strlen(a)+len;i++) a1[i]=0; for (i=0;i<=(int)strlen(b)-1;i++) b1[i]=b1[i]+a1[i]-96; for (i=0;i<=(int)strlen(b)-1;i++) if (b1[i]>10) { b1[i+1]+=b1[i]/10; b1[i]=b1[i]%10; } for (i=strlen(b1)-1;i>=0;i--) printf("%c",b1[i]+48); } else { len=strlen(a)-strlen(b); for (i=strlen(b);i<=(int)strlen(b)+len;i++) a1[i]=0; for (i=0;i<=(int)strlen(a)-1;i++) a1[i]=a1[i]+b1[i]-96; for (i=0;i<=(int)strlen(a)-1;i++) if (a1[i]>10) { a1[i+1]+=a1[i]/10; a1[i]=a1[i]%10; } for (i=strlen(a1)-1;i>=0;i--) printf("%c",a1[i]+48); } printf("\n"); return 0; } 代码就是这样，网上也有很多的c语言高精加，不想ctrl+c，同时大部分和我的思路有出入也不想多改了


Question: 求解答

引用 2 楼 @trouble is a friend(๑• . •๑ 的回复：[quote=引用 1 楼 单眼皮的小健的回复:]最后的return 0写在大括号外面了，放回去里面 我把return 0;放回去它还是报这个错[/quote]main添加返回值int

引用 1 楼 单眼皮的小健的回复:最后的return 0写在大括号外面了，放回去里面 我把return 0;放回去它还是报这个错

最后的return 0写在大括号外面了，放回去里面


Question: 小白求助

引用 7 楼 东南信风 的回复:不会，怎么结题啊？呜呜 在1楼的上面有结贴两字，别让上面答对问题的人白忙活

引用 6 楼 单眼皮的小健的回复:[quote=引用 5 楼 东南信风 的回复：][quote=引用 4 楼 单眼皮的小健的回复:]main（）后面的分号以及max（）后面的分号去掉 原来如此，谢谢大佬！[/quote]结题呀，可以赚积分[/quote] 不会，怎么结题啊？呜呜

引用 5 楼 东南信风 的回复：[quote=引用 4 楼 单眼皮的小健的回复:]main（）后面的分号以及max（）后面的分号去掉 原来如此，谢谢大佬！[/quote]结题呀，可以赚积分

引用 4 楼 单眼皮的小健的回复:main（）后面的分号以及max（）后面的分号去掉 原来如此，谢谢大佬！

main（）后面的分号以及max（）后面的分号去掉

楼上是鄙人的代码，目的是找三个数中最大的一个呜呜呜

#include <stdio.h> #include <stdlib.h> int main(); {     int a,b,c,d;     scanf("%d %d %d",&a,&b,&c);     d=max(a,b);     d=max(d,c);     printf("%d\n",d);     return 0; } int max(int x,int y); {     int z;     if(x>y)z=x;         else z=y;     return(z); }

大一第一天学c语言，老师上来就开始介绍考试机制，紧接着就让我们下载软件开始编程，完全不会啊啊啊


Question: C语言，求助！

引用 1 楼 单眼皮的小健的回复:把数组名传递给函数的时候，传递的是数组的首地址，只要有首地址，无论在哪个函数进行操作，都是对同一地址进行操作，意思都是直接操作原来的数组，因为数组地址是不变的，所以选择B，你选择A的原因我猜你认为数组传递的时候在另一个函数中开辟了新的数组，所以认为另一个函数的操作不会影响原来数组，但是事实并没有开辟新的数组 谢谢你呀，我计算机二级已经考完啦。这个问题我后来问了同学也解决了


Question: vc6.0可以运行，vs2010怎么运行不了

错误信息？？

贴出报错信息，不要养成饭来张口衣来伸手的习惯。

引用 1 楼 轻箬笠的回复:vc6的程序转高版本的vs好像没碰到没问题的。针对问题改改呗。 嗯嗯嗯，，，，，，。。

引用 3 楼 zhouqunhai的回复:错误信息？？ 解决了，谢谢          ，，，，，

引用 2 楼 @风轻云淡_的回复:贴出报错信息，不要养成饭来张口衣来伸手的习惯。 解决了，谢谢，记住了

vc6的程序转高版本的vs好像没碰到没问题的。针对问题改改呗。


Question: 提问：xcode 里没有conio.h 怎么办呢？

conio.h这个是Windows VC库中才有的接口，只有用Windows下的编译器才有的，而MACOS是Unix系统，是没有conio.h的，解决你的问题的办法，可以是切换到Windows下去写代码学习。二是找可以能代替Windows下getch功能的库函数，若只是教科书上的getch只是录入一个字符，而不是控制键符的，直接就用stdio.h中的getcher就可以了。有一个可以代替的库是 curses库。#include <curses.h>也是需要去网上下，xcode 你可以先试下，带不带这个库。

mac写C++是真的难受，还是装双系统吧

怎么下载conio。h呢

引用 1 楼 J__Max的回复:xcode不支持这个头文件，你可以自己在网上下载，再放到对应的文件夹里 网上说下了放进去 报错了

把这句注掉试试，如果不行去网上找找，我想不只你遇到了这个问题： https://bbs.codeaha.com/thread-8377-1-1.html

xcode不支持这个头文件，你可以自己在网上下载，再放到对应的文件夹里


Question: C语言小白 if问题求助

a==b==c的运算方式是先判断a==b，如果a与b相等值为1否则为0，所以表达式就变成了1==c或0==c

知道人家看不清还不补发下？什么心态？ 引用 6 楼 weixin_44705587 的回复:[quote=引用 2 楼 轻箬笠的回复:]眼瞎"党"，建议楼主下次发帖后，自己看下帖子 感谢建议第一次发帖，下次会注意哒~[/quote]

引用 2 楼 轻箬笠的回复:眼瞎"党"，建议楼主下次发帖后，自己看下帖子 感谢建议第一次发帖，下次会注意哒~

引用 4 楼 自信男孩 的回复:[quote=引用 3 楼 lin5161678 的回复:] [quote=引用 1 楼 自信男孩 的回复:] 建议把代码图片重新拍清楚了再上传，或者直接贴代码。   a == b == c在C语言不支持。建议使用&&或者||语法上这样写没什么问题 没什么不支持[/quote] 你见过if (a==b==c)的语句?[/quote]没见过不代表错了

引用 3 楼 lin5161678 的回复:[quote=引用 1 楼 自信男孩 的回复:] 建议把代码图片重新拍清楚了再上传，或者直接贴代码。   a == b == c在C语言不支持。建议使用&&或者||语法上这样写没什么问题 没什么不支持[/quote] 你见过if (a==b==c)的语句?

引用 1 楼 自信男孩 的回复:建议把代码图片重新拍清楚了再上传，或者直接贴代码。   a == b == c在C语言不支持。建议使用&&或者||语法上这样写没什么问题 没什么不支持

眼瞎"党"，建议楼主下次发帖后，自己看下帖子


Question: c语言编程   求解

#include<stdio.h> int main(){   int m,n,i;   int sum=0;    scanf("%d%d",&m,&n);   for(i=m;i<=n;++i){     if(i%3==0&&i%5==0) 		 continue; 	sum+=i;   }   printf("%d\n",sum);   return 0; }


Question: c语言编程错误出现expected;,identified or ( before void 求助大佬

这个代码是拼凑的吧，没写全。并且代码的调用也有问题。Createlist()没有返回值。并且LinkList类型里有next成员吗？  建议贴出一个完整的代码出来。

struct class 后面的大括号 要接着 ; class cc{ public：  。。。。  };


Question: 求里面结果怎么来的   18fff3c?

地址啊，你连地址都不知道的话那程序咋来的

这个是栈的地址，即num变量的地址。这个地址是一个虚拟地址，而不是实际的物理地址。


Question: 求助大神编程问题！根据以下特定输入方式对树进行层次遍历并输出奇数层结点

我自己写出来了，使用邻接表保存该树，从文件读取数据，并输出到文件上去。代码如下，供有同样问题的同志参考！ #include<stdio.h> #include<stdlib.h> #include<vector> #include<queue> using namespace std;  int level[100];           //标记每个结点所在层 char str[20];              //存储读入的一行结点 int node[20][50];         //以数字的形式存储每行的结点 int q_output[100];        //按顺序保存队列输出的结点  queue<int> Q;             //定义一个队列用于层次遍历； vector<int> edge[100];    //定义邻接表存储树的结点  int main(){ 	int len; 	int i,j,k; 	int line; 	FILE *fp1,*fp2; 	fp1=fopen("input.txt","r"); 	fp2=fopen("output.txt","w");  	if(fp1==NULL||fp2==NULL){ 		printf("cannot open file\n"); 		exit(0); 	}  	for(i=0;i<20;++i) 		for(j=0;j<50;++j) 			node[i][j]=0; 	for(i=0;i<100;++i){ 		edge[i].clear(); 		q_output[i]=0; 	}  	line=0; 	while(fgets(str,100,fp1)!=NULL){    //从input文件读入一行字符串 		k=0; 		len=strlen(str); 		for(i=0;i<len;++i){ 			if(str[i]>='A'&&str[i]<='Z') 				node[line][k++]=str[i]-'A'; 			node[line][k]=-1;          //以-1标记每行的结尾 		} 		line++; 	}   	//用node[i][j]数组保存输入的结点，i代表行从0开始，j代表每行第几个结点，j=0表示双亲结点 	level[node[0][0]]=1;                      //第一行第一个结点为根结点，在第一层 	for(i=0;i<line;++i) 		for(j=0;node[i][j]!=-1;++j){ 			if(j!=0){ 				edge[node[i][0]].push_back(node[i][j]); 				level[node[i][j]]=level[node[i][0]]+1;     //标记每个结点所在的层 			} 		} 	//用邻接表保存树 	 	Q.push(node[0][0]);                   //根结点入队 	int size=0; 	while(!Q.empty()){ 		int front=Q.front();              //取队首结点 		q_output[size++]=front;           //层次遍历的顺序将结点保存在数组q_output[]中 		Q.pop(); 		for(i=0;i<edge[front].size();++i){ 			Q.push(edge[front][i]);      //将front的孩子结点入队 		} 	} 	 	i=0; 	int flag,size_2; 	while(i<size){ 		flag=0; 		size_2=0; 		while(level[q_output[i]]%2==1&&i<size){ 				flag=1; 				k=level[q_output[i]]; 				str[size_2++]=(q_output[i]+'A'); 				++i; 		} 		if(flag==1){ 			--i; 			str[size_2]='\0'; 			fprintf(fp2,"第%d层：",k); 			for(j=0;j<size_2;++j){ 				if(j==0) 					fprintf(fp2,"%c",str[j]); 				else 					fprintf(fp2,",%c",str[j]); 			} 			char ch='\n'; 			fprintf(fp2,"%c",ch); 		} 		++i; 	} 	fclose(fp1); 	fclose(fp2); 	return 0; }


Question: 大一学生计算机小白求助

这道题可以不用while，直接判断，当然，如果你问scanf这while里面，如果你while(x)，只要你x大于0或者里面没有break，循环就不会停。

引用 2 楼 耕者走兔的回复:while（score< 0 || score >100）这句话的意思是；某位同学的成绩是 -1 才可以评级。我没见过有哪位同学会考出这样的成绩。 那个while是为了避免输入非法数据吧

楼主，score你只定义了，没初始化，随机赋值，你可以把scanf("%d",score);写在while前面，还有后面的if语句加入while内，判断条件while应该是在0到100分内，你写反了。

引用 9 楼 小学弟渣渣c的回复:执行顺序: 1.先是int score  因为score是局部变量，所以会随机赋值 2.执行printf输出 3.进行while判断，如果随机的score符合，就进循环，否则跳过while循环 4.假设进了while 会执行scanf和printf，如果输入不合格，就一直while循环 5.score输入合格，跳出循环。  修改建议:1把score改成全局变量(默认赋初值0) 2.在while之上加一个scanf，把while里的scanf放到最后 3.使用do  while循环 望采纳 多谢(o^^o)，您的回复帮助很大，谢谢耐心指导！！！

引用 4 楼 2018年6月8日的回复:正常啊,你一直输入大于100 或小于0 的数,他肯定是一直在while循环里啊,你输入999 之后打印提示信息之后,又进入了while循环啊,然后停到了scanf函数里,等待你的输入啊.    还有你这个变量score 是没有赋初值的,好像是vc它自动给你赋初值为0了,要不然变量score 是未知的数.      这道题建议用do while循环来做 多谢(o^^o)多谢

我觉得while循环里的if没必要

此楼50，可以结贴了！

当你输入的数字大小满足while循环条件，就继续执行接收字符，直到你输入1～100范围的数就会不符合while循环条件，跳出循环

写成while (1)就行了

首先判断while语句的对和错   对则执行内部语句 在执行while语句之前  score值默认为0   而0不大于100也不小于0  然后跳过while执行下面的if语句

首先执行的是printf语句，随后执行while语句(这里在进行score判断的时候，由于你并没有给score赋初始值，或许系统自动给出了初始值0，所以就自动进入了while语句)，然后执行scanf(你输入了999之后，进行if语句判断，满足条件，所以执行printf)，到此循环体执行完毕;后面的if语句仍然继续执行，只是条件不满足，不做输出

引用 2 楼 耕者走兔的回复:while（score< 0 || score >100）这句话的意思是；某位同学的成绩是 -1 才可以评级。我没见过有哪位同学会考出这样的成绩。 While循环没学好，就来嘲笑别人

楼主的代码那个score第一次进循环是随机值，建议不这样写。

可以这么写 while(scanf("%d",&score)==0||score<0||score>100){ fflush(stdin);//清除缓冲区，如果输入的不是数字会留在缓冲区，造成死循环 printf("请输入评分范围以内的成绩！\n"); }

1.score符合条件的每一次时，就会执行一次scanf。输入score后，又会重新进行一次判断是否进行循环。  2.因为执行scanf语句的时候，你给score的值不符合小于0或者大于0时就会退出while，不会造成死循环。

你这程序不用改，这就是个评分的。只是我没有看到结尾的花括号

当然不会陷入死循环，你只要输入0到100（包括0和100）,while循环就会结束，然后再参与评级。‖的意思是旁边两个逻辑表达式只要一个是真就是真。你只要使两个逻辑表达式都不为真，那么while循环就会结束

引用 4 楼 2018年6月8日 的回复:正常啊,你一直输入大于100 或小于0 的数,他肯定是一直在while循环里啊,你输入999 之后打印提示信息之后,又进入了while循环啊,然后停到了scanf函数里,等待你的输入啊.    还有你这个变量score 是没有赋初值的,好像是vc它自动给你赋初值为0了,要不然变量score 是未知的数.      这道题建议用do while循环来做 使用do while这个方法不错。局部变量不会那个编译器就给赋值0吧。

请注意，评级if嵌套不在while循环中，这个while循环就是为了避免输入0-100以外的数字


Question: 选择了软件工程的大一新生，已经崩溃了，前辈们求指点迷津！

我也是今年刚读完大一的学生，我们也是上学期学的c语言，我认为你如果不喜欢就应该转专业，如果能坚持学就多练，书上的概念多看看，老师给的作业多写两遍，多改改，多写写，肯定能好的，祝你学习愉快！

走非技术嘛 产品呀啥的 不要求你有多强的专业知识

引用 126 楼 A Moment To Remember 的回复：我现在自学C语言，对计算机编程了解不多，但是用自己编出小程序还是很开心的，兴趣是最好的老师

引用 125 楼 stone dream 的回复：等你写出的代码，能够带来成就感的时候，你就会慢慢的喜欢上代码了，我也是计算机入门新生，一起加油！我已经属于漏油那一类人了

引用 123 楼 qq_42225192 的回复：首先要学会完成，然后再完美哎

引用 120 楼 smallwhite0_0 的回复：没事的，多练习一下，你就当他是一种语言，久了你会觉得它比英语友善我呸……英语更简单吧

引用 119 楼 qq_18820125 的回复：建议转机械，简单好学，不打代码，生活安逸，好处非常之多。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。嗯，总而言之，适合你！ 不说了，我去植点儿头发，最近风大，头冷。真的吗？

首先要学会完成，然后再完美

引用 111 楼 user-9 的回复：学弟，想想这个专业以后能挣好多钱，高兴的晚上也睡不着觉啊。……你来搞笑的吧

引用 112 楼 smallwhite0_0 的回复：我也是软工大一学生，一开始也觉得有点乏味，但之后觉得代码还是挺有意思的，相当于一种能和机器沟通的语言，到后面学到java，web做小软件，网页会发现真的挺有趣的，而且书本上都会有代码实例，可以边打边理解，实在不行可以在网上找一些系列视频观看，有些老师会引用现实的例子。（同是被代码折磨的小白的个人观点）要死了，快点留个联系方式教我啊……

引用 109 楼 qq_44672327 的回复：啊我是计算机科学与技术专业的，你可以去洛谷刷刷题，提升很快的洛谷是什么，我一脸懵啊

没事的，多练习一下，你就当他是一种语言，久了你会觉得它比英语友善

看着楼上 大一水平都这么高 我很惭愧 好像大一的时候就是简单的C程序 排序或者求最大最小值？ 下学期写简单的学生管理系统 很low

引用 117 楼 smallwhite0_0 的回复：我只是在网找视频看的，边看边打，因为觉得编写排序，求最值真的有点无聊，而且参加什么竞赛多是一道题没做出，只是对代码其他用处感点兴趣你都去竞赛了，我还在迷茫

学弟，想想这个专业以后能挣好多钱，高兴的晚上也睡不着觉啊。


Question: 本人萌新才开始在网上做题heapbufferflow

strsSize == 1 的时候，也就是只有一个字符串，会不会无限循环？      while(detect == 1)     {         c = strs[0][length];         for(i=1;i<numofstrs;i++)    // <== numofstrs是1，循环不执行         {             if(strs[i][length]!=c)                 detect = 0;         }         if(detect == 1)  // <== detect始终为1             length++;      }

建议贴出完整的代码，主要是调用longestCommonPrefix的操作，还有就是实参的定义。

每个strs[i]长度都是strsSize么？应该用strlen吧


Question: 救助

初级，双重for循环就搞定了 中级，先排序再循环遍历


Question: （C语言）？

s是个字符串，字符串用0结尾，这是在把i遍历到s结尾的位置

s应该是个字符串数组，然后一直循环到这个字符串结束

引用 3 楼 流泪熊猫头 的回复：从数组第一个元素开始遍历，遇到值为0则退出循环+1

每次执行循环体前都要判断一下s[i]是否为0.如果是0，就退出循环，否则执行循环体，执行完循环体将i++，然后在判断s[i]是否为0，因为i已经加1，所以第二次的判断是判断下一个元素是否等于0了。

从数组第一个元素开始遍历，遇到值为0则退出循环

引用 1 楼 user-6的回复:s应该是个数组，s的第i个数据为0则继续自增 打错字了，应该是不等于0

s应该是个数组，s的第i个数据为0则继续自增


Question: 小生大一，各位前辈指教。

引用 1 楼 @风轻云淡_的回复:给你写了个小demo（简单的测了下自己需要花费多久），简单的测了下功能，可能还会存在问题，注释写的很详细，希望会对你有所帮助，提供思路为主： #include <stdio.h> #include <stdio.h>  int main(int argc, char *argv[]) {  	char old_buff[256] = {0};//原字符串 	char new_buff[256] = {0};//替换后字符串 	char old_str[32] = {0};//被替换子串 	char new_str[32] = {0};//替换子串 	int i = 0;//控制原字符串循环 	int j = 0;//控制局部的子串循环 	int k = 0;//控制局部的原字符串循环 	int l = 0;//控制替换子串追加到新总串 	int len = 0;//旧子字符串长度，用于跳过替换字符串 	int newlen = 0;//控制新的字符串长度 	gets(old_buff); 	gets(old_str); 	gets(new_str);  	//TODO:有需要可以对所有输入字符串做长度检测  	for(i=0;old_str[i] != '\0';++i) 	{ 		len++; 	}  	//思路就是循环原字符串，一旦匹配到子串首部，进入局部循环，查看是否完整匹配， 	//如果是，进行局部替换，不是则跳出局部循环，继续进行循环原字符串  	for(i=0,j=0;old_buff[i] != '\0';) 	{ 		if(old_buff[i] == old_str[j]) 		{ 			for(k=i;k<i+len;++k,++j) 			{ 				if(old_buff[k] != old_str[j]) 					break; 			} 			j=0;//不要忘了初始化旧字符串索引位置 			if(k >= i+len) 			{ 				l=0; 				while(new_str[l] != '\0') 				{ 					new_buff[newlen] = new_str[l]; 					++l; 					++newlen; 				} 				i = i+len; 				continue; 			} 		} 		new_buff[newlen] = old_buff[i]; 		++i; 		++newlen; 	}  //	new_buff[newlen] = '\0';  //此处最好加一个字符串结束符，因为我定义的时候已经初始化，所以此处可以不加  	puts(old_buff); 	puts(old_str); 	puts(new_buff); 	return 0; }   万分谢谢，我琢磨琢磨。


Question: 求助论坛各位大佬我正在用VS2017以MFC为基础来做一个能支持整形浮点型和复数的四则运算的简易计算器，目前我就只学了C语言，我做好了界面然后就不知道该怎么办了

建议你还是找些MFC编程的书籍先看看，例如《Visual C++MFC编程实例》。


Question: C语言  关于全局变量数组的使用

我把这个写在一个.c文件中然后在其.h中用extern申明了，随后的文件直接调用了这个.h文件。刚刚编译了一下，可以了。我把const这个改成define了

引用 2 楼 m0_37967554 的回复:如果只是在另外一个用，是可以的，但是文件太多，就报错了 如果文件太多，要么就没个用到的文件都引入。否则就是考虑修改函数接口，通过参数传递进去，这样不用每个文件都extern，可以大大减少extern的个数

如果只是在另外一个用，是可以的，但是文件太多，就报错了

在其他的源文件，加上extern一下就可以了。 比如int array0[N]，在其他的源文件里定义为extern int array0[N];


Question: 请大佬救急。谢谢啦

大佬们都没空


Question: 请问我这个编程的问题出在哪里？我是小白（刚接触C语言）

我的建议 学冒泡算法的话 1.为什么要用char，不如改成int 2.楼上说的对，第一个for循环的第三个条件应该是j++

引用 4 楼 Xdd2333333的回复:为什么我自己运行你们帮我修改后的这个程序会出现这种问题？？？能否有大佬教教我 我用的是Microsoft visual C++2010学习版 你一次输入一个数据 ，而你的输入方式已经超出了数组所能存的数据

引用 5 楼 Xdd2333333 的回复:大佬能看一下我发在四楼的问题吗 10其实是两个字符，并且空格也是属于字符，你的数组越界了。 建议你输入的时候可以考虑这样：  9876543210  然后再试一下。  否则你的代码需要再次修改。

大佬能看一下我发在四楼的问题吗

#include<stdio.h> #include<stdlib.h>  void f1(char s[]);  int main() {     char a[10];     printf("请输入10个数字：");     gets(a);     f1(a);     puts(a);     system("puase");      return 0; } void f1(char s[]) {     int i,j,t;     //for(j=0;j<9;i++)     for(j=0;j<9;j++)         for(i=0;i<9-j;i++)             //if (a[i]>a[i+1])             if (s[i]>s[i+1])             {                 t=s[i];                 s[i]=s[i+1];                 s[i+1]=t;             } } 供参考； 建议对比一下找到问题；

第一个for循环第三个条件

顶楼上的两位。


Question: 排序

谢谢谢谢

感谢大神！！！！！！

引用 2 楼 qq_44690355的回复:谢谢谢谢 不用谢。。。。。。。。。

#include <stdio.h>  void bubble_sort(int *arr, int len);  int main(void) {     int arry[4];//定义数组，存放四位整数     int i, j;      printf("请输入四位整数：");     for(i=0; i<4; i++)     {         scanf("%d", &arry[i]);     }     bubble_sort(arry, 4);      printf("从小到大输出：\n");     for(i=0; i<4; i++)     {         printf("%d ",arry[i]);     } }   void bubble_sort(int *arr, int len) {     int i, j, tmp;      for (i = 0; i < len; i++){         for(j = 0; j < len - i - 1; j++){             if(arr[j] > arr[j+1]){                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             }         }     } }  供参考！

#include <stdio.h>  void main(void) { 	long int arry[4];//定义数组，存放四位整数  	int i, j;  	printf("请输入四位整数："); 	for(i=0; i<4; i++) 	{ 		scanf("%ld",&arry[i]); 	} 	//冒泡循环  	for(i=0; i<4; i++){ 		for(j=0; j<3-i; j++){ 			if(arry[j]>arry[j+1]){ 				long int temp = arry[j]; 				arry[j] = arry[j+1]; 				arry[j+1] = temp;  			} 		}  	}  	printf("从小到大输出：\n"); 	for(i=0; i<4; i++) 	{ 		printf("%ld ",arry[i]); 	}	 }


Question: 求助，程序纠错，关于函数参数是指针的问题

楼上的两种方式都是可以的。要么在main中定义int变量，然后传地址到func1中，要么就是修改func1中c的类型，传2重指针到func1中，然后在func1中malloc申请空间，这样main中就可以使用指针变量c了。  如果不对func1中的形参做任何修改，那只能用1楼的操作：main中定义普通变量，传递地址到func1中。

#include<stdio.h> #include<stdlib.h>  void func1(int *a, int *b, int **c) {//将*c改为**c 	*c = (int *)malloc(sizeof(int));//将c改为*c 	if (c == NULL) 		exit(1); 	scanf("%d", &(*a));//将&a改为&(*a) 	if (*a == *b) 		**c = (*a)*(*b);//将*c改为**c 	else 		**c = (*a) + (*b);//将*c改为**c }   int main() {	 	int a, *b, *c; 	c = NULL; 	int t = 5; 	b = &t; 	func1(&a, b, &c);//将c改为&c 	printf("结果是%d\n", *c); 	return 0; } 运行结果如下  关于指针的指针，请参考《C++中函数参数类型为指针的指针》 希望能够帮到你

#include<stdio.h> #include<stdlib.h>  void func1(int *a,int *b,int *c){     if(c==NULL)         exit(1);     scanf("%d",a);     if(*a==*b)         *c=(*a)*(*b);     else         *c=(*a)+(*b); }  int main(){     int a,*b,c;     int t=5;     b=&t;     func1(&a,b,&c);     printf("%d\n", c);     return 0; }


Question: 结构体指针作为函数参数

#include<stdio.h> #include<stdlib.h>  struct iphonecard // {     int id;     int code[11]; };  int sort(struct iphonecard *card, int key) //枚举查找 key为要查的数字 {     int index;     for(index=0;index <= 10;index++)     {         if(card->code[index] == key)             return index;     }     if(index == 11)         return -1; } int main() {     int key,n;     struct iphonecard *card1;     card1 = (struct iphonecard *)malloc(sizeof(struct iphonecard));     //scanf("%d\n",&key);        scanf("%d", &key);    //去掉\n     for(n=0;n <= 10;n++)         scanf("%d",&card1->code[n]);     n = sort(card1,key);     printf("%d",n);     return 0; } 供参考

引用 7 楼 KarivV 的回复:int sort(struct iphonecard *card, int key) 这句key前面少了参数类型int 所以在定义的时候无法识别key的参数类型  在传参的时候你传入了一个card 一个key显然 不匹配定义时的参数 另外iphonecard前面的struct 都是没必要的...  scanf("%d\n",&key);这个\n是个啥意思...如果你想吸收回车 可以  scanf("%d%*c",&key);这么写或者rewind(stdin); 另外你的sort在index==11这个条件不满足的时候没有返回值 应该在后面加一个return -2;之类的 好的 真的很谢谢您

引用 3 楼 棉猴 的回复:对于函数参数是结构体指针的情况，请参考《C++中函数参数类型为指针的指针》 希望能够帮到你 好的 谢谢您 这篇帖子里也全都是指针作为单一参数传入函数的

引用 2 楼 自信男孩 的回复:建议贴出你的代码，以便帮你定位到问题。 谢谢您的建议 我的代码如上 谢谢

#include<stdio.h> #include<stdlib.h> struct iphonecard //  {   int id;   int code[11]; }; int sort(struct iphonecard *card,key) //枚举查找 key为要查的数字 {   int index;   for(index=0;index <= 10;index++)   { 	if(card->code[index] == key)         return index;   }   if(index == 11)     return -1; } int main() {   int key,n;   struct iphonecard *card1;   card1 = (struct iphonecard *)malloc(sizeof(struct iphonecard));    scanf("%d\n",&key);   for(n=0;n <= 10;n++)      scanf("%d",&card1->code[n]);   n = sort(card1,key);   printf("%d",n);   return 0; } 报错信息如下：  error C2061: syntax error : identifier 'key' error C2660：function does not take 2 parameters 谢谢大家！

建议贴出你的代码，以便帮你定位到问题。

引用 10 楼 自信男孩 的回复:查找的函数参数（形参）没有定义类型。既然函数的功能是查找，使用sort作为函数名不能做到见名知意，建议定义为search或find等等 好的 谢谢您

结构体指针作为参数和void类型还是其他类型返回值没有关系，这些都是按照程序设计需要，至于结构体指针和其他变量都可以作为形参！


Question: C语言程序中的“函数参数校验”是什么意思呢？

嗯嗯，谢谢您的建议

引用 2 楼 weixin_37614450 的回复:[quote=引用 1 楼 自信男孩 的回复：]就是对传进来的实参做检查。比如，  char *mystrcpy(char *dst, char *src)函数实现时，可以判断一下dst或src是否为NULL等等。谢谢您的解答，那也就是说参数校验是一种非必须的操作吧？[/quote] 对于参数判断是需要的，也建议做这项工作

引用 1 楼 自信男孩 的回复：就是对传进来的实参做检查。比如，  char *mystrcpy(char *dst, char *src)函数实现时，可以判断一下dst或src是否为NULL等等。谢谢您的解答，那也就是说参数校验是一种非必须的操作吧？

引用 5 楼 user-2 的回复：if(p==NULL) xxx 判断参数谢谢

if(p==NULL) xxx 判断参数


Question: 三位数组

汇编层次就只有一维， 多维数组那是编译器·干的活， 若是你计算强大，直接用 byte [ ]  也可以，自己计算偏移。

二维数组往上就是多维数组了，多维数组尽量转换成二维做出来。

内存是线性的，即一维，   int a[100] ,   把内存看作是 100米长的线 int b[5][20],  把这 100米线剪成 5段，每段是 20米长  int c[5][2][10], 再把每段对半分。  所以同样一块内存，你可以当作 n 维， 就看你的想象力了。

内存是线性的，即一维，    三维数组也是成线性排列。以二维数组为例，线性排列，即第一行排完排第二行，依次类推。

了解下堆栈？

完全看不清3333

内存是线性的，所以，三维数组也是成线性排列。以二维数组为例，线性排列，即第一行排完排第二行，依次类推。

您这图，真特么有意思。


Question: C语言新手关于scanf获取输入字符串的一个小问题

text本来就是一个地址，不需要用&取地址的

谢谢您的提示，我会继续去了解一下stdin缓冲区的知识

因为fgh不能和%d匹配。scanf是格式化输入，因此需要和对应%d, %s等等匹配才可以。

请检查scanf的返回值。

你可以在每个sacnf语句后printf下就明白了

实际上执行了，后面输出的FGH表明第一次输入的数据asd fgh分别落到了三个sacnf语句中，asd落入到scanf("%s", &text)， scanf("%d",&num)寻找剩余数据中的合法数值（没找到，num仍保持原值，这里为1），后面fgh落入到第二个scanf("%s", &text)语句


Question: 如何更改这些warning，急！新手找资料找了2天了弄不出来。急求！！

for (i=0...) {      for (j = 0; j<strlen(str[i]); j++)     {          .....str[i] 改成 str[i][j]     } }  另外，不要用以下语法 uppercase = str[i][j] -= 32; 这个uppercase好像没用，意义只是返回最后一个转换大小写的字符  而且，你这个函数是转换大小写，不是转成大写吧

str[i]是一个char *类型，但是'a'是一个char或int类型。因此类型不匹配导致warning。 建议提供调用该函数的部分，尤其是实参的类型，以便更好的给你定位问题。

*str[i] >= 'A'

str[i]是个指针， 参数改成 char*  str试试

查了很多是说没有声明，还有这个无法比较我是否应该将比较对象都改成字符串数组，然后用strcmp比较？


Question: C语言新手关于“字符串位于内存的文字常量区”的一点疑惑

不要纠结各种常量了，这个世界上唯一不变的就是变化。用API WriteProcessMemory还能修改正运行的其它进程的内存里面的所谓常量呢！

引用 23 楼 zhao_biaowei 的回复:个人理解，仅供参考 char * str = "hello world!"; //“hello world!"字符串存放在文字常量区，该区域是只读的。 char * array[20] = "code change the world!"; "code change the world!"字符串存放在栈区，可读写。错的 "hello world!" 和 "code change the world!" 都是 文字常量区

引用 19 楼 m0_37198241 的回复：有C语言的编程环境吗？要是有可以调试看效果。谢谢您的建议，我回去尝试一下

引用 17 楼 棉猴 的回复：char* p = "12345"; 	p[0] = 'a';   char ch[10] = { 0 }; 	strncpy_s(ch, p, 10); 	ch[0] = 'a'; 谢谢您的图解

感觉你买了盗版书   退掉吧

有C语言的编程环境吗？要是有可以调试看效果。

字符串由于是字面量，翻译成机器码仍然不改变，所以它可能就在代码区，即代码拷贝到内存后的地方，代码区的内容不允许改变（虽然不知道汇编如何做到改变自己的）

引用 14 楼 屈忘生 的回复：书上的这句话其实有点误导新人的意思，他其实想表达的是字符串常量和字符串数组的区别。不仅仅是C语言，任何一门计算机语言，常量都是有存储空间且不能修改的，能修改的都叫变量而不是常量了。所以楼主不要瞎琢磨这句话了，你要修改一个字符串的内容，比如你要把“bao”修改成“cao”，直接按照你理解的方式:char *a = “bao”；a[0] = 'c'；在这里a是变量，可以修改，'bao'是常量，不能修改。谢谢

引用 12 楼 小荣－QUAN 的回复：对的，存储的区域不一样您赞同的是哪个观点？

引用 14 楼 屈忘生的回复:书上的这句话其实有点误导新人的意思，他其实想表达的是字符串常量和字符串数组的区别。不仅仅是C语言，任何一门计算机语言，常量都是有存储空间且不能修改的，能修改的都叫变量而不是常量了。所以楼主不要瞎琢磨这句话了，你要修改一个字符串的内容，比如你要把“bao”修改成“cao”，直接按照你理解的方式:char *a = “bao”；a[0] = 'c'；在这里a是变量，可以修改，'bao'是常量，不能修改。 常量 变量，这解释直观

对的，存储的区域不一样

引用 8 楼 赵4老师 的回复：#pragma comment(linker,"/SECTION:.rdata,RW") //加这句可以让常量区可写，后果自负！ 666

引用 7 楼 耕者走兔 的回复："字符串"在c语言中被当做“值”来看待。而“值”是不能被修改的。（与存储位置无关）  变量就是保存这些值的，以方便对值进行替代，用新值取代源值。（源值还在，这是你看不到了）  语言是表达思想的，不是技术规范。如果用技术规范来解释语言，无异于痴人说梦。您好，谢谢您的解答。那如果我的变量改了很多次，那中间的那些修改结果都会保留吗？还是只保留最早的源值？

引用 6 楼 自信男孩 的回复：可以举个例子来说明： char *str = "hello world"; 即不能通过str对字符串"hello world"进行写操作，因为"hello world"是字符串常量，存放在只读数据段，因此不能对其写操作，如果要修改"hello world"中所有小写'o'改成大写'O'，就需要现将其拷贝到一个字符数组里，比如char dst[32];然后在进行修改。字符数组是可读可写的。谢谢

引用 1 楼 qwh0710 的回复:文字常量区  是改不了的，用的是const修饰的。和const 没什么关系 const 从语法层面就不允许修改了 而字符串字面量语法层面 最多是警告 修改字符串字面量属于未定义行为 有的运行环境允许修改  有的运行环境不允许修改


Question: strcpy函数的自实现，gcc编译，到while时发生段错误，我哪里写错了吗，大家有看出问题吗？

字符串字面值不能作为dest对象吧。

引用 13 楼 Drowning soul 的回复:[quote=引用 12 楼 自信男孩 的回复：][quote=引用 11 楼 Drowning soul 的回复:] 测试部分，  定义数组char str_Dest[] = "ii";没有问题的，结果  但用指针是这样的， 把你的代码都贴出来，主要是main函数里调用的内容。[/quote]贴完了啊，{}这对括号不用贴了吧[/quote] 你的代码里str_dest是一个指针，指向的是只读的字符串，所以会出现段错误。另外，如果用数组，也要考虑目的字符数组的长度是否大于源串的长度。

引用 13 楼 Drowning soul的回复:[quote=引用 12 楼 自信男孩 的回复：][quote=引用 11 楼 Drowning soul 的回复:] 测试部分，  定义数组char str_Dest[] = "ii";没有问题的，结果  但用指针是这样的， 把你的代码都贴出来，主要是main函数里调用的内容。[/quote]贴完了啊，{}这对括号不用贴了吧[/quote] 1、char型指针不会在结尾加一个'0'字符的，所以调用你的strcpy，那个while循环永远不会结束。

引用 12 楼 自信男孩 的回复：[quote=引用 11 楼 Drowning soul 的回复:] 测试部分，  定义数组char str_Dest[] = "ii";没有问题的，结果  但用指针是这样的， 把你的代码都贴出来，主要是main函数里调用的内容。[/quote]贴完了啊，{}这对括号不用贴了吧

引用 11 楼 Drowning soul 的回复:测试部分，  定义数组char str_Dest[] = "ii";没有问题的，结果  但用指针是这样的， 把你的代码都贴出来，主要是main函数里调用的内容。

对啊，还是发一个测试代码，才好找原因，不然只是猜测。 话说论坛支持呼叫大神吗？比如@赵4老师

引用 3 楼 自信男孩 的回复：为什么要判断strDest的，另外，strcpy是不关系dest串是否空间足够，这个是需要调用者注意的，而不应该在strcpy中去检查。  如果strcpy的两个实参是这样的：  char dest[10], src[] = "helloworld";  mystrcpy(dest, src); 那么这个函数就不能正常运行了，因为dest是一个数组，元素都是随机值，所以无法判断是不是为'\0'。  while(*strSrc != '\0') { *strDest++ = *strSrc++; } /* if(*strDest == '\0') { printf("strDest空间不足！！\n"); return NULL; } */  改一下如果传数组名的话，会提示类型不兼容

如果传数组名的话，会提示类型不兼容

strDest或strSrc结尾不是'\0'一定会溢出。 另外判断空间不足，还要额外判断*strSrc != '\0'

引用 6 楼 Jason_1566 的回复:[quote=引用 2 楼 user-5 的回复：]while(*strDest != '\0' && *strSrc != '\0') 逻辑上 不用判断 *strDest 是不是字符串结尾  另外你的问题看起来和这段代码没关系 主要原因是你调用这个函数的时候写错  你怎么调用这个函数 代码贴出来调用这边是这样的，char *dest = “ii”; char *src = “avid”; dest = strcpy(dest, src);    这样有两个问题，第一dest不能定义为指针类型，会报类型不兼容的错，只能定义为数组，不知道为什么？第二是楼上我说的那个类型不兼容是因为我改成数组后下面接strcpy()返回值，换一个char*的变量接就行了。所以现在还有不明白是第一个。？[/quote] 不应该提示类型不匹配的问题，因为实参是数组，但是形参是指针，况且，你传的是数组名，又不是数组元素，你该不会传的是数组元素吧。  建议把你的测试用例发一下，看看是什么原因提示类型不兼容

引用 4 楼 Jason_1566 的回复:如果传数组名的话，会提示类型不兼容 贴出告警或错误信息看一下

引用 6 楼 Jason_1566 的回复:[quote=引用 2 楼 user-5 的回复：]while(*strDest != '\0' && *strSrc != '\0') 逻辑上 不用判断 *strDest 是不是字符串结尾  另外你的问题看起来和这段代码没关系 主要原因是你调用这个函数的时候写错  你怎么调用这个函数 代码贴出来调用这边是这样的，char *dest = “ii”; char *src = “avid”; dest = strcpy(dest, src);    这样有两个问题，第一dest不能定义为指针类型，会报类型不兼容的错，只能定义为数组，不知道为什么？第二是楼上我说的那个类型不兼容是因为我改成数组后下面接strcpy()返回值，换一个char*的变量接就行了。所以现在还有不明白是第一个。？[/quote] "ii"是字符串常量 你的函数会修改dest指向的数据 常量不能修改所以错了  你所谓的 不能定义为指针类型是怎么回事 你怎么定义 报告什么错误  都截图贴出来看看

引用 2 楼 user-5 的回复：while(*strDest != '\0' && *strSrc != '\0') 逻辑上 不用判断 *strDest 是不是字符串结尾  另外你的问题看起来和这段代码没关系 主要原因是你调用这个函数的时候写错  你怎么调用这个函数 代码贴出来调用这边是这样的，char *dest = “ii”; char *src = “avid”; dest = strcpy(dest, src);    这样有两个问题，第一dest不能定义为指针类型，会报类型不兼容的错，只能定义为数组，不知道为什么？第二是楼上我说的那个类型不兼容是因为我改成数组后下面接strcpy()返回值，换一个char*的变量接就行了。所以现在还有不明白是第一个。？


Question: 求助:c语言字符串问题

因为fir和sec都是指针，而指向的字符串都是只读的，而mystrcat是对一个字符串进行写，所以不行。而改成数组是可以出结果，是因为字符数组是可读可写的。但是你的变成数组的代码也是有问题，因为会导致数组越界，所以输出正常结果不等于一定是正确的，越界的访问是未定义的。

char *fir= "abc";     char *sec= "123"; 这种情况下，指针指向的内容是一个字符串常量，常量是不允许被修改的，所以不可以通过这个指针对字符串进行修改的操作； 即 : *(fir + i) = *（sec+i）; 是非法的； 你程序中的   *s++ = *t++  此时的模式就是   字符常量=字符常量       char fir[]= "abc";     char sec[]= "123"; 而这个情况下，数组的每一个元素表示变量，变量允许被改动，所以可以对其进行修改操作 即：*（fir+i）=*(sec+i); 是合法的； 如果满意请给个赞哦，不懂的地方可以继续问


Question: 请教大家 C 语言全局变量赋值编译报错 问题---是不是不能在函数体外赋值

引用 6 楼 lin5161678 的回复:[quote=引用 4 楼 耕者走兔 的回复:] 1）你使用的是全局变量，这种变量是不允许初始化。 2）你的赋值方法是被禁止的。（不能被连接器识别和使用）  你可以这样做； static char×  str[3]={"aaaa","bbbbbb","cccccccc"};  但变量（str）只在该文件中有效，不能在该文件以外地方使用。全局变量当然可以初始化 而且有默认初始化 为什么会说不能初始化 不是赋值方法禁止 禁止的是语句 C语言 语句只能写在函数里面 不能写在函数外面[/quote] 我表达的意思和你完全一致，但你的表达比我清晰，谢谢。 1）具有外部链接属性变量是不能显示初始化（即程序员指定初始化） 2）文件中不能出现语句。（变量定义除外）

引用 4 楼 耕者走兔 的回复:1）你使用的是全局变量，这种变量是不允许初始化。 2）你的赋值方法是被禁止的。（不能被连接器识别和使用）  你可以这样做； static char×  str[3]={"aaaa","bbbbbb","cccccccc"};  但变量（str）只在该文件中有效，不能在该文件以外地方使用。全局变量当然可以初始化 而且有默认初始化 为什么会说不能初始化 不是赋值方法禁止 禁止的是语句 C语言 语句只能写在函数里面 不能写在函数外面

引用 4 楼 耕者走兔 的回复:1）你使用的是全局变量，这种变量是不允许初始化。 2）你的赋值方法是被禁止的。（不能被连接器识别和使用）  你可以这样做； static char×  str[3]={"aaaa","bbbbbb","cccccccc"};  但变量（str）只在该文件中有效，不能在该文件以外地方使用。  引用 4 楼 耕者走兔 的回复:1）你使用的是全局变量，这种变量是不允许初始化。 2）你的赋值方法是被禁止的。（不能被连接器识别和使用）  你可以这样做； static char×  str[3]={"aaaa","bbbbbb","cccccccc"};  但变量（str）只在该文件中有效，不能在该文件以外地方使用。 谢谢 ！我试试。

全局不能写语句  所以 赋值语句全错     str[0] ="hello";     str[1] ="do";     str[2] ="learn"; 只能写一些声明 定义之类的东西

赋值需要放在函数内，因为代码运行是以函数为主的。

非定义代码要写在函数中。


Question: 用c和c++开发的五子棋程序，棋力很强，欢迎测试

大家也可以到GitHub上关注我们的这个小项目 https://github.com/alien-wxr/SunGomoku

测试通不过，在window7下打不开。显然没有说明运行环境以及对于环境没有做到很好的兼容，建议先解决这个问题，在重新发布一个版本。  如果代码不保密，建议上传源码

厉害

的确疏忽了，目前版本只能在win10环境下运行。我本人只负责引擎部分的开发，所以暂时重写上传了所有的源代码和整个工程文件。以下是下载地址：https://download.csdn.net/download/weixin_41743837/10968389

求各位下载测试给出意见~


Question: 结构体指针 疑问

C语言中 静态存储类型(包括外部变量 static局部变量) 要用编译期常量初始化 malloc 是运行期才能得到数据  所以报错了  C++没这限制


Question: 如何将字符串类型转换为openssl的RSA结构

无非就是自定义的结构体，楼主已经找到了方法，openssl 中晚仔细看下几个大结构，尤其bio 基本到处都在用

引用 4 楼 李希金 的回复:最后怎么解决的呢?我也碰到了同样的问题，对方提供的私钥是一个字符串，但是到处都找不到转成pem秘钥文件的方法（c语言实现），求指教，多谢！ 你可以使用PEM_write_bio_RSAPrivateKey试试，具体用法你需要自己看源码

引用 2 楼 niiiloc 的回复:typedef struct RSAPrivateKeyStr 	{ 	void *reserved; 	Item version; 	Item modulus; 	Item publicExponent; 	Item privateExponent; 	Item prime[2]; 	Item exponent[2]; 	Item coefficient; 	} RSAPrivateKey;  建议网上下一份openssl开源代码瞅瞅就好了 虽然我后来已经找到了，但是还是非常感谢[img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/13.gif[/img] ///1.新建BIO对象         bio = BIO_new_mem_buf(pubKey, strlen(pubKey));         if (bio == NULL) {             return iRet;         }         ///从BIO中获取公钥         if ((RSAPubKey = PEM_read_bio_RSAPublicKey(bio, NULL, NULL, NULL)) == NULL) {             BIO_free(bio);             return iRet;         }         BIO_free(bio);

你是要这个？


Question: MSYS2编译iconv-1.15，printf的中文不能显示，但fputs的中文显示

估计是-fexec-charset参数没加

代码的编码也很重要。我以前遇到过，搞死了。后来，每次懒得分析，就用记事本把代码另存为ansi或者utf8，此外控制台的代码页也要匹配。win下，cmd和bash默认是不同的。总之疯狂的组合，就蒙对了。

引用 1 楼 老马何以识途 的回复:不瞭解，猜測一下，待其他高人來討論。 fprintf是基礎函數，編寫這個函數時還沒有做字符集兼容的必要。而fputs則考慮了不同字符集這個因素，因此可能有做處理。 我觉得可能就是你说的原因。 只是按说不应该有这种bug，所以有可能是我编译环境、参数忽略了什么？ 希望能找到编译过这个软件的人核实下，也希望更多的大神指导一下！先谢了！

有没有可能找到printf和fputs的源码看看？

有没有人编译过iconv，汉化正常吗


Question: make编译busybox出现如下错误，求大神解答。

看起来你没有内核头文件。 这些定义在linux / capability.h中定义，看起来像：  #define _LINUX_CAPABILITY_VERSION_1 0x19980330 #define _LINUX_CAPABILITY_U32S_1 1  #define _LINUX_CAPABILITY_VERSION_2 0x20071026 / *已弃用 - 使用v3 * / #define _LINUX_CAPABILITY_U32S_2 2  #define _LINUX_CAPABILITY_VERSION_3 0x20080522 #define _LINUX_CAPABILITY_U32S_3 2  如果您没有内核头文件，可以使用“make menuconfig”禁用“Support capabilities”，错误将消失。


Question: 求助：请问是否有现成的用整型来表示浮点型的类？

生成x64 release就应该不慢了。

这个还挺难的，自己实现的话效率比语言自带的很低不少

可以参考下float和double的实现，就是用整数来表示指数位和底数位的，自己使用int可以合理分配，如果但是不知道你的7位小数，前面还有没有整数，如果还有怕是int长度的整数满足不了你的要求


Question: 关于C语言字符串常量长度是否包含\0的疑惑

c与指针    P175  字符串长度

sizeof strlen

引用 12 楼 柏鑫 的回复：不用纠结 面试的时候遇到了说出自己的想法就行了。字符串后面是有个\0的，只是strlen会忽略\0，计算内存大小sizeof()并不会谢谢，您说的很对，我很认同您的解释。我现在理解的是：strlen是从字符串内容的角度说的，而sizeof是从字符串存储的角度说的

引用 11 楼 耕者走兔 的回复：第一个问题是；字符串是以第一个空字符结束的字符序列，并且包含该空字符。 第二个问题是；字符串长度是，第一个空字符前面的字符个数。 谢谢，您的解释很清晰

strlen及sizeof是不同的。

是否含有，写个demo测试一下就知道了

说法不一样，字符串长度和内存的大小 用strlen得到的字符串的长度，用sizeof得到的是内存的大小

引用 3 楼 或✘许✔吧 的回复：字符串保存在数组里面的话，后面自动加'\0' 从技术角度看，字符串常量也相当于字符数组。只要是字符数组后面一定有'\0' 而书上说的可能是说“hello girl”的长度为10。可能就是想告诉读者空格也算一个字符并没有考虑到存储的时候的实际长度 其实这个不用太纠结与书上的，问字符数组长度，就加一我明白您的意思了，谢谢

引用 1 楼 自信男孩 的回复："A"字符串的长度是1，如果是char str[] = "A";那么数组长度是2.谢谢

引用 5 楼 lin5161678 的回复：[quote=引用 4 楼 niiiloc 的回复:] C99标准的规定，'a'叫做整型字符常量(integer character constant)，被看成是int型，所以在32位机器上占4字节。 ISO C++标准规定，'a'叫做字符字面量(character literal)，被看成是char型，所以占1字节。  楼主你可以测试下，C语言中sizeof('A')确实是4你看错问题了 答主的疑问和 'A' 没什么关系 问的是 "A"[/quote]谢谢

引用 4 楼 niiiloc 的回复:C99标准的规定，'a'叫做整型字符常量(integer character constant)，被看成是int型，所以在32位机器上占4字节。 ISO C++标准规定，'a'叫做字符字面量(character literal)，被看成是char型，所以占1字节。  楼主你可以测试下，C语言中sizeof('A')确实是4你看错问题了 答主的疑问和 'A' 没什么关系 问的是 "A"


Question: 关于天梯赛L1-043阅览室的疑问

萌新想知道这些题是在哪找的


Question: 怎么能获取窗口标题里的内容。

路径应该不会变化吧，绝对路径和相对路径应该都可以。还有unix和linux用的路径分隔符才是/，windows用的是\。如果真的是windows就难办一点，应该清楚吧？用转义符作路径分割太。。。呃

GetWindowText

引用 2 楼 狼二羊 的回复:[quote=引用 1 楼 xueyu人生 的回复:] 你截个图看看是什么软件，同时你是想用MFC获取软件标题？ 在c里可以用的。。在家  家里电脑没有那个软件[/quote] 只是在软件界面获取字段怕是不行吧

引用 1 楼 xueyu人生 的回复:你截个图看看是什么软件，同时你是想用MFC获取软件标题？ 在c里可以用的。。在家  家里电脑没有那个软件

你截个图看看是什么软件，同时你是想用MFC获取软件标题？


Question: vc++2010 express求解

ctrl+R+W  或  编辑>高级>查看空白


Question: 关于链表的一个问题，请求各位大神解答

scanf函数返回成功读入的数据项数，给p->data=k;应该就没问题了

我以前学C语言的时候也是 都照书抄代码，编译的时候报错就懵逼了，真的要好好弄懂原理才行

tem->next=p; tem=p; 的意思是把链表指向下一个节点，为存下一组数据做好准备，若还有数据，则将数据存进去，若数据已经存完了，则为链表的最后一个节点的->next写上NULL, 表示此链表已经结束！

循环打印时 指针没有移动当然.打印的值一样了.

放进去就是这样 node *list(int n) {     node *head;     node *p,*tem;     int i,k;     head=(node *)malloc(sizeof(node));     head->next=NULL;     tem=head;     int j=0;     for(i=0; i<n; i++)     {         scanf("%d",&k);         if(j==0)         {             head->data=k;             j=1;         }         else         {             p=(node *)malloc(sizeof(node));             p->data=k;             tem->next=p;             tem=p;         }     }     p->next=NULL;     return head; } 至于 tem->next=p;         tem=p; tem一开始指向链表头，将值赋给p之后，让tem的next指针指向p也就是下一个链节 tem再指向下一个链节  循环...... 我其实也不知道该怎么解释

引用 12 楼 赵4老师 的回复:数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633好的，老师。正在学习您的代码

引用 13 楼 或✘许✔吧 的回复:首先不是这样遍历的（你这个少了指向下一个链节的操作） for(i=0; i<n; i++)     {         printf("%d\n",list1->data);     } 应该是 for(i=0; i<n; i++)     {         printf("%d\n",list1->data);         list1=list1->next;     } 或者 while(list1!=NULL)     {         printf("%d\n",list1->data);         list1=list1->next;     } 其次 你的链表头没有给入值  还有就是p->data=scanf("%d",&k);最好别这样用  有时候会出错  后面循环这里改成 scanf("%d",&k);         p->data=k;  就是这三处错误了 好的，非常感谢！请问要是想把给链表头赋值这部操作放进循环该怎么改进，还有 tem->next=p;         tem=p; 这两步操作该怎么理解。请求解答

解决了，自己对比一下吧.....

#include<stdio.h> #include<stdlib.h> typedef struct nodelist {     int data;     struct nodelist* next; } node; node *list(int n); int main() {     int n,i;     node *list1;     scanf("%d",&n);     list1=list(n);     /*for(i=0; i<n; i++)     {         printf("%d\n",list1->data);         list1=list1->next;     }*/     while(list1!=NULL)     {         printf("%d\n",list1->data);         list1=list1->next;     }     return 0; } node *list(int n) {     node *head;     node *p,*tem;     int i,k;     head=(node *)malloc(sizeof(node));     head->next=NULL;     scanf("%d",&k);     head->data=k;     tem=head;     for(i=0; i<n-1; i++)     {         p=(node *)malloc(sizeof(node));         scanf("%d",&k);         p->data=k;         tem->next=p;         tem=p;     }     p->next=NULL;     return head; }

引用 7 楼 qq_43293301 的回复:根据我以前惨痛的教训，个人感觉最好不要抄代码，先了解工作原理，有毛病了自己先试着调试，这样才能进步。现在很多c语言的书都有很大的应试成分，看了帮助不大，最好选择一些能够帮你学习原理和思路的书。加油↖(^ω^)↗ 好吧 ，谢谢啦

sorry,手抖了。在循环里使用printf的时候，打印3次明明都是同一个值啊，看代码就知道了。这个只能改算法。第二处，在list函数里使用scanf赋值是怎么回事？你可以上百度查一下就会发现，scanf的返回值不是你想的那样。第三处，使用scanf为三个变量读取错误，在第一次输入n后缓冲区会留下一个\n字符，第二次读取真正的数据时会优先读取换行符，而scanf读取整数时会把这个字符读取。这就导致读取错误，因此第一个数据得到的就是一个垃圾值(任意值)，而你连续三次打印的就是第一个值，所以输出了三个没有意义的值

代码有至少3处错误。第一处:main函数里，在一个for循环里用

引用 5 楼 qq_43293301 的回复:能不能把你真正的代码截屏发过来，你的运算结果唯一合理的解释就是问题一和问题三，而这些是建立在问题二不成立的情况上的，因为如果你的代码真的如你发的那样的话，data得到的值就是scanf成功读取的个数(可以百度scanf返回值)，那输出data的时候就不会输出一个这样的垃圾值(因为data=后是scanf的返回值)，这只是我的推理，可能有不妥之处。但希望能帮到你。 额，我的代码截屏： 我是百度了一些链表的创建例子，然后自己码上去。


Question: C语言 指针问题  求大佬帮我看看 谢谢

第三个函数p指向b就好了

客气了

引用 3 楼 或✘许✔吧的回复:上面是我的指针使用习惯，我把%10g也该成f了 其实你的主要问题是第三个循环跳不出指针p的地址不可能等于c的地址（因为他们根本就不是指向同一个数组，指针的比较只能是在指向同一个数组的时候才有意义，不然不可能相等）也就没有跳出条件 可以改动一下第三个调用函数就可以 如图  好的，我懂了，原来是我不等式那里错了啊，谢谢你

额。。你的代码有点问题，我改了一下，你可以对比一下，（我理解的题意） #include <stdio.h>  void copy_arr(double *a, double *b, int c); void copy_ptr(double *a, double *b, int c); void copy_ptrs(double *a, double *b, double *c);  int main() {     double source[5] = {1.1, 2.2, 3.3, 4.4, 5.5};     double target1[5];     double target2[5];     double target3[5];     int i;      copy_arr(target1, source, 5);     copy_ptr(target2, source, 5);     copy_ptrs(target3, source, source + 5);     for(i = 0; i < 5; i++)         printf("%10f%10f%10f%10f\n", source[i], target1[i], target2[i], target3[i]);      return 0; }  void copy_arr(double *a, double *b, int c) {     int i;     for(i = 0; i < c; i++)         a[i] = b[i]; }  void copy_ptr(double *a, double *b, int c) {     double *p;     p=b;     int i;     for(i = 0; i < c; i++, p++)         a[i] = *p; }  void copy_ptrs(double *a, double *b, double *c) {     int i;     double *p;     p=b;     for(i = 0; p != c; i++, p++)         a[i]= *p; }


Question: 运行后每次输入完名字就崩溃了，麻烦大神给解答以下，万分感谢

引用 2 楼 耕者走兔 的回复:这类故障一般是野指针造成的。  student  *stu这只是一个指针，他没有指向任何对象。  addStu(stu)你也没有为这个指针在函数内部创建对象。  谢谢，还是我的学业不精啊 ，完美解决了

我用的编译器是codeblocks


Question: GPU CUDA C 编程

想看下相关培训班

以前看过一本GPU高性能编程实战，然后就是在英伟达官网看说明，我也刚刚开始学习。

沙发~~~~~


Question: PAT 乙级 1018 求大佬解答哪里出错了

错在你题目都没有给出来

。。。。。。。。。题目没有看不了啊


Question: 电压波动趋势判断(上升或下降)

做下滤波去燥，应该会好一些吧。或者把这些数据点取出做下处理，求下某段区间平均值、平方差、理想化数据，然后取出你想要的区间。

做滤波看看曲线怎样的

搜“低通滤波”


Question: C语言

嗯嗯，好的呢，试验过对了，谢谢。

是%lf 不是 %If L 和 I


Question: C语言表达式

引用 7 楼 耕者走兔 的回复:（+a）该运算符是为了和（-a）对应而虚设的运算符，无现实用途。  该运算符必须是算数类型，操作结果是该操作数的值。如果操作数是整数类型则进行类型提升，结果为提升后的类型值。（但我没有看到有编译器支持这一点）   char ch = 0; sizeof ch 和 sizeof +ch 看看

引用 2 楼 耕者走兔 的回复:单目运算符 取正（+），如果是一个负值他被修正为 正值       +(-1)+(-1) 还是 -1

单目运算符 取正（+），如果是一个负值他被修正为 正值       +(-1)

-a 认不认识 +a就不认识了?

引用 3 楼 user-2 的回复:引用 2 楼 耕者走兔 的回复:单目运算符 取正（+），如果是一个负值他被修正为 正值       +(-1)没有这样的功能 如你所言，他没有没任何作用。但当年老师就是这么教的，我也是这么学的。  但作为表达式，既不非法，也有效，不是吗？

引用 1 楼 user-2的回复:-a 认不认识 +a就不认识了? 也对哦，经常用-号   突然出现+号还以为错了   我以为是加法运算符 加法运算符不是双目的么   我就以为是错的了


Question: 【C语言求助】如何使用正则表达式匹配C语言中的函数调用

我觉得用“正则表达式将C语言源代码中全部函数提取出来”肯定是不够的啦。也就是糊弄下人而已。 既然这个是糊弄了，那搜索函数调用就是用\\w+\\s*(也差不多可以糊弄了。


Question: 新手求助SDK RichEdit4.1版控件设置垂直文本问题

经过查MSDN得知，richedit控件的消息EM_SETLANGOPTIONS和EM_GETLANGOPTIONS是处理东亚文字的，查2008MSDN得知一些标志位的设置。可是还是没有解决。      下面是源程序，在VC6.0下编译通过，略微改动在vs2008下也通过，但是结果还是横排，没有效果。  case WM_CREATE:         hRichEditDll = LoadLibrary(TEXT("msftedit.dll"));        	//InitCommonControls();         hRichEdit = CreateWindowEx(WS_EX_CLIENTEDGE ,TEXT("RICHEDIT50W"), NULL,          WS_CHILD | WS_VISIBLE | WS_VSCROLL | WS_HSCROLL | ES_MULTILINE | ES_NOHIDESEL | ES_VERTICAL ,          10, 10, 1000, 380, hWnd, 0, NULL, 0); 		lRichR=SendMessage(hRichEdit,EM_GETLANGOPTIONS,0,0);         SendMessage(hRichEdit,EM_SETLANGOPTIONS,0,lRichR | IMF_DUALFONT ); 		mStyle=GetWindowLong(hRichEdit,GWL_STYLE);         SetWindowLong(hRichEdit,GWL_STYLE,mStyle|ES_VERTICAL); 		UpdateWindow(hRichEdit);  这是处理WM_CREATE 消息，其余的和上面的程序一样。

引用 1 楼 幻夢之葉 的回复:ES_VERTICAL Draws text and objects in a vertical direction. This style is available for Asian-language support only.  用过这个控件，但是不深 仅支持亚洲语言，它是如何知道是不是亚洲国家语言呢？ 有哪些参数或者函数允许设置相关的诸如区域，语言，编码的，你试试看谢谢指导，我找找看下。

谢谢大侠指导。这个也是我困惑的地方，要说那个DLL文件，我查询了它的属性中的详细信息，是简体中文。


Question: cmd这是出什么问题了？

管理员运行看看

是本人本用户没错呀，电脑里只有这一个用户。

引用 1 楼 老马何以识途的回复:估計跟你的環境變量有關係，脚本中試試把LANG設置成zh_CN 请问怎么设置？敲dos命令还是修改环境变量？

引用 2 楼 niiiloc 的回复:权限和用户的问题 是本人本用户没错呀，电脑里只有这一个用户。

权限和用户的问题


Question: 使用C语言完成图像处理

请说明一下，这个问题来自哪里？这样对于解答问题将很有帮助。

我自己尝试在写第一部分，卡在temping没有办法定义了头疼


Question: 杭电oj1020为什么错啊？！！！

#include <iostream> #include <cstdio> #include <cstring>  using namespace std;  int main() {     int N;     int num[26]={0};     int zm;     cin>>N;      getchar();     //memset(num, 0, sizeof(num));     for(int i=0;i<=N-1;i++)     {         //第一次输入         while((zm = getchar()) != '\n')         {              //cout<<zm<<endl;             if (isupper(zm))                 num[zm-65]++;         }         /*for(int i=0;i<=25;i++)           {           cout<<num[i]<<endl;             }*/         //cout<<"wan";         for(int i=0;i<=25;i++)         {             if(num[i] == 0)             {                 continue;             }             else if (num[i] == 2)             {                 printf("%c", i + 65);             }             else if(num[i] != 0 && num[i] != 2)             {                 printf("%d%c",  num[i] - 1, i + 'A');             }         }         //if(i!=N-1)         cout << endl;     }  }  供参考！

简单一点：  #include <stdio.h>  int main() {   int c = 1, p = 0, x;    scanf("%d\n", &x);   while (1)   {     if (scanf("%c", (char *)&x) == EOF) break;     if (x == p) c++;     else     {       if (p)       {         if (c > 1) printf("%d", c);         putchar(p);       }       if (x == 10) puts(""), x = 0;       c = 1, p = x;     }   }    return 0; }


Question: whlie死循环被中断问题和乱码问题

谢谢，很有帮助

学习了，谢谢分享

还是习惯看JAVA code.

楼主，你的Delete函数出错了，请注意分清结构体数组的含义，你的函数逻辑是将某一结构体数组清0，但清0后，这个数组还是存在的，只是值是0，如果你要实现删除功能，需要后面的数组覆盖要删除的数组，再减1，还有请注意strcpy的用法,它针对的字符串，你直接写“0”是不行的，代码如下: void Delete(struct gues *p) { 	int i,k=0,j; 	char phone[20];  	printf("输入电话号码"); 	gets(phone);  	for (i = 0; i < max; i++) 	{ 		if (strcmp(p[i].telephone, phone) == 0) 		{ 			k = i; 			printf("k=%d\n",k); 			for (j = k; j < max; j++) 			{ 				strcpy(p[j].name, p[j + 1].name); 				printf("%s\n", p[j].name); 				p[j].sum = p[j + 1].sum; 				strcpy(p[j].telephone, p[j + 1].telephone); 				strcpy(p[j].time, p[j + 1].time); 			} 			num--; 		} 	}	 }

厉害了啊楼主

#include "stdafx.h" #include "string.h" #include "stdlib.h" #define max 5 int num=5; struct gues { 	char name[20]; 	char telephone[20]; 	int sum; 	char time[10]; } guestlist[max]= {"zhanglin","1234567891",5,"11.30",                    "liyong","1234567892",3,"12.30",                    "liuying","1234567893",6,"12.00",                    "zhaopeng","1234567894",4,"12.20",                    "moqing","1234567895",7,"11.50"                   };  void insert(struct gues *p); void search(struct gues *p); void update(struct gues *p); void Delete(struct gues *p); void show(struct gues *p);  int main(int argc, char* argv[])  { 	for(int i=0; i<999; i++)  	 { 		int choose=0; 		printf("\n1插入\n2查询\n3修改\n4删除\n5显示\n"); 		scanf("%1d%*c",&choose); 		switch(choose) 		{ 		case 1: 			insert(guestlist); 			break; 		case 2: 			search(guestlist); 			break; 		case 3: 			update(guestlist); 			break; 	    case 4: 			Delete(guestlist);break; 	    case 5: 			show(guestlist);break;        } 	 } 	return 0; } void insert(struct gues *p) { 	int i; 	if(num=5) 		printf("无多余餐桌"); 	else 		for(i=0; p[i].sum=0; i++) 			{printf("分别输入名字，电话，人数，时间（用空格分开）"); 	scanf("%19s,%19s,%d,%9s",p[i].name,p[i].telephone,&p[i].sum,p[i].time); 	} } void search(struct gues *p) { 	char tele[20]; 	printf("输入电话号码"); 	scanf("%19s%*c", tele); 	//gets(tele); 	int i; 	int flag=0; 	for(i=0; i<max; i++) { 		if(strcmp(p[i].telephone,tele)==0) { 			flag=1; 			printf("%s\n%s\n%d\n%s\n",guestlist[i].name,guestlist[i].telephone,guestlist[i].sum,guestlist[i].time);  			break; 		} 	} 	if(flag == 0) 		printf("没有查询到可以修改的信息"); 	else 		printf("客人资料为上述"); } void update(struct gues *p) { 	printf("输入电话号码"); 	char phone[20]; 	gets(phone); 	int i; 	for(i=0; i<max; i++) { 		if(strcmp(p[i].telephone,phone)==0) { 			printf("请输入重新修改后的所有数据(用空格分开)"); 			scanf("%19s %19s %d %9s%*c",p[i].name,p[i].telephone,&p[i].sum,p[i].time); 		} 	} } void Delete(struct gues *p) {printf("输入电话号码"); 	char phone[20]; 	gets(phone); 	int i;   for(i=0;i<max;i++) 	  if(strcmp(p[i].telephone,phone)==0)  	  {strcpy_s(p[i].name,0);        strcpy_s(p[i].telephone,0);        p[i].sum=0;        strcpy_s(p[i].time,0);        num=num-1;       break;} } void show(struct gues *p)    {int i;          for(i=0;i<max;i++)           {printf("%s\n,%s\n,%d\n,%s\n",p[i].name,p[i].telephone,p[i].sum,p[i].time);           }    }     以上是修改过的代码在执行第四个函数时又是直接跳出循环   还想请问下各位原因在哪

非常感谢两位

基础知识还需要加强呢，代码不要写的那么紧凑，不利于阅读和查找问题。

//if(num=5)     if(num == 5)         printf("无多余餐桌");     else         //for(i=0;p[i].sum=0;i++)         for(i=0;p[i].sum==0;i++)             printf("分别输入名字，电话，人数，时间（用逗号分开）"); 看一下注释掉和新的代码的，比较一下是否能够看到问题所在。如下一样的问题：  //if(flag=0)     if(flag==0)  如下的逻辑是不是有问题，应该加上一个大括号吧   for(i=0;p[i].sum==0;i++) {             printf("分别输入名字，电话，人数，时间（用逗号分开）");     scanf_s("%c,%c,%d,%c",p[i].name,p[i].telephone,&p[i].sum,p[i].time); }

先学会自己调试，不然有的是苦吃

必要时请参考 https://paste.ubuntu.com/p/5kqV63S44H/

还有为什么要在函数作用域内进行函数声明

问题有点多  1. 新手不要省略 {} 2. 注意 scanf 的 % 后面应该接什么 3. 注意 if 中 = 符号 4. 注意使用 break 5. %s,%s,%s 并不会以 ，进行分割 6. 处理 scanf 后的回车，有一个更好的方法 scanf("%s%*c", phone); 7. %s 推荐设置最大域宽 8. 注意 ; 的使用

这个第二个问题的图  发漏了  见谅


Question: 整数拆分问题（用堆栈方法）   谢谢

仅供参考：#include <stdio.h> #include <stdlib.h> void print(int res[], int num) {     static int L=0;     L++;     printf("%8d:",L);     for (int i=0;i<num;++i) {         printf(" %d", res[i]);     }     printf("\n"); } void split(int n, int m) {// n表示总数，m表示最大因子     static int res[100];// 保存结果     static int num=-1;// 当前因子下标      if (n<m || n<0 || m<1) return;     num++;     if (0==n) {// 递归终止条件，为0不可再分，直接输出         print(res,num+1);         num--;         return;     } else {         if (n==m) {// 不拆，直接输出             res[num]=m;             print(res,num+1);             num--;         } else {             // 拆分出第一个             res[num]=m;             n=n-m;              if (m>n) m = n; // 最大因子不可能大于总数              for (int i=m;i>=1;--i) {// 循环，第二个因子可以继续拆分，而且按照最大因子不同可以拆分成多个                 split(n,i);             }             num--;         }     } } void Split(int n) {     if (n<=0) return;     if (100<n) {         printf("Up to 100\n");         return;     }     for (int i=n;i>=1;--i) {         split(n, i);     } } void main(int argc,char **argv) {          if (argc<=1) Split(5);     else if (argc>=3) split(atoi(argv[1]),atoi(argv[2]));     else              Split(atoi(argv[1])); }


Question: if...else语句

恩，不过你的问题是什么？

言之有理


Question: 1014 福尔摩斯的约会

题目也没说清楚是否一定要位置一致啊，从题目给的用例看，位置是一致的

我上面的回复有点问题 下面是纠正 这个例子D和E在字符串中的位置一样，你这个代码运行是正确的  这个D和E是两个字符串中相同的大写字母但是在字符串中的位置不同

楼主的代码是把字符串位置相同的字符进行比较 这个是有问题的  比如： DUIE DNJE s&hgsfdk  d&Hyscvnm 这个例子Y和R在字符串中的位置一样，你这个代码运行是正确的 但是如果是： DHUE ODEM s&hgsfdk  d&Hyscvnm 这个Y和R是两个字符串中相同的大写字母但是在字符串中的位置不同 在你这运行就不对了


Question: 一个16进制转8进制的程序

谢谢你了，我刚刚入csdn许多地方不懂，有不对希望别见怪

引用 7 楼 晗生缘 的回复:楼主您好，您的2进制转为8进制的代码有的瑕疵。建议您先将16进制转为10进制，由10进制转为8进制。 /*将一个大写字母转换成小写字母*/ int tolower(char c) { 	if (c >= 'A'&&c <= 'Z') 	{ 		c = c + 'a' - 'A'; 	} 	return c; } /*将一个16进制的字符串改成整数*/ int htoi(char str[]) { 	int i; 	int n=0; 	if (str[0] == '0'&&(str[1] == 'x' || str[1] == 'X')) 	{ 		i = 2; 	} 	else 	{ 		i = 0; 	} 	for (; (str[i] >= '0'&&str[i] <= '9') || (str[i] >= 'a'&&str[i] <= 'z') || (str[i] >= 'A'&&str[i] <= 'Z'); i++) 	{ 		if (tolower(str[i]) > '9') 		{ 			n = 16 * n + (10 + tolower(str[i]) - 'a'); 		} 		else 		{ 			n = 16 * n + (tolower(str[i])-'0'); 		} 	} 	return n; } /*将整数转换成8进制数*/ char *itoo(int Num, char buf[]) { 	int i = 0; 	int j; 	char temp; 	while (Num != 0) 	{ 		buf[i++] = Num % 8 + '0'; 		Num = Num / 8; 	} 	for (j = 0; j < (i / 2); j++) 	{ 		temp = buf[j]; 		buf[j] = buf[i - j - 1]; 		buf[i - j - 1] = temp; 	} 	return buf; } /*将16进制转换为8进制*/ char *htoo(char buf[]) { 	int n; 	char *p = NULL; 	n = htoi(buf); 	p = itoo(n, buf); 	return buf; } int main() { 	char str[N]; 	char n[N]; 	int i=0,len; 	char *p = NULL; 	printf("Please input:\n"); 	scanf("%s",str); 	p=htoo(str); 	for (i = 0; i < N; i++) 	{ 		printf("%c\t",str[i]); 	} 	system("pause"); 	return 0; }十六进制转八进制  需要注意 这题目的数值非常大远远超过int取值范围  你的想法是错误的  这题目的基本思路不应该借助十进制做中转 应该借助二进制做中转  一位十六进制 转换为 四位二进制 一位八进制 转换成 三位二进制  所以 三位十六进制 能转换成 四位八进制 按照这个思路 把字符串按照三位一组进行分组 每次转换出四位八进制存到一个字符串里面 最后输出字符串就好了

比如输入  1 FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF 你的代码就错了

每个十六进制数长度不超过100000  你的数组太小了

简单写一个：  #include <stdio.h> #include <string.h>  char b[100001], c[9]; char t[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0,0,0,0,0,0,0, 10, 11, 12, 13, 14, 15};  int main() {   int n, i, p, q, r, x;    scanf("%d", &n);   while (n--)   {     scanf("%s", b);     q = (p = strlen(b)) / 6, (r = p % 6) ? r : (q--, r = 6);     for (x = 0, i = r; i; i--) x += t[b[i - 1] - 48] * (1 << (r - i) * 4);     for (p = 8; x; x >>= 3) c[--p] = (x & 7) + 48;     printf("%s", &c[p]);     for (x = 0, p = 0; p < q; p++)     {       for (i = 0; i < 6; i++) x += t[b[p * 6 + r + i] - 48] * (1 << (5 - i) * 4);       for (i = 7; i >= 0; i--) c[i] = (x & 7) + 48, x >>= 3;       printf("%s", c);     }     puts("");   }    return 0; }

看上去你使用大量c99特征，如；动态数组，即时变量。

题目 问题描述 　　给定n个十六进制正整数，输出它们对应的八进制数。  输入格式 　　输入的第一行为一个正整数n （1<=n<=10）。 　　接下来n行，每行一个由0~9、大写字母A~F组成的字符串，表示要转换的十六进制正整数，每个十六进制数长度不超过100000。  输出格式 　　输出n行，每行为输入对应的八进制正整数。  　　 　　输入的十六进制数不会有前导0，比如012A。 　　输出的八进制数也不能有前导0。  样例输入 　　2 　　39 　　123ABC  样例输出 　　71 　　4435274  　　 　　先将十六进制数转换成某进制数，再由某进制数转换成八进制。

运行出错，什么原因，在codeblocks上输入输出没问题，但在蓝桥杯里边评测确是运行错误，大佬出来帮帮忙


Question: 电脑上的Dev-cpp出了问题……求大佬解惑……

请贴代码以及具体运行情况图片，越详细越好

需要贴代码，从你的描述来看，猜测是输入时你的处理有问题


Question: 请教宏#define  fn(i)    { (i) }  的意义

搜一下内核的用法可以知道具体作用，现在可以盲猜一下，比如有变量a以及如下用法：fn（a）；宏替换后就是｛（a）｝；只是让CPU去内存中访问变量a，然后什么都不做，这样会引起编译器警告，但是还是有作用的，占用一个极小的时间，也就是延迟，另一个作用就是如果a是一个文件，这样做可以更新文件的最近访问时间，所以可以盲猜为延迟和更新文件时间，但是具体作用要看Linux内核

看上去像个宏函数。


Question: 编绎 时提示  -1错误

衷心的感 谢楼主的帮助和支持，解决了！

其他几个符号也像中文状态打的

我觉得是你哪个双引号格式不符。 双引号必须是英文状态下打的才有用。我看你这像中文状态下打的。 其实你自己可以看错在哪的


Question: 取出8392每一位上的数

因为你输出的是 num/i，还有一次计算

#include <stdio.h> int main(int argc, char *argv[]) { 	int m,n,a[99],i; 	scanf("%d",&m); 	int s,b=m; 	if(b==0){ 		s=1; 	} 	for(s=0;b!=0;s++){ 		b=b/10;  	} 	for(i=0;i<s;i++){ 		a[i]=m%10; 		m=m/10; 	} 	for(i=0;i<s;i++){ 		printf("%d ",a[i]); 	} 	printf("\n"); 	return 0; }

楼主，可以直接使用数组存放每一个数字，代码思路如下： 1.先将8392对10求余，即buf[0]=8392%10=2；然后将8392对10整除，得到num=8392/10=839; 2.将新得到的num=839对10求余，即buf[1]=839%10=9，然后将839对10整除，得到num=839/10=83; 3.将新得到的num=83对10求余，即buf[2]=83%10=3，然后将83对10整除，得到buf[3]=num=83/10=8;  4.如果你想显示的8 3 9 2这样的正序，可以将首尾参数对换得到，这个函数很多书籍都有，也很简单 思路我写出来了，剩下的楼主可以自己参考着写，这样有助于你进步

#include <stdio.h> int main() {     int num = 8392;      while (num) {         printf("%c\t", num % 10 + '0');         num /= 10;     }      putchar(10);      return 0; }  供参考！  这个程序有一定局限性，比如负数，越界等情况没有考虑，如果需要可以在这个基础完善。

引用 4 楼 zjq9931 的回复:给你一个适应很多位数的  #include <stdio.h> void main() { 	int num = 8392 ; 	int i ; 	char buffer[100];  	sprintf(buffer, "%d", num);  	for(i=0; buffer[i]!=0 ; i++) 	{ 		printf("%c\n", buffer[i]) ; 	} }  int表示不了100，最多用16的buffer即可。

百分号是求余数;分号是做除法，结果只取整数，不进行四舍五入

printf("%d\n" , num/i) ; -> printf("%d\n" , (num/i) % 10) ;  num = num % i ; 去掉

num 8392  i 1000  num/i 8 num = num%i=8392%1000=392      i =1000/10=100       num/i   = 392/100=3   num = 392%100=92    i = 10  num/i = 92/10=9    num  = 92%10=2  i = 1  num/i = 2  num=2%1=0   i=1/10=0结束for循环


Question: 求助，数组指针解引用为什么要用两次**

懂了，原来（*p）【5】定义的数组指针是二维的，我还在想他跟直接*p的区别呢

定义并初始化了数组a[5] 你这里其实是定义了一个指向二维数组的指针（我是这么叫的）并把他指向一维数组a 你这里（*p1）与a等价 *p1储存的是a[0]的地址当然要用啊[0]的值要两次解引用啊· 下面这个代码是一般的指向一维数组的用法 int main() {     int a[5]={1,2,3,4,5};     int *p=&a;     printf("%d",*p);     return 0; }  当然一维数组也是可以指向二维数组的但是（*p1）[5]二维数组指针就方便一点 指向下一列就把p1++就ok


Question: 数据结构中单链表的插入有一个小小的疑惑

L是形参，是一个LinkList指针，p是一个LinkList变量，把指针指向的内容赋值给对应的变量，这个没问题，基本的语法


Question: 关于c语言I/O流读取文件一直返回文件尾的问题

代码看不出问题 换成 fread 试试看