2012-11-21 20 views
25

Ben bir dize (bir char*) ayrıştırma ve ben, çiftlerde içine dize numaraları ayrıştırmak şöyle etmek sscanf kullanıyorum:sscanf tarafından okunan karakterlerin sayısını alın?

// char* expression; 
double value = 0; 
sscanf(expression, "%lf", &value); 

Bu harika çalışıyor, ancak o zaman ayrıştırma devam etmek istiyorum geleneksel araçlarla dize. El ile ayrıştırma işlemimi yeni ofsetten devam ettirebilmem için sscanf tarafından kaç karakter ayrıştırıldığını bilmem gerekiyor.

Açıkçası, en kolay yolu bir şekilde karakterlerin sscanf ayrıştırır sayısını hesaplamak için olurdu ama yapmak basit bir yolu varsa, o ben alternatif çifte ayrıştırma seçenekleri açık am. Ancak, şu anda sscanf kullanıyorum çünkü hızlı, basit ve okunabilir. Her iki durumda da, çifliği değerlendirip sonra ayrıştırmaya devam etmenin bir yoluna ihtiyacım var.

cevap

39

Sen Biçim belirteci %n kullanıp sscanf() için ek int * argüman sağlayabilir: C99 standardından biçim belirteci n için

int pos; 
sscanf(expression, "%lf%n", &value, &pos); 

Açıklama:

Hiçbir giriş tüketilmektedir. Karşılık gelen argüman, bu çağrıya göre fscanf işlevi işlevine kadar giriş akışı üzerinden okunacak karakter sayısına yazılacak olan işaretli tamsayıya bir işaretçi olmalıdır. Bir %n yönergesinin yürütülmesi, fscanf işlevinin yürütülmesinin tamamlanmasından sonra döndürülen atama sayısını artırmaz. Hiçbir argüman dönüştürülmez, ancak biri tüketilir. Dönüşüm belirtimi, bir atama bastırma karakteri veya alan genişliği içeriyorsa, davranış tanımlanmamıştır.

zaman atamaları yapılmıştır sağlamak için sscanf() dönüş değeri kontrol etmek ve daha sonra kodu, değerleri değişmemiştir yanlışlıkla proses değişkenlerini does not:

/* Number of assignments made is returned, 
    which in this case must be 1. */ 
if (1 == sscanf(expression, "%lf%n", &value, &pos)) 
{ 
    /* Use 'value' and 'pos'. */ 
} 
+0

[Microsoft uygulaması] (https://msdn.microsoft.com/en-us/library/t6z7bya3.aspx?f=255&MSPPError=-2147217396) gibi çalışmasını bu şekilde yapamıyorum. sscanf_s (p, "% s% d \ n% n", toString, (int) _countof (toString), & itemCount, &pos); "Pos" hiç değişmiyor gibi görünüyor. – c00000fd

2
int i, j, k; 
char s[20]; 

if (sscanf(somevar, "%d %19s %d%n", &i, s, &j, &k) != 3) 
    ...something went wrong... 

değişken k karakter sayısı bulunur j'da depolanan tamsayı'nın sonuna kadar tarandı.

%n'un başarılı dönüşümlerde sayılmadığını unutmayın. Gerekirse, biçim dizesinde %n'u birkaç kez kullanabilirsiniz.

İlgili konular