#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)
我该如何解决?
最佳答案
如果 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);
关于c - 如何在 C 中剪切字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54488718/