Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用C语言将格式化字符串从文件读入数组_C_String_File Io_Scanf - Fatal编程技术网

用C语言将格式化字符串从文件读入数组

用C语言将格式化字符串从文件读入数组,c,string,file-io,scanf,C,String,File Io,Scanf,我是C编程语言的新手,并试图通过仅使用C及其标准库解决ProjectEuler网站上的问题来提高自己。我已经介绍了基本的C基础知识(我想)、函数、指针和一些基本的文件IO,但现在遇到了一些问题 问题是读一个名字的文本文件,计算一个“名字分数”等等,我知道我将要使用的算法,并且大部分程序都是设置好的,但就是不知道如何正确读取文件 该文件的格式为 “名字一”,“名字二”,“比利”,“鲍比”,“弗兰克”。。。 我已经搜索、搜索、尝试了无数的东西,但似乎无法将它们作为单个名称读入字符串数组(我认为这是单

我是C编程语言的新手,并试图通过仅使用C及其标准库解决ProjectEuler网站上的问题来提高自己。我已经介绍了基本的C基础知识(我想)、函数、指针和一些基本的文件IO,但现在遇到了一些问题

问题是读一个名字的文本文件,计算一个“名字分数”等等,我知道我将要使用的算法,并且大部分程序都是设置好的,但就是不知道如何正确读取文件

该文件的格式为 “名字一”,“名字二”,“比利”,“鲍比”,“弗兰克”。。。 我已经搜索、搜索、尝试了无数的东西,但似乎无法将它们作为单个名称读入字符串数组(我认为这是单独存储它们的正确方法?)我尝试使用sscanf/fscanf和%[^\”,].我尝试过这些函数和fgets的不同组合,但我对fgets的理解是,每次我调用它时,它都会得到一个新行,这是一个在同一行上包含45000多个字符的文本文件

我不确定是因为我对scanf函数的误解,还是因为我对存储字符串数组的误解,我遇到了问题我已经意识到,当我声明一个字符串数组时,它不会为字符串本身分配内存,这是我需要做的事情,但我仍然无法让任何事情正常工作

下面是我现在要尝试读取的代码,我从命令行输入一些名称来测试我的方法

此代码用于输入缓冲区大小(100)以下的任何字符串:

int main(无效)
{
int i;
字符输入[100];
字符*名称[10];
printf(“\n输入最多10个名称\n输入一个空字符串以终止输入:\n”);
对于(int i=0;i<10;i++)
{
整数长度=0;
printf(“%d:,i”);
fgets(输入,100,标准输入);
长度=(int)strlen(输入);
输入[length-1]=0;//删除换行符
长度--;
如果(长度<1)
{
打破
}
名称[i]=malloc(长度+1);
断言(名称[i]!=NULL);
strcpy(名称[i],输入);
}
}
但是,我无法在格式化字符串中读取这些内容

请告诉我如何以格式读取它。我以前在输入缓冲区上使用过sscanf,效果很好,但我觉得我不能在45000+字符行上这样做?我的假设正确吗?这是一种可以接受的将字符串读入数组的方法吗

我很抱歉,如果这是长期和/或不清楚,这是非常晚,我非常沮丧

感谢所有人的帮助,我期待着最终成为本网站的活跃成员!

fscanf(“%s”,input)
一次读取一个令牌(由空格包围的字符串)。您可以扫描输入,直到遇到特定的“输入结束”字符串,如“!,或者您可以等待文件结束信号,这是通过在Unix控制台上按“Ctrl+D”或在Windows控制台上按“Ctrl+Z”来实现的

第一种选择:

fscanf("%s", input);
if (input[0] == '!') {
    break;
}
// Put input on the array...
第二种选择:

result = fscanf("%s", input);
if (result == EOF) {
    break;
}
// Put input on the array...
无论哪种方式,当您一次读取一个令牌时,输入的大小都没有限制。

fscanf(“%s”,input)
一次读取一个令牌(由空格包围的字符串)。您可以扫描输入,直到遇到特定的“输入结束”字符串,例如“!,或者您可以等待文件结束信号,这是通过在Unix控制台上按“Ctrl+D”或在Windows控制台上按“Ctrl+Z”来实现的

第一种选择:

fscanf("%s", input);
if (input[0] == '!') {
    break;
}
// Put input on the array...
第二种选择:

result = fscanf("%s", input);
if (result == EOF) {
    break;
}
// Put input on the array...

无论哪种方式,当您一次读取一个标记时,输入的大小都没有限制。

为什么不在巨大的字符串中搜索引号字符呢?类似于这样:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char mydata[] = "\"John\",\"Smith\",\"Foo\",\"Bar\"";
    char namebuffer[20];

    unsigned int i, j;
    int begin = 1;
    unsigned int beginName, endName;
    for (i = 0; i < sizeof(mydata); i++)
    {
        if (mydata[i] == '"')
        {
            if (begin)
            {
                beginName = i;
            }
            else
            {
                endName = i;
                for (j = beginName + 1; j < endName; j++)
                {
                    namebuffer[j-beginName-1] = mydata[j];
                }
                namebuffer[endName-beginName-1] = '\0';
                printf("%s\n", namebuffer);
            }
            begin = !begin;
        }
    }
}
#包括
#包括
内部主(空)
{
char mydata[]=“约翰”、“史密斯”、“富”、“酒吧”;
字符名称缓冲区[20];
无符号整数i,j;
int begin=1;
unsigned int beginName,endName;
对于(i=0;i

找到第一个双引号,然后找到第二个双引号,然后读出名称字符串之间的字符。然后根据问题的需要处理这些字符。

为什么不在巨大的字符串中搜索引号字符呢?大概是这样的:

#include <stdio.h>
#include <string.h>

int main(void)
{
    char mydata[] = "\"John\",\"Smith\",\"Foo\",\"Bar\"";
    char namebuffer[20];

    unsigned int i, j;
    int begin = 1;
    unsigned int beginName, endName;
    for (i = 0; i < sizeof(mydata); i++)
    {
        if (mydata[i] == '"')
        {
            if (begin)
            {
                beginName = i;
            }
            else
            {
                endName = i;
                for (j = beginName + 1; j < endName; j++)
                {
                    namebuffer[j-beginName-1] = mydata[j];
                }
                namebuffer[endName-beginName-1] = '\0';
                printf("%s\n", namebuffer);
            }
            begin = !begin;
        }
    }
}
#包括
#包括
内部主(空)
{
char mydata[]=“约翰”、“史密斯”、“富”、“酒吧”;
字符名称缓冲区[20];
无符号整数i,j;
int begin=1;
unsigned int beginName,endName;
对于(i=0;i

找到第一个双引号,然后找到第二个双引号,然后读出名称字符串之间的字符。然后根据需要处理这些字符以解决问题。

这里有两个基本问题:

  • 在这里扫描字符串输入是否是正确的策略