该指令希望我读取并存储用户输入到适当的Name成员中的C字符串值。
代码
struct Name {
char firstName[31];
char middleInitial[7];
char lastName[36];
};
struct Name coolname=;
printf("Please enter the contact's first name: ");
scanf("%31s[^\n]", coolname.firstName);
两个问题:
答案 0 :(得分:1)
's'
:scanf("%31s[^\n]", coolname.firstName);
尝试读取最多不包含31个字符的空格,然后读取 [, ^ ,任何空格,] 。
当然,不使用's'
的话要好得多:scanf("%31[^\n]"...
,因为它将尝试读取多达31个非'\n'
的字符。
但是,这不会占用结尾的'\n'
。
建议使用fgets()
阅读所有用户输入。也许作为辅助功能。
int read_line(const char *prompt, char *dest, size_t n) {
fputs(prompt, stdout);
fflush(stdout);
dest[0] = '\0';
char buf[n*2 + 2];
if (fgets(buf, sizeof buf, stdin) == NULL) return EOF;
size_t len = strlen(buf);
if (len > 0 && buf[len - 1] == '\n') { // lop off potential \n
buf[--len] = '\0';
}
if (len >= n) { // maybe add a `len == 0` test
return 0; // indicate invalid input,
}
strcpy(dest, buf);
return 1;
}
现在使用助手功能
if (read_line("Please enter the contact's first name: ", coolname.firstName, sizeof coolname.firstName) == 1) {
// Oh happy day, got first name
}
if (read_line("Please enter the contact's middle name: ", coolname.middleInitial, sizeof coolname.middleInitial) != 1)) {
// Oh happy day, got middle name
}
if (read_line("Please enter the contact's last name: ", coolname.lastName, sizeof coolname.lastName) != 1)) {
// Oh happy day, got last name
}