c中char数组中的空格

时间:2015-02-26 19:04:53

标签: c arrays string char

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

这是我的代码

#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

4 个答案:

答案 0 :(得分:4)

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

使用:

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] = '\0';  // add this
printf("%s",full_name);

答案 1 :(得分:1)

在没有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;
}

答案 2 :(得分:0)

更改

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

full_name[i++]=' ';

您的for循环条件也不太正确:

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

答案 3 :(得分:0)

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

此外,您需要将full_name初始化为全零,或者在复制完姓名后将其终止。

此外,您阅读字符串的方式很危险。你应该限制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.