gpt4 book ai didi

c - 我试图在 K&R 练习中定义字符串结束函数

转载 作者:行者123 更新时间:2023-12-01 23:27:51 25 4
gpt4 key购买 nike

我试图定义 strend(s,t) 函数,如果字符串 t 在 s 字符串的末尾返回 1 ,否则返回 0 ,这是我的代码。

typedef enum state
{
Not_occured ,
occured
}State;
char a[]="Hello world zone";
char b[]="ne";
int main(void)
{
int x = 0 ;
x = strend(a,b);
printf("%d",x);
return 0;
}

int strend(char *s, char *t)
{
while(*++s);
while(*++t);
while(*t-- == *s--)
if(!(*t))
return occured;
return Not_occured;
}

修改后的代码
int strend(char *s, char *t)
{
char *ptr = s;
while(*++s);
while(*++t);
while(*t-- == *s--)
if(s == ptr)
return occured;
return Not_occured;
}

为什么前缀在这里工作 while(*++s);while(*++t); 和 postfix 不起作用?

最佳答案

if(!(*t)) 假设字符串中的第一个字符之前有一个空字符。这不仅是一个不正确的假设,而且它还试图访问数组边界之外的内存。

另外, while(*t-- == *s--) ...当 2 个字符串相同或 ts 长时会发生什么?

这是一个简单的解决方案:

int strend(char *s, char *t) {
if (s == NULL || t == NULL) return Not_occured;

size_t s_len = strlen(s);
size_t t_len = strlen(t);

if (t_len <= s_len) {
return 0 == strcmp(&s[s_len - t_len], t) ? occured : Not_occured;
}
return Not_occured;
}

由于现在更清楚原始问题是关于修复前和修复后操作,我已经更新。

首先了解一下两者的区别:
int x = 1;
printf("%d", x++);
// Prints 1 because x is evaluated before the inc
x = 1;
printf("%d", ++x);
// Prints 2 because x is evaluated after the inc

现在,一些运算符优先级:
postfix > dereference
prefix == dereference, right-to-left assoc.
*s++ 会发生什么:
  • s++ 被评估 - 这首先存储 s 的当前值(我们称之为 s0 ),然后增加 s
  • s0 被取消引用

  • 这与:
    char *s0 = s;
    s += 1;
    char c = *s0;
    *++s 会发生什么:
  • s 递增
  • s 被取消引用

  • 这与:
    s += 1;
    char c = *s;

    希望这是有道理的。

    关于c - 我试图在 K&R 练习中定义字符串结束函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51141712/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com