gpt4 book ai didi

将单词的所有副本大写 : why does this code fail when it's in its own function?

转载 作者:行者123 更新时间:2023-11-30 21:00:23 25 4
gpt4 key购买 nike

我有两个 C 样式字符串:

char st[100] = "to be  or not to be ";
char sub_s[100] = "be";

我需要用 strstr(st, sub_s) 找到“be”的开头并将其更改为大写字母。新字符串需要是`“to BE or not to BE”;

我设法在没有函数的情况下做到这一点,如下所示:

void main()
{
char st[100] = "to be or not to be ";
char sub_s[100] = "be";
char* p;
int i;

while (p = strstr(st, sub_s))
{
for (i = 0; i < strlen(sub_s); i++)
{
p[i] -= 32;
}
}

printf("%s\n", st);
}

但是当我将此代码放入其自己的函数中时,它不再起作用:

void main()
{
char st[100] = "to be or not to be ";
char sub_s[100] = "be";
replaceSubstring(st, sub_s);
}

void replaceSubstring(char* str, char* substr)
{
int* p;
int i;

while (p = strstr(str, substr))
{
for (i = 0; i < strlen(substr); i++)
{
p[i] -= 32;
}
}

printf("%s\n", st);
}

这是怎么回事?

最佳答案

在您编写的函数中,您设置了 p 的类型成为int* ,不是char * 。这意味着当你写

p[i] -= 32;

编译器将假定 p 指向的每个元素是 int因此采取大小为 sizeof(int) 的步长在内存中而不是内存中大小为 1 的步长。换句话说,代码被解释为

Start at the location pointed at by p.
Jump forward i * sizeof(int) bytes.
Read an integer value from that location.
Subtract 32 from it.
Write it back

而不是

Start at the location pointed at by p.
Find the character i steps down from there.
Subtract 32 from that character.

要解决此问题,请更改 p 的类型成为char* ,不是int* .

如果您将编译器警告级别调到最大,很可能会很容易检测到这种错误。我强烈建议您在学习编码时这样做,然后在您不理解警告时询问有关警告的问题。

其他一些杂记:

  1. main的返回类型应该是int ,不是void .
  2. 考虑使用 tolower ,而不是从每个字符中减去 32(虽然可行,但不是单词中最清晰的东西)。函数来自 <ctype.h> header 。
  3. 如果您要搜索的子字符串仅包含非字母字符(例如 ":-)" ),则此代码可能会导致无限循环。你明白为什么吗?想想如何解决它。

关于将单词的所有副本大写 : why does this code fail when it's in its own function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41769472/

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