【发布时间】:2014-09-28 20:27:34
【问题描述】:
我正在尝试读取包含字符串“a3rm5t?7!z*&gzt9v”的文本文件,并将所有数字字符放入字符串中,以便稍后转换为整数。
我目前正在尝试通过在读取文件后在缓冲区上使用 sscanf 来执行此操作,然后使用 sprintf 将使用 %u 找到的所有字符保存在名为 str 的字符串中。
但是,每次运行程序时,我在 str 上调用 printf 时返回的整数都不同。我做对了什么,我做错了什么?
当文本文件包含类似“23dog”的字符串并返回 23 时,此代码有效,但当字符串为 23dog2 之类的字符串时无效。
编辑:我现在意识到我应该将数字字符放在一个字符数组中,而不仅仅是一个字符串。
int main(int argc, const char **argv)
{
int in;
char buffer[128];
char *str;
FILE *input;
in = open(argv[1], O_RDONLY);
read(in, buffer, 128);
unsigned x;
sscanf(buffer, "%u", &x);
sprintf(str,"%u\n", x);
printf("%s\n",str);
close (in);
exit(0);
}
【问题讨论】:
-
如果我没记错的话,带有 %u 的 sprintf 在第一个非数字字符后结束读取输入。您应该在转换为整数之前创建一个纯数字字符串
-
从我在上一段中得到的输出来看,我不得不同意。有没有办法在 while 循环中仍然使用 sscanf 或其他方法来抵消这种情况?
-
当你完成它并想检查结果时,你可以使用
echo 'a3rm5t?7!z*&gzt9v' | tr -dc [0-9] -
您将一个悬空指针传递给
sprintf。此外,每次传递的指针都是相同的。您的意思是(部分)覆盖以前的结果吗?最后,对于23dog2,你期待232还是别的什么? -
是的,我希望我在帖子开头提到的字符串中的 23dog2 和 3579 是 232。我的意思是分别读取输入文件中的每个字符并将每个数字附加到字符数组中。