数据结构字符串为什么输入不了


#include <stdio.h>
#include <stdlib.h>
#include<string.h>
#define max 100

typedef struct HString{

char* ch;

int length;

}HString;


typedef int Status;



HString* init(HString* p){


p->ch=NULL;

p->length=0;

return p;

}


HString* put(HString* p,char* str){

int i,j=0;

init(p);

i=strlen(str);//输入字符串长度

if(!i){//i==0;
    exit(1);//异常
}

p->ch=(char*)malloc(sizeof(char)*i);//开辟字符数组空间

if(!p->ch){//空间若没开辟成功
    exit(1);//异常
}


for(j=0;j<i;j++){//遍历赋值

    p->ch[j]=str[j];//字符数组每个值等于输入字符每个符号
    p->length=i;//长度等于输入字符串长度
}


return p;

}



void print(HString* p){

for(int i=0;i<p->length;i++){

    printf("%c",p->ch[i]);

}


}


int main()
{
    HString* str;

    init(str);


    char str1[max];
    gets(str1);
    put(str,str1);

    print(str);

    return 0;
}

修改如下,改动处见注释,供参考:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 100
typedef struct HString {

    char* ch;
    int length;
}HString;
typedef int Status;

HString* init(HString* p) {

    p->ch = NULL;
    p->length = 0;
    return p;
}

HString* put(HString* p, char* str) {

    int i, j = 0;
    //init(p);   这句多余,p 已经初始化过了 修改
    i = strlen(str);
    if (!i) {
        exit(1);
    }
    p->ch = (char*)malloc(sizeof(char) * i);
    if (!p->ch) {
        exit(1);
    }
    for (j = 0; j < i; j++) {
        p->ch[j] = str[j];
    }
    p->length = i; 
    //} 修改,上一句 p->length = i; 应放在for()循环外面
    return p;
}

void print(HString* p) {

    for (int i = 0; i < p->length; i++) {
        printf("%c", p->ch[i]);
    }
}

int main()
{
    HString* str;
    str = init(str);  //init(str); 修改  函数调用有返回值  
    char str1[max];
    gets(str1);
    str = put(str, str1); //put(str, str1); 修改  函数调用有返回值
    print(str);
    return 0;
}

str=init(str);

【以下回答由 GPT 生成】

这段代码存在一个潜在的问题:使用了不推荐使用的函数gets来获取输入字符串。gets函数容易造成缓冲区溢出漏洞,因此不建议使用。应该使用更安全的函数fgets来代替。

以下是修改后的代码,替换了gets函数为fgets函数:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define max 100

typedef struct HString{
    char* ch;
    int length;
}HString;

HString* init(HString* p){
    p->ch = NULL;
    p->length = 0;
    return p;
}

HString* put(HString* p, char* str){
    int i, j = 0;
    init(p);
    i = strlen(str);

    if(!i){
        exit(1);
    }

    p->ch = (char*)malloc(sizeof(char)*i);

    if(!p->ch){
        exit(1);
    }

    for(j=0; j<i; j++){
        p->ch[j] = str[j];
        p->length = i;
    }

    return p;
}

void print(HString* p){
    for(int i=0; i<p->length; i++){
        printf("%c", p->ch[i]);
    }
}

int main(){
    HString* str;
    init(str);

    char str1[max];
    fgets(str1, max, stdin);

    // 移除换行符
    if(str1[strlen(str1)-1] == '\n'){
        str1[strlen(str1)-1] = '\0';
    }

    put(str, str1);

    print(str);

    return 0;
}

修改后的代码使用fgets函数获取输入字符串,并在输入字符串的末尾手动移除换行符。这样可以避免缓冲区溢出问题。



【相关推荐】



如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^