gpt4 book ai didi

c - 为什么第一个 printf 不起作用,而其他两个使用相同的结构?

转载 作者:太空宇宙 更新时间:2023-11-04 03:18:19 25 4
gpt4 key购买 nike

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

int main (void)
{
struct Numbers
{
char cell[21];
char home[21];
char business[21];
};

// Declare variables here:

struct Numbers numbers;
char prompt;

printf("Do you want to enter a cell phone number? (y or n): ");
scanf("%s", &prompt);
if (prompt == 'y' || prompt == 'Y')
{
printf("Please enter the contact's cell phone number: ");
scanf("%s", numbers.cell);
}

printf("Do you want to enter a home phone number? (y or n): ");
scanf("%s", &prompt);
if (prompt == 'y' || prompt == 'Y')
{
printf("Please enter the contact's home phone number: ");
scanf("%s", numbers.home);
}

printf("Do you want to enter a business phone number? (y or n): ");
scanf("%s", &prompt);
if (prompt == 'y' || prompt == 'Y')
{
printf("Please enter the contact's business phone number: ");
scanf("%s", numbers.business);
}

printf("\n");

printf("Phone Numbers:");
printf("\n");
printf("Cell phone number: %s", numbers.cell);
printf("\n");
printf("Home phone number: %s", numbers.home);
printf("\n");
printf("Business phone number: %s", numbers.business);
printf("\n");

printf("Structure test for Name, Address, and Numbers Done!");

return 0;
}

输出结果如下: enter image description here

家里电话和公司电话工作时,手机号码为空。一旦我错误地输入了 y->12345->y->12345->y12345->12345,那么所有 3 个数字都显示正确。我找不到问题所在。

错误输入的结果: enter image description here

最佳答案

打印输出的问题来自覆盖结构的第一个成员。

字节序列 {'y', '\0'} 被写入单字节 提示符 后面的内容,这几乎可以肯定是 numbers 的第一个字节。因此,这会将 cell 字段的第一个字符设置为 '\0',使其成为一个空字符串。

如果你想在 scanf("%s", &prompt); 中使用字符串格式 "%s" prompt 必须作为字符串类型。 Char 变量无法保存您的 scanf 读取的字符加上空字符串终止符。

更自然和典型的方法是使用 "%c" 来读取字符。两种方式均有介绍。

注1:%c 转换说明符不会自动跳过任何前导空格,因此如果输入流中有一个杂散的换行符(例如,来自以前的条目),scanf 调用将立即使用它。

解决该问题的一种方法是在格式字符串中的转换说明符之前放置一个空格:

scanf(" %c", &c);

注意 2:通常我们在 main 之前声明结构,以在文件中为它们提供全局范围。

注意 3:此外,如果您将 numbers 声明为局部结构变量,则所有结构成员都是未定义的。如果用户跳过填写数字,您可能会得到该字段的垃圾打印输出。您有义务自己初始化这些成员。

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h>

struct Numbers
{
char cell[21];
char home[21];
char business[21];
};

int main (void)
{
// Declare variables here:

char prompt[10];
char prompt1;

struct Numbers numbers;

numbers.cell[0] = '\0';
numbers.home[0] = '\0';
numbers.business[0] = '\0';

printf("Do you want to enter a cell phone number? (y or n):\n");
scanf(" %c", &prompt1);

if (prompt1 == 'y' || prompt1 == 'Y')
{
printf("Please enter the contact's cell phone number:\n");
scanf("%s", numbers.cell);
}

printf("Do you want to enter a home phone number? (y or n):\n");
scanf(" %c", &prompt1);
if (prompt1 == 'y' || prompt1 == 'Y')
{
printf("Please enter the contact's home phone number:\n");
scanf("%s", numbers.home);
}

printf("Do you want to enter a business phone number? (y or n):\n");
scanf("%s", &prompt);
if (*prompt == 'y' || *prompt == 'Y')
{
printf("Please enter the contact's business phone number:\n");
scanf("%s", numbers.business);
}

printf("\n");

printf("Phone Numbers:");
printf("\n");
printf("Cell phone number: %s", numbers.cell);
printf("\n");
printf("Home phone number: %s", numbers.home);
printf("\n");
printf("Business phone number: %s", numbers.business);
printf("\n");

printf("Structure test for Name, Address, and Numbers Done!");

return 0;
}

输出:

Do you want to enter a cell phone number? (y or n):                                                                                           
y
Please enter the contact's cell phone number:
123
Do you want to enter a home phone number? (y or n):
y
Please enter the contact's home phone number:
456
Do you want to enter a business phone number? (y or n):
y
Please enter the contact's business phone number:
789

Phone Numbers:
Cell phone number: 123
Home phone number: 456
Business phone number: 789
Structure test for Name, Address, and Numbers Done!

关于c - 为什么第一个 printf 不起作用,而其他两个使用相同的结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49208593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com