输入10个字符并统计其中字母,数字个数

img


为什么不对?

#include <stdio.h>
#define N 10
 
int main()
{
    int i, l = 0, b = 0, d = 0, o = 0;
    char a[N];
    gets_s(a);
    for (int i = 0; i < N; i++)
    {
        if (a[i] >= 65 && a[i] <= 90 || a[i] >= 97 && a[i] <= 122)
        {
            l++;
        }
        else if (a[i] == 32)
        {
            b++;
        }
        else if (a[i] >= 48 && a[i] <= 57)
        {
            d++;
        }
        else
        {
            o++;
        }
    }
    printf("letter=%d, blank=%d, digit=%d, other=%d", l, b, d, o);
    return 0;
}

.global main

.section .rodata

.LC0:
.string "%d"

.LC1:
.string "nums : %d\n"

.LC2:
.string "letter : %d\n"

.text
main:
pushq %rbp
movq %rsp,%rbp
subq $0x1000,%rsp

movl $0,-16(%rbp) /* str */
movl $0,-20(%rbp) /* letter */
movl $0,-24(%rbp) /* nums */
movl $0,-28(%rbp) /* i */

leaq -16(%rbp),%rdi /* str */
call gets 

movl $0,-28(%rbp) /* i */
jmp .Lmain_400

.Lmain_500:
movl -28(%rbp),%eax
movslq %eax,%rax
leaq -16(%rbp),%rdi
movb 0(%rdi,%rax,1),%al /* str[i] */

cmpb $97,%al /* a */
jl .Lmain_492

cmpb $122,%al /* z */
jg .Lmain_492

addl $1,-20(%rbp) /* letter */

.Lmain_492:
cmpb $65,%al /* A */
jl .Lmain_485

cmpb $90,%al /* Z */
jg .Lmain_485

addl $1,-20(%rbp) /* letter */

.Lmain_485:
cmpb $48,%al /* 0 */
jl .Lmain_480

cmpb $57,%al /* 9 */
jg .Lmain_480

addl $1,-24(%rbp) /* nums */

.Lmain_480:
addl $1,-28(%rbp) /* i */

.Lmain_400:
cmpl $10,-28(%rbp) /* i */
jl .Lmain_500

movl -24(%rbp),%esi /* nums */
leaq .LC1(%rip),%rdi 
movl $0,%eax 
call printf 

movl -20(%rbp),%esi /* letter */
leaq .LC1(%rip),%rdi 
movl $0,%eax 
call printf 

movl $0,%eax
leave
ret