使用ASCII将小写转换为大写

时间:2014-09-13 08:08:35

标签: c ascii uppercase lowercase

我正在尝试使用ASCII表将所有小写字母转换为大写字母!这很容易处理,我已经找到了代码。问题是,如果单词之间有空格,那么程序只会更改第一个单词,在空格之后它不会打印任何内容。

实施例
Word:Andreas Gives:ANDREAS
字:TeSt123Ha给出:TEST123HA
BUT!
词:你好45给:你好 在空间之后它什么都没打印出来!

我知道ASCII表中的空格等于32,在我的代码中,我告诉程序,如果你正在读取的当前代码不在97和122之间,那么不要执行任何更改!

但它仍无效!

char currentletter;
int i;

for (i=0; i<49; i++)    
{
    currentletter = str[i];

    if ((currentletter > 96) && (currentletter < 123))
    {
        char newletter;
        newletter = currentletter - 32;
        str[i] = newletter;
    }
    else
    {
        str[i] = currentletter;
    }
}
printf("%s\n", str);

3 个答案:

答案 0 :(得分:3)

翻转第5个最低位应该会有所帮助。

  

每个小写字母都是32 +大写字母。这意味着只需翻转位置5的位(从位置0的最低位开始计数)就会反转字母的大小写。   https://web.stanford.edu/class/cs107/lab1/practice.html

char *str;
int str_size = sizeof(str);

for(int i=0; i<str_size;i++){
   if((str[i]>96) && (str[i]<123)) str[i] ^=0x20;
} 

答案 1 :(得分:0)

您在其中一条评论中提及您使用scanf来获取字符串。scanf会在找到空格或换行符时停止扫描。

要解决此问题,请使用fgets()
fgets()的语法是:

char *fgets (char *str, int size, FILE* file);

在您的情况下,请使用

fgets(str,49,stdin);

而不是使用scanf

<小时/> 你的代码也有几个不必要的东西。 删除不相关的内容后,您的代码将如下所示:

int i;

for (i=0; i<49; i++)    
{

    if ((str[i] > 96) && (str[i] < 123))
    str[i]=str[i]-32;

}
printf("%s\n", str);

答案 2 :(得分:-1)

我只是出于娱乐目的尝试使用STL和Lambda:

string input = "";
getline(cin, input);
transform(input.begin(), input.end(), input.begin(), [](char c) { return (c > 96 && c < 123) ? c ^= 0x20 : c; });
copy(input.begin(), input.end(), ostream_iterator<char>(cout, " "));

我在Visual Studio 2019中使用c ++ 17进行了编译和测试, 并没有进行详尽的测试!