aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--ch5/5-05_strn-funcs.c76
1 files changed, 76 insertions, 0 deletions
diff --git a/ch5/5-05_strn-funcs.c b/ch5/5-05_strn-funcs.c
new file mode 100644
index 0000000..3cbee6a
--- /dev/null
+++ b/ch5/5-05_strn-funcs.c
@@ -0,0 +1,76 @@
+#include <stdio.h>
+
+/* The C Programming Language: 2nd Edition
+ *
+ * Exercise 5-5: Write versions of the library functions strncpy, strncat, and
+ * strncmp, which operate on at most the first n charecetr of their argument
+ * strings. For example, strncpy(s,t,n) copies at most n character of t to s.
+ * Full descriptions are in Appendix B.
+ */
+
+char *strn_cpy(char *, const char *, size_t);
+char *strn_cat(char *, const char *, size_t);
+int strn_cmp(const char *, const char *, size_t);
+
+int main() {
+ /* This is to fill the array up beyond where I'll be filling it so I can
+ * test. */
+ char foo[50] = "Meepineeeeeessssss";
+ char *bar = "Merpy";
+ printf("strn_cpy: %s\n", strn_cpy(foo, bar, 9));
+ /* Test to see that the last element of the range is indeed a \0, and
+ * some other part further is something else. */
+ if (foo[8] == '\0' && foo[14] != '\0') {
+ printf("strn_cpy works as expected.\n");
+ }
+ bar = " hai";
+ printf("strn_cat: %s\n", strn_cat(foo, bar, 9));
+ // bar is 4 characters long. Let's test comparisons.
+ printf("strn_cmp: %d\n", strn_cmp(bar, "hai lits", 10)); // -4
+ printf("strn_cmp: %d\n", strn_cmp(bar, "no", 10)); // 2
+ printf("strn_cmp: %d\n", strn_cmp(bar, "derp", 10)); // 0
+ return 0;
+}
+
+char *strn_cpy(char *s, const char *t, size_t n) {
+ char *start = s;
+ while (n > 0 && *t != '\0') {
+ *s++ = *t++;
+ n--;
+ }
+ while (n > 0) {
+ *s++ = '\0';
+ n--;
+ }
+ return start;
+}
+
+char *strn_cat(char *s, const char *t, size_t n) {
+ char *start = s;
+ while (*s != '\0') {
+ s++;
+ }
+ while (*t != '\0' && n > 0) {
+ *s++ = *t++;
+ n--;
+ }
+ *s = '\0';
+ return start;
+}
+
+int strn_cmp(const char *s, const char *t, size_t n) {
+ int slen, tlen;
+ slen = tlen = 0;
+ while (n > 0) {
+ if (*s != '\0') {
+ s++;
+ slen++;
+ }
+ if (*t != '\0') {
+ t++;
+ tlen++;
+ }
+ n--;
+ }
+ return slen - tlen;
+}
ertions'>+76 2018-10-09Bump to 0.3alpha6 for PyPIzlg1-1/+1 2018-10-09cli: Add "notes" commandzlg2-4/+74 2018-10-09update_game: ensure notes are also savedzlg1-2/+2 2018-10-09cli: add 'update' commandzlg3-20/+92 2018-10-06cli: Add "delete" commandzlg2-0/+19 2018-10-06Remove ID field from DBzlg3-38/+46 2018-10-06cli: change "Status" heading to "Progress"zlg2-36/+40 2018-09-29Bump to 0.3alpha5 for PyPIzlg1-1/+1 2018-09-29cli: Add pretty printing to 'list' commandzlg3-17/+107 2018-09-08setup.py: Bump to alpha4 for PyPIzlg1-1/+1 2018-09-08cli: add '--raw' option to list commandzlg2-9/+45 2018-09-08Add remaining filters to vgstash packagezlg1-2/+11 2018-09-04Update LICENSE to match setup.pyzlg1-80/+67 2018-09-03Branch off from master with pytest, tox, clickzlg16-778/+779 2018-03-18Flesh out filter types and ownership statuszlg3-82/+144 2018-03-18README.mdown: break line correctlyzlg1-1/+1 2018-03-18add 'playlog' list filterzlg2-2/+9 2018-03-13Update helpers a bitzlg1-2/+9 2018-03-13Make VGSTASH_DB_LOCATION point to a filezlg2-21/+20 2016-11-18Remove settings from helpers.shZe Libertine Gamer1-5/+0 2016-11-15Correct phrasing in README.Ze Libertine Gamer1-4/+4 2016-11-13DerpZe Libertine Gamer1-0/+1 2016-11-03Improve error handling in shell scriptsZe Libertine Gamer4-3/+23 2016-10-24Correct run_again, add recursionZe Libertine Gamer1-0/+4 2016-10-21Add quotes to correct behavior for arglistZe Libertine Gamer1-1/+1 2016-10-14updater.sh: add recursion, error handlingZe Libertine Gamer1-43/+101 2016-10-14Correct pipe-handling behaviorZe Libertine Gamer1-1/+9 2016-10-12Clarify a method to move between platformsZe Libertine Gamer1-2/+5