system-programming:fgets
تفاوتها
تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده میکنید.
| system-programming:fgets [2024/04/19 18:02] – ایجاد شد pejman | system-programming:fgets [2024/06/18 01:22] (فعلی) – حذف شد pejman | ||
|---|---|---|---|
| خط 1: | خط 1: | ||
| - | ====== تابع ()fgets - خواندن از stdin به شکل pipe-friendly ====== | ||
| - | |||
| - | ---- | ||
| - | ==== Section 1 ==== | ||
| - | |||
| - | <code C> | ||
| - | // man 3 fgets | ||
| - | /* fgets() | ||
| - | * buffer pointed to by s. Reading stops after an EOF or a newline. | ||
| - | * stored | ||
| - | * the buffer. | ||
| - | * fgets() returns s on success, and NULL on error or when end of file occurs while no characters | ||
| - | * have been read. | ||
| - | */ | ||
| - | #include < | ||
| - | char *fgets(char *s, int size, FILE *stream); | ||
| - | |||
| - | // man 3 memset | ||
| - | /* memset - fills the first n bytes of the memory area pointed to by s with the constant byte c */ | ||
| - | #include < | ||
| - | void *memset(void s[.n], int c, size_t n); | ||
| - | |||
| - | </ | ||
| - | |||
| - | <code C> | ||
| - | /* case-changer.c */ | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | int main(void) | ||
| - | { | ||
| - | char c[20] = { 0 }; | ||
| - | char newcase[20] = { 0 }; | ||
| - | int i; | ||
| - | while(fgets(c, | ||
| - | { | ||
| - | for(i=0; i< | ||
| - | { | ||
| - | /* Upper case to lower case */ | ||
| - | if ( (c[i] >= 65) && (c[i] <= 90) ) | ||
| - | { | ||
| - | newcase[i] = c[i] + 32; | ||
| - | } | ||
| - | /* Lower case to upper case */ | ||
| - | if ( (c[i] >= 97 && c[i] <= 122) ) | ||
| - | { | ||
| - | newcase[i] = c[i] - 32; | ||
| - | } | ||
| - | } | ||
| - | printf(" | ||
| - | /* zero out the arrays so there are no | ||
| - | | ||
| - | memset(c, 0, sizeof(c)); | ||
| - | memset(newcase, | ||
| - | } | ||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | $ make case-changer | ||
| - | cc | ||
| - | |||
| - | $ ./ | ||
| - | hello | ||
| - | HELLO | ||
| - | AbCdEf | ||
| - | aBcDeF | ||
| - | |||
| - | $ ls / | head -n 5 | ./ | ||
| - | BIN | ||
| - | BOOT | ||
| - | COMMAND | ||
| - | DEV | ||
| - | ETC | ||
| - | |||
| - | $ man ls | egrep ' | ||
| - | name | ||
| - | synopsis | ||
| - | description | ||
| - | author | ||
| - | copyright | ||
| - | |||
| - | <code C> | ||
| - | /* ascii-table.c */ | ||
| - | #include < | ||
| - | |||
| - | int main(void) | ||
| - | { | ||
| - | char c; | ||
| - | for (c = 65; c<=90; c++) | ||
| - | { | ||
| - | printf(" | ||
| - | printf(" | ||
| - | } | ||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | $ make ascii-table | ||
| - | cc | ||
| - | |||
| - | $ ./ | ||
| - | A = 65 a = 97 | ||
| - | B = 66 b = 98 | ||
| - | C = 67 c = 99 | ||
| - | D = 68 d = 100 | ||
| - | E = 69 e = 101 | ||
| - | F = 70 f = 102 | ||
| - | G = 71 g = 103 | ||
| - | H = 72 h = 104 | ||
| - | I = 73 i = 105 | ||
| - | J = 74 j = 106 | ||
| - | K = 75 k = 107 | ||
| - | L = 76 l = 108 | ||
| - | M = 77 m = 109 | ||
| - | N = 78 n = 110 | ||
| - | O = 79 o = 111 | ||
| - | P = 80 p = 112 | ||
| - | Q = 81 q = 113 | ||
| - | R = 82 r = 114 | ||
| - | S = 83 s = 115 | ||
| - | T = 84 t = 116 | ||
| - | U = 85 u = 117 | ||
| - | V = 86 v = 118 | ||
| - | W = 87 w = 119 | ||
| - | X = 88 x = 120 | ||
| - | Y = 89 y = 121 | ||
| - | Z = 90 z = 122 | ||
| - | |||
| - | ---- | ||
| - | ==== Section 2 ==== | ||
| - | |||
| - | <code C> | ||
| - | // man 3 strspn | ||
| - | /* The strspn() | ||
| - | * only of bytes from accept. | ||
| - | */ | ||
| - | #include < | ||
| - | size_t strspn(const char *s, const char *accept); | ||
| - | |||
| - | // man 3 strlen | ||
| - | /* The strlen() function calculates the length of the string pointed to by s, excluding the | ||
| - | * terminating null byte (' | ||
| - | */ | ||
| - | #include < | ||
| - | size_t strlen(const char *s); | ||
| - | </ | ||
| - | |||
| - | <code C> | ||
| - | /* mph-to-kph.c */ | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | int main(void) | ||
| - | { | ||
| - | char mph[10] = { 0 }; | ||
| - | |||
| - | while(fgets(mph, | ||
| - | { | ||
| - | /* Check if mph is numeric | ||
| - | * (and do conversion) */ | ||
| - | if( strspn(mph, " | ||
| - | strlen(mph) ) | ||
| - | { | ||
| - | printf(" | ||
| - | } | ||
| - | /* If mph is NOT numeric, print error | ||
| - | * and return */ | ||
| - | else | ||
| - | { | ||
| - | fprintf(stderr, | ||
| - | " value\n" | ||
| - | return 1; | ||
| - | } | ||
| - | } | ||
| - | return 0; | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | $ make mph-to-kph | ||
| - | cc | ||
| - | |||
| - | $ ./ | ||
| - | 50 | ||
| - | 80.5 | ||
| - | 60 | ||
| - | 96.6 | ||
| - | 100 | ||
| - | 160.9 | ||
| - | hello | ||
| - | Found non-numeric value | ||
| - | |||
| - | $ echo $? | ||
| - | 1 | ||
| - | |||
| - | $ ./ | ||
| - | 50 | ||
| - | 80.5 | ||
| - | < | ||
| - | |||
| - | $ echo $? | ||
| - | 0 | ||
| - | |||
| - | $ cat avg.txt | ||
| - | 10-minute average: 61 mph | ||
| - | 30-minute average: 55 mph | ||
| - | 45-minute average: 54 mph | ||
| - | 60-minute average: 52 mph | ||
| - | 90-minute average: 52 mph | ||
| - | 99-minute average: nn mph | ||
| - | |||
| - | $ awk ' | ||
| - | 61 | ||
| - | 55 | ||
| - | 54 | ||
| - | 52 | ||
| - | 52 | ||
| - | nn | ||
| - | |||
| - | $ awk ' | ||
| - | 98.2 | ||
| - | 88.5 | ||
| - | 86.9 | ||
| - | 83.7 | ||
| - | 83.7 | ||
| - | Found non-numeric value | ||
| - | |||
| - | $ awk ' | ||
| - | 98.2 km/h | ||
| - | 88.5 km/h | ||
| - | 86.9 km/h | ||
| - | 83.7 km/h | ||
| - | 83.7 km/h | ||
| - | |||
| - | ---- | ||
| - | ==== Section 3 ==== | ||
| - | |||
| - | <code C> | ||
| - | /* mph-to-kph_v2.c */ | ||
| - | #define _XOPEN_SOURCE 500 | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | #include < | ||
| - | |||
| - | void printHelp(FILE *stream, char progname[]); | ||
| - | |||
| - | int main(int argc, char *argv[]) | ||
| - | { | ||
| - | char mph[10] = { 0 }; | ||
| - | int opt; | ||
| - | int cont = 0; | ||
| - | |||
| - | /* Parse command-line options */ | ||
| - | while ((opt = getopt(argc, | ||
| - | { | ||
| - | switch(opt) | ||
| - | { | ||
| - | case ' | ||
| - | printHelp(stdout, | ||
| - | return 0; | ||
| - | case ' | ||
| - | cont = 1; | ||
| - | break; | ||
| - | | ||
| - | printHelp(stderr, | ||
| - | return 1; | ||
| - | } | ||
| - | } | ||
| - | |||
| - | | ||
| - | { | ||
| - | /* Check if mph is numeric | ||
| - | * (and do conversion) */ | ||
| - | if( strspn(mph, " | ||
| - | strlen(mph) ) | ||
| - | { | ||
| - | | ||
| - | } | ||
| - | /* If mph is NOT numeric, print error | ||
| - | * and return */ | ||
| - | else | ||
| - | { | ||
| - | | ||
| - | " | ||
| - | if (cont == 1) /* Check if -c is set */ | ||
| - | { | ||
| - | continue; /* Skip and continue if | ||
| - | * -c is set */ | ||
| - | } | ||
| - | else | ||
| - | { | ||
| - | return 1; /* Abort if -c is not set */ | ||
| - | } | ||
| - | } | ||
| - | } | ||
| - | | ||
| - | } | ||
| - | |||
| - | void printHelp(FILE *stream, char progname[]) | ||
| - | { | ||
| - | | ||
| - | | ||
| - | " | ||
| - | " -h print help\n" | ||
| - | } | ||
| - | </ | ||
| - | |||
| - | $ make mph-to-kph_v2 | ||
| - | cc | ||
| - | |||
| - | $ ./ | ||
| - | 60 | ||
| - | 96.6 | ||
| - | 40 | ||
| - | 64.4 | ||
| - | hello | ||
| - | Found non-numeric value | ||
| - | |||
| - | $ ./ | ||
| - | 50 | ||
| - | 80.5 | ||
| - | 90 | ||
| - | 144.8 | ||
| - | hello | ||
| - | Found non-numeric value | ||
| - | 10 | ||
| - | 16.1 | ||
| - | 20 | ||
| - | 32.2 | ||
| - | < | ||
| - | |||
| - | $ cat avg-with-garbage.txt | ||
| - | 10-minute average: 61 mph | ||
| - | 30-minute average: 55 mph | ||
| - | 45-minute average: 54 mph | ||
| - | 60-minute average: 52 mph | ||
| - | 90-minute average: 52 mph | ||
| - | 99-minute average: nn mph | ||
| - | 120-minute average: 49 mph | ||
| - | 160-minute average: 47 mph | ||
| - | 180-minute average: nn mph | ||
| - | error reading data from interface | ||
| - | 200-minute average: 43 mph | ||
| - | |||
| - | $ awk ' | ||
| - | 61 | ||
| - | 55 | ||
| - | 54 | ||
| - | 52 | ||
| - | 52 | ||
| - | nn | ||
| - | 49 | ||
| - | 47 | ||
| - | nn | ||
| - | data | ||
| - | 43 | ||
| - | |||
| - | $ awk ' | ||
| - | 98.2 | ||
| - | 88.5 | ||
| - | 86.9 | ||
| - | 83.7 | ||
| - | 83.7 | ||
| - | Found non-numeric value | ||
| - | 78.9 | ||
| - | 75.6 | ||
| - | Found non-numeric value | ||
| - | Found non-numeric value | ||
| - | 69.2 | ||
| - | |||
| - | $ awk ' | ||
| - | | ||
| - | $ cat output.txt | ||
| - | 98.2 | ||
| - | 88.5 | ||
| - | 86.9 | ||
| - | 83.7 | ||
| - | 83.7 | ||
| - | 78.9 | ||
| - | 75.6 | ||
| - | 69.2 | ||
| - | | ||
| - | $ cat errors.txt | ||
| - | Found non-numeric value | ||
| - | Found non-numeric value | ||
| - | Found non-numeric value | ||
system-programming/fgets.1713537149.txt.gz · آخرین ویرایش: 2024/04/19 18:02 توسط pejman
