代码之家  ›  专栏  ›  技术社区  ›  user8314628

我怎样才能在C中剪断一根绳子?

  •  0
  • user8314628  · 技术社区  · 6 年前
    #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)
    

    我怎么修?

    2 回复  |  直到 6 年前
        1
  •  2
  •   Barmar    6 年前

    如果 message 参数超过20个字符,第一个循环将在 greeting . 这个 if 语句不会停止循环,它会继续执行,但会分配空字节,而不是 argv[1][i] .

    如果 消息 论点符合 招呼 从不添加空字节。复制最后一个字符(不包括空终止符)后循环停止。

    你可以简单地使用 strncpy() ,然后设置 招呼 为空字节。

    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);
    
        2
  •  0
  •   user3629249    6 年前

    以下建议代码:

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