转换为C中的所有大写字母错误
Convert to all upper case letter bug in C
我是菜鸟所以请解释为什么下面的代码不起作用?
它打印一个不必要的 Case 1:.
我假设它不是在测试用例循环中第一次使用 fgets
扫描。
请告诉我为什么。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i, j, T;
scanf("%d", &T); //test cases
char character[100];
for (j = 1; j <= T; j++) {
fgets(character, 100, stdin); //input
for (i = 0; i <= strlen(character); i++) { //function
if (character[i] >= 91) {
character[i] = character[i] - 32;
};
}
printf("Case %d: %s", j, character); //result
}
return 0;
}
这段代码会做你想做的事。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
int i,j,T;
scanf("%d\n",&T); //test cases
char character[100];
for(j=1;j<=T;j++){
fgets(character,100,stdin); //input
for(i=0;i<strlen(character);i++){ //function
if(character[i]>=91){
character[i]= character[i]-32;
}
}
printf("Case %d: %s \n",j,character); //result
}
return 0;
}
请注意
for (i = 0; i <= strlen(character); i++)
应该修改为
for (i = 0; i < strlen(character); i++)
您的代码中存在多个问题:
- 你应该在用
scanf()
获得数字后阅读待处理的换行符。
- 你没有检查文件结尾
你在循环中包含空终止符,一个更简单的测试是这样的:
for (i = 0; character[i] != '[=10=]'; i++)
- 您应该使用
<ctype.h>
将小写字母转换为大写字母,或者至少使用字符常量而不是硬编码的 ASCII 值。当前代码还会转换 {
、|
、}
...等字符,因为它们恰好是 >= 91.
91
无论如何都是不正确的。 'a'
在 ASCII 中的值为 97
。
这是修改后的版本:
#include <ctype.h>
#include <stdio.h>
int main() {
int i, j, T;
if (scanf("%d", &T)) != 1) //test cases
return 1;
getchar(); // read pending newline
char character[100];
for (j = 0; j < T; j++) {
if (!fgets(character, sizeof character, stdin)) //input
break;
for (i = 0; character[i] != '[=11=]'; i++) { //function
character[i] = toupper((unsigned char)character[i]);
}
printf("Case %d: %s", j + 1, character); //result
}
return 0;
}
ASCII 特定版本:
#include <stdio.h>
int main() {
int i, j, T;
if (scanf("%d", &T)) != 1) //test cases
return 1;
getchar(); // read pending newline
char character[100];
for (j = 0; j < T; j++) {
if (!fgets(character, sizeof character, stdin)) //input
break;
for (i = 0; character[i] != '[=12=]'; i++) { //function
if (character[i] >= 'a' && character[i] <= 'z') {
character[i] -= 'a' - 'A';
}
}
printf("Case %d: %s", j + 1, character); //result
}
return 0;
}
我是菜鸟所以请解释为什么下面的代码不起作用?
它打印一个不必要的 Case 1:.
我假设它不是在测试用例循环中第一次使用 fgets
扫描。
请告诉我为什么。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main() {
int i, j, T;
scanf("%d", &T); //test cases
char character[100];
for (j = 1; j <= T; j++) {
fgets(character, 100, stdin); //input
for (i = 0; i <= strlen(character); i++) { //function
if (character[i] >= 91) {
character[i] = character[i] - 32;
};
}
printf("Case %d: %s", j, character); //result
}
return 0;
}
这段代码会做你想做的事。
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
int main()
{
int i,j,T;
scanf("%d\n",&T); //test cases
char character[100];
for(j=1;j<=T;j++){
fgets(character,100,stdin); //input
for(i=0;i<strlen(character);i++){ //function
if(character[i]>=91){
character[i]= character[i]-32;
}
}
printf("Case %d: %s \n",j,character); //result
}
return 0;
}
请注意
for (i = 0; i <= strlen(character); i++)
应该修改为
for (i = 0; i < strlen(character); i++)
您的代码中存在多个问题:
- 你应该在用
scanf()
获得数字后阅读待处理的换行符。 - 你没有检查文件结尾
你在循环中包含空终止符,一个更简单的测试是这样的:
for (i = 0; character[i] != '[=10=]'; i++)
- 您应该使用
<ctype.h>
将小写字母转换为大写字母,或者至少使用字符常量而不是硬编码的 ASCII 值。当前代码还会转换{
、|
、}
...等字符,因为它们恰好是 >= 91. 91
无论如何都是不正确的。'a'
在 ASCII 中的值为97
。
这是修改后的版本:
#include <ctype.h>
#include <stdio.h>
int main() {
int i, j, T;
if (scanf("%d", &T)) != 1) //test cases
return 1;
getchar(); // read pending newline
char character[100];
for (j = 0; j < T; j++) {
if (!fgets(character, sizeof character, stdin)) //input
break;
for (i = 0; character[i] != '[=11=]'; i++) { //function
character[i] = toupper((unsigned char)character[i]);
}
printf("Case %d: %s", j + 1, character); //result
}
return 0;
}
ASCII 特定版本:
#include <stdio.h>
int main() {
int i, j, T;
if (scanf("%d", &T)) != 1) //test cases
return 1;
getchar(); // read pending newline
char character[100];
for (j = 0; j < T; j++) {
if (!fgets(character, sizeof character, stdin)) //input
break;
for (i = 0; character[i] != '[=12=]'; i++) { //function
if (character[i] >= 'a' && character[i] <= 'z') {
character[i] -= 'a' - 'A';
}
}
printf("Case %d: %s", j + 1, character); //result
}
return 0;
}