我想制作一个有钥匙打开的程序。但是当我比较键和输入时,它总是说"错误":
#include <stdio.h>
int main(){
char key[5]="april",ckey[5];
printf("Enter the key: ");
scanf("%s",ckey);
if(ckey==key){
printf("Correct.");
}
else{
printf("Wrong.");
}
return 0;
}
是否可以在不使用其他库的情况下解决问题?
答案 0 :(得分:2)
你必须逐个字符地检查。 试试这段代码:
json_tricks
答案 1 :(得分:2)
你必须在&#34;%s&#34;之前留出空间。在ckey
语句中,所以&#39; \ n字符未存储在ckey
中以确保比较成功。注意:#include <stdio.h>
#include <string.h>
int main(){
char key[] = "april",ckey[6];
printf("Enter the key: ");
scanf(" %5s",ckey);
if(!strcmp(ckey, key)){
printf("Correct.");
}
else{
printf("Wrong.");
}
return 0;
}
的大小必须为6或更多。
AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
TimePicker timePicker1;
timePicker1 = (TimePicker) findViewById(R.id.timePicker1);
// ---get current date and time---
Calendar calendar = Calendar.getInstance();
// ---PendingIntent to launch activity when the alarm
// triggers---
Intent intent = new Intent(List2.this,
DisplayNotifications.class);
intent.putExtra("message", esmdars);
intent.putExtra("Title", "alarm");
PendingIntent pendingIntent = PendingIntent.getBroadcast(
List2.this, 0, intent, 0);
// ---sets the alarm to trigger---
alarmManager.set(
AlarmManager.RTC_WAKEUP,
System.currentTimeMillis()
+ (TimeUnit.SECONDS.toMillis(30)),
pendingIntent);
答案 2 :(得分:1)
您在键的数组大小调整中犯了几个错误。请记住,C字符串总是以空字符结束,当您调整数组大小以接受此类字符串时,您必须考虑到这一点。
scanf不安全,请勿使用它。请改用fgets。 fgets的安全使用是:
fgets (buffer, sizeof(buffer), stdin);
你的问题的答案是否定的,如果你想要词汇比较C中的字符串并且涉及包含标题,那么最好使用strcmp。但即便如此,由于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。你能解释一下原因吗?你会如何解决这个问题?
答案 3 :(得分:-6)
在if语句
的条件下if(ckey==key){
比较了阵列占用的两个存储区域地址。
所以你总会得到假,因为数组占用不同的内存区域。
如果您不能使用其他标准函数,例如标题strncmp
中声明的memcmp
或<string.h>
,那么您可以按以下方式编写
#include <stdio.h>
int main( void ){
char key[5]="april",ckey[6];
printf("Enter the key: ");
scanf("%5s",ckey);
size_t i = 0;
while ( i < sizeof( key ) && key[i] == ckey[i] ) ++i;
if( i == sizeof( key ) ){
printf("Correct.");
}
else{
printf("Wrong.");
}
return 0;
}
而不是scanf
,最好使用fgets
。在这种情况下,必须增加数组ckey
的大小。
此声明
char key[5]="april";
在C中完全有效,但在C ++中无效。:)