如何读取逗号分隔字符串中的名称和整数值?

时间:2017-03-19 14:09:11

标签: c string integer string-formatting

我正在尝试传递一个数字和一组字符串S作为输入。这里字符串S包含一个名称,后跟一个逗号,然后是一个多位整数。程序必须显示具有最高相应编号的名称。

考虑输入:

4
Will,13
Bob,7
Mary,56
Gail,45 

输出:

Mary 

因为对应于玛丽的数字是56,这是最高的。

我面临的问题是获取两个数组中的名称和数字

w[][] a[][]

这里我尝试了二维数组,但是我无法读取逗号分隔值。 这是我的代码:

#include <stdio.h>
#include <ctype.h>
int main(){
char W[200][1000];//Two dimensional arrays to store names
int a[200];//To store the numbers
int i,n;
scanf("%d",&n);//Number of Strings
for (i=0; i<n; i++) {
    scanf("%[^\n]s",W[i]);//To read the name
    getchar();//To read the comma
    scanf("%d",&a[i]);//To read the number
}
printf("\n");
for (i=0; i<n; i++) {
    printf ("W[%d] = %s a[%d] = %d\n" ,i,W[i],i,a[i]);//Displaying the values
}
//To find out the maximum value
max = a[0];
for(i=0;i<n;i++){
    if(a[i]>=max) { a[i] = max; pos = i; }
}
printf("\n%s",W[pos]); //Print the name corresponding to the name
return(0);
}

所以基本上我想把逗号前的名字提取到字符数组中,然后将逗号后的数字提取到数字数组中。

如何更正此代码?

2 个答案:

答案 0 :(得分:1)

一般建议:更喜欢堆分配值(并使用mallocrealloc&amp; free;阅读C dynamic memory allocation)大型变量,例如char W[200][1000]; 。我建议处理char**W;事。

  

程序必须显示具有最高相应编号的名称。

多想一想。你不需要存储所有以前读过的数字,你应该设计你的程序,以便能够处理数百万(名称,分数)行的文件(不需要占用大量内存)。

然后,scanf("%[^\n]s",W[i]); 做你想做的事。仔细阅读 documentation of scanf(并测试其返回值)。使用fgets - 最好是getline(如果有的话) - 读取一行,然后解析它(可能使用sscanf)。

  

所以基本上我想把逗号前的名字提取到字符数组中,然后将逗号后的数字提取到数字数组中。

考虑使用标准lexingparsing技术,可能在每一行。

PS。我不想做你的作业。

答案 1 :(得分:0)

这是我的工作代码:

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

int main()
{
char *str[100];
int i,a[100];
int num=100;//Maximum length of the name
int n,max,pos;
scanf("%d",&n);//Number of strings
for(i=0;i<n;i++)
{
   str[i]=(char *)malloc((num+1)*sizeof(char));//Dynamic allocation
   scanf("%[^,],%d",str[i],&a[i]);
}
max = a[0];
pos = 0;
for(i=1;i<n;i++){
    if(a[i]>max) {max = a[i]; pos = i;}
}
printf("%s\n",str[pos]);//Prints the name corresponding to the greatest value
return 0;
}

我已经使用malloc动态地存储字符串的内容。我也使用了scanf()格式化来获取字符串和单独数组中的数字。但是如果有更好的方法可以做同样的事情真的很棒。