0
#include <stdio.h>

void read_string(char prompt[], char returned[], int MAX)
{
fputs(prompt, stdout);
fflush(stdin);
fgets(returned, MAX, stdin);
}

main()
{
    char string[0][10];

read_string("String you want to return ", string[0], sizeof string[0]); 

printf("The returned string is %s",string[0]);

fflush(stdin);
getchar();

}

这段代码来自我做的一个练习(修改),只是表明我不能很好理解的代码行。它假设在循环中返回各种字符串,因此我只是声明了 STRING [0] [100],因为它只是一个示例。

好吧,我知道变量“string”像这个string =返回一样进入函数然后从键盘(fgets)获取字符串后它如何返回main(),我的意思是它真的返回并隐式执行此操作? 返回=字符串

编译器在编译时也会给我这个消息(虽然它在运行时确实返回了一个字符串)

[警告] 不推荐将字符串常量转换为 'char*' [-Wwrite-strings]

我是学习函数及其结构的新手,我还没有看到指针,但是从我目前所读的内容来看,您需要指针来返回字符串。请原谅任何严重的错误及其编写不佳的代码,我非常感谢有关解决此问题的任何指导。

这里的问题主要是关于字符串如何返回,而不需要使用return,我的意思是字符串被保存在名为“returned”的变量中,但它如何摆脱它,并回到 main 中。

4

3 回答 3

4
char string[0][10];

声明一个长度为零的二维数组。在 C 中使用零长度数组是非法的。

6.7.5.2 数组声明符

如果它们分隔了一个表达式(它指定了一个数组的大小),则该表达式应为整数类型。如果表达式是常量表达式,它的值应大于零。

不知道(prompt, stdout);应该做什么。

您正在传递一个零长度并尝试写入它。


请注意, fflush(stdin)在 C 中是未定义的行为。

如果我理解正确,您想在提示中显示第一个字符串并读取另一个字符串并返回它。

#include<stdio.h>

void read_string(char prompt[], char returned[], int MAX)
{
fputs(prompt, stdout);
fgets(returned, MAX, stdin);
}

int main()
{
char string[10];

read_string("String you want to return ", string, sizeof string); 
printf("The returned string is %s",string);
getchar();

return 0;
}

请注意,fgets将换行符读入您可能想要剥离的缓冲区。

于 2012-12-20T00:05:25.130 回答
1

在 C 中,您不能真正将数组作为参数传递给函数。当您调用read_string("String you want to return ", string[0], sizeof string[0]);时,真正发生的是数组参数read_string别名。这意味着 if 和 whenread_string修改promptreturned调用者的第一个或第二个 ( string[0]) 参数字符串也被修改。这样read_string就可以将字符串返回给调用者。

这也可能会咬你,例如,如果read_string尝试修改prompt数组(如prompt[0] = 'X'),它也会尝试修改"String you want to return ". 在标准 C 中,修改这样的字符串文字会产生未定义的行为。许多编译器会将这种字符串文字放在只读内存中,这将中止您的程序。

请注意,该行char string[0][10];无效,因为 C 不支持 0 大小的数组。你想要char string[1][10];

于 2012-12-20T09:52:56.523 回答
0

我认为 KingsIndian 已经指出您的代码中存在一些不同的问题。我也从未见过(prompt, stdout);以前使用过的语法。

关于返回的字符串。他们不是。您正在声明一个字符数组,然后将 this 的指针传递给 function_read 字符串。这是将其结果写入该内存位置。

所以你的原始字符串(可能是空值或垃圾)被用户输入覆盖:)

于 2012-12-20T00:17:14.940 回答