将字符串复制到数组中?

时间:2015-07-07 20:23:42

标签: c arrays string

#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但是崩溃了我的程序。有关如何使其正常工作的任何帮助吗?

2 个答案:

答案 0 :(得分: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;
} 

答案 1 :(得分:1)

使用 memcpy()功能:

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

strcpy()功能:

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