从函数传递字符串

时间:2016-12-16 18:45:00

标签: c string function char

我是编码新手,在我的大学,我们目前正在学习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;
}

我非常感谢那些试图帮助我的人。

3 个答案:

答案 0 :(得分:1)

您宣布zk()返回char并且您正在尝试将结果分配给char *

另外,因为你正在返回字符串文字,所以最好将函数声明为const char *,而不是至少避免意外地尝试修改非法的字符串。

另见@ ameyCU的答案。

答案 1 :(得分:1)

printf("%s", *p);

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

第二个警告是关于这些 -

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

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

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

答案 2 :(得分:0)

必须在其中一个函数参数中传回字符串(字符数组)。 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;
}

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