为什么在不初始化我的数组时,数组的某些字母没有变成大写?
Why are some letters of an array not turned to uppercase when not initializing my array?
我注意到,当我没有在这段将小写字母变为大写字母的代码中初始化数组时,该代码只完成了一半的工作(变为 Antoine Copepe -> aNTOiNE_cOPEPE
)。我想知道是否存在空引用错误 Kevin was talking about in his answer 初始化数组的重要性
#include <iostream>
#include<string.h>
#include<ctype.h>
#include<conio.h>
using namespace std;
void ConvMl_(char [], int);
int main(){
char Nombre[32];
int Len;
cout<< "inserte su nombre completo: ";
cin.getline(Nombre,32);
Len = strlen(Nombre);
ConvMl_(Nombre, Len);
cout<<Nombre<<endl;
getch();
return 0;
}
void ConvMl_(char Nombre[], int Len){
int Arr[Len] = { 'EsNecesarioInicializarElArray' };
for(int i=0;i<Len;i++){
if(Nombre[i] == ' '){
Nombre[i] = '_';
}
}
for(int i=0;i<Len;i++){
if(Nombre[i] >= 'A' && Nombre[i] <= 'Z'){
Nombre[i] = tolower(Nombre[i]);
Arr[i]=1;
}
}
for(int i=0;i<Len;i++){
if(Nombre[i] >= 'a' && Nombre[i] <= 'z' && Arr[i] != 1){
Nombre[i] = toupper(Nombre[i]);
}
}
}
确实这给了我:
main.cpp:28:22: warning: character constant too long for its type
inserte su nombre completo: Antoine Coppepe
aNTOINE_cOPPEPE
而当我 int Arr[Len];
我只有 Antoine Copepe -> aNTOiNE_cOPEPE
您应该完全删除 Arr
变量,并就此删除 conio。它使用非标准代码。可以使用 if-else-if 语句将您的三个循环合并为一个循环,这样您就可以轻松摆脱 Arr
变量。
void ConvMl_(char Nombre[], int Len){
for(int i=0;i<Len;i++){
if(Nombre[i] == ' '){
Nombre[i] = '_';
} else if(Nombre[i] >= 'A' && Nombre[i] <= 'Z'){
Nombre[i] = tolower(Nombre[i]);
} else if(Nombre[i] >= 'a' && Nombre[i] <= 'z' ){
Nombre[i] = toupper(Nombre[i]);
}
}
}
你的代码错误太多了。您不需要单独的数组和 3 个循环。只需在一个循环中完成您想要的所有转换。此答案使用 std::transform
:
#include <algorithm>
#include <cctype>
#include <cstdio>
int main() {
char str[] = "Hello World";
std::transform(std::begin(str), std::end(str), std::begin(str),
[](unsigned char const ch) -> char {
if (std::isspace(ch)) return '_';
if (std::isupper(ch)) return std::tolower(ch);
if (std::islower(ch)) return std::toupper(ch);
return ch;
});
std::puts(str);
}
回答问题而不是查看代码(code review site 确实是这个地方,请检查一下),如果您不初始化数组,则其中的值是不明确的。实际上,它们将是代码 运行 之前数组地址处内存中的任何内容。碰巧有些东西在内存中留下一个 1
相当于 Arr + 4
的位置所以 Arr[i] != 1
失败 i
等于 4 和字母 i
未转换。
如果每次不写 1 时都写一个 0,那么它应该可以工作,尽管其他答案表明代码可能更加惯用和可移植的 C++,并且 Arr
数组是不是真的需要。
我注意到,当我没有在这段将小写字母变为大写字母的代码中初始化数组时,该代码只完成了一半的工作(变为 Antoine Copepe -> aNTOiNE_cOPEPE
)。我想知道是否存在空引用错误 Kevin was talking about in his answer 初始化数组的重要性
#include <iostream>
#include<string.h>
#include<ctype.h>
#include<conio.h>
using namespace std;
void ConvMl_(char [], int);
int main(){
char Nombre[32];
int Len;
cout<< "inserte su nombre completo: ";
cin.getline(Nombre,32);
Len = strlen(Nombre);
ConvMl_(Nombre, Len);
cout<<Nombre<<endl;
getch();
return 0;
}
void ConvMl_(char Nombre[], int Len){
int Arr[Len] = { 'EsNecesarioInicializarElArray' };
for(int i=0;i<Len;i++){
if(Nombre[i] == ' '){
Nombre[i] = '_';
}
}
for(int i=0;i<Len;i++){
if(Nombre[i] >= 'A' && Nombre[i] <= 'Z'){
Nombre[i] = tolower(Nombre[i]);
Arr[i]=1;
}
}
for(int i=0;i<Len;i++){
if(Nombre[i] >= 'a' && Nombre[i] <= 'z' && Arr[i] != 1){
Nombre[i] = toupper(Nombre[i]);
}
}
}
确实这给了我:
main.cpp:28:22: warning: character constant too long for its type
inserte su nombre completo: Antoine Coppepe
aNTOINE_cOPPEPE
而当我 int Arr[Len];
我只有 Antoine Copepe -> aNTOiNE_cOPEPE
您应该完全删除 Arr
变量,并就此删除 conio。它使用非标准代码。可以使用 if-else-if 语句将您的三个循环合并为一个循环,这样您就可以轻松摆脱 Arr
变量。
void ConvMl_(char Nombre[], int Len){
for(int i=0;i<Len;i++){
if(Nombre[i] == ' '){
Nombre[i] = '_';
} else if(Nombre[i] >= 'A' && Nombre[i] <= 'Z'){
Nombre[i] = tolower(Nombre[i]);
} else if(Nombre[i] >= 'a' && Nombre[i] <= 'z' ){
Nombre[i] = toupper(Nombre[i]);
}
}
}
你的代码错误太多了。您不需要单独的数组和 3 个循环。只需在一个循环中完成您想要的所有转换。此答案使用 std::transform
:
#include <algorithm>
#include <cctype>
#include <cstdio>
int main() {
char str[] = "Hello World";
std::transform(std::begin(str), std::end(str), std::begin(str),
[](unsigned char const ch) -> char {
if (std::isspace(ch)) return '_';
if (std::isupper(ch)) return std::tolower(ch);
if (std::islower(ch)) return std::toupper(ch);
return ch;
});
std::puts(str);
}
回答问题而不是查看代码(code review site 确实是这个地方,请检查一下),如果您不初始化数组,则其中的值是不明确的。实际上,它们将是代码 运行 之前数组地址处内存中的任何内容。碰巧有些东西在内存中留下一个 1
相当于 Arr + 4
的位置所以 Arr[i] != 1
失败 i
等于 4 和字母 i
未转换。
如果每次不写 1 时都写一个 0,那么它应该可以工作,尽管其他答案表明代码可能更加惯用和可移植的 C++,并且 Arr
数组是不是真的需要。