Arrays 从多个部分字符串组合后无法打印整个字符串

Arrays 从多个部分字符串组合后无法打印整个字符串,arrays,c,Arrays,C,我的代码无法打印全名,只是打印出了第一个名字。我是这方面的新手。这是我的输出: 这是密码 #include <stdio.h> int main () { int i, j, k; char fName[15], mName[15], lName[15], name[45]; printf ("\nEnter the First name: "); scanf ("%s", fName);

我的代码无法打印全名,只是打印出了第一个名字。我是这方面的新手。这是我的输出:

这是密码

#include <stdio.h>

int main ()
{
    int i, j, k;
    char fName[15], mName[15], lName[15], name[45];
    
    printf ("\nEnter the First name: ");
    scanf ("%s", fName);
    printf ("\nEnter the Middle name: ");
    scanf ("%s", mName);
    printf ("\nEnter the Last name: ");
    scanf ("%s", lName);

    for (i = 0; i < 15; i++) {
        name[i] = fName[i];
        if (fName[i] == '\0') {
            i++;
            break;
        }
    }

    for (j = 0; j < 15; j++) {
        name[i + j] = mName[j];
        if (mName[j] == '\0') {
            j++;
            break;
        }
    }
    for (k = 0; k < 15; k++) {
        name[i + j + k] = lName[k];
        if (lName[k] == '\0') {
            k++;
            break;
        }
    }

    printf ("\nFull name is %s.", name);

    return 0;
}
#包括
int main()
{
int i,j,k;
char fName[15],mName[15],lName[15],name[45];
printf(“\n输入名字:”);
scanf(“%s”,fName);
printf(“\n输入中间名:”);
scanf(“%s”,mName);
printf(“\n输入姓氏:”);
scanf(“%s”,lName);
对于(i=0;i<15;i++){
名称[i]=fName[i];
如果(fName[i]='\0'){
i++;
打破
}
}
对于(j=0;j<15;j++){
名称[i+j]=mName[j];
如果(mName[j]=='\0'){
j++;
打破
}
}
对于(k=0;k<15;k++){
名称[i+j+k]=lName[k];
如果(lName[k]='\0'){
k++;
打破
}
}
printf(“\n全名为%s.”,名称);
返回0;
}

遇到“\0”字符时中断复制循环。在您的代码中,“\0”被复制到输出,然后被解释为字符串的结尾,在您的例子中,被解释为第一个名称的结尾。但是,对于姓氏,您需要包含
\0
字符

#include <stdio.h>
int main()
{
    int i, j, k;
    char fName[15], mName[15], lName[15], name[45];
    printf("\nEnter the First name: ");
    scanf("%s", fName);
    printf("\nEnter the Middle name: ");
    scanf("%s", mName);
    printf("\nEnter the Last name: ");
    scanf("%s", lName);

    for (i = 0; i < 15; i++)
    {
        if (fName[i] == '\0')
        {
            i++;
            break;
        }
        name[i] = fName[i];
    }

    for (j = 0; j < 15; j++)
    {
        if (mName[j] == '\0')
        {
            j++;
            break;
        }
        
        name[i + j] = mName[j];
    }
    for (k = 0; k < 15; k++)
    {
        name[i + j + k] = lName[k];
        if (lName[k] == '\0')
        {
            k++;
            break;
        }
    }
    
    printf("\nFull name is %s.", name);

    return 0;
}
#包括
int main()
{
int i,j,k;
char fName[15],mName[15],lName[15],name[45];
printf(“\n输入名字:”);
scanf(“%s”,fName);
printf(“\n输入中间名:”);
scanf(“%s”,mName);
printf(“\n输入姓氏:”);
scanf(“%s”,lName);
对于(i=0;i<15;i++)
{
如果(fName[i]='\0')
{
i++;
打破
}
名称[i]=fName[i];
}
对于(j=0;j<15;j++)
{
如果(mName[j]=='\0')
{
j++;
打破
}
名称[i+j]=mName[j];
}
对于(k=0;k<15;k++)
{
名称[i+j+k]=lName[k];
如果(lName[k]='\0')
{
k++;
打破
}
}
printf(“\n全名为%s.”,名称);
返回0;
}

其他人解释了为什么您的程序没有打印全名。Phillip Ngan建议更正,但它将单个名称粘贴在一起,没有空格。要以通常的形式获取全名,只需替换行
i++在您的代码中使用

            name[i++] = ' ';
以及带有

            name[i+j++] = ' ';
当然,您可以将所有的
for
循环替换为

    sprintf(name, "%s %s %s", fName, mName, lName);

当然,你也应该注意David C.Rankin的评论。

在你的代码中,你将每个字符串的空终止符复制到
name
数组中,因此最后的内容是
“Alexander\0Graham\0Bell”
printf
%s
的字符串参数中找到的第一个空字节处停止,因此只输出第一个名称

您应该为源数组和目标数组使用单独的索引,并在名称的三个部分之间设置一个空格

还请注意,您应该告诉
scanf()
在14个字节后停止读取,以避免在过长的用户输入上存储超出数组末尾的字符,并测试返回值以检测无效输入

以下是修改后的版本:

#include <stdio.h>

int main() {
    char fName[15], mName[15], lName[15], name[45];
    int i, j;
    
    printf("\nEnter the First name: ");
    if (scanf("%14s", fName) != 1)
        return 1;
    printf("\nEnter the Middle name: ");
    if (scanf("%14s", mName) != 1)
        return 1;
    printf("\nEnter the Last name: ");
    if (scanf("%14s", lName) != 1)
        return 1;

    i = 0;
    for (j = 0; fName[j] != '\0'; j++) {
        name[i++] = fName[j];
    }
    name[i++] = ' ';
    for (j = 0; mName[j] != '\0'; j++) {
        name[i++] = mName[j];
    }
    name[i++] = ' ';
    for (j = 0; lName[j] != '\0'; j++) {
        name[i++] = lName[j];
    }
    name[i] = '\0';

    printf("\nFull name is %s.", name);
    return 0;
}

您应该在
\0
之前停止,而不是在它之后停止。或者,在追加
\0
后,不要增加
i
,因为printf看到并认为这是字符串的结尾。当使用
scanf()
填充数组时,必须始终提供宽度修饰符以防止写入超出数组结尾,例如
scanf(“%14s”,fName)。否则,将
scanf()。请看,是否不允许使用方便的C标准库函数来处理字符串?作为一般原则,所有新代码在最初的几次迭代中都有缺陷,这就是为什么我们应该使用标准函数的原因,自1982年以来,标准函数就已经将这个阶段抛在了后面;-)。如果可以使用它们,请查找strcpy和strcat。请参阅原始问题下关于在不使用宽度修饰符的情况下使用
“%s”
的注释。您的注释是正确的:不应复制空字节,但您的代码仍会递增
i
j
k
而保持
name
的相应元素未初始化,这会导致未定义的行为。
#include <stdio.h>
#include <string.h>

int main() {
    char fName[15], mName[15], lName[15], name[45];
    
    printf("\nEnter the First name: ");
    if (scanf("%14s", fName) != 1)
        return 1;
    printf("\nEnter the Middle name: ");
    if (scanf("%14s", mName) != 1)
        return 1;
    printf("\nEnter the Last name: ");
    if (scanf("%14s", lName) != 1)
        return 1;

    strcpy(name, fName);
    strcat(name, " ");
    strcat(name, mName);
    strcat(name, " ");
    strcat(name, lName);

    printf("\nFull name is %s.", name);
    return 0;
}
#include <stdio.h>

int main() {
    char fName[15], mName[15], lName[15], name[45];
    
    printf("\nEnter the First name: ");
    if (scanf("%14s", fName) != 1)
        return 1;
    printf("\nEnter the Middle name: ");
    if (scanf("%14s", mName) != 1)
        return 1;
    printf("\nEnter the Last name: ");
    if (scanf("%14s", lName) != 1)
        return 1;

    snprintf(name, sizeof name, "%s %s %s", fName, mName, lName);

    printf("\nFull name is %s.", name);
    return 0;
}