Проверка того, на что похожи входные данные, затем с помощью scanf (C) - PullRequest
1 голос
/ 24 сентября 2010

Таким образом, проблема заключается в том, что пользователь может либо ввести входное значение, равное одному целому, либо пользователь может ввести входное значение с тремя целыми числами. И все зависит от первого ввода. Немного смущает, вот пример:

printf("Please enter input in this format: (-blackwhite | -color) colorvalue");

пользовательский ввод "-blackwhite 40", поэтому я хочу

scanf("%s %u", charArray, &int);

но пользователь также может ввести "-color 254 254 254", тогда я бы хотел

scanf("%s %u %u %u", charArray, &int1, &int2, &int3);

Как мне это сделать? В основном проверка данных, прежде чем я сканирую их в переменные.

Ответы [ 4 ]

6 голосов
/ 24 сентября 2010

Никогда используйте обнаженный (неограниченный) %s в scanf, если вы не полностью контролируете формат входных данных (чего у вас нет).

В противном случае вы открываетеваш код для переполнения буфера.

Что вам нужно сделать, это fgets строка из stdin (поскольку это обеспечивает защиту от переполнения буфера), а затем просто sscanf строка.

Thisимеет дополнительный бонус, что вы можете sscanf свою длинную строку формата с четырьмя аргументами и, если это не удастся, , то попробовать один с двумя аргументами.

Примерно так:

#include <stdio.h>

int main (void) {
    char buffer[200];
    int i1, i2, i3, count;

    printf("Please enter input in format: (-blackwhite | -color) colorvalue: ");
    fflush (stdout);
    if (fgets (buffer, sizeof (buffer), stdin) != NULL) {
        if ((count = sscanf (buffer, " -color %d %d %d", &i1, &i2, &i3)) != 3)
            count = sscanf (buffer, " -blackwhite %d", &i1);
        switch (count) {
            case  1: printf ("blackwhite %d\n", i1);          break;
            case  3: printf ("color %d %d %d\n", i1, i2, i3); break;
            default: printf ("Huh?: %s\n", buffer);           break;
        }
    }
    return 0;
}
1 голос
/ 24 сентября 2010

Возможно, вам следует сначала отсканировать слова, проверить их, а затем отсканировать соответствующие числа.

1 голос
/ 24 сентября 2010

Читать строку; сравните строку с -blackwhite и прочитайте одну int, если она соответствует; иначе сравните строку с -color и прочитайте три int s, если она совпадает; еще сука у пользователя.

if (scanf("%40s", charArray) == 1)
{
    if (strcmp(charArray, "-blackwhite") == 0)
    {
        if (scanf("%d", &int1) == 1)
            ...OK...
        else
            ...error...
    }
    else if (strcmp(charArray, "-color") == 0)
    {
        if (scanf("%d %d %d", &int1, &int2, &int3) == 3)
            ...OK...
        else
            ...error...
    }
    else
        ...error...
0 голосов
/ 24 сентября 2010

если ваш параметр всегда начинается с «строкового ввода», а затем за N x «целочисленного ввода», вы можете написать свой код, используя максимально возможное количество целочисленных входных данных, так как scanf вернет вам номер заполненного параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...