【问题标题】:Program to print all substrings of a given string打印给定字符串的所有子字符串的程序
【发布时间】:2020-03-29 20:31:25
【问题描述】:

我无法创建一个打印给定字符串的所有子字符串的算法。这是我现在的实现:

#include <stdio.h>
#include <string.h>

// Function to print all sub strings 
void subString(char str[], int n)  
{ 
    // Pick starting point 
    for (int len = 1; len <= n; len++)  
    {     
        // Pick ending point 
        for (int i = 0; i <= n - len; i++)  
        { 
            //  Print characters from current 
            // starting point to current ending 
            // point.   
            int j = i + len - 1;             
            for (int k = i; k <= j; k++) {
                char data[n];
                sprintf(data, "%d", str[k]);
                printf("%s\n", data);
            }
        } 
    } 
} 

// Driver program to test above function 
int main()  
{ 
    char str[] = "abc"; 
    subString(str, strlen(str)); 
    return 0; 
} 

我的代码没有将整数转换为字符串。有人可以帮我找出问题所在吗?

【问题讨论】:

    标签: c string substring


    【解决方案1】:

    逻辑看起来基本没问题,但是格式没有多大意义,因为它会打印每个字符的数字值并为每个打印调用添加一个换行符。如果您直接使用%c 格式打印字符,并且仅在发出完整的子字符串后才打印换行符,您将获得更合理的结果。

    #include <stdio.h>
    #include <string.h>
    
    void subString(char *str, int n)
    { 
        for (int len = 1; len <= n; len++)
        {     
            for (int i = 0; i <= n - len; i++)  
            { 
                for (int j = i; j <= i + len - 1; j++) 
                {
                    putchar(str[j]);
                }
    
                puts("");
            } 
        } 
    } 
    
    int main()  
    { 
        char str[] = "abc";
        subString(str, strlen(str)); 
        return 0; 
    } 
    

    输出:

    a
    b
    c
    ab
    bc
    abc
    

    有点挑剔:我建议调用这个函数printSubStrings,因为它会产生一个side effectsubString 这个名字似乎和合同不太吻合。

    您也可以使用"%.*s" 格式来提取您想要的子字符串块,而不是最里面的循环:

    void print_substrings(char *str, int n)
    { 
        for (int len = 1; len <= n; len++)
        {     
            for (int i = 0; i <= n - len; i++)  
            {
                printf("%.*s\n", len, str + i);
            }
        } 
    } 
    

    【讨论】:

    • 感谢您的帮助!我也要改名字:)
    • 嗯...putchar(str[j]); 不是用来打印单个字符而不调用可变参数函数并提供转换说明符吗? (你的第二种方法是正确的)
    【解决方案2】:
    #include<bits/stdc++.h>
    using namespace std;
    
    int main()
    {
        ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);    
        string str;
        cin >> str;
    
        for (int i = 0; i < str.size(); i++) {
            for (int len = 1 ; len <= str.size() - i; len++)
            {
                cout << str.substr(i, len) << endl; // prints substring from starting index i till length len
            }
        }
    
        return 0;
    }
    

    输入:

    abcd
    

    输出:

    a
    ab
    abc
    abcd
    b
    bc
    bcd
    c
    cd
    d
    

    【讨论】:

    • 添加一些解释来回答总是好的
    猜你喜欢
    • 2020-08-05
    • 2020-08-03
    • 2017-03-30
    • 2015-08-24
    • 2021-02-02
    • 2018-08-22
    • 2019-03-01
    • 1970-01-01
    • 2017-07-04
    相关资源
    最近更新 更多