C 删除数组的第一个字符

C 删除数组的第一个字符,c,C,我有一个字符串: str1 = "abcabcabc"; 如何删除第一个字符?我希望最终结果是: str1 = "bcabcabc"; 指针技巧(零成本): char* s = "abcd"; char* substr = s + 1; // substr == "bcd" char s[] = "abcd"; char* substr = s + 1; memmove(s, substr, strlen(substr) + 1); // s == "bcd" char* src = "

我有一个字符串:

str1 = "abcabcabc";
如何删除第一个字符?我希望最终结果是:

str1 = "bcabcabc";
指针技巧(零成本):

char* s = "abcd";
char* substr = s + 1;
// substr == "bcd"
char s[] = "abcd";
char* substr = s + 1;
memmove(s, substr, strlen(substr) + 1);
// s == "bcd"
char* src = "abcd";
char* substr = src + 1;
char dest[strlen(substr) + 1];
strcpy(dest, substr);
// dest == "bcd"
std::string src = "abcd";
std::string dest = src.substr(1);
// dest == "bcd"
std::string src = "abcd";
std::string dest;
std::copy(src.begin() + 1, src.end(), std::back_inserter(dest));
// dest == "bcd"
或:


通过:

char* s = "abcd";
char* substr = s + 1;
// substr == "bcd"
char s[] = "abcd";
char* substr = s + 1;
memmove(s, substr, strlen(substr) + 1);
// s == "bcd"
char* src = "abcd";
char* substr = src + 1;
char dest[strlen(substr) + 1];
strcpy(dest, substr);
// dest == "bcd"
std::string src = "abcd";
std::string dest = src.substr(1);
// dest == "bcd"
std::string src = "abcd";
std::string dest;
std::copy(src.begin() + 1, src.end(), std::back_inserter(dest));
// dest == "bcd"
请注意,我们必须使用
char[]
而不是
char*
,如前所述,后者将引用只读内存。此外,不应使用
strcpy
,因为对于
strcpy
,src和dest不得重叠


通过:

char* s = "abcd";
char* substr = s + 1;
// substr == "bcd"
char s[] = "abcd";
char* substr = s + 1;
memmove(s, substr, strlen(substr) + 1);
// s == "bcd"
char* src = "abcd";
char* substr = src + 1;
char dest[strlen(substr) + 1];
strcpy(dest, substr);
// dest == "bcd"
std::string src = "abcd";
std::string dest = src.substr(1);
// dest == "bcd"
std::string src = "abcd";
std::string dest;
std::copy(src.begin() + 1, src.end(), std::back_inserter(dest));
// dest == "bcd"

通过C++转换为新字符串:

char* s = "abcd";
char* substr = s + 1;
// substr == "bcd"
char s[] = "abcd";
char* substr = s + 1;
memmove(s, substr, strlen(substr) + 1);
// s == "bcd"
char* src = "abcd";
char* substr = src + 1;
char dest[strlen(substr) + 1];
strcpy(dest, substr);
// dest == "bcd"
std::string src = "abcd";
std::string dest = src.substr(1);
// dest == "bcd"
std::string src = "abcd";
std::string dest;
std::copy(src.begin() + 1, src.end(), std::back_inserter(dest));
// dest == "bcd"

通过C++转换为新字符串:

char* s = "abcd";
char* substr = s + 1;
// substr == "bcd"
char s[] = "abcd";
char* substr = s + 1;
memmove(s, substr, strlen(substr) + 1);
// s == "bcd"
char* src = "abcd";
char* substr = src + 1;
char dest[strlen(substr) + 1];
strcpy(dest, substr);
// dest == "bcd"
std::string src = "abcd";
std::string dest = src.substr(1);
// dest == "bcd"
std::string src = "abcd";
std::string dest;
std::copy(src.begin() + 1, src.end(), std::back_inserter(dest));
// dest == "bcd"


还有几十种其他方法(特别是在包括C++时),但我就到此为止了:

如果你真的想说

char str1 [] = "abcabcabc";
那么最简单的就是

str1 = &str1[1];
如果您想修改实际数据,那么您只需将所有内容向上移动一个位置。您可以使用循环或
memmove()
。递归函数是多余的

如果你真的是C++,你使用的是字符串对象,那么你可以使用< /P>

str1 = str1.substr(1);

以下是一种方法:

int index = 0; //index to cull
memmove( &word[ index ] , &word[ index +1], strlen( word ) - index) ;

如果您有一个指向以下字符串的字符指针:

char *s = "This is my string";
然后你就可以做
s++

如果您有一个字符数组,最好的选择可能是也有一个指向该数组的指针:

char s[] = "This is my string";
char *ps = s;
然后您可以执行
ps++
,并确保使用
ps
而不是
s

如果不希望有单独的指针指向数组,则可以使用
memmove
复制数据:

memmove (s, s+1, strlen (s+1) + 1); // or just strlen (s)
虽然这些都不适用于初始为空的字符串,所以您必须首先检查它。还请记住,不建议尝试以这种方式(或任何方式)修改字符串文字,因为对于是否允许这样做还没有定义

另一个解决方案是简单地编写一个循环:

for (char *ps = s; *ps != '\0'; ps++)
    *ps = *(ps+1);
*ps = '\0';

这将适用于所有字符串,无论是空字符串还是其他字符串。

据我所知,如果您担心内存分配问题,则必须将(str1+1)复制到您个人分配内存的新字符串中,然后释放第一个指针。 真正简单的方法是用str1++增加str1;这将使它比以前多指向一个字符,只需一行代码即可得到所需的结果。

\include
#include <stdio.h>
#include <conio.h>
main(){
   char a[10];
   int i;
   gets(a);

   for (i = 0; a[i] != '\0'; i++) {
      a[i] = a[i + 1];
   }

   printf("\n");
   puts(a);
   getch();
}
#包括 main(){ chara[10]; int i; 获得(a); 对于(i=0;a[i]!='\0';i++){ a[i]=a[i+1]; } printf(“\n”); 第(a)款; getch(); }
如果你展示你迄今为止所写的内容,并询问如何从困境中走出来,那将是一件好事。你面临的问题是什么!我将编写一个递归函数来实现这一点,它是
string
a
typedef char*string还是使用C++?我很确定
string
不是语言(C)附带的。啊,我知道出了什么问题:编辑。@hkvega这绝对不是必要的。问题不在于衰减(确实发生了),问题在于尝试向非指针进行asign。如果str1声明为
char*str1
,它就会起作用。您是对的,如果您声明
char str1[]
,那么它将不起作用。但是不清楚OP使用的是什么。@Adam如果&str1被传递给一个需要
char**
并在那里递增的函数,会发生什么?当
str1
超出范围时,它是否会导致崩溃?@dashesy如果str1被声明为
char*str1
,则无论如何都无法将其传递给接受
char**
的函数。当您访问已释放的内存时(希望如此),会发生崩溃。这与上述情况无关。如果
str1
超出范围,则任何涉及
str1
的语句都是编译器错误。@Adam-我的意思是在
char str1[]=“abcabc”时传递&str1这有三个缺陷(每个部分一个)。(1) 不能增加字符数组,只能增加指针。(2) 这一个创建了一个新的字符串,不过这可能可以通过复制回原始字符串来修复。(3)C++解决方案可能是正确的(我不能评论),但它对于C问题几乎没有用处:-)PaxDabLuLo(1)我修复它,然后取消它,因为我记不起为什么我要修复它。(2) 现在看起来还好吗?(3)是的,我喜欢C++。整个3行
if
位可以替换为
strcpy(str2,&(str1[1])
,不需要
pstr1
,并且
的大小(在
if
中)应该是
strlen
。我真的很喜欢strcpy方法,有没有一种方法不仅可以删除第一个字母,还可以删除最后一个字母?@cheetaian你可以使用。多亏了你,我一半的神经都被撕裂了。:)只有一条评论。如果字符串的空间是malloc'ed,则保留原始指针,否则将无法释放该空间。如果空间是硬编码的,那么当然没有问题+1在递归beast上。:-)目前还不确定。。。但是不应该
memmove(s,s+1,strlen(s+1))be<代码>memmove(s,s+1,strlen(s-1))
?@mozzbozz,不,你可能想的是
strlen(s)-1
,这是正确的,相当于
strlen(s+1)
,除了
s[0]==0的退化情况。表达式
strlen(s-1)
不是一回事。@mozzbozz:但是,你的评论导致我出现了一个漏洞,我没有复制最后的NUL,所以谢谢你,我已经修复了它。