Mam ciąg znaków C, który wygląda jak "Nmy stringP"
, gdzie N i P mogą być dowolną postacią. Jak mogę edytować go w "my string"
w C?Usuń pierwszą i ostatnią literę z ciągu C
Odpowiedz
celu "usunięcie" 1st punkt znaku do drugiego znaku:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++; /* 'N' is not in `p` */
Aby usunąć ostatni znak zastąpić go '\ 0'
p[strlen(p)-1] = 0; /* 'P' is not in `p` (and it isn't in `mystr` either) */
To może nie działać, ponieważ inicjując "Nmy stringP" jako literał, kompilator/linker może umieścić go w pamięci tylko do odczytu, powodując niepowodzenie edycji. – Suppressingfire
@Suppressingfire: "Nmy stringP" jest rzeczywiście dosłownym ciągiem, ale jest kopiowane (char by char) do tablicy 'mystr'. Tablica 'mystr' jest modyfikowalna. – pmg
@pmg: Gdzie kopiujesz? 'char * p = mystr' wskazuje' p' na 'mystr', nie kopiuje' mystr'. – quark
Najskuteczniejszym sposobem:
//Note destroys the original string by removing it's last char
// Do not pass in a string literal.
char * getAllButFirstAndLast(char *input)
{
int len = strlen(input);
if(len > 0)
input++;//Go past the first char
if(len > 1)
input[len - 2] = '\0';//Replace the last char with a null termination
return input;
}
//...
//Call it like so
char str[512];
strcpy(str, "hello world");
char *pMod = getAllButFirstAndLast(str);
najbezpieczniej:
void getAllButFirstAndLast(const char *input, char *output)
{
int len = strlen(input);
if(len > 0)
strcpy(output, ++input);
if(len > 1)
output[len - 2] = '\0';
}
//...
//Call it like so
char mod[512];
getAllButFirstAndLast("hello world", mod);
Drugi sposób jest mniej wydajny, ale bezpieczniejszy, ponieważ można wprowadzić literały łańcuchowe do danych wejściowych. Możesz też użyć strdup na drugą stronę, jeśli nie chcesz go zaimplementować samodzielnie.
Problem z drugą implementacją polega na upewnieniu się, że twój wynik jest wystarczająco duży do obsługi kopii przed wywołaniem metody getAllBufFirstAndLast(). W tym przypadku, poleciłbym dodanie zmiennej outputLength do wywołania i pozwoliłaby wywoływanej funkcji manipulować wyjściem z funkcjami strn *. – shank
tak, to jest warunek wstępny, możesz dodać parametr długości. –
Inną opcją, ponownie przy założeniu, że „edytuj” oznacza, że chcesz zmodyfikować w miejscu:
void topntail(char *str) {
size_t len = strlen(str);
assert(len >= 2); // or whatever you want to do with short strings
memmove(str, str+1, len-2);
str[len-2] = 0;
}
ten modyfikuje ciąg w miejscu, bez generowania nowego adresu jako rozwiązanie PMG za nie. Nie chodzi o to, że w odpowiedzi na pmg jest coś złego, ale w niektórych przypadkach nie jest to, czego chcesz.
nawiązaniu do użytkownika @ PMG odpowiedź, trzeba pamiętać, że można to zrobić zarówno operacje w jednym stwierdzeniem:
char mystr[] = "Nmy stringP";
char *p = mystr;
p++[strlen(p)-1] = 0;
to prawdopodobnie będzie działać zgodnie z oczekiwaniami, ale zachowanie jest niezdefiniowane w standardzie C.
Najlepiej jednak nie polegać na niezdefiniowanym zachowaniu. – T0xicCode
@ xav0989 Uzgodnione, zamierzałem dodać to jako komentarz (aby podkreślić powód, aby tego nie robić), a nie jako alternatywną odpowiedź. Jestem trochę nowy w tym. –
- 1. Usuń pierwszą i ostatnią postać C++
- 2. Zdobądź pierwszą literę ciągu z kolumny
- 3. Zamień na ostatnią literę ciągu znaków
- 4. Zdobądź pierwszą i ostatnią klasę z jQuery
- 5. Zdobądź pierwszą literę z maksimum występowania ciągu znaków
- 6. python wymień tylko pierwszą literę
- 7. Jak usunąć pierwszą i ostatnią linię z pliku tekstowego C#?
- 8. Utwórz pierwszą wielką literę i pozostałą małą literę w ciągu znaków
- 9. Pobierz pierwszą literę zmiennej make
- 10. Jak znaleźć pierwszą małą literę w ciągu używając python
- 11. Jak wykorzystać pierwszą literę każdego słowa w ciągu
- 12. Pobierz ostatnią literę ze zmiennej o zmiennej
- 13. Zdobądź pierwszą literę każdego słowa w ciągu znaków, w JavaScript
- 14. Android: Konwertuj pierwszą literę łańcucha na małą literę
- 15. XSL - Jak wykorzystać pierwszą literę
- 16. przesyłanych plików uzyskać pierwszą literę odciąć
- 17. Usuń ostatnią linię ze stringa
- 18. mapview iphone przynoszą pierwszą i ostatnią adnotację z przodu
- 19. Wyodrębnij pierwszą i ostatnią kolumnę z pliku tekstowego
- 20. Usuń ostatnią postać edittext
- 21. Jak znaleźć pierwszą literę każdego słowa?
- 22. Jak sformatować pierwszą literę w Bladerze Laravel
- 23. ruby / regex otrzymuję pierwszą literę każdego słowa
- 24. R: data.table, ustaw pierwszą i ostatnią wartość grupy na NA
- 25. Nieparzyste zachowanie regexp - dopasowuje tylko pierwszą i ostatnią przechwytywaną grupę
- 26. C++ Usuń interpunkcję z ciągu znaków
- 27. Jak napisać wielką literą pierwszą literę tekstu
- 28. pierwszą literę każdego słowa w Scala
- 29. Jak zrobić pierwszą literę wielkiego słowa?
- 30. Jak uzyskać pierwszą literę w zmiennej Bash?
Praca domowa? Dodaj tag "praca domowa", jeśli jest. – pmg
Nie, nie zadanie domowe - po prostu próbuję nauczyć się C dla zabawy. – igul222
W czystym C nie ma czegoś takiego jak "ciąg". Czy masz wskaźnik do bufora ('char *') lub tablicy znaków ('char []')? –