C语言有关strstr()的问题 10C

代码如下,在VC++6.0中编译连接都没问题,就是在遍历txt文件用strstr函数时会出现问题,直接停止运行,求大神指点!!!万分感谢!!!!

 //#include <windows.h>
#include <winsock2.h>
#include <stdio.h>
#include <string.h>
#define SERVER_PORT 5432
#define MAX_PENDING 5
#define MAX_LINE 256
#define true 1
#define false 0
#pragma comment(lib,"ws2_32.lib")
int main()
{
    WSADATA WSAData;
    int WSAreturn;

    /* server address */
    struct sockaddr_in sin;
    struct sockaddr_in remote;
    char buf[MAX_LINE];
    int len;
    int s, new_s;

    char line[MAX_LINE];    //读取到的每一行
    FILE *fp;            /*文件指针*/
    //char ans[MAX_LINE];
    //bool flag;
    char * b;
    //int l;



    WSAreturn = WSAStartup(0x101,&WSAData);
    if(WSAreturn)
    {
        fprintf(stderr, "simplex-talk: WSA error.\n");   //格式化输出至出错文件stderr
        exit(1);
    }
/* build address data structure */
  memset((char *)&sin, 0, sizeof(sin));
    sin.sin_family = AF_INET;
    sin.sin_addr.s_addr = INADDR_ANY;
    sin.sin_port = htons(SERVER_PORT);
                                                   //服务器端在listen之前会调用bind(),而客户端就不用调用,在connect()时由系统随机生成一个。
    /* setup passive open */
    if ((s = socket(PF_INET, SOCK_STREAM, 0)) < 0) {//socket函数创建一个socket描述符(socket descriptor),它唯一标识一个socket。
        perror("simplex-talk: socket failed.");            // s   为socket描述字
        exit(1);
    }
    if ((bind(s, (struct sockaddr *)&sin, sizeof(sin))) < 0) {//bind函数把一个地址族中的特定地址赋给socket
        perror("simplex-talk: bind failed.");                 //sin  一个const struct sockaddr *指针,指向要绑定给s的协议地址
        exit(1);                                              //sizeof(sin) 地址长度
    }

     printf("server is ready in listening ...\n");  //服务器监听socket,客户端这时调用connect()发出连接请求,服务器端就会接收到这个请求。
     listen(s, MAX_PENDING);

    /* wait for connection, then receive and print text */
    while(1) {
        len = sizeof(struct sockaddr_in);
        if ((new_s = accept(s, (struct sockaddr *)&remote, &len)) < 0){  //服务器用accept接收客户端的连接请求
            perror("simplex-talk: accept failed.");                      //服务器与客户已经建立连接,
                                                                         //可以调用网络I/O进行读写操作了,即实现了网咯中不同进程之间的通信.
            exit(1);
        }
  //printf("received a connection from %s : \n", inet_ntoa(remote.sin_addr));


        while (len = recv(new_s, buf, sizeof(buf), 0))  {                 //int recv( SOCKET s, char FAR *buf, int len, int flags); 
            //printf("received %2d chars:", len);                         //第一个参数指定 接收端套接字描述符   即s;
           printf("客户端: "); 
           fputs(buf, stdout);                                           //第二个参数指明一个缓冲区用来存放recv函数接收到的数据;
           //fputs将该字符串写入文件stdout,但并不写入结尾的'\0'。        //第三个参数指明buf的参数   第四个参数一般置0。



        //在datafile中遍历得出答案,并放入缓冲区。
        //strcpy(buf,reply(buf));
           fp = fopen("C:\\Users\\user\\Desktop\\chatfile.txt","r")
            if(fp == NULL)
            {
                perror("打开失败!");
                exit(1);
            }


        int l=strlen(buf);
    //  bool flag;
        //char * b;
        while(fgets(line,sizeof(line),fp))
        {   
            if(!strstr(line,buf)){
            //flag = false;
            //printf("测试");
            }
            else{
        //  flag = true;                
                if(line[l]==' '||line[l]==' '){
                    b=strstr(line,"     ");
                    break;
                    }
                else{
                //flag = false;
                    }
                }       
            }//while
        fclose(fp);

        /*if(flag==false){
            char reply[]={"服务器:我听不懂您的意思。"};
            puts(reply);
            int lens;
            lens = strlen(reply);   
            send(new_s,reply,lens,0);   
        }
        else{*/
            printf("服务器:");
            puts(b);
            printf("\n");

            char * ans=b;
            int lens;
            lens = strlen(ans);   
            send(new_s,ans,lens,0);         
            }

        }

        closesocket(new_s);    //关闭连接
    //}

    WSACleanup();
    return 0;
}


2个回答

使用strstr的字符串必须以 '\0' 结尾。不然就越界了。你这里很明显不会以 '\0' 结尾

图片说明
修改了向buf和读取到的line末尾都加了,但还是出现这个问题。图片说明

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
C语言关于strstr 的疑问
#include #include #define SIZE 30 void main() { char str1 [SIZE]; char str2 [SIZE]; char *p; int len2; printf("Input first string:"); scanf("%s",str1); printf("Input deleted string:"); scanf("%s",str2); len2 = strlen(str2); while(p = strstr(str1,str2)) { strcpy(p,p+len2); } printf("result string:%s\n",str1); } 这是一道删除 子串的程序 比如 这句 is a is dog 删除 is 首先p = strstr(str1,str2 )找到了is 首地址也就是第一个is 那p+len2 什么意思,我不理解,具体应用到 这个实例程序怎么走的啊,不明白这里。 p+len2等于什么
c语言-想通过strstr函数检索关键词
刚学c语言,期末作业是要求做一个search engine。 第一部分要求输入关键词,在几百个文件中检索,有哪个文件内容中有这个词,就输出该文件名,如输入stake这个词,输出001.txt。 本来想用strstr查找的,但是折腾了几天,要不就是所有文件名都无法输出,全是NULL,要不就不管输入什么词,都会把所有文件名输出来(两个极端)。 所以想问问大佬们,是我哪一块做错了,毕竟所有函数用法都是百度查的套上去,本人也不是很了解其实质。![图片说明](https://img-ask.csdn.net/upload/201812/24/1545644119_626567.png)![图片说明](https://img-ask.csdn.net/upload/201812/24/1545644132_483045.png)![图片说明](https://img-ask.csdn.net/upload/201812/24/1545644144_550011.png)
在linux下运行c语言代码出现这种段错误的原因。
## 1.当将lockId代码块放在后面时会出现段错误。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> //#include "packag_server.h" #define DATA_LEN 500 char *Login_post_reply(char *msg) { char *productId = malloc(DATA_LEN); char *featureId = malloc(DATA_LEN); char *lockId = malloc(DATA_LEN); char *t = malloc(DATA_LEN); productId = strstr(msg, "productId"); productId += 11; t = strstr(productId, ","); *t = '\0'; printf("productId = %s\n",productId); featureId = strstr(msg, "featureId"); featureId += 11; t = strstr(featureId, ","); *t = '\0'; printf("featureId = %s\n",featureId); lockId = strstr(msg, "lockId"); lockId += 9; t = strstr(lockId, "\""); *t = '\0'; printf("lockId = %s\n",lockId); printf("productId = %s featureId = %s lockId = %s\n",productId, featureId, lockId); /* if(qp(productId, featureId, lockId)) { } */ } int main() { char data[] = "{ \n" " id\": 12345,\n" " featureId\": 0,\n" " productId\": 0,\n" " lockId\":\"123456\",\n" " sign\":\"7f383431123232\",\n" " method\":\n\"Login_post\"\n" "}\n"; Login_post_reply(data); //printf("data = %s\n",data); return 0; } ``` 编译后执行结果如下: ![图片说明](https://img-ask.csdn.net/upload/202001/13/1578877394_881944.png) ## 2.将lockId代码块放在首位能够正常执行。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> //#include "packag_server.h" #define DATA_LEN 500 char *Login_post_reply(char *msg) { char *productId = malloc(DATA_LEN); char *featureId = malloc(DATA_LEN); char *lockId = malloc(DATA_LEN); char *t = malloc(DATA_LEN); lockId = strstr(msg, "lockId"); lockId += 9; t = strstr(lockId, "\""); *t = '\0'; printf("lockId = %s\n",lockId); productId = strstr(msg, "productId"); productId += 11; t = strstr(productId, ","); *t = '\0'; printf("productId = %s\n",productId); featureId = strstr(msg, "featureId"); featureId += 11; t = strstr(featureId, ","); *t = '\0'; printf("featureId = %s\n",featureId); printf("productId = %s featureId = %s lockId = %s\n",productId, featureId, lockId); /* if(qp(productId, featureId, lockId)) { } */ } int main() { char data[] = "{ \n" " id\": 12345,\n" " featureId\": 0,\n" " productId\": 0,\n" " lockId\":\"123456\",\n" " sign\":\"7f383431123232\",\n" " method\":\n\"Login_post\"\n" "}\n"; Login_post_reply(data); //printf("data = %s\n",data); return 0; } ``` 编译后执行结果如下: ![图片说明](https://img-ask.csdn.net/upload/202001/13/1578877584_378874.png) 这种段错误的原因是什么?
C语言在字符串A中寻找字符串B的出现次数。
代码如下 #include<stdio.h> #include<string.h> main() { int i = 0; char str[20]; char str1[20]; printf("Please enter a character string,:"); scanf("%s", str); printf("Please enter a search term.:"); scanf("%s", str1); while (strstr(str, str1) != NULL) { i++; strstr(str, str1); } printf("Ans=%d", i); } 有几个问题想问 1为什么一直处于无限循环的状态 2strstr(str,str1)这个写法对不对 比如str=seed str1=ee,如果想把str的值变为第一次strstr操作之后的结果 也就是 seed-e 该如何操作
C语言一个字符串的问题
#include <stdio.h> #include <string.h> int main(){ char s1[81], s2[81]; scanf("%s", s1); scanf("%s", s2); char *find = NULL; int len2 = (int)strlen(s2); while ((find = strstr(s1, s2)) != NULL) { while ( *(find + len2) ) { *find = *(find + len2); find++; } *find = '\0'; } puts(s1); } ``` ``` 上面是关于s1中去除S2中的字符串 然后输出去除后的S1字符串.我看见别人这样做后可以成功得到结果 但是上面没有任何关于S1的操作.所以有疑问请教各位前辈1
书本上的C语言grep程序一个点理解不了,求大家为我解析
#include<stdio.h> #include<string.h> #define MAXLINE 1000 #define getline _getline int getline(char *line, int max); main(int argc, char *argv[]) { char line[MAXLINE]; int found = 0; if (argc != 2) printf("Usage:\n"); else while (getline(line,MAXLINE)>0) if (strstr(line,argv[1])!=NULL){ printf("%s",line); found++; } return found; } int getline(char *s, int lim) { int c; char *t = s; while (--lim > 0 && (c = getchar()) != EOF && c != '\n') *s++ = c; if (c == '\n') *s++ = c; *s = '\0'; return s - t; } 我理解不了这个程序中这一段 if (strstr(line,argv[1])!=NULL){ printf("%s",line); strstr返回一个指针,这个指针指向line里面匹配到的内容 那么为什么打印line会打印出这个匹配的内容呢?
C语言 把window文件路径的 \ 替换成/
我有一段程序是在linux下跑的,想弄到windows下。 可以弄过来之后,输入文件的路径却出了些问题。 使用C:\1.dat就不行, 使用C:/1.dat就可以。 因此我尝试用替换字符的程序去把 \ 替换成 / 。 char *replacestr(char *strbuf, char *sstr, char *dstr) { char *p,*p1; int len; if ((strbuf == NULL)||(sstr == NULL)||(dstr == NULL)) return NULL; p = strstr(strbuf, sstr); //返回字符串第一次出现的地址,否则返回NULL if (p == NULL) /*not found*/ return NULL; len = strlen(strbuf) + strlen(dstr) - strlen(sstr); p1 = malloc(len); memset(p1, 0, len); strncpy(p1, strbuf, p-strbuf); strcat(p1, dstr); p += strlen(sstr); strcat(p1, p); return p1; } 然后这样调用 filename = replacestr(filename, "\\\", "/"); 但是返回的是空指针,我也尝试了类似的程序,都无法替换,不知道问题出在什么地方
C库函数strstr实现中为什么要用新建const char*变量代替参数?
const char * IND(const char * str, const char * substr) { assert(substr != NULL && str != NULL); const char * psub = substr; const char * pstr = str; while (*pstr) { const char * tmp = pstr; while (*tmp++ == *psub++); if (*psub == '\0') return pstr; psub = substr; pstr++; } return NULL; } 为什么要 const char * psub = substr; const char * pstr = str; const char * tmp = pstr; 而不是直接操作
做了个简单c语言通讯录出现了问题
就是选择分类的时候本来0是返回上一项菜单的,结果变成新的一类 #include<stdio.h> /*标准输入输出函数库*/ #include<stdlib.h> /*标准函数库*/ #include<string.h> #include<conio.h> FILE *fp; struct Data { int fenlei; char name[10]; //姓名 char tel[15]; //电话 char age[8]; //年龄 char qq[10]; //QQ号 } ren[1000]; struct Data1 { struct Data data; struct Data1 *next; } *p,*p1,*p2; struct zhanghao { char username[20]; char password[10]; } zh,*zh1,*zh2; struct LNode { char clas[20]; int length; struct Data1 *next; } a[6]; int menu() //主菜单选择函数 { int c; //定义一个整型变量 do { system("cls"); //清屏 printf("\t*******通讯录*******\n"); printf("\t--------------------\n"); printf("\t 1、通讯信息显示 \n"); printf("\t 2、通讯信息保存 \n"); printf("\t 3、通讯信息删除 \n"); printf("\t 4、通讯信息修改 \n"); printf("\t 5、通讯信息增加 \n"); printf("\t 6、通讯信息查询 \n"); printf("\t 0. 退出 \n"); printf("\t--------------------\n"); printf("\t请您选择(0-6):"); scanf("%d",&c); } while(c>7&&c<0); return(c); } void openclass() { FILE *fp1; int i; if ((fp1=fopen("contact.dat","r"))==NULL) { printf("\n不存在分类类别"); if ((fp1=fopen("contact.dat","w"))==NULL) //不存在则进行创建 { printf("\n建立失败"); exit(0); } strcpy(a[1].clas,"1.家人亲戚"); //依次将下一条信息复制到上一条的位置 strcpy(a[2].clas,"2.朋友"); strcpy(a[3].clas,"3.同学"); strcpy(a[4].clas,"4.同事"); strcpy(a[5].clas,"5.陌生人"); strcpy(a[6].clas,"6.其他"); for (i=1; i<=6; i++) { if (fprintf(fp1,"%s\n",a[i].clas)==0) { printf("\n文件保存错误!\n"); } a[i].length=0; a[i].next=NULL; } } else { rewind(fp1); for (i=1; !feof(fp1) && fscanf(fp1,"%s\n",a[i].clas); i++)a[i].next=NULL; printf("\n类别文件导入成功\n"); } fclose(fp1); //printf("\n按任意键返回主菜单:"); // getch();//按任意键退出 return; } int select() { int c,i=1; do { printf("\n1.家人亲戚\n"); printf("2.朋友\n"); printf("3.同学\n"); printf("4.同事\n"); printf("5.陌生人\n"); printf("6.其他\n"); printf("0.返回主菜单\n"); printf("请您选择(0-6):"); scanf("%d",&c); if(c<0||c>6) printf("输入错误!请重新输入:\n"); } while(c<0||c>6); if (c==0)return; else return (c); } int checkUerValid(struct zhanghao *zh1)/*校验用户合法性*/ { FILE*fp; struct zhanghao zh[1],*zh2=zh; char *usr,*pwd; int check=0; usr=zh1->username; pwd=zh1->password; if((fp=fopen("user.dat","rb"))==NULL) { printf("File open error!\n"); exit(0); } rewind(fp); fread(zh2,sizeof(struct zhanghao),1,fp); if((strcmp(usr,zh2->username)==0)&&(strcmp(pwd,zh2->password)==0)) { check=1; } if(fclose(fp)) { printf("不能关闭文件!\n"); exit(0); } return check; } void Readfile() { int n,i; openclass(); if((fp=fopen("user.dat","rb"))!=NULL) { printf("通讯录文件已存在。\n"); rewind(fp); fread(&p2,sizeof(struct zhanghao),1,fp); printf("请输入用户名:"); scanf("%s",zh.username); printf("请输入密码:"); scanf("%s",zh.password); while(checkUerValid(&zh)!=1) { printf("密码错误,请重新输入:\n"); printf("请输入用户名:"); scanf("%s",zh.username); printf("请输入密码:"); scanf("%s",zh.password); } fclose(fp); } if((fp=fopen("catalog.dat","rb"))==NULL) { printf("\n通讯录文件不存在!"); if ((fp=fopen("catalog.dat","wb"))==NULL) //不存在则进行创建 { printf("\n建立失败"); exit(0); } else { if ((fp=fopen("user.dat","wb"))==NULL) //不存在则进行创建 { printf("\n建立失败"); exit(0); } else { printf("\n输入注册号(不大于8位数):"); struct zhanghao zh[1],*zh1=zh; scanf("%s",zh1->username); while(strlen(zh1->username)>=8) { printf("\n注册号输入错误!请重新输入:"); scanf("%s",zh1->username); } printf("\n输入注册号密码(不大于8位数):"); scanf("%s",zh1->password); while(strlen(zh1->password)>=8) { printf("\n注册号输入错误!请重新输入:"); scanf("%s",zh1->password); } fwrite(zh1,sizeof(struct zhanghao),1,fp); } fclose(fp); printf("\n通讯录文件已建立\n"); printf("\n按任意键进入主菜单"); getch(); return; } exit(0); //退出 } fseek(fp,0,2); //文件位置指针移动到文件末尾 if (ftell(fp)>0) //文件不为空,获取的是文件长度 { //rewind(fp); //文件位置指针移动到文件开始位置 fseek(fp,0,0); //文件位置指针移动到文件开始位置 for ( n=0; !feof(fp) && fread(&ren[n],sizeof(struct Data),1,fp); n++); //for(i=0;i<=n;i++)printf("%s",dat[i].name); for(i=0; i<=n; i++) { p1=a[ren[i].fenlei].next; p=(struct Data1*)malloc(sizeof(struct Data1)); p->data=ren[i]; p->next=NULL; if(a[ren[i].fenlei].next==NULL) { a[ren[i].fenlei].next=p; a[ren[i].fenlei].length++; } else { while(p1->next!=NULL)p1=p1->next; p1->next=p; a[ren[i].fenlei].length++; } } //从文件流中读取数据,以Data结构体接收读取的数据,并由n记录下文件中联系人个数 printf("\n文件导入成功\n"); printf("\n按任意键进入主菜单:"); getch(); return; } fclose(fp); printf("\n文件导入成功\n"); printf("\n文件中没有数据\n"); printf("\n按任意键进入主菜单:"); getch();//按任意键退出 return; } int input1(struct LNode a[],int n) { char s[10]; char ch,m; while(ch!='n'&&ch!='N') { p1=a[n].next; printf("添加新联系人\n"); printf("姓名:"); p=(struct Data1*)malloc(sizeof(struct Data1)); p->next=NULL; scanf("%s",s); if(p1!=NULL) { while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL) p1=p1->next; if(strcmp(p1->data.name,s) == 0) { printf("通讯录中已有此人!\n"); printf("是否继续添加?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&m); } if(m!='n'&&m!='N') { input1(a,n); } return 0; } if(p1->next==NULL) { printf("电话:"); scanf("%s",p->data.tel); printf("电子邮件:"); scanf("%s",p->data.age); printf("QQ号:"); scanf("%s",p->data.qq); strcpy(p->data.name,s); printf("类别:%d",n); p->data.fenlei=n; p1->next=p; a[n].length++; } } else { printf("电话:"); scanf("%s",p->data.tel); printf("电子邮件:"); scanf("%s",p->data.age); printf("QQ号:"); scanf("%s",p->data.qq); strcpy(p->data.name,s); printf("类别:%d",n); p->data.fenlei=n; a[n].next=p; a[n].length++; } printf("\n是否继续添加?(Y/N)"); scanf("%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&ch); } } printf("\n添加成功!\n"); printf("\n按任意键返回主菜单:"); getch(); return 0; } void print11(struct LNode a[],int n) { int l=1; if(a[n].length>0) { printf("共%d条记录\n",a[n].length); p1=p=a[n].next; while(p!=NULL) { printf("\n%d\n类别:",l++); printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); p=p->next; } } else printf("\n名片数为0!\n"); printf("\n按任意键返回主菜单:"); getch(); return; } void allprint(struct LNode a[]) { int n,sum=0,l=0; for(n=1; n<7; n++) { sum=sum+a[n].length; } printf("\n一共%d记录",sum); for(n=1; n<7; n++) { if(a[n].length>0) { printf("\n类别%d共%d条记录\n",n,a[n].length); p1=p=a[n].next; while(p!=NULL) { printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); p=p->next; } } else printf("\n名片数为0!\n"); printf("\n按任意键返回主菜单:"); getch(); return; } } void print111(struct LNode a[]) { int m,n; printf("\n请选择显示方式:\n"); printf("1--分类显示 \n"); printf("2--全部显示\n"); printf("0--返回菜单\n"); printf("请选择(0-2):"); scanf("%d",&m); while(m!=1&&m!=2&&m!=0) { printf("\n输入错误,请重新选择:"); scanf("%d",&m); } if(m==1) { printf("\n请输入要查询的分类"); n=select(); print11(a,n); } if(m==2) { allprint(a); } if(m==0) { return; } } void namefind(struct LNode a[],int n) { char s[20]; int i=0; char m; printf("\n请输入想查询的姓名:"); scanf("%s",s); p1=p=a[n].next; if(p1==NULL) { printf("\n通讯录中没有此人!\n"); return; } while(p->next!=NULL) { while(strstr(p->data.name,s)==NULL&&p->next!=NULL)p=p->next; if(strstr(p->data.name,s)!=NULL) { i++; printf("\n类别:"); printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); } if((p->next==NULL)&&i==0) { printf("\n通讯录中没有此人!\n"); printf("\n是否继续查询?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%c",&m); } if(m!='n'&&m!='N') { namefind(a,n); } return; } if(p->next==NULL) { printf("\n查询完成!\n"); printf("\n是否继续查询?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&m); } if(m!='n'&&m!='N') { namefind(a,n); } return; } else p=p->next; } if(strstr(p->data.name,s)!=NULL) { i++; printf("\n类别:"); printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); } printf("\n查询完成!\n"); printf("\n是否继续查询?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&m); } if(m!='n'&&m!='N') { namefind(a,n); } return; } void onedelete1(struct LNode a[],int n) { char s[20],r; int i=0; printf("请输入想删除联系人的姓名:"); scanf("%s",s); p1=p=a[n].next; if(p1==NULL) { printf("\n通讯录中没有此人!\n"); return; } while(strcmp(p->data.name,s)!=0&&p->next!=NULL)p=p->next; if(strcmp(p->data.name,s) != 0) { printf("\n通讯录中没有此人!\n"); return; } if(strcmp(p->data.name,s) == 0) { printf("类别:"); printf("%d\n",p->data.fenlei); printf("姓名:"); printf("%s\n",p->data.name); printf("电话:"); printf("%s\n",p->data.tel); printf("电子邮件:"); printf("%s\n",p->data.age); printf("QQ:"); printf("%s\n",p->data.qq); } printf("确认删除?(Y/N):"); scanf("%s",&r); while(r!='n'&&r!='N'&&r!='y'&&r!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&r); } if(r=='y'||r=='Y') { if(p1==p)a[n].next=p->next; else { while(p1->next!=p)p1=p1->next; p1->next=p->next; } free(p); a[n].length--; printf("\n已经成功删除!\n"); return; } } //全部删除函数 void alldelete1(struct LNode a[],int n) { char r; p1=p=a[n].next; printf("\n确认删除?(Y/N):"); scanf("%s",&r); while(r!='n'&&r!='N'&&r!='y'&&r!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&r); } if(r=='y'||r=='Y') { if(p1==NULL) { printf("不存在名片!"); return; } while(p1->next!=NULL) { p=p1->next; p1->next=p->next; free(p); } a[n].next=NULL; a[n].length=0; printf("\n已经成功删除全类名片!\n"); return; } if(r=='n'||r=='N') { return; } } //选择删除联系人函数 void delete11(struct LNode a[],int n) { int m; printf("\n请选择删除方式:\n"); printf("1--单个删除 \n"); printf("2--全部删除\n"); printf("0--返回菜单\n"); printf("请选择(0-2):"); scanf("%d",&m); while(m!=1&&m!=2&&m!=0) { printf("\n输入错误,请重新选择:"); scanf("%d",&m); } if(m==1) { onedelete1(a,n); } if(m==2) { alldelete1(a,n); } if(m==0) { return; } } void Save() { FILE *fp; int i; if ((fp=fopen("catalog.dat","wb"))==NULL) { printf("\n文件打开失败"); } for (i=1; i<=6; i++) { p=a[i].next; while(p!=NULL) { if (fwrite(&(p->data),sizeof(struct Data),1,fp)==0) { printf("\n文件保存错误!\n"); } p=p->next; } } fclose(fp); printf("\n按任意键返回主菜单:"); getch();//按任意键退出 return; } void namechange(struct LNode a[],int n) { char s[20]; char m,ch; int i=0,k; p1=a[n].next; printf("\n请输入想修改的联系人的姓名:"); scanf("%s",s); if(p1==NULL) { printf("\n通讯录中没有此人!\n"); printf("\n是否继续修改?(Y/N)"); scanf("%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&ch); } if(ch!='n'&&ch!='N') { namechange(a,n); } return; } else { while((strcmp(p1->data.name,s)!=0)&&p1->next!=NULL) p1=p1->next; if(p1->next ==NULL&&strcmp(p1->data.name,s) != 0) { printf("\n通讯录中没有此人!\n"); printf("\n是否继续修改?(Y/N)"); scanf("%s",&ch); while(ch!='n'&&ch!='N'&&ch!='y'&&ch!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&ch); } if(ch!='n'&&ch!='N') { namechange(a,n); } return; } } if(strcmp(p1->data.name,s) == 0) { printf("类别:"); printf("%d\n",p1->data.fenlei); printf("姓名:"); printf("%s\n",p1->data.name); printf("电话:"); printf("%s\n",p1->data.tel); printf("电子邮件:"); printf("%s\n",p1->data.age); printf("QQ:"); printf("%s\n",p1->data.qq); printf("\n1.修改姓名\n"); printf("2.修改电话\n"); printf("3.修改电子邮件\n"); printf("4.修改地址\n"); printf("5.修改QQ号\n"); printf("0.返回菜单\n"); printf("请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { printf("\n输入错误,请重新选择:"); scanf("%d",&k); } switch(k) { case 1: printf("\n请输入新的姓名:"); scanf("%s",p1->data.name); break; case 2: printf("\n请输入新的电话:"); scanf("%s",p1->data.tel); break; case 3: printf("\n请输入新的电子邮件:"); scanf("%s",p1->data.age); break; case 5: printf("\n请输入新的QQ号:"); scanf("%s",p1->data.qq); break; case 0: return; } printf("\n修改成功!\n"); printf("\n是否继续修改?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%c",&m); } for(; m=='y'||m=='Y';) { printf("请您选择(0-5):"); scanf("%d",&k); while(k!=1&&k!=2&&k!=3&&k!=4&&k!=5&&k!=0) { printf("\n输入错误,请重新选择:"); scanf("%d",&k); } switch(k) { case 1: printf("\n请输入新的姓名:"); scanf("%s",p1->data.name); break; case 2: printf("\n请输入新的电话:"); scanf("%s",p1->data.tel); break; case 3: printf("\n请输入新的电子邮件:"); scanf("%s",p1->data.age); break; case 5: printf("\n请输入新的QQ号:"); scanf("%s",p1->data.qq); break; case 0: return; } printf("\n修改成功!\n"); printf("\n是否继续修改?(Y/N)"); scanf("%s",&m); while(m!='n'&&m!='N'&&m!='y'&&m!='Y') { printf("\n输入错误!请重新输入:"); scanf("%s",&m); } } if(m=='n'||m=='N'); return; } } int main() { int ads,asd; Readfile(); while(1) { switch(ads=menu()) { case 1: system("cls"); print111(a); break; case 2: system("cls"); Save(); break; case 3: system("cls"); asd=select(); delete11(a,asd); break; case 4: system("cls"); asd=select(); namechange(a,asd); break; case 5: system("cls"); asd=select(); input1(a,asd); break; case 6: system("cls"); asd=select(); namefind(a,asd); break; case 0: system("cls"); exit(0); default: ads=menu(); } } }
DLL文件包含自己生成的lib文件,编译错误
1. 我先用空项目 添加了lua的文件 生成了 lua.lib文件 2. 我创建了一个MFC_DLL文件 1)在项目->属性->C/C++->附加包含目录里包含了 lua所有.h .c的文件夹 2)在项目->属性->连接器->常规->附加库目录里包含了lua.lib的文件夹 3)在项目->属性->连接器->输入->附加依赖项里输入了lua.lib 我创建的 .h文件的代码 #infndef LUASSSS_H #define LUASSSS_H #include <windows.h> extern "C" { #include "lua.h" #include "lualib.h" #include "lauxlib.h" } extern lua_State *L; #endif 我创建的 .cpp文件的代码 #include "StdAfx.h" #include "Luassss.h" lua_State *L = luaL_newstate(); 代码显示无错误 但是编译的时候出现各种错误 请问是我哪里出错了????? 谢谢帮忙 我自己摸索了2天都没搞定 头都大了 error LNK2005: _strstr 已经在 libcmtd.lib(strstr.obj) 中定义 error LNK2005: _strchr 已经在 libcmtd.lib(strchr.obj) 中定义 error LNK2005: _fclose 已经在 libcmtd.lib(fclose.obj) 中定义 error LNK2005: _ferror 已经在 libcmtd.lib(feoferr.obj) 中定义 error LNK2005: _ungetc 已经在 libcmtd.lib(ungetc.obj) 中定义 error LNK2005: ___iob_func 已经在 libcmtd.lib(_file.obj) 中定义 error LNK2005: _fread 已经在 libcmtd.lib(fread.obj) 中定义 error LNK2005: _feof 已经在 libcmtd.lib(feoferr.obj) 中定义 error LNK2005: __errno 已经在 libcmtd.lib(dosmap.obj) 中定义 error LNK2005: _realloc 已经在 libcmtd.lib(dbgrealloc.obj) 中定义 error LNK2005: _free 已经在 libcmtd.lib(dbgfree.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _exit 已经在 libcmtd.lib(crt0dat.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _isspace 已经在 libcmtd.lib(_ctype.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _strtoul 已经在 libcmtd.lib(strtol.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _strtod 已经在 libcmtd.lib(strtod.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _sprintf 已经在 libcmtd.lib(sprintf.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _strcspn 已经在 libcmtd.lib(strcspn.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _strcoll 已经在 libcmtd.lib(strcoll.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _floor 已经在 libcmtd.lib(_floor_pentium4_.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _iscntrl 已经在 libcmtd.lib(_ctype.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _isalnum 已经在 libcmtd.lib(_ctype.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _isalpha 已经在 libcmtd.lib(_ctype.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _isdigit 已经在 libcmtd.lib(_ctype.obj) 中定义 1>MSVCRTD.lib(MSVCR100D.dll) : error LNK2005: _localeconv 已经在 libcmtd.lib(lconv.obj) 中定义 1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: __thiscall type_info::type_info(class type_info const &)" (??0type_info@@AAE@ABV0@@Z) 已经在 libcmtd.lib(typinfo.obj) 中定义 1>MSVCRTD.lib(ti_inst.obj) : error LNK2005: "private: class type_info & __thiscall type_info::operator=(class type_info const &)" (??4type_info@@AAEAAV0@ABV0@@Z) 已经在 libcmtd.lib(typinfo.obj) 中定义 1> 正在创建库 ..\test\testdll.lib 和对象 ..\test\testdll.exp 1>LINK : warning LNK4098: 默认库“MSVCRTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library 1>..\test\testdll.dll : fatal error LNK1169: 找到一个或多个多重定义的符号 1> 1>生成失败。 1> 1>已用时间 00:00:01.05 ========== 生成: 成功 0 个,失败 1 个,最新 0 个,跳过 0 个 ==========
结构体指针成员变量在赋值后被篡改了是怎么回事?
结构体指针地址没变,值被篡改了什么情况,有没有大神知道啊 // ConsoleApplication1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "iostream" #include "string.h" using namespace std; struct STU_LIST { char name[40]; int num; char sex[4]; int clas; struct STU_LIST *nex; }; /******************************************************************************************************************/ /*------------------------------------ -----数字提取------------ ---------------------------------------------*/ /******************************************************************************************************************/ int strEint(const char *str) { int len = strlen(str),i,num; char *tepnum,*tep; tepnum = new char[40]; tep=tepnum; i=len-1; *(tepnum+len) = '\0'; while (i>=0) { if (*(str+i)>='0'&&*(str+i)<='9') { *(tepnum+i)=*(str+i); } else { tepnum=tepnum+i+1; i=0; } i--; } num = atoi(tepnum); delete[] tep; return num; } struct STU_LIST *STU_insirt(struct STU_LIST *head,int n); struct STU_LIST *PRESENT_class; /******************************************************************************************************************/ /*------------------------------------ -----主程序------------ -------------------------------------------------*/ /******************************************************************************************************************/ int _tmain(int argc, _TCHAR* argv[]) { char *comad; int lep = -1; bool state = true,create_sign = false; comad = new char; cout<<"欢迎使用学生名单录入工具,请输入命令命令进行操作。\n输入help查询可用命令。"<<endl; PRESENT_class = new struct STU_LIST; PRESENT_class->clas = 10; PRESENT_class->num = 0; PRESENT_class->nex = NULL; while (state) { cin>>comad; int nums; struct STU_LIST *temp; nums = strEint(comad); if (nums <= 0) { cout<<"您的操作命令缺少有效参数或参数类型有误!!!"<<endl; cout<<"您可以输入help来查询可用操作命令,及使用格式和方法。"<<endl; } else { if(PRESENT_class != NULL) { temp = STU_insirt(PRESENT_class,nums); cout<<"temp->nex->"<<static_cast<const void *>(temp->nex)<<endl; cout<<"temp->nex->num->"<<static_cast<const void *>(&temp->nex->num)<<endl; cout<<temp->clas<<"班"<<temp->name<<"的信息记录已添加。"<<endl; if (temp->nex == NULL) { cout<<"本节点是尾结点"<<endl; } else { cout<<"头节点的学号是"<<temp->num<<endl; cout<<"第二个节点的学号是"<<temp->nex->num<<endl; } } else { cout<<"您要往哪个班级添加学生信息,请在添加信息前先选择一个班级的登记表。"<<endl; cout<<"您可以输入help来查询可用操作命令,及使用格式和方法。"<<endl; } } if (strstr(comad,"exit")!=NULL) { state = false; } } return 0; } /******************************************************************************************************************/ /*-----------------------------------------插入学生条目-----------------------------------------------------------*/ /******************************************************************************************************************/ struct STU_LIST *STU_insirt(struct STU_LIST *head,int n) { struct STU_LIST *temp,*stp1,*lastsp; temp = head; lastsp = NULL; bool sign = true; while (sign) { cout<<"当前节点学号是"<<temp->num<<endl; if(temp->num >= n) //假如要插入的学号不大于当前节点学号 { if(temp->num > n ) //假如要插入的学号小于当前节点学号,那么在当前节点前面创建新节点并录入学生数据 { stp1=(struct STU_LIST*) alloca(sizeof(struct STU_LIST)); stp1->num = n; stp1->clas = head->clas; cout<<"请输入学生姓名:"; cin >>stp1->name; cout<<"请输入学生性别:"; cin >>stp1->sex; stp1->nex = temp; if(temp == head ) //假如当前节点是头结点,那么设置新节点为表头 { head = stp1; sign = false; } else //假如当前节点不是头结点,将上一个节点的指针指向新节点,跳出循环结束命令 { lastsp->nex = stp1; sign = false; } } else //假如要插入的学号等于当前节点学号,那么更新该节点学生数据。 { cout<<"请输入学生姓名:"; cin >>temp->name; cout<<"请输入学生性别:"; cin >>temp->sex; sign = false; } } else //假如要插入的学号大于当前节点学号 { cout<<"要插入的节点大于当前节点"<<endl; if(temp->num == 0) //假如当前节点学号等于0,意味着当前节点没有录入过数据,那么将本节点作为插入的节点录入学生数据。 { temp->num = n; cout<<"请输入学生姓名:"; cin >>temp->name; cout<<"请输入学生性别:"; cin >>temp->sex; temp->nex = NULL; sign = false; } else //假如当前节点的学号不等于0。 { if(temp->nex == NULL) //假如当前节点是尾结点,那么在当前节点之后创建新节点 { stp1 = (struct STU_LIST*) alloca(sizeof(struct STU_LIST)); cout<<"stp1 -> "<<static_cast<const void *>(stp1)<<endl; stp1->num = n; cout<<"新节点的学号是"<<stp1->num<<endl; stp1->clas = head->clas; stp1->nex = NULL; cout<<"请输入学生姓名:"; cin >>stp1->name; cout<<"请输入学生性别:"; cin >>stp1->sex; temp->nex = stp1; cout<<"temp->nex->num="<<temp->nex->num<<endl; cout<<"temp->nex->num->"<<static_cast<const void *>(&temp->nex->num)<<endl; sign = false; } else //假如当前节点不是尾结点,那么将当前节点设置为下个节点 { lastsp = temp; temp = temp->nex; } } } } if(head->nex != NULL) { cout<<"head->nex->num="<<head->nex->num<<endl; cout<<"head->nex->num->"<<static_cast<const void *>(&head->nex->num)<<endl; } return head; } ![图片说明](https://img-ask.csdn.net/upload/201912/28/1577541877_870062.png) 在函数内部时候值不变,一出函数内存里的值就变了这是什么道理。
c语言函数调用不了,小白求解,主要是13.14
#include"stdio.h" #include"stdlib.h" #include"conio.h" #include"string.h" #define N 1000 struct student /*学生信息*/ { char num[20]; /*学号*/ char name[20]; /*姓名*/ char sex; /* 性别,'1'->男, '0'->女*/ short age; /*年龄*/ short score[3]; /*三门课程的成绩*/ short sum; /*总成绩*/ short deptid; /*所在班的班号*/ struct student *next1; struct student *next2; }*head; struct student std[N]; struct department /*班信息,假设总共有3个班*/ { short id; /*班号*/ char name[20]; /*系名*/ char dean[20]; /*班主任*/ char location[30]; /*班级地址*/ }depa[3]={{1,"计算机系","张三","电教楼505"},{2,"法政系","李四","电教楼404"},{3,"外语系","王五","实验楼401"}}; void menu() { printf("\n=========学生信息管理系统========\n"); printf("1. 录入学生信息\n"); printf("2. 显示所有学生信息\n"); printf("3. 按学号查询学生信息\n"); printf("4. 按姓名查询学生信息(支持模糊查询)\n"); printf("5. 按年龄查询学生信息\n"); printf("6. 查询指定学生的所在班的信息(包括系名、班主任、班的地址)\n"); printf("7. 修改学生信息\n"); printf("8. 删除学生信息\n"); printf("9. 追加学生信息\n"); printf("10. 保存学生信息到文件\n"); printf("11. 从文件载入学生信息\n"); printf("12. 按成绩从高到低显示所有学生信息[选作题目]\n"); printf("13. 计算每门课的最高成绩和最低成绩\n"); printf("14. 按性别就每门课男女的平均成绩\n"); printf ("0. 退出系统\n"); } //录入学生信息 void create() { int i,j; char tmp[30]; struct student *p; head=NULL; for(i=1;;i++) { if(i!=1) { printf("是否继续录入(y/n):"); gets(tmp); if(strcmp(tmp,"n")==0) break; } p=(struct student *)malloc(sizeof(struct student)); printf("\n====请输入第%d个学生信息====\n",i); printf("学号:"); gets(p->num); printf("姓名:"); gets(p->name); printf("性别,('1'->男, '0'->女):"); p->sex=getchar(); getchar(); printf("年龄:"); gets(tmp); p->age=atoi(tmp); printf("三门课程的成绩:\n"); p->sum=0; for(j=0;j<3;j++) { printf("第%d个成绩:",j+1); gets(tmp); p->score[j]=atoi(tmp); p->sum+=p->score[j]; } printf("总成绩:%d\n",p->sum); printf("所在班的班号[1->计算机系;2->法政系;3->外语系]:"); gets(tmp); p->deptid=atoi(tmp); p->next1=head; head=p; } printf("信息录入完毕,按任意键继续……"); getch(); } //显示所有学生信息 void displayAll() { struct student *p; printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\t所在班的班号\n"); p=head; while(p!=NULL) { printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"男":"女",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid); p=p->next1; } printf("信息显示完毕,按任意键继续……"); getch(); } //按学号查询学生信息 void searchOnNum() { int flag; char tmp[30]; struct student *p; p=head; printf("请输入学号:"); gets(tmp); flag=0; printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\t所在班的班号\n"); while(p!=NULL) { if(strcmp(tmp,p->num)==0) { flag=1; printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"男":"女",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid); }p=p->next1; } if(flag==0) printf("\n未找到学号是%s的学生,按任意键继续……",tmp); else printf("\n显示完毕,按任意键继续……"); getch(); } //按姓名查询学生信息 void searchOnName() { int flag; char tmp[30]; struct student *p; p=head; printf("请输入姓名:"); gets(tmp); flag=0; printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\t所在班的系班号\n"); while(p!=NULL) { if(strstr(p->name,tmp)) { flag=1; printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"男":"女",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid); }p=p->next1; } if(flag==0) printf("\n未找到%s,按任意键继续……",tmp); else printf("\n显示完毕,按任意键继续……"); getch(); } //按年龄查询学生信息 void searchOnAge() { int flag; char tmp[30]; struct student *p; p=head; printf("请输入年龄:"); gets(tmp); flag=0; printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\t所在班的班号\n"); while(p!=NULL) { if(atoi(tmp)==p->age) { flag=1; printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"男":"女",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid); }p=p->next1; } if(flag==0) printf("\n未找到年龄是%s的学生,按任意键继续……",tmp); else printf("\n显示完毕,按任意键继续……"); getch(); } //查询指定学生的所在班的信息 void searchDepa() { int i,flag; char tmp[30]; struct student *p; p=head; printf("请输入姓名:"); gets(tmp); flag=0; while(p!=NULL) { if(strcmp(tmp,p->name)==0) { for(i=0;i<3;i++) { if(p->deptid==depa[i].id) { flag=1; printf("班名\t\t班主任\t\t班的地址\n"); printf("%s\t\t%s\t\t%s\n",depa[i].name,depa[i].dean,depa[i].location); } } }p=p->next1; } if(flag==0) printf("\n未找到%s,或许%s班号输入时有误,按任意键继续……",tmp); else printf("\n显示完毕,按任意键继续……"); getch(); } //修改学生信息 void update() { int flag,j; char tmp[30]; char a; struct student *p; p=head; printf("请输入姓名:"); gets(tmp); flag=0; while(p!=NULL) { if(strcmp(tmp,p->name)==0) { flag=1; printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\t所在班的班号\n"); printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"男":"女",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid); printf("\n====请输入新信息====\n"); printf("学号:"); gets(tmp); if(strcmp(tmp,"")!=0) strcpy(p->num,tmp); printf("姓名:"); gets(tmp); if(strcmp(tmp,"")!=0) strcpy(p->name,tmp); printf("性别,'1'->男, '0'->女:"); a=getchar(); if(a!='\n') p->sex=a; printf("年龄:"); gets(tmp); if(strcmp(tmp,"")!=0) p->age=atoi(tmp); printf("三门课程的成绩:\n"); p->sum=0; for(j=0;j<3;j++) { printf("第%d个成绩:",j+1); gets(tmp); if(strcmp(tmp,"")!=0) p->score[j]=atoi(tmp); p->sum+=p->score[j]; } printf("总成绩:%d\n",p->sum); printf("所在班的班号[1->计算机系;2->法政系;3->外语系]:"); gets(tmp); if(strcmp(tmp,"")!=0) p->deptid=atoi(tmp); }p=p->next1; } if(flag==0) printf("\n未找到%s!按任意键继续……",tmp); else printf("\n修改完毕,按任意键继续……"); getch(); } //删除学生信息 void delate() { int flag; char tmp[30]; struct student *p,*q; printf("请输入姓名:"); gets(tmp); p=head; flag=0; while(p!=NULL) { if(strcmp(tmp,p->name)==0) { flag=1; if(p==head) head=p->next1; else q->next1=p->next1; free(p);break; } q=p; p=p->next1; } if(flag==0) printf("\n未找到%s,按任意键继续……",tmp); else printf("删除完毕,按任意键继续……"); getch(); } //追加学生信息 void add() { int i,j; char tmp[30]; struct student *p; for(i=1;;i++) { if(i!=1) { printf("是否继续追加(y/n):"); gets(tmp); if(strcmp(tmp,"n")==0) break; } p=(struct student *)malloc(sizeof(struct student)); printf("\n====请输入第%d个追加信息====\n",i); printf("学号:"); gets(p->num); printf("姓名:"); gets(p->name); printf("性别,'1'->男, '0'->女:"); p->sex=getchar(); getchar(); printf("年龄:"); gets(tmp); p->age=atoi(tmp); p->sum=0; for(j=0;j<3;j++) { printf("第%d个成绩:",j+1); gets(tmp); if(strcmp(tmp,"")!=0) p->score[j]=atoi(tmp); p->sum+=p->score[j]; } printf("总成绩:%d\n",p->sum); printf("所在班的班号[1->计算机系;2->法政系;3->外语系]:"); gets(tmp); p->deptid=atoi(tmp); p->next1=head; head=p; } printf("追加成功,按任意键继续……"); getch(); } //保存学生信息到文件 void save() { FILE *fp; char filename[20]={"d://qq.dat"}; printf("请输入文件名如%s:",filename); gets(filename); while(strcmp(filename,"")==0) { printf("文件名不能为空,请重新输入:"); gets(filename); } if((fp=fopen(filename,"wb"))==NULL) { printf("write file open error!\n按任意键继续……");getch(); return; } struct student *p; p=head; printf("正在保存信息,请耐心等待……\n"); while(p!=NULL) { fwrite(p,sizeof(struct student),1,fp); p=p->next1; } fclose(fp); printf("信息保存成功,按任意键继续……");getch(); } //从文件载入学生信息 void load() { char filename[20]; FILE *fp; printf("请输入文件名:"); gets(filename); while(strcmp(filename,"")==0) { printf("文件名不能为空,请重新输入:"); gets(filename); } if((fp=fopen(filename,"rb"))==NULL) { printf("read file open error!\n按任意键继续……");getch(); return; } struct student *p,*q; p=(struct student *)malloc(sizeof(struct student)); head=p; printf("正在从磁盘载入信息,请耐心等待……\n"); while(!feof(fp)) { if(1!=fread(p,sizeof(struct student),1,fp)) break; p->next1=(struct student *)malloc(sizeof(struct student)); q=p; p=p->next1; } q->next1=NULL; fclose(fp); printf("载入成功,按任意键继续……");getch(); } //按成绩从高到低显示所有学生信息[选作题目] void displayInOrder() { struct student *head1,*p,*q,*r; p=(struct student *)malloc(sizeof(struct student)); p=head; while(p!=NULL) { if(p==head) { head1=p; p->next2=NULL; } else { q=head1; while(1) { if(p->sum>q->sum) { if(q==head1) { p->next2=head1; head1=p;break; } else { r->next2=p; p->next2=q;break; } } else if(q->next2==NULL) { q->next2=p; p->next2=NULL;break; } r=q; q=q->next2; } } p=p->next1; } printf("学号\t姓名\t性别\t年龄\t三门课程的成绩\t\t总成绩\t所在班的班号\n"); p=head1; while(p!=NULL) { printf("%s\t%s\t%s\t%d\t%d\t%d\t%d\t%d\t%d\n",p->num,p->name,p->sex=='1'?"男":"女",p->age,*(p->score),*(p->score+1),*(p->score+2),p->sum,p->deptid); p=p->next2; } printf("信息显示完毕,按任意键继续……");getch(); } //计算每门课的最高成绩和最低成绩 void result() { int i,max1=0,min1=std[1].score[1],max2=0,min2=std[1].score[2],max3=0,min3=std[1].score[3]; for(i=1;i<=1000;i++) { if(max1<std[i].score[1]) max1=std[i].score[1]; if(min1>std[i].score[1]) min1=std[i].score[1]; if(max2<std[i].score[2]) max2=std[i].score[2]; if(min2>std[i].score[2]) min2=std[i].score[2]; if(max3<std[i].score[3]) max3=std[i].score[3]; if(min3>std[i].score[3]) min3=std[i].score[3]; } printf("第一门成绩最高分为%d\n,最低分为%d,第二门成绩最高分为%d\n,最低分为%d,第三门成绩最高分为%d,最低分为%d\n",max1,min1,max2,min2,max3,min3); } //按性别求每门课男女的平均成绩 void ave() { printf("请输入学生性别:'1'->男, '0'->女"); int i,j,k=1,l=1,sumA=0,sumB=0,sumC=0,sumD=0,sumE=0,sumF=0,ave1,ave2,ave3,ave4,ave5,ave6; scanf("%d",&i); if(i==0||i==1) {if(i=0) {for(j=1;j<1000;j++) {if(std[j].sex=1) {sumA=sumA+std[j].score[1]; sumB=sumB+std[j].score[2]; sumC=sumC+std[j].score[3]; k++; }} ave1=sumA/k; ave2=sumB/k; ave3=sumC/k; } printf("男生第一门平均成绩为%d\n,男生第二门平均成绩为%d\n,男生第三门平均成绩为%d\n",ave1,ave2,ave3);} {if(i=1) {for(j=1;j<1000;j++) {if(std[j].sex=1) {sumD=sumD+std[j].score[1]; sumE=sumE+std[j].score[2]; sumF=sumF+std[j].score[3]; l++; }} ave4=sumD/k; ave5=sumE/k; ave6=sumF/k; } printf("女生第一门平均成绩为%d\n,女生第二门平均成绩为%d\n,女生第三门平均成绩为%d\n",ave4,ave5,ave6); } if(i!=0||i!=1) printf("输入错误请矫正,按任意键继续"); } //退出系统,判断是否真的退出 void exitSystem() { char x; printf("你真的要退出系统吗?(Y/N)"); while(1) { x=getche(); if(x=='y' || x=='Y' || x=='n' || x=='N' ) break; printf("\b"); } if(x=='y' || x=='Y') { printf("\n"); exit(0); } return; } void main() { int c; char choice[3]; while(1) { system("cls"); menu(); do { printf("请输入功能键:"); gets(choice); c=atoi(choice); }while(c>12||c<0); switch(c) { case 1: create();break; case 2: displayAll();break; case 3: searchOnNum();break; case 4: searchOnName();break; case 5: searchOnAge();break; case 6: searchDepa();break; case 7: update();break; case 8: delate();break; case 9: add();break; case 10: save();break; case 11: load();break; case 12: displayInOrder();break; case 13: result();break; case 14: ave();break; case 0: exitSystem(); } } }
初学C语言,折腾了好久,请大大们指导下。结贴
刚申请账号,原来都是看各位老师回答,是不是刚申请的没有积分或者C币奖赏 希望老师们能指点一二 谢谢 程序用途 HDDのSMART情報が格納されたバイナリファイル(HDD_SMART_INFO.dat)をキャラクタに変換後、csvファイルとして出力する CSVをもとにデータを解析し、故障しそうなHDDを事前に見つける際に使用するツール。 程序功能 cmd命令 下输入 不指定功能情况下 .*dat test.csv 当前路径全dat文件 读取 test.csv输出 test.dat test.csv 单一dat文件指定 读取 test.csv输出 功能指定情况下 -OR .*dat test.csv 当前路径全dat文件 读取 按功能指定 test.csv输出 -OR test.dat test.csv 单一dat文件指定 读取 按功能指定test.csv输出 根据当前路径 检索路径下所有.dat文件 包括路径下文件夹内存在.dat文件的情况下检索到底 到没有文件夹位为止获取所有dat文件 .dat文件用专门软件打开后内容大体为 01 0B 00 64 64 10 00 00 00 00 00 00 02 05 00 88 88 36 5E 00 00 00 00 00 . . . 以第一行为例 01 为 AttributeID uchar 1字节 0B 00 为AttributeFlag ushort 2字节 64 为CurrentValue uchar 1字节 64 为WorstValue uchar 1字节 10 为ThresholdValue uchar 1字节 00 00 00 00 00 00 为RawValue uchar[6] 6字节 三种功能设定 -OR Raw数据输出 -OV Value数据输出 -RC Raw数据反序输出 再次谢谢 ``` ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // SMART変換ツール : // HDDのSMART情報が格納されたバイナリファイル(HDD_SMART_INFO.dat)を // キャラクタに変換後、csvファイルとして出力する // CSVをもとにデータを解析し、故障しそうなHDDを事前に見つける際に使用するツール // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// #include <stdafx.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<Windows.h> #include<malloc.h> ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //オプション // デフォルトでは //   -OR:Rawデータだけ出力 // -OV:Valueだけ出力 //    -RC:Rawデータを以下のように並び替えて出力 // 0123456789AB ⇒ AB8967452301 /***オプションの設定***/ #define S_OR "-OR" #define S_OV "-OV" #define S_RC "-RC" #define OUTPUT_ORDATA 1 #define OUTPUT_OVDATA 2 #define OUTPUT_RCDATA 3 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// /***SMARTデータ最大数***/ #define SMART_DATA_MAX 64 #define NORMAL_END 0 #define ABNORMAL_END 1 /***構造体の定義***/ struct SMART_INFO { unsigned char AttributeID; unsigned short AttributeFlag; unsigned char CurrentValue; unsigned char WorstValue; unsigned char ThresholdValue; unsigned char RawValue[6]; }; struct SMART_ALL_DATA { SMART_INFO stSmartInfo[SMART_DATA_MAX]; char FileNames[_MAX_PATH]; }; /***関数宣言***/ int GetParamData( int argc,_TCHAR* argv[],char *cpOutFileName, char *cpFileName,char *cpSearchPath ,int *iOption ); int FileSearch( int *iCount , char*cpSearchPath, SMART_ALL_DATA *stSmartAllInfo); int File_r( char *cpSearchPath, SMART_ALL_DATA *stSmartAllInfo, int iFileNo ); int FileOut( char *cpOutFileName, SMART_ALL_DATA *stSmartInfo,int iCount, int iOption ); //////////////////////////////////////////////////////////////////////////////////////////////////////// // 関数名:main // 機能 :メイン処理 // 引数 :argc : 引数の個数 // argv[] : 引数の値(.datファイル名と.csvファイル名を取得用) // // //////////////////////////////////////////////////////////////////////////////////////////////////////// int _tmain( int argc,_TCHAR* argv[] ) { //.datファイル複数の場合、検索パス用 char Search_Path[_MAX_PATH]={0}; //.datファイルをオープンの場合、フルパス+.datファイル名用 char Filename[_MAX_PATH]={0}; //出力csvファイル名を格納用 char cOutFileName[_MAX_PATH]={0}; //オプション格納用 int iOption=0; //.datファイル個数を記録用 int iCount=0; //構造体を宣言 SMART_ALL_DATA *stSmartAllData = NULL; //関数の真偽判断 int iResult = FALSE; //引数の判断   if(argc<3) { printf( "Input Error.\n" ); printf( "Please input some words such as \"-Option FileName.dat FileName.csv\".\n" ); return ABNORMAL_END; } //引数解析 iResult = GetParamData( argc, argv, cOutFileName, Filename,Search_Path, &iOption ); if( iResult!= 0 ) { //単一ファイル指定用 char *cpFileDat = ".dat"; //複数ファイル指定用 char *cp_AllDat = "*.dat"; //if( 引数のパスに'*'があるか? ) if ( strstr( Filename,cp_AllDat ) != NULL) { // '*'がある場合 // ファイル検索(個数を取得処理) FileSearch( &iCount,Search_Path ,NULL ); if (iCount == 0 ) { printf("Can not search any DatFiles.\n"); return ABNORMAL_END; } // 構造体を定義 stSmartAllData = ( SMART_ALL_DATA* )malloc( iCount * sizeof(SMART_ALL_DATA) ); //メモリ確保 if( stSmartAllData == NULL ) { printf( "Memory allocation failed.\n" ); return ABNORMAL_END; } //初期化 memset( stSmartAllData, '\0' , ( iCount * sizeof(SMART_ALL_DATA ) ) ); // ファイル検索処理(リード処理を行う) iCount = 0; iResult = FileSearch( &iCount, Search_Path ,stSmartAllData ); } else { if ( strstr( Filename,cpFileDat ) != NULL) { // '*'がない場合 // ファイル個数は1個 iCount = 1; // 構造体を定義 stSmartAllData = ( SMART_ALL_DATA* )malloc( iCount * sizeof( SMART_ALL_DATA ) ); //メモリ確保 if( stSmartAllData == NULL ) { printf( "Memory application failed.\n" ); return ABNORMAL_END; } //初期化 memset( stSmartAllData, '\0' , ( iCount * sizeof(SMART_ALL_DATA ) ) ); iCount = 0; //リード処理を実行 iResult = File_r( Filename, stSmartAllData, iCount++ ); //ファイルオープン失敗の場合 ファイル名を出力 if( iResult == FALSE ) { printf( "Can not to open %s.\n" ,Filename); printf( "Please make sure the FileName and FullPath.\n"); } } //DATファイルではない場合 else { printf("Input Error.\n"); printf( "Please input some words such as \"-Option FileName.dat FileName.csv\".\n" ); return ABNORMAL_END; } } if( iResult== TRUE ) { //csvファイルを出力 FileOut( cOutFileName, stSmartAllData, iCount, iOption ); } //mallocを解放する。 free(stSmartAllData); } return NORMAL_END; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // 関数名 : GetParamData // 機能 : 引数の解析処理 // 引数 : argc : 引数の個数 // argv[] : 引数の値(.datファイル名と.csvファイル名を取得用) //  cpOutFileName : csvファイル名  // cpFileName : .datファイルをオープンの場合、フルパス+.datファイル名用 // cpSearchPath : .datファイル複数の場合、検索パス用 //  iOption : オプション格納用 //////////////////////////////////////////////////////////////////////////////////////////////////////// int GetParamData( int argc,_TCHAR* argv[], char *cpOutFileName,char *cpFileName, char*cpSearchPath ,int *iOption ) { //戻り値設定 int iResult = FALSE; //argv[Dat_Name]格納 && argv[Csv_Name]格納 int Dat_Name,Csv_Name; Dat_Name=(argc==3?1:2); Csv_Name=(argc==3?2:3); //取得の引数によって、オプションの判断 if(strcmp( argv[1], S_OR ) == 0) { //"-OR"を取得する場合 *iOption = OUTPUT_ORDATA; } else if(strcmp( argv[1], S_OV ) == 0) { //"-OV"を取得する場合 *iOption = OUTPUT_OVDATA; } else if(strcmp( argv[1], S_RC ) == 0) { //"-RC"を取得する場合 *iOption = OUTPUT_RCDATA; } //パス分解する用 char szPath[_MAX_PATH]; char szDrive[_MAX_DRIVE]; char szDir[_MAX_DIR]; char szFileName[_MAX_FNAME]; char szExt[_MAX_EXT]; DWORD dwRet; //初期化 memset( szPath, NULL, sizeof( szPath ) ); memset( szDrive, NULL, sizeof(szDrive ) ); memset( szDir, NULL, sizeof( szDir ) ); memset( szExt, NULL, sizeof( szExt ) ); dwRet = 0; //実行中のプロセスフルパスを取得する。 dwRet = GetModuleFileName(NULL, szPath, sizeof( szPath ) ); //エラー処理 if( dwRet == 0 ) { int Errorcode; Errorcode=GetLastError(); printf("Error code %d :Get CurrentDirecory Error.\n",Errorcode); return iResult; } //フルパス名を分割する _splitpath_s( szPath, szDrive, szDir, szFileName, szExt ); //.csvファイいるを取得し、cpOutFileNameに格納 memset( cpOutFileName, NULL, _MAX_PATH ); strcpy_s( cpOutFileName, _MAX_PATH, argv[Csv_Name] ); //検索パスを取得処理  strcat_s( cpSearchPath, _MAX_PATH, szDrive ); strcat_s( cpSearchPath, _MAX_PATH, szDir ); //.datファイルをオープンの場合、フルパス+.datファイル名用を取得処理 strcat_s( cpFileName, _MAX_PATH, szDrive ); strcat_s( cpFileName, _MAX_PATH, szDir ); strcat_s( cpFileName, _MAX_PATH, argv[Dat_Name] ); return TRUE; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // 関数名 : FileSearch // 機能 : .datファイル複数の場合、検索処理 // 引数 : iCount : ファイル個数記録用 // cpSearchPath : 検索パス // //  stSmartAllInfo : リードするデータを保存用  // // //////////////////////////////////////////////////////////////////////////////////////////////////////// int FileSearch( int *iCount,char *cpSearchPath,SMART_ALL_DATA *stSmartAllInfo ) { // 戻り値格納用 int iResult = FALSE; //検索パス用 char cppSearchPath[_MAX_PATH]={0}; //検索パスをコピー strcpy_s( cppSearchPath,cpSearchPath ); //API関数を呼び出し、検索処理する WIN32_FIND_DATA FindFileData; HANDLE hFind; strcat_s( cppSearchPath,_MAX_PATH,"\\*" ); hFind=FindFirstFile( cppSearchPath,&FindFileData ); if( INVALID_HANDLE_VALUE == hFind ) { return FALSE; } while( TRUE ) { if( FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) { if( FindFileData.cFileName[0] != '.' ) { //フォルダは存在する場合 char szFile[_MAX_PATH] = {0}; strcpy_s( szFile,cpSearchPath ); strcat_s( szFile,"\\" ); strcat_s( szFile,FindFileData.cFileName ); //再帰する iResult = FileSearch( iCount,szFile,stSmartAllInfo ); } } else { //取得のファイ名 '.'以降の文字列を取得 cpstrdatに格納 char *cpstrdat=strrchr( FindFileData.cFileName,'.' ); //検索のファイル型の判断 .datファイルの場合 リード処理 if(strcmp( ".dat",cpstrdat) == 0 ) { if( stSmartAllInfo != NULL ) { char cppFiledatpath[_MAX_PATH] = {0}; strcpy_s( cppFiledatpath,cpSearchPath ); strcat_s( cppFiledatpath,"\\" ); strcat_s( cppFiledatpath,FindFileData.cFileName ); int iReadlost = FALSE; //リード処理を実行 iReadlost = File_r( cppFiledatpath, stSmartAllInfo, *iCount ); //***ファイルオープン失敗の場合 ファイル名を出力 if( iReadlost == FALSE ) { printf( "Can not to open %s.\n", FindFileData ); printf( "Please make sure the FileName and FullPath.\n"); } else { iResult = TRUE; } } //ファイル読み込み数を+1 *iCount = *iCount + 1; } } //ファイル内の場合、Break if( !FindNextFile( hFind, &FindFileData ) ) break; } return iResult; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // 関数名 : File_r // 機能 : オープンした.datファイルを読む込み処理 // 引数 : cpSearchPath : フルパス+.datファイル名用 // iFileNo : ファイル個数用 // //  stSmartAllInfo : リードするデータを保存用  // // //////////////////////////////////////////////////////////////////////////////////////////////////////// int File_r( char *cpSearchPath, SMART_ALL_DATA *stSmartAllInfo, int iFileNo ) { FILE *fp = NULL; //一ファイルリードループ用 int iDataCnt = 0; //ファイルオープン fopen_s( &fp,cpSearchPath,"rb" ); //エラー判断 if( fp == NULL ) { return FALSE; } //ファイル名を格納 strcpy_s( stSmartAllInfo[iFileNo].FileNames ,_MAX_PATH,cpSearchPath ); //ファイル終端までループ while( !feof(fp) ) { //AttributeID~RawValueまで、一行のデータを読み込む、ファイル終端までループ fread( &stSmartAllInfo[iFileNo].stSmartInfo[iDataCnt].AttributeID, 1, 1, fp ); fread( &stSmartAllInfo[iFileNo].stSmartInfo[iDataCnt].AttributeFlag, 1, 2, fp ); fread( &stSmartAllInfo[iFileNo].stSmartInfo[iDataCnt].CurrentValue, 1, 1, fp ); fread( &stSmartAllInfo[iFileNo].stSmartInfo[iDataCnt].WorstValue, 1, 1, fp ); fread( &stSmartAllInfo[iFileNo].stSmartInfo[iDataCnt].ThresholdValue, 1, 1, fp ); fread( &stSmartAllInfo[iFileNo].stSmartInfo[iDataCnt].RawValue, 1, 6, fp ); //行数記録 iDataCnt++; } fclose( fp ); return TRUE; } //////////////////////////////////////////////////////////////////////////////////////////////////////// // 関数名 : FileOut // 機能 : データを出力処理 // 引数 : cpOutFileName : 出力ファイル名用 // iCount : ファイル個数用 // iOption : オプション判断用 //  stSmartAllInfo : データを書き込み用 // //////////////////////////////////////////////////////////////////////////////////////////////////////// int FileOut( char *cpOutFileName, SMART_ALL_DATA *stSmartAllInfo, int iCount, int iOption ) { FILE *fp = NULL; //ファイル個数用 int iFileCnt = 0; //行数ループ用 int iDataCnt = 0; //ファイルオープン fopen_s( &fp, cpOutFileName, "wb" ); //オープンエラー判断 if( fp == NULL ) { printf( " Can not to open %s.\n " ,cpOutFileName); return FALSE; } //ライトループ for( iFileCnt = 0; iFileCnt < iCount; iFileCnt++ ) { fprintf( fp,"%s,",stSmartAllInfo[iFileCnt].FileNames ); for( iDataCnt = 0; iDataCnt < SMART_DATA_MAX; iDataCnt++ ) { //AttributeID "0"場合は出力しないこと if( stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].AttributeID !=0 ) { //オプション ORの場合:RAWデータだけ出力する if( iOption == OUTPUT_ORDATA ) { fprintf( fp,"%02x%02x%02x%02x%02x%02x," , stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[0], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[1], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[2], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[3], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[4], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[5] ); } //オプション OVの場合:valueデータだけ出力する else if( iOption == OUTPUT_OVDATA ) { fprintf(fp,"%02x,",stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].CurrentValue); fprintf(fp,"%02x,",stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].WorstValue); fprintf(fp,"%02x,",stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].ThresholdValue); fprintf(fp,"%02x%02x%02x%02x%02x%02x,", stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[0], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[1], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[2], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[3], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[4], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[5] ); } //オプション RCの場合:Rawデータを逆序列出力出力する  else if( iOption == OUTPUT_RCDATA ) { fprintf(fp,"%02x%02x%02x%02x%02x%02x,", stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[5], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[4], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[3], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[2], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[1], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[0] ); } // 全データ出力 else { fprintf(fp,"%02x,",stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].AttributeID ); fprintf(fp,"%04x,",stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].AttributeFlag ); fprintf(fp,"%02x,",stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].CurrentValue ); fprintf(fp,"%02x,",stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].WorstValue ); fprintf(fp,"%02x,",stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].ThresholdValue ); fprintf(fp,"%02x%02x%02x%02x%02x%02x,", stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[0], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[1], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[2], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[3], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[4], stSmartAllInfo[iFileCnt].stSmartInfo[iDataCnt].RawValue[5] ); } } } //1個ファイル出力後 改行する. fprintf(fp,"\r\n"); } //ファイルクローズ fclose( fp ); return TRUE; } ``` VS2008下编译通过。
STM32+EC20 实现MQTT数据上传,发送一次数据后连接失败,原因?
void sendMQTTPkt(char *p, int len) { //char sendBuf[30] = {0}; char sendBuf[300] = {0}; char *strx,untildata; sprintf(sendBuf,"AT+QISEND=0,%d\r\n",len); USART2_Write(USART2,sendBuf,strlen(sendBuf));//固定长度发数据 delay_ms(100); strx=strstr((char*)RxBuffer,(char*)">");//返回数据可发送 while(strx==NULL) strx=strstr((char*)RxBuffer,(char*)">"); USART2_Write(USART2,p,len); delay_ms(100); } void Clear_Buffer(void)//清空缓存 { int i; //printf(RxBuffer); USART1_Write(USART1,RxBuffer,Rxcouter); memset(RxBuffer,0,Rxcouter); // for(i=0;i<Rxcouter;i++) // RxBuffer[i]=0;//缓存 Rxcouter=0; // IWDG_Feed();//喂狗 } sendMQTTPkt(mqtt_msg,len); delay_ms(1000); //delay_ms(1000); // MqttSample_Recv(); //对数据进行解析 if(uart2_ok)//确认数据都接收完成了 { printf("step1 OK\r\n"); //MQTTOnent_Recdata(); Clear_Buffer(); //MQTTClear_Buffer(); printf("step2 OK\r\n"); uart2_ok=0; printf("step3 OK\r\n"); } printf("step4 OK\r\n"); 串口显示:len:31 step1 OK > SEND OK +QIURC: "closed",0 step2 OK step3 OK step4 OK 提示close ,原因是什么
STC15串口通信识别接收的消息需要发十次才有反应,求大佬帮忙看看.....?
只有开机之后第一个识别消息(OK)发送一次就反应,之后就需要10次。我把"OK"改成过"CONNECT OK",就只需发两次就有反应。下面是程序代码,求助。 ``` #define Uart2_Buf_Max 20 //串口数据缓存长度 u8 xdata Uart2_Rec_Buf[Uart2_Buf_Max]; //串口数据缓存 u8 point2 = 0; //绶存指针 bit B_TX2_Busy = 0; //发送忙标志 void main(void) { GPIO_config(); UartInit(); CLR_Buf(); while(1) { Uart2SendString("AT"); huanhang(); while(Hand("ok")==0) delay_ms(10); CLR_Buf(); Uart2SendString("AT+CIPSTART=\"TCP\",\"e248w87733.wicp.vip\",57902"); huanhang(); CLR_Buf(); while(Hand("ok")==0) delay_ms(10); CLR_Buf(); Uart2SendString("AT"); while(Hand("ok" )==0) delay_ms(10); CLR_Buf(); huanhang(); Uart2SendString("well") ; huanhang(); while(Hand("ok")==0) delay_ms(10); CLR_Buf(); } ``` ``` /*---------------------------- 通过串口2发送串口数据 ----------------------------*/ void Uart2SendData(unsigned char ch) { while(B_TX2_Busy); //不忙后发送数据 S2BUF = ch; //写数据到UART数据寄存器 B_TX2_Busy = 1; } /*---------------------------- 通过串口2发送字符串 ----------------------------*/ void Uart2SendString(char *s) { while (*s) //检测字符串结束标志 { Uart2SendData(*s++); //发送当前字符 } } bit Uart2Hand(unsigned char *a) // 串口命令识别函数 { if(strstr(Uart2_Rec_Buf,a)!=NULL) return 1; else return 0; } void Uart2CLR_Buf(void) // 串口缓存清理 { memset(Uart2_Rec_Buf, 0, Uart2_Buf_Max); //清空 point2 = 0; } ```
search[strlen(search)-1]='\0';这条指令什么意思?
char tracks[][80]={ "I,m the legend", "The girl from Iwo Jima", "Dancing with a Dork" }; void find(char search[]) { int i; for(i=0;i<5;i++){ if (strstr(tracks[i],search)) printf("Track %i:'%s'\n",i,tracks[i]); } } int main() { char search[80]; printf("Search for:"); fgets(search,80,stdin); ## # ## **_search[strlen(search)-1]='\0';_** /*这条指令什么意思*/ find(search); return 0; }
终于明白阿里百度这样的大公司,为什么面试经常拿ThreadLocal考验求职者了
点击上面↑「爱开发」关注我们每晚10点,捕获技术思考和创业资源洞察什么是ThreadLocalThreadLocal是一个本地线程副本变量工具类,各个线程都拥有一份线程私有的数
《奇巧淫技》系列-python!!每天早上八点自动发送天气预报邮件到QQ邮箱
此博客仅为我业余记录文章所用,发布到此,仅供网友阅读参考,如有侵权,请通知我,我会删掉。 补充 有不少读者留言说本文章没有用,因为天气预报直接打开手机就可以收到了,为何要多此一举发送到邮箱呢!!!那我在这里只能说:因为你没用,所以你没用!!! 这里主要介绍的是思路,不是天气预报!不是天气预报!!不是天气预报!!!天气预报只是用于举例。请各位不要再刚了!!! 下面是我会用到的两个场景: 每日下
面试官问我:什么是消息队列?什么场景需要他?用了会出现什么问题?
你知道的越多,你不知道的越多 点赞再看,养成习惯 GitHub上已经开源 https://github.com/JavaFamily 有一线大厂面试点脑图、个人联系方式,欢迎Star和完善 前言 消息队列在互联网技术存储方面使用如此广泛,几乎所有的后端技术面试官都要在消息队列的使用和原理方面对小伙伴们进行360°的刁难。 作为一个在互联网公司面一次拿一次Offer的面霸,打败了无数
8年经验面试官详解 Java 面试秘诀
    作者 | 胡书敏 责编 | 刘静 出品 | CSDN(ID:CSDNnews) 本人目前在一家知名外企担任架构师,而且最近八年来,在多家外企和互联网公司担任Java技术面试官,前后累计面试了有两三百位候选人。在本文里,就将结合本人的面试经验,针对Java初学者、Java初级开发和Java开发,给出若干准备简历和准备面试的建议。   Java程序员准备和投递简历的实
究竟你适不适合买Mac?
我清晰的记得,刚买的macbook pro回到家,开机后第一件事情,就是上了淘宝网,花了500元钱,找了一个上门维修电脑的师傅,上门给我装了一个windows系统。。。。。。 表砍我。。。 当时买mac的初衷,只是想要个固态硬盘的笔记本,用来运行一些复杂的扑克软件。而看了当时所有的SSD笔记本后,最终决定,还是买个好(xiong)看(da)的。 已经有好几个朋友问我mba怎么样了,所以今天尽量客观
MyBatis研习录(01)——MyBatis概述与入门
C语言自学完备手册(33篇) Android多分辨率适配框架 JavaWeb核心技术系列教程 HTML5前端开发实战系列教程 MySQL数据库实操教程(35篇图文版) 推翻自己和过往——自定义View系列教程(10篇) 走出思维困境,踏上精进之路——Android开发进阶精华录 讲给Android程序员看的前端系列教程(40集免费视频教程+源码) 版权声明 本文原创作者:谷哥的小弟 作者博客
程序员一般通过什么途径接私活?
二哥,你好,我想知道一般程序猿都如何接私活,我也想接,能告诉我一些方法吗? 上面是一个读者“烦不烦”问我的一个问题。其实不止是“烦不烦”,还有很多读者问过我类似这样的问题。 我接的私活不算多,挣到的钱也没有多少,加起来不到 20W。说实话,这个数目说出来我是有点心虚的,毕竟太少了,大家轻喷。但我想,恰好配得上“一般程序员”这个称号啊。毕竟苍蝇再小也是肉,我也算是有经验的人了。 唾弃接私活、做外
Python爬虫爬取淘宝,京东商品信息
小编是一个理科生,不善长说一些废话。简单介绍下原理然后直接上代码。 使用的工具(Python+pycharm2019.3+selenium+xpath+chromedriver)其中要使用pycharm也可以私聊我selenium是一个框架可以通过pip下载 pip install selenium -i https://pypi.tuna.tsinghua.edu.cn/simple/ 
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
你知道的越多,你不知道的越多 点赞再看,养成习惯 本文 GitHub https://github.com/JavaFamily 已收录,有一线大厂面试点思维导图,也整理了很多我的文档,欢迎Star和完善,大家面试可以参照考点复习,希望我们一起有点东西。 前前言 为啥今天有个前前言呢? 因为你们的丙丙啊,昨天有牌面了哟,直接被微信官方推荐,知乎推荐,也就仅仅是还行吧(心里乐开花)
Java工作4年来应聘要16K最后没要,细节如下。。。
前奏: 今天2B哥和大家分享一位前几天面试的一位应聘者,工作4年26岁,统招本科。 以下就是他的简历和面试情况。 基本情况: 专业技能: 1、&nbsp;熟悉Sping了解SpringMVC、SpringBoot、Mybatis等框架、了解SpringCloud微服务 2、&nbsp;熟悉常用项目管理工具:SVN、GIT、MAVEN、Jenkins 3、&nbsp;熟悉Nginx、tomca
Python爬虫精简步骤1 获取数据
爬虫的工作分为四步: 1.获取数据。爬虫程序会根据我们提供的网址,向服务器发起请求,然后返回数据。 2.解析数据。爬虫程序会把服务器返回的数据解析成我们能读懂的格式。 3.提取数据。爬虫程序再从中提取出我们需要的数据。 4.储存数据。爬虫程序把这些有用的数据保存起来,便于你日后的使用和分析。 这一篇的内容就是:获取数据。 首先,我们将会利用一个强大的库——requests来获取数据。 在电脑上安装
Python绘图,圣诞树,花,爱心 | Turtle篇
1.画圣诞树 import turtle screen = turtle.Screen() screen.setup(800,600) circle = turtle.Turtle() circle.shape('circle') circle.color('red') circle.speed('fastest') circle.up() square = turtle.Turtle()
作为一个程序员,CPU的这些硬核知识你必须会!
CPU对每个程序员来说,是个既熟悉又陌生的东西? 如果你只知道CPU是中央处理器的话,那可能对你并没有什么用,那么作为程序员的我们,必须要搞懂的就是CPU这家伙是如何运行的,尤其要搞懂它里面的寄存器是怎么一回事,因为这将让你从底层明白程序的运行机制。 随我一起,来好好认识下CPU这货吧 把CPU掰开来看 对于CPU来说,我们首先就要搞明白它是怎么回事,也就是它的内部构造,当然,CPU那么牛的一个东
破14亿,Python分析我国存在哪些人口危机!
2020年1月17日,国家统计局发布了2019年国民经济报告,报告中指出我国人口突破14亿。 猪哥的朋友圈被14亿人口刷屏,但是很多人并没有看到我国复杂的人口问题:老龄化、男女比例失衡、生育率下降、人口红利下降等。 今天我们就来分析一下我们国家的人口数据吧! 更多有趣分析教程,扫描下方二维码关注vx公号「裸睡的猪」 即可查看! 一、背景 1.人口突破14亿 2020年1月17日,国家统计局发布
web前端javascript+jquery知识点总结
Javascript javascript 在前端网页中占有非常重要的地位,可以用于验证表单,制作特效等功能,它是一种描述语言,也是一种基于对象(Object)和事件驱动并具有安全性的脚本语言 ,语法同java类似,是一种解释性语言,边执行边解释。 JavaScript的组成: ECMAScipt 用于描述: 语法,变量和数据类型,运算符,逻辑控制语句,关键字保留字,对象。 浏览器对象模型(Br
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
文章目录1. 前言2. 数据下载3. 数据处理4. 数据可视化 1. 前言 今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。 2月6日追记:本文发布后,腾讯的数据源多次变更u
听说想当黑客的都玩过这个Monyer游戏(1~14攻略)
第零关 进入传送门开始第0关(游戏链接) 请点击链接进入第1关: 连接在左边→ ←连接在右边 看不到啊。。。。(只能看到一堆大佬做完的留名,也能看到菜鸡的我,在后面~~) 直接fn+f12吧 &lt;span&gt;连接在左边→&lt;/span&gt; &lt;a href="first.php"&gt;&lt;/a&gt; &lt;span&gt;←连接在右边&lt;/span&gt; o
在家远程办公效率低?那你一定要收好这个「在家办公」神器!
相信大家都已经收到国务院延长春节假期的消息,接下来,在家远程办公可能将会持续一段时间。 但是问题来了。远程办公不是人在电脑前就当坐班了,相反,对于沟通效率,文件协作,以及信息安全都有着极高的要求。有着非常多的挑战,比如: 1在异地互相不见面的会议上,如何提高沟通效率? 2文件之间的来往反馈如何做到及时性?如何保证信息安全? 3如何规划安排每天工作,以及如何进行成果验收? ......
作为一个程序员,内存和磁盘的这些事情,你不得不知道啊!!!
截止目前,我已经分享了如下几篇文章: 一个程序在计算机中是如何运行的?超级干货!!! 作为一个程序员,CPU的这些硬核知识你必须会! 作为一个程序员,内存的这些硬核知识你必须懂! 这些知识可以说是我们之前都不太重视的基础知识,可能大家在上大学的时候都学习过了,但是嘞,当时由于老师讲解的没那么有趣,又加上这些知识本身就比较枯燥,所以嘞,大家当初几乎等于没学。 再说啦,学习这些,也看不出来有什么用啊!
渗透测试-灰鸽子远控木马
木马概述 灰鸽子( Huigezi),原本该软件适用于公司和家庭管理,其功能十分强大,不但能监视摄像头、键盘记录、监控桌面、文件操作等。还提供了黑客专用功能,如:伪装系统图标、随意更换启动项名称和表述、随意更换端口、运行后自删除、毫无提示安装等,并采用反弹链接这种缺陷设计,使得使用者拥有最高权限,一经破解即无法控制。最终导致被黑客恶意使用。原作者的灰鸽子被定义为是一款集多种控制方式于一体的木马程序
Python:爬取疫情每日数据
前言 有部分同学留言说为什么412,这是因为我代码里全国的cookies需要你自己打开浏览器更新好后替换,而且这个cookies大概只能持续20秒左右! 另外全国卫健委的数据格式一直在变,也有可能会导致爬取失败! 我现在已根据2月14日最新通报稿的格式修正了! 目前每天各大平台,如腾讯、今日头条都会更新疫情每日数据,他们的数据源都是一样的,主要都是通过各地的卫健委官网通报。 为什么已经有大量平台做
这个世界上人真的分三六九等,你信吗?
偶然间,在知乎上看到一个问题 一时间,勾起了我深深的回忆。 以前在厂里打过两次工,做过家教,干过辅导班,做过中介。零下几度的晚上,贴过广告,满脸、满手地长冻疮。   再回首那段岁月,虽然苦,但让我学会了坚持和忍耐。让我明白了,在这个世界上,无论环境多么的恶劣,只要心存希望,星星之火,亦可燎原。   下文是原回答,希望能对你能有所启发。   如果我说,这个世界上人真的分三六九等,
B 站上有哪些很好的学习资源?
哇说起B站,在小九眼里就是宝藏般的存在,放年假宅在家时一天刷6、7个小时不在话下,更别提今年的跨年晚会,我简直是跪着看完的!! 最早大家聚在在B站是为了追番,再后来我在上面刷欧美新歌和漂亮小姐姐的舞蹈视频,最近两年我和周围的朋友们已经把B站当作学习教室了,而且学习成本还免费,真是个励志的好平台ヽ(.◕ฺˇд ˇ◕ฺ;)ノ 下面我们就来盘点一下B站上优质的学习资源: 综合类 Oeasy: 综合
雷火神山直播超两亿,Web播放器事件监听是怎么实现的?
Web播放器解决了在手机浏览器和PC浏览器上播放音视频数据的问题,让视音频内容可以不依赖用户安装App,就能进行播放以及在社交平台进行传播。在视频业务大数据平台中,播放数据的统计分析非常重要,所以Web播放器在使用过程中,需要对其内部的数据进行收集并上报至服务端,此时,就需要对发生在其内部的一些播放行为进行事件监听。 那么Web播放器事件监听是怎么实现的呢? 01 监听事件明细表 名
3万字总结,Mysql优化之精髓
本文知识点较多,篇幅较长,请耐心学习 MySQL已经成为时下关系型数据库产品的中坚力量,备受互联网大厂的青睐,出门面试想进BAT,想拿高工资,不会点MySQL优化知识,拿offer的成功率会大大下降。 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计
Python新型冠状病毒疫情数据自动爬取+统计+发送报告+数据屏幕(三)发送篇
今天介绍的项目是使用 Itchat 发送统计报告 项目功能设计: 定时爬取疫情数据存入Mysql 进行数据分析制作疫情报告 使用itchat给亲人朋友发送分析报告(本文) 基于Django做数据屏幕 使用Tableau做数据分析 来看看最终效果 目前已经完成,预计2月12日前更新 使用 itchat 发送数据统计报告 itchat 是一个基于 web微信的一个框架,但微信官方并不允
作为程序员的我,大学四年一直自学,全靠这些实用工具和学习网站!
我本人因为高中沉迷于爱情,导致学业荒废,后来高考,毫无疑问进入了一所普普通通的大学,实在惭愧...... 我又是那么好强,现在学历不行,没办法改变的事情了,所以,进入大学开始,我就下定决心,一定要让自己掌握更多的技能,尤其选择了计算机这个行业,一定要多学习技术。 在进入大学学习不久后,我就认清了一个现实:我这个大学的整体教学质量和学习风气,真的一言难尽,懂的人自然知道怎么回事? 怎么办?我该如何更好的提升
粒子群算法求解物流配送路线问题(python)
粒子群算法求解物流配送路线问题(python) 1.查找论文文献 找一篇物流配送路径优化+粒子群算法求解的论文 参考文献:基于混沌粒子群算法的物流配送路径优化 2.了解粒子群算法的原理 讲解通俗易懂,有数学实例的博文:https://blog.csdn.net/daaikuaichuan/article/details/81382794 3.确定编码方式和解码策略 3.1编码方式 物流配送路线的
教你如何编写第一个简单的爬虫
很多人知道爬虫,也很想利用爬虫去爬取自己想要的数据,那么爬虫到底怎么用呢?今天就教大家编写一个简单的爬虫。 下面以爬取笔者的个人博客网站为例获取第一篇文章的标题名称,教大家学会一个简单的爬虫。 第一步:获取页面 #!/usr/bin/python # coding: utf-8 import requests #引入包requests link = "http://www.santostang.
前端JS初级面试题二 (。•ˇ‸ˇ•。)老铁们!快来瞧瞧自己都会了么
1. 传统事件绑定和符合W3C标准的事件绑定有什么区别? 传统事件绑定 &lt;div onclick=""&gt;123&lt;/div&gt; div1.onclick = function(){}; &lt;button onmouseover=""&gt;&lt;/button&gt; 注意: 如果给同一个元素绑定了两次或多次相同类型的事件,那么后面的绑定会覆盖前面的绑定 (不支持DOM事...
情人节来了,教你个用 Python 表白的技巧
作者:@明哥 公众号:Python编程时光 2020年,这个看起来如此浪漫的年份,你还是一个人吗? 难不成我还能是一条狗? 18年的时候,写过一篇介绍如何使用 Python 来表白的文章。 虽然创意和使用效果都不错,但有一缺点,这是那个exe文件,女神需要打开电脑,才有可能参与进来,进而被你成功"调戏”。 由于是很早期的文章了,应该有很多人没有看过。 没有看过的,你可以点击这里查看:用Pyt...
用Python开发实用程序 – 计算器
作者:隋顺意 一段时间前,自己制作了一个库 “sui-math”。这其实是math的翻版。做完后,python既然可以轻易的完成任何的数学计算,何不用python开发一个小程序专门用以计算呢? 现在我们越来越依赖于计算器,很多复杂的计算都离不开它。我们使用过各式各样的计算器,无论是电脑自带的,还是网也上的计算器,却都没有自己动手编写属于自己计算器。今天就让我们走进计算器的世界,用python来编写...
经典算法(19)教你两分钟学会【选择排序】
这篇博客使用图文并茂的方式讲解选择排序算法,并有完整的算法逻辑以及代码实现。
相关热词 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数 c#日期精确到分钟 c#自定义异常必须继承 c#查表并返回值 c# 动态 表达式树 c# 监控方法耗时 c# listbox c#chart显示滚动条
立即提问