没有获取数组 Visual C++ 的所有元素

Not getting all the elements of an array Visual C++

我正在尝试将文本文件中的元素添加到数组中,我使用 strtok() 来拆分它们,然后尝试将它们添加到数组中,但由于某种原因,程序向我显示只有第一个 element.I 尝试了 for 和 while 的所有可能组合,但仍然无法解决它并获取所有元素。 input:Dan , 19 , male , 1.80 , 80 , normal , active , mentinere , normal EDIT:after 我更改了程序将打印 7 次 "Dan" 的代码。 这是编辑后的代码:

#include <iostream>
#include <string.h>
#include<fstream>
using std::cout;
using std::string;

int main()
{
    std::ifstream f("text.txt");
    char* user;
    user = new char[10];
    
    char sep[] =",";
    while (f>>user) {
        string v[8];

        
        for (int i = 0; i < 7; i++)
        {char* p = strtok(user, sep);
            v[i] = p;
        
            while (p != NULL)
            {


                p = strtok(NULL, sep);

            }
        }
        for (int i = 0; i < 7; i++)
        {
            cout << v[i] ;
        }
        
    }
    return 0;
}
                


                


            
        
        

这个循环有缺陷:

    for (int i = 0; i < 7; i++)
    {char* p = strtok(user, sep);
        v[i] = p;
    
        while (p != NULL)
        {


            p = strtok(NULL, sep);

        }
    }

你真正想做的是这样的:

   for (int index = 0, char *p = strtok(user, sep); index < 7 && p != nullptr; ++index, p = strtok(nullptr, sep)) {
       v[index] = p;
   }

你的内部循环几乎是正确的,因为你正确地调用了 strtok,但你没有将它存储在任何地方。而且你不需要嵌套循环。

您代码中的主要问题是该结构表明您想要读取一行,然后用 strtok 对其进行标记化。不幸的是 f >> useruserchar*)相当于 fscanf(f, "%s", user)1,它告诉解析器跳过任何白色space 然后读取任何字符,一旦找到 space 就停止。 所以第一个循环只读取 Dan ,然后内部循环尝试解析它(如 Joseph Larson 回答中所述失败)。

所以,让我们尝试让您的代码正常工作。首先,它不能在我的机器上编译,因为你包括 <string.h> 而不仅仅是 <string>.

那就不要把using std::cout;using std::string;放在文件级别,而是放在函数内部,或者最好尽可能避免它们。

然后停止使用 char*new 并切换到 std::string

然后用getline(f, user)交换f >> user(注意这是独立函数,不是std::stringclass的方法)。这将读取您将能够标记化的完整行。

你的循环真的关闭了。你可以这样做:

        int i = 0;
        char* p = strtok(&user[0], sep);
        while (i < 8 && p != NULL) {
            v[i] = p;
            ++i;
            p = strtok(NULL, sep);
        }

最后打印循环有一个错误,没有打印最后一个字。

总程序变为:

#include <iostream>
#include <string>
#include<fstream>

int main()
{
    std::ifstream f("text.txt");
    std::string user;

    char sep[] = ",";
    while (getline(f, user)) {
        std::string v[8];

        int i = 0;
        char* p = strtok(&user[0], sep);
        while (i < 8 && p != NULL) {
            v[i] = p;
            ++i;
            p = strtok(NULL, sep);
        }

        for (int i = 0; i < 8; i++) {
            std::cout << v[i];
        }
    }
}

但我很确定您应该学习更多的 C++ 和更少的旧式 C 库。一个有趣的检查方法是 std::string::find_first_of().


1 当然 f 应该是 FILE* 才能工作。