我为 strend
创建了一个函数,如果字符串 t
出现在字符串 s 的末尾,它基本上返回
,但它永远不会返回1
1
:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int strend(char *s, char *t) {
int p;
for (p = 0; p < strlen(s) - strlen(t); p++) {
*s++;
}
printf("%s\n%s\n", s, t);
if (s == t)
return 1;
return 0;
}
int main(void) {
int bool = strend("Hello", "ello");
printf("%i\n", bool);
return 0;
}
这给了我一个输出:
ello
ello
0
所以从技术上讲我应该得到1
。我认为使用指针的比较不是以这种方式使用的?
最佳答案
您需要复习一下 C 字符串的基础知识。 string.h
中有很多标准字符串函数。这可以帮助您完成此测试。
基本问题是测试s == t
是有效的,但您在这里比较内存地址。如果将要测试的字符串更改为
char test[] = "Hello";
int bool = strend_(test, test+1);
哪里test
显然与你的 "Hello"
相同,类似地,test+1
与 "ello"
相同(通过打印来尝试)。 正确返回 1
与你的日常习惯。
此外,我还收到两个警告:
于
*s++;
“警告:表达式结果未使用 [-Wunused-value]”:您递增s
还可以通过*s
询问该位置是什么字符;并且您不使用该信息。
通过删除*
进行修复那里。于
p < strlen(s) ..
; “警告:比较不同符号的整数:‘int’和‘unsigned long’”,因为strlen
不返回有符号整数,而是返回无符号整数(显然,我的 header 使用unsigned long
)。
通过声明p
进行修复如unsigned long
,或者更好,size_t
.
您的整个日常工作可以浓缩为一个简单的
int strend (char *s, char *t)
{
if (strlen(s) >= strlen(t) && !strcmp (s+strlen(s)-strlen(t),t))
return 1;
return 0;
}
不值得这么麻烦地缓存这四个 strlen
的结果调用 2 个临时变量;一个好的编译器会解决这个问题并为你做这件事。 (快速浏览一下我正在使用的编译器的汇编输出 – clang
– 显示它确实如此,即使使用默认的优化设置也是如此。)
根据 @M.M. 的评论稍作修改的测试:
int strend (char *s, char *t)
{
if (strlen(s) < strlen(t)) return 0;
return !strcmp (s+strlen(s)-strlen(t),t);
}
但是尝试以这种方式优化它并不像上面的例程那样容易解析,而且它的汇编也有点“冗长”。就我个人而言,我会选择更易于阅读的版本。
关于c - C 中的 strend 函数使用指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33532638/