c中char数组中的空格

spaces in char array in c

如何在数组中的两个单词之间添加 space,我从用户那里收到两个单词,他的名字,他的姓氏,我需要它来将两个数组存储在一个数组中,它们之间是 space

这是我的代码

#include <stdio.h>
int main()
{
    char first_name[15], last_name[15] ,full_name[32];
    int i=0,i2,first_name_length,last_name_length;
    printf("enter your first name\n");
    first_name_length = scanf("%s",first_name);
    printf("enter your last name\n");
    last_name_length = scanf("%s",last_name);
    for(i2 = 0;i2 < first_name_length;i2++){
        full_name[i] = first_name[i2];
        i++;
    }
    full_name[i++]=' ';
    for(i2 = 0;i2 < last_name_length;i2++){
        full_name[i] = last_name[i2];
        i++;
    }
    printf("%s",full_name);
    return 0;
}

在两个 scanf 中输入 "name" 值时的输出:

n n

应该是:

name name

编辑:

#include <stdio.h>
int main()
{
    char first_name[15], last_name[15] ,full_name[32];
    int i=0,i2;
    printf("enter your first name\n");
    scanf("%14s",first_name);
    printf("enter your last name\n");
    scanf("%14s",last_name);
    for(i2 = 0;first_name[i2];i2++){
        full_name[i] = first_name[i2];
        i++;
    }
    full_name[i++]=' ';
    for(i2 = 0;last_name[i2];i2++){
        full_name[i] = last_name[i2];
        i++;
    }
    printf("%s",full_name);
    return 0;
}

在第一个 scanf 中输入 "tom" 值并在第二个 scanf 中输入 "fox" 值时的输出:

tom fox↓@

应该是:

tom fox

改变

i++;
full_name[i]=' ';

full_name[i++]=' ';

你的for循环条件也不对:

for(i2 = 0;i2 < first_name_length;i2++){

在没有 sprintf 函数和指针的情况下重写

#include <stdio.h>
int main()
{
    char first_name[15], last_name[15] ,full_name[32];
    int src, dest;
    printf("enter your first name\n");
    scanf("%s",first_name);
    printf("enter your last name\n");
    scanf("%s",last_name);

    dest = 0;
    src = 0;
    while (first_name[src] != 0) full_name[dest++] = first_name[src++];
    full_name[dest++] = ' ';
    src = 0;
    while (last_name[src] != 0) full_name[dest++] = last_name[src++];
    full_name[dest] = 0
    printf("%s",full_name);
    return 0;
}

scanf() 中的 return 值是成功扫描的字段数,而不是某些字符串的长度。

使用:

if (1 != scanf("%14s",first_name)) Handle_EOF_orNoInput();
first_name_length = strlen(first_name);`

last_name

也一样

[编辑]

由于OP不想引入新函数(甚至strlen()),所以使用"%n求长度。 "%n记录解析位置

if (1 != scanf("%14s%n",first_name, &first_name_length)) Handle_EOF_orNoInput();

或者用困难的方法求长度

if (1 != scanf("%14s",first_name)) Handle_EOF_orNoInput();
for (first_name_length = 0; first_name[first_name_length]; first_name_length++);

[编辑 2]

OP的最新不终止字符串。

full_name[i] = '[=13=]';  // add this
printf("%s",full_name);

函数 scanf() 不会 return 读入的字符数。而是 return 它读入(或错误)的成功匹配数。在您的运行中,scanf() 是 returning 1,因此您只需将第一个字符从名字和姓氏复制到全名。

此外,您需要将 full_name 初始化为全零或 nul 在完成复制姓氏后终止它。

此外,您读取字符串的方式很危险。您应该限制 scanf() 可以读取的字符数,否则它会溢出您的缓冲区并破坏您的内存(或让黑客进入等):

if (1 != scanf("%14s", first_name))
  ; // TODO: handle unexpected input, EOF, error, etc.

甚至更好:

#define STR(x) #x
#define SSTR(x) STR(x)
#define STR_FMT(x) "%" SSTR(x) "s"
#define FIRST_NAME_MAX_LEN 14

...

char first_name[FIRST_NAME_MAX_LEN + 1] = { 0 };

...

if (1 != scanf(STR_FMT(FIRST_NAME_MAX_LEN), first_name))
  ;  // TODO: handle unexpected input, EOF, error, etc.