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

33

这是原文的翻译:这个链接指向一个Stack Overflow上的答案,其中提到了如何在Java中使用URL类来进行HTTP GET请求。如果你想要从一个URL获取数据,那么这个答案会对你有所帮助。 - NT_
那是为了读取空格。我想要读取由空格分隔的数字。 - Jainendra
这是针对动态长度字符串还是固定数字集合的? - NT_
这是针对一组固定的数字。 - Jainendra
那么为什么要费心去处理所有混乱的代码呢?按照这个答案去做吧。那就是你想要的了。对你来说不起作用吗? - NT_
作为一个 C 语言新手,我真的很喜欢这个问题。 - Joaquin Iurchuk
5个回答

40

我认为scanf默认使用空格/回车读取值。如果你要打印整数,可以在'%d'之间加入空格。对于其他情况也是如此。

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

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

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

2
scanf在大多数指令中忽略空格,因此您通常不希望在格式字符串中使用空格。因此,在第一种情况(以空格分隔的整数)中,您需要 scanf(“%d%d%d”,&var,&var2,&var3); 这里额外的空格实际上并没有影响任何事情(它们没有效果),但在其他情况下,除非需要,否则您不希望它们存在。 - Chris Dodd
为什么你必须在这里使用&var1(var1是int类型变量吗?)?那不只是var1内存地址的“标签”吗? - YoTengoUnLCD
@YoTengoUnLCD 是的,完全正确。scanf 函数需要地址才能覆盖该地址处的值。这对于 ints 和您可能与 scanf 一起使用的任何其他类型都是正确的。这里没有什么神奇的事情,如果您有任何需要覆盖值的函数,则该函数需要地址,而不是值本身。 - parker.sikand

7
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;
}

1
会提供一些描述有所帮助吗? - Bridge

2

使用接收变量列表应该是非常简单的:

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


(注意:保留HTML标签)

这里的fp是什么意思?在上面的情况下,分隔符是\n,我想使用空格作为分隔符。 - Jainendra
抱歉,由于在此示例中不相关,我已将其删除。你不需要在任何地方指定空格分隔符,它已经隐含在你的格式字符串中了。 - user694833
除非你知道%i的作用,否则永远不要使用它。 - Antti Haapala -- Слава Україні

0

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

#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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接