我的输入文件只是
苹果 香蕉 梨 所有在不同的行上
我需要使用循环逐行将每个字符串分配给变量,然后将该字符串传递给其他函数。我这样做是通过使用fscanf(必需)。目前我的主要是()
char *name;
for (i=0; i<=fileLength; i++) {
input(fp1, name)
printf("%s", &name);
// later would pass name elsewhere
}
和
void input(FILE *fp1, char name) {
fscanf(fp1, "%s", &name);
printf("%s", &name);
}
如果我从输入函数运行printf语句,我会完整地获得整个字符串。如果我从main运行它,我就得到“A”。虽然输入函数中的printf语句正确打印出来,但在执行香蕉行时它不会更改为“B”。给出了什么以及如何在main()中打印出名称var,以后能够传递该变量?
答案 0 :(得分:0)
您的代码有未定义的行为。
您不能在单个char
中存储超过0个字符的字符串(因为终结符需要一个字符,在这种情况下,您可以在其前面包含0个字符的实际字符串)。
您必须使用字符数组来腾出空间:
void input(char *name, FILE *fp1)
{
if(fscanf(fp1, "%s", name) == 1)
printf("%s\n", name);
}
然后像这样调用它,例如:
char namebuffer[128];
input(namebuffer, fp1);
请注意,我已对此进行了编辑以使用fscanf()
,因为这是一项要求,但这是一个非常糟糕的解决方案。它不会读取包含空格的字符串,因此典型的“firstname lastname”全名将无法正确读取。有办法解决这个问题,但我不知道在这里划线。
此处也很容易发生缓冲区溢出,因为没有保护。这可以在保留fscanf()
的同时添加,但这有点烦人。
答案 1 :(得分:0)
您正在使用初始化指针char *name
,这会导致未定义的行为。您需要确保name
有足够的空间容纳您正在从文件中读取的字符串。您只需创建一个VLA,例如char name[n]
,最多可容纳n
个字符。另一种选择是动态分配name
,但这会产生不必要的开销。
您还需要检查fscanf()
的返回,因为它会返回扫描的项目数。在您的情况下,您希望一次读取一个单词,直到EOF。最好还使用fgets(3)
来读取输入,而不是fscanf()
。
这是一个小例子:
#include <stdio.h>
#include <stdlib.h>
#define WORDSIZE 100
/* function which reads one word */
int input(FILE *stream, char word[]) {
if (fscanf(stream, " %99s", word) != 1) {
return 0;
}
return 1;
}
int main(void) {
FILE *fptr;
/* array which holds words */
char word[WORDSIZE];
fptr = fopen("somewords.txt", "r");
if (fptr == NULL) {
fprintf(stderr, "Cannot open file\n");
exit(EXIT_FAILURE);
}
/* Keeps running loop until input() returns 0 */
while (input(fptr, word)) {
printf("%s\n", word);
}
return 0;
}