gpt4 book ai didi

c - 使用C语言从函数返回字符串

转载 作者:行者123 更新时间:2023-11-30 15:17:07 26 4
gpt4 key购买 nike

这是我第一次学习C语言。我只想问一下如何在C中返回一个字符串。这就是我在做什么。

int main()
{
char input[1] = "";
input = setChar();
printf("%s",input);
}

char *setChar()
{
char *character;
printf("Enter a new character.\n");
scanf("%s", &character);
return character;
}


编辑:所以基本上我想拥有一个将返回字符串或字符值的方法,该方法将从主方法中更改字符串或字符的值。这可能吗?

最佳答案

实际上不可能返回字符串,因为字符串是适合模式的一系列值。我们将该值序列存储到一个类型(通常为字符数组)中,并且返回的就是该类型(或指向该类型的指针)。

您的函数通常会返回一个指向字符串的指针,这可能就是您要问的问题……现在,我可以看到您的实际目标是,我可以从一开始就为您提供更好的指导只是指出您发布的程序出了什么问题。


  但是我需要使用char返回类型并且没有参数。那可能吗?就像“ char * setChar()”


我在this answer中编写了一些代码。利用该代码,您可以编写如下函数:

cbar *setChar() {
return get_dynamic_word(stdin);
}


使用该代码,您的 main函数应类似于:

int main(void) {
char *input = setChar();
if (input == NULL) {
exit(EXIT_FAILURE);
}

printf("%s", input);
free(input);
}




该程序有些错误。让我们一次将它们标识为一行。


int main()



尽管这通常可能会起作用,但它并不能为独立的环境(您的操作系统)提供特定的原型。用C标准的话来说,


  不属于该函数定义的一部分的函数声明器中的空列表指定不提供有关参数数量或类型的信息。


即使没有使用最严格的指示警告应该为错误的标志进行编译,也可以通过缺少错误消息来最好地证明此概念:

int main() {
return main(42, 42, 42, 42, 42);
}


那么,它将选择这两个原型中的哪一个(或等价的)?


int main(void) { /* ... */ }

int main(int argc, char *argv[]) { /* ... */ }



从技术上讲,行为是不确定的。

关于未定义行为的简要说明:有些人会写道,可能会发生“崩溃”。将未定义的行为定义为“崩溃”是错误的说法;正如您所期望的,这可能会很好地工作,但这不是C标准的要求。因此,如果您更改了编译器,或更改了OS,或者发生了其他细微的变化(例如用户输入),则可能会开始看到程序故障。

您可能应该坚持之前提到的 main的两个原型之一。

显然,顺便说一句,您可能没有从书中学习。 K&R(第二版)经过了数十年的尝试和测试,并被证明可以成功地教数千名学生。确保进行练习。




char input[1] = "";



字符串是一个字符序列,其终止于第一个 '\0'(又称 0,不要与通常为 '0'48混淆(请参见引号))。您可能会注意到,如果 printf("%d\n", input[0]); input中的第一个(也是唯一的)字符被初始化为 0

您可以在 input中存储多少个字符值?仅一个,因为您已经声明它只是一个字符。这意味着您只能在该数组中存储一种字符串:空字符串。

当您决定使存储该字符串的 char数组需要多长时间时,需要适应字符串的零(零)终止。如果将 input声明为 char input[256];(在其他答案中),则 input可以存储255个非零字符,后跟1个零字符以终止字符串。




input = setChar(input);



从技术上说,这行代码违反了约束。您的编译器应产生一条错误消息。您不能像这样分配给数组。不用担心,这很容易解决,因为返回值是多余的。您的函数直接修改数组。使用它代替:


setChar(input);






printf("%s",$input);



您尚未声明任何此类标识符 $input,实际上,由于C标准不需要源字符集中存在 $字符,因此这样做是错误的。我想你打算写这个:


printf("%s", input);






scanf("%s", &c);



这有两个问题:


scanf返回非1的任何值时,可能会发生IO错误,并且 c可能不包含字符串(这意味着您不应撒谎 printf并告诉它打印非字符串,就好像它是一个字符串...请参阅我关于未定义行为的说明)。不要忽略 scanf的返回值。曾经
格式指令 %s告诉 scanf您提供的参数是 char *,但是在 &上使用 char *运算符会产生 char ** ...您在说谎< cc>,这也是未定义的行为。


您可能打算写类似:

int x = scanf("%s", c);
if (x == 1) {
return c;
}
else {
return NULL;
}


这将给您返回值一个目的:您可以确定调用该函数是否成功:

char *str = setChar(input);
if (str == NULL) {
/* An error occured */
}
else {
/* c -should- contain a string */
}


我说它应该包含一个字符串,因为在某些情况下可能没有。其他人提到了缓冲区溢出的问题。通过告诉 scanf数组有多大可以避免这些情况,在这种情况下可以保证字符串:

char input[256];
int x = scanf("%255s", input);


如果一个特定的单词(由于 scanf读取单词)超过255个字符,会发生什么问题。 %s将停止阅读,剩下的单词将留待下一次调用 scanf(或 scanf或其他)进行处理。如果您想舍弃该单词的其余部分,可以在上面的代码后面加上以下代码:

scanf("%*[^ \n\t]");
puts("NOTE: Input truncated!");

关于c - 使用C语言从函数返回字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32675678/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com