5

文字列の最初の文字を削除して残りを保持しようとしていますが、現在のコードはコンパイルされず、修正方法について混乱しています。

私のコード:

char * newStr (char * charBuffer)
{
    int len = strlen(charBuffer);
    int i = 1;
    char v;
    if(charBuffer[0] == 'A' || charBuffer[0] == 'Q'){
        for(i=1;i<len;i++)
            v = v + charBuffer[i];
    }
    v = v + '\0';
    return v;
}

Gcc: "警告: return はキャストなしで整数からポインターを作成します"

また、「char * newStr (char * charBuffer)」は同じままにする必要があります。

4

5 に答える 5

8

Cでは、文字列はこのようには機能しません。バッファ内のすべての文字を合計してv変数に入れます。+を使用して連結することはできません。あなたが投稿したコードにはいくつかの深刻な問題があり、Cの使用方法に理解のギャップがあることを示しています。

これを試して:

char * newStr(char * charBuffer){
  int length = strlen(charBuffer);
  char * str;
  if(長さ<= 1){
    str =(char *)malloc(1);
    str [0] ='\ 0';
  } そうしないと {
    str =(char *)malloc(length);
    strcpy(str、&charBuffer [1]);
  }
  strを返します。
}

またはこれ:

char * newStr(char * charBuffer){
  char * str;
  if(strlen(charBuffer)== 0)
    str = charBuffer;
  そうしないと
    str = charBuffer + 1;
  strを返します。
}

新しい文字列を割り当てるかどうかによって異なります。また、「Q」または「A」で始まらないケースを処理するためのコードを追加する必要があります。あなたがここで何をしようとしているのか正確にはわからないので、私はそれらを含めませんでした。

mallocとfreeを使用して、メモリの割り当てと割り当て解除について調査してください。これらは、Cプログラミングを行う場合に使用できる基本的な関数です。

于 2010-07-28T19:20:36.447 に答える
2

さて、あなたの説明では、「文字列」を処理したいと言っていますが、char バッファー/ポインターを処理するコードを記述しています。文字列の最初の文字を削除する最も簡単な方法は次のとおりです。

const char *newStr(const char *string)
{
    return string+1;
}

しかし、それはあなたのコードが行っていることのようには見えないので、おそらく何か違うものが欲しいでしょう. たとえば、先頭の 'A' または 'Q' を削除して、文字列をバッファにコピーする場合は、次のようにします。

char *newStr(const char *string)
{
    if (string[0] == 'A' || string[0] == 'Q')
        string++;
    return strdup(string);
}
于 2010-07-28T19:24:04.833 に答える
-1

次の場所でcharポインタを1文字移動するだけです。

char* newstring = oldstring + 1;
于 2010-07-28T19:16:52.877 に答える
-1

関数はchar*を返すように宣言されており、charを返しています。

さらに、2番目の文字へのポインタを返してみませんか?

char * newStr (char * charBuffer)
{
   if (charBuffer && (*charBuffer == 'A' || *charBuffer == 'Q')) return charBuffer + 1;
   return charBuffer;
}
于 2010-07-28T19:17:00.587 に答える
-1

他の回答のいくつかは、戻ることを推奨してcharBuffer + 1いました。以前のコメントで指摘したように:

これは悪い習慣です。文字列が動的に割り当てられた場合はどうなりますか? おそらく最終的にストレージは解放されます (2 番目の文字から開始)。最初に文字列を新しいストレージにコピーする必要があります。

ストレージの一部を途中から解放すると、未定義の動作が発生します。

代わりにstrdup、指定された文字列の複製を返す関数を試してください。

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

char *newStr(char* charBuffer) {
    if (charBuffer && (charBuffer[0] == 'A' || charBuffer[0] == 'Q'))
        return strdup(charBuffer + 1);
    else 
        return strdup(charBuffer);
}

void main() {
    char a[7] = "Advait";
    char b[5] = "John";
    printf("%s\n",newStr(a));   // Prints "dvait"
    printf("%s\n",newStr(b));   // Prints "John"
}
于 2010-07-28T19:31:08.127 に答える