为什么for循环永远不会结束?
Why for loop never ends?
int ln;
printf("how many letters are your name?\n");
scanf("%d", &ln);
printf("Ok...enter your name by characters: \n");
char name[ln];
for (int i = 0; i<=ln; i++){
scanf("%s", &name[i]);
}
此代码应转换数组中的名称,但 for 循环永远不会结束。谁能帮帮我?
Why for loop never ends?
在循环内,scanf("%s", &name[i]);
尝试读取名称 ln + 1
次,最终尝试将数据保存在 name[]
范围之外。
在 name[]
范围外保存数据是 未定义的行为 (UB)。什么事都有可能发生。
循环不需要将一行输入作为名称读取并且name[]
太小了。
//char name[ln];
//for (int i = 0; i<=ln; i++){
// scanf("%s", &name[i]);
//}
char name[ln+1]; // One more for a [=10=]
if (scanf("%s", &name[i]) ==1) {
Success();
}
建议不要使用scanf()
,使用fgets()
。
char name[ln+1+1]; / One more for a \n and 1 for a [=11=]
if (fgets(name, sizeof name, stdin)) {
name[strcspn(name, "\n")] = '[=11=]'; // lop off potential \n
Success();
}
在 for 条件中,尝试删除那个相等性并查看,因为您在 name 变量中分配 ln 个字节,所以变量 i 将从 0 开始并转到 ln-1
for (int i = 0; i<ln; i++){
scanf("%c", &name[i]);
}
另请注意我在这里使用 %c 扫描字符,%s 扫描字符串。
因为您的 for 循环必须 运行 再 运行 一次才能结束。只需更改
i<=ln
至
i<ln
"Why for loop never ends?"
首先,我不认为循环是无限的。对我来说,您似乎只是将 %s
与 %c
混淆,并将等待更多输入解释为“永无止境”的循环。
不过,您没有提供足够的资源来重建您的问题。
但让我们开始吧:
scanf()
的 %s
转换说明符用于读取字符串,而不是单个字符。如果您想每次迭代读取一个字符,请在 for
循环中使用 scanf("%c", &name[i]);
或 name[i] = getchar();
而不是 scanf("%s", &name[i]);
。
你的循环条件 i <= ln
是错误的,因为你试图用它写一个比预期多的字符,因为索引计数从 0
开始,而不是 1
.请改用 i < ln
。
字符串末尾需要有一个终止空字符。 name
需要多一个元素来保存输入名称的字母。还在循环之后放置 name[ln] = '[=24=]';
以在 VLA name
.
的最后一个元素中插入一个空字符
注:
如果你想从 stdin
中读取可变数量的字符,这是在 运行 时确定的,你不需要单独读取每个字符并停止,直到计数器达到 ln - 1
.
读取字符数量可变的字符串是一分,其中fgets()
比scanf()
更合适。
使用 fgets (name, sizeof(name), stdin);
确保读取的字符串加上字符串终止空字符将完全适合 name
并捕获名称一次。
int ln;
printf("How many letters are in your name?\n");
scanf("%d", &ln);
getchar(); // catching left newline from scanf.
char name[ln + 1]; // +1 for null character.
printf("Ok...enter your name: \n");
fgets(name, sizeof(name), stdin); // Will read the name and append the null character.
getchar(); // catching left newline from fgets.
%s 正在扫描字符串,因此从技术上讲,您的全名被视为一个元素。所以要输入很多字符串。只需将 %s 替换为 %c,代码就可以使用了
int ln;
printf("how many letters are your name?\n");
scanf("%d", &ln);
printf("Ok...enter your name by characters: \n");
char name[ln];
for (int i = 0; i<=ln; i++){
scanf("%s", &name[i]);
}
此代码应转换数组中的名称,但 for 循环永远不会结束。谁能帮帮我?
Why for loop never ends?
在循环内,scanf("%s", &name[i]);
尝试读取名称 ln + 1
次,最终尝试将数据保存在 name[]
范围之外。
在 name[]
范围外保存数据是 未定义的行为 (UB)。什么事都有可能发生。
循环不需要将一行输入作为名称读取并且name[]
太小了。
//char name[ln];
//for (int i = 0; i<=ln; i++){
// scanf("%s", &name[i]);
//}
char name[ln+1]; // One more for a [=10=]
if (scanf("%s", &name[i]) ==1) {
Success();
}
建议不要使用scanf()
,使用fgets()
。
char name[ln+1+1]; / One more for a \n and 1 for a [=11=]
if (fgets(name, sizeof name, stdin)) {
name[strcspn(name, "\n")] = '[=11=]'; // lop off potential \n
Success();
}
在 for 条件中,尝试删除那个相等性并查看,因为您在 name 变量中分配 ln 个字节,所以变量 i 将从 0 开始并转到 ln-1
for (int i = 0; i<ln; i++){
scanf("%c", &name[i]);
}
另请注意我在这里使用 %c 扫描字符,%s 扫描字符串。
因为您的 for 循环必须 运行 再 运行 一次才能结束。只需更改
i<=ln
至
i<ln
"Why for loop never ends?"
首先,我不认为循环是无限的。对我来说,您似乎只是将 %s
与 %c
混淆,并将等待更多输入解释为“永无止境”的循环。
不过,您没有提供足够的资源来重建您的问题。
但让我们开始吧:
scanf()
的%s
转换说明符用于读取字符串,而不是单个字符。如果您想每次迭代读取一个字符,请在for
循环中使用scanf("%c", &name[i]);
或name[i] = getchar();
而不是scanf("%s", &name[i]);
。你的循环条件
i <= ln
是错误的,因为你试图用它写一个比预期多的字符,因为索引计数从0
开始,而不是1
.请改用i < ln
。字符串末尾需要有一个终止空字符。
的最后一个元素中插入一个空字符name
需要多一个元素来保存输入名称的字母。还在循环之后放置name[ln] = '[=24=]';
以在 VLAname
.
注:
如果你想从 stdin
中读取可变数量的字符,这是在 运行 时确定的,你不需要单独读取每个字符并停止,直到计数器达到 ln - 1
.
读取字符数量可变的字符串是一分,其中fgets()
比scanf()
更合适。
使用 fgets (name, sizeof(name), stdin);
确保读取的字符串加上字符串终止空字符将完全适合 name
并捕获名称一次。
int ln;
printf("How many letters are in your name?\n");
scanf("%d", &ln);
getchar(); // catching left newline from scanf.
char name[ln + 1]; // +1 for null character.
printf("Ok...enter your name: \n");
fgets(name, sizeof(name), stdin); // Will read the name and append the null character.
getchar(); // catching left newline from fgets.
%s 正在扫描字符串,因此从技术上讲,您的全名被视为一个元素。所以要输入很多字符串。只需将 %s 替换为 %c,代码就可以使用了