繁体   English   中英

C、function 调用 printf 后的命令流程

[英]Command Flow in C, function call after printf

所以我有这个超级简单的 C 代码在这里接受用户输入并将其打印出来,然后是“T-Plus”while循环。 在这种情况下,我选择了一个随机名称来测试“哇”,但不会调用 while 循环。 我的问题是,为什么在 printf() function 之后不调用“T-Plus: %d\n”while 循环打印?:

#include <stdio.h>

char getString();
void tcount(void);


int main(void)
{
    tcount();
}

void tcount(void)
{
    // class scanf user input
    printf("%s", getString());

    int i = 1;
    do
    {
        printf("T-Plus: %d\n", i);
        i++;
    } while( i < 51 );
}

char getString()
{
    char name;
    printf("Please a string name: \n");
    scanf("%s", &name);
    return name;
}

现在当我运行它时,它变成了 output:

$ ./namecount
Please a string name:
whoa

但不会调用 T-Plus: 字符串。

我在这里看到两个问题:

1)在 function getString()中,您尝试读取/扫描字符中的字符串,您需要 memory 来存储字符串和终止字符,因此您可以使用这两种方式中的任何一种

使用 char 数组,例如char name[50]; 或者

使用 char 指针并使用 malloc 分配 memory 例如char *p_name = malloc(sizeof(char)*50);

2)然后您尝试返回存储在局部变量中的这个字符串(一旦 function 结束,它将被销毁)所以您应该使用第二种方法(使用 malloc)并返回指针。

所以你的代码看起来像:

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

char * getString();
void tcount(void);


int main(void)
{
    tcount();
}

void tcount(void)
{
    // class scanf user input
    char *p_name = getString();
    printf("%s", p_name);
    free(p_name);

    int i = 1;
    do  
    {   
        printf("T-Plus: %d\n", i); 
        i++;
    } while( i < 51 );
}

char *getString()
{
    char *p_name = malloc(sizeof(char)*50);
    printf("Please a string name: \n");
    scanf("%s", p_name);
    return p_name;
}

上面的答案没有用,好的,所以我已经编辑了这样的代码,它编译得很好。 但是会引发分段错误。

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

char * getString();
void tcount(void);

int main(void)
{
    tcount();
}

void tcount(void)
{
    // class scanf user input
    char *name = getString();
    printf("%s", name);
    free(name);

    int i = 1;
    do
    {
        printf("T-Plus: %d\n", i);
        i++;
    } while( i < 51 );
}


char * getString()
{
    char *p_name[50];
    printf("Please a string name: \n");
    scanf("%49s", (char *) &p_name);
    return *p_name;
}

当程序运行时,它会询问您的输入,但仍会引发分段错误(核心转储)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM