C函数删除字符串

C function to remove string

在几周内参加深入的 Objective-C 课程之前,这里的初学者试图围绕一些基本的 C 知识,所以如果这是行人,我深表歉意..

任务是创建一个接受三个参数的函数:一个源字符串、一个从该字符串开始删除的整数,以及另一个告诉函数要删除多少字符的整数。书中给出的示例是起始字符串 "the wrong son" 然后是 4 和 6,只剩下 "the son".

我的想法是根据第一个单词和第二个单词创建两个单独的字符串,然后将它们连接在一起。到目前为止,我只能提取 "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);
}

我很困惑。任何帮助将不胜感激。

恕我直言,为此目的创建单独的数组并不是最好的方法。相反,一个更好更清洁的方法是

  1. 接收数组,开始索引并跳过索引值。
  2. 使用strlen()计算数组的长度。
  3. 将(start index+skip index)位置的值放到start index位置。
  4. 起始索引增加1。
  5. 继续第3步和第4步,直到数组长度用完,即最新的(start index+skip index)个点到数组中的最后一个元素。

这个函数

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);
}

有两个重要的问题,

  1. 您没有为 s2s3 分配足够的 space。

  2. 你从不初始化ij

试试这个

void removeString (char *source, int offset, int length)
{
    int    i;   
    size_t source_length;
    if (source == NULL)
        return;
    source_length = strlen(source);
    if ((offset >= source_length) || (source_length - offset < length))
        return;
    printf("source = %s, offset = %d, length = %d\n", source, offset, length);
    for (i = 0 ; i < offset ; ++i)
        result[i] = source[i];    
    for (j = 0 ; source[j + offset] != '[=11=]' ; ++i)
       result[j] = source[j + offset];  
    printf("s2 = %s\n", result);
}

这是一个更简单的实现:

#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;
}

在 C 中,字符串不是对象,它们只是内存中的字符数组。

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

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);
}