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
atypedef 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,所以谢谢你,我已经修复了它。