我试着做一个像atoi一样的程序,你在字符串中输入一个数字,然后它把ascii值转换成一个int,为此我做了一个while循环来获取数字的维数,但是每当我尝试在while程序输出之后使用for循环时,不管for是什么
如果我删除for循环,程序可以正常运行,为什么会这样呢?
这是密码
#include <stdio.h>
#include <stdlib.h>
int main() {
int cont = 0, a, array[10];
char *string;
printf("Insert a number: ");
scanf("%s", string);
while (string[cont] != 0) {
printf("%d\t", string[cont] - 48);
array[cont] = string[cont] - 48;
cont++;
}
for (int i = 0; i < 3; i++) {
printf("bruh\n");
}
}
我试着把array [i] x的值乘以10 X次,然后把它相加,我想我应该用一个for来遍历数组中的数字,然后在一个while循环中把它乘以10 X次
2条答案
按热度按时间2wnc66cl1#
string
没有指向有效的内存,因此,尝试使用scanf
扫描到它会使您处于未定义行为的领域。你需要自动地或者动态地为字符数组分配内存。
使用
%1023s
说明符指示最大宽度,以便不会发生缓冲区溢出。还应检查scanf
是否返回1
以指示已成功读取一个值。7vhp5slm2#
你需要一个
value
来累加数字之和,它是a
吗?也在这里
您忘记让
string
指向array
,如因此指针无效。
string
应为char[10]
另一个需要考虑的因素是信号,因为
INT_MAX
是2147483647
,并且有10位数,所以数组大小是可以的,所以在输入字符串中使用9
和最后一个NULL
是安全的,没有上溢或下溢。从-999,999,999到999,999,999所有值都符合int
。请注意,
scanf()
在读取'\n'
之前始终处于缓冲状态,因此您将执行两个循环:一个到'scanf'
中的'\n'
,另一个到while
中的'0'
,你仍然需要过滤字符串中的数字。请参阅此备选方案:
差异
+
或-