为什么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 混淆,并将等待更多输入解释为“永无止境”的循环。

不过,您没有提供足够的资源来重建您的问题。

但让我们开始吧:

  1. scanf()%s 转换说明符用于读取字符串,而不是单个字符。如果您想每次迭代读取一个字符,请在 for 循环中使用 scanf("%c", &name[i]);name[i] = getchar(); 而不是 scanf("%s", &name[i]);

  2. 你的循环条件 i <= ln 是错误的,因为你试图用它写一个比预期多的字符,因为索引计数从 0 开始,而不是 1.请改用 i < ln

  3. 字符串末尾需要有一个终止空字符。 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,代码就可以使用了