如何在C中剪切字符串?

时间:2019-02-02 00:10:57

标签: 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)

我该如何解决?

2 个答案:

答案 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)

以下建议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 正确检查(并处理)错误
  4. 没有任何未定义的行为,也没有缓冲区溢出
  5. 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;
}