Как удалить символ по заданному индексу из строки в C?
Как удалить символ из строки?
Если у меня есть строка "abcdef"
, и я хочу удалить "b"
, как это сделать?
Удаление этого символа первым выполняется с помощью этого кода:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char word[] = "abcdef";
char word2[10];
strcpy(word2,&word[1]);
printf("%s\n", word2);
return 0;
}
и
strncpy(word2,word,strlen(word)-1);
предоставит мне строку без символа last, но я до сих пор не понял, как удалить char в середине строки.
Ответы
Ответ 1
Memmove может обрабатывать перекрывающиеся области, я бы попробовал что-то вроде этого (не тестировался, может быть, проблема + -1)
char word[] = "abcdef";
int idxToDel = 2;
memmove(&word[idxToDel], &word[idxToDel + 1], strlen(word) - idxToDel);
До: "abcdef"
После: "abdef"
Ответ 2
Попробуйте следующее:
void removeChar(char *str, char garbage) {
char *src, *dst;
for (src = dst = str; *src != '\0'; src++) {
*dst = *src;
if (*dst != garbage) dst++;
}
*dst = '\0';
}
Программа тестирования:
int main(void) {
char* str = malloc(strlen("abcdef")+1);
strcpy(str, "abcdef");
removeChar(str, 'b');
printf("%s", str);
free(str);
return 0;
}
Результат:
>>acdef
Ответ 3
Мой способ удалить все указанные символы:
void RemoveChars(char *s, char c)
{
int writer = 0, reader = 0;
while (s[reader])
{
if (s[reader]!=c)
{
s[writer++] = s[reader];
}
reader++;
}
s[writer]=0;
}
Ответ 4
int chartoremove = 1;
strncpy(word2,word,chartoremove);
strncpy(((char*)word2)+chartoremove,((char*)word)+chartoremove+1,strlen(word)-1-chartoremove);
Уродливый как ад
Ответ 5
Далее будет задана бит, удалив из первого аргумента строки любой символ, который встречается во втором строковом аргументе.
/*
* delete one character from a string
*/
static void
_strdelchr( char *s, size_t i, size_t *a, size_t *b)
{
size_t j;
if( *a == *b)
*a = i - 1;
else
for( j = *b + 1; j < i; j++)
s[++(*a)] = s[j];
*b = i;
}
/*
* delete all occurrences of characters in search from s
* returns nr. of deleted characters
*/
size_t
strdelstr( char *s, const char *search)
{
size_t l = strlen(s);
size_t n = strlen(search);
size_t i;
size_t a = 0;
size_t b = 0;
for( i = 0; i < l; i++)
if( memchr( search, s[i], n))
_strdelchr( s, i, &a, &b);
_strdelchr( s, l, &a, &b);
s[++a] = '\0';
return l - a;
}
Ответ 6
char a[]="string";
int toBeRemoved=2;
memmove(&a[toBeRemoved],&a[toBeRemoved+1],strlen(a)-toBeRemoved);
puts(a);
Попробуйте это. memmove будет перекрывать его.
Испытано.
Ответ 7
Изменить: Обновлен код zstring_remove_chr()
в соответствии с последней версией библиотеки.
Из библиотеки лицензированных строк BSD для C, называемой zString
https://github.com/fnoyanisi/zString
Функция удаления символа
int zstring_search_chr(char *token,char s){
if (!token || s=='\0')
return 0;
for (;*token; token++)
if (*token == s)
return 1;
return 0;
}
char *zstring_remove_chr(char *str,const char *bad) {
char *src = str , *dst = str;
/* validate input */
if (!(str && bad))
return NULL;
while(*src)
if(zstring_search_chr(bad,*src))
src++;
else
*dst++ = *src++; /* assign first, then incement */
*dst='\0';
return str;
}
Использование Exmaple
char s[]="this is a trial string to test the function.";
char *d=" .";
printf("%s\n",zstring_remove_chr(s,d));
Пример вывода
thisisatrialstringtotestthefunction
Ответ 8
Этот код удалит все символы, которые вы вводите из строки
#include <stdio.h>
#include <string.h>
#define SIZE 1000
char *erase_c(char *p, int ch)
{
char *ptr;
while (ptr = strchr(p, ch))
strcpy(ptr, ptr + 1);
return p;
}
int main()
{
char str[SIZE];
int ch;
printf("Enter a string\n");
gets(str);
printf("Enter the character to delete\n");
ch = getchar();
erase_c(str, ch);
puts(str);
return 0;
}
ввод
a man, a plan, a canal Panama
Выход
A mn, pln, cnl, Pnm!
Ответ 9
#include <stdio.h>
#include <string.h>
int main(){
char ch[15],ch1[15];
int i;
gets(ch); // the original string
for (i=0;i<strlen(ch);i++){
while (ch[i]==ch[i+1]){
strncpy(ch1,ch,i+1); //ch1 contains all the characters up to and including x
ch1[i]='\0'; //removing x from ch1
strcpy(ch,&ch[i+1]); //(shrinking ch) removing all the characters up to and including x from ch
strcat(ch1,ch); //rejoining both parts
strcpy(ch,ch1); //just wanna stay classy
}
}
puts(ch);
}
Предположим, что x является "символом" символа, который вы хотите удалить
, моя идея состояла в том, чтобы разделить строку на две части:
1-я часть будет считать все символы из индекса 0 до (и включая) целевого символа x.
Вторая часть подсчитывает все символы после x (не включая x)
Теперь вам нужно только присоединиться к обоим частям.
Ответ 10
Используйте strcat()
для конкатенации строк.
Но strcat()
не позволяет перекрывать, поэтому вам нужно создать новую строку для хранения вывода.
Ответ 11
Следующее должно сделать это:
#include <stdio.h>
#include <string.h>
int main (int argc, char const* argv[])
{
char word[] = "abcde";
int i;
int len = strlen(word);
int rem = 1;
/* remove rem'th char from word */
for (i = rem; i < len - 1; i++) word[i] = word[i + 1];
if(i < len) word[i] = '\0';
printf("%s\n", word);
return 0;
}
Ответ 12
Я пробовал с strncpy()
и snprintf()
.
int ridx = 1;
strncpy(word2,word,ridx);
snprintf(word2+ridx,10-ridx,"%s",&word[ridx+1]);
Ответ 13
Другое решение, использующее memmove() вместе с index() и sizeof():
char buf[100] = "abcdef";
char remove = 'b';
char* c;
if ((c = index(buf, remove)) != NULL) {
size_t len_left = sizeof(buf) - (c+1-buf);
memmove(c, c+1, len_left);
}
buf [] теперь содержит "acdef"
Ответ 14
Это может быть один из самых быстрых, если вы передадите индекс:
void removeChar(char *str, unsigned int index) {
char *src;
for (src = str+index; *src != '\0'; *src = *(src+1),++src) ;
*src = '\0';
}
Ответ 15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX 50
void dele_char(char s[],char ch)
{
int i,j;
for(i=0;s[i]!='\0';i++)
{
if(s[i]==ch)
{
for(j=i;s[j]!='\0';j++)
s[j]=s[j+1];
i--;
}
}
}
int main()
{
char s[MAX],ch;
printf("Enter the string\n");
gets(s);
printf("Enter The char to be deleted\n");
scanf("%c",&ch);
dele_char(s,ch);
printf("After Deletion:= %s\n",s);
return 0;
}
Ответ 16
Это то, что вы можете искать, в то время как счетчик - это индекс.
#include <stdio.h>
int main(){
char str[20];
int i,counter;
gets(str);
scanf("%d", &counter);
for (i= counter+1; str[i]!='\0'; i++){
str[i-1]=str[i];
}
str[i-1]=0;
puts(str);
return 0;
}
Ответ 17
вот как я реализовал то же самое в С++.
#include <iostream>
#include <cstring>
using namespace std;
int leng;
char ch;
string str, cpy;
int main() {
cout << "Enter a string: ";
getline(cin, str);
leng = str.length();
cout << endl << "Enter the character to delete: ";
cin >> ch;
for (int i=0; i<leng; i++) {
if (str[i] != ch)
cpy += str[i];
}
cout << endl << "String after removal: " << cpy;
return 0;
}
Ответ 18
Удобный, простой и быстрый способ избавиться от \0 - это скопировать строку без последнего char (\ 0) с помощью strncpy вместо strcpy:
strncpy(newStrg,oldStrg,(strlen(oldStrg)-1));