根据用户输入的数字位置尝试从右侧开始循环播放字符串时出现问题。所以基本上这将是我的程序的输出:
/Users/user/Desktop/Course/Python/ipython/notebooks-master/generate_problems.py
这是我的代码:
Enter a number: 1234567
Enter the digit position: 3
digitValue1(): 5
因此,我在int main()
{
int num, digit, result;
printf("Enter the number: ");
scanf("%d", &num);
printf("Enter the digit position: ");
scanf("%d", &digit);
printf("digitValue1(): %d\n", digitValue1(num, digit));
return 0;
}
int digitValue1(int num, int k)
{
int result, i;
char str[15];
sprintf(str, "%d", num);
int len = strlen(str);
for (i = 0; i < len; i++) {
printf("%d ", i);
if (i == k) {
result = k;
}
}
return result;
}
中所做的是接受用户输入的int num并将其转换为字符串并循环播放。但是,它从左侧开始。所以这是我的输出:
digitValue1()
我在想如何从右侧开始循环。我试图扭转for循环,它没有意义。
提前致谢。
答案 0 :(得分:3)
初始化i
以从最后开始。请记住,strlen()
是自然数,因此最后一个字符的索引少1。
还有一些其他细节需要注意:
这实际上并没有反转被扫描的字符串;而是从字符串的末尾(右侧)开始扫描。
由于循环从字符串的末尾开始并向前工作,因此需要调整停止条件以查找k
最后一个字符。
我们希望返回结果数字的整数值,因此我们必须将char
转换为int
。通过减去&#39; 0&#39;的ascii值,这是最简单的方法。从结果数字。
int digitValue1(int num, int k)
{
int result, i;
char str[15];
sprintf(str, "%d", num);
int len = strlen(str);
for (i = len-1; i >= 0; i--) { // Loop backwards from end of str
printf("%d ", i);
if (len-i == k) { // Check if we are k from end
result = str[i] - '0'; // Convert digit char to int
}
}
return result;
}
这仍然是一次详尽的搜索......即使在找到k
最后一个元素之后,它仍将继续整个字符串。 (正如你原来的问题所做的那样。)你想要考虑如何优化它,所以一旦确定结果就停止查看。
而不是循环,计算您正在寻找的索引会更有效:
result = str[strlen(str)-k] - '0';
答案 1 :(得分:0)
好吧,我可能会在您的代码中注意一些事情,以避免将来出现错误:
sprintf()
代替snprintf()
。这(几乎)与使用邪恶的gets()
一样危险。strlen()
返回size_t
,不 int
(这可能导致非常严重问题)!最后,您似乎不理解for
循环。请记住这一点:在C(类似)语言中,for
循环不是完全伪表上的迭代器。在这些语言中,这个:
for(initializer; condition; helper) {
...
}
的完全等效和简写:
{
initializer;
while(condition) {
...
helper;
}
}
因此,考虑到所有这些内容,digitValue1()
可以被重写为类似的东西(注意第一个position
为零):
int digitValue1(int num, int position) {
do {
int digit = num % 10;
num /= 10;
if(position-- == 0)
return digit;
} while(num != 0);
// This shall be understood as an error
return -1;
}
希望这有帮助!干杯,KemyLand。
答案 2 :(得分:0)
你可以改变你的for循环,如下所示
for (i = len-1; i >= 0; i--)
{
// your implementation code
}
答案 3 :(得分:0)
当你从0位置开始。如果要从右侧打印,则从右侧开始。为此,我们需要将initialize值设置为len并以0结尾。
for (i = len-1; i >= 0; i--)
{
}