从C中的字符串中删除最后四个字符

时间:2014-12-11 03:05:06

标签: c string

我想从C中的字符串中删除最后四个字符。 例如:name =“Photo1.jpg”,我想删除最后四个字符(.jpg)。有人可以帮我写一个功能。

5 个答案:

答案 0 :(得分:4)

由于C字符串以第一个空字符结尾,您可以简单地在length-4位置放置一个空字符来截断它。

size_t len = strlen(string);
if (len >= 4) {
    string[len-4] = 0;
}

答案 1 :(得分:1)

char* removeLastN(char* str, size_t n ) {
    size_t strLen = strlen(str);
    str[n <= strLen ? strLen-n : 0] = '\0';
    return str;
}

如果字符串足够长以至于包含那么多字节,则上面的函数将从字符串的末尾删除给定的字节数n。如果它包含等于或小于n个字节,则该函数将删除字符串中的所有字节,并将其留空。

这是一个演示,演示如何从字符串末尾删除4个字节:

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

char* removeLastN(char* str, size_t n );

int main(void) {
    char str[32] = "Photo1.jpg";
    printf("\"%s\"\n", removeLastN(str,4) );
    return 0;
}

char* removeLastN(char* str, size_t n ) {
    size_t strLen = strlen(str);
    str[n <= strLen ? strLen-n : 0] = '\0';
    return str;
}

答案 2 :(得分:0)

如果您不想丢失原始字符串,则必须创建一个新字符串:

char* cut_four (char* s){
    int n;
    int i;
    char* new;
    for (i = 0; s[i] != '\0'; i++);
    // lenght of the new string
    n = i - 4 + 1;
    if (n < 1)
        return NULL;
    new = (char*) malloc (n * sizeof(char));
    for (i = 0; i < n - 1; i++)
        new[i] = s[i];
    new[i] = '\0';
    return new;
}

答案 3 :(得分:0)

如果要复制原始字符串,不使用最后四个字符,可以使用strndup。它是POSIX 2008的一部分,可能无法在您的系统上使用。

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

int main(void)
{
    char fullname[] = "Photo1.jpg";
    char *name;
    size_t len;

    len = strlen(fullname);
    // strndup returns a pointer to an array that it created
    name = strndup(fullname, len >= 4 ? len - 4 : 0);
    printf("%s\n", name);  // prints "Photo1"
    return 0;
}

答案 4 :(得分:-1)

请记住,C中的字符串是一个字符数组,以NUL字节结束。

你可以简单地&#34;切断&#34;通过用'\0'替换要删除的第一个字符来结束字符串。

示例:

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

void trim_end(char *str, int n)
{
    n = strlen(str) - n;

    if (n < 0)
        n = 0;

    str[n] = '\0';
}

int main(void)
{
    char name[] = "Photo1.jpg";

    printf("Before: name = \"%s\"\n", name);

    trim_end(name, 4);

    printf("After: name = \"%s\"\n", name);

    trim_end(name, 4);

    printf("After: name = \"%s\"\n", name);

    trim_end(name, 4);

    printf("After: name = \"%s\"\n", name);


    return 0;
}

<强>输出:

$ ./a.out 
Before: name = "Photo1.jpg"
After: name = "Photo1"
After: name = "Ph"
After: name = ""

请注意,name此处为char [],而非char *。前者是一个数组(它位于main的堆栈上,已经初始化到&#34; Photo1.jpg&#34;。后者是一个字符串 literal < / em>通常位于只读内存中;尝试修改字符串文字会导致未定义的行为。