Question: visual studio2017错误C2059

修正了所有的语法错误，但不保证运行正确。请自行对比  #include<stdio.h> #include<stdlib.h> #include<string.h>  typedef struct TelPhone {     char Name[20];     char TelNumber[20]; }iTem; typedef struct node {     iTem item;     node* next; }Node; typedef struct list {     node* head;     int size; }List;  static void CopyToNode(Node* pNode, iTem item); void InitializeList(List* plist); bool ListsEmpty(const List* plist); bool ListsFull(const List* plist); unsigned int ListItemCount(const List* plist); bool AddItem(iTem item, List* plist); void ShowListItem(const List* plist); void FreetheList(list* plist);   /*全局函数，吧元素添加到列表*/ static void CopyToNode(Node* pNode, iTem item) {     pNode->item = item; } /*初始化List对象，指针为空，大小为零*/ void InitializeList(List* plist) {     plist->head = NULL;     plist->size = 0; } /*确认列表为空*/ bool ListsEmpty(const List* plist) {     if (plist == NULL)         return true;     return false; } /*确认列表是不是满了*/ bool ListsFull(const List* plist) {     plist = (List*)malloc(sizeof(List));     if (plist == NULL)    /*如果申请不到内存，说明列表已经满了*/         return true;     else         return false; } /*返回元素个数*/ unsigned int ListItemCount(const List* plist) {     unsigned int count = 0;     node *curr = plist->head;     while (curr != NULL)     {         count++;         curr = curr->next;/*从头往后移动到列表结尾*/     }     return count; } /*添加元素，单向列表，从尾部添加*/ bool AddItem(iTem item, List * plist) {     Node* pNew, *temp;     pNew = (Node*)malloc(sizeof(Node));     if (pNew == NULL)/*说明创建节点失败，自然没法添加*/         return false;     CopyToNode(pNew, item);     pNew->next = NULL;  /*对新建的pNew节点，初始化*/     if (plist->head != NULL)     {         while(plist->head -> next != NULL)         {             plist->head = plist->head->next;/*从头到尾找到最后一个节点*/         }         plist->head->next = pNew;     }     else         plist->head = pNew;     return true; } /*显示列表中的元素*/ void ShowListItem(const List* plist) {     Node* pNode = plist->head;     while (pNode != NULL) /*从头到尾依次显示*/     {         printf("%s:%s\n", pNode->item.Name, pNode->item.TelNumber);         pNode = pNode->next;     }     return; } /*释放内存*/ void FreetheList(List* plist) {     while (plist->head != NULL)     {         Node* pNode;         pNode = plist->head->next; /*pNode用来存储*/         free(plist->head);         plist->head = pNode;     } }  int main() {     List BookPhone;     Node* TempPhone = (Node*)malloc(sizeof(Node));     unsigned int count;     InitializeList(&BookPhone);     if (ListsFull(&BookPhone))     {         printf("内存已经慢啦\n");         exit(1);     }     printf("请输入联系人的姓名:\n");     while (gets_s(TempPhone->item.Name) != NULL&&TempPhone->item.Name[0] != '\0')     {         printf("请输入联系人的电话号码:\n");         gets_s(TempPhone->item.TelNumber);         if (ListsFull(&BookPhone))         {             printf("内存已经慢啦\n");             break;         }         if (!AddItem(TempPhone->item, &BookPhone))         {             printf("联系人添加失败!!!");             break;         }         while (getchar() != '\n')             continue;         printf("若还要存储，请输入下一个联系人：\n");     }     if (ListsEmpty(&BookPhone))         printf("通讯录没有数据\n");     else     {         printf("通信录\n");         ShowListItem(&BookPhone);     }     count = ListItemCount(&BookPhone);     printf("联系人数目：%d\n", count);     FreetheList(&BookPhone);     free(TempPhone);     system("PAUSE");     return 0; }

一共又三个文件  my_list.h my_list.c 还有一个包含main()的


Question: C语言 初学者

引用 8 楼 u010165006 的回复:[quote=引用 5 楼 qq_39513318 的回复:] [quote=引用 4 楼 u010165006 的回复:] 打开文件，读取每一行到字符数组，如果数组是以;号开头的，略过，否则，把该行写到输出文件。   能贴个代码看看吗[/quote]  这个自己写吧，不懂翻书，文件读写、字符串数组会操作就差不多了。[/quote]  行 谢谢大神

引用 5 楼 qq_39513318 的回复:[quote=引用 4 楼 u010165006 的回复:] 打开文件，读取每一行到字符数组，如果数组是以;号开头的，略过，否则，把该行写到输出文件。   能贴个代码看看吗[/quote]  这个自己写吧，不懂翻书，文件读写、字符串数组会操作就差不多了。

引用 3 楼 baidu_37097818 的回复:用fstream文件流吧, 然后读取到string中  不太懂哎

引用 2 楼 xfdf1987 的回复:C处理这类字符串问题不是强项，条件允许的话，楼主考虑脚本。   老师让用C语言

引用 4 楼 u010165006 的回复:打开文件，读取每一行到字符数组，如果数组是以;号开头的，略过，否则，把该行写到输出文件。   能贴个代码看看吗

用fstream文件流吧, 然后读取到string中

C处理这类字符串问题不是强项，条件允许的话，楼主考虑脚本。

用fgets函数读取内容，然后用strcmp函数作比较，相等的再写入指定文件。


Question: 请教大神我这样简单的操作文件，出错了，

谢谢大家了，是我太粗心了，fopen 没有写

fopen都没有写，当然不对了。要细心了

我没有把文件设置为只读

代码本机试了没有问题。应该是文件被占用之类的

引用访问冲突 fopen应该是排版的问题没显示。  检查一下文件的属性是否设置为 只读

没写fopen么？还是没贴


Question: BOOL

仅供参考：#include <stdio.h> #pragma pack(push,1) union U {     unsigned char byte;     struct BF {         unsigned int b0:1;//a         unsigned int b1:1;//b         unsigned int b2:1;//c     } bf; } u; #pragma pack(pop) unsigned char bt; int a,b,c; int main() {     for (bt=0;bt<8;bt++) {         u.byte=(unsigned char)bt;         a=u.bf.b0;         b=u.bf.b1;         c=u.bf.b2;         printf("byte 0x%02x -- c:%d b:%d a:%d\n",bt,c,b,a);     }     for (c=0;c<2;c++)     for (b=0;b<2;b++)     for (a=0;a<2;a++) {         u.bf.b0=a;         u.bf.b1=b;         u.bf.b2=c;         bt=u.byte;         printf("c:%d b:%d a:%d -- byte 0x%02x\n",c,b,a,bt);     }     return 0; } //byte 0x00 -- c:0 b:0 a:0 //byte 0x01 -- c:0 b:0 a:1 //byte 0x02 -- c:0 b:1 a:0 //byte 0x03 -- c:0 b:1 a:1 //byte 0x04 -- c:1 b:0 a:0 //byte 0x05 -- c:1 b:0 a:1 //byte 0x06 -- c:1 b:1 a:0 //byte 0x07 -- c:1 b:1 a:1 //c:0 b:0 a:0 -- byte 0x00 //c:0 b:0 a:1 -- byte 0x01 //c:0 b:1 a:0 -- byte 0x02 //c:0 b:1 a:1 -- byte 0x03 //c:1 b:0 a:0 -- byte 0x04 //c:1 b:0 a:1 -- byte 0x05 //c:1 b:1 a:0 -- byte 0x06 //c:1 b:1 a:1 -- byte 0x07

你看一下sizeof( box_props)


Question: 函数调用的bug

问题找到了，原因在和这个函数很远的地方。 某处调用了一个返回值是double的Ind函数，但是这个Ind函数的头文件未被调用方包含 ，所以编译器当做返回int处理了。然后就导致了这个bug…… 至于为什么会影响到这个Raise函数，我还需要再看看。

引用 1 楼 xfdf1987 的回复:问题不一定在函数本身，楼主可以试试传指针 我比较想知道问题出在哪儿，换指针的目的是什么啊？

问题不一定在函数本身，楼主可以试试传指针


Question: C语言字段宽度这块儿的疑问，请大伽指点一下迷津

Format Specification Fields: printf and wprintf Functions A format specification, which consists of optional and required fields, has the following form:  %[flags] [width] [.precision] [{h | l | I64 | L}]type  Each field of the format specification is a single character or a number signifying a particular format option. 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 field, the character is copied to stdout. For example, to print a percent-sign character, use %%.  The optional fields, which appear before the type character, control other aspects of the formatting, as follows:  type  Required character that determines whether the associated argument is interpreted as a character, a string, or a number (see Table R.3).  flags  Optional character or characters that control justification of output and printing of signs, blanks, decimal points, and octal and hexadecimal prefixes (see Table R.4). More than one flag can appear in a format specification.  width  Optional number that specifies the minimum number of characters output. (See printf Width Specification.)   precision  Optional number that specifies the maximum number of characters printed for all or part of the output field, or the minimum number of digits printed for integer values (see Table R.5).  h | l | I64 | L  Optional prefixes to type-that specify the size of argument (see Table R.6).    Flag Directives The first optional field of the format specification is flags. A flag directive is a character that justifies output and prints signs, blanks, decimal points, and octal and hexadecimal prefixes. More than one flag directive may appear in a format specification.   Table R.4   Flag Characters  Flag Meaning Default  – Left align the result within the given field width.  Right align.  + Prefix the output value with a sign (+ or –) if the output value is of a signed type. Sign appears only for negative signed values (–).  0 If width is prefixed with 0, zeros are added until the minimum width is reached. If 0 and – appear, the 0 is ignored. If 0 is specified with an integer format (i, u, x, X, o, d) the 0 is ignored.  No padding.  blank (' ') Prefix the output value with a blank if the output value is signed and positive; the blank is ignored if both the blank and + flags appear. No blank appears.  # When used with the o, x, or X format, the # flag prefixes any nonzero output value with 0, 0x, or 0X, respectively. No blank appears.    When used with the e, E, or f format, the # flag forces the output value to contain a decimal point in all cases.  Decimal point appears only if digits follow it.    When used with the g or G format, the # flag forces the output value to contain a decimal point in all cases and prevents the truncation of trailing zeros.  Ignored when used with c, d, i, u, or s.  Decimal point appears only if digits follow it. Trailing zeros are truncated.    printf Width Specification The second optional field of the format specification is the width specification. The width argument is a nonnegative decimal integer controlling the minimum number of characters printed. If the number of characters in the output value is less than the specified width, blanks are added to the left or the right of the values — depending on whether the – flag (for left alignment) is specified — until the minimum width is reached. If width is prefixed with 0, zeros are added until the minimum width is reached (not useful for left-aligned numbers).  The width specification never causes a value to be truncated. If the number of characters in the output value is greater than the specified width, or if width is not given, all characters of the value are printed (subject to the precision specification).  If the width specification is an asterisk (*), an int argument from the argument list supplies the value. The width argument must precede the value being formatted in the argument list. A nonexistent or small field width does not cause the truncation of a field; if the result of a conversion is wider than the field width, the field expands to contain the conversion result.  Precision Specification The third optional field of the format specification is the precision specification. It specifies a nonnegative decimal integer, preceded by a period (.), which specifies the number of characters to be printed, the number of decimal places, or the number of significant digits (see Table R.5). Unlike the width specification, the precision specification can cause either truncation of the output value or rounding of a floating-point value. If precision is specified as 0 and the value to be converted is 0, the result is no characters output, as shown below:  printf( "%.0d", 0 );      /* No characters output */  If the precision specification is an asterisk (*), an int argument from the argument list supplies the value. The precision argument must precede the value being formatted in the argument list.

printf("%20s"...)默认是右对齐，如果让左对齐的话printf("%-20s");

首先你要保证你的输入是有效的，你已经越界赋值了，谁能保证程序运行的结果预期？  printf("\"%8s%-s\"\n",name,name1); 网上搜索下printf格式的说明，这里的8代表宽度，如果字符串长度>8，那么字符串将会完整显示（不会截断的） - 代表左对齐

是没有搞懂这个具体应该怎么用

字符串越界了吧？


Question: 关于FILE *型指针

引用如何记录这个位置  除了文件指针外，还有一个隐含的 文件位置指针。 文件指针与物理文件关联。 文件位置指针是指文件打开之后，在文件内部进行移动的指针。 fread,fwrite,fgets,fputs,rewind等函数运行后，都有可能会改变文件位置指针的值。  可以参考： http://blog.csdn.net/chenglibin1988/article/details/8750906  各个函数如何改变文件位置指针，可以查阅该函数的MSDN文档说明。

引用 1 楼 user-3 的回复:只有没有fclose就有FILE帮你记着位置，你不需要记。你想看看位置是多少，可以用ftell函数 谢谢,我知道了

楼上正解！！！！！！


Question: 求大神帮忙解决这个问题

引用 6 楼 qq_38046111 的回复:[quote=引用 5 楼 jianwen0529 的回复:] [quote=引用 3 楼 qq_38046111 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] C#接口的泛型编程 请问上面的TOutput表示的是输出的类型吗？ [/quote] 模板参数 你先网上搜索有关C#的泛型编程的一些资料看看你就明白了[/quote] 我看到网上的没有加out。然后我这里如果不加out也是不会报错的、加了out就报错了。[/quote] 这不是已经提示错误了么，接口不能使用out

引用 5 楼 jianwen0529 的回复:[quote=引用 3 楼 qq_38046111 的回复:] [quote=引用 2 楼 jianwen0529 的回复:] C#接口的泛型编程 请问上面的TOutput表示的是输出的类型吗？ [/quote] 模板参数 你先网上搜索有关C#的泛型编程的一些资料看看你就明白了[/quote] 我看到网上的没有加out。然后我这里如果不加out也是不会报错的、加了out就报错了。

引用 3 楼 qq_38046111 的回复:[quote=引用 2 楼 jianwen0529 的回复:] C#接口的泛型编程 请问上面的TOutput表示的是输出的类型吗？ [/quote] 模板参数 你先网上搜索有关C#的泛型编程的一些资料看看你就明白了

我这里应该要如何写

引用 2 楼 jianwen0529 的回复:C#接口的泛型编程 请问上面的TOutput表示的是输出的类型吗？

C#接口的泛型编程

这是语法的问题还是什么问题、我这是copy别人的


Question: 结构体的问题总是（输出打印素数）基本样式a+bi如果a=0输出bi如果b=0输出a

修改后的代码如下，关键处有注释。  #include<stdio.h> #include<stdlib.h>  struct complex_struct { 	int x; 	int y; }; struct complex_struct  make_complex_struct(int x, int y) { 	struct complex_struct z; 	z.x = x; 	z.y = y; 	return z; }; int real_part(struct complex_struct z) {//返回值类型应为int 	return z.x; }; int img_part(struct complex_struct z) {//返回值类型应为int 	return z.y; }; void print_complex_struct(int x, int y) {//调整if/else分支判断顺序 	if (x == 0 && y == 0){ 		printf("error"); 	}  	else if(x == 0){ 		printf("%di", img_part(make_complex_struct(x, y))); 	} 	else if(y == 0) { 		printf("%d", real_part(make_complex_struct(x, y))); 	} 	else { 		printf("%d+%di\n", real_part(make_complex_struct(x, y)), img_part(make_complex_struct(x, y))); 	}  }; int main() { 	print_complex_struct(0, 0); 	system("pause"); 	return 0; }


Question: 为什么参加计算机竞赛的人大多数使用的语言都是c++？

已经工作了的人没有兴趣去参加比赛。

因为刚开始学都是从c和c++开始的，这两门最熟悉，并且效率高

如果是算法题，一般都讲效率，c为上，如果有面向对象方面，自然c++。java只不过是使用人多，他们也大多不会c而已。

引用C语言不是更加适合竞赛的环境吗  计算机竞赛肯定支持使用C语言。 一些竞赛题解使用C++/Java，很大概率的原因是回答者对C++/Java语言更为熟悉。  至于效率倒不用担心，因为语言导致的时间复杂度、空间复杂度的差异，完全在允许范围之内。 只要解法满足理论复杂度，不会因为使用语言不同而被卡。  有的时候，也会在题目中对使用Java语言给出放宽，类似这样的说明： Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)  楼主会C语言，花点时间学习基本语法，看懂类似的C++竞赛程序答案应该没有问题。


Question: 我写了一个CCF的题，但只有80分，希望哪位大神可以给我看看，指出我的错误

引用 4 楼 user-4 的回复:少年  你这个程序有很大问题啊 我的问题已经解决了

我考虑了闰年的情况  引用 5 楼 cqlhj 的回复:[quote=引用 3 楼 qq_36267149 的回复:] 我考虑了闰年的情况 主循环改为:  	for( i = 0; i < 12; i++ ) 	{ 		if ( d <= a[i] ) 		{ 			b = d; 			break; 		} 		else 		{ 			d -= a[i]; 		} 	}   应该可以.[/quote] 谢谢，可以了

引用 1楼CaptainHarryChen 的回复:给你组数据 2012 60 正确答案为 2 29 你的程序为 3 0 很明显你没有把2月29天的情况算进去他考虑闰年的情况了，只是d和sum比较的时候需要判等

引用 3 楼 qq_36267149 的回复:我考虑了闰年的情况 主循环改为:  	for( i = 0; i < 12; i++ ) 	{ 		if ( d <= a[i] ) 		{ 			b = d; 			break; 		} 		else 		{ 			d -= a[i]; 		} 	}   应该可以.

少年  你这个程序有很大问题啊

我考虑了闰年的情况


Question: 指针问题

*（ptr++）+=123;做了一次++，printf("%d,%d",*ptr,*(ptr++));也做了一次++，所以会是8.

在printf里面，你既使用了ptr++，又使用了ptr，这种会产生混淆的情况是C语言没有定义的，不同的编译器可能有不同的实现，需要尽力避免这种情况，现实中有人这么写，我就会把那个人打一顿

不知道你想做什么

引用数组名是常量不能进行自增运算 int main() { 	int ptr[] = { 6,7,8,9 }; 	int *arr = ptr; 	*(arr++) += 123; //arr有自增操作，这行执行完毕，arr = ptr + 1，指向数组第2个元素7 	printf("%d,%d", *arr, *(arr + 1)); //输出7，8 	return 0; }

对    数组名是常量不能进行自增运算     那你帮忙看看  int *arr=ptr； *（arr++）+=123；

int main() { 	int ptr[] = { 6, 7, 8, 9 }; 	*(ptr++) += 123; 	printf("%d,%d", *ptr, *(ptr++));     return 0; }  这样会报错吧？ 是不是该改成  int main() { 	int ptr[] = { 6, 7, 8, 9 }; 	*(ptr+1) += 123; 	printf("%d,%d", *ptr, *(ptr+1));     return 0; }  这样的输出是


Question: c语言下如何使用system()同时执行多条cmd指令

ShellExecute(NULL,"open","C:\\Program Files\\Internet Explorer\\iexplore.exe",NULL,NULL,SW_SHOWNORMAL); 不能搞恶作剧

引用这段代码应该怎么修改才能达到不断打开ie的效果？ system("cd C:\\Program Files\\Internet Explorer && iexplore.exe"); 这行代码可以打开ie，报错原因不清楚，有可能是拼写的问题？  但这个问题的要害是用这种方式更换的工作目录，仅仅是依附在Console窗口进程下，而不是真正的改变工作目录。 听起来有点不好理解，直观的运行结果是这样的：  每次只能打开一个IE窗口，关闭IE后，才会打开另一个IE窗口。  如果想达到楼主想要的效果，可以用下面的代码：  #include <Windows.h> //必须包含这两个头文件 #include <shellapi.h>  int main(void) {     while(1)     {             ShellExecute(NULL, "open", "C:\\Program Files\\Internet Explorer\\iexplore.exe",  			NULL, NULL, SW_SHOWNORMAL);     }     return 0; }

system("cd /d C:\\Program Files\\Internet Explorer&&iexplore.exe");

楼主, 我用你的代码是可以正常打开IE浏览器的


Question: 求大神帮我解决一个C语言CAN总线的问题

引用除了0和1,还有了很多的赋值 can->SendType = gTxType;         // 发送帧类型                                                      // =0时为正常发送（发送失败会自动重发，重发最长时间为1.5-3秒）；                                                      //=1时为单次发送（只发送一次，不自动重发）；                                                      //其它值无效。 这里的注释可能是某个代码作者写的，权威的解释还得看 接口文档 。 楼主手头应该有类似"CAN-bus接口函数库使用手册"这样的文档，以上面的说明为准。 如果没有这样的文档，可以上网搜。


Question: 刚解决输入问题，发现输出又出问题了，求各位大佬指点一下！

非常感谢两位回答！！！问题解决的，以后会注意。

上面是程序和结果，不知道为什么score会输出一堆数字，明明也输入了数字的。

错了，可以有逗号。但是你输入的逗号是中文的，改成英文逗号结果就正确了

引用你好那个是我为了找问题打印出来的不是我输入的   while (p1->num != 0)  //循环的结束条件是第一个数输入0 注意下图标红处：  从目前看，输入如果符合正确的格式，结果是正常的。

scanf()格式化字符串不能有逗号 删除或者不加就没错了

#include"stdio.h" #include"malloc.h" #define LEN sizeof(struct Student) struct Student { 	long num; 	float score; 	struct Student *next; }; int n; struct Student *creat() { 	struct Student *head; 	struct Student *p1, *p2; 	n = 0; 	p1 = p2 = (struct Student *)malloc(LEN); 	scanf_s("%ld,%f", &p1->num, &p1->score); 	head = NULL; 	while (p1->num != 0) 	{ 		n = n + 1; 		if (n == 1) { head = p1; } 		else { p2->next = p1; } 		p2 = p1; 		p1 = (struct Student *)malloc(LEN); 		rewind(stdin);scanf_s("%ld,%f", &p1->num, &p1->score); 	} 	p2->next = NULL; 	return(head);  } void print(struct Student *head) { 	struct Student *p; 	printf("\nNow,These %d records are:\n",n); 	p = head; 	if (head != NULL) 		do 		{ 			printf("%d %f\n", p->num, p->score); 			p = p->next; 		} while (p != NULL); } void main() { 	struct Student *head; 	head = creat(); 	print(head); 	rewind(stdin);getchar(); }

建议把代码贴上来  方便别人帮你调试

引用 4 楼 fight_in_dl 的回复:scanf_s(%ld,%f",&p1->num,&p1->score)   在终端输入时必须同格式字符串匹配。  1001，67 //正确的输入格式 we1002,68 //错误的输入格式  g0,0 //错误的输入格式  当输入格式错误时，num和score接收不到正确的值。你好那个是我为了找问题打印出来的不是我输入的

那个we和g不是我输入的，是打印出来的哦，所以说应该没有什么问题把。


Question: 求一个二维数组的鞍点，其中的for循环内去掉一行为什么不对？跪求大神解答

if (a[i][j]>max)  //如果这个条件不满足呢?  {     max=a[i][j];             maxj=j;      //如果进不到if分支，这行就不会被执行。 }  所以需要之前红色的那行。


Question: 求组！！层次遍历二叉树

# include<stdio.h> # include<stdlib.h>  //二叉树结点类型定义 typedef struct btNode { 	char data;     struct btNode * lchild; 	struct btNode * rchild; }BiTree,*Tree;  //队列结点类型定义 typedef struct Node { 	Tree data; 	struct Node * next; }Node,*pNode;  typedef struct Queue { 	pNode front; 	pNode rear; }QUEUE; /*==========队列函数定义==========*/ void InitQueue(QUEUE &); void EnQueue(QUEUE &, Tree); void DeQueue(QUEUE &); bool EmptyQueue(QUEUE); void GetHead(QUEUE, Tree&); /*==========队列函数定义==========*/  /*==========二叉树函数定义==========*/ void CreateTree(Tree &); void Visit(Tree); int Height(Tree); void LevelOrder(Tree); /*==========二叉树函数定义==========*/   int main(void) { 	Tree T;     printf("\n按先序序列输入结点序列，'#'代表空:");     CreateTree(T);      printf("二叉树的高度为%d\n",Height(T)); 	printf("二叉树的层次遍历结果为:"); 	LevelOrder(T); 	printf("\n");  	return 0; }  void init(QUEUE & Q) { 	Q.front = (pNode)malloc(sizeof(Node)); 	if(NULL == Q.front) 	{ 		printf("动态分配内存失败\n"); 		exit(-1); 	} 	Q.rear = Q.front; }  //入队 void EnQueue(QUEUE & Q, Tree e) { 	pNode pNew = (pNode)malloc(sizeof(Node)); 	if(NULL == pNew) 	{ 		printf("动态分配内存失败\n"); 		exit(-1); 	} 	pNew->data = e; 	pNew->next = NULL; 	Q.rear->next = pNew; 	Q.rear = pNew; }  //出队 void DeQueue(QUEUE & Q) { 	if(Q.front == Q.rear) 		return; 	else 	{ 		pNode p = Q.front->next; 		Q.front = p->next; 		if(Q.rear == p) 			Q.rear = Q.front; 		free(p); 	} }  //判断队列是否为空 bool EmptyQueue(QUEUE Q) { 	if(Q.rear == Q.front) 		return true; 	else 		return false; }  //获得对首元素 void GetHead(QUEUE Q, Tree & e) { 	if(EmptyQueue(Q)) 	{ 		 return; 	} 	else 	{ 		 e = Q.front->next->data; 	} }  //创建二叉树 void CreateTree(Tree &T) { 	char ch; 	scanf("%c", &ch); 	if('#' == ch) 		T = NULL; 	else 	{ 		T = (Tree)malloc(sizeof(BiTree)); 		if(NULL == T) 		{ 			printf("动态分配内存失败"); 			exit(-1); 		} 		else 		{ 			T->data = ch;             CreateTree(T->lchild); 			CreateTree(T->rchild); 		} 	} }  //访问节点 void Visit(Tree T) { 	printf("%c", T->data); }  //求树的高度 int Height(Tree T) { 	int ld = 0; 	int rd = 0; 	if(NULL == T) 		return 0; 	else 	{ 		ld = Height(T->lchild); 		rd = Height(T->rchild); 		return 1 + (ld>rd?ld:rd); 	} }  //层次遍历 void LevelOrder(Tree T) { 	QUEUE Q; 	init(Q); 	Tree p;  	if(NULL != T) 	{ 		EnQueue(Q, T); 		while(!EmptyQueue(Q)) 		{ 			GetHead(Q, p); 			DeQueue(Q); 			Visit(p); 			if(NULL != p->lchild)             EnQueue(Q, p->lchild); 			if(NULL != p->rchild)             EnQueue(Q, p->rchild); 		} 	}   }  输入A##能行输入AB##C##错误


Question: return问题

引用 4 楼 fight_in_dl 的回复:应该是英文状态下的分号。  对返回值类型为void的函数，可以使用return; void DoSomething() {    //其它代码    return; // 如果在结尾，这行可以写，也可以不写。 } 上面这种情况，return;没有太大意义。它在下面这种情况下有用： void DoSomething() {    //其它代码     if(满足某个条件)           return;  //函数返回，下面的代码就不用执行了。    //其它代码 }  你回复的质量很高，不错

是分号用的不对吧。  如果是中文的分号，编译器会提示：“；”是未生命的标识符。 楼主具体看看编译问题就知道了。

我觉得这个分号是中文里的，请使用半角分号试试。

引用 2 楼 guohanma 的回复:中文冒号问题.... 错了是分号

中文冒号问题....

补充一下 ，如果没有问题的话 。那返回的是什么呢？


Question: 实现数字输出，在线等

引用 4 楼 adusuccessfully 的回复:2楼对楼主的问题进行了分析。 1楼和3楼是两种不同的实现方式。1楼的实现主要靠itoa函数生成字符串  3楼使用的递归不是很好理解。 楼主可以参考下。  我自己想了下也实现了，当时有点短路。谢谢大家

#include <stdio.h> void func(int *p,int n,int m) {     if(n==0)     {           for(int i=m-1;i>=0;i--)                printf("%-3d",p[i]);           printf("\n");     }else     {     	p[n-1]=0;     	func(p,n-1,m);     	p[n-1]=1;     	func(p,n-1,m);     } } void main() { 	int n; 	int *p; 	printf("输入n\n"); 	scanf("%d",&n); 	p=(int *)malloc(sizeof(int)*n); 	func(p,n,n); }

引用求输入任意x  先看一下规律。 x = 1， 输出为2行(2的1次方)1列。 x = 2 ，输出为4行(2的2次方)2列。 x = 3 ，输出为8行(2的3次方)3列。 ... x =n， 输出为2的n次方行n列。  那么各行的值有什么规律呢： 第一行都是0 从第二行开始，都是前一行的值加1，注意是二进制加法。  我们以8行3列的为例:    第一行-------->0   0   0                  0 0 0 + 1-------->0   0   1  0 0 1 + 1-------->0   1   0 0 1 0 + 1-------->0   1   1  0 1 1 + 1-------->1   0   0 1 0 0 + 1-------->1   0   1 1 0 1 + 1-------->1   1   0 1 1 0 + 1-------->1   1   1  规律就是这样，至于如何用代码实现，就得再花时间了。 虽然没有完全解决您的问题，但应该也指出了问题的关键。 希望在结帖给分的时候给予考虑，谢谢！！

#include <iostream> #include <stdlib.h> #include <string.h> #include <math.h> using namespace std; int main() {     int i,len,temp;     char res[1000];     while(cin>>i&&i<=10&&i>=1){          temp=pow(2,i);          for(int j=0;j<temp;j++)          {              itoa(j,res,2);              if(strlen(res)<i)              {                  for(int k=0;k<i-strlen(res);k++)                  cout<<0<<' ';                   for(int k=0;k<strlen(res);k++)                     cout<<res[k]<<' ';                  cout<<endl;              }              else              {                  for(int k=0;k<strlen(res);k++)                     cout<<res[k]<<' ';                  cout<<endl;              }          }     } }


Question: 编写一个将输入复制到输出的程序，并将其中连续的多个空格用一个空格代替

引用 4 楼 Jayson_Lin 的回复:我想问：NONBLANK在C语言中是有特殊定义的吗？如果不是，我可以换成其他的字母什么的进行代替吗？ NONBLANK是你的程序自己#define的..在第三行#define NONBLANK 'a', 只是初始化lastc,这里lastc只要不初始化为空格键“ ”就行。

引用 1 楼 guohanma 的回复:getchar()是从输入获取一个字符，putchar是输出一个字符。这个程序是每次从输入获取一个字符，如果该字符不是空格就直接输出，是空格就判断在这之前的字符是否也为空格，如果不是就输出。也就是如果有连续多个空格，就只输出第一个。重复直到遇到文件结尾符  我想问：NONBLANK在C语言中是有特殊定义的吗？如果不是，我可以换成其他的字母什么的进行代替吗？

引用NONBLANK在C语言中是有特殊定义的吗  #define是C语言中的预处理命令，它用于宏定义，可以提高源代码的可读性，为编程提供方便。 #define NONBLANK  'a' 之后，编译器在遇到NONBLANK，会将其替换为'a'。  这个题目中用这个宏意义不大，只要保证在while循环前lastc有一个不等于空格的值就行。 lastc = NONBLANK;  //lastc = 'b'; 这样也可以 //lastc = 'c'; 这样写也行 while((c = getchar())!= EOF){

不好意思，示例中，输入应该是： cㄩㄩb

引用其实我并不懂题目的意思。 输入时字符先放到缓冲区，当按下回车键时，发送EOF，清除缓冲区，此时才开始逐个读取字符。 以上这行是理解这个题的关键，相关内容如果不是太理解，可以百度下。  举例，假设输入为： aㄩㄩb  (ㄩ代表空格) 当按下回车后，开始逐个读取字符，并进行处理。 while((c = getchar())!= EOF){         if(c != ' ')             //第一次读到'c'             putchar(c);//输出'c'         if(c == ' ')            //第二次读到空格             if(lastc != ' ')   //第一次结束后lastc = 'c' ,满足条件                 putchar(c); //打印空格         lastc = c; //第二次结束后lastc等于空格     } while((c = getchar())!= EOF){         if(c != ' ')             //第三次读到空格             putchar(c);             if(c == ' ')            //满足条件             if(lastc != ' ')   //第二次结束后lastc等于空格，不满足条件                 putchar(c); //不打印         lastc = c; //lastc等于空格 while((c = getchar())!= EOF){         if(c != ' ')             //第四次读到‘b'             putchar(c);    //输出'b'         if(c == ' ')                        if(lastc != ' ')                    putchar(c);         lastc = c;   可能不是特别清楚，不行拿张纸，每次循环记一下各变量值。


Question: 输入不同的字母 最后按字母表的顺序输出（因为刚学malloc这个方法，想利用这个来储存输入的值）

谢谢老师 我去试一下

修改后的代码如下，关键处有注释：  #include <stdio.h> #include <stdlib.h> void array(char*p, int i) { 	int m; 	int n; 	int temp; 	for (m = 0; m < i-1; m++) { 		for (n = m+1; n < i ;n++) {  			if (*(p + n) < *(p + m)) { //要真正的交换，而不是交换函数内的局部变量。 				temp = *(p + m); 				*(p + m) = *(p + n); 				*(p + n) = temp; 			} 		} 	} } 	 int main() { 	int i, n; 	char*p; 	scanf("%d", &i); //注意：回车后缓冲区还有一个字符'\n' 	p = (char*)malloc(i*sizeof(char)); 	if (p == NULL)exit(1); 	getchar(); //接收之前缓冲区的字符'\n' ，保证下面的输入正确 	for (n = 0; n < i; n++) { 		scanf("%c", (p + n)); 	} 	array(p, i); 	for (n = 0; n < i; n++) 		printf("%c", *(p + n));  	return 0; }  运行范例如图：


Question: C语言 windows socket编程 遇到一个变量问题

问题已经找到了，谢谢user-1的回复。 问题在于函数的参数传递时，形参传递有问题，虽然参数名称是和全局变了一致，但是，函数在内部执行时，只是按局部变量来执行，所以在函数返回时，变了就被清零了。正确的做饭时，将形参取引用&，这样，问题就解决了。 谢谢user-1的回复。结贴。

没有看到代码前是不知道问题出在什么地方， 仅凭借你给出的信息来猜测，应该是以下几种可能： 1.变量的生命周期结束。 2.变量在其他地方再次被初始化


Question: 如何用C实现文件的加载，有人做过吗

难道是PE文件？

文件加载可以理解成将文件内容读到内存，对于文件读写有很多接口可以选择～

fopen,fscanf，fgetc，fgets等就好了。

引用 3楼春风醉 的回复:LZ，你要加载什么文件？要达到什么效果？ 你的问题没说明白，没法回答你。是想实现软件文件的更新吧

百度搜相关关键字。

路过看看111

LZ，你要加载什么文件？要达到什么效果？ 你的问题没说明白，没法回答你。

楼主的意思是把可执行文件的映像加载到内存中？

不是很明白你的需求，如果仅仅是把文件加载到内存，不就是fopen,  fread就完事了吗？


Question: C语言初学者  求助帖

Checkchar没有初始值

你好。 Windows版： 1.Enter 2.Ctrl+Z Linux版： Ctrl+D

Windows：Enter、Ctrl+Z、Enter Linux：Ctrl+D

没有eof所以循环一直循环

引用键盘上的enter就是从里面的\n  是的。

Checkchar没有初始值

你输入EOF了吗

谢谢大家的回答，4楼很给力，差不多明白啦，小白顺便再问一下，键盘上的enter就是从里面的\n对吧

回复1楼：getchar函数从标准输入读取一个字符并返回它的值；如果输入中不存在任何字符，函数就会返回常量EOF（在stdio.h中定义），用于提示文件的结尾。这个是摘自《C和指针》上的，我不是很懂，请问要怎么输入EOF呢？是因为这个导致printf("Checkchar=%d\n",Checkchar);  没办法输出吗？

不是初始值的问题。 仅仅按下回车，并没有退出循环，仍然在等待输入。 解决办法是按下ctrl + z，这样才发送EOF，从而循环终止，显示结果。 看一下图就更清楚了：

没有赋初值不是默认初始化零吗


Question: 用C编写多线程的客户端和服务器，实现一对一对话。两者可以不按顺序发言。

好的，我去看看。

网络通信网上有好多成熟的第三方库的，直接下载调用就好了


Question: C语言课程设计 判断星期几，不使用time.h

引用第二个我的想法是，建立一个循环，判断一次以后，输入0退出 答案中的代码主要解决输入，星期的算法挺好，应该没问题。

修改后的代码如下，关键处有注释：  #include<stdio.h> #include<stdlib.h> #include<conio.h>  void JudgementWeekday(int year, int month, int day) {//week是输出值 ，不用放在参数列表中  	int week; 	if (month == 1 || month == 2) { 		month += 12; 		year--; 	} 	week = (day + 2 * month + 3 * (month + 1) / 5 + year + year / 4 - year / 100 + year / 400) % 7; 	switch (week) 	{ 	case 0: 		printf("Sunday!\n"); 		break; 	case 1: 		printf("Monday!\n"); 		break; 	case 2: 		printf("Tuesday!\n"); 		break; 	case 3: 		printf("Wednesday!\n"); 		break; 	case 4: 		printf("Thursday!\n"); 		break; 	case 5: 		printf("Friday!\n"); 		break; 	case 6: 		printf("Saturday!\n"); 		break; 	} } int main() { 	int year, month, day; 	char ch; 	while (true) { 		printf("Please enter year,month,day:\n"); 		scanf("%d,%d,%d", &year, &month, &day); 		JudgementWeekday(year, month, day); 		printf("\nType 0 exit, press any key to continue!\n"); 		if ((ch = getch()) == '0'){ //输出一次week结果后，判断输入字符是否为0，再进行不同处理。 			break; 		} 		else{ 			continue; 		} 	} } 运行效果如下图：


Question: 求一个不规则图形（其所有角度均为90度）的最大内接矩形的算法

斜的不能用类似我代码的思路。 仅供参考： 排料问题大牛:http://www2.stetson.edu/~efriedma/packing.html

如果是求最大外接矩形的话……

引用 7 楼 zhao4zhong1 的回复:[/code]   算法明白了，但是这个算法貌似对解决问题帮助不大啊

仅供参考：//实现一个函数：求数轴上多个线段覆盖的区域对应的多个线段; 输入多个线段,求出被这些线段覆盖的所有区域(也用线段表示); 一条线段用两个值表示(x0,x1), 其中x1>x0; //比如(1,3);(2,4);(5,6);结果为(1,4);(5,6); //比如(1,3);(2,4);(5,6);(4,7);结果为(1,7); #include <stdio.h> #define MAXLINES 100 struct LINE {     int x0;//左端     int x1;//右端 } ls[MAXLINES]; int i,j,k,n,x0,x1,c; void add() {     if (0==n) {//加入第一对点         ls[n].x0=x0;         ls[n].x1=x1;         n=1;     } else {         if (x1==ls[0].x0) {//右端＝第一条线段的左端             ls[0].x0=x0;//第一条线段的左端修改为左端             return;         }         if (x1<ls[0].x0) {//右端＜第一条线段的左端             for (i=n-1;i>=0;i--) {//将所有线段往后移                 ls[i+1].x0=ls[i].x0;                 ls[i+1].x1=ls[i].x1;             }             ls[0].x0=x0;//新第一条线段为x0,x1             ls[0].x1=x1;             n++;             return;         }         if (ls[n-1].x1<x0) {//左端＞最后那条线段的右端             ls[n].x0=x0;//新最后那条线段             ls[n].x1=x1;             n++;             return;         }         if (x0<=ls[0].x0 && ls[n-1].x1<=x1) {//左端≤第一条线段的左端且最后那条线段的右端≤右端             ls[0].x0=x0;//只剩这一条线段             ls[0].x1=x1;             n=1;             return;         }         for (i=0;i<n;i++) {//从左到右依次检查每条线段             if (ls[i].x0<=x0 && x0<=ls[i].x1) {//第i条线段的左端≤左端≤第i条线段的右端                 for (j=i;j<n;j++) {//从第i条线段开始从左到右依次检查每条线段                     if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端                         ls[i].x1=ls[j].x1;//第i条线段的右端改为第j条线段的右端                         for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                             ls[i+k].x0=ls[j+k].x0;                             ls[i+k].x1=ls[j+k].x1;                         }                         n-=j-i;                         return;                     }                     if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端＜右端＜第j+1条线段的左端(如果有)                         ls[i].x1=x1;//第i条线段的右端改为右端                         for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                             ls[i+k].x0=ls[j+k].x0;                             ls[i+k].x1=ls[j+k].x1;                         }                         n-=j-i;                         return;                     }                 }             }             if (ls[i].x1<x0 && (i==n-1 || x0<ls[i+1].x0)) {//第i条线段的右端＜左端＜第i+1条线段的左端(如果有)                 if (i!=n-1 && x1<ls[i+1].x0) {//右端＜第i+1条线段的左端(如果有)                     for (k=n-1;k>=i+1;k--) {//将从第i+1条线段开始的所有线段往后移                         ls[k+1].x0=ls[k].x0;                         ls[k+1].x1=ls[k].x1;                     }                     ls[i+1].x0=x0;//新第i+1条线段为x0,x1                     ls[i+1].x1=x1;                     n++;                     return;                 }                 for (j=i+1;j<n;j++) {//从第i+1条线段开始从左到右依次检查每条线段                     if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端                         ls[i+1].x0=x0;//第i+1条线段的左端改为左端                         ls[i+1].x1=ls[j].x1;//第i+1条线段的右端改为第j条线段的右端                         for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                             ls[i+1+k].x0=ls[j+k].x0;                             ls[i+1+k].x1=ls[j+k].x1;                         }                         n-=j-i-1;                         return;                     }                     if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端＜右端＜第j+1条线段的左端(如果有)                         ls[i+1].x0=x0;//第i+1条线段的左端改为左端                         ls[i+1].x1=x1;//第i+1条线段的右端改为右端                         for (k=1;k<n-j-1;k++) {//将剩余线段往前移                             ls[i+k].x0=ls[j+k].x0;                             ls[i+k].x1=ls[j+k].x1;                         }                         n-=j-i-1;                         return;                     }                 }             }             if (x0<ls[i].x0) {//左端＜第i条线段的左端                 for (j=i;j<n;j++) {//从第i条线段开始从左到右依次检查每条线段                     if (ls[j].x0<=x1 && x1<=ls[j].x1) {//第j条线段的左端≤右端≤第j条线段的右端                         ls[i].x0=x0;//第i条线段的左端改为左端                         ls[i].x1=ls[j].x1;//第i条线段的右端改为第j条线段的右端                         for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                             ls[i+k].x0=ls[j+k].x0;                             ls[i+k].x1=ls[j+k].x1;                         }                         n-=j-i;                         return;                     }                     if (ls[j].x1<x1 && (j==n-1 || x1<ls[j+1].x0)) {//第j条线段的右端＜右端＜第j+1条线段的左端(如果有)                         ls[i].x0=x0;//第i条线段的左端改为左端                         ls[i].x1=x1;//第i条线段的右端改为右端                         for (k=1;k<=n-j-1;k++) {//将剩余线段往前移                             ls[i+k].x0=ls[j+k].x0;                             ls[i+k].x1=ls[j+k].x1;                         }                         n-=j-i;                         return;                     }                 }             }         }     } } void show() {     for (i=0;i<n;i++) {         printf("(%d,%d);",ls[i].x0,ls[i].x1);     }     printf("\n"); } void main() {     n=0;     c=0;     while (1) {         printf("Input x0,x1(x0<x1;0,0 to exit):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d,%d",&x0,&x1)) {             if (0==x0&&0==x1) break;             if (x1>x0) {                 c++;                 if (c>=MAXLINES) {                     printf("Up to %d!\n",MAXLINES);                     break;                 }                 add();                 show();             }         }     } }

最大矩形可能是斜的

引用 3 楼 weixin_39014139 的回复:[quote=引用 1 楼 user-4 的回复:] 时间复杂度不超过n2有点难啊， 不然把每个边界点（角的顶点）的最大矩形都算出来，然后比较就行了  把各个顶点求出来之后，怎么继续求每个角的最大矩形啊，求教[/quote]  看你的画的图的图形还是很规则的，就只要上下左右四个方向找最大矩形就行了； 如果是很不规则的图形，那就找出这个点出发不超出矩形的最长的两条垂直线

引用 1 楼 user-4 的回复:时间复杂度不超过n2有点难啊， 不然把每个边界点（角的顶点）的最大矩形都算出来，然后比较就行了  把各个顶点求出来之后，怎么继续求每个角的最大矩形啊，求教

baidu扫描线算法


Question: 请教大家，一道面试题。谢谢！

图片太小不能看，你就把语法特性去除就是伪代码了，通用的一个描述。

引用 4 楼 jianwen0529 的回复:伪代码其实很随意的啊，说实话我也是第一次写 for i:=1 to 100     if i%3=0 and  i%5=0         print "FizzBuzz"     elseif  i%3=0         print "Fizz"     else if   i%5=0         print "Buzz"  用中文都可以。 大概就算一个流程罢了 反正就那么个意思，相当于程序的草稿

integer  引用 2 楼 qq_29448025 的回复:[quote=引用 1 楼 jianwen0529 的回复:] 图片太小不能看，你就把语法特性去除就是伪代码了，通用的一个描述。 谢谢，题目如下，请帮忙再看看：  [/quote] 伪代码其实很随意的啊，说实话我也是第一次写 for i:=1 to 100     if i%3=0 and  i%5=0         print "FizzBuzz"     elseif  i%3=0         print "Buzz"     else if   i%5=0         print "Buzz"  用中文都可以。 大概就算一个流程罢了

这不是要求不能用C语言,伪码一般是为了简单快速地写完逻辑.

引用 1 楼 jianwen0529 的回复:图片太小不能看，你就把语法特性去除就是伪代码了，通用的一个描述。 谢谢，题目如下，请帮忙再看看：


Question: C语言结构体问题

typedef struct user { char number[CARD_NUMBER_LENGTH + 1]; char password[CARD_PASSWORD_LENGTH + 1]; char name[CARD_NAME_LENGTH]; int balance; time_t lastLoginTime; int attempts; user *next;//链表 } *puser  相当于  struct user { char number[CARD_NUMBER_LENGTH + 1]; char password[CARD_PASSWORD_LENGTH + 1]; char name[CARD_NAME_LENGTH]; int balance; time_t lastLoginTime; int attempts; user *next;//链表 };  typedef struct user *  puser;  于是puser就是一个类型，是struct user *类型的别名，这也就是typedef的作用，一般是简化类型名的长度方便敲码，还有是维护的时候增加修改类型的方便性。

楼上解释正解。  typedef 功能就是给类型起别名，是为了简化表达。     举个例子： typedef int *p; //给 int * 这种类型起个别名，叫做p p a;  //等同于 int  *a p *a; //等同于int  **a;


Question: 求助

这应该是16进制的ascii码

二进制。。。。

你这是明文还是二进制？ 明文就读取如何判断三个连续出现如何提取后面的N个项 二进制类似，提取后面的N个字节


Question: 为什么case2有问题？求大神

又是给了一堆代码然后说有问题的帖子。  你倒是描述下遇到的是什么问题： 编译错误（错误提示）？运行错误（崩溃还是什么）？结果跟预期不符（给测试数据或者运行截图）？其他……


Question: WIN3使用ChooseFont设置字体后中文会旋转显示

使用”@宋体“


Question: 因数分解的一些小问题

引用 4 楼 kugeniha的回复:那你就加个判断，n是否等于1，再决定要不要再输出个n 是的，这样也可以，就解决了问题  但是我想搞清楚，为什么出现上面所说的原因

引用 5 楼 user-2的回复:代码的严谨性是决定代码好坏的一个标准。 嗯嗯，说得对，谢谢指点哈。

那你就加个判断，n是否等于1，再决定要不要再输出个n

代码的严谨性是决定代码好坏的一个标准。

1.如果按照这里所写代码来运行那么，当输入9，8，之类有相同因数的情况下会多输出一个1 2.去掉打注释的那个printf语句后，当输入9，8之类的数，正常输出，但是输入其他类型的数，在输出因数的结果上会少输出最后一个因数。  求大佬来看看，试运行一下，分析分析。

嗯嗯，那个scanf里面是多余了个等号，不过实际情况没影响，刚才我又试验了几遍

代码有一定的问题。scanf里面不需要加=,i的值在你n变了以后也要变。   想不清楚这个过程。你可以尝试的去用一些例子一步一步分析。   其实也就是一步一步求因数的过程。最后剩下的数无因数可求了。但是这个数也会是它的因数。


Question: 关于结构体

强烈BS一下不结贴不散分的人。。。。。

谢谢大家,已经找到问题了

定义前面加上typedef，或者在使用前面加上struct就可以了！

假设main.c包含xxx.h。 xxx.h文件中应该有struct的完整定义，而不能只是声明。  struct是C语言的关键词，使用不需要包含什么头文件。

你是不是在结构体中定义了一个指向此结构的指针？ 如果是这样，需要先声明结构名字。 struct xxx; struct {     ...     struct xxx *ptr; } Mystru;  或者这样 struct xxx {     ....     sttuct xxx *ptr; }Mystru;

定义的位置有问题， 遵从的原则是先定义后使用， 建议在编译时增加断点  结构体里面和调用定义的地方，


Question: 对于单链表存储结构及尾插法的几点懂

引用 楼主 qq_27322991 的回复:代码如下： void CreateListTail(LinkList *L,int n) {         LinkList p,r;//关键还要看  LinkList 是什么类型，是否为地址。 //代码执行到这里，p、r在内存中分配了对应的空间了么 //初始化两个链表元素，内容不定         int i;         *L = (LinkList)malloc(sizeof(Node));         r = *L; //代码执行到这里，r=*L，这条赋值语句，是将*L中的值赋值给r了，还是此时r已经与L指向相同的地址块，为什么？ //你可以查看  &r  和 L 值是否相同，如果相同，则为相同地址。         for (i=0 ; i<n ; i++)         {                 p = (Node*)malloc( sizeof( Node ) );                 p->data = i;                 r->next = p;                 r = p;         }         r -> next = NULL; }  这个程序存在的问题： 1.内存空间分配完毕后，不知道链表的首地址是哪个。 2.由问题1引发的第二个问题，malloc 之后，必须有free对相应的空间进行释放操作。【当然，如果使用new创建对象，要使用delete进行内存回收】

p、r、*L都是指针。 函数中声明了p、r，它们都分配了空间，只不过是指针，它们所指向的内存不确定，可以说，它们所指向的对象不确定。给它们赋值后，就能确定指向谁了。 L作为函数的形式参数，一旦调用该函数，L就已经分配了空间，并且它的值（指针值）就是实参的值。 r = *L; 后，把*L的值赋值给r了，r所指向的对象与*L所指向的对象在同一位置，即指向同一对象了。


Question: 为什么链表最后插入一个节点要吧头节点给出去

//以下三行作用是到达最后一个节点     node *last = head;     while(last ->next != NULL) //最后一个节点next == NULL，此时跳出循环         last = last ->next;     last->next = new_node; //然后在最后一个节点后面添加一个新节点

引用 1 楼 fight_in_dl 的回复:首先需要说明，链表可以没有头结点，但必须有头指针（这是另外一个问题） 为了使空链表与非空链表处理一致，我们通常设一个头结点。以下讨论都是基于有头结点的情况。   如果阅读Link list的完整代码，会发现不仅是insert_last，在其它位置插入节点、删除节点、倒序排列节点等操作都返回头节点。 这是由链表的数据结构决定的，只有从头节点出发，通过指针域next，才能找到(遍历)链表节点。 头节点不确定，链表的存取操作就无法进行。  因此，进行了改变链表的操作后，都需要返回头结点。   node *last = head;那这一步的head 的作用是什么呐

node *last = head;那这一步的head 的作用是什么呐


Question: 请教如何使用global全局的struct指针

把指针的指针赋给指针，所以错误

两个地方需要修改：         init->message = NULL; //空指针 	ptr_running = init;  //去掉& 	printf("%s\n", ptr_running->message);

ptr_running = &init; 改成 ptr_running = init;


Question: 怎么改成二进制

可以转换成十六进制 strtemp.Format("%02X", bt);

有木有大神~~~~~


Question: 编译器中提到的int型是不是指实参1“abc”的类型为int型？仅仅出现"abc",也没声明它的类型。为何是int型？

理解和讨论之前请先学会如何观察！  //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

那参数2"abc"是什么类型？ 还有关于char*看到网上有种说法char*占4个字节所以也可以看作int型。 get(m)的放回值是数组首地址，这个地址是一个char*,也可以看作int型，都占4字节，可以这样理解吗？

get(m )的返回值是int，所以用他作为参数！

首先，"abc"是参数2，gets(m)才是参数1。  出现警告的原因是新的C标准认为gets函数不安全、过时的函数。 在stdio.h中不再有该函数的声明(关于这点，你可以打开stdio.h文件查找验证)。  而C中对无明确返回值类型的函数，默认为int类型，题目中的main主函数也是这种情况。 解决办法： 1  这只是警告，不影响运行，保持原代码不变。 2  改用fgets函数，可以百度搜索fgets的用法。


Question: 解析文件内容

GetPrivateProfileString 和 GetPrivateProfileInt, 以及 SetPrivateProfileString

这个要怎么解决？使用文件IO函数吧

引用 4楼倦怠 的回复:msdn，百度，google 查读取ini文件嗯，谢谢

msdn，百度，google 查读取ini文件

引用 1楼user-4 的回复:意思就是让你写一个函数  传入2个参数 一个指定Section 另一个指定Key 返回对应的 Value那我懂了，那就是根据条件查找内容，是用链表做吗，能不能指点一下思路

哦，那我懂了，那就是根据条件查找内容了，那就用链表做吗？


Question: 关于C语言不通编译器运行结果不同的问题

将int改为long long int 将pow函数改为连乘

pow函数的返回值为double类型。 因为存储精度的原因，计算机中不能用 == 符号比较两个浮点数是否相等。 通常的解决方法是：当两个浮点数的差的绝对值小于一个很小的数时，认为它们相等。 代码如下： double epsilon = 0.000000001; if (abs(a - b) < epsilon)  //认为a和b相等

自己写函数肯定要好一些


Question: C语言枚举遍历问题为甚会出现下面的情况啊，求大神们解答~

引用 3 楼 hkangj 的回复:[quote=引用 2 楼 wang0635 的回复:] 你确定是在学C++？还是C语言？[/quote在学C语言的 源程序扩展名改成 .c .cpp 的是C++源程序

[quote=引用 7 楼 jianwen0529 的回复:] 修改为 int s;[/quote可以具体点吗，我不是很懂，s不是定义成了枚举变量了吗，要怎样修改为int s?

修改为 int s;

引用 5 楼 jha334201553 的回复:引用 4 楼 hkangj 的回复:[quote=引用 1 楼 jha334201553 的回复:] enum 对象 s 怎么++，编译器跟你说不能++可是这是教材的例子，书上都是这么说的，可是编译就是会出错，不理解 编译器不一样，有些有强校验[/quote]那应该怎么处理这个问题，我用的是cfree5

引用 4 楼 hkangj 的回复:引用 1 楼 jha334201553 的回复:enum 对象 s 怎么++，编译器跟你说不能++可是这是教材的例子，书上都是这么说的，可是编译就是会出错，不理解 编译器不一样，有些有强校验

你确定是在学C++？还是C语言？

enum 对象 s 怎么++，编译器跟你说不能++

引用 10 楼 user-4 的回复:枚举, 实际上跟c的宏是差不多的东西.  但比宏要高级一点. 用int更好一点, 但前提是你的 枚举值是自增+1的.  在你的程序中, 已经明显提示你了, 不能用后缀的++, 要使用前缀的++  所以for这里修改成这样  for(s=man; s<=woman; ++s) { // }修改了之后还是发现还是出现问题，可能是我的拓展名搞错了，在c++的枚举里面是没有定义++的运算符的所以才出错，经楼上的大佬提醒我修改回.c发现可以成功运行了

引用 9 楼 wang0635 的回复:[quote=引用 3 楼 hkangj 的回复:] [quote=引用 2 楼 wang0635 的回复:] 你确定是在学C++？还是C语言？[/quote在学C语言的 源程序扩展名改成 .c .cpp 的是C++源程序[/quote]可能是我搞混了c和c++的拓展名了，修改了之后就可以运行了，谢谢大佬帮助


Question: 写一个删除多个空格个函数

程序里面, p的下标应该是 j  ,  即p[j]=s[i];

因为在你的程序中, 目标字符串p的下标是跟源字符串s的下标同步增长时, 如果s有连续空格, 则p的对应于这些连续空格的下标的字符没有赋值.  void del(char s[],char p[]) {     int i = 0, j= 0, state = 0;//state:状态,表面上一个字符是不是空格      while(s[i]!='\0')     {             if(s[i]==' ')//如果此字符是空格             {                 if(state ==0)//如果state是0,说明上一个字符不是空格,从而不是连续空格,可以向p的字符赋值                 {                     state = 1;//将state设为1,表示上一个字符是空格                     p[i]=s[i];                         ++j;//p的下标递增1                 }                  else{ //如果state不是0,说明上一个字符是空格,从而是连续空格,不可以向p的字符赋值,即不做任何操作                 }             }             else//如果此字符不是空格,则可以向p的字符赋值             {                 state = 0;//则将state设为0                 p[i]=s[i];                 ++j;//p的下标递增1             }             ++i;//s的下标递增1     } }


Question: c语言写串口数据0a变成0d 0a问题

引用 7 楼 jha334201553 的回复:PC端看见数据0a变成0d0a，这个怎么看见的？用串口调试工具？还是自己处理了，相信POS数据是正确的，是PC处理问题 出现超时现象再使用串口调试工具。出现超时现象代码goto回去再写入数据，只要超时就会一直循环。没出现超时现象POS与PC调试发送相同的数据就没有多出来0D

引用 5 楼 jha334201553 的回复:打开串口是怎么打开的，打开以后数据接收到你从哪里看到数据0A变成0D0A的（是写了日志吗）？ POS与PC直接相连，发送的数据与PC上调试工具收到的数据是一致的。

引用 5 楼 jha334201553 的回复:打开串口是怎么打开的，打开以后数据接收到你从哪里看到数据0A变成0D0A的（是写了日志吗）？ 调用NDK：int PortOpen(EM_PORT_NUM emPort, const char *pszAttr); /**  *@brief	关闭串口  *@param	emPort	指定的串口  *@return  *@li	NDK_OK				操作成功  *@li	其它EM_NDK_ERR		操作失败 硬件那边按照我们的要求做了块板子，POS终端与板子通过串口通信(压力测试)。POS写串口数据之后，每次读串口数据超时了，便把POS与PC相连接在PC端看见数据0a变成0d0a，而在POS上显示的发送数据还是0a...

引用 1 楼 jha334201553 的回复:又碰到一个，是C函数库问题，你用fopen，open等函数的之后指定b、_O_BINARY 操作不就没事了 我是做应用层的，写串口数据之后然后就读串口数据了。“你用fopen，open等函数的之后指定b、_O_BINARY 操作不就没事了”这个能麻烦解释一下吗？如何操作。我这现象是偶尔出现。求指教~~~

\n  在windows上变成  \r\n ， 在Linux下还是 \n ,在macOS 上编程 \r   写错了

\n  在windows上变成  \r\n ， 在Linux下还是 \r ,在macOS 上编程 \n  因为C语言只是说\n是换行，并没有说\n一定是 0A，然后不同系统对换行概念定义不一致

推荐使用portmon软件辅助调试串口通讯程序。

他山之石，可以攻玉。

串口读写问题跟fopen，open有关系吗？？  POS和PC通信的时候，开个串口监控软件，监控一下就可以看到到底是哪边出的问题。  如果监控软件看到POS上发的数据是对的，那就是PC出现的问题。 如果监控软件看到POS上发的数据是不对的，那就是POS出现的问题。

引用 10 楼 zhao4zhong1 的回复:不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了我是应用层的，底层的东西我也看不到。而且这套NDK用了好多年了，应该不会犯这种错误的吧。我的源码已贴出，凭着经验能看出问题来？还是说着就是底层的问题？


Question: c语言如何使窗口大小固定不可改变

不一定对，仅供参考： SetWindowLong(hWnd,GWL_STYLE,GetWindowLong(hWnd)&~WS_SIZEBOX);

这例子是改变cmd窗口，用了GetConsoleWindow函数。 通常用FindWindow函数  nHwnd = FindWindow ("NotePAD", ""); //找到记事本窗口 具体可查询： https://msdn.microsoft.com/en-us/library/windows/desktop/ms633499(v=vs.85).aspx  如何知道窗口类的名称呢？ 在visual studio 的 Tools菜单下有一项：Spy++。运行这个工具，打开其Search菜单，把Finder Tool图标拖到记事本标题栏上。 就可以得到窗口类信息。如下图：

以前写的(测试通过)，希望有帮助： #include <Windows.h>   int main() {     printf("hello\n");     HWND hWnd = GetConsoleWindow(); //获得cmd窗口句柄     RECT rc;     GetWindowRect(hWnd, &rc); //获得cmd窗口对应矩形       //改变cmd窗口风格     SetWindowLongPtr(hWnd,          GWL_STYLE, GetWindowLong(hWnd, GWL_STYLE) & ~WS_THICKFRAME & ~WS_MAXIMIZEBOX & ~WS_MINIMIZEBOX);     //因为风格涉及到边框改变，必须调用SetWindowPos，否则无效果     SetWindowPos(hWnd,         NULL,         rc.left,         rc.top,         rc.right - rc.left, rc.bottom - rc.top,         NULL);       return 0; } 如果对您有帮助，请采纳答案好吗，谢谢！


Question: 求大神帮个忙

for (int i = 0; i < FILE_header->NumberOfSections;SECTION_header =SECTION_header+i)  这里的"SECTION_header =SECTION_header+i"应是"SECTION_header =SECTION_header+1"吧


Question: 请教在C语言中，如何将struct存入在一个void* 空类型里

pcb b1={....}; node->item=&b1;

//-------------------------------     //现在需要在此处将新创建的proc 存入nd_arr的void* item中     // 但用nd_arr[0].item = &proc;      // 当用nd_arr[0].item->p_id   在这里会报错   此处主要是类型转换，void* 指针先指向proc结构体，此时不能直接使用nd_arr[0].item->p_id，因为item是void*的，而p_id是结构体的变量，不能访问，需要转换回来才可以访问。 改成这样试一下： pcb *ptmp = (pcb *)nd_arr[0].item; 此时使用ptmp->p_id就不会报错了。

//只要void*p所指向的内存已经分配且其大小装得下struct s： *(struct *)p=s;


Question: opencv里面我想将mat里面的数据变成复数

为什么要直接将mat的数据类型改为复数呢 用mat存储要存储的复数的实部和虚部，计算时按复数运算规则不就行了？望楼主采纳

using CPX = cv::Complex<double> ;  int main () { 	const auto r1x = std::vector<CPX> {CPX {1 ,1} ,CPX {2 ,1} ,CPX {3 ,2} ,CPX {4 ,2}} ; 	auto rbx = cv::Mat (r1x ,true) ; 	CPX item2 = rbx.at<CPX> (2) ; 	return 0 ; }

Mat不支持复数元素类型。


Question: 定义一个时间函数，如何在main函数中判断是否到02:00

引用 6 楼 jianwen0529 的回复:[quote=引用 5 楼 jianwen0529 的回复:] [quote=引用 4 楼 m0_38117705 的回复:] 背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了  到达或第一次超过指定时间执行一次然后退出循环，怎么会多次执行？[/quote] break;这个关键字总应该知道什么作用的[/quote] 是这样子的，这个监听进程也是在一个while循环中，每十秒循环一次，我怕影响到别的事情，我照着这位大手子的改了改，已经可以正常使用了，谢谢您

引用背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了  主程序中当过了2点，就不再调用check_time函数，应该不会执行几次。  while (1)     {         if (check_time() == 1) //超过2点退出循环         {             printf("当前时间已经超过02点\n");             //执行你想要执行的语句             break;         }     }     return 0;

引用 5 楼 jianwen0529 的回复:[quote=引用 4 楼 m0_38117705 的回复:] 背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了  到达或第一次超过指定时间执行一次然后退出循环，怎么会多次执行？[/quote] break;这个关键字总应该知道什么作用的

引用 4 楼 m0_38117705 的回复:背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了  到达或第一次超过指定时间执行一次然后退出循环，怎么会多次执行？

引用 2 楼 fight_in_dl 的回复:代码如下，关键处有注释： int check_time(void) { 	int day,hour, second; 	struct tm *ptr; 	time_t it;  	it = time(NULL); 	ptr = localtime(&it); 	hour = ptr->tm_hour; 	second = ptr->tm_sec;  	if (hour - 2 >= 0 && second>0) //02:00:01即认为已经过02点 	{ 		return 1; 	} 	else 	{ 		return 0; 	} }   int main() { 	while (1) 	{ 		if (check_time() == 1) //超过2点退出循环 		{ 			printf("当前时间已经超过02点\n"); 			break; 		} 	} 	return 0; } 背景是这样的，这个打算加在一个监听进程中，这个监听进程每10秒就会循环一次，想每天在2点执行一条指令，所以我觉得11行有必要加入一个分的判断吧，不然这样的话每天就会执行好几次那句指令了

#include <windows.h> //...     while (1)     {         if (check_time() == 1) //超过2点退出循环         {             printf("当前时间已经超过02点\n");             break;         }          Sleep(60000);     }     return 0;

谢谢大手子，感激不尽


Question: 帮忙看一下错在哪里呗~谢谢！

最好自己先反复调试

fprintf(fp,"\n%s %c %.1f",p->name,p->sex,p->score); 应改为      fprintf(fp,"%s,%c,%.1f\n",p->name,p->sex,p->score);

请判断fscanf函数的返回值。

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


Question: 大家帮帮忙！VS2010 提示stream != NULL ,不知道哪里出错了

引用 3 楼 a24027 的回复:[quote=引用 2 楼 a24027 的回复:] 你好,我改过了,这个问题没有了,但是读取文件之后为什么不显示呢 引用 1 楼 zjq9931 的回复: if (pfData=NULL)  应当是：  if (pfData==NULL)   你好,这个我改过了,但是fread之后为什么不显示文件内容呢[/quote] 你这个代码里面根本就没有显示内容的代码啊。 直接就free掉了啊。 如果要显示的话用这个吧：puts(buffer); 提醒一下哈，你这个打开的是mp4文件，有可能显示一堆乱码，还有就是，上面那个函数遇到0会结束，由于mp4是二进制文件，里面有很多的0，所以，内容只是显示一部分哈。

fclose前加一句HexDump(buffer, lSize,0); void HexDump(char *buf,int len,int addr) {     int i,j,k;     char binstr[80];      for (i=0;i<len;i++) {         if (0==(i%16)) {             sprintf(binstr,"%08x -",i+addr);             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         } else if (15==(i%16)) {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);             sprintf(binstr,"%s  ",binstr);             for (j=i-15;j<=i;j++) {                 sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');             }             printf("%s\n",binstr);         } else {             sprintf(binstr,"%s %02x",binstr,(unsigned char)buf[i]);         }     }     if (0!=(i%16)) {         k=16-(i%16);         for (j=0;j<k;j++) {             sprintf(binstr,"%s   ",binstr);         }         sprintf(binstr,"%s  ",binstr);         k=16-k;         for (j=i-k;j<i;j++) {             sprintf(binstr,"%s%c",binstr,('!'<buf[j]&&buf[j]<='~')?buf[j]:'.');         }         printf("%s\n",binstr);     } }

引用 2 楼 a24027 的回复:你好,我改过了,这个问题没有了,但是读取文件之后为什么不显示呢  引用 1 楼 zjq9931 的回复: if (pfData=NULL)  应当是：  if (pfData==NULL)   你好,这个我改过了,但是fread之后为什么不显示文件内容呢

你好,我改过了,这个问题没有了,但是读取文件之后为什么不显示呢

if (pfData=NULL)  应当是：  if (pfData==NULL)


Question: shell脚本命令错误后继续执行

if cd$somepath > /dev/null 2>&1; then    echo "error" fi

可以换个思路，先判断目录是否存在， 如果存在，再调用cd命令。 如果不存在，不处理或者给出提示信息。


Question: 有关C语言中字符串模糊化的问题及思考

仅供参考：#include <stdio.h> #include <string.h> char s[256]; char *p; int r,n,i; int main() {     while (1) {         printf("请输入一行文字(空行结束),\"%%20\"将替换为\" \",\"你懂得\"将替换为\"XXXXXX\":\n");         fgets(s,256,stdin);         if ('\n'==s[0]) break;         p=s;         while (1) {             p=strstr(p,"%20");             if (p) {                 memmove(p+1,p+3,strlen(p)-3+1);                 p[0]=' ';             } else break;         }         p=s;         while (1) {             p=strstr(p,"你懂得");             if (p) {                 memmove(p+6,p+6,strlen(p)-6+1);                 for (i=0;i<6;i++) p[i]='X';             } else break;         }         printf("%s",s);     }     return 0; } //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //abcdefg%20helloworld%20something.pdf //abcdefg helloworld something.pdf //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //这是测试文字你懂得，在这个你懂的地方，就得做你懂得的事 //这是测试文字XXXXX，在这个你懂的地方，就得做XXXXX的事 //请输入一行文字(空行结束),"%20"将替换为" ","你懂得"将替换为"XXXXXX": //

你举的例子都含混不清，什么叫"后两位不转换"？这个""位"是什么意思在ANSI字符串中，一个英文字母占1个字节，而一个汉字占两个字节，中英文混输后果不堪设想，建议你先了解C语言中的字符串，以及你可能需要的UNICODE(宽字符)字符串


Question: 关于for循环中的if条件满足时该怎么退出整个循环

我明白了= = #include<stdio.h> void main() { 	int i,j,a[5][7],flag=0; 	for(i=0;i<=4;i++) 	{ 		for(j=0;j<=6;j++) 			scanf("%d",&a[i][j]); 	} 	for(i=0;i<=4;i++) 	{ 		for(j=0;j<=6;j++) 		{ 			if(a[i][j]<0) 			{ 				flag=1; 				printf("查找到的数为%d\n",a[i][j]); 				break; 			} 		} 		if(flag==1) 			break; 	} }


Question: 求大神帮忙

百度搜相关关键字。

引用 1 楼 赵4老师的回复:百度搜相关关键字。 百度上面搜不出来，没有


Question: 我写的CCF的编程，只有10分，想问下如何改代码呢，改成100分，还写了其他几个问题，在编译器上都能运行，但都是0分

结果好像都是错的吧

百度搜相关关键字。

谢谢，我看了你编的代码，对我很有用，我的代码里面没有构造函数，这些我还不是很熟练所以不敢写在里面，构造函数的时候，我还对形参和实参不知道怎么弄

#include<stdio.h>  #define MAX 1000  void bubble_sort(int *arr, int len); int distribute_cake(int *arr, int len, int key_val); void print_cake(int *arr, int len);  int main() {     int a[MAX], i;     int n, k, count;      scanf("%d",&n);      if(n!=0){         scanf("%d",&k);     }     if(n == 0)         return 0;      for(i=0;i<n;i++)         scanf("%d",a+i);      bubble_sort(a, n);     //print_cake(a, n);     count = distribute_cake(a, n, k);      printf("%d\n",count);      return 0; }  void print_cake(int *arr, int len) {     int i;      for (i = 0; i < len; i++)         printf("%d\t", arr[i]);     putchar(10);  }  int distribute_cake(int *arr, int len, int key_val) {     int i, weight = 0, cnt = 0;     for (i = 0; i < len; i++) {         weight += arr[i];         if (weight >= key_val) {             printf("weight = %d\n", weight);             weight = 0;             cnt++;         }     }     if(weight > 0)         cnt++;      return cnt; }   void bubble_sort(int *arr, int len) {     int i, j;      int tmp;     for (i = 0; i < len; i++)         for (j = 0; j < len - 1 -i; j++)             if (arr[j] > arr[j+1]) {                 tmp = arr[j];                 arr[j] = arr[j+1];                 arr[j+1] = tmp;             } } 题目中有一点，就是将最小的发出去。每次都是将剩下的最小的发出去。那么，就要对输入的数据进行一个排序； 上面的程序作为一个参考吧


Question: visual studio 2017,threads.h, thrd_sleep无效

请问你include <thr/threads.h>，这个文件是在哪个目录下，我遇到VS2017下include <thr/threads.h>报找不到文件。

《Windows核心编程》

首先，感谢 @赵4老师 的回答,让我意识到我对线程睡眠的理解可能错误。  进一步查询资料，参考http://blog.csdn.net/horstlinux/article/details/7911457文章后，我意识到对函数参数理解错误, int thrd_sleep(const struct timespec *duration, struct timespec *remaining); 按上面的文章使用timespec_get函数,获取当前时间后,再加上睡眠的秒数,测试成功. int timespec_get(struct timespec *ts, int base); 更改后的函数如下: int func(char * msg2) { 	struct timespec ts; 	struct timespec te;  	timespec_get(&ts,TIME_UTC); 	te.tv_sec = ts.tv_sec + 3;  	thrd_sleep(&te,NULL); 	printf("%s\n", msg2); 	return 0; }


Question: vs中的一个报错信息，类别为：错误（活动）

VS2015+Windows10 64位调试没问题，只要将scanf改为scanf_s，将getchar改为_getchar即可

#include <stdio.h>   struct y_m_d {     int year;     int month;     int day; }date903;  int months[12] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};  int days903(struct y_m_d date1);  int main() {     printf("input year,month,day:");     scanf("%d,%d,%d", &date903.year, &date903.month, &date903.day);     printf("%d/%d is the %ith day in %d.\n", date903.month, date903.day, days903(date903), date903.year);     getchar();      return 0; }  int days903(struct y_m_d date1) {     int sum = 0, i;      for (i = 0; i < date1.month - 1; i++)         sum += months[i];     sum += date1.day;      if (((date1.year % 4 == 0 && date1.year % 100 != 0)         || date1.year % 400 == 0) && date1.month >= 3)         sum += 1;      return sum; } 改一下你的代码；

#include <stdio.h>   struct y_m_d {     int year;     int month;     int day; }date903;  int days903(struct y_m_d date1);  int main() {     printf("input year,month,day:");     scanf("%d,%d,%d", &date903.year, &date903.month, &date903.day);     printf("%d/%d is the %ith day in %d.\n", date903.month, date903.day, days903(date903), date903.year);     getchar();      return 0; }  int days903(struct y_m_d date1) {     int sum;     switch (date1.month)     {         case 1:             sum = date1.day;             break;         case 2:             sum = date1.day + 31;             break;         case 3:             sum = date1.day + 59;             break;         case 4:             sum = date1.day + 90;             break;         case 5:             sum = date1.day + 120;             break;         case 6:             sum = date1.day + 151;             break;         case 7:             sum = date1.day + 181;             break;         case 8:             sum = date1.day + 212;             break;         case 9:             sum = date1.day + 243;             break;         case 10:             sum = date1.day + 273;             break;         case 11:             sum = date1.day + 304;             break;         case 12:             sum = date1.day + 334;             break;     }     if (((date1.year % 4 == 0 && date1.year % 100 != 0) || date1.year % 400 == 0) && date1.month >= 3)         sum += 1;     return sum; } 代码没问题，  if (((date1.year % 4 == 0 && date1.year % 100 != 0) || date1.year % 400 == 0) && date1.month >= 3) 这条语句注意要多加上一对括号～

struct y_m_d { 	int year; 	int month; 	int day; }date903;  int main() { 	int days903(struct y_m_d date1); 	printf("input year,month,day:"); 	scanf("%d,%d,%d", &date903.year, &date903.month, &date903.day); 	printf("%d/%d is the %ith day in %d.\n", date903.month, date903.day, days903(date903), date903.year); 	getch();  	return 0; }  int days903(struct y_m_d date1) { 	int sum; 	switch (date1.month) 	{ 		case 1: 			sum = date1.day; 			break; 		case 2: 			sum = date1.day + 31; 			break; 		case 3: 			sum = date1.day + 59; 			break; 		case 4: 			sum = date1.day + 90; 			break; 		case 5: 			sum = date1.day + 120; 			break; 		case 6: 			sum = date1.day + 151; 			break; 		case 7: 			sum = date1.day + 181; 			break; 		case 8: 			sum = date1.day + 212; 			break; 		case 9: 			sum = date1.day + 243; 			break; 		case 10: 			sum = date1.day + 273; 			break; 		case 11: 			sum = date1.day + 304; 			break; 		case 12: 			sum = date1.day + 334; 			break; 	} 	if ((date1.year % 4 == 0 && date1.year % 100 != 0 || date1.year % 400 == 0) && date1.month >= 3) 		sum += 1; 	return sum; }

把你的代码贴出来，大家帮你分析一下


Question: PAT 乙级 1002 写出这个数，第四个测试点过不去

想请问一下。你这个程序运行时如果直接键入0的话会得到ling吗？

引用 1 楼 fight_in_dl 的回复:没有case 2分支。谢谢，自己找的好痛苦

引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include<string.h>  void pinyin(int n);  int main(void) {     int i=0,sum=0;     int n[3];     int j=0;     char str[100];      scanf("%s",str);      while(str[i] != '\0')         sum += str[i++] -'0';      printf("sum = %d\n", sum);     while(sum){         n[j++] = sum%10;         sum = sum/10;     }     for(j=j-1;j>=0;j--){   /*直接让j>=0即可*/         pinyin(n[j]);         printf(" ");     }     printf("\n");      return 0; }  void pinyin(int n) {     switch(n){         case 0:printf("zero");break;         case 1:printf("one");break;         case 2:printf("two");break;         case 3:printf("three");break;         case 4:printf("four");break;         case 5:printf("five");break;         case 6:printf("six");break;         case 7:printf("seven");break;         case 8:printf("eight");break;         case 9:printf("nine");break;     } }  /* void pinyin(int n) {     switch(n){         case 0:printf("ling");break;         case 1:printf("yi");break;         case 3:printf("san");break;         case 4:printf("si");break;         case 5:printf("wu");break;         case 6:printf("liu");break;         case 7:printf("qi");break;         case 8:printf("ba");break;         case 9:printf("jiu");break;     } } */ 改了一下你的代码； 能用英文则用英文，不建议使用汉语拼音写代码。这不是崇洋媚外，而是编程的常识和原则吧。 引用 2 楼 cfjtaishan 的回复:#include<stdio.h> #include<string.h>  void pinyin(int n);  int main(void) {     int i=0,sum=0;     int n[3];     int j=0;     char str[100];      scanf("%s",str);      while(str[i] != '\0')         sum += str[i++] -'0';      printf("sum = %d\n", sum);     while(sum){         n[j++] = sum%10;         sum = sum/10;     }     for(j=j-1;j>=0;j--){   /*直接让j>=0即可*/         pinyin(n[j]);         printf(" ");     }     printf("\n");      return 0; }  void pinyin(int n) {     switch(n){         case 0:printf("zero");break;         case 1:printf("one");break;         case 2:printf("two");break;         case 3:printf("three");break;         case 4:printf("four");break;         case 5:printf("five");break;         case 6:printf("six");break;         case 7:printf("seven");break;         case 8:printf("eight");break;         case 9:printf("nine");break;     } }  /* void pinyin(int n) {     switch(n){         case 0:printf("ling");break;         case 1:printf("yi");break;         case 3:printf("san");break;         case 4:printf("si");break;         case 5:printf("wu");break;         case 6:printf("liu");break;         case 7:printf("qi");break;         case 8:printf("ba");break;         case 9:printf("jiu");break;     } } */ 改了一下你的代码； 能用英文则用英文，不建议使用汉语拼音写代码。这不是崇洋媚外，而是编程的常识和原则吧。 谢谢回答，自己找怎么都找不到 用拼音是因为题目要求，需要控制输出格式

没有case 2分支。


Question: 求个问题，，，，，，

你看一下select的用法

你把这两句 selectcount+=1;     select(selectcount+1,&rfd,NULL,NULL,NULL); 改成select(socketid+1,&rfd,NULL,NULL,NULL);

WSAStartup The Windows Sockets WSAStartup function initiates use of WS2_32.DLL by a process.  int WSAStartup (   WORD wVersionRequested,     LPWSADATA lpWSAData   );   Parameters wVersionRequested  [in] The highest version of Windows Sockets support that the caller can use. The high order byte specifies the minor version (revision) number; the low-order byte specifies the major version number.  lpWSAData  [out] A pointer to the WSADATA data structure that is to receive details of the Windows Sockets implementation.  Remarks The WSAStartup function must be the first Windows Sockets function called by an application or DLL. It allows an application or DLL to specify the version of Windows Sockets required and to retrieve details of the specific Windows Sockets implementation. The application or DLL can only issue further Windows Sockets functions after a successfully calling WSAStartup.  In order to support future Windows Sockets implementations and applications that can have functionality differences from current version of Windows Sockets, a negotiation takes place in WSAStartup. The caller of WSAStartup and the WS2_32.DLL indicate to each other the highest version that they can support, and each confirms that the other's highest version is acceptable. Upon entry to WSAStartup, the WS2_32.DLL examines the version requested by the application. If this version is equal to or higher than the lowest version supported by the DLL, the call succeeds and the DLL returns in wHighVersion the highest version it supports and in wVersion the minimum of its high version and wVersionRequested. The WS2_32.DLL then assumes that the application will use wVersion. If the wVersion field of the WSADATA structure is unacceptable to the caller, it should call WSACleanup and either search for another WS2_32.DLL or fail to initialize.


Question: UNIX信号量

百度搜相关关键字。

引用 2 楼 user-2 的回复:pthread_create(&tid1,NULL,fun1,(void*)y);     pthread_create(&tid2,NULL,fun2,(void*)y);  //其实这里创建两个线程时，并不确保tid1线程先执行的。这个由系统的进程调度算法来决定。 我执行了你的程序几次，结果并不是完全一样的。  [root@localhost tmp]# ./a.out  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]# ./a.out  aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb[root@localhost tmp]#好的，蟹蟹你啊


Question: 上手一天新人敲代码时遇到的问题，求各位dalao帮助

scanf("%1f", &x);  //字母l打成数字1了 应该是： scanf("%lf", &x);  输入拼写错误，小心一些就好了。  如果对您有帮助，请采纳答案好吗，谢谢！

但我输入的是30

正确啊，sin0就是0


Question: 新手链表问题：编译通过 运行出错

#include <stdio.h> #include <stdlib.h> typedef struct LNODE {     char data;     struct LNODE* next; } LNODE;   void creatlist(); void insert(LNODE* head); void output(LNODE* head);  int main(int argc,char* argv[]) {     LNODE* head=NULL;     head=creatlist();     insert(head);     output(head);     return 0;   } LNODE* creatlist() {       //创建一个只有表头节点的链表     return (LNODE*)malloc(sizeof(LNODE)); } void insert(LNODE* head) {     LNODE* p=NULL;     p=(LNODE*)malloc(sizeof(LNODE));     p->data=getchar();     p->next=NULL;     p->next=head->next;     head->next=p; } void output(LNODE* head) {     LNODE* p=NULL;     p=head->next;     while(p!=NULL) {         putchar(p->data);         p=p->next;     } }

//head是传值进去，生成一个临时的指针，分配的内存指针将会赋值给这个临时指针而不会反应到实参中 void creatlist(LNODE* head);  改为 void creatlist(LNODE *&head); //修改head为指针的引用

创建有问题，只是改变形参指向

#include <stdio.h> #include <stdlib.h>  typedef struct NODE { 	char data; 	struct NODE *next; } NODE;  /* void creatlist(NODE **head); void insert(NODE *head); void output(NODE *head);  */  void creatlist(NODE **head)	//创建一个只有表头节点的链表 { 	if(head == NULL || *head != NULL) 	{ 		// 	}  	*head = (NODE *)malloc(sizeof(NODE)); }  void insert(NODE *head) { 	static unsigned char counter = 1;  	// gen new node. 	NODE *p = (NODE *)malloc(sizeof(NODE)); 	//p->data=getchar(); 	p->data = counter++; 	p->next = NULL;  	// get last node. 	NODE *curr = head; 	NODE *next = head->next;  	while(next != NULL) 	{ 		curr = next; 		next = curr->next; 	} 	 	curr->next = p; }  void output(NODE *head) { 	NODE *p = head; 	//NODE *p = head->next;  	while(p != NULL) 	{ 		//putchar(p->data); 		printf("node data %d\n", p->data); 	 		p = p->next; 	} }  int main(int argc, char *argv[]) { 	NODE *head = NULL;  	creatlist(&head); 	for(int i=0; i<10; i++) 	{ 		insert(head); 	} 	output(head);  	return 0; }

#include <stdio.h> #include <stdlib.h>  typedef struct LNODE{     char data;     struct LNODE* next; }LNODE;   void creatlist(LNODE **head); void insert(LNODE **head); void output(LNODE* head);  int main(int argc, char* argv[]) {     LNODE* head = NULL;     creatlist(&head);     insert(&head);     output(head);     return 0;   } void creatlist(LNODE **head) {     *head = (LNODE*)malloc(sizeof(LNODE)); }  void insert(LNODE **head) {     LNODE* p = NULL;     p = (LNODE*)malloc(sizeof(LNODE));     p->data = getchar();     p->next=NULL;     p->next = (*head)->next;     (*head)->next = p; }  void output(LNODE *head) {     LNODE* p=NULL;      p = head->next;     while(p) {         putchar(p->data);         p=p->next;     }     putchar(10); }  两种解决办法，一种就是上面的修改； 另一种就是通过返回值，即创建和每次的插入都要返回链表的头指针。

问题是在创建链表头那里的调用      LNODE* head=NULL;      creatlist(head);  //这里这样写就是把head指针变量存放的地址传进去了， 相当于createlist(NULL)    只要改成传指针变量本身的地址过去就可以了。   void creatlist(LNODE* *head); //用二级指针变量存放一级指针变量的地址        ....  int main(int argc,char* argv[]) {      LNODE* head=NULL;      creatlist(&head); //传指针变量本身的地址过去     .... }  void creatlist(LNODE* *head){       //创建一个只有表头节点的链表         *head=(LNODE*)malloc(sizeof(LNODE)); }

F10单步运行 F9断点 跟踪调试，写程序的必备技能。


Question: 求助大神 数据结构题

30的partition number只有5000多，5000*30个状态dp一下还是可以的。

百度搜相关关键字。

急！！！！！！！！！


Question: 初学C语言世界，发生了危机。。

http://blog.csdn.net/hou09tian/article/details/75042206 请多指教

http://edu.csdn.net/course/detail/2344 C语言指针与汇编内存地址-一.代码要素

StrPrint a;只有一个单元，之后Print++就会导致越界 14行：StrPrint a;改成StrPrint a[2]; 16行：Print=a;  引用 14 楼 cfjtaishan 的回复:[quote=引用 5 楼 fight_in_dl 的回复:] 越界访问内存。 int main() { 	StrPrint *Print = new StrPrint[2]; //申请了大小为2个StrPrint类型的内存空间。 	Print->PrintName = "123"; 	Print->FileName = "123132"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print++;  //现在可以对Print++指向的区域合法读写 	Print->PrintName = "456"; 	Print->FileName = "456465"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print--; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	system("pause"); 	delete[] Print; 	return 0; } 对于C语言是不支持这样对字符串赋值的，建议楼主使用strcpy或strncpy[/quote] PrintName和FileName是指针，这样的赋值在C语言是可以的；但PrintName和FileName的类型在存在风险，在C++可能会报错，主要原因字串是 const char *，因此，这两个类型需要使用const char *定义就可以了

#include "stdafx.h" #include "stdlib.h" #include "string"   typedef struct Print{     char * FileName;     char * PrintName; }StrPrint; int _tmain(int argc, _TCHAR* argv[]) {     StrPrint a[2];     StrPrint *Print;     Print=&a[0];     //Print->PrintName="123";    //Print->FileName="123132";     Print->PrintName = (char *)malloc(12);     strcpy(Print->PrintName, "123");     Print->FileName = (char *)malloc(12);     strcpy(Print->FileName, "123132");     printf("%s,%s\n",Print->PrintName,Print->FileName);     Print++;     Print->PrintName = (char *)malloc(12);     strcpy(Print->PrintName, "456");     Print->FileName = (char *)malloc(12);     strcpy(Print->FileName, "456465");     printf("%s,%s\n",Print->PrintName,Print->FileName);     Print--;     printf("%s,%s\n",Print->PrintName,Print->FileName);     system("pause");     return 0; }

引用 5 楼 fight_in_dl 的回复:越界访问内存。 int main() { 	StrPrint *Print = new StrPrint[2]; //申请了大小为2个StrPrint类型的内存空间。 	Print->PrintName = "123"; 	Print->FileName = "123132"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print++;  //现在可以对Print++指向的区域合法读写 	Print->PrintName = "456"; 	Print->FileName = "456465"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print--; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	system("pause"); 	delete[] Print; 	return 0; } 对于C语言是不支持这样对字符串赋值的，建议楼主使用strcpy或strncpy

引用 12 楼 fight_in_dl 的回复:引用那为什么输出的时候直接输出地址就可以得到里面的值呢？   因为用的是%s格式字符串，对应参数必须是字符串首字符的地址，以输出整个字符串。  类似问题，手头要有本C语言的书就好了。 // test2.cpp : 定义控制台应用程序的入口点。 //  #include "stdafx.h" #include "stdlib.h" #include "string"  typedef struct Print{ 	char * FileName; 	char * PrintName; }StrPrint; int _tmain(int argc, _TCHAR* argv[]) { 	StrPrint *Print; 	Print=(StrPrint *)malloc(sizeof(struct Print)); 	Print->PrintName="123"; 	Print->FileName="123132"; 	scanf("%s",Print->FileName); 	printf("%s,%s\n",Print->PrintName,Print->FileName); 	Print++; 	Print->PrintName="456"; 	Print->FileName="456465"; 	printf("%s,%s\n",Print->PrintName,Print->FileName); 	Print--; 	printf("%s,%s\n",Print->PrintName,Print->FileName); 	system("pause"); 	return 0; }   我的代码是这样的，可以帮我看看是什么原因吗？最好是修正一下，我好能够看懂。。谢谢！

引用 9 楼 fight_in_dl 的回复:scanf("%s",&Print->FileName)  应该是：  scanf("%s",Print->FileName)  //FileName为指针变量，其值是地址，不用再加& 那为什么输出的时候直接输出地址就可以得到里面的值呢？

同意楼上各位所说的。 Stack around the variable 'a' was corrupted.的意思是变量“a”周围的栈被破坏。 如图1所示  Print的内容即a的地址是0x00BDF740，0x00BDF740~0x00BDF747之间的栈是可用的 而Print++的值是0x00BDF748，0x00BDF748~0x00BDF74E之间的栈是不可用的，但是在程序中进行了赋值，所以会说“a”周围的栈被破坏了。 图2是图1中四个值对应的字符串  程序改为如下：  StrPrint a[2];     StrPrint *Print;  Print=a;

引用 5 楼 fight_in_dl 的回复:越界访问内存。 int main() { 	StrPrint *Print = new StrPrint[2]; //申请了大小为2个StrPrint类型的内存空间。 	Print->PrintName = "123"; 	Print->FileName = "123132"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print++;  //现在可以对Print++指向的区域合法读写 	Print->PrintName = "456"; 	Print->FileName = "456465"; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	Print--; 	printf("%s,%s\n", Print->PrintName, Print->FileName); 	system("pause"); 	delete[] Print; 	return 0; } 我把输入改成了这样，为什么执行不了，会报错 scanf("%s",&Print->FileName)

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

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

引用 2 楼 user-6 的回复:malloc分配内存或改成数组，不能直接把字符串赋给char* 我把输入改成了 scanf("%s",&Print->FileName); 就会报这种错误。 test2.exe 中的 0x565414cf (msvcr100d.dll) 处有未经处理的异常: 0xC0000005: 读取位置 0x00333132 时发生访问冲突

malloc分配内存或改成数组，不能直接把字符串赋给char*

Run-Time Check Failure #2 - Stack around the variable 'a' was corrupted. 运行结束后会弹出这个对话框。。。


Question: 链表信息怎么输入文件

两种思路： ①next不写入文件，仅将数据按next顺序写入文件。读取时重建next ②next写入文件时，翻译为文件偏移量。读取时按照文件中的偏移量随机读取每个数据。 以楼主的程度，选择①

引用 5 楼 cfjtaishan 的回复:写文件是二进制的，打开文件时，自然是乱码；若是用fscanf/fprintf读写文件，打开就不应该是乱码了。 楼主你的逻辑有问题呢，首先，开户的时候已经将用户信息写到文件里，并且开户信息已经在内存里了，head头节点。为什么还要在登录的函数里再从文件里读呢。head链表已经有用户的开户信息了。操作重复了，建议开户只是向文件里写，不创建链表，登录从文件里读。 正常的逻辑是，开户写文件和创建链表（或插入节点），登录用开户创建的链表进行比较。当程序再次启动时，建立一个函数专门是从文件里读用户的开户信息，创建链表。这个链表头传给登录操作，用于匹配用户信息。 那next怎么写入文件呢，对链表不是特别熟，能教教我吗

那next怎么写入文件呢，对链表不是特别熟，能教教我吗

我把开户文件改了一下，数据存入没问题了，但后面文件完全不能运行了 void kaihu(struct per *head)//开户函数  { 	head=NULL; 	FILE *fp;   //定义文件指针 	struct per *p1=NULL,*p2=NULL;   //p1,p2为定义链表指针 	p1=(struct per*)malloc(sizeof(struct per));  //开辟内存单元 	      printf("请输入您的姓名：\n");  //请数据输入链表中 		  scanf("%s",p1->name); 		  printf("请设置您的卡号：\n"); 		  scanf("%s",p1->ID); 		  printf("请设置您银行卡密码：\n");  		  scanf("%s",p1->code); 		  p1->money=0; 		  p1->next=NULL; 		  printf("您的个人信息为"); 		     printf("姓名：%s \n卡号：%s \n余额：%d\n",p1->name,p1->ID,p1->money); 		     if(NULL==head)           //为新用户开辟内存单元 		  { 			  head=(struct per *)malloc(sizeof(struct per)); 			  head->next=p1;    //进行头插法，将其作为第一个节点 		  } 		  else    //为新增客户开辟内存单元 		  { 			  for(p2=head;p2->next!=NULL;p2=p2->next); //进行尾插 			  p2->next=p1; 		  } 		  if((fp=fopen("infor.txt","w+"))==NULL) //为读写打开一个文本文件 		  { 			  printf("cannot open file\n"); 			  return; 		  } 		  fprintf(fp,"%s %s %d %s %d",p1->name,p1->ID,p1->money,p1->code,p1->next);  		      fclose(fp); 			  printf("\n"); 			  printf("恭喜您开户成功，请登录\n"); 			  system("pause"); 			  system("cls"); 			  denglu(head); } 怎么肥四啊

对电脑而言没有乱码，只有二进制字节；对人脑才有乱码。

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

next的值在内存中是内存地址，在文件中是文件偏移量。


引用 2 楼 FancyMouse 的回复:if ((f.x == f.y&&f.z == 0) || (f.x == f.z&&f.y == 0)) 第三种情况呢 s=m+n，你要是m和n各裝一半，那就是s 1/2s 1/2s，那结果还是一步到1/2s 1/2s 0，第三种情况根本就不存在

样例输入输出正确，并不一定能够通过。 样例的输入只是一种情形，程序应该考虑到其它可能的情况。


Question: mingw32-make编译curl的时候出现no rule to make target 'mingw32-ssl-zlib'

检查一下makefile。 如果有类似 xxx,mingw32-ssl-zlib,xxx 的地方，去掉逗号。

建议改在Windows下的虚拟机（比如Hyper-V、VMWarw、VirtualBox、……）中的Linux下编译。


Question: 哪位大神可以帮忙看看为什么读取1位bmp图片出现乱图，用的c++和opengl

引用 7 楼 limtyty 的回复:谢谢赵老师~ 应该顺带谢谢李彦宏。

谢谢赵老师~

引用 5 楼 zhao4zhong1 的回复:[quote=引用 4 楼 limtyty 的回复:] [quote=引用 3 楼 zhao4zhong1 的回复:] 用PS手动生成一幅1位bmp试试？ zhao4zhong1老师您好，以前经常看您给别的网友回复的帖子，深受启发，非常感谢您能回帖~ 我隐约觉得是glDrawPixels的格式不支持1bit 数据的关系[/quote] 百度搜“glDrawPixels的格式不支持单色位图” [/quote] 额，好吧，以后用图的时候还是先转24位咯

引用 4 楼 limtyty 的回复:[quote=引用 3 楼 zhao4zhong1 的回复:] 用PS手动生成一幅1位bmp试试？ zhao4zhong1老师您好，以前经常看您给别的网友回复的帖子，深受启发，非常感谢您能回帖~ 我隐约觉得是glDrawPixels的格式不支持1bit 数据的关系[/quote] 百度搜“glDrawPixels的格式不支持单色位图”

引用 3 楼 zhao4zhong1 的回复:用PS手动生成一幅1位bmp试试？ zhao4zhong1老师您好，以前经常看您给别的网友回复的帖子，深受启发，非常感谢您能回帖~ 我隐约觉得是glDrawPixels的格式不支持1bit 数据的关系

用PS手动生成一幅1位bmp试试？

引用 1 楼 user-2 的回复:BMP文件头（14字节），位图信息头（40字节），定义如下： typedef struct tagBITMAPFILEHEADER {     WORD bfType;//位图文件的类型，必须为BM(1-2字节）     DWORD bfSize;//位图文件的大小，以字节为单位（3-6字节，低位在前）     WORD bfReserved1;//位图文件保留字，必须为0(7-8字节）     WORD bfReserved2;//位图文件保留字，必须为0(9-10字节）     DWORD bfOffBits;//位图数据的起始位置，以相对于位图（11-14字节，低位在前）     //文件头的偏移量表示，以字节为单位 }BITMAPFILEHEADER;   typedef struct tagBITMAPINFOHEADER{ DWORD biSize;//本结构所占用字节数（15-18字节） LONG biWidth;//位图的宽度，以像素为单位（19-22字节） LONG biHeight;//位图的高度，以像素为单位（23-26字节） WORD biPlanes;//目标设备的级别，必须为1(27-28字节） WORD biBitCount;//每个像素所需的位数，必须是1（双色），（29-30字节） //4(16色），8(256色）16(高彩色)或24（真彩色）之一 DWORD biCompression;//位图压缩类型，必须是0（不压缩），（31-34字节） //1(BI_RLE8压缩类型）或2(BI_RLE4压缩类型）之一 DWORD biSizeImage;//位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节)，以字节为单位（35-38字节） LONG biXPelsPerMeter;//位图水平分辨率，每米像素数（39-42字节） LONG biYPelsPerMeter;//位图垂直分辨率，每米像素数（43-46字节) DWORD biClrUsed;//位图实际使用的颜色表中的颜色数（47-50字节） DWORD biClrImportant;//位图显示过程中重要的颜色数（51-54字节） }BITMAPINFOHEADER;  你的代码中只偏移0x12（14个字节） fseek(fp, 0x0012, SEEK_SET);//跳过bmp文件头和信息头的大小信息，指针fp指向信息头文件中的宽度数据处。  第40行，写了跳过调色板之前的信息，之后读取图片数据呀    fseek(fp, 62, SEEK_SET);  fread(pixeldata, picutredata, 1, fp);


Question: switch case使用风格建议

前面说的都挺好

引用 9 楼 adusuccessfully 的回复:[quote=引用 4 楼 antuicang9886 的回复:] [quote=引用 1 楼 adusuccessfully 的回复:] 楼主贴的这段代码在前两个case中都没有对应的break语句： 若第一个case条件满足，则第一个case执行完，会继续执行第二个case，第三个case。   如果第一个case条件不满足，第二个case条件满足，程序会执行第二第三个case，这样容易造成程序混乱。  具体举例如下：  # include <stdio.h> int main(void) { 	int i = 1; 	switch(i) 	{ 		case 1: 			printf("%d",i); 		case 2: 			printf("%d",i+1); 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }  上面程序i=1，第一个case条件满足，执行结果会输出：123 但如果每个case都加上break：  # include <stdio.h> int main(void) { 	int i = 1;  	switch(i) 	{ 		case 1: 			printf("%d",i); 			break; 		case 2: 			printf("%d",i+1); 			break; 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }   执行结果只会输出：1  嘛，这个我也了解会输出123，在实际项目中，会出现下面的情况：  case 1： case 2：do somethingA();  break; case 3:   case 4:   do somethingB();   break;  按照《代码大全》的建议，应该是写成： case 1：do somethingA();  break; case 2：do somethingA();  break; case 3:  do somethingB();   break; case 4:  do somethingB();   break;  我的疑问其实更像是这类型问题，使用后者有什么更好的地方，甚至在组内讨论时，大家会前者更好，因为既然case1 与case 2做的事情一样，那么直接让它“穿越”还更省事，少写一些代码。 [/quote]  如果case1 2这两个条件做的事情相同，个人觉得放在一起会更好，case3 4的条件相同，也就放在一起。在实际的开发中，会常遇到这样的问题。[/quote] 同感, 因为是要做一样的事, 如果分开break的话在意义上就不同了, 就代表只是刚好用了一样的函数, 允许有不同的逻辑修改. 连着就代表一定是做一样的行为, 修改逻辑需慎重.

引用 4 楼 antuicang9886 的回复:[quote=引用 1 楼 adusuccessfully 的回复:] 楼主贴的这段代码在前两个case中都没有对应的break语句： 若第一个case条件满足，则第一个case执行完，会继续执行第二个case，第三个case。   如果第一个case条件不满足，第二个case条件满足，程序会执行第二第三个case，这样容易造成程序混乱。  具体举例如下：  # include <stdio.h> int main(void) { 	int i = 1; 	switch(i) 	{ 		case 1: 			printf("%d",i); 		case 2: 			printf("%d",i+1); 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }  上面程序i=1，第一个case条件满足，执行结果会输出：123 但如果每个case都加上break：  # include <stdio.h> int main(void) { 	int i = 1;  	switch(i) 	{ 		case 1: 			printf("%d",i); 			break; 		case 2: 			printf("%d",i+1); 			break; 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }   执行结果只会输出：1  嘛，这个我也了解会输出123，在实际项目中，会出现下面的情况：  case 1： case 2：do somethingA();  break; case 3:   case 4:   do somethingB();   break;  按照《代码大全》的建议，应该是写成： case 1：do somethingA();  break; case 2：do somethingA();  break; case 3:  do somethingB();   break; case 4:  do somethingB();   break;  我的疑问其实更像是这类型问题，使用后者有什么更好的地方，甚至在组内讨论时，大家会前者更好，因为既然case1 与case 2做的事情一样，那么直接让它“穿越”还更省事，少写一些代码。 [/quote]  如果case1 2这两个条件做的事情相同，个人觉得放在一起会更好，case3 4的条件相同，也就放在一起。在实际的开发中，会常遇到这样的问题。

回到题目，如果某个时候想在case1分支后添加语句，如下这种写法 容易 忘掉 break，容易发生不想要的穿越 case 1：added codes; case 2：do somethingA();  break;  当然，也许有人会说，写的时候注意一下不就好了。 但毕竟人不是机器，会有疏忽的时候，按照代码大全的建议在这行有注释的话， 就会提醒修改代码的人，这行分支是什么目的，需不需要穿越。

再举个例子，if分支下如果只有一行，也可以不用括号：  if ( a  == 5)    a = a+4;  但仍然建议加上括号，万一以后在printf（“a=5”）;后面再增加语句，就容易出错。  if ( a  == 5)    a = a+4;    a = a+8; //此行不属于if分支，可能和本来的意思不符合，容易出错。  如果有括号就能避免： if ( a  == 5)   ｛ a = a+4;        a = a+8; ｝  规范化的代码可维护性，可读性都会更好。

按照代码大全的建议，以下写法也可以，但要在穿越分支需要给出明确的注释 case 1： //此行要给出明确的注释 case 2：do somethingA();  break; case 3:  //此行要给出明确的注释 case 4:   do somethingB();   break;  穿越代码在 修改 时可能会发生错误。建议的目的是提高可维护性。

引用 1 楼 adusuccessfully 的回复:楼主贴的这段代码在前两个case中都没有对应的break语句： 若第一个case条件满足，则第一个case执行完，会继续执行第二个case，第三个case。   如果第一个case条件不满足，第二个case条件满足，程序会执行第二第三个case，这样容易造成程序混乱。  具体举例如下：  # include <stdio.h> int main(void) { 	int i = 1; 	switch(i) 	{ 		case 1: 			printf("%d",i); 		case 2: 			printf("%d",i+1); 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }  上面程序i=1，第一个case条件满足，执行结果会输出：123 但如果每个case都加上break：  # include <stdio.h> int main(void) { 	int i = 1;  	switch(i) 	{ 		case 1: 			printf("%d",i); 			break; 		case 2: 			printf("%d",i+1); 			break; 		case 3: 			printf("%d",i+2); 			break; 		default: 			printf("%d",i+10); 			break; 	} }   执行结果只会输出：1  嘛，这个我也了解会输出123，在实际项目中，会出现下面的情况：  case 1： case 2：do somethingA();  break; case 3:   case 4:   do somethingB();   break;  按照《代码大全》的建议，应该是写成： case 1：do somethingA();  break; case 2：do somethingA();  break; case 3:  do somethingB();   break; case 4:  do somethingB();   break;  我的疑问其实更像是这类型问题，使用后者有什么更好的地方，甚至在组内讨论时，大家会前者更好，因为既然case1 与case 2做的事情一样，那么直接让它“穿越”还更省事，少写一些代码。

解释得挺好。

希望楼主不吝赏分啊，多谢多谢！


Question: c语言世界杯是这个月的热门话题，请用C语言实现世界杯的小组分组。

仅供参考：#include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

有大神吗 在线等


Question: 我是软件工程的大一学生，作业是编写图书信息管理系统，大神帮我查查bug，谢谢。源代码网址：百度网盘http://pan.baidu.com/s/1dEWgnvF

引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 jiftlixu 的回复:] 伸手党驾到,赵四老师...... 有偿提供服务。支付宝zhao4zhong1@163.com [/quote]  知识就是金钱，技术便是财富，，在此得到了充分的验证~

引用 5 楼 jiftlixu 的回复:伸手党驾到,赵四老师...... 有偿提供服务。支付宝zhao4zhong1@163.com

伸手党驾到,赵四老师......

直接说出遇到什么问题 不就行了？

查BUG这事还是自己来的比较好吧，基本技能吧，别人就是帮自己找出来BUG对自己能力也没什么提升

卧槽，还有这种操作？

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


Question: waitpid 导致父进程读取最后一行数据两次的困惑

引用 1 楼 user-1 的回复:看不出有什么问题，在我的电脑上跑了一下也没发现问题，换了好几台电脑都得到正确的结果 出错的程序也许有别的问题吧，你应该是没贴全代码 代码贴全了。我发现gcc 4.9 是正常的  gcc 5.4 就会line2输出两行


Question: 小白问一个关于长整型转化为字符串的问题

能把它在转为，低位在后高位在前的吗？我用这进行倒计时得时候，10s倒数到9s得时候，变成90然后80，70依次下来

楼主可以研究一下*str++,(*str)++,*(str++)

原因在这行： *str++ = buf[i] + '0'; //每次循环先取str的值：*str = buf[i] + '0' //然后str的值加1：str++ //while循环结束后str指针移动到字符串末尾。

如果你是自己练习，仅供参考。否则就是用系统api就行了，ltoa  void Long2Str(long _l, char *outStr) { 	char cTemp[20] = { 0 };  // 临时数组保存的是逆序的字符串 	char *pTemp = cTemp; 	if (_l < 0) 	{ 		*outStr++ = '-'; 		_l *= -1; 	} 	long l1; 	long l2 =_l;    	do  	{ 		l1 = l2 % 10; 		*pTemp++ = l1 + '0'; 		l2 /= 10; 	} while (l2>0); 	pTemp--;  	// 将逆序的字符串正序拷贝到输出串 	while (pTemp >= cTemp) 	{ 		*outStr++ = *pTemp--; 	} }  int _tmain(int argc, _TCHAR* argv[]) { 	long l = 1125412; 	char str[20] = { 0 }; 	Long2Str(l, str); 	printf("%s\n", str); }

因为前面操作了str++;这个操作会让指针的位置向后移动一个元素； 长整形转字符串，也可以考虑使用sprintf, snprintf函数，更简单。 sprintf(buf, "%lu", dat);


Question: RTMP传输音频(音频是G711A格式的，使用的是VLC工具播放)，现在只有杂音没有正常过

推荐使用bass库处理音频。

手动顶帖


Question: 关于C语言，字符型的一个小问题

scanf并不是立即读取输入存放到变量中，而是先放到缓冲区，当按下回车键后，再对缓冲区进行处理。  假设输入abc，当按下回车后，开始执行如下代码：              scanf ("%c",&ch); //从缓冲区读取一个字符'a'存到ch变量中             while (ch != 'g') //条件满足             {             printf ("%c",ch);//打印'a'             scanf("%c",&ch);//从缓冲区读取下一个字符'b'存到ch变量中，然后回到上一行，打印'b'             }  按照这个流程打印出abc，注意回车也是一个字符，同样满足!='g',所以程序运行后你会看到光标移动abc的下一行。 当输入g，循环结束。

你输入到的是stdin, 并就是行缓冲的，也就是按下回车后scanf才会从stdin中一个个读，不需要读会，读到匹配的就退出了

//请今后要用 char c; scanf("%c",&c); //时，都改为 char s[2]; char c; scanf("%1s",s); c=s[0]; //自动跳过一个或多个空格或Tab字符或回车换行，读取下一个字符。

因为有循环啊，只要不是g就循环一个字符一个字符的输出，效果就像直接一次性输出了一个字符串

你的输入先是在输入缓存里，此时还没到内存呢。变量ch内存里存放的。 1楼说的很多，标准输入是行缓冲，输入回车才会将输入缓存里的数据刷到内存里。 在内存里，ch是循环利用的，后面的将前面的覆盖；所以不存在越界问题


Question: windows版本下的MinGW 编译iconv函数出错

这是缺少iconv库。找libiconv.a或libiconv.dll放到编译器能找到的路径。再编试下，实在不行，下载iconv的源码，自己编。

你是怎么解决的？

iconv()  可能是linux下的专用函数,windows下没有

百度搜相关关键字。


Question: 求大神！c语言数据结构的题目，递归算法求Pn（x）

我记得刚回复过一个类似帖子 //递归符号演算 //P0(x)=1 //P1(x)=x //Pn+1(x)=(2n+1)/(n+1)*x*Pn(x)-n/(n+1)*Pn-1(x) //求Pn(x) #include <stdio.h> #include <stdlib.h> #include <malloc.h> char *P(int m) {     char *p;     int n;      if (m==0) {         p=(char *)malloc(2);         sprintf(p,"1");         return p;     }     if (m==1) {         p=(char *)malloc(2);         sprintf(p,"x");         return p;     }     //m>=2     n=m-1;     p=(char *)malloc(200);     sprintf(p,"%d/%d*x*(%s)-%d/%d*(%s)",2*n+1,n+1,P(n),n,n+1,P(n-1));     return p; } int main() {     int v;     char *q;      for (v=0;v<6;v++) {         q=P(v);         printf("P(%d)=%s\n",v,q);     }     return 0; } //P(0)=1 //P(1)=x //P(2)=3/2*x*(x)-1/2*(1) //P(3)=5/3*x*(3/2*x*(x)-1/2*(1))-2/3*(x) //P(4)=7/4*x*(5/3*x*(3/2*x*(x)-1/2*(1))-2/3*(x))-3/4*(3/2*x*(x)-1/2*(1)) //P(5)=9/5*x*(7/4*x*(5/3*x*(3/2*x*(x)-1/2*(1))-2/3*(x))-3/4*(3/2*x*(x)-1/2*(1)))-4/5*(5/3*x*(3/2*x*(x)-1/2*(1))-2/3*(x)) //

建议你先熟悉递归，再想自己的算法。  递归：想要解决问题n，必须解决前一层问题 n-1 ，问题n本身并不关注 n-1的问题如何解决，总之只要能解决 n-1的问题，就能解决当前问题n。。这才是递归算法的精髓。  例如：经典的汉诺塔问题   将n个盘子从 A柱子将盘子以B为跳转移动到C柱子，只要能将  N-1个盘子移动到B上，然后将第 N个盘子移动到C【最底层的盘子移动到目的地】，再将 n-1个盘子从B移到C即可。  希望对你有帮助。


Question: snmpd一直执行request，我并没有发送请求

建议还是要将代码里发送request的接口检查一遍，尤其是发送request的判断条件。也可以先用抓包工具抓一下包，查看是发的什么数据包，然后再到代码里去寻找。

抓包＋写日志


Question: 从二维数组中IM[2][5]分别选择两个不同的随机数，但是没有运行结果

谢谢您们了，我会多花时间学习！

#include <iostream> #include <iomanip>  #include <stdlib.h> #include <time.h>  using namespace std;  #define MAX_NUM 2 int main() {     int i, j;     int IM[2][5] = { {0,2,4,6,8},         { 1,3,5,7,9 } };     int a[MAX_NUM];      srand(time(NULL));      for (i = 0; i < MAX_NUM;) {         a[i] = IM[i][rand() % 5];         for (j = 0; j < i; j++)             if (a[j] == a[i])                 break;         if (j >= i)             i++;     }      for (int i = 0; i < MAX_NUM; i++)          cout << a[i] << endl;      return 0;  } 这个程序是从IM第一行取一个数据，在IM第二行去一个数据，放到a中

想得有点复杂了，循环太多。 #include <iostream> #include <iomanip>  #include <stdlib.h> #include <time.h>  using namespace std;  #define MAX_NUM 2 int main() {     int i, j;     int IM[2][5] = { {0,2,4,6,8},         { 1,3,5,7,9 } };     int a[MAX_NUM];      //存储结果      srand(time(NULL));      for (i = 0; i < MAX_NUM;) {         a[i] = IM[rand() % 2][rand() % 5];         for (j = 0; j < i; j++)             if (a[j] == a[i])                 break;         if (j >= i)             i++;     }      for (int i = 0; i < MAX_NUM; i++)          cout << a[i] << endl;      return 0;  }

随机必然有重复，所谓“不重复的随机”实际上是洗牌。洗牌算法参考下面： #include <stdio.h> #include <stdlib.h> #include <time.h> int d[6]; int i,n,a,b,t; int c,j; void main() {     srand(time(NULL));     printf("shuffle 0..n-1 demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=0;i<n;i++) d[i]=i;/* 填写0～n-1 */             for (i=n;i>0;i--) {/* 打乱0～n-1 */                 a=i-1;b=rand()%i;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=0;i<n;i++) printf("%d",d[i]);             printf("\n");         }     }     printf("shuffle 1..n demo\n");     for (n=1;n<=5;n++) {/* 测试1～5个元素 */         printf("_____n=%d_____\n",n);         j=1;         for (c=1;c<=n;c++) j=j*c;/* j为n! */         j*=n*2;         for (c=1;c<=j;c++) {/* 测试n*2*n!次 */             for (i=1;i<=n;i++) d[i]=i;/* 填写1～n */             for (i=n;i>1;i--) {/* 打乱1～n */                 a=i;b=rand()%i+1;                 if (a!=b) {t=d[a];d[a]=d[b];d[b]=t;}             }             printf("%04d:",c);             for (i=1;i<=n;i++) printf("%d",d[i]);             printf("\n");         }     } }

for (int k1 = 0;k1 < k; k1++)  //k = 0，k1 < k这个条件不满足，而且k一直不会增加，这个for循环不会执行。  我重新写了一个(测试通过)，代码如下：  int main() { 	int IM[2][5] = { { 0,2,4,6,8 }, 	{ 1,3,5,7,9 } }; 	int a[2][2];      //存储结果 	srand(time(NULL)); 	for (int k = 0; k < 2; k++) 	{ 		a[k][0] = IM[k][rand() % 5]; 		while (true) 		{ 			a[k][1] = IM[k][rand() % 5]; 			if (a[k][1] != a[k][0]) 			{ 				break; 			} 		} 		 	} 	for (int i = 0; i < 2; i++) //输出得到的数值。 	{ 		for (int j = 0; j < 2; j++) 		{ 			cout << a[i][j]; 			cout << " "; 		} 		cout << endl; 	} 	 	return 0; }  代码比较简单，就不加注释了。  如果对您有帮助，请采纳答案好吗，谢谢！

数组容量不足，IM数组 元素没有5的下标，


Question: 【LinuxC】新手，写了一个数据库备份的代码，存在一些疑问；

引用 5 楼 zhao4zhong1 的回复:无非是把逻辑相对独立的几句放在一起变成一个函数。 道理我都懂，但是没有照您说那样写过，所以多少有点不大会。。您可以举个例子吗。真的谢谢您

无非是把逻辑相对独立的几句放在一起变成一个函数。

引用 3 楼 zhao4zhong1 的回复:crontab bash  我现在是在暑期实习，这个是别人写好的监听进程，会一直在，我要做的是在里边加入凌晨两点的备份操作；因为都是用指令写的，师傅说不大好想让我优化一下使用函数来完成，但是我对函数不大熟练，不知道该用什么怎么用；

crontab bash

百度搜相关关键字。

背景是放在一个每10秒钟循环一次的守护进程中，凌晨两点备份一次数据库；

这样？：void backup(void) {     dp = popen(capBuf,"r");     if(fgets(tnkBuf, sizeof(tnkBuf), dp)) {         if (rap == 0) {             if (rep == 0) {                 strcpy(timBuf,"stat -c%Z /mnt/hd1/1.sql");                 strcpy(tieBuf,"stat -c%Z /mnt/hd1/2.sql");                 dm = popen(timBuf,"r");                 fgets(tmiBuf, sizeof(timBuf), dm);                 de = popen(tieBuf,"r");                 fgets(tmeBuf, sizeof(tmeBuf), de);                 if (strcmp(tmiBuf ,tmeBuf)<0) {                     system("cp -rf /mnt/hd1/2.sql /mnt/hd1/1.sql");                     sleep(1);                     system("rm -rf /mnt/hd1/2.sql");                     sleep(3);                     system("mysqldump -uroot -pcocloud smarthome > /mnt/hd1/2.sql ");                     sleep(1);                     pclose(dm);                     pclose(de);                     dzlog_debug("jinle if\n");                     sleep(60);                 } else {                     system("cp -rf /mnt/hd1/1.sql /mnt/hd1/2.sql");                     sleep(1);                     system("rm -rf /mnt/hd1/1.sql");                     sleep(3);                     system("mysqldump -uroot -pcocloud smarthome > /mnt/hd1/1.sql ");                     pclose(dm);                     pclose(de);                     dzlog_debug("jinle else\n");                     sleep(60);                 }             } else {                 system("mysqldump -uroot -pcocloud smarthome > /mnt/hd1/2.sql ");                 sleep(60);             }         } else {             system("mysqldump -uroot -pcocloud smarthome > /mnt/hd1/1.sql ");             sleep(60);         }     } else {         dzlog_debug("It's not two o'clock\n");     }     pclose(dp); } int main() {     rap = access("/mnt/hd1/1.sql", F_OK);     rep = access("/mnt/hd1/2.sql", F_OK);     system("date > /mnt/hd1/time");     sprintf(capBuf,"%s","cat /mnt/hd1/time | grep 02:00:*");     backup();     return 0; }


Question: 对于编译器中的错误提示，"=="左边的gets(m)的类型不是char*吗？为何是int型？等号右边的类型char [4]这是什么类型？

字符串比较要调用库函数，strcmp, strncmp

理解和讨论之前请先学会如何观察！ //char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

应该用strcmp(gets(m),"abc")

char * 是指针型，跟int一样都是4字节的数据，指针可能也可以等同于int吧 右边的字符串3字节加上结束符\0，正好4字节


楼主发这个帖子的是想干啥？ 赵四老师的回答很威武

引用 3 楼 u011280788 的回复:[quote=引用 2 楼 zhao4zhong1 的回复:] http://fanyi.baidu.com/#en/zh/-------------------Configuration%3A%20Cpp1%20-%20Win32%20Debug--------------------%0ACompiling...%0ACpp1.cpp%0A%0ACpp1.obj%20-%200%20error(s)%2C%200%20warning(s)  老师V5[/quote]

编辑---编译----链接----运行。 这个信息说明编译成功，生成.obj文件，等待链接。  深入学习可以参考：  http://c.biancheng.net/cpp/html/729.html 如果有帮助，请采纳答案好吗，谢谢！

引用 2 楼 zhao4zhong1 的回复:http://fanyi.baidu.com/#en/zh/-------------------Configuration%3A%20Cpp1%20-%20Win32%20Debug--------------------%0ACompiling...%0ACpp1.cpp%0A%0ACpp1.obj%20-%200%20error(s)%2C%200%20warning(s)  老师V5

编译没有错误和警告，ok


Question: 求子串操作 求高手

回复上面答主问题，重新释放是因为防止存放新子串的空间不足，故重新分配

附上修改好的代码，原因是我把malloc函数写在了while里面，这样的话每次str #include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */  int main(int argc, char *argv[]) { 	int* i;     i=(int*)malloc(sizeof(int)*10); 	printf("%x\n",i); 	i=(int*)malloc(sizeof(int)*10); 	printf("%x",i);  	return 0; } 可以看到结果是：4c2e98 4c0c50  所以对比原函数，每次while 都开辟了新的地址空间，str指向了新的地址，所以再去那个地址找ch[0],ch[1],ch[2]，就只有一个str.ch[2]可以被找到了。应该把malloc写在while外面

#include <stdio.h> #include <stdlib.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef struct{ 	char* ch; 	int length; }Str; int substring(Str str,Str* substr1,Str* substr2,int pos,int end) { 	if(pos<0||end>str.length||pos>end) 	return 0; 	if(substr1->ch) 	{ 		free(substr1->ch); 		substr1->ch=NULL; 	} 	if(substr2->ch) 	{ 		free(substr2->ch); 		substr2->ch=NULL; 	} 	int i=0;int j=end+1; 	substr1->ch=(char*)malloc(sizeof(char)*pos); 	 	while(i<pos) 	{ 	 		substr1->ch[i]=str.ch[i]; 		i++; 	} 	int k=0; 	substr2->ch=(char*)malloc(sizeof(char)*(str.length-end)); 	while(j<=str.length) 	{ 		substr2->ch[k++]=str.ch[j++]; 	} 	substr1->ch[pos]='\0'; 	return 1;  } int main() { 	int a=0; 	Str str1; 	Str str; 	 str.length=8;     str.ch=(char*)malloc(sizeof(char)*(str1.length));     str.ch="ABACCCEFFDH";     str1.length=6;     str1.ch=(char*)malloc(sizeof(char)*(str1.length));     str1.ch="ABCD";     Str str2;     str2.length=2;     str2.ch=(char*)malloc(sizeof(char)*(str2.length));     str2.ch="CD";   	a=substring(str,&str1,&str2,3,5);    	printf("%d",a);    	printf("%s\n",str1.ch);    	printf("%s\n",str2.ch); 	printf("在第%d个位置匹配成功",a);  	return 0; }

#include <stdio.h> #include <stdlib.h> #include <string.h>  /* run this program using the console pauser or add your own getch, system("pause") or input loop */ typedef struct{     char* ch;     int length; }Str;  int substring(Str str, Str* substr1, Str* substr2, int pos, int end) {     if(pos<0||end>str.length||pos>end)         return 0;     if(substr1->ch)     {         printf("free substr1\n");         free(substr1->ch);         substr1->ch=NULL;     }     if(substr2->ch)     {         printf("free substr2\n");         free(substr2->ch);         substr2->ch=NULL;     }      int i=0;int j=end+1;     while(i<pos)     {         substr1->ch=(char*)malloc(sizeof(char)*pos);         substr1->ch[i]=str.ch[i];         printf("i=%d\n",i);         printf("%c\n",substr1->ch[i]);         i++;      }     int k=0;     while(j<=str.length)     {         substr2->ch=(char*)malloc(sizeof(char)*(str.length-end));         printf("k=%d\n",k);         printf("j=%d\n",j);          substr2->ch[k++]=str.ch[j++];         printf("substr2=%c\n",substr2->ch[k]);      }     //substr1->ch[pos]='\0';     int m;     for(m=0;m<3;m++)     {         printf("%c\n",substr1->ch[m]);         printf("m=%d\n",m);     }      //printf("%s\n",substr2->ch);     return 1;  } int main() {     int a=0;     Str str1;     Str str;     str.length=8;     str.ch=(char*)malloc(sizeof(char)*(str1.length));     strcpy(str.ch, "ABACCCEF");     //str.ch="ABACCCEF";     str1.length=6;     str1.ch=(char*)malloc(sizeof(char)*(str1.length));     strcpy(str1.ch, "ABCD");     //str1.ch="ABCD";     Str str2;     str2.length = 3;     str2.ch=(char*)malloc(sizeof(char)*(str2.length));     strcpy(str2.ch, "CD");     //str2.ch="CD";     //  a=concat(str,&str1,&str2);     a=substring(str,&str1,&str2,3,5);     printf("%d",a);     // printf("%s\n",str1.ch);     // printf("%s\n",str2.ch);     //   printf("在第%d个位置匹配成功",a);      return 0; } 看不懂你的定义为寻找字串的函数是在做什么。 字符串不能直接赋值，需要借用strcpy, strncpy. 自定义函数里把已经申请空间的变量为什么进入自定义函数里马上释放呢？逻辑比较混乱。建议，你用文字把你的需求描述清楚一些～


Question: 这个程序为什么执行的时候提示无法读取内存？

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

scanf("%d, d%", &i, &j); 这句的语法写得不对。

scanf("%d, d%", &i, &j); 这里逗号后面还有个空格  要么去掉这个空格，要么输入的时候还要再多输入一个空格

应该是数组越界访问，验证办法是：在输入i，j之后，先将i,j输出看看你输入的数据和接收的数据是否一致。

printf里面的%和变量的一一对应关系 scanf里面的%和变量以及变量前加不加&的一一对应关系 是C代码中非常容易出错的地方，而且通常编译还不出错。 所以在编译源代码之前值得专门仔细检查一遍甚至多遍。  在每个最后不带\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字符或回车换行，读取下一个字符。

scanf("%d, d%", &i, &j);  应该修改为：  scanf("%d,%d", &i, &j);  输入格式字符串不对，小心一些就好了。  如果有帮助，请采纳答案好吗，谢谢！


Question: 关于其他类型指针转换为FILE*的问题

你还是别学编程了吧，这么多人都教不懂你！！！！！！！！

[/quote] 我现在想用sendfile将缓存区中的数据发送到sockfd,但sendfile参数二fd必须为文件描述符，但我的数据存放在缓存区，所以有没有办法实现这一功能，使得sendfile可以将缓存区中的数据发送到sockfd？[/quote] 得，楼上几个都白说了！[/quote] 说不定有高手有奇技淫巧解决这问题呢

引用 19 楼 hhhlizhao 的回复:[quote=引用 18 楼 zhao4zhong1 的回复:] 我现在想用sendfile将缓存区中的数据发送到sockfd,但sendfile参数二fd必须为文件描述符，但我的数据存放在缓存区，所以有没有办法实现这一功能，使得sendfile可以将缓存区中的数据发送到sockfd？[/quote] 得，楼上几个都白说了！

引用 18 楼 zhao4zhong1 的回复: 我现在想用sendfile将缓存区中的数据发送到sockfd,但sendfile参数二fd必须为文件描述符，但我的数据存放在缓存区，所以有没有办法实现这一功能，使得sendfile可以将缓存区中的数据发送到sockfd？

容量大小从小到大：栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB～1TB左右的存储时，最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数，linux参考fseeko64函数。 FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000]; int B; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999]; _fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B; fclose(fA);

内存映射参考：// 创建文件句柄 HANDLE hFile = ::CreateFile(lpszFileName, GENERIC_READ, NULL, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); // 创建文件映射 HANDLE hMap = ::CreateFileMapping(hFile, NULL, PAGE_READONLY | SEC_COMMIT, NULL, NULL, NULL); // 读取映射中的内存 LPVOID lpBuffer = ::MapViewOfFile(hMap, FILE_MAP_READ, NULL, NULL, NULL);  // 好了文件的内存已经获取了，你可以随意处理了  // 释放映射内存 ::UnmapViewOfFile(lpBuffer); // 关闭文件映射 ::CloseHandle(hMap); // close file handle ::CloseHandle(hFile);

楼主不要理解错赵老师代码的意义.  在C++中, 因为指针变量都有相同的长度, 所以下互转换, 不会损失信息. 这对于参数传递有重要意义.  (比如序列化和反序列化结构体)  但是这里, 想把一个缓冲区, 直接变成FILE*来访问, 那肯定是不行的. 强制转换的结果就是系统会按FILE*的结构体定义, 来访问这个缓冲区, 结果, 系统api发现这里的得到的成员变量不正确, 然后就会报错了.  你想做的是内存映射的话, 要严格按照内存映射的方式来做,  偷不了懒, 一步到位.

用c/c++，不仅要了解相应语言，而且要目标计算机的体系结构有一定的了解。

引用 7 楼 paschen 的回复:强制转换成功不代表运行一定成功，强制转换是否可靠是需要程序员去保证的  你的Faddr1根本就没指向一块有效的内存，完全就是野指针，当然是不对的了 先不论楼主的这个转换是否有效，如果addr1是一个指向合法的内存空间，那么Faddr1 = (FILE *)addr1是没问题的。即使Faddr1定义的是一个野指针，但是这句Faddr1 = (FILE *)addr1让它指向了一个合法的地址，那就不是野指针了。 所以，这样强制类型转换没毛病，但是就是转换之后Faddr1是否可以当成FILE *类型使用，能否正确操作文件就不一定了。这个要看addr1是否是指向打开的文件描述符。

引用 5 楼 hhhlizhao 的回复:[quote=引用 4 楼 cfjtaishan 的回复:] 文件描述符是打开文件时，返回的。不能从其他变量强制类型转换得来。 那我现在需要将unsigned char *转换为FILE*进行操作，有什么其他方法实现吗？[/quote] 为什么要强制转换呢，为什么不通过打开文件返回呢

引用 7 楼 paschen 的回复:强制转换成功不代表运行一定成功，强制转换是否可靠是需要程序员去保证的  你的Faddr1根本就没指向一块有效的内存，完全就是野指针，当然是不对的了 赞同～

int _fileno(       FILE *stream    );    函数调用是否成功，和参数stream的状态有关。具体可以参考：  https://msdn.microsoft.com/en-us/library/zs6wbdhx.aspx  备注：ISO标准使用_fileno。

引用 4 楼 cfjtaishan 的回复:文件描述符是打开文件时，返回的。不能从其他变量强制类型转换得来。 那我现在需要将unsigned char *转换为FILE*进行操作，有什么其他方法实现吗？

文件描述符是打开文件时，返回的。不能从其他变量强制类型转换得来。

http://bbs.csdn.net/topics/391017450  这个帖子中回答者赵四老师给出了一个范例，你可以对照这个例子看看。[/quote] 我也看到了赵四老师的范例，但使用fileno（）转换时发生了错误。不知道是不是没有转换成功，还是其他原因？

int fd; unsigned char *addr1; //addr1并没有与某个文件关联。 FILE *Faddr1； Faddr1 = (FILE *)addr1; //只是单纯的使两个指针变量的值相等，没有对应的文件存在，并不能达到期望的效果。 fd = fileno(Faddr1);  http://bbs.csdn.net/topics/391017450  这个帖子中回答者赵四老师给出了一个范例，你可以对照这个例子看看。

废话......你又没有真的去打开哪个文件,你说能不能操作?这样做只能骗自己.

我的addr1是一块内存区域mmap之后的指针。