1

我有这个小问题,无法解决。
问题是我试图LOAD通过要求用户插入它来加载函数中的所有四个字符串。一切似乎都很好,我没有收到任何编译器错误。但eaf一直空着。我尝试了很多方法,甚至用 , , 替换scanfgetsgets_s没有fgets任何改变。

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

void LOAD(char eaf[], char initials[], char finals[], char symbols[]);
int COMPARE(char s[], char eaf[]);

int main()
{
    char eaf[10],initials[1],finals[10],symbols[5];
    LOAD(eaf, initials, finals, symbols);
    return 0;
}


void LOAD(char eaf[], char initials[], char finals[], char symbols[])
{
    printf("Insert states of the optimized AFD\n");
    scanf( " %s", eaf);

    printf("Insert AFD initial state\n");
    do
    {
        scanf( " %s", initials);
    } while (COMPARE(initials, eaf));

    printf("Insert final state(s)\n");
    do
    {
        scanf( " %s",finals);
    } while (COMPARE(finals, eaf));

    printf("Insert the language symbols\n");
    scanf( " %s",symbols);
}

int COMPARE(char s[], char eaf[])
{
    int i;
    char *ptr;
    for(i; i < strlen(s); i++){
            printf("%d\n", i);
        while(ptr==NULL){
            ptr = strchr(eaf, *s);
        }
    }
    if (ptr == NULL) return 1;
    else return 0;
}

我究竟做错了什么?这只是更大程序的一小部分,但其余部分无用,因为eaf是空的。我认为问题出在 using scanf,但正如我所说的其他功能也不起作用。我希望任何人都可以帮助我。谢谢

编辑:我检查过strlen(eaf)

4

2 回答 2

1

使用“scanf”进行输入是危险的,而您已经陷入了这种危险。当您要求它以字符串形式读取首字母并添加终止 0 时,您允许它覆盖“eaf”的内容。

最终,字符串为空,因为您的数组尺寸错误。您为“initials”提供了一个大小为 1 的数组,它不为尾随的 '\0' C 字符串终止符提供空间。

在ideone上查看此代码的现场演示:

#include <stdio.h>

void report(char* eaf, char* initials, char* foo)
{
    printf("eaf = %p, initials = %p, foo = %p\n", eaf, initials, foo);;
    printf("*eaf = %d, *initials = %d, *foo = %d\n", eaf[0], initials[0], foo[0]);
}

void load(char eaf[], char initials[], char foo[])
{
    printf("load\n");
    report(eaf, initials, foo);

    printf("Enter EAF\n");
    scanf(" %s", eaf);
    report(eaf, initials, foo);

    printf("Enter initial state\n");
    scanf(" %s", initials);
    report(eaf, initials, foo);
}

int main(int argc, const char* argv[])
{
    char eaf[10], initials[1], foo[10];
    report(eaf, initials, foo);
    load(eaf, initials, foo);
    report(eaf, initials, foo);

    return 0;
}

您应该在调试器中浏览过这个并观察“eaf”和“initials”的值,看看随着您的进展发生了什么。

你必须用C编写这个程序吗?似乎使用 perl 或 python 等脚本语言对您来说可能更容易。

这是开始解决问题的有效 C 方法,请注意,我实际上并没有解决问题,但它会更容易看到它。

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

void report(char* eaf, char* initials, char* foo)
{
    printf("eaf = %p, initials = %p, foo = %p\n", eaf, initials, foo);;
    printf("*eaf = %d, *initials = %d, *foo = %d\n", eaf[0], initials[0], foo[0]);
}

void load(const char* label, const char* into, size_t intoSize)
{
    assert(intoSize > 1); // can't store a string in 1 character.
    printf("%s\n", label);

    char input[1024] = "";
    fgets(input, sizeof(input), stdin);

    size_t len = strlen(input);
    // strip trailing \n off.
    if (len > 0 && input[len - 1] == '\n') {
        input[--len] = 0;
    }

    // abort on empty input
    if (len <= 0) {
        fprintf(stderr, "Invalid input - terminated.\n");
        exit(1);
    }

    if (len >= intoSize) {
        fprintf(stderr, "Invalid input - length was %u, limit is %u\n", len, intoSize - 1);
        exit(2);
    }

    strncpy(into, input, intoSize);
}

int main(int argc, const char* argv[])
{
    char eaf[10], initials[1], foo[10];
    report(eaf, initials, foo);

    load("Insert states of the optimized AFD", eaf, sizeof(eaf));
    report(eaf, initials, foo);

    load("Insert initial AFD state", initials, sizeof(initials));
    report(eaf, initials, foo);

    printf("eaf = %s\ninitials = %s\n", eaf, initials);

    return 0;
}

在ideone上查看现场演示。

于 2013-07-11T20:40:28.353 回答
0

您输入的格式字符串scanf很可能是罪魁祸首;你在. _%s

改变:

scanf( " %s", eaf);

scanf( "%s", eaf);

为你所有scanf的。

它没有输入您的输入,eaf因为它正在寻找格式为“ blahblahblah ”(注意开头的空格)而不是“ blahblahblah ”的字符串

编辑

无视以上,

空白:任何空白字符都会触发对零个或多个空白字符的扫描。空白字符的数量和类型不需要在任一方向上匹配。

i此外,您应该在您的函数中进行初始化COMPARE(我不明白您如何没有从编译器中收到愤怒的警告),我运行您的代码没有修改并strlen(eaf)返回正确的计数(就在 之后scanf)。

于 2013-07-11T20:09:21.823 回答