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

bre*_*tex 0 c scanf char

我想在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] );
}
Run Code Online (Sandbox Code Playgroud)

这有什么问题?我尝试使用"stringcpy"temp-var ("stringcpy(top[i], temp)"),但它也没有用.

有什么建议?

Ola*_*che 7

您还没有为字符串分配内存.你给scanf的参数是未初始化的指针.

top[i] = "test" 为您的变量指定一个指针并使用有效值对其进行初始化.

相反,scanf(..., top[i])尝试写入top[i]点.但是top[i]没有初始化并指向某个随机位置,这会导致内存访问错误.

当你看man scanf时,你可以阅读下面的内容

转换
...
s
匹配一系列非空白字符;

而现在是重要的一部分

下一个指针必须是指向字符数组的指针,该指针足够长以容纳输入序列和终止空字节('\ 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]);
}
Run Code Online (Sandbox Code Playgroud)

scanf("%20s",top[i]);
Run Code Online (Sandbox Code Playgroud)

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