C语言 在不使用字符串函数的情况下连接字符串:替换字符串的结尾(空字符)会导致 seg 错误



在不使用string.h函数(只想使用std libs)的情况下,我想通过连接作为程序参数提供的字符串来创建一个新字符串。为此,我决定将参数复制到更大尺寸的新 char 数组中,然后将字符串的末尾替换为我要附加的字符。

unsigned int argsize=sizeof(argv[1]);
unsigned char *newstr=calloc(argsize+5,1);
newstr=argv[1];    //copied arg string to new string of larger size
newstr[argsize+4]=oname[ns];    //copied the end-of-string null character
newstr[argsize]='.';    //this line gives seg fault
newstr[argsize+1]='X';    //this executes without any error

我相信必须有另一种更安全的方式来连接字符串,而无需使用字符串函数或将 char 复制并附加到新的 char 数组中。我真的很想知道这样的方法。另外,我很想知道这种段错误的原因是什么。 在这里阅读:https://stackoverflow.com/a/164258/1176315,我猜,编译器正在使我的空字符内存块只读,但这只是一个猜测。我想知道这背后的真正原因。 我将感谢您为回答这个问题所做的一切努力。谢谢。 编辑:仅使用std libs,我的意思是说我不想使用strcpy(),strlen(),strcat()等函数。

不使用 string.h 函数(只想使用 std 库)

string.h 是标准库的一部分。

unsigned int argsize=sizeof(argv[1]);

这是错误的。sizeof不会告诉您 C 字符串的长度,它只是告诉您其参数的类型有多大。argv[1]是一个指针,sizeof只会告诉您指针在您的平台上有多大(通常为 4 或 8),而不管字符串的实际内容如何。

如果你想知道一个 C 字符串有多长,你必须检查它的字符并计数,直到你找到一个 0 个字符(顺便说一下,这就是strlen所做的)。

newstr=argv[1];    //copied arg string to new string of larger size

没有。您刚刚将存储在argv[1]中的指针复制到变量newstr,顺便丢失了之前返回给您calloc指针,因此您也有内存泄漏。

要将字符串从缓冲区复制到另一个缓冲区,您必须逐个复制其字符,直到找到 0 个字符(顺便说一下,这就是strcpy的作用)。

因此,以下所有行都在argv[1]上运行,所以如果你超出它的原始界限,任何事情都可能发生。

我相信必须有另一种更安全的方式来连接字符串,而无需使用字符串函数或将 char 复制并附加到新的 char 数组中。

C 字符串只是字符数组,一切都归结为一次复制/读取它们。如果您不想使用提供的字符串函数,您最终基本上会自己重新实现它们。请注意,这是一个有用的练习,但您必须更好地了解 C 字符串是什么以及指针的工作原理。

首先sizeof(argv[1])不会返回字符串的长度,您需要使用loops或使用标准库函数strlen().second计算字符串中的字符数,如果要复制字符串,则需要使用strcpy()函数。

你应该这样做:

unsigned int argsize=strlen(argv[1]);  //you can also count the number of character
unsigned char *newstr=calloc((argsize+5),1);
strcpy(newstr,argv[1]);    
newstr[argsize+4]=oname[ns];    
newstr[argsize]='.'; 
newstr[argsize+1]='X';

相关内容

  • 没有找到相关文章

最新更新