Fix the first bugs...  treatment of 0 count was wrong, and memchr()
should be memset().
diff --git a/Modules/structmodule.c b/Modules/structmodule.c
index cfbd2a6..a96606b 100644
--- a/Modules/structmodule.c
+++ b/Modules/structmodule.c
@@ -668,8 +668,6 @@
 			       num = num*10 + (c - '0');
 			if (c == '\0')
 				break;
-			if (num == 0 && c != 's')
-				continue;
 		}
 		else
 			num = 1;
@@ -678,10 +676,12 @@
 		if (e == NULL)
 			goto fail;
 		res = restart + align((int)(res-restart), c, e);
+		if (num == 0 && c != 's')
+			continue;
 		do {
 			if (c == 'x') {
 				/* doesn't consume arguments */
-				memchr(res, '\0', num);
+				memset(res, '\0', num);
 				res += num;
 				break;
 			}
@@ -707,7 +707,7 @@
 				if (n > 0)
 					memcpy(res, PyString_AsString(v), n);
 				if (n < num)
-					memchr(res+n, '\0', num-n);
+					memset(res+n, '\0', num-n);
 				res += num;
 				break;
 			}
@@ -769,8 +769,6 @@
 			       num = num*10 + (c - '0');
 			if (c == '\0')
 				break;
-			if (num == 0 && c != 's')
-				break;
 		}
 		else
 			num = 1;
@@ -779,6 +777,8 @@
 		if (e == NULL)
 			goto fail;
 		str = start + align((int)(str-start), c, e);
+		if (num == 0 && c != 's')
+			continue;
 
 		do {
 			if (c == 'x') {