在不使用库函数的情况下在 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;
}
我需要编写一个简单的程序(没有花哨的指针东西,没有库函数。它用于教育目的)从用户那里读取名字和第二个名字并将它们打印在由 [= 分隔的一行中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;
}