**CLUB İçerisinde Paylaşım Yaparken Dikkat Edilmesi Gereken Önemli Hususlar.** - Paylaşım yaparken Türkçe kurallarına olabildiğince uyulması, sorunuzun rahat anlaşılması ve en hızlı cevabı almanız adına, dikkat edilmesi gereken en önemli husustur. - Paylaşımlarınız da kibar ve yalın bir dil kullanmanız ve gerekirse resim ile eklenti yapmanız, doğru ve hızlı cevap almak adına önemli hususlardır. - Paylaşımları olabildiğince uygun bölümlere açarak, konu ile ilgili kişilerin daha hızlı görmesini sağlamak adına çok önemlidir. - Paylaşımlarda etiket kullanmak o sorunun daha sonra tekrar aranması adına çok önemlidir.
0 beğenilme 0 beğenilmeme
213 kez görüntülendi
C kategorisinde (4,270 puan) tarafından

Start_Motor_001 gibi bir string dizim mevcut. Genel Komutlar bu şekilde gelecek. Ben bunları
Komut
Param1
Param2
olarak bölmek istiyorum. Sanırım strok ile yapabileceğim
Nasıl Yapabilirim ?

(Start ın ve diğerlerinin uzunlukları değişebiliyor)

2 Cevaplar

1 beğenilme 0 beğenilmeme
(4,160 puan) tarafından
tarafından seçilmiş
 
En İyi Cevap

Şöyle bir şey sanırım işiniz görür.

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

int main()
{
   char str[] = "Start_Motor_001";
   char splitChar[] = "_";
   char* part[3];

   char *ptr = strtok(str, splitChar);
   part[0] = ptr;

   ptr = strtok(NULL, splitChar);
   part[1] = ptr;

   ptr = strtok(NULL, splitChar);
   part[2] = ptr;

   printf("%s\n", part[0]); // command
   printf("%s\n", part[1]); // param 1
   printf("%s\n", part[2]); // param 2

   return 0;
}
1 beğenilme 0 beğenilmeme
(3,790 puan) tarafından
tarafından düzenlendi

strtok içeriğinde static değişken tutan bir fonksiyondur. Tehlikelidir. Multiprocess bir sistemde patlaması olasıdır. Bunun için strtok un temelinde şöyle bir değişiklikle kod yazmıştım.
Basitçe bulduğu özel karakterlerin yerini 0 yerleştirip, tüm stringlerin başını kendisine geçilen parsed_list in içine geçiyor.

static  inline uint8_t look_for_perpetrator(char character,
											char *perpetrator_char_list)
{
	uint16_t i, searcher_len;


	searcher_len = strlen(perpetrator_char_list);
	for (i = 0; i < searcher_len; i++) {
		if (character == perpetrator_char_list[i])
			return TRUE;
	}
	return FALSE;
}

#define MAX_NUM_OF_CUSTOM_STRTOK_STRING 20

    uint32_t util_strtok(char *victim_string, char *perpetrator_char_list,
    						char **parsed_list, uint32_t max_num_of_parsing)
    {
    	uint16_t i, j = 0;
    	uint16_t victim_str_len;
    
    
    	victim_str_len = strlen(victim_string) + 1;
    
    	for (i = 0; i < victim_str_len; i++) {
    		if (look_for_perpetrator(victim_string[i], perpetrator_char_list))
    			victim_string[i] = 0;
    	}
    
    	for (i = 0; i < victim_str_len; i++) {
    		if (j >= max_num_of_parsing)
    			return j;
    
    		if (victim_string[i] != 0) {
    			parsed_list[j++] = &victim_string[i];
    			i += strlen(&victim_string[i]);
    		}
    	}
    	return j;
    }

void text_test()
{
	char *parsed_str_list[10] = {0};
	char parser_char_list[] = "[,]";
        char test[] = "[abc,as,";
       uint32_t parse_cnt;

       parse_cnt = util_strtok(test, parser_char_list,  parsed_str_list, 10);
       /*Islem Sonu: 0abc0as*/

}
...