繁体   English   中英

C语言:更改用户输入

[英]C language: change user input

我需要编写从用户那里获取Input程序,以防万一我已经quate" ),我需要将quotes内的所有chars更改为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的值将始终为零)。 您可以在此处阅读有关字节序的更多信息

不过,我不知道为什么要使用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;
}

您应该删除++i; 行,然后更改:

str[i] = tolower(ch);

至:

str[i++] = tolower(ch);

否则,由于您是预递增的,因此,如果您的第一个字符不是"而是说a ,则您的字符串将为\\0a\\0\\0...这将导致我们a下一个问题:

strncat(str, &ch, 1);

如果输入是a" ,则strncat(str, &'"', 1); 将给出\\"\\0\\0...的结果,因为strncat会将str视为空字符串。将所有出现的内容替换为上面的内容:

str[i++] = toupper(ch);

(当您传入格式错误的字符串时, strncat()在技​​术上也可能是未定义的行为,但对于语言律师而言,这就是一种)

这将跟踪索引,否则一旦退出报价循环,您的第一个str[i] = tolower(ch); 将开始覆盖引号中的所有内容。

暂无
暂无

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

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