C语言中字符串的末尾
我需要一个函数来删除字符串末尾的C语言中字符串的末尾,c,string,parsing,pointer-arithmetic,C,String,Parsing,Pointer Arithmetic,我需要一个函数来删除字符串末尾的)字符。 例如,hello,world)应转换为hello,world 我写过这样的话: char *a="hello,world)"; int a_len=strlen(a); *(a+a_len-1)='\0'; printf("%s", a); 但是输出中没有显示任何内容。理想情况下,您应该得到一个分段冲突运行时错误 您已经为驻留在只读内存中的字符串文本分配了指针。试图修改这是不好的 尝试将其复制到堆栈中 char a[] ="hello,world)";
)
字符。
例如,hello,world)
应转换为hello,world
我写过这样的话:
char *a="hello,world)";
int a_len=strlen(a);
*(a+a_len-1)='\0';
printf("%s", a);
但是输出中没有显示任何内容。理想情况下,您应该得到一个分段冲突运行时错误 您已经为驻留在只读内存中的字符串文本分配了指针。试图修改这是不好的 尝试将其复制到堆栈中
char a[] ="hello,world)";
如果您真的需要使用动态内存(请在您的问题中写下),那么您必须手动将字符串复制到那里:
char *a = malloc(sizeof("hello,world)"));
memcpy(a, "hello,world)", sizeof("hello,world)"));
int a_len=strlen(a);
a[a_len - 1] = '\0';
或者,也可以让printf截断字符串:
printf("%.*s", strlen(a) - 1, a);
正如巴兹尔指出的,还有strdup
char * a = strndup("hello,world)", sizeof("hello,world)") -2);
请注意,这里我们必须截断两个字符,因为
sizeof
包含空终止符,但strndup
将始终添加一个。我必须使用动态内存,因此我必须保留char[]
尝试此操作也不起作用:
char *a=malloc(4);
a="hello,world)";
int a_len=strlen(a);
*(a+a_len-2)='\0';
printf("%s", a);
分析: 第1行:
char*a=“你好,世界)”代码>
变量a
指向位于程序(只读)代码部分的字符数组
第3行:*(a+a#len-1)='\0'代码>
当CPU试图写入只读内存段时,会发生内存访问冲突
解决方案:
第1行:chara[]=“你好,世界)”代码>
变量a
是位于程序堆栈中的字符数组,它是一个读/写部分您有一个很好的编译器,它不SIGSEGV
。@devnull:编译器为什么要SIGSEGV?;)@MichaelFoukarakis你可能想引用。@devnull:我想他的意思是SIGSEGV发生在运行时而不是编译时time@HayriUğurKoltuk也许。我认为执行是含蓄的。(执行此操作时)再次向只读内存分配指针。你必须将字符串复制到动态内存中。它也应该是-1:)看我的答案,我已经编辑过了。请使用评论进行讨论,而不是发布您自己的无效答案。如果malloc
一个更大的区域,然后使用strcpy
您可以使用strdup
我必须保持我的代码中没有libc函数,所以我认为memcpy是一个更好的使用方法。