如果我没有完全填充我的字符数组,那么存储在空地址中的值是什么?
If I incompletely populate my array of characters then what would be the values stored in the addresses which are empty?
我的任务是附加一个“.” (点)在字符数组的最后一个元素之后,我的策略是在 search.But 中遇到 '\0' 时立即添加点,即使数组中的元素小于 space 分配给它,点附加在最后一个位置。
例如,如果我分配了一个大小为 10 的数组并且我只输入了 5 个字符,那么点也会附加到第 10 个 place.How 中的数组,我可以解决这个问题吗?
以下是我编写的 C 代码:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
char dot = '.';
char string_input[10];
fgets (string_input, sizeof(string_input), stdin);
int s = sizeof(string_input);
for(i=0;i<=s;++i)
{
if (string_input[i]!= '[=10=]')
{
continue;
}
else
{
string_input[i]=dot;
printf("Hello, %s\n", string_input);
break;
}
}
return 0;
}
这是因为您正在使用
int s = sizeof(string_input);
它给出字符串占用的内存量 - 在本例中为 10 个字节,无论其内容如何。
还要注意这个
for(i=0;i<=s;++i)
不正确,因为您不能尝试索引 string_input[10]
,该索引超出范围。
我建议您使用 strlen()
,它会给出实际使用的字符串长度,包括 newline
字符 附加 fgets()
。然后像这样覆盖newline
for(i=0;i<s;++i)
{
if (string_input[i] == '\n')
{
string_input[i]=dot;
printf("Hello, %s\n", string_input);
break;
}
}
要将点追加到字符数组的末尾,请尝试以下操作
#include <stdio.h>
int main(void)
{
char dot = '.';
char string_input[10];
const size_t N = sizeof( string_input );
fgets( string_input, N, stdin );
size_t i = 0;
while ( i < N - 1 && string_input[i] != '\n' && string_input[i] != '[=10=]' ) ++i;
while ( i < N - 1 ) string_input[i++] = dot;
string_input[i] = '[=10=]';
printf( "\"%s\"\n", string_input );
return 0;
}
考虑到函数 fgets
也会读取对应于按下的 Enter 键的换行符,前提是它有足够的 space 来存储它。
如果输入例如
abcd
那么输出将是
"abcd....."
如果你只想在字符串末尾加一个点那么你可以这样写
#include <stdio.h>
int main(void)
{
char dot = '.';
char string_input[10];
const size_t N = sizeof( string_input );
fgets( string_input, N, stdin );
size_t i = 0;
while ( i < N - 1 && string_input[i] != '\n' && string_input[i] != '[=13=]' ) ++i;
if ( i < N - 1 ) string_input[i++] = dot;
string_input[i] = '[=13=]';
printf( "\"%s\"\n", string_input );
return 0;
}
此处输出为
"abcd."
除了 melpomene 指出的差一错误之外,您的代码存在几个基本问题。首先,如果你想在字符串就地后附加一些字符,那么你应该提前为它腾出空间。所以而不是
fgets (string_input, sizeof(string_input), stdin);
你应该写
fgets (string_input, sizeof(string_input)-1, stdin);
然后你还需要在用点覆盖它之后用 '[=14=]'
终止你的字符串。所以与其说
string_input[i]=dot;
你应该说
string_input[i]=dot;
string_input[i+1]='[=13=]';
编码风格方面,需要注意
- 正确的缩进
- 避免一些微妙但愚蠢的事情,比如
if ( A!=B ) { continue; } else {...}
就是 if (A==B) {...}
;您也可以通过交换两个语句轻松避免调用 sizeof
两次。
我指出这些是因为我看到您可能正在学习这门语言。
我的任务是附加一个“.” (点)在字符数组的最后一个元素之后,我的策略是在 search.But 中遇到 '\0' 时立即添加点,即使数组中的元素小于 space 分配给它,点附加在最后一个位置。 例如,如果我分配了一个大小为 10 的数组并且我只输入了 5 个字符,那么点也会附加到第 10 个 place.How 中的数组,我可以解决这个问题吗? 以下是我编写的 C 代码:
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int i;
char dot = '.';
char string_input[10];
fgets (string_input, sizeof(string_input), stdin);
int s = sizeof(string_input);
for(i=0;i<=s;++i)
{
if (string_input[i]!= '[=10=]')
{
continue;
}
else
{
string_input[i]=dot;
printf("Hello, %s\n", string_input);
break;
}
}
return 0;
}
这是因为您正在使用
int s = sizeof(string_input);
它给出字符串占用的内存量 - 在本例中为 10 个字节,无论其内容如何。
还要注意这个
for(i=0;i<=s;++i)
不正确,因为您不能尝试索引 string_input[10]
,该索引超出范围。
我建议您使用 strlen()
,它会给出实际使用的字符串长度,包括 newline
字符 附加 fgets()
。然后像这样覆盖newline
for(i=0;i<s;++i)
{
if (string_input[i] == '\n')
{
string_input[i]=dot;
printf("Hello, %s\n", string_input);
break;
}
}
要将点追加到字符数组的末尾,请尝试以下操作
#include <stdio.h>
int main(void)
{
char dot = '.';
char string_input[10];
const size_t N = sizeof( string_input );
fgets( string_input, N, stdin );
size_t i = 0;
while ( i < N - 1 && string_input[i] != '\n' && string_input[i] != '[=10=]' ) ++i;
while ( i < N - 1 ) string_input[i++] = dot;
string_input[i] = '[=10=]';
printf( "\"%s\"\n", string_input );
return 0;
}
考虑到函数 fgets
也会读取对应于按下的 Enter 键的换行符,前提是它有足够的 space 来存储它。
如果输入例如
abcd
那么输出将是
"abcd....."
如果你只想在字符串末尾加一个点那么你可以这样写
#include <stdio.h>
int main(void)
{
char dot = '.';
char string_input[10];
const size_t N = sizeof( string_input );
fgets( string_input, N, stdin );
size_t i = 0;
while ( i < N - 1 && string_input[i] != '\n' && string_input[i] != '[=13=]' ) ++i;
if ( i < N - 1 ) string_input[i++] = dot;
string_input[i] = '[=13=]';
printf( "\"%s\"\n", string_input );
return 0;
}
此处输出为
"abcd."
除了 melpomene 指出的差一错误之外,您的代码存在几个基本问题。首先,如果你想在字符串就地后附加一些字符,那么你应该提前为它腾出空间。所以而不是
fgets (string_input, sizeof(string_input), stdin);
你应该写
fgets (string_input, sizeof(string_input)-1, stdin);
然后你还需要在用点覆盖它之后用 '[=14=]'
终止你的字符串。所以与其说
string_input[i]=dot;
你应该说
string_input[i]=dot;
string_input[i+1]='[=13=]';
编码风格方面,需要注意
- 正确的缩进
- 避免一些微妙但愚蠢的事情,比如
if ( A!=B ) { continue; } else {...}
就是if (A==B) {...}
;您也可以通过交换两个语句轻松避免调用sizeof
两次。
我指出这些是因为我看到您可能正在学习这门语言。