转换为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;
}