Как складывать числа string в c?

У меня есть string: lo1lo2lo3lo4

Я хочу сложить +1 в числа string

Тогда я остался бы так:

lo2lo3lo4lo5
0
задан 19.04.2017, 12:14
3 ответа

Ты можешь использовать функцию isalpha заголовка <ctype.h> чтобы определять, если характер - буква; если это не буква: это будет другая вещь (возможно число).

Итак:

char entrada[] = "lo1lo2lo3lo4";

for (char *letra = entrada, *fin = entrada + strlen(entrada); letra != fin; ++letra)
{
    if (!isalpha(*letra))
        ++(*letra);
}

Предыдущий код складывает один в характер entrada когда вышеупомянутый характер - (возможно) число. Нужно иметь в виду, что этот код считает 11 как два числа 1 не как одиннадцать, и что не имеет в виду ни знаков препинания, ни места.

Ты можешь видеть код функционируя [здесь].


Изданный

Предложение eferion с isdigit она более точная, (кроме того, что контролирует случай 9).

2
ответ дан 24.11.2019, 13:11

Если числа будут являться всеми цифры, с арифметикой указателей он почти тривиальный:

char cad[100];
strcpy(cad,"lo1lo2lo3lo4");

for( char* ptr = cad; *ptr; ++ptr )
{
  if( isdigit(*ptr) )
    *ptr = (*ptr!='9')? *ptr+1 : '0';
}

Если бы числа смогли занимать больше цифр, было бы нужно конвертировать фрагменты, соответствующие числам:

char cad[100];
strcpy(cad,"lo1lo99lo3lo4");
char resultado[100];

for( char* orig = cad, *dest=resultado; *dest=0 || *orig ; ++orig, ++dest )
{
  if( !isdigit(*orig) )
    *dest = *orig;
  else
  {
    int valor = 0;
    do
    {
      valor *= 10;
      valor += *orig - '0';
    } while( isdigit(*(++orig) );

    dest += sprintf(dest, "%d", valor+1) - 1;
  }
}

printf("%s",resultado);

Я ИЗДАЮ: Немного более упрощенная версия предыдущего примера, так как он уполномочивает чтение целых чисел:

char cad[100];
strcpy(cad,"lo1lo99lo3lo4");
char resultado[100];

for( char* orig = cad, *dest=resultado; *dest=0 || *orig ; ++orig, ++dest )
{
  if( !isdigit(*orig) )
    *dest = *orig;
  else
  {
    int valor;
    orig += sscanf(orig,"%d",&valor) - 1;
    dest += sprintf(dest, "%d", valor+1) - 1;
  }
}

printf("%s",resultado);

Приветствие.

2
ответ дан 24.11.2019, 13:11
  • 1
    Глаз во второй c и # 243; я говорю, ты можешь выходить из берегов b и # 250; fer, увеличившись n и # 250; морские окуни 9 смоги переходить к тому, чтобы иметь два d и # 237; gitos с одного d и # 237; gito, 99 три, 999 четыре... с другой стороны в condici и # 243; n est и # 225; s делая asignaci и # 243; n вместо comparaci и # 243; n в *dest=0. – PaperBirdMaster 05.10.2016, 17:45
  • 2
    Второй c и # 243; я говорю est и # 225; подумавший, чтобы перемещать от 1 до 2 d и # 237; gitos и схвати и # 237; в самом деле, если ты обращаешь внимание цепь ввода, у него есть один 99. Проблема podr и # 237; чтобы быть tama и # 241; или буфера, который не подтверждается, но это уже ответственность того, который использует алгоритм. *dest=0 est и # 225; место в drede. То, что он делает, он состоит в том, чтобы обеспечивать себе в том, что цепь resultado заканчивается недействительным характером. jejeje – eferion 05.10.2016, 18:00
  • 3
    #161; Верный! это не что-то, что было бы видно в простой вид..., остается достаточно ослепительный цикл, но мой aproximaci и # 243; n также это не summum читабельности:) – PaperBirdMaster 05.10.2016, 18:47
  • 4
    Jajajaja. Я это сделал просто из-за того, что не должен доставать указатель dest вне цикла, чтобы заканчивать переменную. Немного ослепительный, если, что остается, не может иметь по отношению к себе все;) – eferion 05.10.2016, 18:50
  • 5
    в † ‘ Прилегал c и # 243; я говорю, sprintf() я ayud и # 243; чтобы уменьшать c и # 243; я говорю моего ответа. Ранее он использовал itoa(), которые aprend и # 237; книги Язык programaci и # 243; n C – Aprendiendo.NET 06.10.2016, 04:52

TambiГ©n мы можем использовать ее funciГіn strtok(), которые позволяют разделять последовательность символов (char*) на части, segГєn char* разделитель. Тогда части serГ-an они nГєmeros:

2 3 4 5----> 2, 3, 4, 5

Разделитель vendrГ - чтобы в быть:

Пример:

#include <stdio.h>
#include <string.h>    // strtok()
#include <stdlib.h>    // atoi()

#define     INC         1    // El valor que se sumará.
#define     STRLENMAX   256  // La longitud máxima de las strings.
#define     SEP         "lo" // El separador.

int main()
{
    char texto[STRLENMAX] = "lo1lo25lo3lo4lo5lo6lo7lo8lo9lo10lo11lo12";
    char r[STRLENMAX] = "\0";    // Resultado.

    // Obtiene el primer token.
    char *token = strtok(texto, SEP);

    // Si hubo un token, continúa extrayendo tokens.
    while( token != NULL ) 
    {
        int suma = atoi(token) + INC;   /* atoi convierte el ascii token en int,
                                           y luego se suma INC */
        char snum[10];
        sprintf(snum, "%i", suma);      // Convierte el int suma en una char*
        strcat(r, SEP);                 // Concatena el separador SEP con 
        strcat(r, snum);                //  el resultado de la suma.

        token = strtok(NULL, SEP);      // Siguiente token.
    }

    printf("r = %s\n", r);    // Muestra el resultado.

    return 0;
}

Другой пример, но этот раз для случаев delimitadores переменные:

#include <stdio.h>
#include <string.h>    // strspn(), strcspn(), strncpy(), strcat(), strncat(), memset()
#include <stdlib.h>    // atoi()

#define     INC         1    // El valor que se sumará.
#define     STRLENMAX   256  // La longitud máxima de las strings.
#define     NUMBERS     "0123456789"

int main()
{
    char texto[STRLENMAX] = "lo1lo25lo3lo4loto500loteria6lo7lo8lo9lo10lo11lo12";
    char* p = texto;            // Apunta las posiciones de la variable texto.
    char r[STRLENMAX] = "\0";   // Resultado.
    char sn[10];                // Salva el número que será convertido en int.

    int b = 1;  // Bandera para saber si se está buscando texto (b = 0) o números (b = 1).

    do
    {
        // Cuenta los char hasta encontrar un dígito, cuando b = 0
        // o cuenta los char hasta encontrar un char que no es dígito, cuando b = 1
        size_t t = b ? strspn(p, NUMBERS) : strcspn(p, NUMBERS);

        if (b && t)     // Con b se comprueba si se están buscando dígitos, y
        {               // con t si se ha encontrado al menos uno.
            memset(sn, '\0', sizeof(sn));   // Limpia el vector sn.
            strncpy(sn, p, t);              // Copia en sn los chars que van
                                            // desde texto[p] hasta texto[p + t - 1]
            int suma = atoi(sn) + INC;
            sprintf(sn, "%i", suma);
            strcat(r, sn);                  // Realiza la concatenación r = r + sn
        }
        else if (!b)                        // Comprueba si no se están buscando dígitos.
            strncat(r, p, t);               // Concatena en r, r y los chars que van
                                            // desde texto[p] hasta texto[p + t - 1]
        b = !b;                             // Actualiza la bandera.
        p += sizeof(char) * t;              // p son los caracteres que ya se han analizado

    }while(*p);                             // Mientras haya char en texto[].

    printf("r = '%s' \n", r);

    return 0;
}
0
ответ дан 24.11.2019, 13:11