Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么当我在打印语句被注释掉的情况下运行时会得到不同的结果?_C - Fatal编程技术网

C 为什么当我在打印语句被注释掉的情况下运行时会得到不同的结果?

C 为什么当我在打印语句被注释掉的情况下运行时会得到不同的结果?,c,C,我正在学习一些c语言的在线课程,我发现一个非常奇怪的结果。在下面的函数中,当我取消注释底部的printf语句时,我得到了正确的答案。然而,当我在没有printf()的情况下运行函数时,我得到的结果似乎是随机的 我正在另一个函数中打印此结果。我推测这可能与不将数组定义为其使用垃圾值有关,但我将在循环中遍历并设置这些值 string ciphercalc(string text, string key) { int length = strlen(text); char charac

我正在学习一些c语言的在线课程,我发现一个非常奇怪的结果。在下面的函数中,当我取消注释底部的printf语句时,我得到了正确的答案。然而,当我在没有printf()的情况下运行函数时,我得到的结果似乎是随机的

我正在另一个函数中打印此结果。我推测这可能与不将数组定义为其使用垃圾值有关,但我将在循环中遍历并设置这些值

string ciphercalc(string text, string key)
{
    int length = strlen(text);
    char characters[length + 1];
    characters[length + 1] = '\0';

    for (int i = 0; i < 26; i++)
    {
        if (text[i] < 65 || (text[i] > 90 && text[i] < 97) || text[i] > 122 )
        {
            characters[i] = text[i];
        }
        else if (text[i] < 95)
        {
            if (key[i] < 95)
            {
                characters[i] = key[i];

            }
            else
            {
                characters[i] = key[i] - 32;
            }
        }
        else
        {
            if (key[i] > 95)
            {
                characters[i] = key[i];

            }
            else
            {
                characters[i] = key[i] + 32;
            }
        }
    }

    string endchar = characters;
    //printf("%s", endchar);
    return endchar;
}
string ciphercalc(字符串文本,字符串键)
{
int length=strlen(文本);
字符[长度+1];
字符[长度+1]='\0';
对于(int i=0;i<26;i++)
{
如果(文本[i]<65 | | |(文本[i]>90&&text[i]<97)|文本[i]>122)
{
字符[i]=文本[i];
}
else if(文本[i]<95)
{
if(键[i]<95)
{
字符[i]=键[i];
}
其他的
{
字符[i]=键[i]-32;
}
}
其他的
{
如果(键[i]>95)
{
字符[i]=键[i];
}
其他的
{
字符[i]=键[i]+32;
}
}
}
字符串endchar=字符;
//printf(“%s”,endchar);
返回endchar;
}
谁能给我指出正确的方向吗

char characters[length + 1];
characters[length + 1] = '\0';
您可以访问的数组
字符的索引是从
0
length
而不是
length+1

因为在
for
循环中,使用
字符[i]
,将
i
0
添加到
26
,如果
长度<26
,则必须添加另一个条件:

int i;
for (i = 0; i < 26 && i < length; i++) {...}
OT,我猜您将字符串与
CS50
库一起使用。我建议您对C中的字符串使用
char
指针(
char*text
)或字符数组(
char text[]

作为@BilMorgan的答案,不建议返回本地值。您应该使用
字符
作为函数的参数,也可以使用字符指针:

char * characters = malloc(length + 1);
if(!characters) {return NULL;}
函数结束时返回它。请注意,您不需要像在代码中那样声明新字符串
endchar
<代码>返回字符就足够了

您的代码可以如下所示:

char * ciphercalc(char  *text, char *key) 
//  OR you want to use string type: char * ciphercalc(string  text, string key)
{
    size_t length = strlen(text);
    char *characters = malloc(length+1);

    //verify the return value of malloc function
    if(!characters) {return NULL;}
    int i;
    for (i = 0; i < 26 && i < length; i++) {
       // your code
    }

    characters[i] = '\0';
    return characters;
}
char*ciphercalc(char*text,char*key)
//或者要使用字符串类型:char*ciphercalc(字符串文本,字符串键)
{
尺寸长度=标准长度(文本);
字符*字符=malloc(长度+1);
//验证malloc函数的返回值
如果(!个字符){return NULL;}
int i;
对于(i=0;i<26&&i
返回指向局部变量“字符”的指针,该指针在返回时将无效。

不能从函数返回指向局部变量的指针。用于存储局部变量的内存在函数退出时自动释放,并可能被其他函数重新使用

动态分配内存:

char* characters = malloc(length + 1);
当不再需要时(可能在另一个函数中)释放:

或者,将输出数组与输入参数一起传递给函数:

void ciphercalc(string text, string key, char* characters, int max_characters)

您的函数在写入之前必须确保ouptut数组足够大。

如果不知道
string
是如何实现的,我们就无能为力了。这不是标准的C语言。@lordf这是一个行为未定义的非常糟糕的代码。不要使用这种课程。
字符[长度+1]='\0'这超出了分配的大小写入了1个字符,这只是几个问题中的第一个。@dxiv是吗?我已将大小定义为长度+1,然后将长度+1值指定为“\0”。我遗漏了什么吗?@lordf索引在C中从
0
开始。数组中的(有效)元素是从
字符[0]
字符[length]
。这有点让我费解。我刚刚开始学习C。我想你说的是,当我打印这个返回值“endchar”时,它没有携带“characters”的位置,所以它实际上是未定义的?。当我取消对print函数的注释时,它会存储enchar的值,然后在我使用此返回值时可以检索?返回值endchar指向字符,但当您从ciphercalc返回时,字符不再存在。您指向堆栈内存中可能包含任何内容的某个位置。printf调用只是随机更改堆栈内存中的内容对齐方式,因此它会意外地工作。google automatic variables vs static variables感谢您的解释。这是有道理的。我要读一读。
free(characters)
void ciphercalc(string text, string key, char* characters, int max_characters)