删除字符串C的第一个字符

5

我将尝试移除字符串的第一个字符并保留其余部分,但我的当前代码无法编译,我很困惑如何修复它。

我的代码:

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个回答

8
在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和free进行内存分配和释放的基本函数。如果您要进行C编程,这些是必须掌握的功能。

2

根据您的描述,您希望处理“字符串”。但是您的代码处理的是char缓冲区/指针。最简单的方法是删除字符串的第一个字符:

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);
}

-1
你的函数声明返回一个 char *,但你却返回了一个 char。
此外,为什么不直接返回指向第二个字符的指针呢?
char * newStr (char * charBuffer)
{
   if (charBuffer && (*charBuffer == 'A' || *charBuffer == 'Q')) return charBuffer + 1;
   return charBuffer;
}

3
这是一个不好的做法。如果字符串是动态分配的,会怎样呢?也许存储空间最终会被释放(从第二个字符开始)。应该先将字符串复制到新的存储空间中。 - advait
如果这是个问题,他可以返回strdup(charBuffer + 1),解决方案是一样的。 - Brandon Horsley
@thethimble 这正是我的想法。我很高兴我们都评论了不同的答案,这样它们就都能得到纠正。 - WillfulWizard
这正是标准的C字符串库如strchr、strstr等的工作方式。 - Brandon Horsley

-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"
}

不确定为什么我被踩了。人们编写库函数来帮助简化常见任务,如字符串操作和复制。此外,90%的情况下,这些库函数比手动尝试更高效和稳健。 - advait
我猜测你两次调用newStr时出现了内存泄漏,但如果注释下降投票是必需的,那就太好了。我也不喜欢匆忙的负面评价,这让你不知道自己是否犯了错误,或者具体哪里出了问题。 - Brandon Horsley

-1

你可以简单地将字符指针向前移动一个字符:

char* newstring = oldstring + 1;

charBuffer = charBuffer + 1; 返回 charBuffer; - Dacto
我假设用户会对空字符串进行错误检查,并将两个字符串都用作只读。如果对任何一个字符串进行编辑,那么两个字符串都会开始变得不稳定。是的,Dacto,你也可以这样做。 - Ian Wetherbee

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接