Moremoresuga 2017-06-29 15:50 采纳率: 0%
浏览 1572
已结题

C语言有关strstr()的问题

代码如下,在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条回答 默认 最新

  • tenfyzhong 2017-06-30 00:54
    关注

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

    评论

报告相同问题?

悬赏问题

  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮
  • ¥15 ads仿真结果在圆图上是怎么读数的
  • ¥20 Cotex M3的调试和程序执行方式是什么样的?
  • ¥20 java项目连接sqlserver时报ssl相关错误
  • ¥15 一道python难题3
  • ¥15 牛顿斯科特系数表表示
  • ¥15 arduino 步进电机
  • ¥20 程序进入HardFault_Handler