我的用于检查字符串内容和长度的程序遇到一些问题

时间:2019-10-08 14:45:41

标签: c c-strings strcmp strlen

我无法在命令提示符下键入第二个输入,它说我的程序已停止。我只是尝试自己的代码。 我添加了两个函数来检查字符串的长度和内容。 而且我可以简单地使用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 个答案:

答案 0 :(得分:6)

对于初学者来说,这些变量

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

请注意,您可以使用标准C函数compare代替函数strcmp中的while循环。在这种情况下,功能比较将非常简单

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

实际上,不需要初步比较字符串的长度。