C语言:更改用户输入

时间:2017-11-02 17:30:21

标签: c

我需要编写从用户那里获取Input的程序,如果我有quate"),我需要更改{{1}内的所有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而且我不知道为什么

2 个答案:

答案 0 :(得分:1)

问题是您以奇怪的方式使用strncat。首先,strncat将永远不会对big-endian系统做任何事情。 strncat所做的是读取输入... 作为字符串。因此,将int(四个或八个字节)传递给函数,它将读取第一个字节。如果第一个字节是0,那么它会认为它是字符串的结尾,并且不会 str 添加任何内容。在小端系统上,第一个字节应该是你想要的char,但在大端系统上,它将是高位字节(对于保持值小于255的int,它总是是零)。你可以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;
}

答案 1 :(得分:0)

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

str[i] = tolower(ch);

要:

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

否则,由于您预先增加,如果您的第一个字符不是"而是a,则您的字符串将为\0a\0\0...。这引出了我们下一个问题:

strncat(str, &ch, 1);

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

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

strncat()也可能是技术上未定义的行为,因为您传递的是格式错误的字符串,但这是语言律师的一种情况)

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