2015-07-07 3 views
1
#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#define STRING_LENGTH 20 
#define MAX 30 

int read_string(char string[], int n); 

int main(){ 
    int i = 0; 
    char *name_list[MAX]; 
    char word[STRING_LENGTH + 1]; 

    for (;; i++){ 
     printf("Enter a word.\n"); 
     read_string(word, STRING_LENGTH); 
     if (word[i] == '\0') 
      break; 
     name_list[i] = malloc(sizeof(char) * 20); 
     strcat(name_list[i], word); 

    } 


} 

int read_string(char string[], int n){ 
    int ch, i = 0; 

    while ((ch = getchar()) != '\n') 

    if (i < n) 
     string[i++] = ch; 
    string[i] = '\0'; 

    return i; 
} 

Пункт этой программы состоит в том, чтобы читать словами и помещать их в массив указателей для сортировки. это то, что я до сих пор, мой отладчик говорит, что использование strcat небезопасно, но я не знаю почему. Он говорит, что использует strcat_s, но это приводит к сбою моей программы. Любая помощь в том, как заставить это работать?Копирование строк в массив?

+0

извините я забыл добавить, что если пользователь не вводит ничего после того, как подсказка о завершении программы. – Flower

+0

Я исправил это, но отладчик все еще говорит, что использование strcat, strcpy и strcat_s, strcpy_s небезопасно – Flower

+0

Кроме того, цикл for, как и сейчас, бесконечен. Вы должны изменить его на 'for (i = 0; i moffeltje

ответ

1

Хорошо, я проверил ваш код, и я пришел к следующему заключительному коду, который работает для меня, и не дает мне предупреждения при компиляции с -Wall.

Поскольку вы используете strcat вместо strcpy, строка, хранящаяся в words, добавляется к данным в массиве name_list. Но поскольку вы не поместили все значения в этот массив в 0, может случиться, что некоторые данные об мусоре хранятся в name_list[i], а строка слов конкатенируется после данных мусора.

Поэтому я использовал calloc, поэтому все значения в выделенной памяти равны нулю. Другой способ - просто сохранить malloc, но затем изменить strcat() в strcpy().

#include<stdio.h> 
#include<stdlib.h> 
#include<string.h> 
#define STRING_LENGTH 20 
#define MAX 30 

int read_string(char string[], int n); 

int main(){ 
    int i; 
    char *name_list[MAX]; 
    char word[STRING_LENGTH + 1]; 

    for (i = 0; i < MAX; i++){ 
     printf("\nEnter a word.\n"); 
     read_string(word, STRING_LENGTH); 
     printf("\nword%d=%s", i, word); 
     if (strcmp(word, "") == 0) 
      break; 
     name_list[i] = calloc(STRING_LENGTH + 1, 1); 
     strcat(name_list[i], word); 
     printf("\nname_list[%d] = %s", i, name_list[i]); 

    } 
    return 0; 

} 

int read_string(char string[], int n){ 
    int ch, i = 0; 

    while ((ch = getchar()) != '\n') 

    if (i < n) 
     string[i++] = ch; 
    string[i] = '\0'; 

    return i; 
} 
+0

так много спасибо, хотя я все еще получаю предупреждающее сообщение, программа не сбой – Flower

+0

, когда я печатаю массив имен, хотя получаю кучу нечетных символов, а не слова – Flower

+0

Вы имеете в виду этот точный код? – moffeltje

1

Используйте функцию тетсру():

void *memcpy(void *str1, const void *str2, size_t n) 

или STRCPY() функция:

char *strcpy(char *dest, const char *src)