2014-12-15 13 views
11

Tôi đang cố gắng để viết một chuỗi đầu vào ở nơi khác và không biết làm thế nào để làm đi với dòng mới xuất hiện như là một phần của chuỗi này mà tôi có được với stdin và fgets.Làm thế nào tôi có thể nhận được một chuỗi từ đầu vào mà không bao gồm một dòng mới bằng cách sử dụng fgets?

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

Tôi đã cố gắng giới hạn lượng dữ liệu bị lãng phí cũng như giới hạn số lượng dữ liệu được ghi nhưng dòng mới vẫn còn. Làm thế nào tôi có thể đơn giản nhận được chuỗi đầu vào lên đến ký tự cuối cùng được viết với không có gì khác?

+0

'scanf ("% 99 [^ \ n]% * c", đệm); ' – BLUEPIXY

+0

@ BLUEPIXY 'scanf ("% 99 [^ \ n]% * c ", bộ đệm)' sẽ không đọc bất cứ thứ gì vào 'buffer' nếu' char' đầu tiên là ''\ n''. '' \ N'' vẫn còn trong 'stdin'. – chux

+2

Bạn có muốn đọc một dòng và để ''\ n'' trong luồng đầu vào hay bạn muốn đọc một dòng bao gồm'' \ n'' và sau đó loại bỏ ''\ n''? (Điều này sẽ ảnh hưởng đến thao tác nhập tiếp theo, sẽ hoặc sẽ không nhìn thấy ''\ n'' đang chờ nó.) –

Trả lời

1

Từ linux trang người đàn ông:

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

Do đó, nếu bạn muốn sử dụng chức năng này, bạn có thể loại bỏ nó bằng tay. Mặt khác, bạn có thể sử dụng fgetc để nhận các ký tự cho đến khi bạn tìm thấy '\n' và không bao gồm nó trong bộ đệm. Nó sẽ là một cái gì đó như thế:

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

Đây là một vòng lặp vô hạn nên' fgetc() 'return' EOF'. – chux

+0

điều chắc chắn @chux, mặc dù ý định của tôi chỉ là phác họa câu trả lời. cảm ơn vì đã chỉ ra điều đó. –

+0

'char c = fgetc (stdin)' chỉ là [sai] (http://stackoverflow.com/questions/35356322/difference-between-int-and-char-in-getchar-fgetc-and-putchar-fputc/ 35356684 # 35356684). –

2

thử

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

Đơn giản chỉ cần tìm kiếm tiềm năng '\n'.

Sau khi gọi fgets(), nếu '\n' tồn tại, nó sẽ là char cuối cùng trong chuỗi (ngay trước '\0').

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

sử dụng mẫu

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); 

Ghi chú:

buffer[strlen(buffer)-1] rất nguy hiểm trong những dịp hiếm hoi khi char đầu tiên trong buffer là một '\0' (nhúng ký tự null).

scanf("%99[^\n]%*c", buffer); là vấn đề nếu char đầu tiên là '\n', không có gì được đọc và '\n' vẫn ở trong stdin.

strlen() là nhanh so với các phương pháp khác: https://codereview.stackexchange.com/a/67756/29485

Hoặc cuộn mã riêng của bạn như gets_sz

Các vấn đề liên quan