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:
Rahatsız ediyorum kusura bakmayın şu koda göre uyarlanabilir mi?
Çünkü benim yazdığım kodda argümanıda gönderiyor
Biliyorum tam anlatamadım run_command olan kısmı atarsam daha iyi anlayabilirsiniz.
C:
#ifndef COMMANDS_H
#define COMMANDS_H

#include <drivers/screen.h>
#include <libc/string.h>
// commands


void help() { printf("\nHelp\n"); color_print("echo: Prints text on the screen.\nclear: Clears the screen.", BLUE_COL); }
void clear(){ clear_screen(); reset_screen(); }
void echo(char *argg){ printf("\n"); printf(argg); }

// Commands with names
 struct {
  char *name;
  void (*func)();
} function_map [] = {
  { "help", help },
  { "clear", clear },
  { "echo", echo },
};
// run command with name
int run_command(char *name)
{
 
  int i;

  for (i = 0; i < (sizeof(function_map) / sizeof(function_map[0])); i++) {
    if (!strcmp(function_map[i].name, name) && function_map[i].func) {
      function_map[i].func();
      return 0;
    }
  }
   // if command not found log error
   color_print("\nCommand ",RED_COL);
   color_print(name, RED_COL);
   color_print(" not found. \n Type help to see all commands.", RED_COL);
}


#endif // COMMANDS_H
 
Ne yapmak istediğinizi tam olarak anlayamadım. Detaylı anlatırsanız yardımcı olmaya çalışırım.
 
Ne yapmak istediğinizi tam olarak anlayamadım. Detaylı anlatırsanız yardımcı olmaya çalışırım.
attığım run_command fonksiyonunun bulunduğu kodda
C:
void help() { printf("\nHelp\n"); color_print("echo: Prints text on the screen.\nclear: Clears the screen.", BLUE_COL); }
void clear(){ clear_screen(); reset_screen(); }
void echo(char *argg){ printf("\n"); printf(argg); }
gibi shell kodlarım bulunuyor.
C:
int run_command(char *name)
{
 
  int i;

  for (i = 0; i < (sizeof(function_map) / sizeof(function_map[0])); i++) {
    if (!strcmp(function_map[i].name, name) && function_map[i].func) {
      function_map[i].func();
      return 0;
    }
  }
   // if command not found log error
   color_print("\nCommand ",RED_COL);
   color_print(name, RED_COL);
   color_print(" not found. \n Type help to see all commands.", RED_COL);
}
burada ise shell komutlarını isime göre çalıştırıyorum.
Örn;
gelen veri
echo test
ise echo komutunu çalıştırır ve test argümanını yollar bu sayede ekrana test yazdırır
sistem böyle çalışıyor
şu konuyada bakabilirsiniz
 
Çalıştırmak istediğiniz komutu function_map kullanmadan yapabilirim. Onun dışında yardımcı olamam iş biraz pointer içeriğine giriyor.
 
sorun değil, yapabilirseniz çok sevinirim.
Bu arada ne istediğimi anlatabildim değil mi?
Sanırım string de echo geçiyorsa karşındaki kelimeyi echo fonksiyonuna gönderip ekrana yazdırmak istiyorsun?
 
Ne yapmak istediğini anladım, birazdan kodu gönderirim.
--
Kodunu hata vermemesi için kendime göre düzenledim. Sende kendine göre düzenleyip kullanabilirsin.

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)
    {
        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 naber;echo iyi;help;komut_hata";

    token = strtok(shell_buffer, ";");

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

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