C编程从右侧开始循环

时间:2015-08-22 01:34:42

标签: c for-loop

根据用户输入的数字位置尝试从右侧开始循环播放字符串时出现问题。所以基本上这将是我的程序的输出:

/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循环,它没有意义。

提前致谢。

4 个答案:

答案 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--) 
{ 

}