C++ C++;尝试';重写';字符数组

C++ C++;尝试';重写';字符数组,c++,string,pointers,toupper,C++,String,Pointers,Toupper,我正在尝试使用以下代码将字符串转换为全大写: 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

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

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;
}
int client::get_upper(char*item_in)
{
int k;
char*temp_str;
int length=strlen(项目_in);
temp_str=新字符[长度+1];
对于(k=0;k

然而,当我尝试这样做时,我从VisualStudio收到一个访问冲突写入位置xxxxxxxx。这是针对类的,因此我不能使用实际字符串。

假设您正确调用了该代码,我认为您的temp_str[k]='\0'有一个off by one错误

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

char *mystr = "stackoverflow.com";
client.get_upper(mystr)?
char test[] = "stackoverflow.com";
client::get_upper(test); // client interpreted as a namespace
这很可能会触发Visual Studio中的访问冲突

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

char mystr[] = "stackoverflow.com";

如果不知道函数是如何调用的,我们无法告诉您为什么会出现错误

我怀疑这个错误与调用上下文和中的项目实际指向的内容有关


Jeremy Friesner的评论很贴切——如果目标是破坏性的话,那么你有一个漏洞,你根本不需要中间缓冲区。

如果使用得当,你的代码可以正常工作(最简单的方法就是像这样简单地传递一个本地cstring):

现在,您的函数充满了错误的方法,即未被管理的冗余副本(内存泄漏)

重写一点:

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)
{
无符号整数长度=strlen(中的项目);
对于(int i=0;i
如果你想尝试一下,这里有一些东西给你,只是为了好玩:

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;
}
int client::get_upper(char*item_in)
{
int length=strlen(项目_in);
对于(int i=0;i如果((item_in[i]>=97&&item_in[i]不允许使用标准字符串类这一事实并不意味着必须将其作为一个整体函数编写

我将编写一个简单的函数来进行就地转换。然后,如果您需要支持处理只读字符串,请编写另一个复制输入的函数(使用第三个函数),然后对复制的字符串进行就地转换

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

演示您如何调用此函数。您为什么要分配第二个字符数组,而不是直接将大写字母写入原始数组?(顺便说一句,您正在泄漏内存,因为您从未在函数末尾执行delete[]temp_str)Lord将我们从“带类的C”中拯救出来老师们!@JerryCoffin的确如此,但在我看来,他们是要留下来的(从我国的学校制度来看)唯一的方法是让上帝用火杀死他们。或者至少,把它们介绍给C++,附带的标准库和这个叫做字符串类的东西。@ DoMaGojpand and A:我甚至可以理解想要教低级编程,但是如果这是你的意图,那么首先从实现(最小)字符串类开始,然后使用它(或扩展它)。在后面的课程中,根据“修改字符串常量的结果是未定义的。”K等于kength,他分配了长度+1,所以它是O.KWell,它仍然是无意义的,因为他将它全部复制回原始数组,这不是/错误/,但很奇怪,完全相同。出于任何原因,我刚才假设x=toupper(x)这是行不通的,可能是因为我不了解我这样做时会发生什么。不过现在效果很好,从studio切换到了好的旧记事本和g++,这本身就解决了很多问题。我相信很多代码都是垃圾,但在这门课上,我们似乎没有学到很多关于这种语言的东西。。。该函数只是用于接受用户输入并生成正确的哈希键,我认为统一大小写最简单。建议使用int返回是为了养成良好的习惯,这样我们就可以利用函数的退出方式/位置……我猜?@user1404053通常在这种情况下返回整数值只是用于验证是否存在问题t根据计划。你可以定义1为成功,0为失败。可能会有更复杂的用例,这取决于你的项目。是的,讲师让我们养成了做int而不是void的习惯。99%的时候,我甚至没有实现它,它只不过是一个成功/失败标志。但是,它经常可以告诉我们客户机哪个表是空的,或者找到了多少项并插入到客户机列表中。我确信,我们用C/C++做的事情还有很多其他的方法,但我感觉目标是让我们采取尽可能多的步骤。