我正在尝试使用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);
答案 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进行了编译和测试, 并没有进行详尽的测试!