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:
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]
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.
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.
 
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:

Yeni konular

Geri
Yukarı