Question: codeblocks 16.01版才运行就说编译器不行，电脑是win7的

按要求下了带有mingw的一个，应该是带有编译器的

编译器设置有问题。楼主看一看自己是不是下载错了。我猜测楼主应该是下载了不带编译器的版本。


Question: 关于C代码运行中断

新手容易犯的错误之一，取地址符

注意sacnf_s的参数 scanf_s("%d",select,2);   --->   scanf_s("%d",&select,2);

请问下各位大神，这个要怎么调试，我按照平常调试代码的方法发现根本就调试不了、程序会中断


Question: 求帮忙   谢谢

认真看书上结构的部分，看完完全能自己写。

我用VS写了一个！好像还可以！  #include<stdio.h>  #include<iostream> #include<string> #define MAX 500  using namespace std;  class student { private: 	string name; 	string sex; 	long  Class; 	string  number; 	int chinese; 	int math; 	int English; 	int high; //存储最好成绩  public: 	student() {} 	student(string name_s, string sex_s, long Class_s, string number_s, int chinese_s, int math_s, int English_s); 	void show(); 	void gethigh();//找到最高成绩  };  student::student(string name_s, string sex_s, long Class_s, string number_s, int chinese_s, int math_s, int English_s) { 	name = name_s; 	sex = sex_s; 	Class = Class_s; 	number = number_s; 	chinese = chinese_s; 	math = math_s; 	English = English_s; } void student::show() { 	cout << name << "  " << sex   << " " << Class << " " << number << "     " << chinese << "   " << math << "   " << English << "   " << high << endl; }  void show_total(student *p, int j) { 	int i; 	cout << "姓名" << " " << "性别" << " " << " 班级" << "   " << "学号" << "          " << "语文" << " " << "数学" << "  " << "英语" << " " << "最高成绩" << endl; 	for (i = 0; i<j; i++) 		p[i].show(); }  void student::gethigh() {  	if (chinese>math) 		high = chinese; 	else high = math; 	if (high<English) 		high = English; }  int main() { 	student p[MAX]; 	int j = 0; 	string flat; 	string name; 	string sex; 	long  Class; 	string  number; 	int chinese; 	int math; 	int English; 	int high; //存储最好成绩  	while (1) 	{ 		cout << "是否停止输入,是请输入Yes,否请输入No" << endl; 		cin >> flat; 		if (flat == "Yes") 			break; 		cout << "请输入姓名:"; 		cin >> name; 		cout << "请输入性别："; 		cin >> sex; 		cout << "请输入班级："; 		cin >> Class; 		cout << "请输入学号："; 		cin >> number; 		cout << "请输入语文成绩："; 		cin >> chinese; 		cout << "请输入数学成绩："; 		cin >> math; 		cout << "请输入英语成绩："; 		cin >> English; 		p[j] = student(name, sex, Class, number, chinese, math, English); 		p[j].gethigh(); 		j++; 	} 	show_total(p, j); 	system("pause"); 	return 0; }

嗯，挺简单的！…………


Question: 动态链表输入并存入文件

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

不知道问什么只能运行到输入那个地方，回车存储就会出错 请帮忙看一看


Question: 如何调用该接口地址，提取出数据到数据库，并且显示数据，请写出代码，在线等，急！

char url[1024]; char ph[3][128]={ "999-2394153274", "781-8548199520", "784-1788467127", }; for (int i=0;i<3;i++) {  sprintf(url,"http://...ticket=%s",ph[0]);  //TODO:调用curl库相应函数提取url对应链接返回的html网页 }

那如何调用接口地址，提取数据。

使用curl库。


Question: 关于使用指针的一个问题

引用 1楼user-2 的回复:#include <stdio.h> void main() { 	int a[10] = { 9,4,5,6,1,10,2,3,7,8 }; 	int *p, i, t; 	p = a; 	for (i = 0; i < 10; i++) 	{ 		if (*p < a[i]) 			p = &a[i]; 	} 	t = a[0]; a[0] = *p; *p = t; 	for (i = 0; i<10; i++) 		printf("%d ", a[i]); }明白啦，谢谢啦！^_^

引用 2楼小灸舞 的回复:1.if (*p > a[i])你这样变成找最大值了 2.t = &a[0]; a[0] = *p; p = t;你这三句也没法交换值 你让t指向a的第一个元素，然后将p指向的元素的值赋值给a[0],然后p指向t（也就是指向了a[0]）？？ 这三句造成的效果仅仅就是a[0]的值被修改了  代码功能归根结底不是别人帮自己看或讲解或注释出来的；而是被自己静下心来花足够长的时间和精力亲自动手单步或设断点或对执行到某步获得的中间结果显示或写到日志文件中一步一步分析出来的。 提醒：再牛×的老师也无法代替学生自己领悟和上厕所！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。谢谢啦，我明白了，多谢。*p>a[i]，是我测试的时候忘记改了。^_^还是很谢谢您，我会改进的


Question: 请问如果函数是int main(int argc,char *argv[])这样，哪些算参数，哪些算变元呢

谢谢大家。。

命令行参数，不是 应用程序本身的输入 而是shell环境中，以及其他可以执行别的程序的环境中 输入的带有参数的 命令行 命令 中的 参数 widows 中，cmd下执行的程序，可以带有 命令行参数 一个程序，调用可执行程序，可以传递命令行参数 应用程序执行时，不再需要额外输入命令行参数。  在 windows 中，批处理文件 .bat，命令文件 .cmd 中，每一行都是命令 应用程序，可以在批处理文件中执行  批处理文件，每一行就是一个命令行 可以执行内部命令，外部命令（可执行文件.exe）,以及脚本语言指令

argc是命令行总的参数个数      argv[]是argc个参数，其中第0个参数是程序的全名，以后的参数      命令行后面跟的用户输入的参数，比如：    int   main(int   argc, char*   argv[]) { 	int   i; 	for (i = 0; i < argc; i++) 		cout << argv[i] << endl; 	cin >> i; 	return   0; }     执行时敲入      F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE   aaaa   bbb   ccc   ddd      输出如下：      F:\MYDOCU~1\TEMPCODE\D1\DEBUG\D1.EXE      aaaa      bbb      ccc      ddd

参数，变元，C,C++语言函数，不是数学物理方程  C,C++ 有变量 这种 语法成分 有 函数参数（实参 和形参）这一类 函数定义，声明，调用 相关的概念  对于函数，形参相当于 ，函数内部定义的 变量。 只是数组的有点小小的不同。 函数定义，函数声明 的参数表中的内容，为形式参数。 函数调用的参数表中的内容，为实际参数。 函数的每个实参，是个表达式 函数的每个形参，可以看作变量  argc，argv[] 是main 函数的形式参数 是 C,C++标准库中的初始化代码，调用 main 函数传递过来的参数。  其中 argc 是 初始化代码获取的命令行参数的  字符串个数 argv 是每个命令行参数（空格分隔的）  通过处理命令行参数，应用程序在命令行 执行的时候，可以 传递一些命令参数 应用程序，根据这些参数，产生不同的运行结果。  这些参数，是命令行这种执行方式 传递的 这是 C 语言程序，对 执行环境（shell 程序）的响应  举例  假设程序编译后，生成 a.exe  命令行输入a.exe x y z 应用程序，就可以得道 argc 的值，为 4  argv[0] ="a.exe",argv[1] ="x",argv[2]="y",argv[3] ="z"; 假设，应用程序，简单的依序输出 argv 就会输出 a.exe x y z 一般来说，编译器都是这种带 参数的程序 可以 在命令行输出编译参数。根据不同参数产生不容的编译结果


Question: 这几个用C语言怎么实现啊

第一题，最近学了一段时间C语言，这是我的HELLO WORD,望多指教。用的主函数，经调试成功，代码如下： #include "stdio.h" #define N 9 #define NUM N*(N+1)/2 void main() {   int t[N][N]={0},array[NUM],i,j,m=0;   for(i=0;i<N;i++)   {   t[i][0]=i+1;   for(j=1;j<=i;j++)   t[i][j]=t[i][j-1]+t[i-1][j-1];   } printf("二维参照数组:\n"); for(i=0;i<N;i++)  for(j=0;j<i+1;j++)  { array[m]=t[i][j]; m++; } for(i=0;i<N;i++)   {  for(j=0;j<N;j++)   printf("%8d",t[i][j]);  printf("\n"); } printf("%s\n","最终数组:"); for(m=0;m<NUM;m++)    if (!m) printf("%8d\n", array[m]);       else if (array[m]>=array[m+1]) printf("%8d\n",array[m]);        else printf("%8d",array[m]); }

第一题： void get_funny_array(int* a, int ns) { 	int i = 0, j = 0; 	int idx = 0; 	 	for (i = 0; i < ns; i++) { 		a[idx] = i+1; 		printf("%4d ", a[idx]); 		idx++; 		for (j = 1; j <= i; j++) { 			a[idx] = a[idx-1] + a[i*(i-1)/2+j-1]; 			printf("%4d ", a[idx]); 			idx++; 		} 		printf("\n"); 	} }


Question: 如何实现C语言对指定内容的查找与替换

谢谢老师！完美的解决了我的问题，涉及到的一些文件和指针的知识我先消化消化

//所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a， //删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。 #include <stdio.h> FILE *fi,*fo; char ln[256],c; int N,M,v; int main() {     fi=fopen("APDL3.mac","r");     if (NULL==fi) {         printf("Can not open file APDL3.mac!\n");         return 1;     }     fo=fopen("tmp.mac","w");     if (NULL==fo) {         fclose(fi);         printf("Can not create file tmp.mac!\n");         return 2;     }     while (1) {         printf("Input N,M:");fflush(stdout);         rewind(stdin);         if (2==scanf("%d,%d",&N,&M)) break;     }     while (1) {         if (NULL==fgets(ln,256,fi)) break;         if (2==sscanf(ln,"N=%d%c",&v,&c)) {             if ('\n'==c) {                 fprintf(fo,"N=%d\n",N);                 continue;             }         }         if (2==sscanf(ln,"M=%d%c",&v,&c)) {             if ('\n'==c) {                 fprintf(fo,"M=%d\n",M);                 continue;             }         }         fprintf(fo,"%s",ln);     }     fclose(fo);     fclose(fi);     remove("APDL3.mac");     rename("tmp.mac","APDL3.mac");     return 0; }

老师您好，您说的这个思路我理解，不过具体不知如何实现。在本例中我是希望通过输入数据，将文本内指定位置的值替换为我输入的值，比如说键盘输入809，5，将原文本文件的N=20,M=3,替换为第二张图所示的N=809,M=5。输入100，10，N和M后面的数字也相应发生变化。而不是您参考程序中指令框输入一行文字对指定字符串的替换。

所谓修改删除文件a某位置的内容，其实是读打开文件a，再将‘a中修改删除位置之前的内容＋修改删除的内容＋a中修改删除位置之后的内容’保存到文件b，关闭文件a，删除文件a，将文件b改名为与之前文件a相同的名字，仅此而已。  仅供参考：#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": //

我现在可以找到我文本中N的位置，并通过键盘输入数据修改它的值。现在想要将这个修改的结果写入文本原来的位置。具体代码下面贴出，但不知如何将这一修改结果写入文本中，我也不知道我的思路对不对，求各位大大指导。 #include <stdio.h>  #include <stdlib.h> int main() { 	FILE *fin; 	char x, y,a; 	int n,N; 	int i; 	fin = fopen("d:\\APDL3.mac", "r"); 	for (i = 0; i<4; i++) fscanf(fin, "%*[^\n]%*c");  // 跳2 行 	fscanf(fin, "%c %c %d", &x, &y, &n);  // 读 3 个 字符	 	scanf("%d", &N);    //输入N的值 	n = N; 	printf("%c %c %d\n", x, y, n);  // 打出 N = ？ 	fclose(fin); }

我贴出来的截图是我一段大程序的开头，按您说的全部重写可能工作量比较大啊。我现在想的方法是用指针查找需要替换的部分，不过具体不知道如何代码实现。 实际上我的任务是用c调用ansys语句，想要通过修改N，M值控制计算结果的输出。所以才需要替换M和N的值。

内容这么少，不用替换，直接重新写一遍 用fprintf把所有内容重新写一遍


Question: 没啥思路，求大神解读一下

Do not let me think！ 仅供参考：#include <stdio.h> #define MAXN 100 int m[MAXN+2][MAXN+2]; char d; int x,y,k,n,w; char str[10]; void main() {     while (1) {         printf("Input n(1..%d):",MAXN);         fflush(stdout);         rewind(stdin);         if (1==scanf("%d",&n)) {             if (1<=n && n<=MAXN) break;         }     }     y=0  ;for (x=0;x<=n+1;x++) m[y][x]=1;     y=n+1;for (x=0;x<=n+1;x++) m[y][x]=1;     x=0  ;for (y=0;y<=n+1;y++) m[y][x]=1;     x=n+1;for (y=0;y<=n+1;y++) m[y][x]=1;     for (y=1;y<=n;y++) {         for (x=1;x<=n;x++) {             m[y][x]=0;         }     }     x=1;     y=1;     k=0;     d='D';     while (1) {         k++;         if (k>n*n) break;         m[y][x]=k;         switch (d) {             case 'D':                 if (0==m[y+1][x])  y++;                 else              {x++;d='R';}             break;             case 'R':                 if (0==m[y][x+1])  x++;                 else              {y--;d='U';}             break;             case 'U':                 if (0==m[y-1][x])  y--;                 else              {x--;d='L';}             break;             case 'L':                 if (0==m[y][x-1])  x--;                 else              {y++;d='D';}             break;         }     }     w=sprintf(str,"%d",n*n);     for (y=1;y<=n;y++) {         for (x=1;x<=n;x++) {             printf(" %0*d",w,m[y][x]);         }         printf("\n");     } }

定义一个二维数组  维度为矩形高和宽，定义一个方向变量。 for循环    确定是第几个走的格子。 IF  下一格为矩形之外或大于0    方向变换     下一格等于这格加1     输出二维数组

数字是螺旋形排列

写下代码好吗亲


Question: 【请教】能不能这样设置二维数组？

然而初始化方式，和赋值方式，还是不一样的

结构是可以的

引用 14 楼 cyfcsd 的回复:这个问题没那么复杂，两个数和最小，肯定是他们就是数组中最小的两个数，用两次循环找一下就行了，时间复杂度为O(n)，你每两个数相加一下时间复杂度就变成O(n^2)了，参考代码如下 #include "stdio.h" #include "string.h" #include "stdlib.h"  #define N 5 int main() { 	int a[N]; 	int i = 0; 	int j = 0; 	int minIndex1 = 0; 	int minIndex2 = 1; 	printf("请输入五个数：(用空格或回车隔开)\n"); 	for(i=0; i<N; i++){ 		scanf("%d", &a[i]); 	} 	for(j=0; j<N; j++){ 		if(a[minIndex1] > a[j]){ 			minIndex1 = j; 		} 	} 	for(j=0; j<N; j++){ 		if(a[minIndex2]>a[j] && minIndex1!=j){ 			minIndex2 = j; 		} 	} 	printf("和最小的两个数为：%d和%d\n", a[minIndex1], a[minIndex2]); 	//system("pause"); 	return 0; }谢谢你的耐心解答！！！！真是万分感谢  谢谢你！

引用 10 楼 cyfcsd 的回复:引用 7 楼 xujin12368 的回复:[quote=引用 3 楼 cyfcsd 的回复:] 能不能行楼主输出看一下就知道了啊，不要离开编译器学习啊我就是因为编译不了 ， 才来请教的。。 好吧，那你应该说明白你的要求，然后我们才能给你想办法啊[/quote]我就是想输出这个  输入5个数，输出和最小的两个数（由小到大输出）   然后我的想法就是，把每两个数相加的和存储到数组sum[m]中，然后算出最小的sum ， sum[m]=sum[I]+sum[j]，然后求出最小sum后，找到与m对应的 i 和 j  ,输出 这两个数。

数组没啥好招，还是逐个设置比较简单

估计不成，你可以试试

能不能行楼主输出看一下就知道了啊，不要离开编译器学习啊

引用 7 楼 xujin12368 的回复:引用 3 楼 cyfcsd 的回复:能不能行楼主输出看一下就知道了啊，不要离开编译器学习啊我就是因为编译不了 ， 才来请教的。。 好吧，那你应该说明白你的要求，然后我们才能给你想办法啊

引用 5 楼 lm_whales 的回复:数组没啥好招，还是逐个设置比较简单我用结构体行吗？ 我就是想输出这个 输入5个数，输出和最小的两个数（由小到大输出）  然后我的想法就是，把每两个数相加的和存储到数组sum[m]中，然后算出最小的sum ， sum[m]=sum[I]+sum[j]，然后求出最小sum后，找到与m对应的 i 和 j  ,输出 这两个数。

引用 6 楼 qq423399099 的回复:自己试下就知道了。 不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！谨听版主教诲

又看了一遍，有点明白了。楼主大概是想这样？ jihe[m][0] = i; jihe[m][1] = j;

没看懂你的意图，不过这么写从语法上是不行的。 首先，这种用大括号的写法只能用于数组的定义和初始化，而且大括号里面必须都是常数。 其次，如果jihe是二维数组，比如 int jihe[8][9]，那么jihe[m][2]应该是个int类型，只能保存一个数。


Question: 求助！！用C语言实现一个简单的数据库

数据库结构化语句分析引擎系统  C语言   程序设计 数据结构  算法(时间复杂度,空间复杂度)  数据库:SQL_Servler2008  ,MySQL,ORACLE, DB2                           PHP, JAVA  实训目的：1.C语言知识的熟练应用           2.理解数据结构,努力写出高质量的算法           3.预备数据库知识   文件名：  .c   (不能.cpp为扩展名   C++源程序才是.cpp)    1.创建表 2.查询表 3.插入数据 4.删除数据 5.修改数据   一。创建表 语法： create table  表名 ( 字段名1 字段1的数据类型,字段名2 字段名2数据类型.....  )  create table studinfos (sn int,name varchar(20),sex char,age int);  create table student ( sn varchar(3), name varchar(32),age int ,sex char);  create table  teacher ( sn varchar(3), name varchar(32),age int ,sex char);    sn  	name		sex	age 001	张三		M	19 002 	 李四		N	20 998  	王麻子		M   	12 009	王老伍		M	90 010     大明    type  struct {     char[4]  sn;    char[33] name;    int age;    char sex;  }StudentType   1.接入输入的SQL语句 create table student ( sn varchar(3), name varchar(32),age int ,sex char)       create table student(sn varchar(3), name varchar(32),age int ,sex char)       create table student ( sn varchar(3), name varchar(32),age int ,sex char )       create index snid ;  2.解析字符串:空格解析 左右括号的解析   关键字：确定是一个什么操作   通过关键字就能确定表名   确定所有字段   确定每个字段名称及数据类型.数据类型的大小  3.构造相应的结构体  4.创建表.(C语言来创建)         StudnetType s1; StudnetType s2;   type struct {   StudentType *data ;//数据的首地址   int count;//表中实际有多少记录   int  lenght; //表可以存放最大记录数 }TableType   TableType  studentinfo;  //初始化表 inittalbe( TableType * t) {   t->count=0;   t->lenght=1000;  这是老师给我们的一些参考 但是看不太懂。。 我们还没具体的学习数据库，大部分要用都还是C语言的一些知识  但是这些SQL语句怎么在VC 6.0++  里面实现完全不知道  大神求帮助啊！！！

参考SQLite源代码？

引用 1 楼 zhao4zhong1 的回复:参考SQLite源代码？ 赵4老师的话一句顶一万句。


Question: 求助！有关交集问题

A和B都是有序递增的，所以不需要用那么多嵌套循环了， 循环一次就够了

/STACK   (Stack Allocations) Home |  Overview |  How Do I |  Linker Options  The Stack Allocations (/STACK:reserve[,commit]) option sets the size of the stack in bytes.   To find this option in the development environment, click Settings on the Project menu. Then click the Link tab, and click Output in the Category box. The Reserve text box (or in the reserve argument on the command line) specifies the total stack allocation in virtual memory. The default stack size is 1 MB. The linker rounds up the specified value to the nearest 4 bytes.  The optional value specified in the Commit text box (or in the commit argument on the command line) is subject to interpretation by the operating system. In Windows NT, it specifies the amount of physical memory to allocate at a time. Committed virtual memory causes space to be reserved in the paging file. A higher commit value saves time when the application needs more stack space, but increases the memory requirements and possibly the startup time.  Specify the reserve and commit values in decimal or C-language notation.  Another way to set the size of the stack is with the STACKSIZE statement in a module-definition (.DEF) file. STACKSIZE overrides the Stack Allocations (/STACK) option if both are specified. You can change the stack after the .EXE file is built by using the EDITBIN tool.   50010×3×4=600120<1048576

引用 6 楼 zhao4zhong1 的回复:[quote=引用 5 楼 u014444402 的回复:] 正好休息.来一个.  int main() {     int a[50010];     int b[50010];     int collection[50010];     int i,j,n,label=0, aIndex = 0, bIndex = 0, cIndex = 0; while(scanf("%d",&n)!=EOF&&n!=0) {     for(i=0;i<n;i++)         scanf("%d",&a[i]);     for(j=0;j<n;j++)         scanf("%d",&b[j]);     aIndex = 0;     bIndex = 0;     cIndex = 0;     while ( (aIndex < n) && (bIndex < n) )     {         if ( a[aIndex] == b[bIndex] )         {             collection[cIndex++] = a[aIndex];             aIndex++;             bIndex++;          }         else if ( a[aIndex] > b[bIndex] )         {             bIndex++;         }         else         {             aIndex++;         }     }       display(collection,cIndex); }      return 0; }  在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。 [/quote] 在他原来的基础上改的, 原来的能运行,现在的就能运行. 不要老找这些不痛不痒的毛病. 有本事就表明自己的观点.老是复制粘贴,真是够烦,看见你的回复就烦.

引用 5 楼 u014444402 的回复:正好休息.来一个.  int main() {     int a[50010];     int b[50010];     int collection[50010];     int i,j,n,label=0, aIndex = 0, bIndex = 0, cIndex = 0; while(scanf("%d",&n)!=EOF&&n!=0) {     for(i=0;i<n;i++)         scanf("%d",&a[i]);     for(j=0;j<n;j++)         scanf("%d",&b[j]);     aIndex = 0;     bIndex = 0;     cIndex = 0;     while ( (aIndex < n) && (bIndex < n) )     {         if ( a[aIndex] == b[bIndex] )         {             collection[cIndex++] = a[aIndex];             aIndex++;             bIndex++;          }         else if ( a[aIndex] > b[bIndex] )         {             bIndex++;         }         else         {             aIndex++;         }     }       display(collection,cIndex); }      return 0; }  在占用内存空间较大的局部数组声明的前面加static将其从堆栈数据段挪到全局数据段即可避开因局部数组大小超过默认堆栈大小1MB造成程序不能正常运行的问题。

位图法...

A、B、C三个集合在水平数轴上位置关系的N种可能。

引用 1 楼 zhao4zhong1 的回复:A = B= C  A = B = C =  A = B  = C  A = B== C =  A = B == C =  A = B=== C =  A == B== C =  A == B  == C  =  A === B = C =  A === B  = C  =  A === B   = C   =  老师，我是新手，这个是什么意思啊


Question: 请教声明指针的问题。

指针只要保证在使用之前初期化过就行。

不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

这只是一种习惯问题，只有在你使用了指向不确定的指针才可能出错

就是避免野指针了，你不把指针指向合法的内存，它乱指一齐，甚至指向系统内存或其他程序的内存，导致访问越界。

赋初值是一种好的习惯，使程序更加安全，就像去除安全隐患一样，但不是说不赋初值就一定会有错。

楼主对那句话还没有完全理解，这里说的初始化并不是狭义上的“在定义同时赋值”这个意思 而是说不要使用指向不明的指针，一个指针对应一个内存地址，如果你定义了一个变量，然后用指针指向它，那可以保证这个指针所指空间是可以供你使用的，因为定义的那个变量的内存是系统分配的，系统不会把不能用的内存分配给你 但是如果你直接给指针付一个值，或者说干脆没有赋值，那里面就存了一个随机值，这个值对应的内存空间不一定是可用的，应该说一定是不可用的，如果这个时候你往这个内存里写或者读，那就会出现读取内存异常错误，这是非常常见的一种C语言错误 这句话的意思是不要使用指向不明的指针，即野指针，而避免这种情况的一种方法是初始化指针变量 由于C语言变量定义只能放在函数起始位置，可能会出现指针还不知道指向哪儿的问题，这个时候最好将指针置为NULL，这样会避免以后误操作。 总之，为了防止指针误操作，要么将指针指向一个已定义的变量，要么将其置为NULL 最后你应该明白了，你定义的指针在下面马上赋了一个正确的值，中间并没有其他操作，所以代码是可以的，没有问题

没有要求指针变量一定要初始化，但一定要先对指针变量有效赋值，再用指针变量间接访问

有一本书教我应该这么写 long num1 = 0L; long *pnum1 = 0; pnum1 = &num1;


Question: 请教++*pum写法哪种比较好。

++*pum 干净清爽，没有歧义，敲键最少，最简洁 添加括号和空格实属多余，并且容易出错（敲键盘，复制，修改代码容易出错）

引用 8 楼 zhao4zhong1 的回复:v=pum[0];pum++;  这个要拆成 auto v =*pnum; //建立一个临时变量 ++v; //对它自增 *pnum = v;//结果赋值给 *pnum 这只是马马虎虎，符合 ++*pnum 这个表达式的意思 这种表达式，还是不用拆分的好。

除非必要，我一般都写作 ++ 后置的方式：int *p = array; int n = *p++; (*p)++;其他就是必须用左 ++ 的结果来进行判断的时候：如：while (--i > 0)对指针对象进行左 ++，我也会写成第二种方式，也就是跟我这里风格一致。

++(*pum) 明确地用括号表示先取指针的数据，再递增 尽量用括号来表示优先级

效率一样的 个人习惯写成：++*pum，因为这种写法并不会产生歧义

这个C几乎没法分成两步 C++经过引用转换除外 不是所有表达式，都是可拆分，并且保持意义良好的。 要么表现很笨拙，要么根本就不可能

为了让大脑简单，我很多时候将这种写法写成两条语句，无歧义，适应所有编译器，对性能无任何影响。

第二种最好，简单直接，没有歧义，任何人都可以很快看懂，不需要思考，这是我喜欢的代码

可能分成两步最好。 可读性好。 PS：有些公司按有效代码行数算工资的，你懂的

敲键盘最少的最好


引用 1 楼 user-1 的回复:查询不到，就不会回调。sqlite3_exe的返回值只是表示是否成功执行，不表示查询的结果 嗯,测试了一下确实不会回调,但官方帮助文档又没说明,还以为程序搞错了呢, 这样的话,如何知道数据表是否有这条记录,我的想法是查询出结果会调用回调函数,在回调函数里修改全局变量,虽然麻烦点应该也可以


Question: scanf的格式字符串里面如果包含了\n，行为很怪异

以参加acm的教训，不要用scanf从流中直接吸取值。建议用 gets 获得整行，而后sscanf处理当前行。

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

此处的\n不表示等待换行符，而是读取并放弃连续的空白字符  你输入一个数后，它是不会立即显示的，要等再接收到一个非（空格、制表符、回车）的输入scanf语句才结束。  但请注意的是，最后输入的那个非（空格、制表符、回车）的东西是不会被这个scanf读进来的，而是留在输入流里。


Question: 如何用简便的方式在C语言程序里实现每个函数入口加debug log?

WinAPIOverride http://jacquelin.potier.free.fr/winapioverride32/

我的问题可能没有描述清楚，希望在已有的原文件里在每个函数入口处加 debug log, 如果写一个define， 手动插入每一个函数开头，这样比较耗时耗力

歪个楼，楼主可以这样： #define begin {debug(); #define end } 然后： int main(void) begin //... return 0; end

#include <stdlib.h> #include <stdio.h>  #define WARN(format, args...) printf("%s,%s,%d:"format, __FILE__,  __func__, __LINE__, ##args)  int main(int argc, char* argv[]) {     WARN("this is %s", "WARN");     return 0; } 可以自定义一个宏，用于输出信息

做个脚本试试


Question: 关于同类型指针赋值的问题

引用 8 楼 cyfcsd 的回复:根据你的代码构建了一个运行环境，读数据是没有问题的，你看一下吧 #include "stdio.h" #include "string.h" #include "stdlib.h"  typedef struct USER { 	int number; 	char name[20]; 	char code[20]; 	int itema; 	struct ITEM* a; 	struct USER* next; }*user;  typedef struct LinkList { 	int amount; 	struct USER* next; }*userlist;  typedef int Status;  Status InitList(userlist *p) { 	user q; 	*p=(userlist)malloc(sizeof(struct LinkList)); 	(*p)->amount=0; 	q=(user)malloc(sizeof(struct USER)); 	q->number=0; 	q->name[0]='a'; 	q->name[1]='d'; 	q->name[2]='m'; 	q->name[3]='i'; 	q->name[4]='n'; 	q->name[5]='\0'; 	q->code[0]='a'; 	q->code[1]='d'; 	q->code[2]='m'; 	q->code[3]='i'; 	q->code[4]='n'; 	q->code[5]='\0'; 	q->a=NULL; 	q->next=NULL; 	if(!p) /* 存储分配失败 */ 		exit(0); 	(*p)->next=q; 	return 1; }   int ReadFile(userlist p) { 	FILE *fp; 	user q,q2; 	struct ITEM *n,*n2; 	int i,j; 	q2=p->next; 	if((fp=fopen("memory.txt","r"))!=NULL) 	{ 		fscanf(fp,"%d,",&(p->amount)); 		printf("%d",p->amount); 		for(i=1;i<=p->amount;i++) 		{ 			q=(user)malloc(sizeof(struct USER)); 			fscanf(fp,"%d%20s%20s%d,",&(q->number),&(q->name),&(q->code),&(q->itema)); 			printf("%d,%s,%s,%d,",(q->number),(q->name),(q->code),(q->itema)); 			q2->next=q;  			n2=q->a; 			/*	for(j=1;j<=q->itema;j++) 			{ 			n=(item)malloc(sizeof(struct ITEM)); 			fscanf(fp,"%d%20s%d,%d,%d,%d,%d,",&(n->number),&(n->name),&(n->amount),&(n->year),&(n->month),&(n->day),&(n->sort)); 			n2->next=n; 			n2=n; 			} 			n2->next=NULL;*/ 		}   		fclose(fp); 	}  	return 0; }  int main() {	 	int px,py; 	int result; 	userlist a; 		char c; 	//CreateThread( NULL,0,ThreadProc1,NULL,0, NULL);  	InitList(&a);   	ReadFile(a); 	system("pause"); 	return 0; }    老兄，太感谢了，你让我知道了问题不是只出现在我给的这些代码里，之前一直觉得全部问题都在这，所以怎么都想不明白！现在看看其他地方，问题解决了！！！！多谢！！！！可以写作业报告啦！！！

引用 2 楼 qq423399099 的回复:这样的用法是完全可以的，之所以出错很可能是因为等号左边的q2->next; 严重怀疑你的q2指针是空指针或者野指针 建议贴出完整代码。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。 不求解决那些乱七八糟的拒绝访问的问题，只要能解决这个指针的问题就好！多谢！

引用 2 楼 qq423399099 的回复:这样的用法是完全可以的，之所以出错很可能是因为等号左边的q2->next; 严重怀疑你的q2指针是空指针或者野指针 建议贴出完整代码。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。  代码已经贴上。我用的VS，正常调试时拒绝访问，只能用CTRL+F5才能运行。以这种方式运行时按ALT+数字，啥窗口也没有，只有嘟嘟，求助

此为结构体声明 typedef struct USER { int number; char name[20]; char code[20]; int itema; struct ITEM* a; struct USER* next; }*user;  typedef struct LinkList { 	int amount; 	struct USER* next; }*userlist;   此为main()函数开头 int main() {	int px,py; 	Status result; 	userlist a; 	CreateThread( NULL,0,ThreadProc1,NULL,0, NULL);  	InitList(&a); 	TCHAR logo[5]={L"SCUT"};   // 初始化绘图窗口 	initgraph(800, 650); 	int v=1,qr=-1,count=0; 	TCHAR ch[2]; 	char c; 	ReadFile(a);  此为InitList（） Status InitList(userlist *p) { 	user q; 	*p=(userlist)malloc(sizeof(struct LinkList)); 	(*p)->amount=0; 	q=(user)malloc(sizeof(struct USER)); 	q->number=0; 	q->name[0]='a'; 	q->name[1]='d'; 	q->name[2]='m'; 	q->name[3]='i'; 	q->name[4]='n'; 	q->name[5]=NULL; 	q->code[0]='a'; 	q->code[1]='d'; 	q->code[2]='m'; 	q->code[3]='i'; 	q->code[4]='n'; 	q->code[5]=NULL; 	q->a=NULL; 	q->next=NULL; 	if(!p) /* 存储分配失败 */ 	exit(OVERFLOW); 	(*p)->next=q; 	return OK; }  此为ReadFile（） Status ReadFile(userlist p) { FILE *fp; user q,q2; item n,n2; int i,j; q2=p->next; if((fp=fopen("memory.txt","r"))!=NULL) { 	fscanf(fp,"%d,",&(p->amount)); 	printf("%d",p->amount);   	for(i=1;i<=p->amount;i++) 	{ 		q=(user)malloc(sizeof(struct USER)); 		fscanf(fp,"%d%20s%20s%d,",&(q->number),&(q->name),&(q->code),&(q->itema));printf("%d,%s,%s,%d,",(q->number),(q->name),(q->code),(q->itema)); 		q2->next=q; 		 		n2=q->a; 	/*	for(j=1;j<=q->itema;j++) 		{ 			n=(item)malloc(sizeof(struct ITEM)); 			fscanf(fp,"%d%20s%d,%d,%d,%d,%d,",&(n->number),&(n->name),&(n->amount),&(n->year),&(n->month),&(n->day),&(n->sort)); 			n2->next=n; 			n2=n; 		} 		n2->next=NULL;*/ 	}   	fclose(fp); }  return 0; }  此为memory.txt的内容 1,1a                   a                   0,

这个图谷歌浏览器打开看不清啊

跟指针类型没关系，类型错误编译就过不了，等不到运行时报错 建议多贴一些代码，或者详细的错误信息

在网上查了一下，貌似跟malloc返回的地址是不确定的有关，不过还是不知道怎么改T_T


Question: rpm -qa

1L 赵4老师正解。

rpm本身应该是有源码的：比如rpm-4.4.2.3-18.el5.src.rpm。

system("rpm -qa");//(^_^)


Question: 通讯录管理系统的 load 函数找错

好好看下我的代码，这个问题已经解决

请教下楼主，在新建一条记录后，显示会有乱码，这个是为为啥，与输入的格式有关吗？

引用 4 楼 adusuccessfully 的回复:请教下楼主，在新建一条记录后，显示会有乱码，这个是为为啥，与输入的格式有关吗？ 不会啊！我没有出现这种情况

你这代码写的实在。。。不能调试？说明你断点打的不对 我试了下查询,load()出来居然有乱码，我改了下load加载文件部分，你看看，希望对你有帮助    printf("    -------------------------------------------\n");     while(fgets((char*)t1, sizeof(struct ADS), fp))        {           sscanf((char*)t1,"%s %s %s %s",t1->name,t1->street,t1->city,t1->tele);          printf("\t%s\t%s\t%s\t%s\t\t\n",t1->name,t1->street,t1->city,t1->tele);           total++;          t1->next = t1; 		 memset(t1, 0, sizeof(struct ADS));         }      free(t1);

啥错误信息？可能是函数没写对或者参数不对吧，楼上怎么跟赵老师挺像的

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


Question: malloc（）内存释放问题

引用 1 楼 user-1 的回复:free(current);         current = current->next;  // 前面一行已经释放了current，那么这里就不能再使用current->next了 应该是这样：         tmp = current->next;         free(current);         current = tmp; 非常感谢，完美的解决了问题


Question: 【求助】为什么无论我怎么输入，最后的结果都是包含5呢？

引用 5 楼 user-1 的回复:[quote=引用 4 楼 xujin12368 的回复:] 我还不怎么会调试，能简单说明一下吗。。我是小白。。。谢谢 调试是必须要学会的。不难。 调试的思路都是一样的，具体过程取决于你用的环境。比如如果你用的是visual studio 2012，那就搜“visual studio 2012 调试”，然后照着学就行了。[/quote]谢谢！

引用 4 楼 xujin12368 的回复:我还不怎么会调试，能简单说明一下吗。。我是小白。。。谢谢 调试是必须要学会的。不难。 调试的思路都是一样的，具体过程取决于你用的环境。比如如果你用的是visual studio 2012，那就搜“visual studio 2012 调试”，然后照着学就行了。

引用 2 楼 user-1 的回复:这两行在编译器看来是这样的： if(digit==5)   ; i=1; 这种问题，单步调试一下会更容易看出来我还不怎么会调试，能简单说明一下吗。。我是小白。。。谢谢

引用 1 楼 user-1 的回复:if(digit==5); // 这行结尾多了个分号             i=1;  // 所以这行永远会执行谢谢你哈。我今天写太多代码了，眼都瞎了。。。。


Question: ACM格式错误帮忙看一下

看看是不是行末多输出空格，多输出一行，类似这些问题


Question: 求大神：邻接表实现普利姆算法的c语言实现

仅供参考：  #include<stdio.h> #include<stdlib.h> #include<string.h> typedef int VRType; typedef char InfoType; #define MAX_NAME 3 /* 顶点字符串的最大长度+1 */ #define MAX_INFO 20 /* 相关信息字符串的最大长度+1 */ #define INT_MAX  100 #define INFINITY INT_MAX      //最大值 #define MAX_VERTEX_NUM 20    // 最大顶点个数  typedef char VertexType[MAX_NAME]; typedef enum {DG,DN,UDG,UDN} GraphKind; typedef struct  	/* 记录从顶点集U到V-U的代价最小的边的辅助数组定义 */ { 	VertexType adjvex; 	VRType lowcost; }minside[MAX_VERTEX_NUM];  typedef struct { 	VRType adj;             // 顶点关系类型。对无权图，用1(是)或0(否)表示相邻否；  	// 对带权图，c则为权值类型  	InfoType *info;         // 该弧相关信息的指针(可无) }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM];  typedef struct { 	VertexType vexs[MAX_VERTEX_NUM];   //顶点向量  	AdjMatrix arcs;                    // 邻接矩阵  	int vexnum,arcnum;                 // 图的当前顶点数和弧数  	GraphKind kind;                    //图的种类标志 }MGraph;  int LocateVex(MGraph G,VertexType u) {  	int i; 	for(i=0;i<G.vexnum;++i) 		if(strcmp(u,G.vexs[i])==0) 			return i; 	return -1; }  int CreateUDN(MGraph *G) 	/* 采用数组(邻接矩阵)表示法,构造无向网G。*/ { 	int i,j,k,w,IncInfo; 	char s[MAX_INFO],*info; 	VertexType va,vb; 	printf("请输入无向网G的顶点数,边数,边是否含其它信息(是:1,否:0): "); 	scanf("%d,%d,%d",&(*G).vexnum,&(*G).arcnum,&IncInfo); 	printf("请输入%d个顶点的值(<%d个字符):\n",(*G).vexnum,MAX_NAME); 	for(i=0;i<(*G).vexnum;++i)  // 构造顶点向量  		scanf("%s",(*G).vexs[i]); 	for(i=0;i<(*G).vexnum;++i) // 初始化邻接矩阵  		for(j=0;j<(*G).vexnum;++j) 		{ 			(*G).arcs[i][j].adj=INFINITY; /* 网 */ 			(*G).arcs[i][j].info=NULL; 		} 		printf("请输入%d条边的顶点1 顶点2 权值(以空格作为间隔): \n",(*G).arcnum); 		for(k=0;k<(*G).arcnum;++k) 		{ 			scanf("%s%s%d%*c",va,vb,&w); /* %*c吃掉回车符 */ 			i=LocateVex(*G,va); 			j=LocateVex(*G,vb); 			(*G).arcs[i][j].adj=(*G).arcs[j][i].adj=w; /* 无向 */ 			if(IncInfo) 			{ 				printf("请输入该边的相关信息(<%d个字符): ",MAX_INFO); 				gets(s); 				w=strlen(s); 				if(w) 				{ 					info=(char*)malloc((w+1)*sizeof(char)); 					strcpy(info,s); 					(*G).arcs[i][j].info=(*G).arcs[j][i].info=info; /* 无向 */ 				} 			} 		} 		(*G).kind=UDN; 		return 1; }   int minimum(minside SZ,MGraph G) { /* 求closedge.lowcost的最小正值 */ 	int i=0,j,k,min; 	while(!SZ[i].lowcost) 		i++; 	min=SZ[i].lowcost; /* 第一个不为0的值 */ 	k=i; 	for(j=i+1;j<G.vexnum;j++) 		if(SZ[j].lowcost>0) 			if(min>SZ[j].lowcost) 			{ 				min=SZ[j].lowcost; 				k=j; 			} 			return k; }  void MiniSpanTree_PRIM(MGraph G,VertexType u) { /* 用普里姆算法从第u个顶点出发构造网G的最小生成树T,输出T的各条边  */ 	int i,j,k; 	minside closedge; 	k=LocateVex(G,u); 	for(j=0;j<G.vexnum;++j) /* 辅助数组初始化 */ 	{ 		if(j!=k) 		{ 			strcpy(closedge[j].adjvex,u); 			closedge[j].lowcost=G.arcs[k][j].adj; 		} 	} 	closedge[k].lowcost=0; /* 初始,U={u} */ 	printf("最小代价生成树的各条边为:\n"); 	for(i=1;i<G.vexnum;++i) 	{ /* 选择其余G.vexnum-1个顶点 */ 		k=minimum(closedge,G); /* 求出T的下一个结点：第K顶点 */ 		printf("(%s-%s)\n",closedge[k].adjvex,G.vexs[k]); /* 输出生成树的边 */ 		closedge[k].lowcost=0; /* 第K顶点并入U集 */ 		for(j=0;j<G.vexnum;++j) 			if(G.arcs[k][j].adj<closedge[j].lowcost) 			{ /* 新顶点并入U集后重新选择最小边 */ 				strcpy(closedge[j].adjvex,G.vexs[k]); 				closedge[j].lowcost=G.arcs[k][j].adj; 			} 	} }  void main() { 	MGraph G; 	CreateUDN(&G); 	MiniSpanTree_PRIM(G,G.vexs[0]); }


Question: c语言结构休数据赋值

#include <stdio.h> #include <stdlib.h> #include <string.h>  typedef struct ns1__ArrayOfSeat SeatsInfo;  typedef struct ns1__Seat SeatItem;  // 建议用这种方式，或者链表的方式。 struct ns1__ArrayOfSeat { 	int __sizeSeat; 	SeatItem __itemSeats[]; };  struct ns1__Seat { 	char *Name; 	char *IDCard; 	char *Phone; };  int main(void) { 	SeatsInfo *lpSeats = malloc(sizeof(SeatsInfo) + sizeof(SeatItem) * 3); 	if (lpSeats != NULL) 	{ 		// 分配内存 		lpSeats->__sizeSeat = 3; 		// 如果赋值来自于字符串常量，那么请直接给指针赋值即可。 		// 一般来说，这些值都是从其他地方读取，或者参数传递等。 		// 如果赋值来自于参数或者文件，必须用 strdup，最终必须释放。 		lpSeats->__itemSeats[0].Name = strdup("测试一"); 		lpSeats->__itemSeats[0].IDCard = strdup("0001"); 		lpSeats->__itemSeats[0].Phone = strdup("13505710001"); 		lpSeats->__itemSeats[1].Name = strdup("测试二"); 		lpSeats->__itemSeats[1].IDCard = strdup("0002"); 		lpSeats->__itemSeats[1].Phone = strdup("13505710002"); 		lpSeats->__itemSeats[2].Name = strdup("测试三"); 		lpSeats->__itemSeats[2].IDCard = strdup("0003',""); 		lpSeats->__itemSeats[2].Phone = strdup("13505710003");  		// 释放内存 		for (int i = 0; i < lpSeats->__sizeSeat; i++) 		{ 			char *lpName = lpSeats->__itemSeats[i].Name; 			if (lpName != NULL) 			{ 				free(lpName); 			} 			char *lpIdCard = lpSeats->__itemSeats[i].IDCard; 			if (lpIdCard != NULL) 			{ 				free(lpIdCard); 			} 			char *lpPhone = lpSeats->__itemSeats[i].Phone; 			if (lpPhone != NULL) 			{ 				free(lpPhone); 			} 		} 		free(lpSeats); 	} 	return 0; }

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

字符串赋值使用strcpy

定义的同时进行初始化 struct {    char *name;    int age;  } stu[2] = { {"jo", 27}, {"y", 30} };  先定义,后初始化,整体赋值 s[1] = (struct stu){23,"hello"}  先定义,后初始化 分开赋值 s[1].age=12;  strcpy(stu[1].name, "hello");

你是要实现一个顺序存储的线性表吗？你可以写一些函数维护这个线性表，比如像下面这样 你还可以添加对应的get函数，delete函数等等  #include "stdio.h" #include "stdlib.h" #include "string.h"  typedef struct ns1__ArrayOfSeat { int __sizeSeat;	/* sequence of elements <Seat> */ struct ns1__Seat *Seat;	/* optional element of type ns1:Seat */ } Seats;  typedef struct ns1__Seat { char *Name;	/* optional element of type xsd:string */ char *IDCard;	/* optional element of type xsd:string */ char *Phone;	/* optional element of type xsd:string */ } Seat;  void seatsInit(Seats *p_seats) { 	p_seats->__sizeSeat = 0; 	p_seats->Seat = (Seat*)malloc(sizeof(Seat) * 1024); } void seatsInsert(Seats *p_seats, Seat *p_seat) { 	(p_seats->Seat)[p_seats->__sizeSeat++] = *p_seat; } void printSeats(Seats *p_seats) { 	int i = 0; 	for( ; i<p_seats->__sizeSeat; i++) 	{ 		printf("%s %s %s\n", (p_seats->Seat[i]).IDCard, (p_seats->Seat[i]).Name, (p_seats->Seat[i]).Phone); 	} } void destroySeats(Seats *p_seats) { 	free(p_seats->Seat); } int main() { 	Seat s1 = {"测试一","0001","13505710001"}; 	Seat s2 = {"测试二","0002","13505710002"}; 	Seat s3 = {"测试三","0003","13505710003"}; 	Seats ss; 	seatsInit(&ss); 	seatsInsert(&ss, &s1); 	seatsInsert(&ss, &s2); 	seatsInsert(&ss, &s3); 	printSeats(&ss); 	destroySeats(&ss); 	getchar(); 	return 0; }

struct ns1__Seat ss [] ={ {"测试一","0001","13505710001"},  {"测试二","0002","13505710002"},  {"测试三","0003',"13505710003"}  }; struct ns1__ArrayOfSeat seats = { _countof(ss), ss };

简单写了下，可以这样赋值。  #include <stdio.h> #include <stdlib.h> #include <malloc.h>  typedef struct ns1__ArrayOfSeat { 	int __sizeSeat;	/* sequence of elements <Seat> */ 	struct ns1__Seat *Seat;	/* optional element of type ns1:Seat */ } seats;  struct ns1__Seat { 	char *Name;	/* optional element of type xsd:string */ 	char *IDCard;	/* optional element of type xsd:string */ 	char *Phone;	/* optional element of type xsd:string */ };  void main() { 	seats seatsArray[3] = {0}; 	seatsArray[0].Seat = (ns1__Seat *)malloc(sizeof(ns1__Seat)); 	seatsArray[1].Seat = (ns1__Seat *)malloc(sizeof(ns1__Seat)); 	seatsArray[2].Seat = (ns1__Seat *)malloc(sizeof(ns1__Seat));  	seatsArray[0].Seat->IDCard = "测试1"; 	seatsArray[0].Seat->Name = "0001"; 	seatsArray[0].Seat->Phone = "13505710001";  	seatsArray[1].Seat->IDCard = "测试2"; 	seatsArray[1].Seat->Name = "0002"; 	seatsArray[1].Seat->Phone = "13505710002";  	seatsArray[2].Seat->IDCard = "测试3"; 	seatsArray[2].Seat->Name = "0003"; 	seatsArray[2].Seat->Phone = "13505710003";  	printf("%s\t%s\t%s\n",seatsArray[0].Seat->IDCard,seatsArray[0].Seat->Name,seatsArray[0].Seat->Phone); 	printf("%s\t%s\t%s\n",seatsArray[1].Seat->IDCard,seatsArray[1].Seat->Name,seatsArray[1].Seat->Phone); 	printf("%s\t%s\t%s\n",seatsArray[2].Seat->IDCard,seatsArray[2].Seat->Name,seatsArray[2].Seat->Phone); }


Question: 大家好，我想用C语言写一段程序，但是没有头绪，求大神来教教我！

python吧.

引用 3 楼 talkdream 的回复:关注  thank关注

关注

引用 1 楼 bjym1987 的回复:爬虫，正则，curl  听不懂额。。怎么做呢？

爬虫，正则，curl

引用 11 楼 zhao4zhong1 的回复:在百度搜“C源代码 curl regex”  好的

在百度搜“C源代码 curl regex”

看起来有点复杂哦，

引用 1 楼 bjym1987 的回复:爬虫，正则，curl  只会C是不是写不出来。。？

引用 5 楼 zhao4zhong1 的回复:使用curl库下载网页内容 使用regex正则表达式查找关键字 正则表达式速查 正则表达式举例 正则表达式学习 (4页A4纸)http://download.csdn.net/detail/zhao4zhong1/1808549 正则表达式参考下面：//凡是？。！后面跟1～1000后面跟半角.的，在？。！后面加回车换行。 //in.txt: //1.测试。2.测试2？3.测试3！4.测试 //四。5.测试。6.测试6？7.测试3！8.测试 //运行该程序将输出重定向到比如out.txt即可将输出保存到文件out.txt中 #include <iostream> #include <fstream> #include <string> #include <regex> using namespace std; int main() {     wifstream wifs("in.txt");     wifs.imbue(locale("chs"));     wstring wstr(L""),wln;     while (wifs) {         getline(wifs,wln);         wstr+=wln;     }     wifs.close();     wcout.imbue(locale("chs"));     wcout << wstr << endl;      wstring rs = L"([？。！])(\\d{1,3}\\.)";     wregex expression(rs);     wstr = regex_replace(wstr, expression, wstring(L"$1\r\n$2"));     wcout << wstr << endl;      return 0; } //1.测试。2.测试2？3.测试3！4.测试四。5.测试。6.测试6？7.测试3！8.测试 //1.测试。 //2.测试2？ //3.测试3！ //4.测试四。 //5.测试。 //6.测试6？ //7.测试3！ //8.测试 //    只会C是不是写不出来。。？


Question: 谁帮我看下这多线程错在哪里！

引用 4 楼 qq423399099 的回复: #include<stdio.h> #include<stdlib.h> #include<time.h> #include<process.h> struct mystruct { 	int *p;//传递线程的头 	int intel;//长度 	int sum;//需要查找的值 	int id;//编号 };  void lens(void *pd) { 	struct mystruct *ps = (struct mystruct *)pd;  	for (int *pi = ps->p; pi < ps->p + ps->intel; pi++) 	{ 		if (*pi == ps->sum) 		{ 			printf("线程%d已经找到值%d，地址为%p\n", ps->id, *pi, pi); 			return; 		} 	} 	printf("线程%d查找结束，未找到！\n", ps->id); }  void main() { 	int sum = 0; 	int array[100] = { 0 }; 	time_t ts; 	unsigned int times = time(&ts); 	srand(times); 	for (int i = 0; i < 100; i++) 	{ 		array[i] = rand() % 100; 	} 	for (int i = 0; i < 100; i++) 	{ 		printf("%3d", array[i]); 		if ((i + 1) % 10 == 0) 		{ 			printf("\n"); 		} 	}   	scanf("%d", &sum); 	struct mystruct xc[10]; 	for (int i = 0; i < 10; i++) 	{  		xc[i].p = array + 10 * i; 		xc[i].intel = 10; 		xc[i].id = i; 		xc[i].sum = sum; 		_beginthread(lens, 0, &xc[i]); 	} 	system("pause"); }  非常感谢！

引用 3 楼 cutmelon 的回复:仔细看了一下，char array[100] = { 0 };这句替换成int array[100];，不然你的指针就乱了  感谢  疏忽了！

看你的代码，意思是随机产生100个数，然后启动10个线程，每个线程负责10个数字，在这10个数字中找到输入的一个数，是吧？这里头有随机的，只有一个线程能找到不是很正常吗？你要输入大于100的数，一个都找不到呢

没人帮我看看啊？


Question: 如何实现socket通信编程——客户端的一次连接多次发送


Question: 对递归不是很懂，求看下一段小代码（好人一生平安 求助大神）

这个就是一个放的规律问题，也就是所谓的“右上方”，其实放置规则是这样的（来着百度） (1) 将1放在第一行中间一列; 　　 (2) 从2开始直到n×n止各数依次按下列规则存放： 　　 按 45°方向行走，如向右上 　　 每一个数存放的行比前一个数的行数减1，列数加1 　　 (3) 如果行列范围超出矩阵范围，则回绕。 　　 例如1在第1行，则2应放在最下一行，列数同样加1; 　　 (4) 如果按上面规则确定的位置上已有数，或上一个数是第1行第n列时，则把下一个数放在上一个数的下面。 弄懂了规则就是转化成代码的问题了，先吃饭去了，下午在告诉你吧，，，，

引用 1 楼 qq423399099 的回复:“给定一个小点的输入，完整单步跟踪(同时按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史)一遍。”是理解递归函数工作原理的不二法门！ 递归函数关注以下几个因素 ·退出条件 ·参数有哪些 ·返回值是什么 ·局部变量有哪些 ·全局变量有哪些 ·何时输出 ·会不会导致堆栈溢出  我是新手  您那个操作还能更简单的点么？》？ 我用的是DEC 编译器

引用 3 楼 yd2011222 的回复:[quote=引用 2 楼 cyfcsd 的回复:] 你得把问题说一下啊，没办法从你的代码推导你的业务逻辑啊  您好   这个问题就是求一个  一个 n 阶方阵的元素是1,2,...,n^2,它的每行，每列和2条对角线上元素的和相等，这样 的方阵叫魔方。n为奇数时我们有1种构造方法，叫做“右上方” ，例如下面给出n=3，5，7时 的魔方. 3 8 1 6 3 5 7 4 9 2 5 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 7 30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 16 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20 第1行中间的数总是1，最后1行中间的数是n^2,他的右边是2，从这三个魔方，你可看出“右 上方”是何意。      Input 包含多组数据，首先输入T,表示有T组数据.每组数据1行给出n(3<=n<=19)是奇数。     Output 对于每组数据，输出n阶魔方，每个数占4格，右对齐     Sample Input 2 3 5    Sample Output    8   1   6    3   5   7    4   9   2   17  24   1   8  15   23   5   7  14  16    4   6  13  20  22   10  12  19  21   3   11  18  25   2   9   [/quote]  我想请问下       这个程序到底怎么运行的

引用 2 楼 cyfcsd 的回复:你得把问题说一下啊，没办法从你的代码推导你的业务逻辑啊  您好   这个问题就是求一个  一个 n 阶方阵的元素是1,2,...,n^2,它的每行，每列和2条对角线上元素的和相等，这样 的方阵叫魔方。n为奇数时我们有1种构造方法，叫做“右上方” ，例如下面给出n=3，5，7时 的魔方. 3 8 1 6 3 5 7 4 9 2 5 17 24 1 8 15 23 5 7 14 16 4 6 13 20 22 10 12 19 21 3 11 18 25 2 9 7 30 39 48 1 10 19 28 38 47 7 9 18 27 29 46 6 8 17 26 35 37 5 14 16 25 34 36 45 13 15 24 33 42 44 4 21 23 32 41 43 3 12 22 31 40 49 2 11 20 第1行中间的数总是1，最后1行中间的数是n^2,他的右边是2，从这三个魔方，你可看出“右 上方”是何意。      Input 包含多组数据，首先输入T,表示有T组数据.每组数据1行给出n(3<=n<=19)是奇数。     Output 对于每组数据，输出n阶魔方，每个数占4格，右对齐     Sample Input 2 3 5    Sample Output    8   1   6    3   5   7    4   9   2   17  24   1   8  15   23   5   7  14  16    4   6  13  20  22   10  12  19  21   3   11  18  25   2   9

继续 递归过程是一个“环环相套”过程，难点在于找到合适的分界点。我的经验是先用自己的话描述一下，我们写的递归函数到底是干啥的 这里的函数很简单，就是将第step个数放到第i行第j列的位置上 如果这个地方没有放数字，体现在程序中为等于0，那么就把step放到这个位置上，然后这一步就完成了，调用自身放step+1到i-1行，j+1列，这里为了防止出现负数，各加一个n 如果这个地方已经有了数字，那么step不能在这儿放了，我们就就把step放到前一个的下一个，也就是i+2，j-1的地方 最后是递归出口，当step达到最大n*n+1时，证明已经放完了，退出程序即可，于是便有了下面的代码  void gen_cube(int i, int j, int step){ 	if (step == n * n + 1){//已经放满了，结束程序 		return ; 	} 	if (matrix[i][j] == 0){ //如果这个地方是0，即没有数字，直接放上就可以了 		matrix[i][j] = step;  		gen_cube((n + i - 1) % n, (n + j + 1) % n, step + 1);//放下一个 	} 	else{	//否则，则将step放到前一个的下面 		gen_cube((n + i + 2) % n, (n + j - 1) % n, step); 	} }  你的那份代码大概也是这个意思，但代码不太清晰，你主要理解一下吧

你得把问题说一下啊，没办法从你的代码推导你的业务逻辑啊


Question: 使用C语言或者C++开发http应用使用什么库

又建一楼

基于libcurl实现的HTTP客户端 https://hewei.blog.csdn.net/article/details/80828974

libcurl

MFC的内裤

http://blog.csdn.net/haifengzhilian/article/details/43669909  一大把

pico算是个现成的库，C++的。

http://git.oschina.net/1050676515/http-test/tree/master/http-test?dir=1&filepath=http-test&oid=be70dc3cf2d6f06bee9a4a3834da75ff0aeaa4c7&sha=6861130379832e97c2a69e60ac47b042ff31791a 以前写过一点Demo

好像可以使用WinInet来开发，不过这方面的资料太少了，有没有什么书籍或者详细点的资料啊？

curl 凑字数


Question: 求救 把一个目录下的所有.bmp和.jpg文件找到， 包含路径的文件名添加到一个文件列表(链表)中

system("dir /b /a-d c:\\*.* >d:\\allfiles.txt"); //读文件d:\\allfiles.txt的内容即C:\\下所有文件的名字 system("dir /b /a-d /s c:\\*.* >d:\\allfilesinsub.txt"); //读文件d:\\allfilesinsub.txt的内容即C:\\下所有文件的名字包含子目录 system("dir /b /ad  c:\\*.* >d:\\alldirs.txt"); //读文件d:\\alldirs.txt的内容即C:\\下所有子目录的名字 请记住，能用shell命令获取文件、文件夹信息或者操作文件、文件夹最好用shell命令获取或者操作，而不要用各种API获取或者操作，因为当遇到非法文件夹名或非法文件名或非法文件长度、非法文件日期、压缩文件、链接文件、稀疏文件……等各种意料之外的情况时，API会处理的不全面或陷入死循环，而shell命令不会。 如果嫌system黑窗口一闪，将system("...")替换为WinExec("cmd /c ...",SW_HIDE);

FILE* pf_path_file; // 搜索lp_path目录包括子目录所有文件名，保存到输出out_file_name int find_path_save_file(const char* lp_path , const char* out_file_name) {     pf_path_file = fopen(out_file_name, "w");     int cnt = find_path(lp_path);     fclose(pf_path_file);     return cnt; }  // 遍历搜索目录 int find_path(const char* lp_path) {     static int cnt = 0;     HANDLE hFile;  // windows对文件的操作首先要得到一个文件句柄     FILETIME ft;  SYSTEMTIME st; // 文件时间 和 系统时间     WIN32_FIND_DATAA wfd;  // WIN32_FIND_DATAA 是windows定义的查找文件的结构     char sz_path[MAX_PATH] = {0};     char buf[MAX_PATH * 2 ] = {0};     strcpy(sz_path, lp_path);     strcat(sz_path, "\\*.*");     hFile = FindFirstFile(sz_path, &wfd);  // FindFirstFile函数查找一个文件，sz_path是要查找的文件名，可以是全路径或相对路径，也可以写通配符，如“c:/*.*”      if (hFile != INVALID_HANDLE_VALUE) {         while (FindNextFile(hFile, &wfd)) {  // 利用第一次找到的文件句柄，继续寻找下个文件，如果找到下个文件，则函数填充wfd结构，并返回true             if (wfd.cFileName[0] == '.') continue; // . 当前目录 .. 上级目录符号  跳过去              if (wfd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { // 判断，得出找到的文件名是否是一个文件夹，如果是，则递归调用查找函数，由此实现深度全文件夹搜索                 strcpy(sz_path, lp_path);                 strcat(sz_path, "\\");                 strcat(sz_path, wfd.cFileName);                 find_path(sz_path);   // 调用递归查找              } else {                 ft = wfd.ftLastWriteTime;                 FileTimeToSystemTime(&ft, &st);                  sprintf(buf , "%d-%02d-%02d  %02d:%02d  %10u | ", st.wYear, st.wMonth, st.wDay, st.wHour + 8, st.wMinute , wfd.nFileSizeLow); //                 sprintf(buf + 32, "%s | %s", wfd.cFileName , lp_path);                  fprintf(pf_path_file , "%s\n" , buf);    ++cnt;   // 保存记录out_file_name ， 返回保存的记录数             }         }     }     return cnt; }

用 _findfirst 和 _findnext 查找文件


Question: opengl 获取矩阵的问题

自己写一个咯，这几个基本的不难写,参考https://github.com/datenwolf/linmath.h


Question: 用vc++ 6.0编写c程序，用fgets读取txt文件内容无结果

这里做判断是确保你的输入是一个整数，如果成功scanf函数返回1，否则可能出错

引用 4 楼 qq13020110 的回复:有两点你需要注意： 1、 while(1 != scanf("%d",&i)) { } 2、输出回车的原因可能是，"H:\\ghostseonnnn\\xuankeqingkuang.txt"中H:\\ghostseonnnn这个路径压根不存在，文件之前没有创建成功，怎么能读出来在执行输出文件之后文件被创建成功了的，而且路径是没问题的，第一点不是很明白，是在function3那里录入 I 的地方吗？新手不太懂

引用 3 楼 zhao4zhong1 的回复:仅供参考：//NAME: essaie bla bla //DIMENSION: 8 //DATA //1  14  15 //2  11  10 //3  6   4 //4  7   13 //5  9   21 //6  19  3 //7  1   5 //8  8   8 //EOF // // 文本文件中可能还含有其他内容，但是需要用到的内容即以上  //比如data.txt: //NAME: essaie bla bla //其它内容 //DIMENSION: 8 //其它内容 //DATA //其它内容 //1  14  15 //其它内容 //2  11  10 //其它内容 //3  6   4 //其它内容 //4  7   13 //其它内容 //5  9   21 //其它内容 //6  19  3 //其它内容 //7  1   5 //其它内容 //8  8   8 //其它内容 //EOF  // 目标是要获取NAME后字串，DIMENSION后数值，以及DATA以下的数值 // 其中NAME就是随便个字句，DIMENSION是城市数量，DATA以下是城市编号，X坐标，Y坐标 // 所有的这些将赋值给一个事先定义好的结构 #include <stdio.h> #include <string.h> #define MAXCPL   80   //每行最大字符数 #define MAXCITY  100  //每组数据中DATA最多项数，DIMENSION的最大值 #define MAXNAMEL 32   //NAME最大长度 struct S {     char NAME[MAXNAMEL+1];     int  DIMENSION;     struct D {         int NO;         int X;         int Y;     } DATA[MAXCITY]; } s; FILE *f; int st,n,i; char ln[MAXCPL]; int main() {     f=fopen("data.txt","r");     if (NULL==f) {         printf("Can not open file data.txt!\n");         return 1;     }     st=0;     n=0;     while (1) {         if (NULL==fgets(ln,MAXCPL,f)) break;         if (st==0) {             if (1==sscanf(ln,"NAME: %32[^\n]",s.NAME)) st=1;         } else if (st==1) {             if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;         } else if (st==2) {             if (0==strcmp(ln,"DATA\n")) st=3;         } else if (st==3) {             if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {                 n++;                 if (n>=MAXCITY || n>=s.DIMENSION) break;             }         }     }     fclose(f);     printf("s.NAME=[%s]\n",s.NAME);     printf("s.DIMENSION=%d\n",s.DIMENSION);     for (i=0;i<n;i++) {         printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);     }     return 0; } //s.NAME=[essaie bla bla] //s.DIMENSION=8 //s.DATA[0].NO,X,Y=1,14,15 //s.DATA[1].NO,X,Y=2,11,10 //s.DATA[2].NO,X,Y=3,6,4 //s.DATA[3].NO,X,Y=4,7,13 //s.DATA[4].NO,X,Y=5,9,21 //s.DATA[5].NO,X,Y=6,19,3 //s.DATA[6].NO,X,Y=7,1,5 //s.DATA[7].NO,X,Y=8,8,8  没看懂新手

引用 1 楼 qq423399099 的回复:敢问你的function2哪句是在输出文件？？ 完全就是在读入一个文件啊？不不不，说错了，是function3.。。。。不好意思

敢问你的function2哪句是在输出文件？？ 完全就是在读入一个文件啊？


Question: 问：如何判断当前是否已设定种子数

你重新再初始化一次并不会影响什么

引用 13 楼 zhao4zhong1 的回复:[quote=引用 11 楼 ccssddnn218 的回复:] [quote=引用 7 楼 zhao4zhong1 的回复:] 啥叫“合理的”随机数？ 谢谢“赵4老师”关注。我认为的“合理”随机数，就是程序启动到结束只设置一次种子数，以后获取随机数时都是根据这个初始种子数来的，中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。[/quote] 试试Inline Hook msvcrt.dll 中的srand函数，在其中判断如果当前进程调用srand当且仅当一次且参数不是0 不是VC6 Release版exe的话，msvcr*.dll[/quote] 您隐含的意思是这样吗？放弃在标准C的srand上继续纠结了，有其他库可以完成想要的结果。

引用 14 楼 zhao4zhong1 的回复:WinAPIOverridehttp://jacquelin.potier.free.fr/winapioverride32/ 谢谢！很不错的工具，要好好学习一下。

我这句话的意思很直白，没有隐含意思。

仅供参考：#include <conio.h> void main() {     int r,k;     cprintf("Press any key to get a real random number(0..99) ...");     r=0;     while (1) {         r=(r+1)%100;         if (kbhit()) {             k=getch();             if (0==k || 0xe0==k) getch();             break;         }     }     cprintf("\r\n%d\r\n",r); }

啥叫“合理的”随机数？

引用 11 楼 ccssddnn218 的回复:[quote=引用 7 楼 zhao4zhong1 的回复:] 啥叫“合理的”随机数？ 谢谢“赵4老师”关注。我认为的“合理”随机数，就是程序启动到结束只设置一次种子数，以后获取随机数时都是根据这个初始种子数来的，中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。[/quote] 试试Inline Hook msvcrt.dll 中的srand函数，在其中判断如果当前进程调用srand当且仅当一次且参数不是0 不是VC6 Release版exe的话，msvcr*.dll

static bool check = true; if(check) {     rand(); //你的取随机数代码     check = false; } 再你的函数内部，加入这样一段代码，即可保证rand只执行一次

引用 7 楼 zhao4zhong1 的回复:啥叫“合理的”随机数？ 谢谢“赵4老师”关注。我认为的“合理”随机数，就是程序启动到结束只设置一次种子数，以后获取随机数时都是根据这个初始种子数来的，中间没有修改过种子的值。再次启动时随机数产生的顺序不和上次相同。

可以在 main 的第一句设置一次。 以后也不用判断。

如果仅仅是随机数的话，可以自定义随机数发生器 C++可以定义随机数发生器类 C就定义一个结构和 跟结构关联的算法就可以了 这样随机数就成为为 对象而不是 库函数了 随机数发生器对象和其他随机数发生器对象互不干扰 C++11库中就有这种随机数发生器类

随机数算法的随机就在于别人不知道种子和调用次数，只要两者做到隐藏其中一个，算法就是随机的。

随机和均匀是两回事。对外部来讲，就算你重置了种子，结果还是随机的。(种子通常是时间，比较难准确定位)

引用 3 楼 qq423399099 的回复:好像没啥特别的方法。 不过有个取巧的办法，调用rand()时，如果用户在此之前没有调用过srand(seed)，它会自动调用srand(1)一次。  所以，如果楼主不想破坏原本的种子，那么自己提前手动在文件中先保存种子为1时，rand() % 100产生的10个随机数 然后运行程序后：直接调用rand() % 100产生10个随机数，看看和之前文件中保存的10个数一样吗，如果一样就有理由相信之前的代码没有srand过 方法可行、合理，略显复杂。依然谢谢你！

标准C肯定不行，不过特定的实现可以.实际换个随机数发生器，c++11这么多....  不过比较在意"如果再次设置，那就影响了原来的随机分布了"这句，一般就是用时间做为种子，不管怎样都会影响....

无解。（6个字凑数）


Question: 利用epoll实现linux下服务器和客户端之间的通信

建议楼主先学会使用抓包软件比如wireshark


Question: 请求帮助

搜不到呀....

在百度搜题目内容。


Question: 【江湖救急】为什么我输入的这段代码运行后，我的数组的值都变成了-1

引用 2 楼 qq423399099 的回复:sum += digit[i];应该是sum += digit[j];  #include<stdio.h> int main(void) { 	int digit[100]; 	int sum = 0; 	float ave = 0.0; 	int i = 0, j = 0; 	for (i = 0; i < 100; i++) 	{ 		scanf("%d", &digit[i]); 		if (digit[i] == -1) 			break; 	} 	for (j = 0; j < i; j++) 	{ 		sum += digit[j]; 	} 	ave = sum / i; 	printf("%d\n", sum); 	printf("%.2f\n", ave); 	return 0; } 谢谢你1

#include<stdio.h> int main(void) {     int digit[100];     int sum=0;     float ave=0.0f;     int i=0,j=0;     for (i=0;i<100;i++) printf("%d ",digit[i]);     printf("\n");     for(i=0;i<100;i++)     {         printf("Input digit[%d]:",i);fflush(stdout);         scanf("%d",&digit[i]);         if(digit[i]==-1)             break;     }     for(j=0;j<i;j++)     {         sum +=digit[j];     }     ave = (float)sum/i;     printf("sum:%d\n",sum);     printf("ave:%.2f\n",ave);     return 0; } //1311096 27 32 0 35 -1473595837 1311096 0 0 1 2090180133 268435456 1244912 2090180013 1315560 2090180041 1244976 13241797 -2136591274 3623968 3604840 56 3623968 3623976 3605848 -1995983848 56 0 3604480 1244244 0 1244828 2090172640 2090180464 -1 2090180460 270589708 3604480 0 48 0 0 2147348480 -1999473920 1244884 270609247 1244932 270608376 0 270609891 3624008 205 12 0 0 2147348480 0 2147348480 0 1244892 270579140 270944128 1244948 270609028 9 270609019 0 0 2147348480 36240080 1318752 1245104 270608376 270889264 -1 1244980 270608879 0 0 0 270887808 1320147 1245024 270579359 1320144 3624016 3624020 1245012 1245020 1320144 1320144 2 3624008 4 1245032 270577712 1245120 4199150 //Input digit[0]:9 //Input digit[1]:8 //Input digit[2]:7 //Input digit[3]:6 //Input digit[4]:-1 //sum:30 //ave:7.50 //


Question: 菜鸟 跪求大神解决 浮点数精度还有小数怎样存储？

float  格式为 1位符号位, 8位解码, 23 位尾数,  加上隐含的 1,  只有 24 的位的精度...   16.11 转化 为二进制为  1 0000. 0001 1100 0010 1000 1111,  最后一位四舍五入,  尾数就是 1. 0000 0001 1100 0010 1001 000,  阶码 4 (+128),  转成 10进制表示就是  16 +  1/16 + 12/256 + 2 / 4096 + 9 / 65536  = 16.1100006103515625

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

因为浮点数在内存中无法精确存储，只是存一个近似值。 所以我们在比较浮点数的时候，会设置一个误差值，如果小于这个误差我们就认为这两个浮点数相等。 http://blog.csdn.net/juanjuan888/article/details/6672517 http://bbs.csdn.net/topics/390676437


Question: linux下c语言gsoap传递结构体数组

struct ns1__ArrayOfSeat { int __sizeSeat;	/* sequence of elements <Seat> */ struct ns1__Seat *Seat;	/* optional element of type ns1:Seat */ };  对这个数据进行赋值要怎么写呢?

搜“序列化和反序列化”


Question: runtime error 问题

#include<stdio.h> #include<string.h> #include<stdlib.h> int main() {     int n,i,j,m;     char str[81];     while((n=atoi(gets(str)))!=0) {         i=0;         while(i<n) {             gets(str);             m=strlen(str);             for(j=0;j<m;j++) {                 if((str[j]>='a'&&str[j]<='z')||(str[j]<='Z'&&str[j]>='A')) {                     if(str[j]=='Z')                         str[j]='A';                     else if(str[j]=='z')                         str[j]='a';                     else str[j]++;                 }             }             i++;             printf("%s\n",str);         }     }     return 0; }


Question: 求解简单的P,V操作问题

有点像生产者消费者问题

p，v操作也属于C语言吗？


Question: 关于动态链表和动态线性表的建立

其实数组，字符串，链表，栈，队列，等等都可以看成 线性表 所谓线性表 指的是 表内所有元素顺次排列，没有分枝的一种数据结构 简称线表 与线表 想对的树，图，广义表 等数据结构，不是线表 另外哈希表，虽然经常用数组实现，但不是链表 因为它的元素，是稀疏地 线表的元素是挨个排列的 如果 ，实现线表的题目，是老师布置的作业，或者书上的作业 那么一般指的是，数据用数组或者指针表示， 并附加一个长度信息，表示表中元素数目，另一个 可以动态增长的数组 这么定义 int a[0]; 这样 整个数据结构为 stuct table{ int len; int a[0]; }; int n; table *p =()malloc(n*sizeof(a[0]) +sizeof(table); .....  至于链表，逐个分配节点内存，并存入数据，并把这些节点连接起来。就形成了链表 ..........................................

仅供参考：//带表头结点的单向链表 #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <time.h> struct NODE {     int          data;     struct NODE *next; } H,*head,*p,*q,*q1,*s1,*s2,*s3,*s4,*s; int i,j,k,n,t,m; int main() {     srand(time(NULL));      //填写头节点数据     H.data=-1;     H.next=NULL;     head=&H;      //创建10个节点的单链表     p=head;     for (i=0;i<10;i++) {         q=(struct NODE *)malloc(sizeof(struct NODE));         if (NULL==q) return 1;         q->data=rand()%100;//填写0..99的随机值         q->next=NULL;         p->next=q;         p=q;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将值为5的结点插入到单链表的第k个结点前     k=3;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=(struct NODE *)malloc(sizeof(struct NODE));             if (NULL==q) return 1;             q->data=5;             q->next=p->next;             p->next=q;             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //删除第k个节点     k=5;     n=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         n++;         if (k==n) {             q=p->next;             if (q) {                 p->next=q->next;                 free(q);             }             break;         }         p=p->next;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //从小到大排序     for (p=head;p!=NULL && p->next!=NULL;p=p->next) {         for (q=p->next;q!=NULL && q->next!=NULL;q=q->next) {             if (p->next->data > q->next->data) {                  //交换data //              printf("swap %02d %02d\n",p->next->data,q->next->data); //              t=p->next->data;p->next->data=q->next->data;q->next->data=t;                  //或者                  //交换next //              printf("swap %02d %02d\n",p->next->data,q->next->data);                 s1=p->next;                 s2=p->next->next;                 s3=q->next;                 s4=q->next->next;                  if (s2!=s3) {                      p->next=s3;                     s3->next=s2;                      q->next=s1;                     s1->next=s4;                 } else {                      p->next=s3;                     s3->next=s1;                            q=s3;                     s1->next=s4;                 }                  //输出整个单链表 //              s=head->next; //              while (1) { //                  if (NULL==s) { //                      printf("\n"); //                      break; //                  } //                  printf("%02d->",s->data); //                  s=s->next; //              } //              getchar();             }         }     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将整个链表逆序     if (head->next!=NULL && head->next->next!=NULL) {         p=head->next;         q=p->next;         p->next=NULL;         while (1) {             q1=q->next;             q->next=p;             p=q;             q=q1;             if (NULL==q) break;         }         head->next=p;     }      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //将单链表中前 m 个结点和后 n 个结点进行互换,m+n为链表总长10     m=4;     n=6;     k=0;     p=head;     while (1) {         if (NULL==p) {             break;         }         k++;         if (m+1==k) {             q=p;         }         s=p;         p=p->next;     }     s1=head->next;     head->next=q->next;     s->next=s1;     q->next=NULL;      //输出整个单链表     s=head->next;     while (1) {         if (NULL==s) {             printf("\n");             break;         }         printf("%02d->",s->data);         s=s->next;     }      //释放所有节点     p=head->next;     while (1) {         if (NULL==p) {             break;         }         q=p->next;         free(p);         p=q;     }      return 0; } //84->28->20->23->96->19->59->97->29->41-> //84->28->05->20->23->96->19->59->97->29->41-> //84->28->05->20->96->19->59->97->29->41-> //05->19->20->28->29->41->59->84->96->97-> //97->96->84->59->41->29->28->20->19->05-> //41->29->28->20->19->05->97->96->84->59-> //

所谓动态链表，是指在程序执行过程中从无到有地建立起一个链表，即一个一个地开辟结点和输入各结点数据，并建立起前后相链的关系。  #define _CRT_SECURE_NO_DEPRECATE #define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1 #include <stdio.h> #include <stdlib.h>  struct Student {     int No;//学号     struct Student *next; }; int main() {     struct Student *p1, *p2, *head;     int n = 0; //结点个数     head = NULL;     p1 = (struct Student *)malloc(sizeof(struct Student));     printf("请输入1个学号\n");     scanf("%d", &p1->No);     p2 = p1; //开始时，p1和p2均指向第1个结点     while (p1->No != 0)     {         n++;         if (n == 1)         {             head = p1;         }         else         {             p2->next = p1;         }         p2 = p1;//p2是最后一个结点         printf("请输入学号，输入0终止：\n");         p1 = (struct Student *)malloc(sizeof(struct Student));         scanf("%d", &p1->No);     };     p2->next = NULL;//输入完毕后，p2->next为NULL       //遍历动态链表     struct Student *p;     p = head;     while (p != NULL)     {         printf("%d,", p->No);         p = p -> next;     }     printf("\n");       system("pause"); }


Question: 初学者求助

初学者理解能力差点，见谅哈

为何scanf中要改%f为%lf

double对应%lf 你用%f读入double,可能只写入了8个字节中的4个字节，所以输出的值不对。 scanf("%lf",&b);

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


Question: 关于结构体动态分配内存的问题

有没有错自己编译器里试下就知道了 什么叫不知道分配多大的内存。

会提示出错吧，这样的话实际上不是还不知道该分配多大内存吗？

这样才对：  *stack = (Stack*)malloc(sizeof(Stack));

我想明白了，*arr只是一个地址而已。


Question: 求助c语音加密与解密

逻辑不难，建议楼主自己写一写，遇到问题再发上来

古典加密..


Question: 关于[指向数组的指针]和[指向数组首元素的指针]的问题

int array[10] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };//array指向该数组第一个元素的地址         int (*pa)[] = &array;//[]下标引用的优先级高于间接访问*,但是由于（）d的存在，首先执行的还是间接引用*pa;所以p是一个指针。接下来是下标引用[]，所以p指向一个数组。 初始化应该为int(*pa)[10]=&array;保证类型相同；此时p表示指向一个拥有10个整型元素的数组的指针。  array是数组名，数组名的值是一个指向该数组第一个元素的指针。第一个元素的指针和该数组的指针值是相等的。          printf( "pa = %d\n", pa );         printf( "&array = %d\n", &array );         printf( "array = %d\n", array );

你的例子中，1和2是同一种类型，3是一种类型，1、2与3类型是不同的，不过值是相同的

1、array不是指针，array是数组类型，数组类型不等于指针，最多说某些情况下可以退化为指针  2、int (*pa)[] = &array; 是错的，实际应该写成：int (*pa)[10] = &array; 此时pa指向的是int[10]类型的数组，而不是指向一个指针， pa的值就是数组的值  3、pa的类型是，int(*)[10]，不等于int**，不是二级指针

&array和&array[0]只是值相同，但意义和类型都是不同的。 其实&array和&array[0]结果都是数组的首地址，但他们的类型是不一样。 &array[0]也即对数组首元素取地址，array+1表示首地址+sizeof(元素类型)。 &array虽然值为数组首元素地址，但类型为：类型 (*)[数组元素个数],所以&array+1大小为：首地址+sizeof(array)。

引用 2 楼 zhao4zhong1 的回复:http://edu.csdn.net/huiyiCourse/detail/134  待到夜深人静时，好好学习下老师的课程


Question: 新手求助有关Josephus问题！！！好久都没写出来

有公式的，搜搜看。

引用 6 楼 zhao4zhong1 的回复:有公式的，搜搜看。已通过，谢谢老师

仅供参考：//假设有n个人团团围做，从第1个人开始数数，数到第m个人时候，第m个人出列， //然后继续从1开始数数，数到第m个人退出 #include <stdio.h> #include <conio.h> int i,k,t; int n,m; static char f[1001];//0该座位未出圈,1该座位已出圈 void main() {     while (1) {         printf("Input n m(1000>=n>=m>=1):");         fflush(stdout);         rewind(stdin);         if (2==scanf("%d%d",&n,&m)) {             if (1000>=n && n>=m && m>=1) break;         }     }     t=0;//已出圈总人数     i=1;//座位编号     k=1;//当前要数的数     while (1) {         if (0==f[i]) {             if (m==k) {                 t++;                 f[i]=1;                 printf("%3d ",i);                 if (0==t%10) printf("\n");                 if (t>=n) break;             }             k++;if (k>m) k=1;         }         i++;if (i>n) i=1;     }     cprintf("Press any key ...");     getch(); }

引用 1楼小灸舞 的回复:你忘记调用create_array_queue给arr和count初始化了  #include <stdio.h> #include <malloc.h> static int *arr=NULL; static int count; int create_array_queue(int sz)  { 	arr = (int *)malloc(sz*sizeof(int)); 	if (!arr)  	{ 		printf("arr malloc error!"); 		return -1; 	} 	count = 0;  	return 0; }  int destroy_array_queue()  { 	if (arr)  	{ 		free(arr); 		arr = NULL; 	}  	return 0; } void add(int val)  { 	arr[count++] = val; } int front()  { 	return arr[0]; } int pop()  { 	int i = 0; 	int ret = arr[0];  	count--; 	while (i++<count) 		arr[i-1] = arr[i];  	return ret; } int size()  { 	return count; } int is_empty() { 	return count==0; } int cal( int n) { 	int i,count,a; 	for(i=1;i<=n;i++) 		add(i); 	count=0; 	while(size()>1) 	{ 		count=count+1; 		if(count%2==0) 			pop(); 		else 			a=front(); 		pop(); 		add(a);	 	} 	return front(); } int main(void)  { 	int n; 	scanf("%d",&n); 	create_array_queue(n); 	cal(n);	   	printf("%d",front()); 	return 0;  }  单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。谢谢版主大大，不过我提交oj时显示时间超限，请问我可以在哪个地方进行优化？麻烦了

引用 3 楼 qq423399099 的回复:你这个程序貌似逻辑上还是有问题的，输入3应该输出的是3吧？，输入4结果也不对..... int cal( int n) {     int i,count,a;     for(i=1;i<=n;i++)//以3为例子，n=3         add(i);     count=0;     while(size()>1)     {         count=count+1//count=1,执行else，a=1，删除1，并将1置于队尾，队列为 2 3 1；			                 if(count%2==0)//count=2，执行if，删除2，队列为 3 1；             pop();//count=3，执行else，a=3，删除3，并将3置于队尾，队列为 1 3；         else//count=4，执行if，删除1，队列为3，跳出循环             a=front();             pop();             add(a);        }     return front(); } 你看看我的注释，我以3为例子进行了分析，为什么算出来的结果是3而vc运行的话却是1？还有我感觉这样的算法是不是太慢了，需要运行多次导致时间超限的结果？


学会使用Spy++软件。

就是想知道他的消息时怎么循环的

不明白楼主想研究什么？


Question: 求教，使用unsigned int总是显示错误，但总找不到原因

。。。。。真是无语

楼主为什么不 unsigned int k=(unsigned int)-3.1416; 呢？

无符号整型啊。。。。怎么能赋值负数呢？？？无符号整型只能赋值大于等于0的整数啊

unsigned int k=-2;有的编译器可以过编译，而有的编译器则不行。 楼主究竟想干嘛呢？

好负责任的编译器！你为什么要给一个无符号数赋值负数-2呢？-2是有符号整数。

系统显示  converting of negative value `-0x000000002' to `unsigned int' 求大神指导


Question: 编写一个程序，要求从键盘上输入50个同学的学号和C语言成绩，然后按照成绩从高到低进行排序，并将成绩写入到score.txt中

谢谢

两个很明显的错误： 1.strcpy(stemp, name[i]);，你的stemp是char类型的，strcpy需要的是char *类型（strcpy(name[j], stemp);同理） 2.if (fp = (fopen("e:\\score.txt", "w") == NULL))改成if ((fp = (fopen("e:\\score.txt", "w") )== NULL)) 因为==的优先级大于=


Question: 测试发现malloc申请空间超过60字节,free之后,内存的内容不会清除,,这是为什么

你们都没说到本质,本质是  printf函数内部里面很可能也使用了malloc 函数 申请了60以内的内存并覆盖了hellow world使用的内存,如果大于60 就不覆盖啦,

这个很正常，一般如果自己实现内存池的话，也是不会对释放的内存做处理的。操作系统也是一样

malloc和free 对应 借和还 不对应 创建和销毁。

引用 8 楼 yuanleiming 的回复:[quote=引用 1 楼 cyfcsd 的回复:] 释放后再 输出是未定义行为，跟60没啥关系 内存回收后指针还是指向原申请空间首址,回收后内存不会清除,按道理应该打印原字符串, 但为什么申请60字节以下,输出就是空,申请60字节以上输出就还是原来字符串,这一点还是不理解..[/quote] 你换个机器或者编译器试一下就知道了，跟60没关系的，free以后那块内存会不会被覆盖取决于你的机器和编译器，甚至是运行时的某些状态。 建议你理解一下语言标准和编译器实现的关系，语言标准是一种规定，比如if后面是真的话就执行if语句，这是肯定会发生的，否则就乱套了，编译器必须这么做才可以 但是标准并没有说你free内存之后，那块儿内存会怎么样，这就取决于你的编译器实现了，它可以去覆盖，也可以不去覆盖，而现在的编译器一般比较智能，即会根据具体情况去判断是不是该覆盖，而判断标准你是不知道的 总之，你free以后那块儿内存就不能用了，没有任何人可以保证内存小于60或者小于30就不会被覆盖

这个是操作系统管理的，标准库大多并不干预这些事，只是直接调用系统的释放接口即可。就像 Windows 文件恢复一样，系统只是把文件标记为删除，但实际上这块记录仍然存在，因此如果数据没有被改写的情况下，是可以恢复文件，是一样的道理。如果你在 C 盘里不小心删了文件，你就很难恢复，因为 C 盘是系统级别频繁读写的，所以数据被改写的可能性也很大。

引用 1 楼 cyfcsd 的回复:释放后再 输出是未定义行为，跟60没啥关系 内存回收后指针还是指向原申请空间首址,回收后内存不会清除,按道理应该打印原字符串, 但为什么申请60字节以下,输出就是空,申请60字节以上输出就还是原来字符串,这一点还是不理解..

引用 5 楼 yuanleiming 的回复:在网上查到确实是不会清空,malloc申请的空间大于60 字节后,输出的结果为什么和申请空间小于60的结果不一样,这一点不明白... 本身就是不支持这样用的，出了奇怪的结果，就不应该奇怪了。如果是偶然事件，那就不需要解释了，如果是必然事件你倒可以去查一查。

和编译器有关，VS下得不出楼主你的60字节结论

标准并没有规定，如何对待这块内存编译器可以有自己的行为  http://en.cppreference.com/w/c/memory/free

这就像你一不小心把文件删了, 只要没有放新的文件, 还是可以用数据恢复软件恢复出来的

free 以后，清空内存，是个吃力不讨好的事情，编译器一般都不会去做。 和文件删除一个道理，编译器只是把这块内存登记为可用，如此而已

当free一块内存后，free(即运行库)会将这块内存标记为未使用。 清不清空这块内存都是可以的（因为标准并没有规定），一般编译器出于效率考虑往往不清空.

free后要让string指向空，要不就成野指针了

释放后再 输出是未定义行为，跟60没啥关系


Question: 请教一下关于switch语句中变量定义的相关问题

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

[quote=引用 5 楼 qq_24393845 的回复:] [quote=引用 3 楼 qq423399099 的回复:] 因为PLink的作用域的问题所以报错，你把PLink往外挪一层就行了 [code=c] #include<stdio.h> #include<stdlib.h> #include"标头.h" int main(void) { 	int Order = 0; 	printf("请输入命令数：\n"); 	scanf("%d", &Order); 	printf("输入代码后回车。\n"); 	for (int i = 0; i < Order; i++) 	{ 		LnList PLink; 		char buf[20]; 		scanf_s("%s", buf, 19); 		switch (buf[0]) 		{ 		case 'C': 		{ 					PLink = (LnList)malloc(sizeof(LList)); 					PLink = createLnList();  					//这里我原来是PNode PLink = createLnList();的 					后来提示错误	2	error C2065 : “PLink” : 未声明的标识符	g : \学习\vs数据结构\链式顺序表\链式顺序表\源.cpp	38	1	链式顺序表  					“PLink” : 未声明的标识符  							  int test = 0; 					scanf("%d", &test); 					break; 		} 		case 'A': 		{ 					if (buf[1] = 'P') 					{ 						printf("输入添加的值：x=?\n"); 						int a = 0; 						scanf("%d", &a); 						appendElemLnList(PLink, a); 					} 					else 					{ 						int j, x; 						printf("请输入index和x（用空格隔开）。\n"); 						scanf("%d %d", &j, &x); 						inserPreLnList(PLink, j, x); 					} 					break; 		} 		case 'P': 		{ 					printLnList(PLink); 					break; 		} 		case 'R'://删除下标为p的节点，也就是删除第p+1个元素 		{ 					 printf("请输入要删除元素的下标：\n"); 					 int xiabiao; 					 scanf("%d", &xiabiao); 					 deleteIndexLnList(PLink, xiabiao + 1); 					 break; 		} 		case 'D': 		{ 					destroyLnList(PLink); 		} 		} 	} 	printf("\n\n\n输入任何字符可以关闭程序~\n\n"); 	getchar(); 	return 0; } 更多 0

引用 3 楼 qq423399099 的回复:因为PLink的作用域的问题所以报错，你把PLink往外挪一层就行了  #include<stdio.h> #include<stdlib.h> #include"标头.h" int main(void) { 	int Order = 0; 	printf("请输入命令数：\n"); 	scanf("%d", &Order); 	printf("输入代码后回车。\n"); 	for (int i = 0; i < Order; i++) 	{ 		LnList PLink; 		char buf[20]; 		scanf_s("%s", buf, 19); 		switch (buf[0]) 		{ 		case 'C': 		{ 					PLink = (LnList)malloc(sizeof(LList)); 					PLink = createLnList();  					//这里我原来是PNode PLink = createLnList();的 					后来提示错误	2	error C2065 : “PLink” : 未声明的标识符	g : \学习\vs数据结构\链式顺序表\链式顺序表\源.cpp	38	1	链式顺序表  					“PLink” : 未声明的标识符  							  int test = 0; 					scanf("%d", &test); 					break; 		} 		case 'A': 		{ 					if (buf[1] = 'P') 					{ 						printf("输入添加的值：x=?\n"); 						int a = 0; 						scanf("%d", &a); 						appendElemLnList(PLink, a); 					} 					else 					{ 						int j, x; 						printf("请输入index和x（用空格隔开）。\n"); 						scanf("%d %d", &j, &x); 						inserPreLnList(PLink, j, x); 					} 					break; 		} 		case 'P': 		{ 					printLnList(PLink); 					break; 		} 		case 'R'://删除下标为p的节点，也就是删除第p+1个元素 		{ 					 printf("请输入要删除元素的下标：\n"); 					 int xiabiao; 					 scanf("%d", &xiabiao); 					 deleteIndexLnList(PLink, xiabiao + 1); 					 break; 		} 		case 'D': 		{ 					destroyLnList(PLink); 		} 		} 	} 	printf("\n\n\n输入任何字符可以关闭程序~\n\n"); 	getchar(); 	return 0; } 更多 0 嗯 谢啦 还有，我改过了这个之后也改掉了一些细节不如buf[1]='P'改成==  但是之后成功运行之后，出现错误，程序关闭了。

引用 2 楼 qq_24393845 的回复:谢谢回复~感谢嗯 谢啦 还有，我改过了这个之后也改掉了一些细节不如buf[1]='P'改成==  但是之后成功运行之后，出现错误，程序关闭了。

谢谢回复~感谢

错误列表提示我CASE中的PLink是为定义的，这个问题怎么解决啊！


Question: C语言：英文算数计算系统，求大神帮忙！！！怎样才能输出像输出样例那样，我只会输出结果。

引用 4 楼 Nicky_Chardin 的回复:版主好 我也想问问这个程序，但是给的代码不知道为何我用除法或是取余数运算就会崩溃 崩溃的时候在弹出的对话框按相应按钮进入调试，按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处，看不懂时双击下一行，直到能看懂为止。

谢谢老师啦！

for(i=0;i<n;i++) {     if (val[i]>0) {          itoa(val[i], str, 10);//整数转换为字符串          printf("%s ",a[i]);//输出原表达式          for(j=0;j<strlen(str);j++)             printf("%s ",comp[str[j]-0x30]);     }     printf("\n"); }


递归也得有个让递归退出的条件啊 新手不太明白

不是死循环而是重入或间接递归调用了。我猜。 用TRACE宏代替MessageBox


Question: 结构体中对字符数组初始化为0的问题

俗人们总是热衷于做加法； 哲人们关键时候会做减法。

支持C++11编译器可以，比如VS2015  否则可以在构造函数里自己初始化为0

每增加一些东西，往往编译器要同样增加一些对这个东西相关的处理 比如C++11初始化表类型，就是为了统一初始化方式 C++ typeinfo 结构，对应 typeid C++ 模板的分离编译，这个能力最终被放弃了 数组迄今为止，不能互相赋值 new,delete 运算符，在库里需要实现内存分配算法， 编译器把分配内存。和初始化对象，这两个步骤糅合到 new 表达式 销毁对象，和释放内存 糅合到 delete 表达式

每种语言，都有他的哲学，甚至有些库也有，比如STL 并且随着版本的不同，不断的修改，完善 早期，C 语言的哲学是尽量简单，贴近硬件，贴近汇编 包括写成的语句，和语言内核本身 当时C是关键字最少的语言 当时提倡代码简短，标识符名字尽量的简短（哦，那个时代，编程语言，普遍只能识别8个字符） 这点，可以从C标准库看出来 当然。编译器实现起来，也要尽量简单 当时，自动数组都不能初始化 结构内的数组。自然也不能初始化了

你找个支持C++11的编译器才支持你这种写法

C语言中不允许这么做，在结构体里面和外面赋值是完全不同的概念 外面定义的，无论是局部变量还是全局变量，都是有内存被分配的，初始化就是初始化那块儿内存 而结构体本身的定义并不分配内存，只有定义结构体变量时才会分配内存，所以在里面的初始化语句并不是在编译结构体定义时起作用，而是要等到用结构体定义变量时才起作用，所以就显得不那么“自然了”，所以C就没有支持这种方法 C++中先是用构造函数的方法给出了一种折衷手段，但也不允许直接初始化，而是用一个函数来完成你要的初始化工作，原因同上，就是为了避免写的代码和底层操作“不协调” 后来到C++11，可能是为了方便程序员，标准也开始支持这种类内直接初始化了 顺便说一下，Java是支持的，C++“抄袭”了Java也不是没有可能

难道你可以对 那个 top 赋值吗？ 也是不可以的。  你那个不是定义变量，而是定义了一个类型。  不过最新的 C++ 就可以了。

http://blog.csdn.net/heyabo/article/details/8846662 http://blog.csdn.net/a_ran/article/details/44755759

简单说，就是不允许。 复杂的说呢，那就是猜了： 不在结构体里面的时候，不管是局部变量还是全局变量，编译器都要立即给他分配空间。分配了空间之后明确的知道这个变量的位置，那么顺便清0也可以做到。 在结构体里面，只是声明了一个类型而已，想清0也不知道该去哪清。当然你可以说真正定义变量的时候再清0，那就有点象c++构造函数的概念了，c大概是不行吧


Question: C编程中switch...case 问题

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

你代码都跑完了，程序结束了它当然退出了

这个应该是加上getchar（）之后的把。我说的是没加的时候为什么会自动退出 呢？,break只是 跳出循环，并不是跳出程序啊

2.然后程序没有输出自动关闭

你输入了啥?

程序不是应该会有所输出，在控制台里面程序会让我们按建才会退出啊

看不到输出是因为程序正常退出了，你ctrl+F5运行就能看到了 或者代码最后加上getchar();或者system("pause");   #include<stdio.h> int main() { 	int imonth; 	printf("请输入月份:\n"); 	scanf_s("%d",&imonth,2); 	 	switch (imonth) 	{ 	case 1: 	case 8: 	case 3: 		case 5: 		case 7: 		case 10: 		case 12:printf("31.\n"); break; 		case 2:printf(" 28\n"); break; 		case 6: 		case 9:printf("30\n"); break; 		default: 			printf("wrong\n"); break; 	} 	getchar(); 	getchar();  }


Question: 关于去除字符串的空格符的一个问题

1.strncpy(newstr,str+j,ncount);这句有问题，应该是strncpy(newstr,str+i,ncount);才对 2.newstr[ncount]='\0'这句就是在新字符串的末尾补上'\0'，不补'\0'的话输出的时候可能越界崩溃 PS：i是从前往后遍历，第一个不是空格的下标位置，而j是从后往前第一个不是空格的下标位置  #include<stdio.h> #include<string.h> #include <ctype.h> int trimSpace(char *str,char *newstr) { 	char *p=str; 	int ncount=0; 	int i,j=0;   	if(str==NULL||newstr==NULL) 	{ 		return -1; 	} 	i=0; 	j=strlen(p)-1; 	while(isspace(p[i])&&p[i]!='\0') 	{ 		i++; 	} 	while(isspace(p[j])&&p[j]!='\0') 	{ 		j--; 	}  	ncount=j-i+1; 	strncpy(newstr,str+i,ncount); 	newstr[ncount]='\0'; }  void main() { 	char *a = "  sfdsf  "; 	char buffer[32] = {0}; 	trimSpace(a, buffer); 	printf("%s\n", buffer); }  不要迷信书、考题、老师、回帖； 要迷信CPU、编译器、调试器、运行结果。 并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。 任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实！

1、+j 表示从开头第j个字符那里开始复制 2、字符串以\0结尾

哦哦哦，原来如此。谢谢谢谢。太棒了

strlen是不计算'\0'的长度，主要是因为数组下标是从0开始的，所以它要-1

哦，那意思是前面的strlen（p）-1也不是\0吗？他不是要减去\0的长度吗。我有点糊涂了。

当然不是'\0' 以我给的例子为例，i和j的值是2和6，加1以后才是5（主要是因为j提前了一位，因为它是指向最后一个非空格的下标）

他不是ncount=j-i+1吗，这个+1难道不是\0吗？那他这个+1是什么意思


Question: 初涉socket疑问：linux c 的 client 使用connect直接返回问题

引用 1 楼 wysk1 的回复:最近也刚学，说下我自己的理解，服务端启动后，accept阻塞，并不断检查listen指向的消息队列接收客户端的消息，客户端connect请求连接服务器，listen侦听到该消息，把请求放入队列，向客户端返回连接成功消息  但我现在的问题是服务器端启动后，并没有通过accept阻塞，这个时候客户端调用connect应该客户端会阻塞才对，但是客户端未阻塞，成功返回，并且client fd可以正常使用。这个现象我不知道是正常还是异常=_=

引用 3 楼 Loydia 的回复:可以这样理解：listen后内部会维护一个连接队列，当有连接进来就会push到这个队列中。accept只是从连接队列中pop一个连接，如果为连接队列为空且为阻塞模式，函数将一直等待到有连接进来。如果为非阻塞，函数将会返回错误并设置要求重试的错误代码。 非常感谢！


Question: C语言初学者求助

#include<stdio.h> #include<stdlib.h> int suanqian(int,int); main(){ start:	int i,a,b,c,need,put,rest; int price[10]={1,2,2,3,4,6,6,6,6,6}; char*name[10]={"怡宝","可乐","雪碧","酸奶","橙汁","咖啡","红牛","脉动","芬达","奶茶",};  for(i=0;i<10;i++){ printf("%d.%s",i+1,name[i]);printf("   %d元\n",price[i]); }  bianhao:printf("请输入物品的编号"); scanf("%d",&a); if(a>10){ printf("输入有误，请重新输入\n"); goto bianhao; } system("CLS");printf("您选择了%s",name[a-1]); printf("\n请输入物品的数量"); scanf("%d",&b);  need=suanqian(b,price[i-1]); printf("所需费用%d元",need); buzu:printf("请投币"); scanf("%d",&put); if(put==need) {printf("谢谢惠顾");} else if(put<need) {printf("支付余额不足,退回%d元\n",put);goto buzu;} else if(put>need){ rest=put-need;     printf("找回零钱%d元,谢谢惠顾",rest);} printf("继续消费请输入0,结束消费请输入1"); scanf("%d",&c);if(c==0){system("CLS");goto start;} return 0;}  int suanqian(int x,int y){ int z; z=x*y; return z; }  你没必要再在主函数主函数中写一遍，suanqian():函数 goto 这个用法不利于代码的规范，一般不用

函数里面不能定义另一个函数，把他拿到main的外边去

引用 楼主 L_h_l_d 的回复:#include<stdio.h> #include<stdlib.h> int suanqian(int,int); main(){ start:	int i,a,b,c,need,put,rest; int price[10]={1,2,2,3,4,6,6,6,6,6}; char*name[10]={"怡宝","可乐","雪碧","酸奶","橙汁","咖啡","红牛","脉动","芬达","奶茶"};  for(i=0;i<10;i++){ printf("%d.%s",i+1,name[i]);printf("   %d元\n",price[i]); }  bianhao:printf("请输入物品的编号"); scanf("%d",&a); if(a>10){ printf("输入有误，请重新输入\n"); goto bianhao; } system("CLS");printf("您选择了%s",name[a-1]); printf("\n请输入物品的数量"); scanf("%d",&b); int suanqian(int x,int y){ 	int z; 	z=x*a; 	return z; } need=suanqian(b,price[i-1]); printf("所需费用%d元",need); buzu:printf("请投币"); scanf("%d",&put); if(put==need) {printf("谢谢惠顾");} else if(put<need) {printf("支付余额不足,退回%d元\n",put);goto buzu;} else if(put>need){ 	rest=put-need;     printf("找回零钱%d元,谢谢惠顾",rest);} printf("继续消费请输入0,结束消费请输入1"); scanf("%d",&c);if(c==0){system("CLS");goto start;} return 0;}  int suanqian(int x,int y){ 	int z; 	z=x*a; 	return z; 这里总提示我函数定义非法为什么啊。。。我不会改。。。有劳各位大神。。。    怎么弄成模块化设计啊。。。尴尬。。。求助各位大神。。。

1.不是深层嵌套一般不推荐使用goto 2.suanqian函数里z=x*a;应该是z=x*y;吧 3.别在函数里定义函数  #include<stdio.h> #include<stdlib.h> int suanqian(int,int); int main(){ start:	int i,a,b,c,need,put,rest; 	int price[10]={1,2,2,3,4,6,6,6,6,6}; 	char*name[10]={"怡宝","可乐","雪碧","酸奶","橙汁","咖啡","红牛","脉动","芬达","奶茶"};  	for(i=0;i<10;i++){ 		printf("%d.%s",i+1,name[i]);printf("   %d元\n",price[i]); 	}  bianhao:printf("请输入物品的编号"); 	scanf("%d",&a); 	if(a>10){ 		printf("输入有误，请重新输入\n"); 		goto bianhao; 	} 	system("CLS");printf("您选择了%s",name[a-1]); 	printf("\n请输入物品的数量"); 	scanf("%d",&b); 	need=suanqian(b,price[i-1]); 	printf("所需费用%d元",need); buzu:printf("请投币"); 	scanf("%d",&put); 	if(put==need) 	{printf("谢谢惠顾");} 	else if(put<need) 	{ 		printf("支付余额不足,退回%d元\n",put);goto buzu; 	} 	else if(put>need){ 		rest=put-need; 		printf("找回零钱%d元,谢谢惠顾",rest); 	} 	printf("继续消费请输入0,结束消费请输入1"); 	scanf("%d",&c);if(c==0){system("CLS");goto start;} 	return 0; }  int suanqian(int x,int y){ 	int z; 	z=x*y; 	return z; }


Question: fread读不到文件数据

谢谢各位前辈，和赵四老师的解答。 我用winhex查看了保存的二进制文件。字节是对的。说明文件完整保存了。 我也断点调试了，发现并没有读取到。因为我把问题想得太复杂了，忽略了一个基础问题：重新运行窗口，然后直接加载二进制文件的数据。  for(i=0;i<ij;i++)     {         if(fread(&stu[i],sizeof(stu),1,read_FILE)!=1)         {             printf("读取失败!\n");             exit(1);         }               } ij这个变量的值要么随机，要么为0.导致了循环失败. 于是： 我改成了 while(fread(&stu[i],sizeof(stu),1,read_FILE)==1) { //计次变量递增 }  再调用show函数，发现已经完整读取所有的数据。

怎么写就怎么读，单步跟踪程序，判断判断每一步读到什么，分析原因

if(fread(&stu[i],sizeof(stu[i]),1,read_FILE)!=1) 这么读，原则上没什么问题，但最好和你写入的方式保持一致。 第一步先确认录入和打印都能正常运行，录入之后马上把数据打出来看看对不对。 第二步确认写文件是否正确，找个二进制编辑器打开文件看看。

这两行的意图显然不一致         for(save_count=0;save_count<ix;save_count++)         if((fwrite(&stu,sizeof(stu),1,save_FILE))!=1)

补充一下，调试加载的结果是这样。完全打印不出来

fwrite(&stu,sizeof(stu),1,save_FILE))!=1不应该是fwrite(&stu[save_count],sizeof(stu),1,save_FILE))!=1吗

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址； 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……  推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。  不要把 fopen("...","...");fscanf,fprintf,fgets,fgetc,fclose //读时把\r\n替换成\n，写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待 和 fopen("...","...b");fseek,ftell,fread,fwrite,fgetc,fclose //不作以上替换，遇到\x1a仍继续读;读写的内容当字节看待 弄混了


Question: C语言，关于MISRA规范，有几个告警很不明白，请大家帮忙啊

引用 1 楼 user-1 的回复:http://blog.csdn.net/pony_maggie/article/details/5270335  个人感觉其实是错在这里了： uint8 i = 0U; 要改成： unit8 i = (uint8) 0U;  这个本地试了下，确实不行。对i取地址的时候，i的值应该是不影响这个操作的。


Question: 谁帮我修改一下错误出在哪？怎么而修改才能运行呢？

我以前写了一个表达式求值的程序，没有实现负数的功能！你可以做个参考,在VS中能运行 http://blog.csdn.net/zycxnanwang/article/details/51713736

仅供参考：/*--------------------------------------- 函数型计算器(VC++6.0,Win32 Console) 功能： 目前提供了10多个常用数学函数:     ⑴正弦sin     ⑵余弦cos     ⑶正切tan     ⑷开平方sqrt     ⑸反正弦arcsin     ⑹反余弦arccos     ⑺反正切arctan     ⑻常用对数lg     ⑼自然对数ln     ⑽ｅ指数exp     ⑾乘幂函数^     ⑿向上取整ceil     ⒀向下取整floor     ⒁四舍五入取整round 用法： 如果要求2的32次幂，可以打入2^32<回车> 如果要求30度角的正切可键入tan(Pi/6)<回车> 注意不能打入：tan(30)<Enter> 如果要求1.23弧度的正弦，有几种方法都有效： sin(1.23)<Enter> sin 1.23 <Enter> sin1.23  <Enter> 如果验证正余弦的平方和公式,可打入sin(1.23)^2+cos(1.23)^2 <Enter>或sin1.23^2+cos1.23^2 <Enter> 此外两函数表达式连在一起,自动理解为相乘如：sin1.23cos0.77+cos1.23sin0.77就等价于sin(1.23)*cos(0.77)+cos(1.23)*sin(0.77) 当然你还可以依据三角变换，再用sin(1.23+0.77)也即sin2验证一下。 本计算器充分考虑了运算符的优先级因此诸如：2+3*4^2 实际上相当于：2+(3*(4*4)) 另外函数名前面如果是数字,那么自动认为二者相乘. 同理，如果某数的右侧是左括号，则自动认为该数与括弧项之间隐含一乘号。 如：3sin1.2^2+5cos2.1^2 相当于3*sin2(1.2)+5*cos2(2.1) 又如：4(3-2(sqrt5-1)+ln2)+lg5 相当于4*(3-2*(√5 -1)+loge(2))+log10(5) 此外，本计算器提供了圆周率 Pi键入字母时不区分大小写,以方便使用。 ----------------------------------------*/ #include <iostream> #include <iomanip> #include <cstdlib> #include <cstring> #include <cctype> #include <cmath> #include <stdio.h> #include <string.h> #include <windows.h> using namespace std; const char Tab=0x9; const int  DIGIT=1; const int MAXLEN=16384; char s[MAXLEN],*endss; int pcs=15; double round(double dVal, short iPlaces) {//iPlaces>=0     char s[30];     double dRetval;      sprintf(s,"%.*lf",iPlaces,dVal);     sscanf(s,"%lf",&dRetval);     return (dRetval); } double fun(double x,char op[],int *iop) {     while (op[*iop-1]<32) //本行使得函数嵌套调用时不必加括号,如 arc sin(sin(1.234)) 只需键入arc sin sin 1.234<Enter>         switch (op[*iop-1]) {         case  7: x=sin(x);    (*iop)--;break;         case  8: x=cos(x);    (*iop)--;break;         case  9: x=tan(x);    (*iop)--;break;         case 10: x=sqrt(x);   (*iop)--;break;         case 11: x=asin(x);   (*iop)--;break;         case 12: x=acos(x);   (*iop)--;break;         case 13: x=atan(x);   (*iop)--;break;         case 14: x=log10(x);  (*iop)--;break;         case 15: x=log(x);    (*iop)--;break;         case 16: x=exp(x);    (*iop)--;break;         case 17: x=ceil(x);   (*iop)--;break;         case 18: x=floor(x);  (*iop)--;break;         case 19: x=round(x,0);(*iop)--;break;         }     return x; } double calc(char *expr,char **addr) {     static int deep; //递归深度     static char *fname[]={"sin","cos","tan","sqrt","arcsin","arccos","arctan","lg","ln","exp","ceil","floor","round",NULL};     double ST[10]={0.0}; //数字栈     char op[10]={'+'}; //运算符栈     char c,*rexp,*pp,*pf;     int ist=1,iop=1,last,i;      if (!deep) {         pp=pf=expr;         do {             c = *pp++;             if (c!=' '&& c!=Tab)                 *pf++ = c;         } while (c!='\0');     }     pp=expr;     if ((c=*pp)=='-'||c=='+') {         op[0] = c;         pp++;     }     last = !DIGIT;     while ((c=*pp)!='\0') {         if (c=='(') {//左圆括弧             deep++;             ST[ist++]=calc(++pp,addr);             deep--;             ST[ist-1]=fun(ST[ist-1],op,&iop);             pp = *addr;             last = DIGIT;             if (*pp == '('||isalpha(*pp) && strnicmp(pp,"Pi",2)) {//目的是：当右圆括弧的右恻为左圆括弧或函数名字时，默认其为乘法                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }         else if (c==')') {//右圆括弧             pp++;             break;         } else if (isalpha(c)) {             if (!strnicmp(pp,"Pi",2)) {                 if (last==DIGIT) {                     cout<< "π左侧遇）" <<endl;exit(1);                 }                 ST[ist++]=3.14159265358979323846264338328;                 ST[ist-1]=fun(ST[ist-1],op,&iop);                 pp += 2;                 last = DIGIT;                 if (!strnicmp(pp,"Pi",2)) {                     cout<< "两个π相连" <<endl;exit(2);                 }                 if (*pp=='(') {                     cout<< "π右侧遇（" <<endl;exit(3);                 }             } else {                 for (i=0; (pf=fname[i])!=NULL; i++)                     if (!strnicmp(pp,pf,strlen(pf))) break;                 if (pf!=NULL) {                     op[iop++] = 07+i;                     pp += strlen(pf);                 } else {                     cout<< "陌生函数名" <<endl;exit(4);                 }             }         } else if (c=='+'||c=='-'||c=='*'||c=='/'||c=='%'||c=='^') {             char cc;             if (last != DIGIT) {                 cout<< "运算符粘连" <<endl;exit(5);             }             pp++;             if (c=='+'||c=='-') {                 do {                     cc = op[--iop];                     --ist;                     switch (cc) {                     case '+':  ST[ist-1] += ST[ist];break;                     case '-':  ST[ist-1] -= ST[ist];break;                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 } while (iop);                 op[iop++] = c;             } else if (c=='*'||c=='/'||c=='%') { operate:        cc = op[iop-1];                 if (cc=='+'||cc=='-') {                     op[iop++] = c;                 } else {                     --ist;                     op[iop-1] = c;                     switch (cc) {                     case '*':  ST[ist-1] *= ST[ist];break;                     case '/':  ST[ist-1] /= ST[ist];break;                     case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;                     case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;                     }                 }             } else {                 cc = op[iop-1];                 if (cc=='^') {                     cout<< "乘幂符连用" <<endl;exit(6);                 }                 op[iop++] = c;             }             last = !DIGIT;         } else {             if (last == DIGIT) {                 cout<< "两数字粘连" <<endl;exit(7);             }             ST[ist++]=strtod(pp,&rexp);             ST[ist-1]=fun(ST[ist-1],op,&iop);             if (pp == rexp) {                 cout<< "非法字符" <<endl;exit(8);             }             pp = rexp;             last = DIGIT;             if (*pp == '('||isalpha(*pp)) {                 op[iop++]='*';                 last = !DIGIT;                 c = op[--iop];                 goto operate ;             }         }     }     *addr=pp;     if (iop>=ist) {         cout<< "表达式有误" <<endl;exit(9);     }     while (iop) {         --ist;         switch (op[--iop]) {         case '+':  ST[ist-1] += ST[ist];break;         case '-':  ST[ist-1] -= ST[ist];break;         case '*':  ST[ist-1] *= ST[ist];break;         case '/':  ST[ist-1] /= ST[ist];break;         case '%':  ST[ist-1] = fmod(ST[ist-1],ST[ist]);break;         case '^':  ST[ist-1] = pow(ST[ist-1],ST[ist]);break;         }     }     return ST[0]; } int main(int argc,char **argv) {     int a;      if (argc<2) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算函数表达式的值。"<<endl<<"支持(),+,-,*,/,%,^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;         while (1) {             cout << "请输入表达式：";             gets(s);             if (s[0]==0) break;//             cout << s <<"=";             cout << setprecision(15) << calc(s,&endss) << endl;         }     } else if (argc==2 && 0==strcmp(argv[1],"/?")) {         if (GetConsoleOutputCP()!=936) system("chcp 936>NUL");//中文代码页         cout << "计算由≥1个命令行参数给出的函数表达式的值。最后一个参数是.0～.15表示将计算结果保留小数0～15位"<<endl<<"支持(),+,-,*,/,%,^^,Pi,sin,cos,tan,sqrt,arcsin,arccos,arctan,lg,ln,exp,ceil,floor,round"<<endl;     } else {         strncpy(s,argv[1],MAXLEN-1);s[MAXLEN-1]=0;         if (argc>2) {             for (a=2;a<argc-1;a++) strncat(s,argv[a],MAXLEN-1);//将空格间隔的各参数连接到s             if (1==sscanf(argv[a],".%d",&pcs) && 0<=pcs && pcs<=15) {//最后一个参数是.0～.15表示将计算结果保留小数0～15位                 printf("%.*lf\n",pcs,calc(s,&endss));             } else {                 strncat(s,argv[a],MAXLEN-1);                 printf("%.15lg\n",calc(s,&endss));             }         } else {             printf("%.15lg\n",calc(s,&endss));         }     }     return 0; }

引用 4 楼 qq_35360311 的回复:d:\microsoft visual studio\vc98\include\eh.h(32) : fatal error C1189: #error :  "eh.h is only for C++!"

你文件扩展名是不是.c的？

你贴出来的这一段是可以编译运行的，你编译报的什么错

我也不知道啊  我就在网上拉的   运行不了

你是少贴了么，还是贴错了

有空学习学习。。。。。。。。


Question: 学预处理数学库遇到的问题

不是很明白，在这个代码里具体应该怎么处理呢？

函数要前向声明, 没声明的返回类型默认为int

1.rect_to_plar需要前置声明 2. result = rect_to_polar(input);应该是 result = rect_to_plar(input);你多了一个o  #include<stdio.h> #include<math.h>   #define RAD_TO_DEG (180/(4*atan(1.0)))   typedef struct polar_v {     double magnitude;     double angle; }POLAR_V;   typedef struct rect_v {     double x;     double y; }RECT_V;  POLAR_V rect_to_plar(RECT_V rv); int main(void) {     RECT_V input;     POLAR_V result;       puts("Enter x,y coordinates;enter q to quit: ");     while (scanf("%lf %lf", &input.x, &input.y) == 2)     {         result = rect_to_plar(input);         printf("magnitude =%0.2f, angle =%0.2f\n",             result.magnitude, result.angle);     }     puts("Bye!");       return 0; }   POLAR_V rect_to_plar(RECT_V rv) {     POLAR_V pv;       pv.magnitude = sqrt(rv.x * rv.x + rv.y * rv.y);     if (pv.magnitude == 0)     {         pv.angle = 0.0;       }     else     {         pv.angle = RAD_TO_DEG*atan2(double(rv.y), rv.x);     }     return pv; }


Question: 《C和指针》中关于指针与下标的问题

int array[10],  说明数组元素为整形。 取得a的值，并把它与整形的长度（也就是4）相乘，就是根据下标a，乘以4（整形量所占内存的字节数），所得结果就是下标变量相对数组起始位置的偏移，也就是array[a]所对应的“变量地址”（当然要加上数组基址）   int array[10], a; for(a = 0; a < 10; a += 1)      array[a] = 0;   为了对下标表达式求值，编译器在程序中插入指令，取得a的值，并把它与整形的长度（也就是4）相乘。这个乘法需要花费一定的时间和空间。   int array[10], *ap; for(ap = array; ap < array + 10; ap++)      *ap = 0;	  ap++中，++其实就是在ap当前指针所指的位置处，加上一个ap所指元素的类型的长度，这里就是int,即4。也就是1必须与整形的长度（也就是4）相乘，然后再与指针相加。     从这里，貌似两个循环都进行了乘法，好像没有什么差异。可是，你注意到没有2个循环其实是有很大的不同的。不同在哪里呢？？？    仔细看，会发现数组下标中的a每次的值是不同的，每次a都会与长度4进行相乘，即进行了10次乘法。    再看看指针，你会发现ap++时，是1与长度4进行相乘，再与指针相加。每次执行乘法时，其实就是1*4。这个乘法只在编译时进行了一次运算。程序执行的时候，就没有进行乘法运算，只是简单的将4与指针相加而已。         指针比下标更有效率的一个典型。你会发现在这个场合中 -- 当你在数组中1次1步（或某个固定的数字）地移动时，与固定数字相乘的运算在编译时完成，所以运行时所需的指令就少一些。在绝大多数机器上，程序竟会更小一些、更快一些。

请忽略以上的叙述。（可以忽略以上有关效率的所有文字）  随着 CPU 、体系结构 与 编译器的发展，以上说法的正确性在随时发生着变化。


Question: 新手求解！

scanf语句前加fflush(stdin)清空键盘缓冲区

求解！！！.......


Question: c语言航班设计

有时间再看一看。。。。。。。。。。。。。。

你的两个if没太看懂 修改了一下经过调试后发现问题应该在fp = fopen("yu.txt", "rb");    r的意思是只读，要求文件必须是存在的，检查一下你的yu.txt文件是否存在 fp = fopen("yu.txt", "rb"); 		fp1 = fopen("yi.txt", "wb"); 		if ((fp  == NULL) || (fp1== NULL)) 			read();  wb是以二进制进行写，如果yi.txt不存在则会自动创建

楼主自己单步调试一下就知道了。 你输入1那么跳到input函数里执行，因为这句if((fp1=fopen("yi.txt","wb"))==NULL);所以会生成yi.txt 并且进入read()函数，在read函数里if((fp1=fopen("yi.txt","rb"))==NULL)这句是能打开的，但是里面是没有内容的 你执行fscanf(fp1,"%d",&count);自然就报错了 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。

#include<stdio.h>  //标准输入、输出头文件 #include<string.h>    //包含字符串函数处理头文件 #include<stdlib.h>     //包含动态存储与释放函数头文件 #define N 1000 #define PRINT "%s%12s%12s%12s%12d\n",flight[i].flightNo,flight[i].start,flight[i].end,flight[i].day,flight[i].flightcount    //定义输出格式  struct plane         //定义结构体数组 {    char flightNo[10];    char start[10];    char end[10];    char day[10];    int flightcount;  }flight[N];//定义结构体  int i;//定义整数变量 int count=0;  void input();    //输入航班信息 void print();    //输出航班信息 void save();     //保存航班信息 void read();     //读取航班信息 void search();   //查找航班信息 void main()  {     int option;     printf("                             欢迎进入航班管理系统！          \n");     printf("================================================================================\n");     do     {         printf("                                1.输入航班信息                     \n\n" 	  "                                2.浏览航班信息                          \n\n"       "                                3.查找航班信息                          \n\n"       "                                0.退出                                  \n\n");       printf("================================================================================\n");        printf("请在0-3中选择以回车键结束：\n\n");        scanf("%d",&option);      switch(option)     {          case 1: input();break;//调用输入模块          case 2:print();break;//调用显示模块          case 3:search();break;//调用查找模块          case 0:;break;}     }while(option!=0);     //判断结束      printf("谢谢使用，再见！\n");   }//主函数结束   void input()//输入模块程序 {     FILE *fp,*fp1;//定义文件指针     char password[]="0101";    //设置密码     int y;     printf("请输入密码并以回车键结束:\n\n");     scanf("%s",password);          //读取密码      if(strcmp(password,"0101")!=0) 	  printf("输入密码错误!请检查您的密码是否正确!谢谢!再见!\n\n"); 	else	           {             if((fp=fopen("yu.txt","rb"))==NULL);             if((fp1=fopen("yi.txt","wb"))==NULL);             else read();             printf("请依次输入航班信息:\n");      //打印提示信息             printf("\n--------------------------------------------------------------------------\n");             for(i=count;i<N;i++)                 {                     printf("请输入航班号:\n");                     scanf("%s",&flight[i].flightNo);     //读取航班号                     printf("请输入起始站:\n");                     scanf("%s",&flight[i].start);//读取起始站                     printf("请输入终点站:\n");                     scanf("%s",flight[i].end);//读取终点站                     printf("请输入时间:\n");                     scanf("%s",flight[i].day);//读取时间                     printf("请输入机票数:\n",count);                     scanf("%d",&flight[i].flightcount);//读取机票数                     count++;                     printf("第%d个信息已经输完是否继续?按任意键继续，按0结束",count);                     scanf("%d",&y);//表示状态，是否结束                     if(y==0)                          {                               save();//将结构体信息存盘                               print();//输出输入的航班信息                               break;                          }                 }         }     }   void save()//保存模块程序 {    FILE *fp,*fp1;//定义文件指针    if((fp=fopen("yu.txt","wb"))==NULL)//打开文件并判断是否出错       {           printf("创建文件失败!\n\n");//打印出错提示           getchar();           return;       }     if((fp1=fopen("yi.txt","wb"))==NULL)//打开文件并判断是否出错       {           printf("创建文件失败!\n\n");//打印出错提示           getchar();           return;       }     for(i=0;i<count;i++) 	  if(fwrite(&flight[i],sizeof(struct plane),1,fp)==0)//向文件写入数据，并判断是否出错     printf("向文件输入数据失败!\n\n");    fprintf(fp1,"%d",count);    fclose(fp);//关闭文件    fclose(fp1);//关闭文件 }   void read()//从文件读取信息模块 {        FILE *fp,*fp1;//定义文件指针        if((fp=fopen("yu.txt","rb"))==NULL)//打开文件，并判断是否出错             {                 printf("出错，请检查文件是否存在，按任意键返回主菜单");//打印出错提示                 getchar();             }         if((fp1=fopen("yi.txt","rb"))==NULL)//打开文件并判断是否出错             {                 printf("打开文件失败!\n\n");//打印出错提示                 getchar();                 return;             }         fscanf(fp1,"%d",&count);        fclose(fp1);//关闭文件        for(i=0;i<count;i++)             {                 fread(&flight[i],sizeof(struct plane),1,fp);//从文件中读取信息             }        fclose(fp);//关闭文件 }   void print()//打印模块 {     char w[10];     read();//调用读取文件函数     printf("航班号       起始站      终点站    时间       机票数\n");     for(i=0;i<count;i++)       {           printf(PRINT);//打印信息       }     printf("请按任意键和回车键结束返回上层菜单:\n");     scanf("%s",w); }   void search()//查询模块 {  char name1[20];//定义字符串  char name2[20];  char judgement[10];  int n;//定义整型变量  char no[10];  do   {       printf("请选择查找方式：\n\n");//打印查询方式菜单       printf("1.按航班号查找\n\n"              "2.按终点站查找\n\n"              "3.按航线查找\n\n"              "0.返回\n\n");       printf("请在0-3中选择：\n\n"            "按其他键和回车键结束返回主菜单:\n\n");       scanf("%d",&n);//读取查找方式       if(n==0)//判断退出       break;       switch(n)          {             case 1:             printf("请输入航班号：\n");             scanf("%s",no);//航班号             break;             case 2:             printf("请输入终点站名称：\n");             scanf("%s",name2);//读取终点站             break;             case 3:             printf("请输入起始站名称：\n");             scanf("%s",name1);//读取起始站             printf("请输入终点站名称：\n");             scanf("%s",name2);//终点站             break;          }      read();//调用读取函数      for(i=0;i<count;i++)        {           if(strcmp(flight[i].end,name1)==0||strcmp(flight[i].end,name2)==0)//按终点站起始站判断输出条件                 {                     printf("\n查找航班信息成功!\n");                     printf("航班号       起始站      终点站    时间       机票数\n");                     printf(PRINT);//打印信息                     break;                 }           if(strcmp(flight[i].flightNo,no)==0)//按航班号判断输出条件                 {                     printf("\n查找航班信息成功!\n");                     printf("航班号       起始站      终点站    时间       机票数\n");                     printf(PRINT);//打印信息                     break;                 }       }       printf("没有您需要的信息或查找完毕：\n\n"          "是否继续查找?请键入Y(继续查找)或N（返回主菜单）以回车键结束\n");      scanf("%s",judgement);   }while(strcmp(judgement,"Y")==0);//判断结束 }


Question: 循环队列，运行不出结果，求大神赐教

非常非常非常感谢，我再好好看看。

你如果不接受返回值，而是通过函数内给指针分配空间必须要传二级指针或者一级指针的引用（因为它修改了指针的指向） 如果是修改指针所指向的区域的值那么传一级指针。 就比如你这个题，如果你传一级指针，仅仅表示main函数里的qu和init_queue的形参que指向了同一块内存（都指向了NULL） 而main函数里的qu和init_queue的形参que两者并不是同一个指针,所以你给que分配空间，修改它的指向是影响不到main函数的qu的

非常感谢，我在看二叉树时也看到有二级指针，但始终不是很明白，大神能否详细讲解一下为什么非要用二级指针才能分配空间，或者给指个学习方向？

三个问题： 1.你想通过init_queue给main函数的qu初始化分配空间，必须传二级指针或者一级指针的引用才行 （传一级指针是没有用的，操作的只是他的一个副本而已） 2.没有给int *arr分配空间 3.main函数内while (!isempty_queue(qu))应该是while (isempty_queue(qu))  /* @filename list.h */  #include<stdlib.h> #include<malloc.h> #include<stdio.h> typedef struct queue { 	int *arr; 	size_t cap; 	size_t front; 	size_t rear; 	size_t size; }QUEUE;  void init_queue(QUEUE ** que, size_t cap) { 	*que = (QUEUE*)malloc(cap*sizeof(int)); 	(*que)->arr = (int *)malloc(cap*sizeof(int)); 	(*que)->cap = cap; 	(*que)->front = 0; 	(*que)->rear = 0; 	(*que)->size = 0; } void destroy_queue(QUEUE *que) { 	free(que->arr); 	que->arr = NULL; 	que->cap = 0; 	que->front = 0; 	que->rear = 0; 	que->size = 0; } int  pop_queue(QUEUE *que) { 	if (que->front >= que->cap) 	{ 		que->front = 0; 	} 	que->size--; 	return que->arr[que->front++]; } void push_queue(QUEUE *que, int data) { 	if (que->rear >= que->cap)//下标越界 		que->rear = 0; 	que->arr[que->rear++] = data;//数据放进队尾，队尾后移 	que->size++;//个数加1 }  int  isfull_queue(QUEUE *que) { 	if ((que->size) ==( que->cap)) 		return 1; 	else 		return -1; } int isempty_queue(QUEUE *que) { 	if (que->size == 0) 		return 0; 	else 		return -1; } int getsize_queue(QUEUE *que) { 	return que->size; } void show_front(QUEUE *que) { 	if (que->front >= que->cap) 		que->front = 0; 	printf("%d\n", que->arr[que->front]); }    int main() { 	QUEUE * qu=NULL; 	init_queue(&qu, 5); 	int i; 	for (i = 0; i<5; i++) 	{ 		if (isfull_queue(qu)) 			push_queue(qu,i); 	} 	printf("size%d\n", getsize_queue(qu)); 	while (isempty_queue(qu)) 	{ 		printf("%d\n", pop_queue(qu)); 	} 	destroy_queue(qu); 	getchar(); 	return 0; }   单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。


Question: 如何提取多个txt中的数据

好的，谢谢老师，我的问题解决了

#include <stdio.h> double d[8]; FILE *f; char fn[32]; int i, j, r; int main() { 	for (r = 1; r <= 4; r++) {//第r行 		for (j = 1; j <= 8; j++) {//第j个文件 			sprintf(fn, "D://stress%d.txt", j); 			f = fopen(fn, "r"); 			if (f) { 				for (i = 0; i<r - 1; i++) fscanf(f, "%*lf");//跳过前r-1个数 				fscanf(f, "%lf", &d[j - 1]);//读取第r个数到d[j-1]中 				fclose(f); 			} 		} 		for (i = 0; i<8; i++) printf("%15.6lf ", d[i]);//显示第r行的100个数 		printf("\n");//换行间隔 	} 	return 0; }

改成了double后精度问题解决了，非常感谢！

引用 2 楼 zuiai214 的回复:谢谢老师的指导！对于整型数据的输入，也就是我的例子可以完美解答。 但是由于我是从其他软件导出txt的结果，实际数据与我的例子还是有些不同，我导出的实际结果如下  可以看出每行txt数据前有空格，而且空格的个数并不固定，另外我的数据是浮点型的。在这种情况下我经过简单修改输出的结果为  可以看出我导入的数据小数点后被略去了。想再向老师询问问题产生的原因与解决方法。我的程序如下，麻烦老师了。 #include <stdio.h> float d[8]; FILE *f; char fn[32]; int i, j, r; int main() { 	for (r = 1; r <= 4; r++) {//第r行 		for (j = 1; j <= 8; j++) {//第j个文件 			sprintf(fn, "D://stress%d.txt", j); 			f = fopen(fn, "r"); 			if (f) { 				for (i = 0; i<r - 1; i++) fscanf(f, "%*f");//跳过前r-1个数 				fscanf(f, "%f", &d[j - 1]);//读取第r个数到d[j-1]中 				fclose(f); 			} 		} 		for (i = 0; i<8; i++) printf("%f ", d[i]);//显示第r行的100个数 		printf("\n");//换行间隔 	} 	return 0; } 这个应该是float的精度问题，你换成double应该就能过了，具体原因自己搜一下吧，长篇大论的。建议不要用fscanf/scanf来输入float。 另外，看一楼说法，我觉得用二维数组把数据全读出来之后进行处理比较方便，你这样打开关闭文件，还要跳来跳去的很容易出错。

//有一百个txt文件，按顺序deta1，deta2...deta100命名， //每个txt中有一列数据，现在我想要提取顺序提取每个txt中对应行的数据。 //例如：我提取所有txt中第一行的数据，保存到一个C语言的一维数组中，然后进行处理。 //再提取每个txt中第二行，第三行，以此类推。 #include <stdio.h> int d[100]; FILE *f; char fn[32]; int i,j,r; int main() {     for (r=1;r<=4;r++) {//第r行         for (j=1;j<=100;j++) {//第j个文件             sprintf(fn,"deta%d.txt",j);             f=fopen(fn,"r");             if (f) {                 for (i=0;i<r-1;i++) fscanf(f,"%*d");//跳过前r-1个数                 fscanf(f,"%d",&d[j-1]);//读取第r个数到d[j-1]中                 fclose(f);             }         }         for (i=0;i<100;i++) printf("%d ",d[i]);//显示第r行的100个数         printf("\n");//换行间隔     }     return 0; }


Question: c语言写的LRU页面置换算法，求大神帮忙修改语法错误

偶遇到类似问题都是用 “每次用/*...*/注释掉不同部分再重新编译，直到定位到具体语法出错的位置。” 的方法解决的。

对了，渣渣我用的还是c++6.0，谢谢大神指导


Question: c语言编程问题求助

if(p=NULL) 实际上是： p=NULL; if (p!=NULL)   这个一直为假。

非常感谢,我用的VS2010,在编译时并没有报错,按照你的方法确实是成功了 不过还有一个问题,if(p = NULL)这种方式写确实有问题,可为啥能执行else, 并打印出了内存分配成功呢?

printf("%p\n",p);  //打印地址 if(p = NULL) { printf("内存分配失败\n"); }  改成 if(p==NULL)  这个是有警告的。


Question: 求救，模块化编程参数问题

引用 4 楼 qq_35371144 的回复:谢谢   刚开始不会这些  第一次写  尝试着像3楼一样写代码，代码的书写格式是很重要的。

眼过千遍不如手过一遍！ 书看千行不如手敲一行！ 手敲千行不如单步一行！ 单步调试和设断点调试（VS IDE中编译连接通过以后，按F10或F11键单步执行，按Shift+F11退出当前函数；在某行按F9设断点后按F5执行停在该断点处。）是程序员必须掌握的技能之一。 VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化，这样过一遍不就啥都明白了吗。

谢谢   刚开始不会这些  第一次写

//我这程序为什么最后输入密码一直不正确 #include<stdio.h> #include<stdlib.h> #include<time.h> #include<conio.h>  void cubao(int a[], int *key){    //函数申明有什么返回值 	int i = 0, j; 	static int k = 0;         //这里k你想表示已用的柜子数量，但k是局部变量，每次进来都初始化为0，之后就回收了，所以应该设为静态局部变量    	int c, e, f;                       	srand(time(0)); 	a[i] = rand() % 50 + 1; 	k++; 	for (j = 0; j<i; j++)          //原因同上，i每次进来都初始化为0 所以这个for根本不会执行 	{ 		if (a[i] == a[j]) 		{ 			i--; 		} 	} 	if (k <= 50)                    	{ 		srand(time(0));               		c = rand() % 65537 + 0; 		srand(time(0)); 		e = (a[i] + 10); 		f = e * 100000;               		*key = f + c;                //key=f+c 主要问题在这里，这里的key只是进来这个cubao函数后为它额外分配的一个地址，你改变的是这个函数里面的key而不是main里的key，要改变一个变量值要利用指针 		printf("箱号是%d\n密码是%d\n", a[i], *key); 	} 	else 		printf("柜子已满\n"); } void qubao(int* key){             //同理这里也应该传key的指针进来比较 	int psw; 	printf("请输入密码:\n");          	scanf("%d", &psw); 	if (psw == *key) 		printf("请取走物品\n"); 	else 		printf("欢迎下次光临\n"); } int main(){ 	int n; 	int a[50];                        //设有50个柜子 	int key=0; 	while (1) 	{ 		printf("欢迎使用\n"); 		printf("存请按0\n"); 		printf("取请按1\n"); 		scanf("%d", &n); 		if (n == 0) 		{ 			cubao(a, &key); 		} 		else if (n == 1) 		{ 			qubao(&key); 		} 		else 		{ 			break; 		} 	} 	return 0; } 测试已经通过，新手对指针以及局部变量的问题不熟练，多看资料，不会的时候一步一步调试

还是不行哎      不知道怎么处理了

int key = 0;可以吗