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

1

你已经声明了一个数组

char str[100];

通过指定数组的名称,您将获得与第一个元素的地址相同的数组的基地址。

str="a";

在上面的语句中,您试图将“a”(注意“a”在这里是字符串)地址分配给数组基址。编译器不允许您这样做。因为,如果你这样做,你将失去所有 100 个元素。

如果要为第一个元素分配值“a”,请执行

str[0] = 'a';

请注意,我使用了单引号。记住“单个字符的单引号”

于 2013-07-24T11:30:31.147 回答
0

您必须使用 strcpy/strncpy 等字符串命令。

或者您可以分配内存来容纳字符串并仅使用 char 指针,而不使用 char 数组。

于 2013-07-24T10:59:45.590 回答
0

将 str 视为数组而不是指针(str指向分配给 100 个字符的内存地址并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];

为您提供一个类似于“const 指针”的句柄,指向一个预先分配的 100 chars 数组。该数组将位于内存中的固定位置,因此您不能str指向其他位置。

 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

你坚持使用错误的术语,这让我相信这就是你找不到答案的原因。

/* 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 回答
0

通常,当您创建这样的字符数组时。

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

这里的字符串将指向连续位置的基地址。假设内存地址从4000开始,那么它会像

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

变量字符串将指向4000。要将值存储在 4000,您可以执行 *(4000)。

在这里你可以这样做

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

注意:数组可以通过 c 中的三种形式中的任何一种来访问。

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 占用 4bytes 内存

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 回答