【问题标题】:C function to remove stringC函数删除字符串
【发布时间】:2015-04-21 21:08:48
【问题描述】:

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

分配是创建一个函数,该函数接受三个参数:一个源字符串,一个从该字符串开始删除的整数,以及另一个告诉函数要删除多少个字符的整数。书中给出的示例是起始字符串“错误的儿子”,然后是 4 和 6,只留下“儿子”。

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

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

【问题讨论】:

  • 你需要像int i; for (i = ...; i &lt; s; ++i) {...}一样初始化ij
  • 请为变量使用描述性名称,您的代码很难理解。
  • 你的 s2s3 不够大。当您不指定数组的大小并使用字符串对其进行初始化时,它会使其大到足以容纳该字符串。所以char s2[] = ""; 等价于char s2[1] = "";

标签: c arrays string char


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      这是一个更简单的实现:

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

      【讨论】:

      • 谢谢大家,非常感谢所有回复
      【解决方案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);
      }
      

      有两个重要的问题,

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

      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] != '\0' ; ++i)
             result[j] = source[j + offset];  
          printf("s2 = %s\n", result);
      }
      

      【讨论】:

        【解决方案5】:
        // 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);
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-09-30
          • 2016-07-04
          • 2019-05-29
          • 2016-09-30
          • 2015-02-02
          • 1970-01-01
          • 1970-01-01
          • 2022-01-09
          相关资源
          最近更新 更多