您在为您的密钥设置阵列大小时犯了几个错误。请记住,一个C字符串总是由一个空字符终止,并且当您将数组放大到接受这样的字符串时,您必须对此进行解释。
scanf是不安全的,请不要使用它。改用fgets。一个安全的使用与fgets的是:
fgets (buffer, sizeof(buffer), stdin);
的回答你的问题是否定的,这将是更好地使用STRCMP如果你想词法用C比较字符串,并且将涉及包括头部。但即便如此,由于fgets和strcmp在相同的标准C库中,因此不会添加任何其他“库”。
如果你不能添加任何其他的头文件(如果这是一个大型项目的一部分,这是没有意义的,但如果这是一个家庭作业问题,这是非常有意义的),那么你可以编写自己的strcmp(我们称之为比较在这里)并从main调用它。
#include <stdio.h>
int compare (const char* src, const char* dst)
{
int ret = 0;
while(! (ret = *src - *dst) && *dst){
++src, ++dst;
}
if (ret < 0)
ret = -1 ;
else if (ret > 0)
ret = 1 ;
return(ret);
}
int main(void){
char key[6]="april",ckey[6];
printf("Enter the key: ");
fgets(ckey, sizeof ckey, stdin);
if(!compare(key,ckey)) {
printf("Correct.");
}
else {
printf("Wrong.");
}
return 0;
}
更好地利用你的时间将是使用标准C库为您提供的功能,把它写:
#include <stdio.h>
#include <string.h>
int main(void){
char key[6]="april",ckey[6];
printf("Enter the key: ");
fgets(ckey, sizeof ckey, stdin);
if(!strcmp(key,ckey)) {
printf("Correct.");
}
else {
printf("Wrong.");
}
return 0;
}
但是,即使这个解决方案有一个缺陷。它将接受“aprilaaaa”或以“april”开头的任何字符串作为有效的ckey。你能解释为什么吗?你会如何解决这个问题?
撰写您自己的'strcmp'版本 –
您的字符串溢出阵列。 –
C中的字符串需要终止空值。所以如果字符串有5个字符,你需要至少6个'char'位置来保存它。 – lurker