打印数组时,它打印任意符号,因为我不使用所有数组值

时间:2014-12-27 18:49:30

标签: c arrays

我现在在C中学习数组。我遇到的问题是,如果我给数组赋予值,例如

char message[100], ch; 

但是如果我不使用所有的字符,它会给我一些随意的符号。 实施例

while(toupper(ch = getchar()) != '\n')
{
    message[i] = ch;
    i++;
}

如果我要输入50个字符,请按Enter键,然后使用以下字符打印:

for(i = 0; i <= 100 - 1; i++)
    printf("%c", message[i]);

它会打印50个符号,然后再打印50个任意符号 在之前的一个问题中,我有人告诉我,我不必在for循环中使用100,而是我用它取代它。

我希望这可以全面了解我的问题,如果不让我知道的话。

4 个答案:

答案 0 :(得分:2)

要打印50个字符,您需要确保message数组中有50个字符, 最简单的方法是使用i本身。

你必须循环到i(输入字符的数量&lt; = 100)

int j ;
for( j = 0; j < i; j++)
    printf("%c", message[j]);

答案 1 :(得分:2)

另一种方法是添加:

message[i] = '\0';
在while循环之后

。这会将终止字节添加到message。然后当你输出它时,你可以使用:

printf("%s", message);

而不是for循环。

答案 2 :(得分:0)

在C中,字符串以空字符'\0'终止。因此,在循环之后,您需要将最后一个字符设置为该字符,然后您应该使用单个%s(或puts)进行打印,而不是再次循环遍历字符。

while(toupper(ch = getchar()) != '\n')
{
    message[i] = ch;
    i++;
}
message[i] = '\0';
...
printf("%s\n", message);
// or
puts(message);

答案 3 :(得分:0)

有两种方法可以解决这个问题。您可以跟踪字符串的长度,也可以使用“sentinel”值,在C中传统上是0字节(不是'0'字符)。

给定这样的函数:

void print_null_terminated_string(char* s)
{
    while (*s != 0) {
        printf("%c", *s);
        ++s;
    }
}

void print_string_with_known_length(char* s, size_t length)
{
    for (size_t i = 0; i < length; ++i) {
        printf("%c", s[i]);
    }
}

您可以像这样使用它们:

while(toupper(ch = getchar()) != '\n')
{
    message[i] = ch;
    i++;
}
message[i] = 0; // Add null terminator
print_null_terminated_string(message); // or just printf("%s", message)

或者:

while(toupper(ch = getchar()) != '\n')
{
    message[i] = ch;
    i++;
}
size_t length = i;
print_string_with_known_length(message, length); // or printf("%.*s", length, message) if you want to be fancy