C语言问题,最好基于我的程序进行修改
发布网友
发布时间:2022-05-31 16:50
我来回答
共5个回答
热心网友
时间:2023-10-20 01:27
主函数的问题不大,但也应尽力克服。str_bin这个函数存在严重问题,即使可以正常运行那也是运气——C是函数中的局部数组,函数退出后就消失了,返回C指针后是“无法保证”C中的数据是正常的,而且可能会带来其他严重后果;而且,C是指针,但函数名前面写的却是char,所以str_bin要重写。基本按你的思路,写一个你对照看。有问题续问。
#include "stdio.h"
char *str_bin(char *s1,char *s2,char *s){//返回应该是指针,传过来的也应该是指针
char *p=s;
while(*s1 || *s2){
if(*s1<=*s2 && *s1)
*s++=*s1++;
else if(*s2)
*s++=*s2++;
else if(*s1)
*s++=*s1++;
}
*s='\0';
return p;
}
int main(int argv,char *argc[]){
char a[100],b[100],c[200];//在这里声明C数组
char *p=0;
printf("Input 2 string...\n");
//gets(a);//这个函数不能控制长度,超过100字符会产生问题
scanf("%100s%100s",a,b);//用这个函数可避免上述问题
//gets(b);
p=str_bin(a,b,c);//把c数组的地址传给函数
puts(p);
return 0;
}
运行样例:
热心网友
时间:2023-10-20 01:28
#include<stdio.h>
#include<string.h>
char C[200];//你将C定义为函数内部的局部变量,程序返回时该变量的内存已经释放,内容不能正确返回,因此应该将它定义为全局变量。
char *str_bin(char *s1,char *s2) //字符串变量是char*型的,不是char型,char只有一个字符。
{
int n1,n2,i,j,k;
//char A[100],B[100],C[200];s1,s2可以直接使用,不必另外定义A,B, 将C定义为函数内部的局部变量,程序返回时该变量的内存已经释放,内容不能正确返回,因此应该将它定义为全局变量。
//strcpy(A,s1);
//strcpy(B,s2);
n1=strlen(s1);
n2=strlen(s2);
for(i=0,j=0,k=0;(i<n1)&&(j<n2);k++){
//if(s1[i]<s2[j]||s2[j]=='\0'){ 如果s1[i]是'\0',总是成立的,怎么办?
/*
正确做法:如果两个字符串都没有到达终点,比较当前字符,小的一个复制到C[k],相应下标增加1;如果两个相等,两个都复制到C(允许重复),相应下标都增加1;
如果有一个字符串到了末尾,将另一个字符串余下的内容复制到C[]
字符串长度不包含末尾的'\0'
*/
if(s1[i]<s2[j]) C[k]=s1[i++];
else if (s1[i]>s2[j]) C[k]=s2[j++];
else {
C[k++]=s1[i++];
C[k]=s2[j++];
}
}
if (i==n1) while (j<n2) C[k++]=s2[j++];
else if (j==n2) while (i<n1) C[k++]=s1[i++];
C[k]=0;
return C;
}
int main()
{
char a[100],b[100];
//char*p;//=0不必,如果一定要赋初值,应该是char *p=NULL;C定义为全局变量后p*也不必用了。
gets(a);
gets(b);
//p=str_bin(a,b);
str_bin(a,b);
puts(C);
getchar();
return 0;
}
热心网友
时间:2023-10-20 01:28
你好!
你的函数传递的是字符,不是字符串,改成传递字符串地址
修改后的完整代码,你对比以前的看看吧
#include<stdio.h>
#include <string.h>
#include<string.h>
char *str_bin(char *s1,char *s2) // 函数和参数都改成指针类型
{
int n1,n2,i,j,k;
char A[100],B[100],C[200];
strcpy(A,s2);
strcpy(B,s1);
n1=strlen(A);
n2=strlen(B);
for(i=0,j=0,k=0;i<n1||j<n2;k++){
if(A[i]<B[j]||B[j]=='\0'){
C[k]=A[i];
i++;
}
else{
C[k]=B[j];
j++;
}
}
return C; // 函数的返回值
}
int main()
{
char a[100],b[100];
char*p=0;
gets(a);
gets(b);
p=str_bin(a,b);
puts(p);
return 0;
}
热心网友
时间:2023-10-20 01:29
你定义的函数返回值是一个char型的字符,但是你子函数返回的是一个字符串的指针,当然类型不对
逻辑上稍有偏差,要求是合并到str1中,但是你是赋值了新的c,所以不对
赋值到新的字符串后,你需要最后把c字符串拷贝到str1中,才可以
那么子函数不需要返回值,最后直接打印main中的a字符串即可
修改部分,你定义错了,所以改为char *str_bin(char *s1,char *s2)
定义要加上*。main不用改
只要你子函数中for没有错的话,程序应该是没问题的追问定义加上*是什么原因?我以前定义时候不加这个啊
追答返回值要和你的main中要的类型要对应,这个你应该明白吧
再说你需要什么,你需要一个p是指针,而且你子函数中return中c也是一个指针
但是你子函数类型是一个char,这样对吗?
热心网友
时间:2023-10-20 01:29
内存错误,函数str_bin中C[200]是一个局部变量,函数结束后局部变量的内存要被释放,因此数组A,B,C的内存都会被释放掉,你返回C,返回的只是数组C的首地址,它指向一片内存,但内存中数据已经不存在了,你如何打印?你写的是归并的程序,这个思路没错,但从你编程风格来看,还有待提高啊,内存管理的知识你还不懂,以后多加油,这个程序你最好先研究下,还有有关字符串操作的不需要返回值,系统自带的strcpy(),strcat()都没有,因为你传递一个指针,操作的就是指针所指向的内存