我试图在我的程序中使用size_t找到一个字符串的长度,然后使用该整数来确定我的程序循环执行字母shuffle的次数(+6到一个字母,所以当保存时a = g)。
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stddef.h>
int main(void)
{
FILE *file;
int i, fnlen, lnlen;
char firstname[15], lastname[15], *ptr;
fflush(stdin);
printf("Please enter the first name of the player:");
if(fgets(firstname, sizeof(firstname), stdin) != NULL)
{
size_t fnlen = strlen(firstname);
}
printf("Please enter the last name of the player:");
if(fgets(lastname, sizeof(lastname), stdin) != NULL)
{
size_t lnlen = strlen(lastname);
}
for(i = 0; i < lnlen; i++)
{
lastname[i] = (char)((lastname[i] - 'a' + 4) % 26 + 'a');
}
for(i = 0; i < fnlen; i++)
{
firstname[i] = (char)((firstname[i] - 'a' + 4) % 26 + 'a');
}
file = fopen("text.txt", "wt");
if(!file)
{
printf("File is not able to open.");
exit(1);
}
fprintf(file, "Firstname is : %s\n""Lastname is: %s\n", firstname, lastname)
当我打开保存到的文件时,第一个名称被正确洗牌,但是当我输入5时有8个字符,并且正确保存了姓氏,但字母没有洗牌,它们只输出我输入的内容fgets
答案 0 :(得分:1)
我看到代码的主要问题是你在if语句中声明了size_t长度变量。这样,您对它们所做的任何更改都不会反映在if语句之外。我很惊讶你的代码编译给了这个(除非你还宣称另一个size_t len和fnlen高于你向我们展示的内容,在这种情况下通过在if语句中重新声明它你正在影响它。)我会像这样重写代码。我想你可能已将它们在上面声明并初始化为零。在这种情况下,您在if语句中声明了一个完全不同的变量(具有相同的名称),它没有生效,并且循环中使用的长度变量仍然没有值。
printf("Please enter the first name of the player:");
size_t fnlen = 0; //I declare them once outside of the if
size_t len = 0;
if(fgets(firstname, sizeof(firstname), stdin) != NULL)
{
fnlen = strlen(firstname); //do not redeclare them inside just assign
}
printf("Please enter the last name of the player:");
if(fgets(lastname, sizeof(lastname), stdin) != NULL)
{
len = strlen(lastname);
}
ptr = lastname;
while( *ptr != '\n') ++ptr;
*ptr = '\0';
for(i = 0; i < len; i++)
{
lastname[i] = (char)((lastname[i] - 'a' + 6) % 26 + 'a');
}
for(i = 0; i < fnlen; i++)
{
firstname[i] = (char)((firstname[i] - 'a' + 6) % 26 + 'a');
}