如果用户输入:
1 2 3 4 5 0
如何将其转换为具有5个元素的数组(0整数表示终止)?此外,在代码中我需要确保它最多可以工作500个整数。
我不知道如何继续。我正在考虑使用gets并将其保存到已分配的空间中:
char *ptr;
ptr = malloc(sizeof(char) * 1000);
fgets(ptr, sizeof(char)*1000, stdin);
这里的问题是我不知道如何分配空格,因为每个数字将被保存为一个字符,每个整数可能有不同的位数。
之后,我不知道如何将其拆分为数组。
有人可以告诉我如何继续或者我的方法不好吗?
我知道我没有做太多但我真的很困惑。我查了gets()
,fgets()
,scanf()
,fscanf()
,我仍然不确定。
谢谢!
您可以使用sscanf()
或strtol()
解析用户输入的行:
#include <stdio.h>
int main() {
char buf[256];
int array[5];
if (fgets(buf, sizeof buf, stdin)) {
if (sscanf(buf, "%d%d%d%d%d", &array[0], &array[1], &array[2], &array[3], &array[4]) == 5) {
// array has the 5 numbers input by the user.
printf("%d %d %d %d %d\n", array[0], array[1], array[2], array[3], array[4]);
}
}
return 0;
}
对于最多可以处理500个数字的通用代码,您可以在循环中使用scanf()
:
#include <stdio.h>
int main() {
int array[500];
int i, n;
for (n = 0; n < 500; n++) {
if (scanf("%d", &array[n]) != 1) {
printf("invalid input\n");
return 1;
}
if (array[n] == 0) {
// 0 indicates termination
break;
}
}
// the array has n valid non-zero numbers
printf("The numbers are:\n");
for (i = 0; i < n; i++) {
printf(" %d\n", array[i]);
}
return 0;
}
您可以使用包含fgets()
和strtok()
组合的字符数组。
首先声明一个字符数组str
并设置一个标志变量。
char str[100];
int flag=1;
当输入flag
时,0
可能会成为0
。
只要flag
是1
使用fgets()
读取输入线(如果fgets()
成功),如
while(flag==1 && fgets(str, sizeof(str), stdin)!=NULL)
{
.....
.....
}
现在在这个循环中,使用strtok()
来标记str
中的字符串,使用空格和\n
作为分隔符。 \n
是一个分界符,因为fgets()
也会在\n
的尾随中读到str
。
for(ptr=strtok(str, " \n"); ptr!=NULL; ptr=strtok(NULL, " \n"))
{
n=atoi(ptr);
if(n==0)
{
flag=0;
break;
}
printf("\n%d", n);
}
将strtok()
生成的标记转换为整数。我使用atoi()
简洁,但它不是最好的方法。 strtol()
可能是一个好主意。见here。
我会建议这样的事情
#include "rlutil.h" //a good library similar to conio.h or it's Linux equivalent but cross-platform. You have to include it manually and download it at github.
int i = 0;
int num = 1;
char input;
int array[255];
for (i = 0; num = 0; i++)
{
input = getchar();
num = input - '0';
array[i] = num;
printf("%i ", num);
}
只需注意数组的大小。
此外,你可以使用strtok解析你用fgets获得的字符串。如果您愿意,我可以稍后编辑此帖子并包含此变体。