我不介意编写自己的函数来执行此操作,但我想知道string.h中是否存在一个函数,或者是否有标准的方法来执行此操作。
char *string = "This is a string";
strcut(string, 4, 7);
printf("%s", string); // 'This a string'
谢谢!
答案 0 :(得分:7)
使用memmove移动尾部,然后将'\ 0'放在新的结束位置。注意不要使用memcpy - 在这种情况下它的行为是未定义的,因为源和目标通常会重叠。
答案 1 :(得分:4)
您可以告诉printf为您剪掉有趣的部分:
char *string = "This is a string";
printf("%.*s%s", 4, string, &string[7]); // 'This a string'
: - )
答案 2 :(得分:1)
如果您正在谈论摆脱字符串的中间位置并将其余部分移到原处,那么我认为它没有标准的库函数。
最好的方法是找到字符串的结尾,然后执行将所有字符移动到新位置的O(cut_size)循环。事实上,有一个类似的常见面试问题。
由于目标缓冲区与源重叠,因此必须小心使用内存复制等内容。
答案 3 :(得分:0)
您可以完成所需的操作,并避免使用strncpy和strcat的组合编写新函数:
#include <stdio.h>
#include <string.h>
int main(void)
{
char newStr[10];
char origStr[] = "This is a string";
strncpy(newStr, origStr, 4);
strcat(newStr, &origStr[7]);
printf("newStr = %s\n", newStr);
return(0);
}
对我来说,这是在Windows XP上使用Borland的免费命令行编译器输出“This a string”(引用我的)。您可以在http://opengroup.org/onlinepubs/007908799/xsh/string.h.html
查看string.h答案 4 :(得分:0)
我已经在https://stackoverflow.com/a/42283266/6003870找到了类似问题的答案。它适用于常见操作,主要基于C标准库中的函数 strncpy()。 但是这个问题可以通过函数 memmove()来解决,如死亡用户@sharptooth所述。
函数 str_slice_in_place()使用 memmove()作为基础并支持正索引。
int
str_slice_in_place(char str[], const int index_from, const int index_to)
{
// a support for only positive indexes
if (index_from < 0 || index_to < 0)
return -1;
int len = index_to - index_from;
// "index_from" is more than "index_to"
if (len < 0)
return -1;
memmove(str, str + index_from, len);
str[len] = '\0';
return 0;
}
我还会向您展示函数 main()的代码以及如何使用此函数的示例。
#include <stdio.h>
#include <string.h>
int
main()
{
char line[] = "--------------------------------------";
char str1[] = "Remember a good";
char str2[] = "Remember a good";
char str3[] = "Remember a good";
char str4[] = "Remember a good";
printf("| Original | Slice | Result \n%s\n", line);
printf("| %s | ", str1);
str_slice_in_place(str1, 0, 8);
printf("(%d, %d) | %s\n", 0, 8, str1);
printf("| %s | ", str2);
str_slice_in_place(str2, 3, 9);
printf("(%d, %d) | %s\n", 3, 9, str2);
printf("| %s | ", str3);
str_slice_in_place(str3, 0, 1);
printf("(%d, %d) | %s\n", 0, 1, str3);
printf("| %s | ", str4);
str_slice_in_place(str4, 1, 1);
printf("(%d, %d) | %s\n", 1, 1, str4);
puts(line);
return 0;
}
| Original | Slice | Result
--------------------------------------
| Remember a good | (0, 8) | Remember
| Remember a good | (3, 9) | ember
| Remember a good | (0, 1) | R
| Remember a good | (1, 1) |
--------------------------------------
$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description: Debian GNU/Linux 8.6 (jessie)
Release: 8.6
Codename: jessie
$ uname -a
Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
答案 5 :(得分:-1)
如果你在C中这样做并且知道偏移,那么它很简单。
char string[] = "my string";
char *substring;
substring = &string[2];
printf("%s", substring);
编辑:如果你想转换字符串。
char string[] = "my string";
int i = 0;
int offset = 2;
for( i = 0; string[i+offset] != '\0'; i++ ) {
string[i] = string[i + offset];
}
string[i] = '\0';