【问题标题】:Remove first char of string C删除字符串 C 的第一个字符
【发布时间】:2010-07-28 19:11:42
【问题描述】:

我试图删除字符串的第一个字符并保留其余部分,我当前的代码无法编译并且我对如何修复它感到困惑。

我的代码:

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:“警告:return 从整数中生成指针而不进行强制转换”

另外:“char * newStr (char * charBuffer)”需要保持不变。

【问题讨论】:

    标签: c string char gcc-warning


    【解决方案1】:

    字符串在 C 中不是这样工作的。您将缓冲区中的所有字符汇总到 v 变量中。您不能使用 + 来连接。您发布的代码有一些严重的问题,这表明在如何使用 C 方面存在理解差距。

    试试这个:

    char *newStr (char *charBuffer) { int 长度 = strlen(charBuffer); 字符 *str; 如果(长度

    或者这个:

    char *newStr (char *charBuffer) { 字符 *str; if (strlen(charBuffer) == 0) str = 字符缓冲区; 别的 str = 字符缓冲区 + 1; 返回字符串; }

    取决于您是否要分配新字符串。您还必须添加代码以处理不以“Q”或“A”开头的情况。我没有包括那些,因为我不确定你在这里想要做什么。

    确保您对使用 malloc 和 free 分配和释放内存进行了一些研究。如果您要进行 C 编程,这些是可以使用的基本函数。

    【讨论】:

      【解决方案2】:

      好吧,您的描述说您要处理“字符串”,但您的代码处理的是字符缓冲区/指针。删除字符串的第一个字符的最简单方法是

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

      【讨论】:

        【解决方案3】:

        您可以简单地将 char 指针移入一个字符:

        char* newstring = oldstring + 1;
        

        【讨论】:

        • 像这样?:charBuffer = charBuffer + 1;返回字符缓冲区;
        • 我假设用户会错误检查空字符串等,并将两个字符串都用作只读字符串。如果对任一字符串进行了任何编辑,则两个字符串都开始变得不稳定。是的,Dacto,你也可以这样做。
        【解决方案4】:

        您的函数被声明为返回一个 char *,而您正在返回一个 char。

        另外,你为什么不直接返回一个指向第二个字符的指针呢?

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

        【讨论】:

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

        其他几个答案建议返回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% 的情况下,这些库函数比手动尝试更高效、更健壮。
        • 我猜这是你对 newStr 的两次调用中的内存泄漏,但如果需要注释反对票会很好 - 我也不喜欢反对票,让您怀疑自己是否犯了错误,或者具体出了什么问题。
        猜你喜欢
        • 2011-06-24
        • 2011-05-29
        • 1970-01-01
        • 2011-05-16
        • 2012-11-27
        • 2013-07-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多