将字符串转换为大写以与 C 中的用户输入进行比较
Converting strings to uppercase to compare with user input in C
我正在尝试创建一个允许用户在文件中搜索名称的程序。该程序成功地做到了这一点,但后来我想到并不是每个人都会输入名称,因为它在文件中是大写的。也就是说,有人可能会搜索 "sarah,",但由于该名称在文件中列为 "Sarah",因此找不到该名称。为了解决这个问题,我试图在比较时将两个字符串都转换为大写。我对自学 C 非常非常陌生,所以我不确定我是否正朝着正确的方向前进。此时我什至无法让程序编译,因为我收到两个错误 "array initializer must be an initializer list or string literal." 我假设这意味着我的语法不仅无效而且完全错误。实现我的目标的最佳方式是什么?
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
FILE *inFile;
inFile = fopen("workroster.txt", "r");
char rank[4], gname[20], bname[20], name[20];
printf("Enter a name: __");
scanf("%s", name);
int found = 0;
while(fscanf(inFile, "%s %s %s", rank, bname, gname)== 3)
{ char uppername[40] = toupper(name[15]);
char upperbname[40] = toupper(bname[15]);
if(strcmp(uppberbname,uppername) == 0)
{
printf("%s is number %s on the roster\n", name, rank);
found = 1;
}
}
if ( !found )
printf("%s is not on the roster\n", name);
return 0;
}
使用strings.h
中包含的以下函数
int strcasecmp(const char *s1, const char *s2);
在你的情况下改变 if 语句
if(strcmp(uppberbname,uppername) == 0)
到
if(strcasecmp(bname,name) == 0)
并删除
char uppername[40] = toupper(name[15]);
char upperbname[40] = toupper(bname[15]);
因为函数toupper
是将一个字符从小写转换为大写,所以不能用它来进行字符串大小写转换。但是您可以通过这种方式使用相同的函数进行串接:
while(name[i])
{
uppername[i]=toupper(name[i]);
i++;
}
while(bname[j])
{
upperbname[j]=toupper(bname[j]);
j++;
}
这些语句执行我们的字符串大小写转换。整个计划:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void) {
FILE *inFile;
inFile = fopen("workroster.txt", "r");
char rank[4], gname[20], bname[20], name[20], uppername[40], upperbname[40];
printf("Enter a name: __");
scanf("%s", name);
int found = 0, i = 0, j = 0;
while (fscanf(inFile, "%s %s %s", rank, bname, gname) == 3) {
while (name[i]) {
uppername[i] = toupper(name[i]);
i++;
}
while (bname[j]) {
upperbname[j] = toupper(bname[j]);
j++;
}
//char uppername[40] = toupper(name[15]);
//char upperbname[40] = toupper(bname[15]);
if (strcmp(uppername, upperbname) == 0) {
printf("%s is number %s on the roster\n", name, rank);
found = 1;
}
}
if (!found) printf("%s is not on the roster\n", name);
return 0;
}
这两行是错误的:
char uppername[40] = toupper(name[15]);
char upperbname[40] = toupper(bname[15]);
int toupper(int c); takes an int and returns an int
因为在C语言中字符串只是一个空终止符的字符数组,所以你可以做的是将字符串的每个字符转换为大写:
for (size_t I = 0; I < strlen(name); I++) {
uppername[I] = toupper(name[I]);
}
uppername[I] = '[=11=]';
关于比较,建议可以用strcasecmp
,也就是Posix。
如果只想使用 C stdlib 中的函数,请按上述方式转换字符串,然后使用 strcmp
.
toupper()
适用于单个字符,不适用于字符串。
无需转换输入字符串。简单调用一个不区分大小写的字符串比较。
由于 C 没有标准的,因此很容易创建自己的。
int mystricmp(const char *s1, const char *s2) {
// toupper works with unsigned char values.
// It has trouble (UB) with char, when char is signed.
const unsigned char *p1 = (const unsigned char *) s1;
const unsigned char *p2 = (const unsigned char *) s2;
while (toupper(*p1) == toupper(*p2) && *p1) {
p1++;
p2++;
}
int ch1 = toupper(*p1);
int ch2 = toupper(*p1);
return (ch1 > ch2) - (ch1 < ch2);
}
我正在尝试创建一个允许用户在文件中搜索名称的程序。该程序成功地做到了这一点,但后来我想到并不是每个人都会输入名称,因为它在文件中是大写的。也就是说,有人可能会搜索 "sarah,",但由于该名称在文件中列为 "Sarah",因此找不到该名称。为了解决这个问题,我试图在比较时将两个字符串都转换为大写。我对自学 C 非常非常陌生,所以我不确定我是否正朝着正确的方向前进。此时我什至无法让程序编译,因为我收到两个错误 "array initializer must be an initializer list or string literal." 我假设这意味着我的语法不仅无效而且完全错误。实现我的目标的最佳方式是什么?
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void)
{
FILE *inFile;
inFile = fopen("workroster.txt", "r");
char rank[4], gname[20], bname[20], name[20];
printf("Enter a name: __");
scanf("%s", name);
int found = 0;
while(fscanf(inFile, "%s %s %s", rank, bname, gname)== 3)
{ char uppername[40] = toupper(name[15]);
char upperbname[40] = toupper(bname[15]);
if(strcmp(uppberbname,uppername) == 0)
{
printf("%s is number %s on the roster\n", name, rank);
found = 1;
}
}
if ( !found )
printf("%s is not on the roster\n", name);
return 0;
}
使用strings.h
int strcasecmp(const char *s1, const char *s2);
在你的情况下改变 if 语句
if(strcmp(uppberbname,uppername) == 0)
到
if(strcasecmp(bname,name) == 0)
并删除
char uppername[40] = toupper(name[15]);
char upperbname[40] = toupper(bname[15]);
因为函数toupper
是将一个字符从小写转换为大写,所以不能用它来进行字符串大小写转换。但是您可以通过这种方式使用相同的函数进行串接:
while(name[i])
{
uppername[i]=toupper(name[i]);
i++;
}
while(bname[j])
{
upperbname[j]=toupper(bname[j]);
j++;
}
这些语句执行我们的字符串大小写转换。整个计划:
#include <stdio.h>
#include <ctype.h>
#include <string.h>
int main(void) {
FILE *inFile;
inFile = fopen("workroster.txt", "r");
char rank[4], gname[20], bname[20], name[20], uppername[40], upperbname[40];
printf("Enter a name: __");
scanf("%s", name);
int found = 0, i = 0, j = 0;
while (fscanf(inFile, "%s %s %s", rank, bname, gname) == 3) {
while (name[i]) {
uppername[i] = toupper(name[i]);
i++;
}
while (bname[j]) {
upperbname[j] = toupper(bname[j]);
j++;
}
//char uppername[40] = toupper(name[15]);
//char upperbname[40] = toupper(bname[15]);
if (strcmp(uppername, upperbname) == 0) {
printf("%s is number %s on the roster\n", name, rank);
found = 1;
}
}
if (!found) printf("%s is not on the roster\n", name);
return 0;
}
这两行是错误的:
char uppername[40] = toupper(name[15]);
char upperbname[40] = toupper(bname[15]);
int toupper(int c); takes an int and returns an int
因为在C语言中字符串只是一个空终止符的字符数组,所以你可以做的是将字符串的每个字符转换为大写:
for (size_t I = 0; I < strlen(name); I++) {
uppername[I] = toupper(name[I]);
}
uppername[I] = '[=11=]';
关于比较,建议可以用strcasecmp
,也就是Posix。
如果只想使用 C stdlib 中的函数,请按上述方式转换字符串,然后使用 strcmp
.
toupper()
适用于单个字符,不适用于字符串。
无需转换输入字符串。简单调用一个不区分大小写的字符串比较。
由于 C 没有标准的,因此很容易创建自己的。
int mystricmp(const char *s1, const char *s2) {
// toupper works with unsigned char values.
// It has trouble (UB) with char, when char is signed.
const unsigned char *p1 = (const unsigned char *) s1;
const unsigned char *p2 = (const unsigned char *) s2;
while (toupper(*p1) == toupper(*p2) && *p1) {
p1++;
p2++;
}
int ch1 = toupper(*p1);
int ch2 = toupper(*p1);
return (ch1 > ch2) - (ch1 < ch2);
}