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:
1633452654195.png

çalışmıyor

ve manuel olarak eklemeden yapabileceğim bir yol var mı?
 
Son düzenleme:
1.jpg

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?
1633454400379.png

Eki Görüntüle 1181448

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;
}
 
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
1633517569312.png

boşluk bırakmadığımda hata vermiyor onu nasıl düzeltebilirim?
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));
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;
}
 

Yeni konular

Geri
Yukarı