用C语言将格式化字符串从文件读入数组
我是C编程语言的新手,并试图通过仅使用C及其标准库解决ProjectEuler网站上的问题来提高自己。我已经介绍了基本的C基础知识(我想)、函数、指针和一些基本的文件IO,但现在遇到了一些问题 问题是读一个名字的文本文件,计算一个“名字分数”等等,我知道我将要使用的算法,并且大部分程序都是设置好的,但就是不知道如何正确读取文件 该文件的格式为 “名字一”,“名字二”,“比利”,“鲍比”,“弗兰克”。。。 我已经搜索、搜索、尝试了无数的东西,但似乎无法将它们作为单个名称读入字符串数组(我认为这是单独存储它们的正确方法?)我尝试使用sscanf/fscanf和%[^\”,].我尝试过这些函数和fgets的不同组合,但我对fgets的理解是,每次我调用它时,它都会得到一个新行,这是一个在同一行上包含45000多个字符的文本文件 我不确定是因为我对scanf函数的误解,还是因为我对存储字符串数组的误解,我遇到了问题我已经意识到,当我声明一个字符串数组时,它不会为字符串本身分配内存,这是我需要做的事情,但我仍然无法让任何事情正常工作 下面是我现在要尝试读取的代码,我从命令行输入一些名称来测试我的方法 此代码用于输入缓冲区大小(100)以下的任何字符串:用C语言将格式化字符串从文件读入数组,c,string,file-io,scanf,C,String,File Io,Scanf,我是C编程语言的新手,并试图通过仅使用C及其标准库解决ProjectEuler网站上的问题来提高自己。我已经介绍了基本的C基础知识(我想)、函数、指针和一些基本的文件IO,但现在遇到了一些问题 问题是读一个名字的文本文件,计算一个“名字分数”等等,我知道我将要使用的算法,并且大部分程序都是设置好的,但就是不知道如何正确读取文件 该文件的格式为 “名字一”,“名字二”,“比利”,“鲍比”,“弗兰克”。。。 我已经搜索、搜索、尝试了无数的东西,但似乎无法将它们作为单个名称读入字符串数组(我认为这是单
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
找到第一个双引号,然后找到第二个双引号,然后读出名称字符串之间的字符。然后根据需要处理这些字符以解决问题。这里有两个基本问题: