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是一个更好的使用方法。