我目前正在尝试制作我的程序,使其文件名为人名+出生日期。我遇到的问题是只将名称复制到数组中,因为我目前有一个循环,它循环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);
}
答案 0 :(得分:1)
阅读输入后,按@Thecube指示清理它,并确保每个sting为空终止。一旦输入清理,将firstname复制到filename。
你只需要strncpy(filename,firstname,15)就可以了。你不需要循环。
下一步是添加姓氏。使用strncat(filename,lastname,15)
答案 1 :(得分:1)
这是一个稍微简单的代码版本:
#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()
非常强大,可以在复制dob
的同时为您格式化firstname
。 (注意: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';