在 strtok() -C 的输出上使用 strcmp()
Using strcmp() on output of strtok() -C
我是 C 的新手,我正在尝试编写一个程序,它接受两个字符串文字,在第一个字符串中找到最长的单词,并将其与第二个字符串进行比较。如果第二个字符串(称为 "expected")确实等于第一个,则打印成功消息,否则,打印实际最长的单词、预期字符串和原始字符串。
这里还有很多其他帖子也有类似的问题,但根据我的理解,这些归结为添加 \n
或缺少 [=13=];
,strtok()
添加 [=15 =]
并且由于我使用的是硬编码文字,所以我确信没有尾随换行符,就像读取输入的情况一样。
#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 = "[=10=]";
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;
}
问题是 returns:
FAILED: 'jumped' instead of 'jumped' from 'the quick brown foxes jumped over the lazy dogs'
显然,字符串是相等的,我还做了其他测试以确保它们的长度相同,[=15=]
...但仍然失败。
您正在调用 strncmp()
,其中 returns 在相同的字符串上为零,但您正在布尔上下文中对其进行评估,其中零为假,因此它属于 else 分支。
此外,考虑使用 strlen()
找出字符串的长度。
我是 C 的新手,我正在尝试编写一个程序,它接受两个字符串文字,在第一个字符串中找到最长的单词,并将其与第二个字符串进行比较。如果第二个字符串(称为 "expected")确实等于第一个,则打印成功消息,否则,打印实际最长的单词、预期字符串和原始字符串。
这里还有很多其他帖子也有类似的问题,但根据我的理解,这些归结为添加 \n
或缺少 [=13=];
,strtok()
添加 [=15 =]
并且由于我使用的是硬编码文字,所以我确信没有尾随换行符,就像读取输入的情况一样。
#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 = "[=10=]";
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;
}
问题是 returns:
FAILED: 'jumped' instead of 'jumped' from 'the quick brown foxes jumped over the lazy dogs'
显然,字符串是相等的,我还做了其他测试以确保它们的长度相同,[=15=]
...但仍然失败。
您正在调用 strncmp()
,其中 returns 在相同的字符串上为零,但您正在布尔上下文中对其进行评估,其中零为假,因此它属于 else 分支。
此外,考虑使用 strlen()
找出字符串的长度。