切出一段字符串

时间:2009-02-12 04:53:01

标签: c string pointers

我不介意编写自己的函数来执行此操作,但我想知道string.h中是否存在一个函数,或者是否有标准的方法来执行此操作。

char *string = "This is a string";

strcut(string, 4, 7);

printf("%s", string); // 'This a string'

谢谢!

6 个答案:

答案 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';