在不使用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';