字符串变量在C中没有正确返回
我一直在尝试创建一个函数,字符串变量在C中没有正确返回,c,string,function,return,return-value,C,String,Function,Return,Return Value,我一直在尝试创建一个函数,is_isogram,返回一个按字母顺序排列的字符串值。当我通过函数从main传递值时,要返回的变量被设置为正确的值 但是,当我从函数返回变量时,它不会在main中返回任何内容。与此同时,当我初始化变量以在main中保存返回值时,无法读取内存会出现错误 #include <stdbool.h> #include <ctype.h> #include <stddef.h> #include <stdint.h> #inclu
is_isogram
,返回一个按字母顺序排列的字符串值。当我通过函数从main
传递值时,要返回的变量被设置为正确的值
但是,当我从函数返回变量时,它不会在main
中返回任何内容。与此同时,当我初始化变量以在main
中保存返回值时,无法读取内存
会出现错误
#include <stdbool.h>
#include <ctype.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <Windows.h>
#include "isogram.h"
char is_isogram(char phrase[])
{
int i;
for (i = 0; phrase[i]; i++) {
tolower(phrase[i]);
}
if (phrase == NULL) {
return false;
}
char temp;
int count1;
int count2;
char *alphabet = (char *)malloc(sizeof(char) * (strlen(phrase) + 1));
int n = strlen(phrase);
for (count1 = 0; count1 < n - 1; count1++) {
for (count2 = count1 + 1; count2 < n; count2++) {
if (phrase[count1] > phrase[count2]) {
temp = phrase[count1];
phrase[count1] = phrase[count2];
phrase[count2] = temp;
alphabet = phrase;
break;
}
}
}
return alphabet;
}
变量bet
在访问函数之前抛出错误。它告诉我它无法读取内存,bet
的值在程序的其余部分接近NULL
总之,当从函数本地返回时,程序不会给出“abb”值,也不会将变量保存在内存中。它向变量中抛出垃圾,但该变量被终止,并且无法在
main
中充分初始化新变量。代码中存在多个问题:
#include <stdbool.h>
#include <ctype.h>
#include <stddef.h>
#include <stdint.h>
#include <string.h>
#include <stdio.h>
#include <Windows.h>
#include "isogram.h"
char is_isogram(char phrase[])
{
int i;
for (i = 0; phrase[i]; i++) {
tolower(phrase[i]);
}
if (phrase == NULL) {
return false;
}
char temp;
int count1;
int count2;
char *alphabet = (char *)malloc(sizeof(char) * (strlen(phrase) + 1));
int n = strlen(phrase);
for (count1 = 0; count1 < n - 1; count1++) {
for (count2 = count1 + 1; count2 < n; count2++) {
if (phrase[count1] > phrase[count2]) {
temp = phrase[count1];
phrase[count1] = phrase[count2];
phrase[count2] = temp;
alphabet = phrase;
break;
}
}
}
return alphabet;
}
- 函数
被定义为返回一个is_isogram()
,它应该返回一个字符串,因此键入char
char*
尝试修改其参数指向的字符串。由于它是用is_isogram()
中的字符串文本调用的,因此它具有未定义的行为,可能导致程序崩溃main
- 为字母表分配内存,但在排序循环中将此指针重置为短语
- 比较
并不像您认为的那样bet=='abb\0'
应该是一个bet
并且应该使用char*
来比较字符串值strcmp()
#include <ctype.h>
#include <string.h>
#include <stdio.h>
char *is_isogram(const char *phrase) {
char *alphabet;
int count1, count2, n;
if (phrase == NULL)
return NULL;
alphabet = strdup(phrase);
n = strlen(alphabet);
for (count1 = 0; count1 < n; count1++)
alphabet[count1] = tolower((unsigned char)alphabet[count1]);
for (count1 = 0; count1 < n - 1; count1++) {
for (count2 = count1 + 1; count2 < n; count2++) {
if (alphabet[count1] > alphabet[count2]) {
char temp = alphabet[count1];
alphabet[count1] = alphabet[count2];
alphabet[count2] = temp;
}
}
}
return alphabet;
}
int main(void) {
char *bet = is_isogram("bab");
if (strcmp(bet, "abb") == 0) {
return 0;
} else {
return -1;
}
}
#包括
#包括
#包括
char*是_等值线(const char*短语){
字符*字母表;
int count1,count2,n;
if(短语==NULL)
返回NULL;
字母表=标准单词(短语);
n=strlen(字母表);
对于(count1=0;count1字母表[count2]){
字符温度=字母表[计数1];
字母表[count1]=字母表[count2];
字母表[计数2]=温度;
}
}
}
返回字母表;
}
内部主(空){
char*bet=is_等值线(“bab”);
if(strcmp(bet,“abb”)==0){
返回0;
}否则{
返回-1;
}
}
注意函数上的返回类型char是同构图(char phrase[])
<代码>如果(bet=='abb\0')也不起作用。您应该看到这些内容的编译警告。如果没有,是时候学习提高警告级别了。旁白:请注意tolower(短语[i])代码>返回一个您忽略的值。它不会改变传递给它的值。尝试短语[i]=tolower(短语[i])代码>在字母表=短语中
您正在覆盖malloc
提供给您的内存指针。不要这样做。sizeof(char)
定义为1。函数是isogram()
被声明为返回char
,而不是char*
。语句alphabet=phrase
几乎肯定是一个错误。请注意编译器警告。函数char是_isogram(char短语[])
必须返回char
,但返回字母表
正在返回char*
。使用此代码时,我收到一个错误:error C2040'is_isogram':'char*(const char*)
与'char(char*)在间接寻址级别上不同。当我将其编辑为具有不同的间接寻址级别并删除星号时,会出现读写错误。发生这些错误的原因是函数声明char*is_isogram(const char*phrase)
中的间接性。请帮助我理解为什么会发生这种情况。我更改了char*is_isogram(const char*phrase)
的原型:它接受一个它不修改的字符串,并返回一个分配的副本,其中的字母按字母顺序排序,或者更准确地说按字典顺序排序。必须相应地更新isogram.h
中的原型。