我需要一个函数来从字符串末尾删除)
个字符。
例如,hello,world)
应转换为hello,world
。
我写了这个:
char *a="hello,world)";
int a_len=strlen(a);
*(a+a_len-1)='\0';
printf("%s", a);
但输出中没有显示任何内容。
答案 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);