我正在尝试编写一个函数,它获取一串字母,大写字母或小写字母,并打印2个其他字符串,一个只有大写字母,一个只有小写字母。例如:
input: AaBbCcDD
Output: Capital string is ABCDD, non capital is abc
我的代码工作不正常,似乎跳过了最后一封信。为了测试它,我编写了以下代码:
int length;
printf("Please enter length of string\n");
scanf("%d",&length);
string=create_string(length);
scan_string(string,length);
printf("The string entered is: \n");
print_string(string,length);
create_string是:
char* create_string(int size)
{
char* string;
string=(char*)malloc(size*sizeof(char));
return string;
}
扫描字符串是:
void scan_string(char* string, int size)
{
int i;
printf("Please enter %d characters\n",size);
for(i=0;i<size;i++)
scanf("%c",string+i);
}
打印字符串是
void print_string(char* string,int size)
{
int i;
for(i=0;i<size;i++)
printf("%c ",*(string+i));
}
当我尝试打印我输入的字符串时,在我输入aaAAB
之后,这就是我得到的
输出为a a A A
。
它跳过了B。
答案 0 :(得分:2)
问题在于scanf
使用%c
读取字符:它跟随scanf
使用%d
读取长度,这会留下额外的'\n'
之前的缓冲区中的字符你得到的第一个字符。
如果您修改输出以在字符周围加上引号,您实际上会看到\n
:
void print_string(char* string,int size)
{
int i;
for(i=0;i<size;i++)
printf("'%c' ",*(string+i));
}
打印
'
' 'a' 'a' 'A' 'A'
答案 1 :(得分:0)
您可以将第一张scanf更改为&#39; \ n&#39;如下。这将阅读额外的&#39; \ n&#39;
scanf(&#34;%d \ n&#34;,&amp; length);
答案 2 :(得分:0)
我认为你的代码是不必要的。要读取字符串,带参数fget()
的函数stdin
是一个更简单的选择
例如,我不会向用户询问字符串的长度
也许最好使用具有固定长度的缓冲区,并重新引导用户输入长度小于先前规定长度的字符串。
#define MAXLEN 1000
char buffer[MAXLEN] = "";
fgets(buffer, MAXLEN, stdin);
如果用户试图输入超过MAXLEN个字符的字符串,则需要以某种方式处理行尾,但我认为这不在话题范围内。
所以,一般来说,让我们假设MAXLEN足够大,缓冲区包含\n
标记。
现在,可以调用您的函数print_string()
。
但是,最好这样做:
printf("%s", buffer);
我认为您可能需要考虑字符串的C约定:字符串是一个char数组,其最后一个元素标有字符'\0'
(空字符,始终为代码0)。
即使你想坚持自己的方法,我认为scanf()
是阅读个别角色的不错选择。相反,它更容易使用getchar()
。
使用scanf()
你必须打破你的大脑,围绕scanf()
行为的所有内容,或如何处理字符的读取,等等。
但是,getchar()
一次读取一个字符,而且(几乎)全部读取。 (实际上,控制台通常不会将控件返回给用户,直到读取行尾\n
)。
string[i] = getchar();
答案 3 :(得分:0)
问题是因为scanf
不吃"\n"
。因此,您的第一次输入仍有一个\n'
。这将在下一次扫描时计算。
尝试在第一个getchar()
之后添加一个scanf
。
printf("Please enter length of string\n");
scanf("%d",&length);
getchar(); // remove '\n'
string=create_string(length);