Arrays 从多个部分字符串组合后无法打印整个字符串
我的代码无法打印全名,只是打印出了第一个名字。我是这方面的新手。这是我的输出: 这是密码Arrays 从多个部分字符串组合后无法打印整个字符串,arrays,c,Arrays,C,我的代码无法打印全名,只是打印出了第一个名字。我是这方面的新手。这是我的输出: 这是密码 #include <stdio.h> int main () { int i, j, k; char fName[15], mName[15], lName[15], name[45]; printf ("\nEnter the First name: "); scanf ("%s", fName);
#include <stdio.h>
int main ()
{
int i, j, k;
char fName[15], mName[15], lName[15], name[45];
printf ("\nEnter the First name: ");
scanf ("%s", fName);
printf ("\nEnter the Middle name: ");
scanf ("%s", mName);
printf ("\nEnter the Last name: ");
scanf ("%s", lName);
for (i = 0; i < 15; i++) {
name[i] = fName[i];
if (fName[i] == '\0') {
i++;
break;
}
}
for (j = 0; j < 15; j++) {
name[i + j] = mName[j];
if (mName[j] == '\0') {
j++;
break;
}
}
for (k = 0; k < 15; k++) {
name[i + j + k] = lName[k];
if (lName[k] == '\0') {
k++;
break;
}
}
printf ("\nFull name is %s.", name);
return 0;
}
#包括
int main()
{
int i,j,k;
char fName[15],mName[15],lName[15],name[45];
printf(“\n输入名字:”);
scanf(“%s”,fName);
printf(“\n输入中间名:”);
scanf(“%s”,mName);
printf(“\n输入姓氏:”);
scanf(“%s”,lName);
对于(i=0;i<15;i++){
名称[i]=fName[i];
如果(fName[i]='\0'){
i++;
打破
}
}
对于(j=0;j<15;j++){
名称[i+j]=mName[j];
如果(mName[j]=='\0'){
j++;
打破
}
}
对于(k=0;k<15;k++){
名称[i+j+k]=lName[k];
如果(lName[k]='\0'){
k++;
打破
}
}
printf(“\n全名为%s.”,名称);
返回0;
}
遇到“\0”字符时中断复制循环。在您的代码中,“\0”被复制到输出,然后被解释为字符串的结尾,在您的例子中,被解释为第一个名称的结尾。但是,对于姓氏,您需要包含\0
字符
#include <stdio.h>
int main()
{
int i, j, k;
char fName[15], mName[15], lName[15], name[45];
printf("\nEnter the First name: ");
scanf("%s", fName);
printf("\nEnter the Middle name: ");
scanf("%s", mName);
printf("\nEnter the Last name: ");
scanf("%s", lName);
for (i = 0; i < 15; i++)
{
if (fName[i] == '\0')
{
i++;
break;
}
name[i] = fName[i];
}
for (j = 0; j < 15; j++)
{
if (mName[j] == '\0')
{
j++;
break;
}
name[i + j] = mName[j];
}
for (k = 0; k < 15; k++)
{
name[i + j + k] = lName[k];
if (lName[k] == '\0')
{
k++;
break;
}
}
printf("\nFull name is %s.", name);
return 0;
}
#包括
int main()
{
int i,j,k;
char fName[15],mName[15],lName[15],name[45];
printf(“\n输入名字:”);
scanf(“%s”,fName);
printf(“\n输入中间名:”);
scanf(“%s”,mName);
printf(“\n输入姓氏:”);
scanf(“%s”,lName);
对于(i=0;i<15;i++)
{
如果(fName[i]='\0')
{
i++;
打破
}
名称[i]=fName[i];
}
对于(j=0;j<15;j++)
{
如果(mName[j]=='\0')
{
j++;
打破
}
名称[i+j]=mName[j];
}
对于(k=0;k<15;k++)
{
名称[i+j+k]=lName[k];
如果(lName[k]='\0')
{
k++;
打破
}
}
printf(“\n全名为%s.”,名称);
返回0;
}
其他人解释了为什么您的程序没有打印全名。Phillip Ngan建议更正,但它将单个名称粘贴在一起,没有空格。要以通常的形式获取全名,只需替换行i++代码>在您的代码中使用
name[i++] = ' ';
以及带有
name[i+j++] = ' ';
当然,您可以将所有的for
循环替换为
sprintf(name, "%s %s %s", fName, mName, lName);
当然,你也应该注意David C.Rankin的评论。在你的代码中,你将每个字符串的空终止符复制到name
数组中,因此最后的内容是“Alexander\0Graham\0Bell”
printf
在%s
的字符串参数中找到的第一个空字节处停止,因此只输出第一个名称
您应该为源数组和目标数组使用单独的索引,并在名称的三个部分之间设置一个空格
还请注意,您应该告诉scanf()
在14个字节后停止读取,以避免在过长的用户输入上存储超出数组末尾的字符,并测试返回值以检测无效输入
以下是修改后的版本:
#include <stdio.h>
int main() {
char fName[15], mName[15], lName[15], name[45];
int i, j;
printf("\nEnter the First name: ");
if (scanf("%14s", fName) != 1)
return 1;
printf("\nEnter the Middle name: ");
if (scanf("%14s", mName) != 1)
return 1;
printf("\nEnter the Last name: ");
if (scanf("%14s", lName) != 1)
return 1;
i = 0;
for (j = 0; fName[j] != '\0'; j++) {
name[i++] = fName[j];
}
name[i++] = ' ';
for (j = 0; mName[j] != '\0'; j++) {
name[i++] = mName[j];
}
name[i++] = ' ';
for (j = 0; lName[j] != '\0'; j++) {
name[i++] = lName[j];
}
name[i] = '\0';
printf("\nFull name is %s.", name);
return 0;
}
您应该在\0
之前停止,而不是在它之后停止。或者,在追加\0
后,不要增加i
,因为printf看到并认为这是字符串的结尾。当使用scanf()
填充数组时,必须始终提供宽度修饰符以防止写入超出数组结尾,例如scanf(“%14s”,fName)代码>。否则,将scanf()。请看,是否不允许使用方便的C标准库函数来处理字符串?作为一般原则,所有新代码在最初的几次迭代中都有缺陷,这就是为什么我们应该使用标准函数的原因,自1982年以来,标准函数就已经将这个阶段抛在了后面;-)。如果可以使用它们,请查找strcpy和strcat。请参阅原始问题下关于在不使用宽度修饰符的情况下使用“%s”
的注释。您的注释是正确的:不应复制空字节,但您的代码仍会递增i
、j
和k
而保持name
的相应元素未初始化,这会导致未定义的行为。
#include <stdio.h>
#include <string.h>
int main() {
char fName[15], mName[15], lName[15], name[45];
printf("\nEnter the First name: ");
if (scanf("%14s", fName) != 1)
return 1;
printf("\nEnter the Middle name: ");
if (scanf("%14s", mName) != 1)
return 1;
printf("\nEnter the Last name: ");
if (scanf("%14s", lName) != 1)
return 1;
strcpy(name, fName);
strcat(name, " ");
strcat(name, mName);
strcat(name, " ");
strcat(name, lName);
printf("\nFull name is %s.", name);
return 0;
}
#include <stdio.h>
int main() {
char fName[15], mName[15], lName[15], name[45];
printf("\nEnter the First name: ");
if (scanf("%14s", fName) != 1)
return 1;
printf("\nEnter the Middle name: ");
if (scanf("%14s", mName) != 1)
return 1;
printf("\nEnter the Last name: ");
if (scanf("%14s", lName) != 1)
return 1;
snprintf(name, sizeof name, "%s %s %s", fName, mName, lName);
printf("\nFull name is %s.", name);
return 0;
}