diff --git a/monitor.c b/monitor.c
index 6e3d970..baf46ba 100644
--- a/monitor.c
+++ b/monitor.c
@@ -4122,6 +4122,29 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
             break;
         c = *typestr;
         typestr++;
+        while (qemu_isspace(*p)) {
+            p++;
+        }
+        /* take care of optional arguments */
+        switch (c) {
+        case 's':
+        case 'i':
+        case 'l':
+        case 'M':
+        case 'o':
+        case 'T':
+        case 'b':
+            if (*typestr == '?') {
+                typestr++;
+                if (*p == '\0') {
+                    /* missing optional argument: NULL argument */
+                    qemu_free(key);
+                    key = NULL;
+                    continue;
+                }
+            }
+            break;
+        }
         switch(c) {
         case 'F':
         case 'B':
@@ -4129,15 +4152,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
             {
                 int ret;
 
-                while (qemu_isspace(*p))
-                    p++;
-                if (*typestr == '?') {
-                    typestr++;
-                    if (*p == '\0') {
-                        /* no optional string: NULL argument */
-                        break;
-                    }
-                }
                 ret = get_str(buf, sizeof(buf), &p);
                 if (ret < 0) {
                     switch(c) {
@@ -4167,9 +4181,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
                 if (!opts_list || opts_list->desc->name) {
                     goto bad_type;
                 }
-                while (qemu_isspace(*p)) {
-                    p++;
-                }
                 if (!*p)
                     break;
                 if (get_str(buf, sizeof(buf), &p) < 0) {
@@ -4187,8 +4198,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
             {
                 int count, format, size;
 
-                while (qemu_isspace(*p))
-                    p++;
                 if (*p == '/') {
                     /* format found */
                     p++;
@@ -4268,23 +4277,15 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
             {
                 int64_t val;
 
-                while (qemu_isspace(*p))
-                    p++;
-                if (*typestr == '?' || *typestr == '.') {
-                    if (*typestr == '?') {
-                        if (*p == '\0') {
-                            typestr++;
-                            break;
-                        }
-                    } else {
-                        if (*p == '.') {
+                if (*typestr == '.') {
+                    if (*p == '.') {
+                        p++;
+                        while (qemu_isspace(*p)) {
                             p++;
-                            while (qemu_isspace(*p))
-                                p++;
-                        } else {
-                            typestr++;
-                            break;
                         }
+                    } else {
+                        typestr++;
+                        break;
                     }
                     typestr++;
                 }
@@ -4306,15 +4307,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
                 int64_t val;
                 char *end;
 
-                while (qemu_isspace(*p)) {
-                    p++;
-                }
-                if (*typestr == '?') {
-                    typestr++;
-                    if (*p == '\0') {
-                        break;
-                    }
-                }
                 val = strtosz(p, &end);
                 if (val < 0) {
                     monitor_printf(mon, "invalid size\n");
@@ -4328,14 +4320,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
             {
                 double val;
 
-                while (qemu_isspace(*p))
-                    p++;
-                if (*typestr == '?') {
-                    typestr++;
-                    if (*p == '\0') {
-                        break;
-                    }
-                }
                 if (get_double(mon, &val, &p) < 0) {
                     goto fail;
                 }
@@ -4361,9 +4345,6 @@ static const mon_cmd_t *monitor_parse_command(Monitor *mon,
                 const char *beg;
                 int val;
 
-                while (qemu_isspace(*p)) {
-                    p++;
-                }
                 beg = p;
                 while (qemu_isgraph(*p)) {
                     p++;
