2010-03-29 797 views
4

我已经在C中编写了一个应用程序,它需要输入两行。 第一个输入说明了int数组的大小,第二个输入包含由空格分隔的值。 例如,下面的输入C,从单个输入行(scanf?)读取多个数字

5 
1 2 3 4 99 

应该创建一个包含{1,2,3,4,99}

什么是这样做的最快方法数组?我的问题是读取多个数字而不循环整个字符串来检查它是空格还是数字?

谢谢。

回答

10
int i, size; 
int *v; 
scanf("%d", &size); 
v = malloc(size * sizeof(int)); 
for(i=0; i < size; i++) 
    scanf("%d", &v[i]); 

在完成后请记住free(v)

另外,如果由于某种原因,你已经拥有了数字字符串中,你可以使用sscanf()

+0

我以为它会查找以“\ n”分隔的数字? – migajek 2010-03-29 17:24:13

+2

'%d'(以及大多数%的转换,但不是全部)会自动跳过任何空格。阅读scanf文档以获取详细信息! – 2010-03-29 17:27:53

+2

“如果由于某种原因”?你不应该使用'scanf',而应该使用'fgets'和'sscanf'。 http://c-faq.com/stdio/scanfprobs.html – jamesdlin 2010-03-29 19:16:55

0

scanf()是一种痛苦的脖子。检查strtol()这种问题,它会让你的生活变得非常简单。

+1

在一起,这可能是有趣的,但我不知道如何阅读整体第一行;/ – migajek 2010-03-29 17:09:48

+0

@michal,'fgets()'将读取一行。我不知道为什么你需要'strtok()'来解决你的问题。 – 2010-03-29 17:11:57

+0

strtol将只给第一个号码。那不是这里的目的? – 2014-04-12 09:21:36

1

这里是http://www.cplusplus.com/reference/cstring/strtok/,我已经适应了我们的背景下采取的例子。

它分裂子链中的str链,然后我将每个部分转换为int。我期望输入行是用逗号分隔的数字,没有别的。大小是你的数组的大小。你应该做scanf(“%d”,&大小);正如德尼尔森在答复中所述。最后,你有你所有值的int数组。

int main(){ 
    int size = 5, i = 0; 
    char str[] ="10,20,43,1,576"; 
    int list[size]; 
    char * pch; 
    printf ("Splitting string \"%s\" into tokens:\n",str); 
    pch = strtok (str,","); 
    list[i] = atoi(pch); 
    i++; 
    while (pch != NULL) 
    { 
    pch = strtok (NULL, ","); 
    if(pch != NULL) 
     list[i] = atoi(pch); 
    i++; 
    } 

    for(i=0;i<size;i++){ 
    printf("%d. %d\n",i+1,list[i]); 
    } 
    return 0; 
} 
1

这里“N”是数组的数组元素的数目“A”

int N, A[N]; 
printf("Input no of element in array A: "); 
scanf("%d", &N); 
printf("You entered: %d\n", N); 
printf("Input array A elements in one line: "); 
for(int i=0; i<N; i++){ 
    fscanf(stdin, "%d", &A[i]); 
    printf("A[%d] is: %d\n", i, A[i]); 
} 
+1

您可以通过解释OP如何回答问题来改善您的答案。 – MicroVirus 2015-11-21 12:02:16

-1

此代码采用的通过的getchar()读取每个字符一直接的方法。我们去到读取数UTIL我们发现阵列that.This后得到更新的“我”空白space.The指数反复进行,直至换行(“\ n”)与strtok的遭遇

#include<iostream> 
main() 
{ 
    char ch; 
    int arr[30] ; 
    ch =getchar(); 
    int num = 0; 
    int i=0; 
    while(ch !='\n') 
    { 
    if(ch == ' ') 
    { 
     arr[i] = num; 
     i++; 
     num = 0; 
    } 
    if(((ch -48) >=0) && (ch-48 <=9)) 
     num = (num*10) + (ch - 48); 
    ch = getchar(); 
    } 
    arr[i] = num; 
    for(int j=0;i<=i;j++) 
    std::cout<<arr[i]<<" "; 
} 
+0

虽然此代码可能回答这个问题,但提供有关如何解决问题和/或为何解决问题的其他上下文可以提高答案的长期价值。请阅读此https://stackoverflow.com/help/how-to-answer – 2017-06-17 17:43:49

+0

当数字为负数或以“+”开头时,此方法失败。它不是C代码。 – chux 2018-01-30 23:57:17