c - C 中的指针和重新分配

标签 c arrays pointers realloc

我是 C 的新手;在类里面学习了 3 周。我在使用指针时遇到了一些麻烦,并且确信可能有一个简单的解决方法。所以基本上,这个程序应该从输入文件中读取一个单词,将其存储在一个内存分配的指针数组中,打印单词和单词的规范化形式(无关过程),然后重新分配空间,以便指针数组将随着输入更多的单词而增长。但是,我在打印单词和重新分配数组时遇到了一些麻烦(我目前将其设置为固定大小只是为了解决整个打印方面的问题)。如果我的变量声明有问题,或者我只是犯了一个愚蠢的错误,请告诉我(我确信这可能是两者的结合)。同样,我是 C 的新手,所以如果这是一个简单的问题,我深表歉意。

char * word_regular[100];
char * word_norm[100];

int main (int argc, char * argv[])
{

    if (argc != 2){
        printf("You have not entered a valid number of files.\n");
        exit(1);
    }

    FILE * f_in = fopen(argv[1],"r");
    int i = 0;
    char word[512];
    char norm_word[512];

    while(fscanf(f_in, "%s", word) != EOF) {
        if (is_valid_entry(word)) {
            word_regular[i] = malloc(sizeof(char) * strlen(word) + 1);
            strcpy(word_regular[i],word);
            printf("%s\n",*word_regular[i]);
            word_norm[i] = malloc(sizeof(char) * strlen(norm_word) + 1);
            normalize(word, norm_word);
            strcpy(word_norm[i],norm_word);
            printf("%s\n", *word_norm[i]);
            i++;        

最佳答案

您当前代码存在的一些问题(忽略动态大小需求而不是固定大小,因为您已经说过您正在使用它进行调试),

printf("%s\n",*word_regular[i]);

%s 需要一个 char * 用于打印,所以它应该是

printf("%s\n",word_regular[i]);

对于第二个printf,由于norm_word本身就是一个char数组,

你应该简单地使用

printf("%s\n", &norm_word[i]);

如果要从第 i 个索引开始打印字符串。

更新: 一个快速提示是注意您是否正在复制\0 和字符串。因为你的 api 调用,例如 strlen 会超出字符串崩溃(或最糟糕的静默),除非它是 null 终止的。

关于c - C 中的指针和重新分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26130921/

相关文章:

Java HttpsURLConnection 响应 JSON 数组

c++ - 使用指向成员函数的指针的问题

c++ - sizeof 接受两个参数

c - 在 C 中有效地提取 double 的小数部分

c - 控制可能会达到非无效功能的终点。 C

java - 如何在遍历数组时删除元素

javascript - jQuery:如何检查数组中是否存在某个值?

c - 在原始套接字上 Ping 数据包

c - 将复合文字分配给具有 const 字段的结构

c++ - 获取另一个指针类成员封装的指针类成员列表的索引值