C語言從stdin讀取一行字串的幾種方法
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.