Scanf解析字符串输入到字符数组
我想在2个独立的数组中解析用户输入(使用scanf)。 g ++编译没有错误,但我得到一个内存访问错误(核心转储)。 (德语:“Speicherzugriffsfehler(Speicherabzug geschrieben)”)
char *top[10]; char *bottom[10]; for(i = 0; i < 5; i++){ printf("Karte %d: Obere Werte? ", i ); scanf( "%s", top[i] ); printf( "Karte %d: Untere Werte? ", i); scanf( "%s", bottom[i] ); }
这有什么问题? 我尝试使用带有temp-var的"stringcpy"
("stringcpy(top[i], temp)")
,但它也不起作用。
有什么建议?
您尚未为字符串分配内存。 你给scanf的参数是未初始化的指针。
top[i] = "test"
指定一个指向变量的指针并用有效值初始化它。
相反, scanf(..., top[i])
尝试写入top[i]
指向的位置。 但top[i]
未初始化并指向某个随机位置,这会导致内存访问错误。
当你看man scanf时 ,你可以阅读下面的内容
转换
…
小号
匹配一系列非空白字符;
而现在是重要的一部分
下一个指针必须是一个指向字符数组的指针,该指针足够长以容纳输入序列和终止空字节(’\ 0’),这是自动添加的。
所以你必须通过malloc()
分配一个数组,或者声明字符数组足够大。
char top[10][21]; char bottom[10][21]; int i; for(i = 0; i < 5; i++){ printf("Karte %d: Obere Werte? ", i); scanf("%20s",top[i]); printf("Karte %d: Untere Werte? ", i); scanf("%20s",bottom[i]); }
同
scanf("%20s",top[i]);
限制读取的字符数,以防止缓冲区溢出
正如另一个答案所说,你必须为你的字符串分配位置。 你想要一个顶部和底部字符串数组,但是使用char * top[10]
你只能为10个指针分配空间,而不是字符串中的字符。 top[10] = "Hello"
工作原理是编译器隐式分配字符串文字,它返回指向这些字符的指针。
char *top[10], *bottom[10]; for(i = 0; i < 5; i++) { top[i] = malloc(100); // reserve room for string up to 100 chars printf("Karte %d: Obere Werte? ", i); scanf("%s",top[i]); bottom[i] = malloc(100); printf("Karte %d: Untere Werte? ", i); scanf("%s",bottom[i]); }
你拥有的是一系列指针。 您需要为数组中的每个指针分配内存。
您可以在scanf
之前执行以下操作。
top[i] = malloc(sizeof(char)*255); bottom[i] = malloc(sizeof(char)*255);
使用后别忘了免费。
free(top[i]); free(bottom([i]);