【问题标题】:stripping end of a string in C [duplicate]在C中剥离字符串的结尾[重复]
【发布时间】:2014-02-11 13:49:35
【问题描述】:

我需要一个函数来从字符串末尾删除) 字符。 例如,hello,world) 应转换为 hello,world

我写了这个:

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

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

【问题讨论】:

  • 你有一个不错的编译器,它没有SIGSEGV
  • @devnull: 为什么编译器会SIGSEGV? ;)
  • @MichaelFoukarakis 你可能想参考this
  • @devnull:我认为他的意思是 SIGSEGV 发生在运行时而不是编译时
  • @HayriUğurKoltuk 也许吧。我认为 executing 是隐含的。 (执行时)

标签: c string parsing pointer-arithmetic


【解决方案1】:

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

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

尝试将其复制到堆栈中

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 将始终添加一个。

【讨论】:

  • 你可以使用strdup
  • 我必须保持我的代码中没有 libc 函数,所以我认为 memcpy 更适合使用。
【解决方案2】:

分析:

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

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

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

当 CPU 尝试写入只读内存部分时,会发生内存访问冲突

解决方案:

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

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

【讨论】:

    【解决方案3】:

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

    尝试这个也行不通:

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

    【讨论】:

    • 您再次分配了一个指向只读内存的指针。您必须将字符串复制到动态内存中。
    • 也应该是-1 :)
    • 看我的回答,我已经编辑过了。请使用 cmets 进行讨论,而不是发布您自己的无效答案。
    • 应该malloc 更大的区域然后使用strcpy
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-17
    • 2018-06-13
    • 1970-01-01
    • 2018-03-28
    • 2018-04-20
    • 2010-09-19
    相关资源
    最近更新 更多