我需要编写从用户那里获取Input的程序,以防万一我有quate"),我需要将chars内部的所有quotes更改为uppercase

int main()
{
    int quoteflag = 0;
    int ch = 0;
    int i = 0;
    char str[127] = { '\0' };

    while ((ch = getchar()) != EOF && !isdigit(ch))
    {
        ++i;
        if (ch == '"')
            quoteflag = !quoteflag;

        if (quoteflag == 0)
            str[i] = tolower(ch);
        else
        {
            strncat(str, &ch, 1);
            while ((ch = getchar()) != '\"')
            {
                char c = toupper(ch);
                strncat(str, &c, 1);
            }

            strncat(str, &ch, 1);
            quoteflag = !quoteflag;
        }

        if (ch == '.')
        {
            strncat(str, &ch, 1);
            addnewline(str);
            addnewline(str);
        }
        else
        {
            if ((isupper(ch) && !quoteflag))
            {
                char c = tolower(ch);
                strncat(str, &c, 1);
            }
        }
    }

    printf("\n-----------------------------");
    printf("\nYour output:\n%s", str);
    getchar();

    return 1;
}

void addnewline(char *c)
{
    char tmp[1] = { '\n' };
    strncat(c, tmp, 1);
}


所以我的问题是,如果我的输入是"a"此打印位于"A末尾而不是"A",而我不知道为什么

最佳答案

问题是您使用怪异方式使用strncat。首先,strncat在big-endian系统上总是不起作用。 strncat的作用是将输入...读取为字符串。因此,将int(四个或八个字节)传递给函数,它将读取第一个字节。如果第一个字节是0,则它将认为它是字符串的结尾,并且不会在str中添加任何内容。在小字节序系统上,第一个字节应该是您想要的char,但是在大字节序系统上,它将是高字节(对于int值小于255的字节,始终为零)。您可以read more about endianness here

不过,我不知道为什么要使用strncat附加单个字符。您对str[i] = tolower(ch)有正确的想法。我将int ch更改为char ch,然后在代码中将strncat(...)替换为str[i++] = ...,它编译良好并返回了所需的"A"输出。源代码如下。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
    int quoteflag = 0;
    char ch = 0;
    int i = 0;
    char str[127] = { '\0' };

    while ((ch = getchar()) != EOF && !isdigit(ch))
    {
        if (ch == '"')
            quoteflag = !quoteflag;

        if (quoteflag == 0)
            str[i++] = tolower(ch);
        else
        {
            str[i++] = ch;
            while ((ch = getchar()) != '\"')
            {
                char c = toupper(ch);
                str[i++] = c;
            }
            str[i++] = ch;
            quoteflag = !quoteflag;
        }

        if (ch == '.')
        {
             str[i++] = '.';
             str[i++] = '\n';
             str[i++] = '\n';
        }
        else
        {
            if ((isupper(ch) && !quoteflag))
            {
                char c = tolower(ch);
                str[i++] = c;
            }
        }
    }

    printf("\n-----------------------------");
    printf("\nYour output:\n%s", str);
    getchar();

    return 1;
}

关于c - C语言:更改用户输入,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47081305/

10-09 13:11