我想从C中的字符串中删除最后四个字符。 例如:name =“Photo1.jpg”,我想删除最后四个字符(.jpg)。有人可以帮我写一个功能。
答案 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>通常位于只读内存中;尝试修改字符串文字会导致未定义的行为。