为什么在不初始化我的数组时,数组的某些字母没有变成大写?

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

Live

回答问题而不是查看代码(code review site 确实是这个地方,请检查一下),如果您不初始化数组,则其中的值是不明确的。实际上,它们将是代码 运行 之前数组地址处内存中的任何内容。碰巧有些东西在内存中留下一个 1 相当于 Arr + 4 的位置所以 Arr[i] != 1 失败 i 等于 4 和字母 i 未转换。

如果每次不写 1 时都写一个 0,那么它应该可以工作,尽管其他答案表明代码可能更加惯用和可移植的 C++,并且 Arr 数组是不是真的需要。