我正在尝试在C中的某个字符后结束我的字符串。此程序将与文件系统一起使用,因此字符将重复,我需要找到该字符的最后一次出现,然后删除所有内容。< / p>
我从互联网上找到了一些东西,但这不起作用,我不知道为什么。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void deleteEnd (char* myStr){
printf ("%s\n", myStr);
char *del = &myStr[strlen(myStr)];
while (del > myStr && *del != '/')
del--;
if (*del== '/')
*del= '\0'; // the program crashes here
return;
}
int main ( void )
{
char* foo= "/one/two/three/two";
deleteEnd(foo);
printf ("%s\n", foo);
return 0;
}
此代码基本上找到最后一个'/'字符并将null终止符放在那里。它在理论上有效但不实际。
顺便说一句,如果我的方式有问题,有没有更好的方法呢?
谢谢。
**编辑:我根据建议用“strrchr()”替换了我的代码,但仍然没有结果:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void deleteEnd (char* myStr){
char *lastslash;
if (lastslash = strrchr(myStr, '/'))
*lastslash = '\0'; // the code still crashes here.
return;
}
int main ( void )
{
char* foo= "/one/two/three/two";
deleteEnd(foo);
printf ("%s\n", foo);
return 0;
}
答案 0 :(得分:2)
在C中,当你写这样的文字字符串时: char * foo =&#34; / one / two / three / two&#34 ;;
这些是不可变的,这意味着它们嵌入在可执行文件中并且是只读的。
尝试修改只读数据时会出现访问冲突(崩溃)。
相反,您可以将字符串声明为字符数组而不是文字字符串。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void deleteEnd (char* myStr){
printf ("%s\n", myStr);
char *del = &myStr[strlen(myStr)];
while (del > myStr && *del != '/')
del--;
if (*del== '/')
*del= '\0';
return;
}
int main ( void )
{
char foo[] = "/one/two/three/two";
deleteEnd(foo);
printf ("%s\n", foo);
return 0;
}
答案 1 :(得分:1)
yeschar * lastslash;
if (lastslash = strrchr(myStr, '/'))
*lastslash = '\0'; // the code still crashes here.
return;
}
int main(void) {
char foo[]= "/one/two/three/two";
deleteEnd(foo);
printf ("%s\n", foo);
答案 2 :(得分:0)
答案 3 :(得分:0)
只需将foo
声明为字符数组,而不是指向char的指针:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void deleteEnd (char* myStr){
char *lastslash;
if (lastslash = strrchr(myStr, '/'))
*lastslash = '\0'; // the code still crashes here.
return;
}
int main ( void )
{
char foo[]= "/one/two/three/two";
deleteEnd(foo);
printf ("%s\n", foo);
return 0;
}
答案 4 :(得分:0)
您无法更改字符串常量,您必须复制到新的字符串。
#include <iostream>
#include <cstring>
void delete_end(char* dest, const char* source)
{
const char* p = source + strlen(source) - 1;
while(*p != '/' && p > source)
--p;
strncpy(dest, source, p - source);
dest[p-source] = '\0';
}
int main()
{
const char* str = "one/two/three/four";
char buf[256];
delete_end(buf, str);
std::cout << buf << std::endl;
return 0;
}
答案 5 :(得分:0)
要查找C中字符串中最后一个字符,请使用strrchr(3)
函数。它的原型位于&lt; string.h&gt; 。