2014-12-15 30 views
11

Başka yerde girilmiş bir dize yazmaya çalışıyorum ve stdin ve fgets ile aldığım bu dizenin bir parçası olarak görünen yeni çizgiyle nasıl başedeceğimi bilmiyorum. Fgets kullanarak yeni bir satır eklemeden girişten nasıl bir dize alabilirim?

char buffer[100]; 
memset(buffer, 0, 100); 
fgets(buffer, 100, stdin); 
printf("buffer is: %s\n stop",buffer); 

Ben fgets yazılı ancak yeni hat kalır ne verilerin çoğunu sınırlayıcı yanı sıra alır veri miktarını sınırlamak için çalıştı. Girilen dizgiyi, başka hiçbir şeyle yazılan son karaktere kadar nasıl alabilirim? linux adam sayfalarından

+0

'scanf ("% 99 [^ \ n]% * c" tampon) benzerleri;' – BLUEPIXY

+0

@ BLUEPIXY 'scanf ("% 99 [^ \ n]% * c ", buffer)' 'char'' '\ n'' ise 'buffer' içine bir şey okumayacaktır. ''\ N'' stdin'de kalır. – chux

+2

Bir satırı okumak ve giriş akışında '\ n'' bırakmak mı yoksa' \ n'' de dahil olmak üzere bir satır okumak ve ardından '' \ n'' iptal etmek ister misiniz? (Bu, '\ n'' için bekleyen bir sonraki giriş işlemini etkileyecektir.) –

cevap

1

: Bu fonksiyonu kullanmak istiyorsanız

fgets(): [...] Reading stops after an EOF or a newline. If a newline is read, it is stored into the buffer. [...]

Dolayısıyla, el kaldırmak olabilir. Öte yandan, '\n''u buluncaya ve arabelleğe dahil etmeden karakterleri almak için fgetc'u kullanabilirsiniz.

char c; 
while((c=fgetc(stdin)) != '\n') 
    buffer[i++] = c; 
+2

Bu, fgetc() '' EOF' değerini döndürmesi gereken sonsuz bir döngüdür. Benim amacım sadece cevapları çizmek olsa da, – chux

+0

emin şey @chux. Bunu işaret ettiğin için teşekkürler. –

+0

'char c = fgetc (stdin)' sadece [yanlış] (http://stackoverflow.com/questions/35356322/difference-between-int-and-char-in-getchar-fgetc-and-putchar-fputc/ 35356684 # 35356684). –

2

fgets(buffer, 100, stdin); 
size_t ln = strlen(buffer)-1; 
if (buffer[ln] == '\n') 
    buffer[ln] = '\0'; 
2

Basitçe potansiyel '\n' aramaya deneyin: Böyle bir şey olurdu. '\n' varsa

fgets() çağırdıktan sonra, o (sadece '\0' öncesi) dizede geçen char olacak.

size_t len = strlen(buffer); 
if (len > 0 && buffer[len-1] == '\n') { 
    buffer[--len] = '\0'; 
} 

Örnek kullanım

char buffer[100]; 
// memset(buffer, 0, 100); not needed 
if (fgets(buffer, sizeof buffer, stdin) == NULL) { // good to test fgets() result 
    Handle_EOForIOerror(); 
} 
size_t len = strlen(buffer); 
if (len > 0 && buffer[len-1] == '\n') { 
    buffer[--len] = '\0'; 
} 
printf("buffer is: %s\n stop",buffer); 

Notlar: buffer ilk char bir '\0' (embedded null karakteri) olduğu zaman

buffer[strlen(buffer)-1] nadiren de tehlikelidir. İlk char hiçbir şey okuyup '\n'stdin kalır edilir '\n' ise

scanf("%99[^\n]%*c", buffer); bir sorundur.

strlen() diğer yöntemlerle karşılaştırıldığında hızlı: https://codereview.stackexchange.com/a/67756/29485

ya da rulo kendi kod gets_sz