【问题标题】:Using strcmp() on output of strtok() -C在 strtok() -C 的输出上使用 strcmp()
【发布时间】:2016-10-06 23:59:08
【问题描述】:

我是 C 新手,我正在尝试编写一个程序,该程序采用两个字符串文字,在第一个中找到最长的单词,并将其与第二个字符串进行比较。如果第二个字符串(称为“预期”)确实等于第一个,它会打印一条成功消息,如果不是,它会打印实际最长的单词、预期的字符串和原始字符串。

这里还有很多其他帖子有类似的问题,但据我了解,这些归结为添加了\n 或缺少\0;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;
}

问题是它返回:

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

显然,字符串是相等的,我已经进行了其他测试以确保它们的长度相同,有 \0... 但仍然失败。

【问题讨论】:

    标签: c string compare strtok strcmp


    【解决方案1】:

    您正在调用strncmp(),它在相等的字符串上返回零,但您在布尔上下文中评估它,其中零为假,因此它落入 else 分支。

    另外,考虑使用strlen() 找出字符串的长度。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-27
      • 2011-01-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多