Я пытался решить проблему программирования какого-то сайта, и у этого было следующее утверждение:
Прочитайте строку и проанализируйте ее как число, символ ‘l’ может рассматриваться как число 1, а символы ‘o’ и ‘O’ могут рассматриваться как число 0, запятые и пробелы будут приниматься на входе, но игнорироваться, если таковые имеются другой символ найден, тогда выводится ошибка …
Итак … поскольку в строках могут быть пробелы, я использовал метод get (в документации сказано, что он удаляет новую строку и ставит терминатор) …
Моя последовательность проверки IF, если это число, то, если это приемлемая буква, то проверяет, не является ли она запятой или пробелом … И я обнаружил, что она почти всегда вводилась в последнем IF, хотя там не было любой символ, который должен привести его туда, поэтому я изменил printf внутри него, чтобы напечатать
printf("%d error", st[k]);
И это выводит 13: возврат каретки … Я попробовал этот компилятор Вот
#include <cstdio>
#include <cstring>
#include <cstdlib>
int main()
{
char st[100];
char buf[100];
int k, i;
long long int num;
ops: while(gets(st))
{
for(k = i = 0; st[k]; k++)
if(st[k] >= '0' && st[k] <= '9')
buf[i++] = st[k];
else if(st[k] == 'o' || st[k] == 'O')
buf[i++] = '0';
else if(st[k] == 'l')
buf[i++] = '1';
else if(st[k] != ',' && st[k] != ' ')
{
printf("error\n");
goto ops;
}
// remaining code comes here...
}
Входной образец имел следующие значения:
lo6
234657
Привет
,,,,, 5,, 5, 4
2200000000
00
Должен ли я использовать другую функцию для чтения вместо?
Любые предложения о том, как избежать этого проклятого возврата каретки?
Состояния для проблемы можно увидеть Вот если вы хотите больше деталей
Спасибо
РЕДАКТИРОВАТЬ:
Я спрашиваю об этом, потому что кажется, что есть разница между компилятором, который я использую, и компилятором, который использовал веб-сайт, когда я представил код, который не генерировал правильный вывод на моем, но я думал, что код был правильным. .. и это прошло. Затем, после этого, я попробовал код на виртуальной машине linux и тоже исправил, но мой gcc на windows потерпел неудачу … некоторые символы были совершенно не там, где они должны быть
Дело в том:
Предпочтительный метод ввода строки getline
, Если вы не знаете ширину ввода заранее, getline
выделит место для вас, если вы установите указатель буфера на NULL
,
Поскольку вы указываете, что у вас есть некоторый опыт работы с C, ниже будет показано, как пройти по входной строке и проанализировать ее так, как вы хотите. Хотя существует много способов обработки строк, трудно превзойти назначение указателя на начало строки и затем продвижение вниз по строке, пока вы не достигнете завершающего ноль символа (unsigned 0
, или же char '\0'
). Если у вас есть какие-либо вопросы после просмотра, просто спросите:
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char *argv[]) {
char *buffer = NULL;
size_t n = 0;
ssize_t len;
char *ptr = NULL;
char *output = NULL;
int idx = 0;
printf ("\nEnter your string below: ([ctrl + d] on blank line to end)\n");
while ((len = getline (&buffer, &n, stdin)) != -1) {
ptr = buffer;
idx = 0;
output = malloc (sizeof (char) * len);
while (*ptr != 0) {
if (*ptr >= 48 && *ptr <= 57) output [idx++] = *ptr;
if (*ptr == 'I') output [idx++] = '1';
if (*ptr == 'o' || *ptr == 'O') output [idx++] = '0';
ptr++;
}
output [idx] = 0;
printf ("\n valid output: %s\n\n", output);
free (output);
}return 0;
}
выход:
Enter your string below: ([ctrl + d] on blank line to end)
This sting has 12345 aeiou AEIOU,,,,,commas, and 99, to end.
valid output: 123450100990