Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 38, средняя оценка - 4.95
blaze
Сообщений: n/a
#1

Сравнение строк и работа с таймером - C++

19.06.2007, 12:18. Просмотров 4636. Ответов 9
Метки нет (Все метки)

Доброе время суток!

Есть такая задача: Пусть имеется два файла, в каждом из которых информация разбита по 6-ти столбцам, произведите соединение строк этих файлов по совпадению указанных с терминала столбцов.

Вот так пытался ее решить (на Bouilder):
C++
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
//---------------------------------------------------------------------------
#include <vcl.h>
#include <stdio.h>
#include <string.h>
#include <vector>
#pragma hdrstop
//---------------------------------------------------------------------------
 
#pragma argsused
main(){
    FILE *input, *output;
    using namespace std;
    string A[3][6];
    string B[3][6];
    int i = 0;
    int f_column;
    input = fopen("file_1.txt", "r");
 
    if(input){
        while(fscanf(input, "%s %s %s %s %s %s",&A[i][0],&A[i][1],&A[i][2],&A[i][3],&A[i][4],&A[i][5])==6){
            i++;
        }
    }else{
        printf("Error while opening file 1");
    }
    fclose(input);
    input = fopen("file_2.txt", "r");
 
    if(input){
        while(fscanf(input, "%s %s %s %s %s %s",&B[i][0],&B[i][1],&B[i][2],&B[i][3],&B[i][4],&B[i][5])==6){
            i++;
        }
    }else{
        printf("Error while opening file 2");
    }
 
    fclose(input);
 
    printf("Enter column number: ");
    scanf("%i", &f_column);
 
    output = fopen("file_3.txt", "w");
    string a, b;
    for(i=0;i<=3;i++){
        a = A[i][f_column];
        b = B[i][f_column];
        if(strstr(a, b)){
            fprintf(output, "%s %s  %s  %s  %s  %s  %s  %s  %s  %s  %s  %s", &A[i][0], &A[i][1], &A[i][2], &A[i][3], &A[i][4], &A[i][5], &B[i][0], &B[i][1], &B[i][2], &B[i][3], &B[i][4], &B[i][5]);
        }
    }
    fclose(output);
    //printf("Do you to exit?");
    scanf("%s", &A[0][5]);
    return 0;
}
//---------------------------------------------------------------------------
Но происходит ошибка в "if(strstr(a, b)){". Подскажите, пожалуйста, как ее решить? Если не ошибаюсь, то strstr требует char, а не string.. Или может я не прав. Если кому не трудно, предложите грамотное решение этой задачки, ведь тут в идеальном варианте нужен динамеческий массив!

И еще есть такая задачка: Создайте программу, которая - либо

1) каждые 2 минуты, либо
2) в указанное время, либо
3) с выходом из диалогового режима терминала- будет производить добавление к счетчику введенного с терминала целого числа;

выдавайте приглашение, прибавлять число или нет, а также проверяйте, является введенное значение числом.

Тут как-то надо создать таймер и функцию перехвата события, когда закрывают окно терминала, чего тоже не знаю. Помогите, пожалуйста, с этим!

Заранее премного благодарен!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.06.2007, 12:18     Сравнение строк и работа с таймером
Посмотрите здесь:

C++ Сравнение строк
Сравнение строк C++
C++ Сравнение строк
C++ Сравнение строк
C++ Сравнение 2 строк
C++ Сравнение строк
сравнение строк C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
blaze
Сообщений: n/a
19.06.2007, 16:00     Сравнение строк и работа с таймером #2
Разобрался с первым заданием.. Только вопрос небольшой возник.. А как объединить строки в одну?
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
19.06.2007, 17:05     Сравнение строк и работа с таймером #3
если используются строки из STL (а судя по коду именно они и используются), то их можно соединять при помощи оператора +
C++
1
2
3
string str1 = "aaa";
string str2 = "bbb";
string str3 = str1 + str2;
для строковых массивов char[x] / char* используются методы strcat, strncat

Удачи,
Владимир
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
19.06.2007, 17:12     Сравнение строк и работа с таймером #4
зачем использовать strstr если вы работаете с экземплярами класса string?
у этих объектов есть более удобные методы поиска подстроки: find, rfind, find_first_of, find_last_of и др.

для сравнения строк представленных объектами класса string достаточно воспользоваться оператором ==
C++
1
2
3
4
5
6
string str1 = "aaa";
string str2 = "aaa";
if (str1 == str2)
{
    //....
}
С уважением,
Владимир
blaze
Сообщений: n/a
19.06.2007, 17:37     Сравнение строк и работа с таймером #5
Странно, когда я объединяю строки при помощи "+", то С++ выдает ошибку [C++ Error] Main_Unit.cpp(54): E2093 'operator+' not implemented in type 'string' for arguments of the same type
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
20.06.2007, 06:47     Сравнение строк и работа с таймером #6
попробуй включить следующий инклуд:
#include <string>
не уверен, но возможно #include <string.h> стоит исключить
Удачи,
Владимир
blaze
Сообщений: n/a
20.06.2007, 14:03     Сравнение строк и работа с таймером #7
Строки объединить получилось, только теперь другая проблема возникла. Вместо слов, которые были в переменных, при объединении я получаю на выходе несколько каких-то непонятных символов.

Есть такие переменные:
C++
1
2
3
    string A[3][6];
    string B[3][6];
    string a;
В a я объединяю строки. Например так a = A[0][1] + B[3][1];.. printf("%s", &a) выводит вместо слов, 3 символа. Если я сделаю a.insert(a.length(), A[0][1]); a.insert(a.length(), B[3][1]); то printf опять выводит 3 символа.

В чем может быть проблема?
blaze
Сообщений: n/a
20.06.2007, 14:19     Сравнение строк и работа с таймером #8
Вот выкладываю немного измененный код:
C++
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
//---------------------------------------------------------------------------
#include <vcl.h>
  #include <stdio.h>
  #include <string>
  #include <vector>
  #pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
  int main(){
  using namespace std;
  FILE *input, *output;
  string A[3][6];
  string B[3][6];
  string a;
  int i = 0;
  int j = 0;
  int f_column;
  input = fopen('file_1.txt', 'r');
 if(input){
  while(fscanf(input, '%s %s %s %s %s %s',&A[i][0],&A[i][1],&A[i][2],&A[i][3],&A[i][4],&A[i][5])==6){
  i++;
  }
  }else{
  printf('Error while opening file 1');
  }
  fclose(input);
  input = fopen('file_2.txt', 'r');
 if(input){
  while(fscanf(input, '%s %s %s %s %s %s',&B[i][0],&B[i][1],&B[i][2],&B[i][3],&B[i][4],&B[i][5])==6){
  i++;
  }
  }else{
  printf('Error while opening file 2');
  }
 fclose(input);
 printf('Enter column number: ');
  scanf('%i', &f_column);
 a = A[1][1]+A[1][5];
  printf('%s', a);
 output = fopen('file_3.txt', 'w');
 for(i=0;i<3;i++){
  if(strstr(A[i][f_column].c_str(), B[i][f_column].c_str())){
  for(j=0; j<=5;j++){
  a += A[i][j];
  a += '    ';
  //printf('%s', &A[i][j]);
  }
 for(j=0;j<=5;j++){
  a += B[i][j];
  a += '    ';
  }
  a += '';
  }
  }
 fprintf(output, '%s', &a);
  fclose(output);
 return 0;
  }
  //-----------------------------------------------------------------------------//
boombastik
7 / 7 / 0
Регистрация: 13.02.2007
Сообщений: 1,255
21.06.2007, 15:38     Сравнение строк и работа с таймером #9
printf("%s", &a) - по-моему это не верно, вы передаете указатель на объект класса string и говорите printf, что это строка, безопаснее и правильнее использовать метод класса c_str(), который вы уже, судя по коду знаете: printf("%s", a.c_str())



впрочем, проблема может быть и в другом, надо попробовать откомпилировать код, только я не представляю что лежит в файлах: file_1.txt и file_2.txt



я бы вообще не использовал scanf и printf, а пользовался стандартными потоками ввода/вывода C++ библиотеки STL, а не функциями C, потому как последние предполагают, что они работают с массивами символов char[] / char*, а вы скармливаете им экземпляры класса string



С уважением,

Владимир
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.06.2007, 23:00     Сравнение строк и работа с таймером
Еще ссылки по теме:

Сравнение строк C++
Сравнение строк C++
Сравнение строк C++
Работа с матрицей. Сравнение строк и столбцов C++
Сравнение строк C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
blaze
Сообщений: n/a
21.06.2007, 23:00     Сравнение строк и работа с таймером #10
Да, с & была ошибочка, но и не в ней дело. Все равно появляются непонятные символы вместо слов! Причем, если в переменную a (string a записать например слово "test", то printf("%s", a.c_str()); выведет это слово нормально. Так же можно спокойной объединить строки a.insert(a.length(), " testin' again..."); и printf все нормально выведет.

Это что касается a, а по поводу A[][] и B[][], в которые строковые значения считываются из файла при помощи функции fscanf(...), то тут уже все иначе. И printf уже не работает так, как с a. Чтобы например вывести A[1][1] надо писать так printf("%s", &A[1][1]);.. Т.е. тут уже не работает вариант с c_str(). Никак не могу понять почему, ведь типы данных одинаковые, а работают совершенно по-разному!



Наверное по этой самой, непонятной, причине и не получается объединять строки a и A[][] или в противном случае на выходе получается набор из нескольких непонятных символов!



И про содержание файлов. Это текстовые файлы, в которых слова разделены табуляцией. Всего в них 6 столбцов и 3 строки (для начала).
Yandex
Объявления
21.06.2007, 23:00     Сравнение строк и работа с таймером
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru