Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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_Arrays_String_Char - Fatal编程技术网

C函数删除字符串

C函数删除字符串,c,arrays,string,char,C,Arrays,String,Char,在几周内参加一个深入的Objective-C课程之前,这里的初学者正在努力学习一些基本的C语言知识,所以如果这是一个普通的问题,我很抱歉 赋值是创建一个包含三个参数的函数:一个源字符串,一个从该字符串开始删除的整数,以及另一个告诉函数要删除多少个字符的整数。书中给出的例子是起始字符串“TheErrorSon”,然后是4和6,只留下“TheSon” 我的想法是基于第一个单词和第二个单词创建两个单独的字符串,然后将它们连接在一起。到目前为止,我只能提取“the”,而我的第二个for循环显然什么也没做

在几周内参加一个深入的Objective-C课程之前,这里的初学者正在努力学习一些基本的C语言知识,所以如果这是一个普通的问题,我很抱歉

赋值是创建一个包含三个参数的函数:一个源字符串,一个从该字符串开始删除的整数,以及另一个告诉函数要删除多少个字符的整数。书中给出的例子是起始字符串“TheErrorSon”,然后是4和6,只留下“TheSon”

我的想法是基于第一个单词和第二个单词创建两个单独的字符串,然后将它们连接在一起。到目前为止,我只能提取“the”,而我的第二个for循环显然什么也没做。这就是我到目前为止所做的:

#include<stdio.h>

int main (void)
{
    char text[]="the wrong son";
    void removeString (char[], int, int);
    int s, l;

    printf("Enter starting point for removal: ");
    scanf("%d",&s);

    printf("\nEnter lenght of removal: ");
    scanf("%d",&l);

    removeString(text, s, l);

    printf("\nString after removal = %s",text);

    return 0;
}

void removeString (char s1[], int s, int l)
{

    printf("s1 = %s, s=%d, l=%d\n", s1, s, l);

    char s2[]="";
    char s3[]="";

    int i,j;

    for (; i<s; ++i)
        {
            s2[i]=s1[i];
        }

    printf("\n");

    for (; j>l; ++j)
        {
            s3[j]=s1[j];
        }

    printf("s2 = %s, s3 = %s", s2, s3);
}
#包括
内部主(空)
{
char text[]=“错误的儿子”;
无效再投资(字符[],整数,整数);
int s,l;
printf(“输入删除的起始点:”);
scanf(“%d”和“&s”);
printf(“\n输入删除长度:”);
scanf(“%d”和“&l”);
再投资(文本、s、l);
printf(“\n删除后字符串=%s”,文本);
返回0;
}
无效重新投资(字符s1[],整数s,整数l)
{
printf(“s1=%s,s=%d,l=%d\n”,s1,s,l);
字符s2[]=“”;
字符s3[]=“”;
int i,j;
对于(;il;++j)
{
s3[j]=s1[j];
}
printf(“s2=%s,s3=%s”,s2,s3);
}

我完全糊涂了。任何帮助都将不胜感激。

为此目的创建单独的阵列不是最好的方法,IMHO。相反,一个更好更干净的方法将是

  • 接收数组、开始索引和跳过索引值
  • 使用
    strlen()
    计算数组的长度
  • 将值放在(开始索引+跳过索引)位置以开始索引位置
  • 将开始索引增加1
  • 继续第3步和第4步,直到数组长度用完,即最新的(开始索引+跳过索引)指向数组中的最后一个元素
  • 此函数

    void removeString (char s1[], int s, int l)
    {
    
    printf("s1 = %s, s=%d, l=%d\n", s1, s, l);
    
    char s2[]="";
    char s3[]="";
    
    int i,j;
    
    for (; i<s; ++i)
    {
        s2[i]=s1[i];
    }
    
    printf("\n");
    
    for (; j>l; ++j)
    {
        s3[j]=s1[j];
    }
    
    printf("s2 = %s, s3 = %s", s2, s3);
    }
    

    下面是一个更简单的实现:

    #include <stdio.h>
    #include <string.h>
    
    void removeString (char text[], int start, int length) {
      int n = strlen(text), i;
      for (i = start+length; i <= n; i++) {
        text[i-length] = text[i];
      }
    }
    
    
    int main (void) {
      char text[] = "the wrong son";
      int start, length;
      printf("Original text: \"%s\"\n", text);
    
      printf("Enter starting point for deletion: ");
      scanf("%d", &start);
      printf("\nEnter number of characters to delete: ");
      scanf("%d", &length);
    
      removeString(text, start, length);
      printf("After deletion: \"%s\"\n", text);
    
      return 0;
    }
    
    #包括
    #包括
    无效重新投资(字符文本[],整数开始,整数长度){
    int n=strlen(文本),i;
    
    对于C中的(i=start+length;i),字符串不是对象,它们只是内存中的字符数组

    在您的情况下,删除字符串的一部分可以通过简单的内存移动来完成:

    void removeString (char string[], int start, int length)
    {
        int from = start + length;
    
        // You should do some verifications here, like start < string length, etc. 
        while (string[from] != 0)
            string[start++] = string[from++];
        string[start] = 0;
    }
    
    void重新投资(字符字符串[],整数开始,整数长度)
    {
    int from=开始+长度;
    //您应该在这里进行一些验证,比如开始<字符串长度,等等。
    while(字符串[from]!=0)
    string[start++]=string[from++];
    字符串[开始]=0;
    }
    
    //这将在位编辑字符串s1
    无效重新投资(字符*s1,整数s,整数l)
    {
    int len=strlen(s1);
    //如果起始位置超出字符串末尾,或无需删除,则中止
    如果(s>=len | l<1)
    返回;
    //在位置s处终止原始字符串
    s1[s]=0;
    //如果s+l超出字符串末尾,则结束
    如果(s+l>=len)
    返回;
    //否则,在第1部分停止
    strcat(s1,s1+s+l);
    }
    
    您需要初始化
    i
    j
    inti;for(i=…;i
    。请对变量使用描述性名称,因为您的代码很难理解。您没有将
    s2
    s3
    设置得足够大。如果您没有指定数组的大小,并用字符串初始化数组,则数组的大小刚好可以容纳该字符串。因此
    char s2[]=”;
    相当于
    char s2[1]=”
    谢谢各位,非常感谢各位的回复
    void removeString (char string[], int start, int length)
    {
        int from = start + length;
    
        // You should do some verifications here, like start < string length, etc. 
        while (string[from] != 0)
            string[start++] = string[from++];
        string[start] = 0;
    }
    
    // This will edit string s1 in place
    void removeString(char *s1, int s, int l)
    {
      int len = strlen(s1);
      // Abort if start pos beyond end of string, or nothing to remove
      if (s >= len || l < 1)
        return;
      // Terminate original string at pos s
      s1[s] = 0;
      // Finished if s+l beyond end of string
      if (s+l >= len)
        return;
      // Otherwise concat rest to 1st part
      strcat(s1, s1+s+l);
    }