C:如何区分字符串和整数?输出可以很好地打印整数,但不能打印字符串

标签 c string if-statement input boolean

我的程序对用户输入的字符串进行标记,并从这些标记中辨别它们是字符串还是整数(如果任何字母字符附加到数字,则意味着它与任何数字相邻 - 它是然后将其视为字符串)。

因此,以下输入:this is 1string 123 1”应输出STR STR STR INT INT。我所做的:获取输入字符串,继续对其进行标记/拆分(使用空格分隔符),然后迭代拆分标记(使用 for 循环)以查看拆分标记是否具有字母表中的任何字符(大写或小写)。

现在,最后一句话就是问题所在。我有一个名为foundChar 的 boolean 值。如果找到任何字母字符,那么我会将foundChar 设置为true。从那里,我会做一个简单的 if 检查来查看是否foundChar == true。但是,现在当我输入一个字符串时,它会打印空白?我不确定我在 C 中使用 boolean 值的方式是否正确,或者在哪里可以准确地指出这里出了什么问题。

#include <stdio.h>
#include <string.h>
#include <stdbool.h>

// main
int main (void)
{
    // declare our stuff for stuffs
    char string[255];
    char *tokenizedString;
    const char delimiter[2] = " ";
    char *pch;
    bool found = false;
    int truth = 0;

    // prompt our user
    do {
        do {
            printf (">");
            fgets (string, 65, stdin);

        } while (strlen (string) <= 0);

        // remove it "\n" so it can terminate from newline input
        pch = strstr (string, "\n");
        strncpy (pch, "\0", 1);

        // tokenize the input string
        tokenizedString = strtok (string, delimiter);

        while (tokenizedString != NULL) {

            // check for any character in the token
            // if found = true, then it's a string by our premade definition 
            for (int i = 0; i < strlen (tokenizedString); i++) {
                if ((i >= 'a' && i <= 'z')
                    || (i >= 'A' && i <= 'Z')) {
                    found = true;
                }
            }

            // if we find a char in the string
            if (found == true) {
                printf ("STR ");
            }

            // if the token is a number
            else if (isdigit (*tokenizedString))
                printf ("INT ");

            tokenizedString = strtok (NULL, delimiter);

            // reset charFound to zero for our next token
            found = false;

        }

        printf ("\n");

    } while (!(strlen (string) == 0));
} // end of program

输出

./prog why are

_________(这里实际上没有打印任何内容,空白!应该打印STR STR,下面的下一个字符串也是如此!)

./prog  you not printing output for string

_________(这里也没有打印任何内容,应该打印 STR STR STR STR STR STR)

./prog 123
INT 

./prog 1st
INT 

./prog nor printing the right stuff

期望输出

./prog why are
STR STR

./prog you not printing output for string
STR STR STR STR STR STR

./prog 123
INT 

./prog 1st
STR

./prog nor printing the right stuff
STR STR STR STR STR

最佳答案

由于 BLUEPIXY 已经正确指出(像往常一样)需要检查 tokenizedString 中的字符是数字还是字符,让我们退后一步,看看您在做什么大图景。虽然对每个读取的字符串进行标记,然后迭代每个标记中的每个字符并没有什么问题,但也没有必要这样做。

您真正关心的是行中的每个单词是否仅由数字组成(对于您的 INT 输出),否则您将其分类为 STR。为此,您需要做的就是迭代输入中的每个字符,并计算该行中包含的空格之间的字符和数字的数量。您可以在不进行任何标记化的情况下执行此操作。只需计算您找到的每个空格之间(或 fgets 输入中包含的最后一个空格与 '\n' 之间的字符数和数字数)即可>).

例如,您可以执行以下操作:

#include <stdio.h>

#define MAXS 256

int main (void) {

    char str[MAXS] = "";

    while (fgets (str, MAXS, stdin)) {      /* read each line */
        char *p = str;
        int ch = 0, dig = 0;
        while (*p) {                        /* for each char  */
            if (*p == ' ' || *p == '\n') {  /* if space or \n */
                if (ch)                     /* if char found  */
                    printf (" STR");
                else if (dig)               /* if digit found */
                    printf (" INT");
            }
            /* are we a char? */
            if (('a' <= *p && *p <= 'z') || ('A' <= *p && *p <= 'Z'))
                ch++;   /* incriment ch  */
            else if ('0' <= *p && *p <= '9')    /* are we a digit? */
                dig++;  /* incriment dig */
            p++;
        }
        putchar ('\n');
    }

    return 0;
}

示例使用/输出

$ ./bin/str_or_int
why are
 STR STR
you not printing output for string
 STR STR STR STR STR STR
123
 INT
1st
 STR
nor printing the right stuff
 STR STR STR STR STR

同样,标记化然后扫描每个标记并没有什么问题,但它可能比需要的更复杂一些。检查一遍,将 BLUEPIXY 建议的修复合并到您的代码中,然后比较版本。一般来说,如果有一种简单的方法来做某事,那么你遇到微妙错误的机会就会比你绕很远的路要小得多 :)

如果您对任一版本还有任何其他问题,请告诉我。

关于C:如何区分字符串和整数?输出可以很好地打印整数,但不能打印字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46375268/

相关文章:

c - 出现错误并帮助我解决这个问题

java - 两个相同的字符串不相等(不是指针/引用错误)

c++ - 使用引用传递字符串需要进行哪些必要的更改

c# - while 语句忽略响应值

java - 重复数字

c# - 将 If 语句转换为 Switch

c - 无法确定指针数组的大小

c - long long 与 int 乘法

python - python 中只有部分 unicode 被替换。不明白为什么

c - 我是 c 编程初学者,需要 sizeof() 字符串常量方面的帮助吗?