我只是练习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"){
^
答案 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)
首先,您已将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");