将“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'