读取并存储C字符串值

时间:2019-03-09 20:42:09

标签: c string struct

该指令希望我读取并存储用户输入到适当的Name成员中的C字符串值。

代码

struct Name {
    char firstName[31];
    char middleInitial[7];
    char lastName[36];
};



struct Name coolname=enter image description here;

printf("Please enter the contact's first name: ");
scanf("%31s[^\n]", coolname.firstName); 

两个问题:

  • 我是否正确读取并存储了c字符串值?
  • 是否还有其他利弊方法?

1 个答案:

答案 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
}