在不使用库函数的情况下在 C 中连接字符串

concatenating strings in C without the use of library functions

我需要编写一个简单的程序(没有花哨的指针东西,没有库函数。它用于教育目的)从用户那里读取名字和第二个名字并将它们打印在由 [= 分隔的一行中13=]。我没有得到结果,我不确定为什么:

# include <stdio.h>
//the program loosely simulates the behaviour of strcpy
main(){
    char fname[16], sname[16], cat[31];
    int i, j;
    printf("Please enter your first name: ");
    scanf("%s", fname);
    printf("Please enter your second name: ");
    scanf("%s", sname);

    for (i=0; fname[i] != '[=10=]'; cat[i++] = fname[i++])
        ;

    cat[i+1] = ' '; //adds a space between the tokens

    for (j=i+1; sname[j] != '[=10=]'; cat[j++] = sname[j++])
        ;   

    printf("The final result is:\n%s", cat);
    return 0;
}

我知道你给自己设定了一个挑战,试图学习如何做一些具体的事情(我看到你正在朝着你的目标前进)。但我总是想记住,有很多方法可以完成工作——尤其是在 C 中。你知道你可以用 printf 来完成,对吧?

char fname[16], sname[16];
int i, j;
printf("Please enter your first name: ");
scanf("%s", fname);
printf("Please enter your second name: ");
scanf("%s", sname);

printf("%s %s\n", fname, sname);

注意你使用的索引:

cat[i++] = fname[i++]cat[j++] = sname[j++]

尝试在循环结束时递增 'i' 和 'j':

for (i=0; fname[i] != '[=10=]'; ++i)
    cat[i] = fname[i];
// ...
for (j=0; sname[j] != '[=10=]';++j)
    cat[j+i+1] = sname[j];

你有几个问题。首先,由于 cat 必须足够大以容纳前两个字符串 a space,因此应声明为 cat[32] --名字的 15 个字符、姓氏的 15 个字符、1 个 space 和 1 个尾随空字节。

您将单词之间的 space 放在了错误的位置。第一个循环左 i 持有 cat 中的下一个位置,所以它应该是:

cat[i] = ' ';

接下来,您在第二个循环中的数组索引不正确。 cat 中的位置是正确的,因为它们是从上一个循环结束的地方开始的。但是你需要从sname中的0开始。所以这个循环应该是:

for (j = i+1, k = 0; sname[k] != 0; cat[j++] = sname[k++])
    ;

最后,将两个字符串拼接后,需要在结果后面追加一个空字节,表示结束。

cat[j] = 0;

另一个问题是在第一个循环中每次递增 i 两次,因为您使用 cat[i++] = fname[i++]。每个 i++ 都会增加变量。您需要将分配与增量分开:

for (i=0; fname[i] != '[=13=]'; i++) {
    cat[i] = fname[i];
}

这是有效的脚本的最终版本:

# include <stdio.h>
//the program loosely simulates the behaviour of strcpy

int main() {
    char fname[16], sname[16], cat[32];
    int i, j, k;
    printf("Please enter your first name: ");
    scanf("%s", fname);
    printf("Please enter your second name: ");
    scanf("%s", sname);

    for (i=0; fname[i] != '[=14=]'; i++) {
        cat[i] = fname[i];
    }

    cat[i] = ' ';

    for (j = i+1, k = 0; sname[k] != 0; cat[j++] = sname[k++]) {
    }

    cat[j] = 0;

    printf("The final result is: %s\n", cat);
    return 0;
}