我试图删除字符串的第一个字符并保留剩余部分,我当前的代码没有编译,我对如何解决它感到困惑。
我的代码:
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)”需要保持不变。
答案 0 :(得分: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和free分配和释放内存进行了一些研究。如果您要进行C编程,这些是能够使用的基本功能。
答案 1 :(得分: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);
}
答案 2 :(得分:-1)
您只需将您的字符指针移动一个字符:
char* newstring = oldstring + 1;
答案 3 :(得分:-1)
声明您的函数返回一个char *并返回一个char。
此外,为什么不直接返回指向第二个字符的指针?
char * newStr (char * charBuffer)
{
if (charBuffer && (*charBuffer == 'A' || *charBuffer == 'Q')) return charBuffer + 1;
return charBuffer;
}
答案 4 :(得分:-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"
}