字符串变量在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
中的原型。