剥去C中字符串的结尾

时间:2014-02-11 13:49:36

标签: 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);

但输出中没有显示任何内容。

3 个答案:

答案 0 :(得分:6)

理想情况下,您应该收到分段违规运行时错误。

您已指定一个指向位于只读内存中的字符串文字的指针。试图修改它是不好的!

尝试将其复制到堆栈

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);

同样,Basile指出有strdup

char * a = strndup("hello,world)", sizeof("hello,world)") -2);

请注意,这里我们必须截断两个字符,因为sizeof包含空终止符,但strndup将始终添加一个。

答案 1 :(得分:1)

<强>分析:

第1行:char *a="hello,world)";

变量a指向一个字符数组,位于程序的(只读)代码部分

第3行:*(a+a_len-1)='\0';

当CPU尝试写入只读存储器部分时发生存储器访问冲突

<强>解决方案:

第1行:char a[]="hello,world)";

变量a是位于程序堆栈中的字符数组,是一个读/写部分

答案 2 :(得分:-2)

我必须使用动态内存,所以我必须保留char []。

尝试此操作也不起作用:

char *a=malloc(4);
a="hello,world)";
int a_len=strlen(a);
*(a+a_len-2)='\0';
printf("%s", a);