如何使用scanf读取以空格分隔的数字

Posted

技术标签:

【中文标题】如何使用scanf读取以空格分隔的数字【英文标题】:How to read numbers separated by space using scanf 【发布时间】:2012-05-12 15:32:48 【问题描述】:

我想使用scanf() 函数读取由空格分隔的数字(整数类型)。 我已阅读以下内容:

C, reading multiple numbers from single input line (scanf?) how to read scanf with spaces

对我帮助不大。

如何读取以空格为分隔符的数字。例如我有以下数字作为输入 2 5 7 4 3 8 18 现在我想将它们存储在不同的变量中。 请帮忙。

【问题讨论】:

link 。这会有帮助吗? 那是用来读取空格的。我想读取以空格分隔的数字。 是动态长度的字符串还是一组固定的数字? 它用于固定的数字集。 那为什么还要麻烦这些乱码。关注Answer。那就是你想要的。它不适合你?。 【参考方案1】:

我认为默认值是 scanf 使用空格/回车读取的。如果你打印整数,你可以在 '%d' 之间提供空格。其他情况也一样。

scanf("%d %d %d", &var1, &var2, &var3);

同样,如果您想读取逗号分隔值,请使用:

scanf("%d,%d,%d", &var1, &var2, &var3);

【讨论】:

scanf 使用大多数 % 指令忽略空格,因此您通常不希望格式字符串中有空格。因此,对于第一种情况(空格分隔的整数),您需要 scanf("%d%d%d", &var, &var2, &var3); 额外的空格实际上不会在这里造成任何伤害(它们没有效果),但在其他情况下,除非您需要它们,否则您不需要它们。跨度> 这里为什么要使用&var1(var1是int类型的变量吗?)?这不只是 var1 内存地址的“标签”吗? @YoTengoUnLCD 是的。 scanf 函数需要该地址才能覆盖该地址处的值。这适用于ints 和您可能与scanf 一起使用的任何其他类型。这里没有什么神奇的,如果你有任何函数需要覆盖一个值,那个函数需要地址,而不是值本身。【参考方案2】:

scanf 使用任何空格作为分隔符,因此如果您只说scanf("%d", &var),它将跳过任何空格,然后读取一个整数(直到下一个非数字的数字),仅此而已。

请注意,空格是任何空格——空格、制表符、换行符或回车符。其中任何一个都是空格,其中任何一个或多个都将用于分隔连续的整数。

【讨论】:

【参考方案3】:
int main()

char string[200];
int g,a,i,G[20],A[20],met;

gets(string);
g=convert_input(G,string);

for(i=0;i<=g;i++)
    printf("\n%d>>%d",i,G[i]);
return 0;


int convert_input(int K[],char string[200])

int j=0,i=0,temp=0;
while(string[i]!='\0')

    temp=0;
    while(string[i]!=' ' && string[i]!='\0')
        temp=temp*10 + (string[i++]-'0') ;
    if(string[i]==' ')
        i++;
    K[j++]=temp;

return j-1;

【讨论】:

这种描述会不会有帮助?【参考方案4】:

应该像使用接收变量列表一样简单:

scanf("%i %i %i", &amp;var1, &amp;var2, &amp;var3);

【讨论】:

这里的fp是什么?上述情况下分隔符为\n,我想用空格作为分隔符。 对不起,我删除了它,因为它在这个例子中不相关。您不需要在某处指定空格分隔符,它隐含在您的格式字符串中。 永远不要使用%i.. 除非你知道它的作用。【参考方案5】:

使用此解决方案,可以读取正整数和负整数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFFER_SIZE 50


int convert_input (int * v, char * buffer) 
    int len = 0, i = 0, temp = 0, positive_or_negative_one = 1;
    while(buffer[i]!='\0') 
        temp = 0;

        if (buffer[i] == '-')
            positive_or_negative_one = -1;
            i++;
         else 
            while(buffer[i] != ' ' && buffer[i] != '\0')
                temp = temp*10 + (buffer[i++]-'0');

            if(buffer[i]==' ')
                i++;
            v[len++] = temp * positive_or_negative_one;
            positive_or_negative_one = 1;
        
    
    return len;


int main(int argc, char const *argv[]) 
    int *a = NULL;
    int count_a, len=0;
    char buffer[BUFFER_SIZE];

    printf("Input numbers here: ");
    gets(buffer);
    for (int i = 0; i < strlen(buffer); i++) 
        if (buffer[i] == ' ')
            len+=1;
        
    

    a = (int*) malloc(sizeof(int) * len + 1);
    count_a = convert_input(a, buffer);

    for (int i = 0; i < count_a; i++) 
        printf("%d\n", a[i]);
    

    free(a);

    return 0;

输入输出示例:

Input numbers here: 1 2 3 -4 10
1
2
3
-4
10

【讨论】:

以上是关于如何使用scanf读取以空格分隔的数字的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scanf 从用户输入中获取字符串( char * ),由双引号分隔并包含空格 [关闭]

C语言 一行数据 空格分隔

如何使用Python 3中的readlines读取由空格分隔的整数输入文件?

如何在c#中对以空格分隔的数字进行舍入?

如何在 C++ 中读取由空格分隔的字符串? [关闭]

scanfgetsgetcharcincin.getcin.getlinegetline总结