如何将一行整数分成数组?

时间:2018-06-10 09:14:31

标签: c arrays fgets

如果用户输入:

  

1 2 3 4 5 0

如何将其转换为具有5个元素的数组(0整数表示终止)?此外,在代码中我需要确保它最多可以工作500个整数。

我不知道如何继续。我正在考虑使用获取并将其保存到已分配的空间中:

char *ptr;
ptr = malloc(sizeof(char) * 1000);
fgets(ptr, sizeof(char)*1000, stdin);

这里的问题是我不知道如何分配空格,因为每个数字都将保存为一个字符,每个整数可能有不同的位数。

之后,我不知道如何将其拆分为数组。

有人可以告诉我如何继续或者我的方法不好吗?

我知道我没有做过很多,但我真的很困惑。我查了gets()fgets()scanf()fscanf(),但仍不确定。

谢谢!

3 个答案:

答案 0 :(得分:1)

您可以使用组合为fgets()strtok()的字符数组。

首先声明一个字符数组str并设置一个标志变量。

char str[100];
int flag=1;
找到输入flag时,{p> 0可能会0

只要flag 1 fgets()使用fgets()读取输入行(提供while(flag==1 && fgets(str, sizeof(str), stdin)!=NULL) { ..... ..... } 成功),就像在

中一样
str

现在在此循环中,使用strtok()使用空格和\n作为分隔符来标记\n中的字符串。 fgets()被定义为分隔符,因为\n也会将str的{​​{1}}读入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()生成的标记转换为整数。我使用def start(url): password = False while not password: try: checkpass = requests.get('https://{}.com'.format(url)) checkpass.raise_for_status() except requests.exceptions.HTTPError as errh: log("Http Error:", errh) continue except requests.exceptions.ConnectionError as errc: log("Error Connecting:", errc) continue except requests.exceptions.Timeout as errt: log("Timeout Error:", errt) continue except requests.exceptions.RequestException as err: log("OOps: Something Else", err) continue if ('password' in checkpass.url): print(Fore.YELLOW + 'Password page is live on %s' % url) password = True else: randomtime = random.randint(6, 12) print('Nothing new on %s, retrying in %d secs' % (url, randomtime)) time.sleep(randomtime) 来简洁,但这不是最好的方法。 strtol()可能是个好主意。请参阅here

答案 1 :(得分:1)

您可以使用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;
}

答案 2 :(得分:-1)

我会建议这样的事情

#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获得的字符串。如果您愿意,我可以稍后编辑此帖子并包含此变体。