C在32位系统上产生错误的结果

时间:2015-02-13 06:04:28

标签: c

以下代码应该接受用户输入并将其写入文件。

int main(int argc, char* argv[]) {
FILE* fp;
char string[512]; //maximum it should ever be
char first[19];
char last[19];
char grade[4];
char choice[7];
if(argc == 2)
    fp = fopen (strcat(argv[1],".txt"), "wb+");

while(fgets(string, 512, stdin) != NULL) {
    sscanf(string, "%s", choice);
    if(strcmp(choice, "add") == 0) {
        printf("%s\n", string); //print out what string is
        if(sscanf(string, "%s %s %s %s", choice, first, last, grade) == 4) {
                    printf("%s\n", choice);
                    printf("%s\n", first);
                    printf("%s\n", last);
                    printf("%s\n", grade);
                    addData(first, last, grade, fp, 0);
        }
    }

作为测试我输入:添加测试测试器100

添加数据应该将信息放入文件中。

void addData(char first[], char last[], char grade[], FILE* fp) {
    rewind(fp);
    spaces(first, last, grade);
    fprintf(fp, first);
    fprintf(fp, last);
    fprintf(fp, grade);
}

void spaces(char first[], char last[], char grade[]) {
size_t i;
    for(i=strlen(first);i<20;i++)
        first[i] = ' ';
    for(i=strlen(last);i<20;i++)
        last[i] =  ' ';
    for(i=strlen(grade);i<=4;i++)
        grade[i] = ' ';
    grade[strlen(grade)-1] = '\0'; }

当我添加到文件中时,我希望看到:

test                tester              100

相反,我得到:

 est                dd test tester 1000                   est                dd test tester 100100                   est                dd test tester 100

在64位系统上,我当然得到了这个:

test                tester              100

到底发生了什么,为什么要将一堆信息打印到我没有要求的文本文件中?我如何才能解决这个问题,以便在32位和64位系统上运行?

2 个答案:

答案 0 :(得分:2)

fgets(string, 512, stdin) != NULL

你所拥有的是数组越界访问,因为数组字符串只能容纳44个字符,但你可以写超过44个字符。所以行为是未定义的。

fgets(string, sizeof(string), stdin) != NULL

是你应该拥有的

答案 1 :(得分:0)

正如WhozCraig所说,我的一些数组大小都错了。当我设置尺寸时,我没有考虑空间,所以空间超过我指定的尺寸。