gpt4 book ai didi

c - 如何在包含句点的同时将较长字符串中的句子复制到新数组中?

转载 作者:行者123 更新时间:2023-12-04 16:30:00 26 4
gpt4 key购买 nike

我想将字符串的一部分保存到一个新的字符数组中,同时包含句点。例如,字符串是:

My name is John. I have 1 dog.

我想将每个字符复制到并包括第一个句点,因此新的字符数组将包含:
My name is John.

我在下面写的代码只复制了“我的名字是约翰”,但省略了句点。
ptrBeg 和 ptrEnd 分别指向我要复制的部分的开头和结尾的字符。我的意图是通过指向 newBuf 的指针将 ptrBeg 复制到数组 newBuf 中,然后递增 ptrBeg 和指向数组的指针,直到 ptrBeg 和 ptrEnd 指向相同的字符,这应该始终是一个句点。

此时,应该复制字符串的文本,因此我再次增加指向 char 数组的指针,并使用以下命令将句点复制到新空间
++ptrnewBuf;
*ptrnewBuf = *ptrEnd";

最后,我打印了 newBuf 的内容。
这是总代码:
int main()
{
char buf[] = "My name is John. I have 1 dog.";
char * ptrBuf;
char * ptrBeg;
char * ptrEnd;
ptrBeg = buf;
ptrBuf = ptrBeg;
while (*ptrBuf != '.'){
ptrBuf++;
}

ptrEnd = ptrBuf;

char newBuf[100];
char * ptrnewBuf = newBuf;

while(*ptrBeg != *ptrEnd){
*ptrnewBuf = *ptrBeg;
ptrnewBuf++;
ptrBeg++;
}
++ptrnewBuf;
*ptrnewBuf = *ptrEnd;
printf("%s", newBuf);
}

我将如何修改此代码以包含句点?

最佳答案

您走在正确的轨道上,但您可能使事情变得比需要的更复杂,并且忽略了一些关键检查。通过指针或使用指针算术进行迭代的关键是在每次迭代或算术运算期间始终验证和保护您的数组或内存边界。

另一个提示是,在对所有内容进行编码之前,始终在一张纸上绘制指针位置,这样您就可以清楚地了解迭代限制和需要进行的任何调整。 (您不必使用完整的长字符串和许多框,只需使用少量字符表示需要完成的操作)在您希望通过第一个 '.' 复制子代码的情况下,简单的像以下将做,例如

+---+---+---+---+---+---+
| A | . | | B | . |\0 |
+---+---+---+---+---+---+
^ ^
| pointer (when *p == '.')
buf

因此,要将 "A."buf 复制到 new 缓冲区,您不能简单地迭代 while (*p != '.') ,否则您将不会复制 '.' 。通过绘制它,您可以清楚地看到您还需要在 p == '.' 时复制该字符,例如
+---+---+---+---+---+---+
| A | . | | B | . |\0 |
+---+---+---+---+---+---+
^ ^
| |-->| pointer (p + 1)
buf

现在不管 '.' 之前字符串的实际长度如何,您现在知道需要 p + 1 作为最终地址以包含副本中的最后一个字符。

您还知道 new 缓冲区可以存储多少个字符。假设 new 的大小是 MAXC 字符(最大字符数)。因此,您最多可以存储 MAXC-1 字符(加上空字符)的字符串。当您填写 new 时,您需要始终验证您是否在 MAXC-1 字符内。

您还需要确保新字符串以空字符结尾(或者它不是字符串,它只是一个字符数组)。确保空终止的一种有效方法是在声明时将 new 中的所有字符初始化为 0,例如
char new[MAXC] = "";

默认情况下,将第一个字符初始化为 0(例如 '\0' 空字符串)和所有剩余的字符 0。现在,如果您填充的字符数不超过 MAXC-1 字符,则可以保证该数组将是一个以空字符结尾的字符串。

总而言之,您可以执行以下操作:
#include <stdio.h>

#define MAXC 128 /* if you need a constant, #define one (or more) */

int main (void) {

char buf[] = "My name is John. I have 1 dog.",
*p = buf, /* pointer to buf */
new[MAXC] = "", /* buffer for substring */
*n = new; /* pointer to new */
size_t ndx = 0; /* index for new */

/* loop copying each char until new full, '.' copied, or end of buf */
for (; ndx + 1 < MAXC && *p; p++, n++, ndx++) {
*n = *p; /* copy char from buf to new */
if (*n == '.') /* if char was '.' break */
break;
}

printf ("buf: %s\nnew: %s\n", buf, new);

return 0;
}

( 注意: ndx 作为 for 循环的一部分递增以跟踪使用指针复制的字符数)

示例使用/输出
$ ./bin/str_cpy_substr
buf: My name is John. I have 1 dog.
new: My name is John.

如果您没有足够的时间初始化字符串以确保空终止,则您可以在复制完成后始终肯定地空终止。例如,您可以在 for 循环退出后添加以下内容,以确保正确终止未知初始化数组:
    *++n = 0;   /* nul-terminate (if not already done by initialization) and
* note ++n applied before * due to C operator precedence.
*/

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 如何在包含句点的同时将较长字符串中的句子复制到新数组中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50866706/

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