【问题标题】:Returning a string in C without pointers?在没有指针的情况下返回C中的字符串?
【发布时间】:2012-12-07 10:43:23
【问题描述】:
#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],因为它只是一个示例。

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

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

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

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

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

【问题讨论】:

  • 确实我没有明确提出这个问题。这里的问题主要是关于字符串如何返回,不需要使用return
  • read_string() 中的这一行很奇怪:(prompt, stdout);。它评估prompt 并将其丢弃;然后它评估stdout 并将其也扔掉。可以省略代码而不改变程序的外部行为。
  • 这实际上是我的一个错误,我的意思是把 fputs(prompt,stdout);

标签: c string pointers return


【解决方案1】:
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 会将换行符读取到您可能想要删除的缓冲区中。

【讨论】:

  • 唯一的功能就是显示你在函数的第一个参数中输入的任何字符串(在这种情况下是“你想要返回的字符串”)
  • 我看到的主要问题之一与数组声明符有关,我也会阅读它们。感谢您为我澄清了关于这件事的一些要点。
【解决方案2】:

在 C 中,您不能真正将数组作为参数传递给函数。当您调用read_string("String you want to return ", string[0], sizeof string[0]); 时,真正发生的是read_string 的数组参数是别名。这意味着当read_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];

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

    • 所以让我尝试正确理解这一点,基本上该函数是将结果写入我指出的内存位置,即 string
    • 或多或少。 C 中的数组和指针是紧密相连的。字符字符串[10];等同于 char* string = malloc(10);您的变量“字符串”实际上是指向数组中第一个字符的指针。
    猜你喜欢
    • 1970-01-01
    • 2017-06-04
    • 1970-01-01
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 2015-04-20
    • 1970-01-01
    相关资源
    最近更新 更多