我有这个:
#define TYPESIZE 180
char buff[TYPESIZE];
char dat_nazev[TYPESIZE];
int dat_rok;
我用它来从文本文件中读取 char和int data 。我需要将它们写入屏幕(这是可行的),之后使用ADD方法将其添加到我的结构中:
int pom = 1;
while(fgets(buff, 1000, fr) != NULL)
{
switch (pom)
{
case 1:
printf ("Nazev: %s", buff);
dat_nazev=buff;
pom++;
break;
case 2:
printf ("Rok vydani: %s", buff);
dat_rok=int(buff);
pom++;
break;
case 3:
printf ("Popis: %s", buff);
dat_popis=buff;
add(dat_nazev, dat_rok, dat_popis);
pom =1;
break;
}
}
但这不起作用。如果我尝试将 buff分配给dat_nazev (或任何东西),这个goto会失败。
错误C2106:'=':左操作数必须是l值
buff和dat_nazev是相同的日期类型......
并且 dat_rok = int(buff)不给mi相同的值 - 比如1986等等到dat_rok。
感谢您的回答。
答案 0 :(得分:1)
要复制字符串,您需要使用strcpy()
之类的函数,不能将其分配给C中的数组。
例如:
#include <string.h>
...
case 1:
printf ("Nazev: %s", buff);
strcpy(dat_nazev, buff);
请注意,您#define TYPESIZE 180
,然后使用fgets()
读取1,000个字符,这样您可能会读取的数据超过存储空间的数据,这可能会很糟糕。 strncpy()
是一种替代方案,它允许您对复制的字符数进行限制,但strncpy()
如果达到限制则不会对字符串进行空终止,有时(例如,当使用文件名时)仅使用部分数据副本然后使用它可能与溢出一样糟糕,所以无论哪种方式,您通常都需要非常严格地检查输入并仔细管理内存。
您也无法使用强制转换将字符串转换为其他类型,就像使用其他一些高级编程语言一样。您需要strtol()
:
#include <stdlib.h>
...
case 2:
printf ("Rok vydani: %s", buff);
char * endptr;
dat_rok = (int) strtol(buff, &endptr, 10);
if ( *endptr ) {
fputs("Invalid data, not an integer", stderr);
exit(EXIT_FAILURE);
}
字符串处理在C语言中比在其他一些更高级别的语言中更多。