所以这是一个问题:编写函数strend(s,t),如果char t出现在字符串s的末尾,则返回1,否则返回0。
这是我的代码:
int strend(char*, char);
int main()
{
int n = -1;
char str1[6] = "Hello", char1;
printf("Enter a character: ");
char1 = getchar();
n = strend(str1, char1);
printf("n = %d", n);
return 0;
}
int strend(char* str1, char str2)
{
while(*str1 != '\0')
{
str1++;
}
if(*str1 == str2)
{
return 1;
}
else
{
return 0;
}
}
然而,字符匹配不能按预期执行。哪里出错? 感谢。
答案 0 :(得分:2)
您正在将字符与\0
字符串终结符进行比较。
int strend(char* str1, char str2)
{
if (*str1 == '\0') {
return 0;
}
while(*str1 != '\0') /* removed ; that shouldn't be there */
{
str1++;
}
/* at this point, str1 is pointing to the 0-terminator */
str1--; /* pointer now points to last character of the string, not 0-terminator */
if(*str1 == str2)
{
return 1;
}
else
{
return 0;
}
}
答案 1 :(得分:0)
我会尝试自己的解释
假设您的while()
循环已到达字符串str1
的最后一个非零字符
在这种情况下,行while( *str1 != '\0' )
正在“询问”此字符是否为零
由于它是您正在寻找的角色,因此逻辑上它不能是'\0'
然后比较表达式为“true”,并执行增量str1++;
现在*str1
是字符'\0'
,并且在评估*str1 != '\0'
时,紧接的下一次迭代会给出“false”。
然后while()
块结束,程序继续行if(*str1 == str2)
此处,*str1
的值'\0'
与str2
进行比较,结果总是为“false”。
但是,所需的字符仍然位于str1
的前一个记忆位置
因此,您可以递减str1
然后进行比较,或者您可以将str2
与(str1 - 1)
进行比较。
// Option 1
str1--;
if(*str1 == str2)
//Option 2
if ((str1 - 1) == str2)
答案 2 :(得分:0)
没有任何错误检查,(你可以这样做)这里有一个 one liner ,它会检查最后一个字符是否匹配:
int strend(char* str1, char str2)
{
return ((str1[strlen(str1)-1]) == str2)?(1):(0);
}
以更易读的形式或 :
int strend(char* str1, char str2)
{
return ((str1[strlen(str1)-1]) == str2);
}