大写/小写转换跳过一些字母

问题描述 投票:0回答:1

这是一个用 C 语言将字符串中的小写字母转换为大写字母的程序。

在此代码中,我尝试使用

str
函数从用户处获取输入字符串
fgets()
,但它不起作用。我什至尝试使用
gets()
但它也不起作用。 它会跳过接受输入并执行程序。 我能做些什么? 我尝试使用
for
循环,但它没有在新行上终止。 我可以用任何函数或使用任何循环来完成吗?

#include <stdio.h>
#include <string.h>

char lower(char *str);
char upper(char *str);


int main(){
    
    char *newstr;
    char ans;
    printf("Enter U for Lower case -> Upper case\nEnter L for Upper case -> Lower case:\n");
    scanf("%c", &ans);

    char str[100];
    printf("Enter the string:\n");
    fgets(str, 100, stdin);

    if(ans == 'U' || ans == 'u'){
        // newstr = upper(str);
        upper(str);

    }
    else if(ans == 'L' || ans == 'l'){
        // newstr = lower(str);
        lower(str);
    }
    else{
        printf("Try entering a valid input.");
    }
    
    // printf("%s", newstr);
    printf("%s", str);
    
    return 0;
}


char lower(char *str){
    for(int i=0; i<(strlen(str)); i++){
        char c[] = {str[i], '\0'};
        if(strstr("ABCDEFGHIJKLMNOPQRSTUVWXYZ", c)){
            str[i] = str[i] - 32;
        }
    }
    // return str;
}

char upper(char *str){
    for(int i=0; i<(strlen(str)); i++){
        char c[] = {str[i], '\0'};
        if(strstr("abcdefghijklmnopqrstuvwxyz", c)){
            str[i] = str[i] + 32;
        }
    }
    // return str;
}
c string input fgets
1个回答
0
投票

fgets() - 从流中读取字符并将它们作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或到达文件末尾,以先发生者为准。

答案:scanf() 语句在输入缓冲区中留下换行符,这导致 fgets() 将其作为输入并结束字符串。

您可以修改代码并将 fgets() 逻辑移至 scanf 语句之前以使其正常工作。此外,可以稍微修改 if 条件以使其更好地使用 ASCII 值。以下是工作代码的示例:

#include <stdio.h>
#include <string.h>
#define MAX 100
void lower(char *str);
void upper(char *str);
int main() {
    char str[MAX];
    printf("Enter the string:\n");
    fgets(str, MAX, stdin);
    char ans;
    printf("Enter U for Lower case -> Upper case\nEnter L for Upper case -> Lower case:\n");
    scanf("%c", &ans);
    if (ans == 'U' || ans == 'u') {
        upper(str);
    } else if (ans == 'L' || ans == 'l') {
        lower(str);
    } else {
        printf("Try entering a valid input.");
    }
    printf("%s", str);
    return 0;
}
void lower(char *str) {
    for (int i = 0; i < (strlen(str)); i++) {
        //A = 65, Z = 90
        if (str[i] >= 65 && str[i] <= 90) {
            str[i] = str[i] + 32;
        }
    }
}
void upper(char *str) {
    for (int i = 0; i < (strlen(str)); i++) {
        //a = 97, z = 122
        if (str[i] >= 97 && str[i] <= 122) {
            str[i] = str[i] - 32;
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.