在C中使用指针的strend函数?

laximzn5  于 2022-12-02  发布在  其他
关注(0)|答案(6)|浏览(99)

我已经为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。我假设使用指针的比较不是以这种方式使用的?

deikduxw

deikduxw1#

你需要复习一下C字符串的基础知识。在string.h中有很多标准的字符串函数可以帮助你完成这个测试。
基本的问题是测试s == t是有效的,但是您在这里比较的是内存地址。

char test[] = "Hello";
int bool = strend_(test, test+1);

其中test显然与您的"Hello"相同,类似地,test+1"ello"相同(通过打印它们来尝试)。
此外,我还收到两个警告:

  • *s++;上“警告:表达式结果未使用[-未使用值]":您递增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调用的结果缓存到两个临时变量中;一个好的编译器会为您解决这个问题(快速浏览一下我正在使用的编译器的汇编输出-clang-可以看出,即使使用默认的优化设置,它也能做到这一点)。
根据@M.M.的评论,对测试进行了略微修改:

int strend (char *s, char *t)
{
    if (strlen(s) < strlen(t)) return 0;
    return !strcmp (s+strlen(s)-strlen(t),t);
}

但是试图用这种方法优化它并不像上面的例程那样容易解析,而且它的汇编也非常“冗长”。

uqxowvwt

uqxowvwt2#

使用strcmp(3)

if (strcmp(s, t) == 0) return 1;

这实际上比较的是st指向的内存内容,而不是它们的地址。

f0ofjuux

f0ofjuux3#

您的代码会以多种方式被破解:

  • 如果p为正,则初始循环是一个非常麻烦的方法,它将p向前推进长度差。
  • 一旦指针与两个字符串末尾的距离相同,则应将字符与strcmp()(或memcmp(),如果可以先排除strlen(s) < strlen(t)的情况。
  • 只有当t指向s所指向的字符串内部时,比较循环后获得的指针才起作用,这是编译器可能会也可能不会为main中的特定调用生成的一种特殊情况:strend("Hello", "ello"); .

以下是修改后的版本:

#include <string.h>

int strend(const char *str1, const char *str2) {
    size_t len1 = strlen(str1);
    size_t len2 = strlen(str2);
    return len1 >= len2 && !memcmp(str1 + len1 - len2, str2, len2);
}
nmpmafwu

nmpmafwu4#

我更正/修改了您的代码,以下是代码,

#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;
}
w41d8nur

w41d8nur5#

这段代码也能用。

#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;
}
pdkcd3nj

pdkcd3nj6#

该代码工作良好。

int strend(char *s, char *t){
    while(*t & *s){
        if(*t == *s){
            t++;
        }
        s++;
    }
    return *t==*s;
}

相关问题