将字符串作为输入并将它们存储在C中的字符数组中

时间:2013-07-06 15:00:37

标签: c

我很难理解如何在C中的数组中存储字符串,每个字符分开保存。例如,如果用户输入 hellop ,我想将其存储在给定的数组中,例如userTextuserText[0] = huserText[1] = euserText[2] = l,等等。我知道这很容易,但我还是新手。所以,如果有人能提供帮助,那就太好了。请解释如何使用指针执行此操作。

#include<stdio.h>
void main()
{
    char a[10],c;
    int i=0;
    while((c=getchar())!='\n')
    {
        scanf("%c",&a[i++]);
        c=getchar();
     }
     for(i=0;i<11;i++)
         printf("%c",a[i]);
}

当我输入 eoeoeoeo\363 时,程序输出一些垃圾值(hellop)。

3 个答案:

答案 0 :(得分:7)

要阅读输入,我建议使用fgets功能。这是scanf的一个不错的,安全的替代方案。

首先让我们声明一个缓冲区:

char user_input[20];

然后我们可以通过以下方式从命令行获取用户输入:

fgets(user_input, 20, stdin);

这将在standard input的字符串中存储最多20个字符,并确保它为null-terminated。我们将输入限制为先前声明的数组大小的事实确保了不存在缓冲区溢出的可能性。

然后让我们清除使用strlen输入字符串的讨厌的换行符:

user_input[strlen(user_input) -1] = '\0';

由于strlen将字符串向上的大小返回到null终止符,但没有它,我们可以确定该位置是换行符(\n)。我们用空终止符(\0)替换它,以便字符串结束。

最后,让我们使用printf打印它:

printf("The user has entered '%s'\n", user_input);

要使用fgetsprintf,您需要声明以下标题:

#include <stdio.h>

对于strlen,我们需要另一个标题,即:

#include <string.h>

完成工作。

P.S。如果我可以解决您添加到问题中的代码。

  1. main通常声明为int main而非void main,这也要求main返回某种值。对于小型应用程序,通常return 0;放在结束括号之前。此返回用于向操作系统指示程序是否成功执行(0表示一切正常,非零表示存在问题)。

  2. 你不是在终止你的字符串,这意味着如果你以任何其他方式阅读而不是仔细循环,你就会遇到问题。

  3. 您接受用户两次的输入 - 一次使用getchar,然后使用scanf

  4. 如果你坚持使用你的代码我已经修改了一下:

    #include<stdio.h>
    int main()
    {
        char a[10];
        int i=0;
        while( (a[i++]=getchar()) != '\n' && i < 10) /* take input from user until it's a newline or equal to 10 */
            ;
         a[i] = '\0'; /* null-terminate the string */
         i = 0;  
         while(a[i] != '\0') /* print until we've hit \0 */
             printf("%c",a[i++]);
    
         return 0;
    }
    

    现在应该可以了。

答案 1 :(得分:2)

将字符串读入char数组:

char *a = NULL;
int read;
size_t len;
read = getline(&a, &len, stdin);
//free memory
free(a);

答案 2 :(得分:2)

你的代码是这样的(除了我添加了一堆空格以提高其可读性):

 1  #include <stdio.h>
 2  void main()
 3  {
 4      char a[10], c;
 5      int i = 0;
 6      while ((c = getchar()) != '\n')
 7      {
 8          scanf("%c", &a[i++]);
 9          c = getchar();
10      }
11      for (i = 0; i < 11; i++)
12          printf("%c", a[i]);
13   }

逐行分析:

  1. 好的(现在我添加了#include<stdio.h>之间的空格。)
  2. main()函数返回int
  3. 好的(很难打开支架错误)。
  4. 由于getchar()的返回值为int,因此您需要将c单独声明为int
  5. 行。
  6. 需要考虑EOF;应该是while ((c = getchar()) != EOF && c != '\n')。不过,你仍然对缓冲区溢出非常开放。
  7. 行。
  8. 不行。这将从标准输入中读取另一个字符,而不检查EOF。
  9. 不行。这也从标准输入中读取另一个字符。但是当你回到循环的顶部时,你会读到另一个角色。所以,就目前而言,如果您在该计划中输入abcdefg,则会在循环控件中为c分配'a',然后为a[0]分配'b',然后c被分配'c',然后循环重复,a[1]获得'e'。如果我输入6个字符加上换行符,循环将完全终止。因为我声称输入了7个字符,所以第三次迭代会将'g'分配给c,这不是换行符,因此a[2]获取换行符,程序会等待{{1}的更多输入1}}语句在循环结束时。
  10. 好的(同上关闭大括号)。
  11. 不行。您没有考虑提前终止循环,并且无条件地访问数组c = getchar();的不存在的元素a[10](其中只有元素0..9 - C不是BASIC! )。
  12. 行。
  13. 您可能需要在a循环后输出换行符。您应for结束时return 0;
  14. 因为您的输入缓冲区太短,所以最好对长度检查进行编码。如果您使用main(),我可能不会为此烦恼(尽管如此,缓冲区溢出的风险很小,可能会产生不良后果)。所有这一切导致:

    char a[4096];

    请注意,原始代码和修订代码null都不会终止字符串。对于给定的用法,这没关系。对于一般用途,它不是。

    修订后的代码中的最后#include <stdio.h> int main(void) { char a[10]; int c; int i; int n; for (i = 0; i < sizeof(a) && ((c=getchar()) != EOF && c != '\n') a[i++] = c; n = i; for (i = 0; i < n; i++) printf("%c", a[i]); putchar('\n'); return 0; } 循环和以下for可以(安全地)替换为:

    putchar()

    这是安全的,因为指定了长度,因此printf("%.*s\n", n, a); 不会超出初始化数据。要创建以空字符结尾的字符串,输入代码需要为其留出足够的空间:

    printf()

    (注意 for (i = 0; i < sizeof(a)-1 && ((c=getchar()) != EOF && c != '\n') a[i++] = c; a[i] = '\0'; !)