我是C编程新手。这只是一个初学者的问题。我试图实现字符串比较不使用标准函数。这里我使用了动态内存分配,并使用了fgets()
。但是第二个字符串没有输入。有人能帮我指出这个问题吗?代码如下:
#include <stdio.h>
#include <stdlib.h>
int my_strcmp(char*, char*);
int main()
{
int a, n;
printf("enter the length of stringsn");
scanf("%d",&n);
getchar();
char *s1 = (char *)malloc(n * sizeof(char));
printf("enter the string1n");
fgets(s1, n, stdin);
getchar();
char *s2 = (char *)malloc(n * sizeof(char));
printf("enter the string2n");
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;
}
}
fgets
的n
参数是缓冲区的大小,包括空终止符。因此,它最多读取n - 1
个字符,并用空终止符填充最后一个位置。第二次调用getchar
(在第一次fgets
之后)然后读取最后一个字符,而不是换行符,因此第二次调用fgets
提前停止,因为它立即遇到换行符。
相反,您希望为每个字符串分配n + 1
字符,并使用n + 1
调用fgets
。
此外,在尝试写入s1
或s2
之前,您应该检查malloc
失败。
代码可以这样修改。
getchar(); //Fix
fgets(s1, n, stdin);
getchar();
char *s2 = (char *)malloc(n * sizeof(char));
设置从用户获取n=n+1
。这是处理' '
字符