gpt4 book ai didi

c - 获取字符并将其转换为字符串

转载 作者:太空宇宙 更新时间:2023-11-04 06:51:22 25 4
gpt4 key购买 nike

#include <stdio.h>
#include <ctype.h>
#include <stdlib.h>

static int cc =0;
static FILE* in;

static char* getkw(){
char tok[10];
int i;
cc = fgetc(in);
for(i=0; i<=(int)sizeof(tok)-1 &&isalpha(cc);++i){
tok[i]= cc;
cc = fgetc(in);
}
tok[i]=0;
return tok;
}

int main()
{
in = fopen("/dir/dir/a.txt", "r");
char *c= getkw();
printf("%s", c);
fclose(in);
return 0;
}

我期望上面的代码在达到空间之前获取字符。我还有忽略文件中的空格并继续下一个字符的函数,我没有在这里显示,因为它们(在我看来)运行良好。这里的主要问题是,它没有从文件中获取字符,也没有将它们打包到数组中。程序崩溃或没有任何显示(如果成功)。

最佳答案

返回一个指向局部变量的指针将不起作用,因为数组不再在范围内。 tok 应该是 static 而不是函数。

下面还有一个bug

for(i=0; i<=(int)sizeof(tok)-1 &&isalpha(cc);++i)

如果把条件写成更地道的,哪个会更清楚

i<(int)sizeof(tok)

这对大脑来说工作更少。现在很明显

tok[i]=0;

在循环之后,当 i == sizeof tok 时,写入超出数组边界。


编辑:更一般地关于循环控制。

-1 做事的方式还有另一个危险。假设我用你的方式在

size_t len = strlen(tok);
for(size_t i = 0; i <= len - 1; i++) { /*...*/ }

len == 0 时会发生什么?灾难,因为 size_t 是无符号的,所以 len - 1 将换行到该类型的最大值,并且会出现一个巨大的循环。

现在,如果您以惯用的方式编写循环

size_t len = strlen(tok);
for(size_t i = 0; i < len; i++) { /*...*/ }

这不可能发生。

关于c - 获取字符并将其转换为字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50659690/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com