即使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);
}
答案 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);
}
待办事项:此代码不允许使用'-'
或'+'
之类的前导符号