简体   繁体   中英

C - How to input and insert a string into an array of strings?

I want to insert string to the array until I type "ok". Why I am getting just "ok" and original array at the output?

int main(void)
{
    char b[20];
    char* str[10] = { "1","2" };
    int i = 2;
    while (1) {

        gets(b);
        if (strcmp(b, "ok") == 0) break;
        str[i] = b;
        i++;
    }

    for (int j = 0; j < i; j++)
        printf("%s ", str[j]);
    return 0;
}

它们都指向b ,在每次迭代中都会被覆盖。

You need to allocate a string on each iteration:

int main(void)
{
    char* b;
    char* str[10] = { "1","2" };
    int i = 2;
    while (1) {
        b = malloc(20);
        gets(b);
        if (strcmp(b, "ok") == 0) break;
        str[i] = b;
        i++;
    }

    for (int j = 0; j < i; j++)
        printf("%s ", str[j]);

    // free allocated strings
    while (i > 2)
        free(str[--i]);

    return 0;
}

You need to make a copy of the input string, then save a pointer to the copy of the input string in your array. Something like:

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

int main(void)
  {
  char b[20];
  char *str[10] = { "1","2" };
  int i = 2;
  char *p;
  size_t lenb;

  for(i = 2 ; i < 10 ; ++i)
    {
    fgets(b, sizeof(b), stdin);

    lenb = strlen(b);

    if(lenb > 0 && *(b+lenb-1) == '\n')
      {
      *(b+lenb-1) = '\0';  /* overwrite the trailing \n */
      lenb = strlen(b);
      }

    if (strcmp(b, "ok") == 0)
      break;

    p = malloc(lenb+1);
    strcpy(p, b);

    str[i] = p;
    }

  for (int j = 0; j < i; j++)
    printf("%s\n", str[j]);

  return 0;
  }

You need to create a copy of the string when you assign it:

str[i] = strdup(b);

You also may consider using fgets instead of gets ; however, you will need to remove the newline:

size_t size;
fgets(str, 20, stdin);
size = strlen(str);
if(str[size-1] == '\n')
    str[size-1] = '\0';

Also, print a newline at the end of your program, so it won't interfere with the shell:

putchar('\n');

Full code:

int main(void)
{
    char b[20];
    char* str[10] = { "1","2" };
    int i = 2;
    while (1) {
        size_t size;
        fgets(str, 20, stdin);
        size = strlen(str);
        if(str[size-1] == '\n')
             str[size-1] = '\0';
        if (strcmp(b, "ok") == 0)
            break;
        str[i] = strdup(b);
        i++;
    }

    for (int j = 0; j < i; j++)
        printf("%s ", str[j]);
    putchar('\n');
    return 0;
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM