我正在使用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)胡
有人可以告诉我第二个代码错误发生了什么。 我无法弄清楚为什么我不能输入第二个......很多。!
答案 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()
来扫描用户输入,原因是评论中列出的原因。