[英]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.