这是一个用 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;
}
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;
}
}
}