【问题标题】:Can I use strcmp without pointers?我可以在没有指针的情况下使用 strcmp 吗?
【发布时间】:2017-11-17 19:40:36
【问题描述】:

我必须编写一个程序,该程序从命令参数中获取一个 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

【问题讨论】:

  • 您是在比较字符串还是字符?对我来说看起来像字符。
  • 那么你不需要strcmp()strcmp() 比较以零结尾的字符串(字符序列),字符只是比较它们的数字。
  • 顺便说一句,如果只是 char 比较,您可以使用 == 每个字符。
  • &gt;&gt;I am comparing the address of the strings and not the actual strings 不,您正在比较字符串。 &amp;string[index] 将获取从索引到字符串末尾的子字符串。
  • 您应该使用 strstr() 来定位子字符串,并观察您的应用程序的速度显着提高。

标签: c strcmp


【解决方案1】:

就这样吧:

if (inputLine[i] == subsequence[0]) {
    if (inputLine[j] != subsequence[j - i]) {

您不需要库函数来比较单个字符。

【讨论】:

    【解决方案2】:

    正如其他人所提到的,您不需要第一次调用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 函数将在字符串中返回一个指针以搜索找到的子字符串,如果没有找到,则返回 NULL。在上面的代码中,如果找到了子串,则计数器增加,然后将子串指针上移以继续搜索。

    【讨论】:

      【解决方案3】:

      您的字符串inputLine 是一个指向字符数组并以字符“\0”结尾的指针。

      strcmp 需要一个以 '\0' 结尾的字符串。

      传递&amp;inputLine[i] 是将位置'i'中的字符的地址传递给指针参数,并且将读取字符串直到'\0'字符。

      按照 cmets 中的建议,您可以使用普通运算符来比较字符串字符:

      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++;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-31
        • 2019-01-31
        • 2016-08-11
        • 2021-08-10
        • 2021-07-28
        • 1970-01-01
        相关资源
        最近更新 更多