2010-11-18 15 views
1

girişten basit formül dizelerini okuyarak, basit formüller (3*2, 4+10, 50/16, vb. Gibi) girmemiz ve yalnızca toplama, çıkarma ve bit kaydırmayı kullanarak sonucu (ve geri kalanını) hesaplamamız gerekir. . Her neyse, daha sonra gelen üç girdi okumayı kullanabilirdim, ancak formülünü fgets() ve sscanf() kullanarak tek geçişte almayı denedim. İşte ne var:C, bir ev ödevi için

int *v; // value (left side) 
int *m; // modifier (right side) 
char *o; // operant 

int res = sscanf(buffer,"%d%s%d",v,o,m); 

Ama doğal, bu işe yaramazsa, o hiçbir şey m (m değeri ne olursa olsun eşittir nerede ve bildirildiği andan itibaren)

bırakarak dizenin kalan tüm kısmını aldığı için

Şimdi, bunu başarmanın doğru yolu ne olurdu?

NOT: Fazla boşlukları kırpmak için a trim function kullanıyorum.

cevap

2

%s yerine %c'u deneyin. Operatör her zaman tek bir karakter ise ve operatör ile işlenen arasında boşluk yoksa, bu çalışmalıdır.

Bu arada, aslında bir şeye işaret etmek için v, m ve o başlatılıyor mu? Bunu yapmak çok daha iyi olacaktır: benim "giriş C Programlama" profesör olarak

int v; 
int m 
char o; 

int res = sscanf(buffer, "%d%c%d", &v, &o, &m); 

derdi: "C tehlikelidir güvenli C Uygulama!".

+1

Başlangıç ​​değişkenlerinin nasıl bildirildiğini ihmal ettim (başlangıçta işaretçiler değiller, ancak işaretçisini "sscanf()" öğesinin bulunduğu bir işleve iletiyorum) –

+0

Tamam. Sadece kontrol. Bu çok yaygın bir hatadır, sormam gerekti. – Dima

0

Fazla boşluklarınız olmadığından ve işleçlerin tümü bir karakter uzunluğunda olduğundan, o'u doldurmak için %c'u kullanabilirsiniz.

+0

Ben ... bu kolay ve hızlı bir düzeltme olabilirdi, bu yüzden tam bir formül ayrıştırıcısı yazmak zorunda değilim: P –

1

Operatör dizisinin yalnızca operatör karakterleri aldığından emin olmak için %[-+*/] (operatör grubunuzla birlikte) kullanabilirsiniz.