Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/68.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_Arrays_String_Function - Fatal编程技术网

在c中将字符串存储在数组中时截断字符串

在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

我试图创建一个由20个字符串组成的数组,其中最多17个字符是从名为“words.dat”的文件中获取的。之后,程序应截断仅显示前17个字符的字符串,并完全忽略该字符串的其余部分。然而

我的问题是:我不太确定如何完成这项任务,有人能给我一些关于如何完成这项任务的见解吗

以下是我当前的代码:

    #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;
    }