toupper tolower 不工作,帮助我的代码出了什么问题
toupper tolower not working , help what's wrong with my code
main.cpp
#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;
}
Module2.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;
}
Module2.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 循环是错误的,但它似乎是正确的。
我的代码有什么问题。
主要问题是您正在尝试修改 "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
您还应该查看 toupper
和 tolower
文档。他们都接受 int
但对其值有一些限制。您必须确保您没有传递导致 未定义行为 的值,请记住 char
可以签名。例如参见 [=20=]
像这样的循环有未定义的行为:
for ( int i ; i < len ; i++)
原因是您没有在值 0
开始 i
。
您不知道 i
的起始值!
可以是-10
,也可以是824
。
如果你想要一个值被初始化,你必须初始化它。
我建议:
for (int i=0; i < len; i++)
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 );
意味着tolower toupper每次只能改变一个字符,所以我不能
tolower ("This is a test of LCase");
像这样的代码。
main.cpp
#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;
}
Module2.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;
}
Module2.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 循环是错误的,但它似乎是正确的。 我的代码有什么问题。
主要问题是您正在尝试修改 "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
您还应该查看 toupper
和 tolower
文档。他们都接受 int
但对其值有一些限制。您必须确保您没有传递导致 未定义行为 的值,请记住 char
可以签名。例如参见 [=20=]
像这样的循环有未定义的行为:
for ( int i ; i < len ; i++)
原因是您没有在值 0
开始 i
。
您不知道 i
的起始值!
可以是-10
,也可以是824
。
如果你想要一个值被初始化,你必须初始化它。
我建议:
for (int i=0; i < len; i++)
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 );
意味着tolower toupper每次只能改变一个字符,所以我不能
tolower ("This is a test of LCase");
像这样的代码。