Подскажите, пожалуйста, как из строки удалить слово?
Пока реализовывал, понял из strcat, что char и const char разные типы (почему, что, где еще пока не понял). Решил обойти этот момент через указатели, но здесь меня вообще убило.
#include <stdio.h>
#include <string.h>
#include <ctype.h>
int main (){
char s[] ="The; first E36 M3, to be imported to the United States: was the 1995 model.";
char *p; //если закомментировать эту строку
char *n;
printf("%s\n",s);
//*n='\0'; и раскомментировать эту
printf("%s\n",n);
n=s;
printf("%s\n",n);
return 0;
}
The; first E36 M3, to be imported to the United States: was the 1995 model.
Process returned -1073741819 (0xC0000005) execution time : 3.734 s
Press any key to continue.
С указателями разобрался, но все таки с char и const char в strcat не могу. Помогите, пожалуйста, закомментированый код на Си перевести. Также хотел бы узнать как стоку "обнулить" (n:='';)
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
int main (){
const char *p ="The; first E36 M3, to be imported to the United States: was the 1995 model.";
char n[255];
char w[255];
//n:='';w:='';
p--;
while(*++p!=NULL){
printf("%c", *p);
if (((ispunct(*p)!=NULL)||(*p==' '))||(*(p+1)==NULL)){
//if w='' then
// n:=n+*p
//else
// begin
// n:=n+w;
// w='';
// end;
}
else{
//w:=w+*p;
}
}
return 0;
}
Не-не-не... Не надо переводить код, работающий со строками с Паскаля на С. Уж очень по-разному эти языки со строками работают. Ты лучше задачу поставь, что именно тебе надо сделать? Какое слово ты хочешь из строки удалить? Покажем, как это сделать в стиле С...
Да любое. Например, если в слово имеет определенную длину. Мне бы принцип понять) Я сделал с помощью strtok, но он же выделяет только слова, а разделители отсекаются.
Добавлено через 5 мин.
Так же меня удивило, что *p не является const char.
Вот так:
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <conio.h>
int main (){
const int L = 2; // Будем удалять слова вот такой длины
const char *p =
"The; first E36 M3, to be imported to the United States: was the 1995 model.\0";
char s[256] = {0}; // сюда пишем строку - результат
char *pp = s; // указатель на строку - результат
int len = 0; // длина слова
for(; *p; p++) // идем по строке
{
if(strchr(";:.,!? ", *p)) // текущий символ - разделитель?
{
if(len == L) // да... Предыдущее слово - нужной длины?
{
pp -= L; // да... Значит, отходим на L символов назад...
}
len = 0; *pp++ = *p; // В любом случае слово закончилось,
// значит длина его обнуляется, да
// и разделитель заносим в результ. строку
}
else
{
len += 1; // нет, это был не разделитель... длину
*pp++ = *p; // увеличиваем, символ пишем в результат...
}
}
*pp = '\0'; // на всякий случай завершаем строку нулем...
printf("%s\n", s); // вот и все, строка готова...
return 0;
}
char s[256] = {0}; Это очистка строки?
Добавлено через 14 мин.
Класс!
Только на паскаль не похоже... А реализация с помощью strcat, strlen возможна?
Добавлено через 2 мин.
И, надеюсь, последний вопросик: вот эту (ispunct(*p)!=NULL)||(*p==' ') строку вы заменили на strchr(";:.,!? ", *p) с какой-то целью или просто, для наглядности?
const char *s1="mama \0";
char s2[255];
scanf( );
scanf - это далеко не единственная функция для ввода строк, если что... Еще есть gets, например, которая читает до '\n'
Допустим считал, а дальше как?
Кстати, я проверил, ispunct как и написано в книжке отбирает "все печатаемые символы, которые не относятся ни к алфавитно-цифровым, ни к "пробельным", т.е. скобки тоже входят.
const char *s1="mama \0";
char s2[255], result[255];
gets(s2);
strcpy(result, s1);
strcat(result, s2);
printf("%s\n", result);