所以我试图将已经从键盘读取的int值存储到C中的整数数组中。示例用户输入:
8 99 5 7 8
变量声明:
int k;
int size;
char buf[100];
以上是我的缓冲区和数组的其他变量。 以下是将ints读入缓冲区。
printf("Please enter in the numbers for the array:\n");
fgets(buf, 100, stdin);
buf[strlen(buf) - 1] = '\0';
size = (strlen(buf)/2)+1;
int *array = (int *)malloc(sizeof(int)*size);
这样就可以正确分配我的数组。
int i, j;
for(i = 0, j = 0; i < size; i++, j = j+2)
{
array[i] = buf[j] - '0';
}
上面的代码实际上有效,但不适用于有两位数的数字,仅适用于低于10且高于0的数字。如何修复我的代码以便正确读取整数?
我试图用for
进行sscanf
循环,但这只会导致一个数组只包含在所有元素中输入的第一个整数。
答案 0 :(得分:1)
如何修复我的代码以便正确读取整数?
使用strtol()
按照@EOF的建议解析字符串。它提供了一个结束指针,它停止了。
long *array = malloc(sizeof *array * size);
if (array == NULL) Handle_OutOfMemory();
char *p = buf;
size_t i;
for(i = 0; i<size; i++) {
// Cope with white space with nothing after it.
while (isspace((unsigned char) *p)) p++;
if (*p == '\0') break;
char *end;
errno = 0;
long num = strtol(p, &end, 10);
// If no conversion or out of range ...
if (p == end || errno) {
fprintf(stderr, "trouble converting `%s` into an integer.\n", p);
break;
}
array[i] = num;
p = end;
}
// Use array[0] ... array[i-1]
答案 1 :(得分:1)
您可以使用sscanf
或strtol
从输入字符串中提取数字。在任何一种情况下,每次通话都会给你三条信息:
使用sscanf
,返回值表示成功或失败。对于示例代码中的sscanf
(见下文),成功时返回值为1,其他任何内容都是失败。如果成功,则将该数字的值放在指定的地址,例如,示例代码中的&temp
。
这是一个棘手的部分:你需要数组中的位置来开始搜索下一个数字。 sscanf
转换为%n
进行了特殊转换。 %n
的输出是执行转换时消耗的字符数。
在下面的示例代码中,我使用最初指向输入字符串开头的指针ptr
。在每次循环传递时,%n
中使用sscanf
来更新变量n
,该变量指示转换当前数字所消耗的字符数。通过在n
循环中将ptr
添加到for
,指针会前进到下一个数字。
int *array = malloc(sizeof(int) * size);
int n = 0;
int i = 0;
for ( char *ptr = buf; *ptr; ptr += n )
{
int temp;
if ( sscanf(ptr, "%d %n", &temp, &n) != 1 ) {
// error: not a number
break;
}
array[i++] = temp;
}
正如@chux在评论中所提到的,在格式字符串"%d %n"
中添加空格将在每个数字后面消耗尾随空格并相应地设置n
的值。因此,如果输入行仅包含数字,则当for
语句检测到*ptr
已到达NUL终止符时,循环将结束。但是如果输入包含非数字,那么当break
失败时,循环将sscanf
。这可用于错误检查。
答案 2 :(得分:0)
如果数字来自stdin
,则需要更多努力以字符串形式读取它们并自行转换它们,而不是让标准库为您完成。在这里,我已经硬编码了最多100个整数。循环结束后,i
将表示array
中有效整数的数量。
int array[100] = {0};
int i = 0;
while (i < 100)
{
int input;
int scanresult = scanf("%d", &input);
if (scanresult == 1)
{
// 1 item was successfully scanned
array[i] = input;
i++;
}
else
{
// either EOF was reached or the input was not scannable as an integer
}
}
答案 3 :(得分:-1)
unsigned int len=0,tmp=0;
char j,isnumber=0;
for(char*i=buf;j=*i;i++)
{
if(j>='0'&&j<='9')
{
tmp=tmp*10+j-'0';
isnumber=1;
}
else
{
if(isnumber)
array[len++]=tmp;
tmp=0;
isnumber=0;
}
}
另外,你不需要
buf[strlen(buf) - 1] = '\0';
size = (strlen(buf)/2)+1;