c - 如何在 C 中剪切字符串?

标签 c string

#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;
}

在这个练习中,我需要连接两个命令行参数,即 greetingname,并用空格分隔。并且问候语和浓缩后的字符串不能超过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/

相关文章:

c - Arduino sketch 的字符串命令有点工作但不是真的

c++ - 为什么 C++ 初始分配比 C 大得多?

c++ - 在类中初始化变量

c - C中的加密函数

javascript - 不允许连续出现多个相同的字符

c - 如何将结果打印到标准输出?

c - 如何将 long long 转换为 C 中的数组?

c - 为什么 n++ 当它是 sizeof() 函数的参数时不起作用?

c - C中字符串的数组和指针表示法之间的区别

C 文件处理查询