Рейтинг:
6
Jochen Arndt
Почему вы написали его на C++, когда вам нужно использовать C? Или вы нашли код в сети?
В любом случае, ваш код работает и нуждается лишь в небольшой настройке, чтобы получить ожидаемый результат.
То scanf()
функция остановится, когда возникнет несоответствующий символ, оставив все оставшиеся символы во входном буфере. При чтении целочисленного значения это означает, что символ перевода строки \n
помещенный в буфер нажатием клавиши возврата блокирует преобразование, но остается в буфере. Когда же тогда звонить scanf()
опять же в цикле он считывает ту строку, которая обрабатывается как неизвестный символ.
Решение довольно простое: расскажите scanf()
чтобы читать и игнорировать ленту строк:
scanf_s("%d\n", &n);
Чтобы получить необходимый выходной формат, все, что вам нужно сделать, это заменить
\n
в
printf()
отформатируйте строку пробелом, добавьте пробел в конце при печати "неизвестного символа" и, наконец, распечатайте новую строку перед завершением работы приложения.
Neri-kun
Нет,я не нашел этот код в C++ в интернете.Я сам придумал эту идею.Однако когда я попытался заставить этот код работать,сначала я попытался сделать его на языке Си,но это не сработало.Затем,чтобы убедиться, что идея кода может работать, я переключился на синтаксисы C++ и C++, и это сработало.Во всяком случае,я понял кое-что еще,когда ввожу во входные данные значение n, когда вводю символы и использую пространство между ними, мой код воспринимает пространство, оставшееся между другими символами, как символ.
Другими словами,например,когда у меня есть:
Вход:3
азбука
Выход:97 98 99
но когда я представлю это:
Вход:a b c
Вывод:97 Неизвестных Символов98.
Итак,что я могу изменить, чтобы при введении:a b c с пробелом между ними программа отображала их десятичные значения ASCII?
Кстати,вот небольшое обновление кода:
//Мой код на языке Си
#define _CRT_SECURE_NO_WARNINGS
#включить<stdio.h>
тап_п()
{
int i, n;
чар с;
scanf("%d\n", &n);
i = 0;
а (я != Н)
{
scanf("%c", &c);
если ((с &ГТ;= 'а'&амп;&амп;с &ЛТ;= 'з') || (с &ГТ;= 'а'&амп;&амп;с &ЛТ;= 'З') || (С &ГТ;= '0'&амп;&амп;с &ЛТ;= '9'))
{
printf("%d ", c);
}
еще
{
printf("неизвестный символ");
}
я++;
}
printf("\n");
система("пауза");
возвращает 0;
}
Jochen Arndt
Когда вы вводите "a b c", он содержит 5 символов, но вы указали, что там должно быть только 3. Таким образом, обрабатываются только первые 3, и пространство является неизвестным.
Существует несколько решений в зависимости от того, что вы хотите сделать:
- Считайте входные данные как строку и обрабатывайте их
- Используйте getchar() для чтения одного символа
- Необязательно игнорировать пробелы
Обратите также внимание, что существует функция isalnum (), определенная в ctype.h (std::isalnum() в ccytpe для C++).
Neri-kun
Вот что я придумал:
//Мой код на языке Си
#define _CRT_SECURE_NO_WARNINGS
#включить<stdio.h>
тап_п()
{
int i, n;
чар с;
scanf("%d\n", &n);
i = 0;
а (я != Н)
{
scanf("%c", &c);
если ((с &ГТ;= 'а'&амп;&амп;с &ЛТ;= 'з') || (с &ГТ;= 'а'&амп;&амп;с &ЛТ;= 'З') || (С &ГТ;= '0'&амп;&амп;с &ЛТ;= '9'))
{
printf("%d ", c);
}
еще
если (c == ' ')
{
printf("%c", c);
я--;
}
еще
{
printf("неизвестный символ");
}
я++;
}
printf("\n");
система("пауза");
возвращает 0;
}
Поэтому в основном я понял, что при использовании if (c == ' '){printf("%c", c); i--;} код будет игнорировать пробелы между символами.Однако в то же время,когда я понял,что это работает именно так,я подумал, что даже если я объявлю этот c как char и использую "%c" при сканировании, этот c действует как строка.Поэтому я подумал об изменении его объявления как такового:char c[size] , а затем %s при сканировании и печати.Код все еще работал так,как я хотел, но при выходе из командной строки я получил исключение:"ошибка проверки времени выполнения #2-стек вокруг переменной 'c' был поврежден".
Jochen Arndt
Если вы определяете строку (массив символов), она должна быть достаточно большой, чтобы вместить введенные данные плюс один для завершающего нуля, который помещается в конце при чтении с помощью "%s". Если читается больше символов, происходит переполнение массива, что приводит к повреждению памяти (стековая память здесь, потому что массив находится в стеке).
Решение:
Убедитесь, что массив достаточно велик, и сообщите scanf() о его фактическом размере. Пример:
char str[16];
scanf("%15s", str);
Neri-kun
Хорошо,спасибо за Ваше объяснение :).