繁体   English   中英

将scanf值存储到二维字符串数组中

[英]Storing scanf values into a 2d string array

我在使用scanf将字符串存储到2d数组时遇到麻烦。

为了说明这一点,这是程序接受的输入:

p2/src/stuff:5:
p3/src/stuff:5:
p4/src/stuff:6:

因此,我希望能够用冒号将字符串和数字分开并分别存储。 因此,理想情况下,我的2d数组对于字符串如下所示:

[["p2/src/stuff"], ["p3/src/stuff"], ["p4/src/stuff"]]

数字可以存储在一维数组中。

这是我到目前为止的内容:

    int main() {
        char *str;
        char *i;

        int n = 1;
        while (n == 1) {
                n = scanf("%m[^':']:%m[^':']:", &str, &i);
        }
        printf("# inputs read: %d\n", n);
        printf("%s\n", str);
        printf("%s\n", i);
    }

这里只打印第一行:

p2/src/stuff
5

我应该有一个使用剂量指针算法的迭代器吗? 我对指针算法不熟悉。

您在这里有几个问题。

首先,当您应该使用字符指针时,您永远不要为它们分配任何内存。 接下来,当您使用scanf时,您不应传递指针的地址,而应传递指针本身。 这是一个容易犯的错误,因为在将scanf与整数类型一起使用时必须传递地址。

 int main() {
    char str[255];
    char i[255];

    int n = 1;
    while (n == 1) {
            n = scanf("%m[^':']:%m[^':']:", str, i);
    }
    printf("# inputs read: %d\n", n);
    printf("%s\n", str);
    printf("%s\n", i);
}

scanf返回扫描的项目数。 在这种情况下,它将是2而不是1。这里返回1表示扫描期间出现问题。
%m说明符将内存分配给指针。 使用一对指针,应该在循环的每次迭代中释放它们。 您可以使用一个指针数组来存储每个输入。
scanset不需要单引号[^':'] 如果要扫描不是冒号的所有字符[^:]将起作用。
EOF将终止while循环,因此,如果您正在从文件读取,它将停止在文件末尾。 可以使用Ctrl + D(Linux)或Ctrl + Z(Windows)终止从stdin的读取。

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

int main() {
    char *str;
    char *i;
    int n;
    while ( ( n = scanf("%m[^:]:%m[^:]:", &str, &i)) == 2) {
        printf("# inputs read: %d\n", n);
        printf("%s\n", str);
        printf("%s\n", i);
        free ( str);
        free ( i);
    }
    return 0;
}

编辑:
这使用一个指针数组来收集str和i数组的多个输入。

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

int main() {
    char *str[10];// array of pointers
    char *i[10];

    int each = 0;
    int loop = 0;
    int n = 0;
    while ( ( n = scanf("%m[^:]:%m[^:]:", &str[each], &i[each])) == 2) {
        printf("# inputs read: %d\n", n);
        printf("%s\n", str[each]);
        printf("%s\n", i[each]);
        each++;
        if ( each > 9) {
            break;//too many inputs for array size
        }
    }
    for ( loop = 0; loop < each; loop++) {
        printf ( "str[%d]=%s\n", loop, str[loop]);//print all the str inputs
    }
    for ( loop = 0; loop < each; loop++) {
        printf ( "i[%d]=%s\n", loop, i[loop]);//print all the i inputs
    }
    for ( loop = 0; loop < each; loop++) {//free memory
        free ( str[loop]);
        free ( i[loop]);
    }
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM