从最后删除一定数量的char

时间:2016-05-06 09:07:10

标签: c

在我的一个练习中,我要求用户在计算机中插入一个文件地址,如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;
  }
}

2 个答案:

答案 0 :(得分:1)

To"删除" C字符串的一部分,您需要做的就是将要保留的最后一个字符设置为0。 (我说"删除"(引用)这里,因为你实际上没有从内存中删除任何东西;'字符串'变短但分配给它的内存量保持不变,0以外的所有内容仍然可用。)

有一个标准的string.h函数可以找到某个字符的最后一个匹配项:strrchr。这会返回一个

  

[p]找到str中找到的字符的ointer,如果没有找到这样的字符则为空指针

所以要找到最后一个反斜杠并删掉它背后的内容,你可以使用

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和相关字符串函数)的原因无法知道是否有足够的&#39;剩下的空间是因为简单的C字符串不能在任何地方存储可用的最大长度。

答案 1 :(得分:0)

如果文件名小于新名称,则重写文件名可能会导致问题。即用户选择了C:\a.txt,您想将其重命名为C:\tmp.txt。这将导致错误,因为将超出数组绑定。因此,您必须创建一个新数组。下面的代码有效,但看起来并不是很好。由于您不熟悉字符串函数,我认为这可能是最好的方法。但我强烈建议您查看这些提供的函数,以减少编写代码的数量并提高可读性。

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[]) {
    char* p = "C:\\a.txt";
    int x; // this will hold the position of the last backslash
    int i;
    for(i = 0; p[i] != '\0'; i++){
        if(p[i] == '\\') {
            x = i;
        }
    }
    char pp[x+9];
    pp[x+8] = '\0';
    for(i = 0; i <= x; i++){
        pp[i] = p[i]; 
    }
    pp[i+0] = 't';
    pp[i+1] = 'm';
    pp[i+2] = 'p';
    pp[i+3] = '.';
    pp[i+4] = 't';
    pp[i+5] = 'x';
    pp[i+6] = 't';

    printf("%s -> %s\n", p, pp);
    return (0);
}

修改

不是手动执行每个操作,而是可以使用内置的library functions。使用这些将使代码更短,更容易理解。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int argc, char *argv[]) {
    char* p = "C:\\a.txt"; // the path
    char* t = "tmp.txt"; // the new name of the file
    char* e = strchr(p, '\\'); // returns a pointer to the last occurence of the backslash within the string p
    int i = (int)(e-p); // i contains the index position of the last occurence of the backslash
    char n[i+1+strlen(t)]; // create a string with max size i + 1 + length of t
    strncpy(n, p, i+1);// copy the first (i+1) characters of p to n 
    strncpy(&n[i+1], t, strlen(t)+1); // copy the whole string t and \0 to the end of the new path   
    printf("%s -> %s\n", p, n);
    return (0);
}