指针和字符数组

时间:2018-04-16 15:54:52

标签: c

我正在使用gcc 4.9.2-10 deb8u1编译器进行编译 这是我的代码

 #include <stdio.h>
    int main(){
    char *s;
    char sa[10] , sb[10];
    scanf("%s", sa);
    printf("line\n");
    scanf("%s", sb);
    printf("%s   %s", sa, sb);
}

如果char在提供的空格下,则上面的代码没有任何问题

然而

    scanf("%s", s);
    printf("line\n");
    scanf("%s", sa);
    printf("%s   %s", s, sa);

输入: $: 胡

结果: 线 (null)胡

有人可以告诉我第二个代码错误发生了什么。 我无法弄清楚为什么我不能输入第二个......很多。!

2 个答案:

答案 0 :(得分:1)

在你的代码中

char *s;
char sa[10] , sb[10];

你对s无能为力。

scanf("%s", sa);
如果输入适合,

没问题。你可以跳过一些箍,如果它可能更长,可以在循环中读取块中的输入(参见here

然而,在你尝试的问题的“然而”部分

scanf("%s", s);

由于s没有指向内存 - 你需要分配一些 - 你有未定义的行为,所以任何事情都可能发生。

答案 1 :(得分:0)

我无法弄清楚为什么我无法输入第二个?因为s未初始化且没有任何有效地址&amp;对scanf()执行此操作会导致未定义的行为

首先分配内存然后扫描用户输入。

int main() {
        char *s; /* its un initialized */
        s = malloc(size); /* this you  need to do ? specify the size value */
        fgets(s,size,stdin);/* its advisable as its not having overflow problem */
        printf("%s\n",s);
        /* once job is done , free it by calling free(s) */
        free(s);
        return 0;
}

使用fgets()代替scanf()来扫描用户输入,原因是评论中列出的原因。