我花了最后4或5个小时做一些可能非常简单的事情,我尝试了很多不同的方法。我想要做的是让我的程序在保存的测试文件中保存每行的结尾。这将是球员姓名,后面是球衣号码或重量等。文件以这样的格式保存:
名字是:xxxxxx
姓氏是:xxxxx
出生日期是:xxxxxx
我希望我的代码只能将xxxxxx存储在一个单独的变量中,这样我就可以对它进行解密,因为只有部分是加密的。
我到目前为止的代码是
int main()
{
int dob;
char lastname[15], *ptr, filename[25], line[40], storage[200], a[15];
FILE *file;
printf("Please enter the last name of your player: ");
scanf("%s", lastname);
printf("\nPlease enter the date of birth of your player: ");
scanf("%d", &dob);
printf("\n\n");
sprintf(filename, "%s%6d.pat", lastname, dob);
printf("%s", filename);
file = fopen(filename, "r");
while(fgets(line, sizeof(line), file) != NULL)
{
fprintf(stdout, "%s", line);
}
fscanf(file, "%s: %s\n", storage, a);
printf("%s %s", storage, a);
我现在正在尝试使用这段代码来获取最后一个字符串:然后对它应用一个小的解密,但我似乎在第一行之后得到了一个无限循环的名称。
do
{
if(sscanf(line,"%*[^:]:%19s",s)==1)
{
for(i = 0; i < slen; i++) /*encrypting firstname*/
{
slen = strlen(s);
s[i] = (char)((s[i] - 'a' - 4) % 26 + 'a');
if(s == '\0')
{
break;
}
}
printf("%s",s);
slen = strlen(s);
slen--;
}
}while(slen > 0);
答案 0 :(得分:1)
您可以使用sscanf
功能 -
char s[20];
if(sscanf(line,"%*[^:]:%19s",s)==1){ //check return of sscanf
/* %*[^:] will read string till ':' and discard it */
printf("%s",s);
}
这会将您想要的字符串存储在s
。
注意 - 当您显示相关内容时,您文件中的数据应该是格式。
如果您想要数据甚至是外部循环,那么请使用2-d char
数组。当您从文件中读取新数据时,增加循环中数组的索引。
在计算字符串长度之前,请勿使用未初始化的变量slen
。您可以将代码重写为 -
int i=0;
if(sscanf(line,"%*[^:]:%19s",s)==1)
{
slen = strlen(s);
while(i<slen)/*encrypting firstname*/
{
//slen = strlen(s);
s[i] = (char)((s[i] - 'a' - 4) % 26 + 'a');
if(s == '\0')
{
break;
}
i++;
}
printf("%s",s);
slen--;
}