循环直到找到特定字符串

时间:2011-01-26 21:55:34

标签: c arrays string

我有一个简单的问题。我想在C中编写一个扫描特定文件行的程序,如果该行上唯一的短语是“Atoms”,我希望它停止扫描并报告它所在的行。这就是我所拥有的并且没有编译,因为显然我正在将整数与指针进行比较:(当然包括“string.h”。

char dm;
  int test; 
  test = fscanf(inp,"%s", &dm);

  while (test != EOF) {
    if (dm=="Amit") {
      printf("Found \"Atoms\" on line %d", j);
      break;
    }
    j++;
  }

该文件已经打开:

inp = fopen( .. )

并检查以确保正确打开...

我想使用不同的方法,并且想知道它是否可行。我可以扫描整条线,而不是扫描单个字符串:

// char tt[200];
//
// fgets(tt, 200, inp);

并执行以下操作:

if (tt[] == "Atoms") break;

谢谢! 阿米特

4 个答案:

答案 0 :(得分:2)

这里没有过多关注你的实际代码,你犯的最重要的错误是==运算符不会比较两个字符串。

在C中,字符串是一个字符数组,它只是一个指针。所以if(“abcde”== some_string)永远不会是真的,除非它们指向相同的字符串!

你想使用像“strcmp(char * a,char * b)”这样的方法,如果两个字符串相等则返回0,如果不是则返回别的东西。 “strncmp(char * a,char * b,size_t n)”将比较a和b中的第一个“n”字符,如果它们相等则返回0,这有利于查看字符串的开头(看如果一个字符串以某组字符开头)

你也不应该在你的fscanf中传递一个角色作为%s的指针!这将导致它完全破坏你的堆栈,它试图将许多字符放入ch,这只有一个字符的空间!正如詹姆斯所说,你想做像char ch [BUFSIZE]这样的东西,其中BUFSIZE比你预期的单行大1,然后做“fscanf(inp,”%s“,ch);”

希望有所帮助!

答案 1 :(得分:1)

请注意dm是 字符,而您需要char *

更多:if (dm=="Amit")错误,请在

中进行更改
if (strcmp(dm, "Amit") == 0)

答案 2 :(得分:1)

在使用fscanf的行中,您将字符串转换为char的地址。在fscanf中使用%s应该将字符串设置为指针,而不是地址:

char *dm;
test = fscanf(inp,"%s", dm);

*符号声明了一个间接,即dm指向的变量。 fscanf行将声明dm作为对使用%s分隔符捕获的字符串的引用。它将指向字符串中第一个字符的地址。

说什么套件也是正确的,应该使用strcmp命令,而不是== compare,因为==只会比较字符串的地址。

编辑:下面说明的套件是正确的。所有指针在使用之前都应该分配内存,否则应该转换为预先分配的内存空间。您可以像这样分配内存:

dm = (char*)malloc(sizeof(char) * STRING_LENGTH);

其中STRING_LENGTH是可能字符串的最大长度。这种内存分配只需要完成一次。

答案 3 :(得分:0)

问题是您已将'dm'声明为char,而不是malloc'd char*char[BUFSIZE]

http://www.cplusplus.com/reference/clibrary/cstdio/fscanf/

您也可能报告错误的行号,您需要扫描读入缓冲区中的'\ n'出现,并处理所需字符串位于缓冲区边界的情况。

相关问题