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

时间:2015-02-11 19:48:02

标签: c string concatenation

我需要编写一个简单的程序(没有花哨的指针,没有库函数。它用于教育目的)从用户读取第一个和第二个名称,并将它们打印在一个由空格分隔的单行中。我没有得到结果,我不确定原因:

# 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] != '\0'; cat[i++] = fname[i++])
        ;

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

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

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

3 个答案:

答案 0 :(得分:1)

你有几个问题。首先,由于cat必须足够大才能将前两个字符串保持在它们之间,因此应将其声明为cat[32] - 15个字符的名字,15姓氏,1个空格和1个尾随空字节的字符。

你把单词之间的空格放在错误的地方。第一个循环离开i,保留cat中的下一个位置,因此它应该是:

cat[i] = ' ';

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

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] != '\0'; 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] != '\0'; 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;
}

答案 1 :(得分: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);

答案 2 :(得分:0)

观看您使用的索引:

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

尝试增加&#39; i&#39;和&#39; j&#39;在你的循环结束时:

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