简体   繁体   English

在strtok()-C的输出上使用strcmp()

[英]Using strcmp() on output of strtok() -C

I'm new to C, and I'm trying to write a program that takes two string literals, finds the longest word in the first, and compares it to the second string. 我是C语言的新手,我正在尝试编写一个程序,该程序使用两个字符串文字,在第一个字符串中找到最长的单词,然后将其与第二个字符串进行比较。 If the second string (called "expected") is indeed equal to the first, it prints a success message, and if not, it prints the actual longest word, the expected string, and the original string. 如果第二个字符串(称为“期望”)的确与第一个字符串相等,则显示成功消息,否则,将输出实际最长的单词,预期的字符串和原始字符串。

There are many other posts on here with similar problems, but those boil down to an added \\n or a missing \\0; 这里还有许多其他类似问题的帖子,但归结为\\n\\0;丢失\\0; from what I understand, strtok() adds \\0 and since I'm working with hard-coded literals, I'm sure there are no trailing line breaks, as is the case with reading input. 据我了解, strtok() \\0并且由于我使用的是硬编码文字,因此我确定不会出现换行符,就像读取输入一样。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

char* currentTok;
static const char* result;
static char* longestTok;

static int testsExecuted = 0;
static int testsFailed = 0;

void testLongestWord();
const char* longestWord();
int totalLength();
int charLength();

int main(int argc, char *argv[]) {
    printf("Testing typical cases, including punctuation\n");
    testLongestWord("the quick brown foxes jumped over the lazy dogs", "jumped");
    //There are other examples, some of which fail, and others don't, though I don't see a pattern

    printf("\nTotal number of tests executed: %d\n",testsExecuted);
    printf("Number of tests passed:         %d\n",(testsExecuted - testsFailed));
    printf("Number of tests failed:         %d\n",testsFailed);
}

//tests words, prints success/failure message
void testLongestWord(char* line, char* expected){
    result = longestWord(line, totalLength(line));
    if (strncmp(result, expected,charLength(expected)-1)||totalLength(expected)==0){//the problem spot
        printf("Passed: '%s' from '%s'\n",expected, line);
    } else {
        printf("FAILED: '%s' instead of '%s' from '%s'\n",result, expected, line);
        testsFailed++;
    }
    testsExecuted++;
}

//finds longest word in string
const char *longestWord(char* string, int size){
    char tempString[size+10];//extra room to be safe
    strcpy(tempString,string);
    currentTok = strtok(tempString,"=-#$?%!'' ");
    longestTok = "\0";
    while (currentTok != NULL){
        if (charLength(currentTok)>charLength(longestTok)){
            longestTok = currentTok;
        }
        currentTok = strtok(NULL,"=-#$?%!'' ");
    }

    return longestTok;
}

int totalLength(const char* string) {
    int counter = 0;

    while(*(string+counter)) {
        counter++;
    }
    return counter;
}

int charLength(const char* string) {
    int counter = 0;
    int numChars = 0;

    while(*(string+counter)) {
        if (isalpha(*(string+counter))){
            numChars++;
        }
        counter++;
    }
    return numChars;
}

The problem is that it returns: 问题是它返回:

FAILED: 'jumped' instead of 'jumped' from 'the quick brown foxes jumped over the lazy dogs'

Clearly, the strings are equal, and I've done other tests to make sure they're the same length, have \\0 ... but still it fails. 显然,字符串是相等的,并且我已经做了其他测试以确保它们的长度相同,具有\\0 ...,但仍然失败。

You are calling strncmp() which returns zero on equal strings, but you are evaluating it in a boolean context where zero is false, so it falls to the else branch. 您正在调用strncmp() ,该字符串在相等的字符串上返回零,但是您正在布尔值上下文中对它进行求值,其中零为false,因此它属于else分支。

Also, consider using strlen() to find out the length of a string. 另外,考虑使用strlen()找出字符串的长度。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM