不使用标准库函数进行字符串比较

问题描述 投票:0回答:3

我是 C 编程新手。这只是一个初学者的问题。我试图在不使用标准函数的情况下实现字符串比较。这里我使用了动态内存分配并使用了

fgets()
。但第二个字符串没有输入。谁能帮我指出问题所在吗?代码如下。

#include <stdio.h>
#include <stdlib.h>

int my_strcmp(char*, char*);

int main()
{
    int a, n;
    printf("enter the length of strings\n");
    scanf("%d",&n);
    getchar();

    char *s1 = (char *)malloc(n * sizeof(char));
    printf("enter the string1\n");
    fgets(s1, n, stdin);
    getchar();

    char *s2 = (char *)malloc(n * sizeof(char));
    printf("enter the string2\n");
    fgets(s2, n , stdin);

    if (s1 == NULL)
    {
        printf("malloc error!!");
    }

    if (s2 == NULL)
    {
        printf("malloc error!!");
    }

    a = my_strcmp( s1, s2);

    if (a == 0)
    {
        printf("the strings are equal");
    }
    else
    {
        printf("the strings are not equal");
    }
    free (s1);
    free (s2);
    return 0;
}

int my_strcmp( char *s1, char*s2)
{
    while (*s1)
    {
        if (*s1 == *s2)
        {
            s1++;
            s2++;
        }
        else
            break;
    }

    if ( *s1 == *s2)
    {
        return 0;
    }
    else if (*s1 > *s2)
    {
        return 1;
    }
    else
    {
        return -1;
    }
} 
c string pointers malloc
3个回答
2
投票

n
fgets
参数是缓冲区的大小,包括空终止符。因此,它最多读取
n - 1
个字符,并用空终止符填充最后一个位置。您对
getchar
的第二次调用(在第一个
fgets
之后)然后读取最后一个字符,而不是换行符,因此对 fgets 的第二次调用提前停止,因为它立即遇到换行符。

相反,您需要为每个字符串分配

n + 1

个字符,并使用

fgets
调用
n + 1

此外,在尝试写入

malloc

s1
之前,您应该检查 s2 是否失败。
    
代码可以这样改。


0
投票

从用户处获取后设置

n=n+1
。这是为了对付
'\0'

角色

    
我想这里应该使用一些小的改变:
你可以这样做:


0
投票

© www.soinside.com 2019 - 2024. All rights reserved.