Hoe verwijder ik een teken uit een tekenreeks?
Als ik de string "abcdef"
heb en ik wil "b"
verwijderen, hoe doe ik dat dan?
Het verwijderen van het eersteteken is eenvoudig met deze code:
#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;
}
en
strncpy(word2,word,strlen(word)-1);
geeft me de tekenreeks zonder het laatste-teken, maar ik heb nog steeds niet ontdekt hoe ik een teken in het middenvan een tekenreeks kan verwijderen.
Antwoord 1, autoriteit 100%
memmove
kan overlappende gebieden aan, zou ik proberen zoiets (niet getest, misschien +-1 probleem)
char word[] = "abcdef";
int idxToDel = 2;
memmove(&word[idxToDel], &word[idxToDel + 1], strlen(word) - idxToDel);
Vroeger: "abcdef"
Na: "abdef"
Antwoord 2, autoriteit 66%
Probeer dit:
void removeChar(char *str, char garbage) {
char *src, *dst;
for (src = dst = str; *src != '\0'; src++) {
*dst = *src;
if (*dst != garbage) dst++;
}
*dst = '\0';
}
Testprogramma:
int main(void) {
char* str = malloc(strlen("abcdef")+1);
strcpy(str, "abcdef");
removeChar(str, 'b');
printf("%s", str);
free(str);
return 0;
}
Resultaat:
>>acdef
Antwoord 3, Autoriteit 25%
Mijn manier om alle opgegeven tekens te verwijderen:
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;
}
Antwoord 4, Autoriteit 9%
Echt verrast dit is niet eerder gepost.
strcpy(&str[idx_to_delete], &str[idx_to_delete + 1]);
vrij efficiënt en eenvoudig. strcpy
Gebruikt memmove
over de meeste implementaties.
Antwoord 5, Autoriteit 8%
char a[]="string";
int toBeRemoved=2;
memmove(&a[toBeRemoved],&a[toBeRemoved+1],strlen(a)-toBeRemoved);
puts(a);
Probeer dit. Memmove zal het overlappen.
Getest.
Antwoord 6, Autoriteit 6%
int chartoremove = 1;
strncpy(word2, word, chartoremove);
strncpy(((char*)word2)+chartoremove, ((char*)word)+chartoremove+1,
strlen(word)-1-chartoremove);
lelijk als de hel
Antwoord 7, Autoriteit 2%
Het volgende breidt het probleem een beetje uit door te verwijderen van het eerste string-argument elk karakter dat optreedt in het tweede string-argument.
/*
* 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;
}
Antwoord 8, autoriteit 2%
#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);
}
Laten we aannemen dat x het “symbool” is van het teken dat u wilt verwijderen
,mijn idee was om de snaar in 2 delen te verdelen:
Het eerste deel telt alle tekens van de index 0 tot (en inclusief) het doelteken x.
2e deel telt alle tekens na x (exclusief x)
Nu hoef je alleen nog maar beide delen samen te voegen.
Antwoord 9
Gebruik strcat()
om strings samen te voegen.
Maar strcat()
staat geen overlapping toe, dus u moet een nieuwe tekenreeks maken om de uitvoer vast te houden.
Antwoord 10
Ik heb het geprobeerd met strncpy()
en snprintf()
.
int ridx = 1;
strncpy(word2,word,ridx);
snprintf(word2+ridx,10-ridx,"%s",&word[ridx+1]);
Antwoord 11
Een andere oplossing, waarbij memmove() samen met index() en sizeof() wordt gebruikt:
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[] bevat nu “acdef”
Antwoord 12
Dit is misschien wel een van de snelste, als je de index haalt:
void removeChar(char *str, unsigned int index) {
char *src;
for (src = str+index; *src != '\0'; *src = *(src+1),++src) ;
*src = '\0';
}
Antwoord 13
Deze code verwijdert alle tekens die u invoert uit de tekenreeks
#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;
}
invoer
a man, a plan, a canal Panama
Uitgang
A mn, pln, cnl, Pnm!
Antwoord 14
bewerken: Bijgewerkt de code zstring_remove_chr()
volgens de nieuwste versie van de bibliotheek.
van een BSD-licentie-string-verwerkingsbibliotheek voor C, genaamd zstring
https://github.com/fnoyanisi/zstring
functie om een teken
te verwijderen
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 gebruik
char s[]="this is a trial string to test the function.";
char *d=" .";
printf("%s\n",zstring_remove_chr(s,d));
Voorbeelduitgang
thisisatrialstringtotestthefunction
Antwoord 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;
}
Antwoord 16
Dit is waar je naar op zoek bent terwijl teller de index is.
#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;
}
Antwoord 17
Ik weet dat de vraag erg oud is, maar ik zal mijn implementatie hier achterlaten:
char *ft_strdelchr(const char *str,char c)
{
int i;
int j;
char *s;
char *newstr;
i = 0;
j = 0;
// cast to char* to be able to modify, bc the param is const
// you guys can remove this and change the param too
s = (char*)str;
// malloc the new string with the necessary length.
// obs: strcountchr returns int number of c(haracters) inside s(tring)
if (!(newstr = malloc(ft_strlen(s) - ft_strcountchr(s, c) + 1 * sizeof(char))))
return (NULL);
while (s[i])
{
if (s[i] != c)
{
newstr[j] = s[i];
j++;
}
i++;
}
return (newstr);
}
gooi gewoon de tekens die niet gelijk zijn aan het teken dat u wilt verwijderen naar een nieuwe tekenreeks.
Antwoord 18
Het volgende zou het moeten doen:
#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;
}
Antwoord 19
zo heb ik hetzelfde in c++ geïmplementeerd.
#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;
}
Antwoord 20
Een handige, eenvoudige en snelle manier om van \0 af te komen, is door de string te kopiëren zonder de laatste char (\0) met behulp van strncpy in plaats van strcpy:
strncpy(newStrg,oldStrg,(strlen(oldStrg)-1));