我很遗憾在这个门户网站上提出这个问题。因为这可能是一个愚蠢的问题。但是,我正在努力找出strcmp
无效的原因?
我也写了自己的strcmp
,我发现s1
和rev
与rev
不同,正在拿着一些垃圾。请帮帮我哪里出错了?
void main()
{
int i,j;
char rev[5];
char s1[5]= "madam";
for(i=strlen(s1)-1, j = 0; i>=0; j++, i--)
{
rev[j]=s1[i];
}
puts(rev);
printf("\n");
puts(s1);
if(strcmp(rev,s1) == 0)
{
printf("Palindrome!!! \n");
}
}
我代替strcmp(rev, s1)
我自己i_strcmp(rev, s1)
。
int i_strcmp(char *s1, char *s2)
{
int i;
for (i = 0; s1[i] && s2[i]; ++i)
{
/* If characters are same or inverting the 6th bit makes them same */
if (s1[i] == s2[i] || (s1[i] ^ 32) == s2[i])
continue;
else
break;
}
/* Compare the last (or first mismatching in case of not same) characters */
if (s1[i] == s2[i])
return 0;
if ((s1[i]|32) < (s2[i]|32)) //Set the 6th bit in both, then compare
return -1;
return 1;
}
但它仍然没有用,我试图调试它,并在rev中发现了一些垃圾值。但是当我将字符串打印到控制台时,它会向控制台提供正确的输出。
答案 0 :(得分:7)
strlen
,strcmp
等所有功能都需要在结尾处使用\ x00的字符串。您的阵列没有空间(5个字符)。使用您自己的strcmp
版本,您过于依赖\ x00限制器,这很可能不存在。
您可以使用strncmp
代替。或者有更大的阵列。
答案 1 :(得分:3)
问题在于strlen然后是strcmp。
所有基于字符串的函数都基于C.So中的空终止字符,您的s1没有(空字符),因此strlen无法正常工作。
例如,检查此程序:
#include <stdio.h>
#include<string.h>
int main()
{ char a[7]="wwwwwww"; /* --------->No space reserved for NUL. */
printf("%d",strlen(a));
}
输出为10. Strlen给出的结果不正确,因为你没有给它'\ 0'。