2013-03-23 7 views
0

Я хочу сравнить некоторые данные, которые клиент отправляет на сервер. Bout У меня есть эта ошибка, когда я использую strncmp t сравнить то, что я прочитал из сокета, и строки, которые я использую для сравнения. Может кто-нибудь сказать мне, почему эта ошибка?Передача аргумента 1 из 'strncmp' делает указатель из целого без литой C-программирования

предупреждение: передавая аргумент 1 из «» strncmp делает указатель из целого числа без броска

Сервер:

void 
result(int sockfd) 
{ 
    ssize_t  n; 
    char  buf[MAXLINE]; 
    int   temp; 
    time_t  ticks; 
    int   i; 
again: 
    while ((n =read(sockfd, buf, MAXLINE)> 0)) 
    { 
    buf[n] = '\0'; 
    printf("Message Recieved:%s\n",buf); 
    srand (time(NULL)); 
    temp = rand() % 40+1; 
    printf("Ramdom es %i\n",temp); 

    if ((strncmp (buf[0],"Axx",1) == 0) || (strncmp (buf[0],"axx",1) == 0)) 
    { 
     snprintf(buf, sizeof(buf), "Option A choosen in %i on %.24s\r\n", temp,ctime(&ticks)); 
     Writen(sockfd, buf, n); 
    } 
    if ((strncmp (buf[0],"Bxx",1) == 0) || (strncmp (buf[0],"bxx",1) == 0)) 
    { 
     snprintf(buf, sizeof(buf), "Option B choosen in %i on %.24s\r\n", temp,ctime(&ticks)); 
     Writen(sockfd, buf, n); 
    } 
    else 
    { 
     printf("Incorrect Input"); 
     Close(sockfd); 
     break; 
    } 
    } 
    if (n < 0 && errno == EINTR) 
    goto again; 
    else if (n < 0) 
     err_sys("read error"); 
} 

int 
main(int argc, char **argv) 
{ 
    int     listenfd, connfd; 
    socklen_t   len; 
    struct sockaddr_in servaddr, cliaddr; 
    char    buff[MAXLINE]; 
    /*char    message[MAXLINE];*/ 
    char    recvline[MAXLINE + 1]; 

    listenfd = Socket(AF_INET, SOCK_STREAM, 0); 
    bzero(&servaddr, sizeof(servaddr)); 
    servaddr.sin_family  = AF_INET; 
    servaddr.sin_addr.s_addr = htonl(INADDR_ANY);/*----------------------------------------------------*/ 
    servaddr.sin_port  = htons(5678); 

    Bind(listenfd, (SA *) &servaddr, sizeof(servaddr)); 
    Listen(listenfd, LISTENQ); 
    printf("EDMTS is running on 127.0.0.1, listening on port 5678\n"); 
    printf("\n"); 
    printf("Waiting for incoming connections...Press Ctrl+C to end server\n"); 

    for (; ;) 
    { 
     len = sizeof(cliaddr); 
     connfd = Accept(listenfd, (SA *) &cliaddr, &len); 

     /*Client connects to server*/ 
     printf("\n"); 
     printf("Connection from %s, port %d\n", 
       Inet_ntop(AF_INET, &cliaddr.sin_addr, buff, sizeof(buff)), 
       ntohs(cliaddr.sin_port)); 

      result(connfd); 
       Close(connfd); 

    } 
} 

Большое спасибо.

ответ

1

buf[0] является char, но strncmp ожидает char*. Вместо

strncmp (buf[0],"Axx",1) 

делают

strncmp (buf,"Axx",1) 

т.д.

Но, если вы передаете 1 в качестве параметра длины к strncmp, вы также можете просто проверить

if (buf[0] == 'A' || buf[0] == 'a') // resp. 'B', 'b' 

и избегайте вызова функции.

+0

Спасибо, это работает. Теперь у меня есть еще одна ошибка. – netfreak

+0

@netfreak Какая другая ошибка? –

+0

Ну нет и ошибка точно, теперь она не попадает в ifs. Он генерирует случайное число, и приглашение остается там, если оно где-то ждет чего-то. Он ничего не делает. Не попадает в ifs – netfreak

1

Вы должны передать не символ (buf[0]), но указатель на символ (buf например) для сравнения.

2

strncmp ожидает const char* как первый аргумент, тогда как вы передаете только символ.

Изменить это:

if ((strncmp (buf,"Bxx",1) == 0) || (strncmp (buf,"bxx",1) == 0)) 

 Смежные вопросы

  • Нет связанных вопросов^_^