gpt4 book ai didi

c - 从末尾删除一定数量的字符

转载 作者:行者123 更新时间:2023-11-30 21:01:05 26 4
gpt4 key购买 nike

在我的一项练习中,我要求用户在计算机中插入文件地址,例如 C:\Users\Rony\Desktop\file.txt 来进行一些更改。我把这个地址保存在一个字符串中。因此,为了进行更改,我想将此字符串更改为 tmp.txt,因此地址现在为 C:\Users\Rony\Desktop\tmp.txt。事实上,因为计算机之间的地址不同,我想删除从末尾到第一个\的所有字符并添加到此 tmp.txt 中。但我不知道为什么我的代码不起作用谢谢你

for (i = strlen(adress1); i > 0; i--)
{
if (adress1[i] == "\\")
{
adress[i] = 0;
break;
}
}

最佳答案

要“删除”C 字符串的一部分,您只需将要保留的最后一个字符后面的字符设置为 0。 (我在这里说“删除”(引用)是因为您实际上并没有从内存中删除任何内容;“字符串”变短,但为其分配的内存量保持不变,并且 0 之外的所有内容 仍然可用。)

有一个标准的string.h函数来定位某个字符的最后一次出现:strrchr 。这将返回一个

[p]ointer to the found character in str, or null pointer if no such character is found

因此,要找到最后一个反斜杠并删除其后面的内容,您可以使用

char *ptr;
ptr = strrchr (address1, '\\');
if (ptr) ptr[1] = 0;

注意显式测试,看看 ptr 是否确实找到了反斜杠。

现在您实际上并不想想要丢弃反斜杠之后的所有内容,您想在其中复制一些新内容。为此,您不需要先缩短它,然后(大概)使用 strcat,您可以立即使用 strcpy:

ptr = strrchr (address1, '\\');
if (ptr)
strcpy (ptr+1, "tmp.txt");
else
strcpy (address1, "tmp.txt");

就我个人而言,我通常写为

ptr = strrchr (address1, '\\');
if (ptr) ptr++; else ptr = address1;
strcpy (ptr, "tmp.txt");

请注意,两者都使用ptr+1,因为ptr本身指向“at”反斜杠;并且您想保留它。

使用这样的字符串连接存在一个固有的危险:如果最后一个反斜杠后面的部分比新插入的字符串短,则可以覆盖该字符串后面的数据。这完全取决于您最初如何创建address1。一个非常脏的修复是显式测试address1当前内容是否有足够的剩余空间:

char *to_add = "tmp.txt";
ptr = strrchr (address1, '\\');
if (ptr && strlen(ptr+1) <= strlen(to_add) )
strcpy (ptr+1, to_add);
else
printf ("too long, ignored\n");

(我添加它只是为了完整性;您可能不应该在生产代码中使用它。)

strcpy(和strcat,以及相关的字符串函数)无法知道是否还有“足够”的剩余空间的原因是,简单的 C 字符串不存储可用的空间。任何地方的最大长度。

关于c - 从末尾删除一定数量的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37068423/

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