我目前正在尝试制作我的程序,以便它的文件名是人名+他们的出生日期。我遇到的问题是只将名称复制到数组中,因为我目前有一个循环,它循环了 15 次。我不确定我如何能够限制程序只循环用户输入的次数,或者当程序到达数组中用户输入字符的末尾时停止程序。
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
char firstname[16], lastname[15], filename[23];
int dob, i;
printf("Please enter the first name of the player:");
fgets(firstname, 15, stdin);
printf("Please enter the date of birth of the player(ddmmyy): ");
scanf("%6d", &dob);
for(i = 0; i < 15; i++)
{
strncpy(filename[i], firstname[i], 15);
if(lastname[i] == '\0');
{
break;
}
}
for(i = 0; i < 6; i++)
{
strncpy(filename[i+14], dob, 6);
if(dob[i] == '\0');
{
break;
}
}
printf("%s", filename);
}
最佳答案
这是您的代码的一个稍微简单的版本:
#include <stdio.h>
#include <conio.h>
#include <string.h>
int main()
{
char firstname[16], lastname[15], filename[23];
int dob, i;
char *ptr;
printf("Please enter the first name of the player:");
fgets(firstname, sizeof(firstname), stdin);
printf("Please enter the date of birth of the player(ddmmyy): ");
scanf("%6d", &dob);
ptr = firstname;
while( *ptr != '\n' ) ++ptr;
*ptr = '\0';
sprintf(filename, "%s%06d", firstname, dob);
printf("%s", filename);
}
注意:sprintf()
非常强大,可以在复制firstname
的同时为您格式化dob
。 (注意:sprintf()
很可能会导致缓冲区溢出,如果你不是特别小心的话。Visual studio 有一个更安全的版本 sprintf_s()
)
作为替代方案,如果您不想调用任何函数而宁愿手动复制字符串,您可以执行以下操作:
int dob, i, n;
// ...
i = 0;
while( firstname[i] != '\n' && firstname[i] != '\0' )
{
filename[i] = firstname[i];
++i;
}
for( n=100000; n>=1; n /= 10 )
{
int digit = (dob / n) % 10;
filename[i] = (char)('0' + digit);
++i;
}
if( i >= sizeof(filename) )
return -1;
filename[i] = '\0';
关于将多个数组复制到一个数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34160295/