1

我正在尝试使用以下代码将字符串转换为全部大写:

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。这是一个类,所以我被限制使用实际的字符串。

4

5 回答 5

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

您的错误很可能来自您试图推送一个您可能没有真正考虑过的动态字符数组。只需使用本地字符串,即简单的以空字符结尾的数组。你并没有真正付出太多,所以这只是猜测工作。我能做的就是帮你简化你的表达方式。由于返回值什么都不做,请考虑将其应用于某事或切换到void.

希望能帮助到你。

于 2012-05-24T03:16:18.863 回答
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
于 2012-05-24T03:36:04.330 回答
0

假设您正确调用该代码,我认为您在 temp_str[k] = '\0';

于 2012-05-24T02:52:59.137 回答
0

调用 get_upper 时,是否传递了字符串文字?例如,您的调用代码是这样的:

char *mystr = "stackoverflow.com";
client.get_upper(mystr)?

这很可能会在 Visual Studio 中触发访问冲突。

如果是这种情况,您可以将 mystr 的定义更改为:

char mystr[] = "stackoverflow.com";
于 2012-05-24T02:56:04.147 回答
0

如果不查看函数是如何被调用的,我们就无法判断为什么会出现错误。

我怀疑该错误与调用上下文以及 item_in 实际指向的内容有关。

Jeremy Friesner 的评论很准确——你有泄漏,如果目标是破坏性的,你就不需要中间缓冲区。

于 2012-05-24T02:57:50.323 回答