【问题标题】:String input in C issue [duplicate]C问题中的字符串输入[重复]
【发布时间】:2018-01-18 16:54:48
【问题描述】:

我试图在一个字符串数组中分配两个字符串,但编译器不允许我这样做

typedef char string[20];
    string dizionario[2];

    dizionario[0] = "ergbeciao";
    dizionario[1] = "ciaozio";

【问题讨论】:

  • 您需要使用strcpy
  • 好的,但是为什么我的编译器不接受这种方式呢?
  • OT,但typedef char string[20]; 是一个非常糟糕的主意,它可能会让你相信它神奇地创建了一个真正的字符串类型,但事实并非如此,它只会增加混乱。
  • 如果包含导致“不会让我这样做”的错误消息,则发布会更有用。搜索可以找到这篇文章。

标签: c string


【解决方案1】:

试试

string dictionary[2] = {"Item1", "Item2"}

【讨论】:

  • Yh 刚刚更新了我的答案@MichaelWalz
【解决方案2】:

在声明时初始化数组变量。在您的程序中,您使用的是 char 数组的双重维度。我希望您能理解并且它会起作用

#include<stdio.h>
int main()
 {
    typedef char string[20];
    int i;
    string dizionario[2]={ "ergbeciao", "ciaozio"};
    for (i=0;i<2;i++)
      { 
        printf("\nSting i :%s",i,dizionario[i]);
      }
  }

输出

字符串 0 : ergbeciao
字符串 1:ciaozio

【讨论】:

    【解决方案3】:

    如果您将 string 的定义更改为更有用的内容,您的代码就可以工作:

    typedef const char *string;
    
    int main() {
        string dizionario[2];
    
        dizionario[0] = "ergbeciao";
        dizionario[1] = "ciaozio";
    }
    

    请注意,文字字符串 ("ergbeciao") 是不可变的

    【讨论】:

      【解决方案4】:

      您不能使用= 运算符将一个字符串(或任何数组类型)的内容复制到另一个;您必须改用 strcpy 库函数:

      strcpy(dizionario[0], "ergbeciao");
      strcpy(dizionario[1], "ciaozio");
      

      这是 C 如何处理数组表达式的函数。

      首先也是最重要的是,数组表达式可能不是赋值的目标(它不是可修改的左值)。 dizionario[0]dizionario[1]char [20] 类型的数组表达式;由于这个简单的优点,它们可能不是= 运算符的目标。

      其次,除非它是sizeof 或一元&amp; 运算符的操作数,或者是用于在声明中初始化字符数组的字符串文字,否则为“T 的N 元素数组”类型的表达式" 将被转换(“decay”)为类型为“pointer to T”的表达式,表达式的值是数组第一个元素的地址。当你写

      dizionario[0] = "ergbeciao";
      

      编译器将表达式"ergbeciao"从“char的10元素数组”类型转换为“指向char的指针”,表达式的值是第一个元素的地址。

      您可以在声明中使用字符串文字作为初始值设定项:

      string dizionario[2] = { "ergbeciao", "ciaozio" };
      

      在这种情况下,字符串文字的内容将按照您的预期复制到数组元素中。但这 only 作为声明的一部分起作用。

      【讨论】:

        【解决方案5】:

        首先你不能通过赋值运算符直接在字符串中赋值,你应该像strcpy(dizionario[0] , "ergbeciao");strcpy(dizionario[1] , "ciaozio");这样进行字符串操作,否则你必须在声明字符串时直接赋值。

        你的代码应该是这样的

        #include<stdio.h>
        #include<string.h>
        void main(){
        
         typedef char string[20];
        
         string dizionario[2];
        
         strcpy(dizionario[0] , "ergbeciao");
         strcpy(dizionario[1] , "ciaozio");
        
         printf("%s\n %s\n",dizionario[0],dizionario[1]);
        
         }
        

        你的输出是:

        ergbeciao
        ciaozio
        

        干杯.......

        【讨论】:

          【解决方案6】:

          这取决于你想要完成什么。

          如果要声明和分配两个,20个字符的连续字符串,固定宽度,有两种方法,

          #define STRMAX (20)
          typedef char string[STRMAX+1]; //need room for null terminator
          string dizionario[2] = { "ergbeciao", "ciaozio" }; //array of char[20+1]
          

          或者您可以分配,然后使用 strcpy 分配值,

          string dizionario[2] = { 0 }; //empty
          strcpy( dizionario[0], "ergbeciao" );
          strcpy( dizionario[1], "ciaozio" );
          

          但是,你可能想要一个指向字符串的指针数组,所以定义不同,

          #define STRMAX (20)
          typedef char string[STRMAX+1]; //need room for null terminator
          string* dizionario[2] = { 0 }; //array of null pointers
          

          然后将文字字符串(指针)赋值给指针数组,

          dizionario[0] = "ergbeciao";
          dizionario[1] = "ciaozio";
          

          或者使用 malloc 提供不同的内存,

          dizionario[0] = malloc("ergbeciao");
          dizionario[1] = malloc("ciaozio");
          

          更好,为字符串提供构造函数和析构函数,

          string*
          stringNew(char* sp)
          {
              char* np = malloc(STRMAX+1);
              if(!np) return np; //malloc failed
              if(sp) strcpy(np,sp); //null source pointer
              return np;
          }
          void
          stringDel(string* sp)
          {
              if(!sp) return; //avoid double free
              free(sp);
              return(sp);
          }
          
          dizionario[0] = stringNew("ergbeciao");
          dizionario[1] = stringNew("ciaozio");
          

          【讨论】:

            猜你喜欢
            • 2014-02-05
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-05-01
            • 2010-12-30
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多