atoi ne kadar sağlıklı

Başlatan papsukkal, 11 Aralık 2024, 22:42:58

papsukkal

Herkese iyi akşamlar.

STM32G030F6 işlemcisini MX CUBE Ide ile  kullanıyorum.

UART üzerinden gelen rakamları integer değişkene tamsayı olarak atamam gerekiyor. İnternetteki forumlar ve yapay zeka "atoi" fonksiyonuna güvenilmeyeceğini ima ediyor. Bu fonksiyonu güvenli kullanmanın bir yöntemi var mı? Ya da yerine kullanılacak başka bir yöntem var mı? Bu işlem en sağlıklı nasıl yapılır?

elektronikhobi

#1
C'de sayılar hem dizge hem de sayısal biçimde saklanabilir.

213 sayısı katar dizgesi olarak '2', '1', '3', '\0' şeklinde saklanabilir. Sayısal biçimde örneğin int olarak saklayabiliriz.

atoi ("alphanumeric to integer") işlevi bir  katar dizgesini alıp tam sayı karşılığını döndürür.

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

int main()
{
    char ileti[] = "5 çayı";
    int saatKacta = atoi(ileti);
    printf("%d\n", saatKacta);
    printf("%s\n", ileti);
    return 0;
}

Bu işlevi C++ ile kullanabilmek için dizgeyi C dizisine çevirmek gerekebilir.

string dizge;

int sayi = atoi(dizge.c_str());

C++11'de C++ dizgeleri ile işlem yapabilen  std::stoi() işlevi bulunuyor.

#include <iostream>
#include <string>

int main()
{
    std::string ileti = "5 çayı";
    int saatKacta = std::stoi(ileti);
    std::cout << saatKacta << "\n";
    std::cout << ileti << "\n";
    return 0;
}
"Yirminci asrın akıllara hayret veren keşiflerinden birisi de hiç şüphesiz transistörlerdir."


papsukkal

@elektronikhobi cevabın için teşekkür ederim. 
Hocam hangisini kullanmak daha verimli olur? Hangisi daha hızlıdır?

elektronikhobi

#3
İkisinin de hızlı olabileceğini düşünüyoruz.

Biri C diğeri C++  ;)

Yazılımda yavaşlık dilden ziyade kullandığımız algoritmadan kaynaklanabilir.

Algoritmalar konusunda Robert Sedgewick'in dersi vardı.

Dersin meşhur sorularından bir tanesi 8 bilmece problemi idi.

Kitabın sayfasına buradan erişebilirsiniz.
"Yirminci asrın akıllara hayret veren keşiflerinden birisi de hiç şüphesiz transistörlerdir."


kimlenbu

sscanf denediniz mi ? Hem atoi'den farklı olarak başarıyla algılanıp çevrilen karakter sayısını döndürür.

Eğer çılgın bir koruma isiyorsanız öncesinde dizideki rakam sayısını kendiniz hesaplatırsınız, float dönüşümü vs olacaksa nokta, virgül'ün problem çıkarmaması için ön kontrollerinizi yaparsınız.

Çevrim sürelerini hiç önemsemedim açıkçası.

papsukkal

Alıntı yapılan: kimlenbu - 16 Aralık 2024, 17:12:11sscanf denediniz mi ? Hem atoi'den farklı olarak başarıyla algılanıp çevrilen karakter sayısını döndürür.

Eğer çılgın bir koruma isiyorsanız öncesinde dizideki rakam sayısını kendiniz hesaplatırsınız, float dönüşümü vs olacaksa nokta, virgül'ün problem çıkarmaması için ön kontrollerinizi yaparsınız.

Çevrim sürelerini hiç önemsemedim açıkçası.

Denemedim. Bilgisayarım bozulduğu için çalışmalarım bekliyor. İnceledim ama. Bilgisayar ayağa kalkarsa deneyeceğim.

Çevrim süresi şunun için önemli

Bluetooth ile işlemci ve telefon haberleşiyorlar. Telefon "orada mısın" diye sorunca işlemci "evet" diyor. Bu cevap 1 ms bile gecikirse data trafiği sekteye uğruyor.