我可以在没有指针的情况下使用 strcmp 吗?
Can I use strcmp without pointers?
我必须编写一个程序,该程序从命令参数中获取一个 DNA 序列文件和一个 DNA 子序列,并在每次子序列及其出现次数中查找。我在第 36 行和第 42 行遇到了 strcmp 问题。目前我通过 GDB 发现我正在比较字符串的地址而不是实际字符串的地址。但是,如果我删除 & 我会收到错误消息。我不确定解决这个问题的正确方法是什么。 TIA
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
// place subsequence in string
char *subsequence = argv[2];
// get length of subsequence
int seqLength = strlen(subsequence);
// define file type and open for reading
FILE *inputFile = fopen(argv[1], "r");
// get each line using while loop
char inputLine[200]; // string variable to store each line
int i, j, lineLength, counter = 0, flag = -1;
while (fgets(inputLine, 200, inputFile) != NULL) { // loop through each line
lineLength = strlen(inputLine);
for (i = 0; i < lineLength; i++) { // loop through each char in the line
if (strcmp(&inputLine[i], &subsequence[0]) == 0) {
// if current char matches beginning of sequence loop through
// each of the remaining chars and check them against
// corresponding chars in the sequence
flag = 0;
for (j = i + 1; j - i < seqLength; j++) {
if (strcmp(&inputLine[j], &subsequence[j - i]) != 0) {
flag = 1;
break;
}
}
if (flag == 0) {
counter++;
}
}
}
}
fclose(inputFile);
printf("%s appears %d time(s)\n", subsequence, counter);
return 0;
}
dna.txt:
GGAAGTAGCAGGCCGCATGCTTGGAGGTAAAGTTCATGGTTCCCTGGCCC
输入:
./dnaSearch dna.txt GTA
预期输出:
GTA appears 2 times
就这样:
if (inputLine[i] == subsequence[0]) {
if (inputLine[j] != subsequence[j - i]) {
您不需要库函数来比较单个字符。
您的字符串 inputLine
是一个指向字符数组的指针,并以字符 '\0' 结束。
strcmp 期望以“\0”结尾的字符串。
传递&inputLine[i]
是将位置'i'的字符地址传递给指针参数,字符串将被读取到'\0'字符。
如评论中所建议,您要么使用普通运算符来比较字符串字符:
if (inputLine[i] == subsequence[0]) {
flag = 0;
for (j = i + 1; j - i < seqLength; j++) {// loop
if (inputLine[j] != subsequence[j - i]) {
flag = 1;
break;
}
}
或者使用strncmp,比较子串:
if (strncmp(&inputLine[i], subsequence, seqLength) == 0) {
counter++;
}
正如其他人所提到的,您不需要第一次调用 strcmp
,因为您只检查一个字符。您可以直接比较它们:
if (inputLine[i] == subsequence[0]) {
然而,有一种必须更简单的方法来做你想做的事。由于您正在寻找另一个字符串中的子字符串,因此可以使用 strstr
函数来执行此操作:
while (fgets(inputLine, 200, inputFile) != NULL) { // loop through each line
char *sub = inputLine;
while ((sub = strstr(sub, subsequence) != NULL) {
counter++;
sub++;
}
}
strstr
函数将 return 字符串内的指针来搜索找到的子字符串,如果找到 none 则为 NULL。在上面的代码中,如果找到子字符串,则计数器递增,然后将子字符串指针向上移动以继续搜索。
我必须编写一个程序,该程序从命令参数中获取一个 DNA 序列文件和一个 DNA 子序列,并在每次子序列及其出现次数中查找。我在第 36 行和第 42 行遇到了 strcmp 问题。目前我通过 GDB 发现我正在比较字符串的地址而不是实际字符串的地址。但是,如果我删除 & 我会收到错误消息。我不确定解决这个问题的正确方法是什么。 TIA
#include <stdio.h>
#include <string.h>
int main(int argc, char *argv[]) {
// place subsequence in string
char *subsequence = argv[2];
// get length of subsequence
int seqLength = strlen(subsequence);
// define file type and open for reading
FILE *inputFile = fopen(argv[1], "r");
// get each line using while loop
char inputLine[200]; // string variable to store each line
int i, j, lineLength, counter = 0, flag = -1;
while (fgets(inputLine, 200, inputFile) != NULL) { // loop through each line
lineLength = strlen(inputLine);
for (i = 0; i < lineLength; i++) { // loop through each char in the line
if (strcmp(&inputLine[i], &subsequence[0]) == 0) {
// if current char matches beginning of sequence loop through
// each of the remaining chars and check them against
// corresponding chars in the sequence
flag = 0;
for (j = i + 1; j - i < seqLength; j++) {
if (strcmp(&inputLine[j], &subsequence[j - i]) != 0) {
flag = 1;
break;
}
}
if (flag == 0) {
counter++;
}
}
}
}
fclose(inputFile);
printf("%s appears %d time(s)\n", subsequence, counter);
return 0;
}
dna.txt:
GGAAGTAGCAGGCCGCATGCTTGGAGGTAAAGTTCATGGTTCCCTGGCCC
输入:
./dnaSearch dna.txt GTA
预期输出:
GTA appears 2 times
就这样:
if (inputLine[i] == subsequence[0]) {
if (inputLine[j] != subsequence[j - i]) {
您不需要库函数来比较单个字符。
您的字符串 inputLine
是一个指向字符数组的指针,并以字符 '\0' 结束。
strcmp 期望以“\0”结尾的字符串。
传递&inputLine[i]
是将位置'i'的字符地址传递给指针参数,字符串将被读取到'\0'字符。
如评论中所建议,您要么使用普通运算符来比较字符串字符:
if (inputLine[i] == subsequence[0]) {
flag = 0;
for (j = i + 1; j - i < seqLength; j++) {// loop
if (inputLine[j] != subsequence[j - i]) {
flag = 1;
break;
}
}
或者使用strncmp,比较子串:
if (strncmp(&inputLine[i], subsequence, seqLength) == 0) {
counter++;
}
正如其他人所提到的,您不需要第一次调用 strcmp
,因为您只检查一个字符。您可以直接比较它们:
if (inputLine[i] == subsequence[0]) {
然而,有一种必须更简单的方法来做你想做的事。由于您正在寻找另一个字符串中的子字符串,因此可以使用 strstr
函数来执行此操作:
while (fgets(inputLine, 200, inputFile) != NULL) { // loop through each line
char *sub = inputLine;
while ((sub = strstr(sub, subsequence) != NULL) {
counter++;
sub++;
}
}
strstr
函数将 return 字符串内的指针来搜索找到的子字符串,如果找到 none 则为 NULL。在上面的代码中,如果找到子字符串,则计数器递增,然后将子字符串指针向上移动以继续搜索。