Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将scanf值存储到2d字符串数组中_C_Scanf - Fatal编程技术网

将scanf值存储到2d字符串数组中

将scanf值存储到2d字符串数组中,c,scanf,C,Scanf,使用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() { c

使用
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时,您不应该传递指针的地址,而应该传递指针本身。这是一个容易犯的错误,因为在使用整数类型的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
说明符将内存分配给指针。使用一对指针,应该在循环的eadh迭代中释放它们。您可以使用指针数组来存储每个输入。
扫描集不需要单引号
[^':']
。如果要扫描所有非冒号的字符,则
[^::][/code>将起作用。
EOF将终止while循环,因此如果您正在读取文件,它将在文件末尾停止。可以使用Ctrl+D(Linux)或Ctrl+Z(Windows)终止对stdin的读取

#包括
#包括
#包括
int main(){
char*str;
char*i;
int n;
而((n=scanf(“%m[^:::%m[^:::”,&str,&i))==2){
printf(“#输入读取:%d\n”,n);
printf(“%s\n”,str);
printf(“%s\n”,i);
自由基(str);
免费(i);
}
返回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;
}
#包括
#包括
#包括
int main(){
char*str[10];//指针数组
char*i[10];
int各=0;
int循环=0;
int n=0;
而((n=scanf(“%m[^::::%m[^:::”,&str[each],&i[each]))==2){
printf(“#输入读取:%d\n”,n);
printf(“%s\n”,str[each]);
printf(“%s\n”,i[每个]);
每个++;
如果(每个>9){
break;//数组大小的输入太多
}
}
for(循环=0;循环
scanf
返回扫描的项目数。在这种情况下,它将是2而不是1。此处返回1表示扫描过程中出现问题。
%m
说明符将内存分配给指针。使用一对指针,应该在循环的eadh迭代中释放它们。您可以使用指针数组来存储每个输入。
扫描集不需要单引号
[^':']
。如果要扫描所有非冒号的字符,则
[^::][/code>将起作用。
EOF将终止while循环,因此如果您正在读取文件,它将在文件末尾停止。可以使用Ctrl+D(Linux)或Ctrl+Z(Windows)终止对stdin的读取

#包括
#包括
#包括
int main(){
char*str;
char*i;
int n;
而((n=scanf(“%m[^:::%m[^:::”,&str,&i))==2){
printf(“#输入读取:%d\n”,n);
printf(“%s\n”,str);
printf(“%s\n”,i);
自由基(str);
免费(i);
}
返回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;
}
#包括
#包括
#包括
int main(){
char*str[10];//指针数组
char*i[10];
int各=0;
int循环=0;
int n=0;
而((n=scanf(“%m[^::::%m[^:::”,&str[each],&i[each]))==2){
printf(“#输入读取:%d\n”,n);
printf(“%s\n”,str[each]);
printf(“%s\n”,i[每个]);
每个++;
如果(每个>9){
break;//数组大小的输入太多
}
}
for(循环=0;循环
顺便说一句,我已经走上了一条简单的道路,可以任意地将字符串每个设置为255字节。你真的应该使用一个函数来限制输入,以防止在有人向你发送意外输入时发生溢出。顺便说一句,我已经采取了一种简单的方法,任意地将每个字符串设置为255字节。你真的应该使用一个函数来限制输入,以防止在有人向你发送意外输入时发生溢出。哇。这太糟糕了。难怪C11标准中没有这一点。谢谢你的推荐。哇。这太糟糕了。难怪C11标准中没有这一点。谢谢你的推荐。