Игнорирование чисел буквами

#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