c - 这个缩短字符串的函数有什么问题?

标签 c string

我在 C 中定义了一个函数,它将长字符串缩短为固定大小并打印缩短的字符串。函数是这样的:

void fit(char *str,unsigned int size) // shorten long strings to fixed size, "size" and prints the shortened string.
{
    if ( strlen(str) > size)
        str[size] = '\0';  
    printf("%s", str);  // prints the shortened string
}

如果我运行此函数,编译器不会指出任何警告或错误,但会停止执行。代码的哪一部分使执行停止?

#include <stdio.h>
#include <string.h>

void fit(char *str, unsigned int size);

int main(void)
{
    fit("Hello People!!", 6);
}

void fit(char *str,unsigned int size)
{
    if ( strlen(str) > size)
        str[size] = '\0';
    printf("%s", str);
}

最佳答案

在标准 C 和 C++ 中,字符串文字(“these”)是只读的。

通常这些位于只读存储器中。通过在您的特定示例中写入 str,您的程序会尝试写入写保护内存,这是操作系统(或运行时,如果适用)不允许的,这会导致程序异常终止。如果您正在编写 C++,编译器可能会提示您将 const char* 传递给接受非 const 参数的函数。

您有四种选择:

  1. 告诉编译器把`"Hello People!!"在构建或初始化程序时,可写数据区域中的字符串而不是写保护数据 - 这需要编译器或特定于平台的功能,并且不是标准 C 或 C++ 的一部分。

  2. 使用特定于操作系统的命令使内存区域可写(玩得开心!)

  3. 在修改之前将字符串复制到可变缓冲区。

  4. 使用 char str[] = "Hello People!!"; - 这与选项 3 基本相同,但编译器会为您完成。但是,离开范围时要小心。

请注意,将空字符插入字符串缓冲区作为缩短字符串的方法可能不是一个好主意,因为它隐藏了已分配缓冲区中的额外空间。一般来说,你应该将字符串视为不可变的,如果你想通过以写时复制的方式重用字符串来提高效率,那么使用指向现存缓冲区的 start/end 对而不是依赖关于空终止。

关于c - 这个缩短字符串的函数有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38865614/

相关文章:

java - 从文件中读取数组。 (java)

C 错误 : invalid types 'double[int]' for array subscript

c - 无法将符合条件的二维数组中的字符串从单独的函数传递到主函数

c - 如何执行使用arm-none-eabi-gcc编译的文件

c - 如何解决 yylloc 未声明的错误?

c - 在指向指针链的指针末尾初始化值

c - 从行中读取单词

c# - 将字符串数组转换为字节数组

c - 将 C 字符串的值设置为字符串文字

c - 字符串数据存储在哪里?