Сравнение строк и работа с таймером
Релиб
Форумы       Участники    Календарь    Кто он-лайн?
Добро пожаловать, гость ( Вход | Регистрация )
        



Сравнение строк и работа с таймером Expand / Collapse
Автор
Сообщение
19.06.2007 8:18


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
Доброе время суток!

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

Вот так пытался ее решить (на Bouilder):
//---------------------------------------------------------------------------
#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\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%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) с выходом из диалогового режима терминала- будет производить добавление к счетчику введенного с терминала целого числа;
выдавайте приглашение, прибавлять число или нет, а также проверяйте, является введенное значение числом.

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


Заранее премного благодарен!
Сообщ. #914192
19.06.2007 12:00


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
 Разобрался с первым заданием.. Только вопрос небольшой возник.. А как объединить строки в одну?
Сообщ. #914196
19.06.2007 13:05
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 09.07.2008 2:17
Сообщ.: 1 298, Visits: 12 500
если используются строки из STL (а судя по коду именно они и используются), то их можно соединять при помощи оператора +


string str1 = "aaa";
string str2 = "bbb";
string str3 = str1 + str2;


для строковых массивов char[x] / char* используются методы strcat, strncat

Удачи,
Владимир
Сообщ. #914199
19.06.2007 13:12
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 09.07.2008 2:17
Сообщ.: 1 298, Visits: 12 500
зачем использовать strstr если вы работаете с экземплярами класса string?
у этих объектов есть более удобные методы поиска подстроки: find, rfind, find_first_of, find_last_of и др.

для сравнения строк представленных объектами класса string достаточно воспользоваться оператором ==


string str1 = "aaa";
string str2 = "aaa";
if (str1 == str2)
{
//....
}


С уважением,
Владимир
Сообщ. #914200
19.06.2007 13:37


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
Странно, когда я объединяю строки при помощи "+", то С++ выдает ошибку [C++ Error] Main_Unit.cpp(54): E2093 'operator+' not implemented in type 'string' for arguments of the same type
Сообщ. #914204
20.06.2007 2:47
Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

модератор
Last Login: 09.07.2008 2:17
Сообщ.: 1 298, Visits: 12 500
попробуй включить следующий инклуд:

#include <string>

не уверен, но возможно #include <string.h> стоит исключить

Удачи,
Владимир

Сообщ. #914220
20.06.2007 10:03


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
Строки объединить получилось, только теперь другая проблема возникла. Вместо слов, которые были в переменных, при объединении я получаю на выходе несколько каких-то непонятных символов.
Есть такие переменные:
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 символа.
В чем может быть проблема?
Сообщ. #914222
20.06.2007 10:19


Supreme Being

Supreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme BeingSupreme Being

участник
Last Login: 12.06.2008 11:23
Сообщ.: 96, Visits: 535
Вот выкладываю немного измененный код:
//---------------------------------------------------------------------------
#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 += "\t";
//printf("%s", &A[i][j]);
}
for(j=0;j<=5;j++){
a += B[i][j];
a += "\t";
}
a += "";
}
}
fprintf(output, "%s", &a);
fclose(output);
return 0;
}
//-----------------------------------------------------------------------------//
Сообщ. #914223