C 我用于检查字符串内容和长度的程序出现了一些问题

C 我用于检查字符串内容和长度的程序出现了一些问题,c,c-strings,strcmp,strlen,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

我无法在命令提示符中键入第二个输入,它表示我的程序已停止。我只是在尝试我自己的代码。 我添加了两个函数来检查字符串的长度和内容。 我可以简单地使用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;
}
#包括
#包括
int lencompare(字符*str1,字符*str2){
int len1,len2;
len1=strlen(str1);
len2=strlen(str2);
返回值(len1==len2)?1:0;
}
int比较(char*str1,char*str2){
int i=0,flag=0;
if(lencompare(str1,str2)==1){
而(*(str1+i)!='\0');
{
如果(*(str1+i)=*(str2+i))
flag=1;
其他的
flag=0;
i++;
}
返回标志;
}
if(lencompare(str1,str2)==0){
printf(“长度不同”);
}
}
int main(){
字符*str1,*str2;
fgets(str1,20,stdin);
fgets(str2、20、stdin);
如果(比较(str1,str2)==1){
printf(“长度和内容相同”);
}
返回0;
}

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

char *str1 , *str2 ;
未初始化。所以程序已经有了未定义的行为。您需要声明字符数组,例如

enum { N = 20 };
char str1[N], str2[N];
fgets(str1, 20, stdin);
fgets(str2, 20, stdin);

str1[ strcspn( str1, "\n" ) ] = '\0';
str2[ strcspn( str2, "\n" ) ] = '\0';
如果字符数组中有足够的空间,标准函数
fgets
可以将新行字符
'\n'
附加到输入的字符串中

您应该删除此字符。比如说

enum { N = 20 };
char str1[N], str2[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){

程序可以按以下方式运行

#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;
}
请注意,您可以使用标准的C函数
strcmp
,而不是函数
compare
中的while循环。在这种情况下,函数比较将非常简单

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

事实上,没有必要比较字符串的长度

那么,您的程序显示了什么输出?屏幕截图很好。str1和str2需要是缓冲区,最多20个字符-您还没有为它们分配内存。尝试char str1[21],str2[21];您应该修改
标志的使用
。你一直在设置和清除它。将其初始化为
1
,如果任何字符不同,则将其设置为
0
。如果它们是一样的,不要碰它。另外,在
int compare()
中,并非所有控制路径都返回值(请参见编译器警告)。
str1[i]
*(str1+i)
是同一回事,而且更容易理解。