Возможный дубликат:
удаление символов из строки в С
У вас есть пример кода C для удаления возврата каретки в строке?
Возможный дубликат:
удаление символов из строки в С
У вас есть пример кода C для удаления возврата каретки в строке?
Самое простое решение, вероятно, состоит в том, чтобы просто обработать строку символ за символом с указателями на источник и место назначения:
#include <stdio.h>
#include <string.h>
int main (void) {
char str[] = "This is a two-line\r\nstring with DOS line endings.\r\n";
printf("%d [%s]\n",strlen(str), str);
// ========================
// Relevant code in this section.
char *src, *dst;
for (src = dst = str; *src != '\0'; src++) {
*dst = *src;
if (*dst != '\r') dst++;
}
*dst = '\0';
// ========================
printf("%d [%s]\n",strlen(str), str);
}
Это устанавливает два указателя изначально одинаковыми. Затем он копирует символ и всегда перемещает указатель источника. Однако он продвигает указатель назначения только в том случае, если символ не был возвратом каретки. Таким образом, все возвраты каретки перезаписываются либо следующим символом, либо завершающим нулем. Результат:
51 [This is a two-line
string with DOS line endings.
]
49 [This is a two-line
string with DOS line endings.
]
Этого будет достаточно для большинства строк. Если ваши строки действительно огромны по размеру (или вам нужно делать это много раз в секунду), вы можете рассмотреть решение на основе strchr
, так как библиотечная функция скорее всего будут оптимизированы.
src++
, которые сейчас исправлены.
- person paxdiablo; 26.09.2010
strlen
возвращает size_t
, поэтому вы должны использовать формат '%zu' в printf
.
- person schot; 26.09.2010
printf
была просто инфраструктурой, чтобы можно было протестировать соответствующий бит. Вы также можете жаловаться, что я не предоставил достаточно тестовых случаев.
- person paxdiablo; 26.09.2010
void main()
:)
- person schot; 27.09.2010
Возврат каретки или любой другой символ легко заменить в строке и еще проще заменить. Ваш вопрос на самом деле не показывает, что вы ищете, поэтому я включил пример кода для удаления и замены символа в строке.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void remove_char_from_string(char c, char *str)
{
int i=0;
int len = strlen(str)+1;
for(i=0; i<len; i++)
{
if(str[i] == c)
{
// Move all the char following the char "c" by one to the left.
strncpy(&str[i],&str[i+1],len-i);
}
}
}
void replace_char_from_string(char from, char to, char *str)
{
int i = 0;
int len = strlen(str)+1;
for(i=0; i<len; i++)
{
if(str[i] == from)
{
str[i] = to;
}
}
}
int main(void) {
char *original = "a\nmultiline\nstring";
int original_len = strlen(original)+1;
char *string = (char *)malloc(original_len);
memset(string,0,original_len);
strncpy(string,original,original_len);
replace_char_from_string('\n',' ',string);
printf("String: %s\n",string); // print: String: a multiline string
remove_char_from_string(' ',string);
printf("String: %s\n",string); // print: String: amultilinestring
return 0;
}
&
на&
(несмотря на ошибочное название). Конечно, в ответах есть пересечения, но это не обязательно делает вопрос обманом. - person paxdiablo   schedule 26.09.2010