将字符串转换为大写以与C中的用户输入进行比较

时间:2016-04-19 03:56:02

标签: c arrays strcmp toupper

我正在尝试创建一个允许用户在文件中搜索名称的程序。程序成功执行了此操作,但后来我发现不是每个人都会输入名称,因为它在文件中大写。也就是说,有人可能会搜索“sarah”,但由于名称在文件中列为“Sarah”,因此找不到该名称。为了解决这个问题,我试图在比较时将两个字符串转换为大写字母。我自学C非常非常新,所以我不确定我是否朝着正确的方向前进。在这一点上,我甚至无法编译程序,因为我得到两个错误,说“数组初始化程序必须是初始化程序列表或字符串文字”。我假设这意味着我的语法不仅无效,而且完全在错误的方向。什么是达到目标的最佳方式?

     #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;

      }

4 个答案:

答案 0 :(得分:1)

这两行是错误的:

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] = '\0';

关于比较,您可以按建议使用strcasecmp,即Posix。 如果您只想在C stdlib中使用函数,请转换上面的字符串,然后使用strcmp

答案 1 :(得分:1)

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);
}

答案 2 :(得分: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]);

答案 3 :(得分:0)

因为函数toupper用于将字符从small转换为大写,所以不能将它用于字符串大小写转换。但是你可以用这种方式使用相同的函数串起来:

  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;
}