这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
int main()
{
FILE *fp;
char s[50];
fp = fopen("line.txt" , "r");
if( fgets (s, 50, fp)!=NULL )
{
puts(s);
}
fclose(fp);
return 0;
}
我知道如何使用printf函数以全大写和小写字母显示字符串。但我不知道如何使用fgets功能来做到这一点。我也正在从文件中读取一个字符串,这对我来说很棘手。
答案 0 :(得分:4)
if( fgets (s, 50, fp)!=NULL )
{
for( size_t ii = 0; s[ii]; ii++ )
{
s[ii] = toupper((unsigned char)s[ii]);
}
puts(s);
}
答案 1 :(得分:1)
在读取字符串(通过任何方式)之后,除了toupper
中的ctype.h
函数之外,您还可以从小写到大写(以及从上到下)进行大小写覆盖通过简单的按位运算来降低。
字符值
您经常会听到 7位ASCII 这个词。这是由于ASCII字符集由每个字符值的前7位表示。 (对于标准字符,第8位始终为0
。)第6位是 case-bit 。 (适用于A-Za-z
)对于A-Z
,案例位为0
,而a-z
则为1
。
char | dec | hex | binary
-----+-------+--------+---------
A | 65 | 0x41 | 01000001
B | 66 | 0x42 | 01000010
C | 67 | 0x43 | 01000011
D | 68 | 0x44 | 01000100
...
a | 97 | 0x61 | 01100001
b | 98 | 0x62 | 01100010
c | 99 | 0x63 | 01100011
d | 100 | 0x64 | 01100100
要从小写更改为大写,只需检查以确保您在a-z
上操作然后只是翻转从1
到0
的第6位。
在您的情况下,从stdin
读取字符串然后将任何小写字符更改为大写可以按如下方式完成:
#include <stdio.h>
enum { MAXC = 512 };
int main (void) {
char str[MAXC] = "";
char *p = str;
printf ("\n enter str: ");
if (!fgets (str, MAXC, stdin)) {
fprintf (stderr, "error: invalid input.\n");
return 1;
}
for (; *p; p++) /* for each character */
if ('a' <= *p && *p <= 'z') /* if lower-case */
*p ^= (1 << 5); /* set case bit upper */
printf (" uc-string: %s\n", str);
return 0;
}
示例使用/输出
$ ./bin/str2upper
enter str: This is A String with UPPPER and lower case.
uc-string: THIS IS A STRING WITH UPPPER AND LOWER CASE.
仔细看看,如果您有任何问题,请告诉我。
答案 2 :(得分:0)
strupr()
函数(a non-standard function from Microsoft's C library
)将该字符串中的所有小写字符转换为大写字符。 strupr()的结果存储在同一个字符串中。
char str1[]="UppEr Case";
puts(strupr(str1)); //Converts to uppercase and displays it.
或
您可以编写自己的功能。
int str_upr(char *cstr)
{
char *str=cstr;
for (;*str;str++) {
if (isalpha(*str))
*str += 'A' - 'a';
}
return 0;
}
此实现将修改您的字符数组。
但是,如果您只想打印字符数组而不修改原始数组,则可以使用此实现。
void str_upr(char *str)
{
int c;
for (;*str;str++) {
c=*str;
if (isalpha(c))
c += 'A'-'a';
putc(c, stdout);
}
}