-1

我想编写一个程序来检查哪个字符串的长度更大,而不使用字符串函数。我试图将这两个字符串作为输入使用gets(),但我的程序不断崩溃。请帮忙!谢谢!

这是我的代码:

#include <stdio.h>
int l1,l2;
char *st1,*st2;
void accept()
{
    gets(st1);
    gets(st2);
}
void length()
{
    int i = 0;
    while (st1[i] != '\0')
    {
        l1++; i++;
    }
    i = 0;
    while (st2[i] != '\0')
    {
        l1++; i++;
    }

}
int main()
{
    accept();
    length();
    if (l1 > l2)
        printf("String #1 is greater in length.\n");
    else
        printf("String #2 is greater in length.\n");
}
4

2 回答 2

4

你没有分配空间,st1st2没有初始化它们......所以它们都指向内存中的某个未知位置。尝试...

char st1[1024];
char st2[1024];

也就是说,意识到这gets本质上是不安全的,因为它会受到缓冲区溢出攻击;没有什么可以阻止某人输入超过 1024 的字符串并导致程序崩溃。

您还可以大大简化 length() 函数,如下所示...

void length()
{
    for (l1 = 0; st1[l1] != '\0'; l1++ );
    for (l2 = 0; st2[l2] != '\0'; l2++ );
}

扩展这个和你关于什么是替代品的问题gets(),答案是使用类似的东西fgets()- 例如......

int main( int argc, char** argv )
{
    if( fgets( st1, sizeof( st1 ), stdin ) != NULL )
    {
        if( fgets( st2, sizeof( st2 ), stdin ) != NULL )
        {
            length();

            if (l1 > l2) printf("String #1 is greater in length.\n");
            else if (l2 > l1) printf("String #2 is greater in length.\n");
            else printf( "Both strings are the same length.\n" );
        }
        else printf( "could not read second string\n" );
    }
    else printf( "could not read first string\n" );

    return( 0 );
}

在这种情况下,fgets()将不允许用户溢出st1st2确保它们始终为空终止字符串。

于 2013-04-14T15:27:51.920 回答
1

l2在第二个while循环中 使用,

    l1=0;
    while (st1[l1] != '\0')
    {
        l1++;
    }
    l2 = 0;
    while (st2[l2] != '\0')
    {
        l2++;
    }
于 2013-04-14T15:26:29.373 回答