C中的字符串数组指针只传递一个char

时间:2017-02-22 08:52:23

标签: c string pointers

我的输入文件只是

苹果 香蕉 梨 所有在不同的行上

我需要使用循环逐行将每个字符串分配给变量,然后将该字符串传递给其他函数。我这样做是通过使用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,以后能够传递该变量?

2 个答案:

答案 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;
}