2010-07-28 3 views
4

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

Мой код:

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: "Внимание: возвращение делает указатель из целого числа без приведения"

Кроме того: "полукокс * NewStr (символ * CharBuffer)" должен оставаться такими же.

ответ

7

Строки не работают, как это в C. Вы суммируя все символы в буфере в переменную 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 и бесплатно. Это фундаментальные функции, которые можно использовать, если вы собираетесь выполнять программирование на С.

-1

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

char* newstring = oldstring + 1; 
+0

вот так ?: charBuffer = charBuffer + 1; return charBuffer; – Dacto

+0

Я предполагаю, что пользователь будет проверять ошибку для нулевых строк и т. Д. И использовать обе строки как только для чтения. Если какое-либо редактирование было выполнено для любой строки, обе строки начинают становиться неустойчивыми. Да Дакто, ты тоже можешь это сделать. –

-1

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

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

char * newStr (char * charBuffer) 
{ 
    if (charBuffer && (*charBuffer == 'A' || *charBuffer == 'Q')) return charBuffer + 1; 
    return charBuffer; 
} 
+3

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

+0

Он может вернуть strdup (charBuffer + 1), если это проблема, решение остается тем же. –

+0

@thethimble Это были мои мысли точно. Я рад, что мы оба прокомментировали разные ответы, поэтому все они исправлены. – WillfulWizard

2

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

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

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

char *newStr(const char *string) 
{ 
    if (string[0] == 'A' || string[0] == 'Q') 
     string++; 
    return strdup(string); 
} 
-1

Несколько из других ответов рекомендуется возвращение 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

Не знаю, почему меня проголосовали. Люди написали библиотечные функции, чтобы помочь просто обычным задачам, таким как манипуляции с строками и копирование. Более того, в 90% случаев эти функции библиотеки более эффективны и надежны, чем ручные попытки. – advait

+0

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

 Смежные вопросы

  • Нет связанных вопросов^_^