-4

主文件

#include <iostream>
#include "Module2.h"

int main()
{
std::cout<<"This is a test of Module2.h"<<std::endl;
std::cout<<UCase("This is a test of UCase")<<std::endl;
std::cout<<LCase("This is a test of LCase")<<std::endl;
system("pause");
return 0;

}

模块2.h

#include <iostream>
#include "Module2.h"

int main()
{
std::cout<<"This is a test of Module2.h"<<std::endl;
std::cout<<UCase("This is a test of UCase")<<std::endl;
std::cout<<LCase("This is a test of LCase")<<std::endl;
system("pause");
return 0;

}

模块2.cpp

///////////////////////////////////////////////////
//Module : Module2.cpp
//
//Purpose : Shows the usage of modular functions
///////////////////////////////////////////////////

#include "Module2.h"

///////////////////////////////////////////////////
//UCase()

char *UCase(char *str)
{
//convert each char in  the string to uppercase
//
int len = strlen(str);
for ( int i ; i < len ; i++)
{
    std::cout<<"In UCase"<<std::endl;
     str[i]=toupper(str[i]);
}

return str;
}

///////////////////////////////////////////////////
//LCase()

char *LCase(char *str)
{
//convert each char in  the string to uppercase
//
int len = strlen(str);
for ( int i ; i < len ; i++)
{
    std::cout<<"In LCase"<<std::endl;
    str[i]=tolower(str[i]);
}  
return str;
}

当我运行它时,没有警告或错误。但是,它不会上下字符串。我认为我的 for 循环是错误的,但它似乎是正确的。我的代码有什么问题。

4

3 回答 3

2

主要问题是您正在尝试修改字符串文字,例如"This is a test of UCase". 这是未定义的行为。您需要将文字复制到char可以修改的数组中。

另请注意char*,出于充分的理由,不推荐使用和禁止绑定到字符串文字。这应该发出警告:

UCase("This is a test of UCase") // not good: binding char* to literal

您的代码还有其他问题:具有未初始化变量的循环中的未定义行为(UB),

for ( int i ; i < len ; i++) // using uninitialized i: UB

您还应该查看touppertolower文档。他们都接受int,但对他们的价值观有一些限制。您必须确保不传递导致未定义行为的值,记住char可以签名。参见例如我需要在调用之前转换为 unsigned chartoupper吗?

于 2015-01-26T23:02:39.580 回答
1

像这样的循环具有未定义的行为:

for ( int i ; i < len ; i++)

原因是你没有从i价值开始0
你不知道价值从什么i开始!
它可能是-10,可能是824

如果要初始化一个值,必须对其进行初始化。
我建议:

for (int i=0; i < len; i++)
于 2015-01-26T23:06:44.830 回答
0
char *UCase( char *str)
{
char ch;
int i=0;

while(str[i])
{
    ch=str[i];
    putchar(toupper(ch));
//putchar : The value is internally converted to an unsigned char when written.
    i++;
}
}

///////////////////////////////////////////////////
//LCase()

char *LCase(char *str)
{
char ch;
int i=0;

while(str[i])
{
    ch=str[i];
    putchar(tolower(ch));
    i++;
}
}

我终于写这个了。虽然,我还是不太明白,但我学会了

#include <ctype.h>
int tolower( int ch );

意味着 tolow toupper 每次只能更改一个字符,所以我不能

tolower ("This is a test of LCase");

像这样的代码。

于 2015-01-27T02:48:24.937 回答