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