Удалить первый символ строки C - PullRequest
4 голосов
/ 28 июля 2010

Я пытаюсь удалить первый символ строки и сохранить остаток, мой текущий код не компилируется, и я не понимаю, как его исправить.

Мой код:

char * newStr (char * charBuffer)
{
    int len = strlen(charBuffer);
    int i = 1;
    char v;
    if(charBuffer[0] == 'A' || charBuffer[0] == 'Q'){
        for(i=1;i<len;i++)
            v = v + charBuffer[i];
    }
    v = v + '\0';
    return v;
}

Gcc: «Предупреждение: возвращение делает указатель из целого числа без приведения»

Также: «char * newStr (char * charBuffer)» должен оставаться прежним.

Ответы [ 5 ]

7 голосов
/ 28 июля 2010

Строки не работают так в Си. Вы суммируете все символы в буфере в переменную v. Вы не можете использовать + для объединения. Код, который вы опубликовали, имеет некоторые серьезные проблемы, которые указывают на то, что есть пробел в понимании того, как использовать C.

Попробуйте это:

char *newStr (char *charBuffer) {
  int length = strlen(charBuffer);
  char *str;
  if (length <= 1) {
    str = (char *) malloc(1);
    str[0] = '\0';
  } else {
    str = (char *) malloc(length);
    strcpy(str, &charBuffer[1]);
  }
  return str;
}

или это:

char *newStr (char *charBuffer) {
  char *str;
  if (strlen(charBuffer) == 0)
    str = charBuffer;
  else
    str = charBuffer + 1;
  return str;
}

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

Удостоверьтесь, что вы провели некоторое исследование по распределению и освобождению памяти с помощью malloc и free. Это основные функции, которые можно использовать, если вы собираетесь заниматься программированием на Си.

2 голосов
/ 28 июля 2010

Ну, ваше описание говорит, что вы хотите иметь дело со "строками", но вы пишете кодовые буферы / указатели.Самый простой подход к удалению первого символа для строк был бы

const char *newStr(const char *string)
{
    return string+1;
}

, но поскольку это совсем не похоже на то, что делает ваш код, вы, вероятно, хотите чего-то другого.Например, если вы хотите просто удалить начальный «A» или «Q», а затем скопировать строку в буфер, вам нужно что-то вроде

char *newStr(const char *string)
{
    if (string[0] == 'A' || string[0] == 'Q')
        string++;
    return strdup(string);
}
0 голосов
/ 28 июля 2010

Несколько других ответов рекомендовали вернуть charBuffer + 1. Как я отметил в моем предыдущем комментарии:

Это плохая практика. Что, если строка выделяется динамически? Возможно, со временем хранилище будет освобождено (начиная со второго символа). Строка должна быть сначала скопирована в новое хранилище.

Освобождение части хранилища из середины приведет к неопределенному поведению.

Вместо этого попробуйте функцию strdup, которая будет возвращать дубликат данной строки.

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

char *newStr(char* charBuffer) {
    if (charBuffer && (charBuffer[0] == 'A' || charBuffer[0] == 'Q'))
        return strdup(charBuffer + 1);
    else 
        return strdup(charBuffer);
}

void main() {
    char a[7] = "Advait";
    char b[5] = "John";
    printf("%s\n",newStr(a));   // Prints "dvait"
    printf("%s\n",newStr(b));   // Prints "John"
}
0 голосов
/ 28 июля 2010

Ваша функция объявлена ​​как возвращающая символ *, а вы возвращаете символ.

Кроме того, почему бы вам просто не вернуть указатель на второй символ?

char * newStr (char * charBuffer)
{
   if (charBuffer && (*charBuffer == 'A' || *charBuffer == 'Q')) return charBuffer + 1;
   return charBuffer;
}
0 голосов
/ 28 июля 2010

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

char* newstring = oldstring + 1;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...