我该如何在我的C代码中将一个字符串返回给操作系统?

8
我是一名C语言初学者,这是我的C语言代码:
#include <stdio.h>
#include <stdlib.h>

main()
{
    printf("Hello, World!\n");
    return 'sss';
}

那会显示一个错误。那么我如何在C代码中返回一个字符串?

6
main必须返回一个int类型的值,不能有任何条件限制。你对这个字符串的期望是什么?(虽然这个“字符串”实际上是一个字符常量,因为它使用了单引号'作为分隔符而不是双引号") - James McNellis
1
一个错误?粘贴完全的错误消息。你期望发生什么,具体而言是什么? - Josh Lee
2
在 return 语句后面缺少一个分号,这很可能是错误的原因。从 main 函数返回 'sss' 在技术上可以工作(因为它是一个 int),但这绝对不是期望的结果。 - Jeremiah Willcock
1
这个问题需要澄清,这里的许多答案都假设你在问:“如何在C中将字符串返回给操作系统?” - Arafangion
2
可能是从函数返回C字符串的重复问题。 - Box Box Box Box
6个回答

12

如果您想从函数(除了main)中返回一个字符串,您应该像这样做。

#include <stdio.h>

const char * getString();

int main()
{
    printf("Hello, World!\n");
    printf("%s\n", getString());
    return 0;
}

const char * getString()
{
    const char *x = "abcstring";
    return x;
}

5
注意,字符串字面值是const类型 - 但编译器并不总是知道这一点! - Martin Beckett
@Martin Beckett,在声明之前加上 const 怎么样?比如 const char * - Thomson
@MartinBeckett,您所说的“但编译器并不总是知道这一点”是什么意思? - Pacerier
@Pacerier,据我所知,关于该函数退出时字符串占用的内存发生了什么,没有任何规则。它可能会根据您的架构位于只读程序段或数据内存中。因此,即使它“有效”,也不要依赖它。 - Martin Beckett
@MartinBeckett,你的意思是说当我们读取字符串(即行printf("%s\n", getString());)时,我们可能会得到垃圾数据? - Pacerier
谢谢!这对我很有帮助! - FlokiTheFisherman

4

关键是使用 static 关键字,这个关键字可以在函数结束后保留字符串的内存内容。(你可以把它看作是扩展变量的作用域。)

这段代码每次取一个字符,然后将它们连接成一个字符串并保存到文件中:

#include <stdio.h>
#include <conio.h>

char* strbsmallah ()
{
  static char input[50];
  char position = 0, letter;
  scanf("%c", &letter);
  while (letter != '~') { // Press '~' to end your text
    input[position] = letter;
    ++position;
    scanf("%c", &letter);
  }
  input[position] = '\0';
  char *y;
  y = (char*) &input;
  //printf("%s\n ", y);
  return y;
}

int main() {
  printf("\n");
  FILE *fp;
  fp = fopen("bsmallah.txt", "w+");
  fprintf(fp, strbsmallah());

  while (!_kbhit())
    ;

  return 0;
}

但是如果输入超过50个字符,它将覆盖内存。 - Peter Mortensen
什么是 _kbhit()?它是否只适用于特定的平台(比如,Windows)? - Peter Mortensen

2
您可以通过类似于scanf的方式来实现这一点。换句话说:
void foo(char **value_to_return) {
    *value_to_return = malloc(256); // Store 256 characters
    strcpy(*value_to_return, "deposited string");
}

int main() {
    char *deposit;
    foo(&deposit);
    printf("%s", deposit);
    return 0;
}

1

很遗憾,无法实现那样的操作。

您可以在 C 程序的结尾添加一些内容,例如:

int main()
{
    int err = 0; // 0 is "success" is most C programs
    printf("Hello, World!!\n");

    switch( err )
    {
      case 0:
        printf("Program shutdown successfully!\n");
        break;
      case 1:
        printf("We had an issue somewhere. Please fix your input data\n");
        break;
      //case 2, 3, etc...
    };

   return err;
}

1

你不返回一个字符串。应用程序以整数退出代码退出。

传统上,返回0表示应用程序没有错误/已完成。返回非0的整数表示应用程序异常退出。

你可以抛出异常并在调用堆栈中更高的日志记录方法中处理它,或者你可以返回其他值,并确保在发布说明中记录每个错误整数的含义。


-1

你可能可以使用环境变量来实现。不过我不确定。


也许可以去查一下并更新你的回答(不要在评论区更新)? - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接