Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 断开管柱段_C_String_Pointers - Fatal编程技术网

C 断开管柱段

C 断开管柱段,c,string,pointers,C,String,Pointers,我不介意编写自己的函数来实现这一点,但我想知道字符串.h中是否存在一个函数,或者是否有一种标准方法来实现这一点 char *string = "This is a string"; strcut(string, 4, 7); printf("%s", string); // 'This a string' 谢谢 如果你在C中这样做,并且知道偏移量,那么它就相当简单了 char string[] = "my string"; char *substring; substring = &

我不介意编写自己的函数来实现这一点,但我想知道字符串.h中是否存在一个函数,或者是否有一种标准方法来实现这一点

char *string = "This is a string";

strcut(string, 4, 7);

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

谢谢

如果你在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';

如果你说的是去掉字符串的中间部分,然后将其余部分移到适当的位置,那么我认为没有标准的库函数

最好的方法是找到字符串的结尾,然后执行一个O(剪切大小)循环,将所有字符移动到新位置。事实上,有一个类似的常见面试问题


由于目标缓冲区与源缓冲区重叠,因此在使用内存复制之类的东西时必须小心

使用memmove移动尾部,然后将“\0”置于新的结束位置。注意不要使用memcpy-在这种情况下,它的行为是未定义的,因为源和目标通常是重叠的。

您可以告诉我们为您删掉感兴趣的部分:

char *string = "This is a string";
printf("%.*s%s", 4, string, &string[7]); // 'This a string'

:-)

您可以完成您想要的,并且避免使用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);
}
#包括
#包括
内部主(空)
{
char newStr[10];
char origStr[]=“这是一个字符串”;
strncpy(newStr,origStr,4);
strcat(newStr和origStr[7]);
printf(“newStr=%s\n”,newStr);
返回(0);
}

对我来说,这将使用Borland在WindowsXP上的免费命令行编译器输出“thisastring”(引用我的)。您可以在以下位置查看string.h:

我已经在那里为类似的问题编写了答案。它适用于常见操作,主要基于C标准库中的函数strncpy()。 但是这个问题可以通过死用户@sharptooth提到的函数memmove()来解决

函数str\u slice\u in\u 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;
}

测试环境
我认为他希望删除字符串中间的部分,并将其余部分移到较早的偏移量。很抱歉,遗漏了这一点,似乎您只是想打印一个子字符串。只需允许memmove()移动额外的字节,0-terminatorBetter write char string[]=“这是一个字符串”;因为不允许您修改字符串文字。。。。然后将其转换为一个新变量:-)
#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