- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在我的一项练习中,我要求用户在计算机中插入文件地址,例如 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/
我正在尝试开发右边框/Angular 具有特定 Angular (30°) 的表格。我见过一些类似的解决方案,但它们都无法在一定程度上发挥作用。如果我想从 30° 改变到 20°,我不想花太多力气。
我是一名优秀的程序员,十分优秀!