【问题标题】:Passing strings from functions从函数传递字符串
【发布时间】:2017-05-02 14:50:11
【问题描述】:

我是编码新手,在我的大学里,我们目前正在学习 C 和 C++。

我的 C 代码有问题。我希望代码说明我输入日期时是一周中的哪一天。 CodeBlocks 出现多个错误。

我必须为“zeller 的一致性”做一个额外的函数。

我不太清楚如何从其他函数中获取字符串或字符。

在切换的所有情况下,我都会收到警告:“警告:赋值从没有强制转换的指针中生成整数”。 在我的主函数中,我收到警告:“警告:格式 '%s' 需要 'char *' 类型的参数,但参数 2 的类型为 'int' [-Wformat=]”

header.h

int ta, mo, ja, h ,q ,m ,k , j;
char zk(int, int, int) ;

main.c

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

int main()
{
int tt, mm, jj;
printf("Geben Sie das Datum ein: ");
scanf("%i %i %i", &tt, &mm, &jj);
printf("\n");
char *p = zk(tt, mm, jj);
printf("%s", *p);
return 0;
}

zellerskongruenz.c

#include <stdio.h>
#include <stdlib.h>
#include "header.h"

char zk(int ta, int mo, int ja)
{
if (mo == 1){mo = 13; ja--; }
if (mo == 2){mo = 14; ja--; }
q = mo;
k = ja % 100;
j = ja / 100;
h = ta + ((q+1)*13)/5 + k + k/4 + j/4 - 2*j;
h = h % 7;

char *wochentag;

switch(h)
{
case 0 : *wochentag = "Samstag"; break;
case 1 : *wochentag = "Sonntag"; break;
case 2 : *wochentag = "Montag"; break;
case 3 : *wochentag = "Dienstag"; break;
case 4 : *wochentag = "Mittwoch"; break;
case 5 : *wochentag = "Donnerstag"; break;
case 6 : *wochentag = "Freitag"; break;
} 

return wochentag;
}

我非常感谢任何试图帮助我的人。

【问题讨论】:

  • char zk(...改为const char * zk(...char *wochentag;改为const char *wochentag;,所有*wochentag改为wochentagprintf("%s", *p);改为printf("%s", p);
  • 而且,在 C 中最好是 int main(void)
  • 另外,在标头中定义的int ta, mo, ja 也是无用的,因为它们出现在zk() 的参数列表中并且因此被隐藏了。其余的h ,q ,m ,k , j; 最好在本地定义为zk(),至少从您显示的代码来看,不需要全局定义它们。

标签: c string function char


【解决方案1】:

字符串(字符数组)必须在函数参数之一中传回。 C约定是将输出参数放在左边,输入放在右边(模仿赋值语句从右到左的“移动”。因此:

void zk(char *wochentag, int ta, int mo, int ja)

另外,在 main 中,您应该声明一个字符数组,其中包含您可能返回的最大字符数。

int main()
{
    int tt, mm, jj;
    printf("Geben Sie das Datum ein: ");
    scanf("%i %i %i", &tt, &mm, &jj);
    printf("\n");
    char wochentag[64];  /* 64 is an arbitrary maximum */
    zk(wochentag, tt, mm, jj);
    printf("%s", wochentag);
    return 0;
}

另一个答案的建议是让函数传回一个字符指针可以在这种情况下工作,因为指针将指向一个应该在程序的全局段中的文字,因此不超出范围。然而,这并不能保证,而且非常危险。可以肯定的是,如果你想传回一个指针,最佳实践是指针指向的字符串,理想情况下应该声明为静态并全局放置(即在任何函数之外)。更好,更常见的约定是让调用者传入一个 char 数组,函数为调用者填充它。

【讨论】:

  • 感谢您的帮助。现在我可以修复我的代码了 :)
  • "必须将字符串(字符数组)传回 ...." 返回 char* 非常好。
  • 这里最基本的“必须”是定义接口指针指向const,因为它指的是字符串文字。
【解决方案2】:
printf("%s", *p);

这是main 出错的原因。 *p 的类型是 char 而不是 char * ,所以使用 %c 打印单个字符。如果要打印存储在p 中的完整字符串,请使用%s

第二个警告是关于这些 -

case 0 : *wochentag = "Samstag"; break;
         ^^^^^^^^^^^^^^^^^^^^^^

即使类型不匹配,您也不能这样做。

您应该将内存分配给wochentag,然后使用strcpy 复制字符串。

【讨论】:

  • 哇...我没有看到*,因为所有这些都在一行中似乎令人困惑。
  • @iharob 有点:)
  • 感谢您的帮助。现在我可以修复我的代码了 :)
【解决方案3】:

您的zk() 被声明为返回char,而您正试图将结果分配给char *

此外,由于您返回的是字符串文字,因此最好将函数声明为 const char *,而不是至少避免意外尝试修改非法的字符串。

也请参阅@ameyCU 的回答。

【讨论】:

  • 感谢您的帮助。现在我可以修复我的代码了 :)
猜你喜欢
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2018-08-05
  • 2011-05-12
  • 2018-07-21
相关资源
最近更新 更多