Question: fprintf输出相关问题

#include<stdio.h> #include<stdlib.h> #include<string.h>  struct course {     int num;                               /*课程编号*/     char name[30];                         /*课程名称*/     char kind[20];                         /*课程性质*/     int time;                              /*课时*/     int mark;                              /*学分*/     int term;                              /*1为考试2为考察*/     int opterm;                            /*开课学期*/ };  typedef struct Node                  /*创建头结点*/ {     struct course d;     struct Node *next; }Node;     /*课程插入*/ void insert() {     FILE *fp1;     int g=1,key=0,key1=0,f=0;     int a=0,b=0;     if((fp1=fopen("course.txt","r"))==0)     {         printf("can't open file\n");         exit(0);     }      Node *first=(Node *)malloc(sizeof(Node));           /*头指针初始化*/     //first->next=0;     first->next= NULL;     for(;!feof(fp1);)     {         Node *s=(Node*)malloc(sizeof(Node));         //fscanf(fp1,"%d%s%s%d%d%d%d", &s->d.num,&s->d.name,&s->d.kind,&s->d.time,&s->d.mark,&s->d.term,&s->d.opterm);         fscanf(fp1,"%d%s%s%d%d%d%d", &s->d.num, s->d.name, s->d.kind,&s->d.time,&s->d.mark,&s->d.term,&s->d.opterm);         s->next=first->next;         first->next=s;     }      for(;g==1;)     {         printf("请输入需要插入的课程信息:\n课程编号，课程名称，课程性质，课时，学分，1为考试2为考察，开课学期\n");         Node *e=(Node*)malloc(sizeof(Node));         //scanf("%d%s%s%d%d%d%d",&e->d.num,&e->d.name,&e->d.kind,&e->d.time,&e->d.mark,&e->d.term,&e->d.opterm);         scanf("%d%s%s%d%d%d%d",&e->d.num, e->d.name, e->d.kind,&e->d.time,&e->d.mark,&e->d.term,&e->d.opterm);         e->next=first->next;         first->next=e;         printf("是否继续输入？1为是，2为否\n");         key=0;         while(key==0){             scanf("%d",&g);             if(g==1||g==2)                 key=1;             else             {                 printf("\n输入错误，请重新输入！！！\n");                 printf("是否继续输入？1为是，2为否\n");             }         }     }     fclose(fp1);     printf("是否存盘？？1为是2为否\n");     while(key1==0){         scanf("%d",&f);         if(f==1||f==2)             key1=1;         else             printf("\n输入错误，请重新输入！！！\n");     }     if(f==1)     {         //if((fp1=fopen("course.txt","w"))==0)         if((fp1=fopen("course.txt","w"))==NULL)         {             printf("can't open file\n");             exit(0);         }         Node *p=first->next;         while(p!=0){             fprintf(fp1,"%5d%12s%9s%9d%9d%11d%11d", p->d.num,p->d.name,p->d.kind,p->d.time,p->d.mark,p->d.term,p->d.opterm);             p = p->next;         }     }     printf("录入完毕\n");     Node *k=first;     //while(first!=0){     while(first!= NULL){         first=first->next;         free(k);         k=first;     }     fclose(fp1);     while(b==0){         printf("\n1-返回主菜单；2-退出系统\n");         scanf("%d",&a);         if(a==1||a==2)             b=1;         else             printf("\n输入错误，请重新输入！！！\n");     }     if(a==1)         //main();         return ;     else         exit(0); }    /*主菜单*/ void main() {     int n,w = 0;     printf("*********************************************************************************\n");     printf("                                      学生选课系统菜单\n");     printf("*********************************************************************************\n");     printf("                                      1-录入\n");     printf("                                      2-浏览\n");     printf("                                      3-查询\n");     printf("                                      4-修改\n");     printf("                                      5-删除\n");     printf("                                      6-统计\n");     printf("                                      0-退出\n");     printf("*********************************************************************************\n");     printf("                请输入选项前的数字\n");     scanf("%d",&n);     do     {         if(n>5||n<0)         {             printf("\n输入错误\n");             scanf("%d",&n);             w = 0;         }         else             w=1;     }while(w==0);     switch(n)     {         case 1:insert();break;         case 2:browser();break;         case 3:search();break;         case 4:revise();break;         case 5:statistics();break;         case 6:delet();break;         case 0:exit(0);     } }  供参考～ 建议对比代码找出自己的问题，另外把代码功能补全了～

第一个是多打了一行，第二个是数组输出的时候会传首地址，然后0要改成null，函数要有返回值，是这些吗？ 前面理解了，但是：0和null应该只是表现形式不一样吧？函数要有返回值，但是我的函数类型是void，用return空有什么好处吗？


Question: C语言

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


Question: c语言课程设计


Question: 萌新求助:我哭了，这哪错了....

引用 2 楼 自信男孩的回复:#include <stdio.h> #include <string.h>  #define N 5  int main() {     //int sort(int st[n]);     void sort(int *st, int n);     int i;     int a[N],*p;      printf(" the original numbers:");     for(i=0;i<N;i++)         scanf("%d",&a[i]);      printf("\n");     p=a;     sort(p, N);     //for(p=a,i=0;i<n;i++);     for(p=a, i=0; i < N;i++)     {         printf("%d\t",*p);         p++;     }     putchar(10);      return 0; }  //int sort(int st[n]) void sort(int *st, int n) {     int i,j,t,temp;     for(i=0;i<n-1;i++)     {         t = i;         for(j=i+1;j<n;j++)             if(st[j]>st[t])                 t=j;         if (t != i) {             temp = st[t];             st[t] = st[i];             st[i] = temp;         }     } } 供参考～  有些代码我感觉可以优化一下，就给你改了，并不是说是错误：比如宏定义大写，参数用2个，而不是一个。  有几处错误是有问题的，建议对比代码找一下。  要有耐心，调试代码需要有耐心和细心，有一个地方for后面跟分号；这是不细心或者学的不仔细导致的。  遇到问题不要着急，慢慢来，初学者都会犯这些低级错误～正常，坚持写下去，慢慢就好了～ 虽然我写的时候总是找不到错误，但是我会努力进步的!!!!不过谢谢大佬啊啊啊啊啊啊啊啊啊啊

引用 1 楼 user-2的回复:第15行最后多了一个分号 啊啊啊啊啊啊啊啊啊啊对了感谢感谢

第15行最后多了一个分号


Question: c语言问题，请哪位大哥帮忙解决一下

👍，谢谢了哈哈，再请教一下你，就是a[0]是杂数，但是为什么是偶数之和输出的是杂数而不是奇数之和输出杂数呢

改一下：  while (p < a + 4) {     scanf("%d", p);     p++ } 供参考～  第一个输入你不是写到a[0]里了，你是写到a[1]里面去了，第一个a[0]就是随机数，所以比较大。注意while里p++之后,scanf输入的p是p+1的地址。 其他还有问题再提出来～


Question:
大整数乘法

求两个不超过200位的非负整数的积。

#include <stdio.h> #include <stdlib.h> #include <string.h>  #define MAX_NUM_LEN 2048  int cal_factorial(unsigned char *num_list, int num_size, int n);  int cal_val(unsigned char *num_list, int num_size, int base, int num) {     int i = 0, j;     int len = 1, tmp, carry_bit;      num_list[1] = 1;      while (i < num) {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * base + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size-1 < len) {/* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }         i++;     }      return len; }   int main(void) {     unsigned char num_list[MAX_NUM_LEN];     int num_len, i;     int base, power;      memset(num_list, 0, sizeof(num_list));     printf("Please input two numbers: ");     scanf("%d%d", &base, &power);      if (base < 0 && power % 2)         num_list[0] = 1; /* negative number */     else         num_list[0] = 0;     base = abs(base);      num_len = cal_val(num_list, MAX_NUM_LEN, base, power);     printf("len = %d\n", num_len);     if (num_list[0])         putchar('-');     for (i = num_len; i >= 1; i--)         printf("%d", num_list[i]);     printf("\n");     return 0; }   int cal_factorial(unsigned char *num_list, int num_size, int n) {     int carry_bit, i, j, len = 1;     int tmp;      num_list[1] = 1;     for (i = 2; i <= n; i++)     {         carry_bit = 0;         for (j = 1; j <= len; j++) {             tmp = num_list[j] * i + carry_bit;             num_list[j] = tmp % 10;             carry_bit = tmp / 10;             if (j >= len && carry_bit != 0)                 len++;             if (num_size -1 < len) { /* overflow */                 printf("Overflow!\n");                 return num_size-1;             }         }      }      /*     for (i = len; i >= 1; i--)//逆序输出数组就是结果         printf("%d", a[i]);     printf("\n");     */     return len; } 供参考～  改改试试～


Question: 问题

用数组或者指针都行 从两头向中间成对儿比较就行了 写个简单的递归： int  judge(char * p, int n) {     if ( 1 >= n ) return 1;     if ( p[0] == p[n-1] ) return judge(p+1, n-2); else return 0; }


Question: 求一个字符串中小写字母的个数和大写字母的个数。为啥我的程序不累计小写字母的个数？

能这样返回吗。不能吧。就算结果是对的，但是不严谨的。 printf应该要求的地址吧，c语言是要地址，其他的一些打印输出好像有些不要。 不知道记错了没

引用 3 楼 自信男孩的回复:#include <stdio.h> #include <ctype.h>  int lower(char a[]) {     int sum1;     char *p;     sum1=0;     for(p=a;*p!='\0';p++)     {         //if(islower(*p)==1)         if(islower(*p))             sum1++;     }     return sum1; } int upper(char a[]) {     int sum2;     char *p;     sum2=0;     for(p=a;*p!='\0';p++)     {         //if(isupper(*p)==1)         if(isupper(*p))             sum2++;     }     return sum2; } int main(void) {     char s[100],*t;     fgets(s, 100, stdin);     printf("小写字母%d个，大写字母%d个\n",lower(s),upper(s));     return 0;  } 供参考～  注意isupper和islower的返回值：  The values returned are nonzero if the character c falls into the tested class, and zero if not.  这句话的意思是返回值是非0值，若匹配测试的字符类，若不匹配返回0。 没说是匹配返回1哦。 噢噢噢，好的，谢谢你啦！

引用 1 楼 黑洞中潜水的猪的回复:if(islower(*p)==1)改为if(islower(*p)) 谢谢，可以了，但是我想问一下这个和直接等于1有什么区别吗？


Question: 哪位大佬能帮忙写一下

网上先搜一下，有类似的代码和讲解的。

前一段有人问过类似问题，论坛应该都有

百度合并排序


Question: 给定一个正整数 Ｎ，如果 Ｎ 是另一个正整数的平方，则 Ｎ 为平方数， 定义一个函数isSquare，判断一个正整数Ｎ是否为平方数。main函数负责读取整数N

引用 2 楼 寻开心 的回复:int isSquare(int n) {     int i,sum=0;     int a[n+1];     for(i=0;i<n;i++)     {         a[0]=1;         a[i+1]=a[i]+2;         sum=sum+a[i];         if ( sum < n ) continue;         if ( sum == n  ) {             printf("yes");             return ++i;         } else {             printf("no");             return -1;         }     };     return -1; }  这个函数应该这样写 如果是N是平方数，输出yes并返回它是谁的平方； 如果不是平方数返回-1 a[n+1];//此处建议用malloc/free

引用 2 楼 寻开心 的回复:int isSquare(int n) {     int i,sum=0;     int a[n+1];     for(i=0;i<n;i++)     {         a[0]=1;         a[i+1]=a[i]+2;         sum=sum+a[i];         if ( sum < n ) continue;         if ( sum == n  ) {             printf("yes");             return ++i;         } else {             printf("no");             return -1;         }     };     return -1; }  这个函数应该这样写 如果是N是平方数，输出yes并返回它是谁的平方； 如果不是平方数返回-1  int a[n+1]; 这样定义本身就是有问题的吧，n是一个可变参数，n的值不确定的～

#include <stdio.h> #include <math.h>  int isSquare(int n) {   return n < 0 ? 0 : (int)sqrt((float)n) * (int)sqrt((float)n) == n ? 1 : 0; }  int main() {   for (int n; scanf("%d", &n) == 1;)     printf("%s\n", isSquare(n) ? "yes" : "no");    return 0; }

int a[n]; // 这里应该 a【n+1】， 另外，有的编译器可能不支持这种数组定义 for(i=0;i<n;i++) { a[0]=1; a[i+1]=a[i]+2; // 这个会越界，  a定义数组要多一个才行 sum=sum+a[i]; }   没有明白你这个是个什么算法 1 + 3 + 5 + 。。。 + 2n-1  = n*n 这个始终成立啊，  所以你的那个n*n == sum 永远是真


Question: 帮忙看一下，哪里错了

不知道你的目的是要做什么，但是：  1  scanf 语句里面，&a[m][n] 总给这个地方赋值是怎么个意思。 是 &a【I】【j】吧  2       if  ( a[I][j+1]==0 ) j的循环范围本来就是0到n，还使用j+1会越界的  3 因为前面的scanf错误， a【I】【j】== 1 的判断始终就没有成立过

不用了找到了错误代码了


Question: 帮我解读一下一个C语言程序

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

8行就是消除字符串前面的空格

第8行是指让p指向第一个非空格的字符。

while(*p == ' ') p++;  // 这是要找到第一个不是空格的位置，让p指向这个位置 后面的q和这个类似， 通过p和q的这种操作找到，分别把p和q定位到首和尾第一个不是空格的字符  后面 就是从两头向中间来比较是否字母相同，从而判断是否是回文


Question: C语言课程设计电话订餐系统

老哥，别说你是中南自动化的

那啥，我们是不是一个学校的，我的跟你一抹一样，借我抄抄

你看他的要求，是按照用餐人数分的，那么一开始就应该初始化大中小餐桌的数量、名称，最好搞个结构管理一下，来人了那就取出其中的用餐人数，根据人数分配，至于餐桌和订单如何对应看具体情况吧，可以在订单结构体中创建一个餐桌的字段或者在餐桌上标记订单或者单独设立一个结果管理，自由发挥


Question: 求求大神提供程序或者思路

引用 5 楼 寻开心的回复:定义一个数组   const char*  Cards[] = {"None", "A", "2", "3", "4","5","'6", "7", "8", "9", "10","J","Q", "K", }  从这里取值就行了 ， 甚至你都可以把 ♠ ♥ ♦ ♣加进去， 例如 “♠A” 实现一次出一张牌的就可以了

引用 5 楼 寻开心的回复:定义一个数组   const char*  Cards[] = {"None", "A", "2", "3", "4","5","'6", "7", "8", "9", "10","J","Q", "K", }  从这里取值就行了 ， 甚至你都可以把 ♠ ♥ ♦ ♣加进去， 例如 “♠A” #include<stdio.h> #include<stdlib.h> #include<time.h> int Judgment(int d,int x[],int y[],int z[]); void player(int *p) {  	int i,j,temp; 	for(i=0;i<12;i++){ 		for(j=0;j<12-i;j++){ 			if(p[j]>p[j+1]){ 				temp=p[j]; 				p[j]=p[j+1]; 				p[j+1]=temp;	 			} 		} 	 }  } int main () { 	int a[4][13],b[52]={0}; 	char ch[]={'3','4','5','6','7','8','9','T','J','Q','K','A','2'}; 	int i,j,m,n,num=0; 	int p1[13],p2[13],p3[13],p4[13]; 	int p11=0,p22=0,p33=0,p44=0; 	srand(time(NULL)); 	for(i=0;i<4;i++){ 	    for(j=0;j<13;j++){         	a[i][j]=j+1; 	}  	} 	int flag=1,h=0;  	while(1) 	{ 		flag=1; 		n=rand()%52; 		for(m=0;m<num;m++) 		{ 			if(n==b[m]){ 				flag=0;  				break; 		    }     	}  		if(flag==1) 		{ 			b[num++]=n; 			if(h<13)p1[p11++]=a[n/13][n%13],h++; 			if(h>=13&&h<26)p2[p22++]=a[n/13][n%13],h++; 			if(h>=26&&h<39)p3[p33++]=a[n/13][n%13],h++; 			if(h>=39&&h<52)p4[p44++]=a[n/13][n%13],h++; 		}	 		if(h==52) 		break;	 	}  	player(p1); 	player(p2); 	player(p3); 	player(p4);	 	p11=0,p22=0,p33=0,p44=0; 	int r1=0,r2=0,r3=0,r4=0; 	printf("player1:\n"); 	while (1) {            printf("%c ", ch[p1[p11++]]);            r1++;            if(r1==13){ 		       printf("\n"); 		       break; 	       }     }     printf("player2:\n"); 	while (1) {            printf("%c ", ch[p2[p22++]]);            r2++;            if(r2==13){ 		       printf("\n"); 		       break; 	       }     }     printf("player3:\n"); 	while (1) {            printf("%c ", ch[p3[p33++]]);            r3++;            if(r3==13){ 		       printf("\n"); 		       break; 	       }     }     printf("player4:\n"); 	while (1) {            printf("%c ", ch[p4[p44++]]);            r4++;            if(r4==13){ 		       printf("\n"); 		       break; 	       }     }     printf("\n");     p11=0,p22=0,p33=0,p44=0;     int t1=13,t2=13,t3=13,t4=13;     int d,k=0,k1=0,k2=0,k3=0,k4=0;     printf("<<——扑克牌大乱斗——对弈开始！——>>\n\n");     printf("player1: %d \n",p1[p11]); 	d=p1[p11]; 	p1[p11]=-1;     t1--;     p11=13-t1;      while(1)     {     	if(p2[p22]>d){ 		    printf("player2: %c \n",ch[p2[p22]]);             k2=1; 			d=p2[p22]; 			p2[p22]=-1; 			t2--; 			if(t2==0){ 		    	printf("\n获得胜利的是：player2 !"); 		    	break; 		    } 			p22=13-t2; 			if(Judgment(d,p1,p3,p4)==1){ 	            while(p2[k]==-1){            		k++; 		    } 	    	p22=k,k=0; 	    	printf("player1: 要不起\nplayer3: 要不起\nplayer4: 要不起\n");             printf("player2: %c \n",ch[p2[p22]]);            	k2=1;         	d=p2[p22];         	p1[p22]=-1;             t2--;          	if(t2==0){ 		        printf("\n获得胜利的是：player2 !"); 		        break; 	     	}     	    p22=13-t2;         	} 		}     	else{     		while(p2[p22]<=d&&p22<13){     			p22++; 			} 			if(p22<13){ 			    printf("player2: %c \n",ch[p2[p22]]); 			    k2=1; 				d=p2[p22]; 				p2[p22]=-1; 				t2--; 			    if(t2==0){ 		            printf("\n获得胜利的是：player2 !"); 		            break; 		        } 				p22=13-t2;  	        	if(Judgment(d,p1,p3,p4)==1){ 	         	    while(p2[k]==-1){            		    k++; 		        } 	    	    p22=k,k=0; 	    	    printf("player1: 要不起\nplayer3: 要不起\nplayer4: 要不起\n");             	printf("player2: %c \n",ch[p2[p22]]);             	k2=1;         	    d=p2[p22];         	    p1[p22]=-1;             	t2--;          	    if(t2==0){ 		            printf("\n获得胜利的是：player2 !"); 		            break; 	     	    }     	        p22=13-t2;         	    } 			} 			if(p22==13&&k2==1) printf("player2: 要不起\n"),k2=0,p22=13-t2; 		} 		if(p3[p33]>d){ 		    printf("player3: %c \n",ch[p3[p33]]); 		    k3=1; 			d=p3[p33]; 			p3[p33]=-1; 			t3--; 			if(t3==0){ 			    printf("\n获得胜利的是：player3 !"); 		        break; 	    	}  			p33=13-t3; 			if(Judgment(d,p1,p2,p4)==1){     	    	while(p3[k]==-1){         		k++; 	    		} 	    		p33=k,k=0; 	    		printf("player1: 要不起\nplayer2: 要不起\nplayer4: 要不起\n");     	    	printf("player3: %c \n",ch[p3[p33]]);     	    	k3=1;     	    	d=p3[p33];     	    	p3[p33]=-1;     	    	t3--;     	    	if(t3==0){ 		    	    printf("\n获得胜利的是：player3 !"); 		            break; 	        	}      	    	p33=13-t3; 	    	} 		}     	else{     		while(p3[p33]<=d&&p33<13){     			p33++; 			}	 			if(p33<13){ 			    printf("player3: %c \n",ch[p3[p33]]); 			    k3=1; 				d=p3[p33]; 				p3[p33]=-1; 				t3--; 			    if(t3==0){ 			        printf("\n获得胜利的是：player3 !"); 		            break; 	        	}  				p33=13-t3; 				if(Judgment(d,p1,p2,p4)==1){     	        	while(p3[k]==-1){             		k++; 	        	} 	    		p33=k,k=0; 	    		printf("player1: 要不起\nplayer2: 要不起\nplayer4: 要不起\n");     	    	printf("player3: %c \n",ch[p3[p33]]);     	    	k3=1;     	    	d=p3[p33];     	    	p3[p33]=-1;     	    	t3--;     	    	if(t3==0){ 		    	    printf("\n获得胜利的是：player3 !"); 		            break; 	        	}      	    	p33=13-t3; 	    	} 			} 			if(p33==13&&k3==1) printf("player3: 要不起\n"),k3=0,p33=13-t3; 		}  		if(p4[p44]>d){ 		    printf("player4: %c \n",ch[p4[p44]]); 		    k4=1; 			d=p4[p44]; 			p4[p44]=-1; 			t4--; 			if(t4==0){ 			    printf("\n获得胜利的是：player4 !"); 		        break; 	    	} 			p44=13-t4; 			if(Judgment(d,p1,p2,p3)==1){     	        while(p4[k]==-1){     	        k++; 		        } 	     	    p44=k,k=0; 		        printf("player1: 要不起\nplayer2: 要不起\nplayer3: 要不起\n");     	        printf("player4: %c \n",ch[p4[p44]]);     	        k4=1;     	        d=p4[p44];     	       	p4[p44]=-1;     	        t4--;          	    if(t4==0){ 			    printf("\n获得胜利的是：player4 !"); 		        break; 	            }     	        p44=13-t4; 	        } 		}     	else{     		while(p4[p44]<=d&&p44<13){     			p44++; 			} 			if(p44<13){ 			    printf("player4: %c \n",ch[p4[p44]]); 			    k4=1; 				d=p4[p44]; 				p4[p44]=-1; 				t4--; 				if(t4==0){ 			        printf("\n获得胜利的是：player4 !"); 		            break; 	    	    } 				p44=13-t4;  				if(Judgment(d,p1,p2,p3)==1){     	        	while(p4[k]==-1){     	        	k++; 		        	} 	     	     	p44=k,k=0; 		        	printf("player1: 要不起\nplayer2: 要不起\nplayer3: 要不起\n");     	        	printf("player4: %c \n",ch[p4[p44]]);     	        	k4=1;     	        	d=p4[p44];     	        	p4[p44]=-1;     	        	t4--;          	     	if(t4==0){ 			        printf("\n获得胜利的是：player4 !"); 		            break; 	             	}     	        	p44=13-t4; 	        	} 			} 			if(p44==13&&k4==1) printf("player4: 要不起\n"),k4=0,p44=13-t4; 		} 		if(p1[p11]>d){ 		    printf("player1: %c \n",ch[p1[p11]]); 		    k1=1; 			d=p1[p11]; 			p1[p11]=-1; 			t1--; 			if(t1==0){ 			    printf("\n获得胜利的是：player1 !"); 		    	break; 	    	} 			p11=13-t1; 			if(Judgment(d,p2,p3,p4)==1){     	    	while(p1[k]==-1){     			k++; 		    	} 		    	p11=k,k=0;  		    	printf("player2: 要不起\nplayer3: 要不起\nplayer4: 要不起\n");     	    	printf("player1: %c \n",ch[p1[p11]]);     	    	k1=1;     	    	d=p1[p11];     	    	p1[p11]=-1;     	    	t1--;     	    	if(t1==0){ 		        	printf("\n获得胜利的是：player1 !"); 		          	break; 		        }     	    	p11=13-t1; 	    	} 		}     	else{     		while(p1[p11]<=d&&p11<13){     			p11++; 			} 			if(p11<13){ 			    printf("player1: %c \n",ch[p1[p11]]); 			    k1=1; 				d=p1[p11]; 				p1[p11]=-1; 				t1--; 		    	if(t1==0){ 			        printf("\n获得胜利的是：player1 !"); 		        	break; 	        	} 				p11=13-t1;  				if(Judgment(d,p2,p3,p4)==1){     	        	while(p1[k]==-1){     	    		k++; 		    	} 		    	p11=k,k=0;  		    	printf("player2: 要不起\nplayer3: 要不起\nplayer4: 要不起\n");     	    	printf("player1: %c \n",ch[p1[p11]]);     	    	k1=1;     	    	d=p1[p11];     	    	p1[p11]=-1;     	    	t1--;     	    	if(t1==0){ 		    	printf("\n获得胜利的是：player1 !"); 		    	break; 	    	    }     	    	p11=13-t1; 	        	} 			} 			if(p11==13&&k1==1) printf("player1: 要不起\n"),k1=0,p11=13-t1; 		} 	}     return 0;  }  int Judgment(int d,int x[],int y[],int z[])  {  	int i,k=1;  	for(i=0;i<13;i++)  	{  	    if(d<x[i]||d<y[i]||d<z[i]){  	    	k=0;  	    	break; 		}	  	     	} 	return k; }还差点小问题，帮我整理一下好吗

引用 3 楼 寻开心的回复:https://bbs.csdn.net/topics/395382580 你看看，别人也是在自己尝试，你怎么就不行。 写啊 自己和自己说不行，那就真的不行  必须自己写开头， 可以给意见，可以帮改，但是必须自己动手做  要原码，自己百度去 #include<stdio.h> #include<time.h> #include<stdlib.h> int main() { 	int a[4][13],c,i,j,m, n=0,b[52]={0}; 	srand (time (NULL) ); 	for(i=0;i<4;i++) { 	for(j=0;j<13;j++){ 	a[i][j]=j+1; 	} } 	for (;n<=52;) { 	c=rand()%52; 	for (m=0;m<n;m++) { 	if(c==b[m]){ 	break; 	} 		} 	if(m==n){ 	b[n]=c; 	n++; 	printf ("%d\%c",a[c/13] [c%13],n%13==0 && n!=0?'\n':' '); 	} } 	return 0; }这个怎么把1 11 12 13换成AJQK啊，还有能给点出牌的详细思路吗

引用 1 楼 寻开心的回复:麻烦一点儿，似乎也没有什么难的 洗牌。 把牌放到一个数组里面，用随机指定交换的数组元素位置， 交换它百八十次就好了 分牌，也不是事儿  下面就模拟出牌的流程就好，主要是定义一个初级的人工智能规则，你可以自己定义        先出牌，如何做决策：  比如，可以挑最小的出，如果是多张，就出多张        如何跟牌的决策： 如果能管上上家， 就挑最小的能满足条件的牌来跟。 （这里可选择拆开或者不拆开多张牌）        没有可跟的牌，就放弃  这里只有人工智能的强弱是这个游戏的难点 能帮帮我写个程序嘛，我想了几天都没写出来


Question: 字符串连接， 这个程序没怎么看懂  使用 strcat() 连接两个字符串。

对 是的。 我一开始 没看到 那个分号 以为2个循环一起进行呢。

第一个for的作用就是让i指向到s1的字符串尾部，第二个for的作用就是就S2拼接到S1的尾部 s1[i]=s2[j]；假设第一个字符串长度是5的话，执行的效果是 s1[5]=s2[0] s1[6]=s2[1]

不好意思 我看懂了。 哈哈。     for(i = 0; s1[i] != '\0'; ++i); 后面带有分号


Question: C语言学生成绩管理系统

参考博客： https://blog.csdn.net/user-2/article/details/99734501


Question: 各位大佬帮忙看看这个从txt里读取数据哪里错了，谢谢大佬们

你的stu是野指针呢，你传递到ReadFile函数里，也是不能直接使用的。要么定义成数组，要么动态申请空间。  另外，去掉name之前的&，因为name是数组，本身就是地址


Question: 有序链表的建立

一个链表，用递归的方法建立，更简单，参考博客： https://gitee.com/shallwing/C-3P/blob/master/DataStructure-OS/DataStructure/linearList/list.cpp

#include<stdio.h> #include<malloc.h>  typedef struct node {     int data;     struct node *next; }Pnode;  Pnode *Build() {     int n;     printf("请输入节点数n:");     scanf("%d",&n);     Pnode *head,*now,*front;     //head==NULL;     head=NULL;     for(int i=0;i<n;i++)     {         now=(Pnode *)malloc(sizeof(Pnode));         scanf("%d", &now->data);         now->next=NULL;         if(head==NULL)         {             head=now;             front=now;         }         else         {             front->next=now;             front=now;         }     }     return head; } int main() {     Pnode *p;     p=Build();     printf("节点元素为\n");     while(p!=NULL)     {         printf("%3d",p->data);         p=p->next;     }     return 0; } 楼主的代码有个问题，已改正，供参考～  楼主的逻辑并没有对输入的随机数据建立一个有序链表，只能通过手动输入一个有序的链表～


Question: C语言

#include <stdio.h> int main() {     int i, n, tmp;     int A, B, C, D, E;      printf("Enter n: ");     scanf("%d", &n);      A = B = C = D = E = 0;      for (i = 1; i <= n; i++) {         printf("Enter grade %d: ",i);         scanf("%d", &tmp);         if (tmp > 100 || tmp < 0)             continue;         switch (tmp/ 10) {             case 10:             case 9:                 A++;                 break;              case 8:                 B++;                 break;              case 7:                 C++;                 break;              case 6:                 D++;                 break;              default:                 E++;         }     }      printf("The number of A(90 ~100):%d\n", A);     printf("The number of B(80 ~89):%d\n", B);     printf("The number of C(70 ~79):%d\n", C);     printf("The number of D(60 ~69):%d\n", D);     printf("The number of E(0 ~59):%d\n", E);      return 0; }  供参考～

引用 1 楼 @矛盾综合体 的回复:代码仅供参考，希望最好自己写一个属于自己的，而不是直接题目一发。。。。 #include<stdio.h> #include<string.h> int main() {   float i;   int j;   while(1)   {   	scanf("%f",&i); 	j=i/10; 	switch (j) 	{ 		case 10:; 		case 9: 		{ 			printf("A\n"); 		}break; 		case 8: 		{ 			printf("B\n"); 		}break; 		case 7: 		{ 			printf("C\n"); 		}break; 		case 6: 		{ 			printf("D\n"); 		}break; 		default: 		{ 			printf("E\n"); 		} 	}   }   return 0; }  结果图 编辑环境：sources insight   编译：gcc  如果要求百分以内，可以之前加一个判断是否为百分以内

#include <stdio.h>  void grade(unsigned int score){         switch(score/20){         case 0:                 printf("grade E\n");                 break;         case 1:                 printf("grade D\n");                 break;         case 2:                 printf("grade C\n");                 break;         case 3:                 printf("grade B\n");                 break;         case 4:                 printf("grade A\n");                 break;         default:                 printf("grade A\n");         } }  int main(int argc, char *argv[]){         unsigned int score = 0;         printf("请输入分值(0-100):");         scanf("%d", &score);         grade(score);         return 0;  }


Question: C语言统计不及格人数

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

引用 2 楼 ²⁰¹⁹₀₉.₀₁清梦的回复:是对的，别听1楼的，我都怀疑他有没有好好看你的代码。 putchar(' ');这条不用了，最后数据已经有空格了。 我没注册pta，不知道是不是和杭电oj差不多。 你这个只有一组数据有效，多组后面的都没有输入，不知道要不要用循环控制输入。 大神看一下我的第二个帖子，谢谢

引用 2 楼 ²⁰¹⁹₀₉.₀₁清梦的回复:是对的，别听1楼的，我都怀疑他有没有好好看你的代码。 putchar(' ');这条不用了，最后数据已经有空格了。 我没注册pta，不知道是不是和杭电oj差不多。 你这个只有一组数据有效，多组后面的都没有输入，不知道要不要用循环控制输入。 谢谢，已改，去掉就对了

引用 5 楼 自信男孩的回复:[quote=引用 4 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:] [quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:] 是对的，别听1楼的，我都怀疑他有没有好好看你的代码。 putchar(' ');这条不用了，最后数据已经有空格了。 我没注册pta，不知道是不是和杭电oj差不多。 你这个只有一组数据有效，多组后面的都没有输入，不知道要不要用循环控制输入。 还需要用循环控制输入吗？楼主已经有循环了。看来没好好看代码的不止我一个呢 最后的一条语句可有可不有，没有多大意义。但不会影响结果[/quote] 就只能处理一组数据，你说有循环？给你32个数据，就用了16个，剩下16个呢？[/quote] 我没看错吧，样例是输入16个，要求是输入32个吗？可能是我看错了～[/quote] 凡是做过oj的题都知道，要控制输入，并且控制输出，输出差一点都算WA，有些系统会判定为PE，你还说最后一条可有可无，666。有些题没有讲清楚到底是一组就够还是要测试多组数据，所以尽量考虑周全，我都说了没注册过pta，不然我刷杭电oj？没见过pta是怎么测评，题目给你这么一组你就只完成一组，也真吝啬。大部分都是多组数据要求解，我还就遇到一题没讲要多少组，结果一组够了，不用加循环控制输入。  题主中间那段是在记录每一列不及格数，用j跳下一个同学成绩，i是控制不同学科。  你改成i,j换位，下面的b[i]=temp不用修改吗？真是interesting，整个全乱了，你只改这一处知道数组b存的啥么？四个同学各不及格门数。  题主这样很清楚，先统计一列有多少不及格，然后给这一列不及格数存进数组。这一列就是这门不及格的学生人数。  改代码只改一处，改了以后又跳bug都不知道，还不知道咋回事，眼高手低，做事只看眼前。你咋这么6呢？

引用 4 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:[quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:] 是对的，别听1楼的，我都怀疑他有没有好好看你的代码。 putchar(' ');这条不用了，最后数据已经有空格了。 我没注册pta，不知道是不是和杭电oj差不多。 你这个只有一组数据有效，多组后面的都没有输入，不知道要不要用循环控制输入。 还需要用循环控制输入吗？楼主已经有循环了。看来没好好看代码的不止我一个呢 最后的一条语句可有可不有，没有多大意义。但不会影响结果[/quote] 就只能处理一组数据，你说有循环？给你32个数据，就用了16个，剩下16个呢？[/quote] 我没看错吧，样例是输入16个，要求是输入32个吗？可能是我看错了～

引用 3 楼 自信男孩的回复:[quote=引用 2 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:] 是对的，别听1楼的，我都怀疑他有没有好好看你的代码。 putchar(' ');这条不用了，最后数据已经有空格了。 我没注册pta，不知道是不是和杭电oj差不多。 你这个只有一组数据有效，多组后面的都没有输入，不知道要不要用循环控制输入。 还需要用循环控制输入吗？楼主已经有循环了。看来没好好看代码的不止我一个呢 最后的一条语句可有可不有，没有多大意义。但不会影响结果[/quote] 就只能处理一组数据，你说有循环？给你32个数据，就用了16个，剩下16个呢？

引用 2 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:是对的，别听1楼的，我都怀疑他有没有好好看你的代码。 putchar(' ');这条不用了，最后数据已经有空格了。 我没注册pta，不知道是不是和杭电oj差不多。 你这个只有一组数据有效，多组后面的都没有输入，不知道要不要用循环控制输入。 还需要用循环控制输入吗？楼主已经有循环了。看来没好好看代码的不止我一个呢 最后的一条语句可有可不有，没有多大意义。但不会影响结果

引用 6 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:[quote=引用 5 楼 自信男孩的回复:][quote=引用 4 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:] [quote=引用 3 楼 自信男孩的回复:][quote=引用 2 楼 ²⁰¹⁹₀₉.₀₁清梦 的回复:] 是对的，别听1楼的，我都怀疑他有没有好好看你的代码。 putchar(' ');这条不用了，最后数据已经有空格了。 我没注册pta，不知道是不是和杭电oj差不多。 你这个只有一组数据有效，多组后面的都没有输入，不知道要不要用循环控制输入。 还需要用循环控制输入吗？楼主已经有循环了。看来没好好看代码的不止我一个呢 最后的一条语句可有可不有，没有多大意义。但不会影响结果[/quote] 就只能处理一组数据，你说有循环？给你32个数据，就用了16个，剩下16个呢？[/quote] 我没看错吧，样例是输入16个，要求是输入32个吗？可能是我看错了～[/quote] 凡是做过oj的题都知道，要控制输入，并且控制输出，输出差一点都算WA，有些系统会判定为PE，你还说最后一条可有可无，666。有些题没有讲清楚到底是一组就够还是要测试多组数据，所以尽量考虑周全，我都说了没注册过pta，不然我刷杭电oj？没见过pta是怎么测评，题目给你这么一组你就只完成一组，也真吝啬。大部分都是多组数据要求解，我还就遇到一题没讲要多少组，结果一组够了，不用加循环控制输入。  题主中间那段是在记录每一列不及格数，用j跳下一个同学成绩，i是控制不同学科。  你改成i,j换位，下面的b[i]=temp不用修改吗？真是interesting，整个全乱了，你只改这一处知道数组b存的啥么？四个同学各不及格门数。  题主这样很清楚，先统计一列有多少不及格，然后给这一列不及格数存进数组。这一列就是这门不及格的学生人数。  改代码只改一处，改了以后又跳bug都不知道，还不知道咋回事，眼高手低，做事只看眼前。你咋这么6呢？[/quote] 你高兴怎么说就好，眼高手低，仅凭这一个帖子就能看出一个人眼高手低；另外，不要太情绪化～

要求是求一行中不及格的数目，所以判断应该是：  if (a[i][j] < 60)   //而不是a[j][i] 其他写的挺好～


Question: c语言字符数组

引用 5 楼 ymqCHO 的回复:[quote=引用 2 楼 fireyou 的回复：]gets读取到换行符结束，换行符不作为读取串的内容，读取的换行符被转换为‘\0’空字符，并由此来结束字符串 所以你的判断是有问题的 应该用 a[i] != '\0' 这样感谢你的回复 但我输入的字符串要求是以回车为结束标志...[/quote] 标准输入是属于行缓冲，必须回车才能把输入的内容从输入缓存里刷到内存里。～

引用 2 楼 fireyou 的回复：gets读取到换行符结束，换行符不作为读取串的内容，读取的换行符被转换为‘\0’空字符，并由此来结束字符串 所以你的判断是有问题的 应该用 a[i] != '\0' 这样感谢🙏你的回复 但我输入的字符串要求是以回车为结束标志...

PTA是什么呀？

a[i] != '\0' 如果用fgets接收输入，那么这儿也可以用a[i] != '\n'。（前提是输入的字符串长度小于80） 但是这儿是gets，不会把'\n'加入到a数组内，但是fgets会（当然也是有前提的，上面的也提示了）。

你这个main函数缺少return语句。


Question: 求助，我是初学者，帮忙查程序错误

#include<stdio.h> #include<stdlib.h> #define N 4 struct student {     //char xuehao;     //char name;     char xuehao[16];     char name[16];     int score1;     int score2;     int score3;     int score4;     double s; } str[30];  double func(int a,int b,int c,int d);  int main() {     struct student temp;     int i, k = 0;     double jidian[30];     FILE* fp;     if ((fp = fopen("D:\\ data.txt","r"))== NULL)     {         printf("无法打开文件\n");         getchar();         exit(1);     }     for (i = 0; i <30; i++)     {         //fscanf(fp, "%s%s%d%d%d%d", &str[i].xuehao, &str[i].name, &str[i].score1, &str[i].score2, &str[i].score3, &str[i].score4);         fscanf(fp, "%s%s%d%d%d%d", str[i].xuehao, str[i].name, &str[i].score1, &str[i].score2, &str[i].score3, &str[i].score4);         jidian[i]=func(str[i].score1,str[i].score2,str[i].score3,str[i].score4);         if (jidian[i]>5.99 && str[i].score1 >= 60 && str[i].score2>=60 && str[i].score3>= 60 && str[i].score4>=60)         {             str[i].s= (jidian[i] * 5 + 50) * 0.75 + (N * 0.25);             k++;         }     }     for(i=0;i<30;i++)     {   //这是做啥？按照每个成绩交换一下，那么如果是排序你是以那个为准呢？         if(str[i].score1<str[i+1].score1)         {             temp=str[i] ;             str[i]=str[i+1] ;             str[i+1]=temp;         }         if(str[i].score2<str[i+1].score2)         {             temp=str[i] ;             str[i]=str[i+1] ;             str[i+1] =temp;         }         if(str[i].score3<str[i+1].score3)         {             temp=str[i] ;             str[i]=str[i+1] ;             str[i+1]=temp;         }         if(str[i].score4<str[i+1].score4)         {             temp=str[i] ;             str[i]=str[i+1] ;             str[i+1]=temp;         }     }     printf("满足奖学金要求的名单\n");     printf("学号        姓名\n");     for (i = 0; i < k; i++)     {         printf("%s        %s    \n", str[i].xuehao, str[i].name);     }     printf("一等奖学金：\n");     printf("学号        姓名\n");     for (i = 0; i < 1; i++)     {         printf("%s        %s    \n", str[i].xuehao, str[i].name);     }     printf("二等奖学金：\n");     printf("学号        姓名\n");     for (i = 1; i < 4; i++)     {         printf("%s        %s    \n", str[i].xuehao, str[i].name);     }     printf("三等奖学金：\n");     printf("学号        姓名\n");     for (i = 4; i < k; i++)     {         printf("%s        %s    \n", str[i].xuehao, str[i].name);     }     fclose(fp);     getchar();     return 0; } double func(int A,int B,int C,int D) {     double j1,j2,j3,j4,jz;     if(A<60)     {         j1=0;     }     //else if(A=60)     else if(A==60)     {         j1=2;     }     else     {         j1=(A-60)*0.2+2;     }     if(B<60)     {         j2=0;     }     //else if(B=60)     else if(B==60)     {         j2=2;     }     else     {         j2=(B-60)*0.2+2;     }     if(C<60)     {         j3=0;     }     //else if(C=60)     else if(C==60)     {         j3=2;     }     else     {         j3=(C-60)*0.2+2;     }     if(D<60)     {         j4=0;     }     //else if(D=60)     else if(D==60)     {         j4=2;     }     else     {         j4=(D-60)*0.2+2;     }     jz=(j1*5+j2*6+j3*4+j4*3)/18;     return jz;   } 供参考～  没有测试，看到不对的地方就改了～


Question: 菜鸟，帮看下，关于冒泡排序，帮改下

#include<stdio.h>  void bubble_sort(int *a, int n);  int main() {     /*     int flag=0;      for (int i=9;i>0&&flag==0;i--)     {         //flag=1;         //for(int j=0;j<i;j++)         for(int j=0;j<i;j++)         {             if(a[j]>a[j+1])             {                 t=a[j];                 a[j]=a[j+1];                 a[j+1]=t;                 //flag=0;             }         }         printf("第%d轮结束时：\n",10-i);         for(int k=0;k<10;k++){             printf("a[%d]=%d\n",k,a[k]);         }     }     */ }  void bubble_sort(int *a, int n) {     int t;      for (int i=0;i < n;i++)     {         //flag=1;         //for(int j=0;j<i;j++)         for(int j=0;j < n - i -1; j++)         {             if(a[j]>a[j+1])             {                 t=a[j];                 a[j]=a[j+1];                 a[j+1]=t;                 //flag=0;             }         }         printf("第%d轮结束时：\n", i+1);         for(int k=0;k<10;k++){             printf("a[%d]=%d\n", k, a[k]);         }     } } 供参考～  楼主在main里用a，那么a在哪定义，需要遵循先定义后使用的原则～


Question: 10个数字里取出3位作为密码，除了多重循环，是否可以其他办法？

引用 6 楼 helloword222 的回复:可否指导一下更详细方法？ #5有代码了

引用 4 楼 lin5161678 的回复:[quote=引用 3 楼 helloword222 的回复:] [quote=引用 1 楼 寻开心 的回复:] for ( i =0; i<=999; i++ ) {    sprintf(pwd,  "%03d", i );    printf("%s ",pwd); } 谢谢，提供了很妙的思路。  再请问如果不但是数字，还有字符，是不是只能老老实实多重循环呢？ char N[]=     {         '0','1','2','3','4','5','6','a','b','c'     };[/quote]手动进位就可以了 [/quote] 可否指导一下更详细方法？  引用 4 楼 lin5161678 的回复:[quote=引用 3 楼 helloword222 的回复:] [quote=引用 1 楼 寻开心 的回复:] for ( i =0; i<=999; i++ ) {    sprintf(pwd,  "%03d", i );    printf("%s ",pwd); } 谢谢，提供了很妙的思路。  再请问如果不但是数字，还有字符，是不是只能老老实实多重循环呢？ char N[]=     {         '0','1','2','3','4','5','6','a','b','c'     };[/quote]手动进位就可以了 [/quote]  可否指导一下更详细方法？

引用 3 楼 helloword222 的回复:[quote=引用 1 楼 寻开心 的回复:] for ( i =0; i<=999; i++ ) {    sprintf(pwd,  "%03d", i );    printf("%s ",pwd); } 谢谢，提供了很妙的思路。  再请问如果不但是数字，还有字符，是不是只能老老实实多重循环呢？ char N[]=     {         '0','1','2','3','4','5','6','a','b','c'     };[/quote]手动进位就可以了

引用 1 楼 寻开心 的回复:for ( i =0; i<=999; i++ ) {    sprintf(pwd,  "%03d", i );    printf("%s ",pwd); } 谢谢，提供了很妙的思路。  再请问如果不但是数字，还有字符，是不是只能老老实实多重循环呢？ char N[]=     {         '0','1','2','3','4','5','6','a','b','c'     };

就是10 * 10 * 10这么多可能吧。  就是0~999个，输出出来就好了。


Question: 各位大佬，最后的printf里h+.0是什么意思

为匹配 %.2f的格式，直接放一个整数到参数里面是不行的， 必须是一个浮点数 你可以自己试试， printf（“%f”，  1）会打印出来个什么鬼  整数 + 浮点数 = 浮点数  h + .0. 就是这个目的， 数值没变，但是从整数变成了浮点数后作为实参传递给printf去使用


Question: 求教

引用 1 楼 寻开心的回复:isalpha函数就是判断字符是否是英文字母啊  你在ff函数里面用printf(%s), 输出一下str。 一个是在if语句里面str[j++] = str[i] 操作之后 一个是在str[j] = '\0'前和后  不会做断点调试，就多用几个printf来输出看看 好的，谢谢，我先试一下，如果有问题再请教。


Question: 回溯递归求解

用动态规划好些，


Question: 求一道题的解法

char *  week[] = {"Sunday", "Monday",......}  剩下就是拿输入的字符串，用strcmp和week【ℹ】去比较就好了  自己写代码去


Question: 求解

引用 1 楼 weixin_45945625 的回复:[quote=引用 楼主 weixin_45945625的回复:]某班级的考试随机号生成器。  运行系统，首先是 输入多少考生，例如50名，就输入50。之后，返回50个随机数，每个都是4位，每5个换一行，首位是0的要补0。返回格式为（数字都是举例）：  1:0381, 2:2520，3:0071, 4:7386, 5:2524, 6:0004, 7:8715, 8:2428, 9:4093, 10:1770, ......   显示完毕后 按任意键退出。 求大神帮忙用c语言做一下[/quote]  num = rand()% 10000; 若是num = 1;则printf("%04d\n", num);就是0001了。

引用 楼主 weixin_45945625的回复:某班级的考试随机号生成器。  运行系统，首先是 输入多少考生，例如50名，就输入50。之后，返回50个随机数，每个都是4位，每5个换一行，首位是0的要补0。返回格式为（数字都是举例）：  1:0381, 2:2520，3:0071, 4:7386, 5:2524, 6:0004, 7:8715, 8:2428, 9:4093, 10:1770, ......   显示完毕后 按任意键退出。 求大神帮忙用c语言做一下


Question: 求问

const char *p = "hello world";  char *split(char *q) {     return q+2; }  printf("%s",split(p) )


Question: 球球救救孩子吧

对head都没有赋值过， 直接head->next，那就更不可能对啦。

G.vertex[]这个数组里面的内容没有初始化啊，所以head值是野指针呢


Question: 结构体数组的函数引用

#include<stdio.h> #include <stdlib.h>  struct stu {     char no[100];     char name[100];     int a;     int b;     int c; };  void intput(struct stu s[],int n) {     int i=0;     for(i=0;i<n;i++)     {         scanf("%s%s%d%d%d",s[i].no,s[i].name,&s[i].a,&s[i].b,&s[i].c);     } } void print(struct stu s[],int n) {     int i=0;     for(i=0;i<n;i++)     {         printf("%s%s%d%d%d",s[i].no,s[i].name,s[i].a,s[i].b,s[i].c);     } } int main() {     int n;     scanf("%d",&n);     struct stu *s = (struct stu *)malloc(sizeof(struct stu) * n);     if (!s)         exit(-1);      intput(s,n);     print(s,n);      free(s);      return 0; } 供参考～  结构体要定义在前，因为自定义函数参数引用到结构体类型了。所以需要放在前面，先声明后使用嘛。 另外，n是动态值，因此建议用malloc/free

scanf("%d",&n); struct stu s[n]; 动态数组不支持吧？据说有些编译器支持，保险起见最好还是new或mallc动态申请内存


Question: 求助一道C语言程序设计题！

#include <stdio.h> int main() {     int i, n, tmp;     int A, B, C, D, E;      printf("Enter n: ");     scanf("%d", &n);      A = B = C = D = E = 0;      for (i = 1; i <= n; i++) {         printf("Enter grade %d: ",i);         scanf("%d", &tmp);         if (tmp > 100 || tmp < 0)             continue;         switch (tmp/ 10) {             case 10:             case 9:                 A++;                 break;              case 8:                 B++;                 break;              case 7:                 C++;                 break;              case 6:                 D++;                 break;              default:                 E++;         }     }      printf("The number of A(90 ~100):%d\n", A);     printf("The number of B(80 ~89):%d\n", B);     printf("The number of C(70 ~79):%d\n", C);     printf("The number of D(60 ~69):%d\n", D);     printf("The number of E(0 ~59):%d\n", E);      return 0; } 供参考～

#include <stdio.h> int main() {     int n,a[100],i,f,b,c,d,e;     printf("Enter n: ");     scanf("%d",&n);     /*     f==0;     b==0;     c==0;     d==0;     e==0;     */     b = c = d = e = f = 0;     for(i=1;i<=n;i++)     {         printf("Enter grade %d: ",i);         scanf("%d",&a[i]);         if (a[i] > 100 || a[i] < 0)             continue;         switch (a[i] / 10) {             case 10:             case 9:                 f++;                 break;              case 8:                 b++;                 break;              case 7:                 c++;                 break;              case 6:                 d++;                 break;              default:                 e++;         }         /*         if (a[i]>=90&&a[i]<=100)             f=f+1;         if (a[i]>=80&&a[i]<=89)             b=b+1;         if (a[i]>=70&&a[i]<=79)             c=c+1;         if (a[i]>=60&&a[i]<=69)             d=d+1;         if (a[i]>=0&&a[i]<=59)             e=e+1;             */     }     printf("The number of A(90 ~100):%d\n",f);     printf("The number of B(80 ~89):%d\n",b);     printf("The number of C(70 ~79):%d\n",c);     printf("The number of D(60 ~69):%d\n",d);     printf("The number of E(0 ~59):%d\n",e); } 供参考～ 不用数组也是可以的～自己可以用一个变量接收输入，自己试着改一下～

引用 2 楼 asd123214 的回复:fbcde应该是赋值才行 我开始的时候给fbcde赋值0了啊。。。还要怎么赋值能麻烦讲清楚一点吗大佬？

引用 1 楼 user-3 的回复:题目应该是循环一次输出一次吧  你这么写的话，如果我输入6次你怎么输出 确实是循环依次输出一次啊。就是先输入人数，然后根据人数来统计档位。

fbcde应该是赋值才行

fbcde应该是赋值才行

题目应该是循环一次输出一次吧  你这么写的话，如果我输入6次你怎么输出


Question: 基本语法求指点：( bg=1) 或 (bg=0) 的值是多少？

谢谢各位指点。不明白的，基本靠猜。有了各位的指导， 踏实多了

(*argv[argc-1]=='&') 这句是个判断表达式，结果是0,1；即，0表示假，1表示真。 b是接收0,1值的，也就是上面表达式的真假。最后b的值在于0比较。就是这些内容了～

if((bg=1)!=0)  等价于:  bg = 1; if(bg != 0)

bg 赋值之后 bg结果是什么  整个表达式的结果就是什么


Question: 求助

哦，我会了，我在括号里加了就行了，谢谢

在哪里加参数啊，能不能帮我改一下

scanf_s输入字符串时要提供一个数字表明最多读取多少个字符，作为第三个参数，防止溢出


Question: C语言求助字符串查找功能

#include <stdio.h> #include <stdlib.h> #include <string.h> struct workers { 	int number; 	char name[20]; 	int money; 	int times; }; struct workers e1, e2, e3, e4, e5; struct workers getInput(struct workers& p); void printpart(struct workers p);  struct workers getInput(struct workers& p) { 	printf("请输入工号："); 	scanf("%d", &p.number); 	printf("请输入姓名："); 	scanf("%s", p.name); 	printf("请输入工资："); 	scanf("%d", &p.money); 	printf("请输入工龄："); 	scanf("%d", &p.times); 	return p; }; void printpart(struct workers p) { 	printf("工号：%d\n", p.number); 	printf("姓名：%s\n", p.name); 	printf("工资：%d\n", p.money); 	printf("工龄：%d\n", p.times); }; int main() { 	int i = 10; 	while (i != 0) 	{ 		printf("\t\t\t*********************************\n"); 		printf("\t\t\t*     请输入1或2，进行的操作!   *\n"); 		printf("\t\t\t*\t     1.查找（按工号）\t*\t\n"); 		printf("\t\t\t*\t     2.输入并输出\t*\n"); 		printf("\t\t\t*\t     3.查找（按姓名）\t*\n"); 		printf("\t\t\t*********************************\n"); 		printf("\t\t\t*\t退出程序，请输入0\t*\n"); 		printf("\t\t\t*********************************\n"); 		printf("\t\t\t\t请输入:"); 		scanf("%d", &i); 		system("cls"); 		switch (i) 		{ 		case 0: break; 		case 1: 		{int x; 		printf("请输入要查找的工号："); 		scanf("%d", &x); 		if (x == e1.number) 		{ 			printpart(e1); 		} 		else if (x == e2.number) 		{ 			printpart(e2); 		} 		else if (x == e3.number) 		{ 			printpart(e3); 		} 		else if (x == e4.number) 		{ 			printpart(e4); 		} 		else if (x == e5.number) 		{ 			printpart(e5); 		} 		else printf("没有"); 		} 		case 2: 		{struct workers e1, e2, e3, e4, e5; 		printf("请输第一个职工信息！\n"); 		e1 = getInput(e1); 		printf("请输第二个职工信息！\n"); 		e2 = getInput(e2); 		printf("请输第三个职工信息！\n"); 		e3 = getInput(e3); 		printf("请输第四个职工信息！\n"); 		e4 = getInput(e4); 		printf("请输第五个职工信息！\n"); 		e5 = getInput(e5); 		system("cls"); 		printf("第一个职工信息为：\n"); 		printpart(e1); 		printf("第二个职工信息为：\n"); 		printpart(e2); 		printf("第三个职工信息为：\n"); 		printpart(e3); 		printf("第四个职工信息为：\n"); 		printpart(e4); 		printf("第五个职工信息为：\n"); 		printpart(e5); 		system("pause"); 		system("cls"); 		break; 		} 		case 3: 		{ 			char y[20]; 		printf("请输入要查找的姓名："); 		scanf("%s", y); 		if (strcmp(y,e1.name)==0) 		{ 			printpart(e1); 		} 		else if (strcmp(y, e2.name) == 0) 		{ 			printpart(e2); 		} 		else if (strcmp(y, e3.name) == 0) 		{ 			printpart(e3); 		} 		else if (strcmp(y, e4.name) == 0) 		{ 			printpart(e4); 		} 		else if (strcmp(y, e5.name) == 0) 		{ 			printpart(e5); 		} 		else printf("没有对应信息！"); 		} 		} 	} 	return 0; }  VS2015调试

你这个代码能编译得过去吗？  1 struct works还没有定义，就声明了一堆变量， 不需要把struct works提前吗  2 struct works getinput（struct works p）； 这个函数不应该这样的   应该是 void. getinput(struct works * p);   否则你返回不了正确的结果，你的程序能跑，纯属特例  3  char y;     printf("请输入要查找的姓名：");     scanf("%s",&y);     if(y==e1.name)     { char类型的y和字符数组类型的name判断==就是你的问题 y也需要是一个char [] 而且比较也不能有 ==， == 是判断两个指针是否相同， 而你要的是字符串内容是否相同，要用strcmp函数来实现


Question: 这个问题出在哪里了？求解答

引用 6 楼 pritelee 的回复：你这代码按回车不是other++吗 daxiezimu和xiaoxie字母反了好的谢谢

引用 7 楼 寻开心 的回复：#include<stdio.h> #include<string> int main() { char string(char str); // 这一句是函数提前声明， 不是调用。 后面定义的string函数根本不会被执行 // char str 这样的定义参数，也很容易产生错误理解。 char字符， str一般都是字符串，他们不是同一个类型。起名字要注意一点儿 int daxiezimu,xiaoxiezimu, space, shuzi, other; printf("请输入：\n"); scanf_s("%d%d%d%d%d", &daxiezimu, &xiaoxiezimu, &space, &shuzi, &other); printf("个数：%d%d%d%d%d", daxiezimu, xiaoxiezimu, space, shuzi, other); } char string(char str)  { char c; int daxiezimu=0, xiaoxiezimu=0, space=0, shuzi=0, other=0; while ((c = getchar()) != '\n') { if ('a' < c&&c < 'z') daxiezimu++; if ('A' < c&&c < 'Z') xiaoxiezimu++; if (c == ' ') space++; if ('0' < c&&c < '9') shuzi++; else other++; // 这里都应该是<=,  而且大小写字母的位置放反了，如同楼上说的 , } return 0; }好的，谢谢

你这代码按回车不是other++吗 daxiezimu和xiaoxie字母反了

scanf_s("%d，%d，%d，%d，%d", &daxiezimu, &xiaoxiezimu, &space, &shuzi, &other); 这样也行，每次输入用逗号分隔， 如果scanf("%d",xxx),的话，第二个scanf开始要在%d前加空格清除上次输入的换行，即scanf(" %d",xxx)；

引用 3 楼 一条不会飞的鱼 的回复：一个一个输入吧，scanf("%d",xxx),这样不容易错，不然计算机怎么区分你什么时候输入第二个值好，谢啦

引用 1 楼 一条不会飞的鱼 的回复：scanf_s("%d%d%d%d%d", &daxiezimu, &xiaoxiezimu, &space, &shuzi, &other); 这句感觉不妥不知道怎么改了


Question: PTA

第一个while循环结束时，p已经指向结束符'\0'了，需要执行一次p--，使其指向最后一个字符。 同样，for循环结束时，p是第一个字符的前一个地址，不确定值，需要执行一次p++,使其指向第一个字符。

void fun(char *s, char *t) {   char *p = s;    while (*p) p++;   while (--p >= s) *t++ = *p;   while (*++p) *t++ = *p;   *t = 0; }


Question: 求助！

scanf("lf", &comm[m].price);

单价和数量 需要 获取输入需要加   &  符号


Question: 任意一个大于6且小于100的偶数可以拆分为两个素数

引用 2 楼 shanghai985 的回复:[quote=引用 1 楼 user-1的回复:]j不能大于i if里面的代码永远不执行 改为i＝＝j＋1 可以吗？[/quote]一样永远不成立

引用 1 楼 user-1的回复:j不能大于i if里面的代码永远不执行 改为i＝＝j＋1 可以吗？

j不能大于i if里面的代码永远不执行


Question: 一个二维数组a［5］［5］   那*（a＋2）代表的是什么，我感觉代表的是a［2］［0］的值，但是我们用的教材上说的是a［2］［0］的地址

关键如何理解 a 以及索引操作符号  int  a[5] ;      a是一个 int类型的数组     内容以int为单位挨个放到内存当中                      基于这点上a和int*有些类似， a+1 就是下一个int数据  int  a[5][5]   a是一个int [5]类型的数组，把int【5】这种类型的数据挨个放到相邻的内存当中                    所以a+1 在这里，就是下一个int[5]类型数据                    也正是因为这种关系， 二维数组的数据也完全能用一维的指针加以直接访问  千万不要把a[5][5]理解成int**类型，他们差距很大

*（a＋2）等价a[2]， a[2]就是a[2][0]的地址，可以%p打印一下a[2]， &a[2][0]的地址，其实是一样的。

上机一试便知。

a 是一个 int[5][5] 类型的表达式  a[2]是一个 int[5]类型的表达式   int[5]类型的表达式不可能是 a［2］［0］的值


Question: 恳请大家帮帮我，谢谢大家了。

数组传递 只能传递一个指针。。 您这写的是2个数组。 您用的什么编译器？

引用 2 楼 寻开心的回复:1 不会  没见过这种定义函数的， 只有参数名，没有参数类型， 在函数体外还能写啥呢  2  * （src+i ） 3 * （des+i） 4 * （src+i） 5 str_cpy(str1, str2); 可能是我的编译器的问题，我觉得吧第一个填char des...[20],sou...[20]应该没啥问题，谢谢您的回复

3  和 4 么写的不是重复了吗？  第一个确实没什

引用 楼主 weixin_45828108的回复:第四小题第一个空，卷子从别人那拿的，他写的大多不对。折腾了好久我也不知道这个填什么。恳请各位哥哥帮帮忙，下午就考试了。 请问大家这个怎么在外面定义指针呀


Question: 求不少于120行的c语言程序及注释..简单一点，才大一

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

引用 1 楼 自信男孩 的回复：没有什么需求吗？只是要代码吗？如果这样，建议百度一下吧，比如找求素数等等。没有特别的需求，只要代码，但是需要项目简介

引用 1 楼 自信男孩 的回复：没有什么需求吗？只是要代码吗？如果这样，建议百度一下吧，比如找求素数等等。我看了找素数的，只有50多行

没有什么需求吗？只是要代码吗？如果这样，建议百度一下吧，比如找求素数等等。

//////////////////////////////////////////////////////////////////////// //文件名: void_pointer.c //作者: cfjtaishan //日期: 2013-03-21 //描述: 泛型函数指针的运用. //说明: //    1. 实现了整型数组的求最大元素和字符串数组汇总求最大的字串; //    2. 实现了对整型数组和字符串数组进行冒泡排序; ////////////////////////////////////////////////////////////////////////  #include <stdio.h> #include <stdlib.h> #include <time.h> #include <string.h>  //这两个宏用于作为编译开关 #define INTEGE #define STRING   #define LEN 10 #define DAYS 7  //声明泛型函数指针 typedef int (*pfunc)(const void *, const void *); typedef void (*fswap)(void *, void *);  //函数声明 int compare_intege(const void *a, const void *b); int compare_string(const void *a, const void *b); void swap_for_intege(void *p, void *q); void swap_for_string(void *p, void *q); void *my_max(void *pbuf, const int len, const int size, pfunc cmp); void bubble_sort(void *pbuf, const int len, const int size, pfunc cmp, fswap swap); void initize_arr(int *arr, const int len); void show_arr(const int *arr, const int len);  int main(int argc, char *argv[]) { #ifdef INTEGE     int arr[LEN], *max;     initize_arr(arr, LEN);     printf("Show the arr arguments: \n");     show_arr(arr, LEN);     max = (int *)my_max(arr, LEN, sizeof(int), compare_intege);     printf("Max integer is %d\n", *max);     bubble_sort(arr, LEN, sizeof(int), compare_intege, swap_for_intege);     printf("After sort: \n");     show_arr(arr, LEN); #endif  #ifdef STRING     int i;     char *week[DAYS] =      { "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"};     char **max_str = (char **)my_max(week, DAYS, 4, compare_string);    //指针长度为4 	printf("--------------------------------------------------------------\n"); 	printf("Max string is ");     puts(*max_str);     bubble_sort(week, DAYS, 4, compare_string, swap_for_string);    //指针长度为4     printf("After bubble sort: \n");      for (i = 0; i < DAYS; i++)     {         printf("%s  ", week[i]);     }     putchar('\n'); #endif          return 0; }  ////////////////////////////////////////////////////////////////////////// // 函数名: initize_arr // 描述 : 初始化数组。 // 参数:  //    [in/out] arr -- 整型数组的首地址; //    [in] len -- 整型数组最大长度; // 返回值: 无。 // 说明:  ////////////////////////////////////////////////////////////////////////// void initize_arr(int *arr, const int len) {     int i;     srand(time(NULL));          for (i = 0; i < len; i++)     {         arr[i] = rand() % 1000;    //产生1000以内的随机数     } }  ////////////////////////////////////////////////////////////////////////// // 函数名: show_arr // 描述 : 打印数组元素值。 // 参数:  //    [in] arr -- 整型数组的首地址; //    [in] len -- 整型数组最大长度; // 返回值: 无。 // 说明:  ////////////////////////////////////////////////////////////////////////// void show_arr(const int *arr, const int len) {     int i;          for (i = 0; i < len; i++)     {         printf("%d  ", arr[i]);     }     putchar('\n'); }  ////////////////////////////////////////////////////////////////////////// // 函数名: compare_intege // 描述 : 比较两个整数的大小。 // 参数:  //    [in] a -- 一个整型数据的地址; //    [in] b -- 另一个整型数据的地址; // 返回值:  //    若*a > *b，则返回正整数； //    若*a == *b 则返回0； //    若*a < *b，则返回负正整数; // 说明:  ////////////////////////////////////////////////////////////////////////// int compare_intege(const void *a, const void *b) {     return *(int*)a - *(int *)b; }  ////////////////////////////////////////////////////////////////////////// // 函数名: compare_string // 描述 : 比较两个字符串的大小。 // 参数:  //    [in] a -- 一个字符串的地址; //    [in] b -- 另一个字符串的地址; // 返回值:  //    和strcmp的返回相同. // 说明:  ////////////////////////////////////////////////////////////////////////// int compare_string(const void *a, const void *b) {     return strcmp(*(char **)a, *(char **)b); }  ////////////////////////////////////////////////////////////////////////// // 函数名: my_max // 描述 : 求数据集中的最大值。 // 参数:  //    [in/out] pbuf -- 泛型数据的首地址; //    [in] len -- 泛型数据的最大长度; //    [in] size -- 泛型数据的长度; //    [in] cmp -- 回调函数; // 返回值:  //    最大数据的首地址. // 说明:  ////////////////////////////////////////////////////////////////////////// void *my_max(void *pbuf, const int len, const int size, pfunc cmp) {     char *max = pbuf;     int i;     for (i = 0; i < len; i++)     {         if (cmp(max, pbuf + i * size) < 0)         {             max = pbuf + i * size;         }     } 	     return max; }  ////////////////////////////////////////////////////////////////////////// // 函数名: bubble_sort // 描述 : 冒泡排序。 // 参数:  //    [in/out] pbuf -- 泛型数据的首地址; //    [in] len -- 泛型数据的最大长度; //    [in] size -- 泛型数据的长度; //    [in] cmp -- 回调函数; //    [in] swap -- 回调函数; // 返回值: 无. // 说明:  ////////////////////////////////////////////////////////////////////////// void bubble_sort(void *pbuf, const int len, const int size, pfunc cmp, fswap swap) {     int i, j;          for (i = 0; i < len - 1; i++)     {         for (j = 0; j < len - i -1; j++)         {             if (cmp(pbuf + j * size, pbuf + (j + 1) * size) > 0)             {                 swap(pbuf + j * size, pbuf + (j + 1) * size);             }         }     } }  ////////////////////////////////////////////////////////////////////////// // 函数名: swap_for_intege // 描述 : 交换两个数据。 // 参数:  //    [in] p -- 一个整型数据的地址; //    [in] q -- 另一个整型数据的地址; // 返回值: 无. // 说明:  ////////////////////////////////////////////////////////////////////////// void swap_for_intege(void *p, void *q) {     int tmp;     tmp = *(int*)p;     *(int *)p = *(int *)q;     *(int *)q = tmp; }  ////////////////////////////////////////////////////////////////////////// // 函数名: swap_for_string // 描述 : 交换两个数据。 // 参数:  //    [in] p -- 一个字符串的地址; //    [in] q -- 另一个字符串的地址; // 返回值: 无. // 说明:  ////////////////////////////////////////////////////////////////////////// void swap_for_string(void *p, void *q) {     char *str;     str = *(char **)p;     *(char **)p = *(char **)q;     *(char **)q = str; } 供参考～


Question: 求大神指点

改好了，谢谢指点

这是个什么算法啊？ 把两个字符串的首字母放到字符串中间 然后这个循环 for(i=0,j=0;i<len,j<len1;i++,j++) 中间的 i<len,j<len1这是个什么意思？   应该 i<len && j<len1 吧。  最关键的是折腾了那么多，没有看出来和吨米微要求有个球关系  应该是从两个字符串的尾巴开始向前逐个比对， 如果后输入的字符串结束了还是一直和前一个字符串内容一样就输出匹配 函数进来要先判断两个长度，如果后一个比前一个长直接输出不匹配就好了。 然后再从尾巴到前的比对


Question: 有没有大佬知道这该怎么办

没有在这些函数声明之前定义这个结构吧

问题要从上向下一个一个的改，  他们彼此之间相互影响的 改了第一个，看看后面还有什么问题， 再贴出来看

引用 1 楼 寻开心的回复:没有在这些函数声明之前定义这个结构吧 那下面的警告呢，该怎么改


Question: 请教将十进制正整数转换为二进制时出错的原因

函数里面应该采用静态变量吧

引用 3 楼 qq_45979829的回复:[quote=引用 1 楼 留校察看（R）的回复:]函数里面应该采用静态变量吧 #include<stdio.h> int main(){ int a; void DecimalToBinaryConversion(int n); printf("请输入十进制正整数:"); scanf("%d",&a); printf("对应的二进制数为："); DecimalToBinaryConversion(a); return 0;}  void DecimalToBinaryConversion(int n) {static short int x[32]={0}; int i=0; for(i=0;i<=31;i++)     {x[i]=n%2;     if(n/2!=1) n=n/2;     else x[i+1]=n/2;break;}     printf("%d\n",x[1]); for(i=31;i>=0;i--){    if(x[i]==0)continue;    else for(;i>=0;i--)             printf("%d",x[i]);}     }[/quote] 我在第一个判断语句后面加上break；语句后至少前三个数是没问题的

引用 1 楼 留校察看（R）的回复:函数里面应该采用静态变量吧 #include<stdio.h> int main(){ int a; void DecimalToBinaryConversion(int n); printf("请输入十进制正整数:"); scanf("%d",&a); printf("对应的二进制数为："); DecimalToBinaryConversion(a); return 0;}  void DecimalToBinaryConversion(int n) {static short int x[32]={0}; int i=0; for(i=0;i<=31;i++)     {x[i]=n%2;     if(n/2!=1) n=n/2;     else x[i+1]=n/2;break;}     printf("%d\n",x[1]); for(i=31;i>=0;i--){    if(x[i]==0)continue;    else for(;i>=0;i--)             printf("%d",x[i]);}     }

引用 1 楼 留校察看（R）的回复:函数里面应该采用静态变量吧 一开始我也是定义为静态变量的，但是代入几个数发现结果是一样的，就把静态声明删掉了


Question: 急急急！！！求助，敢死队问题新演化

构建一个循环数组来实现就好了 输入n,m，k 建立一个长度n的数组，初始化内容都是0 做一个计数器c，初始化为n 定义一个 位置变量i=0 写个while(1)循环       从i开始，向后找到第m个数组值为0的，找的过程当中每移动一次 i%=n操作一次，确保i在数组有效范围内             找到后把数组对应的数值设置为1，表示已经扔下海去了，c--，判断c是否到==n/2 决定是否退出循环       从i+1 开始向前找k个数组值为0的， 过程当中i每次减一个，都要判断i是否<0 小于0 i +=n，确保i在有效范围内             找到后，数组对应的数值设为1， 表示又扔下去一个，c--， 判断处是否==n/2 决定是否退出循环  代码自己写吧， 有问题贴代码  你要是熟悉指针，用双向循环链表，初始化把1到n都放进去， 然后指针前后移动，遇到扔的就从链表当中摘除 这个更直观，代码也复杂不要哪儿去

哦 回复错题目了  应该是 约瑟夫环  百度查找一下有很多介绍

比较简单的用memmove 借助临时数组存数据 三次函数调用就完成了


Question: 【c语言入门题】字符串倒序

while(scanf("#\n")!=EOF) 代码不能运行，看一下这句是什么意思？没遇到过～

#include<stdio.h> #include<string.h>  int main() {     char str[128], words[10][128];     int i, j, k;     int flag = 0, pos, cnt = 0;      while (fgets(str, 128, stdin) && str[0] != '\n') {         if (strncmp(str, "#", 1) == 0 && !flag) {             flag = 1;    //start             continue;         }         if (strncmp(str, "#", 1) == 0 && flag) {             flag = 0;    //end;             //printf("cnt = %d\n", cnt);             for (k = 0; k < cnt; k++) {                 //printf("%s", words[k]);                 pos =  0;                 for (i = 0; words[k][i]; i++) {                     if (words[k][i] == ' ' || words[k][i] == '\n') {                         for (j = i-1; j >= pos; j--)                             putchar(words[k][j]);                         pos = i+1;                         putchar(words[k][i]);                     }                 }             }             cnt = 0;             continue;         }         if (cnt < 10)             strcpy(words[cnt++], str);     }     /*        while(scanf("#\n")!=EOF)        {        char c,a[1000][1000]={0};        int i,j,num=0,len;        for(i=0;(c=getchar())!='#';i++)        {        for(j=0;;j++)        {        if(c=='\n')        break;        else a[i][j]=c;        }        num++;        }        for(i=0;i<num;i++)        {        len=strlen(a[i]);        for(j=len-1;j>=0;j--)        {        printf("%c",a[i][j]);        }        printf("\n");        }        }        */     return 0; }  供参考～  测试最后输入一个回车退出程序～


Question: 拓扑排序问题，求解为什么提交答案错误


Question: 函数

噢噢，蟹蟹，我改一下

p=(a+b+c)/2;首先abc还没输入，就先计算p是不对的 其次if else的判断是否有误？三角形不是两边和大于第三边吗？也就是i是非0，进入if分支

引用 6 楼 寻开心的回复:t=area(p,p-a,p-b,p-c); 需要这样， 不是t=area(p,a-p,b-p,c-p); 其他应该没问题了吧

引用 6 楼 寻开心的回复:t=area(p,p-a,p-b,p-c); 需要这样， 不是t=area(p,a-p,b-p,c-p); 我心里想的是对的，但打的时候太快了，就搞错了

引用 5 楼 寻开心的回复:j=red(a-b,c)&&red(a-c,b)&&plus(b-c,a); 噢噢噢，太马虎了

j=red(a-b,c)&&red(a-c,b)&&plus(b-c,a);

为什么还是不对呐，帮忙看看

#include<stdio.h>   #include<math.h>  int plus(float x,float y);  int red (float m,float n);  float  area(float p,float a,float b,float c);  int plus(float x,float y)  {return (x>y);  }  int red (float m,float n)  {return (m<n);  }  float area(float p,float a,float b,float c)  {  return(sqrt(p*a*b*c));  }  int main()  {float a,b,c,t;  int i,j,p;  printf("请输入你要判断的三个数：");  scanf("%f%f%f",&a,&b,&c);  p=(a+b+c)/2;  i=plus(a+b,c)&&plus(a+c,b)&&plus(b+c,a);  j=red(a-b,c)&&red(a-c,b)&&plus(b-c,a);  if(i==1&&j==1)  	{   		t=area(p,a-p,b-p,c-p);  		printf("%f",t);	  	}   else  printf("输入的三个数不能构成三角形");   }


Question: 大佬们帮帮忙

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

a没有定义，也没有赋初值0 所有的字符串类型都定义错了，应该定义成char str[MAX],MAX=20


Question: 循环单链表？

引用 1 楼 與蘤舊縐的回复:没有头结点就用二级指针呗，然后那啥那啥不就合起来了吗 你说的时间复杂度是O(n+m)

引用 1 楼 與蘤舊縐的回复:没有头结点就用二级指针呗，然后那啥那啥不就合起来了吗 忘了说了，时间复杂度要为1

没有头结点就用二级指针呗，然后那啥那啥不就合起来了吗


Question: 基于winpacp的arp欺骗实验，编译一直出错，大家可以帮忙看看嘛？

ARPSpoofing怎么定义呀？

这种错误一般是头文件之间存在冲突，可能是调整顺序就能搞定，也可能不是。另外，conio.h这个头文件很少用，可以去掉或者放在其它文件里面

c:\wpdpack_4_1_2\wpdpack\include\pcap-stdinc.h(79) : error C2144: syntax error : missing ';' before type 'unsigned int' c:\wpdpack_4_1_2\wpdpack\include\pcap-stdinc.h(79) : fatal error C1004: unexpected end of file found Error executing cl.exe. 提示是这样的

这只是警告，有错误要发出来提示信息，没办法给你编译

这只是警告，有错误要发出来提示信息，没办法给你编译


Question: 啊啊啊球球大佬快救救我这个无能学生!我究竟是哪个循环出毛病了啊!

char *t *s;   =>  char t[100] ＝ {0}；  char s[100] = {0}; 你只是定义了一个野指针，使用数组的话，计算机会给你分配内存空间。

引用 2 楼 weixin_46002037 的回复:[quote=引用 1 楼 user-3的回复:]t,s都没有初始化给分配空间 求细讲该改些什么，枯了[/quote] 这个要看你学了什么，如果没学分配内存那就预设个长度，比如char t[100],s[100]

引用 1 楼 user-3的回复:t,s都没有初始化给分配空间 求细讲该改些什么，枯了

t,s都没有初始化给分配空间


Question: c语言如何实现word类似自动换行功能

假如一行最大N个字符 获得字符串长度后， 判断第N+1个是否是空格，如果是直接断开；否则从这个位置向前找到第一个空格断开，如果找不到也只有硬断开了 第二行对剩下的字符串做同样的处理就好了


Question: 关于C语言编程题出现TLE超时。

引用 14 楼 遇见女神的回复:用这个方法就可以用O（n）的时间找到每个数组元素a[i](i=0,...,n-1)为最小值时对应的长度L(k)(k=1,...,n)，从而得到L[k]=a[i]！ 太感谢了！时间问题已经解决了。

这种数据规模应该有O(nlogn)的算法吧（当然，有可能O(n^2)也行，毕竟限制是10s，外加已经2019年了)

引用 8 楼 遇见女神的回复:预处理O(n)的方法找到了：找下一个较大的数。 剩下的就是O(1)的查询了 那个不好意思……没有看懂。。

引用 12 楼 路何求的回复:[quote=引用 11 楼 遇见女神的回复:][quote=引用 9 楼 路何求 的回复：][quote=引用 8 楼 遇见女神的回复:]预处理O(n)的方法找到了：找下一个较大的数。 剩下的就是O(1)的查询了 那个不好意思……没有看懂。。[/quote]那个题目英文名叫next greater number，就是用一样的方法，双端队列或者栈的数据结构，用最大数据测试运行时间不到1ms[/quote] 感觉好像不适用于这一题。求出每个长度的子序列的最大Weight值似乎没法这样子实现。[/quote] 还是得先说一声谢谢了。

引用 11 楼 遇见女神的回复:[quote=引用 9 楼 路何求 的回复：][quote=引用 8 楼 遇见女神的回复:]预处理O(n)的方法找到了：找下一个较大的数。 剩下的就是O(1)的查询了 那个不好意思……没有看懂。。[/quote]那个题目英文名叫next greater number，就是用一样的方法，双端队列或者栈的数据结构，用最大数据测试运行时间不到1ms[/quote] 感觉好像不适用于这一题。求出每个长度的子序列的最大Weight值似乎没法这样子实现。

引用 9 楼 路何求 的回复：[quote=引用 8 楼 遇见女神的回复:]预处理O(n)的方法找到了：找下一个较大的数。 剩下的就是O(1)的查询了 那个不好意思……没有看懂。。[/quote]那个题目英文名叫next greater number，就是用一样的方法，双端队列或者栈的数据结构，用最大数据测试运行时间不到1ms

预处理O(n)的方法找到了：找下一个较大的数。 剩下的就是O(1)的查询了

引用 3 楼 路何求 的回复:[quote=引用 2 楼 路何求的回复:][quote=引用 1 楼 遇见女神的回复:]N是10^5，也就是10万，N^2，也就是10万的平方，即是一百亿。1400ms跑一百亿次循环，也就是1秒半时间，不错。 1.5秒是用N×0.5×10^5得出来的结果。可是题目还是TLE，我不知道是我题意理解有误，还是有更好的方法。[/quote] N＝0.5×10^5[/quote] 显然，对于每个询问都需要O(N)的时间，并且有最多M次不同的询问，这里N<=10^5，M<=10^5，最大也就是需要一百亿次循环，那么题目时间限制是多少呢？

引用 6 楼 路何求 的回复：[quote=引用 4 楼 遇见女神的回复:][quote=引用 3 楼 路何求 的回复:] [quote=引用 2 楼 路何求的回复:][quote=引用 1 楼 遇见女神的回复:]N是10^5，也就是10万，N^2，也就是10万的平方，即是一百亿。1400ms跑一百亿次循环，也就是1秒半时间，不错。 1.5秒是用N×0.5×10^5得出来的结果。可是题目还是TLE，我不知道是我题意理解有误，还是有更好的方法。[/quote] N＝0.5×10^5[/quote] 显然，对于每个询问都需要O(N)的时间，并且有最多M次不同的询问，这里N<=10^5，M<=10^5，最大也就是需要一百亿次循环，那么题目时间限制是多少呢？[/quote] 我也有在想是不是我题意理解出现偏差[/quote]那你把数据都调整到最大限度后的运行时间是多少呢？

引用 4 楼 遇见女神的回复:[quote=引用 3 楼 路何求 的回复:] [quote=引用 2 楼 路何求的回复:][quote=引用 1 楼 遇见女神的回复:]N是10^5，也就是10万，N^2，也就是10万的平方，即是一百亿。1400ms跑一百亿次循环，也就是1秒半时间，不错。 1.5秒是用N×0.5×10^5得出来的结果。可是题目还是TLE，我不知道是我题意理解有误，还是有更好的方法。[/quote] N＝0.5×10^5[/quote] 显然，对于每个询问都需要O(N)的时间，并且有最多M次不同的询问，这里N<=10^5，M<=10^5，最大也就是需要一百亿次循环，那么题目时间限制是多少呢？[/quote] 我也有在想是不是我题意理解出现偏差

引用 4 楼 遇见女神的回复:[quote=引用 3 楼 路何求 的回复:] [quote=引用 2 楼 路何求的回复:][quote=引用 1 楼 遇见女神的回复:]N是10^5，也就是10万，N^2，也就是10万的平方，即是一百亿。1400ms跑一百亿次循环，也就是1秒半时间，不错。 1.5秒是用N×0.5×10^5得出来的结果。可是题目还是TLE，我不知道是我题意理解有误，还是有更好的方法。[/quote] N＝0.5×10^5[/quote] 显然，对于每个询问都需要O(N)的时间，并且有最多M次不同的询问，这里N<=10^5，M<=10^5，最大也就是需要一百亿次循环，那么题目时间限制是多少呢？[/quote] 题目限制是10000ms

引用 2 楼 路何求的回复:[quote=引用 1 楼 遇见女神的回复:]N是10^5，也就是10万，N^2，也就是10万的平方，即是一百亿。1400ms跑一百亿次循环，也就是1秒半时间，不错。 1.5秒是用N×0.5×10^5得出来的结果。可是题目还是TLE，我不知道是我题意理解有误，还是有更好的方法。[/quote] N＝0.5×10^5

引用 1 楼 遇见女神的回复:N是10^5，也就是10万，N^2，也就是10万的平方，即是一百亿。1400ms跑一百亿次循环，也就是1秒半时间，不错。 1.5秒是用N×0.5×10^5得出来的结果。可是题目还是TLE，我不知道是我题意理解有误，还是有更好的方法。


Question: 循环右移

代码应该没问题 #include <stdio.h>  int main() { 	int a[10]; 	int b[10]; 	int x, i=0, m, n, y; 	scanf("%d", &n); 	for (i = 0; i < n; i++) 	{ 		scanf("%d", &a[i]); 	} 	scanf("%d", &m); 	x = m%n; 	for (i = 0; i < n; i++) 	{ 		if ((i + x) >= n) 		{ 			y = x + i - n; 			b[y] = a[i]; 		} 		if ((i + x) < n) 		{ 			b[x + i] = a[i]; 		} 	} 	for (y = 0; y < n; y++) 	{ 		printf("%d ", b[y]); 	} 	return 0; }

scanf()在遇到回车符时才会读取，所以要这么输入才行

直接贴代码把～


Question: 求教大佬们，刚开始学C语言

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

1处理a串的时候， 大写A和小写z之间可不都是字母，还有一些符号的吧，不能偷懒  2 瞎串门   for(i=0;i<strlen(b);i++)     {  if((a[i]>='0')&&(a[i]<='9'))        {          d[k]=a[i];          k++;        } 这里处理的是第二串， 都是b串吧， 你写的都是a串的事儿呢。   3 e和f都有的问题， 最后少了一个‘\0’来做字符串的结尾

#include <stdio.h> #include <string.h> int main() {     char a[100];     char b[100];     gets(a);     gets(b);     char c[100];     char d[100];     int i,j=0,k=0;     for(i=0;i<strlen(a);i++)     {        if((a[i]>='A')&&(a[i]<='z'))        {          c[j]=a[i];          j++;        }     }     for(i=0;i<strlen(b);i++)     {        if((a[i]>='0')&&(a[i]<='9'))        {          d[k]=a[i];          k++;        }     }     char e[100];     char f[100];     int m,n=0,o=0;     for(m=0;m<strlen(c);m+=2)     {        e[n]=c[m];        n++;     }     for(m=1;m<strlen(d);m+=2)     {        f[o]=d[m];        o++;     }     printf("%s",e);     printf("\n");     printf("%s",f);     return 0;  }这个为什么密码不输出？


Question: 菜单项上的非矩形图案是怎么做到的？

引用 4 楼 zgl7903 的回复:这个菜单图片应该是ICON图标， 背景透明的，绘制在什么底色上就呈现什么颜色 SetMenuItemBitmaps貌似只能用HBITMAP啊

这个菜单图片应该是ICON图标， 背景透明的，绘制在什么底色上就呈现什么颜色

引用 2 楼 六道佩恩 的回复:[quote=引用 1 楼 user-2 的回复:] 自绘控件，你想让他什么样就什么样子 这是dev上的菜单，我看不像是自绘的[/quote] 这个就不清楚了，你可以变主题看看这个非标准图形后面的有没有变化，也有可能是位图处理的

引用 1 楼 user-2 的回复:自绘控件，你想让他什么样就什么样子 这是dev上的菜单，我看不像是自绘的

自绘控件，你想让他什么样就什么样子


Question: 求助，写一个C语言程序，不要用结构体

查错？哪里有错

#include<stdio.h> #include<stdlib.h> #define N 4 struct student {     char xuehao;     char name;     int a;     int b;     int c;     int d;     double zongce; }str[10]; double fun(int x, int y, int z, int v); int main() {     struct student temp;     int i, j, k = 0;     double jidian[10];     FILE* fp;     if ((fp = fopen("D:\\1.txt", "r")) == NULL)     {         printf("无法打开文件\n");         getchar();         exit(1);     }     for (i = 0; i < 10; i++)     {         fscanf(fp, "%s%s%d%d%d%d", &str[i].xuehao, &str[i].name, &str[i].a, &str[i].b, &str[i].c, &str[i].d);         jidian[i]=fun(str[i].a,str[i].b,str[i].c,str[i].d);         if (jidian[i]>5.99 && str[i].a > 60 && str[i].b > 60 && str[i].c > 60 && str[i].d > 60)         {             str[i].zongce = (jidian[i] * 5 + 50) * 0.75 + (N * 0.25);             k++;         }     }     for (i = 0; i < k - 1; i++)     {         for (j = 1; j < k - i; j++)         {             if (str[j].zongce < str[j + 1].zongce)             {                 temp = str[j];                 str[j] = str[j + 1];                 str[j + 1] = temp;             }         }     }     printf("满足奖学金要求的名单\n");     printf("学号        姓名\n");     for (i = 0; i < k; i++)     {         printf("%s        %s    \n", str[i].xuehao, str[i].name);     }     printf("………………………………………………………………\n");     printf("一等奖学金：\n");     printf("学号        姓名\n");     for (i = 0; i < 1; i++)     {         printf("%s        %s    \n", str[i].xuehao, str[i].name);     }     printf("二等奖学金：\n");     printf("学号        姓名\n");     for (i = 1; i < 4; i++)     {         printf("%s        %s    \n", str[i].xuehao, str[i].name);     }     printf("三等奖学金：\n");     printf("学号        姓名\n");     for (i = 4; i < k; i++)     {         printf("%s        %s    \n", str[i].xuehao, str[i].name);     }     fclose(fp);     getchar();     return 0; } double fun(int x,int y,int z,int v) {     double jidian1, jidian2, jidian3, jidian4, jidian;     if (x >= 60)     {         jidian1 = (x - 60) * 0.2 + 2;     }     else     {         jidian1 = 0;     }     if (y >= 60)     {         jidian2 = (y - 60) * 0.2 + 2;     }     else     {         jidian2 = 0;     }y     if (z >= 60)     {         jidian3 = (z - 60) * 0.2 + 2;     }     else     {         jidian3 = 0;     }     if (v >= 60)     {         jidian4 = (v - 60) * 0.2 + 2;     }     else     {         jidian4 = 0;     }     jidian = (jidian1 * 5 + jidian2 * 6 + jidian3 * 4 + jidian4 * 3) / 18;     return jidian; }

不用结构体？？那不得难受死 不，必须用结构体


Question: 英文版C语言，输出英文乱码了，怎么办，求大神相助，急!

你要想输入五个单词的话，不要用gets，gets 是读取一行字符，使用scanf输入，另外，把你gets上面for循环后面的分号去掉


Question: 用C或C++判断一个数为整数还是实数

引用 4 楼 自信男孩 的回复：判断小数点吧，这就是区别。  strchr(str, '.');建议查一下这个函数；好的谢谢

引用 3 楼 寻开心 的回复：1.00000里面也有个小数点儿不是  你按照字符串的方式把两行数字读进来， 看字符串里面是否有‘.’ 啊 gets（str） for （I=0； i<strlen(str); I++ ) {      if ( str[I] == '.' {            输出 实数            break      } } if （ I == strlen（str） ）     输出整数好的谢谢

有没有科学计数法表示的数据？

引用 1 楼 寻开心 的回复：整数和实数有什么区别啊，就是带不带小数点儿的问题 gets读入一行， 看看字符串里面是否有'.'就好了  代码自己写就是还要考虑到比如1.0000是实数 这个好像不会判断


Question: 跪求大佬我用c语言搞一下道题

错别字也忒多了 其实你只需要实现一个用数组表示的减法即可，具体参照手算步骤，没什么可说的了

其实你对这道题并不感兴趣


Question: 求教，strlen函数计数的时候怎么计算

引用 8 楼 LJY526 的回复:[quote=引用 7 楼 @矛盾综合体的回复:][quote=引用 6 楼 LJY526 的回复:] [quote=引用 3 楼 @矛盾综合体的回复:]ats\n012\1\\:ats占3个字符，\n作为转义字符，占1个表示换行（转义字符建议查一下，常用的\0 \r \t \n ）012占3个byte，然后\1占一个，转义类，表示8进制，后面最多接0-7的字符3个以\000-\777，这些均占1个byte，\\占一个byte，表示一个真的\，而不是常用作为转义字符的\，3+1+3+1+1=9 s\n\016\0end：strlen以\0作为判决条件，确定一个长度，所有为s一个，\n一个，同时需要注意，当\0和\ddd以\ddd作为优先级高，所有 \016表示一个8进制数占1位，然后\0但是后面接e，表示不是8进制数，所有strlen结束，为3。 您讲解的很清楚，谢谢了，我明白了[/quote] 很高兴你看懂了，如果感觉不错，这帖子可以结了吗？[/quote] 可以结了，我不太懂这个操作，是需要我自己结一下吗？[/quote] 我也不知道，我还没有发过帖子，应该是楼主结的吧，不知道就算了，也没关系

引用 7 楼 @矛盾综合体的回复:[quote=引用 6 楼 LJY526 的回复:] [quote=引用 3 楼 @矛盾综合体的回复:]ats\n012\1\\:ats占3个字符，\n作为转义字符，占1个表示换行（转义字符建议查一下，常用的\0 \r \t \n ）012占3个byte，然后\1占一个，转义类，表示8进制，后面最多接0-7的字符3个以\000-\777，这些均占1个byte，\\占一个byte，表示一个真的\，而不是常用作为转义字符的\，3+1+3+1+1=9 s\n\016\0end：strlen以\0作为判决条件，确定一个长度，所有为s一个，\n一个，同时需要注意，当\0和\ddd以\ddd作为优先级高，所有 \016表示一个8进制数占1位，然后\0但是后面接e，表示不是8进制数，所有strlen结束，为3。 您讲解的很清楚，谢谢了，我明白了[/quote] 很高兴你看懂了，如果感觉不错，这帖子可以结了吗？[/quote] 可以结了，我不太懂这个操作，是需要我自己结一下吗？😂

引用 6 楼 LJY526 的回复:[quote=引用 3 楼 @矛盾综合体的回复:]ats\n012\1\\:ats占3个字符，\n作为转义字符，占1个表示换行（转义字符建议查一下，常用的\0 \r \t \n ）012占3个byte，然后\1占一个，转义类，表示8进制，后面最多接0-7的字符3个以\000-\777，这些均占1个byte，\\占一个byte，表示一个真的\，而不是常用作为转义字符的\，3+1+3+1+1=9 s\n\016\0end：strlen以\0作为判决条件，确定一个长度，所有为s一个，\n一个，同时需要注意，当\0和\ddd以\ddd作为优先级高，所有 \016表示一个8进制数占1位，然后\0但是后面接e，表示不是8进制数，所有strlen结束，为3。 您讲解的很清楚，谢谢了，我明白了[/quote] 很高兴你看懂了，如果感觉不错，这帖子可以结了吗？

引用 3 楼 @矛盾综合体的回复:ats\n012\1\\:ats占3个字符，\n作为转义字符，占1个表示换行（转义字符建议查一下，常用的\0 \r \t \n ）012占3个byte，然后\1占一个，转义类，表示8进制，后面最多接0-7的字符3个以\000-\777，这些均占1个byte，\\占一个byte，表示一个真的\，而不是常用作为转义字符的\，3+1+3+1+1=9 s\n\016\0end：strlen以\0作为判决条件，确定一个长度，所有为s一个，\n一个，同时需要注意，当\0和\ddd以\ddd作为优先级高，所有 \016表示一个8进制数占1位，然后\0但是后面接e，表示不是8进制数，所有strlen结束，为3。 您讲解的很清楚，谢谢了，我明白了

引用 2 楼 LJY526 的回复:[quote=引用 1 楼 lin5161678的回复:]掰手指数 注意转义字符 就完事了 第二个答案应该是2还是3呢[/quote]3呗

数一下有几个字符吧，strlen就是计算有效字符的。注意\转义符

引用 1 楼 lin5161678的回复:掰手指数 注意转义字符 就完事了 第二个答案应该是2还是3呢

掰手指数 注意转义字符 就完事了


Question: 有没有大佬知道这个该怎么改

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

你这个到底是警告还是错误啊。 警告的意思，最后一个参数应该是char *， 而你传入的是一个不可修改的字符串，有潜在的问题 要去掉这个警告，如下处理： char filename[] = "counter.dat"; 函数里面把那个字符串，替换成filename变量就可以去掉这个警告了。  如果是错误，给出错误的提示


Question: c语言概念题

所有问题，都可以问编译器。自己动手试一下不就好了 拿第一个问题来说：结构体的成员可不可以与结构体变量同名？可以，为什么呢？因为语言没规定，不可以。 很多书把这些规定说的五花八门，告诉你记住这些条条框框，你真的能记住吗？你没有试过，没有错过，不会了解为什么会要制定这样的规定。 尽量多试，毕竟编译器比人“真实”


Question: 求助，动态均值滤波函数是什么，怎么写？

参考代码： https://github.com/shallwing/ImageProcess/blob/master/dynamicMaxValue.c

引用 1 楼 user-2的回复:你可以搜索一些相关的技术博客，想在这里恰好碰到一个做过这个的人，很难 就是看了也不懂，就很茫然

你可以搜索一些相关的技术博客，想在这里恰好碰到一个做过这个的人，很难


Question: 程序设计题 会做联系 ！！

简单版： 数组存储信息，前台菜单用命令行模拟 进阶版： 文件、数据库存储后台信息，前台菜单用qt或者web界面显示。

怎么说                     ？


Question: 为啥中文是乱码啊？？？？？？

1 c里面汉字每个占据两个字符，如果显示的时候这两个字符被分拆开了，就是乱码了 2 和编译器有一定的关系， 汉字毕竟不是标准的ascii码， 编译器对它的支持不到位也是有可能的


Question: 经常这样子，求助

文件编译 时 对应目录下缺少相应的.so动态库文件，将需要的so文件 copy到对应目录就行


Question: 打印沙漏，求各路大神帮帮忙，用c语言解答


Question: 谁能救救我（菜鸡卒）（C语言小白）

最好使用递归算法

thank  you！！！！！！！！！

引用 1 楼 user-3的回复:#include <stdio.h> int main() {     char ch = 0;     char szary[1000][100] = {0};     int index =999;     int id = 0;     while((ch = getchar()) != '\n')     {                   if(ch != ' ')         {             szary[index][id] = ch;             id++;         }         else         {             index--;             id = 0;         }     }     for(int i = index; i < 1000; i++)     {         printf("%s\n",szary + i);     }                 return 0; } ❤thank you！！！！！！

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() {     char str[1000];     gets(str);     int len = strlen(str);     int i=len-1;      for (; i>=0; i-- ) {           if ( str[i] != ' ' ) continue;           str[i] = '\0';           printf("%s ", str+i+1);     }     printf("%s", str);    return 0; };


for里面用m控制循环，但是下标要是i，何不就用i来控制循环，省一个变量

scanf()以空格、回车、制表符作为字符串的终止符，不读走空格、制表符、回车符，仍留在缓冲区中  你可以在完成输入n后，强行移动一下标准输入的读取指针到尾部 scanf("%d",&n);//这里输入一个3； fseek(stdin, 0, SEEK_END);

应该是gets(str);把scanf("%d",&n);后面的空格读入了，你在scanf("%d",&n);后加一个getchat();就可以了

因为第一次输入n时，'\n'还在输入缓存里。正好，gets是遇到'\n'直接返回，所以你只输入了2次。第一遇到'\n'直接返回了。 解决办法是在scanf后加一条语句:getchar();


Question: 求助求助

谢谢

修改完再保存一次

我修改之后保存了的


Question: 请大神指点，下划线这些表示的什么

感谢，c++的内容，难怪说怎么没见过这个表示法，

冒号后面的叫初始化列表，具体查百度

构造函数


Question: 大佬救命！！！c语言实现数据结构实验怎么做啊！！

学校实课让做的，完全不会-_-||

你这个问题对于我这个在学数据结构的有点难度啊


Question: 请大神指教下面的代码，sprintf输出的是什么？

sprintf是把后面格式化好的字符串存入第一个参数sql 最终结果是 sql保存的内容是"SELECT count(*) from tableNm的字符串内容+logNo的字符串内容 WHERE subAccNo='usrID的字符串内容'"字符串

这个sql就是上面的字符串数组把 —— char sql[16 * 1024] = {0};

sprintf是将字符串放到sql中。

三个变量都不知道等于什么，怎么知道结果啊


Question: C语言的，不知道为什么会出错

引用 6 楼 SuperDay的回复:N随便定一个几百，够用就行了 并且N 定义里面(char)也不合适 意思就是不一定要算出数组的大小，只要够用就可以了？

N随便定一个几百，够用就行了 并且N 定义里面(char)也不合适

你用a去定义b，再用b去定义a,就好像有人问你你几岁了，你说你和你弟岁数一样，再问你弟弟几岁，你说和你岁数一样好吧。结果都不知道。

引用 3 楼 SuperDay的回复:围观楼主的脑洞 N就是a的长度，然后a的长度是N 长这么大第一次见到 初学c啥都不懂，见谅

围观楼主的脑洞 N就是a的长度，然后a的长度是N 长这么大第一次见到

N 你想要多大？  a的大小？但a又是多大...  宏展开的时候a没定义

这不是，先有鸡还是先有蛋

引用一楼的话，先有鸡还是先有蛋？


Question: 一个问题！！

sizeof(p)  p是指针，sizeof（p）是指针的长度，4或者8,应该使用sizeof(a)+1

做个简单的类型转换 *p = (char*)realloc(*p, length + 1 + strlen(b) - strlen(a));


Question: 【指针】输出原数与位数

gg 发现可以了谢谢大家！！#include <stdio.h> #include <string.h> #include <stdlib.h> int main() { 	char a[100],count=0,i; 	char *p=a; 	gets(a);  	while(*p) {p++; count++;} 	p--; 	puts(a); 	printf("总共有%d位",count); }

什么鬼，计数器哪去了，p++，count++（int count = 0），p所指的最后一位应当为'/0'，不加判断条件多半每次出来都是100

while(*p)  {p++; p--;}    加一个再减一个，来回折腾玩儿呢。  这还能退出来吗？！


Question: 从键盘输入10个数，除掉最大数和最小数，输出剩下的数列 怎么写，速求

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

哦不~~~ 是去掉max、min，你可以在输出时加个判断，如果不等于这两个数就输出，也可以记住它们的下标，然后拿下标判断

输入存入数组，让max和min=num[0]，遍历数组，如果---就---，输出max，min，没了


Question: 字符串传入函数后的大小固定为8？

楼主的编译器和系统是64位的吧，所以才输出8； 楼主f函数里的两个都是char *类型的指针，不是字符串，实参是字符串，但是形参是指针，存放的是字符串的首地址。

函数的参数不能直接传递数组，但是函数的形参可以写成数组的形式。此时，调用该函数是的实参数组被编译器自动转换为指针。 所以，f(char str[], char *s)中，两个形参都是指针类型，所以sizeof()函数返回的都是指针的大小。如果你编写的是x86的程序，则返回值都是4，即4个字节；如果你编写的是x64的程序，则返回值都是8，即8个字节。 如果想要获取指针指向内容的大小，可以考虑使用strlen()函数 #include<stdio.h> #include<stdlib.h> #include <string.h>//----------strlen函数所需头文件---------- void f(char str[], char *s) { 	printf("%d\n", strlen(str));//--------换成strlen--------- 	printf("%d\n", strlen(s));//--------换成strlen--------- } int main() { 	char str1[] = "ab"; 	char *str2 = "cdef12345"; 	f(str1, str2); 	return 0; } VS2015,x86类型的程序输出结果  对于函数数组形参和strlen()函数的用法，请参考 《C++中函数的数组形参》 《C++中strlen与sizeof处理字符数组和字符指针》 希望能够帮到你！

在void f(char str[], char *s)中, str和s都已经是指针char*了. win32时,sizeof(char*)是4, 你的应该是64位程序吧.

sizeof( char * )

为什么输出的结果为是8呢？sizeof(char)不应该是1吗？

sizeof返回的是类型的大小， 指针类型，和字符串长度没有关系 字符串长度是 strlen来计算，不是sizeof来计算


Question: c语言：输入一个正整数n，统计小于n的素数个数

注意：// a/b=c，如果b,c不等，则b,c里面的最小值一定小于sqrt(a)，所以判断到sqrt(a)就可以 。是一句话。都是要隐起来的，不是里面的代码。

#include <stdio.h>  #include <math.h>  //因为要用到sqrt()函数  int main() { int i,j,flag; int n,num=0;   //num记录素数的个数   scanf("%d",&n);     for(i=1;i<=n;i++)     // 从1到n找数  { 	flag=1;           //为1时表示i为素数，为0则表示i不是素数  	for (j=2;j<=sqrt(i);j++)  // a/b=c，如果b,c不等，则b,c里面的最小值一定小于sqrt(a)，所以判断到sqrt(a)就可以  	{ 		if(i%j==0)    //不是素数，修改标志推出for循环  		{ 			flag=0; 			break; 		} 	} 	if(flag==1)      //判断是否是素数，  	{ 		printf("%d为素数。\n",i); 		num++;         	} }  printf("%d",num); return 0;	 }

谢谢各位大佬，这个软件有采纳回答选项么

很多年前改写的 intfree 求素数个数的 Pascal 代码,  O(N^(2/3 + ε)),  是比 primesieve 快不少,   求 500000000000 以内的素数个数,  primesieve 八线程用时  12.9 秒, 单线程用时 89.8秒,  下面的代码单线程用时 10.8 秒, 就是没写成多线程的...   #include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h>   #define XPREVN        (64*1024*1024)                /**/ #define XSQRTPREVN    (8*1024) #define XPREVPI        (4*1024*1024)                /* PI(XPREVN) : 3957809 */ #define XMAXPIX		   ((LLong)512 << 30) #define XMAXNTH        ((LLong)10*1000*1000*1000)    /* NTH( 1E10 ) == 252097800623 */   int        *X_small_prime ,  X_pi_small_prime; int        *X_pi_prev_N   , *X_prev_V;   #define XPREVDM        (7) #define XPREVQ        (2*3*5*7*11*13*17) #define XPREVPHQ    (1*2*4*6*10*12*16)   #ifdef _MSC_VER #pragma warning( disable : 4244 ) typedef __int64        LLong; #define LLFmt        "I64d" #else typedef long long    LLong; #define LLFmt        "Ld" #endif   static LLong phiX_p( LLong x , LLong a ) {     if( a == XPREVDM )         return x / XPREVQ * XPREVPHQ + X_prev_V[ x % XPREVQ ];     if( x < X_small_prime[a-1] )         return 1;     return phiX_p( x , a - 1 ) - phiX_p( x / X_small_prime[a-1] , a - 1 );    }       LLong phiX( LLong X ) {     LLong cubeRootX  , max , len3 , len2 , s , i , k;     LLong sum , p;     if( X <= XPREVN )         return X_pi_prev_N[X];           max   = (LLong)(pow( (double)X , 2./3 ) + 2);     cubeRootX = (LLong)(pow( (double)X , 1./3 ) + .5);     if( cubeRootX*cubeRootX*cubeRootX > X )         --cubeRootX;     len3 = X_pi_prev_N[cubeRootX];           sum = 0; s = 0; k = max -1 ;     for( i = len3; ;++i )     {         p = X_small_prime[i];         if( p * p > X ) break;                   s += X_pi_prev_N[k] - X_pi_prev_N[(int)((double)X/p)];         k = (int)((double)X/p);                   sum += s;     }     len2 = X_pi_prev_N[p-1];           sum = (len2-len3)*X_pi_prev_N[max-1] - sum;     sum = len3 * (len3-1)/2 - len2 * (len2-1) / 2 + sum;           return phiX_p( X , len3 ) - sum + len3 - 1; }   void initSmallPrime() {     char *mark = (char*)calloc(1,XPREVN/2+1);     int i , j;     X_small_prime = (int*)calloc(sizeof(int),XPREVPI );     X_pi_prev_N   = (int*)calloc(sizeof(int),XPREVN+1);     X_prev_V      = (int*)calloc(sizeof(int),XPREVQ+1);           for( i = 3; i <= XSQRTPREVN; i += 2 )     {         if( mark[i/2] ) continue;         for( j = i*i/2; j <= XPREVN/2; j+=i )             mark[j] = 1;     }     X_small_prime[0] = 2;     X_pi_small_prime = 1;     X_pi_prev_N[0] = X_pi_prev_N[1] = 0;     X_pi_prev_N[2] = 1;     for( i = 3; i <= XPREVN; i += 2 )     {         if( mark[i/2] )         {             X_pi_prev_N[i+1] = X_pi_prev_N[i] = X_pi_prev_N[i-1];         }         else         {             X_pi_prev_N[i+1] = X_pi_prev_N[i] = 1 + X_pi_prev_N[i-1];             X_small_prime[X_pi_small_prime++] = i;         }     }     free(mark);           for( i = 0; i < XPREVQ; ++i )         X_prev_V[i] = i;     for( i = 1; i <= XPREVDM; ++i )         for( j = XPREVQ-1; j >= 0; --j )             X_prev_V[j] -= X_prev_V[ j/X_small_prime[i-1] ]; }   int main() {     LLong a;     clock_t now = clock();     initSmallPrime();     printf( "init time used : %lf seconds\n" , (double)(clock() - now) / CLOCKS_PER_SEC);       while( 1 == scanf( "%" LLFmt , &a ) )     {         if( a <= 0 )             break;         else if( a <= XMAXPIX )         {             now = clock();             printf( "phiX( %" LLFmt " ) == %" LLFmt "\n" , a , phiX( a ) );             printf( "phiX time used : %lf seconds\n" , (double)(clock() - now) / CLOCKS_PER_SEC );         }         else              printf( "%" LLFmt " Out of range\n" , a );     }           return 0; }

https://github.com/kimwalisch/primesieve   用这个筛法的吧, 速度比较可以, 筛法复杂度在 O(N*lnlnN)  ...  我本子上试了下求 1E12 范围内有 37607912018 个素数, 用时  37.3 秒... 不过指定范围素数个数有 O(N^(2/3 + ε)) 的算法,  仔细写能比这个更快些 ...

#include <stdio.h> #include <math.h>  //因为要用到sqrt()函数  int main() {     int i,j,flag;     int n, num = 0;   //num记录素数的个数      scanf("%d", &n);     if (n < 2) {         printf("No prime!\n");         return -1;     }     //for(i = 1; i <= n; i++)     // 从1到n找数     num = 1; //2 is prime     printf("%d为素数。\n", 2);     for(i = 3; i <= n; i = i + 2)     // 从1到n找数     {         flag=1;           //为1时表示i为素数，为0则表示i不是素数         for (j=2;j<=sqrt(i);j++)  // a/b=c，如果b,c不等，则b,c里面的最小值一定小于sqrt(a)，所以判断到sqrt(a)就可以         {             if(i%j==0)    //不是素数，修改标志推出for循环             {                 flag=0;                 break;             }         }         if(flag==1)      //判断是否是素数，         {             printf("%d为素数。\n",i);             num++;         }     }      printf("%d",num);     return 0; } 供参考～


Question: 求大神帮忙看一下

仿照你的思路做的，对照看吧  #include<stdio.h> #include<string.h> #include <stdlib.h>  // 新增的splite函数，把输入的字符串，拆成一个个人名的单独字符串，并放到a数组当中去， 返回人名的数量 void splite(char * buffer, char *a[100], int* pN); void sort(char *a[], int n);  // 增加了一个参数n，表示数组当中有多少个人名 void print(char *a[], int n); // 增加了一个参数n，作用同上 int main() {     char *a[100];      //最多100人     char buffer[1200];  // 用来接收输入， 100人 * 每个11个字符（含后面的空格） = 1100； 多定义一些预防而已     gets(buffer);       int n;     splite(buffer, a, &n);     sort(a, n);     print(a, n);    // 完整的代码，这里应该再补充一个函数，释放a数组里面的那些malloc出来的内存     return 0; }  // 你原来的代码， 改动了一下，n从参数传入了 void sort(char *a[], int n) {     int i,j;     char *temp;     for(i=0;i<n-1;i++)     {         for(j=0;j<n-1;j++)         {             if(strcmp(a[j],a[j+1])>0)             {                 temp=a[j];                 a[j]=a[j+1];                 a[j+1]=temp;             }         }     } }  // 你原来代码，n来自参数 void print(char *a[], int n) {     int i;     for(i=0;i<n;i++)     {         printf("%s ",a[i]);     } }  // 把buffer当中用空格分割的多个名字，拆解到char *a【】当中，并返回数量到*pN当中 void splite(char * buffer, char *a[100], int* pN){     int count = 0;     int col = 0;     int i = 0;     int len = (int) strlen(buffer);     char temp[11];     for (i=0; i<len; i++) {         if ( buffer[i]!=' ') {             temp[col++] = buffer[i];         } else if ( col ) {             char * p = (char *) malloc( col + 1);             temp[col] = 0;             strcpy( p, temp);             a[count++] = p;             col = 0;         }     }     if ( col ) {         char * p = (char *) malloc( col + 1);         temp[col] = 0;         strcpy( p, temp);         a[count++] = p;         col = 0;     }     *pN = count; }


Question: 求大神帮忙看一下


Question: 求助

引用 4 楼 起个昵称就叫“啥” 的回复:引用 3 楼 weixin_45936877的回复:[quote=引用 2 楼 起个昵称就叫“啥” 的回复:] 比较好奇，你这个运行不会报错吗运行出来是正确答案13，我不知道当多个x，y时运算过程是什么样的 你可以加断点自己跟一下，看看值是怎么变化的[/quote]老哥，我不会加点。。。所以来求助

引用 3 楼 weixin_45936877的回复:引用 2 楼 起个昵称就叫“啥” 的回复:比较好奇，你这个运行不会报错吗运行出来是正确答案13，我不知道当多个x，y时运算过程是什么样的 你可以加断点自己跟一下，看看值是怎么变化的

比较好奇，你这个运行不会报错吗

当这种输入多个x，y变量时，是从左至右依次计算吗？


Question: 刚学指针，数组逆序的题搞不清楚，各路大神看到代码可否帮帮忙

引用 3 楼 自信男孩的回复:p = a+9; while (p >= a) {     printf("%d ", *p);     p--; } 试试这种方法～ 好的，我觉得逻辑上肯定行

引用 1 楼 寻开心的回复:for ( I=9; I<=0; I-- ) 这个条件没达成， 所以没有输出。  应该是 i>=0 才对 哦，谢谢__________


Question: c语言问题

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

看代码猜题目，不是个好活儿，你还是把原始题目贴出来吧


Question: c语言问题

if后面就是一条打印，这个没什么可解释的吧。建议注重看一下需求，看一下2.0 * (sum - b/a)应该是需求里的内容～


Question: 请问在printf那里除了用p->来访问还能怎么用指针访问？？用了*p的有点问题请教一下。

你用数组表示法试试看。

printf("学生%d:\n NO:%d NAME:%s age:%d\n", \            i+1, (*p).NO, (*p).NAME, (*p).age);


Question: Noi 计算两个日期之间的天数 问题求助

此贴终结我会了

秋梨膏大佬们赏个脸看看吧


Question: 程序设计题

题目信息太大涉及类的封装

这样可以吗？

引用 1 楼 不闻窗外事 的回复：你的输入时学校和项目数，你的名次是怎么获取的，还有输出是啥，感觉你这个题目根本不全啊要求：初始化输入：N-参赛学校总数，M-男子竞赛项目数，W-女子竞赛项目数 各项目名次取法有如下几种： 取前5名：第一名得分7分，第二名得分5，第三名得分3，第四名得分2，第五名得分1；取前3名：第一名得分5，第二名得分3，第三名得分2； 功能要求： （1）系统以菜单方式工作。 （2）由程序提醒用户填写比赛结果，输入各项目获奖运动员信息(运动员学校，运动员项目，性别，姓名)。 （3）所有信息记录完毕后，用户可以查询各个学校的比赛成绩 （4）查看参赛学校信息和比赛项目信息等。 (5) 根据总成绩、男子成绩、女子成绩的顺序从高到低的方式显示结果。


Question: 如何利用while输入未知个数的整数和小数

#include<stdio.h> #include <string.h> #include<math.h>  int main(void) {      char buf[128], *ret;     float val_f, sum_f = 0;     int val_int, sum_int = 0;      while (fgets(buf, 127, stdin)) {         ret = strchr(buf, '.');         if (ret) {             sscanf(buf, "%f", &val_f);             sum_f += val_f;         } else {             sscanf(buf, "%d", &val_int);             sum_int += val_int;         }     }     printf("%d\t%.2f\n", sum_int, sum_f);     /*     char sz[100];     int sum1 = 0, i;     float sum2 = 0;      while(scanf("%d",&sz[0]) != 0||scanf("%lf",&sz[0]) != 0)     {         if(floor(sz[0]) == sz[0])         {             sum1 = sum1 + sz[0];         }         else         {             sum2 = sum2 + sz[0];         }     }     printf("%d %.2f",sum1,sum2);     */     return 0; }  供参考～  结束输入用ctrl+z（windows下）或ctrl+d（Linux下）

这个题你需要自己判断是否整数,需要按照字符串整体读取 #include <stdio.h> // strlen #include <string.h> // atof,atoi #include <stdlib.h>  #define LEN 100  // 判断是否是浮点数 int isFloat(char arr[], int n){     int i = 0;     for(i=0;i<n;++i){         if(arr[i]=='.') return 1;     }     return 0; }  int main() {     int intSum = 0;     double floatSum = 0.0;     char line[LEN] = {0};          while(gets(line)){         if(isFloat(line,strlen(line))){             floatSum += atof(line);         }else{             intSum += atoi(line);         }     }     printf("%d %.2f\n",intSum,floatSum);     return 0; }

不要使用%d或者使用%f，使用%s，然后去分解字符串，判断是否含有小数点，就可以了，结束可以使用文件结束符


Question: c语言小白 题目超级简单的题不会做求大佬们帮帮忙

(z >= y >= x) ？括号里的表达式，先计算z >= y的值，由于是判断，所以结果是0或1.即z >= y是否为真，若为真则是1.然后1 >= x；判断是否为真，结果为假，则最后结果是0.


Question: c#窗体数据库连接

引用 1 楼 user-1 的回复:可以建，封装好一点结构会很清晰，扩展或者查bug也容易 用的时候直接引用类就行了吧

可以建，封装好一点结构会很清晰，扩展或者查bug也容易


Question: 基于51单片机的波形发生器，哪位大神能解答一下


Question: 请大神指点

#include<stdio.h>  void fun(int x,int *pp,int *n) {     int i;      *n = 0;     for(i=2;i<=x;i+=2)     {         if(x%i==0)         {             //scanf("%d",pp);             pp[*n] = i;             (*n)++;         }     } }  int main() {     int x,n,i,m;     int pp[1000];      printf("Input number:");     scanf("%d",&x);      if (x > 1000) {         printf("Input error!\n");         return -1;     }      fun(x, pp, &n);     for(i=0;i<n;i++)         printf(" %d", pp[i]);     putchar(10);      return 0; } 供参考～

引用 1 楼 寻开心的回复:#include <stdio.h> #include <stdlib.h>  void fun(int x,int *pp,int *n) {     int i;     int c =0;     for(i=2;i<=x;i+=2)     {         if(x%i==0)         {             pp[c] = i;             c++;         }     }     *n = c; }  int main() {     int x,n,i;     int pp[1000];     printf("Input number:");     scanf("%d",&x);     fun(x,pp,&n);     for(i=0;i<n;i++)     {         printf(" %d", pp[i]);     }     return 0; }  按照函数的参数的定义，pp和n自然就把计算的结果带回来了 对照代码看吧 谢谢指导


Question: 大佬求解！  输入月份号，输出该月的英文月名

把name变成全局变量就行了

两个问题，第一个:main中若输入的month为小于1，或大于12时，应该提示输入出错，并直接返回，不应该去执行month函数。 第二个问题，返回局部变量是未定义行为。修改为在name定义时加static修饰～这样name就是全局变量了。

#include<stdio.h> #include<stdlib.h>  int main() { 	int month; 	do 	{ 		printf("输入月份(1-12)："); 		scanf_s("%d", &month); 		switch (month) 		{ 		case 1: 			printf("January\n"); 			break; 		case 2: 			printf("February\n"); 			break; 		case 3: 			printf("March\n"); 			break; 		case 4: 			printf("April\n"); 			break; 		case 5: 			printf("May\n"); 			break; 		case 6: 			printf("June\n"); 			break; 		case 7: 			printf("July\n"); 			break; 		case 8: 			printf("August\n"); 			break; 		case 9: 			printf("September\n"); 			break; 		case 10: 			printf("October\n"); 			break; 		case 11: 			printf("November\n"); 			break; 		case 12: 			printf("December\n"); 			break; 		default: 			printf("输入月份有误！！\n"); 			break; 		} 	}while (getchar() != 'q'); 	system("pause"); 	return 0; }


Question: 按空格分割字符串

emmm好的谢谢了（虽然我是想要把每一小段都存到a[i]里去，之后再调用

char *p = strtok(a,c);     a[0]=p;     p = strtok(NULL,c);    for(i=1;i<3;i++)    {      while(p)          {              a[i]=p;              p = strtok(NULL,c);           }     }   想问一下这样写错在哪里？我用printf想看看a[i]里有没有存进字符串的时候失败了

strtok是有坑的    它的实现机制是对原字符串当中的分隔字符用'\0'替代做标记， 修改了原始的字符串  int main() {     char s[] = "DA H10 C3";     const char *d = " ";//以空格 作为分隔符，注意是可以取多个的     char *p;     p = strtok(s,d);     while(p)     {         printf("%s\n",p);         p=strtok(NULL,d);     }      return 0; }

a[0]='DA', 这样写有问题，DA是字符串，怎么用单引号呢？ 因此应该是"DA"吧。  可以strtok或strtok_r来解决这个分割问题～

使用strsep或者strtok，如果是windows系统，就是用strtok或者它的安全版


Question: 有没有大神能读懂这段代码在做什么？

引用 4 楼 HilliardLiu 的回复:意思是随便给个大点的数字，一般不会超过的，免得buf内存溢出对吧？ 对，缓存大小建议预估一下，也不能给的太大，浪费～

意思是随便给个大点的数字，一般不会超过的，免得buf内存溢出对吧？

引用 2 楼 HilliardLiu 的回复:感谢大大，还想问下这里前面的宏，把那个字符串定义为2600有什么意义？ 就是缓存的长度～

感谢大大，还想问下这里前面的宏，把那个字符串定义为2600有什么意义？

#define PFL_MEMO_CHARACTER       '#' #define PFL_LINE_BUFFER_SIZE     2600  static void ClearBlank(char *line) {     INT32 i = 0, j, k;     char buf[PFL_LINE_BUFFER_SIZE];      while (line[i] != 0) {            //判断是否到结尾         if (line[i] == PFL_MEMO_CHARACTER || line[i] == '\n') {  //如果是#号或者换行             line[i] = 0;                                //去掉#号或者换行字符             if (i == 0) break;   //如果#号在最开始应该表示这一行为注释，不处理，自接退出；如果第一个字符是换行，表示空行，也不处理             j = i - 1;             do {                 if (j < 0) break;                 if ((line[j] != ' ') && (line[j] != '\t')) break;                  line[j--] = 0;     //如果刚才去掉的#号或者换行符前面还有空字符，就去掉#号或者换行符前面的空字符             } while(1);             break;         }	         i++;     }       i = 0;     memset(buf, 0, PFL_LINE_BUFFER_SIZE);      while ((line[i] != '=') && (i < (INT32)strlen(line))) //查找=号，也就是说line中应该包含一个=号         i++;     if (i == (INT32)strlen(line)) return;  //如果找不到等号，退出      for (j = i - 1; (line[j] == ' ') || (line[j] == '\t'); j--); //找到的=号前面如果有空字符，去掉     for (k = i + 1; (line[k] == ' ') || (line[k] == '\t'); k++); //找到的=号后面如果有空字符，去掉      memcpy(buf, line, j + 1);    //保存=号前面的内容     buf[j + 1] = '=';         //保存=号     strcat(buf + j + 2, line + k);    //保存=号后面的内容       strcpy(line, buf);       }  也就是说如果本来输入的是这样的，           abcdef =   12345  #fkladf 输出是这样的 abcdef=12345


Question: 请教一道关于C的题

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

引用 2 楼 weixin_45991779 的回复:  一道大题  嘻嘻嘻 大题也得自己先思考，写写，调试一下的呀

一道大题  嘻嘻嘻

这还真是一道题


Question: 本人刚学c语言，求各位大佬指教。

引用 1 楼 寻开心的回复:findmax(num, 10)    把&符号去掉，  num本来就是数组，符合函数要求的参数类型 懂了，谢谢大佬！😃


Question: 用最初始的c语言做 求！！！

有错误 求找找

O(n)时间度 int main(){     char s[18]={0};     int i,n;     scanf("%d",&n);     for(i=0;i<2*n-1;++i){         if(i<n)s[i]=i+1+'0';         else s[i]=2*n-i-1+'0';     }     for(i=0;i<n;++i){         printf("%s\n",s);         s[i]=' ';         s[2*n-i-2]='\0';     }     return 0; }

可不可以用最简单的方法，因为有好多的我都没学过 看不懂 就最简单的for语句等等的

谢谢，刚开始学 ，逻辑不太行

灵活一点  比如 不要看到循环就固定 从0/从1开始 完全可以从负数开始  比如 输出几个空格 完全没必要自己手动循环  格式控制符不香吗

int n = 5;     int row = 1, col=0;     for(row=1; row<=n; row++ ) {         for ( col =1; col<row; col++ ) 输出空格;         for ( ; col<n; col++) 输出col;         for ( ; col>=row; col--) 输出col;         换行;     };

这样勉强算正三角 逻辑不太清楚 不知道怎么办了

自己写， 错了再贴上来提问


Question: 就这个题怎么做啊！！！！大佬们觉得很简单，但是我真的，，是小白

引用 2 楼 weixin_45993363 的回复:[quote=引用 1 楼 寻开心的回复:]这个不是简单不简单的问题 论坛的意义是帮助人提升编程水平 你一行代码不写，只要原码， 有何意义呢  自己写，有问题贴上来， 再提问 我写了，但是就是输出有错误才来问的，不过现在已经过了，我记住了，下次会把代码贴上来[/quote] 直接贴代码吧，根据代码分析你的问题～

引用 1 楼 寻开心的回复:这个不是简单不简单的问题 论坛的意义是帮助人提升编程水平 你一行代码不写，只要原码， 有何意义呢  自己写，有问题贴上来， 再提问 我写了，但是就是输出有错误才来问的，不过现在已经过了，我记住了，下次会把代码贴上来


Question: 链表合并

引用 1 楼 寻开心 的回复：二路归并 + 链表操作  自己写吧， 有错了再提问请问可以用两个链表比较从头开始比较大小，然后把大的一次链接到a链表可以嘛

二路归并 + 链表操作  自己写吧， 有错了再提问


Question: 求纠错

又是void main  int main() {    .....  }  把你的int i，j 开始到最后的语句，搬到上面这个.... 的部分去  你这个不会是头一次写代码吧  上来就用struct这么高深的部分，厉害啊

设一个结构体数组，输入设循环和数组一样 比如stu[i].stuno


Question: 打印沙漏，部分正确，请指点是少情况吗？期待学习优秀代码。

s[1]=0;但是j的值从3开始啊。。。 在书上看到的。

因为在过去的循环当中 s【j】 = 0 的赋值操作， 再次进入的时候， s【ℹ】 和 s【j】就有可能是0了 谁说这个是筛素数法的啊？！  筛素数法不是这样子的 ，那是循环填充标记位的方式， 没有求模等运算  你自己百度一下，  百度知识库里面 素数 主题下，我记得就有筛素数法的理论和原码的

筛选法求100以内的素数

谢谢，我理解了。应用公式就比我自己推导好做多了。 我也学会了您的“循环检查法”哈哈。 能麻烦您给我讲解一下下面代码的这一处吗？  #include<stdio.h> #include<math.h> main() { 	int i; 	int j; 	int n; 	int s[101]={0}; 	//数组赋初值  	for( i=1 ; i<101 ; i++){ 		s[i]=i; 	} 	//判断素数	 	s[1]=0; 	for( i=2 ; i<sqrt(100) ; i++){ 		for( j=i+1 ; j<101 ; j++){ 			if(s[i] != 0 && s[j] != 0){//这里为什么要标记s[i] != 0 && s[j] != 0呢？实际上他们也不可能为0吧？ 				if(s[j]%s[i] == 0){ 				s[j]=0; 				} 			} 			 		} 	} 	//输出  	for( i=0 , n=0 ; i<101 ; i++){ 		if(s[i] != 0){ 			printf("%5d",s[i]); 			n++; 		} 		if(n==10){ 			printf("\n"); 		} 	}  }

初中的数学公式啊。 1 = 1 * 1 1 + 3 = 2* 2  1 + 3 + 5  = 3 * 3  。。。。   有了这个公式，   n*n = 1 + 3 +5 + .... + 2n-1  沙漏一正一反，公用一个1， 总数不就是  m(n) = 2*n*n -1   反算就是。 n(m) = sqrt( (n+1) / 2 )

1 + 3 + 5 + .....  + 2*N-1  = N*N吧？  int l =  sqrt((n+1)/2) 就知道了沙漏的底边宽度：2*l-1；l是怎么推出来的？底边宽度怎么来的？谢谢

没有固定套路， 因题而异， 去构造不同的测试数据本身就是一个单独的命题  对你这个题，再套一个循环，模拟输入就好了。 检测比如从10*。11*，，。。。 50* 这样输入输出

我想问一般用什么数值去检验代码呢？使用分类讨论的条件检验或者边界值是吗？一般同一种情况用几组呢？我这个题目就是检验的时候数据少了，导致我没查出来错误。

我做出来了，谢谢大神，第一个while条件改为while(N>6 && (N-1)/2-sum>=i)就对了，好高兴。 一会拜读一下您的帖子。

#include<stdio.h> #include<math.h>  void SandGlass(int n, char ch) { 	int level = sqrt((n+1)/2); 	int i, j, len=2*level-1; 	for ( i=0; i<level; i++, len-=2) { 		for (j=0; j<i; j++) printf(" "); 		for (j=0; j<len; j++) printf("%c", ch); 		printf("\n"); 	} 	len = 3; 	for (i=1; i<level; i++, len+= 2) { 		for (j=0; j<level-i-1; j++) printf(" "); 		for (j=0; j<len; j++) printf("%c", ch); 		printf("\n"); 	} 	printf("%d", n-2*level*level+1); } main() { 	int n;     char ch='*'; 	scanf("%d %c", &n, &ch); 	int level = sqrt((n+1)/2); 	int u = 2*level*level-1, r=n-u; 	printf("n=%d, level=%d, Used:%d, Remain:%d\n", n, level, u, r); 	SandGlass( n,  ch); }

70 *     48 *   16 *  这样的数据  输出都是-1 这不是唯一的错误， 45 * 等数据也会出现类似的错误 显然计算公式上面有问题   假设沙漏底边宽度是n = 2*N-1  那么，已知公式：     1 + 3 + 5 + .....  + 2*N-1  = N^N 所以，完整的沙漏的字符用量就是 2*N*N-1   对于程序输入的整数n，   int l =  sqrt((n+1)/2) 就知道了沙漏的底边宽度：2*l-1 全部输出后，剩余的字符数量就是：  n - （2*l*l - 1） 个剩余  例如n=48     l = sqrt（49/2） = 4     沙漏底边宽度就是7，    剩余  48 - （32-1） = 17 有了这些数据，直接绘制和输出就好了

你输入103 *运行一下


Question: 求大神告诉这个是怎么回事

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

问题出在上一行好不好 typedef struct arcCell { ... }; ArcCell    ArcCell 前面没有分号，后面才有分号。  上一行的错误累计到下一行去了  typedef struct arcCell { ... } ArcCell  ;


Question: 计算素数

#include <stdlib.h> #include <stdio.h>  int Primenumber(int n,int *num) {     if (n < 10) return -1;      int index = 0;      for (int i = 2; i < n; i++)     {         int count = 0;          for (int j = 1; j <= i; j++)         {             if (i%j == 0) count++;         }          if (count == 2)         {             num[index] = i;             index++;         }     }     return index; }  void printPrimen(int n,int *num) {     printf("%d\n",n);      for (int i = 0; i < n; i++)     {         printf("%d\t",num[i]);         if ((i+1)%5 == 0) printf("\n");     } }  int main() {     int number[100];     int max = 0;     scanf("%d",&max);     int n = Primenumber(max,number);     printPrimen(n,number); }

都指着别人来救呢，谁来救我啊？简单的事情自力更生！自救！求人不如求己！


Question: 自定义函数十进制转换为十六进制

引用 1 楼 寻开心的回复:你的题目当中不是有答案吗。第六讲大课当中有例题。  自己做， 出错了再来提问 原码没有 而且我们老师还没讲 直接跳过 历史遗留问题

引用 1 楼 寻开心的回复:你的题目当中不是有答案吗。第六讲大课当中有例题。  自己做， 出错了再来提问 原码没有 请无视吧 有是有 但是只留了个自学 什么代码提示都没有


Question: 求助啊很急

设湖深x，则根据直角三角形，(x+H)的平方=x平方+L平方 x平方+2xH+H平方=x平方+L平方 得出 x=（L平方-H平方）/ 2H 思路没错啊，没看到你的代码，注意结果可能超出int范围就好，所以把输入都转成double来计算


Question: C语言小白关于指针强制转化的问题

void * ptr; 定义ptr的类型 （char*）ptr； 记一句是废语句  （char*）ptr是强制转换，问题是， 这个转换并不改变ptr自身。  它是获得了ptr的值，把这个值转换成了另外的类型 这样的转换，往往是和赋值语句结合使用的，例如：     char * p = (char  *) ptr;  你的错误不再 ptr = u上面，这句没有问题 错误在printf，里面应为ptr是void类型，无从判断 ptr[2] 是什么  printf ("%c", ((char*)ptr)[2] ); //这样才好

顺便问问cast的强制转换又是怎么回事？


Question: 我的输出格式错在哪里了

引用 1 楼 起个昵称就叫“啥”的回复:不理解你为什么要printf("%-4d",j)  if(sum%5==0)         printf("\n"); else         printf(" "); 那这个要怎么改才对呢

if(sum%5==0)            {                printf("\n");            } -------------------------------sum要置 0  吧


Question: 求大神解答 想知道这个程序是有什么问题 应该怎么改

void main() 也行

新建一个工程， 控制台应用， 不要mfc支持， 再把代码复制进去

引用 1 楼 寻开心的回复:老师是合格的老师，不是体育课出身的  这绝对是自己的问题，不要赖老师哈   老师最多是main 前面少了个int， 最后少了一个return 0;      是你的工程开错 还是刚刚出现的那个问题

引用 1 楼 寻开心的回复:老师是合格的老师，不是体育课出身的  这绝对是自己的问题，不要赖老师哈   老师最多是main 前面少了个int， 最后少了一个return 0;      是你的工程开错  我改了一下 还是不行诶


Question: c语言小白 大佬来看看这个题

引用 3 楼 J9999955555 的回复:#include<stdio.h> #include <string.h> int main() {     /*********Begin*********/ 	char a[50]; 	int i,j,n=0,l1=0,lmax=0,lmaxd; 	while(1){ 		l1=lmax=lmaxd=n=0; 		gets(a);  		if(strcmp(a,"stop")==0)break; 		for(i=0;a[i]!='\0';i++) 			if(a[i]!=' '){ 			l1++; 			n++;} 			else {if(l1>lmax){ 				lmax=l1; 				lmaxd=i-lmax; 			} 				l1=0; 			} 			if(l1>lmax){ 				lmax=l1; 				lmaxd=i-lmax; 			} 				printf("%d ",n); 				for(i=lmaxd;i<=lmax+lmaxd;i++) 				printf("%c",a[i]); 				printf("\n"); 			memset(a,0,sizeof(a));  	}       return 0; }   #include<stdio.h> #include <string.h>  int main() {     char a[50];     int i, j, pos = 0;     int str_len, word_len, max_word_len;      while(1) {         str_len = word_len = max_word_len = 0;          fgets(a, 50, stdin);          if (strlen(a) <= 1)             continue;         if (strlen(a) < 50)   //remove '\n'             a[strlen(a)-1] = 0;          if(strncmp(a,"stop", strlen("stop"))==0)             break;         for(i = 0; a[i] !='\0'; i++) {             if(a[i] != ' ') {                 word_len++;                 str_len++;                 continue;             }             if (word_len  > max_word_len) {                 max_word_len = word_len;                 pos = i - word_len;             }             word_len = 0;         }         if (word_len  > max_word_len) {             max_word_len = word_len;             pos = i - word_len;         }          printf("%d ", str_len);         for (i = pos; i < pos + max_word_len; i++)             printf("%c", a[i]);         putchar(10);     }       return 0; } 供参考～

遇到\0不是整个字符串长度，要输出空格隔开的字符串。

使用gets读取一行字符，使用strlen函数就行，不用库的话，遍历一下，找到遇到\0，就是字符串的长度


Question: 初学c，函数超简单问题求求求解

引用 1 楼 寻开心的回复:if ( x>y ) k = x;  这个没错， 那么如果不大于k等于啥呢？ 另一个函数也类似的问题 还有主函数用int的话 ，后面要加return(0)


Question: fopen的疑惑

1. 相对路径 2. 通过argv[0] 截取可执行文件所在目录 然后自己拼接成绝对路径


Question: num = （--argc && (*++argv)[0] =='-'）? atoi(argv[0]+1):6 ;

@寻开心，非常感谢您的回复。通过您的回复，我已经完全明白了。

1 --argc 的作用，如果控制台启动程序的时候没有参数， argc就是1， --答案就是0， 直接是false值了， &&后面的代码根本就不执行    整个语句就等价于     num = (false) ? ... : 6;  // num = 6  2 如果控制台输入了参数 && 后面的代码执行    （*++argv）[0]  实际上就是。argv[1][0]        && 后面的这段就是判断 输入的第一个参数的第一个符号是不是 - 符号    3 用户应爱输入的是。a.exe -31    ？ 后面的那段，就可以把31取出来并转换成整数  整个代码的意思就是：    num  = （ 有参数输入吗 && 输入的第一个参数的第一个字母是 - 符号吗 ？ ）？ 是则转换-符号后面的字符串为整数并返回 ： 否则返回6

如果你的程序是a.exe    1 --argc 的作用，如果控制台启动程序的时候没有参数， argc就是1， --答案就是0， 直接是false值了， &&后面的代码根本就不执行  2 如果控制台输入了参数 && 后面的代码执行    （*++argv）[0]  实际上就是。argv[1][0]        &&后面的这段就是判断 输入的第一个参数的第一个符号是不是 - 符号 3 用户应爱输入的是。a.exe -31    ？ 后面的那段，就可以把31取出来并转换成整数


Question: C语言学习

引用 5 楼 寻开心的回复:补码转换成原码： 判断高位是否为1， 是1才做： 减一，再取反，然后整个数值前加一个负号；  否则：原样不变 嗯嗯，我知道了，原谅我现在还是一个小白

引用 3 楼 寻开心的回复:又要翻老黄历了 。 计算机里面数字有补码规则保存，ok 问题是扩充是怎么回事儿，   8bits的数字来说，  原码扩充了补码，有效数字就是七位了吗？  补码转换回原码是各位取反加吗？  那是负数的原码变成补码的规则吧 函数谁说只能实现单一的功能的？ C语言中的函数， 补码转换为原码是指负数

引用 1 楼 寻开心的回复:好一套判断对错的题目啊 考试啦，考试啦， 1 计算机存储数字是以补码存储的。 2 补码扩充:   只和自身的类型有关，与目标无关 3 补码规则：有符号整型扩充 符号位， 4 补码规则：无符号整型扩充 0 5 补码转换为原码:符号位不变，后面取反加一。 6 在计算机中，0为假，非0即真 7 函数:一个模块只完成单一任务。 8 C语言不允许函数嵌套定义  错的题号都有几？  都是正确的，是我上节课学习的


Question: 逻辑运算问题

非0即真，一个2&&-2，计算机会认为都是真，所有表达式为1，打印1


Question: C语言如何存储输入带逗号的分隔的字符

使用scanf的格式控制符就行 第一次输入使用"%c" 之后都用 ",%c"


Question: 运算小问题

引用 6 楼 清晨与猫鱼的回复:我想到你为什么就转不过弯来了。  3/2  这里其实  是两个整型 进行运算，结果自然是要舍弃小数的。你应该要用3.0/2.0 才是浮点数运算。 浮点数运算它就会把小数留下对吧？还要把它的数据类型改为浮点型对吧？

我觉得我已经解释的很清楚了。你怎么还绕不过弯来。

引用 3 楼 清晨与猫鱼的回复:浮点型 和整型的存储方式不一样，整型会自动舍弃掉 小数。 我的意思是：它不是应该输出1.5吗？我把它改成double型，输出：%f，它小数点后面没有5，只有6个0。

浮点型 和整型的存储方式不一样，整型会自动舍弃掉 小数。

引用 1 楼 清晨与猫鱼的回复:小数被舍弃了。 double，%f数据类型，它小数点后面也都是0啊？这又是怎么回事？

小数被舍弃了。


Question: 求助贴

引用 1 楼 user-1的回复:add函数里的for循环条件是不是有问题啊，感觉很可能正常输入后是个死循环 哇，对对对，应该是--，谢谢你

add函数里的for循环条件是不是有问题啊，感觉很可能正常输入后是个死循环😊


Question: 求找出错误！

没有哦，如果格式控制符中没有%c，是会忽略一些分隔符的，比如空格，回车，制表符等

引用 1 楼 user-1的回复:k是double类型，格式控制符是%lf，4 5 s 8，5跟s之间的空格被输入到c1里面，在scanf中的%f%c之间加空格 double类型会把空格作为一个值输入，float类型会不会也这样？


Question: 出圈问题：100个人围成一桌，从第13个开始走，此后每数13走一人，直至全部走完。

引用 6 楼 up___lqw 的回复:[quote=引用 3 楼 libralibra的回复:][quote=引用 2 楼 up___lqw 的回复:] 调整哪个呢？我还是不太清楚。我没看出来哪里不对 #include<stdio.h> #define NUM 100 #define CNT 13  int main() {     int a[NUM], count = 0, i = 0, j = 0;     for(i=0;i<NUM;++i) a[i] = 1;          i = 0;     do{         // 已经出圈,跳过这个,继续循环,判断下标,需要就归零         if(a[i]==0){             i++;             if(i>=NUM) i = 0;             continue;         }         // 运行到这里说明没出圈,当前计数器加1         j++;         // 如果是第13个,打印出圈,标志归零,总计数器加1,当前计数器归零         if(j%CNT==0){             printf("%4d ",i+1);             a[i] = 0;             count++;             j = 0;         }         // 继续循环,判断下标,需要就归零         i++;         if(i>=NUM) i = 0;     }while(count<NUM);     return 0; }[/quote] 程序运行后还是有很多重复的出圈数[/quote]  你自己运行看了吗?哪个数字重复了? 这是我用set检测的输出结果,如果有重复的,set的长度不会是100,输出是True  s = '''  13    26    39    52    65    78    91     4    18    32    46    60    74    88     2    17    33    48    63    79    94     9    25    42    58    75    92     8    27    44    62    81    98    16    36    55    73    95    14    35    56    77    99    21    43    67    87    11    37    61    85    10    38    66    90    20    49    76     5    34    69   100    30    68     1    40    72    12    51    89    29    80    22    64    15    59    19    71    28    86    50     7    84    54    41    23     3    97     6    31    53    83    47    24    45    82    93    96    57    70 ''' print(len(set([int(line) for line in s.split('\n')]))==100)

很简单，当你的代码执行a[i]=0之前，有代码保证a[i]不等于0吗？所以版主说的对。

引用 5 楼 遇见女神的回复:int main(){     int a[100] = {0},count = 100,curr = -1;     while (count) {         for(int i=0;i<13;++i){             do{                 curr = (curr+1)%100;             }while(a[curr]);         }         a[curr] = 1;         printf("%d ", curr);         count--;     }     return 0; } 中间的for 循环没看太懂，你能帮我看下我写的哪错了吗？

引用 3 楼 libralibra的回复:[quote=引用 2 楼 up___lqw 的回复:] 调整哪个呢？我还是不太清楚。我没看出来哪里不对 #include<stdio.h> #define NUM 100 #define CNT 13  int main() {     int a[NUM], count = 0, i = 0, j = 0;     for(i=0;i<NUM;++i) a[i] = 1;          i = 0;     do{         // 已经出圈,跳过这个,继续循环,判断下标,需要就归零         if(a[i]==0){             i++;             if(i>=NUM) i = 0;             continue;         }         // 运行到这里说明没出圈,当前计数器加1         j++;         // 如果是第13个,打印出圈,标志归零,总计数器加1,当前计数器归零         if(j%CNT==0){             printf("%4d ",i+1);             a[i] = 0;             count++;             j = 0;         }         // 继续循环,判断下标,需要就归零         i++;         if(i>=NUM) i = 0;     }while(count<NUM);     return 0; }[/quote] 程序运行后还是有很多重复的出圈数

约瑟夫环，建议在网上查查，有很多这样的解决方案：数组/链表～

引用 2 楼 up___lqw 的回复:调整哪个呢？我还是不太清楚。我没看出来哪里不对 #include<stdio.h> #define NUM 100 #define CNT 13  int main() {     int a[NUM], count = 0, i = 0, j = 0;     for(i=0;i<NUM;++i) a[i] = 1;          i = 0;     do{         // 已经出圈,跳过这个,继续循环,判断下标,需要就归零         if(a[i]==0){             i++;             if(i>=NUM) i = 0;             continue;         }         // 运行到这里说明没出圈,当前计数器加1         j++;         // 如果是第13个,打印出圈,标志归零,总计数器加1,当前计数器归零         if(j%CNT==0){             printf("%4d ",i+1);             a[i] = 0;             count++;             j = 0;         }         // 继续循环,判断下标,需要就归零         i++;         if(i>=NUM) i = 0;     }while(count<NUM);     return 0; }

引用 1 楼 user-4的回复:需要调整一结构哦，不然万一连续两个人都被访问过，你这个就出问题了  #include <stdio.h> int main() { 	int a[100], count = 0, i = 12, j = 12; 	for (i = 0; i < 100; i++) 		a[i] = 1; 	i = 12; 	do 	{ 		if (a[i] == 1) { 			j++; 			if (j % 13 == 0) 			{ 				printf("%4d", i + 1); 				a[i] = 0; 				count++; 			} 		} 			i++; 		if (i == 100) 			i = i - 100; 	} while (count != 100); 	return 0; }  调整哪个呢？我还是不太清楚。我没看出来哪里不对


Question: 指针问题，请大家进来看看

什么是指针 https://blog.csdn.net/BCMY0110/article/details/103437879 基本指针类型的区别 https://blog.csdn.net/BCMY0110/article/details/103442102 虽然我觉得你看不懂...

引用 4 楼 寻开心的回复:是的。    定义了指针要么给它动态分配内存，如你的答复那样  要么让它指向一个已经存在的内存， 比如。int array【10】，  p=array；  这样才能确保你的指针指向的是一个有效的数据地址 #include<stdio.h> #include<string.h> #include<stdlib.h> int main(void) { int a,b,n,i; char *d = "abcdefghijklmnopqrstuvwxyz"; char *st; char fg[26]; st = fg; scanf("%c",st); scanf("%d",&a); for(i = 0;d[i] != '\0';i++) { if(st[0] == d[i]) {    printf("%c",d[(i + a) % 26]);  } } return 0; 可以了，哈哈哈

引用 4 楼 寻开心的回复:是的。    定义了指针要么给它动态分配内存，如你的答复那样  要么让它指向一个已经存在的内存， 比如。int array【10】，  p=array；  这样才能确保你的指针指向的是一个有效的数据地址 恍然大悟，懂了懂了，晕了好几天了

引用 1 楼 寻开心的回复:char *st; scanf("%c",st);  / 这个st没有给予内存分配呢， 就直接用，野指针  printf("%c",d[26]);  d总共26个字母， 下标26会是啥？ 它可见吗 int* p = (int*)malloc(size*sizeof(int)); 如果用这种形式写，就不是野指针了吧？