为什么显示垃圾,虽然我检查了地址是否正确传输并且我尝试在 main 中显示字符串(T_String. * Pointer)并且一切都正确返回,但在函数中它不正确?
#include <stdio.h>
#include <stdlib.h>
#include <mem.h>
#define MAX_BUFFER 255
typedef struct{
int *pointer;
int length;
} T_String;
int equals_len(T_String *a,int n){
for (int i = 0; i < n-1; ++i) {
for (int j = i+1; j < n; ++j) {
if(a[i].length==a[j].length){
return 1;
}
}
}
return 0;
}
//сортировка вставками
void InsertionSort(T_String *a,int n)
{
T_String b;
int j;
for (int i = 1; i < n; i++)
{
b = a[i];
j = i - 1;
while(j >= 0 && a[j].length > b.length)
{
a[j+1] = a[j];
j = j - 1;
}
a[j+1] = b;
}
}
int word_distantion(T_String *a, T_String *b){
int d=0;
for (int i = 0; i < a->length; ++i) {
printf("%s", a->pointer[i]); //Выводится какой-то мусор
}
//for (int i = 0; (i < a.length) && (i < b.length); ++i) {
//printf("%s and %s = %i\n",a.pointer[i],b.pointer[i],a.pointer[i]!=b.pointer[i]);
//if(a.pointer[i]!=b.pointer[i]){
// d++;
//}
//}
}
int main() {
signed char buffer[MAX_BUFFER];
int n;
T_String *strings;
printf("Введите кол-во слов: ");
scanf("%i",&n);
strings = malloc(n * sizeof(T_String));
for (int i = 0; i < n; ++i) {
scanf("%s",buffer);
strings[i].pointer = malloc(strlen(buffer) * sizeof(char));
strcpy(strings[i].pointer,buffer);
strings[i].length = strlen(buffer);
}
if(!equals_len(strings,n)){
//InsertionSort(strings,n);
}
for (int i = 0; i < n-1; ++i) {
for (int j = i+1; j < n; ++j) {
if(word_distantion(&(strings[i]), &(strings[j]))>0){
//printf("%s and %s = %i\n",a[i].pointer,a[j].pointer,word_distantion(a[i],a[j]));
}
}
}
return 0;
}
你可能有几个原因。让我们先摆脱显而易见的。
好吧,按顺序:
mem.h
“C”标准库中不存在头文件。对于“字符串”的操作,有string.h
'int
。在您的情况下,您正在使用字符串,因此您需要替换int* pointer;
为char* pointer;
关于问题本身:
我不知道你有什么编译器,但在我的编译器上
gcc
,在你指出的地方,通常会发生“分段错误”。没错,因为您要求显示来自某个- 元素的字符串int*
,您不觉得奇怪吗?如果要从某种数据类型输出字符,则:
%c
(您有%s
,这与单行字符的顺序输出逻辑不对应)。printf
typechar
,或者从 type 中选择一个特定的字符char*
,但是你有int*
,所以这就是问题所在(还有其他选项,但对于这种情况,你只需要知道这些)。换句话说,
%s
替换为%c
,并将结构的定义更改为下一个。方法 :PS:对于这个问题,没有必要知道你如何排序和读取数据,所以在下一个。只是不要通过显示最基本的(别名和您的输出不起作用)来浪费您的时间和其他人的时间,这样我们就不会理解您的所有代码,而只是其中的关键部分。