Format Specification Fields: scanf and wscanf Functions A format specification has the following form:  % [width] [{h | l | I64 | L}]type  The format argument specifies the interpretation of the input and can contain one or more of the following:   White-space characters: blank (' '); tab ('\t'); or newline ('\n'). A white-space character causes scanf to read, but not store, all consecutive white-space characters in the input up to the next non–white-space character. One white-space character in the format matches any number (including 0) and combination of white-space characters in the input.   Non–white-space characters, except for the percent sign (%). A non–white-space character causes scanf to read, but not store, a matching non–white-space character. If the next character in stdin does not match, scanf terminates.   Format specifications, introduced by the percent sign (%). A format specification causes scanf to read and convert characters in the input into values of a specified type. The value is assigned to an argument in the argument list.  The format is read from left to right. Characters outside format specifications are expected to match the sequence of characters in stdin; the matching characters in stdin are scanned but not stored. If a character in stdin conflicts with the format specification, scanf terminates, and the character is left in stdin as if it had not been read.  When the first format specification is encountered, the value of the first input field is converted according to this specification and stored in the location that is specified by the first argument. The second format specification causes the second input field to be converted and stored in the second argument, and so on through the end of the format string.  An input field is defined as all characters up to the first white-space character (space, tab, or newline), or up to the first character that cannot be converted according to the format specification, or until the field width (if specified) is reached. If there are too many arguments for the given specifications, the extra arguments are evaluated but ignored. The results are unpredictable if there are not enough arguments for the format specification.  Each field of the format specification is a single character or a number signifying a particular format option. The type character, which appears after the last optional format field, determines whether the input field is interpreted as a character, a string, or a number.   The simplest format specification contains only the percent sign and a type character (for example, %s). If a percent sign (%) is followed by a character that has no meaning as a format-control character, that character and the following characters (up to the next percent sign) are treated as an ordinary sequence of characters, that is, a sequence of characters that must match the input. For example, to specify that a percent-sign character is to be input, use %%.  An asterisk (*) following the percent sign suppresses assignment of the next input field, which is interpreted as a field of the specified type. The field is scanned but not stored.

%*是错的，要改为%d

建议百度scanf的详细用法  里面的格式字符串

输入的时候应该使用空格，用于区分输入的是year， code还是count； scanf是格式化输入，因此除了按照其格式输入，还要加上空格，用于区分输入的内容给不同的变量；


Question: C语言中momcpy不是不能处理内存重叠问题吗？为什么VS，linux库中的momcpy可以

嗯。。。。。。。。我也遇到了这个问题

引用 4 楼 xiaohuh421的回复:你想说的是memcpy吗 memcpy本身都不能处理重叠的吧 第一次用，没粘代码

memcpy本质就是不能处理内存重叠，而memmove可以处理内存重叠，我就很郁闷，系统的momcpy为什么可以处理。 The memcpy function copies count bytes of src to dest. If the source and destination overlap, this function does not ensure that the original  source bytes in the overlapping region are copied before being overwritten. Use memmove to handle overlapping regions. 这个是在msdn上对memcpy函数的解释

#include<stdio.h> #include<string.h> void *my_memcpy(void *dest,const void *src,size_t count) { 	void *p = dest; 	assert(dest); 	assert(src); 	while(count--) 	{ 		*(char*)p = *(char*)src; 		p = (char *)p +1; 		src = (char*)src +1; 	} 	return dest; } int main() {         char arr[10] ="123456";         printf("%d\n",memcpy(arr+1,arr,5));//???? 	printf("%d",my_memcpy(arr+1,arr,5));//????? 	return 0; }

你想说的是memcpy吗 memcpy本身都不能处理重叠的吧

不知道你在你的模拟函数中有没有判断内存重叠的情况 比例  Mymemcpy(P_A, P_B, Len)  /	//判断 P_A在 P_B 的前面还是后面 	//P_A和P_B首地址一样 	if（P_A == P_B） 	{ 		//截取你要Len个值 	} 	// P_A在 P_B 后面 	else if（P_A > P_B） 	{ 		//没有重叠 		if(P_A  - P_B > Len) 		{ 			//循环一个个复制或者一块复制 		} 		//有重启 		else 		{ 			//循环一个个复制 		}       } 	 // P_A在 P_B前面 	 else 	 { 		 //没有重叠 		 if(P_B  - P_A > Len) 		 { 			 //循环一个个复制或者一块复制 		 } 		 //有重叠 		 else 		 { 			 //循环一个个复制 		 }  	}

建议将你的模拟mmecpy的代码贴出来；

把代码和用例贴出来

引用 8 楼 zhao4zhong1 的回复:先弄清楚copy和move的语义： copy的语义是操作结束后，新目的的内容和旧源的内容一致，且保证旧源的内容不变。 move的语义是操作结束后，新目的的内容和旧源的内容一致，但不保证旧源的内容不变。 于是乎，当操作的内存重叠时，无论如何也不可能实现copy！ 赵老师的这几句话还是能够回答你的问题的；

#include<stdio.h> #include<string.h> #include <assert.h>  void *my_memcpy(void *dest, const void *src, size_t count) { #if 1     char *d = (char *)dest;     char *s = (char *)src;      while (count--) {         printf("%c", *s);         printf("%p\n", s);         *d++ = *s++;     }  #else      void *p = dest;     assert(dest);     assert(src);     while(count--)     {         *(char*)p = *(char*)src;         p = (char *)p +1;         src = (char*)src +1;     } #endif     return dest; } int main() {     char arr[10] ="123456";    /* for my_memecpy */     char arr1[10] ="123456";    /* for memcpy*/      puts(arr);     printf("arr = %p\n", arr);     printf("arr+1 = %c\n", *(arr+1));     printf("%s\n", (char *)my_memcpy(arr + 1, arr, 5));     puts(arr);     //printf("%s\n", (char *)memcpy(arr1 + 1, arr1, 5));      return 0; } 这样是不能完成内部拷贝的。 你看一下memecpy的输出结果也不是正确的内部拷贝结果； 只有memmove能够实现内部拷贝；  #include<stdio.h> #include <stdlib.h> #include<string.h> #include <assert.h>  void *my_memmove(void *dest, const void *src, size_t count) { #if 1     int tmp_len = count;     char *tmp = (char *)malloc(sizeof(char) * tmp_len);     if (!tmp)         return NULL;     char *p = tmp;     char *d = (char *)dest;     char *s = (char *)src;      while (count--) {         *p++ = *s++;     }      p = tmp;     while (tmp_len--)         *d++ = *p++;      free(tmp); #else      void *p = dest;     assert(dest);     assert(src);     while(count--)     {         *(char*)p = *(char*)src;         p = (char *)p +1;         src = (char*)src +1;     } #endif     return dest; } int main() {     char arr[10] ="123456";    /* for my_memecpy */     char arr1[10] ="123456";    /* for memcpy*/      printf("my_memcpy: %s\n", (char *)my_memmove(arr + 1, arr, 5));     puts(arr);     printf("memecpy: %s\n", (char *)memcpy(arr1 + 1, arr1, 5));     puts(arr1);      return 0; }


Question: keil5的使用问题

百度弹出的提示  解决方法不少


Question: C Primer Plus 里的char * s_gets(char * st, int n)函数

问题1-char * st  表示这个函数的第一个参数是一个指针，并且是一个指向字符变量的指针。表示用来存储一个字符的地址。 问题2-continue是跳到哪一行？ 这里的continue确实没有啥意义

第一个问题，st是字符串数组的地址，是形参，用于接收一个字符串的地址；  第二个问题，continue不跳转，是继续执行while (getchar() != '\n')，continue是继续执行循环，那么这个循环是距离它最近的循环； 这儿的continue无意义，可以直接去掉，直接用;即      while (getchar() != '\n')         ;   第一个while判断表达式里多了一个逗号，我想编译器应该会给予提示，不论是warning还是error。


Question: 请教c语言相关

你是要排序，还是找最值（最大或最小），前者有各种排序算法，效率不等；后者没啥特别的办法，扫描一遍逐个比较呗，效率o(N)

同时比较，那么可以考虑使用||或者&&将比较表达式串起来。  也可以用函数吧，即函数里可以考虑用循环比较；


Question: 将包含个人信息的结构写入到文件中后，输入一个名字（英文），怎么在文件中查找该姓名对应的结构？

#include "stdio.h" #include "ctype.h" #include "stdlib.h" #include "stdbool.h" #include "string.h" #define __STDC_WANT_LIB_EXT1__1 #define NAME_MAX 20 #define BUFSIZE 1000 typedef struct Student Student; typedef struct Birth Birth;        struct Birth { int day; int month; int year; }dob; struct Student { char name[NAME_MAX]; char stdnum[20]; Birth dob;//the student's birthday int sex;//1 for girls and 0 for boys char num[11];//the student's phone number }Amy; bool get_person(Student *pAmy);//input information about a student void find(void);//function used to find the student  int main(void) { char *filename="myfile.text";//The name of file that will be used later(a string) FILE *pfile=NULL;         //Pointer to the file     pfile=fopen(filename,"wb+");             //修改 if(pfile==NULL)     {     	printf("Unable to open this file.");     	exit(1);     }     setvbuf(pfile,NULL,_IOFBF,BUFSIZE); Student member;     //只要有信息读入，就写入文件     while(get_person(&member))//get_person函数返回布尔类型值       fwrite(&member,sizeof(struct Student), 1,pfile);     //输入完信息后，关闭文件     fclose(pfile);pfile=NULL;     //程序应用：选择一个学生，显示其信息与其所有的室友电话号码     find();     fclose(pfile);pfile=NULL;     return 0; } bool get_person(Student *temp) { static char more='\0'; printf("Do you want to enter details of %s student (Y or N)?",                                         more!='\0'?"another":"a"); scanf(" %c",&more); if(tolower(more)=='n')    return false; printf("Enter the name of the student:"); scanf("%s",temp->name);     printf("Enter the student number of the student:"); scanf("%s",temp->stdnum); printf("Enter %s's birthday(day month year):",temp->name); scanf(" %d %d %d",&temp->dob.day,&temp->dob.month,&temp->dob.year); //检验输入的日期是否合理 if((temp->dob.year%4==0&&temp->dob.year%100!=0)||(temp->dob.year%400==0))   {if(temp->dob.month==2&&temp->dob.day>29)    printf("In the Febuary in a leap yaer,that day doesn't exist.");} else   {if(temp->dob.month==2&&temp->dob.day>28)    printf("In the Febuary in a common yaer,that day doesn't exist.");} if((temp->dob.month==1||temp->dob.month==3||temp->dob.month==5||temp->dob.month==7||temp->dob.month==8||temp->dob.month==10||temp->dob.month==12)&&(temp->dob.day>31))        printf("In this month,that day doesn't exist."); if((temp->dob.month==4||temp->dob.month==6||temp->dob.month==9||temp->dob.month==11)&&(temp->dob.day>30))        printf("In this month,that day doesn't exist."); //继续读入其他信息 printf("Enter %s's sex(1 for girls and 0 for boys):",temp->name); scanf("%d",&temp->sex); printf("Enter %s's phone number:",temp->name); scanf("%s",temp->num); return true; } void find(void) {     char *filename="myfile.text"; FILE *pfile=NULL;              pfile=fopen(filename,"rb+"); if(pfile==NULL)     {     	printf("Unable to open this file.");     	exit(2);     }     setvbuf(pfile,NULL,_IOFBF,BUFSIZE);     Student member;     int a,b=0;     char ch[20]; printf("Choose a way in which you can find the student's information(1 for student number and 2 for name):");     scanf("%d",&a);      if(a==1)    {        printf("Enter the student's student number whom you want to contact:");     scanf("%s",ch);     while(fread(&member,sizeof(struct Student),1,pfile)==1)        if(strcmp(member.stdnum,ch)==0)        {           b++;          printf("%s is born on %d/%d/%d/,%s phone number is %s.",member.name,             member.dob.day,member.dob.month,member.dob.year,member.sex==1?"his":"her",member.num); 		}     if(b==0) printf("Sorry,no such student.");    } else if(a==2)    {   printf("Enter the student's name whom you want to contact:");        scanf("%s",ch);                          while(fread(&member,sizeof(struct Student),1,pfile)==1)          if(strcmp(member.name,ch)==0)          {            b++;            printf("%s is born on %d/%d/%d/,%s phone number is %s.",member.name,             member.dob.day,member.dob.month,member.dob.year,member.sex==1?"his":"her",member.num);          }     if(b==0) printf("Sorry,no such student.");     }  }  只能查程序运行时写入文件的信息

#include "stdio.h" #include "ctype.h" #include "stdlib.h" #include "stdbool.h" #include "string.h" #define __STDC_WANT_LIB_EXT1__1 #define NAME_MAX 20 #define BUFSIZE 1000 typedef struct Student Student; typedef struct Birth Birth;        struct Birth { 	int day; 	int month; 	int year; }dob; struct Student { 	char name[NAME_MAX]; 	char stdnum[20]; 	Birth dob;//the student's birthday 	int sex;//1 for girls and 0 for boys 	char num[11];//the student's phone number }Amy; bool get_person(Student *pAmy);//input information about a student void find(void);//function used to find the student  int main(void) { 	char *filename="myfile.text";//The name of file that will be used later(a string) 	FILE *pfile=NULL;         //Pointer to the file     pfile=fopen(filename,"wb"); 	if(pfile==NULL)     {     	printf("Unable to open this file.");     	exit(1);     }     setvbuf(pfile,NULL,_IOFBF,BUFSIZE); 	Student member;     //只要有信息读入，就写入文件     while(get_person(&member))//get_person函数返回布尔类型值       fwrite(&member,sizeof member, 1,pfile);     //输入完信息后，关闭文件     fclose(pfile);pfile=NULL;     //程序应用：选择一个学生，显示其信息与其所有的室友电话号码     void find(void);     fclose(pfile);pfile=NULL;     return 0; } bool get_person(Student *temp) { 	static char more='\0'; 	printf("Do you want to enter details of %s student (Y or N)?", 	                                        more!='\0'?"another":"a"); 	scanf(" %c",&more); 	if(tolower(more)=='n') 	   return false; 	printf("Enter the name of the student:"); 	scanf("%s",temp->name);     printf("Enter the student number of the student:"); 	scanf("%s",temp->stdnum); 	printf("Enter %s's birthday(day month year):",temp->name); 	scanf(" %d %d %d",&temp->dob.day,&temp->dob.month,&temp->dob.year); 	//检验输入的日期是否合理 	if((temp->dob.year%4==0&&temp->dob.year%100!=0)||(temp->dob.year%400==0)) 	  {if(temp->dob.month==2&&temp->dob.day>29) 	   printf("In the Febuary in a leap yaer,that day doesn't exist.");} 	else 	  {if(temp->dob.month==2&&temp->dob.day>28) 	   printf("In the Febuary in a common yaer,that day doesn't exist.");} 	if((temp->dob.month==1||temp->dob.month==3||temp->dob.month==5||temp->dob.month==7||temp->dob.month==8||temp->dob.month==10||temp->dob.month==12)&&(temp->dob.day>31)) 	       printf("In this month,that day doesn't exist."); 	if((temp->dob.month==4||temp->dob.month==6||temp->dob.month==9||temp->dob.month==11)&&(temp->dob.day>30)) 	       printf("In this month,that day doesn't exist."); 	//继续读入其他信息 	printf("Enter %s's sex(1 for girls and 0 for boys):",temp->name); 	scanf("%d",&temp->sex); 	printf("Enter %s's phone number:",temp->name); 	scanf("%s",temp->num); 	return true; } void find(void) {     char *filename="myfile.text"; 	FILE *pfile=NULL;              pfile=fopen(filename,"wb"); 	if(pfile==NULL)     {     	printf("Unable to open this file.");     	exit(2);     }     setvbuf(pfile,NULL,_IOFBF,BUFSIZE);     Student member;     int a,b=0;     char ch[20]; 	printf("Choose a way in which you can find the student's information(1 for student number and 2 for name):");     scanf("%d",&a);      if(a==1)    {        	printf("Enter the student's student number whom you want to contact:");     scanf("%s",ch);     while(fread(&member,sizeof(struct Student),1,pfile)==1)        if(strcmp(member.stdnum,ch)==0)        {           b++;          printf("%s is born on %d/%d/%d/,%s phone number is %s.",member.name,             member.dob.day,member.dob.month,member.dob.year,member.sex==1?"his":"her",member.num); 	   }     if(b==0) printf("Sorry,no such student.");    } 	else if(a==2)    {   printf("Enter the student's name whom you want to contact:");        scanf("%s",ch);                          while(fread(&member,sizeof(struct Student),1,pfile)==1)          if(strcmp(member.name,ch)==0)          {            b++;            printf("%s is born on %d/%d/%d/,%s phone number is %s.",member.name,             member.dob.day,member.dob.month,member.dob.year,member.sex==1?"his":"her",member.num);          }     if(b==0) printf("Sorry,no such student.");     }  } 好像连接上有问题。。。main不会执行find函数  把find放到里面去就执行了 但是结果是错的。。。不管有没有这个学生都输出Sorry,no such student. 求大神帮忙看看o(╥﹏╥)oo(╥﹏╥)oo(╥﹏╥)o

void find()                  {    int a,b=0;       char ch[20];        FILE *fp;           if((fp=fopen("dd.dat","rb"))==NULL)           {            printf("cannot open file\n");            exit(0);                                            }       printf("请输入要查询的成绩的方式\n\t1.编号 2.姓名:\n\t请选择 1 or 2 \t");      scanf("%d",&a);        if(a==1)      {                             getchar();        printf("请输入客户的编号:\t");        gets(ch);                                    while(fread(&customer,sizeof(struct Customer),1,fp)==1)                                    if(strcmp(customer.num,ch)==0)                                     {                                      b++;                                     printf("编号\t姓名\t年龄\t地址\t消费\t积分\t\n");                                     printf("%5s\t%5s\t%5d\t%5s\t%5.2f\t%5.2f\t\n",customer.num,customer.name,customer.age,customer.addr,customer.cost,customer.integral);                                     }                                     if(b==0) printf("对不起！没有找到相关信息：\n");      }      else if(a==2)      {                     printf("请输入成绩的姓名:\t");                            getchar();                            gets(ch);                            while(fread(&customer,sizeof(struct Customer),1,fp)==1)                            if(strcmp(customer.name,ch)==0)                            {                            b++;                            printf("编号\t姓名\t年龄\t地址\t消费\t积分\t\n");                            printf("%5s\t%5s\t%5d\t%5s\t%5.2f\t%5.2f\t\n",customer.num,customer.name,customer.age,customer.addr,customer.cost,customer.integral);                            }       if(b==0) printf("input error!\n");       }      fclose(fp);    }            仿照这个试试


Question: 如何将字符串输入到字符数组中？

在学习的现阶段看来（仅限C语言），使用stdlib.h中的void *__cdecl calloc(size_t _Count, size_t _Size)与void *__cdecl malloc(size_t _Size)是最好的。 谢谢大佬们

#include <stdio.h> #include <string.h> #include <stdlib.h> void sort(char *name [], int n) { 	char * temp; 	int i, j, k; 	for (i = 0; i < (n - 1); i++) 	{ 		k = i; 		for (j = (i + 1); j < n; j++) 			if (strcmp(name[k], name[j]) > 0) 				k = j; 		if (k != i) 		{ 			temp = name[i]; 			name[i] = name[k]; 			name[k] = temp; 		} 	} } void print(char * name[], int n) { 	int i; 	for (i = 0; i < n; i++) 		printf("%s\n", name[i]); }  void main() { 	char *name[3]; 	int i= 0; 	for (i = 0; i < 3; i++) { 		name[i] = (char *)malloc(sizeof(char) * 32); 		if (!name[i]) 			return; 		scanf("%s", name[i]); 	} 	int n = 3; 	sort(name, n); 	print(name, n); 	for (i = 0; i<3; i++) 	{ 		free (name[i]); 		name[i] = NULL; 	}	 	system("pause"); }

变长字符串用数组就不太合适了，标准C++库提供了std::string可以解决您的需求。 具体用法可以百度查询。

但不论是malloc(32 * sizeof(char))还是calloc(32, sizeof(char))，长度都是固定的。当字符串输入过长时，程序依然会崩溃。 以下的赋值是合法的：  void main() { 　　char *name[3] = { "Hello world!", "Welcome to this application!", "Do you accept the rules?" }; 　　// 第一个引号的类型为(const char [12])， 　　// 第二个引号的类型为(const char [28])， 　　// 第三个引号的类型为(const char [25])， }  系统对于"……"中的内容会自动识别，不同长度会自动定义为不同长度的字符数组。 要是输入字符串的比分配的动态内存长怎么办？不能变为动态字符串吗？

因为用于存放字符串的缓存不存在，name[3]是3个指针，这三个指针只想的内存位置是随机，即我们经常提到的野指针。 另外，对字符串，3个字符串赋值也需要循环。   void main() {     char * name[3];     for (i = 0; i < 3; i++) {         name[i] = (char *)malloc(sizeof(char) * 32);         if (!name[i])             return -1;         scanf("%s", name[i]);     }     int n = 3;     sort(name, n);     print(name, n); }  参考一下吧


Question: 怎么样将结果去重（子集和问题的结果）

void back_subset(int i) {     if(c_sum+num[i]==c)     {         result[count]=num[i]; 		for(int i=1 ;i<count;i++ ) 		{ 			if(result[i]>result[i+1]) 				return; 		} 加个这样的判断？

输出的时候加一个判断~后面的元素大于前面的元素才进行输出虽然对效率无提升。

引用 3 楼 lsdlzhvoa0PVTNWey 的回复:另外，在我运行时还发现了同一个元素可能被使用两次甚至三次，怎么修改使其只被使用一次 计算最擅长做重复的事，重复不影像速度的

代码太长，就没兴趣看 说下我的思路，可以把生成的数组，排序。然后把数组生成MD5。以MD5放入 MAP容器就可以了 然后获取MAP容器里数量

我的思路是每生成一个数组时做个排序，这样排除重复就很简单，从头到尾比较，一出现不同即认为没有重复。


Question: 子函数里不可以调用另一个子函数吗？求大神指教

void order(char a[]); int main() {


Question: 【新手】我的这个程序想要输入9733个数（即数据总数为9733个），但是并没有完全输入进去，程序就停住不动了，为什么呢？

#include <stdio.h> #include <stdlib.h>  struct nut {     long nlow;     long nmid;     long nhig; };  void find_cnt(struct nut *pcnt, int *arr, long size); int main(void) {     struct nut cnt = { 0 };      int *p = NULL;     long m, i;      scanf("%ld", &m);      p = (int *)malloc(m * sizeof(int));     if (!p)         return -1;      for (i = 0; i < m; i++)         scanf("%d", p+i);      find_cnt(&cnt, p, m);     printf("%ld %ld %ld\n", cnt.nlow, cnt.nmid, cnt.nhig);      return 0; }  void find_cnt(struct nut *pcnt, int *arr, long size) {     long i;      for (i = 0; i < size; i++) {         switch (arr[i]/10) {             case 0 ... 5:                 pcnt->nlow++;                 break;              case 6 ... 7:                 pcnt->nmid++;                 break;              case 8 ... 10:                 pcnt->nhig++;                 break;         }     } }  /* struct nut *find(struct num *p,long long int m)//定义函数，用于 统计个数； {     struct nut *q;     long long int i;     struct nut a={.i=0,.j=0,.k=0     };     q=&a;     for(i=0;i<m;i++)//主要部分，在某一区间内，相应的参数+1；      {         if(p[i].n<60)         {             q->i++;             //printf("k1=%d",q->i);         }         else if(p[i].n>59&&p[i].n<80)         {//printf("k2=%d",q->j);             q->j++; }         else if(p[i].n>79&&p[i].n<101)         {//printf("k3=%d",q->k);             q->k++;}     }      return (q); //返回指针； } int main() {     struct num *p;     struct nut *q;     long long int m,i;      scanf("%lld",&m);//输入数据个数；     p=(struct num*)malloc(m*sizeof(int));     for(i=0;i<m;i++)//输入数据；     {         scanf("%d",&p[i].n);         fflush(stdin);         //p->i++;     }     q=find(p,m);     printf("%lld %lld %lld",q->i,q->j,q->k);//输出个数；     //printf("%lld",m);     free(p);     return 0;   } */  参考一下吧

p=(struct num*)malloc(m*sizeof(int));  应该是 p = (struct num *)malloc(m * sizeof(struct num));  吧


Question: 求最大值和最小值

程序改成这样已经对了，但是我不懂为啥

引用 2 楼 das白的回复:越界  应该输出a[n-1] 循环条件 j<n-i-1 还是错的，应该不止越界的问题

二层循环应该是 for (j = 0; j < n - i - 1; j++) 不然会越界；比如当i = 0，j = n - i 即j = n -1时，那么j+1就是n，下表只能从0~n-1,所以越界；

printf("%d %d\n", a[0],a[n-1]);

越界  应该输出a[n-1] 循环条件 j<n-i-1

“多一少一”问题占程序员常犯错误的10%以上！ 避免“多一少一”问题的方法之一是将比如<10甚至<5的数代入程序片断，掰手指头心算验证一下程序到底应该写为 x、x-1、x+1中的哪个？ <、<=、==、>、>=中的哪个？


Question: 静态表的顺序查找问题

单步跟踪程序运行，观察变量变化情况，分析原因，比别人给你解释要容易理解

建议贴出你的代码


Question: 求教关于上位机编写程序发送给下位机的串口通信的小程序

createfile writefile readfile closehandle

程序启动时 1 打开指定串口; 2 向串口中写入数据; 3 线程或定时器判断串口中是否有数据可读; 4 如果有数据可读，读出数据并且分析，判断下位机是否已经收到数据;


Question: 请问，如何把内存中的数据转成mat

引用 1 楼 user-1 的回复:你需要按mat文件的格式的要求用二进制方式将数据写到里面 是要用imdecode 感谢

引用 1 楼 user-1 的回复:你需要按mat文件的格式的要求用二进制方式将数据写到里面 请问具体应该怎么做呢，是利用mat的构造函数么 ， 我用 Mat  mat(480, 480, CV_8UC1, data);出来保存的图片是乱的，  之前 忘记说了 这个char的数据是python 解析base64得到的

这个char数据，是python 解析base64编码得出来的

你需要按mat文件的格式的要求用二进制方式将数据写到里面


Question: 我是小白，请路过的大神门进来看看

谭浩强《C程序设计》 　　看书 　　/  \    /    \ 练习——理解

C语言教程（附带C语言100例）http://download.csdn.net/detail/zhao4zhong1/8830817  Visual C++ 2010 Express简体中文版http://pan.baidu.com/s/1bnwRVLt

不清楚你是学生还是已经工作，如果不是考试或者工作要求必须学，那么不学也罢。  如果因为什么原因非要学C语言，那么不要纠结逻辑数学基础是否好，因为好不好也得学^_^ 找一本入门书，准备好一台电脑，配置好编程环境，遇到具体问题过不去，再上论坛求助。

主要靠练习和反思，你会理解到的

如果两者都不具备，真的不建议你入坑，当然，你觉得这行工资高，可你曾看到过凌晨四点的太阳？当然，我也没见过。 逻辑思维差会受到同行的鄙视和排挤，当然你可以不要脸，但老板用个两个月就不会让你待下去。

好的，多谢各位的指引

数学差无所谓，逻辑思维能力的话还是有点影响的~ 不过都是可以学习的，不是吗~    端正态度，比如找个最近自己想开发的软件，动手去写，不会的就去网上查或者论坛里来问，等你完成开发的时候你就懂了一切~

如果这两项都很差，不建议进入IT行业了。或许你说的太严重了，数学差，傅里叶变换，只要不是专门做算法的，对它都不了解；所以术业有专攻，即使是编程；如果做算法的，那么数学要求就很高； 目前，你的状态应该是初学者的心理，不自信；其实也没办法，基础不牢固嘛，都是过来人，没必要太大惊小怪； 你现在的基础薄弱，那么就先去抓基础，比如看书和“抄”代码，看书是熟悉概念，语法和用法；“抄”代码是加深对看到的知识点进行巩固和加深理解；这两者必不可少； 另外，多看代码，尤其是书本上的代码，因为书本上的代码一般都有讲解，自己在抄到编译环境里，调试运行几遍，最后再改改，调试运行； 技术的学习需要多总结的，不能过急，也不要灰心。先会走，在学着跑吧。


Question: 求助 C语言基础

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <ctype.h>   #define STACK_INIT_SIZE 20 #define INCREMENT 10   typedef char ElemType;   typedef float ElemType1;   typedef struct{     ElemType *base;     ElemType *top;     int stackSize; }sqStack; typedef struct{     ElemType1 *base;     ElemType1 *top;     int stackSize; }sqStack1;   void InitStack(sqStack *s) {     s->base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));     if(!s->base){         exit(0);     }       s->top=s->base;     s->stackSize = STACK_INIT_SIZE; } void InitStack1(sqStack1 *s) {     s->base=(ElemType1 *)malloc(STACK_INIT_SIZE*sizeof(ElemType1));     if(!s->base){         exit(0);     }       s->top=s->base;     s->stackSize=STACK_INIT_SIZE; }   void Push(sqStack *s,ElemType e) {     if(s->top-s->base>=s->stackSize){         s->base=(ElemType *)realloc(s->base,(s->stackSize+INCREMENT)*sizeof(ElemType));         if(!s->base){             exit(0);         }     }     *(s->top)=e;     s->top++; } void Push1(sqStack1 *s,ElemType1 e) {     if(s->top-s->base>=s->stackSize){         s->base=(ElemType1 *)realloc(s->base,(s->stackSize+INCREMENT)*sizeof(ElemType1));         if(!s->base){             exit(0);         }     }     *(s->top)=e;     s->top++; }   void Pop(sqStack *s,ElemType *e){     if(s->top==s->base){         return;     }     *e=*--(s->top); } void Pop1(sqStack1 *s,ElemType1 *e){     if(s->top==s->base){         return;     }     *e=*--(s->top); }   int StackLen(sqStack s){     return (s.top-s.base); } int StackLen1(sqStack1 s){     return (s.top-s.base); }   //实例：实现中缀表达式转换为后缀表达式 int main() {     ElemType c,e,str[INCREMENT];     ElemType1 p1,p2,result;     sqStack s,r,q,x;     sqStack1 p;     int i=0;       InitStack(&s);     InitStack(&r);     InitStack(&q);     InitStack(&x);     InitStack1(&p);       printf("请输入中缀表达式,以#结束：\n");     scanf("%c",&c);     while(c!='#'){         while((c>='0'&&c<='9')||c=='.'){    /*逻辑有问题*/             Push(&r,c);             scanf("%c",&c);             if(!((c>='0'&&c<='9')||c=='.')){                 Push(&r,'@');             }         }         if(c==')'){             Pop(&s,&e);             while(e!='('){                 Push(&r,e);                 Push(&r,'@');                 Pop(&s,&e);             }         }else if(c=='+'||c=='-'){             if(!StackLen(s)){                 Push(&s,c);             }else{                 do{                     Pop(&s,&e);                     if(e=='('){                         Push(&s,e);                     }else{                         Push(&r,e);                         Push(&r,'@');                     }                 }while(StackLen(s)&&e!='(');                 Push(&s,c);             }         }else if(c=='*'||c=='/'||c=='('){             Push(&s,c);         }else if(c=='#'){             break;         }else{             printf("Error!");         }         scanf("%c",&c);     }     while(StackLen(s)){         Pop(&s,&e);         Push(&r,e);         Push(&r,'@');     }       getchar();     Push(&q,'#');       while(StackLen(r)){         Pop(&r,&e);         Push(&x,e);         Push(&q,e);     }     printf("转换为后缀表达式的结果为：\n");     while(StackLen(x)){         Pop(&x,&e);         if(e!='@')             printf("%c",e);         else             printf(" ");     }       Pop(&q,&c);     while(StackLen(q)){         while(isdigit(c)||c=='.'){             str[i++]=c;             str[i]='\0';             if(i>=10){                 printf("Error!");             }             Pop(&q,&c);             if(c=='@'){                 p1=atof(str);                 Push1(&p,p1);                 i=0;                 break;             }         }         switch(c){             case '+':Pop1(&p,&p1);Pop1(&p,&p2);Push1(&p,p2+p1);break;             case '-':Pop1(&p,&p1);Pop1(&p,&p2);Push1(&p,p2-p1);break;             case '*':Pop1(&p,&p1);Pop1(&p,&p2);Push1(&p,p2*p1);break;             case '/':Pop1(&p,&p1);Pop1(&p,&p2);if(p1!=0){Push1(&p,p2/p1);}else{printf("Error!");}break;           }         Pop(&q,&c);     }     Pop1(&p,&result);     printf("\n计算得出的结果为：\n%f",result);       return 0; } 参考一下这个朋友的帖子；  http://bbs.csdn.net/topics/392292433

建议自己先写写，遇到问题再提出来。或者在网上搜一些例子改一改

引用最好能把程序写出来 并加一些注释我也这么想


Question: 小白求助，，，为啥一到给结构数组赋值的时候就报错了。。。

char * i_o=new char[1024]; char * start_time=new char[1024]; char * over_time=new char[1024]; char * number=new char[1024];

char * i_o; char * start_time; char * over_time; char * number;   需要申请空间

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h>  struct information           //声明结构体 { 	char  i_o[10]; 	char  start_time[30]; 	char  over_time[30]; 	char  number[30]; }person[20]; FILE *fp;  int main() { 	fp=fopen("d:\\1.txt","r");     char line[120];     int i = 0;     while (fgets(line, 120, fp)) {           char* pch = strtok(line, " ");             strncpy(person[i].i_o, pch, 10 - 1);               pch = strtok(NULL, " ");             strncpy(person[i].start_time, pch, 30 - 1);               pch = strtok(NULL, " ");             strncpy(person[i].over_time, pch, 30 - 1);               pch = strtok(NULL, "\n");             strncpy(person[i].number, pch, 30 - 1);         i++;     }     fclose(fp);     for(int j=0;j<i;j++)      printf("%6s%6s%6s%6s",person[i].i_o,person[i].start_time,person[i].over_time,person[i].number);     return 0; }             大神，，，我这个怎么没有输出结果。。。

楼上两位已经说出了答案。

struct information           //声明结构体 {     char i_o[32];     char start_time[32];     char over_time[32];     char number[32]; }person[max1]; person结构体数组里成员都是指针（野指针），这些指针没有指向有效的空间，所以会出现段错误； 简单的办法就是每个成员都定义成数组；

结构体里面的char*分配内存了吗？ new/malloc

这里有个人问的问题和你类似，已经解决可以参考。 http://bbs.csdn.net/topics/392288195

大神，，，改了之后程序有输出了。。。结果不对啊，，，能不能，，，帮我改一下


Question: .h 声明函数

引用 16 楼 lzb4207123 的回复:[quote=引用 15 楼 qq_41233302 的回复:] [quote=引用 14 楼 lzb4207123 的回复:]  看了下 你的错误提示  你那里有用到 tianjia()这个函数吗 里面的报错是 在tianjia（）中的 有的 tianjia是在zhucaodan里的[/quote]  把那部分代码贴出来一下  zhucaodan() 和 tianjia()  的[/quote] void zhucaodan() {     char c;     system("cls");     printf("\n\t\t|-------欢迎您使用通讯录管理系统1.0beat版-----|");     printf("\n\t\t|    1-添加联系人       2-查询和显示联系人");     printf("\n\t\t|    3-删除联系人       4-修改联系人");     printf("\n\t\t|    5-保存退出         6-不保存退出");     printf("\n\t\t请选择您所所要的服务：");      c = getch();      switch(c){     case '1':         tianjia();         break;      case '2':         chaxun();         break;      case '3':         shanchu();         break;      case '4':         xiugai();         break;      case '5':         baocun();         break;     case '6':         exit(0);      default:         zhucaodan();     } }  #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h>  void tianjia() { printf("\n\t\t------------------ 请输入联系人信息 --------------------\n"); printf("\n\t\t输入联系人姓名:"); scanf("%s",txl[n].xingming); /*键盘输入*/ printf("\n\t\t输入联系人电话号码:"); scanf("%s",txl[n].dianhua); printf("\n\t\t输入联系人地址:"); scanf("%s",txl[n].dizhi); n++; /*统计个数*/ printf("\n\t\t是否继续添加联系人?(Y/N):"); /*是否继续输入联系人.*/ if (getch()=='y') tianjia(); return;  }

引用 19 楼 lzb4207123 的回复:在tianjiah函数.c文件中也加上 main.h的头文件 要不程序认不到你在main.h中定义的 “n”和“txl”  终于好了   谢谢大佬

引用 17 楼 qq_41233302 的回复:[quote=引用 16 楼 lzb4207123 的回复:] [quote=引用 15 楼 qq_41233302 的回复:] [quote=引用 14 楼 lzb4207123 的回复:]  看了下 你的错误提示  你那里有用到 tianjia()这个函数吗 里面的报错是 在tianjia（）中的 有的 tianjia是在zhucaodan里的[/quote]  把那部分代码贴出来一下  zhucaodan() 和 tianjia()  的[/quote] void zhucaodan() {     char c;     system("cls");     printf("\n\t\t|-------欢迎您使用通讯录管理系统1.0beat版-----|");     printf("\n\t\t|    1-添加联系人       2-查询和显示联系人");     printf("\n\t\t|    3-删除联系人       4-修改联系人");     printf("\n\t\t|    5-保存退出         6-不保存退出");     printf("\n\t\t请选择您所所要的服务：");      c = getch();      switch(c){     case '1':         tianjia();         break;      case '2':         chaxun();         break;      case '3':         shanchu();         break;      case '4':         xiugai();         break;      case '5':         baocun();         break;     case '6':         exit(0);      default:         zhucaodan();     } }  #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h>  void tianjia() { printf("\n\t\t------------------ 请输入联系人信息 --------------------\n"); printf("\n\t\t输入联系人姓名:"); scanf("%s",txl[n].xingming); /*键盘输入*/ printf("\n\t\t输入联系人电话号码:"); scanf("%s",txl[n].dianhua); printf("\n\t\t输入联系人地址:"); scanf("%s",txl[n].dizhi); n++; /*统计个数*/ printf("\n\t\t是否继续添加联系人?(Y/N):"); /*是否继续输入联系人.*/ if (getch()=='y') tianjia(); return;  }  [/quote]  在添加的.c文件中也加上 main.h的头文件 要不程序认不到你在main.h中定义的 “n”和“txl”

引用 9 楼 lzb4207123 的回复:main.h头文件中改下  struct  tongxunlu { //你的数据 }; extern struct  tongxunlu txl[100]; extern int n;   main.c中 在int main()前加头文件后加上 struct  tongxunlu txl[100]; int n=0;  还是不行啊，大佬们，我想不通

引用 15 楼 qq_41233302 的回复:[quote=引用 14 楼 lzb4207123 的回复:]  看了下 你的错误提示  你那里有用到 tianjia()这个函数吗 里面的报错是 在tianjia（）中的 有的 tianjia是在zhucaodan里的[/quote]  把那部分代码贴出来一下  zhucaodan() 和 tianjia()  的

引用 14 楼 lzb4207123 的回复: 看了下 你的错误提示  你那里有用到 tianjia()这个函数吗 里面的报错是 在tianjia（）中的 有的 tianjia是在zhucaodan里的

引用 11 楼 lzb4207123 的回复:[quote=引用 10 楼 qq_41233302 的回复:] [quote=引用 9 楼 lzb4207123 的回复:] main.h头文件中改下   struct  tongxunlu { //你的数据 }; extern struct  tongxunlu txl[100]; extern int n;   main.c中 在int main()前加头文件后加上 struct  tongxunlu txl[100]; int n=0;  还是不行啊，大佬们，我想不通 [/quote]  我这里用你上面的代码做了一个测试 main.h文件 #ifndef _MAIN_H_ #define _MAIN_H_  struct tongxunlu { 	char xingming[20]; 	char dianhua[20]; 	char dizhi[40]; };   extern struct tongxunlu txl[100]; extern int n;  extern void zhucaodan(); extern void tianjia(); extern void baocun(); extern void chaxun(); extern void shancuo(); extern void xiugai();  #endif  main.c文件  其中你实现的其他功能代码不知道 所以void zhucaodan()中就只有打印 “THIS IS TEST”  #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h>  #define MAX_CUT 100  #include "./include/main.h"  struct tongxunlu txl[100]; int n = 0;  int main() { 	 	system("cls"); 	while(1) 	{ 		zhucaodan(); 	} 	 	return 0; }   void zhucaodan() { printf("THIS IS TEST\n");	 fflush(stdout); return; }  文件结构如下：include文件中包含main.h文件   编译结构：  运行效果：因为你的循环中没有出口  标准输出不能显示 就在 打印后面加个一个刷新标准输出fflush(stdout)   可能是文件结构和你不一样 我main.c 使用的是 #include "./include/main.h" 而不是 #include "../include/main.h" [/quote]  我的就是将void zhucaodan再单独用一个.c文件写，然后它就抽风了 为什么呀？？？

引用 10 楼 qq_41233302 的回复:[quote=引用 9 楼 lzb4207123 的回复:] main.h头文件中改下  struct  tongxunlu { //你的数据 }; extern struct  tongxunlu txl[100]; extern int n;   main.c中 在int main()前加头文件后加上 struct  tongxunlu txl[100]; int n=0;  还是不行啊，大佬们，我想不通 [/quote]  我这里用你上面的代码做了一个测试 main.h文件 #ifndef _MAIN_H_ #define _MAIN_H_  struct tongxunlu { 	char xingming[20]; 	char dianhua[20]; 	char dizhi[40]; };   extern struct tongxunlu txl[100]; extern int n;  extern void zhucaodan(); extern void tianjia(); extern void baocun(); extern void chaxun(); extern void shancuo(); extern void xiugai();  #endif  main.c文件  其中你实现的其他功能代码不知道 所以void zhucaodan()中就只有打印 “THIS IS TEST”  #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <string.h>  #define MAX_CUT 100  #include "./include/main.h"  struct tongxunlu txl[100]; int n = 0;  int main() { 	 	system("cls"); 	while(1) 	{ 		zhucaodan(); 	} 	 	return 0; }   void zhucaodan() { printf("THIS IS TEST\n");	 fflush(stdout); return; }  文件结构如下：include文件中包含main.h文件   编译结构：  运行效果：因为你的循环中没有出口  标准输出不能显示 就在 打印后面加个一个刷新标准输出fflush(stdout)   可能是文件结构和你不一样 我main.c 使用的是 #include "./include/main.h" 而不是 #include "../include/main.h"

引用 7 楼 atsillabkp 的回复:感觉是main.h有问题，看看有没有 txl？ .h里是有的 哎，心态崩了

感觉是main.h有问题，看看有没有 txl？

引用 4 楼 qq_41233302 的回复:[quote=引用 1 楼 lzb4207123 的回复:] 在实现文件中#include <stdio.h>  .c是有的 它就是不行 [/quote] 上一个路径下的include文件夹下面的math.h文件的第6行的txl出的问题

缺少stdio.h头文件； 你需要保证每个.c文件里只要用到printf和scanf的，都引入stdio.h

引用 1 楼 lzb4207123 的回复:在实现文件中#include <stdio.h>  .c是有的 它就是不行

引用 1 楼 lzb4207123 的回复:在实现文件中#include <stdio.h> 正解，不引用编译器会根据你的用法给它匹配一个原型，在某些时候（返回值大于等于2^31等情况）会出错的

txl变量没有定义

在实现文件中#include <stdio.h>


Question: 用链表结构实现约瑟夫环

#include<stdio.h> #include<stdlib.h> #include<string.h>  struct node {     int num;     char name[20];     struct node *next; };  struct node *create_singly_link(int num) {     struct node*head, *prev, *cur;     int i;      head = NULL;     for(i = 0; i < num; i++) {         cur = (struct node *)malloc(sizeof(struct node));         if (!cur) {             printf("Malloc error!");             return NULL;         }         cur->next = NULL;         cur->num = i+1;         snprintf(cur->name, 20-1, "%c", 'A'+i);         if (!head) {             head = cur;             prev = cur;         } else {             prev->next = cur;             prev = prev->next;         }     }     prev->next = head;     return head; }  static void test_print(struct node *phead) {     struct node *pcur = phead->next;      printf("num = %d\t name = %s\n", phead->num, phead->name);     while (pcur != phead) {         printf("num = %2d\t name = %s\n", pcur->num, pcur->name);         pcur = pcur->next;     } }  int output( struct node *head, int start, int step, int total) {     struct node *p, *q;     int count = 0;     int num = 0, i;      q = head;      for(i = 0; i < start; i++)         q = q->next;      while(count < total-1) {         p = q->next;         num++;         if(!(num % step)) {             q->next = p->next;             printf("%s\n", p->name);             free(p);             count++;         } else {             q = p;         }     }     printf("num = %d\t, name = %s\n", q->num, q->name);     free(q);      return 0; } int main(int argc, const char *argv[]) {     int total, step, start;     struct node *head;      printf("Please input total test number: ");     scanf("%d", &total);     head = create_singly_link(total);     test_print(head);      printf("Please input start position and steps: ");     scanf("%d%d", &start, &step);      output(head, start, step, total);      return 0; } 参考一下吧


Question: 我知道这样很蠢，但是就是想实现一下

#include<stdio.h> #include <ctype.h> #include <string.h>   struct cnt_info {     int ndigit;     int nchar;     int nspace;     int nother; }; void cout(const char *str, struct cnt_info *pcnt);  /*     char zimu(char x[]);     char kongge(char x[]);     char shuzi(char x[]);     char qita(char x[]);                            // 四种函数声明 */ int main() {      /*     char x[256];     int a=0,b=0,c=0,d=0;     printf("请输入：\n");     gets(x);      a = zimu(x);     b = kongge(x);     c = shuzi(x);     d = qita(x);                                           // 带回函数值      printf(" 字母有%d个\n 空格有%d个\n 数字有%d个\n 其它字符有%d个\n",a,b,c,d); // 输出字符     */      char str[256];     struct cnt_info cnt = { 0 };      fgets(str, 256, stdin);     str[strlen(str)-1] = 0;      cout(str, &cnt);     printf(" 字母有%d个\n 空格有%d个\n 数字有%d个\n 其它字符有%d个\n",             cnt.nchar, cnt.nspace, cnt.ndigit, cnt.nother); // 输出字符      return 0; }  void cout(const char *str, struct cnt_info *pcnt) {     int i = 0;      while (str[i]) {         if (isdigit(str[i]))             pcnt->ndigit++;         else if (isalpha(str[i]))             pcnt->nchar++;         else if (isspace(str[i]))             pcnt->nspace++;         else             pcnt->nother++;         i++;     } }  /* char zimu(char x[]) {     int a1=0,i;     for(i=0;i<=x[i];i++)     {         if('A'<=x[i]&&x[i]<='z')             a1++;     }     return (a1); }  char kongge(char x[]) {     int b1=0,i;     for(i=0;i<=x[i];i++)     {         if(x[i] == ' ')             b1++;     }     return (b1); }  char shuzi(char x[]) {     int c1=0,i;     for(i=0;i<=x[i];i++)     {         if('0'<=x[i]&&x[i]<='9')             c1++;     }     return (c1); }  char qita(char x[]) {     int d1=0,i;     for(i=0;i<=x[i];i++)     {         if(x[i]<'A'&&x[i]>'z'&&x[i]>'9'&&x[i]<'0'&&x[i]!=' ')             d1++;     }     return (d1); } */ 参考一下吧  可以通过if else一次遍历字符串得到：数字，字母，空格，其他字符的总数； 另外，有专门的判断函数，可以使用；  你的空格判断，字符判断有问题；

错误较多，往仔细检查： 1. 每个判断函数不需要传入长度吗，怎么能用数组的内容作为长度结束的标志 2. 空格函数的判断对吗 3. 按你的逻辑，其他函数只要对前面三个函数的条件与(&&)取非（！）就可以了  非常不建议这么写，效率低下，逻辑杂乱，小程序也是需要设计的

不是这3种情况，就算是“其它”啊！


Question: 关于地址指向问题！！求教！谢谢

字符串"world"是只读的，在只读数据段，不在栈上申请空间； str和str3都是在栈上，即"hello"和你输入的字符串，都是在栈上；  "hello"字符串也是在只读数据段，str在栈上申请了空间，所以将"hello"从只读数据段拷贝到栈上； str2只是在栈上定义的指针，没有存放"world"的空间，因此str2存放了"world"的地址；

引用 2 楼 hu1991514 的回复:[quote=引用 1楼棉猴 的回复:]C++程序的内存中，有一块专门用来保存代码中用到的常量字符串。str2指向的应该是这个常量字符串区的地址，即内存中保存“world”字符串的地址。 图1是我的C++程序中字符串“world”在内存中的地址0x009A6B30，另一个字符串是“hello”  图1 内存地址 图2是str2的地址，可以看到其值即为0x009A6B30，是图1中字符串“world”的地址  图2 变量值但是world不是在main函数内吗，跟hello一样在栈里被分配的内存吗？既然hello指向栈内存，那么同样在main函数中定义的world就要指向代码段呢？忘指点，谢谢！[/quote] 不都告诉你了吗 char*相当于const char*， 是字符串常量。和char[]不一样。 可以自己搜一下字符串常量

引用 1楼棉猴 的回复:C++程序的内存中，有一块专门用来保存代码中用到的常量字符串。str2指向的应该是这个常量字符串区的地址，即内存中保存“world”字符串的地址。 图1是我的C++程序中字符串“world”在内存中的地址0x009A6B30，另一个字符串是“hello”  图1 内存地址 图2是str2的地址，可以看到其值即为0x009A6B30，是图1中字符串“world”的地址  图2 变量值但是world不是在main函数内吗，跟hello一样在栈里被分配的内存吗？既然hello指向栈内存，那么同样在main函数中定义的world就要指向代码段呢？忘指点，谢谢！

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


Question: 求助一个VC++6.0的问题

char c='';  //char c = ‘ ’;  红字部分是错误的修改下; 要在''中间加个空格或者其他字符 要不会提示：空字符常量

/*格式化输出日历*/ void PrintYear (int year)  {     int m,i,d;     char c='';  //char c = ‘ ’；     int MONTH[12]={31,28,31,30,31,30,31,31,30,31,30,31};     if(IsLeap(year))MONTH[1]=29;     int firstwed=FirstWeeday(year);     printf("Year:%d\n",year);     printf("========================\n");     for(m=0;m<12;m++)  {       PrintMonTitl(m);       PrintWeedTitl();   for(d=1;d<=MONTH[m];d++)  {         if(d==1)  {            for(i=0;i<firstwed;i++)             printf("%5c",c);             printf("%5d",d);         }         else {             printf("%5d",d);         }                    if((firstwed+d-1)%7==6)printf("\n");       }        firstwed=(firstwed+MONTH[m])%7;       printf("\n");    }  }

/*打印星期*/ void PrintWeedTitl()  {  int i;  for(i=0;i<7;i++) {   witch(i)  // 改成 switch(i) 你少打了一个S    {       case 0 : printf("Sun");break;       case 1 : printf("Mon");break;       case 2 : printf("Tue");break;       case 3 : printf("Wed");break;       case 4 : printf("Thu");break;       case 5 : printf("Fri");break;       case 6 : printf("Sat");break;       default : break;    }   }     printf("\n"); }

有个switch少了个S


Question: C语言新手求助，为何输出的格式不正确

感觉逻辑有点不对，源程序有部分分支没有算end3的值，因此会中断。 这样改了可能好点。 int main (void) {     float a0,a1,a2,a3;     float a,b,c,end1,end2,end3;     scanf("%f%f%f%f",&a0,&a1,&a2,&a3);     scanf("%f%f",&a,&b);     while(b-a>=0.001)     {         end1=a3*a*a*a+a2*a*a+a1*a+a0;         end2=a3*b*b*b+a2*b*b+a1*b+a0;         c = (a+b)/2;         end3 = a3*c*c*c+a2*c*c+a1*c+a0;             if(fabs(end3) < 1e-6)             break;          if(end1*end3 > 0)             a=c;         else if(end2*end3 > 0)             b=c; 		 else if(end1==0) 		  break; 		  else if(end2==0) 		  break;     }     printf("%.2f\n",c);     return 0; }

#include<stdio.h> #include <math.h>  int main (void) {     float a0,a1,a2,a3;     float a,b,c,end1,end2,end3;     scanf("%f%f%f%f",&a0,&a1,&a2,&a3);     scanf("%f%f",&a,&b);     while(b-a>=0.001)     {         end1=a3*a*a*a+a2*a*a+a1*a+a0;         end2=a3*b*b*b+a2*b*b+a1*b+a0;         if(end1*end2<0)         {             c = (a+b)/2;             end3 = a3*c*c*c+a2*c*c+a1*c+a0;         }         if(fabs(end3) < 1e-6)             break;         else if(end1*end3 < 0)             b=c;         else if(end2*end3 < 0)             a=c;         else if(fabs(end1) < 1e-6)             break;         else if(fabs(end2) < 1e-6)             break;     }     printf("%.2f\n",c);     return 0; } 参考一下吧；

浮点数不要直接用==判断，一定要判断相等时，用差值小于极小数表示。

按这个格式输入 ，输出格式还是不正确

浮点数格式 http://bbs.csdn.net/topics/390676437


Question: C语言头文件问题

看了一下应当是 add.h 函数声明没有以分号结束。

头文件的函数声明最后要有分号

已解决

对了，我用的是codeblocks编写的，版本是13.12，编译器是自带的


Question: 这个程序为什么会跳不出循环？？

可以自己设置断点调试一下

在for循环中间加一个i<=m

引用 3 楼 qq_24852439的回复:[quote=引用 1 楼 qq_38204686 的回复:] 第一个for循环没有判断条件 #include<stdio.h> int main(){     int m,n,sum=0; //sum用来记录素数 m n为用户输入     int flag=1; //flag用以标记当前是第几个素数 默认为1     do     {         scanf("%d%d",&n,&m);     }     while(n<=0||m<n||m>200); //健壮性 控制合理的用户输入       if(n==1)         sum+=2; // 第一个素数为2 sum+2；       int is = 0;     for(int i=2;;i++)     {         is = 1;         if(flag>m) // 判断加素数的次数是否等于m             break; //等于m则跳出           for(int j=2;j<i;j++)         { //判断是否为素数               if(i%j==0)             {                 is=0;                 break;             } //不是素数则跳出         }           if(is==1)         {               if(flag>=n) //flag要大于起始的n 素数才开始相加                 sum+=i; //sum为素数和                flag++; //是素数 flag++          }     }     printf("%d\n",sum);     return 0; } 这个也没有判断条件诶，这个怎么有输出呀。[/quote] 有的 if flag>m break 这个break可以跳出循环

引用 1 楼 qq_38204686 的回复:第一个for循环没有判断条件 #include<stdio.h> int main(){     int m,n,sum=0; //sum用来记录素数 m n为用户输入     int flag=1; //flag用以标记当前是第几个素数 默认为1     do     {         scanf("%d%d",&n,&m);     }     while(n<=0||m<n||m>200); //健壮性 控制合理的用户输入       if(n==1)         sum+=2; // 第一个素数为2 sum+2；       int is = 0;     for(int i=2;;i++)     {         is = 1;         if(flag>m) // 判断加素数的次数是否等于m             break; //等于m则跳出           for(int j=2;j<i;j++)         { //判断是否为素数               if(i%j==0)             {                 is=0;                 break;             } //不是素数则跳出         }           if(is==1)         {               if(flag>=n) //flag要大于起始的n 素数才开始相加                 sum+=i; //sum为素数和                flag++; //是素数 flag++          }     }     printf("%d\n",sum);     return 0; } 这个也没有判断条件诶，这个怎么有输出呀。

#include<stdio.h> int main(){     int m,n,sum=0; //sum用来记录素数 m n为用户输入     int flag=1; //flag用以标记当前是第几个素数 默认为1     do     {         scanf("%d%d",&n,&m);     }     while(n<=0||m<n||m>200); //健壮性 控制合理的用户输入       if(n==1)         sum+=2; // 第一个素数为2 sum+2；       int is = 0;     for(int i=2;;i++)     {         is = 1;         if(flag>m) // 判断加素数的次数是否等于m             break; //等于m则跳出           for(int j=2;j<i;j++)         { //判断是否为素数               if(i%j==0)             {                 is=0;                 break;             } //不是素数则跳出         }           if(is==1)         {               if(flag>=n) //flag要大于起始的n 素数才开始相加                 sum+=i; //sum为素数和                flag++; //是素数 flag++          }     }     printf("%d\n",sum);     return 0; } 这个也没有判断条件诶，这个怎么不是死循环？

第一个for循环没有判断条件


Question: 在尾部插入新节点怎么会出问题啊

还有一个问题 void readfile(char name[]) { 	FILE *fp;    char str[100];    fp = fopen( "name" , "r" );        while( !feof(fp) )    { 	   fgets( str , 100 , fp ); 	   printf( "%s" , str );    } 	fclose (fp);  }  int main() { 	char name[10]; 	scanf("%s" , name); 	readfile(name); } 为什么不能读我输入的文件名对应的文件，是不是要用到argv[]这个参数，怎么改呢？

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

#include <stdio.h> #include <string.h> #include <stdlib.h>  struct node {     int data;     char name[100];     struct node *next; };  struct node * creat ( int n ) {     struct node *head, *p, *q;     int i=0 ;     p = (struct node *)malloc(sizeof(struct node));     p->data = 1;     head = p;      while (i < n) {         q = (struct node * )malloc(sizeof(struct node));         if (!q) {             printf("error!\n");             exit(0);         }         q->data = i;    /* for q->data, not for p->data */         strcpy(q->name, "hello");  /*for q->name, not for p->name*/         p->next = q;         p = q;         i = i+1;     }     //p = head;   /*冗余代码*/     q->next = NULL;     return(head); }   void output(struct node *head) //输出链表 {     struct node *p;     p = head->next;     while (p)     {         printf("%d %s\n" , p->data, p->name);         p = p->next;     } }   struct node *search( struct node *head ,  int f )             //查找当前结点 {     struct node *p;      p = head->next;     while(p)     {         if( f == p->data )             return(p);         p = p->next;     }      return NULL; }  struct node *search2( struct node *head ,  int f )             //查找当前结点的前一个结点 {     int i=0;     struct node *p, *q;     p = head;     q = head->next;     while( p != NULL )     {         if( f == i )         {             return(q);             //break;       //return后已经返回了，不需要再用break;         }         else         {             p = p->next;             q = q->next;             i = i+1;         }     }      return NULL; }  struct node * insert_head(  struct node *head ) {     struct node *pnew;      pnew = (struct node *)malloc(sizeof(struct node));             //在头节点前插入结点     pnew->data = 78;     strcpy(pnew->name , "start" );     pnew->next = head;      head = pnew;      return head; }  void insert(  struct node *head )                                    //在中间插入 {     int f=0;     struct node *pnew , *p;     p = head;     pnew = (struct node *)malloc(sizeof(struct node));     while( p )     {         if( f == 3 )         {             strcpy( pnew->name , "zhongjian" );             pnew->data = 99;             pnew->next = p->next;             p->next = pnew;             break;         }         else         {             f = f+1;             p = p->next;         }     } }  void insert_end( struct node *head )                                             //在结尾插入 {     struct node *pnew, *p;     p = head;     pnew = (struct node *)malloc(sizeof(struct node));     if (!pnew)         exit(0);     while(p->next != NULL )     {         p = p->next;     }     pnew->data = 22;     strcpy( pnew->name , "end" );     pnew->next = NULL;     p->next = pnew;      /*     while( p )     {         printf("%d %s\n" , p->data, p->name);         p = p->next;     }     //p = head;     */ }  void del( struct node *x , struct node *y ) //删除结点 {     struct node *del;     del = y;     x->next = y->next;     free(del); }  int main() //主函数 {      int number=5 , i=0;     struct node *head, *searchp, *searchp2, *q;      head = creat(number);     printf("Show link: \n");     output(head);     // searchp = search( head , 2 );     // searchp2 = search2( head , 2 );     //head = insert_head(head);     // insert( head );     insert_end( head );     printf("Show link: \n");     output(head);     //del( searchp , searchp2 );     //output(head);  } 参考一下吧；  创建链表时出现结构体对象赋值错误，详见代码里的注释；  头插法也已经修改，问题是要返回新的头结点； 搜索的问题，参考函数search；  有些代码冗余，个人感觉可以去掉的，也一并修改了。参考一下吧；

注意，新节点，malloc后，要把它的next置NULL


Question: 内存地址的问题，求教！

不知道你的小是指什么？

我们的系统都是有MMU的，即内存管理单元，我们打印出来的都是虚拟地址，即MMU会将物理地址和虚拟地址做一个映射；


Question: 字符数组用%s输入后，由0变为-2？

引用 6 楼 lzb4207123 的回复:测试了一下scanf_s函数   后面的（-2）其实是scanf_s 赋值的； scanf_s("%s", s, 1000);  //读取输入缓存中1000个赋值给s 而输入缓存中没有被赋值的都是0xfe 你后面的没有赋值所有全部都是0xfe       后面是改为scanf_s("%s", s, 50);的结果 ,可以看到就前面的50个被赋值    非常感谢

引用 2 楼 cfjtaishan 的回复:在Linux下测试没发现这个问题，得到的是0； 如果你的测试每次都是这样的结果（非0），那么可能数组被优化了（编译器优化）。申请1000个字节，实际上没有1000个字节； 用sizeof测了一下，是1000呀，还是不太明白

引用 3 楼 lzb4207123 的回复:大概因为你没有初始化 你的s char s[1000] = {0};  大概只是把你最前一个数字赋值成0；后面的还是内存之前的 你最好在后面加上 memset(s, 0, 1000); 应该不是这个的问题，把scanf删掉后是一样的，不过依旧非常感谢


Question: C语言-判断二叉树是否为完全二叉树 求帮忙看下问题出在哪

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


Question: 请教，语言fflush（）的问题

在每个最后不带\n的printf后面加fflush(stdout); 在每个不想受接收缓冲区旧内容影响的scanf前面加rewind(stdin); 另外请检查scanf的返回值。 //请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

引用 8楼自信男孩 的回复:fflush(stdin);在有些系统的编译器里是将输入缓存里的数据刷到内存，即标准输入（键盘）输入先放在输入缓存里，然后再通过回车/fflush(stdin)刷到内存。 因此fflush(stdin)是将输入缓存里的数据刷到内存指定位置，而不是清除；当然，fflush在有些系统里有这个功能，就是清除缓存里残留的数据，比如换行符'\n'；  另外，注意的是fflush(stdin);清除残留在输入缓存里的数据功能并不是总是有效的，在LInux系统下fflush(stdin)是未定义的，（fflush(stdou)刷新输出缓存是可以的）我一共就发了两个帖子，能帮我看看另外一个帖子里面的问题吗？谢谢啦

引用 3楼das白 的回复:这个函数是清理缓冲区 的引用 1楼老马何以识途 的回复:
那是清理缓冲区啊，但是你的数据已经取到a和b两个变量了，跟输入缓冲区不再有关系。 不是说先输入到缓冲区吗？什么时候写到内存呢？如果还没有写到内存，那么清理缓冲区岂不是数据就没用了吗？我还是不太明白书本上写的，等到空闲的时候再把缓冲区的数据写到内存！望指点！

引用 3楼das白 的回复:这个函数是清理缓冲区 的我一共就两个帖子，能帮我看看另一个帖子的问题吗？谢谢啦

引用 1楼老马何以识途 的回复:那是清理缓冲区啊，但是你的数据已经取到a和b两个变量了，跟输入缓冲区不再有关系。我一共就两个帖子，能帮我看看另一个帖子的问题吗？谢谢啦

scanf已经写把缓冲区的内容写到变量里了

这个函数是清理缓冲区 的

引用 1楼老马何以识途 的回复:那是清理缓冲区啊，但是你的数据已经取到a和b两个变量了，跟输入缓冲区不再有关系。不是说先输入到缓冲区吗？什么时候写到内存呢？如果还没有写到内存，那么清理缓冲区岂不是数据就没用了吗？我还是不太明白书本上写的，等到空闲的时候再把缓冲区的数据写到内存！望指点！


Question: 请问我的指向指针的指针向量为什么无法循环

PHI是野指针，因此不能直接PHI[i][j] = 0;赋值。野指针很可能会导致段错误； 解决办法，在for循环前，执行：   PHI = (double **)malloc(sizeof(double *) * (NX+1)); if (!PHI)     exit(0); for (i = 0; i < NX+1; i++) {     PHI[i] = (double *)malloc(sizeof(double) * (NY+1));     if (!PHI[i])         exit(0); }

你的PHI并没有指向任何有效地址，怎么能直接操作呢？


Question: c语言新手请教关于i/o的问题

引用 10楼赵4老师 的回复:仅供参考：#include <stdio.h> int main() {     int a,b,n,v,r,k;     char buf[80];     char *p;      k=0;     r=EOF;     while (1) {         if (EOF==r) {             fgets(buf,80,stdin);             p=buf;         }         while (1) {             r=sscanf(p,"%d%n",&v,&n);             if (1==r) {k++;break;}             if (EOF==r) break;             p++;         }         if (EOF==r) continue;         p+=n;         if (1==k) a=v;         if (2==k) {             b=v;             break;         }     }     printf("%d,%d\n",a,b);     return 0; }  输入两个整数，随便用什么间隔，随便输非法字符。感谢

引用 4 楼 hu1991514 的回复:[quote=引用 3楼自信男孩 的回复:][quote=引用 2 楼 hu1991514 的回复:] [quote=引用 1楼自信男孩 的回复:]输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；int型的c为什么能接受字符型的a？   还有就是我在第一个scanf输入4 5 a三个字符！为什么getchar什么都没有接收到！缓冲区理论上是有数据的！我并没有fflush（）[/quote] 你可以查一下getchar();的返回值； 另外，getchar();是获取字符，那么一个字符的范围是0~128,占一个字节，那么int类型c完全可以存放了。[/quote]存肯定是能存呀！但是c是整形变量，getchar获取的是char型！类型不匹配呀！望指点！[/quote] 看一下getchar()的返回值，getchar()返回的是字符，用int类型类型会提升

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。

引用 6楼das白 的回复:字母全是asc码 也可以看做整数  之所以用int是为了接受-1 eof 而char只是0-255我看书上说，getchar接收到的字符换转换成一个整数！是这样吗？如果接收到的是浮点型都会转成整数？

引用 1楼自信男孩 的回复:输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；我刚刚看了下，说getchar获取一个字符返还为一个整数！我很好奇，如果获取的是一个char型的字母a，怎么会返回整数呢

引用 3楼自信男孩 的回复:[quote=引用 2 楼 hu1991514 的回复:] [quote=引用 1楼自信男孩 的回复:]输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；int型的c为什么能接受字符型的a？   还有就是我在第一个scanf输入4 5 a三个字符！为什么getchar什么都没有接收到！缓冲区理论上是有数据的！我并没有fflush（）[/quote] 你可以查一下getchar();的返回值； 另外，getchar();是获取字符，那么一个字符的范围是0~128,占一个字节，那么int类型c完全可以存放了。[/quote]存肯定是能存呀！但是c是整形变量，getchar获取的是char型！类型不匹配呀！望指点！

引用 2 楼 hu1991514 的回复:[quote=引用 1楼自信男孩 的回复:]输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；int型的c为什么能接受字符型的a？   还有就是我在第一个scanf输入4 5 a三个字符！为什么getchar什么都没有接收到！缓冲区理论上是有数据的！我并没有fflush（）[/quote] 你可以查一下getchar();的返回值； 另外，getchar();是获取字符，那么一个字符的范围是0~128,占一个字节，那么int类型c完全可以存放了。

引用 1楼自信男孩 的回复:输入aa, bb是无法和int类型a, b匹配的，所以aa， bb不会到内存里，只能残留在输入缓存里。这时getchar()接收一个字符，那么就会把aa的a字符接收了。所以就输出a了。  若输入5， 6后，你没看到有输出，那是因为输出的是换行符（'\n'），你有没有注意puchar(c);输出的是换行（多一个空行）； 这是因为，输入5, 6后（还会有回车操作），换行符会残留在输入缓存里，此时getchar();正好接收了这个换行符，所以puchar(c)就是输出换行符；int型的c为什么能接受字符型的a？   还有就是我在第一个scanf输入4 5 a三个字符！为什么getchar什么都没有接收到！缓冲区理论上是有数据的！我并没有fflush（）


Question: 这句代码用Java如何表示，求大神指导，急急急！！！

不要做A语言代码修改为B语言代码的无用功。 也不要做用A语言代码直接调用B语言代码库这样复杂、这样容易出错的傻事。 只需让A、B语言代码的输入输出重定向到文本文件，或修改A、B语言代码让其通过文本文件输入输出。 即可很方便地让A、B两种语言之间协调工作。 比如： A将请求数据写到文件a.txt，写完后改名为aa.txt B发现aa.txt存在时，读取其内容，调用相应功能，将结果写到文件b.txt，写完后删除aa.txt，再将b.txt改名为bb.txt A发现bb.txt存在时，读取其内容，读完后删除bb.txt 以上A可以替换为任何一种开发语言或开发环境，B可以替换为任何一种与A不同的开发语言或开发环境。 除非A或B不支持判断文件是否存在、文件读写和文件更名。 但是谁又能举出不支持判断文件是否存在、文件读写和文件更名的开发语言或开发环境呢？ 可以将临时文件放在RamDisk上提高效率减少磨损磁盘。 数据的结构很复杂的话，文本文件的格式问题可参考json或xml  共享临时文本文件这种进程之间的通讯方法相比其它方法的优点有很多，下面仅列出我现在能想到的： ·进程之间松耦合 ·进程可在同一台机器上，也可跨机，跨操作系统，跨硬件平台，甚至跨国。 ·方便调试和监视，只需让第三方或人工查看该临时文本文件即可。 ·方便在线开关服务，只需删除或创建该临时文本文件即可。 ·方便实现分布式和负载均衡。 ·方便队列化提供服务，而且几乎不可能发生队列满的情况（除非硬盘空间满） ·……  “跨语言、跨机，跨操作系统，跨硬件平台，跨国，跨*.*的”苦海无边， 回头是“使用共享纯文本文件进行信息交流”的岸！

char* b = (char*)&n; 这个在JAVA里也能用吧，这个是强制类型转换；


Question: c socket遇到的问题，求助···最后的100分全给了

accept的问题楼上几位大拿都说了~ 服务端缓存你可以使用文件形式存储在本地，也可以使用第三方sqlite轻量级数据库存储，或者使用access数据库存储，方式很多~ 如果嫌麻烦，可以直接搞个全局变量存在内存中~

参考代码：  typedef struct sinfo { 	char type[32]; 	int num; }info;   iDataNum = recv(client, buff, sizeof(info), 0);   强烈建议处理send/recv的返回值，可以判断真正发送/接收的数据大小。

找到最关键的问题了： 1、发送和接收缓冲区，这个type是不对的，它只是一个指针，sizeof得不到它所指向的内存的大小，发送时也不会取到，所以建议改成数组； 2、accept之后，得到了一个client，这才是recv要用到的描述符。

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

《MFC基于select模型的套接字类之服务器（1）》 http://blog.csdn.net/hou09tian/article/details/78462624 《MFC基于select模型的套接字类之服务器（2）》 http://blog.csdn.net/hou09tian/article/details/78462761 另外还有3-8，可以在博客中搜索 希望能够帮到你

accept()函数后面多了个分号，不管accept()函数的返回值是否小于0，都会执行后面的  printf("accept error"); return 1;  也就是说，此时程序已经结束了

确实，正如楼上朋友所说，accept()函数后面多了个分号。 你的程序里面没有WSAStartup()初始化套接字的函数，后面的套接字函数能调用成功么？

服务器接受到客户端的add del show 操作，服务器将接受的结构体数据存入一个链表，取链表中的int数据返回给客户端，怎么传递好，我直接捌int数组转成char传过去，客户端在转成int数组，但是取数据有其他数据。应该怎么取处理才好。   #include <sys/stat.h>   #include <fcntl.h>   #include <errno.h>   #include <netdb.h>   #include <sys/types.h>   #include <sys/socket.h>   #include <netinet/in.h>   #include <arpa/inet.h>      #include <stdio.h>   #include <string.h>   #include <stdlib.h>   #include <unistd.h>      #define SERVER_PORT 9300  #define TMAX 10      int main(int atgc, char *argv[])   {       int server;     struct sockaddr_in server_addr;  	//服务器      struct sockaddr_in client_addr;  	//客户端      typedef struct sinfo     { 	char type[TMAX]; 	int num;     }info;      typedef struct nums     { 	int num; 	struct nums *next;     }data;      socklen_t clen = sizeof(client_addr);     int client;     int i;     int a[100];     char *ch;     char buff[1024];     int DataLen;          data *d;     d = (data *)malloc(sizeof(data));     d->next == NULL;        if((server = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0)       {     	printf("socket init error");         return 1;       }          bzero(&server_addr, sizeof(server_addr));       //memset(&server_addr, 0, sizeof(server_addr));     server_addr.sin_family = AF_INET;       server_addr.sin_port = htons(SERVER_PORT);       server_addr.sin_addr.s_addr = htonl(INADDR_ANY);            if((bind(server, (struct sockaddr *)&server_addr, sizeof(server_addr))) < 0)       {   	printf("bind error");         return 1;       }       //设置服务器上的socket为监听状态       if(listen(server, 5) < 0)        {   	printf("page out 5");         return 1;       }     while(1)     {           printf("listening port: %d\n", SERVER_PORT);           if ((client = accept(server, (struct sockaddr *)&client_addr, &clen)) < 0) 	{ 	    printf("accept error"); 	    //return 1; 	}         printf("recv client info:\n");           printf("=====================\n");           printf("IP is %s\n", inet_ntoa(client_addr.sin_addr));           printf("Port is %d\n", htons(client_addr.sin_port));           printf("=====================\n");    	memset(buff, 0, 1024); 	info f; 	recv(client, buff, sizeof(info), 0); 	//read(client, (void *)buff, sizeof(info)); 	memcpy(&f, buff, sizeof(info)); 	//printf("%p======\n",&buffer);  	//printf("%s======\n",buffer);  	printf("%s======\n",f.type);  	printf("%d======\n",f.num); 	if (strcmp(f.type, "add") == 0) 	{ 	    printf("dsdsdsdsdsd\n"); 	    data *n; 	    n = (data *)malloc(sizeof(data)); 	    n->num = f.num; 	    n->next = d->next; 	    d->next = n; 	} 		 	if (strcmp(f.type, "del") == 0) 	{ 	    data *p,*q; 	    p = d->next; 	    while (p->num != f.num) 	    { 		q = p; 		p = p->next; 		 	    if (p->num == f.num) 	    { 	    	q->next = p->next; 		free(p); 		printf("is del\n"); 		break; 	    } 	    printf("is not found"); 		break; 	    } 	}  	if (strcmp(f.type, "show") == 0) 	{ 	    data *s; 	    s = d->next; 	    i = 0; 	    while (s != NULL) 	    { 		 		printf("is ssssssss\n"); 		//sprintf(buff ,"%d", s->num);	 		//memcpy(buff + i*sizeof(int), &(s->num), sizeof(int)); 		a[i] = s->num; 		printf("%d\n",s->num); 		s = s->next; 		i++; 	    } 	    //printf("buff:%s\n", buff); 	    //memcpy(buff, s, sizeof(buff)); 	    ch = (char *)&a[0]; 	    if (send(client, ch, sizeof(a), 0) < 0) 	    { 		printf("send error"); 	    } 	 	} 	 		//if (strcmp(f.type, "sort") == 0)  	if (strcmp(f.type, "clear") == 0) 	{ 	    data *k, *l; 	    k = d->next; 	    while (k != NULL)     	    { 	        printf("clclcllclclclcl"); 		l = k; 		k = k->next; 		free(l); 		l = NULL; 	    } 	}    }       return 0;   }   =====================================  /*socket tcp客户端*/   #include <sys/stat.h>   #include <fcntl.h>   #include <errno.h>   #include <netdb.h>   #include <sys/types.h>   #include <sys/socket.h>   #include <netinet/in.h>   #include <arpa/inet.h>      #include <stdio.h>   #include <string.h>   #include <stdlib.h>   #include <unistd.h>      #define SERVER_PORT 9300  #define TMAX 10    int main(int argc, char* argv[])   {       int client;       struct sockaddr_in serverAddr;     typedef struct sinfo     { 	char type[TMAX]; 	int num;     }info;     int i;     int a[100];     char *ch;     char sendbuf[1024];       char recvbuf[1024];       int DataLen;       if((client = socket(AF_INET, SOCK_STREAM, 0)) < 0)       {           perror("socket");           return 1;       }          serverAddr.sin_family = AF_INET;       serverAddr.sin_port = htons(SERVER_PORT);       serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");            if(connect(client, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)       {           return 1;       }          memset(sendbuf, 0, 1024);      memset(recvbuf, 0, 1024);      info f;      if (argc == 3)     { 	strcpy(f.type, argv[1]); 	f.num = atoi(argv[2]);     }      if (argc == 2)     { 	strcpy(f.type, argv[1]); 	f.num = 0;	     }	 	     printf("type: %s\n", f.type);     printf("num: %d\n", f.num);     memcpy(sendbuf, &f, sizeof(info));         if ((DataLen = send(client, sendbuf, sizeof(info), 0)) < 0) 	printf("is not send\n");  	printf("slen:%d\n", DataLen); 	     ch = (char *)&a[0];     if ((DataLen = recv(client, ch, sizeof(a), 0)) < 0) 	printf("recv error");     for(i=0; i<sizeof(a)/4; i++)     { 	printf("data:%d\n", ch[i]);      } }

你在调用accept函数的这个if语句后面多了个分号

服务器代码：  #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>  #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h>  #define sockfd_PORT 9300  typedef struct sinfo {     char type[128];     int num; }info;  int main(int atgc, char *argv[]) {     int sockfd;     struct sockaddr_in server_addr;      //服务器     struct sockaddr_in client_addr;      //客户端     socklen_t clen = sizeof(client_addr);     int client, ret;      if((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)     {         printf("socket init error");         return 1;     }      //bzero(&server_addr, sizeof(server_addr));     memset(&server_addr, 0, sizeof(server_addr));     server_addr.sin_family = AF_INET;     server_addr.sin_port = htons(sockfd_PORT);     server_addr.sin_addr.s_addr = htonl(INADDR_ANY);      if(bind(sockfd, (struct sockaddr *)&server_addr, sizeof(server_addr)) < 0)     {         printf("bind error");         return 1;     }     //设置服务器上的socket为监听状态     if(listen(sockfd, 5) < 0)     {         printf("page out 5");         return 1;     }     while(1)     {         printf("listening port: %d\n", sockfd_PORT);         if ((client = accept(sockfd, (struct sockaddr *)&client_addr, &clen)) < 0)         {             printf("accept error");             return 1;         }         printf("recv client info:\n");         printf("IP is %s\n", inet_ntoa(client_addr.sin_addr));         printf("Port is %d\n", htons(client_addr.sin_port));          info *f;         f = (info *)malloc(sizeof(info));         if (!f) {             fprintf(stderr, "malloc error!\n");             return 1;         }         ret = recv(client, (char *)f, sizeof(info), 0);         if (ret <= 0) {             printf("Client close !\n");             close(client);         } else {             printf("ret = %d\n", ret);             printf("%s======\n", f->type);             printf("%d======\n", f->num);         }         free(f);     }     return 0; }  客户端代码： #include <sys/stat.h> #include <fcntl.h> #include <errno.h> #include <netdb.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <arpa/inet.h>  #include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h>  #define SERVER_PORT 9300 typedef struct sinfo {     char type[128];     int num; }info;  int main(int argc, char* argv[]) {     int client;     struct sockaddr_in serverAddr;     if((client = socket(AF_INET, SOCK_STREAM, 0)) < 0)     {         perror("socket");         return 1;     }      serverAddr.sin_family = AF_INET;     serverAddr.sin_port = htons(SERVER_PORT);     serverAddr.sin_addr.s_addr = inet_addr("127.0.0.1");      if(connect(client, (struct sockaddr *)&serverAddr, sizeof(serverAddr)) < 0)     {         return 1;     }      if (argc == 3 && strcmp(argv[1], "add") == 0)     {         printf("111111111111111111111\n");         info *f;         f = (info *)malloc(sizeof(info));         if (!f) {             fprintf(stderr, "malloc error!\n");             return 1;         }         f->num = atoi(argv[2]);         memcpy(f->type, argv[1], strlen(argv[1]) + 1);          printf("num: %d\n", f->num);         printf("type: %s\n", f->type);         if (send(client, (char *)f, sizeof(info), 0) < 0)             printf("is not send\n");          free(f);     }      if (argc == 3 && strcmp(argv[1],"close") == 0)     {         close(client);     }     return 0; }   参考一下吧； 注意server服务器recv的应该是client

如果要重启服务端后保持原来的数据，缓存可以在文件、数据库等等，你需要在启动时读入并做处理，而且，非常重要的一点，等数据都恢复完了之后再启动监听，否则冲突处理会比较麻烦。


Question: 关于单词的排序问题（想用链表实现）

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

#include <stdio.h> #include <stdlib.h> #include <string.h>  #define LEN 20  struct part {     char str[LEN+1];     struct part *next; };  struct part *first = NULL;//首节点  void add_list(void); void print(void); int read_line(char str[],int n);  int main(void) {     int i;     int num;     scanf("%d", &num);     getchar();     for (i = 0; i < num; i++)     {         add_list();     }      print();     return 0; }  void add_list(void) {     int rline;//     struct part *pnew,*prev,*cur;     pnew = (struct part *)malloc(sizeof(struct part));     if (!pnew) {         printf("No Room Exist!\n");         return;     }     pnew->next = NULL;      printf("Enter word: ");     rline = read_line(pnew->str, LEN);     if (rline == 0) {         print();         return;     }     if (!first) {         first = pnew;         return;     }     for (prev = cur = first; cur != NULL; prev = cur, cur = cur->next)         if (strcmp(pnew->str, cur->str)  < 0)             break;      if (prev == cur) {         pnew->next = prev;         first = pnew;     } else {         pnew->next = cur;         prev->next = pnew;     }      return;     /*     for(prev = NULL,cur = first;             cur != NULL && (strcmp(&(p->str),&(cur->str))>0);             prev = cur,cur = cur -> next)         break;     if (cur != NULL && strcmp(&(p->str),&(cur->str))<=0)     {         p->next = cur;         return;     }     if (prev == NULL)     {         first = p;     }     else     {         prev->next = p;     }     */ }  void print(void) {     struct part *pa;      for (pa = first; pa != NULL; pa=pa->next)         printf("%s ",pa->str);     putchar(10); }  int read_line(char str[], int n)//读取字符串 {     int ch,i = 0;      while ((ch = getchar())!= '\n')     {         if (i < n)             str[i++] = ch;         else    /*直接退出，防止空循环*/             break;     }     str[i] = '\0';      return i; } 处理逻辑还是有点问题，尤其是链表判断插入部分，参考一下吧；

调试跟踪是必备技能，网络搜索，学一下，自己使用的编译器，调试器。

int main(void) {     for (;;)     {         add_list();     }      return 0; } add_list();中的return 并不能作用于main函数，所以for中是个死循环。。。

你的main函数里是个死循环，add_list又没有直接退出程序，想退出只能杀进程？

谢谢各位。我已经解决了。 下面我会附上我自己的代码。 四楼的代码我测试过，也没有问题，基本上也类似。 总之，谢谢大家了！  #include <stdio.h> #include <stdlib.h> #include <string.h>  #define LEN 20  struct part {     char str[LEN+1];     struct part *next; };  struct part *first = NULL;//首节点  int add_list(void); void print(void); int read_line(char str[],int n);  int main(void) {     for (;;)     {         if(add_list())             break;     } }  int add_list(void) {     int rline;     struct part *p, *prev, *cur;      p = malloc(sizeof(struct part));     if (p == NULL)     {         printf("No Room Exist!\n");         return 0;     }      printf("Enter word: ");     rline = read_line(p->str,LEN);//如果只输入一个'\n',则结束读取，输出结果，结束程序。     if (rline == 0)     {         print();         return 1;     }       for(prev = NULL,cur = first;             cur != NULL && (strcmp((p->str),(cur->str))>0);//比较字符串，如果当前输入的字符串大，则跳向下一个。             prev = cur,cur = cur -> next)         ;      if(prev == NULL)     {         p->next = first;         first = p;     }      //需要插入元素的位置在其他位置     else     {         prev->next = p;         p->next = cur;     }      return 0; }  void print(void) {     struct part *pa;      printf("In sorted order:");     for (pa = first; pa != NULL; pa=pa->next)//输出结果     {         printf("%s ",pa->str);     }     printf("\n"); }  int read_line(char str[],int n)//读取字符串 {     int ch,i = 0;      while ((ch = getchar())!= '\n')     {         if (i < n)         {             str[i++] = ch;         }     }      str[i] = '\0';     return i; }


Question: 对于约束优化问题，一共729个不等式条件相加，请求大神看看这个程序是不是对？

不是，我后面用算法写出来了，程序很长，就没有全部复制过来，就让大神们看看我是不是这部分写的不合理。

这样写的意义是啥，，，，单纯用程序模拟它的表达式么。。。

就是看我这个约束条件写对了没有，就是为了验证程序是能全部满足约束条件和找到(5,5,5)这个最优解。

这题要你干什么？ 如果要求解这个规划问题，不是已经告诉你答案是(5,5,5)了吗？

通过判断每个约束条件之与0 的大小关系，将729个约束条件相加。得到一个总的约束条件。


Question: 求解商品管理系统

怎么删帖啊，我想删除这个贴

#include<stdio.h>  #include<string.h>  #include<stdlib.h>  #include<conio.h>   #define max 20   typedef struct student    //学生  {  char sno[max]; // 学号  char sname[max];  //姓名  char sex[max];   //性别  char age[max];  //年龄  char depart[max];  //系  char classs[max];  //班  char grade[max]; //年级   struct student* next;  } student;   student* head;    int LogOn()  //登录模块，已实现输入密码不回显，如果中途发现输错某几位，可退格键重输  {  char username[max],password[max];  printf("\n请输入用户名:");  scanf("%s",username);  printf("\n请输入密码(最多15位):");   //开始以不回显且支持退格方式获取输入密码  int i=0;  while((i>=0)&&(password[i++]=getch())!=13)//条件i>=0是用于限制退格的范围  {  if(password[i-1]=='\b')//对退格键的处理  {  printf("%c%c%c",'\b','\0','\b');  i=i-2;  }  else  printf("*");  }  password[--i]='\0';   //已获取密码。验证用户身份  if(!strcmp(username,"root")&&!strcmp(password,"123456"))  {  printf("\n登录成功!");  return 1;  }  else    return 0;   }   void regist()  {  char ch;  student *s,*ptr;  //s用来建新结点，ptr用来暂存头结点   do  {       s=(student*)malloc(sizeof(student)); // 新建一个学生结点        printf("\n开始注册...");            //开始注册      printf("\n请输入该学生的学号:");      scanf("%s",s->sno);      printf("\n请输入该学生的姓名:");      scanf("%s",s->sname);      printf("\n请输入该学生的性别:");      scanf("%s",s->sex);         printf("\n请输入该学生的年龄:");      scanf("%s",s->age);      printf("\n请输入该学生的系:");      scanf("%s",s->depart);      printf("\n请输入该学生所在的班:");      scanf("%s",s->classs);      printf("\n请输入该学生所在的年级");      scanf("%s",s->grade);   ptr=head;  head=s;//将新结点插入队头  s->next=ptr;   fflush(stdin);  printf("\n请问是否继续注册?(Y/N)");  scanf("%c",&ch);  }while(ch=='Y'||ch=='y');   return;  }   void ElePrint(char str[])  //输出单个元素  {  if(str==NULL) exit(0);  printf("%s",str);  unsigned  int i; for( i=0;i<12-strlen(str);i++) printf(" ");//为了对齐输出，需插入一些空格  return;  }   int LinePrint(student *ptr) //输出一行  {  if(ptr==NULL)  //检查传进来的指针  return 0;   printf("\n");  ElePrint(ptr->sno);  ElePrint(ptr->sname);  ElePrint(ptr->age);  ElePrint(ptr->sex);  ElePrint(ptr->depart);  ElePrint(ptr->classs);  ElePrint(ptr->grade);   return 1;  }   void print()  //输出全部学生信息  {  student *ptr=head;  printf("\n学号        姓名        年龄        性别        系          班          年级        ");  while(ptr)  {  LinePrint(ptr);  ptr=ptr->next;  }  printf("\n");  return;  }  void search()//查询模块  {  int method;//查询方式  char no[max],name[max],departm[max],clss[max],grades[max]; //用来接收查询关键字  while(1)  {  printf("\n请选择查询方式");      printf("\n1.按学号查询");   printf("\n2.按姓名查询");      printf("\n3.按所在系查询");      printf("\n4.按所在班级查询");      printf("\n5.按所在年级查询");  printf("\n6.打印全部学生信息");      printf("\n7.返回主菜单\n");       scanf("%d",&method);       student *p=head,*temp;       switch(method)  {         case 1:      printf("\n请输入要查询的学号:");     scanf("%s",no);         while(p)     {     if(!strcmp(p->sno,no))     break;     else     {     temp=p;     p=p->next;     }     }     printf("\n学号        姓名        年龄        性别        系          班          年级        ");     LinePrint(p);     break;     case 2:     printf("\n请输入要查询的姓名:");     scanf("%s",name);     printf("\n学号        姓名        年龄        性别        系          班          年级        ");     while(p)     {     if(!strcmp(p->sname,name))     LinePrint(p);          p=p->next;     }     break;     case 3:     printf("\n请输入学生所在的系:");     scanf("%s",departm);     printf("\n学号        姓名        年龄        性别        系          班          年级        ");     while(p)     {     if(!strcmp(p->depart,departm))     LinePrint(p);     p=p->next;     }     break;     case 4:     printf("\n请输入学生所在的班:");     scanf("%s",clss);     printf("\n请输入学生所在的年级:");          scanf("%s",grades);          printf("\n学号        姓名        年龄        性别        系          班          年级        ");     while(p)     {     if(!strcmp(p->classs,clss)&&!strcmp(p->grade,grades))     LinePrint(p);     p=p->next;     }     break;          case 5:     printf("\n请输入学生所在的年级:");     scanf("%s",grades);     printf("\n学号        姓名        年龄        性别        系          班          年级        ");     while(p)     {     if(!strcmp(p->grade,grades))     LinePrint(p);     p=p->next;     }     break;      case 6:     print();     break;          case 7:     return;     default:     printf("很抱歉，暂无此查询方式!");     break;  }  }   }   void modify()//修改学生信息  {  char num[max];  student *p=head;  printf("\n请输入要修改的学生的学号:");  scanf("%s",num);  while(p)  {  if(!strcmp(p->sno,num))  break;  else  p=p->next;  }  if(p==NULL)  {  printf("\n错误：没有此学生的信息!\n");  return;   }  LinePrint(p);   printf("\n请输入要修改的该学生的信息:");  printf("\n1.姓名");  printf("\n2.性别");  printf("\n3.年龄");  printf("\n4.所在的系");  printf("\n5.所在的班");  printf("\n6.所在的年级");   char name1[max],sex1[max],age1[max],depart1[max],class1[max],grade1[max];  int select;  fflush(stdin);  scanf("%d",&select);  printf("\n请输入新的信息:");   switch(select)  {  case 1:  scanf("%s",name1);  strcpy(p->sname,name1);  break;  case 2:  scanf("%s",sex1);  strcpy(p->sex,sex1);  break;  case 3:  scanf("%s",age1);  strcpy(p->age,age1);  break;  case 4:  scanf("%s",depart1);  strcpy(p->depart,depart1);  break;  case 5:  scanf("%s",class1);  strcpy(p->classs,class1);  break;  case 6:  scanf("%s",grade1);  strcpy(p->grade,grade1);  break;  default:  printf("\nError!");  break;  }   LinePrint(p);  return;  }    void del()// 删除某学生的信息  {  student *p=head,*temp=head,*s;  char num1[max];  printf("\n请输入要删除的学生的学号:");  scanf("%s",num1);  while(p)//查找该学生所在的结点  {  if(!strcmp(p->sno,num1))  break;  else  {  temp=p;  p=p->next;  }   }//while  if(!p)   {  printf("\n不存在此学生的信息.");  return;  }  LinePrint(p);//输出该学生的信息  printf("\n请问真的要删除该学生的信息吗?(Y/N)");  char ch;  fflush(stdin);  scanf("%c",&ch);  if(ch=='Y'||ch=='y')  {  s=p->next;  temp->next=s;  free(p);  printf("\n已经删除该学生的信息.");  }  return;  }   void sort() //排序模块。将学生记录按学号从小到大排列。用起泡排序算法实现  {   student *ptr,*s=head,*p;  int count=0,count1;  while(s)//统计链表结点个数  {  count++;  s=s->next;  }  int i; for( i=1;i<count;i++)  {  ptr=head;  p=NULL;  count1=count-i; //用来控制每轮起泡排序的终点，即每次把学号最小的结点移到倒数第i个结点  while(ptr&&ptr->next&&(count1--))  {  if(strcmp(ptr->sno,ptr->next->sno)>0)  {  s=ptr->next;  ptr->next=s->next;  if(p==NULL) //ptr处于队头时  head=s;  else  p->next=s;  s->next=ptr;  p=s;  }  else  {  ptr=ptr->next;  if(p==NULL) //ptr处于队头时  p=head;  else  p=p->next;  }  }  }  return;  }      void quit()  {  char ch;  printf("\n真的要退出？(Y/N)");  fflush(stdin);  scanf("%c",&ch);  if(ch=='Y'||ch=='y')  exit(0);  return;  }    int main()  {  int option;   printf("\nCopyright@2005 KongXinCai All rights reserved.");  printf("\n欢迎使用学生信息管理系统!\n");   //登录模块  int icheck=0;  while(icheck<3)  {  if(LogOn()==0)  icheck++;  else  break;   }  if(icheck==3)  {  printf("\n连续登录三次不成功，退出!");  exit(0);  }   //系统界面   while(1)  {  printf("\n\n请选择需要的服务:");      printf("\n1.注册");      printf("\n2.查询");      printf("\n3.修改");      printf("\n4.删除");      printf("\n5.排序");    printf("\n7.求平均");     printf("\n6.退出\n");   scanf("%d",&option);   switch(option)  {  case 1:  regist();  break;  case 2:  search();  break;  case 3:  modify();  break;  case 4:  del();  break;  case 5:  sort();  break;  case 6:  quit();  break;  }   }    return 0;   }   差不多类型的，，你看看

修改了一些，可以运行了，但运行后的原有的子功能有问题，自己改吧 #include<stdio.h>  #include<string.h>  #include<stdlib.h>  #include<conio.h>  //#include<dos.h>  #define K 5  /*商品的结构体*/ struct commodity  {  char name[15];//商品的名字 int number; //商品的编号 int jiage;//商品的价格 int shuliang;//商品的数量 char shengchanchangjia[10];//商品的生产厂家 }sj[K];  struct commodity coom[][4]={{"苹果",001,5,5},{"菠萝",002,3,3}}; //定义一个数组 int num=2; //商品的种数数量 /*声明*/ void homepage(); //首页 int Verification(char Password[]); //增加密码的验证 int Mainmenu(); //主菜单 void input(); //商品信息的输入 void modify(); //商品信息的修改 void delet(); //商品信息的删除 void order(); //商品信息的排序 void search(); //商品信息的查询 void show(); //商品信息的显示 void Exit(); //商品信息的退出 void main()  {  int n; // int i;  char Password[10]={"123456789"}; //初始密码为123456789  homepage();//首页 n=Verification(Password); //验证密码 switch(n)  {  case 0 : printf("\n注意：如果你的密码连续错误三次，系统将会退出。\n");  break;  case 1 : Mainmenu(); //显示主菜单 break;  }  printf("系统退出！\n");  exit(0);  }    /*验证密码*/ int  Verification(char Password[])  {  int i=0;  int j=3;  int m;  char Password1[10];  printf("请你输入商品管理系统的密码"); for(m=0;m<9;m++)  {  Password1[m]=getch(); //输入密码但是密码不显示 putchar('*'); //密码用*来显示 } Password1[9]='\0'; //添加串结束标志 printf("\n"); //换行 for(i=0;j!=0;i++)  if(strcmp(Password1,Password)==0) //比较输入的密码是否正确，如果正确，则程序继续下去。 { printf("你输入的密码正确，你将进入商品管理系统\n");  system("pause"); //屏幕暂停 return 1;  }  else  //如果密码不正确，则程序运行此处 { --j;  if(j==0)  {  return 0;  }  printf("\n密码错误，你还有%d次机会,\n请你再次输入密码：",j);  for(m=0;m<9;m++)  {  Password1[m]=getch(); //输入的密码不会显示出来 putchar('*'); //输入的密码显示*  } Password1[9]='0'; //添加串结束标志 printf("\n");  }  return 0;  }     /*显示作者的基本信息*/ void homepage()  {  printf("\t 欢迎进入商品管理系统 \n");  printf("\t 专业：计算机科学与技术 \n");  printf("\t 班级：计算机科学与技术班\n");  printf("\t 姓名：在在在 \n");  printf("\t 学号：0000000 \n");  }      //定义主菜单栏，输入数字进行操作 int Mainmenu()  {    int num;  //选择的数字    system("cls");  //清除屏幕消息  printf("\n\n\n\n\n");  printf("\t\t--------欢迎将进入商品管理系统--------\n");  printf("\t\t\t 1:商品信息的输入?\n");  printf("\t\t\t 2:商品信息的修改?\n");  printf("\t\t\t 3:商品信息的删除?\n");  printf("\t\t\t 4:商品信息的排序?\n");  printf("\t\t\t 5:商品信息的查询?\n");  printf("\t\t\t 6:商品信息的显示?\n");  printf("\t\t\t 7:商品信息的退出?\n");  printf("\t\t\t请你输入1-7的任意数字：");   scanf("%d",&num);   switch(num)  //通过输入数字来操作事件  {    case 1 : input();  //输入   break;    case 2 : modify(); //修改 break;    case 3 : delet(); //删除   break;    case 4 : order(); //排序   break;    case 5 : search(); //查询   break;    case 6 : show(); //显示   break;  case 7 : Exit(); //退出   break;    default : Mainmenu();    break;   } //switch结束   return 0; }  //函数结束  //录入商品数据信息  void input()   {     char a; //录入一个字符     system("cls"); //清屏      printf("是否输入商品的信息?(yes/no)");    fflush(stdin); //刷新标准输入缓冲区，把输入缓冲区里的东西丢掉   scanf("%c", &a);    while(a=='y')    {    printf("请你输入商品的名字:"); //输入商品名字   scanf("%s",&sj[K].name);    printf("请你输入商品的编号"); //输入商品编号   scanf("%d",&sj[K].number);    printf("请你输入商品的价格"); //输入商品价格   scanf("%d",&sj[K].jiage);    printf("请你输入商品的数量"); //输入商品数量   scanf("%d",&sj[K].shuliang);    printf("请你输入商品的生产厂家"); //输入商品生产厂家   scanf("%s",&sj[K].shengchanchangjia);    num++; //增加商品的数量   printf("请问你是否继续?(yes/no)");    fflush(stdin); //刷新标准输入缓冲区，把输入缓冲区里的东西丢掉   scanf("%c",&a);     } //结束while的循环     Mainmenu();   } //结束该函数   //修改商品信息  void modify()   {    int k=0; //变量   int l=0; //变量   char a; //录入一个字符   system("cls"); //清除屏幕消息   printf("请你输入要修改的商品编号");    fflush(stdin);  //刷新标准输入缓冲区，把输入缓冲区里的东西丢掉   scanf("%d",&k);    while(k!=sj[l].number)    {    l++;    if(l>=num)    {    printf("这里没有你需要修改的商品信息。\n");    modify();    } //结束if的判断   } //结束while的循环   fflush(stdin); //刷新标准输入缓冲区，把输入缓冲区里的东西丢掉   printf("请你输入商品的名称");    scanf("%s",&sj[l].name);    printf("请你输入商品的价格");    scanf("%d",&sj[l].jiage);    printf("请你输入商品的数量");    scanf("%d",&sj[l].shuliang);    printf("请你输入商品的生产厂家");    scanf("%s",&sj[l].shengchanchangjia);    printf("你的修改已经完成，你是否继续(yes/no)");    fflush(stdin);    scanf("%c",&a);    if(a=='yes')     modify(); //继续修改    else     Mainmenu(); //到菜单  }  //修改函数结束  //商品的删除  void delet()   {    int z;    int x=0;    char a;    system("cls"); //清屏   printf("请你输入你要删除的商品编号");    fflush(stdin);    scanf("%d",&z);    while(z!=sj[x].number)    {    x++;    if(x>=num)    {    printf("这里没有你需要删除的商品信息");     modify();    } //结束if    } //结束while的循环   for(;x<num;x++)    {    sj[x].number=sj[x+1].number;    strcpy(sj[x].name,sj[x+1].name);    sj[x].jiage=sj[x+1].jiage;    sj[x].shuliang=sj[x+1].shuliang;    }    num--; //商品的总数数量减少一个   printf("已经删除商品的信息，你是否要继续(yes/no)");    fflush(stdin); //刷新标准输入缓冲区，把输入缓冲区里的东西丢掉   scanf("%c",&a);    if(a=='yes')    delet(); //继续删除   else    Mainmenu(); //返回到菜单   }     //排序   void order()    {    struct commodity temp;    int q;    int w;    char a;    system("cls"); //清屏   printf("通过商品的数量来进行排序\n");    printf("商品编号 商品名称 价格 数量 生产厂家\n");    for(q=0;q<num;q++)    for(w=q+1;w<num;w++)    if(sj[q].shuliang<sj[w].shuliang)    {    temp=sj[q];    sj[q]=sj[w];    sj[w]=temp;    }    for(q=0;q<num;q++)    {    printf("%d",&sj[q].number);    printf("%s",&sj[q].name);    printf("%d",&sj[q].jiage);    printf("%d",&sj[q].shuliang);    printf("%s",&sj[q].shengchanchangjia);    }    printf("输入0来退出排序系统\b");    scanf("%d",&a);    if(a==0) //循环停止，排序系统退出   {    system("cls"); //清除屏幕   Mainmenu();  //返回菜单   }    }     //查询    void search()     {      char name[15];      //char a;      int r=0;      system("cls"); //清除屏幕消息     printf("请你输入要查询的商品名称");      scanf("%s",name);      while(strcmp(name,sj[r].name)!=0)      {       r++;       if(r>=num)       {       printf("这里暂时没有你要查询发的商品信息");       search();       } //结束if的判断     } //结束while循环     printf("商品名称\t商品编号\t商品价格\t商品数量\t商品生产厂家\n");     printf("%s",&sj[r].name);     printf("%d",&sj[r].number);    printf("%d",&sj[r].jiage);    printf("%d",&sj[r].shuliang);    printf("%s",&sj[r].shengchanchangjia);    printf("查询结束");    //search();    }     //显示    void show()     {      int t;      //char a;      system("cls");      printf("商品名称\t商品编号\t商品价格\t商品数量\t商品生产厂家\n");    for(t=0;t<num;t++)    {    printf("%s",&sj[t].name);     printf("%d",&sj[t].number);    printf("%d",&sj[t].jiage);    printf("%d",&sj[t].shuliang);    printf("%s",&sj[t].shengchanchangjia);    }    printf("返回菜单");    fflush(stdin);    //show();     }      //退出   void Exit()    {     char a;     system("cls");     printf("你是否要退出系统(yes\n)");     fflush(stdin);     scanf("%c",&a);     if(a=='yes')     printf("感谢你使用商品管理系");     else     Mainmenu();    }

有没有热的  。。。


Question: 赋值失败如何破解

学会使用数据断点：#include <time.h> #include <stdlib.h> #include <windows.h> int main() {     int a,b[11];//本来是b[10]，为判断哪句越界，故意声明为b[11]      srand((unsigned int)time(NULL));//按两次F11，等黄色右箭头指向本行时，调试、新建断点、新建数据断点，地址：&b[10]，字节计数：4，确定。     while (1) {//按F5，会停在下面某句，此时a的值为10，b[10]已经被修改为对应0..4之一。         b[(a=rand()%11)]=0;         Sleep(100);         b[(a=rand()%11)]=1;         Sleep(100);         b[(a=rand()%11)]=2;         Sleep(100);         b[(a=rand()%11)]=3;         Sleep(100);         b[(a=rand()%11)]=4;         Sleep(100);     }     return 0; }

建议把代码贴出来，出现这样的问题原因可能不是简单的加减法问题，而是关于类型，逻辑等等；

内存溢出导致的？ 我也想不到其它的了

没有遇到过 好神奇

类型有问题？   再想不到其他的了


Question: 编程求两个特大正整数相乘之积;这个程序怎么写流程图？求大腿

如果为了防止溢出，可以转成字符串相乘。 写两个字符串乘法的算式，找下规律，网上应该也有很多例子。之前在leetcode上遇见过字符串的乘法

参考小学算术中的乘法竖式。

仅供参考：#include <iostream> #include <string> using namespace std; inline int compare(string str1,string str2) {//相等返回0，大于返回1，小于返回-1          if (str1.size()>str2.size()) return 1; //长度长的整数大于长度小的整数     else if (str1.size()<str2.size()) return -1;     else                              return str1.compare(str2); //若长度相等，则头到尾按位比较 } string SUB_INT(string str1,string str2); string ADD_INT(string str1,string str2) {//高精度加法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         if (str2[0]=='-') {             sign=-1;             str=ADD_INT(str1.erase(0,1),str2.erase(0,1));         } else {             str=SUB_INT(str2,str1.erase(0,1));         }     } else {         if (str2[0]=='-') {             str=SUB_INT(str1,str2.erase(0,1));         } else { //把两个整数对齐，短整数前面加0补齐             string::size_type L1,L2;             int i;             L1=str1.size();             L2=str2.size();             if (L1<L2) {                 for (i=1;i<=L2-L1;i++) str1="0"+str1;             } else {                 for (i=1;i<=L1-L2;i++) str2="0"+str2;             }             int int1=0,int2=0; //int2 记录进位             for (i=str1.size()-1;i>=0;i--) {                 int1=(int(str1[i])-'0'+int(str2[i])-'0'+int2)%10;                 int2=(int(str1[i])-'0'+int(str2[i])-'0'+int2)/10;                 str=char(int1+'0')+str;             }             if (int2!=0) str=char(int2+'0')+str;         }     }     //运算后处理符号位     if ((sign==-1)&&(str[0]!='0')) str="-"+str;     return str; } string SUB_INT(string str1,string str2) {//高精度减法     int sign=1; //sign 为符号位     string str;     int i,j;     if (str2[0]=='-') {         str=ADD_INT(str1,str2.erase(0,1));     } else {         int res=compare(str1,str2);         if (res==0) return "0";         if (res<0) {             sign=-1;             string temp =str1;             str1=str2;             str2=temp;         }         string::size_type tempint;         tempint=str1.size()-str2.size();         for (i=str2.size()-1;i>=0;i--) {             if (str1[i+tempint]<str2[i]) {                 j=1;                 while (1) {//zhao4zhong1添加                     if (str1[i+tempint-j]=='0') {                         str1[i+tempint-j]='9';                         j++;                     } else {                         str1[i+tempint-j]=char(int(str1[i+tempint-j])-1);                         break;                     }                 }                 str=char(str1[i+tempint]-str2[i]+':')+str;             } else {                 str=char(str1[i+tempint]-str2[i]+'0')+str;             }         }         for (i=tempint-1;i>=0;i--) str=str1[i]+str;     }     //去除结果中多余的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str ="-"+str;     return str; } string MUL_INT(string str1,string str2) {//高精度乘法     int sign=1; //sign 为符号位     string str;     if (str1[0]=='-') {         sign*=-1;         str1 =str1.erase(0,1);     }     if (str2[0]=='-') {         sign*=-1;         str2 =str2.erase(0,1);     }     int i,j;     string::size_type L1,L2;     L1=str1.size();     L2=str2.size();     for (i=L2-1;i>=0;i--) { //模拟手工乘法竖式         string tempstr;         int int1=0,int2=0,int3=int(str2[i])-'0';         if (int3!=0) {             for (j=1;j<=(int)(L2-1-i);j++) tempstr="0"+tempstr;             for (j=L1-1;j>=0;j--) {                 int1=(int3*(int(str1[j])-'0')+int2)%10;                 int2=(int3*(int(str1[j])-'0')+int2)/10;                 tempstr=char(int1+'0')+tempstr;             }             if (int2!=0) tempstr=char(int2+'0')+tempstr;         }         str=ADD_INT(str,tempstr);     }     //去除结果中的前导0     str.erase(0,str.find_first_not_of('0'));     if (str.empty()) str="0";     if ((sign==-1) && (str[0]!='0')) str="-"+str;     return str; } string DIVIDE_INT(string str1,string str2,int flag) {//高精度除法。flag==1时,返回商；flag==0时,返回余数     string quotient,residue; //定义商和余数     int sign1=1,sign2=1;     if (str2 == "0") {  //判断除数是否为0         quotient= "ERROR!";         residue = "ERROR!";         if (flag==1) return quotient;         else         return residue ;     }     if (str1=="0") { //判断被除数是否为0         quotient="0";         residue ="0";     }     if (str1[0]=='-') {         str1   = str1.erase(0,1);         sign1 *= -1;         sign2  = -1;     }     if (str2[0]=='-') {         str2   = str2.erase(0,1);         sign1 *= -1;     }     int res=compare(str1,str2);     if (res<0) {         quotient="0";         residue =str1;     } else if (res == 0) {         quotient="1";         residue ="0";     } else {         string::size_type L1,L2;         L1=str1.size();         L2=str2.size();         string tempstr;         tempstr.append(str1,0,L2-1);         for (int i=L2-1;i<L1;i++) { //模拟手工除法竖式             tempstr=tempstr+str1[i];             tempstr.erase(0,tempstr.find_first_not_of('0'));//zhao4zhong1添加             if (tempstr.empty()) tempstr="0";//zhao4zhong1添加             for (char ch='9';ch>='0';ch--) { //试商                 string str;                 str=str+ch;                 if (compare(MUL_INT(str2,str),tempstr)<=0) {                     quotient=quotient+ch;                     tempstr =SUB_INT(tempstr,MUL_INT(str2,str));                     break;                 }             }         }         residue=tempstr;     }     //去除结果中的前导0     quotient.erase(0,quotient.find_first_not_of('0'));     if (quotient.empty()) quotient="0";     if ((sign1==-1)&&(quotient[0]!='0')) quotient="-"+quotient;     if ((sign2==-1)&&(residue [0]!='0')) residue ="-"+residue ;     if (flag==1) return quotient;     else         return residue ; } string DIV_INT(string str1,string str2) {//高精度除法,返回商     return DIVIDE_INT(str1,str2,1); } string MOD_INT(string str1,string str2) {//高精度除法,返回余数     return DIVIDE_INT(str1,str2,0); } int main() {     char ch;     string s1,s2,res;      while (cin>>s1>>ch>>s2) {         switch (ch) {             case '+':res=ADD_INT(s1,s2);break;             case '-':res=SUB_INT(s1,s2);break;             case '*':res=MUL_INT(s1,s2);break;             case '/':res=DIV_INT(s1,s2);break;             case '%':res=MOD_INT(s1,s2);break;             default :                   break;         }         cout<<res<<endl;     }     return(0); }


Question: 求助

关闭UAC、防火墙、杀毒软件、…… 以管理员身份运行 任务管理器中如果有和生成exe同名的进程，先结束掉 重启电脑再试试 ……

关键是“第二个图片，看是连接错误？错误提示被挡住了看不到。”啊！

第一个图片，看着是编译成功。 第二个图片，看是连接错误？错误提示被挡住了看不到。  第一个图片，是纯编译？ 第二个图片，是什么情况下出现的？ 看一下工程设置，编译输出的目录，和运行的程序启动目录是不是一致。

应该是属于软件使用的问题。代码没什么问题；注意看一下这个路径下有没有这个文件（test10.exe）

怎么修改？？请大神明示，在下刚刚学习c

修改vs的工作目录

找不到文件，修改工作目录，<IMG src="file:///C:\Users\Administrator\AppData\Roaming\feiq\RichOle\3856584786.bmp">

没用 重新编译了好多次 都是这个情况  怎么回事啊？？？

clean一下，重新编译再试试

链接失败了。


Question: 有请各位C语言大大帮我看看我的程序为什么会崩溃

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

#include <stdio.h> #include <stdlib.h> #include <math.h> #include <ctype.h>  #define STACK_INIT_SIZE 20 #define INCREMENT 10  typedef char ElemType;  typedef float ElemType1;  typedef struct{     ElemType *base;     ElemType *top;     int stackSize; }sqStack; typedef struct{     ElemType1 *base;     ElemType1 *top;     int stackSize; }sqStack1;  void InitStack(sqStack *s) {     s->base = (ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType));     if(!s->base){         exit(0);     }      s->top=s->base;     s->stackSize = STACK_INIT_SIZE; } void InitStack1(sqStack1 *s) {     s->base=(ElemType1 *)malloc(STACK_INIT_SIZE*sizeof(ElemType1));     if(!s->base){         exit(0);     }      s->top=s->base;     s->stackSize=STACK_INIT_SIZE; }  void Push(sqStack *s,ElemType e) {     if(s->top-s->base>=s->stackSize){         s->base=(ElemType *)realloc(s->base,(s->stackSize+INCREMENT)*sizeof(ElemType));         if(!s->base){             exit(0);         }     }     *(s->top)=e;     s->top++; } void Push1(sqStack1 *s,ElemType1 e) {     if(s->top-s->base>=s->stackSize){         s->base=(ElemType1 *)realloc(s->base,(s->stackSize+INCREMENT)*sizeof(ElemType1));         if(!s->base){             exit(0);         }     }     *(s->top)=e;     s->top++; }  void Pop(sqStack *s,ElemType *e){     if(s->top==s->base){         return;     }     *e=*--(s->top); } void Pop1(sqStack1 *s,ElemType1 *e){     if(s->top==s->base){         return;     }     *e=*--(s->top); }  int StackLen(sqStack s){     return (s.top-s.base); } int StackLen1(sqStack1 s){     return (s.top-s.base); }  //实例：实现中缀表达式转换为后缀表达式 int main() {     ElemType c,e,str[INCREMENT];     ElemType1 p1,p2,result;     sqStack s,r,q,x;     sqStack1 p;     int i=0;      InitStack(&s);     InitStack(&r);     InitStack(&q);     InitStack(&x);     InitStack1(&p);      printf("请输入中缀表达式,以#结束：\n");     scanf("%c",&c);     while(c!='#'){         while((c>='0'&&c<='9')||c=='.'){    /*逻辑有问题*/             Push(&r,c);             scanf("%c",&c);             if(!((c>='0'&&c<='9')||c=='.')){                 Push(&r,'@');             }         }         if(c==')'){             Pop(&s,&e);             while(e!='('){                 Push(&r,e);                 Push(&r,'@');                 Pop(&s,&e);             }         }else if(c=='+'||c=='-'){             if(!StackLen(s)){                 Push(&s,c);             }else{                 do{                     Pop(&s,&e);                     if(e=='('){                         Push(&s,e);                     }else{                         Push(&r,e);                         Push(&r,'@');                     }                 }while(StackLen(s)&&e!='(');                 Push(&s,c);             }         }else if(c=='*'||c=='/'||c=='('){             Push(&s,c);         }else if(c=='#'){             break;         }else{             printf("Error!");         }         scanf("%c",&c);     }     while(StackLen(s)){         Pop(&s,&e);         Push(&r,e);         Push(&r,'@');     }      getchar();     Push(&q,'#');      while(StackLen(r)){         Pop(&r,&e);         Push(&x,e);         Push(&q,e);     }     printf("转换为后缀表达式的结果为：\n");     while(StackLen(x)){         Pop(&x,&e);         if(e!='@')             printf("%c",e);         else             printf(" ");     }      Pop(&q,&c);     while(StackLen(q)){         while(isdigit(c)||c=='.'){             str[i++]=c;             str[i]='\0';             if(i>=10){                 printf("Error!");             }             Pop(&q,&c);             if(c=='@'){                 p1=atof(str);                 Push1(&p,p1);                 i=0;                 break;             }         }         switch(c){             case '+':Pop1(&p,&p1);Pop1(&p,&p2);Push1(&p,p2+p1);break;             case '-':Pop1(&p,&p1);Pop1(&p,&p2);Push1(&p,p2-p1);break;             case '*':Pop1(&p,&p1);Pop1(&p,&p2);Push1(&p,p2*p1);break;             case '/':Pop1(&p,&p1);Pop1(&p,&p2);if(p1!=0){Push1(&p,p2/p1);}else{printf("Error!");}break;          }         Pop(&q,&c);     }     Pop1(&p,&result);     printf("\n计算得出的结果为：\n%f",result);      return 0; } 代码有冗余，初始化，入栈出栈 测试你的代码没发现问题； 这个地方需要改一下： while((c>='0'&&c<='9')||c=='.'){    /*逻辑有问题*/             Push(&r,c);             scanf("%c",&c);             if(!((c>='0'&&c<='9')||c=='.')){

楼主忘记了自己申请的栈数据结构的大小吗，改大一点即可 [code=c]#define STACK_INIT_SIZE 20 #define INCREMENT 10 [/code]

能单步调试吗？跟踪一下看看哪一句之后崩溃的，问题就基本定位出来了。


Question: c语言求解，谢谢

#include<stdio.h>  long Fact(int n);  int main(void) {     int m, n;     int i;      for(i = 100; i <= 999; i++)     {         n = i;         m = 0;         while (n) {             m += Fact(n % 10);             printf("%d = %ld\n", n % 10, Fact(n % 10));             n /= 10;         }         if (m == i)             printf("%d is special number!\n", i);     }      return 0; }  long Fact(int n) {      if(n==1 || n == 0)         return 1;      return n*Fact(n-1); }  参考一下吧；

#include<stdio.h> long Fact(int n); int main() {  	int m,a,b,c,n; 	for(m=1;m<=10000;m++) 	{ 		a=m/100; 		b=m%100/10; 		c=m%10; 		n=Fact(a)+Fact(b)+Fact(c); 		if(m==n) 			printf("%d\n",m); 	} 	getchar(); } long Fact(int n) {  	if(n==1||n==0) 		return n;  	return n*Fact(n-1); }

for(m=100;m<=999;m++) { a=m/100; b=(m-a*100)/10;


Question: 将两个程序合并到一起

谢谢帮助，另外怎么把子集和输出的结果去重 例如，2 4 6      5 7            4 2 6      5 7 或者    5 7        4 2 6

#include <stdio.h> #include <stdlib.h> #include <time.h>  #define MAX 1000  //global variables int n=0;//the number of numbers int c=0;//the sum of the subset int num[MAX]={0}; int count=1;//the number of the element in a subset int result[MAX]={0}; //the answer of this question int c_sum=0;//current sum  //prototypes void swap(int &a,int &b); void back_subset(int i); void get_random(int *a, int len);  int main() {     //declaration     //int i=0;     printf("Please input the number of the numbers:");     scanf("%d",&n);     printf("Please input the sum:");     scanf("%d",&c);     get_random(num, n);     /*        for(i=1;i<=n;i++)        scanf("%d",&num[i]);        */     back_subset(1);       //getch(); }  void get_random(int *a, int len) {     int i;      srand((unsigned)time(NULL));     for(i=0;i<len;i++)         a[i] = rand() % 100; }  void back_subset(int i) {     if(c_sum+num[i]==c)     {         result[count]=num[i];         for(int temp=1;temp<=count;temp++)             printf("%d ",result[temp]);         printf("\n\n\n\n----------separate line------------------\n\n\n\n");         return ;     }     if(i>n)         return ;     if(c_sum+num[i]>c)         return;      for(int j=i;j<=n;j++)     {         result[count++]=num[j];         c_sum+=num[j];         swap(num[i],num[j]);         back_subset(i+1);         swap(num[i],num[j]);         c_sum-=num[j];         count--;     } }  void swap(int &a,int &b) {     int temp=a;     a=b;     b=temp; } 参考一下吧

用函数来表示第一个程序，第二个程序调用函数就好

把第一部分程序变成函数，传入缓冲区，生成随机数后填入缓冲区即可。


Question: 各式错误oj有毒

...试了不管用

换行\r 试试\n

引用 3 楼 cfjtaishan 的回复:#include<stdio.h> #include<math.h> int main() {     int n,m,i;     scanf("%d%d",&m,&n);     for(i = m; i <= n; i++)         printf("%-4d%4.4lf\n", i, log(i));      return 0; } 试一下这种形式，格式要求对数占8列，应该是总共占8列，小数部分占4列了，那么整数部分就是4列了吧 可以试试楼上的做法


Question: 有关链表的题

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

引用 5楼自信男孩 的回复:#include <stdio.h> #include <stdlib.h>  typedef struct number{     int no;     struct number*next; }num,*Linklist;  void CreateLinkR(Linklist*L,int n)   /*新建链表*/ {     Linklist p,s;     int i=0;      p = *L = (Linklist)malloc(sizeof(num));     for( ;n>0;n--){         s = (Linklist)malloc(sizeof(num));         s->no = ++i;         p->next = s;         p = s;     }     p->next = NULL; }  int ListDelete(Linklist *L, int i, int *ep)   //*删除结点*// {     Linklist p=NULL, q = *L;      while(q && i >= 1){         p = q;         q = q->next;         i--;     }     if(!p|| !q)         return 0;     p->next = q->next;      if(ep!=NULL)         *ep = q->no;     free(q);      return 1; }  int main() {     Linklist L,p;     int N,x,A[20],*a,i,k,t,ep;     scanf("%d%d",&N,&x);     for(a=A;a<A+20;a++)         scanf("%d", a);     CreateLinkR(&L,N);      for(a=A;a<A+20;a++)    //*把20个数字一个一个循环*//     {         t = *a;         for(k=1, i = N; k <= N / t; k++,i--)  //计算要删除几个数并循环删除这个结点*//         {             if(i==x)                 break;             ListDelete(&L, t*k, &ep);         }         N = i;         if(N==x)             break;     }     p = L->next;     i=0;     while(x >= ++i && p)     {         printf("%d ", p->no);         p = p->next;     }     putchar(10);     return 0; } 参考一下吧； scanf("%d%d",&N,&x); 去掉scanf中的'\n'我找到错误啦！是删除结点那一段删错结点了，虽然还是觉得很奇怪为什么显示的不是wa而是pe。 谢谢你看我的代码

引用 1楼heronism 的回复:引用这是原题目，然后我用链表做了一下，但是却一直是PE，找了好久，把输入输出改了好几遍，换行符空格也改了好多遍，但是却一直是PE，可以告诉我哪错了吗你能先说下什么是PE吗pe是数据错误的意思

输出结果没有问题，但是提交到网站上后一直显示数据错误

pe是指数据错误