0

如何从这个字符串中提取片段?

我有一个文件,其中包含:

0065445 APPLE$456
089464 MANGO$489
0012389 GUAVA$744

我想要做的是逐行输入文件,然后将字符串切成几块。

  • 0065455 将进入结构a[0].num
  • 苹果将​​进入结构a[0].name
  • 456将进入结构a[0].dollar

对于其他线路也是如此。

一切正常,但它没有成功地将美元部分放入其变量中。

这是代码:

#include<cstdlib>
#include<iostream>

using namespace std ;

int main(){

FILE *fp;

fp = fopen("input.txt","r");

char str[80] ;

struct abc{
int num;
char name[20];
int dollar;
};

int i = 0;

while(fgets(str,79,fp)!=NULL){

struct abc a[i] ;

sscanf(str,"%d %[^$]s$%d\n",&a[i].num,a[i].name,&a[i].dollar);

cout <<i+1 <<") Number : "<<a[i].num<<" Name :  "<< a[i].name <<" Dollar : "<< a[i].dollar << endl ;
i++;

}

return 0 ;
}
/* These didn't work too.
sscanf(str,"%d %[^$]s %d\n",&a[i].num,a[i].name,&a[i].dollar);
sscanf(str,"%d %[^$]s%d\n",&a[i].num,a[i].name,&a[i].dollar);
sscanf(str,"%d %s$%d\n",&a[i].num,a[i].name,&a[i].dollar);

*/

还有一个问题:字符串的第一部分是一个以 0 开头的 int,但 int 中不接受零。怎么做?

这正在按我的意愿工作,但是在将字符串解析为 int 之后,我仍然没有得到零:

#include<cstdlib>
#include<iostream>
#include<cstring>

using namespace std ;

int main(){

    FILE *fp;

    fp = fopen("input.txt","r");

    char str[80] ;
    char temp[80] ;
    struct abc{
        int num;
        char name[20];
        int dollar;
    };

    int i = 0;
    int j = 0 ;

    while(fgets(str,79,fp)!=NULL){
        i = 0;
        j = 0 ;
        struct abc a[i] ;

        char* ptr = 0; // this is used as a helper variable to strtok

        ptr = strtok(str, " $\n"); // we specify the delimiters here

        while (ptr != NULL) 
        {
            if (j == 0){
                strcpy(temp, ptr);
                a[i].num = atoi(temp);
            }
            if (j == 1)
                strcpy(a[i].name, ptr);

            if (j == 2){
                strcpy(temp, ptr);
                a[i].dollar = atoi(temp);
            }

            ptr = strtok(NULL, " $\n");
            j++;
        }

        cout <<i+1 <<") Number : "<<a[i].num<<" Name :  "<< a[i].name <<" Dollar : "<< a[i].dollar << endl ;
        i++;
    }

    return 0 ;
}

/* These didn't work either.
sscanf(str,"%d %[^$]s %d\n",&a[i].num,a[i].name,&a[i].dollar);
sscanf(str,"%d %[^$]s%d\n",&a[i].num,a[i].name,&a[i].dollar);
sscanf(str,"%d %s$%d\n",&a[i].num,a[i].name,&a[i].dollar);

*/
4

4 回答 4

3

基于 C++ 标签,我会做一些不同的事情。首先,我会为您的abc类型重载流提取器运算符:

std::istream &operator>>(std::istream &is, abc &a) { 
    is >> a.num;
    std::getline(is, a.name, '$');
    return is >> a.dollar;
}

然后您可以使用它来读取记录文件,例如:

abc temp;

std::vector<abc> a;

std::ifstream in("input.txt");

while (in >> temp)
    a.push_back(temp);

或者,您可以使用 anistream_iterator直接从流中初始化向量:

std::vector<abc> a((std::istream_iterator<abc>(in)),
                    std::istream_iterator<abc>());

在第一个数字上保留前导零的最简单方法可能是将其从a 更改int为 a std::string

于 2013-05-31T04:20:06.720 回答
2

使用strtok

这是一个单独打印字符串的简单代码(仅限 C)(我在另一篇文章中推荐了类似的解决方案)。

#include <stdio.h>
#include <string.h> // for strcpy and strtok
#include <stdlib.h> // for atoi
int main()
{
    char input [25] = "0065445 APPLE$4056"; // input string

    // storage for the separate parts of the string
    char line[10]; 
    char fruit[10];
    char number[10];

    char* ptr = 0; // this is used as a helper variable to strtok

    ptr = strtok(input, " $\n"); // we specify the delimiters here
    int i = 0;
    // I'm using i here as a control variable so that during each iteration different part
    // of the string is saved
    while (ptr != NULL) 
    {
        if (i == 0)
            strcpy(line, ptr);

        if (i == 1)
            strcpy(fruit, ptr);

        if (i == 2)
            strcpy(number, ptr);

        ptr = strtok(NULL, " $\n");
        i++;      
    }

    printf("%s %s %s\n", line, fruit, number);

    return 0;
}

一些示例输出:

$ ./a.out 
0065445 APPLE 4056

这是你需要的吗?

于 2013-05-31T04:24:13.887 回答
0
#include <iostream>
#include <fstream>
#include <sstream>
struct abc{ int num; std::string name; int dollar; };
int main(int argc, char* argv[]) {
    std::ifstream file("input");
    abc st1;
    std::string l;
    while (file >> st1.num >> l) {
        if (size_t p = l.find_first_of('$')) {
            st1.name = l.substr(0, p);
            std::istringstream(l.substr(p+1)) >> st1.dollar;
            std::cout << st1.num << " : "
                << st1.name << " : " << st1.dollar << std::endl;
        }
    }
    return 0;
}
于 2013-05-31T04:36:28.337 回答
0

打印整数时0's不会显示a[i].num

您可以创建a[i].num一个字符串 ( char[]) 或一个整数数组。做秀0'satoi(str)如果您需要在其他情况下使用它,您可以将其解析为整数(通过)。

于 2013-05-31T04:18:33.223 回答