#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
if (argc != 3) {
fprintf(stderr, "Usage: greeting message name\n");
exit(1);
}
char greeting[20];
char *name = argv[2];
// Your code goes here
for (int i = 0; i < strlen(argv[1]); i++) {
if (i < 20) {
greeting[i] = argv[1][i];
}
else {
greeting[i] = '\0';
}
}
int greeting_len = strlen(greeting);
strcat(greeting, " ");
strncat(greeting, name, 20-greeting_len-2);
printf("%s\n", greeting);
return 0;
}
在这种情况下,我需要将两个命令行参数greeting
和name
连接在一起,并用空格隔开。更重要的是,问候和浓缩后不能超过20个字符的字符串。
当我跑步时
./a.out "Good morninggggggggggggggggggg" "Emmanuel"
时出现错误
*** stack smashing detected ***: ./a.out terminated
Aborted (core dumped)
我该如何解决?
答案 0 :(得分:2)
如果message
参数超过20个字符,则您的第一个循环将写在greeting
的边界之外。 if
语句不会停止循环,而是继续运行,但是分配空字节而不是argv[1][i]
。
如果message
参数适合greeting
,则根本不会添加空字节。复制最后一个字符(不包括空终止符)后,循环停止。
您可以简单地使用strncpy()
,然后将greeting
的最后一个字节设置为空字节。
strncpy(greeting, argv[1], sizeof greeting);
greeting[sizeof greeting - 1] = '\0';
在添加空格之前,您需要检查是否已达到限制:
if (greeting_len < 18) {
greeting[greeting_len] = ' ';
greeting[greeting_len+1] = '\0';
greeting_len++;
}
if (greeting_len < 18) {
strncat(greeting, name, 19-greeting_len);
}
但是,如果您可以使用snprintf()
,那就容易多了:
snprintf(greeting, sizeof greeting, "%s %s", argv[1], name);
答案 1 :(得分:0)
以下建议的代码:
argv[1]
和argv[2]
之间放置一个空格现在,建议的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
if (argc != 3)
{
fprintf(stderr, "Usage: greeting message name\n");
exit(1);
}
char *greeting = malloc( strlen( argv[1] ) + strlen( argv[2] ) +1 +1 );
if( !greeting )
{
perror( "malloc failed" );
exit( EXIT_FAILURE );
}
strcpy( greeting, argv[1] );
strcat( greeting, " " );
strcat( greeting, argv[2] );
printf("%s\n", greeting);
free( greeting );
return 0;
}