2014-11-01 2 views
-3

Я очень новичок в языке программирования c. Я написал этот код, и мне интересно, есть ли способ , чтобы написать этот код короче и эффективнее?Проблемы с переменными и функцией scanf

Код:

#include <stdio.h> 

int main(){ 

    printf("This is my first program.\nPlease put in your name...\n"); 

    char letter[5]; 


    scanf("%c%c%c%c%c%c", &letter[0], &letter[1], &letter[2], &letter[3], &letter[4], &letter[5]); 


    if(letter[0] == 't' && letter[1] == 'r' && letter[2] == 'a' && letter[3] == 'v' && letter[4] == 'i' && letter[5] == 's'){ 
     printf("Access Granted\nWelcome Travis.\n"); 
     return 0; 
    } 



    else{ 
     printf("You are not autorized.\nThis program will exit now...\n"); 
     getchar(); 

    } 

    }if(letter[0] == 'b' && letter[1] == 'o' && letter[2] == 'b'){ 
     printf("Access Granted\nWelcome Bob.\n"); 
     return 0; 
    } 
+0

Для работы код и обзор кода - см. codereview.stackexchange.com –

+1

После исправления с несколькими скобками: http://coliru.stacked-crooked.com/a/ac471e129d93ece1 – chris

+0

Вы прочитали документацию по [scanf (3)] (http://man7.org/linux/man-pages/man3/ scanf.3.html) (вы должны проверить его результат)? Вы скомпилировали все предупреждения и информацию об отладке ('gcc -Wall -Wextra -g')? Вы использовали ** отладчик ** ('gdb')? –

ответ

1
scanf("%c%c%c%c%c%c", &letter[0], &letter[1], &letter[2], &letter[3], &letter[4], &letter[5]); 

неправильно, как letter длиной 5 элементов с индексами 0-4. Так, в scanf выше, letter[5] не является допустимым местом. Вы выходите за пределы массива. Чтобы это исправить, просто объявить, что массив размером 7 (6 символов для «Travis» +1 для \0 в конце) вместо 5:

char letter[7]; 

Затем, что scanf может быть сокращено с помощью %s:

scanf("%6s",letter); 

Далее

if(letter[0] == 't' && letter[1] == 'r' && letter[2] == 'a' && letter[3] == 'v' && letter[4] == 'i' && letter[5] == 's') 

И

if(letter[0] == 'b' && letter[1] == 'o' && letter[2] == 'b') 

Может быть сокращено с помощью strcmp функции из string.h заголовка и объединены с помощью логического ИЛИ оператора:

if(strcmp(letter,"bob")== 0 || strcmp(letter,"travis") == 0) 
{...} 

Собираем все вместе,

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

int main(){ 

    printf("This is my first program.\nPlease put in your name...\n"); 

    char letter[7]; 


    scanf("%6s", letter); 


    if(strcmp(letter,"bob")== 0 || strcmp(letter,"travis") == 0) 
     printf("Access Granted\nWelcome %s.\n",letter); 
    else 
     printf("You are not autorized.\nThis program will exit now...\n"); 

    getchar(); 
    return 0; //you don't need these in every if and else. 
    } 
+0

Wow thaks alot для быстрого ответа! Мне очень нравится этот форум :) – travisjayday

0

Здесь вы идете

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

    int main() 
    { 
     unsigned int len_max = 128; 
     unsigned int current_size = 0; 

     char *pStr = malloc(len_max); 
     current_size = len_max; 

     printf("\nEnter your string value:\n"); 

     if(pStr != NULL) 
     { 
     int c = EOF; 
     unsigned int i =0; 
     //accept user input until hit enter or end of file 
     while ((c = getchar()) != '\n' && c != EOF) 
     { 
      pStr[i++]=(char)c; 

      //if i reached maximize size then realloc size 
     if(i == current_size) 
     { 
      current_size = i+len_max; 
      pStr = realloc(pStr, current_size); 
     } 
     } 

     pStr[i] = '\0'; 

     printf("\nLong String value:%s \n\n",pStr); 
     //compare pStr with your defined string for authentication. 
     //e.g if(pStr=="myString"){printf("Access granted!");} 
     //free memory 
     free(pStr); 
     pStr = NULL; 


     } 
    return 0; 
} 
Смежные вопросы