Моя программа для проверки содержимого и длины строки имеет некоторые проблемы - PullRequest
2 голосов
/ 08 октября 2019

Я не могу набрать второй ввод в командной строке, он говорит, что моя программа остановлена. Я просто пробую свой собственный код. Я добавил две функции для проверки длины и содержимого строки. И я могу просто использовать strcmp (), но я избегаю использовать это для практики.

#include<stdio.h>
#include<string.h>
int lencompare(char *str1, char *str2){
    int len1, len2;
    len1 = strlen(str1);
    len2 = strlen(str2);
    return (len1==len2) ? 1 : 0;
}
int compare(char *str1, char *str2){
    int i =0, flag=0;
    if(lencompare(str1, str2)==1){
        while(*(str1+i) != '\0');
        {
            if(*(str1+i) == *(str2+i))
             flag = 1;
            else
             flag = 0;
            i++;
        }
        return flag;
    }
    if(lencompare(str1, str2) == 0){
        printf("Length is Different");
    }
}
int main(){
    char *str1 , *str2 ;
    fgets(str1, 20, stdin);
    fgets(str2, 20, stdin);
    if(compare(str1, str2) == 1){
        printf("both length and content are same");
    }
    return 0;
}

1 Ответ

6 голосов
/ 08 октября 2019

Для начала эти переменные

char *str1 , *str2 ;

не инициализируются. Таким образом, программа уже имеет неопределенное поведение. Вам необходимо объявить символьные массивы, например,

enum { N = 20 };
char str1[N], str2[N];

Стандартная функция fgets может добавить символ новой строки '\n' к введенной строке, если в массиве символов достаточно места.

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

fgets(str1, 20, stdin);
fgets(str2, 20, stdin);

str1[ strcspn( str1, "\n" ) ] = '\0';
str2[ strcspn( str2, "\n" ) ] = '\0';

Функция lencompare должна быть объявлена ​​и определена как

int lencompare( const char *str1, const char *str2 )
{
    return strlen( str1 ) == strlen( str2 );
}

Функция compare имеет неопределенное поведение, потому что в некоторых путях выполнения она ничего не возвращает.

Также он должен быть объявлен как

int compare( const char *str1, const char *str2 );

Внутри функции вы дважды вызываете функцию lencompare:

if(lencompare(str1, str2)==1){

и

if(lencompare(str1, str2) == 0){

Программа может выглядеть следующим образом

#include <stdio.h>
#include <string.h>

int lencompare( const char *str1, const char *str2 )
{
    return strlen( str1 ) == strlen( str2 );
}

int compare( const char *str1, const char *str2 )
{
    int equal = lencompare( str1, str2 );

    if ( equal )
    {
        while ( *str1 == *str2 && *str1 ) 
        {
            ++str1;
            ++str2;
        }           

        equal = *str1 == *str2;
    }

    return equal;
}   

int main(void) 
{
    enum { N = 20 };
    char str1[N], str2[N];

    fgets( str1, sizeof( str1 ), stdin );
    fgets( str2, sizeof( str2 ), stdin );

    str1[ strcspn( str1, "\n" ) ] = '\0';
    str2[ strcspn( str2, "\n" ) ] = '\0';

    if ( compare( str1, str2 ) )
    {
        puts( "both length and content are same" );
    }

    return 0;
}

Ее вывод может выглядеть следующим образом:

Sridhar
Sridhar
both length and content are same

Обратите внимание, что вместо цикла while в функции compare вы можете использоватьстандартная функция C strcmp. В этом случае функция сравнения будет очень простой

int compare( const char *str1, const char *str2 )
{
    return strcmp( str1, str2 ) == 0;
}   

На самом деле нет необходимости предварительно сравнивать длины строк.

...