我有一个简单的问题。我想在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;
谢谢! 阿米特
答案 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'出现,并处理所需字符串位于缓冲区边界的情况。