Обрезка строки Int - PullRequest
       7

Обрезка строки Int

1 голос
/ 07 октября 2010

В моей программе я хочу ввести целочисленную строку, например, 2107900000. Я хочу получить ее длину и затем удалить все 0 и 1.

Ответы [ 3 ]

2 голосов
/ 07 октября 2010

Предположим, вы хотите создать новую строку, и я предполагаю, что вам нужна функция, которая просто принимает указатель на такую ​​строку: (где предполагается, что то, на что указывает stripped, по крайней мере того же размера, что ина что указывает orig)

void strip_0s_and_1s(char *orig, char *stripped)
{
    // while we haven't seen a null terminator
    while(*orig){
        // if the current character is not a 1 or a 0...
        if(*orig != '0' && *orig != '1'){
           // copy the character
           *stripped= *orig;
           stripped++;
        }
        // increment pointer to old string
        orig++;
    }
    // terminate 'stripped' string
    *stripped= '\0';
}

Я считаю, что вызов этого с одинаковым указателем для обоих аргументов должен заменить на месте ...

Чтобы ответить на ваш вопрос о поискедлина входных строк во время выполнения вы можете сделать что-то вроде:

#include <stdio.h>
#include <string.h>
int main (int argc, char **argv) {
    int len; 
    char str[100]; // max string length of 99+1 null terminator
    scanf("%s", str); 
    len = strlen(str);
    printf("%d", len); 
    return 0; 
}

(правка: изменено, чтобы исключить использование new в качестве имени переменной)

(правка: добавлена ​​информация о вводестроки во время выполнения и поиск длины строки)

1 голос
/ 07 октября 2010

for (i=j=0; s[i]=s[j]; i+=((unsigned)s[j++]-'0'>2));

ОК, поскольку есть потребность в объяснении, идея состоит в том, чтобы перебрать строку с двумя индексами: пункт назначения (i) и источник (j). На каждом шаге символ копируется из исходного индекса в целевой индекс, и, поскольку копирование является условием цикла, оно завершается, если копируемый символ является нулевым терминатором. На каждой итерации исходный индекс увеличивается (j++), но целевой индекс увеличивается только в том случае, если скопированный символ не был 0 или 1 (если это был один из этих двух символов, он просто будет перезаписан на следующая итерация). Тест (unsigned)s[j++]-'0'>2 использует модульную арифметику и свойство, состоящее в том, что цифры 0-9 имеют последовательные значения в качестве символов, чтобы выполнить оптимальный тест на предмет того, находится ли исходный символ вне диапазона от '0' до '1', и это значение истинности ( который оценивается как 0 или 1 для false или true, соответственно) используется в качестве суммы для увеличения целевого индекса на.

1 голос
/ 07 октября 2010

Возможно, не оптимально, но вы можете условно скопировать его в другой буфер:

 char buffer[20];
 char num[] = "2107900000";
 int j = 0;
 for (int i = 0; num[i]; i++)
 {
   if (num[i] != '0' && num[i] != '1')
   {
     buffer[j] = num[i];
     j++;
   }
 }
 buffer[j] = 0 //null terminator

Или вы можете сделать это в одном буфере:

 char num[] = "2107900000";
 int j = 0;
 for (int i = 0; num[i]; i++)
 {
   if (num[i] != '0' && num[i] != '1')
   {
     num[j] = num[i];
     j++;
   }
 }
 num[j] = 0 //null terminator
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...