#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
函数获取输入字符串,并在输入字符串的末尾手动移除换行符。这样可以避免缓冲区溢出问题。
【相关推荐】