0

ここで、コードで次のことを試していて、次のerror---"prog.c:10:8: error: incompatible types when assigning to type ‘char[100]’ from type ‘char *’". char str[100]助けて、正しい答えを得るために初期化を変更する方法を教えてください

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

int main()
{

  char str[100];


  str = "a";
  str = str + 1;
  str = "b";
  str = str + 1;
  str = "c";
  str = str + 1;

  printf("%s", str - 2);
  return 0;    
}
4

8 に答える 8

0

strcpy/strncpy などの文字列コマンドを使用する必要があります。

または、メモリを割り当てて文字列に対応し、char ポインターのみを使用して、char 配列を使用しないようにすることもできます。

于 2013-07-24T10:59:45.590 に答える
0

str をポインタとしてではなく配列として扱います ( str100 文字に割り当てられたメモリ アドレスを指しstr[i]、 の相対メモリ アドレスにアクセスしますstr + i) 。

char str[100];

str[0]='a';
str[1]='b';
str[2]='c';
str[3]='\0';

printf("%s",str);
于 2013-07-24T11:00:23.747 に答える
0

配列とポインターは C では密接に関連していますが、完全に同じというわけではありません。

char str[100];

事前に割り当てられた 100 の配列への「const ポインター」のようなハンドルを提供しますcharstrこの配列はメモリ内の固定位置に存在するため、他の場所を指すことはできません。

 str="a";

"a"文字列の位置をポインタ「str」に割り当てます。(これは違法です!)。

できることは、配列内に値を割り当てることです。

char str[100] = {0};
str[0]='a';
str[1]='b';
str[2]='c';

printf("%s", str);
于 2013-07-24T11:00:39.043 に答える
0

一般に、このような文字の配列を作成するとき。

char string[100]; //allocate contigious location for 100 characters at compile time

ここで、文字列は連続した場所のベース アドレスを指します。メモリアドレスが4000から始まると仮定すると、次のようになります

 --------------------------------------
 |4000|4001|4002|4003|...........|4099|
 --------------------------------------

変数stringは4000を指します。4000 の値を格納するには、*(4000) を実行できます。

ここで次のようにすることができます

 *string='a'; //4000 holds 'a'
 *(string+1)='b'; //4001 holds 'b'
 *(string+2)='c'; //4002 holds 'c'

注:配列には、c の 3 つの形式のいずれからでもアクセスできます。

string[0] => 0[string] => *(string+0) => points to first element in string array
where
     string[0] => *(4000+0(sizeof(char))) => *(4000)
     0[string] => *((0*sizeof(char))+4000) => *(4000)
     *string => *(4000)

整数配列の場合、int が 4 バイトのメモリを使用すると仮定します。

int count[100]; //allocate contigious location for 100 integers at compile time

ここで、count は連続した場所のベース アドレスを指します。メモリアドレスが4000から始まると仮定すると、次のようになります

 --------------------------------------
 |4000|4004|4008|4012|...........|4396|
 --------------------------------------

変数countは4000を指します。4000 の値を格納するには、*(4000) を実行できます。

ここで次のようにすることができます

 *count=0; //4000 holds 0
 *(count+1)=1; //4004 holds 1
 *(count+2)=2; //4008 holds 2

したがって、コードに来ると、このように目的を達成できます。

#include<stdio.h>
#include<stdlib.h> 
int main()
{
   char str[100];
   *str='a';
   *(str+1)='b';
   *(str+2)='c';
   printf("%s",str);
   return 0;    
}
Output: abc
于 2013-07-24T12:11:16.720 に答える
0

あなたは間違った用語を使い続けているので、答えが見つからなかったのはそのせいだと思います。

/* 1 */
char str[100] = "a"; //OK

/* 2 */
str = "b"; // error: str is an array

初期化とは、変数を宣言するときに変数に値を割り当てるときに発生することです。これは、上記のソース コードの抜粋 1 です。

割り当ては、変数が宣言された後に行われます。構造体または配列型に代入することはできません。値を割り当てるときは、構造体/配列内の個々の項目に対処する必要があります。上記のコードの抜粋 2 では、変数strに値 "b" が割り当てられていますが、それstrは配列であるため、配列に割り当てることができないため、コンパイラはエラーがあると言います。

概要: 配列を初期化することはできますが、割り当てることはできません。違いは、変数が宣言されたときに明示的な値が与えられたかどうかです。そうであれば、変数は初期化されています。それ以外の場合は、配列に割り当てようとしていますが、これは実行できません。

于 2013-07-24T22:48:05.687 に答える
0

str[100] の初期化が必要な場合は、次を使用します。

char str[100] = "abc";

str[100] と初期化 str[100]を同時に定義した場合にのみ機能します!

または、次のようにコーディングできます。

char str[100];
str[0] = 'a';     
str[1] = 'b';
str[2] = 'c';
str[3] = '\0';

または :

char str[100];
*str = 'a';
 ++str;
*str = 'b';
++str;
*str = 'c';
++str;
*str = '\0';
于 2013-07-24T11:21:37.833 に答える
0

cを学んでいたときでさえ、多くの人があなたのように混乱していました.
実際には、これについて明確にする必要があります

「char []」と「char *」の違い

=>char []は、毎回同じアドレスを参照する定数ポインタです。しかし、その値は定数ではありません
=>char *は、任意の文字列を参照するように変更できる非定数ポインターです。その値も一定ではありませんが、a のアドレスが割り当てられている場合const char *、その値は になりますconst

あなたの質問に来ます

メソッドを使用するstring.h

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

int main()
{
    char string[100];
    char *str;

    *str = 'a';
    str = str + 1;
    *str = 'b';
    str = str + 1;
    *str = 'c';
    str = str + 1;

    printf("%s", str - 2);
    return 0;    
}
于 2013-07-24T11:21:45.970 に答える