2015-04-21 3 views
1

новичка Всего здесь пытаюсь обернуть мою голову вокруг некоторых базовых знаний C, прежде чем принимать углубленный курс Objective-C в течение нескольких недель, так что я прошу прощение, если это пешеход ..функции C, чтобы удалить строку

Назначение заключается в создании функции, которая принимает три аргумента: исходную строку, целое число для начала удаления из этой строки и другое целое число, которое сообщает функции, сколько символов нужно удалить. Примером, приведенным в книге, является стартовая строка «неправильный сын», а затем 4 и 6, оставляя только «сына».

Мое мышление состоит в том, чтобы создать две отдельные строки на основе первого слова и второго, затем объединить их вместе. Пока что я могу извлечь «the», а мой второй цикл, по-видимому, ничего не делает. Это то, что у меня есть до сих пор:

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

Я правильно смущен. Любая помощь приветствуется.

+2

Вам необходимо инициализировать 'i' и' 'j' как INT I; for (i = ...; i pzaenger

+0

Пожалуйста, используйте описательные имена для переменных, ваш код трудно понять. –

+2

Вы не делаете 's2' и' s3' достаточно большими. Когда вы не укажете размер массива и инициализируете его строкой, он делает его достаточно большим, чтобы удерживать эту строку. Итак, 'char s2 [] =" ";' равнозначно 'char s2 [1] =" ";' – Barmar

ответ

0

Вот проще реализация:

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

Спасибо, ребята, очень благодарны за все ответы –

+0

Нет проблем. Примите мой ответ. –

2

Создание отдельных массивов для этой цели - не лучший подход, ИМХО. Вместо этого лучше всего подходит более чистый подход:

  1. Получите массив, начните индексировать и пропустите значения индекса.
  2. вычислить длину массива с помощью strlen().
  3. поместить значение в (индекс старта + индекса пропуска) местоположения до индекса запуска местонахождения.
  4. прирост индекса начало на 1.
  5. продолжают шаг 3 и 4, пока длина массива не закончится, то есть последняя (начальный индекс + пропустить индекс) указывает на последний элемент в массив.
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. Вы не выделить достаточно места для s2 или s3.

  2. Вы никогда не инициализируете i или j.

Попробуйте вместо

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

В 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; 
} 
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); 
} 
Смежные вопросы