我正在尝试使用代码将字符串转换为全部大写:
int client::get_upper(char*item_in)
{
int k ;
char * temp_str;
int length = strlen(item_in);
temp_str = new char [length+1];
for(k = 0; k < length; ++k)
temp_str[k] = toupper(item_in[k]);
temp_str[k] = '\0';
for(k = 0; k < length; ++k)
item_in[k] = temp_str[k];
return 0;
}
然而,当我尝试这样做时,我收到来自Visual Studio的访问冲突写入位置xxxxxxxx。这是一个类,所以我被限制使用实际的字符串。
答案 0 :(得分:2)
如果使用得当,您的代码可以正常工作(最简单的方法就是简单地传递一个像这样的本地cstring):
char test[] = "stackoverflow.com";
client::get_upper(test); // client interpreted as a namespace
现在,您的函数充满了糟糕的方法,即冗余副本不受管理(内存泄漏)。
重写了一下:
int client::get_upper(char *item_in)
{
unsigned int length = strlen(item_in);
for(int i = 0; i < length; ++k)
item_in[i] = toupper(item_in[i]);
return 0;
}
如果你想进行一些实验,这里有一些适合你的东西,只是为了好玩:
int client::get_upper(char *item_in)
{
int length = strlen(item_in);
for(int i = 0; i < length; ++i)
if((item_in[i] >= 97 && item_in[i] <= 122))
item_in[i] = (int)item_in[i] - 32;
return 0;
}
而你的错误很可能来自于你正试图推动一些你可能没有真正思考的动态数组。只需使用本地字符串,一个简单的以null结尾的数组。你并没有真正付出太多的代价,所以这只是猜测工作。我所能做的就是帮助你简化表达。由于返回值不起作用,请考虑将其应用于某些内容或切换到void
。
希望它有所帮助。
答案 1 :(得分:0)
假设您正确调用该代码,我认为您有一个与temp_str [k] ='\ 0'相关的错误;
答案 2 :(得分:0)
调用get_upper时,是否传递了字符串文字?例如,您的调用代码是这样的:
char *mystr = "stackoverflow.com";
client.get_upper(mystr)?
这很可能会在Visual Studio中触发访问冲突。
如果是这种情况,您可以将mystr的定义更改为:
char mystr[] = "stackoverflow.com";
答案 3 :(得分:0)
我们不知道为什么在没有看到函数被调用的情况下会出现错误。
我怀疑这个错误与调用上下文以及item_in实际指向的内容有关。
杰里米·弗里斯纳的评论是现场的 - 你有泄密,如果目标是破坏性的话你也不需要中间缓冲。
答案 4 :(得分:0)
您不允许使用标准字符串类这一事实并不意味着您必须将其写为单片函数。
我写了一个简单的函数来就地进行转换。然后,如果您需要支持只读字符串,请编写另一个复制输入的函数(使用第三个函数),然后对副本执行就地转换。
char *duplicate(char const *input);
char *upper_str(char *input); // does in-place transformation
char *upper_str(char const *input); // duplicates, then transforms the duplicate