Scanf解析字符串输入到字符数组

时间:2012-11-22 20:53:48

标签: c char 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] );
}

这里有什么问题?我尝试将"stringcpy"与temp-var ("stringcpy(top[i], temp)")一起使用,但它也不起作用。

有什么建议吗?

3 个答案:

答案 0 :(得分:7)

您尚未为字符串分配内存。你给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]);

限制读取的字符数,以防止缓冲区溢出

答案 1 :(得分:2)

正如另一个答案所说,你必须为你的字符串分配位置。你想要一个顶部和底部字符串数组,但是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]);
}

答案 2 :(得分:0)

你拥有的是一系列指针。您需要为数组中的每个指针分配内存。

您可以在scanf之前执行以下操作。

top[i] = malloc(sizeof(char)*255);
bottom[i] = malloc(sizeof(char)*255);

使用后别忘了免费。

free(top[i]);
free(bottom([i]);