C 将 argv[] 中的字符串分配给 char 数组
C assign string from argv[] to char array
我有以下代码,它从命令行读取文件名并打开此文件:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
FILE *datei;
char filename[255];
//filename = argv[1];
//datei=fopen(filename, "r");
datei=fopen(argv[1], "r");
if(datei != NULL)
printf("File opened");
else{
printf("Fehler beim öffnen von %s\n", filename);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
此示例有效,但我想将命令行中的字符串写入 char 数组并将该 char 数组传递给 fopen(),但出现编译器错误
Error: assignment to expression with array type filename = argv[1];
此错误是什么意思,我该如何解决?
您必须将字符串复制到字符数组中,这不能通过简单的赋值来完成。
简单的答案是 strcpy(filename, argv[1]);
。
这种方法有一个很大的问题:命令行参数可能比filename
数组长,导致缓冲区溢出。
因此正确答案是:
if (argc < 2) {
printf("missing filename\n");
exit(1);
}
if (strlen(argv[1]) >= sizeof(filename)) {
printf("filename too long: %s\n", argv[1]);
exit(1);
}
strcpy(filename, argv[1]);
...
您可能希望将错误消息输出到 stderr。
作为旁注,您可能想选择英语或德语,但不要同时使用两者;-)
一个更简单的解决方案是只在 char *filename
中保留指针 argv[1]
的副本。除非你自己修改它,一个非常糟糕的主意,它的内容在程序执行期间不会改变。
这是修改后的版本:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
FILE *datei;
char *filename;
if (argc < 2) {
fprintf(stderr, "Fehlendes Dateiname-Befehlszeilenargument\n");
return EXIT_FAILURE;
}
filename = argv[1];
datei = fopen(filename, "r");
if (datei != NULL) {
printf("Datei erfolgreich geöffnet\n");
} else {
fprintf(stderr, "Fehler beim öffnen von %s: %s\n",
filename, strerror(errno));
return EXIT_FAILURE;
}
// ...
fclose(datei);
return EXIT_SUCCESS;
}
我有以下代码,它从命令行读取文件名并打开此文件:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv){
FILE *datei;
char filename[255];
//filename = argv[1];
//datei=fopen(filename, "r");
datei=fopen(argv[1], "r");
if(datei != NULL)
printf("File opened");
else{
printf("Fehler beim öffnen von %s\n", filename);
return EXIT_FAILURE;
}
return EXIT_SUCCESS;
}
此示例有效,但我想将命令行中的字符串写入 char 数组并将该 char 数组传递给 fopen(),但出现编译器错误
Error: assignment to expression with array type filename = argv[1];
此错误是什么意思,我该如何解决?
您必须将字符串复制到字符数组中,这不能通过简单的赋值来完成。
简单的答案是 strcpy(filename, argv[1]);
。
这种方法有一个很大的问题:命令行参数可能比filename
数组长,导致缓冲区溢出。
因此正确答案是:
if (argc < 2) {
printf("missing filename\n");
exit(1);
}
if (strlen(argv[1]) >= sizeof(filename)) {
printf("filename too long: %s\n", argv[1]);
exit(1);
}
strcpy(filename, argv[1]);
...
您可能希望将错误消息输出到 stderr。 作为旁注,您可能想选择英语或德语,但不要同时使用两者;-)
一个更简单的解决方案是只在 char *filename
中保留指针 argv[1]
的副本。除非你自己修改它,一个非常糟糕的主意,它的内容在程序执行期间不会改变。
这是修改后的版本:
#include <errno.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[]) {
FILE *datei;
char *filename;
if (argc < 2) {
fprintf(stderr, "Fehlendes Dateiname-Befehlszeilenargument\n");
return EXIT_FAILURE;
}
filename = argv[1];
datei = fopen(filename, "r");
if (datei != NULL) {
printf("Datei erfolgreich geöffnet\n");
} else {
fprintf(stderr, "Fehler beim öffnen von %s: %s\n",
filename, strerror(errno));
return EXIT_FAILURE;
}
// ...
fclose(datei);
return EXIT_SUCCESS;
}