2016-12-18 9 views
1

У меня есть 2 переменных. Нужно иметь тип unsigned short array[10] (меня просят сделать это), а другой будет входом от scanf, что удобно для строки.
Я передаю значения один за другим, начиная с строки и заканчивая unsigned short с циклом for.
Программы работают нормально, но я получаю предупреждающие сообщения.
"Warning passing argument of strcmp from incobatible pointer type" и "expected const char * but argument is of type short unsigned int". Я не могу найти, как перейти от строки к unsigned 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, пассажир [j] .phonenr, sizeof (tempphone)) == 0) оба предупреждения, похоже, уходят .. – baskon1

ответ

1

Вы можете использовать memcmp или casting для char * и использовать strcmp. Имейте в виду, что memcmp требует размера памяти, который будет сравниваться как третий параметр.

Вы можете использовать memcmp как это,

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

Однако, это может привести к неправильному сравнению, если размер сравниваемых телефонов не то же самое, и если один заканчивается с номером 0. Думай о в случае с телефоном 12345 и пассажиром [j] .phonenr 1234500000. memcmp может судить, что номера телефонов совпадают, если вы не забудете инициировать varibables до 0. Вам нужна другая переменная, чтобы сохранить длину номера телефона, конечно, не имеет значения, постоянно ли фиксируются номера телефонов.

Я бы сохранил номера телефонов в массиве символов вместо массива шорт и использовал strcmp. Номера телефонов - это номера, но они не являются объектами математических действий, таких как добавление или разделение. Они содержат информацию, похожую на имена.

+0

Большое спасибо за ответ. К сожалению, меня попросили сделать это, поэтому я просто работаю с ним, как есть. Также я инициализировал все значения 0 в другой части моей полной программы для номера телефона. Так что, возможно, лучше использовать tcslen или tcscmp, что кто-то еще предложил раньше? – baskon1

+0

"* casting to char \ * и использовать strcmp *" - это плохая идея, так как сравнение останавливается с обнаружением 1-го '0'. – alk

+0

@alk, Вы правы. Кастинг просто подавляет предупреждение. Проблема остается нерешенной. –