【问题标题】:Appending char arrays using strcat [duplicate]使用 strcat 附加字符数组 [重复]
【发布时间】:2022-01-04 09:07:57
【问题描述】:

我正在研究一种小型加密算法:

转换:

    input = 356307042441013    to output = 333536333037303432343431303133

它的工作原理是这样的: 如果一个数字等于 3 ,它将用 333 更改它,除非它位于字符串的最后一个位置。 如果不是,我们在每两个不同于 3 的数字之间加 3

    input =   3  5   6  3  0   7   0   4   2   4   4   1   0   1   3    
    to 
    output = 333 5 3 6 333 0 3 7 3 0 3 4 3 2 3 4 3 4 3 1 3 0 3 1 3 3

为此,我编写了以下代码:

int main() {
    const char *imei = "362162356836934568";
    char *imei_buffer;
    strcpy(imei_buffer,'\0');

    int i = 0;
    while (i < strlen(imei))
    {
        if (i <= (strlen(imei) - 1))
        {
            if (imei[i] == '3')
            {
                strcat(imei_buffer, "333");
            }
            else if ((imei[i] != '3') && (imei[i + 1] == '3'))
            {
                strcat(imei_buffer, &imei[i]);
                //strcat(imei_buffer,'3');
            }
            else if ((imei[i] != '3') && (imei[i + 1] != '3'))
            {
                strcat(imei_buffer, &imei[i]);
                strcat(imei_buffer, "3");
            }
        }
        else if (i == strlen(imei))
        {
            if (imei[i] == '3')
            {
                strcat(imei_buffer, "333");
            }
            else if (imei[i] != '3')
            {
       else if (i == strlen(imei))
        {
                strcat(imei_buffer, &imei[i]);
                //strcat(imei_buffer,'3');
        }
             i++;
        }

        printf("imei_buffer : %s",imei_buffer);

    return 0;
}

代码执行没有错误,但最后没有显示结果。

在这个实现中我可能哪里出错了?

【问题讨论】:

  • 这不是字符串/数组在 C 中的工作方式。您不能“将数据存储在指针中”。在此处查看链接的副本以及初学者的字符串常见问题解答:Common string handling pitfalls in C programming
  • @Othmane 此代码 sn -p char *imei_buffer; strcpy(imei_buffer,'\0');调用未定义的行为
  • 我尝试使用普通的字符数组[],但效果不佳。
  • 是的,没错,vs code 和 gcc 没有显示该错误。我想这与 gcc 版本有关。
  • @Othmane 不,它与未定义的行为有关 = 发生随机错误,或者程序可能看起来工作正常,即使它有潜在的错误。它与编译器无关,分配内存并仅将数据复制到分配的内存中是程序员的责任。

标签: c algorithm encryption undefined-behavior c-strings


【解决方案1】:

你声明了一个指针

char *imei_buffer;

未初始化且具有不确定值。

所以下一条语句

strcpy(imei_buffer,'\0');

立即调用未定义的行为。

此外,当您提供char 类型的第二个参数时,该函数需要char * 类型的参数。

这个函数strcat的调用

strcat(imei_buffer, &imei[i]);

在逻辑上不正确,因为它附加了字符串 imei 的整个子字符串,以索引 i 开头。

你首先需要确定结果字符串的大小,分配一个大小的字符数组,然后根据算法用源字符串的字符填充它。

这是一个演示程序。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char * encrypt( const char *s )
{
    size_t n = strlen( s ) + 1;
    
    for ( const char *p = s; *p; ++p )
    {
        if ( p[0] == '3' )
        {
            n += p[1] == '\0' ? 1 : 2;
        }
        else
        {
            if ( p[1] != '3' && p[1] != '\0'  ) ++n;
        }
    }
    
    char *result = malloc( n );

    if ( result != NULL )
    {
        char *p = result;
        do
        {
            *p++ = *s;
            
            if ( s[0] == '3' )
            {
                *p++ = '3';
                if ( s[1] != '\0' ) *p++ = '3';
            }
            else if ( s[1] != '\0' && s[1] != '3' )
            {
                *p++ = '3';
            }
        } while ( *s++ );
    }
    
    return result;
}

int main( void )
{
    const char *s = "362162356836934568";
    
    printf( "\"%s\"\n", s );
    
    char *result = encrypt( s );
    
    if ( result ) printf( "\"%s\"\n", result );
    
    free( result );
}

程序输出是

"362162356836934568"
"333632313632333536383336393334353638"

【讨论】:

  • @Lundin 因为我在问题结束之前已经编写了代码。:)
  • 所以不要那样做...?如果有明显的常见问题解答初学者错误,请在 cmets 中指出,让 OP 发布一个修复了这些错误的新问题,然后考虑回答。
  • @VladfromMoscow 谢谢伙计,这很有帮助。
  • @Othmane 完全没有。不客气。:)
猜你喜欢
  • 1970-01-01
  • 2022-11-12
  • 1970-01-01
  • 2011-08-22
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多