Kodumdaki hata nedir?

nolonger

Hectopat
Katılım
27 Şubat 2021
Mesajlar
153
Bu kodumda ben shell_buffer verisinden argümanları ayırmayı ve ; gelince yeni komuta geçmesini istiyorum fakat şuan sadece ilk komutu alıyor.
Sizce nerde hata yaptım?

[CODE lang="c" title="Kod"]#include <string.h>
#include <stdlib.h>
#include <stdio.h>
using namespace std;
char *c(char *s){
char *comm = strtok(s, " ");
strtok(s, comm);
return s;
};
int main()
{

char shell_buffer[] = "echo naber;echo iyi";
char *token = strtok(shell_buffer, ";");
while( token != '\0' ) {
printf(c(token));
token = strtok('\0', ";");
}

}
[/CODE]
 
Son düzenleyen: Moderatör:


C++:
#define _CRT_SECURE_NO_WARNINGS

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

// Help fonksiyonunu çalıştırmak için
void help()
{
    printf("Help\n");
}

// Ekranı temizlemek için
void clear()
{
    system("cls");
}

// Ekrana bir metni yazdırmak için
void echo(const char* buffer)
{
    printf("%s\n", buffer);
}

// Arama yapmak için gerekli algoritma
int search(const char* metin, const char* aranacak_kelime)
{
    int M = strlen(aranacak_kelime);
    int N = strlen(metin);
    for (int i = 0; i <= N - M; i++)
    {
        int j;
        for (j = 0; j < M; j++)
        {
            if (metin[i + j] != aranacak_kelime[j])
            {
                break;
            }
        }

        if (j == M)
        {
            return i;
        }
    }
    return -1;
}

// Komutu çalıştır
int run_command(char* name)
{
    if (search(name, "echo") != -1)
    {
        if (strlen(name) == 4 && name[0] == 'e' && name[1] == 'c' && name[2] == 'h' && name[3] == 'o')
        {
            printf("echo yazisi girmediniz\n");
        }
        else
        {
            int len = strlen(name) - 5;
            char* icerik = new char[len + 1];
            for (int i = 5, j = 0; i != strlen(name); i++, j++)
            {
                icerik[j] = name[i];
            }
            icerik[len] = 0;
            echo(icerik);
        }
    }
    else
    {
        if (!strcmp(name, "help"))
        {
            help();
        }
        else if (!strcmp(name, "clear"))
        {
            clear();
        }
        else
        {
            printf("Komut bulunamadi.");
        }
    }
    return 0;
}

int main()
{
    char* token;
    char shell_buffer[] = "echo;echo naber;help;komut_hata";

    token = strtok(shell_buffer, ";");

    while (token != NULL)
    {
        run_command(token);
        token = strtok(NULL, ";");
    }

    return 0;
}

Manuel eklemeden çalıştırmak için invoke fonksiyonuna göz atabilirsiniz.
 
new char kısmını şöyle düzenledim ondan hata veriyor olabilir mi?

 
Olabilir, Visual Studio da new char bölümünü silince derleme de işleminde hata oluşuyor.
 
Şu şekilde deneyin.

C++:
char* icerik = (char*)malloc(sizeof(char) * len + 1);
 
Arkadaşlar modern library'i kullanmamaya ant mı içtiniz? _CRT_SECURE_NO_WARNINGS'ler malloc'lar havada uçuşuyor. strtok C'den kalma fonksiyon. Soruna gelirsek;

C++:
std::string shell_buffer = "echo;echo naber;help;komut_hata";

std::list<std::string> commands;
std::size_t str_pos = 0;
std::size_t prev_pos = 0;
while ((str_pos = shell_buffer.find(';', str_pos)) != std::string::npos)
{
    commands.push_back(shell_buffer.substr(prev_pos, str_pos - prev_pos));
    prev_pos = (++str_pos);
}

commands.push_back(shell_buffer.substr(prev_pos));
 
Arkadaş <iostream> ve <string> kütüphaneleri kullanmadığı için böyle bir kod hazırladım yoksa daha basit şekilde de yapabilirdim.
 
@Nexor

boşluk bırakmadığımda hata vermiyor onu nasıl düzeltebilirim?
kütüphane kullanamıyorum.
 
@nolonger Kodunu biraz daha düzenledim.

C++:
#define _CRT_SECURE_NO_WARNINGS

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;

// Help fonksiyonunu çalıştırmak için
void help()
{
    printf("Help\n");
}

// Ekranı temizlemek için
void clear()
{
    system("cls");
}

// Ekrana bir metni yazdırmak için
void echo(const char* buffer)
{
    printf("%s\n", buffer);
}


// Fonksiyon yapısını oluştur
struct Func_Yapisi
{
    const char* name;
    void (*func)();
};

// Fonksiyon varsa çalıştıracak ( Parametresiz olması lazım void asd() )
Func_Yapisi function_map[] =
{
    { "help",   help  },
    { "clear",  clear }
};

// Komutu çalıştır
int run_command(char* name)
{
    // Echo yazısını kontrol et
    if ((name[0] == 'e' || name[0] == 'E') && (name[1] == 'c' || name[1] == 'C') && (name[2] == 'h' || name[2] == 'H') && (name[3] == 'o' || name[3] == 'O'))
    {
        // Sadece echo mu yazdı ?
        if (strlen(name) == 4)
        {
            printf("Kullanim: echo yazi\n");
            return 0;
        }

        // Echo yazısından sonra boşluk var mı kontrol et
        if (name[4] == ' ')
        {
            // Metnin devamı boş mu kontrol edecek
            int total = 0;

            // Boşluktan sonra tüm metin boş mu kontrol et
            for (int i = 5, j = 0; i != strlen(name); i++, j++)
            {
                if (name[i] == ' ')
                {
                    total++;
                }
            }

            // Tüm metin boşsa
            if (total == (strlen(name) - 5))
            {
                printf("echo yazisinin devami bulunmuyor.\n");
                return 0;
            }

            // Metnin uzunluğunu hesapla
            int len = strlen(name) - 5;

            // Yeni bir dize oluştur
            char* icerik = (char*)malloc(sizeof(char) * len + 1);

            // Echo dan sonraki metni kopyala
            for (int i = 5, j = 0; i != strlen(name); i++, j++)
            {
                icerik[j] = name[i];
            }

            // Son satırı bitir
            icerik[len] = 0;

            // Ekrana yazdır
            echo(icerik);

        }
        else
        {
            // boşluk yoksa bilgi ver
            printf("Hatali komut girdiniz: %s\n", name);
        }
    }
    else
    {
        // Döngü yardımı ile fonksiyon var mı kontrol et
        for (int i = 0; i < sizeof(function_map) / sizeof(function_map[0]); i++)
        {
            // Komut varsa çalıştır
            if (!strcmp(function_map[i].name, name))
            {
                function_map[i].func();
                return 1;
            }
        }

        // Fonksiyon yoksa hata ver
        printf("Hatali komut girdiniz: %s\n", name);
    }
    return 0;
}

int main()
{
    char* token;
    char shell_buffer[] = "echoecho selam;echo burak;help;help;test";

    token = strtok(shell_buffer, ";");

    while (token != NULL)
    {
        run_command(token);
        token = strtok(NULL, ";");
    }

    return 0;
}
 
Bu siteyi kullanmak için çerezler gereklidir. Siteyi kullanmaya devam etmek için çerezleri kabul etmelisiniz. Daha Fazlasını Öğren.…