Avatar billede nomak Nybegynder
23. april 2003 - 20:02 Der er 13 kommentarer og
2 løsninger

funktion der returnere char (C)

Hey C-Eksperte - mig igen ;)

kender til int func(int blah) og void.. men hvordan laver man en funktion der returnere en char?
Avatar billede soreno Praktikant
23. april 2003 - 20:05 #1
Én char:
char foo(..)

Et chararray:
char* foo(..)
Avatar billede soreno Praktikant
23. april 2003 - 20:08 #2
Men du skal passe på..

char* foo()
{
  char test[12];
  strcpy(test, "foo");
  reutnr test;
}

vil give problemer, da test går ud af scope når metoden forlades. Så vil returnværdien pege på garbage.

En smartere måde er:
void foo(char *buffer)
{
  strcpy(test, "foo");
}
Avatar billede soreno Praktikant
23. april 2003 - 20:10 #3
nederste bruges sådan:

char buffer[80];
foo(buffer);
printf("%s", buffer);
Avatar billede nomak Nybegynder
23. april 2003 - 20:13 #4
funktionen skal kunne returnere en text-streng..

altså
printf("%s\n", foo());

så skal den udskrive fra funktion foo()
Avatar billede soreno Praktikant
23. april 2003 - 21:28 #5
#include <stdio.h>
#include <string.h>

char* foo()
{
    char *buffer = "hejsa verden\n";
    return buffer;
}

char* foo2()
{
    char buffer[80];
    strcpy(buffer, "hejsa ");
    strcat(buffer, "verden\n");
    return buffer;
}

int main(void)
{
    printf("%s", foo());
    printf("%s", foo2());
   
    return 0;
}

output:
c:\Documents and Settings\Administrator\Dokumenter\cpp\skabeloner\c>make
gcc -c "main.c" -s
main.c: In function `foo2':
main.c:15: warning: function returns address of local variable
gcc -o "main.exe" "main.o" -s

c:\Documents and Settings\Administrator\Dokumenter\cpp\skabeloner\c>main
hejsa verden
P "

foo2 går galt fordi der returneres en adresse som går ud af scope (som compileren også fortæller) - lad være med at bruge metoden efter det princip!
Avatar billede soreno Praktikant
23. april 2003 - 21:30 #6
Jeg ville selv bruge:
void foo3(char *buffer)
{
    strcpy(buffer, "hejsa ");
    strcat(buffer, "verden\n");
}

    char buffer[80];
    foo3(buffer);
    printf("%s", buffer);
Avatar billede nomak Nybegynder
23. april 2003 - 22:16 #7
okay, jeg vil gerne lave en funktion der udfører en sql kommando - og returnere en text streng hvis der er en..

her er hvad jeg har..

#include.....
int main(void) {
  char *sqlout
  do_sql(sqlout, "UPDATE ....");
  printf("%s", sqlout);
}

void do_sql(char *sqlout, char *query) {
  //gør sql ting.. det er ikke et problem
  strspy(sqlout, variabelDerIndeholderSqlReturnering);
}

det giver en fejl..

server.c:176: warning: type mismatch with previous implicit declaration
server.c:41: warning: previous implicit declaration of `do_sql'
server.c:176: warning: `do_sql' was previously implicitly declared to return `int'
Avatar billede soreno Praktikant
23. april 2003 - 22:19 #8
Umiddelbart efter hvad jeg lige kan se så har du kun erklæret en pointer til en char. Du har ikke allokeret plads..

char *sqlout

skal ændres:
char sqlout[256];
Avatar billede nomak Nybegynder
23. april 2003 - 22:22 #9
giver stadig det samme :/

warning: `do_sql' was previously implicitly declared to return `int' <- hvad betyder det?
Avatar billede soreno Praktikant
23. april 2003 - 22:23 #10
Der står sikkert:
int do_sql(char *sqlout, char *query);

øverst i din kode..

ret til
void do_...
Avatar billede nomak Nybegynder
23. april 2003 - 22:24 #11
det gør der ikke... :-/
Avatar billede soreno Praktikant
23. april 2003 - 22:26 #12
Post lidt mere kode, gerne linierne 170-180 og 35-45
Avatar billede nomak Nybegynder
23. april 2003 - 22:39 #13
char sqlbuf[4000];
    do_sql(sqlbuf);
        printf("%s", sqlbuf);


void do_sql(char *buffer)
{
    strcpy(buffer, "hejsa ");
    strcat(buffer, "verden\n");
}
Avatar billede segmose Nybegynder
24. april 2003 - 08:41 #14
Du bruger do_sql (i main, linie 41) før du erklære den (under main, linie 176), hvilket betyder at compileren antager at do_sql er erklæret som:

int do_sql(void)

og ikke som du har

void do_sql(char *buffer) // i linie 176

løsning, indsæt

void do_sql(char *buffer);

før main, eller lad være med at skrive main øverst, i min personlig mening skal main altid stå som det sidste i kildefilen. Og som soreno skriver vær sikker på at du har en buffer med nok plads allockeret før du forsøger at bruge det.
For ikke at tale om at du burde lave en masse checks om du risikere buffer overrun, dvs. skrive mere ind i buffer end der er plads til (med mindre du beviser at der ikke kan forekomme buffer overrun i dit program).
Avatar billede nomak Nybegynder
24. april 2003 - 09:15 #15
okay, det havde jeg så ingen anelse om :-/ men tak
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester