Strcmp
Jump to navigation
Jump to search
Syntax
int strcmp ( const char * str1, const char * str2 );
Description
Compares the C string str1 to the C string str2.
This function starts comparing the first character of each string. If they are equal to each other, it continues with the following pairs until the characters differ or until a terminating null-character is reached.
This function performs a binary comparison of the characters. For a function that takes into account locale-specific rules, see strcoll.
Parameters
- str1
- C string to be compared.
- str2
- C string to be compared.
Return Value
Returns an integral value indicating the relationship between the strings:
return value | indicates |
---|---|
<0 | the first character that does not match has a lower value in ptr1 than in ptr2 |
0 | the contents of both strings are equal |
>0 | the first character that does not match has a greater value in ptr1 than in ptr2 |
Example
C source | Assembly |
---|---|
#include <stdio.h>
#include <string.h>
int main()
{
char password[30];
char expected[] = "veryeasy";
printf("What is the password? ");
scanf("%30s", password);
if (strcmp (password, expected) == 0) {
printf("OK\n");
} else {
printf("KO\n");
}
return 0;
}
|
.text:00000000004005E6 ; int __cdecl main(int argc, const char **argv, const char **envp)
.text:00000000004005E6 public main
.text:00000000004005E6 main proc near
.text:00000000004005E6
.text:00000000004005E6 expected = byte ptr -30h
.text:00000000004005E6 var_28 = byte ptr -28h
.text:00000000004005E6 password = byte ptr -20h
.text:00000000004005E6
.text:00000000004005E6 push rbp
.text:00000000004005E7 mov rbp, rsp
.text:00000000004005EA sub rsp, 30h
.text:00000000004005EE mov rax, 7973616579726576h ; 'veryeasy'
.text:00000000004005F8 mov qword ptr [rbp+expected], rax
.text:00000000004005FC mov [rbp+var_28], 0
.text:0000000000400600 mov edi, offset format ; "What is the password? "
.text:0000000000400605 mov eax, 0
.text:000000000040060A call _printf
.text:000000000040060F lea rax, [rbp+password]
.text:0000000000400613 mov rsi, rax
.text:0000000000400616 mov edi, offset a30s ; "%30s"
.text:000000000040061B mov eax, 0
.text:0000000000400620 call ___isoc99_scanf
.text:0000000000400625 lea rdx, [rbp+expected]
.text:0000000000400629 lea rax, [rbp+password]
.text:000000000040062D mov rsi, rdx ; s2
.text:0000000000400630 mov rdi, rax ; s1
.text:0000000000400633 call _strcmp
.text:0000000000400638 test eax, eax
.text:000000000040063A jnz short wrong_password
.text:000000000040063C mov edi, offset s ; "OK"
.text:0000000000400641 call _puts
.text:0000000000400646 jmp short loc_400652
.text:0000000000400648 ; ---------------------------------------------------------------------------
.text:0000000000400648
.text:0000000000400648 wrong_password:
.text:0000000000400648 mov edi, offset aKo ; "KO"
.text:000000000040064D call _puts
.text:0000000000400652
.text:0000000000400652 loc_400652:
.text:0000000000400652 mov eax, 0
.text:0000000000400657 leave
.text:0000000000400658 retn
.text:0000000000400658 main endp
|