从0开始<十三>:getint()函数(类似于scanf函数)以及库函数strncpy、strncat及strncmp函数的实现

来源:互联网 发布:linux内核调试方法 编辑:程序博客网 时间:2024/05/01 02:57

程序一:编写getint(int *pn)函数

#include <stdio.h>#include <ctype.h>#define BUFSIZE 100char buf[BUFSIZE];   /*用于ungetch函数的缓冲区*/int bufp = 0; /*buf中下一个空闲位置*/int getch(void);  /*取一个字符*/void ungetch(int);  /*把字符压回到输入中*/int getint(int *pn);int main(void){int i,arr[3];for (i=0; i<3 && getint(&arr[i])!=EOF; ++i);for (i=0; i<3; ++i)printf("%d\n",arr[i]);return 0;}int getch(void){return (bufp>0)?buf[--bufp]:getchar();}void ungetch(int c) /*把字符压回到输入中*/{if (bufp >= BUFSIZE)printf("ungetch: too many characters\n");elsebuf[bufp++] = c;}/*将输入中的下一个整型数值赋值给*pn*/int getint(int *pn){int c,sign;while ( isspace(c = getch())); /*跳过空白符*/if (!isdigit(c) && c!=EOF && c!='+' && c!= '-') {ungetch(c);return 0;}sign = (c == '-')?-1:1;if (c == '+' || c== '-')c = getch();for (*pn=0; isdigit(c); c=getch())*pn = 10 * *pn + (c - '0');*pn *= sign;if (c != EOF)ungetch(c);return c;}
程序二:实现库函数strncpy、strncat 、strncmp,它们最多对参数字符串中的前n个字符进行操作。例如,函数strncpy(s,t,n)将t中的最多n个字符复制到s中

#include <stdio.h>#include <stdlib.h>#include <string.h>#define MAX_BUF 16char *mystrncpy(char *s, const char *ct, size_t n) {char *p;p = s;for (; n > 0 && *ct != '\0'; --n)*p++ = *ct++;for (; n > 0; --n)*p++ = '\0';return s;}char *mystrncat(char *s, const char *ct, size_t n) {char *p;p = s;while (*p != '\0')++p;for (; n > 0 && *ct != '\0'; --n)*p++ = *ct++;*p = '\0';return s;}int mystrncmp(const char *cs, const char *ct, size_t n) {while (n > 0 && *cs == *ct && *cs != '\0') {++cs;++ct;--n;}if (n == 0 || *cs == *ct)return 0;if (*(unsigned char *) cs < *(unsigned char *) ct)return -1;return 1;}void test_ncpy(const char *str) {char std_buf[MAX_BUF];char liw_buf[MAX_BUF];memset(std_buf, 0x42, sizeof(std_buf));strncpy(std_buf, str, sizeof(std_buf));memset(liw_buf, 0x42, sizeof(liw_buf));mystrncpy(liw_buf, str, sizeof(liw_buf));if (memcmp(std_buf, liw_buf, sizeof(std_buf)) != 0) {fprintf(stderr, "liw_strncpy failed for <%s>\n", str);exit(EXIT_FAILURE);}}void test_ncat(const char *first, const char *second) {char std_buf[MAX_BUF];char liw_buf[MAX_BUF];memset(std_buf, 0x69, sizeof(std_buf));strcpy(std_buf, first);strncat(std_buf, second, sizeof(std_buf) - strlen(std_buf) - 1);memset(liw_buf, 0x69, sizeof(liw_buf));strcpy(liw_buf, first);mystrncat(liw_buf, second, sizeof(liw_buf) - strlen(liw_buf) - 1);if (memcmp(std_buf, liw_buf, sizeof(std_buf)) != 0) {fprintf(stderr, "liw_strncat failed, <%s> and <%s>\n",first, second);exit(EXIT_FAILURE);}}void test_ncmp(const char *first, const char *second) {size_t len;int std_ret, liw_ret;if (strlen(first) < strlen(second))len = strlen(second);elselen = strlen(first);std_ret = strncmp(first, second, len);liw_ret = mystrncmp(first, second, len);if ((std_ret < 0 && liw_ret >= 0) || (std_ret > 0 && liw_ret <= 0) ||    (std_ret == 0 && liw_ret != 0)) {fprintf(stderr, "liw_strncmp failed, <%s> and <%s>\n",first, second);exit(EXIT_FAILURE);}}int main(void) {test_ncpy("");test_ncpy("a");test_ncpy("ab");test_ncpy("abcdefghijklmnopqrstuvwxyz");     /* longer than MAX_BUF */test_ncat("", "a");test_ncat("a", "bc");test_ncat("ab", "cde");test_ncat("ab", "cdefghijklmnopqrstuvwxyz"); /* longer than MAX_BUF */test_ncmp("", "");test_ncmp("", "a");test_ncmp("a", "a");test_ncmp("a", "ab");test_ncmp("abc", "ab");printf("All tests pass.\n");return 0;}

0 0
原创粉丝点击