【问题标题】:C: Indexing of character arrays and using strcmpC:字符数组的索引和使用 strcmp
【发布时间】:2017-09-09 03:17:02
【问题描述】:

我不小心在 for 循环中隐藏了一条额外的 printf 语句来运行昂贵的模拟,创建了大约 10 GB 的巨大文件,而不是大约 10 KB 的文件。

重新运行模拟并不是最好的选择,所以我决定尝试解决这个问题,即使我没有接受过任何正式的 C 培训。

我试图通过创建一个读取这些大文件的程序来解决这个问题,并且只打印出 (x, y, t, n) 形式的行,其中 (x, y, t, n 是 int , int, long double, long double)。其他行是基本描述某些参数的字符串、数字和空格的组合,但所有(数百万)不需要的行都以字母“i”开头。

所以我想我会尝试在此处遵循此代码的示例:Skip a line while reading a file in C

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

     if((f = fopen(argv[1], "r")) == NULL)
     {
         printf("Couldn't open file. \n");
         return(0);
     }

     char buf[500];

     while(fgets(buf, sizeof(buf), f) != NULL)
     {

         if(strcmp(&buf[0], "i") != 0)
         {
             printf("%s \n", buf);
         }

     }
}

看来是这样的

if(strcmp(&buf[0], "i") != 0)

并没有真正起作用,因为即使一行的第一个元素是“i”,该行的 printf 仍然会打印。有趣的是,如果我在 if 语句中添加这个:

printf("%c \n", buf[0]);

"i" 仍然可以打印,即使我试图将其作为 if 语句失败的条件。有趣的是,这条线

printf("%s \n", &buf[0]);

只打印与

相同的东西
printf("%s \n", buf);

我试图重写

if(strcmp(&buf[0], "i") != 0)

作为

if(strcmp(buf[0], "i") != 0)

但刚刚收到错误消息。

如何正确地将每行的第一个元素与所选字符“i”进行比较?

【问题讨论】:

  • buf[0] 是一个字符,您可以用if (buf[0] == 'i')... 与另一个字符进行比较
  • 哇,看来我只是在使用 " 而不是 ' ? facepalm 谢谢!
  • if(buf[0] != 'i') ...
  • 如果您使用的是 bash shell,并且只是想要一个解决方案,您可以使用类似:sed '/^i/ d' giant_file.txt > filtered_file.txt
  • 也许 sed 或 awk 可以为您完成这项工作。我知道这不是编程答案,但您不必重新发明轮子。

标签: c string


【解决方案1】:

您可以使用strncmp() 代替strcmp() 来比较字符串的n 个元素。

if 语句应该类似于if((strncmp(buf,"i",1))!=0)。现在它将仅比较one 元素,即buf 中存储的字符串的1st 元素与i

但是对于第一个元素,您可以简单地使用if(buf[0]=='i')

【讨论】:

  • 比较字符串的单个元素不需要strcmp(),直接比较字符即可。
  • 是的,我很高兴,但如果有人想计算 1 个或字符串的某个元素,那么他/她可以使用strncmp 来比较 n 个元素。谢谢@Havenard。
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-04
相关资源
最近更新 更多