2015-05-07 3 views
-1

У меня проблема с удалением символов из строки. Я смог идентифицировать символы, чтобы удалить и сохранить их как новую строку, но мне нужен код, который позволяет мне удалить символы новой строки из исходной строки (где я помечен как xxxxxxxx).Удалить символы из строки в C

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char input[120], to_del[120], new_input[120]; 
int a,b; 


void removeString(); 

int main(void) 
{ 
    printf("\nEnter your sentence: "); 
    gets(input); 

    printf("\nWhere to start: "); 
    scanf("%d",&a); 
    printf("\nHow many characters to delete: "); 
    scanf("%d",&b); 

    removeString(); 

    printf("\nNew sentence: %s\n",new_input); 

    return ; 
} 

void removeString() 
{ 
    memcpy(to_del, &input[a-1], b); 
    new_input [strlen(input)-b] =xxxxxxxx; 
    return ; 
} 

ответ

0

EDIT в ответ на комментарий @SouravGhosh, о перекрывающихся строках. Сначала я скопирую строку в new_input, а затем скопирую правую часть обратно в input, чтобы перезаписать раздел, который необходимо удалить.

int len = strlen(input); 
strcpy(new_input, input); 
if (a < len && a+b <= len) 
    strcpy (input + a, new_input + a + b); 

Я заметил, остальная часть вашего кода ничего не проверяет, что происходит правильно, например, возвращаемое значение из scanf, и обратите внимание, gets опасно: лучше использовать fgets с stdin.

Инструкция strcpy копирует правую часть строки над частью, которую вы хотите удалить. Он работает, используя арифметику указателя. Добавление a в input - это то же самое, что и получение адреса input[a], где вы хотите, чтобы удаление началось. Similary new_input[a+b] - это начало правой части, которую вы хотите сохранить.

Пункт if Условие, заключается в том, что если a не находится внутри строки или если часть, которую вы хотите удалить, переполняет конец строки, это невозможно.

+0

, пожалуйста, объясните инструкцию strcpy и как это влияет на условие if. Я действительно новичок в программировании. Кроме того, не «void» в начале каждой функции означает, что возвращаемое значение становится излишним? –

+0

heh? Пожалуйста, исправьте меня, если я ошибаюсь, но не так ли (как показано в вашем коде) идеальный путь перекрытия источника и адресата? –

+0

@SouravGhosh да, вы правы - это должно быть Undefined Behavior, поэтому следует использовать 'memmove'.Но я всегда предполагал, что UB применяется, когда строки перекрываются другим способом. –

0

Вы можете принять следующий подход

  1. копию из индекса 0 к a-1 из input в new_input
  2. копию из индекса a+b-1 до конца input к new_input

Финлей, ваш new_input будет иметь все e между позицией a и b удален.

Примечание:

  1. с использованием gets() опасно. Вместо этого используйте fgets().
  2. Вы cannnot присвоить строки с использованием = в. Вам нужно скопировать строки, содержащие strcpy()/memcpy().
+0

fgets нуждается в дополнительных аргументах, и все работает нормально прямо сейчас. Из любопытства, в котором ситуация может() быть опасной –

+0

@NathanPiper см. Ответы в [этот вопрос] (http://stackoverflow.com/q/3302255/2173917) для подробного обсуждения того же самого. –

0
void removeString(void); 

int main(void){ 
    printf("\nEnter your sentence: "); 
    scanf("%119[^\n]%*c", input); 

    printf("\nWhere to start(1 origin): "); 
    scanf("%d", &a); 
    printf("\nHow many characters to delete: "); 
    scanf("%d", &b); 

    removeString(); 

    printf("\nOriginal sentence: %s\n", input); 
    printf("\nNew sentence: %s\n", new_input); 
    printf("\nLabelled sentence: %s\n", to_del); 

    return 0; 
} 

void removeString(void){ 
    strcpy(new_input, input); 
    memmove(&new_input[a-1], &new_input[a -1 + b], strlen(&new_input[a -1 + b])+1); 

    strcpy(to_del, input); 
    memset(&to_del[a-1], 'x', b); 
} 
+0

Спасибо, но я должен был сказать, что мне нужен код без memmove. –

+0

@NathanPiper 'memcpy (new_input, input, & input [a] - input - 1); memcpy (& new_input [a-1], & input [a -1 + b], strlen (& input [a -1 + b]) + 1); ' – BLUEPIXY

Смежные вопросы