2014-03-12 27 views
1

我是一个非常缺乏经验的C学习者,我一直在这个代码中得到一个警告,这是应该反转字符串作为调用时的第一个参数传递(编程中Linux Ubuntu)。在字符串逆变器程序中的警告C

的警告是:14:9:警告:分配使得整数pointr没有投

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

    int main(int argc, char *argv[]) { 

     char str[80]; 
     int p = 0; 
     int i; 

     for(i = strlen(argv[1]) - 1; i >= 0; i--){ 
      str[p] = argv [1][i]; 
      p++; 
     } 

     str[p] = "\0"; 
     printf("%s\n", str); 

    } 

的代码应该(和它有一些不想要的字符一样)打印的倒字符串当我使用命令./command stringhere时的第一个参数。

作为一个例子,当我使用./invert_string字符串时,控制台会打印gnirts和一堆问号以及其他字符。是否有一个原因?代码是否在内存中打印值不应该?

+0

打开编译器警告! 'str [p] =“\ 0”;'具有不兼容的类型:左边是一个'char',右边是'指向char'的指针(通过从char数组自动转换)。无论如何,编译器都不应该接受。 – pmg

+0

你也不需要做一个反向拷贝来做到这一点。 'fputc(argv [1] [i],stdout);'在循环中执行时不需要不必要的缓冲区,不再需要'str'和'p'。理想情况下,你使用'char *',并且还要抛弃重复的'strlen'调用。 – WhozCraig

回答

1

你所看到的是改变NUL终止语句的问题立即解决:

str[p] = '\0'; 

,你要分配一个char这需要改变(“\ 0”),而不是一个char * ( “\ 0”)。

但是,由于源字符串是nul终止的,因此可以使用整个字符串复制终止符。

此外,请注意,如果源字符串的长度超过80个字符,则会发生缓冲区溢出。