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

时间:2015-11-04 21:45:57

标签: c pointers

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

5 个答案:

答案 0 :(得分:1)

使用strcmp(3)

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

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

答案 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;
}