Getchar仅一次获取char

时间:2019-01-05 01:02:46

标签: c

即使while为真,getchar也会迭代一次。我在getchar条件和正文中使用while尝试了我的代码,但这不起作用。

int main() {
    char* s = malloc(sizeof(char)) /*= get_string("Write number: ")*/;
    char a[MAXN];
    int i = 0;
    do {
        a[i] = getchar();
        *s++ = a[i];
        i++;
    } while (isdigit(a[i-1]) && a[i-1] != EOF && a[i-1] != '\n' && i< MAXN);
    /*while (isdigit(*s++=getchar()))
        i++;*/
    *s = '\0';
    s -= i;
    long n = conversion(s);
    printf("\n%lu\n", n);
}

2 个答案:

答案 0 :(得分:1)

正如其他人指出的那样,s并没有太多用处,因为a可以传递给conversion。而且,malloc的{​​{1}}仅分配一个字节。

在进行循环测试之前,您要先递增s ,所以您必须在那里使用i。同样,循环以i-1太大而结束。

即使对于您的原始代码,执行i并将int chr = getchar(); a[i] = chr;替换为a[i-1]也可以使事情简化。

更好的是,通过重组使用chr而不是for循环,我们可以为每个转义条件添加更多注释,而不是更大的单个条件表达式。

do/while

答案 1 :(得分:0)

代码没有为malloc(sizeof(char))分配足够的内存,因为该内存只有1个字节。

当代码尝试将第二个char保存到s时,可能会发生不好的事情:未定义的行为(UB)。

无论如何,都不需要分配。


代替形成合理的固定大小的缓冲区并在其中存储字符/数字。

// The max digits in a `long` is about log10(LONG_MAX) + a few
// The number of [bits in an `long`]/3 is about log10(INT_MAX)
#define LONG_DEC_SZ (CHAR_BIT*sizeof(long)/3 + 3)

int main(void)  {
  char a[LONG_DEC_SZ * 2]; // lets go for 2x to allow some leading zeros

  int i = 0;
  int ch; // `getchar()` typically returns 257 different values, use `int`

  // As long as there is room and code is reading digits ...
  while (i < sizeof a && isdigit((ch = getchar())) ) {
    a[i++] = ch;
  }
  a[i++] = '\0';
  long n = conversion(a);
  printf("\n%ld\n", n);
}

待办事项:此代码不允许使用'-''+'之类的前导符号