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