将 scanf 值存储到二维字符串数组中
Storing scanf values into a 2d string array
我在使用 scanf
.
将字符串存储到二维数组时遇到问题
为了说明,这是程序接受的输入:
p2/src/stuff:5:
p3/src/stuff:5:
p4/src/stuff:6:
所以我希望能够将字符串和数字用冒号分割开来分别存储。所以理想情况下,我的二维数组对于字符串看起来像这样:
[["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
returns 扫描的项目数。在这种情况下,它将是 2 而不是 1。此处 return 为 1 表示扫描期间出现问题。
%m
说明符为指针分配内存。使用一对指针,它们应该在循环的 eadh 迭代中被释放。您可以使用指针数组来存储每个输入。
扫描集不需要单引号 [^':']
。如果您正在扫描所有非冒号的字符,[^:]
将起作用。
EOF 将终止 while 循环,因此如果您正在读取文件,它将在文件末尾停止。可以使用 Ctrl+D (Linux) 或 Ctrl+Z (Windows) 终止从标准输入读取数据。
#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;
}
我在使用 scanf
.
为了说明,这是程序接受的输入:
p2/src/stuff:5:
p3/src/stuff:5:
p4/src/stuff:6:
所以我希望能够将字符串和数字用冒号分割开来分别存储。所以理想情况下,我的二维数组对于字符串看起来像这样:
[["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
returns 扫描的项目数。在这种情况下,它将是 2 而不是 1。此处 return 为 1 表示扫描期间出现问题。
%m
说明符为指针分配内存。使用一对指针,它们应该在循环的 eadh 迭代中被释放。您可以使用指针数组来存储每个输入。
扫描集不需要单引号 [^':']
。如果您正在扫描所有非冒号的字符,[^:]
将起作用。
EOF 将终止 while 循环,因此如果您正在读取文件,它将在文件末尾停止。可以使用 Ctrl+D (Linux) 或 Ctrl+Z (Windows) 终止从标准输入读取数据。
#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;
}