我需要编写从用户那里获取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
而且我不知道为什么
答案 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);
将开始覆盖引号中的所有内容。