如何处理C中的字符串输入?

时间:2016-08-23 19:30:02

标签: 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"){
                                 ^

4 个答案:

答案 0 :(得分:4)

1)不要读(扫描)成char。你需要一个字符串。使用格式说明符%s而不是%c

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;
}

答案 1 :(得分:1)

C编程语言中没有string数据类型。 C中的字符串表示为array of characters

在C中,char是表示字符的数据类型。因此,您需要做的就是声明一个array of char data type来表示C中的字符串。该数组中的每个元素都将包含字符串的字符。

此外,C中的==, !=, +=, +中的运算符是在C中为build-in data types定义的,因此,在C中没有运算符重载,您不能将这些运算符与C-String一起用作C-字符串不是C编程语言中的内置数据类型。

注意:C-Strings实际上是以空数终止的char数据类型数组。这意味着,C中任何C字符串中的最后一个字符将用于存储标记字符串结尾的空字符('\0')

头文件<string.h>具有可用于操作C-String的预定义函数(以空数终止的char数据类型数组)。您可以通过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-Strings的正确格式说明符是C编程语言中的%s。所以,我必须更改你的scanf()函数调用。另外,我使用了strcmp()函数,该函数在头文件<string.h>中声明(我在上面的程序中包含了这个头文件)。如果字符串匹配,则返回数字零。您可以在here上方详细了解它。另外,请查看strncmp() strcmp()的更安全版本。此外,请记住,如果您尝试访问任何数组,它可能会导致undefined behavior。因此,最好在您的计划中加入检查。因为,他们的答案中包含的人可以将我的scanf()函数调用更改为:

scanf("%100s", uname);

它避免在数组uname中读取超过100个字符,因为它只分配给存储100个字符(不包括Null字符)。

答案 2 :(得分:1)

这是您使用milkstrings

执行此操作的方法
==

答案 3 :(得分:0)

首先,您已将unamepasswd声明为单个字符,但您想要读取字符串。因此,您需要为每个长度定义最大长度,并将其声明如下:

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");