1

我是 C 新手,正在尝试在程序运行之前定义输出文件名。我收到总线错误这是我的代码:

#include <stdio.h>

int main (int argc, const char * argv[]) {
    char fname[128];
    printf("Enter the file name\n");
    scanf("%123s",fname);
    strcat("/Users/user/Desktop/learn/", fname);
    strcat(fname, ".txt");

    FILE *fp;
    fp=fopen(fname,"a");
    fprintf(fp, "Testing... OK I think it worked\n");
    return 0;
}
4

5 回答 5

3
  1. 你没有#include <string.h>strcat
  2. 的第一个参数strcat必须是指针,而不是字符串文字。
  3. strcat本身不安全,请strncat改用。
  4. 不要忘记检查scanfand的结果fopen
  5. 完成后关闭fp
  6. 的签名main应该是int main(int argc, char * argv[])

scanf通常也不鼓励使用 of ,使用fscanf&sscanf代替。

于 2013-04-18T21:39:11.110 回答
1

您在第一次调用 strcat 时使用字符串文字作为目标指针。因此,您将“/Users/user/Desktop/learn/”与 fname 连接起来,并将结果存储在曾经存储过“/Users/user/Desktop/learn/”的位置,这甚至可能是不可写的。

于 2013-04-18T21:34:28.620 回答
0

试试这个,这对我有用..

http://cboard.cprogramming.com/c-programming/124576-whats-mean-char*-const*-argv.html

#include <stdio.h>
#include <string.h>
int main (int argc, const char*const* argv[]) 
{

char fname[128];
char path[] = "/home/abc/test/";
printf("Enter the file name\n");
scanf("%123s",fname);
strcat(fname,".txt");
strcat(path,fname);
FILE *fp;
fp=fopen(path,"a");    
fprintf(fp, "Testing... OK I think it worked\n");
fclose(fp);    
return 0;
}
于 2013-04-18T22:13:27.073 回答
0

这不是如何strcat()工作的。

我看到两种方法:

  • 正确使用fname,连同文件名输入:

    char fname[128];
    strcpy(fname, "/Users/user/Desktop/learn/"); // ok as long as you don't make the 128 too small
    char * input = fname + strlen(fname); // now points after the final /
    printf("Enter the file name\n");
    scanf("%123s",  input); // the 123 is probably not correct
    strncat(fname, ".txt", sizeof fname);
    

    并使用它。

    目前,这种方法仍然存在输入限制为 123 字节的问题,这可能太大了,所以最好暂时忘记它。这只是为了得到这个想法。

    也许fgets()可能会更好:

    fgets(input, sizeof(fname)-strlen(fname), stdin);
    
  • 使用命令行参数,这将是我最喜欢的方法:

    // first check if argc is >= 2, i. e. if the caller has supplied an argument
    char fname[128];
    strcpy(fname, "/Users/user/Desktop/learn/");
    strncat(fname, argv[1], sizeof fname);
    strncat(fname, ".txt", sizeof fname);
    
于 2013-04-18T21:40:45.767 回答
-1

感谢大家的评论。这是工作代码:

#include <stdio.h>
#include <string.h>
int main (int argc, const char*const* argv[]) 
{
char fname[128];
strcpy(fname, "/Users/user/Desktop/learn/"); 
char * input = fname + strlen(fname); 
printf("Enter the file name\n");
scanf("%s",  input); 
strncat(fname, ".txt", sizeof fname);
printf("The output pathway and file will be called %s\n", fname);
FILE *fp;
fp=fopen(fname,"a");    
fprintf(fp, "Testing... OK I think it worked\n");
fclose(fp);    
return 0;
}
于 2013-04-19T19:49:24.590 回答