Удаление символов из строки C - PullRequest
0 голосов
/ 04 октября 2011

Учитывая строку (в качестве аргумента функции), после заданной комбинации символов мне нужно удалить последовательность нулей, если она завершается (это только обязательно для изменения строки).Например, если комбинация символов x+, строка 20.301x+000005 должна быть преобразована в 20.301x+5.

Я пробовал это:

void convertStr(char *analysisBuffer)
{
    char *exp;

    if( (exp = strstr(analysisBuffer,"x+"))!=NULL||(exp = strstr(analysisBuffer,"X+"))!= NULL)
    {
        exp += 2;
        char * zeroIt = exp;
        while(*zeroIt == '0')
            ++zeroIt;
        unsigned int x = exp - analysisBuffer;
        analysisBuffer[x] = '\0';
        strcat(analysisBuffer,zeroIt);
    }
}

Может кто-нибудь посоветовать мне, какправильно его реализовать?

Ответы [ 5 ]

3 голосов
/ 04 октября 2011

Это версия, которая работает для нескольких вхождений выражения и уменьшает размер строки, так что никакая память не занята нулевыми терминаторами.Это, вероятно, медленнее и совершенно не нужно, но дает вам удивительное чувство делать что-то причудливое.

Отказ от ответственности: я давно не писал чистого Си.

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char* strip_zero(char* str, const char* startseq) {
  // while there is an occurence of the substring
  size_t ssize = strlen(startseq);
  size_t oldlen = strlen(str) + 1; // account for terminator
  size_t rems = 0;
  char* begin = str;

  while((begin = strstr(begin, startseq))) {
    // move to the end of the sequence
    begin += ssize;
    char* walk = begin;
    // walk until we reach nonzero
    while(*walk == '0') { ++walk; ++rems; }
    // move the string forward
    memmove(begin, walk, strlen(walk) + 1);
  }

  // realloc the string
  return (char*)realloc(str, oldlen - rems);
}

int main(void)
{
  // make a copy so we can modify
  const char* a = "x+20.301x+00000x+0005x+";
  char* foo = (char*)malloc(strlen(a) + 1);
  strcpy(foo, a);
  printf("%s \n", foo);
  foo = strip_zero(foo, "x+");
  printf("%s \n", foo);
  free(foo);
  return 0;
}
2 голосов
/ 04 октября 2011

Ниже приведен более полный пример того, что вы хотите. Я пытался улучшить несколько предметов:

  • Используйте функцию strcasestr для теста без учета регистра. (Нам нужно #define _GNU_SOURCE для этого)
  • Используйте strcat (как вы сделали), чтобы добавить хвост струны к голове.
  • Будьте внимательны, чтобы определить строку как char test[] = "...", а не char *test = "...", так как последняя будет сегфолить.
  • Существует «если», чтобы увидеть, нужно ли нам пропустить одну или более «0».
  • Вы можете избавиться от цикла while, используя функцию, подобную rindex(), которая дает самый правый индекс символа в строке.

#define _GNU_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

    void
convertStr(char *analysisBuffer)
{
    char *exp = strcasestr(analysisBuffer, "x+");

    if (exp) {
        exp += 2;
        if (*exp == '0') {
            while (*exp == '0') {
                *exp = '\0';
                exp++;
            }
            strcat(analysisBuffer, exp);
        }
    }
}

    int
main(int argc, char *argv[])
{
    char test[] = "20.301X+0005";

    printf("before: %s\n", test);
    convertStr(test);
    printf("after : %s\n", test);

    return EXIT_SUCCESS;
}
1 голос
/ 05 октября 2011
size_t strip0( char *buff);
size_t strip0( char *buff)
{
size_t src,dst;

for (src=dst=0; buff[dst] = buff[src++] ;dst++ ) {
   if ((buff[dst] == 'x' || buff[dst] == 'X') && buff[src] == '+') {
      buff[++dst] = buff[src++] ;
      while (buff[src] == '0') src++;
      }
   }
return dst;
}

#include <stdio.h>

int main(int arc, char **argv)
{
char data[] = "100x+003 aap 200x+300 100X+003 noot 200X+300 mies 1234xX+000000000zzz";

printf("Org: %s\n", data);
strip0(data);
printf("New: %s\n", data);

return 0;
}
1 голос
/ 04 октября 2011

Вместо:

   unsigned int x = exp - analysisBuffer;
   analysisBuffer[x] = '\0';
   strcat(analysisBuffer,zeroIt);

Вы могли бы просто сделать:

   memmove(exp, zeroIt, strlen(zeroIt) + 1);
1 голос
/ 04 октября 2011

Что-то вроде

char * write = str;
char * read = str;
while(*read){
    while(*read && *read == '0'){ read++; }
    *write++ = *read++;
}
*write = '\0';

?(это не проверено)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...