我已经为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
。我假设使用指针的比较不是以这种方式使用的?
6条答案
按热度按时间deikduxw1#
你需要复习一下C字符串的基础知识。在
string.h
中有很多标准的字符串函数可以帮助你完成这个测试。基本的问题是测试
s == t
是有效的,但是您在这里比较的是内存地址。其中
test
显然与您的"Hello"
相同,类似地,test+1
与"ello"
相同(通过打印它们来尝试)。此外,我还收到两个警告:
*s++;
上“警告:表达式结果未使用[-未使用值]":您递增s
,但还要通过*s
询问该位置上字符是什么;而你却不使用这些信息。通过删除此处的
*
进行修复。p < strlen(s) ..
上;“警告:比较不同符号的整数:'int'和'unsigned long'“,因为strlen
不返回有符号整数,而是返回无符号整数(显然,我的头使用unsigned long
)。通过将
p
声明为unsigned long
或更好的size_t
进行修复。你的整个例程可以浓缩为一个简单的
不值得麻烦地将这四个
strlen
调用的结果缓存到两个临时变量中;一个好的编译器会为您解决这个问题(快速浏览一下我正在使用的编译器的汇编输出-clang
-可以看出,即使使用默认的优化设置,它也能做到这一点)。根据@M.M.的评论,对测试进行了略微修改:
但是试图用这种方法优化它并不像上面的例程那样容易解析,而且它的汇编也非常“冗长”。
uqxowvwt2#
使用
strcmp(3)
这实际上比较的是
s
和t
指向的内存内容,而不是它们的地址。f0ofjuux3#
您的代码会以多种方式被破解:
p
为正,则初始循环是一个非常麻烦的方法,它将p
向前推进长度差。strcmp()
(或memcmp()
,如果可以先排除strlen(s) < strlen(t)
的情况。t
指向s
所指向的字符串内部时,比较循环后获得的指针才起作用,这是编译器可能会也可能不会为main
中的特定调用生成的一种特殊情况:strend("Hello", "ello");
.以下是修改后的版本:
nmpmafwu4#
我更正/修改了您的代码,以下是代码,
w41d8nur5#
这段代码也能用。
pdkcd3nj6#
该代码工作良好。