• 关于 strcmp() 的搜索结果

回答

这里不能用switch,字符串比较要这么写 #include <string.h> #include <stdio.h> int getByteofType(char t[]) { if (strcmp(t, "char") == 0) return 1; else if (strcmp(t, "int") == 0) return 4; else if (strcmp(t, "long") == 0) return 4; else if (strcmp(t, "long long") == 0) return 8; else if (strcmp(t, "__int128") == 0) return 16; else if (strcmp(t, "float") == 0) return 4; else if (strcmp(t, "double") == 0) return 8; else if (strcmp(t, "long double") == 0) return 16; return 0; } int main() { char t[100]; int ans[1001]; int N,i; scanf("%d", &N); for (i = 0; i < N; i++) { fflush(stdin); gets(t); ans[i] = getByteofType(t); } for (i = 0; i < N; i++) printf("%d\n", ans[i]); return 0; }

DM。 2020-05-27 17:52:35 0 浏览量 回答数 0

回答

正确的方式如下 #include #include #include using namespace std; void swap(char p1,char *p2/,char p3/); int main() { void swap(char *,char *); char str1[20],str2[20],str3[20],str4[20]; cout<<"请输入四个字符串:"< cin>>str1; cin>>str2; cin>>str3; cin>>str4; if(strcmp(str1,str2)>0) swap(str1,str2); if(strcmp(str1,str3)>0) swap(str1,str3); if(strcmp(str1,str4)>0) swap(str1,str4); if(strcmp(str2,str3)>0) swap(str2,str3); if(strcmp(str2,str4)>0) swap(str2,str4); if(strcmp(str3,str4)>0) swap(str3,str4); cout<<"从小到大的排序是:"<<endl; cout<<str1<<" "<<str2<<" "<<str3<<" "<<str4<<endl; Sleep(INFINITE); return 0; } void swap(char p1,char *p2/,char p3/) { char p[20]; //strcpy(p,p1);strcpy(p1,p2);strcpy(p2,p3);strcpy(p3,p);strcpy(p,p2);strcpy(p1,p3); strcpy(p,p1);strcpy(p1,p2);strcpy(p2, p); }

a123456678 2019-12-02 01:57:29 0 浏览量 回答数 0

问题

使用指针处理下面的问题,输入四个字符串,按由小到大顺序输出

a123456678 2019-12-01 20:06:41 1328 浏览量 回答数 1

新用户福利专场,云服务器ECS低至96.9元/年

新用户福利专场,云服务器ECS低至96.9元/年

问题

C++中strcmp和 ==的比较问题

a123456678 2019-12-01 20:08:50 696 浏览量 回答数 1

回答

代码的描述 #include #include void even(char *n1,char *n2,int *n); void up(char *n1,char *n2,int *n); void down(char *n1,char *n2,int *n); void judge(int *n); int main() { int coins[12]={0};//赋值为0,表示情况不明,1表示真币,10轻假币,11重假币 char cases[3][7]; int follow,i,j,k; scanf("%d",&follow); for(i=0;i<follow;++i) { for(j=0;j<3;++j) { for(k=0;k<3;++k) { scanf("%s",&cases[k]); } if(strcmp(cases[2],"even")==0)//天平相等 { even(cases[0],cases[1],coins); } else if(strcmp(cases[2],"up")==0)//左重右轻 { up(cases[0],cases[1],coins); } else if(strcmp(cases[2],"down")==0)//右重左轻 { down(cases[0],cases[1],coins); } } } judge(coins); } void even(char n1,char *n2,int *n)//平衡情况下的处理 { char c; int i; for(i=0;i<12;++i) { c=(char)65+i; if((strchr(n1,c))!=NULL||(strchr(n2,c))!=NULL)// 如果出现即真币 { *(n+i)=1; } } } void up(char *n1,char *n2,int *n) { char c; int i; for(i=0;i<12;++i) { c=(char)65+i; if((strchr(n1,c))!=NULL&&((n+i))==0)//情况不明且在重的一端 { (n+i)=11; } else if((strchr(n2,c))!=NULL&&((n+i))==0)//情况不明且在轻的一端 { (n+i)=10; } else if((strchr(n1,c))!=NULL&&((n+i))==10)//曾在轻的一端处出现并处于重的一端,为真币 { (n+i)=1; } else if((strchr(n2,c))!=NULL&&((n+i))==11)//曾在重的一端处出现并处于轻的一端,为真币 { *(n+i)=1; } else if(((strchr(n1,c))==NULL)&&((strchr(n2,c))==NULL))//未参加比较,为真币 { *(n+i)=1; } } } void down(char n1,char *n2,int *n) { char c; int i; for(i=0;i<12;++i) { c=(char)65+i; if((strchr(n1,c))!=NULL&&((n+i)==0))//情况不明且在轻的一端 { (n+i)=10; } else if((strchr(n2,c))!=NULL&&((n+i))==0)//情况不明且在重的一端 { (n+i)=11; } else if((strchr(n1,c))!=NULL&&((n+i))==11)//曾在重的一端处出现并处于轻的一端,为真币 { (n+i)=1; } else if((strchr(n2,c))!=NULL&&((n+i))==10)//曾在轻的一端处出现并处于重的一端,为真币 { (n+i)=1; } else if(((strchr(n1,c))==NULL)&&((strchr(n2,c))==NULL))//未参加比较,为真币 { *(n+i)=1; } } } void judge(int *n) { char c; for(int i=0;i<12;++i) { if((n+i)!=1) { if(*(n+i)==10) { c=(char)65+i; printf("%c is the counterfeit coin and it is light.",c); } else if(*(n+i)==11) { c=(char)65+i; printf("%c is the counterfeit coin and it is heavy.",c); } } } }

a123456678 2019-12-02 02:15:07 0 浏览量 回答数 0

回答

这个是VS下的,感觉只能查找出来以后比较文件名字然后排除掉abc.txt在linux操作系统下,编译器用findfirst(),而不是_findfirst().linux操作系统下的查找文件的操作,需要包含dirent.h头文件 #include <stdio.h> #include<iostream> #include<io.h> using namespace std; int main() { long Handle; struct _finddata_t FileInfo; if((Handle=_findfirst("F:\\*.txt",&FileInfo))==-1L) printf("没有找到匹配的项目\n"); else { if(strcmp(FileInfo.name, "ab.txt") == 0) { printf("%s\n", FileInfo.name); } while(_findnext(Handle,&FileInfo)==0)//成功返回0,失败返回-1 { if(strcmp(FileInfo.name, "ab.txt") == 0) { printf("%s\n", FileInfo.name); } } _findclose(Handle); } system("pause"); return 0; }

a123456678 2019-12-02 02:01:39 0 浏览量 回答数 0

问题

全局事务服务 GTS 函数怎么运行?

猫饭先生 2019-12-01 21:25:08 991 浏览量 回答数 0

问题

c语言在linux环境下进行文件复制的代码,使用时出错,求各位大神帮忙解答下

杨冬芳 2019-12-01 20:22:01 1066 浏览量 回答数 1

问题

switch循环的一个小bug

a123456678 2019-12-01 20:07:58 1213 浏览量 回答数 1

问题

linux c socket tcp客户端只能发送一次,发送第二次服务端接收不到,必须重启才行

杨冬芳 2019-12-01 20:26:33 2254 浏览量 回答数 1

回答

#include <iostream> using namespace std; int maxd(int y, int m) { switch (m) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: return 31; case 2: if (y % 4 != 0) return 28; if (y % 100 == 0 && y % 400 != 0) return 28; return 29; default: return 30; } } class Date{ private: int day, month, year; static Date default_date; //初始化为 1901年1月1日 public: Date(){ day=month=year=0; } Date(int d, int m, int y); //构造函数 int get_day() const; // 返回day int get_month() const; //返回month int get_year() const; // 返回year static void set_default(int, int, int){Date::default_date = Date(1, 1, 1901);} static int get_default_day() {return Date::default_date.get_day();} //返回缺省day static int get_default_month(){return Date::default_date.get_month();} //返回缺省month static int get_default_year(){return Date::default_date.get_year();} //返回缺省year Date& add_year(int n); //加n年 Date& add_month(int n); //加n月,考虑超过12月,考虑闰年 Date& add_day(int n); //加n天,考虑进位月和年,考虑闰年 }; Date::Date(int d, int m, int y) { day = d; month = m; year = y; } int Date::get_day() const { return day; } int Date::get_month() const { return month; } int Date::get_year() const { return year; } Date& Date::add_year(int n) { year += n; return *this; } Date& Date::add_month(int n) { if (month + n <= 12) { month += n; return *this; } add_year(1); n = n - 12 + month; month = 1; while (n >= 12) { add_year(1); n -= 12; } month += n; return *this; } Date& Date::add_day(int n) { if (day + n <= maxd(year, month)) { day += n; return *this; } add_month(1); n = n - (maxd(year, month), day) + day; day = 1; while (n >= maxd(year, month)) { add_month(1); n -= maxd(year, month); } day += n; return *this; } int main(){ char type[110]; int day,mon,year; int addday,addmon,addyear; while(cin>>type){ if(strcmp(type,"Date") == 0){ cin>>day>>mon>>year; Date mydate(day,mon,year); cin>>addday>>addmon>>addyear; mydate.add_day(addday).add_month(addmon).add_year(addyear); cout << mydate.get_day() << " " << mydate.get_month() << " " << mydate.get_year() << endl; }else if(strcmp(type,"defalutDate") == 0){ cout << Date::get_default_day() << " " << Date::get_default_month() << " " << Date::get_default_year() << endl; }else if(strcmp(type,"setdefaultDate") == 0){ cin>>day>>mon>>year; Date::set_default(day,mon,year); cout << Date::get_default_day() << " " << Date::get_default_month() << " " << Date::get_default_year() << endl; } } return 0; }

a123456678 2019-12-02 02:01:43 0 浏览量 回答数 0

问题

c++ 日期类 求大神指教

a123456678 2019-12-01 20:11:16 1588 浏览量 回答数 1

回答

// app1.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include "app1.h" #include <vector> #include <algorithm> #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif ///////////////////////////////////////////////////////////////////////////// // The one and only application object CWinApp theApp; using namespace std; int cmp(const char * &a, const char * &b) { return strcmp(a, b) < 0; } int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // initialize MFC and print and error on failure if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: change error code to suit your needs cerr << _T("Fatal Error: MFC initialization failed") << endl; nRetCode = 1; } else { // TODO: code your application's behavior here. //CString strHello; //strHello.LoadString(IDS_HELLO); //cout << (LPCTSTR)strHello << endl; _WIN32_FIND_DATAA fd; vector<char *> list; char * filename; HANDLE h = FindFirstFile("c:\\*.*", &fd); int r = 1; while (h != INVALID_HANDLE_VALUE && r != 0) { if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if (strcmp(fd.cFileName, ".") && strcmp(fd.cFileName, "..")) { filename = new char[_MAX_PATH + 1]; strcpy(filename, fd.cFileName); list.push_back(filename); } } r = FindNextFile(h, &fd); } sort(list.begin(), list.end(), cmp); for (vector<char *>::iterator it = list.begin(); it != list.end(); it++) { cout<< *it << endl; } } return nRetCode; }

a123456678 2019-12-02 02:01:15 0 浏览量 回答数 0

问题

用"树"存储目录结构输出时出现了乱码

a123456678 2019-12-01 19:45:40 989 浏览量 回答数 1

回答

#include #include struct word { char c[30]; int n; }w[10000]; main() { FILE *fp; char b[30],ch; int i=0,m=1,j=0,k=0,t=0,flag=0; fp=fopen("d://a.txt","r+"); while((ch=fgetc(fp))!=EOF) { if('A'<=ch&&ch<='Z') ch=ch+32; if('a'<=ch && ch<='z') {b[i]=ch;i++;flag=1;} else { if(ch=='-'&&(ch=fgetc(fp))=='\n') { flag=0; } else { if(flag==1) { b[i]='\0';i=0;flag=0;m=0; for(j=0;j<k;j++) { if(strcmp(b,w[j].c)==0) {m=1;break;} } if(m) w[j].n++; else {w[k].n=1;strcpy(w[k].c,b);k++;} } } if('A'<=ch && ch<='Z') ch+=32; if('a'<=ch && ch<='z') {b[i]=ch;i++;flag=1;} } } // printf("%d\n",k); for(i=0;i printf("\n"); for(i=0;i { t=0; while(w[t].n==0) t++; for(j=1;j { if(w[j].n>w[t].n) t=j; else if(w[j].n==w[t].n) { if(strcmp(w[j].c,w[t].c)<0) t=j; } } printf("%s %d\n",w[t].c,w[t].n); w[t].n=0; } return 0; }

a123456678 2019-12-02 01:58:03 0 浏览量 回答数 0

回答

#include #include struct word { char c[30]; int n; }w[10000]; main() { FILE *fp; char b[30],ch; int i=0,m=1,j=0,k=0,t=0,flag=0; fp=fopen("d://a.txt","r+"); while((ch=fgetc(fp))!=EOF) { if('A'<=ch&&ch<='Z') ch=ch+32; if('a'<=ch && ch<='z') {b[i]=ch;i++;flag=1;} else { if(ch=='-'&&(ch=fgetc(fp))=='\n') { flag=0; } else { if(flag==1) { b[i]='\0';i=0;flag=0;m=0; for(j=0;j<k;j++) { if(strcmp(b,w[j].c)==0) {m=1;break;} } if(m) w[j].n++; else {w[k].n=1;strcpy(w[k].c,b);k++;} } } if('A'<=ch && ch<='Z') ch+=32; if('a'<=ch && ch<='z') {b[i]=ch;i++;flag=1;} } } // printf("%d\n",k); for(i=0;i printf("\n"); for(i=0;i { t=0; while(w[t].n==0) t++; for(j=1;j { if(w[j].n>w[t].n) t=j; else if(w[j].n==w[t].n) { if(strcmp(w[j].c,w[t].c)<0) t=j; } } printf("%s %d\n",w[t].c,w[t].n); w[t].n=0; } return 0; }

a123456678 2019-12-02 02:15:04 0 浏览量 回答数 0

回答

#include<stdio.h> #include<stdlib.h> #include<string.h> int main() { int n,i,j; char **str; char s[100]; printf("请输入n:"); scanf("%d",&n); getchar(); str=(char**)malloc(sizeof(char*)*n); for(i=0;i<n;i++) { str[i]=(char*)malloc(sizeof(char)*100); printf("请输入第%d个字符串\n",i+1); gets(str[i]); } puts("排序后的字符串为:"); for(i=0;i<n;i++) { for(j=i;j<n-1;j++) { if(strcmp(str[j+1],str[j])<0) { strcpy(s,str[j+1]); strcpy(str[j+1],str[j]); strcpy(str[j],s); } } } for(i=0;i<n;i++) { puts(str[i]); } for(i=0;i<n;i++) { free(str[i]); str[i]=NULL; } free(str); str=NULL; return 0; } 楼主看看满足条件不。

游客886 2019-12-02 01:19:13 0 浏览量 回答数 0

回答

你的代码有些问题:第一:getline()没有停止的条件,反正我在linux下尝试你的代码,必须CTRL+D才能停止!第二:你使用isalpha()函数,却给了个string类作为参数,它需要的是char啦! #include <vector> using namespace std; int main(void) { vector<string> words; string input; while(getline(cin,input)){ if(!strcmp(input.c_str(),"END")) break; words.push_back(input); } //for(decltype(words.size())n=0;n!=words.size();++n){ for(int n=0;n!=words.size();++n){ string temp=words[n]; //if(is string type)---->>assume what you want ... if(isalpha('A')){//The argument is char Type No string cout<<"I Got alpha"<<endl; break; } } //system("pause");//use for win OS return 0; }

a123456678 2019-12-02 01:58:11 0 浏览量 回答数 0

问题

指针数组两种排序方法结果大相径庭,求大神指导

a123456678 2019-12-01 19:24:38 908 浏览量 回答数 1

回答

qsort 功 能: 使用快速排序例程进行排序 用 法: void qsort(void *base, int nelem, int width, int (*fcmp)(const void *,const void *)); 各参数:1 待排序数组首地址 2 数组中待排序元素数量 3 各元素的占用空间大小 4 指向函数的指针,用于确定排序的顺序 程序例: #include <iostream> using namespace std; #include <stdlib.h> #include <string.h> int compare( const void *a, const void *b); char * list[5]= {"cat","car","cab","cap","can"}; int main() pascal 例程 program quicksort; const max = 100000; max = 1000; type tlist = array[1..max] of longint; var data : tlist; i : longint; procedure qsort(var a : tlist); procedure sort(l,r: longint); var i,j,x,y: longint; begin i:=l; j:=r; x:=a[(l+r) div 2]; repeat while a[i]<x do inc(i); while x<a[j] do dec(j); if i<=j then begin y:=a[i];a[i]:=a[j];a[j]:=y; inc(i);dec(j); end; until i>j; if l<j then sort(l,j); if i<r then sort(i,r); end; begin sort(1,max); end; begin write('Creating ',Max,' random numbers between 1 and 500000'); randomize; for i:=1 to max do data:=random(500000); writeln; writeln('Sorting...'); qsort(data); writeln; for i:=1 to max do begin write(data:7); if (i mod 10)=0 then writeln; end; end. c/c++ c函数qsort()和bsearch()的用法 使用qsort()排序 并 用 bsearch()搜索是一个比较常用的组合,使用方便快捷。 qsort 的函数原型是void __cdecl qsort ( void *base, size_t num, size_t width, int (__cdecl *comp)(const void *, const void* ) ) 其中base是排序的一个集合数组,num是这个数组元素的个数,width是一个元素的大小,comp是一个比较函数。 比如:对一个长为1000的数组进行排序时,int a[1000]; 那么base应为a,num应为 1000,width应为 sizeof(int),comp函数随自己的命名。 qsort(a,1000,sizeof(int ),comp); 其中comp函数应写为: int comp(const void *a,const void *b) { return *(int *)a-*(int *)b; } 是对一个二维数组的进行排序: int a[1000][2]; 其中按照a[0]的大小进行一个整体的排序,其中a[1]必须和a[0]一起移动交换。 qsort(a,1000,sizeof(int)*2,comp); int comp(const void *a,const void *b) { return ((int *)a)[0]-((int *)b)[0]; } 对字符串进行一个排序: char a[1000][20]; qsort(a,1000,sizeof(char)*20,comp); int comp(const void *a,const void *b { return strcmp((char *)a,(char *)b); } 对一个结构体进行排序: typedef struct str { char str1[11]; char str2[11]; }str,*stri; str strin[100001]=; int compare(const void *a,const void *b) { return strcmp( ((str*)a)->str2 , ((str*)b)->str2 ); } qsort(strin,total,sizeof(str),compare); 程序例: #include<iostream.h> #include<stdlib.h> #include<string.h> #define N 8 int compare(const void *a,const void *b); void main() { char s[8][10]={"January","February","March","April","May","June","July","September"}; int i; qsort(s,8,sizeof(char)*10,compare); for(i=0;i<N;i++) { for(j=0;j<10;j++) cout<<s[j]; cout<<endl; } } int compare(const void *a,const void *b) { if(strlen((char *)a)!=strlen((char *)b)) return strlen((char *)a)-strlen((char*)b); return (strcmp((char *)a,(char *)b)); }//vc++ 6.0 // VS2008编译通过,具有代表性的例子 #include <stdlib.h> #include <stdio.h> #include <string.h> int compare(const void *arg1,const void *arg2); int main(int argc,char **argv) { int i; argv++; argc--; qsort((void *)argv,(size_t)argc,sizeof(char *),compare); for(i=0;i<argc;++i) { printf("%s ",argv); printf("\n"); } } int compare(const void *arg1,const void *arg2) { return _stricmp(*(char **)arg1,*(char **)arg2); } 在运行输入cmd,在qsort.exe 参数1 参数2 将会排序 下面讲解下Pascal的快排代码 program kuaipai; var save:array[-1..10000000]of longint;//保存数字的数组 n,i:longint; procedure qsort(x,y:longint); var a,b,c,em,d,mid,e,i,j,k,l:longint; begin i:=x;//i代表第一个数字的数组坐标,下面叫“左指针” j:=y;//j代表第二个数字的数组坐标 叫"右指针" mid:=save[(x+y)div 2];//取,这2个数字中间的数组坐标(二分) repeat while save[i]<mid do inc(i); //在中间这个数字的左边,找比中间数大的数字 while save[j]>mid do dec(j);//在中间数右边,找比中间数小的数字 if i<=j//如果左指针在右指针左边 then begin em:=save[i];//交换2个数字的值,这个你会冒泡排序,或者选择排序任意一个,应该明白 save[i]:=save[j]; save[j]:=em; inc(i); dec(j); end; until i>j;//左指针跑到右指针右边了。。。 if i<y then qsort(i,y);//如果左指针,没到界限,那么 从左指针到界限进行上述排序 if j>x then qsort(x,j);//如果右指针没跑到,左界限,那么从右指针到左界限排序 end; begin randomize;//优化程序用的,暂时你不用会 readln(n);//读入,表示有N个数字 for i:=1 to n do//读入这N个数字 read(save[i]); qsort(1,n);//从第一个数字,到最后一个数字排序 for i:=1 to n do//输出 write(save[i],' '); end.

游客886 2019-12-02 01:17:29 0 浏览量 回答数 0

回答

net_ntoa函数返回的是一个临时的指针, 和你case语句的常量没有任何的关系,而且他们永远也不可能相等;就像 你定义一个变量 a = 100; 又定义一个变量b =100; 你能说a和b的值相等,他们在内存中存放的地址就相同么?显而易见是不同的;在C语言中, 一般对两个字符串相比较是否相等可以用strcmp函数来判断,不直接把他们的指针地址直接用逻辑运算符==还判断 ;你的问题这种情况,可以用if语句来写:char*a = inet_ntoa(addrClient.sin_addr);if(strcmp(a, "192.168.1.1") == 0){语句1;return;}if(strcmp(a, "192.168.1.2")==0){语句2;return}if(strcmp(a, "192.168.1.3")==0){语句3;return;}

a123456678 2019-12-02 01:58:35 0 浏览量 回答数 0

问题

单向链表学生姓名和成绩输入过程中无法输入问题

a123456678 2019-12-01 19:48:28 735 浏览量 回答数 1

问题

有关二叉树的词频统计 问题

杨冬芳 2019-12-01 19:31:17 1018 浏览量 回答数 1

回答

计算1+2+....+100的值 #include <stdio.h> main() { printf("%d\n",fun(100));//调用函数fun() } 递归函数 fun(int n) {int t; <br/>if(n==0||n==1) t=1; //如果n为0或为1 输出1 <br/>//n大于0,则为第n项和第n-1项的和,继续调用fun() <br/>//以此类推... <br/>else t=n+fun(n-1); <br/>return t; <br/>} 什么叫快速排序 qsort #include<string.h> #include<stdlib.h> #include<stdio.h> struct student{ int xuehao; char name[20]; int chengji; }; typedef struct student stu; sortbyxuehao(const void *,const void *); sortbyname(const void *,const void *); sortbychengji(const void *,const void *); void main() { int i; stu a[3]; int choice; int (*p)(const void * ,const void *); printf("please input record:\n"); printf("xuehao name chengji:\n"); for(i=0;i<3;i++) { scanf("%d",&a[i].xuehao); scanf("%s",a[i].name); scanf("%d",&a[i].chengji); } printf("choice_1: sorted xuehao:\n"); printf("choice_2: sorted name\n"); printf("choice_3: sorted chengji\n"); scanf("%d",&choice); while(choice!=0) { if(choice==1) p=sortbyxuehao; if(choice==2) p=sortbyname; if(choice==3) p=sortbychengji; qsort(a,3,sizeof(stu),p); if(choice==1) for(i=0;i<3;i++) printf("\n%d\t%s\t%d",a[i].xuehao,a[i].name,a[i].chengji); if(choice==2) for(i=0;i<3;i++) printf("\n%s\t%d\t%d",a[i].name,a[i].xuehao,a[i].chengji); if(choice==3) for(i=0;i<3;i++) printf("\n%d\t%s\t%d",a[i].chengji,a[i].name,a[i].xuehao); printf("\n"); scanf("%d",&choice); } } sortbyxuehao(const void *p,const void *q) { stu *x,*y; x=(stu*)p; y=(stu*)q; return (-((*x).xuehao-(*y).xuehao)); } sortbyname(const void *p,const void *q) { stu *x,*y; x=(stu*)p; y=(stu*)q; return strcmp((*x).name,(*y).name); } sortbychengji(const void *p,const void *q) { stu *x,*y; x=(stu*)p; y=(stu*)q; return ((*x).chengji-(*y).chengji); }

游客886 2019-12-02 01:25:13 0 浏览量 回答数 0

回答

我给你的代码只是映射简单例子:而注释给啦一些我的思路。其实对于你想要的这种效果,你还应该理解i/o编程可以参考:blog.csdn.net/querdaizhi/article/details/7436722若是你觉得还有问题我们继续交流! #include <stdlib.h> #include <stdio.h> #include <unistd.h> #include <sys/mman.h> #include <sys/stat.h> #include <fcntl.h> //#include "tlpi_hdr.h" #define errExit(msg) (perror(msg),(exit(1))) int main(int argc,char * argv[]) { char * addr; int fd; struct stat sb; if(argc !=2 ||strcmp(argv[1],"--help")==0) //usageErr("%s file\n",argv[0]); errExit("usage.."); fd=open(argv[1],O_RDONLY);//Looks ,here your should change as /* *while file[i].txt no finish * fd=open(file[i].txt) * mmap(......) * done... */ if(fd==-1) errExit("open"); /*Obtain the size of the file and use it to specify the size of the mapping and the size of the buffer to be written */ if(fstat(fd,&sb)==-1) errExit("fstat"); addr=mmap(NULL,sb.st_size,PROT_READ,MAP_PRIVATE,fd,0); if(addr==MAP_FAILED) errExit("mmap"); if(write(STDOUT_FILENO,addr,sb.st_size)!=sb.st_size) errExit("partial/failed write"); exit(EXIT_SUCCESS); }

a123456678 2019-12-02 02:15:30 0 浏览量 回答数 0

回答

#include <stdlib.h> #include <string.h> struct st_test { int cat; char caTrain[ 100 ]; double plane; float tree; }; int cmp( const void *arg1, const void *arg2 ); int main( void ) { int i = 0; struct st_test stArr[] = { { 2, "defghi", 5.2, 6.7 }, { 2, "aefghi", 5.0, 6.9 }, { 1, "aefghi", 5.1, 6.0 }, { 1, "aefghi", 5.9, 5.0 }, { 3, "elflfg", 9.0, 2.0 }, { 3, "elflfg", 9.0, 1.0 } }; qsort( stArr, 6, sizeof( struct st_test ), cmp ); for( i = 0; i < 6; i++ ) { printf( "%2d %8s %3.1lf %3.1f\n", stArr[ i ].cat, stArr[ i ].caTrain, stArr[ i ].plane, stArr[ i ].tree ); } return 0; } int cmp( const void *arg1, const void *arg2 ) { static const double DSTDZERO = 0.0000001; static const float FSTDZERO = 0.0000001; struct st_test *stArg1 = ( struct st_test * )arg1; struct st_test *stArg2 = ( struct st_test * )arg2; if( stArg1->cat != stArg2->cat ) return stArg1->cat > stArg2->cat ? 1 : -1; else if( strcmp( stArg1->caTrain, stArg2->caTrain ) != 0 ) return -strcmp( stArg1->caTrain, stArg2->caTrain ); else if( !( ( stArg1->plane - stArg2->plane >= -DSTDZERO ) && ( stArg1->plane - stArg2->plane <= DSTDZERO ) ) ) { if( stArg1->plane - stArg2->plane < -DSTDZERO ) return 1; if( stArg1->plane - stArg2->plane > DSTDZERO ) return -1; } else if( !( ( stArg1->tree - stArg2->tree >= -FSTDZERO ) && ( stArg1->tree - stArg2->tree <= FSTDZERO ) ) ) { if( stArg1->tree - stArg2->tree < -FSTDZERO ) return -1; if( stArg1->tree - stArg2->tree > FSTDZERO ) return 1; } return 0; }

a123456678 2019-12-02 02:17:46 0 浏览量 回答数 0

问题

求修改代码?(谢绝新代码)

a123456678 2019-12-01 19:22:16 828 浏览量 回答数 1

问题

C++str类函数问题,求解!

a123456678 2019-12-01 20:11:02 751 浏览量 回答数 1

回答

#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<string.h> struct student{ //结构体定义 char name[20]; //姓名 int num; //学号 int no; //排名 float score[6]; //各科成绩 float ave; //平均成绩 float tot; //总成绩 struct student *next; }; struct student *head; //定义全局变量 链表头 int i; //定义全局变量 科目总数 void key1(); //用户界面1 void key2(); //用户界面2 void fileinput(void); //文件录入函数 void maninput(void); //手动录入函数 void avetotal(); //求学生平均分总分函数 void number(); //求学生排名函数 void deorder(); //总分由高到低排序 void asorder(); //总分由低到高排序 void numorder(); //学号由小到大排序 void dictionary(); //按字典顺序排序 void output(); //输出函数 void save(); //保存函数 void senum(); //学号查找函数 void senam(); //名字查找函数 void modify(); //学生信息修改函数 void del(); //删除学生信息函数 void add(); //增加学生信息函数 void analy(); //统计各科各类别人数 void ansave(int a[6][5],float b[6][5]); //统计结果保存函数 void caculate(); //统计各科平均分及总分 void key1(){ //用户界面1 int j; printf("\n\n\t\\****************欢迎来到学生管理系统*******************\\\n"); printf("\tRead a file\n"); printf("\t1.文件录入\n"); printf("\t1.Record from file\n"); printf("\t2.手动录入\n"); printf("\t2.Append record manually\n"); printf("\t0.exit\n"); printf("\t请输入你选择的录入方式:"); scanf("%d",&j); switch(j) { case 1:fileinput();break; //调用文件录入函数 case 2:maninput();break; //调用手动输入函数 case 0:exit(0);break; //退出 default:{ printf("\n\t请重新选择"); key1();} } } void fileinput(void) //文件录入函数 { FILE *fp; struct student *p1=NULL,*p2=NULL; int j,k,l; char filename[20]; printf("\n\n\t请输入文件路径:"); //键盘输入文件名 scanf("%s",filename); if((fp=fopen(filename,"r"))==NULL) { printf("\n\t对不起,文件错误,打开文件失败"); exit(0); } printf("\n\t文件打开成功....."); printf("\n\t请输入科目总数:"); scanf("%d",&i); printf("\n\t请输入录入人数:"); scanf("%d",&j); head=p1=(struct student*)malloc(sizeof(struct student)); for(l=1;l<=j;l++) { fscanf(fp,"%s",p1->name); fscanf(fp,"%d",&p1->num); for(k=0;k<i;k++) fscanf(fp,"%f",&p1->score[k]); p1->next=(struct student*)malloc(sizeof(struct student)); p2=p1; p1=p1->next; } p1->next=NULL; p2->next=NULL; fclose(fp); printf("\n\t文件录入成功....."); } void maninput(void){ //手动录入函数 struct student *p1=NULL,*p2=NULL; int j; char ch; printf("\n\t请输入录入科目总数:"); scanf("%d",&i); head=p1=(struct student*)malloc(sizeof(struct student)); printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf("\n\t"); scanf("%s%d",p1->name,&p1->num); for(j=0;j<i;j++) scanf("%f",&p1->score[j]); printf("\n\t是否继续输入(y/n):"); getchar(); ch=getchar(); printf("\n\t"); while(ch=='y') { p2=(struct student*)malloc(sizeof(struct student)); scanf("%s%d",p2->name,&p2->num); for(j=0;j<i;j++) scanf("%f",&p2->score[j]); printf("\n\t是否继续输入(y/n):"); getchar(); ch=getchar(); printf("\n\t"); p1->next=p2; p1=p2; }; p1->next=NULL; printf("\n\t手动录入成功......"); printf("\n\t进入功能菜单"); } void avetotal(){ //求学生平均分总分 struct student *p1=NULL,*p2=NULL; int k; p1=head; while(p1!=NULL) { p1->tot=0; for(k=0;k<i;k++) p1->tot=p1->tot+p1->score[k]; p1->ave=p1->tot/i; p2=p1; p1=p1->next; } } void number(){ //求学生排名函数 struct student *p1=NULL,*p2=NULL,*p3=NULL; bool flag; int j=1; p3=p1=head; p2=p1->next; do{ if(p2==NULL) { p1->no=1; break; } flag=false; if((p1->tot)<(p2->tot)) { p1->next=p2->next; p2->next=p1; head=p2; p2=p1->next; p3=head; flag=true; } else{ p2=p2->next; p1=p1->next; }; while(p2!=NULL) { if((p1->tot)<(p2->tot)) { p1->next=p2->next; p3->next=p2; p2->next=p1; p3=p2; p2=p1->next; //调用交换函数 flag=true; } else { p2=p2->next; p1=p1->next; p3=p3->next; }; }; p3=p1=head; p2=p1->next; }while(flag); while(p1!=NULL) { p1->no=j; j++; p1=p1->next; } } void key2(){ //用户界面2 int j; char ch; printf("\n\n\n\n\n\t"); printf("\n\t***********************主菜单*****************************"); printf("\n\n\t"); printf("\n\t*********************排序区域(Sort)***********************"); printf("\n\t1. Sort in descending order by total score of every student"); printf("\n\t2. Sort in ascending order by total score of every student"); printf("\n\t3. Sort in ascending order by number"); printf("\n\t4. Sort in dictionary order by name"); printf("\n"); printf("\n\t*********************查询区域(Search)********************"); printf("\n\t5. Search by number"); printf("\n\t6. Search by name"); printf("\n\t"); printf("\n\t*********************修改区域(Modify)**********************"); printf("\n\t7. Modify information of student"); printf("\n\t8. Delete student"); printf("\n\t9. Add student"); printf("\n\t"); printf("\n\t*********************课程操作区域(Course)******************"); printf("\n\t10. Statistic analysis for every course"); printf("\n\t11.Calculate total and average score of every course"); printf("\n\t*********************保存文件区域(Save)********************"); printf("\n\t12.Write to a file"); printf("\n\t0.exit"); printf("\n\t请输入你的选择:"); scanf("%d",&j); switch(j) { case(1):deorder();break; //调用升序函数 case(2):asorder();break; //调用降序函数 case(3):numorder();break; //调用学号排序函数 case(4):dictionary();break; //调用字典排序函数 case(5):senum();break; //调用学号查询函数 case(6):senam();break; //调用名字查找函数 case(7):modify();break; //调用修改学生信息函数 case(8):del();break; //调用删除学生信息函数 case(9):add();break; //调用增加学生信息函数 case(10):analy();break; //调用各科各类别统计函数 case(11):caculate();break; //调用统计各科总分及平均分函数 case(12):save(); //调用保存函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 case(0):exit(0); //停止运行 default:{ printf("\n\t请重新选择"); key2();} } } void deorder(){ //总分由高到低排序 struct student *p1=NULL,*p2=NULL,*p3=NULL; bool flag; char ch; p3=p1=head; p2=p1->next; do{ if(p2==NULL) break; flag=false; if((p1->tot)<(p2->tot)) { p1->next=p2->next; p2->next=p1; head=p2; p2=p1->next; p3=head; flag=true; } else{ p2=p2->next; p1=p1->next; }; while(p2!=NULL) { if((p1->tot)<(p2->tot)) { p1->next=p2->next; p3->next=p2; p2->next=p1; p3=p2; p2=p1->next; //调用交换函数 flag=true; } else { p2=p2->next; p1=p1->next; p3=p3->next; }; }; p3=p1=head; p2=p1->next; }while(flag); output(); //调用输出函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 else printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void asorder(){ //总分由低到高排序 struct student *p1=NULL,*p2=NULL,*p3=NULL; bool flag; char ch; p3=p1=head; p2=p1->next; do{ if(p2==NULL) break; flag=false; if((p1->tot)>(p2->tot)) { p1->next=p2->next; p2->next=p1; head=p2; p2=p1->next; p3=head; flag=true; } else{ p2=p2->next; p1=p1->next; }; while(p2!=NULL) { if((p1->tot)>(p2->tot)) { p1->next=p2->next; p3->next=p2; p2->next=p1; p3=p2; p2=p1->next; flag=true; } else { p2=p2->next; p1=p1->next; p3=p3->next; }; }; p3=p1=head; p2=p1->next; }while(flag); output(); //调用输出函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 else printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void output(){ //输出函数 struct student *p1=NULL; int j; printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf(" 平均分 总分 排名"); printf("\n\t"); p1=head; while(p1!=NULL) { printf("%-13s%-6d",p1->name,p1->num); for(j=0;j<i;j++) printf("%-7.1f",p1->score[j]); printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no); printf("\n\t"); p1=p1->next; } } void numorder(){ //学号排序 struct student *p1=NULL,*p2=NULL,*p3=NULL; bool flag; char ch; p3=p1=head; p2=p1->next; do{ if(p2==NULL) break; flag=false; if((p1->num)>(p2->num)) { p1->next=p2->next; p2->next=p1; head=p2; p2=p1->next; p3=head; flag=true; } else{ p2=p2->next; p1=p1->next; }; while(p2!=NULL) { if((p1->num)>(p2->num)) { p1->next=p2->next; p3->next=p2; p2->next=p1; p3=p2; p2=p1->next; flag=true; } else { p2=p2->next; p1=p1->next; p3=p3->next; }; }; p3=p1=head; p2=p1->next; }while(flag); output(); //调用输出函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 else printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void dictionary(){ //字典排序 struct student *p1=NULL,*p2=NULL,*p3=NULL; bool flag; char ch; p3=p1=head; p2=p1->next; do{ if(p2==NULL) break; flag=false; if(strcmp(p1->name,p2->name)>0) { p1->next=p2->next; p2->next=p1; head=p2; p2=p1->next; p3=head; flag=true; } else{ p2=p2->next; p1=p1->next; }; while(p2!=NULL) { if(strcmp(p1->name,p2->name)>0) { p1->next=p2->next; p3->next=p2; p2->next=p1; p3=p2; p2=p1->next; flag=true; } else { p2=p2->next; p1=p1->next; p3=p3->next; }; }; p3=p1=head; p2=p1->next; }while(flag); output(); //调用输出函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 else printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void save(){ //保存函数 char filename[20]; FILE *fp; struct student *p1=NULL; int k; p1=head; printf("\n\t请输入你要保存到的目标文件:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("\n\t对不起,文件打开失败!!!"); save(); exit(0); } while(p1!=NULL) { fprintf(fp,"%20s%6d",p1->name,p1->num); for(k=0;k<i;k++) fprintf(fp,"%6.1f",p1->score[k]); fprintf(fp,"%6.1f%7.1f%4d\n",p1->ave,p1->tot,p1->no); p1=p1->next; } fclose(fp); printf("\n\t保存成功....."); } void senum(){ //学号查询函数 int n,j; char ch; bool flag; struct student *p1; do { flag=true; printf("\n\t请输入该学生学号:"); scanf("%d",&n); p1=head; while(p1!=NULL) { if(p1->num==n) { flag=false; printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf(" 平均分 总分 排名"); printf("\n\t"); printf("%-10s%-6d",p1->name,p1->num); for(j=0;j<i;j++) printf("%-7.1f",p1->score[j]); printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no); break; } p1=p1->next; } if(flag) printf("\n\t对不起,该学号不存在!!!!"); printf("\n\t是否继续查找(y/n):"); getchar(); ch=getchar(); }while(ch=='y'); printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void senam(){ //名字查询函数 int j; bool flag; char ch,na[20]; struct student *p1; do { printf("\n\t请输入该学生姓名:"); scanf("%s",na); p1=head; flag=true; while(p1!=NULL) { if(strcmp(p1->name,na)==0) { flag=false; printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf(" 平均分 总分 排名"); printf("\n\t"); printf("%-10s%-6d",p1->name,p1->num); for(j=0;j<i;j++) printf("%-7.1f",p1->score[j]); printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no); } p1=p1->next; } if(flag) printf("\n\t对不起,该学生不存在!!!"); printf("\n\t是否继续查找(y/n):"); getchar(); ch=getchar(); }while(ch=='y'); printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void modify(){ //修改学生信息函数 int n,j; char ch; bool flag; struct student *p1=NULL; do{ flag=true; p1=head; printf("\n\t请输入修改学生的学号:"); scanf("%d",&n); while(p1!=NULL) { if(p1->num==n) { flag=false; printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf(" 平均分 总分 排名"); printf("\n\t"); printf("%-13s%-6d",p1->name,p1->num); for(j=0;j<i;j++) printf("%-7.1f",p1->score[j]); printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no); printf("\n\t是否修改(y/n):"); getchar(); ch=getchar(); if(ch=='n')break; printf("\n\t请重新输入该学生信息.."); printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf("\n\t"); scanf("%s%d",p1->name,&p1->num); for(j=0;j<i;j++) scanf("%f",&p1->score[j]); printf("\n\t修改成功...."); break; } p1=p1->next; } if(flag) printf("\n\t对不起,该学号不存在!!!!"); printf("\n\t是否继续修改(y/n):"); getchar(); ch=getchar(); }while(ch=='y'); avetotal(); //调用求总分平均分函数 number(); //调用求排名函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void del(){ //删除学生信息函数 struct student *p1=NULL,*p2=NULL; int n,j; bool flag; char ch; do{ flag=true; printf("\n\t请输入删除学生的学号:"); scanf("%d",&n); p1=head; p2=p1->next; if(p1->num==n) { flag=false; printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf(" 平均分 总分 排名"); printf("\n\t"); printf("%-13s%-6d",p1->name,p1->num); for(j=0;j<i;j++) printf("%-7.1f",p1->score[j]); printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no); printf("\n\t是否修改(y/n):"); getchar(); ch=getchar(); if(ch=='n')break; free(p1); head=p1=p2; p2=p1->next; printf("\n\t删除成功...."); } while(p2!=NULL) { if(p2->num==n) { printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf(" 平均分 总分 排名"); printf("\n\t"); printf("%-13s%-6d",p1->name,p1->num); for(j=0;j<i;j++) printf("%-7.1f",p1->score[j]); printf("%-7.1f%7.1f%4d",p1->ave,p1->tot,p1->no); printf("\n\t是否修改(y/n):"); getchar(); ch=getchar(); if(ch=='n')break; flag=false; p1->next=p2->next; free(p2); printf("\n\t删除成功...."); break; } p1=p2; p2=p1->next; } if(flag) printf("\n\t对不起,该学号不存在!!!!"); printf("\n\t是否继续删除(y/n):"); getchar(); ch=getchar(); }while(ch=='y'); number(); //调用求排名函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void add(){ //增加学生信息函数 struct student *p1; int j; char ch; do{ p1=(struct student*)malloc(sizeof(struct student)); printf("\n\t姓名 学号"); for(j=1;j<=i;j++) printf(" 成绩%d",j); printf("\n\t"); scanf("%s%d",p1->name,&p1->num); for(j=0;j<i;j++) scanf("%f",&p1->score[j]); p1->next=head; head=p1; printf("\n\t添加成功...."); printf("\n\t是否继续添加(y/n):"); getchar(); ch=getchar(); }while(ch=='y'); avetotal(); //调用求总分平均分函数 number(); //调用求排名函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void analy(){ //统计各科各类别人数函数 struct student *p1; int cou[6][5]; float per[6][5]; int j,k,l=0; char ch; for(j=0;j<i;j++) for(k=0;k<5;k++) cou[j][k]=0; //计数器清零 p1=head; while(p1!=NULL) { l++; for(j=0;j<i;j++) { if(p1->score[j]>=90) cou[j][0]++; else if(p1->score[j]>=80) cou[j][1]++; else if(p1->score[j]>=70) cou[j][2]++; else if(p1->score[j]>=60) cou[j][3]++; else cou[j][4]++; } p1=p1->next; } printf("\n\t"); for(j=1;j<=i;j++) //输出统计结果 printf("科目%d ",j); printf("\n100-90"); for(j=0;j<i;j++) { per[j][0]=cou[j][0]*1.0/l; printf("%2d(%3.2f)",cou[j][0],per[j][0]); } printf("\n89-80 "); for(j=0;j<i;j++) { per[j][1]=cou[j][1]*1.0/l; printf("%2d(%3.2f)",cou[j][1],per[j][1]); } printf("\n79-70 "); for(j=0;j<i;j++) { per[j][2]=cou[j][2]*1.0/l; printf("%2d(%3.2f)",cou[j][2],per[j][2]); } printf("\n69-60 "); for(j=0;j<i;j++) { per[j][3]=cou[j][3]*1.0/l; printf("%2d(%3.2f)",cou[j][3],per[j][3]); } printf("\n59-0 "); for(j=0;j<i;j++) { per[j][4]=cou[j][4]*1.0/l; printf("%2d(%3.2f)",cou[j][4],per[j][4]); } printf("\n\t是否保存统计结果到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') ansave(cou,per); //调用统计结果保存函数 printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 printf("\n\t是否保存学生信息到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void ansave(int a[6][5],float b[6][5]){ //统计结果保存函数 FILE *fp; int j; char filename[20]; printf("\n\t请输入保存的文件名:"); scanf("%s",filename); if((fp=fopen(filename,"w"))==NULL) { printf("\n\t对不起,文件打开失败!!!!"); key2(); } for(j=1;j<=i;j++) fprintf(fp,"科目%d ",j); fprintf(fp,"\n100-90"); for(j=0;j<i;j++) fprintf(fp,"%2d(%3.2f)",a[j][0],b[j][0]); fprintf(fp,"\n89-80 "); for(j=0;j<i;j++) fprintf(fp,"%2d(%3.2f)",a[j][1],b[j][1]); fprintf(fp,"\n79-70 "); for(j=0;j<i;j++) fprintf(fp,"%2d(%3.2f)",a[j][2],b[j][2]); fprintf(fp,"\n69-60 "); for(j=0;j<i;j++) fprintf(fp,"%2d(%3.2f)",a[j][3],b[j][3]); fprintf(fp,"\n59-0 "); for(j=0;j<i;j++) fprintf(fp,"%2d(%3.2f)",a[j][4],b[j][4]); fclose(fp); printf("\n\t保存成功......"); } void caculate(){ //统计各科总分平均分函数 struct student *p1=NULL; float to[6],av[6]; int j,l=0; char ch; for(j=0;j<6;j++) to[j]=0; p1=head; while(p1!=NULL) { l++; for(j=0;j<i;j++) to[j]=to[j]+p1->score[j]; p1=p1->next; } for(j=0;j<i;j++) av[j]=to[j]*1.0/l; printf("\n\t"); for(j=1;j<=i;j++) //输出统计结果 printf("科目%d ",j); printf("\n总分 "); for(j=0;j<i;j++) printf("%8.1f",to[j]); printf("\n平均分"); for(j=0;j<i;j++) printf("%8.1f",av[j]); printf("\n\t是否返回主菜单(y/n):"); getchar(); ch=getchar(); if(ch=='y') key2(); //调用用户界面2 printf("\n\t是否保存学生信息到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 exit(0); } void main(){ char ch; key1(); avetotal(); number(); key2(); printf("\n\t是否保存修改到文件(y/n):"); getchar(); ch=getchar(); if(ch=='y') save(); //调用保存函数 }

a123456678 2019-12-02 02:00:54 0 浏览量 回答数 0

回答

#define MAXADDRS 32 extern char *if_names[MAXADDRS]; extern char *ip_names[MAXADDRS]; extern char *hw_addrs[MAXADDRS]; extern unsigned long ip_addrs[MAXADDRS]; // Function prototypes void InitAddresses(); void FreeAddresses(); void GetIPAddresses(); void GetHWAddresses(); IPAddress.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <sys/ioctl.h> #include <sys/types.h> #include <sys/socket.h> #include <netinet/in.h> #include <netdb.h> #include <arpa/inet.h> #include <sys/sockio.h> #include <net/if.h> #include <errno.h> #include <net/if_dl.h> #include <net/ethernet.h> #include "IPAddress.h" #define min(a,b) ((a) < (b) ? (a) : (b)) #define max(a,b) ((a) > (b) ? (a) : (b)) #define BUFFERSIZE 4000 char *if_names[MAXADDRS]; char *ip_names[MAXADDRS]; char *hw_addrs[MAXADDRS]; unsigned long ip_addrs[MAXADDRS]; static int nextAddr = 0; void InitAddresses() { int i; for (i=0; i<MAXADDRS; ++i) { if_names[i] = ip_names[i] = hw_addrs[i] = NULL; ip_addrs[i] = 0; } } void FreeAddresses() { int i; for (i=0; i<MAXADDRS; ++i) { if (if_names[i] != 0) free(if_names[i]); if (ip_names[i] != 0) free(ip_names[i]); if (hw_addrs[i] != 0) free(hw_addrs[i]); ip_addrs[i] = 0; } InitAddresses(); } void GetIPAddresses() { int i, len, flags; char buffer[BUFFERSIZE], *ptr, lastname[IFNAMSIZ], *cptr; struct ifconf ifc; struct ifreq *ifr, ifrcopy; struct sockaddr_in *sin; char temp[80]; int sockfd; for (i=0; i<MAXADDRS; ++i) { if_names[i] = ip_names[i] = NULL; ip_addrs[i] = 0; } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket failed"); return; } ifc.ifc_len = BUFFERSIZE; ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, &ifc) < 0) { perror("ioctl error"); return; } lastname[0] = 0; for (ptr = buffer; ptr < buffer + ifc.ifc_len; ) { ifr = (struct ifreq *)ptr; len = max(sizeof(struct sockaddr), ifr->ifr_addr.sa_len); ptr += sizeof(ifr->ifr_name) + len; // for next one in buffer if (ifr->ifr_addr.sa_family != AF_INET) { continue; // ignore if not desired address family } if ((cptr = (char *)strchr(ifr->ifr_name, ':')) != NULL) { *cptr = 0; // replace colon will null } if (strncmp(lastname, ifr->ifr_name, IFNAMSIZ) == 0) { continue; /* already processed this interface */ } memcpy(lastname, ifr->ifr_name, IFNAMSIZ); ifrcopy = *ifr; ioctl(sockfd, SIOCGIFFLAGS, &ifrcopy); flags = ifrcopy.ifr_flags; if ((flags & IFF_UP) == 0) { continue; // ignore if interface not up } if_names[nextAddr] = (char *)malloc(strlen(ifr->ifr_name)+1); if (if_names[nextAddr] == NULL) { return; } strcpy(if_names[nextAddr], ifr->ifr_name); sin = (struct sockaddr_in *)&ifr->ifr_addr; strcpy(temp, inet_ntoa(sin->sin_addr)); ip_names[nextAddr] = (char *)malloc(strlen(temp)+1); if (ip_names[nextAddr] == NULL) { return; } strcpy(ip_names[nextAddr], temp); ip_addrs[nextAddr] = sin->sin_addr.s_addr; ++nextAddr; } close(sockfd); } void GetHWAddresses() { struct ifconf ifc; struct ifreq *ifr; int i, sockfd; char buffer[BUFFERSIZE], *cp, *cplim; char temp[80]; for (i=0; i<MAXADDRS; ++i) { hw_addrs[i] = NULL; } sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket failed"); return; } ifc.ifc_len = BUFFERSIZE; ifc.ifc_buf = buffer; if (ioctl(sockfd, SIOCGIFCONF, (char *)&ifc) < 0) { perror("ioctl error"); close(sockfd); return; } ifr = ifc.ifc_req; cplim = buffer + ifc.ifc_len; for (cp=buffer; cp < cplim; ) { ifr = (struct ifreq *)cp; if (ifr->ifr_addr.sa_family == AF_LINK) { struct sockaddr_dl *sdl = (struct sockaddr_dl *)&ifr->ifr_addr; int a,b,c,d,e,f; int i; strcpy(temp, (char *)ether_ntoa((const struct ether_addr *)LLADDR(sdl))); sscanf(temp, "%x:%x:%x:%x:%x:%x", &a, &b, &c, &d, &e, &f); sprintf(temp, "%02X:%02X:%02X:%02X:%02X:%02X",a,b,c,d,e,f); for (i=0; i<MAXADDRS; ++i) { if ((if_names[i] != NULL) && (strcmp(ifr->ifr_name, if_names[i]) == 0)) { if (hw_addrs[i] == NULL) { hw_addrs[i] = (char *)malloc(strlen(temp)+1); strcpy(hw_addrs[i], temp); break; } } } } cp += sizeof(ifr->ifr_name) + max(sizeof(ifr->ifr_addr), ifr->ifr_addr.sa_len); } close(sockfd); } 使用的方法 - (void)getIPAddress { InitAddresses(); GetIPAddresses(); GetHWAddresses(); int i; NSString *deviceIP = nil; for (i=0; i<MAXADDRS; ++i) { static unsigned long localHost = 0x7F000001; // 127.0.0.1 unsigned long theAddr; theAddr = ip_addrs[i]; if (theAddr == 0) break; if (theAddr == localHost) continue; NSLog(@"Name: %s MAC: %s IP: %s\n", if_names[i], hw_addrs[i], ip_names[i]); } } [self getIPAddress]就能获取当前IP地址。 2013年6月11日添加 今天我项目添加一个功能,实时检测设备IP地址,发现上述代码FreeAddress也无用。 在http://stackoverflow.com/questions/7072989/iphone-ipad-how-to-get-my-ip-address-programmatically有更为简单的获取IP地址的方法,并且能实时更新。

a123456678 2019-12-02 03:13:02 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播