How to correctly assign a new string value?

前端 未结 3 1975
有刺的猬
有刺的猬 2020-11-22 00:22

I\'m trying to understand how to solve this trivial problem in C, in the cleanest/safest way. Here\'s my example:

#include 

int main(int argc         


        
相关标签:
3条回答
  • 2020-11-22 01:00

    Think of strings as abstract objects, and char arrays as containers. The string can be any size but the container must be at least 1 more than the string length (to hold the null terminator).

    C has very little syntactical support for strings. There are no string operators (only char-array and char-pointer operators). You can't assign strings.

    But you can call functions to help achieve what you want.

    The strncpy() function could be used here. For maximum safety I suggest following this pattern:

    strncpy(p.name, "Jane", 19);
    p.name[19] = '\0'; //add null terminator just in case
    

    Also have a look at the strncat() and memcpy() functions.

    0 讨论(0)
  • 2020-11-22 01:04

    The first example doesn't work because you can't assign values to arrays - arrays work (sort of) like const pointers in this respect. What you can do though is copy a new value into the array:

    strcpy(p.name, "Jane");
    

    Char arrays are fine to use if you know the maximum size of the string in advance, e.g. in the first example you are 100% sure that the name will fit into 19 characters (not 20 because one character is always needed to store the terminating zero value).

    Conversely, pointers are better if you don't know the possible maximum size of your string, and/or you want to optimize your memory usage, e.g. avoid reserving 512 characters for the name "John". However, with pointers you need to dynamically allocate the buffer they point to, and free it when not needed anymore, to avoid memory leaks.

    Update: example of dynamically allocated buffers (using the struct definition in your 2nd example):

    char* firstName = "Johnnie";
    char* surname = "B. Goode";
    person p;
    
    p.name = malloc(strlen(firstName) + 1);
    p.surname = malloc(strlen(surname) + 1);
    
    p.age = 25;
    strcpy(p.name, firstName);
    strcpy(p.surname, surname);
    
    printf("Name: %s; Age: %d\n",p.name,p.age);
    
    free(p.surname);
    free(p.name);
    
    0 讨论(0)
  • 2020-11-22 01:09

    The two structs are different. When you initialize the first struct, about 40 bytes of memory are allocated. When you initialize the second struct, about 10 bytesof memory are allocated. (Actual amount is architecture dependent)

    You can use the string literals (string constants) to initalize character arrays. This is why

    person p = {"John", "Doe",30};

    works in the first example.

    You cannot assign (in the conventional sense) a string in C.

    The string literals you have ("John") are loaded into memory when your code executes. When you initialize an array with one of these literals, then the string is copied into a new memory location. In your second example, you are merely copying the pointer to (location of) the string literal. Doing something like:

    char* string = "Hello";
    *string = 'C'
    

    might cause compile or runtime errors (I am not sure.) It is a bad idea because you are modifying the literal string "Hello" which, for example on a microcontroler, could be located in read-only memory.

    0 讨论(0)
提交回复
热议问题