在c中将字符串存储在数组中时截断字符串
我试图创建一个由20个字符串组成的数组,其中最多17个字符是从名为“words.dat”的文件中获取的。之后,程序应截断仅显示前17个字符的字符串,并完全忽略该字符串的其余部分。然而 我的问题是:我不太确定如何完成这项任务,有人能给我一些关于如何完成这项任务的见解吗 以下是我当前的代码:在c中将字符串存储在数组中时截断字符串,c,arrays,string,function,C,Arrays,String,Function,我试图创建一个由20个字符串组成的数组,其中最多17个字符是从名为“words.dat”的文件中获取的。之后,程序应截断仅显示前17个字符的字符串,并完全忽略该字符串的其余部分。然而 我的问题是:我不太确定如何完成这项任务,有人能给我一些关于如何完成这项任务的见解吗 以下是我当前的代码: #include <stdio.h> #include <stdlib.h> #define WORDS 20 #define LENGTH 18
#include <stdio.h>
#include <stdlib.h>
#define WORDS 20
#define LENGTH 18
char function1(char[WORDS][LENGTH]);
int main( void )
{
char word_array [WORDS] [LENGTH];
function1(word_array);
return ( 0 ) ;
}
char function1(char word_array[WORDS][LENGTH])
{
FILE *wordsfile = fopen("words.dat", "r");
int i = 0;
if (wordsfile == NULL)
printf("\nwords.dat was not properly opened.\n");
else
{
for (i = 0; i < WORDS; i++)
{
fscanf(wordsfile, "%17s", word_array[i]);
printf ("%s \n", word_array[i]);
}
fclose(wordsfile);
}
return (word_array[WORDS][LENGTH]);
}
样本输出:
blahblah@fang:~>a.out
Ninja
DragonsFury
failninja
dragonsrage
leagueoflegendssu
rfgthyjnu
white
black
red
green
yellow
green
leagueoflegendssu
ghjkuj
dragonsfury
Sword
sodas
tiger
snakes
Swords
blahblah@fang:~>
该计划之后将完成的工作是:
在function1正常工作后,我将创建第二个函数名“function2”,它将在整个数组中查找匹配的词对,这些词对“完全”匹配,包括大小写。之后,我将创建第三个函数,该函数显示我先前创建的words.dat文件中的20个字符串以及匹配的单词。在循环中更改
fscanf(wordsfile, "%17s", word_array[i]);
到
它的基本功能是:
%17s
,很明显,最多读取17个字符并将其放入word\u数组中%*[^\n]
,读取所有非\n字符并删除它们(*
)\n
读取新行字符正如其他人提到的,查看调用
function1
返回的值。它基本上是word\u数组[20][18]
,是数组限制的两倍。它是word\u数组的第21个元素的第19个字符。你一个也没有。如果此函数不返回任何值,则其工作方式相同。需要注意的几点。首先,我建议您使用function1
返回读取了多少单词的计数,而不是word\u array[words][LENGTH]
中的字符,该字符位于您无法访问的内存位置。因此,将函数更改为返回一个int
:
int function1(char word_array[WORDS][LENGTH])
要处理文件可能包含少于单词的可能性,您需要知道fscanf
何时失败,以及何时中断循环
if( 1 != fscanf(wordsfile, "%17s", word_array[i]) ) break;
要忽略超过17个字符的剩余单词,您可以一次只读取一个,直到遇到空白字符或EOF
int c;
do { c = fgetc(wordsFile); } while( c != EOF && !isspace(c) );
总而言之:
int function1(char word_array[WORDS][LENGTH])
{
FILE *wordsfile = fopen("words.dat", "r");
int c, i = 0;
if (wordsfile == NULL)
{
printf("\nwords.dat was not properly opened.\n");
}
else
{
for (i = 0; i < WORDS; i++)
{
if( 1 != fscanf(wordsfile, "%17s", word_array[i]) ) break;
/* eat remaining characters of long words */
do { c = fgetc(wordsFile); } while( c != EOF && !isspace(c) );
}
fclose(wordsfile);
}
/* Return the number of words read */
return i;
}
int function1(字符字数组[字][长度])
{
文件*wordsfile=fopen(“words.dat”,“r”);
int c,i=0;
if(wordsfile==NULL)
{
printf(“\nwords.dat未正确打开。\n”);
}
其他的
{
for(i=0;i
可能有点幼稚,但你可以一个字符一个字符地读取文件,查找空格并计算读取的字符数。输入文件的示例可以很好地回答你的问题,因为我怀疑你需要逐行处理,而发布的代码肯定不会。请使用输入文件编辑此内容,谢谢。只是一个想法:fscanf(word文件,“%17s%*[^\n]\n”,word\u数组[i])
您应该使函数1
无效,并删除最后一个返回值
。它当前返回一个超出范围的字符。但是,我这样做了,单词出现了无序,文本文件中的一些字符出现在输出中。@Nick查看编辑的行。仔细检查控制字符串中的空格。现在它的工作方式类似于charm:)最后的\n
实际上读取(并丢弃)所有空格。因此,如果你删除它,答案(和程序)会更好。虽然从文件中读取时,无论有没有它都可以正常工作。@ChrisDodd我不知道这一点。是否有理由不将其视为常规(可打印)字符?如果我删除了新行字符,它不会在上一次迭代后将其保留在输入缓冲区中吗?谢谢,这很有帮助!
int c;
do { c = fgetc(wordsFile); } while( c != EOF && !isspace(c) );
int function1(char word_array[WORDS][LENGTH])
{
FILE *wordsfile = fopen("words.dat", "r");
int c, i = 0;
if (wordsfile == NULL)
{
printf("\nwords.dat was not properly opened.\n");
}
else
{
for (i = 0; i < WORDS; i++)
{
if( 1 != fscanf(wordsfile, "%17s", word_array[i]) ) break;
/* eat remaining characters of long words */
do { c = fgetc(wordsFile); } while( c != EOF && !isspace(c) );
}
fclose(wordsfile);
}
/* Return the number of words read */
return i;
}