输出不正确,简单的字符串练习 - C.

时间:2014-07-14 16:54:58

标签: c string printing

我正在尝试编写一个函数,它获取一串字母,大写字母或小写字母,并打印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。

4 个答案:

答案 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'

demo on ideone

答案 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);