我为strend
创建了一个函数,如果在字符串1
的末尾存在字符串t
,它基本上会返回s
,但它永远不会返回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
。我假设使用指针的比较没有以这种方式使用?
答案 0 :(得分:1)
答案 1 :(得分:1)
您需要查看C字符串的基本知识。 string.h
中有许多标准字符串函数可以帮助您完成此测试。
基本问题是测试s == t
有效,但您在此处比较内存地址。如果将字符串更改为test to
char test[] = "Hello";
int bool = strend_(test, test+1);
其中test
显然与您的"Hello"
相同,同样地,test+1
与"ello"
相同(通过打印它们来尝试)。这个正确会在您的日常工作中返回1
。
另外,我收到两个警告:
on *s++;
“警告:表达式结果未使用[-Wunused-value]”:您递增s
但还要通过*s
询问该位置的哪个角色;并且您不使用该信息
通过删除那里的*
进行修复。
p < strlen(s) ..
; “警告:比较不同符号的整数:'int'和'unsigned long'”,因为strlen
不返回有符号整数而是无符号整数(显然,我的标题使用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);
}
但是尝试以这种方式优化它并不像上面的例程那样容易解析,并且它的组装也是如此“有点”。就个人而言,我会选择更人性化的版本。
答案 2 :(得分:1)
您的代码有多种破损方式:
如果是正数,初始循环是通过长度的不同使p
前进的一种非常麻烦的方法。
一旦您的指针与两个字符串的末尾距离相同,则应将字符与strcmp()
(或memcmp()
进行比较,如果可以先排除{{1 }}。
只有在strlen(s) < strlen(t)
指向t
所指向的字符串内的情况下,比较循环之后获得的指针,这是编译器可能会或可能不会产生的特殊情况s
中的特定呼叫:main
。
这是修改后的版本:
strend("Hello", "ello");
答案 3 :(得分:0)
我纠正/修改了你的代码,这是代码,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#pragma warning(disable:4996)
int strend(char *s, char *t)
{
int p,flag=0,count=0;//count will be the starting index for *t
p = strlen(s) - strlen(t);//this will be the starting index for *s
while(count<strlen(t))
{
if (*(s+p) == *(t+count))
{
flag = 1;
count++;
p++;
continue;
}
else
{
flag = 0;
break;
}
}
return flag;
}
int main(void)
{
int flag = strend("Hello", "ello");
printf("%i\n", flag);
return 0;
}
答案 4 :(得分:0)
此代码也适用。
#include <stdio.h>
#include <string.h>
int strend (char *s1, char *s2);
void main ()
{
char str1[20] = "somethings";
char str2[20] = "things";
int f;
f = strend (str1,str2);
if (f==1)
printf ("1");
else
printf ("0");
}
int strend (char *str1, char *str2)
{
int l = strlen(str1) - strlen(str2);
str1 = str1 + l;
int d = strcmp(str1,str2);
if (d == 0)
return 1;
else
return 0;
}