2016-12-18 5 views
1

2 개의 변수가 있습니다. 하나는 unsigned short array[10] 유형이어야하며 (다른 사람에게 요청해야 함) 다른 하나는 scanf의 입력이되어 문자열로 편리합니다.
for 루프를 사용하여 문자열에서 부호없는 short로 값을 하나씩 전달합니다.
프로그램은 정상적으로 작동하지만 경고 메시지가 표시됩니다.
"Warning passing argument of strcmp from incobatible pointer type""expected const char * but argument is of type short unsigned int". 경고없이 문자열에서 부호없는 short로 전달하는 방법을 찾지 못하는 것 같습니다.
내 프로그램의 짧은 버전을 사용하면 더 선명하게 볼 수 있습니다.문자열에서 부호없는 단락으로 전달

경고는 28,43 행에 있습니다.

#include <stdio.h> 
#include <string.h> 
#include <stdlib.h> 

int i, j, numberofseats; 
char phone[11]; 
char *p; 
unsigned short tempphone[10]; 
typedef struct 
{ 
    char fullname[40]; 
    unsigned short phonenr[10]; 
    unsigned int seatnr; 
} PASSENGERS; 

int main() 
{ 
    PASSENGERS passenger[53]; 
    printf("Enter Passenger's Phone Nr:"); 
    scanf("%s", phone); 
    i = 0; 
    for (p = phone; *p != '\0'; p++) 
    { 
    (tempphone[i]) = *p - '0'; 
    i++; 
    } 
    for (j = 0; j < numberofseats; j++) 
    { 
    if (strcmp(tempphone, passenger[j].phonenr) == 0) 
     printf("Passenger %s has Seat Nr %u already Booked", passenger[j].fullname, passenger[j].seatnr); 
    } 
} 
+1

'tempphone'에 실제로 사용되는 숫자의 어딘가를 저장하고 싶습니다. ** ** ** ** ** ** ** ** 처음에는 strlen (phone) 요소 만 초기화합니다. 또한,'strcmp'를 사용하여 정수의 배열을 비교할 수 없습니다. – tofro

+0

@tofro : "* 숫자를 몇 자리에 저장 하시겠습니까 *"OP가 실제로 비교 * 작업 *을 알게 될 것입니다 ... ...--) – alk

+0

프로그램이 잘 작동합니다. > memcmp (tempphone, passenger [j] .phonenr, sizeof (tempphone)) == 0) 두 경고가 모두 사라진 것처럼 보입니다. – baskon1

답변

1

memcmp를 사용하거나 char *에 캐스팅하여 strcmp를 사용할 수 있습니다. memcmp에는 세 번째 매개 변수로 비교할 메모리 크기가 필요합니다. 당신은 다음과 같이 memcmp는 사용할 수

, 그러나

memcmp(tempphone, passenger[j].phonenr, sizeof(tempphone)); 

, 비교 된 전화 번호의 크기가 동일하지 않은 경우 잘못된 비교 발생할 수 있습니다 하나는 0 에 대해 생각해 숫자로 끝나는 경우 case tempphone이 12345이고 passenger [j] .phonenr이 1234500000 인 경우 memcmp는 varibables를 0으로 초기화하는 것을 잊지 않으면 memcmp가 전화 번호가 동일하다고 판단 할 수 있습니다. 전화 번호의 길이를 유지하려면 다른 변수가 필요하지만, 물론 전화 번호가 항상 고정되어 있으면 상관 없습니다.

저는 전화 번호를 short 배열 대신 char 배열로 유지하고 strcmp를 사용합니다. 전화 번호는 숫자이지만 추가 나 나누기와 같은 수학적 연산의 대상이 아닙니다. 여기에는 이름과 유사한 정보가 들어 있습니다.

+0

로 남겨두고 있습니다. 답변을 주셔서 감사합니다. 불행히도 나는 그렇게하도록 요청을 받았다. 그래서 나는 그걸로 일하고있다 .. 또한 나는 전화 번호를위한 나의 전체 프로그램의 또 다른 부분에서 모든 값을 0으로 초기화했다. 어쩌면 tcslen을 사용하는 것이 더 좋다. 또는 누군가 다른 사람이 전에 제안한 tcscmp? – baskon1

+0

"* char *로 캐스팅하고 strcmp *를 사용하십시오."비교는 첫 번째 '0'이 발견되면서 중단되므로 좋지 않습니다. – alk

+0

@alk, 네 말이 맞아. 주조는 경고 메시지를 표시하지 않습니다. 문제는 아직 해결되지 않았습니다. –