string - 为什么我的C程序打印这样?我不明白字符串是如何工作的吗?

标签 string c

这是代码片段:

FILE *fp;
fp = fopen(argv[2], "r"); // the input file
while (!(feof(fp))) {
    char c;
    int i = 0;
    char string[101]; // max string length is 100. last spot reserved for '\0'
    string[100] = '\0';
    while ((c = fgetc(fp)) != ' ' && i < 100) {
        string[i] = c;
        i++;
    }
    printf("%s\n",string);
}
fclose(fp);

这只是我遇到的一个更大问题的一个例子,但我觉得如果我理解为什么会发生这种情况。

“argv[2]”文件的内容如下:

this is an input file

我得到的总体输出是:

this
isis
anis
input
file
�����������������������������������������������������������������������������������������������

...与我正在寻找的相反:

this
is
an
input
file

我很困惑为什么该字符串似乎不是一个新字符串(即,为什么该字符串第二次是“is”,后跟最后一个字符串的剩余两个字符,这也恰好是“is”将“isis”组合在一起)。为什么最后两个没有发生同样的事情?为什么“file”不打印为“filet”?非常困惑。

总的来说,我只是想得到我想要的输出。关于我为什么不这样做的任何建议?为什么字符串被覆盖而不是程序为每次迭代创建一个新字符串?

最佳答案

您需要在字符串末尾添加一个空终止符。退出 while 循环后,设置 string[i] = '\0'。做一些研究来了解 C 中的字符串和空终止符 ('\0');这是你需要学习的东西。

关于string - 为什么我的C程序打印这样?我不明白字符串是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46349876/

相关文章:

c++ - 如何从 C++ 类中的构造函数为 Arduino 分配字符串字段?

c++ - 在 C(也许是 C++)中寻找数值/多媒体/信号处理基准

c - 微型 C 编译器 (TCC) 和 winsock?

c++ - Matlab Mex 库生命周期

c++ - C++ 中的字符串到长数组

c - 如何在C中按升序对字符串数组进行排序

c++ - 从一行中解析整数

Java String.contains() 处理自然数

c - 如何使用 bios 中断打印字符串

c - 查询将用于连接到某个目标的接口(interface)的 IP