使用 printf 时,来自 fgets 的字符串数据会丢失

问题描述 投票:0回答:1

我是 C 编程新手,现在正在做 C 课程中的第一份作业。 我注意到在代码中使用字符串时存在异常行为。

我目前正在编写一个简单的字符串编码器,我们的任务是使用一个指向长度为5的字符数组的指针,初始化为空字符串。我们还应该使用 fgets 从用户那里获取一个字符串。

我问了一些人和chatgpt为什么我的代码中会发生这种情况,但还没有找到解决方案。

我确信我的C有很多问题,但现在我真的很想知道是什么导致了这种行为(打印输入字符串的两行,除以通常的printf,在打印字符串的第二行是丢失的)。 您可以在代码下方的屏幕截图中看到终端输出(当前字符串 2:*)

char* get_string(){

    char str[100];
    puts("Please enter a string");
    return fgets(str,sizeof(str),stdin);
}

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

    struct fun_desc {
        char *name;
        char (*fun)(char);
    };

    char (*nullFunction)(char) = NULL;
    struct fun_desc menu[] = {
        {"Get String", my_get},
        {"Print Decimal", dprt},
        {"Print Hex", xprt},
        {"Print Character",cprt},
        {"Encrypt",encrypt},
        {"Decrypt",decrypt},
        {NULL,nullFunction}
    };

    int flag = 1;
    int i,opNum;
    char functions[5] = "";
    char *carray = functions;

    while(flag){
        printf("Current string 1: %s",carray);
        printf("Select operation from the following menu:\n");
        printf("Current string 2: %s",carray);

        puts("\n");
        
        i = 0;
        while(menu[i].fun != NULL){
            printf("%d) %s\n",i,menu[i].name);
            i++;
        }

        printf("Choose a function by entering it's number\n");

        char op[4];

        if(fgets(op,sizeof(op),stdin) == NULL)
            flag = 0;

        else{
            opNum = atoi(op);
            if(opNum >= 0 && opNum < 6){
                puts("Within bounds");
                if(opNum == 0)
                    carray = get_string();
                else
                    carray = map(carray, 5, menu[opNum].fun);
            }
            else {
                puts("Not within bounds");
                break;
            }
        }
    }

    puts("\nEnd of input\n");

    return 0;
}

enter image description here

c string pointers fgets
1个回答
0
投票

函数

get_string
返回一个指向具有自动存储功能的数组的指针,当函数返回时超出范围后不得访问该数组。

程序有未定义的行为。

© www.soinside.com 2019 - 2024. All rights reserved.