#c
#c
Вопрос:
#include <stdio.h>
#include <ctype.h>
int main(void)
{
const char *str = "11 2 3 5a";
int i = 0;
unsigned int count = 0, tmp = 0;
printf("%sn", str);
while (sscanf(amp;str[count], "%d %n", amp;i, amp;tmp) != EOF) {
if (!isdigit(str[count])) break;
count = tmp;
printf("number %dn", i);
}
return 0;
}
У меня есть что-то подобное, но это все еще захватывает 5
. Как я могу заставить его игнорировать числа с буквами в них? Таким образом, в приведенном выше str
примере должно быть напечатано 11 2 3 вместо 11 2 3 5a
Комментарии:
1. Спецификатор формата
%n
ничего не сделает. Я думаю, вы хотели использовать там%u
вместо этого.2. @RohanBari я не согласен.
"%n"
здесь все в порядке.3. zzca, вы хотите принимать целые числа с начальным знаком
,-
?4. Учитывая изменяемую строку, например
char str[] = "11 2 3 5a";
, вы можете разделить строку на токены, используяstrtok
, а затем проверить каждый токен на наличие не цифр, прежде чем преобразовывать токен в число.
Ответ №1:
Сначала считайте ваши значения как подстроки, затем используйте strtol
с параметром end-marker, чтобы определить, преобразуется ли только что прочитанная подстрока в целое число полностью (т. Е. Что Она попала в терминатор строки для завершения обработки).
Это выглядело бы примерно так, более или менее:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
int main(void)
{
const char * str = "11 2 3 5a";
unsigned int count = 0, tmp = 0;
char s[ strlen(str) 1 ];
printf("%sn", str);
while (sscanf(str count, "%s%n", s, amp;tmp))
{
count = tmp;
char *end = NULL;
long i = strtol(s, amp;end, 10);
if (end amp;amp; *end)
break;
printf("number %ldn", i);
}
return 0;
}
Вывод
number 11
number 2
number 3
Комментарии:
1. @chux-RestorateMonica Если бы это было сделано, нецифровый начальный символ (например:
a
) прошел бы (посколькуend > s
было бы false). Помните, что этот тест предназначен для обнаружения сбоя, а не успеха.2. @chux-Переустановите Monica Да, это жизнеспособно.
3. @WhozCraig Я пробовал это, но кажется, что когда вы удаляете «a», он печатает последнее число дважды. Вероятно, я должен упомянуть, что str будет вводиться пользователем с помощью getline(). Мне просто нужно, чтобы он печатал числа до тех пор, пока не будет введена недопустимая вещь EXP 1 2 3 a 5 6 7 = 1 2 3 и 1 2 3a = 1 2 допустимый ввод будет 1 2 3 4 5 = 1 2 3 4 5