为什么这个 printf 语句或缺少这个语句会改变 for 循环的效果?
Why does this printf statement, or lack there of, alter the effect of the for loop?
第一段代码:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main(void)
{
string name = GetString();
int n = strlen(name);
int j = 0;
int c = 0;
char initials[j];
char input[c];
char space[] = {' '};
for (int i = 0, c = 0; i < n; i++, c++)
{
input[c] = name[i];
printf("%c, %c\n", name[i], input[c]);
}
问题区域:
printf("%d\n", n);
for (int i = 0, c = 0; i < n; i++, c++)
{
if (input[c] != space[0])
{
initials[j] = input[c];
j++;
break;
}
printf("loop test\n");
}
j = 0;
printf("%c\n", initials[j]);
}
如果我的输入是:
hello
那么我的输出就是我想要的(循环测试==输入前的空格数):
loop test
loop test
loop test
loop test
loop test
h
除非,我删除:
printf("%d\n", n);
那么如果我的输入以 >= 4 个空格开头,我的输出是:
loop test
loop test
loop test
loop test
// blank line
// blank line
这两个注释是输出中的实际空行
*对于某些错误的 printf 语句,我深表歉意,我正在尝试找出错误。
这里有一个主要问题:
int c = 0;
...
char input[c];
input[]
是一个零长度数组。然后代码愉快地写入到它的末尾之外,这相当于在堆栈帧的其他部分随机写入。
解决方法是在写入数组之前适当调整数组大小。
还有
int j = 0;
...
char initials[j];
您可能想要更多类似的东西:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main(void)
{
string name = GetString();
int n = strlen(name);
int j = 0;
int c = 0;
char *initials = calloc(n,1);
char *input = calloc(n,1);
for (int i = 0, c = 0; i < n; i++, c++)
{
input[c] = name[i];
printf("%c, %c\n", name[i], input[c]);
}
printf("%d\n", n);
for (int c = 0; c < n; c++) // you weren't using i in the loop
{
if (input[c] != ' ')
{
initials[j] = input[c];
j++;
break;
}
printf("loop test\n");
}
j = 0;
printf("%c\n", initials[j]);
free(initials);
free(input);
}
第一段代码:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main(void)
{
string name = GetString();
int n = strlen(name);
int j = 0;
int c = 0;
char initials[j];
char input[c];
char space[] = {' '};
for (int i = 0, c = 0; i < n; i++, c++)
{
input[c] = name[i];
printf("%c, %c\n", name[i], input[c]);
}
问题区域:
printf("%d\n", n);
for (int i = 0, c = 0; i < n; i++, c++)
{
if (input[c] != space[0])
{
initials[j] = input[c];
j++;
break;
}
printf("loop test\n");
}
j = 0;
printf("%c\n", initials[j]);
}
如果我的输入是:
hello
那么我的输出就是我想要的(循环测试==输入前的空格数):
loop test
loop test
loop test
loop test
loop test
h
除非,我删除:
printf("%d\n", n);
那么如果我的输入以 >= 4 个空格开头,我的输出是:
loop test
loop test
loop test
loop test
// blank line
// blank line
这两个注释是输出中的实际空行
*对于某些错误的 printf 语句,我深表歉意,我正在尝试找出错误。
这里有一个主要问题:
int c = 0;
...
char input[c];
input[]
是一个零长度数组。然后代码愉快地写入到它的末尾之外,这相当于在堆栈帧的其他部分随机写入。
解决方法是在写入数组之前适当调整数组大小。
还有
int j = 0;
...
char initials[j];
您可能想要更多类似的东西:
#include <stdio.h>
#include <cs50.h>
#include <string.h>
int main(void)
{
string name = GetString();
int n = strlen(name);
int j = 0;
int c = 0;
char *initials = calloc(n,1);
char *input = calloc(n,1);
for (int i = 0, c = 0; i < n; i++, c++)
{
input[c] = name[i];
printf("%c, %c\n", name[i], input[c]);
}
printf("%d\n", n);
for (int c = 0; c < n; c++) // you weren't using i in the loop
{
if (input[c] != ' ')
{
initials[j] = input[c];
j++;
break;
}
printf("loop test\n");
}
j = 0;
printf("%c\n", initials[j]);
free(initials);
free(input);
}