在C中的某个字符后删除字符串的结尾

时间:2015-03-28 23:24:40

标签: c string

我正在尝试在C中的某个字符后结束我的字符串。此程序将与文件系统一起使用,因此字符将重复,我需要找到该字符的最后一次出现,然后删除所有内容。< / p>

我从互联网上找到了一些东西,但这不起作用,我不知道为什么。

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

void deleteEnd (char* myStr){

    printf ("%s\n", myStr);
    char *del = &myStr[strlen(myStr)];

    while (del > myStr && *del != '/')
        del--;

    if (*del== '/')
        *del= '\0'; // the program crashes here

    return;
}

int main ( void )
{

    char* foo= "/one/two/three/two";
    deleteEnd(foo);
    printf ("%s\n", foo);

    return 0;
}

此代码基本上找到最后一个'/'字符并将null终止符放在那里。它在理论上有效但不实际。

顺便说一句,如果我的方式有问题,有没有更好的方法呢?

谢谢。

**编辑:我根据建议用“strrchr()”替换了我的代码,但仍然没有结果:

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

void deleteEnd (char* myStr){

    char *lastslash;

    if (lastslash = strrchr(myStr, '/'))
        *lastslash = '\0'; // the code still crashes here.

    return;
}

int main ( void )
{

    char* foo= "/one/two/three/two";
    deleteEnd(foo);
    printf ("%s\n", foo);

    return 0;
}

6 个答案:

答案 0 :(得分:2)

在C中,当你写这样的文字字符串时: char * foo =&#34; / one / two / three / two&#34 ;;

这些是不可变的,这意味着它们嵌入在可执行文件中并且是只读的。

尝试修改只读数据时会出现访问冲突(崩溃)。

相反,您可以将字符串声明为字符数组而不是文字字符串。

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

void deleteEnd (char* myStr){

    printf ("%s\n", myStr);
    char *del = &myStr[strlen(myStr)];

    while (del > myStr && *del != '/')
        del--;

    if (*del== '/')
        *del= '\0';

    return;
}

int main ( void )
{

    char foo[] = "/one/two/three/two";
    deleteEnd(foo);
    printf ("%s\n", foo);

    return 0;
}

答案 1 :(得分:1)

yeschar * lastslash;

if (lastslash = strrchr(myStr, '/'))
    *lastslash = '\0'; // the code still crashes here.

return;

}

int main(void) {

char foo[]= "/one/two/three/two";
deleteEnd(foo);
printf ("%s\n", foo);

答案 2 :(得分:0)

  1. 从第一个角色开始。
  2. 扫描当前字符,是吗?没有?转到第3步。是吗?转到第4步。
  3. 还有其他角色吗?没有?转到第5步。是吗?转到下一个字符,然后转到第2步。
  4. 设置&#34; lastSlash&#34;变量到当前字符位置。转到第2步。
  5. 删除lastSlash位置后的所有内容。你完成了!

答案 3 :(得分:0)

只需将foo声明为字符数组,而不是指向char的指针:

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

void deleteEnd (char* myStr){

    char *lastslash;

    if (lastslash = strrchr(myStr, '/'))
        *lastslash = '\0'; // the code still crashes here.

    return;
}

int main ( void )
{

    char foo[]= "/one/two/three/two";
    deleteEnd(foo);
    printf ("%s\n", foo);

    return 0;
}

答案 4 :(得分:0)

您无法更改字符串常量,您必须复制到新的字符串。

#include <iostream>
#include <cstring>

void delete_end(char* dest, const char* source)
{
    const char* p = source + strlen(source) - 1;
    while(*p != '/' && p > source)
        --p;
    strncpy(dest, source, p - source);
    dest[p-source] = '\0';
}

int main()
{

    const char* str = "one/two/three/four";
    char buf[256];
    delete_end(buf, str);
    std::cout << buf << std::endl;

    return 0;
}

答案 5 :(得分:0)

要查找C中字符串中最后一个字符,请使用strrchr(3)函数。它的原型位于&lt; string.h&gt;