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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.12.2010, 09:29   #1
qip2005
Пользователь
 
Регистрация: 14.09.2008
Сообщений: 61
По умолчанию Букву "я" принимает за EOF

Добрый день товарищи Сишники.
Нужно было написать прогу, для поиска ошибок в ассемблеровском коде, которая бы использовала бинарный поиск. Саму прогу я организовал, только на букву "я" она реагирует не так как хотелось бы. То есть если дать ей на вход след файл:
Код HTML:
add
dec
jmp
jnesd
movo
   not  


pop
push
sub
  яxor
то на выходе символ "я" будет принят как конец и отдельной строкой выведен как Еррор.
Код HTML:
add,1
dec,2
jmp,3
[!..Error..!]: jnesd
[!..Error..!]: movo
   not,6
[!..Error..!]: 
[!..Error..!]: 
pop,7
push,8
sub,9
[!..Error..!]:   
xor,10
Вот сам листинг:
Код:
#include <iostream.h>
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

//===============================================

int main(void) { 
  char c, buf [1024];
  int i,j,k,n;
  int  vpered, nazad, sered, cmp;
  bool flag;
  FILE *in, *out;
   struct {
       char komanda[10];
       int code;
    }   table [] = {
            {"add",1},
            {"dec",2},
            {"jmp",3},
            {"jne",4},
            {"mov",5},
            {"not",6},
            {"pop",7},
            {"push",8},
            {"sub",9},
            {"xor",10},             			
        };
//===============================================
   in=fopen ("in.txt", "r");
  out=fopen ("out.txt","w+");

//===============================================

   while (!feof(in)) {
        i=0;
		//считывание одну строку посимволно в buf
        for (;;) {
            c = fgetc(in);			
            if (c=='\n' || c==EOF) break;
            buf[i++] = c;
        } 

        buf[i]=0;

        j=0;
        while (isspace(buf[j])) j++; //пропуск пробелов в начале строки
          k=j;
        while (isalnum (buf[k])) k++; //принадлежность к алфавитноцифровым
          buf[k] = 0;

        vpered = 0;
        nazad = sizeof (table)/sizeof(table[0]);
        flag = false;
        //алгоритм двоичного поиска
		
        while (vpered <= nazad) {
            sered = (nazad+vpered)/2;
            cmp = stricmp(buf+j,table[sered].komanda); //сравн. независимо от регистра

            if (cmp==0) {
                flag = true;
                break;
            }
            else if (cmp<0)    nazad = sered -1;            
                else    vpered = sered+1;
     
        }
		
        if (flag) 
		         fprintf (out,"%s,%d\n", buf, table[sered].code);
            else
                fprintf (out,"[!..Error..!]: %s\n", buf);
    
    }
	
 //===============================================
 fclose(in); 
 fclose(out);
 
  cout << "\nPrograma vipolnena uspeshno, rezul'tat nahodetsya v fayle - out.txt\n" ;
  cout << "        Nazhmite lubuyu knopku" ;
  
  getch();

        return 0;
}

Последний раз редактировалось Stilet; 09.12.2010 в 21:06.
qip2005 вне форума Ответить с цитированием
Старый 09.12.2010, 18:23   #2
qip2005
Пользователь
 
Регистрация: 14.09.2008
Сообщений: 61
По умолчанию

Народ плиз, очень важно и очень нужно.
qip2005 вне форума Ответить с цитированием
Старый 09.12.2010, 21:56   #3
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Просто функции
isalnum
stricmp
не учитывают русский язык, а работают в пределах A-Z, a-z, 0-9

Последний раз редактировалось oleg.v; 09.12.2010 в 22:23. Причина: ю
oleg.v вне форума Ответить с цитированием
Старый 10.12.2010, 09:27   #4
qip2005
Пользователь
 
Регистрация: 14.09.2008
Сообщений: 61
По умолчанию

Суть не в том. Я убрал этот кусок с isalnum.Он в общем то бесполезный.
Суть в том, что ASCII код этого символа "я"= -1. Причем непонятно что ему не нравится. Были предложения вместо char использовать unsigned char, но че то ошибка памяти вылетает, да и не совсем я понимаю что это даст.
Нужны предложения как помочь ему понять "я"?
Повторюсь,что с остальными русскими символами все гуд. Вот например:
Входной:
Код:
add
dec
аjmp
jnesd
movo
   not  


pop
push
sub
  xor
Выходной:
Код:
add,1
dec,2
[!..Error..!]: аjmp
[!..Error..!]: jnesd
[!..Error..!]: movo
[!..Error..!]:    not  
[!..Error..!]: 
[!..Error..!]: 
pop,7
push,8
sub,9
  xor,10
То есть в еррор "аjmp" вся команда попала, а если на вход даю такой файл:
Код:
add
dec
яjmp
jnesd
movo
   not  


pop
push
sub
  xor
То на выходе получаю вот такой бред:
Код:
add,1
dec,2
[!..Error..!]: 
jmp,3
[!..Error..!]: jnesd
[!..Error..!]: movo
[!..Error..!]:    not  
[!..Error..!]: 
[!..Error..!]: 
pop,7
push,8
sub,9
  xor,10
То есть "я" не выводит, но говорит что там хреновый символ, а вот "jmp" типа вообще отдельная команда и в ней все ОК.
qip2005 вне форума Ответить с цитированием
Старый 10.12.2010, 09:37   #5
Cpluser
Форумчанин
 
Аватар для Cpluser
 
Регистрация: 16.02.2009
Сообщений: 555
По умолчанию

А так можете проверят букву "я".
Код:
	char buf='я';
	int ya =(int)buf;
	if(ya==-1)
		cout<<"Bykva ya"<<endl;
	else
		cout<<"Chtot drygoe"<<endl;
Cpluser вне форума Ответить с цитированием
Старый 10.12.2010, 09:55   #6
qip2005
Пользователь
 
Регистрация: 14.09.2008
Сообщений: 61
По умолчанию

Так могу проверить, пишет что я. Но прикол в том, что EOF==(-1). То есть делать проверку на -1 и писать в файл Error не вариант. Надо именно эту "я" отловить, а конец файла оставить на месте.
Я понял чем может помочь unsigned char, неясно почему ошибочка памяти вылетает.

Последний раз редактировалось qip2005; 10.12.2010 в 10:05.
qip2005 вне форума Ответить с цитированием
Старый 11.12.2010, 00:42   #7
oleg.v
Пользователь
 
Регистрация: 24.11.2010
Сообщений: 80
По умолчанию

Возможно я не правильно высказался. Попытаюсь объяснить.

Буква я

в DOS(866) кодировке = EF
в WIN(1251) кодировке = FF

В шестнадцатеричном формате EF и FF. В первом случае оно её распознаёт во втором нет.

Тоесть тут зависимоть от того как входной файл оформить. Если в DOS, то будет всё нормально. А если через виндовую кодировку то будет затык.
oleg.v вне форума Ответить с цитированием
Старый 11.12.2010, 00:53   #8
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

быть может, просто проверку на EOF убрать? или как-то переопределить 'я'
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 11.12.2010, 00:54   #9
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

вариант с getline() не катит?
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как обойти "преобразование типа из "string" в "float" невозможно" lexluter1988 Помощь студентам 1 07.08.2010 12:23
"ОКРВВЕРХ", "ОКР", "ЕСЛИ". Как бы их связать. Каравай Microsoft Office Excel 13 17.02.2010 09:53
Дана строка, состоящая из нескольких слов. Найти количество слов, которые содержат хотя бы одну букву "А" Mashaa Помощь студентам 13 09.12.2009 13:28
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04