Как заменить символ в строке си
Перейти к содержимому

Как заменить символ в строке си

  • автор:

Замена в строке одного символа на другой, как сделать на Си?

Не знаю, где ты взял этот код, но явно не там, где надо. В нём практически всё неправильно делается. Как будто взято из другого языка.

Решения вопроса 1

Основная проблема в том, что ваши массивы под строки символов замены размером в 1 чар. А писаться будет как минимум 2: введённый символ и символ конца строки.

Ответ написан более трёх лет назад
Yurii Vlasiuk @forestyura Автор вопроса
Спасибо большое, все работает=)
Ответы на вопрос 1
Developer, ex-admin

Хорошо бы в editString в конце еще дописывать ‘\0’. В таком виде как сейчас работает, пока массивы в стеке, стоит их начать выделять динамически и это у вас всплывет.
И заменить «new» на другое имя, т.к. new является служебным словом в С++, а от Си до С++ один шаг фактически 🙂

Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

cpp

  • C++

Стоит ли пойти на этот курс по C++?

  • 1 подписчик
  • 6 минут назад
  • 18 просмотров

программирование

  • Программирование
  • +2 ещё

С++ Как правильно вернуть ссылку?

  • 1 подписчик
  • 28 минут назад
  • 10 просмотров

Научный форум dxdy

Здравствуйте. Задача: Даны строки S, S1 и S2. Заменить в строке S последнее вхождение строки S1 на строку S2.
У меня происходит замена, но всё, что есть строке, до этой подстроки у меня удаляется. Объясните пожалуйста, как это исправить?

#include
#include
#include

void main()
setlocale(LC_CTYPE,»Russian»);
char s1[256], s2[256], s[256];
char *buf;
unsigned int i;

printf(«Введите строку s: «);
gets(s);
printf(«Введите строку s1: «);
gets(s1);
printf(«Введите строку s2: «);
gets(s2);
i=strlen(s)-strlen(s1)+1; //сравнение строк
if (i>0)
strrev(s);
strrev(s1);
strrev(s2);
buf = strstr(s, s1);
if(buf) //условие наличия подстроки
strcpy(buf,buf+strlen(s1));//удаление последней подстроки
strcpy(buf,s2);
strrev(s);
>
else
strrev(s);
printf(«%s\n», s); //вывод результата
>
else
printf («\n Строка s1 больше строки s»);
_getch();
>

Re: Язык Си. Замены в строке.
07.12.2013, 13:40

Заслуженный участник

Что, по-вашему, делает strcpy ?
Re: Язык Си. Замены в строке.
07.12.2013, 14:22
arseniiv в сообщении #797272 писал(а):
Что, по-вашему, делает strcpy ?

Копирует строку s2 в buf

Re: Язык Си. Замены в строке.
07.12.2013, 14:45

Заслуженный участник

Последний раз редактировалось arseniiv 07.12.2013, 14:46, всего редактировалось 1 раз.

«Копирует» — это слишком общее описание. Внимательно разберитесь с ней — и всё получится.
Re: Язык Си. Замены в строке.
07.12.2013, 16:23

Последний раз редактировалось Retard 07.12.2013, 16:25, всего редактировалось 1 раз.

arseniiv в сообщении #797295 писал(а):
«Копирует» — это слишком общее описание. Внимательно разберитесь с ней — и всё получится.

Ну, получается берёт первый символ строки s2 и вставляет его после buf, затем второй и так далее, правильно? Или же идёт замена?

Re: Язык Си. Замены в строке.
07.12.2013, 16:41

Заслуженный участник

Последний раз редактировалось arseniiv 07.12.2013, 16:44, всего редактировалось 2 раз(а).

Что означает «вставляет»? Если вы имели в виду со сдвигом остальных символов вправо, то нет. Символы по конечному адресу переписываются новыми.

При этом, внимание, конечный ‘\0’ тоже копируется! (Подумайте, к чему это приведёт у вас.) Чтобы его не копировать, можно использовать strncpy .

Re: Язык Си. Замены в строке.
07.12.2013, 16:57
arseniiv в сообщении #797360 писал(а):

Что означает «вставляет»? Если вы имели в виду со сдвигом остальных символов вправо, то нет. Символы по конечному адресу переписываются новыми.

При этом, внимание, конечный ‘\0’ тоже копируется! (Подумайте, к чему это приведёт у вас.) Чтобы его не копировать, можно использовать strncpy .

Тогда как же сделать, чтобы оставалась левая часть, вставлялась s2 и после неё шла правая часть? Как-то скопировать правую часть в переменную а затем добавить её к тому, что мы получили после копирования s2 в buf?

Re: Язык Си. Замены в строке.
07.12.2013, 17:09

Заслуженный участник

Последний раз редактировалось arseniiv 07.12.2013, 17:11, всего редактировалось 1 раз.

Можно и без переменной обойтись, если использовать memmove . Это уж как хотите.

— Сб дек 07, 2013 20:11:37 —

Кстати, форум ссылки не подчёркивает, а цвет кода переопределяет цвет ссылки, так что вы могли не заметить, что выше strncpy и memmove — это ссылки на справочник (один из возможных, просто первый попался). Почитайте там подробности, без которых обходиться никак нельзя.

Re: Язык Си. Замены в строке.
08.12.2013, 11:57

Последний раз редактировалось Retard 08.12.2013, 11:57, всего редактировалось 1 раз.

Сделал через memmove, но если подстрок несколько, то удаляется несколько букв до вхождения, не могу понять почему.

#include
#include
#include

void main()
setlocale(LC_CTYPE,»Russian»);
char s1[256], s2[256], s[256];
char *buf;
unsigned int i;

printf(«Введите строку s: «);
gets(s);
printf(«Введите строку s1: «);
gets(s1);
printf(«Введите строку s2: «);
gets(s2);
i=strlen(s)-strlen(s1)+1; //сравнение строк
if (i>0)
strrev(s);
strrev(s1);
strrev(s2);
buf = strstr(s, s1);
if(buf) //условие наличия подстроки
strcpy(buf,buf+strlen(s1));//удаление последней подстроки
memmove(buf,s2,strlen(s2));
strrev(s);
>
else
strrev(s);
printf(«%s\n», s); //вывод результата
>
else
printf («\n Строка s1 больше строки s»);
_getch();
>

Re: Язык Си. Замены в строке.
08.12.2013, 13:44

Заслуженный участник

Разумеется, не будет работать. Вы же не поменяли строку
strcpy(buf,buf+strlen(s1));//удаление последней подстроки
(и комментарий потом тоже поменяйте).

Пускай перед этой строкой s1 = «ABC\0» , s2 = «DEFGHI\0» , а buf указывает на кусок «ABCJKLMN\0» . Тогда эта ваша строка изменит этот кусок на «JKLMN\0MN\0» (а может сделать и не это, а чёрт-те что, т. к. области памяти перекрываются, и именно для таких случаев нужна была бы здесь memmove ). Следующий оператор сделает с ним «DEFGHIMN\0» (а если бы s2 = «DE\0» , получилось бы «DELMN\0MN\0» ).

Кусок по адресу buf+strlen(s1) надо сдвигать не в одно и то же место каждый раз, а ровно туда, где он нужен. Возьмите бумажку и проверьте, куда.

Re: Язык Си. Замены в строке.
08.12.2013, 15:05
arseniiv в сообщении #797681 писал(а):

Разумеется, не будет работать. Вы же не поменяли строку
strcpy(buf,buf+strlen(s1));//удаление последней подстроки
(и комментарий потом тоже поменяйте).

Пускай перед этой строкой s1 = «ABC\0» , s2 = «DEFGHI\0» , а buf указывает на кусок «ABCJKLMN\0» . Тогда эта ваша строка изменит этот кусок на «JKLMN\0MN\0» (а может сделать и не это, а чёрт-те что, т. к. области памяти перекрываются, и именно для таких случаев нужна была бы здесь memmove ). Следующий оператор сделает с ним «DEFGHIMN\0» (а если бы s2 = «DE\0» , получилось бы «DELMN\0MN\0» ).

Кусок по адресу buf+strlen(s1) надо сдвигать не в одно и то же место каждый раз, а ровно туда, где он нужен. Возьмите бумажку и проверьте, куда.

Я понимаю, о чём Вы говорите, но у меня всё равно ничего не получается. Не могу понять как изменить эту строчку так, чтобы сдвигалось туда, куда нужно.

Замена символов в строке

Author24 — интернет-сервис помощи студентам

Известно, что в начале строки s находится не более 40 латинских букв, за которыми следуют пробелы. Образовать новую строку, предварительно заменив все вхождения ph на f, а все вхождения ed на ing.

Лучшие ответы ( 1 )

94731 / 64177 / 26122

Регистрация: 12.04.2006

Сообщений: 116,782

Ответы с готовыми решениями:

Замена определенных символов в строке
Всем доброго времени суток,столкнулся с вот такой вот задачей: есть символы: " =,==,!=,a+=,a-= ".

Замена произвольных символов в строке
Необходимо заменить произвольные символы во введенной строке на заданные другие символы. .

Функция: замена подстроки в строке на заданную последовательность символов
Не успеваю сделать такое задание для шараги, если кто может помочь хотя бы советом или напутствием.

296 / 227 / 102

Регистрация: 11.08.2016

Сообщений: 780

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
//* Известно, что в начале строки s находится не более 40 * латинских букв, за которыми следуют пробелы. * Образовать новую строку, предварительно заменив все * вхождения ph на f, а все вхождения ed на ing. */ #include #include #include typedef struct _repl { // Структура для хранения информации int position; // о позиции в строке ключевого слова int index; // и индекс пар. } replinfo; replinfo searchReaplce(char * arr, const char ** toreplace); void replace(char * arr, replinfo replaceinfo); void arrShiftRight(char * arr, int position, int difference); void arrShiftLeft(char * arr, int position, int difference); /*Вводить текст сюда*/ char arr[] = "123 phillip eddy, philied,phed,edph phphedddy _"; #define TOREPLACE 3 //Количество пар для поиска и замены //Указывать пары для поиска и замены //следует с одинаковой очерёдностью в обоих указателях //(у них должен быть одинаковый индекс) const char *toreplace[] = { //Ключевые слова для поиска "ph", //#1 "ed", //#2 "ingdy" //#3 }; const char *replaceon[] = { //Заменяющая часть "f", //#1 "ing", //#2 "THIS" //#3 }; int main(void) { replinfo replaceinfo; printf("len = %d\n%s\n", strlen(arr), arr); while(1) //Искать бесконечно { replaceinfo = searchReaplce(arr, toreplace); //Сохраняем информацию поиска в структуру replaceinfo if(replaceinfo.index == -1) //Если совпадений нет, break; //выйдем из поиска replace(arr, replaceinfo); } char * output_arr = (char *)malloc(sizeof(char) * strlen(arr)); strcpy(output_arr, arr); //Запишем заранее подготовленный массив в новый printf("len = %d\n%s\n", strlen(output_arr), output_arr); return 0; } //Поиск ключевых слов toreplace для замены в строке arr replinfo searchReaplce(char * arr, const char ** toreplace) { replinfo tmp; int i, j, h, len; len = strlen(arr); for(i = 0; i  len; i++) //Считаем строку до конца for(j = 0; j  TOREPLACE; j++) //Перебираем варианты подбора if(*(arr+i) == *(*(toreplace + j) + 0)) //Если первые буквы из arr, toreplace совпали и одинаковы, { for(h = 0; *(*(toreplace + j) + h) != 0; h++) //то продолжаем сверять ключевое слово со своей парой if(*(arr+i++) != *(*(toreplace + j) + h)) //Если на пути встретится неравенство, break; //то прекратить сравнение if(*(*(toreplace + j) + h) == 0) //Проверим, что сравнили правильно и дошли до конца образца { tmp.position = i - h; //Вернём текущую позицию i - длинна замены h tmp.index = j; //Вернём индекс пары j return tmp; } } tmp.index = -1; tmp.position = -1; return tmp; //Если ничего не найдено, то вернёт -1 } //Заменяет в строке arr, слово с индексом replaceinfo.index на свою пару с тем-же индексом. void replace(char * arr, replinfo replaceinfo) { int replaceon_len = strlen(*(replaceon + replaceinfo.index)); int toreplace_len = strlen(*(toreplace + replaceinfo.index)); //Если заменяемый участок больше заменяющего участка if(toreplace_len  replaceon_len) arrShiftRight(arr, replaceinfo.position, replaceon_len - toreplace_len); //Сдвигаем вправо на разность длинн else if(toreplace_len > replaceon_len) arrShiftLeft(arr, replaceinfo.position, toreplace_len - replaceon_len); //Или вправо на разность длинн for(int i = 0; i  replaceon_len; i++) //Дописываем на подготовленное место замену *(arr + replaceinfo.position + i) = *(*(replaceon + replaceinfo.index) + i); } //Сдвиг строки arr вправо с позиции position на длинну difference void arrShiftRight(char * arr, int position, int difference) { int len = strlen(arr); for(int i = 0; i  difference; i++) //Кол-во подходов for(int j = len-1; j > position; j--) //Сдвигаем строку до position на 1 символ *(arr + j) = *(arr + j - 1); //Перемещаемся с конца, в начало. последний символ будет утерян. } //Сдвиг строки arr влево с позиции position на длинну difference void arrShiftLeft(char * arr, int position, int difference) { int len = strlen(arr); for(int i = 0; i  difference; i++) //Кол-во подходов. for(int j = 0; j + position  len; j++) //Сдвигаем строку с position на 1 символ. *(arr + position + j) = *(arr + position + j + 1); //Перемещаемся с начала в конец }

Вот вышел какой то набросок. Толком я его не проверял. но на первый взгляд работает.

Как заменить символ в строке си

Ввести с клавиатуры или из файла текст содержащий знаки + и -. Из исходного текста сформировать новый файл, в котором знаки + и – заменить словами плюс и минус.

а дальше не знаю как делать) пожайлуста подскажите

и может кто нибудь посоветует как сделать вот это задание

Архимедова спираль. Траектория точки движущейся с постоянной скоростью v по лучу, вращающемуся с постоянной угловой скоростью ω. Уравнение в полярных координатах : = a φ a= v/ ω -∞ < φ < +∞, а в декартовых
x = a t cos(t)
y = a t sin(t) 0 < t < ∞,

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *