簡體   English   中英

c中char數組中的空格

[英]spaces in char array in c

如何在數組中的兩個單詞之間添加空格,我從用戶那里收到他的名字的兩個單詞,他的姓氏,我需要用它來將兩個數組存儲在它們之間的一個空格中

這是我的代碼

#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中輸入“名稱”值時的輸出:

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

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);

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

更改

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

full_name[i++]=' ';

您的for循環條件也不完全正確:

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

函數scanf()不返回讀入的字符數。而是返回其讀入(或錯誤)的成功匹配數。 在您的運行中,scanf()返回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.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM