#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 :(得分: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)