Парсинг входа с scanf в C

Я не запускал ваш код, но я предполагаю, что проблема в том, что switchNavigator показывает заголовок. Если это так, то вы хотите изменить цвет навигатора на экране, на котором вы находитесь.

Так в вашем классе загрузки:

export default class Loading extends React.Component {
    // Add this:
    static navigationOptions = {
        headerStyle: {
            backgroundColor: '#2C3E50',
        },
    };
    componentDidMount() {} 
    render() {
        return (
            
                Loading
                
            
        )
    }
};

Ссылка: https://reactnavigation.org/docs/en/headers.html#adjusting-header-styles

10
задан Jonathan Leffler 13 February 2014 в 01:18
поделиться

4 ответа

Когда Вы входите"c P101"программа на самом деле получает"c P101\n". Большая часть пропуска спецификаторов преобразования ведущий пробел включая новые строки, но %c не делает. В первый раз вокруг всего сезам"\n"читается, второй раз вокруг "\n" читается в command, "c"читается в prefix, и"P"оставлен, который не является числом так сбои преобразования и"P101\n"оставлен на потоке. В следующий раз"P"хранится в команду,"1"хранится в префикс, и 1 (от остающегося"01"), хранится во вход с"\n"все еще на потоке в следующий раз. Можно устранить эту проблему путем помещения пространства в начале строки формата, которая пропустит любой ведущий пробел включая новые строки.

Подобная вещь происходит для второго случая, когда Вы входите"q", "q\n"вводится в поток, в первый раз вокруг"q"читается, во второй раз"\n"читается, только на третьем вызове является вторым"q"читайте, можно избежать проблемы снова путем добавления пробела в начале строки формата.

Лучший способ сделать это должно было бы использовать что-то как fgets (), чтобы обработать строку за один раз и затем использовать sscanf (), чтобы сделать парсинг.

20
ответ дан 3 December 2019 в 17:22
поделиться

После того как у Вас есть строка, которая содержит строку. т.е. "C P101", можно использовать способности к парсингу sscanf.

См.: http://www.cplusplus.com/reference/clibrary/cstdio/sscanf.html

1
ответ дан 3 December 2019 в 17:22
поделиться

Для вопроса 1, я подозреваю, что у Вас есть проблема с Вашим printf(), с тех пор нет никакого завершения "\n".

Поведение по умолчанию printf должен буферизовать вывод, пока он не имеет полную строку. Это - то, если Вы явно не изменяете буферизацию на stdout.

Для вопроса 2, Вы только что поразили одну из самых больших проблем с scanf(). Если Ваш вход точно не соответствует строке сканирования, которую Вы указали, Ваши результаты не будут ничем как то, что Вы ожидаете.

Если у Вас будет опция, то у Вас будут лучшие результаты (и меньше проблем безопасности) путем игнорирования scanf() и делая Ваш собственный парсинг. Например, использовать fgets() считать всю строку в строку и затем обработать отдельные поля строки — возможно, даже использование sscanf().

1
ответ дан 3 December 2019 в 17:22
поделиться

Это действительно повреждается! Я не знал это

#include <stdio.h>

int main(void)
{
    int counter = 1;
    char command, prefix;
    int input;

    do 
    {
        printf("counter: %d: ", counter);
        scanf("%c %c%d", &command, &prefix, &input);
        printf("---%c %c%d---\n", command, prefix, input);
        counter++;
    } while (command != 'q');
}
counter: 1: a b1
---a b1---
counter: 2: c d2
---
 c1---
counter: 3: e f3
---d 21---
counter: 4: ---e f3---
counter: 5: g h4
---
 g3---

Вывод, кажется, соответствует ответу Robert.

1
ответ дан 3 December 2019 в 17:22
поделиться
Другие вопросы по тегам:

Похожие вопросы: