C語言從stdin讀取一行字符串的幾種方法
-
gets
gets函數的頭文件是<stdio.h>,原型如下:
char *gets(char *s);
gets從stdin中讀入一行內容到s指定的buffer中,當遇到換行符或EOF時讀取結束。讀取成功時,返回s地址;失敗時返回null。需要注意的是,gets會將行末尾的'\n'字符或EOF替換成'\0',這樣,gets讀取的內容中不包括'\n'字符。如果要獲取讀取字符串的長度,可以調用strlen函數獲得。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int size = 1024;
char* buff = (char*)malloc(size);
// read lines
while(NULL != gets(buff)){
printf("Read line with len: %d\n", strlen(buff));
printf("%s", buff);
}
// free buff
free(buff);
}
-
fgets
fgets函數的頭文件是<stdio.h>,原型如下:
char *fgets(char *s, int size, FILE*stream);
fgets從stream中讀取最多size-1大小的內容到s指定的buffer中,當遇到換行符或EOF時讀取結束。讀取成功時,返回s地址;失敗時返回null。需要注意的是,fgets會在所讀取的內容後面添加'\0',這樣,fgets讀取的內容中會包括行末尾的'\n'字符。如果要獲取讀取字符串的長度,可以調用strlen函數獲得。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int size = 1024;
char* buff = (char*)malloc(size);
// read lines
while(NULL != fgets(buff, size, stdin)){
printf("Read line with len: %d\n", strlen(buff));
printf("%s", buff);
}
// free buff
free(buff);
}
-
getline
getline函數的頭文件是<stdio.h>,原型如下:
ssize_t getline(char **lineptr,size_t *n, FILE *stream);
getline從stream中讀取一行內容到*lineptr所指定的buffer中,當遇到換行符或EOF時讀取結束。*n是*lineptr所指定的buffer的大小,如果*n小於讀入的內容長度,getline會自動擴展buffer長度,並更新*lineptr和*n的值。讀取成功時,返回讀入的字符個數;失敗時返回-1。需要注意的是,gelines讀取的內容中會包括行末尾的'\n'字符。
#include <stdio.h>
#include <stdlib.h>
int
main(void)
{
char *line = NULL;
size_t len = 0;
ssize_t read;
while ((read = getline(&line, &len, stdin)) != -1) {
printf("Retrieved line of length %zu, %u :\n", read, len);
printf("%s", line);
}
free(line);
exit(EXIT_SUCCESS);
}
- 自己實現my_getline
可以自己實現,原型如下:
int my_getline(char* line, intmax_size);
my_getline從stdin中讀取最多max_size-1個字符到line所指定的buff中,當遇到換行符或EOF時讀取結束。讀取成功時,返回讀取的字符串長度;失敗時返回0。my_getline讀取的內容中會包括行末尾的'\n'字符。
#include <stdio.h>
#include <stdlib.h>
int my_getline(char* line, int max_size)
{
int c;
int len = 0;
while( (c = getchar()) != EOF && len < max_size ){
line[len++] = c;
if('\n' == c)
break;
}
line[len] = '\0';
return len;
}
int main()
{
int max_size = 1024;
char* buff = (char*)malloc( sizeof(char) * max_size );
//getline
int len;
while(0 != (len = my_getline(buff, max_size))){
printf("Read line with len: %d\n", len);
printf("%s", buff);
}
free(buff);
}
參考:
[1] Linux Programmer's Manual.
[2] Brian W. Kernighan and Dennis M.Ritchie. The C Programming Language, Second Edition.