将多个阵列复制到单个阵列中

时间:2015-12-08 15:55:36

标签: c arrays

我目前正在尝试制作我的程序,使其文件名为人名+出生日期。我遇到的问题是只将名称复制到数组中,因为我目前有一个循环,它循环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);
}

2 个答案:

答案 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';