printf - 带有指针的“意外”输出

时间:2016-01-19 13:08:49

标签: c pointers printf

我有一个朋友的挑战 作为这个挑战的一部分,我编写了一个函数来从int获取String,该函数获取一个chars数组和一个指向数字的指针,一个索引。

要检查此功能是否有效,我使用2个数字运行它并观察输出。
在我的main我打印了4个值:

int t = 0;
printf("%d -> %d, %d -> %d\n", t, getNumber("99", &t), t, getNumber("as48", &t));

应该如此,我应该得到:0 -> 99, 2 -> 48
输出为:2 -> 99, 0 -> 0

经过几次测试后,我看到它在函数结束后打印t并且它首先执行最后一次函数调用。
我理解这是有道理的:在Assembly中,最后一个参数首先被推送到堆栈,所以当它被加速时,参数将按正确的顺序排列。

我的问题是:
我可以以“正常”的方式打印它,看起来应该“应该”吗?怎么样?

2 个答案:

答案 0 :(得分:4)

  

我可以以“正常”方式打印,因此它看起来应该“应该”吗?怎么样?

无法保证C中函数参数的评估顺序。所以,答案是 另请注意,printf函数调用调用未定义的行为作为其参数的评估顺序 unsequenced

答案 1 :(得分:0)

您可以在C ++中执行此操作。

虽然我不知道您如何实施getNumber()功能,但您可以使用stoi()库中的string功能。

int stoi (const string&  str, size_t* idx = 0, int base = 10);

它基本上将字符串转换为整数。 stoi解析str将其内容解释为指定基数的整数,并以int值的形式返回。

如果idx不是空指针(nullptr),则该函数还会将idx的值设置为数字后str中第一个字符的位置。

因此假设您的所有数字都是base 10,您可以使用类似

的内容
int i = std::stoi ("as48", nullptr, 10);
int j = std::stoi ("99", nullptr, 10);
printf ("%d %d\n", i, j);

您可以使用idx代替t来获取数字部分开始的索引 - std::string::size_type idx;并将其作为参数传递给stoi()函数而不是nullptr