[关闭]
@ljt12138 2018-10-10T22:16:02.000000Z 字数 858 阅读 757

关于字符串读入的一些问题

字符串


由于Windows和Linux的系统差异,字符串读入可能出现一些奇怪的问题。下面整理一些字符串读入的小技巧。

用空格分隔

当字符串简单的用空格分隔时,直接使用scanf("%s")是不会出现问题的。但要注意当scanf("%c")的时候可能会将换行符读入进去,因此当既有字符串读入又有字符读入的时候,推荐将字符读入写成下面介绍的getc的形式。

读入一行

读入一行可以用,但这个函数非常容易出现奇怪的问题。例如换行符等情况,因此并不建议使用。

已知字符集读入字符/字符串

getchar表示读入下一个字符。如果字符集是已知的,例如小写英文字符,那么可以用下面的读入模板读入字符/字符串。其中isalpha<cctype>中的一个函数,表示英文字符。类似的还有:

更多的函数可以参考 https://en.cppreference.com/w/cpp/header/cctype 。另外,也可以手写一个函数来判断是否是合法字母。

读入字符的模板——忽略前面无用的部分,直到读到一个字符:

  1. int getc()
  2. {
  3. int c;
  4. do c = getchar(); while (!isalpha(c));
  5. return c;
  6. }

读入字符串的模板,同理,一直读到不是字符为止:

  1. void get_string(char str[])
  2. {
  3. int c, len = 0;
  4. do c = getchar(); while (!isalpha(c));
  5. while (isalpha(c)) {
  6. str[len++] = c;
  7. c = getchar();
  8. }
  9. str[len] = '\0';
  10. }

类似的,也可以有非负整数的数字的模板:

  1. int read()
  2. {
  3. int a = 0, c;
  4. do c = getchar(); while (!isdigit(c));
  5. while (isdigit(c)) {
  6. a = a*10+c-'0';
  7. c = getchar();
  8. }
  9. return a;
  10. }

其中判断函数可以按照需求修改。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注