使用ASCII将小写转换为大写

使用ASCII将小写转换为大写,c,ascii,uppercase,lowercase,C,Ascii,Uppercase,Lowercase,我正在尝试使用ASCII表将所有小写字母转换为大写字母!这是非常容易处理,我已经想出了代码。问题是,如果单词之间有空格,那么程序只会更改第一个单词,空格后不会打印任何内容 示例 单词:Andreas给出:Andreas 单词:TeSt123Ha给出:TeSt123Ha 但是 单词:Hello:Hello 在空间之后,它什么也不打印 我知道ASCII表中的空格等于32,在我的代码中我告诉程序,如果您正在读取的当前代码不在97和122之间,那么不要执行任何更改 但它仍然不起作用 char当前字母;

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

示例
单词:Andreas给出:Andreas
单词:TeSt123Ha给出:TeSt123Ha
但是
单词:Hello:Hello
在空间之后,它什么也不打印

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

但它仍然不起作用

char当前字母;
int i;
对于(i=0;i 96)和(当前字母<123))
{
新字母字符;
newletter=currentletter-32;
str[i]=新字母;
}
其他的
{
str[i]=currentletter;
}
}
printf(“%s\n”,str);
您拥有使用scanf(“%s”,str)的功能以获取字符串。问题是,
%s
一旦找到空白字符,就会停止扫描。在您的情况下,它在看到空格字符时停止扫描

如果要扫描整行,请使用
fgets()

fgets(str, sizeof(str), stdin);
这里需要注意的一点是,
fgets
也会将换行符扫描到字符串中


您的代码可以简化为:

for (int i = 0; str[i] != '\0'; i++) // Loop until the NUL-terminator
{
    if ((str[i] >= 'a') && (str[i] <= 'z')) // If the current character is a lowercase alphabet
        str[i] = str[i] - ('a' - 'A');      // See the ASCII table to understand this:
                                            // http://www.asciitable.com/index/asciifull.gif
}

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

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

每个小写字母等于32+大写字母。这意味着只需翻转位置5处的位(从位置0处的最低有效位开始计数)即可反转字母的大小写。

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

对于(inti=0;i96)&(str[i]我尝试使用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, " "));
字符串输入=”;
getline(cin,输入);
转换(input.begin()、input.end()、input.begin()、[](字符c){return(c>96&&c<123)?c^=0x20:c;});
复制(input.begin()、input.end()、ostream_迭代器(cout,“”);

我在Visual Studio 2019中用C++ 17编译和测试,


而且没有执行详尽的测试!

您没有显示
str
是如何初始化的-我打赌空格不在里面之后的单词(是
str
argv[1]
初始化的)如果您执行
printf(“%s\n”,str);
在大小写转换代码之前会发生什么?@MichaelBurr:很好。
scanf(“%s”,str)
是单字输入的另一个竞争者。您的
else
分支不是问题的根源,但仍然是完全冗余的。您程序中的32是'a'-'a'。除了ASCII之外,这可能还适用于您实际使用的字符集/编码/代码页。可能是Windows-1252或Unicode/UTF-8?使用
区域设置de>(Linux)或
chcp
(Windows)进行检查。当然,这些字符集有更多的字母是您没有考虑的。@Tom:在Windows-1252和UTF8中,此代码仍然有效,因为32到126的代码都是相同的。但可能您考虑的是EBCDIC。问题被标记为not
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;
} 
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, " "));