将代码放入函数时输出会发生变化

时间:2017-03-04 17:30:11

标签: c++ output

我有以下代码:

#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字符 这里的错误是什么?我不能像这样返回一个字符串数组吗?

2 个答案:

答案 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'的长度应该是硬编码的。