有没有办法在不使用 strupr 函数的情况下以大写字母打印所有字符串,因为它不是标准库函数?
Is there a way to print all string in capital letters without using strupr function as its not a standard library function?
我想打印存储在一个文件中的数据,该文件随机全部大写,strupr()
似乎是之前有人列出的东西,但它不是标准功能,可能不是跨平台的.有没有跨平台的东西?
编辑 1:
fgets(input1,254,title);
fgets(input2,254,author);
input1[strcspn(input1, "\n")] = '[=10=]';
input2[strcspn(input2, "\n")] = '[=10=]';
printf("<%s> <%s>\n",input1,input2 );
我想以大写形式打印存储在 input1
和 input2
中的字符串。怎么做?
您可以逐个字符处理并使用toupper()
。标准函数 C89 起。
您可以使用自定义函数,f.e。 upcase()
。它读取文件中的每个字符,检查它是否为小写(如果是,使用 toupper()
函数将字符调整为大写),将整个文件内容存储到缓冲区中,然后用缓冲区中的内容:
FILE* upcase (const char* path)
{
int c, cnt = 0, i = 0, j = 1;
int n = 500;
FILE* fp = fopen(path, "r+");
char* buffer = calloc(n, sizeof(char));
if (!fp || !buffer)
{
return NULL;
}
while ((c = fgetc(fp)) != EOF)
{
if ( i == n )
{
j++;
realloc(buffer, sizeof(char) * (n * j));
if (!buffer)
{
return NULL;
}
i = -1;
}
c = toupper(c);
buffer[i] = c;
i++;
cnt++;
}
for ( int i = 0; i < cnt; i++ )
{
if (fputc(c, fp) == EOF)
{
fclose(buffer);
return NULL;
}
}
return fp;
}
或者您可以检查字符是否在 a & z
之间,然后执行 a - 32
。将改为大写。
这里a - 32 = A
,因为ASCII的a
的值是97
和97 - 32 = 65
而我们都知道ASCII A
的值是 65
.
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
char buffer[255] = {'[=10=]'}, c;
int i = 0;
fp = fopen("txt.txt", "r");
if(!fp)
{
perror("txt");
exit(1);
}
while( (c = getc(fp)) != EOF)
buffer[i++] = c;
for( i = 0; buffer[i] != '[=10=]'; i++)
{
if(buffer[i] >= 'a' && buffer[i] <= 'z')
buffer[i] = buffer[i] - 32;
printf("%c", buffer[i]);
}
fclose(fp);
return 0;
}
输出:
HELLO!
THIS IS 2ND LINE.
我想打印存储在一个文件中的数据,该文件随机全部大写,strupr()
似乎是之前有人列出的东西,但它不是标准功能,可能不是跨平台的.有没有跨平台的东西?
编辑 1:
fgets(input1,254,title);
fgets(input2,254,author);
input1[strcspn(input1, "\n")] = '[=10=]';
input2[strcspn(input2, "\n")] = '[=10=]';
printf("<%s> <%s>\n",input1,input2 );
我想以大写形式打印存储在 input1
和 input2
中的字符串。怎么做?
您可以逐个字符处理并使用toupper()
。标准函数 C89 起。
您可以使用自定义函数,f.e。 upcase()
。它读取文件中的每个字符,检查它是否为小写(如果是,使用 toupper()
函数将字符调整为大写),将整个文件内容存储到缓冲区中,然后用缓冲区中的内容:
FILE* upcase (const char* path)
{
int c, cnt = 0, i = 0, j = 1;
int n = 500;
FILE* fp = fopen(path, "r+");
char* buffer = calloc(n, sizeof(char));
if (!fp || !buffer)
{
return NULL;
}
while ((c = fgetc(fp)) != EOF)
{
if ( i == n )
{
j++;
realloc(buffer, sizeof(char) * (n * j));
if (!buffer)
{
return NULL;
}
i = -1;
}
c = toupper(c);
buffer[i] = c;
i++;
cnt++;
}
for ( int i = 0; i < cnt; i++ )
{
if (fputc(c, fp) == EOF)
{
fclose(buffer);
return NULL;
}
}
return fp;
}
或者您可以检查字符是否在 a & z
之间,然后执行 a - 32
。将改为大写。
这里a - 32 = A
,因为ASCII的a
的值是97
和97 - 32 = 65
而我们都知道ASCII A
的值是 65
.
代码:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fp;
char buffer[255] = {'[=10=]'}, c;
int i = 0;
fp = fopen("txt.txt", "r");
if(!fp)
{
perror("txt");
exit(1);
}
while( (c = getc(fp)) != EOF)
buffer[i++] = c;
for( i = 0; buffer[i] != '[=10=]'; i++)
{
if(buffer[i] >= 'a' && buffer[i] <= 'z')
buffer[i] = buffer[i] - 32;
printf("%c", buffer[i]);
}
fclose(fp);
return 0;
}
输出:
HELLO!
THIS IS 2ND LINE.