Вывод значения ASCII последнего символа в строке ввода пользователя (с использованием fgets) равен 10, а ожидаемое значение равно 0 - PullRequest
0 голосов
/ 05 февраля 2020

Я пишу программу для имитации strcmp (). Это мой код.

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#define MAX 100
int strcmp(const char *str1, const char *str2);

char s1[MAX], s2[MAX];

int main()
{
    printf("Compare two user entered strings character by character.\n");
    printf("Enter string one: ");
    fgets(s1, MAX, stdin);
    printf("Enter string two: ");
    fgets(s2, MAX, stdin);
    printf("The user entered string one is: %s", s1);
    printf("The user entered string two is: %s", s2);
    printf("The value returned by strcmp() is: %d", strcmp(s1, s2));
    return 0;
}

int strcmp(const char *str1, const char *str2){
    int result;
    while(*str1 != '\0' && *str1 - *str2 == 0){
            str1++;
            str2++;
    }
    if(*str1 - *str2 != '\0'){
            printf("%d\n", *str1);
            printf("%d\n", *str2);
            result = *str1 - *str2;
        }else if(*str1 == '\0' && *str2 == '\0'){
            result = 0;
        }

    return result;
}

По большей части он работает нормально, и функция strcmp () возвращает правильные результаты, за исключением случаев, когда одна строка завершается, а у другой остаются символы. Я использую while l oop для сравнения символов и увеличения указателей на следующий символ. Когда строка увеличивается до '\ 0', целочисленное значение, отображаемое при выполнении printf, равно 10. Почему это не 0? Поскольку значение равно 10, вычет из него символа других строк дает результат, который больше на 10.

Почему это происходит?

1 Ответ

2 голосов
/ 05 февраля 2020

Функция fgets может добавить символ новой строки '\n' - десятичный 10 (соответствующий клавише Enter) к введенной строке, если в массиве символов назначения достаточно места.

Вы должны удалить это. Например

#include <string.h>

//...

fgets(s1, MAX, stdin);
s1[ strcspn( s1, "\n" ) ] = '\0'; 
printf("Enter string two: ");
fgets(s2, MAX, stdin);
s2[ strcspn( s2, "\n" ) ] = '\0'; 
...