gpt4 book ai didi

c - fgetc 返回一个奇怪的字符

转载 作者:太空宇宙 更新时间:2023-11-04 05:37:38 24 4
gpt4 key购买 nike

我正在使用 fgetc() 读取输入直到 EOF。我遇到了一个奇怪的问题。在 EOF 之前,我得到一个字符 \337。我不确定那是什么。

这是我的代码实现:

char *get_file_paths() 
{
char *return_str = NULL;
int chars_read = 0;
size_t buf_sz = 80;

return_str = (char *) malloc(buf_sz * sizeof(char));

while((*(return_str + chars_read) = fgetc(stdin)) != EOF) {
chars_read++;
if ((chars_read + 1) == buf_sz) {
buf_sz *= 2;
return_str = realloc(return_str, buf_sz);
}
}

return return_str;

}

例如,如果我有一个字符串:assignment_2/grepout.txt。在 gdb 中查看 return_str 时,我得到以下信息:

assignment_2/grepout.txt\n\337

我很好奇这是什么意思。我在网上查了一下,但没有提到它。它可以是特定于平台的吗?

我正在运行以下版本的 gcc:

gcc version 4.8.1 20130909 [gcc-4_8-branch revision 202388] (SUSE Linux)

我正在运行 openSuse。

最佳答案

重要的是不要强制将 fgetc() 返回为 charfgetc()(和 fgets())返回 int 而不是 char 正是因为 EOF 是一个超出范围的值人物。您的 0337(0xFF 或十进制的 255)在大多数实现中都是有效字符(它是代码页 1252、ISO-8859-15 和 Unicode 中的字符 ÿ)。在循环中,如果您在键盘上输入该字符,您将具有与 EOF 相同的行为。

因此,您应该将循环更改为:

char *get_file_paths(void) 
{
int chars_read = 0;
size_t buf_sz = 0;
int ch;
char *return_str = NULL;

while((ch = fgetc(stdin)) != EOF) {
if(chars_read == buf_sz) {
buf_sz += 80;
void *no_leak = realloc(return_str, buf_sz+1);
if(!no_leak) {
perror("No memory\n");
abort();
}
return_str = no_leak;
}
return_string[chars_read++] = ch;
}
if(return_string)
return_string[chars_read++] = 0;
return return_str;
}

我更改了其他几个小“问题”。

  • realloc()NULL 作为第一个参数与 malloc() 相同,因此通过重新安排(重新)分配循环避免不必要的代码。
  • sizeof (char) 定义为1,无需说明。
  • EOF 值(即 -1)不会进入循环,也不会与字符 0xFF 混淆。
  • 如果已经达到 EOF,函数返回 NULL。这是一个可能有用(或无用)的功能性选择。这取决于上下文。
  • 使用数组语法(a[x] 而不是 *(a+x)),它的可读性要高得多。

编辑:添加了分配检查。用了狠辣的手段。在那种情况下我们还能做什么?

关于c - fgetc 返回一个奇怪的字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28791422/

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