识别 upper/lower 大小写字母 C 的函数
Function to identify upper/lower case letters C
我正在尝试创建一个函数来识别第一个字母输入是大写还是小写,然后以相同的大小写输出字符串的其余部分 (upper/lower)。
例如,"Hi there"
将变为 "HI THERE"
。
我不熟悉 fgets
。一旦我 运行 它我可以输入并按 enter 并且程序不会 运行。我没有收到任何编译器错误。我相信我在 void shift 函数中出错了。
另外,我知道gets
不推荐,fgets
类似吗?还是使用 scanf
更好?
#include <stdio.h>
#include <ctype.h>
void shift (char *my_string); // Function declaration
int main()
{
char inputstring[50];
printf("Enter a string\n");
char *my_string = inputstring;
shift(my_string); // Function
}
void shift (char *my_string) // Function definition
{
int i =0;
char ch;
for(i=0; i<50; i++)
fgets(my_string, 50, stdin);
while(my_string[i])
{
if(ch>='A' && ch<= 'Z') // When first char is uppercase
{
putchar (toupper(my_string[i]));
i++;
}
else if (ch>='a' && ch <= 'z') // When first char is lowercase
{
putchar(tolower(my_string[i]));
i++
}
}
return;
}
您不需要调用 fgets()
五十次。它从 stdin
中读取一行并将其写入 my_string
。看起来你只想读一行,而不是五十行(并且只保留最后一行)。 50 是将读取和写入缓冲区的最大字符数(减一)。这个限制是为了防止缓冲区溢出。参见 fgets()。
尝试删除 fgets()
调用之前行中的 for
循环。此外,您不需要 main()
中的 my_string
。更正后的代码:
#include <stdio.h>
#include <ctype.h>
void shift (char *my_string);//function declaration
int main()
{
char inputstring[50];
printf("Enter a string\n");
shift(inputstring);
}
void shift (char *my_string) //function definition
{
int i;
char ch;
if ( fgets(my_string, 50, stdin) == NULL )
return;
ch = my_string[0];
for ( i=0; my_string[i]; i++ )
{
if(ch>='A' && ch<= 'Z') //when first char is uppercase
{
putchar (toupper(my_string[i]));
}
else if (ch>='a' && ch <= 'z')//when first char is lowercase
{
putchar(tolower(my_string[i]));
}
}
return;
}
编辑:添加了 ch
初始化,@thurizas 指出。将 while
循环更改为 for
循环。按照@JonathanLeffler 的建议,添加了对 fgets()
的 return 值的检查。 (请参阅他对缓冲区大小的评论。)
所有ASCII字符都用7位表示。 (因此术语 7 位 ASCII)lower-case 和 upper-case 之间的唯一按位区别是第 5 位(第六位)设置为小写,清除(未设置)为大写。这允许在小写和大写之间进行简单的按位转换(通过 adding/subtracting 32
或直接翻转位 5。)
+-- lowercase bit
|
a = 01100001 A = 01000001
b = 01100010 B = 01000010
c = 01100011 C = 01000011
...
如果第一个字符是 upper-case:
,这允许进行简单的测试和转换
#include <stdio.h>
enum { MAXC = 50 };
char *shift (char *my_string);
int main (void)
{
char inputstring[MAXC] = {0};;
printf ("\n Enter a string: ");
if (shift (inputstring))
printf (" my_string is : %s\n", inputstring);
return 0;
}
char *shift (char *my_string)
{
char *p;
if (!(p = fgets (my_string, MAXC, stdin))) return NULL;
if (*p == '\n') return NULL; /* Enter only pressed */
if ('A' <= *p && *p <= 'Z') /* test for upper case */
for (; *p; p++) /* convert lower/upper */
if ('a' <= *p && *p <= 'z') *p &= ~(1 << 5);
return my_string;
}
示例使用
$ ./bin/case_1st_to_upper
Enter a string: this is my string
my_string is : this is my string
$ ./bin/case_1st_to_upper
Enter a string: This is my string
my_string is : THIS IS MY STRING
这是您问题的另一个解决方案,
#include <stdio.h>
#include <ctype.h>
void convertTo (char *string);
int main()
{
char inputString[50];
printf("Enter a string\n");
convertTo(inputString);
}
void convertTo (char *string)
{
int i;
char ch;
gets(string);
ch = string[0];
for ( i=0; string[i]; i++ )
{
if(ch>='A' && ch<= 'Z')
{
if(string[i]>='a' && string[i]<= 'z')
string[i] = string[i] - 32;
}
else if (ch>='a' && ch <= 'z')
{
if(string[i]>='A' && string[i]<= 'Z')
string[i] = string[i] + 32;
}
}
printf("%s\n", string);
return;
}
我正在尝试创建一个函数来识别第一个字母输入是大写还是小写,然后以相同的大小写输出字符串的其余部分 (upper/lower)。
例如,"Hi there"
将变为 "HI THERE"
。
我不熟悉 fgets
。一旦我 运行 它我可以输入并按 enter 并且程序不会 运行。我没有收到任何编译器错误。我相信我在 void shift 函数中出错了。
另外,我知道gets
不推荐,fgets
类似吗?还是使用 scanf
更好?
#include <stdio.h>
#include <ctype.h>
void shift (char *my_string); // Function declaration
int main()
{
char inputstring[50];
printf("Enter a string\n");
char *my_string = inputstring;
shift(my_string); // Function
}
void shift (char *my_string) // Function definition
{
int i =0;
char ch;
for(i=0; i<50; i++)
fgets(my_string, 50, stdin);
while(my_string[i])
{
if(ch>='A' && ch<= 'Z') // When first char is uppercase
{
putchar (toupper(my_string[i]));
i++;
}
else if (ch>='a' && ch <= 'z') // When first char is lowercase
{
putchar(tolower(my_string[i]));
i++
}
}
return;
}
您不需要调用 fgets()
五十次。它从 stdin
中读取一行并将其写入 my_string
。看起来你只想读一行,而不是五十行(并且只保留最后一行)。 50 是将读取和写入缓冲区的最大字符数(减一)。这个限制是为了防止缓冲区溢出。参见 fgets()。
尝试删除 fgets()
调用之前行中的 for
循环。此外,您不需要 main()
中的 my_string
。更正后的代码:
#include <stdio.h>
#include <ctype.h>
void shift (char *my_string);//function declaration
int main()
{
char inputstring[50];
printf("Enter a string\n");
shift(inputstring);
}
void shift (char *my_string) //function definition
{
int i;
char ch;
if ( fgets(my_string, 50, stdin) == NULL )
return;
ch = my_string[0];
for ( i=0; my_string[i]; i++ )
{
if(ch>='A' && ch<= 'Z') //when first char is uppercase
{
putchar (toupper(my_string[i]));
}
else if (ch>='a' && ch <= 'z')//when first char is lowercase
{
putchar(tolower(my_string[i]));
}
}
return;
}
编辑:添加了 ch
初始化,@thurizas 指出。将 while
循环更改为 for
循环。按照@JonathanLeffler 的建议,添加了对 fgets()
的 return 值的检查。 (请参阅他对缓冲区大小的评论。)
所有ASCII字符都用7位表示。 (因此术语 7 位 ASCII)lower-case 和 upper-case 之间的唯一按位区别是第 5 位(第六位)设置为小写,清除(未设置)为大写。这允许在小写和大写之间进行简单的按位转换(通过 adding/subtracting 32
或直接翻转位 5。)
+-- lowercase bit
|
a = 01100001 A = 01000001
b = 01100010 B = 01000010
c = 01100011 C = 01000011
...
如果第一个字符是 upper-case:
,这允许进行简单的测试和转换#include <stdio.h>
enum { MAXC = 50 };
char *shift (char *my_string);
int main (void)
{
char inputstring[MAXC] = {0};;
printf ("\n Enter a string: ");
if (shift (inputstring))
printf (" my_string is : %s\n", inputstring);
return 0;
}
char *shift (char *my_string)
{
char *p;
if (!(p = fgets (my_string, MAXC, stdin))) return NULL;
if (*p == '\n') return NULL; /* Enter only pressed */
if ('A' <= *p && *p <= 'Z') /* test for upper case */
for (; *p; p++) /* convert lower/upper */
if ('a' <= *p && *p <= 'z') *p &= ~(1 << 5);
return my_string;
}
示例使用
$ ./bin/case_1st_to_upper
Enter a string: this is my string
my_string is : this is my string
$ ./bin/case_1st_to_upper
Enter a string: This is my string
my_string is : THIS IS MY STRING
这是您问题的另一个解决方案,
#include <stdio.h> #include <ctype.h> void convertTo (char *string); int main() { char inputString[50]; printf("Enter a string\n"); convertTo(inputString); } void convertTo (char *string) { int i; char ch; gets(string); ch = string[0]; for ( i=0; string[i]; i++ ) { if(ch>='A' && ch<= 'Z') { if(string[i]>='a' && string[i]<= 'z') string[i] = string[i] - 32; } else if (ch>='a' && ch <= 'z') { if(string[i]>='A' && string[i]<= 'Z') string[i] = string[i] + 32; } } printf("%s\n", string); return; }