我有以下代码:
#include<iostream>
#include <string.h>
using namespace std;
int main(){
char str[100], str1[100];
cin>>str>>str1;
char c[strlen(str1)], flag[strlen(str1)];
int i, j, k = 0;
for (i = 0; i < strlen(str1); i++) {
flag[i] = 0;
}
for (i = 0; i < strlen(str); i++) {
for (j = 0; j < strlen(str1); j++) {
if (str[i] == str1[j] && flag[j] == 0) {
c[k] = str[i];
k++;
flag[j] = 1;
break;
}
}
}
if (k != 0)
cout<<c;
return 0;
}
它给出了正确的输出(第一行是输入):
hello world
lo
但是当我把代码放在一个函数中时,它需要放在一个函数func()
中,比如这个 -
#include<iostream>
#include <string.h>
using namespace std;
char * func(char * str, char * str1){
char c[strlen(str1)], flag[strlen(str1)];
int i, j, k = 0;
for (i = 0; i < strlen(str1); i++) {
flag[i] = 0;
}
for (i = 0; i < strlen(str); i++) {
for (j = 0; j < strlen(str1); j++) {
if (str[i] == str1[j] && flag[j] == 0) {
c[k] = str[i];
k++;
flag[j] = 1;
break;
}
}
}
if (k != 0)
return c;
return NULL;
}
int main(){
char str[100], str1[100];
cin>>str>>str1;
cout<<func(str,str1);
return 0;
}
输出就像
hello world
请注意,第二个输出行包含ASCII字符 这里的错误是什么?我不能像这样返回一个字符串数组吗?
答案 0 :(得分:1)
尝试更改,func()
,
char c[strlen(str1)], flag[strlen(str1)];
in
static char c[100];
char flag[strlen(str1)];
否则,当你
return c;
您将返回超出范围的本地变量;当你
cout<<func(str,str1);
行为未定义。
如果您将c
转换为static
变量,则char *
返回的func()
仍然在func()
之外,并且可以毫无问题地使用。< / p>
答案 1 :(得分:0)
您正在从函数返回一个局部变量'c'。一旦处理器从函数返回,它就会被销毁。要么打印函数中的值,要么传递目标字符串并复制它。
我建议使用'string'类而不是char。
你去吧
#include<iostream>
#include <string.h>
using namespace std;
string func(char * str, char * str1){
char c[strlen(str1)], flag[strlen(str1)];
int i, j, k = 0;
for (i = 0; i < strlen(str1); i++) {
flag[i] = 0;
}
for (i = 0; i < strlen(str); i++) {
for (j = 0; j < strlen(str1); j++) {
if (str[i] == str1[j] && flag[j] == 0) {
c[k] = str[i];
k++;
flag[j] = 1;
break;
}
}
}
string s = c;
if (k != 0)
return s;
return NULL;
}
int main(){
char str[100], str1[100];
cin>>str>>str1;
cout<<func(str,str1);
return 0;
}
你也可以通过将'c'声明为静态来解决。但是'c'的长度应该是硬编码的。