Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 19.05.2011, 12:48   #1
hardorsoft
Пользователь
 
Регистрация: 13.05.2011
Сообщений: 35
По умолчанию Ошибка компиляции?

Здравствуйте!
Начинаю осваивать Си возникла проблема при написании программы.
Вот код:

Код:
/*
  Вариант функции squeeze(s1,s2), который удаляет из строки s1
каждый символ, совпадающий с каким-либо символом строки s2. 
*/
#include <stdio.h>
#define LIM 10
main()
{
  int i;
  char c;
  char s1[LIM], s2[LIM];
  
  printf("Введите строку s1-> ");
  scanf("%s", s1);
  
  printf("Введите строку s2-> ");
  scanf("%s", s2);
  
  printf("\n\nПроверка1 %s", s1);
  printf("\n\nПроверка2 %s", s2);
  squeeze(s1, s2);
  
}

squeeze(char s1[LIM], char s2[LIM])
{
  int i, j, k;
  for(i = k = 0; s1[i] != '\0'; i++)
  {
    for(j = 0; s2[j] != '\0'; j++)
    {
        if(s1[k] != s2[j])
        {
          s1[k++] = s1[i]; 
        }
        
    }
  }
  s1[k] = '\0';
  printf("\n\nИтог -> %s", s1);
  return 0;
}
При запуске программы:

Введите строку s1-> WEQEQES
ETETET
Введите строку s2-> RYRYRYRY


Проверка1 WEQEQES�E

Ошибка сегментирования


Вопрос: что я делаю не так?
Решенные мною и не только задачи на Си можно смотреть здесь:
http://cirishen.blogspot.com/

Последний раз редактировалось hardorsoft; 19.05.2011 в 13:04.
hardorsoft вне форума Ответить с цитированием
Старый 19.05.2011, 12:51   #2
Donatello
Форумчанин
 
Аватар для Donatello
 
Регистрация: 22.12.2010
Сообщений: 109
По умолчанию

Мб дело в том что вы изначально вводите абсолютно разные символы???
Попробуйте ввести
World
War
Я бы изменил мир, но бог не дает исходников (c)

И сказал мыслитель, напиши свою проблему на бумаге и ты увидишь свои ошибки.
Donatello вне форума Ответить с цитированием
Старый 19.05.2011, 12:55   #3
hardorsoft
Пользователь
 
Регистрация: 13.05.2011
Сообщений: 35
По умолчанию

Введите строку s1-> Word
Введите строку s2-> War


Проверка1 Word

Ошибка сегментирования

Т.е. Все тоже самое
Нет проблема не в том что вводимые символы разные.
Решенные мною и не только задачи на Си можно смотреть здесь:
http://cirishen.blogspot.com/

Последний раз редактировалось hardorsoft; 19.05.2011 в 13:04.
hardorsoft вне форума Ответить с цитированием
Старый 19.05.2011, 13:39   #4
hardorsoft
Пользователь
 
Регистрация: 13.05.2011
Сообщений: 35
По умолчанию

Ни у кого ни каких идей?
Решенные мною и не только задачи на Си можно смотреть здесь:
http://cirishen.blogspot.com/
hardorsoft вне форума Ответить с цитированием
Старый 19.05.2011, 14:19   #5
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Во-первых, main() должна быть int.
squeeze тоже должна иметь тип. Судя по вызову -- void, но тогда не нужен return в теле функции. И она должна быть объявлена _до_ ее использования, перед main.

А по поводу ошибки -- она в squeeze.
Ради интереса, вставь в самый внутренний цикл печать значений индексов i, j, k.
Очень удивишься -)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 19.05.2011, 15:17   #6
hardorsoft
Пользователь
 
Регистрация: 13.05.2011
Сообщений: 35
По умолчанию

Спасибо. Переписал функцию вроде бы все работает.
Код:
/*
  Вариант функции squeeze(s1,s2), который удаляет из строки s1
каждый символ, совпадающий с каким-либо символом строки s2. 
*/
#include <stdio.h>
#define LIM 10
#define YES 1
#define NO  0

squeeze(char s1[LIM], char s2[LIM])
{
  int i, j, k;
  int skip;
  for(i = k = 0; s1[i] != '\0'; i++)
  {
    skip = NO;
    for(j = 0; s2[j] != '\0'; j++)
    {
      if(s1[i] == s2[j]) skip = YES;
    }
    if(skip != YES)
      s1[k++] = s1[i];
  }
  s1[k] = '\0';
  printf("\n\nИтог -> %s\n", s1);
}


int main()
{
  int i;
  char c;
  char s1[LIM], s2[LIM];
  
  printf("Введите строку s1-> ");
  scanf("%s", s1);
  
  printf("Введите строку s2-> ");
  scanf("%s", s2); 
  
  printf("\n\nПроверка1 %s", s1);
  printf("\n\nПроверка2 %s", s2);
  squeeze(s1, s2);
  
}
Спасибо.
Решенные мною и не только задачи на Си можно смотреть здесь:
http://cirishen.blogspot.com/
hardorsoft вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка компиляции ALEX INCORPORATEED Помощь студентам 7 14.09.2012 00:46
Ошибка компиляции ddd329 Общие вопросы C/C++ 1 10.06.2010 20:31
C++ ошибка компиляции Seil_29 Помощь студентам 9 20.12.2009 22:23
Ошибка компиляции ImmortalAlexSan C++ Builder 3 20.12.2009 21:19
Ошибка компиляции С++ jeka101 Общие вопросы C/C++ 3 27.03.2009 19:16