2016-08-23 3 views
2

Я просто практикуя C, и я хотел бы сделать простую программу Войти с именем пользователя и паролем ... вот мой код:Как мне обрабатывать строковый ввод в C?

int main(){ 
    char uname, passwd; 

    printf("Enter your username: "); 
    scanf("%c", uname); 
    printf("Enter your password: "); 
    scanf("%c", passwd); 

    printf(" \n"); 

    if (uname == "waw" && passwd == "wow"){ 
     printf("You have logged in\n"); 
    } else { 
     printf("Failed, please try again\n"); 
    } 
    return 0; 
} 

А потом я получил эту ошибку, когда я пытаюсь скомпилировать это

log.c: In function ‘main’: 
log.c:7:10: warning: format ‘%c’ expects argument of type ‘char *’, but  argument 2 has type ‘int’ [-Wformat=] 
    scanf("%c", uname); 
     ^
log.c:9:10: warning: format ‘%c’ expects argument of type ‘char *’, but  argument 2 has type ‘int’ [-Wformat=] 
    scanf("%c", passwd); 
     ^
log.c:13:14: warning: comparison between pointer and integer 
    if (uname == "waw" && passwd == "wow"){ 
      ^
log.c:13:33: warning: comparison between pointer and integer 
    if (uname == "waw" && passwd == "wow"){ 
           ^
+6

ваших '' uname' и passwd'variables одиночных символов. То, что вы действительно хотите, это массивы символов. – Chris

+1

Ваш вопрос нуждается в заголовке, который отражает то, о чем вы просите. «Как мне с этим справиться?» ничего нам не говорит. –

+2

Также, если вы хотите сравнить строку, вам нужно использовать strcmp (uname, "waw") == 0, not == напрямую, иначе вы сравниваете char (integer) с указателем на массив символов «waw» или «waw», wow " – Rob

ответ

1

Там нет типа string данных в языке программирования C. Строки в C представлены как array of characters.

В C char - тип данных для представления символа. Итак, все, что вам нужно сделать, это объявить array of char data type для представления строки в C. Каждый элемент в этом массиве будет содержать символ вашей строки.

Кроме того, операторы в C, как ==, !=, +=, + определены для build-in data types в C и так, нет перегрузки операторов в C, вы не можете использовать эти операторы с вашим C-String в качестве C-Strings не строить в данном введите язык программирования C.

Примечание: C-Строки на самом деле представляют собой массив символов с символами без символов. Это означает, что последний символ в любой C-String в C будет использоваться для хранения символа Null ('\0'), который отмечает конец строки.

В файле заголовка <string.h> есть предопределенные функции, которые можно использовать для работы с C-String (массив символов с символом Null-terminated). Вы можете узнать больше об этом за here.

Таким образом, ваша программа должна выглядеть следующим образом:

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

#define CSTR_MAX_LEN 100 
int main() 
{ 
    char uname[CSTR_MAX_LEN+1]; //An extra position to store Null Character if 100 characters are to be stored in it. 
    char passwd[CSTR_MAX_LEN+1]; 

    printf("Enter your username: "); 
    scanf("%s", uname); 


    printf("Enter your password: "); 
    scanf("%s", passwd); 

    // Use strcmp to compare values of two strings. 
    // If strcmp returns zero, the strings are identical 
    if ((strcmp(uname, "waw") == 0) && (strcmp(passwd, "wow") == 0)){ 
     printf("You have logged in\n"); 
    } else{ 
     printf("Failed, please try again\n"); 
    } 
    return 0; 
} 

Помните, что правильный спецификатор формата для обработки C-строки в языке программирования C %s. Итак, я должен изменить ваш вызов функции scanf(). Кроме того, я использовал функцию strcmp(), которая объявлена ​​в заголовочном файле <string.h> (я включил этот файл заголовка в вышеуказанную программу). Он возвращает числовой нуль, если строки совпадают. Вы можете прочитать об этом выше here.Кроме того, посмотрите на strncmp(), который является более безопасной версией strcmp(). Кроме того, помните, что это может привести к undefined behavior, если вы попытаетесь получить доступ к любому массиву из привязки. Поэтому было бы неплохо включить проверку вашей программы. Как кто-то входит в их ответе вы можете изменить свой вызов scanf() функцию, чтобы:

scanf("%100s", uname); 

Он избегает читать более 100 символов в массиве uname как он выделяется только для хранения 100 символов (за исключением нулевого символа).

+0

Спасибо за ответ, а также так жаль позднего ответа ... и еще раз спасибо за это, решает мой вопрос! –

+0

Вы можете поддержать, если это помогло. ответ, который помог вам. – abhiarora

0

Прежде всего, вы объявили uname и passwd как одиночные символы, но вы хотите читать строки. Таким образом, вы должны определить максимальную длину для каждого из них и объявить их следующим образом:

char [X] uname;  //where X is the maximum length for uname, for instance 25 
char [Y] passwd; //where Y is the maximum length for passwd, for instance 20 

Соответственно, ваша scanf() функция, то должен быть изменен:

scanf("%s", uname); 
scanf("%s", passwd); 

Кроме того, вам нужно strcmp() к сравните строку со значением. Изменение if заявление:

if ((strcmp(uname, "waw") == 0) && (strcmp(passwd, "wow") == 0)) { 
    printf("You have logged in\n"); 
+0

Просьба пояснить, что' MAX_LENGTH_UNAME' не является божественным откровением, а целой константой, которую должен определить op. –

+0

@KubaOber да, вы правы, сейчас редактируете. – Marievi

+1

'char *' ** не ** строки (и они также не массивы)! C не имеет строкового типа. И поскольку вы все равно «malloc» буферов с фиксированным размером, нет причин использовать «malloc», но просто используйте массивы. Также ваш код подвержен неопределенному поведению. – Olaf

4

1) Не читать (сканирование) в символ. Вам нужна строка. Используйте спецификатор формата% s вместо% с

2) Используйте STRCMP для сравнения строковых значений

Попробуйте это:

#include <stdio.h> 

int main(){ 
    int res; 
    char uname[40]; // char arrays instead of single char 
    char passwd[40]; 

    printf("Enter your username: "); 
    res = scanf("%39s", uname); // Set a maximum number of chars to read to 
           // 39 to avoid overflow 
    if (res != 1) exit(1);  // Error on stdin. End program 

    printf("Enter your password: "); 
    res = scanf("%39s", passwd); 
    if (res != 1) exit(1); // Error on stdin 

    printf(" \n"); 

    // Use strcmp to compare values of two strings. 
    // If strcmp returns zero, the strings are identical 
    if ((strcmp(uname, "waw") == 0) && (strcmp(passwd, "wow") == 0)){ 
     printf("You have logged in\n"); 
    } else{ 
     printf("Failed, please try again\n"); 
    } 
    return 0; 
} 
+0

спасибо, сэр, ваши знания действительно помогли понять c для бит –

1

Это, как вы можете сделать это с milkstrings

tXt ask(tXt prmp) { 
    printf("%s ?",prmp) ; 
    return(txtFromFile(stdin)) ; } 



void main(void) { 
    tXt user = ask("user") ; 
    if (strcmp(txtConcat(user,"/",ask("password"),NULL),"waw/wow") == 0) 
    printf("You have logged in\n"); 
    else 
    printf("Failed, please try again\n"); 
} 
Смежные вопросы