如何使用scanf(没有字符串函数)读取字符数组?

时间:2014-03-28 13:18:14

标签: c string

我正在尝试使用scanf读取和打印字符数组。这是我的源代码。我可以知道这段代码中的错误是什么吗?

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

void main()
{
    int i;
    char str[20];
    printf( "Enter\n" );
    for ( i=0; str[i] != '\0'; i++ )
        scanf( "%s", &str[i] );
    for ( i=0; str[i] != '\0'; i++ )
        scanf( "%s\n", str[i] );
}

2 个答案:

答案 0 :(得分:3)

你有至少三个问题:第一个是str单个字符串,而不是字符串数组,例如< / p>

char str[20][20];

第二个问题是你显然试图打印&#34;字符串&#34;与scanf

第三个问题是你在初始化时正在使用数组str。局部变量初始化,并且它们的值是不确定的。这意味着str的内容似乎是随​​机的。使用未初始化的局部变量(就像在第一个循环中一样)会导致未定义的行为


修复(部分)代码的一种方法可能就像

char strings[20][20];

int i;
for (i = 0; i < 20; ++i)
{
    char *p = fgets(strings[i], sizeof(strings[i]), stdin);
    if (p == NULL)
        break;  /* Error reading, or "end of file" */

    /* The fgets function can leave the newline in the buffer, remove it */
    if (strings[i][strlen(strings[i]) - 1] == '\n')
        strings[i][strlen(strings[i]) - 1] = '\0';
}

for (int j = 0; j < i; ++j)
    printf("String #%d: '%s'\n", i + 1, strings[i]);

答案 1 :(得分:0)

#include <stdio.h>

int main(){
    int i;
    char str[20][32];
    printf("Enter\n");
    for (i=0; i < 20; ++i)
        scanf("%31s", str[i]);
    for (i=0; i < 20; ++i)
        printf("%s\n", str[i]);
    return 0;
}

#include <stdio.h>

int main(){
    int i, pos;
    char *str[20];
    char array[20*32];

    printf("Enter\n");
    for (pos=i=0; i < 20; ++i){
        int len;
        if(EOF!=scanf("%31s%n", &array[pos], &len)){
            str[i] = &array[pos];
            pos += len + 1;
        } else {
            str[i] = NULL;
            break;
        }
    }
    printf("\n");
    for (i=0; i < 20 && str[i] != NULL; ++i)
        printf("%s\n", str[i]);
    return 0;
}