0

我有一个包含 1 行的文件,在 Linux 上它默认以换行符结尾

one two three four

和一个类似的

one five six four

保证中间的两个词永远不会是“四”。我写了以下内容,想将“二三”和“五六”分配给一个变量,就像在这段代码中一样。

#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>

bool getwords(FILE *example)
{
    bool result = 0;
    char *words;
        if(fscanf(example, "one %s four\n", words) == 1)
        {
            printf("captured words are %s\n", words);
            if(words == "two three"
            || words == "five six")
            {
                puts("example words found");
            }
            else
            {
                puts("unexpected words found");
            }
            result = 1; //so that we know this succeeded, in some way
        }
    return result;
}

int main(int argc, char * argv[])
{
    if(argc != 2)
    {
        exit(0);
    }
    FILE *example;
    example = fopen(argv[1],"r");
    printf("%x\n", getwords(example)); //we want to know the return value, hex is okay
    fclose(example);
    return 0;
}

问题是这将打印“捕获的单词是”,然后只有两个单词中的第一个单词会出现在字符串中。这应该支持在单词“one”和“four”之间可能有超过 2 个单词的文件。如何更改我的代码,以获取字符串中第一个和最后一个单词之间的所有单词?

4

2 回答 2

1

已获取您的代码并对其进行修改以与 Eclipse/Microsoft C 编译器一起使用。但是,总的来说,我认为我保持了你的初衷(?)。

请查看并注意细微的变化。我知道这可能是你用 C 编写的第一个程序之一,所以说最终你会知道非学生程序不是用这种风格编写的。

fscan最后,不管其他人怎么说,按预期使用它并 没有错。

#include <stdio.h>
#include <stdlib.h>

int getwords(FILE *example)
{
    int result = 0;
    char word1[20];  //<< deprecated, learn and use malloc
    char word2[20];  //<< works for first pgm, etc.

    if( fscanf(example, "one %s %s four", word1, word2) == 2)
        {
            printf("captured words are: %s %s\n", word1, word2);

            if ((!strcmp(word1, "two") && !strcmp(word2,"three")) ||
                (!strcmp(word1, "five") && !strcmp(word2, "six")))
            {
                printf("example words found\n");
            }
            else
            {
                printf("unexpected words found\n");
            }
            result = 1; //so that we know this succeeded, in some way
        }
    return result;
}

main(int argc, char *argv[])
{

    FILE *example;

    if(argc != 2) {exit(0);}

    example = fopen(argv[1],"r");
    // it is a good practice to test example to see if the file was opened

    printf("return value=%x\n", getwords(example)); //we want to know the return value, hex is okay

    fclose(example);

    return 0;
}
于 2013-08-08T05:19:45.080 回答
1

在当前状态下,您的代码中有很多错误。

首先,您需要分配char *words;. 该语句目前只声明了一个指向字符串的指针,并没有创建字符串。快速修复将是char words[121];.

此外,限制 scanf 的捕获范围以匹配wordswith的长度scanf("one %120s four", words);。但这不会捕获这两个词,因为%s只搜索一个词。一种解决方案是扫描每个单词fscanf("one %120s %120s four", first_word, second_word);,然后逐个比较。

其次,您不能使用==运算符比较两个字符串。==比较变量的值,words只是一个指针。一个解决方法是使用strcmp(words, "two three") == 0你写的地方words == "two three"

于 2013-08-08T02:19:24.693 回答