C,char*(字符串)的循环数组不起作用。为什么?

标签 c arrays string loops

我的 char* 数组有问题-

char *original_file_name_list[500];

while(dp=readdir(dir)) != NULL) {
   original_file_name = dp->d_name;
   original_file_name_list[counter] = original_file_name;
   printf("%s\n",original_file_name_list[0]);
   printf("%d\n",counter); 
   counter++;
}

问题是,它可以正常打印所有文件。它应该只打印第一个文件,对吧? 如果我尝试 printf("%s\n",original_file_name_list[1]); 它不起作用,这意味着它只在第一个字符串中写入。知道为什么吗?

编辑:编译器没有语法错误。

最佳答案

您根本没有复制字符串 - 您的 file_name_list 数组也没有足够的空间用于文件名列表 - 仅用于指针列表。但是 dp->d_name 只是一个指向 char* 的指针——你无法知道指针后面的内存有效期有多长。因此,您必须自己制作一份副本。

#include <string.h>
#include <dirent.h>

int main(int argc, char** argv){
  char original_file_name_list[50][50];
  size_t counter = 0;
  while(dp=readdir(dir)) != NULL) // does work fine (ordinary reading files from dir)
  {
    size_t len = strlen(dp->d_name);
    if(len >= 50) len = 49;
    strncpy(original_file_name_list[counter], dp->d_name, len);
    original_file_name_list[counter][len] = '\0';
    printf("%d\n",counter); 
    counter++;
  }
  printf("%s\n",original_file_name_list[1]); // <- will work if you have at least 2 files in your directory
  return 0;
}

关于C,char*(字符串)的循环数组不起作用。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20286049/

相关文章:

php - 如何将数组转换为 SimpleXML

javascript - 为什么这个简单的过滤器返回一个空数组?

c# - string.Clone() 有什么用?

c - ncurses 中奇怪的扩展字符

c - 为什么我的随机数组和排序程序不工作?

PHP访问命名数组元素问题

c++ - 将包含多个数字的字符串转换为整数

ruby-on-rails - 检查字符串是否包含多个子字符串之一

c - 在结构体初始化中使用#ifdef

c - 如何在 C 程序任务中创建 "twirly"?