2011-12-01 13 views
7

foo(char *str) işlevim, str değerini alır; bu, null sonlandırılmış yeni satır karakterleri olan çok satırlı bir dizidir. Dize boyunca yineleyen ve bir satırda çalışan bir süre döngü yazmaya çalışıyorum. Bunu başarmanın iyi bir yolu nedir? Çok satırlı bir dizede çizgiler arasında geçiş yapmanın iyi bir yolu nedir?

void foo(char *str) { 
    while((line=getLine(str)) != NULL) { 
     // Process a line 
    } 
} 

Ben getLine kendim uygulamak gerekir ya da benim için bunu yapmak için bir dahili işlev var mı?

+1

Yerleşik bir 'getline' var, ancak istediğiniz gibi değil. Bir dosyadan bir defada bir satır almak için. – Kevin

cevap

2

Yeni satır karakterini temel alarak bir tür ayrıştırma gerçekleştirmeniz gerekecektir. strtok() bir "\ n" sınırlayıcısı ile aradığınız şey gibi bir şey yapan oldukça iyi bir seçenektir, ancak sizin örneğinizden biraz farklı şekilde kullanılması gerekir. Ancak, bu Strtok belirtmeliyiz

char *tok; 
char *delims = "\n"; 
tok = strtok(str, delims); 

while (tok != NULL) { 
    // process the line 

    //advance the token 
    tok = strtok(NULL, delims); 
} 

yıkıcı ve ÅŸan değil hem) (: daha gibi olurdu.

void foo(char *str) 
{ 
    char *line = strtok(str, "\n"); 
    while(line) 
    { 
     //work with line, which contains a single line without the trailing '\n' 
     ... 

     //next line 
     line = strtok(NULL, "\n"); 
    } 
} 

Ama (bu str içeriğini değiştirir akılda tutmak:

1

ben size durumda, yeni satır karakteri bazı özel karakterleri ile sınırlanmış paketler içine dizesini sıfırlar strtok, kullanabileceğini düşündüğünüz aslında s ile '\n' s değiştirir, daha fazla ihtiyacınız varsa, daha önce bir kopyasını yapmak isteyebilirsiniz.

0

Sen getLine işi yapmak için fgets kullanabilirsiniz:

+0

Bir dosyadan ziyade bir dize satırlarını okumak istiyor. C'nin dize akışları olup olmadığından emin değilim. –

+0

@ChristianRau C'nin stringstream işlevi yoktur, ancak bunları kullanmayan 'fgets' özelliği vardır. Ancak, OP'nin bir dosyadan değil, bir dizeden çizgiler istediği doğru. – Kevin

+0

@Kevin Sadece bir dize için bir dosya tanıtıcısı oluşturmanın bir yolu olabileceğini düşündüm, bu bir dize akışının C-yolu olacaktır. –

1

http://linux.die.net/man/3/fgets Sooo ... biraz geç, ancak aşağıda @ debeer en ve @Christian Rau en cevabın bir yeniden giriş versiyonu - strtok_r yerine strtok dikkat edin. Bu, farklı dizeleri kullanarak birden çok ileti dizisinden çağrılabilir.

char *tok; 
char *saveptr; 
char *delims = "\n"; 
tok = strtok_r(str, delims, &saveptr); 

while (tok != NULL) { 
    // process the line 

    //advance the token 
    tok = strtok_r(NULL, delims, &saveptr); 
} 

o dize tokenised ediliyor değiştirir olarak hala yıkıcı olduğuna dikkat edin.

İlgili konular