-1
#include <stdio.h>
#include <string.h>

char Jones(char, char);

int main() {
    char name[]="Andrew";
    char surname[]="Jones";
    char result[80];
    result=Jones(name, surname);
    puts(result);
    return 0;
}

char Jones(char name, char surname)
{
    char result[80];
    int length;
    length = strlen(surname);
    for (int i=0; i<50; i++) 
    {
        result[length+i] = name[i];
    }
    return result;
}

プログラムがコンパイルされず、理由がわかりません。2 つの文字列を読み取り、それらの場所を交換することになっています。たとえば、表示されるはずです。「ジョーンズ・アンドリュー」。

4

4 に答える 4

2

ここに 1 つの問題があります。

char name[]="Andrew";
char surname[]="Jones";
char result[80];
wynik=Jones(name, surname);

これはJones()文字配列 (文字ポインターに減衰します) を使用して呼び出しますが、関数は単一の文字のみを受け入れるように宣言されています。

char *name, char *surname実際には文字列を期待しているように見えるので、関数を take に変更する必要があります。

さらに、 で行っているように文字配列を返すことはできませんJones()。C で文字列を操作する方法についてかなり読む必要があります。

また、wynik宣言されていないように見えるため、ビルドに失敗することもあります。

于 2013-01-04T09:50:17.273 に答える
1

いくつかのエラーがあります:

char Jones(char, char);

これは、文字列に必要な char * ではなく、単一の文字のみを取ります。

result=Jones(name, surname);

ここで結果は配列です。C では、配列に割り当てることはできません。

char Jones(char name, char surname)
{ char result[80];
...
return result;
}

resultここでは、ローカル変数を返します。ただし、文字列を返すには、char* を返す必要があります。しかし、その char* は Jones 関数内のローカル変数を指し、関数が終了すると無効になります。1 つの解決策は、呼び出し元が所有する結果を書き込むバッファーを渡すことです。確実な名前と名前を組み合わせるアルゴリズムも間違っています。確実な名前では何もしません。

これを行う必要があります:

char *Jones(char*, char* , char *);

int main() {
  char name[]="Andrew";
  char surname[]="Jones";
  char result[80];
  char *p;
  p = Jones(name, surname, result);
  puts(p);
  return 0;
}

char *Jones(char *name, char *surname, char *result)
{ 
  int length;
  int i,k;
  length = strlen(surname);
  for (i=0; i<length ; i++) 
  {
    result[i] = surname[i];
  }
  result[i++] = ' '; //add a space

  length = strlen(name);
  for (k=0; k<length ; k++, i++) 
  {
    result[i] = name[k];
  }    
 result[i] = 0; //add nul terminator to end the string
 return result;
}

連結は、多くの方法で単純化できます。

strcpy(result, surename);
strcat(result, " ");
strcat(result, name);

または、ジョーンズ関数で次のことができます。

 sprintf(result, "%s %s", surename, name);

いずれの場合も、バッファ内に収まらない何かを渡すと、結果バッファを簡単にオーバーフローさせるため、関数はかなり脆弱ですresult

于 2013-01-04T09:52:44.837 に答える
0
#include <stdio.h>
#include <string.h>

char* Jones(char*, char*);

int main() {
char name[]="Andrew";
char surname[]="Jones";
puts(Jones(name,surname));
return 0;
}

char* Jones(char *name, char *surname)
{
    strcat(surname," ");
    strcat(surname,name);
    return surname;
}
于 2013-01-04T11:07:33.353 に答える
0

1) nameandsurnameは char 配列であり、単一の char ではないため、関数Jones()の入力パラメーターの型を変更する必要があります。入力パラメーターの型はchar name[](char 配列) またはchar *name(char の配列へのポインター) にする必要があります。

2) 関数内でローカルに静的に定義された配列を返すことはできません。関数から文字列を返したい場合は、文字列は定数であるか、関数に動的に割り当てられたバッファである必要があります(malloccalloc、 を使用realloc)。どちらの場合も、関数の型char *Jonas()char Jonas()

resultまたは、入力パラメーターを介して配列を渡すことができます。この場合、それを関数に入力できます。

void Jones(char *name, char *surname, char *result)

そして主に:

char result[80];
Jones(names, surname, result);

3) 次のforループには何かが欠けています

for (int i=0; i<50; i++) 
{
   result[length+i] = name[i];
}

配列が初期化されていないため、result要素から要素0への要素lengthにはガベージが含まれています。resultそのためprintfresult配列を使用すると、ガベージが出力されます。配列内の0~の間の要素を開始する必要がありますlengthresult

于 2013-01-04T10:05:06.683 に答える