#include <cs50.h>
#include <stdio.h>
#include <string.h>
int main(int argc, string argv[])
{
string destination = argv[1];
for (int i = 1; i < argc; i++)
{
strcat(argv[i], argv[i+1]);
}
printf("%s\n", destination);
}
我需要所有的字符串在argv[ ]连接在一起。下面的程序工作,但在年底给予seg错误(核心转储)。我如何才能避免?
2条答案
按热度按时间p3rjfoxz1#
CS50被认为是有害的。C语言中没有字符串类,与大多数其他语言相比,它是一种低级语言。没有自动内存管理。你必须手动推出所有内容。
argv[n]
恰好是一个允许写入的位置,但这样做是不好的做法,该位置的空间只够存储已经传递的参数字符串,因此不能在那里追加任何内容。您需要使用的算法如下:
简单但对初学者友好的版本是使用
strcat
(string.h),它连接字符串,为了使用它,使用的第一项必须是以空结尾的字符串,所以它是这样的:但是
strcat
需要一遍又一遍地寻找空值结束符,所以这是非常慢的。更专业的版本是保存我们之前获取的字符串长度(啊哈,这就是argv_strlen
数组的作用),然后使用memcpy
(string.h)复制这么多内存+1个字节用于空值结束符,这比strcat
快得多。完整示例:
命令行输入
progname hello world how are you?
给出helloworldhowareyou?
ljsrvy3e2#
argv[i]
都没有足够的空间来存储附加的字符串(当然,如果附加的字符串不是空字符串)。此外,
argv[argc]
是一个空指针。当
i
等于argc-1
时使用空指针argv[i+1]
,这再次导致未定义的行为。来自C标准(5.1.2.2.1程序启动)
argv[argc]应为空指针
至少你应该写
代替
假设数组
destination
可以包含所有连接的字符串。您需要动态分配一个足够大的数组,以便能够存储所有连接的字符串。
例如
或者当您使用类型别名
string
作为类型char *
时,则将你可以写