【发布时间】:2016-04-19 03:56:01
【问题描述】:
我正在尝试创建一个允许用户在文件中搜索名称的程序。该程序成功地做到了这一点,但后来我想到并不是每个人都会输入名称,因为它在文件中是大写的。也就是说,有人可能会搜索“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;
}
【问题讨论】:
-
一个很好的起点是了解您调用的 api 如何实际运行。例如,
toupper返回单个char,因此不适合初始化chararray。顺便说一句,如果您不介意将马车挂在 posix 拖拉机上,strcasecmp可能会使这项任务变得更容易(或在 Windoze 中使用_stricmp)。 -
确保您验证并限制所有输入。例如
if (scanf ("%19[^\n]%*c", name) != 1) { fprintf (stderr, "error: invalid input.\n"); return 1;}不仅仅是您从文件中读取的输入。如果用户输入someverylongstring__%%with+malicious+commands%%怎么办?