将“4W2R”转换为“WWWWRR”错误 - 抛出异常:写访问冲突

Posted

技术标签:

【中文标题】将“4W2R”转换为“WWWWRR”错误 - 抛出异常:写访问冲突【英文标题】:Turning "4W2R" to "WWWWRR" Error - Exception thrown: write access violation 【发布时间】:2022-01-06 10:51:00 【问题描述】:

程序的目标是把这样的字符串——“4R2W5X”变成这个> 'RRRRWWXXXXX” 我得到了一个准备好的代码模板,我必须填写空格,你会注意到我没有使用模板中提供的所有变量。

当我尝试运行此程序时出现错误(我将在代码中标记错误行)- 访问冲突

没有我回答的模板在下面,你可以看到它要求填补空白的地方。


void main()

char source[40];
char dest[200];

decode(source, dest);
printf("%s\n", dest);


void decode(char* source, char* dest)

    int digit; 
    char* chr = " ";
    int expander;
    int legal_digit;
    char* orginal_dest = dest;

    if ((digit = atoi(source)/10)!=0)
    
        strcpy(dest, "ERROR: odd number of chars\n");
    
    else
    
        while ((*source >= '0') && (*source <= '9'))
        
            *chr = *source; // This is where I get the error.
            source++;
            digit = atoi(*source);
            for (expander = 0; expander < digit; expander++)
            
                *dest = *chr;
                dest++;
            
            source++;
        
        if (*source == '\0')
        
            *dest = '\0';
        
        else
        
            strcpy(orginal_dest, "ERROR: digit not found where expected");
        
    

模板:

void decode(char* source, char* dest)

    int digit; 
    char* chr = " ";
    int expander;
    int legal_digit;
    char* orginal_dest = dest;

    if ( (1) !=0) // Fill (1)
    
        strcpy(dest, "ERROR: odd number of chars\n");
    
    else
    
        while ((*source >= '0') && (*source <= '9'))
        
            *chr = *source; // This is where I get the error.
            source++;
            digit = (2); // Fill (2)
            for (expander = 0; expander < digit; expander++)
            
                *dest = (3); // Fill (3) 
                dest++;
            
            source++;
        
        if (*source == '\0')
        
            *dest = '\0';
        
        else
        
            (4) (orginal_dest, "ERROR: digit not found where expected"); // Fill (4)
        
    

【问题讨论】:

谁准备了这个模板不知道C。你不能改变像char* chr = " ";这样的字符串文字。 ... *chr = *source; 我老师不是100,是不是需要先分配内存? char* chr = malloc(sizeof(char) * 1); 这只是一个糟糕的代码。变量应该在它们被使用的地方声明。此外,变量 int legal_digit;不在函数中使用。 【参考方案1】:

访问冲突的原因是试图更改字符串文字

char* chr = " ";
//...
*chr = *source; // This is where I get the error

虽然在 C 中与 C++ 字符串文字相反,但它具有非常量字符数组类型,但您不能更改字符串文字。任何更改字符串文字的尝试都会导致未定义的行为。

提供的代码模板展示了一种糟糕的编程风格。

例如,第一个函数参数应该有限定符const,因为源字符串在函数内没有被更改。该函数应返回指向目标字符串的指针。

变量应该在它们被使用的地方声明。还有变量

int legal_digit;

不在函数中使用。

使用函数中实现的方法,可以通过以下方式声明和定义函数。

char * decode( const char *source, char *dest )

    if ( strlen( source ) % 2 != 0 ) // Fill (1)
    
        strcpy( dest, "ERROR: odd number of chars" );
    
    else
    
        char *orginal_dest = dest;

        while ( ( *source >= '0' ) && ( *source <= '9' ) )
        
            char chr = *source;
            source++;
            unsigned int digit = chr - '0'; // Fill (2)
            for ( unsigned int expander = 0; expander < digit; expander++ )
            
                *orginal_dest = *source; // Fill (3) 
                orginal_dest++;
            
            source++;
        

        if ( *source == '\0' )
        
            *orginal_dest = '\0';
        
        else
        
            strcpy( dest, "ERROR: digit not found where expected" ); // Fill (4)
        
    

    return dest;

【讨论】:

以上是关于将“4W2R”转换为“WWWWRR”错误 - 抛出异常:写访问冲突的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3 核心数据 - NSExpression forFunction:“sum:”抛出错误(“无法将字典转换为 Day”)

SQL 默默地将 int 转换为 varchar,但在遇到 varchar 时会抛出错误?

朴素贝叶斯高斯抛出 ValueError:无法将字符串转换为浮点数:'M'

Oracle数据库时间戳(6)转换为雪花timestamp_ntz时抛出错误

将 URLSession 更新为 swift 3 抛出错误

为啥 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误?