Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Криво выводит английский текст 
V
    Опции темы
xreal
Дата 11.4.2011, 02:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Здравствуйте! Написал маленькую программку. И всё бы нормально, да выводит текст она криво, причём текст на английском. Я уже перепробовал всё что можно, а результат нулевой. Подскажите, что не так пожалуйста. Программка анализирует свой собственный исходный код и ищет в нём ключевые слова, ну и выводит их. 

Интересует функция out_lex, самое забавное, что lex[] в дебагере нормальный принимается, а выводит какую-то ахинею...
 
Код

//#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>

char *KeyWords[] = 
{
    "auto", 
    "break",
    "case", 
    "char", 
    "const",
    "const", 
    "continue",
    "default",
    "define", 
    "do", 
    "double", 
    "else", 
    "enum", 
    "extern", 
    "float", 
    "for", 
    "goto", 
    "if", 
    "include",
    "int", 
    "long", 
    "register", 
    "return", 
    "short", 
    "signed", 
    "sizeof", 
    "static", 
    "struct", 
    "switch", 
    "typedef", 
    "union", 
    "unsigned", 
    "void", 
    "volatile", 
    "while",
    "printf",
};

int nKeyWords = sizeof(KeyWords) / sizeof(KeyWords[0]);    

char *find_keyword(char *line)
{    
    char result[256];
    for (int col=0; col<256;col++) {
            result[col]='\0';
        }

    char words[256][256];
    for (int row=0; row<256;row++) {
        for (int col=0; col<256;col++) {
            words[row][col]='\0';
        }
    }
    
    int indx=0;
    int i,l;
    i=l=0;
    while (line[i]!='\0') {
        if (line[i]=='"') {
            i++;
            while(line[i]!='"') i++;
        }
        if (line[i] >= 'a' && line[i] <= 'z') {
            words[l][indx++]=line[i++];
        }
        else {
            l++;
            indx=0;
            i++;
        }
    }
    int buf=0;
    for (int z=0; z<=l; z++) {
        for (int r=0; r<nKeyWords; r++) {
            if(strcmp(words[z], KeyWords[r])==0) {
                int i = 0;
                int count = 0;
                for(i=0; result[i]!='\0'; i++) count++;
                i=0;
                while (words[z][i]!='\0') result[count++]=words[z][i++];
                result[count++]=' ';
                buf=count;
            }
        }
    }
    if (result[0]!='\0') return result;
    else return 0;
}


void out_lex(char lex[])
{
    int i;
    puts(lex);
    printf("\n"); 
}

int main(int argc, char *argv[])
{
    FILE *inp;
    int c;
    char strs[256];
    for (int i=0; i<256;i++) strs[i]='\0';
    int strind = 0;

    if((inp = fopen("lab11.cpp", "r"))==NULL) 
    {
        printf("There is no input file!\n");
        return 0;
    }

    while((c = fgetc(inp))!= EOF) 
    {
        if(c!='\n') {
            strs[strind++]=c;
        }
        else {
            strs[strind++]='\0';
            char *keyword = find_keyword(strs);
            if (keyword!='\0') {
                out_lex(keyword);
            }
            strind=0;
        }
    }
}


PM MAIL   Вверх
borisbn
Дата 11.4.2011, 02:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 4875
Регистрация: 6.2.2010
Где: Ростов-на-Дону

Репутация: 21
Всего: 135



Цитата(xreal @  11.4.2011,  02:17 Найти цитируемый пост)
 char result[256];

ты создал переменную result на стеке. при выходе из ф-ции все переменные стека несуществуют, а ты возвращаешь указатель на неё:
Цитата(xreal @  11.4.2011,  02:17 Найти цитируемый пост)
 if (result[0]!='\0') return result;

поэтому keyword
Цитата(xreal @  11.4.2011,  02:17 Найти цитируемый пост)
 char *keyword = find_keyword(strs);

указывает на несуществующую память.
А то, что в отладчике показывает правильно - не повезло.

и ешё
Цитата(xreal @  11.4.2011,  02:17 Найти цитируемый пост)
if (keyword!='\0') {

лучше сравнивать с нулём, а не с символом нуля, т.к. keyword - это не символ, а указатель

советую посмотреть в сторону std::string. Намного проще будет жить smile

Это сообщение отредактировал(а) borisbn - 11.4.2011, 02:34


--------------------
Женщины отличаются от программистов тем, что у них чары состоят из стрингов
PM MAIL Jabber   Вверх
xreal
Дата 11.4.2011, 02:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 96
Регистрация: 25.12.2009

Репутация: нет
Всего: нет



Огромное спасибо, как я сам не додумался))
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.