用if else比较字符串

时间:2015-11-07 13:51:12

标签: c

我想制作一个有钥匙打开的程序。但是当我比较键和输入时,它总是说"错误":

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

是否可以在不使用其他库的情况下解决问题?

4 个答案:

答案 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 ++中无效。:)