2016-04-21 6 views
0
int iPassCode, iNumber = 0; 

void main() 
{ 
    iNumber = get_name(); 
    iPassCode = get_code(); 
    name_strucutre(); 
} 

int get_name() 
{ 
    printf("Please enter your name: "); 
    cName[MAX_NAME_LEN] = getchar(); 
    if(strcmp(cName,"leia"||"Leia")) 
    { 
     iNumber = 1; 
    } 
    if(strcmp(cName,"darth"||"Darth")) 
    { 
     iNumber = 2; 
    } 
    if(strcmp(cName,"r2d2"||"R2D2")) 
    { 
     iNumber = 3; 
    } 
    if(strcmp(cName,"solo"||"Solo")) 
    { 
     iNumber = 4; 
    } 
    if(strcmp(cName,"jabba"||"Jabba")) 
    { 
     iNumber = 5; 
    } 
    if(strcmp(cName,"yoda"||"Yoda")) 
    { 
     iNumber = 6; 
    } 
    else 
    { 
     iNumber = 0; 
    } 
    return(iNumber); 
} 

int get_code() 
{ 
    printf("Please enter your pass code: "); 
    scanf("%d", iPassCode); 
    return (iPassCode); 
} 

У меня есть пара моих функций здесь. Один из них, я думаю, его функция get name() приводит к сбою программы. Прямо сейчас все, что я пытаюсь сделать, это собрать имя и код доступа от пользователя и передать информацию обратно на main(). Я не хочу передавать все имя, хотя просто единственное число.c строка чтения вызывает сбой

+0

'MAX_NAME_LEN' ??? –

+1

'' leia "||" Leia "' не делает то, что, по вашему мнению, делает. Вам нужны два отдельных вызова 'strcmp' или вариант' stricmp'. (И вы ошибаетесь в версии нижнего регистра того или иного лорда Ситхов). – Bathsheba

+0

'#define MAX_NAME_LEN 42' Вспомните, что у меня было это в начале – JMBTaylor

ответ

3

Есть несколько вопросов, давайте проанализируем их один на один

  1. Прежде всего,

    cName[MAX_NAME_LEN] = getchar(); 
    

    является недействительным, поскольку

    • В соответствии с последним стандарт, по умолчанию int больше не является стандартом. Вам необходимо определить тип данных

    • Один звонок getchar() читает номер char. По крайней мере, вам нужен цикл.

    Вам нужно изменить что-то вроде

    char cName[MAX_NAME_LEN] = {0}; 
    

    , а затем, через петлю getchar() читать ввод.

    В противном случае используйте fgets() для считывания и сохранения ввода.

  2. Тем не менее, вы не можете сравнить несколько строк в одном вызове как

    if(strcmp(cName,"leia"||"Leia")) 
    

    это, по существу

    if(strcmp(cName,1)) 
    

    что опять-таки незаконно. Вы можете использовать strcasecmp(), чтобы игнорировать случай. В противном случае, чтобы быть строго стандартным, вы должны использовать отдельные вызовы strcmp() для сравнения строки с каждым валидатором.

    и да, strcmp()0 по успеху (матч).

  3. Вы пишете

    scanf("%d", iPassCode); 
    

    , который должен быть

    scanf("%d", &iPassCode); //missed the address-of 
    

После всего этого, с точки стиля кодирования зрения, позвольте мне добавить, что, return это ключевое слово, не делайте его похожим на вызов функции.

+0

так сделайте это? 'cName [MAX_NAME_LEN] = fgets();' – JMBTaylor

+0

@JMBTaylor no, это вовсе не синтаксис. Пожалуйста, прочитайте связанную страницу руководства. –

+0

ах получил. Ссылка на linux fgets и немного трудно понять для новичка, но все, что мне нужно было изменить, это «get (cName)»; – JMBTaylor

0

Взгляните на эти ошибки:

  • Вы используете

    Scanf ("% D", iPassCode);

, чтобы читать, но вы объявили

int iPassCode; 

, тогда как scanf потребности читать указатель.

Замените его

scanf("%d", &iPassCode); 
  • Другой ошибкой является способом сравнить строки. Заменить все сравнения в следующем формате:

    if ((strcmp(cName,"something") == 0) || (strcmp(cName,"something") == 0)) 
    
  • Кроме того, вы не можете иметь cName[MAX_NAME_LEN] = getchar(); в качестве действительного заявления.

  • В конце концов, я полагаю, что вы определили MAX_NAME_LEN где-то, иначе вы должны.
+0

Это была пересмотренная ошибка, но я не думаю, что программа зашла так далеко, потому что она все еще падает, прежде чем уведомлять меня об этом. – JMBTaylor

+0

@JMBTaylor Я обновил свой пост с большим количеством ошибок, которые я вижу, взгляните :) – Marievi

3

Выражение strcmp(cName,"leia"||"Leia") эквивалентно strcmp(cName, 1).

Подвыражение "leia"||"Leia": true, который в C эквивалентен 1.

Если вы хотите проверить, соответствует ли строка той или иной, вам нужны два вызова strcmp: strcmp(cName,"leia") == 0 || strcmp(cName,"Leia") == 0.

+0

Или что-то вроде 'stricmp', хотя я никогда не могу вспомнить, является ли это стандартным C или нет. – Bathsheba

+0

@ Bathsheba Nope, это специальная функция Windows CRT. Стандарт C не имеет никакого отношения к регистру. –

+0

@JoachimPileborg как насчет 'strcasecmp()'? [POSIX] –